diff --git a/README.md b/README.md index f56e441..c59df7e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,184 @@ -# PointCloud-C -Benchmarking and Analyzing Point Cloud Robustness under Corruptions +
+

+ + +

+ Benchmarking and Analyzing Point Cloud Robustness under Corruptions +
+ Jiawei Ren,  + Lingdong Kong,  + Liang Pan,  + Ziwei Liu +
+ S-Lab, Nanyang Technological University +

+

+ +

+ + + + + + + + + + + +

+ +## About + +PointCloud-C is the very first test-suite for point cloud robustness analysis under corruptions. It includes two sets: [ModelNet-C](https://arxiv.org/abs/2202.03377) (ICML'22) for point cloud classification and [ShapeNet-C]() (arXiv'22) for part segmentation. + +
+

+ +
+ Fig. Examples of point cloud corruptions in PointCloud-C. +

+
+ +Visit our project page to explore more details. 🌱 + + +## Updates + +- \[2022.06\] - PointCloud-C is now live on [Paper-with-Code](https://paperswithcode.com/dataset/pointcloud-c). Join the benchmark today! +- \[2022.06\] - The 1st PointCloud-C challenge will be hosted in conjecture with the ECCV'22 [SenseHuman](https://sense-human.github.io/) workshop. πŸš€ +- \[2022.06\] - We are organizing the 1st PointCloud-C challenge! Click [here](https://pointcloud-c.github.io/competition.html) to explore the competition details. +- \[2022.05\] - ModelNet-C is accepted to ICML 2022. Click here to check it out! πŸŽ‰ + + +## Overview + +- [Data Preparation](docs/DATA_PREPARE.md) +- [Getting Started](docs/GET_STARTED.md) +- [Benchmark Results](#benchmark-results) +- [Evaluation](#evaluation) +- [Customize Evaluation](#customize-evaluation) +- [Build PointCloud-C](#build-pointcloud-c) +- [TODO List](#todo-list) +- [License](#license) +- [Acknowledgement](#acknowledgement) +- [Citation](#citation) + + +## Data Preparation +Please refer to [DATA_PREPARE.md](docs/DATA_PREPARE.md) for the details to prepare the ModelNet-C and ShapeNet-C datasets. + + +## Getting Started +Please refer to [GET_STARTED.md](docs/GET_STARTED.md) to learn more usage about this codebase. + + +## Benchmark Results + +#### ModelNet-C (Classification) + +| Method | Reference | Standalone | mCE | Clean OA | +| --------------- | ---------------------------------------------------------- | :--------: | :---: | :------: | +| DGCNN | [Wang et al.](https://arxiv.org/abs/1801.07829) | Yes | 1.000 | 0.926 | +| PointNet | [Qi et al.](https://arxiv.org/abs/1612.00593) | Yes | 1.422 | 0.907 | +| PointNet++ | [Qi et al.](https://arxiv.org/abs/1706.02413) | Yes | 1.072 | 0.930 | +| RSCNN | [Liu et al.](https://arxiv.org/abs/1904.07601) | Yes | 1.130 | 0.923 | +| SimpleView | [Goyal et al.](https://arxiv.org/abs/2106.05304) | Yes | 1.047 | 0.939 | +| GDANet | [Xu et al.](https://arxiv.org/abs/2012.10921) | Yes | 0.892 | 0.934 | +| CurveNet | [Xiang et al.](https://arxiv.org/abs/2105.01288) | Yes | 0.927 | 0.938 | +| PAConv | [Xu et al.](https://arxiv.org/abs/2103.14635) | Yes | 1.104 | 0.936 | +| PCT | [Guo et al.](https://arxiv.org/abs/2012.09688) | Yes | 0.925 | 0.930 | +| RPC | [Ren et al.](https://arxiv.org/abs/2202.03377) | Yes | 0.863 | 0.930 | +| DGCNN+PointWOLF | [Kim et al.](https://arxiv.org/abs/2110.05379) | No | 0.814 | 0.926 | +| DGCNN+RSMix | [Lee et al.](https://arxiv.org/abs/2102.01929) | No | 0.745 | 0.930 | +| DGCNN+WOLFMix | [Ren et al.](https://arxiv.org/abs/2202.03377) | No | 0.590 | 0.932 | +| GDANet+WOLFMix | [Ren et al.](https://arxiv.org/abs/2202.03377) | No | 0.571 | 0.934 | + +#### ShapeNet-C (Part Segmentation) + +| Method | Reference | Standalone | mCE | mRCE | mIoU | +| ----------------- | ---------------------------------------------------------- | :--------: | :---: | :------: | :---: | +| DGCNN | [Wang et al.](https://arxiv.org/abs/1801.07829) | Yes | 1.000 | 1.000 | 0.852 | +| PointNet | [Qi et al.](https://arxiv.org/abs/1612.00593) | Yes | 1.178 | 1.056 | 0.833 | +| PointNet++ | [Qi et al.](https://arxiv.org/abs/1706.02413) | Yes | 1.112 | 1.850 | 0.857 | +| OcCo-DGCNN | [Wang et al.](https://arxiv.org/abs/2010.01089) | No | 0.977 | 0.804 | 0.851 | +| OcCo-PointNet | [Wang et al.](https://arxiv.org/abs/2010.01089) | No | 1.130 | 0.937 | 0.832 | +| OcCo-PCN | [Wang et al.](https://arxiv.org/abs/2010.01089) | No | 1.173 | 0.882 | 0.815 | +| GDANet | [Xu et al.](https://arxiv.org/abs/2012.10921) | Yes | 0.923 | 0.785 | 0.857 | +| PAConv | [Xu et al.](https://arxiv.org/abs/2103.14635) | Yes | 0.927 | 0.848 | 0.859 | +| PointTransformers | [Zhao et al.](https://arxiv.org/abs/2012.09164) | Yes | 1.049 | 0.933 | 0.840 | +| PointMLP | [Ma et al.](https://arxiv.org/abs/2202.07123) | Yes | 0.977 | 0.810 | 0.853 | +| PointBERT | [Yu et al.](https://arxiv.org/abs/2111.14819) | Yes | 1.033 | 0.895 | 0.855 | +| PointMAE | [Pang et al.](https://arxiv.org/abs/2203.06604) | Yes | 0.927 | 0.703 | 0.860 | + +*Note: Standalone indicates whether or not the method is a standalone architecture or a combination with augmentation or pretrain. + + +## Evaluation +Evaluation commands are provided in [EVALUATE.md](docs/EVALUATE.md). + + +## Customize Evaluation +We have provided evaluation utilities to help you evaluate on ModelNet-C using your own codebase. +Please follow [CUSTOMIZE.md](docs/CUSTOMIZE.md). + + +## Build PointCloud-C +You can manage to generate your own "PointCloud-C"! Follow the instructions in [GENERATE.md](docs/GENERATE.md). + + +## TODO List +- [x] Initial release. πŸš€ +- [x] Add license. See [here](#license) for more details. +- [x] Release test sets. Download ModelNet-C and ShapeNet-C from our project page. +- [x] Add evaluation scripts for classification models. +- [ ] Add evaluation scripts for part segmentation models. +- [ ] Clean and retouch codebase. + + +## License +Creative Commons License +
+This work is under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. + + +## Acknowledgement + +We acknowledge the use of the following public resources during the course of this work: +1[SimpleView](https://github.com/princeton-vl/SimpleView), +2[PCT](https://github.com/Strawberry-Eat-Mango/PCT_Pytorch), +3[GDANet](https://github.com/mutianxu/GDANet), +4[CurveNet](https://github.com/tiangexiang/CurveNet), +5[PAConv](https://github.com/CVMI-Lab/PAConv), +6[RSMix](https://github.com/dogyoonlee/RSMix), +7[PointWOLF](https://github.com/mlvlab/PointWOLF), +8[PointTransformers](https://github.com/qq456cvb/Point-Transformers), +9[OcCo](https://github.com/hansen7/OcCo), +10[PointMLP](https://github.com/ma-xu/pointMLP-pytorch), +11[PointBERT](https://github.com/lulutang0608/Point-BERT), +and 12[PointMAE](https://github.com/Pang-Yatian/Point-MAE). + + + +## Citation + +If you find this work helpful, please kindly consider citing our papers: + +```bibtex +@ARTICLE{ren2022pointcloud-c, + title={Benchmarking and Analyzing Point Cloud Robustness under Corruptions}, + author={Jiawei Ren and Lingdong Kong and Liang Pan and Ziwei Liu}, + journal={arXiv:220x.xxxxx}, + year={2022} +} +``` + +```bibtex +@ARTICLE{ren2022modelnet-c, + title={Benchmarking and Analyzing Point Cloud Classification under Corruptions}, + author={Jiawei Ren and Liang Pan and Ziwei Liu}, + journal={International Conference on Machine Learning (ICML)}, + year={2022} +} +``` + diff --git a/build/corrupt.py b/build/corrupt.py new file mode 100644 index 0000000..20ca985 --- /dev/null +++ b/build/corrupt.py @@ -0,0 +1,90 @@ +import os +import glob +import h5py +import numpy as np +from corrupt_utils import corrupt_scale, corrupt_jitter, corrupt_rotate, corrupt_dropout_global, corrupt_dropout_local, \ + corrupt_add_global, corrupt_add_local + +NUM_POINTS = 1024 +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DATA_DIR = os.path.join(BASE_DIR, '../data') + +np.random.seed(0) + +corruptions = { + 'clean': None, + 'scale': corrupt_scale, + 'jitter': corrupt_jitter, + 'rotate': corrupt_rotate, + 'dropout_global': corrupt_dropout_global, + 'dropout_local': corrupt_dropout_local, + 'add_global': corrupt_add_global, + 'add_local': corrupt_add_local, +} + + +def download(): + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s --no-check-certificate; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def load_data(partition): + download() + all_data = [] + all_label = [] + for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048', 'ply_data_%s*.h5' % partition)): + f = h5py.File(h5_name, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_data = all_data[:, :NUM_POINTS, :] + return all_data, all_label + + +def save_data(all_data, all_label, corruption_type, level): + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet_c')): + os.makedirs(os.path.join(DATA_DIR, 'modelnet_c')) + if corruption_type == 'clean': + h5_name = os.path.join(DATA_DIR, 'modelnet_c', '{}.h5'.format(corruption_type)) + else: + h5_name = os.path.join(DATA_DIR, 'modelnet_c', '{}_{}.h5'.format(corruption_type, level)) + f = h5py.File(h5_name, 'w') + f.create_dataset('data', data=all_data) + f.create_dataset('label', data=all_label) + f.close() + print("{} finished".format(h5_name)) + + +def corrupt_data(all_data, type, level): + if type == 'clean': + return all_data + corrupted_data = [] + for pcd in all_data: + corrupted_pcd = corruptions[type](pcd, level) + corrupted_data.append(corrupted_pcd) + corrupted_data = np.stack(corrupted_data, axis=0) + return corrupted_data + + +def main(): + all_data, all_label = load_data('test') + for corruption_type in corruptions: + for level in range(5): + corrupted_data = corrupt_data(all_data, corruption_type, level) + save_data(corrupted_data, all_label, corruption_type, level) + if corruption_type == 'clean': + break + + +if __name__ == '__main__': + main() diff --git a/build/corrupt_utils.py b/build/corrupt_utils.py new file mode 100644 index 0000000..2d52c5f --- /dev/null +++ b/build/corrupt_utils.py @@ -0,0 +1,180 @@ +import numpy as np +import math + + +def _pc_normalize(pc): + """ + Normalize the point cloud to a unit sphere + :param pc: input point cloud + :return: normalized point cloud + """ + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def _shuffle_pointcloud(pcd): + """ + Shuffle the points + :param pcd: input point cloud + :return: shuffled point clouds + """ + idx = np.random.rand(pcd.shape[0], 1).argsort(axis=0) + return np.take_along_axis(pcd, idx, axis=0) + + +def _gen_random_cluster_sizes(num_clusters, total_cluster_size): + """ + Generate random cluster sizes + :param num_clusters: number of clusters + :param total_cluster_size: total size of all clusters + :return: a list of each cluster size + """ + rand_list = np.random.randint(num_clusters, size=total_cluster_size) + cluster_size_list = [sum(rand_list == i) for i in range(num_clusters)] + return cluster_size_list + + +def _sample_points_inside_unit_sphere(number_of_particles): + """ + Uniformly sample points in a unit sphere + :param number_of_particles: number of points to sample + :return: sampled points + """ + radius = np.random.uniform(0.0, 1.0, (number_of_particles, 1)) + radius = np.power(radius, 1 / 3) + costheta = np.random.uniform(-1.0, 1.0, (number_of_particles, 1)) + theta = np.arccos(costheta) + phi = np.random.uniform(0, 2 * np.pi, (number_of_particles, 1)) + x = radius * np.sin(theta) * np.cos(phi) + y = radius * np.sin(theta) * np.sin(phi) + z = radius * np.cos(theta) + return np.concatenate([x, y, z], axis=1) + + +def corrupt_scale(pointcloud, level): + """ + Corrupt the scale of input point cloud + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + s = [1.6, 1.7, 1.8, 1.9, 2.0][level] + xyz = np.random.uniform(low=1. / s, high=s, size=[3]) + return _pc_normalize(np.multiply(pointcloud, xyz).astype('float32')) + + +def corrupt_jitter(pointcloud, level): + """ + Jitter the input point cloud + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + sigma = 0.01 * (level + 1) + N, C = pointcloud.shape + pointcloud = pointcloud + sigma * np.random.randn(N, C) + return pointcloud + + +def corrupt_rotate(pointcloud, level): + """ + Randomly rotate the point cloud + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + angle_clip = math.pi / 6 + angle_clip = angle_clip / 5 * (level + 1) + angles = np.random.uniform(-angle_clip, angle_clip, size=(3)) + Rx = np.array([[1, 0, 0], + [0, np.cos(angles[0]), -np.sin(angles[0])], + [0, np.sin(angles[0]), np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]), 0, np.sin(angles[1])], + [0, 1, 0], + [-np.sin(angles[1]), 0, np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]), -np.sin(angles[2]), 0], + [np.sin(angles[2]), np.cos(angles[2]), 0], + [0, 0, 1]]) + R = np.dot(Rz, np.dot(Ry, Rx)) + return np.dot(pointcloud, R) + + +def corrupt_dropout_global(pointcloud, level): + """ + Drop random points globally + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + drop_rate = [0.25, 0.375, 0.5, 0.625, 0.75][level] + num_points = pointcloud.shape[0] + pointcloud = _shuffle_pointcloud(pointcloud) + pointcloud = pointcloud[:int(num_points * (1 - drop_rate)), :] + return pointcloud + + +def corrupt_dropout_local(pointcloud, level): + """ + Randomly drop local clusters + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + num_points = pointcloud.shape[0] + total_cluster_size = 100 * (level + 1) + num_clusters = np.random.randint(1, 8) + cluster_size_list = _gen_random_cluster_sizes(num_clusters, total_cluster_size) + for i in range(num_clusters): + K = cluster_size_list[i] + pointcloud = _shuffle_pointcloud(pointcloud) + dist = np.sum((pointcloud - pointcloud[:1, :]) ** 2, axis=1, keepdims=True) + idx = dist.argsort(axis=0)[::-1, :] + pointcloud = np.take_along_axis(pointcloud, idx, axis=0) + num_points -= K + pointcloud = pointcloud[:num_points, :] + return pointcloud + + +def corrupt_add_global(pointcloud, level): + """ + Add random points globally + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + npoints = 10 * (level + 1) + additional_pointcloud = _sample_points_inside_unit_sphere(npoints) + pointcloud = np.concatenate([pointcloud, additional_pointcloud[:npoints]], axis=0) + return pointcloud + + +def corrupt_add_local(pointcloud, level): + """ + Randomly add local clusters to a point cloud + :param pointcloud: input point cloud + :param level: severity level + :return: corrupted point cloud + """ + num_points = pointcloud.shape[0] + total_cluster_size = 100 * (level + 1) + num_clusters = np.random.randint(1, 8) + cluster_size_list = _gen_random_cluster_sizes(num_clusters, total_cluster_size) + pointcloud = _shuffle_pointcloud(pointcloud) + add_pcd = np.zeros_like(pointcloud) + num_added = 0 + for i in range(num_clusters): + K = cluster_size_list[i] + sigma = np.random.uniform(0.075, 0.125) + add_pcd[num_added:num_added + K, :] = np.copy(pointcloud[i:i + 1, :]) + add_pcd[num_added:num_added + K, :] = add_pcd[num_added:num_added + K, :] + sigma * np.random.randn( + *add_pcd[num_added:num_added + K, :].shape) + num_added += K + assert num_added == total_cluster_size + dist = np.sum(add_pcd ** 2, axis=1, keepdims=True).repeat(3, axis=1) + add_pcd[dist > 1] = add_pcd[dist > 1] / dist[dist > 1] # ensure the added points are inside a unit sphere + pointcloud = np.concatenate([pointcloud, add_pcd], axis=0) + pointcloud = pointcloud[:num_points + total_cluster_size] + return pointcloud diff --git a/docs/CUSTOMIZE.md b/docs/CUSTOMIZE.md new file mode 100644 index 0000000..119ae78 --- /dev/null +++ b/docs/CUSTOMIZE.md @@ -0,0 +1,94 @@ + + + +# Customize Evaluation for Your Own Codebase + +We have designed utilities to make evaluation on ModelNet-C easy. +You may already have an evaluation code for the standard ModelNet. +It takes three simple steps to make it work on ModelNet-C. + +### Step 1: Install and Import ModelNet-C Utility +Install our utility by: +```bash +git clone https://github.com/jiawei-ren/ModelNet-C.git +cd ModelNet-C +pip install -e modelnetc_utils +``` +Import our utility in your evaluation script for the standard ModelNet40: +```python +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC +``` + +### Step 2: Modify the Test Function +The test function on the standard ModelNet should look like: +```python +def test(args, model): + ''' + Arguments: + args: necessary arguments like batch size and number of workers + model: the model to be tested + Return: + overall_accuracy: overall accuracy (OA) + ''' + # Create test loader + test_loader = DataLoader(ModelNet40(...), ...) + + # Run model on test loader to get the results + overall_accuracy = run_model_on_test_loader(model, test_loader) + + # return the overall accuracy (OA) + return overall_accuracy +``` +where `run_model_on_test_loader` is usually a for-loop that iterates through all test batches. + +To test on ModelNetC, we need an additional argument `split` to indicate the type of corruption. The modified test function should look like: +```python +def test_corrupt(args, model, split): + ''' + Arguments: + args: necessary arguments like batch size and number of workers + model: the model to be tested + split: corruption type + Return: + overall_accuracy: overall accuracy (OA) + ''' + # Replace ModelNet40 by ModelNetC + test_loader = DataLoader(ModelNetC(split=split), ...) + + # Remains unchanged + overall_accuracy = run_model_on_test_loader(model, test_loader) + + # Remains unchanged + return overall_accuracy +``` + +### Step 3: Call Our Wrapper Funcion +The calling of the test function for the standard ModelNet40 should be: +```python +overall_accuracy = test(args, model) +print("OA: {}".format(overall_accuracy)) +``` +For ModelNet-C, we provide a wrapper function to repeatedly call the test function for every corruption type and aggregate the results. +We may conveniently use the wrapper function by: +```python +eval_corrupt_wrapper(model, test_corrupt, {'args': args}) +``` + +### Example +An example evaluation code for ModelNet-C is provided in [GDANet/main_cls.py](https://github.com/jiawei-ren/ModelNet-C/blob/main/GDANet/main_cls.py#L312). + +Example output: +```bash +# result on clean test set +{'acc': 0.9359805510534847, 'avg_per_class_acc': 0.9017848837209301, 'corruption': 'clean'} +{'OA': 0.9359805510534847, 'corruption': 'clean', 'level': 'Overall'} + +# result on scale corrupted test set +{'acc': 0.9258508914100486, 'avg_per_class_acc': 0.8890872093023254, 'corruption': 'scale', 'level': 0} +... +{'acc': 0.9047811993517018, 'avg_per_class_acc': 0.8646802325581395, 'corruption': 'scale', 'level': 4} +{'CE': 0.9008931342460089, 'OA': 0.9153160453808752, 'RCE': 1.0332252836304725, 'corruption': 'scale', 'level': 'Overall'} +... +# final result +{'RmCE': 1.207452747764862, 'mCE': 1.1023796740168037, 'mOA': 0.7303542486686734} +``` diff --git a/docs/DATA_PREPARE.md b/docs/DATA_PREPARE.md new file mode 100644 index 0000000..de1d893 --- /dev/null +++ b/docs/DATA_PREPARE.md @@ -0,0 +1,55 @@ + + +# Prepare Data + +### Classification +Download ModelNet-C by: +```shell +cd data +gdown https://drive.google.com/uc?id=1KE6MmXMtfu_mgxg4qLPdEwVD5As8B0rm +unzip modelnet_c.zip && cd .. +``` +Alternatively, you may download ModelNet-C from our project page. + + +### Part Segmentation +Download ShapeNet-C by: +```shell +cd data +gdown https://drive.google.com/uc?id= +unzip shapenet_c.zip && cd .. +``` +Alternatively, you may download ShapeNet-C from our project page. + + +### Dataset Structure +``` +root + └─── dataset_c + └───── add_global_0.h5 + └───── ... + └───── add_local_0.h5 + └───── ... + └───── dropout_global_0.h5 + └───── ... + └───── dropout_local_0.h5 + └───── ... + └───── jitter_0.h5 + └───── ... + └───── rotate_0.h5 + └───── ... + └───── scale_0.h5 + └───── ... + └───── clean.h5 + └─── README.txt + ``` + + +### License + +This benchmark is made freely available to academic and non-academic entities for non-commercial purposes such as academic research, teaching, scientific publications, or personal experimentation. Permission is granted to use the data given that you agree: + +- That the benchmark comes β€œAS IS”, without express or implied warranty. Although every effort has been made to ensure accuracy, we do not accept any responsibility for errors or omissions. +- That you may not use the benchmark or any derivative work for commercial purposes as, for example, licensing or selling the data, or using the data with a purpose to procure a commercial gain. +- That you include a reference to PointCloud-C (including ModelNet-C, ShapeNet-C, and the specially generated data for academic challenges) in any work that makes use of the benchmark. For research papers, please cite our preferred publications as listed on our webpage. + diff --git a/docs/EVALUATE.md b/docs/EVALUATE.md new file mode 100644 index 0000000..83269ce --- /dev/null +++ b/docs/EVALUATE.md @@ -0,0 +1,86 @@ + + +# Evaluation Script + +### Outline + +- [Classification](#classification) +- [Part Segmentation](#part-segmentation) + + +### Classification + +#### Architecture + +- DGCNN +```shell +python SimpleView/main.py --entry test_corrupt --model-path pretrained_models/DGCNN.pth --exp-config SimpleView/configs/dgcnn_dgcnn_run_1.yaml +``` +- PointNet +```shell +python SimpleView/main.py --entry test_corrupt --model-path pretrained_models/PointNet.pth --exp-config SimpleView/configs/dgcnn_pointnet_run_1.yaml +``` +- PointNet++ +```shell +python SimpleView/main.py --entry test_corrupt --model-path pretrained_models/PointNet2.pth --exp-config SimpleView/configs/dgcnn_pointnet2_run_1.yaml +``` +- RSCNN +```shell +python SimpleView/main.py --entry test_corrupt --model-path pretrained_models/RSCNN.pth --exp-config SimpleView/configs/dgcnn_rscnn_run_1.yaml +``` +- SimpleView +```shell +python SimpleView/main.py --entry test_corrupt --model-path pretrained_models/SimpleView.pth --exp-config SimpleView/configs/dgcnn_simpleview_run_1.yaml +``` +- PCT +```shell +python PCT/main.py --exp_name=test --num_points=1024 --use_sgd=True --eval_corrupt=True --model_path pretrained_models/PCT.t7 --test_batch_size 8 --model PCT +``` +- GDANet +```shell +python GDANet/main_cls.py --eval_corrupt=True --model_path pretrained_models/GDANet.t7 +``` +- PAConv +```shell +python PAConv/obj_cls/main.py --config PAConv/obj_cls/config/dgcnn_paconv_test.yaml --model_path ../pcdrobustness/pretrained_models/PAConv.t7 --eval_corrupt True +``` +- CurveNet +```shell +python3 CurveNet/core/main_cls.py --exp_name=test --eval_corrupt=True --model_path pretrained_models/CurveNet.t7 +``` +- RPC +```shell +python PCT/main.py --exp_name=test --num_points=1024 --use_sgd=True --eval_corrupt=True --model_path pretrained_models/RPC.t7 --test_batch_size 8 --model RPC +``` + +#### Augmentation + +- DGCNN + PointWOLF +```shell +python PointWOLF/main.py --exp_name=test --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval_corrupt=True --model_path pretrained_models/DGCNN_PointWOLF.t7 +``` +- DGCNN + RSMix +```shell +python PointWOLF/main.py --exp_name=test --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval_corrupt=True --model_path pretrained_models/DGCNN_RSMix.t7 +``` +- DGCNN + WOLFMix +```shell +python PointWOLF/main.py --exp_name=test --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval_corrupt=True --model_path pretrained_models/DGCNN_WOLFMix.t7 +``` +- GDANet + WOLFMix +```shell +python GDANet/main_cls.py --eval_corrupt=True --model_path pretrained_models/GDANet_WOLFMix.t7 +``` +- RPC + WOLFMix (final) +```shell +python PCT/main.py --exp_name=test --num_points=1024 --use_sgd=True --eval_corrupt=True --model_path pretrained_models/RPC_WOLFMix_final.t7 --test_batch_size 8 --model RPC +``` + + +### Part Segmentation + +Coming soon. + + + + diff --git a/docs/GENERATE.md b/docs/GENERATE.md new file mode 100644 index 0000000..827a44b --- /dev/null +++ b/docs/GENERATE.md @@ -0,0 +1,11 @@ + + +# Generation Your Own Corruption Sets + +You may generate more "PointCloud-C" sets by: +```shell +python build/corrupt.py +``` + +:warning: Note that the script uses a **different** random seed from the official ModelNet-C and ShapeNet-C. +One should NOT report results on self-generated corruption sets. diff --git a/docs/GET_STARTED.md b/docs/GET_STARTED.md new file mode 100644 index 0000000..a00c293 --- /dev/null +++ b/docs/GET_STARTED.md @@ -0,0 +1,28 @@ + + +# Getting Started + +### Clone the GitHub Repo +```shell +git clone https://github.com/ldkong1205/PointCloud-C.git +cd PointCloud-C +``` + +### Set Up the Environment + +```shell +conda create --name pointcloud-c python=3.7.5 +conda activate pointcloud-c +pip install -r requirements.txt +cd SimpleView/pointnet2_pyt && pip install -e . && cd - +pip install -e pointcloudc_utils +``` + +### Download Pretrained Models + +Please download existing pretrained models by +```shell +gdown https://drive.google.com/uc?id=11RONLZGg0ezxC16n57PiEZouqC5L0b_h +unzip pretrained_models.zip +``` +Alternatively, you may download [pretrained models](https://drive.google.com/file/d/11RONLZGg0ezxC16n57PiEZouqC5L0b_h/view?usp=sharing) manually and extract it under root directory. diff --git a/figs/.keep b/figs/.keep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/figs/.keep @@ -0,0 +1 @@ + diff --git a/figs/logo.png b/figs/logo.png new file mode 100644 index 0000000..cdf8f51 Binary files /dev/null and b/figs/logo.png differ diff --git a/figs/teaser.png b/figs/teaser.png new file mode 100644 index 0000000..fe08667 Binary files /dev/null and b/figs/teaser.png differ diff --git a/pointcloudc_utils/README.md b/pointcloudc_utils/README.md new file mode 100644 index 0000000..aba59bf --- /dev/null +++ b/pointcloudc_utils/README.md @@ -0,0 +1,20 @@ + + +# Utils for Loading and Evaluating PointCloud-C + + +### Install +```shell +pip install -e . +``` + + +### Usage + +- `eval_corrupt_wrapper` + + The wrapper helps to repeat the original testing function on all corrupted test sets. It also helps to compute metrics. + +- `PointCloud-C` + + PointCloud-C loader. The default path is set to `../../data/pointcloud_c`. Please change the path in accordingly. diff --git a/pointcloudc_utils/pointcloudc_utils/__init__.py b/pointcloudc_utils/pointcloudc_utils/__init__.py new file mode 100644 index 0000000..85890c3 --- /dev/null +++ b/pointcloudc_utils/pointcloudc_utils/__init__.py @@ -0,0 +1,2 @@ +from .dataset import PointCloudC +from .eval import eval_corrupt_wrapper \ No newline at end of file diff --git a/pointcloudc_utils/pointcloudc_utils/dataset.py b/pointcloudc_utils/pointcloudc_utils/dataset.py new file mode 100644 index 0000000..131db27 --- /dev/null +++ b/pointcloudc_utils/pointcloudc_utils/dataset.py @@ -0,0 +1,28 @@ +import os +import h5py +from torch.utils.data import Dataset + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DATA_DIR = os.path.join(BASE_DIR, '../../data/pointcloud_c') # pls change the data dir accordingly + + +def load_h5(h5_name): + f = h5py.File(h5_name, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + return data, label + + +class ModelNetC(Dataset): + def __init__(self, split): + h5_path = os.path.join(DATA_DIR, split + '.h5') + self.data, self.label = load_h5(h5_path) + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + return pointcloud, label + + def __len__(self): + return self.data.shape[0] diff --git a/pointcloudc_utils/pointcloudc_utils/eval.py b/pointcloudc_utils/pointcloudc_utils/eval.py new file mode 100644 index 0000000..bd653aa --- /dev/null +++ b/pointcloudc_utils/pointcloudc_utils/eval.py @@ -0,0 +1,71 @@ +import pprint + + +def eval_corrupt_wrapper(model, fn_test_corrupt, args_test_corrupt): + """ + The wrapper helps to repeat the original testing function on all corrupted test sets. + It also helps to compute metrics. + :param model: model + :param fn_test_corrupt: original evaluation function, returns a dict of metrics, e.g., {'acc': 0.93} + :param args_test_corrupt: a dict of arguments to fn_test_corrupt, e.g., {'test_loader': loader} + :return: + """ + corruptions = [ + 'clean', + 'scale', + 'jitter', + 'rotate', + 'dropout_global', + 'dropout_local', + 'add_global', + 'add_local', + ] + DGCNN_OA = { + 'clean': 0.926, + 'scale': 0.906, + 'jitter': 0.684, + 'rotate': 0.785, + 'dropout_global': 0.752, + 'dropout_local': 0.793, + 'add_global': 0.705, + 'add_local': 0.725 + } + OA_clean = None + perf_all = {'OA': [], 'CE': [], 'RCE': []} + for corruption_type in corruptions: + perf_corrupt = {'OA': []} + for level in range(5): + if corruption_type == 'clean': + split = "clean" + else: + split = corruption_type + '_' + str(level) + test_perf = fn_test_corrupt(split=split, model=model, **args_test_corrupt) + if not isinstance(test_perf, dict): + test_perf = {'acc': test_perf} + perf_corrupt['OA'].append(test_perf['acc']) + test_perf['corruption'] = corruption_type + if corruption_type != 'clean': + test_perf['level'] = level + pprint.pprint(test_perf, width=200) + if corruption_type == 'clean': + OA_clean = round(test_perf['acc'], 3) + break + for k in perf_corrupt: + perf_corrupt[k] = sum(perf_corrupt[k]) / len(perf_corrupt[k]) + perf_corrupt[k] = round(perf_corrupt[k], 3) + if corruption_type != 'clean': + perf_corrupt['CE'] = (1 - perf_corrupt['OA']) / (1 - DGCNN_OA[corruption_type]) + perf_corrupt['RCE'] = (OA_clean - perf_corrupt['OA']) / (DGCNN_OA['clean'] - DGCNN_OA[corruption_type]) + for k in perf_all: + perf_corrupt[k] = round(perf_corrupt[k], 3) + perf_all[k].append(perf_corrupt[k]) + perf_corrupt['corruption'] = corruption_type + perf_corrupt['level'] = 'Overall' + pprint.pprint(perf_corrupt, width=200) + for k in perf_all: + perf_all[k] = sum(perf_all[k]) / len(perf_all[k]) + perf_all[k] = round(perf_all[k], 3) + perf_all['mCE'] = perf_all.pop('CE') + perf_all['RmCE'] = perf_all.pop('RCE') + perf_all['mOA'] = perf_all.pop('OA') + pprint.pprint(perf_all, width=200) diff --git a/pointcloudc_utils/setup.py b/pointcloudc_utils/setup.py new file mode 100644 index 0000000..ad3284f --- /dev/null +++ b/pointcloudc_utils/setup.py @@ -0,0 +1,9 @@ +from setuptools import setup, find_packages + +VERSION = '0.1.0' +PACKAGE_NAME = 'pointcloudc-utils' + +setup(name=PACKAGE_NAME, + version=VERSION, + packages=find_packages() + ) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a7a3ce1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +git+git://github.com/imankgoyal/etw_pytorch_utils.git@v1.1.1#egg=etw_pytorch_utils +enum34 +future +h5py==2.10.0 +progressbar2==3.50.0 +tensorboardX==2.0 +-f https://download.pytorch.org/whl/torch_stable.html +torch==1.4.0+cu100 +-f https://download.pytorch.org/whl/torch_stable.html +torchvision==0.5.0+cu100 +yacs==0.1.6 +gdown==4.2.0 +scikit-learn==1.0.2 \ No newline at end of file diff --git a/zoo/CurveNet/README.md b/zoo/CurveNet/README.md new file mode 100644 index 0000000..c0f7436 --- /dev/null +++ b/zoo/CurveNet/README.md @@ -0,0 +1,194 @@ +# CurveNet +Official implementation of "Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis", ICCV 2021 + +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/walk-in-the-cloud-learning-curves-for-point/3d-point-cloud-classification-on-modelnet40)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-modelnet40?p=walk-in-the-cloud-learning-curves-for-point) +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/walk-in-the-cloud-learning-curves-for-point/3d-part-segmentation-on-shapenet-part)](https://paperswithcode.com/sota/3d-part-segmentation-on-shapenet-part?p=walk-in-the-cloud-learning-curves-for-point) + +Paper: https://arxiv.org/abs/2105.01288 + +![CurveNet](./poster3.png) + +## Requirements +- Python>=3.7 +- PyTorch>=1.2 +- Packages: glob, h5py, sklearn + +## Contents +- [Point Cloud Classification](#point-cloud-classification) +- [Point Cloud Part Segmentation](#point-cloud-part-segmentation) +- [Point Cloud Normal Estimation](#point-cloud-normal-estimation) + +**NOTE:** Please change your current directory to ```core/``` first before excuting the following commands. + +## Point Cloud Classification +### Data + +The ModelNet40 dataset is primarily used for the classification experiments. At your first run, the program will automatically download the data if it is not in ```data/```. Or, you can manually download the [offical data](https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip) and unzip to ```data/```. + +Alternatively, you can place your downloaded data anywhere you like, and link the path to ```DATA_DIR``` in ```core/data.py```. Otherwise, the download will still be automatically triggered. + +### Train + +Train with our default settings (same as in the paper): + +``` +python3 main_cls.py --exp_name=curvenet_cls_1 +``` + +Train with customized settings with the flags: ```--lr```, ```--scheduler```, ```--batch_size```. + +Alternatively, you can directly modify ```core/start_cls.sh``` and simply run: + +``` +./start_cls.sh +``` + +**NOTE:** Our reported model achieves **93.8%/94.2%** accuracy (see sections below). However, due to randomness, the best result might require repeated training processes. Hence, we also provide another benchmark result here (where we repeated 5 runs with different random seeds, and report their average), which is **93.65%** accuracy. + + + +### Evaluation + + +Evaluate without voting: +``` +python3 main_cls.py --exp_name=curvenet_cls_1 --eval=True --model_path=PATH_TO_YOUR_MODEL +``` + +Alternatively, you can directly modify ```core/test_cls.sh``` and simply run: +``` +./test_cls.sh +``` + +For voting, we used the ```voting_evaluate_cls.py```script provided in [RSCNN](https://github.com/Yochengliu/Relation-Shape-CNN). Please refer to their license for usage. + +### Evaluation with our pretrained model: + +Please download our pretrained model ```cls/``` at [google drive](https://drive.google.com/drive/folders/1kX-zIipyzB0iMaopcijzdTRuHeTzfTSz?usp=sharing). + +And then run: + +``` +python3 main_cls.py --exp_name=curvenet_cls_pretrained --eval --model_path=PATH_TO_PRETRAINED/cls/models/model.t7 +``` + +  +## Point Cloud Part Segmentation +### Data + +The ShapeNet Part dataset is primarily used for the part segmentation experiments. At your first run, the program will automatically download the data if it is not in ```data/```. Or, you can manually download the [offical data](https://shapenet.cs.stanford.edu/media/shapenet_part_seg_hdf5_data.zip) and unzip to ```data/```. + +Alternatively, you can place your downloaded data anywhere you like, and link the path to ```DATA_DIR``` in ```core/data.py```. Otherwise, the download will still be automatically triggered. + +### Train + +Train with our default settings (same as in the paper): + +``` +python3 main_partseg.py --exp_name=curvenet_seg_1 +``` + +Train with customized settings with the flags: ```--lr```, ```--scheduler```, ```--batch_size```. + +Alternatively, you can directly modify ```core/start_part.sh``` and simply run: + +``` +./start_part.sh +``` + +**NOTE:** Our reported model achieves **86.6%/86.8%** mIoU (see sections below). However, due to randomness, the best result might require repeated training processes. Hence, we also provide another benchmark result here (where we repeated 5 runs with different random seeds, and report their average), which is **86.46** mIoU. + + + +### Evaluation + +Evaluate without voting: +``` +python3 main_partseg.py --exp_name=curvenet_seg_1 --eval=True --model_path=PATH_TO_YOUR_MODEL +``` + +Alternatively, you can directly modify ```core/test_cls.sh``` and simply run: +``` +./test_cls.sh +``` + +For voting, we used the ```voting_evaluate_partseg.py```script provided in [RSCNN](https://github.com/Yochengliu/Relation-Shape-CNN). Please refer to their license for usage. + +### Evaluation with our pretrained model: + +Please download our pretrained model ```partseg/``` at [google drive](https://drive.google.com/drive/folders/1kX-zIipyzB0iMaopcijzdTRuHeTzfTSz?usp=sharing). + +And then run: + +``` +python3 main_partseg.py --exp_name=curvenet_seg_pretrained --eval=True --model_path=PATH_TO_PRETRAINED/partseg/models/model.t7 +``` + +  +## Point Cloud Normal Estimation + +### Data + +The ModelNet40 dataset is used for the normal estimation experiments. We have preprocessed the raw ModelNet40 dataset into ```.h5``` files. Each point cloud instance contains 2048 randomly sampled points and point-to-point normal ground truths. + +Please download our processed data [here](https://drive.google.com/file/d/1j6lB3ZOF0_x_l9bqdchAxIYBi7Devie8/view?usp=sharing) and place it to ```data/```, or you need to specify the data root path in ```core/data.py```. + +### Train + +Train with our default settings (same as in the paper): + +``` +python3 main_normal.py --exp_name=curvenet_normal_1 +``` + +Train with customized settings with the flags: ```--multiplier```, ```--lr```, ```--scheduler```, ```--batch_size```. + +Alternatively, you can directly modify ```core/start_normal.sh``` and simply run: + +``` +./start_normal.sh +``` + +### Evaluation + +Evaluate without voting: +``` +python3 main_normal.py --exp_name=curvenet_normal_1 --eval=True --model_path=PATH_TO_YOUR_MODEL +``` + +Alternatively, you can directly modify ```core/test_normal.sh``` and simply run: +``` +./test_normal.sh +``` + +### Evaluation with our pretrained model: + +Please download our pretrained model ```normal/``` at [google drive](https://drive.google.com/drive/folders/1kX-zIipyzB0iMaopcijzdTRuHeTzfTSz?usp=sharing). + +And then run: + +``` +python3 main_normal.py --exp_name=curvenet_normal_pretrained --eval=True --model_path=PATH_TO_PRETRAINED/normal/models/model.t7 +``` + +## Citation + +If you find this repo useful in your work or research, please cite: + +``` +@InProceedings{Xiang_2021_ICCV, + author = {Xiang, Tiange and Zhang, Chaoyi and Song, Yang and Yu, Jianhui and Cai, Weidong}, + title = {Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis}, + booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2021}, + pages = {915-924} +} +``` + +## Acknowledgement + +Our code borrows a lot from: +- [DGCNN](https://github.com/WangYueFt/dgcnn) +- [DGCNN.pytorch](https://github.com/AnTao97/dgcnn.pytorch) +- [CloserLook3D](https://github.com/zeliu98/CloserLook3D) diff --git a/zoo/CurveNet/core/data.py b/zoo/CurveNet/core/data.py new file mode 100644 index 0000000..161d622 --- /dev/null +++ b/zoo/CurveNet/core/data.py @@ -0,0 +1,195 @@ +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: data.py +@Time: 2018/10/13 6:21 PM + +Modified by +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@Time: 2021/1/21 3:10 PM +""" + + +import os +import sys +import glob +import h5py +import numpy as np +import torch +from torch.utils.data import Dataset + + +# change this to your data root +DATA_DIR = '../data/' + +def download_modelnet40(): + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + os.mkdir(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')) + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s --no-check-certificate; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def download_shapenetpart(): + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data')): + os.mkdir(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data')) + www = 'https://shapenet.cs.stanford.edu/media/shapenet_part_seg_hdf5_data.zip' + zipfile = os.path.basename(www) + os.system('wget %s --no-check-certificate; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data'))) + os.system('rm %s' % (zipfile)) + + +def load_data_normal(partition): + f = h5py.File(os.path.join(DATA_DIR, 'modelnet40_normal', 'normal_%s.h5'%partition), 'r+') + data = f['xyz'][:].astype('float32') + label = f['normal'][:].astype('float32') + f.close() + return data, label + + +def load_data_cls(partition): + download_modelnet40() + all_data = [] + all_label = [] + for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40*hdf5_2048', '*%s*.h5'%partition)): + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def load_data_partseg(partition): + download_shapenetpart() + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + for h5_name in file: + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +def rotate_pointcloud(pointcloud): + theta = np.pi*2 * np.random.uniform() + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + pointcloud[:,[0,2]] = pointcloud[:,[0,2]].dot(rotation_matrix) # random rotation (x,z) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, num_points, partition='train'): + self.data, self.label = load_data_cls(partition) + self.num_points = num_points + self.partition = partition + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + if self.partition == 'train': + pointcloud = translate_pointcloud(pointcloud) + #pointcloud = rotate_pointcloud(pointcloud) + np.random.shuffle(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + +class ModelNetNormal(Dataset): + def __init__(self, num_points, partition='train'): + self.data, self.label = load_data_normal(partition) + self.num_points = num_points + self.partition = partition + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item][:self.num_points] + if self.partition == 'train': + #pointcloud = translate_pointcloud(pointcloud) + idx = np.arange(0, pointcloud.shape[0], dtype=np.int64) + np.random.shuffle(idx) + pointcloud = self.data[item][idx] + label = self.label[item][idx] + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None): + self.data, self.label, self.seg = load_data_partseg(partition) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] diff --git a/zoo/CurveNet/core/main_cls.py b/zoo/CurveNet/core/main_cls.py new file mode 100644 index 0000000..46d01a1 --- /dev/null +++ b/zoo/CurveNet/core/main_cls.py @@ -0,0 +1,265 @@ +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: main_cls.py +@Time: 2018/10/13 10:39 PM + +Modified by +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@Time: 2021/01/21 3:10 PM +""" + +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, MultiStepLR +from data import ModelNet40 +from models.curvenet_cls import CurveNet +import numpy as np +from torch.utils.data import DataLoader +from util import cal_loss, IOStream +import sklearn.metrics as metrics +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC + + +def _init_(): + # fix random seed + torch.manual_seed(seed) + np.random.seed(seed) + torch.cuda.manual_seed_all(seed) + torch.cuda.manual_seed(seed) + torch.set_printoptions(10) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + os.environ['PYTHONHASHSEED'] = str(seed) + + # prepare file structures + if not os.path.exists('../checkpoints'): + os.makedirs('../checkpoints') + if not os.path.exists('../checkpoints/'+args.exp_name): + os.makedirs('../checkpoints/'+args.exp_name) + if not os.path.exists('../checkpoints/'+args.exp_name+'/'+'models'): + os.makedirs('../checkpoints/'+args.exp_name+'/'+'models') + os.system('cp main_cls.py ../checkpoints/'+args.exp_name+'/main_cls.py.backup') + os.system('cp models/curvenet_cls.py ../checkpoints/'+args.exp_name+'/curvenet_cls.py.backup') + +def train(args, io): + train_loader = DataLoader(ModelNet40(partition='train', num_points=args.num_points), num_workers=8, + batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), num_workers=8, + batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + io.cprint("Let's use" + str(torch.cuda.device_count()) + "GPUs!") + + # create model + model = CurveNet().to(device) + model = nn.DataParallel(model) + + if args.use_sgd: + io.cprint("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + io.cprint("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + if args.scheduler == 'cos': + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=1e-3) + elif args.scheduler == 'step': + scheduler = MultiStepLR(opt, [120, 160], gamma=0.1) + + criterion = cal_loss + + best_test_acc = 0 + for epoch in range(args.epochs): + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for data, label in train_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), 1) + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 1e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 1e-5: + for param_group in opt.param_groups: + param_group['lr'] = 1e-5 + + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f' % (epoch, train_loss*1.0/count, + metrics.accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f' % (epoch, test_loss*1.0/count, test_acc) + io.cprint(outstr) + if test_acc >= best_test_acc: + best_test_acc = test_acc + torch.save(model.state_dict(), '../checkpoints/%s/models/model.t7' % args.exp_name) + io.cprint('best: %.3f' % best_test_acc) + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), + batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + model = CurveNet().to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + + model = model.eval() + test_acc = 0.0 + count = 0.0 + test_true = [] + test_pred = [] + for data, label in test_loader: + + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f'%(test_acc) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Recognition') + parser.add_argument('--exp_name', type=str, default='exp', metavar='N', + help='Name of the experiment') + parser.add_argument('--dataset', type=str, default='modelnet40', metavar='N', + choices=['modelnet40']) + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=200, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.001, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--scheduler', type=str, default='cos', metavar='N', + choices=['cos', 'step'], + help='Scheduler to use, [cos, step]') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--eval_corrupt', type=bool, default=False, + help='evaluate the model under corruption') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + args = parser.parse_args() + + seed = np.random.randint(1, 10000) + + _init_() + + if args.eval or args.eval_corrupt: + io = IOStream('../checkpoints/' + args.exp_name + '/eval.log') + else: + io = IOStream('../checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + io.cprint('random seed is: ' + str(seed)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + else: + io.cprint('Using CPU') + + if not args.eval and not args.eval_corrupt: + train(args, io) + elif args.eval: + with torch.no_grad(): + test(args, io) + elif args.eval_corrupt: + with torch.no_grad(): + device = torch.device("cuda" if args.cuda else "cpu") + model = CurveNet().to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + + def test_corrupt(args, split, model): + test_loader = DataLoader(ModelNetC(split=split), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + return {'acc': test_acc, 'avg_per_class_acc': avg_per_class_acc} + + + eval_corrupt_wrapper(model, test_corrupt, {'args': args}) diff --git a/zoo/CurveNet/core/main_normal.py b/zoo/CurveNet/core/main_normal.py new file mode 100644 index 0000000..d700ade --- /dev/null +++ b/zoo/CurveNet/core/main_normal.py @@ -0,0 +1,211 @@ +""" +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@File: main_normal.py +@Time: 2021/01/21 3:10 PM +""" + + +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, MultiStepLR +from data import ModelNetNormal +from models.curvenet_normal import CurveNet +import numpy as np +from torch.utils.data import DataLoader +from util import IOStream + + +def _init_(): + # fix random seed + torch.manual_seed(seed) + np.random.seed(seed) + torch.cuda.manual_seed_all(seed) + torch.cuda.manual_seed(seed) + torch.set_printoptions(10) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + os.environ['PYTHONHASHSEED'] = str(seed) + + # prepare file structures + if not os.path.exists('../checkpoints'): + os.makedirs('../checkpoints') + if not os.path.exists('../checkpoints/'+args.exp_name): + os.makedirs('../checkpoints/'+args.exp_name) + if not os.path.exists('../checkpoints/'+args.exp_name+'/'+'models'): + os.makedirs('../checkpoints/'+args.exp_name+'/'+'models') + os.system('cp main_normal.py ../checkpoints/'+args.exp_name+'/main_normal.py.backup') + os.system('cp models/curvenet_normal.py ../checkpoints/'+args.exp_name+'/curvenet_normal.py.backup') + +def train(args, io): + train_loader = DataLoader(ModelNetNormal(args.num_points, partition='train'), + num_workers=8, batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNetNormal(args.num_points, partition='test'), + num_workers=8, batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + # create model + model = CurveNet(args.multiplier).to(device) + model = nn.DataParallel(model) + io.cprint("Let's use" + str(torch.cuda.device_count()) + "GPUs!") + + if args.use_sgd: + io.cprint("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + io.cprint("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + if args.scheduler == 'cos': + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=1e-3) + elif args.scheduler == 'step': + scheduler = MultiStepLR(opt, [140, 180], gamma=0.1) + + criterion = torch.nn.CosineEmbeddingLoss() + + best_test_loss = 99 + for epoch in range(args.epochs): + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + for data, seg in train_loader: + data, seg = data.to(device), seg.to(device) + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + seg_pred = model(data) + seg_pred = seg_pred.permute(0, 2, 1).contiguous() + #print(seg_pred.shape, seg.shape) + loss = criterion(seg_pred.view(-1, 3), seg.view(-1,3).squeeze(), torch.tensor(1).cuda()) + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), 1) + opt.step() + count += batch_size + train_loss += loss.item() * batch_size + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 1e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 1e-5: + for param_group in opt.param_groups: + param_group['lr'] = 1e-5 + + outstr = 'Train %d, loss: %.6f' % (epoch, train_loss/count) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + for data, seg in test_loader: + data, seg = data.to(device), seg.to(device) + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + seg_pred = model(data) + seg_pred = seg_pred.permute(0, 2, 1).contiguous() + + loss = criterion(seg_pred.view(-1, 3), seg.view(-1,3).squeeze(), torch.tensor(1).cuda()) + count += batch_size + test_loss += loss.item() * batch_size + + if test_loss*1.0/count <= best_test_loss: + best_test_loss = test_loss*1.0/count + torch.save(model.state_dict(), '../checkpoints/%s/models/model.t7' % args.exp_name) + outstr = 'Test %d, loss: %.6f, best loss %.6f' % (epoch, test_loss/count, best_test_loss) + io.cprint(outstr) + +def test(args, io): + test_loader = DataLoader(ModelNetNormal(args.num_points, partition='test'), + batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + model = CurveNet(args.multiplier).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + + criterion = torch.nn.CosineEmbeddingLoss() + + model = model.eval() + test_loss = 0.0 + count = 0 + for data, seg in test_loader: + data, seg = data.to(device), seg.to(device) + #print(data.shape, seg.shape) + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + seg_pred = model(data) + seg_pred = seg_pred.permute(0, 2, 1).contiguous() + loss = criterion(seg_pred.view(-1, 3), seg.view(-1,3).squeeze(), torch.tensor(1).cuda()) + count += batch_size + test_loss += loss.item() * batch_size + outstr = 'Test :: test loss: %.6f' % (test_loss*1.0/count) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Part Segmentation') + parser.add_argument('--exp_name', type=str, default='exp', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=200, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.0005, metavar='LR', + help='learning rate') + parser.add_argument('--multiplier', type=float, default=2.0, metavar='MP', + help='network expansion multiplier') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--scheduler', type=str, default='cos', metavar='N', + choices=['cos', 'step'], + help='Scheduler to use, [cos, step]') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + args = parser.parse_args() + + seed = np.random.randint(1, 10000) + + _init_() + + io = IOStream('../checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + io.cprint('random seed is: ' + str(seed)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + with torch.no_grad(): + test(args, io) diff --git a/zoo/CurveNet/core/main_partseg.py b/zoo/CurveNet/core/main_partseg.py new file mode 100644 index 0000000..355682b --- /dev/null +++ b/zoo/CurveNet/core/main_partseg.py @@ -0,0 +1,349 @@ +""" +@Author: An Tao +@Contact: ta19@mails.tsinghua.edu.cn +@File: main_partseg.py +@Time: 2019/12/31 11:17 AM + +Modified by +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@Time: 2021/01/21 3:10 PM +""" + + +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR, MultiStepLR +from data import ShapeNetPart +from models.curvenet_seg import CurveNet +import numpy as np +from torch.utils.data import DataLoader +from util import cal_loss, IOStream +import sklearn.metrics as metrics + +seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] +index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + +def _init_(): + # fix random seed + torch.manual_seed(seed) + np.random.seed(seed) + torch.cuda.manual_seed_all(seed) + torch.cuda.manual_seed(seed) + torch.set_printoptions(10) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + os.environ['PYTHONHASHSEED'] = str(seed) + + # prepare file structures + if not os.path.exists('../checkpoints'): + os.makedirs('../checkpoints') + if not os.path.exists('../checkpoints/'+args.exp_name): + os.makedirs('../checkpoints/'+args.exp_name) + if not os.path.exists('../checkpoints/'+args.exp_name+'/'+'models'): + os.makedirs('../checkpoints/'+args.exp_name+'/'+'models') + os.system('cp main_partseg.py ../checkpoints/'+args.exp_name+'/main_partseg.py.backup') + os.system('cp models/curvenet_seg.py ../checkpoints/'+args.exp_name+'/curvenet_seg.py.backup') + +def calculate_shape_IoU(pred_np, seg_np, label, class_choice, eva=False): + label = label.squeeze() + shape_ious = [] + category = {} + for shape_idx in range(seg_np.shape[0]): + if not class_choice: + start_index = index_start[label[shape_idx]] + num = seg_num[label[shape_idx]] + parts = range(start_index, start_index + num) + else: + parts = range(seg_num[label[0]]) + part_ious = [] + for part in parts: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, seg_np[shape_idx] == part)) + U = np.sum(np.logical_or(pred_np[shape_idx] == part, seg_np[shape_idx] == part)) + if U == 0: + iou = 1 # If the union of groundtruth and prediction points is empty, then count part IoU as 1 + else: + iou = I / float(U) + part_ious.append(iou) + shape_ious.append(np.mean(part_ious)) + if label[shape_idx] not in category: + category[label[shape_idx]] = [shape_ious[-1]] + else: + category[label[shape_idx]].append(shape_ious[-1]) + + if eva: + return shape_ious, category + else: + return shape_ious + +def train(args, io): + train_dataset = ShapeNetPart(partition='trainval', num_points=args.num_points, class_choice=args.class_choice) + if (len(train_dataset) < 100): + drop_last = False + else: + drop_last = True + train_loader = DataLoader(train_dataset, num_workers=8, batch_size=args.batch_size, shuffle=True, drop_last=drop_last) + test_loader = DataLoader(ShapeNetPart(partition='test', num_points=args.num_points, class_choice=args.class_choice), + num_workers=8, batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + io.cprint("Let's use" + str(torch.cuda.device_count()) + "GPUs!") + + seg_num_all = train_loader.dataset.seg_num_all + seg_start_index = train_loader.dataset.seg_start_index + + # create model + model = CurveNet().to(device) + model = nn.DataParallel(model) + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + if args.scheduler == 'cos': + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=1e-3) + elif args.scheduler == 'step': + scheduler = MultiStepLR(opt, [140, 180], gamma=0.1) + criterion = cal_loss + + best_test_iou = 0 + for epoch in range(args.epochs): + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_true_cls = [] + train_pred_cls = [] + train_true_seg = [] + train_pred_seg = [] + train_label_seg = [] + for data, label, seg in train_loader: + seg = seg - seg_start_index + label_one_hot = np.zeros((label.shape[0], 16)) + for idx in range(label.shape[0]): + label_one_hot[idx, label[idx]] = 1 + label_one_hot = torch.from_numpy(label_one_hot.astype(np.float32)) + data, label_one_hot, seg = data.to(device), label_one_hot.to(device), seg.to(device) + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + seg_pred = model(data, label_one_hot) + seg_pred = seg_pred.permute(0, 2, 1).contiguous() + loss = criterion(seg_pred.view(-1, seg_num_all), seg.view(-1,1).squeeze()) + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), 1) + opt.step() + pred = seg_pred.max(dim=2)[1] # (batch_size, num_points) + count += batch_size + train_loss += loss.item() * batch_size + seg_np = seg.cpu().numpy() # (batch_size, num_points) + pred_np = pred.detach().cpu().numpy() # (batch_size, num_points) + train_true_cls.append(seg_np.reshape(-1)) # (batch_size * num_points) + train_pred_cls.append(pred_np.reshape(-1)) # (batch_size * num_points) + train_true_seg.append(seg_np) + train_pred_seg.append(pred_np) + train_label_seg.append(label.reshape(-1)) + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 1e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 1e-5: + for param_group in opt.param_groups: + param_group['lr'] = 1e-5 + train_true_cls = np.concatenate(train_true_cls) + train_pred_cls = np.concatenate(train_pred_cls) + train_acc = metrics.accuracy_score(train_true_cls, train_pred_cls) + avg_per_class_acc = metrics.balanced_accuracy_score(train_true_cls, train_pred_cls) + train_true_seg = np.concatenate(train_true_seg, axis=0) + train_pred_seg = np.concatenate(train_pred_seg, axis=0) + train_label_seg = np.concatenate(train_label_seg) + train_ious = calculate_shape_IoU(train_pred_seg, train_true_seg, train_label_seg, args.class_choice) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f, train iou: %.6f' % (epoch, + train_loss*1.0/count, + train_acc, + avg_per_class_acc, + np.mean(train_ious)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_true_cls = [] + test_pred_cls = [] + test_true_seg = [] + test_pred_seg = [] + test_label_seg = [] + for data, label, seg in test_loader: + seg = seg - seg_start_index + label_one_hot = np.zeros((label.shape[0], 16)) + for idx in range(label.shape[0]): + label_one_hot[idx, label[idx]] = 1 + label_one_hot = torch.from_numpy(label_one_hot.astype(np.float32)) + data, label_one_hot, seg = data.to(device), label_one_hot.to(device), seg.to(device) + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + seg_pred = model(data, label_one_hot) + seg_pred = seg_pred.permute(0, 2, 1).contiguous() + loss = criterion(seg_pred.view(-1, seg_num_all), seg.view(-1,1).squeeze()) + pred = seg_pred.max(dim=2)[1] + count += batch_size + test_loss += loss.item() * batch_size + seg_np = seg.cpu().numpy() + pred_np = pred.detach().cpu().numpy() + test_true_cls.append(seg_np.reshape(-1)) + test_pred_cls.append(pred_np.reshape(-1)) + test_true_seg.append(seg_np) + test_pred_seg.append(pred_np) + test_label_seg.append(label.reshape(-1)) + test_true_cls = np.concatenate(test_true_cls) + test_pred_cls = np.concatenate(test_pred_cls) + test_acc = metrics.accuracy_score(test_true_cls, test_pred_cls) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true_cls, test_pred_cls) + test_true_seg = np.concatenate(test_true_seg, axis=0) + test_pred_seg = np.concatenate(test_pred_seg, axis=0) + test_label_seg = np.concatenate(test_label_seg) + test_ious = calculate_shape_IoU(test_pred_seg, test_true_seg, test_label_seg, args.class_choice) + outstr = 'Test %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f, test iou: %.6f, best iou %.6f' % (epoch, + test_loss*1.0/count, + test_acc, + avg_per_class_acc, + np.mean(test_ious), best_test_iou) + io.cprint(outstr) + if np.mean(test_ious) >= best_test_iou: + best_test_iou = np.mean(test_ious) + torch.save(model.state_dict(), '../checkpoints/%s/models/model.t7' % args.exp_name) + + +def test(args, io): + test_loader = DataLoader(ShapeNetPart(partition='test', num_points=args.num_points, class_choice=args.class_choice), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + seg_start_index = test_loader.dataset.seg_start_index + model = CurveNet().to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + + model = model.eval() + test_acc = 0.0 + test_true_cls = [] + test_pred_cls = [] + test_true_seg = [] + test_pred_seg = [] + test_label_seg = [] + category = {} + for data, label, seg in test_loader: + seg = seg - seg_start_index + label_one_hot = np.zeros((label.shape[0], 16)) + for idx in range(label.shape[0]): + label_one_hot[idx, label[idx]] = 1 + label_one_hot = torch.from_numpy(label_one_hot.astype(np.float32)) + data, label_one_hot, seg = data.to(device), label_one_hot.to(device), seg.to(device) + data = data.permute(0, 2, 1) + seg_pred = model(data, label_one_hot) + seg_pred = seg_pred.permute(0, 2, 1).contiguous() + pred = seg_pred.max(dim=2)[1] + seg_np = seg.cpu().numpy() + pred_np = pred.detach().cpu().numpy() + test_true_cls.append(seg_np.reshape(-1)) + test_pred_cls.append(pred_np.reshape(-1)) + test_true_seg.append(seg_np) + test_pred_seg.append(pred_np) + test_label_seg.append(label.reshape(-1)) + + test_true_cls = np.concatenate(test_true_cls) + test_pred_cls = np.concatenate(test_pred_cls) + test_acc = metrics.accuracy_score(test_true_cls, test_pred_cls) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true_cls, test_pred_cls) + test_true_seg = np.concatenate(test_true_seg, axis=0) + test_pred_seg = np.concatenate(test_pred_seg, axis=0) + test_label_seg = np.concatenate(test_label_seg) + test_ious,category = calculate_shape_IoU(test_pred_seg, test_true_seg, test_label_seg, args.class_choice, eva=True) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f, test iou: %.6f' % (test_acc, + avg_per_class_acc, + np.mean(test_ious)) + io.cprint(outstr) + results = [] + for key in category.keys(): + results.append((int(key), np.mean(category[key]), len(category[key]))) + results.sort(key=lambda x:x[0]) + for re in results: + io.cprint('idx: %d mIoU: %.3f num: %d' % (re[0], re[1], re[2])) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Part Segmentation') + parser.add_argument('--exp_name', type=str, default='exp', metavar='N', + help='Name of the experiment') + parser.add_argument('--dataset', type=str, default='shapenetpart', metavar='N', + choices=['shapenetpart']) + parser.add_argument('--class_choice', type=str, default=None, metavar='N', + choices=['airplane', 'bag', 'cap', 'car', 'chair', + 'earphone', 'guitar', 'knife', 'lamp', 'laptop', + 'motor', 'mug', 'pistol', 'rocket', 'skateboard', 'table']) + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=200, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.0005, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--scheduler', type=str, default='step', metavar='N', + choices=['cos', 'step'], + help='Scheduler to use, [cos, step]') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=2048, + help='num of points to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + args = parser.parse_args() + + seed = np.random.randint(1, 10000) + + _init_() + + if args.eval: + io = IOStream('../checkpoints/' + args.exp_name + '/eval.log') + else: + io = IOStream('../checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + io.cprint('random seed is: ' + str(seed)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + with torch.no_grad(): + test(args, io) diff --git a/zoo/CurveNet/core/models/curvenet_cls.py b/zoo/CurveNet/core/models/curvenet_cls.py new file mode 100644 index 0000000..41960d1 --- /dev/null +++ b/zoo/CurveNet/core/models/curvenet_cls.py @@ -0,0 +1,72 @@ +""" +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@File: curvenet_cls.py +@Time: 2021/01/21 3:10 PM +""" + +import torch.nn as nn +import torch.nn.functional as F +from .curvenet_util import * + + +curve_config = { + 'default': [[100, 5], [100, 5], None, None], + 'long': [[10, 30], None, None, None] + } + +class CurveNet(nn.Module): + def __init__(self, num_classes=40, k=20, setting='default'): + super(CurveNet, self).__init__() + + assert setting in curve_config + + additional_channel = 32 + self.lpfa = LPFA(9, additional_channel, k=k, mlp_num=1, initial=True) + + # encoder + self.cic11 = CIC(npoint=1024, radius=0.05, k=k, in_channels=additional_channel, output_channels=64, bottleneck_ratio=2, mlp_num=1, curve_config=curve_config[setting][0]) + self.cic12 = CIC(npoint=1024, radius=0.05, k=k, in_channels=64, output_channels=64, bottleneck_ratio=4, mlp_num=1, curve_config=curve_config[setting][0]) + + self.cic21 = CIC(npoint=1024, radius=0.05, k=k, in_channels=64, output_channels=128, bottleneck_ratio=2, mlp_num=1, curve_config=curve_config[setting][1]) + self.cic22 = CIC(npoint=1024, radius=0.1, k=k, in_channels=128, output_channels=128, bottleneck_ratio=4, mlp_num=1, curve_config=curve_config[setting][1]) + + self.cic31 = CIC(npoint=256, radius=0.1, k=k, in_channels=128, output_channels=256, bottleneck_ratio=2, mlp_num=1, curve_config=curve_config[setting][2]) + self.cic32 = CIC(npoint=256, radius=0.2, k=k, in_channels=256, output_channels=256, bottleneck_ratio=4, mlp_num=1, curve_config=curve_config[setting][2]) + + self.cic41 = CIC(npoint=64, radius=0.2, k=k, in_channels=256, output_channels=512, bottleneck_ratio=2, mlp_num=1, curve_config=curve_config[setting][3]) + self.cic42 = CIC(npoint=64, radius=0.4, k=k, in_channels=512, output_channels=512, bottleneck_ratio=4, mlp_num=1, curve_config=curve_config[setting][3]) + + self.conv0 = nn.Sequential( + nn.Conv1d(512, 1024, kernel_size=1, bias=False), + nn.BatchNorm1d(1024), + nn.ReLU(inplace=True)) + self.conv1 = nn.Linear(1024 * 2, 512, bias=False) + self.conv2 = nn.Linear(512, num_classes) + self.bn1 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=0.5) + + def forward(self, xyz): + l0_points = self.lpfa(xyz, xyz) + + l1_xyz, l1_points = self.cic11(xyz, l0_points) + l1_xyz, l1_points = self.cic12(l1_xyz, l1_points) + + l2_xyz, l2_points = self.cic21(l1_xyz, l1_points) + l2_xyz, l2_points = self.cic22(l2_xyz, l2_points) + + l3_xyz, l3_points = self.cic31(l2_xyz, l2_points) + l3_xyz, l3_points = self.cic32(l3_xyz, l3_points) + + l4_xyz, l4_points = self.cic41(l3_xyz, l3_points) + l4_xyz, l4_points = self.cic42(l4_xyz, l4_points) + + x = self.conv0(l4_points) + x_max = F.adaptive_max_pool1d(x, 1) + x_avg = F.adaptive_avg_pool1d(x, 1) + + x = torch.cat((x_max, x_avg), dim=1).squeeze(-1) + x = F.relu(self.bn1(self.conv1(x).unsqueeze(-1)), inplace=True).squeeze(-1) + x = self.dp1(x) + x = self.conv2(x) + return x diff --git a/zoo/CurveNet/core/models/curvenet_normal.py b/zoo/CurveNet/core/models/curvenet_normal.py new file mode 100644 index 0000000..dc88575 --- /dev/null +++ b/zoo/CurveNet/core/models/curvenet_normal.py @@ -0,0 +1,88 @@ +""" +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@File: curvenet_normal.py +@Time: 2021/01/21 3:10 PM +""" + +import torch.nn as nn +import torch.nn.functional as F +from .curvenet_util import * + + +curve_config = { + 'default': [[100, 5], [100, 5], None, None] + } + +class CurveNet(nn.Module): + def __init__(self, num_classes=3, k=20, multiplier=1.0, setting='default'): + super(CurveNet, self).__init__() + + assert setting in curve_config + + additional_channel = 64 + channels = [128, 256, 512, 1024] + channels = [int(c * multiplier) for c in channels] + + self.lpfa = LPFA(9, additional_channel, k=k, mlp_num=1, initial=True) + + # encoder + self.cic11 = CIC(npoint=1024, radius=0.1, k=k, in_channels=additional_channel, output_channels=channels[0], bottleneck_ratio=2, curve_config=curve_config[setting][0]) + self.cic12 = CIC(npoint=1024, radius=0.1, k=k, in_channels=channels[0], output_channels=channels[0], bottleneck_ratio=4, curve_config=curve_config[setting][0]) + + self.cic21 = CIC(npoint=256, radius=0.2, k=k, in_channels=channels[0], output_channels=channels[1], bottleneck_ratio=2, curve_config=curve_config[setting][1]) + self.cic22 = CIC(npoint=256, radius=0.2, k=k, in_channels=channels[1], output_channels=channels[1], bottleneck_ratio=4, curve_config=curve_config[setting][1]) + + self.cic31 = CIC(npoint=64, radius=0.4, k=k, in_channels=channels[1], output_channels=channels[2], bottleneck_ratio=2, curve_config=curve_config[setting][2]) + self.cic32 = CIC(npoint=64, radius=0.4, k=k, in_channels=channels[2], output_channels=channels[2], bottleneck_ratio=4, curve_config=curve_config[setting][2]) + + self.cic41 = CIC(npoint=16, radius=0.8, k=15, in_channels=channels[2], output_channels=channels[3], bottleneck_ratio=2, curve_config=curve_config[setting][3]) + self.cic42 = CIC(npoint=16, radius=0.8, k=15, in_channels=channels[3], output_channels=channels[3], bottleneck_ratio=4, curve_config=curve_config[setting][3]) + #self.cic43 = CIC(npoint=16, radius=0.8, k=15, in_channels=2048, output_channels=2048, bottleneck_ratio=4, curve_config=curve_config[setting][3]) + # decoder + self.fp3 = PointNetFeaturePropagation(in_channel=channels[3] + channels[2], mlp=[channels[2], channels[2]], att=[channels[3], channels[3]//2, channels[3]//8]) + self.up_cic4 = CIC(npoint=64, radius=0.8, k=k, in_channels=channels[2], output_channels=channels[2], bottleneck_ratio=4) + + self.fp2 = PointNetFeaturePropagation(in_channel=channels[2] + channels[1], mlp=[channels[1], channels[1]], att=[channels[2], channels[2]//2, channels[2]//8]) + self.up_cic3 = CIC(npoint=256, radius=0.4, k=k, in_channels=channels[1], output_channels=channels[1], bottleneck_ratio=4) + + self.fp1 = PointNetFeaturePropagation(in_channel=channels[1] + channels[0], mlp=[channels[0], channels[0]], att=[channels[1], channels[1]//2, channels[1]//8]) + self.up_cic2 = CIC(npoint=1024, radius=0.1, k=k, in_channels=channels[0]+3, output_channels=channels[0], bottleneck_ratio=4) + self.up_cic1 = CIC(npoint=1024, radius=0.1, k=k, in_channels=channels[0], output_channels=channels[0], bottleneck_ratio=4) + + self.point_conv = nn.Sequential( + nn.Conv2d(9, additional_channel, kernel_size=1, bias=False), + nn.BatchNorm2d(additional_channel), + nn.LeakyReLU(negative_slope=0.2, inplace=True)) + + self.conv1 = nn.Conv1d(channels[0], num_classes, 1) + + def forward(self, xyz): + l0_points = self.lpfa(xyz, xyz) + + l1_xyz, l1_points = self.cic11(xyz, l0_points) + l1_xyz, l1_points = self.cic12(l1_xyz, l1_points) + + l2_xyz, l2_points = self.cic21(l1_xyz, l1_points) + l2_xyz, l2_points = self.cic22(l2_xyz, l2_points) + + l3_xyz, l3_points = self.cic31(l2_xyz, l2_points) + l3_xyz, l3_points = self.cic32(l3_xyz, l3_points) + + l4_xyz, l4_points = self.cic41(l3_xyz, l3_points) + l4_xyz, l4_points = self.cic42(l4_xyz, l4_points) + #l4_xyz, l4_points = self.cic43(l4_xyz, l4_points) + + l3_points = self.fp3(l3_xyz, l4_xyz, l3_points, l4_points) + l3_xyz, l3_points = self.up_cic4(l3_xyz, l3_points) + l2_points = self.fp2(l2_xyz, l3_xyz, l2_points, l3_points) + l2_xyz, l2_points = self.up_cic3(l2_xyz, l2_points) + l1_points = self.fp1(l1_xyz, l2_xyz, l1_points, l2_points) + + x = torch.cat((l1_xyz, l1_points), dim=1) + + xyz, x = self.up_cic2(l1_xyz, x) + xyz, x = self.up_cic1(xyz, x) + + x = self.conv1(x) + return x diff --git a/zoo/CurveNet/core/models/curvenet_seg.py b/zoo/CurveNet/core/models/curvenet_seg.py new file mode 100644 index 0000000..5a8ca91 --- /dev/null +++ b/zoo/CurveNet/core/models/curvenet_seg.py @@ -0,0 +1,131 @@ +""" +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@File: curvenet_seg.py +@Time: 2021/01/21 3:10 PM +""" + +import torch.nn as nn +import torch.nn.functional as F +from .curvenet_util import * + + +curve_config = { + 'default': [[100, 5], [100, 5], None, None, None] + } + +class CurveNet(nn.Module): + def __init__(self, num_classes=50, category=16, k=32, setting='default'): + super(CurveNet, self).__init__() + + assert setting in curve_config + + additional_channel = 32 + self.lpfa = LPFA(9, additional_channel, k=k, mlp_num=1, initial=True) + + # encoder + self.cic11 = CIC(npoint=2048, radius=0.2, k=k, in_channels=additional_channel, output_channels=64, bottleneck_ratio=2, curve_config=curve_config[setting][0]) + self.cic12 = CIC(npoint=2048, radius=0.2, k=k, in_channels=64, output_channels=64, bottleneck_ratio=4, curve_config=curve_config[setting][0]) + + self.cic21 = CIC(npoint=512, radius=0.4, k=k, in_channels=64, output_channels=128, bottleneck_ratio=2, curve_config=curve_config[setting][1]) + self.cic22 = CIC(npoint=512, radius=0.4, k=k, in_channels=128, output_channels=128, bottleneck_ratio=4, curve_config=curve_config[setting][1]) + + self.cic31 = CIC(npoint=128, radius=0.8, k=k, in_channels=128, output_channels=256, bottleneck_ratio=2, curve_config=curve_config[setting][2]) + self.cic32 = CIC(npoint=128, radius=0.8, k=k, in_channels=256, output_channels=256, bottleneck_ratio=4, curve_config=curve_config[setting][2]) + + self.cic41 = CIC(npoint=32, radius=1.2, k=31, in_channels=256, output_channels=512, bottleneck_ratio=2, curve_config=curve_config[setting][3]) + self.cic42 = CIC(npoint=32, radius=1.2, k=31, in_channels=512, output_channels=512, bottleneck_ratio=4, curve_config=curve_config[setting][3]) + + self.cic51 = CIC(npoint=8, radius=2.0, k=7, in_channels=512, output_channels=1024, bottleneck_ratio=2, curve_config=curve_config[setting][4]) + self.cic52 = CIC(npoint=8, radius=2.0, k=7, in_channels=1024, output_channels=1024, bottleneck_ratio=4, curve_config=curve_config[setting][4]) + self.cic53 = CIC(npoint=8, radius=2.0, k=7, in_channels=1024, output_channels=1024, bottleneck_ratio=4, curve_config=curve_config[setting][4]) + + # decoder + self.fp4 = PointNetFeaturePropagation(in_channel=1024 + 512, mlp=[512, 512], att=[1024, 512, 256]) + self.up_cic5 = CIC(npoint=32, radius=1.2, k=31, in_channels=512, output_channels=512, bottleneck_ratio=4) + + self.fp3 = PointNetFeaturePropagation(in_channel=512 + 256, mlp=[256, 256], att=[512, 256, 128]) + self.up_cic4 = CIC(npoint=128, radius=0.8, k=k, in_channels=256, output_channels=256, bottleneck_ratio=4) + + self.fp2 = PointNetFeaturePropagation(in_channel=256 + 128, mlp=[128, 128], att=[256, 128, 64]) + self.up_cic3 = CIC(npoint=512, radius=0.4, k=k, in_channels=128, output_channels=128, bottleneck_ratio=4) + + self.fp1 = PointNetFeaturePropagation(in_channel=128 + 64, mlp=[64, 64], att=[128, 64, 32]) + self.up_cic2 = CIC(npoint=2048, radius=0.2, k=k, in_channels=128+64+64+category+3, output_channels=256, bottleneck_ratio=4) + self.up_cic1 = CIC(npoint=2048, radius=0.2, k=k, in_channels=256, output_channels=256, bottleneck_ratio=4) + + + self.global_conv2 = nn.Sequential( + nn.Conv1d(1024, 128, kernel_size=1, bias=False), + nn.BatchNorm1d(128), + nn.LeakyReLU(negative_slope=0.2)) + self.global_conv1 = nn.Sequential( + nn.Conv1d(512, 64, kernel_size=1, bias=False), + nn.BatchNorm1d(64), + nn.LeakyReLU(negative_slope=0.2)) + + self.conv1 = nn.Conv1d(256, 256, 1, bias=False) + self.bn1 = nn.BatchNorm1d(256) + self.drop1 = nn.Dropout(0.5) + self.conv2 = nn.Conv1d(256, num_classes, 1) + self.se = nn.Sequential(nn.AdaptiveAvgPool1d(1), + nn.Conv1d(256, 256//8, 1, bias=False), + nn.BatchNorm1d(256//8), + nn.LeakyReLU(negative_slope=0.2), + nn.Conv1d(256//8, 256, 1, bias=False), + nn.Sigmoid()) + + def forward(self, xyz, l=None): + batch_size = xyz.size(0) + + l0_points = self.lpfa(xyz, xyz) + + l1_xyz, l1_points = self.cic11(xyz, l0_points) + l1_xyz, l1_points = self.cic12(l1_xyz, l1_points) + + l2_xyz, l2_points = self.cic21(l1_xyz, l1_points) + l2_xyz, l2_points = self.cic22(l2_xyz, l2_points) + + l3_xyz, l3_points = self.cic31(l2_xyz, l2_points) + l3_xyz, l3_points = self.cic32(l3_xyz, l3_points) + + l4_xyz, l4_points = self.cic41(l3_xyz, l3_points) + l4_xyz, l4_points = self.cic42(l4_xyz, l4_points) + + l5_xyz, l5_points = self.cic51(l4_xyz, l4_points) + l5_xyz, l5_points = self.cic52(l5_xyz, l5_points) + l5_xyz, l5_points = self.cic53(l5_xyz, l5_points) + + # global features + emb1 = self.global_conv1(l4_points) + emb1 = emb1.max(dim=-1, keepdim=True)[0] # bs, 64, 1 + emb2 = self.global_conv2(l5_points) + emb2 = emb2.max(dim=-1, keepdim=True)[0] # bs, 128, 1 + + # Feature Propagation layers + l4_points = self.fp4(l4_xyz, l5_xyz, l4_points, l5_points) + l4_xyz, l4_points = self.up_cic5(l4_xyz, l4_points) + + l3_points = self.fp3(l3_xyz, l4_xyz, l3_points, l4_points) + l3_xyz, l3_points = self.up_cic4(l3_xyz, l3_points) + + l2_points = self.fp2(l2_xyz, l3_xyz, l2_points, l3_points) + l2_xyz, l2_points = self.up_cic3(l2_xyz, l2_points) + + l1_points = self.fp1(l1_xyz, l2_xyz, l1_points, l2_points) + + if l is not None: + l = l.view(batch_size, -1, 1) + emb = torch.cat((emb1, emb2, l), dim=1) # bs, 128 + 16, 1 + l = emb.expand(-1,-1, xyz.size(-1)) + x = torch.cat((l1_xyz, l1_points, l), dim=1) + + xyz, x = self.up_cic2(l1_xyz, x) + xyz, x = self.up_cic1(xyz, x) + + x = F.leaky_relu(self.bn1(self.conv1(x)), 0.2, inplace=True) + se = self.se(x) + x = x * se + x = self.drop1(x) + x = self.conv2(x) + return x diff --git a/zoo/CurveNet/core/models/curvenet_util.py b/zoo/CurveNet/core/models/curvenet_util.py new file mode 100644 index 0000000..c9c1d91 --- /dev/null +++ b/zoo/CurveNet/core/models/curvenet_util.py @@ -0,0 +1,488 @@ +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: pointnet_util.py +@Time: 2018/10/13 10:39 PM + +Modified by +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@Time: 2021/01/21 3:10 PM +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F +from time import time +import numpy as np + +from .walk import Walk + + +def knn(x, k): + k = k + 1 + inner = -2 * torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx + +def normal_knn(x, k): + inner = -2 * torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + """ + B, N, _ = src.shape + _, M, _ = dst.shape + dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + dist += torch.sum(src ** 2, -1).view(B, N, 1) + dist += torch.sum(dst ** 2, -1).view(B, 1, M) + return dist + +def index_points(points, idx): + """ + + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S] + Return: + new_points:, indexed points data, [B, S, C] + """ + device = points.device + B = points.shape[0] + view_shape = list(idx.shape) + view_shape[1:] = [1] * (len(view_shape) - 1) + repeat_shape = list(idx.shape) + repeat_shape[0] = 1 + batch_indices = torch.arange(B, dtype=torch.long).to(device).view(view_shape).repeat(repeat_shape) + new_points = points[batch_indices, idx, :] + return new_points + + +def farthest_point_sample(xyz, npoint): + """ + Input: + xyz: pointcloud data, [B, N, 3] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [B, npoint] + """ + device = xyz.device + B, N, C = xyz.shape + centroids = torch.zeros(B, npoint, dtype=torch.long).to(device) + distance = torch.ones(B, N).to(device) * 1e10 + farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device) * 0 + batch_indices = torch.arange(B, dtype=torch.long).to(device) + for i in range(npoint): + centroids[:, i] = farthest + centroid = xyz[batch_indices, farthest, :].view(B, 1, 3) + dist = torch.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = torch.max(distance, -1)[1] + return centroids + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def sample_and_group(npoint, radius, nsample, xyz, points, returnfps=False): + """ + Input: + npoint: + radius: + nsample: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, npoint, nsample, 3] + new_points: sampled points data, [B, npoint, nsample, 3+D] + """ + new_xyz = index_points(xyz, farthest_point_sample(xyz, npoint)) + torch.cuda.empty_cache() + + idx = query_ball_point(radius, nsample, xyz, new_xyz) + torch.cuda.empty_cache() + + new_points = index_points(points, idx) + torch.cuda.empty_cache() + + if returnfps: + return new_xyz, new_points, idx + else: + return new_xyz, new_points + +class Attention_block(nn.Module): + ''' + Used in attention U-Net. + ''' + def __init__(self,F_g,F_l,F_int): + super(Attention_block,self).__init__() + self.W_g = nn.Sequential( + nn.Conv1d(F_g, F_int, kernel_size=1,stride=1,padding=0,bias=True), + nn.BatchNorm1d(F_int) + ) + + self.W_x = nn.Sequential( + nn.Conv1d(F_l, F_int, kernel_size=1,stride=1,padding=0,bias=True), + nn.BatchNorm1d(F_int) + ) + + self.psi = nn.Sequential( + nn.Conv1d(F_int, 1, kernel_size=1,stride=1,padding=0,bias=True), + nn.BatchNorm1d(1), + nn.Sigmoid() + ) + + def forward(self,g,x): + g1 = self.W_g(g) + x1 = self.W_x(x) + psi = F.leaky_relu(g1+x1, negative_slope=0.2) + psi = self.psi(psi) + + return psi, 1. - psi + + +class LPFA(nn.Module): + def __init__(self, in_channel, out_channel, k, mlp_num=2, initial=False): + super(LPFA, self).__init__() + self.k = k + self.device = torch.device('cuda') + self.initial = initial + + if not initial: + self.xyz2feature = nn.Sequential( + nn.Conv2d(9, in_channel, kernel_size=1, bias=False), + nn.BatchNorm2d(in_channel)) + + self.mlp = [] + for _ in range(mlp_num): + self.mlp.append(nn.Sequential(nn.Conv2d(in_channel, out_channel, 1, bias=False), + nn.BatchNorm2d(out_channel), + nn.LeakyReLU(0.2))) + in_channel = out_channel + self.mlp = nn.Sequential(*self.mlp) + + def forward(self, x, xyz, idx=None): + x = self.group_feature(x, xyz, idx) + x = self.mlp(x) + + if self.initial: + x = x.max(dim=-1, keepdim=False)[0] + else: + x = x.mean(dim=-1, keepdim=False) + + return x + + def group_feature(self, x, xyz, idx): + batch_size, num_dims, num_points = x.size() + + if idx is None: + idx = knn(xyz, k=self.k)[:,:,:self.k] # (batch_size, num_points, k) + + idx_base = torch.arange(0, batch_size, device=self.device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.view(-1) + + xyz = xyz.transpose(2, 1).contiguous() # bs, n, 3 + point_feature = xyz.view(batch_size * num_points, -1)[idx, :] + point_feature = point_feature.view(batch_size, num_points, self.k, -1) # bs, n, k, 3 + points = xyz.view(batch_size, num_points, 1, 3).expand(-1, -1, self.k, -1) # bs, n, k, 3 + + point_feature = torch.cat((points, point_feature, point_feature - points), + dim=3).permute(0, 3, 1, 2).contiguous() + + if self.initial: + return point_feature + + x = x.transpose(2, 1).contiguous() # bs, n, c + feature = x.view(batch_size * num_points, -1)[idx, :] + feature = feature.view(batch_size, num_points, self.k, num_dims) #bs, n, k, c + x = x.view(batch_size, num_points, 1, num_dims) + feature = feature - x + + feature = feature.permute(0, 3, 1, 2).contiguous() + point_feature = self.xyz2feature(point_feature) #bs, c, n, k + feature = F.leaky_relu(feature + point_feature, 0.2) + return feature #bs, c, n, k + + +class PointNetFeaturePropagation(nn.Module): + def __init__(self, in_channel, mlp, att=None): + super(PointNetFeaturePropagation, self).__init__() + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + self.att = None + if att is not None: + self.att = Attention_block(F_g=att[0],F_l=att[1],F_int=att[2]) + + for out_channel in mlp: + self.mlp_convs.append(nn.Conv1d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm1d(out_channel)) + last_channel = out_channel + + def forward(self, xyz1, xyz2, points1, points2): + """ + Input: + xyz1: input points position data, [B, C, N] + xyz2: sampled input points position data, [B, C, S], skipped xyz + points1: input points data, [B, D, N] + points2: input points data, [B, D, S], skipped features + Return: + new_points: upsampled points data, [B, D', N] + """ + xyz1 = xyz1.permute(0, 2, 1) + xyz2 = xyz2.permute(0, 2, 1) + + points2 = points2.permute(0, 2, 1) + B, N, C = xyz1.shape + _, S, _ = xyz2.shape + + if S == 1: + interpolated_points = points2.repeat(1, N, 1) + else: + dists = square_distance(xyz1, xyz2) + dists, idx = dists.sort(dim=-1) + dists, idx = dists[:, :, :3], idx[:, :, :3] # [B, N, 3] + + dist_recip = 1.0 / (dists + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_points = torch.sum(index_points(points2, idx) * weight.view(B, N, 3, 1), dim=2) + + # skip attention + if self.att is not None: + psix, psig = self.att(interpolated_points.permute(0, 2, 1), points1) + points1 = points1 * psix + + if points1 is not None: + points1 = points1.permute(0, 2, 1) + new_points = torch.cat([points1, interpolated_points], dim=-1) + else: + new_points = interpolated_points + + new_points = new_points.permute(0, 2, 1) + + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.leaky_relu(bn(conv(new_points)), 0.2) + + return new_points + + +class CIC(nn.Module): + def __init__(self, npoint, radius, k, in_channels, output_channels, bottleneck_ratio=2, mlp_num=2, curve_config=None): + super(CIC, self).__init__() + self.in_channels = in_channels + self.output_channels = output_channels + self.bottleneck_ratio = bottleneck_ratio + self.radius = radius + self.k = k + self.npoint = npoint + + planes = in_channels // bottleneck_ratio + + self.use_curve = curve_config is not None + if self.use_curve: + self.curveaggregation = CurveAggregation(planes) + self.curvegrouping = CurveGrouping(planes, k, curve_config[0], curve_config[1]) + + self.conv1 = nn.Sequential( + nn.Conv1d(in_channels, + planes, + kernel_size=1, + bias=False), + nn.BatchNorm1d(in_channels // bottleneck_ratio), + nn.LeakyReLU(negative_slope=0.2, inplace=True)) + + self.conv2 = nn.Sequential( + nn.Conv1d(planes, output_channels, kernel_size=1, bias=False), + nn.BatchNorm1d(output_channels)) + + if in_channels != output_channels: + self.shortcut = nn.Sequential( + nn.Conv1d(in_channels, + output_channels, + kernel_size=1, + bias=False), + nn.BatchNorm1d(output_channels)) + + self.relu = nn.LeakyReLU(negative_slope=0.2, inplace=True) + + self.maxpool = MaskedMaxPool(npoint, radius, k) + + self.lpfa = LPFA(planes, planes, k, mlp_num=mlp_num, initial=False) + + def forward(self, xyz, x): + + # max pool + if xyz.size(-1) != self.npoint: + xyz, x = self.maxpool( + xyz.transpose(1, 2).contiguous(), x) + xyz = xyz.transpose(1, 2) + + shortcut = x + x = self.conv1(x) # bs, c', n + + idx = knn(xyz, self.k) + + if self.use_curve: + # curve grouping + curves = self.curvegrouping(x, xyz, idx[:,:,1:]) # avoid self-loop + + # curve aggregation + x = self.curveaggregation(x, curves) + + x = self.lpfa(x, xyz, idx=idx[:,:,:self.k]) #bs, c', n, k + + x = self.conv2(x) # bs, c, n + + if self.in_channels != self.output_channels: + shortcut = self.shortcut(shortcut) + + x = self.relu(x + shortcut) + + return xyz, x + + +class CurveAggregation(nn.Module): + def __init__(self, in_channel): + super(CurveAggregation, self).__init__() + self.in_channel = in_channel + mid_feature = in_channel // 2 + self.conva = nn.Conv1d(in_channel, + mid_feature, + kernel_size=1, + bias=False) + self.convb = nn.Conv1d(in_channel, + mid_feature, + kernel_size=1, + bias=False) + self.convc = nn.Conv1d(in_channel, + mid_feature, + kernel_size=1, + bias=False) + self.convn = nn.Conv1d(mid_feature, + mid_feature, + kernel_size=1, + bias=False) + self.convl = nn.Conv1d(mid_feature, + mid_feature, + kernel_size=1, + bias=False) + self.convd = nn.Sequential( + nn.Conv1d(mid_feature * 2, + in_channel, + kernel_size=1, + bias=False), + nn.BatchNorm1d(in_channel)) + self.line_conv_att = nn.Conv2d(in_channel, + 1, + kernel_size=1, + bias=False) + + def forward(self, x, curves): + curves_att = self.line_conv_att(curves) # bs, 1, c_n, c_l + + curver_inter = torch.sum(curves * F.softmax(curves_att, dim=-1), dim=-1) #bs, c, c_n + curves_intra = torch.sum(curves * F.softmax(curves_att, dim=-2), dim=-2) #bs, c, c_l + + curver_inter = self.conva(curver_inter) # bs, mid, n + curves_intra = self.convb(curves_intra) # bs, mid ,n + + x_logits = self.convc(x).transpose(1, 2).contiguous() + x_inter = F.softmax(torch.bmm(x_logits, curver_inter), dim=-1) # bs, n, c_n + x_intra = F.softmax(torch.bmm(x_logits, curves_intra), dim=-1) # bs, l, c_l + + + curver_inter = self.convn(curver_inter).transpose(1, 2).contiguous() + curves_intra = self.convl(curves_intra).transpose(1, 2).contiguous() + + x_inter = torch.bmm(x_inter, curver_inter) + x_intra = torch.bmm(x_intra, curves_intra) + + curve_features = torch.cat((x_inter, x_intra),dim=-1).transpose(1, 2).contiguous() + x = x + self.convd(curve_features) + + return F.leaky_relu(x, negative_slope=0.2) + + +class CurveGrouping(nn.Module): + def __init__(self, in_channel, k, curve_num, curve_length): + super(CurveGrouping, self).__init__() + self.curve_num = curve_num + self.curve_length = curve_length + self.in_channel = in_channel + self.k = k + + self.att = nn.Conv1d(in_channel, 1, kernel_size=1, bias=False) + + self.walk = Walk(in_channel, k, curve_num, curve_length) + + def forward(self, x, xyz, idx): + # starting point selection in self attention style + x_att = torch.sigmoid(self.att(x)) + x = x * x_att + + _, start_index = torch.topk(x_att, + self.curve_num, + dim=2, + sorted=False) + start_index = start_index.squeeze().unsqueeze(2) + + curves = self.walk(xyz, x, idx, start_index) #bs, c, c_n, c_l + + return curves + + +class MaskedMaxPool(nn.Module): + def __init__(self, npoint, radius, k): + super(MaskedMaxPool, self).__init__() + self.npoint = npoint + self.radius = radius + self.k = k + + def forward(self, xyz, features): + sub_xyz, neighborhood_features = sample_and_group(self.npoint, self.radius, self.k, xyz, features.transpose(1,2)) + + neighborhood_features = neighborhood_features.permute(0, 3, 1, 2).contiguous() + sub_features = F.max_pool2d( + neighborhood_features, kernel_size=[1, neighborhood_features.shape[3]] + ) # bs, c, n, 1 + sub_features = torch.squeeze(sub_features, -1) # bs, c, n + return sub_xyz, sub_features diff --git a/zoo/CurveNet/core/models/walk.py b/zoo/CurveNet/core/models/walk.py new file mode 100644 index 0000000..32abfe1 --- /dev/null +++ b/zoo/CurveNet/core/models/walk.py @@ -0,0 +1,156 @@ +""" +@Author: Tiange Xiang +@Contact: txia7609@uni.sydney.edu.au +@File: walk.py +@Time: 2021/01/21 3:10 PM +""" + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def batched_index_select(input, dim, index): + views = [input.shape[0]] + \ + [1 if i != dim else -1 for i in range(1, len(input.shape))] + expanse = list(input.shape) + expanse[0] = -1 + expanse[dim] = -1 + index = index.view(views).expand(expanse) + return torch.gather(input, dim, index) + +def gumbel_softmax(logits, dim, temperature=1): + """ + ST-gumple-softmax w/o random gumbel samplings + input: [*, n_class] + return: flatten --> [*, n_class] an one-hot vector + """ + y = F.softmax(logits / temperature, dim=dim) + + shape = y.size() + _, ind = y.max(dim=-1) + y_hard = torch.zeros_like(y).view(-1, shape[-1]) + y_hard.scatter_(1, ind.view(-1, 1), 1) + y_hard = y_hard.view(*shape) + + y_hard = (y_hard - y).detach() + y + return y_hard + +class Walk(nn.Module): + ''' + Walk in the cloud + ''' + def __init__(self, in_channel, k, curve_num, curve_length): + super(Walk, self).__init__() + self.curve_num = curve_num + self.curve_length = curve_length + self.k = k + + self.agent_mlp = nn.Sequential( + nn.Conv2d(in_channel * 2, + 1, + kernel_size=1, + bias=False), nn.BatchNorm2d(1)) + self.momentum_mlp = nn.Sequential( + nn.Conv1d(in_channel * 2, + 2, + kernel_size=1, + bias=False), nn.BatchNorm1d(2)) + + def crossover_suppression(self, cur, neighbor, bn, n, k): + # cur: bs*n, 3 + # neighbor: bs*n, 3, k + neighbor = neighbor.detach() + cur = cur.unsqueeze(-1).detach() + dot = torch.bmm(cur.transpose(1,2), neighbor) # bs*n, 1, k + norm1 = torch.norm(cur, dim=1, keepdim=True) + norm2 = torch.norm(neighbor, dim=1, keepdim=True) + divider = torch.clamp(norm1 * norm2, min=1e-8) + ans = torch.div(dot, divider).squeeze() # bs*n, k + + # normalize to [0, 1] + ans = 1. + ans + ans = torch.clamp(ans, 0., 1.0) + + return ans.detach() + + def forward(self, xyz, x, adj, cur): + bn, c, tot_points = x.size() + + # raw point coordinates + xyz = xyz.transpose(1,2).contiguous # bs, n, 3 + + # point features + x = x.transpose(1,2).contiguous() # bs, n, c + + flatten_x = x.view(bn * tot_points, -1) + batch_offset = torch.arange(0, bn, device=torch.device('cuda')).detach() * tot_points + + # indices of neighbors for the starting points + tmp_adj = (adj + batch_offset.view(-1,1,1)).view(adj.size(0)*adj.size(1),-1) #bs, n, k + + # batch flattened indices for teh starting points + flatten_cur = (cur + batch_offset.view(-1,1,1)).view(-1) + + curves = [] + + # one step at a time + for step in range(self.curve_length): + + if step == 0: + # get starting point features using flattend indices + starting_points = flatten_x[flatten_cur, :].contiguous() + pre_feature = starting_points.view(bn, self.curve_num, -1, 1).transpose(1,2) # bs * n, c + else: + # dynamic momentum + cat_feature = torch.cat((cur_feature.squeeze(), pre_feature.squeeze()),dim=1) + att_feature = F.softmax(self.momentum_mlp(cat_feature),dim=1).view(bn, 1, self.curve_num, 2) # bs, 1, n, 2 + cat_feature = torch.cat((cur_feature, pre_feature),dim=-1) # bs, c, n, 2 + + # update curve descriptor + pre_feature = torch.sum(cat_feature * att_feature, dim=-1, keepdim=True) # bs, c, n + pre_feature_cos = pre_feature.transpose(1,2).contiguous().view(bn * self.curve_num, -1) + + pick_idx = tmp_adj[flatten_cur] # bs*n, k + + # get the neighbors of current points + pick_values = flatten_x[pick_idx.view(-1),:] + + # reshape to fit crossover suppresion below + pick_values_cos = pick_values.view(bn * self.curve_num, self.k, c) + pick_values = pick_values_cos.view(bn, self.curve_num, self.k, c) + pick_values_cos = pick_values_cos.transpose(1,2).contiguous() + + pick_values = pick_values.permute(0,3,1,2) # bs, c, n, k + + pre_feature_expand = pre_feature.expand_as(pick_values) + + # concat current point features with curve descriptors + pre_feature_expand = torch.cat((pick_values, pre_feature_expand),dim=1) + + # which node to pick next? + pre_feature_expand = self.agent_mlp(pre_feature_expand) # bs, 1, n, k + + if step !=0: + # cross over supression + d = self.crossover_suppression(cur_feature_cos - pre_feature_cos, + pick_values_cos - cur_feature_cos.unsqueeze(-1), + bn, self.curve_num, self.k) + d = d.view(bn, self.curve_num, self.k).unsqueeze(1) # bs, 1, n, k + pre_feature_expand = torch.mul(pre_feature_expand, d) + + pre_feature_expand = gumbel_softmax(pre_feature_expand, -1) #bs, 1, n, k + + cur_feature = torch.sum(pick_values * pre_feature_expand, dim=-1, keepdim=True) # bs, c, n, 1 + + cur_feature_cos = cur_feature.transpose(1,2).contiguous().view(bn * self.curve_num, c) + + cur = torch.argmax(pre_feature_expand, dim=-1).view(-1, 1) # bs * n, 1 + + flatten_cur = batched_index_select(pick_idx, 1, cur).squeeze() # bs * n + + # collect curve progress + curves.append(cur_feature) + + return torch.cat(curves,dim=-1) diff --git a/zoo/CurveNet/core/start_cls.sh b/zoo/CurveNet/core/start_cls.sh new file mode 100644 index 0000000..5e9bd95 --- /dev/null +++ b/zoo/CurveNet/core/start_cls.sh @@ -0,0 +1 @@ +python3 main_cls.py --exp_name=curvenet_cls_1 diff --git a/zoo/CurveNet/core/start_normal.sh b/zoo/CurveNet/core/start_normal.sh new file mode 100644 index 0000000..a129541 --- /dev/null +++ b/zoo/CurveNet/core/start_normal.sh @@ -0,0 +1 @@ +python3 main_normal.py --exp_name=curvenet_normal_1 diff --git a/zoo/CurveNet/core/start_part.sh b/zoo/CurveNet/core/start_part.sh new file mode 100644 index 0000000..4d09f5c --- /dev/null +++ b/zoo/CurveNet/core/start_part.sh @@ -0,0 +1 @@ +python3 main_partseg.py --exp_name=curveunet_seg_1 diff --git a/zoo/CurveNet/core/test_cls.sh b/zoo/CurveNet/core/test_cls.sh new file mode 100644 index 0000000..5bb5d44 --- /dev/null +++ b/zoo/CurveNet/core/test_cls.sh @@ -0,0 +1 @@ +python3 main_cls.py --eval=True --model_path=../pretrained/cls/models/model.t7 diff --git a/zoo/CurveNet/core/test_normal.sh b/zoo/CurveNet/core/test_normal.sh new file mode 100755 index 0000000..7fdc125 --- /dev/null +++ b/zoo/CurveNet/core/test_normal.sh @@ -0,0 +1 @@ +python3 main_normal.py --eval=True --model_path=../pretrained/normal/models/model.t7 diff --git a/zoo/CurveNet/core/test_part.sh b/zoo/CurveNet/core/test_part.sh new file mode 100644 index 0000000..53fb8b1 --- /dev/null +++ b/zoo/CurveNet/core/test_part.sh @@ -0,0 +1 @@ +python3 main_partseg.py --eval=True --model_path=../pretrained/seg/models/model.t7 diff --git a/zoo/CurveNet/core/util.py b/zoo/CurveNet/core/util.py new file mode 100644 index 0000000..f31efb9 --- /dev/null +++ b/zoo/CurveNet/core/util.py @@ -0,0 +1,44 @@ +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: util +@Time: 4/5/19 3:47 PM +""" + + +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() diff --git a/zoo/CurveNet/poster3.png b/zoo/CurveNet/poster3.png new file mode 100644 index 0000000..7f6d9ae Binary files /dev/null and b/zoo/CurveNet/poster3.png differ diff --git a/zoo/CurveNet/teaser.png b/zoo/CurveNet/teaser.png new file mode 100644 index 0000000..0be71d2 Binary files /dev/null and b/zoo/CurveNet/teaser.png differ diff --git a/zoo/GDANet/.gitignore b/zoo/GDANet/.gitignore new file mode 100644 index 0000000..3377dd9 --- /dev/null +++ b/zoo/GDANet/.gitignore @@ -0,0 +1,137 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +.idea/ +exp/ +kernels/ +lib/**/*.o +lib/**/*.ninja* +dataset/ +*.DS_Store +.vscode/ diff --git a/zoo/GDANet/PointWOLF.py b/zoo/GDANet/PointWOLF.py new file mode 100644 index 0000000..cc1c415 --- /dev/null +++ b/zoo/GDANet/PointWOLF.py @@ -0,0 +1,172 @@ +""" +@origin : PointWOLF.py by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@Time: 2021.09.30 +""" + +import torch +import torch.nn as nn +import numpy as np + +class PointWOLF(object): + def __init__(self, args): + print("="*10 + "Using PointWolf" + "="*10) + self.num_anchor = args.w_num_anchor + self.sample_type = args.w_sample_type + self.sigma = args.w_sigma + + self.R_range = (-abs(args.w_R_range), abs(args.w_R_range)) + self.S_range = (1., args.w_S_range) + self.T_range = (-abs(args.w_T_range), abs(args.w_T_range)) + + + def __call__(self, pos): + """ + input : + pos([N,3]) + + output : + pos([N,3]) : original pointcloud + pos_new([N,3]) : Pointcloud augmneted by PointWOLF + """ + M=self.num_anchor #(Mx3) + N, _=pos.shape #(N) + + if self.sample_type == 'random': + idx = np.random.choice(N,M)#(M) + elif self.sample_type == 'fps': + idx = self.fps(pos, M) #(M) + + pos_anchor = pos[idx] #(M,3), anchor point + + pos_repeat = np.expand_dims(pos,0).repeat(M, axis=0)#(M,N,3) + pos_normalize = np.zeros_like(pos_repeat, dtype=pos.dtype) #(M,N,3) + + #Move to canonical space + pos_normalize = pos_repeat - pos_anchor.reshape(M,-1,3) + + #Local transformation at anchor point + pos_transformed = self.local_transformaton(pos_normalize) #(M,N,3) + + #Move to origin space + pos_transformed = pos_transformed + pos_anchor.reshape(M,-1,3) #(M,N,3) + + pos_new = self.kernel_regression(pos, pos_anchor, pos_transformed) + pos_new = self.normalize(pos_new) + + return pos.astype('float32'), pos_new.astype('float32') + + + def kernel_regression(self, pos, pos_anchor, pos_transformed): + """ + input : + pos([N,3]) + pos_anchor([M,3]) + pos_transformed([M,N,3]) + + output : + pos_new([N,3]) : Pointcloud after weighted local transformation + """ + M, N, _ = pos_transformed.shape + + #Distance between anchor points & entire points + sub = np.expand_dims(pos_anchor,1).repeat(N, axis=1) - np.expand_dims(pos,0).repeat(M, axis=0) #(M,N,3), d + + project_axis = self.get_random_axis(1) + + projection = np.expand_dims(project_axis, axis=1)*np.eye(3)#(1,3,3) + + #Project distance + sub = sub @ projection # (M,N,3) + sub = np.sqrt(((sub) ** 2).sum(2)) #(M,N) + + #Kernel regression + weight = np.exp(-0.5 * (sub ** 2) / (self.sigma ** 2)) #(M,N) + pos_new = (np.expand_dims(weight,2).repeat(3, axis=-1) * pos_transformed).sum(0) #(N,3) + pos_new = (pos_new / weight.sum(0, keepdims=True).T) # normalize by weight + return pos_new + + + def fps(self, pos, npoint): + """ + input : + pos([N,3]) + npoint(int) + + output : + centroids([npoints]) : index list for fps + """ + N, _ = pos.shape + centroids = np.zeros(npoint, dtype=np.int_) #(M) + distance = np.ones(N, dtype=np.float64) * 1e10 #(N) + farthest = np.random.randint(0, N, (1,), dtype=np.int_) + for i in range(npoint): + centroids[i] = farthest + centroid = pos[farthest, :] + dist = ((pos - centroid)**2).sum(-1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = distance.argmax() + return centroids + + def local_transformaton(self, pos_normalize): + """ + input : + pos([N,3]) + pos_normalize([M,N,3]) + + output : + pos_normalize([M,N,3]) : Pointclouds after local transformation centered at M anchor points. + """ + M,N,_ = pos_normalize.shape + transformation_dropout = np.random.binomial(1, 0.5, (M,3)) #(M,3) + transformation_axis =self.get_random_axis(M) #(M,3) + + degree = np.pi * np.random.uniform(*self.R_range, size=(M,3)) / 180.0 * transformation_dropout[:,0:1] #(M,3), sampling from (-R_range, R_range) + + scale = np.random.uniform(*self.S_range, size=(M,3)) * transformation_dropout[:,1:2] #(M,3), sampling from (1, S_range) + scale = scale*transformation_axis + scale = scale + 1*(scale==0) #Scaling factor must be larger than 1 + + trl = np.random.uniform(*self.T_range, size=(M,3)) * transformation_dropout[:,2:3] #(M,3), sampling from (1, T_range) + trl = trl*transformation_axis + + #Scaling Matrix + S = np.expand_dims(scale, axis=1)*np.eye(3) # scailing factor to diagonal matrix (M,3) -> (M,3,3) + #Rotation Matrix + sin = np.sin(degree) + cos = np.cos(degree) + sx, sy, sz = sin[:,0], sin[:,1], sin[:,2] + cx, cy, cz = cos[:,0], cos[:,1], cos[:,2] + R = np.stack([cz*cy, cz*sy*sx - sz*cx, cz*sy*cx + sz*sx, + sz*cy, sz*sy*sx + cz*cy, sz*sy*cx - cz*sx, + -sy, cy*sx, cy*cx], axis=1).reshape(M,3,3) + + pos_normalize = pos_normalize@R@S + trl.reshape(M,1,3) + return pos_normalize + + def get_random_axis(self, n_axis): + """ + input : + n_axis(int) + + output : + axis([n_axis,3]) : projection axis + """ + axis = np.random.randint(1,8, (n_axis)) # 1(001):z, 2(010):y, 3(011):yz, 4(100):x, 5(101):xz, 6(110):xy, 7(111):xyz + m = 3 + axis = (((axis[:,None] & (1 << np.arange(m)))) > 0).astype(int) + return axis + + def normalize(self, pos): + """ + input : + pos([N,3]) + + output : + pos([N,3]) : normalized Pointcloud + """ + pos = pos - pos.mean(axis=-2, keepdims=True) + scale = (1 / np.sqrt((pos ** 2).sum(1)).max()) * 0.999999 + pos = scale * pos + return pos diff --git a/zoo/GDANet/README.md b/zoo/GDANet/README.md new file mode 100644 index 0000000..154394a --- /dev/null +++ b/zoo/GDANet/README.md @@ -0,0 +1,92 @@ +# Learning Geometry-Disentangled Representation for Complementary Understanding of 3D Object Point Cloud. +This repository is built for the paper: + +__Learning Geometry-Disentangled Representation for Complementary Understanding of 3D Object Point Cloud (_AAAI2021_)__ [[arXiv](https://arxiv.org/abs/2012.10921)] +
+by [Mutian Xu*](https://mutianxu.github.io/), [Junhao Zhang*](https://junhaozhang98.github.io/), Zhipeng Zhou, Mingye Xu, Xiaojuan Qi and Yu Qiao. + + +## Overview +Geometry-Disentangled Attention Network for 3D object point cloud classification and segmentation (GDANet): + + +## Citation +If you find the code or trained models useful, please consider citing: + + @misc{xu2021learning, + title={Learning Geometry-Disentangled Representation for Complementary Understanding of 3D Object Point Cloud}, + author={Mutian Xu and Junhao Zhang and Zhipeng Zhou and Mingye Xu and Xiaojuan Qi and Yu Qiao}, + year={2021}, + eprint={2012.10921}, + archivePrefix={arXiv}, + primaryClass={cs.CV} + + +## Installation + + +### Requirements +* Linux (tested on Ubuntu 14.04/16.04) +* Python 3.5+ +* PyTorch 1.0+ + +### Dataset +* Create the folder to symlink the data later: + + `mkdir -p data` + +* __Object Classification__: + + Download and unzip [ModelNet40](https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip) (415M), then symlink the path to it as follows (you can alternatively modify the path [here](https://github.com/mutianxu/GDANet/blob/main/util/data_util.py#L12)) : + + `ln -s /path to modelnet40/modelnet40_ply_hdf5_2048 data` + +* __Shape Part Segmentation__: + + Download and unzip [ShapeNet Part](https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip) (674M), then symlink the path to it as follows (you can alternatively modify the path [here](https://github.com/mutianxu/GDANet/blob/main/util/data_util.py#L70)) : + + `ln -s /path to shapenet part/shapenetcore_partanno_segmentation_benchmark_v0_normal data` + +## Usage + +### Object Classification on ModelNet40 +* Train: + + `python main_cls.py --beta 1.0 --epochs 500` + +* Test: + * Run the voting evaluation script, after this =voting you will get an accuracy of 93.8% if all things go right: + + `python voting_eval_modelnet.py --model_path 'pretrained/GDANet_ModelNet40_93.4.t7'` + + * You can also directly evaluate our pretrained model without voting to get an accuracy of 93.4%: + + `python main.py --eval True --model_path 'pretrained/GDANet_ModelNet40_93.4.t7'` + +### Shape Part Segmentation on ShapeNet Part +* Train: + * Training from scratch: + + `python main_ptseg.py` + + * If you want resume training from checkpoints, specify `resume` in the args: + + `python main_ptseg.py --resume True` + +* Test: + + You can choose to test the model with the best instance mIoU, class mIoU or accuracy, by specifying `model_type` in the args: + + * `python main_ptseg.py --model_type 'ins_iou'` (best instance mIoU, default) + + * `python main_ptseg.py --model_type 'cls_iou'` (best class mIoU) + + * `python main_ptseg.py --model_type 'acc'` (best accuracy) + + +## Other information + +Please contact Mutian Xu (mino1018@outlook.com) or Junhao Zhang (junhaozhang98@gmail.com) for further discussion. + +## Acknowledgement +This code is is partially borrowed from [DGCNN](https://github.com/WangYueFt/dgcnn) and [PointNet++](https://github.com/charlesq34/pointnet2). \ No newline at end of file diff --git a/zoo/GDANet/imgs/GDANet.jpg b/zoo/GDANet/imgs/GDANet.jpg new file mode 100644 index 0000000..a4d9ec3 Binary files /dev/null and b/zoo/GDANet/imgs/GDANet.jpg differ diff --git a/zoo/GDANet/main_cls.py b/zoo/GDANet/main_cls.py new file mode 100755 index 0000000..142cac9 --- /dev/null +++ b/zoo/GDANet/main_cls.py @@ -0,0 +1,336 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR +from util.data_util import ModelNet40 +from model.GDANet_cls import GDANET +import numpy as np +from torch.utils.data import DataLoader +from util.util import cal_loss, IOStream +import sklearn.metrics as metrics +from datetime import datetime +import provider +import rsmix_provider +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC + + +# weight initialization: +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + # backup the running files: + if not args.eval: + os.system('cp main_cls.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp model/GDANet_cls.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_cls.py.backup') + os.system('cp util.GDANet_util.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_util.py.backup') + os.system('cp util.data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + + +def train(args, io): + train_loader = DataLoader(ModelNet40(partition='train', num_points=args.num_points, args=args if args.pw else None), + num_workers=8, batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), num_workers=8, + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + model = GDANET().to(device) + print(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr * 100, momentum=args.momentum, weight_decay=1e-4) + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr / 100) + + criterion = cal_loss + + best_test_acc = 0 + + for epoch in range(args.epochs): + scheduler.step() + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for data, label in train_loader: + ''' + implement augmentation + ''' + rsmix = False + # for new augmentation code, remove squeeze because it will be applied after augmentation. + # default from baseline model, scale, shift, shuffle was default augmentation + if args.rot or args.rdscale or args.shift or args.jitter or args.shuffle or args.rddrop or ( + args.beta is not 0.0): + data = data.cpu().numpy() + if args.rot: + data = provider.rotate_point_cloud(data) + data = provider.rotate_perturbation_point_cloud(data) + if args.rdscale: + tmp_data = provider.random_scale_point_cloud(data[:, :, 0:3]) + data[:, :, 0:3] = tmp_data + if args.shift: + tmp_data = provider.shift_point_cloud(data[:, :, 0:3]) + data[:, :, 0:3] = tmp_data + if args.jitter: + tmp_data = provider.jitter_point_cloud(data[:, :, 0:3]) + data[:, :, 0:3] = tmp_data + if args.rddrop: + data = provider.random_point_dropout(data) + if args.shuffle: + data = provider.shuffle_points(data) + r = np.random.rand(1) + if args.beta > 0 and r < args.rsmix_prob: + rsmix = True + data, lam, label, label_b = rsmix_provider.rsmix(data, label, beta=args.beta, n_sample=args.nsample, + KNN=args.knn) + if args.rot or args.rdscale or args.shift or args.jitter or args.shuffle or args.rddrop or ( + args.beta is not 0.0): + data = torch.FloatTensor(data) + if rsmix: + lam = torch.FloatTensor(lam) + lam, label_b = lam.to(device), label_b.to(device).squeeze() + data, label = data.to(device), label.to(device).squeeze() + + if rsmix: + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + + loss = 0 + for i in range(batch_size): + loss_tmp = criterion(logits[i].unsqueeze(0), label[i].unsqueeze(0).long()) * (1 - lam[i]) \ + + criterion(logits[i].unsqueeze(0), label_b[i].unsqueeze(0).long()) * lam[i] + loss += loss_tmp + loss = loss / batch_size + + else: + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + + loss.backward() + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f' % (epoch, + train_loss * 1.0 / count, + metrics.accuracy_score( + train_true, train_pred), + metrics.balanced_accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f' % (epoch, + test_loss * 1.0 / count, + test_acc, + avg_per_class_acc) + io.cprint(outstr) + if test_acc >= best_test_acc: + best_test_acc = test_acc + io.cprint('Max Acc:%.6f' % best_test_acc) + torch.save(model.state_dict(), 'checkpoints/%s/best_model.t7' % args.exp_name) + + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + model = GDANET().to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + test_acc = 0.0 + count = 0.0 + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f' % (test_acc, avg_per_class_acc) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Object Classification') + parser.add_argument('--exp_name', type=str, default='GDANet', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=64, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.001, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--eval_corrupt', type=bool, default=False, + help='evaluate the model under corruption') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + + # added arguments + parser.add_argument('--rdscale', action='store_true', help='random scaling data augmentation') + parser.add_argument('--shift', action='store_true', help='random shift data augmentation') + parser.add_argument('--shuffle', action='store_true', help='random shuffle data augmentation') + parser.add_argument('--rot', action='store_true', help='random rotation augmentation') + parser.add_argument('--jitter', action='store_true', help='jitter augmentation') + parser.add_argument('--rddrop', action='store_true', help='random point drop data augmentation') + parser.add_argument('--rsmix_prob', type=float, default=0.5, help='rsmix probability') + parser.add_argument('--beta', type=float, default=0.0, help='scalar value for beta function') + parser.add_argument('--nsample', type=float, default=512, + help='default max sample number of the erased or added points in rsmix') + parser.add_argument('--modelnet10', action='store_true', help='use modelnet10') + parser.add_argument('--normal', action='store_true', help='use normal') + parser.add_argument('--knn', action='store_true', help='use knn instead ball-query function') + parser.add_argument('--data_path', type=str, default='./data/modelnet40_normal_resampled', help='dataset path') + + # pointwolf + parser.add_argument('--pw', action='store_true', help='use PointWOLF') + parser.add_argument('--w_num_anchor', type=int, default=4, help='Num of anchor point') + parser.add_argument('--w_sample_type', type=str, default='fps', + help='Sampling method for anchor point, option : (fps, random)') + parser.add_argument('--w_sigma', type=float, default=0.5, help='Kernel bandwidth') + + parser.add_argument('--w_R_range', type=float, default=10, help='Maximum rotation range of local transformation') + parser.add_argument('--w_S_range', type=float, default=3, help='Maximum scailing range of local transformation') + parser.add_argument('--w_T_range', type=float, default=0.25, + help='Maximum translation range of local transformation') + + args = parser.parse_args() + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + torch.manual_seed(args.seed) + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + torch.cuda.manual_seed(args.seed) + else: + io.cprint('Using CPU') + + if not args.eval and not args.eval_corrupt: + train(args, io) + elif args.eval: + test(args, io) + elif args.eval_corrupt: + device = torch.device("cuda" if args.cuda else "cpu") + model = GDANET().to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + + def test_corrupt(args, split, model): + test_loader = DataLoader(ModelNetC(split=split), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + return {'acc': test_acc, 'avg_per_class_acc': avg_per_class_acc} + eval_corrupt_wrapper(model, test_corrupt, {'args': args}) diff --git a/zoo/GDANet/main_ptseg.py b/zoo/GDANet/main_ptseg.py new file mode 100644 index 0000000..fcc7070 --- /dev/null +++ b/zoo/GDANet/main_ptseg.py @@ -0,0 +1,439 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from util.data_util import PartNormalDataset, ShapeNetPart +import torch.nn.functional as F +import torch.nn as nn +from model.GDANet_ptseg import GDANet +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main_cls.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp model/GDANet_ptseg.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_ptseg.py.backup') + os.system('cp util.GDANet_util.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_util.py.backup') + os.system('cp util.data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(args, io): + + # ============= Model =================== + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + torch.backends.cudnn.enabled = False ### + + model = GDANet(num_part).to(device) + io.cprint(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + '''Resume or not''' + if args.resume: + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, + map_location=torch.device('cpu'))['model'] + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + model.load_state_dict(state_dict) + + print("Resume training model...") + print(torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name).keys()) + else: + print("Training from scratch...") + + # =========== Dataloader ================= + # train_data = PartNormalDataset(npoints=2048, split='trainval', normalize=False) + train_data = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + print("The number of training data is:%d", len(train_data)) + + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + print("The number of test data is:%d", len(test_data)) + + train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True, num_workers=6, drop_last=True) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=6, drop_last=False) + + # ============= Optimizer ================ + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=0) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=0) + + if args.scheduler == 'cos': + print("Use CosLR") + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr if args.use_sgd else args.lr / 100) + else: + print("Use StepLR") + scheduler = StepLR(opt, step_size=args.step, gamma=0.5) + + # ============= Training ================= + best_acc = 0 + best_class_iou = 0 + best_instance_iou = 0 + num_part = 50 + num_classes = 16 + + for epoch in range(args.epochs): + + train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io) + + test_metrics, total_per_cat_iou = test_epoch(test_loader, model, epoch, num_part, num_classes, io) + + # 1. when get the best accuracy, save the model: + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + io.cprint('Max Acc:%.5f' % best_acc) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_acc': best_acc} + torch.save(state, 'checkpoints/%s/best_acc_model.pth' % args.exp_name) + + # 2. when get the best instance_iou, save the model: + if test_metrics['shape_avg_iou'] > best_instance_iou: + best_instance_iou = test_metrics['shape_avg_iou'] + io.cprint('Max instance iou:%.5f' % best_instance_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_instance_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/best_insiou_model.pth' % args.exp_name) + + # 3. when get the best class_iou, save the model: + # first we need to calculate the average per-class iou + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + avg_class_iou = class_iou / 16 + if avg_class_iou > best_class_iou: + best_class_iou = avg_class_iou + # print the iou of each class: + for cat_idx in range(16): + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) + io.cprint('Max class iou:%.5f' % best_class_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_class_iou': best_class_iou} + torch.save(state, 'checkpoints/%s/best_clsiou_model.pth' % args.exp_name) + + # report best acc, ins_iou, cls_iou + io.cprint('Final Max Acc:%.5f' % best_acc) + io.cprint('Final Max instance iou:%.5f' % best_instance_iou) + io.cprint('Final Max class iou:%.5f' % best_class_iou) + # save last model + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': args.epochs - 1, 'test_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/model_ep%d.pth' % (args.exp_name, args.epochs)) + + +def train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io): + train_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + metrics = defaultdict(lambda: list()) + model.train() + + for batch_id, (points, label, target) in tqdm(enumerate(train_loader), total=len(train_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + # target: b,n + seg_pred = model(points, to_categorical(label, num_classes)) # seg_pred: b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # list of of current batch_iou:[iou1,iou2,...,iou#b_size] + # total iou of current batch in each process: + batch_shapeious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # loss + seg_pred = seg_pred.contiguous().view(-1, num_part) # b*n,50 + target = target.view(-1, 1)[:, 0] # b*n + loss = F.nll_loss(seg_pred, target) + + # loss backward + loss = torch.mean(loss) + opt.zero_grad() + loss.backward() + opt.step() + + # accuracy + pred_choice = seg_pred.contiguous().data.max(1)[1] # b*n + correct = pred_choice.eq(target.contiguous().data).sum() # torch.int64: total number of correct-predict pts + + # sum + shape_ious += batch_shapeious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + train_loss += loss.item() * batch_size + accuracy.append(correct.item()/(batch_size * num_point)) # append the accuracy of each iteration + + # Note: We do not need to calculate per_class iou during training + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 0.9e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 0.9e-5: + for param_group in opt.param_groups: + param_group['lr'] = 0.9e-5 + io.cprint('Learning rate: %f' % opt.param_groups[0]['lr']) + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Train %d, loss: %f, train acc: %f, train ins_iou: %f' % (epoch+1, train_loss * 1.0 / count, metrics['accuracy'], metrics['shape_avg_iou']) + io.cprint(outstr) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=6, drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = GDANet(num_part).to(device) + io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--exp_name', type=str, default='GDANet', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=64, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=False, + help='Use SGD') + parser.add_argument('--scheduler', type=str, default='step', + help='lr scheduler') + parser.add_argument('--step', type=int, default=40, + help='lr decay step') + parser.add_argument('--lr', type=float, default=0.003, metavar='LR', + help='learning rate') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--manual_seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--resume', type=bool, default=False, + help='Resume training or not') + parser.add_argument('--model_type', type=str, default='insiou', + help='choose to test the best insiou/clsiou/acc model (options: insiou, clsiou, acc)') + + args = parser.parse_args() + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + test(args, io) + diff --git a/zoo/GDANet/model/GDANet_cls.py b/zoo/GDANet/model/GDANet_cls.py new file mode 100644 index 0000000..9e70725 --- /dev/null +++ b/zoo/GDANet/model/GDANet_cls.py @@ -0,0 +1,113 @@ +import torch.nn as nn +import torch +import torch.nn.functional as F +from util.GDANet_util import local_operator, GDM, SGCAM + + +class GDANET(nn.Module): + def __init__(self): + super(GDANET, self).__init__() + + self.bn1 = nn.BatchNorm2d(64, momentum=0.1) + self.bn11 = nn.BatchNorm2d(64, momentum=0.1) + self.bn12 = nn.BatchNorm1d(64, momentum=0.1) + + self.bn2 = nn.BatchNorm2d(64, momentum=0.1) + self.bn21 = nn.BatchNorm2d(64, momentum=0.1) + self.bn22 = nn.BatchNorm1d(64, momentum=0.1) + + self.bn3 = nn.BatchNorm2d(128, momentum=0.1) + self.bn31 = nn.BatchNorm2d(128, momentum=0.1) + self.bn32 = nn.BatchNorm1d(128, momentum=0.1) + + self.bn4 = nn.BatchNorm1d(512, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=True), + self.bn1) + self.conv11 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=True), + self.bn11) + self.conv12 = nn.Sequential(nn.Conv1d(64 * 2, 64, kernel_size=1, bias=True), + self.bn12) + + self.conv2 = nn.Sequential(nn.Conv2d(67 * 2, 64, kernel_size=1, bias=True), + self.bn2) + self.conv21 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=True), + self.bn21) + self.conv22 = nn.Sequential(nn.Conv1d(64 * 2, 64, kernel_size=1, bias=True), + self.bn22) + + self.conv3 = nn.Sequential(nn.Conv2d(131 * 2, 128, kernel_size=1, bias=True), + self.bn3) + self.conv31 = nn.Sequential(nn.Conv2d(128, 128, kernel_size=1, bias=True), + self.bn31) + self.conv32 = nn.Sequential(nn.Conv1d(128, 128, kernel_size=1, bias=True), + self.bn32) + + self.conv4 = nn.Sequential(nn.Conv1d(256, 512, kernel_size=1, bias=True), + self.bn4) + + self.SGCAM_1s = SGCAM(64) + self.SGCAM_1g = SGCAM(64) + self.SGCAM_2s = SGCAM(64) + self.SGCAM_2g = SGCAM(64) + + self.linear1 = nn.Linear(1024, 512, bias=True) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=0.4) + self.linear2 = nn.Linear(512, 256, bias=True) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=0.4) + self.linear3 = nn.Linear(256, 40, bias=True) + + def forward(self, x): + B, C, N = x.size() + ############### + """block 1""" + # Local operator: + x1 = local_operator(x, k=30) + x1 = F.relu(self.conv1(x1)) + x1 = F.relu(self.conv11(x1)) + x1 = x1.max(dim=-1, keepdim=False)[0] + + # Geometry-Disentangle Module: + x1s, x1g = GDM(x1, M=256) + + # Sharp-Gentle Complementary Attention Module: + y1s = self.SGCAM_1s(x1, x1s.transpose(2, 1)) + y1g = self.SGCAM_1g(x1, x1g.transpose(2, 1)) + z1 = torch.cat([y1s, y1g], 1) + z1 = F.relu(self.conv12(z1)) + ############### + """block 2""" + x1t = torch.cat((x, z1), dim=1) + x2 = local_operator(x1t, k=30) + x2 = F.relu(self.conv2(x2)) + x2 = F.relu(self.conv21(x2)) + x2 = x2.max(dim=-1, keepdim=False)[0] + + x2s, x2g = GDM(x2, M=256) + + y2s = self.SGCAM_2s(x2, x2s.transpose(2, 1)) + y2g = self.SGCAM_2g(x2, x2g.transpose(2, 1)) + z2 = torch.cat([y2s, y2g], 1) + z2 = F.relu(self.conv22(z2)) + ############### + x2t = torch.cat((x1t, z2), dim=1) + x3 = local_operator(x2t, k=30) + x3 = F.relu(self.conv3(x3)) + x3 = F.relu(self.conv31(x3)) + x3 = x3.max(dim=-1, keepdim=False)[0] + z3 = F.relu(self.conv32(x3)) + ############### + x = torch.cat((z1, z2, z3), dim=1) + x = F.relu(self.conv4(x)) + x11 = F.adaptive_max_pool1d(x, 1).view(B, -1) + x22 = F.adaptive_avg_pool1d(x, 1).view(B, -1) + x = torch.cat((x11, x22), 1) + + x = F.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = F.relu(self.bn7(self.linear2(x))) + x = self.dp2(x) + x = self.linear3(x) + return x diff --git a/zoo/GDANet/model/GDANet_ptseg.py b/zoo/GDANet/model/GDANet_ptseg.py new file mode 100644 index 0000000..e1bfe8c --- /dev/null +++ b/zoo/GDANet/model/GDANet_ptseg.py @@ -0,0 +1,127 @@ +import torch.nn as nn +import torch +import torch.nn.functional as F +from util.GDANet_util import local_operator_withnorm, local_operator, GDM, SGCAM + + +class GDANet(nn.Module): + def __init__(self, num_classes): + super(GDANet, self).__init__() + + self.bn1 = nn.BatchNorm2d(64, momentum=0.1) + self.bn11 = nn.BatchNorm2d(64, momentum=0.1) + self.bn12 = nn.BatchNorm1d(64, momentum=0.1) + + self.bn2 = nn.BatchNorm2d(64, momentum=0.1) + self.bn21 = nn.BatchNorm2d(64, momentum=0.1) + self.bn22 = nn.BatchNorm1d(64, momentum=0.1) + + self.bn3 = nn.BatchNorm2d(128, momentum=0.1) + self.bn31 = nn.BatchNorm2d(128, momentum=0.1) + self.bn32 = nn.BatchNorm1d(128, momentum=0.1) + + self.bn4 = nn.BatchNorm1d(512, momentum=0.1) + self.bnc = nn.BatchNorm1d(64, momentum=0.1) + + self.bn5 = nn.BatchNorm1d(256, momentum=0.1) + self.bn6 = nn.BatchNorm1d(256, momentum=0.1) + self.bn7 = nn.BatchNorm1d(128, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(9, 64, kernel_size=1, bias=True), + self.bn1) + self.conv11 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=True), + self.bn11) + self.conv12 = nn.Sequential(nn.Conv1d(64*2, 64, kernel_size=1, bias=True), + self.bn12) + + self.conv2 = nn.Sequential(nn.Conv2d(67 * 2, 64, kernel_size=1, bias=True), + self.bn2) + self.conv21 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=True), + self.bn21) + self.conv22 = nn.Sequential(nn.Conv1d(64*2, 64, kernel_size=1, bias=True), + self.bn22) + + self.conv3 = nn.Sequential(nn.Conv2d(131 * 2, 128, kernel_size=1, bias=True), + self.bn3) + self.conv31 = nn.Sequential(nn.Conv2d(128, 128, kernel_size=1, bias=True), + self.bn31) + self.conv32 = nn.Sequential(nn.Conv1d(128, 128, kernel_size=1, bias=True), + self.bn32) + + self.conv4 = nn.Sequential(nn.Conv1d(256, 512, kernel_size=1, bias=True), + self.bn4) + self.convc = nn.Sequential(nn.Conv1d(16, 64, kernel_size=1, bias=True), + self.bnc) + + self.conv5 = nn.Sequential(nn.Conv1d(256 + 512 + 64, 256, kernel_size=1, bias=True), + self.bn5) + self.dp1 = nn.Dropout(0.4) + self.conv6 = nn.Sequential(nn.Conv1d(256, 256, kernel_size=1, bias=True), + self.bn6) + self.dp2 = nn.Dropout(0.4) + self.conv7 = nn.Sequential(nn.Conv1d(256, 128, kernel_size=1, bias=True), + self.bn7) + self.conv8 = nn.Conv1d(128, num_classes, kernel_size=1, bias=True) + + self.SGCAM_1s = SGCAM(64) + self.SGCAM_1g = SGCAM(64) + self.SGCAM_2s = SGCAM(64) + self.SGCAM_2g = SGCAM(64) + + def forward(self, x, norm_plt, cls_label): + B, C, N = x.size() + ############### + """block 1""" + x1 = local_operator_withnorm(x, norm_plt, k=30) + x1 = F.relu(self.conv1(x1)) + x1 = F.relu(self.conv11(x1)) + x1 = x1.max(dim=-1, keepdim=False)[0] + x1h, x1l = GDM(x1, M=512) + + x1h = self.SGCAM_1s(x1, x1h.transpose(2, 1)) + x1l = self.SGCAM_1g(x1, x1l.transpose(2, 1)) + x1 = torch.cat([x1h, x1l], 1) + x1 = F.relu(self.conv12(x1)) + ############### + """block 1""" + x1t = torch.cat((x, x1), dim=1) + x2 = local_operator(x1t, k=30) + x2 = F.relu(self.conv2(x2)) + x2 = F.relu(self.conv21(x2)) + x2 = x2.max(dim=-1, keepdim=False)[0] + x2h, x2l = GDM(x2, M=512) + + x2h = self.SGCAM_2s(x2, x2h.transpose(2, 1)) + x2l = self.SGCAM_2g(x2, x2l.transpose(2, 1)) + x2 = torch.cat([x2h, x2l], 1) + x2 = F.relu(self.conv22(x2)) + ############### + x2t = torch.cat((x1t, x2), dim=1) + x3 = local_operator(x2t, k=30) + x3 = F.relu(self.conv3(x3)) + x3 = F.relu(self.conv31(x3)) + x3 = x3.max(dim=-1, keepdim=False)[0] + x3 = F.relu(self.conv32(x3)) + ############### + xx = torch.cat((x1, x2, x3), dim=1) + + xc = F.relu(self.conv4(xx)) + xc = F.adaptive_max_pool1d(xc, 1).view(B, -1) + + cls_label = cls_label.view(B, 16, 1) + cls_label = F.relu(self.convc(cls_label)) + cls = torch.cat((xc.view(B, 512, 1), cls_label), dim=1) + cls = cls.repeat(1, 1, N) + + x = torch.cat((xx, cls), dim=1) + x = F.relu(self.conv5(x)) + x = self.dp1(x) + x = F.relu(self.conv6(x)) + x = self.dp2(x) + x = F.relu(self.conv7(x)) + x = self.conv8(x) + x = F.log_softmax(x, dim=1) + x = x.permute(0, 2, 1) # b,n,50 + + return x + diff --git a/zoo/GDANet/model/__init__.py b/zoo/GDANet/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/GDANet/part_seg/main_ptseg.py b/zoo/GDANet/part_seg/main_ptseg.py new file mode 100644 index 0000000..fcc7070 --- /dev/null +++ b/zoo/GDANet/part_seg/main_ptseg.py @@ -0,0 +1,439 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from util.data_util import PartNormalDataset, ShapeNetPart +import torch.nn.functional as F +import torch.nn as nn +from model.GDANet_ptseg import GDANet +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main_cls.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp model/GDANet_ptseg.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_ptseg.py.backup') + os.system('cp util.GDANet_util.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_util.py.backup') + os.system('cp util.data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(args, io): + + # ============= Model =================== + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + torch.backends.cudnn.enabled = False ### + + model = GDANet(num_part).to(device) + io.cprint(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + '''Resume or not''' + if args.resume: + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, + map_location=torch.device('cpu'))['model'] + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + model.load_state_dict(state_dict) + + print("Resume training model...") + print(torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name).keys()) + else: + print("Training from scratch...") + + # =========== Dataloader ================= + # train_data = PartNormalDataset(npoints=2048, split='trainval', normalize=False) + train_data = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + print("The number of training data is:%d", len(train_data)) + + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + print("The number of test data is:%d", len(test_data)) + + train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True, num_workers=6, drop_last=True) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=6, drop_last=False) + + # ============= Optimizer ================ + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=0) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=0) + + if args.scheduler == 'cos': + print("Use CosLR") + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr if args.use_sgd else args.lr / 100) + else: + print("Use StepLR") + scheduler = StepLR(opt, step_size=args.step, gamma=0.5) + + # ============= Training ================= + best_acc = 0 + best_class_iou = 0 + best_instance_iou = 0 + num_part = 50 + num_classes = 16 + + for epoch in range(args.epochs): + + train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io) + + test_metrics, total_per_cat_iou = test_epoch(test_loader, model, epoch, num_part, num_classes, io) + + # 1. when get the best accuracy, save the model: + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + io.cprint('Max Acc:%.5f' % best_acc) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_acc': best_acc} + torch.save(state, 'checkpoints/%s/best_acc_model.pth' % args.exp_name) + + # 2. when get the best instance_iou, save the model: + if test_metrics['shape_avg_iou'] > best_instance_iou: + best_instance_iou = test_metrics['shape_avg_iou'] + io.cprint('Max instance iou:%.5f' % best_instance_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_instance_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/best_insiou_model.pth' % args.exp_name) + + # 3. when get the best class_iou, save the model: + # first we need to calculate the average per-class iou + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + avg_class_iou = class_iou / 16 + if avg_class_iou > best_class_iou: + best_class_iou = avg_class_iou + # print the iou of each class: + for cat_idx in range(16): + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) + io.cprint('Max class iou:%.5f' % best_class_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_class_iou': best_class_iou} + torch.save(state, 'checkpoints/%s/best_clsiou_model.pth' % args.exp_name) + + # report best acc, ins_iou, cls_iou + io.cprint('Final Max Acc:%.5f' % best_acc) + io.cprint('Final Max instance iou:%.5f' % best_instance_iou) + io.cprint('Final Max class iou:%.5f' % best_class_iou) + # save last model + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': args.epochs - 1, 'test_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/model_ep%d.pth' % (args.exp_name, args.epochs)) + + +def train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io): + train_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + metrics = defaultdict(lambda: list()) + model.train() + + for batch_id, (points, label, target) in tqdm(enumerate(train_loader), total=len(train_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + # target: b,n + seg_pred = model(points, to_categorical(label, num_classes)) # seg_pred: b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # list of of current batch_iou:[iou1,iou2,...,iou#b_size] + # total iou of current batch in each process: + batch_shapeious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # loss + seg_pred = seg_pred.contiguous().view(-1, num_part) # b*n,50 + target = target.view(-1, 1)[:, 0] # b*n + loss = F.nll_loss(seg_pred, target) + + # loss backward + loss = torch.mean(loss) + opt.zero_grad() + loss.backward() + opt.step() + + # accuracy + pred_choice = seg_pred.contiguous().data.max(1)[1] # b*n + correct = pred_choice.eq(target.contiguous().data).sum() # torch.int64: total number of correct-predict pts + + # sum + shape_ious += batch_shapeious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + train_loss += loss.item() * batch_size + accuracy.append(correct.item()/(batch_size * num_point)) # append the accuracy of each iteration + + # Note: We do not need to calculate per_class iou during training + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 0.9e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 0.9e-5: + for param_group in opt.param_groups: + param_group['lr'] = 0.9e-5 + io.cprint('Learning rate: %f' % opt.param_groups[0]['lr']) + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Train %d, loss: %f, train acc: %f, train ins_iou: %f' % (epoch+1, train_loss * 1.0 / count, metrics['accuracy'], metrics['shape_avg_iou']) + io.cprint(outstr) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=6, drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = GDANet(num_part).to(device) + io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--exp_name', type=str, default='GDANet', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=64, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=False, + help='Use SGD') + parser.add_argument('--scheduler', type=str, default='step', + help='lr scheduler') + parser.add_argument('--step', type=int, default=40, + help='lr decay step') + parser.add_argument('--lr', type=float, default=0.003, metavar='LR', + help='learning rate') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--manual_seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--resume', type=bool, default=False, + help='Resume training or not') + parser.add_argument('--model_type', type=str, default='insiou', + help='choose to test the best insiou/clsiou/acc model (options: insiou, clsiou, acc)') + + args = parser.parse_args() + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + test(args, io) + diff --git a/zoo/GDANet/part_seg/test.py b/zoo/GDANet/part_seg/test.py new file mode 100644 index 0000000..d9ea335 --- /dev/null +++ b/zoo/GDANet/part_seg/test.py @@ -0,0 +1,258 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from util.data_util import PartNormalDataset, ShapeNetC +import torch.nn.functional as F +import torch.nn as nn +from model.GDANet_ptseg import GDANet +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main_cls.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp model/GDANet_ptseg.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_ptseg.py.backup') + os.system('cp util.GDANet_util.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_util.py.backup') + os.system('cp util.data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetC(partition='shapenet-c', sub='rotate_4', class_choice=None) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=6, drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = GDANet(num_part).to(device) + # io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("/mnt/lustre/ldkong/models/GDANet/checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--exp_name', type=str, default='GDANet', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=64, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=False, + help='Use SGD') + parser.add_argument('--scheduler', type=str, default='step', + help='lr scheduler') + parser.add_argument('--step', type=int, default=40, + help='lr decay step') + parser.add_argument('--lr', type=float, default=0.003, metavar='LR', + help='learning rate') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--manual_seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=2048, + help='num of points to use') + parser.add_argument('--resume', type=bool, default=False, + help='Resume training or not') + parser.add_argument('--model_type', type=str, default='insiou', + help='choose to test the best insiou/clsiou/acc model (options: insiou, clsiou, acc)') + + args = parser.parse_args() + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + # train(args, io) + pass + else: + test(args, io) + diff --git a/zoo/GDANet/part_seg/test.sh b/zoo/GDANet/part_seg/test.sh new file mode 100644 index 0000000..511ee85 --- /dev/null +++ b/zoo/GDANet/part_seg/test.sh @@ -0,0 +1,5 @@ +CUDA_VISIBLE_DEVICES=3 python test.py \ + --eval True \ + --exp_name robustnesstest_GDANet \ + --model_type insiou \ + --test_batch_size 16 \ No newline at end of file diff --git a/zoo/GDANet/part_seg/train.sh b/zoo/GDANet/part_seg/train.sh new file mode 100644 index 0000000..b72b60e --- /dev/null +++ b/zoo/GDANet/part_seg/train.sh @@ -0,0 +1,2 @@ +CUDA_VISIBLE_DEVICES=0,2 python main_ptseg.py \ + --exp_name robustnesstest_GDANet \ No newline at end of file diff --git a/zoo/GDANet/provider.py b/zoo/GDANet/provider.py new file mode 100644 index 0000000..e51c73f --- /dev/null +++ b/zoo/GDANet/provider.py @@ -0,0 +1,466 @@ +''' +RSMix: +@Author: Dogyoon Lee +@Contact: dogyoonlee@gmail.com +@File: provider.py +@Time: 2020/11/23 13:46 PM +''' + + +import os +import sys +import numpy as np +import h5py +# import tensorflow as tf +import random + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# def set_random_seed(seed=1): +# # set random_seed +# random.seed(seed) +# np.random.seed(seed) +# tf.set_random_seed(seed) + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +# def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.02): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +# def shift_point_cloud(batch_data, shift_range=0.1): +def shift_point_cloud(batch_data, shift_range=0.2): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +# def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): +def random_scale_point_cloud(batch_data, scale_low=2./3., scale_high=3./2.): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def knn_points(k, xyz, query, nsample=512): + B, N, C = xyz.shape + _, S, _ = query.shape # S=1 + + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + sqrdists = square_distance(query, xyz) # Bx1,N #제곱거리 + tmp = np.sort(sqrdists, axis=2) + knn_dist = np.zeros((B,1)) + for i in range(B): + knn_dist[i][0] = tmp[i][0][k] + group_idx[i][sqrdists[i]>knn_dist[i][0]]=N + # group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def cut_points_knn(data_batch, idx, radius, nsample=512, k=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = knn_points(k=k, xyz=data_batch[:,:,:3], query=query_points[:,:,:3], nsample=nsample) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512, KNN=False): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + if KNN: + knn_para = min(int(np.ceil(cut_rad*n_sample)),n_sample) + pts_erase_idx, query_point_1 = cut_points_knn(data_batch, rand_idx_1, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points_knn(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_2 x 3(or 6) + else: + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed, lam, label_a, label_b + diff --git a/zoo/GDANet/rsmix_provider.py b/zoo/GDANet/rsmix_provider.py new file mode 100644 index 0000000..1e0091b --- /dev/null +++ b/zoo/GDANet/rsmix_provider.py @@ -0,0 +1,208 @@ + +import os +import sys +import numpy as np +import h5py +# import tensorflow as tf +import random + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def knn_points(k, xyz, query, nsample=512): + B, N, C = xyz.shape + _, S, _ = query.shape # S=1 + + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + sqrdists = square_distance(query, xyz) # Bx1,N #제곱거리 + tmp = np.sort(sqrdists, axis=2) + knn_dist = np.zeros((B,1)) + for i in range(B): + knn_dist[i][0] = tmp[i][0][k] + group_idx[i][sqrdists[i]>knn_dist[i][0]]=N + # group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def cut_points_knn(data_batch, idx, radius, nsample=512, k=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = knn_points(k=k, xyz=data_batch[:,:,:3], query=query_points[:,:,:3], nsample=nsample) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512, KNN=False): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + if KNN: + knn_para = min(int(np.ceil(cut_rad*n_sample)),n_sample) + pts_erase_idx, query_point_1 = cut_points_knn(data_batch, rand_idx_1, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points_knn(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_2 x 3(or 6) + else: + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed, lam, label_a, label_b + diff --git a/zoo/GDANet/util/GDANet_util.py b/zoo/GDANet/util/GDANet_util.py new file mode 100755 index 0000000..5b8688e --- /dev/null +++ b/zoo/GDANet/util/GDANet_util.py @@ -0,0 +1,212 @@ +import torch +from torch import nn + + +def knn(x, k): + inner = -2*torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx, pairwise_distance + + +def local_operator(x, k): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + idx, _ = knn(x, k=k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor-x, neighbor), dim=3).permute(0, 3, 1, 2) # local and global all in + + return feature + + +def local_operator_withnorm(x, norm_plt, k): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + norm_plt = norm_plt.view(batch_size, -1, num_points) + idx, _ = knn(x, k=k) # (batch_size, num_points, k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + norm_plt = norm_plt.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + neighbor_norm = norm_plt.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + neighbor_norm = neighbor_norm.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor-x, neighbor, neighbor_norm), dim=3).permute(0, 3, 1, 2) # 3c + + return feature + + +def GDM(x, M): + """ + Geometry-Disentangle Module + M: number of disentangled points in both sharp and gentle variation components + """ + k = 64 # number of neighbors to decide the range of j in Eq.(5) + tau = 0.2 # threshold in Eq.(2) + sigma = 2 # parameters of f (Gaussian function in Eq.(2)) + ############### + """Graph Construction:""" + device = torch.device('cuda') + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + idx, p = knn(x, k=k) # p: -[(x1-x2)^2+...] + + # here we add a tau + p1 = torch.abs(p) + p1 = torch.sqrt(p1) + mask = p1 < tau + + # here we add a sigma + p = p / (sigma * sigma) + w = torch.exp(p) # b,n,n + w = torch.mul(mask.float(), w) + + b = 1/torch.sum(w, dim=1) + b = b.reshape(batch_size, num_points, 1).repeat(1, 1, num_points) + c = torch.eye(num_points, num_points, device=device) + c = c.expand(batch_size, num_points, num_points) + D = b * c # b,n,n + + A = torch.matmul(D, w) # normalized adjacency matrix A_hat + + # Get Aij in a local area: + idx2 = idx.view(batch_size * num_points, -1) + idx_base2 = torch.arange(0, batch_size * num_points, device=device).view(-1, 1) * num_points + idx2 = idx2 + idx_base2 + + idx2 = idx2.reshape(batch_size * num_points, k)[:, 1:k] + idx2 = idx2.reshape(batch_size * num_points * (k - 1)) + idx2 = idx2.view(-1) + + A = A.view(-1) + A = A[idx2].reshape(batch_size, num_points, k - 1) # Aij: b,n,k + ############### + """Disentangling Point Clouds into Sharp(xs) and Gentle(xg) Variation Components:""" + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.reshape(batch_size * num_points, k)[:, 1:k] + idx = idx.reshape(batch_size * num_points * (k - 1)) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() # b,n,c + neighbor = x.view(batch_size * num_points, -1)[idx, :] + neighbor = neighbor.view(batch_size, num_points, k - 1, num_dims) # b,n,k,c + A = A.reshape(batch_size, num_points, k - 1, 1) # b,n,k,1 + n = A.mul(neighbor) # b,n,k,c + n = torch.sum(n, dim=2) # b,n,c + + pai = torch.norm(x - n, dim=-1).pow(2) # Eq.(5) + pais = pai.topk(k=M, dim=-1)[1] # first M points as the sharp variation component + paig = (-pai).topk(k=M, dim=-1)[1] # last M points as the gentle variation component + + pai_base = torch.arange(0, batch_size, device=device).view(-1, 1) * num_points + indices = (pais + pai_base).view(-1) + indiceg = (paig + pai_base).view(-1) + + xs = x.view(batch_size * num_points, -1)[indices, :] + xg = x.view(batch_size * num_points, -1)[indiceg, :] + + xs = xs.view(batch_size, M, -1) # b,M,c + xg = xg.view(batch_size, M, -1) # b,M,c + + return xs, xg + + +class SGCAM(nn.Module): + """Sharp-Gentle Complementary Attention Module:""" + def __init__(self, in_channels, inter_channels=None, bn_layer=True): + super(SGCAM, self).__init__() + + self.in_channels = in_channels + self.inter_channels = inter_channels + + if self.inter_channels is None: + self.inter_channels = in_channels // 2 + if self.inter_channels == 0: + self.inter_channels = 1 + + conv_nd = nn.Conv1d + bn = nn.BatchNorm1d + + self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, + kernel_size=1, stride=1, padding=0) + + if bn_layer: + self.W = nn.Sequential( + conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, + kernel_size=1, stride=1, padding=0), + bn(self.in_channels) + ) + nn.init.constant(self.W[1].weight, 0) + nn.init.constant(self.W[1].bias, 0) + else: + self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, + kernel_size=1, stride=1, padding=0) + nn.init.constant(self.W.weight, 0) + nn.init.constant(self.W.bias, 0) + + self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, + kernel_size=1, stride=1, padding=0) + + self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, + kernel_size=1, stride=1, padding=0) + + def forward(self, x, x_2): + batch_size = x.size(0) + + g_x = self.g(x_2).view(batch_size, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + theta_x = self.theta(x).view(batch_size, self.inter_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + phi_x = self.phi(x_2).view(batch_size, self.inter_channels, -1) + W = torch.matmul(theta_x, phi_x) # Attention Matrix + N = W.size(-1) + W_div_C = W / N + + y = torch.matmul(W_div_C, g_x) + y = y.permute(0, 2, 1).contiguous() + y = y.view(batch_size, self.inter_channels, *x.size()[2:]) + W_y = self.W(y) + y = W_y + x + + return y + diff --git a/zoo/GDANet/util/__init__.py b/zoo/GDANet/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/GDANet/util/data_util.py b/zoo/GDANet/util/data_util.py new file mode 100755 index 0000000..24734cf --- /dev/null +++ b/zoo/GDANet/util/data_util.py @@ -0,0 +1,165 @@ +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset +import os +import json +from PointWOLF import PointWOLF + + +def load_data(partition): + all_data = [] + all_label = [] + for h5_name in glob.glob('./data/modelnet40_ply_hdf5_2048/ply_data_%s*.h5' % partition): + f = h5py.File(h5_name) + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +# =========== ModelNet40 ================= +class ModelNet40(Dataset): + def __init__(self, num_points, partition='train', args=None): + self.data, self.label = load_data(partition) + self.num_points = num_points + self.partition = partition + self.PointWOLF = PointWOLF(args) if args is not None else None + + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + if self.partition == 'train': + np.random.shuffle(pointcloud) + if self.PointWOLF is not None: + _, pointcloud = self.PointWOLF(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + +# =========== ShapeNet Part ================= +class PartNormalDataset(Dataset): + def __init__(self, npoints=2500, split='train', normalize=False): + self.npoints = npoints + self.root = './data/shapenetcore_partanno_segmentation_benchmark_v0_normal' + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.normalize = normalize + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k: v for k, v in self.cat.items()} + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + + if split == 'trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split == 'train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split == 'val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split == 'test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..' % (split)) + exit(-1) + + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + def __getitem__(self, index): + if index in self.cache: + point_set, normal, seg, cls = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + point_set = data[:, 0:3] + normal = data[:, 3:6] + seg = data[:, -1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, normal, seg, cls) + + if self.normalize: + point_set = pc_normalize(point_set) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + + # resample + # note that the number of points in some points clouds is less than 2048, thus use random.choice + # remember to use the same seed during train and test for a getting stable result + point_set = point_set[choice, :] + seg = seg[choice] + normal = normal[choice, :] + + return point_set, cls, seg, normal + + def __len__(self): + return len(self.datapath) + + +if __name__ == '__main__': + train = ModelNet40(1024) + test = ModelNet40(1024, 'test') + for data, label in train: + print(data.shape) + print(label.shape) diff --git a/zoo/GDANet/util/util.py b/zoo/GDANet/util/util.py new file mode 100755 index 0000000..00afdd8 --- /dev/null +++ b/zoo/GDANet/util/util.py @@ -0,0 +1,69 @@ +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) # gold is the groudtruth label in the dataloader + + if smoothing: + eps = 0.2 + n_class = pred.size(1) # the number of feature_dim of the ouput, which is output channels + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +# create a file and write the text into it: +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda(non_blocking=True) + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] diff --git a/zoo/GDANet/voting_eval_modelnet.py b/zoo/GDANet/voting_eval_modelnet.py new file mode 100755 index 0000000..c058e30 --- /dev/null +++ b/zoo/GDANet/voting_eval_modelnet.py @@ -0,0 +1,121 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +from util.data_util import ModelNet40 +from model.GDANet_cls import GDANET +import numpy as np +from torch.utils.data import DataLoader +from util.util import cal_loss, IOStream +import sklearn.metrics as metrics + + +class PointcloudScale(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2., trans_low=-0.2, trans_high=0.2, trans_open=True): + self.scale_low = scale_low + self.scale_high = scale_high + self.trans_low = trans_low + self.trans_high = trans_high + self.trans_open = trans_open # whether add translation during voting or not + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + xyz2 = np.random.uniform(low=self.trans_low, high=self.trans_high, size=[3]) + scales = torch.from_numpy(xyz1).float().cuda() + trans = torch.from_numpy(xyz2).float().cuda() if self.trans_open else 0 + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], scales)+trans + return pc + + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), num_workers=5, + batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + NUM_PEPEAT = 300 + NUM_VOTE = 10 + # Try to load models + model = GDANET().to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + best_acc = 0 + + pointscale=PointcloudScale(scale_low=2. / 3., scale_high=3. / 2., trans_low=-0.2, trans_high=0.2, trans_open=True) + for i in range(NUM_PEPEAT): + test_true = [] + test_pred = [] + + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + pred = 0 + for v in range(NUM_VOTE): + new_data = data + batch_size = data.size()[0] + if v > 0: + new_data.data = pointscale(new_data.data) + with torch.no_grad(): + pred += F.softmax(model(new_data.permute(0, 2, 1)), dim=1) + pred /= NUM_VOTE + label = label.view(-1) + pred_choice = pred.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(pred_choice.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + if test_acc > best_acc: + best_acc = test_acc + outstr = 'Voting %d, test acc: %.6f,' % (i, test_acc*100) + io.cprint(outstr) + + final_outstr = 'Final voting result test acc: %.6f,' % (best_acc * 100) + io.cprint(final_outstr) + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/'+args.exp_name): + os.makedirs('checkpoints/'+args.exp_name) + + os.system('cp voting_eval_modelnet.py checkpoints'+'/'+args.exp_name+'/'+'voting_eval_modelnet.py.backup') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='3D Object Classification') + parser.add_argument('--exp_name', type=str, default='GDANet', metavar='N', + help='Name of the experiment') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + parser.add_argument('--trans_open', type=bool, default=True, metavar='N', + help='enables input translation during voting') + args = parser.parse_args() + + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/%s_voting.log' % (args.exp_name)) + + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + torch.manual_seed(args.seed) + if args.cuda: + io.cprint('Using GPU') + torch.cuda.manual_seed(args.seed) + else: + io.cprint('Using CPU') + + test(args, io) diff --git a/zoo/OcCo/LICENSE b/zoo/OcCo/LICENSE new file mode 100644 index 0000000..d3559dd --- /dev/null +++ b/zoo/OcCo/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Hanchen Wang + +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/zoo/OcCo/OcCo_TF/.gitignore b/zoo/OcCo/OcCo_TF/.gitignore new file mode 100644 index 0000000..f53688f --- /dev/null +++ b/zoo/OcCo/OcCo_TF/.gitignore @@ -0,0 +1,143 @@ +# others code +results/*/plots +log/ +demo/ +demo_data/ +para_restored.txt +pc_distance/__pycache__ + +# Byte-compiled / optimized / DLL files +.idea/ +.DS_Store +__pycache__/ +*.py[cod] +*$py.class +*.sh +*/*.sh +data/* +/render/dump* + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/zoo/OcCo/OcCo_TF/Requirements_TF.txt b/zoo/OcCo/OcCo_TF/Requirements_TF.txt new file mode 100644 index 0000000..f580d1e --- /dev/null +++ b/zoo/OcCo/OcCo_TF/Requirements_TF.txt @@ -0,0 +1,12 @@ +# Originally Designed for Docker Environment, TensorFlow 1.12.0/1.15.0, Python 3.7, CUDA 10.0 + +lmdb>=0.9 +numpy>=1.14.0 +h5py >= 2.10.0 +msgpack==0.5.6 +pyarrow>=0.10.0 +open3d>=0.9.0.0 +tensorpack>=0.8.9 +matplotlib>=2.1.0 +tensorflow==2.4.0 +open3d-python==0.7.0.0 diff --git a/zoo/OcCo/OcCo_TF/cls_models/__init__.py b/zoo/OcCo/OcCo_TF/cls_models/__init__.py new file mode 100644 index 0000000..c7c2541 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/cls_models/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + diff --git a/zoo/OcCo/OcCo_TF/cls_models/dgcnn_cls.py b/zoo/OcCo/OcCo_TF/cls_models/dgcnn_cls.py new file mode 100644 index 0000000..dae5440 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/cls_models/dgcnn_cls.py @@ -0,0 +1,164 @@ +# Author: Hanchen Wang (hw501@cam.ac.uk) +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/tensorflow/models/dgcnn.py + +import sys, pdb, tensorflow as tf +sys.path.append('../') +from utils import tf_util +from train_cls_dgcnn_torchloader import NUM_CLASSES, BATCH_SIZE, NUM_POINT + + +class Model: + def __init__(self, inputs, npts, labels, is_training, **kwargs): + self.__dict__.update(kwargs) # have self.bn_decay + self.knn = 20 + self.is_training = is_training + self.features = self.create_encoder(inputs) + self.pred = self.create_decoder(self.features) + self.loss = self.create_loss(self.pred, labels) + + @staticmethod + def get_graph_feature(x, k): + """Torch: get_graph_feature = TF: adj_matrix + nn_idx + edge_feature""" + adj_matrix = tf_util.pairwise_distance(x) + nn_idx = tf_util.knn(adj_matrix, k=k) + x = tf_util.get_edge_feature(x, nn_idx=nn_idx, k=k) + return x + + def create_encoder(self, point_cloud): + point_cloud = tf.reshape(point_cloud, (BATCH_SIZE, NUM_POINT, 3)) + + ''' Previous Solution Author Provided ''' + # point_cloud_transformed = point_cloud + # adj_matrix = tf_util.pairwise_distance(point_cloud_transformed) + # nn_idx = tf_util.knn(adj_matrix, k=self.knn) + # x = tf_util.get_edge_feature(point_cloud_transformed, nn_idx=nn_idx, k=self.knn) + + x = self.get_graph_feature(point_cloud, self.knn) + x = tf_util.conv2d(x, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, bias=False, is_training=self.is_training, + activation_fn=tf.nn.leaky_relu, scope='conv1', bn_decay=self.bn_decay) + x1 = tf.reduce_max(x, axis=-2, keep_dims=True) + + x = self.get_graph_feature(x1, self.knn) + x = tf_util.conv2d(x, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, bias=False, is_training=self.is_training, + activation_fn=tf.nn.leaky_relu, scope='conv2', bn_decay=self.bn_decay) + x2 = tf.reduce_max(x, axis=-2, keep_dims=True) + + x = self.get_graph_feature(x2, self.knn) + x = tf_util.conv2d(x, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, bias=False, is_training=self.is_training, + activation_fn=tf.nn.leaky_relu, scope='conv3', bn_decay=self.bn_decay) + x3 = tf.reduce_max(x, axis=-2, keep_dims=True) + + x = self.get_graph_feature(x3, self.knn) + x = tf_util.conv2d(x, 256, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, bias=False, is_training=self.is_training, + activation_fn=tf.nn.leaky_relu, scope='conv4', bn_decay=self.bn_decay) + x4 = tf.reduce_max(x, axis=-2, keep_dims=True) + + x = tf_util.conv2d(tf.concat([x1, x2, x3, x4], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, bias=False, is_training=self.is_training, + activation_fn=tf.nn.leaky_relu, scope='agg', bn_decay=self.bn_decay) + + x1 = tf.reduce_max(x, axis=1, keep_dims=True) + x2 = tf.reduce_mean(x, axis=1, keep_dims=True) + # pdb.set_trace() + features = tf.reshape(tf.concat([x1, x2], axis=-1), [BATCH_SIZE, -1]) + return features + + def create_decoder(self, features): + """fully connected layers for classification with dropout""" + + with tf.variable_scope('decoder_cls', reuse=tf.AUTO_REUSE): + # self.linear1 = nn.Linear(args.emb_dims*2, 512, bias=False) + features = tf_util.fully_connected(features, 512, bn=True, bias=False, + activation_fn=tf.nn.leaky_relu, + scope='linear1', is_training=self.is_training) + features = tf_util.dropout(features, keep_prob=0.5, scope='dp1', is_training=self.is_training) + + # self.linear2 = nn.Linear(512, 256) + features = tf_util.fully_connected(features, 256, bn=True, bias=True, + activation_fn=tf.nn.leaky_relu, + scope='linear2', is_training=self.is_training) + features = tf_util.dropout(features, keep_prob=0.5, scope='dp2', is_training=self.is_training) + + # self.linear3 = nn.Linear(256, output_channels) + pred = tf_util.fully_connected(features, NUM_CLASSES, bn=False, bias=True, + activation_fn=None, + scope='linear3', is_training=self.is_training) + return pred + + @staticmethod + def create_loss(pred, label, smoothing=True): + # if smoothing: + # eps = 0.2 + # n_class = pred.size(1) + # + # one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + # one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + # log_prb = F.log_softmax(pred, dim=1) + # + # loss = -(one_hot * log_prb).sum(dim=1).mean() + + if smoothing: + eps = 0.2 + # pdb.set_trace() + one_hot = tf.one_hot(indices=label, depth=NUM_CLASSES) + # tf.print(one_hot, output_stream=sys.stderr) # not working + # pdb.set_trace() + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (NUM_CLASSES - 1) + log_prb = tf.nn.log_softmax(logits=pred, axis=1) + # pdb.set_trace() + cls_loss = -tf.reduce_mean(tf.reduce_sum(one_hot * log_prb, axis=1)) + else: + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + cls_loss = tf.reduce_mean(loss) + + tf.summary.scalar('classification loss', cls_loss) + + return cls_loss + + +if __name__ == '__main__': + + batch_size, num_cls = 16, NUM_CLASSES + lr_clip, base_lr, lr_decay_steps, lr_decay_rate = 1e-6, 1e-4, 50000, .7 + + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') + + inputs_pl = tf.placeholder(tf.float32, (1, None, 3), 'inputs') + npts_pl = tf.placeholder(tf.int32, (batch_size,), 'num_points') + labels_pl = tf.placeholder(tf.int32, (batch_size,), 'ground_truths') + learning_rate = tf.train.exponential_decay(base_lr, global_step, lr_decay_steps, lr_decay_rate, + staircase=True, name='lr') + learning_rate = tf.maximum(learning_rate, lr_clip) + + model = Model(inputs_pl, npts_pl, labels_pl, is_training_pl) + trainer = tf.train.AdamOptimizer(learning_rate) + train_op = trainer.minimize(model.loss, global_step) + + print('\n\n\n==========') + print('pred', model.pred) + print('loss', model.loss) + # seems like different from the what the paper has claimed: + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Init Weights + init = tf.global_variables_initializer() + sess.run(init, {is_training_pl: True}) # restore will cover the random initialized parameters + + for idx, var in enumerate(tf.trainable_variables()): + print(idx, var) diff --git a/zoo/OcCo/OcCo_TF/cls_models/pcn_cls.py b/zoo/OcCo/OcCo_TF/cls_models/pcn_cls.py new file mode 100644 index 0000000..8827bf1 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/cls_models/pcn_cls.py @@ -0,0 +1,92 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import sys, tensorflow as tf +sys.path.append('../') +from utils.tf_util import mlp_conv, point_maxpool, point_unpool, fully_connected, dropout +from train_cls import NUM_CLASSES +# NUM_CLASSES = 40 + + +class Model: + def __init__(self, inputs, npts, labels, is_training, **kwargs): + self.is_training = is_training + self.features = self.create_encoder(inputs, npts) + self.pred = self.create_decoder(self.features) + self.loss = self.create_loss(self.pred, labels) + + def create_encoder(self, inputs, npts): + """mini-PointNet encoder""" + + with tf.variable_scope('encoder_0', reuse=tf.AUTO_REUSE): + features = mlp_conv(inputs, [128, 256]) + features_global = point_unpool(point_maxpool(features, npts, keepdims=True), npts) + features = tf.concat([features, features_global], axis=2) + with tf.variable_scope('encoder_1', reuse=tf.AUTO_REUSE): + features = mlp_conv(features, [512, 1024]) + features = point_maxpool(features, npts) + return features + + def create_decoder(self, features): + """fully connected layers for classification with dropout""" + + with tf.variable_scope('decoder_cls', reuse=tf.AUTO_REUSE): + + features = fully_connected(features, 512, bn=True, scope='fc1', is_training=self.is_training) + features = dropout(features, keep_prob=0.7, scope='dp1', is_training=self.is_training) + features = fully_connected(features, 256, bn=True, scope='fc2', is_training=self.is_training) + features = dropout(features, keep_prob=0.7, scope='dp2', is_training=self.is_training) + pred = fully_connected(features, NUM_CLASSES, activation_fn=None, scope='fc3', + is_training=self.is_training) + + return pred + + def create_loss(self, pred, label): + """ pred: B * NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + cls_loss = tf.reduce_mean(loss) + tf.summary.scalar('classification loss', cls_loss) + + return cls_loss + + +if __name__ == '__main__': + + batch_size, num_cls = 16, NUM_CLASSES + lr_clip, base_lr, lr_decay_steps, lr_decay_rate = 1e-6, 1e-4, 50000, .7 + + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') + + inputs_pl = tf.placeholder(tf.float32, (1, None, 3), 'inputs') + npts_pl = tf.placeholder(tf.int32, (batch_size,), 'num_points') + labels_pl = tf.placeholder(tf.int32, (batch_size,), 'ground_truths') + learning_rate = tf.train.exponential_decay(base_lr, global_step, + lr_decay_steps, lr_decay_rate, + staircase=True, name='lr') + learning_rate = tf.maximum(learning_rate, lr_clip) + + # model_module = importlib.import_module('./pcn_cls', './') + model = Model(inputs_pl, npts_pl, labels_pl, is_training_pl) + trainer = tf.train.AdamOptimizer(learning_rate) + train_op = trainer.minimize(model.loss, global_step) + + print('\n\n\n==========') + print('pred', model.pred) + print('loss', model.loss) + # seems like different from the what the paper has claimed: + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init, {is_training_pl: True}) # restore will cover the random initialized parameters + + for idx, var in enumerate(tf.trainable_variables()): + print(idx, var) + diff --git a/zoo/OcCo/OcCo_TF/cls_models/pointnet_cls.py b/zoo/OcCo/OcCo_TF/cls_models/pointnet_cls.py new file mode 100644 index 0000000..92a2a79 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/cls_models/pointnet_cls.py @@ -0,0 +1,128 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import sys, os +import tensorflow as tf +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +from utils.tf_util import fully_connected, dropout, conv2d, max_pool2d +from train_cls import NUM_CLASSES, BATCH_SIZE, NUM_POINT +from utils.transform_nets import input_transform_net, feature_transform_net + + +class Model: + def __init__(self, inputs, npts, labels, is_training, **kwargs): + self.__dict__.update(kwargs) # batch_decay and is_training + self.is_training = is_training + self.features = self.create_encoder(inputs, npts) + self.pred = self.create_decoder(self.features) + self.loss = self.create_loss(self.pred, labels) + + def create_encoder(self, inputs, npts): + """PointNet encoder""" + + inputs = tf.reshape(inputs, (BATCH_SIZE, NUM_POINT, 3)) + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(inputs, self.is_training, self.bn_decay, K=3) + + point_cloud_transformed = tf.matmul(inputs, transform) + input_image = tf.expand_dims(point_cloud_transformed, -1) + + net = conv2d(inputs=input_image, num_output_channels=64, kernel_size=[1, 3], + scope='conv1', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + net = conv2d(inputs=net, num_output_channels=64, kernel_size=[1, 1], + scope='conv2', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + + with tf.variable_scope('transform_net2') as sc: + transform = feature_transform_net(net, self.is_training, self.bn_decay, K=64) + net_transformed = tf.matmul(tf.squeeze(net, axis=[2]), transform) + net_transformed = tf.expand_dims(net_transformed, [2]) + + '''conv2d, with kernel size of [1,1,1,1] and stride of [1,1,1,1], + basically equals with the MLPs''' + + # use_xavier=True, stddev=1e-3, weight_decay=0.0, activation_fn=tf.nn.relu, + net = conv2d(net_transformed, 64, [1, 1], + scope='conv3', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + net = conv2d(net, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='conv4', bn_decay=self.bn_decay) + net = conv2d(net, 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='conv5', bn_decay=self.bn_decay) + + net = max_pool2d(net, [NUM_POINT, 1], + padding='VALID', scope='maxpool') + + features = tf.reshape(net, [BATCH_SIZE, -1]) + return features + + def create_decoder(self, features): + """fully connected layers for classification with dropout""" + + with tf.variable_scope('decoder_cls', reuse=tf.AUTO_REUSE): + + features = fully_connected(features, 512, bn=True, scope='fc1', is_training=self.is_training) + features = dropout(features, keep_prob=0.7, scope='dp1', is_training=self.is_training) + features = fully_connected(features, 256, bn=True, scope='fc2', is_training=self.is_training) + features = dropout(features, keep_prob=0.7, scope='dp2', is_training=self.is_training) + pred = fully_connected(features, NUM_CLASSES, activation_fn=None, scope='fc3', + is_training=self.is_training) + + return pred + + def create_loss(self, pred, label): + """ pred: B * NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + cls_loss = tf.reduce_mean(loss) + tf.summary.scalar('classification loss', cls_loss) + + return cls_loss + + +if __name__ == '__main__': + + batch_size, num_cls = BATCH_SIZE, NUM_CLASSES + lr_clip, base_lr, lr_decay_steps, lr_decay_rate = 1e-6, 1e-4, 50000, .7 + + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') + + inputs_pl = tf.placeholder(tf.float32, (1, None, 3), 'inputs') + npts_pl = tf.placeholder(tf.int32, (batch_size,), 'num_points') + labels_pl = tf.placeholder(tf.int32, (batch_size,), 'ground_truths') + learning_rate = tf.train.exponential_decay(base_lr, global_step, + lr_decay_steps, lr_decay_rate, + staircase=True, name='lr') + learning_rate = tf.maximum(learning_rate, lr_clip) + + # model_module = importlib.import_module('./pcn_cls', './') + model = Model(inputs_pl, npts_pl, labels_pl, is_training_pl) + trainer = tf.train.AdamOptimizer(learning_rate) + train_op = trainer.minimize(model.loss, global_step) + + print('\n\n\n==========') + print('pred', model.pred) + print('loss', model.loss) + # seems like different from the what the paper has claimed: + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init, {is_training_pl: True}) # restore will cover the random initialized parameters + + for idx, var in enumerate(tf.trainable_variables()): + print(idx, var) + diff --git a/zoo/OcCo/OcCo_TF/completion_models/__init__.py b/zoo/OcCo/OcCo_TF/completion_models/__init__.py new file mode 100644 index 0000000..c7c2541 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + diff --git a/zoo/OcCo/OcCo_TF/completion_models/dgcnn_cd.py b/zoo/OcCo/OcCo_TF/completion_models/dgcnn_cd.py new file mode 100644 index 0000000..4ebd3a4 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/dgcnn_cd.py @@ -0,0 +1,137 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +# author: Hanchen Wang + +import os, sys, tensorflow as tf +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append('../') +sys.path.append(os.path.join(BASE_DIR, '../utils')) +from utils import tf_util +from utils.transform_nets import input_transform_net_dgcnn +from train_completion import BATCH_SIZE, NUM_POINT + +# BATCH_SIZE = 8 # otherwise set to 8 +# NUM_POINT = 2048 # 3000 + + +class Model: + def __init__(self, inputs, npts, gt, alpha, **kwargs): + self.knn = 20 + self.__dict__.update(kwargs) # batch_decay and is_training + self.num_output_points = 16384 # 1024 * 16 + self.num_coarse = 1024 + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_fine = self.grid_size ** 2 * self.num_coarse + self.features = self.create_encoder(inputs, npts) + self.coarse, self.fine = self.create_decoder(self.features) + self.loss, self.update = self.create_loss(gt, alpha) + self.outputs = self.fine + self.visualize_ops = [tf.split(inputs[0], npts, axis=0), self.coarse, self.fine, gt] + self.visualize_titles = ['input', 'coarse output', 'fine output', 'ground truth'] + + def create_encoder(self, point_cloud, npts): + + point_cloud = tf.reshape(point_cloud, (BATCH_SIZE, NUM_POINT, 3)) + + adj_matrix = tf_util.pairwise_distance(point_cloud) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(point_cloud, nn_idx=nn_idx, k=self.knn) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net_dgcnn(edge_feature, self.is_training, self.bn_decay, K=3) + + point_cloud_transformed = tf.matmul(point_cloud, transform) + adj_matrix = tf_util.pairwise_distance(point_cloud_transformed) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(point_cloud_transformed, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn1', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net1 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn2', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net2 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn3', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net3 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn4', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net4 = net + + net = tf_util.conv2d(tf.concat([net1, net2, net3, net4], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='agg', bn_decay=self.bn_decay) + + net = tf.reduce_max(net, axis=1, keep_dims=True) + + features = tf.reshape(net, [BATCH_SIZE, -1]) + return features + + def create_decoder(self, features): + with tf.variable_scope('decoder', reuse=tf.AUTO_REUSE): + coarse = tf_util.mlp(features, [1024, 1024, self.num_coarse * 3]) + coarse = tf.reshape(coarse, [-1, self.num_coarse, 3]) + + with tf.variable_scope('folding', reuse=tf.AUTO_REUSE): + grid = tf.meshgrid(tf.linspace(-0.05, 0.05, self.grid_size), tf.linspace(-0.05, 0.05, self.grid_size)) + grid = tf.expand_dims(tf.reshape(tf.stack(grid, axis=2), [-1, 2]), 0) + grid_feat = tf.tile(grid, [features.shape[0], self.num_coarse, 1]) + + point_feat = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = tf.reshape(point_feat, [-1, self.num_fine, 3]) + + global_feat = tf.tile(tf.expand_dims(features, 1), [1, self.num_fine, 1]) + + feat = tf.concat([grid_feat, point_feat, global_feat], axis=2) + + center = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = tf.reshape(center, [-1, self.num_fine, 3]) + + fine = tf_util.mlp_conv(feat, [512, 512, 3]) + center + return coarse, fine + + def create_loss(self, gt, alpha): + + loss_coarse = tf_util.chamfer(self.coarse, gt) + tf_util.add_train_summary('train/coarse_loss', loss_coarse) + update_coarse = tf_util.add_valid_summary('valid/coarse_loss', loss_coarse) + + loss_fine = tf_util.chamfer(self.fine, gt) + tf_util.add_train_summary('train/fine_loss', loss_fine) + update_fine = tf_util.add_valid_summary('valid/fine_loss', loss_fine) + + loss = loss_coarse + alpha * loss_fine + tf_util.add_train_summary('train/loss', loss) + update_loss = tf_util.add_valid_summary('valid/loss', loss) + + return loss, [update_coarse, update_fine, update_loss] diff --git a/zoo/OcCo/OcCo_TF/completion_models/dgcnn_emd.py b/zoo/OcCo/OcCo_TF/completion_models/dgcnn_emd.py new file mode 100644 index 0000000..0fa1120 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/dgcnn_emd.py @@ -0,0 +1,138 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +# author: Hanchen Wang + +import os, sys, tensorflow as tf +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append('../') +sys.path.append(os.path.join(BASE_DIR, '../utils')) +from utils import tf_util +from utils.transform_nets import input_transform_net_dgcnn +from train_completion import BATCH_SIZE, NUM_POINT + +# BATCH_SIZE = 8 # otherwise set to 8 +# NUM_POINT = 2048 # 3000 + + +class Model: + def __init__(self, inputs, npts, gt, alpha, **kwargs): + self.knn = 20 + self.__dict__.update(kwargs) # batch_decay and is_training + self.num_output_points = 16384 # 1024 * 16 + self.num_coarse = 1024 + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_fine = self.grid_size ** 2 * self.num_coarse + self.features = self.create_encoder(inputs, npts) + self.coarse, self.fine = self.create_decoder(self.features) + self.loss, self.update = self.create_loss(gt, alpha) + self.outputs = self.fine + self.visualize_ops = [tf.split(inputs[0], npts, axis=0), self.coarse, self.fine, gt] + self.visualize_titles = ['input', 'coarse output', 'fine output', 'ground truth'] + + def create_encoder(self, point_cloud, npts): + + point_cloud = tf.reshape(point_cloud, (BATCH_SIZE, NUM_POINT, 3)) + + adj_matrix = tf_util.pairwise_distance(point_cloud) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(point_cloud, nn_idx=nn_idx, k=self.knn) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net_dgcnn(edge_feature, self.is_training, self.bn_decay, K=3) + + point_cloud_transformed = tf.matmul(point_cloud, transform) + adj_matrix = tf_util.pairwise_distance(point_cloud_transformed) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(point_cloud_transformed, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn1', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net1 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn2', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net2 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn3', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net3 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=self.knn) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=self.knn) + + net = tf_util.conv2d(edge_feature, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='dgcnn4', bn_decay=self.bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net4 = net + + net = tf_util.conv2d(tf.concat([net1, net2, net3, net4], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='agg', bn_decay=self.bn_decay) + + net = tf.reduce_max(net, axis=1, keep_dims=True) + + features = tf.reshape(net, [BATCH_SIZE, -1]) + return features + + def create_decoder(self, features): + with tf.variable_scope('decoder', reuse=tf.AUTO_REUSE): + coarse = tf_util.mlp(features, [1024, 1024, self.num_coarse * 3]) + coarse = tf.reshape(coarse, [-1, self.num_coarse, 3]) + + with tf.variable_scope('folding', reuse=tf.AUTO_REUSE): + grid = tf.meshgrid(tf.linspace(-0.05, 0.05, self.grid_size), tf.linspace(-0.05, 0.05, self.grid_size)) + grid = tf.expand_dims(tf.reshape(tf.stack(grid, axis=2), [-1, 2]), 0) + grid_feat = tf.tile(grid, [features.shape[0], self.num_coarse, 1]) + + point_feat = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = tf.reshape(point_feat, [-1, self.num_fine, 3]) + + global_feat = tf.tile(tf.expand_dims(features, 1), [1, self.num_fine, 1]) + + feat = tf.concat([grid_feat, point_feat, global_feat], axis=2) + + center = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = tf.reshape(center, [-1, self.num_fine, 3]) + + fine = tf_util.mlp_conv(feat, [512, 512, 3]) + center + return coarse, fine + + def create_loss(self, gt, alpha): + + gt_ds = gt[:, :self.coarse.shape[1], :] + loss_coarse = tf_util.earth_mover(self.coarse, gt_ds) + tf_util.add_train_summary('train/coarse_loss', loss_coarse) + update_coarse = tf_util.add_valid_summary('valid/coarse_loss', loss_coarse) + + loss_fine = tf_util.chamfer(self.fine, gt) + tf_util.add_train_summary('train/fine_loss', loss_fine) + update_fine = tf_util.add_valid_summary('valid/fine_loss', loss_fine) + + loss = loss_coarse + alpha * loss_fine + tf_util.add_train_summary('train/loss', loss) + update_loss = tf_util.add_valid_summary('valid/loss', loss) + + return loss, [update_coarse, update_fine, update_loss] diff --git a/zoo/OcCo/OcCo_TF/completion_models/pcn_cd.py b/zoo/OcCo/OcCo_TF/completion_models/pcn_cd.py new file mode 100644 index 0000000..9395e26 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/pcn_cd.py @@ -0,0 +1,74 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/models/pcn_cd.py + +import pdb, tensorflow as tf +from utils.tf_util import mlp, mlp_conv, point_maxpool, point_unpool, chamfer, \ + add_train_summary, add_valid_summary + + +class Model: + def __init__(self, inputs, npts, gt, alpha, **kwargs): + self.__dict__.update(kwargs) # batch_decay and is_training + self.num_coarse = 1024 + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_fine = self.grid_size ** 2 * self.num_coarse + self.features = self.create_encoder(inputs, npts) + self.coarse, self.fine = self.create_decoder(self.features) + self.loss, self.update = self.create_loss(self.coarse, self.fine, gt, alpha) + self.outputs = self.fine + self.visualize_ops = [tf.split(inputs[0], npts, axis=0), self.coarse, self.fine, gt] + self.visualize_titles = ['input', 'coarse output', 'fine output', 'ground truth'] + + def create_encoder(self, inputs, npts): + with tf.variable_scope('encoder_0', reuse=tf.AUTO_REUSE): + features = mlp_conv(inputs, [128, 256]) + features_global = point_unpool(point_maxpool(features, npts, keepdims=True), npts) + features = tf.concat([features, features_global], axis=2) + with tf.variable_scope('encoder_1', reuse=tf.AUTO_REUSE): + features = mlp_conv(features, [512, 1024]) + features = point_maxpool(features, npts) + return features + + def create_decoder(self, features): + with tf.variable_scope('decoder', reuse=tf.AUTO_REUSE): + coarse = mlp(features, [1024, 1024, self.num_coarse * 3]) + coarse = tf.reshape(coarse, [-1, self.num_coarse, 3]) + + with tf.variable_scope('folding', reuse=tf.AUTO_REUSE): + grid = tf.meshgrid(tf.linspace(-0.05, 0.05, self.grid_size), tf.linspace(-0.05, 0.05, self.grid_size)) + grid = tf.expand_dims(tf.reshape(tf.stack(grid, axis=2), [-1, 2]), 0) + grid_feat = tf.tile(grid, [features.shape[0], self.num_coarse, 1]) + + point_feat = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = tf.reshape(point_feat, [-1, self.num_fine, 3]) + + global_feat = tf.tile(tf.expand_dims(features, 1), [1, self.num_fine, 1]) + + feat = tf.concat([grid_feat, point_feat, global_feat], axis=2) + + center = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = tf.reshape(center, [-1, self.num_fine, 3]) + + fine = mlp_conv(feat, [512, 512, 3]) + center + return coarse, fine + + def create_loss(self, coarse, fine, gt, alpha): + + # print('coarse shape:', coarse.shape) + # print('fine shape:', fine.shape) + # print('gt shape:', gt.shape) + + loss_coarse = chamfer(coarse, gt) + add_train_summary('train/coarse_loss', loss_coarse) + update_coarse = add_valid_summary('valid/coarse_loss', loss_coarse) + + loss_fine = chamfer(fine, gt) + add_train_summary('train/fine_loss', loss_fine) + update_fine = add_valid_summary('valid/fine_loss', loss_fine) + + loss = loss_coarse + alpha * loss_fine + add_train_summary('train/loss', loss) + update_loss = add_valid_summary('valid/loss', loss) + + return loss, [update_coarse, update_fine, update_loss] diff --git a/zoo/OcCo/OcCo_TF/completion_models/pcn_emd.py b/zoo/OcCo/OcCo_TF/completion_models/pcn_emd.py new file mode 100644 index 0000000..a33677c --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/pcn_emd.py @@ -0,0 +1,74 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +# Author: Wentao Yuan (wyuan1@cs.cmu.edu) 05/31/2018 + +import tensorflow as tf +from utils.tf_util import mlp_conv, point_maxpool, point_unpool, mlp, add_train_summary, \ + add_valid_summary, earth_mover, chamfer + + +class Model: + def __init__(self, inputs, npts, gt, alpha, **kwargs): + self.num_coarse = 1024 + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_fine = self.grid_size ** 2 * self.num_coarse + self.features = self.create_encoder(inputs, npts) + self.coarse, self.fine = self.create_decoder(self.features) + self.loss, self.update = self.create_loss(self.coarse, self.fine, gt, alpha) + self.outputs = self.fine + self.visualize_ops = [tf.split(inputs[0], npts, axis=0), self.coarse, self.fine, gt] + self.visualize_titles = ['input', 'coarse output', 'fine output', 'ground truth'] + + def create_encoder(self, inputs, npts): + with tf.variable_scope('encoder_0', reuse=tf.AUTO_REUSE): + features = mlp_conv(inputs, [128, 256]) + features_global = point_unpool(point_maxpool(features, npts, keepdims=True), npts) + features = tf.concat([features, features_global], axis=2) + with tf.variable_scope('encoder_1', reuse=tf.AUTO_REUSE): + features = mlp_conv(features, [512, 1024]) + features = point_maxpool(features, npts) + return features + + def create_decoder(self, features): + with tf.variable_scope('decoder', reuse=tf.AUTO_REUSE): + coarse = mlp(features, [1024, 1024, self.num_coarse * 3]) + coarse = tf.reshape(coarse, [-1, self.num_coarse, 3]) + + with tf.variable_scope('folding', reuse=tf.AUTO_REUSE): + x = tf.linspace(-self.grid_scale, self.grid_scale, self.grid_size) + y = tf.linspace(-self.grid_scale, self.grid_scale, self.grid_size) + grid = tf.meshgrid(x, y) + grid = tf.expand_dims(tf.reshape(tf.stack(grid, axis=2), [-1, 2]), 0) + grid_feat = tf.tile(grid, [features.shape[0], self.num_coarse, 1]) + + point_feat = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = tf.reshape(point_feat, [-1, self.num_fine, 3]) + + global_feat = tf.tile(tf.expand_dims(features, 1), [1, self.num_fine, 1]) + + feat = tf.concat([grid_feat, point_feat, global_feat], axis=2) + + center = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = tf.reshape(center, [-1, self.num_fine, 3]) + + fine = mlp_conv(feat, [512, 512, 3]) + center + return coarse, fine + + def create_loss(self, coarse, fine, gt, alpha): + + gt_ds = gt[:, :coarse.shape[1], :] + + loss_coarse = earth_mover(coarse, gt_ds) + add_train_summary('train/coarse_loss', loss_coarse) + update_coarse = add_valid_summary('valid/coarse_loss', loss_coarse) + + loss_fine = chamfer(fine, gt) + add_train_summary('train/fine_loss', loss_fine) + update_fine = add_valid_summary('valid/fine_loss', loss_fine) + + loss = loss_coarse + alpha * loss_fine + add_train_summary('train/loss', loss) + update_loss = add_valid_summary('valid/loss', loss) + + return loss, [update_coarse, update_fine, update_loss] diff --git a/zoo/OcCo/OcCo_TF/completion_models/pointnet_cd.py b/zoo/OcCo/OcCo_TF/completion_models/pointnet_cd.py new file mode 100644 index 0000000..4ae37b0 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/pointnet_cd.py @@ -0,0 +1,120 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import os, sys, tensorflow as tf +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append('../') +from utils.tf_util import conv2d, mlp, mlp_conv, chamfer, add_valid_summary, add_train_summary, max_pool2d +from utils.transform_nets import input_transform_net, feature_transform_net +from train_completion import BATCH_SIZE, NUM_POINT + + +class Model: + def __init__(self, inputs, npts, gt, alpha, **kwargs): + self.__dict__.update(kwargs) # batch_decay and is_training + self.num_output_points = 16384 # 1024 * 16 + self.num_coarse = 1024 + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_fine = self.grid_size ** 2 * self.num_coarse + self.features = self.create_encoder(inputs, npts) + self.coarse, self.fine = self.create_decoder(self.features) + self.loss, self.update = self.create_loss(gt, alpha) + self.outputs = self.fine + self.visualize_ops = [tf.split(inputs[0], npts, axis=0), self.coarse, self.fine, gt] + self.visualize_titles = ['input', 'coarse output', 'fine output', 'ground truth'] + + def create_encoder(self, inputs, npts): + # with tf.variable_scope('encoder_0', reuse=tf.AUTO_REUSE): + # features = mlp_conv(inputs, [128, 256]) + # features_global = tf.reduce_max(features, axis=1, keep_dims=True, name='maxpool_0') + # features = tf.concat([features, tf.tile(features_global, [1, tf.shape(inputs)[1], 1])], axis=2) + # with tf.variable_scope('encoder_1', reuse=tf.AUTO_REUSE): + # features = mlp_conv(features, [512, 1024]) + # features = tf.reduce_max(features, axis=1, name='maxpool_1') + # end_points = {} + + # if DATASET =='modelnet40': + inputs = tf.reshape(inputs, (BATCH_SIZE, NUM_POINT, 3)) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(inputs, self.is_training, self.bn_decay, K=3) + + point_cloud_transformed = tf.matmul(inputs, transform) + input_image = tf.expand_dims(point_cloud_transformed, -1) + + net = conv2d(inputs=input_image, num_output_channels=64, kernel_size=[1, 3], + scope='conv1', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + net = conv2d(inputs=net, num_output_channels=64, kernel_size=[1, 1], + scope='conv2', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + + with tf.variable_scope('transform_net2') as sc: + transform = feature_transform_net(net, self.is_training, self.bn_decay, K=64) + # end_points['transform'] = transform + net_transformed = tf.matmul(tf.squeeze(net, axis=[2]), transform) + net_transformed = tf.expand_dims(net_transformed, [2]) + + '''conv2d, with kernel size of [1,1,1,1] and stride of [1,1,1,1], + basically equals with the MLPs''' + + # use_xavier=True, stddev=1e-3, weight_decay=0.0, activation_fn=tf.nn.relu, + net = conv2d(net_transformed, 64, [1, 1], + scope='conv3', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + net = conv2d(net, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='conv4', bn_decay=self.bn_decay) + net = conv2d(net, 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='conv5', bn_decay=self.bn_decay) + + net = max_pool2d(net, [NUM_POINT, 1], + padding='VALID', scope='maxpool') + + features = tf.reshape(net, [BATCH_SIZE, -1]) + return features + + def create_decoder(self, features): + with tf.variable_scope('decoder', reuse=tf.AUTO_REUSE): + coarse = mlp(features, [1024, 1024, self.num_coarse * 3]) + coarse = tf.reshape(coarse, [-1, self.num_coarse, 3]) + + with tf.variable_scope('folding', reuse=tf.AUTO_REUSE): + grid = tf.meshgrid(tf.linspace(-0.05, 0.05, self.grid_size), + tf.linspace(-0.05, 0.05, self.grid_size)) + grid = tf.expand_dims(tf.reshape(tf.stack(grid, axis=2), [-1, 2]), 0) + grid_feat = tf.tile(grid, [features.shape[0], self.num_coarse, 1]) + + point_feat = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = tf.reshape(point_feat, [-1, self.num_fine, 3]) + + global_feat = tf.tile(tf.expand_dims(features, 1), [1, self.num_fine, 1]) + + feat = tf.concat([grid_feat, point_feat, global_feat], axis=2) + + center = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = tf.reshape(center, [-1, self.num_fine, 3]) + + fine = mlp_conv(feat, [512, 512, 3]) + center + return coarse, fine + + def create_loss(self, gt, alpha): + + loss_coarse = chamfer(self.coarse, gt) + add_train_summary('train/coarse_loss', loss_coarse) + update_coarse = add_valid_summary('valid/coarse_loss', loss_coarse) + + loss_fine = chamfer(self.fine, gt) + add_train_summary('train/fine_loss', loss_fine) + update_fine = add_valid_summary('valid/fine_loss', loss_fine) + + loss = loss_coarse + alpha * loss_fine + add_train_summary('train/loss', loss) + update_loss = add_valid_summary('valid/loss', loss) + + return loss, [update_coarse, update_fine, update_loss] diff --git a/zoo/OcCo/OcCo_TF/completion_models/pointnet_emd.py b/zoo/OcCo/OcCo_TF/completion_models/pointnet_emd.py new file mode 100644 index 0000000..5ba9fd8 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/completion_models/pointnet_emd.py @@ -0,0 +1,122 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import os, sys, tensorflow as tf +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append('../') +from utils import tf_util +from utils.transform_nets import input_transform_net, feature_transform_net +from train_completion import BATCH_SIZE, NUM_POINT + +# BATCH_SIZE = 8 # otherwise set to 8 +# NUM_POINT = 2048 # 3000 + + +class Model: + def __init__(self, inputs, npts, gt, alpha, **kwargs): + self.__dict__.update(kwargs) # batch_decay and is_training + self.num_output_points = 16384 # 1024 * 16 + self.num_coarse = 1024 + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_fine = self.grid_size ** 2 * self.num_coarse + self.features = self.create_encoder(inputs, npts) + self.coarse, self.fine = self.create_decoder(self.features) + self.loss, self.update = self.create_loss(gt, alpha) + self.outputs = self.fine + self.visualize_ops = [tf.split(inputs[0], npts, axis=0), self.coarse, self.fine, gt] + self.visualize_titles = ['input', 'coarse output', 'fine output', 'ground truth'] + + def create_encoder(self, inputs, npts): + # with tf.variable_scope('encoder_0', reuse=tf.AUTO_REUSE): + # features = mlp_conv(inputs, [128, 256]) + # features_global = tf.reduce_max(features, axis=1, keep_dims=True, name='maxpool_0') + # features = tf.concat([features, tf.tile(features_global, [1, tf.shape(inputs)[1], 1])], axis=2) + # with tf.variable_scope('encoder_1', reuse=tf.AUTO_REUSE): + # features = mlp_conv(features, [512, 1024]) + # features = tf.reduce_max(features, axis=1, name='maxpool_1') + # end_points = {} + + inputs = tf.reshape(inputs, (BATCH_SIZE, NUM_POINT, 3)) + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(inputs, self.is_training, self.bn_decay, K=3) + + point_cloud_transformed = tf.matmul(inputs, transform) + input_image = tf.expand_dims(point_cloud_transformed, -1) + + net = tf_util.conv2d(inputs=input_image, num_output_channels=64, kernel_size=[1, 3], + scope='conv1', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + net = tf_util.conv2d(inputs=net, num_output_channels=64, kernel_size=[1, 1], + scope='conv2', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + + with tf.variable_scope('transform_net2') as sc: + transform = feature_transform_net(net, self.is_training, self.bn_decay, K=64) + # end_points['transform'] = transform + net_transformed = tf.matmul(tf.squeeze(net, axis=[2]), transform) + net_transformed = tf.expand_dims(net_transformed, [2]) + + '''conv2d, with kernel size of [1,1,1,1] and stride of [1,1,1,1], + basically equals with the MLPs''' + + # use_xavier=True, stddev=1e-3, weight_decay=0.0, activation_fn=tf.nn.relu, + net = tf_util.conv2d(net_transformed, 64, [1, 1], + scope='conv3', padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, bn_decay=self.bn_decay) + net = tf_util.conv2d(net, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='conv4', bn_decay=self.bn_decay) + net = tf_util.conv2d(net, 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=self.is_training, + scope='conv5', bn_decay=self.bn_decay) + + net = tf_util.max_pool2d(net, [NUM_POINT, 1], + padding='VALID', scope='maxpool') + + features = tf.reshape(net, [BATCH_SIZE, -1]) + return features + + def create_decoder(self, features): + with tf.variable_scope('decoder', reuse=tf.AUTO_REUSE): + coarse = tf_util.mlp(features, [1024, 1024, self.num_coarse * 3]) + coarse = tf.reshape(coarse, [-1, self.num_coarse, 3]) + + with tf.variable_scope('folding', reuse=tf.AUTO_REUSE): + grid = tf.meshgrid(tf.linspace(-0.05, 0.05, self.grid_size), tf.linspace(-0.05, 0.05, self.grid_size)) + grid = tf.expand_dims(tf.reshape(tf.stack(grid, axis=2), [-1, 2]), 0) + grid_feat = tf.tile(grid, [features.shape[0], self.num_coarse, 1]) + + point_feat = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = tf.reshape(point_feat, [-1, self.num_fine, 3]) + + global_feat = tf.tile(tf.expand_dims(features, 1), [1, self.num_fine, 1]) + + feat = tf.concat([grid_feat, point_feat, global_feat], axis=2) + + center = tf.tile(tf.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = tf.reshape(center, [-1, self.num_fine, 3]) + + fine = tf_util.mlp_conv(feat, [512, 512, 3]) + center + return coarse, fine + + def create_loss(self, gt, alpha): + + gt_ds = gt[:, :self.coarse.shape[1], :] + loss_coarse = tf_util.earth_mover(self.coarse, gt_ds) + # loss_coarse = earth_mover(coarse, gt_ds) + tf_util.add_train_summary('train/coarse_loss', loss_coarse) + update_coarse = tf_util.add_valid_summary('valid/coarse_loss', loss_coarse) + + loss_fine = tf_util.chamfer(self.fine, gt) + tf_util.add_train_summary('train/fine_loss', loss_fine) + update_fine = tf_util.add_valid_summary('valid/fine_loss', loss_fine) + + loss = loss_coarse + alpha * loss_fine + tf_util.add_train_summary('train/loss', loss) + update_loss = tf_util.add_valid_summary('valid/loss', loss) + + return loss, [update_coarse, update_fine, update_loss] diff --git a/zoo/OcCo/OcCo_TF/docker/.dockerignore b/zoo/OcCo/OcCo_TF/docker/.dockerignore new file mode 100644 index 0000000..b8bc3db --- /dev/null +++ b/zoo/OcCo/OcCo_TF/docker/.dockerignore @@ -0,0 +1,2 @@ +../data/ +../log/ diff --git a/zoo/OcCo/OcCo_TF/docker/Dockerfile_TF b/zoo/OcCo/OcCo_TF/docker/Dockerfile_TF new file mode 100644 index 0000000..05315fc --- /dev/null +++ b/zoo/OcCo/OcCo_TF/docker/Dockerfile_TF @@ -0,0 +1,47 @@ +FROM tensorflow/tensorflow:1.12.0-gpu-py3 + +WORKDIR /workspace/OcCo_TF +RUN mkdir /home/hcw +RUN chmod -R 777 /home/hcw +RUN chmod 777 /usr/bin +RUN chmod 777 /bin +RUN chmod 777 /usr/local/ +RUN apt-get -y update +RUN apt-get -y install vim screen libgl1-mesa-glx +COPY ./Requirements_TF.txt /workspace/OcCo_TF +RUN pip install -r ../Requirements_TF.txt +COPY ./pc_distance /workspace/OcCo_TF/pc_distance +# RUN apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub +# RUN apt-get install wget +# RUN wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb +# RUN yes|apt -y install ./cuda-repo-ubuntu1604_9.1.85-1_amd64.deb +# RUN wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb +# RUN apt -y install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb + +# RUN apt-get update +# Install the NVIDIA driver +# Issue with driver install requires creating /usr/lib/nvidia +# RUN mkdir /usr/lib/nvidia +# RUN apt-get -y -o Dpkg::Options::="--force-overwrite" install --no-install-recommends nvidia-410 +# Reboot. Check that GPUs are visible using the command: nvidia-smi + +# Install CUDA and tools. Include optional NCCL 2.x +# RUN apt install -y --allow-downgrades cuda9.0 cuda-cublas-9-0 cuda-cufft-9-0 cuda-curand-9-0 \ +# cuda-cusolver-9-0 cuda-cusparse-9-0 libcudnn7=7.2.1.38-1+cuda9.0 \ +# libnccl2=2.2.13-1+cuda9.0 cuda-command-line-tools-9-0 + +# Optional: Install the TensorRT runtime (must be after CUDA install) +# RUN apt update +# RUN apt -y install libnvinfer4=4.1.2-1+cuda9.0 +WORKDIR /workspace/OcCo_TF/pc_distance +RUN make +RUN chmod -R 777 /workspace/OcCo_TF/pc_distance +# RUN ln -s /usr/local/cuda/lib64/libcudart.so.10.0 /usr/local/cuda/lib64/libcudart.so.9.0 +RUN ln -s /usr/local/lib/python3.5/dist-packages/tensorflow/libtensorflow_framework.so /usr/local/lib/python3.5/dist-packages/tensorflow/libtensorflow_framework.so.1 +RUN mkdir -p /usr/local/nvidia/lib +RUN cp /usr/local/lib/python3.5/dist-packages/tensorflow/libtensorflow_framework.so /usr/local/nvidia/lib/libtensorflow_framework.so.1 + + +RUN useradd hcw +USER hcw +WORKDIR /workspace/OcCo_TF diff --git a/zoo/OcCo/OcCo_TF/pc_distance/__init__.py b/zoo/OcCo/OcCo_TF/pc_distance/__init__.py new file mode 100644 index 0000000..480cecf --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/__init__.py @@ -0,0 +1 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk diff --git a/zoo/OcCo/OcCo_TF/pc_distance/makefile b/zoo/OcCo/OcCo_TF/pc_distance/makefile new file mode 100644 index 0000000..84a997b --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/makefile @@ -0,0 +1,26 @@ +cuda_inc = /usr/local/cuda-9.0/include/ +cuda_lib = /usr/local/cuda-9.0/lib64/ +nvcc = /usr/local/cuda-9.0/bin/nvcc +tf_inc = /usr/local/lib/python3.5/dist-packages/tensorflow/include +tf_lib = /usr/local/lib/python3.5/dist-packages/tensorflow + +all: tf_nndistance_so.so tf_approxmatch_so.so + +tf_nndistance.cu.o: tf_nndistance.cu + $(nvcc) tf_nndistance.cu -o tf_nndistance.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +tf_nndistance_so.so: tf_nndistance.cpp tf_nndistance.cu.o + g++ tf_nndistance.cpp tf_nndistance.cu.o -o tf_nndistance_so.so \ + -I $(cuda_inc) -I $(tf_inc) -L $(cuda_lib) -lcudart -L $(tf_lib) -ltensorflow_framework \ + -shared -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++11 -fPIC -O2 + +tf_approxmatch.cu.o: tf_approxmatch.cu + $(nvcc) tf_approxmatch.cu -o tf_approxmatch.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +tf_approxmatch_so.so: tf_approxmatch.cpp tf_approxmatch.cu.o + g++ -shared $(CPPFLAGS) tf_approxmatch.cpp tf_approxmatch.cu.o -o tf_approxmatch_so.so \ + -I $(cuda_inc) -I $(tf_inc) -L $(cuda_lib) -lcudart -L $(tf_lib) -ltensorflow_framework \ + -shared -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++11 -fPIC -O2 + +clean: + rm -rf *.o *.so diff --git a/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.cpp b/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.cpp new file mode 100644 index 0000000..e12ffa9 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.cpp @@ -0,0 +1,329 @@ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include +#include +#include +using namespace tensorflow; +REGISTER_OP("ApproxMatch") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("match: float32"); +REGISTER_OP("MatchCost") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Input("match: float32") + .Output("cost: float32"); +REGISTER_OP("MatchCostGrad") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Input("match: float32") + .Output("grad1: float32") + .Output("grad2: float32"); + +void approxmatch_cpu(int b,int n,int m,const float * xyz1,const float * xyz2,float * match){ + for (int i=0;i saturatedl(n,double(factorl)),saturatedr(m,double(factorr)); + std::vector weight(n*m); + for (int j=0;j=-2;j--){ + //printf("i=%d j=%d\n",i,j); + double level=-powf(4.0,j); + if (j==-2) + level=0; + for (int k=0;k ss(m,1e-9); + for (int k=0;k ss2(m,0); + for (int k=0;kinput(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("ApproxMatch expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + //OP_REQUIRES(context,n<=4096,errors::InvalidArgument("ApproxMatch handles at most 4096 dataset points")); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ApproxMatch expects (batch_size,num_points,3) xyz2 shape, and batch_size must match")); + int m=xyz2_tensor.shape().dim_size(1); + //OP_REQUIRES(context,m<=1024,errors::InvalidArgument("ApproxMatch handles at most 1024 query points")); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + Tensor * match_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,n},&match_tensor)); + auto match_flat=match_tensor->flat(); + float * match=&(match_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,(n+m)*2},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + approxmatchLauncher(b,n,m,xyz1,xyz2,match,temp); + } +}; +REGISTER_KERNEL_BUILDER(Name("ApproxMatch").Device(DEVICE_GPU), ApproxMatchGpuOp); +class ApproxMatchOp: public OpKernel{ + public: + explicit ApproxMatchOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("ApproxMatch expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + //OP_REQUIRES(context,n<=4096,errors::InvalidArgument("ApproxMatch handles at most 4096 dataset points")); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ApproxMatch expects (batch_size,num_points,3) xyz2 shape, and batch_size must match")); + int m=xyz2_tensor.shape().dim_size(1); + //OP_REQUIRES(context,m<=1024,errors::InvalidArgument("ApproxMatch handles at most 1024 query points")); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + Tensor * match_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,n},&match_tensor)); + auto match_flat=match_tensor->flat(); + float * match=&(match_flat(0)); + approxmatch_cpu(b,n,m,xyz1,xyz2,match); + } +}; +REGISTER_KERNEL_BUILDER(Name("ApproxMatch").Device(DEVICE_CPU), ApproxMatchOp); +class MatchCostGpuOp: public OpKernel{ + public: + explicit MatchCostGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("MatchCost expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("MatchCost expects (batch_size,num_points,3) xyz2 shape, and batch_size must match")); + int m=xyz2_tensor.shape().dim_size(1); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + + const Tensor& match_tensor=context->input(2); + OP_REQUIRES(context,match_tensor.dims()==3 && match_tensor.shape().dim_size(0)==b && match_tensor.shape().dim_size(1)==m && match_tensor.shape().dim_size(2)==n,errors::InvalidArgument("MatchCost expects (batch_size,#query,#dataset) match shape")); + auto match_flat=match_tensor.flat(); + const float * match=&(match_flat(0)); + + Tensor * cost_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b},&cost_tensor)); + auto cost_flat=cost_tensor->flat(); + float * cost=&(cost_flat(0)); + matchcostLauncher(b,n,m,xyz1,xyz2,match,cost); + } +}; +REGISTER_KERNEL_BUILDER(Name("MatchCost").Device(DEVICE_GPU), MatchCostGpuOp); +class MatchCostOp: public OpKernel{ + public: + explicit MatchCostOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("MatchCost expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("MatchCost expects (batch_size,num_points,3) xyz2 shape, and batch_size must match")); + int m=xyz2_tensor.shape().dim_size(1); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + + const Tensor& match_tensor=context->input(2); + OP_REQUIRES(context,match_tensor.dims()==3 && match_tensor.shape().dim_size(0)==b && match_tensor.shape().dim_size(1)==m && match_tensor.shape().dim_size(2)==n,errors::InvalidArgument("MatchCost expects (batch_size,#query,#dataset) match shape")); + auto match_flat=match_tensor.flat(); + const float * match=&(match_flat(0)); + + Tensor * cost_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b},&cost_tensor)); + auto cost_flat=cost_tensor->flat(); + float * cost=&(cost_flat(0)); + matchcost_cpu(b,n,m,xyz1,xyz2,match,cost); + } +}; +REGISTER_KERNEL_BUILDER(Name("MatchCost").Device(DEVICE_CPU), MatchCostOp); + +class MatchCostGradGpuOp: public OpKernel{ + public: + explicit MatchCostGradGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("MatchCostGrad expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("MatchCostGrad expects (batch_size,num_points,3) xyz2 shape, and batch_size must match")); + int m=xyz2_tensor.shape().dim_size(1); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + + const Tensor& match_tensor=context->input(2); + OP_REQUIRES(context,match_tensor.dims()==3 && match_tensor.shape().dim_size(0)==b && match_tensor.shape().dim_size(1)==m && match_tensor.shape().dim_size(2)==n,errors::InvalidArgument("MatchCost expects (batch_size,#query,#dataset) match shape")); + auto match_flat=match_tensor.flat(); + const float * match=&(match_flat(0)); + + Tensor * grad1_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&grad1_tensor)); + auto grad1_flat=grad1_tensor->flat(); + float * grad1=&(grad1_flat(0)); + Tensor * grad2_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,m,3},&grad2_tensor)); + auto grad2_flat=grad2_tensor->flat(); + float * grad2=&(grad2_flat(0)); + matchcostgradLauncher(b,n,m,xyz1,xyz2,match,grad1,grad2); + } +}; +REGISTER_KERNEL_BUILDER(Name("MatchCostGrad").Device(DEVICE_GPU), MatchCostGradGpuOp); +class MatchCostGradOp: public OpKernel{ + public: + explicit MatchCostGradOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("MatchCost expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("MatchCost expects (batch_size,num_points,3) xyz2 shape, and batch_size must match")); + int m=xyz2_tensor.shape().dim_size(1); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + + const Tensor& match_tensor=context->input(2); + OP_REQUIRES(context,match_tensor.dims()==3 && match_tensor.shape().dim_size(0)==b && match_tensor.shape().dim_size(1)==m && match_tensor.shape().dim_size(2)==n,errors::InvalidArgument("MatchCost expects (batch_size,#query,#dataset) match shape")); + auto match_flat=match_tensor.flat(); + const float * match=&(match_flat(0)); + + Tensor * grad1_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&grad1_tensor)); + auto grad1_flat=grad1_tensor->flat(); + float * grad1=&(grad1_flat(0)); + Tensor * grad2_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,m,3},&grad2_tensor)); + auto grad2_flat=grad2_tensor->flat(); + float * grad2=&(grad2_flat(0)); + matchcostgrad_cpu(b,n,m,xyz1,xyz2,match,grad1,grad2); + } +}; +REGISTER_KERNEL_BUILDER(Name("MatchCostGrad").Device(DEVICE_CPU), MatchCostGradOp); diff --git a/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.cu b/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.cu new file mode 100644 index 0000000..33c8e26 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.cu @@ -0,0 +1,296 @@ +__global__ void approxmatch(int b,int n,int m,const float * __restrict__ xyz1,const float * __restrict__ xyz2,float * __restrict__ match,float * temp){ + float * remainL=temp+blockIdx.x*(n+m)*2, * remainR=temp+blockIdx.x*(n+m)*2+n,*ratioL=temp+blockIdx.x*(n+m)*2+n+m,*ratioR=temp+blockIdx.x*(n+m)*2+n+m+n; + float multiL,multiR; + if (n>=m){ + multiL=1; + multiR=n/m; + }else{ + multiL=m/n; + multiR=1; + } + const int Block=1024; + __shared__ float buf[Block*4]; + for (int i=blockIdx.x;i=-2;j--){ + float level=-powf(4.0f,j); + if (j==-2){ + level=0; + } + for (int k0=0;k0>>(b,n,m,xyz1,xyz2,match,temp); +} +__global__ void matchcost(int b,int n,int m,const float * __restrict__ xyz1,const float * __restrict__ xyz2,const float * __restrict__ match,float * __restrict__ out){ + __shared__ float allsum[512]; + const int Block=1024; + __shared__ float buf[Block*3]; + for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,out); +} +__global__ void matchcostgrad2(int b,int n,int m,const float * __restrict__ xyz1,const float * __restrict__ xyz2,const float * __restrict__ match,float * __restrict__ grad2){ + __shared__ float sum_grad[256*3]; + for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,grad1); + matchcostgrad2<<>>(b,n,m,xyz1,xyz2,match,grad2); +} + diff --git a/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.py b/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.py new file mode 100644 index 0000000..5ef4180 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/tf_approxmatch.py @@ -0,0 +1,122 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import tensorflow as tf +from tensorflow.python.framework import ops # it turns out work +import os.path as osp + +base_dir = osp.dirname(osp.abspath(__file__)) +approxmatch_module = tf.load_op_library(osp.join(base_dir, 'tf_approxmatch_so.so')) + + +def approx_match(xyz1, xyz2): + """ + :param xyz1: batch_size * #dataset_points * 3 + :param xyz2: batch_size * #query_points * 3 + :return: + match : batch_size * #query_points * #dataset_points + """ + + return approxmatch_module.approx_match(xyz1, xyz2) + + +ops.NoGradient('ApproxMatch') +# @tf.RegisterShape('ApproxMatch') +@ops.RegisterShape('ApproxMatch') +def _approx_match_shape(op): + shape1 = op.inputs[0].get_shape().with_rank(3) + shape2 = op.inputs[1].get_shape().with_rank(3) + return [tf.TensorShape([shape1.dims[0], shape2.dims[1], shape1.dims[1]])] + + +def match_cost(xyz1, xyz2, match): + """ + :param xyz1: batch_size * #dataset_points * 3 + :param xyz2: batch_size * #query_points * 3 + :param match: batch_size * #query_points * #dataset_points + :return: cost : batch_size, + """ + return approxmatch_module.match_cost(xyz1, xyz2, match) + + +# @tf.RegisterShape('MatchCost') +@ops.RegisterShape('MatchCost') +def _match_cost_shape(op): + shape1 = op.inputs[0].get_shape().with_rank(3) + # shape2 = op.inputs[1].get_shape().with_rank(3) + # shape3 = op.inputs[2].get_shape().with_rank(3) + return [tf.TensorShape([shape1.dims[0]])] + + +@tf.RegisterGradient('MatchCost') +def _match_cost_grad(op,grad_cost): + xyz1 = op.inputs[0] + xyz2 = op.inputs[1] + match = op.inputs[2] + grad_1, grad_2 = approxmatch_module.match_cost_grad(xyz1, xyz2, match) + return [grad_1 * tf.expand_dims(tf.expand_dims(grad_cost, 1), 2), + grad_2 * tf.expand_dims(tf.expand_dims(grad_cost, 1), 2), None] + + +if __name__ == '__main__': + alpha = 0.5 + beta = 2.0 + # import bestmatch + import numpy as np + # import math + import random + import cv2 + + # import tf_nndistance + + npoint = 100 + + with tf.device('/gpu:2'): + pt_in = tf.placeholder(tf.float32, shape=(1, npoint * 4, 3)) + mypoints = tf.Variable(np.random.randn(1, npoint, 3).astype('float32')) + match = approx_match(pt_in, mypoints) + loss = tf.reduce_sum(match_cost(pt_in, mypoints, match)) + # match=approx_match(mypoints,pt_in) + # loss=tf.reduce_sum(match_cost(mypoints,pt_in,match)) + # distf,_,distb,_=tf_nndistance.nn_distance(pt_in,mypoints) + # loss=tf.reduce_sum((distf+1e-9)**0.5)*0.5+tf.reduce_sum((distb+1e-9)**0.5)*0.5 + # loss=tf.reduce_max((distf+1e-9)**0.5)*0.5*npoint+tf.reduce_max((distb+1e-9)**0.5)*0.5*npoint + + optimizer = tf.train.GradientDescentOptimizer(1e-4).minimize(loss) + with tf.Session('') as sess: + # sess.run(tf.initialize_all_variables()) + sess.run(tf.global_variables_initializer()) + while True: + meanloss = 0 + meantrueloss = 0 + for i in range(1001): + # phi=np.random.rand(4*npoint)*math.pi*2 + # tpoints=(np.hstack([np.cos(phi)[:,None],np.sin(phi)[:,None],(phi*0)[:,None]])*random.random())[None,:,:] + # tpoints=((np.random.rand(400)-0.5)[:,None]*[0,2,0]+[(random.random()-0.5)*2,0,0]).astype('float32')[None,:,:] + tpoints = np.hstack([np.linspace(-1, 1, 400)[:, None], + (random.random() * 2 * np.linspace(1,0,400)**2)[:, None], + np.zeros((400,1))])[None, :, :] + trainloss, _ = sess.run([loss, optimizer], feed_dict={pt_in: tpoints.astype('float32')}) + trainloss, trainmatch = sess.run([loss, match], feed_dict={pt_in: tpoints.astype('float32')}) + # trainmatch=trainmatch.transpose((0,2,1)) + print('trainloss: %f'%trainloss) + show = np.zeros((400,400,3), dtype='uint8')^255 + trainmypoints = sess.run(mypoints) + ''' === visualisation === + for i in range(len(tpoints[0])): + u = np.random.choice(range(len(trainmypoints[0])), p=trainmatch[0].T[i]) + cv2.line(show, + (int(tpoints[0][i,1]*100+200),int(tpoints[0][i,0]*100+200)), + (int(trainmypoints[0][u,1]*100+200),int(trainmypoints[0][u,0]*100+200)), + cv2.cv.CV_RGB(0,255,0)) + for x, y, z in tpoints[0]: + cv2.circle(show, (int(y*100+200), int(x*100+200)), 2, cv2.cv.CV_RGB(255, 0, 0)) + for x, y, z in trainmypoints[0]: + cv2.circle(show, (int(y*100+200),int(x*100+200)), 3, cv2.cv.CV_RGB(0, 0, 255)) + ''' + cost = ((tpoints[0][:, None, :] - np.repeat(trainmypoints[0][None, :, :], 4, axis=1))**2).sum(axis=2)**0.5 + # trueloss=bestmatch.bestmatch(cost)[0] + print(trainloss) # true loss + # cv2.imshow('show', show) + cmd = cv2.waitKey(10) % 256 + if cmd == ord('q'): + break diff --git a/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.cpp b/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.cpp new file mode 100644 index 0000000..46b0c60 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.cpp @@ -0,0 +1,254 @@ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +REGISTER_OP("NnDistance") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("dist1: float32") + .Output("idx1: int32") + .Output("dist2: float32") + .Output("idx2: int32"); +REGISTER_OP("NnDistanceGrad") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Input("grad_dist1: float32") + .Input("idx1: int32") + .Input("grad_dist2: float32") + .Input("idx2: int32") + .Output("grad_xyz1: float32") + .Output("grad_xyz2: float32"); +using namespace tensorflow; + +static void nnsearch(int b,int n,int m,const float * xyz1,const float * xyz2,float * dist,int * idx){ + for (int i=0;iinput(0); + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz1_tensor.dims()==3,errors::InvalidArgument("NnDistance requires xyz1 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistance only accepts 3d point set xyz1")); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3,errors::InvalidArgument("NnDistance requires xyz2 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistance only accepts 3d point set xyz2")); + int m=xyz2_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("NnDistance expects xyz1 and xyz2 have same batch size")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&xyz1_flat(0); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&xyz2_flat(0); + Tensor * dist1_tensor=NULL; + Tensor * idx1_tensor=NULL; + Tensor * dist2_tensor=NULL; + Tensor * idx2_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n},&dist1_tensor)); + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,n},&idx1_tensor)); + auto dist1_flat=dist1_tensor->flat(); + auto idx1_flat=idx1_tensor->flat(); + OP_REQUIRES_OK(context,context->allocate_output(2,TensorShape{b,m},&dist2_tensor)); + OP_REQUIRES_OK(context,context->allocate_output(3,TensorShape{b,m},&idx2_tensor)); + auto dist2_flat=dist2_tensor->flat(); + auto idx2_flat=idx2_tensor->flat(); + float * dist1=&(dist1_flat(0)); + int * idx1=&(idx1_flat(0)); + float * dist2=&(dist2_flat(0)); + int * idx2=&(idx2_flat(0)); + nnsearch(b,n,m,xyz1,xyz2,dist1,idx1); + nnsearch(b,m,n,xyz2,xyz1,dist2,idx2); + } +}; +REGISTER_KERNEL_BUILDER(Name("NnDistance").Device(DEVICE_CPU), NnDistanceOp); +class NnDistanceGradOp : public OpKernel{ + public: + explicit NnDistanceGradOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + const Tensor& xyz2_tensor=context->input(1); + const Tensor& grad_dist1_tensor=context->input(2); + const Tensor& idx1_tensor=context->input(3); + const Tensor& grad_dist2_tensor=context->input(4); + const Tensor& idx2_tensor=context->input(5); + OP_REQUIRES(context,xyz1_tensor.dims()==3,errors::InvalidArgument("NnDistanceGrad requires xyz1 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistanceGrad only accepts 3d point set xyz1")); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3,errors::InvalidArgument("NnDistanceGrad requires xyz2 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistanceGrad only accepts 3d point set xyz2")); + int m=xyz2_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("NnDistanceGrad expects xyz1 and xyz2 have same batch size")); + OP_REQUIRES(context,grad_dist1_tensor.shape()==(TensorShape{b,n}),errors::InvalidArgument("NnDistanceGrad requires grad_dist1 be of shape(batch,#points)")); + OP_REQUIRES(context,idx1_tensor.shape()==(TensorShape{b,n}),errors::InvalidArgument("NnDistanceGrad requires idx1 be of shape(batch,#points)")); + OP_REQUIRES(context,grad_dist2_tensor.shape()==(TensorShape{b,m}),errors::InvalidArgument("NnDistanceGrad requires grad_dist2 be of shape(batch,#points)")); + OP_REQUIRES(context,idx2_tensor.shape()==(TensorShape{b,m}),errors::InvalidArgument("NnDistanceGrad requires idx2 be of shape(batch,#points)")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&xyz1_flat(0); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&xyz2_flat(0); + auto idx1_flat=idx1_tensor.flat(); + const int * idx1=&idx1_flat(0); + auto idx2_flat=idx2_tensor.flat(); + const int * idx2=&idx2_flat(0); + auto grad_dist1_flat=grad_dist1_tensor.flat(); + const float * grad_dist1=&grad_dist1_flat(0); + auto grad_dist2_flat=grad_dist2_tensor.flat(); + const float * grad_dist2=&grad_dist2_flat(0); + Tensor * grad_xyz1_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&grad_xyz1_tensor)); + Tensor * grad_xyz2_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,m,3},&grad_xyz2_tensor)); + auto grad_xyz1_flat=grad_xyz1_tensor->flat(); + float * grad_xyz1=&grad_xyz1_flat(0); + auto grad_xyz2_flat=grad_xyz2_tensor->flat(); + float * grad_xyz2=&grad_xyz2_flat(0); + for (int i=0;iinput(0); + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz1_tensor.dims()==3,errors::InvalidArgument("NnDistance requires xyz1 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistance only accepts 3d point set xyz1")); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3,errors::InvalidArgument("NnDistance requires xyz2 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistance only accepts 3d point set xyz2")); + int m=xyz2_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("NnDistance expects xyz1 and xyz2 have same batch size")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&xyz1_flat(0); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&xyz2_flat(0); + Tensor * dist1_tensor=NULL; + Tensor * idx1_tensor=NULL; + Tensor * dist2_tensor=NULL; + Tensor * idx2_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n},&dist1_tensor)); + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,n},&idx1_tensor)); + auto dist1_flat=dist1_tensor->flat(); + auto idx1_flat=idx1_tensor->flat(); + OP_REQUIRES_OK(context,context->allocate_output(2,TensorShape{b,m},&dist2_tensor)); + OP_REQUIRES_OK(context,context->allocate_output(3,TensorShape{b,m},&idx2_tensor)); + auto dist2_flat=dist2_tensor->flat(); + auto idx2_flat=idx2_tensor->flat(); + float * dist1=&(dist1_flat(0)); + int * idx1=&(idx1_flat(0)); + float * dist2=&(dist2_flat(0)); + int * idx2=&(idx2_flat(0)); + NmDistanceKernelLauncher(b,n,xyz1,m,xyz2,dist1,idx1,dist2,idx2); + } +}; +REGISTER_KERNEL_BUILDER(Name("NnDistance").Device(DEVICE_GPU), NnDistanceGpuOp); + +void NmDistanceGradKernelLauncher(int b,int n,const float * xyz1,int m,const float * xyz2,const float * grad_dist1,const int * idx1,const float * grad_dist2,const int * idx2,float * grad_xyz1,float * grad_xyz2); +class NnDistanceGradGpuOp : public OpKernel{ + public: + explicit NnDistanceGradGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + const Tensor& xyz2_tensor=context->input(1); + const Tensor& grad_dist1_tensor=context->input(2); + const Tensor& idx1_tensor=context->input(3); + const Tensor& grad_dist2_tensor=context->input(4); + const Tensor& idx2_tensor=context->input(5); + OP_REQUIRES(context,xyz1_tensor.dims()==3,errors::InvalidArgument("NnDistanceGrad requires xyz1 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistanceGrad only accepts 3d point set xyz1")); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3,errors::InvalidArgument("NnDistanceGrad requires xyz2 be of shape (batch,#points,3)")); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(2)==3,errors::InvalidArgument("NnDistanceGrad only accepts 3d point set xyz2")); + int m=xyz2_tensor.shape().dim_size(1); + OP_REQUIRES(context,xyz2_tensor.shape().dim_size(0)==b,errors::InvalidArgument("NnDistanceGrad expects xyz1 and xyz2 have same batch size")); + OP_REQUIRES(context,grad_dist1_tensor.shape()==(TensorShape{b,n}),errors::InvalidArgument("NnDistanceGrad requires grad_dist1 be of shape(batch,#points)")); + OP_REQUIRES(context,idx1_tensor.shape()==(TensorShape{b,n}),errors::InvalidArgument("NnDistanceGrad requires idx1 be of shape(batch,#points)")); + OP_REQUIRES(context,grad_dist2_tensor.shape()==(TensorShape{b,m}),errors::InvalidArgument("NnDistanceGrad requires grad_dist2 be of shape(batch,#points)")); + OP_REQUIRES(context,idx2_tensor.shape()==(TensorShape{b,m}),errors::InvalidArgument("NnDistanceGrad requires idx2 be of shape(batch,#points)")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&xyz1_flat(0); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&xyz2_flat(0); + auto idx1_flat=idx1_tensor.flat(); + const int * idx1=&idx1_flat(0); + auto idx2_flat=idx2_tensor.flat(); + const int * idx2=&idx2_flat(0); + auto grad_dist1_flat=grad_dist1_tensor.flat(); + const float * grad_dist1=&grad_dist1_flat(0); + auto grad_dist2_flat=grad_dist2_tensor.flat(); + const float * grad_dist2=&grad_dist2_flat(0); + Tensor * grad_xyz1_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&grad_xyz1_tensor)); + Tensor * grad_xyz2_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,m,3},&grad_xyz2_tensor)); + auto grad_xyz1_flat=grad_xyz1_tensor->flat(); + float * grad_xyz1=&grad_xyz1_flat(0); + auto grad_xyz2_flat=grad_xyz2_tensor->flat(); + float * grad_xyz2=&grad_xyz2_flat(0); + NmDistanceGradKernelLauncher(b,n,xyz1,m,xyz2,grad_dist1,idx1,grad_dist2,idx2,grad_xyz1,grad_xyz2); + } +}; +REGISTER_KERNEL_BUILDER(Name("NnDistanceGrad").Device(DEVICE_GPU), NnDistanceGradGpuOp); diff --git a/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.cu b/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.cu new file mode 100644 index 0000000..b755122 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.cu @@ -0,0 +1,159 @@ +#if GOOGLE_CUDA +#define EIGEN_USE_GPU +// #include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor" + +__global__ void NmDistanceKernel(int b,int n,const float * xyz,int m,const float * xyz2,float * result,int * result_i){ + const int batch=512; + __shared__ float buf[batch*3]; + for (int i=blockIdx.x;ibest){ + result[(i*n+j)]=best; + result_i[(i*n+j)]=best_i; + } + } + __syncthreads(); + } + } +} +void NmDistanceKernelLauncher(int b,int n,const float * xyz,int m,const float * xyz2,float * result,int * result_i,float * result2,int * result2_i){ + NmDistanceKernel<<>>(b,n,xyz,m,xyz2,result,result_i); + NmDistanceKernel<<>>(b,m,xyz2,n,xyz,result2,result2_i); +} +__global__ void NmDistanceGradKernel(int b,int n,const float * xyz1,int m,const float * xyz2,const float * grad_dist1,const int * idx1,float * grad_xyz1,float * grad_xyz2){ + for (int i=blockIdx.x;i>>(b,n,xyz1,m,xyz2,grad_dist1,idx1,grad_xyz1,grad_xyz2); + NmDistanceGradKernel<<>>(b,m,xyz2,n,xyz1,grad_dist2,idx2,grad_xyz2,grad_xyz1); +} + +#endif diff --git a/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.py b/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.py new file mode 100644 index 0000000..7e858ca --- /dev/null +++ b/zoo/OcCo/OcCo_TF/pc_distance/tf_nndistance.py @@ -0,0 +1,55 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +"""Scripts for Chamfer Distance""" +import os, tensorflow as tf +from tensorflow.python.framework import ops +os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib/python3.5/dist-packages/tensorflow/" +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +nn_distance_module = tf.load_op_library(os.path.join(BASE_DIR, 'tf_nndistance_so.so')) + + +def nn_distance(xyz1, xyz2): + """ + Computes the distance of nearest neighbors for a pair of point clouds + input: xyz1: (batch_size,#points_1,3) the first point cloud + input: xyz2: (batch_size,#points_2,3) the second point cloud + output: dist1: (batch_size,#point_1) distance from first to second + output: idx1: (batch_size,#point_1) nearest neighbor from first to second + output: dist2: (batch_size,#point_2) distance from second to first + output: idx2: (batch_size,#point_2) nearest neighbor from second to first + """ + return nn_distance_module.nn_distance(xyz1, xyz2) + + +@ops.RegisterGradient('NnDistance') +def _nn_distance_grad(op, grad_dist1, grad_idx1, grad_dist2, grad_idx2): + xyz1 = op.inputs[0] + xyz2 = op.inputs[1] + idx1 = op.outputs[1] + idx2 = op.outputs[3] + return nn_distance_module.nn_distance_grad(xyz1, xyz2, grad_dist1, idx1, grad_dist2, idx2) + + +if __name__ == '__main__': + import random, numpy as np + random.seed(100) + np.random.seed(100) + + ''' === test code ===''' + with tf.Session('') as sess: + xyz1 = np.random.randn(32, 16384, 3).astype('float32') + xyz2 = np.random.randn(32, 1024, 3).astype('float32') + # with tf.device('/gpu:0'): + if True: + inp1 = tf.Variable(xyz1) + inp2 = tf.constant(xyz2) + reta, retb, retc, retd = nn_distance(inp1, inp2) + loss = tf.reduce_mean(reta) + tf.reduce_mean(retc) + train = tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss) + sess.run(tf.initialize_all_variables()) + + best = 1e100 + for i in range(1): + # loss, _ = sess.run([loss, train]) + loss, _ = sess.run([loss]) + best = min(best, loss) + print(i, loss, best) diff --git a/zoo/OcCo/OcCo_TF/readme.md b/zoo/OcCo/OcCo_TF/readme.md new file mode 100644 index 0000000..1f4039b --- /dev/null +++ b/zoo/OcCo/OcCo_TF/readme.md @@ -0,0 +1,4 @@ +## OcCo in TensorFlow + + + diff --git a/zoo/OcCo/OcCo_TF/train_cls.py b/zoo/OcCo/OcCo_TF/train_cls.py new file mode 100644 index 0000000..4cab66a --- /dev/null +++ b/zoo/OcCo/OcCo_TF/train_cls.py @@ -0,0 +1,292 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, sys, pdb, time, argparse, datetime, importlib, numpy as np, tensorflow as tf +from termcolor import colored +from utils.Dataset_Assign import Dataset_Assign +from utils.EarlyStoppingCriterion import EarlyStoppingCriterion +from utils.tf_util import add_train_summary, get_bn_decay, get_learning_rate +from utils.io_util import shuffle_data, loadh5DataFile +from utils.pc_util import rotate_point_cloud, jitter_point_cloud, random_point_dropout, \ + random_scale_point_cloud, random_shift_point_cloud + +# from utils.transfer_pretrained_w import load_pretrained_var + +parser = argparse.ArgumentParser() + +''' === Basic Learning Settings === ''' +parser.add_argument('--gpu', type=int, default=1) +parser.add_argument('--log_dir', default='log/log_cls/pointnet_cls') +parser.add_argument('--model', default='pointnet_cls') +parser.add_argument('--epoch', type=int, default=200) +parser.add_argument('--restore', action='store_true') +parser.add_argument('--restore_path', default='log/pointnet_cls') +parser.add_argument('--batch_size', type=int, default=32) +parser.add_argument('--num_point', type=int, default=1024) +parser.add_argument('--base_lr', type=float, default=0.001) +parser.add_argument('--lr_clip', type=float, default=1e-5) +parser.add_argument('--decay_steps', type=int, default=20) +parser.add_argument('--decay_rate', type=float, default=0.7) +# parser.add_argument('--verbose', type=bool, default=True) +parser.add_argument('--dataset', type=str, default='modelnet40') +parser.add_argument('--partial', action='store_true') +parser.add_argument('--filename', type=str, default='') +parser.add_argument('--data_bn', action='store_true') + +''' === Data Augmentation Settings === ''' +parser.add_argument('--data_aug', action='store_true') +parser.add_argument('--just_save', action='store_true') # pretrained encoder restoration +parser.add_argument('--patience', type=int, default=200) # early stopping, set it as 200 for deprecation +parser.add_argument('--fewshot', action='store_true') + +args = parser.parse_args() + +NUM_CLASSES, NUM_TRAINOBJECTS, TRAIN_FILES, VALID_FILES = Dataset_Assign( + dataset=args.dataset, fname=args.filename, partial=args.partial, bn=args.data_bn, few_shot=args.fewshot) + +BATCH_SIZE = args.batch_size +NUM_POINT = args.num_point +BASE_LR = args.base_lr +LR_CLIP = args.lr_clip +DECAY_RATE = args.decay_rate +# DECAY_STEP = args.decay_steps +DECAY_STEP = NUM_TRAINOBJECTS//BATCH_SIZE * args.decay_steps +BN_INIT_DECAY = 0.5 +BN_DECAY_RATE = 0.5 +BN_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 +LOG_DIR = args.log_dir +BEST_EVAL_ACC = 0 +os.system('mkdir -p %s' % LOG_DIR) if not os.path.exists(LOG_DIR) else None +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'a+') + +def log_string(out_str): + LOG_FOUT.write(out_str + '\n') + LOG_FOUT.flush() + print(out_str) + + +def train(args): + + log_string('\n\n' + '=' * 44) + log_string('Start Training, Time: %s' % datetime.datetime.now()) + log_string('=' * 44 + '\n\n') + + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') # will be used in defining train_op + inputs_pl = tf.placeholder(tf.float32, (1, None, 3), 'inputs') + labels_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'labels') + npts_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'num_points') + + bn_decay = get_bn_decay(global_step, BN_INIT_DECAY, BATCH_SIZE, BN_DECAY_STEP, BN_DECAY_RATE, BN_DECAY_CLIP) + + # model_module = importlib.import_module('.%s' % args.model, 'cls_models') + # MODEL = model_module.Model(inputs_pl, npts_pl, labels_pl, is_training_pl, bn_decay=bn_decay) + ''' === To fix issues when running on woma === ''' + ldic = locals() + exec('from cls_models.%s import Model' % args.model, globals(), ldic) + MODEL = ldic['Model'](inputs_pl, npts_pl, labels_pl, is_training_pl, bn_decay=bn_decay) + pred, loss = MODEL.pred, MODEL.loss + tf.summary.scalar('loss', loss) + + # useful information in displaying during training + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + learning_rate = get_learning_rate(global_step, BASE_LR, BATCH_SIZE, DECAY_STEP, DECAY_RATE, LR_CLIP) + add_train_summary('learning_rate', learning_rate) + trainer = tf.train.AdamOptimizer(learning_rate) + train_op = trainer.minimize(MODEL.loss, global_step) + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + # config.log_device_placement = True + sess = tf.Session(config=config) + + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + val_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'val')) + + # Init variables + init = tf.global_variables_initializer() + log_string('\nModel Parameters has been Initialized\n') + sess.run(init, {is_training_pl: True}) # restore will cover the random initialized parameters + + # to save the randomized variables + if not args.restore and args.just_save: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + print(colored('random initialised model saved at %s' % save_path, 'white', 'on_blue')) + print(colored('just save the model, now exit', 'white', 'on_red')) + sys.exit() + + '''current solution: first load pretrained head, assemble with output layers then save as a checkpoint''' + # to partially load the saved head from: + # if args.load_pretrained_head: + # sess.close() + # load_pretrained_head(args.pretrained_head_path, os.path.join(LOG_DIR, 'model.ckpt'), None, args.verbose) + # print('shared varibles have been restored from ', args.pretrained_head_path) + # + # sess = tf.Session(config=config) + # log_string('\nModel Parameters has been Initialized\n') + # sess.run(init, {is_training_pl: True}) + # saver.restore(sess, tf.train.latest_checkpoint(LOG_DIR)) + # log_string('\nModel Parameters have been restored with pretrained weights from %s' % args.pretrained_head_path) + + if args.restore: + # load_pretrained_var(args.restore_path, os.path.join(LOG_DIR, "model.ckpt"), args.verbose) + saver.restore(sess, tf.train.latest_checkpoint(args.restore_path)) + log_string('\n') + log_string(colored('Model Parameters have been restored from %s' % args.restore_path, 'white', 'on_red')) + + for arg in sorted(vars(args)): + print(arg + ': ' + str(getattr(args, arg)) + '\n') # log of arguments + os.system('cp cls_models/%s.py %s' % (args.model, LOG_DIR)) # bkp of model def + os.system('cp train_cls.py %s' % LOG_DIR) # bkp of train procedure + + train_start = time.time() + + ops = {'pointclouds_pl': inputs_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'npts_pl': npts_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': global_step} + + ESC = EarlyStoppingCriterion(patience=args.patience) + + for epoch in range(args.epoch): + log_string('\n\n') + log_string(colored('**** EPOCH %03d ****' % epoch, 'grey', 'on_green')) + sys.stdout.flush() + + '''=== training the model ===''' + train_one_epoch(sess, ops, train_writer) + + '''=== evaluating the model ===''' + eval_mean_loss, eval_acc, eval_cls_acc = eval_one_epoch(sess, ops, val_writer) + + '''=== check whether to early stop ===''' + early_stop, save_checkpoint = ESC.step(eval_acc, epoch=epoch) + if save_checkpoint: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string(colored('model saved at %s' % save_path, 'white', 'on_blue')) + if early_stop: + break + + log_string('total time: %s' % datetime.timedelta(seconds=time.time() - train_start)) + log_string('stop epoch: %d, best eval acc: %f' % (ESC.best_epoch, ESC.best_dev_score)) + sess.close() + + +def train_one_epoch(sess, ops, train_writer): + is_training = True + + total_correct, total_seen, loss_sum = 0, 0, 0 + train_file_idxs = np.arange(0, len(TRAIN_FILES)) + np.random.shuffle(train_file_idxs) + + for fn in range(len(TRAIN_FILES)): + current_data, current_label = loadh5DataFile(TRAIN_FILES[train_file_idxs[fn]]) + current_data = current_data[:, :NUM_POINT, :] + current_data, current_label, _ = shuffle_data(current_data, np.squeeze(current_label)) + current_label = np.squeeze(current_label) + + file_size = current_data.shape[0] + num_batches = file_size // BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + feed_data = current_data[start_idx:end_idx, :, :] + + if args.data_aug: + feed_data = random_point_dropout(feed_data) + feed_data[:, :, 0:3] = random_scale_point_cloud(feed_data[:, :, 0:3]) + feed_data[:, :, 0:3] = random_shift_point_cloud(feed_data[:, :, 0:3]) + + feed_dict = { + ops['pointclouds_pl']: feed_data.reshape([1, BATCH_SIZE * NUM_POINT, 3]), + ops['labels_pl']: current_label[start_idx:end_idx].reshape(BATCH_SIZE, ), + ops['npts_pl']: [NUM_POINT] * BATCH_SIZE, + ops['is_training_pl']: is_training} + + summary, step, _, loss_val, pred_val = sess.run([ + ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx].reshape(BATCH_SIZE, )) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('\n=== training ===') + log_string('total correct: %d, total_seen: %d' % (total_correct, total_seen)) + # log_string('mean batch loss: %f' % (loss_sum / num_batches)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, val_writer): + is_training = False + + total_correct, total_seen, loss_sum = 0, 0, 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + for fn in VALID_FILES: + current_data, current_label = loadh5DataFile(fn) + current_data = current_data[:, :NUM_POINT, :] + file_size = current_data.shape[0] + num_batches = file_size // BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx, end_idx = batch_idx * BATCH_SIZE, (batch_idx + 1) * BATCH_SIZE + + feed_dict = { + ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :].reshape([1, BATCH_SIZE * NUM_POINT, 3]), + ops['labels_pl']: current_label[start_idx:end_idx].reshape(BATCH_SIZE, ), + ops['npts_pl']: np.array([NUM_POINT] * BATCH_SIZE), + ops['is_training_pl']: is_training} + + summary, step, loss_val, pred_val = sess.run( + [ops['merged'], ops['step'], ops['loss'], ops['pred']], feed_dict=feed_dict) + val_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx].reshape(BATCH_SIZE, )) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val * BATCH_SIZE) + + for i in range(start_idx, end_idx): + l = int(current_label.reshape(-1)[i]) + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i - start_idx] == l) + + eval_mean_loss = loss_sum / float(total_seen) + eval_acc = total_correct / float(total_seen) + eval_cls_acc = np.mean(np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + log_string('\n=== evaluating ===') + log_string('total correct: %d, total_seen: %d' % (total_correct, total_seen)) + log_string('eval mean loss: %f' % eval_mean_loss) + log_string('eval accuracy: %f' % eval_acc) + log_string('eval avg class acc: %f' % eval_cls_acc) + + global BEST_EVAL_ACC + if eval_acc > BEST_EVAL_ACC: + BEST_EVAL_ACC = eval_acc + log_string('best eval accuracy: %f' % BEST_EVAL_ACC) + return eval_mean_loss, eval_acc, eval_cls_acc + + +if __name__ == '__main__': + print('Now Using GPU:%d to train the model' % args.gpu) + os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' + os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) + + train(args) + LOG_FOUT.close() diff --git a/zoo/OcCo/OcCo_TF/train_cls_dgcnn_torchloader.py b/zoo/OcCo/OcCo_TF/train_cls_dgcnn_torchloader.py new file mode 100644 index 0000000..d282c2c --- /dev/null +++ b/zoo/OcCo/OcCo_TF/train_cls_dgcnn_torchloader.py @@ -0,0 +1,236 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com +# Ref: https://github.com/hansen7/NRS_3D/blob/master/train_dgcnn_cls.py +import os, sys, pdb, shutil, argparse, numpy as np, tensorflow as tf +from tqdm import tqdm +from termcolor import colored +from utils.Train_Logger import TrainLogger +from utils.Dataset_Assign import Dataset_Assign +# from utils.tf_util import get_bn_decay, get_lr_dgcnn +# from utils.io_util import shuffle_data, loadh5DataFile +# from utils.transfer_pretrained_w import load_pretrained_var +from utils.pc_util import random_point_dropout, random_scale_point_cloud, random_shift_point_cloud +from utils.ModelNetDataLoader import General_CLSDataLoader_HDF5 +from torch.utils.data import DataLoader + +def parse_args(): + parser = argparse.ArgumentParser(description='DGCNN Point Cloud Recognition Training Configuration') + + parser.add_argument('--gpu', type=str, default='0') + parser.add_argument('--log_dir', default='occo_dgcnn_cls') + parser.add_argument('--model', default='dgcnn_cls') + parser.add_argument('--epoch', type=int, default=250) + parser.add_argument('--restore', action='store_true') + parser.add_argument('--restore_path', type=str, default='') + parser.add_argument('--batch_size', type=int, default=24) + parser.add_argument('--num_points', type=int, default=1024) + parser.add_argument('--base_lr', type=float, default=0.001) + # parser.add_argument('--decay_steps', type=int, default=20) + # parser.add_argument('--decay_rate', type=float, default=0.7) + parser.add_argument('--momentum', type=float, default=0.9) + + parser.add_argument('--dataset', type=str, default='modelnet40') + parser.add_argument('--filename', type=str, default='') + parser.add_argument('--data_bn', action='store_true') + parser.add_argument('--partial', action='store_true') + parser.add_argument('--data_aug', action='store_true') + parser.add_argument('--just_save', action='store_true') # use only in the pretrained encoder restoration + parser.add_argument('--fewshot', action='store_true') + + return parser.parse_args() + + +args = parse_args() + +DATA_PATH = 'data/modelnet40_normal_resampled/' +NUM_CLASSES, NUM_TRAINOBJECTS, TRAIN_FILES, VALID_FILES = Dataset_Assign( + dataset=args.dataset, fname=args.filename, partial=args.partial, bn=args.data_bn, few_shot=args.fewshot) +BATCH_SIZE, NUM_POINT = args.batch_size, args.num_points +# DECAY_STEP = NUM_TRAINOBJECTS//BATCH_SIZE * args.decay_steps + +TRAIN_DATASET = General_CLSDataLoader_HDF5(file_list=TRAIN_FILES, num_point=1024) +TEST_DATASET = General_CLSDataLoader_HDF5(file_list=VALID_FILES, num_point=1024) +trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=BATCH_SIZE, shuffle=True, num_workers=4, drop_last=True) +testDataLoader = DataLoader(TEST_DATASET, batch_size=BATCH_SIZE, shuffle=False, num_workers=4, drop_last=True) +# reduce the num_workers if the loaded data are huge, ref: https://github.com/pytorch/pytorch/issues/973 + +def main(args): + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='log_cls') + shutil.copy(os.path.join('cls_models', '%s.py' % args.model), MyLogger.log_dir) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + + # is_training_pl -> to decide whether to apply batch normalisation + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') + + inputs_pl = tf.placeholder(tf.float32, (1, None, 3), 'inputs') + labels_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'labels') + npts_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'num_points') + + # bn_decay = get_bn_decay(batch=global_step, bn_init_decay=0.5, batch_size=args.batch_size, + # bn_decay_step=DECAY_STEP, bn_decay_rate=0.5, bn_decay_clip=0.99) + + bn_decay = 0.9 + # See "BatchNorm1d" in https://pytorch.org/docs/stable/nn.html + ''' === fix issues of importlib when running on some servers (i.e., woma) === ''' + # model_module = importlib.import_module('.%s' % args.model_type, 'cls_models') + # MODEL = model_module.Model(inputs_pl, npts_pl, labels_pl, is_training_pl, bn_decay=bn_decay) + ldic = locals() + exec('from cls_models.%s import Model' % args.model, globals(), ldic) + MODEL = ldic['Model'](inputs_pl, npts_pl, labels_pl, is_training_pl, bn_decay=bn_decay) + pred, loss = MODEL.pred, MODEL.loss + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(args.batch_size) + tf.summary.scalar('accuracy', accuracy) + + ''' === Learning Rate === ''' + def get_lr_dgcnn(args, global_step, alpha): + learning_rate = tf.train.cosine_decay( + learning_rate=100 * args.base_lr, # Base Learning Rate, 0.1 + global_step=global_step, # Training Step Index + decay_steps=NUM_TRAINOBJECTS//BATCH_SIZE * args.epoch, # Total Training Step + alpha=alpha # Fraction of the Minimum Value of the Set lr + ) + # learning_rate = tf.maximum(learning_rate, args.base_lr) + return learning_rate + + learning_rate = get_lr_dgcnn(args, global_step, alpha=0.01) + tf.summary.scalar('learning rate', learning_rate) + # scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, args.epoch, eta_min=args.lr) + # doc: https://pytorch.org/docs/stable/optim.html + # doc: https://www.tensorflow.org/api_docs/python/tf/compat/v1/train/cosine_decay + + ''' === Optimiser === ''' + # trainer = tf.train.GradientDescentOptimizer(learning_rate) + trainer = tf.train.MomentumOptimizer(learning_rate, momentum=args.momentum) + # equivalent to torch.optim.SGD + # doc: https://www.tensorflow.org/api_docs/python/tf/compat/v1/train/MomentumOptimizer + # another alternative is to use keras + # trainer = tf.keras.optimizers.SGD(learning_rate, momentum=args.momentum) + # doc: https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/keras/optimizers/SGD + # opt = torch.optim.SGD(model.parameters(), lr=args.lr * 100, momentum=args.momentum, weight_decay=1e-4) + + train_op = trainer.minimize(loss=MODEL.loss, global_step=global_step) + saver = tf.train.Saver() + + # ref: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/config.proto + config = tf.ConfigProto() + # config.gpu_options.allow_growth = True + # config.allow_soft_placement = True # Uncomment it if GPU option is not available + # config.log_device_placement = True # Uncomment it if you want device placements to be logged + sess = tf.Session(config=config) + + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(MyLogger.experiment_dir, 'runs', 'train'), sess.graph) + val_writer = tf.summary.FileWriter(os.path.join(MyLogger.experiment_dir, 'runs', 'valid'), sess.graph) + + # Initialise all the variables of the models + init = tf.global_variables_initializer() + + sess.run(init, {is_training_pl: True}) + + # to save the randomized initialised models then exit + if args.just_save: + save_path = saver.save(sess, os.path.join(MyLogger.checkpoints_dir, "model.ckpt")) + print(colored('random initialised model saved at %s' % save_path, 'white', 'on_blue')) + print(colored('just save the model, now exit', 'white', 'on_red')) + sys.exit() + + '''current solution: first load pretrained encoder, + assemble with randomly initialised FC layers then save to the checkpoint''' + + if args.restore: + saver.restore(sess, tf.train.latest_checkpoint(args.restore_path)) + MyLogger.logger.info('Model Parameters has been Restored') + + ops = {'pointclouds_pl': inputs_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'npts_pl': npts_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': global_step} + + for epoch in range(args.epoch): + + '''=== training the model ===''' + train_one_epoch(sess, ops, MyLogger, train_writer) + + '''=== evaluating the model ===''' + save_checkpoint = eval_one_epoch(sess, ops, MyLogger, val_writer) + + '''=== check whether to store the checkpoints ===''' + if save_checkpoint: + save_path = saver.save(sess, os.path.join(MyLogger.savepath, "model.ckpt")) + MyLogger.logger.info('model saved at %s' % MyLogger.savepath) + + sess.close() + MyLogger.train_summary() + + +def train_one_epoch(sess, ops, MyLogger, train_writer): + is_training = True + MyLogger.epoch_init(training=is_training) + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + # pdb.set_trace() + points, target = points.numpy(), target.numpy() + + if args.data_aug: + points = random_point_dropout(points) + points[:, :, 0:3] = random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, 0:3] = random_shift_point_cloud(points[:, :, 0:3]) + + feed_dict = { + ops['pointclouds_pl']: points.reshape([1, BATCH_SIZE * NUM_POINT, 3]), + ops['labels_pl']: target.reshape(BATCH_SIZE, ), + ops['npts_pl']: [NUM_POINT] * BATCH_SIZE, + ops['is_training_pl']: is_training} + + summary, step, _, loss, pred = sess.run([ + ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + + # pdb.set_trace() + MyLogger.step_update(np.argmax(pred, 1), target.reshape(BATCH_SIZE, ), loss) + + MyLogger.epoch_summary(writer=None, training=is_training) + + return None + + +def eval_one_epoch(sess, ops, MyLogger, val_writer): + is_training = False + MyLogger.epoch_init(training=is_training) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + # pdb.set_trace() + points, target = points.numpy(), target.numpy() + + feed_dict = { + ops['pointclouds_pl']: points.reshape([1, BATCH_SIZE * NUM_POINT, 3]), + ops['labels_pl']: target.reshape(BATCH_SIZE, ), + ops['npts_pl']: np.array([NUM_POINT] * BATCH_SIZE), + ops['is_training_pl']: is_training} + + summary, step, loss_val, pred_val = sess.run( + [ops['merged'], ops['step'], ops['loss'], ops['pred']], feed_dict=feed_dict) + val_writer.add_summary(summary, step) + # pdb.set_trace() + MyLogger.step_update(np.argmax(pred_val, 1), target.reshape(BATCH_SIZE, ), loss_val) + + MyLogger.epoch_summary(writer=None, training=is_training) + + return MyLogger.save_model + + +if __name__ == '__main__': + + print('Now Using GPU:%s to train the model' % args.gpu) + os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' + os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu + + main(args) diff --git a/zoo/OcCo/OcCo_TF/train_cls_torchloader.py b/zoo/OcCo/OcCo_TF/train_cls_torchloader.py new file mode 100644 index 0000000..73a99a2 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/train_cls_torchloader.py @@ -0,0 +1,351 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import os, sys, pdb, time, argparse, datetime, importlib, numpy as np, tensorflow as tf +from tqdm import tqdm +from termcolor import colored +from utils.Dataset_Assign import Dataset_Assign +from utils.io_util import shuffle_data, loadh5DataFile +from utils.EarlyStoppingCriterion import EarlyStoppingCriterion +from utils.tf_util import add_train_summary, get_bn_decay, get_learning_rate +from utils.pc_util import rotate_point_cloud, jitter_point_cloud, random_point_dropout, \ + random_scale_point_cloud, random_shift_point_cloud + +# from utils.transfer_pretrained_w import load_pretrained_var +from utils.ModelNetDataLoader import General_CLSDataLoader_HDF5 +from torch.utils.data import DataLoader + +parser = argparse.ArgumentParser() + +''' === Basic Learning Settings === ''' +parser.add_argument('--gpu', type=int, default=1) +parser.add_argument('--log_dir', default='log/log_cls/pointnet_cls') +parser.add_argument('--model', default='pointnet_cls') +parser.add_argument('--epoch', type=int, default=200) +parser.add_argument('--restore', action='store_true') +parser.add_argument('--restore_path', default='log/pointnet_cls') +parser.add_argument('--batch_size', type=int, default=32) +parser.add_argument('--num_point', type=int, default=1024) +parser.add_argument('--base_lr', type=float, default=0.001) +parser.add_argument('--lr_clip', type=float, default=1e-5) +parser.add_argument('--decay_steps', type=int, default=20) +parser.add_argument('--decay_rate', type=float, default=0.7) +# parser.add_argument('--verbose', type=bool, default=True) +parser.add_argument('--dataset', type=str, default='modelnet40') +parser.add_argument('--partial', action='store_true') +parser.add_argument('--filename', type=str, default='') +parser.add_argument('--data_bn', action='store_true') + +''' === Data Augmentation Settings === ''' +parser.add_argument('--data_aug', action='store_true') +parser.add_argument('--just_save', action='store_true') # pretrained encoder restoration +parser.add_argument('--patience', type=int, default=200) # early stopping, set it as 200 for deprecation +parser.add_argument('--fewshot', action='store_true') + +args = parser.parse_args() + +DATA_PATH = 'data/modelnet40_normal_resampled/' +NUM_CLASSES, NUM_TRAINOBJECTS, TRAIN_FILES, VALID_FILES = Dataset_Assign( + dataset=args.dataset, fname=args.filename, partial=args.partial, bn=args.data_bn, few_shot=args.fewshot) +TRAIN_DATASET = General_CLSDataLoader_HDF5(root=DATA_PATH, file_list=TRAIN_FILES, num_point=1024) +TEST_DATASET = General_CLSDataLoader_HDF5(root=DATA_PATH, file_list=VALID_FILES, num_point=1024) +trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4, drop_last=True) +testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4, drop_last=True) + +BATCH_SIZE = args.batch_size +NUM_POINT = args.num_point +BASE_LR = args.base_lr +LR_CLIP = args.lr_clip +DECAY_RATE = args.decay_rate +# DECAY_STEP = args.decay_steps +DECAY_STEP = NUM_TRAINOBJECTS//BATCH_SIZE * args.decay_steps +BN_INIT_DECAY = 0.5 +BN_DECAY_RATE = 0.5 +BN_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 +LOG_DIR = args.log_dir +BEST_EVAL_ACC = 0 +os.system('mkdir -p %s' % LOG_DIR) if not os.path.exists(LOG_DIR) else None +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'a+') + +def log_string(out_str): + LOG_FOUT.write(out_str + '\n') + LOG_FOUT.flush() + print(out_str) + + +def train(args): + + log_string('\n\n' + '=' * 50) + log_string('Start Training, Time: %s' % datetime.datetime.now()) + log_string('=' * 50 + '\n\n') + + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') # will be used in defining train_op + inputs_pl = tf.placeholder(tf.float32, (1, None, 3), 'inputs') + labels_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'labels') + npts_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'num_points') + + bn_decay = get_bn_decay(global_step, BN_INIT_DECAY, BATCH_SIZE, BN_DECAY_STEP, BN_DECAY_RATE, BN_DECAY_CLIP) + + # model_module = importlib.import_module('.%s' % args.model, 'cls_models') + # MODEL = model_module.Model(inputs_pl, npts_pl, labels_pl, is_training_pl, bn_decay=bn_decay) + ''' === To fix issues when running on woma === ''' + ldic = locals() + exec('from cls_models.%s import Model' % args.model, globals(), ldic) + MODEL = ldic['Model'](inputs_pl, npts_pl, labels_pl, is_training_pl, bn_decay=bn_decay) + pred, loss = MODEL.pred, MODEL.loss + tf.summary.scalar('loss', loss) + # pdb.set_trace() + + # useful information in displaying during training + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + learning_rate = get_learning_rate(global_step, BASE_LR, BATCH_SIZE, DECAY_STEP, DECAY_RATE, LR_CLIP) + add_train_summary('learning_rate', learning_rate) + trainer = tf.train.AdamOptimizer(learning_rate) + train_op = trainer.minimize(MODEL.loss, global_step) + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + # config.log_device_placement = True + sess = tf.Session(config=config) + + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + val_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'val')) + + # Init variables + init = tf.global_variables_initializer() + log_string('\nModel Parameters has been Initialized\n') + sess.run(init, {is_training_pl: True}) # restore will cover the random initialized parameters + + # to save the randomized variables + if not args.restore and args.just_save: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + print(colored('random initialised model saved at %s' % save_path, 'white', 'on_blue')) + print(colored('just save the model, now exit', 'white', 'on_red')) + sys.exit() + + '''current solution: first load pretrained head, assemble with output layers then save as a checkpoint''' + # to partially load the saved head from: + # if args.load_pretrained_head: + # sess.close() + # load_pretrained_head(args.pretrained_head_path, os.path.join(LOG_DIR, 'model.ckpt'), None, args.verbose) + # print('shared varibles have been restored from ', args.pretrained_head_path) + # + # sess = tf.Session(config=config) + # log_string('\nModel Parameters has been Initialized\n') + # sess.run(init, {is_training_pl: True}) + # saver.restore(sess, tf.train.latest_checkpoint(LOG_DIR)) + # log_string('\nModel Parameters have been restored with pretrained weights from %s' % args.pretrained_head_path) + + if args.restore: + # load_pretrained_var(args.restore_path, os.path.join(LOG_DIR, "model.ckpt"), args.verbose) + saver.restore(sess, tf.train.latest_checkpoint(args.restore_path)) + log_string('\n') + log_string(colored('Model Parameters have been restored from %s' % args.restore_path, 'white', 'on_red')) + + for arg in sorted(vars(args)): + print(arg + ': ' + str(getattr(args, arg)) + '\n') # log of arguments + os.system('cp cls_models/%s.py %s' % (args.model, LOG_DIR)) # bkp of model def + os.system('cp train_cls.py %s' % LOG_DIR) # bkp of train procedure + + train_start = time.time() + + ops = {'pointclouds_pl': inputs_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'npts_pl': npts_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': global_step} + + ESC = EarlyStoppingCriterion(patience=args.patience) + + for epoch in range(args.epoch): + log_string('\n\n') + log_string(colored('**** EPOCH %03d ****' % epoch, 'grey', 'on_green')) + sys.stdout.flush() + + '''=== training the model ===''' + train_one_epoch(sess, ops, train_writer) + + '''=== evaluating the model ===''' + eval_mean_loss, eval_acc, eval_cls_acc = eval_one_epoch(sess, ops, val_writer) + + '''=== check whether to early stop ===''' + early_stop, save_checkpoint = ESC.step(eval_acc, epoch=epoch) + if save_checkpoint: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string(colored('model saved at %s' % save_path, 'white', 'on_blue')) + if early_stop: + break + + log_string('total time: %s' % datetime.timedelta(seconds=time.time() - train_start)) + log_string('stop epoch: %d, best eval acc: %f' % (ESC.best_epoch + 1, ESC.best_dev_score)) + sess.close() + + +def train_one_epoch(sess, ops, train_writer): + is_training = True + total_correct, total_seen, loss_sum = 0, 0, 0 + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + # pdb.set_trace() + points, target = points.numpy(), target.numpy() + + if args.data_aug: + points = random_point_dropout(points) + points[:, :, 0:3] = random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, 0:3] = random_shift_point_cloud(points[:, :, 0:3]) + + feed_dict = { + ops['pointclouds_pl']: points.reshape([1, BATCH_SIZE * NUM_POINT, 3]), + ops['labels_pl']: target.reshape(BATCH_SIZE, ), + ops['npts_pl']: [NUM_POINT] * BATCH_SIZE, + ops['is_training_pl']: is_training} + + summary, step, _, loss_val, pred_val = sess.run([ + ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == target.reshape(BATCH_SIZE, )) + total_correct += correct + total_seen += BATCH_SIZE + # loss_sum += loss_val + + # train_file_idxs = np.arange(0, len(TRAIN_FILES)) + # np.random.shuffle(train_file_idxs) + # + # for fn in range(len(TRAIN_FILES)): + # current_data, current_label = loadh5DataFile(TRAIN_FILES[train_file_idxs[fn]]) + # current_data = current_data[:, :NUM_POINT, :] + # current_data, current_label, _ = shuffle_data(current_data, np.squeeze(current_label)) + # current_label = np.squeeze(current_label) + # + # file_size = current_data.shape[0] + # num_batches = file_size // BATCH_SIZE + # + # for batch_idx in range(num_batches): + # start_idx = batch_idx * BATCH_SIZE + # end_idx = (batch_idx + 1) * BATCH_SIZE + # feed_data = current_data[start_idx:end_idx, :, :] + # + # if args.data_aug: + # feed_data = random_point_dropout(feed_data) + # feed_data[:, :, 0:3] = random_scale_point_cloud(feed_data[:, :, 0:3]) + # feed_data[:, :, 0:3] = random_shift_point_cloud(feed_data[:, :, 0:3]) + # + # feed_dict = { + # ops['pointclouds_pl']: feed_data.reshape([1, BATCH_SIZE * NUM_POINT, 3]), + # ops['labels_pl']: current_label[start_idx:end_idx].reshape(BATCH_SIZE, ), + # ops['npts_pl']: [NUM_POINT] * BATCH_SIZE, + # ops['is_training_pl']: is_training} + # + # summary, step, _, loss_val, pred_val = sess.run([ + # ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + # train_writer.add_summary(summary, step) + # + # pred_val = np.argmax(pred_val, 1) + # correct = np.sum(pred_val == current_label[start_idx:end_idx].reshape(BATCH_SIZE, )) + # total_correct += correct + # total_seen += BATCH_SIZE + # loss_sum += loss_val + + log_string('\n=== training ===') + log_string('total correct: %d, total_seen: %d' % (total_correct, total_seen)) + # log_string('mean batch loss: %f' % (loss_sum / num_batches)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, val_writer): + is_training = False + + total_correct, total_seen, loss_sum = 0, 0, 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + # pdb.set_trace() + points, target = points.numpy(), target.numpy() + + feed_dict = { + ops['pointclouds_pl']: points.reshape([1, BATCH_SIZE * NUM_POINT, 3]), + ops['labels_pl']: target.reshape(BATCH_SIZE, ), + ops['npts_pl']: np.array([NUM_POINT] * BATCH_SIZE), + ops['is_training_pl']: is_training} + + summary, step, loss_val, pred_val = sess.run( + [ops['merged'], ops['step'], ops['loss'], ops['pred']], feed_dict=feed_dict) + val_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == target.reshape(BATCH_SIZE, )) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val * BATCH_SIZE) + + for i, l in enumerate(target): + # l = int(target.reshape(-1)[i]) + # pdb.set_trace() + total_seen_class[int(l)] += 1 + total_correct_class[int(l)] += (int(pred_val[i]) == int(l)) + + # for fn in VALID_FILES: + # current_data, current_label = loadh5DataFile(fn) + # current_data = current_data[:, :NUM_POINT, :] + # file_size = current_data.shape[0] + # num_batches = file_size // BATCH_SIZE + # + # for batch_idx in range(num_batches): + # start_idx, end_idx = batch_idx * BATCH_SIZE, (batch_idx + 1) * BATCH_SIZE + # + # feed_dict = { + # ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :].reshape([1, BATCH_SIZE * NUM_POINT, 3]), + # ops['labels_pl']: current_label[start_idx:end_idx].reshape(BATCH_SIZE, ), + # ops['npts_pl']: np.array([NUM_POINT] * BATCH_SIZE), + # ops['is_training_pl']: is_training} + # + # summary, step, loss_val, pred_val = sess.run( + # [ops['merged'], ops['step'], ops['loss'], ops['pred']], feed_dict=feed_dict) + # val_writer.add_summary(summary, step) + # pred_val = np.argmax(pred_val, 1) + # correct = np.sum(pred_val == current_label[start_idx:end_idx].reshape(BATCH_SIZE, )) + # total_correct += correct + # total_seen += BATCH_SIZE + # loss_sum += (loss_val * BATCH_SIZE) + # + # for i in range(start_idx, end_idx): + # l = int(current_label.reshape(-1)[i]) + # total_seen_class[l] += 1 + # total_correct_class[l] += (pred_val[i - start_idx] == l) + + eval_mean_loss = loss_sum / float(total_seen) + eval_acc = total_correct / float(total_seen) + eval_cls_acc = np.mean(np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + log_string('\n=== evaluating ===') + log_string('total correct: %d, total_seen: %d' % (total_correct, total_seen)) + log_string('eval mean loss: %f' % eval_mean_loss) + log_string('eval accuracy: %f' % eval_acc) + log_string('eval avg class acc: %f' % eval_cls_acc) + + global BEST_EVAL_ACC + if eval_acc > BEST_EVAL_ACC: + BEST_EVAL_ACC = eval_acc + log_string('best eval accuracy: %f' % BEST_EVAL_ACC) + return eval_mean_loss, eval_acc, eval_cls_acc + + +if __name__ == '__main__': + print('Now Using GPU:%d to train the model' % args.gpu) + os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' + os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) + + train(args) + LOG_FOUT.close() diff --git a/zoo/OcCo/OcCo_TF/train_completion.py b/zoo/OcCo/OcCo_TF/train_completion.py new file mode 100644 index 0000000..5f381fa --- /dev/null +++ b/zoo/OcCo/OcCo_TF/train_completion.py @@ -0,0 +1,237 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, pdb, time, argparse, datetime, importlib, numpy as np, tensorflow as tf +from utils import lmdb_dataflow, add_train_summary, plot_pcd_three_views +from termcolor import colored + + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=str, default='1') +parser.add_argument('--lmdb_train', default='data/modelnet/train.lmdb') +parser.add_argument('--lmdb_valid', default='data/modelnet/test.lmdb') +parser.add_argument('--log_dir', type=str, default='') +parser.add_argument('--model_type', default='pcn_cd') +parser.add_argument('--restore', action='store_true') +parser.add_argument('--restore_path', default='log/pcn_cd') +parser.add_argument('--batch_size', type=int, default=16) +parser.add_argument('--num_gt_points', type=int, default=16384) +parser.add_argument('--base_lr', type=float, default=1e-4) +parser.add_argument('--lr_decay', action='store_true') +parser.add_argument('--lr_decay_steps', type=int, default=50000) +parser.add_argument('--lr_decay_rate', type=float, default=0.7) +parser.add_argument('--lr_clip', type=float, default=1e-6) +parser.add_argument('--max_step', type=int, default=3000000) +parser.add_argument('--epoch', type=int, default=50) +parser.add_argument('--steps_per_print', type=int, default=100) +parser.add_argument('--steps_per_eval', type=int, default=1000) +parser.add_argument('--steps_per_visu', type=int, default=3456) +parser.add_argument('--epochs_per_save', type=int, default=5) +parser.add_argument('--visu_freq', type=int, default=10) +parser.add_argument('--store_grad', action='store_true') +parser.add_argument('--num_input_points', type=int, default=1024) +parser.add_argument('--dataset', default='modelnet40') + +args = parser.parse_args() + +BATCH_SIZE = args.batch_size +NUM_POINT = args.num_input_points +NUM_GT_POINT = args.num_gt_points +DECAY_STEP = args.lr_decay_steps +DATASET = args.dataset + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch * BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + + +def vary2fix(inputs, npts): + inputs_ls = np.split(inputs[0], npts.cumsum()) + ret_inputs = np.zeros((1, BATCH_SIZE * NUM_POINT, 3), dtype=np.float32) + ret_npts = npts.copy() + for idx, obj in enumerate(inputs_ls[:-1]): + if len(obj) <= NUM_POINT: + select_idx = np.concatenate([ + np.arange(len(obj)), np.random.choice(len(obj), NUM_POINT - len(obj))]) + else: + select_idx = np.arange(len(obj)) + np.random.shuffle(select_idx) + pdb.set_trace() + + ret_inputs[0][idx * NUM_POINT:(idx + 1) * NUM_POINT] = obj[select_idx].copy() + ret_npts[idx] = NUM_POINT + return ret_inputs, ret_npts + + +def train(args): + + is_training_pl = tf.placeholder(tf.bool, shape=(), name='is_training') + global_step = tf.Variable(0, trainable=False, name='global_step') + alpha = tf.train.piecewise_constant(global_step, [10000, 20000, 50000], + [0.01, 0.1, 0.5, 1.0], 'alpha_op') + + # for ModelNet, it is with Fixed Number of Input Points + # for ShapeNet, it is with Varying Number of Input Points + inputs_pl = tf.placeholder(tf.float32, (1, BATCH_SIZE * NUM_POINT, 3), 'inputs') + npts_pl = tf.placeholder(tf.int32, (BATCH_SIZE,), 'num_points') + gt_pl = tf.placeholder(tf.float32, (BATCH_SIZE, args.num_gt_points, 3), 'ground_truths') + add_train_summary('alpha', alpha) + bn_decay = get_bn_decay(global_step) + add_train_summary('bn_decay', bn_decay) + + model_module = importlib.import_module('.%s' % args.model_type, 'completion_models') + model = model_module.Model(inputs_pl, npts_pl, gt_pl, alpha, + bn_decay=bn_decay, is_training=is_training_pl) + + # Another Solution instead of importlib: + # ldic = locals() + # exec('from completion_models.%s import Model' % args.model_type, globals(), ldic) + # model = ldic['Model'](inputs_pl, npts_pl, gt_pl, alpha, + # bn_decay=bn_decay, is_training=is_training_pl) + + if args.lr_decay: + learning_rate = tf.train.exponential_decay(args.base_lr, global_step, + args.lr_decay_steps, args.lr_decay_rate, + staircase=True, name='lr') + learning_rate = tf.maximum(learning_rate, args.lr_clip) + add_train_summary('learning_rate', learning_rate) + else: + learning_rate = tf.constant(args.base_lr, name='lr') + + trainer = tf.train.AdamOptimizer(learning_rate) + train_op = trainer.minimize(model.loss, global_step) + saver = tf.train.Saver(max_to_keep=10) + ''' from PCN paper: + All our completion_models are trained using the Adam optimizer + with an initial learning rate of 0.0001 for 50 epochs + and a batch size of 32. The learning rate is decayed by 0.7 every 50K iterations. + ''' + + if args.store_grad: + grads_and_vars = trainer.compute_gradients(model.loss) + for g, v in grads_and_vars: + tf.summary.histogram(v.name, v, collections=['train_summary']) + tf.summary.histogram(v.name + '_grad', g, collections=['train_summary']) + + train_summary = tf.summary.merge_all('train_summary') + valid_summary = tf.summary.merge_all('valid_summary') + + # the input number of points for the partial observed data is not a fixed number + df_train, num_train = lmdb_dataflow( + args.lmdb_train, args.batch_size, + args.num_input_points, args.num_gt_points, is_training=True) + train_gen = df_train.get_data() + df_valid, num_valid = lmdb_dataflow( + args.lmdb_valid, args.batch_size, + args.num_input_points, args.num_gt_points, is_training=False) + valid_gen = df_valid.get_data() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + sess = tf.Session(config=config) + + if args.restore: + saver.restore(sess, tf.train.latest_checkpoint(args.log_dir)) + writer = tf.summary.FileWriter(args.log_dir) + else: + sess.run(tf.global_variables_initializer()) + if os.path.exists(args.log_dir): + delete_key = input(colored('%s exists. Delete? [y/n]' % args.log_dir, 'white', 'on_red')) + if delete_key == 'y' or delete_key == "yes": + os.system('rm -rf %s/*' % args.log_dir) + os.makedirs(os.path.join(args.log_dir, 'plots')) + else: + os.makedirs(os.path.join(args.log_dir, 'plots')) + with open(os.path.join(args.log_dir, 'args.txt'), 'w') as log: + for arg in sorted(vars(args)): + log.write(arg + ': ' + str(getattr(args, arg)) + '\n') + log.close() + os.system('cp completion_models/%s.py %s' % (args.model_type, args.log_dir)) # bkp of model scripts + os.system('cp train_completion.py %s' % args.log_dir) # bkp of train procedure + writer = tf.summary.FileWriter(args.log_dir, sess.graph) # GOOD habit + + log_fout = open(os.path.join(args.log_dir, 'log_train.txt'), 'a+') + for arg in sorted(vars(args)): + log_fout.write(arg + ': ' + str(getattr(args, arg)) + '\n') + log_fout.flush() + + total_time = 0 + train_start = time.time() + init_step = sess.run(global_step) + + for step in range(init_step + 1, args.max_step + 1): + epoch = step * args.batch_size // num_train + 1 + ids, inputs, npts, gt = next(train_gen) + if epoch > args.epoch: + break + if DATASET == 'shapenet8': + inputs, npts = vary2fix(inputs, npts) + + start = time.time() + feed_dict = {inputs_pl: inputs, npts_pl: npts, gt_pl: gt, is_training_pl: True} + _, loss, summary = sess.run([train_op, model.loss, train_summary], feed_dict=feed_dict) + total_time += time.time() - start + writer.add_summary(summary, step) + + if step % args.steps_per_print == 0: + print('epoch %d step %d loss %.8f - time per batch %.4f' % + (epoch, step, loss, total_time / args.steps_per_print)) + total_time = 0 + + if step % args.steps_per_eval == 0: + print(colored('Testing...', 'grey', 'on_green')) + num_eval_steps = num_valid // args.batch_size + total_loss, total_time = 0, 0 + sess.run(tf.local_variables_initializer()) + for i in range(num_eval_steps): + start = time.time() + _, inputs, npts, gt = next(valid_gen) + if DATASET == 'shapenet8': + inputs, npts = vary2fix(inputs, npts) + feed_dict = {inputs_pl: inputs, npts_pl: npts, gt_pl: gt, is_training_pl: False} + loss, _ = sess.run([model.loss, model.update], feed_dict=feed_dict) + total_loss += loss + total_time += time.time() - start + summary = sess.run(valid_summary, feed_dict={is_training_pl: False}) + writer.add_summary(summary, step) + print(colored('epoch %d step %d loss %.8f - time per batch %.4f' % + (epoch, step, total_loss / num_eval_steps, total_time / num_eval_steps), + 'grey', 'on_green')) + total_time = 0 + + if step % args.steps_per_visu == 0: + all_pcds = sess.run(model.visualize_ops, feed_dict=feed_dict) + for i in range(0, args.batch_size, args.visu_freq): + plot_path = os.path.join(args.log_dir, 'plots', + 'epoch_%d_step_%d_%s.png' % (epoch, step, ids[i])) + pcds = [x[i] for x in all_pcds] + plot_pcd_three_views(plot_path, pcds, model.visualize_titles) + + if (epoch % args.epochs_per_save == 0) and \ + not os.path.exists(os.path.join(args.log_dir, 'model-%d.meta' % epoch)): + saver.save(sess, os.path.join(args.log_dir, 'model'), epoch) + print(colored('Epoch:%d, Model saved at %s' % (epoch, args.log_dir), 'white', 'on_blue')) + + print('Total time', datetime.timedelta(seconds=time.time() - train_start)) + sess.close() + + +if __name__ == '__main__': + + print('Now Using GPU:%s to train the model' % args.gpu) + os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' + os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu + + train(args) diff --git a/zoo/OcCo/OcCo_TF/utils/Dataset_Assign.py b/zoo/OcCo/OcCo_TF/utils/Dataset_Assign.py new file mode 100644 index 0000000..74da850 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/Dataset_Assign.py @@ -0,0 +1,72 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import h5py + +def Dataset_Assign(dataset, fname, partial=True, bn=False, few_shot=False): + + def fetch_files(filelist): + return [item.strip() for item in open(filelist).readlines()] + + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + dataset = dataset.lower() + + if dataset == 'shapenet8': + NUM_CLASSES = 8 + if partial: + NUM_TRAINOBJECTS = 231792 + TRAIN_FILES = fetch_files('./data/shapenet/hdf5_partial_1024/train_file.txt') + VALID_FILES = fetch_files('./data/shapenet/hdf5_partial_1024/valid_file.txt') + else: + raise ValueError("For ShapeNet we are only interested in the partial objects recognition") + + elif dataset == 'shapenet10': + # Number of Objects: 17378 + # Number of Objects: 2492 + NUM_CLASSES, NUM_TRAINOBJECTS = 10, 17378 + TRAIN_FILES = fetch_files('./data/ShapeNet10/Cleaned/train_file.txt') + VALID_FILES = fetch_files('./data/ShapeNet10/Cleaned/test_file.txt') + + elif dataset == 'modelnet40': + '''Actually we find that using data from PointNet++: + https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip + will increase the accuracy a bit, however to make a fair comparison: we use the same data as + the original data provided by PointNet: https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip''' + NUM_CLASSES = 40 + if partial: + NUM_TRAINOBJECTS = 98430 + TRAIN_FILES = fetch_files('./data/modelnet40_pcn/hdf5_partial_1024/train_file.txt') + VALID_FILES = fetch_files('./data/modelnet40_pcn/hdf5_partial_1024/test_file.txt') + else: + VALID_FILES = fetch_files('./data/modelnet40_ply_hdf5_2048/test_files.txt') + if few_shot: + TRAIN_FILES = fetch_files('./data/modelnet40_ply_hdf5_2048/few_labels/%s.h5' % fname) + data, _ = loadh5DataFile('./data/modelnet40_ply_hdf5_2048/few_labels/%s.h5' % fname) + NUM_TRAINOBJECTS = len(data) + else: + NUM_TRAINOBJECTS = 9843 + TRAIN_FILES = fetch_files('./data/modelnet40_ply_hdf5_2048/train_files.txt') + + elif dataset == 'scannet10': + NUM_CLASSES, NUM_TRAINOBJECTS = 10, 6110 + TRAIN_FILES = fetch_files('./data/ScanNet10/ScanNet_Cleaned/train_file.txt') + VALID_FILES = fetch_files('./data/ScanNet10/ScanNet_Cleaned/test_file.txt') + + elif dataset == 'scanobjectnn': + NUM_CLASSES = 15 + if bn: + TRAIN_FILES = ['./data/ScanNetObjectNN/h5_files/main_split/training_objectdataset' + fname + '.h5'] + VALID_FILES = ['./data/ScanNetObjectNN/h5_files/main_split/test_objectdataset' + fname + '.h5'] + data, _ = loadh5DataFile('./data/ScanNetObjectNN/h5_files/main_split/training_objectdataset' + fname + '.h5') + NUM_TRAINOBJECTS = len(data) + else: + TRAIN_FILES = ['./data/ScanNetObjectNN/h5_files/main_split_nobg/training_objectdataset' + fname + '.h5'] + VALID_FILES = ['./data/ScanNetObjectNN/h5_files/main_split_nobg/test_objectdataset' + fname + '.h5'] + data, _ = loadh5DataFile('./data/ScanNetObjectNN/h5_files/main_split_nobg/training_objectdataset' + fname + '.h5') + NUM_TRAINOBJECTS = len(data) + else: + raise ValueError('dataset not exists') + + return NUM_CLASSES, NUM_TRAINOBJECTS, TRAIN_FILES, VALID_FILES diff --git a/zoo/OcCo/OcCo_TF/utils/EarlyStoppingCriterion.py b/zoo/OcCo/OcCo_TF/utils/EarlyStoppingCriterion.py new file mode 100644 index 0000000..cfa5104 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/EarlyStoppingCriterion.py @@ -0,0 +1,55 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +class EarlyStoppingCriterion(object): + """ + adapted from https://github.com/facebookresearch/hgnn/blob/master/utils/EarlyStoppingCriterion.py + Arguments: + patience (int): The maximum number of epochs with no improvement before early stopping should take place + mode (str, can only be 'max' or 'min'): To take the maximum or minimum of the score for optimization + min_delta (float, optional): Minimum change in the score to qualify as an improvement (default: 0.0) + """ + + def __init__(self, patience=10, mode='max', min_delta=0.0): + assert patience >= 0 + assert mode in {'min', 'max'} + assert min_delta >= 0.0 + self.patience = patience + self.mode = mode + self.min_delta = min_delta + + self._count = 0 + self.best_dev_score = None + self.best_test_score = None + self.best_epoch = None + self.is_improved = None + + def step(self, cur_dev_score, epoch): + """ + Checks if training should be continued given the current score. + Arguments: + cur_dev_score (float): the current development score + # cur_test_score (float): the current test score + Output: + bool: if training should be continued + """ + save_checkpoint = False + + if self.best_dev_score is None: + self.best_dev_score = cur_dev_score + self.best_epoch = epoch + save_checkpoint = True + return False, save_checkpoint + else: + if self.mode == 'max': + self.is_improved = (cur_dev_score > self.best_dev_score + self.min_delta) + else: + self.is_improved = (cur_dev_score < self.best_dev_score - self.min_delta) + + if self.is_improved: + self._count = 0 + self.best_dev_score = cur_dev_score + self.best_epoch = epoch + save_checkpoint = True + else: + self._count += 1 + return self._count >= self.patience, save_checkpoint diff --git a/zoo/OcCo/OcCo_TF/utils/ModelNetDataLoader.py b/zoo/OcCo/OcCo_TF/utils/ModelNetDataLoader.py new file mode 100644 index 0000000..e6e01d9 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/ModelNetDataLoader.py @@ -0,0 +1,187 @@ +import os, torch, h5py, warnings, numpy as np +from torch.utils.data import Dataset + +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def farthest_point_sample(point, npoint): + """ + Input: + xyz: point cloud data, [N, D] + npoint: number of samples + Return: + centroids: sampled point cloud index, [npoint, D] + """ + N, D = point.shape + xyz = point[:, :3] + centroids = np.zeros((npoint,)) + distance = np.ones((N,)) * 1e10 + farthest = np.random.randint(0, N) + for i in range(npoint): + centroids[i] = farthest + centroid = xyz[farthest, :] + dist = np.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = np.argmax(distance, -1) + point = point[centroids.astype(np.int32)] + return point + + +class ModelNetDataLoader(Dataset): + def __init__(self, root, npoint=1024, split='train', uniform=False, normal_channel=True, cache_size=15000): + self.root = root + self.npoints = npoint + self.uniform = uniform + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {'train': [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))], + 'test': [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))]} + + assert (split == 'train' or split == 'test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i]) + '.txt') for i + in range(len(shape_ids[split]))] + print('The size of %s data is %d' % (split, len(self.datapath))) + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + def __len__(self): + return len(self.datapath) + + def _get_item(self, index): + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints, :] + + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + + if not self.normal_channel: + point_set = point_set[:, 0:3] + + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + +class General_CLSDataLoader_HDF5(Dataset): + def __init__(self, file_list, num_point=1024): + # self.root = root + self.num_point = num_point + self.file_list = file_list + self.points_list = np.zeros((1, num_point, 3)) + self.labels_list = np.zeros((1,)) + + for file in self.file_list: + # pdb.set_trace() + # file = os.path.join(root, file) + # pdb.set_trace() + data, label = self.loadh5DataFile(file) + self.points_list = np.concatenate([self.points_list, + data[:, :self.num_point, :]], axis=0) + self.labels_list = np.concatenate([self.labels_list, label.ravel()], axis=0) + + self.points_list = self.points_list[1:] + self.labels_list = self.labels_list[1:] + assert len(self.points_list) == len(self.labels_list) + print('Number of Objects: ', len(self.labels_list)) + + @staticmethod + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + def __len__(self): + return len(self.points_list) + + def __getitem__(self, index): + + point_xyz = self.points_list[index][:, 0:3] + point_label = self.labels_list[index].astype(np.int32) + + return point_xyz, point_label + + +class ModelNetJigsawDataLoader(Dataset): + def __init__(self, root=r'./data/modelnet40_ply_hdf5_2048/jigsaw', + n_points=1024, split='train', k=3): + self.npoints = n_points + self.root = root + self.split = split + assert split in ['train', 'test'] + if self.split == 'train': + self.file_list = [d for d in os.listdir(root) if d.find('train') is not -1] + else: + self.file_list = [d for d in os.listdir(root) if d.find('test') is not -1] + self.points_list = np.zeros((1, n_points, 3)) + self.labels_list = np.zeros((1, n_points)) + + for file in self.file_list: + file = os.path.join(root, file) + data, label = self.loadh5DataFile(file) + # data = np.load(root + file) + self.points_list = np.concatenate([self.points_list, data], axis=0) # .append(data) + self.labels_list = np.concatenate([self.labels_list, label], axis=0) + # self.labels_list.append(label) + + self.points_list = self.points_list[1:] + self.labels_list = self.labels_list[1:] + assert len(self.points_list) == len(self.labels_list) + print('Number of %s Objects: '%self.split, len(self.labels_list)) + + # just use the average weights + self.labelweights = np.ones(k ** 3) + + # pdb.set_trace() + + @staticmethod + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + def __getitem__(self, index): + + point_set = self.points_list[index][:, 0:3] + semantic_seg = self.labels_list[index].astype(np.int32) + # sample_weight = self.labelweights[semantic_seg] + + # return point_set, semantic_seg, sample_weight + return point_set, semantic_seg + + def __len__(self): + return len(self.points_list) + + +if __name__ == '__main__': + + data = ModelNetDataLoader('/data/modelnet40_normal_resampled/', split='train', uniform=False, normal_channel=True, ) + DataLoader = torch.utils.data.DataLoader(data, batch_size=12, shuffle=True) + for point, label in DataLoader: + print(point.shape) + print(label.shape) diff --git a/zoo/OcCo/OcCo_TF/utils/Train_Logger.py b/zoo/OcCo/OcCo_TF/utils/Train_Logger.py new file mode 100644 index 0000000..1d1a4ba --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/Train_Logger.py @@ -0,0 +1,152 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, logging, datetime, numpy as np, sklearn.metrics as metrics +from pathlib import Path + + +class TrainLogger: + + def __init__(self, args, name='Model', subfold='cls', cls2name=None): + self.step = 1 + self.epoch = 1 + self.args = args + self.name = name + self.sf = subfold + self.make_logdir() + self.logger_setup() + self.epoch_init() + self.save_model = False + self.cls2name = cls2name + self.best_instance_acc, self.best_class_acc = 0., 0. + self.best_instance_epoch, self.best_class_epoch = 0, 0 + self.savepath = str(self.checkpoints_dir) + '/best_model.pth' + + def logger_setup(self): + self.logger = logging.getLogger(self.name) + self.logger.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler(os.path.join(self.log_dir, 'train_log.txt')) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + # ref: https://stackoverflow.com/a/53496263/12525201 + # define a Handler which writes INFO messages or higher to the sys.stderr + console = logging.StreamHandler() + console.setLevel(logging.INFO) + # logging.getLogger('').addHandler(console) # this is root logger + self.logger.addHandler(console) + self.logger.addHandler(file_handler) + self.logger.info('PARAMETER ...') + self.logger.info(self.args) + self.logger.removeHandler(console) + + def make_logdir(self): + timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + experiment_dir = Path('./log/') + experiment_dir.mkdir(exist_ok=True) + experiment_dir = experiment_dir.joinpath(self.sf) + experiment_dir.mkdir(exist_ok=True) + + if self.args.log_dir is None: + self.experiment_dir = experiment_dir.joinpath(timestr) + else: + self.experiment_dir = experiment_dir.joinpath(self.args.log_dir) + + self.experiment_dir.mkdir(exist_ok=True) + self.checkpoints_dir = self.experiment_dir.joinpath('checkpoints/') + self.checkpoints_dir.mkdir(exist_ok=True) + self.log_dir = self.experiment_dir.joinpath('logs/') + self.log_dir.mkdir(exist_ok=True) + self.experiment_dir.joinpath('runs').mkdir(exist_ok=True) + + # @property.setter + def epoch_init(self, training=True): + self.loss, self.count, self.pred, self.gt = 0., 0., [], [] + if training: + self.logger.info('\nEpoch %d/%d:' % (self.epoch, self.args.epoch)) + + def step_update(self, pred, gt, loss, training=True): + if training: + self.step += 1 + self.gt.append(gt) + self.pred.append(pred) + batch_size = len(pred) + self.count += batch_size + self.loss += loss * batch_size + + def cls_epoch_update(self, training=True): + self.save_model = False + self.gt = np.concatenate(self.gt) + self.pred = np.concatenate(self.pred) + instance_acc = metrics.accuracy_score(self.gt, self.pred) + class_acc = metrics.balanced_accuracy_score(self.gt, self.pred) + + if instance_acc > self.best_instance_acc and not training: + self.best_instance_acc = instance_acc + self.best_instance_epoch = self.epoch + self.save_model = True + if class_acc > self.best_class_acc and not training: + self.best_class_acc = class_acc + self.best_class_epoch = self.epoch + + if not training: + self.epoch += 1 + return instance_acc, class_acc + + def seg_epoch_update(self, training=True): + self.save_model = False + self.gt = np.concatenate(self.gt) + self.pred = np.concatenate(self.pred) + instance_acc = metrics.accuracy_score(self.gt, self.pred) + if instance_acc > self.best_instance_acc and not training: + self.best_instance_acc = instance_acc + self.best_instance_epoch = self.epoch + self.save_model = True + + if not training: + self.epoch += 1 + return instance_acc + + def epoch_summary(self, writer=None, training=True): + instance_acc, class_acc = self.cls_epoch_update(training) + if training: + if writer is not None: + writer.add_scalar('Train Class Accuracy', class_acc, self.step) + writer.add_scalar('Train Instance Accuracy', instance_acc, self.step) + self.logger.info('Train Instance Accuracy: %.3f, Class Accuracy: %.3f' % (instance_acc, class_acc)) + else: + if writer is not None: + writer.add_scalar('Test Class Accuracy', class_acc, self.step) + writer.add_scalar('Test Instance Accuracy', instance_acc, self.step) + self.logger.info('Test Instance Accuracy: %.3f, Class Accuracy: %.3f' % (instance_acc, class_acc)) + self.logger.info('Best Instance Accuracy: %.3f at Epoch %d ' % ( + self.best_instance_acc, self.best_instance_epoch)) + self.logger.info('Best Class Accuracy: %.3f at Epoch %d' % ( + self.best_class_acc, self.best_class_epoch)) + + if self.save_model: + self.logger.info('Saving the Model Params to %s' % self.savepath) + + def train_summary(self): + self.logger.info('\n\nEnd of Training...') + self.logger.info('Best Instance Accuracy: %.3f at Epoch %d ' % ( + self.best_instance_acc, self.best_instance_epoch)) + self.logger.info('Best Class Accuracy: %.3f at Epoch %d' % ( + self.best_class_acc, self.best_class_epoch)) + + def update_from_checkpoints(self, checkpoint): + self.logger.info('Use Pre-Trained Weights') + self.step = checkpoint['step'] + self.epoch = checkpoint['epoch'] + self.best_instance_epoch, self.best_instance_acc = checkpoint['epoch'], checkpoint['instance_acc'] + self.best_class_epoch, self.best_class_acc = checkpoint['best_class_epoch'], checkpoint['best_class_acc'] + self.logger.info('Best Class Acc {:.3f} at Epoch {}'.format(self.best_instance_acc, self.best_class_epoch)) + self.logger.info('Best Instance Acc {:.3f} at Epoch {}'.format(self.best_instance_acc, self.best_instance_epoch)) + + def update_from_checkpoints_tf(self, checkpoint): + self.logger.info('Use Pre-Trained Weights') + self.step = checkpoint['step'] + self.epoch = checkpoint['epoch'] + self.best_instance_epoch, self.best_instance_acc = checkpoint['epoch'], checkpoint['instance_acc'] + self.best_class_epoch, self.best_class_acc = checkpoint['best_class_epoch'], checkpoint['best_class_acc'] + self.logger.info('Best Class Acc {:.3f} at Epoch {}'.format(self.best_instance_acc, self.best_class_epoch)) + self.logger.info('Best Instance Acc {:.3f} at Epoch {}'.format(self.best_instance_acc, self.best_instance_epoch)) diff --git a/zoo/OcCo/OcCo_TF/utils/__init__.py b/zoo/OcCo/OcCo_TF/utils/__init__.py new file mode 100644 index 0000000..4acf5ef --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# +from tf_util import * +from pc_util import * +from io_util import * +from data_util import * +from visu_util import * \ No newline at end of file diff --git a/zoo/OcCo/OcCo_TF/utils/check_num_point.py b/zoo/OcCo/OcCo_TF/utils/check_num_point.py new file mode 100644 index 0000000..910f277 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/check_num_point.py @@ -0,0 +1,83 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +# Author: Hanchen Wang, hw501@cam.ac.uk + +import numpy as np +import os, json, argparse +from data_util import lmdb_dataflow +from io_util import read_pcd +from tqdm import tqdm + +MODELNET40_PATH = r"../render/dump_modelnet_normalised_" +SCANNET10_PATH = r"../data/ScanNet10" +SHAPENET8_PATH = r"../data/shapenet" + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--dataset', type=str, default='modelnet40', help="modelnet40, shapenet8 or scannet10") + + args = parser.parse_args() + os.system("mkdir -p ./dump_sum_points") + + if args.dataset == 'modelnet40': + shape_names = open(r'../render/shape_names.txt').read().splitlines() + file_ = open(r'../render/ModelNet_flist_normalised.txt').read().splitlines() + + print("=== ModelNet40 ===\n") + for t in ['train', 'test']: + # for res in ['fine', 'middle', 'coarse', 'supercoarse']: + for res in ['supercoarse']: + sum_dict = {} + for shape in shape_names: + sum_dict[shape] = np.zeros(3,dtype=np.int32) # num of objects, num of points, average + + model_list = [_file for _file in file_ if t in _file] + for model_id in tqdm(model_list): + model_name = model_id.split('/')[0] + for i in range(10): + partial_pc = read_pcd(os.path.join(MODELNET40_PATH + res, 'pcd', model_id + '_%d.pcd' % i)) + sum_dict[model_name][1] += len(partial_pc) + sum_dict[model_name][0] += 1 + + sum_dict[model_name][2] = sum_dict[model_name][1]/sum_dict[model_name][0] + + f = open("./dump_sum_points/modelnet40_%s_%s.txt" % (t, res), "w+") + for key in sum_dict.keys(): + f.writelines([key, str(sum_dict[key]), '\n']) + f.close() + print("=== ModelNet40 %s %s Done ===\n" % (t, res)) + + elif args.dataset == 'shapenet8': + print("\n\n=== ShapeNet8 ===\n") + for t in ['train', 'valid']: + sum_dict = json.loads(open(os.path.join(SHAPENET8_PATH, 'keys.json')).read()) + for key in sum_dict.keys(): + sum_dict[key] = np.zeros(3) # num of objects, num of points, average + + # the data stored in the lmdb files is with varying number of points + df, num = lmdb_dataflow(lmdb_path=os.path.join(SHAPENET8_PATH, '%s.lmdb' % t), + batch_size=1, input_size=1000000, output_size=1, is_training=False) + + data_gen = df.get_data() + for _ in tqdm(range(num)): + ids, _, npts, _ = next(data_gen) + model_name = ids[0][:8] + sum_dict[model_name][1] += npts[0] + sum_dict[model_name][0] += 1 + + sum_dict[model_name][2] = sum_dict[model_name][1] / sum_dict[model_name][0] + + f = open("./dump_sum_points/shapenet8_%s.json" % t, "w+") + for key in sum_dict.keys(): + f.writelines([key, str(sum_dict[key]), '\n']) + # f.write(json.dumps(sum_dict)) + f.close() + print("=== ShapeNet8 %s Done ===\n" % t) + + elif args.dataset == 'scannet10': + print("\n\n=== ScanNet10 is not ready yet ===\n") + + else: + raise ValueError('Assigned dataset do not exist.') diff --git a/zoo/OcCo/OcCo_TF/utils/check_scale.py b/zoo/OcCo/OcCo_TF/utils/check_scale.py new file mode 100644 index 0000000..2b2acdd --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/check_scale.py @@ -0,0 +1,89 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import numpy as np +import os, open3d, sys + +LOG_F = open(r'./scale_sum_modelnet40raw.txt', 'w+') +open3d.utility.set_verbosity_level = 0 + +def log_string(msg): + print(msg) + LOG_F.writelines(msg + '\n') + + +if __name__ == "__main__": + + lmdb_f = r'./data/shapenet/train.lmdb' + modelnet_raw_path = r'./data/modelnet40_raw/' + shapenet_raw_path = r'./data/ShapeNet_raw/' + modelnet40_pn_processed_f = r'./data/' + + off_set, max_radius = 0, 0 + + '''=== ModelNet40 ===''' + log_string('=== ModelNet40 Raw ===\n\n\n') + for root, dirs, files in os.walk(modelnet_raw_path): + for name in files: + if '.ply' in name: + mesh = open3d.io.read_triangle_mesh(os.path.join(root, name)) + off_set_bias = (mesh.get_center()**2).sum() + + if off_set_bias > off_set: + off_set = off_set_bias + log_string('update offset: %f by %s' % (off_set, os.path.join(root, name))) + radius_bias = (np.asarray(mesh.vertices)**2).sum(axis=1).max() + + if radius_bias > max_radius: + max_radius = radius_bias + log_string('update max radius: %f by %s' %(max_radius, os.path.join(root, name))) + log_string('\n\n\n=== sum for ShapeNetCorev2 ===') + log_string('===offset:%f, radius:%f===\n\n\n'%(off_set, max_radius)) + + sys.exit('finish computing ModelNet40') + + + '''=== ShapeNetCore ===''' + log_string('=== now on ShapeNetCorev2 ===\n\n\n') + for root, dirs, files in os.walk(shapenet_raw_path): + for name in files: + if '.obj' in name: + mesh = open3d.io.read_triangle_mesh(os.path.join(root, name)) + off_set_bias = (mesh.get_center()**2).sum() + if off_set_bias > off_set: + off_set = off_set_bias + log_string('update offset: %f by %s' % (off_set, os.path.join(root, name))) + + radius_bias = (np.asarray(mesh.vertices)**2).sum(axis=1).max() + + if radius_bias > max_radius: + max_radius = radius_bias + log_string('update max radius: %f by %s' %(max_radius, os.path.join(root, name))) + + log_string('\n\n\n=== sum for ShapeNetCorev2 ===') + log_string('===offset:%f, radius:%f===\n\n\n'%(off_set, max_radius)) + + sys.exit('finish computing ShapeNetCorev2') + + '''=== PCN ===''' + log_string('===now on PCN cleaned subset of ShapeNet===\n\n\n') + df_train, num_train = lmdb_dataflow(lmdb_path = lmdb_f, batch_size=1, + input_size=3000, output_size=16384, is_training=True) + train_gen = df_train.get_data() + + for idx in range(231792): + ids, _, _, gt = next(train_gen) + off_set_bias = (gt.mean(axis=1)**2).sum() + + if off_set_bias > off_set: + off_set = off_set_bias + log_string('update offset: %f by %d, %s' % (off_set, idx, ids)) + + radius_bias = (gt**2).sum(axis=2).max() + + if radius_bias > max_radius: + max_radius = radius_bias + log_string('update max radius: %f by %d, %s' %(max_radius, idx, ids)) + + log_string('\n\n\n===for PCN cleaned subset of ShapeNet===') + log_string('===offset:%f, radius:%f===\n\n\n'%(off_set, max_radius)) + diff --git a/zoo/OcCo/OcCo_TF/utils/data_util.py b/zoo/OcCo/OcCo_TF/utils/data_util.py new file mode 100644 index 0000000..d99da0c --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/data_util.py @@ -0,0 +1,101 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: + +import numpy as np, tensorflow as tf +from tensorpack import dataflow + + +def resample_pcd(pcd, n): + """drop or duplicate points so that input of each object has exactly n points""" + idx = np.random.permutation(pcd.shape[0]) + if idx.shape[0] < n: + idx = np.concatenate([idx, np.random.randint(pcd.shape[0], size=n-pcd.shape[0])]) + return pcd[idx[:n]] + + +class PreprocessData(dataflow.ProxyDataFlow): + def __init__(self, ds, input_size, output_size): + # what is ds doing..? + super(PreprocessData, self).__init__(ds) + self.input_size = input_size + self.output_size = output_size + + def get_data(self): + for id, input, gt in self.ds.get_data(): + input = resample_pcd(input, self.input_size) + gt = resample_pcd(gt, self.output_size) + yield id, input, gt + + +class BatchData(dataflow.ProxyDataFlow): + def __init__(self, ds, batch_size, input_size, gt_size, remainder=False, use_list=False): + super(BatchData, self).__init__(ds) + self.batch_size = batch_size + self.input_size = input_size + self.gt_size = gt_size + self.remainder = remainder + self.use_list = use_list + + def __len__(self): + """get the number of batches""" + ds_size = len(self.ds) + div = ds_size // self.batch_size + rem = ds_size % self.batch_size + if rem == 0: + return div + return div + int(self.remainder) # int(False) == 0 + + def __iter__(self): + """generating data in batches""" + holder = [] + for data in self.ds: + holder.append(data) + if len(holder) == self.batch_size: + yield self._aggregate_batch(holder, self.use_list) + del holder[:] # reset holder as empty list => holder = [] + if self.remainder and len(holder) > 0: + yield self._aggregate_batch(holder, self.use_list) + + def _aggregate_batch(self, data_holder, use_list=False): + """ + Concatenate input points along the 0-th dimension + Stack all other data along the 0-th dimension + """ + ids = np.stack([x[0] for x in data_holder]) + inputs = [resample_pcd(x[1], self.input_size) if x[1].shape[0] > self.input_size else x[1] + for x in data_holder] + inputs = np.expand_dims(np.concatenate([x for x in inputs]), 0).astype(np.float32) + npts = np.stack([x[1].shape[0] if x[1].shape[0] < self.input_size else self.input_size + for x in data_holder]).astype(np.int32) + gts = np.stack([resample_pcd(x[2], self.gt_size) for x in data_holder]).astype(np.float32) + return ids, inputs, npts, gts + + +def lmdb_dataflow(lmdb_path, batch_size, input_size, output_size, is_training, test_speed=False): + """load LMDB files, then generate batches??""" + df = dataflow.LMDBSerializer.load(lmdb_path, shuffle=False) + size = df.size() + if is_training: + df = dataflow.LocallyShuffleData(df, buffer_size=2000) # buffer_size + df = dataflow.PrefetchData(df, nr_prefetch=500, nr_proc=1) # multiprocess the data + df = BatchData(df, batch_size, input_size, output_size) + if is_training: + df = dataflow.PrefetchDataZMQ(df, nr_proc=8) + df = dataflow.RepeatedData(df, -1) + if test_speed: + dataflow.TestDataSpeed(df, size=1000).start() + df.reset_state() + return df, size + + +def get_queued_data(generator, dtypes, shapes, queue_capacity=10): + assert len(dtypes) == len(shapes), 'dtypes and shapes must have the same length' + queue = tf.FIFOQueue(queue_capacity, dtypes, shapes) + placeholders = [tf.placeholder(dtype, shape) for dtype, shape in zip(dtypes, shapes)] + enqueue_op = queue.enqueue(placeholders) + close_op = queue.close(cancel_pending_enqueues=True) + feed_fn = lambda: {placeholder: value for placeholder, value in zip(placeholders, next(generator))} + queue_runner = tf.contrib.training.FeedingQueueRunner( + queue, [enqueue_op], close_op, feed_fns=[feed_fn]) + tf.train.add_queue_runner(queue_runner) + return queue.dequeue() diff --git a/zoo/OcCo/OcCo_TF/utils/io_util.py b/zoo/OcCo/OcCo_TF/utils/io_util.py new file mode 100644 index 0000000..ef79cf4 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/io_util.py @@ -0,0 +1,46 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import h5py, numpy as np +from open3d.open3d.geometry import PointCloud +from open3d.open3d.utility import Vector3dVector +from open3d.open3d.io import read_point_cloud, write_point_cloud + + +def read_pcd(filename): + pcd = read_point_cloud(filename) + return np.array(pcd.points) + + +def save_pcd(filename, points): + pcd = PointCloud() + pcd.points = Vector3dVector(points) + write_point_cloud(filename, pcd) + + +def shuffle_data(data, labels): + """ Shuffle data and labels """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + + +def save_h5(h5_filename, data, label, data_dtype='uint8', label_dtype='uint8'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + name='data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + name='label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() diff --git a/zoo/OcCo/OcCo_TF/utils/pc_util.py b/zoo/OcCo/OcCo_TF/utils/pc_util.py new file mode 100644 index 0000000..caccafe --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/pc_util.py @@ -0,0 +1,97 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import numpy as np + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to argument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + # rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + """ batch_pc: BxNx3 """ + for b in range(batch_pc.shape[0]): + # np.random.random() -> Return random floats in the half-open interval [0.0, 1.0). + dropout_ratio = np.random.random() * max_dropout_ratio # 0 ~ 0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1])) <= dropout_ratio)[0] + if len(drop_idx) > 0: + batch_pc[b, drop_idx, :] = batch_pc[b, 0, :] # set to the first point + return batch_pc + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index, :, :] *= scales[batch_index] + return batch_data + + +def random_shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B, 3)) + for batch_index in range(B): + batch_data[batch_index, :, :] += shifts[batch_index, :] + return batch_data diff --git a/zoo/OcCo/OcCo_TF/utils/tf_util.py b/zoo/OcCo/OcCo_TF/utils/tf_util.py new file mode 100644 index 0000000..d532dd9 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/tf_util.py @@ -0,0 +1,517 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import tensorflow as tf +try: + from pc_distance import tf_nndistance, tf_approxmatch +except: + pass + +'''mlp and conv1d with stride 1 are different''' + + +def mlp(features, layer_dims, bn=None, bn_params=None): + # doc: https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/layers/fully_connected + for i, num_outputs in enumerate(layer_dims[:-1]): + features = tf.contrib.layers.fully_connected( + features, num_outputs, + normalizer_fn=bn, + normalizer_params=bn_params, + scope='fc_%d' % i) + outputs = tf.contrib.layers.fully_connected( + features, layer_dims[-1], + activation_fn=None, + scope='fc_%d' % (len(layer_dims) - 1)) + return outputs + + +def mlp_conv(inputs, layer_dims, bn=None, bn_params=None): + # doc: https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/layers/conv1d + for i, num_out_channel in enumerate(layer_dims[:-1]): + inputs = tf.contrib.layers.conv1d( + inputs, num_out_channel, + kernel_size=1, + normalizer_fn=bn, + normalizer_params=bn_params, + scope='conv_%d' % i) + # kernel size -> single value for all spatial dimensions + # the size of filter should be (1, 3) + outputs = tf.contrib.layers.conv1d( + inputs, layer_dims[-1], + kernel_size=1, + activation_fn=None, + scope='conv_%d' % (len(layer_dims) - 1)) + return outputs + + +def point_maxpool(inputs, npts, keepdims=False): + # number of points, number of channels -> get the maximum value along the number of channels + outputs = [tf.reduce_max(f, axis=1, keepdims=keepdims) for f in tf.split(inputs, npts, axis=1)] + return tf.concat(outputs, axis=0) + + +def point_unpool(inputs, npts): + inputs = tf.split(inputs, inputs.shape[0], axis=0) + outputs = [tf.tile(f, [1, npts[i], 1]) for i, f in enumerate(inputs)] + return tf.concat(outputs, axis=1) + + +def chamfer(pcd1, pcd2): + """Normalised Chamfer Distance""" + dist1, _, dist2, _ = tf_nndistance.nn_distance(pcd1, pcd2) + dist1 = tf.reduce_mean(tf.sqrt(dist1)) + dist2 = tf.reduce_mean(tf.sqrt(dist2)) + return (dist1 + dist2) / 2 + + +def earth_mover(pcd1, pcd2): + """Normalised Earth Mover Distance""" + assert pcd1.shape[1] == pcd2.shape[1] # has the same number of points + num_points = tf.cast(pcd1.shape[1], tf.float32) + match = tf_approxmatch.approx_match(pcd1, pcd2) + cost = tf_approxmatch.match_cost(pcd1, pcd2, match) + return tf.reduce_mean(cost / num_points) + + +def add_train_summary(name, value): + tf.summary.scalar(name, value, collections=['train_summary']) + + +def add_valid_summary(name, value): + avg, update = tf.metrics.mean(value) + tf.summary.scalar(name, avg, collections=['valid_summary']) + return update + + +''' === borrow from PointNet === ''' + + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + use_fp16: use 16 bit float or 32 bit float + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Variable, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controlling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') # basically just mean and variance + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + '''tf.nn.batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None)''' + # θΏ™ι‡Œηš„beta, gamma不是3rd/4th moment, 是transferred mean and variance + # y_i = gamma * x_i + beta, ε…ΆδΈ­ x_i 是 normalized δΉ‹εŽηš„η»“ζžœ + # ref: https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad + return normed + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Variable, true indicates training phase + bn_decay: float or float tensor variable, controlling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bias=True, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + if bias: + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + ''' + tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', + name=None, input=None) + value: (NHWC) -> Number of Batch * In Height * In Width * In Channel + kzise: + + ''' + return outputs + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bias=True, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC (Batch Size * Height * Width * Channel) + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true, + xavier initializer is the weights initialization technique + that tries to make the variance of the outputs of a layer + to be equal to the variance of its inputs + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bias: bool, whether to add bias or not + bn_decay: float or float tensor variable in [0,1] -> actually no idea = = + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + # either [1, 1] or [1, 3] + kernel_h, kernel_w = kernel_size + # 64, 128, 256, 512, 1028 + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + + # not using weight_dacay, since we are using xavier initializer, + # so stddev is not used since it is the setting for truncated_normal_initializer() + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + # always [1, 1] + stride_h, stride_w = stride + + # tf.nn.conv2d(input, filters, strides, padding, data_format='NHWC', dilations=None, name=None) + # filters -> [filter_height, filter_width, in_channels, out_channels], [1,1,1,1] or [1,1,3,1] + # -> Point-Based MLPs + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + if bias: + biases = _variable_on_cpu('biases', [num_output_channels], tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + # always use batch normalisation + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, bn_decay=bn_decay, scope='bn') + + # always use relu activation function + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 2D convolutional maps. """ + return batch_norm_template(inputs, is_training, scope, [0, 1, 2], bn_decay) + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Variable, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controlling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + # basically mean and variance + decay = bn_decay if bn_decay is not None else 0.9 + # it seems that in the PointNet it is setting as 0.7 + + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var + # TODO: what is the window size??? + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + '''tf.nn.batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None)''' + # θΏ™ι‡Œηš„beta, gamma不是3rd/4th moment, 是transferred mean and variance + # y_i = gamma * x_i + beta, ε…ΆδΈ­ x_i 是 normalized δΉ‹εŽηš„η»“ζžœ + # ref: https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad + return normed + + +def pairwise_distance(point_cloud): + """Compute pairwise distance of a point cloud. + Args: + point_cloud: tensor (batch_size, num_points, num_dims) + + Returns: + pairwise distance: (batch_size, num_points, num_points) + """ + + og_batch_size = point_cloud.get_shape().as_list()[0] + point_cloud = tf.squeeze(point_cloud) + if og_batch_size == 1: + point_cloud = tf.expand_dims(point_cloud, 0) + + point_cloud_transpose = tf.transpose(point_cloud, perm=[0, 2, 1]) + point_cloud_inner = tf.matmul(point_cloud, point_cloud_transpose) + point_cloud_inner = -2 * point_cloud_inner + point_cloud_square = tf.reduce_sum(tf.square(point_cloud), axis=-1, keep_dims=True) + point_cloud_square_tranpose = tf.transpose(point_cloud_square, perm=[0, 2, 1]) + return point_cloud_square + point_cloud_inner + point_cloud_square_tranpose + + +def knn(adj_matrix, k=20): + """ Get KNN based on the pairwise distance. + Args: + pairwise distance: (batch_size, num_points, num_points) + k: int + + Returns: + nearest neighbors: (batch_size, num_points, k) + """ + neg_adj = - adj_matrix + _, nn_idx = tf.nn.top_k(neg_adj, k=k) + return nn_idx + + +def get_edge_feature(point_cloud, nn_idx, k=20): + """Construct edge feature for each point + Args: + point_cloud: (batch_size, num_points, 1, num_dims) + nn_idx: (batch_size, num_points, k) + k: int + Returns: + edge features: (batch_size, num_points, k, num_dims) + """ + og_batch_size = point_cloud.get_shape().as_list()[0] + point_cloud = tf.squeeze(point_cloud) + if og_batch_size == 1: + point_cloud = tf.expand_dims(point_cloud, 0) + + point_cloud_central = point_cloud + + point_cloud_shape = point_cloud.get_shape() + batch_size = point_cloud_shape[0].value + num_points = point_cloud_shape[1].value + num_dims = point_cloud_shape[2].value + + idx_ = tf.range(batch_size) * num_points + idx_ = tf.reshape(idx_, [batch_size, 1, 1]) + + point_cloud_flat = tf.reshape(point_cloud, [-1, num_dims]) + point_cloud_neighbors = tf.gather(point_cloud_flat, nn_idx + idx_) + point_cloud_central = tf.expand_dims(point_cloud_central, axis=-2) + + point_cloud_central = tf.tile(point_cloud_central, [1, 1, k, 1]) + + # edge_feature = tf.concat([point_cloud_central, point_cloud_neighbors - point_cloud_central], axis=-1) + edge_feature = tf.concat([point_cloud_neighbors - point_cloud_central, point_cloud_central], axis=-1) + + return edge_feature + + +def get_learning_rate(batch, base_lr, batch_size, decay_step, decay_rate, lr_clip): + learning_rate = tf.train.exponential_decay( + base_lr, # Base learning rate. + batch * batch_size, # Current index into the dataset. + decay_step, # Decay step. + decay_rate, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, lr_clip) # CLIP THE LEARNING RATE! + return learning_rate + + +def get_lr_dgcnn(batch, base_lr, batch_size, decay_step, alpha): + learning_rate = tf.train.cosine_decay( + base_lr, # Base learning rate. + batch * batch_size, # Current index into the dataset. + decay_step, # Decay step. + alpha) # alpha. + return learning_rate + + +def get_bn_decay(batch, bn_init_decay, batch_size, bn_decay_step, bn_decay_rate, bn_decay_clip): + bn_momentum = tf.train.exponential_decay( + bn_init_decay, + batch * batch_size, + bn_decay_step, + bn_decay_rate, + staircase=True) + bn_decay = tf.minimum(bn_decay_clip, 1 - bn_momentum) + return bn_decay diff --git a/zoo/OcCo/OcCo_TF/utils/transfer_pretrained_w.py b/zoo/OcCo/OcCo_TF/utils/transfer_pretrained_w.py new file mode 100644 index 0000000..2aa4d45 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/transfer_pretrained_w.py @@ -0,0 +1,85 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import os, argparse, tensorflow as tf +from tensorflow.python import pywrap_tensorflow +from termcolor import colored + +def load_para_from_saved_model(model_path, verbose=False): + """load the all parameters from the saved TensorFlow checkpoint + the format is dict -> {var_name(str): var_value(numpy array)}""" + reader = pywrap_tensorflow.NewCheckpointReader(model_path) + var_to_map = reader.get_variable_to_shape_map() + + print('\n============================') + print('model checkpoint: ', model_path) + print('checkpoint has been loaded') + for key in var_to_map.keys(): + var_to_map[key] = reader.get_tensor(key) + if verbose: + print('tensor_name:', key, ' shape:', reader.get_tensor(key).shape) + print('============================\n') + return var_to_map + + +def intersec_saved_var(model_path1, model_path2, verbose=False): + """find the intersection of two saved models in terms of variable names""" + var_to_map_1 = load_para_from_saved_model(model_path1, verbose=verbose) + var_to_map_2 = load_para_from_saved_model(model_path2, verbose=verbose) + + # list of shared variable + intersect = [*set(var_to_map_1.keys()).intersection(set(var_to_map_2.keys())), ] + + if verbose: + print('\n=======================') + print('the shared variables are:') + print(intersect) + + return var_to_map_1, var_to_map_2, intersect + + +def load_pretrained_var(source_model_path, target_model_path, verbose=False): + """save the parameters from source to target for variables in the intersection""" + var_map_source, var_map_target, intersect = intersec_saved_var( + source_model_path, target_model_path, verbose=verbose) + + out_f = open('para_restored.txt', 'w+') + + with tf.Session() as my_sess: + new_var_list = [] + for var in var_map_target.keys(): + # pdb.set_trace() + if (var in intersect) and (var_map_source[var].shape == var_map_target[var].shape): + new_var = tf.Variable(var_map_source[var], name=var) + if verbose: + print('%s has been restored from the pre-trained %s' % (var, source_model_path)) + out_f.writelines('Restored: %s has been restored from the pre-trained %s\n' % (var, source_model_path)) + else: + new_var = tf.Variable(var_map_target[var], name=var) + if verbose: + print('%s has been restored from the random initialized %s' % (var, target_model_path)) + out_f.writelines('Random Initialised: %s\n' % var) + new_var_list.append(new_var) + print('start to write the new checkpoint') + my_sess.run(tf.global_variables_initializer()) + my_saver = tf.train.Saver(var_list=new_var_list) + my_saver.save(my_sess, target_model_path) + print(colored('source weights has been restored', 'white', 'on_blue')) + + my_sess.close() + out_f.close() + return None + + +if __name__ == '__main__': + + parser = argparse.ArgumentParser() + parser.add_argument('--source_path', default='./pretrained/pcn_cd') + parser.add_argument('--target_path', default='./log/pcn_cls_shapenet8_pretrained_init/model.ckpt') + parser.add_argument('--gpu', default='0') + parser.add_argument('--verbose', type=bool, default=True) + args = parser.parse_args() + + os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' + os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) + + load_pretrained_var(args.source_path, args.target_path, args.verbose) diff --git a/zoo/OcCo/OcCo_TF/utils/transform_nets.py b/zoo/OcCo/OcCo_TF/utils/transform_nets.py new file mode 100644 index 0000000..a034c34 --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/transform_nets.py @@ -0,0 +1,153 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com + +import os, sys, numpy as np, tensorflow as tf +import tf_util + + +def input_transform_net_dgcnn(edge_feature, is_training, bn_decay=None, K=3): + """ Input (XYZ) Transform Net, input is BxNx3 gray image + Return: + Transformation matrix of size 3xK """ + + batch_size = edge_feature.get_shape()[0].value + num_point = edge_feature.get_shape()[1].value + + net = tf_util.conv2d(edge_feature, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay) + + net = tf.reduce_max(net, axis=-2, keep_dims=True) + + net = tf_util.conv2d(net, 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay) + net = tf_util.max_pool2d(net, [num_point, 1], + padding='VALID', scope='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay) + + with tf.variable_scope('transform_XYZ') as sc: + # assert(K==3) + with tf.device('/cpu:0'): + weights = tf.get_variable('weights', [256, K * K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [K * K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant(np.eye(K).flatten(), dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, K, K]) + return transform + + +def input_transform_net(point_cloud, is_training, bn_decay=None, K=3): + """ Input (XYZ) Transform Net, input is BxNx3 gray image + Return: + Transformation matrix of size 3xK """ + # print('the input shape for t-net:', point_cloud.get_shape()) + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + # point_cloud -> Tensor of (batch size, number of points, 3d coordinates) + + input_image = tf.expand_dims(point_cloud, -1) + # point_cloud -> (batch size, number of points, 3d coordinates, 1) + # batch size * height * width * channel + + '''tf_util.conv2d(inputs, num_output_channels, kernel_size, scope, stride=[1, 1], padding='SAME', + use_xavier=True, stddev=1e-3, weight_decay=0.0, activation_fn=tf.nn.relu, + bn=False, bn_decay=None(default is set to 0.9), is_training=None)''' + net = tf_util.conv2d(input_image, 64, [1, 3], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay) + + # net = mlp_conv(input_image, [64, 128, 1024]) + net = tf_util.max_pool2d(net, [num_point, 1], + padding='VALID', scope='tmaxpool') + '''(default stride: (2, 2))''' + # net = tf.reduce_max(net, axis=1, keep_dims=True, name='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay) + + with tf.variable_scope('transform_XYZ') as sc: + assert (K == 3) + weights = tf.get_variable('weights', [256, 3 * K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [3 * K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant([1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, 3, K]) + return transform + + +def feature_transform_net(inputs, is_training, bn_decay=None, K=64): + """ Feature Transform Net, input is BxNx1xK + Return: + Transformation matrix of size KxK """ + batch_size = inputs.get_shape()[0].value + num_point = inputs.get_shape()[1].value + + net = tf_util.conv2d(inputs, 64, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1, 1], + padding='VALID', stride=[1, 1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay) + net = tf_util.max_pool2d(net, [num_point, 1], + padding='VALID', scope='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay) + + with tf.variable_scope('transform_feat') as sc: + weights = tf.get_variable('weights', [256, K * K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [K * K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant(np.eye(K).flatten(), dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, K, K]) + return transform diff --git a/zoo/OcCo/OcCo_TF/utils/visu_util.py b/zoo/OcCo/OcCo_TF/utils/visu_util.py new file mode 100644 index 0000000..71fbfda --- /dev/null +++ b/zoo/OcCo/OcCo_TF/utils/visu_util.py @@ -0,0 +1,43 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com +# Original Author: Wentao Yuan (wyuan1@cs.cmu.edu) 05/31/2018 + +import numpy as np +from matplotlib import pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from open3d.open3d.io import read_point_cloud +# from open3d.open3d_pybind.io import read_point_cloud + + +def plot_pcd_three_views(filename, pcds, titles, suptitle='', sizes=None, cmap='Reds', zdir='y', + xlim=(-0.3, 0.3), ylim=(-0.3, 0.3), zlim=(-0.3, 0.3)): + if sizes is None: + sizes = [0.5 for _ in range(len(pcds))] + fig = plt.figure(figsize=(len(pcds) * 3, 9)) + for i in range(3): + elev = 30 + azim = -45 + 90 * i + for j, (pcd, size) in enumerate(zip(pcds, sizes)): + color = pcd[:, 0] + ax = fig.add_subplot(3, len(pcds), i * len(pcds) + j + 1, projection='3d') + ax.view_init(elev, azim) + ax.scatter(pcd[:, 0], pcd[:, 1], pcd[:, 2], zdir=zdir, c=color, s=size, cmap=cmap, vmin=-1, vmax=0.5) + ax.set_title(titles[j]) + ax.set_axis_off() + ax.set_xlim(xlim) + ax.set_ylim(ylim) + ax.set_zlim(zlim) + plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.9, wspace=0.1, hspace=0.1) + plt.suptitle(suptitle) + fig.savefig(filename) + plt.close(fig) + + +if __name__ == "__main__": + filenames = ['airplane.pcd', 'car.pcd', 'chair.pcd', 'lamp.pcd'] # '../demo_data' + for file in filenames: + filename = file.replace('.pcd', '') + pcds = [np.asarray(read_point_cloud('../demo_data/' + file).points)] + titles = ['viewpoint 1', 'viewpoint 2', 'viewpoint 3'] + plot_pcd_three_views( + filename, pcds, titles, suptitle=filename, sizes=None, cmap='viridis', zdir='y', + xlim=(-0.3, 0.3), ylim=(-0.3, 0.3), zlim=(-0.3, 0.3)) diff --git a/zoo/OcCo/OcCo_Torch/Requirements_Torch.txt b/zoo/OcCo/OcCo_Torch/Requirements_Torch.txt new file mode 100644 index 0000000..8e6028c --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/Requirements_Torch.txt @@ -0,0 +1,14 @@ +# Originally Designed for Docker Environment: +# PyTorch 1.3.0, Python 3.6, CUDA 10.1 +# install PyTorch first if not use docker +lmdb >= 0.98 +h5py >= 2.10.0 +future >= 0.18.2 +pyarrow >= 1.0.0 +open3d == 0.9.0.0 +matplotlib >= 3.3.0 +tensorpack == 0.9.8 +tensorboard >= 1.15.0 +python-prctl >= 1.5.0 +open3d-python==0.7.0.0 +scikit-learn >= 0.23.1 diff --git a/zoo/OcCo/OcCo_Torch/bash_template/train_cls_template.sh b/zoo/OcCo/OcCo_Torch/bash_template/train_cls_template.sh new file mode 100644 index 0000000..11553e4 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/bash_template/train_cls_template.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +cd ../ + +# training pointnet on ModelNet40, from scratch +python train_cls.py \ + --gpu 0 \ + --model pointnet_cls \ + --dataset modelnet40 \ + --log_dir modelnet40_pointnet_scratch ; + + +# fine tuning pcn on ScanNet10, using jigsaw pre-trained checkpoints +python train_cls.py \ + --gpu 0 \ + --model pcn_cls \ + --dataset scannet10 \ + --log_dir scannet10_pcn_jigsaw \ + --restore \ + --restore_path log/jigsaw/modelnet_pcn_vanilla/checkpoints/best_model.pth ; + + +# fine tuning dgcnn on ScanObjectNN(OBJ_BG), using jigsaw pre-trained checkpoints +python train_cls.py \ + --gpu 0,1 \ + --epoch 250 \ + --use_sgd \ + --scheduler cos \ + --model dgcnn_cls \ + --dataset scanobjectnn \ + --bn \ + --log_dir scanobjectnn_dgcnn_occo \ + --restore \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; + + +# test pointnet on ModelNet40 from pre-trained checkpoints +python train_cls.py \ + --gpu 1 \ + --epoch 1 \ + --mode test \ + --model pointnet_cls \ + --dataset modelnet40 \ + --log_dir modelnet40_pointnet_scratch \ + --restore \ + --restore_path log/cls/modelnet40_pointnet_scratch/checkpoints/best_model.pth ; diff --git a/zoo/OcCo/OcCo_Torch/bash_template/train_completion_template.sh b/zoo/OcCo/OcCo_Torch/bash_template/train_completion_template.sh new file mode 100644 index 0000000..f9f4fb6 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/bash_template/train_completion_template.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +cd ../ + +# train pointnet-occo model on ModelNet, from scratch +python train_completion.py \ + --gpu 0,1 \ + --dataset modelnet \ + --model pointnet_occo \ + --log_dir modelnet_pointnet_vanilla ; + +# train dgcnn-occo model on ShapeNet, from scratch +python train_completion.py \ + --gpu 0,1 \ + --batch_size 16 \ + --dataset shapenet \ + --model dgcnn_occo \ + --log_dir shapenet_dgcnn_vanilla ; diff --git a/zoo/OcCo/OcCo_Torch/bash_template/train_jigsaw_template.sh b/zoo/OcCo/OcCo_Torch/bash_template/train_jigsaw_template.sh new file mode 100644 index 0000000..e445843 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/bash_template/train_jigsaw_template.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +cd ../ + +# train pointnet_jigsaw on ModelNet40, from scratch +python train_jigsaw.py \ + --gpu 0 \ + --model pointnet_jigsaw \ + --bn_decay \ + --xavier_init \ + --optimiser Adam \ + --scheduler step \ + --log_dir modelnet40_pointnet_scratch ; + + +# train dgcnn_jigsaw on ModelNet40, from scratch +python train_jigsaw.py \ + --gpu 0 \ + --model dgcnn_jigsaw \ + --optimiser SGD \ + --scheduler cos \ + --log_dir modelnet40_dgcnn_scartch ; diff --git a/zoo/OcCo/OcCo_Torch/bash_template/train_partseg_template.sh b/zoo/OcCo/OcCo_Torch/bash_template/train_partseg_template.sh new file mode 100644 index 0000000..7eaf085 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/bash_template/train_partseg_template.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +cd ../ + +# training pointnet on ShapeNetPart, from scratch +python train_partseg.py \ + --gpu 0 \ + --normal \ + --bn_decay \ + --xavier_init \ + --model pointnet_partseg \ + --log_dir pointnet_scratch ; + + +# fine tuning pcn on ShapeNetPart, using jigsaw pre-trained checkpoints +python train_partseg.py \ + --gpu 0 \ + --normal \ + --bn_decay \ + --xavier_init \ + --model pcn_partseg \ + --log_dir pcn_jigsaw \ + --restore \ + --restore_path log/jigsaw/modelnet_pcn_vanilla/checkpoints/best_model.pth ; + + +# fine tuning dgcnn on ShapeNetPart, using occo pre-trained checkpoints +python train_partseg.py \ + --gpu 0, 1 \ + --normal \ + --use_sgd \ + --xavier_init \ + --scheduler cos \ + --model dgcnn_partseg \ + --log_dir dgcnn_occo \ + --restore \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; + + +# test fine tuned pointnet on ShapeNetPart, using multiple votes +python train_partseg.py \ + --gpu 0 \ + --epoch 1 \ + --mode test \ + --num_votes 3 \ + --model pointnet_partseg \ + --log_dir pointnet_scratch \ + --restore \ + --restore_path log/partseg/pointnet_occo/checkpoints/best_model.pth ; diff --git a/zoo/OcCo/OcCo_Torch/bash_template/train_semseg_template.sh b/zoo/OcCo/OcCo_Torch/bash_template/train_semseg_template.sh new file mode 100644 index 0000000..39c026c --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/bash_template/train_semseg_template.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +cd ../ + +# train pointnet_semseg on 6-fold cv of S3DIS, from scratch +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --model pointnet_semseg \ + --bn_decay \ + --xavier_init \ + --test_area ${area} \ + --scheduler step \ + --log_dir pointnet_area${area}_scratch ; +done + +# fine tune pcn_semseg on 6-fold cv of S3DIS, using jigsaw pre-trained weights +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --model pcn_semseg \ + --bn_decay \ + --test_area ${area} \ + --log_dir pcn_area${area}_jigsaw \ + --restore \ + --restore_path log/jigsaw/modelnet_pcn_vanilla/checkpoints/best_model.pth ; +done + +# fine tune dgcnn_semseg on 6-fold cv of S3DIS, using occo pre-trained weights +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --test_area ${area} \ + --optimizer sgd \ + --scheduler cos \ + --model dgcnn_semseg \ + --log_dir dgcnn_area${area}_occo \ + --restore \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; +done diff --git a/zoo/OcCo/OcCo_Torch/bash_template/train_svm_template.sh b/zoo/OcCo/OcCo_Torch/bash_template/train_svm_template.sh new file mode 100644 index 0000000..6c747e4 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/bash_template/train_svm_template.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +cd ../ + +# fit a linear svm on ModelNet40 encoded by OcCo PointNet +python train_svm.py \ + --gpu 0 \ + --model pointnet_util \ + --dataset modelnet40 \ + --restore_path log/completion/modelnet_pointnet_vanilla/checkpoints/best_model.pth ; + + +# grid search the best parameters of a svm with rbf kernel on ModelNet40 encoded by OcCo PCN +python train_svm.py \ + --gpu 0 \ + --grid_search \ + --model pcn_util \ + --dataset modelnet40 \ + --restore_path log/completion/modelnet_pcn_vanilla/checkpoints/best_model.pth ; + + +# ... on ScanObjectNN(OBJ_BG) encoded by OcCo DGCNN +python train_svm.py \ + --gpu 0 \ + --grid_search \ + --batch_size 8 \ + --model dgcnn_util \ + --dataset scanobjectnn \ + --bn \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; diff --git a/zoo/OcCo/OcCo_Torch/chamfer_distance/__init__.py b/zoo/OcCo/OcCo_Torch/chamfer_distance/__init__.py new file mode 100644 index 0000000..2e15be7 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/chamfer_distance/__init__.py @@ -0,0 +1 @@ +from .chamfer_distance import ChamferDistance diff --git a/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.cpp b/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.cpp new file mode 100644 index 0000000..40f3d79 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.cpp @@ -0,0 +1,185 @@ +#include + +// CUDA forward declarations +int ChamferDistanceKernelLauncher( + const int b, const int n, + const float* xyz, + const int m, + const float* xyz2, + float* result, + int* result_i, + float* result2, + int* result2_i); + +int ChamferDistanceGradKernelLauncher( + const int b, const int n, + const float* xyz1, + const int m, + const float* xyz2, + const float* grad_dist1, + const int* idx1, + const float* grad_dist2, + const int* idx2, + float* grad_xyz1, + float* grad_xyz2); + + +void chamfer_distance_forward_cuda( + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor dist1, + const at::Tensor dist2, + const at::Tensor idx1, + const at::Tensor idx2) +{ + ChamferDistanceKernelLauncher(xyz1.size(0), xyz1.size(1), xyz1.data(), + xyz2.size(1), xyz2.data(), + dist1.data(), idx1.data(), + dist2.data(), idx2.data()); +} + +void chamfer_distance_backward_cuda( + const at::Tensor xyz1, + const at::Tensor xyz2, + at::Tensor gradxyz1, + at::Tensor gradxyz2, + at::Tensor graddist1, + at::Tensor graddist2, + at::Tensor idx1, + at::Tensor idx2) +{ + ChamferDistanceGradKernelLauncher(xyz1.size(0), xyz1.size(1), xyz1.data(), + xyz2.size(1), xyz2.data(), + graddist1.data(), idx1.data(), + graddist2.data(), idx2.data(), + gradxyz1.data(), gradxyz2.data()); +} + + +void nnsearch( + const int b, const int n, const int m, + const float* xyz1, + const float* xyz2, + float* dist, + int* idx) +{ + for (int i = 0; i < b; i++) { + for (int j = 0; j < n; j++) { + const float x1 = xyz1[(i*n+j)*3+0]; + const float y1 = xyz1[(i*n+j)*3+1]; + const float z1 = xyz1[(i*n+j)*3+2]; + double best = 0; + int besti = 0; + for (int k = 0; k < m; k++) { + const float x2 = xyz2[(i*m+k)*3+0] - x1; + const float y2 = xyz2[(i*m+k)*3+1] - y1; + const float z2 = xyz2[(i*m+k)*3+2] - z1; + const double d=x2*x2+y2*y2+z2*z2; + if (k==0 || d < best){ + best = d; + besti = k; + } + } + dist[i*n+j] = best; + idx[i*n+j] = besti; + } + } +} + + +void chamfer_distance_forward( + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor dist1, + const at::Tensor dist2, + const at::Tensor idx1, + const at::Tensor idx2) +{ + const int batchsize = xyz1.size(0); + const int n = xyz1.size(1); + const int m = xyz2.size(1); + + const float* xyz1_data = xyz1.data(); + const float* xyz2_data = xyz2.data(); + float* dist1_data = dist1.data(); + float* dist2_data = dist2.data(); + int* idx1_data = idx1.data(); + int* idx2_data = idx2.data(); + + nnsearch(batchsize, n, m, xyz1_data, xyz2_data, dist1_data, idx1_data); + nnsearch(batchsize, m, n, xyz2_data, xyz1_data, dist2_data, idx2_data); +} + + +void chamfer_distance_backward( + const at::Tensor xyz1, + const at::Tensor xyz2, + at::Tensor gradxyz1, + at::Tensor gradxyz2, + at::Tensor graddist1, + at::Tensor graddist2, + at::Tensor idx1, + at::Tensor idx2) +{ + const int b = xyz1.size(0); + const int n = xyz1.size(1); + const int m = xyz2.size(1); + + const float* xyz1_data = xyz1.data(); + const float* xyz2_data = xyz2.data(); + float* gradxyz1_data = gradxyz1.data(); + float* gradxyz2_data = gradxyz2.data(); + float* graddist1_data = graddist1.data(); + float* graddist2_data = graddist2.data(); + const int* idx1_data = idx1.data(); + const int* idx2_data = idx2.data(); + + for (int i = 0; i < b*n*3; i++) + gradxyz1_data[i] = 0; + for (int i = 0; i < b*m*3; i++) + gradxyz2_data[i] = 0; + for (int i = 0;i < b; i++) { + for (int j = 0; j < n; j++) { + const float x1 = xyz1_data[(i*n+j)*3+0]; + const float y1 = xyz1_data[(i*n+j)*3+1]; + const float z1 = xyz1_data[(i*n+j)*3+2]; + const int j2 = idx1_data[i*n+j]; + + const float x2 = xyz2_data[(i*m+j2)*3+0]; + const float y2 = xyz2_data[(i*m+j2)*3+1]; + const float z2 = xyz2_data[(i*m+j2)*3+2]; + const float g = graddist1_data[i*n+j]*2; + + gradxyz1_data[(i*n+j)*3+0] += g*(x1-x2); + gradxyz1_data[(i*n+j)*3+1] += g*(y1-y2); + gradxyz1_data[(i*n+j)*3+2] += g*(z1-z2); + gradxyz2_data[(i*m+j2)*3+0] -= (g*(x1-x2)); + gradxyz2_data[(i*m+j2)*3+1] -= (g*(y1-y2)); + gradxyz2_data[(i*m+j2)*3+2] -= (g*(z1-z2)); + } + for (int j = 0; j < m; j++) { + const float x1 = xyz2_data[(i*m+j)*3+0]; + const float y1 = xyz2_data[(i*m+j)*3+1]; + const float z1 = xyz2_data[(i*m+j)*3+2]; + const int j2 = idx2_data[i*m+j]; + const float x2 = xyz1_data[(i*n+j2)*3+0]; + const float y2 = xyz1_data[(i*n+j2)*3+1]; + const float z2 = xyz1_data[(i*n+j2)*3+2]; + const float g = graddist2_data[i*m+j]*2; + gradxyz2_data[(i*m+j)*3+0] += g*(x1-x2); + gradxyz2_data[(i*m+j)*3+1] += g*(y1-y2); + gradxyz2_data[(i*m+j)*3+2] += g*(z1-z2); + gradxyz1_data[(i*n+j2)*3+0] -= (g*(x1-x2)); + gradxyz1_data[(i*n+j2)*3+1] -= (g*(y1-y2)); + gradxyz1_data[(i*n+j2)*3+2] -= (g*(z1-z2)); + } + } +} + + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &chamfer_distance_forward, "ChamferDistance forward"); + m.def("forward_cuda", &chamfer_distance_forward_cuda, "ChamferDistance forward (CUDA)"); + m.def("backward", &chamfer_distance_backward, "ChamferDistance backward"); + m.def("backward_cuda", &chamfer_distance_backward_cuda, "ChamferDistance backward (CUDA)"); +} diff --git a/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.cu b/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.cu new file mode 100644 index 0000000..f10f2ba --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.cu @@ -0,0 +1,209 @@ +#include + +#include +#include + +__global__ +void ChamferDistanceKernel( + int b, + int n, + const float* xyz, + int m, + const float* xyz2, + float* result, + int* result_i) +{ + const int batch=512; + __shared__ float buf[batch*3]; + for (int i=blockIdx.x;ibest){ + result[(i*n+j)]=best; + result_i[(i*n+j)]=best_i; + } + } + __syncthreads(); + } + } +} + +void ChamferDistanceKernelLauncher( + const int b, const int n, + const float* xyz, + const int m, + const float* xyz2, + float* result, + int* result_i, + float* result2, + int* result2_i) +{ + ChamferDistanceKernel<<>>(b, n, xyz, m, xyz2, result, result_i); + ChamferDistanceKernel<<>>(b, m, xyz2, n, xyz, result2, result2_i); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("error in chamfer distance updateOutput: %s\n", cudaGetErrorString(err)); +} + + +__global__ +void ChamferDistanceGradKernel( + int b, int n, + const float* xyz1, + int m, + const float* xyz2, + const float* grad_dist1, + const int* idx1, + float* grad_xyz1, + float* grad_xyz2) +{ + for (int i = blockIdx.x; i>>(b, n, xyz1, m, xyz2, grad_dist1, idx1, grad_xyz1, grad_xyz2); + ChamferDistanceGradKernel<<>>(b, m, xyz2, n, xyz1, grad_dist2, idx2, grad_xyz2, grad_xyz1); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("error in chamfer distance get grad: %s\n", cudaGetErrorString(err)); +} diff --git a/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.py b/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.py new file mode 100644 index 0000000..0db61e8 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/chamfer_distance/chamfer_distance.py @@ -0,0 +1,97 @@ +# Ref: https://github.com/chrdiller/pyTorchChamferDistance +import os, torch, torch.nn as nn +from torch.utils.cpp_extension import load + +basedir = os.path.dirname(__file__) +cd = load(name="cd", sources=[ + os.path.join(basedir, "chamfer_distance.cpp"), + os.path.join(basedir, "chamfer_distance.cu")]) + +class ChamferDistanceFunction(torch.autograd.Function): + @staticmethod + def forward(ctx, xyz1, xyz2): + batchsize, n, _ = xyz1.size() + _, m, _ = xyz2.size() + xyz1 = xyz1.contiguous() + xyz2 = xyz2.contiguous() + dist1 = torch.zeros(batchsize, n) + dist2 = torch.zeros(batchsize, m) + + idx1 = torch.zeros(batchsize, n, dtype=torch.int) + idx2 = torch.zeros(batchsize, m, dtype=torch.int) + + if not xyz1.is_cuda: + cd.forward(xyz1, xyz2, dist1, dist2, idx1, idx2) + else: + dist1 = dist1.cuda() + dist2 = dist2.cuda() + idx1 = idx1.cuda() + idx2 = idx2.cuda() + cd.forward_cuda(xyz1, xyz2, dist1, dist2, idx1, idx2) + + ctx.save_for_backward(xyz1, xyz2, idx1, idx2) + + return dist1, dist2 + + @staticmethod + def backward(ctx, graddist1, graddist2): + xyz1, xyz2, idx1, idx2 = ctx.saved_tensors + + graddist1 = graddist1.contiguous() + graddist2 = graddist2.contiguous() + + gradxyz1 = torch.zeros(xyz1.size()) + gradxyz2 = torch.zeros(xyz2.size()) + + if not graddist1.is_cuda: + cd.backward(xyz1, xyz2, gradxyz1, gradxyz2, graddist1, graddist2, idx1, idx2) + else: + gradxyz1 = gradxyz1.cuda() + gradxyz2 = gradxyz2.cuda() + cd.backward_cuda(xyz1, xyz2, gradxyz1, gradxyz2, graddist1, graddist2, idx1, idx2) + + return gradxyz1, gradxyz2 + + +class ChamferDistance(nn.Module): + def forward(self, xyz1, xyz2): + return ChamferDistanceFunction.apply(xyz1, xyz2) + + +class get_model(nn.Module): + def __init__(self, channel=3): + super(get_model, self).__init__() + + self.conv1 = nn.Conv1d(channel, 128, 1) + + def forward(self, x): + _, D, N = x.size() + x = self.conv1(x) + x = x.view(-1, 128, 1).repeat(1, 1, 3) + return x + + +if __name__ == '__main__': + + import random, numpy as np + + '''Sanity Check on the Consistency with TensorFlow''' + random.seed(100) + np.random.seed(100) + + chamfer_dist = ChamferDistance() + # model = get_model().to(torch.device("cuda")) + # model.train() + + xyz1 = np.random.randn(32, 16384, 3).astype('float32') + xyz2 = np.random.randn(32, 1024, 3).astype('float32') + + # pdb.set_trace() + # pc1 = torch.randn(1, 100, 3).cuda().contiguous() + # pc1_new = model(pc1.transpose(2, 1)) + # pc2 = torch.randn(1, 50, 3).cuda().contiguous() + + dist1, dist2 = chamfer_dist(torch.Tensor(xyz1), torch.Tensor(xyz2)) + loss = (torch.mean(dist1)) + (torch.mean(dist2)) + print(loss) + # loss.backward() diff --git a/zoo/OcCo/OcCo_Torch/chamfer_distance/readme.md b/zoo/OcCo/OcCo_Torch/chamfer_distance/readme.md new file mode 100644 index 0000000..5ef6244 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/chamfer_distance/readme.md @@ -0,0 +1,23 @@ +# Chamfer Distance for PyTorch + +This is an implementation of the Chamfer Distance as a module for PyTorch. It is written as a custom C++/CUDA extension. It is developed by [Chris](https://github.com/chrdiller/pyTorchChamferDistance) at TUM. + +As it is using PyTorch's [JIT compilation](https://pytorch.org/tutorials/advanced/cpp_extension.html), there are no additional prerequisite steps (e.g., `build` or `setup`) that have to be taken. Simply import the module as shown below, CUDA and C++ code will be compiled on the first run, which additionally takes a few seconds. + +### Usage +```python +import torch +from chamfer_distance import ChamferDistance +chamfer_dist = ChamferDistance() + +# both points clouds have shapes of (batch_size, n_points, 3), wherer n_points can be different + +dist1, dist2 = chamfer_dist(points, points_reconstructed) +loss = (torch.mean(torch.sqrt(dist1)) + torch.mean(torch.sqrt(dist2)))/2 +``` + +### Integration +This code has been integrated into the [Kaolin](https://github.com/NVIDIAGameWorks/kaolin) library for 3D Deep Learning by NVIDIAGameWorks. You probably want to take a look at it if you are working on some 3D ([pytorch3d](https://github.com/facebookresearch/pytorch3d) is also recommended) + +### Earth Mover Distance +For the implementation of earth mover distance, we recommend [Kaichun's](https://github.com/daerduoCarey/PyTorchEMD) :) diff --git a/zoo/OcCo/OcCo_Torch/data/readme.md b/zoo/OcCo/OcCo_Torch/data/readme.md new file mode 100644 index 0000000..ed62802 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/data/readme.md @@ -0,0 +1,54 @@ +## Data Setup + +#### OcCo + +We construct the training data based on ModelNet in the same format of the [data](https://drive.google.com/drive/folders/1M_lJN14Ac1RtPtEQxNlCV9e8pom3U6Pa) provided in PCN which is based on ShapeNet. **You can find our generated dataset based on ModelNet40 [here](https://drive.google.com/drive/folders/1gXNcARYxAh8I4UskbDprJ5fkbDSKPAsH?usp=sharing)**, this is similar with the resources used in the PCN and its follow-ups (summarised [here](https://github.com/hansen7/OcCo/issues/2)). + +If you want to generate your own data, please check our provided instructions from render/readme.md. + + + +#### Classification + +In the classification tasks, we use the following benchmark datasets: + +- `ModelNet10`[[link](http://vision.princeton.edu/projects/2014/3DShapeNets/ModelNet10.zip)] + +- `ModelNet40`[[link](https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip)] + +- `ShapeNet10` and `ScanNet10` are from [PointDAN](https://github.com/canqin001/PointDAN)] + +- `ScanObjectNN` are obtained via enquiry to the author of [[paper](https://arxiv.org/abs/1908.04616)] + +- `ShapeNet/ModelNet Occluded` are generated via `utils/lmdb2hdf5.py` on the OcCo pre-trained data: + + ```bash + python lmdb2hdf5.py \ + --partial \ + --num_scan 10 \ + --fname train \ + --lmdb_path ../data/modelnet40_pcn \ + --hdf5_path ../data/modelnet40/hdf5_partial_1024 ; + ``` + +For `ModelNet40`, we noticed that this newer [source](https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip) provided in PointNet++ will result in performance gains, yet we stick to the original data used in the PointNet and DGCNN to make a fair comparison. + + + +#### Semantic Segmentation + +We use the provided S3DIS [data](https://github.com/charlesq34/pointnet/blob/master/sem_seg/download_data.sh) from PointNet, which is also used in DGCNN. + +Please see [here](https://github.com/charlesq34/pointnet/blob/master/sem_seg/download_data.sh) for the download details, it is worth mentioning that if you download from the original S3DIS and preprocess via utils/collect_indoor3d_data.pyΒ and utils/gen_indoor3d_h5.py, you need to delete an extra symbol in the raw file ([reference](https://github.com/charlesq34/pointnet/issues/45)). + + + +#### Part Segmentation + +we use the data provided in the PointNet, which is also used in DGCNN. + + + +#### Jigsaw Puzzles + +Please check `utils/3DPC_Data_Gen.py` for details, as well as the original paper. diff --git a/zoo/OcCo/OcCo_Torch/data/shapenet_names.json b/zoo/OcCo/OcCo_Torch/data/shapenet_names.json new file mode 100644 index 0000000..9f07300 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/data/shapenet_names.json @@ -0,0 +1,10 @@ +{ + "02691156": 0, + "02933112": 1, + "02958343": 2, + "03001627": 3, + "03636649": 4, + "04256520": 5, + "04379243": 6, + "04530566": 7 + } diff --git a/zoo/OcCo/OcCo_Torch/docker/.dockerignore b/zoo/OcCo/OcCo_Torch/docker/.dockerignore new file mode 100644 index 0000000..814dc9b --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/docker/.dockerignore @@ -0,0 +1,3 @@ +*/data +*/log +*/__pycache__ diff --git a/zoo/OcCo/OcCo_Torch/docker/Dockerfile_Torch b/zoo/OcCo/OcCo_Torch/docker/Dockerfile_Torch new file mode 100644 index 0000000..e5397a7 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/docker/Dockerfile_Torch @@ -0,0 +1,29 @@ +# https://github.com/pytorch/pytorch/issues/31171#issuecomment-565887573 +FROM pytorch/pytorch:1.3-cuda10.1-cudnn7-devel + +WORKDIR /workspace/OcCo_Torch +RUN apt-get update +RUN apt-get -y install apt-file apt-utils +RUN apt-file update +RUN apt-get -y install build-essential libcap-dev vim screen +COPY ./Requirements_Torch.txt /workspace/OcCo_Torch +RUN pip install -r Requirements_Torch.txt + +RUN mkdir /home/hcw +RUN chmod -R 777 /home/hcw +RUN chmod 777 /usr/bin +RUN chmod 777 /bin +RUN chmod 777 /usr/local/ +RUN apt-get -y update +RUN apt-get -y install libgl1-mesa-glx + +# RUN apt-get -y install gcc +# RUN apt-get -y install g++ +# RUN apt-get -y upgrade libstdc++6 + +# Optional: Install the TensorRT runtime (must be after CUDA install) +# RUN apt update +# RUN apt -y install libnvinfer4=4.1.2-1+cuda9.0 + +RUN useradd hcw +WORKDIR /workspace/OcCo_Torch diff --git a/zoo/OcCo/OcCo_Torch/docker/build_docker_torch.sh b/zoo/OcCo/OcCo_Torch/docker/build_docker_torch.sh new file mode 100644 index 0000000..c24d176 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/docker/build_docker_torch.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker build ../ --rm -t occo_torch -f ./Dockerfile_Torch diff --git a/zoo/OcCo/OcCo_Torch/docker/launch_docker_torch.sh b/zoo/OcCo/OcCo_Torch/docker/launch_docker_torch.sh new file mode 100644 index 0000000..75fb524 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/docker/launch_docker_torch.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +docker run -it \ + --rm \ + --shm-size=1g \ + --runtime=nvidia \ + --ulimit memlock=-1 \ + --ulimit stack=67108864 \ + -v "$(dirname $PWD):/workspace/OcCo_Torch" \ + -v "/scratch/hw501/data_source/:/scratch/hw501/data_source/" \ + -v "/scratches/mario/hw501/data_source:/scratches/mario/hw501/data_source/" \ + -v "/scratches/weatherwax_2/hwang/OcCo/data/:/scratches/weatherwax_2/hwang/OcCo/data/" \ + occo_torch bash + +# -v + any external directories if you are using them diff --git a/zoo/OcCo/OcCo_Torch/models/dgcnn_cls.py b/zoo/OcCo/OcCo_Torch/models/dgcnn_cls.py new file mode 100644 index 0000000..f2155d1 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/dgcnn_cls.py @@ -0,0 +1,97 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/pytorch/model.py + +import torch, torch.nn as nn, torch.nn.functional as F +from dgcnn_util import get_graph_feature + +class get_model(nn.Module): + + def __init__(self, args, num_channel=3, num_class=40, **kwargs): + super(get_model, self).__init__() + self.args = args + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(128) + self.bn4 = nn.BatchNorm2d(256) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + + self.conv1 = nn.Sequential(nn.Conv2d(num_channel*2, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 128, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(128*2, 256, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv1d(512, args.emb_dims, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + + self.linear1 = nn.Linear(args.emb_dims*2, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, num_class) + + def forward(self, x): + batch_size = x.size()[0] + x = get_graph_feature(x, k=self.args.k) + x = self.conv1(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.args.k) + x = self.conv2(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.args.k) + x = self.conv3(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x3, k=self.args.k) + x = self.conv4(x) + x4 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3, x4), dim=1) + + x = self.conv5(x) + x1 = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x2 = F.adaptive_avg_pool1d(x, 1).view(batch_size, -1) + x = torch.cat((x1, x2), 1) + + x = F.leaky_relu(self.bn6(self.linear1(x)), negative_slope=0.2) + x = self.dp1(x) + x = F.leaky_relu(self.bn7(self.linear2(x)), negative_slope=0.2) + x = self.dp2(x) + x = self.linear3(x) + return x + + +class get_loss(torch.nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def cal_loss(pred, gold, smoothing=True): + """Calculate cross entropy loss, apply label smoothing if needed.""" + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size()[1] + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) # (num_points, num_class) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + loss = -(one_hot * log_prb).sum(dim=1).mean() # ~ F.nll_loss(log_prb, gold) + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + def forward(self, pred, target): + return self.cal_loss(pred, target, smoothing=True) diff --git a/zoo/OcCo/OcCo_Torch/models/dgcnn_jigsaw.py b/zoo/OcCo/OcCo_Torch/models/dgcnn_jigsaw.py new file mode 100644 index 0000000..714fcef --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/dgcnn_jigsaw.py @@ -0,0 +1,112 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/AnTao97/dgcnn.pytorch/blob/master/model.py + +import torch, torch.nn as nn, torch.nn.functional as F +from dgcnn_util import get_graph_feature + + +class get_model(nn.Module): + def __init__(self, args, num_class, **kwargs): + super(get_model, self).__init__() + self.args = args + self.k = args.k + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(64) + self.bn4 = nn.BatchNorm2d(64) + self.bn5 = nn.BatchNorm2d(64) + self.bn6 = nn.BatchNorm1d(args.emb_dims) + self.bn7 = nn.BatchNorm1d(512) + self.bn8 = nn.BatchNorm1d(256) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + self.conv6 = nn.Sequential(nn.Conv1d(192, args.emb_dims, kernel_size=1, bias=False), + self.bn6, + nn.LeakyReLU(negative_slope=0.2)) + self.conv7 = nn.Sequential(nn.Conv1d(1216, 512, kernel_size=1, bias=False), + self.bn7, + nn.LeakyReLU(negative_slope=0.2)) + self.conv8 = nn.Sequential(nn.Conv1d(512, 256, kernel_size=1, bias=False), + self.bn8, + nn.LeakyReLU(negative_slope=0.2)) + self.dp1 = nn.Dropout(p=args.dropout) + self.conv9 = nn.Conv1d(256, num_class, kernel_size=1, bias=False) + + def forward(self, x): + + batch_size, _, num_points = x.size() + + x = get_graph_feature(x, self.k) + x = self.conv1(x) + x = self.conv2(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.k) + x = self.conv3(x) + x = self.conv4(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.k) + x = self.conv5(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3), dim=1) + + x = self.conv6(x) + x = x.max(dim=-1, keepdim=True)[0] + + x = x.repeat(1, 1, num_points) + x = torch.cat((x, x1, x2, x3), dim=1) + + x = self.conv7(x) + x = self.conv8(x) + x = self.dp1(x) + x = self.conv9(x) + # x = F.softmax(x, dim=1) + # x = F.log_softmax(x, dim=1) + '''add softmax: + https://towardsdatascience.com/cuda-error-device-side-assert-triggered-c6ae1c8fa4c3 + https://github.com/pytorch/pytorch/issues/1204 + ''' + return x + + +class get_loss(torch.nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def cal_loss(pred, gold, smoothing=False): + """Calculate cross entropy loss, apply label smoothing if needed.""" + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + loss = -(one_hot * log_prb).sum(dim=1).mean() # ~ F.nll_loss(log_prb, gold) + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + def forward(self, pred, target): + return self.cal_loss(pred, target, smoothing=False) diff --git a/zoo/OcCo/OcCo_Torch/models/dgcnn_occo.py b/zoo/OcCo/OcCo_Torch/models/dgcnn_occo.py new file mode 100644 index 0000000..9aa92c8 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/dgcnn_occo.py @@ -0,0 +1,159 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/models/pcn_cd.py +# Ref: https://github.com/AnTao97/UnsupervisedPointCloudReconstruction/blob/master/model.py + +import sys, torch, itertools, numpy as np, torch.nn as nn, torch.nn.functional as F +from dgcnn_util import get_graph_feature +sys.path.append("../chamfer_distance") +from chamfer_distance import ChamferDistance + + +class get_model(nn.Module): + def __init__(self, **kwargs): + super(get_model, self).__init__() + + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_coarse = 1024 + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + self.__dict__.update(kwargs) # to update args, num_coarse, grid_size, grid_scale + + self.num_fine = self.grid_size ** 2 * self.num_coarse # 16384 + self.meshgrid = [[-self.grid_scale, self.grid_scale, self.grid_size], + [-self.grid_scale, self.grid_scale, self.grid_size]] + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(128) + self.bn4 = nn.BatchNorm2d(256) + self.bn5 = nn.BatchNorm1d(self.args.emb_dims) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 128, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(128*2, 256, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv1d(512, self.args.emb_dims, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + + self.folding1 = nn.Sequential( + nn.Linear(self.args.emb_dims, 1024), + nn.ReLU(), + nn.Linear(1024, 1024), + nn.ReLU(), + nn.Linear(1024, self.num_coarse * 3)) + + self.folding2 = nn.Sequential( + nn.Conv1d(1024+2+3, 512, 1), + nn.ReLU(), + nn.Conv1d(512, 512, 1), + nn.ReLU(), + nn.Conv1d(512, 3, 1)) + + def build_grid(self, batch_size): + + x, y = np.linspace(*self.meshgrid[0]), np.linspace(*self.meshgrid[1]) + points = np.array(list(itertools.product(x, y))) + points = np.repeat(points[np.newaxis, ...], repeats=batch_size, axis=0) + + return torch.tensor(points).float().to(self.device) + + def tile(self, tensor, multiples): + # substitute for tf.tile: + # https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/tile + # Ref: https://discuss.pytorch.org/t/how-to-tile-a-tensor/13853/3 + def tile_single_axis(a, dim, n_tile): + init_dim = a.size(dim) + repeat_idx = [1] * a.dim() + repeat_idx[dim] = n_tile + a = a.repeat(*repeat_idx) + order_index = torch.Tensor( + np.concatenate([init_dim * np.arange(n_tile) + i for i in range(init_dim)])).long() + return torch.index_select(a, dim, order_index.to(self.device)) + + for dim, n_tile in enumerate(multiples): + if n_tile == 1: + continue + tensor = tile_single_axis(tensor, dim, n_tile) + return tensor + + @staticmethod + def expand_dims(tensor, dim): + # substitute for tf.expand_dims: + # https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/expand_dims + return tensor.unsqueeze(-1).transpose(-1, dim) + + def forward(self, x): + + batch_size = x.size()[0] + x = get_graph_feature(x, k=self.args.k) + x = self.conv1(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.args.k) + x = self.conv2(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.args.k) + x = self.conv3(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x3, k=self.args.k) + x = self.conv4(x) + x4 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3, x4), dim=1) + x = self.conv5(x) + feature = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + # x1 = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + # x2 = F.adaptive_avg_pool1d(x, 1).view(batch_size, -1) + # feature = torch.cat((x1, x2), 1) + + coarse = self.folding1(feature) + coarse = coarse.view(-1, self.num_coarse, 3) + + grid = self.build_grid(x.size()[0]) + grid_feat = grid.repeat(1, self.num_coarse, 1) + + point_feat = self.tile(self.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = point_feat.view([-1, self.num_fine, 3]) + + global_feat = self.tile(self.expand_dims(feature, 1), [1, self.num_fine, 1]) + feat = torch.cat([grid_feat, point_feat, global_feat], dim=2) + + center = self.tile(self.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = center.view([-1, self.num_fine, 3]) + + fine = self.folding2(feat.transpose(2, 1)).transpose(2, 1) + center + + return coarse, fine + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def dist_cd(pc1, pc2): + chamfer_dist = ChamferDistance() + dist1, dist2 = chamfer_dist(pc1, pc2) + return (torch.mean(torch.sqrt(dist1)) + torch.mean(torch.sqrt(dist2)))/2 + + def forward(self, coarse, fine, gt, alpha): + return self.dist_cd(coarse, gt) + alpha * self.dist_cd(fine, gt) + + +if __name__ == '__main__': + + model = get_model() + print(model) + input_pc = torch.rand(7, 3, 1024) + x = model(input_pc) diff --git a/zoo/OcCo/OcCo_Torch/models/dgcnn_partseg.py b/zoo/OcCo/OcCo_Torch/models/dgcnn_partseg.py new file mode 100644 index 0000000..5909334 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/dgcnn_partseg.py @@ -0,0 +1,135 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/AnTao97/dgcnn.pytorch/blob/master/model.py +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/tensorflow/part_seg/train_multi_gpu.py + +import pdb, torch, torch.nn as nn, torch.nn.functional as F +from dgcnn_util import get_graph_feature, T_Net + + +class get_model(nn.Module): + def __init__(self, args, part_num=50, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.k = args.k + self.part_num = part_num + self.transform_net = T_Net(channel=num_channel) + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(64) + self.bn4 = nn.BatchNorm2d(64) + self.bn5 = nn.BatchNorm2d(64) + self.bn6 = nn.BatchNorm1d(args.emb_dims) + self.bn7 = nn.BatchNorm1d(64) + self.bn8 = nn.BatchNorm1d(256) + self.bn9 = nn.BatchNorm1d(256) + self.bn10 = nn.BatchNorm1d(128) + + self.conv1 = nn.Sequential(nn.Conv2d(num_channel*2, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64 * 2, 64, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv2d(64 * 2, 64, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + self.conv6 = nn.Sequential(nn.Conv1d(192, args.emb_dims, kernel_size=1, bias=False), + self.bn6, + nn.LeakyReLU(negative_slope=0.2)) + self.conv7 = nn.Sequential(nn.Conv1d(16, 64, kernel_size=1, bias=False), + self.bn7, + nn.LeakyReLU(negative_slope=0.2)) + self.conv8 = nn.Sequential(nn.Conv1d(1280, 256, kernel_size=1, bias=False), + self.bn8, + nn.LeakyReLU(negative_slope=0.2)) + self.dp1 = nn.Dropout(p=args.dropout) + self.conv9 = nn.Sequential(nn.Conv1d(256, 256, kernel_size=1, bias=False), + self.bn9, + nn.LeakyReLU(negative_slope=0.2)) + self.dp2 = nn.Dropout(p=args.dropout) + self.conv10 = nn.Sequential(nn.Conv1d(256, 128, kernel_size=1, bias=False), + self.bn10, + nn.LeakyReLU(negative_slope=0.2)) + self.conv11 = nn.Conv1d(128, self.part_num, kernel_size=1, bias=False) + + def forward(self, x, l): + B, D, N = x.size() + + x0 = get_graph_feature(x, k=self.k) + t = self.transform_net(x0) + x = x.transpose(2, 1) + if D > 3: + x, feature = x.split(3, dim=2) + x = torch.bmm(x, t) + if D > 3: + x = torch.cat([x, feature], dim=2) + x = x.transpose(2, 1) + + x = get_graph_feature(x, k=self.k) + x = self.conv1(x) + x = self.conv2(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.k) + x = self.conv3(x) + x = self.conv4(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.k) + x = self.conv5(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3), dim=1) + + x = self.conv6(x) + x = x.max(dim=-1, keepdim=True)[0] + + l = l.view(B, -1, 1) + l = self.conv7(l) + + x = torch.cat((x, l), dim=1) + x = x.repeat(1, 1, N) + + x = torch.cat((x, x1, x2, x3), dim=1) + + x = self.conv8(x) + x = self.dp1(x) + x = self.conv9(x) + x = self.dp2(x) + x = self.conv10(x) + x = self.conv11(x) + + return x.permute(0, 2, 1).contiguous() + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def cal_loss(pred, gold, smoothing=False): + """Calculate cross entropy loss, apply label smoothing if needed.""" + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size()[1] + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + loss = -(one_hot * log_prb).sum(dim=1).mean() # ~ F.nll_loss(log_prb, gold) + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + def forward(self, pred, target): + + return self.cal_loss(pred, target, smoothing=False) diff --git a/zoo/OcCo/OcCo_Torch/models/dgcnn_semseg.py b/zoo/OcCo/OcCo_Torch/models/dgcnn_semseg.py new file mode 100644 index 0000000..fc23e1c --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/dgcnn_semseg.py @@ -0,0 +1,107 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/AnTao97/dgcnn.pytorch/blob/master/model.py +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/tensorflow/sem_seg/train.py + +import torch, torch.nn as nn, torch.nn.functional as F +from dgcnn_util import get_graph_feature + + +class get_model(nn.Module): + def __init__(self, args, num_class, num_channel=9, **kwargs): + super(get_model, self).__init__() + self.k = args.k + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(64) + self.bn4 = nn.BatchNorm2d(64) + self.bn5 = nn.BatchNorm2d(64) + self.bn6 = nn.BatchNorm1d(args.emb_dims) + self.bn7 = nn.BatchNorm1d(512) + self.bn8 = nn.BatchNorm1d(256) + + self.conv1 = nn.Sequential(nn.Conv2d(num_channel*2, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + self.conv6 = nn.Sequential(nn.Conv1d(192, args.emb_dims, kernel_size=1, bias=False), + self.bn6, + nn.LeakyReLU(negative_slope=0.2)) + self.conv7 = nn.Sequential(nn.Conv1d(1216, 512, kernel_size=1, bias=False), + self.bn7, + nn.LeakyReLU(negative_slope=0.2)) + self.conv8 = nn.Sequential(nn.Conv1d(512, 256, kernel_size=1, bias=False), + self.bn8, + nn.LeakyReLU(negative_slope=0.2)) + self.dp1 = nn.Dropout(p=args.dropout) + self.conv9 = nn.Conv1d(256, num_class, kernel_size=1, bias=False) + + def forward(self, x): + batch_size, _, num_points = x.size() + + x = get_graph_feature(x, self.k, extra_dim=True) + x = self.conv1(x) + x = self.conv2(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, self.k) + x = self.conv3(x) + x = self.conv4(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, self.k) + x = self.conv5(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3), dim=1) + + x = self.conv6(x) + x = x.max(dim=-1, keepdim=True)[0] + + x = x.repeat(1, 1, num_points) + x = torch.cat((x, x1, x2, x3), dim=1) + + x = self.conv7(x) + x = self.conv8(x) + x = self.dp1(x) + x = self.conv9(x) + + return x.permute(0, 2, 1).contiguous() + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def cal_loss(pred, gold, smoothing=False): + """Calculate cross entropy loss, apply label smoothing if needed.""" + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size()[1] + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + loss = -(one_hot * log_prb).sum(dim=1).mean() # ~ F.nll_loss(log_prb, gold) + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + def forward(self, pred, target): + + return self.cal_loss(pred, target, smoothing=False) diff --git a/zoo/OcCo/OcCo_Torch/models/dgcnn_util.py b/zoo/OcCo/OcCo_Torch/models/dgcnn_util.py new file mode 100644 index 0000000..0be8e02 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/dgcnn_util.py @@ -0,0 +1,137 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/pytorch/model.py + +import torch, torch.nn as nn, torch.nn.init as init, torch.nn.functional as F + +def knn(x, k): + inner = -2 * torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x ** 2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + idx = pairwise_distance.topk(k=k, dim=-1)[1] + return idx + + +def get_graph_feature(x, k=20, idx=None, extra_dim=False): + + batch_size, num_dims, num_points = x.size() + x = x.view(batch_size, -1, num_points) + if idx is None: + if extra_dim is False: + idx = knn(x, k=k) + else: + idx = knn(x[:, 6:], k=k) # idx = knn(x[:, :3], k=k) + + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + idx += idx_base + idx = idx.view(-1) + + x = x.transpose(2, 1).contiguous() + feature = x.view(batch_size*num_points, -1)[idx, :] + feature = feature.view(batch_size, num_points, k, num_dims) + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + feature = torch.cat((feature-x, x), dim=3).permute(0, 3, 1, 2) + + return feature # (batch_size, 2 * num_dims, num_points, k) + + +class T_Net(nn.Module): + """Similar to STN3d/STNkd in pointnet_util.py, + but with leaky relu and zero bias conv1d""" + def __init__(self, channel=3, k=3): + super(T_Net, self).__init__() + self.k = k + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(128) + self.bn3 = nn.BatchNorm1d(1024) + + self.conv1 = nn.Sequential(nn.Conv2d(channel*2, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv1d(128, 1024, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + + self.linear1 = nn.Linear(1024, 512, bias=False) + self.bn4 = nn.BatchNorm1d(512) + self.linear2 = nn.Linear(512, 256, bias=False) + self.bn5 = nn.BatchNorm1d(256) + + self.transform = nn.Linear(256, self.k**2) + init.constant_(self.transform.weight, 0) + init.eye_(self.transform.bias.view(self.k, self.k)) + + def forward(self, x): + B = x.size(0) + + x = self.conv1(x) + x = self.conv2(x) + x = x.max(dim=-1, keepdim=False)[0] + + x = self.conv3(x) + x = x.max(dim=-1, keepdim=False)[0] + + x = F.leaky_relu(self.bn4(self.linear1(x)), negative_slope=0.2) + x = F.leaky_relu(self.bn5(self.linear2(x)), negative_slope=0.2) + + x = self.transform(x) + x = x.view(B, self.k, self.k) + + return x + + +class encoder(nn.Module): + def __init__(self, channel=3, **kwargs): + super(encoder, self).__init__() + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(128) + self.bn4 = nn.BatchNorm2d(256) + self.bn5 = nn.BatchNorm1d(1024) + + self.conv1 = nn.Sequential(nn.Conv2d(channel*2, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64 * 2, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64 * 2, 128, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(128 * 2, 256, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv1d(256 * 2, 1024, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + + def forward(self, x): + batch_size = x.size()[0] + x = get_graph_feature(x, k=20) + x = self.conv1(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=20) + x = self.conv2(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=20) + x = self.conv3(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x3, k=20) + x = self.conv4(x) + x4 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3, x4), dim=1) + + x = self.conv5(x) + x1 = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + # x2 = F.adaptive_avg_pool1d(x, 1).view(batch_size, -1) + # x = torch.cat((x1, x2), 1) + + return x1 + diff --git a/zoo/OcCo/OcCo_Torch/models/pcn_cls.py b/zoo/OcCo/OcCo_Torch/models/pcn_cls.py new file mode 100644 index 0000000..5a442a4 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pcn_cls.py @@ -0,0 +1,45 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import pdb, torch, torch.nn as nn, torch.nn.functional as F +from pcn_util import PCNEncoder + +class get_model(nn.Module): + def __init__(self, num_class=40, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.feat = PCNEncoder(global_feat=True, channel=num_channel) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, num_class) + + self.dp1 = nn.Dropout(p=0.3) + self.bn1 = nn.BatchNorm1d(512) + self.dp2 = nn.Dropout(p=0.3) + self.bn2 = nn.BatchNorm1d(256) + + def forward(self, x): + x = self.feat(x) + x = F.relu(self.bn1(self.fc1(x))) + x = self.dp1(x) + + x = F.relu(self.bn2(self.fc2(x))) + x = self.dp2(x) + + x = self.fc3(x) + x = F.log_softmax(x, dim=1) + return x + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + def forward(self, pred, target): + loss = F.nll_loss(pred, target) + return loss + + +if __name__ == '__main__': + + model = get_model() + xyz = torch.rand(12, 3, 1024) + x = model(xyz) diff --git a/zoo/OcCo/OcCo_Torch/models/pcn_jigsaw.py b/zoo/OcCo/OcCo_Torch/models/pcn_jigsaw.py new file mode 100644 index 0000000..896e89e --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pcn_jigsaw.py @@ -0,0 +1,45 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import torch, torch.nn as nn, torch.nn.functional as F +from pcn_util import PCNEncoder + + +class get_model(nn.Module): + def __init__(self, num_class, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.num_class = num_class + self.feat = PCNEncoder(global_feat=False, channel=num_channel) + self.conv1 = nn.Conv1d(1280, 512, 1) + self.conv2 = nn.Conv1d(512, 256, 1) + self.conv3 = nn.Conv1d(256, 128, 1) + self.conv4 = nn.Conv1d(128, self.num_class, 1) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.bn3 = nn.BatchNorm1d(128) + + def forward(self, x): + batch_size, _, num_points = x.size() + x = self.feat(x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = self.conv4(x) + x = x.transpose(2, 1).contiguous() + x = F.log_softmax(x.view(-1, self.num_class), dim=-1) + x = x.view(batch_size, num_points, self.num_class) + return x + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + def forward(self, pred, target, trans_feat, weight): + loss = F.nll_loss(pred, target) + return loss + + +if __name__ == '__main__': + model = get_model(num_class=13, num_channel=3) + xyz = torch.rand(12, 3, 2048) + model(xyz) diff --git a/zoo/OcCo/OcCo_Torch/models/pcn_occo.py b/zoo/OcCo/OcCo_Torch/models/pcn_occo.py new file mode 100644 index 0000000..95df5ed --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pcn_occo.py @@ -0,0 +1,125 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/models/pcn_cd.py +# Ref: https://github.com/AnTao97/UnsupervisedPointCloudReconstruction/blob/master/model.py +# Sanity Check: https://github.com/vinits5/learning3d/blob/master/models/pcn.py + +import sys, torch, itertools, numpy as np, torch.nn as nn +from pcn_util import PCNEncoder +sys.path.append("../chamfer_distance") +from chamfer_distance import ChamferDistance + + +class get_model(nn.Module): + def __init__(self, **kwargs): + super(get_model, self).__init__() + + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_coarse = 1024 + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + self.__dict__.update(kwargs) # to update args, num_coarse, grid_size, grid_scale + + self.num_fine = self.grid_size ** 2 * self.num_coarse # 16384 + self.meshgrid = [[-self.grid_scale, self.grid_scale, self.grid_size], + [-self.grid_scale, self.grid_scale, self.grid_size]] + + self.feat = PCNEncoder(global_feat=True, channel=3) + + # batch normalisation will destroy limit the expression + self.folding1 = nn.Sequential( + nn.Linear(1024, 1024), + # nn.BatchNorm1d(1024), + nn.ReLU(), + nn.Linear(1024, 1024), + # nn.BatchNorm1d(1024), + nn.ReLU(), + nn.Linear(1024, self.num_coarse * 3)) + + self.folding2 = nn.Sequential( + nn.Conv1d(1024+2+3, 512, 1), + # nn.BatchNorm1d(512), + nn.ReLU(), + nn.Conv1d(512, 512, 1), + # nn.BatchNorm1d(512), + nn.ReLU(), + nn.Conv1d(512, 3, 1)) + + def build_grid(self, batch_size): + # a simpler alternative would be: torch.meshgrid() + x, y = np.linspace(*self.meshgrid[0]), np.linspace(*self.meshgrid[1]) + points = np.array(list(itertools.product(x, y))) + points = np.repeat(points[np.newaxis, ...], repeats=batch_size, axis=0) + + return torch.tensor(points).float().to(self.device) + + def tile(self, tensor, multiples): + # substitute for tf.tile: + # https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/tile + # Ref: https://discuss.pytorch.org/t/how-to-tile-a-tensor/13853/3 + def tile_single_axis(a, dim, n_tile): + init_dim = a.size()[dim] + repeat_idx = [1] * a.dim() + repeat_idx[dim] = n_tile + a = a.repeat(*repeat_idx) + order_index = torch.Tensor( + np.concatenate([init_dim * np.arange(n_tile) + i for i in range(init_dim)])).long() + return torch.index_select(a, dim, order_index.to(self.device)) + + for dim, n_tile in enumerate(multiples): + if n_tile == 1: # increase the speed effectively + continue + tensor = tile_single_axis(tensor, dim, n_tile) + return tensor + + @staticmethod + def expand_dims(tensor, dim): + # substitute for tf.expand_dims: + # https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/expand_dims + # another solution is: torch.unsqueeze(tensor, dim=dim) + return tensor.unsqueeze(-1).transpose(-1, dim) + + def forward(self, x): + # use the same variable naming as: + # https://github.com/wentaoyuan/pcn/blob/master/models/pcn_cd.py + feature = self.feat(x) + + coarse = self.folding1(feature) + coarse = coarse.view(-1, self.num_coarse, 3) + + grid = self.build_grid(x.shape[0]) + grid_feat = grid.repeat(1, self.num_coarse, 1) + + point_feat = self.tile(self.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = point_feat.view([-1, self.num_fine, 3]) + + global_feat = self.tile(self.expand_dims(feature, 1), [1, self.num_fine, 1]) + feat = torch.cat([grid_feat, point_feat, global_feat], dim=2) + + center = self.tile(self.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = center.view([-1, self.num_fine, 3]) + + fine = self.folding2(feat.transpose(2, 1)).transpose(2, 1) + center + + return coarse, fine + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def dist_cd(pc1, pc2): + chamfer_dist = ChamferDistance() + dist1, dist2 = chamfer_dist(pc1, pc2) + return (torch.mean(torch.sqrt(dist1)) + torch.mean(torch.sqrt(dist2)))/2 + + def forward(self, coarse, fine, gt, alpha): + return self.dist_cd(coarse, gt) + alpha * self.dist_cd(fine, gt) + + +if __name__ == '__main__': + + model = get_model() + print(model) + input_pc = torch.rand(7, 3, 1024) + x = model(input_pc) diff --git a/zoo/OcCo/OcCo_Torch/models/pcn_partseg.py b/zoo/OcCo/OcCo_Torch/models/pcn_partseg.py new file mode 100644 index 0000000..8b03407 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pcn_partseg.py @@ -0,0 +1,46 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import torch, torch.nn as nn, torch.nn.functional as F +from pcn_util import PCNPartSegEncoder + + +class get_model(nn.Module): + def __init__(self, part_num=50, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.part_num = part_num + self.feat = PCNPartSegEncoder(channel=num_channel) + + self.convs1 = nn.Conv1d(5264, 512, 1) + self.convs2 = nn.Conv1d(512, 256, 1) + self.convs3 = nn.Conv1d(256, 128, 1) + self.convs4 = nn.Conv1d(128, self.part_num, 1) + self.bns1 = nn.BatchNorm1d(512) + self.bns2 = nn.BatchNorm1d(256) + self.bns3 = nn.BatchNorm1d(128) + + def forward(self, point_cloud, label): + B, _, N = point_cloud.size() + x = self.feat(point_cloud, label) + x = F.relu(self.bns1(self.convs1(x))) + x = F.relu(self.bns2(self.convs2(x))) + x = F.relu(self.bns3(self.convs3(x))) + x = self.convs4(x).transpose(2, 1).contiguous() + x = F.log_softmax(x.view(-1, self.part_num), dim=-1) + x = x.view(B, N, self.part_num) + return x + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + def forward(self, pred, target): + loss = F.nll_loss(pred, target) + return loss + + +if __name__ == '__main__': + model = get_model(part_num=50, num_channel=3) + xyz = torch.rand(16, 3, 4096) + label = torch.randint(low=0, high=20, size=(16, 1, 16)).float() + model(xyz, label) diff --git a/zoo/OcCo/OcCo_Torch/models/pcn_semseg.py b/zoo/OcCo/OcCo_Torch/models/pcn_semseg.py new file mode 100644 index 0000000..7c3efe3 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pcn_semseg.py @@ -0,0 +1,45 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import torch, torch.nn as nn, torch.nn.functional as F +from pcn_util import PCNEncoder + + +class get_model(nn.Module): + def __init__(self, num_class, num_channel=9, **kwargs): + super(get_model, self).__init__() + self.num_class = num_class + self.feat = PCNEncoder(global_feat=False, channel=num_channel) + self.conv1 = nn.Conv1d(1280, 512, 1) + self.conv2 = nn.Conv1d(512, 256, 1) + self.conv3 = nn.Conv1d(256, 128, 1) + self.conv4 = nn.Conv1d(128, self.num_class, 1) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.bn3 = nn.BatchNorm1d(128) + + def forward(self, x): + batch_size, _, num_points = x.size() + x = self.feat(x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = self.conv4(x) + x = x.transpose(2, 1).contiguous() + x = F.log_softmax(x.view(-1, self.num_class), dim=-1) + x = x.view(batch_size, num_points, self.num_class) + return x + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + def forward(self, pred, target): + loss = F.nll_loss(pred, target) + return loss + + +if __name__ == '__main__': + model = get_model(num_class=13, num_channel=3) + xyz = torch.rand(12, 3, 2048) + model(xyz) diff --git a/zoo/OcCo/OcCo_Torch/models/pcn_util.py b/zoo/OcCo/OcCo_Torch/models/pcn_util.py new file mode 100644 index 0000000..75a52ac --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pcn_util.py @@ -0,0 +1,85 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import torch, torch.nn as nn, torch.nn.functional as F + +class PCNEncoder(nn.Module): + def __init__(self, global_feat=False, channel=3): + super(PCNEncoder, self).__init__() + + self.conv1 = nn.Conv1d(channel, 128, 1) + # self.bn1 = nn.BatchNorm1d(128) no bn in PCN + self.conv2 = nn.Conv1d(128, 256, 1) + self.conv3 = nn.Conv1d(512, 512, 1) + self.conv4 = nn.Conv1d(512, 1024, 1) + self.global_feat = global_feat + + def forward(self, x): + _, D, N = x.size() + x = F.relu(self.conv1(x)) + pointfeat = self.conv2(x) + + # 'encoder_0' + feat = torch.max(pointfeat, 2, keepdim=True)[0] + feat = feat.view(-1, 256, 1).repeat(1, 1, N) + x = torch.cat([pointfeat, feat], 1) + + # 'encoder_1' + x = F.relu(self.conv3(x)) + x = self.conv4(x) + x = torch.max(x, 2, keepdim=False)[0] + + if self.global_feat: # used in completion and classification tasks + return x + else: # concatenate global and local features, for segmentation tasks + x = x.view(-1, 1024, 1).repeat(1, 1, N) + return torch.cat([x, pointfeat], 1) + + +class PCNPartSegEncoder(nn.Module): + def __init__(self, channel=3): + super(PCNPartSegEncoder, self).__init__() + + self.conv1 = nn.Conv1d(channel, 128, 1) + self.conv2 = nn.Conv1d(128, 256, 1) + self.conv3 = nn.Conv1d(512, 512, 1) + self.conv4 = nn.Conv1d(512, 2048, 1) + + def forward(self, x, label): + _, D, N = x.size() + out1 = F.relu(self.conv1(x)) + out2 = self.conv2(out1) + + # 'encoder_0' + feat = torch.max(out2, 2, keepdim=True)[0] + feat = feat.repeat(1, 1, N) + out3 = torch.cat([out2, feat], 1) + + # 'encoder_1' + out4 = F.relu(self.conv3(out3)) + out5 = self.conv4(out4) + + out_max = torch.max(out5, 2, keepdim=False)[0] + out_max = torch.cat([out_max, label.squeeze(1)], 1) + + expand = out_max.view(-1, 2064, 1).repeat(1, 1, N) # (batch, 2064, num_point) + concat = torch.cat([expand, out1, out3, out4, out5], 1) + + return concat + + +class encoder(nn.Module): + def __init__(self, num_channel=3, **kwargs): + super(encoder, self).__init__() + self.feat = PCNEncoder(global_feat=True, channel=num_channel) + + def forward(self, x): + return self.feat(x) + + +if __name__ == "__main__": + # model = PCNEncoder() + model = PCNPartSegEncoder() + xyz = torch.rand(16, 3, 100) # batch, channel, num_point + label = torch.randint(low=0, high=20, size=(16, 1, 12)).float() + x = model(xyz, label) + print(x.size()) diff --git a/zoo/OcCo/OcCo_Torch/models/pointnet_cls.py b/zoo/OcCo/OcCo_Torch/models/pointnet_cls.py new file mode 100644 index 0000000..3a99252 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pointnet_cls.py @@ -0,0 +1,38 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/models/pointnet_cls.py + +import torch.nn as nn, torch.nn.functional as F +from pointnet_util import PointNetEncoder, feature_transform_regularizer + + +class get_model(nn.Module): + def __init__(self, num_class=40, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.feat = PointNetEncoder( + global_feat=True, feature_transform=True, channel=num_channel) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, num_class) + self.dropout = nn.Dropout(p=0.3) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + + def forward(self, x): + x, trans, trans_feat = self.feat(x) + x = F.relu(self.bn1(self.fc1(x))) + x = F.relu(self.bn2(self.dropout(self.fc2(x)))) + x = self.fc3(x) + x = F.log_softmax(x, dim=1) + return x, trans_feat + + +class get_loss(nn.Module): + def __init__(self, mat_diff_loss_scale=0.001): + super(get_loss, self).__init__() + self.mat_diff_loss_scale = mat_diff_loss_scale + + def forward(self, pred, target, trans_feat): + loss = F.nll_loss(pred, target) + mat_diff_loss = feature_transform_regularizer(trans_feat) + total_loss = loss + mat_diff_loss * self.mat_diff_loss_scale + return total_loss diff --git a/zoo/OcCo/OcCo_Torch/models/pointnet_jigsaw.py b/zoo/OcCo/OcCo_Torch/models/pointnet_jigsaw.py new file mode 100644 index 0000000..dbeeaed --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pointnet_jigsaw.py @@ -0,0 +1,50 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import torch, torch.nn as nn, torch.nn.functional as F +from pointnet_util import PointNetEncoder, feature_transform_regularizer + + +class get_model(nn.Module): + def __init__(self, num_class, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.num_class = num_class + self.feat = PointNetEncoder(global_feat=False, + feature_transform=True, + channel=num_channel) + self.conv1 = nn.Conv1d(1088, 512, 1) + self.conv2 = nn.Conv1d(512, 256, 1) + self.conv3 = nn.Conv1d(256, 128, 1) + self.conv4 = nn.Conv1d(128, self.num_class, 1) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.bn3 = nn.BatchNorm1d(128) + + def forward(self, x): + batch_size, _, num_points = x.size() + x, trans, trans_feat = self.feat(x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = self.conv4(x) + x = x.transpose(2, 1).contiguous() + x = F.log_softmax(x.view(-1, self.num_class), dim=-1) + x = x.view(batch_size, num_points, self.num_class) + return x, trans_feat + + +class get_loss(nn.Module): + def __init__(self, mat_diff_loss_scale=0.001): + super(get_loss, self).__init__() + self.mat_diff_loss_scale = mat_diff_loss_scale + + def forward(self, pred, target, trans_feat): + loss = F.nll_loss(pred, target) + mat_diff_loss = feature_transform_regularizer(trans_feat) + total_loss = loss + mat_diff_loss * self.mat_diff_loss_scale + return total_loss + + +if __name__ == '__main__': + model = get_model(num_class=13, num_channel=3) + xyz = torch.rand(12, 3, 2048) + model(xyz) diff --git a/zoo/OcCo/OcCo_Torch/models/pointnet_occo.py b/zoo/OcCo/OcCo_Torch/models/pointnet_occo.py new file mode 100644 index 0000000..0e101e4 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pointnet_occo.py @@ -0,0 +1,118 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/krrish94/chamferdist +# Ref: https://github.com/chrdiller/pyTorchChamferDistance +# Ref: https://github.com/wentaoyuan/pcn/blob/master/models/pcn_cd.py +# Ref: https://github.com/AnTao97/UnsupervisedPointCloudReconstruction/blob/master/model.py + + + +import sys, torch, itertools, numpy as np, torch.nn as nn +from pointnet_util import PointNetEncoder +sys.path.append("../chamfer_distance") +from chamfer_distance import ChamferDistance + +class get_model(nn.Module): + def __init__(self, **kwargs): + super(get_model, self).__init__() + + self.grid_size = 4 + self.grid_scale = 0.05 + self.num_coarse = 1024 + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + self.__dict__.update(kwargs) # to update args, num_coarse, grid_size, grid_scale + + self.num_fine = self.grid_size ** 2 * self.num_coarse # 16384 + self.meshgrid = [[-self.grid_scale, self.grid_scale, self.grid_size], + [-self.grid_scale, self.grid_scale, self.grid_size]] + + self.feat = PointNetEncoder(global_feat=True, feature_transform=False, channel=3) + self.folding1 = nn.Sequential( + nn.Linear(1024, 1024), + nn.ReLU(), + nn.Linear(1024, 1024), + nn.ReLU(), + nn.Linear(1024, self.num_coarse * 3)) + + self.folding2 = nn.Sequential( + nn.Conv1d(1024+2+3, 512, 1), + nn.ReLU(), + nn.Conv1d(512, 512, 1), + nn.ReLU(), + nn.Conv1d(512, 3, 1)) + + def build_grid(self, batch_size): + + x, y = np.linspace(*self.meshgrid[0]), np.linspace(*self.meshgrid[1]) + points = np.array(list(itertools.product(x, y))) + points = np.repeat(points[np.newaxis, ...], repeats=batch_size, axis=0) + + return torch.tensor(points).float().to(self.device) + + def tile(self, tensor, multiples): + # substitute for tf.tile: + # https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/tile + # Ref: https://discuss.pytorch.org/t/how-to-tile-a-tensor/13853/3 + def tile_single_axis(a, dim, n_tile): + init_dim = a.size()[dim] + repeat_idx = [1] * a.dim() + repeat_idx[dim] = n_tile + a = a.repeat(*repeat_idx) + order_index = torch.Tensor( + np.concatenate([init_dim * np.arange(n_tile) + i for i in range(init_dim)])).long() + return torch.index_select(a, dim, order_index.to(self.device)) + + for dim, n_tile in enumerate(multiples): + if n_tile == 1: + continue + tensor = tile_single_axis(tensor, dim, n_tile) + return tensor + + @staticmethod + def expand_dims(tensor, dim): + # substitute for tf.expand_dims: + # https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/expand_dims + return tensor.unsqueeze(-1).transpose(-1, dim) + + def forward(self, x): + feature, _, _ = self.feat(x) + + coarse = self.folding1(feature) + coarse = coarse.view(-1, self.num_coarse, 3) + + grid = self.build_grid(x.shape[0]) + grid_feat = grid.repeat(1, self.num_coarse, 1) + + point_feat = self.tile(self.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + point_feat = point_feat.view([-1, self.num_fine, 3]) + + global_feat = self.tile(self.expand_dims(feature, 1), [1, self.num_fine, 1]) + feat = torch.cat([grid_feat, point_feat, global_feat], dim=2) + + center = self.tile(self.expand_dims(coarse, 2), [1, 1, self.grid_size ** 2, 1]) + center = center.view([-1, self.num_fine, 3]) + + fine = self.folding2(feat.transpose(2, 1)).transpose(2, 1) + center + + return coarse, fine + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + @staticmethod + def dist_cd(pc1, pc2): + chamfer_dist = ChamferDistance() + dist1, dist2 = chamfer_dist(pc1, pc2) + return (torch.mean(torch.sqrt(dist1)) + torch.mean(torch.sqrt(dist2)))/2 + + def forward(self, coarse, fine, gt, alpha): + return self.dist_cd(coarse, gt) + alpha * self.dist_cd(fine, gt) + + +if __name__ == '__main__': + + model = get_model() + print(model) + input_pc = torch.rand(7, 3, 1024) + x = model(input_pc) diff --git a/zoo/OcCo/OcCo_Torch/models/pointnet_partseg.py b/zoo/OcCo/OcCo_Torch/models/pointnet_partseg.py new file mode 100644 index 0000000..db9c882 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pointnet_partseg.py @@ -0,0 +1,47 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/models/pointnet_part_seg.py + +import torch.nn as nn, torch.nn.functional as F +from pointnet_util import PointNetPartSegEncoder, feature_transform_regularizer + + +class get_model(nn.Module): + def __init__(self, part_num=50, num_channel=3, **kwargs): + super(get_model, self).__init__() + self.part_num = part_num + self.feat = PointNetPartSegEncoder(feature_transform=True, + channel=num_channel) + + self.convs1 = nn.Conv1d(4944, 256, 1) + self.convs2 = nn.Conv1d(256, 256, 1) + self.convs3 = nn.Conv1d(256, 128, 1) + self.convs4 = nn.Conv1d(128, part_num, 1) + self.bns1 = nn.BatchNorm1d(256) + self.bns2 = nn.BatchNorm1d(256) + self.bns3 = nn.BatchNorm1d(128) + + def forward(self, point_cloud, label): + B, D, N = point_cloud.size() + concat, trans_feat = self.feat(point_cloud, label) + + net = F.relu(self.bns1(self.convs1(concat))) + net = F.relu(self.bns2(self.convs2(net))) + net = F.relu(self.bns3(self.convs3(net))) + net = self.convs4(net).transpose(2, 1).contiguous() + net = F.log_softmax(net.view(-1, self.part_num), dim=-1) + net = net.view(B, N, self.part_num) # [B, N, 50] + + return net, trans_feat + + +class get_loss(nn.Module): + def __init__(self, mat_diff_loss_scale=0.001): + super(get_loss, self).__init__() + self.mat_diff_loss_scale = mat_diff_loss_scale + + def forward(self, pred, target, trans_feat): + loss = F.nll_loss(pred, target) + mat_diff_loss = feature_transform_regularizer(trans_feat) + total_loss = loss + mat_diff_loss * self.mat_diff_loss_scale + return total_loss + diff --git a/zoo/OcCo/OcCo_Torch/models/pointnet_semseg.py b/zoo/OcCo/OcCo_Torch/models/pointnet_semseg.py new file mode 100644 index 0000000..15e1353 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pointnet_semseg.py @@ -0,0 +1,51 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import torch, torch.nn as nn, torch.nn.functional as F +from pointnet_util import PointNetEncoder, feature_transform_regularizer + + +class get_model(nn.Module): + def __init__(self, num_class=13, num_channel=9, **kwargs): + super(get_model, self).__init__() + + self.num_class = num_class + self.feat = PointNetEncoder(global_feat=False, + feature_transform=True, + channel=num_channel) + self.conv1 = nn.Conv1d(1088, 512, 1) + self.conv2 = nn.Conv1d(512, 256, 1) + self.conv3 = nn.Conv1d(256, 128, 1) + self.conv4 = nn.Conv1d(128, self.num_class, 1) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.bn3 = nn.BatchNorm1d(128) + + def forward(self, x): + batch_size, _, num_points = x.size() + x, trans, trans_feat = self.feat(x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = self.conv4(x) + x = x.transpose(2, 1).contiguous() + x = F.log_softmax(x.view(-1, self.num_class), dim=-1) + x = x.view(batch_size, num_points, self.num_class) + return x, trans_feat + + +class get_loss(nn.Module): + def __init__(self, mat_diff_loss_scale=0.001): + super(get_loss, self).__init__() + self.mat_diff_loss_scale = mat_diff_loss_scale + + def forward(self, pred, target, trans_feat): + loss = F.nll_loss(pred, target) + mat_diff_loss = feature_transform_regularizer(trans_feat) + total_loss = loss + mat_diff_loss * self.mat_diff_loss_scale + return total_loss + + +if __name__ == '__main__': + model = get_model(13, num_channel=9) + xyz = torch.rand(12, 9, 2048) + model(xyz) diff --git a/zoo/OcCo/OcCo_Torch/models/pointnet_util.py b/zoo/OcCo/OcCo_Torch/models/pointnet_util.py new file mode 100644 index 0000000..223edb2 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/models/pointnet_util.py @@ -0,0 +1,226 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/fxia22/pointnet.pytorch/pointnet/model.py + +import torch, torch.nn as nn, numpy as np, torch.nn.functional as F +from torch.autograd import Variable + + +def feature_transform_regularizer(trans): + d = trans.size()[1] + I = torch.eye(d)[None, :, :] + if trans.is_cuda: + I = I.cuda() + loss = torch.mean(torch.norm(torch.bmm(trans, trans.transpose(2, 1) - I), dim=(1, 2))) + return loss + + +# STN -> Spatial Transformer Network +class STN3d(nn.Module): + def __init__(self, channel): + super(STN3d, self).__init__() + self.conv1 = nn.Conv1d(channel, 64, 1) # in-channel, out-channel, kernel size + self.conv2 = nn.Conv1d(64, 128, 1) + self.conv3 = nn.Conv1d(128, 1024, 1) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, 9) + self.relu = nn.ReLU() + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.bn4 = nn.BatchNorm1d(512) + self.bn5 = nn.BatchNorm1d(256) + + def forward(self, x): + B = x.size()[0] + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = torch.max(x, 2, keepdim=False)[0] # global descriptors + + x = F.relu(self.bn4(self.fc1(x))) + x = F.relu(self.bn5(self.fc2(x))) + x = self.fc3(x) + + iden = Variable(torch.from_numpy(np.eye(3).flatten().astype(np.float32))).view(1, 9).repeat(B, 1) + if x.is_cuda: + iden = iden.cuda() + x = x + iden + x = x.view(-1, 3, 3) + return x + + +class STNkd(nn.Module): + def __init__(self, k=64): + super(STNkd, self).__init__() + self.conv1 = nn.Conv1d(k, 64, 1) + self.conv2 = nn.Conv1d(64, 128, 1) + self.conv3 = nn.Conv1d(128, 1024, 1) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, k * k) + self.relu = nn.ReLU() + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.bn4 = nn.BatchNorm1d(512) + self.bn5 = nn.BatchNorm1d(256) + + self.k = k + + def forward(self, x): + B = x.size()[0] + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = torch.max(x, 2, keepdim=False)[0] + + x = F.relu(self.bn4(self.fc1(x))) + x = F.relu(self.bn5(self.fc2(x))) + x = self.fc3(x) + + iden = Variable(torch.from_numpy(np.eye(self.k).flatten().astype(np.float32))).view( + 1, self.k ** 2).repeat(B, 1) + if x.is_cuda: + iden = iden.cuda() + x = x + iden + x = x.view(-1, self.k, self.k) + return x + + +class PointNetEncoder(nn.Module): + def __init__(self, global_feat=True, feature_transform=False, + channel=3, detailed=False): + # when input include normals, it + super(PointNetEncoder, self).__init__() + self.stn = STN3d(channel) # Batch * 3 * 3 + self.conv1 = nn.Conv1d(channel, 64, 1) + self.conv2 = nn.Conv1d(64, 128, 1) + self.conv3 = nn.Conv1d(128, 1024, 1) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.global_feat = global_feat + self.feature_transform = feature_transform + if self.feature_transform: + self.fstn = STNkd(k=64) + self.detailed = detailed + + def forward(self, x): + + _, D, N = x.size() # Batch Size, Dimension of Point Features, Num of Points + trans = self.stn(x) + x = x.transpose(2, 1) + if D > 3: + # pdb.set_trace() + x, feature = x.split([3, D-3], dim=2) + x = torch.bmm(x, trans) + # feature = torch.bmm(feature, trans) # feature -> normals + + if D > 3: + x = torch.cat([x, feature], dim=2) + x = x.transpose(2, 1) + out1 = self.bn1(self.conv1(x)) + x = F.relu(out1) + + if self.feature_transform: + trans_feat = self.fstn(x) + x = x.transpose(2, 1) + x = torch.bmm(x, trans_feat) + x = x.transpose(2, 1) + else: + trans_feat = None + + pointfeat = x + + out2 = self.bn2(self.conv2(x)) + x = F.relu(out2) + + out3 = self.bn3(self.conv3(x)) + # x = self.bn3(self.conv3(x)) + x = torch.max(out3, 2, keepdim=False)[0] + if self.global_feat: + return x, trans, trans_feat + elif self.detailed: + return out1, out2, out3, x + else: # concatenate global and local feature together + x = x.view(-1, 1024, 1).repeat(1, 1, N) + return torch.cat([x, pointfeat], 1), trans, trans_feat + + +class PointNetPartSegEncoder(nn.Module): + def __init__(self, feature_transform=True, channel=3): + super(PointNetPartSegEncoder, self).__init__() + self.stn = STN3d(channel) + self.conv1 = nn.Conv1d(channel, 64, 1) + self.conv2 = nn.Conv1d(64, 128, 1) + self.conv3 = nn.Conv1d(128, 128, 1) + self.conv4 = nn.Conv1d(128, 512, 1) + self.conv5 = nn.Conv1d(512, 2048, 1) + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(128) + self.bn4 = nn.BatchNorm1d(512) + self.bn5 = nn.BatchNorm1d(2048) + + self.feature_transform = feature_transform + if self.feature_transform: + self.fstn = STNkd(k=128) + + def forward(self, point_cloud, label): + B, D, N = point_cloud.size() + + trans = self.stn(point_cloud) + point_cloud = point_cloud.transpose(2, 1) + if D > 3: + point_cloud, feature = point_cloud.split(3, dim=2) + point_cloud = torch.bmm(point_cloud, trans) + if D > 3: + point_cloud = torch.cat([point_cloud, feature], dim=2) + point_cloud = point_cloud.transpose(2, 1) + + out1 = F.relu(self.bn1(self.conv1(point_cloud))) + out2 = F.relu(self.bn2(self.conv2(out1))) + out3 = F.relu(self.bn3(self.conv3(out2))) + + if self.feature_transform: + trans_feat = self.fstn(out3) + net_transformed = torch.bmm(out3.transpose(2, 1), trans_feat) + out3 = net_transformed.transpose(2, 1) + + out4 = F.relu(self.bn4(self.conv4(out3))) + out5 = self.bn5(self.conv5(out4)) + + out_max = torch.max(out5, 2, keepdim=False)[0] + out_max = torch.cat([out_max, label.squeeze(1)], 1) + expand = out_max.view(-1, 2048 + 16, 1).repeat(1, 1, N) + concat = torch.cat([expand, out1, out2, out3, out4, out5], 1) + + if self.feature_transform: + return concat, trans_feat + return concat + + +class encoder(nn.Module): + def __init__(self, num_channel=3, **kwargs): + super(encoder, self).__init__() + self.feat = PointNetEncoder(global_feat=True, channel=num_channel) + + def forward(self, x): + feat, _, _ = self.feat(x) + return feat + + +class detailed_encoder(nn.Module): + def __init__(self, num_channel=3, **kwargs): + super(detailed_encoder, self).__init__() + self.feat = PointNetEncoder(global_feat=False, + channel=num_channel, + detailed=True) + + def forward(self, x): + out1, out2, out3, x = self.feat(x) + return out1, out2, out3, x \ No newline at end of file diff --git a/zoo/OcCo/OcCo_Torch/readme.md b/zoo/OcCo/OcCo_Torch/readme.md new file mode 100644 index 0000000..a09f228 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/readme.md @@ -0,0 +1,2 @@ +## OcCo in PyTorch + diff --git a/zoo/OcCo/OcCo_Torch/test.py b/zoo/OcCo/OcCo_Torch/test.py new file mode 100644 index 0000000..116f013 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/test.py @@ -0,0 +1,250 @@ +import argparse +import os +import torch +import sys +import importlib +import numpy as np +from tqdm import tqdm +from utils.ShapeNetDataLoader import ShapeNetC +import re +from collections import defaultdict +from torch.autograd import Variable + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--model', type=str, default='pt', help='model name') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + parser.add_argument('--ckpts', type=str, help='ckpts') + parser.add_argument('--dropout', type=float, default=0.5, help='dropout rate in FCs [default: 0.5]') + parser.add_argument('--emb_dims', type=int, default=1024, help='embedding dimensions [default: 1024]') + parser.add_argument('--k', type=int, default=20, help='num of nearest neighbors to use [default: 20]') + return parser.parse_args() + + +def main(args): + # def log_string(str): + # logger.info(str) + # print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + '''CREATE DIR''' + # timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + # exp_dir = Path('./log/') + # exp_dir.mkdir(exist_ok=True) + # exp_dir = exp_dir.joinpath('part_seg') + # exp_dir.mkdir(exist_ok=True) + # if args.log_dir is None: + # exp_dir = exp_dir.joinpath(timestr) + # else: + # exp_dir = exp_dir.joinpath(args.log_dir) + # exp_dir.mkdir(exist_ok=True) + # checkpoints_dir = exp_dir.joinpath('checkpoints/') + # checkpoints_dir.mkdir(exist_ok=True) + # log_dir = exp_dir.joinpath('logs/') + # log_dir.mkdir(exist_ok=True) + + '''LOG''' + # args = parse_args() + # logger = logging.getLogger("Model") + # logger.setLevel(logging.INFO) + # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # file_handler = logging.FileHandler('%s/%s.txt' % (log_dir, args.model)) + # file_handler.setLevel(logging.INFO) + # file_handler.setFormatter(formatter) + # logger.addHandler(file_handler) + # log_string('PARAMETER ...') + # log_string(args) + + # root = args.root + + # TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='trainval', normal_channel=args.normal) + # TRAIN_DATASET = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + # trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, pin_memory=True, drop_last=True) + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='test', normal_channel=args.normal) + # TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + TEST_DATASET = ShapeNetC(partition='shapenet-c', sub='clean', class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=32, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + # log_string("The number of training data is: %d" % len(TRAIN_DATASET)) + print("The number of test data is: %d" % len(TEST_DATASET)) + + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + # shutil.copy('models/%s.py' % args.model, str(exp_dir)) + # shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + channel_num = 3 + MODEL = importlib.import_module(args.model) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(part_num=num_part, num_channel=channel_num, args=args).cuda().to(device) + print('# generator parameters:', sum(param.numel() for param in classifier.parameters())) + + if args.ckpts is not None: + from collections import OrderedDict + model_dict = OrderedDict() + state_dict = torch.load(args.ckpts)["model_state_dict"] + pattern = re.compile('module.') + for k,v in state_dict.items(): + if re.search("module", k): + model_dict[re.sub(pattern, '', k)] = v + else: + model_dict = state_dict + classifier.load_state_dict(model_dict) + # classifier.load_state_dict(torch.load(args.ckpts)) + +## we use adamw and cosine scheduler + # def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + # decay = [] + # no_decay = [] + # for name, param in model.named_parameters(): + # if not param.requires_grad: + # continue # frozen weights + # if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # # print(name) + # no_decay.append(param) + # else: + # decay.append(param) + # return [ + # {'params': no_decay, 'weight_decay': 0.}, + # {'params': decay, 'weight_decay': weight_decay}] + + # param_groups = add_weight_decay(classifier, weight_decay=0.05) + # optimizer = optim.AdamW(param_groups, lr= args.learning_rate, weight_decay=0.05 ) + + # scheduler = CosineLRScheduler( + # optimizer, + # t_initial=args.epoch, + # t_mul=1, + # lr_min=1e-6, + # decay_rate=0.1, + # warmup_lr_init=1e-6, + # warmup_t=args.warmup_epoch, + # cycle_limit=1, + # t_in_epochs=True + # ) + + # best_acc = 0 + # global_epoch = 0 + # best_class_avg_iou = 0 + # best_inctance_avg_iou = 0 + + # classifier.zero_grad() + + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + if args.model == 'pointnet_partseg': + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + print(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + print(outstr) + + + +if __name__ == '__main__': + args = parse_args() + main(args) \ No newline at end of file diff --git a/zoo/OcCo/OcCo_Torch/test.sh b/zoo/OcCo/OcCo_Torch/test.sh new file mode 100644 index 0000000..36f994e --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/test.sh @@ -0,0 +1,4 @@ +python test_partseg.py \ + --model pointnet_partseg \ + --ckpts /mnt/lustre/ldkong/models/OcCo/OcCo_Torch/log/partseg/occo_pointnet/checkpoints/ep245_83.2.pth \ + --gpu 2 \ No newline at end of file diff --git a/zoo/OcCo/OcCo_Torch/test_partseg.py b/zoo/OcCo/OcCo_Torch/test_partseg.py new file mode 100644 index 0000000..67657e6 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/test_partseg.py @@ -0,0 +1,194 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +from utils.ShapeNetDataLoader import ShapeNetC +import torch +import logging +import sys +import importlib +from tqdm import tqdm +import numpy as np +import re + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} + +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def parse_args(): + '''PARAMETERS''' + parser = argparse.ArgumentParser('PointNet') + parser.add_argument('--normal', action='store_true', default=False, help='use normals') + parser.add_argument('--num_votes', type=int, default=3, help='aggregate segmentation scores with voting') + parser.add_argument('--model', type=str, default='pt', help='model name') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + parser.add_argument('--ckpts', type=str, help='ckpts') + parser.add_argument('--dropout', type=float, default=0.5, help='dropout rate in FCs [default: 0.5]') + parser.add_argument('--emb_dims', type=int, default=1024, help='embedding dimensions [default: 1024]') + parser.add_argument('--k', type=int, default=20, help='num of nearest neighbors to use [default: 20]') + return parser.parse_args() + + +def main(args): + # def log_string(str): + # logger.info(str) + # print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + # experiment_dir = 'log/part_seg/' + args.log_dir + + '''LOG''' + # args = parse_args() + # logger = logging.getLogger("Model") + # logger.setLevel(logging.INFO) + # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # file_handler = logging.FileHandler('%s/eval.txt' % experiment_dir) + # file_handler.setLevel(logging.INFO) + # file_handler.setFormatter(formatter) + # logger.addHandler(file_handler) + # log_string('PARAMETER ...') + # log_string(args) + + # root = 'data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.num_point, split='test', normal_channel=args.normal) + # testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + TEST_DATASET = ShapeNetC(partition='shapenet-c', sub='dropout_global_4', class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + print("The number of test data is: %d" % len(TEST_DATASET)) + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + # shutil.copy('models/%s.py' % args.model, str(exp_dir)) + # shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + channel_num = 3 + MODEL = importlib.import_module(args.model) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(part_num=num_part, num_channel=channel_num, args=args).cuda().to(device) + print('# generator parameters:', sum(param.numel() for param in classifier.parameters())) + + if args.ckpts is not None: + from collections import OrderedDict + model_dict = OrderedDict() + state_dict = torch.load(args.ckpts)["model_state_dict"] + pattern = re.compile('module.') + for k,v in state_dict.items(): + if re.search("module", k): + model_dict[re.sub(pattern, '', k)] = v + else: + model_dict = state_dict + classifier.load_state_dict(model_dict) + + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + batchsize, num_point, _ = points.size() + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + vote_pool = torch.zeros(target.size()[0], target.size()[1], num_part).cuda() + + for _ in range(args.num_votes): + if args.model == 'pointnet_partseg': + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) # b,n,50 + vote_pool += seg_pred + + seg_pred = vote_pool / args.num_votes + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): # part is not present, no prediction as well + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + print('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + print('Accuracy is: %.5f' % test_metrics['accuracy']) + print('Class avg accuracy is: %.5f' % test_metrics['class_avg_accuracy']) + print('Class avg mIOU is: %.5f' % test_metrics['class_avg_iou']) + print('Inctance avg mIOU is: %.5f' % test_metrics['inctance_avg_iou']) + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/OcCo/OcCo_Torch/train.py b/zoo/OcCo/OcCo_Torch/train.py new file mode 100644 index 0000000..2548b6d --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/train.py @@ -0,0 +1,303 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/train_partseg.py + +import os, sys, torch, shutil, importlib, argparse, numpy as np +sys.path.append('utils') +sys.path.append('models') +from utils.PC_Augmentation import random_scale_point_cloud, random_shift_point_cloud +from utils.Torch_Utility import copy_parameters, weights_init, bn_momentum_adjust +from torch.optim.lr_scheduler import StepLR, CosineAnnealingLR +from torch.utils.tensorboard import SummaryWriter +from utils.ShapeNetDataLoader import ShapeNetPart +from torch.utils.data import DataLoader +from utils.TrainLogger import TrainLogger +from tqdm import tqdm + + +seg_classes = { + 'Earphone': [16, 17, 18], + 'Motorbike': [30, 31, 32, 33, 34, 35], + 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], + 'Laptop': [28, 29], + 'Cap': [6, 7], + 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], + 'Guitar': [19, 20, 21], + 'Bag': [4, 5], + 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], + 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], + 'Knife': [22, 23] +} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ..., 49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--log_dir', type=str, help='log folder [default: ]') + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--mode', type=str, default='train', help='train or test') + parser.add_argument('--epoch', default=250, type=int, help=' epochs [default: 250]') + parser.add_argument('--batch_size', type=int, default=32, help='batch size [default: 16]') + parser.add_argument('--lr', default=0.001, type=float, help='learning rate [default: 0.001]') + parser.add_argument('--momentum', type=float, default=0.9, help='SGD momentum [default: 0.9]') + parser.add_argument('--restore_path', type=str, help='path to pretrained weights [default: ]') + parser.add_argument('--lr_decay', type=float, default=0.5, help='lr decay rate [default: 0.5]') + parser.add_argument('--num_point', type=int, default=2048, help='point number [default: 2048]') + parser.add_argument('--restore', action='store_true', help='using pre-trained [default: False]') + parser.add_argument('--use_sgd', action='store_true', help='use SGD optimiser [default: False]') + parser.add_argument('--data_aug', action='store_true', help='data augmentation [default: False]') + parser.add_argument('--scheduler', default='step', help='learning rate scheduler [default: step]') + parser.add_argument('--model', default='pointnet_partseg', help='model [default: pointnet_partseg]') + parser.add_argument('--dropout', type=float, default=0.5, help='dropout rate in FCs [default: 0.5]') + parser.add_argument('--bn_decay', action='store_true', help='use BN nomentum decay [default: False]') + parser.add_argument('--xavier_init', action='store_true', help='Xavier weight init [default: False]') + parser.add_argument('--emb_dims', type=int, default=1024, help='embedding dimensions [default: 1024]') + parser.add_argument('--k', type=int, default=20, help='num of nearest neighbors to use [default: 20]') + parser.add_argument('--normal', action='store_true', default=False, help='use normal [default: False]') + parser.add_argument('--step_size', type=int, default=20, help='lr decay step [default: every 20 epochs]') + parser.add_argument('--num_votes', type=int, default=3, help='aggregate test predictions via vote [default: 3]') + + return parser.parse_args() + + +def main(args): + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + def to_categorical(y, num_class): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_class)[y.cpu().data.numpy(), ] + if y.is_cuda: + return new_y.cuda() + return new_y + + ''' === Set up Loggers and Load Data === ''' + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='partseg', filename=args.mode + '_log', cls2name=seg_label_to_cat) + writer = SummaryWriter(os.path.join(MyLogger.experiment_dir, 'runs')) + # root = 'data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' + + # TRAIN_DATASET = PartNormalDataset(root=root, num_point=args.num_point, split='trainval', use_normal=args.normal) + TRAIN_DATASET = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, pin_memory=True, drop_last=True) + + # TEST_DATASET = PartNormalDataset(root=root, num_point=args.num_point, split='test', use_normal=args.normal) + TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + # trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + # testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + num_classes, num_part = 16, 50 + + ''' === Load Model and Backup Scripts === ''' + channel_num = 6 if args.normal else 3 + MODEL = importlib.import_module(args.model) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + shutil.copy('./models/%s.py' % args.model, MyLogger.log_dir) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(part_num=num_part, num_channel=channel_num, args=args).cuda().to(device) + criterion = MODEL.get_loss().to(device) + classifier = torch.nn.DataParallel(classifier) + + if args.restore: + checkpoint = torch.load(args.restore_path) + classifier = copy_parameters(classifier, checkpoint, verbose=True) + MyLogger.logger.info('Use pre-trained weights from %s' % args.restore_path) + else: + MyLogger.logger.info('No pre-trained weights, start training from scratch...') + if args.xavier_init: + classifier = classifier.apply(weights_init) + MyLogger.logger.info("Using Xavier weight initialisation") + + if args.mode == 'test': + MyLogger.logger.info('\n\n') + MyLogger.logger.info('=' * 33) + MyLogger.logger.info('load parrameters from %s' % args.restore_path) + with torch.no_grad(): + test_metrics = {} + total_correct, total_seen = 0, 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} # {shape: []} + + for points, label, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + classifier.eval() + cur_batch_size, num_point, _ = points.size() + vote_pool = torch.zeros(cur_batch_size, num_point, num_part).cuda() # (batch, num point, num part) + points, label, target = points.transpose(2, 1).float().cuda(), label.long().cuda(), target.numpy() + + ''' === generate predictions from raw output (multiple via voting) === ''' + for _ in range(args.num_votes): + if args.model == 'pointnet_partseg': + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) + vote_pool += seg_pred # added on probability + + seg_pred = vote_pool / args.num_votes + cur_pred_val_logits = seg_pred.cpu().data.numpy() + cur_pred_val = np.zeros((cur_batch_size, num_point)).astype(np.int32) + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] # str, shape name + logits = cur_pred_val_logits[i, :, :] # array, (num point, num part) + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + # only consider parts from that shape + + ''' === calculate accuracy === ''' + total_correct += np.sum(cur_pred_val == target) + total_seen += (cur_batch_size * num_point) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + ''' === calculate iou === ''' + for i in range(cur_batch_size): + segl = target[i, :] # array, (num point, ) + segp = cur_pred_val[i, :] # array, (num point, ) + cat = seg_label_to_cat[segl[0]] # str, shape name + part_ious = [0. for _ in range(len(seg_classes[cat]))] # parts belong to that shape + + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and (np.sum(segp == l) == 0): # no prediction or gt + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + iou = np.sum((segl == l) & (segp == l)) / float(np.sum((segl == l) | (segp == l))) + part_ious[l - seg_classes[cat][0]] = iou + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['instance_avg_iou'] = np.mean(all_shape_ious) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + MyLogger.logger.info('test mIoU of %-14s %f' % (cat, shape_ious[cat])) + + MyLogger.logger.info('Accuracy is: %.5f' % test_metrics['accuracy']) + MyLogger.logger.info('Class avg accuracy is: %.5f' % test_metrics['class_avg_accuracy']) + MyLogger.logger.info('Class avg mIoU is: %.5f' % test_metrics['class_avg_iou']) + MyLogger.logger.info('Instance avg mIoU is: %.5f' % test_metrics['instance_avg_iou']) + sys.exit("Test Finished") + + if not args.use_sgd: + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.lr, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=1e-4) + else: + optimizer = torch.optim.SGD(classifier.parameters(), + lr=args.lr * 100, + momentum=args.momentum, + weight_decay=1e-4) + if args.scheduler is 'step': + scheduler = StepLR(optimizer, step_size=args.step_size, gamma=args.lr_decay) + else: + scheduler = CosineAnnealingLR(optimizer, T_max=args.epoch, eta_min=1e-3) + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECAY = 0.5 + MOMENTUM_DECAY_STEP = args.step_size + + for epoch in range(MyLogger.epoch, args.epoch + 1): + + MyLogger.epoch_init() + + for points, label, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + + if args.data_aug: + points = points.data.numpy() + points[:, :, :3] = random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, :3] = random_shift_point_cloud(points[:, :, 0:3]) + points = torch.Tensor(points) + + points, label, target = points.transpose(2, 1).float().cuda(), label.long().cuda(), \ + target.view(-1, 1)[:, 0].long().cuda() + classifier.train() + optimizer.zero_grad() + if args.model == 'pointnet_partseg': + seg_pred, trans_feat = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target) + + loss.backward() + optimizer.step() + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), target.long().cpu().numpy(), loss.cpu().detach().numpy()) + MyLogger.epoch_summary(writer=writer, training=True, mode='partseg') + + '''=== Evaluating ===''' + with torch.no_grad(): + + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, label, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.transpose(2, 1).float().cuda(), label.long().cuda(), \ + target.view(-1, 1)[:, 0].long().cuda() + if args.model == 'pointnet_partseg': + seg_pred, trans_feat = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target) + + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), target.long().cpu().numpy(), loss.cpu().detach().numpy()) + + MyLogger.epoch_summary(writer=writer, training=False, mode='partseg') + + if MyLogger.save_model: + state = { + 'step': MyLogger.step, + 'miou': MyLogger.best_miou, + 'epoch': MyLogger.best_miou_epoch, + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict()} + torch.save(state, MyLogger.savepath) + + if epoch % 5 == 0: + state = { + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict()} + torch.save(state, MyLogger.savepath.replace('best_model', 'model_ep%d' % epoch)) + + scheduler.step() + if args.scheduler == 'step': + for param_group in optimizer.param_groups: + if optimizer.param_groups[0]['lr'] < LEARNING_RATE_CLIP: + param_group['lr'] = LEARNING_RATE_CLIP + if args.bn_decay: + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECAY ** (epoch // MOMENTUM_DECAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/OcCo/OcCo_Torch/train_dgcnn.sh b/zoo/OcCo/OcCo_Torch/train_dgcnn.sh new file mode 100644 index 0000000..9b02afc --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/train_dgcnn.sh @@ -0,0 +1,10 @@ +python train.py \ + --gpu 1,5,6,7 \ + --use_sgd \ + --xavier_init \ + --scheduler cos \ + --model dgcnn_partseg \ + --log_dir occo_dgcnn \ + --batch_size 16 \ + --restore \ + --restore_path /mnt/lustre/ldkong/models/OcCo/OcCo_Torch/pretrain/dgcnn_occo_seg.pth \ No newline at end of file diff --git a/zoo/OcCo/OcCo_Torch/train_partseg.py b/zoo/OcCo/OcCo_Torch/train_partseg.py new file mode 100644 index 0000000..71375bf --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/train_partseg.py @@ -0,0 +1,300 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/train_partseg.py + +import os, sys, torch, shutil, importlib, argparse, numpy as np +sys.path.append('utils') +sys.path.append('models') +from PC_Augmentation import random_scale_point_cloud, random_shift_point_cloud +from Torch_Utility import copy_parameters, weights_init, bn_momentum_adjust +from torch.optim.lr_scheduler import StepLR, CosineAnnealingLR +from torch.utils.tensorboard import SummaryWriter +from ShapeNetDataLoader import PartNormalDataset +from torch.utils.data import DataLoader +from TrainLogger import TrainLogger +from tqdm import tqdm + + +seg_classes = {'Earphone': [16, 17, 18], + 'Motorbike': [30, 31, 32, 33, 34, 35], + 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], + 'Laptop': [28, 29], + 'Cap': [6, 7], + 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], + 'Guitar': [19, 20, 21], + 'Bag': [4, 5], + 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], + 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], + 'Knife': [22, 23]} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ..., 49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--log_dir', type=str, help='log folder [default: ]') + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--mode', type=str, default='train', help='train or test') + parser.add_argument('--epoch', default=250, type=int, help=' epochs [default: 250]') + parser.add_argument('--batch_size', type=int, default=16, help='batch size [default: 16]') + parser.add_argument('--lr', default=0.001, type=float, help='learning rate [default: 0.001]') + parser.add_argument('--momentum', type=float, default=0.9, help='SGD momentum [default: 0.9]') + parser.add_argument('--restore_path', type=str, help='path to pretrained weights [default: ]') + parser.add_argument('--lr_decay', type=float, default=0.5, help='lr decay rate [default: 0.5]') + parser.add_argument('--num_point', type=int, default=2048, help='point number [default: 2048]') + parser.add_argument('--restore', action='store_true', help='using pre-trained [default: False]') + parser.add_argument('--use_sgd', action='store_true', help='use SGD optimiser [default: False]') + parser.add_argument('--data_aug', action='store_true', help='data augmentation [default: False]') + parser.add_argument('--scheduler', default='step', help='learning rate scheduler [default: step]') + parser.add_argument('--model', default='pointnet_partseg', help='model [default: pointnet_partseg]') + parser.add_argument('--dropout', type=float, default=0.5, help='dropout rate in FCs [default: 0.5]') + parser.add_argument('--bn_decay', action='store_true', help='use BN nomentum decay [default: False]') + parser.add_argument('--xavier_init', action='store_true', help='Xavier weight init [default: False]') + parser.add_argument('--emb_dims', type=int, default=1024, help='embedding dimensions [default: 1024]') + parser.add_argument('--k', type=int, default=20, help='num of nearest neighbors to use [default: 20]') + parser.add_argument('--normal', action='store_true', default=False, help='use normal [default: False]') + parser.add_argument('--step_size', type=int, default=20, help='lr decay step [default: every 20 epochs]') + parser.add_argument('--num_votes', type=int, default=3, help='aggregate test predictions via vote [default: 3]') + + return parser.parse_args() + + +def main(args): + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + def to_categorical(y, num_class): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_class)[y.cpu().data.numpy(), ] + if y.is_cuda: + return new_y.cuda() + return new_y + + ''' === Set up Loggers and Load Data === ''' + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='partseg', + filename=args.mode + '_log', cls2name=seg_label_to_cat) + writer = SummaryWriter(os.path.join(MyLogger.experiment_dir, 'runs')) + root = 'data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' + + TRAIN_DATASET = PartNormalDataset(root=root, num_point=args.num_point, split='trainval', use_normal=args.normal) + TEST_DATASET = PartNormalDataset(root=root, num_point=args.num_point, split='test', use_normal=args.normal) + trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + num_classes, num_part = 16, 50 + + ''' === Load Model and Backup Scripts === ''' + channel_num = 6 if args.normal else 3 + MODEL = importlib.import_module(args.model) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + shutil.copy('./models/%s.py' % args.model, MyLogger.log_dir) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(part_num=num_part, num_channel=channel_num, args=args).cuda().to(device) + criterion = MODEL.get_loss().to(device) + classifier = torch.nn.DataParallel(classifier) + + if args.restore: + checkpoint = torch.load(args.restore_path) + classifier = copy_parameters(classifier, checkpoint, verbose=True) + MyLogger.logger.info('Use pre-trained weights from %s' % args.restore_path) + else: + MyLogger.logger.info('No pre-trained weights, start training from scratch...') + if args.xavier_init: + classifier = classifier.apply(weights_init) + MyLogger.logger.info("Using Xavier weight initialisation") + + if args.mode == 'test': + MyLogger.logger.info('\n\n') + MyLogger.logger.info('=' * 33) + MyLogger.logger.info('load parrameters from %s' % args.restore_path) + with torch.no_grad(): + test_metrics = {} + total_correct, total_seen = 0, 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} # {shape: []} + + for points, label, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + classifier.eval() + cur_batch_size, num_point, _ = points.size() + vote_pool = torch.zeros(cur_batch_size, num_point, num_part).cuda() # (batch, num point, num part) + points, label, target = points.transpose(2, 1).float().cuda(), label.long().cuda(), target.numpy() + + ''' === generate predictions from raw output (multiple via voting) === ''' + for _ in range(args.num_votes): + if args.model == 'pointnet_partseg': + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) + vote_pool += seg_pred # added on probability + + seg_pred = vote_pool / args.num_votes + cur_pred_val_logits = seg_pred.cpu().data.numpy() + cur_pred_val = np.zeros((cur_batch_size, num_point)).astype(np.int32) + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] # str, shape name + logits = cur_pred_val_logits[i, :, :] # array, (num point, num part) + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + # only consider parts from that shape + + ''' === calculate accuracy === ''' + total_correct += np.sum(cur_pred_val == target) + total_seen += (cur_batch_size * num_point) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + ''' === calculate iou === ''' + for i in range(cur_batch_size): + segl = target[i, :] # array, (num point, ) + segp = cur_pred_val[i, :] # array, (num point, ) + cat = seg_label_to_cat[segl[0]] # str, shape name + part_ious = [0. for _ in range(len(seg_classes[cat]))] # parts belong to that shape + + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and (np.sum(segp == l) == 0): # no prediction or gt + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + iou = np.sum((segl == l) & (segp == l)) / float(np.sum((segl == l) | (segp == l))) + part_ious[l - seg_classes[cat][0]] = iou + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['instance_avg_iou'] = np.mean(all_shape_ious) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + MyLogger.logger.info('test mIoU of %-14s %f' % (cat, shape_ious[cat])) + + MyLogger.logger.info('Accuracy is: %.5f' % test_metrics['accuracy']) + MyLogger.logger.info('Class avg accuracy is: %.5f' % test_metrics['class_avg_accuracy']) + MyLogger.logger.info('Class avg mIoU is: %.5f' % test_metrics['class_avg_iou']) + MyLogger.logger.info('Instance avg mIoU is: %.5f' % test_metrics['instance_avg_iou']) + sys.exit("Test Finished") + + if not args.use_sgd: + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.lr, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=1e-4) + else: + optimizer = torch.optim.SGD(classifier.parameters(), + lr=args.lr * 100, + momentum=args.momentum, + weight_decay=1e-4) + if args.scheduler is 'step': + scheduler = StepLR(optimizer, step_size=args.step_size, gamma=args.lr_decay) + else: + scheduler = CosineAnnealingLR(optimizer, T_max=args.epoch, eta_min=1e-3) + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECAY = 0.5 + MOMENTUM_DECAY_STEP = args.step_size + + for epoch in range(MyLogger.epoch, args.epoch + 1): + + MyLogger.epoch_init() + + for points, label, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + + if args.data_aug: + points = points.data.numpy() + points[:, :, :3] = random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, :3] = random_shift_point_cloud(points[:, :, 0:3]) + points = torch.Tensor(points) + + points, label, target = points.transpose(2, 1).float().cuda(), label.long().cuda(), \ + target.view(-1, 1)[:, 0].long().cuda() + classifier.train() + optimizer.zero_grad() + if args.model == 'pointnet_partseg': + seg_pred, trans_feat = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target) + + loss.backward() + optimizer.step() + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + MyLogger.epoch_summary(writer=writer, training=True, mode='partseg') + + '''=== Evaluating ===''' + with torch.no_grad(): + + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, label, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.transpose(2, 1).float().cuda(), label.long().cuda(), \ + target.view(-1, 1)[:, 0].long().cuda() + if args.model == 'pointnet_partseg': + seg_pred, trans_feat = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + loss = criterion(seg_pred, target) + + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + + MyLogger.epoch_summary(writer=writer, training=False, mode='partseg') + + if MyLogger.save_model: + state = { + 'step': MyLogger.step, + 'miou': MyLogger.best_miou, + 'epoch': MyLogger.best_miou_epoch, + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict()} + torch.save(state, MyLogger.savepath) + + if epoch % 5 == 0: + state = { + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict()} + torch.save(state, MyLogger.savepath.replace('best_model', 'model_ep%d' % epoch)) + + scheduler.step() + if args.scheduler == 'step': + for param_group in optimizer.param_groups: + if optimizer.param_groups[0]['lr'] < LEARNING_RATE_CLIP: + param_group['lr'] = LEARNING_RATE_CLIP + if args.bn_decay: + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECAY ** (epoch // MOMENTUM_DECAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/OcCo/OcCo_Torch/train_pcn.sh b/zoo/OcCo/OcCo_Torch/train_pcn.sh new file mode 100644 index 0000000..94cc778 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/train_pcn.sh @@ -0,0 +1,11 @@ +python train.py \ + --gpu 0,4 \ + --bn_decay \ + --xavier_init \ + --scheduler cos \ + --model pcn_partseg \ + --batch_size 16 \ + --epoch 300 \ + --log_dir occo_pcn \ + --restore \ + --restore_path /mnt/lustre/ldkong/models/OcCo/OcCo_Torch/pretrain/pcn_occo_seg.pth \ No newline at end of file diff --git a/zoo/OcCo/OcCo_Torch/train_pointnet.sh b/zoo/OcCo/OcCo_Torch/train_pointnet.sh new file mode 100644 index 0000000..c125282 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/train_pointnet.sh @@ -0,0 +1,11 @@ +python train.py \ + --gpu 0,6 \ + --bn_decay \ + --xavier_init \ + --scheduler cos \ + --model pointnet_partseg \ + --batch_size 32 \ + --epoch 300 \ + --log_dir occo_pointnet_run2 \ + --restore \ + --restore_path /mnt/lustre/ldkong/models/OcCo/OcCo_Torch/pretrain/pointnet_occo_seg.pth \ No newline at end of file diff --git a/zoo/OcCo/OcCo_Torch/utils/3DPC_Data_Gen.py b/zoo/OcCo/OcCo_Torch/utils/3DPC_Data_Gen.py new file mode 100644 index 0000000..3b83836 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/3DPC_Data_Gen.py @@ -0,0 +1,87 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com +# Generating Training Data of 3D Point Cloud for 3D Jigsaw Puzzles + +import os, h5py, numpy as np + +''' +The 3D object/block is split into voxels along axes, +each point is assigned with a voxel label. +''' + + +def pc_ssl_3djigsaw_gen(pc_xyz, k=2, edge_len=1): + """ + :param pc_xyz: point cloud, (n_point, 3 + additional feature) + :param k: number of voxels along each axis + :param edge_len: length of voxel (cube) edge + :return: permuted pc, labels + """ + intervals = [edge_len*2 / k * x - edge_len for x in np.arange(k + 1)] + assert edge_len >= pc_xyz.__abs__().max() + indices = np.searchsorted(intervals, pc_xyz, side='left') - 1 + label = indices[:, 0] * k ** 2 + indices[:, 1] * k + indices[:, 2] + + shuffle_indices = np.arange(k ** 3) + np.random.shuffle(shuffle_indices) + shuffled_dict = dict() + for i, d in enumerate(shuffle_indices): + shuffled_dict[i] = d + + def numberToBase(n, base=k): + if n == 0: + return [0] + digits = [] + while n: + digits.append(str(int(n % base))) + n //= base + return int("".join(digits[::-1])) + + for voxel_id in range(k ** 3): + selected_points = (label == voxel_id) + permutated_places = shuffled_dict[voxel_id] + loc = permutated_places + center_diff = np.array([(loc // k ** 2) - (voxel_id // k ** 2), + (loc // k ** 2) // k - (voxel_id // k ** 2) // k, + loc % k - voxel_id % k]) * (2 * edge_len)/k # + const - edge_len + pc_xyz[selected_points] = pc_xyz[selected_points] + center_diff + + return pc_xyz, label + + +if __name__ == "__main__": + root_dir = r'./data/modelnet40_ply_hdf5_2048' + dir_path = r'./data/modelnet40_ply_hdf5_2048/jigsaw/k2' + os.mkdir(dir_path) if not os.path.exists(dir_path) else None + + TRAIN_FILES = [item.strip() for item in open(os.path.join(root_dir, 'train_files.txt')).readlines()] + VALID_FILES = [item.strip() for item in open(os.path.join(root_dir, 'test_files.txt')).readlines()] + + + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + + def reduce2fix(pc, n_points=1024): + indices = np.arange(len(pc)) + np.random.shuffle(indices) + return pc[indices[:n_points]] + + + for file_ in VALID_FILES: + filename = file_.split('/')[-1] + print(filename) + data, _ = loadh5DataFile(file_) + # subsample all point clouds into 1024 points of each + data = np.apply_along_axis(reduce2fix, axis=1, arr=data) + shuffled_data = np.zeros_like(data) + shuffled_label = np.zeros((data.shape[0], data.shape[1])) + for idx, pc_xyz in enumerate(data): + pc_xyz, label = pc_ssl_3djigsaw_gen(pc_xyz, k=2, edge_len=1) + shuffled_data[idx] = pc_xyz + shuffled_label[idx] = label + hf = h5py.File(os.path.join(dir_path, filename), 'w') + + hf.create_dataset('label', data=shuffled_label) + hf.create_dataset('data', data=shuffled_data) + hf.close() diff --git a/zoo/OcCo/OcCo_Torch/utils/Dataset_Loc.py b/zoo/OcCo/OcCo_Torch/utils/Dataset_Loc.py new file mode 100644 index 0000000..8a54760 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/Dataset_Loc.py @@ -0,0 +1,60 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hc.wang96@gmail.com +# Modify the path w.r.t your own settings + + +def Dataset_Loc(dataset, fname, partial=True, bn=False, few_shot=False): + def fetch_files(filelist): + return [item.strip() for item in open(filelist).readlines()] + + dataset = dataset.lower() + + if dataset == 'shapenet8': + NUM_CLASSES = 8 + if partial: + TRAIN_FILES = fetch_files('./data/shapenet/hdf5_partial_1024/train_file.txt') + VALID_FILES = fetch_files('./data/shapenet/hdf5_partial_1024/valid_file.txt') + else: + raise ValueError("For ShapeNet we are only interested in the partial objects recognition") + + elif dataset == 'shapenet10': + NUM_CLASSES = 10 + TRAIN_FILES = fetch_files('./data/ShapeNet10/Cleaned/train_file.txt') + VALID_FILES = fetch_files('./data/ShapeNet10/Cleaned/test_file.txt') + + # elif dataset == 'modelnet10': + # NUM_CLASSES = 10 + # TRAIN_FILES = fetch_files('./data/ModelNet10/Cleaned/train_file.txt') + # VALID_FILES = fetch_files('./data/ModelNet10/Cleaned/test_file.txt') + + elif dataset == 'modelnet40': + '''Actually we find that using data from PointNet++: ''' + NUM_CLASSES = 40 + if partial: + TRAIN_FILES = fetch_files('./data/modelnet40_pcn/hdf5_partial_1024/train_file.txt') + VALID_FILES = fetch_files('./data/modelnet40_pcn/hdf5_partial_1024/test_file.txt') + else: + VALID_FILES = fetch_files('./data/modelnet40_ply_hdf5_2048/test_files.txt') + if few_shot: + TRAIN_FILES = fetch_files('./data/modelnet40_ply_hdf5_2048/few_labels/%s.h5' % fname) + else: + TRAIN_FILES = fetch_files('./data/modelnet40_ply_hdf5_2048/train_files.txt') + + elif dataset == 'scannet10': + NUM_CLASSES = 10 + TRAIN_FILES = fetch_files('./data/ScanNet10/ScanNet_Cleaned/train_file.txt') + VALID_FILES = fetch_files('./data/ScanNet10/ScanNet_Cleaned/test_file.txt') + + elif dataset == 'scanobjectnn': + NUM_CLASSES = 15 + if bn: + TRAIN_FILES = ['./data/ScanNetObjectNN/h5_files/main_split/training_objectdataset' + fname + '_1024.h5'] + VALID_FILES = ['./data/ScanNetObjectNN/h5_files/main_split/test_objectdataset' + fname + '_1024.h5'] + + else: + TRAIN_FILES = ['./data/ScanNetObjectNN/h5_files/main_split_nobg/training_objectdataset' + fname + '_1024.h5'] + VALID_FILES = ['./data/ScanNetObjectNN/h5_files/main_split_nobg/test_objectdataset' + fname + '_1024.h5'] + + else: + raise ValueError('dataset not exists') + + return NUM_CLASSES, TRAIN_FILES, VALID_FILES diff --git a/zoo/OcCo/OcCo_Torch/utils/Inference_Timer.py b/zoo/OcCo/OcCo_Torch/utils/Inference_Timer.py new file mode 100644 index 0000000..dcaed83 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/Inference_Timer.py @@ -0,0 +1,41 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, torch, time, numpy as np + +class Inference_Timer: + def __init__(self, args): + self.args = args + self.est_total = [] + self.use_cpu = True if (self.args.gpu == 'None') else False + self.device = 'CPU' if self.use_cpu else 'GPU' + if self.use_cpu: + os.environ['OMP_NUM_THREADS'] = "1" + os.environ['MKL_NUM_THREADS'] = "1" + print('Now we calculate the inference time on a single CPU') + else: + print('Now we calculate the inference time on a single GPU') + self.args.batch_size, self.args.epoch = 2, 1 + # 1D BatchNorm requires more than 1 sample to compute std + # ref: https://github.com/pytorch/pytorch/issues/7716 + # otherwise remove the 1D BatchNorm, + # since its contribution to the inference is negligible + # ref: + + def update_args(self): + return self.args + + def single_step(self, model, data): + if not self.use_cpu: + torch.cuda.synchronize() + start = time.time() + output = model(data) + if not self.use_cpu: + torch.cuda.synchronize() + end = time.time() + self.est_total.append(end - start) + return output + + def update_single_epoch(self, logger): + logger.info("Model: {}".format(self.args.model)) + logger.info("Average Inference Time Per Example on Single {}: {:.3f} milliseconds".format( + self.device, np.mean(self.est_total)*1000)) diff --git a/zoo/OcCo/OcCo_Torch/utils/LMDB_DataFlow.py b/zoo/OcCo/OcCo_Torch/utils/LMDB_DataFlow.py new file mode 100644 index 0000000..edb5750 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/LMDB_DataFlow.py @@ -0,0 +1,89 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/data_util.py + + +import numpy as np +from tensorpack import dataflow + + +def resample_pcd(pcd, n): + """drop or duplicate points so that input of each object has exactly n points""" + idx = np.random.permutation(pcd.shape[0]) + if idx.shape[0] < n: + idx = np.concatenate([idx, np.random.randint(pcd.shape[0], size=n-pcd.shape[0])]) + return pcd[idx[:n]] + + +class PreprocessData(dataflow.ProxyDataFlow): + + def __init__(self, ds, input_size, output_size): + super(PreprocessData, self).__init__(ds) + self.input_size = input_size + self.output_size = output_size + + def get_data(self): + for id, input, gt in self.ds.get_data(): + input = resample_pcd(input, self.input_size) + gt = resample_pcd(gt, self.output_size) + yield id, input, gt + + +class BatchData(dataflow.ProxyDataFlow): + def __init__(self, ds, batch_size, input_size, gt_size, remainder=False, use_list=False): + super(BatchData, self).__init__(ds) + self.batch_size = batch_size + self.input_size = input_size + self.gt_size = gt_size + self.remainder = remainder + self.use_list = use_list + + def __len__(self): + """get the number of batches""" + ds_size = len(self.ds) + div = ds_size // self.batch_size + rem = ds_size % self.batch_size + if rem == 0: + return div + return div + int(self.remainder) # int(False) == 0 + + def __iter__(self): + """generating data in batches""" + holder = [] + for data in self.ds: + holder.append(data) + if len(holder) == self.batch_size: + yield self._aggregate_batch(holder, self.use_list) + del holder[:] # reset holder as empty list => holder = [] + if self.remainder and len(holder) > 0: + yield self._aggregate_batch(holder, self.use_list) + + def _aggregate_batch(self, data_holder, use_list=False): + """ + Concatenate input points along the 0-th dimension + Stack all other data along the 0-th dimension + """ + ids = np.stack([x[0] for x in data_holder]) + inputs = [resample_pcd(x[1], self.input_size) if x[1].shape[0] > self.input_size else x[1] + for x in data_holder] + inputs = np.expand_dims(np.concatenate([x for x in inputs]), 0).astype(np.float32) + npts = np.stack([x[1].shape[0] if x[1].shape[0] < self.input_size else self.input_size + for x in data_holder]).astype(np.int32) + gts = np.stack([resample_pcd(x[2], self.gt_size) for x in data_holder]).astype(np.float32) + return ids, inputs, npts, gts + + +def lmdb_dataflow(lmdb_path, batch_size, input_size, output_size, is_training, test_speed=False): + """ Load LMDB Files, then Generate Training Batches""" + df = dataflow.LMDBSerializer.load(lmdb_path, shuffle=False) + size = df.size() + if is_training: + df = dataflow.LocallyShuffleData(df, buffer_size=2000) # buffer_size + df = dataflow.PrefetchData(df, num_prefetch=500, num_proc=1) # multiprocess the data + df = BatchData(df, batch_size, input_size, output_size) + if is_training: + df = dataflow.PrefetchDataZMQ(df, num_proc=8) + df = dataflow.RepeatedData(df, -1) + if test_speed: + dataflow.TestDataSpeed(df, size=1000).start() + df.reset_state() + return df, size diff --git a/zoo/OcCo/OcCo_Torch/utils/LMDB_Writer.py b/zoo/OcCo/OcCo_Torch/utils/LMDB_Writer.py new file mode 100644 index 0000000..2c2d64c --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/LMDB_Writer.py @@ -0,0 +1,52 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hw501@cam.ac.uk + +import os, argparse, numpy as np +from tensorpack import DataFlow, dataflow +from open3d.open3d.io import read_triangle_mesh, read_point_cloud + + +def sample_from_mesh(filename, num_samples=16384): + pcd = read_triangle_mesh(filename).sample_points_uniformly(number_of_points=num_samples) + return np.array(pcd.points) + + +class pcd_df(DataFlow): + def __init__(self, model_list, num_scans, partial_dir, complete_dir, num_partial_points=1024): + self.model_list = [_file for _file in model_list if 'train' in _file] + self.num_scans = num_scans + self.partial_dir = partial_dir + self.complete_dir = complete_dir + self.num_ppoints = num_partial_points + + def size(self): + return len(self.model_list) * self.num_scans + + @staticmethod + def read_pcd(filename): + pcd = read_point_cloud(filename) + return np.array(pcd.points) + + def get_data(self): + for model_id in self.model_list: + complete = sample_from_mesh(os.path.join(self.complete_dir, '%s.obj' % model_id)) + for i in range(self.num_scans): + partial = self.read_pcd(os.path.join(self.partial_dir, model_id + '_%d.pcd' % i)) + partial = partial[np.random.choice(len(partial), self.num_ppoints)] + yield model_id.replace('/', '_'), partial, complete + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--list_path', default=r'../render/ModelNet_flist_normalised.txt') + parser.add_argument('--num_scans', type=int, default=10) + parser.add_argument('--partial_dir', default=r'../render/dump_modelnet_normalised_supercoarse/pcd') + parser.add_argument('--complete_dir', default=r'../data/ModelNet40') + parser.add_argument('--output_file', default=r'../data/ModelNet40_train_1024_supercoarse.lmdb') + args = parser.parse_args() + + with open(args.list_path) as file: + model_list = file.read().splitlines() + df = pcd_df(model_list, args.num_scans, args.partial_dir, args.complete_dir) + if os.path.exists(args.output_file): + os.system('rm %s' % args.output_file) + dataflow.LMDBSerializer.save(df, args.output_file) diff --git a/zoo/OcCo/OcCo_Torch/utils/ModelNetDataLoader.py b/zoo/OcCo/OcCo_Torch/utils/ModelNetDataLoader.py new file mode 100644 index 0000000..a17850b --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/ModelNetDataLoader.py @@ -0,0 +1,175 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +import os, torch, h5py, warnings, numpy as np +from torch.utils.data import Dataset + +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc -= centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def farthest_point_sample(point, npoint): + """ + Input: + xyz: point cloud data, [N, D] + npoint: number of samples + Return: + centroids: sampled point cloud index, [npoint, D] + """ + N, D = point.shape + xyz = point[:, :3] + centroids = np.zeros((npoint,)) + distance = np.ones((N,)) * 1e10 + farthest = np.random.randint(0, N) + for i in range(npoint): + centroids[i] = farthest + centroid = xyz[farthest, :] + dist = np.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = np.argmax(distance, -1) + point = point[centroids.astype(np.int32)] + return point + + +class ModelNetDataLoader(Dataset): + def __init__(self, root, npoint=1024, split='train', uniform=False, normal_channel=True, cache_size=15000): + self.root = root + self.npoints = npoint + self.uniform = uniform + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {'train': [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))], + 'test': [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))]} + + assert (split == 'train' or split == 'test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i]) + '.txt') for i + in range(len(shape_ids[split]))] + print('The size of %s data is %d' % (split, len(self.datapath))) + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + def __len__(self): + return len(self.datapath) + + def _get_item(self, index): + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints, :] + + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + + if not self.normal_channel: + point_set = point_set[:, 0:3] + + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + +class General_CLSDataLoader_HDF5(Dataset): + def __init__(self, file_list, num_point=1024): + self.num_point = num_point + self.file_list = file_list + self.points_list = np.zeros((1, num_point, 3)) + self.labels_list = np.zeros((1,)) + + for file in self.file_list: + data, label = self.loadh5DataFile(file) + self.points_list = np.concatenate( + [self.points_list, data[:, :self.num_point, :]], axis=0) + self.labels_list = np.concatenate([self.labels_list, label.ravel()], axis=0) + + self.points_list = self.points_list[1:] + self.labels_list = self.labels_list[1:] + assert len(self.points_list) == len(self.labels_list) + print('Number of Objects: ', len(self.labels_list)) + + @staticmethod + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + def __len__(self): + return len(self.points_list) + + def __getitem__(self, index): + point_xyz = self.points_list[index][:, 0:3] + point_label = self.labels_list[index].astype(np.int32) + return point_xyz, point_label + + +class ModelNetJigsawDataLoader(Dataset): + def __init__(self, root=r'./data/modelnet40_ply_hdf5_2048/jigsaw', + n_points=1024, split='train', k=3): + self.npoints = n_points + self.root = root + self.split = split + assert split in ['train', 'test'] + if self.split == 'train': + self.file_list = [d for d in os.listdir(root) if d.find('train') is not -1] + else: + self.file_list = [d for d in os.listdir(root) if d.find('test') is not -1] + self.points_list = np.zeros((1, n_points, 3)) + self.labels_list = np.zeros((1, n_points)) + + for file in self.file_list: + file = os.path.join(root, file) + data, label = self.loadh5DataFile(file) + self.points_list = np.concatenate([self.points_list, data], axis=0) # .append(data) + self.labels_list = np.concatenate([self.labels_list, label], axis=0) + # self.labels_list.append(label) + + self.points_list = self.points_list[1:] + self.labels_list = self.labels_list[1:] + assert len(self.points_list) == len(self.labels_list) + print('Number of %s Objects: '%self.split, len(self.labels_list)) + + # just use the simple weights + self.labelweights = np.ones(k ** 3) + + + @staticmethod + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + def __getitem__(self, index): + point_set = self.points_list[index][:, 0:3] + semantic_seg = self.labels_list[index].astype(np.int32) + return point_set, semantic_seg + + def __len__(self): + return len(self.points_list) + + +if __name__ == '__main__': + + data = ModelNetDataLoader('/data/modelnet40_normal_resampled/', split='train', uniform=False, normal_channel=True, ) + DataLoader = torch.utils.data.DataLoader(data, batch_size=12, shuffle=True) + for point, label in DataLoader: + print(point.shape) + print(label.shape) diff --git a/zoo/OcCo/OcCo_Torch/utils/PC_Augmentation.py b/zoo/OcCo/OcCo_Torch/utils/PC_Augmentation.py new file mode 100644 index 0000000..f56c698 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/PC_Augmentation.py @@ -0,0 +1,79 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import numpy as np + +""" + ================================================ + === Library for Point Cloud Utility Function === + ================================================ +""" + + +def pc_normalize(pc): + """ Normalise the Input Point Cloud into a Unit Sphere """ + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def farthest_point_sample(point, npoint): + """ A Simple Yet Inefficient Farthest Point Sampling on Point Cloud """ + N, D = point.shape + xyz = point[:, :3] + centroids = np.zeros((npoint,)) + distance = np.ones((N,)) * 1e10 + farthest = np.random.randint(0, N) + for i in range(npoint): + centroids[i] = farthest + centroid = xyz[farthest, :] + dist = np.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = np.argmax(distance, -1) + point = point[centroids.astype(np.int32)] + return point + + +def random_shift_point_cloud(batch_data, shift_range=0.1): + """ Shift the Point Cloud along the XYZ axis, magnitude is randomly sampled from [-0.1, 0.1] """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B, 3)) + for batch_index in range(B): + batch_data[batch_index, :, :] += shifts[batch_index, :] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Scale the Point Cloud Objects into a Random Magnitude between [0.8, 1.25] """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index, :, :] *= scales[batch_index] + return batch_data + + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + """ Randomly Dropout out a Portion of Points, Ratio is Randomly Selected between [0, 0.875] """ + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random() * max_dropout_ratio + drop_idx = np.where(np.random.random((batch_pc.shape[1])) <= dropout_ratio)[0] + if len(drop_idx) > 0: + batch_pc[b, drop_idx, :] = batch_pc[b, 0, :] # set the rest as the first point + return batch_pc + + +def translate_pointcloud_dgcnn(pointcloud): + """ Random Scaling + Translation, Deprecated """ + xyz1 = np.random.uniform(low=2. / 3., high=3. / 2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud_dgcnn(pointcloud, sigma=0.01, clip=0.02): + """ Random Jittering, Deprecated """ + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1 * clip, clip) + return pointcloud diff --git a/zoo/OcCo/OcCo_Torch/utils/S3DISDataLoader.py b/zoo/OcCo/OcCo_Torch/utils/S3DISDataLoader.py new file mode 100644 index 0000000..d859a1c --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/S3DISDataLoader.py @@ -0,0 +1,411 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, sys, h5py, numpy as np +from torch.utils.data import Dataset + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +sys.path.append(ROOT_DIR) +root = '../data/stanford_indoor3d/' + +# 13 classes, as noted in the meta/s3dis/class_names.txt +num_per_class = np.array([3370714, 2856755, 4919229, 318158, 375640, 478001, 974733, + 650464, 791496, 88727, 1284130, 229758, 2272837], dtype=np.int32) +num_per_class_dict = {} +for cls, num_cls in enumerate(num_per_class): + num_per_class_dict[cls] = num_cls + + +class S3DISDataset_HDF5(Dataset): + """Chopped Scene""" + + def __init__(self, root='data/indoor3d_sem_seg_hdf5_data', split='train', test_area=5): + self.root = root + self.all_files = self.getDataFiles(os.path.join(self.root, 'all_files.txt')) + self.room_filelist = self.getDataFiles(os.path.join(self.root, 'room_filelist.txt')) + self.scene_points_list = [] + self.semantic_labels_list = [] + + for h5_filename in self.all_files: + data_batch, label_batch = self.loadh5DataFile(h5_filename) + self.scene_points_list.append(data_batch) + self.semantic_labels_list.append(label_batch) + + self.data_batches = np.concatenate(self.scene_points_list, 0) + self.label_batches = np.concatenate(self.semantic_labels_list, 0) + + test_area = 'Area_' + str(test_area) + train_idxs, test_idxs = [], [] + + for i, room_name in enumerate(self.room_filelist): + if test_area in room_name: + test_idxs.append(i) + else: + train_idxs.append(i) + + assert split in ['train', 'test'] + if split == 'train': + self.data_batches = self.data_batches[train_idxs, ...] + self.label_batches = self.label_batches[train_idxs] + else: + self.data_batches = self.data_batches[test_idxs, ...] + self.label_batches = self.label_batches[test_idxs] + + @staticmethod + def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + + @staticmethod + def loadh5DataFile(PathtoFile): + f = h5py.File(PathtoFile, 'r') + return f['data'][:], f['label'][:] + + def __getitem__(self, index): + points = self.data_batches[index, :] + labels = self.label_batches[index].astype(np.int32) + + return points, labels + + def __len__(self): + return len(self.data_batches) + + +class S3DISDataset(Dataset): + """Chopped Scene""" + def __init__(self, root, block_points=4096, split='train', test_area=5, with_rgb=True, use_weight=True, + block_size=1.5, padding=0.001): + self.npoints = block_points + self.block_size = block_size + self.padding = padding + self.root = root + self.with_rgb = with_rgb + self.split = split + assert split in ['train', 'test'] + if self.split == 'train': + self.file_list = [d for d in os.listdir(root) if d.find('Area_%d' % test_area) is -1] + else: + self.file_list = [d for d in os.listdir(root) if d.find('Area_%d' % test_area) is not -1] + self.scene_points_list = [] + self.semantic_labels_list = [] + + for file in self.file_list: + data = np.load(root + file) + self.scene_points_list.append(data[:, :6]) # (num_points, 6), xyz + rgb + self.semantic_labels_list.append(data[:, 6]) # (num_points, ) + + assert len(self.scene_points_list) == len(self.semantic_labels_list) + print('Number of scene: ', len(self.scene_points_list)) + + if split == 'train' and use_weight: + labelweights = np.zeros(13) + for seg in self.semantic_labels_list: + tmp, _ = np.histogram(seg, range(14)) + labelweights += tmp + labelweights = labelweights.astype(np.float32) + labelweights = labelweights / np.sum(labelweights) + self.labelweights = np.power(np.amax(labelweights) / labelweights, 1 / 3.0) + + # reciprocal of the # of class + ce_label_weight = 1 / (labelweights + 0.02) + self.labelweights = ce_label_weight + + else: + self.labelweights = np.ones(13) + + # just use the average weights + self.labelweights = np.ones(13) + print(self.labelweights) + + def __getitem__(self, index): + if self.with_rgb: + point_set = self.scene_points_list[index] + point_set[:, 3:] = 2 * point_set[:, 3:] / 255.0 - 1 # normalised rgb into [-1, 1] + else: + point_set = self.scene_points_list[index][:, 0:3] + semantic_seg = self.semantic_labels_list[index].astype(np.int32) + coordmax = np.max(point_set[:, 0:3], axis=0) + coordmin = np.min(point_set[:, 0:3], axis=0) + + isvalid = False + for _ in range(10): + curcenter = point_set[np.random.choice(len(semantic_seg), 1)[0], 0:3] + curmin = curcenter - [self.block_size / 2, self.block_size / 2, 1.5] + curmax = curcenter + [self.block_size / 2, self.block_size / 2, 1.5] + curmin[2], curmax[2] = coordmin[2], coordmax[2] + curchoice = np.sum((point_set[:, 0:3] >= (curmin - 0.2)) * (point_set[:, 0:3] <= (curmax + 0.2)), + axis=1) == 3 + cur_point_set = point_set[curchoice, 0:3] + cur_point_full = point_set[curchoice, :] + cur_semantic_seg = semantic_seg[curchoice] + if len(cur_semantic_seg) == 0: + continue + mask = np.sum((cur_point_set >= (curmin - self.padding)) * (cur_point_set <= (curmax + self.padding)), + axis=1) == 3 + vidx = np.ceil((cur_point_set[mask, :] - curmin) / (curmax - curmin) * [31.0, 31.0, 62.0]) + vidx = np.unique(vidx[:, 0] * 31.0 * 62.0 + vidx[:, 1] * 62.0 + vidx[:, 2]) + isvalid = len(vidx) / 31.0 / 31.0 / 62.0 >= 0.02 + if isvalid: + break + choice = np.random.choice(len(cur_semantic_seg), self.npoints, replace=True) + point_set = cur_point_full[choice, :] + semantic_seg = cur_semantic_seg[choice] + mask = mask[choice] + sample_weight = self.labelweights[semantic_seg] + sample_weight *= mask + return point_set, semantic_seg, sample_weight + + def __len__(self): + return len(self.scene_points_list) + + +class S3DISDatasetWholeScene: + def __init__(self, root, block_points=8192, split='val', test_area=5, with_rgb=True, use_weight=True, + block_size=1.5, stride=1.5, padding=0.001): + self.npoints = block_points + self.block_size = block_size + self.padding = padding + self.stride = stride + self.root = root + self.with_rgb = with_rgb + self.split = split + assert split in ['train', 'test'] + if self.split == 'train': + self.file_list = [d for d in os.listdir(root) if d.find('Area_%d' % test_area) is -1] + else: + self.file_list = [d for d in os.listdir(root) if d.find('Area_%d' % test_area) is not -1] + self.scene_points_list = [] + self.semantic_labels_list = [] + for file in self.file_list: + data = np.load(root + file) + self.scene_points_list.append(data[:, :6]) + self.semantic_labels_list.append(data[:, 6]) + assert len(self.scene_points_list) == len(self.semantic_labels_list) + print('Number of scene: ', len(self.scene_points_list)) + if split == 'train' and use_weight: + labelweights = np.zeros(13) + for seg in self.semantic_labels_list: + tmp, _ = np.histogram(seg, range(14)) + labelweights += tmp + labelweights = labelweights.astype(np.float32) + labelweights = labelweights / np.sum(labelweights) + self.labelweights = np.power(np.amax(labelweights) / labelweights, 1 / 3.0) + else: + self.labelweights = np.ones(13) + + print(self.labelweights) + + def __getitem__(self, index): + if self.with_rgb: + point_set_ini = self.scene_points_list[index] + point_set_ini[:, 3:] = 2 * point_set_ini[:, 3:] / 255.0 - 1 + else: + point_set_ini = self.scene_points_list[index][:, 0:3] + semantic_seg_ini = self.semantic_labels_list[index].astype(np.int32) + coordmax = np.max(point_set_ini[:, 0:3], axis=0) + coordmin = np.min(point_set_ini[:, 0:3], axis=0) + nsubvolume_x = np.ceil((coordmax[0] - coordmin[0]) / self.block_size).astype(np.int32) + nsubvolume_y = np.ceil((coordmax[1] - coordmin[1]) / self.block_size).astype(np.int32) + point_sets = list() + semantic_segs = list() + sample_weights = list() + for i in range(nsubvolume_x): + for j in range(nsubvolume_y): + curmin = coordmin + [i * self.block_size, j * self.block_size, 0] + curmax = coordmin + [(i + 1) * self.block_size, (j + 1) * self.block_size, coordmax[2] - coordmin[2]] + curchoice = np.sum( + (point_set_ini[:, 0:3] >= (curmin - 0.2)) * (point_set_ini[:, 0:3] <= (curmax + 0.2)), axis=1) == 3 + cur_point_set = point_set_ini[curchoice, 0:3] + cur_point_full = point_set_ini[curchoice, :] + cur_semantic_seg = semantic_seg_ini[curchoice] + if len(cur_semantic_seg) == 0: + continue + mask = np.sum((cur_point_set >= (curmin - self.padding)) * (cur_point_set <= (curmax + self.padding)), + axis=1) == 3 + choice = np.random.choice(len(cur_semantic_seg), self.npoints, replace=True) + point_set = cur_point_full[choice, :] # Nx3/6 + semantic_seg = cur_semantic_seg[choice] # N + mask = mask[choice] + + sample_weight = self.labelweights[semantic_seg] + sample_weight *= mask # N + point_sets.append(np.expand_dims(point_set, 0)) # 1xNx3 + semantic_segs.append(np.expand_dims(semantic_seg, 0)) # 1xN + sample_weights.append(np.expand_dims(sample_weight, 0)) # 1xN + point_sets = np.concatenate(tuple(point_sets), axis=0) + semantic_segs = np.concatenate(tuple(semantic_segs), axis=0) + sample_weights = np.concatenate(tuple(sample_weights), axis=0) + return point_sets, semantic_segs, sample_weights + + def __len__(self): + return len(self.scene_points_list) + + +class ScannetDatasetWholeScene_evaluation: + # prepare to give prediction on each points + def __init__(self, root=root, block_points=8192, split='test', test_area=5, with_rgb=True, use_weight=True, + stride=0.5, block_size=1.5, padding=0.001): + self.block_points = block_points + self.block_size = block_size + self.padding = padding + self.root = root + self.with_rgb = with_rgb + self.split = split + self.stride = stride + self.scene_points_num = [] + assert split in ['train', 'test'] + if self.split == 'train': + self.file_list = [d for d in os.listdir(root) if d.find('Area_%d' % test_area) is -1] + else: + self.file_list = [d for d in os.listdir(root) if d.find('Area_%d' % test_area) is not -1] + self.scene_points_list = [] + self.semantic_labels_list = [] + for file in self.file_list: + data = np.load(root + file) + self.scene_points_list.append(data[:, :6]) + self.semantic_labels_list.append(data[:, 6]) + assert len(self.scene_points_list) == len(self.semantic_labels_list) + print('Number of scene: ', len(self.scene_points_list)) + if split == 'train' and use_weight: + labelweights = np.zeros(13) + for seg in self.semantic_labels_list: + tmp, _ = np.histogram(seg, range(14)) + self.scene_points_num.append(seg.shape[0]) + labelweights += tmp + labelweights = labelweights.astype(np.float32) + labelweights = labelweights / np.sum(labelweights) + self.labelweights = np.power(np.amax(labelweights) / labelweights, 1 / 3.0) + else: + self.labelweights = np.ones(13) + for seg in self.semantic_labels_list: + self.scene_points_num.append(seg.shape[0]) + + print(self.labelweights) + + @staticmethod + def chunks(l, n): + """Yield successive n-sized chunks from l.""" + for i in range(0, len(l), n): + yield l[i:i + n] + + @staticmethod + def split_data(data, idx): + new_data = [] + for i in range(len(idx)): + new_data += [np.expand_dims(data[idx[i]], axis=0)] + return new_data + + @staticmethod + def nearest_dist(block_center, block_center_list): + num_blocks = len(block_center_list) + dist = np.zeros(num_blocks) + for i in range(num_blocks): + dist[i] = np.linalg.norm(block_center_list[i] - block_center, ord=2) # i->j + return np.argsort(dist)[0] + + def __getitem__(self, index): + delta = self.stride + if self.with_rgb: + point_set_ini = self.scene_points_list[index] + point_set_ini[:, 3:] = 2 * point_set_ini[:, 3:] / 255.0 - 1 + else: + point_set_ini = self.scene_points_list[index][:, 0:3] + semantic_seg_ini = self.semantic_labels_list[index].astype(np.int32) + coordmax = np.max(point_set_ini[:, 0:3], axis=0) + coordmin = np.min(point_set_ini[:, 0:3], axis=0) + nsubvolume_x = np.ceil((coordmax[0] - coordmin[0]) / delta).astype(np.int32) + nsubvolume_y = np.ceil((coordmax[1] - coordmin[1]) / delta).astype(np.int32) + + point_sets, semantic_segs, sample_weights, point_idxs, block_center = [], [], [], [], [] + for i in range(nsubvolume_x): + for j in range(nsubvolume_y): + curmin = coordmin + [i * delta, j * delta, 0] + curmax = curmin + [self.block_size, self.block_size, coordmax[2] - coordmin[2]] + curchoice = np.sum( + (point_set_ini[:, 0:3] >= (curmin - 0.2)) * (point_set_ini[:, 0:3] <= (curmax + 0.2)), axis=1) == 3 + curchoice_idx = np.where(curchoice)[0] + cur_point_set = point_set_ini[curchoice, :] + cur_semantic_seg = semantic_seg_ini[curchoice] + if len(cur_semantic_seg) == 0: + continue + mask = np.sum((cur_point_set[:, 0:3] >= (curmin - self.padding)) * ( + cur_point_set[:, 0:3] <= (curmax + self.padding)), axis=1) == 3 + sample_weight = self.labelweights[cur_semantic_seg] + sample_weight *= mask # N + point_sets.append(cur_point_set) # 1xNx3/6 + semantic_segs.append(cur_semantic_seg) # 1xN + sample_weights.append(sample_weight) # 1xN + point_idxs.append(curchoice_idx) # 1xN + block_center.append((curmin[0:2] + curmax[0:2]) / 2.0) + + # merge small blocks + num_blocks = len(point_sets) + block_idx = 0 + while block_idx < num_blocks: + if point_sets[block_idx].shape[0] > self.block_points / 2: + block_idx += 1 + continue + + small_block_data = point_sets[block_idx].copy() + small_block_seg = semantic_segs[block_idx].copy() + small_block_smpw = sample_weights[block_idx].copy() + small_block_idxs = point_idxs[block_idx].copy() + small_block_center = block_center[block_idx].copy() + point_sets.pop(block_idx) + semantic_segs.pop(block_idx) + sample_weights.pop(block_idx) + point_idxs.pop(block_idx) + block_center.pop(block_idx) + + nearest_block_idx = self.nearest_dist(small_block_center, block_center) + point_sets[nearest_block_idx] = np.concatenate( + (point_sets[nearest_block_idx], small_block_data), axis=0) + semantic_segs[nearest_block_idx] = np.concatenate( + (semantic_segs[nearest_block_idx], small_block_seg), axis=0) + sample_weights[nearest_block_idx] = np.concatenate( + (sample_weights[nearest_block_idx], small_block_smpw), axis=0) + point_idxs[nearest_block_idx] = np.concatenate((point_idxs[nearest_block_idx], small_block_idxs), axis=0) + num_blocks = len(point_sets) + + # divide large blocks + num_blocks = len(point_sets) + div_blocks = [] + div_blocks_seg = [] + div_blocks_smpw = [] + div_blocks_idxs = [] + div_blocks_center = [] + for block_idx in range(num_blocks): + cur_num_pts = point_sets[block_idx].shape[0] + + point_idx_block = np.array([x for x in range(cur_num_pts)]) + if point_idx_block.shape[0] % self.block_points != 0: + makeup_num = self.block_points - point_idx_block.shape[0] % self.block_points + np.random.shuffle(point_idx_block) + point_idx_block = np.concatenate((point_idx_block, point_idx_block[0:makeup_num].copy())) + + np.random.shuffle(point_idx_block) + + sub_blocks = list(self.chunks(point_idx_block, self.block_points)) + + div_blocks += self.split_data(point_sets[block_idx], sub_blocks) + div_blocks_seg += self.split_data(semantic_segs[block_idx], sub_blocks) + div_blocks_smpw += self.split_data(sample_weights[block_idx], sub_blocks) + div_blocks_idxs += self.split_data(point_idxs[block_idx], sub_blocks) + div_blocks_center += [block_center[block_idx].copy() for _ in range(len(sub_blocks))] + div_blocks = np.concatenate(tuple(div_blocks), axis=0) + div_blocks_seg = np.concatenate(tuple(div_blocks_seg), axis=0) + div_blocks_smpw = np.concatenate(tuple(div_blocks_smpw), axis=0) + div_blocks_idxs = np.concatenate(tuple(div_blocks_idxs), axis=0) + return div_blocks, div_blocks_seg, div_blocks_smpw, div_blocks_idxs + + def __len__(self): + return len(self.scene_points_list) + + +if __name__ == '__main__': + data = S3DISDataset_HDF5() + for i in range(10): + points, labels = data[i] + print(points.shape) + print(labels.shape) + diff --git a/zoo/OcCo/OcCo_Torch/utils/ShapeNetDataLoader.py b/zoo/OcCo/OcCo_Torch/utils/ShapeNetDataLoader.py new file mode 100644 index 0000000..0539614 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/ShapeNetDataLoader.py @@ -0,0 +1,258 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/data_utils/ShapeNetDataLoader.py +import os, json, torch, warnings, numpy as np +# from PC_Augmentation import pc_normalize +from torch.utils.data import Dataset +import glob +import h5py +warnings.filterwarnings('ignore') + + +# class PartNormalDataset(Dataset): +# """ +# Data Source: https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip +# """ +# def __init__(self, root, num_point=2048, split='train', use_normal=False): +# self.catfile = os.path.join(root, 'synsetoffset2category.txt') +# self.use_normal = use_normal +# self.num_point = num_point +# self.cache_size = 20000 +# self.datapath = [] +# self.root = root +# self.cache = {} +# self.meta = {} +# self.cat = {} + +# with open(self.catfile, 'r') as f: +# for line in f: +# ls = line.strip().split() +# self.cat[ls[0]] = ls[1] +# # self.cat -> {'class name': syn_id, ...} +# # self.meta -> {'class name': file list, ...} +# # self.classes -> {'class name': class id, ...} +# # self.datapath -> [('class name', single file) , ...] +# self.classes = dict(zip(self.cat, range(len(self.cat)))) + +# train_ids = self.read_fns(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json')) +# test_ids = self.read_fns(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json')) +# val_ids = self.read_fns(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json')) + +# for item in self.cat: +# dir_point = os.path.join(self.root, self.cat[item]) +# fns = sorted(os.listdir(dir_point)) +# self.meta[item] = [] + +# if split is 'trainval': +# fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] +# elif split is 'test': +# fns = [fn for fn in fns if fn[0:-4] in test_ids] +# else: +# print('Unknown split: %s [Option: ]. Exiting...' % split) +# exit(-1) + +# for fn in fns: +# token = (os.path.splitext(os.path.basename(fn))[0]) +# self.meta[item].append(os.path.join(dir_point, token + '.txt')) + +# for item in self.cat: +# for fn in self.meta[item]: +# self.datapath.append((item, fn)) + +# self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], +# 'Rocket': [41, 42, 43], 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], +# 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Lamp': [24, 25, 26, 27], +# 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Knife': [22, 23], +# 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], +# 'Chair': [12, 13, 14, 15]} + +# @staticmethod +# def read_fns(path): +# with open(path, 'r') as file: +# ids = set([str(d.split('/')[2]) for d in json.load(file)]) +# return ids + +# def __getitem__(self, index): +# if index in self.cache: +# pts, cls, seg = self.cache[index] +# else: +# fn = self.datapath[index] +# cat, pt = fn[0], np.loadtxt(fn[1]).astype(np.float32) +# cls = np.array([self.classes[cat]]).astype(np.int32) +# pts = pt[:, :6] if self.use_normal else pt[:, :3] +# seg = pt[:, -1].astype(np.int32) +# if len(self.cache) < self.cache_size: +# self.cache[index] = (pts, cls, seg) + +# choice = np.random.choice(len(seg), self.num_point, replace=True) +# pts[:, 0:3] = pc_normalize(pts[:, 0:3]) +# pts, seg = pts[choice, :], seg[choice] + +# return pts, cls, seg + +# def __len__(self): +# return len(self.datapath) + + + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = { + 'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15 + } + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + +class ShapeNetC(Dataset): + def __init__(self, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = { + 'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15 + } + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] # number of parts for each category + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + seg = self.seg[item] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + + +DATA_DIR = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' +SHAPENET_C_DIR = '/mnt/lustre/share/jwren/to_kld/shapenet_c' + +def load_data_partseg(partition, sub=None): + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + elif partition == 'shapenet-c': + file = os.path.join(SHAPENET_C_DIR, '%s.h5'%sub) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + + + if partition == 'shapenet-c': + # for h5_name in file: + # f = h5py.File(h5_name, 'r+') + f = h5py.File(file, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') # part seg label + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + else: + for h5_name in file: + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +def rotate_pointcloud(pointcloud): + theta = np.pi*2 * np.random.uniform() + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + pointcloud[:,[0,2]] = pointcloud[:,[0,2]].dot(rotation_matrix) # random rotation (x,z) + return pointcloud + + + + +# if __name__ == "__main__": + +# root = '../data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' +# TRAIN_DATASET = PartNormalDataset(root=root, num_point=2048, split='trainval', use_normal=False) +# trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=24, shuffle=True, num_workers=4) + +# for i, data in enumerate(trainDataLoader): +# points, label, target = data + diff --git a/zoo/OcCo/OcCo_Torch/utils/TSNE_Visu.py b/zoo/OcCo/OcCo_Torch/utils/TSNE_Visu.py new file mode 100644 index 0000000..e3008b0 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/TSNE_Visu.py @@ -0,0 +1,82 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html + +import os, sys, torch, argparse, importlib, numpy as np, matplotlib.pyplot as plt +sys.path.append('../') +sys.path.append('../models') +from ModelNetDataLoader import General_CLSDataLoader_HDF5 +from Torch_Utility import copy_parameters +from torch.utils.data import DataLoader +from Dataset_Loc import Dataset_Loc +from sklearn.manifold import TSNE +from tqdm import tqdm + + +def parse_args(): + parser = argparse.ArgumentParser('SVM on Point Cloud Classification') + + ''' === Network Model === ''' + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--model', default='pcn_util', help='model [default: pcn_util]') + parser.add_argument('--batch_size', type=int, default=24, help='batch size [default: 24]') + parser.add_argument('--restore_path', type=str, help="path to pretrained weights [default: None]") + + ''' === Dataset === ''' + parser.add_argument('--partial', action='store_true', help='partial objects [default: False]') + parser.add_argument('--bn', action='store_true', help='with background noise [default: False]') + parser.add_argument('--dataset', type=str, default='modelnet40', help='dataset [default: modelnet40]') + parser.add_argument('--fname', type=str, help='filename, used in ScanObjectNN or fewer data [default:]') + + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + NUM_CLASSES, TRAIN_FILES, TEST_FILES = Dataset_Loc(dataset=args.dataset, fname=args.fname, + partial=args.partial, bn=args.bn) + TRAIN_DATASET = General_CLSDataLoader_HDF5(file_list=TRAIN_FILES) + # TEST_DATASET = General_CLSDataLoader_HDF5(file_list=TEST_FILES) + trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + # testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + + MODEL = importlib.import_module(args.model) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + encoder = MODEL.encoder(args=args, num_channel=3).to(device) + encoder = torch.nn.DataParallel(encoder) + + checkpoint = torch.load(args.restore_path) + encoder = copy_parameters(encoder, checkpoint, verbose=True) + + X_train, y_train, X_test, y_test = [], [], [], [] + with torch.no_grad(): + encoder.eval() + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + points, target = points.float().transpose(2, 1).cuda(), target.long().cuda() + feats = encoder(points) + X_train.append(feats.cpu().numpy()) + y_train.append(target.cpu().numpy()) + + # for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + # points, target = points.float().transpose(2, 1).cuda(), target.long().cuda() + # feats = encoder(points) + # X_test.append(feats.cpu().numpy()) + # y_test.append(target.cpu().numpy()) + + X_train, y_train = np.concatenate(X_train), np.concatenate(y_train) + # X_test, y_test = np.concatenate(X_test), np.concatenate(y_test) + + # In general, larger dataset/num of class require larger perplexity + X_embedded = TSNE(n_components=2, perplexity=100).fit_transform(X_train) + + plt.figure(figsize=(16, 16)) + plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=y_train, cmap=plt.cm.get_cmap("jet", NUM_CLASSES)) + plt.colorbar(ticks=range(1, NUM_CLASSES + 1)) + plt.clim(0.5, NUM_CLASSES + 0.5) + # plt.savefig('log/tsne/tsne_shapenet10_pcn.pdf') + plt.show() + diff --git a/zoo/OcCo/OcCo_Torch/utils/Torch_Utility.py b/zoo/OcCo/OcCo_Torch/utils/Torch_Utility.py new file mode 100644 index 0000000..a7be474 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/Torch_Utility.py @@ -0,0 +1,50 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/pytorch/pytorch/issues/7068#issuecomment-487907668 +import torch, os, random, numpy as np + + +def seed_torch(seed=1029): + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) # for multi-GPU Usage + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + +def copy_parameters(model, pretrained, verbose=True): + # ref: https://discuss.pytorch.org/t/how-to-load-part-of-pre-trained-model/1113/3 + + model_dict = model.state_dict() + pretrained_dict = pretrained['model_state_dict'] + pretrained_dict = {k: v for k, v in pretrained_dict.items() if + k in model_dict and pretrained_dict[k].size() == model_dict[k].size()} + + if verbose: + print('=' * 27) + print('Restored Params and Shapes:') + for k, v in pretrained_dict.items(): + print(k, ': ', v.size()) + print('=' * 68) + model_dict.update(pretrained_dict) + model.load_state_dict(model_dict) + return model + + +def weights_init(m): + """ + Xavier normal initialisation for weights and zero bias, + find especially useful for completion and segmentation Tasks + """ + classname = m.__class__.__name__ + if (classname.find('Conv1d') != -1) or (classname.find('Conv2d') != -1) or (classname.find('Linear') != -1): + torch.nn.init.xavier_normal_(m.weight.data) + if m.bias is not None: + torch.nn.init.constant_(m.bias.data, 0.0) + + +def bn_momentum_adjust(m, momentum): + if isinstance(m, torch.nn.BatchNorm2d) or isinstance(m, torch.nn.BatchNorm1d): + m.momentum = momentum diff --git a/zoo/OcCo/OcCo_Torch/utils/TrainLogger.py b/zoo/OcCo/OcCo_Torch/utils/TrainLogger.py new file mode 100644 index 0000000..4b06e2b --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/TrainLogger.py @@ -0,0 +1,159 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, logging, datetime, numpy as np, sklearn.metrics as metrics +from pathlib import Path + + +class TrainLogger: + + def __init__(self, args, name='model', subfold='cls', filename='train_log', cls2name=None): + self.step = 1 + self.epoch = 1 + self.args = args + self.name = name + self.sf = subfold + self.mkdir() + self.setup(filename=filename) + self.epoch_init() + self.save_model = False + self.cls2name = cls2name + self.best_instance_acc, self.best_class_acc, self.best_miou = 0., 0., 0. + self.best_instance_epoch, self.best_class_epoch, self.best_miou_epoch = 0, 0, 0 + self.savepath = str(self.checkpoints_dir) + '/best_model.pth' + + def setup(self, filename='train_log'): + self.logger = logging.getLogger(self.name) + self.logger.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler(os.path.join(self.log_dir, filename + '.txt')) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + # ref: https://stackoverflow.com/a/53496263/12525201 + # define a Handler which writes INFO messages or higher to the sys.stderr + console = logging.StreamHandler() + console.setLevel(logging.INFO) + # logging.getLogger('').addHandler(console) # this is root logger + self.logger.addHandler(console) + self.logger.addHandler(file_handler) + self.logger.info('PARAMETER ...') + self.logger.info(self.args) + self.logger.removeHandler(console) + + def mkdir(self): + timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + experiment_dir = Path('./log/') + experiment_dir.mkdir(exist_ok=True) + experiment_dir = experiment_dir.joinpath(self.sf) + experiment_dir.mkdir(exist_ok=True) + + if self.args.log_dir is None: + self.experiment_dir = experiment_dir.joinpath(timestr) + else: + self.experiment_dir = experiment_dir.joinpath(self.args.log_dir) + + self.experiment_dir.mkdir(exist_ok=True) + self.checkpoints_dir = self.experiment_dir.joinpath('checkpoints/') + self.checkpoints_dir.mkdir(exist_ok=True) + self.log_dir = self.experiment_dir.joinpath('logs/') + self.log_dir.mkdir(exist_ok=True) + + # @property.setter + def epoch_init(self, training=True): + self.loss, self.count, self.pred, self.gt = 0., 0., [], [] + if training: + self.logger.info('Epoch %d/%d:' % (self.epoch, self.args.epoch)) + + def step_update(self, pred, gt, loss, training=True): + if training: + self.step += 1 # Use TensorFlow way to count training steps + self.gt.append(gt) + self.pred.append(pred) + batch_size = len(pred) + self.count += batch_size + self.loss += loss * batch_size + + def epoch_update(self, training=True, mode='cls'): + self.save_model = False + self.gt = np.concatenate(self.gt) + self.pred = np.concatenate(self.pred) + + instance_acc = metrics.accuracy_score(self.gt, self.pred) + if instance_acc > self.best_instance_acc and not training: + self.save_model = True if mode == 'cls' else False + self.best_instance_acc = instance_acc + self.best_instance_epoch = self.epoch + + if mode == 'cls': + class_acc = metrics.balanced_accuracy_score(self.gt, self.pred) + if class_acc > self.best_class_acc and not training: + self.best_class_epoch = self.epoch + self.best_class_acc = class_acc + return instance_acc, class_acc + elif mode == 'partseg': + miou = self.calculate_IoU().mean() + if miou > self.best_miou and not training: + self.best_miou_epoch = self.epoch + self.save_model = True + self.best_miou = miou + return instance_acc, miou + else: + raise ValueError('Mode is not Supported by TrainLogger') + + def epoch_summary(self, writer=None, training=True, mode='cls'): + criteria = 'Class Accuracy' if mode == 'cls' else 'mIoU' + instance_acc, class_acc = self.epoch_update(training=training, mode=mode) + if training: + if writer is not None: + writer.add_scalar('Train Instance Accuracy', instance_acc, self.step) + writer.add_scalar('Train %s' % criteria, class_acc, self.step) + self.logger.info('Train Instance Accuracy: %.3f' % instance_acc) + self.logger.info('Train %s: %.3f' % (criteria, class_acc)) + else: + if writer is not None: + writer.add_scalar('Test Instance Accuracy', instance_acc, self.step) + writer.add_scalar('Test %s' % criteria, class_acc, self.step) + self.logger.info('Test Instance Accuracy: %.3f' % instance_acc) + self.logger.info('Test %s: %.3f' % (criteria, class_acc)) + self.logger.info('Best Instance Accuracy: %.3f at Epoch %d ' % ( + self.best_instance_acc, self.best_instance_epoch)) + if self.best_class_acc > .1: + self.logger.info('Best Class Accuracy: %.3f at Epoch %d' % ( + self.best_class_acc, self.best_class_epoch)) + if self.best_miou > .1: + self.logger.info('Best mIoU: %.3f at Epoch %d' % ( + self.best_miou, self.best_miou_epoch)) + + self.epoch += 1 if not training else 0 + if self.save_model: + self.logger.info('Saving the Model Params to %s' % self.savepath) + + def calculate_IoU(self): + num_class = len(self.cls2name) + Intersection = np.zeros(num_class) + Union = Intersection.copy() + # self.pred -> numpy.ndarray (total predictions, ) + + for sem_idx in range(num_class): + Intersection[sem_idx] = np.sum(np.logical_and(self.pred == sem_idx, self.gt == sem_idx)) + Union[sem_idx] = np.sum(np.logical_or(self.pred == sem_idx, self.gt == sem_idx)) + return Intersection / Union + + def train_summary(self, mode='cls'): + self.logger.info('\n\nEnd of Training...') + self.logger.info('Best Instance Accuracy: %.3f at Epoch %d ' % ( + self.best_instance_acc, self.best_instance_epoch)) + if mode == 'cls': + self.logger.info('Best Class Accuracy: %.3f at Epoch %d' % ( + self.best_class_acc, self.best_class_epoch)) + elif mode == 'partseg': + self.logger.info('Best mIoU: %.3f at Epoch %d' % ( + self.best_miou, self.best_miou_epoch)) + + def update_from_checkpoints(self, checkpoint): + self.logger.info('Use Pre-Trained Weights') + self.step = checkpoint['step'] + self.epoch = checkpoint['epoch'] + self.best_instance_epoch, self.best_instance_acc = checkpoint['epoch'], checkpoint['instance_acc'] + self.best_class_epoch, self.best_class_acc = checkpoint['best_class_epoch'], checkpoint['best_class_acc'] + self.logger.info('Best Class Acc {:.3f} at Epoch {}'.format(self.best_instance_acc, self.best_class_epoch)) + self.logger.info('Best Instance Acc {:.3f} at Epoch {}'.format(self.best_instance_acc, self.best_instance_epoch)) diff --git a/zoo/OcCo/OcCo_Torch/utils/Visu_Utility.py b/zoo/OcCo/OcCo_Torch/utils/Visu_Utility.py new file mode 100644 index 0000000..dae23f7 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/Visu_Utility.py @@ -0,0 +1,46 @@ +# Copyright (c) 2020. Author: Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/visu_util.py + +# uncomment following commands if you have saving issues +# ref: https://stackoverflow.com/questions/13336823/matplotlib-python-error +# import matplotlib +# matplotlib.use('Agg') +from matplotlib import pyplot as plt +from mpl_toolkits.mplot3d import Axes3D + + +def plot_pcd_three_views(filename, pcds, titles, suptitle='', sizes=None, cmap='viridis', zdir='y', + xlim=(-0.3, 0.3), ylim=(-0.3, 0.3), zlim=(-0.3, 0.3)): + if sizes is None: + sizes = [0.5 for _ in range(len(pcds))] + fig = plt.figure(figsize=(len(pcds) * 3, 9)) + for i in range(3): + elev = 30 + azim = -45 + 90 * i + for j, (pcd, size) in enumerate(zip(pcds, sizes)): + color = pcd[:, 0] + ax = fig.add_subplot(3, len(pcds), i * len(pcds) + j + 1, projection='3d') + ax.view_init(elev, azim) + ax.scatter(pcd[:, 0], pcd[:, 1], pcd[:, 2], zdir=zdir, c=color, s=size, cmap=cmap, vmin=-1, vmax=0.5) + ax.set_title(titles[j]) + ax.set_axis_off() + ax.set_xlim(xlim) + ax.set_ylim(ylim) + ax.set_zlim(zlim) + plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.9, wspace=0.1, hspace=0.1) + plt.suptitle(suptitle) + fig.savefig(filename) + plt.close(fig) + + +if __name__ == "__main__": + pass + # filenames = ['airplane.pcd', 'car.pcd', 'chair.pcd', 'lamp.pcd'] # '../demo_data' + # for file in filenames: + # filename = file.replace('.pcd', '') + # pcds = [np.asarray(read_point_cloud('../demo_data/' + file).points)] + # # pdb.set_trace() + # titles = ['viewpoint 1', 'viewpoint 2', 'viewpoint 3'] + # plot_pcd_three_views(s + # filename, pcds, titles, suptitle=filename, sizes=None, cmap='viridis', zdir='y', + # xlim=(-0.3, 0.3), ylim=(-0.3, 0.3), zlim=(-0.3, 0.3)) diff --git a/zoo/OcCo/OcCo_Torch/utils/__init__.py b/zoo/OcCo/OcCo_Torch/utils/__init__.py new file mode 100644 index 0000000..741971b --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + diff --git a/zoo/OcCo/OcCo_Torch/utils/collect_indoor3d_data.py b/zoo/OcCo/OcCo_Torch/utils/collect_indoor3d_data.py new file mode 100644 index 0000000..4de17f4 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/collect_indoor3d_data.py @@ -0,0 +1,26 @@ +# Ref: https://github.com/charlesq34/pointnet/blob/master/sem_seg/collect_indoor3d_data.py + +import os, sys, indoor3d_util +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) + +anno_paths = [line.rstrip() for line in open(os.path.join(BASE_DIR, 'meta/anno_paths.txt'))] +anno_paths = [os.path.join(indoor3d_util.DATA_PATH, p) for p in anno_paths] + +output_folder = os.path.join(ROOT_DIR, 'data/stanford_indoor3d') +# output_folder = os.path.join('../data/stanford_indoor3d') +if not os.path.exists(output_folder): + os.mkdir(output_folder) + +# Note: there is an extra character in the v1.2 data in Area_5/hallway_6. It's fixed manually. +# Ref: https://github.com/charlesq34/pointnet/issues/45 +for anno_path in anno_paths: + print(anno_path) + try: + elements = anno_path.split('/') + out_filename = elements[-3]+'_'+elements[-2]+'.npy' # e.g., Area_1_hallway_1.npy + indoor3d_util.collect_point_label( + anno_path, os.path.join(output_folder, out_filename), 'numpy') + except: + print(anno_path, 'ERROR!!') diff --git a/zoo/OcCo/OcCo_Torch/utils/gen_indoor3d_h5.py b/zoo/OcCo/OcCo_Torch/utils/gen_indoor3d_h5.py new file mode 100644 index 0000000..e51c446 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/gen_indoor3d_h5.py @@ -0,0 +1,98 @@ +# Ref: https://github.com/charlesq34/pointnet/blob/master/sem_seg/gen_indoor3d_h5.py + +import os, sys, h5py, indoor3d_util, numpy as np + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +data_dir = os.path.join(ROOT_DIR, 'data') +indoor3d_data_dir = os.path.join(data_dir, 'stanford_indoor3d') +NUM_POINT = 4096 +H5_BATCH_SIZE = 1000 +data_dim = [NUM_POINT, 9] +label_dim = [NUM_POINT] +data_dtype = 'float32' +label_dtype = 'uint8' + +# Set paths +filelist = os.path.join(BASE_DIR, 'meta/all_data_label.txt') +data_label_files = [os.path.join(indoor3d_data_dir, line.rstrip()) for line in open(filelist)] +output_dir = os.path.join(data_dir, 'indoor3d_sem_seg_hdf5_data') +if not os.path.exists(output_dir): + os.mkdir(output_dir) +output_filename_prefix = os.path.join(output_dir, 'ply_data_all') +output_room_filelist = os.path.join(output_dir, 'room_filelist.txt') +fout_room = open(output_room_filelist, 'w') + +# -------------------------------------- +# ----- BATCH WRITE TO HDF5 ----- +# -------------------------------------- +batch_data_dim = [H5_BATCH_SIZE] + data_dim +batch_label_dim = [H5_BATCH_SIZE] + label_dim +h5_batch_data = np.zeros(batch_data_dim, dtype=np.float32) +h5_batch_label = np.zeros(batch_label_dim, dtype=np.uint8) +buffer_size = 0 # state: record how many samples are currently in buffer +h5_index = 0 # state: the next h5 file to save + + +def insert_batch(data, label, last_batch=False): + global h5_batch_data, h5_batch_label + global buffer_size, h5_index + + def save_h5(h5_filename, data, label, data_dtype='uint8', label_dtype='uint8'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + name='data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + name='label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + + data_size = data.shape[0] + # If there is enough space, just insert + if buffer_size + data_size <= h5_batch_data.shape[0]: + h5_batch_data[buffer_size:buffer_size + data_size, ...] = data + h5_batch_label[buffer_size:buffer_size + data_size] = label + buffer_size += data_size + else: # not enough space + capacity = h5_batch_data.shape[0] - buffer_size + assert (capacity >= 0) + if capacity > 0: + h5_batch_data[buffer_size:buffer_size + capacity, ...] = data[0:capacity, ...] + h5_batch_label[buffer_size:buffer_size + capacity, ...] = label[0:capacity, ...] + # Save batch data and label to h5 file, reset buffer_size + h5_filename = output_filename_prefix + '_' + str(h5_index) + '.h5' + save_h5(h5_filename, h5_batch_data, h5_batch_label, data_dtype, label_dtype) + print('Stored {0} with size {1}'.format(h5_filename, h5_batch_data.shape[0])) + h5_index += 1 + buffer_size = 0 + # recursive call + insert_batch(data[capacity:, ...], label[capacity:, ...], last_batch) + if last_batch and buffer_size > 0: + h5_filename = output_filename_prefix + '_' + str(h5_index) + '.h5' + save_h5(h5_filename, h5_batch_data[0:buffer_size, ...], + h5_batch_label[0:buffer_size, ...], data_dtype, label_dtype) + print('Stored {0} with size {1}'.format(h5_filename, buffer_size)) + h5_index += 1 + buffer_size = 0 + return + + +sample_cnt = 0 +for i, data_label_filename in enumerate(data_label_files): + print(data_label_filename) + data, label = indoor3d_util.room2blocks_wrapper_normalized( + data_label_filename, NUM_POINT, block_size=1.0, stride=0.5, random_sample=False, sample_num=None) + print('{0}, {1}'.format(data.shape, label.shape)) + for _ in range(data.shape[0]): + fout_room.write(os.path.basename(data_label_filename)[0:-4] + '\n') + + sample_cnt += data.shape[0] + insert_batch(data, label, i == len(data_label_files) - 1) + +fout_room.close() +print("Total samples: {0}".format(sample_cnt)) diff --git a/zoo/OcCo/OcCo_Torch/utils/indoor3d_util.py b/zoo/OcCo/OcCo_Torch/utils/indoor3d_util.py new file mode 100644 index 0000000..b6acbf5 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/indoor3d_util.py @@ -0,0 +1,606 @@ +# Ref: https://github.com/charlesq34/pointnet/blob/master/sem_seg/indoor3d_util.py +import os, sys, glob, numpy as np + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) + +# ----------------------------------------------------------------------------- +# CONSTANTS +# ----------------------------------------------------------------------------- + +DATA_PATH = os.path.join(ROOT_DIR, 'data', 'Stanford3dDataset_v1.2_Aligned_Version') +g_classes = [x.rstrip() for x in open(os.path.join(BASE_DIR, 'meta/s3dis/class_names.txt'))] +g_class2label = {cls: i for i, cls in enumerate(g_classes)} +g_class2color = {'ceiling': [0, 255, 0], + 'floor': [0, 0, 255], + 'wall': [0, 255, 255], + 'beam': [255, 255, 0], + 'column': [255, 0, 255], + 'window': [100, 100, 255], + 'door': [200, 200, 100], + 'table': [170, 120, 200], + 'chair': [255, 0, 0], + 'sofa': [200, 100, 100], + 'bookcase': [10, 200, 100], + 'board': [200, 200, 200], + 'clutter': [50, 50, 50]} +g_easy_view_labels = [7, 8, 9, 10, 11, 1] +g_label2color = {g_classes.index(cls): g_class2color[cls] for cls in g_classes} + + +# ----------------------------------------------------------------------------- +# CONVERT ORIGINAL DATA TO OUR DATA_LABEL FILES +# ----------------------------------------------------------------------------- + +def collect_point_label(anno_path, out_filename, file_format='txt'): + """ Convert original dataset files to data_label file (each line is XYZRGBL). + We aggregated all the points from each instance in the room. + + Args: + anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ + out_filename: path to save collected points and labels (each line is XYZRGBL) + file_format: txt or numpy, determines what file format to save. + Returns: + None + Note: + the points are shifted before save, the most negative point is now at origin. + """ + points_list = [] + for f in glob.glob(os.path.join(anno_path, '*.txt')): + cls = os.path.basename(f).split('_')[0] + # print(f) + if cls not in g_classes: # note: in some room there is 'staris' class.. + cls = 'clutter' + + points = np.loadtxt(f) + labels = np.ones((points.shape[0], 1)) * g_class2label[cls] + points_list.append(np.concatenate([points, labels], 1)) # Nx7 + + data_label = np.concatenate(points_list, 0) + xyz_min = np.amin(data_label, axis=0)[0:3] + data_label[:, 0:3] -= xyz_min + + if file_format == 'txt': + fout = open(out_filename, 'w') + for i in range(data_label.shape[0]): + fout.write('%f %f %f %d %d %d %d\n' % + (data_label[i, 0], data_label[i, 1], data_label[i, 2], + data_label[i, 3], data_label[i, 4], data_label[i, 5], + data_label[i, 6])) + fout.close() + elif file_format == 'numpy': + np.save(out_filename, data_label) + else: + print('ERROR!! Unknown file format: %s, please use txt or numpy.' % file_format) + exit() + + +def data_to_obj(data, name='example.obj', no_wall=True): + fout = open(name, 'w') + label = data[:, -1].astype(int) + for i in range(data.shape[0]): + if no_wall and ((label[i] == 2) or (label[i] == 0)): + continue + fout.write('v %f %f %f %d %d %d\n' % \ + (data[i, 0], data[i, 1], data[i, 2], data[i, 3], data[i, 4], data[i, 5])) + fout.close() + + +def point_label_to_obj(input_filename, out_filename, label_color=True, easy_view=False, no_wall=False): + """ For visualization of a room from data_label file, + input_filename: each line is X Y Z R G B L + out_filename: OBJ filename, + visualize input file by coloring point with label color + easy_view: only visualize furnitures and floor + """ + data_label = np.loadtxt(input_filename) + data = data_label[:, 0:6] + label = data_label[:, -1].astype(int) + fout = open(out_filename, 'w') + for i in range(data.shape[0]): + color = g_label2color[label[i]] + if easy_view and (label[i] not in g_easy_view_labels): + continue + if no_wall and ((label[i] == 2) or (label[i] == 0)): + continue + if label_color: + fout.write('v %f %f %f %d %d %d\n' % \ + (data[i, 0], data[i, 1], data[i, 2], color[0], color[1], color[2])) + else: + fout.write('v %f %f %f %d %d %d\n' % \ + (data[i, 0], data[i, 1], data[i, 2], data[i, 3], data[i, 4], data[i, 5])) + fout.close() + + +# ----------------------------------------------------------------------------- +# PREPARE BLOCK DATA FOR NETWORK TRAINING/TESTING +# ----------------------------------------------------------------------------- + +def sample_data(data, num_sample): + """ data is in N x ... + we want to keep (num_sample, C) of them. + if N > num_sample, we will randomly keep num_sample of them. + if N < num_sample, we will randomly duplicate samples. + """ + N = data.shape[0] + if N == num_sample: + return data, range(N) + elif N > num_sample: + sample = np.random.choice(N, num_sample) + return data[sample, ...], sample + else: + sample = np.random.choice(N, num_sample - N) + dup_data = data[sample, ...] + return np.concatenate([data, dup_data], 0), list(range(N)) + list(sample) + + +def sample_data_label(data, label, num_sample): + # randomly sub select or duplicate for up-sampling + new_data, sample_indices = sample_data(data, num_sample) + new_label = label[sample_indices] + return new_data, new_label + + +def room2blocks(data, label, num_point, block_size=1.0, stride=1.0, + random_sample=False, sample_num=None, sample_aug=1): + """ Prepare block training data. + Args: + data: N x 6 numpy array, 012 are XYZ in meters, 345 are RGB in [0,1] + assumes the data is shifted (min point is origin) and aligned + (aligned with XYZ axis) + label: N size uint8 numpy array from 0-12 + num_point: int, how many points to sample in each block + block_size: float, physical size of the block in meters + stride: float, stride for block sweeping + random_sample: bool, if True, we will randomly sample blocks in the room + sample_num: int, if random sample, how many blocks to sample + [default: room area] + sample_aug: if random sample, how much aug + Returns: + block_datas: K x num_point x 6 np array of XYZRGB, RGB is in [0,1] + block_labels: K x num_point x 1 np array of uint8 labels + + TODO: for this version, blocking is in fixed, non-overlapping pattern. + """ + assert (stride <= block_size) + + limit = np.amax(data, 0)[0:3] + + # Get the corner location for our sampling blocks + xbeg_list = [] + ybeg_list = [] + if not random_sample: + num_block_x = int(np.ceil((limit[0] - block_size) / stride)) + 1 + num_block_y = int(np.ceil(collect_point_label(limit[1] - block_size) / stride)) + 1 + for i in range(num_block_x): + for j in range(num_block_y): + xbeg_list.append(i * stride) + ybeg_list.append(j * stride) + else: # random sample blocks from the room, not used in gen_indoor3d_h5.py + num_block_x = int(np.ceil(limit[0] / block_size)) + num_block_y = int(np.ceil(limit[1] / block_size)) + if sample_num is None: + sample_num = num_block_x * num_block_y * sample_aug + for _ in range(sample_num): + xbeg = np.random.uniform(-block_size, limit[0]) + ybeg = np.random.uniform(-block_size, limit[1]) + xbeg_list.append(xbeg) + ybeg_list.append(ybeg) + + # Collect blocks + block_data_list = [] + block_label_list = [] + for idx in range(len(xbeg_list)): + xbeg = xbeg_list[idx] + ybeg = ybeg_list[idx] + # xcond -> bool array with a shape of (Num_Total_Points, ) + xcond = (data[:, 0] <= xbeg + block_size) & (data[:, 0] >= xbeg) + ycond = (data[:, 1] <= ybeg + block_size) & (data[:, 1] >= ybeg) + cond = xcond & ycond + if np.sum(cond) < 100: # discard block if there are less than 100 pts. + continue + + block_data = data[cond, :] + block_label = label[cond] + + # randomly subsample data + block_data_sampled, block_label_sampled = \ + sample_data_label(block_data, block_label, num_point) + block_data_list.append(np.expand_dims(block_data_sampled, 0)) + block_label_list.append(np.expand_dims(block_label_sampled, 0)) + + return np.concatenate(block_data_list, 0), np.concatenate(block_label_list, 0) + + +def room2blocks_plus(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug): + """ room2block with input filename and RGB pre-processing. + """ + data = data_label[:, 0:6] + data[:, 3:6] /= 255.0 + label = data_label[:, -1].astype(np.uint8) + + return room2blocks(data, label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + + +def room2blocks_wrapper(data_label_filename, num_point, block_size=1.0, stride=1.0, + random_sample=False, sample_num=None, sample_aug=1): + if data_label_filename[-3:] == 'txt': + data_label = np.loadtxt(data_label_filename) + elif data_label_filename[-3:] == 'npy': + data_label = np.load(data_label_filename) + else: + print('Unknown file type! exiting.') + exit() + return room2blocks_plus(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + + +def room2blocks_plus_normalized(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug): + """ room2block, with input filename and RGB preprocessing. + for each block centralize XYZ, add normalized XYZ as 678 channels + """ + data = data_label[:, 0:6] + data[:, 3:6] /= 255.0 + label = data_label[:, -1].astype(np.uint8) + max_room_x = max(data[:, 0]) + max_room_y = max(data[:, 1]) + max_room_z = max(data[:, 2]) + + data_batch, label_batch = room2blocks(data, label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + new_data_batch = np.zeros((data_batch.shape[0], num_point, 9)) + for b in range(data_batch.shape[0]): + new_data_batch[b, :, 6] = data_batch[b, :, 0] / max_room_x + new_data_batch[b, :, 7] = data_batch[b, :, 1] / max_room_y + new_data_batch[b, :, 8] = data_batch[b, :, 2] / max_room_z + minx = min(data_batch[b, :, 0]) + miny = min(data_batch[b, :, 1]) + data_batch[b, :, 0] -= (minx + block_size / 2) + data_batch[b, :, 1] -= (miny + block_size / 2) + new_data_batch[:, :, 0:6] = data_batch + return new_data_batch, label_batch + + +def room2blocks_wrapper_normalized(data_label_filename, num_point, block_size=1.0, stride=1.0, + random_sample=False, sample_num=None, sample_aug=1): + if data_label_filename[-3:] == 'txt': + data_label = np.loadtxt(data_label_filename) + elif data_label_filename[-3:] == 'npy': + data_label = np.load(data_label_filename) + else: + print('Unknown file type! exiting.') + exit() + return room2blocks_plus_normalized(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + + +def room2samples(data, label, sample_num_point): + """ Prepare whole room samples. + + Args: + data: N x 6 numpy array, 012 are XYZ in meters, 345 are RGB in [0,1] + assumes the data is shifted (min point is origin) and + aligned (aligned with XYZ axis) + label: N size uint8 numpy array from 0-12 + sample_num_point: int, how many points to sample in each sample + Returns: + sample_datas: K x sample_num_point x 9 + numpy array of XYZRGBX'Y'Z', RGB is in [0,1] + sample_labels: K x sample_num_point x 1 np array of uint8 labels + """ + N = data.shape[0] + order = np.arange(N) + np.random.shuffle(order) + data = data[order, :] + label = label[order] + + batch_num = int(np.ceil(N / float(sample_num_point))) + sample_datas = np.zeros((batch_num, sample_num_point, 6)) + sample_labels = np.zeros((batch_num, sample_num_point, 1)) + + for i in range(batch_num): + beg_idx = i * sample_num_point + end_idx = min((i + 1) * sample_num_point, N) + num = end_idx - beg_idx + sample_datas[i, 0:num, :] = data[beg_idx:end_idx, :] + sample_labels[i, 0:num, 0] = label[beg_idx:end_idx] + if num < sample_num_point: + makeup_indices = np.random.choice(N, sample_num_point - num) + sample_datas[i, num:, :] = data[makeup_indices, :] + sample_labels[i, num:, 0] = label[makeup_indices] + return sample_datas, sample_labels + + +def room2samples_plus_normalized(data_label, num_point): + """ room2sample, with input filename and RGB preprocessing. + for each block centralize XYZ, add normalized XYZ as 678 channels + """ + data = data_label[:, 0:6] + data[:, 3:6] /= 255.0 + label = data_label[:, -1].astype(np.uint8) + max_room_x = max(data[:, 0]) + max_room_y = max(data[:, 1]) + max_room_z = max(data[:, 2]) + # print(max_room_x, max_room_y, max_room_z) + + data_batch, label_batch = room2samples(data, label, num_point) + new_data_batch = np.zeros((data_batch.shape[0], num_point, 9)) + for b in range(data_batch.shape[0]): + new_data_batch[b, :, 6] = data_batch[b, :, 0] / max_room_x + new_data_batch[b, :, 7] = data_batch[b, :, 1] / max_room_y + new_data_batch[b, :, 8] = data_batch[b, :, 2] / max_room_z + # minx = min(data_batch[b, :, 0]) + # miny = min(data_batch[b, :, 1]) + # data_batch[b, :, 0] -= (minx+block_size/2) + # data_batch[b, :, 1] -= (miny+block_size/2) + new_data_batch[:, :, 0:6] = data_batch + return new_data_batch, label_batch + + +def room2samples_wrapper_normalized(data_label_filename, num_point): + if data_label_filename[-3:] == 'txt': + data_label = np.loadtxt(data_label_filename) + elif data_label_filename[-3:] == 'npy': + data_label = np.load(data_label_filename) + else: + print('Unknown file type! exiting.') + exit() + return room2samples_plus_normalized(data_label, num_point) + + +# ----------------------------------------------------------------------------- +# EXTRACT INSTANCE BBOX FROM ORIGINAL DATA (for detection evaluation) +# ----------------------------------------------------------------------------- + +def collect_bounding_box(anno_path, out_filename): + """ Compute bounding boxes from each instance in original dataset files on + one room. **We assume the bbox is aligned with XYZ coordinate.** + + Args: + anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ + out_filename: path to save instance bounding boxes for that room. + each line is x1 y1 z1 x2 y2 z2 label, + where (x1,y1,z1) is the point on the diagonal closer to origin + Returns: + None + Note: + room points are shifted, the most negative point is now at origin. + """ + bbox_label_list = [] + + for f in glob.glob(os.path.join(anno_path, '*.txt')): + cls = os.path.basename(f).split('_')[0] + if cls not in g_classes: # note: in some room there is 'staris' class.. + cls = 'clutter' + points = np.loadtxt(f) + label = g_class2label[cls] + # Compute tightest axis aligned bounding box + xyz_min = np.amin(points[:, 0:3], axis=0) + xyz_max = np.amax(points[:, 0:3], axis=0) + ins_bbox_label = np.expand_dims( + np.concatenate([xyz_min, xyz_max, np.array([label])], 0), 0) + bbox_label_list.append(ins_bbox_label) + + bbox_label = np.concatenate(bbox_label_list, 0) + room_xyz_min = np.amin(bbox_label[:, 0:3], axis=0) + bbox_label[:, 0:3] -= room_xyz_min + bbox_label[:, 3:6] -= room_xyz_min + + fout = open(out_filename, 'w') + for i in range(bbox_label.shape[0]): + fout.write('%f %f %f %f %f %f %d\n' % \ + (bbox_label[i, 0], bbox_label[i, 1], bbox_label[i, 2], + bbox_label[i, 3], bbox_label[i, 4], bbox_label[i, 5], + bbox_label[i, 6])) + fout.close() + + +def bbox_label_to_obj(input_filename, out_filename_prefix, easy_view=False): + """ Visualization of bounding boxes. + + Args: + input_filename: each line is x1 y1 z1 x2 y2 z2 label + out_filename_prefix: OBJ filename prefix, + visualize object by g_label2color + easy_view: if True, only visualize furniture and floor + Returns: + output a list of OBJ file and MTL files with the same prefix + """ + bbox_label = np.loadtxt(input_filename) + bbox = bbox_label[:, 0:6] + label = bbox_label[:, -1].astype(int) + v_cnt = 0 # count vertex + ins_cnt = 0 # count instance + for i in range(bbox.shape[0]): + if easy_view and (label[i] not in g_easy_view_labels): + continue + obj_filename = out_filename_prefix + '_' + g_classes[label[i]] + '_' + str(ins_cnt) + '.obj' + mtl_filename = out_filename_prefix + '_' + g_classes[label[i]] + '_' + str(ins_cnt) + '.mtl' + fout_obj = open(obj_filename, 'w') + fout_mtl = open(mtl_filename, 'w') + fout_obj.write('mtllib %s\n' % (os.path.basename(mtl_filename))) + + length = bbox[i, 3:6] - bbox[i, 0:3] + a = length[0] + b = length[1] + c = length[2] + x = bbox[i, 0] + y = bbox[i, 1] + z = bbox[i, 2] + color = np.array(g_label2color[label[i]], dtype=float) / 255.0 + + material = 'material%d' % ins_cnt + fout_obj.write('usemtl %s\n' % material) + fout_obj.write('v %f %f %f\n' % (x, y, z + c)) + fout_obj.write('v %f %f %f\n' % (x, y + b, z + c)) + fout_obj.write('v %f %f %f\n' % (x + a, y + b, z + c)) + fout_obj.write('v %f %f %f\n' % (x + a, y, z + c)) + fout_obj.write('v %f %f %f\n' % (x, y, z)) + fout_obj.write('v %f %f %f\n' % (x, y + b, z)) + fout_obj.write('v %f %f %f\n' % (x + a, y + b, z)) + fout_obj.write('v %f %f %f\n' % (x + a, y, z)) + fout_obj.write('g default\n') + v_cnt = 0 # for individual box + fout_obj.write('f %d %d %d %d\n' % (4 + v_cnt, 3 + v_cnt, 2 + v_cnt, 1 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (1 + v_cnt, 2 + v_cnt, 6 + v_cnt, 5 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (7 + v_cnt, 6 + v_cnt, 2 + v_cnt, 3 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (4 + v_cnt, 8 + v_cnt, 7 + v_cnt, 3 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5 + v_cnt, 8 + v_cnt, 4 + v_cnt, 1 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5 + v_cnt, 6 + v_cnt, 7 + v_cnt, 8 + v_cnt)) + fout_obj.write('\n') + + fout_mtl.write('newmtl %s\n' % material) + fout_mtl.write('Kd %f %f %f\n' % (color[0], color[1], color[2])) + fout_mtl.write('\n') + fout_obj.close() + fout_mtl.close() + + v_cnt += 8 + ins_cnt += 1 + + +def bbox_label_to_obj_room(input_filename, out_filename_prefix, easy_view=False, + permute=None, center=False, exclude_table=False): + """ Visualization of bounding boxes. + + Args: + input_filename: each line is x1 y1 z1 x2 y2 z2 label + out_filename_prefix: OBJ filename prefix, + visualize object by g_label2color + easy_view: if True, only visualize furniture and floor + permute: if not None, permute XYZ for rendering, e.g. [0 2 1] + center: if True, move obj to have zero origin + Returns: + output a list of OBJ file and MTL files with the same prefix + """ + bbox_label = np.loadtxt(input_filename) + bbox = bbox_label[:, 0:6] + if permute is not None: + assert (len(permute) == 3) + permute = np.array(permute) + bbox[:, 0:3] = bbox[:, permute] + bbox[:, 3:6] = bbox[:, permute + 3] + if center: + xyz_max = np.amax(bbox[:, 3:6], 0) + bbox[:, 0:3] -= (xyz_max / 2.0) + bbox[:, 3:6] -= (xyz_max / 2.0) + bbox /= np.max(xyz_max / 2.0) + label = bbox_label[:, -1].astype(int) + obj_filename = out_filename_prefix + '.obj' + mtl_filename = out_filename_prefix + '.mtl' + + fout_obj = open(obj_filename, 'w') + fout_mtl = open(mtl_filename, 'w') + fout_obj.write('mtllib %s\n' % (os.path.basename(mtl_filename))) + v_cnt = 0 # count vertex + ins_cnt = 0 # count instance + for i in range(bbox.shape[0]): + if easy_view and (label[i] not in g_easy_view_labels): + continue + if exclude_table and label[i] == g_classes.index('table'): + continue + + length = bbox[i, 3:6] - bbox[i, 0:3] + a = length[0] + b = length[1] + c = length[2] + x = bbox[i, 0] + y = bbox[i, 1] + z = bbox[i, 2] + color = np.array(g_label2color[label[i]], dtype=float) / 255.0 + + material = 'material%d' % ins_cnt + fout_obj.write('usemtl %s\n' % material) + fout_obj.write('v %f %f %f\n' % (x, y, z + c)) + fout_obj.write('v %f %f %f\n' % (x, y + b, z + c)) + fout_obj.write('v %f %f %f\n' % (x + a, y + b, z + c)) + fout_obj.write('v %f %f %f\n' % (x + a, y, z + c)) + fout_obj.write('v %f %f %f\n' % (x, y, z)) + fout_obj.write('v %f %f %f\n' % (x, y + b, z)) + fout_obj.write('v %f %f %f\n' % (x + a, y + b, z)) + fout_obj.write('v %f %f %f\n' % (x + a, y, z)) + fout_obj.write('g default\n') + fout_obj.write('f %d %d %d %d\n' % (4 + v_cnt, 3 + v_cnt, 2 + v_cnt, 1 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (1 + v_cnt, 2 + v_cnt, 6 + v_cnt, 5 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (7 + v_cnt, 6 + v_cnt, 2 + v_cnt, 3 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (4 + v_cnt, 8 + v_cnt, 7 + v_cnt, 3 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5 + v_cnt, 8 + v_cnt, 4 + v_cnt, 1 + v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5 + v_cnt, 6 + v_cnt, 7 + v_cnt, 8 + v_cnt)) + fout_obj.write('\n') + + fout_mtl.write('newmtl %s\n' % material) + fout_mtl.write('Kd %f %f %f\n' % (color[0], color[1], color[2])) + fout_mtl.write('\n') + + v_cnt += 8 + ins_cnt += 1 + + fout_obj.close() + fout_mtl.close() + + +def collect_point_bounding_box(anno_path, out_filename, file_format): + """ Compute bounding boxes from each instance in original dataset files on + one room. **We assume the bbox is aligned with XYZ coordinate.** + Save both the point XYZRGB and the bounding box for the point's + parent element. + + Args: + anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ + out_filename: path to save instance bounding boxes for each point, + plus the point's XYZRGBL + each line is XYZRGBL offsetX offsetY offsetZ a b c, + where cx = X+offsetX, cy=X+offsetY, cz=Z+offsetZ + where (cx,cy,cz) is center of the box, a,b,c are distances from center + to the surfaces of the box, i.e. x1 = cx-a, x2 = cx+a, y1=cy-b etc. + file_format: output file format, txt or numpy + Returns: + None + + Note: + room points are shifted, the most negative point is now at origin. + """ + point_bbox_list = [] + + for f in glob.glob(os.path.join(anno_path, '*.txt')): + cls = os.path.basename(f).split('_')[0] + if cls not in g_classes: # note: in some room there is 'stairs' class.. + cls = 'clutter' + points = np.loadtxt(f) # Nx6 + label = g_class2label[cls] # N, + # Compute tightest axis aligned bounding box + xyz_min = np.amin(points[:, 0:3], axis=0) # 3, + xyz_max = np.amax(points[:, 0:3], axis=0) # 3, + xyz_center = (xyz_min + xyz_max) / 2 + dimension = (xyz_max - xyz_min) / 2 + + xyz_offsets = xyz_center - points[:, 0:3] # Nx3 + dimensions = np.ones((points.shape[0], 3)) * dimension # Nx3 + labels = np.ones((points.shape[0], 1)) * label # N + point_bbox_list.append(np.concatenate([points, labels, + xyz_offsets, dimensions], 1)) # Nx13 + + point_bbox = np.concatenate(point_bbox_list, 0) # KxNx13 + room_xyz_min = np.amin(point_bbox[:, 0:3], axis=0) + point_bbox[:, 0:3] -= room_xyz_min + + if file_format == 'txt': + fout = open(out_filename, 'w') + for i in range(point_bbox.shape[0]): + fout.write('%f %f %f %d %d %d %d %f %f %f %f %f %f\n' % + (point_bbox[i, 0], point_bbox[i, 1], point_bbox[i, 2], + point_bbox[i, 3], point_bbox[i, 4], point_bbox[i, 5], + point_bbox[i, 6], + point_bbox[i, 7], point_bbox[i, 8], point_bbox[i, 9], + point_bbox[i, 10], point_bbox[i, 11], point_bbox[i, 12])) + + fout.close() + elif file_format == 'numpy': + np.save(out_filename, point_bbox) + else: + print('ERROR!! Unknown file format: %s, please use txt or numpy.' % file_format) + exit() diff --git a/zoo/OcCo/OcCo_Torch/utils/lmdb2hdf5.py b/zoo/OcCo/OcCo_Torch/utils/lmdb2hdf5.py new file mode 100644 index 0000000..967834a --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/lmdb2hdf5.py @@ -0,0 +1,117 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, h5py, json, argparse, numpy as np +from LMDB_DataFlow import lmdb_dataflow +from tqdm import tqdm + + +def fix2len(point_cloud, fix_length): + if len(point_cloud) >= fix_length: + point_cloud = point_cloud[np.random.choice(len(point_cloud), fix_length)] + else: + point_cloud = np.concatenate( + [point_cloud, point_cloud[np.random.choice(len(point_cloud), fix_length - len(point_cloud))]], axis=0) + return point_cloud + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument("--fname", type=str, default='train') + parser.add_argument("--lmdb_path", type=str, default=r'../data/modelnet40_pcn/') + parser.add_argument("--hdf5_path", type=str, default=r'../data/modelnet40_pcn/hdf5_partial_1024') + parser.add_argument("--partial", action='store_true', help='store partial scan or not') + parser.add_argument('--num_per_obj', type=int, default=1024) + parser.add_argument('--num_scan', type=int, default=10) + + args = parser.parse_args() + + lmdb_file = os.path.join(args.lmdb_path, args.f_name + '.lmdb') + os.system('mkdir -p %s' % args.hdf5_path) + df_train, num_train = lmdb_dataflow( + lmdb_path=lmdb_file, batch_size=1, input_size=args.num_per_obj, + output_size=args.num_per_obj, is_training=False) + + if args.partial: + print('Now we generate point cloud from partial observed objects.') + + file_per_h5 = 2048 * 4 # of objects within each hdf5 file + data_gen = df_train.get_data() + + idx = 0 + data_np = np.zeros((file_per_h5, args.num_per_obj, 3)) + label_np = np.zeros((file_per_h5,), dtype=np.int32) + ids_np = np.chararray((file_per_h5,), itemsize=32) + + # convert label string to integers + hash_label = json.load(open('../data/shapenet_names.json')) + f_open = open(os.path.join(args.hdf5_path, '%s_file.txt' % args.f_name), 'a+') + + for i in tqdm(range(num_train)): + '''each object has eight different views''' + + ids, inputs, npts, gt = next(data_gen) + object_pc = inputs[0] if args.partial else gt[0] + + if len(object_pc) != args.num_per_obj: + object_pc = fix2len(object_pc, args.num_per_obj) + if args.partial: + data_np[i % file_per_h5, :, :] = object_pc + label_np[i % file_per_h5] = int(hash_label[(ids[0].split('_')[0])]) + ids_np[i % file_per_h5] = ids[0] # .split('_')[1] + + else: + if i % args.num_scan != 0: + continue + data_np[(i // args.num_scan) % file_per_h5, :, :] = object_pc + label_np[(i // args.num_scan) % file_per_h5] = int(hash_label[(ids[0].split('_')[0])]) + ids_np[(i // args.num_scan) % file_per_h5] = ids[0].split('_')[1] + + num_obj_ = i if args.partial else i // args.num_scan + + if num_obj_ - idx * file_per_h5 >= file_per_h5: + h5_file = os.path.join(args.hdf5_path, '%s%d.h5' % (args.f_name, idx)) + print('the last two objects coordinates, labels and ids:') + print(data_np[-2:]) + print(label_np[-2:]) + print(ids_np[-2:]) + print('\n') + + hf = h5py.File(h5_file, 'w') + hf.create_dataset('data', data=data_np) + hf.create_dataset('label', data=label_np) + hf.create_dataset('id', data=ids_np) + hf.close() + + f_open.writelines(h5_file.replace('../', './') + '\n') + print('%s_%s.h5 has been saved' % (args.f_name, idx)) + print('====================\n\n') + idx += 1 + + '''to deal with the remaining in the end''' + h5_file = os.path.join(args.hdf5_path, '%s%d.h5' % (args.f_name, idx)) + hf = h5py.File(h5_file, 'w') + + if args.partial: + label_res = label_np[:num_train % file_per_h5] + data_res = data_np[:num_train % file_per_h5] + id_res = ids_np[:num_train % file_per_h5] + + else: + label_res = label_np[:(num_train // args.num_scan) % file_per_h5] + data_res = data_np[:(num_train // args.num_scan) % file_per_h5] + id_res = ids_np[:(num_train // args.num_scan) % file_per_h5] + + print('the remaining objects coordinates, labels and ids:') + print(data_res[-2:], '\n', label_res[-2:], '\n', id_res[-2:], '\n\n') + + hf.create_dataset('label', data=label_res) + hf.create_dataset('data', data=data_res) + hf.create_dataset('id', data=id_res) + hf.close() + print('the last part has been saved into %s_%s.h5' % (args.f_name, idx)) + + f_open.writelines(h5_file.replace('../', './')) + f_open.close() + + print('convert from lmdb to hdf5 has finished') diff --git a/zoo/OcCo/OcCo_Torch/utils/train_cls.py b/zoo/OcCo/OcCo_Torch/utils/train_cls.py new file mode 100644 index 0000000..38dd1b1 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/train_cls.py @@ -0,0 +1,210 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/pytorch/main.py +# Ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/train_cls.py + +import os, sys, torch, shutil, importlib, argparse +sys.path.append('utils') +sys.path.append('models') +from PC_Augmentation import random_point_dropout, random_scale_point_cloud, random_shift_point_cloud +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from ModelNetDataLoader import General_CLSDataLoader_HDF5 +from Torch_Utility import copy_parameters, seed_torch +from torch.utils.tensorboard import SummaryWriter +# from Inference_Timer import Inference_Timer +from torch.utils.data import DataLoader +from Dataset_Loc import Dataset_Loc +from TrainLogger import TrainLogger +from tqdm import tqdm + + +def parse_args(): + parser = argparse.ArgumentParser('Point Cloud Classification') + + ''' === Training and Model === ''' + parser.add_argument('--log_dir', type=str, help='log folder [default: ]') + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--mode', type=str, default='train', help='train or test') + parser.add_argument('--epoch', type=int, default=200, help='epochs [default: 200]') + # parser.add_argument('--seed', type=int, default=1, help='random seed (default: 1)') + parser.add_argument('--batch_size', type=int, default=24, help='batch size [default: 24]') + parser.add_argument('--model', default='pointnet_cls', help='model [default: pointnet_cls]') + parser.add_argument('--dropout', type=float, default=0.5, help='dropout rate [default: 0.5]') + parser.add_argument('--momentum', type=float, default=0.9, help='SGD momentum [default: 0.9]') + parser.add_argument('--lr_decay', type=float, default=0.5, help='lr decay rate [default: 0.5]') + parser.add_argument('--step_size', type=int, default=20, help='lr decay step [default: 20 eps]') + parser.add_argument('--num_point', type=int, default=1024, help='points number [default: 1024]') + parser.add_argument('--restore', action='store_true', help='using pre-trained [default: False]') + parser.add_argument('--restore_path', type=str, help="path to pretrained weights [default: None]") + parser.add_argument('--emb_dims', type=int, default=1024, help='dimension of embeddings [default: 1024]') + parser.add_argument('--k', type=int, default=20, help='number of nearest neighbors to use [default: 20]') + parser.add_argument('--use_sgd', action='store_true', default=False, help='use SGD optimiser [default: False]') + parser.add_argument('--lr', type=float, default=0.001, help='learning rate [default: 0.001, 0.1 if using sgd]') + parser.add_argument('--scheduler', type=str, default='step', help='lr decay scheduler [default: step, or cos]') + + ''' === Dataset === ''' + parser.add_argument('--partial', action='store_true', help='partial objects [default: False]') + parser.add_argument('--bn', action='store_true', help='with background noise [default: False]') + parser.add_argument('--data_aug', action='store_true', help='data Augmentation [default: False]') + parser.add_argument('--dataset', type=str, default='modelnet40', help='dataset [default: modelnet40]') + parser.add_argument('--fname', type=str, help='filename, used in ScanObjectNN or fewer data [default:]') + + return parser.parse_args() + + +def main(args): + + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + # seed_torch(args.seed) + + ''' === Set up Loggers and Load Data === ''' + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='cls', filename=args.mode + '_log') + writer = SummaryWriter(os.path.join(MyLogger.experiment_dir, 'runs')) + + MyLogger.logger.info('Load dataset %s' % args.dataset) + NUM_CLASSES, TRAIN_FILES, TEST_FILES = Dataset_Loc(dataset=args.dataset, fname=args.fname, + partial=args.partial, bn=args.bn) + TRAIN_DATASET = General_CLSDataLoader_HDF5(file_list=TRAIN_FILES, num_point=1024) + TEST_DATASET = General_CLSDataLoader_HDF5(file_list=TEST_FILES, num_point=1024) + trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4, drop_last=True) + testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + ''' === Load Model and Backup Scripts === ''' + MODEL = importlib.import_module(args.model) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + shutil.copy('./models/%s.py' % args.model, MyLogger.log_dir) + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(args=args, num_channel=3, num_class=NUM_CLASSES).to(device) + criterion = MODEL.get_loss().to(device) + classifier = torch.nn.DataParallel(classifier) + # nn.DataParallel has its own issues (slow, memory expensive), + # here are some advanced solutions: https://zhuanlan.zhihu.com/p/145427849 + print('=' * 27) + print('Using %d GPU,' % torch.cuda.device_count(), 'Indices: %s' % args.gpu) + print('=' * 27) + + ''' === Restore Model from Pre-Trained Checkpoints: OcCo/Jigsaw etc === ''' + if args.restore: + checkpoint = torch.load(args.restore_path) + classifier = copy_parameters(classifier, checkpoint, verbose=True) + MyLogger.logger.info('Use pre-trained weights from %s' % args.restore_path) + else: + MyLogger.logger.info('No pre-trained weights, start training from scratch...') + + if not args.use_sgd: + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.lr, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=1e-4 + ) + else: + optimizer = torch.optim.SGD(classifier.parameters(), + lr=args.lr * 100, + momentum=args.momentum, + weight_decay=1e-4) + + if args.scheduler == 'cos': + scheduler = CosineAnnealingLR(optimizer, T_max=args.epoch, eta_min=1e-3) + else: + scheduler = StepLR(optimizer, step_size=args.step_size, gamma=args.lr_decay) + LEARNING_RATE_CLIP = 0.01 * args.lr + + if args.mode == 'test': + with torch.no_grad(): + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + points, target = points.float().transpose(2, 1).cuda(), target.long().cuda() + if args.model == 'pointnet_cls': + pred, trans_feat = classifier(points) + loss = criterion(pred, target, trans_feat) + else: + pred = classifier(points) + loss = criterion(pred, target) + MyLogger.step_update(pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + + MyLogger.epoch_summary(writer=writer, training=False) + sys.exit("Test Finished") + + for epoch in range(MyLogger.epoch, args.epoch + 1): + + ''' === Training === ''' + MyLogger.epoch_init() + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + writer.add_scalar('Learning Rate', scheduler.get_lr()[-1], MyLogger.step) + + # Augmentation, might bring performance gains + if args.data_aug: + points = random_point_dropout(points.data.numpy()) + points[:, :, :3] = random_scale_point_cloud(points[:, :, :3]) + points[:, :, :3] = random_shift_point_cloud(points[:, :, :3]) + points = torch.Tensor(points) + + points, target = points.transpose(2, 1).float().cuda(), target.long().cuda() + + # FP and BP + classifier.train() + optimizer.zero_grad() + if args.model == 'pointnet_cls': + pred, trans_feat = classifier(points) + loss = criterion(pred, target, trans_feat) + else: + pred = classifier(points) + loss = criterion(pred, target) + loss.backward() + optimizer.step() + MyLogger.step_update(pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + MyLogger.epoch_summary(writer=writer, training=True) + + ''' === Validating === ''' + with torch.no_grad(): + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + points, target = points.float().transpose(2, 1).cuda(), target.long().cuda() + if args.model == 'pointnet_cls': + pred, trans_feat = classifier(points) + loss = criterion(pred, target, trans_feat) + else: + pred = classifier(points) + loss = criterion(pred, target) + MyLogger.step_update(pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + + MyLogger.epoch_summary(writer=writer, training=False) + if MyLogger.save_model: + state = { + 'step': MyLogger.step, + 'epoch': MyLogger.best_instance_epoch, + 'instance_acc': MyLogger.best_instance_acc, + 'best_class_acc': MyLogger.best_class_acc, + 'best_class_epoch': MyLogger.best_class_epoch, + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, MyLogger.savepath) + + scheduler.step() + if args.scheduler == 'step': + for param_group in optimizer.param_groups: + if optimizer.param_groups[0]['lr'] < LEARNING_RATE_CLIP: + param_group['lr'] = LEARNING_RATE_CLIP + + MyLogger.train_summary() + + +if __name__ == '__main__': + + args = parse_args() + main(args) diff --git a/zoo/OcCo/OcCo_Torch/utils/train_completion.py b/zoo/OcCo/OcCo_Torch/utils/train_completion.py new file mode 100644 index 0000000..9bd83d1 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/train_completion.py @@ -0,0 +1,253 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/train.py +# Ref: https://github.com/WangYueFt/dgcnn/blob/master/tensorflow/train.py +# For DGCNN Encoder, We Also Use Adam + StepLR for the Unity and Simplicity + + +import os, sys, time, torch, shutil, argparse, datetime, importlib, numpy as np +sys.path.append('utils') +sys.path.append('models') +from TrainLogger import TrainLogger +from LMDB_DataFlow import lmdb_dataflow +from Torch_Utility import copy_parameters +# from torch.optim.lr_scheduler import StepLR +from Visu_Utility import plot_pcd_three_views +from torch.utils.tensorboard import SummaryWriter + + +def parse_args(): + parser = argparse.ArgumentParser('Point Cloud Completion') + + ''' === Training Setting === ''' + parser.add_argument('--log_dir', type=str, help='log folder [default: ]') + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--batch_size', type=int, default=32, help='batch size [default: 32]') + parser.add_argument('--epoch', type=int, default=50, help='number of epoch [default: 50]') + parser.add_argument('--lr', type=float, default=0.0001, help='learning rate [default: 1e-4]') + parser.add_argument('--lr_decay', type=float, default=0.7, help='lr decay rate [default: 0.7]') + parser.add_argument('--step_size', type=int, default=20, help='lr decay step [default: 20 epoch]') + parser.add_argument('--dataset', type=str, default='modelnet', help='dataset [default: modelnet]') + parser.add_argument('--restore', action='store_true', help='loaded from restore [default: False]') + parser.add_argument('--restore_path', type=str, help='path to saved pre-trained model [default: ]') + parser.add_argument('--steps_print', type=int, default=100, help='# steps to print [default: 100]') + parser.add_argument('--steps_visu', type=int, default=3456, help='# steps to visual [default: 3456]') + parser.add_argument('--steps_eval', type=int, default=1000, help='# steps to evaluate [default: 1e3]') + parser.add_argument('--epochs_save', type=int, default=5, help='# epochs to save [default: 5 epochs]') + + ''' === Model Setting === ''' + parser.add_argument('--model', type=str, default='pcn_occo', help='model [pcn_occo]') + parser.add_argument('--k', type=int, default=20, help='# nearest neighbors in DGCNN [20]') + parser.add_argument('--grid_size', type=int, default=4, help='edge length of the 2D grid [4]') + parser.add_argument('--grid_scale', type=float, default=0.5, help='scale of the 2D grid [0.5]') + parser.add_argument('--num_coarse', type=int, default=1024, help='# points in coarse gt [1024]') + parser.add_argument('--emb_dims', type=int, default=1024, help='# dimension of DGCNN encoder [1024]') + parser.add_argument('--input_pts', type=int, default=1024, help='# points of occluded inputs [1024]') + parser.add_argument('--gt_pts', type=int, default=16384, help='# points of ground truth inputs [16384]') + + return parser.parse_args() + + +def main(args): + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + ''' === Set up Loggers and Load Data === ''' + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='completion') + os.makedirs(os.path.join(MyLogger.experiment_dir, 'plots'), exist_ok=True) + writer = SummaryWriter(os.path.join(MyLogger.experiment_dir, 'runs')) + + MyLogger.logger.info('Load dataset %s' % args.dataset) + if args.dataset == 'modelnet': + lmdb_train = './data/modelnet/train.lmdb' + lmdb_valid = './data/modelnet/test.lmdb' + elif args.dataset == 'shapenet': + lmdb_train = 'data/shapenet/train.lmdb' + lmdb_valid = 'data/shapenet/valid.lmdb' + else: + raise ValueError("Dataset is not available, it should be either ModelNet or ShapeNet") + + assert (args.gt_pts == args.grid_size ** 2 * args.num_coarse) + df_train, num_train = lmdb_dataflow( + lmdb_train, args.batch_size, args.input_pts, args.gt_pts, is_training=True) + df_valid, num_valid = lmdb_dataflow( + lmdb_valid, args.batch_size, args.input_pts, args.gt_pts, is_training=False) + train_gen, valid_gen = df_train.get_data(), df_valid.get_data() + total_steps = num_train // args.batch_size * args.epoch + + ''' === Load Model and Backup Scripts === ''' + MODEL = importlib.import_module(args.model) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + shutil.copy('./models/%s.py' % args.model, MyLogger.log_dir) + + # multiple GPUs usage + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + completer = MODEL.get_model(args=args, grid_size=args.grid_size, + grid_scale=args.grid_scale, num_coarse=args.num_coarse).to(device) + criterion = MODEL.get_loss().to(device) + completer = torch.nn.DataParallel(completer) + # nn.DataParallel has its own issues (slow, memory expensive), bearable + # some optional advanced solutions: https://zhuanlan.zhihu.com/p/145427849 + print('=' * 33) + print('Using %d GPU,' % torch.cuda.device_count(), 'Indices are: %s' % args.gpu) + print('=' * 33) + + ''' === Restore Model from Checkpoints, If there is any === ''' + if args.restore: + checkpoint = torch.load(args.restore_path) + completer = copy_parameters(completer, checkpoint, verbose=True) + MyLogger.logger.info('Use pre-trained model from %s' % args.restore_path) + MyLogger.step, MyLogger.epoch = checkpoint['step'], checkpoint['epoch'] + + else: + MyLogger.logger.info('No pre-trained model, start training from scratch...') + + ''' IMPORTANT: for completion, no weight decay in Adam, no batch norm in decoder!''' + optimizer = torch.optim.Adam( + completer.parameters(), + lr=args.lr, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=0) + # weight_decay=1e-4) + + # For the sake of simplicity, we save the momentum decay in the batch norm + # scheduler = StepLR(optimizer, step_size=20, gamma=0.7) -> instead we define these manually + LEARNING_RATE_CLIP = 0.01 * args.lr + + def vary2fix(inputs, npts, batch_size=args.batch_size, num_point=args.input_pts): + """upsample/downsample varied input points into fixed length + :param inputs: input points cloud + :param npts: describe how many points of each input object + :param batch_size: training batch size + :param num_point: number of points of per occluded object + :return: fixed length of points of each object + """ + + inputs_ls = np.split(inputs[0], npts.cumsum()) + ret_inputs = np.zeros((1, batch_size * num_point, 3)) + ret_npts = npts.copy() + + for idx, obj in enumerate(inputs_ls[:-1]): + + if len(obj) <= num_point: + select_idx = np.concatenate([ + np.arange(len(obj)), np.random.choice(len(obj), num_point - len(obj))]) + else: + select_idx = np.arange(len(obj)) + np.random.shuffle(select_idx) + + ret_inputs[0][idx * num_point:(idx + 1) * num_point] = obj[select_idx].copy() + ret_npts[idx] = num_point + + return ret_inputs, ret_npts + + def piecewise_constant(global_step, boundaries, values): + """substitute for tf.train.piecewise_constant: + https://www.tensorflow.org/api_docs/python/tf/compat/v1/train/piecewise_constant + global_step can be either training epoch or training step + """ + if len(boundaries) != len(values) - 1: + raise ValueError( + "The length of boundaries should be 1 less than the length of values") + + if global_step <= boundaries[0]: + return values[0] + elif global_step > boundaries[-1]: + return values[-1] + else: + for low, high, v in zip(boundaries[:-1], boundaries[1:], values[1:-1]): + if (global_step > low) & (global_step <= high): + return v + + total_time, train_start = 0, time.time() + for step in range(MyLogger.step + 1, total_steps + 1): + + ''' === Training === ''' + start = time.time() + epoch = step * args.batch_size // num_train + 1 + lr = max(args.lr * (args.lr_decay ** (epoch // args.step_size)), LEARNING_RATE_CLIP) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + # follow the original alpha setting for ShapeNet Dataset in PCN paper: + alpha = piecewise_constant(step, [10000, 20000, 50000], [0.01, 0.1, 0.5, 1.0]) + writer.add_scalar('Learning Rate', lr, step) + writer.add_scalar('Alpha', alpha, step) + + ids, inputs, npts, gt = next(train_gen) + if args.dataset == 'shapenet': + inputs, _ = vary2fix(inputs, npts) + + completer.train() + optimizer.zero_grad() + inputs = inputs.reshape(args.batch_size, args.input_pts, 3) + inputs, gt = torch.Tensor(inputs).transpose(2, 1).cuda(), torch.Tensor(gt).cuda() + pred_coarse, pred_fine = completer(inputs) + loss = criterion(pred_coarse, pred_fine, gt, alpha) + loss.backward() + optimizer.step() + total_time += time.time() - start + writer.add_scalar('Loss', loss, step) + + if step % args.steps_print == 0: + MyLogger.logger.info('epoch %d step %d alpha %.2f loss %.8f time per step %.2f s' % + (epoch, step, alpha, loss, total_time / args.steps_print)) + total_time = 0 + + ''' === Validating === ''' + if step % args.steps_eval == 0: + + with torch.no_grad(): + completer.eval() + MyLogger.logger.info('Testing...') + num_eval_steps, eval_loss, eval_time = num_valid // args.batch_size, 0, 0 + + for eval_step in range(num_eval_steps): + start = time.time() + _, inputs, npts, gt = next(valid_gen) + if args.dataset == 'shapenet': + inputs, _ = vary2fix(inputs, npts) + + inputs = inputs.reshape(args.batch_size, args.input_pts, 3) + inputs, gt = torch.Tensor(inputs).transpose(2, 1).cuda(), torch.Tensor(gt).cuda() + + pred_coarse, pred_fine = completer(inputs) + loss = criterion(pred_coarse, pred_fine, gt, alpha) + eval_loss += loss + eval_time += time.time() - start + + MyLogger.logger.info('epoch %d step %d validation loss %.8f time per step %.2f s' % + (epoch, step, eval_loss / num_eval_steps, eval_time / num_eval_steps)) + + ''' === Visualisation === ''' + if step % args.steps_visu == 0: + all_pcds = [item.detach().cpu().numpy() for item in [ + inputs.transpose(2, 1), pred_coarse, pred_fine, gt]] + for i in range(args.batch_size): + plot_path = os.path.join(MyLogger.experiment_dir, 'plots', + 'epoch_%d_step_%d_%s.png' % (epoch, step, ids[i])) + pcds = [x[i] for x in all_pcds] + plot_pcd_three_views(plot_path, pcds, + ['input', 'coarse output', 'fine output', 'ground truth']) + + trained_epoch = epoch - 1 + if (trained_epoch % args.epochs_save == 0) and (trained_epoch != 0) and \ + not os.path.exists(os.path.join(MyLogger.checkpoints_dir, + 'model_epoch_%d.pth' % trained_epoch)): + state = { + 'step': step, + 'epoch': epoch, + 'model_state_dict': completer.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, os.path.join(MyLogger.checkpoints_dir, + "model_epoch_%d.pth" % trained_epoch)) + MyLogger.logger.info('Model saved at %s/model_epoch_%d.pth\n' + % (MyLogger.checkpoints_dir, trained_epoch)) + + MyLogger.logger.info('Training Finished, Total Time: ' + + str(datetime.timedelta(seconds=time.time() - train_start))) + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/OcCo/OcCo_Torch/utils/train_jigsaw.py b/zoo/OcCo/OcCo_Torch/utils/train_jigsaw.py new file mode 100644 index 0000000..dbf9504 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/train_jigsaw.py @@ -0,0 +1,176 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# ref: https://github.com/AnTao97/dgcnn.pytorch/blob/master/main_semseg.py +# ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/train_semseg.py + +import os, sys, torch, argparse, importlib, shutil +sys.path.append('models') +sys.path.append('utils') +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from Torch_Utility import weights_init, bn_momentum_adjust +from ModelNetDataLoader import ModelNetJigsawDataLoader +from torch.utils.tensorboard import SummaryWriter +from torch.utils.data import DataLoader +from TrainLogger import TrainLogger +from tqdm import tqdm + + +def parse_args(): + parser = argparse.ArgumentParser('3D Point Cloud Jigsaw Puzzles') + + ''' === Training === ''' + parser.add_argument('--log_dir', type=str, help='log folder [default: ]') + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--batch_size', type=int, default=32, help='batch size [default: 32]') + parser.add_argument('--epoch', default=200, type=int, help='training epochs [default: 200]') + parser.add_argument('--lr', default=0.0001, type=float, help='learning rate [default: 1e-4]') + parser.add_argument('--optimizer', type=str, default='Adam', help='optimiser [default: Adam]') + parser.add_argument('--momentum', type=float, default=0.9, help='SGD momentum [default: 0.9]') + parser.add_argument('--lr_decay', type=float, default=0.7, help='lr decay rate [default: 0.7]') + parser.add_argument('--bn_decay', action='store_true', help='BN Momentum Decay [default: False]') + parser.add_argument('--xavier_init', action='store_true', help='Xavier weight init [default: False]') + parser.add_argument('--scheduler', type=str, default='step', help='lr decay scheduler [default: step]') + parser.add_argument('--model', type=str, default='pointnet_jigsaw', help='model [default: pointnet_jigsaw]') + parser.add_argument('--step_size', type=int, default=20, help='decay steps for lr [default: every 20 epochs]') + + ''' === Model === ''' + parser.add_argument('--k', type=int, default=20, help='num of nearest neighbors to use [default: 20]') + parser.add_argument('--emb_dims', type=int, default=1024, help='dimension of embeddings [default: 1024]') + parser.add_argument('--num_point', type=int, default=1024, help='number of points per object [default: 1024]') + + return parser.parse_args() + + +def main(args): + + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + NUM_CLASSES = 3 ** 3 + DATA_PATH = 'data/modelnet40_ply_hdf5_2048/jigsaw' + TRAIN_DATASET = ModelNetJigsawDataLoader(DATA_PATH, split='train', n_points=args.num_point, k=3) + TEST_DATASET = ModelNetJigsawDataLoader(DATA_PATH, split='test', n_points=args.num_point, k=3) + trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='jigsaw') + + ''' === MODEL LOADING === ''' + MODEL = importlib.import_module(args.model) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + shutil.copy('./models/%s.py' % args.model, MyLogger.log_dir) + writer = SummaryWriter(os.path.join(MyLogger.experiment_dir, 'runs')) + + # allow multiple GPUs + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(args=args, num_class=NUM_CLASSES, num_channel=3).to(device) + criterion = MODEL.get_loss().to(device) + classifier = torch.nn.DataParallel(classifier) + print('=' * 33) + print('Using %d GPU,' % torch.cuda.device_count(), 'Indices: %s' % args.gpu) + print('=' * 33) + + if args.xavier_init: + classifier = classifier.apply(weights_init) + MyLogger.logger.info("Using Xavier Weight Initialisation") + + if args.optimizer == 'Adam': + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.lr, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=1e-4) + MyLogger.logger.info("Using Adam Optimiser") + else: + optimizer = torch.optim.SGD( + classifier.parameters(), + lr=1000 * args.lr, + momentum=args.momentum) + MyLogger.logger.info("Using SGD Optimiser") + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECAY = 0.5 + MOMENTUM_DECAY_STEP = args.step_size + + if args.scheduler == 'cos': + scheduler = CosineAnnealingLR(optimizer, T_max=args.epoch, eta_min=1e-3) + else: + scheduler = StepLR(optimizer, step_size=args.step_size, gamma=0.7) + + for epoch in range(MyLogger.epoch, args.epoch + 1): + + ''' === Training === ''' + MyLogger.epoch_init(training=True) + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + points, target = points.transpose(2, 1).float().cuda(), target.view(-1, 1)[:, 0].long().cuda() + classifier.train() + optimizer.zero_grad() + + if args.model == 'pointnet_jigsaw': + pred, trans_feat = classifier(points) + pred = pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(pred, target, trans_feat) + else: + pred = classifier(points) + pred = pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(pred, target) + + loss.backward() + optimizer.step() + # pdb.set_trace() + MyLogger.step_update(pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + MyLogger.epoch_summary(writer=writer, training=True) + + ''' === Evaluation === ''' + with torch.no_grad(): + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + points, target = points.transpose(2, 1).float().cuda(), target.view(-1, 1)[:, 0].long().cuda() + if args.model == 'pointnet_jigsaw': + pred, trans_feat = classifier(points) + pred = pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(pred, target, trans_feat) + else: + pred = classifier(points) + pred = pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(pred, target) + MyLogger.step_update(pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + MyLogger.epoch_summary(writer=writer, training=False) + + if MyLogger.save_model: + state = { + 'step': MyLogger.step, + 'epoch': MyLogger.best_instance_epoch, + 'instance_acc': MyLogger.best_instance_acc, + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, MyLogger.savepath) + + scheduler.step() + if args.scheduler == 'step': + for param_group in optimizer.param_groups: + if optimizer.param_groups[0]['lr'] < LEARNING_RATE_CLIP: + param_group['lr'] = LEARNING_RATE_CLIP + if args.bn_decay: + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECAY ** (epoch // MOMENTUM_DECAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + + MyLogger.train_summary() + + +if __name__ == '__main__': + + args = parse_args() + main(args) + diff --git a/zoo/OcCo/OcCo_Torch/utils/train_semseg.py b/zoo/OcCo/OcCo_Torch/utils/train_semseg.py new file mode 100644 index 0000000..d1bf36c --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/train_semseg.py @@ -0,0 +1,225 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# ref: https://github.com/charlesq34/pointnet/blob/master/sem_seg/train.py +# ref: https://github.com/AnTao97/dgcnn.pytorch/blob/master/main_semseg.py +# ref: https://github.com/yanx27/Pointnet_Pointnet2_pytorch/blob/master/train_semseg.py + +import os, sys, torch, shutil, argparse, importlib +sys.path.append('utils') +sys.path.append('models') +from Torch_Utility import copy_parameters, weights_init, bn_momentum_adjust +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from torch.utils.tensorboard import SummaryWriter +from S3DISDataLoader import S3DISDataset_HDF5 +from torch.utils.data import DataLoader +from TrainLogger import TrainLogger +from tqdm import tqdm + + +classes = ['ceiling', 'floor', 'wall', 'beam', 'column', + 'window', 'door', 'table', 'chair', 'sofa', + 'bookcase', 'board', 'clutter'] +class2label = {cls: i for i, cls in enumerate(classes)} +seg_classes = class2label +seg_label_to_cat = {} +for i, cat in enumerate(seg_classes.keys()): + seg_label_to_cat[i] = cat + + +def parse_args(): + parser = argparse.ArgumentParser(description='Point Cloud Semantic Segmentation') + + parser.add_argument('--log_dir', type=str, help='log path [default: ]') + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--mode', type=str, default='train', help='train or test') + parser.add_argument('--batch_size', type=int, default=24, help='batch size [default: 24]') + parser.add_argument('--test_area', type=int, default=5, help='test area, 1-6 [default: 5]') + parser.add_argument('--epoch', default=100, type=int, help='training epochs [default: 100]') + parser.add_argument('--lr', type=float, default=0.001, help='learning rate [default: 0.001]') + parser.add_argument('--momentum', type=float, default=0.9, help='SGD momentum [default: 0.9]') + parser.add_argument('--lr_decay', type=float, default=0.5, help='lr decay rate [default: 0.5]') + parser.add_argument('--restore', action='store_true', help='restore the weights [default: False]') + parser.add_argument('--restore_path', type=str, help='path to pre-saved model weights [default: ]') + parser.add_argument('--dropout', type=float, default=0.5, help='dropout rate in FCs [default: 0.5]') + parser.add_argument('--bn_decay', action='store_true', help='use BN Momentum Decay [default: False]') + parser.add_argument('--xavier_init', action='store_true', help='Xavier weight init [default: False]') + parser.add_argument('--emb_dims', type=int, default=1024, help='embedding dimensions [default: 1024]') + parser.add_argument('--k', type=int, default=20, help='num of nearest neighbors to use [default: 20]') + parser.add_argument('--step_size', type=int, default=40, help='lr decay steps [default: every 40 epochs]') + parser.add_argument('--scheduler', type=str, default='cos', help='lr decay scheduler [default: cos, step]') + parser.add_argument('--model', type=str, default='pointnet_semseg', help='model [default: pointnet_semseg]') + parser.add_argument('--optimizer', type=str, default='adam', help='optimiser [default: adam, otherwise sgd]') + + return parser.parse_args() + + +def main(args): + + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + root = 'data/indoor3d_sem_seg_hdf5_data' + NUM_CLASSES = len(seg_label_to_cat) + + TRAIN_DATASET = S3DISDataset_HDF5(root=root, split='train', test_area=args.test_area) + TEST_DATASET = S3DISDataset_HDF5(root=root, split='test', test_area=args.test_area) + trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + MyLogger = TrainLogger(args, name=args.model.upper(), subfold='semseg', + cls2name=class2label, filename=args.mode + '_log') + MyLogger.logger.info("The number of training data is: %d" % len(TRAIN_DATASET)) + MyLogger.logger.info("The number of testing data is: %d" % len(TEST_DATASET)) + + ''' === Model Loading === ''' + MODEL = importlib.import_module(args.model) + shutil.copy(os.path.abspath(__file__), MyLogger.log_dir) + shutil.copy('./models/%s.py' % args.model, MyLogger.log_dir) + writer = SummaryWriter(os.path.join(MyLogger.experiment_dir, 'runs')) + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + classifier = MODEL.get_model(num_class=NUM_CLASSES, num_channel=9, args=args).to(device) + criterion = MODEL.get_loss().to(device) + classifier = torch.nn.DataParallel(classifier) + print('=' * 27) + print('Using %d GPU,' % torch.cuda.device_count(), 'Indices: %s' % args.gpu) + print('=' * 27) + + if args.restore: + checkpoint = torch.load(args.restore_path) + classifier = copy_parameters(classifier, checkpoint, verbose=True) + MyLogger.logger.info('Use pre-trained weights from %s' % args.restore_path) + else: + MyLogger.logger.info('No pre-trained weights, start training from scratch...') + if args.xavier_init: + classifier = classifier.apply(weights_init) + MyLogger.logger.info("Using Xavier weight initialisation") + + if args.optimizer == 'adam': + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.lr, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=1e-4) + MyLogger.logger.info("Using Adam optimiser") + else: + optimizer = torch.optim.SGD( + classifier.parameters(), + lr=args.lr * 100, + momentum=args.momentum) + MyLogger.logger.info("Using SGD optimiser") + # using the similar lr decay setting from + # https://github.com/charlesq34/pointnet/blob/master/sem_seg/train.py + # scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=40, gamma=0.5) + + if args.scheduler == 'cos': + scheduler = CosineAnnealingLR(optimizer, T_max=args.epoch, eta_min=1e-3) + else: + scheduler = StepLR(optimizer, step_size=args.step_size, gamma=args.lr_decay) + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECAY = 0.5 + MOMENTUM_DECAY_STEP = args.step_size + + ''' === Testing then Exit === ''' + if args.mode == 'test': + with torch.no_grad(): + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + points, target = points.transpose(2, 1).float().cuda(), target.view(-1, 1)[:, 0].long().cuda() + if args.model == 'pointnet_semseg': + seg_pred, trans_feat = classifier(points) + seg_pred = seg_pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points) + seg_pred = seg_pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(seg_pred, target) + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + + MyLogger.epoch_summary(writer=writer, training=False, mode='semseg') + sys.exit("Test Finished") + + for epoch in range(MyLogger.epoch, args.epoch + 1): + + ''' === Training === ''' + # scheduler.step() + MyLogger.epoch_init() + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + writer.add_scalar('learning rate', scheduler.get_lr()[-1], MyLogger.step) + points, target = points.float().transpose(2, 1).cuda(), target.view(-1, 1)[:, 0].long().cuda() + + classifier.train() + optimizer.zero_grad() + # pdb.set_trace() + if args.model == 'pointnet_semseg': + seg_pred, trans_feat = classifier(points) + seg_pred = seg_pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points) + seg_pred = seg_pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(seg_pred, target) + + loss.backward() + optimizer.step() + + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + MyLogger.epoch_summary(writer=writer, training=True, mode='semseg') + + '''=== Evaluating ===''' + with torch.no_grad(): + classifier.eval() + MyLogger.epoch_init(training=False) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + points, target = points.transpose(2, 1).float().cuda(), target.view(-1, 1)[:, 0].long().cuda() + if args.model == 'pointnet_semseg': + seg_pred, trans_feat = classifier(points) + seg_pred = seg_pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(seg_pred, target, trans_feat) + else: + seg_pred = classifier(points) + seg_pred = seg_pred.contiguous().view(-1, NUM_CLASSES) + loss = criterion(seg_pred, target) + MyLogger.step_update(seg_pred.data.max(1)[1].cpu().numpy(), + target.long().cpu().numpy(), + loss.cpu().detach().numpy()) + + MyLogger.epoch_summary(writer=writer, training=False, mode='semseg') + if MyLogger.save_model: + state = { + 'step': MyLogger.step, + 'miou': MyLogger.best_miou, + 'epoch': MyLogger.best_miou_epoch, + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, MyLogger.savepath) + + scheduler.step() + if args.scheduler == 'step': + for param_group in optimizer.param_groups: + if optimizer.param_groups[0]['lr'] < LEARNING_RATE_CLIP: + param_group['lr'] = LEARNING_RATE_CLIP + if args.bn_decay: + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECAY ** (epoch // MOMENTUM_DECAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + + MyLogger.train_summary(mode='semseg') + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/OcCo/OcCo_Torch/utils/train_svm.py b/zoo/OcCo/OcCo_Torch/utils/train_svm.py new file mode 100644 index 0000000..79340a8 --- /dev/null +++ b/zoo/OcCo/OcCo_Torch/utils/train_svm.py @@ -0,0 +1,115 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://scikit-learn.org/stable/modules/svm.html +# Ref: https://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection + +import os, sys, torch, argparse, datetime, importlib, numpy as np +sys.path.append('utils') +sys.path.append('models') +from sklearn.model_selection import GridSearchCV, RandomizedSearchCV +from ModelNetDataLoader import General_CLSDataLoader_HDF5 +from Torch_Utility import copy_parameters +# from sklearn.preprocessing import scale +from torch.utils.data import DataLoader +from Dataset_Loc import Dataset_Loc +from sklearn import svm, metrics +from tqdm import tqdm + + +def parse_args(): + parser = argparse.ArgumentParser('SVM on Point Cloud Classification') + + ''' === Network Model === ''' + parser.add_argument('--gpu', type=str, default='0', help='GPU [default: 0]') + parser.add_argument('--model', default='pcn_util', help='model [default: pcn_util]') + parser.add_argument('--batch_size', type=int, default=24, help='batch size [default: 24]') + parser.add_argument('--restore_path', type=str, help="path to pre-trained weights [default: None]") + parser.add_argument('--grid_search', action='store_true', help='opt parameters via Grid Search [default: False]') + + ''' === Dataset === ''' + parser.add_argument('--partial', action='store_true', help='partial objects [default: False]') + parser.add_argument('--bn', action='store_true', help='with background noise [default: False]') + parser.add_argument('--dataset', type=str, default='modelnet40', help='dataset [default: modelnet40]') + parser.add_argument('--fname', type=str, default="", help='filename, used in ScanObjectNN [default: ]') + + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + _, TRAIN_FILES, TEST_FILES = Dataset_Loc(dataset=args.dataset, fname=args.fname, + partial=args.partial, bn=args.bn) + TRAIN_DATASET = General_CLSDataLoader_HDF5(file_list=TRAIN_FILES) + TEST_DATASET = General_CLSDataLoader_HDF5(file_list=TEST_FILES) + trainDataLoader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + testDataLoader = DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=Falses, num_workers=4) + + MODEL = importlib.import_module(args.model) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + encoder = MODEL.encoder(args=args, num_channel=3).to(device) + encoder = torch.nn.DataParallel(encoder) + + checkpoint = torch.load(args.restore_path) + encoder = copy_parameters(encoder, checkpoint, verbose=True) + + X_train, y_train, X_test, y_test = [], [], [], [] + with torch.no_grad(): + encoder.eval() + + for points, target in tqdm(trainDataLoader, total=len(trainDataLoader), smoothing=0.9): + points, target = points.float().transpose(2, 1).cuda(), target.long().cuda() + feats = encoder(points) + X_train.append(feats.cpu().numpy()) + y_train.append(target.cpu().numpy()) + + for points, target in tqdm(testDataLoader, total=len(testDataLoader), smoothing=0.9): + points, target = points.float().transpose(2, 1).cuda(), target.long().cuda() + feats = encoder(points) + X_test.append(feats.cpu().numpy()) + y_test.append(target.cpu().numpy()) + + X_train, y_train = np.concatenate(X_train), np.concatenate(y_train) + X_test, y_test = np.concatenate(X_test), np.concatenate(y_test) + + # Optional: Standardize the Feature Space + # X_train, X_test = scale(X_train), scale(X_test) + + ''' === Simple Trial === ''' + linear_svm = svm.SVC(kernel='linear') + linear_svm.fit(X_train, y_train) + y_pred = linear_svm.predict(X_test) + print("\n", "Simple Linear SVC accuracy:", metrics.accuracy_score(y_test, y_pred), "\n") + + rbf_svm = svm.SVC(kernel='rbf') + rbf_svm.fit(X_train, y_train) + y_pred = rbf_svm.predict(X_test) + print("Simple RBF SVC accuracy:", metrics.accuracy_score(y_test, y_pred), "\n") + + ''' === Grid Search for SVM with RBF Kernel === ''' + if not args.grid_search: + sys.exit() + print("Now we use Grid Search to opt the parameters for SVM RBF kernel") + # [1e-3, 5e-3, 1e-2, ..., 5e1] + gamma_range = np.outer(np.logspace(-3, 1, 5), np.array([1, 5])).flatten() + # [1e-1, 5e-1, 1e0, ..., 5e1] + C_range = np.outer(np.logspace(-1, 1, 3), np.array([1, 5])).flatten() + parameters = {'kernel': ['rbf'], 'C': C_range, 'gamma': gamma_range} + + svm_clsf = svm.SVC() + grid_clsf = GridSearchCV(estimator=svm_clsf, param_grid=parameters, n_jobs=8, verbose=1) + + start_time = datetime.datetime.now() + print('Start Param Searching at {}'.format(str(start_time))) + grid_clsf.fit(X_train, y_train) + print('Elapsed time, param searching {}'.format(str(datetime.datetime.now() - start_time))) + sorted(grid_clsf.cv_results_.keys()) + + # scores = grid_clsf.cv_results_['mean_test_score'].reshape(len(C_range), len(gamma_range)) + y_pred = grid_clsf.best_estimator_.predict(X_test) + print("\n\n") + print("="*37) + print("Best Params via Grid Search Cross Validation on Train Split is: ", grid_clsf.best_params_) + print("Best Model's Accuracy on Test Dataset: {}".format(metrics.accuracy_score(y_test, y_pred))) diff --git a/zoo/OcCo/assets/cls.png b/zoo/OcCo/assets/cls.png new file mode 100644 index 0000000..11fe5a9 Binary files /dev/null and b/zoo/OcCo/assets/cls.png differ diff --git a/zoo/OcCo/assets/data_overview_new.png b/zoo/OcCo/assets/data_overview_new.png new file mode 100644 index 0000000..b6733a3 Binary files /dev/null and b/zoo/OcCo/assets/data_overview_new.png differ diff --git a/zoo/OcCo/assets/dgcnn_combine.png b/zoo/OcCo/assets/dgcnn_combine.png new file mode 100644 index 0000000..724458f Binary files /dev/null and b/zoo/OcCo/assets/dgcnn_combine.png differ diff --git a/zoo/OcCo/assets/eff.png b/zoo/OcCo/assets/eff.png new file mode 100644 index 0000000..ddc2ec4 Binary files /dev/null and b/zoo/OcCo/assets/eff.png differ diff --git a/zoo/OcCo/assets/failure_combine.png b/zoo/OcCo/assets/failure_combine.png new file mode 100644 index 0000000..3a854ab Binary files /dev/null and b/zoo/OcCo/assets/failure_combine.png differ diff --git a/zoo/OcCo/assets/lr.png b/zoo/OcCo/assets/lr.png new file mode 100644 index 0000000..f59bd97 Binary files /dev/null and b/zoo/OcCo/assets/lr.png differ diff --git a/zoo/OcCo/assets/partseg.png b/zoo/OcCo/assets/partseg.png new file mode 100644 index 0000000..444ffb2 Binary files /dev/null and b/zoo/OcCo/assets/partseg.png differ diff --git a/zoo/OcCo/assets/pcn_combine.png b/zoo/OcCo/assets/pcn_combine.png new file mode 100644 index 0000000..eef1a80 Binary files /dev/null and b/zoo/OcCo/assets/pcn_combine.png differ diff --git a/zoo/OcCo/assets/pointnet_combine.png b/zoo/OcCo/assets/pointnet_combine.png new file mode 100644 index 0000000..6b92a8e Binary files /dev/null and b/zoo/OcCo/assets/pointnet_combine.png differ diff --git a/zoo/OcCo/assets/semseg.png b/zoo/OcCo/assets/semseg.png new file mode 100644 index 0000000..35e9c11 Binary files /dev/null and b/zoo/OcCo/assets/semseg.png differ diff --git a/zoo/OcCo/assets/svm.png b/zoo/OcCo/assets/svm.png new file mode 100644 index 0000000..3a7da6a Binary files /dev/null and b/zoo/OcCo/assets/svm.png differ diff --git a/zoo/OcCo/assets/teaser.png b/zoo/OcCo/assets/teaser.png new file mode 100644 index 0000000..6c41b0c Binary files /dev/null and b/zoo/OcCo/assets/teaser.png differ diff --git a/zoo/OcCo/assets/tsne.png b/zoo/OcCo/assets/tsne.png new file mode 100644 index 0000000..eec3866 Binary files /dev/null and b/zoo/OcCo/assets/tsne.png differ diff --git a/zoo/OcCo/readme.md b/zoo/OcCo/readme.md new file mode 100644 index 0000000..0667e32 --- /dev/null +++ b/zoo/OcCo/readme.md @@ -0,0 +1,463 @@ +## OcCo: Unsupervised Point Cloud Pre-training via Occlusion Completion +This repository is the official implementation of paper: "Unsupervised Point Cloud Pre-training via Occlusion Completion" + +[[Paper](https://arxiv.org/abs/2010.01089)] [[Project Page](https://hansen7.github.io/OcCo/)] + +### Intro + +![image](assets/teaser.png) + +In this work, we train a completion model that learns how to reconstruct the occluded points, given the partial observations. In this way, our method learns a pre-trained encoder that can identify the visual constraints inherently embedded in real-world point clouds. + +We call our method **Occlusion Completion (OcCo)**. We demonstrate that OcCo learns representations that: improve generalization on downstream tasks over prior pre-training methods, transfer to different datasets, reduce training time, and improve labeled sample efficiency. + + +### Citation +Our paper is preprinted on arxiv: + +``` +@inproceedings{OcCo, + title = {Unsupervised Point Cloud Pre-Training via Occlusion Completion}, + author = {Hanchen Wang and Qi Liu and Xiangyu Yue and Joan Lasenby and Matthew J. Kusner}, + year = 2021, + booktitle = {International Conference on Computer Vision, ICCV} +} +``` + +### Usage + +We provide codes in both PyTorch (1.3): OcCo_Torch and TensorFlow (1.13-1.15): OcCo_TF. We also provide with docker configuration docker. Our recommended development environment PyTorch + docker, the following descriptions are based on OcCo_Torch, we refer the readme in the OcCo_TF for the details of TensorFlow implementation. + + + +#### 1) Prerequisite + +##### Docker + +In the docker folder, we provide the build, configuration and launch scripts: + +``` +docker +| - Dockerfile_Torch # configuration +| - build_docker_torch.sh # scripts for building up from the docker images +| - launch_docker_torch.sh # launch from the built image +| - .dockerignore # ignore the log and data folder while building up +``` + +which can be automatically set up as following: + +```bash +# build up from docker images +cd OcCo_Torch/docker +sh build_docker_torch.sh + +# launch the docker image, conduct completion/classification/segmentation experiments +cd OcCo_Torch/docker +sh launch_docker_torch.sh +``` + +##### Non-Docker Setup + +Just go with `pip install -r Requirements_Torch.txt` with the `PyTorch 1.3.0, CUDA 10.1, CUDNN 7` (otherwise you may encounter errors while building the C++ extension chamfer_distance for calculating the Chamfer Distance), my development environment besides docker is `Ubuntu 16.04.6 LTS, gcc/g++ 5.4.0, cuda10.1, CUDNN 7`. + + + +#### 2) Pre-Training via Occlusion Completion (OcCo) + +##### Data Usage: + +For the details in the data setup, please see data/readme.md. + +##### Training Scripts: + +We unify the training of all three models (`PointNet`, `PCN` and `DGCNN`) in train_completion.py as well as the bash templates, see bash_template/train_completion_template.sh for details: + +```bash +#!/usr/bin/env bash + +cd ../ + +# train pointnet-occo model on ModelNet, from scratch +python train_completion.py \ + --gpu 0,1 \ + --dataset modelnet \ + --model pointnet_occo \ + --log_dir modelnet_pointnet_vanilla ; + +# train dgcnn-occo model on ShapeNet, from scratch +python train_completion.py \ + --gpu 0,1 \ + --batch_size 16 \ + --dataset shapenet \ + --model dgcnn_occo \ + --log_dir shapenet_dgcnn_vanilla ; +``` + +##### Pre-Trained Weights + +We will provide the OcCo pre-trained models for all the three models [here](https://drive.google.com/drive/folders/15H1JH9oTfp_sVkj9nwgnThZHRI9ef2bT?usp=sharing), you can use them for visualization of completing self-occluded point cloud, fine tuning on classification, scene semantic and object part segmentation tasks. + + + +#### 3) Sanity Check on Pre-Training + +We use single channel values as well as the t-SNE for dimensionality reduction to visualize the learned object embeddings on objects from the ShapeNet10, while the encoders are pre-trained on the ModelNet40 dataset, see utils/TSNE_Visu.py for details. + +We also train a Support Vector Machine (SVM) based on the learned embeddings object recognition. It is in train_svm.py. We also provide the bash template for this, see bash_template/train_svm_template.sh for details: + +```bash +#!/usr/bin/env bash + +cd ../ + +# fit a simple linear SVM on ModelNet40 with OcCo PCN +python train_svm.py \ + --gpu 0 \ + --model pcn_util \ + --dataset modelnet40 \ + --restore_path log/completion/modelnet_pcn_vanilla/checkpoints/best_model.pth ; + +# grid search the best svm parameters with rbf kernel on ScanObjectNN(OBJ_BG) with OcCo DGCNN +python train_svm.py \ + --gpu 0 \ + --grid_search \ + --batch_size 8 \ + --model dgcnn_util \ + --dataset scanobjectnn \ + --bn \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; +``` + + + +#### 4) Fine Tuning Task - Classification + +##### Data Usage: + +For the details in the data setup, please see data/readme.md. + +##### Training/Testing Scripts: + +We unify the training and testing of all three models (`PointNet`, `PCN` and `DGCNN`) in train_cls.py. We also provide the bash template for training each models from scratch, JigSaw/OcCo pre-trained checkpoints, see bash_template/train_cls_template.sh for details: + +```bash +#!/usr/bin/env bash + +cd ../ + +# training pointnet on ModelNet40, from scratch +python train_cls.py \ + --gpu 0 \ + --model pointnet_cls \ + --dataset modelnet40 \ + --log_dir modelnet40_pointnet_scratch ; + +# fine tuning pcn on ScanNet10, using jigsaw pre-trained checkpoints +python train_cls.py \ + --gpu 0 \ + --model pcn_cls \ + --dataset scannet10 \ + --log_dir scannet10_pcn_jigsaw \ + --restore \ + --restore_path log/completion/modelnet_pcn_vanilla/checkpoints/best_model.pth ; + +# fine tuning dgcnn on ScanObjectNN(OBJ_BG), using jigsaw pre-trained checkpoints +python train_cls.py \ + --gpu 0,1 \ + --epoch 250 \ + --use_sgd \ + --scheduler cos \ + --model dgcnn_cls \ + --dataset scanobjectnn \ + --bn \ + --log_dir scanobjectnn_dgcnn_occo \ + --restore \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; + +# test pointnet on ModelNet40 from pre-trained checkpoints +python train_cls.py \ + --gpu 1 \ + --mode test \ + --model pointnet_cls \ + --dataset modelnet40 \ + --log_dir modelnet40_pointnet_scratch \ + --restore \ + --restore_path log/cls/modelnet40_pointnet_scratch/checkpoints/best_model.pth ; +``` + + + +#### 5) Fine Tuning Task - Semantic Segmentation + +##### Data Usage: + +For the details in the data setup, please see data/readme.md. + +##### Training/Testing Scripts: + +We unify the training and testing of all three models (PointNet, PCN and DGCNN) in train_semseg.py. We also provide the bash template for training each models from scratch, JigSaw/OcCo pre-trained checkpoints, see bash_template/train_semseg_template.sh for details: + +```bash +#!/usr/bin/env bash + +cd ../ + +# train pointnet_semseg on 6-fold cv of S3DIS, from scratch +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --model pointnet_semseg \ + --bn_decay \ + --xavier_init \ + --test_area ${area} \ + --scheduler step \ + --log_dir pointnet_area${area}_scratch ; +done + +# fine tune pcn_semseg on 6-fold cv of S3DIS, using jigsaw pre-trained weights +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --model pcn_semseg \ + --bn_decay \ + --test_area ${area} \ + --log_dir pcn_area${area}_jigsaw \ + --restore \ + --restore_path log/jigsaw/modelnet_pcn_vanilla/checkpoints/best_model.pth ; +done + +# fine tune dgcnn_semseg on 6-fold cv of S3DIS, using occo pre-trained weights +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --test_area ${area} \ + --optimizer sgd \ + --scheduler cos \ + --model dgcnn_semseg \ + --log_dir dgcnn_area${area}_occo \ + --restore \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; +done + +# test pointnet_semseg on 6-fold cv of S3DIS, from saved checkpoints +for area in $(seq 1 1 6) +do +python train_semseg.py \ + --gpu 0,1 \ + --mode test \ + --model pointnet_semseg \ + --test_area ${area} \ + --scheduler step \ + --log_dir pointnet_area${area}_scratch \ + --restore \ + --restore_path log/semseg/pointnet_area${area}_scratch/checkpoints/best_model.pth ; +done +``` + + + +##### Visualization: + +We recommended using relevant code snippets in [RandLA-Net](https://github.com/QingyongHu/RandLA-Net) for visualization. + + + +#### 6) Fine Tuning Task - Part Segmentation + +##### Data Usage: + +For the details in the data setup, please see data/readme.md. + +##### Training/Testing Scripts: + +We unify the training and testing of all three models (PointNet, PCN and DGCNN) in train_partseg.py. We also provide the bash template for training each models from scratch, JigSaw/OcCo pre-trained checkpoints, see bash_template/train_partseg_template.sh for details: + +```bash +#!/usr/bin/env bash + +cd ../ + +# training pointnet on ShapeNetPart, from scratch +python train_partseg.py \ + --gpu 0 \ + --normal \ + --bn_decay \ + --xavier_init \ + --model pointnet_partseg \ + --log_dir pointnet_scratch ; + + +# fine tuning pcn on ShapeNetPart, using jigsaw pre-trained checkpoints +python train_partseg.py \ + --gpu 0 \ + --normal \ + --bn_decay \ + --xavier_init \ + --model pcn_partseg \ + --log_dir pcn_jigsaw \ + --restore \ + --restore_path log/jigsaw/modelnet_pcn_vanilla/checkpoints/best_model.pth ; + + +# fine tuning dgcnn on ShapeNetPart, using occo pre-trained checkpoints +python train_partseg.py \ + --gpu 0,1 \ + --normal \ + --use_sgd \ + --xavier_init \ + --scheduler cos \ + --model dgcnn_partseg \ + --log_dir dgcnn_occo \ + --restore \ + --restore_path log/completion/modelnet_dgcnn_vanilla/checkpoints/best_model.pth ; + + +# test fine tuned pointnet on ShapeNetPart, using multiple votes +python train_partseg.py \ + --gpu 1 \ + --epoch 1 \ + --mode test \ + --num_votes 3 \ + --model pointnet_partseg \ + --log_dir pointnet_scratch \ + --restore \ + --restore_path log/partseg/pointnet_occo/checkpoints/best_model.pth ; +``` + + + +#### 6) OcCo Data Generation (Create Your Own Dataset for OcCo Pre-Training) + +For the details in the self-occluded point cloud generation, please see render/readme.md. + + + +#### 7) Just Completion (Complete Your Own Data with Pre-Trained Model) + +You can use it for completing your occluded point cloud data with our provided OcCo checkpoints. + + + +#### 8) Jigsaw Puzzle + +We also provide our implementation (developed from scratch) on pre-training point cloud models via solving 3d jigsaw puzzles tasks as well as data generation, the method is described in this [paper](https://papers.nips.cc/paper/9455-self-supervised-deep-learning-on-point-clouds-by-reconstructing-space.pdf), while the authors did not reprocess to our code request. The details of our implementation is reported in our paper appendix. + +For the details of our implementation, please refer to description in the appendix of our paper and relevant code snippets, i.e., train_jigsaw.py, utils/3DPC_Data_Gen.py and train_jigsaw_template.sh. + + + +### Results + +##### Generated Dataset: + +

+ image +

+ +##### Completed Occluded Point Cloud: + +-- PointNet: + +

+ image +

+ + +-- PCN: + +

+ image +

+-- DGCNN: + +

+ image +

+ +-- Failure Examples: + +

+ image +

+ +##### Visualization of learned features: + +

+ image +

+ +##### Classification (linear SVM): + +

+ image +

+ + +##### Classification: + +

+ image +

+##### Semantic Segmentation: + +

+ image +

+##### Part Segmentation: + +

+ image +

+ + +##### Sample Efficiency: + +

+ image +

+ + +##### Learning Efficiency: + +

+ image +

+ +For the description and discussion of the results, please refer to our paper, thanks :) + + + +### Contributing + +The code of this project is released under the MIT License. + +We would like to thank and acknowledge referenced codes from the following repositories: + +https://github.com/wentaoyuan/pcn + +https://github.com/hansen7/NRS_3D + +https://github.com/WangYueFt/dgcnn + +https://github.com/charlesq34/pointnet + +https://github.com/charlesq34/pointnet2 + +https://github.com/PointCloudLibrary/pcl + +https://github.com/AnTao97/dgcnn.pytorch + +https://github.com/HuguesTHOMAS/KPConv + +https://github.com/QingyongHu/RandLA-Net + +https://github.com/chrdiller/pyTorchChamferDistance + +https://github.com/yanx27/Pointnet_Pointnet2_pytorch + +https://github.com/AnTao97/UnsupervisedPointCloudReconstruction + +We appreciate the help from the supportive technicians, Peter and Raf, from Cambridge Engineering :) diff --git a/zoo/OcCo/render/Depth_Renderer.py b/zoo/OcCo/render/Depth_Renderer.py new file mode 100644 index 0000000..9ef26b2 --- /dev/null +++ b/zoo/OcCo/render/Depth_Renderer.py @@ -0,0 +1,145 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/render/render_depth.py +# Usage: blender -b -P Depth_Renderer.py [ShapeNet directory] [model list] [output directory] [num scans per model] + +import os, sys, bpy, time, mathutils, numpy as np + + +def random_pose(): + """generate a random camera pose""" + angle_x = np.random.uniform() * 2 * np.pi + angle_y = np.random.uniform() * 2 * np.pi + angle_z = np.random.uniform() * 2 * np.pi + Rx = np.array([[1, 0, 0], + [0, np.cos(angle_x), -np.sin(angle_x)], + [0, np.sin(angle_x), np.cos(angle_x)]]) + Ry = np.array([[np.cos(angle_y), 0, np.sin(angle_y)], + [0, 1, 0], + [-np.sin(angle_y), 0, np.cos(angle_y)]]) + Rz = np.array([[np.cos(angle_z), -np.sin(angle_z), 0], + [np.sin(angle_z), np.cos(angle_z), 0], + [0, 0, 1]]) + R = np.dot(Rz, np.dot(Ry, Rx)) + # a rotation matrix with arbitrarily chosen yaw, pitch, roll + # Set camera pointing to the origin and 1 unit away from the origin + t = np.expand_dims(R[:, 2], 1) # select the third column, reshape into (3, 1)-vector + + # pose -> 4 * 4 + pose = np.concatenate([np.concatenate([R, t], 1), [[0, 0, 0, 1]]], 0) + return pose + + +def setup_blender(width, height, focal_length): + """using blender to rendering a scene""" + # camera, a class in the bpy + camera = bpy.data.objects['Camera'] + camera.data.angle = np.arctan(width / 2 / focal_length) * 2 + + # render layer + scene = bpy.context.scene + scene.render.filepath = 'buffer' + scene.render.image_settings.color_depth = '16' + scene.render.resolution_percentage = 100 + scene.render.resolution_x = width + scene.render.resolution_y = height + + # compositor nodes + scene.use_nodes = True + tree = scene.node_tree + rl = tree.nodes.new('CompositorNodeRLayers') + output = tree.nodes.new('CompositorNodeOutputFile') + output.base_path = '' + output.format.file_format = 'OPEN_EXR' + # tree.links.new(rl.outputs['Depth'], output.inputs[0]) + tree.links.new(rl.outputs['Z'], output.inputs[0]) + # ref: https://github.com/panmari/stanford-shapenet-renderer/issues/8 + + # remove default cube + bpy.data.objects['Cube'].select = True + bpy.ops.object.delete() + + return scene, camera, output + + +if __name__ == '__main__': + # Usage: blender -b -P Depth_Renderer.py [ShapeNet directory] [model list] [output directory] [num scans per model] + model_dir = sys.argv[-4] + list_path = sys.argv[-3] + output_dir = sys.argv[-2] + num_scans = int(sys.argv[-1]) + + '''Generate Intrinsic Camera Matrix''' + # High Resolution: width = 1600, + # Middle Resolution: width = 1600//4, + # Coarse Resolution: width = 1600//10, + + width = 1600//4 + height = 1200//4 + focal = 1000//4 + scene, camera, output = setup_blender(width, height, focal) + # offset is the center of images, the unit of focal here is the pixels(on the image) + intrinsics = np.array([[focal, 0, width / 2], [0, focal, height / 2], [0, 0, 1]]) + + # os.system('rm -rf %s' % output_dir) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + with open(os.path.join(list_path)) as file: + model_list = [line.strip() for line in file] + open(os.path.join(output_dir, 'blender.log'), 'w+').close() + np.savetxt(os.path.join(output_dir, 'intrinsics.txt'), intrinsics, '%f') + # camera-referenced system + + num_total_f = len(model_list) + + start = time.time() + '''rendering from the mesh to 2.5D depth images''' + for idx, model_id in enumerate(model_list): + # start = time.time() + exr_dir = os.path.join(output_dir, 'exr', model_id) + pose_dir = os.path.join(output_dir, 'pose', model_id) + os.makedirs(exr_dir) + os.makedirs(pose_dir) + # os.removedirs(exr_dir) + # os.removedirs(pose_dir) + + # Redirect output to log file + old_os_out = os.dup(1) + os.close(1) + os.open(os.path.join(output_dir, 'blender.log'), os.O_WRONLY) + + # Import mesh model + # model_path = os.path.join(model_dir, model_id, 'models/model_normalized.obj') + # bpy.ops.import_scene.obj(filepath=model_path) + + model_path = os.path.join(model_dir, model_id + '.obj') + bpy.ops.import_scene.obj(filepath=model_path) + + # Rotate model by 90 degrees around x-axis (z-up => y-up) to match ShapeNet's coordinates + bpy.ops.transform.rotate(value=-np.pi / 2, axis=(1, 0, 0)) + + # Render + for i in range(num_scans): + scene.frame_set(i) + pose = random_pose() + camera.matrix_world = mathutils.Matrix(pose) + # output.file_slots[0].path = os.path.join(exr_dir, '#.exr') + output.file_slots[0].path = exr_dir + '_#.exr' + bpy.ops.render.render(write_still=True) + # np.savetxt(os.path.join(pose_dir, '%d.txt' % i), pose, '%f') + np.savetxt(pose_dir + '_%d.txt' % i, pose, '%f') + + # Clean up + bpy.ops.object.delete() + for m in bpy.data.meshes: + bpy.data.meshes.remove(m) + for m in bpy.data.materials: + m.user_clear() + bpy.data.materials.remove(m) + + # Print used time + os.close(1) + os.dup(old_os_out) + os.close(old_os_out) + print('%d/%d: %s done, time=%.4f sec' % (idx + 1, num_total_f, model_id, time.time() - start)) + os.removedirs(exr_dir) + os.removedirs(pose_dir) diff --git a/zoo/OcCo/render/EXR_Process.py b/zoo/OcCo/render/EXR_Process.py new file mode 100644 index 0000000..235ed6f --- /dev/null +++ b/zoo/OcCo/render/EXR_Process.py @@ -0,0 +1,96 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk +# Ref: https://github.com/wentaoyuan/pcn/blob/master/render/process_exr.py + +import os, array, Imath, OpenEXR, argparse, numpy as np, matplotlib.pyplot as plt +from open3d.open3d.geometry import PointCloud +from open3d.open3d.utility import Vector3dVector +from open3d.open3d.io import write_point_cloud +from tqdm import tqdm + + +def read_exr(exr_path, height, width): + """from EXR files to extract depth information""" + file = OpenEXR.InputFile(exr_path) + depth_arr = array.array('f', file.channel('R', Imath.PixelType(Imath.PixelType.FLOAT))) + depth = np.array(depth_arr).reshape((height, width)) + depth[depth < 0] = 0 + depth[np.isinf(depth)] = 0 + return depth + + +def depth2pcd(depth, intrinsics, pose): + """backproject to points cloud from 2.5D depth images""" + inv_K = np.linalg.inv(intrinsics) + inv_K[2, 2] = -1 + depth = np.flipud(depth) # upside-down + + y, x = np.where(depth > 0) + # image coordinates -> camera coordinates + points = np.dot(inv_K, np.stack([x, y, np.ones_like(x)] * depth[y, x], 0)) + # camera coordinates -> world coordinates + points = np.dot(pose, np.concatenate([points, np.ones((1, points.shape[1]))], 0)).T[:, :3] + return points + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--list_file', default=r'./ModelNet_Flist.txt') + parser.add_argument('--intrinsics', default=r'./intrinsics.txt') + parser.add_argument('--output_dir', default=r'./dump') + parser.add_argument('--num_scans', default=10) + args = parser.parse_args() + + with open(args.list_file) as file: + model_list = file.read().splitlines() + intrinsics = np.loadtxt(args.intrinsics_file) + width = int(intrinsics[0, 2] * 2) + height = int(intrinsics[1, 2] * 2) + + counter = 0 + + for model_id in tqdm(model_list): + depth_dir = os.path.join(args.output_dir, 'depth') + pcd_dir = os.path.join(args.output_dir, 'pcd', model_id) + os.makedirs(depth_dir, exist_ok=True) + os.makedirs(pcd_dir, exist_ok=True) + for i in range(args.num_scans): + counter += 1 + + exr_path = os.path.join(args.output_dir, 'exr', model_id + '_%d.exr' % i) + pose_path = os.path.join(args.output_dir, 'pose', model_id + '_%d.txt' % i) + depth_path = os.path.join(args.output_dir, 'depth', model_id + '_%d.npy' % i) + depth = read_exr(exr_path, height, width) + np.save(depth_path, np.array(depth)) + # depth_img = Image(np.uint16(depth * 1000)) + # write_image(os.path.join(depth_dir, '%s_%d.png' % (model_id, i)), depth_img) + + if counter % 1 == 0: + counter = 1 + plt.figure(figsize=(16, 10)) + plt.imshow(np.array(depth), cmap='inferno') + plt.colorbar(label='Normalised Distance to Camera') + plt.title('Depth image') + plt.xlabel('X Pixel') + plt.ylabel('Y Pixel') + plt.tight_layout() + plt.savefig(os.path.join(depth_dir, model_id.split('/')[-1] + '_%d.png' % i), dpi=200) + plt.close() + + pose = np.loadtxt(pose_path) + points = depth2pcd(depth, intrinsics, pose) + try: + normalised_points = points/((points**2).sum(axis=1).max()) + pcd = PointCloud() + + except: + print('there is an exception in the partial normalised process: ', model_id, i) + + # if there is something wrong with the normalisation process, it will automatically save + # the previous normalised point cloud for the current objects + # pcd.points = Vector3dVector(normalised_points) + + pcd.points = Vector3dVector(points) + write_point_cloud(pcd_dir + '_%d.pcd' % i, pcd) + + # os.removedirs(depth_dir) + os.removedirs(pcd_dir) diff --git a/zoo/OcCo/render/ModelNet_Flist.txt b/zoo/OcCo/render/ModelNet_Flist.txt new file mode 100644 index 0000000..d7b7391 --- /dev/null +++ b/zoo/OcCo/render/ModelNet_Flist.txt @@ -0,0 +1,12311 @@ +mantel/train/mantel_0029_normalised +mantel/train/mantel_0037_normalised +mantel/train/mantel_0210_normalised +mantel/train/mantel_0284_normalised +mantel/train/mantel_0241_normalised +mantel/train/mantel_0208_normalised +mantel/train/mantel_0202_normalised +mantel/train/mantel_0039_normalised +mantel/train/mantel_0006_normalised +mantel/train/mantel_0252_normalised +mantel/train/mantel_0074_normalised +mantel/train/mantel_0015_normalised +mantel/train/mantel_0267_normalised +mantel/train/mantel_0181_normalised +mantel/train/mantel_0212_normalised +mantel/train/mantel_0004_normalised +mantel/train/mantel_0114_normalised +mantel/train/mantel_0155_normalised +mantel/train/mantel_0274_normalised +mantel/train/mantel_0223_normalised +mantel/train/mantel_0135_normalised +mantel/train/mantel_0083_normalised +mantel/train/mantel_0028_normalised +mantel/train/mantel_0229_normalised +mantel/train/mantel_0185_normalised +mantel/train/mantel_0234_normalised +mantel/train/mantel_0244_normalised +mantel/train/mantel_0151_normalised +mantel/train/mantel_0128_normalised +mantel/train/mantel_0113_normalised +mantel/train/mantel_0157_normalised +mantel/train/mantel_0044_normalised +mantel/train/mantel_0097_normalised +mantel/train/mantel_0048_normalised +mantel/train/mantel_0127_normalised +mantel/train/mantel_0054_normalised +mantel/train/mantel_0136_normalised +mantel/train/mantel_0250_normalised +mantel/train/mantel_0279_normalised +mantel/train/mantel_0012_normalised +mantel/train/mantel_0261_normalised +mantel/train/mantel_0056_normalised +mantel/train/mantel_0163_normalised +mantel/train/mantel_0175_normalised +mantel/train/mantel_0154_normalised +mantel/train/mantel_0152_normalised +mantel/train/mantel_0222_normalised +mantel/train/mantel_0003_normalised +mantel/train/mantel_0017_normalised +mantel/train/mantel_0071_normalised +mantel/train/mantel_0139_normalised +mantel/train/mantel_0211_normalised +mantel/train/mantel_0068_normalised +mantel/train/mantel_0230_normalised +mantel/train/mantel_0183_normalised +mantel/train/mantel_0069_normalised +mantel/train/mantel_0180_normalised +mantel/train/mantel_0059_normalised +mantel/train/mantel_0182_normalised +mantel/train/mantel_0138_normalised +mantel/train/mantel_0132_normalised +mantel/train/mantel_0087_normalised +mantel/train/mantel_0032_normalised +mantel/train/mantel_0100_normalised +mantel/train/mantel_0049_normalised +mantel/train/mantel_0115_normalised +mantel/train/mantel_0177_normalised +mantel/train/mantel_0111_normalised +mantel/train/mantel_0118_normalised +mantel/train/mantel_0081_normalised +mantel/train/mantel_0067_normalised +mantel/train/mantel_0107_normalised +mantel/train/mantel_0153_normalised +mantel/train/mantel_0243_normalised +mantel/train/mantel_0103_normalised +mantel/train/mantel_0207_normalised +mantel/train/mantel_0131_normalised +mantel/train/mantel_0173_normalised +mantel/train/mantel_0036_normalised +mantel/train/mantel_0001_normalised +mantel/train/mantel_0174_normalised +mantel/train/mantel_0248_normalised +mantel/train/mantel_0188_normalised +mantel/train/mantel_0079_normalised +mantel/train/mantel_0200_normalised +mantel/train/mantel_0240_normalised +mantel/train/mantel_0228_normalised +mantel/train/mantel_0171_normalised +mantel/train/mantel_0193_normalised +mantel/train/mantel_0213_normalised +mantel/train/mantel_0220_normalised +mantel/train/mantel_0053_normalised +mantel/train/mantel_0122_normalised +mantel/train/mantel_0051_normalised +mantel/train/mantel_0046_normalised +mantel/train/mantel_0216_normalised +mantel/train/mantel_0224_normalised +mantel/train/mantel_0101_normalised +mantel/train/mantel_0253_normalised +mantel/train/mantel_0278_normalised +mantel/train/mantel_0055_normalised +mantel/train/mantel_0194_normalised +mantel/train/mantel_0242_normalised +mantel/train/mantel_0260_normalised +mantel/train/mantel_0206_normalised +mantel/train/mantel_0257_normalised +mantel/train/mantel_0050_normalised +mantel/train/mantel_0172_normalised +mantel/train/mantel_0130_normalised +mantel/train/mantel_0057_normalised +mantel/train/mantel_0007_normalised +mantel/train/mantel_0259_normalised +mantel/train/mantel_0245_normalised +mantel/train/mantel_0145_normalised +mantel/train/mantel_0099_normalised +mantel/train/mantel_0226_normalised +mantel/train/mantel_0108_normalised +mantel/train/mantel_0179_normalised +mantel/train/mantel_0043_normalised +mantel/train/mantel_0065_normalised +mantel/train/mantel_0110_normalised +mantel/train/mantel_0192_normalised +mantel/train/mantel_0156_normalised +mantel/train/mantel_0196_normalised +mantel/train/mantel_0124_normalised +mantel/train/mantel_0137_normalised +mantel/train/mantel_0021_normalised +mantel/train/mantel_0013_normalised +mantel/train/mantel_0016_normalised +mantel/train/mantel_0060_normalised +mantel/train/mantel_0249_normalised +mantel/train/mantel_0121_normalised +mantel/train/mantel_0197_normalised +mantel/train/mantel_0275_normalised +mantel/train/mantel_0277_normalised +mantel/train/mantel_0010_normalised +mantel/train/mantel_0143_normalised +mantel/train/mantel_0041_normalised +mantel/train/mantel_0063_normalised +mantel/train/mantel_0201_normalised +mantel/train/mantel_0062_normalised +mantel/train/mantel_0042_normalised +mantel/train/mantel_0119_normalised +mantel/train/mantel_0027_normalised +mantel/train/mantel_0026_normalised +mantel/train/mantel_0178_normalised +mantel/train/mantel_0129_normalised +mantel/train/mantel_0120_normalised +mantel/train/mantel_0160_normalised +mantel/train/mantel_0203_normalised +mantel/train/mantel_0058_normalised +mantel/train/mantel_0025_normalised +mantel/train/mantel_0272_normalised +mantel/train/mantel_0251_normalised +mantel/train/mantel_0162_normalised +mantel/train/mantel_0147_normalised +mantel/train/mantel_0247_normalised +mantel/train/mantel_0077_normalised +mantel/train/mantel_0022_normalised +mantel/train/mantel_0190_normalised +mantel/train/mantel_0011_normalised +mantel/train/mantel_0024_normalised +mantel/train/mantel_0076_normalised +mantel/train/mantel_0187_normalised +mantel/train/mantel_0283_normalised +mantel/train/mantel_0085_normalised +mantel/train/mantel_0094_normalised +mantel/train/mantel_0064_normalised +mantel/train/mantel_0199_normalised +mantel/train/mantel_0106_normalised +mantel/train/mantel_0084_normalised +mantel/train/mantel_0019_normalised +mantel/train/mantel_0080_normalised +mantel/train/mantel_0186_normalised +mantel/train/mantel_0133_normalised +mantel/train/mantel_0070_normalised +mantel/train/mantel_0263_normalised +mantel/train/mantel_0045_normalised +mantel/train/mantel_0142_normalised +mantel/train/mantel_0170_normalised +mantel/train/mantel_0198_normalised +mantel/train/mantel_0165_normalised +mantel/train/mantel_0093_normalised +mantel/train/mantel_0146_normalised +mantel/train/mantel_0235_normalised +mantel/train/mantel_0237_normalised +mantel/train/mantel_0112_normalised +mantel/train/mantel_0219_normalised +mantel/train/mantel_0169_normalised +mantel/train/mantel_0281_normalised +mantel/train/mantel_0141_normalised +mantel/train/mantel_0109_normalised +mantel/train/mantel_0030_normalised +mantel/train/mantel_0218_normalised +mantel/train/mantel_0276_normalised +mantel/train/mantel_0238_normalised +mantel/train/mantel_0092_normalised +mantel/train/mantel_0023_normalised +mantel/train/mantel_0227_normalised +mantel/train/mantel_0159_normalised +mantel/train/mantel_0005_normalised +mantel/train/mantel_0232_normalised +mantel/train/mantel_0255_normalised +mantel/train/mantel_0282_normalised +mantel/train/mantel_0018_normalised +mantel/train/mantel_0038_normalised +mantel/train/mantel_0280_normalised +mantel/train/mantel_0231_normalised +mantel/train/mantel_0268_normalised +mantel/train/mantel_0221_normalised +mantel/train/mantel_0040_normalised +mantel/train/mantel_0166_normalised +mantel/train/mantel_0265_normalised +mantel/train/mantel_0184_normalised +mantel/train/mantel_0073_normalised +mantel/train/mantel_0066_normalised +mantel/train/mantel_0140_normalised +mantel/train/mantel_0176_normalised +mantel/train/mantel_0236_normalised +mantel/train/mantel_0264_normalised +mantel/train/mantel_0191_normalised +mantel/train/mantel_0266_normalised +mantel/train/mantel_0104_normalised +mantel/train/mantel_0271_normalised +mantel/train/mantel_0089_normalised +mantel/train/mantel_0189_normalised +mantel/train/mantel_0150_normalised +mantel/train/mantel_0033_normalised +mantel/train/mantel_0158_normalised +mantel/train/mantel_0075_normalised +mantel/train/mantel_0144_normalised +mantel/train/mantel_0078_normalised +mantel/train/mantel_0034_normalised +mantel/train/mantel_0125_normalised +mantel/train/mantel_0215_normalised +mantel/train/mantel_0082_normalised +mantel/train/mantel_0273_normalised +mantel/train/mantel_0047_normalised +mantel/train/mantel_0009_normalised +mantel/train/mantel_0086_normalised +mantel/train/mantel_0262_normalised +mantel/train/mantel_0002_normalised +mantel/train/mantel_0052_normalised +mantel/train/mantel_0091_normalised +mantel/train/mantel_0088_normalised +mantel/train/mantel_0204_normalised +mantel/train/mantel_0225_normalised +mantel/train/mantel_0134_normalised +mantel/train/mantel_0126_normalised +mantel/train/mantel_0031_normalised +mantel/train/mantel_0246_normalised +mantel/train/mantel_0008_normalised +mantel/train/mantel_0148_normalised +mantel/train/mantel_0217_normalised +mantel/train/mantel_0205_normalised +mantel/train/mantel_0102_normalised +mantel/train/mantel_0072_normalised +mantel/train/mantel_0149_normalised +mantel/train/mantel_0105_normalised +mantel/train/mantel_0090_normalised +mantel/train/mantel_0168_normalised +mantel/train/mantel_0239_normalised +mantel/train/mantel_0269_normalised +mantel/train/mantel_0014_normalised +mantel/train/mantel_0161_normalised +mantel/train/mantel_0096_normalised +mantel/train/mantel_0117_normalised +mantel/train/mantel_0061_normalised +mantel/train/mantel_0258_normalised +mantel/train/mantel_0256_normalised +mantel/train/mantel_0123_normalised +mantel/train/mantel_0164_normalised +mantel/train/mantel_0095_normalised +mantel/train/mantel_0214_normalised +mantel/train/mantel_0167_normalised +mantel/train/mantel_0254_normalised +mantel/train/mantel_0209_normalised +mantel/train/mantel_0020_normalised +mantel/train/mantel_0116_normalised +mantel/train/mantel_0035_normalised +mantel/train/mantel_0195_normalised +mantel/train/mantel_0270_normalised +mantel/train/mantel_0098_normalised +mantel/train/mantel_0233_normalised +mantel/test/mantel_0336_normalised +mantel/test/mantel_0290_normalised +mantel/test/mantel_0285_normalised +mantel/test/mantel_0346_normalised +mantel/test/mantel_0358_normalised +mantel/test/mantel_0339_normalised +mantel/test/mantel_0337_normalised +mantel/test/mantel_0303_normalised +mantel/test/mantel_0371_normalised +mantel/test/mantel_0342_normalised +mantel/test/mantel_0354_normalised +mantel/test/mantel_0310_normalised +mantel/test/mantel_0348_normalised +mantel/test/mantel_0316_normalised +mantel/test/mantel_0345_normalised +mantel/test/mantel_0326_normalised +mantel/test/mantel_0318_normalised +mantel/test/mantel_0364_normalised +mantel/test/mantel_0309_normalised +mantel/test/mantel_0287_normalised +mantel/test/mantel_0300_normalised +mantel/test/mantel_0296_normalised +mantel/test/mantel_0352_normalised +mantel/test/mantel_0320_normalised +mantel/test/mantel_0294_normalised +mantel/test/mantel_0297_normalised +mantel/test/mantel_0363_normalised +mantel/test/mantel_0332_normalised +mantel/test/mantel_0341_normalised +mantel/test/mantel_0302_normalised +mantel/test/mantel_0323_normalised +mantel/test/mantel_0292_normalised +mantel/test/mantel_0305_normalised +mantel/test/mantel_0286_normalised +mantel/test/mantel_0291_normalised +mantel/test/mantel_0353_normalised +mantel/test/mantel_0334_normalised +mantel/test/mantel_0373_normalised +mantel/test/mantel_0382_normalised +mantel/test/mantel_0370_normalised +mantel/test/mantel_0333_normalised +mantel/test/mantel_0331_normalised +mantel/test/mantel_0375_normalised +mantel/test/mantel_0338_normalised +mantel/test/mantel_0301_normalised +mantel/test/mantel_0325_normalised +mantel/test/mantel_0374_normalised +mantel/test/mantel_0369_normalised +mantel/test/mantel_0367_normalised +mantel/test/mantel_0384_normalised +mantel/test/mantel_0335_normalised +mantel/test/mantel_0299_normalised +mantel/test/mantel_0365_normalised +mantel/test/mantel_0314_normalised +mantel/test/mantel_0308_normalised +mantel/test/mantel_0307_normalised +mantel/test/mantel_0313_normalised +mantel/test/mantel_0315_normalised +mantel/test/mantel_0343_normalised +mantel/test/mantel_0368_normalised +mantel/test/mantel_0360_normalised +mantel/test/mantel_0324_normalised +mantel/test/mantel_0383_normalised +mantel/test/mantel_0340_normalised +mantel/test/mantel_0361_normalised +mantel/test/mantel_0351_normalised +mantel/test/mantel_0322_normalised +mantel/test/mantel_0372_normalised +mantel/test/mantel_0349_normalised +mantel/test/mantel_0357_normalised +mantel/test/mantel_0312_normalised +mantel/test/mantel_0329_normalised +mantel/test/mantel_0379_normalised +mantel/test/mantel_0295_normalised +mantel/test/mantel_0311_normalised +mantel/test/mantel_0347_normalised +mantel/test/mantel_0304_normalised +mantel/test/mantel_0377_normalised +mantel/test/mantel_0319_normalised +mantel/test/mantel_0330_normalised +mantel/test/mantel_0317_normalised +mantel/test/mantel_0288_normalised +mantel/test/mantel_0350_normalised +mantel/test/mantel_0328_normalised +mantel/test/mantel_0366_normalised +mantel/test/mantel_0344_normalised +mantel/test/mantel_0381_normalised +mantel/test/mantel_0376_normalised +mantel/test/mantel_0321_normalised +mantel/test/mantel_0293_normalised +mantel/test/mantel_0362_normalised +mantel/test/mantel_0306_normalised +mantel/test/mantel_0356_normalised +mantel/test/mantel_0327_normalised +mantel/test/mantel_0380_normalised +mantel/test/mantel_0378_normalised +mantel/test/mantel_0359_normalised +mantel/test/mantel_0355_normalised +mantel/test/mantel_0289_normalised +mantel/test/mantel_0298_normalised +vase/train/vase_0198_normalised +vase/train/vase_0104_normalised +vase/train/vase_0377_normalised +vase/train/vase_0064_normalised +vase/train/vase_0405_normalised +vase/train/vase_0328_normalised +vase/train/vase_0384_normalised +vase/train/vase_0299_normalised +vase/train/vase_0375_normalised +vase/train/vase_0036_normalised +vase/train/vase_0286_normalised +vase/train/vase_0325_normalised +vase/train/vase_0181_normalised +vase/train/vase_0318_normalised +vase/train/vase_0100_normalised +vase/train/vase_0461_normalised +vase/train/vase_0334_normalised +vase/train/vase_0057_normalised +vase/train/vase_0374_normalised +vase/train/vase_0469_normalised +vase/train/vase_0454_normalised +vase/train/vase_0090_normalised +vase/train/vase_0209_normalised +vase/train/vase_0452_normalised +vase/train/vase_0330_normalised +vase/train/vase_0457_normalised +vase/train/vase_0004_normalised +vase/train/vase_0133_normalised +vase/train/vase_0431_normalised +vase/train/vase_0031_normalised +vase/train/vase_0037_normalised +vase/train/vase_0034_normalised +vase/train/vase_0308_normalised +vase/train/vase_0368_normalised +vase/train/vase_0144_normalised +vase/train/vase_0310_normalised +vase/train/vase_0053_normalised +vase/train/vase_0391_normalised +vase/train/vase_0143_normalised +vase/train/vase_0432_normalised +vase/train/vase_0108_normalised +vase/train/vase_0091_normalised +vase/train/vase_0386_normalised +vase/train/vase_0438_normalised +vase/train/vase_0361_normalised +vase/train/vase_0217_normalised +vase/train/vase_0351_normalised +vase/train/vase_0146_normalised +vase/train/vase_0092_normalised +vase/train/vase_0124_normalised +vase/train/vase_0178_normalised +vase/train/vase_0215_normalised +vase/train/vase_0032_normalised +vase/train/vase_0392_normalised +vase/train/vase_0060_normalised +vase/train/vase_0383_normalised +vase/train/vase_0376_normalised +vase/train/vase_0131_normalised +vase/train/vase_0419_normalised +vase/train/vase_0190_normalised +vase/train/vase_0281_normalised +vase/train/vase_0398_normalised +vase/train/vase_0362_normalised +vase/train/vase_0357_normalised +vase/train/vase_0358_normalised +vase/train/vase_0474_normalised +vase/train/vase_0331_normalised +vase/train/vase_0121_normalised +vase/train/vase_0232_normalised +vase/train/vase_0022_normalised +vase/train/vase_0068_normalised +vase/train/vase_0157_normalised +vase/train/vase_0088_normalised +vase/train/vase_0338_normalised +vase/train/vase_0254_normalised +vase/train/vase_0188_normalised +vase/train/vase_0109_normalised +vase/train/vase_0071_normalised +vase/train/vase_0026_normalised +vase/train/vase_0235_normalised +vase/train/vase_0213_normalised +vase/train/vase_0344_normalised +vase/train/vase_0139_normalised +vase/train/vase_0055_normalised +vase/train/vase_0447_normalised +vase/train/vase_0283_normalised +vase/train/vase_0291_normalised +vase/train/vase_0424_normalised +vase/train/vase_0007_normalised +vase/train/vase_0009_normalised +vase/train/vase_0025_normalised +vase/train/vase_0394_normalised +vase/train/vase_0095_normalised +vase/train/vase_0161_normalised +vase/train/vase_0065_normalised +vase/train/vase_0173_normalised +vase/train/vase_0113_normalised +vase/train/vase_0341_normalised +vase/train/vase_0002_normalised +vase/train/vase_0409_normalised +vase/train/vase_0335_normalised +vase/train/vase_0048_normalised +vase/train/vase_0446_normalised +vase/train/vase_0155_normalised +vase/train/vase_0411_normalised +vase/train/vase_0142_normalised +vase/train/vase_0029_normalised +vase/train/vase_0140_normalised +vase/train/vase_0244_normalised +vase/train/vase_0003_normalised +vase/train/vase_0249_normalised +vase/train/vase_0099_normalised +vase/train/vase_0404_normalised +vase/train/vase_0159_normalised +vase/train/vase_0132_normalised +vase/train/vase_0280_normalised +vase/train/vase_0129_normalised +vase/train/vase_0225_normalised +vase/train/vase_0282_normalised +vase/train/vase_0214_normalised +vase/train/vase_0207_normalised +vase/train/vase_0073_normalised +vase/train/vase_0083_normalised +vase/train/vase_0464_normalised +vase/train/vase_0472_normalised +vase/train/vase_0201_normalised +vase/train/vase_0303_normalised +vase/train/vase_0006_normalised +vase/train/vase_0082_normalised +vase/train/vase_0302_normalised +vase/train/vase_0089_normalised +vase/train/vase_0018_normalised +vase/train/vase_0439_normalised +vase/train/vase_0059_normalised +vase/train/vase_0112_normalised +vase/train/vase_0203_normalised +vase/train/vase_0301_normalised +vase/train/vase_0345_normalised +vase/train/vase_0183_normalised +vase/train/vase_0047_normalised +vase/train/vase_0240_normalised +vase/train/vase_0196_normalised +vase/train/vase_0321_normalised +vase/train/vase_0125_normalised +vase/train/vase_0243_normalised +vase/train/vase_0237_normalised +vase/train/vase_0016_normalised +vase/train/vase_0193_normalised +vase/train/vase_0260_normalised +vase/train/vase_0304_normalised +vase/train/vase_0288_normalised +vase/train/vase_0128_normalised +vase/train/vase_0256_normalised +vase/train/vase_0365_normalised +vase/train/vase_0150_normalised +vase/train/vase_0422_normalised +vase/train/vase_0255_normalised +vase/train/vase_0218_normalised +vase/train/vase_0040_normalised +vase/train/vase_0312_normalised +vase/train/vase_0176_normalised +vase/train/vase_0185_normalised +vase/train/vase_0168_normalised +vase/train/vase_0182_normalised +vase/train/vase_0242_normalised +vase/train/vase_0363_normalised +vase/train/vase_0019_normalised +vase/train/vase_0426_normalised +vase/train/vase_0101_normalised +vase/train/vase_0410_normalised +vase/train/vase_0115_normalised +vase/train/vase_0028_normalised +vase/train/vase_0013_normalised +vase/train/vase_0466_normalised +vase/train/vase_0440_normalised +vase/train/vase_0075_normalised +vase/train/vase_0450_normalised +vase/train/vase_0154_normalised +vase/train/vase_0292_normalised +vase/train/vase_0094_normalised +vase/train/vase_0449_normalised +vase/train/vase_0023_normalised +vase/train/vase_0030_normalised +vase/train/vase_0223_normalised +vase/train/vase_0056_normalised +vase/train/vase_0274_normalised +vase/train/vase_0180_normalised +vase/train/vase_0211_normalised +vase/train/vase_0074_normalised +vase/train/vase_0306_normalised +vase/train/vase_0273_normalised +vase/train/vase_0259_normalised +vase/train/vase_0020_normalised +vase/train/vase_0387_normalised +vase/train/vase_0241_normalised +vase/train/vase_0434_normalised +vase/train/vase_0420_normalised +vase/train/vase_0169_normalised +vase/train/vase_0197_normalised +vase/train/vase_0443_normalised +vase/train/vase_0250_normalised +vase/train/vase_0228_normalised +vase/train/vase_0370_normalised +vase/train/vase_0134_normalised +vase/train/vase_0277_normalised +vase/train/vase_0289_normalised +vase/train/vase_0378_normalised +vase/train/vase_0295_normalised +vase/train/vase_0135_normalised +vase/train/vase_0152_normalised +vase/train/vase_0336_normalised +vase/train/vase_0216_normalised +vase/train/vase_0402_normalised +vase/train/vase_0147_normalised +vase/train/vase_0296_normalised +vase/train/vase_0118_normalised +vase/train/vase_0268_normalised +vase/train/vase_0267_normalised +vase/train/vase_0078_normalised +vase/train/vase_0421_normalised +vase/train/vase_0165_normalised +vase/train/vase_0266_normalised +vase/train/vase_0110_normalised +vase/train/vase_0427_normalised +vase/train/vase_0340_normalised +vase/train/vase_0212_normalised +vase/train/vase_0046_normalised +vase/train/vase_0204_normalised +vase/train/vase_0412_normalised +vase/train/vase_0024_normalised +vase/train/vase_0261_normalised +vase/train/vase_0322_normalised +vase/train/vase_0263_normalised +vase/train/vase_0167_normalised +vase/train/vase_0415_normalised +vase/train/vase_0317_normalised +vase/train/vase_0395_normalised +vase/train/vase_0151_normalised +vase/train/vase_0067_normalised +vase/train/vase_0236_normalised +vase/train/vase_0248_normalised +vase/train/vase_0414_normalised +vase/train/vase_0311_normalised +vase/train/vase_0435_normalised +vase/train/vase_0364_normalised +vase/train/vase_0195_normalised +vase/train/vase_0329_normalised +vase/train/vase_0130_normalised +vase/train/vase_0367_normalised +vase/train/vase_0272_normalised +vase/train/vase_0061_normalised +vase/train/vase_0170_normalised +vase/train/vase_0298_normalised +vase/train/vase_0284_normalised +vase/train/vase_0307_normalised +vase/train/vase_0471_normalised +vase/train/vase_0077_normalised +vase/train/vase_0390_normalised +vase/train/vase_0111_normalised +vase/train/vase_0175_normalised +vase/train/vase_0371_normalised +vase/train/vase_0136_normalised +vase/train/vase_0238_normalised +vase/train/vase_0072_normalised +vase/train/vase_0166_normalised +vase/train/vase_0049_normalised +vase/train/vase_0062_normalised +vase/train/vase_0418_normalised +vase/train/vase_0008_normalised +vase/train/vase_0403_normalised +vase/train/vase_0275_normalised +vase/train/vase_0231_normalised +vase/train/vase_0187_normalised +vase/train/vase_0206_normalised +vase/train/vase_0285_normalised +vase/train/vase_0085_normalised +vase/train/vase_0096_normalised +vase/train/vase_0429_normalised +vase/train/vase_0246_normalised +vase/train/vase_0337_normalised +vase/train/vase_0448_normalised +vase/train/vase_0356_normalised +vase/train/vase_0359_normalised +vase/train/vase_0010_normalised +vase/train/vase_0380_normalised +vase/train/vase_0117_normalised +vase/train/vase_0262_normalised +vase/train/vase_0202_normalised +vase/train/vase_0051_normalised +vase/train/vase_0093_normalised +vase/train/vase_0222_normalised +vase/train/vase_0313_normalised +vase/train/vase_0189_normalised +vase/train/vase_0360_normalised +vase/train/vase_0297_normalised +vase/train/vase_0171_normalised +vase/train/vase_0014_normalised +vase/train/vase_0320_normalised +vase/train/vase_0253_normalised +vase/train/vase_0270_normalised +vase/train/vase_0063_normalised +vase/train/vase_0191_normalised +vase/train/vase_0366_normalised +vase/train/vase_0417_normalised +vase/train/vase_0208_normalised +vase/train/vase_0126_normalised +vase/train/vase_0323_normalised +vase/train/vase_0005_normalised +vase/train/vase_0430_normalised +vase/train/vase_0388_normalised +vase/train/vase_0379_normalised +vase/train/vase_0423_normalised +vase/train/vase_0319_normalised +vase/train/vase_0470_normalised +vase/train/vase_0247_normalised +vase/train/vase_0199_normalised +vase/train/vase_0086_normalised +vase/train/vase_0389_normalised +vase/train/vase_0343_normalised +vase/train/vase_0251_normalised +vase/train/vase_0327_normalised +vase/train/vase_0070_normalised +vase/train/vase_0107_normalised +vase/train/vase_0456_normalised +vase/train/vase_0172_normalised +vase/train/vase_0407_normalised +vase/train/vase_0038_normalised +vase/train/vase_0332_normalised +vase/train/vase_0138_normalised +vase/train/vase_0473_normalised +vase/train/vase_0265_normalised +vase/train/vase_0179_normalised +vase/train/vase_0084_normalised +vase/train/vase_0314_normalised +vase/train/vase_0373_normalised +vase/train/vase_0347_normalised +vase/train/vase_0052_normalised +vase/train/vase_0044_normalised +vase/train/vase_0210_normalised +vase/train/vase_0354_normalised +vase/train/vase_0369_normalised +vase/train/vase_0050_normalised +vase/train/vase_0186_normalised +vase/train/vase_0425_normalised +vase/train/vase_0163_normalised +vase/train/vase_0433_normalised +vase/train/vase_0252_normalised +vase/train/vase_0413_normalised +vase/train/vase_0416_normalised +vase/train/vase_0160_normalised +vase/train/vase_0290_normalised +vase/train/vase_0475_normalised +vase/train/vase_0227_normalised +vase/train/vase_0042_normalised +vase/train/vase_0045_normalised +vase/train/vase_0396_normalised +vase/train/vase_0069_normalised +vase/train/vase_0462_normalised +vase/train/vase_0385_normalised +vase/train/vase_0239_normalised +vase/train/vase_0453_normalised +vase/train/vase_0279_normalised +vase/train/vase_0399_normalised +vase/train/vase_0401_normalised +vase/train/vase_0164_normalised +vase/train/vase_0041_normalised +vase/train/vase_0153_normalised +vase/train/vase_0120_normalised +vase/train/vase_0226_normalised +vase/train/vase_0428_normalised +vase/train/vase_0350_normalised +vase/train/vase_0123_normalised +vase/train/vase_0349_normalised +vase/train/vase_0406_normalised +vase/train/vase_0097_normalised +vase/train/vase_0141_normalised +vase/train/vase_0076_normalised +vase/train/vase_0293_normalised +vase/train/vase_0194_normalised +vase/train/vase_0393_normalised +vase/train/vase_0033_normalised +vase/train/vase_0264_normalised +vase/train/vase_0114_normalised +vase/train/vase_0105_normalised +vase/train/vase_0116_normalised +vase/train/vase_0400_normalised +vase/train/vase_0397_normalised +vase/train/vase_0408_normalised +vase/train/vase_0200_normalised +vase/train/vase_0381_normalised +vase/train/vase_0087_normalised +vase/train/vase_0445_normalised +vase/train/vase_0122_normalised +vase/train/vase_0305_normalised +vase/train/vase_0355_normalised +vase/train/vase_0230_normalised +vase/train/vase_0326_normalised +vase/train/vase_0027_normalised +vase/train/vase_0278_normalised +vase/train/vase_0177_normalised +vase/train/vase_0333_normalised +vase/train/vase_0234_normalised +vase/train/vase_0066_normalised +vase/train/vase_0309_normalised +vase/train/vase_0058_normalised +vase/train/vase_0459_normalised +vase/train/vase_0352_normalised +vase/train/vase_0017_normalised +vase/train/vase_0012_normalised +vase/train/vase_0316_normalised +vase/train/vase_0441_normalised +vase/train/vase_0346_normalised +vase/train/vase_0148_normalised +vase/train/vase_0184_normalised +vase/train/vase_0382_normalised +vase/train/vase_0081_normalised +vase/train/vase_0276_normalised +vase/train/vase_0103_normalised +vase/train/vase_0451_normalised +vase/train/vase_0271_normalised +vase/train/vase_0098_normalised +vase/train/vase_0463_normalised +vase/train/vase_0220_normalised +vase/train/vase_0233_normalised +vase/train/vase_0149_normalised +vase/train/vase_0035_normalised +vase/train/vase_0245_normalised +vase/train/vase_0043_normalised +vase/train/vase_0158_normalised +vase/train/vase_0015_normalised +vase/train/vase_0080_normalised +vase/train/vase_0054_normalised +vase/train/vase_0039_normalised +vase/train/vase_0455_normalised +vase/train/vase_0442_normalised +vase/train/vase_0221_normalised +vase/train/vase_0339_normalised +vase/train/vase_0294_normalised +vase/train/vase_0145_normalised +vase/train/vase_0079_normalised +vase/train/vase_0342_normalised +vase/train/vase_0219_normalised +vase/train/vase_0372_normalised +vase/train/vase_0300_normalised +vase/train/vase_0162_normalised +vase/train/vase_0436_normalised +vase/train/vase_0001_normalised +vase/train/vase_0437_normalised +vase/train/vase_0106_normalised +vase/train/vase_0205_normalised +vase/train/vase_0021_normalised +vase/train/vase_0315_normalised +vase/train/vase_0324_normalised +vase/train/vase_0258_normalised +vase/train/vase_0119_normalised +vase/train/vase_0174_normalised +vase/train/vase_0127_normalised +vase/train/vase_0353_normalised +vase/train/vase_0460_normalised +vase/train/vase_0444_normalised +vase/train/vase_0458_normalised +vase/train/vase_0465_normalised +vase/train/vase_0229_normalised +vase/train/vase_0287_normalised +vase/train/vase_0257_normalised +vase/train/vase_0156_normalised +vase/train/vase_0467_normalised +vase/train/vase_0011_normalised +vase/train/vase_0269_normalised +vase/train/vase_0102_normalised +vase/train/vase_0224_normalised +vase/train/vase_0348_normalised +vase/train/vase_0137_normalised +vase/train/vase_0468_normalised +vase/train/vase_0192_normalised +vase/test/vase_0522_normalised +vase/test/vase_0498_normalised +vase/test/vase_0536_normalised +vase/test/vase_0532_normalised +vase/test/vase_0495_normalised +vase/test/vase_0548_normalised +vase/test/vase_0551_normalised +vase/test/vase_0557_normalised +vase/test/vase_0567_normalised +vase/test/vase_0496_normalised +vase/test/vase_0483_normalised +vase/test/vase_0513_normalised +vase/test/vase_0499_normalised +vase/test/vase_0506_normalised +vase/test/vase_0540_normalised +vase/test/vase_0528_normalised +vase/test/vase_0542_normalised +vase/test/vase_0569_normalised +vase/test/vase_0534_normalised +vase/test/vase_0480_normalised +vase/test/vase_0510_normalised +vase/test/vase_0556_normalised +vase/test/vase_0554_normalised +vase/test/vase_0501_normalised +vase/test/vase_0508_normalised +vase/test/vase_0549_normalised +vase/test/vase_0547_normalised +vase/test/vase_0544_normalised +vase/test/vase_0486_normalised +vase/test/vase_0565_normalised +vase/test/vase_0538_normalised +vase/test/vase_0491_normalised +vase/test/vase_0481_normalised +vase/test/vase_0482_normalised +vase/test/vase_0509_normalised +vase/test/vase_0511_normalised +vase/test/vase_0559_normalised +vase/test/vase_0535_normalised +vase/test/vase_0516_normalised +vase/test/vase_0537_normalised +vase/test/vase_0489_normalised +vase/test/vase_0566_normalised +vase/test/vase_0525_normalised +vase/test/vase_0493_normalised +vase/test/vase_0477_normalised +vase/test/vase_0572_normalised +vase/test/vase_0505_normalised +vase/test/vase_0517_normalised +vase/test/vase_0520_normalised +vase/test/vase_0497_normalised +vase/test/vase_0503_normalised +vase/test/vase_0539_normalised +vase/test/vase_0545_normalised +vase/test/vase_0563_normalised +vase/test/vase_0543_normalised +vase/test/vase_0530_normalised +vase/test/vase_0526_normalised +vase/test/vase_0523_normalised +vase/test/vase_0524_normalised +vase/test/vase_0570_normalised +vase/test/vase_0529_normalised +vase/test/vase_0560_normalised +vase/test/vase_0507_normalised +vase/test/vase_0558_normalised +vase/test/vase_0514_normalised +vase/test/vase_0552_normalised +vase/test/vase_0512_normalised +vase/test/vase_0521_normalised +vase/test/vase_0574_normalised +vase/test/vase_0575_normalised +vase/test/vase_0553_normalised +vase/test/vase_0571_normalised +vase/test/vase_0533_normalised +vase/test/vase_0562_normalised +vase/test/vase_0564_normalised +vase/test/vase_0519_normalised +vase/test/vase_0504_normalised +vase/test/vase_0541_normalised +vase/test/vase_0531_normalised +vase/test/vase_0478_normalised +vase/test/vase_0550_normalised +vase/test/vase_0492_normalised +vase/test/vase_0490_normalised +vase/test/vase_0476_normalised +vase/test/vase_0561_normalised +vase/test/vase_0502_normalised +vase/test/vase_0546_normalised +vase/test/vase_0488_normalised +vase/test/vase_0527_normalised +vase/test/vase_0555_normalised +vase/test/vase_0500_normalised +vase/test/vase_0485_normalised +vase/test/vase_0515_normalised +vase/test/vase_0573_normalised +vase/test/vase_0568_normalised +vase/test/vase_0479_normalised +vase/test/vase_0518_normalised +vase/test/vase_0494_normalised +vase/test/vase_0484_normalised +vase/test/vase_0487_normalised +bowl/train/bowl_0050_normalised +bowl/train/bowl_0031_normalised +bowl/train/bowl_0038_normalised +bowl/train/bowl_0051_normalised +bowl/train/bowl_0026_normalised +bowl/train/bowl_0019_normalised +bowl/train/bowl_0005_normalised +bowl/train/bowl_0054_normalised +bowl/train/bowl_0048_normalised +bowl/train/bowl_0013_normalised +bowl/train/bowl_0044_normalised +bowl/train/bowl_0025_normalised +bowl/train/bowl_0027_normalised +bowl/train/bowl_0022_normalised +bowl/train/bowl_0035_normalised +bowl/train/bowl_0001_normalised +bowl/train/bowl_0017_normalised +bowl/train/bowl_0029_normalised +bowl/train/bowl_0015_normalised +bowl/train/bowl_0011_normalised +bowl/train/bowl_0018_normalised +bowl/train/bowl_0043_normalised +bowl/train/bowl_0049_normalised +bowl/train/bowl_0042_normalised +bowl/train/bowl_0004_normalised +bowl/train/bowl_0041_normalised +bowl/train/bowl_0009_normalised +bowl/train/bowl_0062_normalised +bowl/train/bowl_0060_normalised +bowl/train/bowl_0055_normalised +bowl/train/bowl_0003_normalised +bowl/train/bowl_0030_normalised +bowl/train/bowl_0039_normalised +bowl/train/bowl_0052_normalised +bowl/train/bowl_0059_normalised +bowl/train/bowl_0028_normalised +bowl/train/bowl_0064_normalised +bowl/train/bowl_0016_normalised +bowl/train/bowl_0061_normalised +bowl/train/bowl_0057_normalised +bowl/train/bowl_0007_normalised +bowl/train/bowl_0053_normalised +bowl/train/bowl_0058_normalised +bowl/train/bowl_0021_normalised +bowl/train/bowl_0056_normalised +bowl/train/bowl_0037_normalised +bowl/train/bowl_0023_normalised +bowl/train/bowl_0032_normalised +bowl/train/bowl_0033_normalised +bowl/train/bowl_0036_normalised +bowl/train/bowl_0040_normalised +bowl/train/bowl_0008_normalised +bowl/train/bowl_0046_normalised +bowl/train/bowl_0010_normalised +bowl/train/bowl_0012_normalised +bowl/train/bowl_0020_normalised +bowl/train/bowl_0014_normalised +bowl/train/bowl_0045_normalised +bowl/train/bowl_0047_normalised +bowl/train/bowl_0024_normalised +bowl/train/bowl_0002_normalised +bowl/train/bowl_0063_normalised +bowl/train/bowl_0034_normalised +bowl/train/bowl_0006_normalised +bowl/test/bowl_0082_normalised +bowl/test/bowl_0073_normalised +bowl/test/bowl_0067_normalised +bowl/test/bowl_0069_normalised +bowl/test/bowl_0080_normalised +bowl/test/bowl_0070_normalised +bowl/test/bowl_0084_normalised +bowl/test/bowl_0072_normalised +bowl/test/bowl_0081_normalised +bowl/test/bowl_0065_normalised +bowl/test/bowl_0066_normalised +bowl/test/bowl_0083_normalised +bowl/test/bowl_0078_normalised +bowl/test/bowl_0076_normalised +bowl/test/bowl_0075_normalised +bowl/test/bowl_0074_normalised +bowl/test/bowl_0068_normalised +bowl/test/bowl_0079_normalised +bowl/test/bowl_0071_normalised +bowl/test/bowl_0077_normalised +monitor/train/monitor_0153_normalised +monitor/train/monitor_0333_normalised +monitor/train/monitor_0204_normalised +monitor/train/monitor_0053_normalised +monitor/train/monitor_0141_normalised +monitor/train/monitor_0279_normalised +monitor/train/monitor_0159_normalised +monitor/train/monitor_0158_normalised +monitor/train/monitor_0250_normalised +monitor/train/monitor_0205_normalised +monitor/train/monitor_0020_normalised +monitor/train/monitor_0316_normalised +monitor/train/monitor_0126_normalised +monitor/train/monitor_0339_normalised +monitor/train/monitor_0086_normalised +monitor/train/monitor_0219_normalised +monitor/train/monitor_0226_normalised +monitor/train/monitor_0001_normalised +monitor/train/monitor_0256_normalised +monitor/train/monitor_0409_normalised +monitor/train/monitor_0125_normalised +monitor/train/monitor_0380_normalised +monitor/train/monitor_0277_normalised +monitor/train/monitor_0064_normalised +monitor/train/monitor_0340_normalised +monitor/train/monitor_0173_normalised +monitor/train/monitor_0444_normalised +monitor/train/monitor_0140_normalised +monitor/train/monitor_0131_normalised +monitor/train/monitor_0358_normalised +monitor/train/monitor_0424_normalised +monitor/train/monitor_0451_normalised +monitor/train/monitor_0022_normalised +monitor/train/monitor_0080_normalised +monitor/train/monitor_0148_normalised +monitor/train/monitor_0386_normalised +monitor/train/monitor_0324_normalised +monitor/train/monitor_0088_normalised +monitor/train/monitor_0076_normalised +monitor/train/monitor_0273_normalised +monitor/train/monitor_0121_normalised +monitor/train/monitor_0100_normalised +monitor/train/monitor_0046_normalised +monitor/train/monitor_0310_normalised +monitor/train/monitor_0332_normalised +monitor/train/monitor_0172_normalised +monitor/train/monitor_0374_normalised +monitor/train/monitor_0317_normalised +monitor/train/monitor_0354_normalised +monitor/train/monitor_0342_normalised +monitor/train/monitor_0166_normalised +monitor/train/monitor_0388_normalised +monitor/train/monitor_0190_normalised +monitor/train/monitor_0106_normalised +monitor/train/monitor_0315_normalised +monitor/train/monitor_0055_normalised +monitor/train/monitor_0338_normalised +monitor/train/monitor_0066_normalised +monitor/train/monitor_0248_normalised +monitor/train/monitor_0102_normalised +monitor/train/monitor_0459_normalised +monitor/train/monitor_0132_normalised +monitor/train/monitor_0156_normalised +monitor/train/monitor_0160_normalised +monitor/train/monitor_0075_normalised +monitor/train/monitor_0063_normalised +monitor/train/monitor_0382_normalised +monitor/train/monitor_0208_normalised +monitor/train/monitor_0413_normalised +monitor/train/monitor_0124_normalised +monitor/train/monitor_0214_normalised +monitor/train/monitor_0133_normalised +monitor/train/monitor_0081_normalised +monitor/train/monitor_0411_normalised +monitor/train/monitor_0312_normalised +monitor/train/monitor_0187_normalised +monitor/train/monitor_0201_normalised +monitor/train/monitor_0300_normalised +monitor/train/monitor_0280_normalised +monitor/train/monitor_0128_normalised +monitor/train/monitor_0334_normalised +monitor/train/monitor_0243_normalised +monitor/train/monitor_0067_normalised +monitor/train/monitor_0435_normalised +monitor/train/monitor_0393_normalised +monitor/train/monitor_0186_normalised +monitor/train/monitor_0321_normalised +monitor/train/monitor_0034_normalised +monitor/train/monitor_0272_normalised +monitor/train/monitor_0271_normalised +monitor/train/monitor_0403_normalised +monitor/train/monitor_0419_normalised +monitor/train/monitor_0050_normalised +monitor/train/monitor_0071_normalised +monitor/train/monitor_0406_normalised +monitor/train/monitor_0239_normalised +monitor/train/monitor_0116_normalised +monitor/train/monitor_0290_normalised +monitor/train/monitor_0045_normalised +monitor/train/monitor_0335_normalised +monitor/train/monitor_0263_normalised +monitor/train/monitor_0010_normalised +monitor/train/monitor_0288_normalised +monitor/train/monitor_0068_normalised +monitor/train/monitor_0301_normalised +monitor/train/monitor_0123_normalised +monitor/train/monitor_0412_normalised +monitor/train/monitor_0448_normalised +monitor/train/monitor_0089_normalised +monitor/train/monitor_0287_normalised +monitor/train/monitor_0258_normalised +monitor/train/monitor_0161_normalised +monitor/train/monitor_0165_normalised +monitor/train/monitor_0259_normalised +monitor/train/monitor_0097_normalised +monitor/train/monitor_0069_normalised +monitor/train/monitor_0306_normalised +monitor/train/monitor_0142_normalised +monitor/train/monitor_0058_normalised +monitor/train/monitor_0127_normalised +monitor/train/monitor_0139_normalised +monitor/train/monitor_0215_normalised +monitor/train/monitor_0041_normalised +monitor/train/monitor_0117_normalised +monitor/train/monitor_0200_normalised +monitor/train/monitor_0442_normalised +monitor/train/monitor_0177_normalised +monitor/train/monitor_0202_normalised +monitor/train/monitor_0307_normalised +monitor/train/monitor_0237_normalised +monitor/train/monitor_0426_normalised +monitor/train/monitor_0213_normalised +monitor/train/monitor_0061_normalised +monitor/train/monitor_0225_normalised +monitor/train/monitor_0051_normalised +monitor/train/monitor_0114_normalised +monitor/train/monitor_0152_normalised +monitor/train/monitor_0236_normalised +monitor/train/monitor_0144_normalised +monitor/train/monitor_0189_normalised +monitor/train/monitor_0281_normalised +monitor/train/monitor_0349_normalised +monitor/train/monitor_0129_normalised +monitor/train/monitor_0107_normalised +monitor/train/monitor_0112_normalised +monitor/train/monitor_0005_normalised +monitor/train/monitor_0381_normalised +monitor/train/monitor_0452_normalised +monitor/train/monitor_0291_normalised +monitor/train/monitor_0014_normalised +monitor/train/monitor_0085_normalised +monitor/train/monitor_0458_normalised +monitor/train/monitor_0143_normalised +monitor/train/monitor_0035_normalised +monitor/train/monitor_0249_normalised +monitor/train/monitor_0325_normalised +monitor/train/monitor_0233_normalised +monitor/train/monitor_0318_normalised +monitor/train/monitor_0352_normalised +monitor/train/monitor_0293_normalised +monitor/train/monitor_0115_normalised +monitor/train/monitor_0350_normalised +monitor/train/monitor_0345_normalised +monitor/train/monitor_0429_normalised +monitor/train/monitor_0244_normalised +monitor/train/monitor_0257_normalised +monitor/train/monitor_0235_normalised +monitor/train/monitor_0037_normalised +monitor/train/monitor_0042_normalised +monitor/train/monitor_0024_normalised +monitor/train/monitor_0136_normalised +monitor/train/monitor_0163_normalised +monitor/train/monitor_0157_normalised +monitor/train/monitor_0240_normalised +monitor/train/monitor_0169_normalised +monitor/train/monitor_0004_normalised +monitor/train/monitor_0427_normalised +monitor/train/monitor_0049_normalised +monitor/train/monitor_0191_normalised +monitor/train/monitor_0074_normalised +monitor/train/monitor_0054_normalised +monitor/train/monitor_0432_normalised +monitor/train/monitor_0445_normalised +monitor/train/monitor_0031_normalised +monitor/train/monitor_0434_normalised +monitor/train/monitor_0286_normalised +monitor/train/monitor_0164_normalised +monitor/train/monitor_0137_normalised +monitor/train/monitor_0180_normalised +monitor/train/monitor_0439_normalised +monitor/train/monitor_0373_normalised +monitor/train/monitor_0234_normalised +monitor/train/monitor_0360_normalised +monitor/train/monitor_0062_normalised +monitor/train/monitor_0328_normalised +monitor/train/monitor_0383_normalised +monitor/train/monitor_0405_normalised +monitor/train/monitor_0028_normalised +monitor/train/monitor_0443_normalised +monitor/train/monitor_0422_normalised +monitor/train/monitor_0021_normalised +monitor/train/monitor_0449_normalised +monitor/train/monitor_0267_normalised +monitor/train/monitor_0260_normalised +monitor/train/monitor_0297_normalised +monitor/train/monitor_0430_normalised +monitor/train/monitor_0111_normalised +monitor/train/monitor_0105_normalised +monitor/train/monitor_0222_normalised +monitor/train/monitor_0029_normalised +monitor/train/monitor_0417_normalised +monitor/train/monitor_0149_normalised +monitor/train/monitor_0103_normalised +monitor/train/monitor_0032_normalised +monitor/train/monitor_0266_normalised +monitor/train/monitor_0145_normalised +monitor/train/monitor_0018_normalised +monitor/train/monitor_0090_normalised +monitor/train/monitor_0351_normalised +monitor/train/monitor_0241_normalised +monitor/train/monitor_0418_normalised +monitor/train/monitor_0231_normalised +monitor/train/monitor_0199_normalised +monitor/train/monitor_0092_normalised +monitor/train/monitor_0387_normalised +monitor/train/monitor_0450_normalised +monitor/train/monitor_0059_normalised +monitor/train/monitor_0461_normalised +monitor/train/monitor_0394_normalised +monitor/train/monitor_0320_normalised +monitor/train/monitor_0094_normalised +monitor/train/monitor_0275_normalised +monitor/train/monitor_0282_normalised +monitor/train/monitor_0184_normalised +monitor/train/monitor_0456_normalised +monitor/train/monitor_0247_normalised +monitor/train/monitor_0463_normalised +monitor/train/monitor_0082_normalised +monitor/train/monitor_0436_normalised +monitor/train/monitor_0308_normalised +monitor/train/monitor_0192_normalised +monitor/train/monitor_0401_normalised +monitor/train/monitor_0361_normalised +monitor/train/monitor_0416_normalised +monitor/train/monitor_0353_normalised +monitor/train/monitor_0400_normalised +monitor/train/monitor_0385_normalised +monitor/train/monitor_0396_normalised +monitor/train/monitor_0438_normalised +monitor/train/monitor_0437_normalised +monitor/train/monitor_0196_normalised +monitor/train/monitor_0220_normalised +monitor/train/monitor_0255_normalised +monitor/train/monitor_0254_normalised +monitor/train/monitor_0043_normalised +monitor/train/monitor_0295_normalised +monitor/train/monitor_0276_normalised +monitor/train/monitor_0211_normalised +monitor/train/monitor_0404_normalised +monitor/train/monitor_0346_normalised +monitor/train/monitor_0232_normalised +monitor/train/monitor_0091_normalised +monitor/train/monitor_0217_normalised +monitor/train/monitor_0392_normalised +monitor/train/monitor_0078_normalised +monitor/train/monitor_0284_normalised +monitor/train/monitor_0195_normalised +monitor/train/monitor_0104_normalised +monitor/train/monitor_0384_normalised +monitor/train/monitor_0083_normalised +monitor/train/monitor_0056_normalised +monitor/train/monitor_0303_normalised +monitor/train/monitor_0407_normalised +monitor/train/monitor_0134_normalised +monitor/train/monitor_0040_normalised +monitor/train/monitor_0030_normalised +monitor/train/monitor_0012_normalised +monitor/train/monitor_0329_normalised +monitor/train/monitor_0414_normalised +monitor/train/monitor_0181_normalised +monitor/train/monitor_0278_normalised +monitor/train/monitor_0355_normalised +monitor/train/monitor_0228_normalised +monitor/train/monitor_0343_normalised +monitor/train/monitor_0326_normalised +monitor/train/monitor_0203_normalised +monitor/train/monitor_0313_normalised +monitor/train/monitor_0065_normalised +monitor/train/monitor_0370_normalised +monitor/train/monitor_0130_normalised +monitor/train/monitor_0299_normalised +monitor/train/monitor_0175_normalised +monitor/train/monitor_0221_normalised +monitor/train/monitor_0268_normalised +monitor/train/monitor_0072_normalised +monitor/train/monitor_0344_normalised +monitor/train/monitor_0229_normalised +monitor/train/monitor_0264_normalised +monitor/train/monitor_0147_normalised +monitor/train/monitor_0011_normalised +monitor/train/monitor_0242_normalised +monitor/train/monitor_0391_normalised +monitor/train/monitor_0162_normalised +monitor/train/monitor_0212_normalised +monitor/train/monitor_0182_normalised +monitor/train/monitor_0033_normalised +monitor/train/monitor_0441_normalised +monitor/train/monitor_0410_normalised +monitor/train/monitor_0025_normalised +monitor/train/monitor_0003_normalised +monitor/train/monitor_0425_normalised +monitor/train/monitor_0305_normalised +monitor/train/monitor_0099_normalised +monitor/train/monitor_0178_normalised +monitor/train/monitor_0108_normalised +monitor/train/monitor_0095_normalised +monitor/train/monitor_0079_normalised +monitor/train/monitor_0357_normalised +monitor/train/monitor_0398_normalised +monitor/train/monitor_0183_normalised +monitor/train/monitor_0465_normalised +monitor/train/monitor_0216_normalised +monitor/train/monitor_0423_normalised +monitor/train/monitor_0209_normalised +monitor/train/monitor_0375_normalised +monitor/train/monitor_0016_normalised +monitor/train/monitor_0348_normalised +monitor/train/monitor_0265_normalised +monitor/train/monitor_0337_normalised +monitor/train/monitor_0397_normalised +monitor/train/monitor_0341_normalised +monitor/train/monitor_0019_normalised +monitor/train/monitor_0188_normalised +monitor/train/monitor_0390_normalised +monitor/train/monitor_0365_normalised +monitor/train/monitor_0057_normalised +monitor/train/monitor_0372_normalised +monitor/train/monitor_0283_normalised +monitor/train/monitor_0210_normalised +monitor/train/monitor_0376_normalised +monitor/train/monitor_0093_normalised +monitor/train/monitor_0378_normalised +monitor/train/monitor_0023_normalised +monitor/train/monitor_0262_normalised +monitor/train/monitor_0302_normalised +monitor/train/monitor_0098_normalised +monitor/train/monitor_0431_normalised +monitor/train/monitor_0389_normalised +monitor/train/monitor_0207_normalised +monitor/train/monitor_0120_normalised +monitor/train/monitor_0013_normalised +monitor/train/monitor_0176_normalised +monitor/train/monitor_0377_normalised +monitor/train/monitor_0296_normalised +monitor/train/monitor_0138_normalised +monitor/train/monitor_0185_normalised +monitor/train/monitor_0002_normalised +monitor/train/monitor_0027_normalised +monitor/train/monitor_0322_normalised +monitor/train/monitor_0292_normalised +monitor/train/monitor_0110_normalised +monitor/train/monitor_0109_normalised +monitor/train/monitor_0174_normalised +monitor/train/monitor_0238_normalised +monitor/train/monitor_0285_normalised +monitor/train/monitor_0330_normalised +monitor/train/monitor_0052_normalised +monitor/train/monitor_0227_normalised +monitor/train/monitor_0015_normalised +monitor/train/monitor_0077_normalised +monitor/train/monitor_0245_normalised +monitor/train/monitor_0289_normalised +monitor/train/monitor_0167_normalised +monitor/train/monitor_0269_normalised +monitor/train/monitor_0362_normalised +monitor/train/monitor_0155_normalised +monitor/train/monitor_0154_normalised +monitor/train/monitor_0359_normalised +monitor/train/monitor_0457_normalised +monitor/train/monitor_0428_normalised +monitor/train/monitor_0179_normalised +monitor/train/monitor_0415_normalised +monitor/train/monitor_0347_normalised +monitor/train/monitor_0395_normalised +monitor/train/monitor_0399_normalised +monitor/train/monitor_0170_normalised +monitor/train/monitor_0206_normalised +monitor/train/monitor_0270_normalised +monitor/train/monitor_0460_normalised +monitor/train/monitor_0084_normalised +monitor/train/monitor_0274_normalised +monitor/train/monitor_0446_normalised +monitor/train/monitor_0151_normalised +monitor/train/monitor_0369_normalised +monitor/train/monitor_0294_normalised +monitor/train/monitor_0252_normalised +monitor/train/monitor_0440_normalised +monitor/train/monitor_0168_normalised +monitor/train/monitor_0246_normalised +monitor/train/monitor_0314_normalised +monitor/train/monitor_0309_normalised +monitor/train/monitor_0038_normalised +monitor/train/monitor_0367_normalised +monitor/train/monitor_0454_normalised +monitor/train/monitor_0366_normalised +monitor/train/monitor_0146_normalised +monitor/train/monitor_0113_normalised +monitor/train/monitor_0135_normalised +monitor/train/monitor_0253_normalised +monitor/train/monitor_0371_normalised +monitor/train/monitor_0224_normalised +monitor/train/monitor_0311_normalised +monitor/train/monitor_0363_normalised +monitor/train/monitor_0402_normalised +monitor/train/monitor_0039_normalised +monitor/train/monitor_0251_normalised +monitor/train/monitor_0453_normalised +monitor/train/monitor_0304_normalised +monitor/train/monitor_0319_normalised +monitor/train/monitor_0197_normalised +monitor/train/monitor_0017_normalised +monitor/train/monitor_0408_normalised +monitor/train/monitor_0087_normalised +monitor/train/monitor_0048_normalised +monitor/train/monitor_0026_normalised +monitor/train/monitor_0462_normalised +monitor/train/monitor_0331_normalised +monitor/train/monitor_0101_normalised +monitor/train/monitor_0070_normalised +monitor/train/monitor_0218_normalised +monitor/train/monitor_0364_normalised +monitor/train/monitor_0150_normalised +monitor/train/monitor_0096_normalised +monitor/train/monitor_0421_normalised +monitor/train/monitor_0194_normalised +monitor/train/monitor_0261_normalised +monitor/train/monitor_0455_normalised +monitor/train/monitor_0230_normalised +monitor/train/monitor_0447_normalised +monitor/train/monitor_0122_normalised +monitor/train/monitor_0223_normalised +monitor/train/monitor_0379_normalised +monitor/train/monitor_0036_normalised +monitor/train/monitor_0006_normalised +monitor/train/monitor_0171_normalised +monitor/train/monitor_0044_normalised +monitor/train/monitor_0298_normalised +monitor/train/monitor_0464_normalised +monitor/train/monitor_0336_normalised +monitor/train/monitor_0007_normalised +monitor/train/monitor_0356_normalised +monitor/train/monitor_0118_normalised +monitor/train/monitor_0420_normalised +monitor/train/monitor_0433_normalised +monitor/train/monitor_0009_normalised +monitor/train/monitor_0047_normalised +monitor/train/monitor_0323_normalised +monitor/train/monitor_0193_normalised +monitor/train/monitor_0060_normalised +monitor/train/monitor_0198_normalised +monitor/train/monitor_0368_normalised +monitor/train/monitor_0327_normalised +monitor/train/monitor_0073_normalised +monitor/train/monitor_0119_normalised +monitor/train/monitor_0008_normalised +monitor/test/monitor_0536_normalised +monitor/test/monitor_0506_normalised +monitor/test/monitor_0559_normalised +monitor/test/monitor_0542_normalised +monitor/test/monitor_0513_normalised +monitor/test/monitor_0473_normalised +monitor/test/monitor_0550_normalised +monitor/test/monitor_0512_normalised +monitor/test/monitor_0507_normalised +monitor/test/monitor_0498_normalised +monitor/test/monitor_0471_normalised +monitor/test/monitor_0477_normalised +monitor/test/monitor_0468_normalised +monitor/test/monitor_0546_normalised +monitor/test/monitor_0472_normalised +monitor/test/monitor_0499_normalised +monitor/test/monitor_0562_normalised +monitor/test/monitor_0531_normalised +monitor/test/monitor_0530_normalised +monitor/test/monitor_0484_normalised +monitor/test/monitor_0482_normalised +monitor/test/monitor_0523_normalised +monitor/test/monitor_0485_normalised +monitor/test/monitor_0526_normalised +monitor/test/monitor_0491_normalised +monitor/test/monitor_0509_normalised +monitor/test/monitor_0493_normalised +monitor/test/monitor_0552_normalised +monitor/test/monitor_0527_normalised +monitor/test/monitor_0556_normalised +monitor/test/monitor_0502_normalised +monitor/test/monitor_0554_normalised +monitor/test/monitor_0541_normalised +monitor/test/monitor_0483_normalised +monitor/test/monitor_0545_normalised +monitor/test/monitor_0497_normalised +monitor/test/monitor_0480_normalised +monitor/test/monitor_0489_normalised +monitor/test/monitor_0476_normalised +monitor/test/monitor_0516_normalised +monitor/test/monitor_0486_normalised +monitor/test/monitor_0514_normalised +monitor/test/monitor_0520_normalised +monitor/test/monitor_0470_normalised +monitor/test/monitor_0558_normalised +monitor/test/monitor_0535_normalised +monitor/test/monitor_0495_normalised +monitor/test/monitor_0519_normalised +monitor/test/monitor_0511_normalised +monitor/test/monitor_0565_normalised +monitor/test/monitor_0518_normalised +monitor/test/monitor_0543_normalised +monitor/test/monitor_0479_normalised +monitor/test/monitor_0492_normalised +monitor/test/monitor_0553_normalised +monitor/test/monitor_0525_normalised +monitor/test/monitor_0533_normalised +monitor/test/monitor_0515_normalised +monitor/test/monitor_0538_normalised +monitor/test/monitor_0517_normalised +monitor/test/monitor_0487_normalised +monitor/test/monitor_0474_normalised +monitor/test/monitor_0557_normalised +monitor/test/monitor_0528_normalised +monitor/test/monitor_0547_normalised +monitor/test/monitor_0510_normalised +monitor/test/monitor_0539_normalised +monitor/test/monitor_0551_normalised +monitor/test/monitor_0540_normalised +monitor/test/monitor_0503_normalised +monitor/test/monitor_0488_normalised +monitor/test/monitor_0500_normalised +monitor/test/monitor_0544_normalised +monitor/test/monitor_0537_normalised +monitor/test/monitor_0501_normalised +monitor/test/monitor_0564_normalised +monitor/test/monitor_0522_normalised +monitor/test/monitor_0521_normalised +monitor/test/monitor_0548_normalised +monitor/test/monitor_0549_normalised +monitor/test/monitor_0475_normalised +monitor/test/monitor_0504_normalised +monitor/test/monitor_0524_normalised +monitor/test/monitor_0529_normalised +monitor/test/monitor_0469_normalised +monitor/test/monitor_0467_normalised +monitor/test/monitor_0560_normalised +monitor/test/monitor_0490_normalised +monitor/test/monitor_0505_normalised +monitor/test/monitor_0494_normalised +monitor/test/monitor_0466_normalised +monitor/test/monitor_0478_normalised +monitor/test/monitor_0496_normalised +monitor/test/monitor_0561_normalised +monitor/test/monitor_0481_normalised +monitor/test/monitor_0508_normalised +monitor/test/monitor_0555_normalised +monitor/test/monitor_0534_normalised +monitor/test/monitor_0532_normalised +monitor/test/monitor_0563_normalised +cone/train/cone_0084_normalised +cone/train/cone_0121_normalised +cone/train/cone_0017_normalised +cone/train/cone_0118_normalised +cone/train/cone_0147_normalised +cone/train/cone_0162_normalised +cone/train/cone_0141_normalised +cone/train/cone_0112_normalised +cone/train/cone_0167_normalised +cone/train/cone_0166_normalised +cone/train/cone_0119_normalised +cone/train/cone_0128_normalised +cone/train/cone_0050_normalised +cone/train/cone_0061_normalised +cone/train/cone_0014_normalised +cone/train/cone_0132_normalised +cone/train/cone_0103_normalised +cone/train/cone_0148_normalised +cone/train/cone_0060_normalised +cone/train/cone_0107_normalised +cone/train/cone_0042_normalised +cone/train/cone_0057_normalised +cone/train/cone_0041_normalised +cone/train/cone_0037_normalised +cone/train/cone_0055_normalised +cone/train/cone_0140_normalised +cone/train/cone_0159_normalised +cone/train/cone_0083_normalised +cone/train/cone_0086_normalised +cone/train/cone_0163_normalised +cone/train/cone_0016_normalised +cone/train/cone_0080_normalised +cone/train/cone_0040_normalised +cone/train/cone_0032_normalised +cone/train/cone_0097_normalised +cone/train/cone_0105_normalised +cone/train/cone_0150_normalised +cone/train/cone_0092_normalised +cone/train/cone_0048_normalised +cone/train/cone_0054_normalised +cone/train/cone_0106_normalised +cone/train/cone_0018_normalised +cone/train/cone_0089_normalised +cone/train/cone_0123_normalised +cone/train/cone_0051_normalised +cone/train/cone_0052_normalised +cone/train/cone_0033_normalised +cone/train/cone_0088_normalised +cone/train/cone_0028_normalised +cone/train/cone_0063_normalised +cone/train/cone_0143_normalised +cone/train/cone_0029_normalised +cone/train/cone_0144_normalised +cone/train/cone_0049_normalised +cone/train/cone_0134_normalised +cone/train/cone_0023_normalised +cone/train/cone_0066_normalised +cone/train/cone_0153_normalised +cone/train/cone_0021_normalised +cone/train/cone_0013_normalised +cone/train/cone_0098_normalised +cone/train/cone_0031_normalised +cone/train/cone_0120_normalised +cone/train/cone_0034_normalised +cone/train/cone_0043_normalised +cone/train/cone_0056_normalised +cone/train/cone_0068_normalised +cone/train/cone_0087_normalised +cone/train/cone_0161_normalised +cone/train/cone_0038_normalised +cone/train/cone_0093_normalised +cone/train/cone_0067_normalised +cone/train/cone_0076_normalised +cone/train/cone_0094_normalised +cone/train/cone_0136_normalised +cone/train/cone_0065_normalised +cone/train/cone_0026_normalised +cone/train/cone_0126_normalised +cone/train/cone_0149_normalised +cone/train/cone_0025_normalised +cone/train/cone_0122_normalised +cone/train/cone_0027_normalised +cone/train/cone_0006_normalised +cone/train/cone_0130_normalised +cone/train/cone_0059_normalised +cone/train/cone_0045_normalised +cone/train/cone_0079_normalised +cone/train/cone_0090_normalised +cone/train/cone_0104_normalised +cone/train/cone_0078_normalised +cone/train/cone_0070_normalised +cone/train/cone_0002_normalised +cone/train/cone_0010_normalised +cone/train/cone_0001_normalised +cone/train/cone_0091_normalised +cone/train/cone_0146_normalised +cone/train/cone_0101_normalised +cone/train/cone_0073_normalised +cone/train/cone_0155_normalised +cone/train/cone_0009_normalised +cone/train/cone_0062_normalised +cone/train/cone_0137_normalised +cone/train/cone_0005_normalised +cone/train/cone_0109_normalised +cone/train/cone_0110_normalised +cone/train/cone_0154_normalised +cone/train/cone_0053_normalised +cone/train/cone_0003_normalised +cone/train/cone_0035_normalised +cone/train/cone_0111_normalised +cone/train/cone_0139_normalised +cone/train/cone_0047_normalised +cone/train/cone_0125_normalised +cone/train/cone_0058_normalised +cone/train/cone_0075_normalised +cone/train/cone_0015_normalised +cone/train/cone_0072_normalised +cone/train/cone_0133_normalised +cone/train/cone_0007_normalised +cone/train/cone_0165_normalised +cone/train/cone_0036_normalised +cone/train/cone_0004_normalised +cone/train/cone_0164_normalised +cone/train/cone_0113_normalised +cone/train/cone_0082_normalised +cone/train/cone_0030_normalised +cone/train/cone_0145_normalised +cone/train/cone_0069_normalised +cone/train/cone_0129_normalised +cone/train/cone_0074_normalised +cone/train/cone_0081_normalised +cone/train/cone_0135_normalised +cone/train/cone_0046_normalised +cone/train/cone_0127_normalised +cone/train/cone_0100_normalised +cone/train/cone_0124_normalised +cone/train/cone_0108_normalised +cone/train/cone_0039_normalised +cone/train/cone_0115_normalised +cone/train/cone_0116_normalised +cone/train/cone_0102_normalised +cone/train/cone_0096_normalised +cone/train/cone_0085_normalised +cone/train/cone_0008_normalised +cone/train/cone_0114_normalised +cone/train/cone_0160_normalised +cone/train/cone_0019_normalised +cone/train/cone_0020_normalised +cone/train/cone_0152_normalised +cone/train/cone_0117_normalised +cone/train/cone_0158_normalised +cone/train/cone_0077_normalised +cone/train/cone_0131_normalised +cone/train/cone_0138_normalised +cone/train/cone_0151_normalised +cone/train/cone_0012_normalised +cone/train/cone_0044_normalised +cone/train/cone_0099_normalised +cone/train/cone_0022_normalised +cone/train/cone_0064_normalised +cone/train/cone_0157_normalised +cone/train/cone_0011_normalised +cone/train/cone_0142_normalised +cone/train/cone_0024_normalised +cone/train/cone_0095_normalised +cone/train/cone_0071_normalised +cone/train/cone_0156_normalised +cone/test/cone_0178_normalised +cone/test/cone_0172_normalised +cone/test/cone_0173_normalised +cone/test/cone_0171_normalised +cone/test/cone_0185_normalised +cone/test/cone_0168_normalised +cone/test/cone_0186_normalised +cone/test/cone_0175_normalised +cone/test/cone_0187_normalised +cone/test/cone_0174_normalised +cone/test/cone_0177_normalised +cone/test/cone_0183_normalised +cone/test/cone_0179_normalised +cone/test/cone_0181_normalised +cone/test/cone_0180_normalised +cone/test/cone_0176_normalised +cone/test/cone_0184_normalised +cone/test/cone_0182_normalised +cone/test/cone_0169_normalised +cone/test/cone_0170_normalised +piano/train/piano_0139_normalised +piano/train/piano_0122_normalised +piano/train/piano_0004_normalised +piano/train/piano_0003_normalised +piano/train/piano_0115_normalised +piano/train/piano_0117_normalised +piano/train/piano_0184_normalised +piano/train/piano_0062_normalised +piano/train/piano_0098_normalised +piano/train/piano_0045_normalised +piano/train/piano_0221_normalised +piano/train/piano_0227_normalised +piano/train/piano_0224_normalised +piano/train/piano_0130_normalised +piano/train/piano_0136_normalised +piano/train/piano_0075_normalised +piano/train/piano_0015_normalised +piano/train/piano_0168_normalised +piano/train/piano_0048_normalised +piano/train/piano_0101_normalised +piano/train/piano_0171_normalised +piano/train/piano_0203_normalised +piano/train/piano_0135_normalised +piano/train/piano_0215_normalised +piano/train/piano_0206_normalised +piano/train/piano_0167_normalised +piano/train/piano_0088_normalised +piano/train/piano_0005_normalised +piano/train/piano_0137_normalised +piano/train/piano_0060_normalised +piano/train/piano_0047_normalised +piano/train/piano_0163_normalised +piano/train/piano_0159_normalised +piano/train/piano_0046_normalised +piano/train/piano_0185_normalised +piano/train/piano_0176_normalised +piano/train/piano_0020_normalised +piano/train/piano_0077_normalised +piano/train/piano_0129_normalised +piano/train/piano_0002_normalised +piano/train/piano_0140_normalised +piano/train/piano_0051_normalised +piano/train/piano_0052_normalised +piano/train/piano_0170_normalised +piano/train/piano_0123_normalised +piano/train/piano_0065_normalised +piano/train/piano_0126_normalised +piano/train/piano_0009_normalised +piano/train/piano_0111_normalised +piano/train/piano_0012_normalised +piano/train/piano_0109_normalised +piano/train/piano_0008_normalised +piano/train/piano_0090_normalised +piano/train/piano_0013_normalised +piano/train/piano_0225_normalised +piano/train/piano_0084_normalised +piano/train/piano_0202_normalised +piano/train/piano_0162_normalised +piano/train/piano_0076_normalised +piano/train/piano_0174_normalised +piano/train/piano_0128_normalised +piano/train/piano_0106_normalised +piano/train/piano_0169_normalised +piano/train/piano_0161_normalised +piano/train/piano_0016_normalised +piano/train/piano_0138_normalised +piano/train/piano_0056_normalised +piano/train/piano_0131_normalised +piano/train/piano_0007_normalised +piano/train/piano_0041_normalised +piano/train/piano_0053_normalised +piano/train/piano_0193_normalised +piano/train/piano_0034_normalised +piano/train/piano_0160_normalised +piano/train/piano_0144_normalised +piano/train/piano_0067_normalised +piano/train/piano_0023_normalised +piano/train/piano_0081_normalised +piano/train/piano_0156_normalised +piano/train/piano_0042_normalised +piano/train/piano_0145_normalised +piano/train/piano_0212_normalised +piano/train/piano_0173_normalised +piano/train/piano_0142_normalised +piano/train/piano_0116_normalised +piano/train/piano_0022_normalised +piano/train/piano_0208_normalised +piano/train/piano_0014_normalised +piano/train/piano_0229_normalised +piano/train/piano_0124_normalised +piano/train/piano_0112_normalised +piano/train/piano_0228_normalised +piano/train/piano_0019_normalised +piano/train/piano_0057_normalised +piano/train/piano_0149_normalised +piano/train/piano_0061_normalised +piano/train/piano_0150_normalised +piano/train/piano_0165_normalised +piano/train/piano_0092_normalised +piano/train/piano_0134_normalised +piano/train/piano_0172_normalised +piano/train/piano_0018_normalised +piano/train/piano_0213_normalised +piano/train/piano_0113_normalised +piano/train/piano_0079_normalised +piano/train/piano_0209_normalised +piano/train/piano_0082_normalised +piano/train/piano_0189_normalised +piano/train/piano_0103_normalised +piano/train/piano_0100_normalised +piano/train/piano_0155_normalised +piano/train/piano_0063_normalised +piano/train/piano_0073_normalised +piano/train/piano_0039_normalised +piano/train/piano_0044_normalised +piano/train/piano_0205_normalised +piano/train/piano_0070_normalised +piano/train/piano_0151_normalised +piano/train/piano_0217_normalised +piano/train/piano_0141_normalised +piano/train/piano_0231_normalised +piano/train/piano_0078_normalised +piano/train/piano_0099_normalised +piano/train/piano_0180_normalised +piano/train/piano_0119_normalised +piano/train/piano_0219_normalised +piano/train/piano_0154_normalised +piano/train/piano_0210_normalised +piano/train/piano_0001_normalised +piano/train/piano_0181_normalised +piano/train/piano_0083_normalised +piano/train/piano_0146_normalised +piano/train/piano_0031_normalised +piano/train/piano_0199_normalised +piano/train/piano_0021_normalised +piano/train/piano_0096_normalised +piano/train/piano_0069_normalised +piano/train/piano_0035_normalised +piano/train/piano_0179_normalised +piano/train/piano_0214_normalised +piano/train/piano_0158_normalised +piano/train/piano_0108_normalised +piano/train/piano_0166_normalised +piano/train/piano_0105_normalised +piano/train/piano_0107_normalised +piano/train/piano_0094_normalised +piano/train/piano_0091_normalised +piano/train/piano_0192_normalised +piano/train/piano_0133_normalised +piano/train/piano_0074_normalised +piano/train/piano_0049_normalised +piano/train/piano_0072_normalised +piano/train/piano_0071_normalised +piano/train/piano_0147_normalised +piano/train/piano_0029_normalised +piano/train/piano_0152_normalised +piano/train/piano_0037_normalised +piano/train/piano_0043_normalised +piano/train/piano_0087_normalised +piano/train/piano_0204_normalised +piano/train/piano_0207_normalised +piano/train/piano_0085_normalised +piano/train/piano_0038_normalised +piano/train/piano_0095_normalised +piano/train/piano_0006_normalised +piano/train/piano_0068_normalised +piano/train/piano_0177_normalised +piano/train/piano_0183_normalised +piano/train/piano_0190_normalised +piano/train/piano_0157_normalised +piano/train/piano_0032_normalised +piano/train/piano_0194_normalised +piano/train/piano_0050_normalised +piano/train/piano_0110_normalised +piano/train/piano_0196_normalised +piano/train/piano_0195_normalised +piano/train/piano_0027_normalised +piano/train/piano_0187_normalised +piano/train/piano_0223_normalised +piano/train/piano_0030_normalised +piano/train/piano_0114_normalised +piano/train/piano_0127_normalised +piano/train/piano_0143_normalised +piano/train/piano_0188_normalised +piano/train/piano_0200_normalised +piano/train/piano_0125_normalised +piano/train/piano_0104_normalised +piano/train/piano_0132_normalised +piano/train/piano_0024_normalised +piano/train/piano_0121_normalised +piano/train/piano_0080_normalised +piano/train/piano_0097_normalised +piano/train/piano_0026_normalised +piano/train/piano_0040_normalised +piano/train/piano_0201_normalised +piano/train/piano_0182_normalised +piano/train/piano_0175_normalised +piano/train/piano_0153_normalised +piano/train/piano_0059_normalised +piano/train/piano_0120_normalised +piano/train/piano_0033_normalised +piano/train/piano_0064_normalised +piano/train/piano_0066_normalised +piano/train/piano_0028_normalised +piano/train/piano_0010_normalised +piano/train/piano_0178_normalised +piano/train/piano_0191_normalised +piano/train/piano_0054_normalised +piano/train/piano_0102_normalised +piano/train/piano_0055_normalised +piano/train/piano_0025_normalised +piano/train/piano_0220_normalised +piano/train/piano_0211_normalised +piano/train/piano_0086_normalised +piano/train/piano_0148_normalised +piano/train/piano_0222_normalised +piano/train/piano_0198_normalised +piano/train/piano_0230_normalised +piano/train/piano_0216_normalised +piano/train/piano_0186_normalised +piano/train/piano_0118_normalised +piano/train/piano_0036_normalised +piano/train/piano_0011_normalised +piano/train/piano_0089_normalised +piano/train/piano_0197_normalised +piano/train/piano_0017_normalised +piano/train/piano_0093_normalised +piano/train/piano_0226_normalised +piano/train/piano_0058_normalised +piano/train/piano_0218_normalised +piano/train/piano_0164_normalised +piano/test/piano_0282_normalised +piano/test/piano_0328_normalised +piano/test/piano_0234_normalised +piano/test/piano_0317_normalised +piano/test/piano_0295_normalised +piano/test/piano_0281_normalised +piano/test/piano_0302_normalised +piano/test/piano_0258_normalised +piano/test/piano_0287_normalised +piano/test/piano_0267_normalised +piano/test/piano_0293_normalised +piano/test/piano_0253_normalised +piano/test/piano_0313_normalised +piano/test/piano_0326_normalised +piano/test/piano_0299_normalised +piano/test/piano_0278_normalised +piano/test/piano_0312_normalised +piano/test/piano_0248_normalised +piano/test/piano_0314_normalised +piano/test/piano_0305_normalised +piano/test/piano_0320_normalised +piano/test/piano_0310_normalised +piano/test/piano_0241_normalised +piano/test/piano_0296_normalised +piano/test/piano_0284_normalised +piano/test/piano_0270_normalised +piano/test/piano_0297_normalised +piano/test/piano_0307_normalised +piano/test/piano_0294_normalised +piano/test/piano_0243_normalised +piano/test/piano_0247_normalised +piano/test/piano_0285_normalised +piano/test/piano_0286_normalised +piano/test/piano_0323_normalised +piano/test/piano_0275_normalised +piano/test/piano_0260_normalised +piano/test/piano_0252_normalised +piano/test/piano_0259_normalised +piano/test/piano_0311_normalised +piano/test/piano_0239_normalised +piano/test/piano_0290_normalised +piano/test/piano_0322_normalised +piano/test/piano_0262_normalised +piano/test/piano_0318_normalised +piano/test/piano_0265_normalised +piano/test/piano_0233_normalised +piano/test/piano_0232_normalised +piano/test/piano_0254_normalised +piano/test/piano_0246_normalised +piano/test/piano_0292_normalised +piano/test/piano_0288_normalised +piano/test/piano_0303_normalised +piano/test/piano_0263_normalised +piano/test/piano_0236_normalised +piano/test/piano_0264_normalised +piano/test/piano_0316_normalised +piano/test/piano_0325_normalised +piano/test/piano_0250_normalised +piano/test/piano_0283_normalised +piano/test/piano_0272_normalised +piano/test/piano_0315_normalised +piano/test/piano_0245_normalised +piano/test/piano_0321_normalised +piano/test/piano_0319_normalised +piano/test/piano_0255_normalised +piano/test/piano_0276_normalised +piano/test/piano_0331_normalised +piano/test/piano_0309_normalised +piano/test/piano_0327_normalised +piano/test/piano_0257_normalised +piano/test/piano_0242_normalised +piano/test/piano_0240_normalised +piano/test/piano_0269_normalised +piano/test/piano_0268_normalised +piano/test/piano_0280_normalised +piano/test/piano_0244_normalised +piano/test/piano_0289_normalised +piano/test/piano_0300_normalised +piano/test/piano_0279_normalised +piano/test/piano_0251_normalised +piano/test/piano_0256_normalised +piano/test/piano_0274_normalised +piano/test/piano_0249_normalised +piano/test/piano_0324_normalised +piano/test/piano_0237_normalised +piano/test/piano_0261_normalised +piano/test/piano_0238_normalised +piano/test/piano_0291_normalised +piano/test/piano_0330_normalised +piano/test/piano_0298_normalised +piano/test/piano_0277_normalised +piano/test/piano_0271_normalised +piano/test/piano_0273_normalised +piano/test/piano_0266_normalised +piano/test/piano_0304_normalised +piano/test/piano_0306_normalised +piano/test/piano_0301_normalised +piano/test/piano_0308_normalised +piano/test/piano_0329_normalised +piano/test/piano_0235_normalised +keyboard/train/keyboard_0122_normalised +keyboard/train/keyboard_0144_normalised +keyboard/train/keyboard_0143_normalised +keyboard/train/keyboard_0130_normalised +keyboard/train/keyboard_0071_normalised +keyboard/train/keyboard_0014_normalised +keyboard/train/keyboard_0021_normalised +keyboard/train/keyboard_0125_normalised +keyboard/train/keyboard_0103_normalised +keyboard/train/keyboard_0032_normalised +keyboard/train/keyboard_0061_normalised +keyboard/train/keyboard_0015_normalised +keyboard/train/keyboard_0054_normalised +keyboard/train/keyboard_0006_normalised +keyboard/train/keyboard_0069_normalised +keyboard/train/keyboard_0104_normalised +keyboard/train/keyboard_0093_normalised +keyboard/train/keyboard_0034_normalised +keyboard/train/keyboard_0051_normalised +keyboard/train/keyboard_0057_normalised +keyboard/train/keyboard_0120_normalised +keyboard/train/keyboard_0058_normalised +keyboard/train/keyboard_0074_normalised +keyboard/train/keyboard_0090_normalised +keyboard/train/keyboard_0095_normalised +keyboard/train/keyboard_0113_normalised +keyboard/train/keyboard_0097_normalised +keyboard/train/keyboard_0042_normalised +keyboard/train/keyboard_0003_normalised +keyboard/train/keyboard_0001_normalised +keyboard/train/keyboard_0128_normalised +keyboard/train/keyboard_0108_normalised +keyboard/train/keyboard_0009_normalised +keyboard/train/keyboard_0065_normalised +keyboard/train/keyboard_0138_normalised +keyboard/train/keyboard_0029_normalised +keyboard/train/keyboard_0088_normalised +keyboard/train/keyboard_0127_normalised +keyboard/train/keyboard_0012_normalised +keyboard/train/keyboard_0041_normalised +keyboard/train/keyboard_0081_normalised +keyboard/train/keyboard_0022_normalised +keyboard/train/keyboard_0089_normalised +keyboard/train/keyboard_0115_normalised +keyboard/train/keyboard_0075_normalised +keyboard/train/keyboard_0076_normalised +keyboard/train/keyboard_0017_normalised +keyboard/train/keyboard_0100_normalised +keyboard/train/keyboard_0101_normalised +keyboard/train/keyboard_0141_normalised +keyboard/train/keyboard_0142_normalised +keyboard/train/keyboard_0023_normalised +keyboard/train/keyboard_0027_normalised +keyboard/train/keyboard_0136_normalised +keyboard/train/keyboard_0094_normalised +keyboard/train/keyboard_0039_normalised +keyboard/train/keyboard_0018_normalised +keyboard/train/keyboard_0082_normalised +keyboard/train/keyboard_0020_normalised +keyboard/train/keyboard_0109_normalised +keyboard/train/keyboard_0112_normalised +keyboard/train/keyboard_0077_normalised +keyboard/train/keyboard_0055_normalised +keyboard/train/keyboard_0086_normalised +keyboard/train/keyboard_0121_normalised +keyboard/train/keyboard_0035_normalised +keyboard/train/keyboard_0028_normalised +keyboard/train/keyboard_0053_normalised +keyboard/train/keyboard_0005_normalised +keyboard/train/keyboard_0080_normalised +keyboard/train/keyboard_0126_normalised +keyboard/train/keyboard_0016_normalised +keyboard/train/keyboard_0117_normalised +keyboard/train/keyboard_0132_normalised +keyboard/train/keyboard_0083_normalised +keyboard/train/keyboard_0114_normalised +keyboard/train/keyboard_0040_normalised +keyboard/train/keyboard_0107_normalised +keyboard/train/keyboard_0106_normalised +keyboard/train/keyboard_0131_normalised +keyboard/train/keyboard_0079_normalised +keyboard/train/keyboard_0102_normalised +keyboard/train/keyboard_0073_normalised +keyboard/train/keyboard_0048_normalised +keyboard/train/keyboard_0066_normalised +keyboard/train/keyboard_0026_normalised +keyboard/train/keyboard_0092_normalised +keyboard/train/keyboard_0031_normalised +keyboard/train/keyboard_0099_normalised +keyboard/train/keyboard_0024_normalised +keyboard/train/keyboard_0110_normalised +keyboard/train/keyboard_0011_normalised +keyboard/train/keyboard_0137_normalised +keyboard/train/keyboard_0105_normalised +keyboard/train/keyboard_0134_normalised +keyboard/train/keyboard_0067_normalised +keyboard/train/keyboard_0129_normalised +keyboard/train/keyboard_0052_normalised +keyboard/train/keyboard_0133_normalised +keyboard/train/keyboard_0119_normalised +keyboard/train/keyboard_0004_normalised +keyboard/train/keyboard_0084_normalised +keyboard/train/keyboard_0013_normalised +keyboard/train/keyboard_0118_normalised +keyboard/train/keyboard_0096_normalised +keyboard/train/keyboard_0025_normalised +keyboard/train/keyboard_0038_normalised +keyboard/train/keyboard_0043_normalised +keyboard/train/keyboard_0145_normalised +keyboard/train/keyboard_0068_normalised +keyboard/train/keyboard_0036_normalised +keyboard/train/keyboard_0087_normalised +keyboard/train/keyboard_0008_normalised +keyboard/train/keyboard_0123_normalised +keyboard/train/keyboard_0046_normalised +keyboard/train/keyboard_0030_normalised +keyboard/train/keyboard_0019_normalised +keyboard/train/keyboard_0060_normalised +keyboard/train/keyboard_0072_normalised +keyboard/train/keyboard_0085_normalised +keyboard/train/keyboard_0010_normalised +keyboard/train/keyboard_0135_normalised +keyboard/train/keyboard_0063_normalised +keyboard/train/keyboard_0007_normalised +keyboard/train/keyboard_0056_normalised +keyboard/train/keyboard_0064_normalised +keyboard/train/keyboard_0091_normalised +keyboard/train/keyboard_0033_normalised +keyboard/train/keyboard_0044_normalised +keyboard/train/keyboard_0070_normalised +keyboard/train/keyboard_0111_normalised +keyboard/train/keyboard_0050_normalised +keyboard/train/keyboard_0047_normalised +keyboard/train/keyboard_0140_normalised +keyboard/train/keyboard_0078_normalised +keyboard/train/keyboard_0059_normalised +keyboard/train/keyboard_0139_normalised +keyboard/train/keyboard_0037_normalised +keyboard/train/keyboard_0062_normalised +keyboard/train/keyboard_0116_normalised +keyboard/train/keyboard_0049_normalised +keyboard/train/keyboard_0045_normalised +keyboard/train/keyboard_0124_normalised +keyboard/train/keyboard_0002_normalised +keyboard/train/keyboard_0098_normalised +keyboard/test/keyboard_0158_normalised +keyboard/test/keyboard_0165_normalised +keyboard/test/keyboard_0157_normalised +keyboard/test/keyboard_0160_normalised +keyboard/test/keyboard_0150_normalised +keyboard/test/keyboard_0151_normalised +keyboard/test/keyboard_0163_normalised +keyboard/test/keyboard_0153_normalised +keyboard/test/keyboard_0162_normalised +keyboard/test/keyboard_0152_normalised +keyboard/test/keyboard_0155_normalised +keyboard/test/keyboard_0164_normalised +keyboard/test/keyboard_0146_normalised +keyboard/test/keyboard_0161_normalised +keyboard/test/keyboard_0149_normalised +keyboard/test/keyboard_0159_normalised +keyboard/test/keyboard_0156_normalised +keyboard/test/keyboard_0154_normalised +keyboard/test/keyboard_0147_normalised +keyboard/test/keyboard_0148_normalised +guitar/train/guitar_0127_normalised +guitar/train/guitar_0073_normalised +guitar/train/guitar_0063_normalised +guitar/train/guitar_0016_normalised +guitar/train/guitar_0029_normalised +guitar/train/guitar_0109_normalised +guitar/train/guitar_0039_normalised +guitar/train/guitar_0065_normalised +guitar/train/guitar_0035_normalised +guitar/train/guitar_0096_normalised +guitar/train/guitar_0111_normalised +guitar/train/guitar_0137_normalised +guitar/train/guitar_0069_normalised +guitar/train/guitar_0125_normalised +guitar/train/guitar_0026_normalised +guitar/train/guitar_0116_normalised +guitar/train/guitar_0133_normalised +guitar/train/guitar_0086_normalised +guitar/train/guitar_0041_normalised +guitar/train/guitar_0151_normalised +guitar/train/guitar_0131_normalised +guitar/train/guitar_0130_normalised +guitar/train/guitar_0018_normalised +guitar/train/guitar_0019_normalised +guitar/train/guitar_0152_normalised +guitar/train/guitar_0036_normalised +guitar/train/guitar_0107_normalised +guitar/train/guitar_0059_normalised +guitar/train/guitar_0044_normalised +guitar/train/guitar_0033_normalised +guitar/train/guitar_0129_normalised +guitar/train/guitar_0141_normalised +guitar/train/guitar_0061_normalised +guitar/train/guitar_0022_normalised +guitar/train/guitar_0046_normalised +guitar/train/guitar_0034_normalised +guitar/train/guitar_0124_normalised +guitar/train/guitar_0020_normalised +guitar/train/guitar_0089_normalised +guitar/train/guitar_0082_normalised +guitar/train/guitar_0045_normalised +guitar/train/guitar_0012_normalised +guitar/train/guitar_0114_normalised +guitar/train/guitar_0076_normalised +guitar/train/guitar_0098_normalised +guitar/train/guitar_0083_normalised +guitar/train/guitar_0060_normalised +guitar/train/guitar_0055_normalised +guitar/train/guitar_0027_normalised +guitar/train/guitar_0110_normalised +guitar/train/guitar_0074_normalised +guitar/train/guitar_0101_normalised +guitar/train/guitar_0052_normalised +guitar/train/guitar_0150_normalised +guitar/train/guitar_0084_normalised +guitar/train/guitar_0139_normalised +guitar/train/guitar_0108_normalised +guitar/train/guitar_0138_normalised +guitar/train/guitar_0104_normalised +guitar/train/guitar_0062_normalised +guitar/train/guitar_0153_normalised +guitar/train/guitar_0068_normalised +guitar/train/guitar_0093_normalised +guitar/train/guitar_0066_normalised +guitar/train/guitar_0140_normalised +guitar/train/guitar_0117_normalised +guitar/train/guitar_0080_normalised +guitar/train/guitar_0067_normalised +guitar/train/guitar_0128_normalised +guitar/train/guitar_0103_normalised +guitar/train/guitar_0023_normalised +guitar/train/guitar_0113_normalised +guitar/train/guitar_0070_normalised +guitar/train/guitar_0054_normalised +guitar/train/guitar_0079_normalised +guitar/train/guitar_0006_normalised +guitar/train/guitar_0088_normalised +guitar/train/guitar_0031_normalised +guitar/train/guitar_0105_normalised +guitar/train/guitar_0040_normalised +guitar/train/guitar_0090_normalised +guitar/train/guitar_0102_normalised +guitar/train/guitar_0147_normalised +guitar/train/guitar_0038_normalised +guitar/train/guitar_0025_normalised +guitar/train/guitar_0043_normalised +guitar/train/guitar_0094_normalised +guitar/train/guitar_0028_normalised +guitar/train/guitar_0119_normalised +guitar/train/guitar_0011_normalised +guitar/train/guitar_0009_normalised +guitar/train/guitar_0072_normalised +guitar/train/guitar_0132_normalised +guitar/train/guitar_0053_normalised +guitar/train/guitar_0120_normalised +guitar/train/guitar_0142_normalised +guitar/train/guitar_0135_normalised +guitar/train/guitar_0097_normalised +guitar/train/guitar_0148_normalised +guitar/train/guitar_0099_normalised +guitar/train/guitar_0001_normalised +guitar/train/guitar_0030_normalised +guitar/train/guitar_0136_normalised +guitar/train/guitar_0056_normalised +guitar/train/guitar_0047_normalised +guitar/train/guitar_0021_normalised +guitar/train/guitar_0014_normalised +guitar/train/guitar_0095_normalised +guitar/train/guitar_0051_normalised +guitar/train/guitar_0057_normalised +guitar/train/guitar_0017_normalised +guitar/train/guitar_0007_normalised +guitar/train/guitar_0005_normalised +guitar/train/guitar_0049_normalised +guitar/train/guitar_0048_normalised +guitar/train/guitar_0003_normalised +guitar/train/guitar_0024_normalised +guitar/train/guitar_0075_normalised +guitar/train/guitar_0126_normalised +guitar/train/guitar_0078_normalised +guitar/train/guitar_0092_normalised +guitar/train/guitar_0002_normalised +guitar/train/guitar_0085_normalised +guitar/train/guitar_0154_normalised +guitar/train/guitar_0112_normalised +guitar/train/guitar_0058_normalised +guitar/train/guitar_0010_normalised +guitar/train/guitar_0122_normalised +guitar/train/guitar_0123_normalised +guitar/train/guitar_0032_normalised +guitar/train/guitar_0064_normalised +guitar/train/guitar_0008_normalised +guitar/train/guitar_0143_normalised +guitar/train/guitar_0037_normalised +guitar/train/guitar_0004_normalised +guitar/train/guitar_0146_normalised +guitar/train/guitar_0050_normalised +guitar/train/guitar_0106_normalised +guitar/train/guitar_0118_normalised +guitar/train/guitar_0145_normalised +guitar/train/guitar_0015_normalised +guitar/train/guitar_0081_normalised +guitar/train/guitar_0013_normalised +guitar/train/guitar_0100_normalised +guitar/train/guitar_0115_normalised +guitar/train/guitar_0144_normalised +guitar/train/guitar_0077_normalised +guitar/train/guitar_0121_normalised +guitar/train/guitar_0071_normalised +guitar/train/guitar_0134_normalised +guitar/train/guitar_0155_normalised +guitar/train/guitar_0087_normalised +guitar/train/guitar_0042_normalised +guitar/train/guitar_0149_normalised +guitar/train/guitar_0091_normalised +guitar/test/guitar_0161_normalised +guitar/test/guitar_0204_normalised +guitar/test/guitar_0169_normalised +guitar/test/guitar_0197_normalised +guitar/test/guitar_0202_normalised +guitar/test/guitar_0215_normalised +guitar/test/guitar_0242_normalised +guitar/test/guitar_0244_normalised +guitar/test/guitar_0222_normalised +guitar/test/guitar_0175_normalised +guitar/test/guitar_0214_normalised +guitar/test/guitar_0190_normalised +guitar/test/guitar_0201_normalised +guitar/test/guitar_0246_normalised +guitar/test/guitar_0164_normalised +guitar/test/guitar_0213_normalised +guitar/test/guitar_0228_normalised +guitar/test/guitar_0173_normalised +guitar/test/guitar_0207_normalised +guitar/test/guitar_0248_normalised +guitar/test/guitar_0189_normalised +guitar/test/guitar_0192_normalised +guitar/test/guitar_0255_normalised +guitar/test/guitar_0177_normalised +guitar/test/guitar_0251_normalised +guitar/test/guitar_0182_normalised +guitar/test/guitar_0188_normalised +guitar/test/guitar_0157_normalised +guitar/test/guitar_0212_normalised +guitar/test/guitar_0176_normalised +guitar/test/guitar_0162_normalised +guitar/test/guitar_0241_normalised +guitar/test/guitar_0236_normalised +guitar/test/guitar_0240_normalised +guitar/test/guitar_0219_normalised +guitar/test/guitar_0250_normalised +guitar/test/guitar_0171_normalised +guitar/test/guitar_0167_normalised +guitar/test/guitar_0184_normalised +guitar/test/guitar_0218_normalised +guitar/test/guitar_0245_normalised +guitar/test/guitar_0234_normalised +guitar/test/guitar_0174_normalised +guitar/test/guitar_0224_normalised +guitar/test/guitar_0205_normalised +guitar/test/guitar_0196_normalised +guitar/test/guitar_0217_normalised +guitar/test/guitar_0203_normalised +guitar/test/guitar_0230_normalised +guitar/test/guitar_0195_normalised +guitar/test/guitar_0249_normalised +guitar/test/guitar_0226_normalised +guitar/test/guitar_0183_normalised +guitar/test/guitar_0229_normalised +guitar/test/guitar_0252_normalised +guitar/test/guitar_0194_normalised +guitar/test/guitar_0238_normalised +guitar/test/guitar_0247_normalised +guitar/test/guitar_0199_normalised +guitar/test/guitar_0227_normalised +guitar/test/guitar_0209_normalised +guitar/test/guitar_0186_normalised +guitar/test/guitar_0216_normalised +guitar/test/guitar_0159_normalised +guitar/test/guitar_0200_normalised +guitar/test/guitar_0232_normalised +guitar/test/guitar_0172_normalised +guitar/test/guitar_0233_normalised +guitar/test/guitar_0163_normalised +guitar/test/guitar_0225_normalised +guitar/test/guitar_0231_normalised +guitar/test/guitar_0243_normalised +guitar/test/guitar_0170_normalised +guitar/test/guitar_0156_normalised +guitar/test/guitar_0220_normalised +guitar/test/guitar_0179_normalised +guitar/test/guitar_0239_normalised +guitar/test/guitar_0191_normalised +guitar/test/guitar_0254_normalised +guitar/test/guitar_0168_normalised +guitar/test/guitar_0198_normalised +guitar/test/guitar_0158_normalised +guitar/test/guitar_0206_normalised +guitar/test/guitar_0210_normalised +guitar/test/guitar_0208_normalised +guitar/test/guitar_0160_normalised +guitar/test/guitar_0178_normalised +guitar/test/guitar_0193_normalised +guitar/test/guitar_0185_normalised +guitar/test/guitar_0165_normalised +guitar/test/guitar_0221_normalised +guitar/test/guitar_0235_normalised +guitar/test/guitar_0223_normalised +guitar/test/guitar_0253_normalised +guitar/test/guitar_0187_normalised +guitar/test/guitar_0180_normalised +guitar/test/guitar_0181_normalised +guitar/test/guitar_0211_normalised +guitar/test/guitar_0166_normalised +guitar/test/guitar_0237_normalised +night_stand/train/night_stand_0163_normalised +night_stand/train/night_stand_0065_normalised +night_stand/train/night_stand_0069_normalised +night_stand/train/night_stand_0091_normalised +night_stand/train/night_stand_0067_normalised +night_stand/train/night_stand_0096_normalised +night_stand/train/night_stand_0129_normalised +night_stand/train/night_stand_0119_normalised +night_stand/train/night_stand_0095_normalised +night_stand/train/night_stand_0099_normalised +night_stand/train/night_stand_0110_normalised +night_stand/train/night_stand_0032_normalised +night_stand/train/night_stand_0183_normalised +night_stand/train/night_stand_0117_normalised +night_stand/train/night_stand_0134_normalised +night_stand/train/night_stand_0013_normalised +night_stand/train/night_stand_0145_normalised +night_stand/train/night_stand_0061_normalised +night_stand/train/night_stand_0177_normalised +night_stand/train/night_stand_0189_normalised +night_stand/train/night_stand_0175_normalised +night_stand/train/night_stand_0044_normalised +night_stand/train/night_stand_0004_normalised +night_stand/train/night_stand_0072_normalised +night_stand/train/night_stand_0015_normalised +night_stand/train/night_stand_0098_normalised +night_stand/train/night_stand_0086_normalised +night_stand/train/night_stand_0042_normalised +night_stand/train/night_stand_0041_normalised +night_stand/train/night_stand_0146_normalised +night_stand/train/night_stand_0006_normalised +night_stand/train/night_stand_0008_normalised +night_stand/train/night_stand_0046_normalised +night_stand/train/night_stand_0023_normalised +night_stand/train/night_stand_0172_normalised +night_stand/train/night_stand_0026_normalised +night_stand/train/night_stand_0007_normalised +night_stand/train/night_stand_0150_normalised +night_stand/train/night_stand_0100_normalised +night_stand/train/night_stand_0194_normalised +night_stand/train/night_stand_0155_normalised +night_stand/train/night_stand_0076_normalised +night_stand/train/night_stand_0154_normalised +night_stand/train/night_stand_0143_normalised +night_stand/train/night_stand_0149_normalised +night_stand/train/night_stand_0003_normalised +night_stand/train/night_stand_0055_normalised +night_stand/train/night_stand_0137_normalised +night_stand/train/night_stand_0171_normalised +night_stand/train/night_stand_0123_normalised +night_stand/train/night_stand_0002_normalised +night_stand/train/night_stand_0071_normalised +night_stand/train/night_stand_0092_normalised +night_stand/train/night_stand_0011_normalised +night_stand/train/night_stand_0084_normalised +night_stand/train/night_stand_0197_normalised +night_stand/train/night_stand_0118_normalised +night_stand/train/night_stand_0130_normalised +night_stand/train/night_stand_0187_normalised +night_stand/train/night_stand_0186_normalised +night_stand/train/night_stand_0038_normalised +night_stand/train/night_stand_0153_normalised +night_stand/train/night_stand_0120_normalised +night_stand/train/night_stand_0102_normalised +night_stand/train/night_stand_0126_normalised +night_stand/train/night_stand_0020_normalised +night_stand/train/night_stand_0115_normalised +night_stand/train/night_stand_0090_normalised +night_stand/train/night_stand_0162_normalised +night_stand/train/night_stand_0089_normalised +night_stand/train/night_stand_0063_normalised +night_stand/train/night_stand_0082_normalised +night_stand/train/night_stand_0027_normalised +night_stand/train/night_stand_0124_normalised +night_stand/train/night_stand_0018_normalised +night_stand/train/night_stand_0059_normalised +night_stand/train/night_stand_0048_normalised +night_stand/train/night_stand_0159_normalised +night_stand/train/night_stand_0093_normalised +night_stand/train/night_stand_0019_normalised +night_stand/train/night_stand_0022_normalised +night_stand/train/night_stand_0104_normalised +night_stand/train/night_stand_0085_normalised +night_stand/train/night_stand_0035_normalised +night_stand/train/night_stand_0168_normalised +night_stand/train/night_stand_0111_normalised +night_stand/train/night_stand_0128_normalised +night_stand/train/night_stand_0049_normalised +night_stand/train/night_stand_0152_normalised +night_stand/train/night_stand_0079_normalised +night_stand/train/night_stand_0057_normalised +night_stand/train/night_stand_0005_normalised +night_stand/train/night_stand_0198_normalised +night_stand/train/night_stand_0017_normalised +night_stand/train/night_stand_0188_normalised +night_stand/train/night_stand_0101_normalised +night_stand/train/night_stand_0068_normalised +night_stand/train/night_stand_0160_normalised +night_stand/train/night_stand_0073_normalised +night_stand/train/night_stand_0029_normalised +night_stand/train/night_stand_0052_normalised +night_stand/train/night_stand_0108_normalised +night_stand/train/night_stand_0151_normalised +night_stand/train/night_stand_0028_normalised +night_stand/train/night_stand_0121_normalised +night_stand/train/night_stand_0136_normalised +night_stand/train/night_stand_0107_normalised +night_stand/train/night_stand_0058_normalised +night_stand/train/night_stand_0097_normalised +night_stand/train/night_stand_0165_normalised +night_stand/train/night_stand_0167_normalised +night_stand/train/night_stand_0060_normalised +night_stand/train/night_stand_0050_normalised +night_stand/train/night_stand_0181_normalised +night_stand/train/night_stand_0012_normalised +night_stand/train/night_stand_0056_normalised +night_stand/train/night_stand_0087_normalised +night_stand/train/night_stand_0192_normalised +night_stand/train/night_stand_0105_normalised +night_stand/train/night_stand_0034_normalised +night_stand/train/night_stand_0156_normalised +night_stand/train/night_stand_0021_normalised +night_stand/train/night_stand_0040_normalised +night_stand/train/night_stand_0081_normalised +night_stand/train/night_stand_0064_normalised +night_stand/train/night_stand_0031_normalised +night_stand/train/night_stand_0088_normalised +night_stand/train/night_stand_0190_normalised +night_stand/train/night_stand_0033_normalised +night_stand/train/night_stand_0199_normalised +night_stand/train/night_stand_0070_normalised +night_stand/train/night_stand_0080_normalised +night_stand/train/night_stand_0122_normalised +night_stand/train/night_stand_0135_normalised +night_stand/train/night_stand_0078_normalised +night_stand/train/night_stand_0009_normalised +night_stand/train/night_stand_0182_normalised +night_stand/train/night_stand_0147_normalised +night_stand/train/night_stand_0184_normalised +night_stand/train/night_stand_0083_normalised +night_stand/train/night_stand_0170_normalised +night_stand/train/night_stand_0094_normalised +night_stand/train/night_stand_0173_normalised +night_stand/train/night_stand_0054_normalised +night_stand/train/night_stand_0045_normalised +night_stand/train/night_stand_0036_normalised +night_stand/train/night_stand_0075_normalised +night_stand/train/night_stand_0138_normalised +night_stand/train/night_stand_0142_normalised +night_stand/train/night_stand_0024_normalised +night_stand/train/night_stand_0164_normalised +night_stand/train/night_stand_0133_normalised +night_stand/train/night_stand_0010_normalised +night_stand/train/night_stand_0132_normalised +night_stand/train/night_stand_0140_normalised +night_stand/train/night_stand_0161_normalised +night_stand/train/night_stand_0109_normalised +night_stand/train/night_stand_0196_normalised +night_stand/train/night_stand_0166_normalised +night_stand/train/night_stand_0116_normalised +night_stand/train/night_stand_0174_normalised +night_stand/train/night_stand_0193_normalised +night_stand/train/night_stand_0169_normalised +night_stand/train/night_stand_0043_normalised +night_stand/train/night_stand_0176_normalised +night_stand/train/night_stand_0127_normalised +night_stand/train/night_stand_0062_normalised +night_stand/train/night_stand_0074_normalised +night_stand/train/night_stand_0039_normalised +night_stand/train/night_stand_0103_normalised +night_stand/train/night_stand_0016_normalised +night_stand/train/night_stand_0112_normalised +night_stand/train/night_stand_0053_normalised +night_stand/train/night_stand_0077_normalised +night_stand/train/night_stand_0179_normalised +night_stand/train/night_stand_0051_normalised +night_stand/train/night_stand_0191_normalised +night_stand/train/night_stand_0047_normalised +night_stand/train/night_stand_0066_normalised +night_stand/train/night_stand_0014_normalised +night_stand/train/night_stand_0157_normalised +night_stand/train/night_stand_0001_normalised +night_stand/train/night_stand_0178_normalised +night_stand/train/night_stand_0131_normalised +night_stand/train/night_stand_0200_normalised +night_stand/train/night_stand_0185_normalised +night_stand/train/night_stand_0158_normalised +night_stand/train/night_stand_0030_normalised +night_stand/train/night_stand_0106_normalised +night_stand/train/night_stand_0148_normalised +night_stand/train/night_stand_0037_normalised +night_stand/train/night_stand_0113_normalised +night_stand/train/night_stand_0025_normalised +night_stand/train/night_stand_0114_normalised +night_stand/train/night_stand_0139_normalised +night_stand/train/night_stand_0125_normalised +night_stand/train/night_stand_0180_normalised +night_stand/train/night_stand_0141_normalised +night_stand/train/night_stand_0144_normalised +night_stand/train/night_stand_0195_normalised +night_stand/test/night_stand_0280_normalised +night_stand/test/night_stand_0263_normalised +night_stand/test/night_stand_0256_normalised +night_stand/test/night_stand_0262_normalised +night_stand/test/night_stand_0233_normalised +night_stand/test/night_stand_0253_normalised +night_stand/test/night_stand_0279_normalised +night_stand/test/night_stand_0207_normalised +night_stand/test/night_stand_0273_normalised +night_stand/test/night_stand_0281_normalised +night_stand/test/night_stand_0252_normalised +night_stand/test/night_stand_0250_normalised +night_stand/test/night_stand_0278_normalised +night_stand/test/night_stand_0255_normalised +night_stand/test/night_stand_0204_normalised +night_stand/test/night_stand_0216_normalised +night_stand/test/night_stand_0221_normalised +night_stand/test/night_stand_0224_normalised +night_stand/test/night_stand_0213_normalised +night_stand/test/night_stand_0286_normalised +night_stand/test/night_stand_0229_normalised +night_stand/test/night_stand_0236_normalised +night_stand/test/night_stand_0235_normalised +night_stand/test/night_stand_0220_normalised +night_stand/test/night_stand_0265_normalised +night_stand/test/night_stand_0227_normalised +night_stand/test/night_stand_0259_normalised +night_stand/test/night_stand_0277_normalised +night_stand/test/night_stand_0247_normalised +night_stand/test/night_stand_0222_normalised +night_stand/test/night_stand_0212_normalised +night_stand/test/night_stand_0230_normalised +night_stand/test/night_stand_0269_normalised +night_stand/test/night_stand_0243_normalised +night_stand/test/night_stand_0272_normalised +night_stand/test/night_stand_0257_normalised +night_stand/test/night_stand_0223_normalised +night_stand/test/night_stand_0232_normalised +night_stand/test/night_stand_0206_normalised +night_stand/test/night_stand_0238_normalised +night_stand/test/night_stand_0264_normalised +night_stand/test/night_stand_0249_normalised +night_stand/test/night_stand_0202_normalised +night_stand/test/night_stand_0251_normalised +night_stand/test/night_stand_0248_normalised +night_stand/test/night_stand_0239_normalised +night_stand/test/night_stand_0268_normalised +night_stand/test/night_stand_0246_normalised +night_stand/test/night_stand_0258_normalised +night_stand/test/night_stand_0210_normalised +night_stand/test/night_stand_0219_normalised +night_stand/test/night_stand_0231_normalised +night_stand/test/night_stand_0242_normalised +night_stand/test/night_stand_0245_normalised +night_stand/test/night_stand_0214_normalised +night_stand/test/night_stand_0205_normalised +night_stand/test/night_stand_0201_normalised +night_stand/test/night_stand_0203_normalised +night_stand/test/night_stand_0228_normalised +night_stand/test/night_stand_0208_normalised +night_stand/test/night_stand_0282_normalised +night_stand/test/night_stand_0260_normalised +night_stand/test/night_stand_0226_normalised +night_stand/test/night_stand_0237_normalised +night_stand/test/night_stand_0240_normalised +night_stand/test/night_stand_0215_normalised +night_stand/test/night_stand_0211_normalised +night_stand/test/night_stand_0254_normalised +night_stand/test/night_stand_0276_normalised +night_stand/test/night_stand_0261_normalised +night_stand/test/night_stand_0270_normalised +night_stand/test/night_stand_0275_normalised +night_stand/test/night_stand_0271_normalised +night_stand/test/night_stand_0225_normalised +night_stand/test/night_stand_0267_normalised +night_stand/test/night_stand_0285_normalised +night_stand/test/night_stand_0209_normalised +night_stand/test/night_stand_0217_normalised +night_stand/test/night_stand_0266_normalised +night_stand/test/night_stand_0218_normalised +night_stand/test/night_stand_0284_normalised +night_stand/test/night_stand_0241_normalised +night_stand/test/night_stand_0244_normalised +night_stand/test/night_stand_0283_normalised +night_stand/test/night_stand_0234_normalised +night_stand/test/night_stand_0274_normalised +tent/train/tent_0111_normalised +tent/train/tent_0109_normalised +tent/train/tent_0132_normalised +tent/train/tent_0007_normalised +tent/train/tent_0021_normalised +tent/train/tent_0154_normalised +tent/train/tent_0094_normalised +tent/train/tent_0152_normalised +tent/train/tent_0062_normalised +tent/train/tent_0155_normalised +tent/train/tent_0060_normalised +tent/train/tent_0002_normalised +tent/train/tent_0045_normalised +tent/train/tent_0008_normalised +tent/train/tent_0063_normalised +tent/train/tent_0070_normalised +tent/train/tent_0126_normalised +tent/train/tent_0024_normalised +tent/train/tent_0099_normalised +tent/train/tent_0097_normalised +tent/train/tent_0123_normalised +tent/train/tent_0009_normalised +tent/train/tent_0026_normalised +tent/train/tent_0121_normalised +tent/train/tent_0144_normalised +tent/train/tent_0101_normalised +tent/train/tent_0018_normalised +tent/train/tent_0054_normalised +tent/train/tent_0113_normalised +tent/train/tent_0131_normalised +tent/train/tent_0075_normalised +tent/train/tent_0058_normalised +tent/train/tent_0053_normalised +tent/train/tent_0052_normalised +tent/train/tent_0129_normalised +tent/train/tent_0117_normalised +tent/train/tent_0057_normalised +tent/train/tent_0010_normalised +tent/train/tent_0017_normalised +tent/train/tent_0064_normalised +tent/train/tent_0087_normalised +tent/train/tent_0056_normalised +tent/train/tent_0134_normalised +tent/train/tent_0013_normalised +tent/train/tent_0098_normalised +tent/train/tent_0015_normalised +tent/train/tent_0051_normalised +tent/train/tent_0014_normalised +tent/train/tent_0140_normalised +tent/train/tent_0148_normalised +tent/train/tent_0022_normalised +tent/train/tent_0102_normalised +tent/train/tent_0158_normalised +tent/train/tent_0125_normalised +tent/train/tent_0030_normalised +tent/train/tent_0033_normalised +tent/train/tent_0074_normalised +tent/train/tent_0083_normalised +tent/train/tent_0104_normalised +tent/train/tent_0078_normalised +tent/train/tent_0037_normalised +tent/train/tent_0065_normalised +tent/train/tent_0044_normalised +tent/train/tent_0150_normalised +tent/train/tent_0080_normalised +tent/train/tent_0115_normalised +tent/train/tent_0141_normalised +tent/train/tent_0055_normalised +tent/train/tent_0027_normalised +tent/train/tent_0029_normalised +tent/train/tent_0124_normalised +tent/train/tent_0035_normalised +tent/train/tent_0163_normalised +tent/train/tent_0128_normalised +tent/train/tent_0120_normalised +tent/train/tent_0042_normalised +tent/train/tent_0041_normalised +tent/train/tent_0047_normalised +tent/train/tent_0116_normalised +tent/train/tent_0095_normalised +tent/train/tent_0077_normalised +tent/train/tent_0133_normalised +tent/train/tent_0046_normalised +tent/train/tent_0146_normalised +tent/train/tent_0032_normalised +tent/train/tent_0040_normalised +tent/train/tent_0157_normalised +tent/train/tent_0036_normalised +tent/train/tent_0107_normalised +tent/train/tent_0118_normalised +tent/train/tent_0138_normalised +tent/train/tent_0081_normalised +tent/train/tent_0130_normalised +tent/train/tent_0023_normalised +tent/train/tent_0153_normalised +tent/train/tent_0159_normalised +tent/train/tent_0137_normalised +tent/train/tent_0112_normalised +tent/train/tent_0039_normalised +tent/train/tent_0088_normalised +tent/train/tent_0106_normalised +tent/train/tent_0031_normalised +tent/train/tent_0143_normalised +tent/train/tent_0004_normalised +tent/train/tent_0001_normalised +tent/train/tent_0136_normalised +tent/train/tent_0079_normalised +tent/train/tent_0161_normalised +tent/train/tent_0005_normalised +tent/train/tent_0089_normalised +tent/train/tent_0061_normalised +tent/train/tent_0149_normalised +tent/train/tent_0006_normalised +tent/train/tent_0050_normalised +tent/train/tent_0084_normalised +tent/train/tent_0068_normalised +tent/train/tent_0100_normalised +tent/train/tent_0043_normalised +tent/train/tent_0160_normalised +tent/train/tent_0085_normalised +tent/train/tent_0139_normalised +tent/train/tent_0122_normalised +tent/train/tent_0145_normalised +tent/train/tent_0020_normalised +tent/train/tent_0003_normalised +tent/train/tent_0028_normalised +tent/train/tent_0082_normalised +tent/train/tent_0127_normalised +tent/train/tent_0067_normalised +tent/train/tent_0162_normalised +tent/train/tent_0066_normalised +tent/train/tent_0049_normalised +tent/train/tent_0090_normalised +tent/train/tent_0072_normalised +tent/train/tent_0091_normalised +tent/train/tent_0119_normalised +tent/train/tent_0073_normalised +tent/train/tent_0048_normalised +tent/train/tent_0147_normalised +tent/train/tent_0096_normalised +tent/train/tent_0038_normalised +tent/train/tent_0025_normalised +tent/train/tent_0108_normalised +tent/train/tent_0019_normalised +tent/train/tent_0076_normalised +tent/train/tent_0092_normalised +tent/train/tent_0093_normalised +tent/train/tent_0069_normalised +tent/train/tent_0016_normalised +tent/train/tent_0034_normalised +tent/train/tent_0012_normalised +tent/train/tent_0135_normalised +tent/train/tent_0151_normalised +tent/train/tent_0110_normalised +tent/train/tent_0105_normalised +tent/train/tent_0071_normalised +tent/train/tent_0156_normalised +tent/train/tent_0142_normalised +tent/train/tent_0086_normalised +tent/train/tent_0114_normalised +tent/train/tent_0103_normalised +tent/train/tent_0059_normalised +tent/train/tent_0011_normalised +tent/test/tent_0169_normalised +tent/test/tent_0166_normalised +tent/test/tent_0182_normalised +tent/test/tent_0177_normalised +tent/test/tent_0178_normalised +tent/test/tent_0165_normalised +tent/test/tent_0183_normalised +tent/test/tent_0179_normalised +tent/test/tent_0170_normalised +tent/test/tent_0168_normalised +tent/test/tent_0173_normalised +tent/test/tent_0181_normalised +tent/test/tent_0171_normalised +tent/test/tent_0174_normalised +tent/test/tent_0175_normalised +tent/test/tent_0164_normalised +tent/test/tent_0172_normalised +tent/test/tent_0167_normalised +tent/test/tent_0180_normalised +tent/test/tent_0176_normalised +bookshelf/train/bookshelf_0446_normalised +bookshelf/train/bookshelf_0072_normalised +bookshelf/train/bookshelf_0241_normalised +bookshelf/train/bookshelf_0300_normalised +bookshelf/train/bookshelf_0341_normalised +bookshelf/train/bookshelf_0209_normalised +bookshelf/train/bookshelf_0045_normalised +bookshelf/train/bookshelf_0425_normalised +bookshelf/train/bookshelf_0009_normalised +bookshelf/train/bookshelf_0263_normalised +bookshelf/train/bookshelf_0567_normalised +bookshelf/train/bookshelf_0489_normalised +bookshelf/train/bookshelf_0444_normalised +bookshelf/train/bookshelf_0462_normalised +bookshelf/train/bookshelf_0554_normalised +bookshelf/train/bookshelf_0505_normalised +bookshelf/train/bookshelf_0560_normalised +bookshelf/train/bookshelf_0283_normalised +bookshelf/train/bookshelf_0561_normalised +bookshelf/train/bookshelf_0512_normalised +bookshelf/train/bookshelf_0212_normalised +bookshelf/train/bookshelf_0474_normalised +bookshelf/train/bookshelf_0543_normalised +bookshelf/train/bookshelf_0163_normalised +bookshelf/train/bookshelf_0360_normalised +bookshelf/train/bookshelf_0104_normalised +bookshelf/train/bookshelf_0049_normalised +bookshelf/train/bookshelf_0493_normalised +bookshelf/train/bookshelf_0021_normalised +bookshelf/train/bookshelf_0368_normalised +bookshelf/train/bookshelf_0207_normalised +bookshelf/train/bookshelf_0061_normalised +bookshelf/train/bookshelf_0020_normalised +bookshelf/train/bookshelf_0524_normalised +bookshelf/train/bookshelf_0168_normalised +bookshelf/train/bookshelf_0496_normalised +bookshelf/train/bookshelf_0396_normalised +bookshelf/train/bookshelf_0266_normalised +bookshelf/train/bookshelf_0059_normalised +bookshelf/train/bookshelf_0087_normalised +bookshelf/train/bookshelf_0467_normalised +bookshelf/train/bookshelf_0274_normalised +bookshelf/train/bookshelf_0264_normalised +bookshelf/train/bookshelf_0335_normalised +bookshelf/train/bookshelf_0528_normalised +bookshelf/train/bookshelf_0485_normalised +bookshelf/train/bookshelf_0055_normalised +bookshelf/train/bookshelf_0550_normalised +bookshelf/train/bookshelf_0453_normalised +bookshelf/train/bookshelf_0201_normalised +bookshelf/train/bookshelf_0269_normalised +bookshelf/train/bookshelf_0482_normalised +bookshelf/train/bookshelf_0112_normalised +bookshelf/train/bookshelf_0243_normalised +bookshelf/train/bookshelf_0292_normalised +bookshelf/train/bookshelf_0423_normalised +bookshelf/train/bookshelf_0242_normalised +bookshelf/train/bookshelf_0082_normalised +bookshelf/train/bookshelf_0458_normalised +bookshelf/train/bookshelf_0101_normalised +bookshelf/train/bookshelf_0476_normalised +bookshelf/train/bookshelf_0333_normalised +bookshelf/train/bookshelf_0365_normalised +bookshelf/train/bookshelf_0096_normalised +bookshelf/train/bookshelf_0253_normalised +bookshelf/train/bookshelf_0265_normalised +bookshelf/train/bookshelf_0286_normalised +bookshelf/train/bookshelf_0134_normalised +bookshelf/train/bookshelf_0487_normalised +bookshelf/train/bookshelf_0234_normalised +bookshelf/train/bookshelf_0390_normalised +bookshelf/train/bookshelf_0302_normalised +bookshelf/train/bookshelf_0172_normalised +bookshelf/train/bookshelf_0098_normalised +bookshelf/train/bookshelf_0138_normalised +bookshelf/train/bookshelf_0053_normalised +bookshelf/train/bookshelf_0221_normalised +bookshelf/train/bookshelf_0136_normalised +bookshelf/train/bookshelf_0141_normalised +bookshelf/train/bookshelf_0073_normalised +bookshelf/train/bookshelf_0229_normalised +bookshelf/train/bookshelf_0030_normalised +bookshelf/train/bookshelf_0132_normalised +bookshelf/train/bookshelf_0314_normalised +bookshelf/train/bookshelf_0247_normalised +bookshelf/train/bookshelf_0256_normalised +bookshelf/train/bookshelf_0455_normalised +bookshelf/train/bookshelf_0413_normalised +bookshelf/train/bookshelf_0491_normalised +bookshelf/train/bookshelf_0410_normalised +bookshelf/train/bookshelf_0133_normalised +bookshelf/train/bookshelf_0532_normalised +bookshelf/train/bookshelf_0025_normalised +bookshelf/train/bookshelf_0051_normalised +bookshelf/train/bookshelf_0004_normalised +bookshelf/train/bookshelf_0116_normalised +bookshelf/train/bookshelf_0279_normalised +bookshelf/train/bookshelf_0366_normalised +bookshelf/train/bookshelf_0220_normalised +bookshelf/train/bookshelf_0572_normalised +bookshelf/train/bookshelf_0161_normalised +bookshelf/train/bookshelf_0432_normalised +bookshelf/train/bookshelf_0420_normalised +bookshelf/train/bookshelf_0215_normalised +bookshelf/train/bookshelf_0094_normalised +bookshelf/train/bookshelf_0529_normalised +bookshelf/train/bookshelf_0507_normalised +bookshelf/train/bookshelf_0131_normalised +bookshelf/train/bookshelf_0541_normalised +bookshelf/train/bookshelf_0454_normalised +bookshelf/train/bookshelf_0478_normalised +bookshelf/train/bookshelf_0411_normalised +bookshelf/train/bookshelf_0427_normalised +bookshelf/train/bookshelf_0565_normalised +bookshelf/train/bookshelf_0005_normalised +bookshelf/train/bookshelf_0296_normalised +bookshelf/train/bookshelf_0277_normalised +bookshelf/train/bookshelf_0237_normalised +bookshelf/train/bookshelf_0437_normalised +bookshelf/train/bookshelf_0210_normalised +bookshelf/train/bookshelf_0349_normalised +bookshelf/train/bookshelf_0352_normalised +bookshelf/train/bookshelf_0504_normalised +bookshelf/train/bookshelf_0515_normalised +bookshelf/train/bookshelf_0378_normalised +bookshelf/train/bookshelf_0447_normalised +bookshelf/train/bookshelf_0003_normalised +bookshelf/train/bookshelf_0522_normalised +bookshelf/train/bookshelf_0475_normalised +bookshelf/train/bookshelf_0316_normalised +bookshelf/train/bookshelf_0170_normalised +bookshelf/train/bookshelf_0223_normalised +bookshelf/train/bookshelf_0367_normalised +bookshelf/train/bookshelf_0436_normalised +bookshelf/train/bookshelf_0081_normalised +bookshelf/train/bookshelf_0569_normalised +bookshelf/train/bookshelf_0236_normalised +bookshelf/train/bookshelf_0033_normalised +bookshelf/train/bookshelf_0488_normalised +bookshelf/train/bookshelf_0211_normalised +bookshelf/train/bookshelf_0176_normalised +bookshelf/train/bookshelf_0304_normalised +bookshelf/train/bookshelf_0115_normalised +bookshelf/train/bookshelf_0065_normalised +bookshelf/train/bookshelf_0208_normalised +bookshelf/train/bookshelf_0329_normalised +bookshelf/train/bookshelf_0042_normalised +bookshelf/train/bookshelf_0240_normalised +bookshelf/train/bookshelf_0318_normalised +bookshelf/train/bookshelf_0060_normalised +bookshelf/train/bookshelf_0439_normalised +bookshelf/train/bookshelf_0026_normalised +bookshelf/train/bookshelf_0175_normalised +bookshelf/train/bookshelf_0158_normalised +bookshelf/train/bookshelf_0521_normalised +bookshelf/train/bookshelf_0202_normalised +bookshelf/train/bookshelf_0250_normalised +bookshelf/train/bookshelf_0492_normalised +bookshelf/train/bookshelf_0315_normalised +bookshelf/train/bookshelf_0469_normalised +bookshelf/train/bookshelf_0200_normalised +bookshelf/train/bookshelf_0525_normalised +bookshelf/train/bookshelf_0232_normalised +bookshelf/train/bookshelf_0058_normalised +bookshelf/train/bookshelf_0151_normalised +bookshelf/train/bookshelf_0537_normalised +bookshelf/train/bookshelf_0443_normalised +bookshelf/train/bookshelf_0120_normalised +bookshelf/train/bookshelf_0260_normalised +bookshelf/train/bookshelf_0520_normalised +bookshelf/train/bookshelf_0433_normalised +bookshelf/train/bookshelf_0480_normalised +bookshelf/train/bookshelf_0412_normalised +bookshelf/train/bookshelf_0459_normalised +bookshelf/train/bookshelf_0281_normalised +bookshelf/train/bookshelf_0108_normalised +bookshelf/train/bookshelf_0249_normalised +bookshelf/train/bookshelf_0010_normalised +bookshelf/train/bookshelf_0177_normalised +bookshelf/train/bookshelf_0409_normalised +bookshelf/train/bookshelf_0006_normalised +bookshelf/train/bookshelf_0092_normalised +bookshelf/train/bookshelf_0320_normalised +bookshelf/train/bookshelf_0146_normalised +bookshelf/train/bookshelf_0203_normalised +bookshelf/train/bookshelf_0192_normalised +bookshelf/train/bookshelf_0022_normalised +bookshelf/train/bookshelf_0039_normalised +bookshelf/train/bookshelf_0019_normalised +bookshelf/train/bookshelf_0287_normalised +bookshelf/train/bookshelf_0080_normalised +bookshelf/train/bookshelf_0519_normalised +bookshelf/train/bookshelf_0150_normalised +bookshelf/train/bookshelf_0500_normalised +bookshelf/train/bookshelf_0222_normalised +bookshelf/train/bookshelf_0416_normalised +bookshelf/train/bookshelf_0165_normalised +bookshelf/train/bookshelf_0514_normalised +bookshelf/train/bookshelf_0012_normalised +bookshelf/train/bookshelf_0307_normalised +bookshelf/train/bookshelf_0063_normalised +bookshelf/train/bookshelf_0355_normalised +bookshelf/train/bookshelf_0350_normalised +bookshelf/train/bookshelf_0181_normalised +bookshelf/train/bookshelf_0156_normalised +bookshelf/train/bookshelf_0245_normalised +bookshelf/train/bookshelf_0028_normalised +bookshelf/train/bookshelf_0278_normalised +bookshelf/train/bookshelf_0336_normalised +bookshelf/train/bookshelf_0509_normalised +bookshelf/train/bookshelf_0374_normalised +bookshelf/train/bookshelf_0531_normalised +bookshelf/train/bookshelf_0547_normalised +bookshelf/train/bookshelf_0331_normalised +bookshelf/train/bookshelf_0017_normalised +bookshelf/train/bookshelf_0357_normalised +bookshelf/train/bookshelf_0312_normalised +bookshelf/train/bookshelf_0205_normalised +bookshelf/train/bookshelf_0516_normalised +bookshelf/train/bookshelf_0145_normalised +bookshelf/train/bookshelf_0075_normalised +bookshelf/train/bookshelf_0308_normalised +bookshelf/train/bookshelf_0546_normalised +bookshelf/train/bookshelf_0299_normalised +bookshelf/train/bookshelf_0503_normalised +bookshelf/train/bookshelf_0470_normalised +bookshelf/train/bookshelf_0456_normalised +bookshelf/train/bookshelf_0190_normalised +bookshelf/train/bookshelf_0381_normalised +bookshelf/train/bookshelf_0291_normalised +bookshelf/train/bookshelf_0479_normalised +bookshelf/train/bookshelf_0068_normalised +bookshelf/train/bookshelf_0421_normalised +bookshelf/train/bookshelf_0323_normalised +bookshelf/train/bookshelf_0517_normalised +bookshelf/train/bookshelf_0035_normalised +bookshelf/train/bookshelf_0139_normalised +bookshelf/train/bookshelf_0113_normalised +bookshelf/train/bookshelf_0347_normalised +bookshelf/train/bookshelf_0261_normalised +bookshelf/train/bookshelf_0235_normalised +bookshelf/train/bookshelf_0346_normalised +bookshelf/train/bookshelf_0549_normalised +bookshelf/train/bookshelf_0442_normalised +bookshelf/train/bookshelf_0557_normalised +bookshelf/train/bookshelf_0555_normalised +bookshelf/train/bookshelf_0385_normalised +bookshelf/train/bookshelf_0067_normalised +bookshelf/train/bookshelf_0380_normalised +bookshelf/train/bookshelf_0166_normalised +bookshelf/train/bookshelf_0252_normalised +bookshelf/train/bookshelf_0193_normalised +bookshelf/train/bookshelf_0334_normalised +bookshelf/train/bookshelf_0226_normalised +bookshelf/train/bookshelf_0169_normalised +bookshelf/train/bookshelf_0371_normalised +bookshelf/train/bookshelf_0384_normalised +bookshelf/train/bookshelf_0182_normalised +bookshelf/train/bookshelf_0415_normalised +bookshelf/train/bookshelf_0428_normalised +bookshelf/train/bookshelf_0216_normalised +bookshelf/train/bookshelf_0123_normalised +bookshelf/train/bookshelf_0159_normalised +bookshelf/train/bookshelf_0481_normalised +bookshelf/train/bookshelf_0194_normalised +bookshelf/train/bookshelf_0535_normalised +bookshelf/train/bookshelf_0257_normalised +bookshelf/train/bookshelf_0276_normalised +bookshelf/train/bookshelf_0394_normalised +bookshelf/train/bookshelf_0348_normalised +bookshelf/train/bookshelf_0391_normalised +bookshelf/train/bookshelf_0506_normalised +bookshelf/train/bookshelf_0056_normalised +bookshelf/train/bookshelf_0140_normalised +bookshelf/train/bookshelf_0050_normalised +bookshelf/train/bookshelf_0363_normalised +bookshelf/train/bookshelf_0126_normalised +bookshelf/train/bookshelf_0027_normalised +bookshelf/train/bookshelf_0107_normalised +bookshelf/train/bookshelf_0127_normalised +bookshelf/train/bookshelf_0461_normalised +bookshelf/train/bookshelf_0536_normalised +bookshelf/train/bookshelf_0219_normalised +bookshelf/train/bookshelf_0187_normalised +bookshelf/train/bookshelf_0301_normalised +bookshelf/train/bookshelf_0038_normalised +bookshelf/train/bookshelf_0183_normalised +bookshelf/train/bookshelf_0457_normalised +bookshelf/train/bookshelf_0111_normalised +bookshelf/train/bookshelf_0217_normalised +bookshelf/train/bookshelf_0280_normalised +bookshelf/train/bookshelf_0085_normalised +bookshelf/train/bookshelf_0001_normalised +bookshelf/train/bookshelf_0343_normalised +bookshelf/train/bookshelf_0290_normalised +bookshelf/train/bookshelf_0157_normalised +bookshelf/train/bookshelf_0339_normalised +bookshelf/train/bookshelf_0508_normalised +bookshelf/train/bookshelf_0062_normalised +bookshelf/train/bookshelf_0018_normalised +bookshelf/train/bookshelf_0321_normalised +bookshelf/train/bookshelf_0389_normalised +bookshelf/train/bookshelf_0426_normalised +bookshelf/train/bookshelf_0070_normalised +bookshelf/train/bookshelf_0289_normalised +bookshelf/train/bookshelf_0074_normalised +bookshelf/train/bookshelf_0400_normalised +bookshelf/train/bookshelf_0069_normalised +bookshelf/train/bookshelf_0117_normalised +bookshelf/train/bookshelf_0089_normalised +bookshelf/train/bookshelf_0495_normalised +bookshelf/train/bookshelf_0399_normalised +bookshelf/train/bookshelf_0306_normalised +bookshelf/train/bookshelf_0254_normalised +bookshelf/train/bookshelf_0570_normalised +bookshelf/train/bookshelf_0137_normalised +bookshelf/train/bookshelf_0023_normalised +bookshelf/train/bookshelf_0356_normalised +bookshelf/train/bookshelf_0171_normalised +bookshelf/train/bookshelf_0548_normalised +bookshelf/train/bookshelf_0066_normalised +bookshelf/train/bookshelf_0084_normalised +bookshelf/train/bookshelf_0558_normalised +bookshelf/train/bookshelf_0393_normalised +bookshelf/train/bookshelf_0523_normalised +bookshelf/train/bookshelf_0272_normalised +bookshelf/train/bookshelf_0011_normalised +bookshelf/train/bookshelf_0419_normalised +bookshelf/train/bookshelf_0077_normalised +bookshelf/train/bookshelf_0147_normalised +bookshelf/train/bookshelf_0527_normalised +bookshelf/train/bookshelf_0408_normalised +bookshelf/train/bookshelf_0486_normalised +bookshelf/train/bookshelf_0319_normalised +bookshelf/train/bookshelf_0228_normalised +bookshelf/train/bookshelf_0303_normalised +bookshelf/train/bookshelf_0484_normalised +bookshelf/train/bookshelf_0556_normalised +bookshelf/train/bookshelf_0358_normalised +bookshelf/train/bookshelf_0501_normalised +bookshelf/train/bookshelf_0465_normalised +bookshelf/train/bookshelf_0297_normalised +bookshelf/train/bookshelf_0040_normalised +bookshelf/train/bookshelf_0354_normalised +bookshelf/train/bookshelf_0559_normalised +bookshelf/train/bookshelf_0013_normalised +bookshelf/train/bookshelf_0430_normalised +bookshelf/train/bookshelf_0148_normalised +bookshelf/train/bookshelf_0054_normalised +bookshelf/train/bookshelf_0293_normalised +bookshelf/train/bookshelf_0414_normalised +bookshelf/train/bookshelf_0441_normalised +bookshelf/train/bookshelf_0083_normalised +bookshelf/train/bookshelf_0392_normalised +bookshelf/train/bookshelf_0324_normalised +bookshelf/train/bookshelf_0328_normalised +bookshelf/train/bookshelf_0483_normalised +bookshelf/train/bookshelf_0539_normalised +bookshelf/train/bookshelf_0093_normalised +bookshelf/train/bookshelf_0449_normalised +bookshelf/train/bookshelf_0552_normalised +bookshelf/train/bookshelf_0450_normalised +bookshelf/train/bookshelf_0032_normalised +bookshelf/train/bookshelf_0251_normalised +bookshelf/train/bookshelf_0553_normalised +bookshelf/train/bookshelf_0499_normalised +bookshelf/train/bookshelf_0227_normalised +bookshelf/train/bookshelf_0340_normalised +bookshelf/train/bookshelf_0233_normalised +bookshelf/train/bookshelf_0370_normalised +bookshelf/train/bookshelf_0511_normalised +bookshelf/train/bookshelf_0402_normalised +bookshelf/train/bookshelf_0518_normalised +bookshelf/train/bookshelf_0199_normalised +bookshelf/train/bookshelf_0332_normalised +bookshelf/train/bookshelf_0317_normalised +bookshelf/train/bookshelf_0007_normalised +bookshelf/train/bookshelf_0102_normalised +bookshelf/train/bookshelf_0196_normalised +bookshelf/train/bookshelf_0387_normalised +bookshelf/train/bookshelf_0173_normalised +bookshelf/train/bookshelf_0064_normalised +bookshelf/train/bookshelf_0472_normalised +bookshelf/train/bookshelf_0397_normalised +bookshelf/train/bookshelf_0105_normalised +bookshelf/train/bookshelf_0036_normalised +bookshelf/train/bookshelf_0121_normalised +bookshelf/train/bookshelf_0154_normalised +bookshelf/train/bookshelf_0502_normalised +bookshelf/train/bookshelf_0031_normalised +bookshelf/train/bookshelf_0188_normalised +bookshelf/train/bookshelf_0533_normalised +bookshelf/train/bookshelf_0473_normalised +bookshelf/train/bookshelf_0498_normalised +bookshelf/train/bookshelf_0401_normalised +bookshelf/train/bookshelf_0534_normalised +bookshelf/train/bookshelf_0195_normalised +bookshelf/train/bookshelf_0398_normalised +bookshelf/train/bookshelf_0110_normalised +bookshelf/train/bookshelf_0130_normalised +bookshelf/train/bookshelf_0015_normalised +bookshelf/train/bookshelf_0268_normalised +bookshelf/train/bookshelf_0191_normalised +bookshelf/train/bookshelf_0135_normalised +bookshelf/train/bookshelf_0149_normalised +bookshelf/train/bookshelf_0305_normalised +bookshelf/train/bookshelf_0353_normalised +bookshelf/train/bookshelf_0142_normalised +bookshelf/train/bookshelf_0174_normalised +bookshelf/train/bookshelf_0383_normalised +bookshelf/train/bookshelf_0034_normalised +bookshelf/train/bookshelf_0345_normalised +bookshelf/train/bookshelf_0424_normalised +bookshelf/train/bookshelf_0422_normalised +bookshelf/train/bookshelf_0282_normalised +bookshelf/train/bookshelf_0271_normalised +bookshelf/train/bookshelf_0494_normalised +bookshelf/train/bookshelf_0373_normalised +bookshelf/train/bookshelf_0184_normalised +bookshelf/train/bookshelf_0218_normalised +bookshelf/train/bookshelf_0571_normalised +bookshelf/train/bookshelf_0125_normalised +bookshelf/train/bookshelf_0285_normalised +bookshelf/train/bookshelf_0122_normalised +bookshelf/train/bookshelf_0545_normalised +bookshelf/train/bookshelf_0267_normalised +bookshelf/train/bookshelf_0406_normalised +bookshelf/train/bookshelf_0008_normalised +bookshelf/train/bookshelf_0259_normalised +bookshelf/train/bookshelf_0189_normalised +bookshelf/train/bookshelf_0284_normalised +bookshelf/train/bookshelf_0311_normalised +bookshelf/train/bookshelf_0014_normalised +bookshelf/train/bookshelf_0162_normalised +bookshelf/train/bookshelf_0468_normalised +bookshelf/train/bookshelf_0542_normalised +bookshelf/train/bookshelf_0448_normalised +bookshelf/train/bookshelf_0497_normalised +bookshelf/train/bookshelf_0326_normalised +bookshelf/train/bookshelf_0099_normalised +bookshelf/train/bookshelf_0566_normalised +bookshelf/train/bookshelf_0288_normalised +bookshelf/train/bookshelf_0100_normalised +bookshelf/train/bookshelf_0016_normalised +bookshelf/train/bookshelf_0563_normalised +bookshelf/train/bookshelf_0167_normalised +bookshelf/train/bookshelf_0185_normalised +bookshelf/train/bookshelf_0452_normalised +bookshelf/train/bookshelf_0361_normalised +bookshelf/train/bookshelf_0344_normalised +bookshelf/train/bookshelf_0225_normalised +bookshelf/train/bookshelf_0197_normalised +bookshelf/train/bookshelf_0568_normalised +bookshelf/train/bookshelf_0434_normalised +bookshelf/train/bookshelf_0178_normalised +bookshelf/train/bookshelf_0337_normalised +bookshelf/train/bookshelf_0403_normalised +bookshelf/train/bookshelf_0180_normalised +bookshelf/train/bookshelf_0438_normalised +bookshelf/train/bookshelf_0128_normalised +bookshelf/train/bookshelf_0445_normalised +bookshelf/train/bookshelf_0231_normalised +bookshelf/train/bookshelf_0198_normalised +bookshelf/train/bookshelf_0179_normalised +bookshelf/train/bookshelf_0464_normalised +bookshelf/train/bookshelf_0510_normalised +bookshelf/train/bookshelf_0460_normalised +bookshelf/train/bookshelf_0230_normalised +bookshelf/train/bookshelf_0429_normalised +bookshelf/train/bookshelf_0244_normalised +bookshelf/train/bookshelf_0386_normalised +bookshelf/train/bookshelf_0466_normalised +bookshelf/train/bookshelf_0048_normalised +bookshelf/train/bookshelf_0041_normalised +bookshelf/train/bookshelf_0052_normalised +bookshelf/train/bookshelf_0129_normalised +bookshelf/train/bookshelf_0530_normalised +bookshelf/train/bookshelf_0024_normalised +bookshelf/train/bookshelf_0372_normalised +bookshelf/train/bookshelf_0239_normalised +bookshelf/train/bookshelf_0418_normalised +bookshelf/train/bookshelf_0351_normalised +bookshelf/train/bookshelf_0213_normalised +bookshelf/train/bookshelf_0327_normalised +bookshelf/train/bookshelf_0206_normalised +bookshelf/train/bookshelf_0310_normalised +bookshelf/train/bookshelf_0124_normalised +bookshelf/train/bookshelf_0238_normalised +bookshelf/train/bookshelf_0275_normalised +bookshelf/train/bookshelf_0204_normalised +bookshelf/train/bookshelf_0118_normalised +bookshelf/train/bookshelf_0143_normalised +bookshelf/train/bookshelf_0295_normalised +bookshelf/train/bookshelf_0029_normalised +bookshelf/train/bookshelf_0309_normalised +bookshelf/train/bookshelf_0044_normalised +bookshelf/train/bookshelf_0103_normalised +bookshelf/train/bookshelf_0152_normalised +bookshelf/train/bookshelf_0369_normalised +bookshelf/train/bookshelf_0262_normalised +bookshelf/train/bookshelf_0057_normalised +bookshelf/train/bookshelf_0088_normalised +bookshelf/train/bookshelf_0155_normalised +bookshelf/train/bookshelf_0160_normalised +bookshelf/train/bookshelf_0379_normalised +bookshelf/train/bookshelf_0431_normalised +bookshelf/train/bookshelf_0224_normalised +bookshelf/train/bookshelf_0544_normalised +bookshelf/train/bookshelf_0076_normalised +bookshelf/train/bookshelf_0540_normalised +bookshelf/train/bookshelf_0071_normalised +bookshelf/train/bookshelf_0562_normalised +bookshelf/train/bookshelf_0417_normalised +bookshelf/train/bookshelf_0338_normalised +bookshelf/train/bookshelf_0298_normalised +bookshelf/train/bookshelf_0047_normalised +bookshelf/train/bookshelf_0086_normalised +bookshelf/train/bookshelf_0359_normalised +bookshelf/train/bookshelf_0325_normalised +bookshelf/train/bookshelf_0270_normalised +bookshelf/train/bookshelf_0046_normalised +bookshelf/train/bookshelf_0564_normalised +bookshelf/train/bookshelf_0377_normalised +bookshelf/train/bookshelf_0364_normalised +bookshelf/train/bookshelf_0342_normalised +bookshelf/train/bookshelf_0435_normalised +bookshelf/train/bookshelf_0246_normalised +bookshelf/train/bookshelf_0407_normalised +bookshelf/train/bookshelf_0091_normalised +bookshelf/train/bookshelf_0404_normalised +bookshelf/train/bookshelf_0463_normalised +bookshelf/train/bookshelf_0037_normalised +bookshelf/train/bookshelf_0490_normalised +bookshelf/train/bookshelf_0382_normalised +bookshelf/train/bookshelf_0322_normalised +bookshelf/train/bookshelf_0258_normalised +bookshelf/train/bookshelf_0144_normalised +bookshelf/train/bookshelf_0440_normalised +bookshelf/train/bookshelf_0294_normalised +bookshelf/train/bookshelf_0538_normalised +bookshelf/train/bookshelf_0395_normalised +bookshelf/train/bookshelf_0214_normalised +bookshelf/train/bookshelf_0376_normalised +bookshelf/train/bookshelf_0090_normalised +bookshelf/train/bookshelf_0097_normalised +bookshelf/train/bookshelf_0388_normalised +bookshelf/train/bookshelf_0526_normalised +bookshelf/train/bookshelf_0119_normalised +bookshelf/train/bookshelf_0375_normalised +bookshelf/train/bookshelf_0002_normalised +bookshelf/train/bookshelf_0153_normalised +bookshelf/train/bookshelf_0451_normalised +bookshelf/train/bookshelf_0255_normalised +bookshelf/train/bookshelf_0471_normalised +bookshelf/train/bookshelf_0164_normalised +bookshelf/train/bookshelf_0551_normalised +bookshelf/train/bookshelf_0248_normalised +bookshelf/train/bookshelf_0043_normalised +bookshelf/train/bookshelf_0405_normalised +bookshelf/train/bookshelf_0330_normalised +bookshelf/train/bookshelf_0095_normalised +bookshelf/train/bookshelf_0477_normalised +bookshelf/train/bookshelf_0186_normalised +bookshelf/train/bookshelf_0362_normalised +bookshelf/train/bookshelf_0313_normalised +bookshelf/train/bookshelf_0513_normalised +bookshelf/train/bookshelf_0109_normalised +bookshelf/train/bookshelf_0106_normalised +bookshelf/train/bookshelf_0078_normalised +bookshelf/train/bookshelf_0079_normalised +bookshelf/train/bookshelf_0114_normalised +bookshelf/train/bookshelf_0273_normalised +bookshelf/test/bookshelf_0593_normalised +bookshelf/test/bookshelf_0641_normalised +bookshelf/test/bookshelf_0661_normalised +bookshelf/test/bookshelf_0586_normalised +bookshelf/test/bookshelf_0576_normalised +bookshelf/test/bookshelf_0636_normalised +bookshelf/test/bookshelf_0580_normalised +bookshelf/test/bookshelf_0655_normalised +bookshelf/test/bookshelf_0606_normalised +bookshelf/test/bookshelf_0582_normalised +bookshelf/test/bookshelf_0634_normalised +bookshelf/test/bookshelf_0583_normalised +bookshelf/test/bookshelf_0660_normalised +bookshelf/test/bookshelf_0578_normalised +bookshelf/test/bookshelf_0653_normalised +bookshelf/test/bookshelf_0605_normalised +bookshelf/test/bookshelf_0625_normalised +bookshelf/test/bookshelf_0642_normalised +bookshelf/test/bookshelf_0631_normalised +bookshelf/test/bookshelf_0652_normalised +bookshelf/test/bookshelf_0672_normalised +bookshelf/test/bookshelf_0633_normalised +bookshelf/test/bookshelf_0585_normalised +bookshelf/test/bookshelf_0665_normalised +bookshelf/test/bookshelf_0626_normalised +bookshelf/test/bookshelf_0623_normalised +bookshelf/test/bookshelf_0591_normalised +bookshelf/test/bookshelf_0615_normalised +bookshelf/test/bookshelf_0656_normalised +bookshelf/test/bookshelf_0599_normalised +bookshelf/test/bookshelf_0670_normalised +bookshelf/test/bookshelf_0596_normalised +bookshelf/test/bookshelf_0619_normalised +bookshelf/test/bookshelf_0592_normalised +bookshelf/test/bookshelf_0646_normalised +bookshelf/test/bookshelf_0657_normalised +bookshelf/test/bookshelf_0640_normalised +bookshelf/test/bookshelf_0662_normalised +bookshelf/test/bookshelf_0643_normalised +bookshelf/test/bookshelf_0666_normalised +bookshelf/test/bookshelf_0603_normalised +bookshelf/test/bookshelf_0618_normalised +bookshelf/test/bookshelf_0645_normalised +bookshelf/test/bookshelf_0663_normalised +bookshelf/test/bookshelf_0573_normalised +bookshelf/test/bookshelf_0613_normalised +bookshelf/test/bookshelf_0664_normalised +bookshelf/test/bookshelf_0581_normalised +bookshelf/test/bookshelf_0669_normalised +bookshelf/test/bookshelf_0629_normalised +bookshelf/test/bookshelf_0609_normalised +bookshelf/test/bookshelf_0590_normalised +bookshelf/test/bookshelf_0651_normalised +bookshelf/test/bookshelf_0659_normalised +bookshelf/test/bookshelf_0635_normalised +bookshelf/test/bookshelf_0639_normalised +bookshelf/test/bookshelf_0579_normalised +bookshelf/test/bookshelf_0647_normalised +bookshelf/test/bookshelf_0602_normalised +bookshelf/test/bookshelf_0671_normalised +bookshelf/test/bookshelf_0617_normalised +bookshelf/test/bookshelf_0598_normalised +bookshelf/test/bookshelf_0614_normalised +bookshelf/test/bookshelf_0611_normalised +bookshelf/test/bookshelf_0607_normalised +bookshelf/test/bookshelf_0638_normalised +bookshelf/test/bookshelf_0616_normalised +bookshelf/test/bookshelf_0587_normalised +bookshelf/test/bookshelf_0589_normalised +bookshelf/test/bookshelf_0627_normalised +bookshelf/test/bookshelf_0600_normalised +bookshelf/test/bookshelf_0648_normalised +bookshelf/test/bookshelf_0575_normalised +bookshelf/test/bookshelf_0610_normalised +bookshelf/test/bookshelf_0637_normalised +bookshelf/test/bookshelf_0654_normalised +bookshelf/test/bookshelf_0630_normalised +bookshelf/test/bookshelf_0597_normalised +bookshelf/test/bookshelf_0612_normalised +bookshelf/test/bookshelf_0628_normalised +bookshelf/test/bookshelf_0667_normalised +bookshelf/test/bookshelf_0588_normalised +bookshelf/test/bookshelf_0604_normalised +bookshelf/test/bookshelf_0601_normalised +bookshelf/test/bookshelf_0649_normalised +bookshelf/test/bookshelf_0584_normalised +bookshelf/test/bookshelf_0658_normalised +bookshelf/test/bookshelf_0650_normalised +bookshelf/test/bookshelf_0632_normalised +bookshelf/test/bookshelf_0668_normalised +bookshelf/test/bookshelf_0621_normalised +bookshelf/test/bookshelf_0574_normalised +bookshelf/test/bookshelf_0622_normalised +bookshelf/test/bookshelf_0624_normalised +bookshelf/test/bookshelf_0608_normalised +bookshelf/test/bookshelf_0595_normalised +bookshelf/test/bookshelf_0644_normalised +bookshelf/test/bookshelf_0577_normalised +bookshelf/test/bookshelf_0620_normalised +bookshelf/test/bookshelf_0594_normalised +range_hood/train/range_hood_0007_normalised +range_hood/train/range_hood_0004_normalised +range_hood/train/range_hood_0071_normalised +range_hood/train/range_hood_0085_normalised +range_hood/train/range_hood_0082_normalised +range_hood/train/range_hood_0062_normalised +range_hood/train/range_hood_0094_normalised +range_hood/train/range_hood_0070_normalised +range_hood/train/range_hood_0086_normalised +range_hood/train/range_hood_0100_normalised +range_hood/train/range_hood_0078_normalised +range_hood/train/range_hood_0073_normalised +range_hood/train/range_hood_0002_normalised +range_hood/train/range_hood_0010_normalised +range_hood/train/range_hood_0059_normalised +range_hood/train/range_hood_0111_normalised +range_hood/train/range_hood_0009_normalised +range_hood/train/range_hood_0081_normalised +range_hood/train/range_hood_0058_normalised +range_hood/train/range_hood_0074_normalised +range_hood/train/range_hood_0075_normalised +range_hood/train/range_hood_0099_normalised +range_hood/train/range_hood_0034_normalised +range_hood/train/range_hood_0108_normalised +range_hood/train/range_hood_0106_normalised +range_hood/train/range_hood_0112_normalised +range_hood/train/range_hood_0026_normalised +range_hood/train/range_hood_0023_normalised +range_hood/train/range_hood_0088_normalised +range_hood/train/range_hood_0030_normalised +range_hood/train/range_hood_0057_normalised +range_hood/train/range_hood_0008_normalised +range_hood/train/range_hood_0063_normalised +range_hood/train/range_hood_0068_normalised +range_hood/train/range_hood_0056_normalised +range_hood/train/range_hood_0115_normalised +range_hood/train/range_hood_0084_normalised +range_hood/train/range_hood_0113_normalised +range_hood/train/range_hood_0098_normalised +range_hood/train/range_hood_0067_normalised +range_hood/train/range_hood_0079_normalised +range_hood/train/range_hood_0095_normalised +range_hood/train/range_hood_0047_normalised +range_hood/train/range_hood_0038_normalised +range_hood/train/range_hood_0083_normalised +range_hood/train/range_hood_0045_normalised +range_hood/train/range_hood_0065_normalised +range_hood/train/range_hood_0014_normalised +range_hood/train/range_hood_0043_normalised +range_hood/train/range_hood_0041_normalised +range_hood/train/range_hood_0022_normalised +range_hood/train/range_hood_0064_normalised +range_hood/train/range_hood_0114_normalised +range_hood/train/range_hood_0091_normalised +range_hood/train/range_hood_0087_normalised +range_hood/train/range_hood_0016_normalised +range_hood/train/range_hood_0049_normalised +range_hood/train/range_hood_0072_normalised +range_hood/train/range_hood_0066_normalised +range_hood/train/range_hood_0097_normalised +range_hood/train/range_hood_0051_normalised +range_hood/train/range_hood_0046_normalised +range_hood/train/range_hood_0040_normalised +range_hood/train/range_hood_0054_normalised +range_hood/train/range_hood_0017_normalised +range_hood/train/range_hood_0025_normalised +range_hood/train/range_hood_0048_normalised +range_hood/train/range_hood_0027_normalised +range_hood/train/range_hood_0101_normalised +range_hood/train/range_hood_0052_normalised +range_hood/train/range_hood_0102_normalised +range_hood/train/range_hood_0018_normalised +range_hood/train/range_hood_0060_normalised +range_hood/train/range_hood_0042_normalised +range_hood/train/range_hood_0105_normalised +range_hood/train/range_hood_0080_normalised +range_hood/train/range_hood_0001_normalised +range_hood/train/range_hood_0076_normalised +range_hood/train/range_hood_0107_normalised +range_hood/train/range_hood_0019_normalised +range_hood/train/range_hood_0003_normalised +range_hood/train/range_hood_0035_normalised +range_hood/train/range_hood_0044_normalised +range_hood/train/range_hood_0103_normalised +range_hood/train/range_hood_0104_normalised +range_hood/train/range_hood_0110_normalised +range_hood/train/range_hood_0055_normalised +range_hood/train/range_hood_0031_normalised +range_hood/train/range_hood_0021_normalised +range_hood/train/range_hood_0077_normalised +range_hood/train/range_hood_0037_normalised +range_hood/train/range_hood_0024_normalised +range_hood/train/range_hood_0061_normalised +range_hood/train/range_hood_0013_normalised +range_hood/train/range_hood_0036_normalised +range_hood/train/range_hood_0089_normalised +range_hood/train/range_hood_0053_normalised +range_hood/train/range_hood_0006_normalised +range_hood/train/range_hood_0096_normalised +range_hood/train/range_hood_0020_normalised +range_hood/train/range_hood_0069_normalised +range_hood/train/range_hood_0050_normalised +range_hood/train/range_hood_0039_normalised +range_hood/train/range_hood_0015_normalised +range_hood/train/range_hood_0028_normalised +range_hood/train/range_hood_0011_normalised +range_hood/train/range_hood_0032_normalised +range_hood/train/range_hood_0012_normalised +range_hood/train/range_hood_0090_normalised +range_hood/train/range_hood_0092_normalised +range_hood/train/range_hood_0029_normalised +range_hood/train/range_hood_0033_normalised +range_hood/train/range_hood_0005_normalised +range_hood/train/range_hood_0109_normalised +range_hood/train/range_hood_0093_normalised +range_hood/test/range_hood_0147_normalised +range_hood/test/range_hood_0191_normalised +range_hood/test/range_hood_0177_normalised +range_hood/test/range_hood_0175_normalised +range_hood/test/range_hood_0158_normalised +range_hood/test/range_hood_0199_normalised +range_hood/test/range_hood_0197_normalised +range_hood/test/range_hood_0132_normalised +range_hood/test/range_hood_0195_normalised +range_hood/test/range_hood_0213_normalised +range_hood/test/range_hood_0176_normalised +range_hood/test/range_hood_0211_normalised +range_hood/test/range_hood_0172_normalised +range_hood/test/range_hood_0193_normalised +range_hood/test/range_hood_0187_normalised +range_hood/test/range_hood_0135_normalised +range_hood/test/range_hood_0201_normalised +range_hood/test/range_hood_0128_normalised +range_hood/test/range_hood_0168_normalised +range_hood/test/range_hood_0136_normalised +range_hood/test/range_hood_0162_normalised +range_hood/test/range_hood_0131_normalised +range_hood/test/range_hood_0138_normalised +range_hood/test/range_hood_0208_normalised +range_hood/test/range_hood_0146_normalised +range_hood/test/range_hood_0188_normalised +range_hood/test/range_hood_0167_normalised +range_hood/test/range_hood_0182_normalised +range_hood/test/range_hood_0129_normalised +range_hood/test/range_hood_0181_normalised +range_hood/test/range_hood_0170_normalised +range_hood/test/range_hood_0203_normalised +range_hood/test/range_hood_0123_normalised +range_hood/test/range_hood_0127_normalised +range_hood/test/range_hood_0121_normalised +range_hood/test/range_hood_0154_normalised +range_hood/test/range_hood_0134_normalised +range_hood/test/range_hood_0156_normalised +range_hood/test/range_hood_0185_normalised +range_hood/test/range_hood_0133_normalised +range_hood/test/range_hood_0215_normalised +range_hood/test/range_hood_0173_normalised +range_hood/test/range_hood_0120_normalised +range_hood/test/range_hood_0184_normalised +range_hood/test/range_hood_0148_normalised +range_hood/test/range_hood_0165_normalised +range_hood/test/range_hood_0119_normalised +range_hood/test/range_hood_0166_normalised +range_hood/test/range_hood_0143_normalised +range_hood/test/range_hood_0153_normalised +range_hood/test/range_hood_0152_normalised +range_hood/test/range_hood_0212_normalised +range_hood/test/range_hood_0186_normalised +range_hood/test/range_hood_0137_normalised +range_hood/test/range_hood_0116_normalised +range_hood/test/range_hood_0125_normalised +range_hood/test/range_hood_0141_normalised +range_hood/test/range_hood_0117_normalised +range_hood/test/range_hood_0210_normalised +range_hood/test/range_hood_0163_normalised +range_hood/test/range_hood_0206_normalised +range_hood/test/range_hood_0196_normalised +range_hood/test/range_hood_0161_normalised +range_hood/test/range_hood_0160_normalised +range_hood/test/range_hood_0118_normalised +range_hood/test/range_hood_0150_normalised +range_hood/test/range_hood_0178_normalised +range_hood/test/range_hood_0207_normalised +range_hood/test/range_hood_0122_normalised +range_hood/test/range_hood_0174_normalised +range_hood/test/range_hood_0169_normalised +range_hood/test/range_hood_0204_normalised +range_hood/test/range_hood_0192_normalised +range_hood/test/range_hood_0205_normalised +range_hood/test/range_hood_0202_normalised +range_hood/test/range_hood_0214_normalised +range_hood/test/range_hood_0126_normalised +range_hood/test/range_hood_0183_normalised +range_hood/test/range_hood_0171_normalised +range_hood/test/range_hood_0189_normalised +range_hood/test/range_hood_0124_normalised +range_hood/test/range_hood_0130_normalised +range_hood/test/range_hood_0190_normalised +range_hood/test/range_hood_0140_normalised +range_hood/test/range_hood_0149_normalised +range_hood/test/range_hood_0144_normalised +range_hood/test/range_hood_0200_normalised +range_hood/test/range_hood_0159_normalised +range_hood/test/range_hood_0151_normalised +range_hood/test/range_hood_0198_normalised +range_hood/test/range_hood_0164_normalised +range_hood/test/range_hood_0157_normalised +range_hood/test/range_hood_0142_normalised +range_hood/test/range_hood_0139_normalised +range_hood/test/range_hood_0145_normalised +range_hood/test/range_hood_0180_normalised +range_hood/test/range_hood_0209_normalised +range_hood/test/range_hood_0194_normalised +range_hood/test/range_hood_0179_normalised +range_hood/test/range_hood_0155_normalised +curtain/train/curtain_0112_normalised +curtain/train/curtain_0120_normalised +curtain/train/curtain_0017_normalised +curtain/train/curtain_0085_normalised +curtain/train/curtain_0040_normalised +curtain/train/curtain_0070_normalised +curtain/train/curtain_0035_normalised +curtain/train/curtain_0045_normalised +curtain/train/curtain_0057_normalised +curtain/train/curtain_0029_normalised +curtain/train/curtain_0062_normalised +curtain/train/curtain_0049_normalised +curtain/train/curtain_0064_normalised +curtain/train/curtain_0109_normalised +curtain/train/curtain_0126_normalised +curtain/train/curtain_0113_normalised +curtain/train/curtain_0059_normalised +curtain/train/curtain_0013_normalised +curtain/train/curtain_0079_normalised +curtain/train/curtain_0006_normalised +curtain/train/curtain_0076_normalised +curtain/train/curtain_0004_normalised +curtain/train/curtain_0005_normalised +curtain/train/curtain_0131_normalised +curtain/train/curtain_0106_normalised +curtain/train/curtain_0023_normalised +curtain/train/curtain_0127_normalised +curtain/train/curtain_0134_normalised +curtain/train/curtain_0010_normalised +curtain/train/curtain_0003_normalised +curtain/train/curtain_0025_normalised +curtain/train/curtain_0055_normalised +curtain/train/curtain_0038_normalised +curtain/train/curtain_0100_normalised +curtain/train/curtain_0110_normalised +curtain/train/curtain_0051_normalised +curtain/train/curtain_0119_normalised +curtain/train/curtain_0081_normalised +curtain/train/curtain_0090_normalised +curtain/train/curtain_0101_normalised +curtain/train/curtain_0033_normalised +curtain/train/curtain_0103_normalised +curtain/train/curtain_0111_normalised +curtain/train/curtain_0125_normalised +curtain/train/curtain_0044_normalised +curtain/train/curtain_0014_normalised +curtain/train/curtain_0077_normalised +curtain/train/curtain_0097_normalised +curtain/train/curtain_0030_normalised +curtain/train/curtain_0034_normalised +curtain/train/curtain_0105_normalised +curtain/train/curtain_0063_normalised +curtain/train/curtain_0130_normalised +curtain/train/curtain_0115_normalised +curtain/train/curtain_0020_normalised +curtain/train/curtain_0102_normalised +curtain/train/curtain_0080_normalised +curtain/train/curtain_0123_normalised +curtain/train/curtain_0069_normalised +curtain/train/curtain_0118_normalised +curtain/train/curtain_0091_normalised +curtain/train/curtain_0031_normalised +curtain/train/curtain_0015_normalised +curtain/train/curtain_0022_normalised +curtain/train/curtain_0032_normalised +curtain/train/curtain_0009_normalised +curtain/train/curtain_0104_normalised +curtain/train/curtain_0007_normalised +curtain/train/curtain_0067_normalised +curtain/train/curtain_0065_normalised +curtain/train/curtain_0018_normalised +curtain/train/curtain_0053_normalised +curtain/train/curtain_0066_normalised +curtain/train/curtain_0050_normalised +curtain/train/curtain_0072_normalised +curtain/train/curtain_0060_normalised +curtain/train/curtain_0078_normalised +curtain/train/curtain_0089_normalised +curtain/train/curtain_0046_normalised +curtain/train/curtain_0129_normalised +curtain/train/curtain_0021_normalised +curtain/train/curtain_0073_normalised +curtain/train/curtain_0107_normalised +curtain/train/curtain_0099_normalised +curtain/train/curtain_0132_normalised +curtain/train/curtain_0094_normalised +curtain/train/curtain_0002_normalised +curtain/train/curtain_0012_normalised +curtain/train/curtain_0117_normalised +curtain/train/curtain_0086_normalised +curtain/train/curtain_0121_normalised +curtain/train/curtain_0019_normalised +curtain/train/curtain_0052_normalised +curtain/train/curtain_0028_normalised +curtain/train/curtain_0037_normalised +curtain/train/curtain_0092_normalised +curtain/train/curtain_0088_normalised +curtain/train/curtain_0137_normalised +curtain/train/curtain_0133_normalised +curtain/train/curtain_0096_normalised +curtain/train/curtain_0054_normalised +curtain/train/curtain_0047_normalised +curtain/train/curtain_0136_normalised +curtain/train/curtain_0016_normalised +curtain/train/curtain_0128_normalised +curtain/train/curtain_0042_normalised +curtain/train/curtain_0056_normalised +curtain/train/curtain_0108_normalised +curtain/train/curtain_0093_normalised +curtain/train/curtain_0026_normalised +curtain/train/curtain_0043_normalised +curtain/train/curtain_0074_normalised +curtain/train/curtain_0082_normalised +curtain/train/curtain_0061_normalised +curtain/train/curtain_0122_normalised +curtain/train/curtain_0116_normalised +curtain/train/curtain_0027_normalised +curtain/train/curtain_0084_normalised +curtain/train/curtain_0068_normalised +curtain/train/curtain_0024_normalised +curtain/train/curtain_0001_normalised +curtain/train/curtain_0058_normalised +curtain/train/curtain_0087_normalised +curtain/train/curtain_0039_normalised +curtain/train/curtain_0008_normalised +curtain/train/curtain_0124_normalised +curtain/train/curtain_0071_normalised +curtain/train/curtain_0048_normalised +curtain/train/curtain_0011_normalised +curtain/train/curtain_0098_normalised +curtain/train/curtain_0135_normalised +curtain/train/curtain_0075_normalised +curtain/train/curtain_0041_normalised +curtain/train/curtain_0114_normalised +curtain/train/curtain_0083_normalised +curtain/train/curtain_0138_normalised +curtain/train/curtain_0095_normalised +curtain/train/curtain_0036_normalised +curtain/test/curtain_0155_normalised +curtain/test/curtain_0148_normalised +curtain/test/curtain_0147_normalised +curtain/test/curtain_0156_normalised +curtain/test/curtain_0151_normalised +curtain/test/curtain_0145_normalised +curtain/test/curtain_0140_normalised +curtain/test/curtain_0139_normalised +curtain/test/curtain_0146_normalised +curtain/test/curtain_0157_normalised +curtain/test/curtain_0149_normalised +curtain/test/curtain_0150_normalised +curtain/test/curtain_0158_normalised +curtain/test/curtain_0142_normalised +curtain/test/curtain_0143_normalised +curtain/test/curtain_0152_normalised +curtain/test/curtain_0144_normalised +curtain/test/curtain_0141_normalised +curtain/test/curtain_0153_normalised +curtain/test/curtain_0154_normalised +lamp/train/lamp_0080_normalised +lamp/train/lamp_0097_normalised +lamp/train/lamp_0003_normalised +lamp/train/lamp_0067_normalised +lamp/train/lamp_0064_normalised +lamp/train/lamp_0096_normalised +lamp/train/lamp_0086_normalised +lamp/train/lamp_0025_normalised +lamp/train/lamp_0010_normalised +lamp/train/lamp_0069_normalised +lamp/train/lamp_0021_normalised +lamp/train/lamp_0081_normalised +lamp/train/lamp_0065_normalised +lamp/train/lamp_0014_normalised +lamp/train/lamp_0050_normalised +lamp/train/lamp_0005_normalised +lamp/train/lamp_0049_normalised +lamp/train/lamp_0104_normalised +lamp/train/lamp_0115_normalised +lamp/train/lamp_0071_normalised +lamp/train/lamp_0002_normalised +lamp/train/lamp_0092_normalised +lamp/train/lamp_0118_normalised +lamp/train/lamp_0026_normalised +lamp/train/lamp_0033_normalised +lamp/train/lamp_0121_normalised +lamp/train/lamp_0023_normalised +lamp/train/lamp_0112_normalised +lamp/train/lamp_0113_normalised +lamp/train/lamp_0108_normalised +lamp/train/lamp_0011_normalised +lamp/train/lamp_0109_normalised +lamp/train/lamp_0004_normalised +lamp/train/lamp_0106_normalised +lamp/train/lamp_0060_normalised +lamp/train/lamp_0123_normalised +lamp/train/lamp_0043_normalised +lamp/train/lamp_0099_normalised +lamp/train/lamp_0034_normalised +lamp/train/lamp_0012_normalised +lamp/train/lamp_0070_normalised +lamp/train/lamp_0039_normalised +lamp/train/lamp_0101_normalised +lamp/train/lamp_0015_normalised +lamp/train/lamp_0045_normalised +lamp/train/lamp_0020_normalised +lamp/train/lamp_0105_normalised +lamp/train/lamp_0051_normalised +lamp/train/lamp_0055_normalised +lamp/train/lamp_0124_normalised +lamp/train/lamp_0075_normalised +lamp/train/lamp_0040_normalised +lamp/train/lamp_0046_normalised +lamp/train/lamp_0114_normalised +lamp/train/lamp_0116_normalised +lamp/train/lamp_0052_normalised +lamp/train/lamp_0035_normalised +lamp/train/lamp_0077_normalised +lamp/train/lamp_0062_normalised +lamp/train/lamp_0042_normalised +lamp/train/lamp_0009_normalised +lamp/train/lamp_0074_normalised +lamp/train/lamp_0028_normalised +lamp/train/lamp_0054_normalised +lamp/train/lamp_0122_normalised +lamp/train/lamp_0044_normalised +lamp/train/lamp_0036_normalised +lamp/train/lamp_0102_normalised +lamp/train/lamp_0001_normalised +lamp/train/lamp_0037_normalised +lamp/train/lamp_0117_normalised +lamp/train/lamp_0018_normalised +lamp/train/lamp_0022_normalised +lamp/train/lamp_0017_normalised +lamp/train/lamp_0058_normalised +lamp/train/lamp_0119_normalised +lamp/train/lamp_0076_normalised +lamp/train/lamp_0082_normalised +lamp/train/lamp_0007_normalised +lamp/train/lamp_0029_normalised +lamp/train/lamp_0041_normalised +lamp/train/lamp_0024_normalised +lamp/train/lamp_0089_normalised +lamp/train/lamp_0061_normalised +lamp/train/lamp_0031_normalised +lamp/train/lamp_0059_normalised +lamp/train/lamp_0088_normalised +lamp/train/lamp_0006_normalised +lamp/train/lamp_0120_normalised +lamp/train/lamp_0072_normalised +lamp/train/lamp_0016_normalised +lamp/train/lamp_0053_normalised +lamp/train/lamp_0079_normalised +lamp/train/lamp_0093_normalised +lamp/train/lamp_0063_normalised +lamp/train/lamp_0103_normalised +lamp/train/lamp_0056_normalised +lamp/train/lamp_0094_normalised +lamp/train/lamp_0090_normalised +lamp/train/lamp_0048_normalised +lamp/train/lamp_0066_normalised +lamp/train/lamp_0057_normalised +lamp/train/lamp_0068_normalised +lamp/train/lamp_0084_normalised +lamp/train/lamp_0110_normalised +lamp/train/lamp_0100_normalised +lamp/train/lamp_0013_normalised +lamp/train/lamp_0008_normalised +lamp/train/lamp_0030_normalised +lamp/train/lamp_0107_normalised +lamp/train/lamp_0047_normalised +lamp/train/lamp_0073_normalised +lamp/train/lamp_0038_normalised +lamp/train/lamp_0095_normalised +lamp/train/lamp_0019_normalised +lamp/train/lamp_0087_normalised +lamp/train/lamp_0027_normalised +lamp/train/lamp_0098_normalised +lamp/train/lamp_0078_normalised +lamp/train/lamp_0111_normalised +lamp/train/lamp_0085_normalised +lamp/train/lamp_0032_normalised +lamp/train/lamp_0083_normalised +lamp/train/lamp_0091_normalised +lamp/test/lamp_0139_normalised +lamp/test/lamp_0137_normalised +lamp/test/lamp_0141_normalised +lamp/test/lamp_0128_normalised +lamp/test/lamp_0135_normalised +lamp/test/lamp_0136_normalised +lamp/test/lamp_0129_normalised +lamp/test/lamp_0130_normalised +lamp/test/lamp_0134_normalised +lamp/test/lamp_0125_normalised +lamp/test/lamp_0133_normalised +lamp/test/lamp_0143_normalised +lamp/test/lamp_0132_normalised +lamp/test/lamp_0140_normalised +lamp/test/lamp_0127_normalised +lamp/test/lamp_0138_normalised +lamp/test/lamp_0131_normalised +lamp/test/lamp_0126_normalised +lamp/test/lamp_0142_normalised +lamp/test/lamp_0144_normalised +sofa/train/sofa_0524_normalised +sofa/train/sofa_0266_normalised +sofa/train/sofa_0231_normalised +sofa/train/sofa_0603_normalised +sofa/train/sofa_0213_normalised +sofa/train/sofa_0302_normalised +sofa/train/sofa_0363_normalised +sofa/train/sofa_0321_normalised +sofa/train/sofa_0250_normalised +sofa/train/sofa_0580_normalised +sofa/train/sofa_0500_normalised +sofa/train/sofa_0598_normalised +sofa/train/sofa_0254_normalised +sofa/train/sofa_0138_normalised +sofa/train/sofa_0563_normalised +sofa/train/sofa_0523_normalised +sofa/train/sofa_0463_normalised +sofa/train/sofa_0480_normalised +sofa/train/sofa_0495_normalised +sofa/train/sofa_0600_normalised +sofa/train/sofa_0605_normalised +sofa/train/sofa_0537_normalised +sofa/train/sofa_0064_normalised +sofa/train/sofa_0437_normalised +sofa/train/sofa_0140_normalised +sofa/train/sofa_0207_normalised +sofa/train/sofa_0271_normalised +sofa/train/sofa_0420_normalised +sofa/train/sofa_0583_normalised +sofa/train/sofa_0101_normalised +sofa/train/sofa_0335_normalised +sofa/train/sofa_0072_normalised +sofa/train/sofa_0385_normalised +sofa/train/sofa_0134_normalised +sofa/train/sofa_0499_normalised +sofa/train/sofa_0431_normalised +sofa/train/sofa_0505_normalised +sofa/train/sofa_0105_normalised +sofa/train/sofa_0085_normalised +sofa/train/sofa_0533_normalised +sofa/train/sofa_0285_normalised +sofa/train/sofa_0208_normalised +sofa/train/sofa_0453_normalised +sofa/train/sofa_0538_normalised +sofa/train/sofa_0375_normalised +sofa/train/sofa_0651_normalised +sofa/train/sofa_0123_normalised +sofa/train/sofa_0568_normalised +sofa/train/sofa_0345_normalised +sofa/train/sofa_0159_normalised +sofa/train/sofa_0104_normalised +sofa/train/sofa_0057_normalised +sofa/train/sofa_0676_normalised +sofa/train/sofa_0026_normalised +sofa/train/sofa_0680_normalised +sofa/train/sofa_0476_normalised +sofa/train/sofa_0395_normalised +sofa/train/sofa_0181_normalised +sofa/train/sofa_0392_normalised +sofa/train/sofa_0263_normalised +sofa/train/sofa_0403_normalised +sofa/train/sofa_0016_normalised +sofa/train/sofa_0434_normalised +sofa/train/sofa_0402_normalised +sofa/train/sofa_0135_normalised +sofa/train/sofa_0358_normalised +sofa/train/sofa_0655_normalised +sofa/train/sofa_0005_normalised +sofa/train/sofa_0577_normalised +sofa/train/sofa_0474_normalised +sofa/train/sofa_0338_normalised +sofa/train/sofa_0118_normalised +sofa/train/sofa_0667_normalised +sofa/train/sofa_0212_normalised +sofa/train/sofa_0449_normalised +sofa/train/sofa_0226_normalised +sofa/train/sofa_0107_normalised +sofa/train/sofa_0171_normalised +sofa/train/sofa_0289_normalised +sofa/train/sofa_0306_normalised +sofa/train/sofa_0531_normalised +sofa/train/sofa_0184_normalised +sofa/train/sofa_0498_normalised +sofa/train/sofa_0071_normalised +sofa/train/sofa_0004_normalised +sofa/train/sofa_0478_normalised +sofa/train/sofa_0633_normalised +sofa/train/sofa_0574_normalised +sofa/train/sofa_0415_normalised +sofa/train/sofa_0643_normalised +sofa/train/sofa_0006_normalised +sofa/train/sofa_0047_normalised +sofa/train/sofa_0336_normalised +sofa/train/sofa_0330_normalised +sofa/train/sofa_0548_normalised +sofa/train/sofa_0187_normalised +sofa/train/sofa_0354_normalised +sofa/train/sofa_0236_normalised +sofa/train/sofa_0353_normalised +sofa/train/sofa_0562_normalised +sofa/train/sofa_0086_normalised +sofa/train/sofa_0364_normalised +sofa/train/sofa_0074_normalised +sofa/train/sofa_0111_normalised +sofa/train/sofa_0219_normalised +sofa/train/sofa_0002_normalised +sofa/train/sofa_0240_normalised +sofa/train/sofa_0235_normalised +sofa/train/sofa_0220_normalised +sofa/train/sofa_0146_normalised +sofa/train/sofa_0648_normalised +sofa/train/sofa_0114_normalised +sofa/train/sofa_0261_normalised +sofa/train/sofa_0397_normalised +sofa/train/sofa_0625_normalised +sofa/train/sofa_0435_normalised +sofa/train/sofa_0063_normalised +sofa/train/sofa_0637_normalised +sofa/train/sofa_0339_normalised +sofa/train/sofa_0060_normalised +sofa/train/sofa_0329_normalised +sofa/train/sofa_0148_normalised +sofa/train/sofa_0630_normalised +sofa/train/sofa_0645_normalised +sofa/train/sofa_0209_normalised +sofa/train/sofa_0416_normalised +sofa/train/sofa_0546_normalised +sofa/train/sofa_0445_normalised +sofa/train/sofa_0594_normalised +sofa/train/sofa_0305_normalised +sofa/train/sofa_0639_normalised +sofa/train/sofa_0507_normalised +sofa/train/sofa_0555_normalised +sofa/train/sofa_0422_normalised +sofa/train/sofa_0620_normalised +sofa/train/sofa_0539_normalised +sofa/train/sofa_0659_normalised +sofa/train/sofa_0334_normalised +sofa/train/sofa_0485_normalised +sofa/train/sofa_0188_normalised +sofa/train/sofa_0356_normalised +sofa/train/sofa_0095_normalised +sofa/train/sofa_0242_normalised +sofa/train/sofa_0526_normalised +sofa/train/sofa_0227_normalised +sofa/train/sofa_0357_normalised +sofa/train/sofa_0052_normalised +sofa/train/sofa_0039_normalised +sofa/train/sofa_0493_normalised +sofa/train/sofa_0458_normalised +sofa/train/sofa_0679_normalised +sofa/train/sofa_0650_normalised +sofa/train/sofa_0253_normalised +sofa/train/sofa_0588_normalised +sofa/train/sofa_0021_normalised +sofa/train/sofa_0670_normalised +sofa/train/sofa_0618_normalised +sofa/train/sofa_0328_normalised +sofa/train/sofa_0280_normalised +sofa/train/sofa_0319_normalised +sofa/train/sofa_0121_normalised +sofa/train/sofa_0178_normalised +sofa/train/sofa_0582_normalised +sofa/train/sofa_0668_normalised +sofa/train/sofa_0264_normalised +sofa/train/sofa_0126_normalised +sofa/train/sofa_0469_normalised +sofa/train/sofa_0077_normalised +sofa/train/sofa_0491_normalised +sofa/train/sofa_0003_normalised +sofa/train/sofa_0542_normalised +sofa/train/sofa_0438_normalised +sofa/train/sofa_0108_normalised +sofa/train/sofa_0520_normalised +sofa/train/sofa_0015_normalised +sofa/train/sofa_0406_normalised +sofa/train/sofa_0619_normalised +sofa/train/sofa_0366_normalised +sofa/train/sofa_0087_normalised +sofa/train/sofa_0565_normalised +sofa/train/sofa_0622_normalised +sofa/train/sofa_0534_normalised +sofa/train/sofa_0599_normalised +sofa/train/sofa_0048_normalised +sofa/train/sofa_0669_normalised +sofa/train/sofa_0545_normalised +sofa/train/sofa_0607_normalised +sofa/train/sofa_0117_normalised +sofa/train/sofa_0233_normalised +sofa/train/sofa_0200_normalised +sofa/train/sofa_0251_normalised +sofa/train/sofa_0125_normalised +sofa/train/sofa_0404_normalised +sofa/train/sofa_0094_normalised +sofa/train/sofa_0008_normalised +sofa/train/sofa_0410_normalised +sofa/train/sofa_0165_normalised +sofa/train/sofa_0279_normalised +sofa/train/sofa_0372_normalised +sofa/train/sofa_0059_normalised +sofa/train/sofa_0230_normalised +sofa/train/sofa_0528_normalised +sofa/train/sofa_0036_normalised +sofa/train/sofa_0567_normalised +sofa/train/sofa_0274_normalised +sofa/train/sofa_0082_normalised +sofa/train/sofa_0061_normalised +sofa/train/sofa_0044_normalised +sofa/train/sofa_0023_normalised +sofa/train/sofa_0423_normalised +sofa/train/sofa_0647_normalised +sofa/train/sofa_0483_normalised +sofa/train/sofa_0326_normalised +sofa/train/sofa_0624_normalised +sofa/train/sofa_0193_normalised +sofa/train/sofa_0374_normalised +sofa/train/sofa_0183_normalised +sofa/train/sofa_0443_normalised +sofa/train/sofa_0065_normalised +sofa/train/sofa_0079_normalised +sofa/train/sofa_0459_normalised +sofa/train/sofa_0020_normalised +sofa/train/sofa_0387_normalised +sofa/train/sofa_0382_normalised +sofa/train/sofa_0653_normalised +sofa/train/sofa_0166_normalised +sofa/train/sofa_0649_normalised +sofa/train/sofa_0391_normalised +sofa/train/sofa_0228_normalised +sofa/train/sofa_0269_normalised +sofa/train/sofa_0216_normalised +sofa/train/sofa_0475_normalised +sofa/train/sofa_0652_normalised +sofa/train/sofa_0572_normalised +sofa/train/sofa_0056_normalised +sofa/train/sofa_0656_normalised +sofa/train/sofa_0465_normalised +sofa/train/sofa_0013_normalised +sofa/train/sofa_0284_normalised +sofa/train/sofa_0073_normalised +sofa/train/sofa_0189_normalised +sofa/train/sofa_0031_normalised +sofa/train/sofa_0610_normalised +sofa/train/sofa_0303_normalised +sofa/train/sofa_0540_normalised +sofa/train/sofa_0185_normalised +sofa/train/sofa_0393_normalised +sofa/train/sofa_0448_normalised +sofa/train/sofa_0578_normalised +sofa/train/sofa_0130_normalised +sofa/train/sofa_0611_normalised +sofa/train/sofa_0143_normalised +sofa/train/sofa_0541_normalised +sofa/train/sofa_0218_normalised +sofa/train/sofa_0313_normalised +sofa/train/sofa_0509_normalised +sofa/train/sofa_0199_normalised +sofa/train/sofa_0139_normalised +sofa/train/sofa_0232_normalised +sofa/train/sofa_0112_normalised +sofa/train/sofa_0055_normalised +sofa/train/sofa_0262_normalised +sofa/train/sofa_0592_normalised +sofa/train/sofa_0311_normalised +sofa/train/sofa_0037_normalised +sofa/train/sofa_0497_normalised +sofa/train/sofa_0151_normalised +sofa/train/sofa_0535_normalised +sofa/train/sofa_0191_normalised +sofa/train/sofa_0051_normalised +sofa/train/sofa_0482_normalised +sofa/train/sofa_0045_normalised +sofa/train/sofa_0040_normalised +sofa/train/sofa_0247_normalised +sofa/train/sofa_0342_normalised +sofa/train/sofa_0341_normalised +sofa/train/sofa_0672_normalised +sofa/train/sofa_0384_normalised +sofa/train/sofa_0564_normalised +sofa/train/sofa_0323_normalised +sofa/train/sofa_0286_normalised +sofa/train/sofa_0029_normalised +sofa/train/sofa_0355_normalised +sofa/train/sofa_0514_normalised +sofa/train/sofa_0456_normalised +sofa/train/sofa_0506_normalised +sofa/train/sofa_0025_normalised +sofa/train/sofa_0246_normalised +sofa/train/sofa_0634_normalised +sofa/train/sofa_0440_normalised +sofa/train/sofa_0383_normalised +sofa/train/sofa_0359_normalised +sofa/train/sofa_0141_normalised +sofa/train/sofa_0642_normalised +sofa/train/sofa_0549_normalised +sofa/train/sofa_0615_normalised +sofa/train/sofa_0129_normalised +sofa/train/sofa_0237_normalised +sofa/train/sofa_0333_normalised +sofa/train/sofa_0593_normalised +sofa/train/sofa_0462_normalised +sofa/train/sofa_0373_normalised +sofa/train/sofa_0490_normalised +sofa/train/sofa_0277_normalised +sofa/train/sofa_0194_normalised +sofa/train/sofa_0602_normalised +sofa/train/sofa_0290_normalised +sofa/train/sofa_0217_normalised +sofa/train/sofa_0124_normalised +sofa/train/sofa_0042_normalised +sofa/train/sofa_0252_normalised +sofa/train/sofa_0612_normalised +sofa/train/sofa_0557_normalised +sofa/train/sofa_0584_normalised +sofa/train/sofa_0314_normalised +sofa/train/sofa_0152_normalised +sofa/train/sofa_0024_normalised +sofa/train/sofa_0128_normalised +sofa/train/sofa_0674_normalised +sofa/train/sofa_0346_normalised +sofa/train/sofa_0399_normalised +sofa/train/sofa_0489_normalised +sofa/train/sofa_0267_normalised +sofa/train/sofa_0521_normalised +sofa/train/sofa_0309_normalised +sofa/train/sofa_0405_normalised +sofa/train/sofa_0283_normalised +sofa/train/sofa_0433_normalised +sofa/train/sofa_0481_normalised +sofa/train/sofa_0089_normalised +sofa/train/sofa_0041_normalised +sofa/train/sofa_0110_normalised +sofa/train/sofa_0627_normalised +sofa/train/sofa_0424_normalised +sofa/train/sofa_0102_normalised +sofa/train/sofa_0075_normalised +sofa/train/sofa_0398_normalised +sofa/train/sofa_0512_normalised +sofa/train/sofa_0278_normalised +sofa/train/sofa_0367_normalised +sofa/train/sofa_0062_normalised +sofa/train/sofa_0461_normalised +sofa/train/sofa_0205_normalised +sofa/train/sofa_0394_normalised +sofa/train/sofa_0202_normalised +sofa/train/sofa_0249_normalised +sofa/train/sofa_0517_normalised +sofa/train/sofa_0597_normalised +sofa/train/sofa_0487_normalised +sofa/train/sofa_0457_normalised +sofa/train/sofa_0030_normalised +sofa/train/sofa_0093_normalised +sofa/train/sofa_0631_normalised +sofa/train/sofa_0477_normalised +sofa/train/sofa_0301_normalised +sofa/train/sofa_0516_normalised +sofa/train/sofa_0617_normalised +sofa/train/sofa_0378_normalised +sofa/train/sofa_0273_normalised +sofa/train/sofa_0221_normalised +sofa/train/sofa_0147_normalised +sofa/train/sofa_0558_normalised +sofa/train/sofa_0629_normalised +sofa/train/sofa_0070_normalised +sofa/train/sofa_0590_normalised +sofa/train/sofa_0100_normalised +sofa/train/sofa_0408_normalised +sofa/train/sofa_0352_normalised +sofa/train/sofa_0197_normalised +sofa/train/sofa_0662_normalised +sofa/train/sofa_0310_normalised +sofa/train/sofa_0164_normalised +sofa/train/sofa_0362_normalised +sofa/train/sofa_0360_normalised +sofa/train/sofa_0451_normalised +sofa/train/sofa_0131_normalised +sofa/train/sofa_0376_normalised +sofa/train/sofa_0556_normalised +sofa/train/sofa_0587_normalised +sofa/train/sofa_0413_normalised +sofa/train/sofa_0348_normalised +sofa/train/sofa_0054_normalised +sofa/train/sofa_0017_normalised +sofa/train/sofa_0479_normalised +sofa/train/sofa_0460_normalised +sofa/train/sofa_0494_normalised +sofa/train/sofa_0179_normalised +sofa/train/sofa_0613_normalised +sofa/train/sofa_0419_normalised +sofa/train/sofa_0503_normalised +sofa/train/sofa_0007_normalised +sofa/train/sofa_0661_normalised +sofa/train/sofa_0340_normalised +sofa/train/sofa_0081_normalised +sofa/train/sofa_0349_normalised +sofa/train/sofa_0604_normalised +sofa/train/sofa_0043_normalised +sofa/train/sofa_0665_normalised +sofa/train/sofa_0069_normalised +sofa/train/sofa_0088_normalised +sofa/train/sofa_0400_normalised +sofa/train/sofa_0484_normalised +sofa/train/sofa_0522_normalised +sofa/train/sofa_0170_normalised +sofa/train/sofa_0255_normalised +sofa/train/sofa_0673_normalised +sofa/train/sofa_0272_normalised +sofa/train/sofa_0421_normalised +sofa/train/sofa_0259_normalised +sofa/train/sofa_0174_normalised +sofa/train/sofa_0244_normalised +sofa/train/sofa_0436_normalised +sofa/train/sofa_0426_normalised +sofa/train/sofa_0473_normalised +sofa/train/sofa_0163_normalised +sofa/train/sofa_0215_normalised +sofa/train/sofa_0245_normalised +sofa/train/sofa_0192_normalised +sofa/train/sofa_0257_normalised +sofa/train/sofa_0173_normalised +sofa/train/sofa_0229_normalised +sofa/train/sofa_0115_normalised +sofa/train/sofa_0103_normalised +sofa/train/sofa_0586_normalised +sofa/train/sofa_0097_normalised +sofa/train/sofa_0204_normalised +sofa/train/sofa_0132_normalised +sofa/train/sofa_0621_normalised +sofa/train/sofa_0136_normalised +sofa/train/sofa_0109_normalised +sofa/train/sofa_0053_normalised +sofa/train/sofa_0282_normalised +sofa/train/sofa_0569_normalised +sofa/train/sofa_0502_normalised +sofa/train/sofa_0452_normalised +sofa/train/sofa_0033_normalised +sofa/train/sofa_0084_normalised +sofa/train/sofa_0401_normalised +sofa/train/sofa_0609_normalised +sofa/train/sofa_0046_normalised +sofa/train/sofa_0090_normalised +sofa/train/sofa_0315_normalised +sofa/train/sofa_0122_normalised +sofa/train/sofa_0468_normalised +sofa/train/sofa_0447_normalised +sofa/train/sofa_0022_normalised +sofa/train/sofa_0012_normalised +sofa/train/sofa_0585_normalised +sofa/train/sofa_0488_normalised +sofa/train/sofa_0646_normalised +sofa/train/sofa_0552_normalised +sofa/train/sofa_0028_normalised +sofa/train/sofa_0496_normalised +sofa/train/sofa_0096_normalised +sofa/train/sofa_0144_normalised +sofa/train/sofa_0471_normalised +sofa/train/sofa_0553_normalised +sofa/train/sofa_0579_normalised +sofa/train/sofa_0331_normalised +sofa/train/sofa_0145_normalised +sofa/train/sofa_0492_normalised +sofa/train/sofa_0455_normalised +sofa/train/sofa_0176_normalised +sofa/train/sofa_0570_normalised +sofa/train/sofa_0172_normalised +sofa/train/sofa_0317_normalised +sofa/train/sofa_0550_normalised +sofa/train/sofa_0304_normalised +sofa/train/sofa_0291_normalised +sofa/train/sofa_0377_normalised +sofa/train/sofa_0196_normalised +sofa/train/sofa_0238_normalised +sofa/train/sofa_0616_normalised +sofa/train/sofa_0657_normalised +sofa/train/sofa_0265_normalised +sofa/train/sofa_0091_normalised +sofa/train/sofa_0160_normalised +sofa/train/sofa_0596_normalised +sofa/train/sofa_0295_normalised +sofa/train/sofa_0268_normalised +sofa/train/sofa_0581_normalised +sofa/train/sofa_0554_normalised +sofa/train/sofa_0677_normalised +sofa/train/sofa_0560_normalised +sofa/train/sofa_0472_normalised +sofa/train/sofa_0142_normalised +sofa/train/sofa_0664_normalised +sofa/train/sofa_0010_normalised +sofa/train/sofa_0425_normalised +sofa/train/sofa_0258_normalised +sofa/train/sofa_0429_normalised +sofa/train/sofa_0396_normalised +sofa/train/sofa_0066_normalised +sofa/train/sofa_0276_normalised +sofa/train/sofa_0660_normalised +sofa/train/sofa_0351_normalised +sofa/train/sofa_0466_normalised +sofa/train/sofa_0098_normalised +sofa/train/sofa_0544_normalised +sofa/train/sofa_0663_normalised +sofa/train/sofa_0626_normalised +sofa/train/sofa_0380_normalised +sofa/train/sofa_0379_normalised +sofa/train/sofa_0292_normalised +sofa/train/sofa_0195_normalised +sofa/train/sofa_0641_normalised +sofa/train/sofa_0049_normalised +sofa/train/sofa_0606_normalised +sofa/train/sofa_0644_normalised +sofa/train/sofa_0133_normalised +sofa/train/sofa_0322_normalised +sofa/train/sofa_0636_normalised +sofa/train/sofa_0337_normalised +sofa/train/sofa_0409_normalised +sofa/train/sofa_0654_normalised +sofa/train/sofa_0324_normalised +sofa/train/sofa_0318_normalised +sofa/train/sofa_0518_normalised +sofa/train/sofa_0470_normalised +sofa/train/sofa_0510_normalised +sofa/train/sofa_0666_normalised +sofa/train/sofa_0344_normalised +sofa/train/sofa_0224_normalised +sofa/train/sofa_0325_normalised +sofa/train/sofa_0464_normalised +sofa/train/sofa_0083_normalised +sofa/train/sofa_0559_normalised +sofa/train/sofa_0038_normalised +sofa/train/sofa_0206_normalised +sofa/train/sofa_0106_normalised +sofa/train/sofa_0001_normalised +sofa/train/sofa_0671_normalised +sofa/train/sofa_0361_normalised +sofa/train/sofa_0035_normalised +sofa/train/sofa_0256_normalised +sofa/train/sofa_0407_normalised +sofa/train/sofa_0180_normalised +sofa/train/sofa_0234_normalised +sofa/train/sofa_0628_normalised +sofa/train/sofa_0561_normalised +sofa/train/sofa_0508_normalised +sofa/train/sofa_0211_normalised +sofa/train/sofa_0511_normalised +sofa/train/sofa_0248_normalised +sofa/train/sofa_0299_normalised +sofa/train/sofa_0504_normalised +sofa/train/sofa_0182_normalised +sofa/train/sofa_0446_normalised +sofa/train/sofa_0149_normalised +sofa/train/sofa_0225_normalised +sofa/train/sofa_0638_normalised +sofa/train/sofa_0412_normalised +sofa/train/sofa_0536_normalised +sofa/train/sofa_0177_normalised +sofa/train/sofa_0241_normalised +sofa/train/sofa_0127_normalised +sofa/train/sofa_0203_normalised +sofa/train/sofa_0614_normalised +sofa/train/sofa_0078_normalised +sofa/train/sofa_0427_normalised +sofa/train/sofa_0167_normalised +sofa/train/sofa_0566_normalised +sofa/train/sofa_0525_normalised +sofa/train/sofa_0486_normalised +sofa/train/sofa_0009_normalised +sofa/train/sofa_0386_normalised +sofa/train/sofa_0595_normalised +sofa/train/sofa_0067_normalised +sofa/train/sofa_0608_normalised +sofa/train/sofa_0370_normalised +sofa/train/sofa_0576_normalised +sofa/train/sofa_0307_normalised +sofa/train/sofa_0034_normalised +sofa/train/sofa_0371_normalised +sofa/train/sofa_0388_normalised +sofa/train/sofa_0210_normalised +sofa/train/sofa_0418_normalised +sofa/train/sofa_0092_normalised +sofa/train/sofa_0300_normalised +sofa/train/sofa_0260_normalised +sofa/train/sofa_0454_normalised +sofa/train/sofa_0365_normalised +sofa/train/sofa_0154_normalised +sofa/train/sofa_0529_normalised +sofa/train/sofa_0158_normalised +sofa/train/sofa_0501_normalised +sofa/train/sofa_0519_normalised +sofa/train/sofa_0411_normalised +sofa/train/sofa_0543_normalised +sofa/train/sofa_0186_normalised +sofa/train/sofa_0113_normalised +sofa/train/sofa_0287_normalised +sofa/train/sofa_0678_normalised +sofa/train/sofa_0120_normalised +sofa/train/sofa_0050_normalised +sofa/train/sofa_0417_normalised +sofa/train/sofa_0532_normalised +sofa/train/sofa_0281_normalised +sofa/train/sofa_0018_normalised +sofa/train/sofa_0161_normalised +sofa/train/sofa_0601_normalised +sofa/train/sofa_0442_normalised +sofa/train/sofa_0347_normalised +sofa/train/sofa_0156_normalised +sofa/train/sofa_0175_normalised +sofa/train/sofa_0573_normalised +sofa/train/sofa_0116_normalised +sofa/train/sofa_0513_normalised +sofa/train/sofa_0428_normalised +sofa/train/sofa_0439_normalised +sofa/train/sofa_0623_normalised +sofa/train/sofa_0011_normalised +sofa/train/sofa_0239_normalised +sofa/train/sofa_0275_normalised +sofa/train/sofa_0288_normalised +sofa/train/sofa_0589_normalised +sofa/train/sofa_0293_normalised +sofa/train/sofa_0308_normalised +sofa/train/sofa_0223_normalised +sofa/train/sofa_0270_normalised +sofa/train/sofa_0389_normalised +sofa/train/sofa_0316_normalised +sofa/train/sofa_0153_normalised +sofa/train/sofa_0530_normalised +sofa/train/sofa_0201_normalised +sofa/train/sofa_0327_normalised +sofa/train/sofa_0169_normalised +sofa/train/sofa_0591_normalised +sofa/train/sofa_0441_normalised +sofa/train/sofa_0320_normalised +sofa/train/sofa_0168_normalised +sofa/train/sofa_0551_normalised +sofa/train/sofa_0155_normalised +sofa/train/sofa_0332_normalised +sofa/train/sofa_0150_normalised +sofa/train/sofa_0369_normalised +sofa/train/sofa_0467_normalised +sofa/train/sofa_0019_normalised +sofa/train/sofa_0032_normalised +sofa/train/sofa_0222_normalised +sofa/train/sofa_0527_normalised +sofa/train/sofa_0635_normalised +sofa/train/sofa_0430_normalised +sofa/train/sofa_0444_normalised +sofa/train/sofa_0190_normalised +sofa/train/sofa_0099_normalised +sofa/train/sofa_0632_normalised +sofa/train/sofa_0571_normalised +sofa/train/sofa_0137_normalised +sofa/train/sofa_0298_normalised +sofa/train/sofa_0214_normalised +sofa/train/sofa_0068_normalised +sofa/train/sofa_0368_normalised +sofa/train/sofa_0658_normalised +sofa/train/sofa_0414_normalised +sofa/train/sofa_0381_normalised +sofa/train/sofa_0547_normalised +sofa/train/sofa_0390_normalised +sofa/train/sofa_0432_normalised +sofa/train/sofa_0675_normalised +sofa/train/sofa_0312_normalised +sofa/train/sofa_0162_normalised +sofa/train/sofa_0076_normalised +sofa/train/sofa_0294_normalised +sofa/train/sofa_0297_normalised +sofa/train/sofa_0350_normalised +sofa/train/sofa_0243_normalised +sofa/train/sofa_0014_normalised +sofa/train/sofa_0080_normalised +sofa/train/sofa_0450_normalised +sofa/train/sofa_0575_normalised +sofa/train/sofa_0157_normalised +sofa/train/sofa_0027_normalised +sofa/train/sofa_0119_normalised +sofa/train/sofa_0296_normalised +sofa/train/sofa_0343_normalised +sofa/train/sofa_0198_normalised +sofa/train/sofa_0058_normalised +sofa/train/sofa_0515_normalised +sofa/train/sofa_0640_normalised +sofa/test/sofa_0772_normalised +sofa/test/sofa_0776_normalised +sofa/test/sofa_0716_normalised +sofa/test/sofa_0768_normalised +sofa/test/sofa_0748_normalised +sofa/test/sofa_0758_normalised +sofa/test/sofa_0727_normalised +sofa/test/sofa_0732_normalised +sofa/test/sofa_0715_normalised +sofa/test/sofa_0756_normalised +sofa/test/sofa_0746_normalised +sofa/test/sofa_0742_normalised +sofa/test/sofa_0702_normalised +sofa/test/sofa_0688_normalised +sofa/test/sofa_0769_normalised +sofa/test/sofa_0696_normalised +sofa/test/sofa_0744_normalised +sofa/test/sofa_0681_normalised +sofa/test/sofa_0767_normalised +sofa/test/sofa_0749_normalised +sofa/test/sofa_0694_normalised +sofa/test/sofa_0712_normalised +sofa/test/sofa_0736_normalised +sofa/test/sofa_0773_normalised +sofa/test/sofa_0684_normalised +sofa/test/sofa_0762_normalised +sofa/test/sofa_0697_normalised +sofa/test/sofa_0764_normalised +sofa/test/sofa_0738_normalised +sofa/test/sofa_0754_normalised +sofa/test/sofa_0775_normalised +sofa/test/sofa_0720_normalised +sofa/test/sofa_0745_normalised +sofa/test/sofa_0771_normalised +sofa/test/sofa_0719_normalised +sofa/test/sofa_0710_normalised +sofa/test/sofa_0774_normalised +sofa/test/sofa_0692_normalised +sofa/test/sofa_0778_normalised +sofa/test/sofa_0709_normalised +sofa/test/sofa_0760_normalised +sofa/test/sofa_0699_normalised +sofa/test/sofa_0714_normalised +sofa/test/sofa_0734_normalised +sofa/test/sofa_0777_normalised +sofa/test/sofa_0713_normalised +sofa/test/sofa_0698_normalised +sofa/test/sofa_0780_normalised +sofa/test/sofa_0779_normalised +sofa/test/sofa_0705_normalised +sofa/test/sofa_0750_normalised +sofa/test/sofa_0726_normalised +sofa/test/sofa_0689_normalised +sofa/test/sofa_0691_normalised +sofa/test/sofa_0721_normalised +sofa/test/sofa_0770_normalised +sofa/test/sofa_0761_normalised +sofa/test/sofa_0741_normalised +sofa/test/sofa_0733_normalised +sofa/test/sofa_0693_normalised +sofa/test/sofa_0740_normalised +sofa/test/sofa_0683_normalised +sofa/test/sofa_0751_normalised +sofa/test/sofa_0682_normalised +sofa/test/sofa_0722_normalised +sofa/test/sofa_0704_normalised +sofa/test/sofa_0703_normalised +sofa/test/sofa_0747_normalised +sofa/test/sofa_0686_normalised +sofa/test/sofa_0728_normalised +sofa/test/sofa_0701_normalised +sofa/test/sofa_0735_normalised +sofa/test/sofa_0690_normalised +sofa/test/sofa_0755_normalised +sofa/test/sofa_0757_normalised +sofa/test/sofa_0695_normalised +sofa/test/sofa_0718_normalised +sofa/test/sofa_0730_normalised +sofa/test/sofa_0723_normalised +sofa/test/sofa_0725_normalised +sofa/test/sofa_0759_normalised +sofa/test/sofa_0711_normalised +sofa/test/sofa_0763_normalised +sofa/test/sofa_0731_normalised +sofa/test/sofa_0739_normalised +sofa/test/sofa_0707_normalised +sofa/test/sofa_0765_normalised +sofa/test/sofa_0753_normalised +sofa/test/sofa_0717_normalised +sofa/test/sofa_0743_normalised +sofa/test/sofa_0766_normalised +sofa/test/sofa_0729_normalised +sofa/test/sofa_0706_normalised +sofa/test/sofa_0752_normalised +sofa/test/sofa_0687_normalised +sofa/test/sofa_0724_normalised +sofa/test/sofa_0700_normalised +sofa/test/sofa_0685_normalised +sofa/test/sofa_0708_normalised +sofa/test/sofa_0737_normalised +wardrobe/train/wardrobe_0074_normalised +wardrobe/train/wardrobe_0086_normalised +wardrobe/train/wardrobe_0012_normalised +wardrobe/train/wardrobe_0010_normalised +wardrobe/train/wardrobe_0015_normalised +wardrobe/train/wardrobe_0077_normalised +wardrobe/train/wardrobe_0085_normalised +wardrobe/train/wardrobe_0014_normalised +wardrobe/train/wardrobe_0019_normalised +wardrobe/train/wardrobe_0024_normalised +wardrobe/train/wardrobe_0007_normalised +wardrobe/train/wardrobe_0061_normalised +wardrobe/train/wardrobe_0072_normalised +wardrobe/train/wardrobe_0023_normalised +wardrobe/train/wardrobe_0049_normalised +wardrobe/train/wardrobe_0037_normalised +wardrobe/train/wardrobe_0082_normalised +wardrobe/train/wardrobe_0033_normalised +wardrobe/train/wardrobe_0016_normalised +wardrobe/train/wardrobe_0047_normalised +wardrobe/train/wardrobe_0050_normalised +wardrobe/train/wardrobe_0028_normalised +wardrobe/train/wardrobe_0025_normalised +wardrobe/train/wardrobe_0038_normalised +wardrobe/train/wardrobe_0079_normalised +wardrobe/train/wardrobe_0066_normalised +wardrobe/train/wardrobe_0045_normalised +wardrobe/train/wardrobe_0070_normalised +wardrobe/train/wardrobe_0055_normalised +wardrobe/train/wardrobe_0043_normalised +wardrobe/train/wardrobe_0059_normalised +wardrobe/train/wardrobe_0075_normalised +wardrobe/train/wardrobe_0040_normalised +wardrobe/train/wardrobe_0060_normalised +wardrobe/train/wardrobe_0056_normalised +wardrobe/train/wardrobe_0002_normalised +wardrobe/train/wardrobe_0036_normalised +wardrobe/train/wardrobe_0084_normalised +wardrobe/train/wardrobe_0022_normalised +wardrobe/train/wardrobe_0062_normalised +wardrobe/train/wardrobe_0065_normalised +wardrobe/train/wardrobe_0001_normalised +wardrobe/train/wardrobe_0013_normalised +wardrobe/train/wardrobe_0020_normalised +wardrobe/train/wardrobe_0021_normalised +wardrobe/train/wardrobe_0034_normalised +wardrobe/train/wardrobe_0017_normalised +wardrobe/train/wardrobe_0067_normalised +wardrobe/train/wardrobe_0026_normalised +wardrobe/train/wardrobe_0004_normalised +wardrobe/train/wardrobe_0054_normalised +wardrobe/train/wardrobe_0032_normalised +wardrobe/train/wardrobe_0081_normalised +wardrobe/train/wardrobe_0027_normalised +wardrobe/train/wardrobe_0078_normalised +wardrobe/train/wardrobe_0058_normalised +wardrobe/train/wardrobe_0057_normalised +wardrobe/train/wardrobe_0046_normalised +wardrobe/train/wardrobe_0052_normalised +wardrobe/train/wardrobe_0005_normalised +wardrobe/train/wardrobe_0029_normalised +wardrobe/train/wardrobe_0053_normalised +wardrobe/train/wardrobe_0018_normalised +wardrobe/train/wardrobe_0006_normalised +wardrobe/train/wardrobe_0064_normalised +wardrobe/train/wardrobe_0030_normalised +wardrobe/train/wardrobe_0051_normalised +wardrobe/train/wardrobe_0073_normalised +wardrobe/train/wardrobe_0009_normalised +wardrobe/train/wardrobe_0003_normalised +wardrobe/train/wardrobe_0048_normalised +wardrobe/train/wardrobe_0044_normalised +wardrobe/train/wardrobe_0071_normalised +wardrobe/train/wardrobe_0031_normalised +wardrobe/train/wardrobe_0042_normalised +wardrobe/train/wardrobe_0035_normalised +wardrobe/train/wardrobe_0011_normalised +wardrobe/train/wardrobe_0080_normalised +wardrobe/train/wardrobe_0087_normalised +wardrobe/train/wardrobe_0039_normalised +wardrobe/train/wardrobe_0068_normalised +wardrobe/train/wardrobe_0041_normalised +wardrobe/train/wardrobe_0083_normalised +wardrobe/train/wardrobe_0008_normalised +wardrobe/train/wardrobe_0076_normalised +wardrobe/train/wardrobe_0069_normalised +wardrobe/train/wardrobe_0063_normalised +wardrobe/test/wardrobe_0091_normalised +wardrobe/test/wardrobe_0094_normalised +wardrobe/test/wardrobe_0099_normalised +wardrobe/test/wardrobe_0101_normalised +wardrobe/test/wardrobe_0096_normalised +wardrobe/test/wardrobe_0100_normalised +wardrobe/test/wardrobe_0104_normalised +wardrobe/test/wardrobe_0092_normalised +wardrobe/test/wardrobe_0090_normalised +wardrobe/test/wardrobe_0093_normalised +wardrobe/test/wardrobe_0097_normalised +wardrobe/test/wardrobe_0098_normalised +wardrobe/test/wardrobe_0088_normalised +wardrobe/test/wardrobe_0105_normalised +wardrobe/test/wardrobe_0095_normalised +wardrobe/test/wardrobe_0103_normalised +wardrobe/test/wardrobe_0106_normalised +wardrobe/test/wardrobe_0089_normalised +wardrobe/test/wardrobe_0107_normalised +wardrobe/test/wardrobe_0102_normalised +radio/train/radio_0022_normalised +radio/train/radio_0072_normalised +radio/train/radio_0042_normalised +radio/train/radio_0060_normalised +radio/train/radio_0078_normalised +radio/train/radio_0047_normalised +radio/train/radio_0013_normalised +radio/train/radio_0057_normalised +radio/train/radio_0053_normalised +radio/train/radio_0011_normalised +radio/train/radio_0069_normalised +radio/train/radio_0050_normalised +radio/train/radio_0081_normalised +radio/train/radio_0071_normalised +radio/train/radio_0064_normalised +radio/train/radio_0087_normalised +radio/train/radio_0076_normalised +radio/train/radio_0009_normalised +radio/train/radio_0018_normalised +radio/train/radio_0096_normalised +radio/train/radio_0049_normalised +radio/train/radio_0093_normalised +radio/train/radio_0017_normalised +radio/train/radio_0027_normalised +radio/train/radio_0070_normalised +radio/train/radio_0051_normalised +radio/train/radio_0065_normalised +radio/train/radio_0073_normalised +radio/train/radio_0041_normalised +radio/train/radio_0068_normalised +radio/train/radio_0037_normalised +radio/train/radio_0010_normalised +radio/train/radio_0089_normalised +radio/train/radio_0092_normalised +radio/train/radio_0094_normalised +radio/train/radio_0025_normalised +radio/train/radio_0036_normalised +radio/train/radio_0062_normalised +radio/train/radio_0035_normalised +radio/train/radio_0032_normalised +radio/train/radio_0012_normalised +radio/train/radio_0067_normalised +radio/train/radio_0052_normalised +radio/train/radio_0014_normalised +radio/train/radio_0034_normalised +radio/train/radio_0088_normalised +radio/train/radio_0048_normalised +radio/train/radio_0005_normalised +radio/train/radio_0100_normalised +radio/train/radio_0055_normalised +radio/train/radio_0075_normalised +radio/train/radio_0084_normalised +radio/train/radio_0097_normalised +radio/train/radio_0061_normalised +radio/train/radio_0024_normalised +radio/train/radio_0045_normalised +radio/train/radio_0031_normalised +radio/train/radio_0002_normalised +radio/train/radio_0038_normalised +radio/train/radio_0020_normalised +radio/train/radio_0079_normalised +radio/train/radio_0026_normalised +radio/train/radio_0101_normalised +radio/train/radio_0040_normalised +radio/train/radio_0044_normalised +radio/train/radio_0015_normalised +radio/train/radio_0063_normalised +radio/train/radio_0016_normalised +radio/train/radio_0023_normalised +radio/train/radio_0104_normalised +radio/train/radio_0029_normalised +radio/train/radio_0056_normalised +radio/train/radio_0030_normalised +radio/train/radio_0043_normalised +radio/train/radio_0028_normalised +radio/train/radio_0006_normalised +radio/train/radio_0082_normalised +radio/train/radio_0086_normalised +radio/train/radio_0008_normalised +radio/train/radio_0091_normalised +radio/train/radio_0095_normalised +radio/train/radio_0083_normalised +radio/train/radio_0004_normalised +radio/train/radio_0001_normalised +radio/train/radio_0066_normalised +radio/train/radio_0102_normalised +radio/train/radio_0033_normalised +radio/train/radio_0080_normalised +radio/train/radio_0090_normalised +radio/train/radio_0021_normalised +radio/train/radio_0074_normalised +radio/train/radio_0007_normalised +radio/train/radio_0103_normalised +radio/train/radio_0077_normalised +radio/train/radio_0099_normalised +radio/train/radio_0085_normalised +radio/train/radio_0098_normalised +radio/train/radio_0058_normalised +radio/train/radio_0039_normalised +radio/train/radio_0019_normalised +radio/train/radio_0059_normalised +radio/train/radio_0054_normalised +radio/train/radio_0046_normalised +radio/train/radio_0003_normalised +radio/test/radio_0107_normalised +radio/test/radio_0105_normalised +radio/test/radio_0122_normalised +radio/test/radio_0118_normalised +radio/test/radio_0120_normalised +radio/test/radio_0115_normalised +radio/test/radio_0110_normalised +radio/test/radio_0111_normalised +radio/test/radio_0112_normalised +radio/test/radio_0106_normalised +radio/test/radio_0117_normalised +radio/test/radio_0119_normalised +radio/test/radio_0116_normalised +radio/test/radio_0113_normalised +radio/test/radio_0124_normalised +radio/test/radio_0121_normalised +radio/test/radio_0109_normalised +radio/test/radio_0123_normalised +radio/test/radio_0114_normalised +radio/test/radio_0108_normalised +desk/train/desk_0186_normalised +desk/train/desk_0118_normalised +desk/train/desk_0033_normalised +desk/train/desk_0150_normalised +desk/train/desk_0134_normalised +desk/train/desk_0108_normalised +desk/train/desk_0054_normalised +desk/train/desk_0135_normalised +desk/train/desk_0085_normalised +desk/train/desk_0195_normalised +desk/train/desk_0055_normalised +desk/train/desk_0151_normalised +desk/train/desk_0167_normalised +desk/train/desk_0194_normalised +desk/train/desk_0073_normalised +desk/train/desk_0072_normalised +desk/train/desk_0007_normalised +desk/train/desk_0193_normalised +desk/train/desk_0173_normalised +desk/train/desk_0096_normalised +desk/train/desk_0030_normalised +desk/train/desk_0017_normalised +desk/train/desk_0112_normalised +desk/train/desk_0076_normalised +desk/train/desk_0180_normalised +desk/train/desk_0149_normalised +desk/train/desk_0025_normalised +desk/train/desk_0058_normalised +desk/train/desk_0046_normalised +desk/train/desk_0075_normalised +desk/train/desk_0120_normalised +desk/train/desk_0015_normalised +desk/train/desk_0115_normalised +desk/train/desk_0061_normalised +desk/train/desk_0140_normalised +desk/train/desk_0021_normalised +desk/train/desk_0121_normalised +desk/train/desk_0141_normalised +desk/train/desk_0164_normalised +desk/train/desk_0091_normalised +desk/train/desk_0142_normalised +desk/train/desk_0041_normalised +desk/train/desk_0093_normalised +desk/train/desk_0089_normalised +desk/train/desk_0138_normalised +desk/train/desk_0044_normalised +desk/train/desk_0132_normalised +desk/train/desk_0047_normalised +desk/train/desk_0152_normalised +desk/train/desk_0080_normalised +desk/train/desk_0040_normalised +desk/train/desk_0029_normalised +desk/train/desk_0181_normalised +desk/train/desk_0156_normalised +desk/train/desk_0070_normalised +desk/train/desk_0069_normalised +desk/train/desk_0155_normalised +desk/train/desk_0063_normalised +desk/train/desk_0146_normalised +desk/train/desk_0147_normalised +desk/train/desk_0107_normalised +desk/train/desk_0159_normalised +desk/train/desk_0060_normalised +desk/train/desk_0162_normalised +desk/train/desk_0187_normalised +desk/train/desk_0067_normalised +desk/train/desk_0011_normalised +desk/train/desk_0090_normalised +desk/train/desk_0006_normalised +desk/train/desk_0013_normalised +desk/train/desk_0008_normalised +desk/train/desk_0144_normalised +desk/train/desk_0192_normalised +desk/train/desk_0074_normalised +desk/train/desk_0104_normalised +desk/train/desk_0010_normalised +desk/train/desk_0016_normalised +desk/train/desk_0071_normalised +desk/train/desk_0053_normalised +desk/train/desk_0145_normalised +desk/train/desk_0003_normalised +desk/train/desk_0028_normalised +desk/train/desk_0139_normalised +desk/train/desk_0137_normalised +desk/train/desk_0117_normalised +desk/train/desk_0099_normalised +desk/train/desk_0189_normalised +desk/train/desk_0034_normalised +desk/train/desk_0157_normalised +desk/train/desk_0051_normalised +desk/train/desk_0166_normalised +desk/train/desk_0042_normalised +desk/train/desk_0065_normalised +desk/train/desk_0116_normalised +desk/train/desk_0178_normalised +desk/train/desk_0057_normalised +desk/train/desk_0123_normalised +desk/train/desk_0056_normalised +desk/train/desk_0004_normalised +desk/train/desk_0161_normalised +desk/train/desk_0185_normalised +desk/train/desk_0168_normalised +desk/train/desk_0066_normalised +desk/train/desk_0174_normalised +desk/train/desk_0172_normalised +desk/train/desk_0027_normalised +desk/train/desk_0111_normalised +desk/train/desk_0095_normalised +desk/train/desk_0110_normalised +desk/train/desk_0024_normalised +desk/train/desk_0086_normalised +desk/train/desk_0133_normalised +desk/train/desk_0188_normalised +desk/train/desk_0052_normalised +desk/train/desk_0154_normalised +desk/train/desk_0128_normalised +desk/train/desk_0098_normalised +desk/train/desk_0169_normalised +desk/train/desk_0196_normalised +desk/train/desk_0002_normalised +desk/train/desk_0106_normalised +desk/train/desk_0198_normalised +desk/train/desk_0023_normalised +desk/train/desk_0020_normalised +desk/train/desk_0005_normalised +desk/train/desk_0026_normalised +desk/train/desk_0114_normalised +desk/train/desk_0190_normalised +desk/train/desk_0082_normalised +desk/train/desk_0163_normalised +desk/train/desk_0200_normalised +desk/train/desk_0126_normalised +desk/train/desk_0177_normalised +desk/train/desk_0009_normalised +desk/train/desk_0045_normalised +desk/train/desk_0038_normalised +desk/train/desk_0092_normalised +desk/train/desk_0131_normalised +desk/train/desk_0001_normalised +desk/train/desk_0083_normalised +desk/train/desk_0059_normalised +desk/train/desk_0102_normalised +desk/train/desk_0100_normalised +desk/train/desk_0018_normalised +desk/train/desk_0014_normalised +desk/train/desk_0032_normalised +desk/train/desk_0165_normalised +desk/train/desk_0048_normalised +desk/train/desk_0022_normalised +desk/train/desk_0077_normalised +desk/train/desk_0068_normalised +desk/train/desk_0122_normalised +desk/train/desk_0019_normalised +desk/train/desk_0160_normalised +desk/train/desk_0136_normalised +desk/train/desk_0050_normalised +desk/train/desk_0153_normalised +desk/train/desk_0191_normalised +desk/train/desk_0143_normalised +desk/train/desk_0094_normalised +desk/train/desk_0199_normalised +desk/train/desk_0012_normalised +desk/train/desk_0097_normalised +desk/train/desk_0037_normalised +desk/train/desk_0062_normalised +desk/train/desk_0039_normalised +desk/train/desk_0158_normalised +desk/train/desk_0049_normalised +desk/train/desk_0130_normalised +desk/train/desk_0182_normalised +desk/train/desk_0064_normalised +desk/train/desk_0125_normalised +desk/train/desk_0129_normalised +desk/train/desk_0170_normalised +desk/train/desk_0084_normalised +desk/train/desk_0109_normalised +desk/train/desk_0148_normalised +desk/train/desk_0079_normalised +desk/train/desk_0124_normalised +desk/train/desk_0043_normalised +desk/train/desk_0197_normalised +desk/train/desk_0087_normalised +desk/train/desk_0088_normalised +desk/train/desk_0031_normalised +desk/train/desk_0081_normalised +desk/train/desk_0113_normalised +desk/train/desk_0103_normalised +desk/train/desk_0127_normalised +desk/train/desk_0036_normalised +desk/train/desk_0176_normalised +desk/train/desk_0175_normalised +desk/train/desk_0101_normalised +desk/train/desk_0171_normalised +desk/train/desk_0119_normalised +desk/train/desk_0105_normalised +desk/train/desk_0035_normalised +desk/train/desk_0179_normalised +desk/train/desk_0078_normalised +desk/train/desk_0184_normalised +desk/train/desk_0183_normalised +desk/test/desk_0284_normalised +desk/test/desk_0207_normalised +desk/test/desk_0206_normalised +desk/test/desk_0225_normalised +desk/test/desk_0232_normalised +desk/test/desk_0233_normalised +desk/test/desk_0230_normalised +desk/test/desk_0286_normalised +desk/test/desk_0215_normalised +desk/test/desk_0266_normalised +desk/test/desk_0265_normalised +desk/test/desk_0223_normalised +desk/test/desk_0231_normalised +desk/test/desk_0242_normalised +desk/test/desk_0262_normalised +desk/test/desk_0282_normalised +desk/test/desk_0210_normalised +desk/test/desk_0213_normalised +desk/test/desk_0261_normalised +desk/test/desk_0280_normalised +desk/test/desk_0276_normalised +desk/test/desk_0243_normalised +desk/test/desk_0221_normalised +desk/test/desk_0235_normalised +desk/test/desk_0249_normalised +desk/test/desk_0205_normalised +desk/test/desk_0267_normalised +desk/test/desk_0256_normalised +desk/test/desk_0255_normalised +desk/test/desk_0278_normalised +desk/test/desk_0229_normalised +desk/test/desk_0245_normalised +desk/test/desk_0250_normalised +desk/test/desk_0239_normalised +desk/test/desk_0263_normalised +desk/test/desk_0244_normalised +desk/test/desk_0271_normalised +desk/test/desk_0264_normalised +desk/test/desk_0257_normalised +desk/test/desk_0202_normalised +desk/test/desk_0279_normalised +desk/test/desk_0252_normalised +desk/test/desk_0238_normalised +desk/test/desk_0220_normalised +desk/test/desk_0237_normalised +desk/test/desk_0277_normalised +desk/test/desk_0224_normalised +desk/test/desk_0227_normalised +desk/test/desk_0272_normalised +desk/test/desk_0240_normalised +desk/test/desk_0234_normalised +desk/test/desk_0273_normalised +desk/test/desk_0269_normalised +desk/test/desk_0254_normalised +desk/test/desk_0283_normalised +desk/test/desk_0260_normalised +desk/test/desk_0217_normalised +desk/test/desk_0209_normalised +desk/test/desk_0241_normalised +desk/test/desk_0204_normalised +desk/test/desk_0247_normalised +desk/test/desk_0222_normalised +desk/test/desk_0253_normalised +desk/test/desk_0219_normalised +desk/test/desk_0251_normalised +desk/test/desk_0208_normalised +desk/test/desk_0248_normalised +desk/test/desk_0281_normalised +desk/test/desk_0285_normalised +desk/test/desk_0246_normalised +desk/test/desk_0228_normalised +desk/test/desk_0270_normalised +desk/test/desk_0216_normalised +desk/test/desk_0226_normalised +desk/test/desk_0211_normalised +desk/test/desk_0259_normalised +desk/test/desk_0236_normalised +desk/test/desk_0258_normalised +desk/test/desk_0275_normalised +desk/test/desk_0212_normalised +desk/test/desk_0201_normalised +desk/test/desk_0268_normalised +desk/test/desk_0218_normalised +desk/test/desk_0203_normalised +desk/test/desk_0274_normalised +desk/test/desk_0214_normalised +bench/train/bench_0063_normalised +bench/train/bench_0144_normalised +bench/train/bench_0019_normalised +bench/train/bench_0105_normalised +bench/train/bench_0168_normalised +bench/train/bench_0031_normalised +bench/train/bench_0150_normalised +bench/train/bench_0037_normalised +bench/train/bench_0104_normalised +bench/train/bench_0092_normalised +bench/train/bench_0064_normalised +bench/train/bench_0161_normalised +bench/train/bench_0079_normalised +bench/train/bench_0044_normalised +bench/train/bench_0159_normalised +bench/train/bench_0007_normalised +bench/train/bench_0084_normalised +bench/train/bench_0162_normalised +bench/train/bench_0123_normalised +bench/train/bench_0001_normalised +bench/train/bench_0032_normalised +bench/train/bench_0076_normalised +bench/train/bench_0061_normalised +bench/train/bench_0110_normalised +bench/train/bench_0028_normalised +bench/train/bench_0027_normalised +bench/train/bench_0067_normalised +bench/train/bench_0117_normalised +bench/train/bench_0033_normalised +bench/train/bench_0109_normalised +bench/train/bench_0060_normalised +bench/train/bench_0021_normalised +bench/train/bench_0081_normalised +bench/train/bench_0003_normalised +bench/train/bench_0170_normalised +bench/train/bench_0121_normalised +bench/train/bench_0077_normalised +bench/train/bench_0053_normalised +bench/train/bench_0035_normalised +bench/train/bench_0038_normalised +bench/train/bench_0062_normalised +bench/train/bench_0074_normalised +bench/train/bench_0142_normalised +bench/train/bench_0139_normalised +bench/train/bench_0154_normalised +bench/train/bench_0112_normalised +bench/train/bench_0138_normalised +bench/train/bench_0041_normalised +bench/train/bench_0029_normalised +bench/train/bench_0127_normalised +bench/train/bench_0120_normalised +bench/train/bench_0030_normalised +bench/train/bench_0080_normalised +bench/train/bench_0111_normalised +bench/train/bench_0141_normalised +bench/train/bench_0039_normalised +bench/train/bench_0075_normalised +bench/train/bench_0164_normalised +bench/train/bench_0069_normalised +bench/train/bench_0088_normalised +bench/train/bench_0136_normalised +bench/train/bench_0086_normalised +bench/train/bench_0051_normalised +bench/train/bench_0114_normalised +bench/train/bench_0129_normalised +bench/train/bench_0113_normalised +bench/train/bench_0101_normalised +bench/train/bench_0010_normalised +bench/train/bench_0128_normalised +bench/train/bench_0055_normalised +bench/train/bench_0025_normalised +bench/train/bench_0135_normalised +bench/train/bench_0071_normalised +bench/train/bench_0146_normalised +bench/train/bench_0002_normalised +bench/train/bench_0026_normalised +bench/train/bench_0005_normalised +bench/train/bench_0068_normalised +bench/train/bench_0169_normalised +bench/train/bench_0148_normalised +bench/train/bench_0022_normalised +bench/train/bench_0059_normalised +bench/train/bench_0158_normalised +bench/train/bench_0049_normalised +bench/train/bench_0100_normalised +bench/train/bench_0057_normalised +bench/train/bench_0134_normalised +bench/train/bench_0004_normalised +bench/train/bench_0133_normalised +bench/train/bench_0153_normalised +bench/train/bench_0118_normalised +bench/train/bench_0045_normalised +bench/train/bench_0165_normalised +bench/train/bench_0006_normalised +bench/train/bench_0107_normalised +bench/train/bench_0125_normalised +bench/train/bench_0155_normalised +bench/train/bench_0151_normalised +bench/train/bench_0008_normalised +bench/train/bench_0157_normalised +bench/train/bench_0073_normalised +bench/train/bench_0012_normalised +bench/train/bench_0172_normalised +bench/train/bench_0013_normalised +bench/train/bench_0137_normalised +bench/train/bench_0108_normalised +bench/train/bench_0023_normalised +bench/train/bench_0095_normalised +bench/train/bench_0072_normalised +bench/train/bench_0089_normalised +bench/train/bench_0091_normalised +bench/train/bench_0046_normalised +bench/train/bench_0147_normalised +bench/train/bench_0098_normalised +bench/train/bench_0016_normalised +bench/train/bench_0011_normalised +bench/train/bench_0152_normalised +bench/train/bench_0160_normalised +bench/train/bench_0103_normalised +bench/train/bench_0082_normalised +bench/train/bench_0171_normalised +bench/train/bench_0042_normalised +bench/train/bench_0099_normalised +bench/train/bench_0078_normalised +bench/train/bench_0050_normalised +bench/train/bench_0173_normalised +bench/train/bench_0102_normalised +bench/train/bench_0052_normalised +bench/train/bench_0167_normalised +bench/train/bench_0131_normalised +bench/train/bench_0149_normalised +bench/train/bench_0070_normalised +bench/train/bench_0119_normalised +bench/train/bench_0058_normalised +bench/train/bench_0126_normalised +bench/train/bench_0017_normalised +bench/train/bench_0036_normalised +bench/train/bench_0093_normalised +bench/train/bench_0065_normalised +bench/train/bench_0143_normalised +bench/train/bench_0106_normalised +bench/train/bench_0048_normalised +bench/train/bench_0020_normalised +bench/train/bench_0115_normalised +bench/train/bench_0015_normalised +bench/train/bench_0122_normalised +bench/train/bench_0094_normalised +bench/train/bench_0083_normalised +bench/train/bench_0116_normalised +bench/train/bench_0132_normalised +bench/train/bench_0040_normalised +bench/train/bench_0054_normalised +bench/train/bench_0163_normalised +bench/train/bench_0018_normalised +bench/train/bench_0047_normalised +bench/train/bench_0066_normalised +bench/train/bench_0156_normalised +bench/train/bench_0043_normalised +bench/train/bench_0056_normalised +bench/train/bench_0090_normalised +bench/train/bench_0087_normalised +bench/train/bench_0085_normalised +bench/train/bench_0024_normalised +bench/train/bench_0009_normalised +bench/train/bench_0124_normalised +bench/train/bench_0014_normalised +bench/train/bench_0097_normalised +bench/train/bench_0096_normalised +bench/train/bench_0166_normalised +bench/train/bench_0034_normalised +bench/train/bench_0140_normalised +bench/train/bench_0130_normalised +bench/train/bench_0145_normalised +bench/test/bench_0185_normalised +bench/test/bench_0187_normalised +bench/test/bench_0188_normalised +bench/test/bench_0175_normalised +bench/test/bench_0191_normalised +bench/test/bench_0177_normalised +bench/test/bench_0189_normalised +bench/test/bench_0193_normalised +bench/test/bench_0184_normalised +bench/test/bench_0181_normalised +bench/test/bench_0178_normalised +bench/test/bench_0183_normalised +bench/test/bench_0192_normalised +bench/test/bench_0182_normalised +bench/test/bench_0186_normalised +bench/test/bench_0174_normalised +bench/test/bench_0176_normalised +bench/test/bench_0180_normalised +bench/test/bench_0190_normalised +bench/test/bench_0179_normalised +glass_box/train/glass_box_0102_normalised +glass_box/train/glass_box_0067_normalised +glass_box/train/glass_box_0097_normalised +glass_box/train/glass_box_0164_normalised +glass_box/train/glass_box_0129_normalised +glass_box/train/glass_box_0028_normalised +glass_box/train/glass_box_0146_normalised +glass_box/train/glass_box_0014_normalised +glass_box/train/glass_box_0095_normalised +glass_box/train/glass_box_0110_normalised +glass_box/train/glass_box_0012_normalised +glass_box/train/glass_box_0112_normalised +glass_box/train/glass_box_0064_normalised +glass_box/train/glass_box_0143_normalised +glass_box/train/glass_box_0073_normalised +glass_box/train/glass_box_0091_normalised +glass_box/train/glass_box_0034_normalised +glass_box/train/glass_box_0043_normalised +glass_box/train/glass_box_0153_normalised +glass_box/train/glass_box_0145_normalised +glass_box/train/glass_box_0054_normalised +glass_box/train/glass_box_0128_normalised +glass_box/train/glass_box_0055_normalised +glass_box/train/glass_box_0010_normalised +glass_box/train/glass_box_0045_normalised +glass_box/train/glass_box_0025_normalised +glass_box/train/glass_box_0044_normalised +glass_box/train/glass_box_0060_normalised +glass_box/train/glass_box_0160_normalised +glass_box/train/glass_box_0011_normalised +glass_box/train/glass_box_0133_normalised +glass_box/train/glass_box_0068_normalised +glass_box/train/glass_box_0047_normalised +glass_box/train/glass_box_0116_normalised +glass_box/train/glass_box_0070_normalised +glass_box/train/glass_box_0057_normalised +glass_box/train/glass_box_0168_normalised +glass_box/train/glass_box_0032_normalised +glass_box/train/glass_box_0078_normalised +glass_box/train/glass_box_0001_normalised +glass_box/train/glass_box_0086_normalised +glass_box/train/glass_box_0120_normalised +glass_box/train/glass_box_0131_normalised +glass_box/train/glass_box_0138_normalised +glass_box/train/glass_box_0111_normalised +glass_box/train/glass_box_0050_normalised +glass_box/train/glass_box_0104_normalised +glass_box/train/glass_box_0135_normalised +glass_box/train/glass_box_0088_normalised +glass_box/train/glass_box_0109_normalised +glass_box/train/glass_box_0121_normalised +glass_box/train/glass_box_0106_normalised +glass_box/train/glass_box_0094_normalised +glass_box/train/glass_box_0136_normalised +glass_box/train/glass_box_0051_normalised +glass_box/train/glass_box_0006_normalised +glass_box/train/glass_box_0130_normalised +glass_box/train/glass_box_0027_normalised +glass_box/train/glass_box_0161_normalised +glass_box/train/glass_box_0148_normalised +glass_box/train/glass_box_0018_normalised +glass_box/train/glass_box_0020_normalised +glass_box/train/glass_box_0141_normalised +glass_box/train/glass_box_0167_normalised +glass_box/train/glass_box_0035_normalised +glass_box/train/glass_box_0132_normalised +glass_box/train/glass_box_0118_normalised +glass_box/train/glass_box_0125_normalised +glass_box/train/glass_box_0056_normalised +glass_box/train/glass_box_0037_normalised +glass_box/train/glass_box_0165_normalised +glass_box/train/glass_box_0009_normalised +glass_box/train/glass_box_0147_normalised +glass_box/train/glass_box_0126_normalised +glass_box/train/glass_box_0123_normalised +glass_box/train/glass_box_0149_normalised +glass_box/train/glass_box_0085_normalised +glass_box/train/glass_box_0092_normalised +glass_box/train/glass_box_0157_normalised +glass_box/train/glass_box_0099_normalised +glass_box/train/glass_box_0005_normalised +glass_box/train/glass_box_0049_normalised +glass_box/train/glass_box_0140_normalised +glass_box/train/glass_box_0053_normalised +glass_box/train/glass_box_0019_normalised +glass_box/train/glass_box_0156_normalised +glass_box/train/glass_box_0058_normalised +glass_box/train/glass_box_0062_normalised +glass_box/train/glass_box_0013_normalised +glass_box/train/glass_box_0087_normalised +glass_box/train/glass_box_0038_normalised +glass_box/train/glass_box_0096_normalised +glass_box/train/glass_box_0040_normalised +glass_box/train/glass_box_0101_normalised +glass_box/train/glass_box_0036_normalised +glass_box/train/glass_box_0021_normalised +glass_box/train/glass_box_0003_normalised +glass_box/train/glass_box_0100_normalised +glass_box/train/glass_box_0155_normalised +glass_box/train/glass_box_0124_normalised +glass_box/train/glass_box_0079_normalised +glass_box/train/glass_box_0139_normalised +glass_box/train/glass_box_0127_normalised +glass_box/train/glass_box_0016_normalised +glass_box/train/glass_box_0090_normalised +glass_box/train/glass_box_0084_normalised +glass_box/train/glass_box_0075_normalised +glass_box/train/glass_box_0115_normalised +glass_box/train/glass_box_0082_normalised +glass_box/train/glass_box_0048_normalised +glass_box/train/glass_box_0076_normalised +glass_box/train/glass_box_0066_normalised +glass_box/train/glass_box_0170_normalised +glass_box/train/glass_box_0105_normalised +glass_box/train/glass_box_0113_normalised +glass_box/train/glass_box_0029_normalised +glass_box/train/glass_box_0030_normalised +glass_box/train/glass_box_0142_normalised +glass_box/train/glass_box_0083_normalised +glass_box/train/glass_box_0004_normalised +glass_box/train/glass_box_0144_normalised +glass_box/train/glass_box_0152_normalised +glass_box/train/glass_box_0081_normalised +glass_box/train/glass_box_0151_normalised +glass_box/train/glass_box_0169_normalised +glass_box/train/glass_box_0046_normalised +glass_box/train/glass_box_0089_normalised +glass_box/train/glass_box_0134_normalised +glass_box/train/glass_box_0069_normalised +glass_box/train/glass_box_0158_normalised +glass_box/train/glass_box_0166_normalised +glass_box/train/glass_box_0002_normalised +glass_box/train/glass_box_0162_normalised +glass_box/train/glass_box_0119_normalised +glass_box/train/glass_box_0017_normalised +glass_box/train/glass_box_0098_normalised +glass_box/train/glass_box_0072_normalised +glass_box/train/glass_box_0077_normalised +glass_box/train/glass_box_0026_normalised +glass_box/train/glass_box_0071_normalised +glass_box/train/glass_box_0107_normalised +glass_box/train/glass_box_0042_normalised +glass_box/train/glass_box_0015_normalised +glass_box/train/glass_box_0039_normalised +glass_box/train/glass_box_0052_normalised +glass_box/train/glass_box_0093_normalised +glass_box/train/glass_box_0033_normalised +glass_box/train/glass_box_0063_normalised +glass_box/train/glass_box_0150_normalised +glass_box/train/glass_box_0074_normalised +glass_box/train/glass_box_0171_normalised +glass_box/train/glass_box_0024_normalised +glass_box/train/glass_box_0041_normalised +glass_box/train/glass_box_0103_normalised +glass_box/train/glass_box_0007_normalised +glass_box/train/glass_box_0114_normalised +glass_box/train/glass_box_0108_normalised +glass_box/train/glass_box_0122_normalised +glass_box/train/glass_box_0022_normalised +glass_box/train/glass_box_0008_normalised +glass_box/train/glass_box_0059_normalised +glass_box/train/glass_box_0154_normalised +glass_box/train/glass_box_0080_normalised +glass_box/train/glass_box_0137_normalised +glass_box/train/glass_box_0159_normalised +glass_box/train/glass_box_0117_normalised +glass_box/train/glass_box_0065_normalised +glass_box/train/glass_box_0061_normalised +glass_box/train/glass_box_0163_normalised +glass_box/train/glass_box_0031_normalised +glass_box/train/glass_box_0023_normalised +glass_box/test/glass_box_0248_normalised +glass_box/test/glass_box_0194_normalised +glass_box/test/glass_box_0236_normalised +glass_box/test/glass_box_0234_normalised +glass_box/test/glass_box_0249_normalised +glass_box/test/glass_box_0178_normalised +glass_box/test/glass_box_0244_normalised +glass_box/test/glass_box_0243_normalised +glass_box/test/glass_box_0192_normalised +glass_box/test/glass_box_0200_normalised +glass_box/test/glass_box_0263_normalised +glass_box/test/glass_box_0267_normalised +glass_box/test/glass_box_0270_normalised +glass_box/test/glass_box_0221_normalised +glass_box/test/glass_box_0257_normalised +glass_box/test/glass_box_0226_normalised +glass_box/test/glass_box_0176_normalised +glass_box/test/glass_box_0182_normalised +glass_box/test/glass_box_0254_normalised +glass_box/test/glass_box_0224_normalised +glass_box/test/glass_box_0232_normalised +glass_box/test/glass_box_0213_normalised +glass_box/test/glass_box_0247_normalised +glass_box/test/glass_box_0225_normalised +glass_box/test/glass_box_0231_normalised +glass_box/test/glass_box_0205_normalised +glass_box/test/glass_box_0198_normalised +glass_box/test/glass_box_0260_normalised +glass_box/test/glass_box_0174_normalised +glass_box/test/glass_box_0262_normalised +glass_box/test/glass_box_0269_normalised +glass_box/test/glass_box_0229_normalised +glass_box/test/glass_box_0172_normalised +glass_box/test/glass_box_0210_normalised +glass_box/test/glass_box_0251_normalised +glass_box/test/glass_box_0265_normalised +glass_box/test/glass_box_0238_normalised +glass_box/test/glass_box_0183_normalised +glass_box/test/glass_box_0204_normalised +glass_box/test/glass_box_0252_normalised +glass_box/test/glass_box_0206_normalised +glass_box/test/glass_box_0175_normalised +glass_box/test/glass_box_0235_normalised +glass_box/test/glass_box_0237_normalised +glass_box/test/glass_box_0214_normalised +glass_box/test/glass_box_0179_normalised +glass_box/test/glass_box_0228_normalised +glass_box/test/glass_box_0181_normalised +glass_box/test/glass_box_0242_normalised +glass_box/test/glass_box_0193_normalised +glass_box/test/glass_box_0261_normalised +glass_box/test/glass_box_0268_normalised +glass_box/test/glass_box_0180_normalised +glass_box/test/glass_box_0255_normalised +glass_box/test/glass_box_0245_normalised +glass_box/test/glass_box_0203_normalised +glass_box/test/glass_box_0202_normalised +glass_box/test/glass_box_0266_normalised +glass_box/test/glass_box_0208_normalised +glass_box/test/glass_box_0230_normalised +glass_box/test/glass_box_0216_normalised +glass_box/test/glass_box_0184_normalised +glass_box/test/glass_box_0190_normalised +glass_box/test/glass_box_0222_normalised +glass_box/test/glass_box_0240_normalised +glass_box/test/glass_box_0271_normalised +glass_box/test/glass_box_0253_normalised +glass_box/test/glass_box_0212_normalised +glass_box/test/glass_box_0197_normalised +glass_box/test/glass_box_0199_normalised +glass_box/test/glass_box_0188_normalised +glass_box/test/glass_box_0241_normalised +glass_box/test/glass_box_0227_normalised +glass_box/test/glass_box_0196_normalised +glass_box/test/glass_box_0219_normalised +glass_box/test/glass_box_0223_normalised +glass_box/test/glass_box_0187_normalised +glass_box/test/glass_box_0211_normalised +glass_box/test/glass_box_0217_normalised +glass_box/test/glass_box_0220_normalised +glass_box/test/glass_box_0177_normalised +glass_box/test/glass_box_0258_normalised +glass_box/test/glass_box_0246_normalised +glass_box/test/glass_box_0195_normalised +glass_box/test/glass_box_0250_normalised +glass_box/test/glass_box_0256_normalised +glass_box/test/glass_box_0173_normalised +glass_box/test/glass_box_0215_normalised +glass_box/test/glass_box_0239_normalised +glass_box/test/glass_box_0185_normalised +glass_box/test/glass_box_0209_normalised +glass_box/test/glass_box_0207_normalised +glass_box/test/glass_box_0264_normalised +glass_box/test/glass_box_0259_normalised +glass_box/test/glass_box_0191_normalised +glass_box/test/glass_box_0233_normalised +glass_box/test/glass_box_0189_normalised +glass_box/test/glass_box_0218_normalised +glass_box/test/glass_box_0201_normalised +glass_box/test/glass_box_0186_normalised +laptop/train/laptop_0057_normalised +laptop/train/laptop_0054_normalised +laptop/train/laptop_0037_normalised +laptop/train/laptop_0036_normalised +laptop/train/laptop_0141_normalised +laptop/train/laptop_0091_normalised +laptop/train/laptop_0117_normalised +laptop/train/laptop_0060_normalised +laptop/train/laptop_0132_normalised +laptop/train/laptop_0038_normalised +laptop/train/laptop_0148_normalised +laptop/train/laptop_0085_normalised +laptop/train/laptop_0084_normalised +laptop/train/laptop_0118_normalised +laptop/train/laptop_0107_normalised +laptop/train/laptop_0120_normalised +laptop/train/laptop_0015_normalised +laptop/train/laptop_0131_normalised +laptop/train/laptop_0064_normalised +laptop/train/laptop_0097_normalised +laptop/train/laptop_0014_normalised +laptop/train/laptop_0012_normalised +laptop/train/laptop_0069_normalised +laptop/train/laptop_0047_normalised +laptop/train/laptop_0101_normalised +laptop/train/laptop_0100_normalised +laptop/train/laptop_0125_normalised +laptop/train/laptop_0041_normalised +laptop/train/laptop_0026_normalised +laptop/train/laptop_0113_normalised +laptop/train/laptop_0035_normalised +laptop/train/laptop_0077_normalised +laptop/train/laptop_0090_normalised +laptop/train/laptop_0080_normalised +laptop/train/laptop_0010_normalised +laptop/train/laptop_0095_normalised +laptop/train/laptop_0006_normalised +laptop/train/laptop_0098_normalised +laptop/train/laptop_0031_normalised +laptop/train/laptop_0094_normalised +laptop/train/laptop_0059_normalised +laptop/train/laptop_0106_normalised +laptop/train/laptop_0110_normalised +laptop/train/laptop_0074_normalised +laptop/train/laptop_0023_normalised +laptop/train/laptop_0121_normalised +laptop/train/laptop_0045_normalised +laptop/train/laptop_0053_normalised +laptop/train/laptop_0096_normalised +laptop/train/laptop_0016_normalised +laptop/train/laptop_0022_normalised +laptop/train/laptop_0109_normalised +laptop/train/laptop_0018_normalised +laptop/train/laptop_0149_normalised +laptop/train/laptop_0092_normalised +laptop/train/laptop_0004_normalised +laptop/train/laptop_0008_normalised +laptop/train/laptop_0116_normalised +laptop/train/laptop_0028_normalised +laptop/train/laptop_0020_normalised +laptop/train/laptop_0102_normalised +laptop/train/laptop_0083_normalised +laptop/train/laptop_0055_normalised +laptop/train/laptop_0007_normalised +laptop/train/laptop_0044_normalised +laptop/train/laptop_0071_normalised +laptop/train/laptop_0136_normalised +laptop/train/laptop_0039_normalised +laptop/train/laptop_0133_normalised +laptop/train/laptop_0009_normalised +laptop/train/laptop_0139_normalised +laptop/train/laptop_0013_normalised +laptop/train/laptop_0089_normalised +laptop/train/laptop_0087_normalised +laptop/train/laptop_0128_normalised +laptop/train/laptop_0067_normalised +laptop/train/laptop_0070_normalised +laptop/train/laptop_0073_normalised +laptop/train/laptop_0078_normalised +laptop/train/laptop_0003_normalised +laptop/train/laptop_0017_normalised +laptop/train/laptop_0052_normalised +laptop/train/laptop_0119_normalised +laptop/train/laptop_0140_normalised +laptop/train/laptop_0088_normalised +laptop/train/laptop_0126_normalised +laptop/train/laptop_0081_normalised +laptop/train/laptop_0021_normalised +laptop/train/laptop_0112_normalised +laptop/train/laptop_0033_normalised +laptop/train/laptop_0099_normalised +laptop/train/laptop_0049_normalised +laptop/train/laptop_0063_normalised +laptop/train/laptop_0103_normalised +laptop/train/laptop_0123_normalised +laptop/train/laptop_0142_normalised +laptop/train/laptop_0043_normalised +laptop/train/laptop_0061_normalised +laptop/train/laptop_0048_normalised +laptop/train/laptop_0076_normalised +laptop/train/laptop_0145_normalised +laptop/train/laptop_0122_normalised +laptop/train/laptop_0115_normalised +laptop/train/laptop_0104_normalised +laptop/train/laptop_0034_normalised +laptop/train/laptop_0019_normalised +laptop/train/laptop_0130_normalised +laptop/train/laptop_0050_normalised +laptop/train/laptop_0051_normalised +laptop/train/laptop_0056_normalised +laptop/train/laptop_0001_normalised +laptop/train/laptop_0135_normalised +laptop/train/laptop_0082_normalised +laptop/train/laptop_0093_normalised +laptop/train/laptop_0068_normalised +laptop/train/laptop_0137_normalised +laptop/train/laptop_0029_normalised +laptop/train/laptop_0042_normalised +laptop/train/laptop_0147_normalised +laptop/train/laptop_0075_normalised +laptop/train/laptop_0058_normalised +laptop/train/laptop_0108_normalised +laptop/train/laptop_0134_normalised +laptop/train/laptop_0030_normalised +laptop/train/laptop_0002_normalised +laptop/train/laptop_0143_normalised +laptop/train/laptop_0072_normalised +laptop/train/laptop_0129_normalised +laptop/train/laptop_0025_normalised +laptop/train/laptop_0024_normalised +laptop/train/laptop_0040_normalised +laptop/train/laptop_0114_normalised +laptop/train/laptop_0127_normalised +laptop/train/laptop_0027_normalised +laptop/train/laptop_0011_normalised +laptop/train/laptop_0032_normalised +laptop/train/laptop_0079_normalised +laptop/train/laptop_0066_normalised +laptop/train/laptop_0124_normalised +laptop/train/laptop_0065_normalised +laptop/train/laptop_0138_normalised +laptop/train/laptop_0144_normalised +laptop/train/laptop_0062_normalised +laptop/train/laptop_0146_normalised +laptop/train/laptop_0111_normalised +laptop/train/laptop_0046_normalised +laptop/train/laptop_0086_normalised +laptop/train/laptop_0105_normalised +laptop/train/laptop_0005_normalised +laptop/test/laptop_0153_normalised +laptop/test/laptop_0165_normalised +laptop/test/laptop_0158_normalised +laptop/test/laptop_0154_normalised +laptop/test/laptop_0150_normalised +laptop/test/laptop_0162_normalised +laptop/test/laptop_0169_normalised +laptop/test/laptop_0159_normalised +laptop/test/laptop_0168_normalised +laptop/test/laptop_0164_normalised +laptop/test/laptop_0156_normalised +laptop/test/laptop_0167_normalised +laptop/test/laptop_0155_normalised +laptop/test/laptop_0152_normalised +laptop/test/laptop_0160_normalised +laptop/test/laptop_0161_normalised +laptop/test/laptop_0163_normalised +laptop/test/laptop_0166_normalised +laptop/test/laptop_0151_normalised +laptop/test/laptop_0157_normalised +stairs/train/stairs_0011_normalised +stairs/train/stairs_0058_normalised +stairs/train/stairs_0014_normalised +stairs/train/stairs_0006_normalised +stairs/train/stairs_0110_normalised +stairs/train/stairs_0095_normalised +stairs/train/stairs_0019_normalised +stairs/train/stairs_0024_normalised +stairs/train/stairs_0031_normalised +stairs/train/stairs_0002_normalised +stairs/train/stairs_0077_normalised +stairs/train/stairs_0048_normalised +stairs/train/stairs_0029_normalised +stairs/train/stairs_0123_normalised +stairs/train/stairs_0059_normalised +stairs/train/stairs_0111_normalised +stairs/train/stairs_0004_normalised +stairs/train/stairs_0101_normalised +stairs/train/stairs_0054_normalised +stairs/train/stairs_0020_normalised +stairs/train/stairs_0063_normalised +stairs/train/stairs_0056_normalised +stairs/train/stairs_0082_normalised +stairs/train/stairs_0005_normalised +stairs/train/stairs_0062_normalised +stairs/train/stairs_0040_normalised +stairs/train/stairs_0032_normalised +stairs/train/stairs_0042_normalised +stairs/train/stairs_0086_normalised +stairs/train/stairs_0041_normalised +stairs/train/stairs_0016_normalised +stairs/train/stairs_0023_normalised +stairs/train/stairs_0018_normalised +stairs/train/stairs_0051_normalised +stairs/train/stairs_0008_normalised +stairs/train/stairs_0074_normalised +stairs/train/stairs_0027_normalised +stairs/train/stairs_0116_normalised +stairs/train/stairs_0039_normalised +stairs/train/stairs_0009_normalised +stairs/train/stairs_0114_normalised +stairs/train/stairs_0030_normalised +stairs/train/stairs_0091_normalised +stairs/train/stairs_0047_normalised +stairs/train/stairs_0028_normalised +stairs/train/stairs_0010_normalised +stairs/train/stairs_0088_normalised +stairs/train/stairs_0108_normalised +stairs/train/stairs_0003_normalised +stairs/train/stairs_0055_normalised +stairs/train/stairs_0034_normalised +stairs/train/stairs_0076_normalised +stairs/train/stairs_0122_normalised +stairs/train/stairs_0107_normalised +stairs/train/stairs_0084_normalised +stairs/train/stairs_0036_normalised +stairs/train/stairs_0089_normalised +stairs/train/stairs_0001_normalised +stairs/train/stairs_0121_normalised +stairs/train/stairs_0085_normalised +stairs/train/stairs_0072_normalised +stairs/train/stairs_0113_normalised +stairs/train/stairs_0120_normalised +stairs/train/stairs_0070_normalised +stairs/train/stairs_0021_normalised +stairs/train/stairs_0100_normalised +stairs/train/stairs_0050_normalised +stairs/train/stairs_0022_normalised +stairs/train/stairs_0079_normalised +stairs/train/stairs_0083_normalised +stairs/train/stairs_0049_normalised +stairs/train/stairs_0068_normalised +stairs/train/stairs_0106_normalised +stairs/train/stairs_0078_normalised +stairs/train/stairs_0119_normalised +stairs/train/stairs_0067_normalised +stairs/train/stairs_0065_normalised +stairs/train/stairs_0098_normalised +stairs/train/stairs_0038_normalised +stairs/train/stairs_0017_normalised +stairs/train/stairs_0080_normalised +stairs/train/stairs_0118_normalised +stairs/train/stairs_0060_normalised +stairs/train/stairs_0052_normalised +stairs/train/stairs_0124_normalised +stairs/train/stairs_0015_normalised +stairs/train/stairs_0069_normalised +stairs/train/stairs_0115_normalised +stairs/train/stairs_0046_normalised +stairs/train/stairs_0081_normalised +stairs/train/stairs_0044_normalised +stairs/train/stairs_0043_normalised +stairs/train/stairs_0117_normalised +stairs/train/stairs_0102_normalised +stairs/train/stairs_0066_normalised +stairs/train/stairs_0075_normalised +stairs/train/stairs_0007_normalised +stairs/train/stairs_0035_normalised +stairs/train/stairs_0061_normalised +stairs/train/stairs_0053_normalised +stairs/train/stairs_0026_normalised +stairs/train/stairs_0112_normalised +stairs/train/stairs_0087_normalised +stairs/train/stairs_0037_normalised +stairs/train/stairs_0109_normalised +stairs/train/stairs_0012_normalised +stairs/train/stairs_0105_normalised +stairs/train/stairs_0013_normalised +stairs/train/stairs_0025_normalised +stairs/train/stairs_0097_normalised +stairs/train/stairs_0073_normalised +stairs/train/stairs_0093_normalised +stairs/train/stairs_0090_normalised +stairs/train/stairs_0045_normalised +stairs/train/stairs_0104_normalised +stairs/train/stairs_0092_normalised +stairs/train/stairs_0099_normalised +stairs/train/stairs_0096_normalised +stairs/train/stairs_0071_normalised +stairs/train/stairs_0103_normalised +stairs/train/stairs_0057_normalised +stairs/train/stairs_0064_normalised +stairs/train/stairs_0094_normalised +stairs/train/stairs_0033_normalised +stairs/test/stairs_0131_normalised +stairs/test/stairs_0125_normalised +stairs/test/stairs_0136_normalised +stairs/test/stairs_0133_normalised +stairs/test/stairs_0141_normalised +stairs/test/stairs_0137_normalised +stairs/test/stairs_0142_normalised +stairs/test/stairs_0128_normalised +stairs/test/stairs_0129_normalised +stairs/test/stairs_0135_normalised +stairs/test/stairs_0138_normalised +stairs/test/stairs_0139_normalised +stairs/test/stairs_0132_normalised +stairs/test/stairs_0130_normalised +stairs/test/stairs_0134_normalised +stairs/test/stairs_0143_normalised +stairs/test/stairs_0126_normalised +stairs/test/stairs_0127_normalised +stairs/test/stairs_0140_normalised +stairs/test/stairs_0144_normalised +plant/train/plant_0079_normalised +plant/train/plant_0010_normalised +plant/train/plant_0001_normalised +plant/train/plant_0212_normalised +plant/train/plant_0194_normalised +plant/train/plant_0069_normalised +plant/train/plant_0023_normalised +plant/train/plant_0116_normalised +plant/train/plant_0064_normalised +plant/train/plant_0090_normalised +plant/train/plant_0018_normalised +plant/train/plant_0026_normalised +plant/train/plant_0230_normalised +plant/train/plant_0072_normalised +plant/train/plant_0135_normalised +plant/train/plant_0204_normalised +plant/train/plant_0005_normalised +plant/train/plant_0138_normalised +plant/train/plant_0120_normalised +plant/train/plant_0180_normalised +plant/train/plant_0046_normalised +plant/train/plant_0187_normalised +plant/train/plant_0147_normalised +plant/train/plant_0060_normalised +plant/train/plant_0094_normalised +plant/train/plant_0231_normalised +plant/train/plant_0134_normalised +plant/train/plant_0139_normalised +plant/train/plant_0163_normalised +plant/train/plant_0174_normalised +plant/train/plant_0184_normalised +plant/train/plant_0197_normalised +plant/train/plant_0083_normalised +plant/train/plant_0053_normalised +plant/train/plant_0015_normalised +plant/train/plant_0201_normalised +plant/train/plant_0038_normalised +plant/train/plant_0087_normalised +plant/train/plant_0088_normalised +plant/train/plant_0198_normalised +plant/train/plant_0117_normalised +plant/train/plant_0227_normalised +plant/train/plant_0137_normalised +plant/train/plant_0009_normalised +plant/train/plant_0218_normalised +plant/train/plant_0044_normalised +plant/train/plant_0093_normalised +plant/train/plant_0167_normalised +plant/train/plant_0161_normalised +plant/train/plant_0043_normalised +plant/train/plant_0111_normalised +plant/train/plant_0035_normalised +plant/train/plant_0006_normalised +plant/train/plant_0178_normalised +plant/train/plant_0215_normalised +plant/train/plant_0080_normalised +plant/train/plant_0179_normalised +plant/train/plant_0108_normalised +plant/train/plant_0177_normalised +plant/train/plant_0054_normalised +plant/train/plant_0068_normalised +plant/train/plant_0050_normalised +plant/train/plant_0021_normalised +plant/train/plant_0031_normalised +plant/train/plant_0162_normalised +plant/train/plant_0168_normalised +plant/train/plant_0152_normalised +plant/train/plant_0149_normalised +plant/train/plant_0029_normalised +plant/train/plant_0214_normalised +plant/train/plant_0209_normalised +plant/train/plant_0127_normalised +plant/train/plant_0144_normalised +plant/train/plant_0007_normalised +plant/train/plant_0133_normalised +plant/train/plant_0077_normalised +plant/train/plant_0129_normalised +plant/train/plant_0131_normalised +plant/train/plant_0171_normalised +plant/train/plant_0157_normalised +plant/train/plant_0208_normalised +plant/train/plant_0223_normalised +plant/train/plant_0205_normalised +plant/train/plant_0104_normalised +plant/train/plant_0075_normalised +plant/train/plant_0159_normalised +plant/train/plant_0188_normalised +plant/train/plant_0063_normalised +plant/train/plant_0202_normalised +plant/train/plant_0081_normalised +plant/train/plant_0222_normalised +plant/train/plant_0020_normalised +plant/train/plant_0132_normalised +plant/train/plant_0082_normalised +plant/train/plant_0004_normalised +plant/train/plant_0191_normalised +plant/train/plant_0136_normalised +plant/train/plant_0226_normalised +plant/train/plant_0155_normalised +plant/train/plant_0200_normalised +plant/train/plant_0140_normalised +plant/train/plant_0166_normalised +plant/train/plant_0041_normalised +plant/train/plant_0206_normalised +plant/train/plant_0040_normalised +plant/train/plant_0189_normalised +plant/train/plant_0002_normalised +plant/train/plant_0036_normalised +plant/train/plant_0237_normalised +plant/train/plant_0098_normalised +plant/train/plant_0175_normalised +plant/train/plant_0233_normalised +plant/train/plant_0067_normalised +plant/train/plant_0225_normalised +plant/train/plant_0057_normalised +plant/train/plant_0228_normalised +plant/train/plant_0028_normalised +plant/train/plant_0118_normalised +plant/train/plant_0025_normalised +plant/train/plant_0121_normalised +plant/train/plant_0238_normalised +plant/train/plant_0160_normalised +plant/train/plant_0112_normalised +plant/train/plant_0146_normalised +plant/train/plant_0213_normalised +plant/train/plant_0217_normalised +plant/train/plant_0085_normalised +plant/train/plant_0097_normalised +plant/train/plant_0061_normalised +plant/train/plant_0019_normalised +plant/train/plant_0109_normalised +plant/train/plant_0193_normalised +plant/train/plant_0102_normalised +plant/train/plant_0216_normalised +plant/train/plant_0172_normalised +plant/train/plant_0203_normalised +plant/train/plant_0030_normalised +plant/train/plant_0099_normalised +plant/train/plant_0076_normalised +plant/train/plant_0143_normalised +plant/train/plant_0153_normalised +plant/train/plant_0156_normalised +plant/train/plant_0066_normalised +plant/train/plant_0182_normalised +plant/train/plant_0065_normalised +plant/train/plant_0022_normalised +plant/train/plant_0033_normalised +plant/train/plant_0095_normalised +plant/train/plant_0183_normalised +plant/train/plant_0016_normalised +plant/train/plant_0126_normalised +plant/train/plant_0119_normalised +plant/train/plant_0176_normalised +plant/train/plant_0042_normalised +plant/train/plant_0086_normalised +plant/train/plant_0045_normalised +plant/train/plant_0164_normalised +plant/train/plant_0196_normalised +plant/train/plant_0123_normalised +plant/train/plant_0032_normalised +plant/train/plant_0199_normalised +plant/train/plant_0012_normalised +plant/train/plant_0014_normalised +plant/train/plant_0091_normalised +plant/train/plant_0141_normalised +plant/train/plant_0034_normalised +plant/train/plant_0103_normalised +plant/train/plant_0145_normalised +plant/train/plant_0240_normalised +plant/train/plant_0158_normalised +plant/train/plant_0169_normalised +plant/train/plant_0239_normalised +plant/train/plant_0074_normalised +plant/train/plant_0124_normalised +plant/train/plant_0055_normalised +plant/train/plant_0073_normalised +plant/train/plant_0070_normalised +plant/train/plant_0114_normalised +plant/train/plant_0221_normalised +plant/train/plant_0236_normalised +plant/train/plant_0084_normalised +plant/train/plant_0008_normalised +plant/train/plant_0219_normalised +plant/train/plant_0017_normalised +plant/train/plant_0192_normalised +plant/train/plant_0207_normalised +plant/train/plant_0100_normalised +plant/train/plant_0051_normalised +plant/train/plant_0165_normalised +plant/train/plant_0190_normalised +plant/train/plant_0154_normalised +plant/train/plant_0027_normalised +plant/train/plant_0148_normalised +plant/train/plant_0047_normalised +plant/train/plant_0173_normalised +plant/train/plant_0013_normalised +plant/train/plant_0039_normalised +plant/train/plant_0089_normalised +plant/train/plant_0058_normalised +plant/train/plant_0185_normalised +plant/train/plant_0151_normalised +plant/train/plant_0037_normalised +plant/train/plant_0186_normalised +plant/train/plant_0056_normalised +plant/train/plant_0092_normalised +plant/train/plant_0210_normalised +plant/train/plant_0150_normalised +plant/train/plant_0181_normalised +plant/train/plant_0232_normalised +plant/train/plant_0234_normalised +plant/train/plant_0024_normalised +plant/train/plant_0122_normalised +plant/train/plant_0170_normalised +plant/train/plant_0142_normalised +plant/train/plant_0105_normalised +plant/train/plant_0011_normalised +plant/train/plant_0128_normalised +plant/train/plant_0130_normalised +plant/train/plant_0106_normalised +plant/train/plant_0096_normalised +plant/train/plant_0062_normalised +plant/train/plant_0101_normalised +plant/train/plant_0113_normalised +plant/train/plant_0224_normalised +plant/train/plant_0115_normalised +plant/train/plant_0078_normalised +plant/train/plant_0125_normalised +plant/train/plant_0211_normalised +plant/train/plant_0071_normalised +plant/train/plant_0003_normalised +plant/train/plant_0110_normalised +plant/train/plant_0059_normalised +plant/train/plant_0220_normalised +plant/train/plant_0052_normalised +plant/train/plant_0229_normalised +plant/train/plant_0195_normalised +plant/train/plant_0235_normalised +plant/train/plant_0049_normalised +plant/train/plant_0107_normalised +plant/train/plant_0048_normalised +plant/test/plant_0328_normalised +plant/test/plant_0248_normalised +plant/test/plant_0321_normalised +plant/test/plant_0285_normalised +plant/test/plant_0244_normalised +plant/test/plant_0275_normalised +plant/test/plant_0269_normalised +plant/test/plant_0273_normalised +plant/test/plant_0259_normalised +plant/test/plant_0317_normalised +plant/test/plant_0291_normalised +plant/test/plant_0320_normalised +plant/test/plant_0280_normalised +plant/test/plant_0286_normalised +plant/test/plant_0296_normalised +plant/test/plant_0309_normalised +plant/test/plant_0301_normalised +plant/test/plant_0289_normalised +plant/test/plant_0334_normalised +plant/test/plant_0265_normalised +plant/test/plant_0279_normalised +plant/test/plant_0241_normalised +plant/test/plant_0337_normalised +plant/test/plant_0300_normalised +plant/test/plant_0311_normalised +plant/test/plant_0283_normalised +plant/test/plant_0308_normalised +plant/test/plant_0261_normalised +plant/test/plant_0329_normalised +plant/test/plant_0268_normalised +plant/test/plant_0245_normalised +plant/test/plant_0252_normalised +plant/test/plant_0288_normalised +plant/test/plant_0307_normalised +plant/test/plant_0258_normalised +plant/test/plant_0249_normalised +plant/test/plant_0340_normalised +plant/test/plant_0324_normalised +plant/test/plant_0257_normalised +plant/test/plant_0305_normalised +plant/test/plant_0295_normalised +plant/test/plant_0247_normalised +plant/test/plant_0336_normalised +plant/test/plant_0284_normalised +plant/test/plant_0276_normalised +plant/test/plant_0326_normalised +plant/test/plant_0322_normalised +plant/test/plant_0254_normalised +plant/test/plant_0293_normalised +plant/test/plant_0260_normalised +plant/test/plant_0298_normalised +plant/test/plant_0318_normalised +plant/test/plant_0272_normalised +plant/test/plant_0332_normalised +plant/test/plant_0262_normalised +plant/test/plant_0312_normalised +plant/test/plant_0250_normalised +plant/test/plant_0242_normalised +plant/test/plant_0316_normalised +plant/test/plant_0255_normalised +plant/test/plant_0270_normalised +plant/test/plant_0243_normalised +plant/test/plant_0333_normalised +plant/test/plant_0251_normalised +plant/test/plant_0256_normalised +plant/test/plant_0335_normalised +plant/test/plant_0339_normalised +plant/test/plant_0282_normalised +plant/test/plant_0313_normalised +plant/test/plant_0267_normalised +plant/test/plant_0287_normalised +plant/test/plant_0294_normalised +plant/test/plant_0290_normalised +plant/test/plant_0264_normalised +plant/test/plant_0292_normalised +plant/test/plant_0274_normalised +plant/test/plant_0266_normalised +plant/test/plant_0327_normalised +plant/test/plant_0263_normalised +plant/test/plant_0278_normalised +plant/test/plant_0338_normalised +plant/test/plant_0306_normalised +plant/test/plant_0299_normalised +plant/test/plant_0331_normalised +plant/test/plant_0304_normalised +plant/test/plant_0253_normalised +plant/test/plant_0315_normalised +plant/test/plant_0325_normalised +plant/test/plant_0323_normalised +plant/test/plant_0303_normalised +plant/test/plant_0302_normalised +plant/test/plant_0277_normalised +plant/test/plant_0319_normalised +plant/test/plant_0310_normalised +plant/test/plant_0297_normalised +plant/test/plant_0330_normalised +plant/test/plant_0314_normalised +plant/test/plant_0246_normalised +plant/test/plant_0281_normalised +plant/test/plant_0271_normalised +bathtub/train/bathtub_0105_normalised +bathtub/train/bathtub_0098_normalised +bathtub/train/bathtub_0088_normalised +bathtub/train/bathtub_0008_normalised +bathtub/train/bathtub_0043_normalised +bathtub/train/bathtub_0081_normalised +bathtub/train/bathtub_0009_normalised +bathtub/train/bathtub_0079_normalised +bathtub/train/bathtub_0067_normalised +bathtub/train/bathtub_0032_normalised +bathtub/train/bathtub_0012_normalised +bathtub/train/bathtub_0072_normalised +bathtub/train/bathtub_0003_normalised +bathtub/train/bathtub_0059_normalised +bathtub/train/bathtub_0061_normalised +bathtub/train/bathtub_0089_normalised +bathtub/train/bathtub_0006_normalised +bathtub/train/bathtub_0097_normalised +bathtub/train/bathtub_0010_normalised +bathtub/train/bathtub_0101_normalised +bathtub/train/bathtub_0047_normalised +bathtub/train/bathtub_0027_normalised +bathtub/train/bathtub_0033_normalised +bathtub/train/bathtub_0058_normalised +bathtub/train/bathtub_0035_normalised +bathtub/train/bathtub_0014_normalised +bathtub/train/bathtub_0069_normalised +bathtub/train/bathtub_0048_normalised +bathtub/train/bathtub_0031_normalised +bathtub/train/bathtub_0011_normalised +bathtub/train/bathtub_0056_normalised +bathtub/train/bathtub_0037_normalised +bathtub/train/bathtub_0076_normalised +bathtub/train/bathtub_0007_normalised +bathtub/train/bathtub_0062_normalised +bathtub/train/bathtub_0093_normalised +bathtub/train/bathtub_0034_normalised +bathtub/train/bathtub_0064_normalised +bathtub/train/bathtub_0104_normalised +bathtub/train/bathtub_0071_normalised +bathtub/train/bathtub_0016_normalised +bathtub/train/bathtub_0054_normalised +bathtub/train/bathtub_0085_normalised +bathtub/train/bathtub_0092_normalised +bathtub/train/bathtub_0040_normalised +bathtub/train/bathtub_0046_normalised +bathtub/train/bathtub_0024_normalised +bathtub/train/bathtub_0042_normalised +bathtub/train/bathtub_0086_normalised +bathtub/train/bathtub_0022_normalised +bathtub/train/bathtub_0082_normalised +bathtub/train/bathtub_0063_normalised +bathtub/train/bathtub_0053_normalised +bathtub/train/bathtub_0004_normalised +bathtub/train/bathtub_0096_normalised +bathtub/train/bathtub_0021_normalised +bathtub/train/bathtub_0036_normalised +bathtub/train/bathtub_0030_normalised +bathtub/train/bathtub_0051_normalised +bathtub/train/bathtub_0041_normalised +bathtub/train/bathtub_0068_normalised +bathtub/train/bathtub_0044_normalised +bathtub/train/bathtub_0002_normalised +bathtub/train/bathtub_0087_normalised +bathtub/train/bathtub_0091_normalised +bathtub/train/bathtub_0100_normalised +bathtub/train/bathtub_0084_normalised +bathtub/train/bathtub_0094_normalised +bathtub/train/bathtub_0102_normalised +bathtub/train/bathtub_0052_normalised +bathtub/train/bathtub_0080_normalised +bathtub/train/bathtub_0077_normalised +bathtub/train/bathtub_0049_normalised +bathtub/train/bathtub_0029_normalised +bathtub/train/bathtub_0013_normalised +bathtub/train/bathtub_0060_normalised +bathtub/train/bathtub_0020_normalised +bathtub/train/bathtub_0103_normalised +bathtub/train/bathtub_0095_normalised +bathtub/train/bathtub_0017_normalised +bathtub/train/bathtub_0018_normalised +bathtub/train/bathtub_0090_normalised +bathtub/train/bathtub_0019_normalised +bathtub/train/bathtub_0001_normalised +bathtub/train/bathtub_0005_normalised +bathtub/train/bathtub_0099_normalised +bathtub/train/bathtub_0070_normalised +bathtub/train/bathtub_0045_normalised +bathtub/train/bathtub_0073_normalised +bathtub/train/bathtub_0025_normalised +bathtub/train/bathtub_0066_normalised +bathtub/train/bathtub_0078_normalised +bathtub/train/bathtub_0057_normalised +bathtub/train/bathtub_0039_normalised +bathtub/train/bathtub_0075_normalised +bathtub/train/bathtub_0038_normalised +bathtub/train/bathtub_0055_normalised +bathtub/train/bathtub_0074_normalised +bathtub/train/bathtub_0026_normalised +bathtub/train/bathtub_0050_normalised +bathtub/train/bathtub_0028_normalised +bathtub/train/bathtub_0083_normalised +bathtub/train/bathtub_0023_normalised +bathtub/train/bathtub_0065_normalised +bathtub/train/bathtub_0015_normalised +bathtub/train/bathtub_0106_normalised +bathtub/test/bathtub_0120_normalised +bathtub/test/bathtub_0133_normalised +bathtub/test/bathtub_0130_normalised +bathtub/test/bathtub_0152_normalised +bathtub/test/bathtub_0113_normalised +bathtub/test/bathtub_0131_normalised +bathtub/test/bathtub_0156_normalised +bathtub/test/bathtub_0138_normalised +bathtub/test/bathtub_0127_normalised +bathtub/test/bathtub_0150_normalised +bathtub/test/bathtub_0107_normalised +bathtub/test/bathtub_0109_normalised +bathtub/test/bathtub_0146_normalised +bathtub/test/bathtub_0125_normalised +bathtub/test/bathtub_0153_normalised +bathtub/test/bathtub_0122_normalised +bathtub/test/bathtub_0121_normalised +bathtub/test/bathtub_0155_normalised +bathtub/test/bathtub_0134_normalised +bathtub/test/bathtub_0114_normalised +bathtub/test/bathtub_0126_normalised +bathtub/test/bathtub_0118_normalised +bathtub/test/bathtub_0116_normalised +bathtub/test/bathtub_0135_normalised +bathtub/test/bathtub_0123_normalised +bathtub/test/bathtub_0137_normalised +bathtub/test/bathtub_0142_normalised +bathtub/test/bathtub_0115_normalised +bathtub/test/bathtub_0143_normalised +bathtub/test/bathtub_0151_normalised +bathtub/test/bathtub_0132_normalised +bathtub/test/bathtub_0149_normalised +bathtub/test/bathtub_0112_normalised +bathtub/test/bathtub_0124_normalised +bathtub/test/bathtub_0128_normalised +bathtub/test/bathtub_0148_normalised +bathtub/test/bathtub_0110_normalised +bathtub/test/bathtub_0111_normalised +bathtub/test/bathtub_0147_normalised +bathtub/test/bathtub_0117_normalised +bathtub/test/bathtub_0145_normalised +bathtub/test/bathtub_0141_normalised +bathtub/test/bathtub_0108_normalised +bathtub/test/bathtub_0140_normalised +bathtub/test/bathtub_0139_normalised +bathtub/test/bathtub_0154_normalised +bathtub/test/bathtub_0136_normalised +bathtub/test/bathtub_0119_normalised +bathtub/test/bathtub_0144_normalised +bathtub/test/bathtub_0129_normalised +dresser/train/dresser_0039_normalised +dresser/train/dresser_0081_normalised +dresser/train/dresser_0124_normalised +dresser/train/dresser_0024_normalised +dresser/train/dresser_0113_normalised +dresser/train/dresser_0060_normalised +dresser/train/dresser_0107_normalised +dresser/train/dresser_0027_normalised +dresser/train/dresser_0121_normalised +dresser/train/dresser_0133_normalised +dresser/train/dresser_0102_normalised +dresser/train/dresser_0026_normalised +dresser/train/dresser_0154_normalised +dresser/train/dresser_0109_normalised +dresser/train/dresser_0157_normalised +dresser/train/dresser_0116_normalised +dresser/train/dresser_0177_normalised +dresser/train/dresser_0173_normalised +dresser/train/dresser_0180_normalised +dresser/train/dresser_0040_normalised +dresser/train/dresser_0139_normalised +dresser/train/dresser_0188_normalised +dresser/train/dresser_0047_normalised +dresser/train/dresser_0170_normalised +dresser/train/dresser_0162_normalised +dresser/train/dresser_0126_normalised +dresser/train/dresser_0160_normalised +dresser/train/dresser_0161_normalised +dresser/train/dresser_0115_normalised +dresser/train/dresser_0076_normalised +dresser/train/dresser_0073_normalised +dresser/train/dresser_0174_normalised +dresser/train/dresser_0159_normalised +dresser/train/dresser_0034_normalised +dresser/train/dresser_0014_normalised +dresser/train/dresser_0098_normalised +dresser/train/dresser_0128_normalised +dresser/train/dresser_0071_normalised +dresser/train/dresser_0066_normalised +dresser/train/dresser_0199_normalised +dresser/train/dresser_0095_normalised +dresser/train/dresser_0072_normalised +dresser/train/dresser_0110_normalised +dresser/train/dresser_0163_normalised +dresser/train/dresser_0187_normalised +dresser/train/dresser_0017_normalised +dresser/train/dresser_0101_normalised +dresser/train/dresser_0032_normalised +dresser/train/dresser_0096_normalised +dresser/train/dresser_0008_normalised +dresser/train/dresser_0013_normalised +dresser/train/dresser_0061_normalised +dresser/train/dresser_0156_normalised +dresser/train/dresser_0019_normalised +dresser/train/dresser_0087_normalised +dresser/train/dresser_0182_normalised +dresser/train/dresser_0197_normalised +dresser/train/dresser_0054_normalised +dresser/train/dresser_0059_normalised +dresser/train/dresser_0168_normalised +dresser/train/dresser_0097_normalised +dresser/train/dresser_0056_normalised +dresser/train/dresser_0004_normalised +dresser/train/dresser_0030_normalised +dresser/train/dresser_0002_normalised +dresser/train/dresser_0080_normalised +dresser/train/dresser_0029_normalised +dresser/train/dresser_0015_normalised +dresser/train/dresser_0007_normalised +dresser/train/dresser_0141_normalised +dresser/train/dresser_0028_normalised +dresser/train/dresser_0151_normalised +dresser/train/dresser_0155_normalised +dresser/train/dresser_0045_normalised +dresser/train/dresser_0036_normalised +dresser/train/dresser_0114_normalised +dresser/train/dresser_0083_normalised +dresser/train/dresser_0191_normalised +dresser/train/dresser_0079_normalised +dresser/train/dresser_0009_normalised +dresser/train/dresser_0147_normalised +dresser/train/dresser_0144_normalised +dresser/train/dresser_0198_normalised +dresser/train/dresser_0104_normalised +dresser/train/dresser_0011_normalised +dresser/train/dresser_0041_normalised +dresser/train/dresser_0038_normalised +dresser/train/dresser_0143_normalised +dresser/train/dresser_0123_normalised +dresser/train/dresser_0184_normalised +dresser/train/dresser_0176_normalised +dresser/train/dresser_0091_normalised +dresser/train/dresser_0179_normalised +dresser/train/dresser_0075_normalised +dresser/train/dresser_0053_normalised +dresser/train/dresser_0033_normalised +dresser/train/dresser_0099_normalised +dresser/train/dresser_0086_normalised +dresser/train/dresser_0152_normalised +dresser/train/dresser_0020_normalised +dresser/train/dresser_0134_normalised +dresser/train/dresser_0051_normalised +dresser/train/dresser_0149_normalised +dresser/train/dresser_0145_normalised +dresser/train/dresser_0050_normalised +dresser/train/dresser_0055_normalised +dresser/train/dresser_0078_normalised +dresser/train/dresser_0077_normalised +dresser/train/dresser_0031_normalised +dresser/train/dresser_0003_normalised +dresser/train/dresser_0094_normalised +dresser/train/dresser_0138_normalised +dresser/train/dresser_0172_normalised +dresser/train/dresser_0185_normalised +dresser/train/dresser_0064_normalised +dresser/train/dresser_0164_normalised +dresser/train/dresser_0023_normalised +dresser/train/dresser_0131_normalised +dresser/train/dresser_0194_normalised +dresser/train/dresser_0165_normalised +dresser/train/dresser_0189_normalised +dresser/train/dresser_0146_normalised +dresser/train/dresser_0130_normalised +dresser/train/dresser_0065_normalised +dresser/train/dresser_0106_normalised +dresser/train/dresser_0043_normalised +dresser/train/dresser_0190_normalised +dresser/train/dresser_0166_normalised +dresser/train/dresser_0048_normalised +dresser/train/dresser_0117_normalised +dresser/train/dresser_0153_normalised +dresser/train/dresser_0122_normalised +dresser/train/dresser_0192_normalised +dresser/train/dresser_0132_normalised +dresser/train/dresser_0069_normalised +dresser/train/dresser_0067_normalised +dresser/train/dresser_0196_normalised +dresser/train/dresser_0042_normalised +dresser/train/dresser_0112_normalised +dresser/train/dresser_0129_normalised +dresser/train/dresser_0068_normalised +dresser/train/dresser_0169_normalised +dresser/train/dresser_0108_normalised +dresser/train/dresser_0195_normalised +dresser/train/dresser_0118_normalised +dresser/train/dresser_0085_normalised +dresser/train/dresser_0022_normalised +dresser/train/dresser_0005_normalised +dresser/train/dresser_0120_normalised +dresser/train/dresser_0100_normalised +dresser/train/dresser_0010_normalised +dresser/train/dresser_0136_normalised +dresser/train/dresser_0025_normalised +dresser/train/dresser_0049_normalised +dresser/train/dresser_0074_normalised +dresser/train/dresser_0084_normalised +dresser/train/dresser_0057_normalised +dresser/train/dresser_0127_normalised +dresser/train/dresser_0001_normalised +dresser/train/dresser_0037_normalised +dresser/train/dresser_0125_normalised +dresser/train/dresser_0111_normalised +dresser/train/dresser_0140_normalised +dresser/train/dresser_0105_normalised +dresser/train/dresser_0158_normalised +dresser/train/dresser_0150_normalised +dresser/train/dresser_0167_normalised +dresser/train/dresser_0171_normalised +dresser/train/dresser_0178_normalised +dresser/train/dresser_0012_normalised +dresser/train/dresser_0137_normalised +dresser/train/dresser_0044_normalised +dresser/train/dresser_0070_normalised +dresser/train/dresser_0142_normalised +dresser/train/dresser_0082_normalised +dresser/train/dresser_0186_normalised +dresser/train/dresser_0062_normalised +dresser/train/dresser_0175_normalised +dresser/train/dresser_0018_normalised +dresser/train/dresser_0046_normalised +dresser/train/dresser_0006_normalised +dresser/train/dresser_0181_normalised +dresser/train/dresser_0035_normalised +dresser/train/dresser_0193_normalised +dresser/train/dresser_0092_normalised +dresser/train/dresser_0135_normalised +dresser/train/dresser_0063_normalised +dresser/train/dresser_0089_normalised +dresser/train/dresser_0183_normalised +dresser/train/dresser_0088_normalised +dresser/train/dresser_0016_normalised +dresser/train/dresser_0090_normalised +dresser/train/dresser_0103_normalised +dresser/train/dresser_0021_normalised +dresser/train/dresser_0058_normalised +dresser/train/dresser_0200_normalised +dresser/train/dresser_0119_normalised +dresser/train/dresser_0093_normalised +dresser/train/dresser_0052_normalised +dresser/train/dresser_0148_normalised +dresser/test/dresser_0270_normalised +dresser/test/dresser_0253_normalised +dresser/test/dresser_0274_normalised +dresser/test/dresser_0272_normalised +dresser/test/dresser_0266_normalised +dresser/test/dresser_0255_normalised +dresser/test/dresser_0281_normalised +dresser/test/dresser_0271_normalised +dresser/test/dresser_0240_normalised +dresser/test/dresser_0243_normalised +dresser/test/dresser_0246_normalised +dresser/test/dresser_0259_normalised +dresser/test/dresser_0265_normalised +dresser/test/dresser_0229_normalised +dresser/test/dresser_0273_normalised +dresser/test/dresser_0215_normalised +dresser/test/dresser_0256_normalised +dresser/test/dresser_0201_normalised +dresser/test/dresser_0260_normalised +dresser/test/dresser_0242_normalised +dresser/test/dresser_0285_normalised +dresser/test/dresser_0250_normalised +dresser/test/dresser_0263_normalised +dresser/test/dresser_0220_normalised +dresser/test/dresser_0261_normalised +dresser/test/dresser_0213_normalised +dresser/test/dresser_0232_normalised +dresser/test/dresser_0226_normalised +dresser/test/dresser_0214_normalised +dresser/test/dresser_0249_normalised +dresser/test/dresser_0269_normalised +dresser/test/dresser_0221_normalised +dresser/test/dresser_0233_normalised +dresser/test/dresser_0227_normalised +dresser/test/dresser_0280_normalised +dresser/test/dresser_0223_normalised +dresser/test/dresser_0238_normalised +dresser/test/dresser_0222_normalised +dresser/test/dresser_0202_normalised +dresser/test/dresser_0277_normalised +dresser/test/dresser_0262_normalised +dresser/test/dresser_0230_normalised +dresser/test/dresser_0279_normalised +dresser/test/dresser_0275_normalised +dresser/test/dresser_0218_normalised +dresser/test/dresser_0225_normalised +dresser/test/dresser_0219_normalised +dresser/test/dresser_0224_normalised +dresser/test/dresser_0268_normalised +dresser/test/dresser_0207_normalised +dresser/test/dresser_0210_normalised +dresser/test/dresser_0286_normalised +dresser/test/dresser_0257_normalised +dresser/test/dresser_0208_normalised +dresser/test/dresser_0267_normalised +dresser/test/dresser_0247_normalised +dresser/test/dresser_0237_normalised +dresser/test/dresser_0217_normalised +dresser/test/dresser_0239_normalised +dresser/test/dresser_0241_normalised +dresser/test/dresser_0206_normalised +dresser/test/dresser_0284_normalised +dresser/test/dresser_0258_normalised +dresser/test/dresser_0283_normalised +dresser/test/dresser_0211_normalised +dresser/test/dresser_0228_normalised +dresser/test/dresser_0244_normalised +dresser/test/dresser_0254_normalised +dresser/test/dresser_0216_normalised +dresser/test/dresser_0251_normalised +dresser/test/dresser_0252_normalised +dresser/test/dresser_0209_normalised +dresser/test/dresser_0203_normalised +dresser/test/dresser_0264_normalised +dresser/test/dresser_0231_normalised +dresser/test/dresser_0276_normalised +dresser/test/dresser_0278_normalised +dresser/test/dresser_0235_normalised +dresser/test/dresser_0205_normalised +dresser/test/dresser_0245_normalised +dresser/test/dresser_0234_normalised +dresser/test/dresser_0248_normalised +dresser/test/dresser_0212_normalised +dresser/test/dresser_0236_normalised +dresser/test/dresser_0204_normalised +dresser/test/dresser_0282_normalised +bottle/train/bottle_0087_normalised +bottle/train/bottle_0033_normalised +bottle/train/bottle_0028_normalised +bottle/train/bottle_0111_normalised +bottle/train/bottle_0173_normalised +bottle/train/bottle_0012_normalised +bottle/train/bottle_0051_normalised +bottle/train/bottle_0309_normalised +bottle/train/bottle_0026_normalised +bottle/train/bottle_0302_normalised +bottle/train/bottle_0113_normalised +bottle/train/bottle_0213_normalised +bottle/train/bottle_0005_normalised +bottle/train/bottle_0042_normalised +bottle/train/bottle_0194_normalised +bottle/train/bottle_0011_normalised +bottle/train/bottle_0314_normalised +bottle/train/bottle_0178_normalised +bottle/train/bottle_0245_normalised +bottle/train/bottle_0299_normalised +bottle/train/bottle_0333_normalised +bottle/train/bottle_0235_normalised +bottle/train/bottle_0332_normalised +bottle/train/bottle_0120_normalised +bottle/train/bottle_0256_normalised +bottle/train/bottle_0331_normalised +bottle/train/bottle_0166_normalised +bottle/train/bottle_0134_normalised +bottle/train/bottle_0253_normalised +bottle/train/bottle_0203_normalised +bottle/train/bottle_0096_normalised +bottle/train/bottle_0043_normalised +bottle/train/bottle_0079_normalised +bottle/train/bottle_0013_normalised +bottle/train/bottle_0295_normalised +bottle/train/bottle_0287_normalised +bottle/train/bottle_0177_normalised +bottle/train/bottle_0219_normalised +bottle/train/bottle_0264_normalised +bottle/train/bottle_0266_normalised +bottle/train/bottle_0310_normalised +bottle/train/bottle_0183_normalised +bottle/train/bottle_0214_normalised +bottle/train/bottle_0229_normalised +bottle/train/bottle_0007_normalised +bottle/train/bottle_0273_normalised +bottle/train/bottle_0180_normalised +bottle/train/bottle_0189_normalised +bottle/train/bottle_0095_normalised +bottle/train/bottle_0207_normalised +bottle/train/bottle_0278_normalised +bottle/train/bottle_0123_normalised +bottle/train/bottle_0085_normalised +bottle/train/bottle_0170_normalised +bottle/train/bottle_0242_normalised +bottle/train/bottle_0237_normalised +bottle/train/bottle_0092_normalised +bottle/train/bottle_0251_normalised +bottle/train/bottle_0246_normalised +bottle/train/bottle_0330_normalised +bottle/train/bottle_0027_normalised +bottle/train/bottle_0152_normalised +bottle/train/bottle_0212_normalised +bottle/train/bottle_0014_normalised +bottle/train/bottle_0115_normalised +bottle/train/bottle_0088_normalised +bottle/train/bottle_0058_normalised +bottle/train/bottle_0291_normalised +bottle/train/bottle_0265_normalised +bottle/train/bottle_0296_normalised +bottle/train/bottle_0281_normalised +bottle/train/bottle_0097_normalised +bottle/train/bottle_0103_normalised +bottle/train/bottle_0046_normalised +bottle/train/bottle_0305_normalised +bottle/train/bottle_0271_normalised +bottle/train/bottle_0009_normalised +bottle/train/bottle_0304_normalised +bottle/train/bottle_0121_normalised +bottle/train/bottle_0303_normalised +bottle/train/bottle_0044_normalised +bottle/train/bottle_0108_normalised +bottle/train/bottle_0163_normalised +bottle/train/bottle_0241_normalised +bottle/train/bottle_0148_normalised +bottle/train/bottle_0149_normalised +bottle/train/bottle_0032_normalised +bottle/train/bottle_0293_normalised +bottle/train/bottle_0069_normalised +bottle/train/bottle_0105_normalised +bottle/train/bottle_0258_normalised +bottle/train/bottle_0100_normalised +bottle/train/bottle_0322_normalised +bottle/train/bottle_0062_normalised +bottle/train/bottle_0277_normalised +bottle/train/bottle_0209_normalised +bottle/train/bottle_0231_normalised +bottle/train/bottle_0182_normalised +bottle/train/bottle_0201_normalised +bottle/train/bottle_0018_normalised +bottle/train/bottle_0107_normalised +bottle/train/bottle_0323_normalised +bottle/train/bottle_0071_normalised +bottle/train/bottle_0004_normalised +bottle/train/bottle_0167_normalised +bottle/train/bottle_0228_normalised +bottle/train/bottle_0057_normalised +bottle/train/bottle_0116_normalised +bottle/train/bottle_0035_normalised +bottle/train/bottle_0118_normalised +bottle/train/bottle_0131_normalised +bottle/train/bottle_0024_normalised +bottle/train/bottle_0283_normalised +bottle/train/bottle_0133_normalised +bottle/train/bottle_0335_normalised +bottle/train/bottle_0084_normalised +bottle/train/bottle_0260_normalised +bottle/train/bottle_0060_normalised +bottle/train/bottle_0065_normalised +bottle/train/bottle_0284_normalised +bottle/train/bottle_0155_normalised +bottle/train/bottle_0110_normalised +bottle/train/bottle_0248_normalised +bottle/train/bottle_0244_normalised +bottle/train/bottle_0226_normalised +bottle/train/bottle_0143_normalised +bottle/train/bottle_0222_normalised +bottle/train/bottle_0139_normalised +bottle/train/bottle_0176_normalised +bottle/train/bottle_0301_normalised +bottle/train/bottle_0070_normalised +bottle/train/bottle_0206_normalised +bottle/train/bottle_0068_normalised +bottle/train/bottle_0257_normalised +bottle/train/bottle_0015_normalised +bottle/train/bottle_0250_normalised +bottle/train/bottle_0261_normalised +bottle/train/bottle_0225_normalised +bottle/train/bottle_0112_normalised +bottle/train/bottle_0267_normalised +bottle/train/bottle_0199_normalised +bottle/train/bottle_0077_normalised +bottle/train/bottle_0288_normalised +bottle/train/bottle_0262_normalised +bottle/train/bottle_0168_normalised +bottle/train/bottle_0270_normalised +bottle/train/bottle_0200_normalised +bottle/train/bottle_0252_normalised +bottle/train/bottle_0001_normalised +bottle/train/bottle_0243_normalised +bottle/train/bottle_0127_normalised +bottle/train/bottle_0236_normalised +bottle/train/bottle_0210_normalised +bottle/train/bottle_0169_normalised +bottle/train/bottle_0268_normalised +bottle/train/bottle_0072_normalised +bottle/train/bottle_0274_normalised +bottle/train/bottle_0151_normalised +bottle/train/bottle_0320_normalised +bottle/train/bottle_0285_normalised +bottle/train/bottle_0145_normalised +bottle/train/bottle_0093_normalised +bottle/train/bottle_0003_normalised +bottle/train/bottle_0146_normalised +bottle/train/bottle_0117_normalised +bottle/train/bottle_0179_normalised +bottle/train/bottle_0317_normalised +bottle/train/bottle_0061_normalised +bottle/train/bottle_0185_normalised +bottle/train/bottle_0075_normalised +bottle/train/bottle_0308_normalised +bottle/train/bottle_0083_normalised +bottle/train/bottle_0175_normalised +bottle/train/bottle_0129_normalised +bottle/train/bottle_0205_normalised +bottle/train/bottle_0220_normalised +bottle/train/bottle_0196_normalised +bottle/train/bottle_0276_normalised +bottle/train/bottle_0188_normalised +bottle/train/bottle_0049_normalised +bottle/train/bottle_0021_normalised +bottle/train/bottle_0130_normalised +bottle/train/bottle_0202_normalised +bottle/train/bottle_0315_normalised +bottle/train/bottle_0132_normalised +bottle/train/bottle_0050_normalised +bottle/train/bottle_0198_normalised +bottle/train/bottle_0081_normalised +bottle/train/bottle_0156_normalised +bottle/train/bottle_0221_normalised +bottle/train/bottle_0190_normalised +bottle/train/bottle_0089_normalised +bottle/train/bottle_0269_normalised +bottle/train/bottle_0334_normalised +bottle/train/bottle_0114_normalised +bottle/train/bottle_0106_normalised +bottle/train/bottle_0158_normalised +bottle/train/bottle_0254_normalised +bottle/train/bottle_0307_normalised +bottle/train/bottle_0160_normalised +bottle/train/bottle_0161_normalised +bottle/train/bottle_0030_normalised +bottle/train/bottle_0138_normalised +bottle/train/bottle_0064_normalised +bottle/train/bottle_0224_normalised +bottle/train/bottle_0038_normalised +bottle/train/bottle_0211_normalised +bottle/train/bottle_0172_normalised +bottle/train/bottle_0047_normalised +bottle/train/bottle_0321_normalised +bottle/train/bottle_0263_normalised +bottle/train/bottle_0017_normalised +bottle/train/bottle_0311_normalised +bottle/train/bottle_0197_normalised +bottle/train/bottle_0094_normalised +bottle/train/bottle_0039_normalised +bottle/train/bottle_0022_normalised +bottle/train/bottle_0019_normalised +bottle/train/bottle_0150_normalised +bottle/train/bottle_0109_normalised +bottle/train/bottle_0157_normalised +bottle/train/bottle_0099_normalised +bottle/train/bottle_0141_normalised +bottle/train/bottle_0204_normalised +bottle/train/bottle_0192_normalised +bottle/train/bottle_0029_normalised +bottle/train/bottle_0128_normalised +bottle/train/bottle_0074_normalised +bottle/train/bottle_0230_normalised +bottle/train/bottle_0045_normalised +bottle/train/bottle_0327_normalised +bottle/train/bottle_0329_normalised +bottle/train/bottle_0319_normalised +bottle/train/bottle_0286_normalised +bottle/train/bottle_0147_normalised +bottle/train/bottle_0054_normalised +bottle/train/bottle_0318_normalised +bottle/train/bottle_0249_normalised +bottle/train/bottle_0008_normalised +bottle/train/bottle_0137_normalised +bottle/train/bottle_0037_normalised +bottle/train/bottle_0233_normalised +bottle/train/bottle_0259_normalised +bottle/train/bottle_0324_normalised +bottle/train/bottle_0053_normalised +bottle/train/bottle_0016_normalised +bottle/train/bottle_0078_normalised +bottle/train/bottle_0215_normalised +bottle/train/bottle_0010_normalised +bottle/train/bottle_0119_normalised +bottle/train/bottle_0297_normalised +bottle/train/bottle_0162_normalised +bottle/train/bottle_0184_normalised +bottle/train/bottle_0208_normalised +bottle/train/bottle_0006_normalised +bottle/train/bottle_0063_normalised +bottle/train/bottle_0195_normalised +bottle/train/bottle_0290_normalised +bottle/train/bottle_0082_normalised +bottle/train/bottle_0181_normalised +bottle/train/bottle_0056_normalised +bottle/train/bottle_0048_normalised +bottle/train/bottle_0275_normalised +bottle/train/bottle_0313_normalised +bottle/train/bottle_0055_normalised +bottle/train/bottle_0040_normalised +bottle/train/bottle_0240_normalised +bottle/train/bottle_0191_normalised +bottle/train/bottle_0300_normalised +bottle/train/bottle_0316_normalised +bottle/train/bottle_0217_normalised +bottle/train/bottle_0328_normalised +bottle/train/bottle_0090_normalised +bottle/train/bottle_0073_normalised +bottle/train/bottle_0218_normalised +bottle/train/bottle_0159_normalised +bottle/train/bottle_0154_normalised +bottle/train/bottle_0247_normalised +bottle/train/bottle_0140_normalised +bottle/train/bottle_0174_normalised +bottle/train/bottle_0238_normalised +bottle/train/bottle_0216_normalised +bottle/train/bottle_0234_normalised +bottle/train/bottle_0144_normalised +bottle/train/bottle_0282_normalised +bottle/train/bottle_0002_normalised +bottle/train/bottle_0086_normalised +bottle/train/bottle_0066_normalised +bottle/train/bottle_0326_normalised +bottle/train/bottle_0023_normalised +bottle/train/bottle_0153_normalised +bottle/train/bottle_0041_normalised +bottle/train/bottle_0165_normalised +bottle/train/bottle_0135_normalised +bottle/train/bottle_0052_normalised +bottle/train/bottle_0076_normalised +bottle/train/bottle_0239_normalised +bottle/train/bottle_0312_normalised +bottle/train/bottle_0122_normalised +bottle/train/bottle_0292_normalised +bottle/train/bottle_0227_normalised +bottle/train/bottle_0091_normalised +bottle/train/bottle_0325_normalised +bottle/train/bottle_0124_normalised +bottle/train/bottle_0101_normalised +bottle/train/bottle_0125_normalised +bottle/train/bottle_0034_normalised +bottle/train/bottle_0136_normalised +bottle/train/bottle_0164_normalised +bottle/train/bottle_0171_normalised +bottle/train/bottle_0031_normalised +bottle/train/bottle_0298_normalised +bottle/train/bottle_0067_normalised +bottle/train/bottle_0025_normalised +bottle/train/bottle_0098_normalised +bottle/train/bottle_0193_normalised +bottle/train/bottle_0059_normalised +bottle/train/bottle_0272_normalised +bottle/train/bottle_0232_normalised +bottle/train/bottle_0279_normalised +bottle/train/bottle_0126_normalised +bottle/train/bottle_0102_normalised +bottle/train/bottle_0294_normalised +bottle/train/bottle_0142_normalised +bottle/train/bottle_0223_normalised +bottle/train/bottle_0289_normalised +bottle/train/bottle_0280_normalised +bottle/train/bottle_0104_normalised +bottle/train/bottle_0186_normalised +bottle/train/bottle_0255_normalised +bottle/train/bottle_0306_normalised +bottle/train/bottle_0020_normalised +bottle/train/bottle_0036_normalised +bottle/train/bottle_0187_normalised +bottle/train/bottle_0080_normalised +bottle/test/bottle_0409_normalised +bottle/test/bottle_0370_normalised +bottle/test/bottle_0417_normalised +bottle/test/bottle_0419_normalised +bottle/test/bottle_0429_normalised +bottle/test/bottle_0416_normalised +bottle/test/bottle_0403_normalised +bottle/test/bottle_0354_normalised +bottle/test/bottle_0352_normalised +bottle/test/bottle_0382_normalised +bottle/test/bottle_0345_normalised +bottle/test/bottle_0394_normalised +bottle/test/bottle_0427_normalised +bottle/test/bottle_0435_normalised +bottle/test/bottle_0405_normalised +bottle/test/bottle_0393_normalised +bottle/test/bottle_0366_normalised +bottle/test/bottle_0359_normalised +bottle/test/bottle_0428_normalised +bottle/test/bottle_0399_normalised +bottle/test/bottle_0385_normalised +bottle/test/bottle_0411_normalised +bottle/test/bottle_0367_normalised +bottle/test/bottle_0364_normalised +bottle/test/bottle_0406_normalised +bottle/test/bottle_0357_normalised +bottle/test/bottle_0356_normalised +bottle/test/bottle_0338_normalised +bottle/test/bottle_0358_normalised +bottle/test/bottle_0362_normalised +bottle/test/bottle_0424_normalised +bottle/test/bottle_0368_normalised +bottle/test/bottle_0422_normalised +bottle/test/bottle_0426_normalised +bottle/test/bottle_0342_normalised +bottle/test/bottle_0408_normalised +bottle/test/bottle_0337_normalised +bottle/test/bottle_0412_normalised +bottle/test/bottle_0355_normalised +bottle/test/bottle_0353_normalised +bottle/test/bottle_0363_normalised +bottle/test/bottle_0400_normalised +bottle/test/bottle_0420_normalised +bottle/test/bottle_0395_normalised +bottle/test/bottle_0388_normalised +bottle/test/bottle_0351_normalised +bottle/test/bottle_0340_normalised +bottle/test/bottle_0365_normalised +bottle/test/bottle_0361_normalised +bottle/test/bottle_0407_normalised +bottle/test/bottle_0423_normalised +bottle/test/bottle_0344_normalised +bottle/test/bottle_0346_normalised +bottle/test/bottle_0383_normalised +bottle/test/bottle_0425_normalised +bottle/test/bottle_0339_normalised +bottle/test/bottle_0386_normalised +bottle/test/bottle_0415_normalised +bottle/test/bottle_0433_normalised +bottle/test/bottle_0392_normalised +bottle/test/bottle_0432_normalised +bottle/test/bottle_0414_normalised +bottle/test/bottle_0397_normalised +bottle/test/bottle_0396_normalised +bottle/test/bottle_0373_normalised +bottle/test/bottle_0343_normalised +bottle/test/bottle_0379_normalised +bottle/test/bottle_0350_normalised +bottle/test/bottle_0401_normalised +bottle/test/bottle_0336_normalised +bottle/test/bottle_0390_normalised +bottle/test/bottle_0347_normalised +bottle/test/bottle_0374_normalised +bottle/test/bottle_0349_normalised +bottle/test/bottle_0387_normalised +bottle/test/bottle_0421_normalised +bottle/test/bottle_0380_normalised +bottle/test/bottle_0398_normalised +bottle/test/bottle_0375_normalised +bottle/test/bottle_0434_normalised +bottle/test/bottle_0391_normalised +bottle/test/bottle_0372_normalised +bottle/test/bottle_0384_normalised +bottle/test/bottle_0341_normalised +bottle/test/bottle_0404_normalised +bottle/test/bottle_0389_normalised +bottle/test/bottle_0378_normalised +bottle/test/bottle_0376_normalised +bottle/test/bottle_0369_normalised +bottle/test/bottle_0371_normalised +bottle/test/bottle_0431_normalised +bottle/test/bottle_0410_normalised +bottle/test/bottle_0360_normalised +bottle/test/bottle_0418_normalised +bottle/test/bottle_0377_normalised +bottle/test/bottle_0381_normalised +bottle/test/bottle_0413_normalised +bottle/test/bottle_0402_normalised +bottle/test/bottle_0348_normalised +bottle/test/bottle_0430_normalised +tv_stand/train/tv_stand_0004_normalised +tv_stand/train/tv_stand_0041_normalised +tv_stand/train/tv_stand_0038_normalised +tv_stand/train/tv_stand_0243_normalised +tv_stand/train/tv_stand_0034_normalised +tv_stand/train/tv_stand_0024_normalised +tv_stand/train/tv_stand_0126_normalised +tv_stand/train/tv_stand_0199_normalised +tv_stand/train/tv_stand_0085_normalised +tv_stand/train/tv_stand_0147_normalised +tv_stand/train/tv_stand_0229_normalised +tv_stand/train/tv_stand_0037_normalised +tv_stand/train/tv_stand_0011_normalised +tv_stand/train/tv_stand_0091_normalised +tv_stand/train/tv_stand_0042_normalised +tv_stand/train/tv_stand_0093_normalised +tv_stand/train/tv_stand_0063_normalised +tv_stand/train/tv_stand_0036_normalised +tv_stand/train/tv_stand_0226_normalised +tv_stand/train/tv_stand_0010_normalised +tv_stand/train/tv_stand_0066_normalised +tv_stand/train/tv_stand_0206_normalised +tv_stand/train/tv_stand_0221_normalised +tv_stand/train/tv_stand_0022_normalised +tv_stand/train/tv_stand_0201_normalised +tv_stand/train/tv_stand_0258_normalised +tv_stand/train/tv_stand_0084_normalised +tv_stand/train/tv_stand_0152_normalised +tv_stand/train/tv_stand_0111_normalised +tv_stand/train/tv_stand_0160_normalised +tv_stand/train/tv_stand_0252_normalised +tv_stand/train/tv_stand_0067_normalised +tv_stand/train/tv_stand_0033_normalised +tv_stand/train/tv_stand_0029_normalised +tv_stand/train/tv_stand_0154_normalised +tv_stand/train/tv_stand_0060_normalised +tv_stand/train/tv_stand_0241_normalised +tv_stand/train/tv_stand_0122_normalised +tv_stand/train/tv_stand_0035_normalised +tv_stand/train/tv_stand_0108_normalised +tv_stand/train/tv_stand_0074_normalised +tv_stand/train/tv_stand_0103_normalised +tv_stand/train/tv_stand_0005_normalised +tv_stand/train/tv_stand_0148_normalised +tv_stand/train/tv_stand_0064_normalised +tv_stand/train/tv_stand_0247_normalised +tv_stand/train/tv_stand_0145_normalised +tv_stand/train/tv_stand_0259_normalised +tv_stand/train/tv_stand_0039_normalised +tv_stand/train/tv_stand_0129_normalised +tv_stand/train/tv_stand_0032_normalised +tv_stand/train/tv_stand_0150_normalised +tv_stand/train/tv_stand_0204_normalised +tv_stand/train/tv_stand_0052_normalised +tv_stand/train/tv_stand_0089_normalised +tv_stand/train/tv_stand_0244_normalised +tv_stand/train/tv_stand_0055_normalised +tv_stand/train/tv_stand_0139_normalised +tv_stand/train/tv_stand_0138_normalised +tv_stand/train/tv_stand_0128_normalised +tv_stand/train/tv_stand_0133_normalised +tv_stand/train/tv_stand_0257_normalised +tv_stand/train/tv_stand_0070_normalised +tv_stand/train/tv_stand_0162_normalised +tv_stand/train/tv_stand_0188_normalised +tv_stand/train/tv_stand_0230_normalised +tv_stand/train/tv_stand_0105_normalised +tv_stand/train/tv_stand_0179_normalised +tv_stand/train/tv_stand_0249_normalised +tv_stand/train/tv_stand_0140_normalised +tv_stand/train/tv_stand_0009_normalised +tv_stand/train/tv_stand_0015_normalised +tv_stand/train/tv_stand_0116_normalised +tv_stand/train/tv_stand_0196_normalised +tv_stand/train/tv_stand_0159_normalised +tv_stand/train/tv_stand_0131_normalised +tv_stand/train/tv_stand_0118_normalised +tv_stand/train/tv_stand_0180_normalised +tv_stand/train/tv_stand_0231_normalised +tv_stand/train/tv_stand_0027_normalised +tv_stand/train/tv_stand_0068_normalised +tv_stand/train/tv_stand_0113_normalised +tv_stand/train/tv_stand_0242_normalised +tv_stand/train/tv_stand_0237_normalised +tv_stand/train/tv_stand_0053_normalised +tv_stand/train/tv_stand_0031_normalised +tv_stand/train/tv_stand_0001_normalised +tv_stand/train/tv_stand_0267_normalised +tv_stand/train/tv_stand_0182_normalised +tv_stand/train/tv_stand_0219_normalised +tv_stand/train/tv_stand_0026_normalised +tv_stand/train/tv_stand_0143_normalised +tv_stand/train/tv_stand_0209_normalised +tv_stand/train/tv_stand_0216_normalised +tv_stand/train/tv_stand_0239_normalised +tv_stand/train/tv_stand_0245_normalised +tv_stand/train/tv_stand_0260_normalised +tv_stand/train/tv_stand_0210_normalised +tv_stand/train/tv_stand_0048_normalised +tv_stand/train/tv_stand_0059_normalised +tv_stand/train/tv_stand_0264_normalised +tv_stand/train/tv_stand_0213_normalised +tv_stand/train/tv_stand_0170_normalised +tv_stand/train/tv_stand_0106_normalised +tv_stand/train/tv_stand_0175_normalised +tv_stand/train/tv_stand_0082_normalised +tv_stand/train/tv_stand_0049_normalised +tv_stand/train/tv_stand_0194_normalised +tv_stand/train/tv_stand_0200_normalised +tv_stand/train/tv_stand_0023_normalised +tv_stand/train/tv_stand_0110_normalised +tv_stand/train/tv_stand_0078_normalised +tv_stand/train/tv_stand_0090_normalised +tv_stand/train/tv_stand_0232_normalised +tv_stand/train/tv_stand_0030_normalised +tv_stand/train/tv_stand_0142_normalised +tv_stand/train/tv_stand_0255_normalised +tv_stand/train/tv_stand_0212_normalised +tv_stand/train/tv_stand_0061_normalised +tv_stand/train/tv_stand_0007_normalised +tv_stand/train/tv_stand_0050_normalised +tv_stand/train/tv_stand_0130_normalised +tv_stand/train/tv_stand_0065_normalised +tv_stand/train/tv_stand_0207_normalised +tv_stand/train/tv_stand_0202_normalised +tv_stand/train/tv_stand_0087_normalised +tv_stand/train/tv_stand_0197_normalised +tv_stand/train/tv_stand_0043_normalised +tv_stand/train/tv_stand_0236_normalised +tv_stand/train/tv_stand_0171_normalised +tv_stand/train/tv_stand_0102_normalised +tv_stand/train/tv_stand_0114_normalised +tv_stand/train/tv_stand_0190_normalised +tv_stand/train/tv_stand_0261_normalised +tv_stand/train/tv_stand_0168_normalised +tv_stand/train/tv_stand_0228_normalised +tv_stand/train/tv_stand_0079_normalised +tv_stand/train/tv_stand_0136_normalised +tv_stand/train/tv_stand_0018_normalised +tv_stand/train/tv_stand_0176_normalised +tv_stand/train/tv_stand_0156_normalised +tv_stand/train/tv_stand_0020_normalised +tv_stand/train/tv_stand_0092_normalised +tv_stand/train/tv_stand_0189_normalised +tv_stand/train/tv_stand_0246_normalised +tv_stand/train/tv_stand_0017_normalised +tv_stand/train/tv_stand_0262_normalised +tv_stand/train/tv_stand_0137_normalised +tv_stand/train/tv_stand_0238_normalised +tv_stand/train/tv_stand_0161_normalised +tv_stand/train/tv_stand_0123_normalised +tv_stand/train/tv_stand_0251_normalised +tv_stand/train/tv_stand_0191_normalised +tv_stand/train/tv_stand_0071_normalised +tv_stand/train/tv_stand_0253_normalised +tv_stand/train/tv_stand_0040_normalised +tv_stand/train/tv_stand_0134_normalised +tv_stand/train/tv_stand_0235_normalised +tv_stand/train/tv_stand_0220_normalised +tv_stand/train/tv_stand_0028_normalised +tv_stand/train/tv_stand_0127_normalised +tv_stand/train/tv_stand_0164_normalised +tv_stand/train/tv_stand_0240_normalised +tv_stand/train/tv_stand_0178_normalised +tv_stand/train/tv_stand_0121_normalised +tv_stand/train/tv_stand_0076_normalised +tv_stand/train/tv_stand_0119_normalised +tv_stand/train/tv_stand_0124_normalised +tv_stand/train/tv_stand_0144_normalised +tv_stand/train/tv_stand_0073_normalised +tv_stand/train/tv_stand_0167_normalised +tv_stand/train/tv_stand_0157_normalised +tv_stand/train/tv_stand_0205_normalised +tv_stand/train/tv_stand_0222_normalised +tv_stand/train/tv_stand_0198_normalised +tv_stand/train/tv_stand_0115_normalised +tv_stand/train/tv_stand_0155_normalised +tv_stand/train/tv_stand_0225_normalised +tv_stand/train/tv_stand_0094_normalised +tv_stand/train/tv_stand_0072_normalised +tv_stand/train/tv_stand_0254_normalised +tv_stand/train/tv_stand_0265_normalised +tv_stand/train/tv_stand_0256_normalised +tv_stand/train/tv_stand_0016_normalised +tv_stand/train/tv_stand_0069_normalised +tv_stand/train/tv_stand_0051_normalised +tv_stand/train/tv_stand_0013_normalised +tv_stand/train/tv_stand_0096_normalised +tv_stand/train/tv_stand_0135_normalised +tv_stand/train/tv_stand_0203_normalised +tv_stand/train/tv_stand_0169_normalised +tv_stand/train/tv_stand_0233_normalised +tv_stand/train/tv_stand_0104_normalised +tv_stand/train/tv_stand_0006_normalised +tv_stand/train/tv_stand_0248_normalised +tv_stand/train/tv_stand_0056_normalised +tv_stand/train/tv_stand_0218_normalised +tv_stand/train/tv_stand_0003_normalised +tv_stand/train/tv_stand_0014_normalised +tv_stand/train/tv_stand_0158_normalised +tv_stand/train/tv_stand_0083_normalised +tv_stand/train/tv_stand_0058_normalised +tv_stand/train/tv_stand_0095_normalised +tv_stand/train/tv_stand_0062_normalised +tv_stand/train/tv_stand_0099_normalised +tv_stand/train/tv_stand_0012_normalised +tv_stand/train/tv_stand_0263_normalised +tv_stand/train/tv_stand_0174_normalised +tv_stand/train/tv_stand_0166_normalised +tv_stand/train/tv_stand_0223_normalised +tv_stand/train/tv_stand_0224_normalised +tv_stand/train/tv_stand_0192_normalised +tv_stand/train/tv_stand_0109_normalised +tv_stand/train/tv_stand_0193_normalised +tv_stand/train/tv_stand_0184_normalised +tv_stand/train/tv_stand_0044_normalised +tv_stand/train/tv_stand_0021_normalised +tv_stand/train/tv_stand_0151_normalised +tv_stand/train/tv_stand_0195_normalised +tv_stand/train/tv_stand_0165_normalised +tv_stand/train/tv_stand_0107_normalised +tv_stand/train/tv_stand_0057_normalised +tv_stand/train/tv_stand_0177_normalised +tv_stand/train/tv_stand_0217_normalised +tv_stand/train/tv_stand_0208_normalised +tv_stand/train/tv_stand_0046_normalised +tv_stand/train/tv_stand_0101_normalised +tv_stand/train/tv_stand_0153_normalised +tv_stand/train/tv_stand_0081_normalised +tv_stand/train/tv_stand_0146_normalised +tv_stand/train/tv_stand_0149_normalised +tv_stand/train/tv_stand_0132_normalised +tv_stand/train/tv_stand_0214_normalised +tv_stand/train/tv_stand_0266_normalised +tv_stand/train/tv_stand_0097_normalised +tv_stand/train/tv_stand_0112_normalised +tv_stand/train/tv_stand_0002_normalised +tv_stand/train/tv_stand_0120_normalised +tv_stand/train/tv_stand_0054_normalised +tv_stand/train/tv_stand_0047_normalised +tv_stand/train/tv_stand_0125_normalised +tv_stand/train/tv_stand_0187_normalised +tv_stand/train/tv_stand_0185_normalised +tv_stand/train/tv_stand_0025_normalised +tv_stand/train/tv_stand_0186_normalised +tv_stand/train/tv_stand_0098_normalised +tv_stand/train/tv_stand_0172_normalised +tv_stand/train/tv_stand_0234_normalised +tv_stand/train/tv_stand_0019_normalised +tv_stand/train/tv_stand_0075_normalised +tv_stand/train/tv_stand_0045_normalised +tv_stand/train/tv_stand_0141_normalised +tv_stand/train/tv_stand_0183_normalised +tv_stand/train/tv_stand_0080_normalised +tv_stand/train/tv_stand_0117_normalised +tv_stand/train/tv_stand_0211_normalised +tv_stand/train/tv_stand_0215_normalised +tv_stand/train/tv_stand_0008_normalised +tv_stand/train/tv_stand_0100_normalised +tv_stand/train/tv_stand_0250_normalised +tv_stand/train/tv_stand_0181_normalised +tv_stand/train/tv_stand_0086_normalised +tv_stand/train/tv_stand_0173_normalised +tv_stand/train/tv_stand_0077_normalised +tv_stand/train/tv_stand_0163_normalised +tv_stand/train/tv_stand_0227_normalised +tv_stand/train/tv_stand_0088_normalised +tv_stand/test/tv_stand_0319_normalised +tv_stand/test/tv_stand_0356_normalised +tv_stand/test/tv_stand_0367_normalised +tv_stand/test/tv_stand_0332_normalised +tv_stand/test/tv_stand_0365_normalised +tv_stand/test/tv_stand_0311_normalised +tv_stand/test/tv_stand_0285_normalised +tv_stand/test/tv_stand_0361_normalised +tv_stand/test/tv_stand_0289_normalised +tv_stand/test/tv_stand_0271_normalised +tv_stand/test/tv_stand_0312_normalised +tv_stand/test/tv_stand_0278_normalised +tv_stand/test/tv_stand_0355_normalised +tv_stand/test/tv_stand_0317_normalised +tv_stand/test/tv_stand_0338_normalised +tv_stand/test/tv_stand_0287_normalised +tv_stand/test/tv_stand_0321_normalised +tv_stand/test/tv_stand_0346_normalised +tv_stand/test/tv_stand_0349_normalised +tv_stand/test/tv_stand_0337_normalised +tv_stand/test/tv_stand_0300_normalised +tv_stand/test/tv_stand_0353_normalised +tv_stand/test/tv_stand_0327_normalised +tv_stand/test/tv_stand_0292_normalised +tv_stand/test/tv_stand_0291_normalised +tv_stand/test/tv_stand_0324_normalised +tv_stand/test/tv_stand_0308_normalised +tv_stand/test/tv_stand_0340_normalised +tv_stand/test/tv_stand_0273_normalised +tv_stand/test/tv_stand_0315_normalised +tv_stand/test/tv_stand_0279_normalised +tv_stand/test/tv_stand_0360_normalised +tv_stand/test/tv_stand_0296_normalised +tv_stand/test/tv_stand_0283_normalised +tv_stand/test/tv_stand_0364_normalised +tv_stand/test/tv_stand_0299_normalised +tv_stand/test/tv_stand_0334_normalised +tv_stand/test/tv_stand_0347_normalised +tv_stand/test/tv_stand_0363_normalised +tv_stand/test/tv_stand_0366_normalised +tv_stand/test/tv_stand_0352_normalised +tv_stand/test/tv_stand_0343_normalised +tv_stand/test/tv_stand_0294_normalised +tv_stand/test/tv_stand_0303_normalised +tv_stand/test/tv_stand_0330_normalised +tv_stand/test/tv_stand_0286_normalised +tv_stand/test/tv_stand_0357_normalised +tv_stand/test/tv_stand_0301_normalised +tv_stand/test/tv_stand_0351_normalised +tv_stand/test/tv_stand_0276_normalised +tv_stand/test/tv_stand_0280_normalised +tv_stand/test/tv_stand_0302_normalised +tv_stand/test/tv_stand_0322_normalised +tv_stand/test/tv_stand_0341_normalised +tv_stand/test/tv_stand_0306_normalised +tv_stand/test/tv_stand_0270_normalised +tv_stand/test/tv_stand_0359_normalised +tv_stand/test/tv_stand_0333_normalised +tv_stand/test/tv_stand_0342_normalised +tv_stand/test/tv_stand_0336_normalised +tv_stand/test/tv_stand_0358_normalised +tv_stand/test/tv_stand_0295_normalised +tv_stand/test/tv_stand_0326_normalised +tv_stand/test/tv_stand_0268_normalised +tv_stand/test/tv_stand_0329_normalised +tv_stand/test/tv_stand_0284_normalised +tv_stand/test/tv_stand_0335_normalised +tv_stand/test/tv_stand_0328_normalised +tv_stand/test/tv_stand_0277_normalised +tv_stand/test/tv_stand_0309_normalised +tv_stand/test/tv_stand_0293_normalised +tv_stand/test/tv_stand_0275_normalised +tv_stand/test/tv_stand_0290_normalised +tv_stand/test/tv_stand_0344_normalised +tv_stand/test/tv_stand_0331_normalised +tv_stand/test/tv_stand_0350_normalised +tv_stand/test/tv_stand_0320_normalised +tv_stand/test/tv_stand_0310_normalised +tv_stand/test/tv_stand_0282_normalised +tv_stand/test/tv_stand_0304_normalised +tv_stand/test/tv_stand_0325_normalised +tv_stand/test/tv_stand_0348_normalised +tv_stand/test/tv_stand_0269_normalised +tv_stand/test/tv_stand_0314_normalised +tv_stand/test/tv_stand_0272_normalised +tv_stand/test/tv_stand_0339_normalised +tv_stand/test/tv_stand_0345_normalised +tv_stand/test/tv_stand_0281_normalised +tv_stand/test/tv_stand_0316_normalised +tv_stand/test/tv_stand_0298_normalised +tv_stand/test/tv_stand_0297_normalised +tv_stand/test/tv_stand_0362_normalised +tv_stand/test/tv_stand_0318_normalised +tv_stand/test/tv_stand_0313_normalised +tv_stand/test/tv_stand_0354_normalised +tv_stand/test/tv_stand_0288_normalised +tv_stand/test/tv_stand_0274_normalised +tv_stand/test/tv_stand_0305_normalised +tv_stand/test/tv_stand_0323_normalised +tv_stand/test/tv_stand_0307_normalised +table/train/table_0066_normalised +table/train/table_0153_normalised +table/train/table_0025_normalised +table/train/table_0036_normalised +table/train/table_0352_normalised +table/train/table_0108_normalised +table/train/table_0079_normalised +table/train/table_0237_normalised +table/train/table_0317_normalised +table/train/table_0004_normalised +table/train/table_0194_normalised +table/train/table_0034_normalised +table/train/table_0249_normalised +table/train/table_0076_normalised +table/train/table_0099_normalised +table/train/table_0125_normalised +table/train/table_0152_normalised +table/train/table_0176_normalised +table/train/table_0113_normalised +table/train/table_0013_normalised +table/train/table_0014_normalised +table/train/table_0118_normalised +table/train/table_0286_normalised +table/train/table_0244_normalised +table/train/table_0021_normalised +table/train/table_0010_normalised +table/train/table_0180_normalised +table/train/table_0229_normalised +table/train/table_0327_normalised +table/train/table_0151_normalised +table/train/table_0082_normalised +table/train/table_0379_normalised +table/train/table_0220_normalised +table/train/table_0306_normalised +table/train/table_0044_normalised +table/train/table_0215_normalised +table/train/table_0030_normalised +table/train/table_0336_normalised +table/train/table_0052_normalised +table/train/table_0050_normalised +table/train/table_0310_normalised +table/train/table_0123_normalised +table/train/table_0390_normalised +table/train/table_0294_normalised +table/train/table_0247_normalised +table/train/table_0209_normalised +table/train/table_0345_normalised +table/train/table_0100_normalised +table/train/table_0109_normalised +table/train/table_0027_normalised +table/train/table_0155_normalised +table/train/table_0264_normalised +table/train/table_0245_normalised +table/train/table_0190_normalised +table/train/table_0283_normalised +table/train/table_0383_normalised +table/train/table_0232_normalised +table/train/table_0046_normalised +table/train/table_0159_normalised +table/train/table_0362_normalised +table/train/table_0234_normalised +table/train/table_0095_normalised +table/train/table_0150_normalised +table/train/table_0199_normalised +table/train/table_0041_normalised +table/train/table_0083_normalised +table/train/table_0131_normalised +table/train/table_0260_normalised +table/train/table_0226_normalised +table/train/table_0331_normalised +table/train/table_0035_normalised +table/train/table_0056_normalised +table/train/table_0334_normalised +table/train/table_0037_normalised +table/train/table_0333_normalised +table/train/table_0356_normalised +table/train/table_0387_normalised +table/train/table_0110_normalised +table/train/table_0015_normalised +table/train/table_0078_normalised +table/train/table_0179_normalised +table/train/table_0139_normalised +table/train/table_0224_normalised +table/train/table_0240_normalised +table/train/table_0307_normalised +table/train/table_0341_normalised +table/train/table_0028_normalised +table/train/table_0295_normalised +table/train/table_0376_normalised +table/train/table_0068_normalised +table/train/table_0329_normalised +table/train/table_0289_normalised +table/train/table_0111_normalised +table/train/table_0385_normalised +table/train/table_0342_normalised +table/train/table_0162_normalised +table/train/table_0276_normalised +table/train/table_0177_normalised +table/train/table_0026_normalised +table/train/table_0322_normalised +table/train/table_0257_normalised +table/train/table_0060_normalised +table/train/table_0184_normalised +table/train/table_0114_normalised +table/train/table_0018_normalised +table/train/table_0236_normalised +table/train/table_0091_normalised +table/train/table_0282_normalised +table/train/table_0221_normalised +table/train/table_0338_normalised +table/train/table_0122_normalised +table/train/table_0092_normalised +table/train/table_0389_normalised +table/train/table_0364_normalised +table/train/table_0381_normalised +table/train/table_0116_normalised +table/train/table_0169_normalised +table/train/table_0273_normalised +table/train/table_0168_normalised +table/train/table_0378_normalised +table/train/table_0085_normalised +table/train/table_0185_normalised +table/train/table_0272_normalised +table/train/table_0073_normalised +table/train/table_0243_normalised +table/train/table_0228_normalised +table/train/table_0373_normalised +table/train/table_0261_normalised +table/train/table_0370_normalised +table/train/table_0170_normalised +table/train/table_0024_normalised +table/train/table_0368_normalised +table/train/table_0391_normalised +table/train/table_0204_normalised +table/train/table_0182_normalised +table/train/table_0011_normalised +table/train/table_0192_normalised +table/train/table_0112_normalised +table/train/table_0313_normalised +table/train/table_0163_normalised +table/train/table_0344_normalised +table/train/table_0297_normalised +table/train/table_0369_normalised +table/train/table_0157_normalised +table/train/table_0323_normalised +table/train/table_0262_normalised +table/train/table_0256_normalised +table/train/table_0315_normalised +table/train/table_0360_normalised +table/train/table_0254_normalised +table/train/table_0102_normalised +table/train/table_0316_normalised +table/train/table_0203_normalised +table/train/table_0219_normalised +table/train/table_0175_normalised +table/train/table_0324_normalised +table/train/table_0202_normalised +table/train/table_0055_normalised +table/train/table_0218_normalised +table/train/table_0259_normalised +table/train/table_0075_normalised +table/train/table_0339_normalised +table/train/table_0002_normalised +table/train/table_0127_normalised +table/train/table_0107_normalised +table/train/table_0140_normalised +table/train/table_0012_normalised +table/train/table_0216_normalised +table/train/table_0119_normalised +table/train/table_0263_normalised +table/train/table_0097_normalised +table/train/table_0222_normalised +table/train/table_0070_normalised +table/train/table_0019_normalised +table/train/table_0089_normalised +table/train/table_0359_normalised +table/train/table_0049_normalised +table/train/table_0255_normalised +table/train/table_0128_normalised +table/train/table_0217_normalised +table/train/table_0388_normalised +table/train/table_0296_normalised +table/train/table_0250_normalised +table/train/table_0009_normalised +table/train/table_0207_normalised +table/train/table_0214_normalised +table/train/table_0136_normalised +table/train/table_0308_normalised +table/train/table_0382_normalised +table/train/table_0268_normalised +table/train/table_0074_normalised +table/train/table_0016_normalised +table/train/table_0129_normalised +table/train/table_0158_normalised +table/train/table_0267_normalised +table/train/table_0300_normalised +table/train/table_0156_normalised +table/train/table_0281_normalised +table/train/table_0301_normalised +table/train/table_0183_normalised +table/train/table_0366_normalised +table/train/table_0134_normalised +table/train/table_0374_normalised +table/train/table_0290_normalised +table/train/table_0274_normalised +table/train/table_0246_normalised +table/train/table_0059_normalised +table/train/table_0380_normalised +table/train/table_0251_normalised +table/train/table_0332_normalised +table/train/table_0293_normalised +table/train/table_0130_normalised +table/train/table_0042_normalised +table/train/table_0285_normalised +table/train/table_0354_normalised +table/train/table_0053_normalised +table/train/table_0233_normalised +table/train/table_0124_normalised +table/train/table_0343_normalised +table/train/table_0069_normalised +table/train/table_0080_normalised +table/train/table_0271_normalised +table/train/table_0086_normalised +table/train/table_0349_normalised +table/train/table_0277_normalised +table/train/table_0003_normalised +table/train/table_0126_normalised +table/train/table_0094_normalised +table/train/table_0238_normalised +table/train/table_0326_normalised +table/train/table_0072_normalised +table/train/table_0230_normalised +table/train/table_0005_normalised +table/train/table_0357_normalised +table/train/table_0121_normalised +table/train/table_0064_normalised +table/train/table_0143_normalised +table/train/table_0033_normalised +table/train/table_0031_normalised +table/train/table_0231_normalised +table/train/table_0208_normalised +table/train/table_0265_normalised +table/train/table_0105_normalised +table/train/table_0258_normalised +table/train/table_0142_normalised +table/train/table_0051_normalised +table/train/table_0133_normalised +table/train/table_0137_normalised +table/train/table_0103_normalised +table/train/table_0386_normalised +table/train/table_0269_normalised +table/train/table_0171_normalised +table/train/table_0384_normalised +table/train/table_0166_normalised +table/train/table_0302_normalised +table/train/table_0298_normalised +table/train/table_0022_normalised +table/train/table_0191_normalised +table/train/table_0205_normalised +table/train/table_0047_normalised +table/train/table_0029_normalised +table/train/table_0291_normalised +table/train/table_0299_normalised +table/train/table_0305_normalised +table/train/table_0145_normalised +table/train/table_0188_normalised +table/train/table_0213_normalised +table/train/table_0189_normalised +table/train/table_0101_normalised +table/train/table_0304_normalised +table/train/table_0165_normalised +table/train/table_0098_normalised +table/train/table_0061_normalised +table/train/table_0227_normalised +table/train/table_0330_normalised +table/train/table_0032_normalised +table/train/table_0063_normalised +table/train/table_0148_normalised +table/train/table_0358_normalised +table/train/table_0211_normalised +table/train/table_0174_normalised +table/train/table_0007_normalised +table/train/table_0303_normalised +table/train/table_0200_normalised +table/train/table_0346_normalised +table/train/table_0351_normalised +table/train/table_0377_normalised +table/train/table_0320_normalised +table/train/table_0340_normalised +table/train/table_0161_normalised +table/train/table_0178_normalised +table/train/table_0275_normalised +table/train/table_0337_normalised +table/train/table_0008_normalised +table/train/table_0045_normalised +table/train/table_0325_normalised +table/train/table_0196_normalised +table/train/table_0160_normalised +table/train/table_0173_normalised +table/train/table_0135_normalised +table/train/table_0017_normalised +table/train/table_0292_normalised +table/train/table_0039_normalised +table/train/table_0318_normalised +table/train/table_0077_normalised +table/train/table_0248_normalised +table/train/table_0225_normalised +table/train/table_0319_normalised +table/train/table_0372_normalised +table/train/table_0154_normalised +table/train/table_0106_normalised +table/train/table_0048_normalised +table/train/table_0288_normalised +table/train/table_0186_normalised +table/train/table_0057_normalised +table/train/table_0355_normalised +table/train/table_0363_normalised +table/train/table_0164_normalised +table/train/table_0104_normalised +table/train/table_0353_normalised +table/train/table_0347_normalised +table/train/table_0198_normalised +table/train/table_0193_normalised +table/train/table_0348_normalised +table/train/table_0210_normalised +table/train/table_0023_normalised +table/train/table_0006_normalised +table/train/table_0043_normalised +table/train/table_0081_normalised +table/train/table_0038_normalised +table/train/table_0090_normalised +table/train/table_0242_normalised +table/train/table_0172_normalised +table/train/table_0146_normalised +table/train/table_0084_normalised +table/train/table_0167_normalised +table/train/table_0040_normalised +table/train/table_0309_normalised +table/train/table_0253_normalised +table/train/table_0149_normalised +table/train/table_0392_normalised +table/train/table_0350_normalised +table/train/table_0311_normalised +table/train/table_0279_normalised +table/train/table_0001_normalised +table/train/table_0138_normalised +table/train/table_0120_normalised +table/train/table_0314_normalised +table/train/table_0020_normalised +table/train/table_0067_normalised +table/train/table_0088_normalised +table/train/table_0241_normalised +table/train/table_0141_normalised +table/train/table_0266_normalised +table/train/table_0147_normalised +table/train/table_0197_normalised +table/train/table_0117_normalised +table/train/table_0371_normalised +table/train/table_0321_normalised +table/train/table_0287_normalised +table/train/table_0132_normalised +table/train/table_0181_normalised +table/train/table_0096_normalised +table/train/table_0239_normalised +table/train/table_0071_normalised +table/train/table_0335_normalised +table/train/table_0058_normalised +table/train/table_0278_normalised +table/train/table_0223_normalised +table/train/table_0361_normalised +table/train/table_0270_normalised +table/train/table_0065_normalised +table/train/table_0367_normalised +table/train/table_0062_normalised +table/train/table_0144_normalised +table/train/table_0365_normalised +table/train/table_0212_normalised +table/train/table_0252_normalised +table/train/table_0280_normalised +table/train/table_0054_normalised +table/train/table_0201_normalised +table/train/table_0115_normalised +table/train/table_0284_normalised +table/train/table_0087_normalised +table/train/table_0328_normalised +table/train/table_0195_normalised +table/train/table_0206_normalised +table/train/table_0312_normalised +table/train/table_0235_normalised +table/train/table_0375_normalised +table/train/table_0093_normalised +table/train/table_0187_normalised +table/test/table_0487_normalised +table/test/table_0476_normalised +table/test/table_0471_normalised +table/test/table_0434_normalised +table/test/table_0459_normalised +table/test/table_0449_normalised +table/test/table_0477_normalised +table/test/table_0443_normalised +table/test/table_0492_normalised +table/test/table_0437_normalised +table/test/table_0422_normalised +table/test/table_0468_normalised +table/test/table_0483_normalised +table/test/table_0441_normalised +table/test/table_0438_normalised +table/test/table_0419_normalised +table/test/table_0467_normalised +table/test/table_0474_normalised +table/test/table_0399_normalised +table/test/table_0420_normalised +table/test/table_0489_normalised +table/test/table_0396_normalised +table/test/table_0430_normalised +table/test/table_0446_normalised +table/test/table_0415_normalised +table/test/table_0488_normalised +table/test/table_0393_normalised +table/test/table_0421_normalised +table/test/table_0416_normalised +table/test/table_0448_normalised +table/test/table_0482_normalised +table/test/table_0394_normalised +table/test/table_0465_normalised +table/test/table_0417_normalised +table/test/table_0432_normalised +table/test/table_0484_normalised +table/test/table_0479_normalised +table/test/table_0455_normalised +table/test/table_0480_normalised +table/test/table_0463_normalised +table/test/table_0408_normalised +table/test/table_0426_normalised +table/test/table_0444_normalised +table/test/table_0466_normalised +table/test/table_0411_normalised +table/test/table_0460_normalised +table/test/table_0407_normalised +table/test/table_0404_normalised +table/test/table_0486_normalised +table/test/table_0427_normalised +table/test/table_0406_normalised +table/test/table_0464_normalised +table/test/table_0447_normalised +table/test/table_0429_normalised +table/test/table_0414_normalised +table/test/table_0451_normalised +table/test/table_0461_normalised +table/test/table_0481_normalised +table/test/table_0398_normalised +table/test/table_0439_normalised +table/test/table_0412_normalised +table/test/table_0431_normalised +table/test/table_0395_normalised +table/test/table_0445_normalised +table/test/table_0440_normalised +table/test/table_0454_normalised +table/test/table_0433_normalised +table/test/table_0453_normalised +table/test/table_0462_normalised +table/test/table_0470_normalised +table/test/table_0402_normalised +table/test/table_0452_normalised +table/test/table_0473_normalised +table/test/table_0428_normalised +table/test/table_0490_normalised +table/test/table_0436_normalised +table/test/table_0405_normalised +table/test/table_0423_normalised +table/test/table_0400_normalised +table/test/table_0424_normalised +table/test/table_0435_normalised +table/test/table_0485_normalised +table/test/table_0472_normalised +table/test/table_0491_normalised +table/test/table_0413_normalised +table/test/table_0457_normalised +table/test/table_0475_normalised +table/test/table_0458_normalised +table/test/table_0397_normalised +table/test/table_0401_normalised +table/test/table_0478_normalised +table/test/table_0410_normalised +table/test/table_0469_normalised +table/test/table_0442_normalised +table/test/table_0450_normalised +table/test/table_0409_normalised +table/test/table_0403_normalised +table/test/table_0425_normalised +table/test/table_0418_normalised +table/test/table_0456_normalised +door/train/door_0091_normalised +door/train/door_0074_normalised +door/train/door_0056_normalised +door/train/door_0102_normalised +door/train/door_0012_normalised +door/train/door_0079_normalised +door/train/door_0023_normalised +door/train/door_0032_normalised +door/train/door_0059_normalised +door/train/door_0064_normalised +door/train/door_0003_normalised +door/train/door_0109_normalised +door/train/door_0036_normalised +door/train/door_0068_normalised +door/train/door_0019_normalised +door/train/door_0037_normalised +door/train/door_0047_normalised +door/train/door_0100_normalised +door/train/door_0062_normalised +door/train/door_0098_normalised +door/train/door_0106_normalised +door/train/door_0055_normalised +door/train/door_0014_normalised +door/train/door_0051_normalised +door/train/door_0021_normalised +door/train/door_0029_normalised +door/train/door_0025_normalised +door/train/door_0066_normalised +door/train/door_0085_normalised +door/train/door_0052_normalised +door/train/door_0015_normalised +door/train/door_0050_normalised +door/train/door_0080_normalised +door/train/door_0099_normalised +door/train/door_0078_normalised +door/train/door_0013_normalised +door/train/door_0087_normalised +door/train/door_0028_normalised +door/train/door_0081_normalised +door/train/door_0006_normalised +door/train/door_0016_normalised +door/train/door_0076_normalised +door/train/door_0017_normalised +door/train/door_0065_normalised +door/train/door_0020_normalised +door/train/door_0070_normalised +door/train/door_0095_normalised +door/train/door_0018_normalised +door/train/door_0105_normalised +door/train/door_0008_normalised +door/train/door_0043_normalised +door/train/door_0088_normalised +door/train/door_0007_normalised +door/train/door_0046_normalised +door/train/door_0061_normalised +door/train/door_0101_normalised +door/train/door_0041_normalised +door/train/door_0075_normalised +door/train/door_0083_normalised +door/train/door_0104_normalised +door/train/door_0094_normalised +door/train/door_0108_normalised +door/train/door_0084_normalised +door/train/door_0001_normalised +door/train/door_0071_normalised +door/train/door_0053_normalised +door/train/door_0033_normalised +door/train/door_0034_normalised +door/train/door_0027_normalised +door/train/door_0093_normalised +door/train/door_0063_normalised +door/train/door_0058_normalised +door/train/door_0038_normalised +door/train/door_0039_normalised +door/train/door_0103_normalised +door/train/door_0089_normalised +door/train/door_0026_normalised +door/train/door_0067_normalised +door/train/door_0096_normalised +door/train/door_0004_normalised +door/train/door_0022_normalised +door/train/door_0044_normalised +door/train/door_0040_normalised +door/train/door_0024_normalised +door/train/door_0090_normalised +door/train/door_0011_normalised +door/train/door_0077_normalised +door/train/door_0086_normalised +door/train/door_0045_normalised +door/train/door_0097_normalised +door/train/door_0107_normalised +door/train/door_0082_normalised +door/train/door_0048_normalised +door/train/door_0005_normalised +door/train/door_0009_normalised +door/train/door_0002_normalised +door/train/door_0057_normalised +door/train/door_0054_normalised +door/train/door_0049_normalised +door/train/door_0031_normalised +door/train/door_0092_normalised +door/train/door_0042_normalised +door/train/door_0035_normalised +door/train/door_0069_normalised +door/train/door_0060_normalised +door/train/door_0010_normalised +door/train/door_0072_normalised +door/train/door_0073_normalised +door/train/door_0030_normalised +door/test/door_0118_normalised +door/test/door_0127_normalised +door/test/door_0126_normalised +door/test/door_0120_normalised +door/test/door_0113_normalised +door/test/door_0123_normalised +door/test/door_0121_normalised +door/test/door_0128_normalised +door/test/door_0115_normalised +door/test/door_0114_normalised +door/test/door_0122_normalised +door/test/door_0111_normalised +door/test/door_0112_normalised +door/test/door_0117_normalised +door/test/door_0129_normalised +door/test/door_0110_normalised +door/test/door_0124_normalised +door/test/door_0116_normalised +door/test/door_0119_normalised +door/test/door_0125_normalised +sink/train/sink_0123_normalised +sink/train/sink_0069_normalised +sink/train/sink_0067_normalised +sink/train/sink_0066_normalised +sink/train/sink_0120_normalised +sink/train/sink_0092_normalised +sink/train/sink_0048_normalised +sink/train/sink_0023_normalised +sink/train/sink_0094_normalised +sink/train/sink_0002_normalised +sink/train/sink_0103_normalised +sink/train/sink_0118_normalised +sink/train/sink_0059_normalised +sink/train/sink_0122_normalised +sink/train/sink_0029_normalised +sink/train/sink_0003_normalised +sink/train/sink_0009_normalised +sink/train/sink_0040_normalised +sink/train/sink_0056_normalised +sink/train/sink_0017_normalised +sink/train/sink_0076_normalised +sink/train/sink_0098_normalised +sink/train/sink_0038_normalised +sink/train/sink_0093_normalised +sink/train/sink_0063_normalised +sink/train/sink_0062_normalised +sink/train/sink_0045_normalised +sink/train/sink_0099_normalised +sink/train/sink_0078_normalised +sink/train/sink_0102_normalised +sink/train/sink_0020_normalised +sink/train/sink_0112_normalised +sink/train/sink_0026_normalised +sink/train/sink_0064_normalised +sink/train/sink_0001_normalised +sink/train/sink_0024_normalised +sink/train/sink_0071_normalised +sink/train/sink_0007_normalised +sink/train/sink_0049_normalised +sink/train/sink_0060_normalised +sink/train/sink_0041_normalised +sink/train/sink_0008_normalised +sink/train/sink_0019_normalised +sink/train/sink_0035_normalised +sink/train/sink_0033_normalised +sink/train/sink_0014_normalised +sink/train/sink_0039_normalised +sink/train/sink_0013_normalised +sink/train/sink_0113_normalised +sink/train/sink_0051_normalised +sink/train/sink_0104_normalised +sink/train/sink_0089_normalised +sink/train/sink_0101_normalised +sink/train/sink_0090_normalised +sink/train/sink_0125_normalised +sink/train/sink_0107_normalised +sink/train/sink_0083_normalised +sink/train/sink_0119_normalised +sink/train/sink_0096_normalised +sink/train/sink_0055_normalised +sink/train/sink_0121_normalised +sink/train/sink_0097_normalised +sink/train/sink_0085_normalised +sink/train/sink_0005_normalised +sink/train/sink_0022_normalised +sink/train/sink_0079_normalised +sink/train/sink_0070_normalised +sink/train/sink_0047_normalised +sink/train/sink_0031_normalised +sink/train/sink_0010_normalised +sink/train/sink_0015_normalised +sink/train/sink_0106_normalised +sink/train/sink_0117_normalised +sink/train/sink_0028_normalised +sink/train/sink_0065_normalised +sink/train/sink_0128_normalised +sink/train/sink_0077_normalised +sink/train/sink_0036_normalised +sink/train/sink_0086_normalised +sink/train/sink_0072_normalised +sink/train/sink_0124_normalised +sink/train/sink_0084_normalised +sink/train/sink_0030_normalised +sink/train/sink_0091_normalised +sink/train/sink_0114_normalised +sink/train/sink_0074_normalised +sink/train/sink_0046_normalised +sink/train/sink_0087_normalised +sink/train/sink_0012_normalised +sink/train/sink_0068_normalised +sink/train/sink_0016_normalised +sink/train/sink_0050_normalised +sink/train/sink_0006_normalised +sink/train/sink_0054_normalised +sink/train/sink_0105_normalised +sink/train/sink_0111_normalised +sink/train/sink_0053_normalised +sink/train/sink_0115_normalised +sink/train/sink_0075_normalised +sink/train/sink_0032_normalised +sink/train/sink_0021_normalised +sink/train/sink_0058_normalised +sink/train/sink_0127_normalised +sink/train/sink_0037_normalised +sink/train/sink_0057_normalised +sink/train/sink_0043_normalised +sink/train/sink_0126_normalised +sink/train/sink_0088_normalised +sink/train/sink_0110_normalised +sink/train/sink_0095_normalised +sink/train/sink_0080_normalised +sink/train/sink_0061_normalised +sink/train/sink_0100_normalised +sink/train/sink_0109_normalised +sink/train/sink_0108_normalised +sink/train/sink_0025_normalised +sink/train/sink_0004_normalised +sink/train/sink_0011_normalised +sink/train/sink_0044_normalised +sink/train/sink_0042_normalised +sink/train/sink_0027_normalised +sink/train/sink_0116_normalised +sink/train/sink_0052_normalised +sink/train/sink_0034_normalised +sink/train/sink_0073_normalised +sink/train/sink_0081_normalised +sink/train/sink_0018_normalised +sink/train/sink_0082_normalised +sink/test/sink_0147_normalised +sink/test/sink_0145_normalised +sink/test/sink_0138_normalised +sink/test/sink_0141_normalised +sink/test/sink_0143_normalised +sink/test/sink_0142_normalised +sink/test/sink_0135_normalised +sink/test/sink_0148_normalised +sink/test/sink_0132_normalised +sink/test/sink_0137_normalised +sink/test/sink_0139_normalised +sink/test/sink_0131_normalised +sink/test/sink_0129_normalised +sink/test/sink_0144_normalised +sink/test/sink_0134_normalised +sink/test/sink_0136_normalised +sink/test/sink_0146_normalised +sink/test/sink_0130_normalised +sink/test/sink_0133_normalised +sink/test/sink_0140_normalised +car/train/car_0076_normalised +car/train/car_0069_normalised +car/train/car_0140_normalised +car/train/car_0132_normalised +car/train/car_0033_normalised +car/train/car_0094_normalised +car/train/car_0099_normalised +car/train/car_0191_normalised +car/train/car_0117_normalised +car/train/car_0034_normalised +car/train/car_0122_normalised +car/train/car_0045_normalised +car/train/car_0022_normalised +car/train/car_0058_normalised +car/train/car_0181_normalised +car/train/car_0164_normalised +car/train/car_0037_normalised +car/train/car_0060_normalised +car/train/car_0116_normalised +car/train/car_0068_normalised +car/train/car_0012_normalised +car/train/car_0088_normalised +car/train/car_0137_normalised +car/train/car_0196_normalised +car/train/car_0013_normalised +car/train/car_0010_normalised +car/train/car_0129_normalised +car/train/car_0080_normalised +car/train/car_0001_normalised +car/train/car_0153_normalised +car/train/car_0113_normalised +car/train/car_0028_normalised +car/train/car_0084_normalised +car/train/car_0158_normalised +car/train/car_0110_normalised +car/train/car_0051_normalised +car/train/car_0149_normalised +car/train/car_0077_normalised +car/train/car_0097_normalised +car/train/car_0050_normalised +car/train/car_0102_normalised +car/train/car_0124_normalised +car/train/car_0105_normalised +car/train/car_0166_normalised +car/train/car_0019_normalised +car/train/car_0123_normalised +car/train/car_0165_normalised +car/train/car_0091_normalised +car/train/car_0154_normalised +car/train/car_0145_normalised +car/train/car_0152_normalised +car/train/car_0187_normalised +car/train/car_0133_normalised +car/train/car_0176_normalised +car/train/car_0173_normalised +car/train/car_0115_normalised +car/train/car_0017_normalised +car/train/car_0189_normalised +car/train/car_0042_normalised +car/train/car_0139_normalised +car/train/car_0066_normalised +car/train/car_0182_normalised +car/train/car_0190_normalised +car/train/car_0086_normalised +car/train/car_0043_normalised +car/train/car_0141_normalised +car/train/car_0138_normalised +car/train/car_0036_normalised +car/train/car_0135_normalised +car/train/car_0089_normalised +car/train/car_0160_normalised +car/train/car_0159_normalised +car/train/car_0194_normalised +car/train/car_0188_normalised +car/train/car_0039_normalised +car/train/car_0067_normalised +car/train/car_0179_normalised +car/train/car_0057_normalised +car/train/car_0040_normalised +car/train/car_0192_normalised +car/train/car_0061_normalised +car/train/car_0035_normalised +car/train/car_0169_normalised +car/train/car_0063_normalised +car/train/car_0163_normalised +car/train/car_0156_normalised +car/train/car_0171_normalised +car/train/car_0082_normalised +car/train/car_0093_normalised +car/train/car_0120_normalised +car/train/car_0087_normalised +car/train/car_0044_normalised +car/train/car_0026_normalised +car/train/car_0119_normalised +car/train/car_0178_normalised +car/train/car_0128_normalised +car/train/car_0193_normalised +car/train/car_0056_normalised +car/train/car_0162_normalised +car/train/car_0146_normalised +car/train/car_0168_normalised +car/train/car_0020_normalised +car/train/car_0070_normalised +car/train/car_0073_normalised +car/train/car_0024_normalised +car/train/car_0114_normalised +car/train/car_0142_normalised +car/train/car_0007_normalised +car/train/car_0046_normalised +car/train/car_0111_normalised +car/train/car_0130_normalised +car/train/car_0100_normalised +car/train/car_0150_normalised +car/train/car_0072_normalised +car/train/car_0112_normalised +car/train/car_0003_normalised +car/train/car_0006_normalised +car/train/car_0195_normalised +car/train/car_0055_normalised +car/train/car_0186_normalised +car/train/car_0108_normalised +car/train/car_0155_normalised +car/train/car_0126_normalised +car/train/car_0021_normalised +car/train/car_0032_normalised +car/train/car_0157_normalised +car/train/car_0098_normalised +car/train/car_0104_normalised +car/train/car_0075_normalised +car/train/car_0004_normalised +car/train/car_0136_normalised +car/train/car_0177_normalised +car/train/car_0151_normalised +car/train/car_0078_normalised +car/train/car_0049_normalised +car/train/car_0125_normalised +car/train/car_0197_normalised +car/train/car_0071_normalised +car/train/car_0059_normalised +car/train/car_0062_normalised +car/train/car_0118_normalised +car/train/car_0095_normalised +car/train/car_0183_normalised +car/train/car_0134_normalised +car/train/car_0018_normalised +car/train/car_0016_normalised +car/train/car_0053_normalised +car/train/car_0096_normalised +car/train/car_0131_normalised +car/train/car_0170_normalised +car/train/car_0106_normalised +car/train/car_0064_normalised +car/train/car_0011_normalised +car/train/car_0009_normalised +car/train/car_0002_normalised +car/train/car_0143_normalised +car/train/car_0175_normalised +car/train/car_0174_normalised +car/train/car_0005_normalised +car/train/car_0109_normalised +car/train/car_0008_normalised +car/train/car_0144_normalised +car/train/car_0083_normalised +car/train/car_0014_normalised +car/train/car_0180_normalised +car/train/car_0081_normalised +car/train/car_0127_normalised +car/train/car_0092_normalised +car/train/car_0147_normalised +car/train/car_0172_normalised +car/train/car_0029_normalised +car/train/car_0185_normalised +car/train/car_0052_normalised +car/train/car_0025_normalised +car/train/car_0079_normalised +car/train/car_0107_normalised +car/train/car_0090_normalised +car/train/car_0038_normalised +car/train/car_0031_normalised +car/train/car_0065_normalised +car/train/car_0023_normalised +car/train/car_0167_normalised +car/train/car_0030_normalised +car/train/car_0103_normalised +car/train/car_0041_normalised +car/train/car_0101_normalised +car/train/car_0085_normalised +car/train/car_0148_normalised +car/train/car_0047_normalised +car/train/car_0054_normalised +car/train/car_0184_normalised +car/train/car_0015_normalised +car/train/car_0027_normalised +car/train/car_0161_normalised +car/train/car_0048_normalised +car/train/car_0121_normalised +car/train/car_0074_normalised +car/test/car_0269_normalised +car/test/car_0207_normalised +car/test/car_0243_normalised +car/test/car_0232_normalised +car/test/car_0231_normalised +car/test/car_0266_normalised +car/test/car_0270_normalised +car/test/car_0295_normalised +car/test/car_0200_normalised +car/test/car_0285_normalised +car/test/car_0248_normalised +car/test/car_0249_normalised +car/test/car_0225_normalised +car/test/car_0224_normalised +car/test/car_0283_normalised +car/test/car_0241_normalised +car/test/car_0260_normalised +car/test/car_0234_normalised +car/test/car_0219_normalised +car/test/car_0272_normalised +car/test/car_0263_normalised +car/test/car_0282_normalised +car/test/car_0216_normalised +car/test/car_0256_normalised +car/test/car_0281_normalised +car/test/car_0247_normalised +car/test/car_0250_normalised +car/test/car_0228_normalised +car/test/car_0218_normalised +car/test/car_0252_normalised +car/test/car_0259_normalised +car/test/car_0267_normalised +car/test/car_0235_normalised +car/test/car_0291_normalised +car/test/car_0239_normalised +car/test/car_0233_normalised +car/test/car_0222_normalised +car/test/car_0206_normalised +car/test/car_0230_normalised +car/test/car_0253_normalised +car/test/car_0268_normalised +car/test/car_0278_normalised +car/test/car_0258_normalised +car/test/car_0226_normalised +car/test/car_0290_normalised +car/test/car_0276_normalised +car/test/car_0203_normalised +car/test/car_0229_normalised +car/test/car_0257_normalised +car/test/car_0213_normalised +car/test/car_0205_normalised +car/test/car_0210_normalised +car/test/car_0292_normalised +car/test/car_0215_normalised +car/test/car_0261_normalised +car/test/car_0221_normalised +car/test/car_0262_normalised +car/test/car_0297_normalised +car/test/car_0240_normalised +car/test/car_0204_normalised +car/test/car_0286_normalised +car/test/car_0296_normalised +car/test/car_0264_normalised +car/test/car_0244_normalised +car/test/car_0198_normalised +car/test/car_0199_normalised +car/test/car_0254_normalised +car/test/car_0273_normalised +car/test/car_0271_normalised +car/test/car_0211_normalised +car/test/car_0201_normalised +car/test/car_0242_normalised +car/test/car_0246_normalised +car/test/car_0227_normalised +car/test/car_0208_normalised +car/test/car_0220_normalised +car/test/car_0202_normalised +car/test/car_0289_normalised +car/test/car_0214_normalised +car/test/car_0209_normalised +car/test/car_0288_normalised +car/test/car_0251_normalised +car/test/car_0217_normalised +car/test/car_0294_normalised +car/test/car_0255_normalised +car/test/car_0245_normalised +car/test/car_0223_normalised +car/test/car_0238_normalised +car/test/car_0279_normalised +car/test/car_0237_normalised +car/test/car_0236_normalised +car/test/car_0265_normalised +car/test/car_0284_normalised +car/test/car_0274_normalised +car/test/car_0277_normalised +car/test/car_0280_normalised +car/test/car_0287_normalised +car/test/car_0275_normalised +car/test/car_0212_normalised +car/test/car_0293_normalised +cup/train/cup_0075_normalised +cup/train/cup_0033_normalised +cup/train/cup_0044_normalised +cup/train/cup_0060_normalised +cup/train/cup_0009_normalised +cup/train/cup_0008_normalised +cup/train/cup_0079_normalised +cup/train/cup_0051_normalised +cup/train/cup_0029_normalised +cup/train/cup_0045_normalised +cup/train/cup_0052_normalised +cup/train/cup_0066_normalised +cup/train/cup_0006_normalised +cup/train/cup_0028_normalised +cup/train/cup_0022_normalised +cup/train/cup_0021_normalised +cup/train/cup_0034_normalised +cup/train/cup_0037_normalised +cup/train/cup_0077_normalised +cup/train/cup_0043_normalised +cup/train/cup_0030_normalised +cup/train/cup_0035_normalised +cup/train/cup_0036_normalised +cup/train/cup_0076_normalised +cup/train/cup_0001_normalised +cup/train/cup_0003_normalised +cup/train/cup_0049_normalised +cup/train/cup_0073_normalised +cup/train/cup_0017_normalised +cup/train/cup_0070_normalised +cup/train/cup_0072_normalised +cup/train/cup_0032_normalised +cup/train/cup_0007_normalised +cup/train/cup_0038_normalised +cup/train/cup_0015_normalised +cup/train/cup_0064_normalised +cup/train/cup_0039_normalised +cup/train/cup_0071_normalised +cup/train/cup_0025_normalised +cup/train/cup_0014_normalised +cup/train/cup_0012_normalised +cup/train/cup_0042_normalised +cup/train/cup_0040_normalised +cup/train/cup_0062_normalised +cup/train/cup_0004_normalised +cup/train/cup_0048_normalised +cup/train/cup_0050_normalised +cup/train/cup_0074_normalised +cup/train/cup_0019_normalised +cup/train/cup_0023_normalised +cup/train/cup_0061_normalised +cup/train/cup_0068_normalised +cup/train/cup_0069_normalised +cup/train/cup_0056_normalised +cup/train/cup_0002_normalised +cup/train/cup_0005_normalised +cup/train/cup_0031_normalised +cup/train/cup_0020_normalised +cup/train/cup_0013_normalised +cup/train/cup_0041_normalised +cup/train/cup_0018_normalised +cup/train/cup_0046_normalised +cup/train/cup_0063_normalised +cup/train/cup_0016_normalised +cup/train/cup_0010_normalised +cup/train/cup_0011_normalised +cup/train/cup_0055_normalised +cup/train/cup_0065_normalised +cup/train/cup_0024_normalised +cup/train/cup_0057_normalised +cup/train/cup_0027_normalised +cup/train/cup_0058_normalised +cup/train/cup_0026_normalised +cup/train/cup_0078_normalised +cup/train/cup_0054_normalised +cup/train/cup_0053_normalised +cup/train/cup_0067_normalised +cup/train/cup_0059_normalised +cup/train/cup_0047_normalised +cup/test/cup_0083_normalised +cup/test/cup_0097_normalised +cup/test/cup_0098_normalised +cup/test/cup_0091_normalised +cup/test/cup_0080_normalised +cup/test/cup_0090_normalised +cup/test/cup_0095_normalised +cup/test/cup_0088_normalised +cup/test/cup_0094_normalised +cup/test/cup_0084_normalised +cup/test/cup_0087_normalised +cup/test/cup_0092_normalised +cup/test/cup_0099_normalised +cup/test/cup_0082_normalised +cup/test/cup_0086_normalised +cup/test/cup_0089_normalised +cup/test/cup_0096_normalised +cup/test/cup_0085_normalised +cup/test/cup_0093_normalised +cup/test/cup_0081_normalised +airplane/train/airplane_0486_normalised +airplane/train/airplane_0374_normalised +airplane/train/airplane_0316_normalised +airplane/train/airplane_0537_normalised +airplane/train/airplane_0284_normalised +airplane/train/airplane_0609_normalised +airplane/train/airplane_0086_normalised +airplane/train/airplane_0554_normalised +airplane/train/airplane_0307_normalised +airplane/train/airplane_0015_normalised +airplane/train/airplane_0567_normalised +airplane/train/airplane_0082_normalised +airplane/train/airplane_0150_normalised +airplane/train/airplane_0415_normalised +airplane/train/airplane_0289_normalised +airplane/train/airplane_0594_normalised +airplane/train/airplane_0579_normalised +airplane/train/airplane_0279_normalised +airplane/train/airplane_0060_normalised +airplane/train/airplane_0499_normalised +airplane/train/airplane_0165_normalised +airplane/train/airplane_0555_normalised +airplane/train/airplane_0389_normalised +airplane/train/airplane_0049_normalised +airplane/train/airplane_0067_normalised +airplane/train/airplane_0286_normalised +airplane/train/airplane_0238_normalised +airplane/train/airplane_0035_normalised +airplane/train/airplane_0129_normalised +airplane/train/airplane_0128_normalised +airplane/train/airplane_0033_normalised +airplane/train/airplane_0283_normalised +airplane/train/airplane_0355_normalised +airplane/train/airplane_0502_normalised +airplane/train/airplane_0148_normalised +airplane/train/airplane_0158_normalised +airplane/train/airplane_0477_normalised +airplane/train/airplane_0130_normalised +airplane/train/airplane_0169_normalised +airplane/train/airplane_0300_normalised +airplane/train/airplane_0242_normalised +airplane/train/airplane_0348_normalised +airplane/train/airplane_0222_normalised +airplane/train/airplane_0253_normalised +airplane/train/airplane_0402_normalised +airplane/train/airplane_0589_normalised +airplane/train/airplane_0187_normalised +airplane/train/airplane_0014_normalised +airplane/train/airplane_0503_normalised +airplane/train/airplane_0351_normalised +airplane/train/airplane_0443_normalised +airplane/train/airplane_0505_normalised +airplane/train/airplane_0020_normalised +airplane/train/airplane_0543_normalised +airplane/train/airplane_0101_normalised +airplane/train/airplane_0298_normalised +airplane/train/airplane_0041_normalised +airplane/train/airplane_0133_normalised +airplane/train/airplane_0516_normalised +airplane/train/airplane_0079_normalised +airplane/train/airplane_0484_normalised +airplane/train/airplane_0444_normalised +airplane/train/airplane_0264_normalised +airplane/train/airplane_0353_normalised +airplane/train/airplane_0310_normalised +airplane/train/airplane_0291_normalised +airplane/train/airplane_0449_normalised +airplane/train/airplane_0439_normalised +airplane/train/airplane_0448_normalised +airplane/train/airplane_0593_normalised +airplane/train/airplane_0229_normalised +airplane/train/airplane_0483_normalised +airplane/train/airplane_0110_normalised +airplane/train/airplane_0456_normalised +airplane/train/airplane_0492_normalised +airplane/train/airplane_0285_normalised +airplane/train/airplane_0622_normalised +airplane/train/airplane_0474_normalised +airplane/train/airplane_0387_normalised +airplane/train/airplane_0200_normalised +airplane/train/airplane_0277_normalised +airplane/train/airplane_0297_normalised +airplane/train/airplane_0190_normalised +airplane/train/airplane_0199_normalised +airplane/train/airplane_0454_normalised +airplane/train/airplane_0495_normalised +airplane/train/airplane_0215_normalised +airplane/train/airplane_0604_normalised +airplane/train/airplane_0100_normalised +airplane/train/airplane_0162_normalised +airplane/train/airplane_0152_normalised +airplane/train/airplane_0026_normalised +airplane/train/airplane_0626_normalised +airplane/train/airplane_0466_normalised +airplane/train/airplane_0207_normalised +airplane/train/airplane_0252_normalised +airplane/train/airplane_0008_normalised +airplane/train/airplane_0075_normalised +airplane/train/airplane_0544_normalised +airplane/train/airplane_0420_normalised +airplane/train/airplane_0102_normalised +airplane/train/airplane_0388_normalised +airplane/train/airplane_0142_normalised +airplane/train/airplane_0408_normalised +airplane/train/airplane_0401_normalised +airplane/train/airplane_0417_normalised +airplane/train/airplane_0216_normalised +airplane/train/airplane_0381_normalised +airplane/train/airplane_0550_normalised +airplane/train/airplane_0112_normalised +airplane/train/airplane_0360_normalised +airplane/train/airplane_0053_normalised +airplane/train/airplane_0571_normalised +airplane/train/airplane_0313_normalised +airplane/train/airplane_0205_normalised +airplane/train/airplane_0214_normalised +airplane/train/airplane_0052_normalised +airplane/train/airplane_0168_normalised +airplane/train/airplane_0188_normalised +airplane/train/airplane_0421_normalised +airplane/train/airplane_0383_normalised +airplane/train/airplane_0469_normalised +airplane/train/airplane_0156_normalised +airplane/train/airplane_0009_normalised +airplane/train/airplane_0467_normalised +airplane/train/airplane_0329_normalised +airplane/train/airplane_0559_normalised +airplane/train/airplane_0221_normalised +airplane/train/airplane_0029_normalised +airplane/train/airplane_0451_normalised +airplane/train/airplane_0465_normalised +airplane/train/airplane_0294_normalised +airplane/train/airplane_0006_normalised +airplane/train/airplane_0603_normalised +airplane/train/airplane_0511_normalised +airplane/train/airplane_0426_normalised +airplane/train/airplane_0149_normalised +airplane/train/airplane_0226_normalised +airplane/train/airplane_0445_normalised +airplane/train/airplane_0440_normalised +airplane/train/airplane_0532_normalised +airplane/train/airplane_0109_normalised +airplane/train/airplane_0614_normalised +airplane/train/airplane_0262_normalised +airplane/train/airplane_0295_normalised +airplane/train/airplane_0083_normalised +airplane/train/airplane_0527_normalised +airplane/train/airplane_0090_normalised +airplane/train/airplane_0338_normalised +airplane/train/airplane_0007_normalised +airplane/train/airplane_0078_normalised +airplane/train/airplane_0280_normalised +airplane/train/airplane_0612_normalised +airplane/train/airplane_0021_normalised +airplane/train/airplane_0494_normalised +airplane/train/airplane_0120_normalised +airplane/train/airplane_0065_normalised +airplane/train/airplane_0303_normalised +airplane/train/airplane_0380_normalised +airplane/train/airplane_0151_normalised +airplane/train/airplane_0260_normalised +airplane/train/airplane_0163_normalised +airplane/train/airplane_0347_normalised +airplane/train/airplane_0175_normalised +airplane/train/airplane_0245_normalised +airplane/train/airplane_0411_normalised +airplane/train/airplane_0025_normalised +airplane/train/airplane_0159_normalised +airplane/train/airplane_0208_normalised +airplane/train/airplane_0452_normalised +airplane/train/airplane_0403_normalised +airplane/train/airplane_0121_normalised +airplane/train/airplane_0111_normalised +airplane/train/airplane_0089_normalised +airplane/train/airplane_0613_normalised +airplane/train/airplane_0258_normalised +airplane/train/airplane_0181_normalised +airplane/train/airplane_0034_normalised +airplane/train/airplane_0396_normalised +airplane/train/airplane_0219_normalised +airplane/train/airplane_0261_normalised +airplane/train/airplane_0455_normalised +airplane/train/airplane_0522_normalised +airplane/train/airplane_0024_normalised +airplane/train/airplane_0328_normalised +airplane/train/airplane_0178_normalised +airplane/train/airplane_0526_normalised +airplane/train/airplane_0048_normalised +airplane/train/airplane_0545_normalised +airplane/train/airplane_0070_normalised +airplane/train/airplane_0281_normalised +airplane/train/airplane_0249_normalised +airplane/train/airplane_0539_normalised +airplane/train/airplane_0095_normalised +airplane/train/airplane_0384_normalised +airplane/train/airplane_0377_normalised +airplane/train/airplane_0489_normalised +airplane/train/airplane_0257_normalised +airplane/train/airplane_0105_normalised +airplane/train/airplane_0259_normalised +airplane/train/airplane_0345_normalised +airplane/train/airplane_0224_normalised +airplane/train/airplane_0496_normalised +airplane/train/airplane_0096_normalised +airplane/train/airplane_0002_normalised +airplane/train/airplane_0318_normalised +airplane/train/airplane_0534_normalised +airplane/train/airplane_0441_normalised +airplane/train/airplane_0363_normalised +airplane/train/airplane_0457_normalised +airplane/train/airplane_0620_normalised +airplane/train/airplane_0473_normalised +airplane/train/airplane_0097_normalised +airplane/train/airplane_0045_normalised +airplane/train/airplane_0055_normalised +airplane/train/airplane_0362_normalised +airplane/train/airplane_0016_normalised +airplane/train/airplane_0576_normalised +airplane/train/airplane_0227_normalised +airplane/train/airplane_0343_normalised +airplane/train/airplane_0047_normalised +airplane/train/airplane_0618_normalised +airplane/train/airplane_0427_normalised +airplane/train/airplane_0485_normalised +airplane/train/airplane_0273_normalised +airplane/train/airplane_0164_normalised +airplane/train/airplane_0367_normalised +airplane/train/airplane_0606_normalised +airplane/train/airplane_0562_normalised +airplane/train/airplane_0414_normalised +airplane/train/airplane_0438_normalised +airplane/train/airplane_0074_normalised +airplane/train/airplane_0573_normalised +airplane/train/airplane_0423_normalised +airplane/train/airplane_0087_normalised +airplane/train/airplane_0607_normalised +airplane/train/airplane_0081_normalised +airplane/train/airplane_0192_normalised +airplane/train/airplane_0320_normalised +airplane/train/airplane_0069_normalised +airplane/train/airplane_0617_normalised +airplane/train/airplane_0217_normalised +airplane/train/airplane_0019_normalised +airplane/train/airplane_0137_normalised +airplane/train/airplane_0203_normalised +airplane/train/airplane_0621_normalised +airplane/train/airplane_0251_normalised +airplane/train/airplane_0405_normalised +airplane/train/airplane_0372_normalised +airplane/train/airplane_0275_normalised +airplane/train/airplane_0154_normalised +airplane/train/airplane_0565_normalised +airplane/train/airplane_0376_normalised +airplane/train/airplane_0356_normalised +airplane/train/airplane_0039_normalised +airplane/train/airplane_0068_normalised +airplane/train/airplane_0066_normalised +airplane/train/airplane_0470_normalised +airplane/train/airplane_0412_normalised +airplane/train/airplane_0135_normalised +airplane/train/airplane_0157_normalised +airplane/train/airplane_0243_normalised +airplane/train/airplane_0223_normalised +airplane/train/airplane_0580_normalised +airplane/train/airplane_0332_normalised +airplane/train/airplane_0071_normalised +airplane/train/airplane_0064_normalised +airplane/train/airplane_0538_normalised +airplane/train/airplane_0179_normalised +airplane/train/airplane_0480_normalised +airplane/train/airplane_0098_normalised +airplane/train/airplane_0574_normalised +airplane/train/airplane_0293_normalised +airplane/train/airplane_0225_normalised +airplane/train/airplane_0488_normalised +airplane/train/airplane_0266_normalised +airplane/train/airplane_0305_normalised +airplane/train/airplane_0568_normalised +airplane/train/airplane_0575_normalised +airplane/train/airplane_0072_normalised +airplane/train/airplane_0309_normalised +airplane/train/airplane_0529_normalised +airplane/train/airplane_0147_normalised +airplane/train/airplane_0198_normalised +airplane/train/airplane_0051_normalised +airplane/train/airplane_0062_normalised +airplane/train/airplane_0352_normalised +airplane/train/airplane_0043_normalised +airplane/train/airplane_0600_normalised +airplane/train/airplane_0171_normalised +airplane/train/airplane_0616_normalised +airplane/train/airplane_0610_normalised +airplane/train/airplane_0602_normalised +airplane/train/airplane_0334_normalised +airplane/train/airplane_0202_normalised +airplane/train/airplane_0131_normalised +airplane/train/airplane_0431_normalised +airplane/train/airplane_0533_normalised +airplane/train/airplane_0450_normalised +airplane/train/airplane_0570_normalised +airplane/train/airplane_0321_normalised +airplane/train/airplane_0001_normalised +airplane/train/airplane_0231_normalised +airplane/train/airplane_0138_normalised +airplane/train/airplane_0369_normalised +airplane/train/airplane_0551_normalised +airplane/train/airplane_0141_normalised +airplane/train/airplane_0270_normalised +airplane/train/airplane_0524_normalised +airplane/train/airplane_0185_normalised +airplane/train/airplane_0212_normalised +airplane/train/airplane_0349_normalised +airplane/train/airplane_0422_normalised +airplane/train/airplane_0512_normalised +airplane/train/airplane_0459_normalised +airplane/train/airplane_0122_normalised +airplane/train/airplane_0429_normalised +airplane/train/airplane_0256_normalised +airplane/train/airplane_0136_normalised +airplane/train/airplane_0337_normalised +airplane/train/airplane_0010_normalised +airplane/train/airplane_0176_normalised +airplane/train/airplane_0556_normalised +airplane/train/airplane_0508_normalised +airplane/train/airplane_0561_normalised +airplane/train/airplane_0146_normalised +airplane/train/airplane_0288_normalised +airplane/train/airplane_0425_normalised +airplane/train/airplane_0235_normalised +airplane/train/airplane_0501_normalised +airplane/train/airplane_0447_normalised +airplane/train/airplane_0437_normalised +airplane/train/airplane_0308_normalised +airplane/train/airplane_0615_normalised +airplane/train/airplane_0042_normalised +airplane/train/airplane_0336_normalised +airplane/train/airplane_0124_normalised +airplane/train/airplane_0481_normalised +airplane/train/airplane_0322_normalised +airplane/train/airplane_0399_normalised +airplane/train/airplane_0201_normalised +airplane/train/airplane_0601_normalised +airplane/train/airplane_0233_normalised +airplane/train/airplane_0560_normalised +airplane/train/airplane_0274_normalised +airplane/train/airplane_0031_normalised +airplane/train/airplane_0244_normalised +airplane/train/airplane_0193_normalised +airplane/train/airplane_0563_normalised +airplane/train/airplane_0404_normalised +airplane/train/airplane_0530_normalised +airplane/train/airplane_0599_normalised +airplane/train/airplane_0419_normalised +airplane/train/airplane_0350_normalised +airplane/train/airplane_0378_normalised +airplane/train/airplane_0506_normalised +airplane/train/airplane_0536_normalised +airplane/train/airplane_0598_normalised +airplane/train/airplane_0472_normalised +airplane/train/airplane_0194_normalised +airplane/train/airplane_0390_normalised +airplane/train/airplane_0061_normalised +airplane/train/airplane_0166_normalised +airplane/train/airplane_0237_normalised +airplane/train/airplane_0395_normalised +airplane/train/airplane_0453_normalised +airplane/train/airplane_0424_normalised +airplane/train/airplane_0155_normalised +airplane/train/airplane_0359_normalised +airplane/train/airplane_0398_normalised +airplane/train/airplane_0497_normalised +airplane/train/airplane_0493_normalised +airplane/train/airplane_0108_normalised +airplane/train/airplane_0513_normalised +airplane/train/airplane_0365_normalised +airplane/train/airplane_0301_normalised +airplane/train/airplane_0432_normalised +airplane/train/airplane_0306_normalised +airplane/train/airplane_0468_normalised +airplane/train/airplane_0044_normalised +airplane/train/airplane_0531_normalised +airplane/train/airplane_0167_normalised +airplane/train/airplane_0552_normalised +airplane/train/airplane_0514_normalised +airplane/train/airplane_0004_normalised +airplane/train/airplane_0542_normalised +airplane/train/airplane_0106_normalised +airplane/train/airplane_0269_normalised +airplane/train/airplane_0255_normalised +airplane/train/airplane_0479_normalised +airplane/train/airplane_0267_normalised +airplane/train/airplane_0027_normalised +airplane/train/airplane_0442_normalised +airplane/train/airplane_0490_normalised +airplane/train/airplane_0099_normalised +airplane/train/airplane_0458_normalised +airplane/train/airplane_0504_normalised +airplane/train/airplane_0413_normalised +airplane/train/airplane_0435_normalised +airplane/train/airplane_0271_normalised +airplane/train/airplane_0236_normalised +airplane/train/airplane_0410_normalised +airplane/train/airplane_0030_normalised +airplane/train/airplane_0370_normalised +airplane/train/airplane_0379_normalised +airplane/train/airplane_0371_normalised +airplane/train/airplane_0191_normalised +airplane/train/airplane_0213_normalised +airplane/train/airplane_0385_normalised +airplane/train/airplane_0091_normalised +airplane/train/airplane_0040_normalised +airplane/train/airplane_0177_normalised +airplane/train/airplane_0140_normalised +airplane/train/airplane_0241_normalised +airplane/train/airplane_0290_normalised +airplane/train/airplane_0548_normalised +airplane/train/airplane_0471_normalised +airplane/train/airplane_0546_normalised +airplane/train/airplane_0218_normalised +airplane/train/airplane_0333_normalised +airplane/train/airplane_0547_normalised +airplane/train/airplane_0523_normalised +airplane/train/airplane_0272_normalised +airplane/train/airplane_0611_normalised +airplane/train/airplane_0373_normalised +airplane/train/airplane_0234_normalised +airplane/train/airplane_0302_normalised +airplane/train/airplane_0263_normalised +airplane/train/airplane_0344_normalised +airplane/train/airplane_0566_normalised +airplane/train/airplane_0314_normalised +airplane/train/airplane_0022_normalised +airplane/train/airplane_0409_normalised +airplane/train/airplane_0500_normalised +airplane/train/airplane_0446_normalised +airplane/train/airplane_0339_normalised +airplane/train/airplane_0582_normalised +airplane/train/airplane_0572_normalised +airplane/train/airplane_0265_normalised +airplane/train/airplane_0248_normalised +airplane/train/airplane_0361_normalised +airplane/train/airplane_0145_normalised +airplane/train/airplane_0211_normalised +airplane/train/airplane_0509_normalised +airplane/train/airplane_0118_normalised +airplane/train/airplane_0358_normalised +airplane/train/airplane_0324_normalised +airplane/train/airplane_0107_normalised +airplane/train/airplane_0114_normalised +airplane/train/airplane_0393_normalised +airplane/train/airplane_0518_normalised +airplane/train/airplane_0278_normalised +airplane/train/airplane_0063_normalised +airplane/train/airplane_0183_normalised +airplane/train/airplane_0364_normalised +airplane/train/airplane_0595_normalised +airplane/train/airplane_0368_normalised +airplane/train/airplane_0553_normalised +airplane/train/airplane_0342_normalised +airplane/train/airplane_0113_normalised +airplane/train/airplane_0046_normalised +airplane/train/airplane_0386_normalised +airplane/train/airplane_0125_normalised +airplane/train/airplane_0005_normalised +airplane/train/airplane_0104_normalised +airplane/train/airplane_0340_normalised +airplane/train/airplane_0357_normalised +airplane/train/airplane_0624_normalised +airplane/train/airplane_0323_normalised +airplane/train/airplane_0038_normalised +airplane/train/airplane_0239_normalised +airplane/train/airplane_0232_normalised +airplane/train/airplane_0160_normalised +airplane/train/airplane_0569_normalised +airplane/train/airplane_0119_normalised +airplane/train/airplane_0311_normalised +airplane/train/airplane_0525_normalised +airplane/train/airplane_0476_normalised +airplane/train/airplane_0549_normalised +airplane/train/airplane_0541_normalised +airplane/train/airplane_0299_normalised +airplane/train/airplane_0478_normalised +airplane/train/airplane_0254_normalised +airplane/train/airplane_0461_normalised +airplane/train/airplane_0584_normalised +airplane/train/airplane_0123_normalised +airplane/train/airplane_0073_normalised +airplane/train/airplane_0434_normalised +airplane/train/airplane_0116_normalised +airplane/train/airplane_0057_normalised +airplane/train/airplane_0331_normalised +airplane/train/airplane_0304_normalised +airplane/train/airplane_0058_normalised +airplane/train/airplane_0354_normalised +airplane/train/airplane_0491_normalised +airplane/train/airplane_0268_normalised +airplane/train/airplane_0619_normalised +airplane/train/airplane_0056_normalised +airplane/train/airplane_0346_normalised +airplane/train/airplane_0436_normalised +airplane/train/airplane_0134_normalised +airplane/train/airplane_0464_normalised +airplane/train/airplane_0319_normalised +airplane/train/airplane_0228_normalised +airplane/train/airplane_0287_normalised +airplane/train/airplane_0335_normalised +airplane/train/airplane_0625_normalised +airplane/train/airplane_0250_normalised +airplane/train/airplane_0032_normalised +airplane/train/airplane_0596_normalised +airplane/train/airplane_0080_normalised +airplane/train/airplane_0220_normalised +airplane/train/airplane_0189_normalised +airplane/train/airplane_0180_normalised +airplane/train/airplane_0587_normalised +airplane/train/airplane_0296_normalised +airplane/train/airplane_0317_normalised +airplane/train/airplane_0059_normalised +airplane/train/airplane_0623_normalised +airplane/train/airplane_0153_normalised +airplane/train/airplane_0173_normalised +airplane/train/airplane_0475_normalised +airplane/train/airplane_0103_normalised +airplane/train/airplane_0460_normalised +airplane/train/airplane_0382_normalised +airplane/train/airplane_0406_normalised +airplane/train/airplane_0084_normalised +airplane/train/airplane_0366_normalised +airplane/train/airplane_0416_normalised +airplane/train/airplane_0117_normalised +airplane/train/airplane_0330_normalised +airplane/train/airplane_0246_normalised +airplane/train/airplane_0161_normalised +airplane/train/airplane_0012_normalised +airplane/train/airplane_0327_normalised +airplane/train/airplane_0487_normalised +airplane/train/airplane_0407_normalised +airplane/train/airplane_0037_normalised +airplane/train/airplane_0463_normalised +airplane/train/airplane_0588_normalised +airplane/train/airplane_0170_normalised +airplane/train/airplane_0174_normalised +airplane/train/airplane_0605_normalised +airplane/train/airplane_0528_normalised +airplane/train/airplane_0028_normalised +airplane/train/airplane_0172_normalised +airplane/train/airplane_0510_normalised +airplane/train/airplane_0482_normalised +airplane/train/airplane_0326_normalised +airplane/train/airplane_0132_normalised +airplane/train/airplane_0182_normalised +airplane/train/airplane_0209_normalised +airplane/train/airplane_0076_normalised +airplane/train/airplane_0517_normalised +airplane/train/airplane_0126_normalised +airplane/train/airplane_0430_normalised +airplane/train/airplane_0054_normalised +airplane/train/airplane_0018_normalised +airplane/train/airplane_0590_normalised +airplane/train/airplane_0036_normalised +airplane/train/airplane_0519_normalised +airplane/train/airplane_0577_normalised +airplane/train/airplane_0292_normalised +airplane/train/airplane_0282_normalised +airplane/train/airplane_0397_normalised +airplane/train/airplane_0507_normalised +airplane/train/airplane_0315_normalised +airplane/train/airplane_0592_normalised +airplane/train/airplane_0092_normalised +airplane/train/airplane_0186_normalised +airplane/train/airplane_0375_normalised +airplane/train/airplane_0085_normalised +airplane/train/airplane_0418_normalised +airplane/train/airplane_0094_normalised +airplane/train/airplane_0557_normalised +airplane/train/airplane_0564_normalised +airplane/train/airplane_0013_normalised +airplane/train/airplane_0093_normalised +airplane/train/airplane_0184_normalised +airplane/train/airplane_0535_normalised +airplane/train/airplane_0597_normalised +airplane/train/airplane_0204_normalised +airplane/train/airplane_0581_normalised +airplane/train/airplane_0608_normalised +airplane/train/airplane_0127_normalised +airplane/train/airplane_0088_normalised +airplane/train/airplane_0017_normalised +airplane/train/airplane_0394_normalised +airplane/train/airplane_0276_normalised +airplane/train/airplane_0540_normalised +airplane/train/airplane_0011_normalised +airplane/train/airplane_0050_normalised +airplane/train/airplane_0341_normalised +airplane/train/airplane_0325_normalised +airplane/train/airplane_0003_normalised +airplane/train/airplane_0515_normalised +airplane/train/airplane_0583_normalised +airplane/train/airplane_0230_normalised +airplane/train/airplane_0197_normalised +airplane/train/airplane_0586_normalised +airplane/train/airplane_0023_normalised +airplane/train/airplane_0210_normalised +airplane/train/airplane_0462_normalised +airplane/train/airplane_0240_normalised +airplane/train/airplane_0077_normalised +airplane/train/airplane_0428_normalised +airplane/train/airplane_0558_normalised +airplane/train/airplane_0144_normalised +airplane/train/airplane_0206_normalised +airplane/train/airplane_0585_normalised +airplane/train/airplane_0115_normalised +airplane/train/airplane_0521_normalised +airplane/train/airplane_0400_normalised +airplane/train/airplane_0520_normalised +airplane/train/airplane_0195_normalised +airplane/train/airplane_0433_normalised +airplane/train/airplane_0391_normalised +airplane/train/airplane_0196_normalised +airplane/train/airplane_0312_normalised +airplane/train/airplane_0591_normalised +airplane/train/airplane_0578_normalised +airplane/train/airplane_0139_normalised +airplane/train/airplane_0392_normalised +airplane/train/airplane_0143_normalised +airplane/train/airplane_0247_normalised +airplane/train/airplane_0498_normalised +airplane/test/airplane_0663_normalised +airplane/test/airplane_0679_normalised +airplane/test/airplane_0715_normalised +airplane/test/airplane_0714_normalised +airplane/test/airplane_0685_normalised +airplane/test/airplane_0712_normalised +airplane/test/airplane_0655_normalised +airplane/test/airplane_0632_normalised +airplane/test/airplane_0656_normalised +airplane/test/airplane_0661_normalised +airplane/test/airplane_0660_normalised +airplane/test/airplane_0726_normalised +airplane/test/airplane_0689_normalised +airplane/test/airplane_0676_normalised +airplane/test/airplane_0673_normalised +airplane/test/airplane_0635_normalised +airplane/test/airplane_0659_normalised +airplane/test/airplane_0641_normalised +airplane/test/airplane_0684_normalised +airplane/test/airplane_0664_normalised +airplane/test/airplane_0696_normalised +airplane/test/airplane_0719_normalised +airplane/test/airplane_0693_normalised +airplane/test/airplane_0674_normalised +airplane/test/airplane_0683_normalised +airplane/test/airplane_0705_normalised +airplane/test/airplane_0720_normalised +airplane/test/airplane_0721_normalised +airplane/test/airplane_0682_normalised +airplane/test/airplane_0718_normalised +airplane/test/airplane_0638_normalised +airplane/test/airplane_0692_normalised +airplane/test/airplane_0636_normalised +airplane/test/airplane_0643_normalised +airplane/test/airplane_0688_normalised +airplane/test/airplane_0686_normalised +airplane/test/airplane_0699_normalised +airplane/test/airplane_0653_normalised +airplane/test/airplane_0627_normalised +airplane/test/airplane_0701_normalised +airplane/test/airplane_0666_normalised +airplane/test/airplane_0667_normalised +airplane/test/airplane_0698_normalised +airplane/test/airplane_0680_normalised +airplane/test/airplane_0713_normalised +airplane/test/airplane_0703_normalised +airplane/test/airplane_0690_normalised +airplane/test/airplane_0651_normalised +airplane/test/airplane_0675_normalised +airplane/test/airplane_0725_normalised +airplane/test/airplane_0630_normalised +airplane/test/airplane_0707_normalised +airplane/test/airplane_0700_normalised +airplane/test/airplane_0649_normalised +airplane/test/airplane_0710_normalised +airplane/test/airplane_0704_normalised +airplane/test/airplane_0662_normalised +airplane/test/airplane_0717_normalised +airplane/test/airplane_0631_normalised +airplane/test/airplane_0670_normalised +airplane/test/airplane_0629_normalised +airplane/test/airplane_0716_normalised +airplane/test/airplane_0711_normalised +airplane/test/airplane_0654_normalised +airplane/test/airplane_0648_normalised +airplane/test/airplane_0702_normalised +airplane/test/airplane_0646_normalised +airplane/test/airplane_0665_normalised +airplane/test/airplane_0723_normalised +airplane/test/airplane_0671_normalised +airplane/test/airplane_0658_normalised +airplane/test/airplane_0669_normalised +airplane/test/airplane_0722_normalised +airplane/test/airplane_0647_normalised +airplane/test/airplane_0634_normalised +airplane/test/airplane_0695_normalised +airplane/test/airplane_0709_normalised +airplane/test/airplane_0681_normalised +airplane/test/airplane_0642_normalised +airplane/test/airplane_0637_normalised +airplane/test/airplane_0628_normalised +airplane/test/airplane_0645_normalised +airplane/test/airplane_0691_normalised +airplane/test/airplane_0639_normalised +airplane/test/airplane_0644_normalised +airplane/test/airplane_0640_normalised +airplane/test/airplane_0694_normalised +airplane/test/airplane_0677_normalised +airplane/test/airplane_0633_normalised +airplane/test/airplane_0724_normalised +airplane/test/airplane_0708_normalised +airplane/test/airplane_0706_normalised +airplane/test/airplane_0652_normalised +airplane/test/airplane_0697_normalised +airplane/test/airplane_0657_normalised +airplane/test/airplane_0650_normalised +airplane/test/airplane_0672_normalised +airplane/test/airplane_0668_normalised +airplane/test/airplane_0687_normalised +airplane/test/airplane_0678_normalised +bed/train/bed_0256_normalised +bed/train/bed_0024_normalised +bed/train/bed_0231_normalised +bed/train/bed_0274_normalised +bed/train/bed_0019_normalised +bed/train/bed_0473_normalised +bed/train/bed_0479_normalised +bed/train/bed_0459_normalised +bed/train/bed_0226_normalised +bed/train/bed_0510_normalised +bed/train/bed_0380_normalised +bed/train/bed_0210_normalised +bed/train/bed_0330_normalised +bed/train/bed_0406_normalised +bed/train/bed_0152_normalised +bed/train/bed_0247_normalised +bed/train/bed_0417_normalised +bed/train/bed_0269_normalised +bed/train/bed_0183_normalised +bed/train/bed_0034_normalised +bed/train/bed_0466_normalised +bed/train/bed_0098_normalised +bed/train/bed_0214_normalised +bed/train/bed_0112_normalised +bed/train/bed_0312_normalised +bed/train/bed_0414_normalised +bed/train/bed_0444_normalised +bed/train/bed_0289_normalised +bed/train/bed_0482_normalised +bed/train/bed_0388_normalised +bed/train/bed_0039_normalised +bed/train/bed_0403_normalised +bed/train/bed_0091_normalised +bed/train/bed_0254_normalised +bed/train/bed_0217_normalised +bed/train/bed_0199_normalised +bed/train/bed_0151_normalised +bed/train/bed_0179_normalised +bed/train/bed_0263_normalised +bed/train/bed_0347_normalised +bed/train/bed_0423_normalised +bed/train/bed_0047_normalised +bed/train/bed_0198_normalised +bed/train/bed_0412_normalised +bed/train/bed_0360_normalised +bed/train/bed_0215_normalised +bed/train/bed_0232_normalised +bed/train/bed_0086_normalised +bed/train/bed_0244_normalised +bed/train/bed_0176_normalised +bed/train/bed_0202_normalised +bed/train/bed_0381_normalised +bed/train/bed_0040_normalised +bed/train/bed_0208_normalised +bed/train/bed_0372_normalised +bed/train/bed_0105_normalised +bed/train/bed_0213_normalised +bed/train/bed_0509_normalised +bed/train/bed_0087_normalised +bed/train/bed_0261_normalised +bed/train/bed_0113_normalised +bed/train/bed_0322_normalised +bed/train/bed_0084_normalised +bed/train/bed_0300_normalised +bed/train/bed_0346_normalised +bed/train/bed_0278_normalised +bed/train/bed_0445_normalised +bed/train/bed_0480_normalised +bed/train/bed_0442_normalised +bed/train/bed_0374_normalised +bed/train/bed_0186_normalised +bed/train/bed_0069_normalised +bed/train/bed_0295_normalised +bed/train/bed_0108_normalised +bed/train/bed_0398_normalised +bed/train/bed_0235_normalised +bed/train/bed_0262_normalised +bed/train/bed_0121_normalised +bed/train/bed_0138_normalised +bed/train/bed_0123_normalised +bed/train/bed_0264_normalised +bed/train/bed_0006_normalised +bed/train/bed_0207_normalised +bed/train/bed_0157_normalised +bed/train/bed_0177_normalised +bed/train/bed_0290_normalised +bed/train/bed_0227_normalised +bed/train/bed_0204_normalised +bed/train/bed_0369_normalised +bed/train/bed_0255_normalised +bed/train/bed_0106_normalised +bed/train/bed_0464_normalised +bed/train/bed_0441_normalised +bed/train/bed_0476_normalised +bed/train/bed_0494_normalised +bed/train/bed_0275_normalised +bed/train/bed_0209_normalised +bed/train/bed_0085_normalised +bed/train/bed_0250_normalised +bed/train/bed_0059_normalised +bed/train/bed_0092_normalised +bed/train/bed_0484_normalised +bed/train/bed_0161_normalised +bed/train/bed_0148_normalised +bed/train/bed_0338_normalised +bed/train/bed_0373_normalised +bed/train/bed_0429_normalised +bed/train/bed_0143_normalised +bed/train/bed_0259_normalised +bed/train/bed_0072_normalised +bed/train/bed_0238_normalised +bed/train/bed_0499_normalised +bed/train/bed_0125_normalised +bed/train/bed_0243_normalised +bed/train/bed_0014_normalised +bed/train/bed_0437_normalised +bed/train/bed_0501_normalised +bed/train/bed_0149_normalised +bed/train/bed_0028_normalised +bed/train/bed_0508_normalised +bed/train/bed_0058_normalised +bed/train/bed_0063_normalised +bed/train/bed_0361_normalised +bed/train/bed_0162_normalised +bed/train/bed_0382_normalised +bed/train/bed_0164_normalised +bed/train/bed_0422_normalised +bed/train/bed_0399_normalised +bed/train/bed_0007_normalised +bed/train/bed_0200_normalised +bed/train/bed_0296_normalised +bed/train/bed_0206_normalised +bed/train/bed_0513_normalised +bed/train/bed_0142_normalised +bed/train/bed_0397_normalised +bed/train/bed_0158_normalised +bed/train/bed_0356_normalised +bed/train/bed_0135_normalised +bed/train/bed_0428_normalised +bed/train/bed_0321_normalised +bed/train/bed_0310_normalised +bed/train/bed_0337_normalised +bed/train/bed_0229_normalised +bed/train/bed_0225_normalised +bed/train/bed_0396_normalised +bed/train/bed_0435_normalised +bed/train/bed_0065_normalised +bed/train/bed_0379_normalised +bed/train/bed_0454_normalised +bed/train/bed_0401_normalised +bed/train/bed_0491_normalised +bed/train/bed_0391_normalised +bed/train/bed_0050_normalised +bed/train/bed_0432_normalised +bed/train/bed_0070_normalised +bed/train/bed_0088_normalised +bed/train/bed_0390_normalised +bed/train/bed_0316_normalised +bed/train/bed_0309_normalised +bed/train/bed_0068_normalised +bed/train/bed_0468_normalised +bed/train/bed_0487_normalised +bed/train/bed_0377_normalised +bed/train/bed_0251_normalised +bed/train/bed_0234_normalised +bed/train/bed_0122_normalised +bed/train/bed_0236_normalised +bed/train/bed_0449_normalised +bed/train/bed_0450_normalised +bed/train/bed_0237_normalised +bed/train/bed_0409_normalised +bed/train/bed_0258_normalised +bed/train/bed_0026_normalised +bed/train/bed_0418_normalised +bed/train/bed_0440_normalised +bed/train/bed_0083_normalised +bed/train/bed_0497_normalised +bed/train/bed_0283_normalised +bed/train/bed_0228_normalised +bed/train/bed_0097_normalised +bed/train/bed_0172_normalised +bed/train/bed_0293_normalised +bed/train/bed_0090_normalised +bed/train/bed_0498_normalised +bed/train/bed_0191_normalised +bed/train/bed_0302_normalised +bed/train/bed_0016_normalised +bed/train/bed_0153_normalised +bed/train/bed_0425_normalised +bed/train/bed_0294_normalised +bed/train/bed_0452_normalised +bed/train/bed_0292_normalised +bed/train/bed_0064_normalised +bed/train/bed_0168_normalised +bed/train/bed_0018_normalised +bed/train/bed_0169_normalised +bed/train/bed_0431_normalised +bed/train/bed_0095_normalised +bed/train/bed_0467_normalised +bed/train/bed_0471_normalised +bed/train/bed_0324_normalised +bed/train/bed_0277_normalised +bed/train/bed_0465_normalised +bed/train/bed_0368_normalised +bed/train/bed_0266_normalised +bed/train/bed_0001_normalised +bed/train/bed_0375_normalised +bed/train/bed_0419_normalised +bed/train/bed_0311_normalised +bed/train/bed_0053_normalised +bed/train/bed_0504_normalised +bed/train/bed_0370_normalised +bed/train/bed_0359_normalised +bed/train/bed_0140_normalised +bed/train/bed_0196_normalised +bed/train/bed_0076_normalised +bed/train/bed_0486_normalised +bed/train/bed_0233_normalised +bed/train/bed_0462_normalised +bed/train/bed_0389_normalised +bed/train/bed_0130_normalised +bed/train/bed_0015_normalised +bed/train/bed_0071_normalised +bed/train/bed_0514_normalised +bed/train/bed_0230_normalised +bed/train/bed_0308_normalised +bed/train/bed_0416_normalised +bed/train/bed_0474_normalised +bed/train/bed_0045_normalised +bed/train/bed_0009_normalised +bed/train/bed_0220_normalised +bed/train/bed_0386_normalised +bed/train/bed_0333_normalised +bed/train/bed_0271_normalised +bed/train/bed_0502_normalised +bed/train/bed_0279_normalised +bed/train/bed_0049_normalised +bed/train/bed_0469_normalised +bed/train/bed_0156_normalised +bed/train/bed_0107_normalised +bed/train/bed_0131_normalised +bed/train/bed_0089_normalised +bed/train/bed_0348_normalised +bed/train/bed_0031_normalised +bed/train/bed_0297_normalised +bed/train/bed_0257_normalised +bed/train/bed_0137_normalised +bed/train/bed_0248_normalised +bed/train/bed_0002_normalised +bed/train/bed_0500_normalised +bed/train/bed_0030_normalised +bed/train/bed_0342_normalised +bed/train/bed_0493_normalised +bed/train/bed_0180_normalised +bed/train/bed_0411_normalised +bed/train/bed_0400_normalised +bed/train/bed_0323_normalised +bed/train/bed_0212_normalised +bed/train/bed_0287_normalised +bed/train/bed_0003_normalised +bed/train/bed_0241_normalised +bed/train/bed_0453_normalised +bed/train/bed_0426_normalised +bed/train/bed_0366_normalised +bed/train/bed_0410_normalised +bed/train/bed_0495_normalised +bed/train/bed_0221_normalised +bed/train/bed_0011_normalised +bed/train/bed_0004_normalised +bed/train/bed_0515_normalised +bed/train/bed_0281_normalised +bed/train/bed_0189_normalised +bed/train/bed_0080_normalised +bed/train/bed_0242_normalised +bed/train/bed_0349_normalised +bed/train/bed_0298_normalised +bed/train/bed_0027_normalised +bed/train/bed_0332_normalised +bed/train/bed_0331_normalised +bed/train/bed_0132_normalised +bed/train/bed_0363_normalised +bed/train/bed_0352_normalised +bed/train/bed_0096_normalised +bed/train/bed_0329_normalised +bed/train/bed_0334_normalised +bed/train/bed_0194_normalised +bed/train/bed_0421_normalised +bed/train/bed_0415_normalised +bed/train/bed_0430_normalised +bed/train/bed_0507_normalised +bed/train/bed_0218_normalised +bed/train/bed_0012_normalised +bed/train/bed_0351_normalised +bed/train/bed_0029_normalised +bed/train/bed_0365_normalised +bed/train/bed_0187_normalised +bed/train/bed_0489_normalised +bed/train/bed_0060_normalised +bed/train/bed_0032_normalised +bed/train/bed_0117_normalised +bed/train/bed_0075_normalised +bed/train/bed_0420_normalised +bed/train/bed_0376_normalised +bed/train/bed_0239_normalised +bed/train/bed_0394_normalised +bed/train/bed_0163_normalised +bed/train/bed_0013_normalised +bed/train/bed_0224_normalised +bed/train/bed_0339_normalised +bed/train/bed_0078_normalised +bed/train/bed_0171_normalised +bed/train/bed_0166_normalised +bed/train/bed_0114_normalised +bed/train/bed_0195_normalised +bed/train/bed_0506_normalised +bed/train/bed_0355_normalised +bed/train/bed_0273_normalised +bed/train/bed_0318_normalised +bed/train/bed_0126_normalised +bed/train/bed_0350_normalised +bed/train/bed_0124_normalised +bed/train/bed_0427_normalised +bed/train/bed_0035_normalised +bed/train/bed_0245_normalised +bed/train/bed_0005_normalised +bed/train/bed_0101_normalised +bed/train/bed_0038_normalised +bed/train/bed_0182_normalised +bed/train/bed_0285_normalised +bed/train/bed_0477_normalised +bed/train/bed_0336_normalised +bed/train/bed_0488_normalised +bed/train/bed_0110_normalised +bed/train/bed_0252_normalised +bed/train/bed_0472_normalised +bed/train/bed_0343_normalised +bed/train/bed_0364_normalised +bed/train/bed_0223_normalised +bed/train/bed_0133_normalised +bed/train/bed_0461_normalised +bed/train/bed_0240_normalised +bed/train/bed_0136_normalised +bed/train/bed_0127_normalised +bed/train/bed_0433_normalised +bed/train/bed_0128_normalised +bed/train/bed_0211_normalised +bed/train/bed_0503_normalised +bed/train/bed_0178_normalised +bed/train/bed_0276_normalised +bed/train/bed_0115_normalised +bed/train/bed_0044_normalised +bed/train/bed_0328_normalised +bed/train/bed_0492_normalised +bed/train/bed_0505_normalised +bed/train/bed_0301_normalised +bed/train/bed_0150_normalised +bed/train/bed_0061_normalised +bed/train/bed_0042_normalised +bed/train/bed_0190_normalised +bed/train/bed_0094_normalised +bed/train/bed_0129_normalised +bed/train/bed_0057_normalised +bed/train/bed_0303_normalised +bed/train/bed_0458_normalised +bed/train/bed_0272_normalised +bed/train/bed_0483_normalised +bed/train/bed_0307_normalised +bed/train/bed_0134_normalised +bed/train/bed_0043_normalised +bed/train/bed_0017_normalised +bed/train/bed_0268_normalised +bed/train/bed_0260_normalised +bed/train/bed_0008_normalised +bed/train/bed_0313_normalised +bed/train/bed_0052_normalised +bed/train/bed_0056_normalised +bed/train/bed_0041_normalised +bed/train/bed_0284_normalised +bed/train/bed_0304_normalised +bed/train/bed_0066_normalised +bed/train/bed_0253_normalised +bed/train/bed_0446_normalised +bed/train/bed_0104_normalised +bed/train/bed_0345_normalised +bed/train/bed_0246_normalised +bed/train/bed_0413_normalised +bed/train/bed_0340_normalised +bed/train/bed_0305_normalised +bed/train/bed_0358_normalised +bed/train/bed_0378_normalised +bed/train/bed_0512_normalised +bed/train/bed_0270_normalised +bed/train/bed_0451_normalised +bed/train/bed_0455_normalised +bed/train/bed_0288_normalised +bed/train/bed_0371_normalised +bed/train/bed_0282_normalised +bed/train/bed_0341_normalised +bed/train/bed_0315_normalised +bed/train/bed_0188_normalised +bed/train/bed_0170_normalised +bed/train/bed_0073_normalised +bed/train/bed_0319_normalised +bed/train/bed_0408_normalised +bed/train/bed_0120_normalised +bed/train/bed_0033_normalised +bed/train/bed_0299_normalised +bed/train/bed_0103_normalised +bed/train/bed_0010_normalised +bed/train/bed_0280_normalised +bed/train/bed_0286_normalised +bed/train/bed_0141_normalised +bed/train/bed_0249_normalised +bed/train/bed_0353_normalised +bed/train/bed_0357_normalised +bed/train/bed_0203_normalised +bed/train/bed_0438_normalised +bed/train/bed_0478_normalised +bed/train/bed_0174_normalised +bed/train/bed_0184_normalised +bed/train/bed_0100_normalised +bed/train/bed_0448_normalised +bed/train/bed_0165_normalised +bed/train/bed_0384_normalised +bed/train/bed_0062_normalised +bed/train/bed_0205_normalised +bed/train/bed_0109_normalised +bed/train/bed_0079_normalised +bed/train/bed_0470_normalised +bed/train/bed_0155_normalised +bed/train/bed_0402_normalised +bed/train/bed_0393_normalised +bed/train/bed_0222_normalised +bed/train/bed_0081_normalised +bed/train/bed_0023_normalised +bed/train/bed_0463_normalised +bed/train/bed_0119_normalised +bed/train/bed_0102_normalised +bed/train/bed_0496_normalised +bed/train/bed_0192_normalised +bed/train/bed_0082_normalised +bed/train/bed_0116_normalised +bed/train/bed_0362_normalised +bed/train/bed_0077_normalised +bed/train/bed_0439_normalised +bed/train/bed_0424_normalised +bed/train/bed_0118_normalised +bed/train/bed_0485_normalised +bed/train/bed_0048_normalised +bed/train/bed_0074_normalised +bed/train/bed_0146_normalised +bed/train/bed_0219_normalised +bed/train/bed_0326_normalised +bed/train/bed_0093_normalised +bed/train/bed_0265_normalised +bed/train/bed_0436_normalised +bed/train/bed_0020_normalised +bed/train/bed_0022_normalised +bed/train/bed_0325_normalised +bed/train/bed_0291_normalised +bed/train/bed_0159_normalised +bed/train/bed_0111_normalised +bed/train/bed_0144_normalised +bed/train/bed_0335_normalised +bed/train/bed_0267_normalised +bed/train/bed_0317_normalised +bed/train/bed_0395_normalised +bed/train/bed_0054_normalised +bed/train/bed_0456_normalised +bed/train/bed_0185_normalised +bed/train/bed_0197_normalised +bed/train/bed_0099_normalised +bed/train/bed_0036_normalised +bed/train/bed_0037_normalised +bed/train/bed_0481_normalised +bed/train/bed_0404_normalised +bed/train/bed_0306_normalised +bed/train/bed_0443_normalised +bed/train/bed_0167_normalised +bed/train/bed_0147_normalised +bed/train/bed_0490_normalised +bed/train/bed_0139_normalised +bed/train/bed_0216_normalised +bed/train/bed_0320_normalised +bed/train/bed_0055_normalised +bed/train/bed_0344_normalised +bed/train/bed_0145_normalised +bed/train/bed_0511_normalised +bed/train/bed_0327_normalised +bed/train/bed_0407_normalised +bed/train/bed_0025_normalised +bed/train/bed_0021_normalised +bed/train/bed_0367_normalised +bed/train/bed_0460_normalised +bed/train/bed_0434_normalised +bed/train/bed_0173_normalised +bed/train/bed_0046_normalised +bed/train/bed_0392_normalised +bed/train/bed_0154_normalised +bed/train/bed_0201_normalised +bed/train/bed_0193_normalised +bed/train/bed_0447_normalised +bed/train/bed_0457_normalised +bed/train/bed_0354_normalised +bed/train/bed_0314_normalised +bed/train/bed_0387_normalised +bed/train/bed_0405_normalised +bed/train/bed_0067_normalised +bed/train/bed_0475_normalised +bed/train/bed_0383_normalised +bed/train/bed_0175_normalised +bed/train/bed_0385_normalised +bed/train/bed_0160_normalised +bed/train/bed_0181_normalised +bed/train/bed_0051_normalised +bed/test/bed_0542_normalised +bed/test/bed_0517_normalised +bed/test/bed_0599_normalised +bed/test/bed_0596_normalised +bed/test/bed_0606_normalised +bed/test/bed_0546_normalised +bed/test/bed_0593_normalised +bed/test/bed_0550_normalised +bed/test/bed_0547_normalised +bed/test/bed_0579_normalised +bed/test/bed_0565_normalised +bed/test/bed_0545_normalised +bed/test/bed_0595_normalised +bed/test/bed_0532_normalised +bed/test/bed_0609_normalised +bed/test/bed_0584_normalised +bed/test/bed_0533_normalised +bed/test/bed_0571_normalised +bed/test/bed_0585_normalised +bed/test/bed_0568_normalised +bed/test/bed_0572_normalised +bed/test/bed_0578_normalised +bed/test/bed_0588_normalised +bed/test/bed_0520_normalised +bed/test/bed_0583_normalised +bed/test/bed_0541_normalised +bed/test/bed_0592_normalised +bed/test/bed_0523_normalised +bed/test/bed_0516_normalised +bed/test/bed_0582_normalised +bed/test/bed_0563_normalised +bed/test/bed_0519_normalised +bed/test/bed_0554_normalised +bed/test/bed_0581_normalised +bed/test/bed_0525_normalised +bed/test/bed_0536_normalised +bed/test/bed_0586_normalised +bed/test/bed_0527_normalised +bed/test/bed_0573_normalised +bed/test/bed_0567_normalised +bed/test/bed_0543_normalised +bed/test/bed_0587_normalised +bed/test/bed_0603_normalised +bed/test/bed_0549_normalised +bed/test/bed_0524_normalised +bed/test/bed_0570_normalised +bed/test/bed_0521_normalised +bed/test/bed_0594_normalised +bed/test/bed_0522_normalised +bed/test/bed_0589_normalised +bed/test/bed_0598_normalised +bed/test/bed_0531_normalised +bed/test/bed_0566_normalised +bed/test/bed_0601_normalised +bed/test/bed_0551_normalised +bed/test/bed_0530_normalised +bed/test/bed_0559_normalised +bed/test/bed_0560_normalised +bed/test/bed_0615_normalised +bed/test/bed_0544_normalised +bed/test/bed_0610_normalised +bed/test/bed_0518_normalised +bed/test/bed_0539_normalised +bed/test/bed_0607_normalised +bed/test/bed_0535_normalised +bed/test/bed_0611_normalised +bed/test/bed_0577_normalised +bed/test/bed_0602_normalised +bed/test/bed_0576_normalised +bed/test/bed_0534_normalised +bed/test/bed_0538_normalised +bed/test/bed_0528_normalised +bed/test/bed_0604_normalised +bed/test/bed_0562_normalised +bed/test/bed_0612_normalised +bed/test/bed_0591_normalised +bed/test/bed_0555_normalised +bed/test/bed_0597_normalised +bed/test/bed_0553_normalised +bed/test/bed_0558_normalised +bed/test/bed_0574_normalised +bed/test/bed_0526_normalised +bed/test/bed_0556_normalised +bed/test/bed_0540_normalised +bed/test/bed_0575_normalised +bed/test/bed_0580_normalised +bed/test/bed_0608_normalised +bed/test/bed_0552_normalised +bed/test/bed_0600_normalised +bed/test/bed_0564_normalised +bed/test/bed_0605_normalised +bed/test/bed_0613_normalised +bed/test/bed_0590_normalised +bed/test/bed_0614_normalised +bed/test/bed_0561_normalised +bed/test/bed_0569_normalised +bed/test/bed_0548_normalised +bed/test/bed_0557_normalised +bed/test/bed_0537_normalised +bed/test/bed_0529_normalised +stool/train/stool_0068_normalised +stool/train/stool_0085_normalised +stool/train/stool_0086_normalised +stool/train/stool_0012_normalised +stool/train/stool_0021_normalised +stool/train/stool_0080_normalised +stool/train/stool_0053_normalised +stool/train/stool_0054_normalised +stool/train/stool_0088_normalised +stool/train/stool_0056_normalised +stool/train/stool_0070_normalised +stool/train/stool_0028_normalised +stool/train/stool_0030_normalised +stool/train/stool_0079_normalised +stool/train/stool_0007_normalised +stool/train/stool_0033_normalised +stool/train/stool_0062_normalised +stool/train/stool_0066_normalised +stool/train/stool_0071_normalised +stool/train/stool_0002_normalised +stool/train/stool_0069_normalised +stool/train/stool_0084_normalised +stool/train/stool_0075_normalised +stool/train/stool_0036_normalised +stool/train/stool_0045_normalised +stool/train/stool_0087_normalised +stool/train/stool_0063_normalised +stool/train/stool_0017_normalised +stool/train/stool_0003_normalised +stool/train/stool_0044_normalised +stool/train/stool_0061_normalised +stool/train/stool_0041_normalised +stool/train/stool_0077_normalised +stool/train/stool_0010_normalised +stool/train/stool_0076_normalised +stool/train/stool_0046_normalised +stool/train/stool_0055_normalised +stool/train/stool_0051_normalised +stool/train/stool_0005_normalised +stool/train/stool_0043_normalised +stool/train/stool_0027_normalised +stool/train/stool_0038_normalised +stool/train/stool_0073_normalised +stool/train/stool_0034_normalised +stool/train/stool_0047_normalised +stool/train/stool_0048_normalised +stool/train/stool_0018_normalised +stool/train/stool_0065_normalised +stool/train/stool_0014_normalised +stool/train/stool_0031_normalised +stool/train/stool_0004_normalised +stool/train/stool_0026_normalised +stool/train/stool_0081_normalised +stool/train/stool_0032_normalised +stool/train/stool_0008_normalised +stool/train/stool_0059_normalised +stool/train/stool_0052_normalised +stool/train/stool_0082_normalised +stool/train/stool_0029_normalised +stool/train/stool_0013_normalised +stool/train/stool_0067_normalised +stool/train/stool_0090_normalised +stool/train/stool_0024_normalised +stool/train/stool_0042_normalised +stool/train/stool_0006_normalised +stool/train/stool_0022_normalised +stool/train/stool_0037_normalised +stool/train/stool_0035_normalised +stool/train/stool_0083_normalised +stool/train/stool_0058_normalised +stool/train/stool_0039_normalised +stool/train/stool_0060_normalised +stool/train/stool_0016_normalised +stool/train/stool_0049_normalised +stool/train/stool_0025_normalised +stool/train/stool_0089_normalised +stool/train/stool_0023_normalised +stool/train/stool_0009_normalised +stool/train/stool_0057_normalised +stool/train/stool_0019_normalised +stool/train/stool_0001_normalised +stool/train/stool_0074_normalised +stool/train/stool_0078_normalised +stool/train/stool_0020_normalised +stool/train/stool_0050_normalised +stool/train/stool_0011_normalised +stool/train/stool_0040_normalised +stool/train/stool_0064_normalised +stool/train/stool_0015_normalised +stool/train/stool_0072_normalised +stool/test/stool_0092_normalised +stool/test/stool_0108_normalised +stool/test/stool_0100_normalised +stool/test/stool_0110_normalised +stool/test/stool_0091_normalised +stool/test/stool_0097_normalised +stool/test/stool_0103_normalised +stool/test/stool_0105_normalised +stool/test/stool_0109_normalised +stool/test/stool_0095_normalised +stool/test/stool_0106_normalised +stool/test/stool_0101_normalised +stool/test/stool_0098_normalised +stool/test/stool_0094_normalised +stool/test/stool_0093_normalised +stool/test/stool_0099_normalised +stool/test/stool_0107_normalised +stool/test/stool_0096_normalised +stool/test/stool_0102_normalised +stool/test/stool_0104_normalised +person/train/person_0042_normalised +person/train/person_0064_normalised +person/train/person_0059_normalised +person/train/person_0045_normalised +person/train/person_0014_normalised +person/train/person_0080_normalised +person/train/person_0025_normalised +person/train/person_0049_normalised +person/train/person_0085_normalised +person/train/person_0007_normalised +person/train/person_0058_normalised +person/train/person_0067_normalised +person/train/person_0047_normalised +person/train/person_0086_normalised +person/train/person_0038_normalised +person/train/person_0066_normalised +person/train/person_0037_normalised +person/train/person_0016_normalised +person/train/person_0074_normalised +person/train/person_0062_normalised +person/train/person_0072_normalised +person/train/person_0001_normalised +person/train/person_0075_normalised +person/train/person_0034_normalised +person/train/person_0020_normalised +person/train/person_0004_normalised +person/train/person_0063_normalised +person/train/person_0010_normalised +person/train/person_0008_normalised +person/train/person_0028_normalised +person/train/person_0065_normalised +person/train/person_0012_normalised +person/train/person_0030_normalised +person/train/person_0050_normalised +person/train/person_0056_normalised +person/train/person_0044_normalised +person/train/person_0051_normalised +person/train/person_0031_normalised +person/train/person_0083_normalised +person/train/person_0035_normalised +person/train/person_0057_normalised +person/train/person_0023_normalised +person/train/person_0039_normalised +person/train/person_0077_normalised +person/train/person_0053_normalised +person/train/person_0017_normalised +person/train/person_0032_normalised +person/train/person_0036_normalised +person/train/person_0055_normalised +person/train/person_0076_normalised +person/train/person_0052_normalised +person/train/person_0003_normalised +person/train/person_0005_normalised +person/train/person_0011_normalised +person/train/person_0033_normalised +person/train/person_0068_normalised +person/train/person_0006_normalised +person/train/person_0013_normalised +person/train/person_0040_normalised +person/train/person_0027_normalised +person/train/person_0070_normalised +person/train/person_0078_normalised +person/train/person_0084_normalised +person/train/person_0054_normalised +person/train/person_0079_normalised +person/train/person_0019_normalised +person/train/person_0043_normalised +person/train/person_0026_normalised +person/train/person_0081_normalised +person/train/person_0024_normalised +person/train/person_0069_normalised +person/train/person_0046_normalised +person/train/person_0022_normalised +person/train/person_0018_normalised +person/train/person_0073_normalised +person/train/person_0088_normalised +person/train/person_0087_normalised +person/train/person_0060_normalised +person/train/person_0015_normalised +person/train/person_0082_normalised +person/train/person_0071_normalised +person/train/person_0061_normalised +person/train/person_0002_normalised +person/train/person_0029_normalised +person/train/person_0041_normalised +person/train/person_0048_normalised +person/train/person_0009_normalised +person/train/person_0021_normalised +person/test/person_0103_normalised +person/test/person_0099_normalised +person/test/person_0094_normalised +person/test/person_0089_normalised +person/test/person_0096_normalised +person/test/person_0092_normalised +person/test/person_0105_normalised +person/test/person_0108_normalised +person/test/person_0097_normalised +person/test/person_0098_normalised +person/test/person_0095_normalised +person/test/person_0101_normalised +person/test/person_0093_normalised +person/test/person_0091_normalised +person/test/person_0100_normalised +person/test/person_0104_normalised +person/test/person_0090_normalised +person/test/person_0102_normalised +person/test/person_0107_normalised +person/test/person_0106_normalised +xbox/train/xbox_0076_normalised +xbox/train/xbox_0056_normalised +xbox/train/xbox_0084_normalised +xbox/train/xbox_0038_normalised +xbox/train/xbox_0087_normalised +xbox/train/xbox_0008_normalised +xbox/train/xbox_0030_normalised +xbox/train/xbox_0017_normalised +xbox/train/xbox_0092_normalised +xbox/train/xbox_0020_normalised +xbox/train/xbox_0096_normalised +xbox/train/xbox_0025_normalised +xbox/train/xbox_0034_normalised +xbox/train/xbox_0055_normalised +xbox/train/xbox_0098_normalised +xbox/train/xbox_0004_normalised +xbox/train/xbox_0062_normalised +xbox/train/xbox_0095_normalised +xbox/train/xbox_0050_normalised +xbox/train/xbox_0019_normalised +xbox/train/xbox_0058_normalised +xbox/train/xbox_0026_normalised +xbox/train/xbox_0013_normalised +xbox/train/xbox_0072_normalised +xbox/train/xbox_0044_normalised +xbox/train/xbox_0073_normalised +xbox/train/xbox_0065_normalised +xbox/train/xbox_0033_normalised +xbox/train/xbox_0043_normalised +xbox/train/xbox_0060_normalised +xbox/train/xbox_0007_normalised +xbox/train/xbox_0089_normalised +xbox/train/xbox_0088_normalised +xbox/train/xbox_0036_normalised +xbox/train/xbox_0049_normalised +xbox/train/xbox_0077_normalised +xbox/train/xbox_0071_normalised +xbox/train/xbox_0091_normalised +xbox/train/xbox_0037_normalised +xbox/train/xbox_0075_normalised +xbox/train/xbox_0048_normalised +xbox/train/xbox_0045_normalised +xbox/train/xbox_0046_normalised +xbox/train/xbox_0021_normalised +xbox/train/xbox_0015_normalised +xbox/train/xbox_0028_normalised +xbox/train/xbox_0029_normalised +xbox/train/xbox_0064_normalised +xbox/train/xbox_0001_normalised +xbox/train/xbox_0014_normalised +xbox/train/xbox_0090_normalised +xbox/train/xbox_0052_normalised +xbox/train/xbox_0022_normalised +xbox/train/xbox_0018_normalised +xbox/train/xbox_0039_normalised +xbox/train/xbox_0085_normalised +xbox/train/xbox_0070_normalised +xbox/train/xbox_0003_normalised +xbox/train/xbox_0009_normalised +xbox/train/xbox_0061_normalised +xbox/train/xbox_0006_normalised +xbox/train/xbox_0097_normalised +xbox/train/xbox_0066_normalised +xbox/train/xbox_0051_normalised +xbox/train/xbox_0032_normalised +xbox/train/xbox_0059_normalised +xbox/train/xbox_0023_normalised +xbox/train/xbox_0005_normalised +xbox/train/xbox_0035_normalised +xbox/train/xbox_0074_normalised +xbox/train/xbox_0103_normalised +xbox/train/xbox_0042_normalised +xbox/train/xbox_0079_normalised +xbox/train/xbox_0047_normalised +xbox/train/xbox_0102_normalised +xbox/train/xbox_0031_normalised +xbox/train/xbox_0053_normalised +xbox/train/xbox_0057_normalised +xbox/train/xbox_0002_normalised +xbox/train/xbox_0081_normalised +xbox/train/xbox_0094_normalised +xbox/train/xbox_0100_normalised +xbox/train/xbox_0099_normalised +xbox/train/xbox_0068_normalised +xbox/train/xbox_0086_normalised +xbox/train/xbox_0069_normalised +xbox/train/xbox_0067_normalised +xbox/train/xbox_0080_normalised +xbox/train/xbox_0024_normalised +xbox/train/xbox_0016_normalised +xbox/train/xbox_0010_normalised +xbox/train/xbox_0101_normalised +xbox/train/xbox_0012_normalised +xbox/train/xbox_0027_normalised +xbox/train/xbox_0041_normalised +xbox/train/xbox_0063_normalised +xbox/train/xbox_0040_normalised +xbox/train/xbox_0093_normalised +xbox/train/xbox_0082_normalised +xbox/train/xbox_0011_normalised +xbox/train/xbox_0083_normalised +xbox/train/xbox_0078_normalised +xbox/train/xbox_0054_normalised +xbox/test/xbox_0120_normalised +xbox/test/xbox_0109_normalised +xbox/test/xbox_0106_normalised +xbox/test/xbox_0112_normalised +xbox/test/xbox_0121_normalised +xbox/test/xbox_0113_normalised +xbox/test/xbox_0107_normalised +xbox/test/xbox_0108_normalised +xbox/test/xbox_0123_normalised +xbox/test/xbox_0116_normalised +xbox/test/xbox_0114_normalised +xbox/test/xbox_0118_normalised +xbox/test/xbox_0115_normalised +xbox/test/xbox_0117_normalised +xbox/test/xbox_0105_normalised +xbox/test/xbox_0104_normalised +xbox/test/xbox_0119_normalised +xbox/test/xbox_0110_normalised +xbox/test/xbox_0111_normalised +xbox/test/xbox_0122_normalised +chair/train/chair_0629_normalised +chair/train/chair_0099_normalised +chair/train/chair_0859_normalised +chair/train/chair_0602_normalised +chair/train/chair_0362_normalised +chair/train/chair_0261_normalised +chair/train/chair_0150_normalised +chair/train/chair_0651_normalised +chair/train/chair_0850_normalised +chair/train/chair_0393_normalised +chair/train/chair_0579_normalised +chair/train/chair_0594_normalised +chair/train/chair_0185_normalised +chair/train/chair_0761_normalised +chair/train/chair_0209_normalised +chair/train/chair_0299_normalised +chair/train/chair_0210_normalised +chair/train/chair_0851_normalised +chair/train/chair_0005_normalised +chair/train/chair_0522_normalised +chair/train/chair_0140_normalised +chair/train/chair_0606_normalised +chair/train/chair_0499_normalised +chair/train/chair_0253_normalised +chair/train/chair_0783_normalised +chair/train/chair_0401_normalised +chair/train/chair_0858_normalised +chair/train/chair_0533_normalised +chair/train/chair_0790_normalised +chair/train/chair_0410_normalised +chair/train/chair_0421_normalised +chair/train/chair_0620_normalised +chair/train/chair_0376_normalised +chair/train/chair_0829_normalised +chair/train/chair_0574_normalised +chair/train/chair_0687_normalised +chair/train/chair_0702_normalised +chair/train/chair_0876_normalised +chair/train/chair_0437_normalised +chair/train/chair_0348_normalised +chair/train/chair_0338_normalised +chair/train/chair_0875_normalised +chair/train/chair_0297_normalised +chair/train/chair_0818_normalised +chair/train/chair_0781_normalised +chair/train/chair_0223_normalised +chair/train/chair_0354_normalised +chair/train/chair_0590_normalised +chair/train/chair_0081_normalised +chair/train/chair_0663_normalised +chair/train/chair_0291_normalised +chair/train/chair_0519_normalised +chair/train/chair_0105_normalised +chair/train/chair_0615_normalised +chair/train/chair_0306_normalised +chair/train/chair_0383_normalised +chair/train/chair_0251_normalised +chair/train/chair_0678_normalised +chair/train/chair_0597_normalised +chair/train/chair_0246_normalised +chair/train/chair_0072_normalised +chair/train/chair_0144_normalised +chair/train/chair_0368_normalised +chair/train/chair_0184_normalised +chair/train/chair_0637_normalised +chair/train/chair_0676_normalised +chair/train/chair_0885_normalised +chair/train/chair_0459_normalised +chair/train/chair_0116_normalised +chair/train/chair_0387_normalised +chair/train/chair_0043_normalised +chair/train/chair_0259_normalised +chair/train/chair_0392_normalised +chair/train/chair_0016_normalised +chair/train/chair_0337_normalised +chair/train/chair_0037_normalised +chair/train/chair_0252_normalised +chair/train/chair_0349_normalised +chair/train/chair_0400_normalised +chair/train/chair_0248_normalised +chair/train/chair_0377_normalised +chair/train/chair_0815_normalised +chair/train/chair_0616_normalised +chair/train/chair_0877_normalised +chair/train/chair_0611_normalised +chair/train/chair_0386_normalised +chair/train/chair_0504_normalised +chair/train/chair_0752_normalised +chair/train/chair_0588_normalised +chair/train/chair_0744_normalised +chair/train/chair_0290_normalised +chair/train/chair_0225_normalised +chair/train/chair_0514_normalised +chair/train/chair_0190_normalised +chair/train/chair_0142_normalised +chair/train/chair_0431_normalised +chair/train/chair_0403_normalised +chair/train/chair_0260_normalised +chair/train/chair_0078_normalised +chair/train/chair_0517_normalised +chair/train/chair_0090_normalised +chair/train/chair_0433_normalised +chair/train/chair_0340_normalised +chair/train/chair_0494_normalised +chair/train/chair_0351_normalised +chair/train/chair_0233_normalised +chair/train/chair_0496_normalised +chair/train/chair_0557_normalised +chair/train/chair_0263_normalised +chair/train/chair_0776_normalised +chair/train/chair_0329_normalised +chair/train/chair_0028_normalised +chair/train/chair_0469_normalised +chair/train/chair_0366_normalised +chair/train/chair_0671_normalised +chair/train/chair_0326_normalised +chair/train/chair_0438_normalised +chair/train/chair_0464_normalised +chair/train/chair_0228_normalised +chair/train/chair_0139_normalised +chair/train/chair_0889_normalised +chair/train/chair_0278_normalised +chair/train/chair_0288_normalised +chair/train/chair_0038_normalised +chair/train/chair_0415_normalised +chair/train/chair_0577_normalised +chair/train/chair_0698_normalised +chair/train/chair_0235_normalised +chair/train/chair_0451_normalised +chair/train/chair_0009_normalised +chair/train/chair_0457_normalised +chair/train/chair_0662_normalised +chair/train/chair_0612_normalised +chair/train/chair_0175_normalised +chair/train/chair_0372_normalised +chair/train/chair_0473_normalised +chair/train/chair_0644_normalised +chair/train/chair_0232_normalised +chair/train/chair_0746_normalised +chair/train/chair_0632_normalised +chair/train/chair_0399_normalised +chair/train/chair_0093_normalised +chair/train/chair_0520_normalised +chair/train/chair_0374_normalised +chair/train/chair_0394_normalised +chair/train/chair_0855_normalised +chair/train/chair_0646_normalised +chair/train/chair_0336_normalised +chair/train/chair_0388_normalised +chair/train/chair_0723_normalised +chair/train/chair_0466_normalised +chair/train/chair_0019_normalised +chair/train/chair_0262_normalised +chair/train/chair_0391_normalised +chair/train/chair_0532_normalised +chair/train/chair_0327_normalised +chair/train/chair_0852_normalised +chair/train/chair_0529_normalised +chair/train/chair_0312_normalised +chair/train/chair_0255_normalised +chair/train/chair_0243_normalised +chair/train/chair_0539_normalised +chair/train/chair_0240_normalised +chair/train/chair_0808_normalised +chair/train/chair_0649_normalised +chair/train/chair_0848_normalised +chair/train/chair_0020_normalised +chair/train/chair_0390_normalised +chair/train/chair_0279_normalised +chair/train/chair_0046_normalised +chair/train/chair_0426_normalised +chair/train/chair_0523_normalised +chair/train/chair_0180_normalised +chair/train/chair_0668_normalised +chair/train/chair_0607_normalised +chair/train/chair_0430_normalised +chair/train/chair_0754_normalised +chair/train/chair_0217_normalised +chair/train/chair_0788_normalised +chair/train/chair_0721_normalised +chair/train/chair_0015_normalised +chair/train/chair_0817_normalised +chair/train/chair_0580_normalised +chair/train/chair_0083_normalised +chair/train/chair_0186_normalised +chair/train/chair_0824_normalised +chair/train/chair_0560_normalised +chair/train/chair_0044_normalised +chair/train/chair_0063_normalised +chair/train/chair_0353_normalised +chair/train/chair_0481_normalised +chair/train/chair_0109_normalised +chair/train/chair_0724_normalised +chair/train/chair_0095_normalised +chair/train/chair_0535_normalised +chair/train/chair_0578_normalised +chair/train/chair_0027_normalised +chair/train/chair_0280_normalised +chair/train/chair_0879_normalised +chair/train/chair_0358_normalised +chair/train/chair_0755_normalised +chair/train/chair_0172_normalised +chair/train/chair_0042_normalised +chair/train/chair_0029_normalised +chair/train/chair_0866_normalised +chair/train/chair_0684_normalised +chair/train/chair_0341_normalised +chair/train/chair_0218_normalised +chair/train/chair_0103_normalised +chair/train/chair_0170_normalised +chair/train/chair_0575_normalised +chair/train/chair_0156_normalised +chair/train/chair_0443_normalised +chair/train/chair_0558_normalised +chair/train/chair_0622_normalised +chair/train/chair_0836_normalised +chair/train/chair_0694_normalised +chair/train/chair_0826_normalised +chair/train/chair_0030_normalised +chair/train/chair_0655_normalised +chair/train/chair_0604_normalised +chair/train/chair_0308_normalised +chair/train/chair_0073_normalised +chair/train/chair_0205_normalised +chair/train/chair_0264_normalised +chair/train/chair_0617_normalised +chair/train/chair_0465_normalised +chair/train/chair_0062_normalised +chair/train/chair_0396_normalised +chair/train/chair_0061_normalised +chair/train/chair_0714_normalised +chair/train/chair_0820_normalised +chair/train/chair_0477_normalised +chair/train/chair_0869_normalised +chair/train/chair_0123_normalised +chair/train/chair_0508_normalised +chair/train/chair_0133_normalised +chair/train/chair_0516_normalised +chair/train/chair_0641_normalised +chair/train/chair_0314_normalised +chair/train/chair_0750_normalised +chair/train/chair_0511_normalised +chair/train/chair_0127_normalised +chair/train/chair_0472_normalised +chair/train/chair_0730_normalised +chair/train/chair_0159_normalised +chair/train/chair_0101_normalised +chair/train/chair_0441_normalised +chair/train/chair_0013_normalised +chair/train/chair_0589_normalised +chair/train/chair_0685_normalised +chair/train/chair_0241_normalised +chair/train/chair_0222_normalised +chair/train/chair_0849_normalised +chair/train/chair_0732_normalised +chair/train/chair_0796_normalised +chair/train/chair_0108_normalised +chair/train/chair_0151_normalised +chair/train/chair_0507_normalised +chair/train/chair_0488_normalised +chair/train/chair_0238_normalised +chair/train/chair_0347_normalised +chair/train/chair_0741_normalised +chair/train/chair_0525_normalised +chair/train/chair_0201_normalised +chair/train/chair_0160_normalised +chair/train/chair_0198_normalised +chair/train/chair_0206_normalised +chair/train/chair_0084_normalised +chair/train/chair_0435_normalised +chair/train/chair_0429_normalised +chair/train/chair_0302_normalised +chair/train/chair_0352_normalised +chair/train/chair_0463_normalised +chair/train/chair_0113_normalised +chair/train/chair_0798_normalised +chair/train/chair_0501_normalised +chair/train/chair_0273_normalised +chair/train/chair_0024_normalised +chair/train/chair_0881_normalised +chair/train/chair_0018_normalised +chair/train/chair_0628_normalised +chair/train/chair_0659_normalised +chair/train/chair_0689_normalised +chair/train/chair_0282_normalised +chair/train/chair_0770_normalised +chair/train/chair_0461_normalised +chair/train/chair_0242_normalised +chair/train/chair_0303_normalised +chair/train/chair_0624_normalised +chair/train/chair_0564_normalised +chair/train/chair_0556_normalised +chair/train/chair_0106_normalised +chair/train/chair_0026_normalised +chair/train/chair_0735_normalised +chair/train/chair_0695_normalised +chair/train/chair_0470_normalised +chair/train/chair_0174_normalised +chair/train/chair_0865_normalised +chair/train/chair_0060_normalised +chair/train/chair_0035_normalised +chair/train/chair_0234_normalised +chair/train/chair_0489_normalised +chair/train/chair_0672_normalised +chair/train/chair_0313_normalised +chair/train/chair_0171_normalised +chair/train/chair_0008_normalised +chair/train/chair_0661_normalised +chair/train/chair_0583_normalised +chair/train/chair_0086_normalised +chair/train/chair_0295_normalised +chair/train/chair_0162_normalised +chair/train/chair_0152_normalised +chair/train/chair_0271_normalised +chair/train/chair_0791_normalised +chair/train/chair_0373_normalised +chair/train/chair_0397_normalised +chair/train/chair_0424_normalised +chair/train/chair_0417_normalised +chair/train/chair_0854_normalised +chair/train/chair_0636_normalised +chair/train/chair_0513_normalised +chair/train/chair_0074_normalised +chair/train/chair_0047_normalised +chair/train/chair_0667_normalised +chair/train/chair_0014_normalised +chair/train/chair_0051_normalised +chair/train/chair_0587_normalised +chair/train/chair_0811_normalised +chair/train/chair_0479_normalised +chair/train/chair_0153_normalised +chair/train/chair_0549_normalised +chair/train/chair_0467_normalised +chair/train/chair_0229_normalised +chair/train/chair_0143_normalised +chair/train/chair_0448_normalised +chair/train/chair_0001_normalised +chair/train/chair_0169_normalised +chair/train/chair_0647_normalised +chair/train/chair_0087_normalised +chair/train/chair_0454_normalised +chair/train/chair_0316_normalised +chair/train/chair_0309_normalised +chair/train/chair_0654_normalised +chair/train/chair_0226_normalised +chair/train/chair_0070_normalised +chair/train/chair_0056_normalised +chair/train/chair_0258_normalised +chair/train/chair_0195_normalised +chair/train/chair_0591_normalised +chair/train/chair_0146_normalised +chair/train/chair_0183_normalised +chair/train/chair_0318_normalised +chair/train/chair_0807_normalised +chair/train/chair_0453_normalised +chair/train/chair_0091_normalised +chair/train/chair_0256_normalised +chair/train/chair_0692_normalised +chair/train/chair_0526_normalised +chair/train/chair_0360_normalised +chair/train/chair_0840_normalised +chair/train/chair_0269_normalised +chair/train/chair_0017_normalised +chair/train/chair_0844_normalised +chair/train/chair_0482_normalised +chair/train/chair_0214_normalised +chair/train/chair_0773_normalised +chair/train/chair_0179_normalised +chair/train/chair_0704_normalised +chair/train/chair_0220_normalised +chair/train/chair_0131_normalised +chair/train/chair_0567_normalised +chair/train/chair_0419_normalised +chair/train/chair_0398_normalised +chair/train/chair_0625_normalised +chair/train/chair_0298_normalised +chair/train/chair_0384_normalised +chair/train/chair_0203_normalised +chair/train/chair_0458_normalised +chair/train/chair_0089_normalised +chair/train/chair_0806_normalised +chair/train/chair_0503_normalised +chair/train/chair_0274_normalised +chair/train/chair_0719_normalised +chair/train/chair_0793_normalised +chair/train/chair_0289_normalised +chair/train/chair_0728_normalised +chair/train/chair_0276_normalised +chair/train/chair_0837_normalised +chair/train/chair_0069_normalised +chair/train/chair_0609_normalised +chair/train/chair_0452_normalised +chair/train/chair_0076_normalised +chair/train/chair_0800_normalised +chair/train/chair_0192_normalised +chair/train/chair_0187_normalised +chair/train/chair_0096_normalised +chair/train/chair_0592_normalised +chair/train/chair_0593_normalised +chair/train/chair_0082_normalised +chair/train/chair_0231_normalised +chair/train/chair_0199_normalised +chair/train/chair_0371_normalised +chair/train/chair_0792_normalised +chair/train/chair_0335_normalised +chair/train/chair_0771_normalised +chair/train/chair_0285_normalised +chair/train/chair_0827_normalised +chair/train/chair_0713_normalised +chair/train/chair_0102_normalised +chair/train/chair_0521_normalised +chair/train/chair_0639_normalised +chair/train/chair_0870_normalised +chair/train/chair_0500_normalised +chair/train/chair_0007_normalised +chair/train/chair_0816_normalised +chair/train/chair_0884_normalised +chair/train/chair_0710_normalised +chair/train/chair_0370_normalised +chair/train/chair_0460_normalised +chair/train/chair_0766_normalised +chair/train/chair_0789_normalised +chair/train/chair_0653_normalised +chair/train/chair_0058_normalised +chair/train/chair_0708_normalised +chair/train/chair_0471_normalised +chair/train/chair_0440_normalised +chair/train/chair_0334_normalised +chair/train/chair_0355_normalised +chair/train/chair_0425_normalised +chair/train/chair_0427_normalised +chair/train/chair_0666_normalised +chair/train/chair_0545_normalised +chair/train/chair_0733_normalised +chair/train/chair_0322_normalised +chair/train/chair_0332_normalised +chair/train/chair_0534_normalised +chair/train/chair_0088_normalised +chair/train/chair_0600_normalised +chair/train/chair_0033_normalised +chair/train/chair_0822_normalised +chair/train/chair_0640_normalised +chair/train/chair_0565_normalised +chair/train/chair_0795_normalised +chair/train/chair_0204_normalised +chair/train/chair_0227_normalised +chair/train/chair_0328_normalised +chair/train/chair_0527_normalised +chair/train/chair_0167_normalised +chair/train/chair_0841_normalised +chair/train/chair_0857_normalised +chair/train/chair_0320_normalised +chair/train/chair_0157_normalised +chair/train/chair_0847_normalised +chair/train/chair_0310_normalised +chair/train/chair_0307_normalised +chair/train/chair_0495_normalised +chair/train/chair_0883_normalised +chair/train/chair_0237_normalised +chair/train/chair_0068_normalised +chair/train/chair_0748_normalised +chair/train/chair_0097_normalised +chair/train/chair_0012_normalised +chair/train/chair_0550_normalised +chair/train/chair_0882_normalised +chair/train/chair_0509_normalised +chair/train/chair_0054_normalised +chair/train/chair_0601_normalised +chair/train/chair_0546_normalised +chair/train/chair_0486_normalised +chair/train/chair_0753_normalised +chair/train/chair_0100_normalised +chair/train/chair_0701_normalised +chair/train/chair_0420_normalised +chair/train/chair_0305_normalised +chair/train/chair_0809_normalised +chair/train/chair_0128_normalised +chair/train/chair_0277_normalised +chair/train/chair_0480_normalised +chair/train/chair_0779_normalised +chair/train/chair_0468_normalised +chair/train/chair_0518_normalised +chair/train/chair_0369_normalised +chair/train/chair_0768_normalised +chair/train/chair_0738_normalised +chair/train/chair_0098_normalised +chair/train/chair_0135_normalised +chair/train/chair_0691_normalised +chair/train/chair_0445_normalised +chair/train/chair_0212_normalised +chair/train/chair_0561_normalised +chair/train/chair_0734_normalised +chair/train/chair_0104_normalised +chair/train/chair_0404_normalised +chair/train/chair_0803_normalised +chair/train/chair_0439_normalised +chair/train/chair_0812_normalised +chair/train/chair_0365_normalised +chair/train/chair_0860_normalised +chair/train/chair_0774_normalised +chair/train/chair_0436_normalised +chair/train/chair_0036_normalised +chair/train/chair_0618_normalised +chair/train/chair_0745_normalised +chair/train/chair_0207_normalised +chair/train/chair_0638_normalised +chair/train/chair_0342_normalised +chair/train/chair_0787_normalised +chair/train/chair_0887_normalised +chair/train/chair_0506_normalised +chair/train/chair_0188_normalised +chair/train/chair_0447_normalised +chair/train/chair_0270_normalised +chair/train/chair_0756_normalised +chair/train/chair_0677_normalised +chair/train/chair_0408_normalised +chair/train/chair_0208_normalised +chair/train/chair_0442_normalised +chair/train/chair_0835_normalised +chair/train/chair_0598_normalised +chair/train/chair_0130_normalised +chair/train/chair_0196_normalised +chair/train/chair_0221_normalised +chair/train/chair_0155_normalised +chair/train/chair_0287_normalised +chair/train/chair_0797_normalised +chair/train/chair_0572_normalised +chair/train/chair_0003_normalised +chair/train/chair_0658_normalised +chair/train/chair_0711_normalised +chair/train/chair_0548_normalised +chair/train/chair_0634_normalised +chair/train/chair_0483_normalised +chair/train/chair_0823_normalised +chair/train/chair_0414_normalised +chair/train/chair_0552_normalised +chair/train/chair_0568_normalised +chair/train/chair_0530_normalised +chair/train/chair_0541_normalised +chair/train/chair_0751_normalised +chair/train/chair_0474_normalised +chair/train/chair_0832_normalised +chair/train/chair_0434_normalised +chair/train/chair_0147_normalised +chair/train/chair_0720_normalised +chair/train/chair_0149_normalised +chair/train/chair_0510_normalised +chair/train/chair_0177_normalised +chair/train/chair_0537_normalised +chair/train/chair_0428_normalised +chair/train/chair_0121_normalised +chair/train/chair_0163_normalised +chair/train/chair_0543_normalised +chair/train/chair_0886_normalised +chair/train/chair_0512_normalised +chair/train/chair_0838_normalised +chair/train/chair_0758_normalised +chair/train/chair_0762_normalised +chair/train/chair_0742_normalised +chair/train/chair_0048_normalised +chair/train/chair_0266_normalised +chair/train/chair_0554_normalised +chair/train/chair_0178_normalised +chair/train/chair_0344_normalised +chair/train/chair_0379_normalised +chair/train/chair_0164_normalised +chair/train/chair_0551_normalised +chair/train/chair_0039_normalised +chair/train/chair_0491_normalised +chair/train/chair_0717_normalised +chair/train/chair_0418_normalised +chair/train/chair_0834_normalised +chair/train/chair_0880_normalised +chair/train/chair_0819_normalised +chair/train/chair_0378_normalised +chair/train/chair_0562_normalised +chair/train/chair_0114_normalised +chair/train/chair_0784_normalised +chair/train/chair_0528_normalised +chair/train/chair_0120_normalised +chair/train/chair_0767_normalised +chair/train/chair_0077_normalised +chair/train/chair_0216_normalised +chair/train/chair_0006_normalised +chair/train/chair_0333_normalised +chair/train/chair_0536_normalised +chair/train/chair_0524_normalised +chair/train/chair_0323_normalised +chair/train/chair_0361_normalised +chair/train/chair_0193_normalised +chair/train/chair_0122_normalised +chair/train/chair_0079_normalised +chair/train/chair_0065_normalised +chair/train/chair_0700_normalised +chair/train/chair_0669_normalised +chair/train/chair_0760_normalised +chair/train/chair_0802_normalised +chair/train/chair_0141_normalised +chair/train/chair_0389_normalised +chair/train/chair_0595_normalised +chair/train/chair_0265_normalised +chair/train/chair_0555_normalised +chair/train/chair_0747_normalised +chair/train/chair_0825_normalised +chair/train/chair_0423_normalised +chair/train/chair_0244_normalised +chair/train/chair_0581_normalised +chair/train/chair_0416_normalised +chair/train/chair_0782_normalised +chair/train/chair_0656_normalised +chair/train/chair_0004_normalised +chair/train/chair_0821_normalised +chair/train/chair_0861_normalised +chair/train/chair_0189_normalised +chair/train/chair_0540_normalised +chair/train/chair_0346_normalised +chair/train/chair_0045_normalised +chair/train/chair_0868_normalised +chair/train/chair_0475_normalised +chair/train/chair_0213_normalised +chair/train/chair_0124_normalised +chair/train/chair_0531_normalised +chair/train/chair_0080_normalised +chair/train/chair_0422_normalised +chair/train/chair_0066_normalised +chair/train/chair_0191_normalised +chair/train/chair_0853_normalised +chair/train/chair_0703_normalised +chair/train/chair_0722_normalised +chair/train/chair_0092_normalised +chair/train/chair_0161_normalised +chair/train/chair_0117_normalised +chair/train/chair_0757_normalised +chair/train/chair_0134_normalised +chair/train/chair_0635_normalised +chair/train/chair_0502_normalised +chair/train/chair_0450_normalised +chair/train/chair_0680_normalised +chair/train/chair_0411_normalised +chair/train/chair_0067_normalised +chair/train/chair_0584_normalised +chair/train/chair_0432_normalised +chair/train/chair_0573_normalised +chair/train/chair_0094_normalised +chair/train/chair_0842_normalised +chair/train/chair_0737_normalised +chair/train/chair_0367_normalised +chair/train/chair_0158_normalised +chair/train/chair_0296_normalised +chair/train/chair_0786_normalised +chair/train/chair_0538_normalised +chair/train/chair_0449_normalised +chair/train/chair_0219_normalised +chair/train/chair_0645_normalised +chair/train/chair_0707_normalised +chair/train/chair_0743_normalised +chair/train/chair_0022_normalised +chair/train/chair_0268_normalised +chair/train/chair_0686_normalised +chair/train/chair_0176_normalised +chair/train/chair_0239_normalised +chair/train/chair_0110_normalised +chair/train/chair_0633_normalised +chair/train/chair_0490_normalised +chair/train/chair_0126_normalised +chair/train/chair_0874_normalised +chair/train/chair_0780_normalised +chair/train/chair_0785_normalised +chair/train/chair_0563_normalised +chair/train/chair_0833_normalised +chair/train/chair_0614_normalised +chair/train/chair_0505_normalised +chair/train/chair_0843_normalised +chair/train/chair_0648_normalised +chair/train/chair_0331_normalised +chair/train/chair_0215_normalised +chair/train/chair_0544_normalised +chair/train/chair_0025_normalised +chair/train/chair_0856_normalised +chair/train/chair_0049_normalised +chair/train/chair_0631_normalised +chair/train/chair_0119_normalised +chair/train/chair_0888_normalised +chair/train/chair_0382_normalised +chair/train/chair_0395_normalised +chair/train/chair_0317_normalised +chair/train/chair_0846_normalised +chair/train/chair_0569_normalised +chair/train/chair_0726_normalised +chair/train/chair_0444_normalised +chair/train/chair_0696_normalised +chair/train/chair_0727_normalised +chair/train/chair_0810_normalised +chair/train/chair_0660_normalised +chair/train/chair_0381_normalised +chair/train/chair_0492_normalised +chair/train/chair_0002_normalised +chair/train/chair_0799_normalised +chair/train/chair_0173_normalised +chair/train/chair_0319_normalised +chair/train/chair_0409_normalised +chair/train/chair_0357_normalised +chair/train/chair_0621_normalised +chair/train/chair_0830_normalised +chair/train/chair_0679_normalised +chair/train/chair_0740_normalised +chair/train/chair_0202_normalised +chair/train/chair_0111_normalised +chair/train/chair_0284_normalised +chair/train/chair_0129_normalised +chair/train/chair_0032_normalised +chair/train/chair_0627_normalised +chair/train/chair_0498_normalised +chair/train/chair_0281_normalised +chair/train/chair_0497_normalised +chair/train/chair_0630_normalised +chair/train/chair_0311_normalised +chair/train/chair_0197_normalised +chair/train/chair_0878_normalised +chair/train/chair_0665_normalised +chair/train/chair_0115_normalised +chair/train/chair_0688_normalised +chair/train/chair_0375_normalised +chair/train/chair_0053_normalised +chair/train/chair_0055_normalised +chair/train/chair_0286_normalised +chair/train/chair_0585_normalised +chair/train/chair_0455_normalised +chair/train/chair_0828_normalised +chair/train/chair_0112_normalised +chair/train/chair_0716_normalised +chair/train/chair_0670_normalised +chair/train/chair_0247_normalised +chair/train/chair_0254_normalised +chair/train/chair_0769_normalised +chair/train/chair_0324_normalised +chair/train/chair_0873_normalised +chair/train/chair_0775_normalised +chair/train/chair_0586_normalised +chair/train/chair_0619_normalised +chair/train/chair_0559_normalised +chair/train/chair_0863_normalised +chair/train/chair_0293_normalised +chair/train/chair_0613_normalised +chair/train/chair_0831_normalised +chair/train/chair_0057_normalised +chair/train/chair_0736_normalised +chair/train/chair_0011_normalised +chair/train/chair_0759_normalised +chair/train/chair_0674_normalised +chair/train/chair_0642_normalised +chair/train/chair_0813_normalised +chair/train/chair_0034_normalised +chair/train/chair_0211_normalised +chair/train/chair_0570_normalised +chair/train/chair_0118_normalised +chair/train/chair_0675_normalised +chair/train/chair_0683_normalised +chair/train/chair_0553_normalised +chair/train/chair_0085_normalised +chair/train/chair_0462_normalised +chair/train/chair_0699_normalised +chair/train/chair_0138_normalised +chair/train/chair_0245_normalised +chair/train/chair_0052_normalised +chair/train/chair_0712_normalised +chair/train/chair_0697_normalised +chair/train/chair_0867_normalised +chair/train/chair_0596_normalised +chair/train/chair_0485_normalised +chair/train/chair_0257_normalised +chair/train/chair_0801_normalised +chair/train/chair_0693_normalised +chair/train/chair_0023_normalised +chair/train/chair_0731_normalised +chair/train/chair_0566_normalised +chair/train/chair_0194_normalised +chair/train/chair_0643_normalised +chair/train/chair_0325_normalised +chair/train/chair_0582_normalised +chair/train/chair_0814_normalised +chair/train/chair_0657_normalised +chair/train/chair_0075_normalised +chair/train/chair_0839_normalised +chair/train/chair_0652_normalised +chair/train/chair_0872_normalised +chair/train/chair_0605_normalised +chair/train/chair_0706_normalised +chair/train/chair_0739_normalised +chair/train/chair_0343_normalised +chair/train/chair_0542_normalised +chair/train/chair_0402_normalised +chair/train/chair_0764_normalised +chair/train/chair_0339_normalised +chair/train/chair_0267_normalised +chair/train/chair_0603_normalised +chair/train/chair_0547_normalised +chair/train/chair_0608_normalised +chair/train/chair_0040_normalised +chair/train/chair_0690_normalised +chair/train/chair_0132_normalised +chair/train/chair_0345_normalised +chair/train/chair_0107_normalised +chair/train/chair_0405_normalised +chair/train/chair_0064_normalised +chair/train/chair_0673_normalised +chair/train/chair_0749_normalised +chair/train/chair_0794_normalised +chair/train/chair_0871_normalised +chair/train/chair_0484_normalised +chair/train/chair_0413_normalised +chair/train/chair_0778_normalised +chair/train/chair_0385_normalised +chair/train/chair_0493_normalised +chair/train/chair_0571_normalised +chair/train/chair_0315_normalised +chair/train/chair_0041_normalised +chair/train/chair_0446_normalised +chair/train/chair_0350_normalised +chair/train/chair_0145_normalised +chair/train/chair_0705_normalised +chair/train/chair_0154_normalised +chair/train/chair_0363_normalised +chair/train/chair_0845_normalised +chair/train/chair_0230_normalised +chair/train/chair_0137_normalised +chair/train/chair_0200_normalised +chair/train/chair_0359_normalised +chair/train/chair_0478_normalised +chair/train/chair_0456_normalised +chair/train/chair_0182_normalised +chair/train/chair_0626_normalised +chair/train/chair_0576_normalised +chair/train/chair_0380_normalised +chair/train/chair_0772_normalised +chair/train/chair_0250_normalised +chair/train/chair_0487_normalised +chair/train/chair_0715_normalised +chair/train/chair_0224_normalised +chair/train/chair_0862_normalised +chair/train/chair_0300_normalised +chair/train/chair_0071_normalised +chair/train/chair_0864_normalised +chair/train/chair_0031_normalised +chair/train/chair_0599_normalised +chair/train/chair_0292_normalised +chair/train/chair_0805_normalised +chair/train/chair_0729_normalised +chair/train/chair_0283_normalised +chair/train/chair_0623_normalised +chair/train/chair_0166_normalised +chair/train/chair_0412_normalised +chair/train/chair_0763_normalised +chair/train/chair_0515_normalised +chair/train/chair_0125_normalised +chair/train/chair_0249_normalised +chair/train/chair_0709_normalised +chair/train/chair_0050_normalised +chair/train/chair_0664_normalised +chair/train/chair_0168_normalised +chair/train/chair_0725_normalised +chair/train/chair_0804_normalised +chair/train/chair_0364_normalised +chair/train/chair_0681_normalised +chair/train/chair_0021_normalised +chair/train/chair_0010_normalised +chair/train/chair_0765_normalised +chair/train/chair_0610_normalised +chair/train/chair_0165_normalised +chair/train/chair_0148_normalised +chair/train/chair_0356_normalised +chair/train/chair_0181_normalised +chair/train/chair_0682_normalised +chair/train/chair_0294_normalised +chair/train/chair_0059_normalised +chair/train/chair_0236_normalised +chair/train/chair_0275_normalised +chair/train/chair_0272_normalised +chair/train/chair_0330_normalised +chair/train/chair_0304_normalised +chair/train/chair_0718_normalised +chair/train/chair_0136_normalised +chair/train/chair_0301_normalised +chair/train/chair_0407_normalised +chair/train/chair_0406_normalised +chair/train/chair_0476_normalised +chair/train/chair_0650_normalised +chair/train/chair_0321_normalised +chair/train/chair_0777_normalised +chair/test/chair_0916_normalised +chair/test/chair_0900_normalised +chair/test/chair_0984_normalised +chair/test/chair_0983_normalised +chair/test/chair_0937_normalised +chair/test/chair_0964_normalised +chair/test/chair_0914_normalised +chair/test/chair_0891_normalised +chair/test/chair_0976_normalised +chair/test/chair_0910_normalised +chair/test/chair_0924_normalised +chair/test/chair_0929_normalised +chair/test/chair_0930_normalised +chair/test/chair_0949_normalised +chair/test/chair_0927_normalised +chair/test/chair_0911_normalised +chair/test/chair_0973_normalised +chair/test/chair_0987_normalised +chair/test/chair_0915_normalised +chair/test/chair_0902_normalised +chair/test/chair_0942_normalised +chair/test/chair_0953_normalised +chair/test/chair_0892_normalised +chair/test/chair_0969_normalised +chair/test/chair_0962_normalised +chair/test/chair_0977_normalised +chair/test/chair_0982_normalised +chair/test/chair_0901_normalised +chair/test/chair_0960_normalised +chair/test/chair_0957_normalised +chair/test/chair_0978_normalised +chair/test/chair_0904_normalised +chair/test/chair_0968_normalised +chair/test/chair_0913_normalised +chair/test/chair_0938_normalised +chair/test/chair_0945_normalised +chair/test/chair_0925_normalised +chair/test/chair_0931_normalised +chair/test/chair_0988_normalised +chair/test/chair_0932_normalised +chair/test/chair_0897_normalised +chair/test/chair_0941_normalised +chair/test/chair_0975_normalised +chair/test/chair_0952_normalised +chair/test/chair_0919_normalised +chair/test/chair_0922_normalised +chair/test/chair_0917_normalised +chair/test/chair_0940_normalised +chair/test/chair_0943_normalised +chair/test/chair_0906_normalised +chair/test/chair_0989_normalised +chair/test/chair_0944_normalised +chair/test/chair_0903_normalised +chair/test/chair_0979_normalised +chair/test/chair_0939_normalised +chair/test/chair_0933_normalised +chair/test/chair_0980_normalised +chair/test/chair_0967_normalised +chair/test/chair_0965_normalised +chair/test/chair_0986_normalised +chair/test/chair_0934_normalised +chair/test/chair_0890_normalised +chair/test/chair_0955_normalised +chair/test/chair_0966_normalised +chair/test/chair_0895_normalised +chair/test/chair_0899_normalised +chair/test/chair_0896_normalised +chair/test/chair_0981_normalised +chair/test/chair_0971_normalised +chair/test/chair_0926_normalised +chair/test/chair_0909_normalised +chair/test/chair_0970_normalised +chair/test/chair_0920_normalised +chair/test/chair_0961_normalised +chair/test/chair_0921_normalised +chair/test/chair_0948_normalised +chair/test/chair_0908_normalised +chair/test/chair_0898_normalised +chair/test/chair_0905_normalised +chair/test/chair_0918_normalised +chair/test/chair_0985_normalised +chair/test/chair_0972_normalised +chair/test/chair_0935_normalised +chair/test/chair_0958_normalised +chair/test/chair_0946_normalised +chair/test/chair_0907_normalised +chair/test/chair_0936_normalised +chair/test/chair_0923_normalised +chair/test/chair_0959_normalised +chair/test/chair_0963_normalised +chair/test/chair_0893_normalised +chair/test/chair_0947_normalised +chair/test/chair_0954_normalised +chair/test/chair_0956_normalised +chair/test/chair_0951_normalised +chair/test/chair_0912_normalised +chair/test/chair_0950_normalised +chair/test/chair_0974_normalised +chair/test/chair_0928_normalised +chair/test/chair_0894_normalised +flower_pot/train/flower_pot_0089_normalised +flower_pot/train/flower_pot_0101_normalised +flower_pot/train/flower_pot_0030_normalised +flower_pot/train/flower_pot_0145_normalised +flower_pot/train/flower_pot_0116_normalised +flower_pot/train/flower_pot_0091_normalised +flower_pot/train/flower_pot_0029_normalised +flower_pot/train/flower_pot_0141_normalised +flower_pot/train/flower_pot_0121_normalised +flower_pot/train/flower_pot_0069_normalised +flower_pot/train/flower_pot_0045_normalised +flower_pot/train/flower_pot_0126_normalised +flower_pot/train/flower_pot_0084_normalised +flower_pot/train/flower_pot_0088_normalised +flower_pot/train/flower_pot_0100_normalised +flower_pot/train/flower_pot_0093_normalised +flower_pot/train/flower_pot_0010_normalised +flower_pot/train/flower_pot_0044_normalised +flower_pot/train/flower_pot_0039_normalised +flower_pot/train/flower_pot_0122_normalised +flower_pot/train/flower_pot_0078_normalised +flower_pot/train/flower_pot_0142_normalised +flower_pot/train/flower_pot_0017_normalised +flower_pot/train/flower_pot_0066_normalised +flower_pot/train/flower_pot_0071_normalised +flower_pot/train/flower_pot_0132_normalised +flower_pot/train/flower_pot_0027_normalised +flower_pot/train/flower_pot_0092_normalised +flower_pot/train/flower_pot_0035_normalised +flower_pot/train/flower_pot_0009_normalised +flower_pot/train/flower_pot_0137_normalised +flower_pot/train/flower_pot_0083_normalised +flower_pot/train/flower_pot_0001_normalised +flower_pot/train/flower_pot_0149_normalised +flower_pot/train/flower_pot_0085_normalised +flower_pot/train/flower_pot_0086_normalised +flower_pot/train/flower_pot_0074_normalised +flower_pot/train/flower_pot_0038_normalised +flower_pot/train/flower_pot_0081_normalised +flower_pot/train/flower_pot_0131_normalised +flower_pot/train/flower_pot_0063_normalised +flower_pot/train/flower_pot_0095_normalised +flower_pot/train/flower_pot_0065_normalised +flower_pot/train/flower_pot_0060_normalised +flower_pot/train/flower_pot_0013_normalised +flower_pot/train/flower_pot_0053_normalised +flower_pot/train/flower_pot_0068_normalised +flower_pot/train/flower_pot_0124_normalised +flower_pot/train/flower_pot_0052_normalised +flower_pot/train/flower_pot_0070_normalised +flower_pot/train/flower_pot_0006_normalised +flower_pot/train/flower_pot_0075_normalised +flower_pot/train/flower_pot_0087_normalised +flower_pot/train/flower_pot_0096_normalised +flower_pot/train/flower_pot_0080_normalised +flower_pot/train/flower_pot_0057_normalised +flower_pot/train/flower_pot_0012_normalised +flower_pot/train/flower_pot_0133_normalised +flower_pot/train/flower_pot_0072_normalised +flower_pot/train/flower_pot_0011_normalised +flower_pot/train/flower_pot_0105_normalised +flower_pot/train/flower_pot_0028_normalised +flower_pot/train/flower_pot_0008_normalised +flower_pot/train/flower_pot_0062_normalised +flower_pot/train/flower_pot_0049_normalised +flower_pot/train/flower_pot_0021_normalised +flower_pot/train/flower_pot_0031_normalised +flower_pot/train/flower_pot_0090_normalised +flower_pot/train/flower_pot_0067_normalised +flower_pot/train/flower_pot_0102_normalised +flower_pot/train/flower_pot_0033_normalised +flower_pot/train/flower_pot_0016_normalised +flower_pot/train/flower_pot_0111_normalised +flower_pot/train/flower_pot_0043_normalised +flower_pot/train/flower_pot_0004_normalised +flower_pot/train/flower_pot_0002_normalised +flower_pot/train/flower_pot_0104_normalised +flower_pot/train/flower_pot_0019_normalised +flower_pot/train/flower_pot_0036_normalised +flower_pot/train/flower_pot_0128_normalised +flower_pot/train/flower_pot_0056_normalised +flower_pot/train/flower_pot_0115_normalised +flower_pot/train/flower_pot_0106_normalised +flower_pot/train/flower_pot_0134_normalised +flower_pot/train/flower_pot_0146_normalised +flower_pot/train/flower_pot_0144_normalised +flower_pot/train/flower_pot_0003_normalised +flower_pot/train/flower_pot_0079_normalised +flower_pot/train/flower_pot_0048_normalised +flower_pot/train/flower_pot_0034_normalised +flower_pot/train/flower_pot_0107_normalised +flower_pot/train/flower_pot_0059_normalised +flower_pot/train/flower_pot_0007_normalised +flower_pot/train/flower_pot_0076_normalised +flower_pot/train/flower_pot_0136_normalised +flower_pot/train/flower_pot_0051_normalised +flower_pot/train/flower_pot_0098_normalised +flower_pot/train/flower_pot_0118_normalised +flower_pot/train/flower_pot_0073_normalised +flower_pot/train/flower_pot_0108_normalised +flower_pot/train/flower_pot_0109_normalised +flower_pot/train/flower_pot_0129_normalised +flower_pot/train/flower_pot_0050_normalised +flower_pot/train/flower_pot_0026_normalised +flower_pot/train/flower_pot_0112_normalised +flower_pot/train/flower_pot_0018_normalised +flower_pot/train/flower_pot_0041_normalised +flower_pot/train/flower_pot_0140_normalised +flower_pot/train/flower_pot_0054_normalised +flower_pot/train/flower_pot_0032_normalised +flower_pot/train/flower_pot_0061_normalised +flower_pot/train/flower_pot_0135_normalised +flower_pot/train/flower_pot_0046_normalised +flower_pot/train/flower_pot_0103_normalised +flower_pot/train/flower_pot_0082_normalised +flower_pot/train/flower_pot_0024_normalised +flower_pot/train/flower_pot_0025_normalised +flower_pot/train/flower_pot_0120_normalised +flower_pot/train/flower_pot_0097_normalised +flower_pot/train/flower_pot_0014_normalised +flower_pot/train/flower_pot_0119_normalised +flower_pot/train/flower_pot_0015_normalised +flower_pot/train/flower_pot_0147_normalised +flower_pot/train/flower_pot_0148_normalised +flower_pot/train/flower_pot_0064_normalised +flower_pot/train/flower_pot_0055_normalised +flower_pot/train/flower_pot_0099_normalised +flower_pot/train/flower_pot_0094_normalised +flower_pot/train/flower_pot_0127_normalised +flower_pot/train/flower_pot_0139_normalised +flower_pot/train/flower_pot_0040_normalised +flower_pot/train/flower_pot_0138_normalised +flower_pot/train/flower_pot_0113_normalised +flower_pot/train/flower_pot_0077_normalised +flower_pot/train/flower_pot_0058_normalised +flower_pot/train/flower_pot_0117_normalised +flower_pot/train/flower_pot_0005_normalised +flower_pot/train/flower_pot_0037_normalised +flower_pot/train/flower_pot_0110_normalised +flower_pot/train/flower_pot_0125_normalised +flower_pot/train/flower_pot_0020_normalised +flower_pot/train/flower_pot_0123_normalised +flower_pot/train/flower_pot_0047_normalised +flower_pot/train/flower_pot_0143_normalised +flower_pot/train/flower_pot_0042_normalised +flower_pot/train/flower_pot_0114_normalised +flower_pot/train/flower_pot_0023_normalised +flower_pot/train/flower_pot_0022_normalised +flower_pot/train/flower_pot_0130_normalised +flower_pot/test/flower_pot_0156_normalised +flower_pot/test/flower_pot_0157_normalised +flower_pot/test/flower_pot_0166_normalised +flower_pot/test/flower_pot_0160_normalised +flower_pot/test/flower_pot_0161_normalised +flower_pot/test/flower_pot_0154_normalised +flower_pot/test/flower_pot_0151_normalised +flower_pot/test/flower_pot_0163_normalised +flower_pot/test/flower_pot_0165_normalised +flower_pot/test/flower_pot_0164_normalised +flower_pot/test/flower_pot_0150_normalised +flower_pot/test/flower_pot_0155_normalised +flower_pot/test/flower_pot_0168_normalised +flower_pot/test/flower_pot_0167_normalised +flower_pot/test/flower_pot_0169_normalised +flower_pot/test/flower_pot_0153_normalised +flower_pot/test/flower_pot_0158_normalised +flower_pot/test/flower_pot_0159_normalised +flower_pot/test/flower_pot_0162_normalised +flower_pot/test/flower_pot_0152_normalised +toilet/train/toilet_0209_normalised +toilet/train/toilet_0081_normalised +toilet/train/toilet_0181_normalised +toilet/train/toilet_0095_normalised +toilet/train/toilet_0032_normalised +toilet/train/toilet_0062_normalised +toilet/train/toilet_0106_normalised +toilet/train/toilet_0094_normalised +toilet/train/toilet_0053_normalised +toilet/train/toilet_0282_normalised +toilet/train/toilet_0025_normalised +toilet/train/toilet_0242_normalised +toilet/train/toilet_0196_normalised +toilet/train/toilet_0015_normalised +toilet/train/toilet_0008_normalised +toilet/train/toilet_0140_normalised +toilet/train/toilet_0195_normalised +toilet/train/toilet_0299_normalised +toilet/train/toilet_0250_normalised +toilet/train/toilet_0215_normalised +toilet/train/toilet_0076_normalised +toilet/train/toilet_0338_normalised +toilet/train/toilet_0017_normalised +toilet/train/toilet_0026_normalised +toilet/train/toilet_0084_normalised +toilet/train/toilet_0126_normalised +toilet/train/toilet_0247_normalised +toilet/train/toilet_0079_normalised +toilet/train/toilet_0306_normalised +toilet/train/toilet_0231_normalised +toilet/train/toilet_0204_normalised +toilet/train/toilet_0260_normalised +toilet/train/toilet_0336_normalised +toilet/train/toilet_0002_normalised +toilet/train/toilet_0030_normalised +toilet/train/toilet_0009_normalised +toilet/train/toilet_0125_normalised +toilet/train/toilet_0280_normalised +toilet/train/toilet_0266_normalised +toilet/train/toilet_0274_normalised +toilet/train/toilet_0043_normalised +toilet/train/toilet_0185_normalised +toilet/train/toilet_0326_normalised +toilet/train/toilet_0277_normalised +toilet/train/toilet_0292_normalised +toilet/train/toilet_0310_normalised +toilet/train/toilet_0198_normalised +toilet/train/toilet_0205_normalised +toilet/train/toilet_0093_normalised +toilet/train/toilet_0138_normalised +toilet/train/toilet_0044_normalised +toilet/train/toilet_0199_normalised +toilet/train/toilet_0163_normalised +toilet/train/toilet_0201_normalised +toilet/train/toilet_0295_normalised +toilet/train/toilet_0089_normalised +toilet/train/toilet_0134_normalised +toilet/train/toilet_0021_normalised +toilet/train/toilet_0234_normalised +toilet/train/toilet_0080_normalised +toilet/train/toilet_0165_normalised +toilet/train/toilet_0133_normalised +toilet/train/toilet_0272_normalised +toilet/train/toilet_0171_normalised +toilet/train/toilet_0259_normalised +toilet/train/toilet_0136_normalised +toilet/train/toilet_0064_normalised +toilet/train/toilet_0186_normalised +toilet/train/toilet_0283_normalised +toilet/train/toilet_0323_normalised +toilet/train/toilet_0219_normalised +toilet/train/toilet_0342_normalised +toilet/train/toilet_0311_normalised +toilet/train/toilet_0039_normalised +toilet/train/toilet_0168_normalised +toilet/train/toilet_0031_normalised +toilet/train/toilet_0013_normalised +toilet/train/toilet_0285_normalised +toilet/train/toilet_0246_normalised +toilet/train/toilet_0343_normalised +toilet/train/toilet_0091_normalised +toilet/train/toilet_0287_normalised +toilet/train/toilet_0249_normalised +toilet/train/toilet_0301_normalised +toilet/train/toilet_0257_normalised +toilet/train/toilet_0232_normalised +toilet/train/toilet_0069_normalised +toilet/train/toilet_0220_normalised +toilet/train/toilet_0121_normalised +toilet/train/toilet_0010_normalised +toilet/train/toilet_0120_normalised +toilet/train/toilet_0300_normalised +toilet/train/toilet_0038_normalised +toilet/train/toilet_0238_normalised +toilet/train/toilet_0308_normalised +toilet/train/toilet_0154_normalised +toilet/train/toilet_0132_normalised +toilet/train/toilet_0035_normalised +toilet/train/toilet_0214_normalised +toilet/train/toilet_0271_normalised +toilet/train/toilet_0221_normalised +toilet/train/toilet_0110_normalised +toilet/train/toilet_0122_normalised +toilet/train/toilet_0131_normalised +toilet/train/toilet_0243_normalised +toilet/train/toilet_0335_normalised +toilet/train/toilet_0296_normalised +toilet/train/toilet_0135_normalised +toilet/train/toilet_0114_normalised +toilet/train/toilet_0085_normalised +toilet/train/toilet_0078_normalised +toilet/train/toilet_0083_normalised +toilet/train/toilet_0222_normalised +toilet/train/toilet_0048_normalised +toilet/train/toilet_0228_normalised +toilet/train/toilet_0029_normalised +toilet/train/toilet_0184_normalised +toilet/train/toilet_0158_normalised +toilet/train/toilet_0146_normalised +toilet/train/toilet_0004_normalised +toilet/train/toilet_0202_normalised +toilet/train/toilet_0318_normalised +toilet/train/toilet_0177_normalised +toilet/train/toilet_0203_normalised +toilet/train/toilet_0067_normalised +toilet/train/toilet_0124_normalised +toilet/train/toilet_0273_normalised +toilet/train/toilet_0019_normalised +toilet/train/toilet_0276_normalised +toilet/train/toilet_0049_normalised +toilet/train/toilet_0041_normalised +toilet/train/toilet_0328_normalised +toilet/train/toilet_0190_normalised +toilet/train/toilet_0057_normalised +toilet/train/toilet_0099_normalised +toilet/train/toilet_0332_normalised +toilet/train/toilet_0111_normalised +toilet/train/toilet_0016_normalised +toilet/train/toilet_0291_normalised +toilet/train/toilet_0001_normalised +toilet/train/toilet_0262_normalised +toilet/train/toilet_0334_normalised +toilet/train/toilet_0224_normalised +toilet/train/toilet_0327_normalised +toilet/train/toilet_0223_normalised +toilet/train/toilet_0156_normalised +toilet/train/toilet_0073_normalised +toilet/train/toilet_0147_normalised +toilet/train/toilet_0155_normalised +toilet/train/toilet_0101_normalised +toilet/train/toilet_0269_normalised +toilet/train/toilet_0312_normalised +toilet/train/toilet_0261_normalised +toilet/train/toilet_0022_normalised +toilet/train/toilet_0108_normalised +toilet/train/toilet_0118_normalised +toilet/train/toilet_0197_normalised +toilet/train/toilet_0317_normalised +toilet/train/toilet_0339_normalised +toilet/train/toilet_0173_normalised +toilet/train/toilet_0281_normalised +toilet/train/toilet_0096_normalised +toilet/train/toilet_0244_normalised +toilet/train/toilet_0104_normalised +toilet/train/toilet_0023_normalised +toilet/train/toilet_0191_normalised +toilet/train/toilet_0127_normalised +toilet/train/toilet_0005_normalised +toilet/train/toilet_0183_normalised +toilet/train/toilet_0063_normalised +toilet/train/toilet_0256_normalised +toilet/train/toilet_0105_normalised +toilet/train/toilet_0059_normalised +toilet/train/toilet_0254_normalised +toilet/train/toilet_0267_normalised +toilet/train/toilet_0047_normalised +toilet/train/toilet_0123_normalised +toilet/train/toilet_0268_normalised +toilet/train/toilet_0098_normalised +toilet/train/toilet_0248_normalised +toilet/train/toilet_0208_normalised +toilet/train/toilet_0143_normalised +toilet/train/toilet_0322_normalised +toilet/train/toilet_0279_normalised +toilet/train/toilet_0264_normalised +toilet/train/toilet_0068_normalised +toilet/train/toilet_0187_normalised +toilet/train/toilet_0040_normalised +toilet/train/toilet_0193_normalised +toilet/train/toilet_0192_normalised +toilet/train/toilet_0340_normalised +toilet/train/toilet_0011_normalised +toilet/train/toilet_0075_normalised +toilet/train/toilet_0227_normalised +toilet/train/toilet_0066_normalised +toilet/train/toilet_0152_normalised +toilet/train/toilet_0252_normalised +toilet/train/toilet_0284_normalised +toilet/train/toilet_0229_normalised +toilet/train/toilet_0046_normalised +toilet/train/toilet_0129_normalised +toilet/train/toilet_0236_normalised +toilet/train/toilet_0082_normalised +toilet/train/toilet_0178_normalised +toilet/train/toilet_0074_normalised +toilet/train/toilet_0302_normalised +toilet/train/toilet_0225_normalised +toilet/train/toilet_0012_normalised +toilet/train/toilet_0052_normalised +toilet/train/toilet_0130_normalised +toilet/train/toilet_0309_normalised +toilet/train/toilet_0325_normalised +toilet/train/toilet_0018_normalised +toilet/train/toilet_0321_normalised +toilet/train/toilet_0003_normalised +toilet/train/toilet_0241_normalised +toilet/train/toilet_0112_normalised +toilet/train/toilet_0344_normalised +toilet/train/toilet_0270_normalised +toilet/train/toilet_0115_normalised +toilet/train/toilet_0113_normalised +toilet/train/toilet_0139_normalised +toilet/train/toilet_0167_normalised +toilet/train/toilet_0037_normalised +toilet/train/toilet_0330_normalised +toilet/train/toilet_0055_normalised +toilet/train/toilet_0313_normalised +toilet/train/toilet_0045_normalised +toilet/train/toilet_0086_normalised +toilet/train/toilet_0278_normalised +toilet/train/toilet_0007_normalised +toilet/train/toilet_0027_normalised +toilet/train/toilet_0151_normalised +toilet/train/toilet_0307_normalised +toilet/train/toilet_0297_normalised +toilet/train/toilet_0251_normalised +toilet/train/toilet_0294_normalised +toilet/train/toilet_0150_normalised +toilet/train/toilet_0090_normalised +toilet/train/toilet_0207_normalised +toilet/train/toilet_0157_normalised +toilet/train/toilet_0071_normalised +toilet/train/toilet_0200_normalised +toilet/train/toilet_0148_normalised +toilet/train/toilet_0162_normalised +toilet/train/toilet_0117_normalised +toilet/train/toilet_0051_normalised +toilet/train/toilet_0142_normalised +toilet/train/toilet_0233_normalised +toilet/train/toilet_0235_normalised +toilet/train/toilet_0164_normalised +toilet/train/toilet_0304_normalised +toilet/train/toilet_0119_normalised +toilet/train/toilet_0329_normalised +toilet/train/toilet_0216_normalised +toilet/train/toilet_0175_normalised +toilet/train/toilet_0288_normalised +toilet/train/toilet_0237_normalised +toilet/train/toilet_0170_normalised +toilet/train/toilet_0060_normalised +toilet/train/toilet_0240_normalised +toilet/train/toilet_0206_normalised +toilet/train/toilet_0218_normalised +toilet/train/toilet_0303_normalised +toilet/train/toilet_0182_normalised +toilet/train/toilet_0042_normalised +toilet/train/toilet_0161_normalised +toilet/train/toilet_0103_normalised +toilet/train/toilet_0239_normalised +toilet/train/toilet_0159_normalised +toilet/train/toilet_0166_normalised +toilet/train/toilet_0128_normalised +toilet/train/toilet_0070_normalised +toilet/train/toilet_0341_normalised +toilet/train/toilet_0314_normalised +toilet/train/toilet_0061_normalised +toilet/train/toilet_0109_normalised +toilet/train/toilet_0006_normalised +toilet/train/toilet_0265_normalised +toilet/train/toilet_0100_normalised +toilet/train/toilet_0324_normalised +toilet/train/toilet_0333_normalised +toilet/train/toilet_0107_normalised +toilet/train/toilet_0050_normalised +toilet/train/toilet_0315_normalised +toilet/train/toilet_0092_normalised +toilet/train/toilet_0054_normalised +toilet/train/toilet_0174_normalised +toilet/train/toilet_0213_normalised +toilet/train/toilet_0065_normalised +toilet/train/toilet_0145_normalised +toilet/train/toilet_0144_normalised +toilet/train/toilet_0097_normalised +toilet/train/toilet_0275_normalised +toilet/train/toilet_0217_normalised +toilet/train/toilet_0180_normalised +toilet/train/toilet_0149_normalised +toilet/train/toilet_0289_normalised +toilet/train/toilet_0088_normalised +toilet/train/toilet_0172_normalised +toilet/train/toilet_0160_normalised +toilet/train/toilet_0188_normalised +toilet/train/toilet_0316_normalised +toilet/train/toilet_0226_normalised +toilet/train/toilet_0058_normalised +toilet/train/toilet_0102_normalised +toilet/train/toilet_0293_normalised +toilet/train/toilet_0153_normalised +toilet/train/toilet_0255_normalised +toilet/train/toilet_0056_normalised +toilet/train/toilet_0212_normalised +toilet/train/toilet_0298_normalised +toilet/train/toilet_0141_normalised +toilet/train/toilet_0211_normalised +toilet/train/toilet_0286_normalised +toilet/train/toilet_0014_normalised +toilet/train/toilet_0320_normalised +toilet/train/toilet_0169_normalised +toilet/train/toilet_0036_normalised +toilet/train/toilet_0258_normalised +toilet/train/toilet_0137_normalised +toilet/train/toilet_0072_normalised +toilet/train/toilet_0331_normalised +toilet/train/toilet_0263_normalised +toilet/train/toilet_0305_normalised +toilet/train/toilet_0245_normalised +toilet/train/toilet_0230_normalised +toilet/train/toilet_0028_normalised +toilet/train/toilet_0116_normalised +toilet/train/toilet_0087_normalised +toilet/train/toilet_0290_normalised +toilet/train/toilet_0337_normalised +toilet/train/toilet_0034_normalised +toilet/train/toilet_0077_normalised +toilet/train/toilet_0210_normalised +toilet/train/toilet_0179_normalised +toilet/train/toilet_0020_normalised +toilet/train/toilet_0194_normalised +toilet/train/toilet_0024_normalised +toilet/train/toilet_0176_normalised +toilet/train/toilet_0189_normalised +toilet/train/toilet_0253_normalised +toilet/train/toilet_0033_normalised +toilet/train/toilet_0319_normalised +toilet/test/toilet_0356_normalised +toilet/test/toilet_0413_normalised +toilet/test/toilet_0371_normalised +toilet/test/toilet_0443_normalised +toilet/test/toilet_0367_normalised +toilet/test/toilet_0349_normalised +toilet/test/toilet_0385_normalised +toilet/test/toilet_0392_normalised +toilet/test/toilet_0399_normalised +toilet/test/toilet_0429_normalised +toilet/test/toilet_0387_normalised +toilet/test/toilet_0420_normalised +toilet/test/toilet_0375_normalised +toilet/test/toilet_0434_normalised +toilet/test/toilet_0351_normalised +toilet/test/toilet_0421_normalised +toilet/test/toilet_0400_normalised +toilet/test/toilet_0440_normalised +toilet/test/toilet_0398_normalised +toilet/test/toilet_0396_normalised +toilet/test/toilet_0354_normalised +toilet/test/toilet_0384_normalised +toilet/test/toilet_0386_normalised +toilet/test/toilet_0353_normalised +toilet/test/toilet_0373_normalised +toilet/test/toilet_0405_normalised +toilet/test/toilet_0347_normalised +toilet/test/toilet_0428_normalised +toilet/test/toilet_0411_normalised +toilet/test/toilet_0412_normalised +toilet/test/toilet_0408_normalised +toilet/test/toilet_0391_normalised +toilet/test/toilet_0401_normalised +toilet/test/toilet_0381_normalised +toilet/test/toilet_0403_normalised +toilet/test/toilet_0383_normalised +toilet/test/toilet_0346_normalised +toilet/test/toilet_0423_normalised +toilet/test/toilet_0389_normalised +toilet/test/toilet_0404_normalised +toilet/test/toilet_0406_normalised +toilet/test/toilet_0431_normalised +toilet/test/toilet_0433_normalised +toilet/test/toilet_0418_normalised +toilet/test/toilet_0361_normalised +toilet/test/toilet_0363_normalised +toilet/test/toilet_0415_normalised +toilet/test/toilet_0382_normalised +toilet/test/toilet_0388_normalised +toilet/test/toilet_0365_normalised +toilet/test/toilet_0416_normalised +toilet/test/toilet_0379_normalised +toilet/test/toilet_0393_normalised +toilet/test/toilet_0424_normalised +toilet/test/toilet_0369_normalised +toilet/test/toilet_0394_normalised +toilet/test/toilet_0390_normalised +toilet/test/toilet_0422_normalised +toilet/test/toilet_0380_normalised +toilet/test/toilet_0439_normalised +toilet/test/toilet_0402_normalised +toilet/test/toilet_0368_normalised +toilet/test/toilet_0364_normalised +toilet/test/toilet_0426_normalised +toilet/test/toilet_0410_normalised +toilet/test/toilet_0430_normalised +toilet/test/toilet_0414_normalised +toilet/test/toilet_0427_normalised +toilet/test/toilet_0348_normalised +toilet/test/toilet_0359_normalised +toilet/test/toilet_0419_normalised +toilet/test/toilet_0438_normalised +toilet/test/toilet_0425_normalised +toilet/test/toilet_0358_normalised +toilet/test/toilet_0352_normalised +toilet/test/toilet_0374_normalised +toilet/test/toilet_0417_normalised +toilet/test/toilet_0357_normalised +toilet/test/toilet_0362_normalised +toilet/test/toilet_0436_normalised +toilet/test/toilet_0370_normalised +toilet/test/toilet_0407_normalised +toilet/test/toilet_0376_normalised +toilet/test/toilet_0366_normalised +toilet/test/toilet_0442_normalised +toilet/test/toilet_0437_normalised +toilet/test/toilet_0409_normalised +toilet/test/toilet_0372_normalised +toilet/test/toilet_0360_normalised +toilet/test/toilet_0432_normalised +toilet/test/toilet_0345_normalised +toilet/test/toilet_0350_normalised +toilet/test/toilet_0441_normalised +toilet/test/toilet_0444_normalised +toilet/test/toilet_0355_normalised +toilet/test/toilet_0397_normalised +toilet/test/toilet_0435_normalised +toilet/test/toilet_0378_normalised +toilet/test/toilet_0395_normalised +toilet/test/toilet_0377_normalised diff --git a/zoo/OcCo/render/PC_Normalisation.py b/zoo/OcCo/render/PC_Normalisation.py new file mode 100644 index 0000000..0a9f5b9 --- /dev/null +++ b/zoo/OcCo/render/PC_Normalisation.py @@ -0,0 +1,23 @@ +# Copyright (c) 2020. Hanchen Wang, hw501@cam.ac.uk + +import os, open3d, numpy as np + +File_ = open('ModelNet_flist_short.txt', 'w') + +if __name__ == "__main__": + root_dir = "../data/ModelNet_subset/" + + for root, dirs, files in os.walk(root_dir, topdown=False): + for file in files: + if '.ply' in file: + amesh = open3d.io.read_triangle_mesh(os.path.join(root, file)) + out_file_name = os.path.join(root, file).replace('.ply', '_normalised.obj') + + center = amesh.get_center() + amesh.translate(-center) + maxR = (np.asarray(amesh.vertices)**2).sum(axis=1).max()**(1/2) + # we found divided by (2*maxR) has best rendered visualisation results + amesh.scale(1/(2*maxR)) + open3d.io.write_triangle_mesh(out_file_name, amesh) + File_.writelines(out_file_name.replace('.obj', '').replace(root_dir, '') + '\n') + print(out_file_name) diff --git a/zoo/OcCo/render/buffer.png b/zoo/OcCo/render/buffer.png new file mode 100644 index 0000000..5a8d011 Binary files /dev/null and b/zoo/OcCo/render/buffer.png differ diff --git a/zoo/OcCo/render/readme.md b/zoo/OcCo/render/readme.md new file mode 100644 index 0000000..8322996 --- /dev/null +++ b/zoo/OcCo/render/readme.md @@ -0,0 +1,42 @@ +This directory contains code that generates partial point clouds objects. + +To start with: + +1. Download and Install [Blender](https://blender.org/download/) + +2. Create a list of normalized 3D objects to be rendered, which should be in `.obj` format, we provide `ModelNet_Flist.txt`. as a template. We also provide PC_Normalisation.py for normalization. + +3. To generate the rendered depth image from 3d objects (you might need to install a few more supportive packages, i.e. `Imath, OpenEXR`, due to the differences in the development environments) + + ```bash + # blender -b -P Depth_Renderer.py [data directory] [file list] [output directory] [num scans per model] + + blender -b -P render_depth.py ../data/modelnet40 ModelNet_Flist.txt ./dump 10 + ``` + + The generated intermediate files are in OpenEXR format (`*.exr`). You can also modify the intrinsics of the camera model in Depth_Renderer.py, which will be automatically saved in the `intrinsics.txt`. + +4. To re-project the partial occluded point cloud from the depth image: + + ```Β bash + python EXR_Process.py \ + --list_file ModelNet_Flist.txt \ + --intrinsics intrinsics.txt \ + --output_dir ./dump \ + --num_scans 10 ; + ``` + + This will convert the `*.exr` files into depth images (`*.png`) then point clouds (`*.pcd`) + +5. Now use OcCo_Torch/utils/LMDB_Writer.py to convert all the `pcd` files into `lmdb` dataloader: + + ```bash + python LMDB_Writer.py \ + --list_path ../render/ModelNet_Flist.txt \ + --complete_dir ../data/modelnet40 \ + --partial_dir ../render/dump/pcd \ + --num_scans 10 \ + --output_file ../data/MyTrain.lmdb ; + ``` + +6. Now you can pre-train the models via OcCo on your own constructed data, enjoy :) diff --git a/zoo/OcCo/sample/CMakeLists.txt b/zoo/OcCo/sample/CMakeLists.txt new file mode 100644 index 0000000..d7f9b62 --- /dev/null +++ b/zoo/OcCo/sample/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +project(mesh_sampling) + +find_package(PCL 1.7 REQUIRED) +include_directories(${PCL_INCLUDE_DIRS}) +link_directories(${PCL_LIBRARY_DIRS}) +add_definitions(${PCL_DEFINITIONS}) + +find_package(VTK 7.0 REQUIRED) +include(${VTK_USE_FILE}) + +add_executable (mesh_sampling mesh_sampling.cpp) +target_link_libraries (mesh_sampling ${PCL_LIBRARIES} ${VTK_LIBRARIES}) diff --git a/zoo/OcCo/sample/mesh_sampling.cpp b/zoo/OcCo/sample/mesh_sampling.cpp new file mode 100644 index 0000000..c168905 --- /dev/null +++ b/zoo/OcCo/sample/mesh_sampling.cpp @@ -0,0 +1,298 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2010-2011, Willow Garage, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder(s) nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Modified by Wentao Yuan (wyuan1@cs.cmu.edu) 05/31/2018 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +inline double +uniform_deviate (int seed) +{ + double ran = seed * (1.0 / (RAND_MAX + 1.0)); + return ran; +} + +inline void +randomPointTriangle (float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3, + Eigen::Vector4f& p) +{ + float r1 = static_cast (uniform_deviate (rand ())); + float r2 = static_cast (uniform_deviate (rand ())); + float r1sqr = std::sqrt (r1); + float OneMinR1Sqr = (1 - r1sqr); + float OneMinR2 = (1 - r2); + a1 *= OneMinR1Sqr; + a2 *= OneMinR1Sqr; + a3 *= OneMinR1Sqr; + b1 *= OneMinR2; + b2 *= OneMinR2; + b3 *= OneMinR2; + c1 = r1sqr * (r2 * c1 + b1) + a1; + c2 = r1sqr * (r2 * c2 + b2) + a2; + c3 = r1sqr * (r2 * c3 + b3) + a3; + p[0] = c1; + p[1] = c2; + p[2] = c3; + p[3] = 0; +} + +inline void +randPSurface (vtkPolyData * polydata, std::vector * cumulativeAreas, double totalArea, Eigen::Vector4f& p, bool calcNormal, Eigen::Vector3f& n) +{ + float r = static_cast (uniform_deviate (rand ()) * totalArea); + + std::vector::iterator low = std::lower_bound (cumulativeAreas->begin (), cumulativeAreas->end (), r); + vtkIdType el = vtkIdType (low - cumulativeAreas->begin ()); + + double A[3], B[3], C[3]; + vtkIdType npts = 0; + vtkIdType *ptIds = NULL; + polydata->GetCellPoints (el, npts, ptIds); + polydata->GetPoint (ptIds[0], A); + polydata->GetPoint (ptIds[1], B); + polydata->GetPoint (ptIds[2], C); + if (calcNormal) + { + // OBJ: Vertices are stored in a counter-clockwise order by default + Eigen::Vector3f v1 = Eigen::Vector3f (A[0], A[1], A[2]) - Eigen::Vector3f (C[0], C[1], C[2]); + Eigen::Vector3f v2 = Eigen::Vector3f (B[0], B[1], B[2]) - Eigen::Vector3f (C[0], C[1], C[2]); + n = v1.cross (v2); + n.normalize (); + } + randomPointTriangle (float (A[0]), float (A[1]), float (A[2]), + float (B[0]), float (B[1]), float (B[2]), + float (C[0]), float (C[1]), float (C[2]), p); +} + +void +uniform_sampling (vtkSmartPointer polydata, size_t n_samples, bool calc_normal, pcl::PointCloud & cloud_out) +{ + polydata->BuildCells (); + vtkSmartPointer cells = polydata->GetPolys (); + + double p1[3], p2[3], p3[3], totalArea = 0; + std::vector cumulativeAreas (cells->GetNumberOfCells (), 0); + size_t i = 0; + vtkIdType npts = 0, *ptIds = NULL; + for (cells->InitTraversal (); cells->GetNextCell (npts, ptIds); i++) + { + polydata->GetPoint (ptIds[0], p1); + polydata->GetPoint (ptIds[1], p2); + polydata->GetPoint (ptIds[2], p3); + totalArea += vtkTriangle::TriangleArea (p1, p2, p3); + cumulativeAreas[i] = totalArea; + } + + cloud_out.points.resize (n_samples); + cloud_out.width = static_cast (n_samples); + cloud_out.height = 1; + + for (i = 0; i < n_samples; i++) + { + Eigen::Vector4f p; + Eigen::Vector3f n; + randPSurface (polydata, &cumulativeAreas, totalArea, p, calc_normal, n); + cloud_out.points[i].x = p[0]; + cloud_out.points[i].y = p[1]; + cloud_out.points[i].z = p[2]; + if (calc_normal) + { + cloud_out.points[i].normal_x = n[0]; + cloud_out.points[i].normal_y = n[1]; + cloud_out.points[i].normal_z = n[2]; + } + } +} + +using namespace pcl; +using namespace pcl::io; +using namespace pcl::console; + +const int default_number_samples = 100000; +const float default_leaf_size = 0.01f; + +void +printHelp (int, char **argv) +{ + print_error("Syntax is: %s input.{ply,obj} output.pcd \n", argv[0]); + print_info (" where options are:\n"); + print_info (" -n_samples X = number of samples (default: "); + print_value("%d", default_number_samples); + print_info (")\n"); + print_info ( + " -leaf_size X = the XYZ leaf size for the VoxelGrid -- for data reduction (default: "); + print_value("%f", default_leaf_size); + print_info (" m)\n"); + print_info (" -write_normals = flag to write normals to the output pcd\n"); + print_info ( + " -no_vis_result = flag to stop visualizing the generated pcd\n"); + print_info ( + " -no_vox_filter = flag to stop downsampling the generated pcd\n"); +} + +/* ---[ */ +int +main (int argc, char **argv) +{ + if (argc < 3) + { + printHelp (argc, argv); + return (-1); + } + + // Parse command line arguments + int SAMPLE_POINTS_ = default_number_samples; + parse_argument (argc, argv, "-n_samples", SAMPLE_POINTS_); + float leaf_size = default_leaf_size; + parse_argument (argc, argv, "-leaf_size", leaf_size); + bool vis_result = ! find_switch (argc, argv, "-no_vis_result"); + bool vox_filter = ! find_switch (argc, argv, "-no_vox_filter"); + const bool write_normals = find_switch (argc, argv, "-write_normals"); + + std::vector pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd"); + std::vector ply_file_indices = parse_file_extension_argument (argc, argv, ".ply"); + std::vector obj_file_indices = parse_file_extension_argument (argc, argv, ".obj"); + if (pcd_file_indices.size () != 1) + { + print_error ("Need a single output PCD file to continue.\n"); + return (-1); + } + if (ply_file_indices.size () != 1 && obj_file_indices.size () != 1) + { + print_error ("Need a single input PLY/OBJ file to continue.\n"); + return (-1); + } + + vtkSmartPointer polydata1 = vtkSmartPointer::New (); + if (ply_file_indices.size () == 1) + { + pcl::PolygonMesh mesh; + pcl::io::loadPolygonFilePLY (argv[ply_file_indices[0]], mesh); + pcl::io::mesh2vtk (mesh, polydata1); + } + else if (obj_file_indices.size () == 1) + { + print_info ("Convert %s to a point cloud using uniform sampling.\n", argv[obj_file_indices[0]]); + vtkSmartPointer readerQuery = vtkSmartPointer::New (); + readerQuery->SetFileName (argv[obj_file_indices[0]]); + readerQuery->Update (); + polydata1 = readerQuery->GetOutput (); + } + + //make sure that the polygons are triangles! + vtkSmartPointer triangleFilter = vtkSmartPointer::New (); +#if VTK_MAJOR_VERSION < 6 + triangleFilter->SetInput (polydata1); +#else + triangleFilter->SetInputData (polydata1); +#endif + triangleFilter->Update (); + + vtkSmartPointer triangleMapper = vtkSmartPointer::New (); + triangleMapper->SetInputConnection (triangleFilter->GetOutputPort ()); + triangleMapper->Update (); + polydata1 = triangleMapper->GetInput (); + + bool INTER_VIS = false; + + if (INTER_VIS) + { + visualization::PCLVisualizer vis; + vis.addModelFromPolyData (polydata1, "mesh1", 0); + vis.setRepresentationToSurfaceForAllActors (); + vis.spin (); + } + + pcl::PointCloud::Ptr cloud_1 (new pcl::PointCloud); + uniform_sampling (polydata1, SAMPLE_POINTS_, write_normals, *cloud_1); + + if (INTER_VIS) + { + visualization::PCLVisualizer vis_sampled; + vis_sampled.addPointCloud (cloud_1); + if (write_normals) + vis_sampled.addPointCloudNormals (cloud_1, 1, 0.02f, "cloud_normals"); + vis_sampled.spin (); + } + + pcl::PointCloud::Ptr cloud (new pcl::PointCloud); + + // Voxelgrid + if (vox_filter) + { + VoxelGrid grid_; + grid_.setInputCloud (cloud_1); + grid_.setLeafSize (leaf_size, leaf_size, leaf_size); + grid_.filter (*cloud); + } + else + { + *cloud = *cloud_1; + } + + if (vis_result) + { + visualization::PCLVisualizer vis3 ("VOXELIZED SAMPLES CLOUD"); + vis3.addPointCloud (cloud); + if (write_normals) + vis3.addPointCloudNormals (cloud, 1, 0.02f, "cloud_normals"); + vis3.spin (); + } + + if (!write_normals) + { + pcl::PointCloud::Ptr cloud_xyz (new pcl::PointCloud); + // Strip uninitialized normals from cloud: + pcl::copyPointCloud (*cloud, *cloud_xyz); + savePCDFileASCII (argv[pcd_file_indices[0]], *cloud_xyz); + } + else + { + savePCDFileASCII (argv[pcd_file_indices[0]], *cloud); + } +} diff --git a/zoo/OcCo/sample/readme.md b/zoo/OcCo/sample/readme.md new file mode 100644 index 0000000..45bd38f --- /dev/null +++ b/zoo/OcCo/sample/readme.md @@ -0,0 +1,5 @@ +[Optional] This directory contains code for a command line tool that uniformly samples a point cloud on a mesh. It is a modified version of `pcl_mesh_sampling`. To use it: +1. Install [CMake](https://cmake.org/download/), [PCL](http://pointclouds.org/downloads/) and [VTK](https://vtk.org/download/). +2. Make a build directory: `makedir build & cd build`. +3. Build the code by running `cmake ..` and then `make`. +4. Run `./mesh_sampling` to see the command line usage. \ No newline at end of file diff --git a/zoo/PAConv/.gitignore b/zoo/PAConv/.gitignore new file mode 100644 index 0000000..a103063 --- /dev/null +++ b/zoo/PAConv/.gitignore @@ -0,0 +1,145 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + + +.idea/workspace.xml +part_seg/.DS_Store +obj_cls/.DS_Store +.idea/PAConv.iml +.idea/misc.xml +.DS_Store + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +.idea/ +exp/ +kernels/ +lib/**/*.o +lib/**/*.ninja* +dataset/ +*.DS_Store +.vscode/ diff --git a/zoo/PAConv/LICENSE b/zoo/PAConv/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/zoo/PAConv/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/zoo/PAConv/README.md b/zoo/PAConv/README.md new file mode 100644 index 0000000..36e7e58 --- /dev/null +++ b/zoo/PAConv/README.md @@ -0,0 +1,74 @@ +# PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds + + +by [Mutian Xu*](https://mutianxu.github.io/), [Runyu Ding*](), [Hengshuang Zhao](https://hszhao.github.io/), and [Xiaojuan Qi](https://xjqi.github.io/). + + +## Introduction +This repository is built for the official implementation of: + +__PAConv__: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds ___(CVPR2021)___ [[arXiv](https://arxiv.org/abs/2103.14635)] +
+ +If you find our work useful in your research, please consider citing: + +``` +@inproceedings{xu2021paconv, + title={PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds}, + author={Xu, Mutian and Ding, Runyu and Zhao, Hengshuang and Qi, Xiaojuan}, + booktitle={CVPR}, + year={2021} +} +``` + +## Highlight + +* All initialization models and trained models are available. +* Provide fast multiprocessing training ([nn.parallel.DistributedDataParallel](https://pytorch.org/docs/stable/_modules/torch/nn/parallel/distributed.html)) with official [nn.SyncBatchNorm](https://pytorch.org/docs/master/nn.html#torch.nn.SyncBatchNorm). +* Incorporated with [tensorboardX](https://github.com/lanpa/tensorboardX) for better visualization of the whole training process. +* Support recent versions of PyTorch. +* Well designed code structures for easy reading and using. + +## Usage + +We provide scripts for different point cloud processing tasks: + +* [Object Classification](./obj_cls) task on Modelnet40. + +* [Shape Part Segmentation](./part_seg) task on ShapeNetPart. + +* [Indoor Scene Segmentation](./scene_seg) task on S3DIS. + +You can find the instructions for running these tasks in the above corresponding folders. + +## Performance +The following tables report the current performances on different tasks and datasets. ( __*__ denotes the backbone architectures) + +### Object Classification on ModelNet40 + +| Method | OA | +| :--- | :---: | +| PAConv _(*PointNet)_ | 93.2%| +| PAConv _(*DGCNN)_ | **93.9%** | + +### Shape Part Segmentation on ShapeNet Part +| Method | Class mIoU | Instance mIoU | +| :--- | :---: | :---: | +| PAConv _(*DGCNN)_ | **84.6%** | **86.1%** | + + + +### Indoor Scene Segmentation on S3DIS Area-5 + +| Method | S3DIS mIoU | +| :--- | :---: | +| PAConv _(*PointNet++)_| **66.58%** | + + +## Contact + +You are welcome to send pull requests or share some ideas with us. Contact information: Mutian Xu (mino1018@outlook.com) or Runyu Ding (ryding@eee.hku.hk). + +## Acknowledgement + +Our code base is partially borrowed from [PointWeb](https://github.com/hszhao/PointWeb), [DGCNN](https://github.com/WangYueFt/dgcnn) and [PointNet++](https://github.com/charlesq34/pointnet2). \ No newline at end of file diff --git a/zoo/PAConv/figure/paconv.jpg b/zoo/PAConv/figure/paconv.jpg new file mode 100644 index 0000000..0e31dbb Binary files /dev/null and b/zoo/PAConv/figure/paconv.jpg differ diff --git a/zoo/PAConv/figure/partseg_vis.jpg b/zoo/PAConv/figure/partseg_vis.jpg new file mode 100644 index 0000000..b45e004 Binary files /dev/null and b/zoo/PAConv/figure/partseg_vis.jpg differ diff --git a/zoo/PAConv/figure/semseg_vis.jpg b/zoo/PAConv/figure/semseg_vis.jpg new file mode 100644 index 0000000..5493302 Binary files /dev/null and b/zoo/PAConv/figure/semseg_vis.jpg differ diff --git a/zoo/PAConv/obj_cls/README.md b/zoo/PAConv/obj_cls/README.md new file mode 100644 index 0000000..fe6b5f9 --- /dev/null +++ b/zoo/PAConv/obj_cls/README.md @@ -0,0 +1,86 @@ +3D Object Classification +============================ + +## Installation + +### Requirements +* Hardware: GPU to hold 6000M. (Better with two gpus or higher-level gpu to satisfy the need of paralleled cuda_kernels.) +* Software: + Linux (tested on Ubuntu 18.04) + PyTorch>=1.5.0, Python>=3, CUDA>=10.1, tensorboardX, h5py, pyYaml, scikit-learn + + +### Dataset +Download and unzip [ModelNet40](https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip) (415M). Then symlink the paths to it as follows (you can alternatively modify the path [here](https://github.com/CVMI-Lab/PAConv/blob/main/obj_cls/util/data_util.py#L10)): +``` +mkdir -p data +ln -s /path to modelnet40/modelnet40_ply_hdf5_2048 data +``` + +## Usage + +* Build the CUDA kernel: + + When you run the program for the first time, please wait a few moments for compiling the [cuda_lib](./cuda_lib) **automatically**. + Once the CUDA kernel is built, the program will skip this in the future running. + + +* Train: + + * Multi-thread training ([nn.DataParallel](https://pytorch.org/docs/stable/nn.html#dataparallel)) : + + * `python main.py --config config/dgcnn_paconv_train.yaml` (Embed PAConv into [DGCNN](https://arxiv.org/abs/1801.07829)) + + * `python main.py --config config/pointnet_paconv_train.yaml` (Embed PAConv into [PointNet](https://arxiv.org/abs/1612.00593)) + + * We also provide a fast **multi-process training** ([nn.parallel.DistributedDataParallel](https://pytorch.org/docs/stable/_modules/torch/nn/parallel/distributed.html), **recommended**) with official [nn.SyncBatchNorm](https://pytorch.org/docs/master/nn.html#torch.nn.SyncBatchNorm). Please also remind to specify the GPU ID: + + * `CUDA_VISIBLE_DEVICES=x,x python main_ddp.py --config config/dgcnn_paconv_train.yaml` (Embed PAConv into [DGCNN](https://arxiv.org/abs/1801.07829)) + * `CUDA_VISIBLE_DEVICES=x,x python main_ddp.py --config config/pointnet_paconv_train.yaml` (Embed PAConv into [PointNet](https://arxiv.org/abs/1612.00593)) + + +* Test: + + * Download our [pretrained model](https://drive.google.com/drive/folders/1eDBpIRt4iSCjEw2-Mk2G3gz7YwA6VfEB?usp=sharing) and put it under the [obj_cls](/obj_cls) folder. + + * Run the voting evaluation script to test our pretrained model, after this voting you will get an accuracy of 93.9% if all things go right: + + `python eval_voting.py --config config/dgcnn_paconv_test.yaml` + + * You can also directly test our pretrained model without voting to get an accuracy of 93.6%: + + `python main.py --config config/dgcnn_paconv_test.yaml` + + * For full test after training the model: + * Specify the `eval` to `True` in your config file. + + * Make sure to use **[main.py](main.py)** (main_ddp.py may lead to wrong result due to the repeating problem of all_reduce function in multi-process training) : + + `python main.py --config config/your config file.yaml` + +* Visualization: [tensorboardX](https://github.com/lanpa/tensorboardX) incorporated for better visualization. + + `tensorboard --logdir=checkpoints/exp_name` + + +## Citation +If you find the code or trained models useful, please consider citing: +``` +@inproceedings{xu2021paconv, + title={PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds}, + author={Xu, Mutian and Ding, Runyu and Zhao, Hengshuang and Qi, Xiaojuan}, + booktitle={CVPR}, + year={2021} +} +``` + +## Contact + +You are welcome to send pull requests or share some ideas with us. Contact information: Mutian Xu (mino1018@outlook.com) or Runyu Ding (ryding@eee.hku.hk). + + +## Acknowledgement +This code is is partially borrowed from [DGCNN](https://github.com/WangYueFt/dgcnn). + + + diff --git a/zoo/PAConv/obj_cls/config/dgcnn_paconv_test.yaml b/zoo/PAConv/obj_cls/config/dgcnn_paconv_test.yaml new file mode 100644 index 0000000..a9f1a96 --- /dev/null +++ b/zoo/PAConv/obj_cls/config/dgcnn_paconv_test.yaml @@ -0,0 +1,14 @@ +MODEL: + arch: dgcnn # backbone network architecture + num_matrices: [8, 8, 8, 8] + k_neighbors: 20 # number of knn + calc_scores: softmax + + +TEST: + exp_name: dgcnn_paconv_test + num_points: 1024 + test_batch_size: 16 + eval: True + dropout: 0.5 + no_cuda: False \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/config/dgcnn_paconv_train.yaml b/zoo/PAConv/obj_cls/config/dgcnn_paconv_train.yaml new file mode 100644 index 0000000..a2ef30e --- /dev/null +++ b/zoo/PAConv/obj_cls/config/dgcnn_paconv_train.yaml @@ -0,0 +1,19 @@ +MODEL: + arch: dgcnn # backbone network architecture + num_matrices: [8, 8, 8, 8] + k_neighbors: 20 # number of knn + calc_scores: softmax + + +TRAIN: + exp_name: dgcnn_paconv_train + num_points: 1024 + pt_norm: False # input normalization + batch_size: 32 + test_batch_size: 16 + epochs: 350 + lr: 0.1 + momentum: 0.9 + eval: False + dropout: 0.5 + no_cuda: False \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/config/pointnet_paconv_train.yaml b/zoo/PAConv/obj_cls/config/pointnet_paconv_train.yaml new file mode 100644 index 0000000..33fe15c --- /dev/null +++ b/zoo/PAConv/obj_cls/config/pointnet_paconv_train.yaml @@ -0,0 +1,19 @@ +MODEL: + arch: pointnet # backbone network architecture + num_matrices: [8, 8, 8] + k_neighbors: 30 # number of knn + calc_scores: softmax + + +TRAIN: + num_points: 1024 + pt_norm: False # input normalization + exp_name: pointnet_paconv_train + batch_size: 32 + test_batch_size: 16 + epochs: 350 + lr: 0.1 + momentum: 0.9 + eval: False + dropout: 0.5 + no_cuda: False \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/cuda_lib/__init__.py b/zoo/PAConv/obj_cls/cuda_lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PAConv/obj_cls/cuda_lib/functional.py b/zoo/PAConv/obj_cls/cuda_lib/functional.py new file mode 100644 index 0000000..d25ae7e --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/functional.py @@ -0,0 +1,11 @@ +from . import functions + + +def assign_score_withk_halfkernel(score, point_input, knn_idx, aggregate='sum'): + return functions.assign_score_withk_halfkernel(score, point_input, knn_idx, aggregate) + + +def assign_score_withk(score, point_input, center_input, knn_idx, aggregate='sum'): + return functions.assign_score_withk(score, point_input, center_input, knn_idx, aggregate) + + diff --git a/zoo/PAConv/obj_cls/cuda_lib/functions/__init__.py b/zoo/PAConv/obj_cls/cuda_lib/functions/__init__.py new file mode 100644 index 0000000..df9d06f --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/functions/__init__.py @@ -0,0 +1 @@ +from .assignscore import * \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/cuda_lib/functions/assignscore.py b/zoo/PAConv/obj_cls/cuda_lib/functions/assignscore.py new file mode 100644 index 0000000..9116005 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/functions/assignscore.py @@ -0,0 +1,125 @@ +import torch +from torch.autograd import Function + +from .. import src + + +class AssignScoreWithKHalfKernel(Function): + @staticmethod + def forward(ctx, scores, points, knn_idx, aggregate) : # -> torch.Tensor: + """ + :param ctx + :param scores: (B, N, K, M) + :param points: (B, N, M, O) + :param knn_idx: (B, N, K) + :param aggregate: + :return: output: (B, O, N) + """ + + agg = {'sum': 0, 'avg': 1, 'max': 2} + + B, N, M, O = points.size() + K = scores.size(2) + + output = torch.zeros([B, O, N], dtype=points.dtype, device=points.device) + output = output.contiguous() + + src.gpu.assign_score_withk_halfkernel_forward_cuda(B, N, M, K, O, agg[aggregate], + points.contiguous(), scores.contiguous(), + knn_idx.contiguous(), output) + + ctx.save_for_backward(output, points, scores, knn_idx) + ctx.agg = agg[aggregate] + + return output + + @staticmethod + def backward(ctx, grad_out): + """ + + :param ctx: + :param grad_out: (B, O, N) tensor with gradients of ouputs + :return: grad_scores: (B, N, K, M) tensor with gradients of scores + :return: grad_points: (B, N, M, O) tensor with gradients of point features + """ + output, points, scores, knn_idx = ctx.saved_tensors + + agg = ctx.agg + + B, N, M, O = points.size() + K = scores.size(2) + + grad_points = torch.zeros_like(points, dtype=points.dtype, device=points.device).contiguous() + grad_scores = torch.zeros_like(scores, dtype=scores.dtype, device=scores.device).contiguous() + + src.gpu.assign_score_withk_halfkernel_backward_cuda(B, N, M, K, O, agg, grad_out.contiguous(), + points.contiguous(), scores.contiguous(), knn_idx.contiguous(), + grad_points, grad_scores) + + return grad_scores, grad_points, None, None + + +assign_score_withk_halfkernel = AssignScoreWithKHalfKernel.apply + + +class AssignScoreWithK(Function): + @staticmethod + def forward(ctx, scores, points, centers, knn_idx, aggregate): # -> torch.Tensor: + """ + :param ctx + :param scores: (B, N, K, M) + :param points: (B, N, M, O) + :param centers: (B, N, M, O) + :param knn_idx: (B, N, K) + :param aggregate: + :return: output: (B, O, N) + """ + + agg = {'sum': 0, 'avg': 1, 'max': 2} + + B, N, M, O = points.size() + K = scores.size(2) + + output = torch.zeros([B, O, N], dtype=points.dtype, device=points.device) + output = output.contiguous() + + src.gpu.assign_score_withk_forward_cuda(B, N, M, K, O, agg[aggregate], + points.contiguous(), centers.contiguous(), + scores.contiguous(), knn_idx.contiguous(), + output) + + ctx.save_for_backward(output, points, centers, scores, knn_idx) + ctx.agg = agg[aggregate] + + return output + + @staticmethod + def backward(ctx, grad_out): + """ + + :param ctx: + :param grad_out: (B, O, N) tensor with gradients of ouputs + :return: grad_scores: (B, N, K, M) tensor with gradients of scores + :return: grad_points: (B, N, M, O) tensor with gradients of point features + :return: grad_centers: (B, N, M, O) tensor with gradients of center point features + """ + output, points, centers, scores, knn_idx = ctx.saved_tensors + + agg = ctx.agg + + B, N, M, O = points.size() + K = scores.size(2) + + grad_points = torch.zeros_like(points, dtype=points.dtype, device=points.device).contiguous() + grad_centers = torch.zeros_like(centers, dtype=points.dtype, device=points.device).contiguous() + grad_scores = torch.zeros_like(scores, dtype=scores.dtype, device=scores.device).contiguous() + + src.gpu.assign_score_withk_backward_cuda(B, N, M, K, O, agg, grad_out.contiguous(), + points.contiguous(), centers.contiguous(), + scores.contiguous(), knn_idx.contiguous(), + grad_points, grad_centers, grad_scores) + + return grad_scores, grad_points, grad_centers, None, None, None + + +assign_score_withk = AssignScoreWithK.apply diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/__init__.py b/zoo/PAConv/obj_cls/cuda_lib/src/__init__.py new file mode 100644 index 0000000..1223d55 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/__init__.py @@ -0,0 +1,15 @@ +import os +import torch +from torch.utils.cpp_extension import load + +cwd = os.path.dirname(os.path.realpath(__file__)) +gpu_path = os.path.join(cwd, 'gpu') + +if torch.cuda.is_available(): + gpu = load('gpconv_cuda', [ + os.path.join(gpu_path, 'operator.cpp'), + os.path.join(gpu_path, 'assign_score_withk_gpu.cu'), + os.path.join(gpu_path, 'assign_score_withk_halfkernel_gpu.cu'), + ], build_directory=gpu_path, verbose=False) + + diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/gpu/assign_score_withk_gpu.cu b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/assign_score_withk_gpu.cu new file mode 100644 index 0000000..d4ed602 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/assign_score_withk_gpu.cu @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include "cuda_utils.h" +#include "utils.h" + + +// input: points(B,N,M,O), centers(B,N,M,O), scores(B,N,K,M), idx(B,N,K) +// ouput: fout(B,O,N) +// algo: fout(b,i,k,j) = s(b,i,k,m)*p(b,i,k,m,j) = s(b,i,k,m)*p(b,i(k),m,j) +// i(k) = idx(b,i,k) +// sum: fout(b,i,j) = fout(b,i,j) + s(b,i,k,m)*p(b,i,k,m,j) +// avg: fout(b,i,j) = sum(fout(b,i,k,j)) / k +// max: fout(b,i,j) = max(fout(b,i,k,j), sum(s(b,i,k,m)*p(b,i,k,m,j))) +// k,m : sequential +// b,n: parallel + +const int SUM = 0; +const int AVG = 1; +const int MAX = 2; + +#ifndef _CLOCK_T_DEFINED +typedef long clock_t; +#define _CLOCK_T_DEFINED +#endif + +__global__ void assign_score_withk_forward_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* points, + const float* centers, + const float* scores, + const long* knn_idx, + float* output) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for B, N and O --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + // ----- loop for K --------- + for (int k = 0; k < K; k++) { + // ------- loop for M ---------- + for (int m = 0; m < M; m++) { + int b = (int)(i / (O * N)); + int n = (int)(i % (O * N) / O); + // int k = (int)(i % (O * K * M) / (O * M)); + // int m = (int)(i % (O * M) / O); + int o = (int)(i % O); + int kn = (int) knn_idx[b*K*N + n*K + k]; + assert (b < B); + assert (kn < N); + assert (o < O); + assert (n < N); + + if (aggregate == SUM) { + // feature concat + // output[b*N*O + o*N + n] += 2 * points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]; + // output[b*N*O + o*N + n] -= points[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]; + atomicAdd(output + b*N*O + o*N + n, + points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m] + - centers[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]); + } + else if (aggregate == AVG) { + output[o*N + n] += 2 * points[kn*M*O + m*O + o] * scores[n*K*M + k*M + m] / K; + output[o*N + n] -= points[n*M*O + m*O + o] * scores[n*K*M + k*M + m] / K; + } + else if (aggregate == MAX) { + /*** + float tmp = points[i*K*M + k*M + m] * scores[((int)(i/O))*K*M + k*M + m]; + output[i] = tmp > output[i] ? tmp: output[i]; + ***/ + } + } + } + } + + // finish = clock(); + // printf("assign socre forward time:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); +} + + +__global__ void assign_score_withk_backward_points_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* grad_out, + const float* scores, + const long* knn_idx, + float* grad_points, + float* grad_centers) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for M, O --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + int b = (int)(i / (M * O)); + int m = (int)(i % (M * O) / O); + int o = (int)(i % O); + + // ----- loop for N,K --------- + for (int n = 0; n < N; n++) { + for (int k = 0; k < K; k++) { + int kn = knn_idx[b*N*K + n*K + k]; + atomicAdd(grad_points + b*N*M*O + kn*M*O + m*O + o, + scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]); + atomicAdd(grad_centers + b*N*M*O + n*M*O + m*O + o, + - scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]); + //grad_points[b*N*M*O + kn*M*O + m*O + o] += 2 * scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]; + //grad_points[b*N*M*O + n*M*O + m*O + o] -= scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]; + } + } + } + // finish = clock(); + // printf("assign socre backward time 1:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); + +} + + +__global__ void assign_score_withk_backward_scores_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* grad_out, + const float* points, + const float* centers, + const long* knn_idx, + float* grad_scores) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for N, K, M --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + // for (int i = index; i < N*K*M; i += stride) { + int b = (int)(i / (N * M * K)); + int n = (int)(i % (N * M * K) / M / K); + int k = (int)(i % (M * K) / M); + int m = (int)(i % M); + int kn = knn_idx[b*N*K + n*K + k]; + + for(int o = 0; o < O; o++) { + atomicAdd(grad_scores + b*N*K*M + n*K*M + k*M + m, + (points[b*N*M*O + kn*M*O + m*O + o] + - centers[b*N*M*O + n*M*O + m*O + o])* grad_out[b*O*N + o*N + n]); + // grad_scores[b*N*K*M + n*K*M + k*M + m] += (2 * points[b*N*M*O + kn*M*O + m*O + o] - points[b*N*M*O + n*M*O + m*O + o])* grad_out[b*O*N + o*N + n]; + } + } + + // finish = clock(); + // printf("assign socre backward time 2:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); +} + + +void assign_score_withk_forward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& output) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(centers); + CHECK_CONTIGUOUS(scores); + CHECK_CONTIGUOUS(knn_idx); + CHECK_CONTIGUOUS(output); + + const float* points_data = points.data_ptr(); + const float* centers_data = centers.data_ptr(); + const float* scores_data = scores.data_ptr(); + const long* knn_idx_data = knn_idx.data_ptr(); + float* output_data = output.data_ptr(); + + int nthreads = B * N * O; // * K * M; + + assign_score_withk_forward_kernel<<>>( + nthreads, B, N, M, K, O, aggregate, points_data, centers_data, scores_data, knn_idx_data, output_data); + + CUDA_CHECK_ERRORS(); + +} + + +void assign_score_withk_backward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& grad_out, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& grad_points, + at::Tensor& grad_centers, + at::Tensor& grad_scores) { + + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(scores); + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(centers); + CHECK_CONTIGUOUS(knn_idx); + CHECK_CONTIGUOUS(grad_scores); + CHECK_CONTIGUOUS(grad_points); + CHECK_CONTIGUOUS(grad_centers); + + const float* grad_out_data = grad_out.data_ptr(); + const float* points_data = points.data_ptr(); + const float* centers_data = centers.data_ptr(); + const float* scores_data = scores.data_ptr(); + const long* knn_idx_data = knn_idx.data_ptr(); + float* grad_points_data = grad_points.data_ptr(); + float* grad_centers_data = grad_centers.data_ptr(); + float* grad_scores_data = grad_scores.data_ptr(); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + int nthreads_1 = B * M * O; + int nthreads_2 = B * N * K * M; + + assign_score_withk_backward_points_kernel<<>>( + nthreads_1, B, N, M, K, O, aggregate, grad_out_data, scores_data, knn_idx_data, grad_points_data, grad_centers_data); + assign_score_withk_backward_scores_kernel<<>>( + nthreads_2, B, N, M, K, O, aggregate, grad_out_data, points_data, centers_data, knn_idx_data, grad_scores_data); + + CUDA_CHECK_ERRORS(); + +} diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/gpu/assign_score_withk_halfkernel_gpu.cu b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/assign_score_withk_halfkernel_gpu.cu new file mode 100644 index 0000000..839eb11 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/assign_score_withk_halfkernel_gpu.cu @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include "cuda_utils.h" +#include "utils.h" + + +// input: points(B,N,M,O), scores(B,N,K,M), idx(B,N,K) +// ouput: fout(B,O,N) +// algo: fout(b,i,k,j) = s(b,i,k,m)*p(b,i,k,m,j) = s(b,i,k,m)*p(b,i(k),m,j) +// i(k) = idx(b,i,k) +// sum: fout(b,i,j) = fout(b,i,j) + s(b,i,k,m)*p(b,i,k,m,j) +// avg: fout(b,i,j) = sum(fout(b,i,k,j)) / k +// max: fout(b,i,j) = max(fout(b,i,k,j), sum(s(b,i,k,m)*p(b,i,k,m,j))) +// k,m : sequential +// b,n: parallel + +const int SUM = 0; +const int AVG = 1; +const int MAX = 2; + +#ifndef _CLOCK_T_DEFINED +typedef long clock_t; +#define _CLOCK_T_DEFINED +#endif + +__global__ void assign_score_withk_halfkernel_forward_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* points, + const float* scores, + const long* knn_idx, + float* output) { + + // clock_t start, finish; + // start = clock();s + + // ----- parallel loop for B, N and O --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + // ----- loop for K --------- + for (int k = 0; k < K; k++) { + int b = (int)(i / (O * N)); + int n = (int)(i % (O * N) / O); + int o = (int)(i % O); + float tmp = 0; + // ------- loop for M ---------- + for (int m = 0; m < M; m++) { + int kn = (int) knn_idx[b*K*N + n*K + k]; + assert (kn < N); + assert (o < O); + assert (n < N); + + if (aggregate == SUM) { + // feature concat + // output[b*N*O + o*N + n] += 2 * points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]; + // output[b*N*O + o*N + n] -= points[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]; + atomicAdd(output + b*N*O + o*N + n, + 2 * points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m] + - points[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]); + } + else if (aggregate == AVG) { + atomicAdd(output + b*N*O + o*N + n, + (2 * points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m] + - points[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]) / K); + } + else if (aggregate == MAX) { + atomicAdd(&tmp, + 2 * points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m] + - points[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]); + } + } + + if (aggregate == MAX) { + output[b*N*O + o*N + n] = output[b*N*O + o*N + n] > tmp ? output[b*N*O + o*N + n] : tmp; + } + } + } + + // finish = clock(); + // printf("assign socre forward time:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); +} + + +__global__ void assign_score_withk_halfkernel_backward_points_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* grad_out, + const float* points, + const float* scores, + const long* knn_idx, + float* grad_points) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for M, O --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + int b = (int)(i / (M * O)); + int m = (int)(i % (M * O) / O); + int o = (int)(i % O); + + // ----- loop for N,K --------- + for (int n = 0; n < N; n++) { + for (int k = 0; k < K; k++) { + int kn = knn_idx[b*N*K + n*K + k]; + atomicAdd(grad_points + b*N*M*O + kn*M*O + m*O + o, + 2 * scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]); + atomicAdd(grad_points + b*N*M*O + n*M*O + m*O + o, + - scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]); + // grad_points[b*N*M*O + kn*M*O + m*O + o] += 2 * scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]; + // grad_points[b*N*M*O + n*M*O + m*O + o] -= scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]; + } + } + + } + // finish = clock(); + // printf("assign socre backward time 1:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); + +} + + +__global__ void assign_score_withk_halfkernel_backward_scores_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* grad_out, + const float* points, + const float* scores, + const long* knn_idx, + float* grad_scores) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for N, K, M --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + // for (int i = index; i < N*K*M; i += stride) { + int b = (int)(i / (N * M * K)); + int n = (int)(i % (N * M * K) / M / K); + int k = (int)(i % (M * K) / M); + int m = (int)(i % M); + int kn = knn_idx[b*N*K + n*K + k]; + + for(int o = 0; o < O; o++) { + atomicAdd(grad_scores + b*N*K*M + n*K*M + k*M + m, + (2 * points[b*N*M*O + kn*M*O + m*O + o] + - points[b*N*M*O + n*M*O + m*O + o])* grad_out[b*O*N + o*N + n]); + // grad_scores[b*N*K*M + n*K*M + k*M + m] += (2 * points[b*N*M*O + kn*M*O + m*O + o] - points[b*N*M*O + n*M*O + m*O + o])* grad_out[b*O*N + o*N + n]; + } + } + + // finish = clock(); + // printf("assign socre backward time 2:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); +} + + +void assign_score_withk_halfkernel_forward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& points, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& output) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(scores); + CHECK_CONTIGUOUS(knn_idx); + CHECK_CONTIGUOUS(output); + + const float* points_data = points.data_ptr(); + const float* scores_data = scores.data_ptr(); + const long* knn_idx_data = knn_idx.data_ptr(); + float* output_data = output.data_ptr(); + + int nthreads = B * N * O; // * K * M; + + assign_score_withk_halfkernel_forward_kernel<<>>( + nthreads, B, N, M, K, O, aggregate, points_data, scores_data, knn_idx_data, output_data); + + CUDA_CHECK_ERRORS(); + +} + + +void assign_score_withk_halfkernel_backward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& grad_out, + const at::Tensor& points, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& grad_points, + at::Tensor& grad_scores) { + + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(scores); + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(knn_idx); + CHECK_CONTIGUOUS(grad_scores); + CHECK_CONTIGUOUS(grad_points); + + const float* grad_out_data = grad_out.data_ptr(); + const float* points_data = points.data_ptr(); + const float* scores_data = scores.data_ptr(); + const long* knn_idx_data = knn_idx.data_ptr(); + float* grad_points_data = grad_points.data_ptr(); + float* grad_scores_data = grad_scores.data_ptr(); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + int nthreads_1 = B * M * O; + int nthreads_2 = B * N * K * M; + + assign_score_withk_halfkernel_backward_points_kernel<<>>( + nthreads_1, B, N, M, K, O, aggregate, grad_out_data, points_data, scores_data, knn_idx_data, grad_points_data); + assign_score_withk_halfkernel_backward_scores_kernel<<>>( + nthreads_2, B, N, M, K, O, aggregate, grad_out_data, points_data, scores_data, knn_idx_data, grad_scores_data); + + CUDA_CHECK_ERRORS(); + +} diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/gpu/cuda_utils.h b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/cuda_utils.h new file mode 100644 index 0000000..dbce9e0 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/cuda_utils.h @@ -0,0 +1,41 @@ +#ifndef _CUDA_UTILS_H +#define _CUDA_UTILS_H + +#include +#include +#include + +#include +#include + +#include + +#define TOTAL_THREADS 512 + +inline int opt_n_threads(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + + return max(min(1 << pow_2, TOTAL_THREADS), 1); +} + +inline dim3 opt_block_config(int x, int y) { + const int x_threads = opt_n_threads(x); + const int y_threads = + max(min(opt_n_threads(y), TOTAL_THREADS / x_threads), 1); + dim3 block_config(x_threads, y_threads, 1); + + return block_config; +} + +#define CUDA_CHECK_ERRORS() \ + do { \ + cudaError_t err = cudaGetLastError(); \ + if (cudaSuccess != err) { \ + fprintf(stderr, "CUDA kernel failed : %s\n%s at L:%d in %s\n", \ + cudaGetErrorString(err), __PRETTY_FUNCTION__, __LINE__, \ + __FILE__); \ + exit(-1); \ + } \ + } while (0) + +#endif diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/gpu/operator.cpp b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/operator.cpp new file mode 100644 index 0000000..4232e50 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/operator.cpp @@ -0,0 +1,8 @@ +#include "operator.h" + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("assign_score_withk_forward_cuda", &assign_score_withk_forward_kernel_wrapper, "Assign score kernel forward (GPU), save memory version"); + m.def("assign_score_withk_backward_cuda", &assign_score_withk_backward_kernel_wrapper, "Assign score kernel backward (GPU), save memory version"); + m.def("assign_score_withk_halfkernel_forward_cuda", &assign_score_withk_halfkernel_forward_kernel_wrapper, "Assign score kernel forward (GPU) with half kernel, save memory version"); + m.def("assign_score_withk_halfkernel_backward_cuda", &assign_score_withk_halfkernel_backward_kernel_wrapper, "Assign score kernel backward (GPU) with half kernel, save memory version"); +} \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/gpu/operator.h b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/operator.h new file mode 100644 index 0000000..2784337 --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/operator.h @@ -0,0 +1,42 @@ +// +// Created by Runyu Ding on 2020/8/12. +// + +#ifndef _OPERATOR_H +#define _OPERATOR_H + +#include + +void assign_score_withk_halfkernel_forward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& points, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& output); + +void assign_score_withk_halfkernel_backward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& grad_out, + const at::Tensor& points, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& grad_points, + at::Tensor& grad_scores); + +void assign_score_withk_forward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& output); + +void assign_score_withk_backward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& grad_out, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& grad_points, + at::Tensor& grad_centers, + at::Tensor& grad_scores); + + +#endif \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/cuda_lib/src/gpu/utils.h b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/utils.h new file mode 100644 index 0000000..5f080ed --- /dev/null +++ b/zoo/PAConv/obj_cls/cuda_lib/src/gpu/utils.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include + +#define CHECK_CUDA(x) \ + do { \ + AT_ASSERT(x.is_cuda(), #x " must be a CUDA tensor"); \ + } while (0) + +#define CHECK_CONTIGUOUS(x) \ + do { \ + AT_ASSERT(x.is_contiguous(), #x " must be a contiguous tensor"); \ + } while (0) + +#define CHECK_IS_INT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Int, \ + #x " must be an int tensor"); \ + } while (0) + +#define CHECK_IS_FLOAT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Float, \ + #x " must be a float tensor"); \ + } while (0) diff --git a/zoo/PAConv/obj_cls/eval_voting.py b/zoo/PAConv/obj_cls/eval_voting.py new file mode 100755 index 0000000..68cfe24 --- /dev/null +++ b/zoo/PAConv/obj_cls/eval_voting.py @@ -0,0 +1,132 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +from util.data_util import ModelNet40 as ModelNet40 +import numpy as np +from torch.utils.data import DataLoader +from util.util import IOStream, load_cfg_from_cfg_file, merge_cfg_from_list +import sklearn.metrics as metrics +import random + + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Object Classification') + parser.add_argument('--config', type=str, default='config/dgcnn_paconv_train.yaml', help='config file') + parser.add_argument('opts', help='see config/dgcnn_paconv_train.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + return cfg + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/'+args.exp_name): + os.makedirs('checkpoints/'+args.exp_name) + + # backup the running files: + os.system('cp eval_voting.py checkpoints' + '/' + args.exp_name + '/' + 'eval_voting.py.backup') + + +class PointcloudScale(object): # input random scaling + def __init__(self, scale_low=2. / 3., scale_high=3. / 2.): + self.scale_low = scale_low + self.scale_high = scale_high + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + scales = torch.from_numpy(xyz).float().cuda() + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], scales) + return pc + + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points, pt_norm=False), num_workers=args.workers, + batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + NUM_PEPEAT = 300 + NUM_VOTE = 10 + + # Try to load models: + if args.arch == 'dgcnn': + from model.DGCNN_PAConv import PAConv + model = PAConv(args).to(device) + elif args.arch == 'pointnet': + from model.PointNet_PAConv import PAConv + model = PAConv(args).to(device) + else: + raise Exception("Not implemented") + + model = nn.DataParallel(model) + model.load_state_dict(torch.load("checkpoints/%s/best_model.t7" % args.exp_name)) + model = model.eval() + best_acc = 0 + + pointscale = PointcloudScale(scale_low=0.8, scale_high=1.18) # set the range of scaling + + for i in range(NUM_PEPEAT): + test_true = [] + test_pred = [] + + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + pred = 0 + for v in range(NUM_VOTE): + new_data = data + batch_size = data.size()[0] + if v > 0: + new_data.data = pointscale(new_data.data) + with torch.no_grad(): + pred += F.softmax(model(new_data.permute(0, 2, 1)), dim=1) # sum 10 preds + pred /= NUM_VOTE # avg the preds! + label = label.view(-1) + pred_choice = pred.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(pred_choice.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + if test_acc > best_acc: + best_acc = test_acc + outstr = 'Voting %d, test acc: %.6f,' % (i, test_acc * 100) + io.cprint(outstr) + + final_outstr = 'Final voting test acc: %.6f,' % (best_acc * 100) + io.cprint(final_outstr) + + +if __name__ == "__main__": + args = get_parser() + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/%s_voting.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + test(args, io) diff --git a/zoo/PAConv/obj_cls/main.py b/zoo/PAConv/obj_cls/main.py new file mode 100755 index 0000000..442a777 --- /dev/null +++ b/zoo/PAConv/obj_cls/main.py @@ -0,0 +1,288 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR +from util.data_util import ModelNet40 as ModelNet40 +import numpy as np +from torch.utils.data import DataLoader +from util.util import cal_loss, IOStream, load_cfg_from_cfg_file, merge_cfg_from_list +import sklearn.metrics as metrics +from tensorboardX import SummaryWriter +import random +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Object Classification') + parser.add_argument('--config', type=str, default='config/dgcnn_paconv.yaml', help='config file') + parser.add_argument('--model_path', type=str, default='', help='path to pretrained model') + parser.add_argument('--eval_corrupt', type=bool, default=False, help='if test under corruption') + parser.add_argument('opts', help='see config/dgcnn_paconv.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + cfg['eval'] = cfg.get('eval', False) and not args.eval_corrupt + cfg['eval_corrupt'] = args.eval_corrupt + cfg['model_path'] = args.model_path + return cfg + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/'+args.exp_name): + os.makedirs('checkpoints/'+args.exp_name) + + if not args.eval and not args.eval_corrupt: # backup the running files + os.system('cp main.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp util/PAConv_util.py checkpoints' + '/' + args.exp_name + '/' + 'PAConv_util.py.backup') + os.system('cp util/data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + if args.arch == 'dgcnn': + os.system('cp model/DGCNN_PAConv.py checkpoints' + '/' + args.exp_name + '/' + 'DGCNN_PAConv.py.backup') + elif args.arch == 'pointnet': + os.system('cp model/PointNet_PAConv.py checkpoints' + '/' + args.exp_name + '/' + 'PointNet_PAConv.py.backup') + + global writer + writer = SummaryWriter('checkpoints/' + args.exp_name) + + +# weight initialization: +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(args, io): + train_loader = DataLoader(ModelNet40(partition='train', num_points=args.num_points, pt_norm=args.pt_norm), + num_workers=args.workers, batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points, pt_norm=False), + num_workers=args.workers, batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + if args.arch == 'dgcnn': + from model.DGCNN_PAConv import PAConv + model = PAConv(args).to(device) + elif args.arch == 'pointnet': + from model.PointNet_PAConv import PAConv + model = PAConv(args).to(device) + else: + raise Exception("Not implemented") + + io.cprint(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=1e-4) + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr/100) + + criterion = cal_loss + + best_test_acc = 0 + + for epoch in range(args.epochs): + scheduler.step() + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for data, label in train_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + loss.backward() + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + train_acc = metrics.accuracy_score(train_true, train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, ' % (epoch, train_loss * 1.0 / count, train_acc) + io.cprint(outstr) + + writer.add_scalar('loss_train', train_loss * 1.0 / count, epoch + 1) + writer.add_scalar('Acc_train', train_acc, epoch + 1) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f,' % (epoch, test_loss * 1.0 / count, test_acc) + io.cprint(outstr) + + writer.add_scalar('loss_test', test_loss * 1.0 / count, epoch + 1) + writer.add_scalar('Acc_test', test_acc, epoch + 1) + + if test_acc >= best_test_acc: + best_test_acc = test_acc + io.cprint('Max Acc:%.6f' % best_test_acc) + torch.save(model.state_dict(), 'checkpoints/%s/best_model.t7' % args.exp_name) + + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points, pt_norm=False), + batch_size=args.test_batch_size, shuffle=False, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + # Try to load models: + if args.arch == 'dgcnn': + from model.DGCNN_PAConv import PAConv + model = PAConv(args).to(device) + elif args.arch == 'pointnet': + from model.PointNet_PAConv import PAConv + model = PAConv(args).to(device) + else: + raise Exception("Not implemented") + + io.cprint(str(model)) + + model = nn.DataParallel(model) + model.load_state_dict(torch.load("checkpoints/%s/best_model.t7" % args.exp_name)) + model = model.eval() + test_acc = 0.0 + count = 0.0 + test_true = [] + test_pred = [] + for data, label in test_loader: + + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + with torch.no_grad(): + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f' % (test_acc, avg_per_class_acc) + io.cprint(outstr) + + +if __name__ == "__main__": + args = get_parser() + _init_() + + if args.eval_corrupt or args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval and not args.eval_corrupt: + train(args, io) + elif args.eval: + with torch.no_grad(): + test(args, io) + elif args.eval_corrupt: + with torch.no_grad(): + device = torch.device("cuda" if args.cuda else "cpu") + # Try to load models: + if args.arch == 'dgcnn': + from model.DGCNN_PAConv import PAConv + model = PAConv(args).to(device) + elif args.arch == 'pointnet': + from model.PointNet_PAConv import PAConv + model = PAConv(args).to(device) + else: + raise Exception("Not implemented") + model = nn.DataParallel(model) + if args.model_path == '': + model.load_state_dict(torch.load("checkpoints/%s/best_model.t7" % args.exp_name)) + else: + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + + def test_corrupt(args, split, model): + test_loader = DataLoader(ModelNetC(split=split), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + return {'acc': test_acc, 'avg_per_class_acc': avg_per_class_acc} + + + eval_corrupt_wrapper(model, test_corrupt, {'args': args}) diff --git a/zoo/PAConv/obj_cls/main_ddp.py b/zoo/PAConv/obj_cls/main_ddp.py new file mode 100755 index 0000000..335c904 --- /dev/null +++ b/zoo/PAConv/obj_cls/main_ddp.py @@ -0,0 +1,467 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.optim as optim +import torch.multiprocessing as mp +import torch.distributed as dist +import torch.backends.cudnn as cudnn +from torch.optim.lr_scheduler import CosineAnnealingLR +from util.data_util import ModelNet40 as ModelNet40 +import numpy as np +from util.util import cal_loss, load_cfg_from_cfg_file, merge_cfg_from_list, find_free_port, AverageMeter, intersectionAndUnionGPU +import time +import logging +import random +from tensorboardX import SummaryWriter + + +def get_logger(): + logger_name = "main-logger" + logger = logging.getLogger(logger_name) + logger.setLevel(logging.INFO) + handler = logging.StreamHandler() + fmt = "[%(asctime)s %(levelname)s %(filename)s line %(lineno)d %(process)d] %(message)s" + handler.setFormatter(logging.Formatter(fmt)) + logger.addHandler(handler) + + file_handler = logging.FileHandler(os.path.join('checkpoints', args.exp_name, 'main-' + str(int(time.time())) + '.log')) + file_handler.setFormatter(logging.Formatter(fmt)) + logger.addHandler(file_handler) + + return logger + + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Object Classification') + parser.add_argument('--config', type=str, default='config/dgcnn_paconv.yaml', help='config file') + parser.add_argument('opts', help='see config/dgcnn_paconv.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['classes'] = cfg.get('classes', 40) + cfg['sync_bn'] = cfg.get('sync_bn', True) + cfg['dist_url'] = cfg.get('dist_url', 'tcp://127.0.0.1:6789') + cfg['dist_backend'] = cfg.get('dist_backend', 'nccl') + cfg['multiprocessing_distributed'] = cfg.get('multiprocessing_distributed', True) + cfg['world_size'] = cfg.get('world_size', 1) + cfg['rank'] = cfg.get('rank', 0) + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + cfg['print_freq'] = cfg.get('print_freq', 10) + return cfg + + +def worker_init_fn(worker_id): + random.seed(args.manual_seed + worker_id) + + +def main_process(): + return not args.multiprocessing_distributed or (args.multiprocessing_distributed and args.rank % args.ngpus_per_node == 0) + + +# weight initialization: +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(gpu, ngpus_per_node): + + # ============= Model =================== + if args.arch == 'dgcnn': + from model.DGCNN_PAConv import PAConv + model = PAConv(args) + elif args.arch == 'pointnet': + from model.PointNet_PAConv import PAConv + model = PAConv(args) + else: + raise Exception("Not implemented") + + model.apply(weight_init) + + if main_process(): + logger.info(model) + + if args.sync_bn and args.distributed: + model = nn.SyncBatchNorm.convert_sync_batchnorm(model) + + if args.distributed: + torch.cuda.set_device(gpu) + args.batch_size = int(args.batch_size / ngpus_per_node) + args.test_batch_size = int(args.test_batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[gpu], find_unused_parameters=True) + else: + model = torch.nn.DataParallel(model.cuda()) + + # =========== Dataloader ================= + train_data = ModelNet40(partition='train', num_points=args.num_points, pt_norm=args.pt_norm) + test_data = ModelNet40(partition='test', num_points=args.num_points, pt_norm=False) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_data) + test_sampler = torch.utils.data.distributed.DistributedSampler(test_data) + else: + train_sampler = None + test_sampler = None + + train_loader = torch.utils.data.DataLoader(train_data, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler, + drop_last=True) + test_loader = torch.utils.data.DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, sampler=test_sampler) + + # ============= Optimizer =================== + if main_process(): + logger.info("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=1e-4) + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr/100) + + criterion = cal_loss + best_test_acc = 0 + start_epoch = 0 + + # ============= Training from scratch================= + for epoch in range(start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + + train_epoch(train_loader, model, opt, scheduler, epoch, criterion) + + test_acc = test_epoch(test_loader, model, epoch, criterion) + + if test_acc >= best_test_acc and main_process(): + best_test_acc = test_acc + logger.info('Max Acc:%.6f' % best_test_acc) + torch.save(model.state_dict(), 'checkpoints/%s/best_model.t7' % args.exp_name) # save the best model + + +def train_epoch(train_loader, model, opt, scheduler, epoch, criterion): + train_loss = 0.0 + count = 0.0 + + batch_time = AverageMeter() + data_time = AverageMeter() + forward_time = AverageMeter() + backward_time = AverageMeter() + loss_meter = AverageMeter() + intersection_meter = AverageMeter() + union_meter = AverageMeter() + target_meter = AverageMeter() + + model.train() + end = time.time() + max_iter = args.epochs * len(train_loader) + + for ii, (data, label) in enumerate(train_loader): + data_time.update(time.time() - end) + + data, label = data.cuda(non_blocking=True), label.cuda(non_blocking=True).squeeze(1) + data = data.permute(0, 2, 1) + batch_size = data.size(0) + end2 = time.time() + logits, loss = model(data, label, criterion) + + forward_time.update(time.time() - end2) + + preds = logits.max(dim=1)[1] + + if not args.multiprocessing_distributed: + loss = torch.mean(loss) + + end3 = time.time() + opt.zero_grad() + loss.backward() # the own loss of each process, backward by the optimizer belongs to this process + opt.step() + backward_time.update(time.time() - end3) + + # Loss + if args.multiprocessing_distributed: + loss = loss * batch_size + _count = label.new_tensor([batch_size], dtype=torch.long).cuda(non_blocking=True) # b_size on one process + dist.all_reduce(loss), dist.all_reduce(_count) # obtain the sum of all xxx at all processes + n = _count.item() + loss = loss / n # avg loss across all processes + + # then calculate loss same as without dist + count += batch_size + train_loss += loss.item() * batch_size + + loss_meter.update(loss.item(), batch_size) + batch_time.update(time.time() - end) + end = time.time() + + current_iter = epoch * len(train_loader) + ii + 1 + remain_iter = max_iter - current_iter + remain_time = remain_iter * batch_time.avg + t_m, t_s = divmod(remain_time, 60) + t_h, t_m = divmod(t_m, 60) + remain_time = '{:02d}:{:02d}:{:02d}'.format(int(t_h), int(t_m), int(t_s)) + + if (ii + 1) % args.print_freq == 0 and main_process(): + logger.info('Epoch: [{}/{}][{}/{}] ' + 'Data {data_time.val:.3f} ({data_time.avg:.3f}) ' + 'Batch {batch_time.val:.3f} ({batch_time.avg:.3f}) ' + 'Forward {for_time.val:.3f} ({for_time.avg:.3f}) ' + 'Backward {back_time.val:.3f} ({back_time.avg:.3f}) ' + 'Remain {remain_time} ' + 'Loss {loss_meter.val:.4f} '.format(epoch + 1, args.epochs, ii + 1, len(train_loader), + batch_time=batch_time, + data_time=data_time, + for_time = forward_time, + back_time = backward_time, + remain_time=remain_time, + loss_meter=loss_meter)) + + intersection, union, target = intersectionAndUnionGPU(preds, label, args.classes) + if args.multiprocessing_distributed: # obtain the sum of all tensors at all processes: all_reduce + dist.all_reduce(intersection), dist.all_reduce(union), dist.all_reduce(target) + intersection, union, target = intersection.cpu().numpy(), union.cpu().numpy(), target.cpu().numpy() + intersection_meter.update(intersection), union_meter.update(union), target_meter.update(target) + + scheduler.step() + + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) # the first sum here is to sum the acc across all classes + + outstr = 'Train %d, loss: %.6f, train acc: %.6f, ' \ + 'train avg acc: %.6f' % (epoch + 1, + train_loss * 1.0 / count, + allAcc, mAcc) + + if main_process(): + logger.info(outstr) + # Write to tensorboard + writer.add_scalar('loss_train', train_loss * 1.0 / count, epoch + 1) + writer.add_scalar('mAcc_train', mAcc, epoch + 1) + writer.add_scalar('allAcc_train', allAcc, epoch + 1) + + +def test_epoch(test_loader, model, epoch, criterion): + test_loss = 0.0 + count = 0.0 + model.eval() + + intersection_meter = AverageMeter() + union_meter = AverageMeter() + target_meter = AverageMeter() + + for data, label in test_loader: + data, label = data.cuda(non_blocking=True), label.cuda(non_blocking=True).squeeze(1) + data = data.permute(0, 2, 1) + batch_size = data.size(0) + logits = model(data) + + # Loss + loss = criterion(logits, label) # here use model's output directly + if args.multiprocessing_distributed: + loss = loss * batch_size + _count = label.new_tensor([batch_size], dtype=torch.long).cuda(non_blocking=True) + dist.all_reduce(loss), dist.all_reduce(_count) + n = _count.item() + loss = loss / n + else: + loss = torch.mean(loss) + + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + + intersection, union, target = intersectionAndUnionGPU(preds, label, args.classes) + if args.multiprocessing_distributed: + dist.all_reduce(intersection), dist.all_reduce(union), dist.all_reduce(target) + intersection, union, target = intersection.cpu().numpy(), union.cpu().numpy(), target.cpu().numpy() + intersection_meter.update(intersection), union_meter.update(union), target_meter.update(target) + + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) + + outstr = 'Test %d, loss: %.6f, test acc: %.6f, ' \ + 'test avg acc: %.6f' % (epoch + 1, + test_loss * 1.0 / count, + allAcc, + mAcc) + + if main_process(): + logger.info(outstr) + # Write to tensorboard + writer.add_scalar('loss_test', test_loss * 1.0 / count, epoch + 1) + writer.add_scalar('mAcc_test', mAcc, epoch + 1) + writer.add_scalar('allAcc_test', allAcc, epoch + 1) + + return allAcc + + +def test(gpu, ngpus_per_node): + if main_process(): + logger.info('<<<<<<<<<<<<<<<<< Start Evaluation <<<<<<<<<<<<<<<<<') + + # ============= Model =================== + if args.arch == 'dgcnn': + from model.DGCNN_PAConv import PAConv + model = PAConv(args) + elif args.arch == 'pointnet': + from model.PointNet_PAConv import PAConv + model = PAConv(args) + else: + raise Exception("Not implemented") + + if main_process(): + logger.info(model) + + if args.sync_bn: + assert args.distributed == True + model = nn.SyncBatchNorm.convert_sync_batchnorm(model) + + if args.distributed: + torch.cuda.set_device(gpu) + args.batch_size = int(args.batch_size / ngpus_per_node) + args.test_batch_size = int(args.test_batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[gpu], find_unused_parameters=True) + else: + model = torch.nn.DataParallel(model.cuda()) + + state_dict = torch.load("checkpoints/%s/best_model.t7" % args.exp_name, map_location=torch.device('cpu')) + + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + + model.load_state_dict(state_dict) + + # Dataloader + test_data = ModelNet40(partition='test', num_points=args.num_points) + if args.distributed: + test_sampler = torch.utils.data.distributed.DistributedSampler(test_data) + else: + test_sampler = None + test_loader = torch.utils.data.DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, sampler=test_sampler) + + model.eval() + + intersection_meter = AverageMeter() + union_meter = AverageMeter() + target_meter = AverageMeter() + + for data, label in test_loader: + + data, label = data.cuda(non_blocking=True), label.cuda(non_blocking=True).squeeze(1) + data = data.permute(0, 2, 1) + with torch.no_grad(): + logits = model(data) + preds = logits.max(dim=1)[1] + + intersection, union, target = intersectionAndUnionGPU(preds, label, args.classes) + if args.multiprocessing_distributed: + dist.all_reduce(intersection), dist.all_reduce(union), dist.all_reduce(target) + intersection, union, target = intersection.cpu().numpy(), union.cpu().numpy(), target.cpu().numpy() + intersection_meter.update(intersection), union_meter.update(union), target_meter.update(target) + + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) + if main_process(): + logger.info('Test result: mAcc/allAcc {:.4f}/{:.4f}.'.format(mAcc, allAcc)) + for i in range(args.classes): + logger.info('Class_{} Result: accuracy {:.4f}.'.format(i, accuracy_class[i])) + logger.info('<<<<<<<<<<<<<<<<< End Evaluation <<<<<<<<<<<<<<<<<') + + +def main_worker(gpu, ngpus_per_node, argss): + global args + args = argss + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, + rank=args.rank) + + if main_process(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main_ddp.py checkpoints' + '/' + args.exp_name + '/' + 'main_ddp.py.backup') + os.system('cp util/PAConv_util.py checkpoints' + '/' + args.exp_name + '/' + 'PAConv_util.py.backup') + os.system('cp util/data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + if args.arch == 'dgcnn': + os.system('cp model/DGCNN_PAConv.py checkpoints' + '/' + args.exp_name + '/' + 'DGCNN_PAConv.py.backup') + elif args.arch == 'pointnet': + os.system( + 'cp model/PointNet_PAConv.py checkpoints' + '/' + args.exp_name + '/' + 'PointNet_PAConv.py.backup') + + global logger, writer + writer = SummaryWriter('checkpoints/' + args.exp_name) + logger = get_logger() + logger.info(args) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + assert not args.eval, "The all_reduce function of PyTorch DDP will ignore/repeat inputs " \ + "(leading to the wrong result), " \ + "please use main.py to test (avoid DDP) for getting the right result." + train(gpu, ngpus_per_node) + + +if __name__ == "__main__": + args = get_parser() + args.gpu = [int(i) for i in os.environ['CUDA_VISIBLE_DEVICES'].split(',')] + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + cudnn.benchmark = False + cudnn.deterministic = True + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + args.ngpus_per_node = len(args.gpu) + if len(args.gpu) == 1: + args.sync_bn = False + args.distributed = False + args.multiprocessing_distributed = False + if args.multiprocessing_distributed: + port = find_free_port() + args.dist_url = f"tcp://127.0.0.1:{port}" + args.world_size = args.ngpus_per_node * args.world_size + mp.spawn(main_worker, nprocs=args.ngpus_per_node, args=(args.ngpus_per_node, args)) + else: + main_worker(args.gpu, args.ngpus_per_node, args) + diff --git a/zoo/PAConv/obj_cls/model/DGCNN_PAConv.py b/zoo/PAConv/obj_cls/model/DGCNN_PAConv.py new file mode 100644 index 0000000..adf1462 --- /dev/null +++ b/zoo/PAConv/obj_cls/model/DGCNN_PAConv.py @@ -0,0 +1,108 @@ +""" +Embed PAConv into DGCNN +""" + +import torch.nn as nn +import torch +import torch.nn.functional as F +from util.PAConv_util import get_scorenet_input, knn, feat_trans_dgcnn, ScoreNet +from cuda_lib.functional import assign_score_withk as assemble_dgcnn + + +class PAConv(nn.Module): + def __init__(self, args): + super(PAConv, self).__init__() + self.args = args + self.k = args.get('k_neighbors', 20) + self.calc_scores = args.get('calc_scores', 'softmax') + + self.m1, self.m2, self.m3, self.m4 = args.get('num_matrices', [8, 8, 8, 8]) + self.scorenet1 = ScoreNet(6, self.m1, hidden_unit=[16]) + self.scorenet2 = ScoreNet(6, self.m2, hidden_unit=[16]) + self.scorenet3 = ScoreNet(6, self.m3, hidden_unit=[16]) + self.scorenet4 = ScoreNet(6, self.m4, hidden_unit=[16]) + + i1 = 3 # channel dim of input_1st + o1 = i2 = 64 # channel dim of output_1st and input_2nd + o2 = i3 = 64 # channel dim of output_2st and input_3rd + o3 = i4 = 128 # channel dim of output_3rd and input_4th + o4 = 256 # channel dim of output_4th + + tensor1 = nn.init.kaiming_normal_(torch.empty(self.m1, i1 * 2, o1), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i1 * 2, self.m1 * o1) + tensor2 = nn.init.kaiming_normal_(torch.empty(self.m2, i2 * 2, o2), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i2 * 2, self.m2 * o2) + tensor3 = nn.init.kaiming_normal_(torch.empty(self.m3, i3 * 2, o3), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i3 * 2, self.m3 * o3) + tensor4 = nn.init.kaiming_normal_(torch.empty(self.m4, i4 * 2, o4), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m4 * o4) + + # convolutional weight matrices in Weight Bank: + self.matrice1 = nn.Parameter(tensor1, requires_grad=True) + self.matrice2 = nn.Parameter(tensor2, requires_grad=True) + self.matrice3 = nn.Parameter(tensor3, requires_grad=True) + self.matrice4 = nn.Parameter(tensor4, requires_grad=True) + + self.bn1 = nn.BatchNorm1d(o1, momentum=0.1) + self.bn2 = nn.BatchNorm1d(o2, momentum=0.1) + self.bn3 = nn.BatchNorm1d(o3, momentum=0.1) + self.bn4 = nn.BatchNorm1d(o4, momentum=0.1) + self.bn5 = nn.BatchNorm1d(1024, momentum=0.1) + self.conv5 = nn.Sequential(nn.Conv1d(512, 1024, kernel_size=1, bias=False), + self.bn5) + + self.linear1 = nn.Linear(2048, 512, bias=False) + self.bn11 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256, bias=False) + self.bn22 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, 40) + + def forward(self, x, label=None, criterion=None): + B, C, N = x.size() + idx, _ = knn(x, k=self.k) # different with DGCNN, the knn search is only in 3D space + xyz = get_scorenet_input(x, idx=idx, k=self.k) # ScoreNet input: 3D coord difference concat with coord: b,6,n,k + + ################## + # replace all the DGCNN-EdgeConv with PAConv: + """CUDA implementation of PAConv: (presented in the supplementary material of the paper)""" + """feature transformation:""" + point1, center1 = feat_trans_dgcnn(point_input=x, kernel=self.matrice1, m=self.m1) # b,n,m1,o1 + score1 = self.scorenet1(xyz, calc_scores=self.calc_scores, bias=0.5) + """assemble with scores:""" + point1 = assemble_dgcnn(score=score1, point_input=point1, center_input=center1, knn_idx=idx, aggregate='sum') # b,o1,n + point1 = F.relu(self.bn1(point1)) + + point2, center2 = feat_trans_dgcnn(point_input=point1, kernel=self.matrice2, m=self.m2) + score2 = self.scorenet2(xyz, calc_scores=self.calc_scores, bias=0.5) + point2 = assemble_dgcnn(score=score2, point_input=point2, center_input=center2, knn_idx=idx, aggregate='sum') + point2 = F.relu(self.bn2(point2)) + + point3, center3 = feat_trans_dgcnn(point_input=point2, kernel=self.matrice3, m=self.m3) + score3 = self.scorenet3(xyz, calc_scores=self.calc_scores, bias=0.5) + point3 = assemble_dgcnn(score=score3, point_input=point3, center_input=center3, knn_idx=idx, aggregate='sum') + point3 = F.relu(self.bn3(point3)) + + point4, center4 = feat_trans_dgcnn(point_input=point3, kernel=self.matrice4, m=self.m4) + score4 = self.scorenet4(xyz, calc_scores=self.calc_scores, bias=0.5) + point4 = assemble_dgcnn(score=score4, point_input=point4, center_input=center4, knn_idx=idx, aggregate='sum') + point4 = F.relu(self.bn4(point4)) + ################## + + point = torch.cat((point1, point2, point3, point4), dim=1) + point = F.relu(self.conv5(point)) + point11 = F.adaptive_max_pool1d(point, 1).view(B, -1) + point22 = F.adaptive_avg_pool1d(point, 1).view(B, -1) + point = torch.cat((point11, point22), 1) + + point = F.relu(self.bn11(self.linear1(point))) + point = self.dp1(point) + point = F.relu(self.bn22(self.linear2(point))) + point = self.dp2(point) + point = self.linear3(point) + + if criterion is not None: + return point, criterion(point, label) # return output and loss + else: + return point diff --git a/zoo/PAConv/obj_cls/model/PointNet_PAConv.py b/zoo/PAConv/obj_cls/model/PointNet_PAConv.py new file mode 100644 index 0000000..39f7afb --- /dev/null +++ b/zoo/PAConv/obj_cls/model/PointNet_PAConv.py @@ -0,0 +1,92 @@ +""" +Embed PAConv into PointNet +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F +from util.PAConv_util import get_scorenet_input, knn, feat_trans_pointnet, ScoreNet +from cuda_lib.functional import assign_score_withk_halfkernel as assemble_pointnet + + +class PAConv(nn.Module): + def __init__(self, args): + super(PAConv, self).__init__() + self.args = args + self.k = args.get('k_neighbors', 20) + self.calc_scores = args.get('calc_scores', 'softmax') + + self.m2, self.m3, self.m4 = args.get('num_matrices', [8, 8, 8]) + self.scorenet2 = ScoreNet(6, self.m2, hidden_unit=[16]) + self.scorenet3 = ScoreNet(6, self.m3, hidden_unit=[16]) + self.scorenet4 = ScoreNet(6, self.m4, hidden_unit=[16]) + + i2 = 64 # channel dim of output_1st and input_2nd + o2 = i3 = 64 # channel dim of output_2st and input_3rd + o3 = i4 = 64 # channel dim of output_3rd and input_4th + o4 = 128 # channel dim of output_4th and input_5th + + tensor2 = nn.init.kaiming_normal_(torch.empty(self.m2, i2, o2), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i2, self.m2 * o2) + tensor3 = nn.init.kaiming_normal_(torch.empty(self.m3, i3, o3), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i3, self.m3 * o3) + tensor4 = nn.init.kaiming_normal_(torch.empty(self.m4, i4, o4), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4, self.m4 * o4) + + # convolutional weight matrices in Weight Bank: + self.matrice2 = nn.Parameter(tensor2, requires_grad=True) + self.matrice3 = nn.Parameter(tensor3, requires_grad=True) + self.matrice4 = nn.Parameter(tensor4, requires_grad=True) + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.bn3 = nn.BatchNorm1d(64) + self.bn4 = nn.BatchNorm1d(128) + self.bn5 = nn.BatchNorm1d(1024) + + self.conv1 = nn.Conv1d(3, 64, kernel_size=1, bias=False) + self.conv5 = nn.Conv1d(128, 1024, kernel_size=1, bias=False) + + self.linear1 = nn.Linear(1024, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 40) + + def forward(self, x, label=None, criterion=None): + batch_size = x.size(0) + idx, _ = knn(x, k=self.k) # get the idx of knn in 3D space : b,n,k + xyz = get_scorenet_input(x, k=self.k, idx=idx) # ScoreNet input: 3D coord difference : b,6,n,k + + x = self.conv1(x) + x = F.relu(self.bn1(x)) + ################## + # replace the intermediate 3 MLP layers with PAConv: + """CUDA implementation of PAConv: (presented in the supplementary material of the paper)""" + """feature transformation:""" + x = feat_trans_pointnet(point_input=x, kernel=self.matrice2, m=self.m2) # b,n,m1,o1 + score2 = self.scorenet2(xyz, calc_scores=self.calc_scores, bias=0) + """assemble with scores:""" + x = assemble_pointnet(score=score2, point_input=x, knn_idx=idx, aggregate='sum') # b,o1,n + x = F.relu(self.bn2(x)) + + x = feat_trans_pointnet(point_input=x, kernel=self.matrice3, m=self.m3) + score3 = self.scorenet3(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_pointnet(score=score3, point_input=x, knn_idx=idx, aggregate='sum') + x = F.relu(self.bn3(x)) + + x = feat_trans_pointnet(point_input=x, kernel=self.matrice4, m=self.m4) + score4 = self.scorenet4(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_pointnet(score=score4, point_input=x, knn_idx=idx, aggregate='sum') + x = F.relu(self.bn4(x)) + ################## + x = self.conv5(x) + x = F.relu(self.bn5(x)) + + x = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x = F.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = self.linear2(x) + if criterion is not None: + return x, criterion(x, label) + else: + return x diff --git a/zoo/PAConv/obj_cls/util/PAConv_util.py b/zoo/PAConv/obj_cls/util/PAConv_util.py new file mode 100755 index 0000000..7355ad0 --- /dev/null +++ b/zoo/PAConv/obj_cls/util/PAConv_util.py @@ -0,0 +1,115 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def knn(x, k): + B, _, N = x.size() + inner = -2 * torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x ** 2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + _, idx = pairwise_distance.topk(k=k, dim=-1) # (batch_size, num_points, k) + + return idx, pairwise_distance + + +def get_scorenet_input(x, idx, k): + """(neighbor, neighbor-center)""" + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + xyz = torch.cat((neighbor - x, neighbor), dim=3).permute(0, 3, 1, 2) # b,6,n,k + + return xyz + + +def feat_trans_dgcnn(point_input, kernel, m): + """transforming features using weight matrices""" + # following get_graph_feature in DGCNN: torch.cat((neighbor - center, neighbor), dim=3) + B, _, N = point_input.size() # b, 2cin, n + point_output = torch.matmul(point_input.permute(0, 2, 1).repeat(1, 1, 2), kernel).view(B, N, m, -1) # b,n,m,cout + center_output = torch.matmul(point_input.permute(0, 2, 1), kernel[:point_input.size(1)]).view(B, N, m, -1) # b,n,m,cout + return point_output, center_output + + +def feat_trans_pointnet(point_input, kernel, m): + """transforming features using weight matrices""" + # no feature concat, following PointNet + B, _, N = point_input.size() # b, cin, n + point_output = torch.matmul(point_input.permute(0, 2, 1), kernel).view(B, N, m, -1) # b,n,m,cout + return point_output + + +class ScoreNet(nn.Module): + def __init__(self, in_channel, out_channel, hidden_unit=[16], last_bn=False): + super(ScoreNet, self).__init__() + self.hidden_unit = hidden_unit + self.last_bn = last_bn + self.mlp_convs_hidden = nn.ModuleList() + self.mlp_bns_hidden = nn.ModuleList() + + if hidden_unit is None or len(hidden_unit) == 0: + self.mlp_convs_nohidden = nn.Conv2d(in_channel, out_channel, 1, bias=not last_bn) + if self.last_bn: + self.mlp_bns_nohidden = nn.BatchNorm2d(out_channel) + + else: + self.mlp_convs_hidden.append(nn.Conv2d(in_channel, hidden_unit[0], 1, bias=False)) # from in_channel to first hidden + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[0])) + for i in range(1, len(hidden_unit)): # from 2nd hidden to next hidden to last hidden + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[i - 1], hidden_unit[i], 1, bias=False)) + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[i])) + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[-1], out_channel, 1, bias=not last_bn)) # from last hidden to out_channel + self.mlp_bns_hidden.append(nn.BatchNorm2d(out_channel)) + + def forward(self, xyz, calc_scores='softmax', bias=0): + B, _, N, K = xyz.size() + scores = xyz + + if self.hidden_unit is None or len(self.hidden_unit) == 0: + if self.last_bn: + scores = self.mlp_bns_nohidden(self.mlp_convs_nohidden(scores)) + else: + scores = self.mlp_convs_nohidden(scores) + else: + for i, conv in enumerate(self.mlp_convs_hidden): + if i == len(self.mlp_convs_hidden)-1: # if the output layer, no ReLU + if self.last_bn: + bn = self.mlp_bns_hidden[i] + scores = bn(conv(scores)) + else: + scores = conv(scores) + else: + bn = self.mlp_bns_hidden[i] + scores = F.relu(bn(conv(scores))) + + if calc_scores == 'softmax': + scores = F.softmax(scores, dim=1)+bias # B*m*N*K, where bias may bring larger gradient + elif calc_scores == 'sigmoid': + scores = torch.sigmoid(scores)+bias # B*m*N*K + else: + raise ValueError('Not Implemented!') + + scores = scores.permute(0, 2, 3, 1) # B*N*K*m + + return scores \ No newline at end of file diff --git a/zoo/PAConv/obj_cls/util/__init__.py b/zoo/PAConv/obj_cls/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PAConv/obj_cls/util/data_util.py b/zoo/PAConv/obj_cls/util/data_util.py new file mode 100755 index 0000000..2690379 --- /dev/null +++ b/zoo/PAConv/obj_cls/util/data_util.py @@ -0,0 +1,62 @@ +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset + + +def load_data(partition): + all_data = [] + all_label = [] + for h5_name in glob.glob('./data/modelnet40_ply_hdf5_2048/ply_data_%s*.h5' % partition): + f = h5py.File(h5_name, mode='r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2. / 3., high=3. / 2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1 * clip, clip) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, num_points, partition='train', pt_norm=False): + self.data, self.label = load_data(partition) + self.num_points = num_points + self.partition = partition + self.pt_norm = pt_norm + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + if self.partition == 'train': + if self.pt_norm: + pointcloud = pc_normalize(pointcloud) + pointcloud = translate_pointcloud(pointcloud) + np.random.shuffle(pointcloud) # shuffle the order of pts + return pointcloud, label + + def __len__(self): + return self.data.shape[0] diff --git a/zoo/PAConv/obj_cls/util/util.py b/zoo/PAConv/obj_cls/util/util.py new file mode 100755 index 0000000..a0670de --- /dev/null +++ b/zoo/PAConv/obj_cls/util/util.py @@ -0,0 +1,251 @@ +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) # gold is the groundtruth label in the dataloader + + if smoothing: + eps = 0.2 + n_class = pred.size(1) # the number of feature_dim of the output, which is output channels + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +# create a file and write the text into it +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + + +# ----------------------------------------------------------------------------- +# Functions for parsing args +# ----------------------------------------------------------------------------- +import yaml +import os +from ast import literal_eval +import copy + + +class CfgNode(dict): + """ + CfgNode represents an internal node in the configuration tree. It's a simple + dict-like container that allows for attribute-based access to keys. + """ + + def __init__(self, init_dict=None, key_list=None, new_allowed=False): + # Recursively convert nested dictionaries in init_dict into CfgNodes + init_dict = {} if init_dict is None else init_dict + key_list = [] if key_list is None else key_list + for k, v in init_dict.items(): + if type(v) is dict: + # Convert dict to CfgNode + init_dict[k] = CfgNode(v, key_list=key_list + [k]) + super(CfgNode, self).__init__(init_dict) + + def __getattr__(self, name): + if name in self: + return self[name] + else: + raise AttributeError(name) + + def __setattr__(self, name, value): + self[name] = value + + def __str__(self): + def _indent(s_, num_spaces): + s = s_.split("\n") + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(num_spaces * " ") + line for line in s] + s = "\n".join(s) + s = first + "\n" + s + return s + + r = "" + s = [] + for k, v in sorted(self.items()): + seperator = "\n" if isinstance(v, CfgNode) else " " + attr_str = "{}:{}{}".format(str(k), seperator, str(v)) + attr_str = _indent(attr_str, 2) + s.append(attr_str) + r += "\n".join(s) + return r + + def __repr__(self): + return "{}({})".format(self.__class__.__name__, super(CfgNode, self).__repr__()) + + +def load_cfg_from_cfg_file(file): + cfg = {} + assert os.path.isfile(file) and file.endswith('.yaml'), \ + '{} is not a yaml file'.format(file) + + with open(file, 'r') as f: + cfg_from_file = yaml.safe_load(f) + + for key in cfg_from_file: + for k, v in cfg_from_file[key].items(): + cfg[k] = v + + cfg = CfgNode(cfg) + return cfg + + +def merge_cfg_from_list(cfg, cfg_list): + new_cfg = copy.deepcopy(cfg) + assert len(cfg_list) % 2 == 0 + for full_key, v in zip(cfg_list[0::2], cfg_list[1::2]): + subkey = full_key.split('.')[-1] + assert subkey in cfg, 'Non-existent key: {}'.format(full_key) + value = _decode_cfg_value(v) + value = _check_and_coerce_cfg_value_type( + value, cfg[subkey], subkey, full_key + ) + setattr(new_cfg, subkey, value) + + return new_cfg + + +def _decode_cfg_value(v): + """Decodes a raw config value (e.g., from a yaml config files or command + line argument) into a Python object. + """ + # All remaining processing is only applied to strings + if not isinstance(v, str): + return v + # Try to interpret `v` as a: + # string, number, tuple, list, dict, boolean, or None + try: + v = literal_eval(v) + # The following two excepts allow v to pass through when it represents a + # string. + # + # Longer explanation: + # The type of v is always a string (before calling literal_eval), but + # sometimes it *represents* a string and other times a data structure, like + # a list. In the case that v represents a string, what we got back from the + # yaml parser is 'foo' *without quotes* (so, not '"foo"'). literal_eval is + # ok with '"foo"', but will raise a ValueError if given 'foo'. In other + # cases, like paths (v = 'foo/bar' and not v = '"foo/bar"'), literal_eval + # will raise a SyntaxError. + except ValueError: + pass + except SyntaxError: + pass + return v + + +def _check_and_coerce_cfg_value_type(replacement, original, key, full_key): + """Checks that `replacement`, which is intended to replace `original` is of + the right type. The type is correct if it matches exactly or is one of a few + cases in which the type can be easily coerced. + """ + original_type = type(original) + replacement_type = type(replacement) + + # The types must match (with some exceptions) + if replacement_type == original_type: + return replacement + + # Cast replacement from from_type to to_type if the replacement and original + # types match from_type and to_type + def conditional_cast(from_type, to_type): + if replacement_type == from_type and original_type == to_type: + return True, to_type(replacement) + else: + return False, None + + # Conditionally casts + # list <-> tuple + casts = [(tuple, list), (list, tuple)] + # For py2: allow converting from str (bytes) to a unicode string + try: + casts.append((str, unicode)) # noqa: F821 + except Exception: + pass + + for (from_type, to_type) in casts: + converted, converted_value = conditional_cast(from_type, to_type) + if converted: + return converted_value + + raise ValueError( + "Type mismatch ({} vs. {}) with values ({} vs. {}) for config " + "key: {}".format( + original_type, replacement_type, original, replacement, full_key + ) + ) + + +def _assert_with_logging(cond, msg): + if not cond: + logger.debug(msg) + assert cond, msg + + +def find_free_port(): + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Binding to port 0 will cause the OS to find an available port for us + sock.bind(("", 0)) + port = sock.getsockname()[1] + sock.close() + # NOTE: there is still a chance the port could be taken by other processes. + return port + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): # n is the batch size, update all variables + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +def intersectionAndUnionGPU(output, target, K, ignore_index=255): + # 'K' classes, output and target sizes are N or N * L or N * H * W, each value in range 0 to K - 1. + assert (output.dim() in [1, 2, 3]) + assert output.shape == target.shape + output = output.view(-1) + target = target.view(-1) + output[target == ignore_index] = ignore_index + intersection = output[output == target] + # assert len(intersection) > 0 + if len(intersection) > 0: + area_intersection = torch.histc(intersection, bins=K, min=0, max=K-1) + else: + area_intersection = torch.zeros(K, dtype=output.dtype, device=output.device) + area_output = torch.histc(output, bins=K, min=0, max=K-1) + area_target = torch.histc(target, bins=K, min=0, max=K-1) + area_union = area_output + area_target - area_intersection + return area_intersection, area_union, area_target diff --git a/zoo/PAConv/part_seg/README.md b/zoo/PAConv/part_seg/README.md new file mode 100644 index 0000000..191096a --- /dev/null +++ b/zoo/PAConv/part_seg/README.md @@ -0,0 +1,82 @@ +3D Shape Part Segmentation +============================ + + +## Installation + +### Requirements +* Hardware: GPUs to hold 14000MB +* Software: + Linux (tested on Ubuntu 18.04) + PyTorch>=1.5.0, Python>=3, CUDA>=10.1, tensorboardX, tqdm, pyYaml + +### Dataset +Download and unzip [ShapeNet Part](https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip) (674M). Then symlink the paths to it as follows (you can alternatively modify the path [here](https://github.com/CVMI-Lab/PAConv/blob/main/part_seg/util/data_util.py#L20)): +``` +mkdir -p data +ln -s /path to shapenet part/shapenetcore_partanno_segmentation_benchmark_v0_normal data +``` + +## Usage + +* Build the CUDA kernel: + + When you run the program for the first time, please wait a few moments for compiling the [cuda_lib](./cuda_lib) **automatically**. + Once the CUDA kernel is built, the program will skip this in the future running. + + +* Train: + + * Multi-thread training ([nn.DataParallel](https://pytorch.org/docs/stable/nn.html#dataparallel)) : + + * `python main.py --config config/dgcnn_paconv_train.yaml` (Embed PAConv into [DGCNN](https://arxiv.org/abs/1801.07829)) + + + * We also provide a fast **multi-process training** ([nn.parallel.DistributedDataParallel](https://pytorch.org/docs/stable/_modules/torch/nn/parallel/distributed.html), **recommended**) with official [nn.SyncBatchNorm](https://pytorch.org/docs/master/nn.html#torch.nn.SyncBatchNorm). Please also remind to specify the GPU ID: + + * `CUDA_VISIBLE_DEVICES=x,x python main_ddp.py --config config/dgcnn_paconv_train.yaml` (Embed PAConv into [DGCNN](https://arxiv.org/abs/1801.07829)) + + +* Test: + * Download our [pretrained model](https://drive.google.com/drive/folders/1mIahmPMeCdX5WyUOGa0IrdEtBEzBUa67?usp=sharing) and put it under the [part_seg](/part_seg) folder. + + * Run the voting evaluation script to test our pretrained models, after this voting you will get an instance mIoU of 86.1% if all things go right: + + `python eval_voting.py --config config/dgcnn_paconv_test.yaml` + + * You can also directly test our pretrained model without voting to get an instance mIoU of 86.0%: + + `python main.py --config config/dgcnn_paconv_test.yaml` + + * For full test after training the model: + * Specify the `eval` to `True` in your config file. + + * Make sure to use **[main.py](main.py)** (main_ddp.py may lead to wrong result due to the repeating problem of all_reduce function in multi-process training) : + + `python main.py --config config/your config file.yaml` + + * You can choose to test the model with the best instance mIoU, class mIoU or accuracy, by specifying `model_type` to `insiou`, `clsiou` or `acc` in the test config file. + +* Visualization: [tensorboardX](https://github.com/lanpa/tensorboardX) incorporated for better visualization. + + `tensorboard --logdir=checkpoints/exp_name` + + +## Citation +If you find the code or trained models useful, please consider citing: +``` +@inproceedings{xu2021paconv, + title={PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds}, + author={Xu, Mutian and Ding, Runyu and Zhao, Hengshuang and Qi, Xiaojuan}, + booktitle={CVPR}, + year={2021} +} +``` + +## Contact + +You are welcome to send pull requests or share some ideas with us. Contact information: Mutian Xu (mino1018@outlook.com) or Runyu Ding (ryding@eee.hku.hk). + + +## Acknowledgement +This code is is partially borrowed from [DGCNN](https://github.com/WangYueFt/dgcnn) and [PointNet++](https://github.com/charlesq34/pointnet2). diff --git a/zoo/PAConv/part_seg/config/dgcnn_paconv_test.yaml b/zoo/PAConv/part_seg/config/dgcnn_paconv_test.yaml new file mode 100644 index 0000000..3a4d9bc --- /dev/null +++ b/zoo/PAConv/part_seg/config/dgcnn_paconv_test.yaml @@ -0,0 +1,15 @@ +MODEL: + num_matrices: [8, 8, 8, 8] + k_neighbors: 30 + calc_scores: softmax + hidden: [[16,16,16],[16,16,16],[16,16,16],[16,16,16]] + +TEST: + exp_name: dgcnn_paconv_test + num_points: 2048 + test_batch_size: 16 + workers: 6 + no_cuda: False + eval: True + dropout: 0.4 + model_type: insiou # choose to test the best insiou/clsiou/acc model \ No newline at end of file diff --git a/zoo/PAConv/part_seg/config/dgcnn_paconv_train.yaml b/zoo/PAConv/part_seg/config/dgcnn_paconv_train.yaml new file mode 100644 index 0000000..741bd35 --- /dev/null +++ b/zoo/PAConv/part_seg/config/dgcnn_paconv_train.yaml @@ -0,0 +1,22 @@ +MODEL: + num_matrices: [8, 8, 8, 8] + k_neighbors: 30 + calc_scores: softmax + hidden: [[16,16,16],[16,16,16],[16,16,16],[16,16,16]] + +TRAIN: + exp_name: dgcnn_paconv_train_3 + num_points: 2048 + batch_size: 128 + test_batch_size: 16 + workers: 6 + epochs: 200 + use_sgd: False # use sgd or adam + lr: 0.003 + momentum: 0.9 + scheduler: step + no_cuda: False + eval: False + dropout: 0.4 + step: 40 # lr decay step + weight_decay: 0 \ No newline at end of file diff --git a/zoo/PAConv/part_seg/cuda_lib/__init__.py b/zoo/PAConv/part_seg/cuda_lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PAConv/part_seg/cuda_lib/functional.py b/zoo/PAConv/part_seg/cuda_lib/functional.py new file mode 100644 index 0000000..a494c3c --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/functional.py @@ -0,0 +1,7 @@ +from . import functions + + +def assign_score_withk(score, point_input, center_input, knn_idx, aggregate='sum'): + return functions.assign_score_withk(score, point_input, center_input, knn_idx, aggregate) + + diff --git a/zoo/PAConv/part_seg/cuda_lib/functions/__init__.py b/zoo/PAConv/part_seg/cuda_lib/functions/__init__.py new file mode 100644 index 0000000..df9d06f --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/functions/__init__.py @@ -0,0 +1 @@ +from .assignscore import * \ No newline at end of file diff --git a/zoo/PAConv/part_seg/cuda_lib/functions/assignscore.py b/zoo/PAConv/part_seg/cuda_lib/functions/assignscore.py new file mode 100644 index 0000000..7a19aab --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/functions/assignscore.py @@ -0,0 +1,67 @@ +import torch +from torch.autograd import Function + +from .. import src + + +class AssignScoreWithK(Function): + @staticmethod + def forward(ctx, scores, points, centers, knn_idx, aggregate) : # -> torch.Tensor: + """ + :param ctx + :param scores: (B, N, K, M) + :param points: (B, N, M, O) + :param centers: (B, N, M, O) + :param knn_idx: (B, N, K) + :param aggregate: + :return: output: (B, O, N) + """ + + agg = {'sum': 0, 'avg': 1, 'max': 2} + + B, N, M, O = points.size() + K = scores.size(2) + + output = torch.zeros([B, O, N], dtype=points.dtype, device=points.device) + output = output.contiguous() + + src.gpu.assign_score_withk_forward_cuda(B, N, M, K, O, agg[aggregate], + points.contiguous(), centers.contiguous(), + scores.contiguous(), knn_idx.contiguous(), + output) + + ctx.save_for_backward(output, points, centers, scores, knn_idx) + ctx.agg = agg[aggregate] + + return output + + @staticmethod + def backward(ctx, grad_out): + """ + + :param ctx: + :param grad_out: (B, O, N) tensor with gradients of ouputs + :return: grad_scores: (B, N, K, M) tensor with gradients of scores + :return: grad_points: (B, N, M, O) tensor with gradients of point features + :return: grad_centers: (B, N, M, O) tensor with gradients of center point features + """ + output, points, centers, scores, knn_idx = ctx.saved_tensors + + agg = ctx.agg + + B, N, M, O = points.size() + K = scores.size(2) + + grad_points = torch.zeros_like(points, dtype=points.dtype, device=points.device).contiguous() + grad_centers = torch.zeros_like(centers, dtype=points.dtype, device=points.device).contiguous() + grad_scores = torch.zeros_like(scores, dtype=scores.dtype, device=scores.device).contiguous() + + src.gpu.assign_score_withk_backward_cuda(B, N, M, K, O, agg, grad_out.contiguous(), + points.contiguous(), centers.contiguous(), + scores.contiguous(), knn_idx.contiguous(), + grad_points, grad_centers, grad_scores) + + return grad_scores, grad_points, grad_centers, None, None, None + + +assign_score_withk = AssignScoreWithK.apply diff --git a/zoo/PAConv/part_seg/cuda_lib/src/__init__.py b/zoo/PAConv/part_seg/cuda_lib/src/__init__.py new file mode 100644 index 0000000..577c733 --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/__init__.py @@ -0,0 +1,14 @@ +import os +import torch +from torch.utils.cpp_extension import load + +cwd = os.path.dirname(os.path.realpath(__file__)) +gpu_path = os.path.join(cwd, 'gpu') + +if torch.cuda.is_available(): + gpu = load('gpconv_cuda', [ + os.path.join(gpu_path, 'operator.cpp'), + os.path.join(gpu_path, 'assign_score_withk_gpu.cu'), + ], build_directory=gpu_path, verbose=False) + + diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/.ninja_deps b/zoo/PAConv/part_seg/cuda_lib/src/gpu/.ninja_deps new file mode 100644 index 0000000..302c71c Binary files /dev/null and b/zoo/PAConv/part_seg/cuda_lib/src/gpu/.ninja_deps differ diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/.ninja_log b/zoo/PAConv/part_seg/cuda_lib/src/gpu/.ninja_log new file mode 100644 index 0000000..948eec9 --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/.ninja_log @@ -0,0 +1,12 @@ +# ninja log v5 +1 29317 1644583731000000000 operator.o 37cbb46becd7c2fc +1 18658 1645316842000000000 operator.o b2128e73136252e0 +1 57698 1645316881000000000 assign_score_withk_gpu.cuda.o d069ea62f0a82020 +57699 57922 1645316881000000000 gpconv_cuda.so 139c02a8b8ded873 +1 18986 1645318472000000000 operator.o d492d457e3e2bc38 +2 18284 1645318829000000000 operator.o b2128e73136252e0 +18286 18441 1645318829000000000 gpconv_cuda.so 139c02a8b8ded873 +3 23442 1645319819000000000 operator.o 37cbb46becd7c2fc +3 19314 1645331459000000000 operator.o c3e903a2ae3c5191 +5 18662 1645331537000000000 operator.o b2128e73136252e0 +18665 18822 1645331538000000000 gpconv_cuda.so 139c02a8b8ded873 diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cu b/zoo/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cu new file mode 100644 index 0000000..d4ed602 --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cu @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include "cuda_utils.h" +#include "utils.h" + + +// input: points(B,N,M,O), centers(B,N,M,O), scores(B,N,K,M), idx(B,N,K) +// ouput: fout(B,O,N) +// algo: fout(b,i,k,j) = s(b,i,k,m)*p(b,i,k,m,j) = s(b,i,k,m)*p(b,i(k),m,j) +// i(k) = idx(b,i,k) +// sum: fout(b,i,j) = fout(b,i,j) + s(b,i,k,m)*p(b,i,k,m,j) +// avg: fout(b,i,j) = sum(fout(b,i,k,j)) / k +// max: fout(b,i,j) = max(fout(b,i,k,j), sum(s(b,i,k,m)*p(b,i,k,m,j))) +// k,m : sequential +// b,n: parallel + +const int SUM = 0; +const int AVG = 1; +const int MAX = 2; + +#ifndef _CLOCK_T_DEFINED +typedef long clock_t; +#define _CLOCK_T_DEFINED +#endif + +__global__ void assign_score_withk_forward_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* points, + const float* centers, + const float* scores, + const long* knn_idx, + float* output) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for B, N and O --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + // ----- loop for K --------- + for (int k = 0; k < K; k++) { + // ------- loop for M ---------- + for (int m = 0; m < M; m++) { + int b = (int)(i / (O * N)); + int n = (int)(i % (O * N) / O); + // int k = (int)(i % (O * K * M) / (O * M)); + // int m = (int)(i % (O * M) / O); + int o = (int)(i % O); + int kn = (int) knn_idx[b*K*N + n*K + k]; + assert (b < B); + assert (kn < N); + assert (o < O); + assert (n < N); + + if (aggregate == SUM) { + // feature concat + // output[b*N*O + o*N + n] += 2 * points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]; + // output[b*N*O + o*N + n] -= points[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]; + atomicAdd(output + b*N*O + o*N + n, + points[b*N*M*O + kn*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m] + - centers[b*N*M*O + n*M*O + m*O + o] * scores[b*N*K*M + n*K*M + k*M + m]); + } + else if (aggregate == AVG) { + output[o*N + n] += 2 * points[kn*M*O + m*O + o] * scores[n*K*M + k*M + m] / K; + output[o*N + n] -= points[n*M*O + m*O + o] * scores[n*K*M + k*M + m] / K; + } + else if (aggregate == MAX) { + /*** + float tmp = points[i*K*M + k*M + m] * scores[((int)(i/O))*K*M + k*M + m]; + output[i] = tmp > output[i] ? tmp: output[i]; + ***/ + } + } + } + } + + // finish = clock(); + // printf("assign socre forward time:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); +} + + +__global__ void assign_score_withk_backward_points_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* grad_out, + const float* scores, + const long* knn_idx, + float* grad_points, + float* grad_centers) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for M, O --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + int b = (int)(i / (M * O)); + int m = (int)(i % (M * O) / O); + int o = (int)(i % O); + + // ----- loop for N,K --------- + for (int n = 0; n < N; n++) { + for (int k = 0; k < K; k++) { + int kn = knn_idx[b*N*K + n*K + k]; + atomicAdd(grad_points + b*N*M*O + kn*M*O + m*O + o, + scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]); + atomicAdd(grad_centers + b*N*M*O + n*M*O + m*O + o, + - scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]); + //grad_points[b*N*M*O + kn*M*O + m*O + o] += 2 * scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]; + //grad_points[b*N*M*O + n*M*O + m*O + o] -= scores[b*N*K*M + n*K*M + k*M + m] * grad_out[b*O*N + o*N + n]; + } + } + } + // finish = clock(); + // printf("assign socre backward time 1:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); + +} + + +__global__ void assign_score_withk_backward_scores_kernel(const int nthreads, const int B, const int N, const int M, + const int K, const int O, const int aggregate, + const float* grad_out, + const float* points, + const float* centers, + const long* knn_idx, + float* grad_scores) { + + // clock_t start, finish; + // start = clock(); + + // ----- parallel loop for N, K, M --------- + for (long i = blockIdx.x * blockDim.x + threadIdx.x; i < nthreads; i += blockDim.x * gridDim.x) { + // for (int i = index; i < N*K*M; i += stride) { + int b = (int)(i / (N * M * K)); + int n = (int)(i % (N * M * K) / M / K); + int k = (int)(i % (M * K) / M); + int m = (int)(i % M); + int kn = knn_idx[b*N*K + n*K + k]; + + for(int o = 0; o < O; o++) { + atomicAdd(grad_scores + b*N*K*M + n*K*M + k*M + m, + (points[b*N*M*O + kn*M*O + m*O + o] + - centers[b*N*M*O + n*M*O + m*O + o])* grad_out[b*O*N + o*N + n]); + // grad_scores[b*N*K*M + n*K*M + k*M + m] += (2 * points[b*N*M*O + kn*M*O + m*O + o] - points[b*N*M*O + n*M*O + m*O + o])* grad_out[b*O*N + o*N + n]; + } + } + + // finish = clock(); + // printf("assign socre backward time 2:blockid %d, %f\n", batch_idx, (double)(finish - start)/10000.0); +} + + +void assign_score_withk_forward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& output) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(centers); + CHECK_CONTIGUOUS(scores); + CHECK_CONTIGUOUS(knn_idx); + CHECK_CONTIGUOUS(output); + + const float* points_data = points.data_ptr(); + const float* centers_data = centers.data_ptr(); + const float* scores_data = scores.data_ptr(); + const long* knn_idx_data = knn_idx.data_ptr(); + float* output_data = output.data_ptr(); + + int nthreads = B * N * O; // * K * M; + + assign_score_withk_forward_kernel<<>>( + nthreads, B, N, M, K, O, aggregate, points_data, centers_data, scores_data, knn_idx_data, output_data); + + CUDA_CHECK_ERRORS(); + +} + + +void assign_score_withk_backward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& grad_out, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& grad_points, + at::Tensor& grad_centers, + at::Tensor& grad_scores) { + + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(scores); + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(centers); + CHECK_CONTIGUOUS(knn_idx); + CHECK_CONTIGUOUS(grad_scores); + CHECK_CONTIGUOUS(grad_points); + CHECK_CONTIGUOUS(grad_centers); + + const float* grad_out_data = grad_out.data_ptr(); + const float* points_data = points.data_ptr(); + const float* centers_data = centers.data_ptr(); + const float* scores_data = scores.data_ptr(); + const long* knn_idx_data = knn_idx.data_ptr(); + float* grad_points_data = grad_points.data_ptr(); + float* grad_centers_data = grad_centers.data_ptr(); + float* grad_scores_data = grad_scores.data_ptr(); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + int nthreads_1 = B * M * O; + int nthreads_2 = B * N * K * M; + + assign_score_withk_backward_points_kernel<<>>( + nthreads_1, B, N, M, K, O, aggregate, grad_out_data, scores_data, knn_idx_data, grad_points_data, grad_centers_data); + assign_score_withk_backward_scores_kernel<<>>( + nthreads_2, B, N, M, K, O, aggregate, grad_out_data, points_data, centers_data, knn_idx_data, grad_scores_data); + + CUDA_CHECK_ERRORS(); + +} diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cuda.o b/zoo/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cuda.o new file mode 100644 index 0000000..c0f0081 Binary files /dev/null and b/zoo/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cuda.o differ diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/build.ninja b/zoo/PAConv/part_seg/cuda_lib/src/gpu/build.ninja new file mode 100644 index 0000000..7f34217 --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/build.ninja @@ -0,0 +1,26 @@ +ninja_required_version = 1.3 +cxx = /mnt/lustre/share/gcc/gcc-5.3.0/bin/c++ +nvcc = /mnt/lustre/share/cuda-10.0/bin/nvcc + +cflags = -DTORCH_EXTENSION_NAME=gpconv_cuda -DTORCH_API_INCLUDE_EXTENSION_H -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include/torch/csrc/api/include -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include/TH -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include/THC -isystem /mnt/lustre/share/cuda-10.0/include -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/include/python3.7m -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -std=c++11 +cuda_flags = -DTORCH_EXTENSION_NAME=gpconv_cuda -DTORCH_API_INCLUDE_EXTENSION_H -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include/torch/csrc/api/include -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include/TH -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/lib/python3.7/site-packages/torch/include/THC -isystem /mnt/lustre/share/cuda-10.0/include -isystem /mnt/lustre/ldkong/anaconda3/envs/modelnetc/include/python3.7m -D_GLIBCXX_USE_CXX11_ABI=0 -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr -gencode=arch=compute_70,code=sm_70 --compiler-options '-fPIC' -std=c++11 +ldflags = -shared -L/mnt/lustre/share/cuda-10.0/lib64 -lcudart + +rule compile + command = $cxx -MMD -MF $out.d $cflags -c $in -o $out + depfile = $out.d + deps = gcc + +rule cuda_compile + command = $nvcc $cuda_flags -c $in -o $out + +rule link + command = $cxx $in $ldflags -o $out + +build operator.o: compile /mnt/lustre/ldkong/models/PAConv/part_seg/cuda_lib/src/gpu/operator.cpp +build assign_score_withk_gpu.cuda.o: cuda_compile /mnt/lustre/ldkong/models/PAConv/part_seg/cuda_lib/src/gpu/assign_score_withk_gpu.cu + +build gpconv_cuda.so: link operator.o assign_score_withk_gpu.cuda.o + +default gpconv_cuda.so + diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/cuda_utils.h b/zoo/PAConv/part_seg/cuda_lib/src/gpu/cuda_utils.h new file mode 100644 index 0000000..dbce9e0 --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/cuda_utils.h @@ -0,0 +1,41 @@ +#ifndef _CUDA_UTILS_H +#define _CUDA_UTILS_H + +#include +#include +#include + +#include +#include + +#include + +#define TOTAL_THREADS 512 + +inline int opt_n_threads(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + + return max(min(1 << pow_2, TOTAL_THREADS), 1); +} + +inline dim3 opt_block_config(int x, int y) { + const int x_threads = opt_n_threads(x); + const int y_threads = + max(min(opt_n_threads(y), TOTAL_THREADS / x_threads), 1); + dim3 block_config(x_threads, y_threads, 1); + + return block_config; +} + +#define CUDA_CHECK_ERRORS() \ + do { \ + cudaError_t err = cudaGetLastError(); \ + if (cudaSuccess != err) { \ + fprintf(stderr, "CUDA kernel failed : %s\n%s at L:%d in %s\n", \ + cudaGetErrorString(err), __PRETTY_FUNCTION__, __LINE__, \ + __FILE__); \ + exit(-1); \ + } \ + } while (0) + +#endif diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.cpp b/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.cpp new file mode 100644 index 0000000..9ce001d --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.cpp @@ -0,0 +1,6 @@ +#include "operator.h" + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("assign_score_withk_forward_cuda", &assign_score_withk_forward_kernel_wrapper, "Assign score kernel forward (GPU), save memory version"); + m.def("assign_score_withk_backward_cuda", &assign_score_withk_backward_kernel_wrapper, "Assign score kernel backward (GPU), save memory version"); +} diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.h b/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.h new file mode 100644 index 0000000..2aa5998 --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.h @@ -0,0 +1,28 @@ +// +// Created by Runyu Ding on 2020/8/12. +// + +#ifndef _OPERATOR_H +#define _OPERATOR_H + +#include + +void assign_score_withk_forward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& output); + +void assign_score_withk_backward_kernel_wrapper(int B, int N, int M, int K, int O, int aggregate, + const at::Tensor& grad_out, + const at::Tensor& points, + const at::Tensor& centers, + const at::Tensor& scores, + const at::Tensor& knn_idx, + at::Tensor& grad_points, + at::Tensor& grad_centers, + at::Tensor& grad_scores); + + +#endif \ No newline at end of file diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.o b/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.o new file mode 100644 index 0000000..37b21b3 Binary files /dev/null and b/zoo/PAConv/part_seg/cuda_lib/src/gpu/operator.o differ diff --git a/zoo/PAConv/part_seg/cuda_lib/src/gpu/utils.h b/zoo/PAConv/part_seg/cuda_lib/src/gpu/utils.h new file mode 100644 index 0000000..5f080ed --- /dev/null +++ b/zoo/PAConv/part_seg/cuda_lib/src/gpu/utils.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include + +#define CHECK_CUDA(x) \ + do { \ + AT_ASSERT(x.is_cuda(), #x " must be a CUDA tensor"); \ + } while (0) + +#define CHECK_CONTIGUOUS(x) \ + do { \ + AT_ASSERT(x.is_contiguous(), #x " must be a contiguous tensor"); \ + } while (0) + +#define CHECK_IS_INT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Int, \ + #x " must be an int tensor"); \ + } while (0) + +#define CHECK_IS_FLOAT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Float, \ + #x " must be a float tensor"); \ + } while (0) diff --git a/zoo/PAConv/part_seg/debug.py b/zoo/PAConv/part_seg/debug.py new file mode 100644 index 0000000..0cc4107 --- /dev/null +++ b/zoo/PAConv/part_seg/debug.py @@ -0,0 +1,19 @@ +from util.data_util import PartNormalDataset, ShapeNetC +from torch.utils.data import DataLoader +from torch.autograd import Variable + + + +# test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) +test_data = ShapeNetC(partition='shapenet-c', sub='clean', class_choice=None) +print("The number of test data is: {}".format(len(test_data))) + +test_loader = DataLoader(test_data, batch_size=16, shuffle=False, num_workers=6, drop_last=False) + + +for batch_id, (points, label, target, norm_plt) in enumerate(test_loader): + batch_size, num_point, _ = points.size() + points, label, target, norm_plt = Variable(points.float()), Variable(label.long()), Variable(target.long()), Variable(norm_plt.float()) + points = points.transpose(2, 1) + norm_plt = norm_plt.transpose(2, 1) + points, label, target, norm_plt = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True), norm_plt.cuda(non_blocking=True) diff --git a/zoo/PAConv/part_seg/eval_voting.py b/zoo/PAConv/part_seg/eval_voting.py new file mode 100644 index 0000000..796e74e --- /dev/null +++ b/zoo/PAConv/part_seg/eval_voting.py @@ -0,0 +1,186 @@ +from __future__ import print_function +import os +import argparse +import torch +from util.data_util import PartNormalDataset +from model.DGCNN_PAConv_vote import PAConv +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, load_cfg_from_cfg_file, merge_cfg_from_list, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import torch.nn.functional as F + +classes_str =['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +class PointcloudScale(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2.): + self.scale_low = scale_low + self.scale_high = scale_high + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz).float().cuda()) + return pc + + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--config', type=str, default='dgcnn_paconv_test.yaml', help='config file') + parser.add_argument('opts', help='see config/dgcnn_paconv_test.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + return cfg + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + # backup the running files: + os.system('cp eval_voting.py checkpoints' + '/' + args.exp_name + '/' + 'eval_voting.py.backup') + + +def test(args, io): + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = PAConv(args, num_part).to(device) + io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + # Dataloader + test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=args.workers, + drop_last=False) + + NUM_PEPEAT = 100 + NUM_VOTE = 10 + global_Class_mIoU, global_Inst_mIoU = 0, 0 + global_total_per_cat_iou = np.zeros((16)).astype(np.float32) + num_part = 50 + num_classes = 16 + pointscale = PointcloudScale(scale_low=0.87, scale_high=1.15) + + model.eval() + + for i in range(NUM_PEPEAT): + + metrics = defaultdict(lambda: list()) + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target, norm_plt) in tqdm(enumerate(test_loader), total=len(test_loader), + smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target, norm_plt = Variable(points.float()), Variable(label.long()), Variable( + target.long()), Variable(norm_plt.float()) + # points = points.transpose(2, 1) + norm_plt = norm_plt.transpose(2, 1) + points, label, target, norm_plt = points.cuda(non_blocking=True), label.squeeze().cuda( + non_blocking=True), target.cuda(non_blocking=True), norm_plt.cuda(non_blocking=True) + + seg_pred = 0 + new_points = Variable(torch.zeros(points.size()[0], points.size()[1], points.size()[2]).cuda(), + volatile=True) + + for v in range(NUM_VOTE): + if v > 0: + new_points.data = pointscale(points.data) + with torch.no_grad(): + seg_pred += F.softmax( + model(points.contiguous().transpose(2, 1), new_points.contiguous().transpose(2, 1), + norm_plt, to_categorical(label, num_classes)), dim=2) # xyz,x: only scale feature input + seg_pred /= NUM_VOTE + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + print('\n------ Repeat %3d ------' % (i + 1)) + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test class mIOU: %f, test instance mIOU: %f' % (avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + if avg_class_iou > global_Class_mIoU: + global_Class_mIoU = avg_class_iou + global_total_per_cat_iou = total_per_cat_iou + + if metrics['shape_avg_iou'] > global_Inst_mIoU: + global_Inst_mIoU = metrics['shape_avg_iou'] + + # final avg print: + final_out_str = 'Best voting result :: test class mIOU: %f, test instance mIOU: %f' % (global_Class_mIoU, global_Inst_mIoU) + io.cprint(final_out_str) + + # final per cat print: + for cat_idx in range(16): + io.cprint(classes_str[cat_idx] + ' iou: ' + str(global_total_per_cat_iou[cat_idx])) # print iou of each class + + +if __name__ == "__main__": + args = get_parser() + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/%s_voting.log' % (args.exp_name)) + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + torch.manual_seed(args.manual_seed) + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + torch.cuda.manual_seed(args.manual_seed) + else: + io.cprint('Using CPU') + + test(args, io) + diff --git a/zoo/PAConv/part_seg/main.py b/zoo/PAConv/part_seg/main.py new file mode 100644 index 0000000..ac443ab --- /dev/null +++ b/zoo/PAConv/part_seg/main.py @@ -0,0 +1,426 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from util.data_util import PartNormalDataset +import torch.nn.functional as F +import torch.nn as nn +from model.DGCNN_PAConv import PAConv +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, load_cfg_from_cfg_file, merge_cfg_from_list, IOStream +from tqdm import tqdm +from tensorboardX import SummaryWriter +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--config', type=str, default='dgcnn_paconv_train.yaml', help='config file') + parser.add_argument('opts', help='see config/dgcnn_paconv_train.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + return cfg + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp util/PAConv_util.py checkpoints' + '/' + args.exp_name + '/' + 'PAConv_util.py.backup') + os.system('cp util/data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + os.system('cp DGCNN_PAConv.py checkpoints' + '/' + args.exp_name + '/' + 'DGCNN_PAConv.py.backup') + + global writer + writer = SummaryWriter('checkpoints/' + args.exp_name) + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(args, io): + + # ============= Model =================== + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = PAConv(args, num_part).to(device) + io.cprint(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + '''Use Pretrain or not''' + if args.get('pretrain', False): + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, map_location=torch.device('cpu'))['model'] + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + model.load_state_dict(state_dict) + + print("Using pretrained model...") + print(torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name).keys()) + else: + print("Training from scratch...") + + # =========== Dataloader ================= + train_data = PartNormalDataset(npoints=2048, split='trainval', normalize=False) + print("The number of training data is:%d", len(train_data)) + + test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + print("The number of test data is:%d", len(test_data)) + + train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True, num_workers=args.workers, + drop_last=True) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=args.workers, + drop_last=False) + + # ============= Optimizer ================ + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=args.weight_decay) + + if args.scheduler == 'cos': + print("Use CosLR") + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr / 100) + else: + print("Use StepLR") + scheduler = StepLR(opt, step_size=args.step, gamma=0.5) + + # ============= Training ================= + best_acc = 0 + best_class_iou = 0 + best_instance_iou = 0 + num_part = 50 + num_classes = 16 + + for epoch in range(args.epochs): + + train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io) + + test_metrics, total_per_cat_iou = test_epoch(test_loader, model, epoch, num_part, num_classes, io) + + # 1. when get the best accuracy, save the model: + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + io.cprint('Max Acc:%.5f' % best_acc) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_acc': best_acc} + torch.save(state, 'checkpoints/%s/best_acc_model.pth' % args.exp_name) + + # 2. when get the best instance_iou, save the model: + if test_metrics['shape_avg_iou'] > best_instance_iou: + best_instance_iou = test_metrics['shape_avg_iou'] + io.cprint('Max instance iou:%.5f' % best_instance_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_instance_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/best_insiou_model.pth' % args.exp_name) + + # 3. when get the best class_iou, save the model: + # first we need to calculate the average per-class iou + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + avg_class_iou = class_iou / 16 + if avg_class_iou > best_class_iou: + best_class_iou = avg_class_iou + # print the iou of each class: + for cat_idx in range(16): + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) + io.cprint('Max class iou:%.5f' % best_class_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_class_iou': best_class_iou} + torch.save(state, 'checkpoints/%s/best_clsiou_model.pth' % args.exp_name) + + # report best acc, ins_iou, cls_iou + io.cprint('Final Max Acc:%.5f' % best_acc) + io.cprint('Final Max instance iou:%.5f' % best_instance_iou) + io.cprint('Final Max class iou:%.5f' % best_class_iou) + # save last model + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': args.epochs - 1, 'test_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/model_ep%d.pth' % (args.exp_name, args.epochs)) + + +def train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io): + train_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + metrics = defaultdict(lambda: list()) + model.train() + + for batch_id, (points, label, target) in tqdm(enumerate(train_loader), total=len(train_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + points = points.permute(0, 2, 1) ### + # target: b,n + seg_pred, loss = model(points, to_categorical(label, num_classes), target) # seg_pred: b,n,50 + seg_pred = seg_pred.contiguous() ### + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # list of of current batch_iou:[iou1,iou2,...,iou#b_size] + # total iou of current batch in each process: + batch_shapeious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # Loss backward + loss = torch.mean(loss) + opt.zero_grad() + loss.backward() + opt.step() + + # accuracy + seg_pred = seg_pred.contiguous().view(-1, num_part) # b*n,50 + target = target.view(-1, 1)[:, 0] # b*n + pred_choice = seg_pred.contiguous().data.max(1)[1] # b*n + correct = pred_choice.eq(target.contiguous().data).sum() # torch.int64: total number of correct-predict pts + + # sum + shape_ious += batch_shapeious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + train_loss += loss.item() * batch_size + accuracy.append(correct.item()/(batch_size * num_point)) # append the accuracy of each iteration + + # Note: We do not need to calculate per_class iou during training + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 0.9e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 0.9e-5: + for param_group in opt.param_groups: + param_group['lr'] = 0.9e-5 + io.cprint('Learning rate: %f' % opt.param_groups[0]['lr']) + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Train %d, loss: %f, train acc: %f, train ins_iou: %f' % (epoch+1, train_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + io.cprint(outstr) + # Write to tensorboard + writer.add_scalar('loss_train', train_loss * 1.0 / count, epoch + 1) + writer.add_scalar('Acc_train', metrics['accuracy'], epoch + 1) + writer.add_scalar('ins_iou', metrics['shape_avg_iou']) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + # Write to tensorboard + writer.add_scalar('loss_train', test_loss * 1.0 / count, epoch + 1) + writer.add_scalar('Acc_train', metrics['accuracy'], epoch + 1) + writer.add_scalar('ins_iou', metrics['shape_avg_iou']) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=args.workers, drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = PAConv(args, num_part).to(device) + io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + args = get_parser() + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + test(args, io) \ No newline at end of file diff --git a/zoo/PAConv/part_seg/main_ddp.py b/zoo/PAConv/part_seg/main_ddp.py new file mode 100644 index 0000000..90bf61a --- /dev/null +++ b/zoo/PAConv/part_seg/main_ddp.py @@ -0,0 +1,568 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.multiprocessing as mp +import torch.distributed as dist +import torch.backends.cudnn as cudnn +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR, MultiStepLR +from util.data_util import PartNormalDataset, ShapeNetPart +import torch.nn.functional as F +from model.DGCNN_PAConv import PAConv +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, load_cfg_from_cfg_file, merge_cfg_from_list, find_free_port +import time +import logging +import random +from tqdm import tqdm +from tensorboardX import SummaryWriter +from collections import defaultdict +from torch.autograd import Variable + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def get_logger(): + logger_name = "main-logger" + logger = logging.getLogger(logger_name) + logger.setLevel(logging.INFO) + handler = logging.StreamHandler() + fmt = "[%(asctime)s %(levelname)s %(filename)s line %(lineno)d %(process)d] %(message)s" + handler.setFormatter(logging.Formatter(fmt)) + logger.addHandler(handler) + + file_handler = logging.FileHandler(os.path.join('checkpoints', args.exp_name, 'main-' + str(int(time.time())) + '.log')) + file_handler.setFormatter(logging.Formatter(fmt)) + logger.addHandler(file_handler) + + return logger + + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--config', type=str, default='dgcnn_paconv_train.yaml', help='config file') + parser.add_argument('opts', help='see config/dgcnn_paconv_train.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['sync_bn'] = cfg.get('sync_bn', True) + cfg['dist_url'] = cfg.get('dist_url', 'tcp://127.0.0.1:6789') + cfg['dist_backend'] = cfg.get('dist_backend', 'nccl') + cfg['multiprocessing_distributed'] = cfg.get('multiprocessing_distributed', True) + cfg['world_size'] = cfg.get('world_size', 1) + cfg['rank'] = cfg.get('rank', 0) + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + return cfg + + +def worker_init_fn(worker_id): + random.seed(args.manual_seed + worker_id) + + +def main_process(): + return not args.multiprocessing_distributed or (args.multiprocessing_distributed and args.rank % args.ngpus_per_node == 0) + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(gpu, ngpus_per_node): + # ============= Model =================== + num_part = 50 + model = PAConv(args, num_part) + + model.apply(weight_init) + + if main_process(): + logger.info(model) + + if args.sync_bn and args.distributed: + model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) + + if args.distributed: + torch.cuda.set_device(gpu) + args.batch_size = int(args.batch_size / ngpus_per_node) + args.test_batch_size = int(args.test_batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[gpu], find_unused_parameters=True) + else: + model = torch.nn.DataParallel(model.cuda()) + + '''Use Pretrain or not''' + if args.get('pretrain', False): + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, + map_location=torch.device('cpu'))['model'] + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + model.load_state_dict(state_dict) + if main_process(): + logger.info("Using pretrained model...") + logger.info(torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name).keys()) + else: + if main_process(): + logger.info("Training from scratch...") + + # =========== Dataloader ================= + # train_data = PartNormalDataset(npoints=2048, split='trainval', normalize=False) + train_data = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + if main_process(): + logger.info("The number of training data is:%d", len(train_data)) + + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + if main_process(): + logger.info("The number of test data is:%d", len(test_data)) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_data) + test_sampler = torch.utils.data.distributed.DistributedSampler(test_data) + else: + train_sampler = None + test_sampler = None + + train_loader = torch.utils.data.DataLoader(train_data, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler) + test_loader = torch.utils.data.DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, sampler=test_sampler) + + # ============= Optimizer =================== + if args.use_sgd: + if main_process(): + logger.info("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + else: + if main_process(): + logger.info("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=args.weight_decay) + + if args.scheduler == 'cos': + if main_process(): + logger.info("Use CosLR") + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr / 100) + else: + if main_process(): + logger.info("Use StepLR") + scheduler = StepLR(opt, step_size=args.step, gamma=0.5) + + # ============= Training ================= + best_acc = 0 + best_class_iou = 0 + best_instance_iou = 0 + num_part = 50 + num_classes = 16 + + for epoch in range(args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + + train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes) + + test_metrics, total_per_cat_iou = test_epoch(test_loader, model, epoch, num_part, num_classes) + + # 1. when get the best accuracy, save the model: + if test_metrics['accuracy'] > best_acc and main_process(): + best_acc = test_metrics['accuracy'] + logger.info('Max Acc:%.5f' % best_acc) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_acc': best_acc} + torch.save(state, 'checkpoints/%s/best_acc_model.pth' % args.exp_name) + + # 2. when get the best instance_iou, save the model: + if test_metrics['shape_avg_iou'] > best_instance_iou and main_process(): + best_instance_iou = test_metrics['shape_avg_iou'] + logger.info('Max instance iou:%.5f' % best_instance_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_instance_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/best_insiou_model.pth' % args.exp_name) + + # 3. when get the best class_iou, save the model: + # first we need to calculate the average per-class iou + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + avg_class_iou = class_iou / 16 + if avg_class_iou > best_class_iou and main_process(): + best_class_iou = avg_class_iou + # print the iou of each class: + for cat_idx in range(16): + if main_process(): + logger.info(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) + logger.info('Max class iou:%.5f' % best_class_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_class_iou': best_class_iou} + torch.save(state, 'checkpoints/%s/best_clsiou_model.pth' % args.exp_name) + + if main_process(): + # report best acc, ins_iou, cls_iou + logger.info('Final Max Acc:%.5f' % best_acc) + logger.info('Final Max instance iou:%.5f' % best_instance_iou) + logger.info('Final Max class iou:%.5f' % best_class_iou) + # save last model + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': args.epochs - 1, 'test_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/model_ep%d.pth' % (args.exp_name, args.epochs)) + + +def train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes): + train_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + metrics = defaultdict(lambda: list()) + model.train() + + torch.backends.cudnn.enabled = False ### + + for batch_id, (points, label, target) in tqdm(enumerate(train_loader), total=len(train_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.permute(0, 2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + # target: b,n + seg_pred, loss = model(points, to_categorical(label, num_classes), target) # seg_pred: b,n,50 + seg_pred = seg_pred.contiguous() ### + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # list of of current batch_iou:[iou1,iou2,...,iou#b_size] + # total iou of current batch in each process: + batch_shapeious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # Loss backward + if not args.multiprocessing_distributed: + loss = torch.mean(loss) + opt.zero_grad() + loss.backward() + opt.step() + + # accuracy + seg_pred = seg_pred.contiguous().view(-1, num_part) # b*n,50 + target = target.view(-1, 1)[:, 0] # b*n + pred_choice = seg_pred.contiguous().data.max(1)[1] # b*n + correct = pred_choice.eq(target.contiguous().data).sum() # torch.int64: total number of correct-predict pts + + if args.multiprocessing_distributed: + _count = seg_pred.new_tensor([batch_size], dtype=torch.long) # same device with seg_pred!!! + dist.all_reduce(loss) + dist.all_reduce(_count) + dist.all_reduce(batch_shapeious) # sum the batch_ious across all processes + dist.all_reduce(correct) # sum the correct across all processes + # ! batch_size: the total number of samples in one iteration when with dist, equals to batch_size when without dist: + batch_size = _count.item() + shape_ious += batch_shapeious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + train_loss += loss.item() * batch_size + accuracy.append(correct.item()/(batch_size * num_point)) # append the accuracy of each iteration + + # Note: We do not need to calculate per_class iou during training + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 0.9e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 0.9e-5: + for param_group in opt.param_groups: + param_group['lr'] = 0.9e-5 + if main_process(): + logger.info('Learning rate: %f', opt.param_groups[0]['lr']) + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Train %d, loss: %f, train acc: %f, train ins_iou: %f' % (epoch+1, train_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + if main_process(): + logger.info(outstr) + # Write to tensorboard + writer.add_scalar('loss_train', train_loss * 1.0 / count, epoch + 1) + writer.add_scalar('Acc_train', metrics['accuracy'], epoch + 1) + writer.add_scalar('ins_iou', metrics['shape_avg_iou']) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.permute(0, 2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + if args.multiprocessing_distributed: + # creat new zero to only count current iter to avoid counting the value of last iterations twice in reduce! + cur_total_per_cat_iou = np.zeros(16).astype(np.float32) + cur_total_per_cat_seen = np.zeros(16).astype(np.int32) + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + cur_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + cur_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + else: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + if args.multiprocessing_distributed: + _count = seg_pred.new_tensor([batch_size], dtype=torch.long) # same device with seg_pred!!! + dist.all_reduce(loss) + dist.all_reduce(_count) + dist.all_reduce(batch_ious) # sum the batch_ious across all processes + dist.all_reduce(correct) # sum the correct across all processes + + cur_total_per_cat_iou = seg_pred.new_tensor(cur_total_per_cat_iou, dtype=torch.float32) # same device with seg_pred!!! + cur_total_per_cat_seen = seg_pred.new_tensor(cur_total_per_cat_seen, dtype=torch.int32) # same device with seg_pred!!! + dist.all_reduce(cur_total_per_cat_iou) # sum the per_cat_iou across all processes (element-wise) + dist.all_reduce(cur_total_per_cat_seen) # sum the per_cat_seen across all processes (element-wise) + final_total_per_cat_iou += cur_total_per_cat_iou.cpu().numpy() + final_total_per_cat_seen += cur_total_per_cat_seen.cpu().numpy() + # ! batch_size: the total number of samples in one iteration when with dist, equals to batch_size when without dist: + batch_size = _count.item() + else: + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + if main_process(): + logger.info(outstr) + # Write to tensorboard + writer.add_scalar('loss_train', test_loss * 1.0 / count, epoch + 1) + writer.add_scalar('Acc_train', metrics['accuracy'], epoch + 1) + writer.add_scalar('ins_iou', metrics['shape_avg_iou']) + + return metrics, final_total_per_cat_iou + + +def test(gpu, ngpus_per_node): + # Try to load models + num_part = 50 + model = PAConv(args, num_part) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + if main_process(): + logger.info(model) + + if args.sync_bn: + assert args.distributed == True + model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) + + if args.distributed: + torch.cuda.set_device(gpu) + args.batch_size = int(args.batch_size / ngpus_per_node) + args.test_batch_size = int(args.test_batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[gpu], find_unused_parameters=True) + else: + model = model.cuda() + + # Dataloader + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + if main_process(): + logger.info("The number of test data is:%d", len(test_data)) + + if args.distributed: + test_sampler = torch.utils.data.distributed.DistributedSampler(test_data) + else: + test_sampler = None + test_loader = torch.utils.data.DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, sampler=test_sampler) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.permute(0, 2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + if main_process(): + logger.info(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + if main_process(): + logger.info(outstr) + + +def main_worker(gpu, ngpus_per_node, argss): + global args + args = argss + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, + rank=args.rank) + + if main_process(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main_ddp.py checkpoints' + '/' + args.exp_name + '/' + 'main_ddp.py.backup') + os.system('cp util/PAConv_util.py checkpoints' + '/' + args.exp_name + '/' + 'PAConv_util.py.backup') + os.system('cp util/data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + os.system('cp DGCNN_PAConv.py checkpoints' + '/' + args.exp_name + '/' + 'DGCNN_PAConv.py.backup') + + global logger, writer + writer = SummaryWriter('checkpoints/' + args.exp_name) + logger = get_logger() + logger.info(args) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + assert not args.eval, "The all_reduce function of PyTorch DDP will ignore/repeat inputs " \ + "(leading to the wrong result), " \ + "please use main.py to test (avoid DDP) for getting the right result." + + train(gpu, ngpus_per_node) + + +if __name__ == "__main__": + args = get_parser() + args.gpu = [int(i) for i in os.environ['CUDA_VISIBLE_DEVICES'].split(',')] + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + cudnn.benchmark = False + cudnn.deterministic = True + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + args.ngpus_per_node = len(args.gpu) + if len(args.gpu) == 1: + args.sync_bn = False + args.distributed = False + args.multiprocessing_distributed = False + if args.multiprocessing_distributed: + port = find_free_port() + args.dist_url = f"tcp://127.0.0.1:{port}" + args.world_size = args.ngpus_per_node * args.world_size + mp.spawn(main_worker, nprocs=args.ngpus_per_node, args=(args.ngpus_per_node, args)) + else: + main_worker(args.gpu, args.ngpus_per_node, args) + diff --git a/zoo/PAConv/part_seg/model/DGCNN_PAConv.py b/zoo/PAConv/part_seg/model/DGCNN_PAConv.py new file mode 100644 index 0000000..6ca2b94 --- /dev/null +++ b/zoo/PAConv/part_seg/model/DGCNN_PAConv.py @@ -0,0 +1,131 @@ +""" +Embed PAConv into DGCNN +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F +from util.PAConv_util import knn, get_graph_feature, get_scorenet_input, feat_trans_dgcnn, ScoreNet +from cuda_lib.functional import assign_score_withk as assemble_dgcnn + + +class PAConv(nn.Module): + def __init__(self, args, num_part): + super(PAConv, self).__init__() + # baseline args: + self.args = args + self.num_part = num_part + # PAConv args: + self.k = args.get('k_neighbors', 30) + self.calc_scores = args.get('calc_scores', 'softmax') + self.hidden = args.get('hidden', [[16], [16], [16], [16]]) # the hidden layers of ScoreNet + + self.m2, self.m3, self.m4, self.m5 = args.get('num_matrices', [8, 8, 8, 8]) + self.scorenet2 = ScoreNet(10, self.m2, hidden_unit=self.hidden[0]) + self.scorenet3 = ScoreNet(10, self.m3, hidden_unit=self.hidden[1]) + self.scorenet4 = ScoreNet(10, self.m4, hidden_unit=self.hidden[2]) + self.scorenet5 = ScoreNet(10, self.m5, hidden_unit=self.hidden[3]) + + i2 = 64 # channel dim of input_2nd + o2 = i3 = 64 # channel dim of output_2st and input_3rd + o3 = i4 = 64 # channel dim of output_3rd and input_4th + o4 = i5 = 64 # channel dim of output_4th and input_5th + o5 = 64 # channel dim of output_5th + + tensor2 = nn.init.kaiming_normal_(torch.empty(self.m2, i2 * 2, o2), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i2 * 2, self.m2 * o2) + tensor3 = nn.init.kaiming_normal_(torch.empty(self.m3, i3 * 2, o3), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i3 * 2, self.m3 * o3) + tensor4 = nn.init.kaiming_normal_(torch.empty(self.m4, i4 * 2, o4), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m4 * o4) + tensor5 = nn.init.kaiming_normal_(torch.empty(self.m5, i5 * 2, o5), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m5 * o5) + + self.matrice2 = nn.Parameter(tensor2, requires_grad=True) + self.matrice3 = nn.Parameter(tensor3, requires_grad=True) + self.matrice4 = nn.Parameter(tensor4, requires_grad=True) + self.matrice5 = nn.Parameter(tensor5, requires_grad=True) + + self.bn2 = nn.BatchNorm1d(64, momentum=0.1) + self.bn3 = nn.BatchNorm1d(64, momentum=0.1) + self.bn4 = nn.BatchNorm1d(64, momentum=0.1) + self.bn5 = nn.BatchNorm1d(64, momentum=0.1) + + self.bnt = nn.BatchNorm1d(1024, momentum=0.1) + self.bnc = nn.BatchNorm1d(64, momentum=0.1) + + self.bn6 = nn.BatchNorm1d(256, momentum=0.1) + self.bn7 = nn.BatchNorm1d(256, momentum=0.1) + self.bn8 = nn.BatchNorm1d(128, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=True), nn.BatchNorm2d(64, momentum=0.1)) + + self.convt = nn.Sequential(nn.Conv1d(64*5, 1024, kernel_size=1, bias=False), self.bnt) + self.convc = nn.Sequential(nn.Conv1d(16, 64, kernel_size=1, bias=False), self.bnc) + + self.conv6 = nn.Sequential(nn.Conv1d(1088+64*5, 256, kernel_size=1, bias=False), self.bn6) + self.dp1 = nn.Dropout(p=args.get('dropout', 0.4)) + self.conv7 = nn.Sequential(nn.Conv1d(256, 256, kernel_size=1, bias=False), self.bn7) + self.dp2 = nn.Dropout(p=args.get('dropout', 0.4)) + self.conv8 = nn.Sequential(nn.Conv1d(256, 128, kernel_size=1, bias=False), self.bn8) + self.conv9 = nn.Conv1d(128, num_part, kernel_size=1, bias=True) + + def forward(self, x, cls_label, gt=None): + B, C, N = x.size() + idx, _ = knn(x, k=self.k) # different with DGCNN, the knn search is only in 3D space + xyz = get_scorenet_input(x, k=self.k, idx=idx) # ScoreNet input + ################# + # use MLP at the 1st layer, same with DGCNN + x = get_graph_feature(x, k=self.k, idx=idx) + x = x.permute(0, 3, 1, 2) # b,2cin,n,k + x = F.relu(self.conv1(x)) + x1 = x.max(dim=-1, keepdim=False)[0] + ################# + # replace the last 4 DGCNN-EdgeConv with PAConv: + """CUDA implementation of PAConv: (presented in the supplementary material of the paper)""" + """feature transformation:""" + x2, center2 = feat_trans_dgcnn(point_input=x1, kernel=self.matrice2, m=self.m2) + score2 = self.scorenet2(xyz, calc_scores=self.calc_scores, bias=0) + """assemble with scores:""" + x = assemble_dgcnn(score=score2, point_input=x2, center_input=center2, knn_idx=idx, aggregate='sum') + x2 = F.relu(self.bn2(x)) + + x3, center3 = feat_trans_dgcnn(point_input=x2, kernel=self.matrice3, m=self.m3) + score3 = self.scorenet3(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score3, point_input=x3, center_input=center3, knn_idx=idx, aggregate='sum') + x3 = F.relu(self.bn3(x)) + + x4, center4 = feat_trans_dgcnn(point_input=x3, kernel=self.matrice4, m=self.m4) + score4 = self.scorenet4(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score4, point_input=x4, center_input=center4, knn_idx=idx, aggregate='sum') + x4 = F.relu(self.bn4(x)) + + x5, center5 = feat_trans_dgcnn(point_input=x4, kernel=self.matrice5, m=self.m5) + score5 = self.scorenet5(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score5, point_input=x5, center_input=center5, knn_idx=idx, aggregate='sum') + x5 = F.relu(self.bn5(x)) + ############### + xx = torch.cat((x1, x2, x3, x4, x5), dim=1) + + xc = F.relu(self.convt(xx)) + xc = F.adaptive_max_pool1d(xc, 1).view(B, -1) + + cls_label = cls_label.view(B, 16, 1) + cls_label = F.relu(self.convc(cls_label)) + cls = torch.cat((xc.view(B, 1024, 1), cls_label), dim=1) + cls = cls.repeat(1, 1, N) # B,1088,N + + x = torch.cat((xx, cls), dim=1) # 1088+64*3 + x = F.relu(self.conv6(x)) + x = self.dp1(x) + x = F.relu(self.conv7(x)) + x = self.dp2(x) + x = F.relu(self.conv8(x)) + x = self.conv9(x) + x = F.log_softmax(x, dim=1) + x = x.permute(0, 2, 1) # b,n,50 + + if gt is not None: + return x, F.nll_loss(x.contiguous().view(-1, self.num_part), gt.view(-1, 1)[:, 0]) + else: + return x \ No newline at end of file diff --git a/zoo/PAConv/part_seg/model/DGCNN_PAConv2.py b/zoo/PAConv/part_seg/model/DGCNN_PAConv2.py new file mode 100644 index 0000000..af821c8 --- /dev/null +++ b/zoo/PAConv/part_seg/model/DGCNN_PAConv2.py @@ -0,0 +1,143 @@ +""" +Embed PAConv into DGCNN +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F +from util.PAConv_util import knn, get_graph_feature, get_scorenet_input, feat_trans_dgcnn, ScoreNet +from cuda_lib.functional import assign_score_withk as assemble_dgcnn + + +class PAConv(nn.Module): + def __init__(self, num_part): + super(PAConv, self).__init__() + # baseline args: + # self.args = args + self.num_part = num_part + # PAConv args: + # self.k = args.get('k_neighbors', 30) + self.k = 30 + # self.calc_scores = args.get('calc_scores', 'softmax') + self.calc_scores = 'softmax' + # self.hidden = args.get('hidden', [[16], [16], [16], [16]]) # the hidden layers of ScoreNet + self.hidden = [[16,16,16],[16,16,16],[16,16,16],[16,16,16]] + + # self.m2, self.m3, self.m4, self.m5 = args.get('num_matrices', [8, 8, 8, 8]) + self.m2, self.m3, self.m4, self.m5 = [8, 8, 8, 8] + self.scorenet2 = ScoreNet(10, self.m2, hidden_unit=self.hidden[0]) + self.scorenet3 = ScoreNet(10, self.m3, hidden_unit=self.hidden[1]) + self.scorenet4 = ScoreNet(10, self.m4, hidden_unit=self.hidden[2]) + self.scorenet5 = ScoreNet(10, self.m5, hidden_unit=self.hidden[3]) + + i2 = 64 # channel dim of input_2nd + o2 = i3 = 64 # channel dim of output_2st and input_3rd + o3 = i4 = 64 # channel dim of output_3rd and input_4th + o4 = i5 = 64 # channel dim of output_4th and input_5th + o5 = 64 # channel dim of output_5th + + tensor2 = nn.init.kaiming_normal_(torch.empty(self.m2, i2 * 2, o2), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i2 * 2, self.m2 * o2) + tensor3 = nn.init.kaiming_normal_(torch.empty(self.m3, i3 * 2, o3), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i3 * 2, self.m3 * o3) + tensor4 = nn.init.kaiming_normal_(torch.empty(self.m4, i4 * 2, o4), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m4 * o4) + tensor5 = nn.init.kaiming_normal_(torch.empty(self.m5, i5 * 2, o5), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m5 * o5) + + self.matrice2 = nn.Parameter(tensor2, requires_grad=True) + self.matrice3 = nn.Parameter(tensor3, requires_grad=True) + self.matrice4 = nn.Parameter(tensor4, requires_grad=True) + self.matrice5 = nn.Parameter(tensor5, requires_grad=True) + + self.bn2 = nn.BatchNorm1d(64, momentum=0.1) + self.bn3 = nn.BatchNorm1d(64, momentum=0.1) + self.bn4 = nn.BatchNorm1d(64, momentum=0.1) + self.bn5 = nn.BatchNorm1d(64, momentum=0.1) + + self.bnt = nn.BatchNorm1d(1024, momentum=0.1) + self.bnc = nn.BatchNorm1d(64, momentum=0.1) + + self.bn6 = nn.BatchNorm1d(256, momentum=0.1) + self.bn7 = nn.BatchNorm1d(256, momentum=0.1) + self.bn8 = nn.BatchNorm1d(128, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=True), + nn.BatchNorm2d(64, momentum=0.1)) + + self.convt = nn.Sequential(nn.Conv1d(64*5, 1024, kernel_size=1, bias=False), + self.bnt) + self.convc = nn.Sequential(nn.Conv1d(16, 64, kernel_size=1, bias=False), + self.bnc) + + self.conv6 = nn.Sequential(nn.Conv1d(1088+64*5, 256, kernel_size=1, bias=False), + self.bn6) + # self.dp1 = nn.Dropout(p=args.get('dropout', 0.4)) + self.dp1 = nn.Dropout(p=0.4) + self.conv7 = nn.Sequential(nn.Conv1d(256, 256, kernel_size=1, bias=False), + self.bn7) + # self.dp2 = nn.Dropout(p=args.get('dropout', 0.4)) + self.dp2 = nn.Dropout(p=0.4) + self.conv8 = nn.Sequential(nn.Conv1d(256, 128, kernel_size=1, bias=False), + self.bn8) + self.conv9 = nn.Conv1d(128, num_part, kernel_size=1, bias=True) + + def forward(self, x, cls_label, gt=None): + B, C, N = x.size() + idx, _ = knn(x, k=self.k) # different with DGCNN, the knn search is only in 3D space + xyz = get_scorenet_input(x, k=self.k, idx=idx) # ScoreNet input + ################# + # use MLP at the 1st layer, same with DGCNN + x = get_graph_feature(x, k=self.k, idx=idx) + x = x.permute(0, 3, 1, 2) # b,2cin,n,k + x = F.relu(self.conv1(x)) + x1 = x.max(dim=-1, keepdim=False)[0] + ################# + # replace the last 4 DGCNN-EdgeConv with PAConv: + """CUDA implementation of PAConv: (presented in the supplementary material of the paper)""" + """feature transformation:""" + x2, center2 = feat_trans_dgcnn(point_input=x1, kernel=self.matrice2, m=self.m2) + score2 = self.scorenet2(xyz, calc_scores=self.calc_scores, bias=0) + """assemble with scores:""" + x = assemble_dgcnn(score=score2, point_input=x2, center_input=center2, knn_idx=idx, aggregate='sum') + x2 = F.relu(self.bn2(x)) + + x3, center3 = feat_trans_dgcnn(point_input=x2, kernel=self.matrice3, m=self.m3) + score3 = self.scorenet3(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score3, point_input=x3, center_input=center3, knn_idx=idx, aggregate='sum') + x3 = F.relu(self.bn3(x)) + + x4, center4 = feat_trans_dgcnn(point_input=x3, kernel=self.matrice4, m=self.m4) + score4 = self.scorenet4(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score4, point_input=x4, center_input=center4, knn_idx=idx, aggregate='sum') + x4 = F.relu(self.bn4(x)) + + x5, center5 = feat_trans_dgcnn(point_input=x4, kernel=self.matrice5, m=self.m5) + score5 = self.scorenet5(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score5, point_input=x5, center_input=center5, knn_idx=idx, aggregate='sum') + x5 = F.relu(self.bn5(x)) + ############### + xx = torch.cat((x1, x2, x3, x4, x5), dim=1) + + xc = F.relu(self.convt(xx)) + xc = F.adaptive_max_pool1d(xc, 1).view(B, -1) + + cls_label = cls_label.view(B, 16, 1) + cls_label = F.relu(self.convc(cls_label)) + cls = torch.cat((xc.view(B, 1024, 1), cls_label), dim=1) + cls = cls.repeat(1, 1, N) # B,1088,N + + x = torch.cat((xx, cls), dim=1) # 1088+64*3 + x = F.relu(self.conv6(x)) + x = self.dp1(x) + x = F.relu(self.conv7(x)) + x = self.dp2(x) + x = F.relu(self.conv8(x)) + x = self.conv9(x) + x = F.log_softmax(x, dim=1) + x = x.permute(0, 2, 1) # b,n,50 + + if gt is not None: + return x, F.nll_loss(x.contiguous().view(-1, self.num_part), gt.view(-1, 1)[:, 0]) + else: + return x diff --git a/zoo/PAConv/part_seg/model/DGCNN_PAConv_vote.py b/zoo/PAConv/part_seg/model/DGCNN_PAConv_vote.py new file mode 100644 index 0000000..9062d96 --- /dev/null +++ b/zoo/PAConv/part_seg/model/DGCNN_PAConv_vote.py @@ -0,0 +1,138 @@ +""" +Embed PAConv into DGCNN +(only for voting during test phase) +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F +from util.PAConv_util import knn, get_graph_feature, get_scorenet_input, feat_trans_dgcnn, ScoreNet +from cuda_lib.functional import assign_score_withk as assemble_dgcnn + + +class PAConv(nn.Module): + def __init__(self, args, num_part): + super(PAConv, self).__init__() + # baseline args: + self.args = args + self.num_part = num_part + # PAConv args: + self.k = args.get('k_neighbors', 30) + self.calc_scores = args.get('calc_scores', 'softmax') + self.hidden = args.get('hidden', [[16], [16], [16], [16]]) # the hidden layers of ScoreNet + + self.m2, self.m3, self.m4, self.m5 = args.get('num_matrices', [8, 8, 8, 8]) + self.scorenet2 = ScoreNet(10, self.m2, hidden_unit=self.hidden[0]) + self.scorenet3 = ScoreNet(10, self.m3, hidden_unit=self.hidden[1]) + self.scorenet4 = ScoreNet(10, self.m4, hidden_unit=self.hidden[2]) + self.scorenet5 = ScoreNet(10, self.m5, hidden_unit=self.hidden[3]) + + i2 = 64 # channel dim of input_2nd + o2 = i3 = 64 # channel dim of output_2st and input_3rd + o3 = i4 = 64 # channel dim of output_3rd and input_4th + o4 = i5 = 64 # channel dim of output_4th and input_5th + o5 = 64 # channel dim of output_5th + + tensor2 = nn.init.kaiming_normal_(torch.empty(self.m2, i2 * 2, o2), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i2 * 2, self.m2 * o2) + tensor3 = nn.init.kaiming_normal_(torch.empty(self.m3, i3 * 2, o3), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i3 * 2, self.m3 * o3) + tensor4 = nn.init.kaiming_normal_(torch.empty(self.m4, i4 * 2, o4), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m4 * o4) + tensor5 = nn.init.kaiming_normal_(torch.empty(self.m5, i5 * 2, o5), nonlinearity='relu') \ + .permute(1, 0, 2).contiguous().view(i4 * 2, self.m5 * o5) + + self.matrice2 = nn.Parameter(tensor2, requires_grad=True) + self.matrice3 = nn.Parameter(tensor3, requires_grad=True) + self.matrice4 = nn.Parameter(tensor4, requires_grad=True) + self.matrice5 = nn.Parameter(tensor5, requires_grad=True) + + self.bn2 = nn.BatchNorm1d(64, momentum=0.1) + self.bn3 = nn.BatchNorm1d(64, momentum=0.1) + self.bn4 = nn.BatchNorm1d(64, momentum=0.1) + self.bn5 = nn.BatchNorm1d(64, momentum=0.1) + + self.bnt = nn.BatchNorm1d(1024, momentum=0.1) + self.bnc = nn.BatchNorm1d(64, momentum=0.1) + + self.bn6 = nn.BatchNorm1d(256, momentum=0.1) + self.bn7 = nn.BatchNorm1d(256, momentum=0.1) + self.bn8 = nn.BatchNorm1d(128, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=True), + nn.BatchNorm2d(64, momentum=0.1)) + + self.convt = nn.Sequential(nn.Conv1d(64*5, 1024, kernel_size=1, bias=False), + self.bnt) + self.convc = nn.Sequential(nn.Conv1d(16, 64, kernel_size=1, bias=False), + self.bnc) + + self.conv6 = nn.Sequential(nn.Conv1d(1088+64*5, 256, kernel_size=1, bias=False), + self.bn6) + self.dp1 = nn.Dropout(p=args.get('dropout', 0.4)) + self.conv7 = nn.Sequential(nn.Conv1d(256, 256, kernel_size=1, bias=False), + self.bn7) + self.dp2 = nn.Dropout(p=args.get('dropout', 0.4)) + self.conv8 = nn.Sequential(nn.Conv1d(256, 128, kernel_size=1, bias=False), + self.bn8) + self.conv9 = nn.Conv1d(128, num_part, kernel_size=1, bias=True) + + def forward(self, xyz, x, norm_plt, cls_label, gt=None): + B, C, N = x.size() + idx, _ = knn(xyz, k=self.k) # different with DGCNN, the knn search is only in 3D space + xyz = get_scorenet_input(xyz, k=self.k, idx=idx) # ScoreNet input + ################# + # use MLP at the 1st layer, same with DGCNN + x = get_graph_feature(x, k=self.k, idx=idx) + x = x.permute(0, 3, 1, 2) # b,2cin,n,k + x = F.relu(self.conv1(x)) + x1 = x.max(dim=-1, keepdim=False)[0] + ################# + # replace the last 4 DGCNN-EdgeConv with PAConv: + """CUDA implementation of PAConv: (presented in the supplementary material of the paper)""" + """feature transformation:""" + x2, center2 = feat_trans_dgcnn(point_input=x1, kernel=self.matrice2, m=self.m2) + score2 = self.scorenet2(xyz, calc_scores=self.calc_scores, bias=0) + """assemble with scores:""" + x = assemble_dgcnn(score=score2, point_input=x2, center_input=center2, knn_idx=idx, aggregate='sum') + x2 = F.relu(self.bn2(x)) + + x3, center3 = feat_trans_dgcnn(point_input=x2, kernel=self.matrice3, m=self.m3) + score3 = self.scorenet3(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score3, point_input=x3, center_input=center3, knn_idx=idx, aggregate='sum') + x3 = F.relu(self.bn3(x)) + + x4, center4 = feat_trans_dgcnn(point_input=x3, kernel=self.matrice4, m=self.m4) + score4 = self.scorenet4(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score4, point_input=x4, center_input=center4, knn_idx=idx, aggregate='sum') + x4 = F.relu(self.bn4(x)) + + x5, center5 = feat_trans_dgcnn(point_input=x4, kernel=self.matrice5, m=self.m5) + score5 = self.scorenet5(xyz, calc_scores=self.calc_scores, bias=0) + x = assemble_dgcnn(score=score5, point_input=x5, center_input=center5, knn_idx=idx, aggregate='sum') + x5 = F.relu(self.bn5(x)) + ############### + xx = torch.cat((x1, x2, x3, x4, x5), dim=1) + + xc = F.relu(self.convt(xx)) + xc = F.adaptive_max_pool1d(xc, 1).view(B, -1) + + cls_label = cls_label.view(B, 16, 1) + cls_label = F.relu(self.convc(cls_label)) + cls = torch.cat((xc.view(B, 1024, 1), cls_label), dim=1) + cls = cls.repeat(1, 1, N) # B,1088,N + + x = torch.cat((xx, cls), dim=1) # 1088+64*3 + x = F.relu(self.conv6(x)) + x = self.dp1(x) + x = F.relu(self.conv7(x)) + x = self.dp2(x) + x = F.relu(self.conv8(x)) + x = self.conv9(x) + # x = F.log_softmax(x, dim=1) no need to get the softmax here, which is accumulated in voting + x = x.permute(0, 2, 1) # b,n,50 + + if gt is not None: + return x, F.nll_loss(x.contiguous().view(-1, self.num_part), gt.view(-1, 1)[:, 0]) + else: + return x diff --git a/zoo/PAConv/part_seg/requirements.txt b/zoo/PAConv/part_seg/requirements.txt new file mode 100644 index 0000000..04920b3 --- /dev/null +++ b/zoo/PAConv/part_seg/requirements.txt @@ -0,0 +1,16 @@ +git+git://github.com/imankgoyal/etw_pytorch_utils.git@v1.1.1#egg=etw_pytorch_utils +enum34 +future +h5py==2.10.0 +progressbar2==3.50.0 +tensorboardX==2.0 +-f https://download.pytorch.org/whl/torch_stable.html +torch==1.5.0+cu101 +-f https://download.pytorch.org/whl/torch_stable.html +torchvision==0.6.0+cu101 +yacs==0.1.6 +gdown==4.2.0 + + +# ninja +# conda install -c 3dhubs gcc-5 \ No newline at end of file diff --git a/zoo/PAConv/part_seg/test.py b/zoo/PAConv/part_seg/test.py new file mode 100644 index 0000000..be6605e --- /dev/null +++ b/zoo/PAConv/part_seg/test.py @@ -0,0 +1,247 @@ +from __future__ import print_function +import os +import argparse +import torch +from util.data_util import PartNormalDataset, ShapeNetC +import torch.nn.functional as F +from model.DGCNN_PAConv2 import PAConv +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, load_cfg_from_cfg_file, merge_cfg_from_list, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + +EVAL = True +exp_name = 'dgcnn_paconv_train_2' +manual_seed = 0 +workers = 6 +no_cuda = False # cpu +test_batch_size = 16 +model_type = 'insiou' + + +def get_parser(): + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--config', type=str, default='dgcnn_paconv_train.yaml', help='config file') + parser.add_argument('opts', help='see config/dgcnn_paconv_train.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = merge_cfg_from_list(cfg, args.opts) + + cfg['manual_seed'] = cfg.get('manual_seed', 0) + cfg['workers'] = cfg.get('workers', 6) + return cfg + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + exp_name): + os.makedirs('checkpoints/' + exp_name) + + # global writer + # writer = SummaryWriter('checkpoints/' + args.exp_name) + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.kaiming_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target, norm_plt) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target, norm_plt = Variable(points.float()), Variable(label.long()), Variable(target.long()), Variable(norm_plt.float()) + points = points.transpose(2, 1) + norm_plt = norm_plt.transpose(2, 1) + points, label, target, norm_plt = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True), norm_plt.cuda(non_blocking=True) + seg_pred = model(points, norm_plt, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + # Write to tensorboard + # writer.add_scalar('loss_train', test_loss * 1.0 / count, epoch + 1) + # writer.add_scalar('Acc_train', metrics['accuracy'], epoch + 1) + # writer.add_scalar('ins_iou', metrics['shape_avg_iou']) + + return metrics, final_total_per_cat_iou + + +def test(io): + # Dataloader + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetC(partition='shapenet-c', sub='jitter_4', class_choice=None) + print("The number of test data is: {}".format(len(test_data))) + + test_loader = DataLoader(test_data, batch_size=test_batch_size, shuffle=False, num_workers=workers, drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if cuda else "cpu") + + model = PAConv(num_part).to(device) + # io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (exp_name, model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # args = get_parser() + _init_() + + if not EVAL: + io = IOStream('checkpoints/' + exp_name + '/%s_train.log' % (exp_name)) + else: + io = IOStream('checkpoints/' + exp_name + '/%s_test.log' % (exp_name)) + # io.cprint(str(args)) + + if manual_seed is not None: + random.seed(manual_seed) + np.random.seed(manual_seed) + torch.manual_seed(manual_seed) + + cuda = not no_cuda and torch.cuda.is_available() + + if cuda: + io.cprint('Using GPU') + if manual_seed is not None: + torch.cuda.manual_seed(manual_seed) + torch.cuda.manual_seed_all(manual_seed) + else: + io.cprint('Using CPU') + + if not EVAL: + # train(args, io) + pass + else: + test(io) + diff --git a/zoo/PAConv/part_seg/test.sh b/zoo/PAConv/part_seg/test.sh new file mode 100644 index 0000000..ea59cb0 --- /dev/null +++ b/zoo/PAConv/part_seg/test.sh @@ -0,0 +1,2 @@ +CUDA_VISIBLE_DEVICES=2 python test.py \ + --config config/dgcnn_paconv_test.yaml \ No newline at end of file diff --git a/zoo/PAConv/part_seg/test_voting.sh b/zoo/PAConv/part_seg/test_voting.sh new file mode 100644 index 0000000..7b850eb --- /dev/null +++ b/zoo/PAConv/part_seg/test_voting.sh @@ -0,0 +1,2 @@ +CUDA_VISIBLE_DEVICES=7 python eval_voting.py \ + --config config/dgcnn_paconv_test.yaml \ No newline at end of file diff --git a/zoo/PAConv/part_seg/train_ddp.sh b/zoo/PAConv/part_seg/train_ddp.sh new file mode 100644 index 0000000..c10dcfa --- /dev/null +++ b/zoo/PAConv/part_seg/train_ddp.sh @@ -0,0 +1 @@ +CUDA_VISIBLE_DEVICES=4,5,6,7 python main_ddp.py --config config/dgcnn_paconv_train.yaml \ No newline at end of file diff --git a/zoo/PAConv/part_seg/train_dp.sh b/zoo/PAConv/part_seg/train_dp.sh new file mode 100644 index 0000000..f45d65a --- /dev/null +++ b/zoo/PAConv/part_seg/train_dp.sh @@ -0,0 +1,2 @@ +CUDA_VISIBLE_DEVICES=7 python main.py \ + --config config/dgcnn_paconv_train.yaml \ No newline at end of file diff --git a/zoo/PAConv/part_seg/util/PAConv_util.py b/zoo/PAConv/part_seg/util/PAConv_util.py new file mode 100644 index 0000000..d5700a0 --- /dev/null +++ b/zoo/PAConv/part_seg/util/PAConv_util.py @@ -0,0 +1,143 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def knn(x, k): + B, _, N = x.size() + inner = -2 * torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x ** 2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + _, idx = pairwise_distance.topk(k=k, dim=-1) # (batch_size, num_points, k) + + return idx, pairwise_distance + + +def get_graph_feature(x, k, idx): + """original function in DGCNN""" + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + idx_base = torch.arange(0, batch_size, device=x.device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor - x, neighbor), dim=3) # (xj-xi, xj): b,n,k,2c + + return feature + + +def get_ed(x, y): + """calculate the Euclidean distance between two points""" + ed = torch.norm(x - y, dim=-1).reshape(x.shape[0], 1) + return ed + + +def get_scorenet_input(x, k, idx): + """xyz=(center, neighbor, neighbor-center, ed)""" + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + x1 = x.view(batch_size * num_points * k, -1) # x1 only for calculating Euclidean distance + ed = get_ed(x1, neighbor).view(batch_size, num_points, k, 1) + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + xyz = torch.cat((x, neighbor, neighbor - x, ed), dim=3).permute(0, 3, 1, 2) # b,10,n,k + + return xyz + + +def feat_trans_dgcnn(point_input, kernel, m): + """transforming features using weight matrices""" + # following get_graph_feature in DGCNN: torch.cat((neighbor - center, neighbor), dim=3) + B, _, N = point_input.size() # b, 2cin, n + point_output = torch.matmul(point_input.permute(0, 2, 1).repeat(1, 1, 2), kernel).view(B, N, m, -1) # b,n,m,cout + center_output = torch.matmul(point_input.permute(0, 2, 1), kernel[:point_input.size(1)]).view(B, N, m, -1) # b,n,m,cout + return point_output, center_output + + +class ScoreNet(nn.Module): + + def __init__(self, in_channel, out_channel, hidden_unit=[16], last_bn=False): + super(ScoreNet, self).__init__() + self.hidden_unit = hidden_unit + self.last_bn = last_bn + self.mlp_convs_hidden = nn.ModuleList() + self.mlp_bns_hidden = nn.ModuleList() + + if hidden_unit is None or len(hidden_unit) == 0: + self.mlp_convs_nohidden = nn.Conv2d(in_channel, out_channel, 1, bias=not last_bn) + if self.last_bn: + self.mlp_bns_nohidden = nn.BatchNorm2d(out_channel) + + else: + self.mlp_convs_hidden.append(nn.Conv2d(in_channel, hidden_unit[0], 1, bias=False)) # from in_channel to first hidden + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[0])) + for i in range(1, len(hidden_unit)): # from 2nd hidden to next hidden to last hidden + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[i - 1], hidden_unit[i], 1, bias=False)) + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[i])) + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[-1], out_channel, 1, bias=not last_bn)) # from last hidden to out_channel + self.mlp_bns_hidden.append(nn.BatchNorm2d(out_channel)) + + def forward(self, xyz, calc_scores='softmax', bias=0): + B, _, N, K = xyz.size() + scores = xyz + + if self.hidden_unit is None or len(self.hidden_unit) == 0: + if self.last_bn: + scores = self.mlp_bns_nohidden(self.mlp_convs_nohidden(scores)) + else: + scores = self.mlp_convs_nohidden(scores) + + else: + for i, conv in enumerate(self.mlp_convs_hidden): + if i == len(self.mlp_convs_hidden)-1: # if the output layer, no ReLU + if self.last_bn: + bn = self.mlp_bns_hidden[i] + scores = bn(conv(scores)) + else: + scores = conv(scores) + else: + bn = self.mlp_bns_hidden[i] + scores = F.relu(bn(conv(scores))) + + if calc_scores == 'softmax': + scores = F.softmax(scores, dim=1)+bias # B*m*N*K + elif calc_scores == 'sigmoid': + scores = torch.sigmoid(scores)+bias # B*m*N*K + else: + raise ValueError('Not Implemented!') + + return scores.permute(0, 2, 3, 1) # B*N*K*m diff --git a/zoo/PAConv/part_seg/util/data_util.py b/zoo/PAConv/part_seg/util/data_util.py new file mode 100644 index 0000000..01d5b77 --- /dev/null +++ b/zoo/PAConv/part_seg/util/data_util.py @@ -0,0 +1,281 @@ +import cv2 +import glob +import h5py + +import os +import json +import warnings +import numpy as np +from torch.utils.data import Dataset +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +class PartNormalDataset(Dataset): + def __init__(self, npoints=2500, split='train', normalize=False): + self.npoints = npoints + self.root = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.normalize = normalize + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k: v for k, v in self.cat.items()} + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + + if split == 'trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split == 'train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split == 'val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split == 'test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..' % (split)) + exit(-1) + + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + def __getitem__(self, index): + if index in self.cache: + point_set, normal, seg, cls = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + point_set = data[:, 0:3] + normal = data[:, 3:6] + seg = data[:, -1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, normal, seg, cls) + + if self.normalize: + point_set = pc_normalize(point_set) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + + # resample + # note that the number of points in some points clouds is less than 2048, thus use random.choice + # remember to use the same seed during train and test for a getting stable result + point_set = point_set[choice, :] + seg = seg[choice] + normal = normal[choice, :] + + # return point_set, cls, seg, normal + return point_set, cls, seg + + def __len__(self): + return len(self.datapath) + + + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + + +class ShapeNetC(Dataset): + def __init__(self, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] # number of parts for each category + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.partition = partition + self.class_choice = class_choice + # self.partseg_colors = load_color_partseg() + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + seg = self.seg[item] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + +DATA_DIR = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' +SHAPENET_C_DIR = '/mnt/lustre/share/jwren/to_kld/shapenet_c' +def load_data_partseg(partition, sub=None): + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + elif partition == 'shapenet-c': + file = os.path.join(SHAPENET_C_DIR, '%s.h5'%sub) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + + if partition == 'shapenet-c': + # for h5_name in file: + # f = h5py.File(h5_name, 'r+') + f = h5py.File(file, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') # part seg label + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + else: + for h5_name in file: + f = h5py.File(h5_name, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def load_color_partseg(): + colors = [] + labels = [] + f = open("prepare_data/meta/partseg_colors.txt") + for line in json.load(f): + colors.append(line['color']) + labels.append(line['label']) + partseg_colors = np.array(colors) + partseg_colors = partseg_colors[:, [2, 1, 0]] + partseg_labels = np.array(labels) + font = cv2.FONT_HERSHEY_SIMPLEX + img_size = 1350 + img = np.zeros((1350, 1890, 3), dtype="uint8") + cv2.rectangle(img, (0, 0), (1900, 1900), [255, 255, 255], thickness=-1) + column_numbers = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + column_gaps = [320, 320, 300, 300, 285, 285] + color_size = 64 + color_index = 0 + label_index = 0 + row_index = 16 + for row in range(0, img_size): + column_index = 32 + for column in range(0, img_size): + color = partseg_colors[color_index] + label = partseg_labels[label_index] + length = len(str(label)) + cv2.rectangle(img, (column_index, row_index), (column_index + color_size, row_index + color_size), color=(int(color[0]), int(color[1]), int(color[2])), thickness=-1) + img = cv2.putText(img, label, (column_index + int(color_size * 1.15), row_index + int(color_size / 2)), font, 0.76, (0, 0, 0), 2) + column_index = column_index + column_gaps[column] + color_index = color_index + 1 + label_index = label_index + 1 + if color_index >= 50: + cv2.imwrite("prepare_data/meta/partseg_colors.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) + return np.array(colors) + elif (column + 1 >= column_numbers[row]): + break + row_index = row_index + int(color_size * 1.3) + if (row_index >= img_size): + break + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud diff --git a/zoo/PAConv/part_seg/util/util.py b/zoo/PAConv/part_seg/util/util.py new file mode 100644 index 0000000..de53b3c --- /dev/null +++ b/zoo/PAConv/part_seg/util/util.py @@ -0,0 +1,264 @@ +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda(non_blocking=True) + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] + + +# create a file and write the text into it +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + + +# ----------------------------------------------------------------------------- +# Functions for parsing args +# ----------------------------------------------------------------------------- +import yaml +import os +from ast import literal_eval +import copy + + +class CfgNode(dict): + """ + CfgNode represents an internal node in the configuration tree. It's a simple + dict-like container that allows for attribute-based access to keys. + """ + + def __init__(self, init_dict=None, key_list=None, new_allowed=False): + # Recursively convert nested dictionaries in init_dict into CfgNodes + init_dict = {} if init_dict is None else init_dict + key_list = [] if key_list is None else key_list + for k, v in init_dict.items(): + if type(v) is dict: + # Convert dict to CfgNode + init_dict[k] = CfgNode(v, key_list=key_list + [k]) + super(CfgNode, self).__init__(init_dict) + + def __getattr__(self, name): + if name in self: + return self[name] + else: + raise AttributeError(name) + + def __setattr__(self, name, value): + self[name] = value + + def __str__(self): + def _indent(s_, num_spaces): + s = s_.split("\n") + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(num_spaces * " ") + line for line in s] + s = "\n".join(s) + s = first + "\n" + s + return s + + r = "" + s = [] + for k, v in sorted(self.items()): + seperator = "\n" if isinstance(v, CfgNode) else " " + attr_str = "{}:{}{}".format(str(k), seperator, str(v)) + attr_str = _indent(attr_str, 2) + s.append(attr_str) + r += "\n".join(s) + return r + + def __repr__(self): + return "{}({})".format(self.__class__.__name__, super(CfgNode, self).__repr__()) + + +def load_cfg_from_cfg_file(file): + cfg = {} + assert os.path.isfile(file) and file.endswith('.yaml'), \ + '{} is not a yaml file'.format(file) + + with open(file, 'r') as f: + cfg_from_file = yaml.safe_load(f) + + for key in cfg_from_file: + for k, v in cfg_from_file[key].items(): + cfg[k] = v + + cfg = CfgNode(cfg) + return cfg + + +def merge_cfg_from_list(cfg, cfg_list): + new_cfg = copy.deepcopy(cfg) + assert len(cfg_list) % 2 == 0 + for full_key, v in zip(cfg_list[0::2], cfg_list[1::2]): + subkey = full_key.split('.')[-1] + assert subkey in cfg, 'Non-existent key: {}'.format(full_key) + value = _decode_cfg_value(v) + value = _check_and_coerce_cfg_value_type( + value, cfg[subkey], subkey, full_key + ) + setattr(new_cfg, subkey, value) + + return new_cfg + + +def _decode_cfg_value(v): + """Decodes a raw config value (e.g., from a yaml config files or command + line argument) into a Python object. + """ + # All remaining processing is only applied to strings + if not isinstance(v, str): + return v + # Try to interpret `v` as a: + # string, number, tuple, list, dict, boolean, or None + try: + v = literal_eval(v) + # The following two excepts allow v to pass through when it represents a + # string. + # + # Longer explanation: + # The type of v is always a string (before calling literal_eval), but + # sometimes it *represents* a string and other times a data structure, like + # a list. In the case that v represents a string, what we got back from the + # yaml parser is 'foo' *without quotes* (so, not '"foo"'). literal_eval is + # ok with '"foo"', but will raise a ValueError if given 'foo'. In other + # cases, like paths (v = 'foo/bar' and not v = '"foo/bar"'), literal_eval + # will raise a SyntaxError. + except ValueError: + pass + except SyntaxError: + pass + return v + + +def _check_and_coerce_cfg_value_type(replacement, original, key, full_key): + """Checks that `replacement`, which is intended to replace `original` is of + the right type. The type is correct if it matches exactly or is one of a few + cases in which the type can be easily coerced. + """ + original_type = type(original) + replacement_type = type(replacement) + + # The types must match (with some exceptions) + if replacement_type == original_type: + return replacement + + # Cast replacement from from_type to to_type if the replacement and original + # types match from_type and to_type + def conditional_cast(from_type, to_type): + if replacement_type == from_type and original_type == to_type: + return True, to_type(replacement) + else: + return False, None + + # Conditionally casts + # list <-> tuple + casts = [(tuple, list), (list, tuple)] + # For py2: allow converting from str (bytes) to a unicode string + try: + casts.append((str, unicode)) # noqa: F821 + except Exception: + pass + + for (from_type, to_type) in casts: + converted, converted_value = conditional_cast(from_type, to_type) + if converted: + return converted_value + + raise ValueError( + "Type mismatch ({} vs. {}) with values ({} vs. {}) for config " + "key: {}".format( + original_type, replacement_type, original, replacement, full_key + ) + ) + +def _assert_with_logging(cond, msg): + if not cond: + logger.debug(msg) + assert cond, msg + + +def find_free_port(): + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Binding to port 0 will cause the OS to find an available port for us + sock.bind(("", 0)) + port = sock.getsockname()[1] + sock.close() + # NOTE: there is still a chance the port could be taken by other processes. + return port + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count diff --git a/zoo/PAConv/scene_seg/README.md b/zoo/PAConv/scene_seg/README.md new file mode 100755 index 0000000..90b92aa --- /dev/null +++ b/zoo/PAConv/scene_seg/README.md @@ -0,0 +1,94 @@ +# 3D Semantic Segmentation + + + + + +## Installation + +### Requirements + - Hardware: 1 GPU + - Software: + PyTorch>=1.5.0, Python>=3, CUDA>=10.2, tensorboardX, tqdm, h5py, pyYaml + +### Dataset +- Download S3DIS [dataset](https://drive.google.com/drive/folders/12wLblskNVBUeryt1xaJTQlIoJac2WehV) and symlink the paths to them as follows (you can alternatively modify the relevant paths specified in folder `config`): + ``` + mkdir -p dataset + ln -s /path_to_s3dis_dataset dataset/s3dis + ``` + +## Usage + +1. Requirement: + + - Hardware: 1 GPU to hold 6000MB for CUDA version, 2 GPUs to hold 10000MB for non-CUDA version. + - Software: + PyTorch>=1.5.0, Python3.7, CUDA>=10.2, tensorboardX, tqdm, h5py, pyYaml + +2. Train: + + - Specify the gpu used in config and then do training: + + ```shell + sh tool/train.sh s3dis pointnet2_paconv # non-cuda version + sh tool/train.sh s3dis pointnet2_paconv_cuda # cuda version + ``` + +3. Test: + + - Download [pretrained models](https://drive.google.com/drive/mobile/folders/10UAEjEIZLjnUndyORygwAW289kW9xMc7/1z5cRUG5d01d78rShJ2qbePMJqqiWzo4d/1zpmr_ircZduiVWDEe8yC-zQ1AfIn4GZF?usp=sharing&sort=13&direction=a) and put them under folder specified in config or modify the specified paths. +Our CUDA-implemented PAConv achieves [66.01](https://drive.google.com/drive/folders/1h-ZusRArRpB-8T9lZe3FRYZJA3Hm7_ua) mIoU (w/o voting) and vanilla PAConv without CUDA achieves [66.33](https://drive.google.com/drive/folders/1AacPodXqK6OO-IGnVd1pPLx7pNMMhzW0) mIoU (w/o voting) in s3dis Area-5 validation set. + + - For full testing (get listed performance): + + ```shell + CUDA_VISIBLE_DEVICES=0 sh tool/test.sh s3dis pointnet2_paconv # non-cuda version + CUDA_VISIBLE_DEVICES=0 sh tool/test.sh s3dis pointnet2_paconv_cuda # cuda version + ``` + + - For 6-fold validation (calculating the metrics with results from different folds merged): + 1) Change the [test_area index](https://github.com/CVMI-Lab/PAConv/blob/main/scene_seg/config/s3dis/s3dis_pointnet2_paconv.yaml#L7) in the config file to 1; + 2) Finish full train and test, the test result files of Area-1 will be saved in corresponding paths after the test; + 3) Repeat a,b by changing the [test_area index](https://github.com/CVMI-Lab/PAConv/blob/main/scene_seg/config/s3dis/s3dis_pointnet2_paconv.yaml#L7) to 2,3,4,5,6 respectively; + 4) Collect all the test result files of all areas to one directory and state the path to this directory [here](https://github.com/CVMI-Lab/PAConv/blob/main/scene_seg/tool/test_s3dis_6fold.py#L52); + 5) Run the code for 6-fold validation to get the final 6-fold results: + ```shell + python test_s3dis_6fold.py + ``` + + + +[comment]: <> (5. Visualization: [tensorboardX](https://github.com/lanpa/tensorboardX) incorporated for better visualization.) + +[comment]: <> ( ```shell) + +[comment]: <> ( tensorboard --logdir=run1:$EXP1,run2:$EXP2 --port=6789) + +[comment]: <> ( ```) + + +[comment]: <> (6. Other:) + +[comment]: <> ( - Video predictions: Youtube [LINK]().) + + +## Citation + +If you find our work helpful in your research, please consider citing: + +``` +@inproceedings{xu2021paconv, + title={PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds}, + author={Xu, Mutian and Ding, Runyu and Zhao, Hengshuang and Qi, Xiaojuan}, + booktitle={CVPR}, + year={2021} +} +``` + +## Contact + +You are welcome to send pull requests or share some ideas with us. Contact information: Mutian Xu (mino1018@outlook.com) or Runyu Ding (ryding@eee.hku.hk). + +## Acknowledgement +The code is partially borrowed from [PointWeb](https://github.com/hszhao/PointWeb). diff --git a/zoo/PAConv/scene_seg/config/s3dis/s3dis_pointnet2_paconv.yaml b/zoo/PAConv/scene_seg/config/s3dis/s3dis_pointnet2_paconv.yaml new file mode 100755 index 0000000..5b4dda7 --- /dev/null +++ b/zoo/PAConv/scene_seg/config/s3dis/s3dis_pointnet2_paconv.yaml @@ -0,0 +1,58 @@ +DATA: + data_name: s3dis + data_root: dataset/s3dis + train_list: dataset/s3dis/list/train12346.txt + train_full_folder: dataset/s3dis/trainval_fullarea + val_list: dataset/s3dis/list/val5.txt + test_area: 5 + classes: 13 + fea_dim: 6 # point feature dimension + block_size: 1.0 + stride_rate: 0.5 + sample_rate: 1.0 + num_point: 4096 # point number [default: 4096] + +TRAIN: + arch: pointnet2_paconv_seg + use_xyz: True + sync_bn: True # adopt sync_bn or not + ignore_label: 255 + train_gpu: + train_workers: 8 # data loader workers + train_batch_size: 16 # batch size for training + train_batch_size_val: 8 # batch size for validation during training, memory and speed tradeoff + base_lr: 0.05 + epochs: 100 + start_epoch: 0 + step_epoch: 30 + multiplier: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + manual_seed: + print_freq: 100 + save_freq: 1 + save_path: exp/s3dis/pointnet2_paconv/model + weight: # path to initial weight (default: none) + resume: + evaluate: True # evaluate on validation set, extra gpu memory needed and small batch_size_val is recommend + m: 16 + paconv: [True, True, True, True, False, False, False, False] + score_input: ed7 + kernel_input: neighbor + hidden: [16, 16, 16] + no_transformation: False + color_augment: 0.0 + norm_no_trans: True + correlation_loss: True + correlation_loss_scale: 10.0 + +TEST: + test_list: dataset/s3dis/list/val5.txt + test_list_full: dataset/s3dis/list/val5_full.txt + split: val # split in [train, val and test] + test_gpu: [0] + test_workers: 4 + test_batch_size: 8 + model_path: exp/s3dis/pointnet2_paconv/model/best_train.pth + save_folder: exp/s3dis/pointnet2_paconv/result/best_epoch/val5_0.5 # results save folder + names_path: data/s3dis/s3dis_names.txt diff --git a/zoo/PAConv/scene_seg/config/s3dis/s3dis_pointnet2_paconv_cuda.yaml b/zoo/PAConv/scene_seg/config/s3dis/s3dis_pointnet2_paconv_cuda.yaml new file mode 100755 index 0000000..f235c33 --- /dev/null +++ b/zoo/PAConv/scene_seg/config/s3dis/s3dis_pointnet2_paconv_cuda.yaml @@ -0,0 +1,60 @@ +DATA: + data_name: s3dis + data_root: dataset/s3dis + train_list: dataset/s3dis/list/train12346.txt + train_full_folder: dataset/s3dis/trainval_fullarea + val_list: dataset/s3dis/list/val5.txt + test_area: 5 + classes: 13 + fea_dim: 6 # point feature dimension + block_size: 1.0 + stride_rate: 0.5 + sample_rate: 1.0 + num_point: 4096 # point number [default: 4096] + +TRAIN: + arch: pointnet2_paconv_seg + use_xyz: True + sync_bn: True # adopt sync_bn or not + ignore_label: 255 + train_gpu: + train_workers: 8 # data loader workers + train_batch_size: 16 # batch size for training + train_batch_size_val: 8 # batch size for validation during training, memory and speed tradeoff + base_lr: 0.05 + epochs: 100 + start_epoch: 0 + step_epoch: 30 + multiplier: 0.1 + lr_multidecay: True + momentum: 0.9 + weight_decay: 0.0001 + manual_seed: + print_freq: 100 + save_freq: 1 + save_path: exp/s3dis/pointnet2_paconv_cuda/model + weight: # path to initial weight (default: none) + resume: + evaluate: True # evaluate on validation set, extra gpu memory needed and small batch_size_val is recommend + m: 16 + paconv: [True, True, True, True, False, False, False, False] + score_input: ed7 + kernel_input: neighbor + hidden: [8, 16, 16] + no_transformation: False + color_augment: 0.0 + norm_no_trans: True + correlation_loss: True + correlation_loss_scale: 10.0 + cuda: True + +TEST: + test_list: dataset/s3dis/list/val5.txt + test_list_full: dataset/s3dis/list/val5_full.txt + split: val # split in [train, val and test] + test_gpu: [0] + test_workers: 4 + test_batch_size: 8 + model_path: exp/s3dis/pointnet2_paconv_cuda/model/best_train.pth + save_folder: exp/s3dis/pointnet2_paconv_cuda/result/best_epoch/val5_0.5 # results save folder + names_path: data/s3dis/s3dis_names.txt diff --git a/zoo/PAConv/scene_seg/data/s3dis/s3dis_names.txt b/zoo/PAConv/scene_seg/data/s3dis/s3dis_names.txt new file mode 100755 index 0000000..2defe3d --- /dev/null +++ b/zoo/PAConv/scene_seg/data/s3dis/s3dis_names.txt @@ -0,0 +1,13 @@ +ceiling +floor +wall +beam +column +window +door +chair +table +bookcase +sofa +board +clutter diff --git a/zoo/PAConv/scene_seg/figure/paconv.jpg b/zoo/PAConv/scene_seg/figure/paconv.jpg new file mode 100644 index 0000000..0e31dbb Binary files /dev/null and b/zoo/PAConv/scene_seg/figure/paconv.jpg differ diff --git a/zoo/PAConv/scene_seg/figure/semseg_vis.jpg b/zoo/PAConv/scene_seg/figure/semseg_vis.jpg new file mode 100644 index 0000000..5493302 Binary files /dev/null and b/zoo/PAConv/scene_seg/figure/semseg_vis.jpg differ diff --git a/zoo/PAConv/scene_seg/model/__init__.py b/zoo/PAConv/scene_seg/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PAConv/scene_seg/model/pointnet/pointnet.py b/zoo/PAConv/scene_seg/model/pointnet/pointnet.py new file mode 100755 index 0000000..601a30e --- /dev/null +++ b/zoo/PAConv/scene_seg/model/pointnet/pointnet.py @@ -0,0 +1,155 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class STN3D(nn.Module): + def __init__(self, c): + super(STN3D, self).__init__() + self.c = c + self.conv1 = nn.Conv1d(self.c, 64, 1) + self.conv2 = nn.Conv1d(64, 128, 1) + self.conv3 = nn.Conv1d(128, 1024, 1) + self.mp = nn.AdaptiveMaxPool1d(1) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, self.c*self.c) + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.bn4 = nn.BatchNorm1d(512) + self.bn5 = nn.BatchNorm1d(256) + + def forward(self, x): + batch_size = x.size()[0] + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = self.mp(x) + x = x.view(-1, 1024) + x = F.relu(self.bn4(self.fc1(x))) + x = F.relu(self.bn5(self.fc2(x))) + x = self.fc3(x) + + iden = torch.eye(self.c).view(1, -1).repeat(batch_size, 1) + if x.is_cuda: + iden = iden.cuda() + x = x + iden + x = x.view(-1, self.c, self.c) + return x + + +class PointNetFeat(nn.Module): + def __init__(self, c=3, global_feat=True): + super(PointNetFeat, self).__init__() + self.global_feat = global_feat + self.stn1 = STN3D(c) + self.conv1 = nn.Conv1d(c, 64, 1) + self.conv2 = nn.Conv1d(64, 64, 1) + self.stn2 = STN3D(64) + self.conv3 = nn.Conv1d(64, 64, 1) + self.conv4 = nn.Conv1d(64, 128, 1) + self.conv5 = nn.Conv1d(128, 1024, 1) + self.mp = nn.AdaptiveMaxPool1d(1) + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.bn3 = nn.BatchNorm1d(64) + self.bn4 = nn.BatchNorm1d(128) + self.bn5 = nn.BatchNorm1d(1024) + + def forward(self, x): + stn1 = self.stn1(x) + x = torch.bmm(stn1, x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + stn2 = self.stn2(x) + x_tmp = torch.bmm(stn2, x) + x = F.relu(self.bn3(self.conv3(x_tmp))) + x = F.relu(self.bn4(self.conv4(x))) + x = F.relu(self.bn5(self.conv5(x))) + x = self.mp(x) + x = x.view(-1, 1024) + + if not self.global_feat: + x = x.view(-1, 1024, 1).repeat(1, 1, x_tmp.size()[2]) + x = torch.cat([x_tmp, x], 1) + return x + + +class PointNetCls(nn.Module): + def __init__(self, c=3, k=40, dropout=0.3, sync_bn=False): + super(PointNetCls, self).__init__() + self.feat = PointNetFeat(c, global_feat=True) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, k) + + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.dropout = nn.Dropout(p=dropout) + + def forward(self, x): + x = x.transpose(1, 2) + x = self.feat(x) + x = F.relu(self.bn1(self.fc1(x))) + x = F.relu(self.bn2(self.fc2(x))) + x = self.dropout(x) + x = self.fc3(x) + return x + + +# Segmentation with 9 channels input XYZ, RGB and normalized location to the room (from 0 to 1), with STN3D on input and feature +class PointNetSeg(nn.Module): + def __init__(self, c=9, k=13, sync_bn=False): + super(PointNetSeg, self).__init__() + self.feat = PointNetFeat(c, global_feat=False) + self.conv1 = nn.Conv1d(1088, 512, 1) + self.conv2 = nn.Conv1d(512, 256, 1) + self.conv3 = nn.Conv1d(256, 128, 1) + self.conv4 = nn.Conv1d(128, 128, 1) + self.conv5 = nn.Conv1d(128, k, 1) + + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.bn3 = nn.BatchNorm1d(128) + self.bn4 = nn.BatchNorm1d(128) + + def forward(self, x): + x = x.transpose(1, 2) + x = self.feat(x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = F.relu(self.bn4(self.conv4(x))) + x = self.conv5(x) + return x + + +if __name__ == '__main__': + import os + os.environ["CUDA_VISIBLE_DEVICES"] = '0' + + sim_data = torch.rand(16, 2048, 3) + + trans = STN3D(c=3) + out = trans(sim_data.transpose(1, 2)) + print('stn', out.size()) + + point_feat = PointNetFeat(global_feat=True) + out = point_feat(sim_data.transpose(1, 2)) + print('global feat', out.size()) + + point_feat = PointNetFeat(global_feat=False) + out = point_feat(sim_data.transpose(1, 2)) + print('point feat', out.size()) + + cls = PointNetCls(c=3, k=40) + out = cls(sim_data) + print('class', out.size()) + + sim_data = torch.rand(16, 2048, 9) + seg = PointNetSeg(c=9, k=13) + out = seg(sim_data) + print('seg', out.size()) diff --git a/zoo/PAConv/scene_seg/model/pointnet2/__init__.py b/zoo/PAConv/scene_seg/model/pointnet2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PAConv/scene_seg/model/pointnet2/paconv.py b/zoo/PAConv/scene_seg/model/pointnet2/paconv.py new file mode 100644 index 0000000..46b5e36 --- /dev/null +++ b/zoo/PAConv/scene_seg/model/pointnet2/paconv.py @@ -0,0 +1,257 @@ +from typing import List, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +import copy + +from util.paconv_util import weight_init, assign_score, get_ed, assign_kernel_withoutk +from lib.paconv_lib.functional import assign_score_withk as assign_score_cuda + + +class ScoreNet(nn.Module): + + def __init__(self, in_channel, out_channel, hidden_unit=[8, 8], last_bn=False, temp=1): + super(ScoreNet, self).__init__() + self.hidden_unit = hidden_unit + self.last_bn = last_bn + self.mlp_convs_hidden = nn.ModuleList() + self.mlp_bns_hidden = nn.ModuleList() + self.temp = temp + + hidden_unit = list() if hidden_unit is None else copy.deepcopy(hidden_unit) + hidden_unit.append(out_channel) + hidden_unit.insert(0, in_channel) + + for i in range(1, len(hidden_unit)): # from 1st hidden to next hidden to last hidden + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[i - 1], hidden_unit[i], 1, + bias=False if i < len(hidden_unit) - 1 else not last_bn)) + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[i])) + + def forward(self, xyz, score_norm='softmax'): + # xyz : B*3*N*K + B, _, N, K = xyz.size() + scores = xyz + + for i, conv in enumerate(self.mlp_convs_hidden): + if i < len(self.mlp_convs_hidden) - 1: + scores = F.relu(self.mlp_bns_hidden[i](conv(scores))) + else: # if the output layer, no ReLU + scores = conv(scores) + if self.last_bn: + scores = self.mlp_bns_hidden[i](scores) + if score_norm == 'softmax': + scores = F.softmax(scores/self.temp, dim=1) # + 0.5 # B*m*N*K + elif score_norm == 'sigmoid': + scores = torch.sigmoid(scores/self.temp) # + 0.5 # B*m*N*K + elif score_norm is None: + scores = scores + else: + raise ValueError('Not Implemented!') + + scores = scores.permute(0, 2, 3, 1) # B*N*K*m + + return scores + + +class PAConv(nn.Module): + + def __init__(self, input_dim, output_dim, bn, activation, config): + super().__init__() + self.score_input = config.get('score_input', 'identity') + self.score_norm = config.get('score_norm', 'softmax') + self.temp = config.get('temp', 1) + self.init = config.get('init', 'kaiming') + self.hidden = config.get('hidden', [16]) + self.m = config.get('m', 8) + self.kernel_input = config.get('kernel_input', 'neighbor') + self.input_dim = input_dim + self.output_dim = output_dim + + self.bn = nn.BatchNorm2d(output_dim, momentum=0.1) if bn else None + self.activation = activation + + if self.kernel_input == 'identity': + self.kernel_mul = 1 + elif self.kernel_input == 'neighbor': + self.kernel_mul = 2 + else: + raise ValueError() + + if self.score_input == 'identity': + self.scorenet_input_dim = 3 + elif self.score_input == 'neighbor': + self.scorenet_input_dim = 6 + elif self.score_input == 'ed7': + self.scorenet_input_dim = 7 + elif self.score_input == 'ed': + self.scorenet_input_dim = 10 + else: raise ValueError() + + if self.init == "kaiming": + _init = nn.init.kaiming_normal_ + elif self.init == "xavier": + _init = nn.init.xavier_normal_ + else: + raise ValueError('Not implemented!') + + self.scorenet = ScoreNet(self.scorenet_input_dim, self.m, hidden_unit=self.hidden, last_bn=False, temp=self.temp) + + tensor1 = _init(torch.empty(self.m, input_dim * self.kernel_mul, output_dim)).contiguous() + tensor1 = tensor1.permute(1, 0, 2).reshape(input_dim * self.kernel_mul, self.m * output_dim) + self.weightbank = nn.Parameter(tensor1, requires_grad=True) + + for m in self.modules(): + weight_init(m) + + def forward(self, args): + r""" + Parameters + ---------- + in_feat : torch.Tensor + (B, C, N1, K) tensor of the descriptors of the the features + grouped_xyz : torch.Tensor + (B, 3, N1, K) tensor of the descriptors of the the features + Returns + ------- + out_feat : torch.Tensor + (B, C, N1, \sum_k(mlps[k][-1])) tensor of the new_features descriptors + """ + + in_feat, grouped_xyz = args + B, _, N1, K = in_feat.size() + center_xyz = grouped_xyz[..., :1].repeat(1, 1, 1, K) + grouped_xyz_diff = grouped_xyz - center_xyz # b,3,n1,k + if self.kernel_input == 'neighbor': + in_feat_c = in_feat[..., :1].repeat(1, 1, 1, K) + in_feat_diff = in_feat - in_feat_c + in_feat = torch.cat((in_feat_diff, in_feat), dim=1) + + ed = get_ed(center_xyz.permute(0, 2, 3, 1).reshape(B * N1 * K, -1), + grouped_xyz.permute(0, 2, 3, 1).reshape(B * N1 * K, -1)).reshape(B, 1, N1, K) + if self.score_input == 'neighbor': + xyz = torch.cat((grouped_xyz_diff, grouped_xyz), dim=1) + elif self.score_input == 'identity': + xyz = grouped_xyz_diff + elif self.score_input == 'ed7': + xyz = torch.cat((center_xyz, grouped_xyz_diff, ed), dim=1) + elif self.score_input == 'ed10': + xyz = torch.cat((center_xyz, grouped_xyz, grouped_xyz_diff, ed), dim=1) + else: + raise NotImplementedError + + scores = self.scorenet(xyz, score_norm=self.score_norm) # b,n,k,m + out_feat = torch.matmul(in_feat.permute(0, 2, 3, 1), self.weightbank).view(B, N1, K, self.m, -1) # b,n1,k,m,cout + out_feat = assign_score(score=scores, point_input=out_feat) # b,n,k,o1, + out_feat = out_feat.permute(0, 3, 1, 2) # b,o1,n,k + + if self.bn is not None: + out_feat = self.bn(out_feat) + if self.activation is not None: + out_feat = self.activation(out_feat) + + return out_feat, grouped_xyz # b,o1,n,k b,3,n1,k + + def __repr__(self): + return 'PAConv(in_feat: {:d}, out_feat: {:d}, m: {:d}, hidden: {}, scorenet_input: {}, kernel_size: {})'.\ + format(self.input_dim, self.output_dim, self.m, self.hidden, self.scorenet_input_dim, self.weightbank.shape) + + +class PAConvCUDA(PAConv): + + def __init__(self, input_dim, output_dim, bn, activation, config): + super(PAConvCUDA, self).__init__(input_dim, output_dim, bn, activation, config) + + def forward(self, args): + + r""" + Parameters + ---------- + in_feat : torch.Tensor + (B, C, N0) tensor of the descriptors of the the features + grouped_xyz : torch.Tensor + (B, 3, N1, K) tensor of the descriptors of the the features + grouped_idx : torch.Tensor + (B, N1, K) tensor of the descriptors of the the features + Returns + ------- + out_feat : torch.Tensor + (B, C, N1) tensor of the new_features descriptors + new_xyz : torch.Tensor + (B, N1, 3) tensor of the new features' xyz + """ + in_feat, grouped_xyz, grouped_idx = args + B, Cin, N0 = in_feat.size() + _, _, N1, K = grouped_xyz.size() + center_xyz = grouped_xyz[..., :1].repeat(1, 1, 1, K) + grouped_xyz_diff = grouped_xyz - center_xyz # [B, 3, N1, K] + + ed = get_ed(center_xyz.permute(0, 2, 3, 1).reshape(B * N1 * K, -1), + grouped_xyz.permute(0, 2, 3, 1).reshape(B * N1 * K, -1)).reshape(B, 1, N1, K) + + if self.score_input == 'neighbor': + xyz = torch.cat((grouped_xyz_diff, grouped_xyz), dim=1) + elif self.score_input == 'identity': + xyz = grouped_xyz_diff + elif self.score_input == 'ed7': + xyz = torch.cat((center_xyz, grouped_xyz_diff, ed), dim=1) + elif self.score_input == 'ed': + xyz = torch.cat((center_xyz, grouped_xyz, grouped_xyz_diff, ed), dim=1) + else: + raise NotImplementedError + + scores = self.scorenet(xyz, score_norm=self.score_norm) # b,n1,k,m + kernel_feat, half_kernel_feat = assign_kernel_withoutk(in_feat, self.weightbank, self.m) + out_feat = assign_score_cuda(scores, kernel_feat, half_kernel_feat, grouped_idx, aggregate='sum') # b,o1,n1,k + if self.bn is not None: + out_feat = self.bn(out_feat) + if self.activation is not None: + out_feat = self.activation(out_feat) + + return out_feat, grouped_xyz, grouped_idx # b,o1,n,k + + def __repr__(self): + return 'PAConvCUDA(in_feat: {:d}, out_feat: {:d}, m: {:d}, hidden: {}, scorenet_input: {}, kernel_size: {})'.\ + format(self.input_dim, self.output_dim, self.m, self.hidden, self.scorenet_input_dim, self.weightbank.shape) + + +class SharedPAConv(nn.Sequential): + + def __init__( + self, + args: List[int], + *, + config, + bn: bool = False, + activation=nn.ReLU(inplace=True), + preact: bool = False, + first: bool = False, + name: str = "", + ): + super().__init__() + + for i in range(len(args) - 1): + if config.get('cuda', False): + self.add_module( + name + 'layer{}'.format(i), + PAConvCUDA( + args[i], + args[i + 1], + bn=(not first or not preact or (i != 0)) and bn, + activation=activation + if (not first or not preact or (i != 0)) else None, + config=config, + ) + ) + else: + self.add_module( + name + 'layer{}'.format(i), + PAConv( + args[i], + args[i + 1], + bn=(not first or not preact or (i != 0)) and bn, + activation=activation + if (not first or not preact or (i != 0)) else None, + config=config, + ) + ) diff --git a/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_modules.py b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_modules.py new file mode 100644 index 0000000..7d29dd8 --- /dev/null +++ b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_modules.py @@ -0,0 +1,169 @@ +from typing import List + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from lib.pointops.functions import pointops +from util import block + + +class _PointNet2SAModuleBase(nn.Module): + def __init__(self): + super().__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward(self, xyz: torch.Tensor, features: torch.Tensor = None) -> (torch.Tensor, torch.Tensor): + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor of the xyz coordinates of the features + features : torch.Tensor + (B, C, N) tensor of the descriptors of the the features + Returns + ------- + new_xyz : torch.Tensor + (B, npoint, 3) tensor of the new features' xyz + new_features : torch.Tensor + (B, \sum_k(mlps[k][-1], npoint)) tensor of the new_features descriptors + """ + new_features_list = [] + xyz_trans = xyz.transpose(1, 2).contiguous() + new_xyz = pointops.gathering( + xyz_trans, + pointops.furthestsampling(xyz, self.npoint) + ).transpose(1, 2).contiguous() if self.npoint is not None else None + for i in range(len(self.groupers)): + new_features, _ = self.groupers[i](xyz, new_xyz, features) # (B, C, npoint, nsample) + new_features = self.mlps[i](new_features) # (B, mlp[-1], npoint, nsample) + new_features = F.max_pool2d(new_features, kernel_size=[1, new_features.size(3)]) # (B, mlp[-1], npoint, 1) + new_features = new_features.squeeze(-1) # (B, mlp[-1], npoint) + new_features_list.append(new_features) + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointNet2SAModuleMSG(_PointNet2SAModuleBase): + r"""Pointnet set abstraction layer with multiscale grouping + Parameters + ---------- + npoint : int + Number of features + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet_old before the global max_pool for each scale + bn : bool + Use batchnorm + """ + def __init__(self, *, npoint: int, radii: List[float], nsamples: List[int], mlps: List[List[int]], bn: bool = True, use_xyz: bool = True): + super().__init__() + assert len(radii) == len(nsamples) == len(mlps) + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + pointops.QueryAndGroup(radius, nsample, use_xyz=use_xyz) + if npoint is not None else pointops.GroupAll(use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + self.mlps.append(block.SharedMLP(mlp_spec, bn=bn)) + + +class PointNet2SAModule(PointNet2SAModuleMSG): + r"""Pointnet set abstraction layer + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet_old before the global max_pool + bn : bool + Use batchnorm + """ + def __init__(self, *, mlp: List[int], npoint: int = None, radius: float = None, nsample: int = None, bn: bool = True, use_xyz: bool = True): + super().__init__(mlps=[mlp], npoint=npoint, radii=[radius], nsamples=[nsample], bn=bn, use_xyz=use_xyz) + + +class PointNet2FPModule(nn.Module): + r"""Propagates the features of one set to another + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + def __init__(self, *, mlp: List[int], bn: bool = True): + super().__init__() + self.mlp = block.SharedMLP(mlp, bn=bn) + + def forward(self, unknown: torch.Tensor, known: torch.Tensor, unknow_feats: torch.Tensor, known_feats: torch.Tensor) -> torch.Tensor: + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + if known is not None: + dist, idx = pointops.nearestneighbor(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_feats = pointops.interpolation(known_feats, idx, weight) + else: + interpolated_feats = known_feats.expand(*known_feats.size()[0:2], unknown.size(1)) + + if unknow_feats is not None: + new_features = torch.cat([interpolated_feats, unknow_feats], dim=1) # (B, C2 + C1, n) + else: + new_features = interpolated_feats + return self.mlp(new_features.unsqueeze(-1)).squeeze(-1) + + +if __name__ == "__main__": + torch.manual_seed(1) + torch.cuda.manual_seed_all(1) + xyz = torch.randn(2, 9, 3, requires_grad=True).cuda() + xyz_feats = torch.randn(2, 9, 6, requires_grad=True).cuda() + + test_module = PointNet2SAModuleMSG(npoint=2, radii=[5.0, 10.0], nsamples=[6, 3], mlps=[[9, 3], [9, 6]]) + test_module.cuda() + print(test_module(xyz, xyz_feats)) + + # test_module = PointNet2FPModule(mlp=[6, 6]) + # test_module.cuda() + # from torch.autograd import gradcheck + # inputs = (xyz, xyz, None, xyz_feats) + # test = gradcheck(test_module, inputs, eps=1e-6, atol=1e-4) + # print(test) + + for _ in range(1): + _, new_features = test_module(xyz, xyz_feats) + new_features.backward(torch.cuda.FloatTensor(*new_features.size()).fill_(1)) + print(new_features) + print(xyz.grad) diff --git a/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_paconv_modules.py b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_paconv_modules.py new file mode 100644 index 0000000..a38e7af --- /dev/null +++ b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_paconv_modules.py @@ -0,0 +1,261 @@ +from typing import List + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from lib.pointops.functions import pointops +from util import block +from model.pointnet2 import paconv + + +class _PointNet2SAModuleBase(nn.Module): + def __init__(self): + super().__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward(self, xyz: torch.Tensor, features: torch.Tensor = None) -> (torch.Tensor, torch.Tensor): + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N0, 3) tensor of the xyz coordinates of the features + features : torch.Tensor + (B, Cin, N) tensor of the descriptors of the the features + Returns + ------- + new_xyz : torch.Tensor + (B, N1, 3) tensor of the new features' xyz + new_features : torch.Tensor + (B, Cout, N1)) tensor of the new_features descriptors + """ + new_features_list = [] + xyz_trans = xyz.transpose(1, 2).contiguous() + if self.npoint is None: + self.npoint = xyz.shape[1] // 4 + new_xyz_idx = pointops.furthestsampling(xyz, self.npoint) # (B, N1) + new_xyz = pointops.gathering( + xyz_trans, + new_xyz_idx + ).transpose(1, 2).contiguous() if self.npoint is not None else None # (B, N1, 3) + for i in range(len(self.groupers)): + new_features, grouped_xyz, _ = self.groupers[i](xyz, new_xyz, features) + # (B, Cin+3, N1, K), (B, 3, N1, K) + if isinstance(self.mlps[i], paconv.SharedPAConv): + new_features = self.mlps[i]((new_features, grouped_xyz))[0] # (B, Cout, N1, K) + else: + new_features = self.mlps[i](new_features) # (B, Cout, N1, K) + if self.agg == 'max': + new_features = F.max_pool2d(new_features, kernel_size=[1, new_features.size(-1)]) # (B, Cout, N1, 1) + elif self.agg == 'sum': + new_features = torch.sum(new_features, dim=-1, keepdim=True) # (B, Cout, N1, 1) + elif self.agg == 'avg': + new_features = torch.mean(new_features, dim=-1, keepdim=True) # (B, Cout, N1, 1) + else: + raise ValueError('Not implemented aggregation mode.') + new_features = new_features.squeeze(-1) # (B, Cout, N1) + new_features_list.append(new_features) + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointNet2SAModuleMSG(_PointNet2SAModuleBase): + r"""Pointnet set abstraction layer with multiscale grouping + Parameters + ---------- + npoint : int + Number of features + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet_old before the global max_pool for each scale + bn : bool + Use batchnorm + """ + def __init__(self, *, npoint: int, radii: List[float], nsamples: List[int], mlps: List[List[int]], bn: bool = True, use_xyz: bool = True, use_paconv: bool = False, voxel_size=None, args=None): + super().__init__() + assert len(radii) == len(nsamples) == len(mlps) + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + self.use_xyz = use_xyz + self.agg = args.get('agg', 'max') + self.sampling = args.get('sampling', 'fps') + self.voxel_size = voxel_size + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + pointops.QueryAndGroup(radius, nsample, use_xyz=use_xyz, return_idx=True) + # if npoint is not None else pointops.GroupAll(use_xyz=use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + if use_paconv: + self.mlps.append(paconv.SharedPAConv(mlp_spec, bn=bn, config=args)) + else: + self.mlps.append(block.SharedMLP(mlp_spec, bn=bn)) + + +class PointNet2SAModule(PointNet2SAModuleMSG): + r"""Pointnet set abstraction layer + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet_old before the global max_pool + bn : bool + Use batchnorm + """ + def __init__(self, *, mlp: List[int], npoint: int = None, radius: float = None, nsample: int = None, bn: bool = True, use_xyz: bool = True, use_paconv: bool = False, args=None): + super().__init__(mlps=[mlp], npoint=npoint, radii=[radius], nsamples=[nsample], bn=bn, use_xyz=use_xyz, use_paconv=use_paconv, args=args) + + +class PointNet2SAModuleCUDA(PointNet2SAModuleMSG): + r"""Pointnet set abstraction layer + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet_old before the global max_pool + bn : bool + Use batchnorm + """ + def __init__(self, *, mlp: List[int], npoint: int = None, radius: float = None, nsample: int = None, bn: bool = True, use_xyz: bool = True, use_paconv: bool = False, args=None): + super().__init__(mlps=[mlp], npoint=npoint, radii=[radius], nsamples=[nsample], bn=bn, use_xyz=use_xyz, use_paconv=use_paconv, args=args) + + def forward(self, xyz: torch.Tensor, features: torch.Tensor = None) -> (torch.Tensor, torch.Tensor): + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N0, 3) tensor of the xyz coordinates of the features + features : torch.Tensor + (B, Cin, N0) tensor of the descriptors of the the features + Returns + ------- + new_xyz : torch.Tensor + (B, N1, 3) tensor of the new features' xyz + new_features : torch.Tensor + (B, Cout, N1)) tensor of the new_features descriptors + """ + new_features_list = [] + xyz_trans = xyz.transpose(1, 2).contiguous() + if self.npoint is None: + self.npoint = xyz.shape[1] // 4 + new_xyz_idx = pointops.furthestsampling(xyz, self.npoint) # (B, N1) + new_xyz = pointops.gathering( + xyz_trans, + new_xyz_idx + ).transpose(1, 2).contiguous() if self.npoint is not None else None # (B, N1, 3) + new_features = features + for i in range(len(self.groupers)): + for j in range(len(self.mlps[i])): + _, grouped_xyz, grouped_idx = self.groupers[i](xyz, new_xyz, new_features) + # (B, Cin+3, N1, K), (B, 3, N1, K), (B, N1, K) + if self.use_xyz and j == 0: + new_features = torch.cat((xyz.permute(0, 2, 1), new_features), dim=1) + if isinstance(self.mlps[i], paconv.SharedPAConv): + grouped_new_features = self.mlps[i][j]((new_features, grouped_xyz, grouped_idx))[0] # (B, Cout, N1, K) + else: + raise NotImplementedError + if self.agg == 'max': + new_features = F.max_pool2d(grouped_new_features, kernel_size=[1, grouped_new_features.size(3)]) # (B, Cout, N1, 1) + elif self.agg == 'sum': + new_features = torch.sum(grouped_new_features, dim=-1, keepdim=True) # (B, Cout, N1, 1) + else: + raise ValueError('Not implemented aggregation mode.') + xyz = new_xyz + new_features = new_features.squeeze(-1).contiguous() # (B, Cout, N1) + new_features_list.append(new_features) + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointNet2FPModule(nn.Module): + r"""Propagates the features of one set to another + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + def __init__(self, *, mlp: List[int], bn: bool = True, use_paconv=False, args=None): + super().__init__() + self.use_paconv = use_paconv + if self.use_paconv: + self.mlp = paconv.SharedPAConv(mlp, bn=bn, config=args) + else: + self.mlp = block.SharedMLP(mlp, bn=bn) + + def forward(self, unknown: torch.Tensor, known: torch.Tensor, unknow_feats: torch.Tensor, known_feats: torch.Tensor) -> torch.Tensor: + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + if known is not None: + dist, idx = pointops.nearestneighbor(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_feats = pointops.interpolation(known_feats, idx, weight) + else: + interpolated_feats = known_feats.expand(*known_feats.size()[0:2], unknown.size(1)) + + if unknow_feats is not None: + new_features = torch.cat([interpolated_feats, unknow_feats], dim=1) # (B, C2 + C1, n) + else: + new_features = interpolated_feats + + return self.mlp(new_features.unsqueeze(-1)).squeeze(-1) + + +if __name__ == "__main__": + torch.manual_seed(1) + torch.cuda.manual_seed_all(1) + xyz = torch.randn(2, 9, 3, requires_grad=True).cuda() + xyz_feats = torch.randn(2, 9, 6, requires_grad=True).cuda() + + test_module = PointNet2SAModuleMSG(npoint=2, radii=[5.0, 10.0], nsamples=[6, 3], mlps=[[9, 3], [9, 6]]) + test_module.cuda() + print(test_module(xyz, xyz_feats)) + + # test_module = PointNet2FPModule(mlp=[6, 6]) + # test_module.cuda() + # from torch.autograd import gradcheck + # inputs = (xyz, xyz, None, xyz_feats) + # test = gradcheck(test_module, inputs, eps=1e-6, atol=1e-4) + # print(test) + + for _ in range(1): + _, new_features = test_module(xyz, xyz_feats) + new_features.backward(torch.cuda.FloatTensor(*new_features.size()).fill_(1)) + print(new_features) + print(xyz.grad) diff --git a/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_paconv_seg.py b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_paconv_seg.py new file mode 100755 index 0000000..01e51e1 --- /dev/null +++ b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_paconv_seg.py @@ -0,0 +1,125 @@ +from collections import namedtuple + +import torch +import torch.nn as nn + +from model.pointnet2.pointnet2_paconv_modules import PointNet2FPModule +from util import block + + +class PointNet2SSGSeg(nn.Module): + r""" + PointNet2 with single-scale grouping + Semantic segmentation network that uses feature propogation layers + Parameters + ---------- + k: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + c: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, c=3, k=13, use_xyz=True, args=None): + super().__init__() + self.nsamples = args.get('nsamples', [32, 32, 32, 32]) + self.npoints = args.get('npoints', [None, None, None, None]) + self.sa_mlps = args.get('sa_mlps', [[c, 32, 32, 64], [64, 64, 64, 128], [128, 128, 128, 256], [256, 256, 256, 512]]) + self.fp_mlps = args.get('fp_mlps', [[128 + c, 128, 128, 128], [256 + 64, 256, 128], [256 + 128, 256, 256], [512 + 256, 256, 256]]) + self.paconv = args.get('pointnet2_paconv', [True, True, True, True, False, False, False, False]) + self.fc = args.get('fc', 128) + + if args.get('cuda', False): + from model.pointnet2.pointnet2_paconv_modules import PointNet2SAModuleCUDA as PointNet2SAModule + else: + from model.pointnet2.pointnet2_paconv_modules import PointNet2SAModule + + self.SA_modules = nn.ModuleList() + self.SA_modules.append(PointNet2SAModule(npoint=self.npoints[0], nsample=self.nsamples[0], mlp=self.sa_mlps[0], use_xyz=use_xyz, + use_paconv=self.paconv[0], args=args)) + self.SA_modules.append(PointNet2SAModule(npoint=self.npoints[1], nsample=self.nsamples[1], mlp=self.sa_mlps[1], use_xyz=use_xyz, + use_paconv=self.paconv[1], args=args)) + self.SA_modules.append(PointNet2SAModule(npoint=self.npoints[2], nsample=self.nsamples[2], mlp=self.sa_mlps[2], use_xyz=use_xyz, + use_paconv=self.paconv[2], args=args)) + self.SA_modules.append(PointNet2SAModule(npoint=self.npoints[3], nsample=self.nsamples[3], mlp=self.sa_mlps[3], use_xyz=use_xyz, + use_paconv=self.paconv[3], args=args)) + self.FP_modules = nn.ModuleList() + self.FP_modules.append(PointNet2FPModule(mlp=self.fp_mlps[0], use_paconv=self.paconv[4], args=args)) + self.FP_modules.append(PointNet2FPModule(mlp=self.fp_mlps[1], use_paconv=self.paconv[5], args=args)) + self.FP_modules.append(PointNet2FPModule(mlp=self.fp_mlps[2], use_paconv=self.paconv[6], args=args)) + self.FP_modules.append(PointNet2FPModule(mlp=self.fp_mlps[3], use_paconv=self.paconv[7], args=args)) + self.FC_layer = nn.Sequential(block.Conv2d(self.fc, self.fc, bn=True), nn.Dropout(), block.Conv2d(self.fc, k, activation=None)) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = (pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None) + return xyz, features + + def forward(self, pointcloud: torch.cuda.FloatTensor): + r""" + Forward pass of the network + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + l_xyz, l_features = [xyz], [features] + for i in range(len(self.SA_modules)): + li_xyz, li_features = self.SA_modules[i](l_xyz[i], l_features[i]) + l_xyz.append(li_xyz) + l_features.append(li_features) + for i in range(-1, -(len(self.FP_modules) + 1), -1): + l_features[i - 1] = self.FP_modules[i](l_xyz[i - 1], l_xyz[i], l_features[i - 1], l_features[i]) + # return self.FC_layer(l_features[0]) + return self.FC_layer(l_features[0].unsqueeze(-1)).squeeze(-1) + + +def model_fn_decorator(criterion): + ModelReturn = namedtuple("ModelReturn", ['preds', 'loss', 'acc']) + + def model_fn(model, data, eval=False): + with torch.set_grad_enabled(not eval): + inputs, labels = data + inputs = inputs.cuda(non_blocking=True) + labels = labels.cuda(non_blocking=True) + preds = model(inputs) + loss = criterion(preds, labels) + _, classes = torch.max(preds, 1) + acc = (classes == labels).float().sum() / labels.numel() + return ModelReturn(preds, loss, {"acc": acc.item(), 'loss': loss.item()}) + return model_fn + + +if __name__ == "__main__": + import torch.optim as optim + B, N, C, K = 2, 4096, 3, 13 + inputs = torch.randn(B, N, 6)#.cuda() + labels = torch.randint(0, 3, (B, N))#.cuda() + + model = PointNet2SSGSeg(c=C, k=K)#.cuda() + optimizer = optim.SGD(model.parameters(), lr=5e-2, momentum=0.9, weight_decay=1e-4) + print("Testing SSGCls with xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.item()) + optimizer.step() + + model = PointNet2SSGSeg(c=C, k=K, use_xyz=False).cuda() + optimizer = optim.SGD(model.parameters(), lr=5e-2, momentum=0.9, weight_decay=1e-4) + print("Testing SSGCls without xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.item()) + optimizer.step() diff --git a/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_seg.py b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_seg.py new file mode 100755 index 0000000..62a6b3e --- /dev/null +++ b/zoo/PAConv/scene_seg/model/pointnet2/pointnet2_seg.py @@ -0,0 +1,170 @@ +from collections import namedtuple + +import torch +import torch.nn as nn + +from model.pointnet2.pointnet2_modules import PointNet2SAModule, PointNet2SAModuleMSG, PointNet2FPModule +from util import block + + +class PointNet2SSGSeg(nn.Module): + r""" + PointNet2 with single-scale grouping + Semantic segmentation network that uses feature propogation layers + Parameters + ---------- + k: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + c: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, c=3, k=13, use_xyz=True, args=None): + super().__init__() + self.SA_modules = nn.ModuleList() + self.SA_modules.append(PointNet2SAModule(npoint=1024, nsample=32, mlp=[c, 32, 32, 64], use_xyz=use_xyz)) + self.SA_modules.append(PointNet2SAModule(npoint=256, nsample=32, mlp=[64, 64, 64, 128], use_xyz=use_xyz)) + self.SA_modules.append(PointNet2SAModule(npoint=64, nsample=32, mlp=[128, 128, 128, 256], use_xyz=use_xyz)) + self.SA_modules.append(PointNet2SAModule(npoint=16, nsample=32, mlp=[256, 256, 256, 512], use_xyz=use_xyz)) + self.FP_modules = nn.ModuleList() + self.FP_modules.append(PointNet2FPModule(mlp=[128 + c, 128, 128, 128])) + self.FP_modules.append(PointNet2FPModule(mlp=[256 + 64, 256, 128])) + self.FP_modules.append(PointNet2FPModule(mlp=[256 + 128, 256, 256])) + self.FP_modules.append(PointNet2FPModule(mlp=[512 + 256, 256, 256])) + self.FC_layer = nn.Sequential(block.Conv2d(128, 128, bn=True), nn.Dropout(), block.Conv2d(128, k, activation=None)) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = (pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None) + return xyz, features + + def forward(self, pointcloud: torch.cuda.FloatTensor): + r""" + Forward pass of the network + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + l_xyz, l_features = [xyz], [features] + for i in range(len(self.SA_modules)): + li_xyz, li_features = self.SA_modules[i](l_xyz[i], l_features[i]) + l_xyz.append(li_xyz) + l_features.append(li_features) + for i in range(-1, -(len(self.FP_modules) + 1), -1): + l_features[i - 1] = self.FP_modules[i](l_xyz[i - 1], l_xyz[i], l_features[i - 1], l_features[i]) + # return self.FC_layer(l_features[0]) + return self.FC_layer(l_features[0].unsqueeze(-1)).squeeze(-1) + + +class PointNet2MSGSeg(PointNet2SSGSeg): + r""" + PointNet2 with multi-scale grouping + Semantic segmentation network that uses feature propogation layers + Parameters + ---------- + k: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + c: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, k, c=6, use_xyz=True): + super().__init__() + self.SA_modules = nn.ModuleList() + c_in = c + self.SA_modules.append(PointNet2SAModuleMSG(npoint=1024, radii=[0.05, 0.1], nsamples=[16, 32], mlps=[[c_in, 16, 16, 32], [c_in, 32, 32, 64]], use_xyz=use_xyz )) + c_out_0 = 32 + 64 + c_in = c_out_0 + self.SA_modules.append(PointNet2SAModuleMSG(npoint=256, radii=[0.1, 0.2], nsamples=[16, 32], mlps=[[c_in, 64, 64, 128], [c_in, 64, 96, 128]], use_xyz=use_xyz)) + c_out_1 = 128 + 128 + c_in = c_out_1 + self.SA_modules.append(PointNet2SAModuleMSG(npoint=64, radii=[0.2, 0.4], nsamples=[16, 32], mlps=[[c_in, 128, 196, 256], [c_in, 128, 196, 256]], use_xyz=use_xyz)) + c_out_2 = 256 + 256 + c_in = c_out_2 + self.SA_modules.append(PointNet2SAModuleMSG(npoint=16, radii=[0.4, 0.8], nsamples=[16, 32], mlps=[[c_in, 256, 256, 512], [c_in, 256, 384, 512]], use_xyz=use_xyz)) + c_out_3 = 512 + 512 + self.FP_modules = nn.ModuleList() + self.FP_modules.append(PointNet2FPModule(mlp=[256 + c, 128, 128])) + self.FP_modules.append(PointNet2FPModule(mlp=[512 + c_out_0, 256, 256])) + self.FP_modules.append(PointNet2FPModule(mlp=[512 + c_out_1, 512, 512])) + self.FP_modules.append(PointNet2FPModule(mlp=[c_out_3 + c_out_2, 512, 512])) + self.FC_layer = nn.Sequential(block.Conv2d(128, 128, bn=True), nn.Dropout(), block.Conv2d(128, k, activation=None)) + + +def model_fn_decorator(criterion): + ModelReturn = namedtuple("ModelReturn", ['preds', 'loss', 'acc']) + + def model_fn(model, data, eval=False): + with torch.set_grad_enabled(not eval): + inputs, labels = data + inputs = inputs.cuda(non_blocking=True) + labels = labels.cuda(non_blocking=True) + preds = model(inputs) + loss = criterion(preds, labels) + _, classes = torch.max(preds, 1) + acc = (classes == labels).float().sum() / labels.numel() + return ModelReturn(preds, loss, {"acc": acc.item(), 'loss': loss.item()}) + return model_fn + + +if __name__ == "__main__": + import torch.optim as optim + B, N, C, K = 2, 4096, 3, 13 + inputs = torch.randn(B, N, 6)#.cuda() + labels = torch.randint(0, 3, (B, N))#.cuda() + + model = PointNet2SSGSeg(c=C, k=K)#.cuda() + optimizer = optim.SGD(model.parameters(), lr=5e-2, momentum=0.9, weight_decay=1e-4) + print("Testing SSGCls with xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.item()) + optimizer.step() + + model = PointNet2SSGSeg(c=C, k=K, use_xyz=False).cuda() + optimizer = optim.SGD(model.parameters(), lr=5e-2, momentum=0.9, weight_decay=1e-4) + print("Testing SSGCls without xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.item()) + optimizer.step() + + model = PointNet2MSGSeg(c=C, k=K).cuda() + optimizer = optim.SGD(model.parameters(), lr=5e-2, momentum=0.9, weight_decay=1e-4) + print("Testing MSGCls with xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.item()) + optimizer.step() + + model = PointNet2MSGSeg(c=C, k=K, use_xyz=False).cuda() + optimizer = optim.SGD(model.parameters(), lr=5e-2, momentum=0.9, weight_decay=1e-4) + print("Testing MSGCls without xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.item()) + optimizer.step() + diff --git a/zoo/PAConv/scene_seg/tool/test.sh b/zoo/PAConv/scene_seg/tool/test.sh new file mode 100755 index 0000000..2814e39 --- /dev/null +++ b/zoo/PAConv/scene_seg/tool/test.sh @@ -0,0 +1,18 @@ +#!/bin/sh +export PYTHONPATH=./ + +PYTHON=python +dataset=$1 +exp_name=$2 +exp_dir=exp/${dataset}/${exp_name} +model_dir=${exp_dir}/model +config=config/${dataset}/${dataset}_${exp_name}.yaml + +mkdir -p ${model_dir} +now=$(date +"%Y%m%d_%H%M%S") + +if [ ${dataset} = 's3dis' ] +then + cp tool/test.sh tool/test_s3dis.py ${config} ${exp_dir} + $PYTHON tool/test_s3dis.py --config=${config} 2>&1 | tee ${model_dir}/test-$now.log +fi diff --git a/zoo/PAConv/scene_seg/tool/test_s3dis.py b/zoo/PAConv/scene_seg/tool/test_s3dis.py new file mode 100644 index 0000000..969fcad --- /dev/null +++ b/zoo/PAConv/scene_seg/tool/test_s3dis.py @@ -0,0 +1,198 @@ +import os +import time +import random +import numpy as np +import logging +import pickle +import argparse + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.optim +import torch.utils.data + +from util.util import AverageMeter, intersectionAndUnion, check_makedirs, get_parser, get_logger + +random.seed(123) +np.random.seed(123) + + +def main(): + global args, logger + args = get_parser() + logger = get_logger() + logger.info(args) + assert args.classes > 1 + os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(str(x) for x in args.test_gpu) + logger.info("=> creating model ...") + logger.info("Classes: {}".format(args.classes)) + + if args.arch == 'pointnet_seg': + from model.pointnet.pointnet import PointNetSeg as Model + elif args.arch == 'pointnet2_seg': + from model.pointnet2.pointnet2_seg import PointNet2SSGSeg as Model + elif args.arch == 'pointnet2_paconv_seg': + from model.pointnet2.pointnet2_paconv_seg import PointNet2SSGSeg as Model + else: + raise Exception('architecture not supported yet'.format(args.arch)) + model = Model(c=args.fea_dim, k=args.classes, use_xyz=args.use_xyz, args=args) + model = torch.nn.DataParallel(model.cuda()) + logger.info(model) + criterion = nn.CrossEntropyLoss(ignore_index=args.ignore_label).cuda() + names = [line.rstrip('\n') for line in open(args.names_path)] + if os.path.isfile(args.model_path): + logger.info("=> loading checkpoint '{}'".format(args.model_path)) + checkpoint = torch.load(args.model_path) + model.load_state_dict(checkpoint['state_dict'], strict=True) + logger.info("=> loaded checkpoint '{}'".format(args.model_path)) + else: + raise RuntimeError("=> no checkpoint found at '{}'".format(args.model_path)) + test(model, criterion, names) + + +def data_prepare(room_path): + room_data = np.load(room_path) + points, labels = room_data[:, 0:6], room_data[:, 6] # xyzrgb, N*6; l, N + coord_min, coord_max = np.amin(points, axis=0)[:3], np.amax(points, axis=0)[:3] + stride = args.block_size * args.stride_rate + grid_x = int(np.ceil(float(coord_max[0] - coord_min[0] - args.block_size) / stride) + 1) + grid_y = int(np.ceil(float(coord_max[1] - coord_min[1] - args.block_size) / stride) + 1) + data_room, label_room, index_room = np.array([]), np.array([]), np.array([]) + for index_y in range(0, grid_y): + for index_x in range(0, grid_x): + s_x = coord_min[0] + index_x * stride + e_x = min(s_x + args.block_size, coord_max[0]) + s_x = e_x - args.block_size + s_y = coord_min[1] + index_y * stride + e_y = min(s_y + args.block_size, coord_max[1]) + s_y = e_y - args.block_size + point_idxs = np.where((points[:, 0] >= s_x - 1e-8) & (points[:, 0] <= e_x + 1e-8) & (points[:, 1] >= s_y - 1e-8) & (points[:, 1] <= e_y + 1e-8))[0] + if point_idxs.size == 0: + continue + num_batch = int(np.ceil(point_idxs.size / args.num_point)) + point_size = int(num_batch * args.num_point) + replace = False if (point_size - point_idxs.size <= point_idxs.size) else True + point_idxs_repeat = np.random.choice(point_idxs, point_size - point_idxs.size, replace=replace) + point_idxs = np.concatenate((point_idxs, point_idxs_repeat)) + np.random.shuffle(point_idxs) + data_batch = points[point_idxs, :] + normlized_xyz = np.zeros((point_size, 3)) + normlized_xyz[:, 0] = data_batch[:, 0] / coord_max[0] + normlized_xyz[:, 1] = data_batch[:, 1] / coord_max[1] + normlized_xyz[:, 2] = data_batch[:, 2] / coord_max[2] + data_batch[:, 0] = data_batch[:, 0] - (s_x + args.block_size / 2.0) + data_batch[:, 1] = data_batch[:, 1] - (s_y + args.block_size / 2.0) + data_batch[:, 3:6] /= 255.0 + + fea_dim = args.get('fea_dim', 6) + if fea_dim == 3: + data_batch = data_batch + elif fea_dim == 6: + data_batch = np.concatenate((data_batch, normlized_xyz), axis=-1) + label_batch = labels[point_idxs] + data_room = np.vstack([data_room, data_batch]) if data_room.size else data_batch + label_room = np.hstack([label_room, label_batch]) if label_room.size else label_batch + index_room = np.hstack([index_room, point_idxs]) if index_room.size else point_idxs + assert np.unique(index_room).size == labels.size + return data_room, label_room, index_room, labels + + +def test(model, criterion, names): + logger.info('>>>>>>>>>>>>>>>> Start Evaluation >>>>>>>>>>>>>>>>') + batch_time = AverageMeter() + intersection_meter = AverageMeter() + union_meter = AverageMeter() + target_meter = AverageMeter() + + model.eval() + rooms = sorted(os.listdir(args.train_full_folder)) + rooms_split = [room for room in rooms if 'Area_{}'.format(args.test_area) in room] + gt_all, pred_all = np.array([]), np.array([]) + check_makedirs(args.save_folder) + pred_save, gt_save = [], [] + for idx, room_name in enumerate(rooms_split): + data_room, label_room, index_room, gt = data_prepare(os.path.join(args.train_full_folder, room_name)) + batch_point = args.num_point * args.test_batch_size + batch_num = int(np.ceil(label_room.size / batch_point)) + end = time.time() + output_room = np.array([]) + for i in range(batch_num): + s_i, e_i = i * batch_point, min((i + 1) * batch_point, label_room.size) + input, target, index = data_room[s_i:e_i, :], label_room[s_i:e_i], index_room[s_i:e_i] + input = torch.from_numpy(input).float().view(-1, args.num_point, input.shape[1]) + target = torch.from_numpy(target).long().view(-1, args.num_point) + with torch.no_grad(): + output = model(input.cuda()) + loss = criterion(output, target.cuda()) # for reference + output = output.transpose(1, 2).contiguous().view(-1, args.classes).data.cpu().numpy() + pred = np.argmax(output, axis=1) + intersection, union, target = intersectionAndUnion(pred, target.view(-1).data.cpu().numpy(), args.classes, args.ignore_label) + accuracy = sum(intersection) / (sum(target) + 1e-10) + output_room = np.vstack([output_room, output]) if output_room.size else output + batch_time.update(time.time() - end) + end = time.time() + if ((i + 1) % args.print_freq == 0) or (i + 1 == batch_num): + logger.info('Test: [{}/{}]-[{}/{}] ' + 'Batch {batch_time.val:.3f} ({batch_time.avg:.3f}) ' + 'Loss {loss:.4f} ' + 'Accuracy {accuracy:.4f} ' + 'Points {gt.size}.'.format(idx + 1, len(rooms_split), + i + 1, batch_num, + batch_time=batch_time, + loss=loss, + accuracy=accuracy, + gt=gt)) + ''' + unq, unq_inv, unq_cnt = np.unique(index_room, return_inverse=True, return_counts=True) + index_array = np.split(np.argsort(unq_inv), np.cumsum(unq_cnt[:-1])) + output_room = np.vstack([output_room, np.zeros((1, args.classes))]) + index_array_fill = np.array(list(itertools.zip_longest(*index_array, fillvalue=output_room.shape[0] - 1))).T + pred = output_room[index_array_fill].sum(1) + pred = np.argmax(pred, axis=1) + ''' + pred = np.zeros((gt.size, args.classes)) + for j in range(len(index_room)): + pred[index_room[j]] += output_room[j] + pred = np.argmax(pred, axis=1) + + # calculation 1: add per room predictions + intersection, union, target = intersectionAndUnion(pred, gt, args.classes, args.ignore_label) + intersection_meter.update(intersection) + union_meter.update(union) + target_meter.update(target) + # calculation 2 + pred_all = np.hstack([pred_all, pred]) if pred_all.size else pred + gt_all = np.hstack([gt_all, gt]) if gt_all.size else gt + pred_save.append(pred), gt_save.append(gt) + + with open(os.path.join(args.save_folder, "pred_{}.pickle".format(args.test_area)), 'wb') as handle: + pickle.dump({'pred': pred_save}, handle, protocol=pickle.HIGHEST_PROTOCOL) + with open(os.path.join(args.save_folder, "gt_{}.pickle".format(args.test_area)), 'wb') as handle: + pickle.dump({'gt': gt_save}, handle, protocol=pickle.HIGHEST_PROTOCOL) + + # calculation 1 + iou_class = intersection_meter.sum / (union_meter.sum + 1e-10) + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mIoU1 = np.mean(iou_class) + mAcc1 = np.mean(accuracy_class) + allAcc1 = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) + + # calculation 2 + intersection, union, target = intersectionAndUnion(pred_all, gt_all, args.classes, args.ignore_label) + iou_class = intersection / (union + 1e-10) + accuracy_class = intersection / (target + 1e-10) + mIoU = np.mean(iou_class) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection) / (sum(target) + 1e-10) + logger.info('Val result: mIoU/mAcc/allAcc {:.4f}/{:.4f}/{:.4f}.'.format(mIoU, mAcc, allAcc)) + logger.info('Val1 result: mIoU/mAcc/allAcc {:.4f}/{:.4f}/{:.4f}.'.format(mIoU1, mAcc1, allAcc1)) + + for i in range(args.classes): + logger.info('Class_{} Result: iou/accuracy {:.4f}/{:.4f}, name: {}.'.format(i, iou_class[i], accuracy_class[i], names[i])) + logger.info('<<<<<<<<<<<<<<<<< End Evaluation <<<<<<<<<<<<<<<<<') + return mIoU, mAcc, allAcc, pred_all + + +if __name__ == '__main__': + main() diff --git a/zoo/PAConv/scene_seg/tool/test_s3dis_6fold.py b/zoo/PAConv/scene_seg/tool/test_s3dis_6fold.py new file mode 100644 index 0000000..ef368aa --- /dev/null +++ b/zoo/PAConv/scene_seg/tool/test_s3dis_6fold.py @@ -0,0 +1,91 @@ +import os +import numpy as np +import pickle5 as pickle +import logging + +from util.util import AverageMeter, intersectionAndUnion, check_makedirs + + +def get_logger(): + logger_name = "main-logger" + logger = logging.getLogger(logger_name) + logger.setLevel(logging.INFO) + handler = logging.StreamHandler() + fmt = "[%(asctime)s %(levelname)s %(filename)s line %(lineno)d %(process)d] %(message)s" + handler.setFormatter(logging.Formatter(fmt)) + logger.addHandler(handler) + return logger + + +def get_color(i): + ''' Parse a 24-bit integer as a RGB color. I.e. Convert to base 256 + Args: + index: An int. The first 24 bits will be interpreted as a color. + Negative values will not work properly. + Returns: + color: A color s.t. get_index( get_color( i ) ) = i + ''' + b = (i) % 256 # least significant byte + g = (i >> 8) % 256 + r = (i >> 16) % 256 # most significant byte + return r, g, b + + +def main(): + global logger + logger = get_logger() + + classes = 13 + color_map = np.zeros((classes, 3)) + names = [line.rstrip('\n') for line in open('data/s3dis/s3dis_names.txt')] + for i in range(classes): + color_map[i, :] = get_color(i) + data_root = 'dataset/s3dis/trainval_fullarea' + data_list = sorted(os.listdir(data_root)) + data_list = [item[:-4] for item in data_list if 'Area_' in item] + intersection_meter, union_meter, target_meter = AverageMeter(), AverageMeter(), AverageMeter() + + logger.info('<<<<<<<<<<<<<<<<< Start Evaluation <<<<<<<<<<<<<<<<<') + test_area = [1, 2, 3, 4, 5, 6] + for i in range(len(test_area)): + # result_path = os.path.join('exp/s3dis', exp_list[test_area[i]-1], 'result') + result_path = '/exp/s3dis/6-fold' # where to save all result files + # pred_save_folder = os.path.join(result_path, 'best_visual/pred') + # label_save_folder = os.path.join(result_path, 'best_visual/label') + # image_save_folder = os.path.join(result_path, 'best_visual/image') + # check_makedirs(pred_save_folder); check_makedirs(label_save_folder); check_makedirs(image_save_folder) + with open(os.path.join(result_path, 'pred_{}'.format(test_area[i]) + '.pickle'), 'rb') as handle: + pred = pickle.load(handle)['pred'] + with open(os.path.join(result_path, 'gt_{}'.format(test_area[i]) + '.pickle'), 'rb') as handle: + label = pickle.load(handle)['gt'] + data_split = [item for item in data_list if 'Area_{}'.format(test_area[i]) in item] + assert len(pred) == len(label) == len(data_split) + for j in range(len(data_split)): + print('processing [{}/{}]-[{}/{}]'.format(i+1, len(test_area), j+1, len(data_split))) + # data_name = data_split[j] + # data = np.load(os.path.join(data_root, data_name + '.npy')) + # coord, feat = data[:, :3], data[:, 3:6] + pred_j, label_j = pred[j].astype(np.uint8), label[j].astype(np.uint8) + # pred_j_color, label_j_color = color_map[pred_j, :], color_map[label_j, :] + # vis_util.write_ply_color(coord, pred_j, os.path.join(pred_save_folder, data_name +'.obj')) + # vis_util.write_ply_color(coord, label_j, os.path.join(label_save_folder, data_name + '.obj')) + # vis_util.write_ply_rgb(coord, feat, os.path.join(image_save_folder, data_name + '.obj')) + intersection, union, target = intersectionAndUnion(pred_j, label_j, classes, ignore_index=255) + intersection_meter.update(intersection) + union_meter.update(union) + target_meter.update(target) + + iou_class = intersection_meter.sum / (union_meter.sum + 1e-10) + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mIoU = np.mean(iou_class) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) + logger.info('Val result: mIoU/mAcc/allAcc {:.4f}/{:.4f}/{:.4f}.'.format(mIoU, mAcc, allAcc)) + + for i in range(classes): + logger.info('Class_{} Result: iou/accuracy {:.4f}/{:.4f}, name: {}.'.format(i, iou_class[i], accuracy_class[i], names[i])) + logger.info('<<<<<<<<<<<<<<<<< End Evaluation <<<<<<<<<<<<<<<<<') + + +if __name__ == '__main__': + main() diff --git a/zoo/PAConv/scene_seg/tool/train.py b/zoo/PAConv/scene_seg/tool/train.py new file mode 100755 index 0000000..b4b64af --- /dev/null +++ b/zoo/PAConv/scene_seg/tool/train.py @@ -0,0 +1,318 @@ +import os +import time +import random +import numpy as np +import subprocess + +import torch +import torch.backends.cudnn as cudnn +import torch.nn as nn +import torch.nn.parallel +import torch.optim +import torch.utils.data +import torch.optim.lr_scheduler as lr_scheduler +from tensorboardX import SummaryWriter + +from util import dataset, transform +from util.s3dis import S3DIS +from util.util import AverageMeter, intersectionAndUnionGPU, get_logger, get_parser +from model.pointnet2.paconv import PAConv + + +def worker_init_fn(worker_id): + random.seed(args.manual_seed + worker_id) + + +def init(): + global args, logger, writer + args = get_parser() + logger = get_logger() + writer = SummaryWriter(args.save_path) + if args.train_gpu is not None: + os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(str(x) for x in args.train_gpu) + if args.manual_seed is not None: + cudnn.benchmark = False + cudnn.deterministic = True + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + if args.train_gpu is not None and len(args.train_gpu) == 1: + args.sync_bn = False + logger.info(args) + + +def get_git_commit_id(): + if not os.path.exists('.git'): + return '0000000' + cmd_out = subprocess.run(['git', 'rev-parse', 'HEAD'], stdout=subprocess.PIPE) + git_commit_id = cmd_out.stdout.decode('utf-8')[:7] + return git_commit_id + + +def main(): + init() + if args.arch == 'pointnet_seg': + from model.pointnet.pointnet import PointNetSeg as Model + elif args.arch == 'pointnet2_seg': + from model.pointnet2.pointnet2_seg import PointNet2SSGSeg as Model + elif args.arch == 'pointnet2_paconv_seg': + from model.pointnet2.pointnet2_paconv_seg import PointNet2SSGSeg as Model + else: + raise Exception('architecture not supported yet'.format(args.arch)) + model = Model(c=args.fea_dim, k=args.classes, use_xyz=args.use_xyz, args=args) + + best_mIoU = 0.0 + + if args.sync_bn: + from util.util import convert_to_syncbn + convert_to_syncbn(model) + criterion = nn.CrossEntropyLoss(ignore_index=args.ignore_label).cuda() + optimizer = torch.optim.SGD(model.parameters(), lr=args.base_lr, momentum=args.momentum, weight_decay=args.weight_decay) + if args.get('lr_multidecay', False): + scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[int(args.epochs * 0.6), int(args.epochs * 0.8)], gamma=args.multiplier) + else: + scheduler = lr_scheduler.StepLR(optimizer, step_size=args.step_epoch, gamma=args.multiplier) + logger.info("=> creating model ...") + logger.info("Classes: {}".format(args.classes)) + logger.info(model) + model = torch.nn.DataParallel(model.cuda()) + if args.sync_bn: + from lib.sync_bn import patch_replication_callback + patch_replication_callback(model) + if args.weight: + if os.path.isfile(args.weight): + logger.info("=> loading weight '{}'".format(args.weight)) + checkpoint = torch.load(args.weight) + model.load_state_dict(checkpoint['state_dict']) + logger.info("=> loaded weight '{}'".format(args.weight)) + else: + logger.info("=> no weight found at '{}'".format(args.weight)) + + if args.resume: + if os.path.isfile(args.resume): + logger.info("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=lambda storage, loc: storage.cuda()) + args.start_epoch = checkpoint['epoch'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + scheduler.load_state_dict(checkpoint['scheduler']) + try: + best_mIoU = checkpoint['val_mIoU'] + except Exception: + pass + logger.info("=> loaded checkpoint '{}' (epoch {})".format(args.resume, checkpoint['epoch'])) + else: + logger.info("=> no checkpoint found at '{}'".format(args.resume)) + + if args.get('no_transformation', True): + train_transform = None + else: + train_transform = transform.Compose([transform.RandomRotate(along_z=args.get('rotate_along_z', True)), + transform.RandomScale(scale_low=args.get('scale_low', 0.8), + scale_high=args.get('scale_high', 1.2)), + transform.RandomJitter(sigma=args.get('jitter_sigma', 0.01), + clip=args.get('jitter_clip', 0.05)), + transform.RandomDropColor(color_augment=args.get('color_augment', 0.0))]) + logger.info(train_transform) + if args.data_name == 's3dis': + train_data = S3DIS(split='train', data_root=args.train_full_folder, num_point=args.num_point, + test_area=args.test_area, block_size=args.block_size, sample_rate=args.sample_rate, transform=train_transform, + fea_dim=args.get('fea_dim', 6), shuffle_idx=args.get('shuffle_idx', False)) + else: + raise ValueError('{} dataset not supported.'.format(args.data_name)) + train_loader = torch.utils.data.DataLoader(train_data, batch_size=args.train_batch_size, shuffle=True, num_workers=args.train_workers, pin_memory=True, drop_last=True) + + val_loader = None + if args.evaluate: + val_transform = transform.Compose([transform.ToTensor()]) + if args.data_name == 's3dis': + val_data = dataset.PointData(split='val', data_root=args.data_root, data_list=args.val_list, transform=val_transform, + norm_as_feat=args.get('norm_as_feat', True), fea_dim=args.get('fea_dim', 6)) + else: + raise ValueError('{} dataset not supported.'.format(args.data_name)) + + val_loader = torch.utils.data.DataLoader(val_data, batch_size=args.train_batch_size_val, shuffle=False, num_workers=args.train_workers, pin_memory=True) + + for epoch in range(args.start_epoch, args.epochs): + loss_train, mIoU_train, mAcc_train, allAcc_train = train(train_loader, model, criterion, optimizer, epoch, args.get('correlation_loss', False)) + epoch_log = epoch + 1 + writer.add_scalar('loss_train', loss_train, epoch_log) + writer.add_scalar('mIoU_train', mIoU_train, epoch_log) + writer.add_scalar('mAcc_train', mAcc_train, epoch_log) + writer.add_scalar('allAcc_train', allAcc_train, epoch_log) + + if epoch_log % args.save_freq == 0: + filename = args.save_path + '/train_epoch_' + str(epoch_log) + '.pth' + logger.info('Saving checkpoint to: ' + filename) + torch.save({'epoch': epoch_log, 'state_dict': model.state_dict(), + 'optimizer': optimizer.state_dict(), 'scheduler': scheduler.state_dict(), + 'commit_id': get_git_commit_id()}, filename) + if epoch_log / args.save_freq > 2: + try: + deletename = args.save_path + '/train_epoch_' + str(epoch_log - args.save_freq * 2) + '.pth' + os.remove(deletename) + except Exception: + logger.info('{} Not found.'.format(deletename)) + + if args.evaluate and epoch_log % args.get('eval_freq', 1) == 0: + loss_val, mIoU_val, mAcc_val, allAcc_val = validate(val_loader, model, criterion) + writer.add_scalar('loss_val', loss_val, epoch_log) + writer.add_scalar('mIoU_val', mIoU_val, epoch_log) + writer.add_scalar('mAcc_val', mAcc_val, epoch_log) + writer.add_scalar('allAcc_val', allAcc_val, epoch_log) + if mIoU_val > best_mIoU: + best_mIoU = mIoU_val + filename = args.save_path + '/best_train.pth' + logger.info('Best Model Saving checkpoint to: ' + filename) + torch.save( + {'epoch': epoch_log, 'state_dict': model.state_dict(), + 'optimizer': optimizer.state_dict(), 'scheduler': scheduler.state_dict(), + 'val_mIoU': best_mIoU, 'commit_id': get_git_commit_id()}, filename) + scheduler.step() + + +def train(train_loader, model, criterion, optimizer, epoch, correlation_loss): + batch_time = AverageMeter() + data_time = AverageMeter() + loss_meter = AverageMeter() + main_loss_meter = AverageMeter() + corr_loss_meter = AverageMeter() + intersection_meter = AverageMeter() + union_meter = AverageMeter() + target_meter = AverageMeter() + + model.train() + end = time.time() + max_iter = args.epochs * len(train_loader) + for i, (input, target) in enumerate(train_loader): + data_time.update(time.time() - end) + input = input.cuda(non_blocking=True) + target = target.cuda(non_blocking=True) + output = model(input) + if target.shape[-1] == 1: + target = target[:, 0] # for cls + main_loss = criterion(output, target) + + corr_loss = 0.0 + corr_loss_scale = args.get('correlation_loss_scale', 10.0) + if correlation_loss: + for m in model.module.SA_modules.named_modules(): + if isinstance(m[-1], PAConv): + kernel_matrice, output_dim, m_dim = m[-1].weightbank, m[-1].output_dim, m[-1].m + new_kernel_matrice = kernel_matrice.view(-1, m_dim, output_dim).permute(1, 0, 2).reshape(m_dim, -1) + cost_matrice = torch.matmul(new_kernel_matrice, new_kernel_matrice.T) / torch.matmul( + torch.sqrt(torch.sum(new_kernel_matrice ** 2, dim=-1, keepdim=True)), + torch.sqrt(torch.sum(new_kernel_matrice.T ** 2, dim=0, keepdim=True))) + corr_loss += torch.sum(torch.triu(cost_matrice, diagonal=1) ** 2) + loss = main_loss + corr_loss_scale * corr_loss + optimizer.zero_grad() + loss.backward() + optimizer.step() + + output = output.max(1)[1] + intersection, union, target = intersectionAndUnionGPU(output, target, args.classes, args.ignore_label) + intersection, union, target = intersection.cpu().numpy(), union.cpu().numpy(), target.cpu().numpy() + intersection_meter.update(intersection), union_meter.update(union), target_meter.update(target) + + accuracy = sum(intersection_meter.val) / (sum(target_meter.val) + 1e-10) + loss_meter.update(loss.item(), input.size(0)) + main_loss_meter.update(main_loss.item(), input.size(0)) + corr_loss_meter.update(corr_loss.item() * corr_loss_scale if correlation_loss else corr_loss, input.size(0)) + batch_time.update(time.time() - end) + end = time.time() + + # calculate remain time + current_iter = epoch * len(train_loader) + i + 1 + remain_iter = max_iter - current_iter + remain_time = remain_iter * batch_time.avg + t_m, t_s = divmod(remain_time, 60) + t_h, t_m = divmod(t_m, 60) + remain_time = '{:02d}:{:02d}:{:02d}'.format(int(t_h), int(t_m), int(t_s)) + + if (i + 1) % args.print_freq == 0: + logger.info('Epoch: [{}/{}][{}/{}] ' + 'Data {data_time.val:.3f} ({data_time.avg:.3f}) ' + 'Batch {batch_time.val:.3f} ({batch_time.avg:.3f}) ' + 'Remain {remain_time} ' + 'Loss {loss_meter.val:.4f} ' + 'Main Loss {main_loss_meter.val:.4f} ' + 'Corr Loss {corr_loss_meter.val:.4f} ' + 'Accuracy {accuracy:.4f}.'.format(epoch+1, args.epochs, i + 1, len(train_loader), + batch_time=batch_time, data_time=data_time, + remain_time=remain_time, + loss_meter=loss_meter, + main_loss_meter=main_loss_meter, + corr_loss_meter=corr_loss_meter, + accuracy=accuracy)) + + writer.add_scalar('loss_train_batch', loss_meter.val, current_iter) + writer.add_scalar('mIoU_train_batch', np.mean(intersection / (union + 1e-10)), current_iter) + writer.add_scalar('mAcc_train_batch', np.mean(intersection / (target + 1e-10)), current_iter) + writer.add_scalar('allAcc_train_batch', accuracy, current_iter) + + iou_class = intersection_meter.sum / (union_meter.sum + 1e-10) + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mIoU = np.mean(iou_class) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) + logger.info('Train result at epoch [{}/{}]: mIoU/mAcc/allAcc {:.4f}/{:.4f}/{:.4f}.'.format(epoch+1, args.epochs, mIoU, mAcc, allAcc)) + return loss_meter.avg, mIoU, mAcc, allAcc + + +def validate(val_loader, model, criterion): + logger.info('>>>>>>>>>>>>>>>> Start Evaluation >>>>>>>>>>>>>>>>') + batch_time = AverageMeter() + data_time = AverageMeter() + loss_meter = AverageMeter() + intersection_meter = AverageMeter() + union_meter = AverageMeter() + target_meter = AverageMeter() + + model.eval() + end = time.time() + for i, (input, target) in enumerate(val_loader): + data_time.update(time.time() - end) + input = input.cuda(non_blocking=True) + target = target.cuda(non_blocking=True) + if target.shape[-1] == 1: + target = target[:, 0] # for cls + output = model(input) + loss = criterion(output, target) + + output = output.max(1)[1] + intersection, union, target = intersectionAndUnionGPU(output, target, args.classes, args.ignore_label) + intersection, union, target = intersection.cpu().numpy(), union.cpu().numpy(), target.cpu().numpy() + intersection_meter.update(intersection), union_meter.update(union), target_meter.update(target) + + accuracy = sum(intersection_meter.val) / (sum(target_meter.val) + 1e-10) + loss_meter.update(loss.item(), input.size(0)) + batch_time.update(time.time() - end) + end = time.time() + if (i + 1) % args.print_freq == 0: + logger.info('Test: [{}/{}] ' + 'Data {data_time.val:.3f} ({data_time.avg:.3f}) ' + 'Batch {batch_time.val:.3f} ({batch_time.avg:.3f}) ' + 'Loss {loss_meter.val:.4f} ({loss_meter.avg:.4f}) ' + 'Accuracy {accuracy:.4f}.'.format(i + 1, len(val_loader), + data_time=data_time, + batch_time=batch_time, + loss_meter=loss_meter, + accuracy=accuracy)) + + iou_class = intersection_meter.sum / (union_meter.sum + 1e-10) + accuracy_class = intersection_meter.sum / (target_meter.sum + 1e-10) + mIoU = np.mean(iou_class) + mAcc = np.mean(accuracy_class) + allAcc = sum(intersection_meter.sum) / (sum(target_meter.sum) + 1e-10) + + logger.info('Val result: mIoU/mAcc/allAcc {:.4f}/{:.4f}/{:.4f}.'.format(mIoU, mAcc, allAcc)) + for i in range(args.classes): + logger.info('Class_{} Result: iou/accuracy {:.4f}/{:.4f}.'.format(i, iou_class[i], accuracy_class[i])) + logger.info('<<<<<<<<<<<<<<<<< End Evaluation <<<<<<<<<<<<<<<<<') + return loss_meter.avg, mIoU, mAcc, allAcc + + +if __name__ == '__main__': + main() diff --git a/zoo/PAConv/scene_seg/tool/train.sh b/zoo/PAConv/scene_seg/tool/train.sh new file mode 100755 index 0000000..62e58a9 --- /dev/null +++ b/zoo/PAConv/scene_seg/tool/train.sh @@ -0,0 +1,21 @@ +#!/bin/sh +export PYTHONPATH=./ + +PYTHON=python +dataset=$1 +exp_name=$2 +exp_dir=exp/${dataset}/${exp_name} +model_dir=${exp_dir}/model +config=config/${dataset}/${dataset}_${exp_name}.yaml + +mkdir -p ${model_dir} +now=$(date +"%Y%m%d_%H%M%S") +cp tool/train.sh tool/train.py ${config} ${exp_dir} + +$PYTHON tool/train.py --config=${config} 2>&1 | tee ${model_dir}/train-$now.log + + +if [ ${dataset} = 's3dis' ] +then + $PYTHON tool/test_s3dis.py --config=${config} 2>&1 | tee ${model_dir}/test-$now.log +fi diff --git a/zoo/PAConv/scene_seg/util/block.py b/zoo/PAConv/scene_seg/util/block.py new file mode 100644 index 0000000..1eacfe5 --- /dev/null +++ b/zoo/PAConv/scene_seg/util/block.py @@ -0,0 +1,789 @@ +import shutil, os +import tqdm +from itertools import repeat +import numpy as np +from typing import List, Tuple + +import torch +import torch.nn as nn +from torch.autograd.function import InplaceFunction + +BN1d, BN2d, BN3d = nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d + + +class SharedMLP(nn.Sequential): + + def __init__( + self, + args: List[int], + *, + bn: bool = False, + activation=nn.ReLU(inplace=True), + preact: bool = False, + first: bool = False, + name: str = "" + ): + super().__init__() + + for i in range(len(args) - 1): + self.add_module( + name + 'layer{}'.format(i), + Conv2d( + args[i], + args[i + 1], + bn=(not first or not preact or (i != 0)) and bn, + activation=activation + if (not first or not preact or (i != 0)) else None, + preact=preact + ) + ) + + +class _BNBase(nn.Sequential): + + def __init__(self, in_size, batch_norm=None, name=""): + super().__init__() + self.add_module(name + "bn", batch_norm(in_size)) + + nn.init.constant_(self[0].weight, 1.0) + nn.init.constant_(self[0].bias, 0) + + +class BatchNorm1d(_BNBase): + + def __init__(self, in_size: int, *, name: str = ""): + super().__init__(in_size, batch_norm=BN1d, name=name) + + +class BatchNorm2d(_BNBase): + + def __init__(self, in_size: int, name: str = ""): + super().__init__(in_size, batch_norm=BN2d, name=name) + + +class BatchNorm3d(_BNBase): + + def __init__(self, in_size: int, name: str = ""): + super().__init__(in_size, batch_norm=BN3d, name=name) + + +class _ConvBase(nn.Sequential): + + def __init__( + self, + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=None, + batch_norm=None, + bias=True, + preact=False, + name="" + ): + super().__init__() + + bias = bias and (not bn) + conv_unit = conv( + in_size, + out_size, + kernel_size=kernel_size, + stride=stride, + padding=padding, + bias=bias + ) + init(conv_unit.weight) + if bias: + nn.init.constant_(conv_unit.bias, 0) + + if bn: + if not preact: + bn_unit = batch_norm(out_size) + else: + bn_unit = batch_norm(in_size) + + if preact: + if bn: + self.add_module(name + 'bn', bn_unit) + + if activation is not None: + self.add_module(name + 'activation', activation) + + self.add_module(name + 'conv', conv_unit) + + if not preact: + if bn: + self.add_module(name + 'bn', bn_unit) + + if activation is not None: + self.add_module(name + 'activation', activation) + + +class Conv1d(_ConvBase): + + def __init__( + self, + in_size: int, + out_size: int, + *, + kernel_size: int = 1, + stride: int = 1, + padding: int = 0, + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=nn.init.kaiming_normal_, + bias: bool = True, + preact: bool = False, + name: str = "" + ): + super().__init__( + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=nn.Conv1d, + batch_norm=BatchNorm1d, + bias=bias, + preact=preact, + name=name + ) + + +class Conv2d(_ConvBase): + + def __init__( + self, + in_size: int, + out_size: int, + *, + kernel_size: Tuple[int, int] = (1, 1), + stride: Tuple[int, int] = (1, 1), + padding: Tuple[int, int] = (0, 0), + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=nn.init.kaiming_normal_, + bias: bool = True, + preact: bool = False, + name: str = "" + ): + super().__init__( + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=nn.Conv2d, + batch_norm=BatchNorm2d, + bias=bias, + preact=preact, + name=name + ) + + +class Conv3d(_ConvBase): + + def __init__( + self, + in_size: int, + out_size: int, + *, + kernel_size: Tuple[int, int, int] = (1, 1, 1), + stride: Tuple[int, int, int] = (1, 1, 1), + padding: Tuple[int, int, int] = (0, 0, 0), + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=nn.init.kaiming_normal_, + bias: bool = True, + preact: bool = False, + name: str = "" + ): + super().__init__( + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=nn.Conv3d, + batch_norm=BatchNorm3d, + bias=bias, + preact=preact, + name=name + ) + + +class FC(nn.Sequential): + + def __init__( + self, + in_size: int, + out_size: int, + *, + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=None, + preact: bool = False, + name: str = "" + ): + super().__init__() + + fc = nn.Linear(in_size, out_size, bias=not bn) + if init is not None: + init(fc.weight) + if not bn: + nn.init.constant_(fc.bias, 0) + + if preact: + if bn: + self.add_module(name + 'bn', BatchNorm1d(in_size)) + + if activation is not None: + self.add_module(name + 'activation', activation) + + self.add_module(name + 'fc', fc) + + if not preact: + if bn: + self.add_module(name + 'bn', BatchNorm1d(out_size)) + + if activation is not None: + self.add_module(name + 'activation', activation) + + +class _DropoutNoScaling(InplaceFunction): + + @staticmethod + def _make_noise(input): + return input.new().resize_as_(input) + + @staticmethod + def symbolic(g, input, p=0.5, train=False, inplace=False): + if inplace: + return None + n = g.appendNode( + g.create("Dropout", [input]).f_("ratio", + p).i_("is_test", not train) + ) + real = g.appendNode(g.createSelect(n, 0)) + g.appendNode(g.createSelect(n, 1)) + return real + + @classmethod + def forward(cls, ctx, input, p=0.5, train=False, inplace=False): + if p < 0 or p > 1: + raise ValueError( + "dropout probability has to be between 0 and 1, " + "but got {}".format(p) + ) + ctx.p = p + ctx.train = train + ctx.inplace = inplace + + if ctx.inplace: + ctx.mark_dirty(input) + output = input + else: + output = input.clone() + + if ctx.p > 0 and ctx.train: + ctx.noise = cls._make_noise(input) + if ctx.p == 1: + ctx.noise.fill_(0) + else: + ctx.noise.bernoulli_(1 - ctx.p) + ctx.noise = ctx.noise.expand_as(input) + output.mul_(ctx.noise) + + return output + + @staticmethod + def backward(ctx, grad_output): + if ctx.p > 0 and ctx.train: + return grad_output.mul(ctx.noise), None, None, None + else: + return grad_output, None, None, None + + +dropout_no_scaling = _DropoutNoScaling.apply + + +class _FeatureDropoutNoScaling(_DropoutNoScaling): + + @staticmethod + def symbolic(input, p=0.5, train=False, inplace=False): + return None + + @staticmethod + def _make_noise(input): + return input.new().resize_( + input.size(0), input.size(1), *repeat(1, + input.dim() - 2) + ) + + +feature_dropout_no_scaling = _FeatureDropoutNoScaling.apply + + +def group_model_params(model: nn.Module, **kwargs): + decay_group = [] + no_decay_group = [] + + for name, param in model.named_parameters(): + if name.find("bn") != -1 or name.find("bias") != -1: + no_decay_group.append(param) + else: + decay_group.append(param) + + assert len(list(model.parameters())) == len(decay_group) + len(no_decay_group) + + return [ + dict(params=decay_group, **kwargs), + dict(params=no_decay_group, weight_decay=0.0, **kwargs) + ] + + +def checkpoint_state( + model=None, optimizer=None, best_prec=None, epoch=None, it=None +): + optim_state = optimizer.state_dict() if optimizer is not None else None + if model is not None: + if isinstance(model, torch.nn.DataParallel): + model_state = model.module.state_dict() + else: + model_state = model.state_dict() + else: + model_state = None + + return { + 'epoch': epoch, + 'it': it, + 'best_prec': best_prec, + 'model_state': model_state, + 'optimizer_state': optim_state + } + + +def save_checkpoint( + state, is_best, filename='checkpoint', bestname='model_best' +): + filename = '{}.pth.tar'.format(filename) + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, '{}.pth.tar'.format(bestname)) + + +def load_checkpoint(model=None, optimizer=None, filename='checkpoint'): + filename = "{}.pth.tar".format(filename) + if os.path.isfile(filename): + print("==> Loading from checkpoint '{}'".format(filename)) + checkpoint = torch.load(filename) + epoch = checkpoint['epoch'] + it = checkpoint.get('it', 0.0) + best_prec = checkpoint['best_prec'] + if model is not None and checkpoint['model_state'] is not None: + model.load_state_dict(checkpoint['model_state']) + if optimizer is not None and checkpoint['optimizer_state'] is not None: + optimizer.load_state_dict(checkpoint['optimizer_state']) + print("==> Done") + else: + print("==> Checkpoint '{}' not found".format(filename)) + + return it, epoch, best_prec + + +def variable_size_collate(pad_val=0, use_shared_memory=True): + import collections + _numpy_type_map = { + 'float64': torch.DoubleTensor, + 'float32': torch.FloatTensor, + 'float16': torch.HalfTensor, + 'int64': torch.LongTensor, + 'int32': torch.IntTensor, + 'int16': torch.ShortTensor, + 'int8': torch.CharTensor, + 'uint8': torch.ByteTensor, + } + + def wrapped(batch): + "Puts each data field into a tensor with outer dimension batch size" + + error_msg = "batch must contain tensors, numbers, dicts or lists; found {}" + elem_type = type(batch[0]) + if torch.is_tensor(batch[0]): + max_len = 0 + for b in batch: + max_len = max(max_len, b.size(0)) + + numel = sum([int(b.numel() / b.size(0) * max_len) for b in batch]) + if use_shared_memory: + # If we're in a background process, concatenate directly into a + # shared memory tensor to avoid an extra copy + storage = batch[0].storage()._new_shared(numel) + out = batch[0].new(storage) + else: + out = batch[0].new(numel) + + out = out.view( + len(batch), max_len, + *[batch[0].size(i) for i in range(1, batch[0].dim())] + ) + out.fill_(pad_val) + for i in range(len(batch)): + out[i, 0:batch[i].size(0)] = batch[i] + + return out + elif elem_type.__module__ == 'numpy' and elem_type.__name__ != 'str_' \ + and elem_type.__name__ != 'string_': + elem = batch[0] + if elem_type.__name__ == 'ndarray': + # array of string classes and object + if re.search('[SaUO]', elem.dtype.str) is not None: + raise TypeError(error_msg.format(elem.dtype)) + + return wrapped([torch.from_numpy(b) for b in batch]) + if elem.shape == (): # scalars + py_type = float if elem.dtype.name.startswith('float') else int + return _numpy_type_map[elem.dtype.name]( + list(map(py_type, batch)) + ) + elif isinstance(batch[0], int): + return torch.LongTensor(batch) + elif isinstance(batch[0], float): + return torch.DoubleTensor(batch) + elif isinstance(batch[0], collections.Mapping): + return {key: wrapped([d[key] for d in batch]) for key in batch[0]} + elif isinstance(batch[0], collections.Sequence): + transposed = zip(*batch) + return [wrapped(samples) for samples in transposed] + + raise TypeError((error_msg.format(type(batch[0])))) + + return wrapped + + +class TrainValSplitter(): + r""" + Creates a training and validation split to be used as the sampler in a pytorch DataLoader + Parameters + --------- + numel : int + Number of elements in the entire training dataset + percent_train : float + Percentage of data in the training split + shuffled : bool + Whether or not shuffle which data goes to which split + """ + + def __init__( + self, *, numel: int, percent_train: float, shuffled: bool = False + ): + indicies = np.array([i for i in range(numel)]) + if shuffled: + np.random.shuffle(indicies) + + self.train = torch.utils.data.sampler.SubsetRandomSampler( + indicies[0:int(percent_train * numel)] + ) + self.val = torch.utils.data.sampler.SubsetRandomSampler( + indicies[int(percent_train * numel):-1] + ) + + +''' +class CrossValSplitter(): + r""" + Class that creates cross validation splits. The train and val splits can be used in pytorch DataLoaders. The splits can be updated + by calling next(self) or using a loop: + for _ in self: + .... + Parameters + --------- + numel : int + Number of elements in the training set + k_folds : int + Number of folds + shuffled : bool + Whether or not to shuffle which data goes in which fold + """ + + def __init__(self, *, numel: int, k_folds: int, shuffled: bool = False): + inidicies = np.array([i for i in range(numel)]) + if shuffled: + np.random.shuffle(inidicies) + + self.folds = np.array(np.array_split(inidicies, k_folds), dtype=object) + self.current_v_ind = -1 + + self.val = torch.utils.data.sampler.SubsetRandomSampler(self.folds[0]) + self.train = torch.utils.data.sampler.SubsetRandomSampler( + np.concatenate(self.folds[1:], axis=0) + ) + + self.metrics = {} + + def __iter__(self): + self.current_v_ind = -1 + return self + + def __len__(self): + return len(self.folds) + + def __getitem__(self, idx): + assert idx >= 0 and idx < len(self) + self.val.inidicies = self.folds[idx] + self.train.inidicies = np.concatenate( + self.folds[np.arange(len(self)) != idx], axis=0 + ) + + def __next__(self): + self.current_v_ind += 1 + if self.current_v_ind >= len(self): + raise StopIteration + + self[self.current_v_ind] + + def update_metrics(self, to_post: dict): + for k, v in to_post.items(): + if k in self.metrics: + self.metrics[k].append(v) + else: + self.metrics[k] = [v] + + def print_metrics(self): + for name, samples in self.metrics.items(): + xbar = stats.mean(samples) + sx = stats.stdev(samples, xbar) + tstar = student_t.ppf(1.0 - 0.025, len(samples) - 1) + margin_of_error = tstar * sx / sqrt(len(samples)) + print("{}: {} +/- {}".format(name, xbar, margin_of_error)) +''' + + +def set_bn_momentum_default(bn_momentum): + + def fn(m): + if isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d)): + m.momentum = bn_momentum + + return fn + + +class BNMomentumScheduler(object): + + def __init__( + self, model, bn_lambda, last_epoch=-1, + setter=set_bn_momentum_default + ): + if not isinstance(model, nn.Module): + raise RuntimeError( + "Class '{}' is not a PyTorch nn Module".format( + type(model).__name__ + ) + ) + + self.model = model + self.setter = setter + self.lmbd = bn_lambda + + self.step(last_epoch + 1) + self.last_epoch = last_epoch + + def step(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + + self.last_epoch = epoch + self.model.apply(self.setter(self.lmbd(epoch))) + + +class Trainer(object): + r""" + Reasonably generic trainer for pytorch models + + Parameters + ---------- + model : pytorch model + Model to be trained + model_fn : function (model, inputs, labels) -> preds, loss, accuracy + optimizer : torch.optim + Optimizer for model + checkpoint_name : str + Name of file to save checkpoints to + best_name : str + Name of file to save best model to + lr_scheduler : torch.optim.lr_scheduler + Learning rate scheduler. .step() will be called at the start of every epoch + bnm_scheduler : BNMomentumScheduler + Batchnorm momentum scheduler. .step() will be called at the start of every epoch + eval_frequency : int + How often to run an eval + log_name : str + Name of file to output tensorboard_logger to + """ + + def __init__( + self, + model, + model_fn, + optimizer, + checkpoint_name="ckpt", + best_name="best", + lr_scheduler=None, + bnm_scheduler=None, + eval_frequency=-1, + viz=None + ): + self.model, self.model_fn, self.optimizer, self.lr_scheduler, self.bnm_scheduler = ( + model, model_fn, optimizer, lr_scheduler, bnm_scheduler + ) + + self.checkpoint_name, self.best_name = checkpoint_name, best_name + self.eval_frequency = eval_frequency + + self.training_best, self.eval_best = {}, {} + self.viz = viz + + @staticmethod + def _decode_value(v): + if isinstance(v[0], float): + return np.mean(v) + elif isinstance(v[0], tuple): + if len(v[0]) == 3: + num = [l[0] for l in v] + denom = [l[1] for l in v] + w = v[0][2] + else: + num = [l[0] for l in v] + denom = [l[1] for l in v] + w = None + + return np.average( + np.sum(num, axis=0) / (np.sum(denom, axis=0) + 1e-6), weights=w + ) + else: + raise AssertionError("Unknown type: {}".format(type(v))) + + def _train_it(self, it, batch): + self.model.train() + + if self.lr_scheduler is not None: + self.lr_scheduler.step(it) + + if self.bnm_scheduler is not None: + self.bnm_scheduler.step(it) + + self.optimizer.zero_grad() + _, loss, eval_res = self.model_fn(self.model, batch) + + loss.backward() + self.optimizer.step() + + return eval_res + + def eval_epoch(self, d_loader): + self.model.eval() + + eval_dict = {} + total_loss = 0.0 + count = 1.0 + for i, data in tqdm.tqdm(enumerate(d_loader, 0), total=len(d_loader), + leave=False, desc='val'): + self.optimizer.zero_grad() + + _, loss, eval_res = self.model_fn(self.model, data, eval=True) + + total_loss += loss.item() + count += 1 + for k, v in eval_res.items(): + if v is not None: + eval_dict[k] = eval_dict.get(k, []) + [v] + + return total_loss / count, eval_dict + + def train( + self, + start_it, + start_epoch, + n_epochs, + train_loader, + test_loader=None, + best_loss=0.0 + ): + r""" + Call to begin training the model + + Parameters + ---------- + start_epoch : int + Epoch to start at + n_epochs : int + Number of epochs to train for + test_loader : torch.utils.data.DataLoader + DataLoader of the test_data + train_loader : torch.utils.data.DataLoader + DataLoader of training data + best_loss : float + Testing loss of the best model + """ + + eval_frequency = ( + self.eval_frequency + if self.eval_frequency > 0 else len(train_loader) + ) + + it = start_it + with tqdm.trange(start_epoch, n_epochs + 1, desc='epochs') as tbar, \ + tqdm.tqdm(total=eval_frequency, leave=False, desc='train') as pbar: + + for epoch in tbar: + for batch in train_loader: + res = self._train_it(it, batch) + it += 1 + + pbar.update() + pbar.set_postfix(dict(total_it=it)) + tbar.refresh() + + if self.viz is not None: + self.viz.update('train', it, res) + + if (it % eval_frequency) == 0: + pbar.close() + + if test_loader is not None: + val_loss, res = self.eval_epoch(test_loader) + + if self.viz is not None: + self.viz.update('val', it, res) + + is_best = val_loss < best_loss + best_loss = min(best_loss, val_loss) + save_checkpoint( + checkpoint_state( + self.model, self.optimizer, val_loss, epoch, + it + ), + is_best, + filename=self.checkpoint_name, + bestname=self.best_name + ) + + pbar = tqdm.tqdm( + total=eval_frequency, leave=False, desc='train' + ) + pbar.set_postfix(dict(total_it=it)) + + return best_loss diff --git a/zoo/PAConv/scene_seg/util/config.py b/zoo/PAConv/scene_seg/util/config.py new file mode 100755 index 0000000..1026fb2 --- /dev/null +++ b/zoo/PAConv/scene_seg/util/config.py @@ -0,0 +1,165 @@ +# ----------------------------------------------------------------------------- +# Functions for parsing args +# ----------------------------------------------------------------------------- +import yaml +import os +from ast import literal_eval +import copy + + +class CfgNode(dict): + """ + CfgNode represents an internal node in the configuration tree. It's a simple + dict-like container that allows for attribute-based access to keys. + """ + + def __init__(self, init_dict=None, key_list=None, new_allowed=False): + # Recursively convert nested dictionaries in init_dict into CfgNodes + init_dict = {} if init_dict is None else init_dict + key_list = [] if key_list is None else key_list + for k, v in init_dict.items(): + if type(v) is dict: + # Convert dict to CfgNode + init_dict[k] = CfgNode(v, key_list=key_list + [k]) + super(CfgNode, self).__init__(init_dict) + + def __getattr__(self, name): + if name in self: + return self[name] + else: + raise AttributeError(name) + + def __setattr__(self, name, value): + self[name] = value + + def __str__(self): + def _indent(s_, num_spaces): + s = s_.split("\n") + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(num_spaces * " ") + line for line in s] + s = "\n".join(s) + s = first + "\n" + s + return s + + r = "" + s = [] + for k, v in sorted(self.items()): + seperator = "\n" if isinstance(v, CfgNode) else " " + attr_str = "{}:{}{}".format(str(k), seperator, str(v)) + attr_str = _indent(attr_str, 2) + s.append(attr_str) + r += "\n".join(s) + return r + + def __repr__(self): + return "{}({})".format(self.__class__.__name__, super(CfgNode, self).__repr__()) + + +def load_cfg_from_cfg_file(file): + cfg = {} + assert os.path.isfile(file) and file.endswith('.yaml'), \ + '{} is not a yaml file'.format(file) + + with open(file, 'r') as f: + cfg_from_file = yaml.safe_load(f) + + for key in cfg_from_file: + for k, v in cfg_from_file[key].items(): + cfg[k] = v + + cfg = CfgNode(cfg) + return cfg + + +def merge_cfg_from_list(cfg, cfg_list): + new_cfg = copy.deepcopy(cfg) + assert len(cfg_list) % 2 == 0 + for full_key, v in zip(cfg_list[0::2], cfg_list[1::2]): + subkey = full_key.split('.')[-1] + assert subkey in cfg, 'Non-existent key: {}'.format(full_key) + value = _decode_cfg_value(v) + value = _check_and_coerce_cfg_value_type( + value, cfg[subkey], subkey, full_key + ) + setattr(new_cfg, subkey, value) + + return new_cfg + + +def _decode_cfg_value(v): + """Decodes a raw config value (e.g., from a yaml config files or command + line argument) into a Python object. + """ + # All remaining processing is only applied to strings + if not isinstance(v, str): + return v + # Try to interpret `v` as a: + # string, number, tuple, list, dict, boolean, or None + try: + v = literal_eval(v) + # The following two excepts allow v to pass through when it represents a + # string. + # + # Longer explanation: + # The type of v is always a string (before calling literal_eval), but + # sometimes it *represents* a string and other times a data structure, like + # a list. In the case that v represents a string, what we got back from the + # yaml parser is 'foo' *without quotes* (so, not '"foo"'). literal_eval is + # ok with '"foo"', but will raise a ValueError if given 'foo'. In other + # cases, like paths (v = 'foo/bar' and not v = '"foo/bar"'), literal_eval + # will raise a SyntaxError. + except ValueError: + pass + except SyntaxError: + pass + return v + + +def _check_and_coerce_cfg_value_type(replacement, original, key, full_key): + """Checks that `replacement`, which is intended to replace `original` is of + the right type. The type is correct if it matches exactly or is one of a few + cases in which the type can be easily coerced. + """ + original_type = type(original) + replacement_type = type(replacement) + + # The types must match (with some exceptions) + if replacement_type == original_type: + return replacement + + # Cast replacement from from_type to to_type if the replacement and original + # types match from_type and to_type + def conditional_cast(from_type, to_type): + if replacement_type == from_type and original_type == to_type: + return True, to_type(replacement) + else: + return False, None + + # Conditionally casts + # list <-> tuple + casts = [(tuple, list), (list, tuple)] + # For py2: allow converting from str (bytes) to a unicode string + try: + casts.append((str, unicode)) # noqa: F821 + except Exception: + pass + + for (from_type, to_type) in casts: + converted, converted_value = conditional_cast(from_type, to_type) + if converted: + return converted_value + + raise ValueError( + "Type mismatch ({} vs. {}) with values ({} vs. {}) for config " + "key: {}".format( + original_type, replacement_type, original, replacement, full_key + ) + ) + + +def _assert_with_logging(cond, msg): + if not cond: + logger.debug(msg) + assert cond, msg diff --git a/zoo/PAConv/scene_seg/util/dataset.py b/zoo/PAConv/scene_seg/util/dataset.py new file mode 100755 index 0000000..e8086e5 --- /dev/null +++ b/zoo/PAConv/scene_seg/util/dataset.py @@ -0,0 +1,74 @@ +import os +import h5py +import numpy as np +import torch + +from torch.utils.data import Dataset + + +def make_dataset(split='train', data_root=None, data_list=None): + if not os.path.isfile(data_list): + raise (RuntimeError("Point list file do not exist: " + data_list + "\n")) + point_list = [] + list_read = open(data_list).readlines() + print("Totally {} samples in {} set.".format(len(list_read), split)) + for line in list_read: + point_list.append(os.path.join(data_root, line.strip())) + return point_list + + +class PointData(Dataset): + def __init__(self, split='train', data_root=None, data_list=None, transform=None, + num_point=None, random_index=False, norm_as_feat=True, fea_dim=6): + assert split in ['train', 'val', 'test'] + self.split = split + self.data_list = make_dataset(split, data_root, data_list) + self.transform = transform + self.num_point = num_point + self.random_index = random_index + self.norm_as_feat = norm_as_feat + self.fea_dim = fea_dim + + def __len__(self): + return len(self.data_list) + + def __getitem__(self, index): + data_path = self.data_list[index] + f = h5py.File(data_path, 'r') + data = f['data'][:] + if self.split is 'test': + label = 255 # place holder + else: + label = f['label'][:] + f.close() + if self.num_point is None: + self.num_point = data.shape[0] + idxs = np.arange(data.shape[0]) + if self.random_index: + np.random.shuffle(idxs) + idxs = idxs[0: self.num_point] + data = data[idxs, :] + if label.size != 1: # seg data + label = label[idxs] + if self.transform is not None: + data, label = self.transform(data, label) + + if self.fea_dim == 3: + points = data[:, :6] + elif self.fea_dim == 4: + points = np.concatenate((data[:, :6], data[:, 2:3]), axis=-1) + elif self.fea_dim == 5: + points = np.concatenate((data[:, :6], data[:, 2:3], torch.ones((self.num_point, 1)).to(data.device)), axis=-1) + elif self.fea_dim == 6: + points = data + + return points, label + + +if __name__ == '__main__': + data_root = '/mnt/sda1/hszhao/dataset/3d/s3dis' + data_list = '/mnt/sda1/hszhao/dataset/3d/s3dis/list/train12346.txt' + point_data = PointData('train', data_root, data_list) + print('point data size:', point_data.__len__()) + print('point data 0 shape:', point_data.__getitem__(0)[0].shape) + print('point label 0 shape:', point_data.__getitem__(0)[1].shape) diff --git a/zoo/PAConv/scene_seg/util/paconv_util.py b/zoo/PAConv/scene_seg/util/paconv_util.py new file mode 100755 index 0000000..e05d81b --- /dev/null +++ b/zoo/PAConv/scene_seg/util/paconv_util.py @@ -0,0 +1,73 @@ +import torch + + +def weight_init(m): + # print(m) + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def get_graph_feature(x, k, idx): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + idx_base = torch.arange(0, batch_size, device=x.device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor - x, neighbor), dim=3) # (xj-xi, xj): b,n,k,2c + + return feature + + +def assign_score(score, point_input): + B, N, K, m = score.size() + score = score.view(B, N, K, 1, m) + point_output = torch.matmul(score, point_input).view(B, N, K, -1) # b,n,k,cout + return point_output + + +def get_ed(x, y): + ed = torch.norm(x - y, dim=-1).reshape(x.shape[0], 1) + return ed + + +def assign_kernel_withoutk(in_feat, kernel, M): + B, Cin, N0 = in_feat.size() + in_feat_trans = in_feat.permute(0, 2, 1) + out_feat_half1 = torch.matmul(in_feat_trans, kernel[:Cin]).view(B, N0, M, -1) # b,n,m,o1 + out_feat_half2 = torch.matmul(in_feat_trans, kernel[Cin:]).view(B, N0, M, -1) # b,n,m,o1 + if in_feat.size(1) % 2 != 0: + out_feat_half_coord = torch.matmul(in_feat_trans[:, :, :3], kernel[Cin: Cin + 3]).view(B, N0, M, -1) # b,n,m,o1 + else: + out_feat_half_coord = torch.zeros_like(out_feat_half2) + return out_feat_half1 + out_feat_half2, out_feat_half1 + out_feat_half_coord \ No newline at end of file diff --git a/zoo/PAConv/scene_seg/util/s3dis.py b/zoo/PAConv/scene_seg/util/s3dis.py new file mode 100755 index 0000000..a5b45ce --- /dev/null +++ b/zoo/PAConv/scene_seg/util/s3dis.py @@ -0,0 +1,131 @@ +import os +import numpy as np + +import torch +from torch.utils.data import Dataset + +class S3DIS(Dataset): + def __init__(self, split='train', data_root='trainval_fullarea', num_point=4096, test_area=5, + block_size=1.0, sample_rate=1.0, transform=None, fea_dim=6, shuffle_idx=False): + + super().__init__() + self.num_point = num_point + self.block_size = block_size + self.transform = transform + self.fea_dim = fea_dim + self.shuffle_idx = shuffle_idx + rooms = sorted(os.listdir(data_root)) + rooms = [room for room in rooms if 'Area_' in room] + if split == 'train': + rooms_split = [room for room in rooms if not 'Area_{}'.format(test_area) in room] + else: + rooms_split = [room for room in rooms if 'Area_{}'.format(test_area) in room] + self.room_points, self.room_labels = [], [] + self.room_coord_min, self.room_coord_max = [], [] + num_point_all = [] + for room_name in rooms_split: + room_path = os.path.join(data_root, room_name) + room_data = np.load(room_path) # xyzrgbl, N*7 + points, labels = room_data[:, 0:6], room_data[:, 6] # xyzrgb, N*6; l, N + coord_min, coord_max = np.amin(points, axis=0)[:3], np.amax(points, axis=0)[:3] + self.room_points.append(points), self.room_labels.append(labels) + self.room_coord_min.append(coord_min), self.room_coord_max.append(coord_max) + num_point_all.append(labels.size) + sample_prob = num_point_all / np.sum(num_point_all) + num_iter = int(np.sum(num_point_all) * sample_rate / num_point) + room_idxs = [] + for index in range(len(rooms_split)): + room_idxs.extend([index] * int(round(sample_prob[index] * num_iter))) + self.room_idxs = np.array(room_idxs) + print("Totally {} samples in {} set.".format(len(self.room_idxs), split)) + + def __getitem__(self, idx): + room_idx = self.room_idxs[idx] + points = self.room_points[room_idx] # N * 6 + labels = self.room_labels[room_idx] # N + N_points = points.shape[0] + + while (True): + # to select center points that at least 1024 points are covered in a block size 1m*1m + center = points[np.random.choice(N_points)][:3] + block_min = center - [self.block_size / 2.0, self.block_size / 2.0, 0] + block_max = center + [self.block_size / 2.0, self.block_size / 2.0, 0] + point_idxs = np.where((points[:, 0] >= block_min[0]) & (points[:, 0] <= block_max[0]) & (points[:, 1] >= block_min[1]) & (points[:, 1] <= block_max[1]))[0] + if point_idxs.size > self.num_point / 4: + break + + if point_idxs.size >= self.num_point: + selected_point_idxs = np.random.choice(point_idxs, self.num_point, replace=False) + else: + # do not use random choice here to avoid some pts not counted + dup = np.random.choice(point_idxs.size, self.num_point - point_idxs.size) + idx_dup = np.concatenate([np.arange(point_idxs.size), np.array(dup)], 0) + selected_point_idxs = point_idxs[idx_dup] + + selected_points = points[selected_point_idxs, :] # num_point * 6 + # centered points + centered_points = np.zeros((self.num_point, 3)) + centered_points[:, :2] = selected_points[:, :2] - center[:2] + centered_points[:, 2] = selected_points[:, 2] + # normalized colors + normalized_colors = selected_points[:, 3:6] / 255.0 + # normalized points + normalized_points = selected_points[:, :3] / self.room_coord_max[room_idx] + + # transformation for centered points and normalized colors + if self.transform is not None: + centered_points, normalized_colors = self.transform(centered_points, normalized_colors) + + # current points and current labels + if self.fea_dim == 3: + current_points = np.concatenate((centered_points, normalized_points), axis=-1) + elif self.fea_dim == 6: + current_points = np.concatenate((centered_points, normalized_colors, normalized_points), axis=-1) + else: + raise ValueError('Feature dim {} not supported.'.format(self.fea_dim)) + current_labels = labels[selected_point_idxs] + + if self.shuffle_idx: + shuffle_idx = np.random.permutation(np.arange(current_points.shape[0])) + current_points, current_labels = current_points[shuffle_idx], current_labels[shuffle_idx] + + # to Tensor + current_points = torch.FloatTensor(current_points) + current_labels = torch.LongTensor(current_labels) + + return current_points, current_labels + + def __len__(self): + return len(self.room_idxs) + + +if __name__ == '__main__': + import transform + data_root = 'dataset/s3dis/trainval_fullarea' + num_point, test_area, block_size, sample_rate = 4096, 5, 1.0, 0.01 + + train_transform = transform.Compose([transform.RandomRotate(along_z=True), + transform.RandomScale(scale_low=0.8, + scale_high=1.2), + transform.RandomJitter(sigma=0.01, + clip=0.05), + transform.RandomDropColor(p=0.8, color_augment=0.0)]) + point_data = S3DIS(split='train', data_root=data_root, num_point=num_point, test_area=test_area, block_size=block_size, sample_rate=sample_rate, transform=train_transform) + print('point data size:', point_data.__len__()) + + print('point data 0 shape:', point_data.__getitem__(0)[0].shape) + print('point label 0 shape:', point_data.__getitem__(0)[1].shape) + import torch, time, random + manual_seed = 123 + random.seed(manual_seed) + np.random.seed(manual_seed) + torch.manual_seed(manual_seed) + torch.cuda.manual_seed_all(manual_seed) + def worker_init_fn(worker_id): + random.seed(manual_seed + worker_id) + train_loader = torch.utils.data.DataLoader(point_data, batch_size=16, shuffle=True, num_workers=0, pin_memory=True, worker_init_fn=worker_init_fn) + for idx in range(4): + end = time.time() + for i, (input, target) in enumerate(train_loader): + print('time: {}/{}--{}'.format(i+1, len(train_loader), time.time() - end)) + end = time.time() diff --git a/zoo/PAConv/scene_seg/util/transform.py b/zoo/PAConv/scene_seg/util/transform.py new file mode 100755 index 0000000..10115a1 --- /dev/null +++ b/zoo/PAConv/scene_seg/util/transform.py @@ -0,0 +1,234 @@ +import numpy as np + +import torch + + +class Compose(object): + def __init__(self, transforms): + self.transforms = transforms + + def __call__(self, points, color): + for t in self.transforms: + points, color= t(points, color) + return points, color + + def __repr__(self): + return 'Compose(\n' + '\n'.join(['\t' + t.__repr__() + ',' for t in self.transforms]) + '\n)' + + +class ToTensor(object): + def __call__(self, data, label): + data = torch.from_numpy(data) + if not isinstance(data, torch.FloatTensor): + data = data.float() + label = torch.from_numpy(label) + if not isinstance(label, torch.LongTensor): + label = label.long() + return data, label + + +class RandomRotate(object): + def __init__(self, rotate_angle=None, along_z=True, color_rotate=False): + self.rotate_angle = rotate_angle + self.along_z = along_z + self.color_rotate = color_rotate + + def __call__(self, points, color): + if self.rotate_angle is None: + rotate_angle = np.random.uniform() * 2 * np.pi + else: + rotate_angle = self.rotate_angle + cosval, sinval = np.cos(rotate_angle), np.sin(rotate_angle) + if self.along_z: + rotation_matrix = np.array([[cosval, sinval, 0], [-sinval, cosval, 0], [0, 0, 1]]) + else: + rotation_matrix = np.array([[cosval, 0, sinval], [0, 1, 0], [-sinval, 0, cosval]]) + points[:, 0:3] = np.dot(points[:, 0:3], rotation_matrix) + if self.color_rotate: + color[:, 0:3] = np.dot(color[:, 0:3], rotation_matrix) + return points, color + + def __repr__(self): + return 'RandomRotate(rotate_angle: {}, along_z: {})'.format(self.rotate_angle, self.along_z) + + +class RandomRotatePerturbation(object): + def __init__(self, angle_sigma=0.06, angle_clip=0.18): + self.angle_sigma = angle_sigma + self.angle_clip = angle_clip + + def __call__(self, data, label): + angles = np.clip(self.angle_sigma*np.random.randn(3), -self.angle_clip, self.angle_clip) + Rx = np.array([[1, 0, 0], + [0, np.cos(angles[0]), -np.sin(angles[0])], + [0, np.sin(angles[0]), np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]), 0, np.sin(angles[1])], + [0, 1, 0], + [-np.sin(angles[1]), 0, np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]), -np.sin(angles[2]), 0], + [np.sin(angles[2]), np.cos(angles[2]), 0], + [0, 0, 1]]) + R = np.dot(Rz, np.dot(Ry, Rx)) + data[:, 0:3] = np.dot(data[:, 0:3], R) + if data.shape[1] > 3: # use normal + data[:, 3:6] = np.dot(data[:, 3:6], R) + return data, label + + +class RandomScale(object): + def __init__(self, scale_low=0.8, scale_high=1.2): + self.scale_low = scale_low + self.scale_high = scale_high + + def __call__(self, points, color): + scale = np.random.uniform(self.scale_low, self.scale_high) + points[:, 0:3] *= scale + return points, color + + def __repr__(self): + return 'RandomScale(scale_low: {}, scale_high: {})'.format(self.scale_low, self.scale_high) + + +class RandomShift(object): + def __init__(self, shift_range=0.1): + self.shift_range = shift_range + + def __call__(self, points, color): + shift = np.random.uniform(-self.shift_range, self.shift_range, 3) + points[:, 0:3] += shift + return points, color + + def __repr__(self): + return 'RandomShift(shift_range: {})'.format(self.shift_range) + + +class RandomJitter(object): + def __init__(self, sigma=0.01, clip=0.05): + self.sigma = sigma + self.clip = clip + + def __call__(self, points, color): + assert (self.clip > 0) + jitter = np.clip(self.sigma * np.random.randn(points.shape[0], 3), -1 * self.clip, self.clip) + points[:, 0:3] += jitter + return points, color + + def __repr__(self): + return 'RandomJitter(sigma: {}, clip: {})'.format(self.sigma, self.clip) + + +class ChromaticAutoContrast(object): + def __init__(self, p=0.2, blend_factor=None): + self.p = p + self.blend_factor = blend_factor + + def __call__(self, points, color): + if np.random.rand() < self.p: + lo = np.min(color, axis=0, keepdims=True) + hi = np.max(color, axis=0, keepdims=True) + scale = 255 / (hi - lo) + contrast_color = (color - lo) * scale + blend_factor = np.random.rand() if self.blend_factor is None else self.blend_factor + color = (1 - blend_factor) * color + blend_factor * contrast_color + return points, color + + +class ChromaticTranslation(object): + def __init__(self, p=0.95, ratio=0.05): + self.p = p + self.ratio = ratio + + def __call__(self, points, color): + if np.random.rand() < self.p: + tr = (np.random.rand(1, 3) - 0.5) * 255 * 2 * self.ratio + color = np.clip(tr + color, 0, 255) + return points, color + + +class ChromaticJitter(object): + def __init__(self, p=0.95, std=0.005): + self.p = p + self.std = std + + def __call__(self, points, color): + if np.random.rand() < self.p: + noise = np.random.randn(color.shape[0], 3) + noise *= self.std * 255 + color[:, :3] = np.clip(noise + color[:, :3], 0, 255) + return points, color + + +class HueSaturationTranslation(object): + @staticmethod + def rgb_to_hsv(rgb): + # Translated from source of colorsys.rgb_to_hsv + # r,g,b should be a numpy arrays with values between 0 and 255 + # rgb_to_hsv returns an array of floats between 0.0 and 1.0. + rgb = rgb.astype('float') + hsv = np.zeros_like(rgb) + # in case an RGBA array was passed, just copy the A channel + hsv[..., 3:] = rgb[..., 3:] + r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2] + maxc = np.max(rgb[..., :3], axis=-1) + minc = np.min(rgb[..., :3], axis=-1) + hsv[..., 2] = maxc + mask = maxc != minc + hsv[mask, 1] = (maxc - minc)[mask] / maxc[mask] + rc = np.zeros_like(r) + gc = np.zeros_like(g) + bc = np.zeros_like(b) + rc[mask] = (maxc - r)[mask] / (maxc - minc)[mask] + gc[mask] = (maxc - g)[mask] / (maxc - minc)[mask] + bc[mask] = (maxc - b)[mask] / (maxc - minc)[mask] + hsv[..., 0] = np.select([r == maxc, g == maxc], [bc - gc, 2.0 + rc - bc], default=4.0 + gc - rc) + hsv[..., 0] = (hsv[..., 0] / 6.0) % 1.0 + return hsv + + @staticmethod + def hsv_to_rgb(hsv): + # Translated from source of colorsys.hsv_to_rgb + # h,s should be a numpy arrays with values between 0.0 and 1.0 + # v should be a numpy array with values between 0.0 and 255.0 + # hsv_to_rgb returns an array of uints between 0 and 255. + rgb = np.empty_like(hsv) + rgb[..., 3:] = hsv[..., 3:] + h, s, v = hsv[..., 0], hsv[..., 1], hsv[..., 2] + i = (h * 6.0).astype('uint8') + f = (h * 6.0) - i + p = v * (1.0 - s) + q = v * (1.0 - s * f) + t = v * (1.0 - s * (1.0 - f)) + i = i % 6 + conditions = [s == 0.0, i == 1, i == 2, i == 3, i == 4, i == 5] + rgb[..., 0] = np.select(conditions, [v, q, p, p, t, v], default=v) + rgb[..., 1] = np.select(conditions, [v, v, v, q, p, p], default=t) + rgb[..., 2] = np.select(conditions, [v, p, t, v, v, q], default=p) + return rgb.astype('uint8') + + def __init__(self, hue_max=0.5, saturation_max=0.2): + self.hue_max = hue_max + self.saturation_max = saturation_max + + def __call__(self, points, color): + # Assume color[:, :3] is rgb + hsv = HueSaturationTranslation.rgb_to_hsv(color[:, :3]) + hue_val = (np.random.rand() - 0.5) * 2 * self.hue_max + sat_ratio = 1 + (np.random.rand() - 0.5) * 2 * self.saturation_max + hsv[..., 0] = np.remainder(hue_val + hsv[..., 0] + 1, 1) + hsv[..., 1] = np.clip(sat_ratio * hsv[..., 1], 0, 1) + color[:, :3] = np.clip(HueSaturationTranslation.hsv_to_rgb(hsv), 0, 255) + return points, color + + +class RandomDropColor(object): + def __init__(self, p=0.8, color_augment=0.0): + self.p = p + self.color_augment = color_augment + + def __call__(self, points, color): + if color is not None and np.random.rand() > self.p: + color *= self.color_augment + return points, color + + def __repr__(self): + return 'RandomDropColor(color_augment: {}, p: {})'.format(self.color_augment, self.p) \ No newline at end of file diff --git a/zoo/PAConv/scene_seg/util/util.py b/zoo/PAConv/scene_seg/util/util.py new file mode 100755 index 0000000..17195d2 --- /dev/null +++ b/zoo/PAConv/scene_seg/util/util.py @@ -0,0 +1,183 @@ +import os +import numpy as np +from PIL import Image +import logging +import argparse + +import torch +from torch import nn +from torch.nn.modules.conv import _ConvNd +from torch.nn.modules.batchnorm import _BatchNorm +import torch.nn.init as initer + +from . import config + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +def step_learning_rate(optimizer, base_lr, epoch, step_epoch, multiplier=0.1, clip=1e-6): + """Sets the learning rate to the base LR decayed by 10 every step epochs""" + lr = max(base_lr * (multiplier ** (epoch // step_epoch)), clip) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def poly_learning_rate(optimizer, base_lr, curr_iter, max_iter, power=0.9): + """poly learning rate policy""" + lr = base_lr * (1 - float(curr_iter) / max_iter) ** power + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def intersectionAndUnion(output, target, K, ignore_index=255): + # 'K' classes, output and target sizes are N or N * L or N * H * W, each value in range 0 to K - 1. + assert (output.ndim in [1, 2, 3]) + assert output.shape == target.shape + output = output.reshape(output.size).copy() + target = target.reshape(target.size) + output[np.where(target == ignore_index)[0]] = 255 + intersection = output[np.where(output == target)[0]] + area_intersection, _ = np.histogram(intersection, bins=np.arange(K+1)) + area_output, _ = np.histogram(output, bins=np.arange(K+1)) + area_target, _ = np.histogram(target, bins=np.arange(K+1)) + area_union = area_output + area_target - area_intersection + return area_intersection, area_union, area_target + + +def intersectionAndUnionGPU(output, target, K, ignore_index=255): + # 'K' classes, output and target sizes are N or N * L or N * H * W, each value in range 0 to K - 1. + assert (output.dim() in [1, 2, 3]) + assert output.shape == target.shape + output = output.view(-1) + target = target.view(-1) + output[target == ignore_index] = ignore_index + intersection = output[output == target] + # https://github.com/pytorch/pytorch/issues/1382 + area_intersection = torch.histc(intersection.float().cpu(), bins=K, min=0, max=K-1) + area_output = torch.histc(output.float().cpu(), bins=K, min=0, max=K-1) + area_target = torch.histc(target.float().cpu(), bins=K, min=0, max=K-1) + area_union = area_output + area_target - area_intersection + return area_intersection.cuda(), area_union.cuda(), area_target.cuda() + + +def check_mkdir(dir_name): + if not os.path.exists(dir_name): + os.mkdir(dir_name) + + +def check_makedirs(dir_name): + if not os.path.exists(dir_name): + os.makedirs(dir_name) + + +def init_weights(model, conv='kaiming', batchnorm='normal', linear='kaiming', lstm='kaiming'): + """ + :param model: Pytorch Model which is nn.Module + :param conv: 'kaiming' or 'xavier' + :param batchnorm: 'normal' or 'constant' + :param linear: 'kaiming' or 'xavier' + :param lstm: 'kaiming' or 'xavier' + """ + for m in model.modules(): + if isinstance(m, (_ConvNd)): + if conv == 'kaiming': + initer.kaiming_normal_(m.weight) + elif conv == 'xavier': + initer.xavier_normal_(m.weight) + else: + raise ValueError("init type of conv error.\n") + if m.bias is not None: + initer.constant_(m.bias, 0) + + elif isinstance(m, _BatchNorm): + if batchnorm == 'normal': + initer.normal_(m.weight, 1.0, 0.02) + elif batchnorm == 'constant': + initer.constant_(m.weight, 1.0) + else: + raise ValueError("init type of batchnorm error.\n") + initer.constant_(m.bias, 0.0) + + elif isinstance(m, nn.Linear): + if linear == 'kaiming': + initer.kaiming_normal_(m.weight) + elif linear == 'xavier': + initer.xavier_normal_(m.weight) + else: + raise ValueError("init type of linear error.\n") + if m.bias is not None: + initer.constant_(m.bias, 0) + + elif isinstance(m, nn.LSTM): + for name, param in m.named_parameters(): + if 'weight' in name: + if lstm == 'kaiming': + initer.kaiming_normal_(param) + elif lstm == 'xavier': + initer.xavier_normal_(param) + else: + raise ValueError("init type of lstm error.\n") + elif 'bias' in name: + initer.constant_(param, 0) + + +def convert_to_syncbn(model): + def recursive_set(cur_module, name, module): + if len(name.split('.')) > 1: + recursive_set(getattr(cur_module, name[:name.find('.')]), name[name.find('.')+1:], module) + else: + setattr(cur_module, name, module) + from lib.sync_bn import SynchronizedBatchNorm1d, SynchronizedBatchNorm2d, SynchronizedBatchNorm3d + for name, m in model.named_modules(): + if isinstance(m, nn.BatchNorm1d): + recursive_set(model, name, SynchronizedBatchNorm1d(m.num_features, m.eps, m.momentum, m.affine)) + elif isinstance(m, nn.BatchNorm2d): + recursive_set(model, name, SynchronizedBatchNorm2d(m.num_features, m.eps, m.momentum, m.affine)) + elif isinstance(m, nn.BatchNorm3d): + recursive_set(model, name, SynchronizedBatchNorm3d(m.num_features, m.eps, m.momentum, m.affine)) + + +def colorize(gray, palette): + # gray: numpy array of the label and 1*3N size list palette + color = Image.fromarray(gray.astype(np.uint8)).convert('P') + color.putpalette(palette) + return color + + +def get_parser(): + parser = argparse.ArgumentParser(description='PAConv: Point Cloud Semantic Segmentation') + parser.add_argument('--config', type=str, default='config/s3dis/s3dis_pointnet2_paconv.yaml', help='config file') + parser.add_argument('opts', help='see config/s3dis/s3dis_pointnet2_paconv.yaml for all options', default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + assert args.config is not None + cfg = config.load_cfg_from_cfg_file(args.config) + if args.opts is not None: + cfg = config.merge_cfg_from_list(cfg, args.opts) + return cfg + + +def get_logger(): + logger_name = "main-logger" + logger = logging.getLogger(logger_name) + logger.setLevel(logging.INFO) + handler = logging.StreamHandler() + fmt = "[%(asctime)s %(levelname)s %(filename)s line %(lineno)d %(process)d] %(message)s" + handler.setFormatter(logging.Formatter(fmt)) + logger.addHandler(handler) + return logger diff --git a/zoo/PCT/.gitignore b/zoo/PCT/.gitignore new file mode 100644 index 0000000..e003ca0 --- /dev/null +++ b/zoo/PCT/.gitignore @@ -0,0 +1,3 @@ +.idea +*/__pycache__/ +*.pyc \ No newline at end of file diff --git a/zoo/PCT/GDANet_cls.py b/zoo/PCT/GDANet_cls.py new file mode 100644 index 0000000..047e829 --- /dev/null +++ b/zoo/PCT/GDANet_cls.py @@ -0,0 +1,118 @@ +import torch.nn as nn +import torch +import torch.nn.functional as F +from util_lib.GDANet_util import local_operator, GDM, SGCAM + + +class GDANET(nn.Module): + def __init__(self): + super(GDANET, self).__init__() + + self.bn1 = nn.BatchNorm2d(64, momentum=0.1) + self.bn11 = nn.BatchNorm2d(64, momentum=0.1) + self.bn12 = nn.BatchNorm1d(64, momentum=0.1) + + self.bn2 = nn.BatchNorm2d(64, momentum=0.1) + self.bn21 = nn.BatchNorm2d(64, momentum=0.1) + self.bn22 = nn.BatchNorm1d(64, momentum=0.1) + + self.bn3 = nn.BatchNorm2d(128, momentum=0.1) + self.bn31 = nn.BatchNorm2d(128, momentum=0.1) + self.bn32 = nn.BatchNorm1d(128, momentum=0.1) + + self.bn4 = nn.BatchNorm1d(512, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=True), + self.bn1) + self.conv11 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=True), + self.bn11) + self.conv12 = nn.Sequential(nn.Conv1d(64 * 2, 64, kernel_size=1, bias=True), + self.bn12) + + self.conv2 = nn.Sequential(nn.Conv2d(67 * 2, 64, kernel_size=1, bias=True), + self.bn2) + self.conv21 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1, bias=True), + self.bn21) + self.conv22 = nn.Sequential(nn.Conv1d(64 * 2, 64, kernel_size=1, bias=True), + self.bn22) + + self.conv3 = nn.Sequential(nn.Conv2d(131 * 2, 128, kernel_size=1, bias=True), + self.bn3) + self.conv31 = nn.Sequential(nn.Conv2d(128, 128, kernel_size=1, bias=True), + self.bn31) + self.conv32 = nn.Sequential(nn.Conv1d(128, 128, kernel_size=1, bias=True), + self.bn32) + + self.conv4 = nn.Sequential(nn.Conv1d(256, 512, kernel_size=1, bias=True), + self.bn4) + + self.SGCAM_1s = SGCAM(64) + self.SGCAM_1g = SGCAM(64) + self.SGCAM_2s = SGCAM(64) + self.SGCAM_2g = SGCAM(64) + + self.linear1 = nn.Linear(1024, 512, bias=True) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=0.4) + self.linear2 = nn.Linear(512, 256, bias=True) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=0.4) + self.linear3 = nn.Linear(256, 40, bias=True) + + def forward(self, x): + B, C, N = x.size() + ############### + """block 1""" + # Local operator: + x1 = local_operator(x, k=30) + x1 = F.relu(self.conv1(x1)) + x1 = F.relu(self.conv11(x1)) + x1 = x1.max(dim=-1, keepdim=False)[0] + + # Geometry-Disentangle Module: + x1s, x1g = GDM(x1, M=256) + + # Sharp-Gentle Complementary Attention Module: + y1s = self.SGCAM_1s(x1, x1s.transpose(2, 1)) + y1g = self.SGCAM_1g(x1, x1g.transpose(2, 1)) + z1 = torch.cat([y1s, y1g], 1) + z1 = F.relu(self.conv12(z1)) + ############### + """block 2""" + x1t = torch.cat((x, z1), dim=1) + x2 = local_operator(x1t, k=30) + x2 = F.relu(self.conv2(x2)) + x2 = F.relu(self.conv21(x2)) + x2 = x2.max(dim=-1, keepdim=False)[0] + + x2s, x2g = GDM(x2, M=256) + + y2s = self.SGCAM_2s(x2, x2s.transpose(2, 1)) + y2g = self.SGCAM_2g(x2, x2g.transpose(2, 1)) + z2 = torch.cat([y2s, y2g], 1) + z2 = F.relu(self.conv22(z2)) + ############### + x2t = torch.cat((x1t, z2), dim=1) + x3 = local_operator(x2t, k=30) + x3 = F.relu(self.conv3(x3)) + x3 = F.relu(self.conv31(x3)) + x3 = x3.max(dim=-1, keepdim=False)[0] + z3 = F.relu(self.conv32(x3)) + ############### + x = torch.cat((z1, z2, z3), dim=1) + x = F.relu(self.conv4(x)) + x11 = F.adaptive_max_pool1d(x, 1).view(B, -1) + x22 = F.adaptive_avg_pool1d(x, 1).view(B, -1) + x = torch.cat((x11, x22), 1) + + x = F.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = F.relu(self.bn7(self.linear2(x))) + x = self.dp2(x) + x = self.linear3(x) + return x + +if __name__ == '__main__': + model = GDANET() + pytorch_total_params = sum(p.numel() for p in model.parameters()) + print(pytorch_total_params/1e6) \ No newline at end of file diff --git a/zoo/PCT/LICENSE b/zoo/PCT/LICENSE new file mode 100644 index 0000000..d838b49 --- /dev/null +++ b/zoo/PCT/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Strawberry-Eat-Mango + +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/zoo/PCT/PointWOLF.py b/zoo/PCT/PointWOLF.py new file mode 100644 index 0000000..cc1c415 --- /dev/null +++ b/zoo/PCT/PointWOLF.py @@ -0,0 +1,172 @@ +""" +@origin : PointWOLF.py by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@Time: 2021.09.30 +""" + +import torch +import torch.nn as nn +import numpy as np + +class PointWOLF(object): + def __init__(self, args): + print("="*10 + "Using PointWolf" + "="*10) + self.num_anchor = args.w_num_anchor + self.sample_type = args.w_sample_type + self.sigma = args.w_sigma + + self.R_range = (-abs(args.w_R_range), abs(args.w_R_range)) + self.S_range = (1., args.w_S_range) + self.T_range = (-abs(args.w_T_range), abs(args.w_T_range)) + + + def __call__(self, pos): + """ + input : + pos([N,3]) + + output : + pos([N,3]) : original pointcloud + pos_new([N,3]) : Pointcloud augmneted by PointWOLF + """ + M=self.num_anchor #(Mx3) + N, _=pos.shape #(N) + + if self.sample_type == 'random': + idx = np.random.choice(N,M)#(M) + elif self.sample_type == 'fps': + idx = self.fps(pos, M) #(M) + + pos_anchor = pos[idx] #(M,3), anchor point + + pos_repeat = np.expand_dims(pos,0).repeat(M, axis=0)#(M,N,3) + pos_normalize = np.zeros_like(pos_repeat, dtype=pos.dtype) #(M,N,3) + + #Move to canonical space + pos_normalize = pos_repeat - pos_anchor.reshape(M,-1,3) + + #Local transformation at anchor point + pos_transformed = self.local_transformaton(pos_normalize) #(M,N,3) + + #Move to origin space + pos_transformed = pos_transformed + pos_anchor.reshape(M,-1,3) #(M,N,3) + + pos_new = self.kernel_regression(pos, pos_anchor, pos_transformed) + pos_new = self.normalize(pos_new) + + return pos.astype('float32'), pos_new.astype('float32') + + + def kernel_regression(self, pos, pos_anchor, pos_transformed): + """ + input : + pos([N,3]) + pos_anchor([M,3]) + pos_transformed([M,N,3]) + + output : + pos_new([N,3]) : Pointcloud after weighted local transformation + """ + M, N, _ = pos_transformed.shape + + #Distance between anchor points & entire points + sub = np.expand_dims(pos_anchor,1).repeat(N, axis=1) - np.expand_dims(pos,0).repeat(M, axis=0) #(M,N,3), d + + project_axis = self.get_random_axis(1) + + projection = np.expand_dims(project_axis, axis=1)*np.eye(3)#(1,3,3) + + #Project distance + sub = sub @ projection # (M,N,3) + sub = np.sqrt(((sub) ** 2).sum(2)) #(M,N) + + #Kernel regression + weight = np.exp(-0.5 * (sub ** 2) / (self.sigma ** 2)) #(M,N) + pos_new = (np.expand_dims(weight,2).repeat(3, axis=-1) * pos_transformed).sum(0) #(N,3) + pos_new = (pos_new / weight.sum(0, keepdims=True).T) # normalize by weight + return pos_new + + + def fps(self, pos, npoint): + """ + input : + pos([N,3]) + npoint(int) + + output : + centroids([npoints]) : index list for fps + """ + N, _ = pos.shape + centroids = np.zeros(npoint, dtype=np.int_) #(M) + distance = np.ones(N, dtype=np.float64) * 1e10 #(N) + farthest = np.random.randint(0, N, (1,), dtype=np.int_) + for i in range(npoint): + centroids[i] = farthest + centroid = pos[farthest, :] + dist = ((pos - centroid)**2).sum(-1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = distance.argmax() + return centroids + + def local_transformaton(self, pos_normalize): + """ + input : + pos([N,3]) + pos_normalize([M,N,3]) + + output : + pos_normalize([M,N,3]) : Pointclouds after local transformation centered at M anchor points. + """ + M,N,_ = pos_normalize.shape + transformation_dropout = np.random.binomial(1, 0.5, (M,3)) #(M,3) + transformation_axis =self.get_random_axis(M) #(M,3) + + degree = np.pi * np.random.uniform(*self.R_range, size=(M,3)) / 180.0 * transformation_dropout[:,0:1] #(M,3), sampling from (-R_range, R_range) + + scale = np.random.uniform(*self.S_range, size=(M,3)) * transformation_dropout[:,1:2] #(M,3), sampling from (1, S_range) + scale = scale*transformation_axis + scale = scale + 1*(scale==0) #Scaling factor must be larger than 1 + + trl = np.random.uniform(*self.T_range, size=(M,3)) * transformation_dropout[:,2:3] #(M,3), sampling from (1, T_range) + trl = trl*transformation_axis + + #Scaling Matrix + S = np.expand_dims(scale, axis=1)*np.eye(3) # scailing factor to diagonal matrix (M,3) -> (M,3,3) + #Rotation Matrix + sin = np.sin(degree) + cos = np.cos(degree) + sx, sy, sz = sin[:,0], sin[:,1], sin[:,2] + cx, cy, cz = cos[:,0], cos[:,1], cos[:,2] + R = np.stack([cz*cy, cz*sy*sx - sz*cx, cz*sy*cx + sz*sx, + sz*cy, sz*sy*sx + cz*cy, sz*sy*cx - cz*sx, + -sy, cy*sx, cy*cx], axis=1).reshape(M,3,3) + + pos_normalize = pos_normalize@R@S + trl.reshape(M,1,3) + return pos_normalize + + def get_random_axis(self, n_axis): + """ + input : + n_axis(int) + + output : + axis([n_axis,3]) : projection axis + """ + axis = np.random.randint(1,8, (n_axis)) # 1(001):z, 2(010):y, 3(011):yz, 4(100):x, 5(101):xz, 6(110):xy, 7(111):xyz + m = 3 + axis = (((axis[:,None] & (1 << np.arange(m)))) > 0).astype(int) + return axis + + def normalize(self, pos): + """ + input : + pos([N,3]) + + output : + pos([N,3]) : normalized Pointcloud + """ + pos = pos - pos.mean(axis=-2, keepdims=True) + scale = (1 / np.sqrt((pos ** 2).sum(1)).max()) * 0.999999 + pos = scale * pos + return pos diff --git a/zoo/PCT/README.md b/zoo/PCT/README.md new file mode 100644 index 0000000..f299162 --- /dev/null +++ b/zoo/PCT/README.md @@ -0,0 +1,48 @@ +## PCT: Point Cloud Transformer +This is a Pytorch implementation of PCT: Point Cloud Transformer. + +Paper link: https://arxiv.org/pdf/2012.09688.pdf + +### Requirements +python >= 3.7 + +pytorch >= 1.6 + +h5py + +scikit-learn + +and + +```shell script +pip install pointnet2_ops_lib/. +``` +The code is from https://github.com/erikwijmans/Pointnet2_PyTorch https://github.com/WangYueFt/dgcnn and https://github.com/MenghaoGuo/PCT + +### Models +We get an accuracy of 93.2% on the ModelNet40(http://modelnet.cs.princeton.edu/) validation dataset + +The path of the model is in ./checkpoints/best/models/model.t7 + +### Example training and testing +```shell script +# train +python main.py --exp_name=train --num_points=1024 --use_sgd=True --batch_size 32 --epochs 250 --lr 0.0001 + +# test +python main.py --exp_name=test --num_points=1024 --use_sgd=True --eval=True --model_path=checkpoints/best/models/model.t7 --test_batch_size 8 + +``` + +### Citation +If it is helpful for your work, please cite this paper: +```latex +@misc{guo2020pct, + title={PCT: Point Cloud Transformer}, + author={Meng-Hao Guo and Jun-Xiong Cai and Zheng-Ning Liu and Tai-Jiang Mu and Ralph R. Martin and Shi-Min Hu}, + year={2020}, + eprint={2012.09688}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/zoo/PCT/checkpoints/best/models/model.t7 b/zoo/PCT/checkpoints/best/models/model.t7 new file mode 100644 index 0000000..2ecf47a Binary files /dev/null and b/zoo/PCT/checkpoints/best/models/model.t7 differ diff --git a/zoo/PCT/data.py b/zoo/PCT/data.py new file mode 100644 index 0000000..c0cb2ef --- /dev/null +++ b/zoo/PCT/data.py @@ -0,0 +1,89 @@ +import os +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset +from PointWOLF import PointWOLF + +def download(): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, 'data') + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + +def load_data(partition): + download() + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, 'data') + all_data = [] + all_label = [] + for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048', 'ply_data_%s*.h5'%partition)): + f = h5py.File(h5_name) + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + +def random_point_dropout(pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + # for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((pc.shape[0]))<=dropout_ratio)[0] + # print ('use random drop', len(drop_idx)) + + if len(drop_idx)>0: + pc[drop_idx,:] = pc[0,:] # set to the first point + return pc + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, num_points, partition='train', args=None): + self.data, self.label = load_data(partition) + self.num_points = num_points + self.partition = partition + self.PointWOLF = PointWOLF(args) if args is not None else None + + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + if self.partition == 'train': + np.random.shuffle(pointcloud) + if self.PointWOLF is not None: + _, pointcloud = self.PointWOLF(pointcloud) + # pointcloud = random_point_dropout(pointcloud) # open for dgcnn not for our idea for all + # pointcloud = translate_pointcloud(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + + +if __name__ == '__main__': + train = ModelNet40(1024) + test = ModelNet40(1024, 'test') + for data, label in train: + print(data.shape) + print(label.shape) diff --git a/zoo/PCT/main.py b/zoo/PCT/main.py new file mode 100644 index 0000000..057af79 --- /dev/null +++ b/zoo/PCT/main.py @@ -0,0 +1,314 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR +from data import ModelNet40 +from model import Pct, RPC +import numpy as np +from torch.utils.data import DataLoader +from util import cal_loss, IOStream +import sklearn.metrics as metrics +import rsmix_provider +import time +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + if not os.path.exists('checkpoints/' + args.exp_name + '/' + 'models'): + os.makedirs('checkpoints/' + args.exp_name + '/' + 'models') + os.system('cp main.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp model.py checkpoints' + '/' + args.exp_name + '/' + 'model.py.backup') + os.system('cp util.py checkpoints' + '/' + args.exp_name + '/' + 'util.py.backup') + os.system('cp data.py checkpoints' + '/' + args.exp_name + '/' + 'data.py.backup') + + +def train(args, io): + train_loader = DataLoader(ModelNet40(partition='train', num_points=args.num_points, args=args if args.pw else None), + num_workers=8, + batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), num_workers=8, + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + if args.model == 'RPC': + model = RPC(args).to(device) + else: + model = Pct(args).to(device) + print(str(model)) + model = nn.DataParallel(model) + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr * 100, momentum=args.momentum, weight_decay=5e-4) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr) + + criterion = cal_loss + best_test_acc = 0 + + for epoch in range(args.epochs): + scheduler.step() + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + idx = 0 + total_time = 0.0 + for data, label in train_loader: + ''' + implement augmentation + ''' + + rsmix = False + r = np.random.rand(1) + if args.beta > 0 and r < args.rsmix_prob: + rsmix = True + data, lam, label, label_b = rsmix_provider.rsmix(data, label, beta=args.beta, n_sample=args.nsample, + KNN=args.knn) + if args.rot or args.rdscale or args.shift or args.jitter or args.shuffle or args.rddrop or ( + args.beta is not 0.0): + data = torch.FloatTensor(data) + if rsmix: + lam = torch.FloatTensor(lam) + lam, label_b = lam.to(device), label_b.to(device).squeeze() + + data, label = data.to(device), label.to(device).squeeze() + if rsmix: + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + + start_time = time.time() + logits = model(data) + loss = 0 + for i in range(batch_size): + loss_tmp = criterion(logits[i].unsqueeze(0), label[i].unsqueeze(0).long()) * (1 - lam[i]) \ + + criterion(logits[i].unsqueeze(0), label_b[i].unsqueeze(0).long()) * lam[i] + loss += loss_tmp + loss = loss / batch_size + else: + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + start_time = time.time() + logits = model(data) + loss = criterion(logits, label) + + loss.backward() + opt.step() + end_time = time.time() + total_time += (end_time - start_time) + + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + + print('train total time is', total_time) + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f' % (epoch, + train_loss * 1.0 / count, + metrics.accuracy_score( + train_true, train_pred), + metrics.balanced_accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + total_time = 0.0 + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + start_time = time.time() + logits = model(data) + end_time = time.time() + total_time += (end_time - start_time) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + print('test total time is', total_time) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f' % (epoch, + test_loss * 1.0 / count, + test_acc, + avg_per_class_acc) + io.cprint(outstr) + if test_acc >= best_test_acc: + best_test_acc = test_acc + torch.save(model.state_dict(), 'checkpoints/%s/models/model.t7' % args.exp_name) + torch.save(model.state_dict(), 'checkpoints/%s/models/model_final.t7' % args.exp_name) + + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + model = Pct(args).to(device) + model = nn.DataParallel(model) + + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + test_true = [] + test_pred = [] + + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + if args.test_batch_size == 1: + test_true.append([label.cpu().numpy()]) + test_pred.append([preds.detach().cpu().numpy()]) + else: + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f' % (test_acc, avg_per_class_acc) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Recognition') + parser.add_argument('--exp_name', type=str, default='exp', metavar='N', + help='Name of the experiment') + parser.add_argument('--dataset', type=str, default='modelnet40', metavar='N', + choices=['modelnet40']) + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=250, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.0001, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--eval_corrupt', type=bool, default=False, + help='evaluate the model under corruption') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--dropout', type=float, default=0.5, + help='dropout rate') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + parser.add_argument('--model', type=str, default='PCT', choices=['RPC', 'PCT'], help='choose model') + + # pointwolf + parser.add_argument('--pw', action='store_true', help='use PointWOLF') + parser.add_argument('--w_num_anchor', type=int, default=4, help='Num of anchor point') + parser.add_argument('--w_sample_type', type=str, default='fps', + help='Sampling method for anchor point, option : (fps, random)') + parser.add_argument('--w_sigma', type=float, default=0.5, help='Kernel bandwidth') + + parser.add_argument('--w_R_range', type=float, default=10, help='Maximum rotation range of local transformation') + parser.add_argument('--w_S_range', type=float, default=3, help='Maximum scailing range of local transformation') + parser.add_argument('--w_T_range', type=float, default=0.25, + help='Maximum translation range of local transformation') + + # rsmix + parser.add_argument('--rdscale', action='store_true', help='random scaling data augmentation') + parser.add_argument('--shift', action='store_true', help='random shift data augmentation') + parser.add_argument('--shuffle', action='store_true', help='random shuffle data augmentation') + parser.add_argument('--rot', action='store_true', help='random rotation augmentation') + parser.add_argument('--jitter', action='store_true', help='jitter augmentation') + parser.add_argument('--rddrop', action='store_true', help='random point drop data augmentation') + parser.add_argument('--rsmix_prob', type=float, default=0.5, help='rsmix probability') + parser.add_argument('--beta', type=float, default=0.0, help='scalar value for beta function') + parser.add_argument('--nsample', type=float, default=512, + help='default max sample number of the erased or added points in rsmix') + parser.add_argument('--knn', action='store_true', help='use knn instead ball-query function') + + args = parser.parse_args() + + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + torch.manual_seed(args.seed) + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + torch.cuda.manual_seed(args.seed) + else: + io.cprint('Using CPU') + + if not args.eval and not args.eval_corrupt: + train(args, io) + elif args.eval: + test(args, io) + elif args.eval_corrupt: + device = torch.device("cuda" if args.cuda else "cpu") + if args.model == 'RPC': + model = RPC(args).to(device) + else: + model = Pct(args).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + + + def test_corrupt(args, split, model): + test_loader = DataLoader(ModelNetC(split=split), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + return {'acc': test_acc, 'avg_per_class_acc': avg_per_class_acc} + + + eval_corrupt_wrapper(model, test_corrupt, {'args': args}) diff --git a/zoo/PCT/model.py b/zoo/PCT/model.py new file mode 100644 index 0000000..8173294 --- /dev/null +++ b/zoo/PCT/model.py @@ -0,0 +1,201 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from util import sample_and_group +from GDANet_cls import GDM, local_operator, SGCAM + +class Local_op(nn.Module): + def __init__(self, in_channels, out_channels): + super(Local_op, self).__init__() + self.conv1 = nn.Conv1d(in_channels, out_channels, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(out_channels, out_channels, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(out_channels) + self.bn2 = nn.BatchNorm1d(out_channels) + + def forward(self, x): + b, n, s, d = x.size() # torch.Size([32, 512, 32, 6]) + x = x.permute(0, 1, 3, 2) + x = x.reshape(-1, d, s) + batch_size, _, N = x.size() + x = F.relu(self.bn1(self.conv1(x))) # B, D, N + x = F.relu(self.bn2(self.conv2(x))) # B, D, N + x = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x = x.reshape(b, n, -1).permute(0, 2, 1) + return x + + +class RPC(nn.Module): + def __init__(self, args, output_channels=40): + super(RPC, self).__init__() + self.args = args + + self.bn1 = nn.BatchNorm2d(64, momentum=0.1) + self.bn11 = nn.BatchNorm2d(128, momentum=0.1) + self.bn12 = nn.BatchNorm1d(256, momentum=0.1) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=True), + self.bn1) + self.conv11 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=1, bias=True), + self.bn11) + self.SGCAM_1s = SGCAM(128) + self.SGCAM_1g = SGCAM(128) + + self.pt_last = Point_Transformer_Last(args) + + self.conv_fuse = nn.Sequential(nn.Conv1d(1280, 1024, kernel_size=1, bias=False), + nn.BatchNorm1d(1024), + nn.LeakyReLU(negative_slope=0.2)) + + self.linear1 = nn.Linear(1024, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, output_channels) + + def forward(self, x): + batch_size, _, _ = x.size() + + x1 = local_operator(x, k=30) + x1 = F.relu(self.conv1(x1)) + x1 = F.relu(self.conv11(x1)) + x1 = x1.max(dim=-1, keepdim=False)[0] + + # Geometry-Disentangle Module: + x1s, x1g = GDM(x1, M=256) + + # Sharp-Gentle Complementary Attention Module: + y1s = self.SGCAM_1s(x1, x1s.transpose(2, 1)) + y1g = self.SGCAM_1g(x1, x1g.transpose(2, 1)) + feature_1 = torch.cat([y1s, y1g], 1) + + x = self.pt_last(feature_1) + x = torch.cat([x, feature_1], dim=1) + x = self.conv_fuse(x) + x = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x = F.leaky_relu(self.bn6(self.linear1(x)), negative_slope=0.2) + x = self.dp1(x) + x = F.leaky_relu(self.bn7(self.linear2(x)), negative_slope=0.2) + x = self.dp2(x) + x = self.linear3(x) + + return x + +class Pct(nn.Module): + def __init__(self, args, output_channels=40): + super(Pct, self).__init__() + self.args = args + self.conv1 = nn.Conv1d(3, 64, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.gather_local_0 = Local_op(in_channels=128, out_channels=128) + self.gather_local_1 = Local_op(in_channels=256, out_channels=256) + + self.pt_last = Point_Transformer_Last(args) + + self.conv_fuse = nn.Sequential(nn.Conv1d(1280, 1024, kernel_size=1, bias=False), + nn.BatchNorm1d(1024), + nn.LeakyReLU(negative_slope=0.2)) + + + self.linear1 = nn.Linear(1024, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, output_channels) + + def forward(self, x): + xyz = x.permute(0, 2, 1) + batch_size, _, _ = x.size() + # B, D, N + x = F.relu(self.bn1(self.conv1(x))) + # B, D, N + x = F.relu(self.bn2(self.conv2(x))) + x = x.permute(0, 2, 1) + new_xyz, new_feature = sample_and_group(npoint=512, radius=0.15, nsample=32, xyz=xyz, points=x) + feature_0 = self.gather_local_0(new_feature) + feature = feature_0.permute(0, 2, 1) + new_xyz, new_feature = sample_and_group(npoint=256, radius=0.2, nsample=32, xyz=new_xyz, points=feature) + feature_1 = self.gather_local_1(new_feature) + + x = self.pt_last(feature_1) + x = torch.cat([x, feature_1], dim=1) + x = self.conv_fuse(x) + x = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x = F.leaky_relu(self.bn6(self.linear1(x)), negative_slope=0.2) + x = self.dp1(x) + x = F.leaky_relu(self.bn7(self.linear2(x)), negative_slope=0.2) + x = self.dp2(x) + x = self.linear3(x) + + return x + +class Point_Transformer_Last(nn.Module): + def __init__(self, args, channels=256): + super(Point_Transformer_Last, self).__init__() + self.args = args + self.conv1 = nn.Conv1d(channels, channels, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(channels, channels, kernel_size=1, bias=False) + + self.bn1 = nn.BatchNorm1d(channels) + self.bn2 = nn.BatchNorm1d(channels) + + self.sa1 = SA_Layer(channels) + self.sa2 = SA_Layer(channels) + self.sa3 = SA_Layer(channels) + self.sa4 = SA_Layer(channels) + + def forward(self, x): + # + # b, 3, npoint, nsample + # conv2d 3 -> 128 channels 1, 1 + # b * npoint, c, nsample + # permute reshape + batch_size, _, N = x.size() + + # B, D, N + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x1 = self.sa1(x) + x2 = self.sa2(x1) + x3 = self.sa3(x2) + x4 = self.sa4(x3) + x = torch.cat((x1, x2, x3, x4), dim=1) + + return x + +class SA_Layer(nn.Module): + def __init__(self, channels): + super(SA_Layer, self).__init__() + self.q_conv = nn.Conv1d(channels, channels // 4, 1, bias=False) + self.k_conv = nn.Conv1d(channels, channels // 4, 1, bias=False) + self.q_conv.weight = self.k_conv.weight + self.q_conv.bias = self.k_conv.bias + + self.v_conv = nn.Conv1d(channels, channels, 1) + self.trans_conv = nn.Conv1d(channels, channels, 1) + self.after_norm = nn.BatchNorm1d(channels) + self.act = nn.ReLU() + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + # b, n, c + x_q = self.q_conv(x).permute(0, 2, 1) + # b, c, n + x_k = self.k_conv(x) + x_v = self.v_conv(x) + # b, n, n + energy = torch.bmm(x_q, x_k) + + attention = self.softmax(energy) + attention = attention / (1e-9 + attention.sum(dim=1, keepdim=True)) + # b, c, n + x_r = torch.bmm(x_v, attention) + x_r = self.act(self.after_norm(self.trans_conv(x - x_r))) + x = x + x_r + return x + diff --git a/zoo/PCT/pointnet2_ops_lib/MANIFEST.in b/zoo/PCT/pointnet2_ops_lib/MANIFEST.in new file mode 100644 index 0000000..a4eb5de --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/MANIFEST.in @@ -0,0 +1 @@ +graft pointnet2_ops/_ext-src diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/__init__.py b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/__init__.py new file mode 100644 index 0000000..5fd361f --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/__init__.py @@ -0,0 +1,3 @@ +import pointnet2_ops.pointnet2_modules +import pointnet2_ops.pointnet2_utils +from pointnet2_ops._version import __version__ diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/ball_query.h b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/ball_query.h new file mode 100644 index 0000000..1bbc638 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/ball_query.h @@ -0,0 +1,5 @@ +#pragma once +#include + +at::Tensor ball_query(at::Tensor new_xyz, at::Tensor xyz, const float radius, + const int nsample); diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/cuda_utils.h b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/cuda_utils.h new file mode 100644 index 0000000..0fd5b6e --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/cuda_utils.h @@ -0,0 +1,41 @@ +#ifndef _CUDA_UTILS_H +#define _CUDA_UTILS_H + +#include +#include +#include + +#include +#include + +#include + +#define TOTAL_THREADS 512 + +inline int opt_n_threads(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + + return max(min(1 << pow_2, TOTAL_THREADS), 1); +} + +inline dim3 opt_block_config(int x, int y) { + const int x_threads = opt_n_threads(x); + const int y_threads = + max(min(opt_n_threads(y), TOTAL_THREADS / x_threads), 1); + dim3 block_config(x_threads, y_threads, 1); + + return block_config; +} + +#define CUDA_CHECK_ERRORS() \ + do { \ + cudaError_t err = cudaGetLastError(); \ + if (cudaSuccess != err) { \ + fprintf(stderr, "CUDA kernel failed : %s\n%s at L:%d in %s\n", \ + cudaGetErrorString(err), __PRETTY_FUNCTION__, __LINE__, \ + __FILE__); \ + exit(-1); \ + } \ + } while (0) + +#endif diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/group_points.h b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/group_points.h new file mode 100644 index 0000000..ad20cda --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/group_points.h @@ -0,0 +1,5 @@ +#pragma once +#include + +at::Tensor group_points(at::Tensor points, at::Tensor idx); +at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n); diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/interpolate.h b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/interpolate.h new file mode 100644 index 0000000..26b3464 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/interpolate.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +std::vector three_nn(at::Tensor unknowns, at::Tensor knows); +at::Tensor three_interpolate(at::Tensor points, at::Tensor idx, + at::Tensor weight); +at::Tensor three_interpolate_grad(at::Tensor grad_out, at::Tensor idx, + at::Tensor weight, const int m); diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/sampling.h b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/sampling.h new file mode 100644 index 0000000..d795271 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/sampling.h @@ -0,0 +1,6 @@ +#pragma once +#include + +at::Tensor gather_points(at::Tensor points, at::Tensor idx); +at::Tensor gather_points_grad(at::Tensor grad_out, at::Tensor idx, const int n); +at::Tensor furthest_point_sampling(at::Tensor points, const int nsamples); diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/utils.h b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/utils.h new file mode 100644 index 0000000..5f080ed --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/include/utils.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include + +#define CHECK_CUDA(x) \ + do { \ + AT_ASSERT(x.is_cuda(), #x " must be a CUDA tensor"); \ + } while (0) + +#define CHECK_CONTIGUOUS(x) \ + do { \ + AT_ASSERT(x.is_contiguous(), #x " must be a contiguous tensor"); \ + } while (0) + +#define CHECK_IS_INT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Int, \ + #x " must be an int tensor"); \ + } while (0) + +#define CHECK_IS_FLOAT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Float, \ + #x " must be a float tensor"); \ + } while (0) diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/ball_query.cpp b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/ball_query.cpp new file mode 100644 index 0000000..b1797c1 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/ball_query.cpp @@ -0,0 +1,32 @@ +#include "ball_query.h" +#include "utils.h" + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, int *idx); + +at::Tensor ball_query(at::Tensor new_xyz, at::Tensor xyz, const float radius, + const int nsample) { + CHECK_CONTIGUOUS(new_xyz); + CHECK_CONTIGUOUS(xyz); + CHECK_IS_FLOAT(new_xyz); + CHECK_IS_FLOAT(xyz); + + if (new_xyz.is_cuda()) { + CHECK_CUDA(xyz); + } + + at::Tensor idx = + torch::zeros({new_xyz.size(0), new_xyz.size(1), nsample}, + at::device(new_xyz.device()).dtype(at::ScalarType::Int)); + + if (new_xyz.is_cuda()) { + query_ball_point_kernel_wrapper(xyz.size(0), xyz.size(1), new_xyz.size(1), + radius, nsample, new_xyz.data_ptr(), + xyz.data_ptr(), idx.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return idx; +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/ball_query_gpu.cu b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/ball_query_gpu.cu new file mode 100644 index 0000000..559aef9 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/ball_query_gpu.cu @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "cuda_utils.h" + +// input: new_xyz(b, m, 3) xyz(b, n, 3) +// output: idx(b, m, nsample) +__global__ void query_ball_point_kernel(int b, int n, int m, float radius, + int nsample, + const float *__restrict__ new_xyz, + const float *__restrict__ xyz, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + xyz += batch_index * n * 3; + new_xyz += batch_index * m * 3; + idx += m * nsample * batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float radius2 = radius * radius; + for (int j = index; j < m; j += stride) { + float new_x = new_xyz[j * 3 + 0]; + float new_y = new_xyz[j * 3 + 1]; + float new_z = new_xyz[j * 3 + 2]; + for (int k = 0, cnt = 0; k < n && cnt < nsample; ++k) { + float x = xyz[k * 3 + 0]; + float y = xyz[k * 3 + 1]; + float z = xyz[k * 3 + 2]; + float d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 < radius2) { + if (cnt == 0) { + for (int l = 0; l < nsample; ++l) { + idx[j * nsample + l] = k; + } + } + idx[j * nsample + cnt] = k; + ++cnt; + } + } + } +} + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, int *idx) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + query_ball_point_kernel<<>>( + b, n, m, radius, nsample, new_xyz, xyz, idx); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/bindings.cpp b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/bindings.cpp new file mode 100644 index 0000000..d1916ce --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/bindings.cpp @@ -0,0 +1,19 @@ +#include "ball_query.h" +#include "group_points.h" +#include "interpolate.h" +#include "sampling.h" + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("gather_points", &gather_points); + m.def("gather_points_grad", &gather_points_grad); + m.def("furthest_point_sampling", &furthest_point_sampling); + + m.def("three_nn", &three_nn); + m.def("three_interpolate", &three_interpolate); + m.def("three_interpolate_grad", &three_interpolate_grad); + + m.def("ball_query", &ball_query); + + m.def("group_points", &group_points); + m.def("group_points_grad", &group_points_grad); +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/group_points.cpp b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/group_points.cpp new file mode 100644 index 0000000..285a4bd --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/group_points.cpp @@ -0,0 +1,62 @@ +#include "group_points.h" +#include "utils.h" + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out); + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points); + +at::Tensor group_points(at::Tensor points, at::Tensor idx) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + + if (points.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1), idx.size(2)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + group_points_kernel_wrapper(points.size(0), points.size(1), points.size(2), + idx.size(1), idx.size(2), + points.data_ptr(), idx.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} + +at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + + if (grad_out.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), n}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.is_cuda()) { + group_points_grad_kernel_wrapper( + grad_out.size(0), grad_out.size(1), n, idx.size(1), idx.size(2), + grad_out.data_ptr(), idx.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/group_points_gpu.cu b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/group_points_gpu.cu new file mode 100644 index 0000000..57c2b1b --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/group_points_gpu.cu @@ -0,0 +1,75 @@ +#include +#include + +#include "cuda_utils.h" + +// input: points(b, c, n) idx(b, npoints, nsample) +// output: out(b, c, npoints, nsample) +__global__ void group_points_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * n * c; + idx += batch_index * npoints * nsample; + out += batch_index * npoints * nsample * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + out[(l * npoints + j) * nsample + k] = points[l * n + ii]; + } + } +} + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + group_points_kernel<<>>( + b, c, n, npoints, nsample, points, idx, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, npoints, nsample), idx(b, npoints, nsample) +// output: grad_points(b, c, n) +__global__ void group_points_grad_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * npoints * nsample * c; + idx += batch_index * npoints * nsample; + grad_points += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + atomicAdd(grad_points + l * n + ii, + grad_out[(l * npoints + j) * nsample + k]); + } + } +} + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + group_points_grad_kernel<<>>( + b, c, n, npoints, nsample, grad_out, idx, grad_points); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/interpolate.cpp b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/interpolate.cpp new file mode 100644 index 0000000..cdee31c --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/interpolate.cpp @@ -0,0 +1,99 @@ +#include "interpolate.h" +#include "utils.h" + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx); +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out); +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points); + +std::vector three_nn(at::Tensor unknowns, at::Tensor knows) { + CHECK_CONTIGUOUS(unknowns); + CHECK_CONTIGUOUS(knows); + CHECK_IS_FLOAT(unknowns); + CHECK_IS_FLOAT(knows); + + if (unknowns.is_cuda()) { + CHECK_CUDA(knows); + } + + at::Tensor idx = + torch::zeros({unknowns.size(0), unknowns.size(1), 3}, + at::device(unknowns.device()).dtype(at::ScalarType::Int)); + at::Tensor dist2 = + torch::zeros({unknowns.size(0), unknowns.size(1), 3}, + at::device(unknowns.device()).dtype(at::ScalarType::Float)); + + if (unknowns.is_cuda()) { + three_nn_kernel_wrapper(unknowns.size(0), unknowns.size(1), knows.size(1), + unknowns.data_ptr(), knows.data_ptr(), + dist2.data_ptr(), idx.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return {dist2, idx}; +} + +at::Tensor three_interpolate(at::Tensor points, at::Tensor idx, + at::Tensor weight) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_CONTIGUOUS(weight); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + CHECK_IS_FLOAT(weight); + + if (points.is_cuda()) { + CHECK_CUDA(idx); + CHECK_CUDA(weight); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + three_interpolate_kernel_wrapper( + points.size(0), points.size(1), points.size(2), idx.size(1), + points.data_ptr(), idx.data_ptr(), weight.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} +at::Tensor three_interpolate_grad(at::Tensor grad_out, at::Tensor idx, + at::Tensor weight, const int m) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_CONTIGUOUS(weight); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + CHECK_IS_FLOAT(weight); + + if (grad_out.is_cuda()) { + CHECK_CUDA(idx); + CHECK_CUDA(weight); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), m}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.is_cuda()) { + three_interpolate_grad_kernel_wrapper( + grad_out.size(0), grad_out.size(1), grad_out.size(2), m, + grad_out.data_ptr(), idx.data_ptr(), + weight.data_ptr(), output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/interpolate_gpu.cu b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/interpolate_gpu.cu new file mode 100644 index 0000000..81c5548 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/interpolate_gpu.cu @@ -0,0 +1,154 @@ +#include +#include +#include + +#include "cuda_utils.h" + +// input: unknown(b, n, 3) known(b, m, 3) +// output: dist2(b, n, 3), idx(b, n, 3) +__global__ void three_nn_kernel(int b, int n, int m, + const float *__restrict__ unknown, + const float *__restrict__ known, + float *__restrict__ dist2, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + unknown += batch_index * n * 3; + known += batch_index * m * 3; + dist2 += batch_index * n * 3; + idx += batch_index * n * 3; + + int index = threadIdx.x; + int stride = blockDim.x; + for (int j = index; j < n; j += stride) { + float ux = unknown[j * 3 + 0]; + float uy = unknown[j * 3 + 1]; + float uz = unknown[j * 3 + 2]; + + double best1 = 1e40, best2 = 1e40, best3 = 1e40; + int besti1 = 0, besti2 = 0, besti3 = 0; + for (int k = 0; k < m; ++k) { + float x = known[k * 3 + 0]; + float y = known[k * 3 + 1]; + float z = known[k * 3 + 2]; + float d = (ux - x) * (ux - x) + (uy - y) * (uy - y) + (uz - z) * (uz - z); + if (d < best1) { + best3 = best2; + besti3 = besti2; + best2 = best1; + besti2 = besti1; + best1 = d; + besti1 = k; + } else if (d < best2) { + best3 = best2; + besti3 = besti2; + best2 = d; + besti2 = k; + } else if (d < best3) { + best3 = d; + besti3 = k; + } + } + dist2[j * 3 + 0] = best1; + dist2[j * 3 + 1] = best2; + dist2[j * 3 + 2] = best3; + + idx[j * 3 + 0] = besti1; + idx[j * 3 + 1] = besti2; + idx[j * 3 + 2] = besti3; + } +} + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_nn_kernel<<>>(b, n, m, unknown, known, + dist2, idx); + + CUDA_CHECK_ERRORS(); +} + +// input: points(b, c, m), idx(b, n, 3), weight(b, n, 3) +// output: out(b, c, n) +__global__ void three_interpolate_kernel(int b, int c, int m, int n, + const float *__restrict__ points, + const int *__restrict__ idx, + const float *__restrict__ weight, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * m * c; + + idx += batch_index * n * 3; + weight += batch_index * n * 3; + + out += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + out[i] = points[l * m + i1] * w1 + points[l * m + i2] * w2 + + points[l * m + i3] * w3; + } +} + +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_interpolate_kernel<<>>( + b, c, m, n, points, idx, weight, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, n), idx(b, n, 3), weight(b, n, 3) +// output: grad_points(b, c, m) + +__global__ void three_interpolate_grad_kernel( + int b, int c, int n, int m, const float *__restrict__ grad_out, + const int *__restrict__ idx, const float *__restrict__ weight, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * n * c; + idx += batch_index * n * 3; + weight += batch_index * n * 3; + grad_points += batch_index * m * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + atomicAdd(grad_points + l * m + i1, grad_out[i] * w1); + atomicAdd(grad_points + l * m + i2, grad_out[i] * w2); + atomicAdd(grad_points + l * m + i3, grad_out[i] * w3); + } +} + +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_interpolate_grad_kernel<<>>( + b, c, n, m, grad_out, idx, weight, grad_points); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/sampling.cpp b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/sampling.cpp new file mode 100644 index 0000000..ddbdc11 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/sampling.cpp @@ -0,0 +1,87 @@ +#include "sampling.h" +#include "utils.h" + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out); +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points); + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs); + +at::Tensor gather_points(at::Tensor points, at::Tensor idx) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + + if (points.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + gather_points_kernel_wrapper(points.size(0), points.size(1), points.size(2), + idx.size(1), points.data_ptr(), + idx.data_ptr(), output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} + +at::Tensor gather_points_grad(at::Tensor grad_out, at::Tensor idx, + const int n) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + + if (grad_out.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), n}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.is_cuda()) { + gather_points_grad_kernel_wrapper(grad_out.size(0), grad_out.size(1), n, + idx.size(1), grad_out.data_ptr(), + idx.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} +at::Tensor furthest_point_sampling(at::Tensor points, const int nsamples) { + CHECK_CONTIGUOUS(points); + CHECK_IS_FLOAT(points); + + at::Tensor output = + torch::zeros({points.size(0), nsamples}, + at::device(points.device()).dtype(at::ScalarType::Int)); + + at::Tensor tmp = + torch::full({points.size(0), points.size(1)}, 1e10, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + furthest_point_sampling_kernel_wrapper( + points.size(0), points.size(1), nsamples, points.data_ptr(), + tmp.data_ptr(), output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/sampling_gpu.cu b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/sampling_gpu.cu new file mode 100644 index 0000000..fc573f0 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_ext-src/src/sampling_gpu.cu @@ -0,0 +1,229 @@ +#include +#include + +#include "cuda_utils.h" + +// input: points(b, c, n) idx(b, m) +// output: out(b, c, m) +__global__ void gather_points_kernel(int b, int c, int n, int m, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + out[(i * c + l) * m + j] = points[(i * c + l) * n + a]; + } + } + } +} + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out) { + gather_points_kernel<<>>(b, c, n, npoints, + points, idx, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, m) idx(b, m) +// output: grad_points(b, c, n) +__global__ void gather_points_grad_kernel(int b, int c, int n, int m, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + atomicAdd(grad_points + (i * c + l) * n + a, + grad_out[(i * c + l) * m + j]); + } + } + } +} + +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points) { + gather_points_grad_kernel<<>>( + b, c, n, npoints, grad_out, idx, grad_points); + + CUDA_CHECK_ERRORS(); +} + +__device__ void __update(float *__restrict__ dists, int *__restrict__ dists_i, + int idx1, int idx2) { + const float v1 = dists[idx1], v2 = dists[idx2]; + const int i1 = dists_i[idx1], i2 = dists_i[idx2]; + dists[idx1] = max(v1, v2); + dists_i[idx1] = v2 > v1 ? i2 : i1; +} + +// Input dataset: (b, n, 3), tmp: (b, n) +// Ouput idxs (b, m) +template +__global__ void furthest_point_sampling_kernel( + int b, int n, int m, const float *__restrict__ dataset, + float *__restrict__ temp, int *__restrict__ idxs) { + if (m <= 0) return; + __shared__ float dists[block_size]; + __shared__ int dists_i[block_size]; + + int batch_index = blockIdx.x; + dataset += batch_index * n * 3; + temp += batch_index * n; + idxs += batch_index * m; + + int tid = threadIdx.x; + const int stride = block_size; + + int old = 0; + if (threadIdx.x == 0) idxs[0] = old; + + __syncthreads(); + for (int j = 1; j < m; j++) { + int besti = 0; + float best = -1; + float x1 = dataset[old * 3 + 0]; + float y1 = dataset[old * 3 + 1]; + float z1 = dataset[old * 3 + 2]; + for (int k = tid; k < n; k += stride) { + float x2, y2, z2; + x2 = dataset[k * 3 + 0]; + y2 = dataset[k * 3 + 1]; + z2 = dataset[k * 3 + 2]; + float mag = (x2 * x2) + (y2 * y2) + (z2 * z2); + if (mag <= 1e-3) continue; + + float d = + (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1); + + float d2 = min(d, temp[k]); + temp[k] = d2; + besti = d2 > best ? k : besti; + best = d2 > best ? d2 : best; + } + dists[tid] = best; + dists_i[tid] = besti; + __syncthreads(); + + if (block_size >= 512) { + if (tid < 256) { + __update(dists, dists_i, tid, tid + 256); + } + __syncthreads(); + } + if (block_size >= 256) { + if (tid < 128) { + __update(dists, dists_i, tid, tid + 128); + } + __syncthreads(); + } + if (block_size >= 128) { + if (tid < 64) { + __update(dists, dists_i, tid, tid + 64); + } + __syncthreads(); + } + if (block_size >= 64) { + if (tid < 32) { + __update(dists, dists_i, tid, tid + 32); + } + __syncthreads(); + } + if (block_size >= 32) { + if (tid < 16) { + __update(dists, dists_i, tid, tid + 16); + } + __syncthreads(); + } + if (block_size >= 16) { + if (tid < 8) { + __update(dists, dists_i, tid, tid + 8); + } + __syncthreads(); + } + if (block_size >= 8) { + if (tid < 4) { + __update(dists, dists_i, tid, tid + 4); + } + __syncthreads(); + } + if (block_size >= 4) { + if (tid < 2) { + __update(dists, dists_i, tid, tid + 2); + } + __syncthreads(); + } + if (block_size >= 2) { + if (tid < 1) { + __update(dists, dists_i, tid, tid + 1); + } + __syncthreads(); + } + + old = dists_i[0]; + if (tid == 0) idxs[j] = old; + } +} + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs) { + unsigned int n_threads = opt_n_threads(n); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + switch (n_threads) { + case 512: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 256: + furthest_point_sampling_kernel<256> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 128: + furthest_point_sampling_kernel<128> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 64: + furthest_point_sampling_kernel<64> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 32: + furthest_point_sampling_kernel<32> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 16: + furthest_point_sampling_kernel<16> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 8: + furthest_point_sampling_kernel<8> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 4: + furthest_point_sampling_kernel<4> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 2: + furthest_point_sampling_kernel<2> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 1: + furthest_point_sampling_kernel<1> + <<>>(b, n, m, dataset, temp, idxs); + break; + default: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + } + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_version.py b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_version.py new file mode 100644 index 0000000..528787c --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/_version.py @@ -0,0 +1 @@ +__version__ = "3.0.0" diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/pointnet2_modules.py b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/pointnet2_modules.py new file mode 100644 index 0000000..a0ad4f6 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/pointnet2_modules.py @@ -0,0 +1,209 @@ +from typing import List, Optional, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from pointnet2_ops import pointnet2_utils + + +def build_shared_mlp(mlp_spec: List[int], bn: bool = True): + layers = [] + for i in range(1, len(mlp_spec)): + layers.append( + nn.Conv2d(mlp_spec[i - 1], mlp_spec[i], kernel_size=1, bias=not bn) + ) + if bn: + layers.append(nn.BatchNorm2d(mlp_spec[i])) + layers.append(nn.ReLU(True)) + + return nn.Sequential(*layers) + + +class _PointnetSAModuleBase(nn.Module): + def __init__(self): + super(_PointnetSAModuleBase, self).__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward( + self, xyz: torch.Tensor, features: Optional[torch.Tensor] + ) -> Tuple[torch.Tensor, torch.Tensor]: + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor of the xyz coordinates of the features + features : torch.Tensor + (B, C, N) tensor of the descriptors of the the features + + Returns + ------- + new_xyz : torch.Tensor + (B, npoint, 3) tensor of the new features' xyz + new_features : torch.Tensor + (B, \sum_k(mlps[k][-1]), npoint) tensor of the new_features descriptors + """ + + new_features_list = [] + + xyz_flipped = xyz.transpose(1, 2).contiguous() + new_xyz = ( + pointnet2_utils.gather_operation( + xyz_flipped, pointnet2_utils.furthest_point_sample(xyz, self.npoint) + ) + .transpose(1, 2) + .contiguous() + if self.npoint is not None + else None + ) + + for i in range(len(self.groupers)): + new_features = self.groupers[i]( + xyz, new_xyz, features + ) # (B, C, npoint, nsample) + + new_features = self.mlps[i](new_features) # (B, mlp[-1], npoint, nsample) + new_features = F.max_pool2d( + new_features, kernel_size=[1, new_features.size(3)] + ) # (B, mlp[-1], npoint, 1) + new_features = new_features.squeeze(-1) # (B, mlp[-1], npoint) + + new_features_list.append(new_features) + + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointnetSAModuleMSG(_PointnetSAModuleBase): + r"""Pointnet set abstrction layer with multiscale grouping + + Parameters + ---------- + npoint : int + Number of features + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet before the global max_pool for each scale + bn : bool + Use batchnorm + """ + + def __init__(self, npoint, radii, nsamples, mlps, bn=True, use_xyz=True): + # type: (PointnetSAModuleMSG, int, List[float], List[int], List[List[int]], bool, bool) -> None + super(PointnetSAModuleMSG, self).__init__() + + assert len(radii) == len(nsamples) == len(mlps) + + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + pointnet2_utils.QueryAndGroup(radius, nsample, use_xyz=use_xyz) + if npoint is not None + else pointnet2_utils.GroupAll(use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + + self.mlps.append(build_shared_mlp(mlp_spec, bn)) + + +class PointnetSAModule(PointnetSAModuleMSG): + r"""Pointnet set abstrction layer + + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet before the global max_pool + bn : bool + Use batchnorm + """ + + def __init__( + self, mlp, npoint=None, radius=None, nsample=None, bn=True, use_xyz=True + ): + # type: (PointnetSAModule, List[int], int, float, int, bool, bool) -> None + super(PointnetSAModule, self).__init__( + mlps=[mlp], + npoint=npoint, + radii=[radius], + nsamples=[nsample], + bn=bn, + use_xyz=use_xyz, + ) + + +class PointnetFPModule(nn.Module): + r"""Propigates the features of one set to another + + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + + def __init__(self, mlp, bn=True): + # type: (PointnetFPModule, List[int], bool) -> None + super(PointnetFPModule, self).__init__() + self.mlp = build_shared_mlp(mlp, bn=bn) + + def forward(self, unknown, known, unknow_feats, known_feats): + # type: (PointnetFPModule, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + if known is not None: + dist, idx = pointnet2_utils.three_nn(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + + interpolated_feats = pointnet2_utils.three_interpolate( + known_feats, idx, weight + ) + else: + interpolated_feats = known_feats.expand( + *(known_feats.size()[0:2] + [unknown.size(1)]) + ) + + if unknow_feats is not None: + new_features = torch.cat( + [interpolated_feats, unknow_feats], dim=1 + ) # (B, C2 + C1, n) + else: + new_features = interpolated_feats + + new_features = new_features.unsqueeze(-1) + new_features = self.mlp(new_features) + + return new_features.squeeze(-1) diff --git a/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/pointnet2_utils.py b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/pointnet2_utils.py new file mode 100644 index 0000000..150fccc --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/pointnet2_ops/pointnet2_utils.py @@ -0,0 +1,379 @@ +import torch +import torch.nn as nn +import warnings +from torch.autograd import Function +from typing import * + +try: + import pointnet2_ops._ext as _ext +except ImportError: + from torch.utils.cpp_extension import load + import glob + import os.path as osp + import os + + warnings.warn("Unable to load pointnet2_ops cpp extension. JIT Compiling.") + + _ext_src_root = osp.join(osp.dirname(__file__), "_ext-src") + _ext_sources = glob.glob(osp.join(_ext_src_root, "src", "*.cpp")) + glob.glob( + osp.join(_ext_src_root, "src", "*.cu") + ) + _ext_headers = glob.glob(osp.join(_ext_src_root, "include", "*")) + + os.environ["TORCH_CUDA_ARCH_LIST"] = "3.7+PTX;5.0;6.0;6.1;6.2;7.0;7.5" + _ext = load( + "_ext", + sources=_ext_sources, + extra_include_paths=[osp.join(_ext_src_root, "include")], + extra_cflags=["-O3"], + extra_cuda_cflags=["-O3", "-Xfatbin", "-compress-all"], + with_cuda=True, + ) + + +class FurthestPointSampling(Function): + @staticmethod + def forward(ctx, xyz, npoint): + # type: (Any, torch.Tensor, int) -> torch.Tensor + r""" + Uses iterative furthest point sampling to select a set of npoint features that have the largest + minimum distance + + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor where N > npoint + npoint : int32 + number of features in the sampled set + + Returns + ------- + torch.Tensor + (B, npoint) tensor containing the set + """ + out = _ext.furthest_point_sampling(xyz, npoint) + + ctx.mark_non_differentiable(out) + + return out + + @staticmethod + def backward(ctx, grad_out): + return () + + +furthest_point_sample = FurthestPointSampling.apply + + +class GatherOperation(Function): + @staticmethod + def forward(ctx, features, idx): + # type: (Any, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor + + idx : torch.Tensor + (B, npoint) tensor of the features to gather + + Returns + ------- + torch.Tensor + (B, C, npoint) tensor + """ + + ctx.save_for_backward(idx, features) + + return _ext.gather_points(features, idx) + + @staticmethod + def backward(ctx, grad_out): + idx, features = ctx.saved_tensors + N = features.size(2) + + grad_features = _ext.gather_points_grad(grad_out.contiguous(), idx, N) + return grad_features, None + + +gather_operation = GatherOperation.apply + + +class ThreeNN(Function): + @staticmethod + def forward(ctx, unknown, known): + # type: (Any, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + Find the three nearest neighbors of unknown in known + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of known features + known : torch.Tensor + (B, m, 3) tensor of unknown features + + Returns + ------- + dist : torch.Tensor + (B, n, 3) l2 distance to the three nearest neighbors + idx : torch.Tensor + (B, n, 3) index of 3 nearest neighbors + """ + dist2, idx = _ext.three_nn(unknown, known) + dist = torch.sqrt(dist2) + + ctx.mark_non_differentiable(dist, idx) + + return dist, idx + + @staticmethod + def backward(ctx, grad_dist, grad_idx): + return () + + +three_nn = ThreeNN.apply + + +class ThreeInterpolate(Function): + @staticmethod + def forward(ctx, features, idx, weight): + # type(Any, torch.Tensor, torch.Tensor, torch.Tensor) -> Torch.Tensor + r""" + Performs weight linear interpolation on 3 features + Parameters + ---------- + features : torch.Tensor + (B, c, m) Features descriptors to be interpolated from + idx : torch.Tensor + (B, n, 3) three nearest neighbors of the target features in features + weight : torch.Tensor + (B, n, 3) weights + + Returns + ------- + torch.Tensor + (B, c, n) tensor of the interpolated features + """ + ctx.save_for_backward(idx, weight, features) + + return _ext.three_interpolate(features, idx, weight) + + @staticmethod + def backward(ctx, grad_out): + # type: (Any, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor] + r""" + Parameters + ---------- + grad_out : torch.Tensor + (B, c, n) tensor with gradients of ouputs + + Returns + ------- + grad_features : torch.Tensor + (B, c, m) tensor with gradients of features + + None + + None + """ + idx, weight, features = ctx.saved_tensors + m = features.size(2) + + grad_features = _ext.three_interpolate_grad( + grad_out.contiguous(), idx, weight, m + ) + + return grad_features, torch.zeros_like(idx), torch.zeros_like(weight) + + +three_interpolate = ThreeInterpolate.apply + + +class GroupingOperation(Function): + @staticmethod + def forward(ctx, features, idx): + # type: (Any, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor of features to group + idx : torch.Tensor + (B, npoint, nsample) tensor containing the indicies of features to group with + + Returns + ------- + torch.Tensor + (B, C, npoint, nsample) tensor + """ + ctx.save_for_backward(idx, features) + + return _ext.group_points(features, idx) + + @staticmethod + def backward(ctx, grad_out): + # type: (Any, torch.tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + + Parameters + ---------- + grad_out : torch.Tensor + (B, C, npoint, nsample) tensor of the gradients of the output from forward + + Returns + ------- + torch.Tensor + (B, C, N) gradient of the features + None + """ + idx, features = ctx.saved_tensors + N = features.size(2) + + grad_features = _ext.group_points_grad(grad_out.contiguous(), idx, N) + + return grad_features, torch.zeros_like(idx) + + +grouping_operation = GroupingOperation.apply + + +class BallQuery(Function): + @staticmethod + def forward(ctx, radius, nsample, xyz, new_xyz): + # type: (Any, float, int, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + radius : float + radius of the balls + nsample : int + maximum number of features in the balls + xyz : torch.Tensor + (B, N, 3) xyz coordinates of the features + new_xyz : torch.Tensor + (B, npoint, 3) centers of the ball query + + Returns + ------- + torch.Tensor + (B, npoint, nsample) tensor with the indicies of the features that form the query balls + """ + output = _ext.ball_query(new_xyz, xyz, radius, nsample) + + ctx.mark_non_differentiable(output) + + return output + + @staticmethod + def backward(ctx, grad_out): + return () + + +ball_query = BallQuery.apply + + +class QueryAndGroup(nn.Module): + r""" + Groups with a ball query of radius + + Parameters + --------- + radius : float32 + Radius of ball + nsample : int32 + Maximum number of features to gather in the ball + """ + + def __init__(self, radius, nsample, use_xyz=True): + # type: (QueryAndGroup, float, int, bool) -> None + super(QueryAndGroup, self).__init__() + self.radius, self.nsample, self.use_xyz = radius, nsample, use_xyz + + def forward(self, xyz, new_xyz, features=None): + # type: (QueryAndGroup, torch.Tensor. torch.Tensor, torch.Tensor) -> Tuple[Torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + centriods (B, npoint, 3) + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, 3 + C, npoint, nsample) tensor + """ + + idx = ball_query(self.radius, self.nsample, xyz, new_xyz) + xyz_trans = xyz.transpose(1, 2).contiguous() + grouped_xyz = grouping_operation(xyz_trans, idx) # (B, 3, npoint, nsample) + grouped_xyz -= new_xyz.transpose(1, 2).unsqueeze(-1) + + if features is not None: + grouped_features = grouping_operation(features, idx) + if self.use_xyz: + new_features = torch.cat( + [grouped_xyz, grouped_features], dim=1 + ) # (B, C + 3, npoint, nsample) + else: + new_features = grouped_features + else: + assert ( + self.use_xyz + ), "Cannot have not features and not use xyz as a feature!" + new_features = grouped_xyz + + return new_features + + +class GroupAll(nn.Module): + r""" + Groups all features + + Parameters + --------- + """ + + def __init__(self, use_xyz=True): + # type: (GroupAll, bool) -> None + super(GroupAll, self).__init__() + self.use_xyz = use_xyz + + def forward(self, xyz, new_xyz, features=None): + # type: (GroupAll, torch.Tensor, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + Ignored + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, C + 3, 1, N) tensor + """ + + grouped_xyz = xyz.transpose(1, 2).unsqueeze(2) + if features is not None: + grouped_features = features.unsqueeze(2) + if self.use_xyz: + new_features = torch.cat( + [grouped_xyz, grouped_features], dim=1 + ) # (B, 3 + C, 1, N) + else: + new_features = grouped_features + else: + new_features = grouped_xyz + + return new_features diff --git a/zoo/PCT/pointnet2_ops_lib/setup.py b/zoo/PCT/pointnet2_ops_lib/setup.py new file mode 100644 index 0000000..faf7154 --- /dev/null +++ b/zoo/PCT/pointnet2_ops_lib/setup.py @@ -0,0 +1,39 @@ +import glob +import os +import os.path as osp + +from setuptools import find_packages, setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + +this_dir = osp.dirname(osp.abspath(__file__)) +_ext_src_root = osp.join("pointnet2_ops", "_ext-src") +_ext_sources = glob.glob(osp.join(_ext_src_root, "src", "*.cpp")) + glob.glob( + osp.join(_ext_src_root, "src", "*.cu") +) +_ext_headers = glob.glob(osp.join(_ext_src_root, "include", "*")) + +requirements = ["torch>=1.4"] + +exec(open(osp.join("pointnet2_ops", "_version.py")).read()) + +os.environ["TORCH_CUDA_ARCH_LIST"] = "3.7+PTX;5.0;6.0;6.1;6.2;7.0;7.5" +setup( + name="pointnet2_ops", + version=__version__, + author="Erik Wijmans", + packages=find_packages(), + install_requires=requirements, + ext_modules=[ + CUDAExtension( + name="pointnet2_ops._ext", + sources=_ext_sources, + extra_compile_args={ + "cxx": ["-O3"], + "nvcc": ["-O3", "-Xfatbin", "-compress-all"], + }, + include_dirs=[osp.join(this_dir, _ext_src_root, "include")], + ) + ], + cmdclass={"build_ext": BuildExtension}, + include_package_data=True, +) diff --git a/zoo/PCT/rsmix_provider.py b/zoo/PCT/rsmix_provider.py new file mode 100644 index 0000000..1e0091b --- /dev/null +++ b/zoo/PCT/rsmix_provider.py @@ -0,0 +1,208 @@ + +import os +import sys +import numpy as np +import h5py +# import tensorflow as tf +import random + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def knn_points(k, xyz, query, nsample=512): + B, N, C = xyz.shape + _, S, _ = query.shape # S=1 + + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + sqrdists = square_distance(query, xyz) # Bx1,N #제곱거리 + tmp = np.sort(sqrdists, axis=2) + knn_dist = np.zeros((B,1)) + for i in range(B): + knn_dist[i][0] = tmp[i][0][k] + group_idx[i][sqrdists[i]>knn_dist[i][0]]=N + # group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def cut_points_knn(data_batch, idx, radius, nsample=512, k=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = knn_points(k=k, xyz=data_batch[:,:,:3], query=query_points[:,:,:3], nsample=nsample) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512, KNN=False): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + if KNN: + knn_para = min(int(np.ceil(cut_rad*n_sample)),n_sample) + pts_erase_idx, query_point_1 = cut_points_knn(data_batch, rand_idx_1, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points_knn(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_2 x 3(or 6) + else: + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed, lam, label_a, label_b + diff --git a/zoo/PCT/test.sh b/zoo/PCT/test.sh new file mode 100644 index 0000000..aca5350 --- /dev/null +++ b/zoo/PCT/test.sh @@ -0,0 +1 @@ +python main.py --exp_name=test --num_points=1024 --use_sgd=True --eval=True --model_path=checkpoints/best/models/model.t7 --test_batch_size 8 diff --git a/zoo/PCT/train.sh b/zoo/PCT/train.sh new file mode 100644 index 0000000..84fb90a --- /dev/null +++ b/zoo/PCT/train.sh @@ -0,0 +1 @@ +CUDA_VISIBLE_DEVICES=0 python3.7 main.py --exp_name=train --num_points=1024 --use_sgd=True --batch_size 32 --epochs 250 --lr 0.0001 diff --git a/zoo/PCT/util.py b/zoo/PCT/util.py new file mode 100644 index 0000000..55790f6 --- /dev/null +++ b/zoo/PCT/util.py @@ -0,0 +1,139 @@ +import torch +import torch.nn.functional as F +from pointnet2.utils import pointnet2_utils + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + dist += torch.sum(src ** 2, -1).view(B, N, 1) + dist += torch.sum(dst ** 2, -1).view(B, 1, M) + return dist + +def index_points(points, idx): + """ + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S] + Return: + new_points:, indexed points data, [B, S, C] + """ + device = points.device + B = points.shape[0] + view_shape = list(idx.shape) + view_shape[1:] = [1] * (len(view_shape) - 1) + repeat_shape = list(idx.shape) + repeat_shape[0] = 1 + batch_indices = torch.arange(B, dtype=torch.long).to(device).view(view_shape).repeat(repeat_shape) + new_points = points[batch_indices, idx, :] + return new_points + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def knn_point(nsample, xyz, new_xyz): + """ + Input: + nsample: max sample number in local region + xyz: all points, [B, N, C] + new_xyz: query points, [B, S, C] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + sqrdists = square_distance(new_xyz, xyz) + _, group_idx = torch.topk(sqrdists, nsample, dim = -1, largest=False, sorted=False) + return group_idx + +def sample_and_group(npoint, radius, nsample, xyz, points): + """ + Input: + npoint: + radius: + nsample: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, npoint, nsample, 3] + new_points: sampled points data, [B, npoint, nsample, 3+D] + """ + B, N, C = xyz.shape + S = npoint + xyz = xyz.contiguous() + + fps_idx = pointnet2_utils.furthest_point_sample(xyz, npoint).long() # [B, npoint] + new_xyz = index_points(xyz, fps_idx) + new_points = index_points(points, fps_idx) + # new_xyz = xyz[:] + # new_points = points[:] + + idx = knn_point(nsample, xyz, new_xyz) + #idx = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = index_points(xyz, idx) # [B, npoint, nsample, C] + grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C) + grouped_points = index_points(points, idx) + grouped_points_norm = grouped_points - new_points.view(B, S, 1, -1) + new_points = torch.cat([grouped_points_norm, new_points.view(B, S, 1, -1).repeat(1, 1, nsample, 1)], dim=-1) + return new_xyz, new_points \ No newline at end of file diff --git a/zoo/PCT/util_lib/GDANet_util.py b/zoo/PCT/util_lib/GDANet_util.py new file mode 100755 index 0000000..5b8688e --- /dev/null +++ b/zoo/PCT/util_lib/GDANet_util.py @@ -0,0 +1,212 @@ +import torch +from torch import nn + + +def knn(x, k): + inner = -2*torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx, pairwise_distance + + +def local_operator(x, k): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + idx, _ = knn(x, k=k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor-x, neighbor), dim=3).permute(0, 3, 1, 2) # local and global all in + + return feature + + +def local_operator_withnorm(x, norm_plt, k): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + norm_plt = norm_plt.view(batch_size, -1, num_points) + idx, _ = knn(x, k=k) # (batch_size, num_points, k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + norm_plt = norm_plt.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + neighbor_norm = norm_plt.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + neighbor_norm = neighbor_norm.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor-x, neighbor, neighbor_norm), dim=3).permute(0, 3, 1, 2) # 3c + + return feature + + +def GDM(x, M): + """ + Geometry-Disentangle Module + M: number of disentangled points in both sharp and gentle variation components + """ + k = 64 # number of neighbors to decide the range of j in Eq.(5) + tau = 0.2 # threshold in Eq.(2) + sigma = 2 # parameters of f (Gaussian function in Eq.(2)) + ############### + """Graph Construction:""" + device = torch.device('cuda') + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + idx, p = knn(x, k=k) # p: -[(x1-x2)^2+...] + + # here we add a tau + p1 = torch.abs(p) + p1 = torch.sqrt(p1) + mask = p1 < tau + + # here we add a sigma + p = p / (sigma * sigma) + w = torch.exp(p) # b,n,n + w = torch.mul(mask.float(), w) + + b = 1/torch.sum(w, dim=1) + b = b.reshape(batch_size, num_points, 1).repeat(1, 1, num_points) + c = torch.eye(num_points, num_points, device=device) + c = c.expand(batch_size, num_points, num_points) + D = b * c # b,n,n + + A = torch.matmul(D, w) # normalized adjacency matrix A_hat + + # Get Aij in a local area: + idx2 = idx.view(batch_size * num_points, -1) + idx_base2 = torch.arange(0, batch_size * num_points, device=device).view(-1, 1) * num_points + idx2 = idx2 + idx_base2 + + idx2 = idx2.reshape(batch_size * num_points, k)[:, 1:k] + idx2 = idx2.reshape(batch_size * num_points * (k - 1)) + idx2 = idx2.view(-1) + + A = A.view(-1) + A = A[idx2].reshape(batch_size, num_points, k - 1) # Aij: b,n,k + ############### + """Disentangling Point Clouds into Sharp(xs) and Gentle(xg) Variation Components:""" + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.reshape(batch_size * num_points, k)[:, 1:k] + idx = idx.reshape(batch_size * num_points * (k - 1)) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() # b,n,c + neighbor = x.view(batch_size * num_points, -1)[idx, :] + neighbor = neighbor.view(batch_size, num_points, k - 1, num_dims) # b,n,k,c + A = A.reshape(batch_size, num_points, k - 1, 1) # b,n,k,1 + n = A.mul(neighbor) # b,n,k,c + n = torch.sum(n, dim=2) # b,n,c + + pai = torch.norm(x - n, dim=-1).pow(2) # Eq.(5) + pais = pai.topk(k=M, dim=-1)[1] # first M points as the sharp variation component + paig = (-pai).topk(k=M, dim=-1)[1] # last M points as the gentle variation component + + pai_base = torch.arange(0, batch_size, device=device).view(-1, 1) * num_points + indices = (pais + pai_base).view(-1) + indiceg = (paig + pai_base).view(-1) + + xs = x.view(batch_size * num_points, -1)[indices, :] + xg = x.view(batch_size * num_points, -1)[indiceg, :] + + xs = xs.view(batch_size, M, -1) # b,M,c + xg = xg.view(batch_size, M, -1) # b,M,c + + return xs, xg + + +class SGCAM(nn.Module): + """Sharp-Gentle Complementary Attention Module:""" + def __init__(self, in_channels, inter_channels=None, bn_layer=True): + super(SGCAM, self).__init__() + + self.in_channels = in_channels + self.inter_channels = inter_channels + + if self.inter_channels is None: + self.inter_channels = in_channels // 2 + if self.inter_channels == 0: + self.inter_channels = 1 + + conv_nd = nn.Conv1d + bn = nn.BatchNorm1d + + self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, + kernel_size=1, stride=1, padding=0) + + if bn_layer: + self.W = nn.Sequential( + conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, + kernel_size=1, stride=1, padding=0), + bn(self.in_channels) + ) + nn.init.constant(self.W[1].weight, 0) + nn.init.constant(self.W[1].bias, 0) + else: + self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, + kernel_size=1, stride=1, padding=0) + nn.init.constant(self.W.weight, 0) + nn.init.constant(self.W.bias, 0) + + self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, + kernel_size=1, stride=1, padding=0) + + self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, + kernel_size=1, stride=1, padding=0) + + def forward(self, x, x_2): + batch_size = x.size(0) + + g_x = self.g(x_2).view(batch_size, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + theta_x = self.theta(x).view(batch_size, self.inter_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + phi_x = self.phi(x_2).view(batch_size, self.inter_channels, -1) + W = torch.matmul(theta_x, phi_x) # Attention Matrix + N = W.size(-1) + W_div_C = W / N + + y = torch.matmul(W_div_C, g_x) + y = y.permute(0, 2, 1).contiguous() + y = y.view(batch_size, self.inter_channels, *x.size()[2:]) + W_y = self.W(y) + y = W_y + x + + return y + diff --git a/zoo/PCT/util_lib/__init__.py b/zoo/PCT/util_lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PCT/util_lib/data_util.py b/zoo/PCT/util_lib/data_util.py new file mode 100755 index 0000000..d7c01e7 --- /dev/null +++ b/zoo/PCT/util_lib/data_util.py @@ -0,0 +1,167 @@ +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset +import os +import json + + +def load_data(partition, corruption_type, level): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, '../data') + all_data = [] + all_label = [] + if corruption_type in ['clean', 'composite']: + h5_name = os.path.join(DATA_DIR, 'modelnet40_c', '{}.h5'.format(corruption_type)) + else: + h5_name = os.path.join(DATA_DIR, 'modelnet40_c', '{}_{}.h5'.format(corruption_type, level)) + f = h5py.File(h5_name) + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +# =========== ModelNet40 ================= +class ModelNet40(Dataset): + def __init__(self, args, corruption_type, level, partition='train'): + self.data, self.label = load_data(partition, corruption_type, level) + self.num_points = args.num_points + self.partition = partition + + def __getitem__(self, item): + # pointcloud = self.data[item][:self.num_points] #(1024,3) + pointcloud = self.data[item] # (1024,3) + label = self.label[item] + if self.partition == 'train': + np.random.shuffle(pointcloud) + pointcloud = translate_pointcloud(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + + +# =========== ShapeNet Part ================= +class PartNormalDataset(Dataset): + def __init__(self, npoints=2500, split='train', normalize=False): + self.npoints = npoints + self.root = './data/shapenetcore_partanno_segmentation_benchmark_v0_normal' + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.normalize = normalize + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k: v for k, v in self.cat.items()} + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + + if split == 'trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split == 'train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split == 'val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split == 'test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..' % (split)) + exit(-1) + + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + def __getitem__(self, index): + if index in self.cache: + point_set, normal, seg, cls = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + point_set = data[:, 0:3] + normal = data[:, 3:6] + seg = data[:, -1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, normal, seg, cls) + + if self.normalize: + point_set = pc_normalize(point_set) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + + # resample + # note that the number of points in some points clouds is less than 2048, thus use random.choice + # remember to use the same seed during train and test for a getting stable result + point_set = point_set[choice, :] + seg = seg[choice] + normal = normal[choice, :] + + return point_set, cls, seg, normal + + def __len__(self): + return len(self.datapath) + + +if __name__ == '__main__': + train = ModelNet40(1024) + test = ModelNet40(1024, 'test') + for data, label in train: + print(data.shape) + print(label.shape) diff --git a/zoo/PCT/util_lib/util.py b/zoo/PCT/util_lib/util.py new file mode 100755 index 0000000..00afdd8 --- /dev/null +++ b/zoo/PCT/util_lib/util.py @@ -0,0 +1,69 @@ +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) # gold is the groudtruth label in the dataloader + + if smoothing: + eps = 0.2 + n_class = pred.size(1) # the number of feature_dim of the ouput, which is output channels + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +# create a file and write the text into it: +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda(non_blocking=True) + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] diff --git a/zoo/PointBERT/DATASET.md b/zoo/PointBERT/DATASET.md new file mode 100644 index 0000000..7ffa3f1 --- /dev/null +++ b/zoo/PointBERT/DATASET.md @@ -0,0 +1,80 @@ +## Dataset +The overall directory structure should be: + +``` +β”‚Point-BERT/ +β”œβ”€β”€cfgs/ +β”œβ”€β”€datasets/ +β”œβ”€β”€data/ +β”‚ β”œβ”€β”€ModelNet/ +β”‚ β”œβ”€β”€ModelNetFewshot/ +β”‚ β”œβ”€β”€ScanObjectNN/ +β”‚ β”œβ”€β”€ShapeNet55-34/ +β”‚ β”œβ”€β”€shapenetcore_partanno_segmentation_benchmark_v0_normal/ +β”œβ”€β”€....... +``` +**ModelNet Dataset:** You can download the processed ModelNet data from [[Google Drive]](https://drive.google.com/drive/folders/1fAx8Jquh5ES92g1zm2WG6_ozgkwgHhUq?usp=sharing)[[Tsinghua Cloud]](https://cloud.tsinghua.edu.cn/d/4808a242b60c4c1f9bed/)[[BaiDuYun]](https://pan.baidu.com/s/18XL4_HWMlAS_5DUH-T6CjA )(code:4u1e) and save it in `data/ModelNet/modelnet40_normal_resampled/`. (You can download the offical ModelNet from [here](https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip), and process it by yourself.) Finally, the directory structure should be: +``` +β”‚ModelNet/ +β”œβ”€β”€modelnet40_normal_resampled/ +β”‚ β”œβ”€β”€ modelnet40_shape_names.txt +β”‚ β”œβ”€β”€ modelnet40_train.txt +β”‚ β”œβ”€β”€ modelnet40_test.txt +β”‚ β”œβ”€β”€ modelnet40_train_8192pts_fps.dat +β”‚ β”œβ”€β”€ modelnet40_test_8192pts_fps.dat +``` + +**ModelNet Few-shot Dataset:** We follow the previous work to split the original ModelNet40 into pairs of support set and query set. The split used in our experiments is public in [[Google Drive]](https://drive.google.com/drive/folders/1gqvidcQsvdxP_3MdUr424Vkyjb_gt7TW?usp=sharing)/[[Tsinghua Cloud]](https://cloud.tsinghua.edu.cn/d/d4aac5b8f02749e3bdaa/)/[[BaiDuYun]](https://pan.baidu.com/s/1s-Dn1s8cYpeaFVpd1jslzg)(code:bjbq). Download the split file and put it into `data/ModelNetFewshot`, then the structure should be: + +``` +β”‚ModelNetFewshot/ +β”œβ”€β”€5way10shot/ +β”‚ β”œβ”€β”€ 0.pkl +β”‚ β”œβ”€β”€ ... +β”‚ β”œβ”€β”€ 9.pkl +β”œβ”€β”€5way20shot/ +β”‚ β”œβ”€β”€ ... +β”œβ”€β”€10way10shot/ +β”‚ β”œβ”€β”€ ... +β”œβ”€β”€10way20shot/ +β”‚ β”œβ”€β”€ ... +``` + +**ShapeNet55/34 Dataset:** You can download the processed ShapeNet55/34 dataset at [[BaiduCloud](https://pan.baidu.com/s/16Q-GsEXEHkXRhmcSZTY86A)] (code:le04) or [[Google Drive](https://drive.google.com/file/d/1jUB5yD7DP97-EqqU2A9mmr61JpNwZBVK/view?usp=sharing)]. Unzip the file under `ShapeNet55-34/`. The directory structure should be + +``` +β”‚ShapeNet55-34/ +β”œβ”€β”€shapenet_pc/ +β”‚ β”œβ”€β”€ 02691156-1a04e3eab45ca15dd86060f189eb133.npy +β”‚ β”œβ”€β”€ 02691156-1a6ad7a24bb89733f412783097373bdc.npy +β”‚ β”œβ”€β”€ ....... +β”œβ”€β”€ShapeNet-35/ +β”‚ β”œβ”€β”€ train.txt +β”‚ └── test.txt +``` + +**ScanObjectNN Dataset:** Download the offical data from [here](http://103.24.77.34/scanobjectnn) and unzip it into `data/ScanObjectNN`. The directory structure should be: +``` +β”‚ScanObjectNN/ +β”œβ”€β”€main_split/ +β”‚ β”œβ”€β”€ training_objectdataset_augmentedrot_scale75.h5 +β”‚ β”œβ”€β”€ test_objectdataset_augmentedrot_scale75.h5 +β”‚ β”œβ”€β”€ training_objectdataset.h5 +β”‚ β”œβ”€β”€ test_objectdataset.h5 +β”œβ”€β”€main_split_nobg/ +β”‚ β”œβ”€β”€ training_objectdataset.h5 +β”‚ β”œβ”€β”€ test_objectdataset.h5 +``` + + +**ShapeNetPart Dataset:** Download the offical data from [here](https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip). Unzip the file under `data/shapenetcore_partanno_segmentation_benchmark_v0_normal/`. The directory structure should be + +``` +|shapenetcore_partanno_segmentation_benchmark_v0_normal/ +β”œβ”€β”€02691156/ +β”‚ β”œβ”€β”€ 1a04e3eab45ca15dd86060f189eb133.txt +β”‚ β”œβ”€β”€ ....... +│── ....... +│──train_test_split/ +│──synsetoffset2category.txt +``` \ No newline at end of file diff --git a/zoo/PointBERT/README.md b/zoo/PointBERT/README.md new file mode 100644 index 0000000..6abc74a --- /dev/null +++ b/zoo/PointBERT/README.md @@ -0,0 +1,206 @@ +# Point-BERT: Pre-Training 3D Point Cloud Transformers with Masked Point Modeling + +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/point-bert-pre-training-3d-point-cloud/3d-point-cloud-classification-on-scanobjectnn)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-scanobjectnn?p=point-bert-pre-training-3d-point-cloud) + +Created by [Xumin Yu](https://yuxumin.github.io/)\*, [Lulu Tang](https://github.com/lulutang0608)\*, [Yongming Rao](https://raoyongming.github.io/)\*, [Tiejun Huang](http://www.ai.pku.edu.cn/info/1139/1243.htm), [Jie Zhou](https://scholar.google.com/citations?user=6a79aPwAAAAJ&hl=en&authuser=1), [Jiwen Lu](https://scholar.google.com/citations?user=TN8uDQoAAAAJ&hl=en&authuser=1) + +[[arXiv]](https://arxiv.org/abs/2111.14819) [[Project Page]](https://point-bert.ivg-research.xyz/) [[Models]](#pretrained-models) + +This repository contains PyTorch implementation for __Point-BERT:Pre-Training 3D Point Cloud Transformers with Masked Point Modeling__ (CVPR 2022). + +Point-BERT is a new paradigm for learning Transformers to generalize the concept of BERT onto 3D point cloud. Inspired by BERT, we devise a Masked Point Modeling (MPM) task to pre-train point cloud Transformers. Specifically, we first divide a point cloud into several local patches, and a point cloud Tokenizer is devised via a discrete Variational AutoEncoder (dVAE) to generate discrete point tokens containing meaningful local information. Then, we randomly mask some patches of input point clouds and feed them into the backbone Transformer. The pre-training objective is to recover the original point tokens at the masked locations under the supervision of point tokens obtained by the Tokenizer. + +![intro](fig/pointbert.png) + + + +## Pretrained Models + +|model| dataset | config | url| +| :---: | :---: | :---: | :---: | +| dVAE |ShapeNet | [config](cfgs/ShapeNet55_models/dvae.yaml)| [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/c76274f9afb34cdbb57e/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1tiO5nYmkQ8jesPNPVWrdYQ)(code:26d3) | +|Point-BERT| ShapeNet | [config](cfgs/Mixup_models/Point-BERT.yaml)| [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/202b29805eea45d7be92/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1O0_9MYVTGcPcbBccfXZuog)(code:jvtg) | + +|model| dataset | Acc. | Acc. (vote) | config | url| +| :---:| :---: | :---: | :---: | :---: | :---: | +| Transformer| ModelNet | 92.67 | 93.24 | [config](cfgs/ModelNet_models/PointTransformer.yaml) | [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/9be5d9dcbaeb48adb360/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1Ykb9UwOeZRDXGwYZpO_AAg )(code:tqow) | +| Transformer| ModelNet | 92.91 | 93.48 |[config](cfgs/ModelNet_models/PointTransformer_4096point.yaml) | [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/121b2651374e4ab1ade6/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1n2GIrOX93hpO5pgmV0Q1vw)(code:tcin) | +| Transformer| ModelNet | 93.19 |93.76 | [config](cfgs/ModelNet_models/PointTransformer_8192point.yaml) | [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/3ee8e437e07f4dc49738/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1o5DsEbPPA85dvuVuim8Y1Q)(code:k343) | +| Transformer| ScanObjectNN |88.12| -- |[config](cfgs/ScanObjectNN_models/PointTransformer_objectonly.yaml)| [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/60260a3cbd8940f5bf0d/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1ZH0mLlJKmtB22xUUALP-dQ)(code:f0km) | +| Transformer| ScanObjectNN |87.43| -- | [config](cfgs/ScanObjectNN_models/PointTransformer_objectbg.yaml) |[Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/c66c28c771e24cd588ad/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1nPiiDnV3qDmDqD17FW5rUg)(code:k3cb) | +| Transformer| ScanObjectNN |83.07| -- | [config](cfgs/ScanObjectNN_models/PointTransformer_hardest.yaml) |[Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/2edb5b2810dc4bd9b796/?dl=1) / [BaiDuYun](https://pan.baidu.com/s/1ehxb9QPB2nkKYJixEMZeuw)(code:rxsw) | + + +## Usage + +### Requirements + +- PyTorch >= 1.7.0 +- python >= 3.7 +- CUDA >= 9.0 +- GCC >= 4.9 +- torchvision +- timm +- open3d +- tensorboardX + +``` +pip install -r requirements.txt +``` + +#### Building Pytorch Extensions for Chamfer Distance, PointNet++ and kNN + +*NOTE:* PyTorch >= 1.7 and GCC >= 4.9 are required. + +``` +# Chamfer Distance +bash install.sh +# PointNet++ +pip install "git+git://github.com/erikwijmans/Pointnet2_PyTorch.git#egg=pointnet2_ops&subdirectory=pointnet2_ops_lib" +# GPU kNN +pip install --upgrade https://github.com/unlimblue/KNN_CUDA/releases/download/0.2/KNN_CUDA-0.2-py3-none-any.whl +``` + +### Dataset + +We use **ShapeNet** for the training of dVAE and the pre-training of Point-BERT models. And finetuning the Point-BERT models on **ModelNet**, **ScanObjectNN**, **ShapeNetPart** + +The details of used datasets can be found in [DATASET.md](./DATASET.md). + + +### dVAE +To train a dVAE by yourself, simply run: +``` +bash scripts/train.sh \ + --config cfgs/ShapeNet55_models/dvae.yaml \ + --exp_name +``` + +Visualize the reconstruction results of a pre-trained dVAE, run: (default path: `./vis`) +``` +bash ./scripts/test.sh \ + --ckpts \ + --config cfgs/ShapeNet55_models/dvae.yaml\ + --exp_name +``` + +### Point-BERT pre-training +To pre-train the Point-BERT models on ShapeNet, simply run: +(complete the `ckpt` in `cfgs/Mixup_models/Point-BERT.yaml` first ) +``` +bash ./scripts/dist_train_BERT.sh \ + --config cfgs/Mixup_models/Point-BERT.yaml \ + --exp_name pointBERT_pretrain + [--val_freq 10] +``` +*val_freq* controls the frequence to evaluate the Transformer on ModelNet40 with LinearSVM. + +### Fine-tuning on downstream tasks +We finetune our Point-BERT on 4 downstream tasks: Classfication on ModelNet40, Few-shot learning on ModelNet40, Transfer learning on ScanObjectNN and Part segmentation on ShapeNetPart. + +#### ModelNet40 +To finetune a pre-trained Point-BERT model on ModelNet40, simply run: +``` +# 1024 points +bash ./scripts/train_BERT.sh \ + --config cfgs/ModelNet_models/PointTransformer.yaml\ + --finetune_model\ + --ckpts \ + --exp_name +# 4096 points +bash ./scripts/train_BERT.sh \ + --config cfgs/ModelNet_models/PointTransformer_4096point.yaml\ + --finetune_model\ + --ckpts \ + --exp_name +# 8192 points +bash ./scripts/train_BERT.sh \ + --config cfgs/ModelNet_models/PointTransformer_8192point.yaml\ + --finetune_model\ + --ckpts \ + --exp_name +``` + +To evaluate a model finetuned on ModelNet40, simply run: +``` +bash ./scripts/test_BERT.sh \ + --config cfgs/ModelNet_models/PointTransformer.yaml \ + --ckpts \ + --exp_name +``` + +#### Few-shot Learning on ModelNet40 +We follow the few-shot setting in the previous work. + +First, generate your own few-shot learning split or use the same split as us (see [DATASET.md](./DATASET.md)). +``` +# generate few-shot learning split +cd datasets/ +python generate_few_shot_data.py +# train and evaluate the Point-BERT +bash ./scripts/train_BERT.sh \ + --config cfgs/Fewshot_models/PointTransformer.yaml \ + --finetune_model \ + --ckpts \ + --exp_name \ + --way \ + --shot \ + --fold +``` + +#### ScanObjectNN +To finetune a pre-trained Point-BERT model on ScanObjectNN, simply run: +``` +bash ./scripts/train_BERT.sh \ + --config cfgs/ScanObjectNN_models/PointTransformer_hardest.yaml \ + --finetune_model \ + --ckpts \ + --exp_name +``` + +To evaluate a model on ScanObjectNN, simply run: +``` +bash ./scripts/test_BERT.sh \ + --config cfgs/ScanObjectNN_models/PointTransformer_hardest.yaml \ + --ckpts \ + --exp_name +``` + +#### Part Segmentation + +To finetune a pre-trained Point-BERT model on ShapeNetPart +``` +cd segmentation +python train_partseg.py \ + --model PointTransformer \ + --gpu \ + --pretrain_weight \ + --log_dir +``` +To evaluate a model on ShapeNetPart, simply run: +``` +python test_partseg.py \ + --gpu \ + --log_dir +``` + + +### Visualization +Masked point clouds reconstruction using our Point-BERT model trained on ShapeNet + +![results](fig/recon.png) + +## License +MIT License + +## Citation +If you find our work useful in your research, please consider citing: +``` +@inproceedings{yu2021pointbert, + title={Point-BERT: Pre-Training 3D Point Cloud Transformers with Masked Point Modeling}, + author={Yu, Xumin and Tang, Lulu and Rao, Yongming and Huang, Tiejun and Zhou, Jie and Lu, Jiwen}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2022} +} +``` diff --git a/zoo/PointBERT/cfgs/Fewshot_models/PointTransformer.yaml b/zoo/PointBERT/cfgs/Fewshot_models/PointTransformer.yaml new file mode 100644 index 0000000..5267273 --- /dev/null +++ b/zoo/PointBERT/cfgs/Fewshot_models/PointTransformer.yaml @@ -0,0 +1,41 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 150, + initial_epochs : 10 +}} + + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40FewShot.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40FewShot.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 256, +} +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 150 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/Mixup_models/Point-BERT.yaml b/zoo/PointBERT/cfgs/Mixup_models/Point-BERT.yaml new file mode 100644 index 0000000..e3ac124 --- /dev/null +++ b/zoo/PointBERT/cfgs/Mixup_models/Point-BERT.yaml @@ -0,0 +1,55 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 3 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'train', npoints: 1024, whole: True}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + extra_train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}} +model : { + NAME: Point_BERT, + m: 0.999, + T: 0.07, + K: 16384, + + transformer_config: { + mask_ratio: [0.25, 0.45], + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 512, + replace_pob: 0., + num_heads: 6, + moco_loss: False, + dvae_loss: True, + cutmix_loss: True, + return_all_tokens: False, + }, + dvae_config : { + group_size: 32, + num_group: 64, + encoder_dims: 256, + num_tokens: 8192, + tokens_dims: 256, + decoder_dims: 256, + ckpt: 'Need to be set' # set the dVAE weight here + }} + +total_bs : 128 +step_per_update : 1 +max_epoch : 300 + +consider_metric: CDL1 diff --git a/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer.yaml b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer.yaml new file mode 100644 index 0000000..8388011 --- /dev/null +++ b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 256, +} +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_2048point.yaml b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_2048point.yaml new file mode 100644 index 0000000..073e4d1 --- /dev/null +++ b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_2048point.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 128, + encoder_dims: 256, +} +npoints: 2048 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_4096point.yaml b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_4096point.yaml new file mode 100644 index 0000000..968777f --- /dev/null +++ b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_4096point.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 256, + encoder_dims: 256, +} +npoints: 4096 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_8192point.yaml b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_8192point.yaml new file mode 100644 index 0000000..baad081 --- /dev/null +++ b/zoo/PointBERT/cfgs/ModelNet_models/PointTransformer_8192point.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 512, + encoder_dims: 256, +} +npoints: 8192 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_hardest.yaml b/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_hardest.yaml new file mode 100644 index 0000000..982fb55 --- /dev/null +++ b/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_hardest.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ScanObjectNN_hardest.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ScanObjectNN_hardest.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ScanObjectNN_hardest.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 256, +} +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_objectbg.yaml b/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_objectbg.yaml new file mode 100644 index 0000000..26e8653 --- /dev/null +++ b/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_objectbg.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ScanObjectNN_objectbg.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ScanObjectNN_objectbg.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ScanObjectNN_objectbg.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 256, +} +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_objectonly.yaml b/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_objectonly.yaml new file mode 100644 index 0000000..c0d0724 --- /dev/null +++ b/zoo/PointBERT/cfgs/ScanObjectNN_models/PointTransformer_objectonly.yaml @@ -0,0 +1,40 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ScanObjectNN_objectonly.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ScanObjectNN_objectonly.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ScanObjectNN_objectonly.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 256, +} +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 + + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/ShapeNet55_models/dvae.yaml b/zoo/PointBERT/cfgs/ShapeNet55_models/dvae.yaml new file mode 100644 index 0000000..240f613 --- /dev/null +++ b/zoo/PointBERT/cfgs/ShapeNet55_models/dvae.yaml @@ -0,0 +1,48 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.0005 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10, + warming_up_init_lr: 0.00005 +}} +temp: { + start : 1, + target: 0.0625, + ntime: 100000 +} + +kldweight: { + start : 0, + target: 0.1, + ntime: 100000 +} + +dataset : { + train : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'train', npoints: 1024}}, + val : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'test', npoints: 1024}}, + test : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'test', npoints: 1024}}} +model : { + NAME: DiscreteVAE, + group_size: 32, + num_group: 64, + encoder_dims: 256, + num_tokens: 8192, + tokens_dims: 256, + decoder_dims: 256, +} + +total_bs : 64 +step_per_update : 1 +max_epoch : 300 + +consider_metric: CDL1 \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/dataset_configs/ModelNet40.yaml b/zoo/PointBERT/cfgs/dataset_configs/ModelNet40.yaml new file mode 100644 index 0000000..f5da9db --- /dev/null +++ b/zoo/PointBERT/cfgs/dataset_configs/ModelNet40.yaml @@ -0,0 +1,5 @@ +NAME: ModelNet +DATA_PATH: data/ModelNet/modelnet40_normal_resampled +N_POINTS: 8192 +NUM_CATEGORY: 40 +USE_NORMALS: FALSE \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/dataset_configs/ModelNet40FewShot.yaml b/zoo/PointBERT/cfgs/dataset_configs/ModelNet40FewShot.yaml new file mode 100644 index 0000000..479f215 --- /dev/null +++ b/zoo/PointBERT/cfgs/dataset_configs/ModelNet40FewShot.yaml @@ -0,0 +1,5 @@ +NAME: ModelNetFewShot +DATA_PATH: data/ModelNetFewshot +N_POINTS: 8192 +NUM_CATEGORY: 40 +USE_NORMALS: FALSE \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_hardest.yaml b/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_hardest.yaml new file mode 100644 index 0000000..c8ec020 --- /dev/null +++ b/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_hardest.yaml @@ -0,0 +1,2 @@ +NAME: ScanObjectNN_hardest +ROOT: data/ScanObjectNN/main_split \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_objectbg.yaml b/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_objectbg.yaml new file mode 100644 index 0000000..cbaa4b6 --- /dev/null +++ b/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_objectbg.yaml @@ -0,0 +1,2 @@ +NAME: ScanObjectNN +ROOT: data/ScanObjectNN/main_split \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_objectonly.yaml b/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_objectonly.yaml new file mode 100644 index 0000000..0d0f86c --- /dev/null +++ b/zoo/PointBERT/cfgs/dataset_configs/ScanObjectNN_objectonly.yaml @@ -0,0 +1,2 @@ +NAME: ScanObjectNN +ROOT: data/ScanObjectNN/main_split_nobg \ No newline at end of file diff --git a/zoo/PointBERT/cfgs/dataset_configs/ShapeNet-55.yaml b/zoo/PointBERT/cfgs/dataset_configs/ShapeNet-55.yaml new file mode 100644 index 0000000..8280425 --- /dev/null +++ b/zoo/PointBERT/cfgs/dataset_configs/ShapeNet-55.yaml @@ -0,0 +1,4 @@ +NAME: ShapeNet +DATA_PATH: data/ShapeNet55-34/ShapeNet-55 +N_POINTS: 8192 +PC_PATH: data/ShapeNet55-34/shapenet_pc diff --git a/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_shape_names.txt b/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_shape_names.txt new file mode 100644 index 0000000..1b2a397 --- /dev/null +++ b/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_shape_names.txt @@ -0,0 +1,40 @@ +airplane +bathtub +bed +bench +bookshelf +bottle +bowl +car +chair +cone +cup +curtain +desk +door +dresser +flower_pot +glass_box +guitar +keyboard +lamp +laptop +mantel +monitor +night_stand +person +piano +plant +radio +range_hood +sink +sofa +stairs +stool +table +tent +toilet +tv_stand +vase +wardrobe +xbox diff --git a/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_test.txt b/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_test.txt new file mode 100644 index 0000000..b0bc483 --- /dev/null +++ b/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_test.txt @@ -0,0 +1,2468 @@ +airplane_0627 +airplane_0628 +airplane_0629 +airplane_0630 +airplane_0631 +airplane_0632 +airplane_0633 +airplane_0634 +airplane_0635 +airplane_0636 +airplane_0637 +airplane_0638 +airplane_0639 +airplane_0640 +airplane_0641 +airplane_0642 +airplane_0643 +airplane_0644 +airplane_0645 +airplane_0646 +airplane_0647 +airplane_0648 +airplane_0649 +airplane_0650 +airplane_0651 +airplane_0652 +airplane_0653 +airplane_0654 +airplane_0655 +airplane_0656 +airplane_0657 +airplane_0658 +airplane_0659 +airplane_0660 +airplane_0661 +airplane_0662 +airplane_0663 +airplane_0664 +airplane_0665 +airplane_0666 +airplane_0667 +airplane_0668 +airplane_0669 +airplane_0670 +airplane_0671 +airplane_0672 +airplane_0673 +airplane_0674 +airplane_0675 +airplane_0676 +airplane_0677 +airplane_0678 +airplane_0679 +airplane_0680 +airplane_0681 +airplane_0682 +airplane_0683 +airplane_0684 +airplane_0685 +airplane_0686 +airplane_0687 +airplane_0688 +airplane_0689 +airplane_0690 +airplane_0691 +airplane_0692 +airplane_0693 +airplane_0694 +airplane_0695 +airplane_0696 +airplane_0697 +airplane_0698 +airplane_0699 +airplane_0700 +airplane_0701 +airplane_0702 +airplane_0703 +airplane_0704 +airplane_0705 +airplane_0706 +airplane_0707 +airplane_0708 +airplane_0709 +airplane_0710 +airplane_0711 +airplane_0712 +airplane_0713 +airplane_0714 +airplane_0715 +airplane_0716 +airplane_0717 +airplane_0718 +airplane_0719 +airplane_0720 +airplane_0721 +airplane_0722 +airplane_0723 +airplane_0724 +airplane_0725 +airplane_0726 +bathtub_0107 +bathtub_0108 +bathtub_0109 +bathtub_0110 +bathtub_0111 +bathtub_0112 +bathtub_0113 +bathtub_0114 +bathtub_0115 +bathtub_0116 +bathtub_0117 +bathtub_0118 +bathtub_0119 +bathtub_0120 +bathtub_0121 +bathtub_0122 +bathtub_0123 +bathtub_0124 +bathtub_0125 +bathtub_0126 +bathtub_0127 +bathtub_0128 +bathtub_0129 +bathtub_0130 +bathtub_0131 +bathtub_0132 +bathtub_0133 +bathtub_0134 +bathtub_0135 +bathtub_0136 +bathtub_0137 +bathtub_0138 +bathtub_0139 +bathtub_0140 +bathtub_0141 +bathtub_0142 +bathtub_0143 +bathtub_0144 +bathtub_0145 +bathtub_0146 +bathtub_0147 +bathtub_0148 +bathtub_0149 +bathtub_0150 +bathtub_0151 +bathtub_0152 +bathtub_0153 +bathtub_0154 +bathtub_0155 +bathtub_0156 +bed_0516 +bed_0517 +bed_0518 +bed_0519 +bed_0520 +bed_0521 +bed_0522 +bed_0523 +bed_0524 +bed_0525 +bed_0526 +bed_0527 +bed_0528 +bed_0529 +bed_0530 +bed_0531 +bed_0532 +bed_0533 +bed_0534 +bed_0535 +bed_0536 +bed_0537 +bed_0538 +bed_0539 +bed_0540 +bed_0541 +bed_0542 +bed_0543 +bed_0544 +bed_0545 +bed_0546 +bed_0547 +bed_0548 +bed_0549 +bed_0550 +bed_0551 +bed_0552 +bed_0553 +bed_0554 +bed_0555 +bed_0556 +bed_0557 +bed_0558 +bed_0559 +bed_0560 +bed_0561 +bed_0562 +bed_0563 +bed_0564 +bed_0565 +bed_0566 +bed_0567 +bed_0568 +bed_0569 +bed_0570 +bed_0571 +bed_0572 +bed_0573 +bed_0574 +bed_0575 +bed_0576 +bed_0577 +bed_0578 +bed_0579 +bed_0580 +bed_0581 +bed_0582 +bed_0583 +bed_0584 +bed_0585 +bed_0586 +bed_0587 +bed_0588 +bed_0589 +bed_0590 +bed_0591 +bed_0592 +bed_0593 +bed_0594 +bed_0595 +bed_0596 +bed_0597 +bed_0598 +bed_0599 +bed_0600 +bed_0601 +bed_0602 +bed_0603 +bed_0604 +bed_0605 +bed_0606 +bed_0607 +bed_0608 +bed_0609 +bed_0610 +bed_0611 +bed_0612 +bed_0613 +bed_0614 +bed_0615 +bench_0174 +bench_0175 +bench_0176 +bench_0177 +bench_0178 +bench_0179 +bench_0180 +bench_0181 +bench_0182 +bench_0183 +bench_0184 +bench_0185 +bench_0186 +bench_0187 +bench_0188 +bench_0189 +bench_0190 +bench_0191 +bench_0192 +bench_0193 +bookshelf_0573 +bookshelf_0574 +bookshelf_0575 +bookshelf_0576 +bookshelf_0577 +bookshelf_0578 +bookshelf_0579 +bookshelf_0580 +bookshelf_0581 +bookshelf_0582 +bookshelf_0583 +bookshelf_0584 +bookshelf_0585 +bookshelf_0586 +bookshelf_0587 +bookshelf_0588 +bookshelf_0589 +bookshelf_0590 +bookshelf_0591 +bookshelf_0592 +bookshelf_0593 +bookshelf_0594 +bookshelf_0595 +bookshelf_0596 +bookshelf_0597 +bookshelf_0598 +bookshelf_0599 +bookshelf_0600 +bookshelf_0601 +bookshelf_0602 +bookshelf_0603 +bookshelf_0604 +bookshelf_0605 +bookshelf_0606 +bookshelf_0607 +bookshelf_0608 +bookshelf_0609 +bookshelf_0610 +bookshelf_0611 +bookshelf_0612 +bookshelf_0613 +bookshelf_0614 +bookshelf_0615 +bookshelf_0616 +bookshelf_0617 +bookshelf_0618 +bookshelf_0619 +bookshelf_0620 +bookshelf_0621 +bookshelf_0622 +bookshelf_0623 +bookshelf_0624 +bookshelf_0625 +bookshelf_0626 +bookshelf_0627 +bookshelf_0628 +bookshelf_0629 +bookshelf_0630 +bookshelf_0631 +bookshelf_0632 +bookshelf_0633 +bookshelf_0634 +bookshelf_0635 +bookshelf_0636 +bookshelf_0637 +bookshelf_0638 +bookshelf_0639 +bookshelf_0640 +bookshelf_0641 +bookshelf_0642 +bookshelf_0643 +bookshelf_0644 +bookshelf_0645 +bookshelf_0646 +bookshelf_0647 +bookshelf_0648 +bookshelf_0649 +bookshelf_0650 +bookshelf_0651 +bookshelf_0652 +bookshelf_0653 +bookshelf_0654 +bookshelf_0655 +bookshelf_0656 +bookshelf_0657 +bookshelf_0658 +bookshelf_0659 +bookshelf_0660 +bookshelf_0661 +bookshelf_0662 +bookshelf_0663 +bookshelf_0664 +bookshelf_0665 +bookshelf_0666 +bookshelf_0667 +bookshelf_0668 +bookshelf_0669 +bookshelf_0670 +bookshelf_0671 +bookshelf_0672 +bottle_0336 +bottle_0337 +bottle_0338 +bottle_0339 +bottle_0340 +bottle_0341 +bottle_0342 +bottle_0343 +bottle_0344 +bottle_0345 +bottle_0346 +bottle_0347 +bottle_0348 +bottle_0349 +bottle_0350 +bottle_0351 +bottle_0352 +bottle_0353 +bottle_0354 +bottle_0355 +bottle_0356 +bottle_0357 +bottle_0358 +bottle_0359 +bottle_0360 +bottle_0361 +bottle_0362 +bottle_0363 +bottle_0364 +bottle_0365 +bottle_0366 +bottle_0367 +bottle_0368 +bottle_0369 +bottle_0370 +bottle_0371 +bottle_0372 +bottle_0373 +bottle_0374 +bottle_0375 +bottle_0376 +bottle_0377 +bottle_0378 +bottle_0379 +bottle_0380 +bottle_0381 +bottle_0382 +bottle_0383 +bottle_0384 +bottle_0385 +bottle_0386 +bottle_0387 +bottle_0388 +bottle_0389 +bottle_0390 +bottle_0391 +bottle_0392 +bottle_0393 +bottle_0394 +bottle_0395 +bottle_0396 +bottle_0397 +bottle_0398 +bottle_0399 +bottle_0400 +bottle_0401 +bottle_0402 +bottle_0403 +bottle_0404 +bottle_0405 +bottle_0406 +bottle_0407 +bottle_0408 +bottle_0409 +bottle_0410 +bottle_0411 +bottle_0412 +bottle_0413 +bottle_0414 +bottle_0415 +bottle_0416 +bottle_0417 +bottle_0418 +bottle_0419 +bottle_0420 +bottle_0421 +bottle_0422 +bottle_0423 +bottle_0424 +bottle_0425 +bottle_0426 +bottle_0427 +bottle_0428 +bottle_0429 +bottle_0430 +bottle_0431 +bottle_0432 +bottle_0433 +bottle_0434 +bottle_0435 +bowl_0065 +bowl_0066 +bowl_0067 +bowl_0068 +bowl_0069 +bowl_0070 +bowl_0071 +bowl_0072 +bowl_0073 +bowl_0074 +bowl_0075 +bowl_0076 +bowl_0077 +bowl_0078 +bowl_0079 +bowl_0080 +bowl_0081 +bowl_0082 +bowl_0083 +bowl_0084 +car_0198 +car_0199 +car_0200 +car_0201 +car_0202 +car_0203 +car_0204 +car_0205 +car_0206 +car_0207 +car_0208 +car_0209 +car_0210 +car_0211 +car_0212 +car_0213 +car_0214 +car_0215 +car_0216 +car_0217 +car_0218 +car_0219 +car_0220 +car_0221 +car_0222 +car_0223 +car_0224 +car_0225 +car_0226 +car_0227 +car_0228 +car_0229 +car_0230 +car_0231 +car_0232 +car_0233 +car_0234 +car_0235 +car_0236 +car_0237 +car_0238 +car_0239 +car_0240 +car_0241 +car_0242 +car_0243 +car_0244 +car_0245 +car_0246 +car_0247 +car_0248 +car_0249 +car_0250 +car_0251 +car_0252 +car_0253 +car_0254 +car_0255 +car_0256 +car_0257 +car_0258 +car_0259 +car_0260 +car_0261 +car_0262 +car_0263 +car_0264 +car_0265 +car_0266 +car_0267 +car_0268 +car_0269 +car_0270 +car_0271 +car_0272 +car_0273 +car_0274 +car_0275 +car_0276 +car_0277 +car_0278 +car_0279 +car_0280 +car_0281 +car_0282 +car_0283 +car_0284 +car_0285 +car_0286 +car_0287 +car_0288 +car_0289 +car_0290 +car_0291 +car_0292 +car_0293 +car_0294 +car_0295 +car_0296 +car_0297 +chair_0890 +chair_0891 +chair_0892 +chair_0893 +chair_0894 +chair_0895 +chair_0896 +chair_0897 +chair_0898 +chair_0899 +chair_0900 +chair_0901 +chair_0902 +chair_0903 +chair_0904 +chair_0905 +chair_0906 +chair_0907 +chair_0908 +chair_0909 +chair_0910 +chair_0911 +chair_0912 +chair_0913 +chair_0914 +chair_0915 +chair_0916 +chair_0917 +chair_0918 +chair_0919 +chair_0920 +chair_0921 +chair_0922 +chair_0923 +chair_0924 +chair_0925 +chair_0926 +chair_0927 +chair_0928 +chair_0929 +chair_0930 +chair_0931 +chair_0932 +chair_0933 +chair_0934 +chair_0935 +chair_0936 +chair_0937 +chair_0938 +chair_0939 +chair_0940 +chair_0941 +chair_0942 +chair_0943 +chair_0944 +chair_0945 +chair_0946 +chair_0947 +chair_0948 +chair_0949 +chair_0950 +chair_0951 +chair_0952 +chair_0953 +chair_0954 +chair_0955 +chair_0956 +chair_0957 +chair_0958 +chair_0959 +chair_0960 +chair_0961 +chair_0962 +chair_0963 +chair_0964 +chair_0965 +chair_0966 +chair_0967 +chair_0968 +chair_0969 +chair_0970 +chair_0971 +chair_0972 +chair_0973 +chair_0974 +chair_0975 +chair_0976 +chair_0977 +chair_0978 +chair_0979 +chair_0980 +chair_0981 +chair_0982 +chair_0983 +chair_0984 +chair_0985 +chair_0986 +chair_0987 +chair_0988 +chair_0989 +cone_0168 +cone_0169 +cone_0170 +cone_0171 +cone_0172 +cone_0173 +cone_0174 +cone_0175 +cone_0176 +cone_0177 +cone_0178 +cone_0179 +cone_0180 +cone_0181 +cone_0182 +cone_0183 +cone_0184 +cone_0185 +cone_0186 +cone_0187 +cup_0080 +cup_0081 +cup_0082 +cup_0083 +cup_0084 +cup_0085 +cup_0086 +cup_0087 +cup_0088 +cup_0089 +cup_0090 +cup_0091 +cup_0092 +cup_0093 +cup_0094 +cup_0095 +cup_0096 +cup_0097 +cup_0098 +cup_0099 +curtain_0139 +curtain_0140 +curtain_0141 +curtain_0142 +curtain_0143 +curtain_0144 +curtain_0145 +curtain_0146 +curtain_0147 +curtain_0148 +curtain_0149 +curtain_0150 +curtain_0151 +curtain_0152 +curtain_0153 +curtain_0154 +curtain_0155 +curtain_0156 +curtain_0157 +curtain_0158 +desk_0201 +desk_0202 +desk_0203 +desk_0204 +desk_0205 +desk_0206 +desk_0207 +desk_0208 +desk_0209 +desk_0210 +desk_0211 +desk_0212 +desk_0213 +desk_0214 +desk_0215 +desk_0216 +desk_0217 +desk_0218 +desk_0219 +desk_0220 +desk_0221 +desk_0222 +desk_0223 +desk_0224 +desk_0225 +desk_0226 +desk_0227 +desk_0228 +desk_0229 +desk_0230 +desk_0231 +desk_0232 +desk_0233 +desk_0234 +desk_0235 +desk_0236 +desk_0237 +desk_0238 +desk_0239 +desk_0240 +desk_0241 +desk_0242 +desk_0243 +desk_0244 +desk_0245 +desk_0246 +desk_0247 +desk_0248 +desk_0249 +desk_0250 +desk_0251 +desk_0252 +desk_0253 +desk_0254 +desk_0255 +desk_0256 +desk_0257 +desk_0258 +desk_0259 +desk_0260 +desk_0261 +desk_0262 +desk_0263 +desk_0264 +desk_0265 +desk_0266 +desk_0267 +desk_0268 +desk_0269 +desk_0270 +desk_0271 +desk_0272 +desk_0273 +desk_0274 +desk_0275 +desk_0276 +desk_0277 +desk_0278 +desk_0279 +desk_0280 +desk_0281 +desk_0282 +desk_0283 +desk_0284 +desk_0285 +desk_0286 +door_0110 +door_0111 +door_0112 +door_0113 +door_0114 +door_0115 +door_0116 +door_0117 +door_0118 +door_0119 +door_0120 +door_0121 +door_0122 +door_0123 +door_0124 +door_0125 +door_0126 +door_0127 +door_0128 +door_0129 +dresser_0201 +dresser_0202 +dresser_0203 +dresser_0204 +dresser_0205 +dresser_0206 +dresser_0207 +dresser_0208 +dresser_0209 +dresser_0210 +dresser_0211 +dresser_0212 +dresser_0213 +dresser_0214 +dresser_0215 +dresser_0216 +dresser_0217 +dresser_0218 +dresser_0219 +dresser_0220 +dresser_0221 +dresser_0222 +dresser_0223 +dresser_0224 +dresser_0225 +dresser_0226 +dresser_0227 +dresser_0228 +dresser_0229 +dresser_0230 +dresser_0231 +dresser_0232 +dresser_0233 +dresser_0234 +dresser_0235 +dresser_0236 +dresser_0237 +dresser_0238 +dresser_0239 +dresser_0240 +dresser_0241 +dresser_0242 +dresser_0243 +dresser_0244 +dresser_0245 +dresser_0246 +dresser_0247 +dresser_0248 +dresser_0249 +dresser_0250 +dresser_0251 +dresser_0252 +dresser_0253 +dresser_0254 +dresser_0255 +dresser_0256 +dresser_0257 +dresser_0258 +dresser_0259 +dresser_0260 +dresser_0261 +dresser_0262 +dresser_0263 +dresser_0264 +dresser_0265 +dresser_0266 +dresser_0267 +dresser_0268 +dresser_0269 +dresser_0270 +dresser_0271 +dresser_0272 +dresser_0273 +dresser_0274 +dresser_0275 +dresser_0276 +dresser_0277 +dresser_0278 +dresser_0279 +dresser_0280 +dresser_0281 +dresser_0282 +dresser_0283 +dresser_0284 +dresser_0285 +dresser_0286 +flower_pot_0150 +flower_pot_0151 +flower_pot_0152 +flower_pot_0153 +flower_pot_0154 +flower_pot_0155 +flower_pot_0156 +flower_pot_0157 +flower_pot_0158 +flower_pot_0159 +flower_pot_0160 +flower_pot_0161 +flower_pot_0162 +flower_pot_0163 +flower_pot_0164 +flower_pot_0165 +flower_pot_0166 +flower_pot_0167 +flower_pot_0168 +flower_pot_0169 +glass_box_0172 +glass_box_0173 +glass_box_0174 +glass_box_0175 +glass_box_0176 +glass_box_0177 +glass_box_0178 +glass_box_0179 +glass_box_0180 +glass_box_0181 +glass_box_0182 +glass_box_0183 +glass_box_0184 +glass_box_0185 +glass_box_0186 +glass_box_0187 +glass_box_0188 +glass_box_0189 +glass_box_0190 +glass_box_0191 +glass_box_0192 +glass_box_0193 +glass_box_0194 +glass_box_0195 +glass_box_0196 +glass_box_0197 +glass_box_0198 +glass_box_0199 +glass_box_0200 +glass_box_0201 +glass_box_0202 +glass_box_0203 +glass_box_0204 +glass_box_0205 +glass_box_0206 +glass_box_0207 +glass_box_0208 +glass_box_0209 +glass_box_0210 +glass_box_0211 +glass_box_0212 +glass_box_0213 +glass_box_0214 +glass_box_0215 +glass_box_0216 +glass_box_0217 +glass_box_0218 +glass_box_0219 +glass_box_0220 +glass_box_0221 +glass_box_0222 +glass_box_0223 +glass_box_0224 +glass_box_0225 +glass_box_0226 +glass_box_0227 +glass_box_0228 +glass_box_0229 +glass_box_0230 +glass_box_0231 +glass_box_0232 +glass_box_0233 +glass_box_0234 +glass_box_0235 +glass_box_0236 +glass_box_0237 +glass_box_0238 +glass_box_0239 +glass_box_0240 +glass_box_0241 +glass_box_0242 +glass_box_0243 +glass_box_0244 +glass_box_0245 +glass_box_0246 +glass_box_0247 +glass_box_0248 +glass_box_0249 +glass_box_0250 +glass_box_0251 +glass_box_0252 +glass_box_0253 +glass_box_0254 +glass_box_0255 +glass_box_0256 +glass_box_0257 +glass_box_0258 +glass_box_0259 +glass_box_0260 +glass_box_0261 +glass_box_0262 +glass_box_0263 +glass_box_0264 +glass_box_0265 +glass_box_0266 +glass_box_0267 +glass_box_0268 +glass_box_0269 +glass_box_0270 +glass_box_0271 +guitar_0156 +guitar_0157 +guitar_0158 +guitar_0159 +guitar_0160 +guitar_0161 +guitar_0162 +guitar_0163 +guitar_0164 +guitar_0165 +guitar_0166 +guitar_0167 +guitar_0168 +guitar_0169 +guitar_0170 +guitar_0171 +guitar_0172 +guitar_0173 +guitar_0174 +guitar_0175 +guitar_0176 +guitar_0177 +guitar_0178 +guitar_0179 +guitar_0180 +guitar_0181 +guitar_0182 +guitar_0183 +guitar_0184 +guitar_0185 +guitar_0186 +guitar_0187 +guitar_0188 +guitar_0189 +guitar_0190 +guitar_0191 +guitar_0192 +guitar_0193 +guitar_0194 +guitar_0195 +guitar_0196 +guitar_0197 +guitar_0198 +guitar_0199 +guitar_0200 +guitar_0201 +guitar_0202 +guitar_0203 +guitar_0204 +guitar_0205 +guitar_0206 +guitar_0207 +guitar_0208 +guitar_0209 +guitar_0210 +guitar_0211 +guitar_0212 +guitar_0213 +guitar_0214 +guitar_0215 +guitar_0216 +guitar_0217 +guitar_0218 +guitar_0219 +guitar_0220 +guitar_0221 +guitar_0222 +guitar_0223 +guitar_0224 +guitar_0225 +guitar_0226 +guitar_0227 +guitar_0228 +guitar_0229 +guitar_0230 +guitar_0231 +guitar_0232 +guitar_0233 +guitar_0234 +guitar_0235 +guitar_0236 +guitar_0237 +guitar_0238 +guitar_0239 +guitar_0240 +guitar_0241 +guitar_0242 +guitar_0243 +guitar_0244 +guitar_0245 +guitar_0246 +guitar_0247 +guitar_0248 +guitar_0249 +guitar_0250 +guitar_0251 +guitar_0252 +guitar_0253 +guitar_0254 +guitar_0255 +keyboard_0146 +keyboard_0147 +keyboard_0148 +keyboard_0149 +keyboard_0150 +keyboard_0151 +keyboard_0152 +keyboard_0153 +keyboard_0154 +keyboard_0155 +keyboard_0156 +keyboard_0157 +keyboard_0158 +keyboard_0159 +keyboard_0160 +keyboard_0161 +keyboard_0162 +keyboard_0163 +keyboard_0164 +keyboard_0165 +lamp_0125 +lamp_0126 +lamp_0127 +lamp_0128 +lamp_0129 +lamp_0130 +lamp_0131 +lamp_0132 +lamp_0133 +lamp_0134 +lamp_0135 +lamp_0136 +lamp_0137 +lamp_0138 +lamp_0139 +lamp_0140 +lamp_0141 +lamp_0142 +lamp_0143 +lamp_0144 +laptop_0150 +laptop_0151 +laptop_0152 +laptop_0153 +laptop_0154 +laptop_0155 +laptop_0156 +laptop_0157 +laptop_0158 +laptop_0159 +laptop_0160 +laptop_0161 +laptop_0162 +laptop_0163 +laptop_0164 +laptop_0165 +laptop_0166 +laptop_0167 +laptop_0168 +laptop_0169 +mantel_0285 +mantel_0286 +mantel_0287 +mantel_0288 +mantel_0289 +mantel_0290 +mantel_0291 +mantel_0292 +mantel_0293 +mantel_0294 +mantel_0295 +mantel_0296 +mantel_0297 +mantel_0298 +mantel_0299 +mantel_0300 +mantel_0301 +mantel_0302 +mantel_0303 +mantel_0304 +mantel_0305 +mantel_0306 +mantel_0307 +mantel_0308 +mantel_0309 +mantel_0310 +mantel_0311 +mantel_0312 +mantel_0313 +mantel_0314 +mantel_0315 +mantel_0316 +mantel_0317 +mantel_0318 +mantel_0319 +mantel_0320 +mantel_0321 +mantel_0322 +mantel_0323 +mantel_0324 +mantel_0325 +mantel_0326 +mantel_0327 +mantel_0328 +mantel_0329 +mantel_0330 +mantel_0331 +mantel_0332 +mantel_0333 +mantel_0334 +mantel_0335 +mantel_0336 +mantel_0337 +mantel_0338 +mantel_0339 +mantel_0340 +mantel_0341 +mantel_0342 +mantel_0343 +mantel_0344 +mantel_0345 +mantel_0346 +mantel_0347 +mantel_0348 +mantel_0349 +mantel_0350 +mantel_0351 +mantel_0352 +mantel_0353 +mantel_0354 +mantel_0355 +mantel_0356 +mantel_0357 +mantel_0358 +mantel_0359 +mantel_0360 +mantel_0361 +mantel_0362 +mantel_0363 +mantel_0364 +mantel_0365 +mantel_0366 +mantel_0367 +mantel_0368 +mantel_0369 +mantel_0370 +mantel_0371 +mantel_0372 +mantel_0373 +mantel_0374 +mantel_0375 +mantel_0376 +mantel_0377 +mantel_0378 +mantel_0379 +mantel_0380 +mantel_0381 +mantel_0382 +mantel_0383 +mantel_0384 +monitor_0466 +monitor_0467 +monitor_0468 +monitor_0469 +monitor_0470 +monitor_0471 +monitor_0472 +monitor_0473 +monitor_0474 +monitor_0475 +monitor_0476 +monitor_0477 +monitor_0478 +monitor_0479 +monitor_0480 +monitor_0481 +monitor_0482 +monitor_0483 +monitor_0484 +monitor_0485 +monitor_0486 +monitor_0487 +monitor_0488 +monitor_0489 +monitor_0490 +monitor_0491 +monitor_0492 +monitor_0493 +monitor_0494 +monitor_0495 +monitor_0496 +monitor_0497 +monitor_0498 +monitor_0499 +monitor_0500 +monitor_0501 +monitor_0502 +monitor_0503 +monitor_0504 +monitor_0505 +monitor_0506 +monitor_0507 +monitor_0508 +monitor_0509 +monitor_0510 +monitor_0511 +monitor_0512 +monitor_0513 +monitor_0514 +monitor_0515 +monitor_0516 +monitor_0517 +monitor_0518 +monitor_0519 +monitor_0520 +monitor_0521 +monitor_0522 +monitor_0523 +monitor_0524 +monitor_0525 +monitor_0526 +monitor_0527 +monitor_0528 +monitor_0529 +monitor_0530 +monitor_0531 +monitor_0532 +monitor_0533 +monitor_0534 +monitor_0535 +monitor_0536 +monitor_0537 +monitor_0538 +monitor_0539 +monitor_0540 +monitor_0541 +monitor_0542 +monitor_0543 +monitor_0544 +monitor_0545 +monitor_0546 +monitor_0547 +monitor_0548 +monitor_0549 +monitor_0550 +monitor_0551 +monitor_0552 +monitor_0553 +monitor_0554 +monitor_0555 +monitor_0556 +monitor_0557 +monitor_0558 +monitor_0559 +monitor_0560 +monitor_0561 +monitor_0562 +monitor_0563 +monitor_0564 +monitor_0565 +night_stand_0201 +night_stand_0202 +night_stand_0203 +night_stand_0204 +night_stand_0205 +night_stand_0206 +night_stand_0207 +night_stand_0208 +night_stand_0209 +night_stand_0210 +night_stand_0211 +night_stand_0212 +night_stand_0213 +night_stand_0214 +night_stand_0215 +night_stand_0216 +night_stand_0217 +night_stand_0218 +night_stand_0219 +night_stand_0220 +night_stand_0221 +night_stand_0222 +night_stand_0223 +night_stand_0224 +night_stand_0225 +night_stand_0226 +night_stand_0227 +night_stand_0228 +night_stand_0229 +night_stand_0230 +night_stand_0231 +night_stand_0232 +night_stand_0233 +night_stand_0234 +night_stand_0235 +night_stand_0236 +night_stand_0237 +night_stand_0238 +night_stand_0239 +night_stand_0240 +night_stand_0241 +night_stand_0242 +night_stand_0243 +night_stand_0244 +night_stand_0245 +night_stand_0246 +night_stand_0247 +night_stand_0248 +night_stand_0249 +night_stand_0250 +night_stand_0251 +night_stand_0252 +night_stand_0253 +night_stand_0254 +night_stand_0255 +night_stand_0256 +night_stand_0257 +night_stand_0258 +night_stand_0259 +night_stand_0260 +night_stand_0261 +night_stand_0262 +night_stand_0263 +night_stand_0264 +night_stand_0265 +night_stand_0266 +night_stand_0267 +night_stand_0268 +night_stand_0269 +night_stand_0270 +night_stand_0271 +night_stand_0272 +night_stand_0273 +night_stand_0274 +night_stand_0275 +night_stand_0276 +night_stand_0277 +night_stand_0278 +night_stand_0279 +night_stand_0280 +night_stand_0281 +night_stand_0282 +night_stand_0283 +night_stand_0284 +night_stand_0285 +night_stand_0286 +person_0089 +person_0090 +person_0091 +person_0092 +person_0093 +person_0094 +person_0095 +person_0096 +person_0097 +person_0098 +person_0099 +person_0100 +person_0101 +person_0102 +person_0103 +person_0104 +person_0105 +person_0106 +person_0107 +person_0108 +piano_0232 +piano_0233 +piano_0234 +piano_0235 +piano_0236 +piano_0237 +piano_0238 +piano_0239 +piano_0240 +piano_0241 +piano_0242 +piano_0243 +piano_0244 +piano_0245 +piano_0246 +piano_0247 +piano_0248 +piano_0249 +piano_0250 +piano_0251 +piano_0252 +piano_0253 +piano_0254 +piano_0255 +piano_0256 +piano_0257 +piano_0258 +piano_0259 +piano_0260 +piano_0261 +piano_0262 +piano_0263 +piano_0264 +piano_0265 +piano_0266 +piano_0267 +piano_0268 +piano_0269 +piano_0270 +piano_0271 +piano_0272 +piano_0273 +piano_0274 +piano_0275 +piano_0276 +piano_0277 +piano_0278 +piano_0279 +piano_0280 +piano_0281 +piano_0282 +piano_0283 +piano_0284 +piano_0285 +piano_0286 +piano_0287 +piano_0288 +piano_0289 +piano_0290 +piano_0291 +piano_0292 +piano_0293 +piano_0294 +piano_0295 +piano_0296 +piano_0297 +piano_0298 +piano_0299 +piano_0300 +piano_0301 +piano_0302 +piano_0303 +piano_0304 +piano_0305 +piano_0306 +piano_0307 +piano_0308 +piano_0309 +piano_0310 +piano_0311 +piano_0312 +piano_0313 +piano_0314 +piano_0315 +piano_0316 +piano_0317 +piano_0318 +piano_0319 +piano_0320 +piano_0321 +piano_0322 +piano_0323 +piano_0324 +piano_0325 +piano_0326 +piano_0327 +piano_0328 +piano_0329 +piano_0330 +piano_0331 +plant_0241 +plant_0242 +plant_0243 +plant_0244 +plant_0245 +plant_0246 +plant_0247 +plant_0248 +plant_0249 +plant_0250 +plant_0251 +plant_0252 +plant_0253 +plant_0254 +plant_0255 +plant_0256 +plant_0257 +plant_0258 +plant_0259 +plant_0260 +plant_0261 +plant_0262 +plant_0263 +plant_0264 +plant_0265 +plant_0266 +plant_0267 +plant_0268 +plant_0269 +plant_0270 +plant_0271 +plant_0272 +plant_0273 +plant_0274 +plant_0275 +plant_0276 +plant_0277 +plant_0278 +plant_0279 +plant_0280 +plant_0281 +plant_0282 +plant_0283 +plant_0284 +plant_0285 +plant_0286 +plant_0287 +plant_0288 +plant_0289 +plant_0290 +plant_0291 +plant_0292 +plant_0293 +plant_0294 +plant_0295 +plant_0296 +plant_0297 +plant_0298 +plant_0299 +plant_0300 +plant_0301 +plant_0302 +plant_0303 +plant_0304 +plant_0305 +plant_0306 +plant_0307 +plant_0308 +plant_0309 +plant_0310 +plant_0311 +plant_0312 +plant_0313 +plant_0314 +plant_0315 +plant_0316 +plant_0317 +plant_0318 +plant_0319 +plant_0320 +plant_0321 +plant_0322 +plant_0323 +plant_0324 +plant_0325 +plant_0326 +plant_0327 +plant_0328 +plant_0329 +plant_0330 +plant_0331 +plant_0332 +plant_0333 +plant_0334 +plant_0335 +plant_0336 +plant_0337 +plant_0338 +plant_0339 +plant_0340 +radio_0105 +radio_0106 +radio_0107 +radio_0108 +radio_0109 +radio_0110 +radio_0111 +radio_0112 +radio_0113 +radio_0114 +radio_0115 +radio_0116 +radio_0117 +radio_0118 +radio_0119 +radio_0120 +radio_0121 +radio_0122 +radio_0123 +radio_0124 +range_hood_0116 +range_hood_0117 +range_hood_0118 +range_hood_0119 +range_hood_0120 +range_hood_0121 +range_hood_0122 +range_hood_0123 +range_hood_0124 +range_hood_0125 +range_hood_0126 +range_hood_0127 +range_hood_0128 +range_hood_0129 +range_hood_0130 +range_hood_0131 +range_hood_0132 +range_hood_0133 +range_hood_0134 +range_hood_0135 +range_hood_0136 +range_hood_0137 +range_hood_0138 +range_hood_0139 +range_hood_0140 +range_hood_0141 +range_hood_0142 +range_hood_0143 +range_hood_0144 +range_hood_0145 +range_hood_0146 +range_hood_0147 +range_hood_0148 +range_hood_0149 +range_hood_0150 +range_hood_0151 +range_hood_0152 +range_hood_0153 +range_hood_0154 +range_hood_0155 +range_hood_0156 +range_hood_0157 +range_hood_0158 +range_hood_0159 +range_hood_0160 +range_hood_0161 +range_hood_0162 +range_hood_0163 +range_hood_0164 +range_hood_0165 +range_hood_0166 +range_hood_0167 +range_hood_0168 +range_hood_0169 +range_hood_0170 +range_hood_0171 +range_hood_0172 +range_hood_0173 +range_hood_0174 +range_hood_0175 +range_hood_0176 +range_hood_0177 +range_hood_0178 +range_hood_0179 +range_hood_0180 +range_hood_0181 +range_hood_0182 +range_hood_0183 +range_hood_0184 +range_hood_0185 +range_hood_0186 +range_hood_0187 +range_hood_0188 +range_hood_0189 +range_hood_0190 +range_hood_0191 +range_hood_0192 +range_hood_0193 +range_hood_0194 +range_hood_0195 +range_hood_0196 +range_hood_0197 +range_hood_0198 +range_hood_0199 +range_hood_0200 +range_hood_0201 +range_hood_0202 +range_hood_0203 +range_hood_0204 +range_hood_0205 +range_hood_0206 +range_hood_0207 +range_hood_0208 +range_hood_0209 +range_hood_0210 +range_hood_0211 +range_hood_0212 +range_hood_0213 +range_hood_0214 +range_hood_0215 +sink_0129 +sink_0130 +sink_0131 +sink_0132 +sink_0133 +sink_0134 +sink_0135 +sink_0136 +sink_0137 +sink_0138 +sink_0139 +sink_0140 +sink_0141 +sink_0142 +sink_0143 +sink_0144 +sink_0145 +sink_0146 +sink_0147 +sink_0148 +sofa_0681 +sofa_0682 +sofa_0683 +sofa_0684 +sofa_0685 +sofa_0686 +sofa_0687 +sofa_0688 +sofa_0689 +sofa_0690 +sofa_0691 +sofa_0692 +sofa_0693 +sofa_0694 +sofa_0695 +sofa_0696 +sofa_0697 +sofa_0698 +sofa_0699 +sofa_0700 +sofa_0701 +sofa_0702 +sofa_0703 +sofa_0704 +sofa_0705 +sofa_0706 +sofa_0707 +sofa_0708 +sofa_0709 +sofa_0710 +sofa_0711 +sofa_0712 +sofa_0713 +sofa_0714 +sofa_0715 +sofa_0716 +sofa_0717 +sofa_0718 +sofa_0719 +sofa_0720 +sofa_0721 +sofa_0722 +sofa_0723 +sofa_0724 +sofa_0725 +sofa_0726 +sofa_0727 +sofa_0728 +sofa_0729 +sofa_0730 +sofa_0731 +sofa_0732 +sofa_0733 +sofa_0734 +sofa_0735 +sofa_0736 +sofa_0737 +sofa_0738 +sofa_0739 +sofa_0740 +sofa_0741 +sofa_0742 +sofa_0743 +sofa_0744 +sofa_0745 +sofa_0746 +sofa_0747 +sofa_0748 +sofa_0749 +sofa_0750 +sofa_0751 +sofa_0752 +sofa_0753 +sofa_0754 +sofa_0755 +sofa_0756 +sofa_0757 +sofa_0758 +sofa_0759 +sofa_0760 +sofa_0761 +sofa_0762 +sofa_0763 +sofa_0764 +sofa_0765 +sofa_0766 +sofa_0767 +sofa_0768 +sofa_0769 +sofa_0770 +sofa_0771 +sofa_0772 +sofa_0773 +sofa_0774 +sofa_0775 +sofa_0776 +sofa_0777 +sofa_0778 +sofa_0779 +sofa_0780 +stairs_0125 +stairs_0126 +stairs_0127 +stairs_0128 +stairs_0129 +stairs_0130 +stairs_0131 +stairs_0132 +stairs_0133 +stairs_0134 +stairs_0135 +stairs_0136 +stairs_0137 +stairs_0138 +stairs_0139 +stairs_0140 +stairs_0141 +stairs_0142 +stairs_0143 +stairs_0144 +stool_0091 +stool_0092 +stool_0093 +stool_0094 +stool_0095 +stool_0096 +stool_0097 +stool_0098 +stool_0099 +stool_0100 +stool_0101 +stool_0102 +stool_0103 +stool_0104 +stool_0105 +stool_0106 +stool_0107 +stool_0108 +stool_0109 +stool_0110 +table_0393 +table_0394 +table_0395 +table_0396 +table_0397 +table_0398 +table_0399 +table_0400 +table_0401 +table_0402 +table_0403 +table_0404 +table_0405 +table_0406 +table_0407 +table_0408 +table_0409 +table_0410 +table_0411 +table_0412 +table_0413 +table_0414 +table_0415 +table_0416 +table_0417 +table_0418 +table_0419 +table_0420 +table_0421 +table_0422 +table_0423 +table_0424 +table_0425 +table_0426 +table_0427 +table_0428 +table_0429 +table_0430 +table_0431 +table_0432 +table_0433 +table_0434 +table_0435 +table_0436 +table_0437 +table_0438 +table_0439 +table_0440 +table_0441 +table_0442 +table_0443 +table_0444 +table_0445 +table_0446 +table_0447 +table_0448 +table_0449 +table_0450 +table_0451 +table_0452 +table_0453 +table_0454 +table_0455 +table_0456 +table_0457 +table_0458 +table_0459 +table_0460 +table_0461 +table_0462 +table_0463 +table_0464 +table_0465 +table_0466 +table_0467 +table_0468 +table_0469 +table_0470 +table_0471 +table_0472 +table_0473 +table_0474 +table_0475 +table_0476 +table_0477 +table_0478 +table_0479 +table_0480 +table_0481 +table_0482 +table_0483 +table_0484 +table_0485 +table_0486 +table_0487 +table_0488 +table_0489 +table_0490 +table_0491 +table_0492 +tent_0164 +tent_0165 +tent_0166 +tent_0167 +tent_0168 +tent_0169 +tent_0170 +tent_0171 +tent_0172 +tent_0173 +tent_0174 +tent_0175 +tent_0176 +tent_0177 +tent_0178 +tent_0179 +tent_0180 +tent_0181 +tent_0182 +tent_0183 +toilet_0345 +toilet_0346 +toilet_0347 +toilet_0348 +toilet_0349 +toilet_0350 +toilet_0351 +toilet_0352 +toilet_0353 +toilet_0354 +toilet_0355 +toilet_0356 +toilet_0357 +toilet_0358 +toilet_0359 +toilet_0360 +toilet_0361 +toilet_0362 +toilet_0363 +toilet_0364 +toilet_0365 +toilet_0366 +toilet_0367 +toilet_0368 +toilet_0369 +toilet_0370 +toilet_0371 +toilet_0372 +toilet_0373 +toilet_0374 +toilet_0375 +toilet_0376 +toilet_0377 +toilet_0378 +toilet_0379 +toilet_0380 +toilet_0381 +toilet_0382 +toilet_0383 +toilet_0384 +toilet_0385 +toilet_0386 +toilet_0387 +toilet_0388 +toilet_0389 +toilet_0390 +toilet_0391 +toilet_0392 +toilet_0393 +toilet_0394 +toilet_0395 +toilet_0396 +toilet_0397 +toilet_0398 +toilet_0399 +toilet_0400 +toilet_0401 +toilet_0402 +toilet_0403 +toilet_0404 +toilet_0405 +toilet_0406 +toilet_0407 +toilet_0408 +toilet_0409 +toilet_0410 +toilet_0411 +toilet_0412 +toilet_0413 +toilet_0414 +toilet_0415 +toilet_0416 +toilet_0417 +toilet_0418 +toilet_0419 +toilet_0420 +toilet_0421 +toilet_0422 +toilet_0423 +toilet_0424 +toilet_0425 +toilet_0426 +toilet_0427 +toilet_0428 +toilet_0429 +toilet_0430 +toilet_0431 +toilet_0432 +toilet_0433 +toilet_0434 +toilet_0435 +toilet_0436 +toilet_0437 +toilet_0438 +toilet_0439 +toilet_0440 +toilet_0441 +toilet_0442 +toilet_0443 +toilet_0444 +tv_stand_0268 +tv_stand_0269 +tv_stand_0270 +tv_stand_0271 +tv_stand_0272 +tv_stand_0273 +tv_stand_0274 +tv_stand_0275 +tv_stand_0276 +tv_stand_0277 +tv_stand_0278 +tv_stand_0279 +tv_stand_0280 +tv_stand_0281 +tv_stand_0282 +tv_stand_0283 +tv_stand_0284 +tv_stand_0285 +tv_stand_0286 +tv_stand_0287 +tv_stand_0288 +tv_stand_0289 +tv_stand_0290 +tv_stand_0291 +tv_stand_0292 +tv_stand_0293 +tv_stand_0294 +tv_stand_0295 +tv_stand_0296 +tv_stand_0297 +tv_stand_0298 +tv_stand_0299 +tv_stand_0300 +tv_stand_0301 +tv_stand_0302 +tv_stand_0303 +tv_stand_0304 +tv_stand_0305 +tv_stand_0306 +tv_stand_0307 +tv_stand_0308 +tv_stand_0309 +tv_stand_0310 +tv_stand_0311 +tv_stand_0312 +tv_stand_0313 +tv_stand_0314 +tv_stand_0315 +tv_stand_0316 +tv_stand_0317 +tv_stand_0318 +tv_stand_0319 +tv_stand_0320 +tv_stand_0321 +tv_stand_0322 +tv_stand_0323 +tv_stand_0324 +tv_stand_0325 +tv_stand_0326 +tv_stand_0327 +tv_stand_0328 +tv_stand_0329 +tv_stand_0330 +tv_stand_0331 +tv_stand_0332 +tv_stand_0333 +tv_stand_0334 +tv_stand_0335 +tv_stand_0336 +tv_stand_0337 +tv_stand_0338 +tv_stand_0339 +tv_stand_0340 +tv_stand_0341 +tv_stand_0342 +tv_stand_0343 +tv_stand_0344 +tv_stand_0345 +tv_stand_0346 +tv_stand_0347 +tv_stand_0348 +tv_stand_0349 +tv_stand_0350 +tv_stand_0351 +tv_stand_0352 +tv_stand_0353 +tv_stand_0354 +tv_stand_0355 +tv_stand_0356 +tv_stand_0357 +tv_stand_0358 +tv_stand_0359 +tv_stand_0360 +tv_stand_0361 +tv_stand_0362 +tv_stand_0363 +tv_stand_0364 +tv_stand_0365 +tv_stand_0366 +tv_stand_0367 +vase_0476 +vase_0477 +vase_0478 +vase_0479 +vase_0480 +vase_0481 +vase_0482 +vase_0483 +vase_0484 +vase_0485 +vase_0486 +vase_0487 +vase_0488 +vase_0489 +vase_0490 +vase_0491 +vase_0492 +vase_0493 +vase_0494 +vase_0495 +vase_0496 +vase_0497 +vase_0498 +vase_0499 +vase_0500 +vase_0501 +vase_0502 +vase_0503 +vase_0504 +vase_0505 +vase_0506 +vase_0507 +vase_0508 +vase_0509 +vase_0510 +vase_0511 +vase_0512 +vase_0513 +vase_0514 +vase_0515 +vase_0516 +vase_0517 +vase_0518 +vase_0519 +vase_0520 +vase_0521 +vase_0522 +vase_0523 +vase_0524 +vase_0525 +vase_0526 +vase_0527 +vase_0528 +vase_0529 +vase_0530 +vase_0531 +vase_0532 +vase_0533 +vase_0534 +vase_0535 +vase_0536 +vase_0537 +vase_0538 +vase_0539 +vase_0540 +vase_0541 +vase_0542 +vase_0543 +vase_0544 +vase_0545 +vase_0546 +vase_0547 +vase_0548 +vase_0549 +vase_0550 +vase_0551 +vase_0552 +vase_0553 +vase_0554 +vase_0555 +vase_0556 +vase_0557 +vase_0558 +vase_0559 +vase_0560 +vase_0561 +vase_0562 +vase_0563 +vase_0564 +vase_0565 +vase_0566 +vase_0567 +vase_0568 +vase_0569 +vase_0570 +vase_0571 +vase_0572 +vase_0573 +vase_0574 +vase_0575 +wardrobe_0088 +wardrobe_0089 +wardrobe_0090 +wardrobe_0091 +wardrobe_0092 +wardrobe_0093 +wardrobe_0094 +wardrobe_0095 +wardrobe_0096 +wardrobe_0097 +wardrobe_0098 +wardrobe_0099 +wardrobe_0100 +wardrobe_0101 +wardrobe_0102 +wardrobe_0103 +wardrobe_0104 +wardrobe_0105 +wardrobe_0106 +wardrobe_0107 +xbox_0104 +xbox_0105 +xbox_0106 +xbox_0107 +xbox_0108 +xbox_0109 +xbox_0110 +xbox_0111 +xbox_0112 +xbox_0113 +xbox_0114 +xbox_0115 +xbox_0116 +xbox_0117 +xbox_0118 +xbox_0119 +xbox_0120 +xbox_0121 +xbox_0122 +xbox_0123 diff --git a/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_train.txt b/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_train.txt new file mode 100644 index 0000000..3a50c70 --- /dev/null +++ b/zoo/PointBERT/data/ModelNet/modelnet40_normal_resampled/modelnet40_train.txt @@ -0,0 +1,9843 @@ +airplane_0001 +airplane_0002 +airplane_0003 +airplane_0004 +airplane_0005 +airplane_0006 +airplane_0007 +airplane_0008 +airplane_0009 +airplane_0010 +airplane_0011 +airplane_0012 +airplane_0013 +airplane_0014 +airplane_0015 +airplane_0016 +airplane_0017 +airplane_0018 +airplane_0019 +airplane_0020 +airplane_0021 +airplane_0022 +airplane_0023 +airplane_0024 +airplane_0025 +airplane_0026 +airplane_0027 +airplane_0028 +airplane_0029 +airplane_0030 +airplane_0031 +airplane_0032 +airplane_0033 +airplane_0034 +airplane_0035 +airplane_0036 +airplane_0037 +airplane_0038 +airplane_0039 +airplane_0040 +airplane_0041 +airplane_0042 +airplane_0043 +airplane_0044 +airplane_0045 +airplane_0046 +airplane_0047 +airplane_0048 +airplane_0049 +airplane_0050 +airplane_0051 +airplane_0052 +airplane_0053 +airplane_0054 +airplane_0055 +airplane_0056 +airplane_0057 +airplane_0058 +airplane_0059 +airplane_0060 +airplane_0061 +airplane_0062 +airplane_0063 +airplane_0064 +airplane_0065 +airplane_0066 +airplane_0067 +airplane_0068 +airplane_0069 +airplane_0070 +airplane_0071 +airplane_0072 +airplane_0073 +airplane_0074 +airplane_0075 +airplane_0076 +airplane_0077 +airplane_0078 +airplane_0079 +airplane_0080 +airplane_0081 +airplane_0082 +airplane_0083 +airplane_0084 +airplane_0085 +airplane_0086 +airplane_0087 +airplane_0088 +airplane_0089 +airplane_0090 +airplane_0091 +airplane_0092 +airplane_0093 +airplane_0094 +airplane_0095 +airplane_0096 +airplane_0097 +airplane_0098 +airplane_0099 +airplane_0100 +airplane_0101 +airplane_0102 +airplane_0103 +airplane_0104 +airplane_0105 +airplane_0106 +airplane_0107 +airplane_0108 +airplane_0109 +airplane_0110 +airplane_0111 +airplane_0112 +airplane_0113 +airplane_0114 +airplane_0115 +airplane_0116 +airplane_0117 +airplane_0118 +airplane_0119 +airplane_0120 +airplane_0121 +airplane_0122 +airplane_0123 +airplane_0124 +airplane_0125 +airplane_0126 +airplane_0127 +airplane_0128 +airplane_0129 +airplane_0130 +airplane_0131 +airplane_0132 +airplane_0133 +airplane_0134 +airplane_0135 +airplane_0136 +airplane_0137 +airplane_0138 +airplane_0139 +airplane_0140 +airplane_0141 +airplane_0142 +airplane_0143 +airplane_0144 +airplane_0145 +airplane_0146 +airplane_0147 +airplane_0148 +airplane_0149 +airplane_0150 +airplane_0151 +airplane_0152 +airplane_0153 +airplane_0154 +airplane_0155 +airplane_0156 +airplane_0157 +airplane_0158 +airplane_0159 +airplane_0160 +airplane_0161 +airplane_0162 +airplane_0163 +airplane_0164 +airplane_0165 +airplane_0166 +airplane_0167 +airplane_0168 +airplane_0169 +airplane_0170 +airplane_0171 +airplane_0172 +airplane_0173 +airplane_0174 +airplane_0175 +airplane_0176 +airplane_0177 +airplane_0178 +airplane_0179 +airplane_0180 +airplane_0181 +airplane_0182 +airplane_0183 +airplane_0184 +airplane_0185 +airplane_0186 +airplane_0187 +airplane_0188 +airplane_0189 +airplane_0190 +airplane_0191 +airplane_0192 +airplane_0193 +airplane_0194 +airplane_0195 +airplane_0196 +airplane_0197 +airplane_0198 +airplane_0199 +airplane_0200 +airplane_0201 +airplane_0202 +airplane_0203 +airplane_0204 +airplane_0205 +airplane_0206 +airplane_0207 +airplane_0208 +airplane_0209 +airplane_0210 +airplane_0211 +airplane_0212 +airplane_0213 +airplane_0214 +airplane_0215 +airplane_0216 +airplane_0217 +airplane_0218 +airplane_0219 +airplane_0220 +airplane_0221 +airplane_0222 +airplane_0223 +airplane_0224 +airplane_0225 +airplane_0226 +airplane_0227 +airplane_0228 +airplane_0229 +airplane_0230 +airplane_0231 +airplane_0232 +airplane_0233 +airplane_0234 +airplane_0235 +airplane_0236 +airplane_0237 +airplane_0238 +airplane_0239 +airplane_0240 +airplane_0241 +airplane_0242 +airplane_0243 +airplane_0244 +airplane_0245 +airplane_0246 +airplane_0247 +airplane_0248 +airplane_0249 +airplane_0250 +airplane_0251 +airplane_0252 +airplane_0253 +airplane_0254 +airplane_0255 +airplane_0256 +airplane_0257 +airplane_0258 +airplane_0259 +airplane_0260 +airplane_0261 +airplane_0262 +airplane_0263 +airplane_0264 +airplane_0265 +airplane_0266 +airplane_0267 +airplane_0268 +airplane_0269 +airplane_0270 +airplane_0271 +airplane_0272 +airplane_0273 +airplane_0274 +airplane_0275 +airplane_0276 +airplane_0277 +airplane_0278 +airplane_0279 +airplane_0280 +airplane_0281 +airplane_0282 +airplane_0283 +airplane_0284 +airplane_0285 +airplane_0286 +airplane_0287 +airplane_0288 +airplane_0289 +airplane_0290 +airplane_0291 +airplane_0292 +airplane_0293 +airplane_0294 +airplane_0295 +airplane_0296 +airplane_0297 +airplane_0298 +airplane_0299 +airplane_0300 +airplane_0301 +airplane_0302 +airplane_0303 +airplane_0304 +airplane_0305 +airplane_0306 +airplane_0307 +airplane_0308 +airplane_0309 +airplane_0310 +airplane_0311 +airplane_0312 +airplane_0313 +airplane_0314 +airplane_0315 +airplane_0316 +airplane_0317 +airplane_0318 +airplane_0319 +airplane_0320 +airplane_0321 +airplane_0322 +airplane_0323 +airplane_0324 +airplane_0325 +airplane_0326 +airplane_0327 +airplane_0328 +airplane_0329 +airplane_0330 +airplane_0331 +airplane_0332 +airplane_0333 +airplane_0334 +airplane_0335 +airplane_0336 +airplane_0337 +airplane_0338 +airplane_0339 +airplane_0340 +airplane_0341 +airplane_0342 +airplane_0343 +airplane_0344 +airplane_0345 +airplane_0346 +airplane_0347 +airplane_0348 +airplane_0349 +airplane_0350 +airplane_0351 +airplane_0352 +airplane_0353 +airplane_0354 +airplane_0355 +airplane_0356 +airplane_0357 +airplane_0358 +airplane_0359 +airplane_0360 +airplane_0361 +airplane_0362 +airplane_0363 +airplane_0364 +airplane_0365 +airplane_0366 +airplane_0367 +airplane_0368 +airplane_0369 +airplane_0370 +airplane_0371 +airplane_0372 +airplane_0373 +airplane_0374 +airplane_0375 +airplane_0376 +airplane_0377 +airplane_0378 +airplane_0379 +airplane_0380 +airplane_0381 +airplane_0382 +airplane_0383 +airplane_0384 +airplane_0385 +airplane_0386 +airplane_0387 +airplane_0388 +airplane_0389 +airplane_0390 +airplane_0391 +airplane_0392 +airplane_0393 +airplane_0394 +airplane_0395 +airplane_0396 +airplane_0397 +airplane_0398 +airplane_0399 +airplane_0400 +airplane_0401 +airplane_0402 +airplane_0403 +airplane_0404 +airplane_0405 +airplane_0406 +airplane_0407 +airplane_0408 +airplane_0409 +airplane_0410 +airplane_0411 +airplane_0412 +airplane_0413 +airplane_0414 +airplane_0415 +airplane_0416 +airplane_0417 +airplane_0418 +airplane_0419 +airplane_0420 +airplane_0421 +airplane_0422 +airplane_0423 +airplane_0424 +airplane_0425 +airplane_0426 +airplane_0427 +airplane_0428 +airplane_0429 +airplane_0430 +airplane_0431 +airplane_0432 +airplane_0433 +airplane_0434 +airplane_0435 +airplane_0436 +airplane_0437 +airplane_0438 +airplane_0439 +airplane_0440 +airplane_0441 +airplane_0442 +airplane_0443 +airplane_0444 +airplane_0445 +airplane_0446 +airplane_0447 +airplane_0448 +airplane_0449 +airplane_0450 +airplane_0451 +airplane_0452 +airplane_0453 +airplane_0454 +airplane_0455 +airplane_0456 +airplane_0457 +airplane_0458 +airplane_0459 +airplane_0460 +airplane_0461 +airplane_0462 +airplane_0463 +airplane_0464 +airplane_0465 +airplane_0466 +airplane_0467 +airplane_0468 +airplane_0469 +airplane_0470 +airplane_0471 +airplane_0472 +airplane_0473 +airplane_0474 +airplane_0475 +airplane_0476 +airplane_0477 +airplane_0478 +airplane_0479 +airplane_0480 +airplane_0481 +airplane_0482 +airplane_0483 +airplane_0484 +airplane_0485 +airplane_0486 +airplane_0487 +airplane_0488 +airplane_0489 +airplane_0490 +airplane_0491 +airplane_0492 +airplane_0493 +airplane_0494 +airplane_0495 +airplane_0496 +airplane_0497 +airplane_0498 +airplane_0499 +airplane_0500 +airplane_0501 +airplane_0502 +airplane_0503 +airplane_0504 +airplane_0505 +airplane_0506 +airplane_0507 +airplane_0508 +airplane_0509 +airplane_0510 +airplane_0511 +airplane_0512 +airplane_0513 +airplane_0514 +airplane_0515 +airplane_0516 +airplane_0517 +airplane_0518 +airplane_0519 +airplane_0520 +airplane_0521 +airplane_0522 +airplane_0523 +airplane_0524 +airplane_0525 +airplane_0526 +airplane_0527 +airplane_0528 +airplane_0529 +airplane_0530 +airplane_0531 +airplane_0532 +airplane_0533 +airplane_0534 +airplane_0535 +airplane_0536 +airplane_0537 +airplane_0538 +airplane_0539 +airplane_0540 +airplane_0541 +airplane_0542 +airplane_0543 +airplane_0544 +airplane_0545 +airplane_0546 +airplane_0547 +airplane_0548 +airplane_0549 +airplane_0550 +airplane_0551 +airplane_0552 +airplane_0553 +airplane_0554 +airplane_0555 +airplane_0556 +airplane_0557 +airplane_0558 +airplane_0559 +airplane_0560 +airplane_0561 +airplane_0562 +airplane_0563 +airplane_0564 +airplane_0565 +airplane_0566 +airplane_0567 +airplane_0568 +airplane_0569 +airplane_0570 +airplane_0571 +airplane_0572 +airplane_0573 +airplane_0574 +airplane_0575 +airplane_0576 +airplane_0577 +airplane_0578 +airplane_0579 +airplane_0580 +airplane_0581 +airplane_0582 +airplane_0583 +airplane_0584 +airplane_0585 +airplane_0586 +airplane_0587 +airplane_0588 +airplane_0589 +airplane_0590 +airplane_0591 +airplane_0592 +airplane_0593 +airplane_0594 +airplane_0595 +airplane_0596 +airplane_0597 +airplane_0598 +airplane_0599 +airplane_0600 +airplane_0601 +airplane_0602 +airplane_0603 +airplane_0604 +airplane_0605 +airplane_0606 +airplane_0607 +airplane_0608 +airplane_0609 +airplane_0610 +airplane_0611 +airplane_0612 +airplane_0613 +airplane_0614 +airplane_0615 +airplane_0616 +airplane_0617 +airplane_0618 +airplane_0619 +airplane_0620 +airplane_0621 +airplane_0622 +airplane_0623 +airplane_0624 +airplane_0625 +airplane_0626 +bathtub_0001 +bathtub_0002 +bathtub_0003 +bathtub_0004 +bathtub_0005 +bathtub_0006 +bathtub_0007 +bathtub_0008 +bathtub_0009 +bathtub_0010 +bathtub_0011 +bathtub_0012 +bathtub_0013 +bathtub_0014 +bathtub_0015 +bathtub_0016 +bathtub_0017 +bathtub_0018 +bathtub_0019 +bathtub_0020 +bathtub_0021 +bathtub_0022 +bathtub_0023 +bathtub_0024 +bathtub_0025 +bathtub_0026 +bathtub_0027 +bathtub_0028 +bathtub_0029 +bathtub_0030 +bathtub_0031 +bathtub_0032 +bathtub_0033 +bathtub_0034 +bathtub_0035 +bathtub_0036 +bathtub_0037 +bathtub_0038 +bathtub_0039 +bathtub_0040 +bathtub_0041 +bathtub_0042 +bathtub_0043 +bathtub_0044 +bathtub_0045 +bathtub_0046 +bathtub_0047 +bathtub_0048 +bathtub_0049 +bathtub_0050 +bathtub_0051 +bathtub_0052 +bathtub_0053 +bathtub_0054 +bathtub_0055 +bathtub_0056 +bathtub_0057 +bathtub_0058 +bathtub_0059 +bathtub_0060 +bathtub_0061 +bathtub_0062 +bathtub_0063 +bathtub_0064 +bathtub_0065 +bathtub_0066 +bathtub_0067 +bathtub_0068 +bathtub_0069 +bathtub_0070 +bathtub_0071 +bathtub_0072 +bathtub_0073 +bathtub_0074 +bathtub_0075 +bathtub_0076 +bathtub_0077 +bathtub_0078 +bathtub_0079 +bathtub_0080 +bathtub_0081 +bathtub_0082 +bathtub_0083 +bathtub_0084 +bathtub_0085 +bathtub_0086 +bathtub_0087 +bathtub_0088 +bathtub_0089 +bathtub_0090 +bathtub_0091 +bathtub_0092 +bathtub_0093 +bathtub_0094 +bathtub_0095 +bathtub_0096 +bathtub_0097 +bathtub_0098 +bathtub_0099 +bathtub_0100 +bathtub_0101 +bathtub_0102 +bathtub_0103 +bathtub_0104 +bathtub_0105 +bathtub_0106 +bed_0001 +bed_0002 +bed_0003 +bed_0004 +bed_0005 +bed_0006 +bed_0007 +bed_0008 +bed_0009 +bed_0010 +bed_0011 +bed_0012 +bed_0013 +bed_0014 +bed_0015 +bed_0016 +bed_0017 +bed_0018 +bed_0019 +bed_0020 +bed_0021 +bed_0022 +bed_0023 +bed_0024 +bed_0025 +bed_0026 +bed_0027 +bed_0028 +bed_0029 +bed_0030 +bed_0031 +bed_0032 +bed_0033 +bed_0034 +bed_0035 +bed_0036 +bed_0037 +bed_0038 +bed_0039 +bed_0040 +bed_0041 +bed_0042 +bed_0043 +bed_0044 +bed_0045 +bed_0046 +bed_0047 +bed_0048 +bed_0049 +bed_0050 +bed_0051 +bed_0052 +bed_0053 +bed_0054 +bed_0055 +bed_0056 +bed_0057 +bed_0058 +bed_0059 +bed_0060 +bed_0061 +bed_0062 +bed_0063 +bed_0064 +bed_0065 +bed_0066 +bed_0067 +bed_0068 +bed_0069 +bed_0070 +bed_0071 +bed_0072 +bed_0073 +bed_0074 +bed_0075 +bed_0076 +bed_0077 +bed_0078 +bed_0079 +bed_0080 +bed_0081 +bed_0082 +bed_0083 +bed_0084 +bed_0085 +bed_0086 +bed_0087 +bed_0088 +bed_0089 +bed_0090 +bed_0091 +bed_0092 +bed_0093 +bed_0094 +bed_0095 +bed_0096 +bed_0097 +bed_0098 +bed_0099 +bed_0100 +bed_0101 +bed_0102 +bed_0103 +bed_0104 +bed_0105 +bed_0106 +bed_0107 +bed_0108 +bed_0109 +bed_0110 +bed_0111 +bed_0112 +bed_0113 +bed_0114 +bed_0115 +bed_0116 +bed_0117 +bed_0118 +bed_0119 +bed_0120 +bed_0121 +bed_0122 +bed_0123 +bed_0124 +bed_0125 +bed_0126 +bed_0127 +bed_0128 +bed_0129 +bed_0130 +bed_0131 +bed_0132 +bed_0133 +bed_0134 +bed_0135 +bed_0136 +bed_0137 +bed_0138 +bed_0139 +bed_0140 +bed_0141 +bed_0142 +bed_0143 +bed_0144 +bed_0145 +bed_0146 +bed_0147 +bed_0148 +bed_0149 +bed_0150 +bed_0151 +bed_0152 +bed_0153 +bed_0154 +bed_0155 +bed_0156 +bed_0157 +bed_0158 +bed_0159 +bed_0160 +bed_0161 +bed_0162 +bed_0163 +bed_0164 +bed_0165 +bed_0166 +bed_0167 +bed_0168 +bed_0169 +bed_0170 +bed_0171 +bed_0172 +bed_0173 +bed_0174 +bed_0175 +bed_0176 +bed_0177 +bed_0178 +bed_0179 +bed_0180 +bed_0181 +bed_0182 +bed_0183 +bed_0184 +bed_0185 +bed_0186 +bed_0187 +bed_0188 +bed_0189 +bed_0190 +bed_0191 +bed_0192 +bed_0193 +bed_0194 +bed_0195 +bed_0196 +bed_0197 +bed_0198 +bed_0199 +bed_0200 +bed_0201 +bed_0202 +bed_0203 +bed_0204 +bed_0205 +bed_0206 +bed_0207 +bed_0208 +bed_0209 +bed_0210 +bed_0211 +bed_0212 +bed_0213 +bed_0214 +bed_0215 +bed_0216 +bed_0217 +bed_0218 +bed_0219 +bed_0220 +bed_0221 +bed_0222 +bed_0223 +bed_0224 +bed_0225 +bed_0226 +bed_0227 +bed_0228 +bed_0229 +bed_0230 +bed_0231 +bed_0232 +bed_0233 +bed_0234 +bed_0235 +bed_0236 +bed_0237 +bed_0238 +bed_0239 +bed_0240 +bed_0241 +bed_0242 +bed_0243 +bed_0244 +bed_0245 +bed_0246 +bed_0247 +bed_0248 +bed_0249 +bed_0250 +bed_0251 +bed_0252 +bed_0253 +bed_0254 +bed_0255 +bed_0256 +bed_0257 +bed_0258 +bed_0259 +bed_0260 +bed_0261 +bed_0262 +bed_0263 +bed_0264 +bed_0265 +bed_0266 +bed_0267 +bed_0268 +bed_0269 +bed_0270 +bed_0271 +bed_0272 +bed_0273 +bed_0274 +bed_0275 +bed_0276 +bed_0277 +bed_0278 +bed_0279 +bed_0280 +bed_0281 +bed_0282 +bed_0283 +bed_0284 +bed_0285 +bed_0286 +bed_0287 +bed_0288 +bed_0289 +bed_0290 +bed_0291 +bed_0292 +bed_0293 +bed_0294 +bed_0295 +bed_0296 +bed_0297 +bed_0298 +bed_0299 +bed_0300 +bed_0301 +bed_0302 +bed_0303 +bed_0304 +bed_0305 +bed_0306 +bed_0307 +bed_0308 +bed_0309 +bed_0310 +bed_0311 +bed_0312 +bed_0313 +bed_0314 +bed_0315 +bed_0316 +bed_0317 +bed_0318 +bed_0319 +bed_0320 +bed_0321 +bed_0322 +bed_0323 +bed_0324 +bed_0325 +bed_0326 +bed_0327 +bed_0328 +bed_0329 +bed_0330 +bed_0331 +bed_0332 +bed_0333 +bed_0334 +bed_0335 +bed_0336 +bed_0337 +bed_0338 +bed_0339 +bed_0340 +bed_0341 +bed_0342 +bed_0343 +bed_0344 +bed_0345 +bed_0346 +bed_0347 +bed_0348 +bed_0349 +bed_0350 +bed_0351 +bed_0352 +bed_0353 +bed_0354 +bed_0355 +bed_0356 +bed_0357 +bed_0358 +bed_0359 +bed_0360 +bed_0361 +bed_0362 +bed_0363 +bed_0364 +bed_0365 +bed_0366 +bed_0367 +bed_0368 +bed_0369 +bed_0370 +bed_0371 +bed_0372 +bed_0373 +bed_0374 +bed_0375 +bed_0376 +bed_0377 +bed_0378 +bed_0379 +bed_0380 +bed_0381 +bed_0382 +bed_0383 +bed_0384 +bed_0385 +bed_0386 +bed_0387 +bed_0388 +bed_0389 +bed_0390 +bed_0391 +bed_0392 +bed_0393 +bed_0394 +bed_0395 +bed_0396 +bed_0397 +bed_0398 +bed_0399 +bed_0400 +bed_0401 +bed_0402 +bed_0403 +bed_0404 +bed_0405 +bed_0406 +bed_0407 +bed_0408 +bed_0409 +bed_0410 +bed_0411 +bed_0412 +bed_0413 +bed_0414 +bed_0415 +bed_0416 +bed_0417 +bed_0418 +bed_0419 +bed_0420 +bed_0421 +bed_0422 +bed_0423 +bed_0424 +bed_0425 +bed_0426 +bed_0427 +bed_0428 +bed_0429 +bed_0430 +bed_0431 +bed_0432 +bed_0433 +bed_0434 +bed_0435 +bed_0436 +bed_0437 +bed_0438 +bed_0439 +bed_0440 +bed_0441 +bed_0442 +bed_0443 +bed_0444 +bed_0445 +bed_0446 +bed_0447 +bed_0448 +bed_0449 +bed_0450 +bed_0451 +bed_0452 +bed_0453 +bed_0454 +bed_0455 +bed_0456 +bed_0457 +bed_0458 +bed_0459 +bed_0460 +bed_0461 +bed_0462 +bed_0463 +bed_0464 +bed_0465 +bed_0466 +bed_0467 +bed_0468 +bed_0469 +bed_0470 +bed_0471 +bed_0472 +bed_0473 +bed_0474 +bed_0475 +bed_0476 +bed_0477 +bed_0478 +bed_0479 +bed_0480 +bed_0481 +bed_0482 +bed_0483 +bed_0484 +bed_0485 +bed_0486 +bed_0487 +bed_0488 +bed_0489 +bed_0490 +bed_0491 +bed_0492 +bed_0493 +bed_0494 +bed_0495 +bed_0496 +bed_0497 +bed_0498 +bed_0499 +bed_0500 +bed_0501 +bed_0502 +bed_0503 +bed_0504 +bed_0505 +bed_0506 +bed_0507 +bed_0508 +bed_0509 +bed_0510 +bed_0511 +bed_0512 +bed_0513 +bed_0514 +bed_0515 +bench_0001 +bench_0002 +bench_0003 +bench_0004 +bench_0005 +bench_0006 +bench_0007 +bench_0008 +bench_0009 +bench_0010 +bench_0011 +bench_0012 +bench_0013 +bench_0014 +bench_0015 +bench_0016 +bench_0017 +bench_0018 +bench_0019 +bench_0020 +bench_0021 +bench_0022 +bench_0023 +bench_0024 +bench_0025 +bench_0026 +bench_0027 +bench_0028 +bench_0029 +bench_0030 +bench_0031 +bench_0032 +bench_0033 +bench_0034 +bench_0035 +bench_0036 +bench_0037 +bench_0038 +bench_0039 +bench_0040 +bench_0041 +bench_0042 +bench_0043 +bench_0044 +bench_0045 +bench_0046 +bench_0047 +bench_0048 +bench_0049 +bench_0050 +bench_0051 +bench_0052 +bench_0053 +bench_0054 +bench_0055 +bench_0056 +bench_0057 +bench_0058 +bench_0059 +bench_0060 +bench_0061 +bench_0062 +bench_0063 +bench_0064 +bench_0065 +bench_0066 +bench_0067 +bench_0068 +bench_0069 +bench_0070 +bench_0071 +bench_0072 +bench_0073 +bench_0074 +bench_0075 +bench_0076 +bench_0077 +bench_0078 +bench_0079 +bench_0080 +bench_0081 +bench_0082 +bench_0083 +bench_0084 +bench_0085 +bench_0086 +bench_0087 +bench_0088 +bench_0089 +bench_0090 +bench_0091 +bench_0092 +bench_0093 +bench_0094 +bench_0095 +bench_0096 +bench_0097 +bench_0098 +bench_0099 +bench_0100 +bench_0101 +bench_0102 +bench_0103 +bench_0104 +bench_0105 +bench_0106 +bench_0107 +bench_0108 +bench_0109 +bench_0110 +bench_0111 +bench_0112 +bench_0113 +bench_0114 +bench_0115 +bench_0116 +bench_0117 +bench_0118 +bench_0119 +bench_0120 +bench_0121 +bench_0122 +bench_0123 +bench_0124 +bench_0125 +bench_0126 +bench_0127 +bench_0128 +bench_0129 +bench_0130 +bench_0131 +bench_0132 +bench_0133 +bench_0134 +bench_0135 +bench_0136 +bench_0137 +bench_0138 +bench_0139 +bench_0140 +bench_0141 +bench_0142 +bench_0143 +bench_0144 +bench_0145 +bench_0146 +bench_0147 +bench_0148 +bench_0149 +bench_0150 +bench_0151 +bench_0152 +bench_0153 +bench_0154 +bench_0155 +bench_0156 +bench_0157 +bench_0158 +bench_0159 +bench_0160 +bench_0161 +bench_0162 +bench_0163 +bench_0164 +bench_0165 +bench_0166 +bench_0167 +bench_0168 +bench_0169 +bench_0170 +bench_0171 +bench_0172 +bench_0173 +bookshelf_0001 +bookshelf_0002 +bookshelf_0003 +bookshelf_0004 +bookshelf_0005 +bookshelf_0006 +bookshelf_0007 +bookshelf_0008 +bookshelf_0009 +bookshelf_0010 +bookshelf_0011 +bookshelf_0012 +bookshelf_0013 +bookshelf_0014 +bookshelf_0015 +bookshelf_0016 +bookshelf_0017 +bookshelf_0018 +bookshelf_0019 +bookshelf_0020 +bookshelf_0021 +bookshelf_0022 +bookshelf_0023 +bookshelf_0024 +bookshelf_0025 +bookshelf_0026 +bookshelf_0027 +bookshelf_0028 +bookshelf_0029 +bookshelf_0030 +bookshelf_0031 +bookshelf_0032 +bookshelf_0033 +bookshelf_0034 +bookshelf_0035 +bookshelf_0036 +bookshelf_0037 +bookshelf_0038 +bookshelf_0039 +bookshelf_0040 +bookshelf_0041 +bookshelf_0042 +bookshelf_0043 +bookshelf_0044 +bookshelf_0045 +bookshelf_0046 +bookshelf_0047 +bookshelf_0048 +bookshelf_0049 +bookshelf_0050 +bookshelf_0051 +bookshelf_0052 +bookshelf_0053 +bookshelf_0054 +bookshelf_0055 +bookshelf_0056 +bookshelf_0057 +bookshelf_0058 +bookshelf_0059 +bookshelf_0060 +bookshelf_0061 +bookshelf_0062 +bookshelf_0063 +bookshelf_0064 +bookshelf_0065 +bookshelf_0066 +bookshelf_0067 +bookshelf_0068 +bookshelf_0069 +bookshelf_0070 +bookshelf_0071 +bookshelf_0072 +bookshelf_0073 +bookshelf_0074 +bookshelf_0075 +bookshelf_0076 +bookshelf_0077 +bookshelf_0078 +bookshelf_0079 +bookshelf_0080 +bookshelf_0081 +bookshelf_0082 +bookshelf_0083 +bookshelf_0084 +bookshelf_0085 +bookshelf_0086 +bookshelf_0087 +bookshelf_0088 +bookshelf_0089 +bookshelf_0090 +bookshelf_0091 +bookshelf_0092 +bookshelf_0093 +bookshelf_0094 +bookshelf_0095 +bookshelf_0096 +bookshelf_0097 +bookshelf_0098 +bookshelf_0099 +bookshelf_0100 +bookshelf_0101 +bookshelf_0102 +bookshelf_0103 +bookshelf_0104 +bookshelf_0105 +bookshelf_0106 +bookshelf_0107 +bookshelf_0108 +bookshelf_0109 +bookshelf_0110 +bookshelf_0111 +bookshelf_0112 +bookshelf_0113 +bookshelf_0114 +bookshelf_0115 +bookshelf_0116 +bookshelf_0117 +bookshelf_0118 +bookshelf_0119 +bookshelf_0120 +bookshelf_0121 +bookshelf_0122 +bookshelf_0123 +bookshelf_0124 +bookshelf_0125 +bookshelf_0126 +bookshelf_0127 +bookshelf_0128 +bookshelf_0129 +bookshelf_0130 +bookshelf_0131 +bookshelf_0132 +bookshelf_0133 +bookshelf_0134 +bookshelf_0135 +bookshelf_0136 +bookshelf_0137 +bookshelf_0138 +bookshelf_0139 +bookshelf_0140 +bookshelf_0141 +bookshelf_0142 +bookshelf_0143 +bookshelf_0144 +bookshelf_0145 +bookshelf_0146 +bookshelf_0147 +bookshelf_0148 +bookshelf_0149 +bookshelf_0150 +bookshelf_0151 +bookshelf_0152 +bookshelf_0153 +bookshelf_0154 +bookshelf_0155 +bookshelf_0156 +bookshelf_0157 +bookshelf_0158 +bookshelf_0159 +bookshelf_0160 +bookshelf_0161 +bookshelf_0162 +bookshelf_0163 +bookshelf_0164 +bookshelf_0165 +bookshelf_0166 +bookshelf_0167 +bookshelf_0168 +bookshelf_0169 +bookshelf_0170 +bookshelf_0171 +bookshelf_0172 +bookshelf_0173 +bookshelf_0174 +bookshelf_0175 +bookshelf_0176 +bookshelf_0177 +bookshelf_0178 +bookshelf_0179 +bookshelf_0180 +bookshelf_0181 +bookshelf_0182 +bookshelf_0183 +bookshelf_0184 +bookshelf_0185 +bookshelf_0186 +bookshelf_0187 +bookshelf_0188 +bookshelf_0189 +bookshelf_0190 +bookshelf_0191 +bookshelf_0192 +bookshelf_0193 +bookshelf_0194 +bookshelf_0195 +bookshelf_0196 +bookshelf_0197 +bookshelf_0198 +bookshelf_0199 +bookshelf_0200 +bookshelf_0201 +bookshelf_0202 +bookshelf_0203 +bookshelf_0204 +bookshelf_0205 +bookshelf_0206 +bookshelf_0207 +bookshelf_0208 +bookshelf_0209 +bookshelf_0210 +bookshelf_0211 +bookshelf_0212 +bookshelf_0213 +bookshelf_0214 +bookshelf_0215 +bookshelf_0216 +bookshelf_0217 +bookshelf_0218 +bookshelf_0219 +bookshelf_0220 +bookshelf_0221 +bookshelf_0222 +bookshelf_0223 +bookshelf_0224 +bookshelf_0225 +bookshelf_0226 +bookshelf_0227 +bookshelf_0228 +bookshelf_0229 +bookshelf_0230 +bookshelf_0231 +bookshelf_0232 +bookshelf_0233 +bookshelf_0234 +bookshelf_0235 +bookshelf_0236 +bookshelf_0237 +bookshelf_0238 +bookshelf_0239 +bookshelf_0240 +bookshelf_0241 +bookshelf_0242 +bookshelf_0243 +bookshelf_0244 +bookshelf_0245 +bookshelf_0246 +bookshelf_0247 +bookshelf_0248 +bookshelf_0249 +bookshelf_0250 +bookshelf_0251 +bookshelf_0252 +bookshelf_0253 +bookshelf_0254 +bookshelf_0255 +bookshelf_0256 +bookshelf_0257 +bookshelf_0258 +bookshelf_0259 +bookshelf_0260 +bookshelf_0261 +bookshelf_0262 +bookshelf_0263 +bookshelf_0264 +bookshelf_0265 +bookshelf_0266 +bookshelf_0267 +bookshelf_0268 +bookshelf_0269 +bookshelf_0270 +bookshelf_0271 +bookshelf_0272 +bookshelf_0273 +bookshelf_0274 +bookshelf_0275 +bookshelf_0276 +bookshelf_0277 +bookshelf_0278 +bookshelf_0279 +bookshelf_0280 +bookshelf_0281 +bookshelf_0282 +bookshelf_0283 +bookshelf_0284 +bookshelf_0285 +bookshelf_0286 +bookshelf_0287 +bookshelf_0288 +bookshelf_0289 +bookshelf_0290 +bookshelf_0291 +bookshelf_0292 +bookshelf_0293 +bookshelf_0294 +bookshelf_0295 +bookshelf_0296 +bookshelf_0297 +bookshelf_0298 +bookshelf_0299 +bookshelf_0300 +bookshelf_0301 +bookshelf_0302 +bookshelf_0303 +bookshelf_0304 +bookshelf_0305 +bookshelf_0306 +bookshelf_0307 +bookshelf_0308 +bookshelf_0309 +bookshelf_0310 +bookshelf_0311 +bookshelf_0312 +bookshelf_0313 +bookshelf_0314 +bookshelf_0315 +bookshelf_0316 +bookshelf_0317 +bookshelf_0318 +bookshelf_0319 +bookshelf_0320 +bookshelf_0321 +bookshelf_0322 +bookshelf_0323 +bookshelf_0324 +bookshelf_0325 +bookshelf_0326 +bookshelf_0327 +bookshelf_0328 +bookshelf_0329 +bookshelf_0330 +bookshelf_0331 +bookshelf_0332 +bookshelf_0333 +bookshelf_0334 +bookshelf_0335 +bookshelf_0336 +bookshelf_0337 +bookshelf_0338 +bookshelf_0339 +bookshelf_0340 +bookshelf_0341 +bookshelf_0342 +bookshelf_0343 +bookshelf_0344 +bookshelf_0345 +bookshelf_0346 +bookshelf_0347 +bookshelf_0348 +bookshelf_0349 +bookshelf_0350 +bookshelf_0351 +bookshelf_0352 +bookshelf_0353 +bookshelf_0354 +bookshelf_0355 +bookshelf_0356 +bookshelf_0357 +bookshelf_0358 +bookshelf_0359 +bookshelf_0360 +bookshelf_0361 +bookshelf_0362 +bookshelf_0363 +bookshelf_0364 +bookshelf_0365 +bookshelf_0366 +bookshelf_0367 +bookshelf_0368 +bookshelf_0369 +bookshelf_0370 +bookshelf_0371 +bookshelf_0372 +bookshelf_0373 +bookshelf_0374 +bookshelf_0375 +bookshelf_0376 +bookshelf_0377 +bookshelf_0378 +bookshelf_0379 +bookshelf_0380 +bookshelf_0381 +bookshelf_0382 +bookshelf_0383 +bookshelf_0384 +bookshelf_0385 +bookshelf_0386 +bookshelf_0387 +bookshelf_0388 +bookshelf_0389 +bookshelf_0390 +bookshelf_0391 +bookshelf_0392 +bookshelf_0393 +bookshelf_0394 +bookshelf_0395 +bookshelf_0396 +bookshelf_0397 +bookshelf_0398 +bookshelf_0399 +bookshelf_0400 +bookshelf_0401 +bookshelf_0402 +bookshelf_0403 +bookshelf_0404 +bookshelf_0405 +bookshelf_0406 +bookshelf_0407 +bookshelf_0408 +bookshelf_0409 +bookshelf_0410 +bookshelf_0411 +bookshelf_0412 +bookshelf_0413 +bookshelf_0414 +bookshelf_0415 +bookshelf_0416 +bookshelf_0417 +bookshelf_0418 +bookshelf_0419 +bookshelf_0420 +bookshelf_0421 +bookshelf_0422 +bookshelf_0423 +bookshelf_0424 +bookshelf_0425 +bookshelf_0426 +bookshelf_0427 +bookshelf_0428 +bookshelf_0429 +bookshelf_0430 +bookshelf_0431 +bookshelf_0432 +bookshelf_0433 +bookshelf_0434 +bookshelf_0435 +bookshelf_0436 +bookshelf_0437 +bookshelf_0438 +bookshelf_0439 +bookshelf_0440 +bookshelf_0441 +bookshelf_0442 +bookshelf_0443 +bookshelf_0444 +bookshelf_0445 +bookshelf_0446 +bookshelf_0447 +bookshelf_0448 +bookshelf_0449 +bookshelf_0450 +bookshelf_0451 +bookshelf_0452 +bookshelf_0453 +bookshelf_0454 +bookshelf_0455 +bookshelf_0456 +bookshelf_0457 +bookshelf_0458 +bookshelf_0459 +bookshelf_0460 +bookshelf_0461 +bookshelf_0462 +bookshelf_0463 +bookshelf_0464 +bookshelf_0465 +bookshelf_0466 +bookshelf_0467 +bookshelf_0468 +bookshelf_0469 +bookshelf_0470 +bookshelf_0471 +bookshelf_0472 +bookshelf_0473 +bookshelf_0474 +bookshelf_0475 +bookshelf_0476 +bookshelf_0477 +bookshelf_0478 +bookshelf_0479 +bookshelf_0480 +bookshelf_0481 +bookshelf_0482 +bookshelf_0483 +bookshelf_0484 +bookshelf_0485 +bookshelf_0486 +bookshelf_0487 +bookshelf_0488 +bookshelf_0489 +bookshelf_0490 +bookshelf_0491 +bookshelf_0492 +bookshelf_0493 +bookshelf_0494 +bookshelf_0495 +bookshelf_0496 +bookshelf_0497 +bookshelf_0498 +bookshelf_0499 +bookshelf_0500 +bookshelf_0501 +bookshelf_0502 +bookshelf_0503 +bookshelf_0504 +bookshelf_0505 +bookshelf_0506 +bookshelf_0507 +bookshelf_0508 +bookshelf_0509 +bookshelf_0510 +bookshelf_0511 +bookshelf_0512 +bookshelf_0513 +bookshelf_0514 +bookshelf_0515 +bookshelf_0516 +bookshelf_0517 +bookshelf_0518 +bookshelf_0519 +bookshelf_0520 +bookshelf_0521 +bookshelf_0522 +bookshelf_0523 +bookshelf_0524 +bookshelf_0525 +bookshelf_0526 +bookshelf_0527 +bookshelf_0528 +bookshelf_0529 +bookshelf_0530 +bookshelf_0531 +bookshelf_0532 +bookshelf_0533 +bookshelf_0534 +bookshelf_0535 +bookshelf_0536 +bookshelf_0537 +bookshelf_0538 +bookshelf_0539 +bookshelf_0540 +bookshelf_0541 +bookshelf_0542 +bookshelf_0543 +bookshelf_0544 +bookshelf_0545 +bookshelf_0546 +bookshelf_0547 +bookshelf_0548 +bookshelf_0549 +bookshelf_0550 +bookshelf_0551 +bookshelf_0552 +bookshelf_0553 +bookshelf_0554 +bookshelf_0555 +bookshelf_0556 +bookshelf_0557 +bookshelf_0558 +bookshelf_0559 +bookshelf_0560 +bookshelf_0561 +bookshelf_0562 +bookshelf_0563 +bookshelf_0564 +bookshelf_0565 +bookshelf_0566 +bookshelf_0567 +bookshelf_0568 +bookshelf_0569 +bookshelf_0570 +bookshelf_0571 +bookshelf_0572 +bottle_0001 +bottle_0002 +bottle_0003 +bottle_0004 +bottle_0005 +bottle_0006 +bottle_0007 +bottle_0008 +bottle_0009 +bottle_0010 +bottle_0011 +bottle_0012 +bottle_0013 +bottle_0014 +bottle_0015 +bottle_0016 +bottle_0017 +bottle_0018 +bottle_0019 +bottle_0020 +bottle_0021 +bottle_0022 +bottle_0023 +bottle_0024 +bottle_0025 +bottle_0026 +bottle_0027 +bottle_0028 +bottle_0029 +bottle_0030 +bottle_0031 +bottle_0032 +bottle_0033 +bottle_0034 +bottle_0035 +bottle_0036 +bottle_0037 +bottle_0038 +bottle_0039 +bottle_0040 +bottle_0041 +bottle_0042 +bottle_0043 +bottle_0044 +bottle_0045 +bottle_0046 +bottle_0047 +bottle_0048 +bottle_0049 +bottle_0050 +bottle_0051 +bottle_0052 +bottle_0053 +bottle_0054 +bottle_0055 +bottle_0056 +bottle_0057 +bottle_0058 +bottle_0059 +bottle_0060 +bottle_0061 +bottle_0062 +bottle_0063 +bottle_0064 +bottle_0065 +bottle_0066 +bottle_0067 +bottle_0068 +bottle_0069 +bottle_0070 +bottle_0071 +bottle_0072 +bottle_0073 +bottle_0074 +bottle_0075 +bottle_0076 +bottle_0077 +bottle_0078 +bottle_0079 +bottle_0080 +bottle_0081 +bottle_0082 +bottle_0083 +bottle_0084 +bottle_0085 +bottle_0086 +bottle_0087 +bottle_0088 +bottle_0089 +bottle_0090 +bottle_0091 +bottle_0092 +bottle_0093 +bottle_0094 +bottle_0095 +bottle_0096 +bottle_0097 +bottle_0098 +bottle_0099 +bottle_0100 +bottle_0101 +bottle_0102 +bottle_0103 +bottle_0104 +bottle_0105 +bottle_0106 +bottle_0107 +bottle_0108 +bottle_0109 +bottle_0110 +bottle_0111 +bottle_0112 +bottle_0113 +bottle_0114 +bottle_0115 +bottle_0116 +bottle_0117 +bottle_0118 +bottle_0119 +bottle_0120 +bottle_0121 +bottle_0122 +bottle_0123 +bottle_0124 +bottle_0125 +bottle_0126 +bottle_0127 +bottle_0128 +bottle_0129 +bottle_0130 +bottle_0131 +bottle_0132 +bottle_0133 +bottle_0134 +bottle_0135 +bottle_0136 +bottle_0137 +bottle_0138 +bottle_0139 +bottle_0140 +bottle_0141 +bottle_0142 +bottle_0143 +bottle_0144 +bottle_0145 +bottle_0146 +bottle_0147 +bottle_0148 +bottle_0149 +bottle_0150 +bottle_0151 +bottle_0152 +bottle_0153 +bottle_0154 +bottle_0155 +bottle_0156 +bottle_0157 +bottle_0158 +bottle_0159 +bottle_0160 +bottle_0161 +bottle_0162 +bottle_0163 +bottle_0164 +bottle_0165 +bottle_0166 +bottle_0167 +bottle_0168 +bottle_0169 +bottle_0170 +bottle_0171 +bottle_0172 +bottle_0173 +bottle_0174 +bottle_0175 +bottle_0176 +bottle_0177 +bottle_0178 +bottle_0179 +bottle_0180 +bottle_0181 +bottle_0182 +bottle_0183 +bottle_0184 +bottle_0185 +bottle_0186 +bottle_0187 +bottle_0188 +bottle_0189 +bottle_0190 +bottle_0191 +bottle_0192 +bottle_0193 +bottle_0194 +bottle_0195 +bottle_0196 +bottle_0197 +bottle_0198 +bottle_0199 +bottle_0200 +bottle_0201 +bottle_0202 +bottle_0203 +bottle_0204 +bottle_0205 +bottle_0206 +bottle_0207 +bottle_0208 +bottle_0209 +bottle_0210 +bottle_0211 +bottle_0212 +bottle_0213 +bottle_0214 +bottle_0215 +bottle_0216 +bottle_0217 +bottle_0218 +bottle_0219 +bottle_0220 +bottle_0221 +bottle_0222 +bottle_0223 +bottle_0224 +bottle_0225 +bottle_0226 +bottle_0227 +bottle_0228 +bottle_0229 +bottle_0230 +bottle_0231 +bottle_0232 +bottle_0233 +bottle_0234 +bottle_0235 +bottle_0236 +bottle_0237 +bottle_0238 +bottle_0239 +bottle_0240 +bottle_0241 +bottle_0242 +bottle_0243 +bottle_0244 +bottle_0245 +bottle_0246 +bottle_0247 +bottle_0248 +bottle_0249 +bottle_0250 +bottle_0251 +bottle_0252 +bottle_0253 +bottle_0254 +bottle_0255 +bottle_0256 +bottle_0257 +bottle_0258 +bottle_0259 +bottle_0260 +bottle_0261 +bottle_0262 +bottle_0263 +bottle_0264 +bottle_0265 +bottle_0266 +bottle_0267 +bottle_0268 +bottle_0269 +bottle_0270 +bottle_0271 +bottle_0272 +bottle_0273 +bottle_0274 +bottle_0275 +bottle_0276 +bottle_0277 +bottle_0278 +bottle_0279 +bottle_0280 +bottle_0281 +bottle_0282 +bottle_0283 +bottle_0284 +bottle_0285 +bottle_0286 +bottle_0287 +bottle_0288 +bottle_0289 +bottle_0290 +bottle_0291 +bottle_0292 +bottle_0293 +bottle_0294 +bottle_0295 +bottle_0296 +bottle_0297 +bottle_0298 +bottle_0299 +bottle_0300 +bottle_0301 +bottle_0302 +bottle_0303 +bottle_0304 +bottle_0305 +bottle_0306 +bottle_0307 +bottle_0308 +bottle_0309 +bottle_0310 +bottle_0311 +bottle_0312 +bottle_0313 +bottle_0314 +bottle_0315 +bottle_0316 +bottle_0317 +bottle_0318 +bottle_0319 +bottle_0320 +bottle_0321 +bottle_0322 +bottle_0323 +bottle_0324 +bottle_0325 +bottle_0326 +bottle_0327 +bottle_0328 +bottle_0329 +bottle_0330 +bottle_0331 +bottle_0332 +bottle_0333 +bottle_0334 +bottle_0335 +bowl_0001 +bowl_0002 +bowl_0003 +bowl_0004 +bowl_0005 +bowl_0006 +bowl_0007 +bowl_0008 +bowl_0009 +bowl_0010 +bowl_0011 +bowl_0012 +bowl_0013 +bowl_0014 +bowl_0015 +bowl_0016 +bowl_0017 +bowl_0018 +bowl_0019 +bowl_0020 +bowl_0021 +bowl_0022 +bowl_0023 +bowl_0024 +bowl_0025 +bowl_0026 +bowl_0027 +bowl_0028 +bowl_0029 +bowl_0030 +bowl_0031 +bowl_0032 +bowl_0033 +bowl_0034 +bowl_0035 +bowl_0036 +bowl_0037 +bowl_0038 +bowl_0039 +bowl_0040 +bowl_0041 +bowl_0042 +bowl_0043 +bowl_0044 +bowl_0045 +bowl_0046 +bowl_0047 +bowl_0048 +bowl_0049 +bowl_0050 +bowl_0051 +bowl_0052 +bowl_0053 +bowl_0054 +bowl_0055 +bowl_0056 +bowl_0057 +bowl_0058 +bowl_0059 +bowl_0060 +bowl_0061 +bowl_0062 +bowl_0063 +bowl_0064 +car_0001 +car_0002 +car_0003 +car_0004 +car_0005 +car_0006 +car_0007 +car_0008 +car_0009 +car_0010 +car_0011 +car_0012 +car_0013 +car_0014 +car_0015 +car_0016 +car_0017 +car_0018 +car_0019 +car_0020 +car_0021 +car_0022 +car_0023 +car_0024 +car_0025 +car_0026 +car_0027 +car_0028 +car_0029 +car_0030 +car_0031 +car_0032 +car_0033 +car_0034 +car_0035 +car_0036 +car_0037 +car_0038 +car_0039 +car_0040 +car_0041 +car_0042 +car_0043 +car_0044 +car_0045 +car_0046 +car_0047 +car_0048 +car_0049 +car_0050 +car_0051 +car_0052 +car_0053 +car_0054 +car_0055 +car_0056 +car_0057 +car_0058 +car_0059 +car_0060 +car_0061 +car_0062 +car_0063 +car_0064 +car_0065 +car_0066 +car_0067 +car_0068 +car_0069 +car_0070 +car_0071 +car_0072 +car_0073 +car_0074 +car_0075 +car_0076 +car_0077 +car_0078 +car_0079 +car_0080 +car_0081 +car_0082 +car_0083 +car_0084 +car_0085 +car_0086 +car_0087 +car_0088 +car_0089 +car_0090 +car_0091 +car_0092 +car_0093 +car_0094 +car_0095 +car_0096 +car_0097 +car_0098 +car_0099 +car_0100 +car_0101 +car_0102 +car_0103 +car_0104 +car_0105 +car_0106 +car_0107 +car_0108 +car_0109 +car_0110 +car_0111 +car_0112 +car_0113 +car_0114 +car_0115 +car_0116 +car_0117 +car_0118 +car_0119 +car_0120 +car_0121 +car_0122 +car_0123 +car_0124 +car_0125 +car_0126 +car_0127 +car_0128 +car_0129 +car_0130 +car_0131 +car_0132 +car_0133 +car_0134 +car_0135 +car_0136 +car_0137 +car_0138 +car_0139 +car_0140 +car_0141 +car_0142 +car_0143 +car_0144 +car_0145 +car_0146 +car_0147 +car_0148 +car_0149 +car_0150 +car_0151 +car_0152 +car_0153 +car_0154 +car_0155 +car_0156 +car_0157 +car_0158 +car_0159 +car_0160 +car_0161 +car_0162 +car_0163 +car_0164 +car_0165 +car_0166 +car_0167 +car_0168 +car_0169 +car_0170 +car_0171 +car_0172 +car_0173 +car_0174 +car_0175 +car_0176 +car_0177 +car_0178 +car_0179 +car_0180 +car_0181 +car_0182 +car_0183 +car_0184 +car_0185 +car_0186 +car_0187 +car_0188 +car_0189 +car_0190 +car_0191 +car_0192 +car_0193 +car_0194 +car_0195 +car_0196 +car_0197 +chair_0001 +chair_0002 +chair_0003 +chair_0004 +chair_0005 +chair_0006 +chair_0007 +chair_0008 +chair_0009 +chair_0010 +chair_0011 +chair_0012 +chair_0013 +chair_0014 +chair_0015 +chair_0016 +chair_0017 +chair_0018 +chair_0019 +chair_0020 +chair_0021 +chair_0022 +chair_0023 +chair_0024 +chair_0025 +chair_0026 +chair_0027 +chair_0028 +chair_0029 +chair_0030 +chair_0031 +chair_0032 +chair_0033 +chair_0034 +chair_0035 +chair_0036 +chair_0037 +chair_0038 +chair_0039 +chair_0040 +chair_0041 +chair_0042 +chair_0043 +chair_0044 +chair_0045 +chair_0046 +chair_0047 +chair_0048 +chair_0049 +chair_0050 +chair_0051 +chair_0052 +chair_0053 +chair_0054 +chair_0055 +chair_0056 +chair_0057 +chair_0058 +chair_0059 +chair_0060 +chair_0061 +chair_0062 +chair_0063 +chair_0064 +chair_0065 +chair_0066 +chair_0067 +chair_0068 +chair_0069 +chair_0070 +chair_0071 +chair_0072 +chair_0073 +chair_0074 +chair_0075 +chair_0076 +chair_0077 +chair_0078 +chair_0079 +chair_0080 +chair_0081 +chair_0082 +chair_0083 +chair_0084 +chair_0085 +chair_0086 +chair_0087 +chair_0088 +chair_0089 +chair_0090 +chair_0091 +chair_0092 +chair_0093 +chair_0094 +chair_0095 +chair_0096 +chair_0097 +chair_0098 +chair_0099 +chair_0100 +chair_0101 +chair_0102 +chair_0103 +chair_0104 +chair_0105 +chair_0106 +chair_0107 +chair_0108 +chair_0109 +chair_0110 +chair_0111 +chair_0112 +chair_0113 +chair_0114 +chair_0115 +chair_0116 +chair_0117 +chair_0118 +chair_0119 +chair_0120 +chair_0121 +chair_0122 +chair_0123 +chair_0124 +chair_0125 +chair_0126 +chair_0127 +chair_0128 +chair_0129 +chair_0130 +chair_0131 +chair_0132 +chair_0133 +chair_0134 +chair_0135 +chair_0136 +chair_0137 +chair_0138 +chair_0139 +chair_0140 +chair_0141 +chair_0142 +chair_0143 +chair_0144 +chair_0145 +chair_0146 +chair_0147 +chair_0148 +chair_0149 +chair_0150 +chair_0151 +chair_0152 +chair_0153 +chair_0154 +chair_0155 +chair_0156 +chair_0157 +chair_0158 +chair_0159 +chair_0160 +chair_0161 +chair_0162 +chair_0163 +chair_0164 +chair_0165 +chair_0166 +chair_0167 +chair_0168 +chair_0169 +chair_0170 +chair_0171 +chair_0172 +chair_0173 +chair_0174 +chair_0175 +chair_0176 +chair_0177 +chair_0178 +chair_0179 +chair_0180 +chair_0181 +chair_0182 +chair_0183 +chair_0184 +chair_0185 +chair_0186 +chair_0187 +chair_0188 +chair_0189 +chair_0190 +chair_0191 +chair_0192 +chair_0193 +chair_0194 +chair_0195 +chair_0196 +chair_0197 +chair_0198 +chair_0199 +chair_0200 +chair_0201 +chair_0202 +chair_0203 +chair_0204 +chair_0205 +chair_0206 +chair_0207 +chair_0208 +chair_0209 +chair_0210 +chair_0211 +chair_0212 +chair_0213 +chair_0214 +chair_0215 +chair_0216 +chair_0217 +chair_0218 +chair_0219 +chair_0220 +chair_0221 +chair_0222 +chair_0223 +chair_0224 +chair_0225 +chair_0226 +chair_0227 +chair_0228 +chair_0229 +chair_0230 +chair_0231 +chair_0232 +chair_0233 +chair_0234 +chair_0235 +chair_0236 +chair_0237 +chair_0238 +chair_0239 +chair_0240 +chair_0241 +chair_0242 +chair_0243 +chair_0244 +chair_0245 +chair_0246 +chair_0247 +chair_0248 +chair_0249 +chair_0250 +chair_0251 +chair_0252 +chair_0253 +chair_0254 +chair_0255 +chair_0256 +chair_0257 +chair_0258 +chair_0259 +chair_0260 +chair_0261 +chair_0262 +chair_0263 +chair_0264 +chair_0265 +chair_0266 +chair_0267 +chair_0268 +chair_0269 +chair_0270 +chair_0271 +chair_0272 +chair_0273 +chair_0274 +chair_0275 +chair_0276 +chair_0277 +chair_0278 +chair_0279 +chair_0280 +chair_0281 +chair_0282 +chair_0283 +chair_0284 +chair_0285 +chair_0286 +chair_0287 +chair_0288 +chair_0289 +chair_0290 +chair_0291 +chair_0292 +chair_0293 +chair_0294 +chair_0295 +chair_0296 +chair_0297 +chair_0298 +chair_0299 +chair_0300 +chair_0301 +chair_0302 +chair_0303 +chair_0304 +chair_0305 +chair_0306 +chair_0307 +chair_0308 +chair_0309 +chair_0310 +chair_0311 +chair_0312 +chair_0313 +chair_0314 +chair_0315 +chair_0316 +chair_0317 +chair_0318 +chair_0319 +chair_0320 +chair_0321 +chair_0322 +chair_0323 +chair_0324 +chair_0325 +chair_0326 +chair_0327 +chair_0328 +chair_0329 +chair_0330 +chair_0331 +chair_0332 +chair_0333 +chair_0334 +chair_0335 +chair_0336 +chair_0337 +chair_0338 +chair_0339 +chair_0340 +chair_0341 +chair_0342 +chair_0343 +chair_0344 +chair_0345 +chair_0346 +chair_0347 +chair_0348 +chair_0349 +chair_0350 +chair_0351 +chair_0352 +chair_0353 +chair_0354 +chair_0355 +chair_0356 +chair_0357 +chair_0358 +chair_0359 +chair_0360 +chair_0361 +chair_0362 +chair_0363 +chair_0364 +chair_0365 +chair_0366 +chair_0367 +chair_0368 +chair_0369 +chair_0370 +chair_0371 +chair_0372 +chair_0373 +chair_0374 +chair_0375 +chair_0376 +chair_0377 +chair_0378 +chair_0379 +chair_0380 +chair_0381 +chair_0382 +chair_0383 +chair_0384 +chair_0385 +chair_0386 +chair_0387 +chair_0388 +chair_0389 +chair_0390 +chair_0391 +chair_0392 +chair_0393 +chair_0394 +chair_0395 +chair_0396 +chair_0397 +chair_0398 +chair_0399 +chair_0400 +chair_0401 +chair_0402 +chair_0403 +chair_0404 +chair_0405 +chair_0406 +chair_0407 +chair_0408 +chair_0409 +chair_0410 +chair_0411 +chair_0412 +chair_0413 +chair_0414 +chair_0415 +chair_0416 +chair_0417 +chair_0418 +chair_0419 +chair_0420 +chair_0421 +chair_0422 +chair_0423 +chair_0424 +chair_0425 +chair_0426 +chair_0427 +chair_0428 +chair_0429 +chair_0430 +chair_0431 +chair_0432 +chair_0433 +chair_0434 +chair_0435 +chair_0436 +chair_0437 +chair_0438 +chair_0439 +chair_0440 +chair_0441 +chair_0442 +chair_0443 +chair_0444 +chair_0445 +chair_0446 +chair_0447 +chair_0448 +chair_0449 +chair_0450 +chair_0451 +chair_0452 +chair_0453 +chair_0454 +chair_0455 +chair_0456 +chair_0457 +chair_0458 +chair_0459 +chair_0460 +chair_0461 +chair_0462 +chair_0463 +chair_0464 +chair_0465 +chair_0466 +chair_0467 +chair_0468 +chair_0469 +chair_0470 +chair_0471 +chair_0472 +chair_0473 +chair_0474 +chair_0475 +chair_0476 +chair_0477 +chair_0478 +chair_0479 +chair_0480 +chair_0481 +chair_0482 +chair_0483 +chair_0484 +chair_0485 +chair_0486 +chair_0487 +chair_0488 +chair_0489 +chair_0490 +chair_0491 +chair_0492 +chair_0493 +chair_0494 +chair_0495 +chair_0496 +chair_0497 +chair_0498 +chair_0499 +chair_0500 +chair_0501 +chair_0502 +chair_0503 +chair_0504 +chair_0505 +chair_0506 +chair_0507 +chair_0508 +chair_0509 +chair_0510 +chair_0511 +chair_0512 +chair_0513 +chair_0514 +chair_0515 +chair_0516 +chair_0517 +chair_0518 +chair_0519 +chair_0520 +chair_0521 +chair_0522 +chair_0523 +chair_0524 +chair_0525 +chair_0526 +chair_0527 +chair_0528 +chair_0529 +chair_0530 +chair_0531 +chair_0532 +chair_0533 +chair_0534 +chair_0535 +chair_0536 +chair_0537 +chair_0538 +chair_0539 +chair_0540 +chair_0541 +chair_0542 +chair_0543 +chair_0544 +chair_0545 +chair_0546 +chair_0547 +chair_0548 +chair_0549 +chair_0550 +chair_0551 +chair_0552 +chair_0553 +chair_0554 +chair_0555 +chair_0556 +chair_0557 +chair_0558 +chair_0559 +chair_0560 +chair_0561 +chair_0562 +chair_0563 +chair_0564 +chair_0565 +chair_0566 +chair_0567 +chair_0568 +chair_0569 +chair_0570 +chair_0571 +chair_0572 +chair_0573 +chair_0574 +chair_0575 +chair_0576 +chair_0577 +chair_0578 +chair_0579 +chair_0580 +chair_0581 +chair_0582 +chair_0583 +chair_0584 +chair_0585 +chair_0586 +chair_0587 +chair_0588 +chair_0589 +chair_0590 +chair_0591 +chair_0592 +chair_0593 +chair_0594 +chair_0595 +chair_0596 +chair_0597 +chair_0598 +chair_0599 +chair_0600 +chair_0601 +chair_0602 +chair_0603 +chair_0604 +chair_0605 +chair_0606 +chair_0607 +chair_0608 +chair_0609 +chair_0610 +chair_0611 +chair_0612 +chair_0613 +chair_0614 +chair_0615 +chair_0616 +chair_0617 +chair_0618 +chair_0619 +chair_0620 +chair_0621 +chair_0622 +chair_0623 +chair_0624 +chair_0625 +chair_0626 +chair_0627 +chair_0628 +chair_0629 +chair_0630 +chair_0631 +chair_0632 +chair_0633 +chair_0634 +chair_0635 +chair_0636 +chair_0637 +chair_0638 +chair_0639 +chair_0640 +chair_0641 +chair_0642 +chair_0643 +chair_0644 +chair_0645 +chair_0646 +chair_0647 +chair_0648 +chair_0649 +chair_0650 +chair_0651 +chair_0652 +chair_0653 +chair_0654 +chair_0655 +chair_0656 +chair_0657 +chair_0658 +chair_0659 +chair_0660 +chair_0661 +chair_0662 +chair_0663 +chair_0664 +chair_0665 +chair_0666 +chair_0667 +chair_0668 +chair_0669 +chair_0670 +chair_0671 +chair_0672 +chair_0673 +chair_0674 +chair_0675 +chair_0676 +chair_0677 +chair_0678 +chair_0679 +chair_0680 +chair_0681 +chair_0682 +chair_0683 +chair_0684 +chair_0685 +chair_0686 +chair_0687 +chair_0688 +chair_0689 +chair_0690 +chair_0691 +chair_0692 +chair_0693 +chair_0694 +chair_0695 +chair_0696 +chair_0697 +chair_0698 +chair_0699 +chair_0700 +chair_0701 +chair_0702 +chair_0703 +chair_0704 +chair_0705 +chair_0706 +chair_0707 +chair_0708 +chair_0709 +chair_0710 +chair_0711 +chair_0712 +chair_0713 +chair_0714 +chair_0715 +chair_0716 +chair_0717 +chair_0718 +chair_0719 +chair_0720 +chair_0721 +chair_0722 +chair_0723 +chair_0724 +chair_0725 +chair_0726 +chair_0727 +chair_0728 +chair_0729 +chair_0730 +chair_0731 +chair_0732 +chair_0733 +chair_0734 +chair_0735 +chair_0736 +chair_0737 +chair_0738 +chair_0739 +chair_0740 +chair_0741 +chair_0742 +chair_0743 +chair_0744 +chair_0745 +chair_0746 +chair_0747 +chair_0748 +chair_0749 +chair_0750 +chair_0751 +chair_0752 +chair_0753 +chair_0754 +chair_0755 +chair_0756 +chair_0757 +chair_0758 +chair_0759 +chair_0760 +chair_0761 +chair_0762 +chair_0763 +chair_0764 +chair_0765 +chair_0766 +chair_0767 +chair_0768 +chair_0769 +chair_0770 +chair_0771 +chair_0772 +chair_0773 +chair_0774 +chair_0775 +chair_0776 +chair_0777 +chair_0778 +chair_0779 +chair_0780 +chair_0781 +chair_0782 +chair_0783 +chair_0784 +chair_0785 +chair_0786 +chair_0787 +chair_0788 +chair_0789 +chair_0790 +chair_0791 +chair_0792 +chair_0793 +chair_0794 +chair_0795 +chair_0796 +chair_0797 +chair_0798 +chair_0799 +chair_0800 +chair_0801 +chair_0802 +chair_0803 +chair_0804 +chair_0805 +chair_0806 +chair_0807 +chair_0808 +chair_0809 +chair_0810 +chair_0811 +chair_0812 +chair_0813 +chair_0814 +chair_0815 +chair_0816 +chair_0817 +chair_0818 +chair_0819 +chair_0820 +chair_0821 +chair_0822 +chair_0823 +chair_0824 +chair_0825 +chair_0826 +chair_0827 +chair_0828 +chair_0829 +chair_0830 +chair_0831 +chair_0832 +chair_0833 +chair_0834 +chair_0835 +chair_0836 +chair_0837 +chair_0838 +chair_0839 +chair_0840 +chair_0841 +chair_0842 +chair_0843 +chair_0844 +chair_0845 +chair_0846 +chair_0847 +chair_0848 +chair_0849 +chair_0850 +chair_0851 +chair_0852 +chair_0853 +chair_0854 +chair_0855 +chair_0856 +chair_0857 +chair_0858 +chair_0859 +chair_0860 +chair_0861 +chair_0862 +chair_0863 +chair_0864 +chair_0865 +chair_0866 +chair_0867 +chair_0868 +chair_0869 +chair_0870 +chair_0871 +chair_0872 +chair_0873 +chair_0874 +chair_0875 +chair_0876 +chair_0877 +chair_0878 +chair_0879 +chair_0880 +chair_0881 +chair_0882 +chair_0883 +chair_0884 +chair_0885 +chair_0886 +chair_0887 +chair_0888 +chair_0889 +cone_0001 +cone_0002 +cone_0003 +cone_0004 +cone_0005 +cone_0006 +cone_0007 +cone_0008 +cone_0009 +cone_0010 +cone_0011 +cone_0012 +cone_0013 +cone_0014 +cone_0015 +cone_0016 +cone_0017 +cone_0018 +cone_0019 +cone_0020 +cone_0021 +cone_0022 +cone_0023 +cone_0024 +cone_0025 +cone_0026 +cone_0027 +cone_0028 +cone_0029 +cone_0030 +cone_0031 +cone_0032 +cone_0033 +cone_0034 +cone_0035 +cone_0036 +cone_0037 +cone_0038 +cone_0039 +cone_0040 +cone_0041 +cone_0042 +cone_0043 +cone_0044 +cone_0045 +cone_0046 +cone_0047 +cone_0048 +cone_0049 +cone_0050 +cone_0051 +cone_0052 +cone_0053 +cone_0054 +cone_0055 +cone_0056 +cone_0057 +cone_0058 +cone_0059 +cone_0060 +cone_0061 +cone_0062 +cone_0063 +cone_0064 +cone_0065 +cone_0066 +cone_0067 +cone_0068 +cone_0069 +cone_0070 +cone_0071 +cone_0072 +cone_0073 +cone_0074 +cone_0075 +cone_0076 +cone_0077 +cone_0078 +cone_0079 +cone_0080 +cone_0081 +cone_0082 +cone_0083 +cone_0084 +cone_0085 +cone_0086 +cone_0087 +cone_0088 +cone_0089 +cone_0090 +cone_0091 +cone_0092 +cone_0093 +cone_0094 +cone_0095 +cone_0096 +cone_0097 +cone_0098 +cone_0099 +cone_0100 +cone_0101 +cone_0102 +cone_0103 +cone_0104 +cone_0105 +cone_0106 +cone_0107 +cone_0108 +cone_0109 +cone_0110 +cone_0111 +cone_0112 +cone_0113 +cone_0114 +cone_0115 +cone_0116 +cone_0117 +cone_0118 +cone_0119 +cone_0120 +cone_0121 +cone_0122 +cone_0123 +cone_0124 +cone_0125 +cone_0126 +cone_0127 +cone_0128 +cone_0129 +cone_0130 +cone_0131 +cone_0132 +cone_0133 +cone_0134 +cone_0135 +cone_0136 +cone_0137 +cone_0138 +cone_0139 +cone_0140 +cone_0141 +cone_0142 +cone_0143 +cone_0144 +cone_0145 +cone_0146 +cone_0147 +cone_0148 +cone_0149 +cone_0150 +cone_0151 +cone_0152 +cone_0153 +cone_0154 +cone_0155 +cone_0156 +cone_0157 +cone_0158 +cone_0159 +cone_0160 +cone_0161 +cone_0162 +cone_0163 +cone_0164 +cone_0165 +cone_0166 +cone_0167 +cup_0001 +cup_0002 +cup_0003 +cup_0004 +cup_0005 +cup_0006 +cup_0007 +cup_0008 +cup_0009 +cup_0010 +cup_0011 +cup_0012 +cup_0013 +cup_0014 +cup_0015 +cup_0016 +cup_0017 +cup_0018 +cup_0019 +cup_0020 +cup_0021 +cup_0022 +cup_0023 +cup_0024 +cup_0025 +cup_0026 +cup_0027 +cup_0028 +cup_0029 +cup_0030 +cup_0031 +cup_0032 +cup_0033 +cup_0034 +cup_0035 +cup_0036 +cup_0037 +cup_0038 +cup_0039 +cup_0040 +cup_0041 +cup_0042 +cup_0043 +cup_0044 +cup_0045 +cup_0046 +cup_0047 +cup_0048 +cup_0049 +cup_0050 +cup_0051 +cup_0052 +cup_0053 +cup_0054 +cup_0055 +cup_0056 +cup_0057 +cup_0058 +cup_0059 +cup_0060 +cup_0061 +cup_0062 +cup_0063 +cup_0064 +cup_0065 +cup_0066 +cup_0067 +cup_0068 +cup_0069 +cup_0070 +cup_0071 +cup_0072 +cup_0073 +cup_0074 +cup_0075 +cup_0076 +cup_0077 +cup_0078 +cup_0079 +curtain_0001 +curtain_0002 +curtain_0003 +curtain_0004 +curtain_0005 +curtain_0006 +curtain_0007 +curtain_0008 +curtain_0009 +curtain_0010 +curtain_0011 +curtain_0012 +curtain_0013 +curtain_0014 +curtain_0015 +curtain_0016 +curtain_0017 +curtain_0018 +curtain_0019 +curtain_0020 +curtain_0021 +curtain_0022 +curtain_0023 +curtain_0024 +curtain_0025 +curtain_0026 +curtain_0027 +curtain_0028 +curtain_0029 +curtain_0030 +curtain_0031 +curtain_0032 +curtain_0033 +curtain_0034 +curtain_0035 +curtain_0036 +curtain_0037 +curtain_0038 +curtain_0039 +curtain_0040 +curtain_0041 +curtain_0042 +curtain_0043 +curtain_0044 +curtain_0045 +curtain_0046 +curtain_0047 +curtain_0048 +curtain_0049 +curtain_0050 +curtain_0051 +curtain_0052 +curtain_0053 +curtain_0054 +curtain_0055 +curtain_0056 +curtain_0057 +curtain_0058 +curtain_0059 +curtain_0060 +curtain_0061 +curtain_0062 +curtain_0063 +curtain_0064 +curtain_0065 +curtain_0066 +curtain_0067 +curtain_0068 +curtain_0069 +curtain_0070 +curtain_0071 +curtain_0072 +curtain_0073 +curtain_0074 +curtain_0075 +curtain_0076 +curtain_0077 +curtain_0078 +curtain_0079 +curtain_0080 +curtain_0081 +curtain_0082 +curtain_0083 +curtain_0084 +curtain_0085 +curtain_0086 +curtain_0087 +curtain_0088 +curtain_0089 +curtain_0090 +curtain_0091 +curtain_0092 +curtain_0093 +curtain_0094 +curtain_0095 +curtain_0096 +curtain_0097 +curtain_0098 +curtain_0099 +curtain_0100 +curtain_0101 +curtain_0102 +curtain_0103 +curtain_0104 +curtain_0105 +curtain_0106 +curtain_0107 +curtain_0108 +curtain_0109 +curtain_0110 +curtain_0111 +curtain_0112 +curtain_0113 +curtain_0114 +curtain_0115 +curtain_0116 +curtain_0117 +curtain_0118 +curtain_0119 +curtain_0120 +curtain_0121 +curtain_0122 +curtain_0123 +curtain_0124 +curtain_0125 +curtain_0126 +curtain_0127 +curtain_0128 +curtain_0129 +curtain_0130 +curtain_0131 +curtain_0132 +curtain_0133 +curtain_0134 +curtain_0135 +curtain_0136 +curtain_0137 +curtain_0138 +desk_0001 +desk_0002 +desk_0003 +desk_0004 +desk_0005 +desk_0006 +desk_0007 +desk_0008 +desk_0009 +desk_0010 +desk_0011 +desk_0012 +desk_0013 +desk_0014 +desk_0015 +desk_0016 +desk_0017 +desk_0018 +desk_0019 +desk_0020 +desk_0021 +desk_0022 +desk_0023 +desk_0024 +desk_0025 +desk_0026 +desk_0027 +desk_0028 +desk_0029 +desk_0030 +desk_0031 +desk_0032 +desk_0033 +desk_0034 +desk_0035 +desk_0036 +desk_0037 +desk_0038 +desk_0039 +desk_0040 +desk_0041 +desk_0042 +desk_0043 +desk_0044 +desk_0045 +desk_0046 +desk_0047 +desk_0048 +desk_0049 +desk_0050 +desk_0051 +desk_0052 +desk_0053 +desk_0054 +desk_0055 +desk_0056 +desk_0057 +desk_0058 +desk_0059 +desk_0060 +desk_0061 +desk_0062 +desk_0063 +desk_0064 +desk_0065 +desk_0066 +desk_0067 +desk_0068 +desk_0069 +desk_0070 +desk_0071 +desk_0072 +desk_0073 +desk_0074 +desk_0075 +desk_0076 +desk_0077 +desk_0078 +desk_0079 +desk_0080 +desk_0081 +desk_0082 +desk_0083 +desk_0084 +desk_0085 +desk_0086 +desk_0087 +desk_0088 +desk_0089 +desk_0090 +desk_0091 +desk_0092 +desk_0093 +desk_0094 +desk_0095 +desk_0096 +desk_0097 +desk_0098 +desk_0099 +desk_0100 +desk_0101 +desk_0102 +desk_0103 +desk_0104 +desk_0105 +desk_0106 +desk_0107 +desk_0108 +desk_0109 +desk_0110 +desk_0111 +desk_0112 +desk_0113 +desk_0114 +desk_0115 +desk_0116 +desk_0117 +desk_0118 +desk_0119 +desk_0120 +desk_0121 +desk_0122 +desk_0123 +desk_0124 +desk_0125 +desk_0126 +desk_0127 +desk_0128 +desk_0129 +desk_0130 +desk_0131 +desk_0132 +desk_0133 +desk_0134 +desk_0135 +desk_0136 +desk_0137 +desk_0138 +desk_0139 +desk_0140 +desk_0141 +desk_0142 +desk_0143 +desk_0144 +desk_0145 +desk_0146 +desk_0147 +desk_0148 +desk_0149 +desk_0150 +desk_0151 +desk_0152 +desk_0153 +desk_0154 +desk_0155 +desk_0156 +desk_0157 +desk_0158 +desk_0159 +desk_0160 +desk_0161 +desk_0162 +desk_0163 +desk_0164 +desk_0165 +desk_0166 +desk_0167 +desk_0168 +desk_0169 +desk_0170 +desk_0171 +desk_0172 +desk_0173 +desk_0174 +desk_0175 +desk_0176 +desk_0177 +desk_0178 +desk_0179 +desk_0180 +desk_0181 +desk_0182 +desk_0183 +desk_0184 +desk_0185 +desk_0186 +desk_0187 +desk_0188 +desk_0189 +desk_0190 +desk_0191 +desk_0192 +desk_0193 +desk_0194 +desk_0195 +desk_0196 +desk_0197 +desk_0198 +desk_0199 +desk_0200 +door_0001 +door_0002 +door_0003 +door_0004 +door_0005 +door_0006 +door_0007 +door_0008 +door_0009 +door_0010 +door_0011 +door_0012 +door_0013 +door_0014 +door_0015 +door_0016 +door_0017 +door_0018 +door_0019 +door_0020 +door_0021 +door_0022 +door_0023 +door_0024 +door_0025 +door_0026 +door_0027 +door_0028 +door_0029 +door_0030 +door_0031 +door_0032 +door_0033 +door_0034 +door_0035 +door_0036 +door_0037 +door_0038 +door_0039 +door_0040 +door_0041 +door_0042 +door_0043 +door_0044 +door_0045 +door_0046 +door_0047 +door_0048 +door_0049 +door_0050 +door_0051 +door_0052 +door_0053 +door_0054 +door_0055 +door_0056 +door_0057 +door_0058 +door_0059 +door_0060 +door_0061 +door_0062 +door_0063 +door_0064 +door_0065 +door_0066 +door_0067 +door_0068 +door_0069 +door_0070 +door_0071 +door_0072 +door_0073 +door_0074 +door_0075 +door_0076 +door_0077 +door_0078 +door_0079 +door_0080 +door_0081 +door_0082 +door_0083 +door_0084 +door_0085 +door_0086 +door_0087 +door_0088 +door_0089 +door_0090 +door_0091 +door_0092 +door_0093 +door_0094 +door_0095 +door_0096 +door_0097 +door_0098 +door_0099 +door_0100 +door_0101 +door_0102 +door_0103 +door_0104 +door_0105 +door_0106 +door_0107 +door_0108 +door_0109 +dresser_0001 +dresser_0002 +dresser_0003 +dresser_0004 +dresser_0005 +dresser_0006 +dresser_0007 +dresser_0008 +dresser_0009 +dresser_0010 +dresser_0011 +dresser_0012 +dresser_0013 +dresser_0014 +dresser_0015 +dresser_0016 +dresser_0017 +dresser_0018 +dresser_0019 +dresser_0020 +dresser_0021 +dresser_0022 +dresser_0023 +dresser_0024 +dresser_0025 +dresser_0026 +dresser_0027 +dresser_0028 +dresser_0029 +dresser_0030 +dresser_0031 +dresser_0032 +dresser_0033 +dresser_0034 +dresser_0035 +dresser_0036 +dresser_0037 +dresser_0038 +dresser_0039 +dresser_0040 +dresser_0041 +dresser_0042 +dresser_0043 +dresser_0044 +dresser_0045 +dresser_0046 +dresser_0047 +dresser_0048 +dresser_0049 +dresser_0050 +dresser_0051 +dresser_0052 +dresser_0053 +dresser_0054 +dresser_0055 +dresser_0056 +dresser_0057 +dresser_0058 +dresser_0059 +dresser_0060 +dresser_0061 +dresser_0062 +dresser_0063 +dresser_0064 +dresser_0065 +dresser_0066 +dresser_0067 +dresser_0068 +dresser_0069 +dresser_0070 +dresser_0071 +dresser_0072 +dresser_0073 +dresser_0074 +dresser_0075 +dresser_0076 +dresser_0077 +dresser_0078 +dresser_0079 +dresser_0080 +dresser_0081 +dresser_0082 +dresser_0083 +dresser_0084 +dresser_0085 +dresser_0086 +dresser_0087 +dresser_0088 +dresser_0089 +dresser_0090 +dresser_0091 +dresser_0092 +dresser_0093 +dresser_0094 +dresser_0095 +dresser_0096 +dresser_0097 +dresser_0098 +dresser_0099 +dresser_0100 +dresser_0101 +dresser_0102 +dresser_0103 +dresser_0104 +dresser_0105 +dresser_0106 +dresser_0107 +dresser_0108 +dresser_0109 +dresser_0110 +dresser_0111 +dresser_0112 +dresser_0113 +dresser_0114 +dresser_0115 +dresser_0116 +dresser_0117 +dresser_0118 +dresser_0119 +dresser_0120 +dresser_0121 +dresser_0122 +dresser_0123 +dresser_0124 +dresser_0125 +dresser_0126 +dresser_0127 +dresser_0128 +dresser_0129 +dresser_0130 +dresser_0131 +dresser_0132 +dresser_0133 +dresser_0134 +dresser_0135 +dresser_0136 +dresser_0137 +dresser_0138 +dresser_0139 +dresser_0140 +dresser_0141 +dresser_0142 +dresser_0143 +dresser_0144 +dresser_0145 +dresser_0146 +dresser_0147 +dresser_0148 +dresser_0149 +dresser_0150 +dresser_0151 +dresser_0152 +dresser_0153 +dresser_0154 +dresser_0155 +dresser_0156 +dresser_0157 +dresser_0158 +dresser_0159 +dresser_0160 +dresser_0161 +dresser_0162 +dresser_0163 +dresser_0164 +dresser_0165 +dresser_0166 +dresser_0167 +dresser_0168 +dresser_0169 +dresser_0170 +dresser_0171 +dresser_0172 +dresser_0173 +dresser_0174 +dresser_0175 +dresser_0176 +dresser_0177 +dresser_0178 +dresser_0179 +dresser_0180 +dresser_0181 +dresser_0182 +dresser_0183 +dresser_0184 +dresser_0185 +dresser_0186 +dresser_0187 +dresser_0188 +dresser_0189 +dresser_0190 +dresser_0191 +dresser_0192 +dresser_0193 +dresser_0194 +dresser_0195 +dresser_0196 +dresser_0197 +dresser_0198 +dresser_0199 +dresser_0200 +flower_pot_0001 +flower_pot_0002 +flower_pot_0003 +flower_pot_0004 +flower_pot_0005 +flower_pot_0006 +flower_pot_0007 +flower_pot_0008 +flower_pot_0009 +flower_pot_0010 +flower_pot_0011 +flower_pot_0012 +flower_pot_0013 +flower_pot_0014 +flower_pot_0015 +flower_pot_0016 +flower_pot_0017 +flower_pot_0018 +flower_pot_0019 +flower_pot_0020 +flower_pot_0021 +flower_pot_0022 +flower_pot_0023 +flower_pot_0024 +flower_pot_0025 +flower_pot_0026 +flower_pot_0027 +flower_pot_0028 +flower_pot_0029 +flower_pot_0030 +flower_pot_0031 +flower_pot_0032 +flower_pot_0033 +flower_pot_0034 +flower_pot_0035 +flower_pot_0036 +flower_pot_0037 +flower_pot_0038 +flower_pot_0039 +flower_pot_0040 +flower_pot_0041 +flower_pot_0042 +flower_pot_0043 +flower_pot_0044 +flower_pot_0045 +flower_pot_0046 +flower_pot_0047 +flower_pot_0048 +flower_pot_0049 +flower_pot_0050 +flower_pot_0051 +flower_pot_0052 +flower_pot_0053 +flower_pot_0054 +flower_pot_0055 +flower_pot_0056 +flower_pot_0057 +flower_pot_0058 +flower_pot_0059 +flower_pot_0060 +flower_pot_0061 +flower_pot_0062 +flower_pot_0063 +flower_pot_0064 +flower_pot_0065 +flower_pot_0066 +flower_pot_0067 +flower_pot_0068 +flower_pot_0069 +flower_pot_0070 +flower_pot_0071 +flower_pot_0072 +flower_pot_0073 +flower_pot_0074 +flower_pot_0075 +flower_pot_0076 +flower_pot_0077 +flower_pot_0078 +flower_pot_0079 +flower_pot_0080 +flower_pot_0081 +flower_pot_0082 +flower_pot_0083 +flower_pot_0084 +flower_pot_0085 +flower_pot_0086 +flower_pot_0087 +flower_pot_0088 +flower_pot_0089 +flower_pot_0090 +flower_pot_0091 +flower_pot_0092 +flower_pot_0093 +flower_pot_0094 +flower_pot_0095 +flower_pot_0096 +flower_pot_0097 +flower_pot_0098 +flower_pot_0099 +flower_pot_0100 +flower_pot_0101 +flower_pot_0102 +flower_pot_0103 +flower_pot_0104 +flower_pot_0105 +flower_pot_0106 +flower_pot_0107 +flower_pot_0108 +flower_pot_0109 +flower_pot_0110 +flower_pot_0111 +flower_pot_0112 +flower_pot_0113 +flower_pot_0114 +flower_pot_0115 +flower_pot_0116 +flower_pot_0117 +flower_pot_0118 +flower_pot_0119 +flower_pot_0120 +flower_pot_0121 +flower_pot_0122 +flower_pot_0123 +flower_pot_0124 +flower_pot_0125 +flower_pot_0126 +flower_pot_0127 +flower_pot_0128 +flower_pot_0129 +flower_pot_0130 +flower_pot_0131 +flower_pot_0132 +flower_pot_0133 +flower_pot_0134 +flower_pot_0135 +flower_pot_0136 +flower_pot_0137 +flower_pot_0138 +flower_pot_0139 +flower_pot_0140 +flower_pot_0141 +flower_pot_0142 +flower_pot_0143 +flower_pot_0144 +flower_pot_0145 +flower_pot_0146 +flower_pot_0147 +flower_pot_0148 +flower_pot_0149 +glass_box_0001 +glass_box_0002 +glass_box_0003 +glass_box_0004 +glass_box_0005 +glass_box_0006 +glass_box_0007 +glass_box_0008 +glass_box_0009 +glass_box_0010 +glass_box_0011 +glass_box_0012 +glass_box_0013 +glass_box_0014 +glass_box_0015 +glass_box_0016 +glass_box_0017 +glass_box_0018 +glass_box_0019 +glass_box_0020 +glass_box_0021 +glass_box_0022 +glass_box_0023 +glass_box_0024 +glass_box_0025 +glass_box_0026 +glass_box_0027 +glass_box_0028 +glass_box_0029 +glass_box_0030 +glass_box_0031 +glass_box_0032 +glass_box_0033 +glass_box_0034 +glass_box_0035 +glass_box_0036 +glass_box_0037 +glass_box_0038 +glass_box_0039 +glass_box_0040 +glass_box_0041 +glass_box_0042 +glass_box_0043 +glass_box_0044 +glass_box_0045 +glass_box_0046 +glass_box_0047 +glass_box_0048 +glass_box_0049 +glass_box_0050 +glass_box_0051 +glass_box_0052 +glass_box_0053 +glass_box_0054 +glass_box_0055 +glass_box_0056 +glass_box_0057 +glass_box_0058 +glass_box_0059 +glass_box_0060 +glass_box_0061 +glass_box_0062 +glass_box_0063 +glass_box_0064 +glass_box_0065 +glass_box_0066 +glass_box_0067 +glass_box_0068 +glass_box_0069 +glass_box_0070 +glass_box_0071 +glass_box_0072 +glass_box_0073 +glass_box_0074 +glass_box_0075 +glass_box_0076 +glass_box_0077 +glass_box_0078 +glass_box_0079 +glass_box_0080 +glass_box_0081 +glass_box_0082 +glass_box_0083 +glass_box_0084 +glass_box_0085 +glass_box_0086 +glass_box_0087 +glass_box_0088 +glass_box_0089 +glass_box_0090 +glass_box_0091 +glass_box_0092 +glass_box_0093 +glass_box_0094 +glass_box_0095 +glass_box_0096 +glass_box_0097 +glass_box_0098 +glass_box_0099 +glass_box_0100 +glass_box_0101 +glass_box_0102 +glass_box_0103 +glass_box_0104 +glass_box_0105 +glass_box_0106 +glass_box_0107 +glass_box_0108 +glass_box_0109 +glass_box_0110 +glass_box_0111 +glass_box_0112 +glass_box_0113 +glass_box_0114 +glass_box_0115 +glass_box_0116 +glass_box_0117 +glass_box_0118 +glass_box_0119 +glass_box_0120 +glass_box_0121 +glass_box_0122 +glass_box_0123 +glass_box_0124 +glass_box_0125 +glass_box_0126 +glass_box_0127 +glass_box_0128 +glass_box_0129 +glass_box_0130 +glass_box_0131 +glass_box_0132 +glass_box_0133 +glass_box_0134 +glass_box_0135 +glass_box_0136 +glass_box_0137 +glass_box_0138 +glass_box_0139 +glass_box_0140 +glass_box_0141 +glass_box_0142 +glass_box_0143 +glass_box_0144 +glass_box_0145 +glass_box_0146 +glass_box_0147 +glass_box_0148 +glass_box_0149 +glass_box_0150 +glass_box_0151 +glass_box_0152 +glass_box_0153 +glass_box_0154 +glass_box_0155 +glass_box_0156 +glass_box_0157 +glass_box_0158 +glass_box_0159 +glass_box_0160 +glass_box_0161 +glass_box_0162 +glass_box_0163 +glass_box_0164 +glass_box_0165 +glass_box_0166 +glass_box_0167 +glass_box_0168 +glass_box_0169 +glass_box_0170 +glass_box_0171 +guitar_0001 +guitar_0002 +guitar_0003 +guitar_0004 +guitar_0005 +guitar_0006 +guitar_0007 +guitar_0008 +guitar_0009 +guitar_0010 +guitar_0011 +guitar_0012 +guitar_0013 +guitar_0014 +guitar_0015 +guitar_0016 +guitar_0017 +guitar_0018 +guitar_0019 +guitar_0020 +guitar_0021 +guitar_0022 +guitar_0023 +guitar_0024 +guitar_0025 +guitar_0026 +guitar_0027 +guitar_0028 +guitar_0029 +guitar_0030 +guitar_0031 +guitar_0032 +guitar_0033 +guitar_0034 +guitar_0035 +guitar_0036 +guitar_0037 +guitar_0038 +guitar_0039 +guitar_0040 +guitar_0041 +guitar_0042 +guitar_0043 +guitar_0044 +guitar_0045 +guitar_0046 +guitar_0047 +guitar_0048 +guitar_0049 +guitar_0050 +guitar_0051 +guitar_0052 +guitar_0053 +guitar_0054 +guitar_0055 +guitar_0056 +guitar_0057 +guitar_0058 +guitar_0059 +guitar_0060 +guitar_0061 +guitar_0062 +guitar_0063 +guitar_0064 +guitar_0065 +guitar_0066 +guitar_0067 +guitar_0068 +guitar_0069 +guitar_0070 +guitar_0071 +guitar_0072 +guitar_0073 +guitar_0074 +guitar_0075 +guitar_0076 +guitar_0077 +guitar_0078 +guitar_0079 +guitar_0080 +guitar_0081 +guitar_0082 +guitar_0083 +guitar_0084 +guitar_0085 +guitar_0086 +guitar_0087 +guitar_0088 +guitar_0089 +guitar_0090 +guitar_0091 +guitar_0092 +guitar_0093 +guitar_0094 +guitar_0095 +guitar_0096 +guitar_0097 +guitar_0098 +guitar_0099 +guitar_0100 +guitar_0101 +guitar_0102 +guitar_0103 +guitar_0104 +guitar_0105 +guitar_0106 +guitar_0107 +guitar_0108 +guitar_0109 +guitar_0110 +guitar_0111 +guitar_0112 +guitar_0113 +guitar_0114 +guitar_0115 +guitar_0116 +guitar_0117 +guitar_0118 +guitar_0119 +guitar_0120 +guitar_0121 +guitar_0122 +guitar_0123 +guitar_0124 +guitar_0125 +guitar_0126 +guitar_0127 +guitar_0128 +guitar_0129 +guitar_0130 +guitar_0131 +guitar_0132 +guitar_0133 +guitar_0134 +guitar_0135 +guitar_0136 +guitar_0137 +guitar_0138 +guitar_0139 +guitar_0140 +guitar_0141 +guitar_0142 +guitar_0143 +guitar_0144 +guitar_0145 +guitar_0146 +guitar_0147 +guitar_0148 +guitar_0149 +guitar_0150 +guitar_0151 +guitar_0152 +guitar_0153 +guitar_0154 +guitar_0155 +keyboard_0001 +keyboard_0002 +keyboard_0003 +keyboard_0004 +keyboard_0005 +keyboard_0006 +keyboard_0007 +keyboard_0008 +keyboard_0009 +keyboard_0010 +keyboard_0011 +keyboard_0012 +keyboard_0013 +keyboard_0014 +keyboard_0015 +keyboard_0016 +keyboard_0017 +keyboard_0018 +keyboard_0019 +keyboard_0020 +keyboard_0021 +keyboard_0022 +keyboard_0023 +keyboard_0024 +keyboard_0025 +keyboard_0026 +keyboard_0027 +keyboard_0028 +keyboard_0029 +keyboard_0030 +keyboard_0031 +keyboard_0032 +keyboard_0033 +keyboard_0034 +keyboard_0035 +keyboard_0036 +keyboard_0037 +keyboard_0038 +keyboard_0039 +keyboard_0040 +keyboard_0041 +keyboard_0042 +keyboard_0043 +keyboard_0044 +keyboard_0045 +keyboard_0046 +keyboard_0047 +keyboard_0048 +keyboard_0049 +keyboard_0050 +keyboard_0051 +keyboard_0052 +keyboard_0053 +keyboard_0054 +keyboard_0055 +keyboard_0056 +keyboard_0057 +keyboard_0058 +keyboard_0059 +keyboard_0060 +keyboard_0061 +keyboard_0062 +keyboard_0063 +keyboard_0064 +keyboard_0065 +keyboard_0066 +keyboard_0067 +keyboard_0068 +keyboard_0069 +keyboard_0070 +keyboard_0071 +keyboard_0072 +keyboard_0073 +keyboard_0074 +keyboard_0075 +keyboard_0076 +keyboard_0077 +keyboard_0078 +keyboard_0079 +keyboard_0080 +keyboard_0081 +keyboard_0082 +keyboard_0083 +keyboard_0084 +keyboard_0085 +keyboard_0086 +keyboard_0087 +keyboard_0088 +keyboard_0089 +keyboard_0090 +keyboard_0091 +keyboard_0092 +keyboard_0093 +keyboard_0094 +keyboard_0095 +keyboard_0096 +keyboard_0097 +keyboard_0098 +keyboard_0099 +keyboard_0100 +keyboard_0101 +keyboard_0102 +keyboard_0103 +keyboard_0104 +keyboard_0105 +keyboard_0106 +keyboard_0107 +keyboard_0108 +keyboard_0109 +keyboard_0110 +keyboard_0111 +keyboard_0112 +keyboard_0113 +keyboard_0114 +keyboard_0115 +keyboard_0116 +keyboard_0117 +keyboard_0118 +keyboard_0119 +keyboard_0120 +keyboard_0121 +keyboard_0122 +keyboard_0123 +keyboard_0124 +keyboard_0125 +keyboard_0126 +keyboard_0127 +keyboard_0128 +keyboard_0129 +keyboard_0130 +keyboard_0131 +keyboard_0132 +keyboard_0133 +keyboard_0134 +keyboard_0135 +keyboard_0136 +keyboard_0137 +keyboard_0138 +keyboard_0139 +keyboard_0140 +keyboard_0141 +keyboard_0142 +keyboard_0143 +keyboard_0144 +keyboard_0145 +lamp_0001 +lamp_0002 +lamp_0003 +lamp_0004 +lamp_0005 +lamp_0006 +lamp_0007 +lamp_0008 +lamp_0009 +lamp_0010 +lamp_0011 +lamp_0012 +lamp_0013 +lamp_0014 +lamp_0015 +lamp_0016 +lamp_0017 +lamp_0018 +lamp_0019 +lamp_0020 +lamp_0021 +lamp_0022 +lamp_0023 +lamp_0024 +lamp_0025 +lamp_0026 +lamp_0027 +lamp_0028 +lamp_0029 +lamp_0030 +lamp_0031 +lamp_0032 +lamp_0033 +lamp_0034 +lamp_0035 +lamp_0036 +lamp_0037 +lamp_0038 +lamp_0039 +lamp_0040 +lamp_0041 +lamp_0042 +lamp_0043 +lamp_0044 +lamp_0045 +lamp_0046 +lamp_0047 +lamp_0048 +lamp_0049 +lamp_0050 +lamp_0051 +lamp_0052 +lamp_0053 +lamp_0054 +lamp_0055 +lamp_0056 +lamp_0057 +lamp_0058 +lamp_0059 +lamp_0060 +lamp_0061 +lamp_0062 +lamp_0063 +lamp_0064 +lamp_0065 +lamp_0066 +lamp_0067 +lamp_0068 +lamp_0069 +lamp_0070 +lamp_0071 +lamp_0072 +lamp_0073 +lamp_0074 +lamp_0075 +lamp_0076 +lamp_0077 +lamp_0078 +lamp_0079 +lamp_0080 +lamp_0081 +lamp_0082 +lamp_0083 +lamp_0084 +lamp_0085 +lamp_0086 +lamp_0087 +lamp_0088 +lamp_0089 +lamp_0090 +lamp_0091 +lamp_0092 +lamp_0093 +lamp_0094 +lamp_0095 +lamp_0096 +lamp_0097 +lamp_0098 +lamp_0099 +lamp_0100 +lamp_0101 +lamp_0102 +lamp_0103 +lamp_0104 +lamp_0105 +lamp_0106 +lamp_0107 +lamp_0108 +lamp_0109 +lamp_0110 +lamp_0111 +lamp_0112 +lamp_0113 +lamp_0114 +lamp_0115 +lamp_0116 +lamp_0117 +lamp_0118 +lamp_0119 +lamp_0120 +lamp_0121 +lamp_0122 +lamp_0123 +lamp_0124 +laptop_0001 +laptop_0002 +laptop_0003 +laptop_0004 +laptop_0005 +laptop_0006 +laptop_0007 +laptop_0008 +laptop_0009 +laptop_0010 +laptop_0011 +laptop_0012 +laptop_0013 +laptop_0014 +laptop_0015 +laptop_0016 +laptop_0017 +laptop_0018 +laptop_0019 +laptop_0020 +laptop_0021 +laptop_0022 +laptop_0023 +laptop_0024 +laptop_0025 +laptop_0026 +laptop_0027 +laptop_0028 +laptop_0029 +laptop_0030 +laptop_0031 +laptop_0032 +laptop_0033 +laptop_0034 +laptop_0035 +laptop_0036 +laptop_0037 +laptop_0038 +laptop_0039 +laptop_0040 +laptop_0041 +laptop_0042 +laptop_0043 +laptop_0044 +laptop_0045 +laptop_0046 +laptop_0047 +laptop_0048 +laptop_0049 +laptop_0050 +laptop_0051 +laptop_0052 +laptop_0053 +laptop_0054 +laptop_0055 +laptop_0056 +laptop_0057 +laptop_0058 +laptop_0059 +laptop_0060 +laptop_0061 +laptop_0062 +laptop_0063 +laptop_0064 +laptop_0065 +laptop_0066 +laptop_0067 +laptop_0068 +laptop_0069 +laptop_0070 +laptop_0071 +laptop_0072 +laptop_0073 +laptop_0074 +laptop_0075 +laptop_0076 +laptop_0077 +laptop_0078 +laptop_0079 +laptop_0080 +laptop_0081 +laptop_0082 +laptop_0083 +laptop_0084 +laptop_0085 +laptop_0086 +laptop_0087 +laptop_0088 +laptop_0089 +laptop_0090 +laptop_0091 +laptop_0092 +laptop_0093 +laptop_0094 +laptop_0095 +laptop_0096 +laptop_0097 +laptop_0098 +laptop_0099 +laptop_0100 +laptop_0101 +laptop_0102 +laptop_0103 +laptop_0104 +laptop_0105 +laptop_0106 +laptop_0107 +laptop_0108 +laptop_0109 +laptop_0110 +laptop_0111 +laptop_0112 +laptop_0113 +laptop_0114 +laptop_0115 +laptop_0116 +laptop_0117 +laptop_0118 +laptop_0119 +laptop_0120 +laptop_0121 +laptop_0122 +laptop_0123 +laptop_0124 +laptop_0125 +laptop_0126 +laptop_0127 +laptop_0128 +laptop_0129 +laptop_0130 +laptop_0131 +laptop_0132 +laptop_0133 +laptop_0134 +laptop_0135 +laptop_0136 +laptop_0137 +laptop_0138 +laptop_0139 +laptop_0140 +laptop_0141 +laptop_0142 +laptop_0143 +laptop_0144 +laptop_0145 +laptop_0146 +laptop_0147 +laptop_0148 +laptop_0149 +mantel_0001 +mantel_0002 +mantel_0003 +mantel_0004 +mantel_0005 +mantel_0006 +mantel_0007 +mantel_0008 +mantel_0009 +mantel_0010 +mantel_0011 +mantel_0012 +mantel_0013 +mantel_0014 +mantel_0015 +mantel_0016 +mantel_0017 +mantel_0018 +mantel_0019 +mantel_0020 +mantel_0021 +mantel_0022 +mantel_0023 +mantel_0024 +mantel_0025 +mantel_0026 +mantel_0027 +mantel_0028 +mantel_0029 +mantel_0030 +mantel_0031 +mantel_0032 +mantel_0033 +mantel_0034 +mantel_0035 +mantel_0036 +mantel_0037 +mantel_0038 +mantel_0039 +mantel_0040 +mantel_0041 +mantel_0042 +mantel_0043 +mantel_0044 +mantel_0045 +mantel_0046 +mantel_0047 +mantel_0048 +mantel_0049 +mantel_0050 +mantel_0051 +mantel_0052 +mantel_0053 +mantel_0054 +mantel_0055 +mantel_0056 +mantel_0057 +mantel_0058 +mantel_0059 +mantel_0060 +mantel_0061 +mantel_0062 +mantel_0063 +mantel_0064 +mantel_0065 +mantel_0066 +mantel_0067 +mantel_0068 +mantel_0069 +mantel_0070 +mantel_0071 +mantel_0072 +mantel_0073 +mantel_0074 +mantel_0075 +mantel_0076 +mantel_0077 +mantel_0078 +mantel_0079 +mantel_0080 +mantel_0081 +mantel_0082 +mantel_0083 +mantel_0084 +mantel_0085 +mantel_0086 +mantel_0087 +mantel_0088 +mantel_0089 +mantel_0090 +mantel_0091 +mantel_0092 +mantel_0093 +mantel_0094 +mantel_0095 +mantel_0096 +mantel_0097 +mantel_0098 +mantel_0099 +mantel_0100 +mantel_0101 +mantel_0102 +mantel_0103 +mantel_0104 +mantel_0105 +mantel_0106 +mantel_0107 +mantel_0108 +mantel_0109 +mantel_0110 +mantel_0111 +mantel_0112 +mantel_0113 +mantel_0114 +mantel_0115 +mantel_0116 +mantel_0117 +mantel_0118 +mantel_0119 +mantel_0120 +mantel_0121 +mantel_0122 +mantel_0123 +mantel_0124 +mantel_0125 +mantel_0126 +mantel_0127 +mantel_0128 +mantel_0129 +mantel_0130 +mantel_0131 +mantel_0132 +mantel_0133 +mantel_0134 +mantel_0135 +mantel_0136 +mantel_0137 +mantel_0138 +mantel_0139 +mantel_0140 +mantel_0141 +mantel_0142 +mantel_0143 +mantel_0144 +mantel_0145 +mantel_0146 +mantel_0147 +mantel_0148 +mantel_0149 +mantel_0150 +mantel_0151 +mantel_0152 +mantel_0153 +mantel_0154 +mantel_0155 +mantel_0156 +mantel_0157 +mantel_0158 +mantel_0159 +mantel_0160 +mantel_0161 +mantel_0162 +mantel_0163 +mantel_0164 +mantel_0165 +mantel_0166 +mantel_0167 +mantel_0168 +mantel_0169 +mantel_0170 +mantel_0171 +mantel_0172 +mantel_0173 +mantel_0174 +mantel_0175 +mantel_0176 +mantel_0177 +mantel_0178 +mantel_0179 +mantel_0180 +mantel_0181 +mantel_0182 +mantel_0183 +mantel_0184 +mantel_0185 +mantel_0186 +mantel_0187 +mantel_0188 +mantel_0189 +mantel_0190 +mantel_0191 +mantel_0192 +mantel_0193 +mantel_0194 +mantel_0195 +mantel_0196 +mantel_0197 +mantel_0198 +mantel_0199 +mantel_0200 +mantel_0201 +mantel_0202 +mantel_0203 +mantel_0204 +mantel_0205 +mantel_0206 +mantel_0207 +mantel_0208 +mantel_0209 +mantel_0210 +mantel_0211 +mantel_0212 +mantel_0213 +mantel_0214 +mantel_0215 +mantel_0216 +mantel_0217 +mantel_0218 +mantel_0219 +mantel_0220 +mantel_0221 +mantel_0222 +mantel_0223 +mantel_0224 +mantel_0225 +mantel_0226 +mantel_0227 +mantel_0228 +mantel_0229 +mantel_0230 +mantel_0231 +mantel_0232 +mantel_0233 +mantel_0234 +mantel_0235 +mantel_0236 +mantel_0237 +mantel_0238 +mantel_0239 +mantel_0240 +mantel_0241 +mantel_0242 +mantel_0243 +mantel_0244 +mantel_0245 +mantel_0246 +mantel_0247 +mantel_0248 +mantel_0249 +mantel_0250 +mantel_0251 +mantel_0252 +mantel_0253 +mantel_0254 +mantel_0255 +mantel_0256 +mantel_0257 +mantel_0258 +mantel_0259 +mantel_0260 +mantel_0261 +mantel_0262 +mantel_0263 +mantel_0264 +mantel_0265 +mantel_0266 +mantel_0267 +mantel_0268 +mantel_0269 +mantel_0270 +mantel_0271 +mantel_0272 +mantel_0273 +mantel_0274 +mantel_0275 +mantel_0276 +mantel_0277 +mantel_0278 +mantel_0279 +mantel_0280 +mantel_0281 +mantel_0282 +mantel_0283 +mantel_0284 +monitor_0001 +monitor_0002 +monitor_0003 +monitor_0004 +monitor_0005 +monitor_0006 +monitor_0007 +monitor_0008 +monitor_0009 +monitor_0010 +monitor_0011 +monitor_0012 +monitor_0013 +monitor_0014 +monitor_0015 +monitor_0016 +monitor_0017 +monitor_0018 +monitor_0019 +monitor_0020 +monitor_0021 +monitor_0022 +monitor_0023 +monitor_0024 +monitor_0025 +monitor_0026 +monitor_0027 +monitor_0028 +monitor_0029 +monitor_0030 +monitor_0031 +monitor_0032 +monitor_0033 +monitor_0034 +monitor_0035 +monitor_0036 +monitor_0037 +monitor_0038 +monitor_0039 +monitor_0040 +monitor_0041 +monitor_0042 +monitor_0043 +monitor_0044 +monitor_0045 +monitor_0046 +monitor_0047 +monitor_0048 +monitor_0049 +monitor_0050 +monitor_0051 +monitor_0052 +monitor_0053 +monitor_0054 +monitor_0055 +monitor_0056 +monitor_0057 +monitor_0058 +monitor_0059 +monitor_0060 +monitor_0061 +monitor_0062 +monitor_0063 +monitor_0064 +monitor_0065 +monitor_0066 +monitor_0067 +monitor_0068 +monitor_0069 +monitor_0070 +monitor_0071 +monitor_0072 +monitor_0073 +monitor_0074 +monitor_0075 +monitor_0076 +monitor_0077 +monitor_0078 +monitor_0079 +monitor_0080 +monitor_0081 +monitor_0082 +monitor_0083 +monitor_0084 +monitor_0085 +monitor_0086 +monitor_0087 +monitor_0088 +monitor_0089 +monitor_0090 +monitor_0091 +monitor_0092 +monitor_0093 +monitor_0094 +monitor_0095 +monitor_0096 +monitor_0097 +monitor_0098 +monitor_0099 +monitor_0100 +monitor_0101 +monitor_0102 +monitor_0103 +monitor_0104 +monitor_0105 +monitor_0106 +monitor_0107 +monitor_0108 +monitor_0109 +monitor_0110 +monitor_0111 +monitor_0112 +monitor_0113 +monitor_0114 +monitor_0115 +monitor_0116 +monitor_0117 +monitor_0118 +monitor_0119 +monitor_0120 +monitor_0121 +monitor_0122 +monitor_0123 +monitor_0124 +monitor_0125 +monitor_0126 +monitor_0127 +monitor_0128 +monitor_0129 +monitor_0130 +monitor_0131 +monitor_0132 +monitor_0133 +monitor_0134 +monitor_0135 +monitor_0136 +monitor_0137 +monitor_0138 +monitor_0139 +monitor_0140 +monitor_0141 +monitor_0142 +monitor_0143 +monitor_0144 +monitor_0145 +monitor_0146 +monitor_0147 +monitor_0148 +monitor_0149 +monitor_0150 +monitor_0151 +monitor_0152 +monitor_0153 +monitor_0154 +monitor_0155 +monitor_0156 +monitor_0157 +monitor_0158 +monitor_0159 +monitor_0160 +monitor_0161 +monitor_0162 +monitor_0163 +monitor_0164 +monitor_0165 +monitor_0166 +monitor_0167 +monitor_0168 +monitor_0169 +monitor_0170 +monitor_0171 +monitor_0172 +monitor_0173 +monitor_0174 +monitor_0175 +monitor_0176 +monitor_0177 +monitor_0178 +monitor_0179 +monitor_0180 +monitor_0181 +monitor_0182 +monitor_0183 +monitor_0184 +monitor_0185 +monitor_0186 +monitor_0187 +monitor_0188 +monitor_0189 +monitor_0190 +monitor_0191 +monitor_0192 +monitor_0193 +monitor_0194 +monitor_0195 +monitor_0196 +monitor_0197 +monitor_0198 +monitor_0199 +monitor_0200 +monitor_0201 +monitor_0202 +monitor_0203 +monitor_0204 +monitor_0205 +monitor_0206 +monitor_0207 +monitor_0208 +monitor_0209 +monitor_0210 +monitor_0211 +monitor_0212 +monitor_0213 +monitor_0214 +monitor_0215 +monitor_0216 +monitor_0217 +monitor_0218 +monitor_0219 +monitor_0220 +monitor_0221 +monitor_0222 +monitor_0223 +monitor_0224 +monitor_0225 +monitor_0226 +monitor_0227 +monitor_0228 +monitor_0229 +monitor_0230 +monitor_0231 +monitor_0232 +monitor_0233 +monitor_0234 +monitor_0235 +monitor_0236 +monitor_0237 +monitor_0238 +monitor_0239 +monitor_0240 +monitor_0241 +monitor_0242 +monitor_0243 +monitor_0244 +monitor_0245 +monitor_0246 +monitor_0247 +monitor_0248 +monitor_0249 +monitor_0250 +monitor_0251 +monitor_0252 +monitor_0253 +monitor_0254 +monitor_0255 +monitor_0256 +monitor_0257 +monitor_0258 +monitor_0259 +monitor_0260 +monitor_0261 +monitor_0262 +monitor_0263 +monitor_0264 +monitor_0265 +monitor_0266 +monitor_0267 +monitor_0268 +monitor_0269 +monitor_0270 +monitor_0271 +monitor_0272 +monitor_0273 +monitor_0274 +monitor_0275 +monitor_0276 +monitor_0277 +monitor_0278 +monitor_0279 +monitor_0280 +monitor_0281 +monitor_0282 +monitor_0283 +monitor_0284 +monitor_0285 +monitor_0286 +monitor_0287 +monitor_0288 +monitor_0289 +monitor_0290 +monitor_0291 +monitor_0292 +monitor_0293 +monitor_0294 +monitor_0295 +monitor_0296 +monitor_0297 +monitor_0298 +monitor_0299 +monitor_0300 +monitor_0301 +monitor_0302 +monitor_0303 +monitor_0304 +monitor_0305 +monitor_0306 +monitor_0307 +monitor_0308 +monitor_0309 +monitor_0310 +monitor_0311 +monitor_0312 +monitor_0313 +monitor_0314 +monitor_0315 +monitor_0316 +monitor_0317 +monitor_0318 +monitor_0319 +monitor_0320 +monitor_0321 +monitor_0322 +monitor_0323 +monitor_0324 +monitor_0325 +monitor_0326 +monitor_0327 +monitor_0328 +monitor_0329 +monitor_0330 +monitor_0331 +monitor_0332 +monitor_0333 +monitor_0334 +monitor_0335 +monitor_0336 +monitor_0337 +monitor_0338 +monitor_0339 +monitor_0340 +monitor_0341 +monitor_0342 +monitor_0343 +monitor_0344 +monitor_0345 +monitor_0346 +monitor_0347 +monitor_0348 +monitor_0349 +monitor_0350 +monitor_0351 +monitor_0352 +monitor_0353 +monitor_0354 +monitor_0355 +monitor_0356 +monitor_0357 +monitor_0358 +monitor_0359 +monitor_0360 +monitor_0361 +monitor_0362 +monitor_0363 +monitor_0364 +monitor_0365 +monitor_0366 +monitor_0367 +monitor_0368 +monitor_0369 +monitor_0370 +monitor_0371 +monitor_0372 +monitor_0373 +monitor_0374 +monitor_0375 +monitor_0376 +monitor_0377 +monitor_0378 +monitor_0379 +monitor_0380 +monitor_0381 +monitor_0382 +monitor_0383 +monitor_0384 +monitor_0385 +monitor_0386 +monitor_0387 +monitor_0388 +monitor_0389 +monitor_0390 +monitor_0391 +monitor_0392 +monitor_0393 +monitor_0394 +monitor_0395 +monitor_0396 +monitor_0397 +monitor_0398 +monitor_0399 +monitor_0400 +monitor_0401 +monitor_0402 +monitor_0403 +monitor_0404 +monitor_0405 +monitor_0406 +monitor_0407 +monitor_0408 +monitor_0409 +monitor_0410 +monitor_0411 +monitor_0412 +monitor_0413 +monitor_0414 +monitor_0415 +monitor_0416 +monitor_0417 +monitor_0418 +monitor_0419 +monitor_0420 +monitor_0421 +monitor_0422 +monitor_0423 +monitor_0424 +monitor_0425 +monitor_0426 +monitor_0427 +monitor_0428 +monitor_0429 +monitor_0430 +monitor_0431 +monitor_0432 +monitor_0433 +monitor_0434 +monitor_0435 +monitor_0436 +monitor_0437 +monitor_0438 +monitor_0439 +monitor_0440 +monitor_0441 +monitor_0442 +monitor_0443 +monitor_0444 +monitor_0445 +monitor_0446 +monitor_0447 +monitor_0448 +monitor_0449 +monitor_0450 +monitor_0451 +monitor_0452 +monitor_0453 +monitor_0454 +monitor_0455 +monitor_0456 +monitor_0457 +monitor_0458 +monitor_0459 +monitor_0460 +monitor_0461 +monitor_0462 +monitor_0463 +monitor_0464 +monitor_0465 +night_stand_0001 +night_stand_0002 +night_stand_0003 +night_stand_0004 +night_stand_0005 +night_stand_0006 +night_stand_0007 +night_stand_0008 +night_stand_0009 +night_stand_0010 +night_stand_0011 +night_stand_0012 +night_stand_0013 +night_stand_0014 +night_stand_0015 +night_stand_0016 +night_stand_0017 +night_stand_0018 +night_stand_0019 +night_stand_0020 +night_stand_0021 +night_stand_0022 +night_stand_0023 +night_stand_0024 +night_stand_0025 +night_stand_0026 +night_stand_0027 +night_stand_0028 +night_stand_0029 +night_stand_0030 +night_stand_0031 +night_stand_0032 +night_stand_0033 +night_stand_0034 +night_stand_0035 +night_stand_0036 +night_stand_0037 +night_stand_0038 +night_stand_0039 +night_stand_0040 +night_stand_0041 +night_stand_0042 +night_stand_0043 +night_stand_0044 +night_stand_0045 +night_stand_0046 +night_stand_0047 +night_stand_0048 +night_stand_0049 +night_stand_0050 +night_stand_0051 +night_stand_0052 +night_stand_0053 +night_stand_0054 +night_stand_0055 +night_stand_0056 +night_stand_0057 +night_stand_0058 +night_stand_0059 +night_stand_0060 +night_stand_0061 +night_stand_0062 +night_stand_0063 +night_stand_0064 +night_stand_0065 +night_stand_0066 +night_stand_0067 +night_stand_0068 +night_stand_0069 +night_stand_0070 +night_stand_0071 +night_stand_0072 +night_stand_0073 +night_stand_0074 +night_stand_0075 +night_stand_0076 +night_stand_0077 +night_stand_0078 +night_stand_0079 +night_stand_0080 +night_stand_0081 +night_stand_0082 +night_stand_0083 +night_stand_0084 +night_stand_0085 +night_stand_0086 +night_stand_0087 +night_stand_0088 +night_stand_0089 +night_stand_0090 +night_stand_0091 +night_stand_0092 +night_stand_0093 +night_stand_0094 +night_stand_0095 +night_stand_0096 +night_stand_0097 +night_stand_0098 +night_stand_0099 +night_stand_0100 +night_stand_0101 +night_stand_0102 +night_stand_0103 +night_stand_0104 +night_stand_0105 +night_stand_0106 +night_stand_0107 +night_stand_0108 +night_stand_0109 +night_stand_0110 +night_stand_0111 +night_stand_0112 +night_stand_0113 +night_stand_0114 +night_stand_0115 +night_stand_0116 +night_stand_0117 +night_stand_0118 +night_stand_0119 +night_stand_0120 +night_stand_0121 +night_stand_0122 +night_stand_0123 +night_stand_0124 +night_stand_0125 +night_stand_0126 +night_stand_0127 +night_stand_0128 +night_stand_0129 +night_stand_0130 +night_stand_0131 +night_stand_0132 +night_stand_0133 +night_stand_0134 +night_stand_0135 +night_stand_0136 +night_stand_0137 +night_stand_0138 +night_stand_0139 +night_stand_0140 +night_stand_0141 +night_stand_0142 +night_stand_0143 +night_stand_0144 +night_stand_0145 +night_stand_0146 +night_stand_0147 +night_stand_0148 +night_stand_0149 +night_stand_0150 +night_stand_0151 +night_stand_0152 +night_stand_0153 +night_stand_0154 +night_stand_0155 +night_stand_0156 +night_stand_0157 +night_stand_0158 +night_stand_0159 +night_stand_0160 +night_stand_0161 +night_stand_0162 +night_stand_0163 +night_stand_0164 +night_stand_0165 +night_stand_0166 +night_stand_0167 +night_stand_0168 +night_stand_0169 +night_stand_0170 +night_stand_0171 +night_stand_0172 +night_stand_0173 +night_stand_0174 +night_stand_0175 +night_stand_0176 +night_stand_0177 +night_stand_0178 +night_stand_0179 +night_stand_0180 +night_stand_0181 +night_stand_0182 +night_stand_0183 +night_stand_0184 +night_stand_0185 +night_stand_0186 +night_stand_0187 +night_stand_0188 +night_stand_0189 +night_stand_0190 +night_stand_0191 +night_stand_0192 +night_stand_0193 +night_stand_0194 +night_stand_0195 +night_stand_0196 +night_stand_0197 +night_stand_0198 +night_stand_0199 +night_stand_0200 +person_0001 +person_0002 +person_0003 +person_0004 +person_0005 +person_0006 +person_0007 +person_0008 +person_0009 +person_0010 +person_0011 +person_0012 +person_0013 +person_0014 +person_0015 +person_0016 +person_0017 +person_0018 +person_0019 +person_0020 +person_0021 +person_0022 +person_0023 +person_0024 +person_0025 +person_0026 +person_0027 +person_0028 +person_0029 +person_0030 +person_0031 +person_0032 +person_0033 +person_0034 +person_0035 +person_0036 +person_0037 +person_0038 +person_0039 +person_0040 +person_0041 +person_0042 +person_0043 +person_0044 +person_0045 +person_0046 +person_0047 +person_0048 +person_0049 +person_0050 +person_0051 +person_0052 +person_0053 +person_0054 +person_0055 +person_0056 +person_0057 +person_0058 +person_0059 +person_0060 +person_0061 +person_0062 +person_0063 +person_0064 +person_0065 +person_0066 +person_0067 +person_0068 +person_0069 +person_0070 +person_0071 +person_0072 +person_0073 +person_0074 +person_0075 +person_0076 +person_0077 +person_0078 +person_0079 +person_0080 +person_0081 +person_0082 +person_0083 +person_0084 +person_0085 +person_0086 +person_0087 +person_0088 +piano_0001 +piano_0002 +piano_0003 +piano_0004 +piano_0005 +piano_0006 +piano_0007 +piano_0008 +piano_0009 +piano_0010 +piano_0011 +piano_0012 +piano_0013 +piano_0014 +piano_0015 +piano_0016 +piano_0017 +piano_0018 +piano_0019 +piano_0020 +piano_0021 +piano_0022 +piano_0023 +piano_0024 +piano_0025 +piano_0026 +piano_0027 +piano_0028 +piano_0029 +piano_0030 +piano_0031 +piano_0032 +piano_0033 +piano_0034 +piano_0035 +piano_0036 +piano_0037 +piano_0038 +piano_0039 +piano_0040 +piano_0041 +piano_0042 +piano_0043 +piano_0044 +piano_0045 +piano_0046 +piano_0047 +piano_0048 +piano_0049 +piano_0050 +piano_0051 +piano_0052 +piano_0053 +piano_0054 +piano_0055 +piano_0056 +piano_0057 +piano_0058 +piano_0059 +piano_0060 +piano_0061 +piano_0062 +piano_0063 +piano_0064 +piano_0065 +piano_0066 +piano_0067 +piano_0068 +piano_0069 +piano_0070 +piano_0071 +piano_0072 +piano_0073 +piano_0074 +piano_0075 +piano_0076 +piano_0077 +piano_0078 +piano_0079 +piano_0080 +piano_0081 +piano_0082 +piano_0083 +piano_0084 +piano_0085 +piano_0086 +piano_0087 +piano_0088 +piano_0089 +piano_0090 +piano_0091 +piano_0092 +piano_0093 +piano_0094 +piano_0095 +piano_0096 +piano_0097 +piano_0098 +piano_0099 +piano_0100 +piano_0101 +piano_0102 +piano_0103 +piano_0104 +piano_0105 +piano_0106 +piano_0107 +piano_0108 +piano_0109 +piano_0110 +piano_0111 +piano_0112 +piano_0113 +piano_0114 +piano_0115 +piano_0116 +piano_0117 +piano_0118 +piano_0119 +piano_0120 +piano_0121 +piano_0122 +piano_0123 +piano_0124 +piano_0125 +piano_0126 +piano_0127 +piano_0128 +piano_0129 +piano_0130 +piano_0131 +piano_0132 +piano_0133 +piano_0134 +piano_0135 +piano_0136 +piano_0137 +piano_0138 +piano_0139 +piano_0140 +piano_0141 +piano_0142 +piano_0143 +piano_0144 +piano_0145 +piano_0146 +piano_0147 +piano_0148 +piano_0149 +piano_0150 +piano_0151 +piano_0152 +piano_0153 +piano_0154 +piano_0155 +piano_0156 +piano_0157 +piano_0158 +piano_0159 +piano_0160 +piano_0161 +piano_0162 +piano_0163 +piano_0164 +piano_0165 +piano_0166 +piano_0167 +piano_0168 +piano_0169 +piano_0170 +piano_0171 +piano_0172 +piano_0173 +piano_0174 +piano_0175 +piano_0176 +piano_0177 +piano_0178 +piano_0179 +piano_0180 +piano_0181 +piano_0182 +piano_0183 +piano_0184 +piano_0185 +piano_0186 +piano_0187 +piano_0188 +piano_0189 +piano_0190 +piano_0191 +piano_0192 +piano_0193 +piano_0194 +piano_0195 +piano_0196 +piano_0197 +piano_0198 +piano_0199 +piano_0200 +piano_0201 +piano_0202 +piano_0203 +piano_0204 +piano_0205 +piano_0206 +piano_0207 +piano_0208 +piano_0209 +piano_0210 +piano_0211 +piano_0212 +piano_0213 +piano_0214 +piano_0215 +piano_0216 +piano_0217 +piano_0218 +piano_0219 +piano_0220 +piano_0221 +piano_0222 +piano_0223 +piano_0224 +piano_0225 +piano_0226 +piano_0227 +piano_0228 +piano_0229 +piano_0230 +piano_0231 +plant_0001 +plant_0002 +plant_0003 +plant_0004 +plant_0005 +plant_0006 +plant_0007 +plant_0008 +plant_0009 +plant_0010 +plant_0011 +plant_0012 +plant_0013 +plant_0014 +plant_0015 +plant_0016 +plant_0017 +plant_0018 +plant_0019 +plant_0020 +plant_0021 +plant_0022 +plant_0023 +plant_0024 +plant_0025 +plant_0026 +plant_0027 +plant_0028 +plant_0029 +plant_0030 +plant_0031 +plant_0032 +plant_0033 +plant_0034 +plant_0035 +plant_0036 +plant_0037 +plant_0038 +plant_0039 +plant_0040 +plant_0041 +plant_0042 +plant_0043 +plant_0044 +plant_0045 +plant_0046 +plant_0047 +plant_0048 +plant_0049 +plant_0050 +plant_0051 +plant_0052 +plant_0053 +plant_0054 +plant_0055 +plant_0056 +plant_0057 +plant_0058 +plant_0059 +plant_0060 +plant_0061 +plant_0062 +plant_0063 +plant_0064 +plant_0065 +plant_0066 +plant_0067 +plant_0068 +plant_0069 +plant_0070 +plant_0071 +plant_0072 +plant_0073 +plant_0074 +plant_0075 +plant_0076 +plant_0077 +plant_0078 +plant_0079 +plant_0080 +plant_0081 +plant_0082 +plant_0083 +plant_0084 +plant_0085 +plant_0086 +plant_0087 +plant_0088 +plant_0089 +plant_0090 +plant_0091 +plant_0092 +plant_0093 +plant_0094 +plant_0095 +plant_0096 +plant_0097 +plant_0098 +plant_0099 +plant_0100 +plant_0101 +plant_0102 +plant_0103 +plant_0104 +plant_0105 +plant_0106 +plant_0107 +plant_0108 +plant_0109 +plant_0110 +plant_0111 +plant_0112 +plant_0113 +plant_0114 +plant_0115 +plant_0116 +plant_0117 +plant_0118 +plant_0119 +plant_0120 +plant_0121 +plant_0122 +plant_0123 +plant_0124 +plant_0125 +plant_0126 +plant_0127 +plant_0128 +plant_0129 +plant_0130 +plant_0131 +plant_0132 +plant_0133 +plant_0134 +plant_0135 +plant_0136 +plant_0137 +plant_0138 +plant_0139 +plant_0140 +plant_0141 +plant_0142 +plant_0143 +plant_0144 +plant_0145 +plant_0146 +plant_0147 +plant_0148 +plant_0149 +plant_0150 +plant_0151 +plant_0152 +plant_0153 +plant_0154 +plant_0155 +plant_0156 +plant_0157 +plant_0158 +plant_0159 +plant_0160 +plant_0161 +plant_0162 +plant_0163 +plant_0164 +plant_0165 +plant_0166 +plant_0167 +plant_0168 +plant_0169 +plant_0170 +plant_0171 +plant_0172 +plant_0173 +plant_0174 +plant_0175 +plant_0176 +plant_0177 +plant_0178 +plant_0179 +plant_0180 +plant_0181 +plant_0182 +plant_0183 +plant_0184 +plant_0185 +plant_0186 +plant_0187 +plant_0188 +plant_0189 +plant_0190 +plant_0191 +plant_0192 +plant_0193 +plant_0194 +plant_0195 +plant_0196 +plant_0197 +plant_0198 +plant_0199 +plant_0200 +plant_0201 +plant_0202 +plant_0203 +plant_0204 +plant_0205 +plant_0206 +plant_0207 +plant_0208 +plant_0209 +plant_0210 +plant_0211 +plant_0212 +plant_0213 +plant_0214 +plant_0215 +plant_0216 +plant_0217 +plant_0218 +plant_0219 +plant_0220 +plant_0221 +plant_0222 +plant_0223 +plant_0224 +plant_0225 +plant_0226 +plant_0227 +plant_0228 +plant_0229 +plant_0230 +plant_0231 +plant_0232 +plant_0233 +plant_0234 +plant_0235 +plant_0236 +plant_0237 +plant_0238 +plant_0239 +plant_0240 +radio_0001 +radio_0002 +radio_0003 +radio_0004 +radio_0005 +radio_0006 +radio_0007 +radio_0008 +radio_0009 +radio_0010 +radio_0011 +radio_0012 +radio_0013 +radio_0014 +radio_0015 +radio_0016 +radio_0017 +radio_0018 +radio_0019 +radio_0020 +radio_0021 +radio_0022 +radio_0023 +radio_0024 +radio_0025 +radio_0026 +radio_0027 +radio_0028 +radio_0029 +radio_0030 +radio_0031 +radio_0032 +radio_0033 +radio_0034 +radio_0035 +radio_0036 +radio_0037 +radio_0038 +radio_0039 +radio_0040 +radio_0041 +radio_0042 +radio_0043 +radio_0044 +radio_0045 +radio_0046 +radio_0047 +radio_0048 +radio_0049 +radio_0050 +radio_0051 +radio_0052 +radio_0053 +radio_0054 +radio_0055 +radio_0056 +radio_0057 +radio_0058 +radio_0059 +radio_0060 +radio_0061 +radio_0062 +radio_0063 +radio_0064 +radio_0065 +radio_0066 +radio_0067 +radio_0068 +radio_0069 +radio_0070 +radio_0071 +radio_0072 +radio_0073 +radio_0074 +radio_0075 +radio_0076 +radio_0077 +radio_0078 +radio_0079 +radio_0080 +radio_0081 +radio_0082 +radio_0083 +radio_0084 +radio_0085 +radio_0086 +radio_0087 +radio_0088 +radio_0089 +radio_0090 +radio_0091 +radio_0092 +radio_0093 +radio_0094 +radio_0095 +radio_0096 +radio_0097 +radio_0098 +radio_0099 +radio_0100 +radio_0101 +radio_0102 +radio_0103 +radio_0104 +range_hood_0001 +range_hood_0002 +range_hood_0003 +range_hood_0004 +range_hood_0005 +range_hood_0006 +range_hood_0007 +range_hood_0008 +range_hood_0009 +range_hood_0010 +range_hood_0011 +range_hood_0012 +range_hood_0013 +range_hood_0014 +range_hood_0015 +range_hood_0016 +range_hood_0017 +range_hood_0018 +range_hood_0019 +range_hood_0020 +range_hood_0021 +range_hood_0022 +range_hood_0023 +range_hood_0024 +range_hood_0025 +range_hood_0026 +range_hood_0027 +range_hood_0028 +range_hood_0029 +range_hood_0030 +range_hood_0031 +range_hood_0032 +range_hood_0033 +range_hood_0034 +range_hood_0035 +range_hood_0036 +range_hood_0037 +range_hood_0038 +range_hood_0039 +range_hood_0040 +range_hood_0041 +range_hood_0042 +range_hood_0043 +range_hood_0044 +range_hood_0045 +range_hood_0046 +range_hood_0047 +range_hood_0048 +range_hood_0049 +range_hood_0050 +range_hood_0051 +range_hood_0052 +range_hood_0053 +range_hood_0054 +range_hood_0055 +range_hood_0056 +range_hood_0057 +range_hood_0058 +range_hood_0059 +range_hood_0060 +range_hood_0061 +range_hood_0062 +range_hood_0063 +range_hood_0064 +range_hood_0065 +range_hood_0066 +range_hood_0067 +range_hood_0068 +range_hood_0069 +range_hood_0070 +range_hood_0071 +range_hood_0072 +range_hood_0073 +range_hood_0074 +range_hood_0075 +range_hood_0076 +range_hood_0077 +range_hood_0078 +range_hood_0079 +range_hood_0080 +range_hood_0081 +range_hood_0082 +range_hood_0083 +range_hood_0084 +range_hood_0085 +range_hood_0086 +range_hood_0087 +range_hood_0088 +range_hood_0089 +range_hood_0090 +range_hood_0091 +range_hood_0092 +range_hood_0093 +range_hood_0094 +range_hood_0095 +range_hood_0096 +range_hood_0097 +range_hood_0098 +range_hood_0099 +range_hood_0100 +range_hood_0101 +range_hood_0102 +range_hood_0103 +range_hood_0104 +range_hood_0105 +range_hood_0106 +range_hood_0107 +range_hood_0108 +range_hood_0109 +range_hood_0110 +range_hood_0111 +range_hood_0112 +range_hood_0113 +range_hood_0114 +range_hood_0115 +sink_0001 +sink_0002 +sink_0003 +sink_0004 +sink_0005 +sink_0006 +sink_0007 +sink_0008 +sink_0009 +sink_0010 +sink_0011 +sink_0012 +sink_0013 +sink_0014 +sink_0015 +sink_0016 +sink_0017 +sink_0018 +sink_0019 +sink_0020 +sink_0021 +sink_0022 +sink_0023 +sink_0024 +sink_0025 +sink_0026 +sink_0027 +sink_0028 +sink_0029 +sink_0030 +sink_0031 +sink_0032 +sink_0033 +sink_0034 +sink_0035 +sink_0036 +sink_0037 +sink_0038 +sink_0039 +sink_0040 +sink_0041 +sink_0042 +sink_0043 +sink_0044 +sink_0045 +sink_0046 +sink_0047 +sink_0048 +sink_0049 +sink_0050 +sink_0051 +sink_0052 +sink_0053 +sink_0054 +sink_0055 +sink_0056 +sink_0057 +sink_0058 +sink_0059 +sink_0060 +sink_0061 +sink_0062 +sink_0063 +sink_0064 +sink_0065 +sink_0066 +sink_0067 +sink_0068 +sink_0069 +sink_0070 +sink_0071 +sink_0072 +sink_0073 +sink_0074 +sink_0075 +sink_0076 +sink_0077 +sink_0078 +sink_0079 +sink_0080 +sink_0081 +sink_0082 +sink_0083 +sink_0084 +sink_0085 +sink_0086 +sink_0087 +sink_0088 +sink_0089 +sink_0090 +sink_0091 +sink_0092 +sink_0093 +sink_0094 +sink_0095 +sink_0096 +sink_0097 +sink_0098 +sink_0099 +sink_0100 +sink_0101 +sink_0102 +sink_0103 +sink_0104 +sink_0105 +sink_0106 +sink_0107 +sink_0108 +sink_0109 +sink_0110 +sink_0111 +sink_0112 +sink_0113 +sink_0114 +sink_0115 +sink_0116 +sink_0117 +sink_0118 +sink_0119 +sink_0120 +sink_0121 +sink_0122 +sink_0123 +sink_0124 +sink_0125 +sink_0126 +sink_0127 +sink_0128 +sofa_0001 +sofa_0002 +sofa_0003 +sofa_0004 +sofa_0005 +sofa_0006 +sofa_0007 +sofa_0008 +sofa_0009 +sofa_0010 +sofa_0011 +sofa_0012 +sofa_0013 +sofa_0014 +sofa_0015 +sofa_0016 +sofa_0017 +sofa_0018 +sofa_0019 +sofa_0020 +sofa_0021 +sofa_0022 +sofa_0023 +sofa_0024 +sofa_0025 +sofa_0026 +sofa_0027 +sofa_0028 +sofa_0029 +sofa_0030 +sofa_0031 +sofa_0032 +sofa_0033 +sofa_0034 +sofa_0035 +sofa_0036 +sofa_0037 +sofa_0038 +sofa_0039 +sofa_0040 +sofa_0041 +sofa_0042 +sofa_0043 +sofa_0044 +sofa_0045 +sofa_0046 +sofa_0047 +sofa_0048 +sofa_0049 +sofa_0050 +sofa_0051 +sofa_0052 +sofa_0053 +sofa_0054 +sofa_0055 +sofa_0056 +sofa_0057 +sofa_0058 +sofa_0059 +sofa_0060 +sofa_0061 +sofa_0062 +sofa_0063 +sofa_0064 +sofa_0065 +sofa_0066 +sofa_0067 +sofa_0068 +sofa_0069 +sofa_0070 +sofa_0071 +sofa_0072 +sofa_0073 +sofa_0074 +sofa_0075 +sofa_0076 +sofa_0077 +sofa_0078 +sofa_0079 +sofa_0080 +sofa_0081 +sofa_0082 +sofa_0083 +sofa_0084 +sofa_0085 +sofa_0086 +sofa_0087 +sofa_0088 +sofa_0089 +sofa_0090 +sofa_0091 +sofa_0092 +sofa_0093 +sofa_0094 +sofa_0095 +sofa_0096 +sofa_0097 +sofa_0098 +sofa_0099 +sofa_0100 +sofa_0101 +sofa_0102 +sofa_0103 +sofa_0104 +sofa_0105 +sofa_0106 +sofa_0107 +sofa_0108 +sofa_0109 +sofa_0110 +sofa_0111 +sofa_0112 +sofa_0113 +sofa_0114 +sofa_0115 +sofa_0116 +sofa_0117 +sofa_0118 +sofa_0119 +sofa_0120 +sofa_0121 +sofa_0122 +sofa_0123 +sofa_0124 +sofa_0125 +sofa_0126 +sofa_0127 +sofa_0128 +sofa_0129 +sofa_0130 +sofa_0131 +sofa_0132 +sofa_0133 +sofa_0134 +sofa_0135 +sofa_0136 +sofa_0137 +sofa_0138 +sofa_0139 +sofa_0140 +sofa_0141 +sofa_0142 +sofa_0143 +sofa_0144 +sofa_0145 +sofa_0146 +sofa_0147 +sofa_0148 +sofa_0149 +sofa_0150 +sofa_0151 +sofa_0152 +sofa_0153 +sofa_0154 +sofa_0155 +sofa_0156 +sofa_0157 +sofa_0158 +sofa_0159 +sofa_0160 +sofa_0161 +sofa_0162 +sofa_0163 +sofa_0164 +sofa_0165 +sofa_0166 +sofa_0167 +sofa_0168 +sofa_0169 +sofa_0170 +sofa_0171 +sofa_0172 +sofa_0173 +sofa_0174 +sofa_0175 +sofa_0176 +sofa_0177 +sofa_0178 +sofa_0179 +sofa_0180 +sofa_0181 +sofa_0182 +sofa_0183 +sofa_0184 +sofa_0185 +sofa_0186 +sofa_0187 +sofa_0188 +sofa_0189 +sofa_0190 +sofa_0191 +sofa_0192 +sofa_0193 +sofa_0194 +sofa_0195 +sofa_0196 +sofa_0197 +sofa_0198 +sofa_0199 +sofa_0200 +sofa_0201 +sofa_0202 +sofa_0203 +sofa_0204 +sofa_0205 +sofa_0206 +sofa_0207 +sofa_0208 +sofa_0209 +sofa_0210 +sofa_0211 +sofa_0212 +sofa_0213 +sofa_0214 +sofa_0215 +sofa_0216 +sofa_0217 +sofa_0218 +sofa_0219 +sofa_0220 +sofa_0221 +sofa_0222 +sofa_0223 +sofa_0224 +sofa_0225 +sofa_0226 +sofa_0227 +sofa_0228 +sofa_0229 +sofa_0230 +sofa_0231 +sofa_0232 +sofa_0233 +sofa_0234 +sofa_0235 +sofa_0236 +sofa_0237 +sofa_0238 +sofa_0239 +sofa_0240 +sofa_0241 +sofa_0242 +sofa_0243 +sofa_0244 +sofa_0245 +sofa_0246 +sofa_0247 +sofa_0248 +sofa_0249 +sofa_0250 +sofa_0251 +sofa_0252 +sofa_0253 +sofa_0254 +sofa_0255 +sofa_0256 +sofa_0257 +sofa_0258 +sofa_0259 +sofa_0260 +sofa_0261 +sofa_0262 +sofa_0263 +sofa_0264 +sofa_0265 +sofa_0266 +sofa_0267 +sofa_0268 +sofa_0269 +sofa_0270 +sofa_0271 +sofa_0272 +sofa_0273 +sofa_0274 +sofa_0275 +sofa_0276 +sofa_0277 +sofa_0278 +sofa_0279 +sofa_0280 +sofa_0281 +sofa_0282 +sofa_0283 +sofa_0284 +sofa_0285 +sofa_0286 +sofa_0287 +sofa_0288 +sofa_0289 +sofa_0290 +sofa_0291 +sofa_0292 +sofa_0293 +sofa_0294 +sofa_0295 +sofa_0296 +sofa_0297 +sofa_0298 +sofa_0299 +sofa_0300 +sofa_0301 +sofa_0302 +sofa_0303 +sofa_0304 +sofa_0305 +sofa_0306 +sofa_0307 +sofa_0308 +sofa_0309 +sofa_0310 +sofa_0311 +sofa_0312 +sofa_0313 +sofa_0314 +sofa_0315 +sofa_0316 +sofa_0317 +sofa_0318 +sofa_0319 +sofa_0320 +sofa_0321 +sofa_0322 +sofa_0323 +sofa_0324 +sofa_0325 +sofa_0326 +sofa_0327 +sofa_0328 +sofa_0329 +sofa_0330 +sofa_0331 +sofa_0332 +sofa_0333 +sofa_0334 +sofa_0335 +sofa_0336 +sofa_0337 +sofa_0338 +sofa_0339 +sofa_0340 +sofa_0341 +sofa_0342 +sofa_0343 +sofa_0344 +sofa_0345 +sofa_0346 +sofa_0347 +sofa_0348 +sofa_0349 +sofa_0350 +sofa_0351 +sofa_0352 +sofa_0353 +sofa_0354 +sofa_0355 +sofa_0356 +sofa_0357 +sofa_0358 +sofa_0359 +sofa_0360 +sofa_0361 +sofa_0362 +sofa_0363 +sofa_0364 +sofa_0365 +sofa_0366 +sofa_0367 +sofa_0368 +sofa_0369 +sofa_0370 +sofa_0371 +sofa_0372 +sofa_0373 +sofa_0374 +sofa_0375 +sofa_0376 +sofa_0377 +sofa_0378 +sofa_0379 +sofa_0380 +sofa_0381 +sofa_0382 +sofa_0383 +sofa_0384 +sofa_0385 +sofa_0386 +sofa_0387 +sofa_0388 +sofa_0389 +sofa_0390 +sofa_0391 +sofa_0392 +sofa_0393 +sofa_0394 +sofa_0395 +sofa_0396 +sofa_0397 +sofa_0398 +sofa_0399 +sofa_0400 +sofa_0401 +sofa_0402 +sofa_0403 +sofa_0404 +sofa_0405 +sofa_0406 +sofa_0407 +sofa_0408 +sofa_0409 +sofa_0410 +sofa_0411 +sofa_0412 +sofa_0413 +sofa_0414 +sofa_0415 +sofa_0416 +sofa_0417 +sofa_0418 +sofa_0419 +sofa_0420 +sofa_0421 +sofa_0422 +sofa_0423 +sofa_0424 +sofa_0425 +sofa_0426 +sofa_0427 +sofa_0428 +sofa_0429 +sofa_0430 +sofa_0431 +sofa_0432 +sofa_0433 +sofa_0434 +sofa_0435 +sofa_0436 +sofa_0437 +sofa_0438 +sofa_0439 +sofa_0440 +sofa_0441 +sofa_0442 +sofa_0443 +sofa_0444 +sofa_0445 +sofa_0446 +sofa_0447 +sofa_0448 +sofa_0449 +sofa_0450 +sofa_0451 +sofa_0452 +sofa_0453 +sofa_0454 +sofa_0455 +sofa_0456 +sofa_0457 +sofa_0458 +sofa_0459 +sofa_0460 +sofa_0461 +sofa_0462 +sofa_0463 +sofa_0464 +sofa_0465 +sofa_0466 +sofa_0467 +sofa_0468 +sofa_0469 +sofa_0470 +sofa_0471 +sofa_0472 +sofa_0473 +sofa_0474 +sofa_0475 +sofa_0476 +sofa_0477 +sofa_0478 +sofa_0479 +sofa_0480 +sofa_0481 +sofa_0482 +sofa_0483 +sofa_0484 +sofa_0485 +sofa_0486 +sofa_0487 +sofa_0488 +sofa_0489 +sofa_0490 +sofa_0491 +sofa_0492 +sofa_0493 +sofa_0494 +sofa_0495 +sofa_0496 +sofa_0497 +sofa_0498 +sofa_0499 +sofa_0500 +sofa_0501 +sofa_0502 +sofa_0503 +sofa_0504 +sofa_0505 +sofa_0506 +sofa_0507 +sofa_0508 +sofa_0509 +sofa_0510 +sofa_0511 +sofa_0512 +sofa_0513 +sofa_0514 +sofa_0515 +sofa_0516 +sofa_0517 +sofa_0518 +sofa_0519 +sofa_0520 +sofa_0521 +sofa_0522 +sofa_0523 +sofa_0524 +sofa_0525 +sofa_0526 +sofa_0527 +sofa_0528 +sofa_0529 +sofa_0530 +sofa_0531 +sofa_0532 +sofa_0533 +sofa_0534 +sofa_0535 +sofa_0536 +sofa_0537 +sofa_0538 +sofa_0539 +sofa_0540 +sofa_0541 +sofa_0542 +sofa_0543 +sofa_0544 +sofa_0545 +sofa_0546 +sofa_0547 +sofa_0548 +sofa_0549 +sofa_0550 +sofa_0551 +sofa_0552 +sofa_0553 +sofa_0554 +sofa_0555 +sofa_0556 +sofa_0557 +sofa_0558 +sofa_0559 +sofa_0560 +sofa_0561 +sofa_0562 +sofa_0563 +sofa_0564 +sofa_0565 +sofa_0566 +sofa_0567 +sofa_0568 +sofa_0569 +sofa_0570 +sofa_0571 +sofa_0572 +sofa_0573 +sofa_0574 +sofa_0575 +sofa_0576 +sofa_0577 +sofa_0578 +sofa_0579 +sofa_0580 +sofa_0581 +sofa_0582 +sofa_0583 +sofa_0584 +sofa_0585 +sofa_0586 +sofa_0587 +sofa_0588 +sofa_0589 +sofa_0590 +sofa_0591 +sofa_0592 +sofa_0593 +sofa_0594 +sofa_0595 +sofa_0596 +sofa_0597 +sofa_0598 +sofa_0599 +sofa_0600 +sofa_0601 +sofa_0602 +sofa_0603 +sofa_0604 +sofa_0605 +sofa_0606 +sofa_0607 +sofa_0608 +sofa_0609 +sofa_0610 +sofa_0611 +sofa_0612 +sofa_0613 +sofa_0614 +sofa_0615 +sofa_0616 +sofa_0617 +sofa_0618 +sofa_0619 +sofa_0620 +sofa_0621 +sofa_0622 +sofa_0623 +sofa_0624 +sofa_0625 +sofa_0626 +sofa_0627 +sofa_0628 +sofa_0629 +sofa_0630 +sofa_0631 +sofa_0632 +sofa_0633 +sofa_0634 +sofa_0635 +sofa_0636 +sofa_0637 +sofa_0638 +sofa_0639 +sofa_0640 +sofa_0641 +sofa_0642 +sofa_0643 +sofa_0644 +sofa_0645 +sofa_0646 +sofa_0647 +sofa_0648 +sofa_0649 +sofa_0650 +sofa_0651 +sofa_0652 +sofa_0653 +sofa_0654 +sofa_0655 +sofa_0656 +sofa_0657 +sofa_0658 +sofa_0659 +sofa_0660 +sofa_0661 +sofa_0662 +sofa_0663 +sofa_0664 +sofa_0665 +sofa_0666 +sofa_0667 +sofa_0668 +sofa_0669 +sofa_0670 +sofa_0671 +sofa_0672 +sofa_0673 +sofa_0674 +sofa_0675 +sofa_0676 +sofa_0677 +sofa_0678 +sofa_0679 +sofa_0680 +stairs_0001 +stairs_0002 +stairs_0003 +stairs_0004 +stairs_0005 +stairs_0006 +stairs_0007 +stairs_0008 +stairs_0009 +stairs_0010 +stairs_0011 +stairs_0012 +stairs_0013 +stairs_0014 +stairs_0015 +stairs_0016 +stairs_0017 +stairs_0018 +stairs_0019 +stairs_0020 +stairs_0021 +stairs_0022 +stairs_0023 +stairs_0024 +stairs_0025 +stairs_0026 +stairs_0027 +stairs_0028 +stairs_0029 +stairs_0030 +stairs_0031 +stairs_0032 +stairs_0033 +stairs_0034 +stairs_0035 +stairs_0036 +stairs_0037 +stairs_0038 +stairs_0039 +stairs_0040 +stairs_0041 +stairs_0042 +stairs_0043 +stairs_0044 +stairs_0045 +stairs_0046 +stairs_0047 +stairs_0048 +stairs_0049 +stairs_0050 +stairs_0051 +stairs_0052 +stairs_0053 +stairs_0054 +stairs_0055 +stairs_0056 +stairs_0057 +stairs_0058 +stairs_0059 +stairs_0060 +stairs_0061 +stairs_0062 +stairs_0063 +stairs_0064 +stairs_0065 +stairs_0066 +stairs_0067 +stairs_0068 +stairs_0069 +stairs_0070 +stairs_0071 +stairs_0072 +stairs_0073 +stairs_0074 +stairs_0075 +stairs_0076 +stairs_0077 +stairs_0078 +stairs_0079 +stairs_0080 +stairs_0081 +stairs_0082 +stairs_0083 +stairs_0084 +stairs_0085 +stairs_0086 +stairs_0087 +stairs_0088 +stairs_0089 +stairs_0090 +stairs_0091 +stairs_0092 +stairs_0093 +stairs_0094 +stairs_0095 +stairs_0096 +stairs_0097 +stairs_0098 +stairs_0099 +stairs_0100 +stairs_0101 +stairs_0102 +stairs_0103 +stairs_0104 +stairs_0105 +stairs_0106 +stairs_0107 +stairs_0108 +stairs_0109 +stairs_0110 +stairs_0111 +stairs_0112 +stairs_0113 +stairs_0114 +stairs_0115 +stairs_0116 +stairs_0117 +stairs_0118 +stairs_0119 +stairs_0120 +stairs_0121 +stairs_0122 +stairs_0123 +stairs_0124 +stool_0001 +stool_0002 +stool_0003 +stool_0004 +stool_0005 +stool_0006 +stool_0007 +stool_0008 +stool_0009 +stool_0010 +stool_0011 +stool_0012 +stool_0013 +stool_0014 +stool_0015 +stool_0016 +stool_0017 +stool_0018 +stool_0019 +stool_0020 +stool_0021 +stool_0022 +stool_0023 +stool_0024 +stool_0025 +stool_0026 +stool_0027 +stool_0028 +stool_0029 +stool_0030 +stool_0031 +stool_0032 +stool_0033 +stool_0034 +stool_0035 +stool_0036 +stool_0037 +stool_0038 +stool_0039 +stool_0040 +stool_0041 +stool_0042 +stool_0043 +stool_0044 +stool_0045 +stool_0046 +stool_0047 +stool_0048 +stool_0049 +stool_0050 +stool_0051 +stool_0052 +stool_0053 +stool_0054 +stool_0055 +stool_0056 +stool_0057 +stool_0058 +stool_0059 +stool_0060 +stool_0061 +stool_0062 +stool_0063 +stool_0064 +stool_0065 +stool_0066 +stool_0067 +stool_0068 +stool_0069 +stool_0070 +stool_0071 +stool_0072 +stool_0073 +stool_0074 +stool_0075 +stool_0076 +stool_0077 +stool_0078 +stool_0079 +stool_0080 +stool_0081 +stool_0082 +stool_0083 +stool_0084 +stool_0085 +stool_0086 +stool_0087 +stool_0088 +stool_0089 +stool_0090 +table_0001 +table_0002 +table_0003 +table_0004 +table_0005 +table_0006 +table_0007 +table_0008 +table_0009 +table_0010 +table_0011 +table_0012 +table_0013 +table_0014 +table_0015 +table_0016 +table_0017 +table_0018 +table_0019 +table_0020 +table_0021 +table_0022 +table_0023 +table_0024 +table_0025 +table_0026 +table_0027 +table_0028 +table_0029 +table_0030 +table_0031 +table_0032 +table_0033 +table_0034 +table_0035 +table_0036 +table_0037 +table_0038 +table_0039 +table_0040 +table_0041 +table_0042 +table_0043 +table_0044 +table_0045 +table_0046 +table_0047 +table_0048 +table_0049 +table_0050 +table_0051 +table_0052 +table_0053 +table_0054 +table_0055 +table_0056 +table_0057 +table_0058 +table_0059 +table_0060 +table_0061 +table_0062 +table_0063 +table_0064 +table_0065 +table_0066 +table_0067 +table_0068 +table_0069 +table_0070 +table_0071 +table_0072 +table_0073 +table_0074 +table_0075 +table_0076 +table_0077 +table_0078 +table_0079 +table_0080 +table_0081 +table_0082 +table_0083 +table_0084 +table_0085 +table_0086 +table_0087 +table_0088 +table_0089 +table_0090 +table_0091 +table_0092 +table_0093 +table_0094 +table_0095 +table_0096 +table_0097 +table_0098 +table_0099 +table_0100 +table_0101 +table_0102 +table_0103 +table_0104 +table_0105 +table_0106 +table_0107 +table_0108 +table_0109 +table_0110 +table_0111 +table_0112 +table_0113 +table_0114 +table_0115 +table_0116 +table_0117 +table_0118 +table_0119 +table_0120 +table_0121 +table_0122 +table_0123 +table_0124 +table_0125 +table_0126 +table_0127 +table_0128 +table_0129 +table_0130 +table_0131 +table_0132 +table_0133 +table_0134 +table_0135 +table_0136 +table_0137 +table_0138 +table_0139 +table_0140 +table_0141 +table_0142 +table_0143 +table_0144 +table_0145 +table_0146 +table_0147 +table_0148 +table_0149 +table_0150 +table_0151 +table_0152 +table_0153 +table_0154 +table_0155 +table_0156 +table_0157 +table_0158 +table_0159 +table_0160 +table_0161 +table_0162 +table_0163 +table_0164 +table_0165 +table_0166 +table_0167 +table_0168 +table_0169 +table_0170 +table_0171 +table_0172 +table_0173 +table_0174 +table_0175 +table_0176 +table_0177 +table_0178 +table_0179 +table_0180 +table_0181 +table_0182 +table_0183 +table_0184 +table_0185 +table_0186 +table_0187 +table_0188 +table_0189 +table_0190 +table_0191 +table_0192 +table_0193 +table_0194 +table_0195 +table_0196 +table_0197 +table_0198 +table_0199 +table_0200 +table_0201 +table_0202 +table_0203 +table_0204 +table_0205 +table_0206 +table_0207 +table_0208 +table_0209 +table_0210 +table_0211 +table_0212 +table_0213 +table_0214 +table_0215 +table_0216 +table_0217 +table_0218 +table_0219 +table_0220 +table_0221 +table_0222 +table_0223 +table_0224 +table_0225 +table_0226 +table_0227 +table_0228 +table_0229 +table_0230 +table_0231 +table_0232 +table_0233 +table_0234 +table_0235 +table_0236 +table_0237 +table_0238 +table_0239 +table_0240 +table_0241 +table_0242 +table_0243 +table_0244 +table_0245 +table_0246 +table_0247 +table_0248 +table_0249 +table_0250 +table_0251 +table_0252 +table_0253 +table_0254 +table_0255 +table_0256 +table_0257 +table_0258 +table_0259 +table_0260 +table_0261 +table_0262 +table_0263 +table_0264 +table_0265 +table_0266 +table_0267 +table_0268 +table_0269 +table_0270 +table_0271 +table_0272 +table_0273 +table_0274 +table_0275 +table_0276 +table_0277 +table_0278 +table_0279 +table_0280 +table_0281 +table_0282 +table_0283 +table_0284 +table_0285 +table_0286 +table_0287 +table_0288 +table_0289 +table_0290 +table_0291 +table_0292 +table_0293 +table_0294 +table_0295 +table_0296 +table_0297 +table_0298 +table_0299 +table_0300 +table_0301 +table_0302 +table_0303 +table_0304 +table_0305 +table_0306 +table_0307 +table_0308 +table_0309 +table_0310 +table_0311 +table_0312 +table_0313 +table_0314 +table_0315 +table_0316 +table_0317 +table_0318 +table_0319 +table_0320 +table_0321 +table_0322 +table_0323 +table_0324 +table_0325 +table_0326 +table_0327 +table_0328 +table_0329 +table_0330 +table_0331 +table_0332 +table_0333 +table_0334 +table_0335 +table_0336 +table_0337 +table_0338 +table_0339 +table_0340 +table_0341 +table_0342 +table_0343 +table_0344 +table_0345 +table_0346 +table_0347 +table_0348 +table_0349 +table_0350 +table_0351 +table_0352 +table_0353 +table_0354 +table_0355 +table_0356 +table_0357 +table_0358 +table_0359 +table_0360 +table_0361 +table_0362 +table_0363 +table_0364 +table_0365 +table_0366 +table_0367 +table_0368 +table_0369 +table_0370 +table_0371 +table_0372 +table_0373 +table_0374 +table_0375 +table_0376 +table_0377 +table_0378 +table_0379 +table_0380 +table_0381 +table_0382 +table_0383 +table_0384 +table_0385 +table_0386 +table_0387 +table_0388 +table_0389 +table_0390 +table_0391 +table_0392 +tent_0001 +tent_0002 +tent_0003 +tent_0004 +tent_0005 +tent_0006 +tent_0007 +tent_0008 +tent_0009 +tent_0010 +tent_0011 +tent_0012 +tent_0013 +tent_0014 +tent_0015 +tent_0016 +tent_0017 +tent_0018 +tent_0019 +tent_0020 +tent_0021 +tent_0022 +tent_0023 +tent_0024 +tent_0025 +tent_0026 +tent_0027 +tent_0028 +tent_0029 +tent_0030 +tent_0031 +tent_0032 +tent_0033 +tent_0034 +tent_0035 +tent_0036 +tent_0037 +tent_0038 +tent_0039 +tent_0040 +tent_0041 +tent_0042 +tent_0043 +tent_0044 +tent_0045 +tent_0046 +tent_0047 +tent_0048 +tent_0049 +tent_0050 +tent_0051 +tent_0052 +tent_0053 +tent_0054 +tent_0055 +tent_0056 +tent_0057 +tent_0058 +tent_0059 +tent_0060 +tent_0061 +tent_0062 +tent_0063 +tent_0064 +tent_0065 +tent_0066 +tent_0067 +tent_0068 +tent_0069 +tent_0070 +tent_0071 +tent_0072 +tent_0073 +tent_0074 +tent_0075 +tent_0076 +tent_0077 +tent_0078 +tent_0079 +tent_0080 +tent_0081 +tent_0082 +tent_0083 +tent_0084 +tent_0085 +tent_0086 +tent_0087 +tent_0088 +tent_0089 +tent_0090 +tent_0091 +tent_0092 +tent_0093 +tent_0094 +tent_0095 +tent_0096 +tent_0097 +tent_0098 +tent_0099 +tent_0100 +tent_0101 +tent_0102 +tent_0103 +tent_0104 +tent_0105 +tent_0106 +tent_0107 +tent_0108 +tent_0109 +tent_0110 +tent_0111 +tent_0112 +tent_0113 +tent_0114 +tent_0115 +tent_0116 +tent_0117 +tent_0118 +tent_0119 +tent_0120 +tent_0121 +tent_0122 +tent_0123 +tent_0124 +tent_0125 +tent_0126 +tent_0127 +tent_0128 +tent_0129 +tent_0130 +tent_0131 +tent_0132 +tent_0133 +tent_0134 +tent_0135 +tent_0136 +tent_0137 +tent_0138 +tent_0139 +tent_0140 +tent_0141 +tent_0142 +tent_0143 +tent_0144 +tent_0145 +tent_0146 +tent_0147 +tent_0148 +tent_0149 +tent_0150 +tent_0151 +tent_0152 +tent_0153 +tent_0154 +tent_0155 +tent_0156 +tent_0157 +tent_0158 +tent_0159 +tent_0160 +tent_0161 +tent_0162 +tent_0163 +toilet_0001 +toilet_0002 +toilet_0003 +toilet_0004 +toilet_0005 +toilet_0006 +toilet_0007 +toilet_0008 +toilet_0009 +toilet_0010 +toilet_0011 +toilet_0012 +toilet_0013 +toilet_0014 +toilet_0015 +toilet_0016 +toilet_0017 +toilet_0018 +toilet_0019 +toilet_0020 +toilet_0021 +toilet_0022 +toilet_0023 +toilet_0024 +toilet_0025 +toilet_0026 +toilet_0027 +toilet_0028 +toilet_0029 +toilet_0030 +toilet_0031 +toilet_0032 +toilet_0033 +toilet_0034 +toilet_0035 +toilet_0036 +toilet_0037 +toilet_0038 +toilet_0039 +toilet_0040 +toilet_0041 +toilet_0042 +toilet_0043 +toilet_0044 +toilet_0045 +toilet_0046 +toilet_0047 +toilet_0048 +toilet_0049 +toilet_0050 +toilet_0051 +toilet_0052 +toilet_0053 +toilet_0054 +toilet_0055 +toilet_0056 +toilet_0057 +toilet_0058 +toilet_0059 +toilet_0060 +toilet_0061 +toilet_0062 +toilet_0063 +toilet_0064 +toilet_0065 +toilet_0066 +toilet_0067 +toilet_0068 +toilet_0069 +toilet_0070 +toilet_0071 +toilet_0072 +toilet_0073 +toilet_0074 +toilet_0075 +toilet_0076 +toilet_0077 +toilet_0078 +toilet_0079 +toilet_0080 +toilet_0081 +toilet_0082 +toilet_0083 +toilet_0084 +toilet_0085 +toilet_0086 +toilet_0087 +toilet_0088 +toilet_0089 +toilet_0090 +toilet_0091 +toilet_0092 +toilet_0093 +toilet_0094 +toilet_0095 +toilet_0096 +toilet_0097 +toilet_0098 +toilet_0099 +toilet_0100 +toilet_0101 +toilet_0102 +toilet_0103 +toilet_0104 +toilet_0105 +toilet_0106 +toilet_0107 +toilet_0108 +toilet_0109 +toilet_0110 +toilet_0111 +toilet_0112 +toilet_0113 +toilet_0114 +toilet_0115 +toilet_0116 +toilet_0117 +toilet_0118 +toilet_0119 +toilet_0120 +toilet_0121 +toilet_0122 +toilet_0123 +toilet_0124 +toilet_0125 +toilet_0126 +toilet_0127 +toilet_0128 +toilet_0129 +toilet_0130 +toilet_0131 +toilet_0132 +toilet_0133 +toilet_0134 +toilet_0135 +toilet_0136 +toilet_0137 +toilet_0138 +toilet_0139 +toilet_0140 +toilet_0141 +toilet_0142 +toilet_0143 +toilet_0144 +toilet_0145 +toilet_0146 +toilet_0147 +toilet_0148 +toilet_0149 +toilet_0150 +toilet_0151 +toilet_0152 +toilet_0153 +toilet_0154 +toilet_0155 +toilet_0156 +toilet_0157 +toilet_0158 +toilet_0159 +toilet_0160 +toilet_0161 +toilet_0162 +toilet_0163 +toilet_0164 +toilet_0165 +toilet_0166 +toilet_0167 +toilet_0168 +toilet_0169 +toilet_0170 +toilet_0171 +toilet_0172 +toilet_0173 +toilet_0174 +toilet_0175 +toilet_0176 +toilet_0177 +toilet_0178 +toilet_0179 +toilet_0180 +toilet_0181 +toilet_0182 +toilet_0183 +toilet_0184 +toilet_0185 +toilet_0186 +toilet_0187 +toilet_0188 +toilet_0189 +toilet_0190 +toilet_0191 +toilet_0192 +toilet_0193 +toilet_0194 +toilet_0195 +toilet_0196 +toilet_0197 +toilet_0198 +toilet_0199 +toilet_0200 +toilet_0201 +toilet_0202 +toilet_0203 +toilet_0204 +toilet_0205 +toilet_0206 +toilet_0207 +toilet_0208 +toilet_0209 +toilet_0210 +toilet_0211 +toilet_0212 +toilet_0213 +toilet_0214 +toilet_0215 +toilet_0216 +toilet_0217 +toilet_0218 +toilet_0219 +toilet_0220 +toilet_0221 +toilet_0222 +toilet_0223 +toilet_0224 +toilet_0225 +toilet_0226 +toilet_0227 +toilet_0228 +toilet_0229 +toilet_0230 +toilet_0231 +toilet_0232 +toilet_0233 +toilet_0234 +toilet_0235 +toilet_0236 +toilet_0237 +toilet_0238 +toilet_0239 +toilet_0240 +toilet_0241 +toilet_0242 +toilet_0243 +toilet_0244 +toilet_0245 +toilet_0246 +toilet_0247 +toilet_0248 +toilet_0249 +toilet_0250 +toilet_0251 +toilet_0252 +toilet_0253 +toilet_0254 +toilet_0255 +toilet_0256 +toilet_0257 +toilet_0258 +toilet_0259 +toilet_0260 +toilet_0261 +toilet_0262 +toilet_0263 +toilet_0264 +toilet_0265 +toilet_0266 +toilet_0267 +toilet_0268 +toilet_0269 +toilet_0270 +toilet_0271 +toilet_0272 +toilet_0273 +toilet_0274 +toilet_0275 +toilet_0276 +toilet_0277 +toilet_0278 +toilet_0279 +toilet_0280 +toilet_0281 +toilet_0282 +toilet_0283 +toilet_0284 +toilet_0285 +toilet_0286 +toilet_0287 +toilet_0288 +toilet_0289 +toilet_0290 +toilet_0291 +toilet_0292 +toilet_0293 +toilet_0294 +toilet_0295 +toilet_0296 +toilet_0297 +toilet_0298 +toilet_0299 +toilet_0300 +toilet_0301 +toilet_0302 +toilet_0303 +toilet_0304 +toilet_0305 +toilet_0306 +toilet_0307 +toilet_0308 +toilet_0309 +toilet_0310 +toilet_0311 +toilet_0312 +toilet_0313 +toilet_0314 +toilet_0315 +toilet_0316 +toilet_0317 +toilet_0318 +toilet_0319 +toilet_0320 +toilet_0321 +toilet_0322 +toilet_0323 +toilet_0324 +toilet_0325 +toilet_0326 +toilet_0327 +toilet_0328 +toilet_0329 +toilet_0330 +toilet_0331 +toilet_0332 +toilet_0333 +toilet_0334 +toilet_0335 +toilet_0336 +toilet_0337 +toilet_0338 +toilet_0339 +toilet_0340 +toilet_0341 +toilet_0342 +toilet_0343 +toilet_0344 +tv_stand_0001 +tv_stand_0002 +tv_stand_0003 +tv_stand_0004 +tv_stand_0005 +tv_stand_0006 +tv_stand_0007 +tv_stand_0008 +tv_stand_0009 +tv_stand_0010 +tv_stand_0011 +tv_stand_0012 +tv_stand_0013 +tv_stand_0014 +tv_stand_0015 +tv_stand_0016 +tv_stand_0017 +tv_stand_0018 +tv_stand_0019 +tv_stand_0020 +tv_stand_0021 +tv_stand_0022 +tv_stand_0023 +tv_stand_0024 +tv_stand_0025 +tv_stand_0026 +tv_stand_0027 +tv_stand_0028 +tv_stand_0029 +tv_stand_0030 +tv_stand_0031 +tv_stand_0032 +tv_stand_0033 +tv_stand_0034 +tv_stand_0035 +tv_stand_0036 +tv_stand_0037 +tv_stand_0038 +tv_stand_0039 +tv_stand_0040 +tv_stand_0041 +tv_stand_0042 +tv_stand_0043 +tv_stand_0044 +tv_stand_0045 +tv_stand_0046 +tv_stand_0047 +tv_stand_0048 +tv_stand_0049 +tv_stand_0050 +tv_stand_0051 +tv_stand_0052 +tv_stand_0053 +tv_stand_0054 +tv_stand_0055 +tv_stand_0056 +tv_stand_0057 +tv_stand_0058 +tv_stand_0059 +tv_stand_0060 +tv_stand_0061 +tv_stand_0062 +tv_stand_0063 +tv_stand_0064 +tv_stand_0065 +tv_stand_0066 +tv_stand_0067 +tv_stand_0068 +tv_stand_0069 +tv_stand_0070 +tv_stand_0071 +tv_stand_0072 +tv_stand_0073 +tv_stand_0074 +tv_stand_0075 +tv_stand_0076 +tv_stand_0077 +tv_stand_0078 +tv_stand_0079 +tv_stand_0080 +tv_stand_0081 +tv_stand_0082 +tv_stand_0083 +tv_stand_0084 +tv_stand_0085 +tv_stand_0086 +tv_stand_0087 +tv_stand_0088 +tv_stand_0089 +tv_stand_0090 +tv_stand_0091 +tv_stand_0092 +tv_stand_0093 +tv_stand_0094 +tv_stand_0095 +tv_stand_0096 +tv_stand_0097 +tv_stand_0098 +tv_stand_0099 +tv_stand_0100 +tv_stand_0101 +tv_stand_0102 +tv_stand_0103 +tv_stand_0104 +tv_stand_0105 +tv_stand_0106 +tv_stand_0107 +tv_stand_0108 +tv_stand_0109 +tv_stand_0110 +tv_stand_0111 +tv_stand_0112 +tv_stand_0113 +tv_stand_0114 +tv_stand_0115 +tv_stand_0116 +tv_stand_0117 +tv_stand_0118 +tv_stand_0119 +tv_stand_0120 +tv_stand_0121 +tv_stand_0122 +tv_stand_0123 +tv_stand_0124 +tv_stand_0125 +tv_stand_0126 +tv_stand_0127 +tv_stand_0128 +tv_stand_0129 +tv_stand_0130 +tv_stand_0131 +tv_stand_0132 +tv_stand_0133 +tv_stand_0134 +tv_stand_0135 +tv_stand_0136 +tv_stand_0137 +tv_stand_0138 +tv_stand_0139 +tv_stand_0140 +tv_stand_0141 +tv_stand_0142 +tv_stand_0143 +tv_stand_0144 +tv_stand_0145 +tv_stand_0146 +tv_stand_0147 +tv_stand_0148 +tv_stand_0149 +tv_stand_0150 +tv_stand_0151 +tv_stand_0152 +tv_stand_0153 +tv_stand_0154 +tv_stand_0155 +tv_stand_0156 +tv_stand_0157 +tv_stand_0158 +tv_stand_0159 +tv_stand_0160 +tv_stand_0161 +tv_stand_0162 +tv_stand_0163 +tv_stand_0164 +tv_stand_0165 +tv_stand_0166 +tv_stand_0167 +tv_stand_0168 +tv_stand_0169 +tv_stand_0170 +tv_stand_0171 +tv_stand_0172 +tv_stand_0173 +tv_stand_0174 +tv_stand_0175 +tv_stand_0176 +tv_stand_0177 +tv_stand_0178 +tv_stand_0179 +tv_stand_0180 +tv_stand_0181 +tv_stand_0182 +tv_stand_0183 +tv_stand_0184 +tv_stand_0185 +tv_stand_0186 +tv_stand_0187 +tv_stand_0188 +tv_stand_0189 +tv_stand_0190 +tv_stand_0191 +tv_stand_0192 +tv_stand_0193 +tv_stand_0194 +tv_stand_0195 +tv_stand_0196 +tv_stand_0197 +tv_stand_0198 +tv_stand_0199 +tv_stand_0200 +tv_stand_0201 +tv_stand_0202 +tv_stand_0203 +tv_stand_0204 +tv_stand_0205 +tv_stand_0206 +tv_stand_0207 +tv_stand_0208 +tv_stand_0209 +tv_stand_0210 +tv_stand_0211 +tv_stand_0212 +tv_stand_0213 +tv_stand_0214 +tv_stand_0215 +tv_stand_0216 +tv_stand_0217 +tv_stand_0218 +tv_stand_0219 +tv_stand_0220 +tv_stand_0221 +tv_stand_0222 +tv_stand_0223 +tv_stand_0224 +tv_stand_0225 +tv_stand_0226 +tv_stand_0227 +tv_stand_0228 +tv_stand_0229 +tv_stand_0230 +tv_stand_0231 +tv_stand_0232 +tv_stand_0233 +tv_stand_0234 +tv_stand_0235 +tv_stand_0236 +tv_stand_0237 +tv_stand_0238 +tv_stand_0239 +tv_stand_0240 +tv_stand_0241 +tv_stand_0242 +tv_stand_0243 +tv_stand_0244 +tv_stand_0245 +tv_stand_0246 +tv_stand_0247 +tv_stand_0248 +tv_stand_0249 +tv_stand_0250 +tv_stand_0251 +tv_stand_0252 +tv_stand_0253 +tv_stand_0254 +tv_stand_0255 +tv_stand_0256 +tv_stand_0257 +tv_stand_0258 +tv_stand_0259 +tv_stand_0260 +tv_stand_0261 +tv_stand_0262 +tv_stand_0263 +tv_stand_0264 +tv_stand_0265 +tv_stand_0266 +tv_stand_0267 +vase_0001 +vase_0002 +vase_0003 +vase_0004 +vase_0005 +vase_0006 +vase_0007 +vase_0008 +vase_0009 +vase_0010 +vase_0011 +vase_0012 +vase_0013 +vase_0014 +vase_0015 +vase_0016 +vase_0017 +vase_0018 +vase_0019 +vase_0020 +vase_0021 +vase_0022 +vase_0023 +vase_0024 +vase_0025 +vase_0026 +vase_0027 +vase_0028 +vase_0029 +vase_0030 +vase_0031 +vase_0032 +vase_0033 +vase_0034 +vase_0035 +vase_0036 +vase_0037 +vase_0038 +vase_0039 +vase_0040 +vase_0041 +vase_0042 +vase_0043 +vase_0044 +vase_0045 +vase_0046 +vase_0047 +vase_0048 +vase_0049 +vase_0050 +vase_0051 +vase_0052 +vase_0053 +vase_0054 +vase_0055 +vase_0056 +vase_0057 +vase_0058 +vase_0059 +vase_0060 +vase_0061 +vase_0062 +vase_0063 +vase_0064 +vase_0065 +vase_0066 +vase_0067 +vase_0068 +vase_0069 +vase_0070 +vase_0071 +vase_0072 +vase_0073 +vase_0074 +vase_0075 +vase_0076 +vase_0077 +vase_0078 +vase_0079 +vase_0080 +vase_0081 +vase_0082 +vase_0083 +vase_0084 +vase_0085 +vase_0086 +vase_0087 +vase_0088 +vase_0089 +vase_0090 +vase_0091 +vase_0092 +vase_0093 +vase_0094 +vase_0095 +vase_0096 +vase_0097 +vase_0098 +vase_0099 +vase_0100 +vase_0101 +vase_0102 +vase_0103 +vase_0104 +vase_0105 +vase_0106 +vase_0107 +vase_0108 +vase_0109 +vase_0110 +vase_0111 +vase_0112 +vase_0113 +vase_0114 +vase_0115 +vase_0116 +vase_0117 +vase_0118 +vase_0119 +vase_0120 +vase_0121 +vase_0122 +vase_0123 +vase_0124 +vase_0125 +vase_0126 +vase_0127 +vase_0128 +vase_0129 +vase_0130 +vase_0131 +vase_0132 +vase_0133 +vase_0134 +vase_0135 +vase_0136 +vase_0137 +vase_0138 +vase_0139 +vase_0140 +vase_0141 +vase_0142 +vase_0143 +vase_0144 +vase_0145 +vase_0146 +vase_0147 +vase_0148 +vase_0149 +vase_0150 +vase_0151 +vase_0152 +vase_0153 +vase_0154 +vase_0155 +vase_0156 +vase_0157 +vase_0158 +vase_0159 +vase_0160 +vase_0161 +vase_0162 +vase_0163 +vase_0164 +vase_0165 +vase_0166 +vase_0167 +vase_0168 +vase_0169 +vase_0170 +vase_0171 +vase_0172 +vase_0173 +vase_0174 +vase_0175 +vase_0176 +vase_0177 +vase_0178 +vase_0179 +vase_0180 +vase_0181 +vase_0182 +vase_0183 +vase_0184 +vase_0185 +vase_0186 +vase_0187 +vase_0188 +vase_0189 +vase_0190 +vase_0191 +vase_0192 +vase_0193 +vase_0194 +vase_0195 +vase_0196 +vase_0197 +vase_0198 +vase_0199 +vase_0200 +vase_0201 +vase_0202 +vase_0203 +vase_0204 +vase_0205 +vase_0206 +vase_0207 +vase_0208 +vase_0209 +vase_0210 +vase_0211 +vase_0212 +vase_0213 +vase_0214 +vase_0215 +vase_0216 +vase_0217 +vase_0218 +vase_0219 +vase_0220 +vase_0221 +vase_0222 +vase_0223 +vase_0224 +vase_0225 +vase_0226 +vase_0227 +vase_0228 +vase_0229 +vase_0230 +vase_0231 +vase_0232 +vase_0233 +vase_0234 +vase_0235 +vase_0236 +vase_0237 +vase_0238 +vase_0239 +vase_0240 +vase_0241 +vase_0242 +vase_0243 +vase_0244 +vase_0245 +vase_0246 +vase_0247 +vase_0248 +vase_0249 +vase_0250 +vase_0251 +vase_0252 +vase_0253 +vase_0254 +vase_0255 +vase_0256 +vase_0257 +vase_0258 +vase_0259 +vase_0260 +vase_0261 +vase_0262 +vase_0263 +vase_0264 +vase_0265 +vase_0266 +vase_0267 +vase_0268 +vase_0269 +vase_0270 +vase_0271 +vase_0272 +vase_0273 +vase_0274 +vase_0275 +vase_0276 +vase_0277 +vase_0278 +vase_0279 +vase_0280 +vase_0281 +vase_0282 +vase_0283 +vase_0284 +vase_0285 +vase_0286 +vase_0287 +vase_0288 +vase_0289 +vase_0290 +vase_0291 +vase_0292 +vase_0293 +vase_0294 +vase_0295 +vase_0296 +vase_0297 +vase_0298 +vase_0299 +vase_0300 +vase_0301 +vase_0302 +vase_0303 +vase_0304 +vase_0305 +vase_0306 +vase_0307 +vase_0308 +vase_0309 +vase_0310 +vase_0311 +vase_0312 +vase_0313 +vase_0314 +vase_0315 +vase_0316 +vase_0317 +vase_0318 +vase_0319 +vase_0320 +vase_0321 +vase_0322 +vase_0323 +vase_0324 +vase_0325 +vase_0326 +vase_0327 +vase_0328 +vase_0329 +vase_0330 +vase_0331 +vase_0332 +vase_0333 +vase_0334 +vase_0335 +vase_0336 +vase_0337 +vase_0338 +vase_0339 +vase_0340 +vase_0341 +vase_0342 +vase_0343 +vase_0344 +vase_0345 +vase_0346 +vase_0347 +vase_0348 +vase_0349 +vase_0350 +vase_0351 +vase_0352 +vase_0353 +vase_0354 +vase_0355 +vase_0356 +vase_0357 +vase_0358 +vase_0359 +vase_0360 +vase_0361 +vase_0362 +vase_0363 +vase_0364 +vase_0365 +vase_0366 +vase_0367 +vase_0368 +vase_0369 +vase_0370 +vase_0371 +vase_0372 +vase_0373 +vase_0374 +vase_0375 +vase_0376 +vase_0377 +vase_0378 +vase_0379 +vase_0380 +vase_0381 +vase_0382 +vase_0383 +vase_0384 +vase_0385 +vase_0386 +vase_0387 +vase_0388 +vase_0389 +vase_0390 +vase_0391 +vase_0392 +vase_0393 +vase_0394 +vase_0395 +vase_0396 +vase_0397 +vase_0398 +vase_0399 +vase_0400 +vase_0401 +vase_0402 +vase_0403 +vase_0404 +vase_0405 +vase_0406 +vase_0407 +vase_0408 +vase_0409 +vase_0410 +vase_0411 +vase_0412 +vase_0413 +vase_0414 +vase_0415 +vase_0416 +vase_0417 +vase_0418 +vase_0419 +vase_0420 +vase_0421 +vase_0422 +vase_0423 +vase_0424 +vase_0425 +vase_0426 +vase_0427 +vase_0428 +vase_0429 +vase_0430 +vase_0431 +vase_0432 +vase_0433 +vase_0434 +vase_0435 +vase_0436 +vase_0437 +vase_0438 +vase_0439 +vase_0440 +vase_0441 +vase_0442 +vase_0443 +vase_0444 +vase_0445 +vase_0446 +vase_0447 +vase_0448 +vase_0449 +vase_0450 +vase_0451 +vase_0452 +vase_0453 +vase_0454 +vase_0455 +vase_0456 +vase_0457 +vase_0458 +vase_0459 +vase_0460 +vase_0461 +vase_0462 +vase_0463 +vase_0464 +vase_0465 +vase_0466 +vase_0467 +vase_0468 +vase_0469 +vase_0470 +vase_0471 +vase_0472 +vase_0473 +vase_0474 +vase_0475 +wardrobe_0001 +wardrobe_0002 +wardrobe_0003 +wardrobe_0004 +wardrobe_0005 +wardrobe_0006 +wardrobe_0007 +wardrobe_0008 +wardrobe_0009 +wardrobe_0010 +wardrobe_0011 +wardrobe_0012 +wardrobe_0013 +wardrobe_0014 +wardrobe_0015 +wardrobe_0016 +wardrobe_0017 +wardrobe_0018 +wardrobe_0019 +wardrobe_0020 +wardrobe_0021 +wardrobe_0022 +wardrobe_0023 +wardrobe_0024 +wardrobe_0025 +wardrobe_0026 +wardrobe_0027 +wardrobe_0028 +wardrobe_0029 +wardrobe_0030 +wardrobe_0031 +wardrobe_0032 +wardrobe_0033 +wardrobe_0034 +wardrobe_0035 +wardrobe_0036 +wardrobe_0037 +wardrobe_0038 +wardrobe_0039 +wardrobe_0040 +wardrobe_0041 +wardrobe_0042 +wardrobe_0043 +wardrobe_0044 +wardrobe_0045 +wardrobe_0046 +wardrobe_0047 +wardrobe_0048 +wardrobe_0049 +wardrobe_0050 +wardrobe_0051 +wardrobe_0052 +wardrobe_0053 +wardrobe_0054 +wardrobe_0055 +wardrobe_0056 +wardrobe_0057 +wardrobe_0058 +wardrobe_0059 +wardrobe_0060 +wardrobe_0061 +wardrobe_0062 +wardrobe_0063 +wardrobe_0064 +wardrobe_0065 +wardrobe_0066 +wardrobe_0067 +wardrobe_0068 +wardrobe_0069 +wardrobe_0070 +wardrobe_0071 +wardrobe_0072 +wardrobe_0073 +wardrobe_0074 +wardrobe_0075 +wardrobe_0076 +wardrobe_0077 +wardrobe_0078 +wardrobe_0079 +wardrobe_0080 +wardrobe_0081 +wardrobe_0082 +wardrobe_0083 +wardrobe_0084 +wardrobe_0085 +wardrobe_0086 +wardrobe_0087 +xbox_0001 +xbox_0002 +xbox_0003 +xbox_0004 +xbox_0005 +xbox_0006 +xbox_0007 +xbox_0008 +xbox_0009 +xbox_0010 +xbox_0011 +xbox_0012 +xbox_0013 +xbox_0014 +xbox_0015 +xbox_0016 +xbox_0017 +xbox_0018 +xbox_0019 +xbox_0020 +xbox_0021 +xbox_0022 +xbox_0023 +xbox_0024 +xbox_0025 +xbox_0026 +xbox_0027 +xbox_0028 +xbox_0029 +xbox_0030 +xbox_0031 +xbox_0032 +xbox_0033 +xbox_0034 +xbox_0035 +xbox_0036 +xbox_0037 +xbox_0038 +xbox_0039 +xbox_0040 +xbox_0041 +xbox_0042 +xbox_0043 +xbox_0044 +xbox_0045 +xbox_0046 +xbox_0047 +xbox_0048 +xbox_0049 +xbox_0050 +xbox_0051 +xbox_0052 +xbox_0053 +xbox_0054 +xbox_0055 +xbox_0056 +xbox_0057 +xbox_0058 +xbox_0059 +xbox_0060 +xbox_0061 +xbox_0062 +xbox_0063 +xbox_0064 +xbox_0065 +xbox_0066 +xbox_0067 +xbox_0068 +xbox_0069 +xbox_0070 +xbox_0071 +xbox_0072 +xbox_0073 +xbox_0074 +xbox_0075 +xbox_0076 +xbox_0077 +xbox_0078 +xbox_0079 +xbox_0080 +xbox_0081 +xbox_0082 +xbox_0083 +xbox_0084 +xbox_0085 +xbox_0086 +xbox_0087 +xbox_0088 +xbox_0089 +xbox_0090 +xbox_0091 +xbox_0092 +xbox_0093 +xbox_0094 +xbox_0095 +xbox_0096 +xbox_0097 +xbox_0098 +xbox_0099 +xbox_0100 +xbox_0101 +xbox_0102 +xbox_0103 diff --git a/zoo/PointBERT/data/ScanObjectNN_shape_names.txt b/zoo/PointBERT/data/ScanObjectNN_shape_names.txt new file mode 100644 index 0000000..1dbfdb7 --- /dev/null +++ b/zoo/PointBERT/data/ScanObjectNN_shape_names.txt @@ -0,0 +1,15 @@ +bag +bin +box +cabinet +chair +desk +display +door +shelf +table +bed +pillow +sink +sofa +toilet \ No newline at end of file diff --git a/zoo/PointBERT/data/ShapeNet55-34/ShapeNet-55/test.txt b/zoo/PointBERT/data/ShapeNet55-34/ShapeNet-55/test.txt new file mode 100644 index 0000000..48294e6 --- /dev/null +++ b/zoo/PointBERT/data/ShapeNet55-34/ShapeNet-55/test.txt @@ -0,0 +1,10518 @@ +03759954-109f1779a6993782f6426d6e3b63c5ce.npy +03759954-b726f3df205d3b5911daf38720b2dbe4.npy +04330267-aa0f6ff9f592b327eadb8f8b5bc7d9a5.npy +04330267-966ea3afa71e3a574bba687d3dbe6227.npy +03759954-baca1996923c25f943a6722dac94523b.npy +04330267-bc2daa0406ad3324d724d9ce5af6d8e.npy +04330267-f56ea6d924207b5515c4fa96a52ac4ff.npy +03261776-64ab866236bd012a43ccf9e3e30b934d.npy +04330267-f5c26b7b35991739281d68269dab9234.npy +04330267-a95a8fc9fa81aadf40332412c5d013fb.npy +03261776-5bb7c6bcd79bd45e16262e5b395acc86.npy +04330267-821634b0caa5cdb57f0571f06b666f9f.npy +03513137-ba62b73074d51637b61d7759f8544b8a.npy +03759954-e491db83f21a5a6c4fdb7f619836e43d.npy +03513137-89815c92980efb27226eabe1cca3e850.npy +04330267-65eb72bf33da5b1511ff208156ce047.npy +04330267-d6bbaeb047b53c43e6b2f975f419eaae.npy +03261776-97940f715478c1c4ce76da9b42b3ec76.npy +04330267-24dfeb26cc47a046e6fbf2f5ae574e36.npy +03513137-45d6e3b0b91073af7359b134afde902.npy +03759954-ae85334cc3752412374e74ec21028517.npy +03261776-e17597ea42e1e18f3f1da4d22f591d97.npy +04460130-44e8212fe3d44b1ec8b200f28f6c5853.npy +04468005-c6486d5bb854e5758e966271baaa42c9.npy +03513137-a612b83619ce985f3de9dfa8d65133cb.npy +04468005-bc1c21333b5e22bf8145a50db7d52d60.npy +04468005-8e5519f10f0748695a7f2ba88db92d63.npy +04468005-3aafecb126c5e46d49906937a72a14ff.npy +04468005-565d7f01c9f8b6b53ae1361afc45ac52.npy +04330267-8c2491e5245804d1ffc6e457221b9271.npy +03513137-f778971235a67bba754cd8e5dd1ab945.npy +03761084-71221c380da96cbebe67d9b32c3ddf8.npy +03761084-b95c595576a3846aad0ab2bac067d6b1.npy +04468005-b7306885432f3bd5299a59bfd8e7d284.npy +04330267-1d5eb167825bacba688d3cf9b52f4662.npy +04004475-30a39487e93a01dc8eeae74a05480d07.npy +03938244-57992207eebe4009eb332cd2d2a300.npy +02992529-d5fd6679ddfc8ddc59f56ab706e2f74c.npy +04004475-266014617a73853f9a8c3855109c1ee0.npy +02808440-7e5857a4abbcbe9098dcd47b5c6dc2e5.npy +04468005-1f4f874957d140cbc834d88a99ade94d.npy +04468005-13aac1cbf34edd552470de2774d6099.npy +03759954-4bd87bb547f266f3133483af4507508a.npy +04460130-8cf718ed6a5fefd8fcaad7f5ff5ee65c.npy +03938244-e8a13e84cc6db127616f4ad120b6332a.npy +02992529-2eae0713342e1103397d790c3d0a8fb5.npy +03513137-2c9086096c0fe9889215d30ce83ed4dd.npy +04468005-84a3fd24d2cefcfcd781754d41e2576e.npy +02808440-25370f9a01166beaa13edbe825cc0113.npy +04460130-7696d47199f9055a79ea17c9c8a4feb0.npy +04530566-2c8725b9a09b6d0a44ebbc705ad8c07.npy +02871439-a27245122e4c284d67aad4e7f685c416.npy +04530566-f2e303d85466a0fd88d5590328ce0ddf.npy +02871439-ca56637ae250ff1259adebe36b392f27.npy +03593526-276bff32316ddd3eec0dc003f0209134.npy +02871439-a45d9c141a0ae4a627afb81497348633.npy +04530566-ad8c4e406743c29a5b84e0ded5ffcc87.npy +04530566-2a86437a50f1b51727ac692756be9e24.npy +04530566-d188b20659011142c8067f9682b92f0e.npy +04530566-12900e06f0f4ec9e49f471d054f6b528.npy +04530566-de7c3942e8a460ffa9bd9d33180e7ac0.npy +04530566-957ac9708448e111f0ef63bb932093ce.npy +04554684-b91045b62241ebd158c88d30f502a452.npy +03761084-6942c30f25bbcde7ced224a469840964.npy +04530566-d1e59a48852965fb036cb639ea80765.npy +03938244-efd9fffc04d235dab55fde51a411949f.npy +03467517-8402cf0cbb6dfc92b5b477b4ad381f9.npy +02992529-298ca71453baf6ee2a9eb0f146e94477.npy +02871439-6f65749bdf82cca8d810b14a81e12eca.npy +04530566-d703643f4a4f76a16c63b8b48495261a.npy +04530566-296f0b6a15012e33d87f29c9afcc633e.npy +02992529-89f17a3563941ba9f2fdbae39bae1eff.npy +03467517-f86c277a6e1f444293f0194265a9746c.npy +02992529-d2f3eb92a31649647c17b7a9bb17a24.npy +02992529-657fbd67af945c39d9e3837723c05057.npy +02871439-704e5237bfe45aed809222e4341a7d65.npy +04530566-f26d39cd431135cbc92e1912af872cc.npy +03467517-a19b20b4ec66e57d6ee1932063f20d95.npy +02871439-dbcee69eecd13b3b5196bf7c8aa10ef1.npy +02992529-1e52452aeb4bacbd83156841b8188cc7.npy +04330267-f4f9375024901a8e41965be83b7745a.npy +03467517-2331b83b682e6dcd1082f2ea630bf69e.npy +02808440-2b9228db2c77130d44221bef0fa3c36b.npy +02992529-e33e1483c4c22b1ae71852a7b0e4fcb6.npy +02808440-caccc22a1266150d3321831d2245cf06.npy +02992529-ac0967f9fe8f63f46b2ba76eab0d2b1c.npy +02992529-515b5a63ebb56aad7aeb5bbdd191fd4d.npy +02808440-8932abdd856b615756e28fa5d4761d89.npy +03467517-dad399bf54b6186a40c20797381ee39f.npy +02992529-5f600251394fabe6808ca88aece2e3dc.npy +02992529-6e18484e72c79bf6943bfa124ea09a0b.npy +04401088-bf7daa3ade10ee75bad093be69512dcd.npy +04530566-2a3e2ecc6c6d3be83b2c1416b6e149a5.npy +02992529-baafe1add38af23a5f0b5b54dbc4f35c.npy +04530566-c359eef375afa3b6dd42314e00caace4.npy +02954340-188702a3bb44f40c284432ce2f42f498.npy +03467517-bdc8060a937278f25b6b4dd555e889f9.npy +02871439-ffdc8c4c72d7ca59ccbf1ee2df182caa.npy +04530566-b3090ee38204289cb90142192ec795d.npy +04530566-d0e9f4c4bb582c3cfa0636f27a8b2a9c.npy +03513137-73359cd0e38579745c351e299b24e355.npy +04460130-4264b506533b1e2e473f10e6caaeca56.npy +04401088-fc1675526d043e81a2811061ff7e0824.npy +04530566-ca529b32d5bccdfe7d66e5fb8a76ea1f.npy +03467517-4c5288cc18896f8f352e5d4d2615db5b.npy +04460130-e3f5234bfe086a3438cd8eb23853c009.npy +02808440-41c2075df14356713321831d2245cf06.npy +04401088-d2636f3af00fb3e2538f655e65b0b57.npy +02992529-54d5d64e0d3b0f95952ef623ec48449b.npy +02933112-3d5ef34ce469b11c5af597c14b093f6.npy +02933112-b9fd0cb66675dcc87c9ecef5753df626.npy +03593526-4d53bcb8348292d4b4be5695ea899000.npy +03467517-2f9d51c98d517ed1b647271c21ec40.npy +03642806-593d32126cea601d5a952e55d06611ce.npy +02808440-b7d1bc59194e2c5672101dcac4ed75d3.npy +04554684-c709c8a6cb97c8e55c67382e5c978dae.npy +02933112-c52cc29136169ea014038d588fd1342f.npy +02992529-6fe550e061e70579a05d3424fd8d541a.npy +04401088-e06b902efc1576c62fd4061aba358325.npy +04401088-f9ecc6749a251c0249852b2ef384d236.npy +03467517-e66d799f51f1558a2214be36f33a634a.npy +03467517-59e7e8bc76d47722b48e9ff3519bfb40.npy +04330267-e69db4d377603b7d37b2bb75885cfc44.npy +03593526-7bb71bbabeacfe9f27936e29850f1fad.npy +04401088-6cc44d39e099bb6b9ef9eb3ddb0818a.npy +02933112-2a9acc146f7310b1492d9da2668ec34c.npy +04530566-59fefd79eba35dbb723877c00e9cdc03.npy +02933112-3e881be7e5289fcb77a8ecb4b9a890c5.npy +02871439-601b64e8e27159e157da56e4c9ff868d.npy +02924116-27b5ee7b86057ba0c95c7a8a79dc0c72.npy +04401088-73ab63e7ac7a404b545fb5ece69fbf4e.npy +04530566-4d8ae6327ab4ed301e66f1783a4812d7.npy +04460130-c6e94a8464305378cedded8270815eaf.npy +04401088-b69603be92146a161ad8041551e9d3c2.npy +03467517-10158b6f14c2700871e863c034067817.npy +03642806-87ffe7aaa7304b1b775a6b1e21d79260.npy +02924116-40a40bc3ed3934a5a500884f38f28607.npy +03467517-42f3172b8770d2fd2200c35bfa7099ee.npy +04468005-25c3710ca5f245b8c62b7ed19a553484.npy +02992529-b8415769dc1bc92821844676433a0aca.npy +04530566-2c7a0d5909d8dd46a3599da6d4b3696d.npy +02808440-6e586dee4b54e6556ada9e1e675a2b32.npy +03593526-8b56cc59b433b83d42266d3d768f0d70.npy +02871439-aba0fe4f9da44175a51af6b739ab25e8.npy +04004475-c73c7f57faa4c40de5ae40d496bdd7b3.npy +02924116-dcc301919ebf2423b129901f80d24b7b.npy +02992529-9c1286570bbc6fc78f257ecba9a6ef8.npy +03593526-ce641a7a7b0cfe1ad85aa63241192dd1.npy +03467517-bfe1ea2edf94e0b86ee1932063f20d95.npy +03513137-3b45ee42f62559c74e5e6ac3ef6bff73.npy +04530566-99ecd71c5103416e698137c717c4ad11.npy +02933112-7ef036a41e1b9e2aac00fd1150223027.npy +04530566-49861c22df11a02b910f44c20a5d1839.npy +02992529-d050f7389538de04ae0591d02e40f07b.npy +04401088-d61ddb57397143e38d03482ac0270137.npy +02992529-528e6424ccdcf2af21844676433a0aca.npy +02954340-1eccbbbf1503c888f691355a196da5f.npy +04401088-fd3c1ac6cd1f94bd3982f71b09380baa.npy +03467517-1b7aed896667193ed5006a9fa189ec8a.npy +02933112-8e1a1e2879cfa2d6fe395915d44df772.npy +03467517-8d24a89192c4d9a593a3cb7ad5bbfafa.npy +02992529-6bda193370e2c7e9a30edee0b4a86a6c.npy +02871439-1761cc50604f9faef759bc1c69ff20e0.npy +04530566-e51dc5bb6b97700747d2f4d1390fa93e.npy +03642806-164b84d13b3d4650e096f6db40afe7bf.npy +02992529-18cb51f36acfe30a487d18402ebe69d5.npy +03642806-e55ececde88255b93e73f3893a7337bb.npy +02946921-7883b684806946276f056d414894e46d.npy +03467517-d528407fe43b5df193f0194265a9746c.npy +04530566-9fd71a532f7c732fb036cb639ea80765.npy +02992529-b35c2da756f8df5aa0eb5a85db887292.npy +02933112-5172c96ea99b9f5fde533fa000314311.npy +02933112-962de4481f2844aeba3e7e48acd3a1c6.npy +02808440-d6a1c1c47190649a54d7082b34825ef0.npy +02808440-f2306272d14861367c8e9b5cdcd2f0ef.npy +04530566-e42655032562701e746ffcbc44510229.npy +04401088-e71c51adfe4d4f00341e76467b172f31.npy +02933112-a03797c4034be11ac59350d819542ec7.npy +02992529-c65f71b54023ee9897d7ccf55973b548.npy +04530566-e1e3c053f4b4f1405e45696ec6d1a105.npy +02924116-cd89b45698f631a6a0975a87469abb37.npy +04401088-ac1e771d6392e912f594ca916b37180c.npy +03467517-4c082a95145f866a8388889c8d3c7bea.npy +02933112-b539b0bdf5c760b1c0eeb4326d5ba9e6.npy +02933112-7fbb7a6e017d3bd1921dd903dd0b8b17.npy +02933112-a5f28af83eb1dfbc3ffd072b23bde58.npy +02992529-eb61306048b7848c327b5f10f339d9f8.npy +02933112-4a2848db82ae01f7490ad276cd2af3a4.npy +03467517-de424132b05e349793f0194265a9746c.npy +03467517-54eedf9608f598d5329909d772c2a884.npy +02871439-cc38bc7db90f43d214b86d5282eb8301.npy +03642806-5fb5b09b324dc153ed883f1f11a51185.npy +03761084-2c453abc6198b01d3f7f3ed2c3c690fe.npy +03761084-f0c0893a5aabe2412fbb75bd5fac4890.npy +02946921-d511899945a400b183b4ef314c5735aa.npy +02933112-b649e3084819c7847445d25f394949d0.npy +03467517-e1d55b9cdd791c937fe275cdb56536f5.npy +03642806-f7c26b8c94ba8214397c35f585745a82.npy +02808440-c4920feed5e6b7ebccd0340812259a39.npy +04530566-3bb6a5deec68ef77fee64ca302793912.npy +02808440-4a7e3ca704e59439b362845c6edb57fc.npy +02924116-7369744c0ff9a5ef552840b851f9a5f9.npy +02818832-28bf7b22618b3df750bfb13a96421ac0.npy +02933112-9166dfd18ac60504f0fb3e3d2a0d34c9.npy +02924116-b96580140823a3624b8804c563aa0fc4.npy +03593526-b5f802103edd92d38c6cecb99943f941.npy +04468005-10e0da9af8eca77948b299c18ea5d916.npy +04256520-147df78321f90f20a494798fa117187b.npy +03642806-63e5805f8bd216313bba289a9fdd2a7d.npy +02933112-40f90a159f03321cc59350d819542ec7.npy +04256520-d20c3649494f2aac14bac2ebb8f636e5.npy +04256520-bc6a3fa659dd7ec0c62ac18334863d36.npy +02946921-540cb2a72840ec1130612f5c0ef21eb8.npy +04256520-ead2f0ef7103c963fc1f58a995f231d1.npy +03642806-e374559441d5c5bd386658d2bd45d727.npy +04256520-dcd037ab067a0fbc14038d588fd1342f.npy +03467517-dc623742d6d1518e19959b248340fafd.npy +02992529-4546af9a8a67e7439c3dc4e242073921.npy +02933112-76ee9167548caf224983f386c1ce1710.npy +04530566-6a9764e3e4127744be2fa29f46d19511.npy +04530566-ffb0a1240833569b9041e5038dbb1ef6.npy +03642806-e466c2c86a439c1faebff3b001eb4a27.npy +02933112-84ef04bae77ca17d532e8683617554c4.npy +04401088-8ea08c4be8f2f96095f577622f465c85.npy +02924116-15da18825e00c7709797a4124a9f002f.npy +04379243-268a739200930797c862eec8232fff1e.npy +03593526-275cc21fad6aa1b6bfa78a7d067c469c.npy +02747177-2251883e24a2527df155d75bbf62b80.npy +04460130-19e66890128da2d629647c2672d3167a.npy +04379243-b73a89c916a0237e90faae3c2240cd5a.npy +02924116-3c63a033cf78bc0f1cc733c58de8f512.npy +02933112-8488c41b4c17d0a81a8dfe268f567c25.npy +04401088-692e5fc16bc6ebd23737433332467411.npy +04379243-d5ca71b9b9ca6e5041b73991ca70550f.npy +04379243-95bfb466d603b6baa45e8d2f28a9ea98.npy +04256520-d546b9afa6d0a22fcabc196a7f35f1aa.npy +03046257-158ba1d60c6418fe4b3c42e318f3affc.npy +04256520-8b5fb1851caf5b4c5b89c9fa863d4b06.npy +02933112-2cf4888579296377c59350d819542ec7.npy +04256520-33ab50198c84645ef91663a74ccd2338.npy +04379243-e28354127815445a83e5416284930195.npy +04530566-7c23b6218a5041f36a2173cf491934bd.npy +04379243-56bb7376dfa9cb5c8cf069d506f8b5ac.npy +04379243-9f5cd9e55f0b4c42ba128419b7cd4010.npy +04379243-87666a40c8a35641c7166d921771062.npy +04379243-e9ebf354db8fc0fb4faac606fa48b508.npy +04379243-90f2e686389b56b3bf262660cda9995d.npy +04379243-d76d897ff334065a82130856eb48454e.npy +04379243-ea21cba1d83526f6deab8d9bfbc24756.npy +04379243-b23405a8f15f3fdb44175b4dddf5be08.npy +04379243-76de9805c6e208e6b2644d7d4d7ea2c7.npy +04468005-3d4ead5985c72e2fdc14ba0818ee5cec.npy +03642806-6f20fd2e8d8d518da5f7b1c78f76e23e.npy +04256520-f8d7dc3e169cd91d593ebeeedbff73b.npy +04379243-727b33a75f10861423fe3501bb9e7193.npy +04379243-d9faa371af8e7f443fa7114f9b06aaa5.npy +02933112-7bbdaeb0633738e611fc2b865c2a185b.npy +02871439-2aa9c8be14fbd5ffb8723a5122beedfb.npy +02808440-a9e1f301ddd72647fe52ffd0e748a1ab.npy +04379243-541ba3fe085905e19ccce4c6d5bb195f.npy +03467517-ba6d3dcff42ea7bba32c4b8efb0131e.npy +03593526-c1ded06f2af01612a54fd40ef3a8dfd0.npy +04530566-6fbb26f9372ee87648192cebc0015590.npy +04225987-e06b51f45c1aa29a98c63cb68f11df34.npy +04379243-c6c412c771ab0ae015a34fa27bdf3d03.npy +04530566-6c1cfb2fe245b969c2e818a707fdb3e0.npy +03797390-599e604a8265cc0a98765d8aa3638e70.npy +04256520-2f6f16e5a1d36f3fefc579970fcfc006.npy +04256520-25e718b0164f54d5a9f35e635b7e48b.npy +04256520-3a3cc27878713c19676de9b6e111da8b.npy +04256520-2835a9015c20d891261770c74651d29a.npy +04379243-c912a8edbaaf0fc72e6a7aad8523e7e6.npy +04379243-150c9c514d3274b315e97d83801e911c.npy +04379243-39bb09201e0cd201c17e7f250c5222bd.npy +04401088-ff9e8c139527c8b85f16c469ffeb982e.npy +04379243-b5daa2d15dad58d24fa2457d6e4d0c91.npy +04379243-818723195f30327b445e85eb534460b0.npy +04379243-ead000700697a012310af74324aae27f.npy +02871439-b105d36dbf010903b022c94235bc8601.npy +04401088-bf8e0289ba786e97487d18402ebe69d5.npy +04256520-a6cd2326b2660ac9a4dc2316a7e66d36.npy +04256520-4bebf39e3fd794937177a91ecaf96588.npy +03046257-cd17490f806732d460d9b527752ac99f.npy +03642806-80c013931b7f7b49636ee1998fc5378.npy +04379243-da5d6d0da4ed0c1cea65c47b660136e7.npy +04379243-151c68b48a1359c58566c6c3bc94c70c.npy +02992529-3ef278f78ddb1db52a39b1d7ef8834b0.npy +04256520-a54fbc57992e90b9593ebeeedbff73b.npy +02924116-8900a49e1cdb3470c95c7a8a79dc0c72.npy +04379243-67a49674df5b8a44f51f77a6d7299806.npy +04379243-3c5148ac155d020763ed57e35c972b4b.npy +04379243-ced7aa76ea532e0a68e125404f814ba.npy +04379243-bb7672d1a987dc303fb0851e9bc87551.npy +04256520-a63bc3a5d43888a962e682c9809bff14.npy +03467517-82f1a0f72d800cbd93f0194265a9746c.npy +03001627-bf89775d876f6849f2b7580a739cd4d5.npy +03001627-f1c6c74053fe8888c5f49519e3caf51.npy +02933112-323c85aa6d1949abaec7b0e2cd000db4.npy +03001627-c4ebef05a72fc4f39d62eb3fdc2d3f8a.npy +03001627-ec0258c40ac29da083deefb07c367f12.npy +04401088-e156db6fe3b9286c87cb3c64e47598b4.npy +03001627-62f442aaa230eb34e7697d561711bd2b.npy +02933112-4d3308cc92ffdab432b72c6a3d82ffd6.npy +03938244-f921237171924e992d9c07d3b9171829.npy +04379243-a5c68fc026173a5671e2498adb56e791.npy +04256520-4d5adaaa9b5d9d42ef188758bf2e3a30.npy +02808440-a31af845a610a552d83e8d4109d37961.npy +03001627-e854aa6a9c97d829cde6b082a301e49c.npy +04256520-a078e45c64ef80954a4ccb8d69e8d887.npy +03691459-835e01af50296235aefda81565fede7.npy +03691459-2db3489b490b0d9e2268dda5c324173f.npy +04256520-542656b66458b918cfc64925a56d7ba.npy +04379243-7813f4e4c0a58118cbb8bac2032149c.npy +03001627-76710f51915396e0327289c00b6dc9ca.npy +04379243-524af53b7863f506e227c1bcfe5b1fc6.npy +04379243-32a6ef11cd29c6333002761e7a3ba3bd.npy +03001627-e896f38e6b62f25ce030e064f3b8af2b.npy +02933112-8e46f3a871f86befdb955a8e38fc7dc8.npy +04379243-ae62ecc28b56c7ad68e125404f814ba.npy +02808440-9458bf8670645df33321831d2245cf06.npy +03046257-253156f6fea2d869ff59f04994ef1f0c.npy +03001627-bdffe559220b8a561b01b8d225cb89ac.npy +02871439-692947c56ddba208b773535ea8cba6d.npy +04379243-86951b133a4c6e9bd989b7b3fc68c580.npy +02808440-958ab8793129ffb53321831d2245cf06.npy +03001627-7c2bd3b26bff1d7568c981036afdae64.npy +04379243-39f0da2d45ad3b6deb82e56bb4ec31e1.npy +03001627-cd989e48c5348bb530e06a011e63236a.npy +04379243-f1695a9ec05b757ec7cb90e4399b486d.npy +04379243-a91554caeaa6f9db399bb05f18e8188b.npy +04468005-4c4e55e6cf8e81adb2faf16541f353f5.npy +04379243-175a624623ad6fb037b2bb75885cfc44.npy +04379243-96122c5c0777cb85d3520bbaf4a08c12.npy +04530566-b7a3a8c9e2e1f0eeb569bc98d0a027c6.npy +02942699-3d81cebaa1226e9329fdbaf17f41d872.npy +03001627-404d58ff6722e4a34014f1a5fb376d1.npy +03593526-b89f48fd4a8921dffdbe2bf897d8a820.npy +04554684-f0a1e9e6ad4b47b60a634b9aafd6dbd.npy +04379243-2dc5edae3c234a5b5706d1c54190f27a.npy +03001627-6cc771aa1a807dea19fb4103277a6b93.npy +04530566-f8b80289dbba94bdb7002bddf0942f8e.npy +03001627-891f1cd440afa11517b431cae0dd70ed.npy +03001627-37235898ebd06b3b504721639e19f609.npy +03001627-59f1f818fce72660ac285e4454a089f0.npy +04379243-6d54019f7543e4eaad16260d4d73b56.npy +04379243-15a6e8fae3343178b4c161851ed2b4e4.npy +03636649-eefbd20231e62d535c10b08ea69398c3.npy +04530566-70dcc0d460cacce0e63ec060b551ac57.npy +04401088-d4407c240737b0c73455cac94a339dea.npy +02942699-c9c9ffd08af8b268b52759c2c2fc0d1e.npy +04379243-b91d82b0ef56c395a8005eb66c8d94ac.npy +04379243-6bea2e040e199020e0c5923879d79f21.npy +04379243-8cda30b88d9bfa27d810b14a81e12eca.npy +04379243-356fbc66c305dae355f46d55537192b6.npy +04379243-7e03f7b740e118abeae724160fcfe6b4.npy +04256520-ead777f4e8c5bc346ad8177a9d42d3c9.npy +03001627-e967c4817872b637de03ab2a27ba7531.npy +03001627-924f413e0a7a6ca8492d9da2668ec34c.npy +02933112-1ee6393153a3146ebc19762eaa7ba40f.npy +04379243-8be5c241cef6212fbd1f60c111786ed.npy +03467517-b10a04b6b2e6bc42948046fa63441a28.npy +04379243-cc42f5cd765780d5dbbc9440457e303e.npy +04379243-3f411154853b403921db4632488a2ae9.npy +03467517-1218fa3b8681bfa5d57700c05b1862d8.npy +03636649-1579c3aae8e26472db1afe6c464e7652.npy +03001627-aa93247a7fa69991e074517a246f1e65.npy +04379243-fd57354b70d416386086aaeef17e8c87.npy +03691459-37b5f7222e0eaaa78803395bce6d7b63.npy +03001627-8c76b1db0a08653ffebad4f49b26ec52.npy +02946921-295be2a01cb9f29b716714dd1fd945b7.npy +04379243-34434ee1d6b154f8252b40995a250bde.npy +04379243-d6728931be54e6924b3c42e318f3affc.npy +04256520-84c480a1a055bd0f7223d6cbd6200e8f.npy +02933112-c5116cb158a5b4e6a0f23466c3c25e2e.npy +02747177-7a931ec996edbfeacb2a965e75be701c.npy +02808440-b5de770d4158a9875ad109ec59db9fdc.npy +03938244-4ae37fde7b123dab5dc3653f8341633a.npy +04379243-f2e1735aa2cba97222fbb0d1d627b825.npy +03001627-8be8093e99b94bd9cf320c31965db5a1.npy +03001627-ea7be2b97e78d5b35a4480134e0cdd21.npy +04256520-3cf0d27803acc8cf1290417619264ca9.npy +02933112-1d61ca99924b13fc99dd23ec22c4943b.npy +02808440-88f7396c2dc207d3b362845c6edb57fc.npy +03001627-bf879252fc85aa936d838816bd35691f.npy +04379243-d821813cdad2ca93183128a5e9c4cbee.npy +03001627-f5ef49d354efe6741cda53280488fc3f.npy +02871439-f10c63b9b25d17144dc074799d15faa1.npy +03046257-8a206a72f673973a435b6c388b558e5e.npy +03001627-353707e135c889d2dbbc9440457e303e.npy +04379243-8551281fe6e37db43002761e7a3ba3bd.npy +04530566-a8dd1e23448a492aad67d63ac9e4b707.npy +04256520-12843b5b189bf39f7cf414b698427dbd.npy +02992529-7f756e697cd03ac821844676433a0aca.npy +03636649-684a9c789b62321092cf95a109e87d7d.npy +03691459-539d5ef3031544fb63c6a0e477a59b9f.npy +02933112-14ed803c2251dfc1ec451f73f474981c.npy +03001627-d2af105ee87bc66dae981a300c94a911.npy +04379243-b11ab64f79e13e1b714473735ef35ab.npy +02924116-6060e1abfb2c85da2eed4e833c76b59b.npy +03636649-90651b3febfc3afe15226aa76eb7c3e.npy +04530566-1f9315ee16e03c64450e0a3087ad6863.npy +03467517-5a5469a9912a03a0da5505f71d8f8d5b.npy +04256520-930d2bd446a43e0ee8058cf23f6382c1.npy +04401088-f5f1fbeca9af99c98efee9b82d757c0b.npy +04256520-31fb6cfde1fec63897f7290a893b9fc7.npy +04379243-8730e3ce4daf7e264f265f0c85da0b1b.npy +03636649-d9f6bd064c9fd456fcb8d8c6d4df8143.npy +04379243-da23d0bdcd1de093de909714df3390c0.npy +04379243-a2561614d015f2fdfebad4f49b26ec52.npy +03691459-c134c61a5b45dc281574d21c0c95092f.npy +04004475-cadd6125bf30f513e10a48f2bbb9bef4.npy +02747177-71c45644821a8961ad5067eac75a07f7.npy +03001627-86e6ff997adb2a192c90ae7b7282b9f.npy +03001627-d4edd167061dac5f52a3901fa1436b1a.npy +03001627-56cc047440e7c999a23949c21eddef76.npy +03636649-70652459696b25037e0f056bfb925424.npy +02808440-2b1d6ad1dbdc945bc3f6ab99a06dd7a.npy +04530566-8d8113b30710a6bb68d1fcae6985bcc8.npy +03691459-77514a7ccd32860dd9dfbc520b0d9752.npy +03001627-1f8eaa7aededc7e637b2bb75885cfc44.npy +03001627-ee445cf3710af7e21548fc89657a4fac.npy +02808440-37f0a39abf371409ec54a7cce22716f0.npy +04554684-46251e61b0c06c0771ee000eee74cabc.npy +02691156-6d0b546bb6256eb5e66cabd11ba41eae.npy +04379243-b16b0c22f89f43ca9b40e76e725878.npy +03001627-f7626a4eb581bcd7140769279b0e5e15.npy +03636649-5ed0d3a50d9d77dcf1dc60fdf1e64165.npy +04530566-3838f398264452a47c97d792b03a31cc.npy +02933112-626bba505f03233ef51f77a6d7299806.npy +03636649-14d3d2418165ec86bba785994a529f86.npy +03691459-5e40ffef9d25d0f031f3d76ec3df45bb.npy +04225987-48bf45bffab55d7cf14c37b285d25cdf.npy +03636649-4e54fc131882f2233c8d0fdfb1cc2535.npy +03636649-29a363fc242b282b45df535caecae62.npy +03636649-15606afd522923eb4e91947b208587c6.npy +04379243-e2f60503a4fabc4aed20ed9a17aa05a4.npy +04379243-8569fbd5e27a1845e7c7bcb951a9c987.npy +04256520-9b651dee9548be90ded526a7be77b30e.npy +02773838-54cd45b275f551b276bb31db0358e9c6.npy +03001627-a7caeaff5582f54f55f9913e822d5318.npy +02958343-1d234607fafd576b6dede2eec861f76.npy +03001627-a1213da0e7efffcafebad4f49b26ec52.npy +03001627-ccf29f02bfc1ba51a9ebe4a5a40bc728.npy +03046257-1782876c0f584452cf5a37a70014c623.npy +02958343-c1192c946a99ee529bdb511fb702b5ae.npy +03691459-916d2e621caefe3a1a4345b067aab43c.npy +04379243-a4047a8f57451762a0ab1d82ef09f78f.npy +02992529-7392ea79052281e6bfbac23a8087e8f4.npy +02958343-e999dfb757ddca4830e7f6cd6fb3f1b9.npy +04379243-ec9861c234daf6bc915f51b5f5e95ffa.npy +03001627-55e7251e672cd45e796c584ff1fcf56d.npy +03691459-cc9edcabf65e42d3febdb1f263373824.npy +04379243-6b521eb69b5af97dcddece8d514fc823.npy +03001627-47eff1e5c09cec7435836c728d324152.npy +03001627-6c5b15a19101456219cb07ecb5b4102.npy +04379243-c193add7ee3b4fbd63aebe2e86fe0041.npy +02958343-28bb7eaa8037a2e9afe1d4530f4c6e24.npy +04256520-77196cfcaabb6f750cf3715818ccfe8.npy +04379243-634bcd3197e337aafe4e4de1adda2150.npy +04379243-206a239d64ad2b31664b3b9b23ddfcbc.npy +03636649-cd0f2eaac6719a3ddb039d8689a74349.npy +02880940-64d7f5eb886cfa48ce6101c7990e61d4.npy +04256520-fee915afe193518dc036a40816608369.npy +04379243-6560de55043db06ab0783d9ebb200d10.npy +03593526-7213aae6cdadc227d680196133d8b70f.npy +02958343-2854a948ff81145d2d7d789814cae761.npy +04256520-924761d5171a0682e5c139899870edf3.npy +04379243-e96108e514142d13b3cf15c77de45986.npy +03001627-64a699cf5b2a43473f7e27638e63d848.npy +04530566-684d665be29eaa49a1e649e7e3e5f054.npy +03691459-5336a4698616726725a4212543dabaf9.npy +03001627-e25c7c2469135e3fdd3adf3090c701f7.npy +04099429-daf0f6c6a4bfe6843656f5a839c1bd14.npy +02933112-45bb41433302f3f5490ad276cd2af3a4.npy +04379243-887ae0ad66669f1b302fb2a9e79d3e7d.npy +04530566-7bfb0e8e74e1bd2bbe7ca2216dc1576a.npy +03001627-61de75e888e8727486debb0a33c851f8.npy +04379243-d2222dbbaaae806cacd0ab81dc64966c.npy +03001627-6e53d494768386ca8579483a049f2a91.npy +03691459-73c76faf92402a9183247f812f2eaa97.npy +03636649-964d3a853d6e5a642b1c313558664cae.npy +04530566-60c58f42072396986d4334e260ec617d.npy +03636649-ff22bf19e2ef19d12f7ffc95c59dca52.npy +03001627-8f268673d08240d34eb6dda9557ab0ce.npy +02933112-1de9b71f35b51b56c59350d819542ec7.npy +02933112-c86f009c4d1e1d2941e1a63759e8b225.npy +03691459-a05dda1538ddcb4cd747b49524a1246e.npy +02933112-8e2f81ceda8e42ee4b4e980f23aaee7.npy +02933112-298dcf7bd982cf0712de5317fe5b354f.npy +03001627-997853f8fa3678df5ac8254dd793f590.npy +04379243-20d23be3b5180ea9e51ca3f3e83d9132.npy +02691156-e501a0327ab3731d0f859db45b95a2d.npy +04379243-ba99a0f31b2ba6e51f087e2218f8d26.npy +03001627-fbddac94cfa74a7b5c0228148b88226c.npy +03001627-bf41b418250959d0a8699b6183baa203.npy +04379243-696425932b878a839335a4bbd2281da5.npy +02933112-575d4aa0c1b95b0836d8dd30a594b2af.npy +03467517-301e0388592cc17bee974d1eb57427bb.npy +03636649-51a0575368d16f4c99e8bf807e902261.npy +02691156-273c9c0bd43443c3b4f192eea1889928.npy +02691156-86590fb6310cf7361f1ef59130c405d.npy +04379243-a9e23932f14fe0cd323ff07d83f4248.npy +04379243-47317755c82114d5c3bd24f986301745.npy +03797390-bf2b5e941b43d030138af902bc222a59.npy +04530566-a48181b53d207f702ec88d3440bc2d77.npy +04256520-b8ab014839e2a28af62af8489541547b.npy +04379243-b7ff6501981195caf771fa2e8f483ca5.npy +04379243-23937a360c840bbd2b70eac6546e93fd.npy +03001627-104256e5bb73b0b719fb4103277a6b93.npy +03001627-4ed8015bdbd8c03d2f95e2a1e9997b85.npy +04401088-8959f06b36d90e6a7c4a9987d1ab61dd.npy +04379243-44360c91a7e91098d93768e7b9b1eabf.npy +04379243-dade0594e68e2250be6c545952e7fa4a.npy +04379243-daca80d92e046faaaf90989a4df930dd.npy +03001627-d54100efac3ab743626ced72908b525d.npy +02958343-597c9eee5a5ba96b313436e774fa02eb.npy +02958343-19d35f3e0c0b402125ddb89f02fe6cc0.npy +02958343-62a7e17ce83e2f9cc0ed6ec757ca50f5.npy +04256520-c97af2aa2f9f02be9ecd5a75a29f0715.npy +03001627-a9053230c8e02442c8687ff9b0b4e4ac.npy +02691156-10c7cdfdffe2243b88a89a28f04ce622.npy +03001627-9ce08b44810f03c963cf8719fe855f3e.npy +04530566-eadf347da5aa8877da97052ff1f36504.npy +02958343-46c504c9760fcf0e7540f431cab4686.npy +02691156-9617ea33f17993e76f0c490da56d34b.npy +04530566-39875815bdfdce2193b1b9ed21f1fb92.npy +02691156-189f045faacc1b5f9a8993cdad554625.npy +02958343-ac56c7527df057173c5d25c30835eee9.npy +03691459-9ec130a3ef44b7a1e47833b310955a9f.npy +04379243-c14fe6a74a071b73664b3b9b23ddfcbc.npy +02691156-d1b1c13fdec4d69ccfd264a25791a5e1.npy +03642806-1a46d6683450f2dd46c0b76a60ee4644.npy +04256520-48b2e88f7d199d43517a64eed9809d7a.npy +03642806-7d733a513d905a1a56fd4d28526341bf.npy +04379243-10e2e8385b5322144708f4c6142673f0.npy +04256520-2c12a9ba6d4d25df8af30108ea9ccb6c.npy +02958343-1d0a46cfc2799eefdeea60824a43a0b.npy +03001627-63c7b59dbb2876b4aa2ac8cb6992212b.npy +02958343-11d1fdaedf3ab83b8fb28f8a689c8ba3.npy +02871439-b6bed1d1abf2f8cdc2731798aec2f82f.npy +04468005-fa69b96acfc4ab67d6d91af432c7bb1b.npy +03001627-c70f8a49f26a012f876b399a99a15c0f.npy +04256520-23482a90a12a7052bd184e94aa5ce5e4.npy +03636649-445724eab48f591cd650d96de5aec623.npy +02691156-dd4da4309c12d47bc2c2c81e2232aa95.npy +03001627-4abbd2b632d3aeae4b3c42e318f3affc.npy +03001627-eadb3d38d02343ba4d2a756b9ed2c425.npy +03001627-cd547b0ff5cd668a86c701087a194026.npy +04379243-538cda9b8cfefa3f4854e924c443f593.npy +04379243-35b005d11a25b25581faebbdea6bd9be.npy +04530566-4869abf7743f09b71f29de30ec1bf6a3.npy +02828884-956be1b39e4bf1b963b2acb037dfbcde.npy +04256520-b02c25874494cd60f51f77a6d7299806.npy +02691156-12a1ac26d29ed1083554ccf8c30febe7.npy +02958343-6ddb807414fa23e0d9f8911ce020a037.npy +04379243-d5a374e8465fb8c2858699aaad4acee4.npy +03001627-321f8b85785f082685e443e0ea51d93.npy +04379243-d06b3f46fd5a901d4854921d37f7e048.npy +02871439-ae26bec5a79f51943da27ece6ae88fff.npy +04379243-8e7c894039ae2cfe99e8bf807e902261.npy +04530566-950ebca8ad7d94051fba2cab1ada6bf6.npy +03001627-33617cc89afcf169e6543556f230fe9c.npy +04379243-7b3b160dafe7e122d93768e7b9b1eabf.npy +04379243-27eea1054be1880a7eaeab1f0c9120b7.npy +02691156-f016679500a76fbd8badc4a9f1acc937.npy +03691459-f156e32edfe185b76ac6c4392c71284b.npy +03636649-ffc2479f27a1013afcec439ba0368db0.npy +04256520-5bd1a7825fd8c16c6eb9b08c8a74d159.npy +04256520-b2a9553d5d81060b36c9a52137c03278.npy +02933112-8d4833c24a4e983fcf004563556ddb36.npy +04379243-20812fc7f9dac9a51b3e6b75a323070.npy +04379243-1a53d35ef172a6febbaf0ab08a397b2.npy +04379243-9831a5ae9045c6f39155acfad44fdd03.npy +04379243-1cbd4d2be9cf0e3e84ef3d675a0511c0.npy +04379243-3eb80174aa72a62910126c0551113ce5.npy +04379243-7e651b7d860842deb612ac3ee32028ed.npy +04256520-8e2912b6699ea81c3db8e8b3ea723cce.npy +02958343-86aedfff061c5b96f500cc506a763c18.npy +04530566-1ce3bf4b1ee8c4b41542b16dedc43949.npy +02828884-ee8c43b1ffc8e8cd7389336cf5b6aec6.npy +03001627-51f4ea68be319fe8990e5087098e19c.npy +02691156-a98038807a61926abce962d6c4b37336.npy +03593526-e93934fc1da4635d5aa09a1176194412.npy +04256520-cde1943d3681d3dc4194871f9a6dae1d.npy +04468005-82d34870d2b5b59b5176b359c67b3356.npy +02691156-752d9a010346862551cfdb4c9f126c12.npy +02691156-7f3446564689ac918f69a600441c970.npy +03046257-37d5bae8c287486e93eb10cbaac91.npy +02808440-3efe1e2fc2ab4c0e4e58e1f374dbffd.npy +03001627-f68ecc9ec512915f36d8dd30a594b2af.npy +04379243-928ea87878a7bbe26cf876b69450cd4e.npy +03001627-53a1b68bb05d5b1bf51f77a6d7299806.npy +04379243-a80fd4790dfa2d226a4bc5d920331917.npy +04379243-dbf47e19a5f352e0f1b010366bb60ce8.npy +04554684-3e4b1aaca677501b91219aad82abc053.npy +02958343-d810d7f83632da71556235a31d374eb5.npy +03001627-978ab0578d8691ceeaf7fa9cda77a592.npy +04379243-f6c1a97812bd6ebd952c86497c2cd532.npy +02808440-10e41094453d1c6d4c62bee40dcdc539.npy +03001627-fae27953e0f0404ca99df2794ec76201.npy +02924116-5201d514f274012b52470de2774d6099.npy +04256520-cb7cee345d3e7f75593ebeeedbff73b.npy +04379243-60ef2830979fd08ec72d4ae978770752.npy +03691459-4e68ac6cecd91de23d91ae2b92426394.npy +04256520-9cff96bae9963ceab3c971099efd7fb9.npy +04379243-f026d1e8b71bd18e97f16d67bfc59c23.npy +04256520-2d1ebd7356968c0919fb4103277a6b93.npy +04530566-3f3bf820fa5d171bd45d4d5673b732bd.npy +03001627-4f0fc7761771d073fe2cac60a76c70a.npy +03636649-16db10b6ee500ef94b3c42e318f3affc.npy +04379243-7a702fc01ec83c36b93dc42f7dcef6a.npy +04256520-857c4d70af14d9d9e9b88e9734c4cd55.npy +02691156-afd02e6d4cf0a342c1ccec171a275967.npy +02828884-50184fbabd0ac41acb2a965e75be701c.npy +04530566-70b4666e2da7ca32cfea3d4fc15719ea.npy +03636649-41cc8b1669429bf92a7d46e74f08da70.npy +03046257-4e8d2c3317d397dfd1f82efe36dcc0.npy +04379243-4eaf30762a61db196cc318d65b897138.npy +03001627-9e14d77634cf619f174b6156db666192.npy +04379243-4e232b14eff92afb268cf362bf3a8d20.npy +04379243-5edf1990c995fcd7693e54627de491a9.npy +02958343-1a0bc9ab92c915167ae33d942430658c.npy +02808440-ab60eb30629849e96b448b8aaebb705c.npy +04379243-38bbdd91e895c0f92c0404a105e586.npy +04379243-d70877569d163235aece045e8bdac80f.npy +02992529-caa0cf3c7bf2cc4e50e8879f012090b1.npy +03001627-664eb477f8098678f1783a44a88d6274.npy +03636649-c2f6c7b7b39fb06fbd4bf7024dfa167d.npy +03046257-44316e91d4926a73fe9c9da4b1c78d03.npy +02933112-dd7e681525a458befbfd931924135513.npy +02691156-e4237061106f5df1dc82b8fee1057b30.npy +04256520-b55c43cbec762a54eaf14273fa406ffc.npy +04256520-ff5aa5eb5ed4041c1ef9727a7f361b49.npy +02933112-7f47c97fbda19b57490ad276cd2af3a4.npy +03761084-df5bd51614d2fbdef114be17e2e7c4b5.npy +04379243-5c63f336ce5ea7d621d1a69a8eeb6a01.npy +03467517-26e1801ea747f72f14fe0da28e4f8384.npy +02958343-6107486a14c40227665f0dfc9cc02b1.npy +04379243-758ab4ddc8fde77cb2b755acb296d925.npy +02958343-74b4d0c4ba72eba8473f10e6caaeca56.npy +04401088-eb61306048b7848c327b5f10f339d9f8.npy +04468005-713beb3434e30be68498191d94ca767a.npy +02691156-1f08b579e153b2de313f9af5275b7c70.npy +04379243-200e41f83af78ee240add2170313bb0.npy +04004475-83c3034992c6afbca0622b21d729afbc.npy +03691459-b00c5ddc2efe42eea64e5c46abb30c70.npy +04256520-7e4cb0c15959883242095a33119f8ea7.npy +02691156-a34a2fa46d7a0a6390b1d6deb98feec6.npy +02828884-15b3111c1611c2e5738e43095496b061.npy +03001627-a1ee33aadb4754a492d9da2668ec34c.npy +03001627-452d2a10ecc96b34129a4a365910676.npy +03001627-35d60ae4cb2e81979d9fad88e2f4c8ff.npy +02958343-c8d8089dade71547d2350421a9405ba.npy +04379243-5cb93ef515036277253e170a96a633c1.npy +02924116-899abc9a81424b5d73ba5c85a4ea149f.npy +02691156-384da5cd806c436b35039158de2eb4b1.npy +04090263-b34827c2da8ed1e32029d06c0cadaf74.npy +03636649-9b558be5e2b60e3eb09f0ca9c143fdfd.npy +03001627-e0a19f7c41d7489211fc2b865c2a185b.npy +02958343-431ca41fdf0897c628ccbb4eb8965b05.npy +03691459-6070b86ba88f51a52d48173107aeaaf8.npy +03001627-38bdba5f6455c5ff91663a74ccd2338.npy +04090263-fa35dafb0a24ed8b2511f68da65f4c4.npy +02992529-41d95e8979b8377d251f8cf5c284bd7e.npy +02691156-a7df65b30f1e6a3663d1bfc21cc05e4c.npy +04379243-66298b3f4d2dc69db6572d78be2f91d8.npy +02691156-329b62a63e882c7c71d03b466c72ce41.npy +02958343-7e7cc90bb7f265d2b3cf5236f651a8e6.npy +03642806-8b10449b4c25fb0939773ee5b5578e3.npy +04401088-87b696d3942f6845fe75c83a5776ab77.npy +02958343-9c06490e82e122093f599d94ae17ce2b.npy +03636649-9afc2aefd6b17db014038d588fd1342f.npy +04379243-3d6b55fe2deb2aa3a1c746794f191dc8.npy +03001627-2159af8011e13b81713decb1a0563b12.npy +03001627-e9592e2a4fc74bf0492d9da2668ec34c.npy +02818832-b1a03d41a681ed0220192a5319e3e2e4.npy +04379243-35cfc39065c4073f4b8710a3469971b1.npy +03001627-3b788994cd578990c35131da26f8061a.npy +04256520-252be483777007c22e7955415f58545.npy +02958343-8280b8d35355bbd56204845b7cb50f20.npy +04379243-66b43780a0e81cbf16a2b5862518c93.npy +03636649-110b426397c707bdc9c869210ebfd6b0.npy +03001627-7eabd19312bde1dc9335750905007562.npy +04256520-bc72ab493655beb5d329896bbf26eda9.npy +04090263-d747c1f677349e78803b54e9738b20a6.npy +02691156-8f4e31ee9912f54e77fd7318510b8627.npy +02924116-69e61d2ec68e8184b1626da45836ca54.npy +04530566-38b55fc61393e40653d45bb9e1743653.npy +02933112-4e89985989c6a1936aedbd2a02b96953.npy +02808440-78648b94a2402ca6904e03fa15bd73ec.npy +04530566-d35fc449232d68474163d08524f89006.npy +02933112-d6bd6fb5d0149227fa242b893d7c243a.npy +02828884-bdc3a9776cd0d69b26abe89c4547d5f1.npy +04379243-eee6cf14a56af26ad71f17d6e8238d04.npy +04379243-4bac1dcc5b39f3d1a4328b1daf5160d6.npy +03467517-81bb9fa998f58f2e4bfcfdb26b8cb2c3.npy +03691459-427edc7774b50232a789103b1a0f3e38.npy +04530566-a77c64b41bcc66bbca4b459ebb5d9bcb.npy +04090263-75066ff8b9740bcccb88c9db6e396994.npy +04379243-4f31d399c2c778135fceaa39a8353bde.npy +03636649-d2fc5882e1faa78c1592f292ab531da8.npy +03001627-d521a48317d0b14d7ac55d461d1984.npy +03046257-944ce52789d061a74d6ea0439e37ef4.npy +03001627-589cd6a1f4367fd834b707eb14b2a4a5.npy +03636649-96837f1ee184d9a4522f1ade738c024a.npy +04468005-e9d3f23adfd51c53125a6be5853df664.npy +04530566-2dbe5ea82a45443b71f3cc81eb6c076e.npy +02958343-f7b9529fb166ee56ac922d597da8f180.npy +04090263-7f219882b778b66c67fd32336d183e10.npy +03467517-b47dc8ec5f06cd414bd9729c64cda7af.npy +02691156-c6342ca5cf5c445cbd46d022fd7d80aa.npy +04379243-74fe5611d491a2b77b286d3c174c2040.npy +03001627-d5d4dfb9e6901b66a3f22b4b00de6dfb.npy +02958343-f37c7ab91bef514b4125854591376336.npy +04379243-e12ce317c2d9fd0eb9fb1fee7d937756.npy +03513137-93acbfac563ebc4c1d05dd90478fa7ec.npy +03691459-5c400c09175e3801bb3613d5601159a8.npy +04330267-b99428bafbeb30ae4f925e12806745af.npy +02828884-cd7689a92e0d39896812e49a5c99d0f3.npy +04379243-f4888967269031b295feea036c244c98.npy +04379243-e2807c8c5f5653d4bd91edd7a65c1323.npy +04379243-878872e3494e6b26baa48d60edc63ba4.npy +02992529-d37afdca0c48251044b992023e0d3ef0.npy +04379243-561cd495a38e22dfddbe8a6b8178038f.npy +04379243-86e6caacc1e4ddb5e762cf5917cef4ef.npy +03046257-388da8044b2de673b138d9e8fa5eed8f.npy +02691156-8b1b372c0ea200bd225a23c790f08fdd.npy +03642806-d88e4093a73064b6b44d9812f259e403.npy +03046257-89618f2292b3d05d48d189f942cedc62.npy +02691156-b6fb57668129c4cd4c11ffe5517eef5a.npy +03001627-4785c094e81a5f8e3002761e7a3ba3bd.npy +04256520-96055e2a648903bbaf2302630d34f30e.npy +03001627-5a4c550b1b41114c3d2617f9171b5ccb.npy +02828884-5d8f7c82a04943fed201085e80edb26a.npy +02828884-7ddf43b3b160ba10eee5b98d7c69f27.npy +03636649-b75ab10d1235158ed91ade1c391e4016.npy +02691156-a07446a1799bdea7afd477f714c68df9.npy +04379243-68b18bb0c7eee83129e4b5aa807bb4e7.npy +04379243-43ac9f2d108ebcd0c3bd24f986301745.npy +02933112-a1f901768250762d4f60f15da4c665d0.npy +03001627-1015e71a0d21b127de03ab2a27ba7531.npy +03001627-ec7076f7f37a6e124e234a6f5a66d6d3.npy +02828884-901872a92ecdfa4863b2acb037dfbcde.npy +04379243-41c538c37e2ade9047f446d318aa6c9e.npy +03593526-b1584e986a706101773b5d04f2ffad47.npy +04004475-b6fa2dd4812d69d90071898148dca0e.npy +03211117-8ef52dd9b307eebfa31cc7b61ec6561.npy +02924116-c9bc84079b8ab89acdbb9fcf2ed3a2ea.npy +04379243-f7449ab20f45bcbab1b6b0c5ddacb607.npy +04256520-aef57ed7044469ba25e322bb8575a360.npy +04256520-7598c48286a63854c02170c33e00ea64.npy +04379243-5f3f97d6854426cfb41eedea248a6d25.npy +02871439-d49f87c534c4e0b5b4979bfe197a8c89.npy +03211117-4731c3b756e3366958aeac7d536d442b.npy +03691459-1a9a6a214c957757cc6617fc407c9ed2.npy +03642806-9ef061efe37e9889d7c51311132e27a8.npy +03211117-9d51ab35cca6288da8b55d3e40d96c08.npy +02933112-49b69d5e4330ae2457b1c0b6d5084bcf.npy +04379243-ccf36a20b7ef3bd128071d61462a212d.npy +02691156-79351c8f83f5a3abb2d09bc8d348e46b.npy +03691459-632510d0916f31a184d6a2fa7259858c.npy +02992529-183e8d61b3c4edcc90b5b1d619d7013b.npy +03001627-539dd50ce4d5fd97febad4f49b26ec52.npy +03467517-c5d8ccd04236514966382ee33d7a02f1.npy +02828884-db4aeb6354f5bd0dd4d8765e3910f617.npy +02691156-d07277bc3c95a365bd46d022fd7d80aa.npy +04379243-3b6b823039a912023002761e7a3ba3bd.npy +02958343-4b7b3b54dc04df53c19f1e8ed99ac2fa.npy +04379243-6fd88eb1bc87efd6f51fa0238791f5dc.npy +03211117-e80b420abf6c590c3841abb8f4ea69aa.npy +03636649-2af318d179f969aecbde89e0c48a01bf.npy +03636649-b88c9a7aaab268fb42b08fbc749346d6.npy +02958343-982448cbcbe56bb78f89cf8d2f8a85b0.npy +04256520-cf47942a67cae94eab49dceef0d15b99.npy +03211117-45cae393b431f75e8873c005ead1ead8.npy +03001627-ee6f7e45be30b0a5b9b8611336bc3051.npy +04379243-599200313a698b6cad5067eac75a07f7.npy +03636649-e507bc77c03a1b3afcb8d8c6d4df8143.npy +02828884-634524d6d74142ecd2b12aa6a0f050b3.npy +04090263-15c7233e2e883eb55a443e4394e3a0da.npy +02958343-bacc3c08f58dd96152c6e8b4fe0351e5.npy +03636649-53846d2802f58f97c066b9622c005c53.npy +03211117-7e3d087ac72e46c2e53dd9bb27ba3c50.npy +04379243-3068bb896d8a43c040e6664f04cec8b2.npy +04401088-816aef1e285ab957b1c67c24f425bd0e.npy +02958343-8590a6c8270375e34b5a812ecf553410.npy +03691459-2335c268bbd05a5f230584014222e685.npy +03636649-d0fde1daedab10365240248232b90795.npy +03001627-3211fc4f31b15964aee892adc836ce83.npy +03001627-73cf718c453779fe346b7e70ad2e57d8.npy +03211117-15e411905cf8d7d455c2bf8f07989ec0.npy +02773838-93ca5243aa73b5de81157c9325bb0e45.npy +02828884-1809f6221774f1b62d309335a9a8acb8.npy +04401088-cf0dc63412541764cf9d394118de0d0.npy +04090263-232beffe2c94564b678808412fe4ac8c.npy +03211117-c12a485b4241be83b70b5d25a1334116.npy +02691156-bb91e932504e90ffcc14f1e6f4f4f49b.npy +04530566-4ac3edea6f7b3521cd71f832bc14be6f.npy +02958343-5c960f83d0eab69cc9463ecce7643e8e.npy +03593526-324c9045843b9470d29670d38a4c9e7e.npy +02876657-7b1fc86844257f8fa54fd40ef3a8dfd0.npy +04379243-1c57228e08cdd81ea375e397f0227097.npy +02691156-a69d6f9ea766b9d1a13079850f677b69.npy +03001627-57583ba714a883ce71c3cf047830ec1f.npy +03046257-93369b3e29648260490ad276cd2af3a4.npy +04256520-3420ef8b6b20595e1b7dbdf53d301715.npy +03046257-ea3eb7aa3da2eb2df5f02cba8695cd8c.npy +04468005-7218bcb64665858c3fd38f4cd285f64f.npy +03710193-2c3e7ec7a87e73d8285663b602a605b9.npy +04379243-713a4be770bb19b9586b2526565371c0.npy +04379243-fe167899fda76d1e88dcbe86402c7c15.npy +03001627-d095dd9f3dbf4083a7e870da1ab2a36d.npy +04530566-5a3924c1fb78bb908dea00b146cfa3de.npy +04401088-2b33c33ab4beb7493ce1b993153ccc0e.npy +04330267-8982176eef2ad23fcbf3dda885c64a76.npy +02958343-3ba5bce1b29f0be725f689444c7effe2.npy +03636649-163fb10d7f6f09fcf1c7a32d97b27a4f.npy +04530566-8e1778cdc0bfec3e18693dd92ffa710d.npy +03001627-77d48297d441c7f5bbc0e8a3b6521117.npy +03001627-40e5d8e71ee3902a31358207d42bcb21.npy +04379243-eca46f21f2893069c0a61ad1cf92b694.npy +03211117-a3ada0a8bc0d4b8392ababf87635e60c.npy +02958343-5a9a67bb92fbfca3b1bb46d2556ba67d.npy +03001627-4a89a789f817ab5414038d588fd1342f.npy +02828884-2a80c18fc2b4732bfb7c76304cb719f8.npy +02958343-9aaf299edeecc76e7dfb1ee6a4b12bf8.npy +03001627-31f5725faebb53aba1fb86e891f97aa.npy +04379243-b69722ee8e35829feb20d49510853b52.npy +02933112-9935a1e91ef08470569e2e0d2caa039.npy +03001627-f736f06f8fd04e1119fb4103277a6b93.npy +03001627-420ca6eac51267538a2d6a427829a3.npy +02691156-ed2aaca045fb1714cd4229f38ad0d015.npy +04379243-d656a6250fe0058fd810b14a81e12eca.npy +04530566-6d96d3f9f621292b7eabc15108a128c0.npy +04530566-8d5e3b659cf0df154327dc86b5ea9517.npy +04530566-18429e2495592e5580c2e60c312b0f09.npy +03046257-50acbb342934ddd8ef71ac379ee99590.npy +03046257-9331dc400e10a91c991e9693c5aca3.npy +04379243-f4f96a7c9b71fa9855b72fb3e8922a58.npy +02933112-1e18f136798cb3f0c59350d819542ec7.npy +04401088-29c5585362cf4aa5b4f6326696174df2.npy +03001627-43897195d7f893d759c257be4c612509.npy +02933112-1a4d4980bbe2dcf24da5feafe6f1c8fc.npy +04401088-2cbfb354e5dd731dfd6c7e3f0d9c56c1.npy +04401088-e840fab2f764532ce4bb3cae511f21f0.npy +03636649-1b35500ce44ae7e344b6d51c32a5873f.npy +04379243-5de0ca3516c01ffe71a782a4379556c7.npy +04256520-240b9fc8d34f3af17e20865350fdf369.npy +03001627-4aafa7600e0aacbf7b11ae648ea92233.npy +04379243-56f6e87023f0dcbceba48f396a34b9dc.npy +04256520-5f32acd6df675a414b3c42e318f3affc.npy +03001627-99867a25638b6809b91b871e750ca615.npy +03636649-cdbe11124dbf418167ac0fa90111fad0.npy +03593526-e1fb6357c91654b455f46d55537192b6.npy +04256520-11b544b22dedb59c654ea6737b0d3597.npy +04379243-39806e081bf3fe564ee8db28f96ad26b.npy +03001627-88aea5f475654e491d77ac5988aa9265.npy +02808440-73f3495f2c64c929ccd0340812259a39.npy +02933112-15de6a77af2b4fccc59350d819542ec7.npy +03636649-1e4fd4cc6fee7cb2fcb8d8c6d4df8143.npy +04330267-d63a5fa4070c41c87b0af550cd1619e2.npy +03642806-a17cf326705a6443a09a37cf78d1b866.npy +02691156-4470a28f2dd0cca9d9fba06863881b8d.npy +02992529-54f1cca754751ec14857f88b08630a42.npy +02933112-533ca24b72a0552c5057ad0f363d6ddd.npy +04530566-ece02b7fb2257df139bf01a73033939f.npy +04090263-196b2e3c66d59cb54a4f87aa9a31cd70.npy +03642806-e5d666a9b3aceaa2626c1b61fb70e077.npy +02933112-b7f1176767b87b235c8607e33463027e.npy +04379243-425544b66203da392ebeb1e6a8111f53.npy +03001627-2d701c588b3bbbc458c88d30f502a452.npy +02876657-c771267feb7ee16761d12ece735ab44.npy +04256520-c3f48348482f8c5df4ae8c93f4db5e6.npy +04379243-92b044e982b28fb02075b603cae7ba22.npy +04379243-1692563658149377630047043c6a0c50.npy +02808440-dacf794f991fc0173e9b7c3ab7636200.npy +02876657-950d6ca1d2b53ce52f71dfd07ef088cf.npy +02958343-c7205c6c657daed1ecabc5c9d5c21b7f.npy +02691156-9f7d4125c4b705208b96ae1a0a8b84ec.npy +04256520-588f01ccac8746e1122e20a0279089a2.npy +02946921-6a703fd2b09f50f347df6165146d5bbd.npy +04379243-77b57f3eebab844707cdefe012d0353.npy +03001627-39911f927331db1c8687ff9b0b4e4ac.npy +02876657-4185c4eb651bd7e03c752b66cc923fdb.npy +04379243-9502eecc3a057115b129901f80d24b7b.npy +03636649-e6f2e77940fbc85a8e2d66cbf6a91063.npy +04379243-5b0e8fdc7208b8d3cafef66236db7ef0.npy +04090263-3474d85a58796c7a935777dcb8deec2d.npy +02880940-5019f979a6a360963a5e6305a3a7adee.npy +04379243-8ad88ee4442fd0fd8a6ba7ebad3985bb.npy +03001627-4efc68a96296be2ac785f06f424b9d06.npy +02880940-8b90aa9f4418c75452dd9cc5bac31c96.npy +03001627-5142e809212f8c314500047017815f5f.npy +03001627-d021835e503e575b4f7a7f19de079d1c.npy +02924116-d9208f7caab22206e70da94675b5e3ad.npy +02876657-cf6843231592b29e2586fa0d0359af6.npy +03001627-3a98a93f381ff5fb4b3c42e318f3affc.npy +04256520-e2ea1cd546d6cb4b94db33559ec0df30.npy +03642806-3b2db36aaa2546b99c7c402f274622c.npy +03001627-8e212bac2103bd626c518c577d808035.npy +04379243-93d8e32a11a3502336b0f2a1430e993a.npy +04379243-b399584ed464f6f5d2bdf2c065ab29bf.npy +02958343-60066a5369f1354e631a23fef2ba638b.npy +04379243-1b273f4af777469e42fd31df8966a338.npy +02691156-fc9b408aee84f46d70c4138179d9ed97.npy +04401088-b984d7e958fe9eb961179e7ef17bf7b5.npy +03636649-913ff6452d0ea43c9d62807daf4a2134.npy +03211117-eaad54605e6dfee6d862787d0e1b892b.npy +03691459-79f5622b83f85cac207a7604d676d24c.npy +04379243-1c228bbb8c23ab9295ba6c11631d3b64.npy +02808440-3db87ff05c046a58d787d15d1d196768.npy +04090263-8527c531b4e23b85819b42f03f652dac.npy +02992529-6e30906a4d0854e9f31b75c4a94a8879.npy +03001627-8f9f59e023572749acdc3d668e7c804.npy +02808440-30518996c975c64bb0c867f4bb42a876.npy +04090263-91d9c29371eb5c091b7837f7a64e3031.npy +03211117-9ab58a92609d8f5030b540842bf7e90a.npy +02958343-58d9741ad324623e9872e22d6b8eb647.npy +02828884-a03c239b05374a837c8303a5f3977966.npy +02924116-cdc36ce4f0dda33641cefd10ce5d6cc0.npy +03691459-7ba65164444ed5be3df08ed7d70af1ee.npy +03636649-85e79f31c24f878cef3a2c64cef919d0.npy +02958343-e14338cbdf53c0ae3a0daf3e5400b95c.npy +04468005-c10daecd154c8dc476d9bf960443503e.npy +02992529-ff8676e76a0fd471fc115be4ff5cfb9e.npy +03710193-abc7c3f050deef2b4146a0f3be16b19d.npy +02691156-1b7ac690067010e26b7bd17e458d0dcb.npy +04256520-386b2caac16694edbab0cb5a4ccf2fb2.npy +02828884-1f19f93fc7d88529ad5067eac75a07f7.npy +02808440-24b2f2a1856df791bdb62d1caa529a98.npy +02691156-14453b29e139d81f6d07c55cf995503e.npy +04256520-92720933afa1dfdcb5c1550bc8448972.npy +02876657-371b604f78300e02d76ab6ff59fe7e10.npy +03001627-1b5ab441fb8e3b1b450621b513a975bb.npy +03790512-994dd337f39a32202f2c109faf1ee2c9.npy +04468005-8044d52df3c796861a5e2b71533354.npy +04379243-6818e317471cf5739a83764a2641fc5c.npy +02992529-229077bcc4f52356f582eaab37b1c177.npy +02958343-9f3c463272d13d39eb7780cdb3ece367.npy +03797390-bed29baf625ce9145b68309557f3a78c.npy +04379243-bdcd0c8384971f2a684b7bc3f8a9aa55.npy +03001627-e1e7e66978b888703f146f1fbd99cb1a.npy +04090263-4c31d19625e911e1f8edafa0d47e47db.npy +03001627-483d22dbbee32ee54e5c7d89bdfc49a3.npy +02933112-1f336c9e48f1b54686d53ab0fe94e911.npy +03001627-1ec5a88141aefca9cf6e4dd7ee69d71f.npy +03636649-b75464a7a5546b39e9ad5e44c87685c0.npy +03211117-36255c016e837e6c234c2f2e8f2fe6da.npy +03691459-9080b08716a2be41e47833b310955a9f.npy +03636649-f64e567b44e550c0fcb8d8c6d4df8143.npy +02958343-e28490350bdbdf679ad3ae277a5ccc98.npy +04379243-288aadc96e908b29cc156800563d212.npy +04379243-38cc604066d18d1cae685ca100c909e8.npy +02880940-d1addad5931dd337713f2e93cbeac35d.npy +04379243-1534dd45b3253cfd902c0a1a69e25bd9.npy +02818832-946bd5aeda453b38b3a454ed6a7199e2.npy +02958343-910ba017e13a2220473f10e6caaeca56.npy +04256520-5209919e8e113ce3e09a21c3ea84d95c.npy +04530566-d1f0353c7fa985c91915777d56cf77e0.npy +02828884-5b9261d3ab4192a4cacb7e48ba59c48a.npy +03797390-2852b888abae54b0e3523e99fd841f4.npy +03636649-707a1c16fe9ba4fa60a25ec0f32e89e3.npy +04090263-2cc92e68121301c4ef0c52e20895a77d.npy +04379243-290df469e3338a67c3bd24f986301745.npy +04379243-3d3e1b8e6f1cd412492d9da2668ec34c.npy +04379243-8ad9868947e7391113625562b56161f0.npy +03001627-d2304054a8dc7ea4febad4f49b26ec52.npy +03636649-d6a5a84cc689a2bd620365f6656fe3.npy +04090263-f5522cbc96faae02cfbc7d85a5791e93.npy +03001627-478074fa4b2b604b6c0c723d8da50cff.npy +03001627-d375dfbaf1a2a3316b2befe83a0efe39.npy +04256520-e0c9ef28aff6484e6eb9b08c8a74d159.npy +03046257-6d2f8c13005c05abedf0adca85d84acc.npy +02818832-9daa02ae72e74b3f6bb2e9a62ccd177a.npy +03001627-98ac0106ad244505e04fc3fcc1c852e0.npy +03001627-ced9c5eee916cce089c398a8a379054a.npy +02958343-6bfc2bf0e72a0f66f500cc506a763c18.npy +04379243-e004afd245bd06337e2a6b10ca75153d.npy +03691459-ea83b0bdf2b13bc89c0528265c614919.npy +04554684-1ffd145c196f19fba7ad9409a09b1a9.npy +03593526-ee425a7b654bcac8bbdc99ec57ef9c40.npy +03001627-b9a88078b22a4485fdef1c01cbd4ae0c.npy +03001627-2f42261a7f658407d12a1bc232f6622c.npy +03001627-b60eb72661b2e56f7445d25f394949d0.npy +04090263-edcbf89b4491941b9905a3939c890ad2.npy +04090263-4106793af469db6bf0fea2ee98610322.npy +03790512-ef8672840524f3dea5b5a4b3c46e79b8.npy +02828884-a775a66a362089fdcb2a965e75be701c.npy +02691156-acb398aa5605abe5a8cba409c4409ba9.npy +04379243-9d7e5e8279ed8a30f2fc41ded2e6c02d.npy +03636649-79487b518c97cac315b5ce4486462d3f.npy +02828884-c1973b3aeb0e54df653ac91111db738b.npy +02691156-6ed172205a9805b8dd9eb6c0ee8316a3.npy +02747177-77905cdb377b3c47cb2a965e75be701c.npy +03593526-f1ae9b2eb551ba466dc523ea4bf73f1c.npy +02828884-3ff4401d898b488a601104cd2d998272.npy +02933112-274b2b7de6654d7ce6619119a89ba92d.npy +02691156-64f01ada275ba83df1218670339368db.npy +04256520-bb2ed216b00409665634c21965ee6bab.npy +02958343-39e10c5d24fee4a6311f5d9a1681aa3b.npy +04379243-88c2cbe9552b1b0571870da176ba03be.npy +04256520-7430f611140fffb68101accd22c701b9.npy +04379243-9dd91ad8d34c249970521b3539fadd3f.npy +02954340-3b0a1a20ef0ce1a34c90f2ddc14dc59b.npy +03001627-94371ddd6d62f7b762ec387b772e9e1.npy +02958343-836c3205338292d3a696fea828ec5eef.npy +03636649-ef12cf5aba58871e5510d59f3ab1ed64.npy +02924116-a3915ede8eff71ee9d151674c6eace6c.npy +02691156-7ce599765d4c11fe87bf26680c510802.npy +03001627-7a783968f5b1f88ff50f16ba773dd73d.npy +02828884-758b78e2ad5dfdd1edecfa50e41e5c9b.npy +04090263-152f598b96676178519f927f2bf92da9.npy +03636649-ab8e7d9b77455a8550f4a93ce2060c65.npy +04379243-ed392c6bd0a25ecf5a7a4ee31b873edb.npy +02958343-fe6749c82c57137b28044fe9244db50a.npy +03211117-928c86eabc0be624c2bf2dcc31ba1713.npy +03636649-66defefd07a3fe4548eb521885c87e13.npy +02958343-42dae5b435c27851b11647ffa4306609.npy +04530566-b4a2778eb3f3dc55f877f04737ced5b5.npy +04090263-42288e57b2436e3512b38b1d99376c0b.npy +04090263-1632f8ce3254cfccc8c51c73cb7275ed.npy +04379243-1872afa831cc7f671b50574ebd76a45b.npy +03467517-b928ffa886500109e391f0d9f72fb31f.npy +04379243-eed2efed8f2d5604a0ab1d82ef09f78f.npy +03001627-2da97edb618f05a5b2ccd937df5da28f.npy +04090263-5d806f9cfdf29bc640eee76592e4bb9f.npy +02958343-1569406dfc3b7ecba9fe1734a6086750.npy +04379243-d1ef98cd329a71d1d8a323bf2c61bf7a.npy +03001627-d4f194efb445914e4b3d6a0fb5682cc4.npy +04401088-692ed312d9ba1663577cfcf36d9b3392.npy +03211117-4f46683ad627700edb09a997c699dabd.npy +03325088-c5de940102fa0cdb50da8b99982a3057.npy +04468005-b123bc34ca87b8f88be7c8c5fdb9bd6d.npy +02880940-571f294b5ab7e47a5517442d05421cb.npy +03001627-42df32ea024077732463600025db2266.npy +04468005-9f7f3ea75364f7e6dc14ba0818ee5cec.npy +02828884-3a6ac28f247a30146d812a3e2aa98a91.npy +02958343-dfc08488e2ec687d1c64dffb0265c4d6.npy +03001627-f5f18fccf9e16800dbd185de408ea209.npy +03001627-e4931ffa06d7b05cb04cb542e2c50eb4.npy +04379243-673540ea8227449d1dbe3e8cd87b5167.npy +04256520-5b27e06a178965c5300703f05f8ccc25.npy +04379243-cfe4e4fb603b99c77843fb4efdc19510.npy +03761084-5392b189a357dbd6e5f8c8c5a6f910d5.npy +03797390-e363fa24c824d20ca363b55cbd344baa.npy +04379243-38b341526f21cc9f6e1c16d8c5e127.npy +03211117-676e65417cd3d59f3aabc01aa1c5608b.npy +02958343-aaa54ba9345b6784967bf54a1f364120.npy +04379243-d3645a097a49042bbeab86a0a7f61a1.npy +02691156-ea29b3af190b00367d3b11085e75c7ad.npy +02691156-c7749c0a8b61f43bc9b9e28055202e3d.npy +04090263-257fdddbd7b231b15063ff48525b373c.npy +03001627-643cac07025f195750f9fc0e2c94dd76.npy +04090263-1ecdd9fb715c6fb2b0a59d0f63b741eb.npy +04379243-9feefc5eb43adb4fb7db0056a767efc7.npy +04004475-db9d02b583bdc8cec25c9cef92ff2800.npy +04379243-51c6a7298408c3f19730cb37c9a5f63b.npy +02924116-7e06d4b6e53773f2bb808872bdd72fe1.npy +04099429-8fe2fda28ffb637369bc13a8c13458a8.npy +03046257-b9d78c6a787d2097786e4057cea53718.npy +03001627-8a87ac1748519dde2fbee880b9f634b4.npy +04090263-a86e3d993f82d44018a76e4544dcc8a5.npy +03001627-12f4d8c20ef311d988dcbe86402c7c15.npy +04256520-5cea034b028af000c2843529921f9ad7.npy +02828884-6f607a06c0d86895ad5067eac75a07f7.npy +03636649-75cd24d6b485e9e01735ea0e092a805a.npy +04379243-4fb40a85a2989785d5abaf84513415a2.npy +02808440-dccb280354aefe171e7f704273b6f731.npy +04379243-c6116173a1cffecaec9ff818c66c8a16.npy +02828884-13da7d4d1277574c64b7b850ea7b68a.npy +03325088-233e131ca64c2fd5c36fb70296e45483.npy +02691156-a57802c776ba1b69e44b1dd0f956e84.npy +02691156-49660fd24e5c2fbab87697d3904b168b.npy +03691459-155b9ee29dd8f068f9872b1642da5de0.npy +03636649-8c5f6d5f0ad51f1a45c8b1285cb15c2c.npy +03642806-b29c691472ec9064f67542ac0a8b28d5.npy +02933112-1d973f05e870af4b4da5feafe6f1c8fc.npy +04256520-f43b6b571d66991f95ca4adb70946a21.npy +04379243-8e3fc5f1f8e9658ce8b2b8dc0c816caf.npy +04379243-2ca3dcbd06295835593ebeeedbff73b.npy +03001627-e8ef93ed45300501bfddc5b20c9212b4.npy +04379243-dcee2fa2aa02fa7c4a05fa063da00291.npy +03691459-71b68a5e64903e0a1ad88f716ea80910.npy +04530566-65be4fb7c78125eda52f887aa13ba9c2.npy +02691156-3881241b81d379644d4cb1c2a5e48b7a.npy +03001627-224775a0c7f8fec65780b8d333445e3e.npy +02691156-e66996d97d9f553939e75b12f2e5480.npy +02958343-e0a8ac5ece3222ea16abce8cb03e7794.npy +03790512-d9a4e331d1ade5277395d58407f193ba.npy +04379243-588b84631bead4d1c1fa182c22e95706.npy +03001627-50e8ca681532bf195fa5d73d8d08a44f.npy +04004475-3b43609493ce118dc580fdeb5460f6d6.npy +02958343-4e6131bad4ae8b6c91af0bf49336b8c6.npy +03691459-e1be0b02973011aa4c5341ee07f41676.npy +02691156-7a95a024f5616009ab21e26e992b2c94.npy +02924116-9c9946b6fbd1a5452fd6f371aed2b46c.npy +02924116-e48f8c869435225e47b1d09f6cc16a76.npy +03211117-8a7b80310c1d8d1b3d5369d27421e60.npy +02958343-8b22da6bba6c81452af3f274e91bb46f.npy +02880940-9024177b7ed352f45126f17934e17803.npy +03001627-4a12589099b05c51e13b3410f3683610.npy +04256520-fd33f7d4b8fcaef5d39e33fed94f56ef.npy +03001627-359b6d3d29b08dfe19fb4103277a6b93.npy +04530566-598f1f474f1cedcf33827bf0303796ff.npy +04256520-1878633a36518ffc19fb4103277a6b93.npy +04379243-5f8764573a6f8321c1a89c6b124f2475.npy +04379243-7610fa5f384cbfe2664b3b9b23ddfcbc.npy +03211117-a44dc3e6f574bcc942e76de3842fd93c.npy +02808440-4310dc866b24e314cd49a3bbe129f2e.npy +04379243-cf478aac2058cae0e589b08489d157d.npy +04401088-aabbfc7463d49368419fdfebc874eb8f.npy +04004475-b8f50a9cf77e8b16cb2d9ca9c84945ae.npy +03691459-7dd0a1aaaf29b18529d8eecf3827c486.npy +04379243-7fdad5057b8da165fa9f3ec600076f26.npy +03636649-783b81aa54a69a26d42b9650f19dd425.npy +04379243-61fe7cce3cc4b7f2f1783a44a88d6274.npy +03636649-c3d57dada3819e60fbaaaf5884f2c88f.npy +02924116-d254d5e10bae194acbe05d30721721b7.npy +02958343-7337679ad4bb8f4016abce8cb03e7794.npy +04401088-d7ed913a3888696d289b03e5721252f3.npy +02691156-f1f12c4408b0b4ee445d150719ce97db.npy +02933112-158134028cc664b5c59350d819542ec7.npy +03001627-2499541ace317cbb8cb5d9909aeb1309.npy +03325088-c8f05f1ff6b10463b55b46d261fe0021.npy +04379243-fb6cfd7064a88468a9ae1099ff133d95.npy +02691156-46c07706f1bd10fcf9cf2c77edbc841c.npy +03710193-655cc66caed0a4759c0d8b17a41b6f3.npy +03001627-58bd152fb816ad2f7f91c3974257b780.npy +02933112-b7be75d3cb83457a44221bef0fa3c36b.npy +02828884-106494f75125eea6adf66a6d73888234.npy +03211117-5c16184e52d1317f5c188551f03b75de.npy +04379243-2f106667589a6cedc36874c8749f7812.npy +02691156-879ebdd198cf4aa58f6810e1a2b6aa04.npy +02871439-1db2ec3f8086669b955c7f158b9debb4.npy +03790512-ed0d6ea5407e542d31ef331a356b2886.npy +04530566-a45cbcfb2763423a6540eb087d7e15bd.npy +04401088-c556efeb2bb3df4621844676433a0aca.npy +03046257-66922901b74190cf7c70545e85230d83.npy +04256520-82d25519070e3d5d6f1ad7def14e2855.npy +02958343-7edb40d76dff7455c2ff7551a4114669.npy +02691156-de3a0bb3f0ca87a5674fc9582804ad0a.npy +02958343-5fe9cca902d8135aa36fba949f601317.npy +03513137-4730ce6da5433f3bd93d030573255054.npy +02828884-1348e440934494f581faebbdea6bd9be.npy +02828884-373ae08d8903dc10ba929f7d2edd1706.npy +03001627-ff2deccbef73ff5a349bb1cbbf9a4206.npy +02958343-76680f2bc0d53c6e3112e33afb0a091c.npy +03001627-12f395270a3316d01666e1246e760f82.npy +04379243-89fa346209ccdd0f16626db88aecf64.npy +04256520-51dd0bece7876a8744fe3ba945082ada.npy +04379243-f70df4cd7109fedb4824068fb42a2b57.npy +03938244-49cfb88c1291a152fd5b65552e5580b6.npy +02691156-8c851663113c3f6790baeef8ba5b93e5.npy +04090263-eb71e9847932ddda558fc0121b183f15.npy +04530566-f60404b62c44fd3b49f0e3dd7767881.npy +02958343-6f61af12304781b1297cfecdd0d5b071.npy +02958343-dee83e7ab66cd504d88da0963249578d.npy +04256520-627819d2ea8ab9d9c97e4283c3b75587.npy +04256520-f178d79c569c05d47edb0bede88c064d.npy +02924116-98568658cc2f000719e7223d2775d9c.npy +04256520-4a7db7357b6b6249492d9da2668ec34c.npy +04530566-176cea94ab59ce9949f0e3dd7767881.npy +02924116-82fcd4e8b161f07455653b4d8cecd79.npy +03325088-aba8b03696508ce65072198ae7ea0be2.npy +04379243-d08a421a6362b4bcb000f20a5153622c.npy +02933112-77aff49eccafcf2726831803d0b48347.npy +03001627-d2a5b42cf29b753f71a782a4379556c7.npy +02958343-82b9ce9740bfd28fe9fab7ec4b8a907e.npy +02933112-6686c3a7dc39cb59d2f1945599cd5176.npy +03001627-3dc8243b17bc790620768660cf080d12.npy +02691156-d438a4539d8068fd44601c64497858af.npy +02691156-bb9ba5deec9e2a5fca8607f540cc62ba.npy +02691156-6f96857e279a38793525b6164e3f382b.npy +04379243-39adf6058de74934ba18ade30e563d37.npy +04379243-2e23b1aa756399ea1138d031cf239f4b.npy +02808440-cd23523044b34cb29a461ceb2370bcba.npy +04090263-83a6f7a02470263ce71e857afa9df271.npy +04379243-fe5be6c8f1599697c3bd24f986301745.npy +03001627-3c1dc5c4b0c8db31d20c5daab0fdbf5e.npy +03001627-31bc7f782eb3bd7de40a8ba0cba661fd.npy +02933112-2f87d7d3c522f07b297936c81e7f6629.npy +02773838-5161d9adede671d6edc32c5c9ec9f827.npy +04530566-9b93b845578ee8a20c10ff7bcef26d.npy +02691156-82a2a1830758bacba389345bd31e2871.npy +03001627-d29c14f180ce319f71271c0017c27c86.npy +04090263-378c3f18cf130bace1f2a1daf140ac9f.npy +03325088-c34723e92771fc5b7a867e9b35a1295.npy +02924116-366e45c0ffa4f059f5faeb3213703480.npy +04256520-8d0d0661c57bdd09b6cfb56a0ae182ff.npy +02691156-a487d7527a0d0c2076b0a025d05432d.npy +04401088-a8bab81f66ac5d26acdce172dc618222.npy +02691156-c3600f9ede30352a663e90eaf6b4ca52.npy +02691156-229c164fe2c80acc1ca2e8373597f711.npy +04379243-99fede796e56b4b220eb25a3a058bd49.npy +03636649-6b2a590446ad5794b10e111f2d30684d.npy +03636649-85f1532468f57b13fb26684cf995edaa.npy +04256520-e03147a11bd7c10e3d23022ce06f940d.npy +04256520-1a38407b3036795d19fb4103277a6b93.npy +04099429-a410b9d1557f0bcad6a1861443498ca3.npy +03001627-e50f1b2d0835bb392764cfba57a5de73.npy +03001627-1b3c286bce219ddb7135fc51795b4038.npy +03001627-5aa3f60fb8fc208d488fd132b74d6f8d.npy +04379243-1eaad686e6b766597ff6ace05b36a5.npy +04379243-d38a9d0fd304f3eeb6e024121d412dd.npy +03636649-3edde0735bdd2aeec8bd09a8ecef3d42.npy +03211117-bf5a771386075e449b3250464ea24783.npy +02933112-ba5e1671d26af2763c6c38b12db4d8f3.npy +03001627-374b3757a04c6ab6b9569033586af233.npy +02958343-96c84869cb3c6657e49167a1ad5be1be.npy +03636649-cdf8043d57863c1b17b431cae0dd70ed.npy +03691459-29b26d5aeae88531574d21c0c95092f.npy +02691156-5d7c2f1b6ed0d02aa4684be4f9cb3c1d.npy +03001627-47ad261baf9609ffc27c29012942420f.npy +02958343-7c46bfff2f90f11044592db9be5db5c8.npy +02924116-54f3b48cf9c7ed13a3cfa46226644b04.npy +04090263-5b70d54d7f40fd8e5c413e9fcbe8ea71.npy +02958343-1768f55a3c29cd483337cb9d908ce86e.npy +03467517-5b6306025152e03a59a6208793b9dfca.npy +04256520-581808bf8d8e1d2448eb521885c87e13.npy +02691156-91948fbd89e316b9a1efa53c1b6b3c23.npy +02828884-c33b2dc4fca8fd178cca710901c2e97b.npy +04379243-222c56ff9cddbaf4139eb23f7c8036f.npy +02958343-b6525d69681e4f56813498cc26c2aee.npy +04379243-54dba548def577137f14c8d2897662a6.npy +02747177-62f4ed6e1df63042cecaed25e0da0964.npy +02691156-93da50dbee3d1f78a7d0c1e4eb8db7dc.npy +02933112-62e1a04718635c981c7fe5be55ca5cfd.npy +04090263-c9e48e2db6786fb7c90b07f90175a30e.npy +02747177-d3b69f01f5f02240ad5067eac75a07f7.npy +04090263-513ba432b16287f5baf4b37340b9dde.npy +02958343-9009d75263e350ffb3b0f00a15b90e0a.npy +02747177-8b071aca0c2cc07c81faebbdea6bd9be.npy +03790512-e38201d0af98e566ba85a673915bd3d.npy +03636649-389653b54a3b5d3cd73bf61f46c61ea3.npy +04379243-f40c11ff508e477d55f46d55537192b6.npy +04379243-8e358c6f92a0624219fb4103277a6b93.npy +02691156-be96646f774c7d0e2a23d93958262ccc.npy +02946921-6b2c6961ad0891936193d9e76bb15876.npy +03642806-4a715660d89e097664c908bd136dd7c0.npy +03211117-48c17189e6c58d619f4c3c326d704746.npy +04401088-a56fa90572f9e23db30cf593b4a23b0d.npy +02691156-f562ff06e51e573e42979ff355194f16.npy +04379243-e79e55e6e08245c8dd34b2617efa7e35.npy +02958343-25f9e0e65b8fae1f9916e41a3ca14d3a.npy +04379243-af592a064d5a83989ccce4c6d5bb195f.npy +02958343-24819ffdc34b28efe4bee94a37836d67.npy +02992529-e840fab2f764532ce4bb3cae511f21f0.npy +02924116-68d05210e6e4d4b4cfcd1fbe1cf0ecec.npy +04468005-6df2dec0dfa5731ebbdb7391763a8729.npy +02958343-1fde8f41c6a39c07111f983eb293b51a.npy +04530566-47c53f9cfdd4addfe054bb56e3407f7b.npy +04530566-9ea697394812ce328b68234f52d97099.npy +04379243-a377ae927e09bbe976e9713f57a5fcb6.npy +02691156-ea9eece7f2c45a2a82e4c37374fbdce.npy +03001627-33fcb31af4c4d039fac1db559484b15b.npy +03211117-d6752674a181d04829c956de83176829.npy +04379243-ad3e2d3cf9c03fb1c045ebb62fca20c6.npy +02933112-6a36134591ec32cd37c7771ad8a91690.npy +04379243-cd01fd75885d9f606ce1f91756352daf.npy +04090263-e9adfa95465f806b056c98b2e5e5e4e.npy +04379243-33486ab58b77ea46768449c155e32d73.npy +04090263-aedd534b9f323b2f9f433921788191f3.npy +03001627-8be5b3b2c8c8f067a341228b21d337a9.npy +02691156-9d3eb87e69fba56890b1d6deb98feec6.npy +03001627-719f6578bd1450cfe5b7031248b81d78.npy +03001627-68151e7a9fcd8545851e82fe58f53ce1.npy +02828884-18d0aff1a5eb486ae2be3aed8abfbbaf.npy +04090263-b519a23d82f367ffd39cbbc2eb28bad4.npy +03211117-2608db8ae887c6e0b996b003c2af3823.npy +02691156-2a906a12b740afe2fe93207afde39a32.npy +03211117-fe3e7a35b8a1c06d3bb4a1304fe504d3.npy +04379243-c838d6a451994749310af74324aae27f.npy +04090263-1533494d4139062e9f433921788191f3.npy +02747177-2f79bca58f58a3ead2b12aa6a0f050b3.npy +03001627-94e5d7fb2ff59ff98a94168388287ad5.npy +04256520-fdfcfc4e9daa45306aea2f18ee404fd5.npy +02828884-92f1fa8d3b5da497ad5067eac75a07f7.npy +04379243-23437993281f7e1fb06ed3dfa60b19a1.npy +02958343-d6def3a1a90ff22bbecf71e2e014ff6f.npy +03691459-92039123d08d8ad6adbfb30d8d1b297e.npy +02828884-504ad0bf35b2004dd2b12aa6a0f050b3.npy +02958343-3aa2614f69105d0f31780fdd33037c9d.npy +04379243-5403184c2b01e0dae4061112aefd200c.npy +03691459-a18c311eba5e551d20363e2561dd589a.npy +04090263-9280249d5e91334f0864f9e40a51390.npy +03325088-ddebdd166c4562e7c36fb70296e45483.npy +04530566-5af5aa92ba49930c3f41ddf3713a131.npy +02958343-198dfa16ba9f5f6617e76f36a4eac3ec.npy +02958343-dbded0816afdfcf776ad064d1c5fdd7c.npy +04379243-1b78b8e14a21439afab04609f4609e83.npy +03046257-45234ad309a071d0ce256d7e95c7a4ed.npy +02958343-c9b49f7b355528e5632dc979097a3ec0.npy +03636649-e6dae18d7ffbb7ff952c851f81463faa.npy +03636649-74df8c15024e81f79f1a71e46bbde97c.npy +04379243-2a0eff86efdf60a89a682a6d0e92c30.npy +04256520-770b9528c04f99d5a3bafec3b56382db.npy +03001627-3bd437d38068f4a61f285be552b78f9a.npy +03001627-dfd7e14d25b81c1db5d9b03636b8bad3.npy +04379243-9ba82ad65b1e90a1f51fa0238791f5dc.npy +02808440-1036dbcbbd36fbf385d4c5933ce331fd.npy +04256520-6051f687d35c6ba577dfa90ae0b0a3ed.npy +02801938-caefb14d743df2d69c3870d54ab64b77.npy +04256520-5ea73e05bb96272b444ac0ff78e79b7.npy +02747177-156fe84679171501f155d75bbf62b80.npy +03691459-2a32fbf104a7524ec78a85a5b5306f41.npy +03593526-acf2697f5c1cfe9b89035c25f0dfeb63.npy +04090263-981d2bf1b1b028e46b1aa8d90854daa1.npy +04090263-866fc73e306a47a1f246f64ee1a24a70.npy +03001627-d90e76683d11f75fde11596dfa0db02e.npy +02828884-ae6e6210e0280f24ad5067eac75a07f7.npy +02691156-d2412f19d33572dc4c3a35cee92bb95b.npy +03325088-3ab88b710b8ad3ee3321831d2245cf06.npy +03001627-20b36bbb42d36e0771dcb8deedb6c8d.npy +03001627-2a643eaf143a779f7eeca6709b6a824e.npy +03001627-91534e0a3b0aea7526fc87e2982c8a2b.npy +04379243-7953711de0134028ee18bc48b60b36b7.npy +04530566-ace32fcd2b6c3fd081e9f45621d2c8eb.npy +04401088-30d54e046b9abe8bf1cb19f636b1c2bd.npy +04379243-81094bd607e33c1e0c5923879d79f21.npy +02691156-67da7044f5bee4f65c6d168c6e7f59dc.npy +03001627-4450887b9a8867e6d9b53420a5458c53.npy +04090263-c57c4311f1f23690603b56d612737c9c.npy +03211117-d3f9fc10276d8922f7248d9dbed7a7b8.npy +03513137-d739548a9b15c18cfac6099f3d4830fe.npy +04330267-f8bda034dabaae9c9d2947b7231ac529.npy +02691156-d3856a35d1fb8536d8e727806889c9b0.npy +04090263-c0ac896c514cd91428a27232df2537e4.npy +02691156-bc764c59e4bf4e9f508cfa5a106b05fe.npy +02876657-20b7adb178ea2c71d8892a9c05c4aa0e.npy +03691459-d35894de19f2ac5af6ab94ce02a994c4.npy +04468005-d9a4a8423457bd92bd127c2230a8477.npy +03593526-f47da3a419cdf600e01d7dc978602402.npy +04256520-dd370ef3f3e8097abb9760cf9cd1a953.npy +03691459-f0629a8139a9ba04f398d0c5832df00e.npy +04379243-11cdaf2939502622815a10e5a35009c9.npy +02958343-7d099ac5bcc09250e61b9ff60b1be412.npy +03046257-d2cd542928c5b684c98f75a9ff83e3b7.npy +04379243-88676c2f87a5b54c4500047017815f5f.npy +03001627-4ce5a0d60fc942f2e595afbdc333be49.npy +03467517-5446e1b00632ba2186f9feebc35c79bb.npy +04379243-61c279a6f178a43c5f48f9175316bec.npy +02828884-2f2fb3e4f0d9c4fe9f8ae7ed6368949c.npy +03325088-ea8d250e3363377c36fb70296e45483.npy +02691156-551e8582c195944af1b991541832fbf8.npy +04379243-490eb3a23cd0ec4e9ccce4c6d5bb195f.npy +02691156-ffdaed95c3063cdf3ce4891c7dcdfb1c.npy +04256520-e92955e3e3ee33f32650883217a11488.npy +04090263-4cb322a9a37e3a4d1c1943a82a09125f.npy +04256520-4424a906da6fd4c961bf0ba277ea473b.npy +03797390-44f9c4e1ea3532b8d7b20fded0142d7a.npy +02773838-72dd1dca3421f63576bb31db0358e9c6.npy +03636649-6aa1ce4e245001589f1a71e46bbde97c.npy +02933112-9ba333215be4d6654c62bee40dcdc539.npy +03046257-220d4bef77a82fb164c33a5741e8e076.npy +04256520-5b23328fa6d5382d295b24579cf55b8.npy +03046257-854ce0d6ed37103248e2701b91d7249c.npy +02691156-83e4e523003294ab9a6e43b878d5b335.npy +04090263-34e8142e7b3cb229d735fa1ab17311ec.npy +02691156-b5cdecafe353e18ac1006ed55bc1a3fc.npy +04256520-c04dff28e5b5a2e5c283ca2c9df7372d.npy +02691156-46a1b199bd63c0b4505ae8d422ba349d.npy +04256520-ad274aa281d74c7d78e2b63e72b94e04.npy +03593526-bf2106de86fcdb3c9f695af5ccc7d06f.npy +03211117-26b26a5c4a8fad9e57145c11333eb62a.npy +04090263-a11f9df8336fd83e5cd09b5ae4a3c552.npy +02808440-848124bf8497ee436bb6bc0db07c71e8.npy +03001627-249f3eb6a7236ff7593ebeeedbff73b.npy +03691459-dc73b4f97b493d18176ac8585fbd7fcc.npy +04090263-daf8f85c017aa8c3e1f2a1daf140ac9f.npy +02747177-85d8a1ad55fa646878725384d6baf445.npy +03467517-1edaab172fcc23ab5238dc5d98b43ffd.npy +03211117-aa2f94416852aaccc60dad40a0c0e85b.npy +02876657-cc48fe97a95e8716ccaa5ad584801c3e.npy +03636649-bc704db7b62582e5d1cbf3e52b9b6237.npy +02924116-7b68c55d0cf319a6cd801adac9ea724e.npy +04379243-a2418ff066f38084ead6784d11c8f5b5.npy +03759954-2f65b3f9a1ed10c099bbfaf5793d01a.npy +03001627-1db766ad516a6993f4b6538438a0b930.npy +03001627-73f9aa75944ecf0b9debdd405104de8c.npy +02691156-e7158ecb09050b03873ec74c119307b9.npy +02924116-729f939672b218c26d09993d87837d01.npy +02801938-ac36b5a7ebeaf8fc317c35ada68f2189.npy +04379243-68f72d87a2f94e0c8f58b2a82381f0a1.npy +03001627-7ee5785d8695cf0ee7c7920f6a65a54d.npy +03001627-260768554aa1a64f2180a9964be89fad.npy +02933112-9572162eb971e75dc7cb20726c4d6c81.npy +02933112-eea67da61b5477c7d4c6910fb477cd67.npy +04256520-4ac96465d859ecc647826489152a0c30.npy +04256520-c3c5818cbe6d0903822a33e080d0e71c.npy +04379243-ca9bcd3ecad18d8fb4c161851ed2b4e4.npy +02958343-3ed487192c098a36811090af72684c2a.npy +04401088-49ce3fc723ee4b362d43b5caea00b490.npy +04256520-c1950e8c9869a7aa8dd711af5650bdcf.npy +04090263-eb1655ade2554c156e49a9db8e76daf1.npy +03325088-6c692c34625914a64cc3b7bdfa613934.npy +04379243-c1d99397e37782c0a8699b6183baa203.npy +04379243-f995c1239510cf8b5d009c98a5b96836.npy +04379243-2ec13bb2c3d06c0543dbb6421d614c0d.npy +03001627-68d41388f8a62fce19abd93be2967664.npy +04379243-647692d3858790a1f1783a44a88d6274.npy +02828884-2fec2d7fdd169e28bb90acb1046227f8.npy +04090263-b7a8d379fa29b41adfb4916f5d51df47.npy +04379243-7c653a77d59fbfbd84d52b3f4a5fb1fb.npy +03691459-1071f82bd0d6a23935cd53a06b1d2317.npy +04530566-9bb4fa1026322f0f3e39f2e17005efc.npy +03211117-4407eac60124e17789e75af9d2c4ee4b.npy +02992529-89019c955310bc56eeb3fafe1bc8c07d.npy +03636649-e993492372fce761cb3a30f2c37c38a6.npy +02933112-740392e1c6522664c20c4293bea04a44.npy +02933112-4f168576511489f91439869d172d3897.npy +04530566-e2ee62e09af461498d84ac376021f1.npy +04090263-aa724e9dd919edc3fef144202cb2b935.npy +03593526-23e0d277a58fba0abced73c51e99f8b2.npy +04530566-5d48d75153eb221b476c772fd813166d.npy +02958343-f8ccef3ebeaac7c0539e4d34a3035bd8.npy +02958343-f9f50e199b706caaa148ed368ea0303.npy +04099429-23ac907063ffc5de3df4fa4547276fc2.npy +03001627-5a60c649a221293d72ed554eb3baedcc.npy +03211117-a5939f4fbe1009687f2411014f221968.npy +04379243-6f92486fa7a1aea221ab9b8a0e862145.npy +04379243-2ce9bdf770b06e3745a4a35cfc2e42d2.npy +04379243-1cbd8a3d7208cd6b8990d2712ce4d993.npy +02933112-373fc669fbead0bd1f8d8332ee17945a.npy +03636649-5c7965b0835a1a241de9bf5a9c22fde.npy +03691459-c5b38593b74c39695f7109466a688ac.npy +03325088-ed88b271bff935dc4bbbee4015534b3.npy +03001627-bdfc3a43eccaac7e908cb3a44391b80.npy +04379243-82f1ed2a66bf8b49f08a713d0c983d8d.npy +04090263-da6a91e6557973ba78dd5400499d0e7a.npy +02924116-31d34e11e37ad640c6bf3b18b8ca71a.npy +02828884-e0f7a559a6066203dacc0b57c47fa747.npy +03001627-44aed693950b077d4f9691cdd5f8749.npy +04379243-8b963c7f5f091b3c98100807afd99d94.npy +03001627-ce2982a9b05fef738a075f7da2b32df.npy +02958343-7de59e150d4712b7b3cf5236f651a8e6.npy +03642806-9980e8f99eb0098bc6b48dee64de8434.npy +03001627-bcced2f12f206a927eaeab1f0c9120b7.npy +02924116-de8c870859f57c4752470de2774d6099.npy +03467517-6e65c6b79bd8df3184ce60b118ccc0b3.npy +02933112-82c05fe4890a7f5112de5317fe5b354f.npy +04379243-acd6ba50b3081e5cd3470f853139ec0c.npy +04379243-dde92f6460b1d7b2b4cb6dc412eb15ce.npy +03325088-412ac477ee9e761250da8b99982a3057.npy +02992529-3bc6f902628b3f7f85f6153ed2033a1c.npy +03337140-69080f3e82b012ae2590dcdc900ce405.npy +03593526-85b34acd44a557ae21072d05c97a5e0a.npy +02828884-cc08d4ced5931ed181faebbdea6bd9be.npy +04090263-cbcc80e6964f1080b2d09bc8d348e46b.npy +02958343-cd3db50308c852a02630fc4a206fe3d7.npy +02958343-6d083701a45fd0721ccbd9e5bb82dd04.npy +04379243-97e4bfc6f8d2e2fb986b72a93898270f.npy +03001627-7a5d539e3771a491ca6a405498436716.npy +04256520-52d307203aefd6bf366971e8a2cdf120.npy +02691156-7d180493022c01daace5721ccacba16.npy +03001627-515f8729b20cb3612412319d111a4961.npy +02992529-5bbf52512a45bddb7525dc2f981e5489.npy +03001627-468b7e16a29ce746bd08524bcb66a009.npy +04530566-1e8c9dd30d54392856d301bf1319ad4.npy +04379243-1bd49921fac3e815c3bd24f986301745.npy +03636649-1f58b59a1b6b06df766fc93a239bada0.npy +03261776-b26bc64c51736aa7eadbd0a9373027b4.npy +02808440-303b0d2566846f373c8d0fdfb1cc2535.npy +02691156-2502fffc569075b152486b4487d562c1.npy +03325088-5b0049fff25483854e0738735f157c3.npy +04256520-3897ad42f73988a62406c215cad9df09.npy +04379243-875f7a7c2d69b01a30bbd4cddd04c77b.npy +02958343-4c2c33070c6597ca9004afc0d5dfd164.npy +04090263-60ac11a84e307db07c52b7b7b148ce27.npy +04401088-fa9b007a326be6975c8fa950032e0987.npy +04256520-f2ad41a5ffb961c4276813f95a6b7283.npy +03001627-25957008f839ef647abe6643657b8aec.npy +04090263-10e60e0eb0d7915c8de11d571206924.npy +03001627-9e0a1e2857b13b5853353c404519f02f.npy +02828884-3830a5b2eec789ac63b2acb037dfbcde.npy +03001627-d5b9579151041cbd9b9f2eb77f5e247e.npy +04090263-235853d2947a90e65e9786b1603f45c8.npy +04379243-4068a0e8533230e4ed8cfda52671df0b.npy +03691459-c6480c816679773dde4fca22b4a322f6.npy +02933112-c8631f63ec5899a4a84a884e8267301c.npy +04379243-ce8ec2504676cf874b3c42e318f3affc.npy +04379243-2d1fef407ec41165700ade95b2f08044.npy +04256520-ace76562ee9d7c3a913c66b05d18ae8.npy +03001627-ebf8166bacd6759399513f98ce033426.npy +02958343-34762df3ff8961188bb11dbc05ffaa74.npy +03001627-cd7674dec40cb30f30e06a011e63236a.npy +04379243-99316252e1dfbde1d810b14a81e12eca.npy +03001627-8b886cf32f340c89a9e00c019d029152.npy +04530566-b9d541ece25778e12783b84b5d2d6e46.npy +04379243-2d27e4d0f8cc2c9cf577ff4de1ac394c.npy +02933112-2e4184763139ff274da5feafe6f1c8fc.npy +02808440-2677d8c3f8be424a6575a854c6bafe.npy +02828884-2f8bf1c9a8f70cb0f4fb4dee5181bee.npy +03001627-fb633f298fd5a44a9a8ef44e1d2c5b75.npy +04379243-af8d3848b96bbd0d18821e110fa8400d.npy +04379243-4c2103f096818e16ca368f1abf470106.npy +02924116-68a2211cb0d8c16a9afb67dd284d342.npy +03642806-d4a1b5ef035650a51021cd55d164c0ed.npy +04256520-6d7972e468db59a6613f0dbd986ed6f8.npy +02992529-f5f1fbeca9af99c98efee9b82d757c0b.npy +03636649-15fc5a4a342c00525412c66cb6f267da.npy +04379243-d80a4629ab6badc16469e58b3534356e.npy +03001627-4abbf49c3177b32c9f613b70ec8c2f82.npy +04256520-63fe6b5903df38a0ba0f037fee399b18.npy +02828884-9e429b7f77646b4ccc8f8e7f17e9d7b6.npy +04090263-c29bc7b0dcdbc2b9e1f2a1daf140ac9f.npy +04530566-587cc1fc65ac4991ff920fdb73e92549.npy +04379243-14d1d6227d6e111049afcf135d820991.npy +02691156-f50eba69a3be1a1e536cfc00d8c31ac5.npy +04379243-7d1fb46a27bd93252c4683dd00deec1.npy +03001627-51670c355ece91abe24f4cc9bc86052a.npy +04090263-e4a10d825ba51a1fc648677bc9b1d6ad.npy +03001627-d374912c3a9fca96c141a04b2a487fd9.npy +04256520-6caf860b216a951edd97e8e261a01f65.npy +02828884-b54d0fbc33d125bb7a6d149f6c9151a9.npy +02691156-df7313e87ef2905d37678474be485ca.npy +04468005-8cd345e5980cb800c3bf8b7b051cba6f.npy +03001627-59f7e527386ab08b7f0751100c225ea1.npy +02691156-3cd1b98f12d2a22bf3ad4b0977199f23.npy +04379243-a00017528f02804e85c2318bffd77ab.npy +02691156-25864172dcde70c6ace5721ccacba16.npy +03001627-f59627a077dcc2566c63b8b48495261a.npy +02924116-1016074a78aa410cc1c19bf4f4f5ddb2.npy +02958343-c23a65ae787245248580e2c19c4f9aaf.npy +04090263-faffd9098e488836fb6bde4b7e6c6613.npy +03001627-1b92525f3945f486fe24b6f1cb4a9319.npy +03636649-d90639e69c82f864eb2d9895648d1206.npy +03691459-cf7a2cb0c487f3a0bd1cba733b111584.npy +02958343-52abca690cceb7c634a65e2e5c663c7e.npy +04401088-585f02091286a7a82b7045644a6897b2.npy +02958343-2e37013195d95f494470fce578e2b84c.npy +04090263-461cf03b41be093d9ee71f8982c8aa68.npy +03337140-de98cdf56188a576731d11154716a6b8.npy +02880940-e3d4d57aea714a88669ff09d7001bab6.npy +03001627-5008d5e0ddf1b3dfa37d17ad9e86b6bb.npy +02958343-9aec89a595e4682fbc5845a373118df7.npy +02946921-96387095255f7080b7886d94372e3c76.npy +02691156-5f2f19cff434d86ceee9782f3a645bc4.npy +02691156-ca2a07b005ad4385ca8607f540cc62ba.npy +04256520-58cf696abb5d3e7426415728d9c23636.npy +04379243-decd9ab8c2714f2e7235016c2c2c8150.npy +04090263-34ad54857a4dd37e12b38b1d99376c0b.npy +03001627-587ebb2aa71acfe644dd3aaee16d3f4c.npy +03797390-bcb6be8f0ff4a51872e526c4f21dfca4.npy +02992529-7e8e9cc2cd70a66d4d1f2fe604198dc9.npy +03761084-42aac49442bb9f8bb4e3935c6cee4b35.npy +03636649-39bc57beb358fae677981b941eb4f5d1.npy +03642806-6e728e12c4b4dcf26479a182158bae5.npy +02691156-48a36df204cb05dde7fc8cd567dee096.npy +02958343-9a152b11907b11074549b3c52ae0632e.npy +02924116-e2824565083fd0c4ca8e0c77b23bb25.npy +04530566-ec97e9975c94f7ba727ef88d634f1148.npy +02924116-521fbafd6674948eeea69f3a548f8109.npy +03001627-490cc736a3ffc2a9c8687ff9b0b4e4ac.npy +03636649-67fc0e388b91d55fcb8d8c6d4df8143.npy +04530566-4021a170452d19393c79f1baa816886a.npy +04090263-9b5a5de7af6ecc4274e18e0e7a19212a.npy +03001627-32f918efaa64a4d9c423490470c47d79.npy +03001627-be0890a6a0f3fcf841f91bc9e1dece3b.npy +02933112-3c28e4a1a5154ecc59350d819542ec7.npy +02691156-f1111840bde23096ee2723567c7709e6.npy +04090263-4e42faa1861597c9f2c612775ea2be4f.npy +03001627-9ab18a33335373b2659dda512294c744.npy +02992529-350dad20c76cb54b7ad5140f7d56e11a.npy +02958343-83cbe72c4b5e9268ec89747d864c8515.npy +02828884-835086fd24eb283650f9fc0e2c94dd76.npy +04379243-640da7c995f9fcdeab571431db8834c7.npy +02958343-8997065fe94841771ef06e9b490109d8.npy +04379243-b69087245c6ce1c57fc1f91f1396c600.npy +04256520-e29de3e590d4541c285e5a1f74237618.npy +04379243-b18fcb1483fc0f4c8ea6bd444282b41b.npy +02808440-a64f942a8107ce5f44221bef0fa3c36b.npy +04379243-2a43665ce0526ec3bd24f986301745.npy +04379243-39f202c92b0afd0429d8eecf3827c486.npy +04004475-710bc6c5434612d6b1ce1e5dfb273bde.npy +04401088-424ccff9ceea33451c81652b127a0ec9.npy +02691156-b6d61068ef2bf2d46059aeb39e538eb2.npy +03001627-5c9b4af9d0e9c132b161f36d4e309050.npy +04090263-73dc8568cca29c0f7bffd97a22e78e2a.npy +02876657-70e58e9f89fd9802a9891f6668163611.npy +03001627-c7fe45610d10cb108ad3a7d07aac2767.npy +03593526-72dad3d3eb9aaaa6707cdefe012d0353.npy +03467517-46eca0ceefe7bf062b996d5d44e09408.npy +02691156-11def84f9fe8ab0acd726e804e5d7a.npy +02958343-18f6df600df7341ab0bbc6f39febba97.npy +04256520-c3cc9a21c0732ef9b2f052bd9ec28053.npy +04379243-a0796a2532fcb95fb1b6b0c5ddacb607.npy +03001627-c9913221819588b519fb4103277a6b93.npy +02828884-f4afba7266031dbbb62b272ea9e18d0a.npy +02691156-c2923f0931fa539f794f2d24bb38b7d1.npy +02958343-45bbe9d4f12433cf4f2af69a26c97402.npy +04379243-e056700bca093e0c1cf96a5dc33e37f1.npy +02958343-7112c1cb9b6461c9a551e6372afde900.npy +04379243-57f881c06c1080ac91829b477862aff6.npy +02828884-23931fb6b6c46da895f577622f465c85.npy +02933112-75c26ffff01ea7063ab3dfa44f5fab01.npy +02933112-315f29b2492f66a9c59350d819542ec7.npy +02691156-2d7562f5bf2c7f2da1d85548168d6015.npy +04379243-e72421299768187426a61458b682cfd6.npy +04379243-cc6283a5bcd5452360d9b527752ac99f.npy +02691156-d8d9de967255b4c562b600da24e0965.npy +03001627-d74870729fb3e3c5aa0a75782a86b0f3.npy +04090263-597f7914fa401ce1433d7c8e9cebd7c2.npy +03001627-1e2e68813f004d8ff8b8d4a282992be4.npy +04379243-88e73431030e8494cc0436ebbd73343e.npy +03046257-c45e4604958d9d1d3153a6db1fd05f23.npy +02691156-df0b14faa90bd4dce68b9e5f5c3d0eca.npy +03467517-120b5821b1d27de5ba32f71f79130dff.npy +04256520-5eb9da1ae0ae618f1190e285a2cbc9c.npy +03001627-9dcede4115b4379e2af4036e9c51cbc4.npy +02691156-b63c554a915454b7a8481a97c910a7de.npy +03001627-34d255abb83e8d7519abd93be2967664.npy +03001627-1fccc2ac4bfd3da535836c728d324152.npy +04090263-e6ffef0550b5b2aa7833354cdb66ee8.npy +03001627-9c50878c91aeb8126bb6bc0db07c71e8.npy +03636649-27ed76ca359d6eaffcb8d8c6d4df8143.npy +02876657-6821f9cc313dfdebe7ef9fff09638f8e.npy +03001627-a273d2fa5244c74f654ea6737b0d3597.npy +04379243-65e5036f67dbac4e1cb7b51444dabacd.npy +03211117-21de0761d0f8f2f9342b2a88bd008cbe.npy +02691156-414f3305033ad38934f276985b6d695.npy +03001627-e440059fcf6f36496ebf11292bdb9130.npy +02828884-85034e80317e36d9a6c03a53cf0a14c9.npy +02691156-123bd9e948881939c38a1d3458dafa1b.npy +04379243-cd413f0540b54bc1fcf003a332eb3241.npy +04530566-e969147de0934040b2533fe4d795f40c.npy +03001627-9faecbe3bded39c4efed9665e3f75336.npy +02958343-c52a2f6396ad8d5f97df6383472cc5b6.npy +04090263-f130c222ff91520182c15a8613f6374a.npy +02958343-eafa5935e963b0035e875676652081cd.npy +02808440-210c971bbc492960b022c94235bc8601.npy +02747177-9d453384794bc58b9a06a7de97b096dc.npy +03211117-ebe5a5c179cd4ae355b9f0c05f9db07c.npy +04530566-e0b49aa20792f2fdc99bbfcf5650bf52.npy +02992529-3036e6b2a898fc85e85776440ad91264.npy +02828884-e0777bc4f8e3c6db63b2acb037dfbcde.npy +03001627-f9fb36db323fb2d2df6cfab91d65bb91.npy +03636649-6c5b0451e99192cbd4bf7024dfa167d.npy +04090263-b9d2e06cd1844f6a6325009a8a12b7e9.npy +03046257-34545d313538df146463df620b7b4cbc.npy +03636649-5e7f0e657142fff3e4692b8e5c093494.npy +04379243-7842ac8b7a053dbf61bf305cc5ea87da.npy +03691459-bb570a28a0e81a51d747b49524a1246e.npy +02691156-9bfd7f4ecdd8efd8bd46d022fd7d80aa.npy +04090263-42b44473503d82101c7be7f1ec012899.npy +04530566-b0238a48839d2b1b64ada2fd6418de4e.npy +02691156-b4b1b113173a6ec6bbf3143b1cb6076a.npy +02924116-fd22e8ff23d7a4da3709ffc87474086d.npy +02958343-96c404939bdba58331ec7db1bc2ab2b4.npy +04379243-1b9605a88fdee0626bdcd672c2b17215.npy +03001627-ff2223a085d32243696b74614952b2d0.npy +02924116-a85b9a3ace923e424721d5612f98ae26.npy +02924116-d0f9952155dfafaa58e6c5721f48a106.npy +04379243-5e84051a6a839c24b577ea930304326.npy +03001627-7f820a5aef9899d5e2953fd13c76ba9.npy +04256520-4d8ec1a57f4ac78258db0ef36af1d3c5.npy +03337140-fcdd18edf5219ae6e7ecdbe73ef4323c.npy +02958343-b2f3ab0b028eaabe443ea0e3853eed5d.npy +03001627-dee24ea8622e2005dd0e1ff930f92c75.npy +04256520-6c3b3c37c20bf2fbb40f0ac0fb9a650d.npy +03513137-c3fb3e4f87ca6c91388f6c7a9d3e1552.npy +03211117-95244648a330b9c0330afa9b9b51085f.npy +03001627-be305d2400194ef726e926172da61b44.npy +03001627-64fcd1ba0df5d54d79b3e1be3524f72f.npy +02958343-a42b6210fa2682adeb4ea3744b7acd6c.npy +02828884-bbd82d91a0b7fc12ad5067eac75a07f7.npy +03337140-e8307e0cd56ea254c3aee8e9d3a6ffa.npy +04379243-bc36a2facb65a01263f50818822b2585.npy +04379243-54addcbdd400808f54d30af857cfae06.npy +03001627-5f562c9c8f0df90fd2f33aaf794b5932.npy +02808440-5663138e433fa57c79d57ee14f8ee702.npy +02876657-8b7933b0376cea4a1efe98244cb8c300.npy +03636649-1b9b6f1ddf363e0e8b424343280aeccb.npy +02958343-c07bbf672b56b02aafe1d4530f4c6e24.npy +03001627-61b94385426a74323002761e7a3ba3bd.npy +04379243-ce803beb471c728a4f5f1d630285ffb.npy +03211117-2f07cae4c7809f0bcf5a37a70014c623.npy +02808440-75957a7274c39d54b8fda7a3b5ccb8f7.npy +03001627-944a665e765a13ee6d7db84fa3ca3146.npy +02691156-f25ffb9cf92236fb9671f5163e7f6535.npy +02958343-e0901a0a26daebea59139efcde1fedcb.npy +03001627-d56da491d5dabacd4453212030cbb3c9.npy +02808440-97ce198e3d7cdda13991a4f3b0ed6e4.npy +03001627-b4b2e315ec8e17c9a4f70fb45099ec30.npy +03046257-2f484b80a9a0f8a1c1bd423f37647123.npy +04256520-63865747038e4c66c35131da26f8061a.npy +03797390-7223820f07fd6b55e453535335057818.npy +03467517-5c570a10f35716bcaff103adc6dea0b0.npy +03325088-320e3c136e71c412b0957d845ac33749.npy +02818832-30eb0a2f835b91b19e9c6b0794a3b4d8.npy +02828884-7cc80dbf0cb6f4c6b8134b0fbf68257d.npy +04379243-37299b12d2ac7fe13fcaef19d88744fb.npy +02691156-2bc9a8aa5826f7335fc197bbabcd5bd.npy +03001627-184b4797cea77beb5ca1c42bb8ac17a.npy +04090263-7e826b890b683200b63969f9f8d6f075.npy +03001627-e0b432f43a70aa4dc71dfa81bbc5b8ef.npy +02691156-133b74393a3349aa70c4138179d9ed97.npy +02958343-a9a86444fd7402cac69ef68baeaf5d49.npy +03636649-bf3c1ceb076a334acb43a77d9793979d.npy +04256520-5f1a2fef69c5c0ce19fb4103277a6b93.npy +02876657-c107c8cfe88fa057ce53fd26be6d8b08.npy +03636649-c20ca2a29975866cbc7ea0c51211251.npy +04256520-8c6348fe629fb8c876a45e9a12af8158.npy +02958343-6ca9967adcf862a461c6c61410fc904b.npy +02933112-78937816b70f990d8fe14b5c9bc18491.npy +03001627-8a5b706a57166350bc3c6c80ccbccb1e.npy +02691156-17ad3ab1b1d12a7db26dc8ec64d633df.npy +02691156-4de5861211ad5b95e7ef9fff09638f8e.npy +04379243-621ebcbaafeb91a78616812464c86290.npy +04379243-5cebb89b77fcf78084cb825ff0118ad1.npy +02808440-5a4cf079a43f0a793321831d2245cf06.npy +04379243-c43d83c84e8d2614742728b30848ed03.npy +04256520-adefd541f3b51aba5f5e789acd4d1122.npy +02992529-7552cd75673834c9c8470fd239ba13d4.npy +02992529-4dfc1e4efd7fbf083cdba96133f0c38f.npy +04256520-f3abd87858a226aabdbfcb10306a3977.npy +02691156-697161441b9da2a7ca8607f540cc62ba.npy +03467517-8ef7b4bd85885a185a7d605170ee325c.npy +03593526-889b2e6dc1b409cd5e29ce2c9d37b952.npy +04379243-6555b5004c742433e3785a46a5c831bd.npy +03467517-d7a9114b17fbacd376d05024fabfa1e5.npy +03636649-8e0f611116a8df69fc9ae1e9c70f67b1.npy +02958343-d17acdc9dd449748ca92a4cdad802b45.npy +03636649-90d70f0a6b1cf72d79f0be73913de469.npy +04256520-5bf5096583e15c0080741efeb2454ffb.npy +04379243-297778bf1a3f8db5cea003eff0268278.npy +04530566-9798a8b84987bd661851363a5850bdc.npy +03001627-97c5ee9d477c82146c7e21b4ce9a4103.npy +04379243-d6ed3a1e5d5eab8d97fe55e7ac43b9fd.npy +04379243-e1b85df09d33ddea3e43be0b542efff8.npy +03046257-6291b9e4aeed283688b34c259035ab5.npy +04379243-7f6db7a3f529949601104cd2d998272.npy +04379243-29d9c6d84c6a126917b431cae0dd70ed.npy +04090263-2165d568388bfe649a6e43b878d5b335.npy +03001627-bf3f14225e8f899db62f9fb4b7f0626.npy +04256520-6f22991fc456e7a5f63bf7d908efc575.npy +02958343-68f06cde1b907c44e9e6d625d754e501.npy +04256520-d1738a15fe737103917b96045c9b6dea.npy +04379243-d32ccda2f4614dca4b2ec20c30ace65f.npy +03001627-ff02a89047d6eca2f95b04490c0648a1.npy +02691156-4cdd238ccf9002344f59c2a67aa8473b.npy +04379243-dc956d4dc6982188febad4f49b26ec52.npy +03001627-e1897a4391784bc2e8b2b8dc0c816caf.npy +04256520-bf504bde782c3f2ce8ced3508709e1db.npy +02691156-3c52f7f687ce7efe3df325aac2f73830.npy +03211117-cebb35bd663c82d3554a13580615ae1.npy +04379243-5e3ad0f79dc0c429bc8967b0321bd9d2.npy +03636649-beab7a10e86dc5bd70d7da54cdb9b8d0.npy +02876657-ba4b48d76eb79f7cf54e1b6f41fdd78a.npy +03790512-707dfe4769f3e3c5ebe67d9b32c3ddf8.npy +02933112-8390466432e2c364298a4bdd07dbdc0.npy +04379243-2da006ded7b80b61febad4f49b26ec52.npy +02933112-7f50a6bb1827b9f582bfcd34215ccfc7.npy +04379243-a7172fa4177661f4858699aaad4acee4.npy +02958343-bfc1822c1d6a529d531e940de4b7770d.npy +04379243-d10bf548de6c75a966130541a711692.npy +03001627-353bbd3b916426d24502f857a1cf320e.npy +04379243-16e874e6165e836b30bbd4cddd04c77b.npy +04090263-3b8a22fe5666ec993bb35aa9d5fb636b.npy +04090263-56bb7870765f37a05ad0ccf97045200.npy +04379243-2908340693e3dbbd8608f23147a4e121.npy +02691156-861dbd415c83e12e67c647d96462f673.npy +03337140-4cb3532fef99ecaf4c3aee8e9d3a6ffa.npy +02747177-8a50955facbac20ecf19858fd1963d10.npy +02924116-6e303c1727509522c0e9e88e2a6f9b60.npy +02843684-7dd57384aa290a835821cea205f2a4bb.npy +04379243-4116d19d60fc24f037a346dba83c013b.npy +04256520-29ec7e1541397b0e5ae252905262c0ed.npy +03797390-cc5b14ef71e87e9165ba97214ebde03.npy +04379243-5191d64e9a1b9664bfdcc70dcc16baa1.npy +04379243-1a08afbeb4334efeefa472e59de52b43.npy +02828884-90a309f7ac2c947f155d75bbf62b80.npy +02691156-fd7c74a05072d3befef192e05c55dcd3.npy +02933112-16bc9f5821d887f2d7838dc22b16368e.npy +04090263-fe26829c67320001638241f3ad71c10.npy +03691459-4ca26cee4108632859d58b5bb5e2bfcb.npy +03691459-5338db4536b4a889de7da340cde8d034.npy +04225987-36755d38d12e80c0702c58bc53d1e55f.npy +03046257-82c54e1f130534969cfea89fa3f36223.npy +04379243-21cdc417e398378e40f3ac0af6b7e700.npy +02933112-14b5e16ba851e17ac59350d819542ec7.npy +03001627-d792c65f8b1710709b9f2eb77f5e247e.npy +02818832-d7b9238af2efa963c862eec8232fff1e.npy +02924116-721792117cbd8de252470de2774d6099.npy +03211117-5a4add4da7414d11f2a521bdff0d8feb.npy +04256520-54baa6e5d9584469b80b68728684f2ff.npy +02828884-54547a5cbc7cd402c955e5ed03ef3a2f.npy +02958343-e40b027b68ff767d76ad064d1c5fdd7c.npy +02691156-6946f7a2a5ef851215ea536736a1eb7e.npy +04379243-c44792206360e4e4be1b0e1de3e987b3.npy +03001627-1c5d66f3e7352cbf310af74324aae27f.npy +02880940-9a6cec1cfca7e8b5ebc583f22bd58b85.npy +02958343-1b25c745164e53b822d2fb8fec68f2a1.npy +03211117-c0125cb175a11bc4990549fb11675099.npy +03691459-66d9f9f961a12754d1fdf116b1be3b27.npy +03001627-d8774646afed0312732375ced502498.npy +04530566-739a6f209a49040a4f44d84b9baa5f42.npy +02691156-de9e093bb17848c3b2bd4a92202f8700.npy +02933112-6b7123a3631583c612de5317fe5b354f.npy +02992529-e1fb2b5e5a306e6621ecd2b49af349a.npy +03001627-24c0e6a8b10abb77df2b21995cbbbc4f.npy +04379243-6bccd5c9b9c64af7812abbc2a4d00ee8.npy +04256520-b4a72257eff26336d7231c5bdc5ab135.npy +03325088-ef853be8e39805d4589577ccf07b31e7.npy +03325088-b8e9b70818bef88814b35a7d7cea7130.npy +04530566-e64bb04b54022e708d7bd537eb907025.npy +02958343-536477e0842580e0c3c4805a61e06841.npy +03001627-f13d600a3c4515e220ccbe1c34ca182d.npy +02933112-b572114b0944ac203fe047712e43e185.npy +03636649-63e9be096e29681829a42a0444436860.npy +04379243-af5e2282958114c3f12d7184a2ad3430.npy +04379243-4d22674c2acd9cc9f51f77a6d7299806.npy +02691156-ad98f06fa29c52eb23db3adbb2f1dce.npy +04379243-1eefaae6b1ab9615a22802c4e64a501c.npy +04090263-8f38c44779be7fd4340b66282f54c877.npy +03211117-f6a08ec163a037c310b3ff08c68acccf.npy +03325088-8f1e94d2e214b5c076d20e73c57c9a03.npy +04090263-27a144ab9c20b710ae9e1c81f7e5b0b6.npy +04256520-f96f7bc4d005a88db38d1ee17ad4a4a1.npy +04554684-53e2b5c6f9a2103e3fb0920a55a7e805.npy +02691156-131db4a650873babad3ab188d086d4db.npy +02958343-9fda50a84e042ff1a7e7e5ea49ad8e45.npy +04379243-4e3191c1f133fca0586c8517ad05e6f3.npy +04256520-5e118f0edd514706593ebeeedbff73b.npy +03211117-c98e0e745a92abccaa60d250862f15f.npy +04379243-28710bbf732bd651c955e5ed03ef3a2f.npy +03001627-748957972cae6b03c56be62b05937331.npy +02880940-6a772d12b98ab61dc26651d9d35b77ca.npy +04090263-bbcaf90d1025714f98ee95803c8422bf.npy +03001627-11e28120789c20abc8687ff9b0b4e4ac.npy +03001627-e159d82f67a5953b1fb41007d56c0ca1.npy +02691156-85738a291d67c649f019a51d1a3b2e07.npy +03691459-8c7c72599c6bbafc8323fc17a8352c3d.npy +02828884-6fe6b24009d0ac4f19b647a92023d001.npy +02924116-60b79c17ea581aa99c7bbb03ea46a56e.npy +03211117-ebd183cd1d075dd3bed06f4e613c0aec.npy +02828884-5c1dea3aaa34fee26c289bdcae73ee89.npy +02992529-fe9d97823a25e56d95e43220ee0eb824.npy +04256520-899f5c18a528aac2ef0b2fc3511b6fbd.npy +02958343-4e488242b665d85f40bc3b36a331b786.npy +03001627-2c8f57bf281dd31119fb4103277a6b93.npy +02933112-87708c9ebd845c21854c6e2381cc9350.npy +04090263-b1cf5989ae77d71180ac63732535bbcc.npy +02828884-2aaf5fe631a855b4de9ff1d2442cc6d1.npy +04090263-c474fa4cf4a4c282f5cbed688a0bb106.npy +02691156-35c9e363ca3fa6f8e4fc4c6009ee9462.npy +03001627-8e6dcb9b3eadaf9ead885ade4bf3150c.npy +03691459-6152f977e3cf8ccae47833b310955a9f.npy +04379243-9109c50681f033d83b233a16f6b369c3.npy +04330267-5b0c38cda43ebcb35a7e054e0372a0f.npy +03001627-a3c4bd89e7570dcc6204511a506beabf.npy +02992529-2274e1f494d6d2c3226bc3b9ce9ff2a1.npy +03691459-27867443c228581e515eb678a856048.npy +04379243-656b7353e4580f8fa93e942a054d60b5.npy +03691459-bc09422920aec02cb8901bb57b05fb9b.npy +02818832-2c8b8a58ecffdaa17b9c6deef486a7d8.npy +03001627-68747a56aba6ee318677364bd64735c4.npy +04256520-4735568bd188aefcb8e1b99345a5afd4.npy +02958343-6bb14c1083ed44f5ac34b841f2070767.npy +02747177-1cb574d3f22f63ebd493bfe20f94b6ab.npy +03001627-c13d5f3639f427587fa29a3ea424473.npy +02933112-c89a5482bb756c041d86c17c15247b0.npy +04379243-5b685a0318bcf5ff4ced24553b268ec.npy +04530566-c83910ef0a35953756e0cfd6e5118fc9.npy +03001627-fa8f7c225d3b9f1def4a09e7eb872bd9.npy +04379243-610ccbf900e1bf4aeb34db531a289b8e.npy +04090263-ceba1f5b53f3c3f0a4c018b03e3993f7.npy +03636649-b000d66b8f78ab20cfdfe3f21f42a111.npy +02958343-7b74eb8f053aabe64eb766e5a46fceab.npy +03467517-e530bbce9716bf95bc4ac3caf16ef65.npy +03001627-d5360f2b0b0299c29b9f2eb77f5e247e.npy +04256520-5ff07557bb0a3a30dbbc9440457e303e.npy +04379243-91a56c9037ba4a63a393ceda265543cf.npy +02992529-b1537f1eabb7f5009f7477e2986c440f.npy +02691156-dfa310706fad49d873ec74c119307b9.npy +03636649-a258951f55855e41c02170c33e00ea64.npy +04530566-4719acf1c3e56fb489d39b85991ba25a.npy +03001627-3b1b0186ebeb8ea579bb09dc5605a57.npy +03001627-bdc58ca6d411823cae786e8787e8886a.npy +04530566-4c8c605b2b452cbba66c1707a338712c.npy +04379243-607f9e630d94edff9292bdf65b24b621.npy +04379243-a4dbf0f4fef1c36cf199233c9f2ce2ce.npy +02691156-3cdf7ea70c5a8471f446f92b52bbd82a.npy +04256520-21236ac9a464b22a91fa1c643766450d.npy +04256520-bc65c38188f1e72c532e8683617554c4.npy +02691156-5f0e7de6a86a694d3930849f1d75b1.npy +03001627-1b67a3a1101a9acb905477d2a8504646.npy +03001627-a203bbe3c9c1c676c3bd24f986301745.npy +04256520-6f0477514eb4f9319b0530265e62c9b7.npy +02992529-cf3f330fb6e3e034449ec657800ab951.npy +03001627-400ae609e39ff49639d5fb08047c894e.npy +03624134-8f499dae474bf37589757884a4547730.npy +03991062-84fb2bea1b0b6701dd3adf3090c701f7.npy +03624134-e0a78d771cfde145a5cea7e40e4d21ff.npy +04379243-4b47e8b6ac084de116a2b5862518c93.npy +04256520-592fdb44d4bbf0ee490ad276cd2af3a4.npy +04379243-fb1e39667d83506a41dea5e6084523ee.npy +03691459-b0d4ab08b9498de4f42138205659017c.npy +03211117-7636d7c650108b884dcb5392aaf2167b.npy +02828884-7a3590d0abb36b49593ebeeedbff73b.npy +03636649-6bd7a0abc6f77368b0cf606cb698fa08.npy +04256520-a03ca96c53c69c05f8a51dbffe0021e4.npy +02691156-c846ad445cc9acbb98427765723d5e48.npy +03642806-cb090bd99ed76f9689661310be87a70d.npy +03001627-bdbf18aefa5b980585b479b317175b55.npy +04379243-a29ee68d1279e8ff98d5fc0473d00a1c.npy +04530566-ffacadade68cec7b926a1ee5a429907.npy +02924116-73fa2052813f9e78730865f7b652666e.npy +03636649-c1532683707c38b51cce8c25b11ccdd9.npy +04530566-390de3a1bd0191c881d9d9b1473043a2.npy +03624134-cc38f97557029b2a2b5fd8277662be97.npy +02933112-dbcf0d09a1cef0aecfaf287992b2065b.npy +02691156-d7287ce98d521db5ca8607f540cc62ba.npy +03211117-149733a616f846a2b661587eebd6c4d7.npy +03624134-3a0f48139bfd3a4ea152d2e823b9fe06.npy +04256520-218f5acd2b8f2d7c85f6609ec867506c.npy +03001627-64ed01e4a892fa8e498bd5a555c21b1c.npy +02992529-16c6403551e81a3eeedfca8b846d3b01.npy +02992529-4475473d3a96860621844676433a0aca.npy +04090263-6cd490d9cce62e94d2c901959c439025.npy +03001627-5ef54fa5d00dbdf8c8687ff9b0b4e4ac.npy +04401088-e862392921d99119ee50cfd2d11d046b.npy +03642806-dd282ed5d4956590b713df0d260c2628.npy +04256520-494fe53da65650b8c358765b76c296.npy +02958343-2a0dad4f32251b353ffe0e5069bf1eb5.npy +03636649-9e0b193df5bf4f2097497273a66fca55.npy +03642806-247012532a6342f424afdcb79b0329d8.npy +02691156-cbb5ed444249f0a9e90916c8815b5c43.npy +03624134-c20cca071ea58e3ef2c542131520d62e.npy +04379243-6550c93bce51b9b4719088c8e42c6ab.npy +02691156-2b2cf12a1fde287077c5f5c64222d77e.npy +03001627-a9e2b04bb60240d0febad4f49b26ec52.npy +04099429-e98fdff7cfdf15edd8e5da8daec55d43.npy +02958343-c234638891f21417ec5e3fe5c33367cf.npy +03636649-92bdae8c11323fc518df0876cc6aa6ac.npy +03001627-241d81f586925ea0fbdebca9f6788597.npy +04379243-5ed584534db04e128ddc9f1b5f92baac.npy +03211117-946ec8b571ca42d378838533e331d3cf.npy +02691156-76a86e664e302f32fca1f1143bb6bc17.npy +03691459-2003690fcc8390a24c40f34de8f3bdb8.npy +03636649-421734c234a9ecce5c166769fb8a1974.npy +03001627-359331da71ed26eca6c03a53cf0a14c9.npy +04379243-fead7e0c30a347b1710801cae5dc529.npy +04090263-f0acf574b96f9fc3829eee2486bd54c3.npy +03001627-67b082d174af9ab06acc27496f96b513.npy +03001627-5c660775f1c7b202855c835f93769fb8.npy +03991062-aeec00d8dd6e196451a2ad3de1977657.npy +03001627-55740c07554a726257f40ff86fe708ff.npy +02924116-d8bbe91e70fb6dc0aa2a2973c341188f.npy +04090263-c37c062ab5ecca2ef3998727b15249db.npy +03636649-b9d353635f7e1134e95ee7559a2a873b.npy +02808440-69f95bd359cd47d0448cbcbac44a38bf.npy +03046257-1944938643bdb1dd56538cee362f80d0.npy +02924116-505d081493bd01a09600ffd1ed0f3806.npy +03001627-8f6634a231e3f3ccdfe9cab879fd37e8.npy +02843684-c815baf0ba9306cca9af96dabf6167b0.npy +04379243-f260449e91824f96d810b14a81e12eca.npy +02808440-ea012fc2a70eb38c14b1a3362bf89056.npy +02691156-5a38f5eb63dd8b20ab9d1113aabc16f5.npy +02958343-6c50a9b8e01fbca27dfb1ee6a4b12bf8.npy +03691459-fa2cf860e277919a7445d25f394949d0.npy +04379243-d06d27bc9ad1faabd7bf6fb68df7f786.npy +04379243-1f9923d1e65004d836e4b0ae0f52067b.npy +04256520-ecdefc9c1104da52bca88fbd368f59a.npy +04256520-dd8de6dddffe302f84633b41c8a09fa0.npy +04379243-bfd32cdb923c8430e260ed121aebe3d6.npy +02808440-4399b850494bcfcd2dee675288ffec8e.npy +02691156-ade3c4987f49895ff960bc420d751255.npy +03948459-b62475e6bfcc88a226735d0798dfa389.npy +03001627-6434921f88bd48deb0957d845ac33749.npy +03001627-421b11a26931160a492d9da2668ec34c.npy +03325088-8ea7517f0c9c8a5ce27c891af4570491.npy +03001627-f1787517791764e74b3c42e318f3affc.npy +04379243-9c57462582737eb7d46cc1240811b39d.npy +03624134-b678ebb41660034c32e713e886ed6efc.npy +02691156-c3a03137955f65c5cf67c0b63878e138.npy +04379243-33d620c4e8af291d5dcc7ddfa72357b1.npy +04256520-51194e8dad49dedeb38821f893bc10f9.npy +02808440-bbe02a8cb3ea4b4844221bef0fa3c36b.npy +04379243-8a47668d3584eef1e4317813b39d4fe.npy +03001627-b60546b326e585e03ac416718757a350.npy +04379243-38e83df89967420b876b399a99a15c0f.npy +04554684-bdfbadd16a5ddceb8e55c35c514cb2f7.npy +04090263-d761053ffff137701d9b004d9d8d2781.npy +04256520-3eb1a7a9a4ea97e3e44bad6fc9badfe7.npy +02958343-ee1d28a50a2b71e129348d14ca881f7d.npy +03001627-53675c4bbb33fe72bcc0c5df96f9b28e.npy +04379243-e8ce7c3e66e6aec08ee0a9ed0efc243f.npy +03948459-15a33eba4028d9e9359df9cdf4b82128.npy +03001627-7efeece3b5cf2853d706779c93538ee1.npy +02808440-6be7c8fafd1268776b448b8aaebb705c.npy +03001627-52afab7f974e7bdbac1ffe34fecf39b2.npy +04530566-8605c975778dc8634c634743f56177d4.npy +04379243-93d61cd5da999d774b3c42e318f3affc.npy +02691156-1e4fb40e5908f2bddf2f34e1100f0241.npy +03001627-20ec9403d616f96ee6cfc789522bfbab.npy +04379243-77e044ca2ebca1f4d148fd8215fc3114.npy +04090263-c77af288e7c373979905a3939c890ad2.npy +04090263-fb96b1414205d7b525c70fb1df3f879b.npy +03001627-d66cc87c717c15f57f0839ffd260627e.npy +04379243-5d77e8f6ad3741a0c30ab36bf7b0552.npy +02933112-8697ab2a0da98ba65588a2543ef0b0b4.npy +02958343-aa7f127bb8cd9db73755eb267a6f3b6b.npy +03001627-91645c82e357ec502744bf8869518694.npy +02992529-b1feb3020d9380ba4fb324159a14f34e.npy +02828884-ff71a0d33a3aa440565888a91a05d618.npy +04401088-ed5ac4e8c681102e848d333362aaa342.npy +02808440-6716bbccb88071daed20bf7873c38793.npy +02691156-62bc52c204b738317dcda43eefa0ac02.npy +03001627-329ec98f10af7214ac6962daa1b6ab91.npy +02954340-e8a97a1fd97c1a75a52821bf1aa3b19a.npy +04379243-10b6147009cbc17ec25cfdac7cd67ea3.npy +03211117-444fe598a0ff9d7ebe24753b6321b5ca.npy +04530566-5e8276dfb4c1db936f31e247620349e3.npy +03948459-5e895f53b72ad0ba49590df9bee4071.npy +04530566-762afb11bf41fc61642f9e27aaf0c47a.npy +02958343-9807c1d0bcec85fcc3c0146ad3ea2d7d.npy +04379243-b0d7c6d51712d1fbe76bc197b3a3ffc0.npy +02992529-976a8d10e8423f8d8f15e8aad14ff29e.npy +02992529-57ff44f979370766976fab5d6e2569c1.npy +03593526-96106df7b7d1ca5dfaeb9da29098949.npy +02691156-ca91becbfaf5a094bba1aa1c98256342.npy +03001627-4e9475fea6f3ca32c4cb3d6800567627.npy +03001627-c9d5ff677600b0a1a01ae992b62200ab.npy +03691459-a99cc4f1326b9b48b08cd968d6703683.npy +04379243-57f64087490954d2c015b1a51bdead97.npy +02958343-70d46fce66801e0f16abce8cb03e7794.npy +03636649-ae5ecfa01e88e47f41bb00bd5475793.npy +02924116-856afb0a9a494aa6402dc8d46be324b6.npy +03001627-99fbc3ebabd3b83e54beec3b24722e27.npy +04379243-62bba707a00a2fd0c271edf49b97f472.npy +03001627-a216d6a04494ef6a32485dc6e0b2347.npy +04256520-2ae32451bd6b947e593ebeeedbff73b.npy +03001627-3aa41731c9bde97796d5112fb101f3ce.npy +03636649-9b9b39303c66baba490ad276cd2af3a4.npy +02958343-b25bd03ac3b1ce39d5238b9ecc7822b0.npy +02992529-2703b7edaf11d79a6b203c09a4932f5.npy +02691156-76f142e62adc0f2ae768735f27170bc4.npy +04379243-2c14b0b718a1f3765828f54ccfceb8a8.npy +03636649-366a93bce1f6f524eaf14273fa406ffc.npy +02880940-8d1f575e9223b28b8183a4a81361b94.npy +02828884-3a7b2f1220e7c13092ccafdeb0ce5a8a.npy +03636649-e38e89e852fe924d957f81d76123f1a7.npy +04379243-ec3f93916a91e386c29f1e5c35eaaf93.npy +02871439-9e23b733b160313ed260ba674fb1fc01.npy +02691156-9618b78610150b53825b20c2472ad90a.npy +03790512-2d655fc4ecb2df2a747c19778aa6cc0.npy +04379243-cd895c35fff495cdd0b93fa304cfa755.npy +02828884-24f090d8ee565dd1601104cd2d998272.npy +02992529-1edc7aa574624ca0200a0406803801e9.npy +04090263-1d50f114691be38fa9286f039319ff7.npy +03001627-d1bef1cf465da3acdca30639ad4a20ca.npy +02958343-e4d1edc4cda4a6445fb81d6394b59c19.npy +03636649-13d5888a6598745f82bfcd34215ccfc7.npy +04379243-40e4f56f34f98a779ebe79011e3a0eae.npy +04379243-f3fd419f725aa894ba5342d638d0c267.npy +04379243-42afa0dc60b32a6d7dcf230d8b7d162e.npy +04090263-9642b6d77734a1c351cfdb4c9f126c12.npy +03001627-5509f56ce625c42aff2b8acf844d34d2.npy +03001627-225ef5d1a73d0e24febad4f49b26ec52.npy +03001627-5840d369b3e0e40f7c4ed45ce654123.npy +02958343-c8b196595745bbd241c181f4a7e1bfa5.npy +02958343-5cf1f82c6fd31a73e0445fc6d980dd5c.npy +04379243-30573f43ecfd93f0684b7bc3f8a9aa55.npy +04256520-1914d0e6b9f0445b40e80a2d9f005aa7.npy +03001627-6ade3daff4827379492d9da2668ec34c.npy +04530566-c4c9a32c9b1c3e515586434189043e91.npy +04090263-ce50f2f8034fafe86b2c8bb96250e4a0.npy +04090263-9ee24e8914555d18d0a6af9bfb470a20.npy +03001627-97d75ad96c2c08268cbb8bac2032149c.npy +03001627-d607e86b83f628faeaf288f952624966.npy +04401088-c410d13694b8ca1d15e144fc878b7afa.npy +04530566-7b568afff918289614621506c22882a0.npy +04379243-b0b0df035ab58b92822a33e080d0e71c.npy +03642806-25f391ae823c118963439329667c7723.npy +03691459-d6ad58677b397894224f9d60ad32613.npy +02871439-2d628b78cef91948636882dec160c4d5.npy +02958343-a0a1b0377d72e86bab3dd76bf33b0f5e.npy +02808440-d5c8f32fdf76cd316b448b8aaebb705c.npy +04379243-735acef5841a826b6ae95494c18318.npy +03001627-7aaf5573892cfe086e6e0f71258e961c.npy +04379243-53afd3dc40b699cf124123a40f9164a5.npy +02958343-caa7b1a7dabd0fd3be0e4b4a1a900aa0.npy +02691156-973211dfe6bcc4ae90b1d6deb98feec6.npy +02691156-87edb38cd76e89f5996d31205aa7f7a.npy +04379243-9c32d9398c04a66bddaf28b23330377.npy +02691156-4b10780b9e0f93f1d32761b337f8b72a.npy +02691156-365747560fafc7e847b5c8181a9fe9a3.npy +03797390-46ed9dad0440c043d33646b0990bb4a.npy +04090263-7e5c0d35215be21ff3998727b15249db.npy +02992529-c688e0c0830ddebed23d7150656e0d04.npy +03001627-f5be22e0a737ca9f2c0658ad22a9a9b.npy +04256520-63eeb7ea2c7683b3f811db9eaa01354f.npy +02828884-c52f48c97868b7dfea8a406c7edcf3b4.npy +03001627-30ba0d3e750dd7e0876b399a99a15c0f.npy +04379243-2c08b5408a7ee4da98cfd47a860803c5.npy +03001627-1f3591151aef17ab997a9cd87230da.npy +04256520-10552f968486cd0ad138a53ab0d038a5.npy +03790512-80e717f07645a4a0b37378f3c85478b4.npy +04530566-973d0293e286c80bf3e39f2e17005efc.npy +02876657-5979870763de5ced4c8b72e8da0e65c5.npy +04379243-638c86ffc1c9e00c5749f7a8e1644575.npy +03211117-ab2f9418c111cc6ddb965514105122a4.npy +03467517-9eee9fb35c1f62d34c9360dbc3be7004.npy +03467517-113b65f0e68314737c481698bd5233b4.npy +03001627-80fab0c55a60abb7dafb0be26f6b45d5.npy +03001627-2f1a67cdabe2a70c492d9da2668ec34c.npy +03761084-891f65c773939191c834958aed613724.npy +03938244-4691e0947b1e2a6b685998681d42efb8.npy +04330267-2b9af8c16f4b64595e5e29d9f2069262.npy +03001627-610ea34f683eaad58cbb8bac2032149c.npy +04090263-2d1fee5d2dfc73cd231b1db6fc883f4b.npy +02958343-41c5c3955dc6525a402257734064a917.npy +03325088-bf4f75844044654076d20e73c57c9a03.npy +03001627-a521fba02ca7f9aa822215026d1e8d82.npy +02818832-5f49c821b5223ab59c00f10333f1c0b5.npy +02691156-f5e271c3cb2edc1681209be1a5e8b10d.npy +04530566-59d2e9b3b4de8695a0c75f497eade21.npy +04379243-1b73a0ff61df00c5a1cccbba517add5e.npy +02691156-e2ddbf9e63bbf9cc4e99bd46be8e610a.npy +03691459-3110c18edcedfb6331f3d76ec3df45bb.npy +04090263-7aff2693a24b4faed957eaf7f4edb205.npy +04530566-3658be4cae1c98b84a51f4b900f5eb50.npy +02691156-c6ab8acad9e61a3e48227c7754aae2a1.npy +03211117-ab8cd6dd65cb0ca9770f31b5d5715b63.npy +03001627-34898c36e711fbde713decb1a0563b12.npy +03046257-4f0f676001ebb1de561dce3fe08634b7.npy +02828884-c2365f1009f94814ece2872dbe44bfca.npy +02992529-1292caa1282ad8cffc3c4ad908ac06f4.npy +04379243-41e443beb22248b46ba14bfd91a75020.npy +04379243-ec4675f62f6946118cbb8bac2032149c.npy +02876657-98f2bdf417a15ceaa5d6dc096343ac63.npy +04256520-5c0d256f2bf7559bfc8914dd77284b3.npy +02876657-656ef8a799ee1c5118431871c8e05789.npy +04379243-dd3de76ab27a6aee8141276dba5d99db.npy +04379243-6746eb452d8b84323087f84b199fd297.npy +02691156-3d6a8f8c27e465aac6747f7c9ffe9e32.npy +02691156-1cb757280b862ae52c7575c9089791ff.npy +04090263-43fc3a905d6024290dc2ed23ceb8a8.npy +02691156-76252e1b65ede02f889919e9428eee54.npy +03991062-4254d2adf7f909eb2cb3e065bdf11951.npy +03636649-36182fffe5b450fd65d1b2bc83ce78db.npy +04090263-7787dec9a3d40aa9c6b36efc015b1017.npy +03691459-2a6f78d39d66f6171bd445ab4c056b71.npy +04379243-e5ea9b41ff06d7ce2c396131c7cc7ef8.npy +02828884-11665c5093e85592b340344cde6e80c4.npy +04090263-332cc5d5d3484f8920517b73a75a21ed.npy +04090263-6c51211b773c51cf683e3750b53385d5.npy +04379243-e6a188bbf8315d11f1783a44a88d6274.npy +02924116-c88a4393e101d4e8b855cdc1bde1c5c9.npy +03642806-546b40d15cd483873339d8259ddfa7bb.npy +04256520-349f3f4d65f64c1235836c728d324152.npy +03001627-dd414923feefc1bd160139aa3ea05a51.npy +02691156-4a552066ae1da546cc34b900bb2492e.npy +04256520-e8e8f3249b237cb3450fa717654492da.npy +03928116-8b987a81642f3cbf195d81040cc60.npy +03636649-e303a8b8aa3aa14a39b3360f500ac52a.npy +02958343-95844f86f4f0a6b58a6cf8c6b92417f2.npy +04379243-71e814e5c0f59c1ec45dce3c044e7ab3.npy +03593526-a060ca371b0f70d736b0f2a1430e993a.npy +04468005-6a930aee7d68abd88e966271baaa42c9.npy +03001627-a2fdf98f85cec8696ca407465d3c74d7.npy +02933112-5a6715ef95a99bf59856fa70a578baeb.npy +03001627-3e5a18ae1c8d5fe068d1b9a1d97e2846.npy +03636649-1f30b28f2dfe65a21735ea0e092a805a.npy +02958343-2490227846d06e5a2387c64d55d0b4e5.npy +02871439-d1ce207dbd39b5695668a412457992c5.npy +03001627-1aa07508b731af79814e2be0234da26c.npy +03593526-c331b4c98868bfb529a42a0444436860.npy +04401088-424d356bbbdb38daab0fba1d15eaeacf.npy +02958343-2181653ec5313196d2c8600344d8bfab.npy +02958343-44c7a7a13fdc673abda72093f9b5aa73.npy +02946921-6f2c06bb129e52be63ed57e35c972b4b.npy +04256520-7ac7a4f53a89ecb48f966131432ef871.npy +02933112-9b28e4f5c66daae45f29768b6bb620cb.npy +04090263-a15d5a9816ba40bb76d500a9282a3dab.npy +02828884-d6924af4f2849c8219fb4103277a6b93.npy +04090263-8d9471defc6f3a8fe71e857afa9df271.npy +04379243-b23bf5b53e1e61768984d623cdd9496c.npy +03991062-51b09b5732e8f6baa2c59a4d90e63212.npy +04379243-c3023187d59aeb87a731e84e842dd6b1.npy +02958343-78555893ae97d1fea37127a27e431e39.npy +02828884-2c75963e304f490223ed665630afd1ce.npy +02958343-1dc58be25e1b6e5675cad724c63e222e.npy +03636649-cec37bc68adf2a20e6d206b2ed87676.npy +03325088-b1a88b5b7861649e7a31dd5af93fdb5c.npy +03624134-fe975241a968467ac3669fe98cc0dfc0.npy +02924116-739725054f3dcee41ef2486fe36a1e66.npy +03636649-9d1e04bd3df11256bef045a510a22fbb.npy +04379243-17ba1ba8f935f2bbdb01c957364e77d0.npy +02958343-664b8ab637c1fb54a78cb4f1b66f009e.npy +04379243-1ee2b2bc538245a85de04aad18bd94c3.npy +03636649-b1dc9ca886ac0cabb924fe739b83941e.npy +03797390-f1866a48c2fc17f85b2ecd212557fda0.npy +04401088-474b04796bf1ec91962bfd5bcfc9bf86.npy +04401088-17d4ef9fa59ede481cfeae953cc2339d.npy +03636649-23040992da19679aaa7cb30470f3273c.npy +04379243-bd516ff50ec6fcd498d5fc0473d00a1c.npy +03636649-eb1c735af1339e294b3c42e318f3affc.npy +04379243-472fe5ae8d386452bcd6195ec0f1e297.npy +03636649-b64e98c991d4103170365ad078f710ff.npy +02958343-5be79b1758410803be40bb45ea25a041.npy +04379243-67057f4425cf8fa5f46b0a91833c80a4.npy +02691156-dab7d624889233a863dc0bc8d259b20e.npy +04530566-61c17240229bf84581d9d9b1473043a2.npy +02808440-c843cc9df022e96ce6c3e73b818a2cc.npy +04379243-4e6db34a8ddef9abb9569033586af233.npy +02828884-1042d723dfc31ce5ec56aed2da084563.npy +02828884-4647754b7c5b31cccb2a965e75be701c.npy +03325088-c4c8a8f2ce62f6f4c36fb70296e45483.npy +04530566-3a68e8dc897fba988332d0d58794c3c4.npy +02691156-9818f0b88fed05b24b0a1bcf2fb497ec.npy +04379243-d77287719eb7bf0d66ef9dd2f3ef27d3.npy +04225987-ee1e75f67edf37707f29c61065b4dc5a.npy +02924116-a98700191f42cd976bed41d0253513f3.npy +03001627-f0f9d29b3eb76fb7490ad276cd2af3a4.npy +02828884-7b7e73cbc821d520f155d75bbf62b80.npy +02871439-d8a53f2b980eafae777668bd5471e4f9.npy +04090263-bfbe959eb045a3826e181e3da8402358.npy +04256520-38f6d097455e58053d6e282938a47f9e.npy +04090263-f04dfecd1ae139a23e7a62ab2a088af3.npy +03624134-889f73fac7e89bf932315e7b779fa298.npy +02691156-3caf95d83fcccdcc28662498a294724.npy +03211117-df2f0bef5a669d6262c440075d5ed193.npy +04256520-63e45aeea568f1b0c35131da26f8061a.npy +02933112-783ba337e5bf328abe81a9109a782712.npy +02924116-c9c6445740eaaa74a495c196d4f0cebb.npy +02958343-511962626501e4abf500cc506a763c18.npy +04004475-3a4e546431684c822f84cb7932f866fd.npy +03211117-e5b50925213ade6a340d4ac30c6d322a.npy +04090263-407324b2f2b89934b5945297ce426f02.npy +03642806-e1773be8392c5fc4f7d4d3ced798ad90.npy +02958343-ebc59fa7d366b486122181f48ecf7852.npy +03001627-fee36ec8c8ae503fc68456e8da5b9a30.npy +03624134-6d5466e70653d80aee22e58d18efdd28.npy +03948459-2f5b4bcb8d4dd901609e2d916fa0da27.npy +03001627-128517f2992b6fb92057e1ae1c4cc928.npy +02691156-902cc09a60a494a278d0cdddb0c08062.npy +04379243-250cd21169a42a2bfaf26c91ad27299b.npy +04379243-fcad199862c19cd97fb247f6727f93f3.npy +03691459-893bca10c44ffd673e1b2d018c0512.npy +04379243-7436f91df61e7d5bc10555abb2efb430.npy +04379243-d1457e572ef95ddbd2096b2fa6f98cc7.npy +04090263-ccf770542367f03f276c3d558130f8b4.npy +03948459-baaa7b7c8a39bfa5bf8434cfd671215a.npy +02691156-f0d6c53d21ae5b5cd0c57f18e8d8830d.npy +02828884-3e81e31d8cd99cdffae0a22d98098878.npy +03636649-5f865b98b4be6abf35836c728d324152.npy +03790512-c9e2437df080309baab0751e11299b9f.npy +04090263-79461905bb97ebc21a77229b9f90bf5.npy +02958343-d6089d1b75c35945b7e8c57d131d2ca7.npy +03710193-26ac0ea516715a5044b2fa2cac0778f5.npy +02933112-2f0a56c30e384642c59350d819542ec7.npy +04379243-3bcd7dc964487b1ae6c5cd45aa112726.npy +04379243-f622d7d6892fe02937251258858a7a58.npy +02691156-e6908f525ab8e6823a562128d0cdc8f1.npy +04090263-14a3a4e859a9462bb335d40260934189.npy +03691459-cfc38353ff8392e73a7dda43d8d95517.npy +02691156-940c9ed5d7610d915d3bbd70fc7759b7.npy +03001627-c98207781087c7c2995e7ab497adca70.npy +03761084-698b37ec06448da7160ce9e819e30139.npy +02958343-b3aea199d8f8945d3c8089ca2f2a9299.npy +03001627-2ae1dc95e09b858128fda76c378c923.npy +04530566-e8d1da5077f0fd3754f4583ac182c2.npy +04530566-2ab688c7eaa21bbd77e7acf84a1c4b6.npy +02924116-79e32e66bbf04191afe1d4530f4c6e24.npy +04256520-dcb434ec43228c7e98621bfaa41dc79c.npy +04401088-3aa3d13575540a99167196b0ec8ce495.npy +03001627-4cc4cb9b533e8b84b04cb542e2c50eb4.npy +02828884-3ca55ce22b40b8c2ad364a967d96b388.npy +02871439-2d68b12e799ec982df18258a84843c90.npy +04090263-e9cd2397c0a7ea86341aafe10fd0cbd4.npy +03636649-f4db9c55f72edb36ad0d9196eb691e00.npy +03991062-bd6ba738a4e40e23cb2a965e75be701c.npy +04401088-ae7098f0bc20cc6b2a87aa332da7bee6.npy +02691156-5efa09bee2cf193afaad157818f6ee1e.npy +02958343-a26d63de878b28fd52980f173b56924f.npy +04256520-bfd09a13ca8d039d24d3570ac22df4c2.npy +02954340-1fc6f3aebca014ab19ba010ddb4974fe.npy +02933112-5a3428f5690f57a7cf004563556ddb36.npy +02958343-77d9a23f45c888e595551e0d9e50cb0d.npy +04379243-737cc2beda4a023619fb4103277a6b93.npy +03325088-2e31697d451f89843321831d2245cf06.npy +02958343-78c5d8e9acc120ce16abce8cb03e7794.npy +02933112-e2d06603fba3bf3310af74324aae27f.npy +04401088-e0b1cb72aba261731fa8e666182e8619.npy +03001627-5e259c1b8640f5b7dfe5fb64510022bb.npy +04468005-1aa05c2e358d09b52470de2774d6099.npy +04379243-6f39877ac66ff1b55936c7265c890fef.npy +03642806-e34a4bd815f38858fb15d1c4afffaed3.npy +02828884-107c0b6b32282102493c8fb81dc7c4da.npy +03001627-ed953e5d1ce7a4bee7697d561711bd2b.npy +03001627-6dfb7b5b4bd0d5f9febad4f49b26ec52.npy +02871439-c9bccf9e749da5d6742728b30848ed03.npy +02808440-8604c03fb772a81eb362845c6edb57fc.npy +02828884-bee41df71228b870593ebeeedbff73b.npy +04256520-94988ca3a0f73d16cabc196a7f35f1aa.npy +03636649-ef45c648fe3b0dde8449e0b8dd14796b.npy +03001627-fecb6b1159091d36d0176f9a144100cd.npy +02924116-e17c497806951fadcb4d826afd1c8fdf.npy +02958343-3ac664a7486a0bdff200a72c9245aee7.npy +03467517-e7b57f47d2ff2093f0194265a9746c.npy +02691156-8615e879f5d72ed5860c8fc9227db68d.npy +02992529-a13cea3066cd5b1746ab0c6c4666145a.npy +04099429-3a571503ba7f70c73df4fa4547276fc2.npy +03001627-65da0b239837b0f3f3ee5e8ea028d6.npy +02924116-b445a7e6f824f2db6a6393c63592ba88.npy +03797390-67b9abb424cf22a22d7082a28b056a5.npy +03211117-cc499148f0e031054b8def6cb3b321af.npy +04379243-9649ef758d3334c74500047017815f5f.npy +03624134-5e14870221caf3bb1395331ebe4786cd.npy +04379243-dd24fcb1ceb67ded3d937a346d1565b.npy +04468005-78430d9dac1f443a43483de0903bef89.npy +04379243-4768cfe825063ef930c15a57aa97b3c6.npy +02691156-ddb96cc263869979f446f92b52bbd82a.npy +04256520-9f12f8119a52b141effcc073d8ec38f6.npy +03991062-37853a4a1a918e9ea4de89c8b25b5088.npy +02691156-dcb5bded8772135b4295343ee7255799.npy +02958343-9031339141bad8608f89f9805dc3c90e.npy +03211117-3529cd0cb733596bc22a9d71e5721aa6.npy +04090263-b10748ed5e3e01f99464f279e4e22634.npy +04379243-16961ddf69b6e91ea8ff4f6e9563bff6.npy +03001627-2475ead1cfa0a5a6490ad276cd2af3a4.npy +02958343-6103654b252c5d3bb1bb46d2556ba67d.npy +02691156-a4c41dc85210c3a0ae049cb809622fee.npy +04379243-c074e43821469150d6084fb53091249.npy +03001627-609d3b4977310957909e1fac9945adaa.npy +04379243-da234c874b8beef22e1a5fb6897c8678.npy +04090263-51ab5dcd79ccf3b5ffd7722cc96c6452.npy +04256520-e5da166f78544aabd37035c74acfab37.npy +02992529-fddadcb723b843eaafb07a946d621b3c.npy +03001627-85b73c87c4c73263a7c64d6a7060b75b.npy +02924116-c01459435b19e42b52470de2774d6099.npy +04379243-58cbc849279b38e0c16f7010a3b8fdee.npy +03593526-bd96246be9854deedfd64b437f0ace42.npy +03001627-3ae022522800685c610195e4fb10d1de.npy +03211117-34f6cff3e8fb6315fc2aaecaba21de51.npy +02691156-fac9c4f0d5f239e4f2b0736dd4d8afe0.npy +03790512-828210e9d0a307c0a9a5251e8f29bd8c.npy +04379243-f5a42533b878229d942b01e78b9a302d.npy +02691156-ace4fe6e9c97150a35fc197bbabcd5bd.npy +04530566-9746bffb188fa8d776dfbd72ad52dca6.npy +03691459-a24796b40f26be4a19f048d3a7935eeb.npy +03790512-48233d99d0bd59e5d8a587623571014e.npy +03642806-e4c34c87ed1bc2191ef7a71d6e01357e.npy +02958343-83e5b5a3f3aad942ed29cc2a32e4bbed.npy +02958343-c2467fec08734fc81e1473be174fcabe.npy +04256520-f7b17391a903c29ef84b0be7f50940eb.npy +03001627-a3c1460f50bd470dd064b65ccd89778c.npy +04530566-cd67f7d1ba943b162f84cb7932f866fd.npy +04256520-4dbe50ba1f562fb236413faee81117b1.npy +03797390-5ef0c4f8c0884a24762241154bf230ce.npy +02828884-ef1149155829a5175c7dbebb6c018341.npy +03636649-6efc48bb9267c2ab4c6deb9ede0648df.npy +02933112-cc198051642f31029a88326b888756d7.npy +02992529-5a28460645d4a28c7fa29a3ea424473.npy +03691459-af39a67dea9ff78bf46f716b2b22b550.npy +04379243-7a1d2827369011344d3fed2e930520c.npy +03691459-f6d4918c7dd190447f45370489ca3156.npy +03325088-e9dc5059372ef82e7843fb4efdc19510.npy +03467517-950b02a2db950424c4a359bec2c17427.npy +04401088-d406eebe0342fa8373acc74b15c67e07.npy +04090263-1f755931c16980e06ea2d3b1b25fdbb7.npy +04256520-9fdbd10380d433d0f564f8e3eeb8449e.npy +04379243-b28f6acc151cc20e19fb4103277a6b93.npy +02691156-61e8e8a7ea726a03c79f92df566f8c6b.npy +03710193-976e6d4efdcb81a0e9c2721ccab8cde4.npy +02691156-634de14a7721145fb3f2b01de37c0b29.npy +04090263-4a32519f44dc84aabafe26e2eb69ebf4.npy +03691459-7599541dac4a89ada1efd4f01acbedc.npy +04379243-e21fddb872844e02713f2e93cbeac35d.npy +04530566-7773c432613c96596cdd81a51107bb1c.npy +04379243-c3959f18e44ed46b40f4518b250404ee.npy +04530566-423f4d084e13106db75e46a5ead1e5fd.npy +02958343-f4822aa5b83b28cb35840786ceee5cd2.npy +04379243-184c944daf00dc9919fb4103277a6b93.npy +04090263-36b65f1b9161a5f231f3d76ec3df45bb.npy +02992529-2a6d70bc7ac6db391d4136675e1527dd.npy +02871439-47e8801869f3dd62ecb0f4b907025ed.npy +03001627-c4cab2a416a4537e2871cc0b3cc1a485.npy +03991062-2ebe359d8cf7f6aba2c59a4d90e63212.npy +02691156-e416ba617d5388401b0d75a1d7e2d58.npy +03001627-20e0e65d8a10a88f91b8ec332e6d93da.npy +03211117-8f9c63f788d0044dedea6f8de4918c9e.npy +03211117-fd2f94be1061ff2ac92f2f0063445de9.npy +03691459-a8de7f2c7e00f9a01e5b68ee10358ea3.npy +03001627-c833ef6f882a4b2a14038d588fd1342f.npy +02691156-d15e3519a61c5bad86442c51e82d8d69.npy +02808440-532ea759470c7e0b3321831d2245cf06.npy +02958343-c0b9eb823b9fff9a2764cfba57a5de73.npy +03948459-7c799e8aa1ea1d29804fa2d77fbff970.npy +04530566-83ca38043fa57a7de8e8428fe69dbbc6.npy +04379243-3de638f1ace536c41b17743c18fb63dc.npy +04554684-67e25e8640583e8d91219aad82abc053.npy +04090263-faf6a45b04c24fab1d9b004d9d8d2781.npy +02871439-2a40f207dfd0d77727eecd8b185d6f50.npy +04401088-d2f3eb92a31649647c17b7a9bb17a24.npy +02691156-4c0f48d49805a37298a97ddfb532e08c.npy +02933112-a1daa27571e67bf7239d26686a11c3.npy +03211117-977da77136819715cf8a1b5af7e0bc1d.npy +03211117-b4386438057e85988bfba3df1f776207.npy +04090263-934fabb18c71373f1326f2506129299b.npy +04379243-4a9ded4f31e089129cd1fe76686a65.npy +04379243-2b0c16b26ebfb88f490ad276cd2af3a4.npy +02828884-abf250a01f526137a035c800c58595d9.npy +03001627-65ff1205a5f89150315ec3dc61760fd2.npy +03948459-ccda5c751d3feb951e824347c651d873.npy +02828884-4f44a4d47a8911c4f155d75bbf62b80.npy +02933112-7f60f68c48e67cfb422ac19d4a83319e.npy +03761084-af1e967283fa203110b42f6d9481f5b.npy +04379243-5b0d2362c82416695b903ba10d2ec446.npy +02747177-9f9c097de7167031cb2a965e75be701c.npy +03001627-23c4d774910c9ce03c832f0140db42bc.npy +03001627-2ca81da56f941624191c3762b497eca9.npy +04379243-871530f9e0ad4e2be6b70bffe12b936c.npy +02828884-d25262c74c8269a04c80535a28040aea.npy +04090263-43e2cd954ae1e3ed18bc22abef3f86ce.npy +03467517-32dae2a523aea5cbf9165190cf65b885.npy +02691156-98168c1772b769c0ea1bd6f2443b43e7.npy +04256520-ed151b7e31cf582ffe00f644e4f1521a.npy +02828884-b2b856a8e25eb566ad5067eac75a07f7.npy +03928116-7387007f9b6d551cab2c39e7de6e100e.npy +02958343-ac3f9387cd4319592a9eb0f146e94477.npy +04256520-aced3dd677d1e2c46ef340d5b029818a.npy +02828884-5121a485a7eebfec5674b1bb8d658d39.npy +04379243-70562998ddeecf5ff5816ac43b9e4b2b.npy +03691459-4d033564f0dcb412afac285245c66df0.npy +04256520-29065562beae791be069c558a1f154b2.npy +04379243-11c16f6a5fbedf4213c3458a0fe5598.npy +03636649-511917ee5ee2f91649244b68aadec703.npy +04530566-c4830136a2451f8f45aff212946058fc.npy +04379243-db5a895ae7358c97b66213207f46bee7.npy +04379243-e97b4992a642a13c789195d85b2f8718.npy +03325088-84c1ef3fc2a614deb362845c6edb57fc.npy +03337140-839996ad49bfe12aaee45fb27ad3a6fe.npy +03001627-a559b02ec38b9995c5fdf6b0c2c57721.npy +02933112-7227b96bff4e94a86f9e9f74beb7c348.npy +02691156-6615d159d2e250376969ef231a00a44b.npy +02876657-6d680415396d14d4d7c5502d4a22edf5.npy +04530566-404061915066692d89e410fd8930ae43.npy +03001627-bf1dce61ba47209189343fd44bd400d2.npy +03467517-1c8c6874c0cb9bc73429c1c21d77499d.npy +04090263-54fd9a41c1e7b94329d95b93a79ce1ab.npy +03797390-46955fddcc83a50f79b586547e543694.npy +03593526-be9bec33a4c5323a7d44dc16af152638.npy +04379243-e881a6fa6c3443ad5d28221e3b996124.npy +02992529-2ea4a3d502b12c61707fb0d61a11775f.npy +03624134-a996f7e1614e0c8e6c51785addc24406.npy +02946921-f4108f92f3f12f99e3ecb6fd6ed1dd90.npy +02924116-6a4a5125ed80513aa4667b5cc14ef4e7.npy +03001627-fd05e5d8fd82508e6d0a0d492005859c.npy +04090263-b13e4eef50c826a2fcf264b62ed090b6.npy +04256520-5b9919f927005de3b867e31860078994.npy +02828884-868d86e47bcf7c9d1dd03d3141d85a03.npy +03691459-d457ef805b078d037f5e8f62dd90fb59.npy +02924116-9171f8d3aed990fd1759ca9eefe0e251.npy +03001627-47cd848a5584867b1e8791c225564ae0.npy +03691459-55e58eac4a2e7f4c24abfaa350249967.npy +02958343-45c88ab8a670797a134736201a79843.npy +03467517-eaa2ff0101bbc4ac352b6518abcc1cc4.npy +02828884-7a4a9c948c54de261dee989d1177ef4e.npy +02946921-3703ada8cc31df4337b00c4c2fbe82aa.npy +02808440-1fb49b048e21c27344221bef0fa3c36b.npy +03001627-b59735c72cf9af0c17b431cae0dd70ed.npy +04379243-47315d244171ef7171a782a4379556c7.npy +03636649-66acf7f6883db6a377b9297f3055210.npy +03636649-963e6743370d5c5c9b5d51fa8cce1753.npy +04401088-3bc6f902628b3f7f85f6153ed2033a1c.npy +03001627-6ea4ccd680f3635b14038d588fd1342f.npy +02691156-49e9aa7ffa2b1a25e9d8a35d7a1fb08d.npy +02924116-92766794a46801bfe8784f880dac0f61.npy +03691459-62729cd3a4f7403f712b392cfc0c51c0.npy +02691156-1b3c6b2fbcf834cf62b600da24e0965.npy +03991062-cc5d178dbfa91919beedb4c8fd29e2d1.npy +03211117-1308ff4c4998cec02918c93bdb2b63e8.npy +02691156-4377ea17eb17fa79216b327569dd806e.npy +04379243-a5d5fc6b0bb7881419fb4103277a6b93.npy +03001627-8ec3459ab9fa3ce8738e43095496b061.npy +04530566-764ed516b7f5f7e16b74ad4a219e448d.npy +03790512-12ffd15dabd7e3b596b84415a3f1393b.npy +04004475-4f891a5300d8b10b55b46d261fe0021.npy +02958343-84bc3155bc5c95bfaaafd94b9f216ef6.npy +04099429-796073614ef36a40a336873d5d63a7d5.npy +03046257-a538df6d82a197dd95f577622f465c85.npy +02924116-b74ad95e6bfc346062845e894af87f76.npy +03001627-5d681a38c0de5545205884f75aba3a.npy +03991062-a7bf27af31391712cb2a965e75be701c.npy +03938244-3fca753458f2b44c283b00891f680579.npy +04379243-34feac86a178437527eb00c151c6f711.npy +04090263-3da01ac97bf8e71b12b38b1d99376c0b.npy +03636649-1facaa0eb35496fb69783ac218a8a2bf.npy +03325088-70cf2fcc591044323321831d2245cf06.npy +02942699-5d42d432ec71bfa1d5004b533b242ce6.npy +04468005-dc490f62c19246fb4d04aae9d29ba449.npy +04379243-e15d98f37565adbe650ec61be62e0cd4.npy +04379243-66e0abda60998bf61a96060575291b6a.npy +02843684-8a159ab6dc7b409cc211ff482a022b4d.npy +04090263-2068c2f0972d82e569f9dfaaa2301a49.npy +03790512-7c4fc3a05d5fc8b1d0f568c31c1cd62a.npy +02691156-2893dc61be63a8a16d0ff49003c479bc.npy +02808440-393484a5228413b777138b91927032b0.npy +03001627-460eef2b90867427d9fad8aba2c312b7.npy +04379243-14922c38b2cbfce6fa31c88352968918.npy +03991062-3152bd6fb7bf09d625ebd1cd0b422e32.npy +02691156-56ba815f883279b462b600da24e0965.npy +03046257-32197ef6ce095472e59f529cd1b6faa8.npy +03211117-36ac6a08317e2c618f533a7f52262bdd.npy +02828884-48a9e1be51e751eec4da326c9127fbbf.npy +02933112-6543e0c78675e6eb868fb986bc092533.npy +04090263-2d2f48b293f5ed5d40385522d1beeb20.npy +04256520-1a78f3397910037885f6153ed2033a1c.npy +02933112-c817934380830ccb4da5feafe6f1c8fc.npy +02958343-e6643b95e245410b8efc69f75162eba1.npy +04379243-684dd5cc9c642f98f2dc935ce0a740fa.npy +02958343-fc6f6309eefa5178590462ce3bd1e59f.npy +04256520-fcff900ce37820983f7e27638e63d848.npy +04090263-45a756b1fadf20c7dd0a2071dde26395.npy +03636649-73a4a5e3a27aa7fcb9f5f10496f09f56.npy +02958343-c06a5f0315b3784dcece4698ae3579cc.npy +02958343-81fad64b8fd8f010b17445a1c29f6d34.npy +04379243-c6d1d2f8261885abb2c2cd006d206129.npy +03948459-aec662fe0a40e53df4b175375c861e62.npy +04090263-384d3caade76bfbda84690bd684fe15a.npy +04379243-497659c4723fbc4fe90ff84c89de437.npy +02876657-fa452996a220dd49257c84a0e95a18b0.npy +04379243-385521a6e023307644fad574b043beb8.npy +03636649-6e913f0b67bb638288c10250d0e7fba1.npy +04379243-4b5536d2e9c5b9b7febad4f49b26ec52.npy +03761084-dd96916749ee3939e793cc5433bece89.npy +02691156-732ff6155a096fb0151f2df200a24ac.npy +02933112-8c60fe0d274ef76f6b983cbae7aad051.npy +03211117-fd19c9fe3d5e58549c4081063e213a15.npy +02828884-f934f89d094313362056b4bd5d870b47.npy +03001627-c62a17ea91815a7a492d9da2668ec34c.npy +02691156-94cb05b56b89aa2223895f8c849f85e.npy +03467517-e3378988d0aee759d48b953ad82bf595.npy +02958343-70048a705ad4363642db06daf723ec44.npy +04256520-62852049a9f049cca67a896eea47bc81.npy +04379243-3863d248581965c0f42980cb0dac8238.npy +04379243-d92354e060c98854b0ffd7a60ee2298f.npy +03001627-d8b189ddc0ca5b8c681404257d94ad9.npy +02773838-7565e6f425dd6d376d987ae9a225629c.npy +03001627-7fbdef802b9e160cc242632b2a8c3129.npy +03325088-7313e873a641411b979c556124bee033.npy +04256520-28b9e6b16443e183fcc04d1259a0af57.npy +02958343-107699ca67fcdf3fea999fe4ffdc2504.npy +04379243-757bd36fa1b0f3984b3c42e318f3affc.npy +03761084-7b53aa1ce95b1efd1773834ba0a5df02.npy +04379243-208903274bfe69cdc5d1c45cadcaa3eb.npy +03691459-cb904746fddde134b9e8bdc9c4a49aa2.npy +02924116-a3a75e027a5274261bd9a8f6e632e88.npy +03001627-759d66c5dcf1cabfb99d75d512b660d0.npy +03001627-7212f652dd37232a80360680c1602c7d.npy +03001627-7a5215c4f74afd1af7c7ad2549a1b15.npy +02691156-2980f6ac8412890548437f47a316427e.npy +02691156-618b433a97bc23acb1f09c4591ed2db9.npy +02691156-26950e05ed379413bbf3143b1cb6076a.npy +04256520-9cfeab8ccdb908a7ada629e23b16719.npy +04468005-5dd23b3d7247b98b4c3a35cee92bb95b.npy +02691156-aa21bf2a545e710cf68a010d0fc56333.npy +03046257-ed4815a2c0d6e641809222e4341a7d65.npy +03001627-2c7d258bd18de1c28f7b968097bdb0fd.npy +02958343-74b73c2cca45cf483c1d9add3a87bd2d.npy +04256520-26a6dd90bc8d6a0e227f59b6a8b64739.npy +02691156-3231fc366c6f4f3cca8607f540cc62ba.npy +04379243-bf6c171ab896774d2f95e2a1e9997b85.npy +04379243-e55dde3c1153ae5d7eb43b1b22d3185e.npy +04530566-a8daa7461ff94965c0be177939e290.npy +03211117-e6a0a8940246d5bf4e104a60eb91ab8a.npy +02691156-c88275e49bc23ee41af5817af570225e.npy +03691459-2aad0ff91e947e64baf402ca36cbac3b.npy +02691156-63c78352b218c01a995425f067333fd3.npy +04468005-ed66247c141a18936ef38ad304e9224b.npy +02924116-60c404b902c5680985718c281d7fdf61.npy +02958343-14121abc9e2a868e52ab7aae4be20d81.npy +04379243-5d4eec616095ed87dbe6f297e0ec0d5e.npy +02691156-a8c4288e4027e6a319ba010ddb4974fe.npy +02691156-790e9d3a9e037d3efa86938af3fa9595.npy +03211117-132df41128e6b43356fd3a55668db806.npy +02958343-c849164176944e08e39b6a0d304ab967.npy +02691156-6812a13a1a99f0da2f20ac99f64093d.npy +02924116-63cb99592744321415a7b5ba389301f1.npy +03636649-ec01e8b79f2d07df784a45ea6efa1d77.npy +03642806-b9eb4471432dbbc3e4b68d3b17c43658.npy +02933112-3076e5d4a8078a0c59350d819542ec7.npy +04379243-c6304f008d2a44f81943903831aa7f4d.npy +03001627-5539a4a9f2f1b45f3eec26c23f5bc80b.npy +02828884-14af4a9931635c75f4fb4dee5181bee.npy +03001627-81158ce36c90c319740641939c9d6dc9.npy +04379243-68a7bad2b06bc1a9d93768e7b9b1eabf.npy +04379243-3bcf1f68540a478de2680d1a8f76531.npy +04379243-f7921f51bcf7e93b24a15e3e5e0014a0.npy +03991062-f5ecf2549d458beebd4a7a372c75ee76.npy +04530566-c680824e615c772d18d5c097fe7ed300.npy +02958343-86c8a3137a716d70e742b0b5e87bec54.npy +03991062-1e42e5b37a46fd9c3202f7933a14e59b.npy +02933112-4ec97e83a1e9725c77a332e31ab74b68.npy +02691156-de001f9e2311dffb7209009cfb89d4bd.npy +02773838-5afca35479b347786f0abe366609662.npy +02876657-ee3ca78e36c6a7b2a367d39c852840d5.npy +04468005-3b8c505fd1127ed88f134472f61cf6bb.npy +04379243-9ad79b67c56ead5dc862eec8232fff1e.npy +04401088-bbd5005058f01a54909425bd531e6033.npy +04379243-2854c3a6724724dbf5561b9d69a2eca7.npy +02808440-79db8c9f8cac9aa680ecb974987586f7.npy +04554684-5bd6bf181544ca23c5d1eba75162ba.npy +03001627-5d20adaf6d8f89fa2f1c10544d7d6f.npy +04256520-af978eb2f903536e5b9e30b3558dc362.npy +02958343-dc8765720d8d3828b3cf5236f651a8e6.npy +02933112-46bb63196198ffa2fc98aa4b97627df6.npy +02691156-77410e47feee769deb1a0518c224975f.npy +04004475-a74db482402e533d9d23dd9e1ad481db.npy +02801938-e3bae8da192ab3d4a17ae19fa77775ff.npy +04401088-3f4a507d616678da650fb6b8f6bf3419.npy +03211117-767a4f06f66596a4d0e90ab6c6492cb4.npy +02808440-99c5407b80625a0c904e03fa15bd73ec.npy +03691459-6c1ab06a1ae2471e86bb0379a61a0978.npy +04379243-60ebae123ae653e2a4385667567ce9e5.npy +02828884-a06d35db2ddc85e29656036c096710ba.npy +03001627-cf391bbecf5926ecfe51dc4aedc63243.npy +04004475-132325926d85caa6d0c63a304a95442d.npy +03001627-59b45e83bf13e8e2374110224c1c4eb0.npy +04090263-6cf8bb50d1a8f0d7663e90eaf6b4ca52.npy +03642806-229f440bbd8f5482355323b019d9d87e.npy +02691156-d390f0246fd43cc8bd46d022fd7d80aa.npy +03467517-c0cf37064ca57ebd93f0194265a9746c.npy +03325088-f2a2ad135f62a8351875e8709de3862a.npy +03001627-d645bf9037e7dabda341228b21d337a9.npy +04090263-6e91124a4ecaa1a365564d9c2ed3b493.npy +04379243-98482492d4cd11698a40b9ddd9e5eea5.npy +04379243-78b4eb949311548236da5f8a6c22b2dd.npy +02691156-6d752b942618d6e38b424343280aeccb.npy +03691459-27415ac0b56e87528dfe57cb1b540899.npy +03691459-15e847b20d22d56cd288bc0586930768.npy +03636649-f330eebb153447181735ea0e092a805a.npy +02691156-98480ee19ba4dc93ef5f09964a6a1f97.npy +02958343-4eb276926f620fa831354a729b0d6b5c.npy +04379243-6d59cd216e896670b7562ed1f28478bf.npy +02958343-8498fb254e1669faaaafd94b9f216ef6.npy +02828884-a11caea04fcac4f5643a8f56e2ede6dc.npy +02808440-25e9f914f5c18b2b3321831d2245cf06.npy +04379243-3f9462d720929e73873bf2cf33e10943.npy +02871439-9e509b3774ee8c0a398c13334e998500.npy +02958343-5b423f02b76df0ec1472a7f3e4685aa.npy +03593526-31c50baef63a3cd0b64920759fcc80ba.npy +02871439-43731a6a4bd64ae5492d9da2668ec34c.npy +03691459-ab6b43b6529d6d6f9580f98cb259b96f.npy +03001627-4c775cfff4afba83b02c91492945da50.npy +03001627-76f2ead0035fdb2ff94d7e6d8577c8ff.npy +04090263-7816689726ed8bbfc92b24247435700c.npy +03467517-3338f59aefd2066f5b3335548350bdee.npy +02876657-5a1e624764af0205bf8b9d530de7a108.npy +03636649-57930764a16deae9b219dbeac7819b2b.npy +03001627-aa7489c9c7cd0c1dc3a1be62b60323a7.npy +03001627-c465b7ee24741eea9edd9a0b28d406e9.npy +03636649-a0dfc97cf85ddccdac42bdc1d2df4a3.npy +04379243-7bbd69e2b6e1bb49f7075cbf4d009544.npy +04256520-8701046c07327e3063f9008a349ae40b.npy +03991062-a8b41d9e570e2a8e7afd114af4bb7b4b.npy +03001627-2a0f4fe08cec3d25680876614ed35a7f.npy +04379243-1f64fc95a612c646ecb720bdac052a97.npy +04379243-b63ab8d3dd4eee098d95727c923f3722.npy +04379243-7d518c96a145547073ee7d53b833ad02.npy +02808440-4cb7d2c28ef5d4d854d7082b34825ef0.npy +04379243-fba0f822f16932aa10566a0096ed09d.npy +02933112-575d99ba4197caf041ba999b450870a8.npy +04256520-fef42356f1acb01b593ebeeedbff73b.npy +04379243-52e7aecf3ca3a0db391e4d6c585a697a.npy +04530566-fa18c9283443b67388fb22c0c1b2b173.npy +03001627-62aac1b94f2b98cb9f9a4edc4751ad63.npy +02958343-1355f3aa779b599b16abce8cb03e7794.npy +02992529-a1c60f087535c7726fde3adc6768fe52.npy +02691156-a097428376f298abd872dc56d048665c.npy +02828884-69f724fd745669fcda56795a6fbde1f.npy +02958343-380e0c29c9ea00e9ce158c6cc0278580.npy +04379243-731b2115d66fc850999b33727fe6db14.npy +04090263-d77515679ddbcd9c8064e4301e947b0d.npy +02828884-5ce845f80b1d407282dde982679cd879.npy +02958343-744f3661d9030c059cc32a851e7d6f32.npy +03691459-dcf84867f92cef75a9c2f34ef56404ef.npy +02808440-7a3541431dbfc5d6dbb76013b759885f.npy +04379243-ab463d43646bd5dcd27b31bdeb5f5c79.npy +02958343-bc75e8adfee9ad70bda733a39f84326d.npy +04256520-7f6c75c2d820337b69867582939a3cf7.npy +03710193-af6f76f4e447991b9d6be629f8f5773e.npy +02828884-852d65fcf7abec4a301cd89e7156530e.npy +04090263-f154291136c45c24545c558f9b86cc0e.npy +02933112-b60bf64c7402978555a060c097fa68cc.npy +04256520-6d74c6092567868b65d5de7b04a51b37.npy +04379243-330b4c2ab42bc715f1783a44a88d6274.npy +03790512-992fbae5178edcbc4e31d0cb4d7568.npy +04256520-bd5bc3e6189f6972eff42b9e13c388bc.npy +04379243-a70771fd3bf24d65c16bd6fd1b8c7eae.npy +04530566-df575767acf17d7188ca49762bf17cdc.npy +02992529-5b826c910108d27a684b810d277e0e9b.npy +02958343-180d1e3463c29355bda72093f9b5aa73.npy +02958343-50e986077b994d6aa848f24544821b25.npy +04379243-519c9687ede3906dccda8d28b44378b7.npy +02924116-ecd4e00fe0ce46dc5d3130ea1c8a44ad.npy +03001627-175e2a8cd6e9866ab37303b6dde16342.npy +02924116-f59a474f2ec175eb7cdba8f50ac8d46c.npy +03001627-a9eae610d9ab7c40a7d147d66b8f507d.npy +02691156-f0e7808ee55510be1a7dd57f67482196.npy +02828884-702428ed9e72d74456f6fc4b4ce1db04.npy +04379243-b659c2162c4ff214684b7bc3f8a9aa55.npy +04379243-ee5dda5cfc8349caad5067eac75a07f7.npy +04379243-df811f7a858750875634c21965ee6bab.npy +04379243-6fb986ed2a4db0c1bc7f8f77923d8ffa.npy +04256520-549f6b723e4bcc91e2cded16638068b.npy +02691156-f485dcbd466f217286774cad40dd456a.npy +04225987-aa886bed91a13113d5498a74ca9ca78b.npy +04379243-949e39403ab4fab37ade8e3ca8db8db3.npy +04379243-416af739e6ae8b2ca9e3e4940ed610e4.npy +02924116-e06db4bbcb51cc281f3f27ff04a4459b.npy +02958343-965000959c53a8612fdbcd3e1b829315.npy +03636649-61555024958cb5efe4e7668ba612f00.npy +02828884-fcfc935c2ff7c66c858699aaad4acee4.npy +04379243-3d929eab6abafbc5cf004563556ddb36.npy +04090263-9a5e20b8f1881145d735fa1ab17311ec.npy +02958343-be86ce7f7aec3ad4f9e07ddc212a2f71.npy +04379243-7d040b260fae0807a2d3cfe77a14b5f4.npy +04225987-994dc9307a0f228e30eaaf40a8a562c1.npy +03593526-3c148476c78123f3283b00891f680579.npy +03636649-302c3b1ea1a86a1ed2da3773f06dbf7.npy +04256520-71783c8431b28220593ebeeedbff73b.npy +02828884-50c0de8fb13d6421dbbc9440457e303e.npy +02691156-8cf06a71987992cf90a51833252023c7.npy +04379243-2da415184cca0aeb2063f99c33f5c49e.npy +03636649-7e5b5fa94575f873c2e0b170f2ad8bc.npy +04379243-f19fb80eae2ed668962a9d5e42f53a23.npy +04379243-15bab3d19de247cd9cd431573238602d.npy +04090263-70ec646e9929c7cb9a2ee232a197081e.npy +04090263-6d247b103dece20af500cc506a763c18.npy +04256520-65fce4b727c5df50e5f5c582d1bee164.npy +04379243-565ad2f2a4caf3429d297e74104d3ac3.npy +02933112-3167991b1c87967ac59350d819542ec7.npy +02933112-d347f6e236975a6b7c4767a4f4c46bba.npy +04090263-528bc52f211ff34ed2a72bb74eb549ff.npy +02958343-a3881c3f4e8c807f2a9eb0f146e94477.npy +03001627-c97f8f3d828173607301b41e73e277b0.npy +04379243-59fe91d51febd1f3c83a073fb943e852.npy +02747177-b9b1108520918039a47fdd008f2ae822.npy +04379243-265851637a59eb2f882f822c83877cbc.npy +04090263-1dc15b9574f88cb1fa9286f039319ff7.npy +04379243-59a1703cb9320c018f49a52c8d710d0f.npy +04090263-61a0bef6e9c5a01dfa6c79a0c671edcc.npy +02958343-1cd4a2c1b3b4a9661487189ebf835715.npy +04401088-ce62e8c8a75a501535c433f6b651ec89.npy +03001627-9e08476e458e21519fb4103277a6b93.npy +02992529-c7e4a425cebaa04bf9c8feac0b33491e.npy +03001627-33e28d560bf1bbcc32db3218111111ed.npy +03636649-8872dceb7ba9f34c140406de8e63ea3a.npy +03001627-7573185356240f5e2b4f3c9a4b815590.npy +04379243-164ec64e7a28c08b221ea40148177a97.npy +04379243-8e3524b6312f60738ac5263758737a81.npy +03928116-f90c23de385d10f62f5fb84eadb6c469.npy +04379243-19c5696d315c359dda90d20b69102dd.npy +02871439-625ee2fe616a92c8d706ecb3379aa341.npy +03001627-94f9fa9f8a20f7d040ef1c8b63a628f9.npy +04090263-e3f16aded8ea5a2fc79f92df566f8c6b.npy +03325088-2003d9e8ba083c4e2f066782346a992.npy +04530566-27bee532a7cbe5dbc4bd6e2ad0dc6de6.npy +02924116-148441ff0fd22c774d9ae46885a85f72.npy +04530566-fe482b5db6daa95f88e2183678696c9a.npy +03624134-57795189a634e21fa0f8e9a2d8ead2d5.npy +03636649-5254dbd4b24449edfcb8d8c6d4df8143.npy +03001627-9d0ec3530b39e89640f4518b250404ee.npy +02924116-cd6f59fdefeeb46273873da0bf53928f.npy +03624134-d6924db1f51953eecaecbfc7057f661f.npy +03001627-9c339d9fd8068f81351d9ca36f76b95.npy +02691156-d2daef39d1cb8d027089ddd41f4af842.npy +03001627-56300f790763af1a872860b02b1bf58.npy +04256520-2bb1b5865455b2b814513156cf2b8d0d.npy +02933112-45553c754e1132533fe047712e43e185.npy +03211117-b8db7ada8acd039a3406f1378b19168e.npy +03001627-e3d3b3e060ef84c93ed60220ff139f8a.npy +02958343-292f6606c6072b96715e04edb8af9c53.npy +04256520-bb31bd378273e437f4b35f4029eb1ecf.npy +04379243-d81df8f708d4360c5e05d85b12fbe60c.npy +03948459-194195123b03cae8912fbf9a0eb12fea.npy +04379243-2e71bc549eca25fdfebad4f49b26ec52.npy +03790512-655b9dd9425cc3a12a45a87054fa7272.npy +03593526-739f97be019f29f2da5969872c705114.npy +04090263-a759e6ddc0378dacfdb02ff6a9949154.npy +04379243-cff664776c56345a6c71cc363c51a922.npy +04256520-1c54ad94269d0e786abe5555a3b447d.npy +04379243-8db2878df7471c53e45ef4135c266a12.npy +02992529-e6cfa46780f8634de8d86c9b116d4e0c.npy +04401088-57632112a9128a16a82783081c89c0aa.npy +02691156-413a85d9cc7f19a8b6c3e7b944b34fa.npy +04379243-a767beea4085c58d301fa758e52a6264.npy +03636649-e120efa70ef8efa71ce05d96d33be415.npy +03001627-c6409b289ef9aa2176f028c3dd1719d5.npy +03001627-ca53f7ce3b6951ad3991f56363dff980.npy +03691459-384fbf785f1691d2d747b49524a1246e.npy +02691156-a9a7f21271b3efbaf446f92b52bbd82a.npy +03467517-e585e31db7568c4cf0e1c0df18936d05.npy +02691156-224a8b6776a242f8adcbeb54f3d014e9.npy +04379243-316021f1937b32c8e3e78c911e081c08.npy +02691156-de9564aeaa585a6ccbc790a63192d2ab.npy +03001627-e3e76d624f1f855bcc8a9c365968620.npy +02954340-13295f09e0e9e5d4a6e67635b9d1cee5.npy +04379243-490b186d11cf5675a872860b02b1bf58.npy +03001627-dcfd665cdc0b01e7b04cb542e2c50eb4.npy +02871439-c28297dff455c1d88abbce8b0b4c2d45.npy +04379243-951d129ced4e7d13cd4e8a27ff8b78cf.npy +04530566-73fd73a8bda002eae8d6be23f236225a.npy +04379243-7afb1812e86fac4f492d9da2668ec34c.npy +03593526-44878567a2cae5f8b5e1005644816d9f.npy +02691156-ad9059778f3e34ed4c3a35cee92bb95b.npy +04379243-ad92bfc65465091c48d90eef8384210.npy +03991062-408717256509036d44c183864792bc2b.npy +04379243-146ecd9d7712eb81e6c5cd45aa112726.npy +02828884-c8fa692760ba875848d791284650e46d.npy +04379243-ea9e7db452d2df55d42ec7e303174a87.npy +02924116-50866b5fd13389b4193d7855ecfc1bd3.npy +04530566-1f7f1d7c3882f638fb64f9487ce62dd2.npy +04379243-be5501adc4564d9edf30786b8faddb78.npy +03593526-a258544f4f27cb7fbbdc99ec57ef9c40.npy +02958343-7d59691881b13cc5702956de1b65c053.npy +04379243-d6c875f6b3fa82fd9aa3aca17bb25c50.npy +03001627-96cb0c919d3f379dd0a96520c31993ad.npy +03790512-f06b4f382bac9c9a5a6093c81238167a.npy +03928116-231a265be57b08cd521f9db09805b6c5.npy +02828884-8f6890cfdd98450f4f782ac57aea97b.npy +03001627-b654fef8eb98e99d65ba78ad9601cf1b.npy +03337140-334b5457151b0cc4492d9da2668ec34c.npy +04379243-2bbd62449b56abee659dda512294c744.npy +04256520-e6ecc4e6734f056855f9a00acc25f137.npy +04379243-2e990f9b5c2bb3098eb91f418e60b82e.npy +04256520-575876c91251e1923d6e282938a47f9e.npy +03691459-70acca9ae753b952c71de83a48ed3076.npy +04090263-bd48edaecaea23d65814fafedc6971c7.npy +03001627-ca23c31de817db9b67981fccd6325b88.npy +04256520-1f9cf65275610cff14038d588fd1342f.npy +02958343-42ccff0d88276152e341b5704aa568bd.npy +03001627-b6843e186082096ebf80985a99195eb8.npy +04330267-a9d6e7fa088ddf177fde87eb01f5851.npy +04090263-14139593048f806e79093d8935cfe4f0.npy +03928116-854ffe2c60091876e07a1c4b84dfd325.npy +03001627-8b52303e5ee47ac617ffa9a4ab48724c.npy +02876657-15787789482f045d8add95bf56d3d2fa.npy +02958343-504e8dbdccd8beea7e488037e176d2f0.npy +02958343-df1081dd18fa7bcd57d7020aed3513bb.npy +04090263-1fd98fb84317ae248cb94bbc7f05ffb7.npy +02924116-6d81decd46d9040741cefd10ce5d6cc0.npy +03211117-5c67f17ab9c9db50fcf74172442ff5b7.npy +03636649-e6c64600128ca2c176e9713f57a5fcb6.npy +03046257-86a053255fdd01266559ee74abc3e41.npy +03636649-22c24fc303fa5c8c48cef9d4cb5ab8c.npy +03467517-92fee1447bd437898ca72a94f8440a42.npy +03001627-9cf25518a8d3eecd9c48aa7bc7cbcce7.npy +04256520-78742b25c20ae244cf01bc59d215f0.npy +02828884-a37801a9289678201f8b303c0da5108d.npy +02773838-74c548ef3ca7b1987515e7bb7dba4019.npy +04379243-131bca5d855f49d428e3317d62e4ff40.npy +04530566-8db75d7703406e81e4f8f268ed99350e.npy +03636649-dc5e7460dff922246a44fdd49dec8069.npy +04256520-69f5626d5dda497c2af11d59b11e0199.npy +02828884-98de2d75e89789a7d301ec101065cf10.npy +02992529-54539e30a59cce413864ee650d9e9c5c.npy +03593526-5c55279aabef108425b2c60a44b454aa.npy +04379243-785e93009913379a79f7c71429a96cf8.npy +04401088-db89fa13b1c3c53afff0e9d5e9e3da5b.npy +04379243-7573bc5999555ad635e2fdf95cd06839.npy +04530566-9c19eacc8033da3698a97ddfb532e08c.npy +04090263-b577e94cb0a28f73e8152bb1bb6e4c3c.npy +02924116-b081d18ce7fc240241cefd10ce5d6cc0.npy +02818832-e7e05f20bbf738c47ba6f8f10959534c.npy +03624134-ee7ced71701c3e88b9e3f0d9deebf307.npy +03642806-3934cb69fe3584ef8f6cc6fefa15515a.npy +04530566-d24616fb070d105d3a10f0b86a89bfc3.npy +03211117-c257e38f51bb660447de0ecdff019da9.npy +02691156-b76c6ef211d627efac8c46f8a114a34b.npy +02691156-b9006dadc7ae7f7d21afc48d963f897.npy +02828884-c069553c08631597cb2a965e75be701c.npy +02933112-b3328bd358d7ace07c68e936cd219e1b.npy +03001627-9c563031f09dc2459a87002a4eeaf610.npy +03691459-a6fe968066893c10faa3b42d05e08ac2.npy +03636649-5c25916b55fbe4ca29695ec09b98af5.npy +03001627-fe5310a3457bf0e5c4e8952b27b5f370.npy +02808440-a03a2f92431e190591a491e8257bd6fe.npy +02691156-f009f3112625ee00b8cf782e8c539948.npy +02876657-9da48acd8046be50307e049494951dab.npy +04256520-40f6e30804ff4aae20125f039fb4c8e.npy +03593526-25d459836c571e1e6e130a30b5ed875.npy +04330267-bda8c00b62528346ad8a0ee9b106700e.npy +04090263-419226b09e44e5bf8c8cac88a8c48208.npy +04379243-97e3768e85c686f9601bea3dca268229.npy +02958343-49a114b29a54300e51a95aaa6caba1d3.npy +03636649-d49a8626a9eb5ac2553bbd6d743ae8f6.npy +03636649-c8f5bf57a3215cbe9a6c869309041adb.npy +04379243-622e30a7ccf34ed5b64a7c8189aa3893.npy +04379243-8ea7ca2c8b48eb68ab610b0c94236463.npy +03001627-1b5fc54e45c8768490ad276cd2af3a4.npy +03001627-d6da5457b0682e24696b74614952b2d0.npy +04530566-b5d1a551525c6b7876ed13a8bcf33762.npy +02924116-ea5b5c44f4e0cd7ab06dffea8c2baf8.npy +03325088-e452db5f61ea4593321831d2245cf06.npy +02958343-2ef61a1083304211d27be7764701cfe.npy +04256520-5560a425c597eacbff841fc99bb16039.npy +03928116-3fc831f0c69c981048d189f942cedc62.npy +02801938-ab6e1ccf0f35228416fdce62f5c06e29.npy +04401088-45e907ca47e0122c1752adf979b66914.npy +04379243-2a48b2cc3a5b7da6833b2489037ae4d9.npy +04460130-76377cf0dc70d027e7abbab3021b6409.npy +04090263-6d88bd6c04bd5bb01a18bc096aeb4c21.npy +02876657-e7818a94d20fd8e1a4136492f17b9a59.npy +04256520-4e1ee66994a95492f2543b208c9ee8e2.npy +02828884-b2596a0e14772bbad5067eac75a07f7.npy +04330267-6fe99039481ce154c13f6e8e2f6bde6.npy +04379243-977787b51140f4bba100d1443e9d6b3a.npy +03642806-4f3575df3821e08c466909b3e9553909.npy +04379243-2d90a1998eca8778dcfcef693e7ec696.npy +02958343-828c32ae594a5409b1bb46d2556ba67d.npy +03001627-bb4868c1026c04fd7df0e9a69c97c97d.npy +04256520-1e4eb3bad18b75f23d6e282938a47f9e.npy +04401088-e6cfa46780f8634de8d86c9b116d4e0c.npy +03691459-8a5cdc3bf1ed6226b7b1e717b48d88bf.npy +04401088-80243e34f66a503bea95e61f66327e28.npy +04379243-1bf71e2f8abc7698b232f4221eaa5610.npy +04256520-909ea8e0e2728ced59f8e31ca87c470e.npy +04379243-9ec420c3155ef5af707cdefe012d0353.npy +04090263-b5aff534c7df4d86f06f0427d3aa3395.npy +02691156-398fc0e717b0cd524c3a35cee92bb95b.npy +04379243-7b22287c9a2ad418b9deee229eae6efa.npy +03001627-52d41eb69bb764e784aeb682b234df80.npy +03991062-b9126c3c945b19b7a2c59a4d90e63212.npy +04256520-9389ec8dd802a1fa7d7598e07139ebfb.npy +04401088-205b1494d7d3448e21844676433a0aca.npy +03624134-28d99b90d09e4205744848276b011f94.npy +04401088-67baf038e83456967f521a3dcd28e9d2.npy +02691156-5024341275a685bdecff69852469d7e3.npy +04379243-1950a6b5594160d39453d57bf9ae92b2.npy +04256520-1662f76e3762fc92413102507b68bcb5.npy +04401088-ebb6035bab99c3e221844676433a0aca.npy +04530566-e8b19c46e5beb3823b12275bdb30c153.npy +02691156-106dfe858cb8fbc2afc6b80d80a265ab.npy +03991062-496e747582bf5e7187abf842aa6d3bf6.npy +03001627-76919a456a23b9779368d1198f406e7.npy +03046257-4fea2346a95ff9fa97e30bfe57d923fb.npy +04554684-cf13890b1cead267be96d0229f49fd6a.npy +02958343-d6dab47acb946364f0cf9a4b3162f487.npy +03001627-223d0330466ac6bff7628281ecb18112.npy +04379243-7062f5b229674ab7b0b54dd2cf2a35d4.npy +03325088-a8ff57bb496e582ac36fb70296e45483.npy +03797390-1bc5d303ff4d6e7e1113901b72a68e7c.npy +03991062-a042621b3378bc18a2c59a4d90e63212.npy +04530566-f582d2315b6182ec6f6b59ea659e8324.npy +04090263-2f0c7483f4eacbf1c03d8e9f14212b58.npy +03207941-401ceb30354af54d20192a5319e3e2e4.npy +02958343-2c8e9ff5fd58ff3fcd046ccc4d5c3da2.npy +02691156-679d4f84caa5a1a8f019a51d1a3b2e07.npy +04379243-382b49301bbd3d707d6dfba3e792b660.npy +04379243-9d8f0444a8c09adff0d4c8f4dd125299.npy +03001627-cd4fa15a13d7448a14038d588fd1342f.npy +03337140-4374f1908ef835b1b25f5f33b0704a5d.npy +04530566-2f004ec4a719d231e513e51a78e5ea1b.npy +02933112-8e7dcefda14362f866f6836074ef23fa.npy +04379243-3ed500a12dfa511ba6040757a0125a99.npy +02828884-48ea3558db137e87ad5067eac75a07f7.npy +03325088-891944c98c72a487c36fb70296e45483.npy +04225987-97f85bc59f09a9f455c660e6cd8e92b.npy +02958343-6e76975ba073f2a89ba83e6d08a84f26.npy +03691459-374df728f54322363b0edb55efd49670.npy +04530566-cfb1882ac34b81d8a357368f9af15b34.npy +02691156-e49d1e1d176ec1dfbc0909d98a1ff2b4.npy +02871439-7b17701391dcaa7bd2473c216962c0f3.npy +04090263-2680233498fe409060c049bb6fb2fb09.npy +04401088-68918effca4b9becf3434ae1311a0329.npy +02828884-722f3510b849c950beedb4c8fd29e2d1.npy +02958343-e0f1de19f0f65ce09123224ebaa118d3.npy +03001627-c5afaadb73323de9645a86b04c64b372.npy +04090263-144201418b5dccef1a857c47fd0ecdc3.npy +04256520-fee8e1e0161f69b0db039d8689a74349.npy +03593526-5bffbd5a0ca14f342f841233486fac2b.npy +02691156-847bfe2bea87c55b2d49d91e9a282aa0.npy +04256520-1c756525061c4b0b4f3443b22038d340.npy +02691156-a281b2664e7e5b2fad9d7d48f3cddb17.npy +04468005-feb23a40a79ba13c9f97ca916781e800.npy +04256520-27c82d27a4d38e6f41b160b9adc112fd.npy +03001627-8cf71cf6f0bf6bb2b5af95b2c842e5a7.npy +03691459-181d03027d30429dced68ac20944148.npy +02958343-703bd04475fc330d59139efcde1fedcb.npy +04379243-b70eeabec7fd454581960a3202db094d.npy +02747177-ad0bba7ced79b52fad5067eac75a07f7.npy +04379243-26a28d973e40648db40f0ac0fb9a650d.npy +04256520-95c1e7d85da0497fc1a61b0a501d38f.npy +02958343-46a71fe0e651986fcfd826dd468a5497.npy +03001627-380a5345fda8e97492d9da2668ec34c.npy +04256520-3d7301760bbf315f3598efd14e493d5.npy +03636649-9464e80554bbd3de030fd2fa0608452.npy +04379243-f3775c07e5ba9515d6944324b21393b5.npy +03001627-35e8b034d84f60cb4d226702c1bfe9e2.npy +03636649-7264167cae71c90c72bce768f6d2af1c.npy +02924116-639822a6db5ec3d852470de2774d6099.npy +02691156-a4d75675f0f871c96466a07aedd68378.npy +02880940-db180e4f9a75ae717ba6f8f10959534c.npy +02958343-f76b9a9455b20cd875a45359f7e88a3d.npy +04090263-d109693d2d43e65b6ed5eb4c1d0d366c.npy +03001627-40020a5e90c75d94a93412f1b60e6fba.npy +03467517-4a15c0df0f02a9d840c20797381ee39f.npy +03948459-d965eb9091d180245f91354f947d2313.npy +04256520-b5eabf007a57d863a35a7666f0cfa5bb.npy +03001627-be38dc611c4bdef7f1cdfc0a8f38f2e.npy +04256520-934cbc4617c6a6f4b001e9ae2ac46c17.npy +04379243-178703fe974f63e9c3bd24f986301745.npy +02924116-66b963a73fc2c9b2f3f21609a16d7ba6.npy +03948459-286ed45d14215f6e2219667ae51f9fa.npy +04530566-7b0ed74742d27ff3ccc6f1de97150965.npy +02871439-53f91b5f850b5bdc2bec9713eaa8c4ae.npy +04256520-39f5e0c179377860d3eab83c82350281.npy +02828884-19bb2f65f3de8f5fbdc7943e19c9bdf7.npy +04256520-9900929c21330dacfebad4f49b26ec52.npy +02958343-6ea4111bb47039b3d1de96b5c1ba002d.npy +02933112-2544d05396cf1c91bc19762eaa7ba40f.npy +02876657-d5dd0b4d16d2b6808bda158eedb63a62.npy +04379243-136f3b0a4893cadf4f1b88c70d074e4a.npy +03691459-39c641a818474a46e10cf62a02f1a100.npy +02958343-63a4e46bbbd855fc2b63d3b2a8c4e8b.npy +04256520-40a6a3ef4e4e4c4c300703f05f8ccc25.npy +04379243-daa9e908b5aafc2fcce90f0d61ed7a70.npy +02691156-af696fc30a96a0c8bc0909d98a1ff2b4.npy +03001627-a5898fefb1733333a82b0d8d157287f5.npy +03001627-31d48d6b3951ea8e1191025061735ea3.npy +03790512-18f5c9d827522c859cfdf97abe35029d.npy +04530566-18a8a4aaf68d294f800a0120f3e757a2.npy +04530566-a431fbb7e58ef0c46c03c11657c96c60.npy +04379243-55a3fb19f099a06adc061043e7c712.npy +02828884-af79d505f2ef2223cb2a965e75be701c.npy +04090263-fd927e1258969e1ada4044967c19cf99.npy +04330267-41d11126029f5b98e793cc5433bece89.npy +04225987-5fba47ad66c45cd113314092564c13fd.npy +02691156-34e87dd1c4922f7d48a263e43962eb7.npy +04379243-91f6f0813eaf4e52707cdefe012d0353.npy +03761084-d713865a94c8229575f4e5007488531.npy +04468005-19daec6f2602f9c0dc14ba0818ee5cec.npy +02958343-b6bcc1b1ccbf0ea0996e71cb10be68ac.npy +04379243-30c9865cfc4294a7ad16260d4d73b56.npy +04256520-54215008a46fdb714386ad145fa8aba9.npy +03001627-bae3e35109b939cfe7c7920f6a65a54d.npy +02958343-3f6e9baa4657276f97df6383472cc5b6.npy +04379243-ba34c92a41a9ac9f20d3c05c08e26f.npy +03001627-35f83268d4280532dc89a28b5e6678e0.npy +03001627-5d959b0f79a22e8c67c9124d122355ab.npy +02933112-7cb7d54954caa7a2d3cedcecf1ed3b27.npy +03636649-284986b4c72d624abd73284bc3c3cbac.npy +03211117-ebc62d2dac989b7d8b71a158ed504795.npy +03211117-58fceeffe91b7b1c20685b5a7e34b501.npy +04256520-4f0d2de3a60f247662d15c83b2279a53.npy +02818832-9860944cfd30a13dc3bd24f986301745.npy +02933112-23b7a3961eda17df4da5feafe6f1c8fc.npy +03928116-c57408045e96f5d5b249ce9318fa571.npy +04379243-a5cbc0a86cdd01bd348f8ec207893cce.npy +02876657-7467b9892496a83fbf8b9d530de7a108.npy +04090263-18a1fb21c8c1c18f4dbc4096bca262f3.npy +03593526-c4ac6a5f651d12c6c6b4aaa0b0f9d794.npy +02691156-bbd8e6b06d8906d5eccd82bb51193a7f.npy +04401088-4f2919438ca46d8de8d8ad3bdef6aca2.npy +03001627-22b40d884de52ca3387379bbd607d69e.npy +02691156-917694a71164f2148e8405d6c51a908.npy +02958343-6c85bbbbbea160bd81bcd6355b440fd5.npy +03001627-3cf6db91f872d26c222659d33fd79709.npy +03636649-53685a90516a12c5f51fa0238791f5dc.npy +03001627-5cf55d9c3a3c7907489452a0032ea575.npy +03325088-78c5c2aee9ae697b3321831d2245cf06.npy +02691156-e777a6a46ae240a7bd46d022fd7d80aa.npy +04074963-8e167ac56b1a437017d17fdfb5740281.npy +04090263-736200c1ac8d1c34c14cbe2c343fa431.npy +03211117-17226b72d812ce47272b806070e7941c.npy +03642806-2c61f0ba3236fe356dae27c417fa89b.npy +04090263-7ca37968914be27d82b2a307d22750bd.npy +02828884-e66730e74570d0016e90d42867af9dbd.npy +04090263-ae57975d9461b324d10b86bd6e8bbc34.npy +03001627-f497cbcc4895d5386b684500e5db87c2.npy +02691156-75e9e2d6970f5ee71927c29d6faf370a.npy +03513137-9cdf5e674bf943bf69ed2daa3338779.npy +02992529-cf0dc63412541764cf9d394118de0d0.npy +04379243-26dc6dbcf6b36278ed4893d5d6c77f16.npy +02691156-317ac4d5ff597c9ae719b5362fe06bbb.npy +04379243-94672a37947da258f70bf5700b78659f.npy +04379243-b59753a2c0751e7f37251258858a7a58.npy +04379243-a05d8e55e329df41ca2ed12df13a916a.npy +02933112-37d41aa1ab8e7318534f016fc3878f48.npy +02958343-6d493677c8dfb9d8321338b7ef756ea5.npy +04379243-6d67f5a9d2daec3467ca2ad6571afff.npy +03211117-30e739ed4c65f67ab71158027becbea8.npy +03325088-876f08c390a7528ac36fb70296e45483.npy +04460130-3a1e36329722686c2c406efbeb1811b0.npy +04530566-3f3043e275bac07a6f315eca7454150f.npy +04530566-ea491bbee7524859cfea3d4fc15719ea.npy +03261776-bb2ea6e44847055d59a6208793b9dfca.npy +02876657-d9aee510fd5e8afb93fb5c975e8de2b7.npy +03991062-fe438d5b6303da859f9892433e1b1f4.npy +03001627-6e98c5d61e008b4c2871cc0b3cc1a485.npy +04379243-d1807006e89f9e7c3087f84b199fd297.npy +04379243-dddd611b4262ede6e3b9db784be35882.npy +04379243-32d832455878ef581bf2b66b52bf6885.npy +02691156-e36ce61195489a56c8da6d3458daff84.npy +02691156-bb7d526405e9347b8f6810e1a2b6aa04.npy +02691156-124062ccaeae95085e9e2656aff7dd5b.npy +02924116-7bb582b2e2a587d8481aa8b5531c68a9.npy +02958343-6b2766e55b6de7779d34b5c385de0e34.npy +02691156-ca359fd1ed701d06f119374ee5d5f944.npy +02942699-ee58b922bd93d01be4f112f1b3124b84.npy +03001627-d0a3e48a84f68a9143dbb6421d614c0d.npy +04379243-a0d2754011acdcc9d8a0e410093d6619.npy +02958343-a88c4427e1f0e871d7755e7baabe8a6f.npy +03207941-fba77111f045a448fad3c648a4e3c1dd.npy +03691459-9f43d3116f4162fdce029fab54b6cfbd.npy +02828884-9edc26b719dfbd49121811fcf3127a22.npy +04379243-87c49d4ca6b740d5275d003e423c59ba.npy +02958343-d1dcddb5b1d7404dd9b0c189eb588ce6.npy +02691156-7628e525228e5a2d9a46ec065c01b381.npy +02691156-f8d8b590a0dcd399718ac2a6ddb54499.npy +03001627-5043b2deab10560fc458ea4eb61fea2b.npy +02828884-d9479cb37b782ce5b714422ef873ad34.npy +02691156-7ae99c0cc14cdd97408827f71d73e45a.npy +03797390-37f56901a07da69dac6b8e58caf61f95.npy +04379243-821e6d43a82eadfe8818864c19a17b87.npy +02958343-59c662d403a108d47074a72a1ea2aef2.npy +03211117-db4de4095a962680c951cf8670bfff6.npy +03046257-5c9012a6af482ce01050b055aafa6fb8.npy +03001627-c658d1006595797e301c83e03ee59295.npy +04256520-1685b0cf2d1a2849d0a2ef258a9c71d6.npy +04090263-82c3357fcd007893d17373579e6fd9be.npy +03636649-941271c5d9b192eaccd8f9b9403fd602.npy +04379243-c9ad9501c31fae5c71a782a4379556c7.npy +02933112-93eaa414c043264910a7acb23a71a618.npy +02880940-4845731dbf7522b07492cbf7d8bec255.npy +02924116-93e1e926b47c010c861a6907a2829b07.npy +03001627-87e11c9e61442510b21450114b9ae3a.npy +04379243-604efea445d3f3ab6d322cb027df34ad.npy +03691459-2cb180d4322b8ee9c0d2bd04416ef7c.npy +03001627-66b7533af3449aa820b64028d2efc877.npy +03001627-bd6bc40b3327e5109501f2fa226917d0.npy +02958343-1c4590ebc214e029816bd8f64e08b2bc.npy +03636649-f77abf171ff5968720331d4c3b7d944e.npy +02933112-1ded292e60cf7f11178e7d331e641179.npy +04379243-86996ef1ba6aeacc64558a1c6a2a9f11.npy +04256520-b3fbac6ffe8e00622f6acf89a420ef0c.npy +03991062-e72ed3e25469c682a391a8379ceb19bc.npy +03991062-db9eea0b856faed772652f4081ec5a77.npy +04090263-89a5c8583b2e2306af646833cc36618e.npy +02691156-882b5868ee1382ab1608512333cae245.npy +03001627-3e1a5042dcff313971a782a4379556c7.npy +02691156-541ad6a69f87b134f4c1adce71073351.npy +02691156-ad66ece988a63911643ae903098a314.npy +03207941-1418f648e32f1921df3a1b0d597ce76e.npy +03593526-1666ce5ced647ed25d878ba9ec3c0d6a.npy +04379243-1d42f42755aa3a87b2644d7d4d7ea2c7.npy +02924116-8bf720e46c7f3dc2d27ba3fc43e70958.npy +03593526-434351669b58f5bd438d8caa9ae106fa.npy +02876657-c5032e4be091aabb36fe7a88df793982.npy +04379243-f7e7473775d8c3f3f51fa0238791f5dc.npy +04379243-87dc5ace74ed29fafe43ff1e45af424d.npy +03001627-780b18643b4cdd991df85a93cb67ce5f.npy +04256520-e809c16325be020c795085b4d203932.npy +02933112-b1d8cd17d6c936392caaf8842dbb8ac2.npy +03001627-5eb67ecc35e39eb59753496ba23f2183.npy +03001627-5fa533f71e7e041efebad4f49b26ec52.npy +04379243-42496cee03df8154ac2b62da1791c2b6.npy +04256520-cef25c3f7412814b4b3c42e318f3affc.npy +03046257-e23d73e264608468b5e1005644816d9f.npy +03001627-bf557411c41d07bbb38821f893bc10f9.npy +02958343-f3e467dba61ebb972a84c9dfab949065.npy +04099429-4936716925b1cd6428eba1f0b7744e9.npy +04379243-d6dbb647d85df780615b3e12f53b391d.npy +03691459-137c1194efbdcc1bfa0892265dbce8fd.npy +03046257-929afe0b3ad23608c7b37fe5d21f2385.npy +02876657-c13219fac28e722edd6a2f6a8ecad52d.npy +02876657-7565e6eeee63174757354938178674b.npy +03001627-c2220851bf50eda931ecc34700496180.npy +03938244-d777679b4dd35c76a4136492f17b9a59.npy +02828884-8f824b462a2870fd98e0d1738edd4f19.npy +04530566-93285afc55afb00f6bad0887a204b994.npy +04401088-6693fcd81ce5a4e6f5d789e33b735c9e.npy +02691156-2c1fff0653854166e7a636089598229.npy +04379243-7f5a875b5a2811b07d2313b9cd9e2952.npy +03001627-d4326cd55ed8333f6a059e1fc701f06.npy +03710193-445e18f9f2e42da4e911be944cb8c454.npy +02691156-3c2986906532a1c8cc36f752df32539d.npy +02958343-1f5a6d3c74f32053b6163196882ac0ca.npy +02880940-ab2fd38fc4f37cce86bbb74f0f607cdd.npy +02871439-81b8784259e3331f94cdfc338037bd95.npy +02958343-8bf2d0d0b01f6476c3fe7930fce05ded.npy +04379243-6aae683be40c3a9610c2a68437007d6.npy +02958343-7c13a71834d2b97687cc3b689b9b258d.npy +03001627-2ab4b8a3fe51d2ba1b17743c18fb63dc.npy +02958343-70899bf99412a69db38722563212fa4b.npy +03691459-76cb5a9b7b8dbea99b590f104a4a4c1d.npy +03636649-5614d1c24806ce0a8d1fe8cdc415f4c5.npy +04256520-42ebf2d478ab8af85ac3e286c38c6d66.npy +02958343-783f141774ea26e259d587c4b86a22ea.npy +03211117-44651d91ab8b2851fbff60ddd047b071.npy +03691459-aed2ee05cf37c85c9a8c31231dd99d82.npy +03991062-b4caefc750ad7f9723500a5b036df62e.npy +04379243-56fcca11e3d3a920c1702e8e8263bbd3.npy +03001627-a0c17b34d677907e1f98c0761af40e04.npy +02691156-d722973c75c85d93d0734afa0d357999.npy +02691156-a96c1589731b06a1efbd0f357ff7c40a.npy +03001627-4702e6196503ff84f1c0e03f321d0b20.npy +04379243-d3469cb008d98844902c0a1a69e25bd9.npy +04530566-59a363d3852757572b249fd16295bbfb.npy +03691459-4383b2bbce729356a9c2f34ef56404ef.npy +02876657-73632ddb4a5684503594b3be653e6bff.npy +04530566-2507ed5c9eb161569a704df179502ac7.npy +04379243-acafaecee00323af7ff6ace05b36a5.npy +03636649-e0a2948797cc33b2e19a0cc107ada7cd.npy +04530566-9043c404e310864cd5dfe0108665de88.npy +03001627-6ffbc6f14a7257caffa41024c63fa9db.npy +04379243-e9bbdfed8a39f4cbcb2a965e75be701c.npy +03991062-5b0f71dfbdc8089ca2c59a4d90e63212.npy +04379243-fe0e7198411fc340c057222d6d091c56.npy +02871439-1b35d8bb3a01668f6fa63795f94c4d8c.npy +03948459-383ed236166980209e23d6b6aa619041.npy +03001627-d0782d2afef19adf4733824eae5cd9ae.npy +03001627-bc722985df07090d51c4deb11af7079e.npy +04379243-a5cad9ba5e73ef239b11da89c22111dd.npy +03467517-709a1592b28e8c16489afeb4f07ae3cc.npy +03691459-e7af5657b90b9a73558880eed6ddb84a.npy +03761084-624edb4561b948c1374efba5c7752da1.npy +04256520-df912366bccfcc0258db0ef36af1d3c5.npy +02828884-319c099e8df5fcae2056b4bd5d870b47.npy +02828884-137c82020b8dc458eafa2f074f6cbe37.npy +04379243-98bba4f6837ece036c18e23645ff9868.npy +02958343-9abfdc63aa88be60733269057ed164db.npy +04379243-9098e2c564337b01bde1c279d540fc66.npy +04401088-f9bc179b45d2e5ffc55273be8e22f2c.npy +02808440-398f7f2f78f8794686ecff2582325794.npy +04256520-f12c92ab5f422c07fe5adaeab9475bc5.npy +04379243-51cef4b98624473e193a311b8faf4ace.npy +04379243-d15d37d902d2b8494ca386b8f1ce4c62.npy +04401088-35f584cf8fd22794e4b68d3b17c43658.npy +02958343-5d8476a9aecbbe1e9ec9fbf723f60ac0.npy +02958343-359841936db476cc8cf4cf458d5ff7b.npy +03636649-e94643bd9c777491d49b2e04785f8492.npy +04379243-813d34995b5c4406b65b71636c46ae49.npy +03211117-6fcbee5937d1cf28e5dbcc9343304f4a.npy +04379243-5649e478e7ef25c4490ad276cd2af3a4.npy +02828884-a4491b4a67356be5184c1614f4105c8b.npy +02828884-258a52f3077d3ed56c342cf382162bc7.npy +02933112-920b27c2d3c83a0c59350d819542ec7.npy +04379243-4987ccbc34697b446385bd4c1a835150.npy +02958343-513e2ad82336f56bc0e3666c7d0ec7d0.npy +04379243-5b69a60d7b980b134671d97b0fd17f51.npy +04090263-89f4f2458aa64d94daf2e4c786df29a1.npy +02933112-e3f3d58fe3cd9746a485daf2a997e28.npy +03001627-8cb34663a9e42f95c3bd24f986301745.npy +04379243-e0b333381b21780495e29b6e21e8c291.npy +03325088-c3bb910a7c423f8aa21506405d3c8c76.npy +02691156-97c12e6155fdf8ca90baeef8ba5b93e5.npy +02958343-cf698011f90ac05f253c03b7df20edd5.npy +03759954-e596111d27ca09f043a6722dac94523b.npy +02808440-f7e08b485c7e64bc1fc68ad6ef71f41e.npy +03001627-9961b26d1eb9170e98e0d1738edd4f19.npy +02880940-b007af6eabaa290dd42b9650f19dd425.npy +04379243-ae8f31ba66709b8278cd7885232df677.npy +03467517-64205848fba5d7f74fdc524a49e62393.npy +04090263-bca09e37935082a925ff9d2d1e4772c3.npy +04379243-6b8e579c5178d3e117b431cae0dd70ed.npy +02691156-6baefb84d6e12a0c6bdb424f4ee7ff8b.npy +03046257-5bbaf43f2f86ba638b33d3087add7a4c.npy +04256520-91839305f25521a3fa5b6212657ae4a4.npy +03046257-d5f08d4df09a74b327390fc4fd3ec0cb.npy +04379243-a11b3450e77331367948cb8e1d9ee487.npy +04379243-99686d07d8ced954490ad276cd2af3a4.npy +04090263-5f2f4771bf59c3a32edc45348090e195.npy +02933112-1f6d5268afb826c38b424343280aeccb.npy +03642806-5458437965b3d5da2462e129dafd29fb.npy +03691459-a690234747bb56ceb4767ab55965ebbb.npy +04530566-556a76a5d29e124635952e349f57d.npy +02691156-d4cc520929730248642fa8402286a797.npy +04090263-4b6647ba7664a03198467494eaaa2f8.npy +04379243-97551108bbb5afc36199d6fe090be061.npy +04379243-cca7e05c69a5d8e0a3056fa1e8da3997.npy +03691459-b526ef9f77ce64d398ed31a2f734ab49.npy +02992529-52a81d42c352a903a0eb5a85db887292.npy +03001627-d6f2d44c693d2e857062f2d72cde5c95.npy +04256520-6905206d5f2ac04bd9e0690b0b191.npy +02958343-d4434de782382a47a7e7e5ea49ad8e45.npy +02958343-51f4aebb148459a45fae7711b4095f8.npy +02691156-5f46b24028db58f490baeef8ba5b93e5.npy +03928116-a56bbdcb466fbe47472f0eaae2165f9.npy +04379243-8cc8e16280748c3823fe3501bb9e7193.npy +04530566-99f00898c6b373d5eb2c303a0e0d287b.npy +04256520-8904f205681acc62dd8a663469942954.npy +03001627-e388792a151735e57597e1f94410131a.npy +02933112-cd251287fd34d7e0e3f7a74e12a274ef.npy +04379243-681ee7768f9fa9072c5d34a902e568f9.npy +04530566-70f91186bb61208c56988d12ecb12e06.npy +04256520-86d2aa8a80fd9f38dcdd187a6a5d68ad.npy +04379243-30de7eb171cb381f99e8bf807e902261.npy +02691156-9fb60716f0f5a2b84408eb298433d643.npy +03691459-96904b01dbfa0d0c5865090ad6b0dfd2.npy +03797390-f7d776fd68b126f23b67070c4a034f08.npy +02946921-af444e72a44e6db153c22afefaf6f2a4.npy +04401088-37846d5854ef7da646e4b9487666a2f7.npy +04379243-ea60ea168f766580617092ec6e36103f.npy +03001627-115b11a77b8d8c3c110a27d1d78196.npy +04379243-54b26954e478b1a34ea8d5f5f27d7ce3.npy +02958343-2df4b1797723b140419bf2f84339ec5c.npy +04379243-3c7cf00cd78adaef4b3c42e318f3affc.npy +04256520-6db11b763b7c3e76fd5b2dc3df6521d5.npy +03001627-c605d4742f68a00ece45069973024eb1.npy +04530566-79a13d8bffa87b8ba8ae9698506bed5.npy +04379243-335c2e4c3991768218ed1f44219ab7b1.npy +04090263-19e16b7050b25507d43bb185feff0470.npy +04379243-e724ee5c326ecb9659db00799f9936b2.npy +02958343-d72ffa185738bccd10b75223b5be6dbb.npy +04379243-47a381f4ed3d30614187eeeb0dea4986.npy +04379243-aa54c2e6850253ffe08dd63aa50202d.npy +04256520-ece6da595e7754b3eb0f7c4d37fcbed7.npy +03001627-df8374d8f3563be8f1783a44a88d6274.npy +03001627-3a8b5f5a627bb2e199b439fff97886d6.npy +03325088-30316a92178da5683321831d2245cf06.npy +02808440-47b337a43af4d557b8724a732b3d4cc1.npy +04256520-99d036d409c1fc366f12b402757e5b72.npy +02691156-c494f446954523a8a32748a9f843a0bf.npy +02958343-936702a0367e95185b03bc28c642bc.npy +03001627-63e6c50e5435e35d822a33e080d0e71c.npy +03636649-e8350583c84b5e6731ae8c8ff1eb3d45.npy +04379243-c2679e65b9d5e95de6fd255f2d77a585.npy +03001627-1d0abb4d48b46e3f492d9da2668ec34c.npy +02691156-bb785567f73903da2661ac6da30aefd.npy +04379243-2c730735f7f3e60f848ac41b30fbbc29.npy +04256520-aa27de991298fb2eb3a010e5a9dcf3a8.npy +02876657-84bc4006535545fad2986c98896facaa.npy +03624134-ceb3b39c9a035752b4fc059d1d10ec5d.npy +02808440-a2e7bff47380868e6b37e99dfd7a802f.npy +04379243-ec6de49b6fee801a4b3c42e318f3affc.npy +04379243-ed1e06e886b5514fe8f49d7c9e73ab9.npy +03636649-9f09619002ab4d76f42a90fe4baf4591.npy +03636649-a5bfb9a3571e7e86e59f529cd1b6faa8.npy +03636649-97e63c1f813cb1926f43c7673a499bbc.npy +04530566-81a7b820899ccbf15ddefb7321dceac0.npy +02691156-1890f6391df25286394b1e418d5c594.npy +04530566-ba62a620689a976f721c8a4254856c86.npy +03325088-ccd1a028cc366882b362845c6edb57fc.npy +04379243-119819c15bec2e1e299457639cc3cfe3.npy +03938244-121f2fa5ec7a7db47df4feb40f08ca17.npy +04090263-b77b49b9bd84123140385522d1beeb20.npy +03001627-326f74afbed5d727da8b0c70313fbbae.npy +03761084-684b0477a4ffae9f92b1088bf3ddce02.npy +04004475-df443a41d3b4f092d5805a1d6e49bc4e.npy +04090263-4301f958c305ddfda1b7cf86a93141b4.npy +04256520-a9a8156722fa81dcbc36ee6cb276b00a.npy +04256520-4373d31c2ac1d0bc57278947e7c4dc7.npy +03928116-9ebbdc0d84ffb0039edb2d87f2bf300b.npy +03001627-88dda281b3dddd57517c7e27988bea5f.npy +04379243-54598a1cc5f389ffbeb83c64f2162734.npy +04379243-6be2058f02beb0569699d7bc7fedec1c.npy +04256520-3f1af655a7e3ee57b838ce7eb80b48a.npy +02933112-54dfbf6333cf06dd652b6926f989dd09.npy +02691156-8c3419a655600e5766cf1b4a8fc3914e.npy +02958343-e13ea26b1b229e74bbc8d784a25de148.npy +02828884-eb06da40812adaa9542357877f3143f8.npy +04090263-3e0b251299b8696592cea77f96988ae6.npy +02958343-6f793e0f29f6b0b4da82e7357e8ee170.npy +04379243-74e9d9cd7b3d632a504721639e19f609.npy +03790512-5131b742dad94f6175dadc997718614d.npy +02773838-83ab18386e87bf4efef598dabc93c115.npy +04379243-dc47d49db6ac670635d498476a30ff0e.npy +02808440-ff507a7e1febf2ea3321831d2245cf06.npy +03046257-6d193b1a63e7f617977a52409ec6c456.npy +04379243-d528d80f04f387fea570c6c691c987a8.npy +04401088-dd02413772656bf5f6cc8d1cc08b421.npy +04379243-70a4cc63977d8eb018d385624fdfc6d0.npy +03001627-bf8004c0d88210a291efd008fb89dc2f.npy +03948459-9647b6b16b7744e67b1ee883bfd9155b.npy +04330267-1b625db2af8c02b04253be890e153964.npy +03467517-2cbc0faddf227502bbc745a3524d966b.npy +02691156-f144e93fe2a11c1f4c3a35cee92bb95b.npy +04379243-155599b6ab61a872f51f77a6d7299806.npy +02924116-358ea149995d8b826ca2b6e5474aad11.npy +04401088-d5fd6679ddfc8ddc59f56ab706e2f74c.npy +03636649-370ff00dc6f08167c3bd24f986301745.npy +02747177-1ce689a5c781af1bcf01bc59d215f0.npy +03790512-ee0a3213a08a23d27d2d874548544c4e.npy +03928116-3696bdc9797130c56599aae9284a50cb.npy +02828884-756108c9b72e95aa57d85583f4ad07cf.npy +02933112-4d0ee9779956b74490a9ce3e4b15521e.npy +03691459-59455b5c509a7e9efe96ea0860283ff8.npy +04379243-97a137cc6688a07c90a9ce3e4b15521e.npy +04379243-61d5c19a08b3f4a9b3dfbaddaa1a935c.npy +03001627-3d988ea2b68f48c7492d9da2668ec34c.npy +03467517-d2938be9fd0a6cd340c20797381ee39f.npy +02691156-c46336844aa275098b96ae1a0a8b84ec.npy +04256520-4d251436236babb87189b31b3e8c8ef3.npy +03001627-1b90394dae690dddb53be07817c1dd99.npy +04256520-201a6507d261c9113847ce0a45864e80.npy +03001627-b251886df47a873eede14860b165d604.npy +04379243-68b5f18b0790e9e128ffacc8063f0f75.npy +02828884-1c79aa69e4ec26b65dc236dd32108e81.npy +04256520-fe591a1cfbb6219afebad4f49b26ec52.npy +03691459-e47b83b94a1956ad7a16fcc398700938.npy +04379243-525b2042bd4547fd7ef440dbce8c5be5.npy +03046257-237b0f3acdd0b69bd4bf7024dfa167d.npy +02933112-839393d59ef6c8cfc59350d819542ec7.npy +04401088-f7fcc773249429a2761eb63018291094.npy +03046257-b2b40e80c9d3f530d5f1db12f95f0fe4.npy +04379243-e731ffc67b03d0555f46d55537192b6.npy +03325088-23fb74a31fcbf2b6b362845c6edb57fc.npy +04256520-39b29bb4fd8140ac9829306a513f9466.npy +02924116-83efc266d8e8ec03fac5a1e8b1475766.npy +02808440-9eca0331d9e89d5bc3035ab7747ce27a.npy +02958343-aff67f837a958d2329984c4afd2e98a4.npy +03593526-14ac8d866a8ea8b398910e50f05b8001.npy +04379243-5e96ddc94f51f99d2165c54dcecaacb4.npy +03593526-49a97b1ceaee4a15525b133235812833.npy +04256520-9ea95280cf81f9c5c151419181ef256.npy +03001627-9d6fdcf7fd47fb5af22166a43d725fc9.npy +03325088-902a12f98b7d0b1a76c18e71fd49c4dc.npy +03636649-2b7eaa54eba94f34502b0796fdf972.npy +04379243-537e9f07962478412de1f397a20604d2.npy +02828884-6d1883ed7f0cec103023dc1d1218bb2d.npy +02933112-3b98711b877ae402824662341ce2b233.npy +04256520-5d382ebe0f2ab55efefccbce7fd86667.npy +03001627-d32fafb61e1e4a5bb0d5741be7de64b1.npy +04379243-ac40c46401406b71d9c36c82d746b699.npy +03691459-48a2091454502770408d050f12518231.npy +02933112-3e662f9afbe62838f0f8b2d752b1c7a1.npy +02801938-1f6046149060eb81cbde89e0c48a01bf.npy +02933112-9990d6c43d95c521c4df475ad1a6d009.npy +04256520-b228fe3ec218f2b7fd609f4a869e9831.npy +03691459-43730d7a76ea63f920363e2561dd589a.npy +02958343-c17e88a6b0267754c6529edfd0032791.npy +02958343-bad0a52f07afc2319ed410a010efa019.npy +02828884-cd49cc9aa0377a298fb953ed1ae534fa.npy +04256520-f4526b250d9ba847a1d83e910853d9db.npy +04090263-176b7637e807853d34ad43a472bf958.npy +03001627-a63ceaceaaae4af9753496ba23f2183.npy +04379243-6c6aaa451538a8ed6ec2cd9a23ae5af9.npy +03001627-6634fdee517153e7e8523833000f615.npy +02691156-c61f67c3f03b10537f3efc94c2d31dc5.npy +03928116-bb551a5c33e3743297a999e2367a4a2d.npy +04379243-695639f21a7995f592d5b25c536d8044.npy +02691156-8951b4f9834869a6673a028ac04b7de3.npy +03001627-eb23621d7ac1094398e0d1738edd4f19.npy +02992529-2c32c1b5d13074431c1943a82a09125f.npy +02691156-cc1e143cf7da051a6a6dc7e2bbcd098.npy +04379243-c139948ad09b042991a3d45e8887248a.npy +02946921-95ca52eaf8010a004cfa3ec30cb9847f.npy +02958343-e042d636cfca46f56436916a86a90ed7.npy +03325088-36e4eaad0530977a3c8d0fdfb1cc2535.npy +02691156-79e924263f903feb35fc197bbabcd5bd.npy +03624134-ce07e9a3b66742926cb0c1a2f69481e6.npy +04256520-9e3fd54c2e7dc4204b19d2c99e22ffe0.npy +04379243-913d774c845a0d7edc889d1ef9591d24.npy +04379243-8cf448cafd11acee84d4c0ff7581c569.npy +02691156-b26c50c3dd4a1cbb16b34c3751bc447d.npy +03337140-8c46c51995853d384c3aee8e9d3a6ffa.npy +02691156-e216667457193c729a6e43b878d5b335.npy +04379243-2ff9f572b715e86b1cfb6a573ef73942.npy +04379243-b69b6e09d5f5bc1f21ef666e979e4e80.npy +04379243-1c66f97bf8375052c13e020d985215e3.npy +03593526-a16e051fe5507ae2396ca3dd50467ab.npy +04256520-e6e2ed3f41a3eb951197663c308adec2.npy +03001627-bcc4ea0133864bfe4d4c0769270d8651.npy +03991062-a7bdcdf20b7e5ce7a2c59a4d90e63212.npy +04379243-45970e6048cadb39691e5fa75e122ce.npy +04379243-f361b2c70470eb71b71df3a52d67a993.npy +02876657-e9371d3abbb3bb7265bca0cae1ecfff5.npy +03790512-867e3e502de5cc0dd5dde04c96fd8146.npy +02933112-b74f87f4d4c7da7343638dabe1eb5336.npy +02958343-ea954837920f94e6f58ff156bb8fae0c.npy +04379243-8839cf79a5338a568ce66f12ba927a2b.npy +03001627-b80122c3a0543a7b7eaeab1f0c9120b7.npy +02958343-6482b8e8c8516a3b473f10e6caaeca56.npy +02924116-58b46b4dbf019171b4c69692992c7aeb.npy +04004475-94b56634065b6b4471df0fdd633b5540.npy +04530566-8b0d1cd6731593974543d90faa1260e8.npy +02933112-d4be807e568ae84d7b386db5665a1b3.npy +04090263-ef46f9c14bcb69193a3a90ed08de76ea.npy +04256520-9695e057d7a4e992f2b67ae827b02632.npy +03991062-dd92bd3e7c865023b3357f2f0418422d.npy +04090263-9751e6d0a0d6c1919c82b3f5ddca589c.npy +04379243-96db71d279b97c4ae02c30c9027468fb.npy +03991062-1c28000ccaa92ef72f5989acbfd15191.npy +04401088-271bc457eb5f8f4d2bcf2225e929a245.npy +03001627-7b2d8c9f611071c7d810b14a81e12eca.npy +02828884-38ea17d177c4e872fd07832c54eb7e78.npy +02933112-3891210a28be585fb9ac96152ab66583.npy +02691156-edc9fefa5fb82a0443a0c73d98327de8.npy +03636649-3330789450af921544fe3ba945082ada.npy +04530566-19a72473173bf26ff7bc9a344bb7bae5.npy +03624134-84ca0624075af918cc34b900bb2492e.npy +03211117-f8c22e6011567f655dee408cc1ce3ebd.npy +04090263-89c1d5cf1ceb8a81c8b8e03401520eba.npy +04401088-97e214d6b93e012f6337fbfda5096043.npy +02880940-c8a4719150446e84664b3b9b23ddfcbc.npy +04401088-6710c7894efe94cb918f30c146a92bd0.npy +02691156-c8dcaeda94da8da962b600da24e0965.npy +03001627-7051b028c8c1facfced9bf2a92246703.npy +04468005-582501051c6fb18a4c695bfe6fa2baf7.npy +04256520-dc35836a8c5bbdc919fb4103277a6b93.npy +03337140-c1aee431269eb53191c352d02061b3f7.npy +02828884-3e4f4c54420bdcae75becd8a4c3f1866.npy +02933112-4e33ef381f5be0e165b61ce1124a4806.npy +02871439-cfea3a81c83c30e775ece18553078e31.npy +04554684-b04403b592cf3516df3a1b0d597ce76e.npy +03001627-6e7455e21a6668a7f51f77a6d7299806.npy +04379243-9d039675f4d51869f3edd695842c6d58.npy +04090263-96023028ba4ec62b65b14b263bdb456e.npy +02958343-4fd6fe1f81a83dcee6513d84422cefc4.npy +04401088-1d390d2560fc259336eb9fe355d50fdf.npy +03948459-7afbd8e91df4282f1b5391e37ae81402.npy +02958343-e4b5734836d9519aa8a84951596cc1.npy +02942699-a3c9dcaada9e04d09061da204e7c463c.npy +02876657-b38eb308649c8c5de7de92adde5735ef.npy +02880940-9ea66797afeb86196ea1c514a0de6d2d.npy +02958343-9c65624c5d94aa29801b0db1d49ea10c.npy +03337140-5479c44349a3dbb4823b9dbfda3facc5.npy +02880940-3bedfd655c45c6747bc26b16f550876f.npy +04256520-98b6c00c4fa346cd187ccdd3303d9e5a.npy +02880940-d2e1dc9ee02834c71621c7edb823fc53.npy +02828884-696697545f8c8b9ff26d8e17374f38e2.npy +04379243-fc64a8a31f30ab8bb780b07b76df3b4a.npy +02958343-1dc757e77f3cfad0253c03b7df20edd5.npy +03001627-38ff18330fd5aace162bf7725b3fab02.npy +02924116-aedb07b6ad73e3b759a2046f98794106.npy +04256520-d20569519e7920bc38cb7d8503a3164.npy +04379243-dc3167808a79ebe24a1806c17996a001.npy +04530566-d77beeb2abffd0818a6b641df8a0d183.npy +04379243-f74c321042dbc8e684d78f017ff73fd6.npy +02958343-fd765ab34e7907db186bed5098d348af.npy +02691156-2cc44e0f9fb1efdb85e0a2007a11e92f.npy +02828884-127dcb2e061ae07f155d75bbf62b80.npy +04256520-9d1886cd5aebab3019fb4103277a6b93.npy +04379243-65ad913e23eec800cea003eff0268278.npy +04090263-428eadf77b50d6a6cfe6670bda9305bc.npy +03797390-edaf960fb6afdadc4cebc4b5998de5d0.npy +04379243-b1835f603e1477f61b50574ebd76a45b.npy +04554684-3a289ed95f5902fb46cde67a6a1ea328.npy +04530566-677ffbc1ee40a0a0db5a9ea3574bb285.npy +04379243-1c7d7b6754dccba230bbd4cddd04c77b.npy +04090263-cb35c8f7c723d041916965fb9c37252a.npy +03001627-19ee0ca97ed377fb69fffd0daafdccbc.npy +03337140-df26b9e9e3c642e0e7ecdbe73ef4323c.npy +03001627-7f11908f7ea9483c415dbfd895473b4f.npy +03691459-5ec12b34a69e34d9c85671f86a50354e.npy +04379243-d1e01c36346b4b839abebb636ba42f4.npy +02958343-e66bbdf57fa6f7f575f257e5fe0a71cb.npy +04379243-d9c11381adf0cf48f1783a44a88d6274.npy +03001627-383a9a2c39332f7f50eb11cb3709022.npy +03691459-b7c92dfdd563ffc74533f2e74542acda.npy +02691156-91d3479f5da120a9b4d73e4449062b04.npy +03467517-b58facaf0086786090794f393d445340.npy +02871439-f61465baa4c1c36de6089046407cf8f2.npy +03211117-ad3e62240370a4eab2c358fd992922e6.npy +04379243-6cadd91f66569c584f60f15da4c665d0.npy +04379243-d60166dbf522deccdc8726953f344666.npy +02691156-ae3556f7151098b0f64801ad2940cdd5.npy +03624134-38798b7013607bbf1e0b76f10c6e38af.npy +03691459-619442d40cba1f667a964feaf6ebeb.npy +04256520-781ef644347280bcce59ea70152320fa.npy +04379243-165e579c965b215b43dbb6421d614c0d.npy +04256520-9c18d53831315667af78305d7f7113c.npy +04256520-b9ab5b0ba01f4d896ae963205db1109f.npy +03001627-acbc30795b9826ec283b00891f680579.npy +02992529-5e485b1ae058fc11b26a5d88c8b02ed9.npy +03642806-17069b6604fc28bfa2f5beb253216d5b.npy +04530566-316d5a8e671fadf3a7fe2e170d12322d.npy +02958343-b3ffbbb2e8a5376d4ed9aac513001a31.npy +03001627-50477d125025879386855a8015309d66.npy +04090263-d0987a5b6c5c6118143bcc14d754d44d.npy +03991062-802f4afe1388b7b0ebe67d9b32c3ddf8.npy +02691156-3a54f2b6f9b053b759b859405dee3be8.npy +04099429-64803bab9799d0e698d2d2b2ae2563b0.npy +03691459-51b745123abc098c10198e93f73dfd5d.npy +03001627-51c8f249e778e84a5bae8923b29985ad.npy +04379243-5ba34bb2440aa2b917b431cae0dd70ed.npy +03001627-bbab666132885a14ea96899baeb81e22.npy +04379243-ae1a7b7c3ec72178b848d7d3af8eb610.npy +04090263-6e3239e448539dd25c351e299b24e355.npy +02691156-d45772f938d14d52736e55e9ba083986.npy +03001627-4c3f452cd60df0efb0957d845ac33749.npy +03001627-f0337929bdf10321d22730b0728b2fc9.npy +03001627-1e9004958eb935b2ef2777c7d8e09db2.npy +02924116-7b981340ba0b243ed7b025993d18028f.npy +02958343-330645ba272910524376d2685f42f96f.npy +02691156-515b1b36d9f7721a903a13c314c66013.npy +02828884-c0336b0471ca232bf155d75bbf62b80.npy +04379243-d27130df514414d1d8c46a3a266762d7.npy +03001627-c7da13238eb4a7e15128da2cbe23f6a.npy +03046257-9c9e80c64d5ab227d5f1e32336840b07.npy +04530566-141b2e976df2d4ed4ccd729f8bcb378.npy +04256520-d5aefefca08da17819fb4103277a6b93.npy +02958343-167ec61fc29df46460593c98e3e63028.npy +02691156-aeb538b2f1c36a8d9e811b082458229e.npy +03211117-1d1cd29446bff16090adfc5ef6476a6e.npy +02808440-e1133d232c5fd7993321831d2245cf06.npy +02691156-33ddbeb13fecf7868405970680284869.npy +03001627-4a0b61d33846824ab1f04c301b6ccc90.npy +02747177-4088f2056763a95752e986a5f722a6f.npy +02958343-19d0843797b8b2216abce8cb03e7794.npy +03991062-52de37a011a32c2fa2c59a4d90e63212.npy +02933112-7e6c0a7c630cce1d4702663c3b3faf8f.npy +03691459-882154aab31d483e130bc0755682f7f3.npy +03046257-1948275d99403353d7bf6fb68df7f786.npy +02933112-c18a4772bcfbb98e85bc264270ae0601.npy +03790512-9453199691f58147429f1c522640e6f0.npy +02933112-d209aaa7fd4035a34c7384dbb75cab0d.npy +04379243-913c38e7faa82c984a62fa5dd236505b.npy +02992529-9dc0c2ca8de18e28b4c18e3209e12990.npy +04090263-e5a2a579e54cf1bad87c63d8b3018b58.npy +02691156-20b6bc7d69902db4d3ccdbb72feef61f.npy +02933112-a0eb46b125a99e26473aef508bd8614e.npy +03001627-fb8b45151900e6e016a0c57b9ceb6d01.npy +02958343-1b2ef0809ca1abc7ca92a4cdad802b45.npy +02933112-14590b6bdb425e80d8986c3ed6c52fe2.npy +04379243-385f8323f5051b85f2c48e2288633251.npy +02876657-546111e6869f41aca577e3e5353dd356.npy +04379243-f1252c297d7ad9a47c51ec7d2716b33d.npy +02876657-b71afc7791d18eabc573899ac6ab82e4.npy +03948459-5a36e7861e4f414163e7abbde5e6b2db.npy +02808440-f033e6bfaf0c41963321831d2245cf06.npy +02818832-82df8acd0effeb9faf31209a7c3f5c4.npy +03001627-78779361a406474db516c05d046e8e45.npy +03046257-c39cf8d87c6cdb5a3339d8259ddfa7bb.npy +03593526-6bfcacdff00d57c633774da3deff863.npy +03046257-b972dcd268517c5df51f77a6d7299806.npy +04379243-6f58b8c1d826a301a97bcacc05204e5c.npy +03001627-18bf93e893e4069e4b3c42e318f3affc.npy +04401088-325ecc3acd232a5e981b9cd34407d026.npy +04379243-fe9d363792ee708b35836c728d324152.npy +02942699-ee0f44a37e50eda2a39b1d7ef8834b0.npy +03001627-602b7217c42d3d365eead856a4605937.npy +02924116-c8f079359109f462c6bf3b18b8ca71a.npy +04468005-1af852e72c44954b8bd91d7cadd7c123.npy +02958343-d838c8cb52c92df3b112e5ac235c21b7.npy +03046257-bd3924dc45097f029ba80f08c401fbed.npy +03790512-8521276f8a6df852c83b248a54afdeb1.npy +04090263-17577c2cbdb7c916642f87788fdb63a7.npy +04379243-241ea467140a03a1e015e8084a32eed1.npy +04379243-9c12baa3337390578592b396b177b348.npy +02933112-4bda28b19b2f6f865cd4f7d5b0608a.npy +04379243-56e00d6764a7205fa9fe1734a6086750.npy +04379243-8bf421d191e4908bb8fa4cb65e077db1.npy +03948459-a0a1633186261a031274aa253a241db2.npy +03636649-99efb45cf927a0c62cd2160e449d45ae.npy +03691459-ffd168e54f722339ef94793a67b4c5c0.npy +04379243-86604589a588bfbd98cfd47a860803c5.npy +04379243-7f1bd688960e2c1b97f2016c3d6097c9.npy +03001627-34160b90f6abd883c731e4cb72d7c0af.npy +04004475-1eb6bc4d41f19e07c29432ec481a60b1.npy +04256520-d2964213849329b494887ea54f3cfb87.npy +03948459-39105892cc0b553753e0a70586b5c8af.npy +02747177-8a321a0750972afff155d75bbf62b80.npy +04379243-e1a8e9e2059f4792fbb8cbddab1c2002.npy +04256520-ebc8467a8de995924b3c42e318f3affc.npy +03948459-34eb31e5ac8802246f2614b47f532d63.npy +02691156-f8bc6483dd3c87085df50a69f2f8e096.npy +04401088-959975a60ae104c48780444eaa02106b.npy +02691156-788cd4e599b0ca1819ba010ddb4974fe.npy +04401088-ed9149921b734b2941edb96d309c9a23.npy +02871439-fbc6b4e0aa9cc13d713e7f5d7ea85661.npy +04379243-135f9b1fb72e16d0dcf4cc877ea9b3ab.npy +04090263-2d5208bb08d89bf9a3e2fa8a8e389f2.npy +03211117-2c5b951b726b7672c137fd38f49b032c.npy +04379243-f511c1d4356a6a7ac0a61ad1cf92b694.npy +02691156-4e85ef428689df5cede07437dedab44.npy +02871439-d438f761339ebf6db2ac45db35c175.npy +02691156-ebd96d07a7d68cf2fc7b6f7beb3a27ff.npy +02691156-33fff5b8d113cca41b950a59358e57bd.npy +03325088-e4e3ed7621c9b135b362845c6edb57fc.npy +03046257-59ba9701544bcbe167944f5aabc774fc.npy +03211117-e58344689760e33158aeac7d536d442b.npy +02958343-7887e8306742cf844ca84d60642ec7e8.npy +04379243-e7655dfef36db9908c31ab4d97f0b44.npy +04379243-2fca68e0ce294506fe3e90bc90e90c63.npy +04379243-9f9d8c3acc3d33e628c187222995b2b5.npy +02871439-cfda7e588ae6c925ff1830d863863fa1.npy +03325088-66b11d49e1b91a7438dd26a27be095eb.npy +02691156-669060a91dc45dfd2ede7237ec38a80.npy +02843684-9d4da019570ea9748d438032a8fe6ff6.npy +04379243-7f14110c96ee2cf6afa167a727ddfb67.npy +04460130-8956ecd996dc60af97802b1c3f15658f.npy +04379243-ba73c0ea2797bded8adb98ef1d9443ba.npy +04090263-ba789d3b971e4095e2bb19fbad3e4596.npy +02691156-e761cf88524cf8f24c3a35cee92bb95b.npy +03001627-7e6b4a7b4dd60c40cc8bd7a04c9659f1.npy +04256520-68712432581f8a855739643afbd8c926.npy +04090263-5ed0e0b4d26a30fbd8990f79240f3290.npy +04379243-d1494e0665f06507b79de6fdd84b2221.npy +03001627-92e6546c4aca4ed14b96b665a8ac321.npy +02958343-3586f47af775e5158aa8c3cca6f13406.npy +02992529-9efabcf2ff8a4be9a59562d67b11f3d.npy +02691156-f6e6bab105ab890080be894a49cc4571.npy +04379243-f9ca8f7549af695a5aad165050e534c.npy +02691156-daf0298bbe90dff19751c7a6f15617f4.npy +04379243-186e501aa015cd367f768772b7a990fa.npy +03624134-1be1aa66cd8674184e09ebaf49b0cb2f.npy +04379243-18fef71ad80139a2af02521b7ec8a38e.npy +04530566-c6ef6b859205ab53609e2d916fa0da27.npy +04530566-b91a01dfd51d615b4f84436cd4bc7d29.npy +04256520-6336e1ec8679ae5c512941e37c7d7dd6.npy +02691156-8af65c495c966cd7c337e45399cf632.npy +03001627-675c6c0c5c9a4a8a3bad033fffa5c327.npy +03001627-238cd4b409ad9951f1d6726679b21945.npy +04256520-374c336ccd894dca717b2a5841d92.npy +02958343-d6786ef05af6127d58e7058c5c570964.npy +04379243-efc9a32719fc71962c95e86abe3e6416.npy +04256520-94728591e785c00278fe949fc1419876.npy +04256520-fb65fdcded332e4118039d66c0209ecb.npy +03513137-366a517ee3a9aa3db4c1516b11b344e0.npy +03001627-e0311d577cff9d85f6ea7461c0aa61c3.npy +02958343-1abeca7159db7ed9f200a72c9245aee7.npy +04090263-2b22712b66d3f1d7fa9286f039319ff7.npy +03467517-65e3bdc247b3ce3d4de904d1abbce016.npy +04256520-2efc425b95430055f7406d785bf36110.npy +03691459-ada2311f4edda41478108236e982c2f2.npy +02992529-5a7e19fca06d2bb7f2848e928a160066.npy +03211117-d8142f27c166cc21f103e4fb531505b4.npy +02801938-9b8db1890e6b74d430c7810cba6da248.npy +04256520-213484c5675cc80b4719088c8e42c6ab.npy +04090263-57337a97460a63129d5aeb7097eddbda.npy +03636649-b2d5929e66044aeac7db9c21ccfbc4a1.npy +04379243-fe4bcffc64838402684b7bc3f8a9aa55.npy +03325088-7219dec616569e833321831d2245cf06.npy +03001627-1de49c5853d04e863c8d0fdfb1cc2535.npy +04530566-e7bd994999e1d6d87ad17faf524063ac.npy +03467517-d2ad57f36e00c602baba3b7560fe62f4.npy +02958343-27e267f0570f121869a949ac99a843c4.npy +02691156-b590adb6d3486f6e90b1d6deb98feec6.npy +03001627-bec78ebd204764f637a0eda928b574d2.npy +02992529-8ea08c4be8f2f96095f577622f465c85.npy +04256520-411444708e41ec314b3c42e318f3affc.npy +03001627-bc6ca247b19398b89c7dd675565aedce.npy +03691459-d3a872834cd0aa94d77ea5e1afa5bfe6.npy +02828884-31846b186cddba04554672356b2029e9.npy +03928116-b896fde9d5fa81c4d0fb5e8be7de90c4.npy +02691156-42b71c3f82a845574c3a35cee92bb95b.npy +02876657-807f781ec8310baaa2e58dbee8c64797.npy +02691156-9f525ad90573de3dccc19f6800e20c43.npy +03261776-9790b84ae96e498d09efdd367bd2d59.npy +02828884-4ba13b996d6f1d3b286ea987ad5ffa18.npy +02958343-82bd66a7ffcb351c1527e35a652f449.npy +02808440-539296c36596f6d3b805ea9e53402739.npy +04379243-85f2fc137f3c7e57a19748ad08476c18.npy +03991062-b251cff600d748103918c3b319764298.npy +03001627-5c4c50c0a987f8c2d9789e40093c1324.npy +04256520-944842d74aad4e2617b431cae0dd70ed.npy +03991062-490e2e25da735cfd3df324363ca0723f.npy +03001627-2608335ef22bcee1c97114870bb573.npy +04468005-d2e368bd92b5180fa68662d570e5f2cd.npy +03211117-d061d2b6c934d0cc8b4b5227fac4401.npy +04379243-2b7b66623a00dd8b78838533e331d3cf.npy +02691156-c9f91acaeea4136f2863c6a2c8157d17.npy +04468005-8948aeb6b31b62bec3d4460f3366687.npy +04379243-7671a315e8ab32f4664b3b9b23ddfcbc.npy +04379243-10139657dfa9afe0c3bd24f986301745.npy +02691156-4cb1c851d4333d1c4c3a35cee92bb95b.npy +02924116-997db64d612406994b525b3ec330a8c9.npy +03001627-c4af5a5858b4f40082db9fca4b68095.npy +04554684-99871b9c854889ba5cb3e2021047f79e.npy +03636649-3b90765f78db34cdb827dc66c75bf2d5.npy +04379243-263e097a29c520c717b431cae0dd70ed.npy +02958343-a4fc879c642e8fc4a5a4c80d90b70728.npy +03642806-ef5b312fc20f1b20aab089a6db538ba7.npy +03636649-4521282bd4550113a5f600ed2cf472ac.npy +02691156-4cee36a2e8dd3b24b87697d3904b168b.npy +04379243-1abfb0c03c81fc2219fb4103277a6b93.npy +03046257-3521751471b748ff2846fa729d90e125.npy +04468005-e71a412203c7d783ddd78f4c842acf97.npy +03467517-4ad5927ac53f3660a1f7bd4770762353.npy +04379243-893d3871e46b18f79b11da89c22111dd.npy +04468005-d10cd54d59b35abd52470de2774d6099.npy +02992529-864e5512dd35164b2d477e233bc97afe.npy +03001627-e6355bbd9aad146a149098a193698017.npy +03636649-1e62d260a8a64b5d8f720345751070e9.npy +02924116-1005d0f6134d4afb69c93024dedae1a3.npy +02958343-7dac31838b627748eb631ba05bd8dfe.npy +04379243-d679b6e72d6c0ead391e4d6c585a697a.npy +02691156-3f3cd5461f7ec6edfa8a0c9a1860ff01.npy +03001627-4e1c6dd1146ba848f71f1345a68ed387.npy +03636649-5e2d2a5b9a69125b23c3accd4496ea68.npy +02958343-a476444d87bc7aeb1699b1ed8dbb7ad7.npy +04379243-3bc7c7450991737c36b0f2a1430e993a.npy +02691156-121e9fceb90440efed79d3bd546890bd.npy +04256520-7d8fde70f5c3f351567232766992241d.npy +04379243-dae4f6f734088c4de3a031805ace4a99.npy +04379243-11cf749cd0a65ca13339d8259ddfa7bb.npy +04379243-287f1318fd5e282a185574a5e2255bb6.npy +02818832-68df37a4bdb83f7c03cd8f7413e947b.npy +02958343-2131d5bcea38ce3a68bdb39538968e8e.npy +02691156-142acab4424009a123fc69eefd95e6d3.npy +04554684-46749d40640967a94b77d9f59f49ab0.npy +03207941-7d4a04196d3b8eba7984fb9ec7e40829.npy +04379243-35a65ddfe8690ccfbc96558434dabb4.npy +04530566-884454f0d5a376c295ea46728bcdc15d.npy +02958343-2650ad9e7a1d0ebf6df8cb2765f8ec95.npy +03001627-f2c1f929f451753de4ee93147efa8cb1.npy +04401088-c1077972752aac54e8deab000196f61d.npy +04379243-fc93d1a1476e4f86309c518184dfbf58.npy +02691156-5785c8651893ca6b7209009cfb89d4bd.npy +02876657-29b6f9c7ae76847e763c517ce709a8cc.npy +02691156-fc0dbd045c9391ce4a29fef5d2b2f3d7.npy +02747177-e5b7b5112e396a49b581cc9c4410f841.npy +02828884-6b4e4125c1a680cd2cc92e3c03668ea8.npy +04530566-215861c4bebeb328d9a75de54b023ae1.npy +03001627-1fd7d0fe883059e355feea066cda8f9a.npy +02747177-c904d927672acd48ad8a0ee9b106700e.npy +03001627-3baacc59dc30783a524dd35a546a4c2b.npy +02933112-22d10cc8165d310a15dd7d7985e749c1.npy +02691156-b1998932482a6215a9b2becd26dc2fc1.npy +03046257-5d47a83ce211f6a331387b9bbb0e1fa3.npy +04379243-f5b682cabede450d1191025061735ea3.npy +03001627-225891ce27478eec54e404e041bdecdd.npy +02691156-30b9882d1d75be3537678474be485ca.npy +04401088-937b3450c8976f3393078ad6013586e7.npy +03790512-eee947c35691b7d12279b76b11a9a16c.npy +04256520-e0b897af3eee5ec8d8ac5d7ad0953104.npy +03001627-a9a1147eae9936f76f1e07a56c129dfc.npy +04256520-60bca735b8dc8e487c4364ecff196aea.npy +03593526-cbca5373309e5e192396ca3dd50467ab.npy +02933112-c4d17b681e7f3d8a1e1f137e13140387.npy +04256520-f97cb4e2aed44b05593ebeeedbff73b.npy +03001627-f2dd3bc7d6c85a8f2813aa30be7ebdbc.npy +04530566-3e97094bc123e370be7ca2216dc1576a.npy +04468005-c56d3442d937eddb796ef482cb4dcf22.npy +04379243-33005098444c222b2b70eac6546e93fd.npy +03636649-20e4c5b5783eb950490ad276cd2af3a4.npy +03797390-54f2d6a0b431839c99785666a0fe0255.npy +03797390-eecb13f61a93b4048f58d8b19de93f99.npy +04256520-923e063599dc9ac7679edf1f9e4dc0a7.npy +03593526-5cf4d1f50bc8b27517b73b4b5f74e5b2.npy +03467517-5d6c1516b83dec8663e148e250c0340d.npy +03636649-a3ff2bc2ac65bf093aa7852a81a014bb.npy +03691459-a234d7b21f06dc58d77ea5e1afa5bfe6.npy +03636649-aea8305fcfd8a1d2ff0b82a28078fd3.npy +02691156-ffccda82ecc0d0f71740529c616cd4c7.npy +04379243-bb00ad069df73df5d1f943907d4f35fc.npy +04090263-98882aaa0d1b597127aebc12b787c594.npy +02958343-6af177bc78ee06a0e8acba6ad3725ca8.npy +03642806-1f8338b068279743f8267dd94d223348.npy +04468005-90fb6c97ceb13cd67b9bb226efd81df.npy +02691156-42b464affaa4b3f985e0a2007a11e92f.npy +04256520-f6dd2e82ae1f5f8d3d4d11ac89066d36.npy +04090263-63609476aad03e4b9a6e43b878d5b335.npy +04379243-d1d9e395bff3d3a7c8fc6229eb64e56a.npy +04401088-bd7b84ae3b88bd5cd2dd279a9538db3c.npy +04379243-adefdce69de361c58d8358620132e773.npy +03001627-bbba083270a2b0d031d7d27dc50ba701.npy +02691156-66a32714d2344d1bf52a658ce0ec2c1.npy +04379243-ec1c92efffb9ee78beedb4c8fd29e2d1.npy +04530566-82be57a43d5d1e14fa286e2f06a75d07.npy +04074963-1aa78ce410bdbcd92530f02db7e9157e.npy +02691156-66b9ccf5842ed7f79330265a9fff38de.npy +02808440-3a55b7caf574bdcb362845c6edb57fc.npy +03001627-3116d8714420cef4ba33c5b911977a18.npy +03991062-ef148620745fe8bc4fce6348712475db.npy +03636649-e11d2e065d90200c7543d7dbfecfffbe.npy +04004475-4e2784b9fe210ced4f2ac6d17d58c936.npy +02691156-1345cd9d0da6d149c6f6da58b133bae0.npy +04379243-adf250aa1c9e0f9567232766992241d.npy +02933112-ba17ef05393844dfcb7105765410e2d6.npy +02958343-620e8aac415e9805ea752ba39dde460.npy +03001627-c552529c54b0612e53041c49040be3d5.npy +04379243-2f8b594d23665a2de8058cf23f6382c1.npy +04379243-2b36b46dbda291b5855931d119219022.npy +02958343-49d6a631f23a324cde361784b4e1f04.npy +02958343-909422a9d1b42e1380360680c1602c7d.npy +02691156-e00d7bd590ac129bbc0909d98a1ff2b4.npy +03001627-8a26820faeecd40d4bf49568516d5f0e.npy +02691156-f55390ed02c0b2b36aa3bf023a2b42a5.npy +03325088-b33ff042286d575af51945de050323d3.npy +02924116-f4369a3f1b28a7da78c6ad1c898f52db.npy +03691459-f142707a0f0acab4cd229b7f28637ecd.npy +04379243-92246f29bdcfe82cd323d6bd8db8de5b.npy +04090263-2bdaaa66b6a2618b43c62aa3efb9d383.npy +04379243-a223fb0172d705fc3234880d6f34f7eb.npy +02691156-b812c2df636aa0218b96ae1a0a8b84ec.npy +02933112-6ecb73ea5a117e3fc6647a321d32ae9a.npy +04379243-58182c7837f0edc35da16758ae613576.npy +03636649-55077c2175d97b8889ab11a408196888.npy +02876657-14adee7ed296842c874073279cad6d18.npy +04401088-7e8e9cc2cd70a66d4d1f2fe604198dc9.npy +02828884-e3c1e31ca2a0247979dee05d9c95f934.npy +03001627-eaf5428e15655d0b3c8d0fdfb1cc2535.npy +04379243-ab0d3af786b87262fa74bdb8d964a92e.npy +02691156-776bd07271792d1b131c2ccc2e4397.npy +02958343-4f9db143aa853e69b207e9cc82f7c858.npy +03624134-81fe707672e60cc0873aebd175ac6f11.npy +04379243-a5af3ca6791da8292c48d6b905457dcf.npy +04225987-7fc2cddac7ad57a2aa4eefa8f42b566e.npy +02691156-57fe8ad460bcb4929a4a28ef635593ce.npy +03001627-b70600293bab55c0593ebeeedbff73b.npy +03636649-5656f1bb53d675ffcb8d8c6d4df8143.npy +04554684-a7c8177faa40c43a87be36ce60737655.npy +03642806-30cd08287b6ddeadb275781e0d014d27.npy +02691156-796d6fba50664f5b1bcd0717744cc5bc.npy +03001627-96a03b164315d2b65dc3653f8341633a.npy +04401088-cb80f0eb9d3566da655b6157f54b4abe.npy +02691156-f6b96f56212f55363023a5c0cae3fffe.npy +03001627-cb5f7944ec02defcc6a2b7fc00a47507.npy +04256520-7875815356fb41f3d772e458a8f80cd2.npy +04379243-abbdbed926968014b3c42e318f3affc.npy +02876657-c3767df815e0e43e4c3a35cee92bb95b.npy +02808440-7288fb375238b544cd97b994e487c6ab.npy +03593526-5b13716dfa70014c726dbbf7bc5e4df3.npy +04379243-f9bbfd8acdee30158a63c123f2a561a6.npy +02747177-23a38f8cafa5bc9657a8fa4c1cbcf3ea.npy +04379243-49672809018ebc55224dbcbd6815e727.npy +02828884-802e7f3207fe4306175516c727777db1.npy +03467517-8b1d0f73e54ef59c93f0194265a9746c.npy +02691156-c7f6766e4e96ca0f444c0cf9e8ad6399.npy +02958343-58dfa36440ada6cf2a9eb0f146e94477.npy +02958343-dc5c1b1d9bf826b8851f021b9ed69c58.npy +04530566-11c2a8719a7d23207ca6caab209ed3be.npy +04379243-c1ba1f5fa5781abe276333179717351a.npy +03636649-a8d45280f2ac4e7190c926f4231a7285.npy +02747177-7919df48b23e61ba6739a7caa0c577bd.npy +04090263-69765630d57639cdd7166ab41aa5cf74.npy +03211117-c32dfbc85ddecd0eab610b0c94236463.npy +03001627-90a15feb4f77c63e5e73882ba2654055.npy +02691156-b152548ae1a12bcb680558279a114842.npy +02871439-93903b233ecb3937c21c5d9d91c5c9b5.npy +04379243-4977e64ab070b003b778cbd50553af38.npy +03325088-b658725e78e7ae9014b35a7d7cea7130.npy +04379243-a1d2dbfb4b3a6c113ff4affcd321d45.npy +02992529-ab8243a880170c00cca1221aa4c4f70a.npy +04401088-adf64019f7a54162550c9b1b1c5f7e5f.npy +02691156-536f5d8e46467566643c3c243d611069.npy +03001627-4bcc7c4e4c0bfe47e8f8c11a24c52ebb.npy +04090263-b7e59df21f4859281a857c47fd0ecdc3.npy +03001627-c98c12e85a3f70a28ddc51277f2e9733.npy +03624134-ca6e866ca1133eeb1395331ebe4786cd.npy +02871439-30f45a446153b9f1fab6e40cce6926d7.npy +03001627-677846a1d3777e90ffb9df6156f4114e.npy +03948459-802312b6dd3bd38332a77024dbc3f67a.npy +03001627-46e1939ce6ee14d6a4689f3cf5c22e6.npy +03001627-70f57047512c2eb84104b1c5cb7f9280.npy +03624134-97cf540e9a88704972dde081fcd2b8ff.npy +02933112-2a22566c3bad34a7d0b36851d61b6fca.npy +03001627-5e89f5cc834553622acd2bb6205825cb.npy +04401088-5ce8fc4a82d2d97736d4d4df7a719b88.npy +04379243-3338d1a99d7387562a488bb287b71f6e.npy +03636649-b158a8e4f45653cecc571cd3cf8f17a1.npy +04090263-6021c3fad833e4e51646f62c9305a389.npy +03636649-e6629a35985260b8702476de6c89c9e9.npy +03948459-4a7d8a49bc6365f92f55420fa8e157d3.npy +02933112-6eb88254824387bfc59350d819542ec7.npy +02958343-eadebe4328e2c7d7c10520be41d00de2.npy +04379243-5420d2a9cdd0d511e76bc197b3a3ffc0.npy +03046257-f1e2c567a76c9b0ee3f7a74e12a274ef.npy +03001627-ddb53381dfd0a2d7d2b12aa6a0f050b3.npy +03001627-41bb8be36df856eb847d4e46a1f9f05.npy +03001627-432346a3345e3e5dd79b19c7c4f0e293.npy +02808440-f7b303def4a2c10f211278b445671dff.npy +03928116-512b7b3f96cd981f834096795cc3cf10.npy +04379243-855e0dd7d801faf61886830ef08153db.npy +03001627-cb8e63317e0ac998e6543556f230fe9c.npy +03790512-6ad8d3973ccf496370a48b7db120f9fc.npy +03001627-a1ca000d08da97ae43b5d2063387bd6e.npy +03001627-733b580501f3e25c21ede3e0ecf73091.npy +04256520-de6e76b4be0db5a0f81b347089add3de.npy +04401088-ad66da8440023d8a1e929774f9727b5e.npy +04530566-af936a44c902756dfb04eeadf4d8d0aa.npy +03691459-ce21542cb2b0bb3458107383640dddec.npy +03691459-5bbdb492122b18cf65d1c7f91840e570.npy +04379243-1adf96850963550f19fb4103277a6b93.npy +03001627-d19ab2197f8e8582f97cb7fd36f15198.npy +04379243-4e934cf95db4cd3bce58f346b4d8abe.npy +04460130-64942df95c33b2911dacca859c0fc7c.npy +03211117-91bd5e0ff352d942abfcccdda2fa4764.npy +02876657-b31ca446cb3e88dda88e473ddd1152a6.npy +04256520-a4367b42274cfad1f2b7580a739cd4d5.npy +04090263-8e40afb2fc5d8b1c91e284193311f752.npy +02958343-29e9a4beeaeea1becf71e2e014ff6f.npy +02958343-93c56f05dfcd4248274334f2451a8eb.npy +04379243-6dc0048e4326feaaa6c03a53cf0a14c9.npy +02958343-9a3bf26f461a1973b8013668e30e23b0.npy +02958343-ceb561c72a407ddfdc50a691c68014fd.npy +04256520-bb39e48c9c10abee77f0370a839e670.npy +04379243-24b563bccb68e78bf939d21e50c410.npy +02691156-8f39d2dbb98bce6057b643a522b3d830.npy +02958343-8e0572912893a657c697c8c1c6e09e0.npy +03636649-56cfd1c474b7b88920c80e4850e77325.npy +03001627-59dd7258a2a554c34671fddd657dec0a.npy +02958343-2d1adb247cc7a1e353da660a6567c5ff.npy +02958343-a53c3515eff9f3bc2f732d6dce34e9b3.npy +03991062-ac79fd7f10f274aba2c59a4d90e63212.npy +03691459-8296f03cef18cac011cabb4938bfaf4d.npy +03001627-2560232741878aa1ed0003a3eb88f6ca.npy +03928116-599f5594764eeabe36244e3d0dd95a13.npy +02958343-2d41d907b7cb558db6f3ca49e992ad8.npy +02958343-26c382bda051376daebb91b7dc4caa91.npy +02691156-561bab672a9e12352c1752d7966dcc0.npy +02958343-198d8e274c59511b36a1a31af8f59.npy +04379243-51874066ba946c58aaf15b62af6b513f.npy +03691459-23a1ad8f7fdbb6a54821f0e819875cf6.npy +02808440-e203fafb218840443321831d2245cf06.npy +04379243-dc0db74cd78a3805f5600f911d112095.npy +02691156-880715a3ef69f47e62b600da24e0965.npy +04379243-d623665165dc5af0f51f77a6d7299806.npy +02691156-c2be303f5abf0db7b3369733e21bbc63.npy +04090263-40ad008d081e3d40fa9286f039319ff7.npy +04530566-7b200ae33e01eda467fd076ce612c54.npy +03001627-6e923ab0f28c3c2e7251f1ec40392b93.npy +02828884-5f9d3dae06acf0e4e93e1127627b834.npy +04379243-47bfb0c5ef5c3c7ddb6175ef18ad3f80.npy +04090263-3ce5f5a20bae04221fca469af258e053.npy +04090263-ada26cb4cb6e0b1946177b6d1ecbf989.npy +03001627-8967e65c1541d1874aa7f42ef07f614e.npy +04379243-5385893962db72324b3c42e318f3affc.npy +04256520-9e9707ea4d5c5968a283d3d51bc54a1.npy +02828884-f72eddac559ca6a6a51c26819f8dbb51.npy +03636649-e7552c8c718a1a109f2349486c570dd4.npy +02691156-8406b2372f6e1478d62bfd1579f9a1c2.npy +04090263-c6bea91c2b9ac3245127e0873cfaa7b8.npy +03636649-98c7c2542dddd40af24f994bad42f06e.npy +02691156-376e9480ebe635b1e98208adea7b4e8d.npy +04379243-6848c467de649ac2af5e7c004818a73a.npy +04401088-45301b15dce2724e483a0f6665d9ffe0.npy +04530566-738eee54143b5406615bb39b45716cb5.npy +03001627-9d395454d6de675d2025ebfdd95f4ba7.npy +02958343-f8954a634d103c54ea778d6c713d08dc.npy +02871439-b8a7c4c8017e49085693f7ffb7544f67.npy +02691156-759da7376ab2196a66df9c92bbd3d5c1.npy +03001627-2b66adf2ba9858eb19fb4103277a6b93.npy +03593526-a76b1bd56ffba0ccc9f016d57db96408.npy +02691156-b63f7eb03f91f8a7de04805f7d685d.npy +04379243-b3f05a35fcb82f678d3a66f462d312e5.npy +03691459-b9c2454fc2ef38db3db7c6064037cd52.npy +02828884-e6b0ac08a5326f23faf575cbae5008b8.npy +03207941-69b0a23eb87e1c396694e76612a795a6.npy +03001627-fc0c6ce55282cb4dc8687ff9b0b4e4ac.npy +03642806-90c01fd78513bb99c9b20aa1b8066c46.npy +02876657-6c24c027831790516f79a03aa42f27b9.npy +02958343-cdd00143a3e1e33bbecf71e2e014ff6f.npy +02808440-76a687cb1dcacf883321831d2245cf06.npy +02933112-879c6614916fb6907812c3baf25c5bb.npy +03001627-2742c0a5e984d92fa0dcc52ca811e565.npy +04379243-34e70464c2a7c17d97b40b8029c75005.npy +03211117-d24f05f573621080af70f0a098b23d33.npy +03991062-ffa6f6a754334d00a2c59a4d90e63212.npy +02828884-759fbe8a3ffa3831a895774ea4e4686b.npy +04379243-2a0b5875dc999a7a29e047111bd79063.npy +02933112-4a30aaec0e83f992c59350d819542ec7.npy +02880940-a95e0d8b37f8ca436a3309b77df3f951.npy +03691459-daa10595347937b9ae7dd8d7b134d1af.npy +03001627-e66276c70cadd32a3eb520ff7cd241f0.npy +02691156-3daca58825ce2ff6dc82b8fee1057b30.npy +02808440-c7c0c46ba87f11ca4c62bee40dcdc539.npy +02933112-7c68771e303eddc16adc061043e7c712.npy +03211117-2d5d4d79cd464298566636e42679cc7f.npy +04379243-e72ff1a58d752d5867279908dcfb86fc.npy +02933112-2f30f402c00a166368068eb0ef40fbb1.npy +02992529-c4b66fac952d4ef7d9039fb3a1715e96.npy +04379243-2810c2aafcdd9fc3f51f77a6d7299806.npy +02828884-5bc75cb5c0270e60d2b12aa6a0f050b3.npy +04379243-3e0fb214c130556aea3f94b6bb1b2ed6.npy +04379243-60fdeb4561048f63f5823a6b2902a9e4.npy +02828884-eec9e185d9596e7ed2b12aa6a0f050b3.npy +03991062-aeef58096019b9e25d8d4d8a3cf8b294.npy +03624134-89f69d95f5598fddd42a2a5a47e9ed5.npy +03001627-3ccc4efe519087c470ef1a9d40467de.npy +04256520-24f5497f13a1841adb039d8689a74349.npy +03636649-43989558d13b1186dccf149c7b4065e.npy +04099429-3e34a0b61d3678f9646343ecf02768e7.npy +03211117-38ecf0c5f3d5ee533fb0920a55a7e805.npy +03001627-fbd890f1f0280b884b47ef9f38e7ab27.npy +04379243-8eb366f4f602219b490ad276cd2af3a4.npy +02871439-faf8ece43ab74cab21b8b4d51c5535a5.npy +02691156-8df55e58da6c297b4c3a35cee92bb95b.npy +03046257-6e143fc9eef8be8c788a9e26a791a23a.npy +02924116-9332819c99f0ba07973f659238edf3c3.npy +02801938-efc55d2da732898d188976e1056285ea.npy +02818832-fe11d05aad83a1084a5fb5c8287668d.npy +03211117-dba7ecbb12fffaebbf61576316934f86.npy +03001627-9df79431f16cad05116162acefe23592.npy +03991062-24bc34cdce868610346ed9821e11e90.npy +02958343-a2c9c1b4bf918cf6d2dcdf586ee56d5a.npy +02808440-767fd747f18ccf466c2e38b335c98be4.npy +03790512-abdfb5b2d82e555e3bd003e0bb7a3ed9.npy +02828884-c50aa1c3da488573ba5342d638d0c267.npy +04379243-bdefbb1f281434e39961e1085a81acc5.npy +04379243-78625405f6c44bdccd67f05ece4a06eb.npy +03001627-6aa1ac5d377261d1c2fbfa4bf3252b56.npy +03325088-470811d9dcd8133f76c18e71fd49c4dc.npy +04401088-5dcb666efc36d9a68480fb9b9f30e540.npy +02958343-f643555dde0f0838346c6b68550f2695.npy +04256520-21ff7152b3bd0bc3df63d1c7e43c783f.npy +02942699-2693df58698a2ca29c723bc28575d785.npy +03636649-4f54aea89016146f771b0e756a54d849.npy +03691459-969512b0adee661679c6a0f7677e9555.npy +04090263-2a2b25ca77af35cf30dd2b88f7efae34.npy +04090263-a3896a954602b229d9d2bbf707e9704b.npy +04530566-3fe8b8d9fcf031574bac1c894ff81b3e.npy +02691156-d18f2aeae4146464bd46d022fd7d80aa.npy +03636649-981b55897cee64403c8d0fdfb1cc2535.npy +02808440-ed208a6ca79ca685b974c98e4d49e283.npy +02828884-4273dca1b0184024b722a94c1cd50b0.npy +02691156-6db52e6917c80e5157b14532cc71431d.npy +03691459-bbe69ee745bd5c427d35e00bb4edf01.npy +02691156-ccc0bbcc236bdff9c1ccec171a275967.npy +03790512-506962955771904b1d471e626c3ad496.npy +04379243-7f57fcbe1e7af1c1b000f20a5153622c.npy +02691156-144070f63941362bd1810447902e2904.npy +04256520-9dbd663d977c64d1b982b1d54ee6ac1d.npy +03691459-9ea3e05166af97ed20363e2561dd589a.npy +02828884-8f99b25df578652ae37d4fb630545e64.npy +03325088-66cc5be6bf49f17589577ccf07b31e7.npy +03001627-6fe690a6f597351162fd10b0938dcb5.npy +02924116-c5f6d95268f6e9d7b96a75b253e6b907.npy +04256520-a109fd29656079e714b96b665a8ac321.npy +02954340-a444fff8c769de616a10eb60523df1e9.npy +03046257-640f12d1b7bdd262868fb986bc092533.npy +03046257-758885e4c4e7bdd8e08074c1d83054ad.npy +03001627-1fe33fe022779bf8b0957d845ac33749.npy +03691459-aede81c0789358891ae45cdab702386a.npy +04379243-7aaed3e906eaf675a57b3bec78e5d1b3.npy +04256520-db19747e2c5b126148cd16ceeddb841.npy +04401088-7d5180e005f1601ca36bec4fa7cd58c9.npy +04090263-a2d0d9e62c7fa469f02ee453ff283e26.npy +04379243-c180b07c9b0f46b9f8c3d2002c77ddb.npy +04379243-e104beba32cf40bee369d8ecc5b0e866.npy +04401088-52541b667e4dee9b1c1be4d7e88f11d5.npy +04530566-54196fe702cd0f5ba27ad5a09bb4c2bf.npy +04379243-5e0340e08510cfc52f84cb7932f866fd.npy +04379243-f9aab5dd0162b688e9a1a03c1d065394.npy +03001627-e35d7d19dcdc9e5c30e06a011e63236a.npy +02691156-c953df8a3f917663a9b2becd26dc2fc1.npy +02691156-d08471df3e76602427743256ca3834f.npy +02992529-34e36249166b8c6bc3f912172873d52f.npy +04379243-bbc451f0431c1b06cea52a85deb0c978.npy +02808440-417754618af59dd754d7082b34825ef0.npy +03467517-a4170135b1055cb8982c503992eaf09.npy +02828884-cd08399f8fd8bd3bec6d7b771f3c56c6.npy +03001627-bfb71bd97fdedc6c48ff063e62e02115.npy +04379243-44302defc423e34a8afd316e82119b42.npy +03046257-1d5c5121e29011ddb8183a4a81361b94.npy +02958343-97bcc7a1f73bfba93e5399147a5b4763.npy +02871439-5906acbe33ee8b218cbb8bac2032149c.npy +02691156-1fc2625479e798b11944f01d3ab2091b.npy +04379243-3b51d76c7770b81a3c6c6fc37120868d.npy +02876657-e4915635a488cbfc4c3a35cee92bb95b.npy +04401088-2098a0f7cef1e593f6c5597dd1efe723.npy +03001627-e07c55b60987e8fa4067a397c01042d9.npy +03001627-58b8bc3981302103b78c56df3d6a2934.npy +03001627-a497f206aa62e89c8ca0fe30c6caf3f4.npy +02958343-397d2e2b3e0988a2d3901a534bc610d8.npy +02958343-d55179fa8bec81799779c759176b96e3.npy +04401088-e7bb86cd04cfd98758f1d9dcdcb62d55.npy +03691459-40e4ae14fac94d0b45bf366c0f22b100.npy +03001627-f678b1e737eb4d5c738e43095496b061.npy +02691156-993599a55057f963ae7c0d0e12bd33da.npy +03636649-a138582b1d0b9cbb137af984a9f45d65.npy +04256520-54a209955f7a47bed8e8a8a207ee5bd2.npy +04379243-18c8f6ded2f14010746cec00e236149d.npy +03636649-4ed37408e5bb257ee356f23093e95c53.npy +02691156-298d674a14dcd356de6e2d41bcaaecbf.npy +03593526-d0be31319409de673ce0d177711e253.npy +04379243-23fdefbb27881722b0f92c9828c358.npy +02871439-b574e0258d18f4a283f3fdd3a2f8d59.npy +02876657-74221bae887b0e801ab89e10ca4a3aec.npy +04530566-dcd17bd79acb60f3ac8108ca15b709b.npy +03001627-658602dd0da08614a1b6f261c8f1ae0b.npy +04379243-5c2c29fd07c365afe5c65540d3456093.npy +03211117-ed7e0817614b1c155e7087f2d9a278a9.npy +02880940-a0ac0c76dbb4b7685430c0f7a585e679.npy +03001627-d75a219d343d2469e22abcbea1db98d0.npy +03513137-20ba624db264002082ee371ba207c717.npy +04256520-b0b942c484db4fd7afb07a946d621b3c.npy +04379243-6152e14b042aa17546f41dc2aaef556b.npy +03593526-ae9e1f9ff5b492524dff7c27c1f6df72.npy +04530566-36b38fd918d01c6b6c63b8b48495261a.npy +02828884-d014dd996cb7b8ba4f34c3dabeae093.npy +04379243-4cf6260ddc4e1ffc2ec2c1c65e9866d.npy +04379243-a95176f3c7a102acdfb197c00c97d72b.npy +03636649-bd9b0dc06cbe7b123c8d0fdfb1cc2535.npy +02958343-7af4a575dc3883afab355379ede04b04.npy +03001627-da7aeb7a73f298329940c34828c5731f.npy +03636649-13c361b7b046fe9f35b0d1c9f81f0b6c.npy +04379243-20ab56e8a819c7f06a9633583f89b17f.npy +03001627-e18776689e00c8b84f871aa82358858b.npy +04379243-812a19a717fb5bf34510596cb4be6a33.npy +04004475-b2330f57a3743c90b713df0d260c2628.npy +03001627-d080bfadaee310d8a21e3ca11c5bc05e.npy +02958343-212685bfc2a32cd9fe8cfdfb3bfc3376.npy +03467517-7eba657565cc69e913f86abea5e4b9e0.npy +02880940-be3c2533130dd3da55f46d55537192b6.npy +02828884-4814cb73a71235dbf155d75bbf62b80.npy +02828884-7d865d0774f34972814c9aa90ee14e.npy +03593526-57693fd44e597bd8fed792cc021b4e66.npy +04401088-f022d7789de219e1fb7ad0eb0a148aa8.npy +03467517-feaacb1b8c140e5ff962b6de585c4677.npy +03211117-e1eac12837bcadcf44d2fe7d13c65f0c.npy +04379243-6ed257cfcd73fc6830bbd4cddd04c77b.npy +03001627-8abd5158ec94dfd8924bf081da6f024c.npy +02828884-54650f6fee0e76b8b173657dabb4301e.npy +04379243-3b4dede09e8125639d653bd9cc95fa15.npy +04256520-dac6d5f66189b340d4ffe37a3ab73512.npy +03948459-1b8adaf6f8c40366c416aa58a067b7bc.npy +04256520-12cd30f7f83f441dc13b22d2a852f9c2.npy +03593526-2da4d88435eaab6aa7f0dc86456c3021.npy +03691459-f2eb4b53ea11200cfb10a282776be584.npy +02933112-12bb12017516f20d28b780bf7c8edf1d.npy +04401088-41d95e8979b8377d251f8cf5c284bd7e.npy +04401088-a3c1c9fc390b1bbbb099170e6f5a4af9.npy +03593526-7bcc0e91bd43908df4a06efdbafdd7ea.npy +03211117-faf54bcb640753a28c6daa755196a36.npy +03001627-6b9dc32e4d278663c8687ff9b0b4e4ac.npy +03211117-722df1da5778d45b1e43523279c7f09f.npy +04401088-5e485b1ae058fc11b26a5d88c8b02ed9.npy +04379243-2fad51052bae2366377b9297f3055210.npy +02924116-dff59b81f0eff60c8c5004350953aeed.npy +04379243-d35a2fb01107b6178727c7a6ed7a8927.npy +04379243-469122d4947cf83ee6942c5426df6055.npy +04090263-6e157a5e034eb9f49f433921788191f3.npy +02958343-76cd991287a5aac9acc9e84c45e9a610.npy +04379243-1ddbe75f64683937f4b6538438a0b930.npy +03636649-fa6b1702f7c1fa191b17743c18fb63dc.npy +04379243-ecf3d40b14300d3c0c26b04b6b8e17a.npy +04530566-355a85d0156984c75e559927dcb9417c.npy +03211117-59580147939bcb7e8b296db8a8f00728.npy +02828884-cb48fccedaee0e82368bd71100fb3a30.npy +03001627-d15c94b08b5d92e57962800be79c6e52.npy +03001627-4bd7a49e63e0e97936e3b2fa8d1eb4eb.npy +03046257-7e322702d66d54b560d9b527752ac99f.npy +03710193-1954c0e02dafb95291389b3c4840180b.npy +02958343-db86af2bec3e48d7beda80d430b92891.npy +04401088-280c7836d6302b4bf3f8467cb6fe657e.npy +03001627-4b79197258fad3363efeda73d60343e4.npy +02828884-a8a6aed819779d6b19fb4103277a6b93.npy +02808440-bab85a8a0338b58e3321831d2245cf06.npy +02933112-932abcefa2fa0d5960e37b3f76995f8b.npy +03001627-bcf67dfcbd6c1fe7da8e9e0272759299.npy +04379243-5640f565daac3dd3772b104757a4809.npy +04379243-a6f69bef589c295d51ef8c8b1fdb41ce.npy +03467517-ed486c24321fcddaa3d3eb77b119df6d.npy +03001627-74391d05121df162492d9da2668ec34c.npy +02828884-79b66254a33c4a80e68b7becf68bd6d3.npy +04379243-89e73205e8d18a8c99e8bf807e902261.npy +02691156-471ca950dbdf0c6c5f80f808704d6409.npy +04379243-3f1579c1713ae72e2d07d128adae16ff.npy +02691156-e45d71c7afb3cb1c67629418bd553f95.npy +04379243-e7adfbfabcafa394278f90ef85162deb.npy +03211117-6856b84c3a8463e3d5f7c62c7dfe63f9.npy +03636649-583a5a163e59e16da523f74182db8f2.npy +04379243-6c6f63434cc1f447f51f77a6d7299806.npy +04460130-6d43d4642c7a474638cd8eb23853c009.npy +04379243-2f5f32ab1652320dba18ade30e563d37.npy +03991062-eafe716a8ab5722278caa162a41a851e.npy +03691459-46ab468d333233b062a6cf00d929f875.npy +04379243-d16bb369a03f260cc48d90eef8384210.npy +02828884-498ef3fb51503dc36e07666ce67ff5a.npy +02924116-ac2444d4255279548a7522bf08a9766c.npy +02992529-efed528241cd773fa2c7c5886f4bbc93.npy +04379243-98b3a7df1e233ac7ff10e98a19606836.npy +04256520-a702d178064c7b81fc078d27c856022.npy +04379243-e42e2c616f8c38619ccce4c6d5bb195f.npy +04379243-3f80c1ddfce08d18525211e12d56c55f.npy +03001627-40a9dd43155979e7c40cffb9454b27e.npy +04379243-574447022c4473d455f46d55537192b6.npy +04530566-e604463b6c45712395ea46728bcdc15d.npy +02691156-b3323a51c2c1af9937678474be485ca.npy +03642806-476cd9a7a0a7c491c96e2e556a25ab0c.npy +03325088-ae3c54f6a88813d214b35a7d7cea7130.npy +04379243-496de03106abdf4ba766a367d5e2d6fc.npy +03001627-1e1151a459002e85508f812891696df0.npy +02958343-115170b8b44f9e2e5b2bb28aa7453162.npy +04379243-c20a5f8cfa29824b310af74324aae27f.npy +04256520-1b8894ce5f53e0007143b902ce4e435d.npy +04379243-689c4f50ce0aae27908caac6d5f8ca97.npy +02958343-9c827e532de4967285089a13cc567dbd.npy +04379243-c29a4a7506b89be2af4d0d91ea903469.npy +02828884-6c1ca36830d54ca5c9736640ccf985f5.npy +03207941-b187206fe6ed4228a805114916841d69.npy +03624134-20050969c1d7134cf69ec30ab244a145.npy +02828884-702870d836ea3bf32056b4bd5d870b47.npy +04401088-a6b2c1427dec317525bf2427892579c7.npy +02691156-d1e81c9479eb1b7da9263338bcc7d067.npy +02773838-e1838a13ace989545de21284bb515a83.npy +03928116-9071693a85f8425790845915a86bf9b9.npy +02933112-eaf341c056c79bec1a2c782fdbf60db6.npy +02871439-aa0bab8405274a3568966ba896bb15dd.npy +02958343-f1a20b5b20366d5378df335b5e4f64d1.npy +03636649-994e14ddae6f642ca0a1df19404132e9.npy +02691156-820ba20e5da8325f19ba010ddb4974fe.npy +03001627-b16f1858c1a7c0a65001cb19c4a0eee4.npy +02801938-526a9f51fe93659c3c140c326fab0b5b.npy +02958343-707c8930b987b1f3a6c0381be0943b0e.npy +03325088-1c0b65c18b56fc71a6c6cdd30dc62f82.npy +02691156-a331e93c3184742853a6ddb5892da51a.npy +02828884-22af1585e38e4e76ad5067eac75a07f7.npy +02828884-931017bd80aa7a90edccc47bf0dcf5d3.npy +02828884-ca85baab8740ffa198cd58ee93c42c40.npy +02828884-e8db4ae7ddd84627d4d8765e3910f617.npy +04256520-930873705bff9098e6e46d06d31ee634.npy +04379243-9160a9dc1c840e79c607634b4693f04f.npy +04090263-58b926ca85b6ea549a6e43b878d5b335.npy +02843684-5919f39dbe6c9351d474325246d1c061.npy +02808440-11fccf143d5209c71c17aef130ed6213.npy +04530566-6a541c64083d2bb9c5408f4f799fe72.npy +04379243-2a0f853dadd841f96f1e07a56c129dfc.npy +02958343-501ac8493044eff04d44f5db04bf14b8.npy +04379243-84d8b1ce802662984fa8d6439169bda4.npy +02828884-10b43623dbc8ab25ad5067eac75a07f7.npy +02958343-316086c3587f9c07d4db32f454eb6c4e.npy +04379243-1a8a796da899cb2c4d672fe014b9000e.npy +03001627-bdc892547cceb2ef34dedfee80b7006.npy +02992529-9cc581a6c5d0b8fcc14f5d127de947a6.npy +03001627-588bf81e78829fe7a16baf954c1d99bc.npy +02933112-7415fc8bf90b3696bc08b7cef3268bb.npy +03001627-802f70c906274da08616812464c86290.npy +03636649-19fc4044912f5cc4869594a32151bfdf.npy +02958343-b35117b7e025a012bda733a39f84326d.npy +04379243-c12ab3b5a8d40626c6027d1f057f82f5.npy +02958343-5dc3ec70f394965368d733072f36728.npy +03691459-af7aded6c26d2b119d3f10ce46ef328c.npy +04379243-1a96d308eef57195efaa61516f88b67.npy +03001627-b2d91caf3615a9a7f51f77a6d7299806.npy +03624134-c7a96262d5dfc1ae72c447ef6e5cffc2.npy +04379243-8d143c8169ed42ada6fee8e2140acec9.npy +03046257-30bfa6b225b030ba3756a875bf156f26.npy +04401088-678ec09bbde5f116716c29316ac4d0a0.npy +04530566-29af666e04825f66576378847ca0b69.npy +04090263-85e714acb678fc59ed6071560148e6eb.npy +04090263-945564d4497f3a0398838fdf70b3e60.npy +04090263-6eda9bcd1c2f4c8fa33c2b3fad570e45.npy +04256520-bf837b5821d05c00efe1cfa376f050c5.npy +02691156-845364350601ca0cbdf0b44e2f8f4e6d.npy +04401088-d2bce5fd1fd04beeb3db4664acec42ef.npy +04379243-b9ac8f3615d8ba0bf51f77a6d7299806.npy +02933112-7206545c3f0a3070e8058cf23f6382c1.npy +03211117-dcd4d3d6bbbabdc6376c487287ae2b71.npy +03642806-298cf1c20abcd641f9f562601150287.npy +04379243-35bce0bd439e04e63d039fd0dc042dcf.npy +03001627-cffe40b41d0162c46b2befe83a0efe39.npy +03001627-b7d4357aa24126a227a7baff096e3087.npy +04530566-2b1d09f8412f647899c0080e6a5589fa.npy +02933112-5d8c63fce0f30a46f251828d7c328331.npy +02828884-a5856a7738262b05738e43095496b061.npy +03001627-ef5eb51bbb7141c119fb4103277a6b93.npy +04401088-5fe99904fa4b22d4ff1911c2640f2e42.npy +03001627-1b81441b7e597235d61420a53a0cb96d.npy +04379243-631a942d7b87387019fb4103277a6b93.npy +02933112-646fa7efaaef21a41d20b5ad5ef1cb1b.npy +04090263-85d9133c2be9be93d017eaebc1ed8e2a.npy +04090263-702b1c4aac9e825f51cfdb4c9f126c12.npy +04401088-92ec69548761efc61f74e5d5bf005208.npy +02880940-bed9f618bef8d3e9f6d436d018e2b50f.npy +04379243-f992b2e0e44987698cb5d9909aeb1309.npy +03691459-dfc293d76992ed9656fd7f904d2e0c.npy +02924116-7e62538347c521325f7a2a8b8d62d402.npy +04256520-a27b9f94d052176af27383fc5a5a711c.npy +03001627-20627f21d8681503f2aa3fc45e8202cf.npy +03624134-6d542cef32a690f248c2fa4fb6bd3e62.npy +03046257-9986c03f7d7e8ed111d1123cebe2740b.npy +02828884-70edb39bb2710eebcb2a965e75be701c.npy +04379243-bf45b5c2c9dd8fa9fa24672a35ae8bb.npy +03636649-571137d6378372c5fcb8d8c6d4df8143.npy +04090263-1a289f162d63c0fa8dba2b86f956c537.npy +04090263-feeb8220f21521d4b4c6d1a32dc4f554.npy +03001627-b6de66042941f5691301e24e9e27a9c3.npy +02818832-de14f6786ddc7e11bd83c80a89cb8f94.npy +03001627-4a24652fbf2bed7e93583c67df8faf1.npy +03691459-8e54ec9d554584cfdfa0db1c1e10ab1a.npy +02933112-28b381915e04c62934b6da227fd64942.npy +03001627-e5da52f5d1ae95f75a8ae8f7c307d01c.npy +02924116-4fdc02421954e0fbc08550bf6ec9e732.npy +03001627-2aa2d2bb646fdc511b7ca0421af5a45e.npy +02871439-699468993d0ab5cb98d5fc0473d00a1c.npy +02958343-e3cf84131f9293a5ea0b6fe51a588e07.npy +02958343-e5247d798b4538094046e8fe9dfc34b5.npy +04256520-9c868997ced1aec1dd904956425d1eae.npy +03001627-bf37159b9ca55259e6fe3612af521500.npy +04090263-1711fdba3382cc39fa9286f039319ff7.npy +02843684-bfb6e6472e91e0148ac033353d37592a.npy +03636649-bf3e47e405833ab715655d3195f5022b.npy +04256520-6e3771d48b3982d0eca22c501ad0a77a.npy +02992529-ae7098f0bc20cc6b2a87aa332da7bee6.npy +04330267-898c20d376d7d44e5eb64c1003065596.npy +03691459-3b63777e658e7137f36ecf951968a8b0.npy +04379243-20e5bb165c5e129ea5a11194083a61e7.npy +02954340-fd63218d927ae58cbf444790f25ea3db.npy +04225987-e7c330f4c4421dbb24e49a3e82c3d033.npy +04090263-9bd4ef716fa467a6c72189e41b1941d4.npy +04256520-5a99fcbf7ad93010ebc1a7ae7c4c250d.npy +03624134-5da598733fda1b7aea5aa8dfe86aec5e.npy +02808440-4decc1afdd1eb8494c62bee40dcdc539.npy +04379243-25775a3ee25c6503dddd8ce1cda8c6d9.npy +03001627-e6778535d7fcbf6fff16555386d173d.npy +03624134-79e64f242e7101fdce92dcedd9b9f51a.npy +04379243-177c1102dd46badce958df2e8332e31c.npy +04379243-6d5aaba9f6dafca977252fffd1947df5.npy +02828884-35686cf1e7db69d580be56c7b04dd6f0.npy +02958343-974c3d82f8726f086b418c7d9fedcaa9.npy +04379243-927dbeedb2d864d635dda488a4bbb1e1.npy +03624134-b0f9aad955aebe6759d0a47cd36512.npy +02691156-cae48a376cb607547d3b11085e75c7ad.npy +03211117-195d9d0305fd1625679efbdc830f6d0e.npy +02958343-d060adfab4c02ec616abce8cb03e7794.npy +04530566-fe24ea1bc3383631370d3273b84cb8bf.npy +04090263-5dcda2b98242d00b55f41a702b987e76.npy +03325088-bedc697875ba693676c18e71fd49c4dc.npy +03001627-4304100faeef130337f67f4322e8d3d0.npy +02691156-d9d282f79262ebd4c3a35cee92bb95b.npy +04256520-54506969a60017ac8f0a57a8b9390a.npy +02691156-59b8d36b0f96aa5cca649c0959202cf.npy +04460130-17f5482dd8b9dbddc850800ac472a578.npy +04530566-a6d232b7443609fd20ded1536778b0f.npy +03211117-11c041a780cd7e58e8b612d9fc824411.npy +02691156-77dfd8d4ee3c54c3e99ea3c41458bc01.npy +03636649-f69d3903096b6bb78ca4aeb5e3b33af7.npy +04530566-933382c8b6cc6e24f0cdce9bd16b6c9a.npy +03636649-ac1e6d46bfff76a664b3b9b23ddfcbc.npy +03691459-91b781b40d32b74dc491effd0ae881ea.npy +03046257-4593877d0b238443728b983f64e482fa.npy +04004475-d3ea7b61f5fefcb59983625c07de3812.npy +02691156-a55a46c1442470aeace5721ccacba16.npy +03636649-6512e3a8e6566fd0cf004563556ddb36.npy +04379243-b4bc3e5192dc476f609fb05dbd8681bd.npy +03642806-28fbfd8b8c9c6f16e1e44e2fc05361d9.npy +02828884-7a89313a148bf1bfcb2a965e75be701c.npy +02828884-7229a4c3b3146f74d838ae16242881dc.npy +04401088-57ff44f979370766976fab5d6e2569c1.npy +03211117-182a5ccd3c0c9887c21c5d9d91c5c9b5.npy +04256520-b090f9315fc9e0cf9936c7914e42d921.npy +03991062-b384f62a88a2e5a8a127ca53341bcf9e.npy +03001627-c472a815afff5ff0e6c5cd45aa112726.npy +03991062-f794d82d7be73b1a9f7e329438453d00.npy +04530566-cfb7ca78b0b65c4f2d615e80824301ca.npy +02691156-a922f408bb1b1ea1f2cb090f7f07d463.npy +02747177-b03989e0afe2443581faebbdea6bd9be.npy +03337140-bff01605583f2d7af84b0be7f50940eb.npy +04530566-e3431dc06c6f4c22441d5d15cc0399df.npy +03046257-686a205c36f5c85443ee5a34155b4f2b.npy +02958343-ed4fb30733bd0979b1bb46d2556ba67d.npy +04379243-dc6f030d9ee566a5dcfcef693e7ec696.npy +02691156-4992d4c425b3cb426e8204b21fc3574b.npy +03046257-4936b4d8dfbdf2cdbd09663b97413cd.npy +02958343-6056451a4b65a12858dbdf2b5c6acfca.npy +04379243-b4ca27e38b327aa0240c1f0f1e25335.npy +02828884-a82c14ef1540d3abf4c42dc386169bd6.npy +04256520-c2d78f31b197e0bce2d881f085d6d86d.npy +02828884-c96afd58ad067a6871b66f80cfaa9877.npy +02958343-63599f1dc1511c25d76439fb95cdd2ed.npy +04379243-d9b418e6ec14dbf50efffb055ed6bd1.npy +02691156-da5fda29d2415fb09d92b4de623f5639.npy +02808440-fcf0ef94d568f97054d7082b34825ef0.npy +04004475-e3898229d4bac27b15a34fa27bdf3d03.npy +04379243-ce8fc9bf9c9fe3ce99e434a62f00f7de.npy +03001627-914f301fd07c20c840ef1c8b63a628f9.npy +03001627-95ff15679bc2d2bfab41e4eb455c2269.npy +03001627-df23ca11080bb439676c272956dad3c2.npy +04401088-fd1dd7c841cd9cf51f05b3da5aad55f7.npy +03593526-1d4a469bdb53d3f77a3f900e0a6f2d83.npy +03636649-107b8c870eade2481735ea0e092a805a.npy +03636649-e7310381c64cd87f8880edc6251fa529.npy +03636649-777a686890d74b350359b4e03cfdfa.npy +04256520-b8469c14aeb092f74fde46457697d80.npy +02924116-9e75756bd1bb8ebaafe1d4530f4c6e24.npy +03001627-4facf9c7f5555b28c0f947750540fb22.npy +03001627-477dfe89f1d5df337fa68300c57bff0a.npy +04379243-88b217db267f1ec61e616612e30565e8.npy +04379243-b04a4cb79890c846ab7f9d2da6fc61cf.npy +03325088-af708fe6eac1bc9450da8b99982a3057.npy +02942699-f1540b3d6da38fbf1d908355fc20d631.npy +04090263-d835a2aa71cfd29dff790997f2048517.npy +04468005-d928c4ee5ef8f84e186582d606e06e65.npy +04379243-29c6a184dfee3050820018801b237b3d.npy +04256520-dd3d82569d4cb2b5af140afd78cbb542.npy +02691156-7981eae34c05e8409a6e43b878d5b335.npy +03001627-434405216f00c9654b0375f3afdcad10.npy +04554684-177501db32f76aa4a2ef01d38c90dbd6.npy +03691459-a551777c3b35c06f43f491729931f44.npy +03001627-43cc05f81df8307a4357a62465045ec4.npy +02828884-9da3d1f848bb801c77ec6cec7835f07c.npy +03001627-633110fedf1efac0f7628281ecb18112.npy +03001627-d89e39192db6fa78492d9da2668ec34c.npy +03467517-df25fdb2b8ceac673b2deb8c31cb5d73.npy +03001627-9d63d69501b9ab9067994ca435825ef.npy +04401088-8cac6df50c515c498be6bc9d57b6a438.npy +04379243-d93d1957e7a38a6619fb4103277a6b93.npy +02747177-c5c2a3f8d66cdaf7ad5067eac75a07f7.npy +03001627-195464ae11f6bfe1cba091e036bf65ed.npy +02691156-90bd96c05c0208c642d1180c659735fe.npy +03790512-b4112da294c1febf65c8f8f77b16f337.npy +03337140-229a34f1529c4ac14c3aee8e9d3a6ffa.npy +03691459-e41aab211af3f84673e1b2d018c0512.npy +04379243-6f019fe6ab60a3e37b11ae648ea92233.npy +04401088-da1fcb7a374f9c43397c13131c65cbca.npy +04379243-216da8313bc7b192ab610b0c94236463.npy +04379243-9e22ea3530631b5e95937f6e581cbd41.npy +03797390-b9004dcda66abf95b99d2a3bbaea842a.npy +03636649-3fb39b80530c18842417a6b5541e7395.npy +04379243-4b1744fbbe73dfb39ccce4c6d5bb195f.npy +04530566-54daf1472c51bb47a97a590141e0046.npy +03046257-9b28217f38c32415e02c50e637560d85.npy +04460130-58695979fe916c43327144edfb578d92.npy +02691156-1490a4ae04d453784f856435f28995af.npy +03636649-3f6e9d27bf0e972b9f42325587eab087.npy +04090263-18271afb4b31686bb53dcfbf8e62caa2.npy +04090263-b50f6037b0f9b86879d9900c00629c24.npy +04401088-5b7901974a37066aee44e0ef4ed60fd.npy +03991062-3e2dd918360309554b3c42e318f3affc.npy +02880940-da5f13f4048dbd72fcb8d8c6d4df8143.npy +02958343-ebb3c22708c9ad3a55064a110bff2f03.npy +03001627-b2ded1854643f1451c1b3b2ed8d13bf8.npy +03001627-586f09dd66df0beb2f45520e48bbfc3e.npy +03001627-4f7e9b96404fe19af37f22e93a631b3a.npy +04379243-4315e96a1dbf9337cacf13745dbfd112.npy +02958343-d2e1dc21db9b45df6436916a86a90ed7.npy +04379243-15b0e9fbea6581354ea9b65fc2574d0a.npy +03001627-253ca5aa292b344b7e673473caa41d7f.npy +04379243-3ac69f9e2517f836a341228b21d337a9.npy +03001627-ae3b4195dfa9779f89e49c5729fd5d6c.npy +04379243-9330bd524773fa17915e97a8e8ae6c48.npy +02691156-9fe677b21938f6bfcc14f1e6f4f4f49b.npy +04090263-2a811e61b3d6ce11c45f65ad2adf422c.npy +04256520-88d523dbcd94be8a4af957103f4767ac.npy +03593526-4cd2f74d052b561952e2d18963a75b4d.npy +03636649-573500f52762f0ea8485cf03cd00c621.npy +03691459-f3f07513f7deb6d1e4ad2926a22bd27d.npy +03624134-b31cf3ccb489ba2e7b635ec9828c6ec2.npy +04379243-44e9b15e214b390b2b70eac6546e93fd.npy +04379243-5067a85ef67c2e45ed403132b02528bd.npy +03593526-a791d4fa1d840408c5beea20858a99d5.npy +04379243-acfadff8f5ab4e7880d6227ff9b21190.npy +02747177-c461a147d5dea8152e91d3ee7cb428f0.npy +03211117-ffc9068c8de1fe46d9869786ff7f6a46.npy +03001627-908fd690e253f651f1783a44a88d6274.npy +03001627-6f11d4ab55b7a63e261fd7080fd6f759.npy +04379243-ecdebac7ddf6ef0011c50f6f633c5e38.npy +03001627-37e2b82d5e9dde21cbde89e0c48a01bf.npy +03636649-cb4b887b5acd27cde76bc197b3a3ffc0.npy +04401088-3bdd569911660da81229c79e4cce736a.npy +03991062-d1ed787e654dd0ff25ebd1cd0b422e32.npy +03001627-3730f9cc29006f4b65ba78ad9601cf1b.npy +03001627-cd6d000df66f03368ce66f12ba927a2b.npy +03211117-1984fb95afb6dae5804722305621f918.npy +03636649-26316fabe129210317fad902853ecfd7.npy +03001627-6893a0aac52e31a3578fec929fed235d.npy +02747177-e19887ca50862a434c86b1fdc94892eb.npy +04379243-1d393a06a5cf567d3892cfdb72a66fb4.npy +04379243-8cfe3ff92244310534506cc3910614fe.npy +04379243-92ed9344484dd026dfd21203bf8b4b46.npy +04256520-47dfe5f98cc9075850336112dffe8551.npy +02747177-af32b6f5a0343c107c35d3c5d3b1fcf7.npy +03001627-ef3377832d90dbbacfe150564cb24aad.npy +03001627-cee5c4ec2b284e7317b431cae0dd70ed.npy +03636649-ce621e6df1ab9ae35d2cdb96c1afe34.npy +04090263-dc29aaf86b072eaf1c4b0f7f86417492.npy +04379243-1b70ae39748f9b97456cbf78e1e89022.npy +04401088-5050d6be55dbb7cbbf82a0d508a096d3.npy +03636649-f018f4d78d295ef3a78d991d8e8834d0.npy +03001627-d2fe67741e0f3cc845613f5c2df1029a.npy +04256520-9ae05089e29678adeeacda4374ad94cf.npy +03325088-9fca1d6653e2bcc914b35a7d7cea7130.npy +03001627-fbd48960edc73ef0490ad276cd2af3a4.npy +03636649-d9e6815b6af181cab76e29c9c43bc7aa.npy +04256520-1d6250cafc410fdfe8058cf23f6382c1.npy +04530566-3679338b5a90bbf5fd1d4880da709562.npy +03337140-7dc4c1459f2aeaa6eea9d91e5bfcfc8e.npy +04379243-3f198d5bb97b930c87e847ff3a8836f1.npy +02691156-f858fdc6841407e6d4bf37afb4832e7b.npy +02958343-67aebe9ff1f103e18d1e606155667e23.npy +04379243-4ed5863efaae348d8b773535ea8cba6d.npy +02691156-e814190f683946b798b4e13cd6d24c30.npy +02933112-3e52f25b8f66d9a8adf3df9d9e46d0.npy +02958343-a8ee57eddfe30b35553fca48ce732862.npy +04530566-eb8569cf15db1dac1640aadca4c54050.npy +03001627-28bdf067b9fea968f17e3402958be9f.npy +02933112-ca0fd2a5d6aa32945aeac558fa5c869b.npy +04256520-8c6d7c225ba8a152387133b1607f2aef.npy +04090263-84149440704cddbed735fa1ab17311ec.npy +03001627-e46d1c2bef1875e2ed30b335ddc8b66b.npy +02876657-4b5f54fc4e629371cf078dc7b29022e6.npy +04379243-ca577373ec8bbddc7730743b6aaccb6f.npy +03948459-8ae24c618fe450d9ad047ee0c12cdcc1.npy +03325088-3ca7d12fe0b4fc5d3321831d2245cf06.npy +03211117-9d9bfaf1a4d6c3a05f8ab9d7b9f9d24a.npy +02828884-55f637ec7432a97d1d677cb74bd6536a.npy +04090263-1c74382abb0281e26314c3b6a3a65519.npy +04379243-34d280e8968c180cdf63d1c7e43c783f.npy +04256520-fae52eb61560b246f8555ec936cd4b63.npy +04379243-40b632472f8e69a7664b3b9b23ddfcbc.npy +02958343-ae086c610d023693d8a99964311c4152.npy +04530566-abdd2218a607a19819194900293f58f0.npy +03211117-246f0b722dff7f16fb7ec8bd3f8b241d.npy +04256520-cd10e95d1501ed6719fb4103277a6b93.npy +02691156-8615fe6e2a959ac1efe5f291bc2f5fd0.npy +03001627-6ae8076b0f9c74199c2009e4fd70d135.npy +04468005-3a5753b332b0b735d85b408a8edc983b.npy +04379243-8807a8fdc7a08a0fb664d1885442ba70.npy +04379243-104ebf7f96c77fb46a0faccc2a4015d8.npy +03593526-67f7d931a1796b97331dae093cef31.npy +02958343-156d4748560997c9a848f24544821b25.npy +03001627-562e6354049ecbc19f8f9f2bcc40c84c.npy +02691156-50d2629e7e96c2883034111f96c5f617.npy +03001627-36cb782fbc164ac312591a3ac05fadf1.npy +03642806-4bacb1694e86005afb6e846333373df8.npy +02933112-4d9152d6df9883529c75eb4326997fae.npy +04330267-82cdf477807e2af5eb64c1003065596.npy +03467517-345a9c0aee179a2293a3cb7ad5bbfafa.npy +03001627-3fae0625f3cf5e862678f553478310df.npy +04379243-bacef6e42574bc25d43cd8b5619b5cb8.npy +04074963-d9ca2dcaf1d9d850dc605801df3f66ec.npy +03642806-35462b6ea0597bf555e8ddeaf1791474.npy +04090263-4defda42f01b1345119486cb086a6c5c.npy +04468005-e2e07adb05ebc0a14c213c1a52c1de2c.npy +02691156-372c95e7685363ca18e0889038e4fb6.npy +04530566-2570f4db767fa046760fb52676c518d9.npy +03211117-34d998b1845880795b1895ac674412c5.npy +02958343-37e8db361d61971b184a07a6c7fa882a.npy +03001627-d4d7607336810a548b95c9b52cba3b9d.npy +02958343-dab0cd8adac9404780575af49bfeda6.npy +03691459-ed0c530e245dfdb269d48411e34c9daa.npy +03593526-eb7d628a0c635eff5ca1f314f1afc186.npy +02828884-78c7cee6016d8dba2056b4bd5d870b47.npy +03001627-baee1a3918353466d1d10c27b779ddcc.npy +02933112-21a6906ec6cc806182db9fca4b68095.npy +03001627-6f6191af40bfc07116f5e76c24d541f3.npy +02691156-f0bd0660d9cec23cf2b0736dd4d8afe0.npy +02828884-adf284153a2a87208c9b655484c84004.npy +04530566-a32082d31b6b9a0566dd4c46ee29f5d0.npy +04256520-c955e564c9a73650f78bdf37d618e97e.npy +04379243-31678ef74b85de0b15b943c35c765be0.npy +02876657-6e57c665a47d7d7730612f5c0ef21eb8.npy +03211117-5e0fe73a4d919b1af5f79806bd65844f.npy +03948459-139ecc9b5ec25ea77a9772e56db4cd44.npy +03642806-fdf791fbb8fc7cb58ca8637757ac3f67.npy +04530566-7d997dbaf47acf92866219ff4a62ebc4.npy +04468005-1fe869656812f5b0d85b408a8edc983b.npy +04530566-f1800fb3a9873af1e64f09105f9c8a56.npy +03467517-96b506f34b6ed188b470346f25b26583.npy +02924116-9bb3fe269e2356a983e4699e0a71dab6.npy +04379243-6eb9e1ec0365f5cce7e684d25d4dcaf0.npy +03337140-e877142c58eb5b03f2e2911dd34dc68a.npy +02808440-8662ec01d9c580827ac6ce513ae497d3.npy +03513137-6fea034555e60897e9fed33f81b1fa79.npy +02808440-d1ad479b9c04a9e6ae410fdebd404ac2.npy +02828884-6ef84eb436bf63de8e7865f75f64bf68.npy +04379243-133f18648797d149e27790b0ec8671f7.npy +03636649-42fa87cd27edca9efcb8d8c6d4df8143.npy +04401088-e633f997f4a47b2d727a08b50053320e.npy +04379243-9431f50b757b81fb15e0f0bc4a421e4a.npy +03001627-184c07776b38d92e35836c728d324152.npy +02958343-292ade37cba7f109e5eb989e223f7e7e.npy +03001627-bca76c4925b9a33177a7d775ec38a82c.npy +02828884-fc6c2a011ba0997cdccf03d91dc58d38.npy +02924116-570b7043031f05b6601e240e768fce7b.npy +03001627-beeb89082b38c83c992640a67216b77.npy +04379243-826b18241c9c2fa83eeddbccbf885e99.npy +02828884-9d0eb5ca2d849ff01f9ede15ab569b5f.npy +04379243-37f1637edfc6ca5ef51f77a6d7299806.npy +02828884-5aa59235750d4dce9953235c64bd990.npy +03001627-c7542e15626489adab4faba16579e3d8.npy +02958343-bca97563f170ff4ad2bcce019eeaafbe.npy +04090263-3ed5ea03e0eee521bc6e84bc30e573cd.npy +04090263-d07b1082474dfc9889172d41dca064d9.npy +04379243-54215af9f13cbb0c62d6ddeaf5a29144.npy +04379243-b444c5e5488806439b9e80c00bcf83a0.npy +03046257-aea16490befe0ce676e9713f57a5fcb6.npy +02828884-9f757c0acb5264f665ba78ad9601cf1b.npy +04401088-effeac02fe96f769146071e83265f12e.npy +04256520-2723924e712ccf1b98f5bccb3529a48d.npy +04401088-76a4a3e8370bdc24bd2d4107e8dc02b8.npy +02933112-19e444da148930154692707833167ca3.npy +04379243-4ba0563454fc10f365f5f793afed824e.npy +04401088-c8948cb8ec0f10ebc2287ee053005989.npy +04379243-fcf0e9c2aed826c7fdb2052f1980b788.npy +03001627-d6075b23895c7d0880e85c92fa2351f7.npy +02933112-5a935225ccc57f09e6a4ada36a392e0.npy +02808440-99fcd275c9f57ae044221bef0fa3c36b.npy +03624134-cbc6636d399803d1276c3d558130f8b4.npy +03046257-a630e09afe21e711f51f77a6d7299806.npy +02924116-c2c5217043ec617952470de2774d6099.npy +04256520-d3b0fe62f115f0588bd90ebf95555835.npy +03636649-35975525ec3d835046f58f62995211d4.npy +03636649-5f7abec29905605b1a19392327642641.npy +03001627-c53054060b5fb91beb0fe7d6b5545a1a.npy +04379243-14be1ed92182d2da722332c7d77935ea.npy +04256520-f551048075b5042d7d6d37ceb4807b31.npy +03691459-800a0a91308845b4519f3f3e6cd6d1a6.npy +03691459-16f4517d129ed54fd747b49524a1246e.npy +02992529-d7b2a9546b6f68bfd0659574aaccef0b.npy +04090263-3db828bb2a32a5f356c95a1e5409420d.npy +04379243-9f5ac902975f409e820018801b237b3d.npy +03085013-18a5269c99053eff1aea59cd55c902b0.npy +02958343-c2d2e3f46f7cc1e8ba69e14689f7b974.npy +04530566-a7707ea8482e4c3f925ef26228f6f62.npy +02933112-7eecf98d3b8f93a684c210032662e046.npy +02958343-a17d5aa16a529a88cbc76a30015552a.npy +03325088-35fa2ea1fc9f855e14b35a7d7cea7130.npy +04090263-7c53d8e4c566843b1e262ec64ad2c6c7.npy +04530566-921a5d88994aa99c71327f667b2179b0.npy +02691156-dbab9feed7e936cfa87372b03d6dc78b.npy +03001627-3fa2fccd96f3e5b5347185e772ead5bd.npy +02691156-2988a7a566ea79797209009cfb89d4bd.npy +04379243-e98dcd0334fa639fef9f898cda0ff409.npy +03691459-ebe84e8ccc8b5f3fa817854e3b5b5439.npy +02691156-57b5666dfe2607ea1025c08d338b6d83.npy +02933112-48b9fbf28fd33df5c59350d819542ec7.npy +04530566-799d446d33e604f990f7927ebadab5fc.npy +03001627-f83f1cbaf6c41a5db04cb542e2c50eb4.npy +04090263-f97e307455ce56a734e7e0c760ac1c0.npy +02691156-bdbc01a1bea50bdba6cb562d18000d3d.npy +02958343-e4c4167bc6b8e77dccdeba95a15fc6d1.npy +03001627-30e3af034e3dc084ddfd4f4b3d47049a.npy +04379243-4de6d195f07edbe5cd18e512cbf0ebf8.npy +02992529-29cf2bce2e67ae76264e721f309fb873.npy +04379243-c153d0d6b4fcf74f54a61dbdbc1ac262.npy +02958343-a7bc9db453e66329abc6b562f9bbf76.npy +02958343-36b23cc38786599285089a13cc567dbd.npy +04401088-35a0dc407f3df8d27450656ae41f00c0.npy +02958343-b4d7ad07dbcefefaafe1d4530f4c6e24.npy +03001627-4edfd09b8d7717cc579600e6ae92ac5e.npy +02808440-b3bd8f6d01d70f47b362845c6edb57fc.npy +03513137-3621cf047be0d1ae52fafb0cab311e6a.npy +02801938-3c06fb3595c39a4eeb6c29873b08c02.npy +03001627-426ab868a6acc7c6492d9da2668ec34c.npy +03001627-356fc758685e9054347185e772ead5bd.npy +04379243-a38405108fb416d8356ca1f9220b9968.npy +03636649-e487374a244b5f03b428462f49e66329.npy +04379243-20129f3c7b65b98b9856fa70a578baeb.npy +02958343-69492fdcd530eb3da6ce6972f601a2e9.npy +04379243-a7941c2ffe089884fff16555386d173d.npy +02828884-58e85d628f86aa897bd76190db9f54d7.npy +03001627-6dbe90994925f51c26fa92f330dec063.npy +02924116-83078ef9d6ef49315a50a5b89c58e20d.npy +04379243-a8da41b28b37833d14f6a05ceb8c1a6f.npy +02691156-4761e30dcb30471cf7d5cc24ec79e682.npy +04401088-3d1d0255e2163917f4ad1770263e7f39.npy +04379243-e047af849d703eb51933ffef19678834.npy +03001627-eb51e814c3f44a07914ced7dab3536b9.npy +03001627-c0857de5101f704f3c5e1addd9922bf2.npy +03624134-cab9d14dc07b7179cc34b900bb2492e.npy +03001627-a96226408895c2685e3c4d3bc6ac3be0.npy +02933112-28e7fd7a7a5ee8787d3ced6148bd0a15.npy +02691156-b6a1b55eb79a383542086bcdee59b1cf.npy +04379243-9d5718ed61c116ae4b3c42e318f3affc.npy +04090263-99c48010cc0c6405e1f2a1daf140ac9f.npy +04379243-868bab5194e93577858699aaad4acee4.npy +03001627-917e8fa5d1253398ca6a405498436716.npy +04379243-ff404f70bb77a5a876e4a31295619fa6.npy +02691156-2c64c521c114df40e51f766854841067.npy +04090263-3c42d32dee40f39a1ba59fe23593fa2e.npy +03797390-10c2b3eac377b9084b3c42e318f3affc.npy +04256520-9136172b17108d1ba7d0cc9b15400f65.npy +04379243-9bb7bbab61c5d4e947839bae1bc65257.npy +03467517-9a4d1c4535c3f3d2d872eaafa837d692.npy +02828884-d673c7ec4a08aa6db6f5e7b313e4eaae.npy +04256520-b0a85031201b0fb1df6cfab91d65bb91.npy +03001627-3ff879e891701079ea07bd8096c66582.npy +04530566-4e8a28d0659e430845aff212946058fc.npy +02992529-7d93b8dae79d5bbe7015d3b6f402d5a4.npy +03207941-a2ca291c8660a3465ea2d22d991d7d33.npy +03001627-d43f7db89fe864691e046801e2748f1a.npy +03001627-7fee792f0dc5d74cf2cf6a9bef44d625.npy +04401088-7cf110165b54e7511d3a21e67b7da85e.npy +03046257-e6e0cc99a9c6c104f51f77a6d7299806.npy +04379243-d3a1f88f644f36722f92c6319744ac70.npy +04379243-8b61fd451bb28c80c8bcf367bf7d8952.npy +02992529-bf8e0289ba786e97487d18402ebe69d5.npy +03001627-fba62693a28b2e4c43f1c519d66bb167.npy +02691156-4b623f70c9853080aac5531514d15662.npy +04090263-cadcb2e4e882ce75dd0a2071dde26395.npy +03325088-95cfff8a4333c320a70cb86be490e5e.npy +03467517-dbdf45cab0adbded1f260c1b356c52ce.npy +03001627-702cebffa33a19f019f079d1b712f46f.npy +02876657-b8767b71c2216dcad317c475f024f3b8.npy +02808440-a82d1a985717e161a3d8d955f4f42c39.npy +04256520-db7851745fb04cf732388c13cc4a0ba3.npy +03337140-fb6851a182221bcf14d1291d9f969ff8.npy +02691156-63ca41783e5d41f1651e8da9cf70afea.npy +02691156-9b285862ababfc3a68222c7df7dc40f1.npy +04256520-66240ded565b0927a8373ea4ea947e84.npy +03001627-94f5c52453dfea0b6606be97908355b5.npy +02691156-5fed73635306ad9f14ac58bc87dcf2c2.npy +03991062-57a71b2cad845a76fbd91d8fa434e93d.npy +03001627-fa7347547e290732bf65e1af50b5b7d4.npy +03636649-77fb025b8a2314787eaeab1f0c9120b7.npy +02958343-7cdfcbaec700fb98d230ef808f13e7a9.npy +03691459-1445e30aa2d3212db6a78dbbcf2e408.npy +03261776-b71c9a055a7f45c759af6c3da8aff0e6.npy +02933112-b56494e8810764286739a7caa0c577bd.npy +04530566-8849abb0be0a0ca99cace9782a7cd30a.npy +03636649-6b7a76b841ad8bb3488017d48a7f7eb4.npy +03001627-3ff4401d898b488a601104cd2d998272.npy +04379243-fed82f2ee0c82f97beedb4c8fd29e2d1.npy +02871439-77d1e531262c00a9193fc676f19b70be.npy +04379243-ffe1c487f7b9909bfebad4f49b26ec52.npy +02880940-441cac4bae5c7c315c2a2c970803cfe2.npy +04379243-f80427c47d2fc4169ccce4c6d5bb195f.npy +03001627-326352f7a20c31e2e19a0cc107ada7cd.npy +03046257-143e665cb61b96751311158f08f2982a.npy +04379243-9c1ff252b47f13055764829adf9a789d.npy +03467517-9ccb3f9179bf47f8b9689591a51e7ce7.npy +03046257-18299916ec3e95bff5ca1792a289ecf9.npy +02958343-8ffc484a850350f916abce8cb03e7794.npy +03325088-e9c737ddba0610f33321831d2245cf06.npy +04530566-ddf03991440ea0d15eb13ba95b07c9cb.npy +04090263-fe286de2443835694aa96bdf46776318.npy +03001627-3e1e1070ed7a0ba67484091a041fe77e.npy +02954340-ed52d2c2a9c1b606cf9bbc203a5cff99.npy +03001627-ed9d0bf4b699c2e86393e0168650b62f.npy +04379243-ead93856b735ec90f0aeabfdcb4e1dd9.npy +03761084-3c475e459a7cf86a13508f8f9877b42a.npy +03691459-ac6d3202823055dc1918763f44383273.npy +04379243-8d2e17e38a624565fb70a55ca9d14169.npy +02691156-8238cca88d753930a23a96b0250afc71.npy +02958343-a1d85821a0666a4d8dc995728b1ad443.npy +04554684-29561b3ac0b7596cb23717c90dbac0d.npy +03624134-45e28ff647b388e12d2336c44ce1b2aa.npy +03642806-62818ccc8dd6a3ecb300959c6f62c5f9.npy +04330267-c2adda9e5b8a94dae7822b3160005e08.npy +03467517-1c374a198daaddc493f0194265a9746c.npy +03001627-bf9ea87a9765eed7d53b73fe621a84b4.npy +03325088-19ac42daf0dfd5f454d7082b34825ef0.npy +03642806-774f062adc4130eca309fc846e6b0c18.npy +04090263-af6601f4d67d85e9422881265f219fa6.npy +03001627-62127325480bec8d2c6c98851414a9d8.npy +04090263-93de686cc189544335a8ac768bd119f4.npy +04090263-53b50183730125e68c0007e5a8235290.npy +04225987-9eb11450fa872445ad8005b08617c09.npy +03624134-95d6e8797064d09ea4dd752ddde80fb1.npy +03207941-a238b87f02c5de1edf3a1b0d597ce76e.npy +04379243-7a22c6cba42b73cbb5a356b3f810d217.npy +02747177-c1b3e0b6930003fa3b146c3414841312.npy +02828884-3f8d7d662c9cd90bd6abb4efd157f402.npy +04401088-ab47334a425e1650bbef66962a25aa5f.npy +03001627-d3f393615178dd1fa770dbd79b470bea.npy +03211117-ab20e7f54f10bd0ec1f8c53978a2ad35.npy +02691156-ae837be3456bd54f71d03b466c72ce41.npy +03001627-3022c71659584118c62a9d560fc45fe6.npy +03001627-9894e30c8c7f7e56eaf35c5a2cc7d71d.npy +03001627-45e2cdf1708680822165c54dcecaacb4.npy +02691156-22ed115500e9648c5fabfc69ee61b28b.npy +04530566-8ecf57984f77fe84583ae8949bf11b56.npy +04530566-2228242cfad46b73a0928eccd5f75d69.npy +04530566-e6d6a78f53ed5a34d0a07165a76e5a8.npy +03636649-8d93a9b663a6378ef5c0c3f661e90ca2.npy +04530566-e3c5033a9367bfa5a6dc0341d8503142.npy +03636649-4bf29c47c18e7020fcb8d8c6d4df8143.npy +04379243-3558aeeb9698722acf19858fd1963d10.npy +03636649-8c4ca1f645def5efd5cb6d178687b980.npy +04090263-51a327bfd4cbf109a06a81572261e82e.npy +03636649-41fc6d8dcf353f9ae420612cf7bb547c.npy +02958343-bfa01c632be2eb06e8a3b392b986583.npy +03001627-27a8827b0ba5d743169bfe841050f4a4.npy +04256520-16296126c5a0b92ea597952f9a39cf73.npy +04379243-4c55e5b0eb04f854297c137c93a4b9a5.npy +03337140-2f449bf1b7eade5772594f16694be05.npy +03636649-57f1439f5161b8d366cff95abd9dc80.npy +04379243-a0fd031270822841febad4f49b26ec52.npy +04379243-aa2b82f576f3df62f51f77a6d7299806.npy +04090263-61204e00cd517e4e9d360253182ac1b4.npy +03691459-9b7001c69e6f1978bf518c96c02a8c5f.npy +03790512-152de80e31b016d4ced49279fbb1dcc7.npy +03325088-e26918664dbd68eb7a867e9b35a1295.npy +03001627-aae036d8ebdc472535836c728d324152.npy +04256520-fe48d9b6cba42ef214fa93b6acf93e82.npy +03624134-c71280ea272fbfed4b7644126b1d71e0.npy +04379243-2bc3439a36c0518b4b3c42e318f3affc.npy +04468005-2ae835c4b5d1eff25f72adf4b0bfab9.npy +02924116-b657b823876fc62b8449e0b8dd14796b.npy +04468005-efcf0fbc2d749875f18e4d26315469b1.npy +02691156-240136d2ae7d2dec9fe69c7ccc27d2bf.npy +04530566-3c8dc4a3621674aabb29ab7e4f889a04.npy +03325088-a0bb3e71fa03369e843f813f752a5e35.npy +04401088-ee7ef8b40cc2c90d6b7170bfc4da1f8.npy +04379243-dcc24b55654a9e6bb65b71636c46ae49.npy +02958343-8aa5d1c7ca4e3f2e61b9ff60b1be412.npy +02958343-1ee4f19fa617ec5949493d905c02fa86.npy +02808440-acbbca9c00c87c81c1a9d86dbf500665.npy +04379243-59c8b38f75ae93bf785953e8e787ef2a.npy +03001627-112cee32461c31d1d84b8ba651dfb8ac.npy +03001627-317b404839dea88d827b401415ba9e3c.npy +02958343-5dde5594b4e9e86ce60ff101126e254.npy +04256520-c4d65d8701b7e9b977e95ce4d5a0e556.npy +02691156-92306925325c9e8a3f3cc56bc9bfcde3.npy +02871439-d998e75348902a511dff03f33a13aa77.npy +02871439-c3c8f8d5a5dae6c2d42b9650f19dd425.npy +02958343-cf39999d7c9e2b4788ea3c115b90ce56.npy +03467517-1a96f73d0929bd4793f0194265a9746c.npy +04090263-56d737fe2e8ec9d81fa5c14a532505cf.npy +04379243-5807109a9db7124e894dec385705c4bd.npy +04379243-ee6ab3dfcd7757bc6f2c5bf7cec019c1.npy +02880940-899af991203577f019790c8746d79a6f.npy +03467517-8b005f829bec6bf263e148e250c0340d.npy +02958343-df037c72470d33217fbbc45f009914a6.npy +04074963-9fcf820f1362798e1c990bbe4403b3a1.npy +04379243-2e0a8f727d87045818e800f0d88f9019.npy +02992529-c589332137d854a1808ba9235495a934.npy +02958343-4b092065568af127d64c207b9313bbaf.npy +04379243-194fd39afab11888b84c578d4c100fe6.npy +02958343-1ca64f9d6e008fb35fcb05674109534a.npy +02691156-c8143c3384690147d13ef00338ba8c52.npy +03001627-bdedbb7887d2c1ac6a45b3b48c00378.npy +03001627-a08ad49c281128ea53615647c93fc704.npy +02691156-27acb1d0e8c808262347b4731688b0f.npy +03001627-ee665ce6679ac8cfb502ac2eb9128f9a.npy +04530566-2a569537a0f6abd34b5acb1c7aa990eb.npy +04225987-344e9402d06bd94031145076011658c5.npy +04379243-15be511a2433482aa192483aa282f8e5.npy +03085013-4b13c682d58bb2184e7e6a507a54ea94.npy +02958343-6f2e76e362ba6c73c0e3666c7d0ec7d0.npy +02958343-32e6ee437b8fa3fb5e52943dcb52313c.npy +04530566-82138919402b3b8f642f9e27aaf0c47a.npy +04530566-efa85ab5aa4704d299429033f40f0f8b.npy +03691459-91f4c25e1e325683e7ac477bac77def9.npy +04379243-9a762e9ca86ce96da5e3e028709e0474.npy +03325088-a4ae53ecdfdf393593ed75a828b3d239.npy +02691156-523f1c2392338cf2b7f9c6f6b7bee458.npy +02828884-d9c927569da63ff92ebeb1e6a8111f53.npy +03001627-e807c535765fbbbab40f0ac0fb9a650d.npy +03991062-606895063559fb1243c090e8cbe314ff.npy +02933112-863deff7bdee8cdff51f77a6d7299806.npy +02924116-a8783a6095646146d2551af1d853d82.npy +03636649-7a3abc9f27ffaa0418a6353ea60f11b6.npy +04256520-a1a4f5670251b8314b35a7d7cea7130.npy +04090263-68b0af57466b5a0d735fa1ab17311ec.npy +02958343-eefce52130d223ba2dcbf88f7c685079.npy +04256520-ef5eb51bbb7141c119fb4103277a6b93.npy +03001627-70ac5cb405df84575e62305d14755686.npy +03467517-36b49aff54f6d7e893f0194265a9746c.npy +04379243-14130d541c4a419df51f77a6d7299806.npy +04468005-311a3ef41603f86c3f51596dfebf9893.npy +04379243-6491dfcf1c9782154932af0c4e356b6a.npy +02828884-e3e3c49caf4b1885d661ff085a0f14b7.npy +02958343-16d6ecc22218e21b36dfef0450f0ee37.npy +02691156-aba51f26f4da1b44b785bc4e6e3fb739.npy +04256520-3d0575e2fbf2ed5c99e1e63653e7d97.npy +02933112-7e06d12a3db817df7f07552c1b0b212.npy +04256520-a19aacbd84e0ddd92bf36b92481c5940.npy +02691156-5ff1cd7d4fc48c864b6d6a3a20b9f7f.npy +02828884-eb940ba9c22e793f35f2c389ea4da425.npy +04379243-9954b8f6fc40f0ab1cf96a5dc33e37f1.npy +02808440-ea9a9f6922adb1b70c61a2b7d6910c.npy +04379243-11084af510183635ee56c4ac0904ebb.npy +04379243-884589066f028f237d3a650ebc940efd.npy +04090263-78a1e4efeac9bb6f55d33831e71fa52.npy +03691459-245ed4407d4cead6b9c1ae865c9193ec.npy +03001627-7f523cf6780aaeda2a691a30a5c88605.npy +04530566-296c315f8f0c7d5d87c63d8b3018b58.npy +03046257-e82da3357403f25376e9713f57a5fcb6.npy +03001627-1031fc859dc3177a2f84cb7932f866fd.npy +02691156-8ccaaa2429c01bd15e33fa4a58c78442.npy +03467517-8f4974d21383c817489afeb4f07ae3cc.npy +03691459-6ab218aba38bdada2268dda5c324173f.npy +04468005-9ee93d31c7fa7c20a5a56cb268819922.npy +02992529-39b78390f8d5067e983a0c5c52bdbaaa.npy +02992529-e8d704bfd9b6c7f39af985c9d0dd6085.npy +03636649-c41293c84dfc509cfcb8d8c6d4df8143.npy +03593526-216d97aaa039609555f46d55537192b6.npy +04379243-e52a290532a567aefa10901ed3f9da3.npy +02691156-cfb555a4d82a600aca8607f540cc62ba.npy +03636649-6f6fc4581830b1c49ae96150e853545f.npy +02933112-7324733dbe394447e78cc773ba5d9e52.npy +04530566-806834c2b3c0bce7989a4a13be837150.npy +03001627-e5ce55d61830cc017f1cdfc0a8f38f2e.npy +04256520-896e8970c81b33d068b6f94bb42f6cd5.npy +02691156-93c3ce7904b3258b2285a9bad03a0ac7.npy +03046257-23fc56bba1889c2e970d557f49392fb1.npy +03636649-204a4eb580e93c559d709998b2d6e774.npy +04090263-39ff99d67fd7eb1f4aaee15c65289469.npy +04530566-7b602de66f5eff247991cd6455da4fb3.npy +03636649-5aefcf6b38e180f06df11193c72a632e.npy +03593526-c2bd95766b5cade2621a1668752723db.npy +03001627-cbbf0aacb76a1ed17b20cb946bceb58f.npy +02933112-c4fd6d64caa1e371c59350d819542ec7.npy +04379243-6c763c259b83b9bcbeedb4c8fd29e2d1.npy +04090263-54ea995ca2645fe0f4c4f1f541cfa2a7.npy +03001627-b2c35c8b748491a1684b7bc3f8a9aa55.npy +04468005-a260584cbbf5c65eb73b721987a4f9d.npy +04379243-1b33172342f58feb76963e5e6f4f642a.npy +04379243-d28e03eaf042c33d714531f0291497fd.npy +03636649-5680570f242c595255ee7d0585fd5223.npy +02958343-57e16ac1b026db4e350d065ac10959e0.npy +03593526-4d054c0a0c2fd8e4503adffe35460705.npy +03001627-303a25778d48a0f671a782a4379556c7.npy +02691156-fb01b45a0659af80c1006ed55bc1a3fc.npy +02992529-7757585cdde7953d86ecff2582325794.npy +03636649-c0b0d7e15d3dfab1733c22d8b8e1c33d.npy +04530566-8480865aa92d13dd46687b3834d255fa.npy +04090263-212a96dc292df1bce1f2a1daf140ac9f.npy +04379243-91282b5e9c019a1944ee2f4962f1290.npy +04379243-c7f4004cece37b4bc08256cf85537e.npy +03513137-e4ac62dd8caeabb1f80d3a620e00dd9a.npy +03797390-c60f62684618cb52a4136492f17b9a59.npy +03001627-624339070f8a749260c69156bdab9446.npy +03001627-b932d245e5e9f98b504721639e19f609.npy +04090263-1cbfb1c063b34ab4ab379c9b5bf12bf8.npy +02828884-a6c3eea17a4b455d75b557dd77720f6d.npy +04379243-b62f2d11c2aae12cc54baced9903a02a.npy +03001627-86e15a077ee6f438910979f825490a99.npy +04090263-fcb3636dd82e1c37741da1d923dd6a96.npy +02954340-138d0b89ab5b5fa52821bf1aa3b19a.npy +03325088-efaff4f34573d23caac6c989b01c7.npy +04004475-13a521e846eaa8599c6f3626936936a0.npy +02924116-1e0ecacc02c5584d41cefd10ce5d6cc0.npy +03211117-31ea65d446d980162a544c9c0bfe248c.npy +03001627-52a7930e87e75591a78e44eefea09073.npy +04090263-d6ab580443ae008d6a2345809e2bb169.npy +04468005-e0468c8448d92806bbdb7391763a8729.npy +04379243-a860f37217b12b26bffdf578c739e217.npy +03790512-242d8c07fabbdabc78fe949fc1419876.npy +02958343-358ddbe8b39125e9e81913b1de19c3f7.npy +03001627-6b91f4fb8cdcd6f46fe24f5659031935.npy +04379243-5f64c977d89c2417e2059182b9d400ca.npy +04379243-665a646e8413fb17fe537547af4fdabb.npy +02801938-4867b23ae77c1c2a490ad276cd2af3a4.npy +03691459-5da457ae73142749280e0c1e89a63998.npy +04379243-9b91c3d35057b2f93eec26c23f5bc80b.npy +03624134-6ca0db952c7e2169e2bb19fbad3e4596.npy +03337140-46ec29cd38a7ad694c3aee8e9d3a6ffa.npy +03636649-e1891813cf904b3188e7efbf7ff736b7.npy +03001627-d7b8189fe69cebedc41b07b1627c4b43.npy +04256520-d1016939207fc52841b7cd2d531f3797.npy +04256520-823219c03b02a423c1a85f2b9754d96f.npy +03636649-b4e939adfc94954a276206fae5d3c473.npy +04256520-6e4ea95fa805aca632a526e2e9a7e9ae.npy +04090263-169bddb624e60dffb6c8238440c79e2.npy +04256520-8ffc9da1ad2dffb3200d50e893131ba.npy +03261776-ba1ba6d3a76841132e398c137a41081d.npy +03211117-31c2bcb49eebce088198059e96f7b9ac.npy +04379243-50882181ce7f2bc1739680f4e31f35e0.npy +04090263-5c463ee11ad412ffc75e2dd4efaea578.npy +03001627-6ecc9a0b03cb8bc2d2b12aa6a0f050b3.npy +02691156-520382dade7695c4906bca4ffd4af837.npy +04379243-8b4ec70a3c1283b1fb5f8baea920e189.npy +04256520-86b91784e9f32b8f10edd100dffd8d85.npy +02924116-b247dc34286641995d04635357309588.npy +04379243-ad746c9c7f7548be7608168119193cbf.npy +02958343-261d55ef790a2da187bc776d46f94d3.npy +04379243-8d177d02c291deeca7f2f03d5c90e79.npy +03001627-2581685a8aeff78b713decb1a0563b12.npy +04379243-415a08a66b8527519f803a8da27dd9a9.npy +04530566-94e1c24d7f205a39779adafea0303e70.npy +02958343-2bfcb2381581c05a95551e0d9e50cb0d.npy +03790512-9d3b07f4475d501e8249f134aca4c817.npy +04379243-637bc87d013b1b09f51f77a6d7299806.npy +02958343-721ef3846535bfad179005454847728d.npy +03325088-21b77fd7e71cc47ed773a8448a79e14c.npy +02958343-8783151b8f23f41144ad526dfb20e2f9.npy +04379243-2e632844af2fd0892ad0b8f780281bcb.npy +03001627-38d000cadbd439da63be0260dd648a5e.npy +04379243-37bed46307d59fa5cc4dc0a78fc422fa.npy +03001627-493b8b8eac5d3de978f8b40f4a2ae98a.npy +04379243-6dad3b17869cb20fdf94ba6a907dbe8.npy +03691459-665dfd9711b2a3ece4fcc1af3285ca51.npy +02808440-f84308c16a081311ccd0340812259a39.npy +03001627-95d83e52954e1ff2d19175e7d19b7cb.npy +02691156-2751a0d9a1effa41f0b8c8d7a19e0d9a.npy +02933112-1834778d026108e0ce5d6e9371bb5c33.npy +03211117-441c5d2f78e1100558ecbb7ebe658148.npy +03325088-7525991c21bda36c54d7082b34825ef0.npy +02933112-21dcc3c0485b43136473d8f2b21437da.npy +02958343-dff1f351bb34fbbabecf71e2e014ff6f.npy +03001627-73428fc75131e0a9d8dd12a67280079f.npy +02958343-8c6c271a149d8b68949b12cf3977a48b.npy +03991062-de23789ce3b881dbe42c56b45979e3cf.npy +04379243-d312c70dfc7017e9c55161a63fbd109a.npy +04379243-1c8121e1ad6cd6fc7a480f3f1d55ed3f.npy +03211117-76d351e5df26f91fb895bc5ff828fca.npy +02958343-eb575f66bedfeaf629ebc23acefb248a.npy +02876657-de71aa5eca9ee76a95f577622f465c85.npy +04379243-156ebd353a36f36ac3bd24f986301745.npy +03642806-a923fbd2327097c6e95cd0dc8c2f0e83.npy +03467517-6f456bbe112de70993f0194265a9746c.npy +04379243-60365049ca80d98b77e620d253d331c8.npy +04379243-23aca164c7b2e2d4ad8af6714b643432.npy +02933112-7bdeadcf72ee257dce5d6e9371bb5c33.npy +04379243-5c45f8d68b676f634b3c42e318f3affc.npy +04256520-37fa77e9e48371545397d07b571cbcb.npy +03636649-d2ff6b9d63c65ab71735ea0e092a805a.npy +04379243-664c6792448950dec19dc7c5f46bbf55.npy +03797390-649a51c711dc7f3b32e150233fdd42e9.npy +02691156-6cf5d850b55bc9f990b1d6deb98feec6.npy +03211117-76d87469c1fa3638577ed6878ebb1511.npy +04379243-af5fb0179304e7c48cbb8bac2032149c.npy +03001627-29883092cdaabd09b41b7625e8c42dfa.npy +04379243-1469f244a1968345e2d95336601deece.npy +02958343-e56749ccdc861495b9e97c7f06f23bd5.npy +02924116-748f9e642180de12481aa8b5531c68a9.npy +03211117-df5e129b50eb2f253bec56bff764ba78.npy +04256520-e8524ce4800693ad1aab7fc1a7e09451.npy +04379243-1a5febd8d65b97e4f4b6538438a0b930.npy +02747177-3b8ee522cf6c207063b2acb037dfbcde.npy +03001627-64ae981900a1c1a37753393bcfa5f775.npy +03001627-328685b8dd3a7353bfde9cad2b5fdc64.npy +04379243-1a15e651e26622b0e5c7ea227b17d897.npy +04401088-5a65ef748eb3a3d1ec475b573e4d1a38.npy +04401088-9f6acb21f86a88d93ff936510fe2e02f.npy +04090263-377f4054812dec1c9f433921788191f3.npy +03593526-28938abdb2114e53bbc7a6acbd8f058b.npy +03636649-bfa83d8f88e91d3fed83d50637042c60.npy +03001627-3aee7c282063723d8a17805dbfb751e2.npy +03001627-7862b32132af278f45ce8baa9aaad5d5.npy +04090263-68ce5805f49f8484a90f0d3f07dcdbc1.npy +04530566-e2f4c0d1c8b6e26549e3c7e37819c26e.npy +02958343-488fc8215ab4e5e02edf5935f10637d1.npy +04256520-d2a3268e85d81c6c6bd365389d6dc6e7.npy +03211117-ea4b90cca359e2d38b9be827bf6fc77.npy +02924116-2bfc0186f3f10b3174a16879fb3ac81f.npy +03325088-34152f014bc3955d188386a1b5f2f907.npy +04090263-966fb54dcc7bf00ba3fb48700889ab3a.npy +02933112-17d25c26485edcf94da5feafe6f1c8fc.npy +04379243-527458cf1c581025d4b7f1dc8ac42b22.npy +04090263-9d969dabaddc27568bb83d47cdb90d09.npy +02828884-9e4391cde5446bded98cca8f0ccd5f7.npy +04090263-580f6487cf149c497504cc74f24f0eee.npy +02691156-844d36a369cdeed3ac4f72bf08dc79a6.npy +02958343-b5a6e71a63189e53e8a3b392b986583.npy +03001627-ce242d5e5e3f4befb13cfeddf8d6bfe0.npy +04379243-c516c27390cd9890f3a67cbaf0fde1bd.npy +02933112-3fcb5eaa202513bd2f815a05dcd7ddb5.npy +02828884-5cb40adcdfa5247681faebbdea6bd9be.npy +04379243-f01ca36bab1a7a1d9e9583a661702ed4.npy +03046257-d08469a971f560102ea413435dde1792.npy +04090263-8560fbd0b90ff133b96aa5dc23c036c.npy +03001627-d6203deed1b54c8279b3e1be3524f72f.npy +03691459-1d7af68d31944c358a0181490cb73cbc.npy +02828884-b695128faed7cffdad5067eac75a07f7.npy +02828884-300781592a3dcc2313e9164feae00e7.npy +04379243-233c497df4d252aea5e91f4d594e20e6.npy +04379243-59b6e5cc2b4dab5ebcd25191f45283d0.npy +02958343-30f96aa701d4e088becf71e2e014ff6f.npy +04530566-9a20ab78eb6a5e7af7ff315fbee3c6eb.npy +02828884-6ec0ed3fc05dc7b7ad5067eac75a07f7.npy +03001627-30083f20e81ba69b593ebeeedbff73b.npy +03211117-ecb96d46eca5724fef0411fcb48f0299.npy +02992529-9fd7db6d334e6acab29f572d1167c0ed.npy +02828884-8d40e13e8d27786b5a2cd0e0d44dc51.npy +04330267-a82fa198411f80b272d42ea0c136b6e.npy +04090263-7bd5febaf49a0cd44bec850c6c6ccac1.npy +04379243-b5a3017da6739ea0c46152dd624f1d49.npy +02958343-78ff8795f2cce2f7bedced414fad522f.npy +02933112-a8e160457848a8be3bba238110c3df2b.npy +03636649-b4c69d04b835bd716c8ef569725a5272.npy +03691459-4c944233440d87f4b8e9f7eca3eb3e3f.npy +02871439-3a9d74e3bdefe4107550c20897273f9e.npy +04379243-4a5fa41eb0fff4496316c951e41c61a5.npy +02946921-a8d4a3b32149d3ae4f0b8af4571b1440.npy +04256520-51a14c2d62a2963d86234e915108e6a.npy +04256520-6822eea5cf7f5fc9d92d669b28d58950.npy +04530566-c74dbde6656efb4eb4248d66f92b2feb.npy +04468005-865dd76030699cda623728a0bfe80a.npy +03467517-33bc720b6836bef4c69ecd2ad81e89bc.npy +03991062-a46b5662ee7e2985c3648f83bb1262ce.npy +02843684-d5171f20e202b8aef74a754b7c345792.npy +02933112-a06df01467d298caac51268fdb437a9e.npy +03001627-cbbbb3aebaf2e112ca07b3f65fc99919.npy +03001627-d29bc9defb4f021cd1e6c0ed5832129d.npy +03691459-8dc1e06a23a2fdb7c77445c6f0b20418.npy +04401088-6e18484e72c79bf6943bfa124ea09a0b.npy +03001627-46185164829c492c9dcf2183c858e6e5.npy +03001627-49b38e22f104005ecbde89e0c48a01bf.npy +04379243-3fb8797c780710e45213cec267286d18.npy +03797390-1a97f3c83016abca21d0de04f408950f.npy +03636649-12d03f06746eb49990c2e24416edfe5b.npy +03636649-f0b6bf1a583cd99169d13a7b2498cca9.npy +03691459-6575a80a0daca56d1b37f37a4873fcf0.npy +03337140-109a19840a8fbc774c3aee8e9d3a6ffa.npy +04099429-a507b5c6e6cd71a191347c63d1dae43c.npy +03759954-1a2e3602e54e8e5f4fdb7f619836e43d.npy +04554684-ac2fd0b05d956f7a589577ccf07b31e7.npy +02691156-59209cb5ba7a34633e1e5609a53c0477.npy +03001627-6016c2e4f5d5c2ae181fb5b25ff8403e.npy +02828884-388d83f25e045007efe85e37dd46e84a.npy +02691156-c9620ae77d3eb16ea3123c495342b850.npy +03325088-91b9542a41c2c80dfcff3f0bf2219ec7.npy +04256520-c00d5c9b043b600019fb4103277a6b93.npy +04225987-70c8f82bf6a6fef2db8b0e67801ff73a.npy +03691459-d5f20697fdea1b20fbc9490485dff00c.npy +02773838-8569a0c606bbba73d9985ad45fbb635e.npy +03001627-5cf26a5558580c8c75a82b88fe6e733f.npy +04530566-93de96748cab511731205bd848315f04.npy +04530566-41032fa8e4f632a5447ea5854b3cf405.npy +02933112-e1ff64e53154ccfaf51f77a6d7299806.npy +03991062-9d200849933d76c52c528d33bca1ac2.npy +02933112-1767bd876a8b8c6e4da5feafe6f1c8fc.npy +02924116-5dedf1f1c3c1eb461759ca9eefe0e251.npy +02691156-b1deb3638098e9c92a4947824596dce3.npy +02828884-ecbc04934735cbc852dff9108cf86a17.npy +02924116-d493568e7c343bd6378953424bcbb407.npy +02691156-8add45a11c9fcb446eb5821e78d8898a.npy +02933112-98d963a9f353cd026b0f9e3b3feb2454.npy +03001627-5ef0c3e89d51eda2d62069fe2138d0b8.npy +03991062-e4f8e15dac885beb846aeca11136b56.npy +02924116-e879b8f56a0bb33ae87bec97f6a7c3b7.npy +04090263-4c41c172046a4a5e9a6e43b878d5b335.npy +03207941-f4d152d2ffb8b2d9f5f2f72b977592e.npy +04530566-5c0e6663c131610a2c3770cecdd58208.npy +02691156-2c89cc6eb008eaf5ca8607f540cc62ba.npy +04099429-d9b0e3cd3ce4507931c6673b192319d8.npy +03001627-6f84118b912eabbd4587e90e2fc67ac9.npy +03624134-7bdab5035a80cc52f361b515e2f5c19f.npy +03001627-fd5ac9b342fe518b9d3ea1c6b57a0095.npy +04090263-d8e64f106fc611c186029a2be51c0321.npy +04530566-5bc0bff4ead8277b421dcde4f714e772.npy +03001627-6cf6140483ba1b347b11ae648ea92233.npy +02958343-9240401e750395b456fd4619a315629d.npy +02958343-73140624a636925ada37be44e2d84539.npy +03642806-6c6a96e4486cc02cda66ecbb2c411f37.npy +02691156-951358ab93e7380c1ccec171a275967.npy +02691156-7b6f528acc10d3fbcf5b9c6e0c7ce895.npy +02876657-af853a8c58d2b631992eedbdd14b936d.npy +03636649-6bb38bc6fdb6adc359c5c7ba83ec931a.npy +04090263-8369cd1bf3c6f377504cc74f24f0eee.npy +02818832-5d12d1a313cff5ad66f379f51753f72b.npy +04379243-7727cc0cb47705632dfc2f8d5d30193c.npy +02946921-59dc6215c5eeb1ee749d52b3e269018.npy +03797390-2d10421716b16580e45ef4135c266a12.npy +03001627-f46ccdbf92b738e64b3c42e318f3affc.npy +03467517-46e8a39b49acb800cc766ee9bece4aca.npy +04401088-86fc58a0c40316f2562c8e1ac545ef78.npy +04379243-14e00e9bc6ea1b7230bbd4cddd04c77b.npy +04379243-61b88b501933ebae8f7068c66465c4d6.npy +03207941-5776239d3e133b68a02fa8dacc37a297.npy +02958343-8a28abfb5751e767b9f455b31f6fc3b6.npy +02880940-47175c7b12bf0b61320b691da6d871fb.npy +02958343-bbf84d45735af3314dde7b6e74a2cede.npy +04090263-57287268b594fb3f3a653cb492d78488.npy +03211117-dae83168187a9ef8628fbfd12f0feda1.npy +04379243-abeb8fa38979d2fb9d46068d27fb8249.npy +02691156-ab35aa631852d30685dfb1711fe4ff6d.npy +04256520-86a7258b0f094aa6a3fa78fb8c679d78.npy +03001627-3f8d0d53e2bd74124b3c42e318f3affc.npy +04379243-b8c0ed645cce028b3fa313db82fc9cef.npy +04460130-40ec49e3e3147508ca9081e720bd7dff.npy +04379243-c4ee00c87688f3b0b161476a346db176.npy +02958343-82720b201a7731e3b376886260eb15c1.npy +04379243-ea87ec56cc2fe88fb20577fd2a0fb434.npy +03001627-b6457a76f24de9f67aa6f8353fce2005.npy +04401088-a86eec9735db06a8226bc3b9ce9ff2a1.npy +03636649-d3f84442201b6c137fb7f79251dd7727.npy +03691459-3e33b290c010b3b88bc9d953a3f1955.npy +04379243-f66d010471970cf0391e4d6c585a697a.npy +03001627-f128d707527eb10cb04cb542e2c50eb4.npy +02818832-1f6eed9be4aa249de76bc197b3a3ffc0.npy +02691156-dae96d5eb7dd6fcd2863c6a2c8157d17.npy +02843684-80337f796ef8859a527f76f3d3db2f8f.npy +02958343-1cb102a066270f79db1230abb5fc0167.npy +03001627-33587d34aab902057add36d8e31831ec.npy +04090263-6f09a5d74998c8ec49a3c1009fa79820.npy +02808440-3cb7df6d3fd900acb0026ac53ebb5587.npy +04379243-7257fc99c253994c6fd6654fda9ac5f0.npy +03001627-4ef623a1f272c40019fb4103277a6b93.npy +04379243-a86b48fbcd775bb16cff9b44fdf0517e.npy +03001627-83839b89dd91996c7d910d51d878f708.npy +04090263-868aba7b4da060a3683e3750b53385d5.npy +02992529-bbbca195cd6b85f1562c8e1ac545ef78.npy +03636649-51634562e4cbb4be27c4ca11e0316b1b.npy +03691459-5072c19da106b95583247f812f2eaa97.npy +04090263-9cf5486d4aaa5c0dd107072754c68ce7.npy +04330267-7c82a4c439803269eacb651f5864b906.npy +03001627-9de69e28a07c6e10592cc471d13e2037.npy +03001627-7d8e6b132c64d909b161f36d4e309050.npy +02933112-26d924cab0c8e8f348d189f942cedc62.npy +04379243-6278f1b6aa0c85effebad4f49b26ec52.npy +02828884-14b63361a48a9fffe4a048c146e8bd43.npy +03211117-763d4754a37cdb953c491389420760.npy +03001627-accebea3a0e180f0812e3ecbeaae3980.npy +02992529-dd02413772656bf5f6cc8d1cc08b421.npy +02828884-cd1077a52f972810cb2a965e75be701c.npy +04090263-e61d4911c7142c65d735fa1ab17311ec.npy +03001627-f2075f1c3088a167cf513de9a02a2561.npy +03636649-cf6c082b9534049494db33559ec0df30.npy +04379243-64adf1d226e4a0894f4d213d7c852596.npy +04256520-9a88dcf980a527cb4b3c42e318f3affc.npy +04554684-3ccba2b436b03aa635325a5f07346e1b.npy +02958343-e90b0381a7c8841c1c65421fe734e7bc.npy +02691156-4658a2fb7353f839643ae903098a314.npy +03928116-6beccfcb76d8dc3fb12da0b74652c93d.npy +04256520-4146cfb4fce9055bf51f77a6d7299806.npy +03928116-a9ae9e2b1e80fed6a519a2fd2539c0b6.npy +02691156-5f11d3dd6ccacf92de7a468bfa758b34.npy +04379243-ed554b9e04b7f7eee7be13c697329304.npy +04379243-7e833179b58ae9ec115e53c2ed23d57d.npy +03948459-1e9955ac94f8facf9e272653667f1619.npy +03001627-a7e33746f41cd181e258d1c3e7302e7b.npy +04379243-214e52abf34b4e18ab96a46a16fcc9c.npy +04090263-1fdccad4c0b826680685c30eb1daeb1.npy +03046257-ce2c4226c28a7f51ffe3432ba4f2e6d3.npy +02876657-cec14f91bf10f86e8291825d073a05e1.npy +02828884-6887f90a83081b56a1ebafc9c1beded8.npy +04379243-9a294d3a661f96a3c98555c181f6055.npy +02808440-885497f2bb3cbd3c859d92988090f02a.npy +03001627-1ad766f9e95ce308aa425ecb668e59de.npy +03928116-532420acbb08cdb410a322420f6f5d87.npy +03636649-5383c9b60d5b66a2d22730b0728b2fc9.npy +04256520-c2e4095266254bc1948a3bd895ea5ecb.npy +02691156-f39e0412290bcc714917e69390d054d0.npy +04090263-216637165f69a2b5be0132953bc535f3.npy +03001627-19a3ac2ec0312e13c8687ff9b0b4e4ac.npy +04530566-320b3f040f6d5147ab87075c54b494cb.npy +02876657-a00a9d045b69171472dfe26068766359.npy +02691156-2c4228b79cf44778b96ae1a0a8b84ec.npy +03691459-d05c2dfdb34f38433e8a91ffbc9ffd64.npy +02958343-430941674faedcff6436916a86a90ed7.npy +03642806-1622e466794cf72998536cff5312b747.npy +02924116-a7791bcc705e5a4ee9479f80dcbf204e.npy +04530566-2e958577e7756f59bf9717d602b327f4.npy +04379243-3585c614e9a6825fd42225b7548c8765.npy +03790512-a52bac9239f4382ea513de4eb79b310d.npy +04530566-e951df8d8d2f6ebc96f165bae5f0d61a.npy +02828884-80593a84e45e4345f51f77a6d7299806.npy +03211117-61d0f582475b3d2089b367279b017ccc.npy +04379243-c736eb1545f8b7b4ed403132b02528bd.npy +04090263-7d0b9246a180c59785c111973dec28b.npy +03636649-a53112591be182b9d93768e7b9b1eabf.npy +04090263-e5e273acb04a5687bbb7f70943d3cb52.npy +03636649-ff1f829e2d6ff0d4fcb8d8c6d4df8143.npy +04256520-6bd1d677786634ad27118ebb1d23c10.npy +02871439-6e2622466f6264098a653a9f65a410f6.npy +04379243-4dd2d2ada39e32d15f522d72d0dd08cc.npy +03642806-ccf62b71e7a9aedfb162fa62b36ac9a4.npy +04379243-19d202ccdbc617d8eed6cfa9fc6d794c.npy +03636649-2cc1ea376c68da216502fbbc8833905.npy +02828884-1b1cffcc9435c559f155d75bbf62b80.npy +03001627-5f355e2a9fa2f0db4b3c42e318f3affc.npy +03691459-9b8512f0cb1fad4e73e1b2d018c0512.npy +02933112-230a987c4ff5f673921dd903dd0b8b17.npy +02691156-e88e090caa1ccc5d187bd96066d7269e.npy +03001627-54e9203b65ca4989bfac64b1ae78ad6e.npy +03001627-ddfe96c6ec86b8752cbb5ed9636a4451.npy +04256520-bcff6c5cb4127aa15e0ae65e074d3ee1.npy +04256520-e063706e52feb2db039d8689a74349.npy +03691459-18602a0608af58023b80bd981244df4c.npy +04379243-79f4f47f29267c4cc46152dd624f1d49.npy +04379243-e2efc1a73017a3d2e76bc197b3a3ffc0.npy +04256520-6d31bf9cfaa63bd1455785c13440f50e.npy +04090263-5ae6db470db214b258dc97820d1d9537.npy +04401088-e48a2eff0b0d0a39a0eb5a85db887292.npy +04401088-da390e1a895506db28792f2ae4de363e.npy +04379243-2b88cee2ab30101b9b11da89c22111dd.npy +03636649-c83073e02e70410a35836c728d324152.npy +04530566-7f81a9c7137c855cd03428b7741c342b.npy +04379243-e795845c4e472bfcac4834e2c94f2b9d.npy +04379243-9a8852ff4b82a1585d624cfcd9a37a7.npy +02924116-ddc86e59f6a2756b99ebcb8df4d39cff.npy +03001627-60763dc3cbf36974b0957d845ac33749.npy +02808440-ef03e3a3dd7de9cfe52ffd0e748a1ab.npy +03325088-a48b7d5d965f8cfeb362845c6edb57fc.npy +04256520-3fd28462dda59ee49ecd5a75a29f0715.npy +02691156-fc16704314dc71ee9a6e43b878d5b335.npy +03001627-6281a6537c8c4bdce6fe3612af521500.npy +02958343-1963641a15916c03709ce7955adef61b.npy +03046257-f4a7568fec31f2ce2e12ad5cca2dd4ca.npy +02958343-51b8011a2eaaed85cde8c99e4b182f9.npy +02828884-56916be69d224f2a3569fd2bf3d0a41b.npy +02691156-494660cc290492218ac43fbf276bac06.npy +04379243-6f3506c9c5202101c4e8952b27b5f370.npy +04225987-b2dc96e7d45797f69a58f604ee2cbadf.npy +03642806-be6af6c0bdaee6e06ec6fb380960ec65.npy +03691459-2b3a776ab2c38e3844f57509e473c41a.npy +03624134-b776aa0216ea6cc8fa45e0e67b513758.npy +04379243-a96600d919eff11c3f92fc6b6f6f5bda.npy +02924116-bee327978e3a95256ca2b6e5474aad11.npy +03325088-207dbdcd7f90c2f576c18e71fd49c4dc.npy +03691459-37325d57c8ea891ad77ea5e1afa5bfe6.npy +03624134-a8d99d551c341522192714da339f337.npy +02691156-a9240313c39307574c3a35cee92bb95b.npy +04330267-f23bc665def38d3950dca30f65c243da.npy +03467517-b6599453a9903ed45b0e6a2e453fe7f7.npy +04530566-5456c7546e3f3c3d9c5408f4f799fe72.npy +03001627-86ec9c796a6c1789e792598ed58dd1cc.npy +03636649-69a708be7245f4c9786e8e92cc08146.npy +03001627-5067a76bac4fd7892665f68ebc337f05.npy +02958343-4d0115d72892d27531780fdd33037c9d.npy +04530566-9df836e5ae285e2a5c5cb89ac1b518ee.npy +04379243-b7e0c66b0c6641137141495dc4a593.npy +03624134-dd2173371e7d5f83e255124126c8e640.npy +04379243-fb5e8a6361262c26acf7920879052e93.npy +02958343-f4440b2cecde4131afe1d4530f4c6e24.npy +02808440-4305c0f75a0bb2703af30a3946d92feb.npy +03085013-908428b9ee9db16ffd06de9ba37d44bd.npy +02828884-302c64b3f9d0e0a3961c690e3d679ac7.npy +03691459-73c40350f07efb92d207241113bee327.npy +02958343-d91d378248a55e44d9cc84cf84983165.npy +03001627-9bd5937be6aafe704c29eddba1f2e390.npy +03991062-e538a79b42c8db6b2d7a27ffaafaaddb.npy +03001627-c9d68e1e5309ac25ac57e7d566628472.npy +03211117-453b06180bcfd33a86b76551c6a3b2b.npy +03636649-e6b34319c9ce57258d6a77b750ad3e43.npy +03991062-c1505bf780727e15cb03b57fca000b1f.npy +03001627-e2c7903ad9e8f497a7be81e6de3c404c.npy +02808440-407e9ad1c8352e1f125fa9990176f0d5.npy +03691459-b6210936b5d1be007670e02527d78e8d.npy +03636649-2ba14b4b910e3f41d983ed4f6d016adc.npy +03001627-5d4252d082ae613a2fa77440dcb93214.npy +03001627-d5424b7fdd031fcdd41c21de8af66e26.npy +04256520-75214586f291a04fd45611d32fd7733d.npy +02958343-9c10e71c06558c3b1bb46d2556ba67d.npy +03636649-24fb5c490856f7bc12b31765ab67b41.npy +03636649-9dad7ce60aa168d72cd2160e449d45ae.npy +02691156-a72bf66e9213b313a9b2becd26dc2fc1.npy +02828884-243ac273ab2262b117b4e4e00788e093.npy +04090263-bbc67c7095126f60e3e6e6fc6b79d595.npy +02691156-befcb95d80e0e49119ba010ddb4974fe.npy +02691156-3923b98b26a3c7865f50257ecdfa5c7.npy +02843684-2e81196fa81cc1fba29538f582b2005.npy +02958343-9948d84501b8ab721e7b5f06a32cfcd1.npy +03325088-97189607e5264b2f58813b85ef7bf518.npy +04401088-de271ee7c512d31551c2056c93a582cf.npy +04379243-6765d83445c2338555f46d55537192b6.npy +04401088-7434bc601d949333cd5ca8d1acb8ce0d.npy +03001627-e658d490aaad69d1746cec00e236149d.npy +02946921-e706cf452c4c124d77335fb90343dc9e.npy +03691459-2a8345bd5d50456d8db1a0ee98c45ee7.npy +04256520-cbc445c307221601433b4c9b207205a9.npy +03593526-c9f017cf330911ab1fc611122dc20c0a.npy +04401088-e3e43df4a3fc1870d4d7de9e3c2bb6f4.npy +03761084-11b6eb19d293f93676839a521e23c8fa.npy +04256520-fd2f1f0d3c4b90d535ae67400a94a6fe.npy +02828884-f540ad990dbbd600f4fb4dee5181bee.npy +03001627-d8cb5a5707686c9295a391f7b991d876.npy +03001627-801fe0b3a0e555a937b2bb75885cfc44.npy +04379243-383c5e64f539b2852f852bdd38b1133b.npy +04379243-746f88894a7cadb6253bda70c38d078.npy +04530566-1e047e25506b4885eb5715ea2e14242a.npy +03636649-4b3bc509cc074ea5ccfcde790fc2f661.npy +03001627-239a5029476b8a2adb6f46583a3903bd.npy +04530566-ea34a8282ae86edcd3fb60637c014c9e.npy +03001627-17d7a3e8badbd881fceff3d071111703.npy +03001627-45dcb53af7bea0d091912372ddaeb001.npy +03593526-e0a62f7d9bb5cfea36b0f2a1430e993a.npy +03001627-8d7f0c67789caaa3f415ddcc43feede.npy +04379243-452ee9c2477e471b1aed2875db0a8711.npy +02828884-a7588e794de38fd055a60d8737d1c0e9.npy +04379243-ab9bafe307e11e7a2b8a1a2aaa466160.npy +03691459-7aba5bb94270d994451485c22fb285cd.npy +04379243-a83cda80e5c5a0fc3719086e0b4ab8be.npy +02691156-88771c5b02d6e267b02bf6205401969.npy +04530566-83aa90436933149311c337781d78350b.npy +03325088-3810cc92f4ed3420c36fb70296e45483.npy +03001627-f9c61b40d4f49158ca998f0f87d0c84.npy +04090263-897e6a6307da50906314c3b6a3a65519.npy +03636649-9cf29c3de0cf127730f6e0ede20c4525.npy +03001627-91819d15c2c044ebd47ffa500636d198.npy +02992529-1e597e56b6b2fef6c331b59dc8938ad.npy +04379243-91569ca6f0578ea9ca2ed12df13a916a.npy +04090263-aa858f23b682f5616314c3b6a3a65519.npy +04256520-709389fcd446ca6593ebeeedbff73b.npy +03636649-79bba57a00789023febdb1f263373824.npy +04379243-e18c2cce4bbab2e45b7bf37141f96eae.npy +04530566-f18739a47f1f08e08510ad9ae6ed36b6.npy +02958343-aebcf0140cd6206ed6dec0e17c3e2971.npy +03759954-61552084780cdaa311eba86b475bafe7.npy +04379243-a2baf45f001e118e2c79f7f31759bfa7.npy +03636649-41f3ad2781ee196bad0e80a2288e336.npy +04379243-a9d27bcf51153e4567de2aaf749e5256.npy +03337140-73ad48664248623691c352d02061b3f7.npy +04379243-92a05eba553fd1247674a65b52217c22.npy +04379243-10cc8c941fc8aeaa71a782a4379556c7.npy +04401088-c65f71b54023ee9897d7ccf55973b548.npy +02808440-2b6bea31677afd413321831d2245cf06.npy +02871439-348d539dade47e8e664b3b9b23ddfcbc.npy +03691459-c6c88ee9ea728a3220815abab29462c3.npy +02958343-33ce4837f282443258c27e607f6e2d4c.npy +04256520-c87497b3c00b3116be8af56c801ecf41.npy +04379243-a479fea6394b100a98f849d6224d303b.npy +03691459-453391a5d1d60bd51e859883d2ec3f1a.npy +04379243-a44249589b77b4674b3c42e318f3affc.npy +04530566-1fe84ad7b78667e47428866500a95dd8.npy +03467517-f4dc2860ddfa244caee8866e459a90ea.npy +03001627-e8e586ccf4dcac74cad9a65dbad13fea.npy +04530566-d0ed110df0d56672b26ad4ebd4ebcb88.npy +04256520-79a9aa1e8b3b108cc48383e281a276ec.npy +03790512-b91424e8cef60e3e1bcfe9129a6aea3a.npy +04401088-e33e1483c4c22b1ae71852a7b0e4fcb6.npy +03691459-e5c1a7e9bb2dd0d65a31d91ec836a511.npy +04379243-9a314f79b18ba7914187eeeb0dea4986.npy +02747177-d5c28f4d7b89bc87eb13448f2bce3ef8.npy +03691459-7f87d18e6cad013ba448d8e70febd930.npy +04090263-ed64394470cc3075feafd6f06fc45258.npy +02808440-2edc92c82cc5db3d3321831d2245cf06.npy +03337140-2cc64133d27c1946ce5d6e9371bb5c33.npy +02691156-b793e65c707e884262bbb378da4fdb53.npy +03001627-e9a8bc335a7faf78f91663a74ccd2338.npy +02876657-aa616bbf51ae233278d5828fe3be4b43.npy +03710193-a603aea34beaf4424b3c42e318f3affc.npy +04401088-ab5fc5879ace7418bdec90548bc24588.npy +04256520-c47c9d6c6c8291d61008a8e167b50735.npy +03636649-7ea1864f38bc326696a3517f50eeb9f4.npy +03001627-95c5a8897fa78d3883b06dcdd869d9ac.npy +04090263-d421d54e21e5f9edaf56497f051566ab.npy +04379243-a0ee8f7c4c2907b4e45ef4135c266a12.npy +02871439-5ec9bedab0bfa761664b3b9b23ddfcbc.npy +03928116-3d7066d8fc23db60df13db406a7a8ca2.npy +04090263-4bcc0ecc49ac0617525b3f0594400a46.npy +02747177-a2e9d8324c1f62cd5ecea499ceee624d.npy +04090263-6fafe3b82e6e07de460c5cf20e4c5e41.npy +04379243-8343d98e3710f5bee1b32bbe69d5bc15.npy +02958343-481c55b1fa36f6c7d834dead2eb68d68.npy +02924116-5124b67208af1ff7d26e47b24e76e338.npy +03001627-7553af75b08b6a87eaac479593c9ad1a.npy +02808440-6c92a80574e97e6a2f38c0d2792fb5e.npy +04256520-c734c6bc3524b673ff2c92c2a4f65876.npy +02958343-d695f936edcc28d497df6383472cc5b6.npy +03001627-c66a19f08d86386430bbd4cddd04c77b.npy +03797390-8570d9a8d24cb0acbebd3c0c0c70fb03.npy +04379243-5ef7fbec36f8854ef7b4b759a0c02e4a.npy +04379243-89942c8f3c2796a71e54ac67f0143e13.npy +02691156-e5af05179ffeb8fcbd46d022fd7d80aa.npy +02691156-d0ee4253d406b3f05e9e2656aff7dd5b.npy +02691156-4457652c2853e0bea8cba409c4409ba9.npy +03691459-3e16cce54c6f0b0f8c21317f25d028ee.npy +02828884-165cd9780f069ff31a546a81aa94b4a3.npy +02958343-e0978173fcfc5203510556e7c3123591.npy +04090263-7e316474bc8b072fca74c4e4ab012aef.npy +03001627-aef0600be3f8f384f51f77a6d7299806.npy +03948459-2e787f6b6f93c097a576fcada53c585.npy +02933112-29832b9c3d644c744da5feafe6f1c8fc.npy +03001627-5d3eff6a1b9a119da011ccf7cbabf68e.npy +04379243-8a179c7244ed94f4f8369c172d21d852.npy +03325088-adbea30c5cb5e4d94a0a22774477f1a9.npy +03001627-708cd72e15dfaab8a687729fda50af77.npy +03337140-7fe6d63cab6a594030bbd4cddd04c77b.npy +03001627-d64b2ba9f1f35362cffd61677456447e.npy +02828884-b4a9481e902d011ced98cca8f0ccd5f7.npy +04379243-ad14b4bde4a656dd53b1634376cbfb93.npy +02933112-4293fa9040a1790f5e30943bb32d54af.npy +03001627-e93d141a3dd25b46219e03e23fb59d78.npy +02808440-c69bef4275de0fd6412deb0d2b0f3dcd.npy +02876657-645cf2b7f442865ebf8d8d6022c8e3a.npy +03001627-97a4d1ab6d58bc2ef60f0f3341009abb.npy +03001627-ef6c2cd0b8bb6e8720768660cf080d12.npy +02691156-6ad89740605331aef5f09964a6a1f97.npy +03642806-461b3592ac4674cbd2079b28d473791b.npy +04256520-e232e06ccba3e82d27039dbb84e920ce.npy +03325088-7d2092c9bdaa6b6054d7082b34825ef0.npy +02828884-fa51b43a7de98d0b7a7695d948d413b6.npy +03325088-4335832712076999d84cdc7f15b1ee59.npy +03001627-6cd8056d4dd6b3c799b17588a5699c72.npy +04401088-515b5a63ebb56aad7aeb5bbdd191fd4d.npy +02958343-82b9bbf2c5c630d9acc1f3191aab65d4.npy +03636649-49749cf225cb899573ab7b7128d466a2.npy +03001627-eb1019c438090004db6175ef18ad3f80.npy +03001627-617f09d333443b8e91745c588e2e0fa.npy +02828884-c311a54150b7c64acb2a965e75be701c.npy +03991062-6e66370dd674686ec938effd02ae5d4c.npy +02958343-88ad6f5df57cf8ea16abce8cb03e7794.npy +02933112-dfe503e6a4a86d4dc59350d819542ec7.npy +03046257-90d93cd686935a4bd866363c8e6eab2b.npy +04379243-5b1000b7bc6e0d3b7e67c36deaaa271e.npy +03636649-3fca250636e2b47a8d0fc77aab7a8d33.npy +03001627-d1d9da0da16dbb1a765101d95c92a0e5.npy +02924116-320ef9e8fc776863670716c89dd036f0.npy +02691156-30d1974a29d95d8be8bfa4901aefcf8d.npy +03636649-5aeb223a91320c39edd4171cd40b3feb.npy +02958343-936eb7eec6b76e4b421c2195de5e56c4.npy +02958343-d43eae16d1c14f48788f2ee06c24b7b1.npy +03761084-1a79926636905e0ccb349a60fd15aa15.npy +02828884-ddd142d8dcd4e95bf4fb4dee5181bee.npy +04379243-dbc98a58a2425925febad4f49b26ec52.npy +03001627-fa263643fb3f45c7492d9da2668ec34c.npy +04379243-9b7b33f2892e7bb9562c69acee9936b0.npy +04379243-4c8992b5868f945c8164355cfcd0b549.npy +03593526-81a4a5f10f2f759fcee8a4975a4efb00.npy +03001627-49a3b0242c13f92da6fee8e2140acec9.npy +04379243-d6f122e1570e4180d6686dc2df08cca5.npy +04530566-5eb2d085267142f26192896700aa3bd4.npy +03991062-2ccd2b095bd8ec27e2ec5524ed185c34.npy +03636649-70b78b9439a9de7530f6e0ede20c4525.npy +02958343-3d6e798bed67ab81f00cd8c386c592fe.npy +02691156-cc86a2ca41e279bc89b1c1fd829ec927.npy +03001627-5d5ea6ab578db7ad331fc18393f04d2a.npy +02992529-9adae247285e9538836a2d8722d73dfd.npy +02924116-7400579f0ccb8df3193d7855ecfc1bd3.npy +03467517-1455e11a8e89e348c80076acba9f64d.npy +04401088-f46531484dea3574a803a040655859ad.npy +04256520-725def83aa65422dd4fd21ba7448467e.npy +03001627-447e5db7c84797272127b77d9c9dbf6a.npy +02691156-3fb7ceab42d7b17219ba010ddb4974fe.npy +03001627-d49ce87d43cf4c8f1679065e1c457f94.npy +04401088-73339a7ed1e72d89aef10502d58d4967.npy +04401088-e76bbcc0029c979721844676433a0aca.npy +04379243-9f4eb0d734a2b7a4ab610b0c94236463.npy +03001627-cd9cd0ec7bc9400b559cb8a953a07d9.npy +04379243-392963c87d26a617d5d95a669ff2219.npy +03636649-ddc2beaa04d1b06f5fa701976706a45a.npy +02691156-77a81458ea729c62ace5721ccacba16.npy +03636649-acaf95927290a89182bfcd34215ccfc7.npy +03636649-1e9a36b3360f23388962005ce0e986db.npy +02958343-c7bd3c33967a3f80d292079a67d9d7f4.npy +03513137-737e1c921100f038e263fa6049be3541.npy +02992529-4991cd37af08577070346e4935b9a42b.npy +02691156-cdbd857f25b1597c711d3e79ce66dfac.npy +02958343-8ceb581fe28a6496510c6353f9f7a5e3.npy +02958343-94c75ba9c6747f1bb491214a0cc2380.npy +03001627-6f0def5e832f3614c01e0156f398b4d2.npy +03001627-3ab3c9d99fcaa66bebd676e3a69dcf6.npy +03325088-d1a30eb29847c0d6c36fb70296e45483.npy +04379243-f616f5c2068eebaf6aa35752fcfa44c0.npy +04090263-8a8f66b04e6d8f4ca9e925ec046bd20c.npy +03642806-283a115028fffe6e4e67e2e8459ebde.npy +02876657-8adc0ce79962ac2021072d05c97a5e0a.npy +02958343-3973846825fc4d857cb2a55fa21392b7.npy +03001627-26bee1a8ea71545c3a288f3e01ebe3.npy +03001627-9451cb35f46ec0f6f946fe2e431cd4fb.npy +03001627-ba7dc0bb03a57732a9d30b145d59ff.npy +03636649-e65eb892b1d1730e52470de2774d6099.npy +02958343-5801f9eb726b56448b9c28e7b121fdbc.npy +02818832-16b4dfae678239a42d470147ee1bb468.npy +03001627-33dc06a8e0933b1efc385a284336f217.npy +04256520-5101b79892ce920b6ee5c30704fa2d08.npy +03928116-ce4945cde785aecb478fa0ab37c461c6.npy +04379243-56ef806397cc9c4a62e6af9325f07021.npy +03991062-ce9dbad314c55616cb2a965e75be701c.npy +04379243-f6f180c3e72caacb5077539b37310c29.npy +03001627-433c6c88f1a43ab73ebe788797b18766.npy +02828884-4b6276df295b3967601104cd2d998272.npy +03211117-ed31aec87c045ebdebe17c8dfb911d2c.npy +03467517-819251e11b46438ff6ff9bebca919581.npy +04379243-7982e2f2984978c6f4b6538438a0b930.npy +04379243-c421fdd1b116030fb129901f80d24b7b.npy +03211117-a296a6d7957a8ce9eb752889d5199f9f.npy +02924116-2403779924ebf18af446f92b52bbd82a.npy +03691459-b8b17a4a9b8d0d18b1561629b743a85.npy +03636649-45fcbb7812f0c9e729426a0f57e4d15e.npy +04379243-ec356bd4c5cea755748e58db1ff83cee.npy +02828884-a73601ecef6e3cf9f155d75bbf62b80.npy +02691156-c878cac87819f01490baeef8ba5b93e5.npy +02933112-228a83ea767bcab94da5feafe6f1c8fc.npy +03001627-46557f689f4cf5dd2acd2bb6205825cb.npy +03001627-e30bd575bbd6c68c9710e093c764abec.npy +02958343-216d910f71942f205df3c6413d40ccb2.npy +04225987-573daccbcfdc94a3cbd54f2dfaecbd51.npy +02747177-14a49c2b9f46faa04d6ef9ab90177563.npy +04379243-96cc60da5c390047c242632b2a8c3129.npy +03513137-f2107d6768adf4952fafb0cab311e6a.npy +04460130-8b52d84dc97eb3a74740473002adcaee.npy +04256520-9866fc915383a06cc85117b19e0f4ee5.npy +02808440-54cd5f394513b67fb0cfb8f47209a593.npy +04379243-37a73eab8cb0267f855931d119219022.npy +04090263-ff7afbe21c3c9408a2e534aa19c114b0.npy +02958343-be348430ab5fa5cfb1bb46d2556ba67d.npy +04401088-c2884eed47300891697f9662a764c78.npy +04379243-20cc098043235921d0efcca115b32b84.npy +03691459-2f4e9cc37c3bf5f1fdd84f4a160b8854.npy +04256520-fa0eb1bb05ebe3f2dd3adf3090c701f7.npy +02691156-1496504f42de2eef8b96ae1a0a8b84ec.npy +04074963-48d98af2e73604103c207eb23f7d33b0.npy +03790512-464a86f04b0f6e452a643a53ea2e7c56.npy +04090263-27156455bd418715a50ef3fc203c6ba0.npy +04256520-f0f42d26c4a0be52a53016a50348cce3.npy +03001627-681203ebfa280f5696d5b0735c6b5f03.npy +03325088-6a3bdf75976bcd914b35a7d7cea7130.npy +03001627-bca8d557dac05e082764cfba57a5de73.npy +03001627-58409b308683d908ca2bec46a3b47519.npy +03001627-1bda25dc158098f438f6f5a7dee76fde.npy +04379243-7d96b0823233ebe7b49b261a212e60b5.npy +04401088-e14de927fca30e267a351c9c1f605db0.npy +03001627-29483ee10e6c6e4c2c37553db37ec752.npy +02818832-2a177aa438616992c9b60ed0e1da4c.npy +04468005-539ad95ea77939f8f9a3483407086411.npy +03001627-a11592a10d32207fd2c7b63cf34a2108.npy +04401088-e0355773a18fc61224d795aabf4bd88.npy +03001627-ba1adc474cfa2f429ab926a7e944e795.npy +03325088-f17f569ccdf9e9e85b1c02ea3a290822.npy +03624134-298d152fd0adb0f33347c5de2992cc8.npy +04379243-4ff1ae700013a877ca6910e4922d61aa.npy +04256520-e0591c0d35f82023610c2a68437007d6.npy +04379243-cb860d60db8f3d18febad4f49b26ec52.npy +03001627-8176364215748b23490ad276cd2af3a4.npy +04401088-3036e6b2a898fc85e85776440ad91264.npy +03001627-b94002e3a92ca65efdcf3d27ddf91f4c.npy +04090263-fb36203aa01524aaca3e540900266737.npy +04090263-a24c70db5fb77268b61fca3643811d06.npy +03046257-1b315e0f647b812619a7b441086db5cb.npy +03636649-1129a07c75f5a709cf004563556ddb36.npy +02691156-d3b9114df1d8a3388e415c6cf89025f0.npy +03046257-26ab68f614b5b24f2f841233486fac2b.npy +02958343-4235a8f0f7b92ebdbfea8bc24170a935.npy +02691156-9a29495f38c07b0526a6eb5f28c0aecb.npy +03691459-4e0473ee9d5c72aef00aae52edb0b7b.npy +03636649-3ca37e415fe44ec2ebeb1e6a8111f53.npy +03928116-861b8b85db9652ee9f7eb1b54c601d0c.npy +03001627-f441e4f7f123bde3cd7677199133326a.npy +02958343-dfce5b313bebfba3ef8e28849949a11a.npy +02958343-23ae5d6c60ab3f60ee3362a8d2d8318f.npy +03001627-28ea1d2d2ff08b1b551d2444ac95a3d.npy +04090263-84b9cd6750fd102a9a2ee232a197081e.npy +03761084-30f4135ed68bff99186b61b33e112099.npy +02954340-4bd0b6df02772d8f59c9250a427b57f.npy +02871439-4996e0c9dac4ba3649fade4fe2abc936.npy +04379243-32d64e4638eb6e371594fba9df8f37fb.npy +04379243-649fb8e1ead691c6359e4b9c4f6dadd.npy +04225987-755dc44dae7791761082f2ea630bf69e.npy +04530566-de100dcbc3be32f2baeac688ed8ea6cd.npy +04379243-bb9304218d9741489ccce4c6d5bb195f.npy +04090263-5f2b8f1a75a51d90e76598b090652f4a.npy +02691156-5e31a194b02a286df8c6d04d97f8cf7.npy +02958343-b36c9481f71c2428ca92a4cdad802b45.npy +02828884-f5557538f4c6d755d295b24579cf55b8.npy +04256520-8affea22019b77a1f1783a44a88d6274.npy +02958343-2e6a9622bf83f04c38ee77d0178bbf4a.npy +02691156-fcfa1a67f34e7f2fbb3974ea29d1d642.npy +03046257-cb625b3a9b631d89dab8b525f98c6502.npy +02958343-99606d5346d6b958b96244559b61fdc2.npy +03636649-72b73a861b7626dcc8745da32e9100ab.npy +02992529-8a56e999d75c4d6e8d1dabf86742ec3c.npy +04379243-bb28f4978ec66a9d5369e32fb818f337.npy +03337140-fb5dcb6b8bceecaa4c3aee8e9d3a6ffa.npy +02876657-e017cd91e485756aef026123226f5519.npy +04256520-b37f1363aa93688619fb4103277a6b93.npy +04379243-228561e28a40fa1dda49e29c548bb1eb.npy +02958343-279adb2c37867b3a18d9ca1acf6633f6.npy +03001627-2759711dbb8b66ce66e463776e370597.npy +04379243-94a62cfdb84e88ca9a3528690d225ee1.npy +04379243-211f8bcd0542292a90eb1f8a00f61726.npy +03001627-f495c500ef468ea781a172d69c52a28a.npy +03046257-ce1c9b167cb2db948f83d145fcdeb409.npy +03636649-b1ac784f48473df1e7c7920f6a65a54d.npy +02958343-22abdb50fcc189d58a1aed4fb5fe5280.npy +04379243-993675648a0f1b1a9a87002a4eeaf610.npy +03593526-4f52256337d0d4a4c6e7cc40a98a4ef5.npy +03211117-90502bbf33c05edb369cafe8a991ad4a.npy +04530566-7edbaebf7d4fa994eca93934e5f39869.npy +03085013-e834257d8910fab3cfe78be5b7b99c8d.npy +04379243-9859cddbb637f5c8d3bb9bbe8087feb7.npy +03636649-d1b15263933da857784a45ea6efa1d77.npy +03211117-666902d92f3c8e3f8ee4af899d7fc545.npy +03467517-9e26dcbac33f056c343b0b12983b9982.npy +02691156-63f4d6895e0de9079bd3f7086e6031a.npy +02828884-21358aae456be5087e03aa42670e6f5e.npy +03991062-ad258c77538632867bc41009043d88b0.npy +03325088-55457023edc5af692f7a42055c3e9340.npy +02958343-6aa8f648cc8df63ab2c17ece4015d55.npy +04379243-78e1ea4568b0a1f5e7608f43dfbc9312.npy +03593526-b61141090612ac3ab361b6be63163da.npy +04530566-a7444ff7be7aad024c8ad92cfce1307c.npy +02691156-f7f69ecc4ff199ec5e9e2656aff7dd5b.npy +04379243-b623ede2cc40ae1d377b9297f3055210.npy +03001627-e4a93adf5399b23419fb4103277a6b93.npy +04379243-35ae6545bdefd0ae7ee217c21e683487.npy +03001627-65a1f4ac3e5b57dffff16555386d173d.npy +02871439-41bcf314c6488e939af4053b8815b239.npy +03046257-8cac6e868bd4b4d0db54f0ac1f9f81ac.npy +03636649-b2acbb6717c7a842fcb8d8c6d4df8143.npy +03636649-5e4f40ec0a77cd1e876b399a99a15c0f.npy +03001627-df8440d8678f3a91c8687ff9b0b4e4ac.npy +03593526-23f305e2ca3a3007ee106795de609335.npy +02801938-98c3ddee85264efd7cd51b1084c649a6.npy +03991062-7c86cdecd3b2d29125ebd1cd0b422e32.npy +03211117-5f2048a8af029336a186ecbc0474571d.npy +02958343-de79348d1ab77d2de1274d5dbd93afc8.npy +04379243-290dc618c8ac785cb000f20a5153622c.npy +04256520-d116e9440f64d7a0e7791a1581855f1e.npy +03211117-2361d8f169a7f3479ed83bc63b2fb8ab.npy +02933112-407a485c7d711903ae25f6fe802a8997.npy +03001627-32c2fe641cc95e2d3ed2a8b3ea354e3b.npy +04379243-169deb7aa6472eef2d26358520dd8de1.npy +03691459-f993f348260454bb538cf6df9faa9b65.npy +02958343-780d41c78c60794a6a2345809e2bb169.npy +02958343-e729c1d5c3cccfb3bda733a39f84326d.npy +04225987-515f3fab6bee0c40de82f1e4605731da.npy +03691459-68e85f236ca1b43467cfbcdcd1be46c8.npy +03001627-d454f99b99248bf337c99625b0c170be.npy +03636649-de93987085cf4dcc5208aab875b932bc.npy +03636649-31768574bcddbdde60ad823977adaa23.npy +04530566-3b662a6ae2eab330d7ea446be069b8cf.npy +04379243-47ebb5ac05b46c18488e54fc0c1b4fef.npy +04379243-47758895632d44efba4e573e8ad2f887.npy +04379243-95eb78897f03652eaaf42e97665fa72.npy +03001627-a52e8bd8b570f268f19146fa01c25917.npy +02828884-d8c1f1b9bdbd697b849cf9ca1e2dcbed.npy +03636649-e178ab3b967c7fddc901d9dddb735c9f.npy +02958343-5e857724d62912969acee38782dd9680.npy +03636649-5bd90c0cb1f01b24118486d21a76684f.npy +04379243-a12a759155f4d0ed7eaa96064512efab.npy +02691156-aa07239e9397cf189601fb40d0d298b9.npy +04379243-63aa14915f59ed8671a782a4379556c7.npy +04090263-42291af681d91a6493ceff0200cb9e84.npy +03001627-8c9b2023ecdeb7b049d998127ea6baf9.npy +03691459-993cbabbe4b4bc4431baa3c9ee4148cd.npy +03624134-f0402647fd0236f999abe44c28bf45e.npy +02871439-95eb9d33fae745a616a2b5862518c93.npy +03691459-3dd9222c775b1779239fd9d02eb7da4e.npy +03337140-e34cda176bbac1967a50afc9c93f8a50.npy +04379243-c7358b3aed4160cb21bc3cf138f79e.npy +03325088-832cb748754a0adfe2741a99971b1f5a.npy +03001627-1b80175cc081f3e44e4975e87c20ce53.npy +03001627-58ef4177c711f38fe302d4da760c718f.npy +04330267-45c494c0219a5ffaccb5c4dc056b97e2.npy +04379243-2aeebc06bc97ac054287bb3d3a4847fb.npy +04379243-2ec13926519716142b0659b9edd2a3d1.npy +03211117-3defd11d1a251becc2fd601ec7a8062b.npy +04256520-7f5f4774132a25f3bc8126c23d2deb4c.npy +03001627-5420d4699cf0125fd08f8c5dee475682.npy +02691156-a9e6abca0f6bf69416ee5e3e330ec691.npy +04256520-af796bbeb2990931a1ce49849c98d31c.npy +03001627-4c30d612b8663402492d9da2668ec34c.npy +02828884-648754d5b241b12e4886781cb92ae74e.npy +04554684-83546b11f6c0cbd0c6e1273d5c613c62.npy +04379243-7d3a5c7a3c319544bc4ac3caf16ef65.npy +04256520-8c788c0a04623efbb45ba874f2848e8d.npy +04256520-248e014f31771b31d3ddfaaa242f81a1.npy +04379243-378a4f0524756b0ab20aa91e9e90c311.npy +02933112-ccf7d017b67b51b7b9349bb36676bc81.npy +02958343-488e4530f2b157c2e877e82c90c24d.npy +04530566-c318af82802fdcfa9863712216521456.npy +03593526-6c47d6e5ee3f6a5da8f6851a5d3f13b6.npy +03691459-bb7dc95eb35acc8bfd7a7d6380a6ae94.npy +02992529-4a81237a7fc743763992b1138bb05b3c.npy +02747177-1860c92b11061edce3b4c991629e71ab.npy +02992529-6d85b3dfd681eba530400184d5d3220b.npy +04379243-8991703fa2ac67e7310cd758d9b7cf.npy +03211117-59e53aaa8d8e9d5d9bb1951c99c5330a.npy +03001627-f35645e0b1141804a57b3bec78e5d1b3.npy +04379243-58884a3e77d874efc3bd24f986301745.npy +03001627-9ab888a92d73e4d4a6ffec31b6fb775.npy +03001627-1cc6f2ed3d684fa245f213b8994b4a04.npy +04379243-4acb95a2fc33c3dd19fb4103277a6b93.npy +03001627-6a00357a35d0574b8d7d306df70cbb46.npy +02828884-85bfe701cf6398c69875b72c651247a3.npy +03046257-f01c3ee2b1210cafdb3180683be7ca4f.npy +04530566-bc691ae1f2d6cf0ba628de2fd7989b40.npy +02691156-b3c37b67cdcfd68571d03b466c72ce41.npy +04256520-66ea6f8add81adc848fda83c10428379.npy +03624134-ad5716a9d9b75daf812bade9b93f0eaa.npy +04401088-39e571ec1bcd371bb785a4ac4a0dbd73.npy +04379243-8c5f1bf61d4c1d55b65938a95e1f893d.npy +03636649-774d99cb78b5b82e3a5e6305a3a7adee.npy +03001627-9e5e03508b204754c2b64c0adffbe398.npy +03001627-6673cc5f492f48a229404a50338e24e7.npy +04530566-55d87dea079d2b991bc665188b93587b.npy +04379243-e97089561bcb8e85833c6c72c4b62a4d.npy +03790512-7c989bfae27a958b615e82f53965c4cc.npy +03001627-44ce5f9acd418c7dfebad4f49b26ec52.npy +03691459-b92c1ad2943ec29168faa7730065e439.npy +03593526-1654250bf1bc5a0131fef20bb2ae787e.npy +03001627-acfd2b0f06c128d72157d75d50a75b71.npy +04379243-edf4152aa274a8ec78fe949fc1419876.npy +03337140-a9f6d8883895ba6a19c53845e62c180e.npy +03211117-7940b411f730cb767ba0766d8bbd9a5c.npy +02992529-afa806973174e442ac4f72bf08dc79a6.npy +04379243-51cfb783895a8af9febad4f49b26ec52.npy +04256520-30ae6ca65155012e4b3c42e318f3affc.npy +04256520-22da5fee0352cf194b3c42e318f3affc.npy +03001627-b167632dc5c6c72b19fb4103277a6b93.npy +03325088-aaffe37373701787a5434dd1663ada09.npy +03467517-9ea48deefedac72c441861ef056a75b9.npy +03001627-73a7e497299da43885a2d2169cad3428.npy +02933112-c4db384855e345009f8c3d2002c77ddb.npy +04074963-436c74caa92dcf123c81d9b042c20aa4.npy +03636649-cd05ada0981bd85a2c528d33bca1ac2.npy +02958343-1d700f9bfc275cd23681114f72c10d56.npy +04256520-a46f3d5b1d3382d5cb11c9bb51caa476.npy +03046257-ffbf17fbe4ca367d54cd2a0ea6cb618b.npy +04379243-d1f808613f6dd787a2c8f09e8ae34f27.npy +04256520-2e445df8836c2f55722ac248306b14e3.npy +04379243-ec1e1abd7c9f2eaf5dc565f18990abf4.npy +02992529-112cdf6f3466e35fa36266c295c27a25.npy +03001627-a93d8aa9a17b9d07f5fc96890ba7d316.npy +04099429-b3b20a3769cf8797b95c8cfc3b5d231f.npy +04256520-4ebbe3f30aa1f5eb14038d588fd1342f.npy +03325088-d519321280e573574e65aebfba5f980f.npy +02801938-7a931ec996edbfeacb2a965e75be701c.npy +04530566-925c05dbefada808cfe472915a175bb.npy +03636649-13ec444752bd414bb01c58badc8bbc39.npy +02871439-81a1cbc08793679e75becd8a4c3f1866.npy +03001627-b6a89034b3da55b2cb79ea4974c73b2d.npy +03636649-af8fdc831cc65f0cb0a29c51aa6f10ce.npy +03691459-7c56acc57cae84a9a3e7d768d81f6afa.npy +03691459-3eed264487fcd94bd88a3e0e92891ad5.npy +03636649-b31a3ebb83f3c23f92bdd7f1055f4a13.npy +03001627-10e523060bb5b51f9ee9f382b1dfb770.npy +02691156-1ed9876ed48c145d663e90eaf6b4ca52.npy +04256520-ed1acc5b1cf032b94fb315ce917a9ec2.npy +04256520-fea783c6499e39ed4d304d5dc34c7e17.npy +03691459-956556bceabf511d871b94133e874f2e.npy +04379243-4fb805fd299207e7848af3cb674ead1.npy +04256520-ae1754891182af2675da567c4f0a0f43.npy +03337140-cd7ceb53a90934d04c3aee8e9d3a6ffa.npy +04379243-841082ec0a936a16a4bec68446bb57f4.npy +03001627-8e664a0bcaf9d2a45ca1aaa0789db621.npy +02958343-52a988b361f6cefd685753e73124c6e8.npy +04379243-a859f1f16a230a681a49add4e8d9a4bc.npy +04379243-f7896eb08596dcd6f9883d2fd957d60f.npy +03085013-f10ec7a7acc71e2db24a19cdd6afda6.npy +03211117-66a50da0551d36c9f13ece01395d269b.npy +04379243-1a521b256704b08fb6068c62e84866a1.npy +04090263-2832026da7b9c61ee1f2a1daf140ac9f.npy +02828884-9bd3bcb173dc1fdd73141c5c444ce860.npy +03467517-10b65379796e96091c86d29189611a06.npy +02933112-8d3d624b37b4803c33110e4a1f22f6dc.npy +02808440-4e399a21e6900cb9cbbed63b99f90f4a.npy +02958343-6dda1440d653d0c3bc5845a373118df7.npy +02924116-67658574bcbb1fb041cefd10ce5d6cc0.npy +03593526-6f2c815565cfdb97a1c637e821f12a67.npy +02924116-2c52d56ca79606a9459d3b2509b790cf.npy +03938244-15c98bfa322106a0d291861d5bc3e7c8.npy +03759954-f36757bccf80382a7db5f98d194d7618.npy +04379243-199d183157f213e0da7c128b58fc7554.npy +02958343-b12bcd0ba039b8d09362b924f11fb193.npy +03001627-d0e24e315e67bff2cd80b6234fc6097f.npy +02691156-e6363b1d63f6aad3c1006ed55bc1a3fc.npy +02871439-586356e8809b6a678d44b95ca8abc7b2.npy +02691156-5963e4385e6e5c0925c10fa44a32fd7.npy +04379243-5e70abb053c31036e9de663abbea1800.npy +02808440-f5dfd2eac1ede18c35403ea5eb244169.npy +04401088-5bc22a940bd88a21886d9e4484b773bf.npy +03467517-c99fd50cca7aebcf63e148e250c0340d.npy +04530566-a06a7f4b82beb87df6fc999231665677.npy +02871439-3d91b6fac7df81e4b209708994baff7.npy +04401088-9a4812cc600c67a6bc4fefdf821af065.npy +02933112-7d22aa2a9ce589b37ca94e8674788609.npy +02691156-c624907ad60cb9348a69ce464571d8bc.npy +04379243-a56fb908880a3693af8c4996d9577fba.npy +03790512-788d59c1aa057d8452ee90e577613070.npy +03991062-2352c917dd760e515510d59f3ab1ed64.npy +02691156-733afba7f61652e789850bc84e2ce90e.npy +02691156-b6d2c4beaec0520e9a6e43b878d5b335.npy +04225987-732270ac7e23d610e62bec48c266b5c6.npy +03001627-c6b6f0e604d6a5fe78a7b08b50e4d193.npy +03211117-3317e93256b3f4f15e7087f2d9a278a9.npy +03636649-32c0bfaac424ae9bf51f77a6d7299806.npy +03211117-2d56817501cf5fdbf477ab3f8ee0ba9c.npy +04256520-de14f6786ddc7e11bd83c80a89cb8f94.npy +02808440-721617d5fe78f33363ffebf86d8dd00.npy +03001627-61950eabab269b5c530a9fedbeceb83.npy +03642806-cc691d9e8e189ce47a381a112bfd785.npy +03691459-a159a9bfbe200e651ad88f716ea80910.npy +04379243-98791e9d594a7bcd41f7bb21ee1aab57.npy +02992529-a82fbd031a79f88eb6d41c42f7ade8c8.npy +03001627-e462df8166441ffaeedb49f6d982d28.npy +02933112-c04c1766fcc28fe886c701087a194026.npy +03001627-a4942597dbfd1e683ee344f731525f3c.npy +04256520-4e218928736f1e2bf35a12c589281a9.npy +04379243-4c39c5bcd53c1b593d08add0058f34c7.npy +04379243-b8003b8cd4263cb51573632af24b9a9.npy +02828884-92d4dbddae3f26772056b4bd5d870b47.npy +04090263-b84b0631fa25958f67ed496709eb9df5.npy +02691156-122963149f6a04272620819ddac40644.npy +04379243-70d0937e1d38a9c2a45b742ddc5add59.npy +03211117-3cb53b32b97c0a04c04cf0f68103eaea.npy +03001627-2314a3400230f50d14038d588fd1342f.npy +03001627-3f83565ed40f87c5593ebeeedbff73b.npy +02958343-8c835911f332db4ca92a4cdad802b45.npy +02691156-eaa0d465e9d0c16acfbf0f1430c86945.npy +04379243-e4487798c95013956a7d64731fd3b515.npy +03001627-1f65075818c1d832c05575120a46cd3b.npy +02876657-33dcf806c673d958f4bdca145ed48dc6.npy +04379243-26e020b7c9be193782db9fca4b68095.npy +02747177-e349b1d60823e089da15415f29346bc8.npy +03001627-b50529fcea40cea9e8f8c11a24c52ebb.npy +03001627-74bde5a0a8927f816e107e0a7fbbb723.npy +02691156-dc28756381ac019ac2912ef1a1302821.npy +03001627-46acde1907c1ee378523e42ce157c5d2.npy +03636649-9749404078fe4a8b6afaa22adc38077c.npy +04256520-3ac6d1680c7e0ba4fb315ce917a9ec2.npy +03001627-285931af369b12c2ccd42a2d6eea63ed.npy +03211117-44c3e596206ce29dec86cc96197c0b31.npy +04379243-5d2d0250111a44d49ca96b2737246fca.npy +02876657-6b884893938943f70b5ecdc69e74dca.npy +02924116-e136ec304c87d075a5d02bb361cb2bac.npy +03642806-850673bcbce8f73ec8a6d87a62ac0341.npy +02691156-762e29f11597581d62b600da24e0965.npy +03467517-8c3f4396af236610dae41e77f26f90.npy +04256520-1c78365aa05c3d2d64614cce5789ae5c.npy +03001627-42711692db3647394b3c42e318f3affc.npy +04256520-1de7678ce07c845e91ae3c216ac0d5c8.npy +04090263-2306f0777527603722267cbd3eded69a.npy +02924116-565bd4df285e7715f356d801a44749f1.npy +02828884-d25707cca23ab03ac8d56a266ac05b68.npy +03642806-b51683c6285fa0f69067ac5c9d4ee692.npy +02924116-f66b3c220fccee3bbc2719739d0b9f88.npy +03001627-89c85a35c353ab4c9a037b4abf810691.npy +04225987-16edf6f6574568723f7198a00163bb6.npy +04090263-38c4d7fda771b9b984593c54486394e3.npy +03001627-885c83345016a120c02b229e9105ae6d.npy +02818832-da206aa73f6083781ba83e86537e1799.npy +04379243-48054442012cf1989eea323f522c6486.npy +02828884-6ec8ad28c96e49b588c2a8e73c840fb2.npy +02818832-36980a6d57dac873d206493eaec9688a.npy +03001627-e9df7789d02eb998c8687ff9b0b4e4ac.npy +04379243-5a00f82cae6d2566d249abd69334079c.npy +03211117-c9ff448d7dd7b271c7c51d4ea74651a7.npy +04225987-9ac2d972bedd083342535d908ea693ac.npy +03790512-9b9794dda0a6532215a11c390f7ca182.npy +02828884-15ed07a6b7265f802056b4bd5d870b47.npy +02691156-ad2bebd9c3004b2e151f2df200a24ac.npy +03991062-48e2d1dfac6fdc05cfbdcee86b0a9a40.npy +04090263-2b331127befef5a184727a9a27a761c3.npy +02933112-5799c06f71bf6b88c59350d819542ec7.npy +03467517-e8ce159ab0250cdfb6e0a9d1e411d50c.npy +04379243-e8870f3190f6b8d4bd1025bd755a15aa.npy +03207941-776918b2918b11664a44340bf227e40.npy +02808440-985cd0d15f067f18a08bf4a5e8bfb746.npy +02958343-19f52dd4592c3fb5531e940de4b7770d.npy +02933112-abbb13b953629109d0b36851d61b6fca.npy +03761084-369e83693c7445a48ee2f8110bce2d6b.npy +03691459-6db722284891a7f684f5f65c78855f9f.npy +03001627-f3c0ab68f3dab6071b17743c18fb63dc.npy +03211117-dc004210d943c86073b4ec5aa28d567a.npy +04379243-9f75d067359e6db4f9f8d2db335100b.npy +03001627-f2e7ed2b973570f1a54b9afa882a89ed.npy +02828884-c8298f70c094a9fd25d3c528e036a532.npy +04256520-9ee861bebbc312d97fac4224dd2383a7.npy +04379243-de0267e2e1753bfe684b7bc3f8a9aa55.npy +03991062-8d4512e43c33cd0121f118c0cb20cf34.npy +03001627-ec00ee8e8345be7a852028c7654a8ec8.npy +03001627-116bcb3b43de74b9df9054bbcf5c6adc.npy +02958343-37249c6f16b203de2e877e82c90c24d.npy +04225987-79288e2c98c7be7c6e72f8cfa29d3672.npy +03001627-9c7c3478edebfc1031d38697be8abe58.npy +04401088-16685299c37055c2be40226527c9872.npy +04554684-4c90de8c1b850265bf258aa99523f66b.npy +02942699-6ca77b19e3f52c5031c1d3ccd72d7161.npy +02691156-3aa98ec8f8a1c1f44d210d9468aedaf2.npy +04379243-6327de18a3a3423c947ec73b27c6abe0.npy +04379243-c972e1b113c5972f577be0cbb9f51dc2.npy +03001627-76772a027634c747c8687ff9b0b4e4ac.npy +03467517-80aa2f0d66100844925eded29d6897b9.npy +02828884-8c95e3b240f590c52056b4bd5d870b47.npy +03001627-e454cdb43a7118678162dd776d80e71f.npy +04379243-d120d47f8c9bc5028640bc5712201c4a.npy +02958343-1c86d4441f5f38d552c4c70ef22e33be.npy +04256520-ed4ac116e03ebb8d663191fd557d3a61.npy +04379243-1a10879bcfca0534f8bc1f8036e08e44.npy +02691156-f8ceed6c984895079a6e43b878d5b335.npy +04379243-4f59b7e00a94352fb0bf045ee98272fc.npy +04256520-8092428a6a37b0b9970d4dd67731c543.npy +04530566-73c6ef5ee071b7f9791ed0cd6a81047.npy +02876657-41a2005b595ae783be1868124d5ddbcb.npy +04256520-9f6d960c57515fb491264d3b5d25d83f.npy +02691156-9e8f908bc6c822ae3f6fe63822cb343c.npy +03001627-459bef9cabed55cc593ebeeedbff73b.npy +03001627-5457691268846b073ca87feffb4fd9a0.npy +04379243-72a697466cab7851f51f77a6d7299806.npy +04379243-5245ab687729495b8c728dabc1255d.npy +04379243-70e603b83e06f7258de9f116e0231954.npy +04004475-dfd4fa58919862a071863f1e1f0d28a4.npy +02958343-2bbea02b59ed2bab944bfc22204b55bb.npy +03691459-93b8f4ddd36419998cbc76a30015552a.npy +02958343-8bb2ae81ca9e9a4ed14ae991e75ee782.npy +03001627-a9e72050a2964ba31030665054ebb2a9.npy +03991062-2f06f66740e65248ba6cf6cbb9f4c2bb.npy +03467517-df959f68bb22e402a24eeca91f583600.npy +02691156-41d4250764619ff5bbf3143b1cb6076a.npy +03636649-502e62c502cf2f10280b54299018290b.npy +03624134-172b9a77462dcdeaed90ead9558ee6cb.npy +02992529-8f3dfdb531d1b5dcb4ca066f17bc06cf.npy +02828884-cbe6101e5199ca2d88c88a4c0a3c4a21.npy +03337140-3076d27c5ed34949ce5d6e9371bb5c33.npy +03001627-3669c9b2954c730e492d9da2668ec34c.npy +04379243-2bc602c2b7d9a622ee05b1e9462446d8.npy +03467517-1b91e01820c9f2f0140b4ffd009f9ae1.npy +04530566-efc4de2b174c736dc99bbfcf5650bf52.npy +04330267-afa39ab158e8edc51ee4e0b833e7dfbc.npy +04379243-4afa7cb9a042b7e3c4f66791e25960f.npy +02691156-895939bb0da197f8303d346f4be7d4f.npy +02992529-14726c2482a092d3a9fe1734a6086750.npy +03691459-9d62d13afcca23d841c6e77793c5dc94.npy +02828884-c2c0a205bb318031ed98cca8f0ccd5f7.npy +03797390-b46e89995f4f9cc5161e440f04bd2a2.npy +02933112-48e0fa8a06a163014da5feafe6f1c8fc.npy +04074963-647b7f4f47b3fea54dc062c02826dec.npy +03991062-28859f582ed2c8a0f99b89f8ef639ae3.npy +04379243-2820444f78ca0d82399f8b5570a02c59.npy +03001627-bceab717048f35fea481048c76a35623.npy +04379243-77e03976667383c3d810b14a81e12eca.npy +04379243-dc49259a117af8f1d200faae04ce3f8.npy +03636649-8cf524d8cca9d451fcb8d8c6d4df8143.npy +03325088-e6a64eb10a355f02aa3dee53ca79e7b0.npy +02933112-5906bfad8f6d794f490ad276cd2af3a4.npy +04379243-5ebf57428b18f78a1ee6305032661052.npy +03467517-6c731c424671345c63e6b27c89da971e.npy +03001627-3fabddc7c0fa27f92bdc75f1ee88d8e0.npy +02871439-8815c0f0a0e21be7a09649082c657e65.npy +04379243-2c6beb9625fcb1a43c7fd9917aa4ff1e.npy +02924116-532569f907baac9134ac4f8ff2084698.npy +02828884-1a55e418c61e9dab6f4a86fe50d4c8f0.npy +04379243-1f067718ea071a4ec804f0ac5b784b6b.npy +03636649-2f2d4805ac5eb033e49675db0062ac74.npy +03797390-1c3fccb84f1eeb97a3d0a41d6c77ec7c.npy +02691156-18cd9dc7631ef3064c41882468413db8.npy +02691156-93ba822e84586999e3375a6b96a1d765.npy +04090263-5395c4dac8e66ab6543fc9b228fa4afd.npy +04379243-cce2b5399e5e46a45510d59f3ab1ed64.npy +03991062-f1d505c01e188533b11036f4855ac4b5.npy +04090263-7537fb364b25e32e999562d1784e5908.npy +04379243-79df23303a3192c1cdf1dfd78f33901b.npy +02828884-e28f8467945b5d526070f6b7b2547ecc.npy +03636649-670ad2964ad5a98c9f1a71e46bbde97c.npy +02958343-ec42bd73d57580a85b48f89d50b1db79.npy +02871439-eb7b06f942f4c8fa42e99d71e01c9ff.npy +04530566-53fb6683aac2191fa8a3d44052f8cb25.npy +04379243-bdc7c9339145602af51fa0238791f5dc.npy +02828884-ac4de7e08bc1f024c955e5ed03ef3a2f.npy +03624134-d68ad03780e0e08ee527a71b8fef8ccf.npy +02958343-6b7f573997bc6f8c953536e7c905b301.npy +04256520-7b405c1d6d2dbea9f91663a74ccd2338.npy +03636649-3768d9037d103d9630a24fed263415f3.npy +02828884-e18d11ff6f781d843d2dd82a57bb3bd7.npy +03938244-ea69362db645cb4c1185ac82ed4da80d.npy +04379243-236380670cdbf2c3a4a70f7cc08674ca.npy +04379243-bf17779bec6abccf161bc5243aab8ea4.npy +04468005-e95ce94f475f77d16d99dfe91d90e769.npy +02691156-54885d5beee4e76ab63969f9f8d6f075.npy +03001627-7a79fdfdd72f06e9f8bc1f8036e08e44.npy +04379243-ef130b03885738918f7d9678498f2295.npy +03001627-9910380fedce395e80165d5b901b6e64.npy +02747177-2f00a785c9ac57c07f48cf22f91f1702.npy +03001627-111cb08c8121b8411749672386e0b711.npy +04379243-e05344d8bd3ef63c5b7bf37141f96eae.npy +02691156-36393e03ed11f78461f1ef59130c405d.npy +02828884-ae9c8421189f6590809b609a351bc774.npy +04379243-8c1775d71c36f89d6ca407465d3c74d7.npy +02992529-7a2a5b36831f45501b670e8e7f0f2c3e.npy +03001627-502be527c054ebca6e0ad36e9a10bd13.npy +02691156-7f837b389e885af471b4c018296f73c7.npy +04379243-89aa38d569b025b2dd70fcdaf3665b80.npy +03001627-df2b7e697ab6ca0f155d75bbf62b80.npy +03001627-5ebe4b9a29d5c0274de7ed732f5aeea4.npy +03624134-832cbaf563c649305eec6d8d24f1fde1.npy +02958343-62499fa5041de142707223ebf2d3b38.npy +02958343-ced56d51c144b40373dc6d54075665ea.npy +03001627-980feda55fe02c5868e9405ab8968607.npy +02808440-2d765fd16aedb02b362845c6edb57fc.npy +03001627-cb714c518e3607b8ed4feff97703cf03.npy +03624134-60277f4060b8703e4e18d7136dc2dc80.npy +04379243-322897a771d4591f980d4e1477df0f00.npy +03046257-32a7331dfe2c9a866463df620b7b4cbc.npy +04330267-8bc67008044e0e8f843f813f752a5e35.npy +03691459-abd3b55d14db9b3c8db1a0ee98c45ee7.npy +04401088-acda976ba347a3e58ba35fc6cd3da287.npy +02958343-8922c6c3435f16fee694960c91796f38.npy +02958343-3e7884501c806601b9fbf66e2446b0a9.npy +04256520-9f5b090a3697b05f8f9cd2ac878055af.npy +03991062-69c0cf5ac04d356c6211b44918593b2.npy +04379243-904ad336345205dce76bc197b3a3ffc0.npy +02691156-9513fcab860b113795ff232cd38210b4.npy +03001627-d4b5f8edc72b4676f4175ee3a177350a.npy +02958343-c20ff7778ca2b8ca86ac29addefc0f11.npy +02924116-bb6a09f63ccb939a2d4ead5a1be351b7.npy +03046257-4468cc03f0d13d4286322e4cc6f2fa7b.npy +03001627-b8e4d2f12e740739b6c7647742d948e.npy +03325088-1c5b1091af3106fa2c3adce840300a4c.npy +03001627-fa27c1b8dac76b6d1f285be552b78f9a.npy +04256520-490383705f78d366bf67ac39195100ff.npy +03759954-ed1328cfa8749bb8d80ce3f2fd66be0.npy +03001627-1ef31b046039bf985c8a41baad250b1b.npy +03001627-ef2da724b16ae36654e404e041bdecdd.npy +03001627-3f41b4339ebd59c1c397356311cbeea4.npy +04090263-e88c326a1c2a570fe2bb19fbad3e4596.npy +04379243-e7b99aea5bbb980ad617d95dfd4d6158.npy +02691156-e3b06cf8bea9a6a5c1006ed55bc1a3fc.npy +02924116-7b86fbfc235e124e797ce0caffb8a237.npy +04256520-1746d1c62d9efc742665e2e07399c56f.npy +02958343-2d096d5dc0e0eeb370a43c2d978e502e.npy +04090263-e1f94a758b97b728c2ef4561daf0cd46.npy +03001627-37ed1b9ebaf4b92deca22c501ad0a77a.npy +04256520-2b4de06792ec0eba94141819f1b9662c.npy +03001627-cc6d6035bb5074261f98c0761af40e04.npy +04090263-30a2198addc7de5cedb0c6ac5ecac060.npy +04379243-a017b980b5bc255c19fb4103277a6b93.npy +02691156-6c87f8378066f8f171d03b466c72ce41.npy +03001627-42ceba8e460de1de820898ba01899de3.npy +03211117-3fc7b2412782b8e9964f7ff178873e82.npy +02933112-99ff3359d64f1f45ce5d6e9371bb5c33.npy +04379243-41a4cfee883a91f2d9ec500769fff320.npy +02958343-fe2ce22107693354f1cc1cb691702a23.npy +02691156-4a559ef6547b685d8aed56c1a220a07d.npy +04099429-668aa148b7147080227275b7e0831bad.npy +04379243-65f126afcc43ba69a4d89a7050f2b7cf.npy +03001627-b7a1ec97b8f85127493a4a2a112261d3.npy +03001627-54fc8ae4211e121a55450780441af433.npy +04379243-1c9048855223f744fb85ea6fd426098.npy +03046257-e8cbb09dcdce16f172b9579598bda76b.npy +04379243-38888628843f7b38f8b8d4a282992be4.npy +03211117-74cb25b4b8b2b89df9f3c6290096f50f.npy +04379243-5354ecb0e3aa1da074a16879fb3ac81f.npy +04379243-ef1e4af0d76ead1afff16555386d173d.npy +02691156-cb7c32bd7266daef37f38dedb2f1219.npy +04379243-e263fafc76ddb82b4cc80585c0d3d970.npy +03691459-101354f9d8dede686f7b08d9de913afe.npy +02933112-65f11f7cb5c5106eac00fd1150223027.npy +02924116-2142f1b622cc1b07e99562689078395.npy +02801938-cc79f97e37dd431ecbde89e0c48a01bf.npy +03211117-51b92bb1df3b1a10ad1d87becf13ddd9.npy +04090263-421da608bba18bf2688fc2fc0a14edd5.npy +03991062-b33edd2dae68b9c8cb2a965e75be701c.npy +04090263-338998b6f6f541c712b38b1d99376c0b.npy +03001627-123305d8ccc0dc6346918a1d9c256af3.npy +03001627-9c3e53d9d1e653c0bf80985a99195eb8.npy +04379243-d5b21d6154c0795813dd6eafe1477be1.npy +02933112-31a7cd3b7990834cde650492e45fb14f.npy +04090263-9278d3daffecc60a8e75bb5638d14ce9.npy +02958343-8648667e03bde366b17445a1c29f6d34.npy +04530566-1a2f00c6886f14354d85fb76de815344.npy +02691156-75d162523d703917b87697d3904b168b.npy +02958343-ef6b9ea0fbba6af828ea89475d3a158d.npy +04090263-a5f8af7423a45b293568a24dac4b6dc2.npy +02808440-3bbffbe6bf88c8cb362845c6edb57fc.npy +03001627-c12dc91e3564d8e3473f10e6caaeca56.npy +02828884-575595ab81e657315b3aba3f0877c74f.npy +02958343-a50a46d3423e7dcad1eb2a2149d13665.npy +03691459-aa8f197979376d792d563c85edb49108.npy +02992529-80243e34f66a503bea95e61f66327e28.npy +04379243-2c0ade2de5ed1ad66df14337f24e49f4.npy +03991062-d2fefb9c0ee02c2ca2c59a4d90e63212.npy +02691156-9912b47f0efc512b8d548f89c1029ea3.npy +02933112-956c437be87a2be5f51f77a6d7299806.npy +03001627-f2f0f205af792d3d40332412c5d013fb.npy +02691156-83cb2b58d88c0ae3f4fc64fb3aaf41d7.npy +03467517-5beb3384470cfb3e18edda4db8cbb5a0.npy +04379243-99720647e210078beaf288f952624966.npy +02958343-145e18e4ec54ed5792abb3e9ac4cd40c.npy +02691156-adaadca2be822544d81b6465d8dc20b5.npy +02958343-903b043072a209ba8290d32865eb3245.npy +04256520-72045d74edb0547581a172d69c52a28a.npy +03001627-939383f36692508afebad4f49b26ec52.npy +03211117-b3a975cb984a8fc6cc98452c8fce6b43.npy +04256520-8d0472ffc368a8e431b5f9e34ff03906.npy +03790512-3ef6b2e0a896e4ce54d08b5b71c0b603.npy +04379243-90f7b8cd8e41321c53315facdf531a34.npy +02691156-37f2f187a1582704a29fef5d2b2f3d7.npy +04379243-d1e231e9fc0e9127ea6202eee73b76a8.npy +02691156-2c16ac865f06542381598514fe928082.npy +03001627-28bbb851dd01a162a5615d35d4766b93.npy +04090263-2ad7a0bc552f1df96b2c8bb96250e4a0.npy +02828884-3bbca1223d18e2caad5067eac75a07f7.npy +02691156-a1a58070ca1749d76abbb3e202b76402.npy +04379243-673dc4bc9271880fa320e34dad7c78bd.npy +02871439-b587e9d84ce2158e1933ffef19678834.npy +02828884-b83b544f8536375ed00e4d1c6a5a3a74.npy +04379243-dad3122c094cf582ab82b08bd2b110cf.npy +04401088-5cc54b5db73e9e1e6decf1414eac2924.npy +03211117-b8386207364e622d5e7087f2d9a278a9.npy +04401088-69e45e401c1d05b767d8789d3a6519d0.npy +03261776-91a17b47f79aca8b2ed3579bacedc134.npy +02747177-9ee464a3fb9d3e8e57cd6640bbeb736d.npy +02958343-9f2721257bcbfc70dc1fa1f50eb490cc.npy +04090263-d91c45e8d51b2ffb12b38b1d99376c0b.npy +03001627-91cd85647eef236490e75b1cd0f0169.npy +03691459-ab70b452a7ba1c445f46e754938b29e8.npy +02691156-e2612c366bd11e305e9e2656aff7dd5b.npy +03636649-914a876b24bea577e97426e55fb77981.npy +02691156-a69edb40dbc1fc6c66cf1b4a8fc3914e.npy +02958343-5dcbc04a1ce783eb73f41773bda9db5c.npy +04090263-94d526e75ba18f3326243ac6fb5d9ad9.npy +02958343-4b841ea5b31090fe2bc9f17412005422.npy +03001627-892381333dc86d0196a8a62cbb17df9.npy +03624134-bee1a473472639e25ca3862a7efa6401.npy +04379243-a9cc8112fb8c4ed5dfd21203bf8b4b46.npy +02924116-377b4d3e6b5c47e9f5d789e33b735c9e.npy +02828884-704e4229c7f8a0771015feecec1fadc0.npy +04530566-42d4dfd73f7e27677e72e199dc6b40e.npy +04379243-34da9450728ca9fee0be4360cd00cfc.npy +03001627-94645127bd4168e03e63b721c3743983.npy +03001627-6352d748b1843287921ea62370e5ffe0.npy +03991062-4635eae69badb028d26da3063fcdd79.npy +04090263-5128892dbc0e8e4d12a8e5e6e6618c8e.npy +03001627-c2a7da6a1e1f896a301e9490bfb35bc0.npy +02691156-4ea714b785e24f0d9a6e43b878d5b335.npy +03001627-3289bcc9bf8f5dab48d8ff57878739ca.npy +03325088-8b96750136eac3c5c36fb70296e45483.npy +04090263-bcc0a71596e9df4a6314c3b6a3a65519.npy +03636649-fb76c5cd78d3c9deea3655638ad668b9.npy +03636649-7fa0f8d0da975ea0f323a65d99f15033.npy +04090263-409306cbe659e516bfd79d2627fd465c.npy +03337140-dc8eabfea086d0a7d6d49cce41472b6e.npy +04379243-888faedfa6002b8cdd7e7281b421bca5.npy +02818832-3fc3087faa29bce5b1b6b0c5ddacb607.npy +02924116-2d137b4ea44c3abbb1626da45836ca54.npy +03593526-d73ff526d74baad2ce891e9ba482e12b.npy +04379243-dacde6546ca2e07f66dc6ea1ac82d91f.npy +03001627-d6ac690c293a492d2d2a5d4c4022b4c6.npy +03636649-185e37856f55b2c4e9aa07397ea1cf8d.npy +02691156-ff13be97bdfa45f8254dc1d04198881.npy +04468005-3496b32efd7d03a74da9f355ed79f620.npy +04379243-c87729314f0a7e2fe67d6af004465e0b.npy +02828884-e68f6dfeb7ceea7084663e651cb1f07e.npy +02691156-e93a2143cbec37a173fac4529123dfb2.npy +04379243-e2a2fe3713803e9e04e2b29e7a72f7.npy +03211117-98b12e9101b3d93c972a63e345b45a25.npy +03325088-e173499d5c1b9aaf72101dcac4ed75d3.npy +03337140-f1bb8fefea5543554c3aee8e9d3a6ffa.npy +04530566-7a5de2857213a2547ea0f302610f14a5.npy +02924116-e79d84edb9ce21af550f48125b5f584e.npy +04379243-4e03170994b4347e6f1e07a56c129dfc.npy +03691459-a4a51863fe887cd970165cb455c090fb.npy +02843684-b68f37561d77468da6ffec31b6fb775.npy +02691156-c12d132ade345228d75cdfed9b20c6e7.npy +03001627-648fc7caefda981543d890f2dbb65163.npy +04379243-7ff6c7f050eecd378c9b2896f4602557.npy +03001627-udf068a6b-e65b-430b-bc17-611b062e2e34.npy +02958343-c18c78cf54b60f078e62780ddf14e62c.npy +03001627-8ce6f67b8683c0126db434563c7f5ea3.npy +03211117-ac30fac9534c509f2de252a52ebb4cfe.npy +04530566-86e404c548d965c6d28357d0413f2f80.npy +04379243-ec379ae9e5d850459f2349486c570dd4.npy +02958343-a532b61524432d454ed192f2298faac.npy +02828884-23378697712a8dc2d2b12aa6a0f050b3.npy +04530566-72eb488206297aeaa60ce6f0a0028c13.npy +02871439-f7b93826de3020f3a5f3ebd90cb33bd6.npy +04379243-a542ba8480b71843cea3bc3a9009695.npy +03636649-f0131187d57b6390fcb8d8c6d4df8143.npy +03001627-aa80259311e2a8c0d8bd0a659ff7eef6.npy +04379243-de46aee11f397e1c5af597c14b093f6.npy +03642806-950d3ea26d07b7dafdc319d8ace3a11.npy +02828884-1147218db46702242056b4bd5d870b47.npy +03691459-8e632ba25f8af84b9069c2d361390698.npy +03001627-b7184dd450c5fc2e17c1e3c52889f7b.npy +04090263-640bfdaa8cf5e3cd325474a1336ea459.npy +02828884-34577ccdcbd46908ed98cca8f0ccd5f7.npy +04379243-2b06a917abc1150b554ad4a156f6b68.npy +03211117-7e53c694e5a223346989969642549931.npy +03211117-d330d50a0255529d19ed6e1a590c9122.npy +02828884-5117dd16339a8b943ebaaaea70571daf.npy +03636649-f8d4e335655da8855e1d47baa7986b2b.npy +04530566-d7755acf25baf326e625a0837cc45a0f.npy +03001627-fd4cce51df6571ecd204c1ad14be926b.npy +03001627-b16ae1856433e726786e4057cea53718.npy +02933112-9fe8af4bc8683818579c9a60a6b30a2a.npy +03207941-5596ba626d613f2bfede59875ed98083.npy +04256520-14c77d23044bdfd5327289c00b6dc9ca.npy +03001627-9d9d69e5f2bc80a867903707764646db.npy +03001627-668857eb0c18b0785dc3653f8341633a.npy +02958343-19245fb8ee79038fcd059a326bfe20ef.npy +03001627-46f6a6e0f239282fc8687ff9b0b4e4ac.npy +03691459-77433c14eb1043a91e5b68ee10358ea3.npy +04530566-e28a79fa4880c3c5b0df8f7e348f816a.npy +02958343-cfb4626f879c8355b4d8ed7f5558a6a6.npy +04256520-120735afde493c277ff6ace05b36a5.npy +04256520-ffc0bf43dccf71865257cc5c33f9e8a3.npy +03325088-8fd048fe9a092189979c556124bee033.npy +02691156-8f39cc306f68c89c8139630c61d12904.npy +03046257-7b99bf2508d8c5f36d684a4a25bbc7fd.npy +03337140-90d57e3d7ad999254c3aee8e9d3a6ffa.npy +04090263-79f507c3befe69ba2987a7b722c00b7d.npy +04256520-3c56ceef171fa142126c0b0ea3ea0a2c.npy +02828884-9c9fc31bba4881794620a50068fc504d.npy +02958343-7e63db420468e1b1bda733a39f84326d.npy +02933112-ba6c211ed08d5c1b292e33b9f44edab7.npy +04530566-d4882179bb3a1868abc6b16fdb345d24.npy +02958343-a295d3ca78e2fa9a6a2345809e2bb169.npy +04379243-5d1333eea1b2a9bf85857023d32c345a.npy +03001627-9a6cf471cd7e26566acb4ace974ce36c.npy +03211117-3f4a2b59d82e0f353e72acd01188238a.npy +04460130-9ac90e8814cfe72dca7b89674ac5c6e2.npy +03467517-6a2ffe917b2171497b1bccfe0b4bbe47.npy +03790512-3de5068dfcbc766d3b44aa8d94a815c0.npy +04379243-587f53986db55d45738e43095496b061.npy +04090263-5835ff29188f0f493bbe4035b770f62b.npy +03046257-96573e0386f36abac5daf15558a4e938.npy +02691156-9f25e4e0aa598c7fabda204c62559ac3.npy +02691156-5335e5be2619bbed8141b488a44e65e2.npy +03636649-3a5a0f4c78e17b284f0c4075db76b7c.npy +04379243-a375aa82c58fdeb67cf50d57d36c5a02.npy +03001627-8e1d232ce609392ebd8eb8ad250e5135.npy +04401088-3ed359e502a24e5a79510444cc61f839.npy +04379243-6e45d510dca43cf6490ad276cd2af3a4.npy +02691156-7315cd530e4858246ed10e8f7fe336e.npy +03001627-43d40b726c369eaaed98cca8f0ccd5f7.npy +02958343-269676546548fba38e271c56304de147.npy +03001627-d6edce467efdc48eba18ade30e563d37.npy +04379243-1844a4ed0ff7ed38c2474c54a2e772f2.npy +04379243-72a7c2a8221afcd27e6cebe5e9a662c6.npy +03001627-455829a425b5f919fc93c3b1c0fca400.npy +03001627-e93714e5553f63619215045784774049.npy +02691156-83778fc8ddde4a937d5bc8e1d7e1af86.npy +02828884-381317c1e4c91e87855931d119219022.npy +03467517-d546e034a6c659a425cd348738a8052a.npy +03948459-ac39344e18972fc385eeb0104312297d.npy +04090263-fd00cdc539fded38ddd7320ddee77bde.npy +03001627-74a8078a8e89872780360680c1602c7d.npy +03928116-e8e4c13587e7a5ea6c0a067418a01c18.npy +03691459-4902b88bb0834522ea9b57bdefcbc9bf.npy +02818832-e07dffd4c5607a6672b7738d7a601564.npy +04090263-f499b088e48914256f260fa9465b564b.npy +03691459-a8f3e98220f34623b3d8c1107f6ae528.npy +03001627-1d8d16c0750f22f5ece93f2bb0b6d036.npy +04379243-d5d8632e5a2a286bea46bea76c64cc3d.npy +02958343-2dbfe9c041fc6b3a94ce9d7b04676231.npy +03001627-6b6507085db5a631f3c9c1464e55d580.npy +04379243-2df1f411c26e7d93ad64f84f9d54ddae.npy +02958343-7e12d83df581424ee61b9ff60b1be412.npy +02958343-676ea229aaf8f90858c27e607f6e2d4c.npy +04379243-c07c9ca0cfbb531359c956f09c934d51.npy +02691156-f97fa7329969bcd0ebf1d9fd44798b9b.npy +04379243-23dffe55684018589030b5e29a228aff.npy +03001627-6079b4aa115d08c28998b3b64a143d42.npy +04530566-77a02f09cd22e9f879863338881ed398.npy +03001627-d51112040176efccd5cb6d178687b980.npy +02808440-9c2761796fe65c9b3af30a3946d92feb.npy +04379243-7f7bc0b7e275d1079477196152a8f4a2.npy +04379243-641affca2294fe1879368d1198f406e7.npy +03691459-84d2d9ad08b4c39029cd33b1c7847c1d.npy +04379243-9bac9418d56234bcbc5996932c1238cd.npy +03001627-93bb03379efddea148bc9dfced4f8d35.npy +02924116-2ba84dc6a7d2070b973f659238edf3c3.npy +02933112-c55a7e2cb3ab9aea8ca4aeb5e3b33af7.npy +02876657-f62bfe9756ae99be9921431405933fd2.npy +03636649-d06ab2779bb0b73b822a33e080d0e71c.npy +02958343-af60bafcdba34eab56de8db8652eec4e.npy +02924116-d4af2f443f0ac8b4635756f2543f41d7.npy +02958343-b4250be25fbd19a994abc9429888948c.npy +02958343-adda68ed2da5cee0a413908c0e169330.npy +03001627-ffdc46ab1cfe759ce6fe3612af521500.npy +02933112-aab180818ea51dbc7cd8de3984cc1e94.npy +04090263-4f98bd25bb9e03ef7ec95138ef83ef2f.npy +03691459-9d62c46fc3fd343d1f9f3ce366e030fb.npy +04004475-11ff4341475b3731c39a00da16746b95.npy +04379243-e026b4997f7d037c39d3717288022c20.npy +04530566-eca25540e280ac1c2d1e53cffa2132f6.npy +03691459-64aed24bbb7542c6afac285245c66df0.npy +02958343-300f9c418d6ec9f6473f10e6caaeca56.npy +04379243-88e06a85e2a0f99fa7e7cb173e141227.npy +04256520-deb7ac5670e9bb27af8808fbf39db46b.npy +02808440-a91650269d8efbb454d7082b34825ef0.npy +02801938-9c7cdfa8de249b6c924bf081da6f024c.npy +02933112-aa3e41a51b1aa79a4da5feafe6f1c8fc.npy +02747177-e6ea9e633efbe1e281faebbdea6bd9be.npy +02828884-192684f9de3adfe827ee88e8274f281e.npy +04379243-ce3c408a60cc0e19e6c5cd45aa112726.npy +03467517-8ba739111f5e7c50373ab6cb5c0c1bf6.npy +03001627-3ea3cfa145794baec2454d017a7fc2b1.npy +04379243-a38f012987a2b29593df8c78d1d8e26d.npy +04225987-f5643778dbcd653655a834a7aafb0236.npy +03337140-8b0411805e3dfc164c3aee8e9d3a6ffa.npy +04460130-edf288c16aa9797a4d423544e7c5cb27.npy +02691156-1f47381312c9bebc9bff604afc480b65.npy +03991062-73475ea71ad4af98dff284ee8fea7cef.npy +03001627-465cb28961d2680bbda72093f9b5aa73.npy +03001627-26e8033e59a3adf6bb53a6a5f5051240.npy +03001627-5027bd5ab457e99068821642e9a54505.npy +04379243-20e65777d2ce327035ae67400a94a6fe.npy +04379243-3c46109dc46f1714cb2a965e75be701c.npy +03991062-fe7289fd89f504aaf91cf8caaf3da124.npy +02933112-dd2325abe32870f5a99e0f0bf1de3bbf.npy +02808440-526f26b56fbee9221291d1279f7bf122.npy +04530566-1fb578de4aebcd62b249fd16295bbfb.npy +03636649-da12a5d96b465cf6bced73c51e99f8b2.npy +02828884-16e3d7f2b75cd67dd2b12aa6a0f050b3.npy +04090263-e3d49735508753b6ac6a323abb28e29c.npy +02691156-e0e0d713c8969b52ca8607f540cc62ba.npy +03691459-92b24dc36603b59685a979ae0f537b4e.npy +02691156-26a29227d6326e20e63e266a803d9270.npy +02876657-714320da4aafcb4a47be2353d2b2403b.npy +02933112-695002fbea3c5e4a9a6b496c6e9f4c2.npy +03593526-311f29deecdde671295ffb61d1cd3a33.npy +03948459-897e6a6307da50906314c3b6a3a65519.npy +02942699-1298634053ad50d36d07c55cf995503e.npy +03211117-74e3d29a7e0d5bc48ce0f31e09d08e16.npy +03467517-511fc5ccf4f1c857a24eeca91f583600.npy +02691156-2c49289098e4492bca8607f540cc62ba.npy +02691156-9d292c07f1dff16e1304733e0af0907.npy +04090263-bb95e848c9e1940a2b299c40b68f70c.npy +03001627-235c8ef29ef5fc5bafd49046c1129780.npy +03636649-a2ff853cea4e3ff5bddb797cbb74c.npy +04256520-c6329e1d12285ed761fdb06bea79b81.npy +03001627-5fb53dd1dc9453e77eaeab1f0c9120b7.npy +04379243-2a7130734389335c5c5a7639ceca3973.npy +02958343-d5c046451e5bd6826a9c18480b4632cb.npy +02808440-e7d3cba805b57f5fd011a170fc36c24.npy +04379243-5e4a74e0bfb5bd2835836c728d324152.npy +03790512-9324341a957733ff52ee90e577613070.npy +04379243-230047ad76c117412cba66dc6aeabcd4.npy +04379243-8a385fd026d4efdc517376ab44a447e5.npy +04530566-a6af4bc3629fc5101998595492ff7acf.npy +02691156-7bd76c17b7194d571aa9d8d95b6740cc.npy +02946921-52e295024593705fb00c487926b62c9.npy +02992529-60df2f27d33f3f472eb2c67660ce4f3.npy +02958343-bd3130013af1d709be95cf6cfd2d0f0e.npy +04379243-e0ab42e831e007cf9be2020f4ae1ea66.npy +02933112-7cb09d16e07e1d757e1dc03b595bd36c.npy +04379243-e0229fb0e8d85e1fbfd790572919a77f.npy +03261776-943048e64cc2bc980a070963925e308.npy +03046257-2f638d0d4d5cccc35b903ba10d2ec446.npy +02958343-ef15b938dcfa9893c4d922e8a1141322.npy +04379243-3c686ac317c496f9a71c812e027f94d9.npy +02992529-59e5dc88174971c567964ba700cd97f5.npy +03642806-4e8737495201fa3f71f82dc8af2fe0e0.npy +03797390-f23a544c04e2f5ccb50d0c6a0c254040.npy +03001627-362f53ee8de161fac653c0205ce8ff57.npy +03211117-7fbb5bb76b0058be972398ea2df8e7c2.npy +03325088-49532a66e2ae68c6ec846e583adcece4.npy +03325088-78763ba6006732c754d7082b34825ef0.npy +03001627-9619f0c887f8d879d79b19c7c4f0e293.npy +02871439-f51959078d93caed379cb0fe259da0dd.npy +04379243-23e1e8b7ea54079cd5217e3e48d1c0d9.npy +03636649-18145f4b303c37f11c3739edd52fa3.npy +04379243-8965a7a0234bfcbf82f29b648e624c33.npy +03337140-30224544f65279f24c3aee8e9d3a6ffa.npy +04090263-47a40af2fde212a7b70797b2c89f136a.npy +04090263-d03318b031d2105b5bd5996a1713323f.npy +04256520-2c7d2bb93b49197cded06cbcf08b2fff.npy +04256520-63338a227246399141fba545b7232cfd.npy +02958343-3a735f1a5fe8906cab0fd77f2e9aa584.npy +02691156-ea58a51483e3604897dec65c2238cb8a.npy +02691156-c398f78fb73ccf29751c7a6f15617f4.npy +04379243-2d1400cf45b94df051a0bc243f04669e.npy +04530566-d8d49c7e002656aab572a59093f8c0bc.npy +02958343-7b01d9b011361e82a7fd25564c2e888e.npy +03642806-1d20a8518db7e689f0b97bc9b1844ffd.npy +03001627-4623efb456cc6070820018801b237b3d.npy +03691459-4f0173cf9b1472c37d4f87d95d70ab8.npy +03001627-447856e1071e8b83c036a40816608369.npy +04530566-d66b7128600af54e7afee304cce81d6f.npy +04379243-24dfa4c63b11373f5bb375b194991e4.npy +04379243-9ce692996699529b8430b7446f9e1252.npy +04530566-1c6c51d2d315d576852d4401c7cd1fee.npy +03211117-26c4051b7dfbccf4afaac116abdd44e.npy +04379243-915855afcc5f8918ab27cc93fdc68c94.npy +02828884-a5669fc418b91f9959cbde03ded257fd.npy +04090263-52486aec2292ddd48f0d3a3dadaf3299.npy +02933112-131072b0a226f05f51f77a6d7299806.npy +03636649-dd22b87797f960f47b0f9bd97c2f1a90.npy +02818832-71ebb1db4d8ef7c51db05bb2d8c217b.npy +03790512-24e12e9dfab0892e468bac13e007a6e9.npy +02946921-408028e3bdd8d05b2d6c8e51365a5a87.npy +04401088-e691c8f0fd7d64d7ab0b172d4dea80cd.npy +02933112-1ae6d530ee86ee9a4d87481e09b681b3.npy +03001627-47da08d9c7cd7e104b3c42e318f3affc.npy +04401088-2dccc7cfff6f9a28aca331f9e5d9fa9.npy +03211117-37a5faaf0eb38031e0e89fd83955713c.npy +03211117-2809c09ef575f34214618fe9321a9ffc.npy +03593526-c444d4f782c68dc9140cbb818dee6c.npy +03001627-7521f2a08fae96a7666933f2248e8d9.npy +02828884-aa27d1ed2ebb8ebdd2b12aa6a0f050b3.npy +02924116-fee9872b2821b79f366228b8d159e36.npy +04330267-1d032da39f25772fc99ba9ee5d4194d.npy +02808440-6a6fed877d517549b12da0b74652c93d.npy +04256520-470dd418057f9946a30f938496151204.npy +03211117-d854bf9f589e5a6e69a98c3ec2f88e7d.npy +03593526-1a953dddff37998ef0a5dc57c9d2438f.npy +02880940-53f5240e1e82c96e2d20e9f11baa5f8f.npy +04379243-f4b820ba5a347d939e0a5cd76ae8e45a.npy +03325088-e422f89f233787d7b362845c6edb57fc.npy +03325088-e2fa7af63f902bebb7a867e9b35a1295.npy +02958343-783577d449be4ded3121f82ae456ac81.npy +02958343-35d1938e4ab14fa79ea5c205086e2a63.npy +02958343-9fb89a485c814f7e18f8769175b6766b.npy +03001627-8f2e3c9cb5f25021492d9da2668ec34c.npy +02691156-a0d3a490ee1b74762a4947824596dce3.npy +02828884-b8eb131fb74aa39af7436fe692c24f3e.npy +04090263-7fa43df6d88d2391e103b85ae3ac182e.npy +04090263-6f14f17167243fac5427e47767269c4b.npy +03467517-30a1f256b5b691f09540ada8114b63aa.npy +04379243-a3474b03dad787de8c5fe7d2e262dff3.npy +04256520-66c8df461f312684d329896bbf26eda9.npy +02876657-13d991326c6e8b14fce33f1a52ee07f2.npy +04379243-79ae3e5787e0a07542ff37a1b760099b.npy +02828884-599dd0b655adc794ae143c6e852a4f2d.npy +03001627-938c0560f25a6a9cb76982957f05710f.npy +03691459-123f9066606d80206454c2aa07613033.npy +04379243-97bda10740c4a74036b0f2a1430e993a.npy +03624134-e5bc92012784d89592cea77f96988ae6.npy +04379243-b088212c18a00fa0c3bd24f986301745.npy +04256520-53f4088679746f1193f685578b3d085d.npy +04379243-cb631d4a3bdfb02d2c58f3c20d9d1840.npy +04379243-c46bea30afbbf07fc1997d3da2532033.npy +03001627-7e190338d3f213c3f7b1230869d2b89c.npy +02958343-f84ba2039d0a4ec5afe717997470b28d.npy +03948459-51c3ad915c53f9bde3f7f7749a803060.npy +03691459-813bb87d0679eeb9e4f8604d0992a17a.npy +04379243-dee160f20e1195a4b2cf6e4d01862bc5.npy +04379243-6f3e12831cfefc20a1d8e55816ec2b5a.npy +04256520-b651ea269f4aa92731780fdd33037c9d.npy +02828884-4bd994f25cd3e1fd2b12aa6a0f050b3.npy +03593526-d3978e26d3e0d773b3ffb0c309689ebd.npy +02992529-5c141e299b50f1139f24fa4acce33c04.npy +03636649-230efad5abd6b56bfcb8d8c6d4df8143.npy +02958343-c4d49c0625be70c417da7541f1b2fa76.npy +04379243-72fef5cb33aae9cf94d7e6d8577c8ff.npy +02876657-4a1fe3495565001d211b8bef58aae14f.npy +04379243-7b5c5d7e3b9d89b577cf3bb06f394ad.npy +03593526-9aff149b3b73200fb4b94732d6aa086d.npy +04256520-ebb29b67c390a28ae7c7920f6a65a54d.npy +02876657-412d5f41b5fda0b271dbcf1c4061c69b.npy +04530566-47133569866031669268271e4d570275.npy +03001627-cbc5e6fce716e48ea28e529ba1f4836e.npy +04379243-64e260594e3c3dceabe659e45c4a5b67.npy +02876657-1df41477bce9915e362078f6fc3b29f5.npy +04530566-b7d6c9e38884b121cf439004777f8b49.npy +02691156-96409ee8309b4c679c72d95bbb12b7e8.npy +03467517-ec1149cc44edf89a6909632a947fc19b.npy +02808440-e592e2536000ee2644221bef0fa3c36b.npy +03001627-c8aca0182d3e48add93768e7b9b1eabf.npy +02691156-d984822941e7a768c231d70e1e0cc567.npy +03211117-93b69d3caf90a837e441f5bb6f88ca61.npy +03337140-4eac890c8ae0edef735c6678fe50843.npy +04090263-8d0947db43c20e819ad96e0af6b934eb.npy +03001627-ca032d3b6dcbe1cea3056fa1e8da3997.npy +04379243-8b8152865839a79719fb4103277a6b93.npy +02828884-65e7b3316245780bb5512a11bb8b2bf4.npy +02808440-859f263919c702bbba4fe5622b726d13.npy +03001627-a770cb6ad4a97df84abd45348d17aaf8.npy +03325088-46b445c31887a70eb362845c6edb57fc.npy +03001627-81c481c1a0477555f0a61fe93fafdeec.npy +04379243-783af15c06117bb29dd45a4e759f1d9c.npy +03001627-20cbe565f98b4dab40ef1c8b63a628f9.npy +03046257-1c1899bd9fa34ba7275d003e423c59ba.npy +04379243-1bab21890e560d54d5cb6d178687b980.npy +04468005-9ce7b859b306c3224b0b2e6e63122009.npy +03636649-62f4efec7059e531ba5342d638d0c267.npy +02933112-2d2ce6dc51aa6c7a9856fa70a578baeb.npy +04256520-8737aff6eced02df3598efd14e493d5.npy +02747177-b74e2ac0928725ba6f1c1d4ef8eeb77b.npy +02933112-154f41bbdd20cd9d8430b7446f9e1252.npy +03938244-59657437cc799e51616f4ad120b6332a.npy +04379243-7a8399fc51d83969a8b1d0fdee586dc9.npy +03337140-dab5be91b21f031e995c80c53f5c4c0a.npy +04379243-ec316148b4cdd446b6068c62e84866a1.npy +04090263-d68f31ea513d3a5d6a816b111e5f1b47.npy +04256520-34df668babda666f7b0a2c22acd10794.npy +02958343-2a5df4956f694efe829e2483ba27ce0a.npy +03001627-30cc0df021a947e9706ce6d0dff37e85.npy +04379243-edf1d95e72479c4bbe13ce34aa7c0c1c.npy +02691156-697b4a3b6a380443c503a3776fc280fe.npy +03790512-52e096f02d12b3bfa70f3e863a68c2c2.npy +04379243-a82387cf9d9d253aa06f94abffad1304.npy +03991062-50f0a34edfa5a3b4db41ec1fc554dca9.npy +03991062-c0ed2720d248d4e125ebd1cd0b422e32.npy +03691459-c32bfe130412d9c6d9b106ceb230ede0.npy +03001627-2d80c89d4284b4db21f01d01c8c9dec6.npy +03991062-b89de6e29a5a1d6425ebd1cd0b422e32.npy +04379243-81a5a42f161688ef36d8dd30a594b2af.npy +03790512-9e9300a6e1caec217395d58407f193ba.npy +02691156-41fadd55b341e54ab87697d3904b168b.npy +02933112-d3ff3bd1badb62c2c59350d819542ec7.npy +03261776-2a6cbc4fe096263b6dd0f46427834ba3.npy +02691156-a692309cd39291106055329cd9432d36.npy +02871439-f595c01f296c220935c9a487bf9f4664.npy +03325088-5184b95d850acc92f84537dcf9baed45.npy +03001627-13e29ccc0722f4f958df8eeaf3dad1c.npy +03001627-3569709b421075c730bbd4cddd04c77b.npy +03624134-99c7feed0581cd1fb88eabc621107e4c.npy +04530566-f12f615701b9fd31a9e77d2a83027228.npy +04256520-9507b4091c4d02a37e1b1f098db17ba1.npy +02828884-990c56d6ab64279c2056b4bd5d870b47.npy +04090263-2b1fdf919d42a55828b12a43019163ae.npy +03636649-3977cc8807304dfc5adb3ef1dbe9e3b3.npy +03211117-d7b87d0083bf5568fd28950562697757.npy +03001627-37754da896362bcf28c0cecb7de2397a.npy +02808440-a0020274eb81d539ccd0340812259a39.npy +02933112-9c8dff9a5f5cc6ab490ad276cd2af3a4.npy +02958343-fed8994632223d52afe1d4530f4c6e24.npy +03636649-bc800138650bc4a6c7c8ce3bef5c2aa9.npy +04330267-38cc2f381576c90e36f5739020329c46.npy +03636649-ec344c1076b5c890b02103b4dd1798f5.npy +04379243-657bc03a22b4ee207638fc7b029fa96.npy +04379243-271db646af45e4e48312cb7420a2ad11.npy +04379243-5317439efc03a22de27790b0ec8671f7.npy +02818832-2d1a2be896054548997e2c877588ae24.npy +03624134-f316283f7b179d69faf4eb5f62ee440.npy +02691156-ed0a9a32a8e35f21ca8607f540cc62ba.npy +03636649-67b0ef08720310aa14f846b7e32e76c4.npy +03001627-6cf4bcb8a694242473ae2443c97a1733.npy +02992529-767205e25c8755fd89d59b774c6bc1b3.npy +03710193-757c1d231149dec8f1ad51d1ecbb963a.npy +03636649-dc04781fbec1e188b1baefce5cfff2fa.npy +04379243-3ac426922252c21a855931d119219022.npy +04379243-f1f3021c1469c8e5610c2a68437007d6.npy +02958343-aa9f41bc3925ffc4be9358e8c18dc481.npy +02958343-804c21bdd416783176ad064d1c5fdd7c.npy +03991062-2c262de36d12bc82411e92cfbad3bd2c.npy +02933112-2375dfeeab7fd8678430b7446f9e1252.npy +02992529-84cff93cb8ed08e55acbb5d30672759.npy +03001627-7910a6262ad8fc113fa02fd212ba0e5f.npy +02808440-2f90ff6319c74691c7cd249d921dad67.npy +04090263-93112d8e6d0710e774816c28a6351828.npy +03790512-73fd19410ce60b83d5dde04c96fd8146.npy +04256520-694c7bf2ad1b133b1ce14d4c70990479.npy +03325088-4162e08b1662a6cb3321831d2245cf06.npy +03691459-a23a775c5bfec73d8275986ae1324d10.npy +04090263-e4ddaed36daa1742fa9ff575e691c052.npy +04530566-2b17c0705ee0426e53b2b4f48361e0b2.npy +03325088-d75e4ebefbed7f50317551e5a477d434.npy +03624134-6813197ad5e7011fcc34b900bb2492e.npy +03691459-984d064e7e0310f54cb67f35c09e50ad.npy +04090263-468ac0df7f343a67addf8a484a63f540.npy +02958343-c8849755b29ad49b9af07fbc15eb8427.npy +04379243-7c1bcea89b0037a2d67bd369ec608dad.npy +02880940-4eefe941048189bdb8046e84ebdc62d2.npy +02958343-f9cad36ae25540a0bb20fd1bc4860856.npy +03337140-b078888d60179693c4f66791e25960f.npy +04530566-4e45c5a16f45c3bad9356bb4e82527e5.npy +04401088-87aeb552057c3d1a65a7971ba2230c53.npy +02880940-e072da5c1e38c11a7548281e465c9303.npy +03636649-be13324c84d2a9d72b151d8b52c53b90.npy +02924116-52f337f3047112b42534f02c8e8b5ac.npy +03642806-32ab7469a9c4bb584ae6254ab33d9f52.npy +03761084-f9e75a7b5abe9f3fdec134b6ed53c0d8.npy +04379243-50e69dfb7802b094cfedb1d8b135cde9.npy +03001627-ccfc857f35c138ede785b88cc9024b2a.npy +03636649-d7465ce6bfe4b898c98f75a9ff83e3b7.npy +04090263-84de9995b0a416b5fb5c1b0f759e2bc1.npy +02828884-303c1519c700d19299e8bf807e902261.npy +04256520-4f2ab57322d7a7e3df63d1c7e43c783f.npy +02958343-df8000281bcfdf0754f3692df239bb9b.npy +02691156-5a37bc42a52130a18f52dc705c3109b9.npy +03636649-e389b9eed612e5c225a454369d791fb0.npy +02691156-b9ee9a1ed9296e8c598bfdaf1b614b1.npy +02958343-7ccdf7bc2af0b068e43ab89cb5563740.npy +04530566-aac813074775281a4163d08524f89006.npy +04379243-4572e2658d6e6cfe531eb43ec132817f.npy +03001627-8908ecf5c86377ba7b31e6c3fa42a7e.npy +03001627-c78a6f04268dd802cf004563556ddb36.npy +04256520-e76457b55a3c041cfe49db72b6ffb2c9.npy +02958343-95d36965fc6d1f7de2d4c157e5bf1dde.npy +02924116-4dba3b31aa7de657e550942ea36e5443.npy +04379243-627248fa64c1db5fab610b0c94236463.npy +03325088-dbe7761882240c7a3321831d2245cf06.npy +02958343-7d4c3d9795570647657231d17e42d06f.npy +02691156-6896058e4bc0be46bdf566b587d6b21.npy +03337140-e6e8c85c84f7c6894c3aee8e9d3a6ffa.npy +04090263-97e856173cb708ecbb9224760a70fece.npy +03636649-f95012d97b44f6a52a1b9710536b86bc.npy +04379243-1a1fb603583ce36fc3bd24f986301745.npy +04090263-94540c8b2d13b48ae09d3d2b183cc5bb.npy +03467517-46c7ea02f3f06c26dc691b483dfba5b4.npy +02924116-2e94d54ce3a9aab42ddeeb09f6e4dbb4.npy +03001627-3d629d27b74fad91dbbc9440457e303e.npy +02992529-98b929df60f9ffab49f9ea699d984c9f.npy +02992529-bacbf0d14e0cb5df6a802ef1ce963117.npy +02992529-27085a2456319497f1cb19f636b1c2bd.npy +04530566-55853d0f4d5ba19745aff212946058fc.npy +04379243-6e849ffbc0c14739b31b6dfccf08260e.npy +04379243-4c3ca87e50585617f9696ffb3e2cb66.npy +04379243-6bc941dbd290c7f21acdac000802e11c.npy +04530566-3e233d02a6943be81c99ec30e7a67a36.npy +02691156-8ec085a86e6d9425f4fb6842b3610149.npy +02924116-d3e9d6e0a9a01fade1da81584e31b667.npy +03085013-ac37c2bffd932033c03cb21be18ac701.npy +03513137-1cebc02c679add362f20449572a3a77c.npy +03001627-3c58dc00cf251172c05575120a46cd3b.npy +04379243-71e00a86a67df6e9c225da989036c576.npy +04379243-6b01be46542d507e674ce64e4bf77aec.npy +02691156-c62237ac28c4ed61efe0d4e1eba2e3af.npy +02933112-3216246565768e2fa716f601854e234e.npy +03046257-7c7b518b7ce049e648718eb33db1802e.npy +03001627-fa5dab91cbaecea8ce9a0998abec10aa.npy +02691156-593dbc303a7afed7f44f89e40af48618.npy +04090263-74e930c54ddaf8add34ad43a472bf958.npy +04256520-7833d94635b755793adc3470b30138f3.npy +04379243-9a3df6c365a3df3db000f20a5153622c.npy +02691156-fe1d825ce462c3e7b96212c8f6cd06e.npy +03001627-dc77b920bda118d54627f3cd8db22919.npy +04379243-d1ea83fd1ee634963d5da2a72f595df5.npy +02958343-55c545ac0d94ea16becf71e2e014ff6f.npy +04379243-884eb62c72c1ee75e6fe3612af521500.npy +03211117-b2ec76ac8a5c7afa40ff33d80c1d7d1e.npy +03991062-595a2947c890819d58c88d30f502a452.npy +04379243-49d441b49adde95b20768660cf080d12.npy +02958343-6246696b7db8ab34eeae8bcbf655eede.npy +02958343-7bf415dbff028a3d4470fce578e2b84c.npy +03001627-3f0beaab92a08fd74138477d68528833.npy +04256520-69257080fd87015369fb37a80cd44134.npy +03001627-8a9af7d8a83d90fcd53e36731300f5b4.npy +03991062-d52b2ede7c05092662a167ea4947f3a0.npy +03636649-b384676ddfb3b657fcb8d8c6d4df8143.npy +02747177-f10ced1e1dcf4f32f155d75bbf62b80.npy +03513137-93a86f07803b31c7715a42c4b7cc3a54.npy +03325088-e013eb2f75029d25572f8e1c1caad99e.npy +03691459-3538a656bdfe47948dfe57cb1b540899.npy +03636649-5d265be0ec25af3a7f772a7ed7ffb61.npy +02747177-56efabe64ce30e08d7bc2c778b186f58.npy +03636649-6272bb389bb524f0c8e1fef75f114ecc.npy +03991062-7e9f9553fc4fa9d56d93e521f7fd48fb.npy +03624134-42d9f9c31522d61e8cf144cdbb59254f.npy +04256520-346f3d9b39930b87dbfb0f09ba9f2d99.npy +02958343-36b28d2fd1085c53b6581f6f0cdd370e.npy +02992529-ab9c56981431ec70f7b18034d9df056d.npy +02933112-9bcfb450ed3046a74da5feafe6f1c8fc.npy +04379243-c306205a10978fd695a4c885dffe439d.npy +03593526-bb1a0d719c6c92ec564ef9ade41a3447.npy +04256520-df2fd8e97036e287dce02b254c09566e.npy +03001627-49e3ef3939d7a6ec6bcd32c43682e841.npy +02691156-3b2a19d782234467f9cc1fc25372199f.npy +03636649-ab7895189ef13e754f3443b22038d340.npy +04256520-b86d536860cdcf4ce7321f25048c6142.npy +04090263-d147dfc972ff3a8c673a614c45f3afe4.npy +02828884-83e19abeae8b157d3eb520ff7cd241f0.npy +03797390-3a7439cfaa9af51faf1af397e14a566d.npy +02924116-196fbbd797e9738941cefd10ce5d6cc0.npy +04090263-90612c4b3a2c6d849d9fecebc5860b6b.npy +02828884-974668cad6e15520c955e5ed03ef3a2f.npy +02691156-6ba7cad8fa7301f9c1ca96a73599ca7e.npy +03467517-35cdae95d5e278291082f2ea630bf69e.npy +04379243-dbf4aeb1d6c8b77a30bbd4cddd04c77b.npy +02924116-3988f8e1321f90b36519fb49e2941e.npy +04530566-f7220f2e7b880c2492ab202de6ff04fa.npy +02691156-21adc93a24e86672f054f5e37c7ac323.npy +02958343-6c449b92891754c6b8b6b17d4ce17d67.npy +03636649-b45b40ea1c3a813235836c728d324152.npy +04379243-ac2ee1eebd5f2e335c8a49a27f01fd12.npy +02808440-12aae2c1b46580c48e48489883d168e7.npy +02958343-2b9cebe9ceae3f79186bed5098d348af.npy +04530566-58e6243d1aade364186e889431adb691.npy +04379243-fd6a530388f275c926700e14156d231c.npy +04256520-893e3f15f023e9abdba08b82bf5c2f3.npy +03001627-b79bc903ae820b5ffefccbce7fd86667.npy +02933112-8238404daa0a13bfce5d6e9371bb5c33.npy +03001627-750bc77ca0328a29dbbc9440457e303e.npy +04225987-d3ff56062272f3e6346e65609be6d72f.npy +03211117-9557d54db1c95572e15527f70689f25a.npy +02958343-667f7509425dbc60c43644e93a8d03ff.npy +04379243-6a357f24085bf0fcae199f04f49518bf.npy +04090263-3d0012e27bf8ff429bddaef1ba7e1752.npy +03001627-8b0886f97f038a5fabbc3f24ddd185bc.npy +03001627-78abbfe9ab73729f56d13e757b0dc374.npy +04530566-eb01f5a73f0239a348c096ae17d885c9.npy +02958343-719912031bd692fbd02bf342687ad381.npy +04379243-359ffca14508cbcc86c701087a194026.npy +04554684-828f6f95c6e8651691219aad82abc053.npy +03624134-bbe934c9cdca9c1839ec49305bb07d3d.npy +03001627-8aca9f9005d8a8bae36724f611fabaa4.npy +02691156-b4e9ebb75081f146f6babb7d9ead7011.npy +03001627-a7fc36d1b5d29280ad484915511ccff6.npy +03325088-c02b905c5d602a7ebfc2343650cf257.npy +03797390-9196f53a0d4be2806ffeedd41ba624d6.npy +03691459-95eb96eef8f0e3a7ed10ef1927ebd15.npy +04256520-fa1e1a91e66faf411de55fee5ac2c5c2.npy +03691459-496aea93dd8f7af1f3f18c4c348425c1.npy +03001627-26c9e85dfa18af9fcf004563556ddb36.npy +02828884-9ad5cab6ff1e45fd48113d3612de043b.npy +03001627-5194d56c118786fa1a4e0f13d375972f.npy +03337140-97df987c252a2623820018801b237b3d.npy +03928116-6da19d0d62f55b3257c37d9adada9daa.npy +04256520-4774343934cead2828a3b1af7eafd3f7.npy +03001627-5f5cb0520b70efce750821560ab1d243.npy +04379243-159a2a760327ca5bababe11fcea8796.npy +03467517-8cdeac5545518a07459d1a070aba30d3.npy +03001627-304efa07923fc3c1c681404257d94ad9.npy +02747177-ee8ea1be0821a32860b96188a6533c41.npy +04256520-a3cfcc4d567590e19d4d5dcd2cc33826.npy +04256520-5d2c7b6f863379f1788963ea499c61d.npy +04256520-a996982326ffe668593ebeeedbff73b.npy +03001627-2f282d5e4f140119e493511b69cc95d0.npy +04554684-da98f4f303a500856e27419626f050f1.npy +02958343-dd8b4530c7122fde6a8da1ee9004e891.npy +04090263-b128968ac3ba7207210b7d136d269713.npy +03325088-d224f4d3e56b42ba979c556124bee033.npy +03790512-e54d1fb6aaabcaf8d5dde04c96fd8146.npy +02691156-66e0fbcab927f21a875d37e2f5bce5e8.npy +02992529-471a1ba8c1e1fb0a5b031707d900d7ec.npy +02958343-a8a4b511451c2f36463d04eb22b0bb17.npy +04379243-ae5ac5b2b027fcf9118ddfdb81cc6068.npy +04379243-68ea1f319a9d724ec3bd24f986301745.npy +02958343-12a034b6be9afb50ae983613a2e0a741.npy +02876657-b7ffc4d34ffbd449940806ade53ef2f.npy +04379243-8c2bb08ed6fcbcf3fdd3e2baf05d0f57.npy +04090263-e818959be12871d461b28e02a259d647.npy +03991062-7de2c51034e824811f2146f064414afc.npy +03642806-9fc5b76d363ca64ed03066fc8168e9c6.npy +02691156-ca4443e9a37c4f0b16ade7bb280a6832.npy +03001627-eb89f3b0af31bf40a97cde0b3996ce62.npy +02992529-3621cec4df1ddf421844676433a0aca.npy +03001627-411a1a4ac8ade7da76e9713f57a5fcb6.npy +02691156-ea527508bb74f476f64801ad2940cdd5.npy +04379243-4ced745f960f7439b91767277279ac70.npy +02691156-d883e6e5622a0cab72351dbf9e0687e0.npy +04256520-1fde48d83065ef5877a929f61fea4d0.npy +03928116-5a62d52920d2fa959335ab591bdc347b.npy +02958343-f64f81f7cfcb74033a2b1a2e5e169910.npy +02924116-1d00d8fe776689ac485dded84d35fc65.npy +02828884-9c1310c5ab89888bd201085e80edb26a.npy +03691459-21b9af9e21bbc7975afcf0aaed5d73d0.npy +03691459-65bb8f59e10a0cd837f1b3cce66816ca.npy +02691156-cbabb37711c06d4046ed10e8f7fe336e.npy +04090263-18953ef908bc743a5baa05bb713f2498.npy +03928116-5574c469aae489c355005b4420ff0a5.npy +02818832-447c50e658d729f044ededc21cf0e35e.npy +02818832-64c2347dfd79c63a63d977b06bbd429d.npy +03938244-3fab1dacfa43a7046163a609fcf6c52.npy +03991062-ed86685bc4a0711044c183864792bc2b.npy +04379243-5141810a02a145ad55f46d55537192b6.npy +02933112-a95f93b9da094471c59350d819542ec7.npy +02958343-420d1b7af7ceaad59ad3ae277a5ccc98.npy +04090263-365ed0964805ef59f5cbed688a0bb106.npy +02691156-7f6e55daa567aade3a1cddb101d3e1ea.npy +04379243-e90b641f8f1489d44b5e2e6b95708893.npy +03593526-a5db4bacbe009f2ef51f77a6d7299806.npy +02691156-48e9c61de4db838d84b83051fa0ae5d2.npy +03991062-912c3e1cf2ef3b9ea7d0cc9b15400f65.npy +02808440-c6449e52f945035a1ee236984e84b5e3.npy +02828884-c6dbedf2028735ccd2b12aa6a0f050b3.npy +03001627-c45ff54d4192633684cd6dc1b226aa5b.npy +03001627-be5df38dc7877c13c681404257d94ad9.npy +04379243-2aad9a8f3db3272b916f241993360686.npy +04090263-42aa9630886c7512ed6071560148e6eb.npy +04256520-c7631617fc36715c37363131ac7e8139.npy +03001627-49918114029ce6a63db5e7f805103dd.npy +04379243-8891a73ddf73656be4ef113421a70a46.npy +02691156-a1947665b3f56b584f127ea45c2fea1c.npy +03991062-bdbabbe2c21689fa3d382fe678ddae38.npy +04074963-4df6e942001af26f16a077c4c0fc1181.npy +02880940-b941ca9770b59c3918a27ff49f2f297f.npy +03636649-ba05f660341b7b7b70be09f44cb2fef5.npy +03948459-d0547b978857a41ceb7091f9004469c6.npy +03636649-dd1dde844f5b8ceef361255e85d5896f.npy +02691156-95cfdf728da16975c5f6fdebb053ab2f.npy +03001627-ee2ea12a2a2f8eb71335bcae6f5543ce.npy +04379243-580cac53a1f9a799446ad0d387c02a3.npy +04090263-731b2960620dd7883bb8b3b6d2fcf780.npy +04379243-3622046c1b2266a0fad46760e869d184.npy +03467517-92c2563a4df361dc93f0194265a9746c.npy +04225987-b140249e4615f0db6d8b6ba513969afe.npy +03001627-70711d5a1aead05b90a9ce3e4b15521e.npy +02933112-1cd80ed7f3ab7a5d4da5feafe6f1c8fc.npy +02691156-77ab8bb69221b13bbc0909d98a1ff2b4.npy +04468005-8823677178c21f28dc14ba0818ee5cec.npy +03467517-40cd2cafde62ff7ca24eeca91f583600.npy +04256520-4ed1591fa1c692df44265a262962e6ef.npy +02828884-579e02140aa4c03edd67a519fc8b2283.npy +04256520-bca2ce9beb8b9a3c909c248d0d9da9f5.npy +03046257-db230ee6f183643b14038d588fd1342f.npy +03991062-23c2a637319a07b425ebd1cd0b422e32.npy +03001627-708e7ef3c2afc842febad4f49b26ec52.npy +04379243-3339d615f108948876e9713f57a5fcb6.npy +02828884-7a500a01f5ade316ed98cca8f0ccd5f7.npy +03001627-da7fd2dca5e9f29455f0f54ca9692531.npy +04379243-70d8bfb20df2a08ce4730f03eef08800.npy +03046257-7c7204ae38cd5ec7af8a2e210ebd5168.npy +02871439-49d402238a272804cd114fa69ff09cf.npy +03001627-62c3b6eea96337609ae676623bdd3284.npy +03624134-debbbf239d59d8724662dc124dd336ed.npy +04379243-3532707a0addc62e13680f9c7026bd5b.npy +04090263-e24570b7293756b7cc34b900bb2492e.npy +02933112-9a7263ce1cb720d7c59350d819542ec7.npy +02958343-c2adec4dfc0dd05b2e877e82c90c24d.npy +04256520-28f2563c5e757b1c1b7dbdf53d301715.npy +03001627-35ee4bcad88ab50af6e44a01c524295b.npy +03636649-27e4369a1d6a5a2d490ad276cd2af3a4.npy +03001627-24465c99afde3b9782f320c67d1f2e15.npy +02691156-498ea154c08d51abc863ab010b80d9ed.npy +03001627-f1f69b9b2dbf7402c862eec8232fff1e.npy +04379243-7595d2709fdae7f4cd6ba6431f9f9d71.npy +03691459-2fc738e7a7dae1b59e08df3ef197add6.npy +04256520-f8fc1fa935aa8f792ebeb1e6a8111f53.npy +02808440-ab48dc1b65a3af0a3321831d2245cf06.npy +03001627-b72342e210414024e3e472a115551ec9.npy +04256520-e03c28dbfe1f2d9638bb8355830240f9.npy +04256520-ee5f19266a3ed535a6491c91cd8d7770.npy +03948459-d747c1f677349e78803b54e9738b20a6.npy +02691156-a87c4bebcad260edc05997f3aeab04c6.npy +03001627-1b7bef12c554c1244c686b8271245d1b.npy +04379243-8d9b10974c5e3b35a82a6374374c9dbf.npy +02801938-dc4a523b039e39bda843bb865a04c01a.npy +04379243-9da456630ad311b917fe334c5911fe13.npy +02958343-5b925881cf8678cabda733a39f84326d.npy +04401088-4546af9a8a67e7439c3dc4e242073921.npy +04256520-200324d0bafb1c2e19fb4103277a6b93.npy +02691156-dd9e42969d34463aca8607f540cc62ba.npy +02801938-be3c2533130dd3da55f46d55537192b6.npy +02808440-4a7d4186a966d777e49bb55b21b2d30a.npy +04090263-d9eede71f6941a7c766069834b8696c7.npy +03624134-6671717c417bc68bf912acc8c54e7fc1.npy +03759954-1e3831bff914f234bd4bf7024dfa167d.npy +02691156-41fd618a15692db27359b134afde902.npy +04379243-91c3c63dddd49d3a5271513b292108db.npy +04530566-ff77dc4561e1a8a531d119333f70ecc8.npy +04256520-eb34216913b891ad54a1f8a695b8eea2.npy +03991062-d049058e41674c06c584aa932b291740.npy +03001627-f8594a24176f732b4c7e2600dbaebf40.npy +03948459-10640377f4eb9ecdadceecd3bc8bde14.npy +03211117-9ec1a96e81e1e714fa6dbbeb09c2f316.npy +03636649-d153ae6d65b31e00fcb8d8c6d4df8143.npy +03325088-79a4a16b4062810c4f50865b470f2168.npy +04379243-f99ebf0f053140525a0e5699b3040a35.npy +03001627-a4da5746b99209f85da16758ae613576.npy +02876657-26e6f23bf6baea05fe5c8ffd0f5eba47.npy +02747177-cb8c6fc0e70e3dc12d1fcd0df2dc6d5c.npy +03325088-1309cb5bbd90c7b250da8b99982a3057.npy +02808440-42c74e5da10975c13af30a3946d92feb.npy +02933112-2d0d55da9d8de4356e79c14dd16aa04b.npy +03991062-728dbfa809bc9f4b62747237d98979dd.npy +02691156-4fe7bcbeccf207a5a2a2a57a63160d60.npy +03001627-4e294d057291c50fc8687ff9b0b4e4ac.npy +03948459-9f6b3d59f7ec96fac4dea24d28c9ca05.npy +03046257-1a157c6c3b71bbd6b4792411407bb04c.npy +04256520-eda881a6ea96da8a46874ce99dea28d5.npy +02958343-78c0bec338fa1c01d6b98bf27ff43caf.npy +02828884-928fa92b9f25292f75a9709a8c0e1e6.npy +03636649-5b74e8ee70acba2827d25c76a863dd52.npy +03001627-52b667b2014bdf0482db9fca4b68095.npy +03261776-1d4f9c324d6388a9b904f4192b538029.npy +04090263-251deeda2394fcbc9c96fa78389d2873.npy +04379243-99a3484c310cd1211e8fb9cbb32d2cb3.npy +02958343-2650c2325b7a8d0c811f8dcd8963ced5.npy +03046257-adf095adc30803a148996af2140a9136.npy +02691156-67b2e9282e92abe110ac482828ea39f.npy +02808440-268967dc3b0b09d0412deb0d2b0f3dcd.npy +04530566-22078503d5625b985dd2c581ea62184.npy +04468005-4f0ee7b0644ef0ad930027595c4fa0af.npy +04379243-adfec21e21737eeeb000f20a5153622c.npy +04379243-d0ef9d431a16e70de6c5cd45aa112726.npy +02933112-26657a42d9ec207ee30ec6a0c7ae873f.npy +03948459-a97fdc331fd7c8299cb41f075aef64e4.npy +03513137-43c7b9475c17df536b9e4b1418714282.npy +04090263-69e59c0feb5415ff71936222e0293591.npy +03624134-14f5a704b3898ec7426c116c412c132.npy +02871439-dd3ff69f2d82461777668bd5471e4f9.npy +04256520-a17ba222a54865cdcbde89e0c48a01bf.npy +03691459-93cc6af2bbe3675cda8f53dbeb7453f9.npy +03691459-22d5aa5c6a173d31b59e9758ae7f41a7.npy +02958343-dda10fc985eea0868c368040825ed335.npy +02958343-57e91b50c5420cbb4628d74a95bb7fe.npy +04379243-3b36f062f56e320674b9a1885f058618.npy +03001627-735df13871e3ab4edf6cfab91d65bb91.npy +04379243-264a075e293394a843638dabe1eb5336.npy +04460130-ab10a5607c25e6b0d730ccbc8780d609.npy +03001627-312b3fc351fc0998660e7db8c993ec8.npy +02808440-ad70bacd3a9234bcac5ad68050161b06.npy +04379243-1d447e3b068b924ad91787f0eb159c8c.npy +04530566-112743160fae5bd7ad83f267e8f0b536.npy +03691459-4f4629b12510571886be4ba1f667c92f.npy +04530566-46421ef3a412660b428cf87eb5ebe5e6.npy +03085013-d22bad5e72b815c41aea59cd55c902b0.npy +04090263-19c5068675de48b839264bb933c2348b.npy +04256520-79c3dfc2f90a5cb619fb4103277a6b93.npy +02958343-a836fc66c01eccca58c27e607f6e2d4c.npy +03046257-e1275afba2cf3718d5e4ad512ec499a0.npy +03636649-e138b41985e7382cfcb8d8c6d4df8143.npy +02958343-40f0bac5bcb4f8686ff5dbbe822945fd.npy +02958343-4eb5fe734f4eee71c6fc5b6f6b2a70c.npy +03211117-12ea5095e96f9ed185d624cfcd9a37a7.npy +02933112-951377627e2fb20f86d53ab0fe94e911.npy +03001627-1e283319d1f2782ff2c92c2a4f65876.npy +02828884-b9535bf9b002a226d4d8765e3910f617.npy +02691156-6ea7eb1ef18eabcf8699933784576e73.npy +04530566-8a553a23adde929ceb2c303a0e0d287b.npy +04256520-1e658eaeeb68978214038d588fd1342f.npy +04379243-3aadad80a0e8d21620768660cf080d12.npy +02691156-abb19f2adc42aea2579c3d4943e463ef.npy +03001627-5f33a76ff2e4d25ea7c7a7d30ca93d68.npy +04379243-3a800ccb5e7de7811705bfd3afcd10e.npy +04090263-fdee9fa34e570910f2a8e4598a15f7ce.npy +04379243-689cf8174210c2701933ffef19678834.npy +04256520-ec77376330a7975214e726c15c7dc200.npy +02828884-550e62946d2f55554bce3147c41ec725.npy +02828884-28e12ef0e54e204830bbd4cddd04c77b.npy +03948459-623068000236841ec686380962888391.npy +03001627-11dac7c4d7e4b32af9aec59741c69cf7.npy +04379243-86dec892a246e0c02cbf13da1d4abcc5.npy +02691156-91ad0ff431597651767529f9ae81ac0f.npy +04530566-88cc060aa20b340611b3e656ab4bd115.npy +02691156-3a18489f9615a350e768735f27170bc4.npy +03325088-a9b43b9181475e5b7a867e9b35a1295.npy +02992529-67524ffa83e3eb7c4948b3842dede005.npy +04256520-ad708015fa2c131853227dcd0d547ba6.npy +02958343-ca9a4a00209632808acb0ff76f4aec7d.npy +04090263-267af66d92c1b6b6e6819fcae2e26ad8.npy +03001627-cdd2c7251be91ca779b76fdb1a0daddd.npy +02958343-cd85df142f1999e5f38ed4497f2c53c.npy +02818832-f87682301c61288c25a12159dbc477b5.npy +03211117-ed0975c0bfab1af75f17e2852ee16b0c.npy +03211117-6946bf798ab999b7cfbd2b4a434b378.npy +02691156-6e4570ef29d420e17099115060cea9b5.npy +04379243-ba6a1d8d3f8e832d67668f34c2939f7d.npy +04460130-927ee8b508cde67f5ac73f8a88a91040.npy +04090263-c14017bc897d73f46314c3b6a3a65519.npy +04379243-12567fb8261120cf63a97d76062d3220.npy +04530566-4a01d52c0d8346fda8215f78849a813c.npy +03991062-e9eb1e4250b5c727d0546e77f7d9b0d4.npy +02691156-12d15ac778df6e4562b600da24e0965.npy +03001627-fc2a1c4c332f7731e45ef4135c266a12.npy +03593526-5e1c630396c0a1ce30cbeaf8f6d93761.npy +02828884-fa1b7b9630c840eff4fb4dee5181bee.npy +02808440-33718430c3a5c88bffc6e457221b9271.npy +02958343-c21cb9575910e30bf0174ad879a5b1cc.npy +03642806-2da650d7d946a4f04b7717340dfa57ba.npy +02958343-8fedb0c03a49bddaa8c38723d07b122f.npy +04379243-8e009300d7671a33b2a5818319136c5b.npy +04379243-111df730a9d3f2a8eab46ab0515e8186.npy +02958343-36f8760e54a7a1835cb0db8915167503.npy +02933112-26eb1d73803b2426ef46cffe4939fce1.npy +04225987-6867832e7b9d3654aacda7f1c4fd3ea7.npy +03325088-f0bb725ec0ddbc7eca25b2e822a430b0.npy +02924116-cdfb80edb15ba29762e9ca743c2e311.npy +04379243-1e6d470b0330afe7abccd5469c032787.npy +04256520-e541933c90eec36182db9fca4b68095.npy +03001627-758a68f80f0754f14a8a0ee8b17f83bc.npy +04090263-39c1ebbe7f6f1d5f4a4df88f87b30520.npy +02691156-351c9235749e398162147e00e97e28b5.npy +04530566-44c07d26323910f4fdef75f370a46dd5.npy +03001627-807c16e4f6f2c5852cf52ec1a1c9b69d.npy +03636649-36c1653a021a526319620b61f6587b3e.npy +04468005-76470b75fcaffab629054625f34e281d.npy +04379243-956776ee66e095df2822b5101b06e070.npy +04379243-f58b9e92e45367326c3484ac7eef025f.npy +02958343-5db9380876853a6eb690ce0453406d16.npy +02933112-3aa643b4eb4a165675a4e003752c1044.npy +02691156-a87cad03c8f717e230dd29e8b6a554b3.npy +03001627-2194e6394a31194962e682c9809bff14.npy +03001627-4e0dcb9beee7bd3f3a11565e5be9cf53.npy +04379243-6b2edba33e92b96998fc1d0403f6ad0.npy +03001627-9c499d86350d32a28639ef683ea7ed9b.npy +03261776-56c4d7e643d6a7286329e8c7b28434da.npy +03593526-45ba72a5187c5fd7b9c6deef486a7d8.npy +04379243-65ffcbd025d2151ba5901d93c937a07e.npy +02958343-c9bc4690b171e5d7f0ae46ab6a68f9fe.npy +04379243-cc58de930acd321fac242c3aebc81b2f.npy +03691459-fb4c855848345ecd3e738e11bd8803f8.npy +02747177-3c03342f421e5eb2ad5067eac75a07f7.npy +02828884-8b19ea942987fd72eb753607b9a115b5.npy +04256520-d0f30590066a88fbd5cba62773b8025b.npy +04530566-1e0c84d82fd52f8c394eb4a27c704b88.npy +02958343-fe29b245be45318c80e6a7abc49befc7.npy +04379243-f0f1835eca48e3ae3241548166bb146.npy +03325088-9b15d9a617b37d16d0157e3e7a8917c.npy +02691156-8ba22e93df58242b61c0a7e9e23d6288.npy +04090263-2428abd6cf67771461cca2fd9af9f2.npy +02818832-a903172a5a2b7f7534ac8202f42b5791.npy +04379243-cc1666f0fa7a1672e5a8eba5f6050bab.npy +02691156-881a9dd186e1d5c3ca8607f540cc62ba.npy +02691156-7cbd504262e2d17ee91114a141d25a9d.npy +03636649-e12e898cceec4e23f51f77a6d7299806.npy +03085013-60101361c899c9b54ee5c9c77434cb10.npy +03636649-7f518fe982aae1b5940c8a2639c8747.npy +04379243-40d0dd3fe786e120d75c27ddd792e41a.npy +03691459-112deef454bb8345c6bd342792702e80.npy +02691156-6021cb206f3db880c57b4651eeb679eb.npy +03207941-e4919cebeceea53028b72743e7b13756.npy +03001627-3776f058b918372899b00821ae388810.npy +02828884-7ac31f1da37aca5160ddc468fe733ed1.npy +02691156-82cd0676627c20b0879eac31511e27a8.npy +02691156-72c28618e3273795f9066cd40fcf015.npy +02924116-fb8045ca34f292a087c6856023914391.npy +04530566-2a9b44ad6d6200c02b3fb35c6618f417.npy +03790512-55caf44a43f2c04d468bac13e007a6e9.npy +03761084-cd475ed6b6300dbdbe3a55bdbe3532d.npy +03325088-a7e23856ee1f9789a12b86efa90a53a4.npy +03001627-cd238045ebff9be59186f15d520c12ad.npy +04379243-8be0acca4f67e4a4ea966ed2fa6fd5c0.npy +04379243-b23030e1b7084fd9d38913e96bbf2a5d.npy +04256520-1050790962944624febad4f49b26ec52.npy +03001627-8c4d57109ce0f2f222659d33fd79709.npy +04401088-5b111b3a3e94b5907e1c85c5c15da7fb.npy +02933112-52e92f372629cf356e8f1932e45c9faf.npy +03636649-f2f6fbeacda7cbecfcb8d8c6d4df8143.npy +03636649-342ea0134b504918cf5a37a70014c623.npy +04379243-977457a28e32ddbec242632b2a8c3129.npy +02691156-1de58c7eec71b438bbb26c14135f164e.npy +02828884-23bb9c45796a28d4154e78d1322f3484.npy +04379243-20292fba71362950c59c53f7df509858.npy +02992529-5ce8fc4a82d2d97736d4d4df7a719b88.npy +04379243-d5de572c3f6517374b3c42e318f3affc.npy +02933112-b50c25e6b5447714e90f8ac2c1271ce3.npy +04554684-725bbfc557d3e1b9b5af85a5be833ee.npy +02933112-3f668a006192f1afffcdb54593f6ab3d.npy +02958343-eebbce8b77bdb53c82382fde2cafeb9.npy +04379243-e1f77c5cfd7ea402738e43095496b061.npy +04379243-d40fb361cf8aa18767dc358060e3c47b.npy +02958343-125a4780c2d5095d19454008aa267bf.npy +03636649-bb7d710f4104d16b88e7662971dc736f.npy +04401088-b9f67617cf320c20de4349e5bfa4fedb.npy +03636649-8e9c28fc5813a5bdcf004563556ddb36.npy +02691156-ebe0d0bfa6ec36edd88eab18f1be033b.npy +04379243-79f63a1564928af071a782a4379556c7.npy +04379243-a80b1f16f5dfae242aed93548190eee8.npy +03790512-48372a904ec9cda048272812609617e2.npy +04379243-6cd84ff61583805c85e2af9bf984f0b5.npy +03001627-41bf66b762decaa42c6c98851414a9d8.npy +03636649-3607a2301201064ce7c8fa552499fc0e.npy +04379243-91dfc3575149ff71342398ca9dc32672.npy +04401088-db96e9b2c96c273de7d92dda5756fcfd.npy +04401088-768648ae74e9d84e6d445fdc5fd8bfe7.npy +03001627-37e5a1f7f0409a3b81d7f282a3dff363.npy +04379243-94966aa8a7a6f540f6807434c358ea12.npy +03691459-9a94af940a768aee5865ac92cffc2982.npy +03948459-73c9733fb85d974b3b2b25ffabe35ca6.npy +03636649-c372499c4fb0b707e262a7452d41c334.npy +04256520-3acbbce6f05c2623fdb2be860bb16c8c.npy +02958343-1724ae84377e0b9ba6c2c95b41a5446d.npy +02924116-29a4e6ae1f9cecab52470de2774d6099.npy +03001627-73b369b9808bc2d0f6ba522682be8978.npy +04379243-cc5ef32dc87e0f245dcc7ddfa72357b1.npy +02933112-bc1298b1c55849b14e82b8d74b98baba.npy +04090263-b0a050985a5ce6be25508ed649b952cb.npy +03691459-7d2bd4d349ae34a2fcefa74f1d0bc6e6.npy +03636649-3c9f0efc08817ab6fcb8d8c6d4df8143.npy +02958343-12a445770f7d6f2b70a43c2d978e502e.npy +04379243-c05f807d12761472dfe9cab879fd37e8.npy +02691156-9550774ad1c19b24a5a118bd15e6e34f.npy +04379243-c5178a8a0da618a25d78ff7fb413274d.npy +04090263-d9aea67e3209d6aa1153b2cafc57da88.npy +04379243-60fbc4c64d6032337af2ac6660aa6669.npy +02958343-41d317b520eec9d38d3d01fa03326bb0.npy +04379243-cfeda84f71e95e6169ee3dc2896968a5.npy +02747177-d75e58ff57a881286aecdf1bc1fdd961.npy +04256520-d55d14f87d65faa84ccf9d6d546b307f.npy +02933112-3a0492e3892bb29f12de5317fe5b354f.npy +03948459-98c0bd351e275b3c96893524e607761d.npy +03636649-ee9849dc8d93e16c118ddfdb81cc6068.npy +03085013-c6f97082a7d28645ecda5e76a9473fca.npy +04379243-7affe342bb9be16d5936c7265c890fef.npy +03467517-b7e1c7e7ddd1485277df4c4d253ba3a.npy +04530566-93c013c922b90649ec08eb6485163157.npy +02958343-e1c3687f400be151cd21a68c6dc7b5e3.npy +02747177-1f4f53bc04eefca6f155d75bbf62b80.npy +03991062-92dd4a5efaf2a1702d7a27ffaafaaddb.npy +03001627-1aeb17f89e1bea954c6deb9ede0648df.npy +03001627-22740f20eddc5420492d9da2668ec34c.npy +02876657-545225eda0e900f6d4a7a4c7d6e9bdc3.npy +02933112-92e421ce25931b6da5e3e028709e0474.npy +04379243-5c6cad6a12d7cff3bb6e988dd2500ba5.npy +02958343-50ba203c086c496df43db49cede9f847.npy +02691156-56ace4b209c9ee823bb911cbca3906a3.npy +04379243-2a4f92a70be4e2159c0b027ae5b223d6.npy +03211117-96f01698d0446641ea6e0950aa8ac31b.npy +02958343-dd0b595b15a7203e185ce5d54f27f6b9.npy +03001627-b44d32061d313fc1b7a3c315f744bdd8.npy +04379243-8af6aa6372ade15d8457b637f6fe1690.npy +02808440-f5713226c59f9332ca11f350bd7ec054.npy +03636649-aa1e797797bcc2b161b08af0433fd9aa.npy +03211117-648fe31415502db61c298d13539601a.npy +04379243-3dd217a06e76292b372b6139ac78b39e.npy +02992529-59a168f51f8d7dd9e59685727bdd9ae9.npy +04379243-690e073a4000c7ae540e292bd26f307a.npy +04379243-6137e19255f71a0a26700e14156d231c.npy +04090263-346d1a548be65182a67ac8a08d7e171.npy +04530566-548c6234fc7c787bfeea5c85a86089b5.npy +02747177-1864da0abd05dde7f4fb4dee5181bee.npy +04379243-cdd6c99231cca3c65b187a2f89229cea.npy +04379243-eaea1cf98b61abd043383304411cc9ec.npy +04090263-d3f3e2dba3dc32c0ebbc1e980ea10b4f.npy +04090263-1e6e823412133e585a5fb2c1a52fc5c.npy +04379243-bb5dbf708d5eb7f82099f9e22ca45b04.npy +04379243-cf010623152e31ad2366f6466c2cbc19.npy +03085013-ef86e713b0f71801d5ed7cc6bf6e7003.npy +03001627-6223f3849d57154b5ecb3cc57fe87cee.npy +04379243-f0d8620b49ea76db83130614d8020b3.npy +03001627-e4a890f2330ebd7e4a11872aa986426d.npy +04090263-fbf5a7f93f70cfde12b38b1d99376c0b.npy +02691156-2f4133664133746cf64801ad2940cdd5.npy +03636649-66f7a541e0459b06fcb8d8c6d4df8143.npy +03046257-7627cd63f72a64c3a50aad89e0fb309b.npy +04379243-30afd447dd7201d652c0eaae5c15cab1.npy +04256520-81a7007ead4051cd22ed3259ee7e608a.npy +04379243-128011ffc7787d50f0920fefbe028677.npy +04090263-5b9b869475b3af7281112f9b0beb0a14.npy +03001627-6440fcf4fd8214b7dd58412a5e38ff83.npy +02933112-54a7817fcd0919697753725ea42159e8.npy +04379243-7ec1ec1db13eb349ff085529822a7226.npy +02691156-d48064100e793155f56a7ca118af1bd1.npy +03001627-c92721a95fe44b018039b09dacd0f1a7.npy +04379243-5b97f44d872864c21f7d7307c1f45af8.npy +04090263-285854c90afd66c4c9e18dbb8de06b45.npy +02933112-2c6aee97b0325e92de650492e45fb14f.npy +04256520-929614d79ee9b3f7ba83cc8b3ca4d7c5.npy +02828884-671cade486e88b3880d14ef4d993c2fa.npy +04379243-a96f4daf990b3eda53a3e8b300a51f98.npy +02924116-321c0fc84c8fc3c82d4e86573259e388.npy +03593526-a6d49ec1234f2465f84f031022f95405.npy +04379243-abbc5e4950ff6ea8f4b6538438a0b930.npy +02773838-e5fea6c1dacf3ed4cd99ccc7ff441abf.npy +03001627-4f66b8a004a1515df33978a307b45373.npy +02958343-30774e3218da1f793eccc98914b46c47.npy +03001627-cdf733e544e6646f9b75b6346baf0c12.npy +04379243-4fad1101568fcd48fa7b9a6c80e4e324.npy +02808440-8de00e529b8b39a244221bef0fa3c36b.npy +04379243-8e5c3b7366f2f017b4e3935c6cee4b35.npy +04530566-997054b7ea21f5829588e71e21de9f30.npy +03325088-29e597c4e5cf1612b05296093fcb87fa.npy +03790512-5be7e00fe279ac927cb7616d82cf9fae.npy +04379243-3695727c04b15887b983088451bda93b.npy +04090263-a8b65f50dfb2a74a9a6e43b878d5b335.npy +04379243-441e0682fa5eea135c49e0733c4459d0.npy +04256520-bf816001f25b2ff822e11aea23332c0.npy +02828884-2bfeb0ef0693823d1418b6bd61b3ca4.npy +03991062-39ea99284138e5e835b3d63776480dcf.npy +02691156-13370c42b8ea45cf5e8172e6d9ae84ff.npy +03325088-36aa5b58afa181c76d20e73c57c9a03.npy +04090263-ea9ee0992bdcad77e641d7676ac20451.npy +02691156-1fccf0064e0aebfeb179f2ac46747670.npy +03991062-de673ddf9df03b8278cf1a714198918.npy +03211117-2971f417b08961475a4cd9b26f359d36.npy +02773838-631fd8c280dfb9d5cd3852d63efc4336.npy +03691459-af4dd70becae7293efcf7226d1117163.npy +03691459-4aa41b48ef7711f89e87d2bdcb41f548.npy +04379243-98dcbe480586e9a951d5d1004657a651.npy +02924116-782fb7fc878169906ca2b6e5474aad11.npy +02958343-cfb6c8867c6dd84c80e74058ee862f05.npy +02691156-6dead775080763b94c3a35cee92bb95b.npy +03001627-79c9fdc6bba82709c8687ff9b0b4e4ac.npy +04379243-ccd3c75b72708a90c955e5ed03ef3a2f.npy +02691156-9436273fc1a5e3ca7af159eaf7625abf.npy +02691156-e25794343ee37d6fa8eeb11153b68d81.npy +04090263-128cb9e49c7e214ef2e947b62e6a6cce.npy +02828884-5a52ec36c75fd3d87f502c4e1de97042.npy +04090263-b2c3114a9acd55636d4858690640024e.npy +04090263-b13c2dec1a1dd7ab9bba8f87a19ff3bd.npy +03001627-77dcd07d59503f1014038d588fd1342f.npy +02691156-a9668a32a91787a6be5437d0813f18f0.npy +02818832-ddd75dd50dc40a3f8c1632739e6c2fc5.npy +02828884-ea892969e4035e0fcb2a965e75be701c.npy +02691156-4209abb3ec319f85e5118a089c2a99af.npy +04554684-5e071ea7184305122c5cdbc97c64ef41.npy +03797390-d7ba704184d424dfd56d9106430c3fe.npy +02691156-fe4ad5664773074cb536c73c7d134340.npy +02924116-b5d8740b0662dee71cb7939487e62b3.npy +04379243-476e7d25434b67e75f490d1795e78588.npy +03642806-67e4cc8e13aa863cc418dd4d8b66af83.npy +02691156-439c0ad637f11af762b600da24e0965.npy +03593526-7fe9e595c5eb7d04bb4fd842f8631c2b.npy +04379243-d2cc7d1f7fff8488698b889b37529d3f.npy +03001627-972d675d3ce3555d492d9da2668ec34c.npy +03211117-68a4fc70bff1e1cc700fc5aa044d9995.npy +04256520-6e4fab35f29925f14f438613584cbdf7.npy +04530566-6fbf3621aa1d3a8e49f0e3dd7767881.npy +03636649-ce406a32bdc610198ca4aeb5e3b33af7.npy +03001627-fe1081843a08b7a64d8fdc4d7658fe42.npy +03593526-76b3419536fa2802ead5bd90ea492d1b.npy +03211117-dd8cebcb4d0564059352b002a7d38daa.npy +02958343-528c01214da6d4bca7fd25564c2e888e.npy +02958343-f5e0edd70d644777cf1e58caa15acb49.npy +02958343-85f3dc3318f5200c8672c9b355cd2075.npy +03211117-caa4afd404f24d21275c1147a304ed86.npy +02942699-e9e22de9e4c3c3c92a60bd875e075589.npy +03001627-b5706706df77157627d4fc401a34f3de.npy +03636649-4bb676c497969016de98d10ab5975b59.npy +02818832-f6fb20673932fe50230e608bf41b643e.npy +03593526-370c9228a2f41e99346cca8c07629c62.npy +02691156-74797de431f83991bc0909d98a1ff2b4.npy +03636649-10ba42fc70f16d7f41d86c17c15247b0.npy +04379243-cea61ac56a07271a96cc2d2cb6bf6019.npy +04401088-57245f4db78fc2be7aa291768a04b26f.npy +04379243-73d57c83a4ac0979d80195020ba66865.npy +02958343-1d4066f8ae88a1ebec8ca19d7516cb42.npy +04530566-6e739e28803bbf257446ad526c7486ad.npy +02828884-e8403ea994ecb1cf855931d119219022.npy +03691459-3ee30326a3bdf219ec2ca8479368108a.npy +03593526-b59f693b45f636d54c6c80caaf15808d.npy +03691459-6d6fef896f1196416526bbcfb9a38489.npy +03001627-63d45791c56483bb2662409120160a57.npy +02933112-9a195ea2a21bc7511a4db721d603d852.npy +04379243-8cc8485f249a37f595b25bd3accf45b5.npy +02958343-3e823f89c611fe57a413908c0e169330.npy +03001627-f7b52f9c95ebaf3ff91663a74ccd2338.npy +04256520-5850eba97de66d8e283b00891f680579.npy +04379243-c1fab1be028d2d1192d39b162a300de1.npy +03991062-6067418287b99c57c0592af70eec7f.npy +02691156-65b3e612c00a65a6bc0909d98a1ff2b4.npy +03001627-21a7166815b80f3f7fee47aa19e2e28c.npy +04379243-3ceb74b707f814a17bcd6a9a3aec51dd.npy +04379243-3243ddb2aa4d1659beb83c64f2162734.npy +02871439-920251969a40dcb155f46d55537192b6.npy +02691156-adad9536c34c673862b600da24e0965.npy +04379243-1e4d84c0be21fadfe84db9643b62f161.npy +02958343-b8c8758f8ee058182a9eb0f146e94477.npy +04379243-4f5c111a89b3fd27aa29e9f0529e8ef7.npy +04530566-ad8b5aaa3eb9f2f69330265a9fff38de.npy +03624134-eeb6322ec7492375bef48d9603e8869b.npy +02924116-be3a3b68029787359751c0a6c5d226d3.npy +02958343-f82b9a21855ef3feb1bb46d2556ba67d.npy +03991062-26d74b9867e986b08d38155f5ee83a11.npy +02691156-a61a59a4c48154db37678474be485ca.npy +03636649-12c0b15c8ed8a3edb039d8689a74349.npy +03790512-bf7794ea4ceb978bafc70af22a99299d.npy +03797390-7d282cc3cedd40c8b5c4f4801d3aada.npy +02691156-8700f6db654c5d2aca52e8e28cb200ce.npy +03001627-5ca11d3f35d870e1b724bccd568c5fc1.npy +03636649-33147aaf3d2c6fbc137af984a9f45d65.npy +04379243-f0735e59fa7222f9fe8adc3c073336.npy +04256520-515431e0c0854f1cce8417aef1b7a422.npy +02958343-318eaf9f125d8296541e8704b64e3884.npy +04379243-b1ca280d9567270ade98d10ab5975b59.npy +04379243-16ee1b2d9a12abead99c7626c95596.npy +04256520-9ef66cd1ab321cd3872052160bdade26.npy +02691156-53d8ce9573e361d990b1d6deb98feec6.npy +04379243-a5e061fc25bff768623d10a210f40a3f.npy +02924116-85efa9b5820d4fede381e109d127fc51.npy +02828884-2f815697256fce5a155b270ed8c04b46.npy +04256520-1867c1751ae7bb2829024035009201d2.npy +03948459-75476ba20ddf71fae868ed06b4dfef2d.npy +04256520-36ab61ce3c894d6514038d588fd1342f.npy +02828884-ef207b78de8277ec42fc59644ef58e22.npy +03337140-1d11f72cd35fdf2a4c3aee8e9d3a6ffa.npy +02924116-49f6f4047f548094b343a6a5860e15d4.npy +02946921-25c253b2e40b6f4ea61649b05d63e9bb.npy +02958343-626738526152dd13d76439fb95cdd2ed.npy +04256520-bda845f53dace1a7ab610b0c94236463.npy +03001627-e905abdafadb48d4155b2bc3322563d5.npy +02691156-bfd02b9a1ad7ce73fe2d13a096d8b561.npy +04004475-d92d3fe1e9174e3fe0db0b99552a07a3.npy +03001627-654b7415b53b5138fc5718d28351c534.npy +02958343-45745eab59d4ed09e9415adaaf77fdbf.npy +03001627-7aa759758e3b0d5024ef48ae9e8e965f.npy +04256520-1545a13dc5b12f51f77a6d7299806.npy +04379243-c578d2fa302f0b935e7f9846384b5857.npy +03467517-19edd59f5ac0f3c7972b486a47e2bd46.npy +03001627-7729d76b67931981f9111ef49c078dbe.npy +03001627-885bc048615523273eec26c23f5bc80b.npy +02828884-e79a991fbf64c2c771dde564c9e207fd.npy +04379243-a355108bb5272ff256d80c2792e1f42c.npy +02828884-229d510bace435811572ee5ddf1b55b.npy +04090263-f646b2bad0332c0a52a927716d03931f.npy +02691156-735aad15a1d22ed3dc92eaa8f8f40f9f.npy +04530566-82242062558a24bc97a9c690ec97cc81.npy +03001627-e862a41f869a4274ac7f1a00b76bd166.npy +02691156-edc185566c1df89c35fc197bbabcd5bd.npy +04256520-1f620792984f66fd22c3a2386a9dfbe9.npy +02992529-2fe9e8fd2a7c512ad1f278e1513f3b7.npy +03642806-39e61115ba9df4d3cf75707bd872e2b3.npy +04530566-e9c603efb5aea8087610cb1c03c9c3ea.npy +03001627-55dadd6acaa2a0c0dab72035db8eafd.npy +02691156-b837c3b8eec02a4967c54439d6177032.npy +03001627-219c0f0f7ee5c3737f9dcf5672c2dd0f.npy +04379243-5b67be496c11533c66289707fcc0ca1d.npy +03001627-b2239339005b14c8d675cc466d0d6fbc.npy +03636649-69baf1ded62a0259970e9f7b51f4efe.npy +04379243-2024beb1477fb5d2278d386bfa54545.npy +04379243-f2a759729bafbe88fef3fa725923b557.npy +03001627-5f256dd64efba74a4316d3320fdfa899.npy +04090263-fc0cf8eee4c33cbcb53b1ee7df9d3a60.npy +04379243-6ab7ebf9b94176456f1e07a56c129dfc.npy +02691156-12b25b8de7aa37a0bd46d022fd7d80aa.npy +03001627-934f911815518a12862ec27465061d4.npy +03337140-f4e9f25443ff6f963b59eeb47ee49193.npy +02691156-b2bb5a56b3d805b298b8c800ae001b66.npy +04090263-2f5dd43b4ffd7d433dd48eebe8f7b24.npy +03001627-60e8cbfd3cbf85d097b3b2f2bf40d247.npy +03636649-aed950102f1e9c7a659dda512294c744.npy +04379243-d2b0fe8551e6e3b0ab610b0c94236463.npy +02933112-c9ead211b387ce0c5c59c6146ff01de4.npy +03001627-1e03b1793723dc25fbd332e3dd079259.npy +03636649-b4f7f20fe212e633c14d5c159bab8297.npy +03691459-6450e70e275a80e0e39b302b17f4c82d.npy +03636649-fac2081abc0375649f41ef09e8fcdbeb.npy +04379243-feb92b34c698d396cbde89e0c48a01bf.npy +03211117-f7623667b09f2737a10a38d9fc3b0d4e.npy +03001627-b738a4aa965784abd86234e915108e6a.npy +04530566-5001bc761fe86d60a43a471ceb7c72ac.npy +04379243-4afbcdeba648df2e19fb4103277a6b93.npy +03991062-fd68b3538d3f12a2ff67c12005f72d2.npy +04090263-a9c06da447ff8ee6d6d33c92d1d05e93.npy +03001627-42ecccc972b45e38f4cccb2a97578c5d.npy +03636649-13f46d5ae3e33651efd0188089894554.npy +04379243-5b375eacdbe49cfaaa539cd22945e538.npy +03001627-e90f124b13901eabae8375def5e736d8.npy +02691156-4fbdfec0f9ee078dc1ccec171a275967.npy +04468005-618256f81ca14c15c50a037462bade42.npy +03001627-2f24021efe2ccfcc2db431502a680805.npy +03624134-8bac6592cdc56dcd3cfaf38598bf5d36.npy +03636649-169d73f18f7b17bb4a6ecce2eeb45768.npy +02808440-cb38405e384c79c05e4e385b035691bb.npy +04090263-cf5538e2b369b7b33ed6ca821e0a9e81.npy +02828884-4b715a1f611b30768b45d2a1081eca04.npy +03001627-8fd6ca8f2d0ce46b846c0e4d54382ad6.npy +03691459-590e2fa429a94e711b45df3fb820c9cc.npy +02924116-d630edbde8e8c3c1cbcf10e5718c0454.npy +03691459-ae4bcb4baca763c24521562865ab775e.npy +04379243-cba38f14dc16d5b5fbbc7c456d85ce59.npy +02691156-68ac5704aefbe4f54e86b47976e55141.npy +03001627-cccc93857d3f5c9950504d983def56c.npy +04256520-9b5e8c302f7e6fb4593ebeeedbff73b.npy +02691156-8fc553e3a88b7ad54e461d462a3ccbc4.npy +02691156-47b409c5c80dd7c533de69c9cd670995.npy +03467517-2e51f4d434d7f760e7447543ac4d4049.npy +04090263-6694001fb50d3f1237ff6d90891805e8.npy +02933112-59b0ac376af08592824662341ce2b233.npy +04379243-8bcba9172db65219ad5067eac75a07f7.npy +03001627-9fae85a69532d03fda686a7d8e3d0692.npy +04090263-6f09b74771f8b4808962281585efe24e.npy +04256520-4d05c9f0f34e1c22715de3ea7b582d7.npy +04379243-f2fee52b9098c13fdcfa6f33a3c5eb83.npy +04379243-201c3e44a5967cd030bbd4cddd04c77b.npy +02828884-ffad1499a8bb6c7c19fb4103277a6b93.npy +04530566-d5b2fe7ceeed1ff59268271e4d570275.npy +04090263-8d9d9b749562c59a9a2ee232a197081e.npy +02933112-8fcfa31d1df6e8ec9c2edb56a98b4be7.npy +03001627-d7da1c65f996cef2febad4f49b26ec52.npy +02691156-debd942c5fcdc9c84c2c88971423d0be.npy +02958343-1f7393970917e558b4a20251cec15600.npy +03046257-2d65d034332ffc8397cf3f86b15a00c0.npy +02876657-882d477872fd88347df6165146d5bbd.npy +04379243-8efb3d9ec93520a797046e48d8f1e936.npy +04379243-5ef5685e19c5b253674ce64e4bf77aec.npy +04256520-b281da26ecd358e1e7e684d25d4dcaf0.npy +03467517-c5f9c372078561644368de794b251ad1.npy +03624134-229edf8adcfee7ee70b60f242c0a291.npy +04530566-4b63a567e41b63974de203ef6842ee61.npy +04379243-74d470850c9f9fbcc2b64c0adffbe398.npy +02691156-e805054e6b9b3666fcfb100fed3ed97a.npy +04379243-40f1be4ede6113a2e03aea0698586c31.npy +04530566-6de5985910b222f8afa96d6d0eac8962.npy +04379243-884d2cc0d3aa8a72640e544a5d67c33a.npy +03001627-45a0b8c6923f587e694253b740159af8.npy +04379243-e2571e4eba2d9f5eab610b0c94236463.npy +04379243-49c24587a96211191679687a9323c13.npy +03710193-7ddfa116704ae5555bee258e658f9767.npy +02691156-ca0f8f701a042689331960c3710d952.npy +02871439-82b88ee820dfb00762ad803a716d1873.npy +04090263-5658068646336771cba7035647fbacdf.npy +04379243-104c8e90ecf0e5351ed672982b7954af.npy +04379243-fb4d71ac2bbefa2297936c81e7f6629.npy +03001627-59f4a5d8390c3c3d5fce6078044eb87.npy +04401088-8b291d445d412c09cc018c0e073a98f6.npy +03001627-b2f125cba550eb8bfebad4f49b26ec52.npy +02691156-d7f71651e6571ee2f63894cf4226f14.npy +04330267-902f4ee7655514ba109dc73fee74b150.npy +03636649-e6de1ff0564f172ad96790493cac7283.npy +03691459-75f07f0e8343639d37276d660ae66f0b.npy +04468005-7c511e5744c2ec399d4977b7872dffd3.npy +03001627-39fb5d3f557f64d4389f9a01d027a78.npy +03001627-9aa05f609e6731bbec19069e387c0327.npy +04379243-7f808e545bb01ab7ac91966b4f1152b0.npy +02876657-368bbfbb2fe08a6b4c5c5c89015f1980.npy +02958343-41a6deadd39b4c754d0f9a1ef5f184fe.npy +03001627-610b1621d1997ee1daf3c002be658861.npy +02924116-fbb06ea3f0c57f4d57987cc554f65cff.npy +02828884-4ddee322f191096a54e14b4b3de20526.npy +04379243-de500885a5cda50f99284d844aba7576.npy +02958343-1bfe2cb495f63c8f6bd865f153842b49.npy +03001627-12a56b6d02a93c5c711beb49b60c734f.npy +04379243-1ef656b0524b755eca6c3f11f48d07ed.npy +02958343-ddd17a0d7ca713f2291ea03049d40375.npy +03001627-780809a0d1b68f4a8ef4ac3a24abb05b.npy +02958343-8fe901ed95e115ed70a5d1d8432b5405.npy +04379243-32c78783100eac55b45b50ab552e35ba.npy +03001627-b3ef1c8790d42507d0dd5269e5b9cc8.npy +04090263-d9f1cee28bd9a88c2f2258791e7c116a.npy +04379243-b86e23bb0a3d337ef4b6538438a0b930.npy +04379243-c3b49ab37876c7f219fb4103277a6b93.npy +04379243-2a44569c8ab6ea22f222df538827afaa.npy +04256520-5d6a4faa40dd337826fc8d57346a2e4.npy +02691156-7977f492ebf2c1d5ce78be835f7c74e3.npy +03001627-d80ea722df716bd0b15194162f658e87.npy +03001627-76767a15f8de108975907ca70d2973a4.npy +02958343-79d4876cf799516b977b27045b1d8055.npy +02933112-3bc232700d2ed20b89a68decc32d3e34.npy +04379243-f89a468c302c89d9534fa06200d07790.npy +04379243-a4dfdf3529355cd934fbd63590727729.npy +04379243-f34a17d1b45ccc541763ab8766fa2282.npy +03593526-8ba355a47e0dd19c491effd0ae881ea.npy +04379243-711b4eeae1c12b77cdd18be3aeb2d66e.npy +03642806-f5fc954736b06be15fd06491ae919ea3.npy +02843684-e49629ce9c305ea6c725388bb41d64e3.npy +02992529-ec549f2ce1fd9acb634c1ac38a055513.npy +03636649-a90fe01c3ef3ee30fcb8d8c6d4df8143.npy +02958343-906e1969f7974f85977b27045b1d8055.npy +04379243-a6ddbd0556f5de20c64b3fdd6a5588a9.npy +02691156-71ddef945e2ae8de7d64cad20089f027.npy +03691459-b865f12d17532a3fdb24fbbf172c2159.npy +04468005-a41ec8a882ece95956055ed8cb4119ce.npy +03001627-387a0509406a8653b40f0ac0fb9a650d.npy +03467517-b58fa1227a9dba7941e721059b25b8b8.npy +04379243-33d18dbc04c4fc02e76bc197b3a3ffc0.npy +02691156-65d7ed8984d78a797c9af13aaa662e8e.npy +03948459-f6fde7ed3205f66bc440ec33c5d16292.npy +02808440-b7f3c33d4cf8d2fd191c3762b497eca9.npy +02958343-6e25d6cd4b112d0654ed192f2298faac.npy +02958343-e67509fb6192be6a7e7e5ea49ad8e45.npy +04379243-c582922f61a11b1ae76bc197b3a3ffc0.npy +04379243-64b2121e41762bd47954eb05bbab463f.npy +04379243-f0617cdf9dd8ece3d838ae16242881dc.npy +04530566-293781c9bf4f6168c4ff53ac1cae3d62.npy +03790512-780767b19b3201fc80ac3c28ee20beb9.npy +02747177-b51812771e42354f9996a93ae0c9395c.npy +03624134-6fbb80c3ad257a0bca53a8c40217e117.npy +02992529-1c87049d11292c5d21e2fbffea258ad5.npy +04379243-f48e40d7f7b07b8ae0c7300d2b2cc1d.npy +03691459-2ab4f9bbdc17d9cd618e9d35559b7aa.npy +04379243-cd09a9641ea97d873823cce3247aa03b.npy +04090263-498b4043ab8a0675e19905e7053d006d.npy +02691156-bdc5360ff3c62ed69aa9d7f676c1fd7e.npy +04256520-db09115f98ebf4bc20768660cf080d12.npy +03001627-741db054bd52c8884733824eae5cd9ae.npy +03636649-54d9556d51287bb470a43c2d978e502e.npy +03001627-501b15f5ff2152e5f7628281ecb18112.npy +04401088-8ef2182a6f91e71e7877a964f5722626.npy +04379243-8d7ac6078989980fad16260d4d73b56.npy +02958343-91be65c386bafdd21aee99ace10c2d7c.npy +02808440-8399987b9bca0dd0e63a9e8397b31118.npy +03691459-c15fdc911c54f4cb62c440075d5ed193.npy +03513137-eafb1b2b77dbf8c8172c0c1bc4c72a8c.npy +04530566-f17262f7443b98de38d037116a032a18.npy +04530566-7af3abe01d2ba4ddf09d36263ac1039c.npy +03991062-5a1ce09a479b866f1ec48bc3c478566d.npy +03642806-25192ef0befdd75d291d2d0d560233f4.npy +02691156-ffef991d85e3136a9a6e43b878d5b335.npy +04256520-91e6ad8710f56cbd91d7b2865937b45c.npy +02992529-ad0af9e3dc8473296841a8d53aa30506.npy +04379243-6fd426f7cc1a2b00d5130a83cfbc8bfc.npy +04090263-5f8daf709c9d4edfd3b936925082270f.npy +02691156-baa972f48cde1dc290baeef8ba5b93e5.npy +04379243-80ad425b12c2c008738e7290b6f3237.npy +04256520-2d4bda48253f35bf52979c729a1f9cc2.npy +03001627-5da5cc7b5a6a9d6f433334f7dfc6c30a.npy +04468005-a9c9ad88e5b800ae810c01b1498aa2b.npy +03325088-b17ff4c76129d106742cb5615ada39cb.npy +02933112-2b45de8320e0b2ca55d7f0828042fbd.npy +03211117-57093dac689edcf2cd318d8b7a33448f.npy +04256520-7c4bf66c71ca90b5c2c449c0c0579ec3.npy +02924116-9f2a6f480d60dd2424e09d2b1795b9f0.npy +02933112-265521e0fc7a663259f8e31ca87c470e.npy +02880940-530c2d8f55f9e9e8ce364511e87f52b0.npy +03991062-fc24453aa13d6b2293b2b448490135cc.npy +02992529-623bc1157836ddeff8a51dbffe0021e4.npy +03001627-a45477c29f71d4f37597e1f94410131a.npy +03636649-e8c75d7c6f151e2b3d23022ce06f940d.npy +03790512-24359f14ac176b13d270caeadc60b9bb.npy +02828884-54c5e4961c97527dcb2a965e75be701c.npy +04379243-6560601e3e72b64296c50b25b74de6ab.npy +04379243-1ac080a115a94477c9fc9da372dd139a.npy +03325088-ede36d1ad901fffa54d7082b34825ef0.npy +03691459-469f794b77f3f82b5f1f3016f773503.npy +02871439-39ef7e982d00763560507fdad4357e06.npy +03001627-34b1b2ee54ea314486a1cb4b695edbd9.npy +04074963-57759e351ec76d86d3c1501c166e6b2a.npy +03636649-1e5e1ff56c27c0d2adc5f5aafedb1c38.npy +04379243-e7f44c111fc65019e76bc197b3a3ffc0.npy +03948459-752a981f2d8910a5fef144202cb2b935.npy +02691156-e06c2333068e9bd0755d33896264181d.npy +04256520-1c7c7a7b20831d699cd2678508cc27b8.npy +04099429-7fead32a8af2bf9d347bb8efbe3bdc7e.npy +03593526-75ebd17ea72f4e6257f40ff86fe708ff.npy +04090263-dfc1c3367bba345c45727cc98c29a700.npy +03624134-4fdd99c04126b0027037e93b1456fd1d.npy +03046257-31c8a274d5b80d798325b286685278a0.npy +04554684-c0a1a342e0ca945edb04615d958147f5.npy +03001627-5c95a378674a05b313236fa00fce09e4.npy +04379243-e5261b63c63b226bf7e56c1f3346606a.npy +03467517-c1d8991c3a219e335f1fa9e7c1fad10f.npy +03325088-903a72db42df53f5669f229cc42f76.npy +02691156-8d847b813fa70470bc0909d98a1ff2b4.npy +03207941-d6b3d8434fc41179db4c5469c0c1ba80.npy +04379243-a04a45fc865cb61dbfb7d42898b82ecd.npy +03001627-a00f4f424b6b4c4c19fb4103277a6b93.npy +03691459-e849b0017baa1a978a0181490cb73cbc.npy +03691459-db9fa74a2b9ae465c7e50d673f14088d.npy +04379243-c8bab1768e4af6ad5e89486951545417.npy +02747177-3886bc0f590dd5ef2056b4bd5d870b47.npy +03001627-bc75933af4146bd3fdce5d02dd243c32.npy +04090263-e92b167233273b73f4085f263b03d26c.npy +04379243-1b4e6f9dd22a8c628ef9d976af675b86.npy +04256520-901440644e396746bab0cb5a4ccf2fb2.npy +02958343-479f89af38e88bc9715e04edb8af9c53.npy +02691156-d837b5228d9c010bbe584d85bf07b4ac.npy +04090263-79e15b2cae644af4e8d3100f6970279c.npy +03001627-a734ccbcbd430e8c9eea64ae4d2b4158.npy +03636649-c1d2b20435cbeea0c0028f3b08785d05.npy +03642806-a702d347f32e0d3a229fe85eb79d32b.npy +03636649-b31c246d2341429f76c2a9de5c96f76.npy +03001627-6f04104e178fb858f7628281ecb18112.npy +04256520-9e88cb24b40dfbfb85b479b317175b55.npy +04379243-9d02362926dcb3f6951c1fffab4f5807.npy +02808440-f6f8241116920f45b362845c6edb57fc.npy +04256520-330d44833e1b4b168b38796afe7ee552.npy +04379243-48afc56a733cf916660094e03bb531dd.npy +03991062-9da456e7bae24501ffc6e457221b9271.npy +03691459-e02649d9d5ee2f26d07c55cf995503e.npy +04074963-5eacb3e90eed9700fee59de128b08a7e.npy +03001627-c960ba7a781b6fb9fb7e1f95705d8fb1.npy +02747177-208777cf36e27cdef4fb4dee5181bee.npy +03636649-2ab4c7882329710f29a42a0444436860.npy +03948459-34d72e4e5e487d9c93550d252b5c25ef.npy +03001627-9582e42453da574f37bf42a4ca375618.npy +04460130-dd36bd331fce23aa5a4e821f5ddcc98f.npy +03636649-94eae2316754482627d265f13671170a.npy +04256520-a2b3c5312188bfc2789b222a43900931.npy +03325088-8323ee8eae530a642b3e9b6eb52d35df.npy +04530566-5b88544e42981ce0a71aa3ce894d7bf7.npy +03001627-10de9af4e91682851e5f7bff98fb8d02.npy +03691459-3fe90423ef5b56386af2396cb8af8a8e.npy +03001627-cf32f38c2b6c58dce45ef4135c266a12.npy +02691156-675464537c846822aa7669713586004c.npy +03211117-e767c4f34fdce88a9c4081063e213a15.npy +04530566-54c0a11324d0ca82942dbbe2d0488895.npy +02691156-455bcf19112ebab52e78e1154b9a2647.npy +02691156-f58b4ed02fc2fd1d4e7648015fd29a1c.npy +04090263-77ef2da2754d6b82fa0021572e849910.npy +04379243-e6e92596fe6fa9c965124e7461e47506.npy +04090263-6cbf83cff8dc7b23623b64770edb4be.npy +03790512-923ce819405ae29230c72ee872e188e1.npy +04379243-883f5e54f764056f6dd4165bd7fb497.npy +04379243-e4e30282a0089a5bff06c5af4a0771d0.npy +02691156-56fbecc11e62071553a6ddb5892da51a.npy +04379243-3d95c4ebb88f94b3d2f054448bd437d6.npy +02808440-88b4942caf79dc944221bef0fa3c36b.npy +02691156-30b5160e2870b7a0ac8be969b55649e0.npy +02691156-f27927b066b0696d1f95d2b537942ba5.npy +02992529-fcdbba7127ad58a84155fcb773414092.npy +03001627-6a8e63f10bd6736e713decb1a0563b12.npy +03001627-b1f50d8d41a8c53b6197fd390b16d14d.npy +02933112-7822a30ec2e5c57f59f8e31ca87c470e.npy +03001627-6d78523e939aedd482e23b5f9fd46e1e.npy +04468005-1ceea57dda2812282ce211b1462eb07e.npy +04256520-fd2c3219b28d98768dd711af5650bdcf.npy +03991062-aff6b11c514f2c07f9aec59741c69cf7.npy +02958343-47aa50eef6b59ddbc552d162ae439d98.npy +03624134-539ff9b2a7a0329e759e4c424bcdaafe.npy +02876657-fca70766d88fc7b9e5054d95cb6a63e2.npy +02958343-6dbae14e481e8fb9333e0bf0b765fa12.npy +02808440-691d75148d42c03cccd0340812259a39.npy +03001627-91cf38c4b99d75374fa746d16faad4f5.npy +04379243-83a2a5dfe03a2be1b2b755acb296d925.npy +03636649-1c2327fed3930660177f2a3a0c71fbcd.npy +02808440-70b6ec39b993a7437a809fceb352d42.npy +03636649-f4994cf967f3407ff47b2ae6b11d6f43.npy +02933112-b6fa01c7e28a4a777024462ecce15220.npy +02958343-89765af115d9a4955591fcdffe729c55.npy +04090263-2edfa6fb67b14cbe6659d9c9bcbf8054.npy +03001627-2060f4d31feb73dd7762ba3a489df006.npy +04256520-7e1d225f13bf40d0d39e33fed94f56ef.npy +03691459-cc88df1c3cfac12a99db62650613bd48.npy +03593526-8c1d8325da907adf51f77a6d7299806.npy +03211117-1a9e1fb2a51ffd065b07a27512172330.npy +03001627-736630a749935489f78c99506bdaf97d.npy +03759954-738c4d765012dec0c0038311e9d5344.npy +04401088-a698b67778c02fcb5a0a15c8380e928f.npy +02691156-b0599ecbf78aa615a8e091cb544689d5.npy +02691156-596cddf6fbdc9d6b96212c8f6cd06e.npy +02691156-261093138afff514d8d7812d176664b2.npy +03046257-cbf19a9c2a47ae354b3c42e318f3affc.npy +04090263-4ae8bb7c50daf1352e4df18fcaa65e04.npy +03991062-ce15f18c40d5cc66a2c59a4d90e63212.npy +04379243-c7b8f5ba396c07331eb51344489c49f3.npy +02818832-b31dbe37497a7fd3812729af89b046f.npy +03001627-d16b62da42fa61f0cbce248a4e686c70.npy +02691156-ea1aa637a6cbe7b4fce29e20147f9d9e.npy +04256520-9840eaff2718fe1214038d588fd1342f.npy +03001627-b6fcfd4f7af69e1ce8f8c11a24c52ebb.npy +02876657-bcacdde81063a5df30612f5c0ef21eb8.npy +04379243-adcb67b58024afb99910b7ec4c4e599b.npy +03337140-8fba7de21910dcfc4c3aee8e9d3a6ffa.npy +03001627-a682c4bf731e3af2ca6a405498436716.npy +04401088-ffe8cc1d33f3fb83d954b120b2d50f0f.npy +02691156-e0b5c450de6d7fe3d87c63d8b3018b58.npy +02691156-ce827e4c857d553f71d03b466c72ce41.npy +02691156-3fb3fa76a2e67bae71d03b466c72ce41.npy +03001627-95ac07c8c517929be06a9b687d35bd76.npy +02691156-ba662ec78231c493252b4f9439ef95a6.npy +03636649-c78a8f317896b79f51f77a6d7299806.npy +03636649-34a9c2b926de1db2a50b88953d263a42.npy +04379243-956752510546d938788e70128ded264a.npy +03761084-628ab6e5d0cf78b8931f48202f034c81.npy +04099429-3e75a7a2f8f602df390a81c7a00f98eb.npy +02828884-ff7a08ac16701dcec0277fc71766d822.npy +04379243-99f15c63712d9fbe84868d3618d73011.npy +03337140-30aa30307b5c651f4c3aee8e9d3a6ffa.npy +02958343-c12a701bbdcb3df7473f10e6caaeca56.npy +04379243-5c4557a826e80297490ad276cd2af3a4.npy +03593526-3ce0e5906686042c939163818f3c3007.npy +02933112-bf4aed04442c31e4f759a9b042055cc.npy +02691156-5aee97ad467ed9d75fe4b20a3aaa51a2.npy +04090263-c513665dbd0d0606f85b811e02bb4272.npy +04379243-7e1f5ec947e7587e391e4d6c585a697a.npy +04401088-44cb63b74117f9a77877a964f5722626.npy +03797390-fad118b32085f3f2c2c72e575af174cd.npy +03211117-40c53f54e7fb0e3ff4c409c17e0a5165.npy +03691459-9d0734e39f06529ac0cc451921109913.npy +02828884-8a5a59ab999c03ccfb0eb7e753c06942.npy +02691156-1d5beedb73951ef68649ad8da70da1e.npy +04379243-39fb0260d1e669bed0037f03195bf42.npy +04379243-27fd962813feeb26be25fbd47cafc694.npy +04401088-96f4e3797b8e66042b8a15395c060463.npy +03001627-ee001ffa8483ae1b7f0e458a1629fd0a.npy +03991062-1ecef53ddd34e07d78caa162a41a851e.npy +02958343-fdb16a8648016157994a3466f8481f8a.npy +04379243-9a0f67133d4757964ef2fc89218529a9.npy +02828884-4d38a3e7f051446a9b5ae2fb66e1e25c.npy +03337140-4791327c6e5d0ce68962005ce0e986db.npy +04379243-3437f0ce3933d664842f894f9ca76d59.npy +03001627-e09466e9c122dbfdf51f77a6d7299806.npy +03001627-ea6c45a1a6accfa7201a419fa3bbf2e4.npy +04379243-6c9ab42a8e028b103fb0920a55a7e805.npy +04530566-14241942d79f89226587cb13c78fb9b.npy +03642806-645a52293092eceea37e4476f3cf2752.npy +03636649-629f9f656b05ee62ac280f441d6450c6.npy +02992529-d3dcafb368c1defaa2c7c5886f4bbc93.npy +02880940-fa23aa60ec51c8e4c40fe5637f0a27e1.npy +04256520-8c03e6ea484108bcfebad4f49b26ec52.npy +02691156-6f0ad1fb7917fd9b50577cf04f3bf74a.npy +04468005-68fa56bae19b6cc32b97ac865c3ecf8d.npy +03593526-f93f2a0590a805da30f549f12038e49a.npy +03211117-f75d1962eb04669a164790a64bab08f0.npy +04256520-5e9e4d6551b775d8cabc196a7f35f1aa.npy +03691459-e5012f54d03b863ecfd43bf63e641a70.npy +02958343-25c292692638406620f29d4da2b76f7a.npy +02992529-6609f05bbe9c49172cf708d3028fb325.npy +03001627-483cfed0659965ed73c478529c40c4e6.npy +02828884-5125cca7f42b90b2ad5067eac75a07f7.npy +02958343-e7add7a018da8056bda733a39f84326d.npy +02691156-fc7c3ccb57f65337209009cfb89d4bd.npy +02958343-33f95e59143938ddb490a9cf145bf702.npy +02933112-4d97127bea831058b26ee99f2f592682.npy +04090263-d4312787c89edb399a6e43b878d5b335.npy +02992529-fe553cf733e29a349426aa93c5c54668.npy +03691459-98cff6064749a5f3e746404352385716.npy +04379243-11fc4731e38789e0210283402c81dbf4.npy +03001627-86fc0fd9ed51dc11664b3b9b23ddfcbc.npy +03001627-6b8c5cd585ef8c67ff2b8acf844d34d2.npy +04401088-5a37ad3759b4d93df843a7d4732b1d6.npy +02691156-157936971ef9b6bb858b20d410ebdb99.npy +02747177-7b407dedd933e3812f59b845f0db2ab3.npy +02958343-9a22505d1e6221533c35e65001c8c258.npy +04379243-609f064ea48440645d8fcbc36a5e8c00.npy +02958343-5d381fb0fcb9ec3f3c2fa80e345b3e7.npy +04256520-fb859910000d1e219b709c9b379c59d9.npy +04256520-500fdf3d6ffbab95cb57ce1986fa546e.npy +03636649-1a87883fd4f52527e21c35aa7a22a003.npy +04468005-97fad8d4386e8be41183ae1f57465c4f.npy +03001627-e96c3df69c2a6fdee7e684d25d4dcaf0.npy +03211117-3f15446861936b20eb1a50f8f2ea3a88.npy +03636649-c05cc9636722504688e7662971dc736f.npy +02691156-cc9b7118034278fcb4cdad9a5bf52dd5.npy +02828884-e25c7c2469135e3fdd3adf3090c701f7.npy +04090263-d90fda1aec4042ca42b011d8a1631bd1.npy +04090263-41a9912bfe0dc96239169e4b52d9f093.npy +03938244-530cc7dd793df95f8f5ae2c97614087a.npy +03991062-9a5019501c85aa9c897534402e0f40.npy +04379243-b6884eb4e95d851b5f606243e56be258.npy +04090263-96b74853ff1d922f42d160994fd6c822.npy +03001627-ff5e8226b88c6b95741cdb62023d6a2f.npy +03948459-ac5baab43d72fce2771f90a41c66ca88.npy +04379243-c3c635d741fab1615f0b5ee0fb357b4c.npy +04379243-7c2fb7a6dde6be96bd5a65d923c337a6.npy +04256520-c1ae15118f856e5e3759b16de9b6963c.npy +04090263-1aa5498ac780331f782611375da5ea9a.npy +04379243-dff5b7cb4f72def6641f7a370ac2809e.npy +04256520-fb835879f66b7b95c43a4855019be9b5.npy +03928116-8678ed372995f6e49d1512864d95af6d.npy +04090263-27937d4b55596d689a2ee232a197081e.npy +02933112-7bd5510b4451cb651d6ac856ecde9eb2.npy +04379243-d9994cf6d5d444379dbfd5cfd194350d.npy +04256520-a3eef12c108186997b9a616d4541ada8.npy +02958343-c42f9dec04f0fb3151a95aaa6caba1d3.npy +02828884-3e323c2a7e5ea5dcbd4364391061cfa2.npy +02992529-271421566061988a93d9d97ff82834ba.npy +02933112-4e217d2ef816a08251c4deb11af7079e.npy +02992529-d8071a38bb3dd8f097c8d78b9aede742.npy +04074963-d393e6667bb949b74ee7c201cd897ec6.npy +04004475-1eb2eb87a623d9422d24866ea0018e08.npy +03001627-77cf056c6beffa5e3b6eb1ba4e121206.npy +02691156-86012cd0bb6727e9e80771be8faac585.npy +03001627-524bfc8159111e4571697d26793100d2.npy +02691156-5f8fa607106199e7bd46d022fd7d80aa.npy +02924116-4c13b5050aa7fe24ad3f75ce207a0bf.npy +04379243-a1cc1745e89098913a4642fe4c259750.npy +04379243-3031461b84576d7d6a69760cb58e50e8.npy +02924116-ced158ecd466c371d53a1e636a178955.npy +03337140-1bf8e2a98e2ab4316bdc8a5dbe375ecf.npy +04379243-90d87b4d9a5a1e78f4b6538438a0b930.npy +02691156-143326cbe409ca9f62048be44e1fa435.npy +02992529-e8d826158072a6bf1455397a420729a1.npy +04090263-7efdd44bf9d6ace13a653cb492d78488.npy +03211117-5fb06d76ec44a16bfa6dbbeb09c2f316.npy +04401088-7ba45cacce4b4c09c7a217851f86faa1.npy +02691156-c476ac72594e39ffbd46d022fd7d80aa.npy +02828884-9d56087c9f98bf90717cca22daef45e7.npy +03691459-6d070eaa65ffa57193fef5a7dc080ac7.npy +03467517-6602c186baded145d57700c05b1862d8.npy +03001627-72827d33aa4e3f54d8ce2b7ddb5bbcea.npy +02992529-933d5c217d9c01789daa2bf0c68f794f.npy +03513137-c347db0e6df5e11efbf020c099468179.npy +02808440-faf3f0ab58eb18d263f5120cfc7fc76f.npy +03691459-e8dd60afd061fb273ad55e05c29c23ee.npy +03001627-2fc2b897b6b131c4dc75a59e280f3bf8.npy +02691156-acb99bd964b1b23ad13ef00338ba8c52.npy +04379243-eca9efad6364021cf42a90fe4baf4591.npy +04256520-3f8aba017afa6d94f78aa2d67f081607.npy +04379243-21e8c818e9d517f919fb4103277a6b93.npy +03001627-7b4dc28c2d3268a09af25a2e608033f.npy +04256520-336fc8a43b3120932c48d6b905457dcf.npy +04379243-6124096fd3488b7fbbc8ef3196ea5fd2.npy +02958343-9446a1c34cc06eb518b1741f84b73b.npy +03691459-a31ac0bd8915d99631c992914b89bc52.npy +02691156-d171967c6353177bb87697d3904b168b.npy +04379243-14786ae920496ca7197c43c7dc584772.npy +04256520-3a693ca4add94bdffe1db2d0679386ff.npy +02924116-8b44b2dfd3de8e638468bf2aa02981d2.npy +02876657-3d758f0c11f01e3e3ddcd369aa279f39.npy +04379243-54807aa2b0f646a448efbbb060f51a02.npy +04256520-37cfcafe606611d81246538126da07a8.npy +03948459-434a15053bf9d88c670144fdfc186d25.npy +04401088-d6120b12aca39e73cdbe8a30cf95821.npy +04530566-68e60ab321e4198ab437d385637c4e1c.npy +04401088-983b045d30322f96b102e855af58e521.npy +04256520-9473a8f3e2182d90d810b14a81e12eca.npy +03636649-f4da1907ed935101ad5d0d05865f4466.npy +04256520-5a419dd9295d84c538ae0e23b03ac623.npy +02933112-bb741a003e5ff46c59350d819542ec7.npy +02828884-57678bef578b487a738e43095496b061.npy +03001627-11c7675a3dbc0d32f7287e3d21227e43.npy +02828884-6a3bc6b44ba974b69c0c9824ccd078be.npy +02828884-61cb827012c745e0ba29d2aa241f8fc2.npy +04530566-1f846bab69b20a23561fc06c3ebd59d2.npy +03001627-f5d8dd0309401ebac47a35332c17cce2.npy +02958343-fabcb04fc015f822ca8bf2993ca245b.npy +02843684-c5a9713e045f91363c04c1aafcac3ee2.npy +03001627-f0f9048f45eed1ab3a8888e78d004b3.npy +04379243-6cdb79b485d9df2dc667146eae95e931.npy +03211117-ffbe714918d982594dea158f05aae320.npy +02691156-af6b292c7857c78abb0e5c1799dab683.npy +03636649-8e2c822e2a316fa04f3443b22038d340.npy +03948459-5b31070deb9226b134c40d765f77199.npy +02958343-395d86efa3a1a55a49ddf31673a8d73d.npy +02958343-863d6f24aa1a478e569564f61ef539e3.npy +02958343-85952ffb35de9bb951a95aaa6caba1d3.npy +02828884-72d5a7338dd7ccffd7262b1b986920e7.npy +03624134-9cd61c62fb1bb4c6fe72e087f55a178e.npy +04090263-c253c204b55470eaf4e90b82ab227094.npy +04090263-5eb64afe7a276c243a653cb492d78488.npy +03928116-e97e0ec1af5c74002e20b5399bb84222.npy +03001627-2f0318b23d899a84493f17f4fe9b9eb2.npy +02818832-d8de84e7c0f8cbb19473aab1da686220.npy +03642806-39778c495baf4bd9ac41b162b25b4656.npy +04090263-cd4fe695c04daeda6d976be0196645ff.npy +04090263-d83e4e5a7957117be6e1d9f65d65c2b6.npy +02691156-724be1fb093a31a1ac8c46f8a114a34b.npy +02747177-18dbebd6527cffa254685f5f473de41f.npy +03928116-3a27071e0436ca2e5917531e67f8d3c2.npy +03211117-3f83beaa4da6209dca62ec94d15d08.npy +04468005-e981f0fedd7680cbb2faf16541f353f5.npy +02691156-95fe3a31e4c084a128132d87f74ffe13.npy +03001627-590ae1748c5acdedb05550de345b6d0a.npy +04379243-d198fccb12ad508a3c97cc6789da1c31.npy +03001627-341e18eafb46f892a6fee8e2140acec9.npy +03928116-ef398cc2782a3a2191e9393f43799b4a.npy +04379243-87fd23051b01997418885412f2b0a4f7.npy +04379243-280949332aba8b8a6d8dfe83fd00685.npy +04330267-2a5cd751b522d07dce1b91578a49ea56.npy +04379243-cb6a8ea7b323c023f046f610ef0e4e90.npy +04379243-15e651b8b7a0c880ac13edc49a7166b9.npy +03001627-2448d9aeda5bb9b0f4b6538438a0b930.npy +02924116-9b2d743cdac60228ecd77a402e690110.npy +04379243-7a2f94d95992b5716521d4b69744cc6d.npy +03593526-9998f783571e10a7d680196133d8b70f.npy +03467517-3fba85bfdb125b1b93f0194265a9746c.npy +02958343-8c01303b68d30be5b9ad5039d820c924.npy +04099429-b6cc97a892c025c07ec95138ef83ef2f.npy +04379243-34df750af2640f576d616bfd695eec80.npy +03001627-34fc767b72047d9ae97426e55fb77981.npy +03325088-7224a70801bec99c3321831d2245cf06.npy +03046257-330f2677d7ba810ed527a9a6f5a872b9.npy +02871439-33c1b4d529f6899bd810b14a81e12eca.npy +03691459-d09f0e2e33452a739d3f10ce46ef328c.npy +02958343-87020c25b9166cf11d27be7764701cfe.npy +03636649-1c05f1a7125402ea4c135b40422475eb.npy +03636649-366b8a4c8e38961597910e2efc6028df.npy +04379243-8da6fc70195d2b4029820ac1e8a0acf2.npy +04379243-7ec59be3e55081f788292be2b58381eb.npy +02958343-15a5e859e0de30e2afe1d4530f4c6e24.npy +02876657-add17b35bc4665e6f33a685c2506bbe6.npy +04004475-c88c542028fe83834454439c22a43db6.npy +04256520-e21b95b9dbfcbed28ccbec49bbc083f6.npy +03046257-8a759c2f399d11e01560641bf48464ff.npy +03691459-a3f14846404245d5bbbcb091dd094e5f.npy +02691156-74cbf170c5f2fb587d9c9c8a8ba32919.npy +03325088-7b24ed5898c4971450da8b99982a3057.npy +04530566-4464fb8cf0d04cb732c0857fb4bcf47a.npy +03001627-deb0889d902f08bef51f77a6d7299806.npy +02691156-b5b6f5ed2031f34cec7a415ac918303f.npy +04379243-b00de96484b0275a5cca18918d24f6cd.npy +02933112-97ff4614190d8cdfff05fff9845ac53e.npy +03211117-318d349c03f0926e9b72ce7a99d3dedb.npy +02691156-3ca058682dfe98f7f678b53750b6d181.npy +03467517-2a7bbcd317bf2abc5eec6d8d24f1fde1.npy +04379243-5e1ca9adfe8c6af61f8d8332ee17945a.npy +02958343-9c686d6ec470f280473f10e6caaeca56.npy +04256520-93d5203022d651c831ae8c8ff1eb3d45.npy +02691156-afc975c77f6d5a1bd23d6ce2c840685b.npy +03691459-af4a2a3b3e3510bad49b96b9f2811c7d.npy +03046257-788d32da6b0e8ebdc6df46ed5c17ea84.npy +03928116-18d4bd26fc3946c536244e3d0dd95a13.npy +02691156-12877bdca58ccbea402991f646f01d6c.npy +04379243-1acf7b0939f3eea2eafdf94e5032b200.npy +03001627-7e2ef2a1256f2dc1ebe13e25a6ad0d.npy +02958343-300c1f29d253f94a97e6e890ac2fb198.npy +02691156-1850f4acdfb738bd7456183f198fd1e9.npy +03001627-b8726f4ca171189ca858c901f3d90b5a.npy +03001627-320261e5f3835f6381f667e2a25e0619.npy +03046257-e479a6ba9b2792d59c2f1b6ea824cfc.npy +04090263-f297de88033168facb88c9db6e396994.npy +02691156-ff12c3a1d388b03044eedf822e07b7e4.npy +02933112-46a618f995c1019b15dd7d7985e749c1.npy +02801938-284c23b810fc7823466f97f37dccbde.npy +04379243-be0174f29dba41c19dd07b7af48c9a5.npy +03691459-9c5a473824505151fdd0cc0c1a7bf8f5.npy +04379243-4c809952877b2a0bde88c30a08fbb953.npy +02933112-5ba1fc89122c13c5d4a147733422d301.npy +04379243-cb7ebc943b1b424988386fe1512ed26f.npy +02691156-2c1f66380af03e4c5d1df55cbe0874aa.npy +04256520-8d8d2859338eadc7bd16d4490a10a752.npy +02691156-949acc63ad8f8816e816c75152573ee0.npy +04379243-5d45378d9d2e11ff497df23b9b74f339.npy +04379243-83a8d95b2dcdd3a854cd2a0ea6cb618b.npy +04379243-691caf9e558fa4dec7f671ba289ebd83.npy +04379243-8f29431ef2b28d27bfb1fc5d146cf068.npy +04379243-63ed1dfd7ccdb5be20768660cf080d12.npy +03211117-27e65dc223cc8bc0ec059109909662d2.npy +04379243-b8fbc4e32270751830bbd4cddd04c77b.npy +03991062-bfd7c0ba3d690291271666a0c21c3f2.npy +04379243-6f5813533bb9001dd24546afc5de2582.npy +02876657-289b2ca2562277a9ca3fbd0e4ec160a5.npy +03001627-74d4b9b13cd160e6f51f77a6d7299806.npy +04554684-ccd7d621279425b8d1b2557b80a0d3f0.npy +02933112-6e4407e2b40dac9eda9c49a653a829eb.npy +02828884-69494ba3ad8569aded98cca8f0ccd5f7.npy +02958343-579bc3731a8a25f7c639b4cb04d4d746.npy +03337140-c0e291566ec3e3978aaae3d020f5ddf8.npy +04256520-e16abadfd438100b65569474a61cabc5.npy +03001627-6d270bd691a168f48fa2f6eb9fb1de7c.npy +03001627-a1cbd161f91e80eb450e3da30d6676cd.npy +02691156-1322a9cabb1517219a6e43b878d5b335.npy +04379243-7d9073ffce209233865f763ab6e6778a.npy +04379243-91e7dd99a4c945f9dd03ec353c1af474.npy +03001627-2b783fe4230af5436a7b680929b3b0fb.npy +04379243-bcbc5e30e12a58f07ea323bc74055b8.npy +04256520-de55a935ca4af29649a92ce7de587886.npy +03001627-8dfb550d8fc07ebe490ad276cd2af3a4.npy +04379243-f0990151fa433f1498cfd47a860803c5.npy +03001627-b5877df9f111bb91222f2fee97f8bdcd.npy +03636649-3bd57e05db01e224e7e684d25d4dcaf0.npy +03624134-508b292d7fee30b0cc34b900bb2492e.npy +02933112-bcee1a76f453723c4cc1952ae0d6e81a.npy +04460130-6cd9f0f548979d5160ddc468fe733ed1.npy +03636649-b1e552b454366a9d7787152e5befb05b.npy +04379243-4a310db5ebe11142eaf288f952624966.npy +04256520-cf2e145ae0b8923488df69d6c56c6047.npy +04090263-b28220a981c84b25427e47767269c4b.npy +03325088-935514d63bb8c70e3321831d2245cf06.npy +02691156-226e3f0a844a3b4a77fd7318510b8627.npy +04256520-9c103621101bcf9919fb4103277a6b93.npy +04256520-b33ce45211c0950e3ca067e8715715df.npy +03636649-e062fc06dd5e0e01469ef73f4f6c51df.npy +03001627-4a672cf09d7fdb7c83b06dcdd869d9ac.npy +03211117-28ce23d5e56e9afa8fb952c92850e1dc.npy +02924116-e2d650d6572321281ab9df4be75138d0.npy +03001627-5d5e887b9479de0ea9bdc22a1e02e82.npy +04379243-712d2c844d61aa9cefead98a255f706f.npy +04004475-6a5612fc6e4c19f65afcf0aaed5d73d0.npy +04379243-f7574c55aa4d5c80cba9caf4d254cef0.npy +03001627-17883ea5a837f5731250f48219951972.npy +04379243-307bc4f0db5cb0452f0ebd444c10bd0c.npy +03593526-256b66cbb1bd1c88b2cb9dff9356b165.npy +02691156-41acaa4d19dbdca75ad6eb90e75c835d.npy +03636649-5038edfd2c36fdc1bf1911e2d5611e35.npy +02876657-b2507913d631e8b8bcfad79fc308fa6d.npy +02828884-2fd70e9049377e22d4d8765e3910f617.npy +02992529-86fc58a0c40316f2562c8e1ac545ef78.npy +02691156-3636483aff4b7977b7d7aa9b9ebcccb0.npy +02747177-64b0698f21be2061fc555f910d0519eb.npy +02828884-77323ba74273cfe017b431cae0dd70ed.npy +04554684-58bc4edaefdf3b0e1db42cf774e49bf.npy +03001627-b998016472e9dd7a9b9f2eb77f5e247e.npy +04530566-f5217865935d63c61f2cd7f4ede43a74.npy +02992529-fe34b663c44baf622ad536a59974757f.npy +02691156-2bdf8800514abd05a7d2c4e7aae73d33.npy +02828884-8def49409282ccd4d8d8ba9872cc7fb4.npy +02828884-f2390f9103195622ad5067eac75a07f7.npy +04379243-cc5b638d81529dde3c2e50348f23d3d.npy +02958343-f4da249169898dd915212cd62adf957e.npy +02747177-1532546ac3d8a2cff155d75bbf62b80.npy +04256520-628d837b3c51f539dd97e8e261a01f65.npy +03001627-b2968ca25d2e2fe0f51f77a6d7299806.npy +04379243-1fb2be490f45ec6e19fb4103277a6b93.npy +03001627-70230673214644cc7954eb05bbab463f.npy +04530566-7fbdbc374263bc0e44fe68fe7fbc12cf.npy +04530566-8e7fd92d91a9974a2d220e1baafcedd8.npy +04256520-6d32f20579c9f422843ead12644a79bb.npy +03624134-6566d89cf6d6075c955a1453af41c99.npy +02958343-e67e3e3a21393927df59757e1209f2c7.npy +03001627-1f501c5ed6423e259c89c86daa5af59d.npy +04256520-21e0ce3126c67610c397356311cbeea4.npy +02958343-3d358a98f90e8b4d5b1edf5d4f643136.npy +03001627-f34a4514f72a3a767c11a4098d0a0259.npy +04090263-7864fa7de2295d33e6e039bfb82a52e6.npy +03001627-f1fcbd856669e000118128b8b252e07b.npy +03211117-60e6ee2c3a2aa3fd6d07c55cf995503e.npy +03991062-c4e339d4ce70c55a6ec7369fb34c68f9.npy +02808440-5c77eba7135d8703b362845c6edb57fc.npy +04379243-50fb47768cfdada29f2349486c570dd4.npy +02871439-5c600328b252bf051da287f87237ff38.npy +03211117-e52ef251efe783ab9475cee1777b2299.npy +02691156-366b149545ba4df546ed10e8f7fe336e.npy +04256520-dd375d24e534101b33f2b52ebeafcf18.npy +03211117-38517a97e7eaca1cf801e8fe8a186462.npy +03928116-95440fc9b3fbb5fb1d4127b3f0e05b90.npy +03001627-7f3562432f02b8a897d3ea932731fd42.npy +02958343-cd7feedd6041209131ac5fb37e6c8324.npy +04379243-8ffcdc51a930bc408964093366ba01ab.npy +04379243-1a05bd57d0ea709e7d3ba54b9bdaa55c.npy +03211117-d1b3804c23311181f361255e85d5896f.npy +04256520-1aa509f3d8c1d1e46bc58b7f28700afd.npy +02924116-3805858e0567994041cefd10ce5d6cc0.npy +02808440-617e1aa8b3e05d49bb6226644eb475ad.npy +03211117-1dd3f80712873a638f6095a93258c867.npy +02933112-3297041a1a8de1d3d0f3f1f5f6accdb1.npy +03001627-e2ced471afce616454bfa32aa0766acb.npy +03636649-721baad382f73c46fcb8d8c6d4df8143.npy +04256520-ed90b3d1d41c46a82b09cb731e7a040f.npy +03991062-d6154a1c8df6a464a3b06ba374e12b77.npy +03636649-933176941f95f833fcb8d8c6d4df8143.npy +03467517-887c39981c4cfef661cdd121f4738c70.npy +03001627-a241ab0fe7fbb1f41dea5e6084523ee.npy +03325088-1554a9af8847c2bf14b35a7d7cea7130.npy +04379243-8ad152454e2f1663cd701e9c04d3cf7a.npy +02691156-8ceca54101f96a96d972c9dd75ed77d4.npy +03325088-310875f409f511ecb482922dfbcdcc.npy +02946921-70446b4dc6649d0173c0d206b70af93c.npy +03001627-30d93191cb91f8ece6c5cd45aa112726.npy +04379243-20ca7b1864d7badc75bff8d65bb29152.npy +04256520-33bfb06af948d3415cab680ae8f530b6.npy +04379243-39b90508935f0118dde86ae42c792b26.npy +03001627-c1b64fef5f3efa0a129905ebfd12d5cd.npy +03691459-3636ebcd2e5568616bb15da9e307a14.npy +02691156-9d72d4ac799977bb71d03b466c72ce41.npy +03691459-ab5c8c38528f06daf398d0c5832df00e.npy +02958343-2669bd62546a8c8176ad064d1c5fdd7c.npy +02828884-1b40594ce6fa66ca35028a2641239f56.npy +03001627-58a7b826ed562b7bb0957d845ac33749.npy +03636649-c4dcfcc8c434f13230584014222e685.npy +04379243-5f0c33039269b7a9f0e84b9d9ad447e2.npy +02958343-560cef57d7fc0969b1bb46d2556ba67d.npy +03001627-a85ce69dd5aa852055dbece39a4b7905.npy +02876657-d829ffd1d35f36a61ad51dad4e9c1543.npy +04379243-1dae9ed6781af75f6675521fa630312c.npy +04379243-8770701a1d5cddb9def21b8ee4b159e4.npy +04090263-9fd0c3cd4a6a4afeb8d88853b13ee149.npy +03001627-75d28a98c151cbe678d2ffcbbc0020d.npy +02958343-3870022ab97149605697f65a2d559457.npy +03636649-f2038cb9bb9438a6c790d7efcdfb5239.npy +04401088-19208607cafce17dcb85f279c97d4c5c.npy +03642806-19117e74b575cdca82555f4c45537277.npy +02958343-61f4cd45f477fc7a48a1f672d5ac8560.npy +04530566-cc6656baa69ba0defd40bb12da2df97e.npy +02871439-5a163a048d89f667731124f40d99e6f.npy +04379243-4b1ca7263ad178f8bed8cac5da4f54bb.npy +04330267-917676329f834bed201769e59267569b.npy +04379243-85db937f27544f5f9f23b3819daf3902.npy +02958343-4e201189ae860008bc1bdcb65bf3d926.npy +04379243-f88d344aa47deb52276813f95a6b7283.npy +03211117-5530382ad4ea8b364abfe5850a7ebd07.npy +03001627-309674bdec2d24d7597976c675750537.npy +02942699-a4b0c73d0f12bc75533388d244d29c5c.npy +02933112-e47b9d0905d05d656fa63795f94c4d8c.npy +04090263-9bf95da67ffa58213a653cb492d78488.npy +03211117-792839c9e28f5afe4edf4a0df1fbc500.npy +02958343-923007b377bb1cab473f10e6caaeca56.npy +04530566-410c336c78ce00ebe2f628ca3c07d462.npy +02691156-b8fbf59025f18f1ccf5fcd318778a0ea.npy +04530566-1442afdc0aade741c46814fb26e284d4.npy +04379243-f44c91626e4900a5a26aea0642029fc.npy +02691156-b43165635fa89eb11416125fa4d8926a.npy +02691156-fe266c740580c102ff9ce0c50c2cd25a.npy +04379243-6ab1ece006f03b9c955e5ed03ef3a2f.npy +04379243-af953537017f49351e3178ebc750d175.npy +04401088-23cf8469ffbd93ff8faab772f03eba4b.npy +03467517-1904d163ebaac00722b42f314feaca43.npy +02933112-a5b61e473c6ceef9f51f77a6d7299806.npy +03513137-e3d98ac62469795b20f6e48f6a30cbf.npy +02958343-56d463162ff5352cbd835ce3c63f4d10.npy +02808440-3358fed603caf82bb362845c6edb57fc.npy +02691156-d6ca5966c5ed5b86da2b0f839aba40f9.npy +02933112-a55b6196e3402ba340789cf33f2f1153.npy +03467517-c8010d22e39c2f0c2b996d5d44e09408.npy +04330267-411079245246f35841965be83b7745a.npy +03001627-4b366b7995cd8d7fce4f274577283b16.npy +02691156-db73a3c857949f469a6e43b878d5b335.npy +04004475-c8ddeb1636a1c90ac327bda7ad667fab.npy +04090263-23a91d141cd1cd36a9405d5e0b8196f.npy +04379243-debd11754f993031eef3a45c2f31a227.npy +04401088-ba9f7bd05d6f028fc1a1659eb4f57afc.npy +03001627-d27be0741f13327efc66b92945eed242.npy +02871439-18fe362284ba7ca4d810b14a81e12eca.npy +03636649-77a7d38645738e2212c5719ce6179.npy +04379243-15ec20de98359ec88de7bcb173109d60.npy +03636649-e35009c75fb246453f02f5b8959142cc.npy +03642806-80f23c80d8d050db169ad157eae2079f.npy +02958343-494e45d11299de95c571e4850ce1413.npy +02828884-77597f34b5f37c5e7a403ae58647b271.npy +03046257-9cb8f60044f2f2e014038d588fd1342f.npy +04379243-67b25a96e4a0f49bc41d4e0e25295960.npy +02880940-4227b58665eadcefc0dc3ed657ab97f0.npy +02691156-63c63aed97f15526bbf3143b1cb6076a.npy +04379243-fadf4f0b608be6272648eaf710bc2c44.npy +03001627-cadf69f5353039e8593ebeeedbff73b.npy +02808440-4aef9fc6633010a927b4493ee0c4db3f.npy +03001627-487040c5fdc68fdfe6cfc789522bfbab.npy +04379243-9dcda566c3265d2784868d3618d73011.npy +02818832-a6635de3c4a0e934b822d48a43773c62.npy +03467517-95b6d674bd840b674817b69d2797a90d.npy +03001627-583deb9e5cf939a9daeb838d0771f3b5.npy +03991062-f47da3a419cdf600e01d7dc978602402.npy +04379243-8ce70dead5119191cc3492a06e9bd850.npy +04256520-ad5ef1b493028c0bd810b14a81e12eca.npy +04379243-aa6cfcdad80f0ea961e8d86dc5569c02.npy +04256520-bd088259c8ee711c3a4642fe4c259750.npy +02924116-1dea3af9695415f71f6a5b0146bf3030.npy +02691156-557429a274a21e1e6a257cd6bc529741.npy +04379243-97779400c9a7a15e3c7dffee9c6890af.npy +02828884-c0840a82cd05765c924bf081da6f024c.npy +03467517-fcab134da044e5fc77f469126771fc30.npy +03325088-bb428566c6138a876c18e71fd49c4dc.npy +02691156-2c97e6b2c92913cac1ccec171a275967.npy +02691156-a04d10b24ede5e9a3de778e85611513b.npy +03001627-c29f439d92c7ae8d6d26324fae5ec3af.npy +03642806-b3a2081fc19c7bbac241f229aa037cc2.npy +04530566-9fe579f5bc52735cdef1530f49dfe050.npy +02691156-b702e35f4a59e81f64801ad2940cdd5.npy +03691459-ca052c8db0c94fd345189af3887d3c51.npy +02933112-c28ae120a2d2829e50e9662c8e47fff.npy +03636649-9b579915b883bea042a65b86449bc7bf.npy +03636649-1fa4508dad05235a7d3aa3bae1f7b494.npy +04256520-c2a8f4c920b6f7c24097c269bc92f53.npy +04401088-8da5c29d14a1003d23247d005da93d43.npy +04090263-4c5a984272a922ef94a57adad86ebb52.npy +04379243-aabcb5d610e76ff19ca02c396af0c503.npy +04379243-29ec54b06d35acb2027cee422df2aa3.npy +03761084-b6f8be7f5c4a97424a44340bf227e40.npy +03211117-810fac004670692fe9d7a3dffbf25100.npy +03001627-2d711c85c60a0785c3bd24f986301745.npy +03001627-67017c046fee2900d09b414c3d8c49bc.npy +02880940-b5d1f064841b476dba5342d638d0c267.npy +04379243-6a8df7fe3bed16f736ac40071701c687.npy +04256520-f4830a8e2ba2c531b18ea2be5fef7826.npy +02691156-62fe06fd4f1b390fa9bcc7eaa4032fa4.npy +02828884-2fe40aafbefd99a9d2b12aa6a0f050b3.npy +02828884-87783e267a4db70044a8a9dc66c6c095.npy +03046257-fb95a457d7382fd5902df966e52b1aca.npy +04379243-ce4e075487aa05ecdcfcef693e7ec696.npy +04530566-4d95b6e392c9d95981e1e9063401fa72.npy +03001627-a97e09489b46f7492933f312813ce997.npy +02958343-30c86c4764df9f795686045783681fbc.npy +03001627-68b26c9353e65419c3e46f55b34610cf.npy +04379243-dd0521f27114171e492d9da2668ec34c.npy +02691156-172e23ab5b4d189566cf1b4a8fc3914e.npy +04256520-21140988a7602153f05a611b5fe35f32.npy +03691459-8150d4e919381c64e1ecc02d6acf021b.npy +02958343-dcdee01d7fe6e1a76ad064d1c5fdd7c.npy +03691459-c8a343f35b8593981ce8823e87f4a7fd.npy +02924116-32fd2bc978defda79aa320f2e657a09e.npy +04090263-5d461974aa75e99fd88db40a5e607f21.npy +03691459-8a536e4254674fbb73e1b2d018c0512.npy +04379243-f7fea253245d97786c02d42bfa6c5667.npy +04379243-a15f31e2302f6ae5d67a73ffd62ba73f.npy +02691156-15ce56898a636466afc526de59117398.npy +02691156-7fce28d597b3137cf24f8f5f80968450.npy +02691156-f6373cc88634e8ddaf781741e31f0df4.npy +03642806-7766bddc0cc89e4234b8b727387e0b56.npy +04379243-1c1f65cac6bbd1e15dd7d7985e749c1.npy +03001627-7f647aa4750640fdaf192dd05d69c7a2.npy +03001627-6d4ce042f204e89db413bc67c6e4035a.npy +03325088-5ba4d7ff5de1e727c36fb70296e45483.npy +03325088-d8baf610ba6cc3cf3321831d2245cf06.npy +04379243-72bd77bd74cce09cbc6a236746230424.npy +03636649-433c55dc486ff83398b2240479533a01.npy +03636649-bad7893ac164cc44a43934c3f4e340d5.npy +03001627-183974726abab0454aa6191ddaf4b676.npy +04379243-55457cc3f0e7d0e06bcd32c43682e841.npy +04225987-a34d794cd11272512cba79096b49c1aa.npy +04256520-e78c23ab7426227b4b3c42e318f3affc.npy +03001627-3eb60e6679d1df1dde7eedbb2790491b.npy +02958343-768ea3241699f663f1cb19f636b1c2bd.npy +04530566-e0d1f833e8dc5c604947b319a9e09fd.npy +02747177-45d8951ac1dbf2cbf51f77a6d7299806.npy +02691156-56bb8130f49b481e230ac8907b9b7f90.npy +03467517-bd6057c7ac1ef31193f0194265a9746c.npy +04256520-317850f9c80cafb561bfbba8a5defb02.npy +04256520-e4ca81487385c5f490ad276cd2af3a4.npy +03001627-4b1e09314ecc02d53c8d0fdfb1cc2535.npy +03691459-fc6066741f5b60e5280e0c1e89a63998.npy +03991062-29a8f4b92a1702f6ba14bfd91a75020.npy +02691156-2cc1ff07bcb27de4f64801ad2940cdd5.npy +04256520-a7bab06221eb932e79c251b4a7838829.npy +03001627-58b1c10a6e1d67b3b0cf2e642b746bfb.npy +03001627-ffa6c1a509986a5676708f8dec712a28.npy +03691459-83cdedb3431e8d8a41c95631f0cd177d.npy +02691156-3fc5fb97d23b6bf111f78b196c636566.npy +04379243-8b2c3c73b624c3faf4b35f4029eb1ecf.npy +03642806-5b5247b13d5b21bdad2954b86711abbd.npy +02818832-20b7fd7affe7ef07c370aa5e215a8f19.npy +02691156-9e30fc9f2d9ae56e3ec83bd6bef75c92.npy +04090263-420822a543c50b05230a4d129580843a.npy +04090263-c755cce8095ceaff4b49cd65dfcc3a9a.npy +02942699-b27815a2bde54ad3ab3dfa44f5fab01.npy +02958343-15c785a7505992c3a9be8fd09fb14f4f.npy +03467517-ad6cab75780f3f10d57700c05b1862d8.npy +03001627-a66d78cbf3603e8bba9df3ea0397b1a6.npy +03001627-c97b5b80a24030ae70e99aac955544a0.npy +04401088-6ff995a8e9faa6e83e43be0b542efff8.npy +02691156-76f949c39923b0778f297017462c6cb0.npy +04379243-6365205d2324234fc8a1efeb4b91d393.npy +03624134-435cd82d4017a783dccb54aff8e9710f.npy +02958343-23e7ae83601f893b575116d39d0ffbba.npy +03636649-f56600b8cb2f94d64d8b0368afacc65.npy +04256520-557d878e747fa35db161f36d4e309050.npy +03001627-72669be1815b2bb81e4fe86c4ad3ec90.npy +03593526-f2cb6d5160ad3850ccc0a0f55f0bc5c2.npy +04530566-7abde2cf79febf6efe4db18443aaee4d.npy +02691156-fb62efc64c58d1e5e0d07a8ce78b9182.npy +02924116-4f9ace193131b8e34ac4f8ff2084698.npy +02992529-35a0dc407f3df8d27450656ae41f00c0.npy +03593526-9669911986797a4584d1421a33bba279.npy +02828884-447ad1f23f96171f8d9b3c3ef984857e.npy +03001627-def8af022dceee892acbf58c0b138e50.npy +02818832-4dbd37cb85686dea674ce64e4bf77aec.npy +03001627-fc5f813d499cfd84d540c52e6ddbbebc.npy +03928116-1d139c80e904584b4243f79fcf368f62.npy +03691459-95c24657d2ac0469a3cd3bc808c81de5.npy +03001627-e92063f7bf538df17eb00a494c61433f.npy +04256520-4fcaa3e642e153f3450621b513a975bb.npy +03928116-cddea83b86dde871205444155ae5c84d.npy +03001627-a0e9606288d3ac22b61d9ed7bbbb5b3f.npy +03790512-ba9a5f13dcd8312f543a79ca976efea2.npy +02871439-3ba1563f381785bc6739a7caa0c577bd.npy +03710193-81f30bae0a1474fff601d2ded3aef05a.npy +04379243-b4015b8800115683b3f10885d03d0fb6.npy +02828884-23672bcfaa06a86764ab399dbd3ef465.npy +02958343-7000274ad11a419715ed2279a90f8f38.npy +03001627-a13fa904e05d60f176e9713f57a5fcb6.npy +04379243-e608701de43f3edcc0f947750540fb22.npy +02691156-912219c657177b17774a720fca15e35b.npy +04379243-683ddfb4cf9c8f2883f21c04f5e0acd2.npy +03046257-9e1e652f6477ecc87b9aa4fb5234ab40.npy +04256520-5a95984eaab1d85dfebad4f49b26ec52.npy +04090263-481372303918c2b22c12168d5291219c.npy +02747177-9ea0965fc34131ba7b104108655459df.npy +02691156-5e29fd83e0494cd815796a932d10290d.npy +04530566-f269ef3a1c758432e8d6be23f236225a.npy +02691156-bf5d59729b0c0e336cec6e2299cb4a76.npy +04256520-4fa4da6b966578cbe78a749ef6aadd72.npy +02691156-7317dec9c1cd67a815ce9e432a3a77b8.npy +02828884-2edc5c32e3ca7242aa6d4fa3e14dc1ab.npy +02691156-b3a59a941500e76535592b447835a16e.npy +04090263-5605d839bc4fee8d51b9e8cbda863b2.npy +03636649-b15485a55d855bf980936c51aa7ffcf5.npy +04379243-77f54df25e2d1bf99a1735fdc80135be.npy +03593526-c072c3656e9022977af7743c26a5495d.npy +03593526-49943fa341bd0fc86bc258c0f0234be0.npy +03691459-60d58e77382f081a69d22ff82177f51b.npy +02958343-d6e27c6523a3f2b58b8cd97e9d1c6a86.npy +04401088-6e183cdeba6b83b3805062aaa3bb7665.npy +02933112-77d1cf70e480af7e6a400d4015c42de.npy +03991062-9307ad32b595cd82cb2a965e75be701c.npy +03467517-9fb36e3b793183268853b066b4c501fc.npy +02828884-98af453dfb3b2284cb2a965e75be701c.npy +02958343-b8de49dd963c0669afe1d4530f4c6e24.npy +04379243-e79b8e7272ea19ca2112c05ea370d321.npy +02828884-81df1fcd6e2eec15f231d3622caa1150.npy +03001627-ec41d22862df4aa7eca29403b7226aa1.npy +02958343-625861912ac0d62651a95aaa6caba1d3.npy +03991062-415cae243e110f5cf155d75bbf62b80.npy +03325088-af09dbd4880d1fc8b362845c6edb57fc.npy +02933112-1b3d4f2291545e472dc6c96daf8fd5ea.npy +04530566-d0aa1202f01227f7b9528bf167ff877e.npy +04379243-9c2fb771ec6073b37ff6ace05b36a5.npy +04090263-7d7a915cefca95471db44ede0efdfd5d.npy +03046257-ae8042e2ded0cf01b17743c18fb63dc.npy +03636649-d42435906e79e4131de8e551fc6cf2b0.npy +03691459-570321d63f5fcb9391666edbc97a985a.npy +03001627-124117cdec71699850c2ec40da48fd9d.npy +02933112-8589e65944de365351c41225db8e334.npy +03325088-c1c670ecd6f00497c4cbb2ffd574f216.npy +03636649-574e0de3cea53dd472b623d6378b1581.npy +02691156-c54ca35ef1df558850ea677bbfebf3fb.npy +03636649-390bc0018f132788fcb8d8c6d4df8143.npy +04379243-f97cf997df0945fa1e09e4a1b10c649e.npy +03593526-d278b42591a08a1555f46d55537192b6.npy +04090263-e32501e54d05abf4f1b2b421ee7abb94.npy +04090263-c4eff07f05998965c79f92df566f8c6b.npy +02828884-10cfa696ba2259ccbbba142d6df53ce.npy +02958343-662cd6478fa3dd482d7d789814cae761.npy +03928116-c327cc501312d1bab9492d4f3d8bee7c.npy +03991062-38ea4739b92f125c81a172d69c52a28a.npy +03001627-3af90da238ac4ddbf91663a74ccd2338.npy +02808440-e78f7e89878402513af30a3946d92feb.npy +03001627-97b3a1b718278c09bababe11fcea8796.npy +04379243-802287d31c1f5c5ba4ee05a5737b7178.npy +03467517-52ecf1d8e279c1bb1f8d5edb17ddb332.npy +03636649-ec782fd2f4825158f24dd57a3f1f3b51.npy +03691459-cefdbfba01e3128920363e2561dd589a.npy +03046257-a67f72b0df7d9574b3c42e318f3affc.npy +03001627-d3a958aa302f198b938da3ea2c9e0e4f.npy +03624134-b80c5d63962c04b41395331ebe4786cd.npy +02876657-99d595bf3ac08bace13f76b539e1d69a.npy +03325088-fbe2cc8e19ad7a13b362845c6edb57fc.npy +03046257-e92cdca0cd98e908c3795daea94ab3a9.npy +04379243-339f5b3610ea836682f29b648e624c33.npy +03593526-2ff5347d6ee079855337cdc4b758988c.npy +02958343-36bc228a8722bf27473f10e6caaeca56.npy +03001627-c47e364fbc29803b2c0eb4a518e123ac.npy +02958343-7b2ad420c7829e881cae32f43c09c982.npy +03691459-4ded23cf84c993e9df3c63f2cd487888.npy +03001627-329c2234d134dc89492d9da2668ec34c.npy +02924116-557073f60379b9c852470de2774d6099.npy +04090263-b8828cd2b6bba8989091900cc7eb1968.npy +04530566-234541314abebbd02783b84b5d2d6e46.npy +04379243-6a8f125c174c07a57b11ae648ea92233.npy +03001627-8ab6783b1dfbf3a8a5d9ad16964840ab.npy +04379243-e59fa20a6988b93e29e4b5aa807bb4e7.npy +04090263-7eb5fbc480326d64f02ee453ff283e26.npy +02828884-eb038519c5ba87b663b2acb037dfbcde.npy +04090263-36083138334c7981d735fa1ab17311ec.npy +04468005-ee396a4a5fac385f1183ae1f57465c4f.npy +03636649-636d72f06ebabbdf9e8cd846ef13776.npy +04256520-1f438263a82a1b8919fb4103277a6b93.npy +04090263-357f37fd725c0fc116814c0baffb6c9c.npy +04090263-b942751009dacded735fa1ab17311ec.npy +03928116-df61cf8ba982c0f29a9d23378ae33f35.npy +04090263-b20d634c826cacc3b1ba4c891c81b80a.npy +03636649-47a7bbd995c37d3d4aeb986669a16017.npy +02747177-5a947a76bf8f29035b17dbcbc75d58df.npy +03001627-3981642f57a689276ef2faffa907bc32.npy +04379243-d582887570d2c1c2d7e17ccda34f6b0c.npy +02933112-e18f47b52ff3aa2452174f43a416bc6f.npy +02933112-2b9b2ece245dffbaaa11adad6b2a69c.npy +04379243-dd2c3ff28a34556a47839bae1bc65257.npy +02924116-3553a35ebb586c10550f48125b5f584e.npy +02958343-ec0555ccba700387b45e6d6d9af21f30.npy +02992529-5a65ef748eb3a3d1ec475b573e4d1a38.npy +04256520-d50233ec66ac6ee2b70eac6546e93fd.npy +02958343-63f9acc425dba89d68c45fd057f7db12.npy +03001627-1cf77ee00faa6de7fa6450cce25dc4cb.npy +04090263-48bddbcdd626298540385522d1beeb20.npy +03001627-89208a619341d9fdb8c516ed5c4ce32.npy +04256520-74490c45305da48a2b3e9b6eb52d35df.npy +03636649-3b15a4be5e248d114cc30865d6337b9c.npy +03001627-ff9915c51ece4848cfc689934e433906.npy +02958343-b70d970f8020c25dd141480e2c154d3.npy +04530566-9c2c87ceba2a465f86b234e3f0128df2.npy +04379243-506ad995cecb082f54e1b6f41fdd78a.npy +04256520-7b9f151735391e7a14513156cf2b8d0d.npy +03991062-ed1d39c6592739f72652f4081ec5a77.npy +04379243-f7c25526cd3740cb52e2d18963a75b4d.npy +03211117-dfde382270f1d69a28010a96423245ae.npy +04379243-57364a6bcfdd730f166ddaef2c2c61ae.npy +04460130-e5819354e7ddc4a2545370dbbc80d144.npy +04256520-bfd337ddffdd91b4190a91fd9a6f7d55.npy +03001627-544aeccfe77f230a1cf10a36e3d0884.npy +03797390-4815b8a6406494662a96924bce6ef687.npy +04256520-146ad9d78f06f1f0b246c4171f2c393b.npy +03001627-59704fd0f662d7b4da986730050de1e8.npy +02691156-7bdf4816b61c0e1748766ee3c52f8ba4.npy +02808440-7ecbb98e2bb428c85721e2cc9a13e7cc.npy +04379243-bee3ff1926f3068cf09df371fae9d63d.npy +04090263-e8a019a32c42bca7bc6e84bc30e573cd.npy +02691156-68303a007a6c8ab02d6ff44f79e93a89.npy +04401088-69b74f6c66dc2adf5a627be422951096.npy +02691156-c5d748c352d8eeeb3d4e343a1ac21b93.npy +04090263-bb1dff989d7b563124fcd7bb489fc827.npy +04530566-e3a49772e431fa6a4911559f9f073abb.npy +02691156-2cf6583a74dc4d1e373ed874fe97420b.npy +02958343-b8599e22b152b96e55e3ad998a1ecb4.npy +03948459-36af281561491d77ea768093544ea6d8.npy +02958343-83731bad1b7d6ec531fde3a1e19a4940.npy +04379243-a6c192247329a32e6a19b0779ac03754.npy +04379243-40afcc31186c0b452d19175e7d19b7cb.npy +03691459-8d7d7dbf8f0c0f7673e1b2d018c0512.npy +02691156-420f3bb771e8e75ed878249aca2571f.npy +03642806-b5f6fd84a3f44ddb1aa47689117a61e1.npy +03636649-90c323c4d6288aaabb40b038e5e0b7f0.npy +02871439-29b66fc9db2f1558e0e89fd83955713c.npy +03636649-1b957f2c258ed744b3c42e318f3affc.npy +03001627-30beaf15d2d2beb1febad4f49b26ec52.npy +02691156-2e0c7d77c0b74e87c1ccec171a275967.npy +02691156-c1fd4eb9f911851f4352ea917328a5b.npy +02958343-f3dc4ff3cecb4eaf8ee29572addd5275.npy +02924116-5bb2d2fdaaecc6d2542f64e03384ee7b.npy +02828884-2af98dcf936576b155f28299c0ff52b7.npy +03636649-e1916a904163748e8cc413950b617e8f.npy +02801938-b02c92fb423f3251a6a37f69f7f8f4c7.npy +02871439-fe025a756926fd9620192a5319e3e2e4.npy +02958343-f850f5ddc42bdc3a117db354abf0d721.npy +04379243-da0badcc10ee1a4aea966ed2fa6fd5c0.npy +04530566-e364eac9ec762c54de203ef6842ee61.npy +04379243-da84e4621c255691490ad276cd2af3a4.npy +02828884-32bd91d61ad0824e2729c156998d6717.npy +03467517-78704c7d77e34b803283ea69e022bdc8.npy +04256520-72252b1486f22ce3490e0c0c00192ce3.npy +02808440-19e3356bdc1600e48356c7b0827e2e54.npy +03001627-31e59dcaa15f2599a52abcb0c06a3598.npy +03046257-24841121c7d090d72d2d2896f4b277fc.npy +04554684-677a00ae2e3f7a2145ca70e41d71c65d.npy +04090263-242a543a598c3d7a657e1a784010b9cf.npy +03211117-2fc578c8daf35023ef641b9022b66b97.npy +04256520-7527c6db4e52d511db01c957364e77d0.npy +02691156-7e1d4583f70c8583431589819e5ca60c.npy +03593526-ae81dc3d42c59e8c500158c23c4c5a8e.npy +03211117-ed9c1a4011d870c258d40d577ba17fc6.npy +03636649-eedd40c0191a90a5cbde89e0c48a01bf.npy +02691156-f96426f2392abb1d8d58389384d9812e.npy +02691156-19fc1b9ff4b6456f1232236eecec447b.npy +04379243-70f1b5f74faa9bda664b3b9b23ddfcbc.npy +02691156-8855c5531c093275146f724acb952fba.npy +04379243-3b3b35ab4412c3263edd525d249a1362.npy +03691459-8705c20e8dec94539b0037ed0d57b3ef.npy +03928116-c43e1a3537d56f439a957a60b2bcc479.npy +04256520-df7cced6f0e5e65c26e55d59015dabc6.npy +04379243-1096b4a30bd7717c4733824eae5cd9ae.npy +04530566-35960e065788a31b123c06ea72522927.npy +02818832-4abe567bf6f1e2eee213bbda0587ff6e.npy +04379243-19c0e93cdca6433fb8d33c22fd35264c.npy +03001627-b967ac98b1cbd8fe36a7a71199dc2cb3.npy +02691156-1914552110aa5a61c1006ed55bc1a3fc.npy +03001627-d10ed00430a61909793b1150bb246dc0.npy +04379243-cde43e92674a66f46f3f02fb4d0927eb.npy +03928116-d2eb696f6bf5569ee6abebbc3abab4cb.npy +02828884-8c387d5e8ca71237d2b12aa6a0f050b3.npy +04379243-d20e0f359f37f7f5648b060eabbed82f.npy +03593526-2872c4b8e2f86201b7d0f3d89bbac230.npy +02747177-c0951455fe667165599c7cf847d431a7.npy +02933112-7b98e7b25bb83413c59350d819542ec7.npy +04379243-5a2f605200b4e4d5eb6d17f913d54c76.npy +04256520-c029d82ea1d3af4e19fb4103277a6b93.npy +04530566-beacf34e9b0c0597894b951d14f8e56.npy +02828884-ecef040a94ab9e59928f4521e8b299ce.npy +04256520-e3f5405a4843343e91fa1c643766450d.npy +04379243-4c5ac5335e50ba35b385698e6487d3bb.npy +04379243-14c66bb1292a764f7e7c9f487eee4fdb.npy +04379243-6a56d0f447d477e12de0bc4fc4d02dd6.npy +03001627-c400749eaa4d10871a782a4379556c7.npy +03001627-3ebb8f29a7c44776f51f77a6d7299806.npy +03636649-833baf068fb6225c99570bac758be6a4.npy +02992529-a56fa90572f9e23db30cf593b4a23b0d.npy +02958343-d7a09b2936b3d3e7e97c6bb243ef67d.npy +02933112-1a51237c9515ad0a4da5feafe6f1c8fc.npy +02958343-704e60e6e5be85e1f500cc506a763c18.npy +03001627-3d04cb63d2b1873fcf0dfe1797286ae.npy +02691156-9469590435736800b87697d3904b168b.npy +04330267-510d5da107f80051e1d0950dd1aa903d.npy +03085013-72d9a4452f6d58b5a0eb5a85db887292.npy +02958343-eb5f04670263d8bd075955b404dedb5.npy +03001627-96fb86091881d54724894811dd3e6d32.npy +02958343-db1e6a78a84615b83c9d2d3d4dc0edb0.npy +03001627-1986eeb9bb594bf9a6d7a9f3c5f7bb41.npy +04256520-294afbd7a0e90ba9490ad276cd2af3a4.npy +03001627-7f2f8dd929421cd130e6a28391d443c5.npy +03691459-96a3c3653c343db6ba8a1820ecdbe891.npy +03636649-32bf66766c1f33983466f97f37dccbde.npy +02958343-5d0e79c02907bb8f5cde8c99e4b182f9.npy +04379243-384bf53e12744e2019fb4103277a6b93.npy +02924116-550dd89fd258d839f01129d246a5d1a5.npy +04530566-a85ef79371cb1edb52fd6b83c5929135.npy +02691156-e3f68fbd5d1629e238976998fb731b88.npy +04379243-857ae7eeae1508e9b0957d845ac33749.npy +03636649-22a0864cef495771fcb8d8c6d4df8143.npy +02992529-bf0f0ba650108d03cf144715a1bb5595.npy +03325088-9a4a7de766558e343321831d2245cf06.npy +04090263-3c33a0754d1c6a71b9a4a5375572bf62.npy +03467517-cb99963122f01a92e8bcbdd9e5145d74.npy +03001627-80c1f7ee486e7b5aa61649b05d63e9bb.npy +02958343-3093f587c5660c7a473f10e6caaeca56.npy +03325088-3d9c646e912c7723af0b75abe6dfe88a.npy +02691156-2d4a57a467307d675e9e2656aff7dd5b.npy +04256520-173d2bf95fb2e6353a9b2e04441ce376.npy +02958343-cb5fd4e2c29b9193a134736201a79843.npy +03001627-547ad86927566ed0f9111ef49c078dbe.npy +03211117-ffd0fd5aa21b9c8fb441e189e5a85c02.npy +04379243-d455b490f08607a57c6de7e52b00ebab.npy +04379243-c667df83b0e77f96770db120e736ddf.npy +03636649-d5480fd1d05e8962d42b9650f19dd425.npy +04460130-7344d6188932b2de72f6aef300d24d64.npy +04090263-e0c6be7a5b560f3af13eed41b64dddca.npy +02992529-2cbfb354e5dd731dfd6c7e3f0d9c56c1.npy +04379243-97b3dfb3af4487b2b7d2794d2db4b0e7.npy +03636649-14c84c76c927fb282cd2160e449d45ae.npy +04530566-7b7847ccb4f15fa9b1bb46d2556ba67d.npy +04530566-943567584893fd5218591932caa46ff6.npy +03001627-d283b1073ceae03f35836c728d324152.npy +02691156-f62ad267cdd1a00a34b1f3550986bd42.npy +03001627-9a8e84b82ca17e3f2f21cf17406f1f25.npy +04074963-a67e5a678c54d757db8fa1712f9ee93.npy +03691459-67e18c3be264e30b636095aedba53117.npy +03467517-238f738a7012b713e909a939d5488b76.npy +02691156-5c72cc06d79edd1cbbf3143b1cb6076a.npy +04256520-87ab409c03acea4af994e2a430ba61bf.npy +03513137-aa51f885208208375094ac652b5174eb.npy +03928116-8b533074327be24b776ccba7ee1e3e9e.npy +04530566-ca2e4bd483c006a5c9f3294669fff77d.npy +03001627-8cc42bd1f681f126d0176f9a144100cd.npy +04090263-4acda16abeddc1a24d0af51460733e47.npy +02828884-564474f25a4400c5dc20930e6fc85682.npy +02933112-63465f2647384da7cf44224546cb0306.npy +04379243-c900e6f4dfefafbae06f10e4878a855d.npy +02828884-9ef2f740d6dc7cec8d01d636ec229b2.npy +02924116-c479358dcb0168909df4e878bc750cac.npy +03948459-9a1208d777d287bbaf2c6c19cc41708a.npy +02933112-433b0fe363861867b25e7c54df7809b7.npy +02933112-cd3c926cf4ae4564a80ff03f6dc10926.npy +03207941-53ad4a901e8b0dd9121859336e292a5d.npy +04256520-1e71489bb315efa0eea222b336f100f0.npy +02828884-2cb61abc0c2663ae8f0add668496d7a1.npy +04256520-f76d50f900b034af19fb4103277a6b93.npy +03691459-9de56b4a4a9eb3a4cd4e2b9cb7f670fc.npy +04256520-63d67bb924a00203fff16555386d173d.npy +02958343-a6842a04cef3e5ce69a949ac99a843c4.npy +03691459-394302e20816d0fa07828ee23920679.npy +04401088-3bd6626a05b4f79bcf17364e7927abd.npy +02828884-4be9494c9b476dbbd201085e80edb26a.npy +04256520-41c838f99b46093fdb5f60e9c5fe6c8e.npy +03928116-d3a9b80fd68429d7f2dfae6f0c6544.npy +03636649-bf4b1a3597373ac0664b3b9b23ddfcbc.npy +04401088-2266b891f080ad7eeb2a3da43bd37462.npy +03001627-d30ecbe6cbe364e5c8687ff9b0b4e4ac.npy +03001627-c80c0b8107583898c1956375af82917f.npy +04530566-7e0d128b6c8ce8b59e5ca238b1551011.npy +03001627-2c6fa3007e79013cc3cf9ae716575390.npy +04379243-8c10cd9e5b4d589299ef6b0e70be718.npy +02691156-647e76622faa22b626b85a24a73a298a.npy +02691156-23c8d6c73cf78ab23cf128905a10d59d.npy +04004475-41e1eca9857f0ed1f7cd74b993fa73e3.npy +04256520-ee57ae3e04b1930aa6bb70ffc9e4e52.npy +02958343-413fcc9afd53136a16abce8cb03e7794.npy +04379243-e428b7d6634444a910bed4209a0dd8ed.npy +03001627-4602fbcc465603882aca5d156344f8d3.npy +02747177-2ac7a4d88dfedcfef155d75bbf62b80.npy +03337140-149a105979cad722c1467c54b9e09ce5.npy +04379243-f78e16c1dbc4dbd31349824369d952b3.npy +04379243-b5529f6f5679d705c8b2ff62b26cb42.npy +02933112-adb7c7229f4871c2c59350d819542ec7.npy +02828884-9920a0a8393494c59ec4bb690ca24962.npy +03642806-a4b410734514306ac401e233323032d6.npy +03691459-8d698e60c436d75cf398d0c5832df00e.npy +03001627-b7e01301bb1eef41f92f3e7bff4c4ab0.npy +02876657-e824b049f16b29f19ab27ff78a8ea481.npy +02773838-f5108ede5ca11f041f6736765dee4fa9.npy +03467517-ff3b5763b3dedda3241d076ab53023c1.npy +04379243-b23b29f4b08cb2e7b65b71636c46ae49.npy +02954340-d7de36db04c61722a52821bf1aa3b19a.npy +03001627-beccd4a6031f6a5a3eaabea23fed5ec2.npy +02958343-e9bccdd7a52f13329b3f352e6fa9112e.npy +04379243-f26d68c69a06b95ac440f8a1412258d1.npy +04530566-a668bb9ccffe8cb627ca60ff81c74bf5.npy +03001627-3334213d3f378a7eacac9cf65380267d.npy +02828884-327dcb9a47911686815bd25a546c8489.npy +02876657-7d41c6018862dc419d231837a704886d.npy +02691156-aafb38ca8d8f27de350ef9fb5390c42a.npy +02808440-f88e093eff5adc09ccd0340812259a39.npy +03001627-7348ec0e16e99fe1ad484915511ccff6.npy +03636649-ef4478daba21f2d49244b68aadec703.npy +02691156-ce682d7a2bbf77b6fc4b92d3d335214a.npy +02924116-8ae47b15b7cdbb4ad4bb8b9a2c4a2dc7.npy +03636649-a16fe5e25c99ee73172986dc05e3b9d1.npy +03001627-276932e7bf229d37c8ad93869b52d215.npy +03991062-c63b1b8785020e1e340ded9bd2d6948f.npy +03948459-506a25c906db09ca1bd872e105bb611f.npy +03001627-d8e2e2a923b372731cf97e154cc62f43.npy +04530566-47ab7cf5568066fc86f968b3508ebacf.npy +03593526-6d652a95363bb682b692b490d9871ff1.npy +03001627-7948f2715d32c813fd60059ad8523f1a.npy +04379243-c356393b27c3fbca34ee3fb22432c207.npy +02924116-f518e29070ab89c541cefd10ce5d6cc0.npy +04074963-226078581cd4efd755c5278938766a05.npy +03467517-4e4d180e78d8b52a93f0194265a9746c.npy +04256520-ef511c56878424e4a6380f3fc7269ff.npy +02958343-287f4c8f87099957473f10e6caaeca56.npy +04379243-e3ade6122be60b39742cd3471ca7caf4.npy +04379243-7acabc265397e604593ebeeedbff73b.npy +04256520-debcadc4067158674ab1b242068f86fb.npy +02691156-4031ee8a4631762c9566f663623859aa.npy +02933112-8382308b895aa93286d53ab0fe94e911.npy +02958343-2f13fc44e7e06816a134736201a79843.npy +04530566-d262a9cfdeca256e228ca1071b304db.npy +04090263-5eaad35703c992f71092539e96a339ed.npy +02828884-31af3758c10b5b1274f1cdda9579594c.npy +02691156-f186d2998485c6ed5e9e2656aff7dd5b.npy +02933112-1074bdcb3c2032fe0f3f8b6e1796773.npy +02808440-df67f38c55e4dd0b3321831d2245cf06.npy +03991062-7a971531ff72a48d5706d1c54190f27a.npy +04379243-10f0753ae756fe489c0c9824ccd078be.npy +03624134-da94bafd8b3ea6a6a6e0c365eca0e86d.npy +03001627-31f34cbd9385944181faebbdea6bd9be.npy +03790512-59a2f0fd2b81bb273b6d7f17f2b61d2d.npy +03001627-7e298a6653f0febd1f30b807ae39b61d.npy +03691459-4c68944b2b8105d11a2f7b80918eee9d.npy +03001627-f69b87648aa2c6f52ef787234c3ff353.npy +02808440-868517dfb1753d901d91d3160643d7d9.npy +04530566-8d53d8f4cacbff77853339423b00f029.npy +03001627-3ce9a0301f36ecf4cb32c5fb502d0e18.npy +03337140-b35f8b3cf70ec503bb31aa2e1985084.npy +03710193-19c6003e0b37b66675b7cfd132afcda6.npy +03211117-2d0138ffe3eb25b9e23244d89a2e66d6.npy +04379243-462c1b0c6f14f168c3bd24f986301745.npy +03001627-8bce3b7b7f0f48ad28a1548e344f0e2e.npy +04379243-3c9a23693b76e2f8acb16624e184454c.npy +04379243-5bccf52849ce93b5f4d0ace72e0fac85.npy +02691156-8938ab05c9dd830cb422638f4c34a0ac.npy +03797390-b98fa11a567f644344b25d683fe71de.npy +04256520-188505b2fc90ffad780bc2708a85ba9a.npy +04256520-2b73510e4eb3d8ca87b66c61c1f7b8e4.npy +03797390-127944b6dabee1c9e20e92c5b8147e4a.npy +03001627-680b3add007725792feb9fdea8e07927.npy +04379243-15676a89e39262ea852bb95bccedfda9.npy +02958343-7a12f058a0474559a7fd25564c2e888e.npy +04256520-8112da888f66bbf3c1a52e5a697bb944.npy +04401088-db1f83761a7a19f6d0c7ebb68662b4e5.npy +02958343-a2d1b78e03f3cc39d1e95557cb698cdf.npy +02691156-e8bd07a978ac82baef40e4c1c2686cd3.npy +03938244-80326c3f2dff14412257a9702919f3a.npy +03001627-534c5f9ea1ae94b54644491844ed9566.npy +02958343-9648aaf755e6556e2a9eb0f146e94477.npy +04379243-91530c95f442dd71793b6229a2639a1c.npy +02958343-ca24e69261dadc94a9fe1734a6086750.npy +04460130-15cc3d9020384e8d6e09a8e31c7575c5.npy +03636649-b37e07ac31fa4f311735ea0e092a805a.npy +02933112-aa1077aff8bd9e44d8f27b2e727c3511.npy +02691156-54c13e95f07492a9e10e757961deca98.npy +02933112-648bdbefbe72c6e596d5fa1ee6ada8d1.npy +04256520-c8b6897dac50a2c3eaf288f952624966.npy +02691156-f7c2edc1beeedd006e68e46a69a2d96d.npy +03211117-76b4b83212ffcbe034af0ed44f2ab2fe.npy +02691156-d2e2e23f5be557e2d1ab3b031c100cb1.npy +02691156-86a5bdbd8c0c70eea7de26672c5fab85.npy +02958343-ea3561150f4f2790253c03b7df20edd5.npy +04379243-a269c3b2b456e61af4e73c80c5eb704f.npy +03928116-2f6fb505856129f640e11a38b418d644.npy +03001627-1e40fef11894c4b9ce4f274577283b16.npy +03001627-11e6e58798ae5be83e5b5dbd84cdd0f8.npy +02691156-d8e8540acddacf98c1006ed55bc1a3fc.npy +04256520-660cad84e71a5f67a74931688d634d2.npy +04379243-1acc3dae512b56b01f8b303c0da5108d.npy +03001627-4552ab193b8566acea343d0d02e4d3bf.npy +02691156-af55f398af2373aa18b14db3b83de9ff.npy +04090263-dbbb9a848b8a6697e1f2a1daf140ac9f.npy +04379243-67d97102f9c54cc95512673aa47c7e3d.npy +02992529-7772938405ac56c1b6d41c42f7ade8c8.npy +02958343-effb7322805482465740f5f1a3b45938.npy +03691459-dadb71e216b54f701c5d4854f1aaed94.npy +03325088-d1383f1ba0a348726f893b5bc716a3fa.npy +02828884-15cfe15285425b67bc96b70d50d39da4.npy +03636649-1475fe59961fc726f096eadaad23f93d.npy +02691156-6b15289a71312a5af8ea21a9397429b9.npy +02958343-e8745e2d659061ee4a15d27f5dbfc7ba.npy +04379243-db89cf8ec0ae8e10f42e033ed19d598b.npy +04379243-77fd14f1a7f2d27ec3bd24f986301745.npy +04379243-649cea3b17ffb31bfebad4f49b26ec52.npy +03001627-4178e43e2756f1d0af7a8f97983e7906.npy +02876657-2efb9eef0ed832a89769b3a50399d097.npy +04379243-81f049a3410c8d295833b7f8c91b5b48.npy +04468005-8714037a49f313b12e97c1a558edd2de.npy +04401088-39359aaddcc4b761b0a79e28606cb167.npy +03001627-5ce636f716f8f11e601104cd2d998272.npy +03467517-715d17d76a80c54bcc34b900bb2492e.npy +04530566-2f682d31b26398cc2218383c174cbd7c.npy +02958343-8df7178ab0f02bd7a795ba688a0bfdb4.npy +03001627-e6c900568268acf735836c728d324152.npy +03001627-a2eb6e2ab073dfb2e0340d230bdc7ee7.npy +04379243-9fe655d18bce7ede23fe3501bb9e7193.npy +03001627-e9e224bc0a0787d8320f10afdfbaa18.npy +03001627-b3c503ee276ed0a75298386582afecd3.npy +04379243-91df49ec00f2c5ce73f1ca2ca101a20d.npy +04256520-73111c5505d7b5eae3db80a3cacc6e3.npy +03001627-3aaa59b19eebcb5f41552c6ecbda964b.npy +03636649-89b168160388c29da996f5a90dae9cac.npy +04401088-4b91c9711ca991768a57ed2dc0905847.npy +02958343-1f0d149b320aa4faafe1d4530f4c6e24.npy +02958343-30e971ea6fceac68f5cb3ca022cf045c.npy +04379243-1028a9cbaa7a333230bbd4cddd04c77b.npy +04530566-f6288a9297948fdc67383adf153b22c5.npy +02828884-323f0787810ef9a285a030bdc6cb9884.npy +04379243-a99a74777f6aacf2489e5619471f9f53.npy +03001627-2320dab001320f69f91663a74ccd2338.npy +04379243-fc66d797cc6b4bb672a7060b4557c0e.npy +04379243-429d850ac1621fc176dc93c8128c2c20.npy +04256520-2c6dcb7184bfed32599dcc439b161a52.npy +03467517-33da9c54f43be3e17693a84bff425e3.npy +03593526-21efadc7372648164b3c42e318f3affc.npy +02691156-4c5b8babafbb7b5f937ae00fead8910d.npy +02691156-36d2cda57906072c1e08b6601b6fd998.npy +03691459-80000b93ffb0ab8ae47833b310955a9f.npy +02691156-ac0d1320328f5636b819f3a4f3895504.npy +02958343-752d240eb33f328cbf95baecbc060806.npy +02933112-d6edc4c02e38c7dda5737ca21e62ad39.npy +04090263-fb4969c29b155f2e9c8bfc08f511409b.npy +04256520-c06d35db226f47d4de03ab2a27ba7531.npy +04379243-48af84a5600ad5bc19fb4103277a6b93.npy +03001627-a1240606049c440edbf3c13c5c0e828e.npy +03636649-ba95511c0a79f2fc73b8ea30c1700f67.npy +02958343-4db6c644912bfbb3e0445fc6d980dd5c.npy +04530566-90bb60a421727973e3852f9948e4ef35.npy +03001627-8f4c2a7243b571f3b21450114b9ae3a.npy +04530566-eb00c722894c3d70c40386bdd72f9a0.npy +04530566-29a131678dfba5339a6e43b878d5b335.npy +04530566-9b90b9cbd9577d842b72b4a851b36ab9.npy +04379243-194b279c7e892a2d15fa8082e5524f79.npy +03001627-4138f85b00b53185dc3653f8341633a.npy +02747177-f53492ed7a071e13cb2a965e75be701c.npy +03691459-92b3275e46a63fce1ccf3280eab717b.npy +04530566-84097ba1b35f844ceb2c303a0e0d287b.npy +04379243-a767059df7040b5fbe127423452ccc7b.npy +02924116-775c6216da8ba981cb2ecbd32dc2119e.npy +03001627-a544d05ee3bf362d27e1ddec710c515b.npy +04379243-efa1b72ece626ac6e3989b96851850ed.npy +02691156-d96f2b6990d0d79e247412be0e58d7d4.npy +04379243-21d160eff925f48055f46d55537192b6.npy +03001627-cb867c64ea2ecb408043364ed41c1a79.npy +03001627-49d6f3affe205cc4b04cb542e2c50eb4.npy +04379243-233efac14ec7189e809222e4341a7d65.npy +02958343-48723bca810f80cf7c84d27684eb86f7.npy +04401088-7617e95211fc3ba0e02ee35b95994e2a.npy +02933112-809d5384f84d55273a11565e5be9cf53.npy +02828884-f35697e0ec1d35dd357ea07594f25728.npy +04379243-d97e2a50640387adf90c06a14471bc6.npy +03001627-966aaab0434c950cd7f7a4c4609b0913.npy +03046257-8fc855cef77177e8c598d38a6a69ad2.npy +04090263-76eabf417f880fbaf0cefc099c5b436c.npy +04401088-54d5d64e0d3b0f95952ef623ec48449b.npy +03001627-edb86d102237488ce8f8c11a24c52ebb.npy +03001627-89dba482df6fd02732e2044f695909a.npy +02958343-2928f77d711bf46eaa69dfdc5532bb13.npy +02691156-3033e5dbbff674a55d3bbd70fc7759b7.npy +02958343-3d2fbd9bfdfe08573a93df79ef2b80ef.npy +02818832-ec8298e0eb6fe81aeb3829c3063c353c.npy +03337140-1d5d3b178c89b282492d9da2668ec34c.npy +03467517-a92cd0b5d559075daa9518d76daaca23.npy +04256520-28cb2ca084164fc15da92fb9f7555d73.npy +02691156-4044d5954ef85af8279326882e8430cb.npy +02876657-935b737dca29fbf4ef026123226f5519.npy +03691459-46d03a4d9dec071d1047e2dc3fdce97a.npy +04004475-eecd888b440831bffce3743f4e2437fe.npy +04090263-d5322c4c21c1d16ceff31787d7394ead.npy +02942699-2fc6168fba3ef6953ada8db96f6d95a3.npy +03001627-c1b312919af633f8f51f77a6d7299806.npy +04401088-c960421b8c637137fb4952f06d5e75bd.npy +04090263-6d2761d9749fb354167e6355c6e5b5ad.npy +03636649-13e4f5f06cb42211fcb8d8c6d4df8143.npy +02876657-9f50b2ddbcc2141cfa20324e30e0bf40.npy +04379243-d21405eeeebe4085d42ec7e303174a87.npy +02691156-aa3a801045f6fea9afd51f67d3985e6e.npy +03211117-75ba7901816b273fe24979df4ff99c50.npy +04256520-aa8b70ecfdd237bbf91663a74ccd2338.npy +04379243-e29252434d37520ff008d8a3590fb522.npy +03211117-3ca0f34c03ddd760234c2f2e8f2fe6da.npy +03636649-8508808961d5a0b2b1f2a89349f43b2.npy +02691156-1304ef60fe9793f685e0a2007a11e92f.npy +04256520-7db3c05e67e9b847393b0262b4e8b707.npy +04256520-ff2dbafa8d66856419fb4103277a6b93.npy +04554684-3cafaabfd4924ee47e5b110192149385.npy +03001627-5490efbdadce792f524f4eb395a8604.npy +03001627-7289d67cc454e7215790e40d47191474.npy +04379243-2ca883ba6a9dc6f68985be89a0ee21a.npy +03001627-e7ae6edc3fc6c92ac423490470c47d79.npy +03001627-432138c30378b2a8e1b6c3a3e12d929a.npy +04256520-5b693b3edfb323d0febad4f49b26ec52.npy +03691459-e34b3e11083387b9c9d5b08933b9e0c1.npy +04256520-7669de4a8474b6f4b53857b83094d3a9.npy +02876657-8aeb546f0381df6e97b6ee740552021c.npy +04379243-2ad1a20d43c6106f71b1188ea929234b.npy +04379243-8e8b8a01fc4abd88fc4a4d8514534de1.npy +03636649-2632d9a8462774cd81255bc546ed0fe3.npy +03636649-8006e3cb3ba934a05b977412e02c412c.npy +04256520-5cc378efd61f0333afd8078191062c7f.npy +03001627-3be2c90d1c2730fa14659d605ff53c6f.npy +03001627-24cd35785c38c6ccbdf89940ba47dea.npy +03642806-dd205f0f8bc78bae359d7b39cfebb287.npy +02958343-b5a25bcf42cdfb15523270fc16562838.npy +03467517-58ef47d7e4f4ce9b2442fc1f96a68061.npy +04530566-44d1e432239591887b2cd6c1f3acedb0.npy +04530566-5b45a9913b90c67f8e2d64007fd7ea91.npy +03001627-c3a3d9cdaf29cf6597c8d78b9aede742.npy +02958343-a238facc26681bac8efc69f75162eba1.npy +03636649-a690290543a1b904cd5a7785cb8ad4.npy +03046257-7158637af55b7c51f51f77a6d7299806.npy +02828884-cd052cd64a9f956428baa2ac864e8e40.npy +03001627-6c25a321d75405aafdef1c01cbd4ae0c.npy +03642806-c012da029408fb8d498c10f665c444af.npy +03211117-ede70dc992195dc272e55f1aa85cc5f.npy +03001627-ea577a1e9dffe7b55096c0dd2594842a.npy +02924116-6875d86990f0e143c3326b0bcdf7d332.npy +04090263-1030525f8d49753e519f927f2bf92da9.npy +04256520-8f8aa68c8c6cc6b53dfad56d2a4eefcd.npy +03948459-e4b03ae84f8d11394c3466ee2269609a.npy +04379243-1557647df4c4d298f6e8f2cf4a97051f.npy +03001627-9c825b20d4e35eb595a6db6161d501d6.npy +02691156-35835c28f33d985fa18e0889038e4fb6.npy +03691459-6d5698eba0fbb1cb2a9eb0f146e94477.npy +03790512-aae0037cd1dd489b468bac13e007a6e9.npy +03001627-76fa373d984bd515504d5af97121b5f.npy +04256520-6f0f6571f173bd90f9883d2fd957d60f.npy +03001627-bbcdf9d0ecf02e7e9fce07ae6c046b8c.npy +04256520-3dd89f170133fbd7d609055a51359428.npy +04379243-ed66ef9698fef541b945039752747042.npy +03046257-4e4d010aea4d533756325576fb0d1968.npy +03593526-81cc70eb5ec9e3c75706d1c54190f27a.npy +02818832-eccc3a7a3a5785e8d359a99f94460600.npy +02958343-470fc68779da0f923d68b6d025852738.npy +02828884-87086d24c964f9524ee9546b7112f88f.npy +03046257-487f2bacddd58bc9f959a2da56ff43b4.npy +02933112-3aabe5c704cf7a6d1db624f8d6f26a7e.npy +03001627-a8a2f0865365b521c87106a609982130.npy +04379243-4302fa68485f0734776f723457d34a2e.npy +04256520-23eb95ad8124b45cc27ecf743c1aa320.npy +02691156-b4dbf6f6b0cc8ec5ce19d55bc5e6a406.npy +04090263-c6e6cf657ba3f2df4376957d2c85a4a.npy +02876657-ad33ed7da4ef1b1cca18d703b8006093.npy +03001627-63249ce6d12ee0bc7b20cb946bceb58f.npy +02958343-42134787c805fffe1ab9df4be75138d0.npy +02958343-e920afce255de6ee3781057335c8a2e8.npy +04379243-7bc45a32e5b7f14f7e1dc33a9d8d260a.npy +02871439-14e2cc3454ffcc65cd1d915262958e02.npy +02691156-88af6c30339602c2c87c199a35aa58d6.npy +04379243-450ca83285f0a0bff51f77a6d7299806.npy +02691156-b02aa659514366aa2c6868c67da0489.npy +02691156-7385f1416e93f1c14ba2821676102936.npy +03211117-cf7434589520c549e420fe49ae1a5a34.npy +02958343-7275ca45638f16041899a3ad18d10126.npy +04530566-d235d9f72448d9f82c1bf9a642a59d24.npy +04401088-dcc94b8d84b5093df47a365062723f15.npy +03691459-97f758c8d327d072871a975200291c6f.npy +04379243-6f86cce2bf8fa88821da01c0bdc324b2.npy +02958343-1688bcda878d3b18afe717997470b28d.npy +04379243-41b548aa6f4146fb1962281db2f162a0.npy +02828884-66af742be9a0c722b93fc2b66c6b86b6.npy +02828884-26f583c91e815e8fcb2a965e75be701c.npy +03001627-c04f515b688f9d97fff16555386d173d.npy +02691156-24fbe7a49fd786c5fb5c1b0f759e2bc1.npy +03001627-47ac4f73d91f8ff0c862eec8232fff1e.npy +02958343-bf37249fc8e16fd8f9a88cc63b910f3.npy +03325088-569dc8ef952c3e039bc6283fe73f66e1.npy +03691459-142f66a7bc5e119d18d385624fdfc6d0.npy +02958343-c8bc71dadbdaa890becf71e2e014ff6f.npy +03691459-b7b69bc187bfea4a8b1598dab950d979.npy +02747177-edcbeac5da0b42dd7936acbca381136f.npy +03211117-846b6c8cf241ce2648d13901d1f48e04.npy +03001627-ef7d9ace8098733b8e80abc614a52973.npy +02691156-d639c8d2f55982558b96ae1a0a8b84ec.npy +04379243-c18781f9d9d6f34a79368d1198f406e7.npy +04379243-6d3828602ec4b79232a1f4cd459cdfdd.npy +04256520-875b65ed8484c7908bd21f911d388ab2.npy +04379243-f643a64a4e38723f73c478529c40c4e6.npy +03691459-fcd642cc82a4417848db103415b9e9da.npy +02871439-55c822c909fe5df991b2b5632f598ef3.npy +02933112-21ae39cf6ba8557f4da5feafe6f1c8fc.npy +03710193-5fea323ff9baae9e8ee9863a6dff6d33.npy +04379243-59ef41df3ae8a4026c2e61baa2a8130.npy +03991062-b06b8ff170974a41bf01982c823d8b4d.npy +03938244-d212b1cf646b23f5fdad967a7c361c07.npy +02747177-d0811b88cf8db844375bc8943daa105.npy +04256520-41149ca3a44aff87707cdefe012d0353.npy +04256520-dd85decc87fd988c524446331aa4f326.npy +03001627-3af3096611c8eb363d658c402d71b967.npy +03001627-c7dcd3fdd4ccb7563dce8e6b691b2a29.npy +04379243-d81388de1add33d8e41c171730c26c4e.npy +03636649-2f02e4f875d651b3c066b9622c005c53.npy +04379243-e78e481200b9c01323720b60324690f9.npy +03337140-7d4abd821dfbc7dfcc786970133d7717.npy +02691156-57e135ae4fc03f2e6d06e36417078f.npy +02773838-20b4891228ecfb4876bb31db0358e9c6.npy +02691156-bd2a375de8c7374195adb59fcbb6489e.npy +04256520-980d28e46333db492878c1c13b7f1ba6.npy +02747177-c2d6739b7d2b6cadad5067eac75a07f7.npy +03211117-9b6d300449f7bd573cffc71116771f14.npy +03001627-4dae16dcdfd7d10be6fe3612af521500.npy +04460130-4884377f5433a9324f2ea904df2fe040.npy +02691156-425619faec43ba86a000a5a61b867bca.npy +03467517-9c260623916034b6f7d037d5768b173f.npy +02958343-6a13836c3bc23bf316d7d2293315a234.npy +04379243-2c6c50203f519351bf5f47124ed0461e.npy +02933112-df509063ec7b78ce8f7d9678498f2295.npy +04379243-da330cf1b5a8f1ad26f51cb1aef0ea9c.npy +02828884-7abeb2903fa22d0fad974a50533b722.npy +03642806-8b4de33bc47389d17cc7e57b94b43e43.npy +04256520-a939afd0e1336d17d20e3ea5765d7edb.npy +04225987-234b2d3aae0b3c44b17369c768229699.npy +02933112-c6a306867328d90fe42c2d012c73c412.npy +02958343-19042f5a90290859441c11ab4641b257.npy +04090263-1cc47a6181beff44f18a63d96554f7.npy +03001627-c405457198f59d86492d9da2668ec34c.npy +04379243-bc7a99b74e3dd257c955e5ed03ef3a2f.npy +04379243-1846b3533f41ae82f8c4b4cfc2702232.npy +04379243-97b7baeb8a172de42f56f09e5bc67bee.npy +03636649-39af776c1435a3374b59758e9336ca87.npy +03001627-9253f198c06794cdc7689830acac6e59.npy +03467517-c739664436ac5237aa0c867d5b070a5d.npy +04379243-65f27b374b83dff560ddc468fe733ed1.npy +02958343-97d0903cf8912c3ee9d790a68c844819.npy +04379243-5835aec0e4aacb278305420c03f867ef.npy +03636649-5d3d9d6a6721646e441f5bb6f88ca61.npy +02958343-a2fa0bfd39718f1688a610ac9b7aaa40.npy +03001627-5427106126c9851dc862eec8232fff1e.npy +04379243-91b962b6de5efaad79679c2bd6c2f2c2.npy +02958343-6355bc126ff0c2d9ef923467520bd6ef.npy +04090263-7c8a7f6ad605c031e8398dbacbe1f3b1.npy +03001627-c12da8acb2c7973597e755dddca14449.npy +03001627-98b003470034007f51f77a6d7299806.npy +02691156-68d3c213b16ee2a6b5f20f5912ee034d.npy +04090263-232a75ecb85c7fef6c70dd7879e7e453.npy +03001627-a1575aa70fbaab0fc05575120a46cd3b.npy +04401088-df2299185baf20a17b1546f309a98bd9.npy +04379243-a2554ec7e2331a8fab610b0c94236463.npy +04379243-c97fe8ab1bb4e195af983a27c524ad0.npy +02958343-e1d2157def9f3ff469856ab03b318817.npy +04530566-fd13e9a9d84bf26266d02be2d9ba0945.npy +02691156-fb0f2907b977e7cb67c5e3041553656b.npy +03001627-e7d4a3cca8edfde4829113e62386fd50.npy +04225987-591971ce679ca4b93ad38b993d9e745f.npy +02942699-c3a410e532cbf900e5a8b3dc188dc518.npy +04379243-6bbd16ddf2f8be61377b9297f3055210.npy +04090263-907def283c0727f7143bcc14d754d44d.npy +03797390-b18bf84bcd457ffbc2868ebdda32b945.npy +03001627-f5caa9b5ada31a8b3cf15c77de45986.npy +03691459-710014b815369e1c2bcea2cd4cc7b042.npy +02958343-45189b11f0524a85e921d7ca67acd2a.npy +02691156-2103dcb213151791acf77e718d93f3e1.npy +03001627-d94490f503e005cb9eeee305ab9432f0.npy +03325088-d24b5c4d9635352c76c18e71fd49c4dc.npy +04530566-9115745cde6f30c67f141c9abbacbdb8.npy +04379243-42db26c80b9530b7c188d6c6d00e7440.npy +02691156-1066b65c30d153e04c3a35cee92bb95b.npy +04256520-855407f176aeecd6ee7d178666aae23d.npy +04225987-2785d91a40cd41a659c9250a427b57f.npy +02958343-19541db644551287ee0112963a7e11e3.npy +02958343-21999849a6a8aad752470de2774d6099.npy +03948459-b022617c83eda074de67c4fcc9fa48e9.npy +03001627-32f007e84efcb9d12cba66dc6aeabcd4.npy +02691156-a4b26e08b6080277a47575cd04a1d851.npy +02828884-4e512ab638542762d4d8765e3910f617.npy +03001627-9e03f57afb7bbfb21b356ab8b24c147.npy +03636649-2958cd9fd799bf02cfbcbf340cec6da1.npy +04379243-e58448ee821f56bc409de7db3ae4697a.npy +04090263-7d54a0f10b79f06af70f35281ca419ac.npy +03642806-920c43f5940ad5516395c48c836f48fc.npy +02828884-213ddf647e36ce28c933c4a3701f5695.npy +03001627-cd6a8020b69455dbb161f36d4e309050.npy +04379243-d056e7c8c972455b22a22d22d00874ec.npy +02871439-aef9733c1f4f09498381de546409094b.npy +04090263-f6b9cfaabbcfbc494298740d1f3c17c.npy +02691156-d1b28579fde95f19e1873a3963e0d14.npy +02958343-6bf75ddeac192594bda733a39f84326d.npy +03337140-30ad23a8f6a3a4479725f8348364f5a8.npy +04379243-92973023278f568a4594f83fd12bcf18.npy +02958343-cadd53fdbf69727721f6e2b0f75cf9c4.npy +02808440-ff0a7ba89bc77fd58797cf21d0643b9f.npy +02924116-91394611fb3302e973f659238edf3c3.npy +03001627-7a9969fac794484c327289c00b6dc9ca.npy +04379243-9cc8c5869737e8e3f51fa0238791f5dc.npy +03001627-e908c290fb506f2e19fb4103277a6b93.npy +03691459-64ebe165fa668ad4abbfc2108a5a7885.npy +02933112-18798a19664ed14c14038d588fd1342f.npy +02933112-7155c1f2abcd7dd2e3f7a74e12a274ef.npy +03325088-957c49fda3109da9c36fb70296e45483.npy +02828884-5cbed790bc24fa22056b4bd5d870b47.npy +04256520-dcd9a34a9892fb11490ad276cd2af3a4.npy +03691459-4d8420f146df7c37ec2dd234c32c102.npy +03991062-a5db4bacbe009f2ef51f77a6d7299806.npy +04256520-216821d05f00b1ccc3bd24f986301745.npy +02933112-3700aafc0160b162c59350d819542ec7.npy +04379243-1f67cbeebf4f65b22b71faa8701e3f78.npy +03467517-fc897eb93c621572ed724609df3eb104.npy +04256520-6fc69edce1f6d0d5e7e684d25d4dcaf0.npy +04090263-37f8e929e458d0a9c2c44977d8755d41.npy +04401088-add38cbd2fd27d62cc98c9802550400.npy +02871439-b2284a33e3a49eac120a829bd43c87b1.npy +02924116-a45862b9b23c240f3c898e35284e3eec.npy +02876657-3336ff069b249afcaea6c6fc97ee6184.npy +03691459-67f091721c90a533d747b49524a1246e.npy +02691156-4d13a1b180422efc2d0334ee3a22c9fc.npy +03001627-8748c7f2041761401fc5750ce9890422.npy +04090263-e40227f3cfb50588ed6e4dd9aa9b9ab0.npy +03467517-c76525770fe831c21082f2ea630bf69e.npy +04530566-4cbffb314a589346b9b184da9c0040b5.npy +02933112-6d30a4d1ed6f4bdbf51f77a6d7299806.npy +04379243-f718cb5d6202341dc183308b9aafe2ca.npy +03691459-1a4ec387ea6820345778775dfd5ca46a.npy +04530566-630bc6dc892aa9bc642f9e27aaf0c47a.npy +03991062-5e825f4aa6a916c544cd688b4bc0d629.npy +03001627-6fd7e0881e4148a238dcf62407724e73.npy +04530566-1f2e662c92843dc9c083d5272d526845.npy +04379243-408b03db5a9972cac3bd24f986301745.npy +03001627-46a6c470367cb57ec5facc3cc8dc041e.npy +04379243-4454343a673c8b3483e0de42574c850a.npy +02691156-45985e48353c65cfd14a90435b48593.npy +04256520-f1e1585a89e6826a1d1a08d58541ab5.npy +02691156-6fe8da29821a60d75057515802db06ab.npy +03001627-8fa742589b47b596e8f8c11a24c52ebb.npy +02691156-fef935c1f862f4aa31309643a94d8a5f.npy +02958343-a78990822fd4836a12615f8be9c552d.npy +04530566-80930e10f1f3ab9358401a911725e987.npy +02691156-580e54df8765aac1c1ca96a73599ca7e.npy +02691156-90489d6f74296c88daf24b8b932d0212.npy +04530566-6c1458eec06ad0c147a67ad1fb1cf329.npy +03636649-5a1484a25a5b8a08e0df09c6ef42b40d.npy +02691156-f95d8e86feb79b17cbebff57eecf0a64.npy +02691156-84e45a6f079cfb9526360e1e29a956c7.npy +02958343-b9ae3fb6b027dc4294a553cca1043426.npy +02828884-ec917ab14b06fe402056b4bd5d870b47.npy +02871439-7bc107131eb35d089de7cc26da67a42a.npy +02958343-18aad9d102afbca57ba2273581c30cb.npy +03211117-f2f41913123a7a7e4b87db09ac4cfa73.npy +03691459-bd76dee31cdad0f0bb62a53e25c6d701.npy +04468005-896352cb09e6bd1e398968fd209b2972.npy +03691459-c766463a3623d0ab8a0181490cb73cbc.npy +02992529-452b924abd2ece2d58932236a22029d3.npy +02808440-f02c871c08d664544b97a2297d337e28.npy +03467517-a1eeab052ed7be831082f2ea630bf69e.npy +03046257-78083db936435d0a410f8c2a2eb53871.npy +03337140-c20ce998ba99451991c352d02061b3f7.npy +04468005-97a93d1479a6382752470de2774d6099.npy +04379243-e81af191bb828526815b2b467e8e2eac.npy +02958343-1736b8494abf38ba4eb766e5a46fceab.npy +03710193-f76e818f809a73921b17743c18fb63dc.npy +02691156-cdccbb56939fcdafa266a0298675ed53.npy +02747177-7069760a16db98f46c9e5b09a1c294d9.npy +04379243-c755eeaa4a588fcba9126dd5adc92c1e.npy +02691156-fd0e59013a16eb5184306f3bf0a1f2d7.npy +03636649-47cd62ec53571be3276206fae5d3c473.npy +03636649-a4f257a3eb6c5c37f716a9f638b146ab.npy +03001627-b51e2ec95cb6ae33999b33727fe6db14.npy +03624134-e6d18d45abd40a22e5ae31c6c631a39.npy +03691459-cc01f463f825ee9024fa1bc380696e03.npy +03001627-6a2ae8bc01eef7b25e655c6c6e834498.npy +04401088-738e377ef785ee92d3429357dd0adcaa.npy +04379243-869516eb98eb3c2fb54d798b09097adc.npy +02747177-af6fa396b2869446d4d8765e3910f617.npy +03337140-f33558146907dde59118eee0b123125f.npy +04530566-3ff4ba746d73fdd08f845c46c317c0e2.npy +02691156-b1021932b387da327f58a59a37266b2e.npy +04256520-1053897adff12c7839c40eb1ac71e4c1.npy +04256520-884edfe9e34533543ede9e7417860fbf.npy +03636649-980e88a168a94790899bad344dc01f2f.npy +02958343-3905d1dcfd5e702333d445f141c62a67.npy +04379243-168e317409670cf2a0006518e6ab8b1.npy +02691156-b458bf7d57d211ee43bc2645d97a220e.npy +02958343-83afcd8ba9cf63cba7094e4ecf18eecd.npy +03001627-df55d3e445f11f909a8ef44e1d2c5b75.npy +04379243-a1d9f62e3bf2863278f39854b0025475.npy +04401088-844633a98977c10d9eedb085a3d8dd72.npy +03001627-866e1be9f53830ed7a6617a3ecd0b52e.npy +03636649-9d340cb226868e39ce4f274577283b16.npy +02958343-33e897abe9e7df46a9aa61915b4add2d.npy +04256520-4ec9d99e4094a2bd91659e904513cf6c.npy +04401088-a3f4cae960ac74babc54d4bc75a1a826.npy +04379243-e6b84acd543ebf20662cdc2f77e49a85.npy +04090263-f5f4d746b6d0b8f59f433921788191f3.npy +02691156-a6b9d686a7b977035bae66e2c509821b.npy +03001627-eb039f6a86785f3a9e633556753261cf.npy +04090263-25cf1e85d9875c9412173f61ff9d1fe5.npy +04379243-71a26c00d3a4bf834397d3416be8cfe5.npy +03593526-9d4bd3ecfdecc031561dce3fe08634b7.npy +02958343-f6d7cd8a000997b1aa69dfdc5532bb13.npy +04379243-967d0f37416158b897a6420376995cd0.npy +04256520-cc4f3aff596b544e599dcc439b161a52.npy +04379243-15339648435a8e6290ef7803f19df417.npy +02876657-d10b549075e8f3812adf8abaa25e0215.npy +02942699-416ce9adf7ad40f4959c1c3d740c4f1.npy +04379243-2f98d5e721e84debaa8081a7009091db.npy +04530566-3076e52758d28680b534b494664155d3.npy +04530566-65f8bb163e351bfa9399f7cdb64577ad.npy +03211117-ea58a7f6955d740fd18c7d7f7c43f51.npy +02924116-239f4f66030286e73a304988a6618a7b.npy +03467517-c7c7542265b8172c7e1c85c5c15da7fb.npy +04401088-39b91aa425472c3676fb191f3b44695a.npy +03325088-e34fce990f5c1e3bb362845c6edb57fc.npy +04530566-dc27c81f14e3a89c84306f3bf0a1f2d7.npy +04090263-897084449b84192db449aac65ff63543.npy +04379243-da96905b5b3c821c8cbb8bac2032149c.npy +02958343-e98955e5d46a492c036e20efe5e5ca8.npy +03636649-8207274d3677061673ab7b7128d466a2.npy +04530566-20c2bcd71abffc2a93add66353cae8ec.npy +03467517-b6d0cf333c7e013993f0194265a9746c.npy +03636649-8fdfdb325c5239e798e0d1738edd4f19.npy +04090263-c0e05e56826d5fbc38cddde805fe966f.npy +03691459-30bf1d16fb6c28fefa70f8d6bbdfb0f4.npy +03001627-f0f04644e071d9348ca588a3264b9f86.npy +02958343-affba519865b72fc2c95ae1829869305.npy +02691156-a09773e513ca86ba8699933784576e73.npy +04256520-b10f96a79a4fbb039444333dad662f20.npy +03636649-c2f055fac2817b263cd6abbbeca4e2ad.npy +04090263-c497e1a1ef3515f197e3ac788f68f6.npy +03790512-f145950bc661e61bc4b71cf5644b0ee1.npy +02691156-92e445da194d65873dc5bf61ec5f5588.npy +04530566-a58fb21bfa4e2f451ddea1d5aef06a06.npy +04379243-367284cdf79742334305d9043f82a6a0.npy +02876657-532376fe56d3597ac65f62bae01f4803.npy +02958343-36fe332c1b11696d51a95aaa6caba1d3.npy +03691459-e2c1e8958295f84459fca7a6b28640d3.npy +04530566-5bd0346e72866c8256f77b6bc6731cda.npy +03046257-c9dd71db5e6713937d0fed3563de13d.npy +04379243-50bc6269b12da0e5f88cd736e1bad067.npy +02801938-d9fb327b0e19a9ddc735651f0fb19093.npy +02924116-a20de35fdfc74932bf5e15f245b14644.npy +02828884-4b00859dc8ce46eff4fb4dee5181bee.npy +02958343-ac3585c59a80b822b4d8eb72d337b2e3.npy +02958343-e5c45e408595abe2bfff0ff366de48fe.npy +04379243-c45e6ceae72c7a97be8908669c476d49.npy +04379243-a8dac23add615b33313f9af5275b7c70.npy +03691459-c82577c608e88a8fb2ce325c854088c2.npy +03636649-8cb3f83d6ca1a4849364e552d5e4060f.npy +02958343-7cba7b4a6e106bfa2bc5065d4094ca0a.npy +02691156-b97900a7f44bd7dcca8607f540cc62ba.npy +02691156-2d0945065aa2a427eec7473defebb526.npy +04090263-347cee581e94fbe5d735fa1ab17311ec.npy +04256520-d851b8a016cf114c742f75bc7df727ae.npy +04379243-f5fa9f592d891083996915f7802ec40.npy +04530566-482ad82769d6b5b11274a3ddd0ec9301.npy +04379243-c0e8eca9811baaf1237b12b19575e7ae.npy +03001627-ffcb8206f907e663eac685b1b2988af.npy +03261776-1a5e2a7cddc8e46aa681aea7976a4565.npy +03928116-ee5f02473d056362ead00c9724dd9a8.npy +04530566-d271233ccca1e7ee23a3427fc25942e0.npy +04090263-1c6064f070b55dbfa449921c4b97dd7b.npy +03046257-e26485c0a14a90867903707764646db.npy +02958343-f21bd46dced01bd835da01f298003d56.npy +02808440-545abe6ce52a927d3321831d2245cf06.npy +03207941-f0a18797e3fe9456ca8fc0fc5ee911.npy +04090263-164248eefde5ce846314c3b6a3a65519.npy +03691459-7b81d4cddf859fe7ec8f1b76923633de.npy +03691459-33b19fdf42fd767d871a975200291c6f.npy +02691156-b90571e8736a296c549b705aa127253d.npy +02828884-fd6ae258090bf95b693e50e46681af47.npy +02958343-ec469722be9d015c1ef32d215d1c8df5.npy +02691156-e4e98f8654d29536dc858dada15498d2.npy +02828884-818879b4a23c12bf575f9747ff6fb5e8.npy +04256520-67386a2dcd3be10b8a09f7075b904cc.npy +04379243-1cce99367326fb45a7f4087375d26b7.npy +04090263-a3d111fe5fab82a54aef47a2c7bc343b.npy +04379243-5247e4e978399f1b486040c0d9e85846.npy +03001627-e65ca690574bfca53ccbceb68fb352fd.npy +04379243-c62dd18f43f11b858d2fa6ffb11d1cb3.npy +02992529-52494d36a6d136f6b34ae4286be3d813.npy +03001627-882f30dfcc94ccb5ee57043a0b4866cc.npy +04090263-508230aada88eb0a550a87cda3436d95.npy +03211117-b06ad1afbbc8ba7536b34d1a0ff085ad.npy +02691156-59bbe6a07a5a68d5d96b332cac4e78f7.npy +03001627-68e9a9ebe0475536194b666f21552cb8.npy +02691156-7d89d64afbb5b24056dd1ba442ba87e2.npy +02992529-54b4288766d87dcf332f5e5df5b42874.npy +03001627-2ae70fbab330779e3bff5a09107428a5.npy +02933112-4c8e95fe5fdbb125c59350d819542ec7.npy +03636649-bd2dea41f32e4562ce11183544874734.npy +04530566-6e3db071ed95552b3faeafe37c2ce4f6.npy +04530566-847e8fedddf6bee5518c49741aed1bc1.npy +02958343-1660d6b7221223708a49a62fbc70ff9a.npy +03001627-b431161712ea348cdbbc9440457e303e.npy +03928116-2ada8e6257eee4b73bb4a1304fe504d3.npy +03467517-4b325df8da005995f0e1c0df18936d05.npy +03001627-7178731312819be3ecb14096838a20c5.npy +03337140-d88e590e79117ec7e7ecdbe73ef4323c.npy +02808440-7e3f69072a9c288354d7082b34825ef0.npy +03691459-67192701cf183eaaf2a2172bfa1bbe55.npy +02691156-636dfe39d75701b6cc14f1e6f4f4f49b.npy +03001627-d0894aed032460fafebad4f49b26ec52.npy +04090263-abcfbaaa409d62001d263b1fb57ddbcf.npy +03001627-80784cc9f549e4abc3bd24f986301745.npy +04090263-1762f93a8249ef356e4806bebefb1ca8.npy +03001627-ad7a6efb5aa6c289810da4adc58441d.npy +04090263-c4787a48747c6db1cc34b900bb2492e.npy +03001627-2d204f50f33b3994fe52ffd0e748a1ab.npy +02958343-175a289947f549b0e088606e38104b2.npy +03211117-bb01397739208d30d39a67ea53079d95.npy +03636649-956ef7ea0d496de01735ea0e092a805a.npy +03636649-64a45d75c1c5bad6f51f77a6d7299806.npy +03211117-f2b3efb28b5f5d56fb4038701c4e8e29.npy +02933112-36d62d9dcba0e3ec4da5feafe6f1c8fc.npy +03467517-11e4201608076126d67ed0980f6dfc4.npy +04530566-5cee5c3afee327cf360d3819686769c9.npy +02958343-b12841de144ea6fbee3362a8d2d8318f.npy +02808440-e4cd718118a15c40dcf3aa5cc0c09272.npy +04379243-6986716a76d8a2952ca3f5e9a38d33a0.npy +02691156-c330992ccc6154d82b6925c3587009fe.npy +02933112-a3a6f9e80956ec6f4035f93ab9531db.npy +04379243-37ef68300b944adac5a1529d102e7db9.npy +02933112-3115a3a0a61aacac59350d819542ec7.npy +04256520-7e728818848f191bee7d178666aae23d.npy +03325088-1943c8dfb6d5f0bb362845c6edb57fc.npy +02933112-4c7cc0a0e83f995ad40c07d3c15cc681.npy +02933112-817e119f087cf8f8f44880b8ee951142.npy +04379243-14bbf802bf00121267d783b4714d4324.npy +03001627-805bb12faecf99a9bbc0e8a3b6521117.npy +03790512-c7c8d9406c1a93ab52a0573c504629a6.npy +04379243-3cb345b1ef0f4d929a7e020ff2597416.npy +02933112-4de45ae952657a45330a170e9ceed373.npy +02958343-99f9ab439e890e79aff8ec395bcde91f.npy +04401088-e1effe88e974292f8ba7bc4a733e1db9.npy +03001627-2ca91e56bef8cb5034af953b663e921b.npy +03642806-8d9bae8897ac3f973c28672f19a43c87.npy +04379243-3af5b1ef3e742dedf4b6538438a0b930.npy +04401088-a13cea3066cd5b1746ab0c6c4666145a.npy +03325088-a9411c894038543ec36fb70296e45483.npy +04401088-d9ce2d0be1f3952aa36bec4fa7cd58c9.npy +02958343-a49df2707037f82a94ce9d7b04676231.npy +02958343-2fe4a878e34bd3bab8013668e30e23b0.npy +02818832-6284bce6e6fe15c8aa69dfdc5532bb13.npy +03761084-13290e02935a82a22846fa729d90e125.npy +03001627-89509ce24bf62df0950baa3a522faef2.npy +04379243-6be99fd273c3eb879d4c79351958f461.npy +03337140-657db7fc093199c891c352d02061b3f7.npy +04401088-312c430f8b1a3fc80249ed612e14df4.npy +03211117-eb54df4a6211364d49d7025d277c28a1.npy +04379243-7f6a5ee3a0fb9ff19fb4103277a6b93.npy +04379243-c87012fece9848de87f79701ecbb26ac.npy +03624134-594dd047f15ec08ab1e00d60b0f9cc70.npy +03001627-6aaa9bd6e835eb0f9b9f2eb77f5e247e.npy +03325088-460cab47b5657c7176c18e71fd49c4dc.npy +03593526-10af6bdfd126209faaf0ad030fc37d94.npy +02691156-e69631d34410f99ac4f72bf08dc79a6.npy +03710193-d80f223e5e1c96d8e4ae8899818510b8.npy +02808440-ee230a2651945801b20f6e48f6a30cbf.npy +03948459-f6d52684720d52a01ab78426351eea4a.npy +02924116-c8284ae0b7a06eaba697ce29493f3815.npy +03691459-2c64384906f809f09e9eb484700b40ce.npy +03790512-c9c41d106fc36402b0f9875a6c9bf605.npy +03593526-78c709102ee8d89ab7d0f3d89bbac230.npy +03001627-26ece83dc8763b34d2b12aa6a0f050b3.npy +04090263-1dc7cb6866488d93cbb897b3e6934456.npy +02691156-fbb2e9c15888afcaca504cdc40c452de.npy +04379243-41a464b6ea17ef5ce7321f25048c6142.npy +03928116-809307d04ffd3fe5650ef5c65206a324.npy +03325088-32afa83cf029cbd414b35a7d7cea7130.npy +04379243-cfe15cdc16a2e2054e2e1b2af0cc59a7.npy +02808440-cd21cb60750fd91f4eda040ae95dd4aa.npy +03001627-8ca2c0a0eed4a31abb93315448664e1d.npy +02691156-c7ae9f9e3f95ce76adecb6fc00604132.npy +03467517-233064561655ddbce4ca9fc57c06f078.npy +02691156-4f9b12d07dce21ac9d93a50cb0355558.npy +04379243-4019bfe9bd7605f7a52709499e423710.npy +04379243-6adda4f50154d662492d9da2668ec34c.npy +04256520-93b09a953435a00175aa7f24a9b6003a.npy +03991062-b8ad53f8af09fd10e299f2c0038a26f5.npy +03691459-6e6b4d2603930dfd4fc88114be3a6b6f.npy +04090263-70459a553f42c300f85b811e02bb4272.npy +03797390-8012f52dd0a4d2f718a93a45bf780820.npy +04379243-a59ef94cc10c7a434e6953a92bb25210.npy +02933112-c365225746f2eb94ce5d6e9371bb5c33.npy +02958343-d5c4532a34ba10e6f9798a883006064f.npy +03001627-3b8f2b955ee9a904b3c42e318f3affc.npy +03636649-c43c89d862e10552b24ecc319936dfe2.npy +02871439-9c3319cb3c0a2ccccfb1f9b76452480a.npy +04379243-d083fd20f6f953fd4187eeeb0dea4986.npy +04379243-ce4fde399bd5f6f6784a45ea6efa1d77.npy +02876657-6b810dbc89542fd8a531220b48579115.npy +04379243-565225390d303601c0f947750540fb22.npy +02924116-9384cf835d1edf0dc95c7a8a79dc0c72.npy +04379243-15d58d8098de68aa48d189f942cedc62.npy +03001627-5b1744a03be753cf3ccbceb68fb352fd.npy +03046257-e43b7ebc9a1b71c95dac0a5eac75a2a5.npy +04379243-e01e72e173dd2cec8c76ec1f86d432b3.npy +03467517-3f287ca94b719bec282708d01f090528.npy +04379243-97deac79537426ac9255fc5df0de0bff.npy +02958343-8242b114695b68286f522b2bb8ded829.npy +02958343-91440448603dffb62c8b6ee41d7d5d62.npy +03636649-c61d6c246dde340462a510b8f97c658e.npy +03001627-9b27e1b557a5e499b01c58badc8bbc39.npy +04256520-7e1321155d43dc8bfff16555386d173d.npy +03211117-324ef9fa783f6fa3a70ed7ac6903e853.npy +03211117-4a2a1d7cf80d6031275d003e423c59ba.npy +02876657-78d707f4d87b5bfd730ff85f0d8004ee.npy +04379243-65164df6ae3dd848a1d7c136d0e341.npy +03691459-dfe7f79a9a4279d09596b23e90d45a7.npy +02691156-437de410d7c23cbb29b33c3ec58287c9.npy +02747177-5268d7d72312c3645fa85fb6e983b148.npy +03790512-52e2bc89667a8e35617798af67b81f2f.npy +03636649-1a963b28c5520cc737b2bb75885cfc44.npy +03001627-b42e4fd21f39ff4a19fb4103277a6b93.npy +02933112-91b2bed2f4b87e615164a043915ac8c4.npy +02992529-20346d307d39aa7eb6a804c25e3218a.npy +02958343-95ebb3fd80f885ad676f197a68a5168a.npy +03001627-71b53a5f441d45b742b7e4c0136bdb7e.npy +02924116-193fdf550fd5f12f446f92b52bbd82a.npy +03624134-3fe6dd259603ea70f342cbac7471c0b9.npy +02808440-9d3e7604b922e1e551b711a0825fda5b.npy +04401088-19b1c1a790c6824578bfad8b5ed8c4ef.npy +03624134-1574b4bc968ff33b33ae329611c23135.npy +02691156-c4f22c879e8adbc6aaae11b67645c759.npy +03046257-702fe577155d343cec77540dd1841b98.npy +04379243-ea3ecd082151c2137ff6ace05b36a5.npy +03636649-7d6dd04be7630ff01735ea0e092a805a.npy +02691156-24c2cc372c63603137678474be485ca.npy +04468005-96d5563fd3dffff75706d1c54190f27a.npy +02933112-5c2d14889827e1fc14038d588fd1342f.npy +03325088-a851047aeb3793403ca0c4be71e7b721.npy +04256520-251cccb082a6d36024f2ff737a52b0c8.npy +03001627-beb8876f47c5d4287eaeab1f0c9120b7.npy +04379243-11e12804b2712d08bee8ec52a122c491.npy +04401088-50504687883a08e3c6587b192c4cd3e.npy +02876657-33f6ca7ec9d3f1e6940806ade53ef2f.npy +03624134-4ad7d03773d3767c2bc52a80abcabb17.npy +03001627-4ea3d680127a9fe91360172b4b6205b1.npy +03636649-f9ee021d829cb2ba1cff7132ce500fbb.npy +04468005-3dcbbdebe3be1c53f54087fb0e024d3.npy +03991062-fe6737dfa2c07780d4d8765e3910f617.npy +04379243-3f14c153dc861c0990453a996fcb7627.npy +04379243-7d4c3e8b3304d8f823fe3501bb9e7193.npy +02958343-1176dff7f0ec879719d740e0f6a9a113.npy +02808440-d0df653cb5c1ca016b6c87c9f47318a.npy +03211117-ac2ea2d41c57d1075999f9ba82d15928.npy +02691156-420eb46efaa81427b60ce16063f0788e.npy +02992529-b45f58361ed3ae739d2375e90e0e0425.npy +03001627-bea34ffef0c02f07492d9da2668ec34c.npy +04401088-e8c4ef4c74c631e83628c1e9941a8ab9.npy +03691459-2dfc635b5ea197bbb611871e114769d9.npy +03948459-b0a050985a5ce6be25508ed649b952cb.npy +03636649-89622a50662e28d56c09b6371c58b533.npy +04256520-cc4a8ecc0f3b4ca1dc0efee4b442070.npy +04379243-192ec952a75014d09eaa55bb236fb6e1.npy +04379243-6d2783fa677cdfdc14e775cfdf4a76ca.npy +04379243-125ef28adc874f72934a4834f9d7586.npy +03513137-1dc0db78671ac363f99976ddcaae4d11.npy +02691156-b5b0dac4093a61cb3f2b01de37c0b29.npy +03636649-2b8dbd2f75503fb0c29700c28ff4f50b.npy +04379243-8d608e1a1a1f34adf4b6538438a0b930.npy +03636649-def342a8d095d8501ab5f696a41d80c.npy +03710193-514ed68efd116443493f0d0eb265f250.npy +04379243-3e34ca92c5067543fe9536dd9aed405f.npy +04256520-5cc1b0be0eb9a6085dca6305fb9f97ca.npy +04256520-1837416f6aef641bafcd24b8661a2fd9.npy +03325088-6102c9de80e5625eb362845c6edb57fc.npy +04090263-ce400eea04127631b8611345dfd403f1.npy +02808440-8825b869b855967fc197f3661a4ec752.npy +03636649-608db437f2aab3c13cedb1808e691a01.npy +04379243-991738fc61b81af030ddb6ead95f49cc.npy +03636649-66fbe6533abfe75195b26656722dea64.npy +03001627-42836979b217e0535836c728d324152.npy +02828884-aec473af77a77008cdb14b1e0ff2c14e.npy +03467517-1387dfc170091bb33c5494866fecdbc.npy +04004475-7f60e19e4f1b7b92f08c6efc59ec3825.npy +03636649-7ec821d5d8bd9f17d4aea4231844b26b.npy +03325088-684e3d299f3f7910843f813f752a5e35.npy +02958343-ae088f798f2c99c2927e12317acf49e7.npy +04530566-1c974cf5f4053701876d2c2355e426da.npy +04379243-d1ef95530469a1de1fc4857cc94b6562.npy +02747177-c1177110cf5b9b12a3c9394112c76917.npy +03001627-5283a98b5c693e64ebefe6b1d594ad2e.npy +04379243-cc05a1835e7edda1c02daa819b61338.npy +03001627-6697a325ee92e17695e321e9c6480.npy +03991062-81264e9ebc22cab136b0f2a1430e993a.npy +03207941-270b80325b30676592a31ec18c4e190a.npy +03636649-b88130805777f2efb76e29c9c43bc7aa.npy +04379243-20f561347df7703c9c9e05c155b1837a.npy +04256520-f0961a7006186493df6cfab91d65bb91.npy +03001627-671d34c27cc0f1bf2deeb5ec76cf103b.npy +04379243-c676bf562cb559e5ea820b41f77ab7c8.npy +03636649-421c9c7d606e0cbf26c27fcd604ee778.npy +02958343-24866846d728484e1d1a964dea8a7aab.npy +04256520-2507270b7e344bbda494798fa117187b.npy +03928116-6a5cbedab021de133516f91af8d2e0cb.npy +02691156-acaccf2af6ed78925a25a01ca5b91f98.npy +03001627-6be6173e7eea5888a616caf97d73fa02.npy +02818832-1aa55867200ea789465e08d496c0420f.npy +03636649-42cd4d8cfa141d4d374110224c1c4eb0.npy +04090263-199c603cb0ba88899ac559af07c55afa.npy +03636649-1d5ed34e8ccd86a88c94c2386714981e.npy +03001627-7508cbbffe5f2f95f51f77a6d7299806.npy +03467517-6bda8064db052734cefc37637c8d9a99.npy +02958343-5662d48de15dcacee1c2519ec6f06d41.npy +02691156-71fe2583bff79bf1c66589cdaf418925.npy +02992529-e76bbcc0029c979721844676433a0aca.npy +03948459-6b2d89a7f2b173f0d9deb3f829cc2475.npy +04379243-5fc5ebe830d27064563796b09a95b12.npy +04379243-dab44e951363e187ed44d599900d391d.npy +04379243-2633bba6168a580c8997f7623978b6e4.npy +03001627-b30517fab8b8300bfed6ad7429dd8443.npy +04256520-99ec963187a1cd2593ebeeedbff73b.npy +04256520-1168fc14c294f7ac14038d588fd1342f.npy +04379243-d5402d5be271438ef51fa0238791f5dc.npy +03636649-64f61c9c81e3eb7b8aaae3d020f5ddf8.npy +02876657-cdeccf2f410846d0e0155f56493d36bc.npy +03636649-6ffb0636180aa5d78570a59d0416a26d.npy +02933112-17e3997117f88d921ba9fd11dc8bf457.npy +04256520-ae4f28a7c4e22d9535dda488a4bbb1e1.npy +03046257-14d26e0c75890a69d1100e95297cce90.npy +02691156-2764f43226260c94a5a118bd15e6e34f.npy +04379243-690c3f8a4e7d384f1270a3c39ec25c61.npy +04090263-cb392c32ad0446aa576cd215d51ddd.npy +03691459-dbb3db217511d9cbfb906a2c84fd375f.npy +04379243-98c67a49d64d7bed1cf96a5dc33e37f1.npy +02958343-1336353d15efdf010f6f717db02df67.npy +02942699-e57aa404a000df88d5d4532c6bb4bd2b.npy +03636649-d3194dd3e07881828f58d8b19de93f99.npy +04256520-ffc1283c098f46cbc6ff4c4f6444568b.npy +02933112-56253642219df29c37d43e094da89ace.npy +04256520-a0ce7fd10e80a9f9f0fb3e3d2a0d34c9.npy +03593526-398818a67897e02fbab0ed993e467961.npy +02691156-4f7814692598ebdc7dadbbeb79fd1fc9.npy +04256520-d8b0f33dd965d49447558b47f7ba0b0c.npy +03001627-d0255120e3351121c3bd24f986301745.npy +02924116-6f764b306282152971a782a4379556c7.npy +04468005-e429a05307bfdefeb8976e45db2e8d04.npy +03928116-4b29f873229621a13a1b23713d5a88eb.npy +02818832-2cd2307d0ff140d71bb5b0562ff6c354.npy +02691156-37d32db3143814fd9a55c6af6f4b2bb3.npy +03001627-b34d40cf68d35685edd5830365d88456.npy +04004475-37f2687738571a0518e2de4e83d3a734.npy +04090263-4f0659c5971bcfbead2649d755c19c29.npy +04530566-396fb90a02afe669258bd22729297863.npy +04379243-91981bcdf94b60cf3e5af54d0ed82d00.npy +04379243-57e4a4a4806c38e33702d3e624608075.npy +03001627-92373022868b812fe9aa238b4bc8322e.npy +04090263-8fbd9668fdd563f5359ad7d9ce49f504.npy +04379243-7486e6cc0f457c4c12a1d8ce70d3a8e.npy +03636649-44cb50f7614a4574d09ae058ff1abff8.npy +02691156-e51b620853f2cc0137678474be485ca.npy +04256520-3b66e52a5272e0b4851fe006c784eab.npy +02808440-b9faf51cd53539ae8bb4434d620302e3.npy +02942699-4852ee95e7bd8556c60396a717ba6c7e.npy +03991062-f8a37a9da22f9e19c2ed3fce8969c0e9.npy +02828884-1d5d89cc3c83bef056f6fc4b4ce1db04.npy +02828884-c67c3e22b0c0f34e7db48c721db3fba4.npy +04401088-528e6424ccdcf2af21844676433a0aca.npy +02958343-204b1b3e35df174859fcf77704d7f1e8.npy +04401088-31e8327ffa4ba6a87790cd6f6e8952aa.npy +04379243-35b696cb05089cdcc8dbe21f531a88d0.npy +04530566-f2b504b2e368bee6d3c2fcae9650358c.npy +04530566-792427f5da01907ddf48ca5a34c88e7c.npy +04090263-60eccc70ad4f9aed15b3bff1113c0f8.npy +02871439-b45ab0b19e7ba07fbad912dbade87ed7.npy +03001627-b7fbbd8cdd2b0b27a37bacfe19b0d747.npy +03691459-5755d5aae08a8f2dd9c568a52c35ec71.npy +02818832-162af9629f9071cd38f8f3d7f64ab05f.npy +02808440-8183d981730d9f4b4c62bee40dcdc539.npy +02958343-b11c0c16e0eed1f4b8671dc42cc45273.npy +03691459-1301670e3ddb72b099284d844aba7576.npy +02828884-cad0a0e60708ab662ab293e158725cf0.npy +02691156-b98a46b40d030e8a26360e1e29a956c7.npy +03691459-6d755a3d6d0f265d77ea5e1afa5bfe6.npy +02933112-b1f23b772bfe59c2f766c600156dc40b.npy +03001627-f33b6f791e9d64387d01b77e04a0bc7b.npy +03593526-6c7bcc925e7c6fdfb33495457ee36a49.npy +03636649-3a58b059261aa07229a42a0444436860.npy +04379243-23b7e640f09dcfabf1477cd05362531f.npy +03593526-97401d5d5b06df3cf470479da1b48414.npy +03046257-3d027f0431baa68a9dcc4633bad27c61.npy +04530566-ff54247b18f676d9129032621d548b11.npy +04401088-69e334b26683a81935bbff93749c520.npy +03001627-70aaed71e394259c87a0ca36e3a00f4e.npy +02828884-4eb3dc26aad9ace8f4fb4dee5181bee.npy +04379243-f7600660924857c0d31d0d81bfe9c743.npy +04379243-25244dda23e8f58d788f926f4d51e733.npy +02691156-de1a7b4e9911e48b48e8405d6c51a908.npy +03001627-4dc7fe6e98c4db21d79b19c7c4f0e293.npy +02992529-a24fb0602fc7fbf4ec059109909662d2.npy +03790512-8134a965cc0b134bb37378f3c85478b4.npy +04379243-480ddc59636d6516659dda512294c744.npy +02958343-1c1a3dc04b6f1f8fd8162cce87567b4.npy +02691156-fc5d7c28e254a0d84c3a35cee92bb95b.npy +02876657-6987e839b802a349a9039b9668d0f11f.npy +02958343-3261855155346979473f10e6caaeca56.npy +03790512-a9e2a1de33b99d08b37378f3c85478b4.npy +04379243-1b90a6d174038fca46ae6b1cc949e238.npy +02924116-b94d71a0d28f79de613cc927c5b662d.npy +02691156-9acef1e2e46120f8fdd77aff53f4b7ba.npy +04090263-a14547884e1ab54f48ae8c3efb265806.npy +02808440-1384585a48232ade2b4641ae88b2ff3f.npy +03636649-8f7863c4940c99211735ea0e092a805a.npy +03211117-f6722edbe92ed28f37b2bb75885cfc44.npy +03001627-491eb8f7028d06152966622c3d8ee695.npy +03211117-37eab42757ae1545be36894b151eda76.npy +03593526-98317e58cb7f2c5c598a453fd9fbd988.npy +04090263-6afd1407c216151994bdc5b116ecd8dd.npy +03001627-b1f85c18b3ccbe3a8bc6f322a9608b07.npy +04530566-1eac28fe0b2d620bf0f75e254acd7ce4.npy +04379243-a1446962064bdf3ba5342d638d0c267.npy +02958343-44eb9496921072b6e5f9082491d52810.npy +04330267-69ad4c4dab82ce29a642711976cdde72.npy +04256520-11b36d8f9025062513d2510999d0f1d2.npy +03001627-54054535e70d9ca0f91663a74ccd2338.npy +03636649-67e03d2c2b7f6b19b38821f893bc10f9.npy +02876657-c80173e23efaac35535deb3b0c692a2a.npy +03938244-89fd3acbd34e72106a6cca39468798a8.npy +04256520-d9d4b2af7ada1426fc385a284336f217.npy +03001627-99a4ced5a15438131ff008919d662aea.npy +02933112-4073ca6ce52b5d65ce5d6e9371bb5c33.npy +03636649-90b0f9a1ac2e54ecbc7f58784fda27b5.npy +02958343-c53256341ac5693c66d89345e534c861.npy +02992529-c1077972752aac54e8deab000196f61d.npy +04530566-cff1998a2a2f1b5985f7a3de54751f1b.npy +03624134-5ee83e84f18782eaffe50f88045d4553.npy +02828884-5d4fd92c09e3369256f6fc4b4ce1db04.npy +04379243-bd974108a3455842668ae11a7db5e82a.npy +04530566-3173f703a1e52d7f38d037116a032a18.npy +02924116-1bfeb10fc8e4435591020bf045ba1fdb.npy +04379243-17936c67b822fdbb6129e6c3b6c36a7e.npy +04379243-53b0206102d236c99f8c3d2002c77ddb.npy +03593526-24f615dd07dab76cc6040c0e6de6a84d.npy +03636649-9c3c8db3c4b29c8e7bcb070cc655f13a.npy +03691459-fbb7610643dae4a34c5341ee07f41676.npy +03636649-3b20c6ffdaf2dc97ef0add8da8532fa8.npy +02828884-cf873b381095c2d43cbc166debd211cf.npy +02773838-adfe9029a1ca723eb8966aeece708f87.npy +04530566-27476b5c965b010618b731fab8bc3743.npy +02808440-8177f9d2397e8dd3d85b29704f5fc7f2.npy +03001627-5c28b7d86cdf577c944bd645bf5a9d4f.npy +02808440-6458583a168aa52af42a90fe4baf4591.npy +04256520-95c9ed9cbdae00eb768c07b3cdb90be.npy +03001627-8b38389cef61cf06fa675450a2f0c084.npy +03211117-3c475567446dc6b7d6f4cef762589739.npy +02828884-cb4c2ef4e926f7c6d4d8765e3910f617.npy +02828884-7a8dbe4a1ce3be987962800be79c6e52.npy +04256520-c8466c51d29e4782dc149927e19d9b07.npy +04256520-709f1d6837ed560bb12cf25c409aac26.npy +02871439-840ffef504ac563cba5b64592e406eca.npy +02958343-cde88b5900e8dfba725a7749daae1afa.npy +02691156-8af350191d35e65cc3fe7930fce05ded.npy +03938244-7a555dba7e9f00549276a66e8d922b73.npy +04379243-3b8af4931096a5b7310cd758d9b7cf.npy +02880940-ff7c33db3598df342d88c45db31bc366.npy +03991062-3dcea39601c77b69a2c59a4d90e63212.npy +03624134-135f75a374a1e22c46cb8dd27ae7fcd.npy +04256520-ae1b6411a089bfabfff16555386d173d.npy +04530566-d09202ccf8fa18d7de6289e76b045123.npy +02933112-5e6c95a93849d3a9cf004563556ddb36.npy +02924116-6c3edb2e494dfb34238f44c3636a01e9.npy +04379243-2fb395d53b34b02fae5873f5a6ed699.npy +03761084-1508af47d1e83932a10831b4711b98b9.npy +03001627-554dbcee2b9ea7301c75d484f9069623.npy +03928116-4a969cd6fc3f2c0a834096795cc3cf10.npy +02691156-cb145792217196e27d64cad20089f027.npy +02828884-aa7f8ad0e6108db92056b4bd5d870b47.npy +02924116-a1569abb031718b9193d7855ecfc1bd3.npy +03001627-c523e86242af4b4ecf6d196856691e1b.npy +04379243-9a2529a1b49282cd6eeb02236344250.npy +04554684-63b49123983e4cf67a31dd5af93fdb5c.npy +03211117-1a5494c28b607f699263b5578aef09fa.npy +04379243-17624075a52c9b15cab01e89f60c9290.npy +03001627-5a95f4fbfbfc55bd93768e7b9b1eabf.npy +04090263-344d200007e2f72e9352b002a7d38daa.npy +04090263-3cb82befc3290e36b58435942a1b4dac.npy +04379243-1d93291de09fa5c876e9713f57a5fcb6.npy +02691156-9712035b78970ca71e623da3c4e40c05.npy +04379243-57f273bd63f5287199e8bf807e902261.npy +02691156-4f1fb7c062c50fb15a2c5766752aea65.npy +04379243-68e8c6def7cd57053e946fb2184f0c4.npy +02691156-e7c1bb596e9a1ce9ca8607f540cc62ba.npy +03636649-e21f21744e65eb1a4ab1b242068f86fb.npy +03593526-9119ef4a6a876ff3664b3b9b23ddfcbc.npy +04330267-177fedf455e50b4d352845ab138522d8.npy +02876657-c82bbd1b1a929c7ce8ed8cf0a077ddf7.npy +04256520-25fd91f0cc5c2e30e1c2ef56608a124e.npy +02828884-fb39d112f22db46616462411d4c2b1b9.npy +03790512-3d37db1d974499287395d58407f193ba.npy +04379243-80131db5f6be83b7d7bf6fb68df7f786.npy +03001627-e93649e36377a12050e52c25df21b57b.npy +02958343-feefd0978ed8e256bc050b2495b2b4ff.npy +02828884-4eb44cf234eb74dfcb2a965e75be701c.npy +03325088-5450352c9ce20b61b362845c6edb57fc.npy +02691156-81bfc74dd037d1ea88d58cc5b9d401bb.npy +02828884-6b7e64a23106bc6ad81bfa7b5196f847.npy +03001627-8cb44a50906b827615e7ec87bf4cc5ab.npy +04256520-f6ef2cc4bb31d953a40f4c396e0c7dce.npy +04256520-e09efbe78b2adfc322d06a647cb73a3b.npy +04379243-7205a833bced185c41bad6f6f893aff7.npy +04379243-1c9aa0fdd563da04c397356311cbeea4.npy +02828884-6d9c95a2409a8c90391e4d6c585a697a.npy +03211117-83ceb90b398df731a8b411915b2949d6.npy +03691459-663174c8076b969eff258dbde860ecfe.npy +04256520-45cc71dc2483972e742728b30848ed03.npy +03211117-c8d02bdfb32767648e4cc49dd8a5f1a.npy +04379243-7fda06ada2d897baadab4c26397edfab.npy +04379243-64d243c58e649783002761e7a3ba3bd.npy +03325088-247e144e0babc15d76c18e71fd49c4dc.npy +02992529-48a2000b54f4fc792a56a29c6d979b82.npy +03001627-d5c67068390ece634060d2cb099a78b3.npy +02828884-9dde18e7a5ea2416cb2a965e75be701c.npy +04554684-a428bf705d0b6a5ddf3a1b0d597ce76e.npy +04379243-cec8fab8ad62fe3840f3ac0af6b7e700.npy +04256520-b3b18a2b0bec3bf1593ebeeedbff73b.npy +04401088-49a51e66314253d3f2a0433fb7c53e0f.npy +04090263-2859d1753713558412b38b1d99376c0b.npy +02691156-f3cbfb52ea1c907a850e00840470903a.npy +04530566-933aa8e54e97de9392694c864c93195e.npy +04379243-9f2dbddee73c639ecea003eff0268278.npy +04379243-92c68ae13848ef32c3bd24f986301745.npy +04090263-12a5e976e028409ca67ac8a08d7e171.npy +03691459-6eecf81ba7508617cee3603bd2c54843.npy +04379243-e8502118aeed3381d5b708f09789d978.npy +03337140-98db6cb890a9776f65ec59d478b48347.npy +03710193-8700fb772854d8c2dab143a63ea21a89.npy +03513137-9c5d16afab1cd899d1f50c75142faa8a.npy +03001627-eea2622d5a8ad64bcb23db7a28593905.npy +02958343-e05680db6f028c15bda733a39f84326d.npy +02933112-190cb7264781df604da5feafe6f1c8fc.npy +03325088-b73c4ec843ff090dc36fb70296e45483.npy +04379243-a9e371d1c714f222716641f54c7a54f1.npy +02958343-ba3e00431d584664c0f081c0bea90dfe.npy +03046257-e8c8090792a48c08b045cbdf51c133cd.npy +02691156-59eecc0a983a27a8130cc35407fba74a.npy +04090263-2c9de4575938dc88d1987c07c912c6e1.npy +03001627-48dbd34c00d1a5ccc9daa743e958a401.npy +04256520-6017c8c817937296e1df71e82caa58ae.npy +02691156-157a81baeb10914566cf1b4a8fc3914e.npy +04256520-6e213a2ecc95c30544175b4dddf5be08.npy +02933112-ca15dd33a276b636d1fef881bd33f613.npy +03211117-195ab29b4e0bcdd07b20cb946bceb58f.npy +03325088-97a5a1bd8e59e98ce2f066782346a992.npy +03691459-1cfd7a56b1d59ed837f7fabf76ffe0b0.npy +02924116-9862dbfa48af20f5353941f152341c47.npy +02691156-fc25e0cdcb2ecf1ca2bd098b9203af.npy +02958343-646359acaac0219f4096f51fd3e2ee8f.npy +04379243-7eea0fef45efd698a22a3fbee2fd609e.npy +02828884-5b24beacd0385489a6ca26b5255a8e6.npy +03325088-1fa1f1515365ecb0b362845c6edb57fc.npy +04379243-146f90f6a4d8c7bd142fb08fcc642f29.npy +02691156-c06b54fce5cc4961c9d5e99e50e5e709.npy +04090263-cd50da8bd34f050af27eb335b754fdaa.npy +03001627-60167ae64899f8ae966a40fb39b34846.npy +03691459-c389dd22f9209798f72fe2e3cc67d234.npy +02924116-cb5239d87f4d903b6df42853f67b5836.npy +04530566-ec685f1f4bd71a191bf585548743bf8.npy +02958343-875bc6efc7f33c052e877e82c90c24d.npy +02924116-b2c1a1240442a1edbd2004256abd019f.npy +03642806-fd2f7a1c6eb7a0d4803dd502eefd8dc3.npy +03636649-3ca8da93aff926a4edd822c7d5ea26ed.npy +04379243-5807c27ba3c04612f51f77a6d7299806.npy +03467517-1b65d2e0c0ed78237e1c85c5c15da7fb.npy +02691156-6aeae52e38f892a7e0091ae06332b2d5.npy +03001627-748d7e99a0ed4646f4b6538438a0b930.npy +03001627-8da91a953d645457456cbf78e1e89022.npy +02933112-429488f8be42c9ed73149e0cf45b2c4e.npy +02924116-290c67589cbf5a1e52470de2774d6099.npy +03207941-707e9078bd63a41af7fd77472e77581e.npy +04379243-a6fea71cb6bee0ccf529ce6ea3376441.npy +02828884-b65f1141e4eb2529100a6411eafa7455.npy +04530566-63f170670881b2deaf6320700e3cf173.npy +04530566-b00e1af5a8d0674efe9d6d96542b8ef4.npy +04379243-8b3bae4e65ee0f67caf7718498824d44.npy +03636649-bad4a1e98a6111f7db48c721db3fba4.npy +02958343-235392f8419bb5006a34aa94ca8a3355.npy +04379243-711075229a3bb0fff51f77a6d7299806.npy +04090263-9af23e8759e070ef35d753857de68a9a.npy +04530566-b25e91edf5510306eb2c303a0e0d287b.npy +04256520-73e342d3bef02e923d6e282938a47f9e.npy +02942699-c3e6564fe7c8157ecedd967f62b864ab.npy +04379243-f2797245a220fbf1850622797c13f562.npy +04256520-a17c259d1af349dd45c21ae2e309d69f.npy +02924116-c6861c7c959431979868593c91e945f9.npy +04530566-61142394175b9e2b6a42e03bb7759e0c.npy +04256520-f67714d13805df294b3c42e318f3affc.npy +02691156-3b9241e85d07de6a8b6c3e7b944b34fa.npy +02691156-3e0e8b37400e290125b57604d8b9519f.npy +04530566-bc698a05ff49b6e06d793283e2a4a87e.npy +03001627-5ed72ca90351b0c4d5b24cafb84903c7.npy +02958343-6265f0745d3f40546bcd32c43682e841.npy +02818832-a2499fdc5535875087693c0a016606d4.npy +02691156-18d994c4f8362cfaee9d01b4b18e1b2f.npy +02958343-33211aabfefa14603b05c2ad25b4380f.npy +04379243-b84b06178cb49ee171d0a1a8ffd305f4.npy +04256520-16fd88a99f7d4c857e484225f3bb4a8.npy +04256520-6a2f4e3429093be819fb4103277a6b93.npy +02828884-29aa1d7505e08fb66706998a3e61629.npy +02992529-5e87bca3231cbdf15b5f05be350ae67e.npy +02691156-e812f54386acd072d44f37c9e0fb10d0.npy +03593526-af61c129521b9a36ad56360b1d2e97b8.npy +03624134-7855c181c65e964a7f277d7152b6b3ed.npy +04379243-8af2d1420ac255be490ad276cd2af3a4.npy +02958343-fd3c767468a825ba860800e6696b8284.npy +04379243-ad62637a77b172af3542091189dc62b5.npy +04530566-c746175e0993abc19a6e43b878d5b335.npy +04256520-5d15e6c23f233a13ce60514f9a637ce.npy +02828884-748e447a5f7a698df155d75bbf62b80.npy +03691459-e22ec5ee664f7c172a9eb0f146e94477.npy +03325088-7719e435d30b6aed50da8b99982a3057.npy +02958343-8f7520f908ee54e2391da6d66c78fad2.npy +02958343-6058ad4a6ec4eba46436916a86a90ed7.npy +03001627-c133c2af39e7d169b1a9ec000a076431.npy +03001627-273fe8996937648ac8744f5d8b9af88e.npy +03001627-766d7892fbd7a9f58d6e12c39b2d5023.npy +04379243-3e4cba53909d9bc8455060ebe53aefc2.npy +02958343-61c4db4cd886250f473f10e6caaeca56.npy +03325088-c8b9f478f3b94b3513bcf6712568dadd.npy +02992529-cd74be6a1d8a6cc721844676433a0aca.npy +04379243-782a5262c3d349e3c3bd24f986301745.npy +03691459-ed0f8fdfd9e1182cf83b540214901572.npy +04401088-953a952a18e389e4eb386a4e845c05f5.npy +02691156-24d4c063f7a361bacbc6ff5546f4ec42.npy +02691156-bfcdf2928e854d109b6724d4f3457e3e.npy +02958343-d3869e2527ff032623276041d0efb3cb.npy +04379243-729673ab33a7c9cc4d3a0a56bdd58a7d.npy +02958343-a86655c0ca05c2646d3e11439c6c22c8.npy +03636649-bf792ee1a5570858d0615e6a68ba2d50.npy +02958343-bf493207165e9359492225f5fc55e666.npy +02992529-4b97582ec707108c6ace02f573c40387.npy +02828884-edac7cf37d1d7a42c79156efeb6d05c4.npy +03691459-3fa5d9e396596d36f7d10596716a94c9.npy +02691156-a9b2d531e073113f9d1eb836604648db.npy +02992529-7f6a27f44d8c9f2bbcde31492651e03.npy +04379243-33b727a7c5e984bd377c09d18bd75e8a.npy +03636649-29a1afd3e6c25af71b17743c18fb63dc.npy +04256520-2434dbf29922a0a44cd8f60141ab9d6d.npy +02691156-5459029489f68030590874dcd9dc8481.npy +02958343-fa8ecf7278bb320bb7ecd40416f4e39.npy +04379243-895c87ab1c2e404de7c7920f6a65a54d.npy +02828884-84e95910bf6b0b3bb411c6406cd0f9e7.npy +02958343-174f1a421f652029d577c0ac53e96823.npy +04379243-9f321f05a7808719ab610b0c94236463.npy +04401088-55698d990b8147e33c7b6ed91d531bc.npy +03691459-c7c2dcdb1f3e85dd35cd53a06b1d2317.npy +03337140-533fa6cf9a7e1e724c3aee8e9d3a6ffa.npy +03046257-49aa40472dfb892ac5d70d7dd4a0dae4.npy +04379243-8ba76dfda765f72b7c363db824bff7dc.npy +03001627-4e26eab28703c12bdd5f3f2440a93d21.npy +02828884-644043e43b18d2fb4ae9e8fe36a5d4d7.npy +04379243-3822433e287ad25799e8bf807e902261.npy +02924116-b501b9b43dd02c2beb2c303a0e0d287b.npy +02691156-93e0290ab5eede3a883f7527225435dc.npy +02958343-84dc5b9d1a60419b7cbc6cda01aaca49.npy +02691156-4ed01f44e3e422dff64801ad2940cdd5.npy +02828884-c3ce87b94f493cba4ecb12161a6eb47c.npy +02933112-11224ef64e1702b412e0c474ff07001f.npy +02933112-fe5f6a2aab0091438860c69ebde1e4b8.npy +03636649-caf2efbfc9ebf42ae068fd8aad8767f3.npy +03691459-47f062aeb83f19e1618595b659cf68fe.npy +03001627-8e7f354489bf4d9b65684b1827478535.npy +02828884-991c84609666c015da34af5fa7da2314.npy +04074963-5938818cc2f2cfbe9cb9203a133c0554.npy +04256520-2477014dfd55144ded526a7be77b30e.npy +02691156-c9584d90a1da19f723a665a253ac8cae.npy +03325088-8e912dab210f460778fe949fc1419876.npy +04379243-951a9c85494b53993c2e50348f23d3d.npy +02691156-2dec9e7b1acf88fea8e091cb544689d5.npy +02942699-c802792f388650428341191174307890.npy +02828884-b03c1ad073bf95cde9edcfa70ed557a.npy +04401088-5fefcb474b6dca4b23b380c931ece1e8.npy +03001627-3d67836a3bff5f733aaa67d66207f5e3.npy +03790512-7c34fdccf25e4113d5dde04c96fd8146.npy +03325088-24f5bd8d409c7d89b229726a165222c0.npy +04379243-57afaabf994feb305512673aa47c7e3d.npy +04379243-6358336cbeedb9232d9fe390e23fd20f.npy +04256520-8634968c859b2dba5e4b35ff1ea95f37.npy +03001627-2d0344ee62954b0afc4743bde9e89079.npy +02924116-486ef7a6c13e67522e8c450c92d469f5.npy +02924116-6747a3af99c639e683d931288a9d25a.npy +04090263-315038c85d3e3f4a1a857c47fd0ecdc3.npy +04401088-fe02978cb3b6fcc4cec837e48e8de67.npy +02958343-cce33c56b1c83237c7b48e36e31209b9.npy +03001627-5f8b70c628c7f6fcd4fd21ba7448467e.npy +03211117-3ee0923254671a1ef2bc9da1ba799c60.npy +04379243-5b75e36e302eb2cee9b7ceaf400b2906.npy +03001627-b08dfb07c78a348b19fb4103277a6b93.npy +02933112-a5d193fd45690070b93ba26740e73067.npy +02691156-5e34c340059f5b4b1c97b7d78f1a34d4.npy +03211117-42ad980a4102f1c1bac465483662a51d.npy +02808440-a6c700ba871bb9d7f76e18bed49cf55c.npy +02958343-80ac9cc0d4c9dde3b7a7bc444c2d756b.npy +02828884-8967e65c1541d1874aa7f42ef07f614e.npy +03790512-eb74f2365d6a55c212fa50e85877ced8.npy +04530566-379fa7ba7c753376619ef21bc094a137.npy +04379243-81eea4f86f308c6a589aae130c1f06fb.npy +03001627-b6e662b81c62dc9b688f5a44034a346.npy +03467517-2e2d2d6dbb316502872341b062fa57a9.npy +04379243-43e2a0220f1fbb9cc1bb249ae60b3bdc.npy +02828884-e9491a1e77cb2a65cb6a91bf3956b490.npy +03046257-757fd88d3ddca2403406473757712946.npy +04379243-d67a0b5dfecb565f2197da8dec8488d.npy +03211117-78e3dd96ff1dab94e20f4d2769bff1e6.npy +03001627-7dc1a66d228c8787e39e97231748e33.npy +04468005-e3f9be0bb0da7a23e70da94675b5e3ad.npy +04379243-9ea5a3905313b07e3d752b0785b76136.npy +02958343-2e5ab446d0767e1aa6dd909dc6fc8d4.npy +04379243-5b31b07efaee09fde63a9e8397b31118.npy +04090263-86db029236b5dbafcc34b900bb2492e.npy +02808440-dadeedcb7aeb8344fdbe2bf897d8a820.npy +02691156-7191b4709d5142a1f86c2bd4e090c60d.npy +04379243-28743475c1892193b0097f8288b985a5.npy +04401088-bacbf0d14e0cb5df6a802ef1ce963117.npy +02958343-93a813f96365c108f217b9504689397.npy +03001627-85208e245c49fd72349bb1cbbf9a4206.npy +04090263-4adfca873edc6ad8566f788c330079dc.npy +04256520-20b6d398c5b93a253adc3470b30138f3.npy +04379243-562288b15bd065d4b29ac64be50e118a.npy +03636649-d05b908d82722b5ab15194162f658e87.npy +02691156-4bdb2c4fc6701174ca8607f540cc62ba.npy +03642806-92e6341ab62ce4875c0be177939e290.npy +03001627-ca84b42ab1cfc37be25dfc1bbeae5325.npy +03046257-835f94a1d33ac78bdd7f1cd6f7ae0960.npy +03211117-f4877a34163978f84efc7e7114f1b9c5.npy +03636649-c904c93a0a1739e5f51f77a6d7299806.npy +03001627-cf62f90e75531ac63cf953ab4f77463.npy +02933112-1a46011ef7d2230785b479b317175b55.npy +02747177-872810933ae35485ad5067eac75a07f7.npy +03593526-8c6d7ad2b0674bd61952fef39dab6347.npy +02747177-44ed0531eedc723dfaaa4370fa1ccec.npy +04379243-eeaa44341a57c0cfb9531c981c83e1.npy +02946921-203c5e929d588d07c6754428123c8a7b.npy +03001627-36a2d17d63dc83f983c05814b11dc86.npy +02828884-6a5ba469761d03c0d60ded25865ac76b.npy +02801938-44ed0531eedc723dfaaa4370fa1ccec.npy +04530566-5f2ddca70687dd3062ba640dde834b4c.npy +04330267-40c7d35e40916b3d9c50c94ef954cbe9.npy +02958343-444829c02bec2ede60d2daa56695faba.npy +03790512-fb5d82c273bdad39359c7139c3be4ec1.npy +03001627-738395f54b301d80b1f5d603f931c1aa.npy +04379243-46cdb3dd8b6c460d473f10e6caaeca56.npy +04379243-2873620cf8be87ec798432661977bc1.npy +02691156-54984229a5e704f2941d71475449eb25.npy +02808440-a5da160ffe4b697e35c5b7b901a05c6e.npy +04256520-660df170c4337cda35836c728d324152.npy +03001627-7846afaf010913e4110b42f6d9481f5b.npy +03513137-cfd3bb444cb730458636fc327bbb2619.npy +03001627-e84d39ce475415399f165f18603a28b1.npy +02958343-d0ea101dad5bc464a134736201a79843.npy +02876657-b6261066a2e8e4212c528d33bca1ac2.npy +02871439-61ebec53da40801f99e8bf807e902261.npy +03001627-3f04a08d840c0a9c18b14db3b83de9ff.npy +04379243-d37205936d372513ff868cd4e441fef3.npy +04530566-b71deabf89e42df5cb167b89a3c3ef9a.npy +04379243-d013cc09fdad8ecca282c4787019214e.npy +03001627-977b3355b3f93b09e6fe3612af521500.npy +03046257-56f3829b744dc836158322a6470db5f7.npy +03593526-636eea1d5a7b3c61fdbe2bf897d8a820.npy +03325088-a1bf1c47f2d36f71b362845c6edb57fc.npy +02958343-2a9b4308929f91a6e1007bcfcf09901.npy +04530566-11e04ef8f037194919869180453a248.npy +04379243-9913e76fbe2c438f4bb836860bc1cca3.npy +04379243-7ad23def902ea4f37b7a2c2624e46d0a.npy +04530566-859daa33e58191bee2d4c157e5bf1dde.npy +04379243-11520534ea9a889c7d36177f6cb74069.npy +02691156-d8a43017132c210cc1006ed55bc1a3fc.npy +04379243-8eb85236a450db4c44e1d3da2eab581a.npy +02958343-5f78048536beb320afe1d4530f4c6e24.npy +03325088-78e4f87c3e5580b276c18e71fd49c4dc.npy +04379243-1509a8710d2fce3c4785a5d3b6c47521.npy +04379243-fece36426ea77b92a7bfc1660a1e18f0.npy +03001627-4e9d664144f4249d8957917d005717e7.npy +02691156-369244d49f8f1308b858e64ff0fa8db3.npy +03467517-667746d97ffd439868ef8f8a433fc787.npy +04379243-81514408605063ccd7be956e59a3bd7a.npy +03046257-d3ee26da2bf297d9815b2b467e8e2eac.npy +03691459-10d03876d94ec5f4e7670ea63e6cabfd.npy +04379243-2fdc21532b09d7e37f768772b7a990fa.npy +02958343-e6846796e15020e02bc9f17412005422.npy +03761084-6db8ab6c9693a340575f4e5007488531.npy +02691156-8a25b5ee4421f96a349a1add3c9c4a87.npy +03642806-d2eabcc071cec6f420bec9be02f008ca.npy +03636649-c816540b4e0eacd57697d9c3588bbfc5.npy +04379243-67a9dcc974fc402552d23bb2388b1b0d.npy +02924116-458aac785c7ef79455467fd13bb5a6b3.npy +03001627-27c476533e66bc04b21bc3cf138f79e.npy +04379243-33e59bac5a2a5c5e8300cbd55c34dfc.npy +04090263-60cd2f3d326475e829c6b4b73d88655.npy +02958343-ec5c003421112630f53148c8cdf6fc9b.npy +03636649-495af808806f1727a753b1b88fff4abb.npy +03593526-1252b0fc818969ebca2ed12df13a916a.npy +03467517-3ad4c0cc3aab8cf31377689fa4e4b2d6.npy +04379243-d045064064381237e9ada1586a8c9364.npy +03691459-6b9dd73a65dd50a71ad88f716ea80910.npy +03325088-6f954843bec713b6c36fb70296e45483.npy +04256520-53eaace9bb8bb34ab4fa97f642d1a681.npy +04468005-30892de05b7136a6e810c01b1498aa2b.npy +04379243-be9467a2641fb58330bbb59b54a585de.npy +03001627-762e86b38d1428fe78e6c2bcdf90770f.npy +04256520-c9c0132c09ca16e8599dcc439b161a52.npy +04379243-e7580c72525b4bb1cc786970133d7717.npy +02818832-4954953090ca7442527e7f2c027f7469.npy +02924116-2a46fe04fdd20bfdbda733a39f84326d.npy +03636649-e3ee6b31e54e95b7d42b9650f19dd425.npy +02691156-9ac7fb5963ae673f7d64cad20089f027.npy +03642806-4573c3dc7525a4754145b5f47fac09a5.npy +03001627-676287fd6b02428f2fe023c7dc3e5231.npy +03691459-e62dd51d47ec4e2ec29f84f96a7e29f.npy +03636649-9534bb19e66fa5cbfcf6007208e5f114.npy +04090263-6529b6134cafc299d43bb185feff0470.npy +03636649-594b2fcea3d15eb4fcb8d8c6d4df8143.npy +02958343-9eaafc3581357b05d52b599fafc842f.npy +03001627-a554d5e0eee3109762411d0498399c28.npy +03593526-39a8179c80a38ee130612f5c0ef21eb8.npy +04379243-fd7f26ea3a1d1cfab092f06f28d82d71.npy +02691156-8c2d5c6dd599a5bb68c7efc443fd2354.npy +03001627-48015ffd76a443f89f8c3d2002c77ddb.npy +04379243-564385b1081e9ab760eb699207aa149d.npy +02773838-8ea3fa037107ec737426c116c412c132.npy +02691156-a359cd0297d4e655a871065f9ebc6ac5.npy +02958343-554bfeff3c44a3d6425b2c354eccabaf.npy +03337140-72bbf19840933991bdf5f95bea7759e5.npy +03467517-6fdbbb1a44f2ac2854b87c21f44ed61a.npy +02691156-e79e9e1c8dae48888ee1ba57de3d34e0.npy +03046257-637237e978d5168f9751189c905e470.npy +03467517-28ba8477fe3db939d57700c05b1862d8.npy +02828884-b6e3891b9a761300b77f0c4f1c150c3f.npy +04379243-9e5973d8a4ac051f6e71174964d90e49.npy +03001627-8bb74c3e07557ba9177f2a3a0c71fbcd.npy +02958343-f60955dcc1d1c48687dc1da2515df8f7.npy +03001627-bb9efb4912a018b3c329e2758ab09ecb.npy +02933112-8f453f19fa9396a7824662341ce2b233.npy +02691156-1e44b99c8de5eb01ebc54ed98d6399b2.npy +04379243-b2eb5e56fb8342f81c25d54737ed5c8e.npy +04256520-14016326133a68c72897bf4febc9c106.npy +02843684-689f228f64564e663599338e3538d2bd.npy +03948459-e9d193e6c5ae7a4e265b6d46c677f2ac.npy +03797390-1ea9ea99ac8ed233bf355ac8109b9988.npy +04256520-781a7cb1d7f9347d7ec5a98b3b8c425f.npy +04379243-a0ccae355918b63714038d588fd1342f.npy +02933112-1d7b35cda1bbd2e6eb1f243bab39fb29.npy +04379243-85b930a031d9036481aaf17ac7662991.npy +02828884-9f27ed5d7877a38fd46c340938e2ff1c.npy +03513137-7a0772798520e9e141bb12648ac801b9.npy +02808440-6be2b6d4aa8124a34e61c48313846944.npy +02924116-ea08e81401c6e458490ad276cd2af3a4.npy +02691156-125417c3fa9bc1b130f57e42c77d3894.npy +03691459-81b711a75b8781956faee4308b49b522.npy +03001627-7932489d9aa9fb58492d9da2668ec34c.npy +02691156-1ea7a36e4f353416fe1f6e05091d5d9.npy +02958343-cba0b54cd104c411e9d8921ebe6d5b8e.npy +04256520-4c49cab86dc3ffd2c84c076312b543ae.npy +03001627-8cfbde91dc175e2ea54b9afa882a89ed.npy +02933112-8f7a277ae05da76c1bb088904f7cb154.npy +04090263-3e5711b79fd4876a4ef2a27f51a6e36c.npy +03948459-1115b4018238385ef1714763a5a5ab.npy +04401088-313e9b124e421a4efa9922db9b6aab31.npy +03001627-5ab67b30e17a2ed1c862eec8232fff1e.npy +02691156-fb01f6b428d094ad3ec83bd6bef75c92.npy +04530566-b820d42d6b9a08a03cf31426f0438400.npy +03046257-d86dcc32261d58424b3c42e318f3affc.npy +03085013-f6517b0bad40b72d36871b478a4420ba.npy +04401088-f48cb1a242e99745ab905891b6fa1a.npy +02958343-e15f9acabfa0adc5470d3ca356fc4190.npy +03938244-75c1215326a32653de03ab2a27ba7531.npy +04401088-3921288228020482b305960cf7a7281f.npy +03001627-72beb9225a841cef24367084627d607d.npy +03001627-48fe63616e70f84778ae896933c670d1.npy +04379243-167559b98bf6139712d9440c7a73ec3c.npy +03001627-8b5f8b83715a378e473f10e6caaeca56.npy +04379243-d14bcc93169f80d9b2d5d82056287083.npy +04256520-3a503e0e9b48a8925ff61a3a2a0e2484.npy +03085013-1e11af6fa598cd6960113b959388060d.npy +03001627-36f85b1709a62c406daafc9da8386a39.npy +02958343-d679b2dd7a7d6b1da71ed5958a35c6.npy +04401088-f73493b7c8a78000b594bbf2c494ab81.npy +04225987-fd3627deb2476b0f1f942c57ac0e8959.npy +02933112-9bf9e8d47f7b996263d977b06bbd429d.npy +03636649-fdc4b403601fedf955b7716fb9f91d35.npy +02828884-e56b95381904bfd08ccde000e771fc1a.npy +04379243-ab8735a26c5c9ea4f8574543281e850f.npy +02942699-89f0e0da4747aad1172ac9cfeff21994.npy +02818832-fb9019af9de69ffaf50f16ba773dd73d.npy +03948459-efb488715a03085b9f433921788191f3.npy +03593526-1d7868b4ad0913bf9f6b966b784c8347.npy +03624134-bcd7ed830358dbd6d58ea69ee1ced10e.npy +03467517-16bc13ee237ebeb38460585fe283a1c9.npy +02958343-1f191e0327ce54474cdd04162f008888.npy +02942699-509017601d92a7d1db286a46dfc37518.npy +03001627-9061324684c39682c2c449c0c0579ec3.npy +04256520-4c92e530e76f4ee3febad4f49b26ec52.npy +03624134-342f17b5c8b892311209554d4cff7188.npy +03624134-cb188764e239f18d4282aa337cbc8f81.npy +02808440-4d3a9133a7297ff54f0ef2e216a06871.npy +02691156-3e7e119508f0abf935fc197bbabcd5bd.npy +02691156-21a1049ee5b7f531bc0909d98a1ff2b4.npy +03797390-cf777e14ca2c7a19b4aad3cc5ce7ee8.npy +04256520-279150abc1b0b0b75369e32fb818f337.npy +04256520-fdca3e183b3d1eca45e6e5503635ab1.npy +03636649-dbc50a84c8d24f9168c981036afdae64.npy +04379243-1299579419252fa954b02959579aa6bb.npy +02876657-d45bf1487b41d2f630612f5c0ef21eb8.npy +04379243-3f756d8d35b51ad629e4b5aa807bb4e7.npy +03513137-48b7dafda49b9175365930cae725a1a.npy +02691156-da9d111e1175d318bbf3143b1cb6076a.npy +02691156-e25e3dc95243a92c59bcb260e54d3785.npy +03001627-216821d05f00b1ccc3bd24f986301745.npy +03710193-8787c825338116b2ac6beb6ececaf6e1.npy +02691156-7ecb807e2270606619ba010ddb4974fe.npy +02958343-2ccc8183090b97cb21a66e8dfcce514a.npy +03991062-b2b0dd16870742a2fc41e59f3518733.npy +02958343-44f30f4c65c3142a16abce8cb03e7794.npy +03001627-e867483a25b070ed89ccdb4a5b6b972a.npy +04379243-c5b224f6fcdbd7e655f46d55537192b6.npy +02958343-e57092f6c51ed37dafa781871c8b9ebb.npy +03467517-a64761b5f748cc61082f2ea630bf69e.npy +04256520-a0baf84e4bde88691912372ddaeb001.npy +03624134-d61a5fa6dc3f703613abf93d1c879c43.npy +04401088-2c32c1b5d13074431c1943a82a09125f.npy +04530566-325c2da58c641c12e3bdba9430565083.npy +04256520-4444828846fc38269fbbbda5e1d9195c.npy +02958343-b782800ed15ae74c6227cba038bf7c95.npy +03046257-6bd4036a2ef142fc956e5f06e8cf4db.npy +04379243-df3f7ccdb375675fb145a08fb49c17fc.npy +02691156-aad69c419b27d6744d8e7d3c15c98c3b.npy +02876657-b45d6cadaba5b6a72d20e9f11baa5f8f.npy +03513137-f232d07e98fae2d4eeb425ad8cf9eedc.npy +04090263-29f33014b958d37e6d25219b6c577d3f.npy +04379243-8797234d59d03951bcc69f56814897a1.npy +03691459-7a48d550ef85f41d4873a2cc06a4fb6.npy +02933112-74c058f9f24fbb524692707833167ca3.npy +02691156-3cab1ffcff8b84cbcad035c2ab458.npy +02808440-d8ee3cc88f58ef06a39450bfd028c5f0.npy +03761084-faf8ef1f6f78b75bdef92a6dd2a4a6ef.npy +03001627-4f1f4c4d1b2f6ac3cf004563556ddb36.npy +04256520-8dd277fd02903b82bc0e720bd48e2c3.npy +02958343-db86af2f9e7669559ea4d0696ca601de.npy +02828884-84cd6e96a464894af132460d3f8b116.npy +04090263-77dbed07aef42a5e3b9e9f1cae8061dd.npy +02880940-9c7edf31042fea84df95dda4222cd1bf.npy +02924116-6cc0a9c53066efae80288501d9901d7b.npy +03001627-548ab6b6e8b2dc505ff61a3a2a0e2484.npy +03948459-1e83ef6ed5d0b78b7efb854782e23566.npy +02958343-ee5839537440f8b6f2e4b4084cb7a07d.npy +04090263-5afd33d495b111449a2ee232a197081e.npy +04379243-6ca761172d2c1ba3ce522e6dda26fb51.npy +02876657-829ad86e645d11b1bcbe24a1993b1795.npy +02691156-70bb20cf86fe6afe76b85a01edd4a109.npy +02933112-1aeff9aef2610ee1c59350d819542ec7.npy +04530566-3bd4a80ef718b9c9a069f11e22e91bb4.npy +03991062-8c278785a66bd82ababc8956356bfae7.npy +03928116-66428302f0c879c068661782af60b711.npy +02808440-210e770d7cf45629b362845c6edb57fc.npy +03636649-3a3d292307c4831f4dc0ed4c2f72c4cf.npy +02828884-2b065fc9d62f1540ad5067eac75a07f7.npy +02871439-b12a523931d15b49a169b9ecd9e046dc.npy +02691156-ba0f83a82b18613d2350d07acbcc057a.npy +02691156-1169d987dbbce76775f4ea0b85a53249.npy +04256520-970aaae286331b9cfdef1c01cbd4ae0c.npy +04530566-485f63613911c93fd316c98a55307c24.npy +04090263-5df501ece93bd3f522e2c8abc98c5f41.npy +02801938-3e88bbe0b7f7ab5a36b0f2a1430e993a.npy +04090263-d33dd32b628e46f1d483df64f44884fa.npy +02828884-db8f61eb5dab7b26b7710a2fb1bf7a26.npy +04256520-3746c2c38faaec395304a08899f58b0b.npy +03991062-4bfda925e35d32df2f4930ba29aa525b.npy +02828884-f98acd1dbe15f3c02056b4bd5d870b47.npy +03001627-49795a9ebd9a9c6d2c697f0a1454869.npy +04256520-a39fcabef17deeaf593ebeeedbff73b.npy +02828884-496f1d6cdd0a0aa247b74f4d1238a1fd.npy +04256520-a4c8e8816a1c5f54e6e3ac4cbdf2e092.npy +02691156-e5fe5ed2cdc8b11d62b600da24e0965.npy +04256520-6c6cd4a17f142fffc3c1d36485e9888e.npy +04379243-bb93a65aa5768c557b9c6deef486a7d8.npy +03207941-b93e45ceb3030c473321831d2245cf06.npy +04256520-9d56b14e39f4c1f9ff6eb780c82e5ec7.npy +02992529-c3e18e5d0f7a8709e41b17b375798648.npy +03001627-794e80fd66c833917d20e6f91e9b2f9.npy +02691156-80770c90ba84524e825b20c2472ad90a.npy +02958343-c911f8a7084e7929593b8de380af24a3.npy +02691156-3bff0d84311470a357f53fe209e96fca.npy +03691459-5679f86d9eb0bd1ed4ab0eed66631cfe.npy +02958343-21cb55aae53e3eb351a95aaa6caba1d3.npy +02808440-5b8badaa652f4363210c439c61dd9b9e.npy +02958343-f16194da236b7c595264a3f45260d821.npy +03325088-eb5a55c6f9887aceb3425db9d50d5dff.npy +04379243-cd94233033b1d958ef2438b4b778b7f8.npy +03001627-42140baad25c8598baa1a4ff2c45ffc9.npy +04090263-9384db12f13af3e4e1abf5082bc04e75.npy +02691156-8d49b7496a2575d5146e44cc99f07c52.npy +03636649-b66524f44170023ff7248d9dbed7a7b8.npy +03046257-7f5f3d2526d1c5a46463df620b7b4cbc.npy +03001627-9dc77fb24cb14e5b3abfc4d0a5688916.npy +03790512-346e30470cfbabdd7395d58407f193ba.npy +02691156-8c11ef88dd944d00fca1f1143bb6bc17.npy +04379243-8bd8776f65913f17b3c03e06e3a5c3f8.npy +02958343-8fc220461ea512f3abeba927b56dd398.npy +02933112-919591b27262702ad0b36851d61b6fca.npy +03211117-4736b46f6cb97d091e02c9947dc6e279.npy +04379243-3ce930bb150aef8a69fb38085fbc320c.npy +02691156-2bdb44eece3409a5a18e0889038e4fb6.npy +02843684-7d5679fa05d7ee982e1d0f368aa4d2b6.npy +02876657-cb3ff04a607ea9651b22d29e47ec3f2.npy +02828884-c2c788ec4dc9f467d85a7a4d55e9b869.npy +03001627-ff529b9ad2d5c6abf7e98086e1ca9511.npy +04379243-d064b468c3cf683cedf48f9fa39262b.npy +03001627-acef669b784a4fec1b17743c18fb63dc.npy +04090263-aa21e208420cd4c2202be79d8b285c1e.npy +04256520-948923ab76b8d9efee7d178666aae23d.npy +04256520-187386c46e9fb3a44b3c42e318f3affc.npy +04530566-fdd7433470c31c8b5332ddd5fe4d4fe0.npy +03001627-5b68a6c2baf0ad61d0de9c949c366777.npy +03636649-a524e5a1d81df32b68b4a15ea963e059.npy +04379243-8ee93ff23d882efef3eaa8afef8adb8d.npy +04379243-b063b55df11f5df434b168be15357fd0.npy +02992529-ebb6035bab99c3e221844676433a0aca.npy +03001627-8ec95f15623085a7b11ae648ea92233.npy +03624134-1943c87f92ac76e112cad8be168fe72d.npy +02924116-3b7f02cfc5be11825c91439f98ea327b.npy +02876657-2f4cf418cb91949d38fc23bb1b265fa7.npy +03991062-a537c640764baf41ffc6e457221b9271.npy +03001627-a248417b6ba82801610c2a68437007d6.npy +03001627-eb8073ac89cf7b4181f667e2a25e0619.npy +02924116-fcb54368287c9e10602b8b650088ca6c.npy +04256520-7061f5384074da6d6f37a8be59c15bbb.npy +04090263-61a502275b50f6624a38706cd8ac54a1.npy +02933112-a248de70fda12c5af27383fc5a5a711c.npy +03001627-6897c2665267cca39eea64ae4d2b4158.npy +04468005-9130d6c4b0823dacc9de7b195ccfa970.npy +04379243-dc0e0beba650c0b78bc6f322a9608b07.npy +03636649-7d77f1dd8bcf114ab71c4c06094146e8.npy +03001627-106a0dbaead5066519fb4103277a6b93.npy +04530566-2a9df36f9327beb27244f3b2d7f5074d.npy +02843684-6918606915c91f0ec5c86021644af7b5.npy +02992529-bf11938460e160c78190e4bafebe046b.npy +03593526-488139f06d9905d830ffab76baff35a5.npy +02828884-10db917982072df1739680f4e31f35e0.npy +03337140-dbfffa51bd4f094353227dcd0d547ba6.npy +04090263-cced6c0c2bd60368b0f24bb611f821a8.npy +03001627-1512e3c41de7a461e10a48f2bbb9bef4.npy +03001627-5932d26671d104d76370a012706ac174.npy +04401088-e8508eef82fb9163a1288f74f9304471.npy +03001627-730fc3ae87640d952c528d33bca1ac2.npy +02992529-dea7ce7ab01c08dfd4ea3f4c41b1b9bb.npy +02691156-b552a6155c5b340e70828dc2c11733e1.npy +03790512-3fd1bff496b369f71765540024eb9fef.npy +02691156-1e358e70c047687a1a8831797284b67.npy +04379243-bba5ce8555c8fa89ba18ade30e563d37.npy +02942699-fd058128095abf343ce579773d34f5bf.npy +02828884-3c2ffb35d0b3d831e1aab65fbcc9b689.npy +03001627-3d7ebe5de86294b3f6bcd046624c43c9.npy +04090263-89f53c736eabcca966c0c88d96ba938f.npy +02818832-1347959af4df977a15dd7d7985e749c1.npy +04256520-9b94f7822f3d73e84b509f4ddcfa8ca1.npy +04090263-fb11e17c9dd72d6851cfdb4c9f126c12.npy +02828884-554a52dd42ce558bd2b12aa6a0f050b3.npy +04379243-a4473d9c69324b492c026fed19c0d206.npy +03001627-9ecd81b505ac3a175634c21965ee6bab.npy +02691156-563cef4df464ddb1e153dd90dac45a6d.npy +03001627-89133468bce0e63f8101accd22c701b9.npy +03691459-a4ffce648faf8349e651a075b3dd0597.npy +02958343-10247b51a42b41603ffe0e5069bf1eb5.npy +04090263-1c0d3cbd1bacfa815f8d7780d59bb4ae.npy +03001627-37b432326fecc8a1327289c00b6dc9ca.npy +04256520-3e2cd7495af88fe352e393d25dabbb72.npy +03325088-efd013235615a4924c62bee40dcdc539.npy +02933112-27e65f34c3b8dd7f490ad276cd2af3a4.npy +04379243-3edc519c38938ee8d42b9650f19dd425.npy +03001627-9c103621101bcf9919fb4103277a6b93.npy +03001627-670b6b7d3fe6e4a77c5a5393686fdcfc.npy +02958343-4c3b9ecbafc80b9cd485372bb746f3c7.npy +03001627-d5bd619acad1bed3d2b12aa6a0f050b3.npy +02871439-225da2a2b7a461e349edb0f98d2a2a29.npy +03691459-3ff725e1e30e4ed6a939d6b77e949639.npy +02933112-69544db102786237f51f77a6d7299806.npy +03001627-3ffd794e5100258483bc207d8a5912e3.npy +02691156-4e1dfdfdd417479f49e1f7e01fe2ed1.npy +04530566-5ecf8b2c217b840fef5e991e1c32e94a.npy +03001627-d81327c591d1a709377b9297f3055210.npy +03636649-81e0c3b0d851492fb79ee87044437bbc.npy +03001627-331f49270df51b2e5bfcb9d3e84d74f0.npy +03046257-8fab6c1e294c7b936e72fdd3e26969d4.npy +03211117-f2a27af5dba2217a38a57abd4646e319.npy +03001627-42db4f765f4e6be414038d588fd1342f.npy +02828884-21409db44ac9db8b6f1234a0997684f.npy +02691156-2b1a867569f9f61a54eefcdc602d4520.npy +03636649-367546484916da6275225719b7a8b341.npy +03948459-2dbd07826cb984cde687f35a3b96a31.npy +03001627-10d5c2f88b60bbf5febad4f49b26ec52.npy +02691156-a75ab6e99a3542eb203936772104a82d.npy +02828884-ad9f6cdc0cab11986bcd8c7601df5d35.npy +03691459-3986913c6dc63598d2e26510f3f5390c.npy +04379243-3411daa955306811d93768e7b9b1eabf.npy +03046257-2277c1146f943ec8a5f9d52c12457194.npy +04530566-c172ec6226c1374c43a8324aee7340e.npy +02992529-4bef48f1c1b4a40fbdeec9c43546255e.npy +02992529-e1effe88e974292f8ba7bc4a733e1db9.npy +04401088-18dc34a116734b43bfd324d8acaeb3f2.npy +04401088-de48276b397bfbbe8fc27711a3d87327.npy +03790512-30968c53e0d37b6448c90b3a2fec4b8.npy +02808440-d917f63efd341a0f54d7082b34825ef0.npy +03636649-7bebdd742342ba93febad4f49b26ec52.npy +04379243-e97546c24cad95ee9eea323f522c6486.npy +04379243-525d48d65079b2003f222a37719e9945.npy +03636649-88ea703e063e715d6770da39e2737f95.npy +03001627-8709db708ec617ec8b5d4279936d177a.npy +03991062-312f18959d1a04edf9aec59741c69cf7.npy +03211117-217e2634c55f240c18533b168bff8839.npy +03001627-2d51bd678668a0f182db9fca4b68095.npy +02828884-c0e755071b467ac433faf2dd5a7ff771.npy +04379243-941c65a25cef70c184edd435e02f1ecb.npy +03593526-306e447225c6976082db9fca4b68095.npy +03691459-d8fe44ea5aac77504d0c24eb0094dc21.npy +04256520-40dccfef363dd1474b3c42e318f3affc.npy +04256520-ef2d1c27124c41e06bb6bc0db07c71e8.npy +02691156-46791426a5b92fed6cc9876a2c35084c.npy +02691156-7934ca36e240e91d5e9e2656aff7dd5b.npy +04401088-2601fb1cdef9d37223d5a55215ee8f43.npy +02808440-5703aca738f8d92b44221bef0fa3c36b.npy +03948459-59849eb8aabd97a189e70f2b8644e333.npy +03211117-5e70a62a7a1bdac5590b59440deecfa9.npy +03948459-2f2ee52394a53c74bdd651b07eb299e.npy +03691459-e75c0fb00d2b70ef1aadbcf355bd688f.npy +03636649-1dc135b611b2f4b2fcb8d8c6d4df8143.npy +02946921-d53fd8769ff53b9a2daf5369a15791ca.npy +03636649-1bb78fe58e75596d9f42325587eab087.npy +04379243-40fa6161e7f921f6738e43095496b061.npy +04530566-b0ef1a0332a50ad1ae4c18c4a7d1a8bd.npy +04379243-857d1ef816b8409fb20aa91e9e90c311.npy +02691156-35fcf4cfd91d7cb3e1211756a8e887aa.npy +03001627-9c7a028edc97dcbc3012f749207726db.npy +03001627-5141e8716b98a16d632786b910371d31.npy +02691156-f9209166fc259d8885e96081cfe0563b.npy +03761084-db63e48b9a308d9efa80fb391ee7ccee.npy +03636649-6c5d68e495c1f0a4d42b9650f19dd425.npy +04256520-e91742c726572352593ebeeedbff73b.npy +04379243-f6474c0704d2198278696f3c9c5b8290.npy +03991062-7ade1ebc752ac3a1713f2e93cbeac35d.npy +03467517-442d447797c93b4769da8e7f9a803d12.npy +04379243-bc44413ddfc3f861c5f48f9175316bec.npy +04379243-36a6d851dbe02410ad16260d4d73b56.npy +03928116-3d0e93c7aeb06cfccb349a60fd15aa15.npy +02691156-e31da3ac74fa3c0c23db3adbb2f1dce.npy +02828884-715e78fa6ac13a5ba5d322186fc10e9d.npy +02958343-1d82316d98f620513b86a9df4269733.npy +04256520-83d48b9accecd4bae7200b78e3310827.npy +04090263-8cfac69c394c3cf8de423072102e0bc5.npy +03691459-d4ae1449bdee448b1ab68128992ea30.npy +04256520-de431e15a30f57f27d5681734ecfe522.npy +03337140-78005cd4b4389fb73b59eeb47ee49193.npy +02933112-a5b0aa0232ecc6dbd2f1945599cd5176.npy +03467517-2b26ca6b597b39464804bd5c9b82ce7.npy +04379243-984ccfa5aa5c87334187eeeb0dea4986.npy +04379243-4c4c719ac4b61d8f812c9aaa38f9a422.npy +03636649-e9a9f966236acafab48ae76bc6e76e1.npy +04401088-18bab729642c42631308c95c9c0fcafc.npy +03948459-4421883492edac988075e9c7f3d235af.npy +04401088-3d5d7e610fc235cbcce71a7ef3de6f04.npy +04530566-5aac718c51fc73ca00223dcc18ecf69.npy +02992529-aef45c975ed647778768dbb598f40c93.npy +04256520-55f6500b52310f26352ecf815a233abb.npy +02958343-cb19594e73992a3d51008e496c6cfd2e.npy +03001627-a8febf7ef6ce1d8cf7d0fb681a992ad6.npy +03001627-8ade914cd21b6e49656f29b05c68d39f.npy +03797390-1be6b2c84cdab826c043c2d07bb83fc8.npy +03948459-d1cc54762432fd058a2c998c0df41abe.npy +03001627-fbee8c9e5b8c0c19492d9da2668ec34c.npy +03991062-48862d7ed8b28f5425ebd1cd0b422e32.npy +04530566-ee09bd0664e0a02292b9fcc49a614e2b.npy +03001627-587ee5822bb56bd07b11ae648ea92233.npy +04379243-712167f9036fbfd050e7fa8e7f4c04f7.npy +02691156-30bfb515f027be9a4642ec4b6f68a.npy +04379243-c9a9feb520968bc79ccce4c6d5bb195f.npy +03624134-906b20dc0a5a5022714112b147c95c8b.npy +02958343-8fac42d0e74f5b454ca84d60642ec7e8.npy +04256520-40f968fe1a3442acfebad4f49b26ec52.npy +03948459-1374e4af8a3ed46ea6766282ea8c438f.npy +03790512-f1879331710ab83ca7e3c21092c26d09.npy +04379243-ac424c33c6fc302355f46d55537192b6.npy +04256520-6c26b5608557f3e8bb41d1ff31a800de.npy +02933112-720ee748eb25f010c59350d819542ec7.npy +04554684-1ab22863c5f183eab00a4eba25ea081.npy +04256520-59959eb5b4cd9fd15e0ae65e074d3ee1.npy +03001627-2031dca3aaeff940f7628281ecb18112.npy +04379243-cbd789375190fd62f3d2cb60d3f3bab.npy +03325088-d72e5aa3ab8bb33ea82a83c21accafdf.npy +02933112-534d0386ab0bb650ae96150e4aa362f9.npy +04256520-fe652e6e444a8b827f06bb1a83bb6426.npy +04004475-37a4e11b0d449a0dd8f9dd7647048a0c.npy +03691459-d5bca27bf05ac5c92e8dbf40bb4c181d.npy +02808440-24ade9db94db6f22b50d0c6a0c254040.npy +04379243-fe2aee5ff66e4fe8d5f95109c85d2816.npy +03001627-196b9e195ccd4a0de03ab2a27ba7531.npy +04090263-4cdfe4029f51c3b16314c3b6a3a65519.npy +04530566-f5dcf3213002301ee4326375f53c1686.npy +04379243-765786fb271e394a204812d6a020ec9b.npy +04379243-36e167a2c51751a630bbd4cddd04c77b.npy +04256520-43c435a4a10d90204d724d9ce5af6d8e.npy +04090263-a0361a353c93899fbe35b76ae96c4b7d.npy +02958343-133b51a2dcecd83c7c3c6f82a395b347.npy +02933112-1257abde355da7ebc59350d819542ec7.npy +02958343-30776fb35aa99150ee3dd0c47654345b.npy +02871439-79f81b259e597d168e6da51641e48238.npy +03001627-1bec15f362b641ca7350b1b2f753f3a2.npy +02691156-54711bb9127ddf7ef412783097373bdc.npy +04090263-8cff3ca8a9a250272472dec3b03e0eb.npy +02691156-4a15b999378e1831dee83316225be271.npy +03636649-7f1a429b9df0dee97c36714e9fbbc038.npy +04379243-96ef5cd61c49b9ebdd50ab7b10e346f.npy +04379243-c876b151a22b59a24702663c3b3faf8f.npy +03001627-a32e0ecf12641f34515e5383285f6afd.npy +02801938-91b15dd98a6320afc26651d9d35b77ca.npy +02691156-8bfcf5618f2d169c9a6e43b878d5b335.npy +04379243-b4ef1de99422b08768661782af60b711.npy +02924116-7905d83af08a0ca6dafc1d33c05cbcf8.npy +02691156-f47c5c54c4e49f62e0a768dae1badf69.npy +04460130-b13143d5f71e38d24738aee9841818fe.npy +04379243-3942f02501161134c3bd24f986301745.npy +02691156-f691f2409e006d33f412783097373bdc.npy +03211117-dab9064d7c98acaec5aa65dab0a56ab7.npy +03001627-749c3d0d59bf7aface4f274577283b16.npy +02880940-2d2c419136447fe667964ba700cd97f5.npy +03211117-5c53dd3bab676b6444ac2f2630483b52.npy +02691156-c1b9934ddbf4f29e77fd7318510b8627.npy +04379243-b286f1a5450d3958c5da39cd0403824.npy +02808440-7a9c46a3a33c7f5b15c4530387bfd.npy +03991062-a3223c8dd57ff46e1118b641f14b480d.npy +02958343-535f244d5b6043e8cbc76a30015552a.npy +04401088-4f2b1a13f06a85961138452c33de4a3d.npy +03001627-6072a4739c12979baa69dfdc5532bb13.npy +03001627-f9f55661e6437920c5a208307819a3a1.npy +02958343-18e16129375e723e6f8f8c736fcc7940.npy +02992529-57632112a9128a16a82783081c89c0aa.npy +04379243-adabe7da527cc52983572753b9298b2b.npy +03691459-f000edc1cfdeda11bee0494534c13f8c.npy +02691156-2f576be042897eae38f859e2bc79169c.npy +02958343-b7909c8d862ac27a82c3507e44bb5d92.npy +02828884-4e1acb893cafc1ea29c39f613cc72411.npy +04530566-8595fde74bf250a5d9fd1bb6b75d9865.npy +04401088-b8415769dc1bc92821844676433a0aca.npy +04256520-1843c388615d12dacb16624e184454c.npy +02828884-f2bad48085f087dac95c21b3fa5ebf36.npy +03001627-b2dc781aae692b2555182f299fe41fdc.npy +04379243-8f48ccd17a15baf5ce01c07526cf2aa4.npy +02958343-72502c40fc59b62f4fb68b983a4df738.npy +04256520-6131018e5caaedb87980e3c69ea07675.npy +03001627-f5e5ad69111b96646d6e68ce9f2601c6.npy +04090263-e2d4ef975cbfe84bd9d2bbf707e9704b.npy +03624134-15f5527e669eebfeeb7c476925d02aa.npy +03001627-8ad1db95b5b9d60136d9cfd13835101.npy +04090263-f31b23b6dd65d8ed8edead259832feba.npy +03001627-26a5761e22185ab367d783b4714d4324.npy +04379243-9614faa3e0472656b988865f09908beb.npy +03691459-b209054be0f71cfdf398d0c5832df00e.npy +03636649-fa853b92d9a5cb66168e1d639d85c126.npy +03325088-d7c83d555374c3b27fde87eb01f5851.npy +02958343-9539149f41e453052a9eb0f146e94477.npy +03636649-7591d7cc9587643caa5752b5743a662b.npy +02828884-6ee8866fa7b253e8f4fb4dee5181bee.npy +03001627-450cd2f81b38b6fc7ec728abdd798547.npy +04256520-acafbbf4c4f3aed424367084627d607d.npy +04379243-9b6395c94a80daefcea003eff0268278.npy +04379243-a9946cff00d5a43c3b0db8c24d855998.npy +04379243-6216ba4ee25256c9490ad276cd2af3a4.npy +03211117-cb8a39997ea5433b159fbcda62e85465.npy +04379243-73d4df18ad195ba6492d9da2668ec34c.npy +03691459-49e47ec81395e290d3e5b33a5e1cb23e.npy +03001627-e8089df5cd0f9a573a3e9361d5a49edf.npy +04530566-4bd85ce20325ba7442c20743f866e1a6.npy +04379243-bbc0faf338bd07c3cffd61677456447e.npy +03642806-6c1cba2e5d2ebb552209327b12ad3fd.npy +04379243-174928ae6f9aaf3cb1b6b0c5ddacb607.npy +04379243-e6ec89773cb0e3ab3880b925e059dd8.npy +03467517-ff956097c2e0fd2cf66a9e192dbe265.npy +04379243-a74cad1781afed87dcfcef693e7ec696.npy +04090263-26744766d59c28fb6b2c8bb96250e4a0.npy +03691459-ecd9a96ebfd0caf6d8f9dd7647048a0c.npy +02691156-e7fed0e0dbd871ce35ae6d8873b772f2.npy +04256520-f567137b74a175c6f49a23658fe5597c.npy +04530566-248092c201dbf7008088de1a3d7f09f1.npy +03691459-8c2bfce4c190934da98a11883c15abf.npy +03001627-11e521e41ff6a64922e4620665c23c97.npy +03001627-a8bb7a8d6f2e1c5dbbe43d356df0e955.npy +04379243-a0e6486608007bf4c955e5ed03ef3a2f.npy +02691156-65cde29553fe7d763a63e8ba97b45ddc.npy +03001627-c3cfd2188fe7ae365fe4ecea39e8bd40.npy +03001627-37a79a0b617e2e711d172d0e1c97cfd4.npy +03636649-85574f6036ea1f90d8c46a3a266762d7.npy +04256520-5e6fe3ce7afd4490441e918a50adf356.npy +03691459-beab6a006f44f33de19807d50c8d841b.npy +03001627-fe56059777b240bb833c6c72c4b62a4d.npy +02958343-862a345b6328d641ef3ecc8551d2c1fa.npy +02818832-b1debacef4d43e4a20685b5a7e34b501.npy +04379243-d2ad73295752e323255c4b3adac8f815.npy +04379243-a084dbfaa217331894c13f8f78a6d62.npy +04256520-b9faefaee3f409ce2d86e6f67ef12498.npy +03636649-e88e3d0c851a00fe6764a784715fb668.npy +03001627-9979c8433d92fd80d1dcc55e36186e4e.npy +02992529-8caf79a2bf3be9fabfbac23a8087e8f4.npy +04256520-c8108de19d8a3005c5beea20858a99d5.npy +04379243-f434ad9d54919c9029d8eecf3827c486.npy +04530566-2dc008ba026e4c8c8209e983a346eb25.npy +02691156-afe6a70cc5fa98fbd93d05336f155bb9.npy +02876657-f4851a2835228377e101b7546e3ee8a7.npy +04256520-f4a0d0169abf306a754ec1f2eef2c6cc.npy +02992529-6475d2eb77c7ed5a59812638b595a4ce.npy +03001627-d2771921272ad1536a69760cb58e50e8.npy +04379243-bfe852b57d198bd2e83f416cc5d1e30.npy +02808440-d127726fbd237ab197c5304296d7b1a1.npy +04256520-34d7f8dbbe80413c4ad33b69f9597739.npy +02691156-abbe69a6f94918c79eb9aa3111a82815.npy +03636649-e4c9bb21fe5bfeb3e21f078602e2eda8.npy +03991062-c868008632d3523a25ccde673a683af0.npy +03001627-9e36380dfd1364f6d01673c7c57450c9.npy +03761084-5b2633d960419bb2e5bf1ab8e7d0b.npy +03636649-78f5bbde973fa96780b013c1c827c9b8.npy +02691156-d31a0f4f945775de5823df672991ed66.npy +03001627-8f54c32d7097b753542dfd131ca455a.npy +03636649-b4af7e9a7338a9a3225afab722d9fd2.npy +03691459-be277cf919c1467dfc1c2fb0640247ec.npy +04256520-a1a8920f91e2f3d25dc3653f8341633a.npy +03337140-3ab7d894293dff6bc5bf424b15c73f47.npy +03001627-31569815c88e79de4458bae25a4e518a.npy +02691156-12f4778ebba781236b7bd17e458d0dcb.npy +03001627-42d5b7df0524a3aaf785f45147f3e474.npy +03691459-56e11f06a19f9c3edb24fbbf172c2159.npy +04256520-c5f48faf560bbcb3debd3ac8a0c825d6.npy +03211117-f5f5e872bf70f59983f551e0fd7d32ac.npy +04225987-5c55e6b6708f730d758f6def7204bd6b.npy +03001627-98cb91189f35e5f57c311bdc1462c34a.npy +02828884-ea56c97ec123270c2d776d9e024e5deb.npy +02958343-885207d4e9d28f317bcd1993e004117a.npy +03991062-aeb4b2eb456518022271466eed05a4d3.npy +02958343-ac488b046b024bdc3aa029ace5323fc1.npy +04090263-ce351c4fddddba2a7dd22c0aa3913f0.npy +03636649-edce64335e42ac2f58452382da1a79f3.npy +04256520-199085218ed6b8f5f33e46f65e635a84.npy +03211117-fc542f42b786ae20c40162916d18053d.npy +03001627-fa8860d6a0d45a4688dcbe86402c7c15.npy +02691156-1d96d1c7cfb1085e61f1ef59130c405d.npy +04530566-1d075cc087e9c9e3e3d3b281e2d34942.npy +02958343-56332360ecedaf4fb095dfb45b5ad0ce.npy +04256520-acf458d2b16dd918ef188758bf2e3a30.npy +02808440-ed35928bd1dc8a2fbec80b85c820859d.npy +02691156-3a5aa99b9e9e37a6bbf3143b1cb6076a.npy +03948459-42de9b896d23244fe6fbd395d87e5106.npy +04530566-97b9c8f223390554e2584b7a39a94cb9.npy +04090263-9d80168647f0c0ac9f433921788191f3.npy +02828884-870562aca7165d703c78f7fe78269073.npy +04256520-5c69960804458df5255ac1b93c90af25.npy +02691156-d919249737749c36417568af9ae9577f.npy +02691156-45bd6c0723e555d4ba2821676102936.npy +04379243-bc2f853a8f2c42701b126712b4d6e5aa.npy +02691156-5903b9eeb53f1f05a5a118bd15e6e34f.npy +04379243-3b5195c53046e4bd6e9ad486918e1764.npy +03001627-38b5f764afc9d28f200ad3f421b6c3d0.npy +02880940-e816066ac8281e2ecf70f9641eb97702.npy +03001627-8e853d5bb145c11486c701087a194026.npy +03642806-9ddd8a548dce36fc800b903035974869.npy +02691156-78a94b8bd2971595ca8607f540cc62ba.npy +03001627-fbca73a2c226a86a593a4d04856c4691.npy +04379243-9391dcc782fa7f6bfdad344760a9dafd.npy +03691459-a6cc92fec1071df0fb2034808cbff90e.npy +04379243-9e94631e0dcb5c15890bbb282640d692.npy +04379243-f7ec331aac39a17fb129901f80d24b7b.npy +02933112-ac536462e72dea3211fc2b865c2a185b.npy +04379243-6f576d151a46bdefd5cb6d178687b980.npy +04090263-9e98bccdfb3cedf612db810b4de23290.npy +04379243-b3fc5247186936f1dcfcef693e7ec696.npy +04090263-31895d26609fb45dfbf44f447f38c175.npy +04379243-7afdd54c53562cfe43008e14d7d4c137.npy +02958343-ac7e674eb67488dcafe1d4530f4c6e24.npy +03325088-4de724831f09791676c18e71fd49c4dc.npy +03325088-996932ea9d17bc9ab362845c6edb57fc.npy +04379243-3cec584145ee513d635418e95eea8a17.npy +04379243-dfdef0c8739cdd0944b0115560181a7a.npy +03691459-86f45d4bb1f5f8597a040c8bcae232df.npy +04530566-249d543a30a88020be7995d5b4bc81b7.npy +03636649-761fb0822bb05bc8ee0cd746086d989.npy +04379243-9c87f81ccf8a2559dd33a7e96aec2a56.npy +04090263-5c646e68fe7981366314c3b6a3a65519.npy +03001627-d13c7cdbaa6941c2f0f0b1b5588b0b7e.npy +04256520-d6f81af7b34e8da814038d588fd1342f.npy +03001627-9641c65e9a8f9a873f9d6e0ade5188b0.npy +02801938-5fc11cef6ff80f2250da8b99982a3057.npy +03636649-ea9ec4d9db2e06202471e6dd5ac3ef92.npy +04379243-1b6ea0e8c6785638ad8d9da81848733.npy +02773838-b1234d3adf9e476e9432386574f02229.npy +02946921-3c8af6b0aeaf13c2abf4b6b757f4f768.npy +03636649-98cdb45ca9925feb194eb328dc97c7e2.npy +04379243-b292c70f70377635192ae4e26f16c930.npy +04379243-3576a576c81f2966f2f40b9b3af5eeca.npy +03001627-eff6231acedae01c17103f9c0716a636.npy +03636649-3c012309d5c68153302ef84771572fcb.npy diff --git a/zoo/PointBERT/data/ShapeNet55-34/ShapeNet-55/train.txt b/zoo/PointBERT/data/ShapeNet55-34/ShapeNet-55/train.txt new file mode 100644 index 0000000..1d77abd --- /dev/null +++ b/zoo/PointBERT/data/ShapeNet55-34/ShapeNet-55/train.txt @@ -0,0 +1,41952 @@ +02828884-3d2ee152db78b312e5a8eba5f6050bab.npy +03636649-86f8f2c064c79e6cb0c0d433974e32b.npy +03001627-d3a38afe0a0341cefebad4f49b26ec52.npy +04256520-fafd58ba00e8590119abd93be2967664.npy +02958343-41175e2053fb636852e23117ce8d150e.npy +02933112-41472c96b430a1c44f03bfce55719739.npy +03001627-5bb5b15807158f71504721639e19f609.npy +03001627-41ef5dfaee26499afe0dc3bdfa883025.npy +02958343-1c8cc8dd7b2d9671c7709b125ddd3d3.npy +03001627-6cb6373befd7e1a7aa918b099faddaba.npy +03593526-8872d686186924e6c8724d5673a063a6.npy +04379243-efe2bb181502eac1f3c9c1464e55d580.npy +03636649-273314626729b1e973222d877df1ecac.npy +04256520-c5e55f00566f0da2ec012e3517533bb1.npy +03636649-de5799693fbddbe3c4560b8f156e749.npy +04090263-710148ab44c6e48441c4ee8eaf0d3f6e.npy +04256520-1ebf04ee0e620619ea006adb8af93414.npy +04256520-6c9f559b0adfbd6985d87e0aa09f3117.npy +04090263-f373746d1ef6fb5da4dd752ddde80fb1.npy +03991062-8442df5146f188a925ebd1cd0b422e32.npy +04256520-8918d572cff6b15df36ecf951968a8b0.npy +04379243-994e524d70043c3496e349c87c588bf2.npy +04379243-33e18d453f4a8c90ab610b0c94236463.npy +03001627-9e65e8fdde35dcbef91663a74ccd2338.npy +03761084-ca0b473a5c373dc1f3d773b4af1f0c9.npy +04256520-5f66f9b4afd7d0bbbe99c53d7c66ee1.npy +02958343-a358931939481311bda733a39f84326d.npy +04379243-2d1d8a2f976387bd3145205f02ff9fc5.npy +02691156-e0cc4f538a8da2d65d3bbd70fc7759b7.npy +03001627-cff9a523a9e20eaeb40f0ac0fb9a650d.npy +04256520-8889b2abd894ab268d1b9a1d97e2846.npy +03928116-54e3ca588d0975b6a3c4aad99618c729.npy +04256520-ee5d770da5335578f7d7b7d6143367b0.npy +03001627-75b9ddc5017a5eb137f8f3a1ea8633a9.npy +04090263-a1f46e16994569d8743d370dddd1ff3e.npy +03636649-db88171d1793fa2785718c281d7fdf61.npy +04256520-4f5780a3a0466469e5c864cdd2c65afa.npy +02691156-c600de8c83303e6a441eeb748bfdabb4.npy +04460130-a2beb5f14190c1702637f1559971e0a6.npy +04379243-2598bfc04772f90cc20778ca035801.npy +02691156-ab7001e6d0321374b378822897b79a81.npy +03991062-3185f5566da7b4fe78253215bd9538ec.npy +03636649-a957a1304a1fe3f2f78c91c136e5b5f8.npy +03046257-9d3efcd35cda4abac7cdfa94351d0f74.npy +03636649-c26b7862f2afb7ee4b3c42e318f3affc.npy +04256520-a9ee7aaca080a86798e0d1738edd4f19.npy +02871439-2c55ab36465941714dad8cf98230ae26.npy +03636649-617e98c1d743c17420ccbe1c34ca182d.npy +02958343-1aef0af3cdafb118c6a40bdf315062da.npy +03001627-5472ab8df7cd3ecc1c1b3b2ed8d13bf8.npy +03636649-c0a0f01bf127b972257cafc2ddee5167.npy +03001627-93ee27f70b593cee7b11ae648ea92233.npy +03636649-f6425a421a497aad6cc679ef84e06ad6.npy +02747177-92fa62263ad30506d2b12aa6a0f050b3.npy +04090263-c07f9e5e064bd0ef93c9577cd4b35faa.npy +03642806-e8f89f185dd8165b9b07343517e0f88e.npy +03636649-4bd3f50f903cb1bffbaaaf5884f2c88f.npy +02958343-2655a48c8867146bf63ee8a34069b7c5.npy +04379243-22b4c1176e8433134ea79bdd828d5828.npy +04401088-7f55d778584ee63d2271b84575f49c3b.npy +03691459-43990265c9b6be4a989542bab68e6843.npy +03001627-66e1329d6098499382e4e6b3ab10271.npy +02958343-b481b928be9f2bb0e71f141b16973142.npy +03001627-fa5bb6d18535f66219fb4103277a6b93.npy +02933112-6e75ca2b08fe53a344221bef0fa3c36b.npy +03636649-44b84b479d9f8ae7ce2b80886d544375.npy +02691156-c6e4d12318bc4a3b262daac8a0882e96.npy +02958343-a2fa9237519db867f606d4ef0b8dbe5b.npy +04530566-d608bdcd8a87f3af7d2dc2b4ad06dc44.npy +03211117-64fe6e4480939c5e9b485b25e7417c6f.npy +03325088-ab01f61d19cce83aaf0b75abe6dfe88a.npy +02876657-62451f0ab130709ef7480cb1ee830fb9.npy +03001627-58f3e49e746363dcf91663a74ccd2338.npy +03085013-61f958f07b7489e56f03051f81ab06b7.npy +04379243-906eed2a218acb42699c80a6f97edc9f.npy +02808440-d95901baec87549e54d7082b34825ef0.npy +03691459-b3158c23dbd08f554cf39544f467e5c6.npy +02691156-42b63c881861105ccc14f1e6f4f4f49b.npy +02933112-1ef44fc1b4cac21af51fa0238791f5dc.npy +04530566-33d7cf0698dea49acaf9c991e0bc2cd.npy +04256520-165a78e3a2b705ef22c3a2386a9dfbe9.npy +02992529-cf7973f49aa611346be7f66e5722d994.npy +04256520-514d64dec987c01d552ef6186e5d52ac.npy +03001627-6cc65de3b510406ba0c5548d84070f68.npy +04530566-68babb87d66a981dd187e410b169ccd0.npy +04379243-6b6c03883c704389c3bd24f986301745.npy +03636649-5f943996d99dcf59726dbbf7bc5e4df3.npy +02958343-c6ab70b8319d7f2451751fb7affef409.npy +03001627-86c28989c2edf29a2bb396d08a9b621a.npy +02958343-2996a60389105deb649a971570be83d.npy +04256520-bd3cb48163e43810f29b3e56ea45251a.npy +04379243-6d705b609f98e559173b9f28a2caa84d.npy +03636649-418a6ed14b4571daa5af58528d00e4fc.npy +02808440-a369b8bb41a81cf7dbabfe882776e1f8.npy +02691156-4bfa5d948d9ca7ab7c5f0032facde6fe.npy +03636649-55af2652c4460b05ef3a2c64cef919d0.npy +03337140-90a2174624d8b62da53326e496617646.npy +02691156-48e47a6e592cf635590b4d838791a67a.npy +04004475-8f0d3efa9e511ed53fd0acbaa54efdfa.npy +02958343-282293948b21262769416db9b743e50b.npy +03001627-5d346bdb7db27accf3588493d5c284.npy +04468005-553450a802f3ae6b33bba21b4e20708b.npy +03636649-d08941d91a52d4ca411abfe83236ee8a.npy +02876657-3e7d7a9637e385f2fd1efdcc788bb066.npy +02958343-b18e5aaa86cd8716a7fd25564c2e888e.npy +03001627-7a1de77ca204eaf28a514cac7cb18507.npy +02958343-6e651b2230b8474c2de77cee5dfe5031.npy +02808440-fcc74af36543018db38325455ee7a49f.npy +04330267-ef0ac3eec2bd550a2bac1bcdfc2402d2.npy +02808440-c4c3e4b9223ac6b71c17aef130ed6213.npy +02933112-3cdabe258ed67a144da5feafe6f1c8fc.npy +02828884-f958d18643e7dffd99892aa9c57c2870.npy +03001627-30bbee7ab9026c5e4b3c42e318f3affc.npy +02992529-2b33c33ab4beb7493ce1b993153ccc0e.npy +03001627-269698853d294f595761a0b53ed37cec.npy +04090263-ac161c74926a5face378cd9d51dc5be0.npy +03325088-1ae1609816687a883792c04fd8184496.npy +04004475-7c1ac983a6bf981e8ff3763a6b02b3bb.npy +02828884-26299b4f8e03f3ae9470a3e695aa4fae.npy +04379243-176d3994129f9307c3bd24f986301745.npy +04379243-ceb0c123378d24bd9f4b4145f6688869.npy +02691156-f2d4b8440d4bde5330afbcb38d77d0c3.npy +04090263-94386a700272405ef0d11ae402ef940e.npy +02924116-585f25e44777c5a1403c57e7ce69f902.npy +03337140-20f41c44148871104c3aee8e9d3a6ffa.npy +04379243-bbddae0c95f3b7b636b0f2a1430e993a.npy +04530566-7a6634eb949d72719e6f7dedb7e5f584.npy +02933112-c01ecf4426f58beec3c7482d23c2379.npy +03636649-534c7e2c9495d7987b6fd5468f603b31.npy +02691156-4129199695b9344930813b40bae6f4cd.npy +04554684-5a94498353af7763e169a380d7bfbfc.npy +02871439-4f53f0d00d3491f35eea3e3d89293379.npy +03636649-67e18db74dfcf7f418df0876cc6aa6ac.npy +02828884-23b5a3c3d7d6057636ebcfdda999d232.npy +04379243-c416034b70b1d339838b39398d1628f8.npy +04379243-68ef6fc62b9d7f161a8a283df3396be6.npy +03001627-5e3cf3c40c6bfc0471a782a4379556c7.npy +04256520-a659b730251c2da7b3660298957b3f6f.npy +02828884-6d420bec5284eb43ad5067eac75a07f7.npy +04256520-3ced29b0f7f38bcb8964df2a32faa49f.npy +03593526-c81fa64321c8d49fb9be450193b1790b.npy +03001627-a93aac9ad86008e69fc01fb65ca37d30.npy +03642806-a3d3ce1084c2dc3457cd4ef590dc070.npy +04401088-a24fb0602fc7fbf4ec059109909662d2.npy +03001627-e8126f9e2d106620d2f33aaf794b5932.npy +04256520-2639242e8f06f93919fb4103277a6b93.npy +03691459-796384ba0e8cb525e17b9e33c097dbff.npy +04379243-3429a5b0d0497316ce44dc01dba1e174.npy +02773838-5f3af8ff93de34c9e7922afdefd88b6e.npy +03636649-a21744a28956c93cc5a208307819a3a1.npy +04379243-fb7af067384d120b46ebf4f1147c3f0f.npy +03001627-6a72bf1b1ba3254c51c4deb11af7079e.npy +03001627-da160f272c6d77f571a782a4379556c7.npy +04379243-bc48080ee5498d721fca2012865943e2.npy +03001627-b6b426ede67febd4a413908c0e169330.npy +04401088-d3dcafb368c1defaa2c7c5886f4bbc93.npy +04379243-7dd4c0baac6c76703002761e7a3ba3bd.npy +03593526-19fb5ee10bc867a492ffc535cab01f7a.npy +03938244-f7a1abde2723321e8bd9de6b28931bb0.npy +04530566-75198f9e1c5a075c1e6afa6efa6add34.npy +03001627-c0739ef0c29f005ef1f5e7b74609d54c.npy +04256520-acd97b28893414c41e4599068fc59335.npy +02808440-ca63d5d8d3f1933354d7082b34825ef0.npy +04530566-cea154f7fb5351bc26da67afecb7dc87.npy +02958343-53a031dd120e81dc3aa562f24645e326.npy +02828884-f5c6c9a4c5787dae19fb4103277a6b93.npy +02691156-4542d34685168ecf7a571401e6605fc2.npy +02828884-2ab2387e58cfd17ef155d75bbf62b80.npy +03636649-752a9fb2cf32fb5481e0c510e9bf91d1.npy +04090263-6639f08c2275398352d6d9553235a14e.npy +02691156-c0c32558decf271df3ad4b0977199f23.npy +04256520-ec836d156e8157fec862eec8232fff1e.npy +04379243-18ea2f5371184926764a784715fb668.npy +02992529-5b111b3a3e94b5907e1c85c5c15da7fb.npy +04401088-c9a50d65e19a4aa3e2da685d55be1eb.npy +03001627-6aba15a68e745c8d48fda83c10428379.npy +03211117-b302ee5206ec79c34ec31516689e34ad.npy +03337140-f44e926b21e1633e492d9da2668ec34c.npy +03691459-14f7468c0ae24a73d6317d54cfc1018f.npy +04256520-2a8554af80cfa5e719fb4103277a6b93.npy +03001627-5bf38f7840d4c8fc8e9d341bc3648f0d.npy +02828884-6d6143cd573920ba7251f1ec40392b93.npy +02924116-df3f687930b79392d6990bffe29902a9.npy +02958343-2c3e7991d4b900ab35fea498c4ba7c5a.npy +04379243-447f9f9dcd85f6242849dacb94997f4a.npy +02958343-acf64e44b021fd4613b86a9df4269733.npy +02691156-f4b734236ec678d269e10d525d6df27.npy +02691156-6e324581dbbdfb5548e8405d6c51a908.npy +04379243-b7aedc93c53ab7c1490ad276cd2af3a4.npy +03691459-c52531bfe9fcb17a87586c1eb104adc8.npy +04379243-10fbf670bb017ec94ebb593f0d0b4581.npy +04379243-aecdd6e67c790959504af6e1321617aa.npy +02880940-f0fdca5f5c7a06252dbdfbe028032489.npy +04530566-bc8cfba04c86ab537117d5d39e7f9235.npy +02958343-a19d008c68e9c942a78cb4f1b66f009e.npy +03691459-acbda0d16acd03329d4b859036b8707c.npy +03001627-61943ed43201e59ed7f7a4c4609b0913.npy +04256520-8952146d844d41f78dd7a714af22f7ca.npy +04379243-461e2b86470326ed70e89b1ce671b01f.npy +03325088-af92e8fc813b826550da8b99982a3057.npy +02924116-c50e814a2e40e78ce8784f880dac0f61.npy +02691156-118e8142a8cb1fe19a4a28ef635593ce.npy +03691459-e71f2c0e0c760ae98139dd63d55edc44.npy +04379243-6d5a70271c0529071360172b4b6205b1.npy +04379243-3f4ee26a68f2e9386051d49e4b21b83c.npy +02691156-ddd06628f3bfd0b64e1dedff94c67c76.npy +02958343-8212b62591234c743a0daf3e5400b95c.npy +02958343-54514b3e6ea7ad944361eef216dfeaa6.npy +02958343-bae4b861b5cf87275b182da8c76b7238.npy +04090263-3190d8d6542e51fa4b349e4b3dd5565e.npy +04379243-a3dd0302fd716e8624d89cbad731b903.npy +04530566-fa2b5f163549ca457ba04de7d6d93ce8.npy +04379243-e40afb4171ccc460de03ab2a27ba7531.npy +04530566-6e52344e2aa435d37e264261353b57e1.npy +03001627-da6cbcac794d377df9111ef49c078dbe.npy +02933112-e05be650930e7eadab9ab77fc8888129.npy +04090263-30d7d9f98893cfd62511f68da65f4c4.npy +04074963-a036b6be1c50f61fa046bbac53886364.npy +04090263-39bfd3455413996df8f666ba0e601ac.npy +02871439-29398b8b0425408a887c133d6a014f38.npy +02818832-a39d775401e716948cbb8bac2032149c.npy +04401088-7f6a27f44d8c9f2bbcde31492651e03.npy +04379243-e801542eb03f6e3b96d5fa1ee6ada8d1.npy +04468005-a301441491fed52e98d3c3293089ec31.npy +04379243-80b20fdbf1183f37b7491f8d3451cded.npy +04090263-db8f1174280680de5e561f212b7229f3.npy +04379243-146a019a7269fabc45656b6a28cfe2cf.npy +02691156-4c9214d70e0a00c6c1ccec171a275967.npy +04090263-2b6e43e973ee42ea1080be321101ad10.npy +03467517-bad8978268948ea3d3eb77b119df6d.npy +04379243-e0c570b6776eeccec715f352ef265874.npy +02958343-f8885a2372b427f8f2626f7f7bd2296e.npy +03001627-6b5edd2c4df6e85cf9b9977a2406713a.npy +03001627-65f3d57bd9c6911d492d9da2668ec34c.npy +04090263-30621c7dddddd06f42a2e92acc266edd.npy +04090263-4edbccf034f4ab241c3656c6593bed66.npy +02958343-49da37115bf906a7548ac25911d2130a.npy +02958343-49f3932e6fe0828951cc889a6330ab15.npy +04530566-726a60f7dabb1c88c746ec5b7259bed7.npy +04379243-fe710962895c20914476c40fec27b24f.npy +02808440-57f5f67de9a46afbb362845c6edb57fc.npy +03001627-662409af279f322eeb82005949031741.npy +04256520-7dbdddc3a60664f9e87dd5740f9baf65.npy +04530566-37aeaa30913d6ac73e7331a68f273ff6.npy +02691156-72aee7d0e998a68aca8607f540cc62ba.npy +04401088-8f1ec459492c61ff562c8e1ac545ef78.npy +03636649-1f5919744e0376315f38797299bc3fc7.npy +04090263-8fb4cf2a9f6d0abd8e7e8cfdb2f674b.npy +03797390-83827973c79ca7631c9ec1e03e401f54.npy +03991062-4192ea096a7afd3595f577622f465c85.npy +02691156-350d4b260bb18470f77959a47a1c16a8.npy +03642806-719be2a932ea7891374110224c1c4eb0.npy +03513137-b14fa79d2a1efb586f7dd5dd40daa88a.npy +02691156-3e5aa51d27e294a835fc197bbabcd5bd.npy +02958343-7a5eba46ba4cfac35aa429db266f0c30.npy +03001627-510b1295f70873e2f91663a74ccd2338.npy +02691156-b51032670accbd25d11b9a498c2f9ed5.npy +03046257-b9493a141be0e2fe192693a5c1e96238.npy +03325088-c9c3fce5cf0e964f116162acefe23592.npy +04530566-a771ed8115610f0320d75154997de910.npy +03691459-f529e7d74d5ec3d9a1bb636e72c59b32.npy +02924116-9188b08104130e52f446f92b52bbd82a.npy +03001627-2016d09b261b09f05413c1f22a911d58.npy +02691156-33c5c1919425791de038c01d73511063.npy +02958343-d50fcb81298e51e4afe717997470b28d.npy +02954340-da5e5ec4c486d6c03baa6271927f050e.npy +03513137-ae0a3cf547c0534ab0aa56928723eca5.npy +03001627-c0b45de1c0e8f80d4521562865ab775e.npy +04379243-2933b92d193e31b46cff9b44fdf0517e.npy +03325088-3af3bb6e47732764c36fb70296e45483.npy +02933112-29b2a25804651a34c59350d819542ec7.npy +02933112-267545b2c6ec6ee1f51f77a6d7299806.npy +03001627-807f08096308af5e28c0cecb7de2397a.npy +03636649-181ec75aca2de25f6dbdf247ab8522eb.npy +02958343-2e5dbf98157a53a55cde8c99e4b182f9.npy +04379243-6cb41b2a5e27533f436e6787c76ef3f0.npy +02876657-70172e6afe6aff7847f90c1ac631b97f.npy +02958343-55181c34dadb4f032db09455d18fca0.npy +02992529-d809653bf5a21f10e5b8860dcdb97aaa.npy +03001627-9a789be179253acd66c580e84dfb7998.npy +03325088-98543b751804811c36fb70296e45483.npy +04379243-1a767b8130e8a5722a7d46e74f08da70.npy +03797390-92d6394732e6058d4bcbafcc905a9b98.npy +02958343-d07300cbf12c42c3c427f8508e3d634b.npy +04379243-ea96b8a866121d1abed1bd9593e318c.npy +02828884-56f65bffa385a635f4b6538438a0b930.npy +02691156-55b7a2661bffdf9d55a352cb563d3195.npy +02808440-3981200a977815ae3321831d2245cf06.npy +03691459-a872cbdc66e671ec29d1e4faf5d375.npy +02691156-2f01cae5fb585d56ca8607f540cc62ba.npy +04090263-733fd68ce2fdeeb76a853eef701ef7ce.npy +04004475-e232d3b7ba947154684a64a3647d1ec0.npy +03211117-fac8bc5420f9d472b36c473722d8f02c.npy +03001627-9682d28e03acd2e3735013f3db728e20.npy +03211117-6ac7bd79924399c4a0778cc08d9b97f8.npy +04379243-391005d8f1291cb71bb088904f7cb154.npy +04379243-8e7b48d1eba786cde8ee269f00f30d13.npy +04401088-428ac05b36bb576d2a9eb0f146e94477.npy +02876657-1c38ca26c65826804c35e2851444dc2f.npy +04256520-6d60b813582de6c1febad4f49b26ec52.npy +03001627-4b35fbf5df52938a76d876646d549aa0.npy +02924116-7822eead7ed7abc5c150a7c590f1de60.npy +04256520-2f1e6b2c94d6b6c474072e8e7f655555.npy +03636649-80a5ce76688700a2fdd36147bc6b8031.npy +03928116-58fbc1679a7b229b7773fd259c9bf7d7.npy +03991062-a2841256fc6fd90da518b93bb7233de6.npy +02691156-dcbd333ef51b76862b600da24e0965.npy +04379243-832ea764f0d3ffad9923defa57043b67.npy +03046257-811e5e7b22e7ed15b9cdfe8062f449fa.npy +04530566-d95c49195e51912056f316a86bec8b19.npy +03001627-314c04d32f9e42c5f91663a74ccd2338.npy +02876657-d34628eb8992d1f418ae046addd85243.npy +03001627-a06114a07a68c995c8687ff9b0b4e4ac.npy +04379243-9d17b91f7f301cfc6655d494d4092078.npy +04379243-63f568ee89ac03c6603557e69ac4ca11.npy +02933112-be7d2a1a7fa7ce0b11fc2b865c2a185b.npy +03211117-cdf8eff26c940d7fcd1272091a2a216.npy +02958343-360cc5c25fd6bf20ea50ea60f77ab4cb.npy +04530566-6f3384e934f3588ccc37416b6163cbbd.npy +04379243-1d3aa66972004e861f5bdd219902caa1.npy +04256520-d8e1f6781276eb1af34e56d1d9ad8c65.npy +02773838-2f97f841aff238b74245c6fcbfdfe98a.npy +03001627-44ddb3d46266bb0ffebad4f49b26ec52.npy +02992529-3f3770476f094a6f2093f68f248ba9f6.npy +03211117-25df40f2502c6bc2b2fee0e811c64fd3.npy +02933112-24eb9773fec0eb609e4965f0106e00d9.npy +04379243-6292216ef69f6edb11c5cce13f76151.npy +03593526-6cccc41151a9578d4b3c42e318f3affc.npy +03001627-e3b04359a3e9ac5de5dbcc9343304f4a.npy +03948459-391e01226bccecab1d74bbc1a32c7aba.npy +03797390-b815d7e084a5a75b8d543d7713b96a41.npy +04401088-401d5604ebfb4b43a7d4c094203303b1.npy +03325088-465491e7cfd3e0b198a7e0d99b5bf4c9.npy +03337140-9f26b723e21d0fe94c3aee8e9d3a6ffa.npy +03001627-529c0a3650d6a7be97e2a21b8bc2d948.npy +04401088-67524ffa83e3eb7c4948b3842dede005.npy +04401088-162341ffb94a3884e4ba5fe92f32019a.npy +02871439-3a3015426ff544c46fb17e2962e0eb20.npy +03636649-1a6a520652aa2244146fa8a09fad6c38.npy +04379243-c38ba6c06d2b813230c589758b4b5646.npy +04379243-1cc70da57ce2e9e7309b03efb521ec1e.npy +03207941-45eb04a33128a2065dc3653f8341633a.npy +04090263-abfec35b505a92da64c4db7c3b428292.npy +04379243-e9546947de34dde213a5873d239ac557.npy +03001627-bf3c19bb6bf16aa8beedd4e6b38acced.npy +02691156-dcca40aae3eb0c8757bef59252fb18b5.npy +02801938-9394df08489ae97eba5342d638d0c267.npy +03797390-7a8ea24474846c5c2f23d8349a133d2b.npy +03001627-247353514479969ce6fe3612af521500.npy +03337140-8633f465415ec9e41933ffef19678834.npy +04554684-7de9dc34c7230ca54d3df84a5eca1a73.npy +02691156-7d928af41b7dd26e1d0f8853f6d023e3.npy +02958343-e61dadc02535e6e44b6e62b17dc78f70.npy +04530566-e72c59779e1a85f05308b39b1b1978d6.npy +04225987-f9752bb556ab1e20681083250d6ef1.npy +02958343-e64dd4ff16eab5752a9eb0f146e94477.npy +02958343-505ab718b8083f02ff1370452e3a0154.npy +04256520-5e8b318948817989a33ae3b0de29197.npy +03790512-8e956bae37beff87c2743f037f439af3.npy +02691156-c510e14ac20edee814a46d7ec44fc258.npy +03001627-d1237422881f4d22ff25b0c2db862d19.npy +03691459-513775c0ca44462d912b963d265d5e8.npy +03211117-bba0cad6dbbef2589fb287620a60b403.npy +04256520-7550aa9d29f252611431dc89d81d788b.npy +04379243-68fb0825ec07a521febad4f49b26ec52.npy +03325088-1226b60bf7593f08c36fb70296e45483.npy +03001627-2d018e8c0a34a863ff59f04994ef1f0c.npy +02958343-9232d8834704e5f9dd141480e2c154d3.npy +04379243-ec16de40e8415006855931d119219022.npy +03513137-257676761b471e0e69508b2b14833df3.npy +04379243-f5d1fc338e804d7fca7e81cd26bdd69.npy +04379243-1c814f977bcda5b79a87002a4eeaf610.npy +04090263-5019d7c3b413a57012b38b1d99376c0b.npy +02828884-8a541c1e735e834ad5067eac75a07f7.npy +02871439-a37d60f8e90a3afd810b14a81e12eca.npy +04379243-4c1048076c0a8a09c785f06f424b9d06.npy +03761084-77c4453bb4349e398128bc89a67202b0.npy +03001627-ef8b9243c75bdc93347805f93d32915b.npy +04090263-e574eb37ea6ee685e1f2a1daf140ac9f.npy +02876657-9f2bb4a157164af19a7c9976093a710d.npy +03467517-909e86e4a5af7fdf93f0194265a9746c.npy +03636649-cd1d426e08bcbe3e5a4e392b59939d74.npy +03001627-31423159297243ded65766fd3c4f994c.npy +03991062-4976f22bb8ba359713c828323b9d4bf.npy +04256520-b85dd5219ebb52455a1bada754e9e91.npy +03001627-5cf5615844b41442118bf3432a979b3c.npy +03636649-63fc809815b9639de7c7920f6a65a54d.npy +03636649-f049bbd180d89cb5490ad276cd2af3a4.npy +03001627-b3a9c49a1924f99815f855bb1d7c4f07.npy +03325088-b7ca2740aaae2d2c908061a998e20526.npy +04530566-4bf2dba91007f0285ce1e6c1c914b7a9.npy +02828884-3c40692f71e9b773c2c0fe12f0bcb343.npy +03467517-71137de8f3188ab3ac61a2f8346a8f.npy +03636649-36cbe594af434ef9a89ecd28750d46ac.npy +04379243-dbc5a4d1dc3a6e8271a782a4379556c7.npy +03211117-d41ff8cc1f08db6341d8f14d547541e.npy +02808440-e9344c904146df46533e0927d26599e2.npy +04379243-7689de934d5af6505e8431ceb98e6b3b.npy +02933112-b404faa639b8600855f46d55537192b6.npy +02958343-37954fb8bb9a7e351076d1567fc9aa51.npy +02818832-b294f0771e8cf0f4b844ed59ffd3b45c.npy +04256520-e08354a352fd0d6914a163d2b227b320.npy +04379243-9705c2610980d0fdb2d0500bdfc28f70.npy +04090263-2f8a672751f8c284a5d999dbf2c5fd3b.npy +02691156-2b99e54070c8b6d466cf1b4a8fc3914e.npy +02958343-71ea237c598aad1becf71e2e014ff6f.npy +04554684-8d3cd0d2cf88b2c2a83d16be6f14bd8.npy +03001627-a5de4210ba131f0e6ac7817035f206f9.npy +03948459-a7f7db7ce1dd7772515515e554d8cca8.npy +02747177-d6474403437240d578e4d091a0ee3ecd.npy +04379243-2d468e75b3063c165dca6305fb9f97ca.npy +03991062-ea473a79fd2c98e5789eafad9d8a9394.npy +04379243-c28f9a82cb7ddbb53651bb31f42d2f80.npy +04256520-9152b02103bdc98633b8015b1af14a5f.npy +04468005-dc52a7e38d59a2aee68cb23a969dff91.npy +04530566-227db3047b2ab275b3492776d9bac18.npy +02933112-36223972cc8153718cd9445de76e734d.npy +04256520-2dcd9c9795ce4471b65843dc986fdf7a.npy +03001627-55e4b862b56e873eb36dcc661f3905d.npy +03001627-fc14c1aa7831f4cbcaef18b2fd3fb17c.npy +02808440-6e4339050c5338933af30a3946d92feb.npy +04256520-5a7b6de19865d1332c8896155b09445c.npy +02871439-6f46c38f86fa961ed2f1945599cd5176.npy +03001627-d9af882ab6d1cbbd492d9da2668ec34c.npy +04256520-a8ff859fcdae8f70f2543b208c9ee8e2.npy +04225987-571dd1b4d09773c5bbe43d356df0e955.npy +04401088-43b59b01866f23e6f8d380ef6d10e2a7.npy +02828884-58eb1f7c59fda8271068f29f0b65163f.npy +03001627-abe225081bec7d21c5a208307819a3a1.npy +02933112-316bd800a04f14f0de650492e45fb14f.npy +04090263-8949412a776f34e6a821a9df9523f811.npy +04554684-a4fd18ac554ef926756dd585069c80a5.npy +03593526-80059506552f4a2cc97114870bb573.npy +04379243-fe0ac2e334ad4d844fb315ce917a9ec2.npy +03001627-dfda3c467eb6066fe6fe3612af521500.npy +02958343-66bdbc812bd0a196e194052f3f12cb2e.npy +03001627-ea02e94e39a2fd3922963ea1e168015d.npy +03001627-59ee0ee98def6f1e14b86d5282eb8301.npy +02691156-468831f7b19aaebabbf3143b1cb6076a.npy +03001627-53eea17c88e31519492d9da2668ec34c.npy +02828884-ea4e8de5b98a0463c955e5ed03ef3a2f.npy +03797390-d38295b8d83e8cdec712af445786fe.npy +02876657-b742bd7f675191c24ad6a0c67b7f7a5b.npy +04256520-57ceb2601802a37e534fa06200d07790.npy +03001627-9aecd48a3af10deeee83c0324834f3fa.npy +04256520-8ef1ea7a7c4b4e7d5cba62773b8025b.npy +03325088-71a0a8c0c7d749fc4c586a3fab372c5d.npy +04256520-849ddda40bd6540efac8371a83e130ac.npy +04256520-3a525a1286d4879ed35d1c787a8f626e.npy +03467517-a31ef3a8c70b789b93f0194265a9746c.npy +03211117-abc4a3eb2c6fbe8064d221a686772b82.npy +04401088-24d22e3257420bc2b785a4ac4a0dbd73.npy +02958343-b809864c779761ab7ac2a2313c9e8844.npy +03001627-e3c79d6e34b1285e4580ed619ae2daa1.npy +04256520-fcf30cec3180c05da5f9d52c12457194.npy +02924116-de1800e9ce6da9af52470de2774d6099.npy +04379243-a1cb5947d7b09c2c7ca68e217a316e15.npy +03001627-97f1121561e481a3a1f1563b05df75c6.npy +03991062-8d930cf7b852fc6181faebbdea6bd9be.npy +03593526-bf43945eef1782f7f6f19d35df0b096d.npy +03636649-ce798635ececbffd5ac3a75efa13522c.npy +02924116-c9991032ff77fe8552470de2774d6099.npy +02958343-3ef7cfbc172840b2393bf61b30c528bb.npy +04530566-f61524a539deb8097f7b259a472cabd9.npy +03593526-6b1e3b2af2a9e54bef76898f881b76a.npy +03636649-4e3d1346e76084a2c1caa73a5e644b6.npy +02992529-e633f997f4a47b2d727a08b50053320e.npy +03691459-a9d5719c3c2af900ce029fab54b6cfbd.npy +03938244-fe2236c135bc169e7676dfce60793e46.npy +04379243-bd430a701652963faf0ff870be225563.npy +02843684-f71f6bcd0bea761d32e483dbd0fffcb.npy +04468005-4aac817a256e3121fbaac8096a32753b.npy +02958343-62393db2dee065956e28ffc6e1f368fe.npy +04530566-6ab4ddc238851014802f537afffb178.npy +02691156-b80bd34ab330babbc8727b27ee96a4b7.npy +03211117-4f598d41b30b28e84158c4db508f74e8.npy +03001627-49a60133d6b05b8d19fb4103277a6b93.npy +03001627-1230d31e3a6cbf309cd431573238602d.npy +04530566-81170170d0cf36eaa5c5aafe837d3f8f.npy +02691156-26bc67e3ecda6aa1adbb4c4e06ad649.npy +02691156-71a96b4e134ceaacbfacbd9a73055b6e.npy +04090263-b0bff9f866c3d101af25bbd7d4e31ad.npy +03325088-1170e12f08a5f2952dc86760e17ef6c.npy +04256520-1f74a21433c43c784209d14d674fb332.npy +04090263-a33697175cda9f2d742567ca48f0f7e2.npy +04379243-a1a9c417180124f1a6c03a53cf0a14c9.npy +02691156-feb0bd0dcd155af4cc34b900bb2492e.npy +04379243-d5f2968e4b7254ccf4104961857ca9c.npy +04530566-645382862cc284869bfdd98fcb85ea6d.npy +03001627-4a4c7abae3929595184740798d03a659.npy +04379243-86bf47a73d93b66ecd037ccdf14d7446.npy +03001627-d0bb642e810bd2fea6fee8e2140acec9.npy +04530566-d49066858c55d7b021d7ca6ede0e9373.npy +02992529-aba1179bf8b62c812a6d73bcecfd73da.npy +04379243-133d7c9a1f79b01ad0176f9a144100cd.npy +04256520-22c68a7a2c8142f027eb00c151c6f711.npy +02747177-4606c9bae0c3a717ba6cf6cbb9f4c2bb.npy +04379243-ab2967188299bea54cb0654f4cfa9684.npy +03001627-8731945435676805aa29e9f0529e8ef7.npy +02808440-ceb077ecef095d452d70ca35ac1a10ff.npy +04530566-c1825c8ddf2f263ed6f64c5c0b0cdccc.npy +04530566-686a53aff9209c258d25d8990968dc68.npy +02958343-114b662c64caba81bb07f8c2248e54bc.npy +03001627-8bb3a13d45c5337d20e3ea5765d7edb.npy +02691156-e8d5a3e98c222583d972c9dd75ed77d4.npy +03691459-c9de3e18847044da47e2162b6089a53e.npy +04460130-47ce1a5380447249c26ade84d8048a3.npy +02691156-6d3965fef2c63d37b3a197029fcc978f.npy +04225987-ab76bf4b966e3fb5b10029f76a5ab54a.npy +03467517-ea23bdf251c9be975c6a44a505804654.npy +03513137-8eb4152bc0f6b91e7bc12ebbbb3689a1.npy +04330267-a5fab90884f5b576506c648223cdabe9.npy +03636649-4c4078f8206ef3cfe13094731a5351fc.npy +04074963-cd0c46f23b28b94ce56eff8fe87c1176.npy +02871439-13d1ffe8682729b29af4053b8815b239.npy +02828884-989c5de438050d9d6664ead1964339d.npy +02933112-62d67406fb239e21533276a8c0b1c862.npy +04090263-4e0cf21c4e7e1eb58c7ca3bb219438a1.npy +02942699-fdcd83539b8db2c8b5635bf39f10a28a.npy +04256520-c22dd8c395f465c87599bba30f391291.npy +04401088-98c63a8e5485b0a12737a4ff69ca3cd7.npy +02958343-5b1f078a81df862ec2c2c81e2232aa95.npy +04379243-8281936e9123cbbcaf95ae40867329f.npy +03710193-7b722675af1f1cec91adfee365fdcaf.npy +03636649-ec8dc2311d381a9e3d39d8012919dd25.npy +02691156-d56fba80d39bdff738decdbba236bc1d.npy +02691156-381111f176565d48fe4c91be246ef13b.npy +02933112-9166a54bcb06b6c7c59350d819542ec7.npy +04090263-ab9da6638fe428e87f3efc94c2d31dc5.npy +04379243-be045fca16562f6764c85287e21825c4.npy +03001627-117bd6da01905949a81116f5456ee312.npy +04401088-e13a5d5b3f7581cbecf207e73a787c06.npy +02958343-8c04413559b71fccbda72093f9b5aa73.npy +03001627-9570ea7fa3a0ef775436c76691cf3d3.npy +03691459-892af085a4518fc673c609379da5b9c2.npy +04090263-8a95676f5965c580276c3d558130f8b4.npy +04379243-66a801881c4ef524848eff6ddf1058ec.npy +04090263-ed01d61bb0439a33b4cdad9a5bf52dd5.npy +04330267-7020994986d2bc01bc59ed4ab44a78f.npy +04090263-670857f79c4d47c13a6842b1f893c19.npy +02924116-a02e4c26e3d769be221d7b13f13a827e.npy +04379243-7050eed75c60753cf0eaa338269104ae.npy +02747177-e3484284e1f301077d9a3c398c7b4709.npy +04090263-4ec09a25c05bc7d0fdc1361c2b9ae6a4.npy +04379243-f5ee06263c91d7eadfe9cab879fd37e8.npy +04379243-2a2d6560f14a01c6afac72146bbc9d59.npy +03636649-688d88d300429b7dcf78a76e06ee9b92.npy +02958343-28d7a23b2311b1029dce0c74b747947.npy +04379243-a33b6291afb1f8b066b38b193b506338.npy +04379243-71ec472682954cee353c1d159a8a8422.npy +04530566-c04df151b8677becd8af3a076c923cf.npy +04530566-f5fc09f67a5fdb0142d0e83abdfab1fd.npy +04090263-2c0f882d4c5fae8f2bd05e1cf7da8957.npy +03001627-b66a32bed74e203591f74997d435672d.npy +04256520-9cf1a9ea641d548a7e1dc33a9d8d260a.npy +04530566-3d396cf4279378456d165da625f3894c.npy +02958343-7cb387de84bfd2f5fcf949f5ffa7ff6.npy +04530566-d23e71adcc315d56c748af2814b558c4.npy +03261776-63179fbdf2db65fff325ea98afcb29f9.npy +02828884-19aa04605b1b00d0ad5067eac75a07f7.npy +03001627-u6028f63e-4111-4412-9098-fe5f4f0c7c83.npy +04379243-877e3505ebab096848f551687b50fb00.npy +04379243-4be0f809a66f1797ad9d8182e90fd7fb.npy +02691156-4b4fd540cab0cdf3f38bce64a8733419.npy +02691156-399449fd9e6149de62b600da24e0965.npy +03636649-8a9f2e5b726ea37f60ad823977adaa23.npy +04256520-3ac827b804fee818b0b88207ef0f5bc6.npy +03636649-43deffcae6d595f3fcb8d8c6d4df8143.npy +03636649-5179edb45a24a785fbd4fd7714358815.npy +02691156-eb2fbd46563e23635fc197bbabcd5bd.npy +02880940-12ddb18397a816c8948bef6886fb4ac.npy +04379243-e458913e25ca7053c1eb59469984d29b.npy +03001627-352bfa764478b1602bc694a93134e562.npy +04256520-b3346d1b7ced3daf1b2fbf268ed76a.npy +02818832-9dd1b8e40151bee5d2e83a37b2825e1.npy +02691156-a361d82b2c510ca5208842e3d616cb23.npy +03001627-d9061907b7b411dbe3db80a3cacc6e3.npy +03046257-3477c3900a9b1124738e43095496b061.npy +03001627-d7d709cd13cdca931afedc87fe387fe.npy +04460130-f14b153ab99da1bb73a921481ee71edc.npy +03691459-c20a8c3b7a06cd323a5b5efb52c46c0d.npy +03001627-9bb6d3d76d4f5ba94b3c42e318f3affc.npy +02992529-dd8b9ca9abc834feb5784fac792d6797.npy +04379243-1855a4b70958b3354b8710a3469971b1.npy +02958343-ec11fb287c9a68475de701ebc922ac2c.npy +04090263-92164d8660dbb9d278fc07d6c8069b8c.npy +04379243-19140f9ff7eebc13470412e9b69c8933.npy +04090263-ee7d9264ce8c77d79d9900c00629c24.npy +02808440-487665836aea026ccb2f32ac395fe2b.npy +02992529-87f8a738b3f0ae0194feb18ebe41aa84.npy +03636649-f5a48805f020d3e3967cdbf1c849239.npy +02828884-b4a8d71b840fa5f7b90be68f49e6aacf.npy +02871439-dca2cd661bece47bd810b14a81e12eca.npy +03325088-d35cada73c24af13321831d2245cf06.npy +02871439-dc9af91c3831983597e6cb8e9bd5d9e5.npy +02691156-97bd6259fd4dd69a90baeef8ba5b93e5.npy +02691156-642b46912529c6e57f1f82f6fc8747b8.npy +02828884-92b9ca91ff514bc90658f68885fd5d0.npy +04379243-44d70581b7c1468e1771ee930e861b13.npy +04379243-5b74412eba257e5182b796aa5845e185.npy +02691156-1f96a33a3a461544ca8607f540cc62ba.npy +04401088-4ce4f7fcf5f0c57a3caebb882f007959.npy +02933112-426f7850e60a5447616fb9ab42452112.npy +04530566-4a5ad5b71ce08abc687e743787d2aa6b.npy +04379243-1f7143556f4d75522d1adc013ed654e9.npy +04530566-5c46f6ce5efa21175060c1b57f88c056.npy +02958343-996c99bc344453ec6436916a86a90ed7.npy +03928116-afaf8f844c5b0ec37f96386fffd17d87.npy +02828884-117259de2f72887bad5067eac75a07f7.npy +02924116-ddc770ef4e0c0681c7f2b15673ec88ef.npy +04256520-62bc75a69029614877bb84100a5c6b59.npy +03636649-51fd15743cd0568219179d4701451afa.npy +02958343-712826b933a6818c7e003129afd0cbfe.npy +03211117-cf16012ae10b993bd15e5f70c1308761.npy +02691156-62ebb16b6b4ffd74df8fc3a07f996293.npy +03467517-ca9bba09dcae4b487693a84bff425e3.npy +03001627-91de3157ea61d943f27383fc5a5a711c.npy +03046257-db1ae97ebd6440613ca265f557f5dc3e.npy +02933112-789ee42d2fc0c5e088c59e12e565eb6c.npy +02992529-b1085da37756ddd1d3f1ccf368ff60f9.npy +04379243-4ae4635c7c69ea908d0eb3d070197e49.npy +04379243-a369da8e8e47d0f3f51f77a6d7299806.npy +02691156-52c9b1a9f8d3cbcb9a6e43b878d5b335.npy +02876657-26a8d94392d86aa0940806ade53ef2f.npy +04530566-1d8adfa96dca83849143982c80da1e75.npy +02691156-5e0331eab3f051988f6810e1a2b6aa04.npy +02808440-7ab615debab4fff9afc85023f866b252.npy +03001627-fd43278c60023763d4da89766e80607a.npy +04379243-ff26f7003826d1a2d810b14a81e12eca.npy +02924116-28e730a4db0602e3f446f92b52bbd82a.npy +02933112-defde3dac0ce562361c0d25e41396e8c.npy +02691156-69121d9daf6d569fb96212c8f6cd06e.npy +02828884-c4c9828b5c0e5db1ad5067eac75a07f7.npy +04379243-cc6fbdc6f2aa5ea3d889130b88839a0c.npy +03948459-cc014e78b5cd9e7ed957eaf7f4edb205.npy +03046257-45bb09eac47597ad6fe2eb61cd6e74e5.npy +03691459-d5e77992b28da2729c90f715a36a51dd.npy +03761084-617358ef5ce2639ff5b1c85b3db5d1ce.npy +03761084-91aa6504b3900385df3a1b0d597ce76e.npy +04379243-22ea80a1c8798eb22d19175e7d19b7cb.npy +02924116-3714ce121ae95608a971f258593ad6f4.npy +02958343-12097984d9c51437b84d944e8a1952a5.npy +03691459-84a87ff36612b3e53ef7ad0f5cedb0e3.npy +03337140-b8dbf1725cd55f7492d9da2668ec34c.npy +03001627-98ee09de954fdab1843ead12644a79bb.npy +04468005-a10330472393343e44399be51ebd0ad9.npy +03325088-4352119300b754d4e3f7a74e12a274ef.npy +02876657-ab51424e92acace2a1c3f37422b63004.npy +02992529-b87251d1d4f4b7ab2c216c5e0f221195.npy +04379243-949143f5e3b772a7986b72a93898270f.npy +04468005-773aeb7f76f9a0c4dc14ba0818ee5cec.npy +03691459-a4a0efdf9359987515f30bbd054cf549.npy +04468005-1fff38d54059eb1465547fd38c0cec46.npy +03467517-900c3823f47a8ad1d57700c05b1862d8.npy +03636649-aa381aff183b1427b7d9d23574a480ae.npy +03001627-233009d4f30fb416dbbc9440457e303e.npy +03636649-bd1cbcb990375022b45fed2806c331ab.npy +03642806-11494281ca09a63d3b54554be306bc70.npy +04256520-33f862846366476fc79619984c97c1ff.npy +04256520-305d64b9fec0015b62a510b8f97c658e.npy +04401088-610a9f79a2f2faacc43c9f60fcc79b4c.npy +04090263-2cb0634dfd39f71623c02c1a690f1e7.npy +04379243-970e70ae46244887c35d3c5d3b1fcf7.npy +03593526-3f7d866f4e28e8014b3c42e318f3affc.npy +04379243-52257815b77da840f7628281ecb18112.npy +04379243-95d3519b036c862d4e3155c362b85bd5.npy +03624134-75eabcbd45e92882a87957ef7e9f3d70.npy +02691156-9321ab235b82ca268c9bdb0f364cdad.npy +02808440-e65dc1c9c07f7eaeb362845c6edb57fc.npy +02924116-4972a57b656446979a426d999467f4a5.npy +03636649-261cc5f20787f50cdbb57594c19a59cf.npy +04379243-70bfb9d08e50970093fcbf4338a54def.npy +02954340-a4f94067b0ec9608e762cf5917cef4ef.npy +02946921-ac0eafed7aa1719b297d1fadd26a7035.npy +03624134-ee0b4054d8b40ba5812bade9b93f0eaa.npy +03001627-bf39672eec1e343284c6c80813d54fe5.npy +03046257-b602321e87ba6ffedce1f8ab000da922.npy +04379243-f99f09473fa068dfc834d9ecc7d5f465.npy +03790512-27733dbe070efcd8c9a9842c993649ff.npy +03790512-46afe9d5d8a45a17a26d3c6c2e980dd5.npy +03636649-a11dd450220af960ca70272754aeb3c9.npy +02992529-1b43d9193794748e31811399a4ff3aa0.npy +02933112-8a758b29a751764d14038d588fd1342f.npy +03691459-1eb6ae90ea03673ee792f9d89b97c271.npy +02808440-55eca9bc125d32fd54d7082b34825ef0.npy +02958343-7376511fb191429eff1370452e3a0154.npy +03636649-dbe15772a731fff01de2a416d49fc18b.npy +03797390-43f94ba24d2f075c4d32a65fb7bf4ebc.npy +03593526-b145d989080a57afe0b42601a8b58d3c.npy +02808440-911847b0eff48ba087a301d05ef6a538.npy +04379243-dc3fba5ae5e86e62416e6e65da17ce54.npy +03636649-c906a9c7ae536a0c7fb7f79251dd7727.npy +02958343-a26b62fa78e9d6e016abce8cb03e7794.npy +03001627-8b22c3e3be1f8fd8b645b903fc5f4135.npy +02691156-fd9f1cdaa381599bca8607f540cc62ba.npy +03001627-b405fa036403fbdb307776da88d1350f.npy +03001627-3aad9ca0d7fa80d76beba0439e85fb62.npy +04379243-155af42283f8ccb9b3664229461d7332.npy +04468005-f98a21d6b11f26935febed8de0838d7.npy +02871439-fedd668769a5916a30aad3a2f98e3b63.npy +02958343-c8fb314a1866d1d2428df271ebc70bc0.npy +04379243-c37632eafbf41b9c1fb41007d56c0ca1.npy +02933112-dca4c8bdab8bdfe739e1d6694e046e01.npy +03001627-66f18d05d960ffe0bcd12732b5a4b789.npy +02992529-29f27d4472a17e723fd445ae159c2cb2.npy +02828884-23325f47d2a812351165bc0a3b02b27f.npy +02958343-26cc3a9cc0c28174ae30cad08127b470.npy +04379243-c6e3f651d2acdb0a746f36c9587bfc04.npy +03928116-7324583e739a28075931320aab0d7485.npy +02933112-37e5fcf70007bc26788f926f4d51e733.npy +02828884-23d1c6e2e35cb252bb85b5a298d72ac7.npy +02828884-e4d1d4714d5dff9b79fb1978bf47fafc.npy +03642806-26ad81059039dfcca3e30e62a8e6f77f.npy +03001627-3e973b624578fc89b76e29c9c43bc7aa.npy +03001627-195c379defdff8b81dff5c2e57ad46e.npy +03467517-3634c40841a76b348c91fa35e72c6c9f.npy +03001627-11ff2e9f9b0993b7f51f77a6d7299806.npy +04256520-f50d32a6083c8f146dab7044457400e6.npy +03624134-a05ea45d396c86784e52b614e584a543.npy +02691156-2ab4a5c3ca32ba9a4d4cb1c2a5e48b7a.npy +04256520-7517e2a0c921b89d593ebeeedbff73b.npy +04379243-e58e958428584b2b79972b30518c97e2.npy +03046257-10312d9d07db5d9a4159aeb47682f2cb.npy +04256520-e491dc151c8e801186abe5555a3b447d.npy +02958343-72d4deb3b797c03dd4f6529a209c5dc0.npy +04090263-6c56be203155b9d2c3d04f57fc87fcb0.npy +04256520-a28bfe80037449cf5eea3e3d89293379.npy +04460130-f982e86909ed9e7f2c8891dbc3e6988a.npy +02691156-6db64533897238af392d539dc5a47ed5.npy +02992529-81f527c62191bcd465c46de8aef92580.npy +03207941-cc244af17335b1af52f4523ded466b8c.npy +03513137-791c70769828cda852bc033e87de1006.npy +03001627-a55140d6d7b1148519fb4103277a6b93.npy +03991062-3e4c784f765dce24766224c8ed44ac6f.npy +02828884-7d79d398f56c13eb12185770c6bc35e3.npy +04090263-8a40c59eaf7bc85c322a3e035e31af50.npy +04379243-e14e867c0cfbf1f42cef66bb37b0cc33.npy +04530566-b7c24dca7db1d2985c00e52236fed2eb.npy +02773838-c4cb5bcb1a9399ae504721639e19f609.npy +04379243-ef5788dd59881f2dbeea80ff21252e37.npy +04090263-4e292f614c51676c6118b98f3fdee6c0.npy +03046257-6f712bf7b828c9e920fb6b84fca9d3c3.npy +03001627-4cfc78be98de1d2bd607f0b8430fb29a.npy +02691156-a3bcd8767d2827626f5b49394e7f4cdb.npy +02828884-38dff7c9994cda58f4273dc8988e4c4.npy +02946921-b45716cd72f1e9172fbee880b9f634b4.npy +04379243-1cba04d4679da07ef51f77a6d7299806.npy +04401088-ed71d2ed652b911e7f521a3dcd28e9d2.npy +04379243-b9e3e65aa754f3b49ccce4c6d5bb195f.npy +02691156-b7c11baa48456c23149f1a143758cddb.npy +04530566-f15c255128f2c9c6b7963b720a430c5d.npy +03691459-f904f64f961e9cddcd3e44ab53ae1e92.npy +02958343-3587008282540864673ddeabdcc8c6e.npy +03991062-5563324c9902f243a2c59a4d90e63212.npy +04379243-495db04c204196ec47c638c0eee4a2b3.npy +02933112-8fe70b11448dfeef2369c46027bce7af.npy +02958343-2a0a53917dde654c3196f09f71403d35.npy +04090263-83e29d672713f0da270e90bcf29dbfc9.npy +03211117-daae6d7f0e8d7e208a8be3c02effecce.npy +03325088-d8844694dff0986d30fff73f53312a3f.npy +04401088-427d255534038d47e5eda863cef11226.npy +03691459-e5c2ab51068e9f8b58ad8ba2f750cf1d.npy +02808440-8c989333427537ce44221bef0fa3c36b.npy +04379243-ba6992957c2e6e6df67676f416157590.npy +04379243-e65cbeed1eb687d514038d588fd1342f.npy +03085013-13c3acba1f43836a3123e2af297efed8.npy +03001627-eda8edcd64072b0db784faac204319d9.npy +03001627-c7739fa5e32a7218a5f9d52c12457194.npy +02871439-80386678689904d16421c9121bcb0cd.npy +04256520-c4ebd90eb8496903f4ed05effa0aca88.npy +04256520-e233f53558015ba4f05a611b5fe35f32.npy +03636649-2059087b746a931e6bc1922eaa6b6752.npy +04379243-c1df09878a7a4a81190e285a2cbc9c.npy +04379243-4cd0c4c75f124cc117b431cae0dd70ed.npy +04379243-569b338df880d560a71c812e027f94d9.npy +03001627-45127e6f4fb5cf568173979dc89222c7.npy +04379243-7e6fea75f410181855f9913e822d5318.npy +02808440-79ace304188699fd5fe7cbb6d6b5e421.npy +03636649-81bbe86e17196c2fd0db1e44373ee2d4.npy +04379243-2bafe9aa12aa1d3bfebad4f49b26ec52.npy +03691459-b0a331fd0d599fe8e69f17d076308b42.npy +02933112-6098dfbdd0fc78a321e96d7b34bacdcf.npy +02958343-d2efbf5a3b7ddbf94c0aa7c1668459cf.npy +03790512-ea01df8a5deb6b278e5369269261b398.npy +04530566-a2d4f32a82902118aaac2db0a60f403c.npy +02992529-c43c9123ed893de5a0eb5a85db887292.npy +04379243-10733a711fe254965d7786e1df78254f.npy +02933112-d17b46d9ad9378209c68640456c0e.npy +03046257-a545e60aa1f2e13bcc84fc85b2c06435.npy +03991062-61e5f9b2abfe02ac93271d2223fe04be.npy +03001627-edba8e42a3996f7cb1a9ec000a076431.npy +03211117-aaded29a2283bb4c4920a74a78f531dc.npy +03761084-a8574cd983b761248a5e8294bc48dc55.npy +03691459-a9d7e7bb4d72c52f1574d21c0c95092f.npy +02924116-f5636ed22f1a3daa193d7855ecfc1bd3.npy +02691156-9441549e323552f2f001dddaf44c449b.npy +04530566-1660bbd9c43284d98bfe41fc81907f54.npy +04379243-1fa211118fcf90d858df8eeaf3dad1c.npy +03691459-2d408222b334fec71b45df3fb820c9cc.npy +04256520-64f47c058d0a2da68bc6f322a9608b07.npy +02691156-541c19fe42806c4d26360e1e29a956c7.npy +04379243-d19b4bde0766723c9b3bb0ef2a08be04.npy +02691156-3109b3740ac1a056df55310efbf4c0e4.npy +03001627-59529dfd60b211a45277f07057e8ce87.npy +04379243-864499eb14b077b4e5aa1f8c960ae63.npy +02958343-2894449c2f1992bc3a65ca10b9ee2981.npy +04256520-1d86fbf39c3d2954222713fd18dc031.npy +02933112-a38f20793fbbd3d3ff03fd9a67a9cdfc.npy +02691156-959f28c6724979ef9a6e43b878d5b335.npy +03691459-15c6b5792b19af3fe99c48db5f195989.npy +03325088-356f8deac817eab7a0a07918e742ff41.npy +02691156-93c38745ac281f6b8aeaf14658928f6.npy +02691156-efc7d4fb87937413dc13452e3008005b.npy +04379243-e1c190513b084f4c4804b5831b58a04d.npy +03046257-cb6ee0f8931923cd4f262ad0a8c89c0.npy +03046257-94d692071e8404ebc0aaedf10d776af7.npy +02992529-c7407877d3325f7f391258277c122351.npy +04330267-72a0fcf0b41e788935914415372cbccb.npy +04530566-635bed8b6b180fa3e65273dbd0c0f949.npy +04379243-584d3ed9669b1fcfbb7ac4d22a68ec08.npy +04530566-7ba8d5a8edb7ab991f377e6c4dfe0096.npy +04379243-804a9b89e0279aff1ed1d681aa8388f6.npy +04256520-525c959a4a09aea164def4b29bf333db.npy +03211117-f124d85da3ef5ee5fb51920a0179fa71.npy +04379243-8129d4c51abc3356bababe11fcea8796.npy +02933112-1a146144063c778cd0d447e37edd880d.npy +02828884-38e8a36cdd879fd2d6f2f8f659863647.npy +03001627-4003f4046a3a5ed9297936c81e7f6629.npy +04379243-731b5127b72cbbd9b9a17f7cc0030785.npy +04379243-d6580bbf1220d39ede270fc3c23d78b.npy +04379243-6375351785793a96412608755666abef.npy +04379243-c8062ed073ce04058cbb8bac2032149c.npy +02691156-1943ee06ecb139819330265a9fff38de.npy +02933112-24da7fd5e33513814da5feafe6f1c8fc.npy +04379243-d2beb9795e88d3dadcfd6ca2b952d624.npy +03211117-f3d4cb310a6106f5e66202687a227eab.npy +04225987-393ca71bd734f3071082f2ea630bf69e.npy +03691459-35982cb980f6916c2633ff66beb9cf31.npy +02808440-c04531f473baa75def0b2fc3511b6fbd.npy +04554684-c1d4c8c438c4bfb346cde67a6a1ea328.npy +04379243-8dd1ca36888301919fb4103277a6b93.npy +04256520-93b4258c377ade381deb48513aeadf93.npy +02933112-9705e66769fe130add7092ed47061a36.npy +04256520-ae2c9a06d9f7076532388c13cc4a0ba3.npy +04379243-4b8e0b22664904c1c8b8dbae22c1c086.npy +03948459-6c805c53ada82e954e77d7996e16376.npy +03261776-3a6dd2e7dbcdc49d7eb37dc0a59a307f.npy +03001627-da7b1352978b35c1490ad276cd2af3a4.npy +03636649-e99793b871d27333d42b9650f19dd425.npy +04554684-a6f649b55bb9fdfa7a1aca5b147accc5.npy +03513137-92c11ff47a2d1a4f673a614c45f3afe4.npy +04379243-186f6c911a4255bc1b17743c18fb63dc.npy +03467517-4b006452e6cf43d53ac61a2f8346a8f.npy +04379243-688a2fcca4d94685a11f6bacf5c7662d.npy +04379243-b4c54426262f142fc16cddb2140115a.npy +04256520-530fc7ae6a1d6a40e830a5cca365799a.npy +03001627-5a7ad45fa4672684f63bf7d908efc575.npy +04379243-b86657d541c2e26a4197bf8bf6f07b46.npy +02691156-a153353168cd47869a6e43b878d5b335.npy +03001627-671f35148ef1cb2fc0806ee26b689c99.npy +04530566-99a27d7e2553c629b0828c4cf6b95ee9.npy +04401088-980cefc1df9b24458b13932a0c28e98b.npy +03046257-21fecb28d1c8ee8c6463df620b7b4cbc.npy +02958343-c44111ca55c697117fbfaeeb4819ffd2.npy +03001627-d892a0fddeb963bdff4bb1e34fb13b70.npy +03691459-54681e2434fdc9ccd747b49524a1246e.npy +03001627-a469bcecc0a03db7d40dff3e049589e9.npy +03001627-75f4282ca1df236ebf08050442fade6c.npy +02691156-28448469f5bce47b4ddd8a480b571bd7.npy +03001627-32303484de7f1998f8d44451ec1ac05.npy +03467517-414302b6fb93064d6b072a28b9bce334.npy +04530566-c9bb36ffd5ccf7584cbfeb2946087e59.npy +04530566-269ada03c39d200498a4434c6f79eefc.npy +03001627-4ed0eb4f4e7ea0952efff55e0bb2e42d.npy +02933112-1a1b62a38b2584874c62bee40dcdc539.npy +02691156-b2b1c1d5c757af8a7209009cfb89d4bd.npy +03001627-948f1555282e27da190c615a2115d2f7.npy +02828884-a557114149ae934819420b7669e7265.npy +04379243-e9a68d0ad5177d24ba5342d638d0c267.npy +02828884-c50e2c7a82ab0362c69be1660283647b.npy +03991062-f2599921c8e0a76ea4e7499e379fa4fc.npy +03211117-ab68830951b9a5a02ba94c8f6eceab22.npy +03636649-c8ba5b8ad05d553acd017fc6c40a6bea.npy +03513137-cdbefa5bb13ada4a52fafb0cab311e6a.npy +02958343-d4251f9cf7f1e0a7cac1226cb3e860ca.npy +02691156-d0e517321cdcd165939e75b12f2e5480.npy +02958343-382496958e58e9a0658e57fd275f6bed.npy +04256520-c63d2ed731595cdd8cbb8bac2032149c.npy +04460130-5495ec547c13d8f2de1c31612629d3dc.npy +02933112-3b3a1bfd87c87a184b499a9d711de5a7.npy +02808440-53b67010fcd56a163321831d2245cf06.npy +03790512-ef4bc4af2b7ebf42306928a0ea1eb003.npy +02958343-7e5b55d43322de49295eb8d2a941a3e1.npy +02818832-edf13191dacf07af42d7295fb0533ac0.npy +03928116-68472f6ccc7296ab86e51e6823d1498b.npy +02924116-9a5ffdbb89d171e5b5b0c584eaac6c4c.npy +03211117-1c47397db49047b9d35d1c787a8f626e.npy +02691156-b88fef1090e6d151b3f2b01de37c0b29.npy +04379243-401fe961ec7b0cb5dcfcef693e7ec696.npy +03636649-6b130799a53c2917cea97147b08cd8b.npy +03001627-b4827a7b42d68aadbeab82a04eef83b6.npy +04379243-e75f2a369eca1346b157bfb9ccdf274b.npy +03636649-a90fa89d0cb8ec989cd3f9e8648111d1.npy +04379243-d6d29b0c347f2ce23002761e7a3ba3bd.npy +02691156-8c1d67bf88f34ac55823df672991ed66.npy +04379243-adc027df0d7ee0c9ccce4c6d5bb195f.npy +03001627-e76aad9a92f83d70bda72093f9b5aa73.npy +04090263-487ef6821e82c9548839ade0cf1fb995.npy +03211117-e6bedde4571506491fde762a4c6848dd.npy +04256520-b2ea31ad8b8b3e19994626ba7fe8ddf7.npy +02747177-ec1c1aa7003cf68d49e6f7df978f3373.npy +02933112-992e569c61916848e26ab56647fa5b85.npy +02691156-6ca40d19374c9d735c5f85af1b625f04.npy +02933112-4b67001c30b3a68be4e346ee2650d150.npy +03593526-1a7ba1f4c892e2da30711cdbdbc73924.npy +02992529-be254a4f3097143fe0e25464307430b.npy +02933112-687a33b0fd4a906dc2185cc0ca1b306b.npy +02828884-875b1307c76566c8d0d4e85a15f02eb4.npy +03001627-11dba3a8d7b7210f5ff61a3a2a0e2484.npy +03691459-359d760f7d8fc091fdd1073b17e9e51e.npy +03211117-dfe2e7c66b4063f79a6b496c6e9f4c2.npy +03001627-533650991ca60fbfdbca69f936e89647.npy +04090263-d9180361e225bb418bfbe54b5d01550.npy +03337140-ab029c1aeeffa5a4794a354d0ff88088.npy +04379243-a358b5f98f632adcd1fbf79741fcd6d6.npy +03001627-bc46b7460e4476d351e0e6ea07e9e2e4.npy +04256520-615d9c2b37a3616ace8417aef1b7a422.npy +02958343-3b800720bd8d41657810f4dc287137e0.npy +04256520-f756d6d576a3e238f797b840852566c8.npy +04379243-76595f5c7689a4559ccce4c6d5bb195f.npy +02828884-162550a8510464d97881b8f7aa99120f.npy +03797390-57f73714cbc425e44ae022a8f6e258a7.npy +04256520-35eeee5f998f24e8a505985405786f0.npy +04379243-b41cc94ebd03eeb2593ebeeedbff73b.npy +04090263-2d49519d725de02396e5f13299458076.npy +03691459-94abce2eb2c9567da7729f9969cb563e.npy +04330267-3ed7ea7c49a32247c4c2cb2195d7bfe5.npy +03001627-c65f9af5b5a6cbfe5936c7265c890fef.npy +03001627-4c8cb8be444fd405bed1bd9593e318c.npy +02958343-3c02c18d64d3f13b8c988ea512260358.npy +02958343-b5b6b09711cbee6daa44bfa127abe4bb.npy +04256520-a10a157254f74b0835836c728d324152.npy +04460130-d143fcdf4e9810f13488053ccea5d42b.npy +03001627-ea7337dbfced9674d2844b25962c000d.npy +03636649-f228f6cd86162beb659dda512294c744.npy +02933112-a71fa3fbcd132c39cf44224546cb0306.npy +03085013-3f34b7f6ef1fd8e7891aaffa5a7c7cad.npy +03046257-e743856943ce4fa49a9248bc70f7492.npy +02876657-b362273df5596c7e7f095f36ba0999f4.npy +04256520-2a9da31660f0c0b73505e48e4fe20c28.npy +03001627-a1f46215051dec0871a782a4379556c7.npy +04379243-fa010af968a0e1635ba41eea807f5d3c.npy +04379243-4c15f432da3400ad2404817055fb55cc.npy +04379243-697e5edceaffe68e738e43095496b061.npy +02958343-12410830e8a5067c69576518bd9bfe48.npy +02818832-806145e92798a35f15dd7d7985e749c1.npy +04256520-f5ee22abc76f7491cc9651014a82e2b9.npy +04401088-8ec44fb44e4a3224795284068bb430b2.npy +03001627-fc3d4268406b396e71a782a4379556c7.npy +02691156-adb3ea03d7b954255e9e2656aff7dd5b.npy +02958343-a34260b8cdb1ec95b63de680261b9e1b.npy +03001627-572da8680677fe8937b2bb75885cfc44.npy +03790512-e033e7dc322bf8a133735c05ad7be6dd.npy +04401088-8f3250e029d561341b92a1339af2f7ce.npy +03467517-4899c1d7a3af5cc737058b1eaa7b4b1.npy +04256520-8a0ee11e68d4565d72e26fa14efa9297.npy +04256520-d0b06478f56a1306e8f8c11a24c52ebb.npy +03046257-448a81d7afd06b3d2a548038c4031d1d.npy +02691156-fabe8fdc617e3aca2bd098b9203af.npy +03325088-cbac6ded2160f1beb362845c6edb57fc.npy +03001627-5128a385e9c90443febad4f49b26ec52.npy +04379243-3439020f6fd015c02d51eba7952634c5.npy +04379243-4a3839f687aad9122d98de61f824e5b2.npy +04379243-3459eec8eb56fa312bac236fe109e385.npy +04468005-56687a029d3f46dc52470de2774d6099.npy +04256520-c6fbb991bf184331847d00e95a10eacc.npy +03467517-14f88fcb1e613fc4eb792814ca6b5bcc.npy +04401088-7ea27ed05044031a6fe19ebe291582.npy +02691156-65960aceecc9d6f88388594197e843d8.npy +02691156-bf5d6902e75fd8812296d88107d065f6.npy +02828884-e55f19a6d411966c6bf2e668f01c16f7.npy +02691156-b4a420a55d3db8aca89fa467f217f46.npy +04090263-117be2f79d591136ed9c5b25fef60d04.npy +04379243-8bfacae2de0067cfbfd72d7396bc040a.npy +03046257-19162323595891b955f46d55537192b6.npy +04468005-7d9cb763f622e2aa90f5fac3ff9f322.npy +04530566-e36cda06eed31d11d816402a0e81d922.npy +04379243-d3f4d13ab71856953f5dcc11a7c57129.npy +03467517-4e73161a7ec1b50e4616d9b0c69933ac.npy +04256520-a1b02adc96a97e176eb9b08c8a74d159.npy +04379243-366902c0009575664f856154cf68897d.npy +02933112-c5aa72cca5cafd3f842982c980a38094.npy +03001627-9e54053a1b16299153c5215ed09cc4b0.npy +04379243-ca2070bf7d1aa372cb922bcc33df0268.npy +03636649-cec61b6fb378925e498725b9a1405ebb.npy +04401088-c71acd79ec4cf1cdd11ec2c68afc26e4.npy +02691156-22d9a4a9290e8f09112a90660b187a10.npy +03001627-490384776503eea9e2dee6f9fbe318ea.npy +02958343-32189802f3d95fa46c56ebce3aa49447.npy +03001627-5af850643d64c2621b17743c18fb63dc.npy +03001627-7e9448da23c3387754e9211d1e7afbcf.npy +03691459-9916643790d32d0dc4529c39a8e542cb.npy +02828884-ae635fcb688b88c757411f16004b6df.npy +02992529-76781e8b967f98b5a0eb5a85db887292.npy +03636649-5a79339279fb7173fbdebca9f6788597.npy +02958343-6d01a15517fcec07a546b0c1c6a4821.npy +02828884-691ca19f8a2324652056b4bd5d870b47.npy +02828884-143032619a82710b2056b4bd5d870b47.npy +03001627-d66de4cc1dc6cf5e8f8c11a24c52ebb.npy +03624134-ef0dd0f2af9869325867e536d32c89f6.npy +03001627-2e9e0711c4f8e6c6f51f77a6d7299806.npy +03001627-b6ff694af011b45f4f52551bb6d0494.npy +02871439-70bbaab945da20bbcbe8623e8d104185.npy +04379243-3f036c403ab34bdac3bd24f986301745.npy +03001627-5229209bf66b6657b11ae648ea92233.npy +03636649-e8e4f730f9bb892a85245de9410e292e.npy +02691156-97a6bb84720f250122df1994a149e700.npy +04379243-d83cfb75c24a8a89eb0ce5843fe6b264.npy +03001627-672e20cc6ffa29d41c6aa36e5af1449.npy +03636649-e685cd3f7a980812e94026ea66f4d4bb.npy +03211117-8449704b3c3c290ec5243a0ab191990d.npy +02880940-7d7bdea515818eb844638317e9e4ff18.npy +03001627-e63546037077f0847dee16617fd6925f.npy +02691156-123ba1ebe2ee533ef0c45eff2a917cc9.npy +04090263-19d5298e49eb6e5a30b14dd156373f09.npy +03207941-b5ca6cded4b23f2455b2aedb5bd199c6.npy +04379243-7c793900baa4ca16371fff21f277e702.npy +02808440-56defbfbfd46b4533321831d2245cf06.npy +03211117-e52a477d9b54dbd5672efd73ea104790.npy +03790512-cbf639979de64e14739936b7765e22ae.npy +03636649-30464d7e164a40aa2bc52a80abcabb17.npy +02958343-b811c3c5ac8eeeb2f63ee8a34069b7c5.npy +04379243-d26eacf8d87a522647839bae1bc65257.npy +03001627-8191bad981637a71b356ab8b24c147.npy +02691156-7182efccab0d3553c27f2d9f006d69eb.npy +04530566-863fd298e6ea46a5614edc3c9b2489f4.npy +04379243-841f48a81cf3f066ac00fd1150223027.npy +04379243-7730689fb323f88555f46d55537192b6.npy +03001627-a13a7a1c82bafa56188f1f634a0f116e.npy +03636649-3cca977e9e6ae9e181a172d69c52a28a.npy +03211117-cc7bac4f85cbd7d68a04632e06812aec.npy +04379243-312a5be8c4449afa456cbf78e1e89022.npy +04379243-6240ad3b8776b5e88e4f659f0755a47a.npy +02828884-25876fee744f8f8dd45380eb90f62b3f.npy +02942699-9db4b2c19c858a36eb34db531a289b8e.npy +04379243-c75ad4217e58ef871833a34736708547.npy +03211117-a33702c33c345df57dee7bb3061fcbd3.npy +02691156-525446bc8f55e629151f2df200a24ac.npy +03001627-d02fc4ae6bc4278b68c4c9cb55925fb2.npy +02808440-2004425c4a997e33a7287f0d359a1a39.npy +03636649-3f22e6719decb1bb3a9ec79b9c5da99b.npy +04379243-5f188ef6d852a85c8d0180586cee2c13.npy +03636649-e655d36c391a57c156ca893ec1044405.npy +04256520-9e0071fda87df6892e73d126bf16e692.npy +03636649-7e61de32ddbb59c89450c010f9b3ff4a.npy +03593526-8b1781610ff164c7ba5342d638d0c267.npy +03046257-aec546edcda7c5abe579ef1e3d185e3c.npy +03001627-90f8e6e1694039c0142c8d1dd30ee99a.npy +03761084-30e4d5f28706a95abf37a318b55c6a3c.npy +04401088-6fe550e061e70579a05d3424fd8d541a.npy +02958343-2df225b8df2633c231141a7d4d06dc13.npy +03593526-5cb41c58e0bb0b44deceaec2593e1649.npy +04225987-980af78085bffb43d790b0d3f0ce898d.npy +02958343-4c3fe644e76bb94fb3cf5236f651a8e6.npy +04530566-bb601d5ded9bdc00746ffcbc44510229.npy +03636649-e529fc190753cc9df647dc544bb0ab61.npy +04090263-5e7afb318ff701583018d2d3c13a7462.npy +03001627-adcc6534d6db1ff9dff990aa66c50fe0.npy +03001627-fcfb3a50acf5e83ecc0484ea4f50062.npy +02958343-943be90f18274083becf71e2e014ff6f.npy +04468005-e52819162400a82a54189e414c6ba9c4.npy +03636649-154c35bf29fa227df51f77a6d7299806.npy +02691156-a0d63ee7fd87f93619ba010ddb4974fe.npy +04379243-6449378cb78f081b2369c46027bce7af.npy +03991062-e4b68a848bb9677e34c8ebd75c7d8f3.npy +03001627-28a0b2a5afc96922ba63bc389be1ed5a.npy +04256520-37cbc18323826bfb19fb4103277a6b93.npy +03211117-eaea42ae1a406492df8cce42a274b981.npy +02691156-89175682a6cecf548966fecb9138dba7.npy +04256520-54a08dff9191dff13462c3e6678345f.npy +03325088-3b0a1265844b0a54e7ec4274d0a48ec.npy +02876657-77be452b59bebfd3940806ade53ef2f.npy +04090263-3e4cc718eb6aa9e4559750dd149043e5.npy +04379243-905edb931ab4be1e27356ce25a15eb6d.npy +03691459-9f7eb24e82020dcf40df330a2f73b17c.npy +04379243-388c9f343896272813126e7abd481c60.npy +03001627-3c83d6ad882270287ad11050da24bb12.npy +02691156-910bd9a7d9ac4738d5c4dc314e25b351.npy +03691459-73a695a6323e1d38eb5f0682bcf1d404.npy +04090263-d1be6a2cebae5ed7609e2d916fa0da27.npy +02958343-2ccdd6d8db5a366f93680c5a9a367b4a.npy +02691156-c76f2214e133a81adbafc7250d0654e.npy +04379243-97af27d6dd13962fae9714d138f9ea9d.npy +03928116-899c7d740d89ce5740332412c5d013fb.npy +03046257-ff3923d3ee5855ae13b6a765d5fd3ff9.npy +04401088-5f600251394fabe6808ca88aece2e3dc.npy +02958343-d164a37bffeb5a83f04c8b6c3407554.npy +04379243-5c1d815561a7725496c29359f424ce25.npy +02933112-7b97739140eebfefaf8acdb77a4cc720.npy +03513137-7c3bf8abf7b2b41e172c0c1bc4c72a8c.npy +03691459-8d88dafbfd4200c772e8dfb640f12f2b.npy +02818832-a207c52399b289be9657063f91d78d19.npy +04379243-58fc0d5a44ebbf194f6edfbf4641cd2a.npy +04256520-8f23005418fee71819fb4103277a6b93.npy +02828884-9027bc9728f006bb40f0ac0fb9a650d.npy +02818832-290b083404ea24c87ff6ace05b36a5.npy +03642806-5a13f7551c20eb29f3ebfe51dc60263e.npy +03624134-891b987aff4eef786600258587aa4835.npy +02691156-56c827003a2fdb16853d2b3113ecdbb6.npy +02958343-91c12a0bdf98f5d220f29d4da2b76f7a.npy +02818832-a0078daa6d0328026ef2f8c390381ab2.npy +03001627-8e55684da4fb8219d3f6d823f04dd65.npy +02691156-b4cc2bdefd4f9ce13f4d6518603e8629.npy +02876657-e4ada697d05ac7acf9907e8bdd53291e.npy +04256520-23c4b23f2e74d6232fee6b7db2f5f826.npy +02992529-8959f06b36d90e6a7c4a9987d1ab61dd.npy +04530566-c3648d0cd141035428cf87eb5ebe5e6.npy +04379243-1952d19986c5f122fcf7c0d4b65182c4.npy +03207941-e7323270ebc99539121859336e292a5d.npy +04530566-7488e965278a8b8524e54dbd7430a489.npy +03046257-7608f3f2d484aadd5887f1f81e7530ec.npy +03001627-a2b55fd7ab49da518a049f37ab48adf9.npy +04225987-24e46e195f4907887a70e5e6aa241c88.npy +02880940-f09d5d7ed64b6585eb6db0b349a2b804.npy +03001627-9884421ce028e9b1d2ad4916ac26e560.npy +04090263-193e079f24ac1ded1153b2cafc57da88.npy +03928116-e99e6a956739d58f62f4bcc4369f8010.npy +02958343-ef2655aecd7d8f2b6fca0ec9a39d7a9.npy +04379243-eafa1680912b4ee3391e4d6c585a697a.npy +02933112-4bd1e17e8bfe8d5622309d9bc2301ff1.npy +04468005-47c0481747741fa247367565b9fdaec5.npy +02691156-6cf2f9112ffae7c3be54b70092ca256.npy +03948459-c5f8a50d7f32abef283f56573a59ff6a.npy +02828884-739d41c59dc387e575f9747ff6fb5e8.npy +03325088-f2c9422c2c427a8f3321831d2245cf06.npy +02828884-bf7342b225f836a9d2b12aa6a0f050b3.npy +03001627-ff143c09dbfb0e8029e513fd785f7886.npy +04379243-299b3728b46d7a4de343d70bc2971644.npy +04379243-ad86ddf54e0db02c5d91cd746759626c.npy +03467517-97aebbc8b63432d3d2f0cc036969ee4f.npy +03001627-69a7ed6a13ef4b2edf6cfab91d65bb91.npy +03001627-452115e132539be4daaaeef365d8f6e5.npy +04379243-683fd587db784b87a71c812e027f94d9.npy +02691156-fac4af109beb0108b4f192eea1889928.npy +02691156-48fed12884533a5fe48f6bbab67fa514.npy +02958343-ed6780486efd79a9fc3898548dce2392.npy +02691156-8c746468d3dcb6d3ff3a35e90542981d.npy +04379243-db20d1cc56356476a58a1de596e6d773.npy +03636649-7bd642ba9f7cb683fcb8d8c6d4df8143.npy +02691156-7f6af37cd64377e1cabcecce1c335df1.npy +04090263-14ae67574004fc83dd0a2071dde26395.npy +03636649-77883e18cc08859ddb1afe6c464e7652.npy +03928116-438f64dd9ff80bfddd5efa4c0e7932e.npy +03001627-9d28a066df22319cca2e16d6cd76503c.npy +04379243-cd2a53371cacfac49a3528690d225ee1.npy +04256520-d377dbbf7b198ad474fedb3ee91ea4c1.npy +04090263-cc353b464c22be528ae80165ba928e0c.npy +04256520-a875e8dc1a39c769440e386b5061b2f6.npy +03001627-e3d23dc47ddd9620c9be65dfbd21428b.npy +04256520-9d436dcfd61622d6199833105dc1a90d.npy +03467517-ae28c848f2655f8bea94ea0f135d0e2f.npy +03001627-7186f1e8dbcb3e8a116162acefe23592.npy +02828884-e1ce45ee8de4436655a9b4fa7594b177.npy +03593526-8661762e0da6a8a29d3d767e1bc88d65.npy +04530566-3897d265d993ee2a1fabf3cbd0fc77bc.npy +03001627-11525a18678f7ce6ae1e1181f20bb9c8.npy +02691156-62d03831457b2fee62347b4731688b0f.npy +02828884-6d08f3c059e674dfcb2a965e75be701c.npy +04379243-7bf5f689da285153583ff8a5fc7c1869.npy +04379243-6b276165b6118e85ad312873b158ac49.npy +02808440-41d90b22f1c6a4a083b345c7947a2916.npy +03691459-f75f60a086094c27e5096e2c6dd4fe11.npy +04379243-d05c4f1b47e37e574b3c42e318f3affc.npy +03001627-9bdb034f30c404edba1028cd22cb8779.npy +04090263-271e58c2650147829a6e43b878d5b335.npy +03624134-11c987c9a34457e48c2fa4fb6bd3e62.npy +04530566-1e3f014e8eba0db7fa575e221973fef.npy +04379243-77d20db9fe05302376e9713f57a5fcb6.npy +03001627-8830f76c748f09ef3e870ba5db422375.npy +03593526-f8f5f60f804f0cb32ca2d100d9fc2f99.npy +03325088-17025bbed6ac4e92f25bf4040d22848a.npy +02992529-558c9b7e854db7da21844676433a0aca.npy +03211117-5bace77f1df591e9241640224e45ebea.npy +03001627-f6810de4042cc5ce57bd4bc6eae9b341.npy +04256520-a8b0e2a953f3ab6a68b3e52c71552a50.npy +03691459-3c71e2ce15ec92e9c8ae2f680beb7e46.npy +03790512-c2d942244bae1557b37378f3c85478b4.npy +03001627-9978e73fef1857bcac6b8e58caf61f95.npy +04379243-49eda1b86917d3d7d0a96520c31993ad.npy +02828884-4cd4797320eae6f90dac09d2827796c.npy +02992529-a860adc078391edc6774046e1fe3165b.npy +04379243-995f33073ca76ab69856fa70a578baeb.npy +03001627-9dc454ec0b5b7b50e45ef4135c266a12.npy +02933112-365b6a92fc2f46294da5feafe6f1c8fc.npy +04401088-bf259988d2e8728c391790b8b8084f0a.npy +04090263-81807680baebc5975516c1e9dd717741.npy +04256520-12c6a146bde9f6f5c42c7f2c2bc04572.npy +04379243-a6947349fdaf27ee9cba29f8b9fba633.npy +02691156-db628662ba1cac04b627754c4259e985.npy +03001627-84d783ab90b79f8036b0f2a1430e993a.npy +04379243-a4d27a18402f6f4511c3daed4b8d9da2.npy +04379243-75b3ffb0c09ce8b5febad4f49b26ec52.npy +03001627-ee8208e26cffa9f8ba208e534614d8c0.npy +03991062-3222a71a73df75a36a808760ea50bdbd.npy +03710193-293698b318418f16635f2989c7524167.npy +04530566-91a124454518abb7f2ad837508eb2db7.npy +03001627-b9a7bbf1e0b08853bed1bd9593e318c.npy +04379243-7aeafb18b724738b9d57383d20e2e6b7.npy +03046257-a6b58e9bf4b74ea461e381b34d499d82.npy +02880940-d162f269bc5fb7da85df81f999944b5d.npy +04379243-109a8d453ce93a6fc21b51dd4113da62.npy +03761084-1f50be38c10cc2201c8302bff3c63802.npy +03691459-2629234a2fa847dd9b106ceb230ede0.npy +02747177-f76b14ffc2fe6c7485eb407ec5a0fadd.npy +03325088-38d17c83d5c891a2c36fb70296e45483.npy +04379243-b1d834cd686cb8b8477f06cc543186ab.npy +03001627-447a5eee395026fa8d09bc92d0fc6d3a.npy +03636649-f842fd7369833b91b7e3a72c32cb38c.npy +03001627-60186a5e4e1aee8daf8fee88d245152b.npy +03001627-a62bf8818c8aec7062a510b8f97c658e.npy +02933112-64af194c4c53040e492d9da2668ec34c.npy +02933112-510fa8653c10b0d1ccd0340812259a39.npy +03001627-606cb23f9a7f23ef51f77a6d7299806.npy +03325088-647209d564ed6d174b47d0a1f007bc8d.npy +04554684-969c60ef5f2c2fe696d5fa1ee6ada8d1.npy +03691459-6aab9afbcdb94edeb59e9758ae7f41a7.npy +03046257-f57ba7abc40fa531e8b2e9c72a02f109.npy +03467517-2e4ec0874ea34a50812ca0ac90db1c07.npy +02958343-a1e3c4be68cfe110d9e74b7f1cf9cf3c.npy +03337140-a369ef0e532948457283e1ee3c77e168.npy +02691156-7b39d993f6934a96b08e958a32ef3184.npy +02747177-5bc989c9ee00622278353166fcf5b850.npy +02958343-4e7d91a6e2300d88a3049d0dcf503cdf.npy +02958343-18244d93dbd2afbebda733a39f84326d.npy +04256520-61711ab3e6fe99ef1c6aa36e5af1449.npy +03642806-da0f6b3a375a7e77e963c7e7c24b8dcd.npy +03642806-22389f9c3c049ce757c29983a611b1c6.npy +03467517-a8a9da30d35cc70bd57700c05b1862d8.npy +04379243-9f035e68630d704b46fb9c38320df24e.npy +03001627-f106bc80265faaabf78fc6de5952fb84.npy +03790512-30f5eec1a7fbb5884fcfb655743e93d8.npy +03691459-16ea8ecabd3f373bdef52d9b75805a83.npy +03211117-32413d2f2103b3a5286e185ca42b30ee.npy +02691156-b10ab8efa0aed59e90baeef8ba5b93e5.npy +04379243-ec34ee731c9dd55758df8eeaf3dad1c.npy +03624134-80f0436251c2108fb6bde4b7e6c6613.npy +04401088-2293983c6f234d94e304974abc9afad9.npy +04090263-ab4fd00b47d9d6f4fb5c1b0f759e2bc1.npy +03001627-26421cc00c639ee55a5324f7626af787.npy +04379243-72cfb60a075369ab7252c133a7e17d94.npy +02958343-7bdcd746432bf123416a3426987b1133.npy +03001627-56902e76cb4f1039c482eb499cc8fbcd.npy +04090263-b27b78d3e1c97180fa9286f039319ff7.npy +02958343-f51555db645f14468bac13e007a6e9.npy +04530566-a0b661c93028d7de798832e32e32aae6.npy +04090263-eae96ddf483e896c805d3d8e378d155e.npy +04256520-a9439ca0eb112e7782287102d4d0c28e.npy +03001627-f1188bef2980d2c985b479b317175b55.npy +03001627-9b9cfaea2a7ba04c461ec9f1803b17a7.npy +04379243-e089dc57993ffcc72fd098ed2128156.npy +02958343-8c1664cc8771aa3fce95c44a0ed1e01b.npy +02691156-79dba7fc4ba0829d62b600da24e0965.npy +03467517-39a2bbcc322da804b78788f924c5f0e0.npy +04379243-527b2d1e964f056383be1aa5a5ab0c80.npy +03001627-fb847cd696ec711197f2016c3d6097c9.npy +04330267-60727797b710f68659a84e2e2b7fb62.npy +03001627-2621666fa21488a4e922ceea1248b9b0.npy +03691459-3bf8ec07e1643746b319b8417d912123.npy +03001627-d92f4a4f2faa545ed08f729a736c90d6.npy +04530566-f66bca54b97bf719b1bb46d2556ba67d.npy +02880940-326c6280eee2bf74257e043ec9630f.npy +03001627-bec151e32bbc7e9b28c54e8f8953f499.npy +04090263-213c8d7870b4bddf320c2b53dcebe82f.npy +04468005-3244c30d7fa72016dc14ba0818ee5cec.npy +04379243-96aff91d7898cb1358df8eeaf3dad1c.npy +04530566-57a8ccaf2eb8d6a3924d278e5faa7137.npy +02691156-aa780af4d9cc83c3669c7dec71cfc5b0.npy +04090263-cf72122ff9caadf0622bf4353f4bc7c7.npy +03636649-ad17118799f11952a3721d780ca17da2.npy +02808440-653dab02848c6090b362845c6edb57fc.npy +03001627-e29fb377ebf475c51b1a00a31bfed97b.npy +04379243-f28e030e715b9d3e318462aca9e62b6b.npy +03691459-4227748867df8cc020363e2561dd589a.npy +03001627-ed1816d4dee58c7ddc809959e304d48.npy +04099429-60e62b419220c21e1a18bc096aeb4c21.npy +03211117-15ccd76ba83a2e02b0f9d182eb000fb.npy +04379243-d1fab6f92fb0682763a371f6fe9862af.npy +02880940-260545503087dc5186810055962d0a91.npy +04379243-e86ddb9617b8c44758b3fd27263469a1.npy +04256520-3e499689bae22f3ab89ca298cd9a646.npy +03211117-af56bcebf21951faefc87a91fe7ba1b0.npy +02818832-af840a4bad942462938fba07665a5a0b.npy +03337140-551404936411078ce5d6e9371bb5c33.npy +04379243-8b8de5b5ce7fc61def9f898cda0ff409.npy +04256520-f76d1470e843601f14c803eab703899.npy +03001627-c3ebc70a348051e1af7c7ad2549a1b15.npy +04379243-cbd1cd9b5423f890beedb4c8fd29e2d1.npy +03691459-1ba39460a5e31c722a813544190dbe4a.npy +04379243-5f1ccf0974b862c6f0d0eca70b77de34.npy +02992529-dca3f5a8ab0b850c8c8e7e9e3310fb01.npy +03624134-8ded17ea250fa58dcc34b900bb2492e.npy +04090263-2d203e283c13fd16494585aaf374e961.npy +04379243-4739bfb9ab23e4b92a87c4cb5e925da5.npy +02808440-b5ebd151fc2625da54d7082b34825ef0.npy +03211117-c57bb5a71ebcece8751bb40f9a4c6ba5.npy +03001627-6a9dce6566cd61652b339ec555ba3bfc.npy +04379243-5dfb4f36101a933ae1f4ca4f393a5a35.npy +03513137-354b570e62b161b8b20f6e48f6a30cbf.npy +02876657-a1858315e1b17f57e1507433bf0da3de.npy +04530566-b6ce7ac71fd3e33617a96ef097e71178.npy +02958343-12cf05b9f5f2d2c195c8d3a7db4dbe65.npy +03001627-f4a2478ebfac3e56b0957d845ac33749.npy +02691156-75705b82eb24f5ae23e79e99b949a341.npy +02691156-f1df46c588524ee76aa3bf023a2b42a5.npy +03691459-58cdb18878bf9e42d00d418bbce73381.npy +04379243-1a8fe5baa2d4b5f7ee84261b3d20656.npy +04379243-1d332d00746e2dc0f8fe975c2cbdb85c.npy +03325088-114546cb7b19119da70cb86be490e5e.npy +02691156-fc2d2df18182df8c82a2a8a82be86fd6.npy +02691156-9159a77918eb86cf408508ea36928b08.npy +04379243-6ebd63203c1ba404f51f77a6d7299806.npy +02958343-ad45b2d40c7801ef2074a73831d8a3a2.npy +02871439-40f49755a7a7e10effcae7f0dc8a7587.npy +02691156-c0c49c529f1ac5d8ca8607f540cc62ba.npy +04401088-95e61ab6f817d7ffdf3f86c9fe70c0ad.npy +02992529-cb9e8cd0a29cbb26b6d41c42f7ade8c8.npy +04090263-124fa4277bd03c74359ad7d9ce49f504.npy +03001627-a021adf9bdfdcff68d12adb6778d2a90.npy +04379243-453e290f4425e0604671fddd657dec0a.npy +03001627-5402eecc67e489502fa77440dcb93214.npy +02691156-fbf6917bdd86d5862df404314e891e08.npy +04401088-84cff93cb8ed08e55acbb5d30672759.npy +02828884-8450be279a0ea0b555839db883c17775.npy +02871439-4784aa14cd3a65a1898bf206629dc8be.npy +04090263-f6e2f5d6b724d8f855f41a702b987e76.npy +03691459-c462e3b75f570a3b42227a2ba4dff5ab.npy +03325088-142ee2de14c410623321831d2245cf06.npy +03001627-ef76b9cbf76bad40586ef70b3cee4240.npy +04256520-cbccbd019a3029c661bfbba8a5defb02.npy +04256520-aef8e3f17370fc8ecc98452c8fce6b43.npy +02992529-e2ffd39f88dc381c3455cac94a339dea.npy +04090263-55fde587d83088b39a2ee232a197081e.npy +03948459-9d5e90c0d6e341093e63a7526ef5b080.npy +03691459-59b78ba40b16eafed6baaf394ad18924.npy +02691156-c087319ca6126c51c5b0cf694baa734f.npy +02691156-2bc0d99cba39f7adbbf3143b1cb6076a.npy +04256520-395e53e3fbd2e717557ab4b593540354.npy +02691156-2a895d17616bcae1f361e4786a4d3c00.npy +03790512-e553d75a3635229b429f1c522640e6f0.npy +04256520-ad0e50d6f1e9a16aefc579970fcfc006.npy +04256520-68f6b68bac9f5d64d929fe644a1325a3.npy +02691156-e557af9d5aa40f424d210d9468aedaf2.npy +02691156-494a1698eb82572c3df325aac2f73830.npy +04530566-8e06600c02764ee98aa3ca9bfd776ccf.npy +02691156-a991428cd388fa7278afdab27190395e.npy +02958343-f6e5c35314beee84618e9d35559b7aa.npy +03001627-24445a532ce3e18f7b5f4d129cc2873d.npy +02992529-ce0d1ea23002e463861d8a7d0e05bb62.npy +04379243-551bf4f010f155ea4718e6c48e1ed95d.npy +03325088-5ae7c06613656ce8db0923ddab67dd72.npy +03001627-d9ce33c5f448815d7062f2d72cde5c95.npy +04379243-3c4c8e7ebdb95c2089a886870891682e.npy +02992529-7434bc601d949333cd5ca8d1acb8ce0d.npy +04379243-c5143483b413b4ed6991c1a663897b1e.npy +02691156-8c42e3042a4beaa7d5c40787c7bb7824.npy +02933112-64b8884bcd36c6fef94d7e6d8577c8ff.npy +02691156-5c9b09738d7920f0546100d9c41f5274.npy +04256520-c4e36c36679f27887586d00bc0d54b2e.npy +02958343-957a686c3c9f956a3d982653fc5fd75b.npy +04530566-b090b42f3dc0e7a4aa7c6f19b4833a28.npy +04379243-630de8111b5299f5f51f77a6d7299806.npy +04090263-28444490d359fe49cb833b31b53d151.npy +04379243-351c0bb85c887df27ff6ace05b36a5.npy +02871439-d66cd9f08956a1627d1b264ceeb294ae.npy +03001627-39ac0b216df14eecd225e12279334514.npy +04379243-e9cbfadc69d199c6368aec320face349.npy +03001627-b0849a1c01da76eeffa41024c63fa9db.npy +02958343-9c35f00f81110738783854950b26f0d3.npy +03001627-48106a12bdc3f7d8f5ee22e800bb9145.npy +03211117-740c4c76185ae7ef91a491e8257bd6fe.npy +04090263-4e817fcc0fcf1ba0b2d09bc8d348e46b.npy +04530566-6c9020061d71b190a4755e7555b1e1a4.npy +02808440-544762f1081340bd3af30a3946d92feb.npy +03046257-6965979c0f35f7adcb51c5ee8218e4ec.npy +03001627-659fdef8de4769079c251b4a7838829.npy +04379243-38b0f5874f16c1264307817adcff8140.npy +03642806-679bb4a724b1e2bc3339d8259ddfa7bb.npy +03636649-b230c6d9aeca66e52633ff66beb9cf31.npy +04256520-24f03d70f686533d7583d8e3d877fffd.npy +03211117-bb284aaeb7ccb54b5c4dc8ac281ba59d.npy +02691156-989da7f7bce36747c6c291015ab44100.npy +04256520-44e151bc576b4b059a46f459dd13f5c2.npy +04401088-cb21dc07d0ca602b151d8b52c53b90.npy +04379243-14e5e4db3246dacff12d7184a2ad3430.npy +03001627-4ccc0a3cc38c41af666bebf1a1d4e946.npy +02691156-1b300fd9ad4050e6301fa0a0663ee996.npy +02933112-b1e2647ec67a6402d616724413b4089e.npy +04379243-90a1748069ca92df9667b9ba9d06c778.npy +03001627-fb6c81cc88761a927cf3afd3f215c3ae.npy +03001627-8bb9a20b7090c90bf2356faf7e20b90a.npy +04379243-f92b1c64b0306322de6ff974c28c2f8b.npy +02933112-6db5a05080eb2480f863ead9331efd45.npy +04256520-d5b99ed4075d9ad559497798da6e2013.npy +03001627-8c81ff18e04584547f409062bafc8e2.npy +03211117-aa73f1b28817376c6cf19e722198d69.npy +04530566-3bcfc7f00e9fb213846571d66928670.npy +02958343-adc6f0f3274cf92cd4f6529a209c5dc0.npy +02933112-7238faf31667078b2ea98d69e91ba870.npy +04256520-b913678e74f02db521f0090670ee931f.npy +03001627-611f235819b7c26267d783b4714d4324.npy +04401088-7fa841359a3dce3dbcb8492ce3867c34.npy +02828884-247227d258f2c239d4d8765e3910f617.npy +03001627-f6cb298705842600bd259faf16bdac27.npy +02691156-1367266dc0a07c925d4533028830a79b.npy +02691156-5c74962846d6cd33920ed6df8d81211d.npy +04379243-1c40ccb81c862cbf595d2b7814efa054.npy +04090263-c39040b055a5ba329a2ee232a197081e.npy +02958343-3a5357aba2201fb03f823401cb5b3c88.npy +03513137-2171c3694013b15177b4e19e75551fd3.npy +04256520-325003759d3fefc7615ce01bf34878f0.npy +02933112-22cbdf59fb7fdae277b4d8470453cb5.npy +03001627-71c83afeb7e203e1bb7d8446afd650f5.npy +04379243-d386586a2fef0389393a1ce5402b0d23.npy +03593526-724fb5eb32401b96ed681532841d3af9.npy +03710193-dd76ca1f36937b5e558d3001d2e30ac0.npy +03046257-e51d02a4b1ff76d2dcf98ea199a73d39.npy +04379243-42191edf2eddbd733def89b32cef8e45.npy +02808440-ce8ba9a23d9fb8ac125fa9990176f0d5.npy +04379243-87385a994745e92cbc052c28a9e28ccd.npy +04379243-15bcc664de962b04e76bc197b3a3ffc0.npy +03467517-a26782a7130d5b76cc5a6997e65650ba.npy +04530566-dcb9f686556399a51a57c39f178ee66e.npy +04379243-6183e3d4c73872cdc955e5ed03ef3a2f.npy +02691156-26e10058cf9835aaca8607f540cc62ba.npy +03642806-81bc775eeb14299279510444cc61f839.npy +04530566-dcb390b2e8e5093def84f4e0accfb14e.npy +02691156-eb60d49fd5cdb809e6a2524c335c48f9.npy +04379243-1805ca3ac2779a443eec26c23f5bc80b.npy +03948459-aea1db1c8c014314314ac38f6030684f.npy +04256520-b581f1d0e58ef9db584536aa725442da.npy +04256520-961a646cb33dc785b0ed39ef5ec2add2.npy +02958343-a5dc2526c9ef78b96212c8f6cd06e.npy +04401088-7a1eba075f17d7b0a456028305c31de3.npy +03001627-7f5d8154877887727efcd98cd5f24de.npy +02933112-d4fe9416de5e2a95b022c94235bc8601.npy +03467517-e175f500370eb8f9561dce3fe08634b7.npy +04379243-1b805da9981a6393f454e62143e2dffc.npy +04256520-fdcf1197a5bdcfc1ab610b0c94236463.npy +04530566-c8dcc1e4f2276ef1ca6895dabdbc0ada.npy +03624134-925bb684816592ce35f686496653f774.npy +02808440-5af2dea565f2cd7138da322e72ae3fae.npy +02747177-ea5598f84391296ad2b12aa6a0f050b3.npy +04379243-1040cd764facf6981190e285a2cbc9c.npy +03691459-f2bb5c899ac2de670eb1591edd539b.npy +03001627-1f1a9120cba6c1ce177b3ebe695b7c2f.npy +03207941-85d91f3e489df57d14b35a7d7cea7130.npy +03001627-174019d47144a9462fa77440dcb93214.npy +03624134-9968b313d498ba92bfdaede1c9f37e88.npy +02958343-306f684fa89eb73ee151bdef07e713a2.npy +03001627-fe57bad06e1f6dd9a9fe51c710ac111b.npy +02924116-56a660ccc0a78a5d9c96fa78389d2873.npy +03001627-d8e2bf1107567774504721639e19f609.npy +03691459-c6eeddeb0366b4b6cf584303d1a1b5a3.npy +04379243-58a9e0e6fc43ccc5db32b682f6360550.npy +04379243-28e64eefcada205fddf120185fc0b2a0.npy +04090263-81593386d69131c5228625d43be3e606.npy +04379243-1c70e72ac0eb77816349f6b5431fb3d1.npy +04256520-546a90c5b673720bdb01c957364e77d0.npy +03211117-dd724473b5eba80421844676433a0aca.npy +03001627-a487bfde2aa50faa6d7bcadc05e0f4c2.npy +03467517-9dcc9c7653ade6f363e148e250c0340d.npy +02958343-f92aab09a6a1c6556c23793d085f1519.npy +02933112-73789bb6c0286415db823df37b893ef4.npy +02691156-133937bd45f953748be6919d4632fec1.npy +02828884-807b854a7c35379af5779d217e69b7a8.npy +04256520-ce46ea86a7f7a77b3adc3470b30138f3.npy +02992529-2b48b14e226b131af3b2c084b195b056.npy +02808440-8f7672193b88c72db8724a732b3d4cc1.npy +04090263-c446a7135467cd83e906ff5bb78d7b1.npy +04090263-3a23773469b2bfa8c12463ed30107df0.npy +04090263-661ad35c5c3a908c6d1e04c7ae242f3d.npy +03001627-fe6b3c001a86d844d5767a0de8dd037e.npy +04530566-854728b0055ec423e4f0b6b21d3809cf.npy +04530566-a443271055ad0ebccc9f5b25407f3c72.npy +04090263-3b614a18f9c8eecbf0fea2ee98610322.npy +03636649-84d66f07cafdfbc4fcb8d8c6d4df8143.npy +02808440-b73dc1a43a1f4685e06a964c79aed206.npy +04099429-e04bda8655d9e606ebcdf982796b4fa.npy +04256520-be1eb41cc9eb4b04ae685ca100c909e8.npy +04379243-5d6b4205111991c879170a5f8beda902.npy +02828884-781eb96c0a6ef0b48a51001eb8d95d32.npy +02933112-763d3c4ebccee884da5feafe6f1c8fc.npy +04379243-45c2a08625ade6e5e50eebdd2d05baeb.npy +03001627-9b275819a433a9c733e4fde2bc371944.npy +02876657-2db802ef3de3d00618a36258eabc2b9c.npy +04256520-354c37c168778a0bd4830313df3656b.npy +02828884-b71a0cca7ac86498430b7446f9e1252.npy +04530566-bd4614ae4c709729f8527bdfe6691c9.npy +04379243-a364b8af9a8d28acdaf1a853214fa9f.npy +04256520-e86d2ddb1e38d2e082db9fca4b68095.npy +02691156-87ac28e0b2342ac19a6e43b878d5b335.npy +04379243-de90266b552fd26c2ebeb1e6a8111f53.npy +03636649-35bc2c88e20e099db8bed6beeaf025b3.npy +03001627-f1a1bb6ad29d703078d928ba1c4a6f75.npy +03593526-1a8f9295b44b48895e8c5748ca5ef3ea.npy +03948459-8c944c84863d3d6254b976bcc599b162.npy +03636649-427806f30c61059c22e05b5d2ce39e3b.npy +03001627-410146dc84b6196230fbe480cffda9d3.npy +03691459-158f8a4ceaa281ab2bf4f773fe0e622.npy +04379243-90cd6fd66e29d712486040c0d9e85846.npy +02958343-40f160e49a6d0b3b3e483abd80a2f41.npy +02691156-f04fbc2423b13da170832200321e72bc.npy +04379243-f2d39c20369e9c524b1c88aaac3e0ad7.npy +04554684-d5ad82f383a9536d46cde67a6a1ea328.npy +03001627-ce055b7a4cccc7e182db9fca4b68095.npy +03001627-24b5aa5ca592ca5764945fb936667f89.npy +03636649-46aaf3bca1d0a3e776e9713f57a5fcb6.npy +03001627-ff5a945aef7a68ffcf9ff3ee543c2925.npy +02808440-536cbcc72e3f648fb362845c6edb57fc.npy +02828884-e4b80a7e381c6ef0f4215050a7660e65.npy +03636649-54ad0800a524a96ee039576a17a0737d.npy +02691156-d12f7698698bbc8f9b10643ba761a774.npy +02691156-7b3ef304a0088b39112e53a423c9745e.npy +03636649-a172874df5369cea1e70766334ac46af.npy +02691156-6d52412e798efdeab87697d3904b168b.npy +04401088-30efef3eef4b37eb9ed75a6428ac0ca5.npy +04256520-58156edc9c54973014038d588fd1342f.npy +02808440-7fc6a3771c2018d91884c7a487bba311.npy +04379243-93f3d802ab5132d162079c4c0e1b031.npy +02992529-67baf038e83456967f521a3dcd28e9d2.npy +04530566-586154b90852a5c2e0a6b888ad6abaa3.npy +03001627-37645c4e5ddb142e89955e67129be104.npy +03001627-6e965fc2145df32f4d678187b8261d95.npy +04090263-124f09d314c2c229331960c3710d952.npy +04379243-b45217934564854288e0556a2aaca7c7.npy +02691156-19ff8fce1658f864ca8607f540cc62ba.npy +03211117-8a7712d5c8614b97974e278a62ec98f.npy +02924116-3ff98b31a921fd0f51dc8a1ad94841b7.npy +03467517-8dd7df733a5ba17acae98171fea031ef.npy +03001627-a32e7b7b9e2ec5c351bcd597cb80c1f9.npy +04256520-b501220805eab01a6599ee0a44605cc8.npy +03001627-b3ef15af53eff822423da7f4f4231bf7.npy +03467517-cd17325861bcf9d22b24594c4702f953.npy +03001627-369caaf3ee33837ff2c0848478a667ca.npy +04256520-69b501570e12c4a12c216c5e0f221195.npy +02958343-69986baabb9cfdd1b1bb46d2556ba67d.npy +02691156-97e58a98eeee184565d73e2944dbef1d.npy +03001627-a808d40b66123c7ae9602306ed19eab0.npy +04090263-d7bcb405e59d20a112b38b1d99376c0b.npy +02747177-a97bd9998d12467d7275456565149f4f.npy +02691156-5c63ad3688c623b1a787d03c28977672.npy +03001627-4c1d6b12b48a80b0ebd10747ca93b13b.npy +02691156-caab31ecfe961086bc0909d98a1ff2b4.npy +03761084-cc959a175b783b95de8982fc28ddacc3.npy +02933112-4b06417d98fabe3b4c62bee40dcdc539.npy +04090263-3c92069416189d7fc7b525efdf38a3c1.npy +03624134-22671e883ceefd85e41f3b9c5c62b1e7.npy +04379243-33c6e3b21a67b750e78d7b497732dce1.npy +03001627-9c88f3031c4a660da6fee8e2140acec9.npy +03636649-d2a4c36321c50c06d28b52ade6c7e48.npy +04379243-6688fbb6e3fb092eb1b6b0c5ddacb607.npy +04090263-ed502e8af9df3df2c933c3e835f6d18e.npy +03001627-1f8e18d42ddded6a4b3c42e318f3affc.npy +04530566-f45d51939d8ee9122698fe11741f2ba4.npy +03001627-263cb748cb81e69cc329e2758ab09ecb.npy +03001627-2ae5f2290acacd7fd5b24cafb84903c7.npy +03001627-b2bb0eb5670296ed5acd449a2ae99009.npy +04379243-b074b6460f46170660edf8bc2f5c8881.npy +02691156-873f4d2e92681d12709eb7790ef48e0c.npy +04401088-ce0d1ea23002e463861d8a7d0e05bb62.npy +03001627-94d55392edad30d35192e08e628ef9a8.npy +02958343-1c7a2752e1d170e099399ee63318a21b.npy +02924116-92417d3466ae88bd563e41b6f7313ed7.npy +03001627-2182398f0f8fdd81af7c7ad2549a1b15.npy +04468005-8944e940719c340b9954eae9164faecb.npy +02958343-631aae18861692042026875442db8f4d.npy +02691156-c9ba5885f6ffc835a8cba409c4409ba9.npy +03001627-387dc2c22bdf6d2a6df42853f67b5836.npy +04379243-d796405237a2721937251258858a7a58.npy +04530566-8a779f2127dee13b28db2e450917f8b5.npy +03211117-cb0bbe56efdc7c2590fbc3d35abb4728.npy +04090263-75bf3b1cfba045819e172a9318b5b7f3.npy +03001627-264322794651490ec0d3c02f7e255b2b.npy +03001627-b659a94c6643282f504721639e19f609.npy +04379243-c271d00152fb6363214a15a5a42c49c0.npy +02992529-49a51e66314253d3f2a0433fb7c53e0f.npy +04090263-66f804b1400a139ab5aa01b641366717.npy +04401088-29f27d4472a17e723fd445ae159c2cb2.npy +02808440-97f7ff0b07dc37c18dcb895d63e0dcc.npy +02691156-1db7bca33ba446aba5cac89017eae8d1.npy +02843684-2293faef03d23ceecc1908493f380315.npy +04379243-6dbfbee18b2e149c71a782a4379556c7.npy +04090263-38a906533b048ad8341b8a806253912c.npy +03001627-a2824df0ddb58c0617b431cae0dd70ed.npy +04256520-2ea00b36ccb8d3baefc579970fcfc006.npy +04379243-153d0c95cd2981a46a76e23e6f966dea.npy +02933112-c09fe6e32490f4511b17743c18fb63dc.npy +04256520-31ae964a8a9a15e87934a0d24a61231.npy +04330267-34c8bf6c8dc677995147c3e89e46a102.npy +02958343-91f59dc0d204dc64260a770f90456bf7.npy +04379243-f864677894410315ab610b0c94236463.npy +04090263-af877a0a066fa63ffd180252c91ed0f3.npy +03001627-df6a3bc55f86781218930ac69342cc5c.npy +04530566-c9d1159874c934f16f1b09a7281511b8.npy +04379243-2892423e515ee379530176ce07cad21b.npy +02808440-61a19c2b6dbab7be1291d1279f7bf122.npy +02828884-9f51e1e44bd439f32a0697dbc1a34813.npy +02691156-530540dc968b396d7f3805c1aec66f00.npy +02828884-71970f9a11b0b5bcd7262b1b986920e7.npy +02958343-a53f8a03871fd1d1c4e15ee0eb85afd9.npy +02958343-4baaabaced0c9e0ac0e3666c7d0ec7d0.npy +02691156-67c8fe06930cf8788762ebad71629f9b.npy +03001627-e821fb5eb1e21368c341afa383659322.npy +03636649-39fcaf51940333b46ab88e9b8b75d248.npy +02828884-879fec928fbb6ff36b95ce378e386482.npy +03001627-ef89cc3901e27fe0c5cedfd70cc18cf1.npy +03710193-c6bc72f24af5ef42531a9cd007e29075.npy +04004475-6120c9dee581013e940d5ff3114b57.npy +04530566-94ddf20a9a6e035e85f7a3de54751f1b.npy +03691459-a58fe03c817fd0311ad88f716ea80910.npy +04090263-ffe20b3b5f34fbd0cbc6ff5546f4ec42.npy +03001627-3586ceeaea45b3598f5bccb3529a48d.npy +03046257-cea1956637d8e28e11097ee614f39736.npy +03001627-dddbd223b3bbfa8efd93c2ac42357c74.npy +02691156-fa5c740ca9192b708e8131a047a07ce1.npy +02958343-1079efee042629d4ce28f0f1b509eda.npy +03467517-2352c23fe113d9c754ed8bc786bc3eeb.npy +02958343-a053946cd9048d46f200a72c9245aee7.npy +02691156-fbcc12c5530ab67cad659a74e36b6387.npy +03991062-e7bd0fe36857413d236f012e801e4d49.npy +03642806-7b4260884a1dfd76b080af510dd640b.npy +03001627-4b2ede169dcc83ce4591019e9d133858.npy +03001627-9d20e4d4637e66175836897f0d296c15.npy +03790512-5c0eaef35c2911ac1d7cf2c1f472233b.npy +03948459-fe62130ce6fcd9b77754fed890b42399.npy +04379243-94a458e0932f189f755454a26c190c21.npy +02691156-5bea928fa9b2255ca8cba409c4409ba9.npy +03046257-f904afa5730aee1ff4700e9a01318eca.npy +04256520-fc24d012f6b12036aa1f8e0da2ec8814.npy +02691156-b089abdb33c39321afd477f714c68df9.npy +03211117-f84f47c7ffe0e49e44175b4dddf5be08.npy +03636649-40e6433da380273d128650ca4a80c238.npy +04256520-36d4a1a290c541aa21d25a6a55757584.npy +02691156-10e4331c34d610dacc14f1e6f4f4f49b.npy +03467517-d3684d071dcb6bffd3193ed047bef161.npy +03691459-8684b67d71677ac95ab0bd3eb49f9a70.npy +04090263-214dd04f06d5683ed17373579e6fd9be.npy +02818832-ecc1de9c62c1dc0559c46748f8e9b30b.npy +04530566-389d122da973fd5cd812ac1676a22587.npy +02958343-6bbcd5608ddf871a4cdd04162f008888.npy +03001627-c166f67f391022d31205bd848315f04.npy +02691156-2b62a8a0bcac6f22e1873a3963e0d14.npy +03636649-8010191bdd123581a7e0a9557e913c86.npy +04090263-66b3e706e98f22c7324318e511b81a2e.npy +04256520-e75990aa494d4dc7371ea954c8939aa.npy +02828884-ba4ffdf3eed29dea9f8c3d2002c77ddb.npy +04530566-cfffdac8ecda7575de208b4547dba0e.npy +02924116-d88be40c27f7723237d34ce4e00f2504.npy +04401088-9e2169e8e8186a3a27bac6c74974cca2.npy +04379243-c37912d7dc6504e3b7977f4fd4002c2b.npy +03001627-8c4fea06a94d7ecffd61677456447e.npy +02828884-b8f462d89a31e95b777c3ba457301e8c.npy +02691156-257d7b5ccd3b5c7f7c5c969e221ece01.npy +02958343-1100f9eac1ca426a3dc399576707b67.npy +04379243-10b0d655bf4938eae1ab19b3beff6716.npy +02933112-606d50b144d8ca164da5feafe6f1c8fc.npy +03211117-5934ee46f6872adbf19c9a0272a2c26.npy +03636649-4d6bced89943df73b4edf02c99e16daa.npy +02691156-b237bc484545cb46d8f63fb451ae8aba.npy +03001627-4ae3ee61ebfd4d7bc05575120a46cd3b.npy +03001627-2b8e3e95616a5fedabf945c9a80683d1.npy +02808440-8113b0f14206155a74f9a02bc96d14ca.npy +04256520-1cdc625f58dc911518af974879cc252c.npy +04256520-51396ab24d97a1bb245495d3641f83a4.npy +03001627-81889ad00179daf8adb91c074e672e22.npy +03636649-4c1912cae9d53594fc26f53456c58834.npy +03001627-88bdfdfb2a8b94ca1b17743c18fb63dc.npy +03001627-d0cf0982f16e5d583178d91f48c2217.npy +03001627-a1e16e59abc3fa56bf0788e630e3deb.npy +04379243-e36a5e4069db8198bbbe32d7a5038eaf.npy +04530566-8cf34976d5cb61b0f8901acdb7280141.npy +02691156-f5bb02c0df184488e0b6c670e0e97766.npy +04379243-5fbfc884ac25001e29426a0f57e4d15e.npy +02691156-dc03e743739c4f87c27f2d9f006d69eb.npy +04379243-317d8dfc74e872832b70eac6546e93fd.npy +03046257-bebfc25c773a5528a7f2fb8267777262.npy +03001627-2b3da2a8773d2571c3bd24f986301745.npy +02773838-88d375bc79ef32532e50abc7a1305908.npy +03001627-6ecec258a1b6fe2a6fee8e2140acec9.npy +02691156-e88a8692a22d548e1ec438f11f5ea1c3.npy +02808440-d847cdb16cae06404d059d8c55114915.npy +03001627-dfc2328946b2d54a29426a0f57e4d15e.npy +03636649-9f4b472b57e4eb76376135b28de9dd8b.npy +03261776-7da7c2b10597af90b21450114b9ae3a.npy +03001627-8945c698ec3e9d1ad9deb3f829cc2475.npy +04530566-e219390e6eb152024d0a79ea230a0577.npy +02747177-ff2f13bc0b9d4ade19c52ba9902b5ab0.npy +04379243-aa79a19ba1fb3cd1febad4f49b26ec52.npy +03636649-91d0d5301653c3b33da8556a622a2ae1.npy +04530566-a728c32eccd560e69412a62cd6b1bf5.npy +04330267-d58cf869f92da04198253a3e4a6c1a73.npy +02691156-c3408a7be501f09070d98a97e17b4da3.npy +03211117-736c5f322277bd99ff21f7d46312e751.npy +03948459-fbf675bb44706dff867ea9c96b799755.npy +02691156-3d6b9ea0f212e93f26360e1e29a956c7.npy +03001627-a3ba66bb0fbded22c5beea20858a99d5.npy +02691156-85396c57cdbf919f83467b3671ddaea2.npy +04379243-f9a795649f679b578f3be993fec1ba7b.npy +03001627-c56bca4b7f353ad86debb0a33c851f8.npy +04099429-99314b704285c0ca16e3314677399d49.npy +03325088-39333e9f93d3d3696d0157e3e7a8917c.npy +04401088-caf0f73f4a609b7a2c4e8a2f66e4b8a3.npy +02808440-32704fd3803c02d7fe52ffd0e748a1ab.npy +03691459-91f570ca6702fe4abd1cba733b111584.npy +04379243-2356544fa047516126f51cb1aef0ea9c.npy +04379243-dc4ba419b9035c4b917b96045c9b6dea.npy +03790512-5df0478fd19f0c175af8505fd49bb4ca.npy +02876657-47ebee26ca51177ac3fdab075b98c5d8.npy +03467517-49be6209142d8d1bd12eaca0749d01ab.npy +04256520-dd50bf448cd6d69016e9e510d2c2a9d.npy +03636649-8a840a390cc8ba885089a13cc567dbd.npy +03001627-51704a889ebcadb72cee4bf5d0f11ffe.npy +04530566-8c62487a3593dc337810d5f988f90f49.npy +04401088-20e5a92f95731f04c4440dd41b08b3f4.npy +03001627-6b881cd27826bd6b97a79b27e081b077.npy +02828884-4d6b053f11e784e2a136ebdce43e4200.npy +04379243-539548613fa54b6725aae1be30d7ea21.npy +03642806-2777dfcee7d0f364b0d7b0d4230df8ca.npy +04256520-d44fb796a1772d5a490ad276cd2af3a4.npy +04379243-7c29c16650cc74bcd17bccae1d897a22.npy +03001627-525776b59266140381dff5c2e57ad46e.npy +03001627-43681f9356e330b36ac40071701c687.npy +02691156-4a27a6276e748777bc0909d98a1ff2b4.npy +04256520-2bf095743bd8f21f6f37a8be59c15bbb.npy +03001627-2a87cf850dca72a4a886e56ff3d54c4.npy +03337140-9053de990d7c71e1e4cf665cc17bc4aa.npy +03046257-ba090cfc159e1495a9575f4ef037dfdb.npy +02691156-839a950d0264cbb89a162c818d22a620.npy +04401088-7552cd75673834c9c8470fd239ba13d4.npy +02958343-9cdd8cd41303cbdc650bba674124a73b.npy +03001627-39f5eecbfb2470846666a748bda83f67.npy +03001627-983414e34ee6a7966aea2f18ee404fd5.npy +04379243-d9467c88e3e26d3c4b3c42e318f3affc.npy +04379243-ba08fa516347f4e6f51f77a6d7299806.npy +04256520-5192e47e1e8267068907728f92c46d69.npy +04379243-377d6044219ec8b3063f9bdb41a65e3.npy +04379243-1f116a581f9e15e01b17743c18fb63dc.npy +03593526-5e6c6769815668b817ba4f4092c6f41.npy +03001627-f891816329ecee93774476b2e205b9b7.npy +02691156-c05bb681e0ee27e2eea65ef742e4d989.npy +03001627-fbc560d04067a6b58ce66f12ba927a2b.npy +02958343-99311deac352b9a5873751b4c304dae7.npy +04090263-f0236f202fe3588a8d4ca42bc1bef451.npy +04379243-a1f130e921df44b037135011237cc916.npy +04379243-511cf6bce918c6738e0afce805a277dc.npy +02958343-e93f88a9beb9ddbeaff90a85d875467.npy +02871439-cbdc7ed6ba5aeb2a3a272da15f3c1cb1.npy +03001627-ed6c9f6d77831e5cdf2b21995cbbbc4f.npy +03001627-50faa1777b012058492d9da2668ec34c.npy +04330267-10f1eb0113a6340e35914415372cbccb.npy +04379243-c9ad84452fe0ece05ab833c88a8efb15.npy +03691459-43990d5a8ffd32774f074cdf0a32eafe.npy +03636649-882aae761370df14786810c22b062a88.npy +02933112-1cf9f1ead192b6c9824662341ce2b233.npy +02942699-39419e462f08dcbdc98cccf0d0f53d7.npy +04379243-65e7fd8d158658106a76e23e6f966dea.npy +03046257-afeb49c6ae3977cfcb87baa8bbd720aa.npy +03636649-b7716e735dc72358182649d086615bf.npy +04090263-43d4e6583cef197aafeed2d6e5e28a9f.npy +03691459-1d4ea80f49114ec0813621823d82b548.npy +02958343-b0810f509a3c4cf895cad68eb5eb0e38.npy +02933112-47fa0f6c9b9f019742cc639a26c5af8c.npy +04330267-fa759d830cce8dea7e4bbc5bb7fd2afa.npy +02924116-f7cae23060d52bde99ebcb8df4d39cff.npy +02691156-23eed87ac79f1b152f9c405cf0817830.npy +04468005-52bc6eae0a13f93751bd803a9a30b004.npy +04256520-2ee577ae974272dc9faa444e7f5fd692.npy +02958343-8dcccd3d9221f9a0d61b6a34f3fd808c.npy +02691156-a4f5529edc990706e719b5362fe06bbb.npy +02747177-f35efdf00062e177962bfd5bcfc9bf86.npy +03001627-6a7050042fbc77d5635418e95eea8a17.npy +03467517-16afb97fe3882483cf45555a18e7351a.npy +02691156-6271b0016c5fb3bd59d2e83012533b47.npy +02747177-b77e94ab409def2b72745b90f9692729.npy +03211117-10953ef61c72aacccd14781dae25affc.npy +04554684-226f73828ad8562f4c86b1fdc94892eb.npy +04379243-68c52fa67028fceb47637d2621d965b1.npy +04256520-79edc7c4e10a6fd8b3aef1eb2166205f.npy +02828884-5be09ade953eaf6ca6910e4922d61aa.npy +04379243-5d3d9689b1447e01febad4f49b26ec52.npy +03001627-4ca29321dadaae90a516b539b31607a2.npy +02958343-ad1db5ce98d385fdd1e15301c83686f.npy +02924116-867d16b7468cf4cf75ba84a155b61876.npy +04379243-d78d509ada047f34e1a714ee619465a.npy +04379243-3c886639d67798f671a70be9f12ce8b0.npy +03790512-81e1a6c5a4de9f8f7a1f4451e23d8e4d.npy +04468005-eb35e5c9c3d0b97058a624688564e0f5.npy +02828884-ed8401565e207665f155d75bbf62b80.npy +04090263-1c4ffc878b001a097e270f84701afcd4.npy +02808440-6bf87e25ad2b7e1cdd43f423f86ddbb9.npy +03636649-cf3407cf42643d3184cd259bd328e92a.npy +04090263-9e6ba8035db3ead6cc34b900bb2492e.npy +03046257-81be602470e4fa90b2f671e673cf292b.npy +02933112-530d7817abf9b54e73f47577531a0b51.npy +02828884-35ac96f483e073faf515c76790f82ed4.npy +04074963-a27dc622395c3648db8fa1712f9ee93.npy +04379243-8bfb5dbd48e6bcd5aec454eed44c3c27.npy +02828884-6ccec23049ae42ce2056b4bd5d870b47.npy +03211117-1707d858ffaf146e640578ae55230ebc.npy +04379243-611e834a83c63f50a8840b31c6de34ce.npy +04225987-e60f8e703bf6b7e8b267718342f3f316.npy +02958343-8b7b6c2a5c664ca6efe5f291bc2f5fd0.npy +04256520-1507432d805eba8dd773dcca82f4a71e.npy +02958343-14ace3e8d05f8d21a413908c0e169330.npy +03642806-c87bd5d0b4caa95de14be8c4a6dae8.npy +04530566-7dc72dc46c46410168ac0d25269a2c67.npy +03593526-3976bd1f61e4b5c95d878ba9ec3c0d6a.npy +02691156-ed7eb0caa75661addc82b8fee1057b30.npy +02924116-923dc3ec59c733a5fa07f5a050a0502a.npy +03593526-cd03a7bd6ace5432e7a3b2beb7306f11.npy +03691459-d2426b884d1108e8bdc8d5970acdf989.npy +04379243-5929d3983eeb8d5cbf96d22e92924ea2.npy +03001627-5cdf1e5cc2fdacedb01116e8ff585621.npy +03001627-4246c8c293c56ea34b3c42e318f3affc.npy +03001627-987122b945dcf1fef713f414dfd3c16.npy +02691156-31d40e6e24511386d6d949577c389a84.npy +03046257-41d0afa958bd0621dffd9a568a626d77.npy +03636649-dacef14e18d54f3857d60a3bdfb4976c.npy +03467517-afb2a038358c5f391fb05d58f51ec4fa.npy +02691156-535dad1777edb67bbc0909d98a1ff2b4.npy +04468005-649d1dd617a2e5284f62d2a35ec091f.npy +04256520-a2a136afb803eb35cc571cd3cf8f17a1.npy +02691156-d532a5abb756ebebcc14f1e6f4f4f49b.npy +04379243-224766e5a022785af51fa0238791f5dc.npy +02691156-ddf0e3053cb1ca8f5e9e2656aff7dd5b.npy +04379243-eb773e1b74c883a070d809fda3b93e7b.npy +03001627-c967b1e07ef7fc0bebc740fe800c0367.npy +03001627-e45fb6b81247cef0ad312873b158ac49.npy +04530566-6d2c856797bc246898f9d8529de7066.npy +04379243-87dda49474723fa816a2b5862518c93.npy +04379243-203d58d26d1546994b7b33169889d14c.npy +03001627-ca01fd0de2534323c594a0e804f37c1a.npy +03001627-9e8ba34b501945d1f4b6538438a0b930.npy +03001627-6e9b9e6dbef7d1d219fb4103277a6b93.npy +02691156-dd9ece07d4bc696c2bafe808edd44356.npy +03337140-4eddd7e49d6c6d044c3aee8e9d3a6ffa.npy +04379243-30a525c7bd5ee80192b396ed960b67ad.npy +02958343-1c7ddd2735778013ce50f18f6100cef6.npy +02691156-c8db76f18f56c1344c2c88971423d0be.npy +04256520-43720278eea721d27d18877f45b7c3cc.npy +04379243-e5a84d7ed9a5ce097f4557c0cd5f53a.npy +04090263-44ab011decde6fe4c41bc86ace512f24.npy +02691156-a839884fba87173ce25031ee39d82b94.npy +04530566-5a7635031cd518daefa33903c8f77ab8.npy +03636649-a2316a225facd3114f3443b22038d340.npy +03513137-ae8a2ae90ac11bd93d4e343a1ac21b93.npy +02828884-59a3fc2f98cc53cfa13c59d3c05ad9e1.npy +03001627-d4e974b1d57693ab65ae658fdfdd758d.npy +04090263-fddbba55cea838b9b2d09bc8d348e46b.npy +02933112-7ef23a05ff56687087cffb2975eab062.npy +03467517-fba2fc6f7ab8a62a93f0194265a9746c.npy +03046257-79f572f4428ad13cf54e1b6f41fdd78a.npy +03593526-3fc4784d1b2247306ded232b3f448b08.npy +04530566-da738558b1230b8288d5590328ce0ddf.npy +02992529-26175bc1827c3569c4b311ecb3af9fe6.npy +02691156-404714cf775f5ceed32761b337f8b72a.npy +04379243-29c4539ae1760a50c955e5ed03ef3a2f.npy +03001627-fbfdc8eed6598437b2bb75885cfc44.npy +03325088-9d98b2c3591441a83321831d2245cf06.npy +03761084-e38e26de9812e1adf5f79806bd65844f.npy +02954340-9673c2be589c2b9df0d11ae402ef940e.npy +03046257-a366005a5856c873202ce3547fa5ce9d.npy +04256520-999c10445b9126fabda72093f9b5aa73.npy +02691156-26237deeb192f83d3ada73811bb576de.npy +02808440-cf565a3576331f67433b4c9b207205a9.npy +02691156-395cb914880adc105b50b4451364cc2c.npy +02958343-bcf0b18a19bce6d91ad107790a9e2d51.npy +02691156-2cd9e40d1ccb1917228c3c30d65cabe0.npy +02828884-3a85b1fd831c15bbd2b12aa6a0f050b3.npy +04401088-f1b9de7276c1b07fe5562f06ed322f7e.npy +04379243-1599c3f78f521c0c3bd24f986301745.npy +04379243-4c529b6171aabea2e8058cf23f6382c1.npy +03636649-89cb9b2ad175b833cadf6344ec272e8.npy +04401088-c688e0c0830ddebed23d7150656e0d04.npy +02958343-ded68cb3b5318425bb164ad50a9faee3.npy +03001627-875925d42780159ffebad4f49b26ec52.npy +04090263-486e685875e840dde4b30fdd654658ce.npy +04379243-7c08d40119ea39923fe3501bb9e7193.npy +03001627-654ff4d929914b7ff91663a74ccd2338.npy +04468005-45f9f9a2991b3c0b76d9bf960443503e.npy +02828884-244955211c2f3b94b821b834431f4e0e.npy +04379243-9f097427c4d2bb4af2c0658ad22a9a9b.npy +03991062-30b3abdc25299028cc01fffc6fcc7b74.npy +03001627-e2dbad7996e7e13430c589758b4b5646.npy +03211117-5cbdebf9422d9858dcabaa2ad147fa73.npy +02924116-d7ce4cd86d8d7f1637da79b407550d26.npy +03337140-f8c3c4da6560cde54c3aee8e9d3a6ffa.npy +03790512-49edb54e97458de8d373c34785838ee4.npy +02933112-910eec62d3cf0936ce5d6e9371bb5c33.npy +03691459-fb60dd3c36439d836d74ed7e4da4b6ec.npy +03691459-8d55d634810b52f176f6deb1c78dfee8.npy +04256520-dfb54a98465dffeffcd08faf4fccd0f.npy +03001627-6744d53d1557cd2443dbb6421d614c0d.npy +02876657-d2e7e725aa6b39f0d333084c1357713e.npy +04256520-9e57afbc186ff5387c0c12d35fb75ce3.npy +03001627-a551977f078f362c492d9da2668ec34c.npy +04379243-3d4a592876d60a3c0f9df0cafd74e5c.npy +03948459-c2b8580d4087bd708480d5f7e7366fe1.npy +02958343-192fdf42f5a2623d673ddeabdcc8c6e.npy +04379243-a95df9c4372e860c73eb02f1d995d891.npy +03691459-86775c918b6f4fd2f149a4641e0b7067.npy +04530566-90d83e1dde32426407e66c6e74f5ce3.npy +02958343-a88baf98bc73649fdd61bedeefabbeb6.npy +03948459-664579680dc09267e1f2a1daf140ac9f.npy +04530566-e453412c14d47ef176dfbd72ad52dca6.npy +02747177-83488978efe02f562a1ff22c35676be7.npy +04379243-d7576f0e6f9acba7d261e17fa0c462a7.npy +03325088-c2a9e63c47166a75341d61f56edc2872.npy +04379243-11bf776fe946cb7af897d07ebee05db5.npy +04379243-233c3eace6ea1267eaf288f952624966.npy +03001627-5c92b3aad6c462514b3c42e318f3affc.npy +02691156-76851aaf721dcb63509012911cf74f29.npy +02876657-bb46957091f2a282cfdfe3f21f42a111.npy +03001627-6c1352ffa574e154ca2ed12df13a916a.npy +04256520-d100d576372b75bcc6b705e3bb4769f5.npy +03467517-bf041bc9abb1114597b6cc42b1ecbb47.npy +03691459-986bd3ba96016425cc0d3a65104f5927.npy +04379243-70e3188676407076c3bd24f986301745.npy +02691156-3ac64a2c67cb44f19777d69c8d47140.npy +02808440-22eb6e2af43e6e78ba47eca8aa80094.npy +02876657-547ace45594ef71fc867fe00083d17f7.npy +04379243-1f95c9d8e65c117343dbb6421d614c0d.npy +04379243-4a519fb8089dc7d248eaa510713cb074.npy +04379243-d9c75799ff9ff74664b3b9b23ddfcbc.npy +03211117-6f7689fbca875b034302674f512c0e5e.npy +03991062-9c0a4184fb751fe58f4d17a342e13fb1.npy +02808440-fcf3ac6ac5ca3738e6b3aedd6ba272b.npy +02691156-fa9d933674352c3711a50c43722a30cb.npy +04379243-7a0eab4d41f461e980fc8e4355cf787d.npy +03211117-4b85feeead6313806329e8c7b28434da.npy +02818832-7a4e07fb5701172c862eec8232fff1e.npy +04256520-9ef9ea0de3fe64d4e7e684d25d4dcaf0.npy +02747177-69ee57f4534eb475e9bfc203f193ce76.npy +02958343-b28d1b3e81f407571c02ebb3dd0baeb1.npy +04379243-d108dd323ed295991b17743c18fb63dc.npy +04090263-4bd456ea9809a296c60369962d1bf5.npy +02924116-7a275413fda13866f81aa5c6f39752d6.npy +04530566-f02b990da656df8dba71d80f7b736179.npy +03691459-4d1061e19f05e919a5e698f08af11df1.npy +04379243-71a7bcf52da934d0f008d8a3590fb522.npy +03991062-38c66f3168743604a2c59a4d90e63212.npy +04530566-294644520ccc2ce27795dd28016933fc.npy +04074963-c21ec53c8531344b8ef01232dadbdf7f.npy +04256520-f6190e61f116d159ca119b1ec88d8df8.npy +03001627-d1291956cb0983ee7085b4353236aad.npy +04554684-2d65189ff15fe1538a8c921f75bfa58c.npy +04379243-20765ccd89f9d915d200faae04ce3f8.npy +03636649-2d638c6b6b2feb9248da169d95204ce2.npy +03624134-6ebe2a22b8d9d70862a95b942081dfee.npy +03593526-b2e502425dc3f07bfe4f69210ea5cdca.npy +04379243-8a86e3045ac5fe7e1f335cc23d448de8.npy +02958343-3ffd5155eaeab76bb17445a1c29f6d34.npy +03325088-c02a4ba752dcaefce3f7a74e12a274ef.npy +02828884-9997397f29b90af470e359f3b1d0f6d1.npy +04090263-de0f9c9b67c5f5a6422f205de59ac7e6.npy +04401088-3a8b1287aed892ba5661e3450b04a6b4.npy +04401088-ecbb1c53e881c2b25f4e4793ed432bc1.npy +04090263-ca2bafb1ba4b97a1683e3750b53385d5.npy +04554684-c667f9cf4f72ef6fbdabe30acfd2c07.npy +03325088-daa26435e1603392b7a867e9b35a1295.npy +02691156-36d8c865f766e3e097872638b21438e3.npy +03325088-5a0e759e281cfac71250bcd0500910e5.npy +02958343-39ec376b0df877986483e7894702b192.npy +04090263-f3004f6eb2e5fb8eb7a51049b27f4bf4.npy +02942699-ec28a64bdf9501161bfbba8a5defb02.npy +02691156-d696c3119cae40323ada73811bb576de.npy +04256520-b15fb2ddfff73f502cf0d9a4f66100ac.npy +02691156-5d8583703889178a8bc354dd4eb23614.npy +03325088-912dc428abd8cca1c36fb70296e45483.npy +03085013-ef3d038046cab5cabeb3159acb187cec.npy +03325088-33f6b54f6b72e64c76c18e71fd49c4dc.npy +02958343-62032b070c02c6b1570673441ebdaf2b.npy +04379243-80ef50d3e67bfa8783ca982ecb7c4900.npy +04090263-d35bd51cdc04c103882d915ba9d043ba.npy +04225987-4e19d12d0924a2f58266b26a9b45059a.npy +04090263-f55544d331eb019a1aca20a2bd5ca645.npy +02992529-c87bd717c3640f0f741e88434245c899.npy +04090263-35b5cba53b629223cc2e8ce9ba1c97dc.npy +04530566-ff70051c32217b2df671917093bd361.npy +03001627-8f09ae17dedc43c6dd7640b87074419f.npy +03467517-a78c3356a5dca4e7670b811945485012.npy +04090263-fb6e8e453293303a4721599ec64bb469.npy +03001627-920af478601258e24762da3a3017ade.npy +02818832-6193a59df632dc4fd9b53420a5458c53.npy +03001627-9cd5f64caf7077ec3266c035d8afd13b.npy +02871439-2a3ce38991b93107275d003e423c59ba.npy +04256520-65dd8c9418c29ddba066c1f884f0378.npy +02933112-68257aab07479c64854a6619c08bff6d.npy +04256520-2c3a679d6640a93abd16d4490a10a752.npy +04379243-2ef5b582482d7d52cb71061323057eb9.npy +02880940-bbf4b10b538c7d03bcbbc78f3e874841.npy +03001627-faa6255bb4de99d90606ee5fb3c339a.npy +02828884-5856737e6fc90bbac1a25f36f85c3fd6.npy +03211117-ff8418d110a5fd5211ab369e12343c13.npy +03938244-31db3f4dd9d5944c3628a80a75ee02dc.npy +03046257-5972bc07e59371777bcb070cc655f13a.npy +02958343-d7b8287ca11d565bd9bd5ae694086d5.npy +02828884-4526eecda7ff1136ad5067eac75a07f7.npy +04256520-526c4f841f777635b5b328c62af5142.npy +03593526-dc9eca5831f9d6ad230584014222e685.npy +02808440-2f5a70ee78ed7cfaca581939cd410ca.npy +04379243-1c3317b33bfccab0824080f516909671.npy +04401088-2278cc8b5a50421613fcb9cbc590fba.npy +03046257-5d7549beabcc86af6329e8c7b28434da.npy +03001627-465c2cc6917e02fec681404257d94ad9.npy +02808440-7f5a3684f57a6fe754d7082b34825ef0.npy +02808440-8be7711dfc0c7e3a54d7082b34825ef0.npy +02958343-9167cb083368cc6be3d59d595daeefd7.npy +04256520-9f57f0155caf1c15404a78e172d68d45.npy +04379243-cf10ac71297ae632f44880b8ee951142.npy +02691156-ccca0685aa63308ed54e5c2e672a56dc.npy +03636649-925fe53d5075145981a172d69c52a28a.npy +03624134-b8648ae17fb9937949f73a97204d432b.npy +04090263-5105e493bcf5e63f75a82b88fe6e733f.npy +02691156-9f21e660ba62b9c8ac055f4f708c624f.npy +02828884-f1f14399ac9684df835bac7bf872f771.npy +04256520-a1262399c6c0ac93e84291b9d249a95b.npy +02828884-6b9b014c54423664a9bf865a81345d8e.npy +04530566-1b5e114692abf9a5fdbbffe94281448.npy +04379243-b2564957632c596c2ebeb1e6a8111f53.npy +04256520-42b13b1ac18724f84b3c42e318f3affc.npy +03513137-69d70c404f47b1f9b137667443c4be42.npy +03691459-9b9b41d3d02ce68d1b009b4923bf4541.npy +02818832-babeae78f6d2412a15dd7d7985e749c1.npy +04401088-cfdd44745ba101bc714ce1441b585593.npy +03991062-d56098d4d83f5976a2c59a4d90e63212.npy +02992529-aaf1159cdc4e6ce5b2ff1d6fc3caddc1.npy +03211117-225d37286bed9bb9dbf53b03c847b004.npy +02992529-5cc54b5db73e9e1e6decf1414eac2924.npy +02958343-5d385a0a87d0df4a51a95aaa6caba1d3.npy +04379243-f82a5f3c2a57655d825da2b9ec9c8c29.npy +02958343-881cf849fb2d003514d92936db4784c4.npy +03001627-357e2dd1512b96168e2b488ea5fa466a.npy +02876657-f0611ec9ff89209bf10c4513652c1c5e.npy +02958343-8e3336175a338970a9fe1734a6086750.npy +03691459-9c98e3576baa1f25b3150cb8eff8d9d7.npy +04090263-68a7652d28ddf2035488420adf4edfd0.npy +04401088-78855e0d8d27f00b42e82e1724e35ca.npy +04090263-34d2582f7fc79e07a5fc2a01ff709b89.npy +02958343-b554614b14148e4ec0ed6ec757ca50f5.npy +02992529-641234f284243decea95e61f66327e28.npy +02691156-a1e5e9561b501f2a19e06ee1b2e7b1b4.npy +03636649-9aff9fdad0e3555c7eecb4e0df212ad9.npy +04256520-c131c9feb56c6b7a6bb6bc0db07c71e8.npy +03928116-8ffd503645f31d6115ed47584b7a4537.npy +04004475-9c6e72feeefaf01390eb32e4b2b2efc9.npy +04379243-5667350dffa82263968da786c4da00c.npy +02876657-d511899945a400b183b4ef314c5735aa.npy +02958343-db432e9f280ffb1e3dd4bdc1dbab98bd.npy +02828884-11499e2fe78c7a6d73bc78c81dfbb18.npy +03001627-30518e2d6fb5dff259d9b12c05c8f809.npy +03991062-c4ac6a5f651d12c6c6b4aaa0b0f9d794.npy +04379243-cad4cd1fc0c0952e71a782a4379556c7.npy +02691156-cbc9d6ae9d22fcc57f3efc94c2d31dc5.npy +04090263-73bf687a44580f037f3efc94c2d31dc5.npy +02924116-3e0c9a10f8e200be17b44457cd291bcc.npy +02958343-ca7202152b84a70fc6a4281cffc3c014.npy +03001627-e0c76c1c82f12df4c1e1aceb66eee9be.npy +02942699-63c10cfd6f0ce09a241d076ab53023c1.npy +03636649-cdbb91da1b21cd9c879995e59bad3d69.npy +02691156-27c409ead0c4e34c9a6e43b878d5b335.npy +03636649-d7fb922f162360b5c66a63406f818460.npy +02924116-59f6907b10ed62e475dadc997718614d.npy +04554684-592e665fa7e0a2bcc9614070d3269898.npy +02958343-3506955660641ce61d693e0a12bd4ff3.npy +04256520-4997b2b6120f84e948eb521885c87e13.npy +04090263-e5cd986f028b4e27b91a90edeb58ed0b.npy +04379243-c9e9466f782d1b4f7fdd70657322b4ac.npy +04379243-1c111a837580fda6c3bd24f986301745.npy +02924116-72271b23f406c7cef8dc13cb78906875.npy +04379243-62b17d7d8fa7ad00f51fa0238791f5dc.npy +02828884-abf095439d2d7bdb57a8fa4c1cbcf3ea.npy +04379243-9c49b5339e9f3cfa5c6b6ad017b2e512.npy +04090263-c1267e4fcd29c63b60053189e2e21dd.npy +03001627-3ea6a179fdc3c01daac8336231c53cd1.npy +04256520-651270d31b03d1c12f1d01f48e42a6d3.npy +04225987-52ffc103719ae88ef0f40fbf85e100a.npy +02933112-386bf465df74b1321d860ee2ad2a42e1.npy +04256520-d6b6f8854bda98a6ff458e602ebccbb0.npy +04530566-b4ea73d8daa2789699c1d6f5c0b53b84.npy +04379243-b2b57e89a036970d22e5ecbe03e765d.npy +02924116-b7656d749dac1071f75f41eca7a019a.npy +04256520-67626389926740a08de89023dfc7cadd.npy +03790512-f736168c42267866eba25bbcd3786140.npy +02958343-545abd37dd50dad953536e7c905b301.npy +03797390-ea33ad442b032208d778b73d04298f62.npy +03624134-95db800016f8fb955d33831e71fa52.npy +04379243-5d8ea325e7182fd84b757d0f16894ea9.npy +04379243-53cdb2389fe5a5e5bc78bb6f3ca89e4c.npy +03001627-4d6c67174bdab63ff11cd7e1bac77b0e.npy +04460130-64ae93807abcaaa38cd8eb23853c009.npy +03636649-2140c6a8b4648d84f3443b22038d340.npy +02924116-7122ccbf7cf39de6cb239ba7670e0fec.npy +03325088-c33c3c63eff994aeb7a867e9b35a1295.npy +02958343-30f4b931145acc98a3049d0dcf503cdf.npy +04256520-9be24460d1f7d084b3c42e318f3affc.npy +04379243-f74a63793db25c8911fc2b865c2a185b.npy +04090263-a9e1e9c25f250b289546043a05bd4e6f.npy +02828884-9c69b56c5867afdf5d65e445b951c79a.npy +04379243-3931ce39e77a25a9dfefa992cb59ea0.npy +03467517-dccaa9555afddd96a5c8e9fc8b2242fd.npy +03948459-e9ae98d8679409f8f52692247799a350.npy +04090263-5f69d649d9036be626b78ab29e6b0231.npy +04468005-423da92d362700483fbd1495c921f279.npy +02828884-c89d4c95f1e7c950a805114916841d69.npy +04379243-79d0985603f7ff3be6c5cd45aa112726.npy +03636649-5cfe9300f102ad65fcb8d8c6d4df8143.npy +03211117-a18316fe31d3e24ed113457aa21fa2cf.npy +04530566-2de6a45649b392d2f7051f81d65f99eb.npy +04379243-6631de96600690d158c88d30f502a452.npy +03001627-61bcde763ccbfe520ab6214a789faf.npy +04379243-ef4e5099cb7c543830bbd4cddd04c77b.npy +04379243-d073f58c96c17aca95786b1c8687acc.npy +03325088-24d438e0a5966a8316f1e46eb2815c0b.npy +04256520-feedba483f628b8f584e3f372dd1a2d.npy +04379243-587143666166faf155fe0f12b5bf32dd.npy +02924116-2fc461ae4d2b416c3ec3fbbb89296dcb.npy +04379243-612caa5ea6c888c850cf3715818ccfe8.npy +04090263-180846dd3deda6785127e0873cfaa7b8.npy +02871439-7bbd940fe725689fd320119b2e676c6a.npy +03948459-42740af029297f1d9874fa4c7b1a4298.npy +03001627-9f3ff62527bf46f237b2bb75885cfc44.npy +02828884-6798771442c7d473f336cb889fb7c819.npy +02691156-7030044b49828f08b96ae1a0a8b84ec.npy +04256520-2d5cd8bb42310f3eb04cb542e2c50eb4.npy +04530566-fe8f54e34ccfa35f3ceaa5264772e8b6.npy +04090263-5c1d73e16d1a4459b5070c7ac310bcbc.npy +02691156-3069d990d52051eb3a34c2907e8f3f1f.npy +02958343-3ec7f0347638f7a891eea2fc80d4a25f.npy +02691156-b1696ffd98c753ccea88a0a7eb1222bb.npy +04379243-4126746447b424197fcb8ee54b1a951.npy +02871439-37e570eb9cc1bc7b50fe7d207ee3a1a6.npy +02691156-53d0eca7c8ab5e644c3a35cee92bb95b.npy +03790512-fad668ac64ccea1ab37378f3c85478b4.npy +04379243-eb00a4e8b33d257cad16260d4d73b56.npy +02808440-59630f5750ba5aa46935f7e0522b9fa.npy +04379243-c77ed43659f01a0cf51f77a6d7299806.npy +02828884-c6885d073919e897de9de6d8a1c444be.npy +03624134-c30f7e40f4cc1d52344cf8873eaeb8c6.npy +04256520-c0228ff42e79e272db039d8689a74349.npy +04379243-be971a899c96649262158b7ee658e910.npy +04090263-11126129151f3e36afb1ffba52bacfa2.npy +02958343-5fc2334bf83f4c0e3505c0c7d5679ae2.npy +03691459-dbe86be505750b8d9c92e8251d55352d.npy +03001627-9b94592fe0fdcc34492d9da2668ec34c.npy +03636649-798028b70ab2a1d529c726e7d66b139d.npy +04099429-c0d736964ddc268c9fb3e3631a88cdab.npy +02992529-bcf3ca7e860d04eaf0fbb92458462640.npy +02828884-2e78dad09566bdcecb2a965e75be701c.npy +03001627-79053fcbcb68e2c31528cf73b8bd8799.npy +02958343-9e5faa247753ad479289f0a3d35e8de4.npy +02924116-cac296959eaeca1f550f48125b5f584e.npy +04379243-db75ed97a5c5234e8f7d9678498f2295.npy +03691459-3db03a00661e6113f2a29b1958708a7f.npy +03046257-e78b66ad9fac907822b68de582c1281b.npy +03991062-247237dea2ef00f444c183864792bc2b.npy +02933112-716b2e87f41b14cf48d22c298c611495.npy +04256520-4b11124f5ccf051086708ca48528bc8c.npy +04530566-8877086211c9976cd27beaa6c9701d39.npy +04256520-bc0ef0dc1d69ed4c852bb95bccedfda9.npy +04379243-bca062605b3f79b9a75c3b311265cd31.npy +03001627-24a83977b422b081eedb66d04882750d.npy +03001627-df6157db2534b72a9a293c6471e6f319.npy +04379243-8ad01793daeda43dbd71cb387c4297a8.npy +02691156-6ca6c7920c62773073d96deff5ddb8e5.npy +04256520-bb4441db7c68a4cec7c8ce3bef5c2aa9.npy +03636649-6d14f1e95641dbb329a42a0444436860.npy +04379243-a860e5edcaec268e615bcf72f8385966.npy +03593526-9b77a0f168b2b8ea620c0ff8940a6989.npy +03211117-73669f92851d3b28eb34db531a289b8e.npy +04401088-8a56e999d75c4d6e8d1dabf86742ec3c.npy +03636649-e7ffebf4dd9176542cd2160e449d45ae.npy +03325088-aa53b268354b84a1b7a867e9b35a1295.npy +04090263-5909ebf625e0d04dfd6d10d22bbd142.npy +02924116-95e2cd84253aafbc1d272dd11937e8b0.npy +04379243-569e2fce2f1ab3be617e9d9aa36a8137.npy +03046257-413c5497de808d1a177ef3150c947f22.npy +03001627-95fe1f3dec357704e27790b0ec8671f7.npy +03636649-8b712f3a63bb01061735ea0e092a805a.npy +03001627-65b8c99a5ab7eb0492ea5a71c9e33093.npy +02691156-a660b01d17f929f54e61a0c2eaaabe87.npy +04256520-19f0a14207f4f953bb1b55ae5bd11e93.npy +02871439-f364a6a23f19c5334a60c1a189046dd1.npy +04090263-3c8bf6360e36d51874b27677f8e8f04.npy +03001627-804c35699b163b7756bc5724b6282816.npy +03991062-e7d1773d6278ba1ba2c59a4d90e63212.npy +02958343-fdcc09ad608e95b4b631b59d5abd1cf8.npy +03513137-cd7ecd4007cf6738807322bc19906e74.npy +03001627-e98fc1a9b608a0c1a8760470bc8702f6.npy +02773838-c5c0f63f94ddf4c258d149fbd24761c4.npy +02691156-a5215569ae825265ff3feb917a6004b.npy +02843684-ac090163657e31d08d6b0dc9bb200f8d.npy +03001627-bd0fab2e72b445bd1e722bceee6e83aa.npy +03001627-fd8c375d0a267d20283b00891f680579.npy +02691156-5de885a47cf8aae2951971f8370d9050.npy +04256520-426d75ae016abffbdfa8261e130bcc9c.npy +04256520-c6c8b57de92a243abb3f330b15ee1442.npy +02958343-86f1cbcda59640594dde7b6e74a2cede.npy +04256520-aa5fe2c92f01ce0a30cbbda41991e4d0.npy +03636649-674a0ba32db48cb6ba2cb2a05654d738.npy +04379243-5151ae4f84a800a189035c25f0dfeb63.npy +03948459-b1bbe535a833635d91f9af3df5b0c8fc.npy +03636649-c359b4c545e5ee3efcb8d8c6d4df8143.npy +02958343-2fceea2bce91439ca26fdd1a1e470de9.npy +03928116-b04647659c599ade7fb4fbe822d98e36.npy +03636649-1d2c6757217bb2797388d403c2d39798.npy +04256520-6660af5568f1fcea324a6d32f13e7cb6.npy +04090263-9e40b56e67c305db74e18e0e7a19212a.npy +03636649-9e3905c3fe967a4dc13933f92cd75682.npy +02691156-45c963d64b8ef3de37678474be485ca.npy +02691156-cb1aff81a3c6ef71d25fd5e3115979a5.npy +03001627-c95e8fc2cf96b9349829306a513f9466.npy +04379243-e5413a9305d52482ee1a5886e50e3f9a.npy +03211117-8f577d90510e94e09506335f6ccd62b6.npy +02691156-a1db8dcb7f1fcdd597190b73ffeacc5f.npy +02876657-860c81982a1703d35a7ce4c111af2db.npy +04256520-d1c09e81d31e38868cbb8bac2032149c.npy +04379243-3f74e2274140ec70705165b0e6ec548.npy +02958343-119033fe083145e22f31600ac759c763.npy +04379243-726a974620efd98c377b9297f3055210.npy +02924116-b778f89a3aaab26c8cd65eae2089c6d0.npy +03467517-f7f1f2430ff969e9eb2f514f87188941.npy +03691459-3855f5027ab422fae6ee52444763d57c.npy +04379243-82fe7fa7a6655955f51f77a6d7299806.npy +03001627-854f3cc942581aea5af597c14b093f6.npy +03624134-6a9df664a41aa590cc34b900bb2492e.npy +04379243-fb9e9c0767a92d2e923b3c05c4c4fae.npy +03001627-49748c9b987b6bc8dbd60fb6b8607ea6.npy +02691156-6341436b6a9df0c6683651cbc8e49e4f.npy +02871439-e445595fe6c85cf17f768772b7a990fa.npy +04401088-8fcae817c180d5224208dfa1c5fa1065.npy +02828884-70612bccd74c969476c40ae77a98137f.npy +04530566-d57e124826aabbbfc6cb0dfa2f14f9d4.npy +04530566-8c3148ee031b15446e0dbba30ac27e8.npy +03001627-7595d089aefd8ed5af7c7ad2549a1b15.npy +03001627-7788afe9baeb2410e8e9bfe58361d5c.npy +04401088-c589332137d854a1808ba9235495a934.npy +02942699-21f65f53f74f1b58de8982fc28ddacc3.npy +02871439-31a777c94501faee5ab608caed81de7c.npy +02992529-16685299c37055c2be40226527c9872.npy +04090263-a5e62a05ffed4b0231f639996cb3d35d.npy +04090263-816df97057a7df79f47439175208c26.npy +03636649-80650d082f6d45fc53fa79783efbc3bf.npy +02958343-5686e48a700bf4c989439bf55b857b9.npy +04379243-6c0ee01fb43f8f46c045ebb62fca20c6.npy +03467517-cebf1d6e25e40224eb86f11fe2a7a388.npy +04379243-99f50ca8fe9b541792ed85b04a73eb29.npy +04530566-8500272b43352ae6f844b7e844d01ddc.npy +02828884-c3d8c664906eb8e57b11ae648ea92233.npy +04256520-1f6dce83e8d582e9efc579970fcfc006.npy +04256520-13f5779fa224ee03490ad276cd2af3a4.npy +02828884-a8e987a6a6486b962d6c8e51365a5a87.npy +02933112-1e91ab0d6eb0053ac59350d819542ec7.npy +04379243-a21d0b3b4ae4436e76bc197b3a3ffc0.npy +03636649-9bb957d69a2c2369c0f9df0cafd74e5c.npy +04090263-937f3a803767480efb6bde4b7e6c6613.npy +03001627-81ba974369a343d3946b850f0cd29857.npy +02691156-7d226c520a29c7705e28caa3b26a73fd.npy +04256520-b32b7dd742f915581e6dcc1ddc222f68.npy +04379243-b9dae236a2dc3476ffd5817f210f277d.npy +03001627-8b8fa92f9c677b0713decb1a0563b12.npy +02828884-efd2d13058330e49d7f638b2b2e0564.npy +03001627-25ad35439836dd7c8fc307d246c19849.npy +03211117-f675d7c91d540e6bb45df535caecae62.npy +02828884-9452149917cb2e27f4fb4dee5181bee.npy +03001627-5912ba21e93d2c5b8bd10c3418cc648.npy +04090263-973181651497efa3230a4d129580843a.npy +03261776-763f06de96ae50d5823e88e264b80650.npy +02958343-1284876ac0e2371aa4dbb766064f8bbf.npy +03797390-85a2511c375b5b32f72755048bac3f96.npy +02828884-d9432798bd2aa338ad5067eac75a07f7.npy +04256520-8f6760875b37750b19fb4103277a6b93.npy +02958343-c59c26c90a724e84ce27281f3b76d1f5.npy +02924116-afdbf161d2482dffc39bbd7cd12a26e9.npy +04468005-14e70ba7f308c3ab1112c737944f1b6.npy +04401088-a2953e7ff6dcd4465af22172f09754fd.npy +03325088-b35cb57337d6330f76c18e71fd49c4dc.npy +04379243-ed5f0875b3615861a6c03a53cf0a14c9.npy +03467517-69ce55087f8ed69fad6d53c0f12828dc.npy +03642806-a2346fd2b76d58bb2aacdb6e0b5b6c83.npy +04090263-74b965dee85e951a818accd7207190a0.npy +04379243-954f39bdb27c54cbeedb4c8fd29e2d1.npy +03261776-99a402291dee883145e2a4e5729b970d.npy +02808440-a879b178b96ede50694afea2e3c77a94.npy +02691156-cdeb868930b32468f879f4163a3ec7b.npy +04090263-ca8c360dd014910ccc34b900bb2492e.npy +04379243-5633513a1cd1adcd9e9d84e41b20ddea.npy +02691156-4bb41171f7e6505bc32f927674bfca67.npy +02691156-2e389edb9a3c0496e1c255da0d1c1826.npy +04379243-647678ff9809303260eb699207aa149d.npy +03325088-50bf9cea0963f340ee0aa55e2c8ca202.npy +03636649-8e4d5fa2a1c91f036a9633583f89b17f.npy +02958343-7f2acaeb45b72793ce6183244062e7c.npy +04256520-8b4a2a614f7b2a9510edd100dffd8d85.npy +04530566-94aeb294adb9be58b05dfc874f00d5f3.npy +02880940-ce48ffb418b99996912a38ce5826ebb8.npy +03046257-88565e0eb863eb31426db14e2702705d.npy +03001627-1926843fb9da47ad8852b93498ca8c83.npy +04256520-839807049a0c29a6ea693790a1608aab.npy +04379243-8106aef3eb88f9e4578defb131c3ea1d.npy +02958343-31cfc24310109174b11647ffa4306609.npy +04379243-417f1c15c20966a54f5039bed03ee12.npy +04401088-855a8a4c39e8fe81a060e584e7409aab.npy +03691459-3cbeb01fae7fb6ec7238b5c2712646b7.npy +04256520-b593b430e799ac4af256e6841810978e.npy +04530566-19640fee71ffa82816581cd5751ca97f.npy +02747177-d828e4f441b150b460174b3ceb24976d.npy +04379243-82109c884a0e195714038d588fd1342f.npy +03001627-2b85487133b04a543f86d4a1692234ec.npy +02828884-6c47b6b082cdd9b684370b1677f53d8e.npy +02691156-b71c16266f1674cd884ccdf529614144.npy +02828884-408ef9729c48dd40bb273d6b4d49877f.npy +03001627-1eab4c4c55b8a0f48162e1d15342e13b.npy +04090263-1caf976f39c934f1589c07868201b17e.npy +03642806-67387cc47a39a4b1cd4fb35969ac8028.npy +04379243-c15b0b5f7d835b5012660c1de94a79e.npy +03467517-727fcc85add981325e683993f34d42f2.npy +04379243-bff0d461cd0fe835b67d6c1fd03fd403.npy +04401088-257ef557fee9c083324b3288c1587efe.npy +04256520-b0ed631f887c522519fb4103277a6b93.npy +03261776-bc404e52bfcd2038538cf6df9faa9b65.npy +02992529-6e6d7c2ffadc2fad2fffec7af390883.npy +04401088-79f11cd09522565fecb1ea9fbacd5278.npy +02691156-65b12fc357604a2587b2a887422ab97.npy +03001627-7f539a846e9e88f0d9fad8aba2c312b7.npy +04090263-96c96b2569853438663e90eaf6b4ca52.npy +04530566-25c736b7ca26bcb7bfccc00eb137e6ec.npy +03467517-35e77edd3ae6ad4993f0194265a9746c.npy +03001627-2576091d2540147a473f10e6caaeca56.npy +04090263-2621cca0eaf82143f9014984f90a7387.npy +02958343-4458ed2a746e61a3b11647ffa4306609.npy +03790512-cc213702fcec23677395d58407f193ba.npy +04379243-52cb81e736aa856cbea68008b6e5c5b7.npy +04379243-5a0c76bb4dd53d13a6c03a53cf0a14c9.npy +02691156-5c306ddfcc08ea1b230ac8907b9b7f90.npy +03001627-d91457217673528ef91663a74ccd2338.npy +04379243-912c044ef5e129522c98a1adaac88b94.npy +02691156-a5beb33ba75edd59485e40e44ec62786.npy +02691156-8df8e2580639b093c1006ed55bc1a3fc.npy +04379243-109738784a0a6129a02c88fe01f2b9c1.npy +02691156-fb9deec3a422b06b609e2d916fa0da27.npy +04090263-87f0e810c573b90c803b54e9738b20a6.npy +04379243-9287845470d119bb940b945d5ba9958.npy +02691156-c57409c95dd4bafba5a118bd15e6e34f.npy +04256520-db01af2b84f8a9f615a72fd59f390cc3.npy +02828884-389f2aa083a7d732f4b6538438a0b930.npy +02747177-d7394e554aff20b2f155d75bbf62b80.npy +02747177-e500097e7023db9ac951cf8670bfff6.npy +02958343-22c0b90fbda00bb9a3a61aa922ccc66.npy +02691156-670d455bf1bdaafdf577ff4de1ac394c.npy +02924116-dd63a0f6eb852d089797a4124a9f002f.npy +03207941-f8a673d7d5e0c410d48855885373053b.npy +04090263-8f48e9f97dc644ca8752becd01cbfbb8.npy +04401088-b801c4ebbc1149b34961b0d325e91640.npy +02992529-b7ab1b6f7dc5026dea8f4709e6949c8.npy +03001627-8f77a33dbdea3d19492d9da2668ec34c.npy +02691156-8686ebc30c07b53126360e1e29a956c7.npy +02992529-bc301249d58b89b638d913262f25e96d.npy +02808440-50c67260bb9322e8ebc740fe800c0367.npy +02871439-db6c5f944751d4a0eebb0db1929cfe93.npy +03001627-a2bffa12e0737e66febad4f49b26ec52.npy +03636649-36943f6afca6cbf518134b529d13e79a.npy +03636649-55eea74e6f73173b49904d779af64a6e.npy +04379243-731561e2626163e8a4dc6822aaa2cf2f.npy +03046257-e59e73bc340207bfe214891c68fa8e36.npy +02958343-7c651c4f55c5ca57d76439fb95cdd2ed.npy +03790512-d929925b54d82db139e5b34b546caf02.npy +02992529-177a44b5e36fe9856e10bfa9f3e32b96.npy +02924116-6ec626a0a5d7c9f84d44f5db04bf14b8.npy +04379243-a70e1160739fa533f820611afeab68c6.npy +02828884-437167659b0b5a8fce8fba09dd640742.npy +03211117-4744bc26253dd076174f1b91e00d9f2d.npy +02876657-681e91bbadebeac529471183b63392dc.npy +03928116-3c9b7b7fe4a349c618dc1e4c79721773.npy +04379243-c8b3d39ca53c0cfa4b3c42e318f3affc.npy +04401088-f4eda7905f55d1b382476058422e4a4d.npy +04090263-c0a429d6e4cc9d0366597c7d470782b4.npy +03691459-3c467fca7449a857a2b4d33761839e86.npy +04256520-b44d152534373752febad4f49b26ec52.npy +03001627-631807f69f02f1785532b747eb9b3728.npy +03642806-59c7c6a65cf462be43acec71ba42b6b7.npy +04530566-c78d6f5c908e2ff1b05dfc874f00d5f3.npy +04090263-6fcfd40ef3d8dbc1046a0002e847ad2.npy +04530566-13c289d915523f2348132c07d51cd81a.npy +04379243-d3aeb75da27b505f1c9acd0bdfdc9f62.npy +02924116-d9d1d7161c59786fb58d6ede2c134ee0.npy +03001627-92b81e84090fdab2f027786820c3fec4.npy +04256520-5e3be8a7a61235dc2099f9e22ca45b04.npy +03001627-d7867d215f52107ba5e8cf3aa1686d66.npy +04379243-963ead3bc27459b2f51f77a6d7299806.npy +02880940-dd381b3459767f7b18f18cdcd25d1bbb.npy +03636649-a1db02b6b7264b6d1cf9f632ab9ad62b.npy +04379243-f8f8ff7d9cfdd395765b19233e844344.npy +03624134-cb0eaaa84ca1be4639c78a1e40e247f3.npy +03948459-6de6e56c6f7d43692866658c90231a1a.npy +02691156-de776175878f17d1f4c1adce71073351.npy +04256520-ca8c140ca26c4d6cc9b96a88ab877904.npy +03001627-6b00fdf6062389ad738dd0d3509c7e47.npy +04379243-50505520611014b07298f1711edd69a0.npy +02747177-637a9226a0509545cb2a965e75be701c.npy +02691156-4515ac65d312fdbdb63361ca9ddfc9ae.npy +03001627-f9e8a5547d89615dfcce6278f5ffb13a.npy +02691156-46f9b86c1292366fadc12de54d203570.npy +04379243-3c72ddd0dca19bbedcfcef693e7ec696.npy +04401088-aef45c975ed647778768dbb598f40c93.npy +03325088-6136a19b81e5e70954d7082b34825ef0.npy +03636649-5f0a23ce527d0be52f38c0d2792fb5e.npy +04379243-a26897b681a3841aa81634d14a6ca786.npy +04379243-d3a5f7b56e3e6e1482e6c3a4e742651d.npy +02808440-8346416e382d3a3fccd0340812259a39.npy +04379243-2dfdedc4e2d10ccbce9509a520498ebc.npy +04379243-acf0ad26f9feff411191025061735ea3.npy +04379243-8143949bf6d5e294ff2c800153491d59.npy +02958343-f4c4bc930957be4951e9a28466112d97.npy +04530566-ed94229d6bb18b783f351db9d8c0e76.npy +04379243-6def73c13a40922d9274d508495753d2.npy +03691459-90143acb141fb1cb4292de5cdfae65e2.npy +02924116-f877396a3f529e21a71edfed1705a549.npy +04379243-bab86ce3e5bf3aac9715146e52a0621c.npy +03001627-f1933161d8b49d8dfb266533561ee98a.npy +03948459-3b4f6cf1745e0a44a04d2f46d86c50a0.npy +03636649-715be273074283557062f2d72cde5c95.npy +03001627-ebd73aa8ec2fea5c36c26b54df360d91.npy +03593526-20de70652a72eb4ae27790b0ec8671f7.npy +02958343-d5d47fe322179a83473f10e6caaeca56.npy +02691156-3b82e575165383903c83f6e156ad107a.npy +04256520-2bec1d8c0e8a1b3b7b98092cf509b83.npy +04330267-f8ee8e3ec6e56b8d5dc3653f8341633a.npy +04099429-731db7871e19a2efddf75684fdf930e6.npy +03636649-20ddd6039bb61e97fa01175e0dff0063.npy +03001627-1bcec47c5dc259ea95ca4adb70946a21.npy +04379243-734c761c6fd2b260b4c161851ed2b4e4.npy +02691156-f12eefbbefabe566ca8607f540cc62ba.npy +04401088-d740b0679a9996ae56acd5d5597a72c4.npy +04379243-d65624cccd27e85ce8f3ad90cf010c5a.npy +04256520-bed08d3f3d82bd2f37b2bb75885cfc44.npy +03691459-709864406b03fa2f880d754debc41bc5.npy +04401088-832d6075c8fafe4de862e3cac45aa769.npy +02992529-ce0ad218c6b19e76e7eb1b9b386befd.npy +02933112-595999124367c701de650492e45fb14f.npy +04530566-355f5aa01c79fe1458a8952c93ff9829.npy +04379243-3763dc87aed9fd73be6b1cdaab15028.npy +04090263-b38371493e6c31ba2e2849ea51389478.npy +03593526-e51c76a9d10593a9aa5b514b364ab62b.npy +03046257-5fd0cd70a717e36914038d588fd1342f.npy +04379243-fe57d6cfb3ba455fc35f1f8a8febbdc4.npy +03001627-a02d2ef9789836981bb088904f7cb154.npy +04530566-4f245403e6366d48fb3294f1e40c8a29.npy +02691156-3c7e4628a9ea201bbf3143b1cb6076a.npy +03001627-ea19940c812803d1383b5acc757bd668.npy +03001627-6da85f0549621b837d379e8940a36f92.npy +04090263-3e25cad3c3379be6bbfe0a3a537396d.npy +02828884-53e3f4b35e8c992e954bfb4cc0842c46.npy +04379243-68794d2e264ea2d75cf2470a6eb9a24d.npy +02871439-6e8a54f0f1d0c698b4dbc260302abeb4.npy +04379243-ff2b5b315173f3244fb315ce917a9ec2.npy +03001627-470ee88d9cabc6028be5ba60d0b948a6.npy +03759954-46e0c1b2e0635a111ef58b31c4ba0d15.npy +02691156-2176fa9f69e5e1dcca8607f540cc62ba.npy +04460130-6e87ad11e8c3c273af621148ecacc588.npy +02691156-480d027eea9830b511c04c8a3e94088.npy +03991062-da9efb2601fd872d2ef1c225dc7772c5.npy +03001627-41ceeeab52fd3ed3a341228b21d337a9.npy +03001627-98c78b59a5d97666dcad73f240f03a20.npy +02958343-9fc18cf33ac91041425b2c354eccabaf.npy +02958343-51d9af66315d76f9e6b335b85df4d203.npy +03636649-364ea921dbd5da869a58625fdbc8d761.npy +02818832-37ca2cb730cac30ea42bba87fb4a4a5.npy +02924116-fa7c1c950b99389e5deb3d7d530fe881.npy +03001627-2c03d0a4c83f0e89488017d48a7f7eb4.npy +04090263-31f4d647d59ecaaa5d0dded52efeb4fd.npy +03593526-c0d6cd0537d0fcc8235e3c816d887b3.npy +03593526-a2da2f83adf04371d680196133d8b70f.npy +04256520-69eaeff55a5a9c5568d1b9a1d97e2846.npy +03211117-f7effbc133537f0aa5d0c95600bf54cb.npy +02691156-ee92bc35ee989f59271b3fb2659dec56.npy +03593526-712db68c0889d82925e0f641bff885da.npy +03001627-38abcd9d3157f7fe71a782a4379556c7.npy +03001627-be67f51c3df7dd165b9ac5a4b39649c.npy +03211117-cf4c78178c9dc8c292df4681ccc21025.npy +02992529-3d5401f4ecab9be91aec2282dd8bc87a.npy +02828884-b773f8d5af2c1087cb2a965e75be701c.npy +02924116-5f67a64225eee1d28e7126bd2d50de26.npy +04460130-547e1ef6922840b23899914213d0efde.npy +03001627-7e4025dcdad5415386c701087a194026.npy +03001627-6a8f1dd7e0642ca4b367a648e9b173ab.npy +02691156-ebda573deda43034f2b0736dd4d8afe0.npy +04379243-6962c6b32fdd0a6d6b872683e72852e1.npy +03948459-17e9d8c1b7e7be20213f0776ba8707b3.npy +03001627-4fe3809c20606e5369d8d5b35c38db0d.npy +03001627-d3213947dec793de213c3458a0fe5598.npy +03001627-797ad20122fb300659810674e1df4887.npy +04554684-43f60a28b62b616573d8be0e464c51f5.npy +02924116-5809985c32fd5bcdd81b677cc22e58ac.npy +02992529-c0969979d6ff51f3db27d84853613218.npy +04379243-f16f939baeb7722e664b3b9b23ddfcbc.npy +03938244-6415c868620b99a061c93a6de3b6bd7a.npy +02924116-76f657e27f2aa86391a491e8257bd6fe.npy +02933112-90b901d37c751841c93205b4771d5663.npy +03001627-60d11f54c4d3e1d856232348d1bf86cc.npy +03001627-725184eebea99d42a49e2dd37ae1f85.npy +02828884-7cccf8e8ebd9454fe42c56c78fb88524.npy +04530566-2a301f7070178c028cd011e47ff1df1.npy +02808440-af592551a5f44e8e54d7082b34825ef0.npy +03001627-19dbb6cbd039caf0a419f44cba56de45.npy +03001627-a7bc0f5b5d73df73f51f77a6d7299806.npy +04379243-2447732fa2e0d8d870febc66c2c7f4f6.npy +03636649-fc8345dacde827e376e9713f57a5fcb6.npy +02691156-70e4200e848e653072ec6e905035e5d7.npy +03991062-9b1c55fbfa0c337b81faebbdea6bd9be.npy +04090263-6e127603e720af7855731e75c389c9d.npy +02958343-58a500adc776ffd5a9655fa3e976d18a.npy +03001627-2afa06a01a0a15fc504721639e19f609.npy +03636649-f72efa4574100c12a8930422448288ea.npy +02808440-11d2f19d44c24eb53321831d2245cf06.npy +04090263-204decf8bb9bc9e623c69c7ff0f71040.npy +02958343-3b41ffcb4bec60cc21a66e8dfcce514a.npy +02828884-f0daa96d0eb986adcf729faf809733b6.npy +04401088-388798a892636235d2a526c0a7ff71e.npy +04401088-af983238a3e47692f90d7ee51bc3530a.npy +03636649-28b50bd5aaee8c4e7384352a7758c897.npy +03001627-23b0da45f23e5fb4f4b6538438a0b930.npy +04379243-ec7795f1efb90af9f37db3b69001ec04.npy +02958343-e7b500cc55c8f13b4512af8eced68fa8.npy +03001627-d9a1f2e7290cd2c3baab0c7159046dc4.npy +03790512-33b1973524b81c4ecafb6b9dbe847b85.npy +02871439-964e866377b784ab58bb658c8a827077.npy +04090263-19949be9b9eca5c667a4cd2863eb1ca.npy +04379243-edaf24be15738ea2c5d1c45cadcaa3eb.npy +04256520-d2711d46aac0b5ed492a9f7c65daa58d.npy +04379243-b5eaf46797ada237738e43095496b061.npy +02958343-4bdcae58e18e4c94c1bbb501b1d87871.npy +02691156-67eac921334c130c336fa8434b94be14.npy +02828884-8ed3f1b59a74ac71f155d75bbf62b80.npy +03001627-d14d1da1e682a7cfaac8336231c53cd1.npy +03001627-6c0b7ec41053d2e463860398b0d16872.npy +04530566-bc4ab06257678e8db25f0198c2ecfb0e.npy +02828884-552ab19eab47725cb2a965e75be701c.npy +03991062-546025d656c166562887a88b1b446ef8.npy +03761084-a635200a9c6258cc1dc59d2adbe5297d.npy +02691156-eb5baf7bb88c1499873ec74c119307b9.npy +03001627-fbafdfd16d929c715b52e74a988c7255.npy +04379243-ed30d775da40ee9ebd907eb5031fe9ca.npy +02992529-d659d98d384e2c37e405d2e0f546cab.npy +02958343-373ddcf15e21eacc3cb72b063dc95295.npy +02691156-3b9c905771244df7b6ed9420d56b12a9.npy +04379243-1f036102a311fdc174813b7165294e91.npy +04530566-338e37f313d48118789eecd157794d2a.npy +02992529-38afc0467599bd6bfa13d53e5e4a7d2a.npy +04379243-edc14df2b7e3bed1b15370175a9d2c81.npy +03991062-f84d30238a4784b9a2c59a4d90e63212.npy +02958343-415c24869f57fec9d9e74b7f1cf9cf3c.npy +04090263-f1f780b6afd284d0764c65bdf1040995.npy +02691156-e1a8e2f93abfc7d590baeef8ba5b93e5.npy +04379243-aafc579804cc095cbababe11fcea8796.npy +03001627-8ce2e49ab9f58811610c2a68437007d6.npy +04530566-8e431fd55a7aca0b124dae0a32996c4c.npy +03593526-5d123380371637c330b9e09efbedfc98.npy +04379243-fe621b83750698a6855931d119219022.npy +03211117-fb92cb1fa04c2ba6bf1c304f780914c6.npy +04379243-445402730a420ee63190a57d5547dcac.npy +02958343-3671b83524f48dc5801b0db1d49ea10c.npy +03691459-2f9b00e9c1a1b00c47569806bbb7c5a0.npy +03001627-b2ba1569509cdb439451566a8c6563ed.npy +04256520-f2fbd71be2c50fd89fb1d3c5138b2800.npy +02958343-d157bd15ee2d92b0bda733a39f84326d.npy +03001627-e767b27d6625f905e9af7c2087a87b0e.npy +04379243-482fad8b18008ff8c6540fe6bc16d6f.npy +04379243-e3fc414b6b9b52ac50d71b436e21a7da.npy +02828884-28b9f2908f0cbb179c21c139c0613648.npy +03636649-892900c66731d9c473ab7b7128d466a2.npy +03001627-569500b7add934625090f949bc5dabd7.npy +04256520-ca7dc4294b1080acf256e6841810978e.npy +03211117-eb712261aec94a8ddf8fce61d01de43d.npy +04379243-7bdfc4bd3fde9066b0028474d8c979d1.npy +03691459-2c4d13cc64a679f3322f30a0f4208183.npy +02958343-e84eb770bb6cedf3bda733a39f84326d.npy +02933112-6ff13af4d409fd25c3c22f38f0cbdf9f.npy +02946921-4cc3601af4a09418b459058f42771eff.npy +04379243-6620b366c1532835789195d85b2f8718.npy +02747177-4dbbece412ef64b6d2b12aa6a0f050b3.npy +02992529-c3e0378cf861099ae3f7a74e12a274ef.npy +04379243-333002057d45adfa7cc56a6af4771185.npy +03691459-b96feb6abb039ab8c7c56d4a401463d1.npy +03211117-165531f6138b14eb107d63d06953370e.npy +04256520-8e9de6e848ed53a248cfc982ba61d3a1.npy +04379243-dd9782826dda1284b3104e94482ea9ce.npy +03001627-e275ae27990e21988d2d730aebe7865d.npy +04379243-24bf4d4382c6bbf0d99562b7e15abcc1.npy +02958343-10d388f6f578e4e8851f021b9ed69c58.npy +02924116-8ff82359ef1ab92e52470de2774d6099.npy +04379243-316a52439f11450355f46d55537192b6.npy +03691459-5b9b77ad6ce283a398e4bc44d45a32e.npy +04554684-360e2cb74c9c4d38df3a1b0d597ce76e.npy +04379243-dcae4e8f41346522e1448c25c538991a.npy +03691459-b7f4de208a1051e62a27a874411d1ac.npy +04468005-d12a8d45a7a6cb188593314c6dc5571d.npy +02828884-8b98dbc11c5d2fb7601104cd2d998272.npy +04379243-189f519f6cb7b8c516fdce62f5c06e29.npy +02691156-c0796e38ea7a1d9fbc0909d98a1ff2b4.npy +04330267-270e25863ba6098b0a04bc414beaa99.npy +02808440-7ce00acd26d3ce63125fa9990176f0d5.npy +02933112-acbc349caf76e6b171337fa12bff07ad.npy +04379243-3802e59d5a3970d5ee6f3ff2305dcb14.npy +02876657-684ff2b770c26616d3dfba73f54d35bb.npy +02818832-34292cd1143461a6bda4e7fc3e4df4d4.npy +03001627-7f11f4251d2faee4492d9da2668ec34c.npy +03593526-a3b9caa337ca7c8e6597d391ab6fcc1.npy +02924116-49e79427faf2694811d89826bd8e0670.npy +03593526-3e2dd918360309554b3c42e318f3affc.npy +03991062-38b2432c5a2be4c95d8d4d8a3cf8b294.npy +03928116-1f7301bb64526ce9d4cdf759998ef5c2.npy +02691156-4e4128a2d12c818e5f38952c9fdf4604.npy +03691459-8cc5a2ac83bcc120e7a1105f5e7667c.npy +03001627-cc5dea482768651ed0e93cdb469eb63.npy +04401088-d130a357978694bf58efc722b5cff71c.npy +03046257-247ca61022a4f47e8a94168388287ad5.npy +03710193-914fa58a47245909a0dcbb80c5a68d2f.npy +02876657-5cbf1e8f31bae4cd67d1cb27b1ca00d7.npy +02876657-d85f1862dfe799cbf78b6c51ab8f145e.npy +02958343-286ce4a8390b317f93680c5a9a367b4a.npy +03001627-b9ac31cc001a0ab72a64ba172c1ba615.npy +03691459-f57b269b91e369f07b646fca2237eb6.npy +02958343-f1b97d671bb93ad928044fe9244db50a.npy +02773838-e0eb0b7925869326aa7b926be24dab3d.npy +04256520-8a85b0675605ed8219fb4103277a6b93.npy +03001627-5e338c489e940ab73aab636b8c7f0dd2.npy +04379243-81fd25d9d26de497c34335c1a2a9193f.npy +02958343-706671ef8c7b5e28a6c2c95b41a5446d.npy +04256520-5b7b8b094a52794675543092060e57fe.npy +04468005-936eac04b6a873049954eae9164faecb.npy +04379243-e2a56bcdb18d820047ad57fbec8be0bc.npy +02691156-c950fc7d559f30016e86a8ae6e1f4d7e.npy +03001627-33aaad494817a6f4ab705559ec99536f.npy +02828884-ba8ce85fe8f294929126d89585a68a7d.npy +03991062-86dc5ed985f2efd268ce23faf6fa0bec.npy +02691156-37b413fb76f97e0a29ad19c61d540866.npy +02924116-cf2c392c427c5a287a4d6e5c691fbefa.npy +03624134-ac2ad0d425f80152ea88f776c5c6a310.npy +03001627-f854fa8ee2fb6d715936c7265c890fef.npy +04379243-6d5211390473c3bc3bd24f986301745.npy +02958343-4aa7fc4a0c08be8c962283973ea6bbeb.npy +03001627-5ca0b01dae9e3476f51f77a6d7299806.npy +03001627-cc5b5e367ad8eaf19fb4103277a6b93.npy +04401088-1e52452aeb4bacbd83156841b8188cc7.npy +03691459-60474fda23d64ef0debcce788b4a424f.npy +02946921-297b1ba8efcbb6a86128527957a7bb1.npy +03691459-1124d162420a75232633ff66beb9cf31.npy +03001627-66e37e1831d3e49843638dabe1eb5336.npy +03991062-45d80de406c4878b59c0d8b17a41b6f3.npy +02808440-8738c8df22c4847fad99c01a1a18d1c4.npy +02828884-fb861f0e4e7f528fccda8d28b44378b7.npy +02933112-53e5fe30d92d6733e6c5cd45aa112726.npy +04460130-88b8559c748d1d326eaa9b51f546908e.npy +03211117-ba5518af411cffd8cfe78be5b7b99c8d.npy +04530566-5edcd7984de7fd4b42cdbb9140b25a0d.npy +03928116-c1b63d9e33a7f3b1741447c6658311e.npy +04530566-c2d71194be5909a75f71e6fef75fd750.npy +02933112-594128786d7aacf26f2c2a3461eaa93.npy +03001627-3ab838f55e56426b35836c728d324152.npy +04379243-132f7a4ddfe7f230fd6ec91a99a73de9.npy +04379243-f6e56ad2fe9e6c30253be0083bb3c718.npy +02992529-88c3248ee6950fc3d24be492f98354f.npy +02828884-8ea569854b8dfc8022b74f7ed4070ae0.npy +02691156-4d885cb269ae88ccbc40166c69b12cc6.npy +03642806-cc67f6608c41743ec1830f8ca7a3cbed.npy +02933112-7a48b295d6c3956fa96fd0f479def5ab.npy +02958343-a55f4932b0f8a212402257734064a917.npy +02691156-4ed5983b7721f1da7f79d93424b708f0.npy +03691459-b14b479cf64c7d9ad77ea5e1afa5bfe6.npy +04530566-313aaf9d79105fea82fd5ed7e39258c7.npy +04256520-6b569ad307bc38c06eb9b08c8a74d159.npy +02958343-40e51788da97a9c7212ff4933c4abe56.npy +02808440-a14611b43f16f0fff0bee563b25a27d8.npy +03624134-8d3142e751030a211395331ebe4786cd.npy +03001627-d38a49a15715c46ec3bd24f986301745.npy +04379243-a3f86421758cec25a092cc351404fb5d.npy +02828884-14a73dd6b5d7ef35feea12256ad59f11.npy +04090263-7cb94f3b4bda0dd9783a7c2adc432e76.npy +03001627-a235f7c4947aab15bf40bda9de89848a.npy +03467517-408a8e1b51266b9ccc34b900bb2492e.npy +02691156-4875318127182dbd15aba2f83720a298.npy +02933112-7f137684240ee0d62fb11210723490ee.npy +02992529-2acc3bd87282a7e31da45817bd55c1e.npy +04379243-c92e4772e218f5cbef9e56a2aea1eb90.npy +03001627-9ddbf01abee716b39b0530265e62c9b7.npy +02954340-90c6bffdc81cedbeb80102c6e0a7618a.npy +04256520-3b37e15f2dfe0bdf55f9a00acc25f137.npy +03001627-f64aa038d1e21e0ad2ebe04c523a4739.npy +04379243-4c8472bdc535102870553da2430bcd98.npy +02871439-5357cb17dad20db549d28b1865273fb2.npy +02876657-8e20da9c3f63ac2ce902acf138e668e2.npy +02747177-8b0728eb28c1873938f21a3304cc4bdc.npy +03211117-5305858e5ce441d65fabfc69ee61b28b.npy +02958343-d76c9eb102316ac631a8860374e7eed.npy +03948459-4648980f23149150edfe35c9179614ca.npy +03001627-acf23f78322f00f219fb4103277a6b93.npy +02691156-d6edd8b0801a02baf7571913c73c0c78.npy +04379243-d4de4deff5410e2be499c77acfcee9f4.npy +03001627-4042faba97a901aa08cd647a48e605d.npy +03642806-5173aa7f75ff3cf1b55fde51a411949f.npy +03513137-8942f437af8771afa1702a37604ec6f.npy +03001627-bce5c7402feef6d235fce1b314c89aa4.npy +04530566-26bdd8852a95cd2d4e4ba49b2943b913.npy +02924116-904ca55b79821ff85dc6bf5b8d674d37.npy +02773838-f1c9ebc8417c029a4da5feafe6f1c8fc.npy +03710193-1e4df43ee2f2da6967f9cc18b363cf72.npy +03001627-2fc6eef6605be9a4550584dfc8970d11.npy +03991062-be0b5e9deced304a2c59a4d90e63212.npy +04256520-6315fad2852149fc19fb4103277a6b93.npy +03325088-d67146079abb59a43321831d2245cf06.npy +02992529-5101c0131cdf76d03f9d84f9a87a44e4.npy +04530566-c19f98f149ee5da8b1bb46d2556ba67d.npy +03046257-b0b7d5ad6219ef0ddd425da1a5e9a595.npy +03636649-c898f9b1dddbb8801735ea0e092a805a.npy +04379243-2a963bc9ad704e5f525b133235812833.npy +02801938-5208bc4450a16d0e4b3c42e318f3affc.npy +04379243-2f32966fc64688969a08db804545b684.npy +04256520-40df73dfda0e26ce442b5d6d90d0cc78.npy +03001627-dc0bc65e9181c2f698eb62961a525575.npy +02958343-dc9bb9540228dbd4a8977f240035577b.npy +04379243-5de8e8b5034ded6b707cdefe012d0353.npy +03001627-f90dab51bec2bcd1a3340564b56a7f70.npy +04468005-2085c9f2619ccb014b0b2e6e63122009.npy +02828884-ba5e47b9a08c33d1ad1f278e1513f3b7.npy +04379243-a42d138bdd78cfe640abe029c3c77771.npy +04379243-5d65f46bcc49eef08b378a8c4400c79b.npy +02933112-9a688545112c2650ca703e831bf56f93.npy +03001627-c04d0cf81d9d870a7aa0699f5d30fdef.npy +03001627-c41ece3374d0e860e32cefe0e484fed3.npy +04554684-c6f9e7650c898b017b197b8311051a3c.npy +04090263-34eb6b0af5ae9f26d957eaf7f4edb205.npy +04090263-c42fe5b663661e1b4b004f8ab4aaf710.npy +02828884-131edf0948b60ee6372c8cd7d07d8ddc.npy +03991062-5856212eaca6fa76d4665c9b5f6f833c.npy +04090263-9204db8d40b7fcd7fa45f4d7e1ef7d0.npy +04379243-f5f5caaa07335f4e5c3654528317cdb2.npy +04256520-c856e6b37c9e12ab8a3de2846876a3c7.npy +04530566-71fbcc8e65022567b031dd7b49fa6191.npy +04256520-f9f8f089be14d5b672b33dfe598bdd77.npy +02933112-a0dfc5cd7e2331e6166ddaef2c2c61ae.npy +02924116-28e81e16c2c1e2723720164441111d99.npy +02958343-53a604e4037c650beedcafe524c3dc4c.npy +04379243-72f98e4a45f971ffaa0fb4126a41efc4.npy +03938244-c1f39c4bcd931875f51f77a6d7299806.npy +02871439-89f1540881171ee3f4c4977ed0ba5296.npy +03467517-ea0cccc085a8c4214f99643b5c4dd7ca.npy +02691156-1492ab4cf7a345e34b6f686803e61ffd.npy +04379243-223fbcc813831d8c6e526771d2f7444e.npy +04530566-fd52c80ae21d19251e0d0f6bac6856eb.npy +02808440-aba9f8d311894cf539d4219710154fda.npy +02691156-f8038d33c212f81fe99ea3c41458bc01.npy +04379243-70e58cec417d5e1ec283ca2c9df7372d.npy +04256520-67711689ee7d8dd76b4675882670d943.npy +03001627-1006be65e7bc937e9141f9b58470d646.npy +02828884-3e850a85b7c0f82cad5067eac75a07f7.npy +03624134-5314b350d816db25fa3fe405f2a25e27.npy +04379243-a8713681fccb1d647ff6ace05b36a5.npy +03691459-8671e50787f3486e1ad88f716ea80910.npy +02691156-f56cde19efc8d428b03f97f6dc2a21fd.npy +04256520-15c66bed7e6bdf85160c7765c528fad6.npy +03001627-73f16e230ac102536e07666ce67ff5a.npy +04468005-759db14cb3d146c28a3bb66b1c21b5ce.npy +02958343-ec07cd8db8f2bea851f021b9ed69c58.npy +04379243-4fb0bfbe85fce25cf9a2c981b043f98a.npy +03636649-ea7a5e58c0462957edf4c948f5a7c441.npy +02958343-5a728c7371f8fa3f1e0401312b984eca.npy +04090263-609bcf41c9d33c04fa9286f039319ff7.npy +03001627-9850d225049f987e9b9f2eb77f5e247e.npy +04530566-2e620c48f90f6fb2f569f587daa38158.npy +02828884-be8fa5b70de21c9ff155d75bbf62b80.npy +03642806-3b2bddb0e8ff57c85831a0624cf5a945.npy +02828884-b358c31d1bcab88a26b5e3d0c65cd557.npy +04379243-e153f757330a4ea3cdd1f51ef2b8f2ed.npy +04379243-e296f2e967aad03a55f46d55537192b6.npy +04256520-a5d21835219c8fed19fb4103277a6b93.npy +03624134-5eac9253e2e8803b67b50160faec8785.npy +02933112-a4caf30bbf028b63713f083e39bce318.npy +04379243-f323d90dea57815e119555fc7462650d.npy +02958343-52cff656189850a2546b7395fb17f97e.npy +04090263-cc380bcdadfc3040ab49837258a1bfc5.npy +04401088-c13cfcc92e41e5a924fb403e4bf9a6b1.npy +04379243-43f1b98f950af6d04f3443b22038d340.npy +02958343-cf4c819d9deb6533108499aad0a89b28.npy +03001627-77eb55272e3c00f2cb774aa5a7f9653.npy +03513137-77cdfb9d433531c6a8963fe61f2bc75f.npy +04379243-ebece7c581e3a42c32ba69f5f654ada.npy +03636649-19acda4f74d91d908351668cf609c7df.npy +04256520-ea295fb4335e3499f51fa0238791f5dc.npy +02958343-ddea3123599a628ebecf71e2e014ff6f.npy +02958343-2ef03b91692d6dae5828087fef11ba9b.npy +02828884-e8ed5a53c78744aa600895f6141c10ae.npy +04090263-92a71ab8a9862a5452d6d9553235a14e.npy +02924116-e90cafea6e6d9054b129901f80d24b7b.npy +03001627-dd78c16d85780d6b413102507b68bcb5.npy +03001627-21f9dcdadcca16227ad11050da24bb12.npy +02828884-96fb3569c007fec46dbc2b0ff6fd8e0c.npy +02843684-24e3f96618446a3ee65b26d9dc163c75.npy +04379243-2ffcf26e3cff97ee40b4c5428883e585.npy +03636649-8b7ee8229a579ee135836c728d324152.npy +02880940-5aad71b5e6cb3967674684c50f1db165.npy +03001627-34dc6c4e022b380cf91663a74ccd2338.npy +02958343-bac6953b6866ec02300856337cd5b2e.npy +04379243-fac2aedc7b6ab4b93002761e7a3ba3bd.npy +03467517-7e78c9080d79e7d3c0177b7521e73828.npy +04379243-31c278a2aa2a490241fe42b98fee4b0b.npy +03001627-3d23d594355c65d9376f771510e6da27.npy +02691156-55fabcb7e7c11560fa6bb68bdba0e663.npy +04256520-1acdc3f794d927fd63fba60e6c90121a.npy +02828884-7e524d1958ca0348d6abb4efd157f402.npy +03001627-40fc53f1c111a19c7d3c9de9415fb224.npy +04401088-298ca71453baf6ee2a9eb0f146e94477.npy +04379243-4f64eee409e34b41aa8d36cc58ba1cf2.npy +02691156-2de92a57e410020cc231d70e1e0cc567.npy +03991062-dec28aebe77c1ec4a2c59a4d90e63212.npy +04090263-5da81098c784b512673a614c45f3afe4.npy +02924116-af6358f5b2bc3b2a859e9bc6b5cb2580.npy +03001627-736e9ee917f741193b908295ece2b069.npy +02691156-5dd2324cd6ebf52e293fdbda4e7beec9.npy +04530566-388c5175593b057a66bc841ba9cad258.npy +02933112-b67d58cd774ebeaea480742f4529182b.npy +02958343-c631ec6f38a5e1d7fdc1d9a76d31d55.npy +03636649-d90d20f02ba8fb9a6bd00d0eaa99c3c3.npy +04379243-ec9d241cddcdb149f5a6ec2a96a47435.npy +02808440-3b501fa442876e4860fe69425c98b781.npy +04379243-d46537f513283d6cdcfcef693e7ec696.npy +04379243-c479482694623359fdf2e93846e20960.npy +03001627-e53b07b648e8d041107a17cfae0b6df6.npy +03467517-dfa75192819d2b89d909dfebe054cd91.npy +04468005-e7934a1982f37a695c37515681ce1368.npy +02747177-bc0ba7a521f9c61dad5067eac75a07f7.npy +03325088-a360dfc51bae92cd76d20e73c57c9a03.npy +03325088-79b89dc3e5809c5450da8b99982a3057.npy +02828884-516f47d7763d1db5ad55477d55e7af82.npy +04090263-291534185aa7328217ae750b40e40d3e.npy +04379243-69fa3275d6aaf1dcc9ee6bf6bfac3917.npy +04256520-26d165613b7baf134b3c42e318f3affc.npy +03636649-47adca3b217160d4b0957d845ac33749.npy +04090263-99866ea1b82e18c982cb4f2e118e48f4.npy +02958343-d0bf09ffa93ba912582e5e3e7771ea25.npy +04530566-52ad452f1c63aee5a66bcb069f7626a7.npy +04530566-b33a673da4745b08b5ee11a06ae8ae58.npy +02691156-8341ff3b44ed2e30473f10e6caaeca56.npy +04256520-e8dfcea40c6cee9b990561fc34164364.npy +02958343-a90b6f926a6307ab31b57ba89dcc78c8.npy +03001627-9ee7a2dafbcc731319fb4103277a6b93.npy +04379243-e2022bd4d83dd6155a15b6547f08c8fe.npy +03046257-7e98d09503ee0f39ad2ec599df06ea94.npy +02958343-6208166202d795a2272523adb0c9ecd0.npy +04379243-e920d6df55f51b9d3abfc4d0a5688916.npy +02958343-93bb1cd910f054818c2e7159929c406f.npy +04256520-f6bfc818e9e265b34b3c42e318f3affc.npy +04379243-b90ea1e6e5574e5814038d588fd1342f.npy +04256520-a9317911db005724f19c36a916a93d14.npy +04530566-cb8a73c5aea2be236b26711d34e99cd9.npy +04379243-f3f8fcf3713f89847e2388e35557b84a.npy +04468005-691349d753698dd8dc14ba0818ee5cec.npy +04090263-d04048099296ffe4dd084a7dcd1680de.npy +03001627-21cd62313612a7a168c2f5eb1dd4dfaa.npy +02933112-150a5e3deaacaad4983f6ae6d409aac8.npy +02958343-2faa3cff00d98abdf5274507f44ab711.npy +04379243-3fdd61db58e5856c91c74eb018d3bfd5.npy +02828884-6e29c6e045daf2a5d201085e80edb26a.npy +02958343-82fdfc4ecc49072c3ffe0e5069bf1eb5.npy +04379243-50641bc54d5d41e2a85acc7b983a0d66.npy +04530566-c7fb35a9ca583715ef0445a3d98d3d35.npy +02876657-46910c75d17ef8554c6e2707eea5c15e.npy +03642806-34913d1dcde913848bd55eee82fc09d6.npy +02924116-a907154f61d0bbff6b418c7d9fedcaa9.npy +02691156-c207db490c4acde27b5d32a85e1b7987.npy +04379243-780479255b0af544ef56e80181daf078.npy +03001627-bec075322d514fc9f51f77a6d7299806.npy +04256520-cfec2302eb084b5c58f4eb05242852ad.npy +02871439-825fad19825ce9f9d42b9650f19dd425.npy +02691156-ca8e8a54b54b41eceb1a0518c224975f.npy +02942699-68f66f5ab594fd3cc2890daf3a9f7413.npy +04379243-78253ff57339985a28c0cecb7de2397a.npy +02924116-484d31fd95214ecc6bf3b18b8ca71a.npy +03001627-c951e7bd4c0cbce17ec5a98b3b8c425f.npy +02942699-e67273eff31fabce656c3a28e34d04c4.npy +03636649-d3e5c225e8ec17ece4a604577ef990de.npy +03593526-67b6b40050bdc870e43df8c9a38bf11b.npy +03211117-cc1611b5120b8aad9651cd1d591d64d.npy +04379243-9b02cf9719863b8e9e990e1185980a77.npy +04530566-7915c47b72e6d496e453885abe85c310.npy +04090263-6e700588bfb6de35f30e6249e336e80f.npy +04379243-a95828fa4607295674c8eb7e4d6198a5.npy +03593526-94235090b6d5dbfae76bc197b3a3ffc0.npy +02691156-e594754cc2a264d63da2ae40e7681e7e.npy +03797390-c51b79493419eccdc1584fff35347dc6.npy +02747177-e4bcc42ed5b66b22b491f065bc1219a.npy +02958343-1790131f5f74b1ed973aff268eb6b00c.npy +04379243-97e6d79058bad189ca96b2737246fca.npy +03001627-866aa287bde4cff9bfd324d8acaeb3f2.npy +04379243-3b7db1bbe9ca00204d851671c3f1cc65.npy +02691156-68a423eea131656b1e2b909763d0fd31.npy +03001627-fb8c3a832eec2ffe627fec6651ed13bb.npy +02958343-7a8f5c085be36a8052aa494042b7c9db.npy +03325088-c23d9166bdeec5e5b362845c6edb57fc.npy +03636649-382e40ed472250924f3443b22038d340.npy +04460130-4fc1268f6aa26fd76ec5e0e1e130ecd8.npy +03001627-ed3cc4a95e18b3fea19b492f7b035eac.npy +02691156-b7023a2bc0b1c28142edba76767f7bf5.npy +03001627-e564f393acf979683c2e50348f23d3d.npy +03593526-dc39b65c9ed54544debefefb2e8c0245.npy +02871439-5bcfec5fe326fff4e0deec465e890dca.npy +02933112-d3829c7b8afd0d2ef51f77a6d7299806.npy +03991062-e744d9040133cbf4bf9296aa16dd149d.npy +03325088-8571a28754a62b8ce163f4a7838826d.npy +02958343-9497f33086b582b7473f10e6caaeca56.npy +03001627-93dc91115a9002e1663fcfd6703c85f3.npy +03337140-e4f8db369e639af74c3aee8e9d3a6ffa.npy +03337140-27b87b953b733d8a4c3aee8e9d3a6ffa.npy +02691156-d3f93b6da62fae46a98ae8c73b190485.npy +04090263-48d5a68d2228359fd735fa1ab17311ec.npy +04256520-34a2341fbd255d82b8a06a6203bc49a9.npy +02958343-38e30aa86d7bd4e0574fbf5e869a42b6.npy +02691156-e66692f2ec8ea898874f1daffc45b57c.npy +04401088-590017c9eabc3a1cfe8474bfd438f6d8.npy +04530566-9408002c21ae222b27ac692756be9e24.npy +02958343-12de9c37c83992c66392cc95e1b05a28.npy +04330267-4979ab695941487a40b559ef47048b86.npy +04379243-bef84446fe50feccec7cbf3284585a40.npy +02828884-58a09612c838e441e7b89654b68b9e5b.npy +02871439-d8d8488a7a209ed2a74c2333655a11dd.npy +02992529-234d1646b21fd765ee45e1eced971f52.npy +03001627-45f9f54b9e7cf6897886c5f50906be82.npy +03001627-26a6ce644504c5fa22963ea1e168015d.npy +02828884-55da2d1d9250d41b800e0abb10f41d36.npy +02992529-308cce8808b076bff49084215d845d01.npy +04379243-51930b149cf6125373fa072a624ce947.npy +04090263-f5ffdd214cfa8edf94c9a8d7fabdfed.npy +03636649-cd389501a749d5b13b080c0097c00a32.npy +03467517-14ca31ac1b2801f2d57700c05b1862d8.npy +02958343-9ec13da6190ab1a3dd141480e2c154d3.npy +03211117-ec190042ef2f7aaef925cd3fbd303c2c.npy +04401088-4bef48f1c1b4a40fbdeec9c43546255e.npy +03337140-ed5a8f4ecdbe78fa15a34fa27bdf3d03.npy +04379243-e3fff8b83cf999467ff6ace05b36a5.npy +03001627-d23682341fc187a570732116fb5f6e1.npy +04256520-ce049a259cc2e624d5446ca68a7e06a3.npy +04530566-b0e8c331eacdc9bef3e39f2e17005efc.npy +02958343-4d2daaa14ab2f051bbfdd95a15649dec.npy +03636649-438e9c32633a7094056b9c3d62d1efd.npy +03636649-26f725bb6578936cd247b9308cd5c441.npy +02933112-45679a0d39b500533dd5cc05646564a4.npy +02828884-7b58a3e5d7f4dddcad1d789f3b2120d0.npy +03636649-37f318fc52f4ae333f534d0cf4cbfb4f.npy +04256520-fff199c067a6e0f019fb4103277a6b93.npy +04401088-1e8d859734efb73567a6837216666401.npy +04090263-1ddc9f25d09da805d957eaf7f4edb205.npy +04256520-766d94bac9ae085455f9a00acc25f137.npy +02958343-bc587f9680c5ea9b58be2d1dec5d09d7.npy +04530566-38b6dc2ce1e8cd05e8d6be23f236225a.npy +04090263-e4c32f0b48b6c4aa31fddac73d878514.npy +03636649-fb4783fb006f89e4d9b53420a5458c53.npy +02691156-29b92db18649b64e959a8a7d5a8a5077.npy +04256520-29f890e465741b7ef8cb9d3fa2bcdc0.npy +02924116-2a7301abb348191552470de2774d6099.npy +02958343-15d6cd7877c6601d9ed410a010efa019.npy +03467517-33ec10ba6e6e0de41ba258440d3e234.npy +04090263-3553f6cf76c2f9e1870906b5178d97bd.npy +03928116-89814e650a56b657663f013a9c68bf1a.npy +04379243-e4dc0ff7a1f3151814f68a949b9a6baf.npy +04379243-978936fc521780702c5b6d66521f20aa.npy +04256520-67b1d2a43f266f4bf51f77a6d7299806.npy +03325088-567eb00396cdb60214b35a7d7cea7130.npy +04530566-9908b25da1e19480b51edc80d299de94.npy +03001627-4f79d43b70f5bca3d082d95e9bd50b49.npy +04090263-8cdac72ba112e8f6d2c901959c439025.npy +03001627-421472e991acb24490267536df1b0cc6.npy +04379243-eda7058a8c6440b7abf529d72f4c9152.npy +03001627-2404a64c8736bcc37ef29b55d8edde64.npy +03211117-459ea1db4ad52f3d7b7c888d3626712b.npy +04530566-925f3de9b1256113538505dcebf57ab1.npy +03001627-2de04227fae28e70b6eb6f056d511fe1.npy +04090263-6ac3f88bb36968ff6797bd93e1caef31.npy +04530566-aeb021c1e1838706b44ca19ee8c5531e.npy +02691156-a5ca77bfabfad028b56059027b9b30d2.npy +02691156-33e11a7dec64dd42d91ca512389cc0a0.npy +02933112-13dbeeacdabce3b694658a0201ba0367.npy +04090263-ae221dbffaa89b3264279e248bd2a91.npy +04379243-7ae9c3f17c5f9c569284ac9fef3539eb.npy +03001627-23d76c249645228d1e23e0195c502f30.npy +03046257-627617f3931dd0476e1ae929b00acbc4.npy +03593526-9097ce398b9700a27e561f865dc44fc5.npy +04530566-c6e255195b9a8691ea9bd4954e1c8c49.npy +04379243-35aced569e5e1d869d10bf389452ce96.npy +04256520-4820b629990b6a20860f0fe00407fa79.npy +02924116-660e11eff2108a00f8ff821990890128.npy +04379243-df4593480b94850bbf6d78b1e39e2718.npy +03001627-45a355545e7a807a492d9da2668ec34c.npy +02843684-4566d6e03bcd174b5fd335a0d0b003d5.npy +04379243-77147f716a20028635469b95109803c.npy +03001627-2ac0a9cdbe7ab8a6ad484915511ccff6.npy +02691156-ae4a9574248395b671d03b466c72ce41.npy +03001627-9d0b25421c13008e35836c728d324152.npy +02828884-7c770e38383d59be279e896561802d26.npy +03001627-3757a60634d134da35836c728d324152.npy +03001627-62257f79605faa66e6fe3612af521500.npy +02808440-ff6b4c0016394ba83321831d2245cf06.npy +03337140-1c319fc6985fc7cdb8405ecc20044969.npy +03001627-2acd3a3e50e8e068fae61b8c1512b8af.npy +02933112-494fd6deccdfb5cd5051fbeeb2dff27f.npy +03636649-989694b21ed5752d4c61a7cce317bfb7.npy +04379243-24019c15c4707356bf96d22e92924ea2.npy +04401088-8b174c67bfa00f03df269b2c62a1bd4a.npy +03467517-3ef569c13f4ab5f83ac61a2f8346a8f.npy +02958343-381332377d8aff57573c99f10261e25a.npy +04530566-de0964254f4599e8666f23db664db86.npy +02808440-47ae345322c4add9f9c0f9cbb10e38a2.npy +03001627-2edba114d2e9454295bea7c29e873d16.npy +02828884-6f2fa876147a970c5acde0d39b1b9dba.npy +02808440-b6df9d21acef1e11b362845c6edb57fc.npy +04256520-b675ac4b668ace54bdcf8e3531f470bb.npy +02691156-25bd1569261bc545e8323edc0fe816a8.npy +04379243-6da4b164828c371824507e0767ffba7.npy +04468005-8d136e53fdd5adba8be7c8c5fdb9bd6d.npy +04256520-a8df97262f1f0a44e4975e87c20ce53.npy +02992529-57004d88e4deebcabec15cbb63c9ab60.npy +03001627-7fd10f44a20506ec1b17743c18fb63dc.npy +02958343-34080e679c1ae08aca92a4cdad802b45.npy +04401088-5ba2137f5131db06219e978e6e16d30b.npy +03211117-75237ff4dabf0e9592552ad7302636b3.npy +04379243-332ce2f8d9c3927dffb8fce670bd5738.npy +04379243-4548b28199a044ab19fb4103277a6b93.npy +03790512-d644ca9d10aed7cdcd4bec905df51d1d.npy +02691156-1667ab313638fb366cf1b4a8fc3914e.npy +03642806-a874a1d28852062ec2743f037f439af3.npy +04379243-6d2c75d89b0a5f5d8cbb8bac2032149c.npy +02691156-c7b2f5b125bc41056d07c55cf995503e.npy +04379243-56ad1b4f94a1d84ae340086172f20153.npy +02958343-9d3fd293f6b9e46f28044fe9244db50a.npy +04379243-b3d7407f79c36ee7367336fdf5bd5f57.npy +03001627-69e591a9769e03012c528d33bca1ac2.npy +04379243-37c932b30ce507c6510e28eb1584c355.npy +04379243-f5adf1351a56586719fb4103277a6b93.npy +03636649-25999cece7e71cdae8c9f1b00ff43053.npy +02958343-4571e0fbe9cfb5f8fd52c8b6dd37752d.npy +04379243-cf5a0589134088ba37e5c2aed7049b42.npy +03211117-1f76e392f49bc1cda6c7922fe9004961.npy +04379243-9afaf5ab87a889f67acae9ce58893de5.npy +03790512-6683e13507dde030f6435254228a9d64.npy +04530566-411da0cd0b0089362b249fd16295bbfb.npy +04256520-51912ddf693219c81c8aa60fc1bb8474.npy +04090263-fc2f5a2623b4373a83bd2c1aefe617f0.npy +02958343-f7f7b1b4021be11afaeea7738551d104.npy +03636649-57c1bc69df779d87bbc7a6acbd8f058b.npy +02808440-ee9261d9011255453321831d2245cf06.npy +03991062-4cb7c329170ef2d6179720c8796635a.npy +02958343-b059f09a0b26d4b5cfc78902445ccff8.npy +03207941-e21ac8931606e2a2d1b2557b80a0d3f0.npy +02958343-40a30a8e56fa4a6c7b48e36e31209b9.npy +04090263-85c46176f030583bb349bd01da88f0bf.npy +04379243-41101b30e8a82faaa640b0223e089df8.npy +03325088-41aee3c40e294f9776c18e71fd49c4dc.npy +04530566-bff4e5d71e9b695dc6a303e6239bc3b0.npy +03001627-e8eedd37cb054e37b59d74a7c956bd18.npy +02933112-5c80714fa7f21981bf2e25c697250b54.npy +02691156-7ee59463dc17ac6e3e3f3c9608255377.npy +04379243-84c9082a8cbd03e5e76bc197b3a3ffc0.npy +04379243-c29fc3e0096d399e8d4b2547f739c887.npy +04379243-363c9169b12de77e1d4c681138512bef.npy +02828884-9e4c82a76b6aff2bbeedb4c8fd29e2d1.npy +04090263-359ac7f4ddf3e7fbafc7bdb2f8d1ea84.npy +03467517-52d82d2d6a82571554b87c21f44ed61a.npy +04379243-1e37f6dad9bb5fdf2f05c3ceed4d6250.npy +02691156-29925f23c2050efa7def3dd22d9ef72.npy +04379243-72bf6e88fc05d48c2ebeb1e6a8111f53.npy +03001627-589829ef4fb0390e492d9da2668ec34c.npy +04256520-79bea3f7c72e0aae490ad276cd2af3a4.npy +03636649-a89562207e0d50a6704c1b723fefce78.npy +04530566-db3a31bb1fb188c727ca48a52046110e.npy +04379243-e439549f5da57f5ea5676001632ead27.npy +03001627-731d9114eecdeff93454e751432992d2.npy +02828884-9dec54fbded3ed1767680982183b294.npy +04379243-ad17445446e4fd3adcfcef693e7ec696.npy +03636649-cdab137a52000da1b0957d845ac33749.npy +03001627-2280197ac01a58912dbc66eac8105387.npy +02880940-c2882316451828fd7945873d861da519.npy +04090263-a0a36ea333e8a39319dde5f6d908cdf5.npy +03001627-1b938d400e1a340b17b431cae0dd70ed.npy +02958343-4e2ca20091449636599389919f6522e6.npy +02871439-6888506448a935ea96b6312669c8f92.npy +03624134-74379a5fbc4935cf3b2b25ffabe35ca6.npy +02958343-cdd58286e3e428ec1fabf3cbd0fc77bc.npy +02958343-43fc65dfe952a7f4cf6923c08156107b.npy +03001627-bca8b73b32108ad6d42ec7e303174a87.npy +02747177-a8f009b0b4a76bf663b2acb037dfbcde.npy +04530566-27540cb221ffee07983f0317c2c6f92e.npy +02924116-4be2483503d0f71c98c13d6112727de.npy +04468005-556a0b9a789abc71eb34db531a289b8e.npy +04379243-867b553b34a3399919fb4103277a6b93.npy +02843684-304394899d284fe1ec1e281e84d8961f.npy +02933112-462ee81a089208caf2f140388f79bf7c.npy +03325088-153159f63d195bf576d20e73c57c9a03.npy +03691459-2336a8ba5ba8a9f0ce029fab54b6cfbd.npy +03325088-58fcac9c816ccf08b362845c6edb57fc.npy +04530566-44858e0564cdf90e299482fc72b07ee.npy +04468005-ce8f672133804c3ddc14ba0818ee5cec.npy +02871439-fd7f43c0ac27aa33b2592439813a5d1c.npy +02992529-1e8d859734efb73567a6837216666401.npy +03636649-3993a9c841dbc35061294c3e9dd88196.npy +02958343-e09813b03bdfce83a23218adb697420d.npy +04379243-9d54c8a7ea484adea330b2d4b3aea8f9.npy +02958343-19c25429d34ce9748c844a5e3a5e1a93.npy +04379243-50894123f3f237c161062d371b5548c7.npy +02958343-45ff3c9bc849f2e33a2844e8778fdc6.npy +03948459-5cc23a432b1b88dbf5029f48ea6cff14.npy +04379243-43aef0e663e734b75dcc7ddfa72357b1.npy +02958343-e6b8fe458aba5b0da86ce1de1d1e7ff6.npy +04379243-33f24a72a875633297e755dddca14449.npy +02924116-65b4a6c8cc40ee0f1288426428f318cf.npy +04090263-e776209bfa7f2844589c07868201b17e.npy +04256520-4e7062e2c776db18dbbc9440457e303e.npy +04379243-a72b18ca7d4aec7e67cfebe3c2e9790f.npy +03001627-20fd21021f3c8e5fcce6278f5ffb13a.npy +02924116-d1ff40feaf0516c6388c858f142b8b6b.npy +03710193-5a81ffe8b9acace8e51d90f0237045d2.npy +03636649-14656fe47266b0eb88e7662971dc736f.npy +03001627-7ff2f20512e7ce8e572f8e1c1caad99e.npy +02876657-7746997b8cfd8d11f4718731863dd64d.npy +03001627-efd07df34c1f73cae2367b9e27f16a71.npy +04530566-a40a870c5abd8c83d84b8ba651dfb8ac.npy +02958343-abcabe3968a64d4f16abce8cb03e7794.npy +04379243-a8c9827810c66962f8fd14d222168087.npy +04468005-564df1a62306be1552af501dc2728308.npy +03001627-e20a22906784e3d08758c89c2f45caa8.npy +03001627-6df97f6b123be35b71a782a4379556c7.npy +04379243-6a53e24442be0a9598f91bb06151de8f.npy +04090263-7e225da92fcfb868eac137faa8adc92a.npy +04530566-325d1e9be246e1644d44f5db04bf14b8.npy +04256520-5fd7cd5ee43e0cf0eaf288f952624966.npy +04379243-e2e3f057399a2b41276b6f6d90ee3a83.npy +04256520-328873bf304530b01b17743c18fb63dc.npy +02691156-10db820f0e20396a492c7ca609cb0182.npy +04256520-b06afb4d11ee4eb9ce4f274577283b16.npy +04468005-2197384551252127ecb01d351e78a9e7.npy +02958343-a3e8a28918af7b07e3857ce739e6606f.npy +02958343-993bd3b6fe7c6e32cbb047938846b5c7.npy +03593526-472eba74eb73dcb9c5beea20858a99d5.npy +02958343-f1bcdbe16690a985ca92a4cdad802b45.npy +03593526-30b7bc199de66fc57eaeab1f0c9120b7.npy +03513137-eeaf3811af59e557cdc59d2b768bcb80.npy +03636649-ae50216235a96cffcb8d8c6d4df8143.npy +03636649-7daa2c16580e9f8ee055d2b52a9e17d8.npy +04530566-d10cd8bfe5eb85572aec0b439528eb79.npy +04379243-126b0452fa8b16bbf7ba6397f9858441.npy +03001627-c1c0b3d35cdef5e2f51fa0238791f5dc.npy +02808440-98a94630dd0be49444221bef0fa3c36b.npy +04379243-50336797d9a86e9625d9442054ff1a51.npy +03691459-c398c35b48c31188c73a379f25dda815.npy +02958343-813bedf2a45f5681ca92a4cdad802b45.npy +02992529-7af2a3d126ac5e44fdda95e9849ffbd2.npy +02933112-cd781f0ec08ba028af232a5661e85835.npy +04530566-ec51dbe499e88615a267c8b6fcca89d9.npy +02876657-8458e5a34c67958130f549f12038e49a.npy +02808440-a7d1d15be88c5cc133d742e03c58860e.npy +02958343-810476f203a99d3586b58a9b1f5938e0.npy +02691156-e4665d76bf8fc441536d5be52cb9d26a.npy +02871439-e9850d3c5243cc60f62af8489541547b.npy +02958343-de3280a89c7ccbcf946f6dc2df6150bc.npy +04379243-87935bfb0ff57aa4668ae11a7db5e82a.npy +02691156-960d086565fd36def0a9e4c23bc75c0.npy +02691156-8b3bccc84ac7d534d56132409b00c58b.npy +04379243-28f3844a7a3d37399c0ca344f487323e.npy +03790512-80011e85cd42668ad373c34785838ee4.npy +03593526-f17c8c7d510658a02f2318fdd66be40a.npy +04530566-24f5011d64dff5cf1c0f52f4ec8b820b.npy +03001627-7f2854516404a3a7de03ab2a27ba7531.npy +04090263-79ec181e02cfc63af4de29b99f103946.npy +04379243-5239e7c9a83e99762b6168eeac2194de.npy +03001627-51ec0bdeb8bd9b8d60eb699207aa149d.npy +03797390-141f1db25095b16dcfb3760e4293e310.npy +02691156-6044301c7b4c63ec90b1d6deb98feec6.npy +03046257-716802270b2a331ed5330d8b61efb724.npy +02958343-b05d651c17e9e626ca92a4cdad802b45.npy +04379243-679d57762f6ae711b282e6ae268fb5a7.npy +02828884-6953a491a4c74d42d5cec9a69bf229a3.npy +04554684-8797bf2bcd0c914dd6b976d6c56a2c0c.npy +03211117-4f11144acd79460b120322eac6386b.npy +03001627-a374da8227eca67b89014675a548cbb.npy +04379243-8f4c9f7f38e15d03593ebeeedbff73b.npy +04256520-eaeaa6879cb8f5193a9b2e04441ce376.npy +03211117-a0f10ade51e1adcd8b8d299c28ab08aa.npy +03691459-e1d8c419be35ee1e209a4a663fdfe000.npy +03001627-bd6a5c01b9c6f17a82db9fca4b68095.npy +03001627-1c2cad4df1697103a5139737ddc33fc8.npy +02691156-8b4309aac2f7f6b3b97c9314bd4647d5.npy +02828884-643cac07025f195750f9fc0e2c94dd76.npy +02691156-a0a7e673a1e1bca78699933784576e73.npy +04256520-3fc4cf00b8db1f03b086b372af6b049e.npy +02958343-2acbb7959e6388236d068062d5d5809b.npy +03691459-2240cfeefea8b69fb90623b288d5691f.npy +04379243-f7ced3de6f4c1ffb4e3935c6cee4b35.npy +03636649-c11e3e763402346f22c3a2386a9dfbe9.npy +03001627-bdd51e6d7ff84be7492d9da2668ec34c.npy +03642806-93958423b98be8b538ff1b6d120c56aa.npy +02773838-506a05b6ba66bde0b726426d6c667c7.npy +02958343-7dda382210dd768680e74058ee862f05.npy +02954340-40f0c6599f0be25fce01c07526cf2aa4.npy +03948459-4dcc11b6acc758b1429a1687ed6390ec.npy +04530566-620f33e5f326e3c642f9e27aaf0c47a.npy +02828884-c29ae4355b73ad302be4222736443739.npy +02828884-2d1ea225c279836cd67b3c7873295e75.npy +03636649-c9b4209f1a7e97cb90a9ce3e4b15521e.npy +04379243-a26046fbf2d7368cd6e1954365b10b52.npy +03593526-a217a3505ef6b67de6597d391ab6fcc1.npy +02871439-711126944f5bb83e1933ffef19678834.npy +04379243-5dd9ef055fe3582687ccf9baec60b534.npy +02958343-e5a3ffca76415acc33529abacbef3013.npy +04090263-5f0cb03ebd45ee7d735fa1ab17311ec.npy +03211117-5145c2175f9db9d3f0478431b5ad57db.npy +02691156-647576c71cff90b4ca8607f540cc62ba.npy +03211117-3ad5eaabf85f4b5cc4d320644a1ff105.npy +03467517-bdb021331b396851c09b3b7b0c2153f8.npy +03513137-ee4046b8154cf9fd5964bcdfbf477f81.npy +02828884-56a818c4e5891f1d39316df04169d12f.npy +04401088-e679783f54c36220b99a2cc4ddf0d3f9.npy +02691156-71222607731812fa5e9e2656aff7dd5b.npy +03001627-680eec559a71dcdba023804ba421cf6b.npy +03001627-77e7660d71c6f3befebad4f49b26ec52.npy +02880940-6816c12cc00a961758463a756b0921b5.npy +03001627-4b95e968966fafc6e0675251723e1e08.npy +02871439-9664d50fc1a03534d42b9650f19dd425.npy +03691459-88ae9338c167e8d5238ad1274d829e68.npy +02691156-d068bfa97f8407e423fc69eefd95e6d3.npy +02933112-1c898677c5b4291c847857e42f50ec6e.npy +03001627-31a77c04ac5df53e9429176ba100075f.npy +02691156-9efbd65b09daf8358b96ae1a0a8b84ec.npy +04379243-564b7a755e3003da64fad3c7b88e6060.npy +03001627-88842eadd96e5cab570b6bda9783c8ba.npy +04090263-d1508875426ee5f3d87c63d8b3018b58.npy +02933112-464e34455b49aa5c824080f516909671.npy +02773838-f872a64810c123a47abde6405e4d8323.npy +04379243-8a505843a90a7486dc2bb3ee5ca7ba76.npy +03001627-1ee30d218c8c730ecb01bc908e8cea6.npy +03325088-b8d46728c6f3b0bf76d20e73c57c9a03.npy +03001627-ef9f4de6ad345818b25f0e6fce03dcef.npy +02691156-2599e47b04ea7a32d872dc56d048665c.npy +03046257-990f4d12875bbd61b76982957f05710f.npy +02933112-85502157d9e253d411fc2b865c2a185b.npy +03691459-e854747b2165ffd6f8b75fa4030d2e21.npy +04530566-d55ce64040e0b3e4ecc9205d69d88837.npy +03325088-5aeed0c9db054c395f12a496ed94ff1d.npy +04379243-fe2e9385283b62922de0bc4fc4d02dd6.npy +02958343-3587079f3146273faf8b8a34d449f60b.npy +04530566-b044558b01dfb98d3d8de7c49284d3.npy +04090263-a4d4e316f6511990309d43c07397e2bf.npy +02828884-3a271805da4a65e06a5d67b8fcb702fa.npy +03761084-4df99b98a1f4967ddf3a1b0d597ce76e.npy +04379243-10f1b51f2207766ff11c3739edd52fa3.npy +02924116-207c332fea56649952470de2774d6099.npy +04256520-ef99fe2058dbf199a2ebd6ecc07363e1.npy +04379243-25640329444772c6c2e20ec62321c272.npy +02924116-9d212c62dd02d40a1255ac7e5ca8c148.npy +02924116-22a6553c141476e06824264d26b3f6a9.npy +02958343-1c5a350ea0f55f793fbce9ec40e1f047.npy +03636649-b7b4361b0042126ac7d17f1ea7477fc2.npy +03001627-f6096649f87c37f1af7c7ad2549a1b15.npy +04074963-8f14d5b24d2b798b16a077c4c0fc1181.npy +02992529-c978be9ff9bfb9c67d2c763bf3599a8.npy +04090263-e54b7a716399aa646a29c14eca4d216a.npy +02958343-921f87f3d9a4cb8ddb37d391409760c4.npy +02871439-a62b569b9b55a34d14067ffcfc2ba435.npy +03001627-675aaa5b883e2398d7f7a4c4609b0913.npy +02691156-dcded0031a71305c52d6957c59c3d213.npy +02958343-84e4dd1c6306a582a97e62e669e9544d.npy +02871439-b3d9b068be7786d52eedfae7df5d8c3c.npy +03467517-7b99c00792408061e9d9b43230155bd9.npy +04379243-1c1c9e7676dd618e6652506d959dc71d.npy +03001627-8f13ac6499dfcc83f381af8194aa4242.npy +04256520-7a3dd8889b18cc80f51f77a6d7299806.npy +03001627-f1d6552ca66b2e37713decb1a0563b12.npy +03325088-8b12d095112cbf23ac9cfb689e5db0da.npy +04379243-e603a4f0bc12522558df8eeaf3dad1c.npy +03991062-229cc8886a1f18fb9173fae9a2149528.npy +04090263-52a90db915a53200f0478431b5ad57db.npy +03001627-87c742a186ef731b464bb3035358ab7a.npy +04530566-6c2fffad4d28822c1d57de40f2cd04f6.npy +02828884-76d029e29ac2bb69ad5067eac75a07f7.npy +04460130-1b781ad3315b36510f233dcbf8432d5.npy +02747177-5092afb4be0a2f89950ab3eaa7fe7772.npy +04379243-2e0a396cc21ed4e3781e3b226aea8d4.npy +03211117-e51c13070dcd4ce25432e3a73fd1f7a9.npy +02828884-25d1aa23abd04998d4d8765e3910f617.npy +03001627-85f56a4d68ff8d75c3bd24f986301745.npy +03211117-e17da83890fca0b8290273bda7ed0d31.npy +03636649-926d66e2adb79d5b79cb09497d80655.npy +03001627-e4c866b5dd958cd0803d0f5bac2abe4c.npy +02828884-47c991f72eaa53c6a8737fcf23389014.npy +04379243-8db8568a21645abb2964e7c9f80f3597.npy +03624134-65c05c88c441009f5d0dded52efeb4fd.npy +02691156-916950e40ca7aabc8b96ae1a0a8b84ec.npy +03046257-1f9ebcee16d5164b62e575249843c117.npy +04090263-2348490cb8fae973b6792578a0d9ae89.npy +03001627-735b16d075ad6ce3d197f67767b32741.npy +02958343-ff64fc33b5d8f866d4ad6f63f570d711.npy +04379243-dc9a7d116351f2cca16af3198c99de08.npy +03691459-22654d0b3683df91650c44f51c50faee.npy +02871439-340df58fd886d4e504af6e1321617aa.npy +04256520-bfc6b2328c9c12bf283b00891f680579.npy +03642806-8faaabdbdf4764b3531a9cd007e29075.npy +04090263-272e1f3a719f2e35e2bb19fbad3e4596.npy +03928116-fbac1681358a4289dcf02ff10643ca8b.npy +04379243-537a02eff282b33df58bc14da5676759.npy +04379243-e6cd3e7a25cfb1c3593ebeeedbff73b.npy +02808440-a1c617c1cdc5553b3af30a3946d92feb.npy +03691459-a6216e99923da6988947789ccf4faf06.npy +04401088-5ff8806e12ef72e0650185da4813c6fe.npy +02828884-d8dbfb0f58a2df0bf1eac5a8cd36b62b.npy +02691156-cd846470dd7a135d29ca62020db7d733.npy +04256520-a39749334717e07098f49a8972f75c6a.npy +03467517-5c805aca7aa8bdd3ac61a2f8346a8f.npy +03636649-19654d8fe7090a887eaeab1f0c9120b7.npy +03001627-5563067c7c05518415aea01a869de65.npy +04530566-b032f7baa738f10ef1ec74085c31730d.npy +03001627-1e2ddaef401676915a7934ad3293bab5.npy +03001627-695a02a5620aae6e78eec18a8a3356a2.npy +03001627-497f67c006770b9f94e98ee4fdfd7464.npy +03211117-f82557870d71f3a11f9b5b6530d6e16.npy +04090263-50fa60269066614e70a30ad089da2cd9.npy +04379243-b3eb7f278d595307d2b12aa6a0f050b3.npy +04379243-11aee78983b57cb34138477d68528833.npy +03001627-99a16c86225e538d9e72cd13d3c26c66.npy +03691459-6ff24c5a5003a1a5bf12d1e914fa62b.npy +04256520-3b34c3ac871a2d40593ebeeedbff73b.npy +04256520-2d1dbcb6802bf2017879e882bea3b8aa.npy +04379243-6d78f55d24f1c4e714038d588fd1342f.npy +02992529-a434289b281e629b81139543c959a70a.npy +02933112-bb0255c8582c74c6557f50690310ce8d.npy +02958343-4489a777dd90ebcce28605e174815eef.npy +02933112-90ccd5fbb48ba3bdde650492e45fb14f.npy +03467517-176ceacdbc44bc3569da8e7f9a803d12.npy +03046257-6cd9f0f548979d5160ddc468fe733ed1.npy +04256520-3f8f1d7023ae4a1c73ffdca541f4749c.npy +04256520-b5655dbb1a19b94c14038d588fd1342f.npy +04379243-e02fbeb78d8936fb586ef560a3203b3.npy +03624134-df0a8c7d1629313915538488147db324.npy +02808440-aea6cef49fd3a6ab3af30a3946d92feb.npy +03001627-995ecc9f34e0dc3bfa2cf126b85e1994.npy +04379243-7f39803c32028449e76bc197b3a3ffc0.npy +03691459-3b3f46308f2ad119988b934ce1e16bb7.npy +02958343-5768ae99da7499feadca4990256df2c6.npy +04256520-90b3ec9b7f122e3ae677774c24ef850.npy +04379243-1d90363feb72fada9cdecade71f5dca2.npy +04379243-d673e7a605249edf7c1af3afc3f87aef.npy +03001627-4171071eb30dcb412dd4967de4160123.npy +04379243-577155d24ebec9833ce2d31ef93d6e81.npy +03001627-98547d9147a58195f51f77a6d7299806.npy +04256520-a98956209f6723a2dedecd2df7bf25e3.npy +02828884-272162e616a4e8e9ad5067eac75a07f7.npy +03046257-147df4e2a9af41fbf51f77a6d7299806.npy +03928116-6e549d6229e1cfff1420b81fa6c7ce78.npy +03001627-41e5e9ecb83b9a45504d5af97121b5f.npy +02924116-df89f05643f34c645cd2bb143228195.npy +04379243-38e90183c838f443b43753a53e4593db.npy +02958343-1cde62b063e14777c9152a706245d48.npy +02924116-3d2aeaffcbc6f0bc41cefd10ce5d6cc0.npy +03325088-38acce15053c16d3321831d2245cf06.npy +04090263-574e6f325fc821ad6314c3b6a3a65519.npy +04379243-a5634b2fbad2b88d5d14030c75181478.npy +02691156-18d55087d052ecc86b7bd17e458d0dcb.npy +04530566-9efd4dac9e4b1698876eb99526752ffb.npy +03467517-ba7ef4973b9c4f995eec6d8d24f1fde1.npy +02880940-ea473a79fd2c98e5789eafad9d8a9394.npy +04256520-ea9a266329617a165298386582afecd3.npy +02958343-d0cd9b6ca511c6b9920355ae987b66f1.npy +04379243-6c95f72153478de8b162cef80a91798d.npy +04379243-d0008b042256fb5f7ab911835312d4f1.npy +02958343-b40c9e44350f95aa1b9234e4ab67a3eb.npy +04379243-d5a78c5e48ade3e38fe22a5ce827e9fa.npy +02691156-cf96229978efbb488b96ae1a0a8b84ec.npy +03001627-18fe5de83a17c6b5876b399a99a15c0f.npy +04379243-e58c53d29aaee1fc8101accd22c701b9.npy +03624134-e6e452eb238659f61ce93adae4bc9483.npy +03624134-4bbde8accc3bbfb87f277d7152b6b3ed.npy +02691156-322e8dccadea03d3340b9c9d10273ac.npy +03001627-e62b187f6741283bd8f27b2e727c3511.npy +03691459-f289aadb7cdf59daa62fb160d742c45.npy +04530566-fdf4b58a27a3ac8ead83f267e8f0b536.npy +03691459-73fa71b650b99bc951d3c864cc68e22e.npy +02933112-5a2de91981d27ba3c59350d819542ec7.npy +02818832-3d14f0782e488c8bc19762eaa7ba40f.npy +03211117-9a24880343d943f7ec059109909662d2.npy +04379243-ab16eb9d6122a5fb41cf86c757faf4f9.npy +02691156-61bd590e917928f6b6ecbbb2e4d05900.npy +02933112-1a7b9b946e797ce59f8c3d2002c77ddb.npy +02924116-737aee2e780049ef887524da02be2633.npy +03001627-59fa70f195fd4ac6ae8c9d3b8c4b9bc3.npy +02691156-d80486b768083cd6ba0d990ae229b477.npy +02958343-ffbb51fcc3955d01b67c620b30c63392.npy +04090263-d5e99caa1d8e7c859133e432dd7411d.npy +02828884-8e25c33aafaade0ad5067eac75a07f7.npy +02958343-557413032afecbd4c627f7f719e1032.npy +02958343-52c589e86fd500cd4a42886683bb52d2.npy +04256520-306679647d906c39bbc7a6acbd8f058b.npy +03691459-533582fec17b538e60e1d7e27755edc1.npy +02958343-1f92e07294960629a39ce7aafdab8210.npy +03636649-aab336a18bb4e51fcd4910413c446d9.npy +03001627-9231ef07326eae09b04cb542e2c50eb4.npy +04468005-f34dbc7687edf0902be6b91d40e230f6.npy +04330267-355f5eea3905262d54665a4e9c906cd4.npy +03325088-ad63886b1f38bb16b7a867e9b35a1295.npy +03636649-fad026744a6abb1937cf479d4bb58d.npy +03691459-5bfeafef1be5f4f5bb476b1cb791329b.npy +03001627-b33a3b1627ad61eb8ca4809dcf42fe1.npy +04379243-4b57450a988be6c1f51f77a6d7299806.npy +03001627-1eb5613aa22df87b8ef9327f5d5c024d.npy +03001627-608b46b0f8f9eba81b1a986f753a489b.npy +02924116-a2178368fff2a71824e6f48def711dfa.npy +02871439-2efb3ad49fa103b1cc786970133d7717.npy +04379243-9d18858529b76154aa7cb30470f3273c.npy +02958343-3335fb305afa0494d3c820a40c219fa9.npy +04090263-278f6f0588771123f8edafa0d47e47db.npy +02691156-1530400ceabc1d7145ec485f7da1d9e3.npy +04379243-758f982c1aa6f5edd6eefa796d2f261c.npy +03001627-985b7e5b5fe997f0670cf6c75c1c5868.npy +04256520-2a98f28036915f805510d59f3ab1ed64.npy +03691459-f7a45911d01fe4a961775b840d882da9.npy +02924116-8e0e80eee17c86415a9da89784be865.npy +02828884-1e4c1fc02be62675f90c2728303e546a.npy +03467517-8ebc3d48afeceec752561cc0fb924c36.npy +02818832-b6ac23d327248d72627bb9f102840372.npy +04379243-39cf5ae2b497715a84253b2030fab070.npy +04256520-1f28f2ccce4940f2c6fe57159221338c.npy +04379243-ec5469035d19434f9ba80f08c401fbed.npy +04530566-92be906c57e20430fd87075a257732c6.npy +02818832-643621e32b3177d3f0fb3e3d2a0d34c9.npy +03467517-68a8bf89972cd337a77e8142614cdaae.npy +04530566-3038a5f927db994e6702681953f194c0.npy +02691156-af3863d4ce7dd92ac6f6da58b133bae0.npy +03001627-572cbd8b4cbdf7f1f91663a74ccd2338.npy +02691156-2495267afeb60584c3a35cee92bb95b.npy +04530566-7aaa404bd120be52816427daa1887efe.npy +02958343-92f697d036addb55ed576c2966428f.npy +03001627-997b0aaad2301a44b31fb46b2e6304f4.npy +03691459-9d180f7f43dff3d51ec48bc3c478566d.npy +04379243-41d280b7db61ebddfebad4f49b26ec52.npy +04256520-47362cb47416904b76e38b52d9aafc11.npy +04379243-f195ff52401da593344db0d9ed96427e.npy +04401088-e513675ffb2da709a060e584e7409aab.npy +04379243-7a5acf5f20f8cffbaf030eae870a2d14.npy +04379243-1bd138c3e54a75d32f38c0d2792fb5e.npy +02691156-f6a09cbb6d08feeec9d7d324d11034c9.npy +03046257-2d3306996a223a992c4f629232dbdb8.npy +03001627-95f8a62c031dbb8ff0f455e219813ed7.npy +04379243-9269d120ecefe48da2aa7d89ba9aea43.npy +03001627-662f95ed8d41a24bf63bf7d908efc575.npy +04379243-f48a955a73fa0fe79aad7644557603ac.npy +04090263-39c4214ab44383258a3dbbf31a87b8b0.npy +03001627-aa88b0f05470452f7ea323bc74055b8.npy +04379243-f4976e80b8533bcf85518f8659f21d56.npy +03761084-eccfbd9111c640789e11c084f781b48.npy +03636649-989a70bcea69bb4372a02c2db7bf58cd.npy +04379243-6c4c1465fe472cfd93ed8929b636c206.npy +02691156-dd65065e6e2d31d62e350437b1fc5163.npy +03046257-91d9bce8460a5cd010fe662c4b4066df.npy +03001627-43f762270b438fe618a36258eabc2b9c.npy +04379243-7f6ddb13d3b8c07c1c19e7863a1c200b.npy +04256520-622552cb1f5670a614038d588fd1342f.npy +03001627-72a40501ded8a8dd2c2f29cee8379a34.npy +03001627-507de496a9a77945e40b5e9eb4befc2.npy +04379243-4a27cb9384782ce33e95c55cb020b7e6.npy +02992529-73b0bcdcf57a8a7fe8d8ad3bdef6aca2.npy +02801938-a838d7fcfff9732fed315c548018de56.npy +02818832-6256db826fbb31add7e7281b421bca5.npy +02818832-ed4ac116e03ebb8d663191fd557d3a61.npy +03624134-208610aa6d607c90e3f7a74e12a274ef.npy +02992529-6907dd835a22c32f46895db2a69f45e2.npy +04379243-589f5927d37247564fad3c7b88e6060.npy +03636649-b668df78adedbd1735ea0e092a805a.npy +04256520-3d87710d90c8627dd2afe8d5254a0d04.npy +04379243-b0c37b379725feec97ed2c3bf3711e68.npy +02958343-2c3a5d170774da5ae4a44d0583e1bb01.npy +03001627-8098750b6089a9d8ad3a7d07aac2767.npy +03001627-dec5920f32fa546a6c518c577d808035.npy +03046257-cebb0e2be3b2cc1b474465268b958bdc.npy +04256520-2ebb84f64f8f0f565db77ed1f5c8b93.npy +03691459-73a337691b4015ff1ef58b31c4ba0d15.npy +04004475-d0ee507ba98a89525df8d70b74fdbdb5.npy +02691156-5e44d38e88458ab1e1873a3963e0d14.npy +02818832-10c15151ebe3d237240ea0cdca7b391a.npy +04256520-54ee1ef79b340108e5b4d50aea96bfd9.npy +02933112-2cb76d6aaac3c677bb60e56ad1645b95.npy +04379243-35dc5a90392dbc1563f26b71f9dca732.npy +02691156-b65ddb8f80d8fb562e38f6d9568202c7.npy +04379243-a1379276f75d137ac5ddf9f6c8e4b3a9.npy +02871439-4cf8fd9b396d0d24868bb660c8b7e409.npy +02691156-892ae1180c58b3e671d03b466c72ce41.npy +03001627-54f276860d9b00436370a012706ac174.npy +04530566-4a0cbef5bbb19d840b6c13818321d0e.npy +04330267-f5543e4b09f4a49a2846c469aaca3af9.npy +02691156-fbebcde2d8fbf81ee7cf320ab5761d45.npy +04256520-aa7dbd4acb4878c9620f1933fa113025.npy +02958343-38b2bb3bf698f38ac2920de4c5efc2ee.npy +02958343-9c7cbe5b36b7ae9216abce8cb03e7794.npy +04330267-c647966562bd62f45eb64c1003065596.npy +04256520-9ceb81a09813d5f3d2565bc39479705a.npy +03642806-7e5b970c83dd97b7823eead1c8e7b3b4.npy +04256520-13d3462293023fe71f530727405d60cf.npy +02691156-f7f915160c0e1f6f42bc0eea174f82b.npy +03001627-2936cfb442eeb0a32a673c8b84dfc32.npy +02691156-aff764398f14383eb87697d3904b168b.npy +02828884-c2516123957e1cc42283e6cce5561adc.npy +02691156-8463c1f30bcd9151b92527b70e93ee2c.npy +04256520-d8fa31c19a952efb293968bf1f72ae90.npy +03211117-981d4ebcfcd3c733701bcc8e95172446.npy +02828884-d406968659ec5ab87d55717abcc7106d.npy +03948459-9e1835a6671c1163fef144202cb2b935.npy +03001627-7fe836b46890d24a65ba78ad9601cf1b.npy +04256520-359b6d3d29b08dfe19fb4103277a6b93.npy +04330267-38978d1d3a97e57ffc6e457221b9271.npy +02924116-2cb165856db926fd851591e44f18a8a5.npy +02818832-31e0375f0776e4949c9245e96a55cc5.npy +04530566-ca129502c7b2b8186d54dce3f3e9f18b.npy +03001627-4848f84b015f1360e8058cf23f6382c1.npy +03467517-b9c10bf6fc2095f93f0194265a9746c.npy +04099429-59389aac7b1ea9b09b28f5f9cf8893b5.npy +04379243-7f1749643345953cf51f77a6d7299806.npy +04530566-728fa87ee84c5c2d2fc7e4ac493eaaf8.npy +04090263-9cc7d4e39b1fb17993d988207a39086f.npy +03636649-da8141b45da808199a06a7de97b096dc.npy +04530566-ad2c82cd40584b43fc4c78b4701b2fab.npy +03001627-d3562f992aa405b214b1fd95dbca05.npy +03636649-5fba90e6e30b503461bfbba8a5defb02.npy +03636649-2691d3491111def44674c364bb213983.npy +02958343-128ad72f92a3e96db96212c8f6cd06e.npy +02818832-48973f489d06e8139f9d5a5f7267a470.npy +03636649-845542d0f578a9db1ec48bc3c478566d.npy +03085013-a86e4fb88103550d4dc96c27c8aa82ed.npy +03211117-dddc8d8cdd6361e49c9fa9de1518212.npy +03001627-11040f463a3895019fb4103277a6b93.npy +02933112-bbdaeb32d4229d70c59350d819542ec7.npy +02773838-1b9ef45fefefa35ed13f430b2941481.npy +02828884-8553cd048bbdbc15ad5067eac75a07f7.npy +03001627-e4ce4c2a3709855450064625270cfef.npy +04256520-81a032241031c2e5f97ef3b999ddb957.npy +03991062-92a918828b34ab9372652f4081ec5a77.npy +02933112-9deca642cbf3e4ef49a734174fea032e.npy +04468005-75056755fb8f1fc92217baa3b8e01690.npy +03001627-71a52b54d732450bdd766137cdd5195c.npy +04256520-e93e9beb358d9fb8c397356311cbeea4.npy +02933112-4dbf616f15f8818ba3f600c356573d21.npy +04256520-c983108db7fcfa3619fb4103277a6b93.npy +02958343-f5a54f0cf2b575fa9fe1734a6086750.npy +04379243-1ffcbc064f473b7de7c13848b2d8f5ec.npy +02818832-42e4e91343b44d77c3bd24f986301745.npy +04256520-7c299b1e1374a538e78a749ef6aadd72.npy +02801938-52d197b32476156334b599aa7a6234d3.npy +02880940-d28f7a7a8fbc5fc925b5a13384fa548b.npy +04379243-f7bdfe5af3b26d1b5f06dd739e88c77f.npy +04379243-c9a3ea912a35c3e1601bea3dca268229.npy +02933112-ea48a2a501942eedde650492e45fb14f.npy +03636649-6ea3addd99f0106b77981b941eb4f5d1.npy +02691156-5f9d38e5e7fef49f7a571401e6605fc2.npy +04530566-5e6e9a61eb078041556f795d265590.npy +02924116-803848450b34284f41cefd10ce5d6cc0.npy +02808440-621f1f65eca6fe7fd7c9d85d3b7335dc.npy +04256520-5895b40b8c4d103ac60ea5009df4047d.npy +02992529-39e571ec1bcd371bb785a4ac4a0dbd73.npy +04379243-df74203c0a1585f9a29294366c3334b2.npy +02828884-38441b4582f29c8cb2a965e75be701c.npy +03691459-5e6d30de53afebe2fb0a4dd466ef3d66.npy +03636649-96e1ba69697ade7682db9fca4b68095.npy +03001627-c94f7f5ec96e10994231039830c7e1d1.npy +04256520-d7b69d5015110b1e2c5b2f528cea9dd6.npy +03991062-bad0dd72e36add64a2c59a4d90e63212.npy +04379243-65bb2d37c52ce089e76bc197b3a3ffc0.npy +04379243-83464126ed62ef54707cdefe012d0353.npy +03001627-32fcd056e1c474b84f5cfb5dea01f97e.npy +02924116-8357b3db7aab85a3e6f75728b7e2cf7d.npy +04256520-c9e41b8e7827cd963dbb061ded33aea.npy +04530566-3c785a132fbf152249d508bbe117085.npy +03636649-7d4d715c4812e42cc0f8577a553db1b0.npy +03636649-4843b9c8523a4affc29d936f5ac7e23.npy +04330267-fb05baf6da5b0856875c4d98e634f167.npy +02958343-16bd0438de54fc91b1bb46d2556ba67d.npy +03001627-6acb045fe11f7a81f771b7c5ceefa9be.npy +02992529-fa14355e4b5455d870f7cd075189ddd8.npy +04379243-3aa65a29330bb87f980f165bc2b4c765.npy +03001627-7726993e4b88223fedc32c5c9ec9f827.npy +03467517-a38684b166ce2c77c155f88004a92bc8.npy +02691156-45c4867cd4554e7cc863ab010b80d9ed.npy +02924116-da99c75df648834a34f4804e95b55ebc.npy +04004475-51da7fc000ddc4ab129e8b646eb2bfca.npy +04074963-55858ff5b407677f35a527bc320873ed.npy +03761084-4c9a1496692048922ec64b86eca750d.npy +02828884-456e373768179bf3f155d75bbf62b80.npy +02818832-a13de93c557a327c36d8dd30a594b2af.npy +02691156-16079ddc92f4c9efd677715e63c14038.npy +02924116-2f0663bd37ca4e0db1d8796911acd773.npy +04530566-508e6fc3b47590556be64995e9ed73eb.npy +02958343-d9049f432296ed36afe1d4530f4c6e24.npy +02933112-d6a55d2dece36ca0e3f7a74e12a274ef.npy +02691156-6d93492543d1087eb87697d3904b168b.npy +03636649-bda58405e4e3319d809772d66d13ee02.npy +03001627-5e4552935979a7a1c25c8c68d88e274e.npy +04256520-af28dbdce6ed8cea19fb4103277a6b93.npy +04090263-b6f2b71e726f5dabab97b3fa5a6b9e6e.npy +04379243-838b05234e648ae5db4c5469c0c1ba80.npy +04379243-7e27606e126c023d5dd94d7a8cf82d08.npy +03001627-d7b22da1174eade770bc652a18e29c3d.npy +02808440-783c3fc429a969b6dbb76013b759885f.npy +03001627-6a878ab386c927e6d1a63a2e2039ff73.npy +03759954-cbc023955a18d8167964ba700cd97f5.npy +02958343-7022a37dd7fc841ce98e65cfc071e8a0.npy +04468005-ade5ec555dc1f0df5706d1c54190f27a.npy +03797390-633379db14d4d2b287dd60af81c93a3c.npy +04256520-70e3bf6b0eb99dd6cdcf4980e386b48d.npy +04530566-dfd7315b7f8a07ca67585a906cb87a62.npy +04379243-4ef4f289b6c23719588e951dcb8abdba.npy +02808440-f0e4c180558694ff904951ea0800d3f0.npy +03001627-b9c0dcc854da8c7d60558e0a9a66f173.npy +04379243-ae5631ecb6ed463f5ad83814029a1a10.npy +04090263-5ce262d2d63b4c56357baa13baa16351.npy +02691156-ed4aab2d41d62b49895ae53d16ed9e39.npy +03642806-81ba52b908e4e1bc8ca8637757ac3f67.npy +02691156-ea6ccb2dfb61484caaa29616be3e223b.npy +04530566-d3eaeb69557892657828ce3c6ecfce8b.npy +03636649-5926d3296767ab28543df75232f6ff2b.npy +04090263-c91b4aa1105a0e506a34aa94ca8a3355.npy +03636649-92d7ce3f06a44aa582db9fca4b68095.npy +04554684-fcc0bdba1a95be2546cde67a6a1ea328.npy +04379243-ed30f840756baab042678d21fbad4632.npy +02992529-3dac1f92b3e13977d19f91734fdc72ea.npy +02933112-b06b351b939e279bc5ff6d1af2135fc9.npy +04379243-f5af26e3cc266932ea88b65c86e82a10.npy +04379243-8d247c6f6aaf805a2530bfb25087f2b0.npy +03691459-46bd2ce6ca3439c9c2687184da14e3dc.npy +04379243-649bcbf07f29fcae355d9ff291618ea6.npy +02942699-77096e9094680faf603e5a6a09a35395.npy +02691156-7f2d03635180db2137678474be485ca.npy +03691459-b9f853ae8b693ff91574d21c0c95092f.npy +04530566-1f5d3310cc5f9346f1d7b2f32e8fa69.npy +03001627-828d2c47bf56b15c49560f24b21df85.npy +02691156-b30bd72e684744c521b1ceea9c93aa79.npy +02808440-9269512d34ab85213321831d2245cf06.npy +03001627-8b005a01cf4ae50dab49dceef0d15b99.npy +03001627-e00291d775c572f5e8f8c11a24c52ebb.npy +03001627-3bb8e6e640c32a7c36b0f2a1430e993a.npy +04256520-642aba784c86bb67fff16555386d173d.npy +04379243-f70b502758db5927be2f6e4bb98bc38c.npy +04379243-72f46e20632f469c9cf718a4c796aece.npy +03991062-35bfcbb0af43d0d6980b4a4e82abb4ae.npy +02992529-e6838870d0138aa43b995d74ae757c1f.npy +03761084-70f55c83dccea88043c8f1cd479ffb1e.npy +03001627-ff2dbafa8d66856419fb4103277a6b93.npy +02773838-22065bf26a7da50a5c4dc8ac281ba59d.npy +03467517-9992c9f68e5c3e004dfe0ed95d7290cf.npy +03624134-9dc11afe70cf097e497c98fff4316992.npy +03046257-772f1ed7779459e8d835a15bbfa33167.npy +04256520-6024afce9a12fd87318b348b36fba247.npy +04256520-d04a6f268f16bae7d472d3bb6a889c20.npy +04379243-71fc8c7cdb48978282fa4d4f2c19b2ce.npy +03001627-408b8f2a75350af98ce66f12ba927a2b.npy +03337140-13d5f9d6a7464e39f0f01f1432a517c3.npy +03001627-a7ae914aba9eb59d84498bc295cd5a4a.npy +02828884-b20a0209355ef6ddfe6460d8d9bd16c6.npy +02924116-ffcbf6cb730ea266296fe052063ec1ad.npy +03797390-1a1c0a8d4bad82169f0594e65f756cf5.npy +02808440-f327905a8577d9adb362845c6edb57fc.npy +03001627-3fde6688ea2022cde0f6ee1aa6b96429.npy +03938244-c665ecfac697faa1222129b9e83640a7.npy +04256520-fab5f1daa52608365768db72e79a5dd5.npy +02958343-b52486fac51d119110c18c6084937a7.npy +03761084-90ba871e45aa1d10b8bdb4201eaa026.npy +04379243-4180532fda31d19b37251258858a7a58.npy +02691156-642e481ed56874eb19ba010ddb4974fe.npy +03624134-32d009edb5d9474c4e79e5d262243b08.npy +02828884-b859f6e61529db7b195c5c738f050b29.npy +04330267-8295e45a734c059d1f3d773b4af1f0c9.npy +03001627-2b82a928c4a81fe1df4cfe396cee719e.npy +02691156-35892510dcd7cebb87bf26680c510802.npy +03001627-faeb171add09f98cc8687ff9b0b4e4ac.npy +04379243-3b2855b73aac8d04d6686dc2df08cca5.npy +02808440-cc060d05ecc6b760cb6267f1b348aaaa.npy +02958343-efd87861810e35ca921cb81cb1632a5e.npy +04379243-11a1bb35960f02d83dc1643807625350.npy +02818832-6e5f10f2574f8a285d64ca7820a9c2ca.npy +04379243-4b455e9b8dc1380dbd508cb7996d6164.npy +04379243-7822d47b9ce66e5591a1a434bc319a99.npy +04090263-326eb76ab05669c55e9786b1603f45c8.npy +03691459-e76108274392bff53d91ae2b92426394.npy +03593526-31b0a01063a976104725f67267e31c89.npy +04379243-10e7056ac077a0f54a111702084d37d7.npy +02828884-2a050ecb95f2a056593ebeeedbff73b.npy +03636649-a3c4ce97b725fc2c5f57ce7e4ba40e2c.npy +03624134-65892e0f7f93129d14cb807a24b99e1e.npy +03001627-5edfec789343e0c3319f1c1eee46f332.npy +03046257-2022b303e954ad7ed603cac03886a314.npy +03211117-e7a14693e9c70577ac74d552b6a649aa.npy +04379243-a84f09300e4b1c1ac624b11e153a6d87.npy +03691459-8310e1e0a80ae09967964ba700cd97f5.npy +03991062-ea662c8a7f99d7d1b27dc9f9b9dc6f03.npy +02808440-3f61daaf0f87563b4ed5b40788f6ba60.npy +02828884-16549eea10c75d0f65d3152da5208307.npy +02992529-72d3c4148500a7fe1bf02ad5664135fe.npy +03691459-c6c69578203357f3e3bf55e5ac6083ca.npy +03001627-facd3e432232c27f245ac1812a4e4d0c.npy +03991062-febef99e371fbc27584536aa725442da.npy +03001627-4aa9b5829edec8ac4671d97b0fd17f51.npy +02924116-61d3aefd8450ab0b41cefd10ce5d6cc0.npy +04379243-33dcc9e237783c3c955824885d6e7dc0.npy +04401088-27b4f430b881e16ad6339cac3214b6bf.npy +02946921-f390f6d6418135b69859d120d9976364.npy +03001627-45220c3f4fba09fc665309339296e85a.npy +04401088-f5eb39c7d2e7452ee7ef9fff09638f8e.npy +03325088-75379bfc4f264daec36fb70296e45483.npy +04090263-ac1ad4d7ac10f3e1db6f3ca49e992ad8.npy +02958343-4d22bfe3097f63236436916a86a90ed7.npy +04379243-fe25a9fdbf70cc25f81ed792b3a38b04.npy +02933112-d7c671ead816afdda2aa7d89ba9aea43.npy +02933112-cb506ccfb07faa60f51f77a6d7299806.npy +02992529-8b08eb5ebea05e49a3ed2b429444c197.npy +04379243-4df3ce9b02b4765b1a8db2c23945f1fa.npy +02958343-676e3e6067fc1b065552c4ac8607d25.npy +02828884-f8a1b4d4b7813afe55cb90b2d132a49c.npy +04554684-8dee44b4cd1f34ac856e3ad6b24f68b2.npy +02828884-5b4cc3097e79fd316c262ba0bee45d20.npy +02958343-45d4fae3d107296728e9ca8e8fb04e0a.npy +03691459-dc9c9ce6dc9a771f500158c23c4c5a8e.npy +04468005-837c94e7125781e9978a4784edc632cd.npy +02747177-e6ce8ae22ebd6183ad5067eac75a07f7.npy +04256520-f78b75284089cd6514038d588fd1342f.npy +03001627-c93a696c4b6f843122963ea1e168015d.npy +03001627-8a1a39223639f16e833c6c72c4b62a4d.npy +04379243-fbf9b1f026a86d59eb5bc459c7142a3.npy +04379243-702cebffa33a19f019f079d1b712f46f.npy +04401088-128bb46234d7250721844676433a0aca.npy +02871439-ecb9b808a97c3b009725f8348364f5a8.npy +04530566-1175df3d5cedc3365c00e52236fed2eb.npy +02876657-44e45054f9ef4e251881e4573fc7a947.npy +03001627-73b96acec1ea41d1ad484915511ccff6.npy +04401088-342ef21b1ed9615685feaf23dbe1f454.npy +03211117-41bfdff7b99c13703f7e27638e63d848.npy +04379243-67e6cd9381c22b9045c6cb69e0968783.npy +04379243-1a80520ab14439ef79b3e1be3524f72f.npy +02924116-2f9c60f6eb0a4ac1b4b1329ea0ab3ba4.npy +04379243-4b4b745af2c816c28ffa76d198ce7f6c.npy +04379243-32bbf7d09d3acd4c339797c21e8801b1.npy +03593526-e571895508fb587a561dce3fe08634b7.npy +02808440-896808e1daecd437d72076e39d62f17c.npy +02958343-8a2d335efbf40060481c5c74462bb8fa.npy +03001627-6ad7e3a8e6f3ed1dd068cfb43a81fc7.npy +02876657-b1e5b106e6e25c44a4530e3038c81e85.npy +04379243-289f7178bfabe667550a2025ec9eef3d.npy +04379243-54d17ad404678720d0a96520c31993ad.npy +02828884-2346b4f87a4f683b92e6829c9c63f7e8.npy +03001627-b0c70ce8427da34d98e0d1738edd4f19.npy +02958343-c6978e2a0ef9f0df866f1a483075a782.npy +02958343-4359a0878f823f5b96e24f86f1144c52.npy +04530566-209213f07114a06a2b249fd16295bbfb.npy +04256520-37e4e81fda1f2c923a2face9eb30ef55.npy +02924116-98092c327e82dfa834ac4f8ff2084698.npy +03325088-2f44351ce849a8056f893b5bc716a3fa.npy +04379243-53f5bd148ec293f92f44039661980ed.npy +02691156-fca4c82b2c488d329554e5818acd6e12.npy +04090263-ed5e68fcb3a7be0c886fe00dcdc18c8a.npy +04379243-8c89f56df87eab907e5207b5eb59c49c.npy +04379243-e5567a82c577e8af83ab2e8865eef185.npy +03001627-c7e590c0390e8d5debe67d9b32c3ddf8.npy +03211117-6a85470c071da91a73c24ae76518fe62.npy +04379243-b85174a2ea03f4189cd431573238602d.npy +04530566-cce41dda51ef0335a413908c0e169330.npy +04090263-c9812d343e4e376c95ff232cd38210b4.npy +02880940-454fa7fd637177cf2bea4b6e7618432.npy +04379243-7462ac6e44457697d017709a3cfbb660.npy +04090263-beb9c8ac912c770bd5e0e036a4082b58.npy +04090263-b5afc3eef7f7213250b870543ad6330.npy +03211117-d3bd7aa1ebfa45fcfba7d64da57889bd.npy +04256520-6703a4ef8b0ce866a6fee8e2140acec9.npy +03636649-74dff8f0a865368b4a8e02787dff638e.npy +02880940-baa4d6ca9521a55b51d6f7c8e810987e.npy +04379243-1dce0f95df134fa6498e56bb9f3fbb8e.npy +03001627-aed911c2849ce53b707cdefe012d0353.npy +02958343-ebd820a0694086e81f0d59cde6139796.npy +03948459-a40ea0c5f83700cec0f919a9a9f1e7fc.npy +04379243-df297071493f894e79b3e1be3524f72f.npy +03991062-53f3285cbd0c4add1620f4d6ce4714f9.npy +04256520-9177c05744b77b6f6157c3a167984fee.npy +03325088-72861dc714b3dbe2b362845c6edb57fc.npy +03001627-e3a838cb224367c59fce07ae6c046b8c.npy +02808440-2962e044492c43f2921bd8a746d486d6.npy +03001627-38201114b7f2c48d6c63709946cf3bde.npy +02691156-fbe213adb802384db443c685f436f80e.npy +03001627-8b6f776954e65e7ab05550de345b6d0a.npy +04401088-1a9707b3e9d8345048891ddb73756acf.npy +04090263-2f2e30fde0c26bb36b2c8bb96250e4a0.npy +04379243-4a72468fa13c36cd2bcc0cde35567dc0.npy +03001627-5162651a4c6da72e8a5e49d8f4867e8f.npy +04256520-20f82d98b188f16cad885ade4bf3150c.npy +03636649-1d21fef4a67153dab76e29c9c43bc7aa.npy +03001627-114b563de051057fcda85f6a3e19b0a1.npy +03001627-96eb2c84ab3b8df0c175a98f27dc2236.npy +02924116-94e068a4c09efd6ae2fbdb7fcf40400.npy +04379243-6c4c3bfe275e66b1b75e606711562bfc.npy +03261776-5fbad7dea0243acd464e3094da7d844a.npy +04379243-49c0aaeed2f926e3f2cf6a9bef44d625.npy +03001627-b0cef14f184c10e14af957103f4767ac.npy +04090263-87a868bd1d4cbbfbff56a19447480f3.npy +02958343-48aaa1fcf8da645c68925c742a212a74.npy +02876657-4d4fc73864844dad1ceb7b8cc3792fd.npy +03001627-79bd56e6a44e5bf1a3f600c356573d21.npy +04379243-3037fac5bc67207e23fa92d98173c06f.npy +03991062-49195d1e985bda23bd9d6adb1ec203ef.npy +04256520-36f7e8086a8849fd5883ca9b41ac387.npy +02871439-184eb80b82bdd4e1159f1e6a557f2ea8.npy +02691156-55ce4fc0b3df0234bbf3143b1cb6076a.npy +03928116-a5e01dbc483964989ff9b70e6ed76515.npy +04554684-8405ab2d49b428b191219aad82abc053.npy +03636649-9cb61effca346d48eeed1ac073f42256.npy +03467517-d52f696ab86b354624933d5e1bb8057d.npy +03593526-3834ca6d4c3fda9d5b2ecd212557fda0.npy +03001627-d1ec6e9b8063b7efd7f7a4c4609b0913.npy +03001627-671d51da473849c7369a4f66bf103682.npy +04379243-268436b1c1750a1e14659d605ff53c6f.npy +02691156-265e6c77443c74bd8043fd2260891a82.npy +02958343-12909f5d613953b8b3c9b3f81618206b.npy +04379243-1b01ef65920c342323bdffac38e6b250.npy +03761084-d54fce16dbf7ba12b8f6d409bb3f1e7e.npy +04256520-294fe191a191f812917b96045c9b6dea.npy +02992529-f7fcc773249429a2761eb63018291094.npy +03790512-4548d86cf7f1c11ad373c34785838ee4.npy +03001627-92ebdd82509fd637593ebeeedbff73b.npy +03001627-f444df40dadd83e22cedd65b2f6d1fdf.npy +02828884-e86a2291d77b8ff9408623dbb138b966.npy +02992529-e9ef88d72ead910b8b431083b6191e2.npy +03046257-726c7cb702cade25ad1da5f59ea6f4e3.npy +03938244-4b351af9567719043a4cd082c6787017.npy +03001627-f66ea5e07a8ad9eb283b00891f680579.npy +04379243-1161ca9bbd655ca17b431cae0dd70ed.npy +02992529-8cac6df50c515c498be6bc9d57b6a438.npy +03593526-b517eed6f77a7a39586574d8cfbafba0.npy +03001627-2a79d429e9effa6de7c7920f6a65a54d.npy +04401088-89d70d3e0c97baaa859b0bef8825325f.npy +03691459-bb3667b3a72b0bcbad6ba00d22308a6c.npy +04256520-94463eb34be49887c3bd24f986301745.npy +03211117-816eabad5c1ca552744107c67e903f9a.npy +03790512-a19d4bb8fe4e70b9d97964d17de80d2c.npy +02691156-a2b6edd3f2f060c7ca8607f540cc62ba.npy +02924116-276002136efe5849193d7855ecfc1bd3.npy +02933112-70d390b1e9b3053a22ca415af010d9a2.npy +04256520-7c68894c83afb0118e8dcbd53cc631ab.npy +02828884-909fcd9e329cd49581faebbdea6bd9be.npy +02880940-4530e6df2747b643f6415fd62314b5ed.npy +03593526-701ea218827f9a7a733657da4b6687f4.npy +02958343-6969e9ed46acce2fa7fd25564c2e888e.npy +03691459-ff4bc6c329ec7bf8a0eebc16d3afb516.npy +04090263-5c1d62c9ff844458cac68db180607870.npy +03001627-a3688350b1556cbe65ba78ad9601cf1b.npy +02958343-d471c4f43f008df5c1bcae9def1986da.npy +02933112-785b58a111b0498b9572486e5a924845.npy +03001627-20964e03ef001d8910684e111251a45.npy +04379243-43ca66b4cebe3aab41c3fecef2f1308d.npy +04379243-499ab88b7bd33cb92466f73de2a564d0.npy +04379243-1ef6c2b9d413fb7c681404257d94ad9.npy +03636649-dac3843c8f77b34362a510b8f97c658e.npy +04379243-cb6c20669c6d1dea593ebeeedbff73b.npy +03001627-f4a0d0169abf306a754ec1f2eef2c6cc.npy +03001627-87f8fc2fdc88e4ca1152b86a40777b4c.npy +02924116-c352ab905d6f741c2913b5e01aca8e8e.npy +04468005-c7b805e1ebea97f0f4ad1770263e7f39.npy +04256520-93bd851dc5bb3527d437a7a1ae2552ff.npy +04530566-6b87ed6710a0fc8d8aae7c4db7244339.npy +04090263-6de1ce73a377df3633faa05410dc119c.npy +03624134-bf07ece7d3c0a28f9d40dc50674e6347.npy +04256520-1af92afe68b3f837f51f77a6d7299806.npy +03991062-2ab54e76c7fb6a3bcb2a965e75be701c.npy +04379243-96d3a59baa02d7a47d117016cd1926d1.npy +04468005-367c2b062bd2728e40f45eea058ceeda.npy +02691156-9b62f887f1839e5f4c3a35cee92bb95b.npy +04256520-a247bf1e595abd266080784e4b7841e1.npy +03001627-a1ef57bc2563ec37dcadf30d9ccdd100.npy +03467517-2376a95ba9a43414c94b36e9b7b92195.npy +03001627-f083f6f7e9770fb7b161f36d4e309050.npy +04256520-c0036465dcbeed6a912f115faa04d51.npy +04379243-a2dbd26e8a382509738e43095496b061.npy +02933112-57dc5950f0a7304d4da5feafe6f1c8fc.npy +04256520-23cb1d667213c3a7e897e87345fc323b.npy +02747177-2f1510cbda5a89e2bf3f7db9590eef44.npy +03337140-44d1045be6acb7e5920de219c00d1c3b.npy +02818832-ce0f3c9d6a0b0cda71010004e0594e66.npy +04379243-ad243c4ca5f44fb828b75d6c308e3c12.npy +03001627-e84b5bbe91e0636cb21bc3cf138f79e.npy +03001627-e9e7883a296587ed804722305621f918.npy +04401088-541cc8b3ccf4c799502122ac3599bb74.npy +03001627-2669d4df8adda44571a782a4379556c7.npy +02828884-c293f2fbc66af3dbf4fb4dee5181bee.npy +03467517-fcfa96b85ce4d6114e96698ef01e7360.npy +02808440-47f4bab4593437481c17aef130ed6213.npy +04090263-c8a74709a6a0724f96a9670983483761.npy +03046257-d322992d2c1df38b75119b5f9ee576b7.npy +02992529-ec39e26f8c0829b3413ef77469a0f9cf.npy +03001627-b89952c6f2dbc1aea50b88953d263a42.npy +04090263-c7f54b82e3b1682b65564d9c2ed3b493.npy +02691156-43abe330362164e99be82ec29531a70f.npy +03001627-5ef3e4abd4386c8871bc6030acc85f1e.npy +04256520-48484a86775668cc7e77281775c253e.npy +03001627-8778c23fd21bdebf8a80d99ff4e76c20.npy +02691156-66e60b297f733435fff6684ee288fa59.npy +02958343-dedd7ee03210ff8a1ccbd9e5bb82dd04.npy +04379243-b9fc2f624533bb8119fb4103277a6b93.npy +03211117-ba29aa5a87317ee09327b89c3431616a.npy +04090263-8ab72b47faa4d2d4b524fe86a5d055d2.npy +04379243-acf57dbafe8966f577fb15a8d7923976.npy +02691156-9fb0988ef701a11388170d426b6605b5.npy +03001627-bd41ed35fcfc0ab7b5e2296ee51ed515.npy +03790512-6309c20c1ad258efbb297232fe17fe77.npy +03636649-f01cf64f05572ac4b509f4ddcfa8ca1.npy +04530566-b791549dfe175150a7d88fdd8b14a0fa.npy +03513137-8f17e31867f1968969b2407ca5e1a9ac.npy +02958343-2f369806f69ba9cb55048eb8b7ed14b6.npy +02958343-c92ef17bef6471f72a9eb0f146e94477.npy +03691459-aaf32dcc3d51cdfe81757e1914c08a9b.npy +03593526-fed045d07c91bb2723901b5a0f119b35.npy +04379243-240ddf8b63318ef534506cc3910614fe.npy +04379243-4132539ff314f0654d1fe7f29df13cf6.npy +03636649-19388898dd69dd9fddc8e6d1ec6242c3.npy +03636649-869836fe379f585a732b621b679fbd70.npy +02747177-fd013bea1e1ffb27c31c70b1ddc95e3f.npy +03001627-8c3a4f26d6ea2c864a3bb1a89bb7ce84.npy +02871439-21e537b6d8b8276fd138a53ab0d038a5.npy +02958343-f70df58949dcb108b682148e4ffe282d.npy +03467517-e5ff4634ee6d00323f00d55155ebc541.npy +03001627-38f8b44fc8dac88ce3c886e48eaa6e2d.npy +04401088-e4a0f08d8a6d487ac9de9dbf8ea0d889.npy +03636649-48fc49989a124917cd4a89b0fee32930.npy +02880940-2e545ccae1cdc69d879b85bd5ada6e71.npy +04530566-da15ecf40742e9e46d813b270092aa6d.npy +04379243-6eddf598e4199497d684faddec3c0090.npy +03001627-3e427b76d051cb9ccdea755aedb6e3f3.npy +04090263-2a45063d7d03b865ebeab56de94a5835.npy +02933112-85f41119ca2bbde1dc1f6c4cdb4bb9b3.npy +04379243-a530dd6e10797f3dfa5f1c647c19b0d7.npy +02691156-ce2c4502b06c3c356abde8e1529c422f.npy +04379243-ab0393b07d2965ef79675bb6cb63c97.npy +04379243-d3b715e7d98bfe98658d908a2254f194.npy +03636649-3b5f0c01c2b914fc6f16f167d27a7dab.npy +04401088-180f36e0bdb9b33f53de6f45c4ae68a9.npy +03001627-d8358969dad764edbb6f5a9e4b6b8b34.npy +02924116-bc22e40a72a1fbbce99562689078395.npy +03001627-9b359e42a5bc98572085b87de8f7581b.npy +02828884-10654ea604644c8eca7ed590d69b9804.npy +03001627-a3260f0c8fddf11cf0f4992137d8f4a3.npy +02691156-f4a5b28233523a4e588ed1d0f708d42f.npy +03001627-2b90701386f1813052db1dda4adf0a0c.npy +03593526-bcb86164cb709371377f115011370864.npy +02691156-c781fcd64271dc15224d7b1b956e1382.npy +04256520-167088246175f31c593ebeeedbff73b.npy +02958343-85f6145747a203becc08ff8f1f541268.npy +04090263-d442863599da17d951cfdb4c9f126c12.npy +03636649-9d41e23f00d11d153033d35b49a20c8.npy +04379243-93c2221188b4948f79b2fbab4d71b78e.npy +04379243-38feb6b209579f6faadbf8208284c675.npy +02958343-90f85f62885afeec65ca154580c5c7a.npy +04256520-6645c2afd5af2cd2610c2a68437007d6.npy +04379243-242b7a0fa9e9c439b20aa91e9e90c311.npy +04379243-8b4ccdf057b895f888a682c7326c32d1.npy +03948459-d3baf46b6c8a162fa267c8b6fcca89d9.npy +03001627-d3302b7fa6504cab1a461b43b8f257f.npy +03636649-605ddd207eed0d81414aaa1b9210e59a.npy +03211117-d4bffa0adec5f9a73387ebdfbbe050db.npy +04379243-26b2a15646f6a3a06f1e07a56c129dfc.npy +03001627-c0e5edb2602a7bbbab3d781e4dcb85cd.npy +04256520-af6ae25b2e295c36d79b19c7c4f0e293.npy +03001627-b37c77a90ba66c92564339cd0fd02849.npy +02871439-f7b449e5cbbf1ad26402b8f491cd92c7.npy +03046257-f9c02d4ef3c07b16c0a61ad1cf92b694.npy +02992529-97669779da217dce4f37c101c765cd3f.npy +04379243-fa7a5f65c561d9d2fc43dee2a1d6272c.npy +03001627-5fd2483e98dc2ddef3c9c1464e55d580.npy +03938244-5ba3bd3907f4513636902d83e4cc385.npy +03691459-56e2ab8ad78040432b3bd152980e4b5a.npy +03046257-5a9ef9410163bb569100b79b765fc7b1.npy +03001627-fe47e7645f1080735f0277eebfd05be2.npy +03001627-95e1571acdd75922afdb9a672b7d3b8a.npy +03467517-e4a2c2b16b5425825d90edd33668a4c2.npy +02828884-459cad806518f195ba6d436b28fcddfb.npy +04379243-e7ed7eeb46e18296fdb9ebad3cf3755b.npy +04379243-44087c74e5ea66dede436dc05ae39dcf.npy +04090263-c65cf6b063e1a21025251b7dc26d833f.npy +04090263-dcc3914659963636b2c8bb96250e4a0.npy +03325088-ade333c657e7b1c2b362845c6edb57fc.npy +04401088-ab2e514557ecb359224096f37ce8c08c.npy +03001627-b06f26c5403c3e922e653f6e789d3d8c.npy +02958343-1254c6ad2b420879d7622e6da48b19e5.npy +02958343-48260abd4ff73f99473f10e6caaeca56.npy +03211117-23c99db82c910931e2c8e43c97ec5a85.npy +03790512-3388b8d2486d366ab19ce2dec0d1925.npy +04004475-37d9a0dfc5051bbe8d793f7f9f50b0c7.npy +04379243-6b457dbbd8d875afd3520bbaf4a08c12.npy +02924116-ff7348571fde88cd6c1dd93d4254dda5.npy +04379243-8cd0334f04368168b8025ff83c807f47.npy +03046257-33d36c060f80361b4b3c42e318f3affc.npy +02828884-6319038bd4748a03d2b12aa6a0f050b3.npy +04379243-db406d9b2a94bce5622d7484764b58f.npy +03001627-2a56ff0143d4e69fe6fe3612af521500.npy +04379243-d15135247c2f52ce420e437840bac4fa.npy +03001627-3e53710a62660c60c39d538df4c93695.npy +02828884-ddbcdce0db6aa00524b325c2195eaee5.npy +03046257-c15389c173fc1cfd415cd6d00346fc76.npy +02933112-47f477a8b67d28028f1735145fdf5c5c.npy +04468005-b5bdcbf79ea375158be7c8c5fdb9bd6d.npy +03325088-940eb228aa016a3a6d86099178635a1e.npy +03467517-e70d5369f840577593f0194265a9746c.npy +03691459-4949c92a3f0d0946f536dbb8b34a9553.npy +03001627-87cdc53aec65aa0ff51f77a6d7299806.npy +02828884-8277bffcffda5c4edab3d510e4b89249.npy +03046257-c0add30f5a2566165e29ce2c9d37b952.npy +02924116-6b4a68af3d9636b96076a0921edbd4d.npy +03001627-bc92651fd7cd9ca8cf68feb7ddf815ce.npy +02828884-f98b9721d2f5b3d7f4f81e1d4b32b45.npy +02958343-ec65260a83a395e850df5ffbac7e7f74.npy +03991062-22e28d8f92a632ef2dacb6509c7ddd54.npy +04530566-6ec5e181c6df65d9a7afac0aa00dd174.npy +03001627-1d9dbebcbb82682bf27a705edb2f9ba6.npy +04379243-c35f0f50664264d5e6a1cd9763fc2f3f.npy +02992529-388415634e1056942ab70120fece57c0.npy +04379243-78218e7cf3b5f6026e24b3256330e605.npy +04530566-77327d5b8b56083415a0ff0aad35ca87.npy +04090263-36846ef535bd195efa45f4d7e1ef7d0.npy +04090263-eb39683f67d5d2fcc648677bc9b1d6ad.npy +02924116-4191757df8aed75952470de2774d6099.npy +04090263-317353de88cac813d9e057a3558cbfd4.npy +04379243-813d7c5131f6369cb898f6ca189a940f.npy +04256520-978dcc1e9c3f9a3f92a31ec18c4e190a.npy +02691156-9eef6307dc504b88392b84e3285cce39.npy +03001627-b1cbca9a2646b6f1bf899e941ea0fe55.npy +03691459-4829f4099c72420351c3197f6363608c.npy +03261776-4262c3dbd68a5c14957b6a4f3924d982.npy +04256520-1f0f9a821671271eaf288f952624966.npy +04379243-6e31a64910fa5fdc9db8ad97fd392b59.npy +03710193-150ae00a9d9d07788ae1c1abea367249.npy +04530566-3216e49e5dd304956bed41d0253513f3.npy +03325088-5943e3c0ec6edcbc76c18e71fd49c4dc.npy +02828884-ae99771e1f77fd2fa9bdc22a1e02e82.npy +04530566-3da3c73abafe7a9eb9e86d477b879ac0.npy +03691459-f6cccbb93c35fcaed49b96b9f2811c7d.npy +03759954-86e2b5f2603db0ca6ef604d255267aae.npy +04379243-e8ed10a7666a10a1edc98d150672fbfd.npy +03325088-e6c895dfe3150772b7a867e9b35a1295.npy +02880940-18529eba21e4be8b5cc4957a8e7226be.npy +02876657-14588e373cdb9143ca972ee98a070b3d.npy +02958343-7dfe2b1451449501588556e812e00901.npy +02691156-abb3c5d793e4c26d7aeb2194e56698b4.npy +03001627-6af354d0e86b1d5ed77c4541cb2e97a4.npy +04460130-800f8586461b18c238cd8eb23853c009.npy +02924116-682856891ee0318bc2876b98c07c9251.npy +04256520-18e4ebaba8998410ae8c9d3b8c4b9bc3.npy +02691156-20d97069df784e19a80799ffaf21ea7d.npy +02828884-4a5f9a0672cf3a1fad5067eac75a07f7.npy +02691156-ddc14c7e0a228663796843908eee8f7d.npy +02691156-816935cac027310d5e9e2656aff7dd5b.npy +03691459-6c2a8b174ee60c241ad88f716ea80910.npy +03797390-dcec634f18e12427c2c72e575af174cd.npy +03691459-17f87baa813447ab9588e71e21de9f30.npy +03001627-665bfb42a0362f71d577f4b88a77dd38.npy +03001627-8a9d6ef075d5a0721242c827d7f16c58.npy +03636649-85f71a4724fa37c33d39d8012919dd25.npy +04379243-5f100571ffd90f8252b4875f731f71cd.npy +04379243-63cde6b5e85cae2bf4b6538438a0b930.npy +03691459-9d43e1b188ac816087d72888c0a9277c.npy +03211117-3ebda8146a84d7e64fceb9938a41179f.npy +03211117-eb2b450565c77e3efc7ff8f848d1c6c9.npy +04530566-9472a24df8372cd42e436d38f27146ec.npy +03797390-8b1dca1414ba88cb91986c63a4d7a99a.npy +04330267-bae2babb26dc352b20489998d734835a.npy +04090263-bb7474cb9310e33aa7dd22c0aa3913f0.npy +04530566-206c86e4cf614dd5d03c0ce6ad42cc93.npy +04379243-a9ac09540c655b08d0bdd07d0170f389.npy +04379243-19dc20a7065fba0501a7e3ae8c65473.npy +03691459-9cd16abcc7fa224ce029fab54b6cfbd.npy +03211117-c2d39973237252e85e7087f2d9a278a9.npy +04379243-7e2c9dca60e09009df1d847ee0a8f3d3.npy +02942699-235a6dd25c0a6f7b66f19f26ac490096.npy +04256520-32cde5adb86d540a2eb3768aa5c5fa1c.npy +03467517-a4274a5db19db1ed7c8a96b42661aee8.npy +03636649-763ceeaa4ce2ce1d6afaa22adc38077c.npy +02691156-aa5cdbe94abd2ee15042e5fc5b753f1.npy +03691459-7d75382b7b9e7bcfd88a3e0e92891ad5.npy +03001627-a3d1cc17aff08bc7eab55e294b4eea02.npy +04256520-9d5461070e008c453bdc60e3df3aace8.npy +02880940-b65cbede8f483d51f7de4d28691515e1.npy +02691156-a051219f3f444fadc5e2bf7b5a5f1c56.npy +03001627-8b6f6304674b1280d6cb6d27840b9d7d.npy +04379243-56daddb695e25fac341afa383659322.npy +04379243-5214aab74399556959f8e31ca87c470e.npy +03761084-1605a1923b99fe6bdb4c5469c0c1ba80.npy +02958343-aefcbac53b05ed5a27404deef339faa.npy +02691156-260288918550573dc9eda6e157b92d90.npy +02691156-81440fcd51052844af7d907e4e1905dd.npy +03211117-25913689394d86bd158b0b2e23af3d37.npy +02942699-17a010f0ade4d1fd83a3e53900c6cbba.npy +03636649-cb60159e291c3e5cfcb8d8c6d4df8143.npy +03001627-5fc6b04623ae6a9963ed57e35c972b4b.npy +03642806-72133503ddaf54483e725ee552a0026.npy +02992529-d4a038b20b1250d7241d076ab53023c1.npy +04379243-2053961ba985591af51f77a6d7299806.npy +03211117-6011d9bbe9b04cf7b6b6751f39e7b3e5.npy +03001627-49f3a28d33c34838d74aae0eb2ddb027.npy +03001627-3d442388af50f61138ae3771b1788e76.npy +02691156-21bf3d8201e3e41f93358ca8580664d1.npy +02691156-7bc46908d079551eed02ab0379740cae.npy +04090263-188c3d3b8da2b83c2d4090ebfdad3018.npy +04256520-c070cc8563e2b3d65d06d6b9708d8ce0.npy +04530566-2e4adc3992a773b1eaac92a15231622.npy +02958343-38334022b922a9d4e7540f431cab4686.npy +02958343-44cc90939a67b72c71778fcae3da6f00.npy +04530566-4e5b83181a13e0661868b1150be0eef4.npy +02958343-9aca55eb91a9b348ab7ba9bb57593f51.npy +02691156-24bbc1f5225969fb90b1d6deb98feec6.npy +02992529-844633a98977c10d9eedb085a3d8dd72.npy +03001627-206dcd879e5c3fe8df4cfe396cee719e.npy +02828884-38d4d7313a3698704bbe1e20736de8a2.npy +03593526-e74cb96c0fc30d03993afecc2c675915.npy +04530566-cafc4d2198b6531bd5527b961edeb7bd.npy +02942699-657a650215e453846f90fff80f29e77d.npy +04379243-2444551d00693a0fab610b0c94236463.npy +04330267-c586c25a121326bcd621f96e518e01fd.npy +04256520-2c1ecb41c0f0d2cd07c7bf20dae278a.npy +04004475-3660a8b78046ffc52f81cb887dc35578.npy +04379243-a78273aa10b2dfb0bc8d334f99e7f52.npy +04090263-da9069b1bef61215716e30105a919115.npy +03691459-e6e085e31c30925466bdbbf263e9429e.npy +03001627-9fae8d94a028e9ec2818b21315fe1bde.npy +02876657-6444875e3217bf891f5f48a891d827bd.npy +04379243-b5168a95f760cbefa22728b9e8cfa4dd.npy +03001627-1013f70851210a618f2e765c4a8ed3d.npy +04530566-21256efa0a78f86b4448fadc60fab7a7.npy +02958343-8e72ff1064eef473714e6c6511843d28.npy +04256520-c281babcc88358f31ff05e2259c2ba15.npy +04090263-a83bfd1065f7dc34176d7cd6eb76e767.npy +02958343-bbca92f53f04d80d8bb5c0bf5eec83fc.npy +04256520-2a027aef8813a131624a1aaab5ca52f.npy +02933112-d77dd358b31497aae2f840a8b8c7384c.npy +02828884-bbe3d0864b95faca48d057884d36455c.npy +04379243-69c74567d77a88fe5af397cf24be6deb.npy +03948459-6640a8fac8b624a23d2e4fbab0e82203.npy +04379243-597b0d10535c25d538f21a3304cc4bdc.npy +04401088-2b829a38051e6f8d1f6dfedaba98d5f9.npy +03636649-59ca30266fb153ba50f93b609ce4feaf.npy +04379243-1aed00532eb4311049ba300375be3b4.npy +03691459-614a16b7b994063af6d28508a7c94d33.npy +04401088-bf2a5f434972f11a690a03770c5de186.npy +02992529-d21231fb7d7f7337f521a3dcd28e9d2.npy +04074963-9d5f59e259057baa910a53622567655f.npy +03624134-3b1f7f066991f2d45969e7cd6a0b6a55.npy +03337140-58f68e07e47eac944c3aee8e9d3a6ffa.npy +04379243-59dd1eef8072ad8de074517a246f1e65.npy +04530566-6cc258399daf767ae1942965937d3cef.npy +03001627-e193b0d75fa674142b3e9b6eb52d35df.npy +03636649-fbd59db93e38bdafc8687ff9b0b4e4ac.npy +02958343-e00169580fda5461473f10e6caaeca56.npy +02992529-1621e08661de948d7532dfb76fa58e9e.npy +02933112-4b006b7a2215db3d284f6213916dba67.npy +02871439-8a5783031f99e9d5c8bec3671aea0fa5.npy +02691156-448bd2bcde027ca9e5d07633dda45110.npy +03991062-9a630f5e08e2cd8d61a095aa05632df0.npy +04379243-4643de4838d7048437251258858a7a58.npy +02828884-df31fdbbf7e3616b774561c9c1990536.npy +04379243-87b15b50b03054360cbb0bb881f838f.npy +02933112-6d42969890762ef2ec8eb53ffeeadc85.npy +04090263-8f268f9f187292f1179177d1cafed62b.npy +03001627-776cdc2ed288076882eddefc99ebacfd.npy +04379243-8653180e64d70a47b3cf15c77de45986.npy +04090263-6dcd7fbe37463ff38d4ca42bc1bef451.npy +02828884-6a11450577768f2747d4c7899ba36cd.npy +04330267-f1ce85e56633c1cabea08f0d71567278.npy +04256520-d8142324c33dfe7595bea7c29e873d16.npy +03001627-ac47b4d30b598978d5a4a04ac21f0578.npy +03211117-5bf10196a11a166466ebaa8e9b491151.npy +04256520-841cb38f7447dc698e4182295c92f949.npy +03001627-5d3cfbc8bae19e701f580a0f9153317f.npy +02691156-df411aa240fe48d5855eb7906a7a7a04.npy +04379243-5db59a8ae13705bd7843fb4efdc19510.npy +03001627-25196058a95b4fc3359e362142e70c8d.npy +02924116-c2909962fd25520a696975d93fda1bdc.npy +03624134-85ced924eedc6ff566b5b592ed1ddee0.npy +04379243-7e3022a7bd00eb4195b8ea6a366e14d.npy +04401088-500fbdefb58e261af2cdad303f49c9f9.npy +04530566-f4923b4ce88bdda3a9142e7277ee08f1.npy +04379243-d007026a83d6be854e48282b72e69035.npy +04099429-e1cb02a589e09aa193a67322c4cf7081.npy +03991062-870c7ddd93d5b7c524042e14aca574d2.npy +03046257-6080c5b09917c23830c7810cba6da248.npy +02818832-ae200f07aa45b3381efae51bb1dffa9f.npy +04530566-6f4a328af926532b642f9e27aaf0c47a.npy +04256520-7173c0462d9ee2a344949d7685cb63ea.npy +04090263-5b37d0eaee45e12cea768093544ea6d8.npy +03928116-2b8f0dc6c0bd6764f5072ee3ec9236b4.npy +03001627-9930f9ec8e2e94b4febad4f49b26ec52.npy +03691459-d088d0b4cbf1d8447b041fd2144f3532.npy +02871439-538ccfb554d8179bf3bc30c1c812e48.npy +03211117-4516c31dae48a0efbff4c0ca0d98b77.npy +02958343-791885fd798b1981c1006ed55bc1a3fc.npy +02958343-6d61759c3f8636f816abce8cb03e7794.npy +03001627-ed7b1be61b8e78ac5d8eba92952b9366.npy +04074963-49c6003c2248bdd1906ed109a4ea50d6.npy +02958343-df672140efe7b8ca89e9a9eee39907f.npy +04379243-4791914b3bcaf57efebad4f49b26ec52.npy +02691156-d2842bc324b3dac5bc0909d98a1ff2b4.npy +03636649-16249c6e2a76400dfcb8d8c6d4df8143.npy +04379243-61b80232d3aa0a409ccce4c6d5bb195f.npy +04256520-d053e745b565fa391c1b3b2ed8d13bf8.npy +03001627-fe20f6a58ca6c84c914eb005afa6475b.npy +03001627-b899182610c12c78ed88a55f92d81d7d.npy +02992529-d98df8313cf5e0a7814fa32b2a1183d4.npy +04099429-aca0df6bbdb0ef3f870a795cbbf52b3f.npy +03691459-c76fc96ad122a33e75f6e8ca4d589c7b.npy +03691459-5e71a80c6ac94e0177818a0572bf1777.npy +02871439-d0739d3cc5c3549eefd584ddda1b5aa1.npy +03325088-b3565dc2c1e46134b362845c6edb57fc.npy +02958343-4a5bd025a2500b3b3967c36b4916b4de.npy +03636649-a1a81e5d0450d463df9c597227d75069.npy +03001627-79e5eb7be94f5479696b74614952b2d0.npy +02828884-d7d6a7fae6003dd6f4fb4dee5181bee.npy +03691459-d4562a410244eca8823eead1c8e7b3b4.npy +03001627-95e5f6e550761aefe65b629e4a22f51e.npy +04099429-777aa6841e1306beb5a9f8d018fc9500.npy +04256520-1299643f99c8a66df59decd9cfc8a5bb.npy +04256520-dcba7668017df61ef51f77a6d7299806.npy +02808440-e90977d3e1c960ed904e03fa15bd73ec.npy +03928116-35259e9bb2669df79bad64a9c6516f06.npy +04379243-3016d678209377c1c3bd24f986301745.npy +04090263-a669193672e033f512b38b1d99376c0b.npy +03691459-11d9dd7b170216eabc4d71e69505510f.npy +04379243-53ac82e4ef6af3da9a5ac88c7195fa36.npy +03636649-ee3bf15041b96387fcb8d8c6d4df8143.npy +04330267-8974fdbcf6bed0fbf0f660d2dc5ddf2b.npy +04256520-3610635cf623f3f8917b96045c9b6dea.npy +02958343-51e74bc165f2cb21e2a6bd02594b7cd0.npy +02828884-5f3782702eb8f2d421b4fad85a658c.npy +02691156-196d35794f869816db6f03b6829a5891.npy +04099429-974472ca7b895f74c6f5c7c0f17e11c3.npy +02691156-71f718d82a865472bfa44fe936def6d4.npy +03467517-12e30808350dd945f4b498e11fb60a4b.npy +02946921-343287cd508a798d38df439574e01b2.npy +03948459-18598beeeedb20729a6e43b878d5b335.npy +04090263-2970d1dc154363735960f9d4a75e81d8.npy +04401088-fe34b663c44baf622ad536a59974757f.npy +02871439-957dd2b31285002b4d6ef9ab90177563.npy +03636649-454b7345c01c404b6d0fc9460109eda7.npy +03001627-9d229e34818effff07d3e3c7bfacb95.npy +03046257-63664307ac493090b129901f80d24b7b.npy +02992529-420138dffb14f929f0b45b4b4c7e33b7.npy +04530566-408cdd476e8bb202852ae095a967f0ca.npy +02992529-ac0a78736d78a5a5dd8524baa80cc603.npy +03790512-481f7a57a12517e0fe1b9fad6c90c7bf.npy +03001627-cc25ba35b3f6e8d3d064b65ccd89778c.npy +02691156-857350d3e780366537678474be485ca.npy +03001627-510fdcfcba1bc18ea1081ad712f6fb3.npy +02747177-22213dc6019c215a81faebbdea6bd9be.npy +02808440-d7d4367ef5ee5991b362845c6edb57fc.npy +02828884-f8dd3c18e0735bb4b2644d7d4d7ea2c7.npy +04379243-2cafcc8c772d4860c2d043ecbc42284c.npy +02958343-2f2ed1fa349d50f3bb15a692385994d1.npy +03001627-e41e8329ed0c0b88d93768e7b9b1eabf.npy +02691156-c5ff8a911c2780efc03676083f8f4de6.npy +02924116-f90cfb1b651090cc477d87ca43ed5744.npy +03790512-966cc24ec5fb927b22b51f1a980f45bf.npy +03636649-88257c5a48d94b1e2b151d8b52c53b90.npy +03467517-f6884341f0d6d2cd69a645978ae8c765.npy +02954340-30be60f95e2a3b47a6e67635b9d1cee5.npy +02942699-9e91f482b829c4d1e9fff7dfdebc774b.npy +03325088-ce69c6b309dc055eb362845c6edb57fc.npy +02808440-a8765cfb0701f015fe52ffd0e748a1ab.npy +02691156-b80131dacfa19f77337e02e3502c7536.npy +04530566-d214cdddcfaeb0cbcf8dc8d39d90900d.npy +02958343-4f54d7acc33111a56afa0fe12a1de326.npy +04090263-f5cfa769619f708bda733a39f84326d.npy +02958343-de683c906ed97d7456ca31471168385.npy +02958343-c617227027a05eddfec731b1d5d5cac4.npy +03636649-dfe800d8d8642e9647bc3701b998a7d5.npy +02958343-88aae5646dcad7062a9eb0f146e94477.npy +04256520-480cd721e7bbf720b0eeccd21a9bc702.npy +02958343-f3205edd456cf36feabc798aaf5f039f.npy +03001627-23babf1dd4209349def08b067722d9e5.npy +04090263-e49e18cbd48a2479cdbadd1af48b5cd6.npy +04401088-54b4288766d87dcf332f5e5df5b42874.npy +04379243-6e77d23b324ddbd65661fcc99c72bf48.npy +02828884-31f34cbd9385944181faebbdea6bd9be.npy +03046257-e5d21511678e9075b8b431083b6191e2.npy +03467517-c553d5d6a458401c8792f38f9bbb6676.npy +03467517-a4fc4b7d8d40790e4bfcfdb26b8cb2c3.npy +03948459-a3679104af613021912d826efe946a9f.npy +03046257-9f56b67ee6ba16fca05d3424fd8d541a.npy +03636649-85f8a8c585742c9b96a3517f50eeb9f4.npy +04099429-4bebae2aeb3e9c0d2ec5ae9242443840.npy +02808440-2231d841b91eb6d53321831d2245cf06.npy +03001627-28d3e0a4e4201ddb19ed4d1541e44f14.npy +03001627-9a3d7e6194b7a5bd3825a5bc524f67c9.npy +03467517-9ce5c54dfe145950156788cef4ad8bc6.npy +02808440-14b01ccd00ceb5e4a701ffa903c732b8.npy +04379243-79e3d485572b54bd9f2349486c570dd4.npy +02691156-5abba5b86814b98a9f4ab5ced9b9495.npy +03513137-3aad2f60419948f891003fe635f8d594.npy +02828884-2d80f237dfa7e73e5b7bc62e486d578c.npy +03928116-6f09b0176486be2a9c75eb4326997fae.npy +02828884-754250f866079c2083f64069b9b28eab.npy +04090263-f2e64c42370475cd52533bf53842cf9c.npy +03624134-a2288d5f3a44233bc40c6b891c4913bd.npy +03046257-8d9e42ef36ba9e5f7dd46011c41be2ef.npy +04530566-6a5f7a634b13ea7a94daa4565dd30535.npy +04379243-97e2ca564decce0b575f9747ff6fb5e8.npy +04401088-e5b629f4a5e7467066ccbd11a6ef0f68.npy +02871439-433136c9fa211d5867f7514c37b83a.npy +02691156-f36ac9cdcf15ac8497492c4542407e32.npy +03467517-740972191167ba363fc4ae76a96ac53.npy +02924116-c7881385a4077694f5057f866a21c1b7.npy +04401088-bbbca195cd6b85f1562c8e1ac545ef78.npy +02691156-30b514b24624da4fc1ccec171a275967.npy +03636649-92c2c146432ff304153c1c3f0c464db2.npy +03636649-84e870f2255d6b6efcd4910413c446d9.npy +02933112-5bcb725e26e521364c7384dbb75cab0d.npy +03001627-d417795442cb0f75593ebeeedbff73b.npy +03991062-3df897f668d419b978caa162a41a851e.npy +04090263-75ca1520edb6825d12b38b1d99376c0b.npy +02992529-ccf2058300cac188639e45fae4b57d2f.npy +02924116-1708ed19e3bfd07b2504ddb627974db0.npy +04256520-2860b2b5e16f4ae8c29432ec481a60b1.npy +04530566-96b27c98daf461269ff59e10e6ad1a4c.npy +02958343-83e537cd6bb435e91d1a964dea8a7aab.npy +03001627-6a73ce89c4a941ac0f947750540fb22.npy +04379243-5c2ec61293c30ee7bdba4e1fee183355.npy +04379243-1164897f678f3bd627e98d0f3d735480.npy +03001627-ebf1982ccb77cf7d4c37b9ce3a3de242.npy +04379243-16b72d74bcac545fe3eedd8db265e106.npy +03636649-fd26f566fe08c3dac64d4b10f9dc65a.npy +04256520-47c45ac7187a9674421b433358248213.npy +03593526-ae77abbf5ab4893da75d03186a0409e2.npy +03001627-4b904e1d68d09dd3e15e36ac023c5182.npy +03211117-36ea450f5d479481c795085b4d203932.npy +04530566-24000ec6bcb6ab9182b5804533e545b1.npy +02958343-7c85e6cf9c4f46e91cc13e432d5756b8.npy +02691156-9e617d72fabc718b90b1d6deb98feec6.npy +04256520-7d2032e1af7fb191cabc196a7f35f1aa.npy +04530566-df0f90c6abbfeaa0255deca950ace5f9.npy +03636649-1165e8de3cee9f706314698551cd43b.npy +03790512-6ea0a49bd27fa58b2279b76b11a9a16c.npy +03948459-49483669657caad2f6a222569e8730d4.npy +03593526-fbaee96700018ab3835b141fda2da5ed.npy +03001627-8dccb87a61e565cfd4713685ae50fa13.npy +04379243-4f38d59a7fc3010fd7483d79670cc91e.npy +04530566-31230e9a2e4d7cf7cf291a4a9f36cece.npy +02933112-56676ff1d9f8a1e94c61a7cce317bfb7.npy +04530566-e0190bd315d8109f542c6282a2a9329c.npy +02691156-fb06b00775efdc8e21b85e5214b0d6a7.npy +02958343-15fcfe91d44c0e15e5c9256f048d92d2.npy +02808440-71753adcff89e231b362845c6edb57fc.npy +02691156-8da50272a54dee98d972c9dd75ed77d4.npy +02880940-c399bfee7f25f0ff95aab58c1db71c10.npy +04379243-7f23cb04feb40ced8161eca940958ba.npy +02933112-273bd29d931bd255343edb005e0de5c.npy +02691156-b54d9c1ccb737eb6d972c9dd75ed77d4.npy +04256520-341ef2d97f0f9091183903d8843a24ef.npy +03211117-ccd03d11c95554bae4aef3a037da6f67.npy +03001627-6050ef2e6ac4ffae490ad276cd2af3a4.npy +04401088-2eae0713342e1103397d790c3d0a8fb5.npy +04401088-b4795b53530c26c58b13932a0c28e98b.npy +04401088-c7ec332bd52f939f04143dfe595ba79.npy +03325088-4be2cb4c94a4ae9f3321831d2245cf06.npy +04530566-92d7254e73fdab7289c6f1079da7a8d4.npy +04379243-1a417e4090ced738855931d119219022.npy +03642806-f496fa98fb41f6b1ea5768960d4a805c.npy +04090263-5d40add22ff7d14c77b7d0d4764c121d.npy +04401088-2682cb34e7db8735bdc7fd7cf135ade2.npy +04401088-98f0a229291ea982d670fbfea4c122db.npy +04379243-8f1934c5ca7772837d44dc16af152638.npy +03001627-4913388a4c94547a81806e3880250dff.npy +04379243-6a754d9c379ff246fbb20af1c3b4b0e9.npy +04379243-81c8ec54ab47bb86b04cb542e2c50eb4.npy +03691459-26363bb293e6c9e499db62650613bd48.npy +02691156-647a8f5c79b54910f6c0d5cf01fdaf45.npy +02828884-5c76331c2d99f3e2fc9d3ea96a9a9d1.npy +03636649-94f4c42b6db62c9688e7662971dc736f.npy +03001627-ebaf425ea2c92f73a3bafec3b56382db.npy +04379243-d1b34fc25b5ed4e42fa77440dcb93214.npy +03938244-f83e0334efbe5ac33c702793a783cff1.npy +02958343-b55112c3c09949846a0cf750aa55c4f3.npy +03636649-e4201614cb3590e41735ea0e092a805a.npy +03001627-12d7ca3c06faaadf17b431cae0dd70ed.npy +03001627-6b9c3d42724275cf7a5c8cd74a7bc29a.npy +03636649-aecfc0a531b67a478b424343280aeccb.npy +04530566-f193688fa17197f7798832e32e32aae6.npy +03001627-dd27edca07570d277ad11050da24bb12.npy +02876657-bcbc2c637bed89e4d1b69ad96276e132.npy +03636649-8566e44b5f1a818ff44a1c032c5fcdb7.npy +04401088-6475d2eb77c7ed5a59812638b595a4ce.npy +04530566-92e3343250e181e1428cf87eb5ebe5e6.npy +02876657-56c23ba1699f6294435b5a0263ddd2e2.npy +03948459-2091ab9f69c77273de2426af5ed9b6a.npy +04256520-679010d35da8193219fb4103277a6b93.npy +03991062-8d87b950d8e192f5f51f77a6d7299806.npy +03001627-fd2c754ca43457107d910d51d878f708.npy +02924116-50fd00d8c6c216ab52470de2774d6099.npy +03691459-27046cee7ae745e6d207241113bee327.npy +04379243-58b499ba308f9e82b4c161851ed2b4e4.npy +03325088-6b23fe58eecdc1946048f75ed36a5ac0.npy +03642806-3088048452f40a8965932bedd33dbd98.npy +04379243-8d44182e9916d617938da3ea2c9e0e4f.npy +02691156-5558a2511bd43caf2fc668af6d3ad0ad.npy +03207941-8bc3e5012c3cb5837f7408e5e4714afa.npy +02933112-1ee58b9b772b8807f51f77a6d7299806.npy +03691459-2c8cb15e2d973bc847cf5450436b1047.npy +04379243-7bbb0921945cb5fb45e2a4e5729b970d.npy +02958343-e866dd4d4bf1f1f5bbadf8db57668863.npy +04379243-8d05d40b15f933edc22013ebab50762.npy +04379243-7dea0c96340d5b9455f46d55537192b6.npy +03261776-98eb96633935d994c38ed9bce4ed5d0f.npy +04530566-1d5ff455b6ebd04e413559acd5524c40.npy +02924116-46858dcb18c2630478c6ad1c898f52db.npy +03325088-d7cf55161ac23e2b76c18e71fd49c4dc.npy +04379243-3929a118c5252a768cbb8bac2032149c.npy +02992529-ae0b011684a6c46c10bc2436075f6a52.npy +04090263-e9fdc6039ab91746580389adc8c1bb70.npy +03001627-63f6ff0ad9cf9d17adb532bf77da46c2.npy +02992529-caf0f73f4a609b7a2c4e8a2f66e4b8a3.npy +03001627-cc2639f8c584001a922dfe32810651d0.npy +04379243-c2369a8875367b56fab6e40cce6926d7.npy +03636649-ab53b6e7b2f87cb5c1935c9110af1bff.npy +04256520-8f971956f31d9faecb3a30f2c37c38a6.npy +04401088-693fba444859fb7d54c65e829609f393.npy +03211117-30b5026e1c3f8c8a93e4d36e0c61da87.npy +03001627-79030f846b4dee0f9d709998b2d6e774.npy +03001627-ea04a5915e3982aad7f7a4c4609b0913.npy +04379243-1a6d43aa7b5c4e1d1c6a34a68ab9e1d4.npy +02876657-72a9f3c57e40416f8884a069d9619eaf.npy +03636649-6770adca6c298f68fc3f90c1b551a0f7.npy +02958343-5ff285283e8ec610434fdb742d7e0cea.npy +04379243-1834fac2f46a26f91933ffef19678834.npy +03991062-facae3f0d92553bfbc5c4c571faa8806.npy +03001627-3cff2db42b3ba901e83221ad0d21775.npy +03325088-bdbe36608edfcb23b362845c6edb57fc.npy +03636649-857122dd5f5cb1b0a34f84d89d87830.npy +04379243-1d4e22bc8ed400fc368162d385acdaa9.npy +04379243-105f53a6471f3ceb4a420e3c1b966720.npy +02992529-4116965029bd24393423610e52061098.npy +02691156-e3d197bfb47ec943c9d7d324d11034c9.npy +02933112-a247a4978888e6403fe047712e43e185.npy +03593526-d1f9e06eeb9e5fe237af722b64576c2.npy +03046257-626c1a3c6fac65a924a6b810f75dc774.npy +03046257-35e5685d7c25ed8564c33a5741e8e076.npy +04379243-db302d0ac596b4e059db00799f9936b2.npy +02691156-b273c9007d1e364fca8607f540cc62ba.npy +04379243-fdd8dae63e8781414a803c33df86f3bd.npy +02933112-cdc2c14b62e110fbf8bf793ac0a3a901.npy +03001627-6d199c744b17d85953735b417976bbf5.npy +03001627-bf179410ad7f9f37af6595f7d3f20cf6.npy +03636649-d0650b751034f567457ba044c28858b1.npy +02828884-91a39f76430e6cca19420b7669e7265.npy +03001627-1e678fabd0622a1119fb4103277a6b93.npy +04256520-41c9fcaf5c6b83a61660e46cb2e4cc15.npy +02958343-5bb83a60fb8d5f45a1089359fc10d7fb.npy +04090263-9ce27cd793dd3da29ac0a7e766b7c815.npy +04460130-ce4acc0cd5f5a33cc4406905076c720.npy +02958343-3af1559045965b6f1f1bf16cb0b58c6d.npy +02871439-2f703181d8069cd0d42b9650f19dd425.npy +04379243-4e48be33083b8c70d810b14a81e12eca.npy +02801938-61ce681b67ceb94f4c2db8f2b94d9c39.npy +02747177-ffe5f0ef45769204cb2a965e75be701c.npy +04379243-3b0e4c443ff69840c3bd24f986301745.npy +02992529-a8bab81f66ac5d26acdce172dc618222.npy +04530566-11d9bfb57990eed6d674557449cdc5a4.npy +04090263-16308b7668753c078080f52bfb02d6bf.npy +03691459-76566bf65b49e49c864d68471e7fba29.npy +02958343-d1f100f660eae4548acb0ff76f4aec7d.npy +02958343-1e2f9cb6b33c92ea82381b04bbe0ce6d.npy +04379243-e41e3b1d11fdf7cef9c9f9697d1ec60.npy +04379243-46e1e82d296cceb389a52d0b0203298.npy +03691459-afe96f3cf256cbac81a6b6721af23c58.npy +03001627-e936176764be83d029426a0f57e4d15e.npy +02924116-7d0d3c8f823b3debf03a6fe18d6a133c.npy +04401088-9dc0c2ca8de18e28b4c18e3209e12990.npy +02992529-a19763322fe669cc7e51366b0cf7747.npy +04379243-8f05326e122a6b973eea2c65c18f73c.npy +02828884-41fe326e3decebd1b40f0ac0fb9a650d.npy +04379243-282d36d7ca9705f6ca421e9e01647b4a.npy +03636649-99ec967442fe35e46aea2f18ee404fd5.npy +02691156-cc68ac5b18674485475045ea78b20eb7.npy +03636649-872407329ce09557bced73c51e99f8b2.npy +03642806-e0cc767bf10134509fd6a63b3b6f6cd4.npy +02958343-9dd02330c7c4ec88ec455839e63f83dc.npy +03636649-3d26aa294ad1cabcfcb8d8c6d4df8143.npy +02876657-b00152d19e8f2b87b2d2b5b947dc0b8d.npy +02933112-906d1dc1a8e519868cb5d9909aeb1309.npy +02828884-444e7c5709eca2496f61afd58e50ae2.npy +03001627-662ecf4b0cd1f3d61f30b807ae39b61d.npy +03593526-3d7710926dc165d29d70a5dfc06759d.npy +02992529-bbd5005058f01a54909425bd531e6033.npy +02828884-826a100b907c3fc4edf84ea98391428.npy +02691156-a2de53a5de7ea01dd01b5600c06c528d.npy +03211117-a6985e8e32df69a7fe50497d5e2cdada.npy +03046257-6245999a79c5d853c31c0b92a775f88b.npy +03991062-88515725e87499c1e9dc847f63d339d5.npy +04379243-47e7fbbce59804cd30bbd4cddd04c77b.npy +03001627-56e51afd9d5c5fa38b7a92edf72424a7.npy +04090263-723162e8e15f4ac55d0dded52efeb4fd.npy +04256520-e80ade8966a54fe419fb4103277a6b93.npy +02818832-e1f93c13decef335e3c3d58aba901b14.npy +02828884-d34b04cb67bf2115c308e7dd57b5111a.npy +04530566-31ddf87b5ef64c9080c9c53be28cd7ba.npy +02958343-e92786612a9d60455dca6305fb9f97ca.npy +04379243-b12b2f12db92ed70c48d90eef8384210.npy +02992529-1847d3782970e60679510444cc61f839.npy +04379243-5d7f7ef4f2f2e99f1e923e5a90fc6bf2.npy +04379243-a7d1fb495c33316cfdbe2bf897d8a820.npy +03642806-8235de380bb100cadf5a805be6fefb86.npy +02691156-28402efe2e3435d124fbfb66ea1f14f7.npy +02691156-211cac5d62271583b85f0298cf43349d.npy +03624134-adf0a46e8a00693e131d8fbf069d5d12.npy +03211117-1412e61a9bc08ac4e6d9f3854f1baef8.npy +02958343-8237df29002d6cda20fc61a2a01df353.npy +03211117-a9432163d01a99f1d38b9064784c4b38.npy +04256520-12cae0fa5180fce64b7366b9d17acf07.npy +02992529-ecab7b7bfef8d7f423575ca8cfe7da9.npy +02691156-14d6bbabad3ad00dbbf3143b1cb6076a.npy +03046257-ce222cc498d073ec59fadefffed47ac7.npy +04401088-be7a560b2a6996558c646f076042ffd9.npy +02958343-296c92e4e7233de47d1dd50d46b1e3d1.npy +03001627-eba001ddae2ce5eed5d673747c0e3adb.npy +03211117-fc314f1e3325a47af287ec53a469521.npy +04379243-ea89750a67ae2335b9315f9098d51eae.npy +03636649-c60a072ba63c12cd8ae0d28389a2d006.npy +02828884-36583be1062e0f48c24b862f5ee36086.npy +02958343-746765dbc0106bfabda733a39f84326d.npy +02808440-fb39c85a8e31535b4c62bee40dcdc539.npy +04256520-d5424df6acaee9762d19175e7d19b7cb.npy +03211117-6bf634a79cadc9851b02cde7e81f0fc3.npy +04379243-f82e5554f1c877a1e074517a246f1e65.npy +04090263-9e3d8792aba09939855b2b6b2e96290b.npy +02691156-32d9fe9366da899b90b73cf2bf8fe3d1.npy +02691156-218caa58819e10d1fe40308d822f996c.npy +02958343-5f148a8b824ed7e72a9eb0f146e94477.npy +04256520-fe45a0e02430b195b6f5fb02f36f9480.npy +02958343-e7e94f8dbbe8c1e9784da3853aae78cd.npy +04090263-d8c06e41fedbf387e5a528a89590d5ea.npy +03001627-383ab6330284af461fc4ae93e00c18e5.npy +03001627-4e3047842ba1a384d2b12aa6a0f050b3.npy +02808440-cd55a6a2d57067df3e49f3a2a35ec8b6.npy +04379243-ae4367ce28f1e5d96917161dc6c05572.npy +04256520-d7af346415eebe008f36404f302c9440.npy +02933112-b31c1b94a2badecf43d2fa0a85ff9354.npy +03001627-533e0a52acd257bef27383fc5a5a711c.npy +02933112-b92e2c18c0eeb8cba80ff03f6dc10926.npy +02958343-eaf664eaf6b27cd1905f30c879d154be.npy +04379243-e7373d97df1216af869f35aa46529daf.npy +04379243-6d311facc6387a7fcd1233d74066ed8.npy +03691459-ca9ca5c5dbc82019e6bc953d57dcc636.npy +04090263-afc13a1565e027c5d735fa1ab17311ec.npy +03636649-3259e491870a8c49eef5d83b671bb264.npy +04379243-1686831b1e585dd9729c5ef452d153c3.npy +03691459-19ec27b0dc5e478e2a9eb0f146e94477.npy +04379243-2bb1bb0516d7cee747839bae1bc65257.npy +03001627-d2b9e98373e96afec8d65ca96e6b18ef.npy +04379243-54108a40e3e2f09b940268b86285118f.npy +04256520-3c61862eca2f0979febad4f49b26ec52.npy +03325088-426ae1a946daed5f76c18e71fd49c4dc.npy +02828884-8ad57afa55cebfe0dad433a29cb627ea.npy +03642806-9fa387d7f442b96e75e60c00fabe2744.npy +02958343-650238554cb16926bda733a39f84326d.npy +03001627-88ba4696c25632507b6a13c9370327f2.npy +03636649-9f0e6bc1fb0a97a6db493a050f0c45fc.npy +02691156-46d2373fa05a4876bc913a3935f0ae10.npy +04530566-1abf3b20f05ed8ea902d6f4ac8edb5f4.npy +03636649-a72410196463086561fc247a18f47792.npy +02691156-eee96e21bf51ee6ce719b5362fe06bbb.npy +02691156-db02eb57817e4b4d22362be7f5226e91.npy +03325088-653ac1e615b18b19b362845c6edb57fc.npy +04379243-64a7fae36a56705e3ae0df12be078c7c.npy +03691459-2cf41211ffafa4ea1f9f3ce366e030fb.npy +04379243-6373c7a17a41666219fb4103277a6b93.npy +02992529-da1fcb7a374f9c43397c13131c65cbca.npy +04090263-f82762004d55da3d265b6d46c677f2ac.npy +02691156-895e49f92ff5003032611f2edb791b8c.npy +04379243-14b250fe1e9d53beb97452240e92ab9f.npy +04379243-ebd353db403531b4257d13bddbc14c41.npy +02933112-da5d7b5dfa92abdace5d6e9371bb5c33.npy +02871439-7087c34ea40273ea734a703453e2dabe.npy +03691459-ecfb9655edf2b5297160646d65ba4383.npy +02747177-49bff2b8bcdc50dfba6cf6cbb9f4c2bb.npy +04554684-5947c6f05f5f74437b3ec0bc4f26f615.npy +02808440-9a2356d30def73186b448b8aaebb705c.npy +02924116-5ec24e802eb61e624d429997b4e3b64d.npy +02933112-595a8444c362be66b8803f6649e6cb9b.npy +03001627-6d54d175396e3a99b1aef914f6383f94.npy +02691156-8b0d9118e9e7dc3f95c9af648ce95367.npy +04090263-aa03af3233ff0be207c113ba65e29ca.npy +04379243-f9597fd50738ba45ba5342d638d0c267.npy +04256520-7606f7f0a8d6434f4b3c42e318f3affc.npy +03691459-4bf9f2ae5f3b32e5d74f2f4a7f5598c2.npy +04256520-f2458aaf4ab3e0585d7543afa4b9b4e8.npy +02958343-543a6562ae746ed45daf03c341f7f599.npy +02880940-68582543c4c6d0bccfdfe3f21f42a111.npy +04401088-e9ef88d72ead910b8b431083b6191e2.npy +03046257-a8cc05a9ec2e678d5eb2784f19b3d21.npy +04379243-899f815eaad62b56d8cad143689f8b51.npy +04379243-a41b3ec61751fdce6c28547eeaf2a8c9.npy +03593526-365d864e8c58391e62a510b8f97c658e.npy +04379243-581d698b6364116e83e95e8523a2fbf3.npy +04256520-ba6c0baa0a122f8ce2aa36c9e5ae7ae.npy +04004475-23fcaafbeabc092f921e793cb951210d.npy +03691459-19a8736130ef822b93dcf5e22ecc3f5e.npy +03938244-20655268b1709c8cc75ea4b124a227b.npy +04379243-59ee80e3af7a4e3df4b6538438a0b930.npy +02691156-46829981c5c25285bfc0a2c490b4c222.npy +04530566-194ea4b2297cc2ce90c91984b829ab51.npy +02691156-3b31e28ac1eb36fe1eb4be4ad34a6dbd.npy +03642806-bd879abd9b5c15d75d66db82418edc83.npy +02933112-23e3c2a2f61ddb2986d53ab0fe94e911.npy +03691459-5501c4caf22a5c974533f2e74542acda.npy +02958343-c24892528799ccf486b4d991d5310067.npy +02691156-72e68e04a203c96d873ec74c119307b9.npy +04379243-abef0c609ad3e9c2edea4b985280bcc1.npy +02876657-688eacb56a16702f9a6e43b878d5b335.npy +04379243-de2f120b21e228c2e6c5cd45aa112726.npy +03211117-1e9d554d26d4195f37ec10b15648a127.npy +02880940-188281000adddc9977981b941eb4f5d1.npy +03001627-3526528270d5f3f766268502c798b9af.npy +03636649-561853e6377361196afaa22adc38077c.npy +03001627-374e76e8b8357e5f796d422781cbc933.npy +04090263-6169b7bdb2a76d471ee416ae4351c7b.npy +02958343-d373922da2a6c73b616f13ee256019e3.npy +03593526-2886e2026ed9da084b3c42e318f3affc.npy +02691156-51f24c13e4af3e06b6e5b4d7b00c5b3.npy +03001627-3f7417590f1bcfded5c89ecb06d1099b.npy +04090263-12df496292b5c016f9489a342636086b.npy +03691459-4ba818da340a4e5d60647a90a03914e1.npy +03001627-13bc03eca6aad4b2d7bf6fb68df7f786.npy +03928116-887687ab426ffdedf7406d785bf36110.npy +02958343-ea37a9b97e092552b927782fc69a1fbb.npy +04256520-a6e9d5735c36b80ef4a06efdbafdd7ea.npy +04401088-e97033321b1930ed4391592096b033ae.npy +02691156-cf17d0ce34f09f572722fc1bdd7e0e51.npy +02933112-2b80c8d68550986bc59350d819542ec7.npy +02954340-8b2951e32e0906bb5f6cb4951755315c.npy +03001627-8ac2d831ebeab4896b7c7aa09852a4e0.npy +03948459-68cf8f5e1bfb9ff8e71e857afa9df271.npy +02933112-23b8cec330bc7699c59350d819542ec7.npy +04379243-c2b9613e2898f3381c7afcd6c011dc9e.npy +04379243-943d786e2df9251ec76aead7da70af41.npy +03759954-514024b4a66a57d592ecd319dfd8c5d.npy +04379243-dd35a3f0ba7c5f2e73ea70c16ec9e2b7.npy +03001627-6730f663d0e012506f525e79a05bbcb3.npy +03691459-b24c25a01d69adbcfb14bc0c4e180ab9.npy +03001627-1c45b266d3c879dab36dcc661f3905d.npy +03325088-1f00e3c311882a8866279f6cdc4d0486.npy +02801938-2d8bb293b226dcb678c34bb504731cb9.npy +04379243-82271bc614a76c28890992ddacc04113.npy +03691459-85eb14c504232ad1bb36a678453013a7.npy +02933112-39b51f3a6e8447c3c8a1a154de62786.npy +02933112-7e2e24fed142bb20310af74324aae27f.npy +02691156-94b0675bb9f2a7fdf8a8bda5d07839b5.npy +03001627-8577be35989634fb925bf1713cfe05c.npy +04379243-8cd6a33e6ba794419cd431573238602d.npy +04379243-53f6531e2fc2d31ab2c2cd006d206129.npy +04090263-249e0936ae06383ab056c98b2e5e5e4e.npy +03001627-4dbddd8f3f658821ad484915511ccff6.npy +04530566-df8fdfbda6e15f38fc740ecd0dc695a2.npy +03001627-c7bbb1dfcac15f43e33c1bced7bc2a7.npy +03046257-aac0d032dce735c7ded4c23d05709216.npy +04379243-ddc404bc12e45dbfb4e3935c6cee4b35.npy +04530566-dc0d90ae6a41e0acf68668364a569266.npy +02691156-e387c8d826cbbdd68a8dc9dc46f918a8.npy +02933112-8e42a0d11784c74fc6a5c971c030877d.npy +03001627-58f44c0057ae64b525633180ba767a60.npy +04379243-2ad85522947a9cf5f4ab13f4b49ac318.npy +02691156-a4462b31326da9493ea703383c665f30.npy +02992529-692e46bc27bcdcebbdc2330c91f5a859.npy +04379243-22c4449df36e20a025ca952293bf3fda.npy +04379243-cdbe8e456a3e3202c55161a63fbd109a.npy +02871439-e88b3fd502ab3316d42b9650f19dd425.npy +02958343-2f503625718536ad5d9d397842621b7.npy +03001627-c24ac9257d6392bcf284804023c6c8a.npy +04256520-41b02faaceadb39560fcec8f64d76ffb.npy +03513137-dc10f3b2b8cf3c8f3a0407ebaf7dd3a5.npy +03636649-46b8bc4b5b2a6094d46763ec4d902968.npy +04379243-c277ca4a9195df2ffebad4f49b26ec52.npy +02818832-e68e91ef2652cd1c36e3b2fa8d1eb4eb.npy +04530566-6dd448ee6a2288ff5a680bf43a0499b7.npy +02691156-7f4a0b23f1256c879a6e43b878d5b335.npy +02691156-28da27a6bebc81df62b600da24e0965.npy +02691156-1d269dbde96f067966cf1b4a8fc3914e.npy +04379243-4d45859eaf2627f5ba350d190cd1c00.npy +03691459-44ec5df88564c859e180a1a604561d3b.npy +02933112-878383dee814d727fd2b139960f72a73.npy +03636649-bb3c2fba4e1b712357ddce8e42aa6e90.npy +04379243-8c4d7014c59f619c2b1c5715bfc0f094.npy +03593526-c5351c4aa1011866cef8c6985387af2a.npy +04530566-ad251b2cd68290a41c9545c3c7193d55.npy +04530566-5d301491ba435b71257fc1c453f165b6.npy +04379243-ee00ed62953f4bd280afdc8bd41edec3.npy +03001627-d708c7ed9201ec45d29e20ec5f479208.npy +02958343-1151e7cd24f5bd21ccbd9e5bb82dd04.npy +04379243-c733e81695923586754784b56fb4c23b.npy +02691156-5c8b6d47313dae4fca1f1143bb6bc17.npy +03001627-8efb37e93b208234671d97b0fd17f51.npy +02924116-290387f7da9b702941567ce9c420c236.npy +04468005-35abd22f4961926f196c433756c6bebf.npy +02828884-e4f68fb5bdfb68e936a9515582552983.npy +02876657-ca2341f33cd4995dae7fdc0845a47bf5.npy +04530566-d19c003cf7dbf111543941eaaf04581f.npy +03761084-146d5859bbd8d629bbf88898fc491e0c.npy +02958343-61f70557b8bda7422ee0f9a97b71d505.npy +03691459-b0feef9f599d41cbb3d8c1107f6ae528.npy +02691156-bb244dba6323f80a126bd036879e7101.npy +04256520-aeb5447d59fbe49add7f28fcffe810f9.npy +04379243-1fd1d459e79ad6c1c3bd24f986301745.npy +02958343-97b9c8ae37e6480e1912cbd26ffcad1c.npy +02808440-eb7eae7aebd087323321831d2245cf06.npy +04379243-a48942e0190d14a5a8930422448288ea.npy +02958343-ff3c8e21a48ed17cc1bcae9def1986da.npy +04468005-3bc4944779090cd3ff790997f2048517.npy +04379243-6e96a8c237b549b6e3f7a74e12a274ef.npy +04256520-45aaa81cb6b7f1585e7dcc6fa9b3c324.npy +04379243-4d54165ac08d47dc30bbd4cddd04c77b.npy +04090263-177d48f6f156193bdcdf952acdf10f.npy +02808440-2b655690268f451a11fa1d2a0b030f17.npy +04256520-8169b36ef1ae45ec19fb4103277a6b93.npy +04090263-8128e1bfcc18d4769a3e2fa8a8e389f2.npy +02871439-dd1d4a486f7cdd8a2381fb852817e4e7.npy +04379243-9004a7d87a62e40111310cfb881ab9a6.npy +03001627-a06c4c2f4634ccb1ee928ba0d9f88258.npy +02958343-9c4a3879c71df693af0f25977186b501.npy +02871439-959b3402f426223bcc88311b3d194337.npy +04530566-b3aa94c4aac0534ec34b1b7198ff8321.npy +04090263-b84fadbc6f41cd0375e4eff9f26b7ac8.npy +03046257-4833383d30f7526fe30738a8d635be29.npy +04554684-52c23e4a42c5f058ffc6e457221b9271.npy +02691156-821309c2037b49135fab3f99161dc2c2.npy +02691156-c1aa42594ad2d80e4c3a35cee92bb95b.npy +03636649-b479c49366c4d5def2cdf09737c19aad.npy +04256520-b79a15077c4a662719fb4103277a6b93.npy +03928116-512b54ef050a7b4a11cc56dc4129a22d.npy +04379243-1b2dc847e12c32d4a430f20b4b0a337c.npy +03991062-ee0e42b157a8d8554d226702c1bfe9e2.npy +04530566-212a323fdfc0d8e59399f7cdb64577ad.npy +02958343-fbe6ff98196a8ddf1992fbc3c9e8b937.npy +04379243-795baddfac35711a30e44a4c4faa2773.npy +03001627-ed53217c9a4443b8a4ad5308cbfec5eb.npy +03001627-54237961055ef73782db9fca4b68095.npy +04256520-64702fcd98b04ad21206ff076758ec85.npy +03001627-1190af00b6c86c99c3bd24f986301745.npy +04379243-1b7cabb894adef68939793f922933b6b.npy +03636649-e0a99ab7c7a0d2d4e59f529cd1b6faa8.npy +04379243-4bbf789edb243cafc955e5ed03ef3a2f.npy +04256520-d31fb17a6a6515d5febad4f49b26ec52.npy +03001627-4e15234057b863dc659dda512294c744.npy +03001627-9897713e0efb2942f51f77a6d7299806.npy +03001627-b16dceadabff3976dec8d69f9356ec51.npy +04530566-e93d2ab44861bbd32a4947824596dce3.npy +02808440-8a7a7e70aa8961f4edd7686549ee4484.npy +03467517-57286d92604c9ebea3d3eb77b119df6d.npy +02954340-ed352b53b17b6119e762cf5917cef4ef.npy +03001627-7b01e2a03e614eba4710269d4bc18736.npy +03467517-1157ee852f69a82376d05024fabfa1e5.npy +03001627-bf8e44b58d2d95f45c6cb69e0968783.npy +03928116-ef752c493b9a41b21fd394f1bc0bd850.npy +04530566-85dbbed13875a3a2b90142192ec795d.npy +04379243-9b923ffa07f51fab2032a1fc189d2617.npy +03001627-2d1ebd7356968c0919fb4103277a6b93.npy +03325088-4c3fe77fab3730caec944ac16e6ab528.npy +02808440-c11ac2c84d7e8566b04f97563601480e.npy +02933112-7d9b7a4412d9f373c59350d819542ec7.npy +03046257-38c78a9f3f676878dda58cf2744aced9.npy +04530566-6067d0e8dda0b78c4628573ed5739806.npy +04379243-853c3913ba95570ba2651abaf391628e.npy +03001627-6b719f78721d1eb742559566b871c978.npy +02924116-992e27c87064000a163e670ececef2b5.npy +03001627-7885f87669b8fbc73f7e27638e63d848.npy +03001627-bd504539074e453721a08935eb37d792.npy +02691156-c69c73793f459a2c3d4b1f38e3dfce4b.npy +02958343-b812523dddd4a34a473f10e6caaeca56.npy +03325088-334025201d6536fcb362845c6edb57fc.npy +04530566-a5fa8ae8f743d5498052128bafa4f7d8.npy +04379243-785a68eefd1035f468661782af60b711.npy +04530566-887be2603a56d8acc13b4b8de5611825.npy +02691156-bbb8ec10b86465356630654359fc97d0.npy +03593526-d2f113f579d2c4c9b7e6746928016c6b.npy +03691459-82f1e500df50302e26870852082c4c6d.npy +04379243-63d1427d86f62c45ecc46197d5349c6e.npy +04379243-93bb999fd7e586199fd83fd2ba5fe30c.npy +02691156-c14cb2e75415dba59a6e43b878d5b335.npy +02924116-dc0601024a535f5c51894d116f1c652.npy +03001627-308b76aac4b518a43eb67d9fb75cc878.npy +02828884-89cb6473e1b3882af7436fe692c24f3e.npy +03624134-35233c0d786b5956d25d105fdf500c48.npy +02992529-f75e6866c8965374f1c81a6df84170c9.npy +02818832-50b21efadb3692347b0284d1ea60f713.npy +02958343-25d92177ec6bd745deadc9ca0263db5a.npy +03928116-c625f1771e40e374e1c27dfba919adc5.npy +02933112-a477a301e1e1a67fc2185cc0ca1b306b.npy +03001627-3eb9c5fb2a7ab54d490ad276cd2af3a4.npy +04090263-170574550b1b5c12fd0c2683cfdf8b6b.npy +04090263-4b5668e651a6a9664a4f87aa9a31cd70.npy +04256520-683fbc39025b9b75e71d6290824c2748.npy +04379243-7356817f2b175b80f7088fd42bf47c7a.npy +02828884-50db85e4889831dff155d75bbf62b80.npy +02747177-bf4e08fe5e07373ade5ce145a809def2.npy +04379243-80d80b73981eb265b30ae4347e74f709.npy +03001627-95d6aae8728a0aed70e95b2fd46626d.npy +03636649-6e3da73f16586dc56bd3645c59279a16.npy +02958343-d47353fc60390df85d918097f81825e3.npy +04379243-2eecafccfce0a14546407779dbd69b2d.npy +03593526-64a0985a86bbead9fe9d8ee1a924ac2e.npy +03642806-92702a4de72aac3e20685b5a7e34b501.npy +04379243-35803ad1072c4221e8b2b8dc0c816caf.npy +04530566-810cdbec3687a16e122e1a230357df67.npy +02876657-9a777a5f3701fb6b940806ade53ef2f.npy +03325088-ee2f338a166b799ebca5df27f3ec6373.npy +04379243-5a2c14bbfcd9ca4d68f8796d69d0c486.npy +03001627-88376e3d3a23d263de29d28278a34a18.npy +02747177-9b5eeb473448827ff155d75bbf62b80.npy +03636649-caf410661e9311299dd0351f01396cda.npy +03001627-be373cf14b9f9b77bb01e8d0bddd5702.npy +03001627-384861155b7786fcb21bc3cf138f79e.npy +02773838-cbc2328cadf8dc573394926146371698.npy +04379243-dfa86ce9f892793cf51f77a6d7299806.npy +02958343-42d960259838027461c806d3425b088d.npy +04530566-501154d9504b62b9da27170f98feb295.npy +03991062-f8b3230c97fdaa97beedb4c8fd29e2d1.npy +03636649-d08164b754c2f139b93e96f21cf0da86.npy +02958343-4c2412cf0f720bb9618e9d35559b7aa.npy +03211117-fa7324388797a2b41143ab0877fec7c3.npy +04090263-85cd554c3681ba40a24fe41bd648bb1b.npy +03513137-1d1cc96025786db595f577622f465c85.npy +02924116-8b7d52fc3a771047d0ecfe587dafa03.npy +02808440-215352e586ec6aa0b362845c6edb57fc.npy +04379243-7eeceefed2b3aa2794f3bda96cf548cc.npy +02933112-b29f2d0d278e938914038d588fd1342f.npy +04379243-1bc212abfc3ba87ae5c3f1a4056686f7.npy +04379243-8eba29bc85c8c830b4c161851ed2b4e4.npy +02933112-4cee2825142a64acde650492e45fb14f.npy +04379243-a1419b0cf5fd0c2c47fe5b27e60471f.npy +03001627-ea389bc8d94f87ad95db811b45a94857.npy +03001627-2c795b27253f9ada336961c9971d866b.npy +04099429-93d96c35e4a343d1f7e86418b9396c76.npy +04401088-719a564d600f1ab38162d5a2262f4a8.npy +02747177-330cdd681a0890b190fdbeabcd02777c.npy +04379243-96dc43fe4cfe5668cdb6b5e54fc64b6a.npy +03001627-736ef1325209503533d93f57729688db.npy +04530566-d8a72e6a9f34ee36b571511eb0f92ed9.npy +04256520-34bbfab80042b25bc1bc03f4ef8a4411.npy +04379243-62f75f68a559cd9c5edbe4a62f5ee3a4.npy +02958343-bebfba98a5e97c6180360680c1602c7d.npy +04379243-684ccc0f629ee45cab610b0c94236463.npy +02691156-bd6966d7d0beae75f5c7319b71bdce6e.npy +03691459-4ef6b09f9a8e1fb233ed13d3bda59480.npy +02876657-1ffd7113492d375593202bf99dddc268.npy +04379243-3a1a6dcf1900fe42bdeec9c43546255e.npy +02828884-b6de66042941f5691301e24e9e27a9c3.npy +04256520-9a24fd0d36ff856662e682c9809bff14.npy +03991062-5b5fc2f78d935628479e6e44e41a0562.npy +03001627-c10b1973a0d692ef910979f825490a99.npy +03001627-3b25f03d2f7be870fff16555386d173d.npy +02818832-f2c35e05e0759d2d946f8fe474296fc.npy +04530566-8fdc3288bd73ef58a127697b1776e4b1.npy +04379243-c49e9c8c1306d3a4f09a2b323d5dc94c.npy +02876657-e5a5dac174982cea2dcdfc29ed7a2492.npy +02958343-c54586fc90acb4d0a46498323e7a9af5.npy +02691156-42d9f626ba4bc61516c4bdb2c8eca27b.npy +03948459-43b1fefe6b13b3e849b3383f0d8ed83a.npy +03691459-fa09acded526a0105b1433436fd82800.npy +04256520-8c9cb8a85aa36620a5f9d52c12457194.npy +04225987-1ad8d7573dc57ebc247a956ed3779e34.npy +03211117-1d628bde22788cb74161e123a102b12b.npy +04379243-a04a7efb21f799f4c8bec3671aea0fa5.npy +03636649-dbe83cbb4cd5113c14038d588fd1342f.npy +02933112-4d36c59bd32fd885aadbf8208284c675.npy +03691459-b3f76f7361b123f5b3878cedd8c8fe6c.npy +04379243-4d873bf1a658dcd523eb3ad3d378722a.npy +04256520-1d4d7533d453ace4dae12f3947d07dec.npy +02992529-a9d358ce2d54d95e54c7ab6aa5674ccc.npy +02992529-55698d990b8147e33c7b6ed91d531bc.npy +02933112-233612a657bbda534da5feafe6f1c8fc.npy +03593526-e390d119024d6de9aca4186c3b7dd23d.npy +03001627-317a2cc9f3b54a48283b00891f680579.npy +03337140-9404bf7671ce9cc52871cc0b3cc1a485.npy +02808440-d7bfb73072d8a3fb54d7082b34825ef0.npy +02691156-72e1cdcb882b6993c1006ed55bc1a3fc.npy +02933112-836fc8edc0414fdd9925b11f2b3f86ba.npy +03337140-4ecbfec208b1aac12f84cb7932f866fd.npy +02958343-6e1d942233917ae996c458818630d123.npy +03636649-fa9a37d95fa8c6542beec56b24479ed1.npy +04330267-3586a28ad9ad3aa8230584014222e685.npy +04256520-27f8e4a89307406614038d588fd1342f.npy +04379243-5eba36c416524db2f42a90fe4baf4591.npy +03691459-529f3a898bd030f558b060a361031075.npy +03636649-13a20b16bb59fdc712e1ea5343ce0273.npy +02958343-22654a0cc1ba382c4eace6243432632.npy +04379243-fb2191ec35ad66da30bbd4cddd04c77b.npy +04090263-c2acfd34d7c030f5dce23741b366d6b.npy +04379243-6feac0a35c8f8626e73947fdf756a329.npy +04379243-506a09d327936cf8e2e6aa5366c8ffc3.npy +02691156-6ba642ca477a73db4c3a35cee92bb95b.npy +02946921-5bd768cde93ec1acabe235874aea9b9b.npy +03261776-a9661a8bb610d902957b6a4f3924d982.npy +04530566-577acbe57ebdcbbdeeb8eb76c515e836.npy +02691156-a4ca564574e55f1a66cf1b4a8fc3914e.npy +03001627-57cc406d478167a6a6c03a53cf0a14c9.npy +04379243-f41e9600bd8bcb92716a0dc6cbf69f91.npy +03001627-uca24feec-f0c0-454c-baaf-561530686f40.npy +03790512-7d75e8200565ffa7b37378f3c85478b4.npy +04379243-5b54a7ca6d758fa1e12186cc8c5022c7.npy +04256520-def69858279a9b23f841858369432cc.npy +02958343-d28ad2ed7b1ba665b1bb46d2556ba67d.npy +03001627-58ad41e336942bf3c5243a0ab191990d.npy +04401088-a801c5a24131f1842ed91d160fd4ae97.npy +04090263-da7f89368a80ce9e1f2a1daf140ac9f.npy +02691156-ccd448614257253cbc0909d98a1ff2b4.npy +03790512-ccefa6fea8b7a57281eb6e0cf97c3b0b.npy +02958343-2cbcc226b4f952f29e1c4d21c8ecae7d.npy +02808440-99b04530c2640e38571be7eae57ba8b5.npy +03001627-f9d050a51da1f3ed30bbd4cddd04c77b.npy +04090263-f1f0a765def9499c6a2345809e2bb169.npy +04401088-bf11938460e160c78190e4bafebe046b.npy +02691156-ed1a5c9fac829d17a6766282ea8c438f.npy +04090263-b85aa72e2d253f34e38850a3ae501b7a.npy +04379243-eb379b2b95e76502e258d1c3e7302e7b.npy +03211117-b6bb7bb5927798724161e123a102b12b.npy +02958343-ef966d85be54c98ab002e5b0265e7e9d.npy +03636649-9d66a6faebd46b1d68661782af60b711.npy +03211117-815060a9c109ff4659de6f0155fa4014.npy +04379243-dc291fbd5838138a833924252d812d1e.npy +03046257-780ce22d20547cc0f028fb77e2bdb0c0.npy +02691156-4eced94670d10b35e856faf938562bd0.npy +02828884-a7366461245f831ea764a25163affad1.npy +03797390-b88bcf33f25c6cb15b4f129f868dedb.npy +04256520-6580148c3214df2395ca4adb70946a21.npy +04460130-75ffcdedd253c62aa86cbf46be15aeca.npy +03046257-612f3199c6212e55a5aad165050e534c.npy +03691459-8d437b97fc1cc7bae9bba7108b76f097.npy +04090263-9445546f0d348b2ddd0a2071dde26395.npy +04379243-1799a85dc6eaaf48d25222e04574632c.npy +02808440-d8d89fb14672b3893321831d2245cf06.npy +02992529-283e3f79ecc4b74d1e4e60ebd003a0c9.npy +03001627-b9e9eb2d09981218d3c5964623f1547a.npy +04379243-9d5ffd7cc6f9084abd790f9b668aa24f.npy +02958343-7bf6249a031b5095ddd41159baaa3ad5.npy +03001627-6584413da69096db65ba78ad9601cf1b.npy +03001627-4707a1494196ef829917ad57402f53f1.npy +02828884-170b01ba7fc575aaad5067eac75a07f7.npy +02691156-112ca5420188df4bd90bfc986bc4c94d.npy +03001627-5e6d8f9275fc311fb7c42e403b7689ad.npy +04379243-22e3a5a8d22b268593ac14f56e1bb33b.npy +04090263-67f67bc8e340fb23cdbadd1af48b5cd6.npy +03991062-c78c54d03c727cbfdb497067d6c15d08.npy +04530566-4f16bb70a2c3ca48104d2711f226a055.npy +03001627-d7f35cad0f4ab17788dcbe86402c7c15.npy +04004475-12f86fe69336131b71df0fdd633b5540.npy +03636649-e35c7cd183a6de4a8bd5065c89cb7063.npy +02924116-1ccd676efa14203e4b08e5e8ba35fb4.npy +02933112-d0aee9e36e73a88a11fc2b865c2a185b.npy +03790512-818a641ccb945f6ecd03ad51b6badc3d.npy +03636649-f77e6d8f251887e9fcb8d8c6d4df8143.npy +03636649-6e5a9f4f1f0ba4a7beb83c64f2162734.npy +03636649-230c9e3d0e423ade7b7adc4c6de912f0.npy +04379243-5e5f15626f1f230bff7e95552a1d6a0e.npy +04256520-6ebad671c5ccfee94c02d21d2fa4d397.npy +04379243-98f00281db9a43aa6430c2c15987e4cd.npy +02691156-da26509e7d1864a162b600da24e0965.npy +04530566-724b7c80ebd318cd5a7da3f7c33cd566.npy +02958343-bf52cda8de7e5eff36dfef0450f0ee37.npy +02992529-f63a0d0c33f7a0c69a83e6b4ae8b154f.npy +04256520-3af6ec685a6aa14e2f99eeb199d54554.npy +03001627-c48bc68a100e8c24696b74614952b2d0.npy +03001627-bb04dc0b336abf4b263915c09bc4854f.npy +02958343-892266d574578810afe717997470b28d.npy +04090263-94bc0758fb14e8de104a9760d2a92bd3.npy +03636649-c78f6882973e616d2102429c788ba90.npy +03948459-4acb6494e3aaeb39998978df244b5bd.npy +03001627-522960d8c4a7b7f2e8f8c11a24c52ebb.npy +03001627-75135e879341721c1cf9f632ab9ad62b.npy +04468005-578ba0e5871fd931b8e562d273208aea.npy +02924116-259d331ad47b2fa7e96a4e289c6e6e0d.npy +04530566-553a28a8cadedc9344046d4d2ed11860.npy +04379243-b1cad66b13e1a1e7714531f0291497fd.npy +04379243-b17bfa9db55c2d2e4702663c3b3faf8f.npy +03636649-76da74f3a8f15fe8bed8734977b26c06.npy +04379243-11b110b37b1cbfd6bdfce662c3df88af.npy +02747177-269b2573816e52dad2b12aa6a0f050b3.npy +04379243-a18aa2d20d516333daf1f22b6daf05ed.npy +02828884-d46ca28fe271ef7bc5a208307819a3a1.npy +02818832-4a63f649cfb18cae67d352f95551668e.npy +03636649-28186fa2690df5daefe905a3f9856df5.npy +03001627-a0654bdfc12e9e1ac64aef1ba2bec54e.npy +02933112-28195efc838cbb6a4da5feafe6f1c8fc.npy +03636649-4b031808cc2b126243dbb6421d614c0d.npy +04379243-676d05aaaeecb8a04b3c42e318f3affc.npy +02958343-ea0d722f312d1262e0095a904eb93647.npy +03691459-2eb05cd394f94bf7944366528422e02.npy +03001627-be0c5a0e91c99e804e1a714ee619465a.npy +03046257-663e8f056e9ea81772e0da953d900dd.npy +02880940-89bde5319b8a7de044841730d607e227.npy +04379243-4b8c1a30a11197a831777a3afe490d7.npy +02876657-b95559b4f2146b6a823177feb9bf5114.npy +04530566-67adcb4dd6d1b51f3a2bf22c38d431a9.npy +04379243-7a2a0c5175ea17d88101accd22c701b9.npy +02958343-e8eb095ef1b65f96e26cab0dd65d60c6.npy +02691156-9f40666fcc14828abc2db24227b9dabf.npy +02876657-2618100a5821a4d847df6165146d5bbd.npy +03207941-e726e6409dc3921ff622709cb80f8ca1.npy +02924116-2359865685fad6ab1bc59ed4ab44a78f.npy +04379243-f2ac49e7de8898d6782db34fbe677487.npy +04379243-93cdfd14889492dd91a4fd87fee47737.npy +03624134-c19c47736309bed2ede07437dedab44.npy +04379243-c29137d144c96b17febad4f49b26ec52.npy +02808440-b23e03b24683b504cfc7935acf134396.npy +03337140-5e00f3509af8382c50cd753c91f38465.npy +04256520-d5a7ef075ff5e17a29f849a67b494905.npy +04530566-6db27ae2c9cf722d1743d8ffcf66c439.npy +04379243-9e84d2ed1fc4a0efc772d43f7a27a1e.npy +02933112-97b415cd78587de5fa29682ba98e856d.npy +03001627-59126ed88bf7735b1817f13b030c6f32.npy +04530566-2c68972ae4868355a6a720afea6887c.npy +02933112-225e398e99d98995b0c71e21a9386658.npy +04379243-273b600198cba2f840363d9858e1b6c4.npy +02876657-cf7a79435eb5b1bdb0be98650cd7fb6f.npy +03928116-c9fc3fc5c6cd686a5a2f45519a421de9.npy +02933112-2cf613433894022dc59350d819542ec7.npy +03325088-f0c7d88a8ee66e2ec36fb70296e45483.npy +02958343-a59c142ed6850a26ad4bd5fc1269475a.npy +04256520-b19003d682594a71d37a26a6fbb1c7f.npy +04090263-e21bcbde60deaab7716183d105fb8ab1.npy +04379243-23b43da125fa4dbd755c957ccb0117e2.npy +02691156-9cbbede82cf4f7e463a33dad5001f8d7.npy +04379243-5dff67091a2f7ef1ab988fe471b1bd06.npy +04379243-13b744116e4f23c340914702d8ab1d37.npy +03636649-a2fb35f872225ab2f6cbdab9ae1f93de.npy +02691156-b151573056013eaf71d03b466c72ce41.npy +03001627-96929d658ba1a01211ffd7c4e1c9d12b.npy +04460130-f3b26a49739b20a08b7e02a440eafc36.npy +02691156-d1a887a47991d1b3bc0909d98a1ff2b4.npy +02924116-9085eef376a744f5f88b61e9125676b2.npy +03761084-f8a7646ad61d3d24a44340bf227e40.npy +04468005-3b79d8815ec492076ef2f6739437286a.npy +02958343-b17d638e7def9adbc8a6c4a50ada6f9f.npy +04256520-6c74c7ab655d540dfebad4f49b26ec52.npy +04379243-41ffb4ec3d22e9dd9e7e7bd5f870f40d.npy +03636649-9113ec0bd742c5c5e86e8111763264e.npy +03001627-65e770a8307a9332e68b0e385524ba82.npy +03001627-37ea477f2b894c6ca72559fc4f86f700.npy +02808440-ee2b060177dcc12522f427296d72cac2.npy +02691156-47a40ce42bb9077579dc7d843e2be5ed.npy +02958343-554a04784b2f0eccbc513bbf92336c2a.npy +03948459-557f644e37dbbf8fd11c813bb72a58f6.npy +04379243-306cab12f4dc8a47f51f77a6d7299806.npy +02691156-9a878c5f0bfbd964d470a0056f762381.npy +03325088-832cd41e86b6820869a59c3b42f34f2.npy +04379243-c4621b03630247f816baadb9e8e34df7.npy +03001627-a14c7700cfc99b03ca6910e4922d61aa.npy +03337140-8f1fb3337da58dab91c352d02061b3f7.npy +03948459-44f2f626a4c73b216314c3b6a3a65519.npy +02871439-4a9731874f7472e2a3017456b64dcf36.npy +04401088-10a1aa2255ede06589b4abee87a908b9.npy +02880940-804092c488e7c8e420d3c05c08e26f.npy +03001627-79317a7ee8c26288ce265ed390193062.npy +04090263-a413fd3df8c6a915fb5c1b0f759e2bc1.npy +03948459-1f646ff59cabdddcd810dcd63f342aca.npy +04379243-a8840b65c6dacc627984fb9ec7e40829.npy +02992529-ae819b81ba34165dd6ec95d8e6b9f557.npy +04379243-16001e59100b03c5fca0560918d50ea1.npy +04379243-5b4a3107afc425be60ddc468fe733ed1.npy +03046257-95abdaa7c190243b75c7b38519066811.npy +04401088-6609f05bbe9c49172cf708d3028fb325.npy +02691156-ae857883c77d156b71d03b466c72ce41.npy +02933112-42689fe4a481168276e9713f57a5fcb6.npy +04379243-209e7d26bf9421cc9959d6de6fec7ffb.npy +02808440-b6ad2af249e6f779df87b9c01eb0d775.npy +03325088-24b8bfb0ce76421b362845c6edb57fc.npy +04256520-389751629226a005cbde89e0c48a01bf.npy +03593526-3e79d011230224283307b6a54feea334.npy +04379243-33c9515dc8f887bc664b3b9b23ddfcbc.npy +02924116-8fbfd6ab27e1b3436ca2b6e5474aad11.npy +03001627-a27db3ddc9bab11a5fceaa39a8353bde.npy +02924116-d68bb8e6b2c612ec8b645746fb0b699a.npy +02747177-415cae243e110f5cf155d75bbf62b80.npy +04090263-ffdcd1ea957aef3dc5e86946f2168706.npy +04379243-6d0ef6312f8af87a53e946fb2184f0c4.npy +03001627-b4bbc9d05c1872239abed18a788c862a.npy +03001627-11e0f0dfd3d0b22130ddb6ead95f49cc.npy +04530566-d00fe7ce177483ed5cb65f793213d431.npy +04256520-fcf030593c0bfac4f13ce777d031b4b2.npy +04090263-91fd0f24b4865bcfadfdd35441a4b4ea.npy +03001627-3a51a83963c167c422e8a95d8ef092f.npy +03991062-4616a444bbbf7858a2c59a4d90e63212.npy +03790512-f0c7043178a8a2fc52ee90e577613070.npy +02828884-c56c65eff860855def9373d49bf935b4.npy +04379243-d4063d86f6b2d27cd5b312abcf74b469.npy +04256520-4fa6c9c06efa1fe14156f0e87c6858f1.npy +04468005-62012118bf9486daea52501e96cfb14f.npy +02958343-b1c6a021c1c47884c9463ecce7643e8e.npy +02818832-1edea7d187858e2630b07c64830a47f3.npy +04379243-a1be21c9a71d133dc5beea20858a99d5.npy +02933112-34850728ad9af669490ad276cd2af3a4.npy +04379243-9046b2e610065fe5a5d95e73eecd308a.npy +02808440-c0b9dade20bdf5eb17bd6af98d7f8e7.npy +02691156-b725f44502906a42dc5a5a67e94552af.npy +03085013-d6bc3855da47fbc842e76de3842fd93c.npy +04379243-187804891c09be04f1077877e3a9d430.npy +04379243-3a990272ef4b83ca8d3e8783b997c75.npy +02691156-489d3e4cc3d790a0ca8607f540cc62ba.npy +02958343-8b8f4f12e5b142c016abce8cb03e7794.npy +03636649-579387a47297e1f4276206fae5d3c473.npy +03001627-6fcb8bf770b8606697e2a21b8bc2d948.npy +03211117-52e60434725b8bf8f0975d5dbdd766e.npy +04256520-a5a855d1b710641ba90692240cb38ca4.npy +04090263-12ccacc72630c2a4c4a6c34a09e62a92.npy +03691459-8f9c393fc17d1cabd77ea5e1afa5bfe6.npy +04379243-c9da930b808c18d0923ef79fcb120ce8.npy +02828884-dd1a375db7015e0ad6983f351200ac6a.npy +02808440-5406f6de80a4bf84fe52ffd0e748a1ab.npy +04090263-ca13a3342c397d68952d52701459b1f0.npy +03001627-96c019b564eb9cfbf3c9c1464e55d580.npy +02933112-350be7f9f7eaf2667dcf5135889d9f2.npy +02828884-e108673170d8f781d40c07d3c15cc681.npy +04379243-d58bdda16e6bba6f796740c80be6053.npy +03624134-c66c2c4dc16813a4feec58e9448e8e82.npy +04379243-17bd2a95d2c691326fb8d4cf06fb5045.npy +04379243-99f9eac72f5b4df04d31637b346f5216.npy +04379243-b14c4d5783a339609fd4171283f33ca8.npy +03001627-78ba9e32a9a5c276f69d13812ce67f33.npy +03001627-da5aa9fe015114731a1272c8e47f5670.npy +03710193-7410410cfc1684d19df6f10c48eb6cee.npy +04256520-c09ae0a971165afe4fb315ce917a9ec2.npy +04530566-f728f7efb5612cfe6be14c19eeda8326.npy +03001627-5bc916f8b9d0a7c6b40f0ac0fb9a650d.npy +02958343-d8879578d668b458cf899c77ac8ff2f4.npy +04379243-478cc8d5c72f2823d2ad39bada7a0a.npy +03001627-ea572cc193b804399c66df0f068d2a36.npy +03797390-b7e705de46ebdcc14af54ba5738cb1c5.npy +03001627-98b698b0253d933b72dadd9292b51ceb.npy +04379243-b9c5de845a1f5ccf23f93d9b8d14f53c.npy +04530566-37b4b837ca7da6a4561fc06c3ebd59d2.npy +04379243-e07c83841b933e74c5facc3cc8dc041e.npy +02691156-523f5360c3aa35b5e1c77ed807ff5c62.npy +04330267-e72944489018b7b39360ca51ac4aef20.npy +04379243-e0bf1408425c886da159545213d74ea.npy +04379243-2a8a8ffd2ef41cef20768660cf080d12.npy +04379243-a0fa360b6e9b22196db2ac45db35c175.npy +04379243-5844a7d413c48b3eb9ea118461aa8a00.npy +04256520-64895a5b618e8a6fb40f0ac0fb9a650d.npy +03691459-22e8cd8675ab57e26d2f7f4796305f20.npy +03211117-32be865d1baf7eb9ca4aaad7dc0e3a16.npy +03636649-86bcb422f12d4d17446ab9475f488764.npy +03211117-c16f53ea58244af7d5297776dd9015b5.npy +03001627-67d3a3eceaada710e400ee8c5c49a7eb.npy +04090263-afda81e011c79d183978e5bb605fb72d.npy +03691459-4e0dee54cd02258eeeb8d422649e5f2b.npy +04256520-8d5acb33654685d965715e89ab65beed.npy +02958343-b44b09bdef8fa2209473806fbdf65cb6.npy +04379243-12193ca7bef40d40a84aed1cd93567b2.npy +04256520-e92822b0b73f0ad6976792e9f0f98e95.npy +02828884-8bcf6b5dc0c19e6cad5067eac75a07f7.npy +02958343-a74409e07d1a9e1a2925dcb663974b0.npy +04379243-7a95843ecfa6e5b7c21dc5ac5592089e.npy +02933112-3d326cbd820a49443a9bf8c718fc345e.npy +04090263-c888076f7b8cb125550a87cda3436d95.npy +02958343-7a226f6c9c37c8f7253c03b7df20edd5.npy +04090263-792adfe42bcc28b36b12c93c965d90bf.npy +02924116-c84de00e45935c77b049a4dd81126be5.npy +04330267-7c3287c18d2cff672e57a20276f6e9.npy +04256520-a6ac0716e7f056579f2349486c570dd4.npy +03325088-e762df4624be42054c62bee40dcdc539.npy +02933112-1ceaae0aaeeeaa1e5a8eba5f6050bab.npy +02828884-2cce7ee3c360abbad2b12aa6a0f050b3.npy +02801938-769f607f748898c737ac8d648045f9c5.npy +03001627-510a6ee3bc0a0669c8101121c12c3f9.npy +04530566-8c0199fb20e7d4d391347c63d1dae43c.npy +04379243-7534b0ffb603e3c571a70be9f12ce8b0.npy +02876657-ee77714471b911baeeff0dee910fd183.npy +03636649-2ee70ee71a0b7caeb15194162f658e87.npy +04379243-5e83bcbf2cafd5663087f84b199fd297.npy +03325088-a8a40aa426ecf89754d7082b34825ef0.npy +02691156-c47954200b78fc32f677dde7945cba25.npy +04379243-832bcb192b80378fdb039d8689a74349.npy +03001627-933902ec014c6d487135fc51795b4038.npy +03211117-91db88d4d0956e92a9a12c50dc330a66.npy +04090263-4125cf5a6e85244f2bf266a8f0187ce5.npy +04401088-1e597e56b6b2fef6c331b59dc8938ad.npy +04379243-73ea0e595fe794dced787bd949919203.npy +03001627-5b38b467c20ac734f7c5e1744a5e6f5.npy +04090263-59b69d23c7a2f9568f12efb4f632da7.npy +03001627-51f1ea91a1cd7370b3fdb1a7c9a60207.npy +03001627-9ee4b9c97bcf4b3715dec43ae6a12831.npy +03001627-674122da19a75d9bca86e527b84d8854.npy +04530566-1d6d57f489ef47fca716de2121565fe.npy +03325088-c04fd0df2310b7653321831d2245cf06.npy +02691156-70f330ba02ad7a05bec2ed99cca9acdf.npy +02992529-e0d9622225e1361883b4bc86420ed21d.npy +04256520-2b69e899da0c15cfb40f0ac0fb9a650d.npy +04379243-4386633c2d2a1a2c5fceaa39a8353bde.npy +03948459-3da97809eca46f35a04e0afc178df76.npy +03624134-1897adf19953756d91687e259c21528d.npy +03001627-a1555d448a9d6fa0666bc0b629562709.npy +04379243-d6f8a3bdcd20146929e4b5aa807bb4e7.npy +04090263-6ce72fcd06e465a6cbc6ff5546f4ec42.npy +04379243-89fe1ff1b8de298752e8ff799642884c.npy +03001627-956dec7d9cb7d078a9fe51c710ac111b.npy +02924116-8b95e9545df064536436916a86a90ed7.npy +02876657-9012b03ddb6d9a3dfbe67b89c7bdca4f.npy +04379243-a797546d87b4a03bf4b6538438a0b930.npy +03046257-e75539f66fe4071e4858278d1f98c5a.npy +04379243-7b5544ecc31bc609a8e4e5c9426fb9cb.npy +03211117-9abd70906336af9c1c209b1cd3e81587.npy +03636649-790931b57e9513bf661713a114fc5367.npy +02691156-692797a818b4630f1aa3e317da5a1267.npy +04530566-8508ec8efeedf4a41ff8f5b5b24b7b46.npy +04256520-b23656fc9bf32eaffa22474bb826a278.npy +03046257-a0cac1c1e4de1434f51f77a6d7299806.npy +03001627-88aec853dcb10d526efa145e9f4a2693.npy +02691156-3039adb37c192644f8c6d04d97f8cf7.npy +04379243-f9e126d15c5761b29af4053b8815b239.npy +03001627-9e3dba0e6fd3408bf382e154aede1b6a.npy +03001627-713d9d23bb3eccc17fb8cf8a85dcfe23.npy +02691156-5e9129782c45b26992e39b8eae3e6b15.npy +03337140-1709429729eca32ed477567e8c8a6c59.npy +02691156-f5cc091bacb338c6951971f8370d9050.npy +03325088-b963d7abd99a0f9df94134d46393e640.npy +04379243-15490f254e6e226835cf289fa8ad7115.npy +04090263-f36f38edfbde85c73a04e41b7ea7de8d.npy +04379243-126347c2c4404eba96a3517f50eeb9f4.npy +04090263-e6ff26a9ad6f6321ec69d13496bd4a34.npy +03928116-c86b1da5558ff70a9949833630526071.npy +03467517-1416788a22ff5ffb1082f2ea630bf69e.npy +04225987-d4c042d11f29dffa1082f2ea630bf69e.npy +04256520-c06ec5cdf3500b6c965332f7444deb03.npy +04379243-3817a222e96acc4ca78510b72d2281ea.npy +04379243-7edb9183dade5413ae685ca100c909e8.npy +04379243-e692a96adb18ae3fce101336817a135f.npy +03691459-68d5652dfb91b82fa2b4280235a76885.npy +03790512-8a5175f5b9be6f34e91fe7b067344e07.npy +03513137-d8b02a2ef9de06702e85eab6bca44d5c.npy +03636649-ed323758d0f61cfe6085a0a38e2f255.npy +03325088-7bb78658b34e569933264edfcbff9a7.npy +04379243-6eb19c354c19e759d5883ca9b41ac387.npy +02958343-3da0d2ecb594ceae348b30181b0729b3.npy +02880940-ed220bdfa852f00ba2c59a4d90e63212.npy +04090263-36dee5893da238565dca6305fb9f97ca.npy +04256520-9895736717c559ad48d8ff57878739ca.npy +02958343-aa5fac5424a05c6be092951e627bdb8b.npy +03790512-42b5ea257418825b5c11b538bde9e3f1.npy +02958343-259bf3c89b0b2152c1f18a2d53a6674a.npy +03001627-bbadf45aa419015c7e4d369f13ed434e.npy +02958343-6d89098a33908cbd77b59844decf6d46.npy +04379243-1ad672c0a138f8ffe286a7dded929c2a.npy +02958343-8e05e4f955eaf140ff673973a435017f.npy +03211117-1d9f55b1651c5190a3f4a96ccd277d49.npy +04530566-6a65cd6bd6897cbb42df9eeba89a416c.npy +02933112-8093937b9072e92afab6e40cce6926d7.npy +04090263-98f15a80dc5ea719d0a6af9bfb470a20.npy +04379243-8d35df98a26e8317a193550461f84122.npy +03325088-73349e2e4982b3aac36fb70296e45483.npy +04256520-7e7c1aca9d7ce7f2f7628281ecb18112.npy +02691156-79784107e5be61a562347b4731688b0f.npy +03691459-79267b91b523933d73e1b2d018c0512.npy +04090263-45f3755b324a97803bce1f290fbeceb2.npy +03325088-b53baa693c98951e589577ccf07b31e7.npy +02958343-6232fe1824a6d1775b72003cd427d0c1.npy +04090263-efe36ad683de3640a5aad165050e534c.npy +03710193-f0d2c4725d7c5bd037aa26bfaa1093ed.npy +04256520-6262bddcd8bafdac3bec56bff764ba78.npy +04379243-c11167eda66f60f219fb4103277a6b93.npy +03001627-df7735e2bce09a511f98c0761af40e04.npy +03948459-254c2310734d6a5ce3cf43faf3d38113.npy +02924116-e9c2ef4bf977b1b8d8b621afbb58ba75.npy +03636649-df4e44114543e805fcb8d8c6d4df8143.npy +03001627-810cac0d137efb1d21bdbc0445d9f748.npy +04256520-e4c4c35bffae3ea375a82b88fe6e733f.npy +03001627-8b54af871a3ac77c492d9da2668ec34c.npy +02933112-b8e019587c8157041a3b39b07e4b3d0f.npy +02691156-1896f1f8724aff33b7ea0a7ab024f81e.npy +04256520-15d2efe697d229aceaf288f952624966.npy +03001627-9505568d7a277c7bdd7092ed47061a36.npy +02958343-1f8aee726cbf44c23d27832ab9ea6d92.npy +02691156-a61d4ad108af6eecca8607f540cc62ba.npy +03211117-4a8e7bab0b1bcf77103e42d04ec345ab.npy +02691156-5de2cc606b65b960e0b6546e08902f28.npy +04379243-c24b7a315dbf2f3178ab7c8b395efbfe.npy +02828884-3bc45b4fea81c02463b2acb037dfbcde.npy +03636649-456a6dc3d369a749519f3f3e6cd6d1a6.npy +03001627-32788564558e513f7628281ecb18112.npy +04379243-a13c36acbc45184de76bc197b3a3ffc0.npy +02958343-bb3c68db5dc0052e98b54df7430097ce.npy +03001627-a122cf5d1e23e88d72a5c49c981e6593.npy +03001627-b60fb4126e9e7c2aee3907b60a74e8f8.npy +03001627-e2ed8de5542c5fcd215a29c5523c5fad.npy +02691156-7fa1d1bd456f0fdf6e68e46a69a2d96d.npy +04530566-33f7a4ca412285334616fd0dc3d5279.npy +02828884-f2916fe6d5f06678ad5067eac75a07f7.npy +04379243-dd6e80140b3462f4a1b2e810c76f942a.npy +04530566-1c7f49bab676187480901e43af4435c7.npy +02828884-1dd7409c95d59d0da192483aa282f8e5.npy +03325088-1e5712458907fe06b362845c6edb57fc.npy +04090263-2d34668468d0b542612389706438d0e5.npy +04379243-8c2ec4b15289d88cc5d1c45cadcaa3eb.npy +03001627-3795f02c9818a7213b407f4857c15d98.npy +04379243-2f3557438a95798fb76e29c9c43bc7aa.npy +02691156-dbd0efc89242cc9318de900bee20377.npy +03211117-771a0b1638955f3946f539968f885949.npy +02958343-28fe2af4fd6ab3848772afa45900d07f.npy +04379243-1ab0b879f52e7cbe958d575443776c9b.npy +02958343-c4941d6a2266813c3a2b1a2e5e169910.npy +02691156-5ab5f03340921fc8b96ae1a0a8b84ec.npy +02924116-f350f3e3bfea76429afb67dd284d342.npy +04379243-cf46448f9ef495c81d022067655f6c16.npy +02691156-70ae0521d5ca428d7b3d3cfb30f2513e.npy +02691156-cda1206f9460ece9868255f726935f63.npy +03624134-24052727fc20af3723323642c1ad333d.npy +02871439-d70d80e5855785a761b9fd1751b9fcb.npy +04379243-36f771a41910dd89fb713eaada66481d.npy +04401088-6f725c21e92ae3e8dfac5fb05629bdfd.npy +04379243-38ededbc1b3693cbb9aafffd8edadb6c.npy +03636649-c6755ed48456490d2744bf8869518694.npy +04379243-a7809c62e26301e08850ff5e612b6198.npy +03085013-56794ac8b1257d0799fcd1563ba74ccd.npy +04090263-299416940399c3729d05095e3aff5e6c.npy +02871439-80b9e4e048733c2916421c9121bcb0cd.npy +04090263-78dd4dc65639258cd735fa1ab17311ec.npy +04330267-f16c01b6daab26e5f05f8c8f732a9858.npy +02691156-260305219d81f745623cba1f26a8e885.npy +04379243-1328dc6429d179d056f6ef8b6ca8f4cc.npy +04379243-cb1cf4ec74b4aae217923568dcd460b1.npy +02691156-22d36043ad59ef026edd138a394f7c4d.npy +02828884-6aae683396bc08eaa4b1640fdb2c85c0.npy +03691459-c0de25758444d71f77818a0572bf1777.npy +04256520-7bc386f19f261758664b3b9b23ddfcbc.npy +03691459-7f1be3e7b6adeeae9bb399e812556da2.npy +03001627-68b88c0be088c21d5e0096fb2d3266a.npy +04099429-fa07813a89527d195d1df55cbe0874aa.npy +02958343-fe7c536197065436b3030c76de18d16a.npy +02747177-f8b449eee1c8775fd2b12aa6a0f050b3.npy +02924116-13339384a87e3557b1626da45836ca54.npy +03001627-df28bda265e0e5bd2d282edce951a03f.npy +02773838-f5800755a78fc83957be02cb1dc1e62.npy +02691156-856a4d86ea105d97be13ce34aa7c0c1c.npy +02958343-8fc2691025a48e21381a9e1cee6d0b00.npy +03691459-a34c80e1f6175711c9d5b08933b9e0c1.npy +03790512-e1dbe3832c41e45a8f23c5d2712dcf1e.npy +04256520-523daab7896a34ed65234765b3a00e8c.npy +04256520-1c2fa78dbf2d2cda9e02fc85f824870c.npy +02958343-d1e2f84cc473956696e59b6a2c87ca55.npy +02691156-352a8e4f2023b029dcc75fd1795fa3a5.npy +02828884-35908dced5e46b32ad5067eac75a07f7.npy +03001627-9aece6c6436cde6fd9ac1bf1eddffd24.npy +03001627-ca5d7ee5cc56f989490ad276cd2af3a4.npy +03001627-114f72b38dcabdf0823f29d871e57676.npy +04530566-7c4ed531d1ecacb156258bc213b2f9c6.npy +04256520-afd1b4501cbda28814f62593b9237aa3.npy +04379243-5740806aae21635034943af333340cd2.npy +02958343-c8fa4fd7fc424121932abeb6e2fd4072.npy +03642806-57f3409e6f6c2dbc73baa2510487646b.npy +04401088-657fbd67af945c39d9e3837723c05057.npy +02924116-831d5d480526df85f991e1d909fa63e3.npy +04468005-7a8919f9d2bd7b2327745e9b6b461e93.npy +03948459-46093a3a5f168491e1f2a1daf140ac9f.npy +04225987-d041334fe322ed211082f2ea630bf69e.npy +02808440-97cc75a511c0e11b54d7082b34825ef0.npy +04401088-2d3208fa267160862c611effe1bec8cf.npy +03636649-a911474d0fa043e3cf004563556ddb36.npy +04530566-61eaa4afe332ba113547ed4d05d19f04.npy +02691156-934e5dbb193dab924d02f09e7a1a5b28.npy +03636649-a7f67a2088ce033f3ec7ad443e0ae81e.npy +04379243-1fe806fc0004aae877845ad7d2ecfba.npy +02691156-95f7a9754cba79469a6e43b878d5b335.npy +03001627-87b576eaf04f1b62305e886266e302e1.npy +03797390-546648204a20b712dfb0e477a80dcc95.npy +04090263-5376c38ea63848d643b0dda994f793ec.npy +02876657-9d2d3a8d1dd877c1101343fb67a1d189.npy +03001627-c98b7e1952c2c7bb85f6153ed2033a1c.npy +03046257-57e7fc194e77abd5a8ca6a1b83e76dec.npy +02924116-c2c9e1682f395fb051894d116f1c652.npy +02828884-ccc1d51eabbf589ad5067eac75a07f7.npy +03593526-aa638e39c28f3a184800dfbcda5cce3.npy +02958343-52a1d23a09e38c4d50577cf04f3bf74a.npy +04090263-7d2adefb8872fb564d73c4d754d3623a.npy +02808440-591906b60da78a063321831d2245cf06.npy +03001627-4159903eaecd9560fdac1e69603928f.npy +02691156-56ed0ef0864d18c2f5c7319b71bdce6e.npy +02942699-1cc93f96ad5e16a85d3f270c1c35f1c7.npy +03636649-5bbe3658e49eece0b49beb995c4209b8.npy +04379243-fd42924378694d9c2554f2f6bda30622.npy +03001627-22ada577361ed0374b3c42e318f3affc.npy +03691459-c73bd84347cd8fc9599d9c8430d600ff.npy +04379243-df38d8c2f3b36ff76e4b69f8ed4dc344.npy +04379243-e7c9af90b186c098490ad276cd2af3a4.npy +02691156-d64f391dee878277bd46d022fd7d80aa.npy +03001627-dada2389e96606307aa7cd663df90f18.npy +03001627-e467cfa616850a4a990561fc34164364.npy +03467517-83c5644f07ee55906f29623db019b549.npy +04256520-192ca330a80532471b17743c18fb63dc.npy +02747177-5982f083a4a939607eee615e75bc3b77.npy +03001627-a724a8b2ea1ef63954a8e7cfdf35a7ed.npy +03001627-796903c53c6de2025213cec267286d18.npy +04379243-ea367e390741fc38dcfcef693e7ec696.npy +04401088-878135eab6ae9aa181471a5ba59fd0fa.npy +04256520-f813edee6c5acaff4fb315ce917a9ec2.npy +04379243-aa97318224630a33f51f77a6d7299806.npy +04379243-25fc395dc873bb478a252571106d569a.npy +02880940-3f56833e91054d2518e800f0d88f9019.npy +03001627-7e7c1aca9d7ce7f2f7628281ecb18112.npy +04379243-8654b644c766dd23d1dcc55e36186e4e.npy +04256520-113a2544e062127d79414e04132a8bef.npy +02871439-dc4398c59766b2e8d42b9650f19dd425.npy +03001627-764866604b035caacd0362ae35d1beb4.npy +03001627-776c1d1857a4ea3d853c3fc864dd58b7.npy +02691156-a231f85d38f2b52154eefcdc602d4520.npy +02958343-2f0ca88dc76e39a7ff1370452e3a0154.npy +03001627-6455bf241fcbe3a03adc3470b30138f3.npy +04379243-aad4591952dd151189485cd87f37f89f.npy +02992529-5e5c0391952208e81213f8f7891e7fa0.npy +04330267-18943947ce3b8cae8a94168388287ad5.npy +02958343-473dd606c5ef340638805e546aa28d99.npy +03467517-e15f472709c535382c8ae424ae73c66.npy +02691156-958cc8251e6f7d8fa9b2becd26dc2fc1.npy +04379243-f37310698d465cf8c8bd09537246ca3a.npy +04379243-229af4d0700b3fab29f2e5c9212b176c.npy +04090263-ad0bdb0b1b0c8077b4cdad9a5bf52dd5.npy +02958343-edb2ab8a1d7e20f36436916a86a90ed7.npy +03325088-839b652592f066cd31ee592be5c5c0f1.npy +04090263-8690ee57423c0e591f3140bdc5d4932.npy +02933112-19dd35ef180808c38f1735145fdf5c5c.npy +02946921-b6c4d78363d965617cb2a55fa21392b7.npy +02691156-28711664a9d08bae46322bce65ca3756.npy +04401088-ae942af3b88d07af2c557fc696108818.npy +04530566-13a9352a47bab8c98cfe472915a175bb.npy +03642806-e555880523dc11425b440d1b0fe8ea5c.npy +02958343-2be8bd6b150a9fee97df6383472cc5b6.npy +02958343-2fb155f2d36541b5e3bdba9430565083.npy +03001627-124ef426dfa0aa38ff6069724068a578.npy +03337140-8b3e462e8050e8f8e4e346ee2650d150.npy +04379243-a79ed851896a40d8c10555abb2efb430.npy +03636649-5a957ade80507541ff2c92c2a4f65876.npy +02876657-2bbd2b37776088354e23e9314af9ae57.npy +04460130-a0cc96c45bc569d9ebc1e59456a1eaad.npy +02876657-1ef68777bfdb7d6ba7a07ee616e34cd7.npy +04225987-95c69877104059fd1389cf37af584e4b.npy +03593526-bbb981cec11e59771fc611122dc20c0a.npy +04530566-707f009ba421780c2af11d59b11e0199.npy +03046257-d3676f524d86dc1d6463df620b7b4cbc.npy +02691156-b7b94613ab6076a2a959294e5fb80cf8.npy +03211117-9740d1752c70a41350577cf04f3bf74a.npy +04379243-6a31302378d14412d42ec7e303174a87.npy +03467517-ff18697f9ce909311082f2ea630bf69e.npy +04090263-7b6a6e33903b1639a5772249c0d44247.npy +03046257-8e0c621551e9ace310eab5c01cf505db.npy +02691156-1284eb71b82f6794207f77cc6c79e3d5.npy +02933112-178529522942bd9e11fc2b865c2a185b.npy +02828884-6b9d09fcf8998360a36fa9e07c662628.npy +02808440-8a79f6c9e4e6badc26ab2d6bff19a0af.npy +04379243-15647d8895f78f6096a3517f50eeb9f4.npy +03467517-1a8512735ed86bc52d7d603c684cb89e.npy +02992529-cc3f77485b8a18db562c8e1ac545ef78.npy +03636649-9b0c6f3ee4a7965644b289cb940133b8.npy +02958343-b156359022f172578c844a5e3a5e1a93.npy +03001627-39c2f4690aff8f049a45ed2554d2f93e.npy +02933112-5984042b95305aee4da5feafe6f1c8fc.npy +03991062-707224831466c848368b14e48c164a6e.npy +04530566-4bcb45bdbf0309201d2d2f3b717d35d5.npy +04090263-931f74bd98683d493a04e41b7ea7de8d.npy +03938244-adc12b60e048f81b283b00891f680579.npy +04379243-61c9711cf5308ff98d4b556335cc5d64.npy +03001627-d9fe499372f2156fc0d328376073b25.npy +03642806-7d2718656efb3920d1954a7ac233ac80.npy +04379243-905ac0420ec18c415aa4c6e8ff29695d.npy +04256520-86ba626309daedc8e8f8c11a24c52ebb.npy +02958343-cd24768b45ef5efcb1bb46d2556ba67d.npy +02871439-c007d1b4972f70102751be1fc72418bb.npy +03691459-16e0041bffa976462d563c85edb49108.npy +04530566-8c611205ba2d189068b6f3ae18faf6b7.npy +03001627-c47b50988fef70c9220c18114ccfb3af.npy +03624134-e9280056548518c0ce7c7b3554aba2f8.npy +03001627-a3aa7e473a8059133087f84b199fd297.npy +03636649-d450da2cf4d0b79bb20310112468976b.npy +02808440-ae1a11d1ca89ba26e863737836cd53b4.npy +03001627-fc7b535acdde11f4aa3e869226c9586e.npy +03001627-1c2caacac14dfa0019fb4103277a6b93.npy +02933112-124cd036611b65b514038d588fd1342f.npy +03001627-fdd21f7f2ca9f0bcbdcbca499b446e89.npy +02691156-e58010dd5766e0ce78f081615c34707c.npy +03001627-2ab159f83754a93ea6c03a53cf0a14c9.npy +04379243-d4b3c13ec756196f94b77d9f59f49ab0.npy +03211117-b0cc3e614afbe6546892efe917403e6c.npy +02992529-11f7613cae7d973fd7e59c29eb25f02f.npy +03797390-9278005254c8db7e95f577622f465c85.npy +02958343-857a3a01bd311511f200a72c9245aee7.npy +02828884-d7025b55fe15337ed7c5502d4a22edf5.npy +02808440-a44b0784e8f0c72d8a1b2423d95562a8.npy +03001627-239c363cbe7a650c8b1ad2cf16678177.npy +04256520-afdb8885328a9e1e8cbb8bac2032149c.npy +03337140-220844159a323ead4c3aee8e9d3a6ffa.npy +02691156-f70e5f2568e927147d755f57c8fea340.npy +02958343-37887931377037621f71e734a2d317fb.npy +04090263-99cd8bbe5b2f92fc643ae903098a314.npy +02828884-f397f583f459134030c983bcaf68f0ab.npy +04256520-b50c0ff1aa497809afbd772c78d05c2b.npy +04090263-ad8abb01ee9066b425c01bf8ef97ff0.npy +03991062-56d1efaa9b9cf0a85706d1c54190f27a.npy +03636649-4e0aabe8a65ddc43e019184dd4eea7e1.npy +04090263-a4ba46bca40afb3722fb813d47b359e3.npy +02958343-53d9995a0b94fd37428df271ebc70bc0.npy +02691156-6826af6513566b12f4aab844bf68e35e.npy +04090263-4aa568a12086e742fe773002d2182b7e.npy +02924116-3d5cf6ff4603cfbdafd9b08701d71980.npy +02992529-20e5a92f95731f04c4440dd41b08b3f4.npy +02691156-1026dd1b26120799107f68a9cb8e3c.npy +04379243-316863fc4ed4dcf7251178be84deb2e.npy +03001627-131abb0b13d6c5b97f0b1e4f6d35b0ba.npy +02691156-af188ff4bc1ed0693faf1ff99e423b8.npy +02958343-90dc895f52bdd3a748d3485197509ddb.npy +02924116-17fbe76eb329ca1f481aa8b5531c68a9.npy +04090263-c40d62605e84c6beba1d8c8cfb70e106.npy +04074963-759c3e99588cf5c7a25c3f3b8b3a059a.npy +03046257-51184ef0d515b5f2345b53c800e94980.npy +02958343-6dd48d74d8bc67e7a7fd25564c2e888e.npy +04090263-b3f0d3a6734e040be658483f9f1a085.npy +02958343-a6fe523f0ef082a2715e04edb8af9c53.npy +03636649-d456beea1501f278f70220cd6be776f7.npy +03001627-bdacb728b23fc758fc0035da39bd5e1.npy +03624134-b61c9b5f29ad581c860a45e027159a9a.npy +02801938-adc09c0ed058fe5f4725f67267e31c89.npy +03691459-400fb89ed6cc3d2bf1acfa9a5200e941.npy +03046257-395ec392bf1764d8eaf14273fa406ffc.npy +04379243-8e5bc7946066f431ada975aaf86ac85d.npy +03001627-8e581e01a8b742214e3003b3c5dcc179.npy +02691156-faa361f642620bb72def37e9c0b35d0e.npy +04468005-5a7c58285f656a47ada7c0f51e9fb493.npy +02808440-3121fcae458eebe383797e9920834fab.npy +03001627-103c31671f8c0b1467bb14b25f99796e.npy +02828884-ca4bb0b150fa55eff3cd1fcb0edd1e8f.npy +03325088-a63d9ab718a0427fc36fb70296e45483.npy +04090263-8ef53ef4767baf0d9af0e0a4fa12498b.npy +02691156-556363167281c6e486ecff2582325794.npy +04379243-8d07df2bf706cda58c5591114064d173.npy +03001627-2a1184b04dd8f30e3e92f39ce48d644.npy +03593526-3bc220b749489ffa89035c25f0dfeb63.npy +03593526-d20501ada9005a3fbd16d4490a10a752.npy +02691156-9a3b5fa35243504124f575085333a65b.npy +02828884-e6a3b8946b66b83065ba78ad9601cf1b.npy +03636649-93a984496599a5b82b151d8b52c53b90.npy +04401088-4f3c84ef24e1fe6f3b41ed175964f6ee.npy +02691156-fcc2023fd98e157f2d99c69702933ca4.npy +04256520-cd5f02ca40330f18febad4f49b26ec52.npy +03046257-7c1296df0dc164abc114ce436933a33c.npy +02747177-bf4dd114b53bd8f0d67352166d8df9fd.npy +02818832-a7d64e6a7223641733b13410d81359e4.npy +04379243-e8c92eb88e60460e9128f82277957970.npy +02691156-789f032dccc6092977b7d0d4764c121d.npy +04090263-d945ecdf7613bfe0c7da109ecb5068a0.npy +03001627-7fc52894c0d1e26dc433ba3e0e025e8c.npy +04379243-8e33e392d91ecf1c668ae11a7db5e82a.npy +02933112-c21853b4876b7078684b7bc3f8a9aa55.npy +02958343-1e0ada2b1891ea39e79e3bf25d5c768e.npy +03211117-d1fe596d83fc231ef300ba2413f318b5.npy +02828884-b2ab0b13c344132ec569803a3242d4b9.npy +03001627-601cddae7aca083a2db431502a680805.npy +02992529-7bd9b1b1297013ed65f78a217bb320fd.npy +03001627-3ab0a1dcb23aa0f620bea10952746d3.npy +02958343-2c1c8c4aee1e79d52aa494042b7c9db.npy +04090263-b1a6f690b8ae5ee4471299059767b3d6.npy +04379243-2eb503dde3cc027d86c701087a194026.npy +02691156-adee8f091d7cc677508af777f11ed409.npy +02828884-a8be828647ebc817abeb67a6e14a6d65.npy +03337140-de40f8e4834666b94c3aee8e9d3a6ffa.npy +04379243-44e4ff8c96e5864742d23b95defe1ce5.npy +03467517-9aa333a858848cb685a8bf3411bdb83e.npy +04468005-987bf24137c0d0d2c9b18c469e002c35.npy +03001627-a0d662f047378406a39cf424b6103cce.npy +02828884-d94b57d9a5d0b3732056b4bd5d870b47.npy +02691156-2b96f4b4896962473eb731541f9f8d.npy +03636649-d8d129b1a07b23b7a738de48265832af.npy +03636649-d87a2d766579f15e38b27a25d1336579.npy +03991062-3306b6e41cd1e40e7d257f312237d3ef.npy +02933112-584de35ad1e27820365f491f6e3dbc3f.npy +04554684-50c639910aa3d75f29d8eecf3827c486.npy +03991062-17235acddd0fb5a6cb2a965e75be701c.npy +03636649-8425fcfab0cd9e601f0d826a92e0299f.npy +02691156-3f9cab3630160be9f19e1980c1653b79.npy +03761084-ba6d0df5585528369a16c253ade435df.npy +03211117-70df1655d1e766ece537be33cc045ee9.npy +04090263-6d4bb384945e1a95d5388e4d9f5e09f.npy +02808440-6c122d48d254276f3321831d2245cf06.npy +02808440-c45f6c706330e9bf3321831d2245cf06.npy +02691156-e2275ee8d6b175f2f446f92b52bbd82a.npy +04401088-7ab7f36fa3523a1a33c7b6ed91d531bc.npy +03001627-2249c62788a52c61613f0dbd986ed6f8.npy +04379243-75aaea3b26362e7a659dda512294c744.npy +02747177-6a1b359efc20cd1aaec6ee5ba573fa6d.npy +03001627-81c291ab8abc1d0172b24bdfca058442.npy +04379243-3d7a9a28bd6b772a878cf98f645da333.npy +02691156-f40467cbad9ca466eb7d375d58cb985e.npy +04256520-2b64dbb623899dec7bdbd1926dd38bdb.npy +04379243-a414a3468a40d91027a4a1658277b4d4.npy +02691156-52a6ae9074397d5f65f50257ecdfa5c7.npy +04379243-ae632e7cfc0bd3a861687229b61f22f8.npy +04379243-f624b401d623b74a87b2f182070d92e2.npy +04379243-e809af47a0255110855931d119219022.npy +03046257-afd459e16aa2f8f438e5ac608a19dac.npy +02933112-634a4ad6496e20dbc3ea9e7b2ba79cb1.npy +02958343-263e3ee9f0182cc48e35db9103756ad5.npy +04256520-2e12af86321da41284e6e639680867d1.npy +04379243-966cef675324e416cd415550f639925.npy +04256520-adc4a9767d1c7bae8522c33a9d3f5757.npy +02691156-cc0c7bf3f0f598db2a9ab3cbfdfd536c.npy +04379243-e8c01f71fd941af11190e285a2cbc9c.npy +04379243-bf2a153556edcdc96325dd85752d9221.npy +03938244-757be11305637a815b68a464a9cbfadf.npy +02992529-61e83782d92bf80b7548281e465c9303.npy +04256520-4198c7de2a9f450bf07fee5fc5c45ee2.npy +04379243-66d7c4e6ba6c4d415963245f0923337f.npy +03761084-2ebe8d4adde5172dc4ffd3331f849437.npy +03991062-9c00e85febb3950fbd353c96f0f6d633.npy +02958343-f7cca46c4c8efdc6fa5eb13ccb8cd2c6.npy +04379243-ba444152722b67444b8710a3469971b1.npy +04090263-df0c9cef42873e71d2888692adb4769e.npy +02958343-bacf0105f617a750becf71e2e014ff6f.npy +03636649-44e442591f82cd4cab0ac374f450cdc.npy +03325088-82c9b22a5f1f0999b362845c6edb57fc.npy +02933112-429536832f2f4e1abfbd6f1ce8dfb216.npy +02808440-fa02ef26c333e469b362845c6edb57fc.npy +03467517-f1a405948649acf919dabd0465d1d64c.npy +04256520-aed821e5939f74a461bf0ba277ea473b.npy +03001627-7ff1b0ac88baea05dbbc9440457e303e.npy +02808440-bdf94fe1bef0281b362845c6edb57fc.npy +03211117-f4097db6ad343f90d551435517f7f18d.npy +04379243-770f6ebf01b135e556938a56df3469d5.npy +02871439-aeaacd2127e9f88de8bb25231731c25d.npy +03593526-65d3ab62e8fc9f2fda564dc72444286c.npy +04256520-35d44bbbaa9763a1b1b2d85ddcddb619.npy +03513137-8018b307a127ec8d4051b6e037481c7.npy +04090263-636c6b4415df67c5a5aad165050e534c.npy +03001627-53a442e47743fa4f457ba044c28858b1.npy +02958343-ffbebc7c9a32a6f88ec8762dea278247.npy +03593526-4c9e762d331457997ed8de38e968d714.npy +04379243-3b68fa3c60e1cfb7745a5e8b6205e3aa.npy +03001627-2a98a638f675f46e7d44dc16af152638.npy +04379243-ff49113c1bda893155c5c4533d35b323.npy +02808440-29081c2803a3c83b362845c6edb57fc.npy +02958343-229d52c6df86197bc33d84e056f4fd5d.npy +02691156-ad66ac8155a316422068b7c500584ade.npy +04379243-5562593c6448e4856402b8f491cd92c7.npy +03001627-a4d7d4203cdec5dffebad4f49b26ec52.npy +04530566-a53312711cd84c9fcfea3d4fc15719ea.npy +02958343-39201299cf83ec2577763486d77d1cb.npy +04379243-8e637b52c16d8874f09e0399552c33e5.npy +03211117-64f160a87582cea38a57abd4646e319.npy +04090263-a979bcfe6e057e87696934ac57f77b3f.npy +04090263-32e4f161682231ceb785a4ac4a0dbd73.npy +04330267-93ebe284d3d0f9d65e723252788c3d6e.npy +04379243-8d29772f3fbffe408fb9278cf94ef5eb.npy +04379243-5ec773b266374121e8058cf23f6382c1.npy +02691156-6a47f4d30d54771e8782c935066e938.npy +02747177-ca9c8771ab1ec28920de219c00d1c3b.npy +04379243-a06be76ebccfceb91c8935ddaf3dd9f5.npy +02691156-1560968d05cd8887cc14f1e6f4f4f49b.npy +04379243-db454c99849016f8febad4f49b26ec52.npy +02691156-e6e8f0e244efac73da2b0f839aba40f9.npy +04090263-8a1275efcf36b408488d77a033721bf4.npy +03001627-5fc3b7d677788b486cd47753062bdba4.npy +04379243-7d6ad371f7037a6679368d1198f406e7.npy +02958343-9511b5ded804a33f597505fd7d99b613.npy +02691156-463834c3aa682c281883411175051361.npy +04379243-6c160b3f23bdb1af1832c6620d562eb1.npy +03938244-af515313df72452f29dab95fdd4a19d8.npy +03761084-15ba6dd7a9ad8b12efe5f291bc2f5fd0.npy +04379243-ffc2c7813c80d8fd323d6bd8db8de5b.npy +04379243-e67046b9860feedeec7cbf3284585a40.npy +04379243-234e44f27b5a2852500cffceffd2bd2b.npy +03467517-87f6b43385dc55702d9fe04691733c67.npy +03636649-8fe1766aa6997b0f899bad344dc01f2f.npy +02876657-323705d1a8505cdb498751cf10995c30.npy +04379243-ef7ff0018b4041ad577f990873b69f82.npy +04401088-a4910da0271b6f213a7e932df8806f9e.npy +04379243-8df9eb57d6f6bf7f490ad276cd2af3a4.npy +04379243-1270e7980d2d69d293a790c6eb6d2ee5.npy +04379243-57a27a7ce775e13197ff8153b678d004.npy +02992529-c1ae3b758aa9ea5e6dba92a4e2177102.npy +02958343-9c27cdc4feb2fa5d4244558fce818712.npy +03001627-ee484fb2c1e4e611a0dcc52ca811e565.npy +03636649-9f6c2428e0cd344d157d629c9921fc15.npy +04379243-114520b78a1726cf86de8d6734d81fc9.npy +03636649-8bcbfeebef5df95fc664c3d4e2d59341.npy +03636649-ca75df76115441abc516ff01c2593ee9.npy +03001627-58b3e0d46af2019bdd7092ed47061a36.npy +04090263-27fc3208942d136b92cea77f96988ae6.npy +02933112-ab096629bed6f8e0f51f77a6d7299806.npy +03636649-ed45838f0c557b778a0c77569eaa010f.npy +03001627-769df6463d9f566e1bdd2be5d322fe48.npy +02747177-a09482e9b131164ead5067eac75a07f7.npy +04379243-49f625856c796254d249abd69334079c.npy +02691156-d5b78307fd9a0764bc97347c46fe15e1.npy +02933112-17ba4ef76444e74b4da5feafe6f1c8fc.npy +02933112-40d4200a071b555c5588a2543ef0b0b4.npy +02876657-9a70dd116325eb2df6b14e57dce52ee1.npy +04090263-62586a8eabb2a67a609e2d916fa0da27.npy +04090263-6ef67d1906344eda9905a3939c890ad2.npy +02933112-6d5049bc983aa8b4a805114916841d69.npy +03001627-746ec5c7c0ab8924fc1f58a995f231d1.npy +03001627-6721f13f40f706c31b17743c18fb63dc.npy +03691459-ed80a69f448cb9a7205b075c6f63f661.npy +03001627-b4b65ad3117199a2e8b2b8dc0c816caf.npy +04379243-e39d56046b309a64229048a9abc3ab6.npy +04090263-3fba044c23facdaefa45f4d7e1ef7d0.npy +03001627-49434684366778973002761e7a3ba3bd.npy +04401088-3d5401f4ecab9be91aec2282dd8bc87a.npy +04530566-58f13d9c96d702c72d5c18abc132bda5.npy +02691156-d130dd0c96152140bc0909d98a1ff2b4.npy +02691156-d45809b73a371efd185b376619557c95.npy +03261776-2c6f04001afcce7ded85c3dc02bada79.npy +04379243-8f059d82a5c37104587d0dbfbd9ca24c.npy +03001627-d621bfa4a44a98e3829e1f3c4926c485.npy +04379243-a0445e4888d56666b9d7c2fc41e80228.npy +03001627-a366bbec303662a3ec545e4e9c852271.npy +03001627-7727d0eef3eeb3ba73b2b620da30da86.npy +02828884-7c5bebe21d2f9232af268f6180933aa3.npy +04256520-c293fb5d58a88ce85b903ba10d2ec446.npy +04379243-aa122afea2dcf725db039d8689a74349.npy +04379243-b1c7003075067621682d288075fc0dc1.npy +04379243-80af0f92ecf69f69f5ff054d67d5fe35.npy +03046257-1896aaea4625200be7b657772044425f.npy +03325088-64050bcb4cffb2d176c18e71fd49c4dc.npy +02933112-9a0d2ef1f31fee42b022c94235bc8601.npy +03001627-2fed64c67552aa689c1db271ad9472a7.npy +03691459-b8092ccc834f31b9d69825aa8e687d85.npy +03001627-297d3e472bf3198fb99cbd993f914184.npy +04090263-766db9eda4efe6aaf7bd077790d66b82.npy +03001627-a09091780fcf3af2e9777a9dc292bbd2.npy +02992529-280c7836d6302b4bf3f8467cb6fe657e.npy +04256520-337165c7708f17314038d588fd1342f.npy +02691156-a4ea22087dec2f32c7575c9089791ff.npy +02828884-61ade658bb475cc6a992c1353f8a88ef.npy +02808440-40aa0697e18dba1184dd6c3274cd9823.npy +04379243-616894d973384f358be590460e3754d8.npy +03001627-a5f300f3975497fa9dcf2183c858e6e5.npy +03337140-a3d4da412ce4ef2f4c3aee8e9d3a6ffa.npy +03636649-dc78674611170676a87391c8bef1a77d.npy +04379243-25672204a764515578439215682e01f6.npy +03938244-953d16ed7eee84d32d7a27ffaafaaddb.npy +03991062-37ad5cc6e0357defbffe63c069324d61.npy +02691156-ddb9b552868e8c61334736c27ce16882.npy +02818832-6ff38c09b9ab4dfd712f5f94eaf97217.npy +02958343-3220cc9f67cd763af63ee8a34069b7c5.npy +03046257-3c4c2a5b991508adf51f77a6d7299806.npy +03001627-f4b6bf9253918b52944d8f8e13d63fde.npy +04530566-1f1fb65b78e0f6ac816e21307f82dd39.npy +02958343-890e61bfb197190e6382e1684e46349f.npy +04530566-246335e0dfc3a0ea834ac3b5e36b95c.npy +02954340-2f347d95d4a2dae3e762cf5917cef4ef.npy +02958343-8e145be3c332199dd6821061f4432a0.npy +02773838-6881468dd51c214922022e93ae2b2b5b.npy +03001627-9a864d5de972a8c7cb686b8b855fed61.npy +03642806-c8309234b360aa2c747803756378b292.npy +04379243-b0910467658fa43f7fde87eb01f5851.npy +02828884-6550c93bce51b9b4719088c8e42c6ab.npy +04379243-30b506e5e1fc282afdfcfddf24fb29ec.npy +04256520-3c389c01263d2eaf2b3e9b6eb52d35df.npy +02958343-89431ed41e43bbc816abce8cb03e7794.npy +02691156-807d735fb9860fd1c863ab010b80d9ed.npy +02691156-7584ab1da1ae2778300ca77569ad3884.npy +02958343-6a06a8905edb576edb976bf16d451bb2.npy +03211117-ef7ea1a94404fa633c1661cdd6e9aee5.npy +03636649-615019f5899e2aee8120bc4dfb819859.npy +03001627-484f0070df7d5375492d9da2668ec34c.npy +03001627-b2d6c064af0c735f1783a44a88d6274.npy +02958343-751a2e8afd998768fb8f6150ea0ae369.npy +02828884-8fc8fb14df48da05ad5067eac75a07f7.npy +02691156-98b5a3a8e2ab94ccce19d55bc5e6a406.npy +04379243-db00e248dce5fe409cd431573238602d.npy +02808440-d5d3d361bdf7245e75519658e0efffee.npy +03211117-aa99cc4323af7144e7321f25048c6142.npy +04225987-f9efb1b00b79c035c1cb365152372fc5.npy +04530566-b5290cd73084cec0283f6ecb26ba2c4c.npy +03001627-cef1f5c49e5de64f593ebeeedbff73b.npy +03636649-41caf27a559755fafcb8d8c6d4df8143.npy +04379243-63ebf8f4f1e63fb0bc85ae0034c4dd9b.npy +02880940-524eb99c8d45eb01664b3b9b23ddfcbc.npy +02691156-5c43f5436b308ed89a6e43b878d5b335.npy +04530566-a83a9d54e0680aca640afc71da6e41a1.npy +03001627-42e1e9b71b87787fc8687ff9b0b4e4ac.npy +04256520-b8f0f62a95143a60c5ae767f471fad27.npy +04379243-42756ba88f851b6e3c8d0fdfb1cc2535.npy +03636649-fec5f9c209e09dd9d49b2e04785f8492.npy +03001627-4387affd3bc4509a36b41ce3eef1f5be.npy +04554684-9ac5425b6c547d3d99373190f2d703c0.npy +03325088-bf3e6eca3beeb5e89f5dacf3fb5f1b3.npy +02933112-8b35178a614ee2f462023490a1e05c18.npy +02828884-ddab02e0fc2921caf46518fccab79b6f.npy +02828884-3ee044d00523169dd4d8765e3910f617.npy +03593526-ded8dc705001ffd01261f7393ffee2ed.npy +03636649-d231a8b21aeeb7d78749901456352d5.npy +04379243-7c77974a20ec2629d8f27b2e727c3511.npy +03001627-9e6564dce4cc128efc24661f5f8d5d00.npy +03001627-43a275d9bd008a64bb0085d0daabdaea.npy +02958343-ba1a26acae4b773431141a7d4d06dc13.npy +02808440-3c16de8249619580fe52ffd0e748a1ab.npy +04330267-287fd6b1b61269907fa354dc1b904bdd.npy +03593526-d0240d785e39c7ef8da95317eef6e82a.npy +02691156-6705821a6b32fb3eca8607f540cc62ba.npy +03001627-736589cbc46fe6b059f8e31ca87c470e.npy +04530566-62b67cadf45841ab82b5804533e545b1.npy +04530566-badc6f1a2c19f724f3e39f2e17005efc.npy +03991062-f1c17606d5952d9225ebd1cd0b422e32.npy +03001627-270b86f1c341d7fc98d5fc0473d00a1c.npy +04090263-800299ba59951df3527ce7c85e81fc57.npy +02691156-27e6fe140e6e668a3881254c11db28.npy +04401088-19bb5e75692793fd45df661aef5d0a33.npy +04379243-996096692592afa91a0e159a720dabf7.npy +04401088-9728d42d4de74ff69ae0ec37bea5341c.npy +02958343-8d1ef0a2c958b23f22aa128014a842c4.npy +02958343-fce2b933f93d132f4f45033b2f001552.npy +02828884-1aa15011153c5d6aa64b59533813e6d6.npy +03001627-80f96250bed47b4f52e9aa88ca53e944.npy +04256520-77a56bf8ea88336019fb4103277a6b93.npy +04330267-bb5533538179f6c39209092a6c03f1bd.npy +03001627-7661a325724ae00acd0362ae35d1beb4.npy +04401088-ffd186dcf855e13e26479a182158bae5.npy +03513137-777497c94098014818457223b2b684b3.npy +03636649-60d1a7bf1e70c526befa8f2022732db1.npy +03001627-be43e61912136b5710f438ee952d42cc.npy +03001627-975d6db745442a755634c21965ee6bab.npy +04379243-f4d21f925b703fb7e46b767696592d01.npy +03001627-38d623b46d07a93fb7d9d23574a480ae.npy +02691156-122776d17b6a118086da73d36506db6f.npy +03001627-4356ef46fbc859a0b1f04c301b6ccc90.npy +02933112-8cfbb0ecb20361e8a7cb178ec63a7c4a.npy +02691156-7713f76f4ef99f19954990879891d2b.npy +02828884-9b41191a915c09bc669f4f2ecf8fba0.npy +04256520-90506850596aaa99891fca5db446d193.npy +03691459-d62a7c344c62875f9a0cc1a6d8beba8f.npy +04256520-b1f4e7cd4a1b24b4e086fd45e580f116.npy +02691156-79e06d1fe2e217b2cf67c0b63878e138.npy +04379243-3af91fd634a5ba759c0ca344f487323e.npy +04379243-2da86dfedc2620b61001738bb075c8ce.npy +04379243-8d4693c04d684e61a3430e4fb40c91fe.npy +04379243-93078952823dddaa5e56625f6688e473.npy +03001627-c4d1ccacb82d854b5a395b344d6773ac.npy +02691156-5869e6c3e9d2748e5ff3feb917a6004b.npy +04090263-8c4b9320b44f674ab09afb04c84cb438.npy +03691459-485a778cb7416a59e810658c16fad24a.npy +03636649-7fc85bf0b0989f864f3443b22038d340.npy +03001627-a78d31c9dd3cea02f91663a74ccd2338.npy +04379243-.npy +04530566-c0c1dce07f56384136da2d0ca22ed9df.npy +04090263-a85ac77659985978d43bb185feff0470.npy +04379243-7aefbd0f95e0e9653b09cd02500a89ae.npy +03001627-40a32b11861df98133ec62ad9f83dbff.npy +04090263-45f97261ea66fefd302ca88f2e083254.npy +03001627-8a2c1a7b282b9bf528ea9c4c28e5ce40.npy +03761084-5a933873658018998312881285c04cb3.npy +03691459-5ea9cb9068520d3bac80666502f7b62e.npy +04090263-ebd426ae34b743f4a50ef3fc203c6ba0.npy +04379243-867e978b82c313693002761e7a3ba3bd.npy +03761084-5874b21cb167217f4d9ddb9a204e75cd.npy +03991062-28129ab65778341d2e18cb49f02ca304.npy +03991062-d919a2a0e84382da148a76a78b10eb5d.npy +04401088-f77811bd35b9215dfd06b6d6f44d62dc.npy +02691156-a39940973102985635fc197bbabcd5bd.npy +04256520-9bcd5c2f575295283cd8f469f840fbd8.npy +04379243-3fa4d59a29c3b506a5e91f4d594e20e6.npy +02958343-6a8982bd53a9bea726149ed5e11fe70.npy +03211117-fbec33bb92e066ade1f2a1daf140ac9f.npy +03001627-8a26a4d0726014065a4867cafb45a61d.npy +04379243-b99bad700049d8f7cbe3d3c1931d32af.npy +04379243-eda01b811087e2f17002d0c486c20865.npy +02691156-388c9b9f1cf24ff84e61a0c2eaaabe87.npy +02876657-c6442bba98ad3dcf5e912b2d2934c0b6.npy +04379243-844199875fab83dd1b17743c18fb63dc.npy +03797390-5c7c4cb503a757147dbda56eabff0c47.npy +04401088-71fb433e386a5547f63375fea17cbfe4.npy +02876657-58279e870f4aec6963b58f539d58d6d5.npy +03001627-ca3670f77268f899febad4f49b26ec52.npy +03001627-73374d8256f79089c308dc58cdbda034.npy +03991062-63313f52b9b69592ff67c12005f72d2.npy +03691459-cb356bbfb74abea2c6573f6ede3fd543.npy +02924116-a549a2bb2ec82b3d7c76a81fb3030fee.npy +03001627-63da17eda9d415b5319c5e90e9cc9126.npy +02818832-d65ddc26ea062a2b9e4965f0106e00d9.npy +03642806-d786b5399e27a82978522e02fc65059.npy +04090263-e3dae8ffcbcc498c935777dcb8deec2d.npy +04379243-e777df6ffb40e3a1853d412328e7e7a6.npy +04379243-ecbb5a30557f659b2c528d33bca1ac2.npy +03938244-b422f9f038fc1f4da3149acda85b1964.npy +02808440-f1772937648f0a1b602f79528bf8e63.npy +03624134-ae7a91523600106259bc1c849ab4dd16.npy +02876657-738033cec99efcf2890766cd24d8fa7b.npy +03691459-46ac6f60aff34c5fdfadbc4d6667b477.npy +04379243-f1c3fdbbba8e36bf62a510b8f97c658e.npy +02958343-9586fcdd105347123ed4cb179e56ad61.npy +04401088-280a42d54e91c6968a02f6ad0818c761.npy +04090263-3592149d9f069cff276c3d558130f8b4.npy +02958343-62fa029fb8053560a37f3fc191551700.npy +03211117-f5fc954736b06be15fd06491ae919ea3.npy +02691156-ac4774b7a9fd06d55e6724a7c6e30991.npy +03691459-88c752eedbb2e133f7f12bd413763dc6.npy +02876657-2fa757f584a3be31a7ceedb2540a32b0.npy +03001627-631e102e9a689339b0ec386df15ab64f.npy +03761084-bfe33a2e7906a28f8405745f8a74e13b.npy +04256520-b3b659db2b29e8201dd80053668dcec7.npy +02828884-2eb289d5829907b9e6ad3e1a394e102.npy +02924116-642b3dcc3e34ae3bafe1d4530f4c6e24.npy +02828884-729c336995af1f96955a1fc933a0f899.npy +04256520-79170ac3bea792317984fb9ec7e40829.npy +02691156-81596cc38eef8260ce9e5ac45c67ec22.npy +03001627-aaba865e99c23e7082db9fca4b68095.npy +03001627-a680830f8b76c1bbe929777b2f481029.npy +04256520-8771f9b7cd6b7c81e724074e69c062a4.npy +02958343-9ab8a24e82568c598c2c132c71e94f7c.npy +02933112-1d898bbd8bbad8f98430b7446f9e1252.npy +04530566-c2d83f3b8665638c664b3b9b23ddfcbc.npy +03642806-2d38fa685e71721986a7e0484f5238e4.npy +02933112-b7dc1e9a3949991747d7c2aae1e5c61.npy +03001627-32c35f86754c0b4847307542345b60c.npy +04379243-f30419ee8ff3edeaae04ebd863e388a1.npy +02924116-139502837db81fafae3dfcb7ed2f0b2.npy +04256520-2c2265c2a9f3c886d0250e0e48027a4c.npy +03642806-a76724964bc58c73ec00b83eb025362c.npy +03001627-9d177c3174439ae1a48e53188865c070.npy +04379243-cfefed4429defd86febdb1f263373824.npy +04379243-2148ddc7d6228861e4dd86e9188294f.npy +04401088-81f527c62191bcd465c46de8aef92580.npy +04090263-cf36df80bbcbc74a6f8398adde24f538.npy +02992529-5814df537b8f1bcde95cd0dc8c2f0e83.npy +03001627-d2597d18fdc3594e1dc59d2adbe5297d.npy +02958343-f31eae8f1f64638c2a9eb0f146e94477.npy +03001627-4eeef58f4015cf74d93768e7b9b1eabf.npy +03928116-7da48dc86606fdec616c08e4715af963.npy +04090263-c4f3ee55952e49ae12b38b1d99376c0b.npy +03211117-72b55fd0ec85d68164ac9dbe3ce7e6be.npy +04401088-f7cb2d921f246c00cc8eea03ea8843cc.npy +03001627-a8f6ca4151f966f5c2e24dd3e5cf2d2f.npy +03001627-ff8efd10f5e6c5c7c6c0380e62f2644.npy +04256520-8a9630332c2cb42644ac83b3e97ad658.npy +02958343-a9e8123feadc58d5983c36827cbbba97.npy +03211117-777a8a1c887779f47ac59aba6f9a1449.npy +04256520-17770580d5c314ea268f063686455b81.npy +03636649-e8e2c055f8ea53a144638317e9e4ff18.npy +04090263-4c883b2d79225a06a5aad165050e534c.npy +02691156-965d457720def9a490b1d6deb98feec6.npy +04379243-9d80e026c9935fa9ea4fe6fd890fcb78.npy +02691156-29b3b168322ac49448d2ba4615e03b21.npy +03001627-c3b6c4563e5f3dc4166ddaef2c2c61ae.npy +03001627-573a615f3496ff4b9b9f2eb77f5e247e.npy +03636649-4cf8166bbaab7c816fd1582e84bf3110.npy +02992529-5f919ac1f790280f563028cebd5782b.npy +03001627-35e77eed59e1113c22e4620665c23c97.npy +02924116-414bbe39e41a8a378e60a499e73975be.npy +04554684-bf1fc3ec1617fb0064f9059364710e5.npy +02691156-7de379891610f5feaf7dd1bfd65143a9.npy +03001627-30d3b99aabb3ce1c4adcf948bcaafbd8.npy +03636649-1a5ebc8575a4e5edcc901650bbbbb0b5.npy +03642806-c0c055ba43c3528a3cb4d5b227cc213b.npy +02828884-602f39fc7534bc4a162bf7725b3fab02.npy +02808440-35a0eec62047815f7454c09d6230a4d.npy +03624134-60d54b7d23edd00b9ed3084b435bf82a.npy +03211117-7dd5b5e5fbb63466ce4aeb2e2812e0bc.npy +02933112-8415b7cd04f981d94692707833167ca3.npy +04379243-5f4ce562f8ebfb00a9f598bc574004c2.npy +02691156-f6b7f7695d091b9bc0909d98a1ff2b4.npy +04379243-4e928377ae98ed8d99e8bf807e902261.npy +03797390-275729fcdc9bf1488afafc80c93c27a9.npy +02876657-5ac30e855ea3faad8884a069d9619eaf.npy +03001627-58891b4cc3fcdd7622bad8a709de6e5.npy +02992529-3d5c17c3e60a168bdaab9d410eb59af2.npy +02691156-cda3cd7f140fe791ed137f17a6d8e3c8.npy +03001627-6ebfa5329b0d1439d4ea3f4c41b1b9bb.npy +04379243-f1b10865243d1ebd77cf3bb06f394ad.npy +02933112-8714a704af18d44b11a97ee9284a563.npy +03001627-1a74a83fa6d24b3cacd67ce2c72c02e.npy +04379243-75c5b314933c8bccea896321ee86caf3.npy +03636649-98636fb562413a10dd999d2409f5212c.npy +03991062-b565a82e10bf41d2131cd41ab5cc1dbf.npy +02691156-2aac22a33893fad8b96ae1a0a8b84ec.npy +03001627-b3194efdf2b8031e8f6e9f07be105c48.npy +03991062-18387bda93f1b17e36b0f2a1430e993a.npy +04379243-178eced0bff71d3653e946fb2184f0c4.npy +03761084-c5143f702625a10dd99265061a435799.npy +02992529-342ef21b1ed9615685feaf23dbe1f454.npy +03001627-d4d9b991ff7d31e8c8687ff9b0b4e4ac.npy +03001627-d57a11d2272f0d9f9c5c7365bb502b0d.npy +04379243-9fa0a6c2c9d102cf2bfb1b91e3f49afe.npy +03593526-5c2079f8089b0419ca2de9a00262030f.npy +04379243-bdd9dbe62272e25c48d90eef8384210.npy +04256520-a25fbfb1c72811d86e4d44229ea605db.npy +04379243-c35a14f84985f92a9856fa70a578baeb.npy +02691156-de1e70fefcabfb6f79be89de816ea2e6.npy +04379243-2060a7a8bc18a63b1cf96a5dc33e37f1.npy +04401088-9cc581a6c5d0b8fcc14f5d127de947a6.npy +04379243-4229653c43599d726ed8927720f5e445.npy +03001627-36ce26e70eace0a3d9b53420a5458c53.npy +04379243-17f3a2945d6550cbf7628281ecb18112.npy +03636649-746b82746c6a02cca5f600ed2cf472ac.npy +02958343-aaa31209c049647d190d02a746694d92.npy +04379243-8d2aac03aac051bedd3adf3090c701f7.npy +03991062-65d2760c534966f2d2b12aa6a0f050b3.npy +04530566-924eeaf6f203fb636be14c19eeda8326.npy +03001627-f1f8e16d23d3a0ba95f2719038c22311.npy +02958343-a583ea14f9da98936436916a86a90ed7.npy +02958343-d1acd4916d3d3b57c48db2ed8f5e994c.npy +02871439-38be55deba61bcfd808d50b6f71a45b.npy +02808440-a969cd5e93fd389b3321831d2245cf06.npy +03467517-7739bbd9890d0e47965378fe06bd3c02.npy +04256520-4b7785695ead572e175255c493aea87b.npy +03636649-f274cbff23bda61a85024815e816c655.npy +04379243-3125b833a365799ac79619984c97c1ff.npy +03046257-6a34103b8186cfe1490ad276cd2af3a4.npy +03467517-32a337387527f39193f0194265a9746c.npy +03001627-678ae2d4a386f4e4d0250aa1ac19fcf9.npy +03001627-e955b63a4bd738857178717457aa5d20.npy +02924116-cbe2cb74dbfcf7fc4aa94fe75fa150ae.npy +02942699-97cd28c085e3754f22c69c86438afd28.npy +03325088-1f43546db1dc2912f38c4a12750d961b.npy +03001627-e696f4c7cd88b8b52ff834514c92e8fd.npy +02924116-83bda5045aca68671db751af8df870f4.npy +02958343-913b747502e92aa34d1780ed2b3fe073.npy +02876657-c5e425b9b1f4f42b6d7d15cb5e1928e.npy +04379243-94fa2ca1212536d84a8050bb0dd3c541.npy +04379243-701dd3ef213c653b39401293115e30c.npy +03046257-4baba9e85a3ae76bb030c2da12a8fb31.npy +03001627-3109a0b9f9bc5fecb4cd1bd556007aed.npy +03691459-4f42950d660bffcdcdd18be3aeb2d66e.npy +03691459-6be15f4f6dd64490d747b49524a1246e.npy +04379243-3a6a01d03f28cf83664b3b9b23ddfcbc.npy +03710193-a4c11b601dd4a63bf8c63fffc82e8907.npy +02691156-b6dc4ddde769573df551b6c3f174499e.npy +03001627-5607b02869c1f8a019fb4103277a6b93.npy +04379243-e0f8fc5dc186a597a636371b2023a251.npy +02933112-703a95f9e0f51654f51f77a6d7299806.npy +03001627-8830354625df010037b71c02ebe8cb4d.npy +03636649-1d963d5c54613202b0aa15078ea6f391.npy +03001627-60ec0611befb7102dbca69f936e89647.npy +02691156-3feeb5f8ecbfcb4ba8f0518e94fcfb22.npy +04530566-c6e127fca727e2be3d312efac35b8a09.npy +02942699-7077395b60bf4aeb3cb44973ec1ffcf8.npy +03325088-45374c209823108c1036b9adf51844e6.npy +03593526-e4a868a10e10dda4befcf48d5b3e17b5.npy +04256520-52dd0fac460adb45e2879d5d9f05633.npy +02933112-226873c8d34e38286d53ab0fe94e911.npy +03001627-c7da2d72f9927f1881dff5c2e57ad46e.npy +02876657-970027a2c9f1de88c123147a914238ea.npy +04090263-54e1ce2402c4f754aca4b8a57632be04.npy +03325088-13b0cdb40fdb8e3c979c556124bee033.npy +04401088-a41e693828a65064e565c13e00bdea3d.npy +04379243-718df0ef71586a6ecccd93cbd8dfdb84.npy +02828884-5f8f2518fb850b544bf6fb242f907340.npy +03001627-f39d429ab98d5323a1a6556bd50a3110.npy +02691156-d5f4e2228e3fadd2aa6a832b9db7452f.npy +02958343-2881a09fc1f3d2be9dab4604fbb1a7b4.npy +03691459-acf4fb74200b838d874179120554c44f.npy +04379243-d151d9f45d8b14536cd661fb5fd95741.npy +04379243-28001cb70c38f19cf32b6091d9628440.npy +02691156-ed738ba28cd73714bb0f4bdf8821663a.npy +03001627-2137a8fcee12e72d19fb4103277a6b93.npy +02691156-4b4782c572fa8b11a20c7111a5d0d7fc.npy +02924116-9ec0c9cf9d90433035dc35aa11c480b8.npy +03636649-d54d7977d760f4c3bd16d4490a10a752.npy +02958343-1a56d596c77ad5936fa87a658faf1d26.npy +03593526-c369c35d54a88e56fe572c9a3e59d718.npy +04530566-d2d3ab44415a3d3fef5e991e1c32e94a.npy +04530566-52fb0261b905147d2fe023c7dc3e5231.npy +03001627-a58f8f1bd61094b3ff2c92c2a4f65876.npy +02691156-c6bcec892954942a83855ba2afe73b0b.npy +03790512-e7c8dd1efb78b8baba85a673915bd3d.npy +03001627-95e2f1fb6be241b4742728b30848ed03.npy +04330267-b94b76056a072784685e443e0ea51d93.npy +02843684-7f9bea8d412c57cccd777fa0a7548d4c.npy +03467517-401ff6021157dee293f0194265a9746c.npy +03001627-71b01320c8e9dd60f7628281ecb18112.npy +03691459-5f525c37469b0437feae521e94848af6.npy +03001627-d29d2c5a1b35b85b40f0ac0fb9a650d.npy +04379243-fd8cffbc99f7388e4f2b9e837678be87.npy +04256520-4742de1edfb9462a60fd51b2fec8dcce.npy +02691156-71bb720c33da689090b1d6deb98feec6.npy +03001627-e82136f5c8b2c3156cdce1333d517d16.npy +04090263-a1a89a8cc3557d373fab9f1733a68f6.npy +03001627-cc811f0c28012f493c528a26a44a30b6.npy +03691459-e2dc092a4ef62c09d207241113bee327.npy +03467517-661c603f9f7645f0d50e84209ea2fc33.npy +03991062-d61c8ea9eeb02397dfe9cab879fd37e8.npy +03691459-33d9a210df86a437cb3c1170309e6b12.npy +02828884-dc4857179ccd30ad5067eac75a07f7.npy +04530566-564d88a1c49ba742473f10e6caaeca56.npy +02747177-fa5f703728fd7d5ff4fb4dee5181bee.npy +04379243-4eae659d4bc093465f675b8d0bab4126.npy +03001627-a0f6ec9aede1d9039bad36d0a57d0adf.npy +03001627-657790bc7fd16326c132086242d50af2.npy +02691156-5da145252e095024ee738cc95b5ae8e.npy +04379243-6a311b1416a53f87697ad7b0fe6813db.npy +03636649-fafef4866d1a74f3fcb8d8c6d4df8143.npy +04256520-d2018df95fe894c388acc944857403a5.npy +04090263-7dba6294173994131226a6f096e4f8c8.npy +02691156-d0614abb68caa5ddac7f1a00b76bd166.npy +02924116-d0cc83d6fded7f1cc98c13d6112727de.npy +04379243-3cdf9215a9cf0ff5855931d119219022.npy +02773838-1b84dededd445058e44a5473032f38f.npy +04379243-ae2a8d605b8c4090acc95948d4efa8e6.npy +04379243-ea4fbea57b0b7b677c0ffcaa63ee0500.npy +03636649-2b194d6bed8daa82c0b2dda5ff15ea28.npy +02691156-a9b808a446c498f475df24d58e852c90.npy +04256520-a92f6b7dccd0421f7248d9dbed7a7b8.npy +02958343-17c08a4bf8224f47473f10e6caaeca56.npy +04090263-a1f65f97e61094e1202be79d8b285c1e.npy +03001627-2f0a94efe6d1da7f8616812464c86290.npy +04379243-b3a77356e56d7c9a2820d27b806f8454.npy +02691156-35f43f566f2f14651713426437a9f7cd.npy +02691156-1c2e9dedbcf511e616a077c4c0fc1181.npy +04090263-262510dc5b4cd7003d48ceeccdc87fcf.npy +02942699-22217d5660444eeeca93934e5f39869.npy +04256520-fb12015e8f705d901f8d8332ee17945a.npy +04401088-1b1aaa9a95ae964746becd46a4907f38.npy +04379243-e4f206e9aee482a15510d59f3ab1ed64.npy +02958343-36c4d31969a8c1111a31578ee9a364cd.npy +04379243-5b546ef5de5d10f3ecc9201d3d846bc1.npy +02933112-ac980e21cd4f41eed5076afb08856f4d.npy +03001627-3b472a135aefdc2943a0e2e54f038a60.npy +02933112-455a583e41579db14da5feafe6f1c8fc.npy +02808440-124807f04a76c484c62bee40dcdc539.npy +03211117-faa79bebcefea4256a4b4e0348cf692.npy +02691156-b253d5dd187679c74a9ee9951c24bdb0.npy +03636649-3d82ed43806901b4df9c597227d75069.npy +02691156-e090eb003856ed12ffbd931fcaa69140.npy +02808440-906d00e5cdd0f23437b3df14b1086ae1.npy +03001627-ac84a2eff5e6a64347598b39fd1f6465.npy +02691156-36dd57178402cdf2afd477f714c68df9.npy +03624134-8f61777bf6b57fedc13545c5b1a2e607.npy +04379243-9825c19c22c97af2aff4f3612743fea.npy +03337140-9633dbd1bb8c11134c3aee8e9d3a6ffa.npy +02828884-e8480e72fb656057656a19d1d18fdbac.npy +02828884-b274f40cccd7e067f155d75bbf62b80.npy +04379243-42018e077cb76cd3948fd22ef0eabdf1.npy +02958343-afeb58fbf8c45924cdf21e49b4ebfe68.npy +03001627-c570ee85ecb0e514492d9da2668ec34c.npy +02958343-f7c84d18011f76fe5e18329bdc55fc9.npy +04379243-a333abca08fceb434eec4d2d414b38e0.npy +03046257-313da995b26c1ab2e18cb30f79057c27.npy +04379243-14146d1e359f998b19b278d00a891f19.npy +04379243-410ad32a9cd5377458c429c80cce21ba.npy +02828884-e7536c6b13e44b9df4fb4dee5181bee.npy +04256520-af9245138b29dd19c8687ff9b0b4e4ac.npy +04379243-d458bc90f183605119fb4103277a6b93.npy +04379243-2d1d1b66d6e268d8c67c3af5181fac2d.npy +03593526-483b9263192747a3a4c322790a683350.npy +03001627-bae518da1e709e83596f70d1d7edd4bc.npy +02992529-21056b8560bdd1a9f63375fea17cbfe4.npy +04530566-1cd39434382e08ab8510ad9ae6ed36b6.npy +03636649-d982697f8c20b769aec118775e1a3eb4.npy +02828884-6152fd8b7b5b10df436455e65b78c0e3.npy +02871439-31a1fd4a86320f332c45f75322191dd7.npy +02880940-782aa72e7f14975b39d764edb37837d3.npy +04256520-bdd7a0eb66e8884dad04591c9486ec0.npy +04530566-a9737969ac039c9323dfd33205b06c1a.npy +04379243-24672a92667a51885878d4300758f637.npy +02691156-8383c4706c60ea2fc1006ed55bc1a3fc.npy +02691156-a0359a8d86947a2049fe495b383f9f0a.npy +02691156-e8de6c58f4a772d771d03b466c72ce41.npy +02818832-4290c1a305f46cba4cc1952ae0d6e81a.npy +03710193-4d1064364236d92dba999a2694e75319.npy +03001627-2bcf0b0586570ffe6c63b8b48495261a.npy +02691156-3c109726e03fbac4ace5721ccacba16.npy +03046257-1926de4988741ad81b17743c18fb63dc.npy +04379243-627f4b1f48b6190b9341eeec703c4d4f.npy +02843684-a448fb21ce07c5332cba66dc6aeabcd4.npy +02828884-ba8e193569ea391efcd6646576d2dbbc.npy +02876657-bfe7d0102dcd0deff43af5716b936459.npy +02691156-57c4a88a7b2e10f14c971d5c531b9d1c.npy +04468005-ce0cdf24724d4339c74aaa8fec0125e1.npy +03325088-d185710a223fc5303321831d2245cf06.npy +02808440-30d2a4ee211c4383125fa9990176f0d5.npy +04090263-f80ec2ac6f6e851bca7250d90eb506cf.npy +03513137-8d50220bdf7be7b92d356a2793fb4d69.npy +04379243-6686819cbb40a3502aa2b411702b495c.npy +04401088-6753572868705eacdd043998582f5fa.npy +04090263-1c6680f257e5c97498e6e8ec38d9445a.npy +02933112-4f53f0d00d3491f35eea3e3d89293379.npy +03691459-c2bf199ce5a022a1126d510cb8dd3d9e.npy +02958343-383a4d1ee8022e9a61fd7e090d4d0d45.npy +03211117-a568d8aaf2b587a2f27bd2175000097.npy +04379243-1d825a5cd1884610b08fe058d24e7e61.npy +04401088-52d1db0a460723949582767760266e88.npy +04256520-6c50fa0b3f1bf58e178548484b14e6f6.npy +03642806-6d88f11ac37f07a86a7e0484f5238e4.npy +04379243-17fd058dc352b9d11191025061735ea3.npy +04090263-17e2291c6ef778034b349e4b3dd5565e.npy +03797390-3d1754b7cb46c0ce5c8081810641ef6.npy +03046257-b6fa9b0aaadf6c89a1b95b258b5f7139.npy +03790512-d9ae53fbacf92182b37378f3c85478b4.npy +03790512-e24b42fe6296c613be23697565633b75.npy +02958343-bcc3a1e280cb9153618e9d35559b7aa.npy +03710193-31f30fad514955060d6908d0bcf26ba.npy +03593526-c795ed7d374e893964558a1c6a2a9f11.npy +03624134-4b57d6d81db28f8ccc34b900bb2492e.npy +03513137-73b749a0704ad08398ce5d19cf9bd7c9.npy +03001627-e642ac79a2517d0054f92a30b31f64e.npy +03467517-ff82ee8b58b03dead5ba605b3c01b057.npy +03636649-46dc3daf02f51d09490ad276cd2af3a4.npy +03593526-e81b2e879acd96f5664b3b9b23ddfcbc.npy +04225987-d303055e96cd59949da15808191f1405.npy +04379243-d578287c4a9452efa9af104529ef47c3.npy +04379243-7b50357760759ad58a70042c3e4356d2.npy +03636649-200fe239e1eac6a2651636b7e802cd3e.npy +03001627-fc131dfba15fafb2fdeed357dfbe708a.npy +04379243-7f29e2e6496ee99aeca1c556848f5db1.npy +03001627-e6ec608ccfb38d6247928239f46b6ef1.npy +04530566-f61132a535bd608c85f7a3de54751f1b.npy +04530566-eddb01638a0c8be89c9cb44b983e47a.npy +04090263-501312760a03072cd9deb3f829cc2475.npy +04090263-556be45ad32a1f18726ef46500f4c772.npy +04460130-b7600836218f2556e86e8111763264e.npy +02808440-e1bbaff08c5309a6412ac8cccf0c180f.npy +04379243-c7872212279d59eb540291e94bc8ddc3.npy +04379243-9e408f772321bb1920768660cf080d12.npy +02958343-ba03db3866faadf0dd27b2ba4335b978.npy +04379243-df166b0407fef7ae4b3c42e318f3affc.npy +04530566-852a4a82f02d64fb31205bd848315f04.npy +03467517-3bca4bb40d2b8cf23b3435cb12e628d5.npy +04256520-3477f074d38e57821a61e560ab9e3736.npy +04379243-10b5723ea035cb047464e25da6d2e90.npy +02958343-e333b5c405fbbb98457cfef9186c20c7.npy +02691156-9759b89377e9d3f454eefcdc602d4520.npy +04256520-6cc0e9deb3b519eba347d2a9b736d5f.npy +04460130-2ecb6add2316f940ffad7221e3cdb3ef.npy +02691156-1a9b552befd6306cc8f2d5fe7449af61.npy +03467517-e22fb9fe7451af10afaf9bf875738c30.npy +02691156-f3463eac7325b600d01b5600c06c528d.npy +04468005-b4d66e95bf17f53e9954eae9164faecb.npy +04379243-a8ff038540e5ef35daa3ef8c2a95fdb6.npy +04090263-c2ea3ff598b98f3f4528f6465fa2466d.npy +04379243-8e07fff2ae8a542051ef8c8b1fdb41ce.npy +03636649-2f345ba66e683c2bc5a208307819a3a1.npy +02958343-d482029701573b9a43fb5689d5ce14d3.npy +04379243-4ebcc39496c64f0a50566f53e37b2171.npy +04379243-b9886dd3c4a651f3664b3b9b23ddfcbc.npy +02691156-82e50255f14e7d9e60c9b6e4c75a092a.npy +02958343-bf523e37ff88cb10e23d60a1b706b44f.npy +04379243-53ff581b91740efdfbf96e9694161951.npy +04379243-5be46c0c35d3cff2297936c81e7f6629.npy +03001627-e08add655395ce8df51f77a6d7299806.npy +04090263-d16ba2810dd8489cfcace4d823343363.npy +02933112-381d0eb848eaaa07eee615e75bc3b77.npy +04379243-bf81d46925ba8ef7ef6c510e24348d3b.npy +03001627-92f79b8e45269847f0efa341b439d741.npy +02691156-a0c9b929b9a57fc8f0ea53ad10b4d47.npy +04379243-1f8205bc25d4d5f21771ee930e861b13.npy +03636649-ea02a7933158caecfcb8d8c6d4df8143.npy +04379243-f585560965413925d706ecb3379aa341.npy +04090263-c6567e2f9896825b49352dd33f95cb9e.npy +03938244-cac45c821aaa15e577ca5eb24dfd03ad.npy +03636649-1874da9ffb42f3ee990f8ee13a15ddf6.npy +03691459-72ecb9a2d25458ba8b4cf2c9fe044514.npy +02992529-bf15900bf5afb946b35f223cefd97829.npy +03001627-7ec876482b8d80ce5a8ae8f7c307d01c.npy +04379243-48dd6b701f9909da6a8a13d57e4d05f0.npy +03325088-2b06f6839c637fb54d7082b34825ef0.npy +03001627-2b6cbad4ba1e9a0645881d7eab1353ba.npy +03991062-4a2a3ef283ebab579e1e8b2486a6bb4a.npy +02958343-692001fd91d8328ef421855cd210fbe9.npy +02691156-d004d0e86ea3d77a65a6ed5c458f6a32.npy +02876657-1349b2169a97a0ff54e1b6f41fdd78a.npy +04379243-1bc8eb160194017cde26427f80dbcfad.npy +03797390-6c379385bf0a23ffdec712af445786fe.npy +02958343-fff64da26715b520e40201fea1ad0f1.npy +02691156-c80e8a74a31c6156bac66f0bb664359f.npy +04090263-e55bc0a1b57acec4a7dd22c0aa3913f0.npy +02958343-bc7ca9eec356ce21ad32396cbf7f43dc.npy +03636649-6dcbc7efc9369de386a5dcc6ebde687f.npy +02958343-b56bfe0649294ebecb02238be5da228.npy +04256520-babdd63b18d73a196625bd63cef94df1.npy +04379243-3950da9e4a5083d7b4fa97f642d1a681.npy +02828884-132231578d6084cacb2a965e75be701c.npy +02933112-6e03d2f837cfeb8ee75ac485a81d5fa9.npy +04468005-5ddf4835ed5640e942e61fccfc5d24ee.npy +02691156-222c0d99446148babe4274edc10c1c8e.npy +04330267-cfa1ad5b5b023fe81d2e2161e7c7075.npy +02958343-f94003409831db21f2cdad303f49c9f9.npy +02828884-5fa51bc60906cc548270ab5c6ee87257.npy +02880940-fc77ad0828db2caa533e44d90297dd6e.npy +03691459-405db2cef5b41756fa16d3c3138134ae.npy +02691156-ed35478403ae873943cf31d2bcc8f4.npy +03001627-3c17fe56ae05d51620768660cf080d12.npy +04379243-279c8601278e827dab610b0c94236463.npy +03001627-52f0514f5c38bc96f51f77a6d7299806.npy +03211117-8ec017a94a41b097b1b11b582321dc3a.npy +03636649-5eefe57de9ad8b6114038d588fd1342f.npy +03636649-873aad4a222d541a91c2792fcdc1ca8.npy +03691459-9fbb43c7437c1bb8a2ec0446d32ce69.npy +04090263-a4001adbd9f3443d3a9a4f49cc5d8efc.npy +02958343-970ebe02365dd05bfd7e1079f2e4956b.npy +04379243-af2feda1ed22097d6200682ef9a0dc75.npy +02691156-57a57f639a3e636d914c075742032f6.npy +03593526-85ad6844a52ec08cdf7d84aa9195db06.npy +04379243-9daf7804f32079f7b1973049b9d84541.npy +04256520-9ac58aaf9989a0911f98c0761af40e04.npy +04379243-9b042d709402eb968dd711af5650bdcf.npy +02691156-ee672fc1455b9fc43523242fdf9b75a7.npy +02958343-6d714f7b7170a581da8e502a3c6cb4fb.npy +02958343-fc521be0cb604c1aee4687e8f2543e.npy +02958343-3776e4d1e2587fd3253c03b7df20edd5.npy +04379243-89cb658542b25e1f4671d97b0fd17f51.npy +03691459-5f9d75a41d264b9bf4fd8600b18b879c.npy +03001627-fc6129a9310ba34c645311c54e2f9bdc.npy +02691156-8da05b28d9b2e2fddd01eabba9d45203.npy +04379243-9bae37b85e2c71ae62158b7ee658e910.npy +02818832-a84ff0a6802b0661f345fb470303964a.npy +04090263-7a2904413d538525bd337aeee16061a.npy +03001627-9191445d1c215cf09a8ef44e1d2c5b75.npy +02691156-94981062a6f3748844750bbcfe7b8fee.npy +04090263-1a6aab87fdd90323d810dcd63f342aca.npy +04256520-56cafcac4df5308d35dda488a4bbb1e1.npy +04090263-32706617176faf4a32dee48b245ce100.npy +03001627-bb48377bba20a712a45aa09d68b87656.npy +03001627-99d5fabe3b8258ce9d4d5dcd2cc33826.npy +04530566-8cbb360233696342309e1bb5976741f2.npy +04379243-20ba57a048c518e5732649bffe80ba61.npy +02958343-34d28083d9f0c31fa2e586b3e41e79ff.npy +03467517-4e982d5baec36536c86b22832615248.npy +02942699-5265ff657b9db80cafae29a76344a143.npy +02992529-ac6f6437f9e63981b6d41c42f7ade8c8.npy +03001627-63b5ef650f1020eb7fa0ee8efe00d1ee.npy +03624134-47f56f25d4582327cb77d096d6538915.npy +04090263-e65080fac483ce98f0878b58b4e887bf.npy +03001627-8da97531717192fc3215145fdcd9052.npy +02958343-787a38da42c2026ec29f776eec462c6d.npy +02691156-9afe827a622d8ca28699933784576e73.npy +04379243-1370db5c4f0b84026aa35752fcfa44c0.npy +04379243-938e3529b774a91fcee558e7a5a02ad9.npy +04090263-815a2488eff62e6ce641b9ab504917bf.npy +04379243-23acbe1f91d445f91ca1c7e576bee6b9.npy +04379243-4faf91d6e511e153b20565fa9224214d.npy +04379243-94c98b1e67618bd234943af333340cd2.npy +04256520-828940d7035de09f62e682c9809bff14.npy +04379243-1804dd6f5c827c1a4bf8d5f43e57b138.npy +02808440-b47731bf94a8f64bd765b52819c487ba.npy +03790512-b767982d38b5171e429f1c522640e6f0.npy +04379243-2e7a728b482bd2d453e946fb2184f0c4.npy +03001627-53ea833512f2235319fb4103277a6b93.npy +04090263-2762292f3f5629fe12b38b1d99376c0b.npy +03001627-f40332e31675a54d492d9da2668ec34c.npy +02958343-e1134a7e936b516fb1bb46d2556ba67d.npy +04379243-aad7eaccc93471d6ab610b0c94236463.npy +04530566-6189947ef21a4f4b7f6ea2f642fdf12a.npy +03001627-7eb7574764b397c3e87e9b3f41906a3d.npy +02691156-4a11239139c5f81762b600da24e0965.npy +04090263-ed939aa2573fc0fd3b5abd28a9df8c72.npy +02691156-e218bb755f35da1bb4cdad9a5bf52dd5.npy +03001627-60c328c57efb2a69820018801b237b3d.npy +02958343-2a2a1822fcf96394ed3696d854eee1ec.npy +04468005-814e850ce8c5498b5f73a346378dad81.npy +02992529-bfba0e8cdd5462e4fe103fdbd20df6.npy +04554684-71f26627a3eece3e151c656115fe24ee.npy +02871439-8007cf8349381dada5817f81a1efa3cc.npy +04379243-edb32ed999f08ed4a12cedd896805aef.npy +02691156-737629e185f4c45f99f30106e678cab1.npy +03001627-3a52c8cd645f40b4670786463e520f4d.npy +03691459-66baf7b7b4ce43d7e50f6aaad9a07bc.npy +04256520-572da8680677fe8937b2bb75885cfc44.npy +04530566-89ca399e4ab129a60014fe834c82238.npy +03001627-5e598a82d584211d2681d406cc3868fb.npy +03636649-aff71b0d462342aa4bf6dad97590bf33.npy +02958343-17bfc66c6bc0a99d68c415156b102065.npy +04530566-d0e7102863fdb18fb90142192ec795d.npy +03001627-64c80a33436b8a84541e733f245fd038.npy +03691459-217733447f1ec818c066b9622c005c53.npy +02933112-bbbd4de3e7ab25ad80d6227ff9b21190.npy +02691156-5011e352793d063f26360e1e29a956c7.npy +03928116-79d07ff15dd24e398043364ed41c1a79.npy +03636649-26bb7229b024a8549b0c8289d51d981b.npy +03636649-4916f793d87dd184d42b9650f19dd425.npy +04379243-53bc49f45214d8d6ea73a64ae4344bc3.npy +03790512-ce46af9eb70d91e2b37378f3c85478b4.npy +04530566-5b542fec3cd96c872e28b2b96a4985ba.npy +04090263-39219da571e93e9825c70fb1df3f879b.npy +02773838-133c16fc6ca7d77676bb31db0358e9c6.npy +04090263-bb46900b4f00ca7292659aea259f7c91.npy +03001627-e22e9f5088838675a72559fc4f86f700.npy +02691156-1435b52348569ce1bd46d022fd7d80aa.npy +02828884-b7c366d9ad90bb8a847d09fbfad470bc.npy +02958343-29b714c4aee36c9d6108f064aff2426d.npy +04379243-df39a8c8b7ce47a25938488ff499d96a.npy +04379243-e94ed46ede91eafa50f1b9873bba60ae.npy +02828884-2d1e8858446d1a32d2b12aa6a0f050b3.npy +02924116-1004ae81238886674d44f5db04bf14b8.npy +02691156-5ea68e6edd123801ad75fc64c51fb188.npy +02828884-e2be5da815f914f22250bf58700b4d8f.npy +03001627-71b1134533fb33f489452a0032ea575.npy +03636649-375c6cce56f3967ed323d15bd4f8b2d.npy +02691156-b9c8536f91ec3bcd3aff44a57f77b39.npy +02954340-6f93656d083e985465bae2cb33eb4baa.npy +02871439-6ebfa572d4501a9b680acf911e95b6a6.npy +03001627-cbe006da89cca7ffd6bab114dd47e3f.npy +03001627-575cb36c87cd4896c5ae524fbf4f75e1.npy +02691156-4a300ea7cbe3ae58a42c49797afd1f5c.npy +02808440-c1b1aeff3537eacd3321831d2245cf06.npy +03759954-c7dc827236dd6d0f67964ba700cd97f5.npy +02933112-ae20b4fa1b552b62614d87bbb5364f6a.npy +04090263-2193f3624198ede23f0af1eceae2dd4.npy +03001627-aa300965dead4fa33f09c790ddd20f8c.npy +02958343-1641efa5c92514d86c4f4dbcda5f2fc0.npy +02924116-dfc6fa5fce5d47cfc42dfacd196ded31.npy +04530566-bea0e3452120318b8c954439655c356e.npy +02828884-5a074a3422d783cbad7b4c3c92e50b84.npy +04379243-14f3de4c23d535e92c528d33bca1ac2.npy +02691156-58d23c8bf0902cc590b1d6deb98feec6.npy +03948459-2db5da73d177fe773ffeeaac0d1e84d4.npy +04256520-a7be35f955f8d45419fb4103277a6b93.npy +04379243-2e7cb2cbfbbb4d002ee19ebe356c2dcb.npy +04099429-c236c7fef78dae828457d30df312d8bf.npy +04530566-66fcc3b9b53e0564d619719db5285416.npy +03211117-fa48bff74086eb8ad69923e104170fc5.npy +03691459-f4308c030df7d027ced68ac20944148.npy +02958343-1f416598fe329a88b1bb46d2556ba67d.npy +02958343-f33b310ba5e68b82becf71e2e014ff6f.npy +03001627-893e3f15f023e9abdba08b82bf5c2f3.npy +04401088-893ed9fc527a8329d3fdfcd95fe3518a.npy +04379243-393d3977af188cd7798c257640d6867.npy +03211117-ac81f325fbc993d3eb42617d0a1c53b.npy +04379243-b3b8817a8b781fce2e4761573669341a.npy +03211117-b0952767eeb21b88e2b075a80e28c81b.npy +03636649-555152a8e9cdbbe41afedc87fe387fe.npy +03642806-3dd1b4cdc6d3b33f676394b063daab40.npy +03928116-4b18f31c04e6d31e76ef7e6bccf9fa31.npy +04468005-88c8695f2796d660dc14ba0818ee5cec.npy +02808440-4a41317b5baa2d52c658b057b1ffe06f.npy +04379243-f17661552a06bf85282d5d529f9dee5b.npy +04379243-824e0f5fd086565a4eee3420590dc822.npy +02933112-8e9a51408589448bc59350d819542ec7.npy +02992529-5ba2137f5131db06219e978e6e16d30b.npy +04379243-edbff6864a97cd6aa1b5ceeca96f6fbc.npy +03001627-aa412e95e1f9c047d9b53420a5458c53.npy +04460130-c2a2b8c3b9884d5095c46bada0d9437f.npy +04379243-8fdb0cce840b2977d0edc2a586731adb.npy +04379243-89bfd0ececc5a00b6e861001bc3826a.npy +02691156-8eeb9f69fc9ef1b0b45fd154bd3b6957.npy +04256520-3a62563bdb750b988b83086412477462.npy +04090263-8fcd6435e32af3f729454b854b87bde8.npy +04379243-b699dcd9de34b5023002761e7a3ba3bd.npy +02958343-692a66739b9ed5e14c88b7369bd6883d.npy +03001627-5d9906be39e2ee012f24668c019c448f.npy +02992529-8ede5d8c00e10a2ff35554ebed2bf2.npy +04379243-e1bdefc225831db150fa82c2f036109a.npy +04379243-43deedd337b00bfcf84b0be7f50940eb.npy +04379243-4fa88f9362f216481b99c25df49800ad.npy +03001627-40567b0166658623b80ea7d1a9683df8.npy +03001627-92e2317fd0d0129bb910025244eec99a.npy +03001627-a20760333defff73d2ef7d159eb54508.npy +02808440-a46408e74eb7430893a9c38d07133147.npy +04379243-3a0bb4b6c7245e0435836c728d324152.npy +03467517-2c2fc56385be92b493f0194265a9746c.npy +02808440-99ee0eaaa7511e2344221bef0fa3c36b.npy +03046257-8d127c73436dba6741ca67b3a986966c.npy +03001627-d7e26a070ee3b35cdf6cfab91d65bb91.npy +03991062-7a931ec996edbfeacb2a965e75be701c.npy +03691459-91d876c2c51a81797ad9e38d6dd6575e.npy +02958343-5dbed4f17ebc271a3aac79fb478fb6b.npy +03636649-4b7ba911d5504501b320860840f0eeef.npy +04379243-5b621e5fe06ebfc7b71f7e05ca67f031.npy +03991062-10433e5bd8fa2a337b00c7b93209c459.npy +02691156-830f3e14a8882ea0f4fb6842b3610149.npy +04379243-15fd9085d9aaa0fa43ed4f51d7ae210f.npy +04401088-75d6dd4112038b8359aa4ad538fd90de.npy +03691459-2d53b9798c7ffe7a6e55c6c7c80df9dd.npy +02828884-cc5d0040931906ae81faebbdea6bd9be.npy +04379243-1fe846f8b74b5fc66b510e987fd42f59.npy +04379243-d1b97ecf63191e19c19a59cdcb309b91.npy +04379243-9b2ee4ca099fdcebb4c161851ed2b4e4.npy +03001627-ea5c19a6ea9b13719fb4103277a6b93.npy +02958343-d9b2fc71e809140bbe40bb45ea25a041.npy +04379243-5aa3a0e7ef40f2d385c2318bffd77ab.npy +03642806-7d9e5d105941adf17dde8647dee63fd8.npy +03928116-96a3da8cbaa34575ca5363ae2c24c8a9.npy +04256520-d255253a4af43b4d4cb1d8db6be39c65.npy +04379243-982e83068fcf2f26a0b169584d4ab1c8.npy +03636649-78dc5a0c38d5aa2fe59f529cd1b6faa8.npy +02691156-cdb17eb7b14c83f225e27d5227712286.npy +03001627-8afad2d7f30c9f02ebeb1e6a8111f53.npy +03046257-46320beb087955da408e862e5daf1757.npy +04330267-298fc1492df14dbc96c91a9093ecb199.npy +02828884-ad9a12cce63df1c9870f22c94729669b.npy +02933112-187f9c840611133b7fa41e06a7f4a88.npy +04256520-3637b0d6db204c0414038d588fd1342f.npy +03467517-8f974059b8ddb17b40dcbf42c0e79c66.npy +02958343-af834c760bf3c75043f0e92e826556b8.npy +03211117-8bd568244e513b09c3a0fa8ea839ee26.npy +03001627-73379ebbbac81af13ee8e30b29f70dfc.npy +03624134-a683ed081504a35e4a9a3a0b87d50a92.npy +04530566-bea93ebc1fa965ab34292139f0435d74.npy +03938244-f3833476297f19c664b3b9b23ddfcbc.npy +03636649-6e268cddf895c20ffcb8d8c6d4df8143.npy +02691156-e841e17e3256acf38699933784576e73.npy +03001627-6a5ee2ac74c81e9d470412e9b69c8933.npy +02871439-b07cf8ae0b87b01ad8c063432abc4bb9.npy +04530566-39b7b83a42af6d83ad0582c282e8474.npy +03593526-76677da63039c6d9e6a735b744b69aa4.npy +04379243-3ea744a70049d4edbd069216df40b64d.npy +03691459-4d74d8c3df7a85051d225d751745cd28.npy +03337140-4a914da1b8325f1fb2029d92310f4aeb.npy +04090263-7eaed6f53420b4ca51cfdb4c9f126c12.npy +04256520-945a038c3e0c46ec19fb4103277a6b93.npy +03636649-a7b9dc38c80e86fbb13604bbce4eb6a8.npy +03001627-e507b4d0aedf8451504721639e19f609.npy +03636649-708aa847cb730f07fcb8d8c6d4df8143.npy +02933112-2bda2392d5715d16c59350d819542ec7.npy +04090263-4344ea073ad91f7ed87c63d8b3018b58.npy +02691156-a799568755357be8a07b3b853565360b.npy +03467517-904838f2757b1534b90a4f86cdfdcadf.npy +04379243-4a3641784a9ecca04fa8d6439169bda4.npy +04379243-8cc6cd529cbd74b5769cf9dd5d8f2768.npy +04090263-8978ffe2b8b770c363e66191800dfc8a.npy +03001627-c65cd2f7588764872b70eac6546e93fd.npy +03636649-6c0b3b0c6bc6eb97862d7667d873e591.npy +03001627-e6c11fed9469141ace8fba09dd640742.npy +03467517-fa82872eb8c9017f343b0b12983b9982.npy +03211117-e46e45f94470b45ad1924b802935a37a.npy +04379243-5e8f470250f92a0f597976c675750537.npy +03001627-19ce953da9aa8065d747a43c11e738e9.npy +03046257-f18450425e69b37b76e9713f57a5fcb6.npy +04379243-894e095c7036c8411933ffef19678834.npy +04530566-c2b394de8407988bb538a15c6737824e.npy +03001627-47c33af88f4926676213fd2f62884e62.npy +03211117-e6585f8ce05ee27cf8bee374511267d3.npy +03001627-f5490bd0c64cd42b9ca5a26dad9fbaa.npy +03001627-49110d0e41bb90b8b8e1b99345a5afd4.npy +03046257-ae570b0ec2b265cd14621506c22882a0.npy +03337140-80f1221d6a11a5dd4c3aee8e9d3a6ffa.npy +04460130-759121663da89b5e7cb17ae4c4c3b9d7.npy +02924116-4273a55343037d40fc319b95010c3346.npy +03790512-90a521e0def2631fd5dde04c96fd8146.npy +04379243-30c88fa790ac14f750d31060ff1b5551.npy +02958343-f045547c7c6e5d0ae74479f4823fa2bd.npy +03642806-f8028a9b5e095caa8051d8192a80578f.npy +04379243-8cb5ae6c0998479a8cbb8bac2032149c.npy +03593526-1c17748268b02c1c8da95317eef6e82a.npy +02924116-98b171ff0df70474ced1f1f28cdae790.npy +02691156-9dbc0aba1311e7b8663e90eaf6b4ca52.npy +04530566-e5ede813e9f07ee4f3e39f2e17005efc.npy +04379243-66517b894b9ea3ffe22ea6d770699e4b.npy +02958343-657ea4181e337213fa7c23b34a0b219.npy +04530566-daa873aacd7960d61d2d2f3b717d35d5.npy +02958343-36ba5d46f034ec58236804c5ee26a2ab.npy +03001627-d02eda9e00688d71d0c63a304a95442d.npy +04379243-1d06d1bc8f10c45ab1732c7d45a02ba0.npy +04330267-44fe1c2abda6a722e793cc5433bece89.npy +04074963-2c6493d31849c15a75f1efca97bee05a.npy +03211117-b6070e5c314eb16033fe3b9714de209e.npy +04379243-a9aac9089791465d30db3da8ce2a0a12.npy +02958343-3ead00eade22d0aeb376886260eb15c1.npy +03211117-3057eaec13a196fd5b244f7c2ed32e73.npy +04530566-3de0aae73a33188ecc8c5a250a07787a.npy +02933112-bfec781e562e1dde3eec26c23f5bc80b.npy +03001627-2bbf00f0c583fd8a4b3c42e318f3affc.npy +02992529-1105c21040f11b4aec5c418afd946fad.npy +04379243-8d0563a9920592d10b3ff08c68acccf.npy +04379243-df5b55da209637624b3c42e318f3affc.npy +03001627-33cd8045bfb42e53dca072a2e97c1839.npy +04379243-82a60a0aaec8d532150d30262f9b49dc.npy +02691156-ff52c059efaca3c1ca8607f540cc62ba.npy +03001627-4e8d8792a3a6390b36b0f2a1430e993a.npy +04090263-5c76d759674869d559db9878902bfe69.npy +02958343-a4aede8e488db95220363e2561dd589a.npy +02933112-6c4fa2f9e7e938a15cc8912051dd9ae3.npy +04468005-f2560eb50ed3fd09d248376edfe1878a.npy +04379243-e97106cc8bd3ef5730bbd4cddd04c77b.npy +04256520-21c071912ffe86fdf564f8e3eeb8449e.npy +02871439-e481fd4e0120f72875ffdbace36c25f8.npy +04530566-704aaee1bba4d220179fa02faff22219.npy +04379243-f4ce170a6abb80b081654cb17c02fd.npy +04379243-d157a0598ef5c33416e09341cb9bfb7.npy +03797390-9ff8400080c77feac2ad6fd1941624c3.npy +03001627-990d8c0c0008081fff2c92c2a4f65876.npy +04401088-bf2f0de18abd3bebdc858d428f2620a3.npy +03001627-c7087db2f1ec6e62acd2bb6205825cb.npy +03642806-79b420b8fdf6a37db747d76ca5db985e.npy +03001627-e5f381dd81cca6a36a348179d243c2c5.npy +02828884-e7a18e21f877b039f4fb4dee5181bee.npy +04379243-ea98f80f4a663d7bdadcd309a90928c9.npy +04090263-55fe2a8c65c9f24424ee6c77dead162b.npy +04256520-b1cfde20b5b0194af91663a74ccd2338.npy +04225987-11aaf89382b3a4de983ec12a2b33f18b.npy +03001627-751b12c6e22386a49a195befe1c2db74.npy +03001627-c0e667218359978d94ba68807fec4bf4.npy +03624134-89c6acb3635f9a85c15cf6e5ad80f2da.npy +02828884-7f6db7a3f529949601104cd2d998272.npy +02828884-ba6348031c6f0a795213cec267286d18.npy +03001627-cf662e6564c5c3c5ce60514f9a637ce.npy +03691459-403649d8cf6b019d5c01f9a624be205a.npy +04379243-7cf228b6fe5c6c596c342cf382162bc7.npy +03928116-613cc0f0663a29cf1ef241de847b5ca2.npy +03642806-1312ea502b4e9b51701c1f58e22b85e8.npy +02992529-27f7ab052f3fce42b35f223cefd97829.npy +02808440-77e53f8e3e624a1cccd0340812259a39.npy +04468005-65bd12f0cc488e76202d683f37bb765b.npy +04256520-4c29dcad235ff80df51f77a6d7299806.npy +04379243-13e19274b358ec867aa3000697a75d55.npy +04379243-4b687008902de4543e3a599e79b43485.npy +04379243-3d8616a9aa4a8c87cba9038a9140d5df.npy +03991062-58916943ab7cf2b4a73e364671ba824.npy +03325088-99e55a6a9ab18d31cc9c4c1909a0f80.npy +04379243-9377b1b5c83bb05ce76bc197b3a3ffc0.npy +02924116-a54664830fb18ba48391de56a6a5b902.npy +04090263-20d48326842d7c601274aa253a241db2.npy +02958343-cb9577139b34703945e8a12904b50643.npy +02958343-88a814d2107f882d3d30c6f269d07627.npy +04379243-13cdbfd56085fc3af51f77a6d7299806.npy +03001627-48ae43c032e9f89737f67f4322e8d3d0.npy +04379243-40b48121d1879be2ee0605a41c3320d6.npy +04379243-6f13be4d995e55b25ed28ed911e69310.npy +02992529-f9418c13ca82fb887f75fa9740df3aa6.npy +02924116-685c9ef95d3e779aeb0efde6945afda8.npy +04530566-327be46d4b15ba2aa79c0870e481d9eb.npy +03001627-6af8d7bfa508b8d23759750e8db40476.npy +03001627-b1f5b155f8e080c765ae658fdfdd758d.npy +03001627-10991b3b01cc6cc99982a4d6320875e.npy +03211117-ed90f61317c3d3598435a9b7d922cf3b.npy +04379243-5d10c947cde5f37f2e7ed79f4f48ff79.npy +03211117-a5c6d3b9945df19dc534b4cdb1fd80d6.npy +03001627-696bafb55dc14fa4638f48a6603fb3ff.npy +04379243-7a415346ab7eb481f8d77b3fd14416e3.npy +02880940-92f04b8d36c98d18221d647283ba1e26.npy +04090263-c514a4eb146d84163a04e41b7ea7de8d.npy +03001627-8e7714615a4b1e6f82390c5f604e0d9b.npy +02958343-19cd3489f05d203f9ed410a010efa019.npy +03211117-21e8d146503b0e72d9651cd1d591d64d.npy +04379243-e2121844a25d93b2c3bd24f986301745.npy +02828884-280553e975d6b79fd2b12aa6a0f050b3.npy +02691156-7b1d4aff088fa3736e0f3d76ecf4a53f.npy +03325088-61a58b21c73a7f7db362845c6edb57fc.npy +04090263-59ac1042dbfeb36e51cfdb4c9f126c12.npy +02958343-846f4ad1db06d8791e0b067dee925db4.npy +02828884-6718a5b3f89a5d8844c3e89e175ff663.npy +04090263-477f00b10a859851abefc916dc2adb50.npy +04401088-27c4bf6a96c6439a86a04ec9e4169973.npy +03636649-6a635b75306512b3fcb8d8c6d4df8143.npy +03593526-badbcf9d64bd24c868c6661a48aa297e.npy +04379243-6e08e7ef76b1c27027f02aaa836b59f6.npy +03691459-46de1dfe54a261b4c7e1f9c70054d66b.npy +03691459-de68b68a234de1a0ea2f8efb8b3faa3.npy +04090263-b5c1dcf4ccc0b8aca74fb613494614a8.npy +03211117-d53e94b52e0cd47f71dd5d95c394249c.npy +03991062-91e6349193ef212d14b9fab7373cf259.npy +02942699-3b5838e660e2eee27f85a81aa54b70ae.npy +02924116-92bf837e546da42abc7f39bf011e847f.npy +02876657-1a7ba1f4c892e2da30711cdbdbc73924.npy +03691459-bfe4ba1b06404e4bae19bd5568e6325.npy +03001627-b2c62e5b20b34fad5844a4d0ab925627.npy +04530566-75991571412e7ce74059b9174ed51649.npy +03001627-cbf829a6c4df229dfebad4f49b26ec52.npy +02924116-a74020b26b3a942a6c2ab21b9089d9eb.npy +03001627-b351e06f5826444c19fb4103277a6b93.npy +04379243-30335a7b507390407689cc8768f5250.npy +03636649-5493cc3e023e9e6ffcb8d8c6d4df8143.npy +04530566-58b6ab987872ed42f36dc23129445ac0.npy +02691156-408af35642971375be13ce34aa7c0c1c.npy +04379243-a3f060a21d7a29bfe5b095b06da9076.npy +03001627-ba9b35c49d861f7f4e994a4c55e56a4f.npy +02958343-3a98adfdc309cca9cec94038e2141ac1.npy +02828884-6a78bd21ec72d396f155d75bbf62b80.npy +02958343-84498085850b19d11673e1c313348a01.npy +02933112-359fbb601801fa9b5588a2543ef0b0b4.npy +04256520-8494a1f6985e8173bcdc50d6b73788ae.npy +02747177-97e3b7b4688c2a93f155d75bbf62b80.npy +03001627-8f1a661dc1048e36297936c81e7f6629.npy +04379243-481e00e4559705c616a2b5862518c93.npy +03001627-51733b725532817ac8687ff9b0b4e4ac.npy +04401088-d79b59ea51a9d80c483afc91de6851e4.npy +04256520-4cb25759388ec29935fd302efa96f6d6.npy +04379243-4aab0e569f1dc3bc8d7e9f13fd8f661d.npy +02933112-a62c9f6091337b5cd5382f3f8f33a9f4.npy +03991062-5d567a0b5b57d8ab8b6558e44187a06e.npy +04330267-2c0c7a289d37157ecd8f3fe9ca2145e1.npy +02691156-69d471ccfdf9e55cace8f9c62f7ef839.npy +02691156-b97446f1c30c0ed7b13143dea57f5eda.npy +02933112-bf57fe6a331137c2abaf316e4a957cb1.npy +03337140-b91dad01a72aaf9f91c352d02061b3f7.npy +02691156-c7c5bb658cafcc7c67711f7c205c5b63.npy +04530566-9d3f9edb3fe0ada39bddaef1ba7e1752.npy +02958343-673ee096916a5440a96c7d9d13cfe9b4.npy +03001627-923bce0b230f5a1a2c919c0510a0815f.npy +03797390-61c10dccfa8e508e2d66cbf6a91063.npy +02876657-807ef57d3d9d13eeccf25325b962dc82.npy +04256520-681f7af0ffc7e220db6d2ff65cc5b310.npy +03636649-8304e6daccb18c2de3855de370260f05.npy +02958343-556ec1ccfcb79f08a7fd25564c2e888e.npy +04256520-1f75847dbddcd34afac76e6fcbdc3631.npy +02691156-a367bcfb5d26801a848c716e284f561f.npy +03636649-1e10f920ed440021cbded0430ad5ccf.npy +02828884-fd38474cc1c62274f155d75bbf62b80.npy +03513137-385480a2554374862cc4218c4be3f082.npy +04256520-89045848f586c0a729404a50338e24e7.npy +02747177-75dbeb01fdc7f265d0a96520c31993ad.npy +02958343-ddc5e41245918030f014feb3e3bb3ace.npy +03211117-27107e057772be0d6b07917e9ad0834a.npy +02691156-f963bac7f45473cdb33bc7516e53285e.npy +04225987-212e0563473156e255483301a044235.npy +02946921-3a7d8f866de1890bab97e834e9ba876c.npy +03991062-47adc9b7d6d281662c528d33bca1ac2.npy +03691459-82b56b6d371031ab7c8813aa71327b73.npy +02876657-5a58f9c3966c1248a7c2417f4b260d59.npy +04379243-c8532b5928b242d29ccce4c6d5bb195f.npy +02691156-bc92b144ec7029782e7c68eb5d1b9123.npy +04530566-3e5e782373516ad760ddc468fe733ed1.npy +03636649-21a4556c02678fd7e59f529cd1b6faa8.npy +02958343-9a556cde3d153c6230e527480f210909.npy +03642806-2416c2fcbae368a7b95c83f902f3aac0.npy +02933112-66a82a157f4a1c9a22e05b27cb30bde.npy +04256520-430d315cdf5b3ca7963845a6a5eacb6c.npy +04256520-c5dd746e08121f8f71a782a4379556c7.npy +04379243-bfb8531870be8be971a782a4379556c7.npy +02691156-dd465efdee6a57e966cf1b4a8fc3914e.npy +04379243-cf9ed2af8cb3085917b431cae0dd70ed.npy +02924116-a0ff4e261a0d8875193d7855ecfc1bd3.npy +02828884-c023275b1a68d6432056b4bd5d870b47.npy +03325088-7b6c6838bc4bd4d33321831d2245cf06.npy +03642806-df624231ef05b83d54c7ab6aa5674ccc.npy +04379243-44d6debd1db8c2e57fb0dc5c3ba15465.npy +02992529-3d5d7e610fc235cbcce71a7ef3de6f04.npy +02691156-41aafedd84a6fa7490baeef8ba5b93e5.npy +02828884-2a45727df039318ea46a4c5f3c2363fa.npy +03001627-c5479437882e03eb282d0900e186958f.npy +04379243-6b1a24847e5b666de3b5d4a92fbfd4bd.npy +04256520-14658bfae450e891b89b974fa14a05a.npy +03991062-d69e25b85eee67d06b99047335b63e1a.npy +04090263-27c9d26c58200a1527be842e82df28b3.npy +02747177-8e09a584fe5fa78deb69804478f9c547.npy +04256520-a731e2ceb44d59e1cbc66df5fc1969c2.npy +02691156-43edf9f02a027ed162f11c7bf54cc1ed.npy +03636649-676ec374028a24db76e29c9c43bc7aa.npy +04256520-71a4f27e4c6fa0a1362d127df6d94eb.npy +04530566-51537c56f71ec82acfd826dd468a5497.npy +02958343-5c997a7c241190937cbd61b2affd051d.npy +04379243-52c72274af4c7e19910979f825490a99.npy +03928116-6060bfa3909185f78ce35a9a4af57797.npy +03636649-f01358d4f45cae23ce670f026edf07e5.npy +04090263-a299aa2fee9a1d297ca8eb6ffcff94f6.npy +03691459-3a7b68f7312c16f1e9bb042b8623f922.npy +04379243-43b0de9be0df3ecf51f77a6d7299806.npy +03691459-704d0b362588638aa249f8489bc060dd.npy +04379243-c0a18b8e41041386e1a698146efec195.npy +02958343-6de0b37d14cc7c7393680c5a9a367b4a.npy +04530566-c0f619a710e4cccd15c8f969616647e5.npy +04256520-c866adf9f2d0bdd9f3598efd14e493d5.npy +03636649-94f9cf8754e2f080fcb8d8c6d4df8143.npy +04256520-77090c15f738bf3079da6431b0766445.npy +02691156-f087be2dec869154acb63dc32be3cb01.npy +02747177-b2e03341b4648a3d63b2acb037dfbcde.npy +03001627-11c8f43ef796e23941e621b1a4bf507f.npy +04379243-25136703ff8fe0a8a27b22aaa3daadd6.npy +04379243-f10f579a973af061fc527605fed20d9c.npy +03691459-6d24eaf8aa3c362fdb6f3ca49e992ad8.npy +02828884-b73da1e1a2f2f549d4d8765e3910f617.npy +02808440-2ae90c52820a705a16af3198c99de08.npy +04256520-dc2b5f9abce70f2b55f9a00acc25f137.npy +04379243-9c62e14436f27b6c457ba044c28858b1.npy +03001627-dfc9e6a84553253ef91663a74ccd2338.npy +03211117-bb5b1f086ec0012d2e80bae93fb41fe8.npy +04379243-f25cf833c2200fef239d0ce9a68d2afa.npy +04530566-75aef09a516f59da49f73a97204d432b.npy +03636649-101d0e7dbd07d8247dfd6bf7196ba84d.npy +02992529-b4795b53530c26c58b13932a0c28e98b.npy +03001627-6124a2bebfa255719fb4103277a6b93.npy +02958343-1fb16b5399a4b3a710bd1697bfc4e3eb.npy +02691156-1818597d398db8f7f1f82f6fc8747b8.npy +03001627-78e1977bc5f0f4041552c6ecbda964b.npy +03948459-429202f8d250310f8a937c1a7380813.npy +02992529-8e3e1213e47661506457f8736d1c9e5d.npy +03001627-c8963b0930306a61781cbff504e4168d.npy +02691156-ccfe789ebc77be87e71a4f02883f26bc.npy +02828884-9a3310c20959245b791985eda7619303.npy +03001627-f12a3ffbe0f8b5076253bf0968762241.npy +03001627-c8938f54fecab41e77cd061c90fcdb44.npy +04530566-aa741f0f7784b791e99164b294d0c671.npy +03001627-584ab19b5df1fe697daabf84de73fb1d.npy +02808440-af1626daddb7a607b805ea9e53402739.npy +04379243-4d14547b54611e9bcf1ee9bc9708f08c.npy +04090263-6bf9cdb0f879a8f894deaa9fff391d41.npy +03928116-44001374b5037d9373a1732868f719ba.npy +04379243-2da4d3085b438b4f35836c728d324152.npy +04256520-a613610e1b9eda601e20309da4bdcbd0.npy +04401088-fa21f65c051ea2577500d68c500fdb4b.npy +04256520-82aee3c5088d005414038d588fd1342f.npy +03624134-88251eef61ac727945fc4bc75aa67159.npy +03325088-f705e6e60a4d9ff576c18e71fd49c4dc.npy +02946921-adaaccc7f642dee1288ef234853f8b4d.npy +03001627-7a8b8bbd24974013327289c00b6dc9ca.npy +04004475-8af6cb411190ba2df20c09ee03883555.npy +03001627-48429b3467c7185060fcaed6cc231482.npy +03636649-967b6aa33d17c109e81edb73cdd34eeb.npy +04401088-7afdaca858bb0a964a28575f3344964.npy +04460130-9024bb81d726d584dfda46c9a34dab22.npy +03642806-5515081bfe708008edf29b343d09db45.npy +04330267-cbe066eb10e871454b3c42e318f3affc.npy +02808440-5395c36e4449a364a0986899fca7913.npy +04379243-1f0c62f30be6f19aa6fc75a75fb8d65e.npy +02808440-bdc71b9efd77276f9f39bedffcf91275.npy +02691156-6d119be1286c7b129a6e43b878d5b335.npy +02958343-296a15d4e4b903db94b42287616a3ea7.npy +02958343-78471673cb8ef99f78ae9714eeb937af.npy +02933112-3d8183c2f6c0003bc59350d819542ec7.npy +02958343-193ec1089f0a98a36518e6cd1fbc5fab.npy +03046257-15ba3509f1dbe068f546596ce7364503.npy +04379243-8a42ddd769a999a9e6942c5426df6055.npy +03001627-e792a2d799d79bc1b249ecc7669d184f.npy +03001627-bd4fb5e30bd993727eaeab1f0c9120b7.npy +03337140-53af35fe75337509bce0d8d171e7e87b.npy +02801938-a91387fd7e02ab1fe1642713fcd8a902.npy +04379243-b19e399e93447dbdd2dd99b484971e89.npy +04379243-760f49288c2691b5b4d1176ea5549480.npy +04379243-2d12d4984230e79a4b3c42e318f3affc.npy +04379243-a56200b624a644f7df6cfab91d65bb91.npy +02818832-2b692b1963908c87a792c81933e4614e.npy +04379243-51d386439cb748c54f2b9e837678be87.npy +04090263-55821f1ee5efcd6280c2e60c312b0f09.npy +03001627-955ee3a20ba242414580ed619ae2daa1.npy +03325088-be6b8a7eeecd8e572101dcac4ed75d3.npy +02958343-1a30678509a1fdfa7fb5267a071ae23a.npy +04530566-337381e4b5c11c4f8c9312de4e9cb8a8.npy +04530566-853edd2a09215d83aad3e4869fb7b555.npy +02933112-6b984c6b1e49d9dc59f8e31ca87c470e.npy +04256520-73379ebbbac81af13ee8e30b29f70dfc.npy +03790512-bae59e64a50d3aa2f68f798d07e007b6.npy +02924116-9348a737cfd5f36f30bc176d97eaf5ed.npy +04090263-47dbdfdcbd971cd2203f35d9b3b48203.npy +04530566-81358250f7b811e73c70f7afafd32393.npy +03001627-be1e5985324b401be92225287f8225f7.npy +04379243-6b43cb708670013d2a475baffed905d.npy +03636649-78c87f00ebe9491e2cd2160e449d45ae.npy +02691156-853dc1e740631bf2ffa79951b9f955a3.npy +03337140-352dee789cb5b1c64c3aee8e9d3a6ffa.npy +03046257-d295c1b6b9d134a65f7f2cf289fe662b.npy +02958343-46adf74e07a86c55e370ad7734071a37.npy +04090263-5de2a57211e47dbd1f56bd5c23e00f1d.npy +04460130-b88387c316d85bf6544a7584e1bfdef4.npy +04256520-1712200bca469561d20e3ea5765d7edb.npy +04090263-11549f435b7454563571d7763ba5a413.npy +04379243-b08dc9e0fd675e6664adc666ed4e2ec1.npy +02876657-d297d1b0e4f0c244f61150ce90be197a.npy +02924116-523033507a9eae1eb77d370c8664bf4c.npy +04004475-ef5296fc06b736d038e6072b52bce43a.npy +04379243-f469759b2790b6cf6c1a170c83f9532f.npy +04401088-170f4eab739637f2a101047bb63a1772.npy +04379243-369b720841edc539611a3acf20a3c963.npy +03001627-8e9812ad9e12d467679c9e94dfb2276d.npy +02958343-5e014eb2bd03daab9fbe97de4a41d527.npy +02808440-a375d94c02f2924b550584dfc8970d11.npy +02828884-2902b377edd4b48aa3a0c1cc16d124ad.npy +02924116-97e9d6aa1011555352470de2774d6099.npy +04530566-6371cc04f48161ec43b0018b6edb5e48.npy +04256520-1b5ae67e2ffb387341fbc1e2da054acb.npy +02958343-8b049c92888475f67c3c6f82a395b347.npy +02958343-9dd5fb440759181035fea498c4ba7c5a.npy +02924116-1582c81bf7dff678d26b2d2076566bb8.npy +04330267-64f6f5a386e63a1d5eb64c1003065596.npy +02828884-dd86f9095341d19af155d75bbf62b80.npy +04379243-b266c6e40c1e976ef3c6b7a01c418f2d.npy +04256520-1b28eabac10276cb7062f2d72cde5c95.npy +04256520-93d943320472c9fc599dcc439b161a52.npy +02958343-ec67edc59aef93d9f5274507f44ab711.npy +04379243-d187561a6b0cbd0acaed5ce7390f30b7.npy +02691156-953baa426dac775bbc8c4428ef1dffc7.npy +03001627-d0500d229baf05b0e83221ad0d21775.npy +03211117-421ad85cbba562878fc3447f3635506f.npy +03211117-198eebeca7243399ca5ca7089655f058.npy +04379243-1dc7f7d076afd0ccf11c3739edd52fa3.npy +03001627-2ae4f1392d44ca24654a275ea978255.npy +03636649-2161683c44a7dc356bd865f153842b49.npy +04379243-35705c4e27888e5d27b31bdeb5f5c79.npy +03636649-5eb0e18b12f4940d6f97b7cf7ff5d41.npy +03001627-45f32105a1d05455bc996a5f03fd7bf5.npy +02992529-ed0f3e1d20fc722bb0478ec258b0ea3d.npy +03691459-5027b6f6c32b0d28daf9b9aae267bea7.npy +04090263-403195be81485468d10b86bd6e8bbc34.npy +02828884-30d3152964e13201520d2a054af1eb24.npy +02958343-86b488c74b27d70ace27281f3b76d1f5.npy +03001627-96a19b41f440040426f59f4497a464fc.npy +03001627-76283716a2c6586e266d673a6188bf4c.npy +04379243-5000e001c72cebf44f60f15da4c665d0.npy +02958343-2fe7e3fc47dad6c7afe1d4530f4c6e24.npy +03001627-37a0959115e6fb4ce7c7920f6a65a54d.npy +02924116-c87efc4c88f58fb3cb1288ccd7a59563.npy +02933112-4e31ddf3828a40f3cd525309aaf63a44.npy +03691459-2034f891fe2d1e79bb51f8b36601764d.npy +03001627-3c408a4ad6d57c3651bc6269fcd1b4c0.npy +02958343-38f403b915d950d3ce8f4a5eeb103d2.npy +03938244-db211dc89ca9e40c29dab95fdd4a19d8.npy +02933112-d7fe270a81b0f21c3fe047712e43e185.npy +04379243-e6a89aaa226b116a60885f79b3a5579a.npy +04379243-45acacde58d7717aaa7cb30470f3273c.npy +04401088-758b9da6bf573838d214322c26aa0cfd.npy +04379243-5a3789ede7e60884e35c5921850b7bf.npy +02958343-30f0ba361010ea11e66cabd11ba41eae.npy +03001627-58a8f29ec056a19f71a782a4379556c7.npy +03211117-dbcc94dbf216e37588bef8ce0a02fc04.npy +02958343-aa9cb692a7ca1070b2d2900ee0ae7e0.npy +02958343-5a841a8269d3560d756e18912340de0e.npy +03001627-87991eba27985f3a417a8f1d2c94eaf6.npy +03467517-feab270427cee00a24eeca91f583600.npy +04401088-d9d06d2772ecc526c0dc3ed657ab97f0.npy +02933112-5294d0d31a33e67912de5317fe5b354f.npy +03211117-b11d7ae45f5a84de8641d137e7c33076.npy +03211117-fdf5375eea4c3858498a04ba00344041.npy +03642806-689667fca044e15b941a99145cf33e72.npy +03337140-ca206dfa66c21cd728b0a3696528436d.npy +02958343-ece361a95a2ede4e629cf5743e29cdb3.npy +02691156-84de1d44d8795d5876817284cd40c7c1.npy +03691459-de5a57d8fce504ced747b49524a1246e.npy +04379243-b70483396e091a75808b6f0b77e3bec3.npy +02958343-c8bd4d0ac34266ffaaa232d0915adae9.npy +04401088-ef2472e661320b03e324fbf60278e45a.npy +02933112-a0beaab9a8c2f0954e7d60def15dcb8b.npy +04379243-90cd6a48cf2789a9b430d97a45d5824.npy +04090263-d81bac8b449807bab7b81b671e901c39.npy +02958343-9c0f4c3c72190a6ebda733a39f84326d.npy +03001627-7fa4db28bd803691c91adfee365fdcaf.npy +03691459-1499859135ccc6b267bde58c681df405.npy +03001627-e4c84068e4c56e53bf8b9d530de7a108.npy +02691156-b07608c9c3962cf4db73445864b72015.npy +04256520-9b88f0839b22b33022fea5173e5c6318.npy +04530566-5e0e9215f91c163d7c513e87d3f6c6c.npy +04379243-3b082e34a78a3c23100d4716c7fbfbed.npy +02992529-e2d49d74845ff0207e1c85c5c15da7fb.npy +04090263-20468faa3d66dce03cfd5b33045bf719.npy +03001627-e00b802d5b93172741052e43309393de.npy +04379243-73157856beb04619eda877ebd51b3abd.npy +04379243-283e5cbc29b92fcc8cbb8bac2032149c.npy +02808440-693b8a150f9e844e50539bb73fa8aaff.npy +02958343-8680d89294724815d9976212be28e1b.npy +03001627-fb858b9e5f2b3e1043dbb6421d614c0d.npy +02958343-49b67421f1aecb54619e733243629008.npy +02992529-8a62ea56cad1ea25430f38f25519fb5.npy +03325088-882d5e269c44830976c18e71fd49c4dc.npy +03642806-13f5cbc78856f977927930e64238782e.npy +04379243-43f2e83d015469c71ba2f806cba87b47.npy +03636649-71090d1b424b4b4b29eb9d04ea723179.npy +02801938-955ee4b78f049d9b5af4278cc885a78f.npy +02691156-3b5b8a2384e8850d185b376619557c95.npy +04256520-8659f0f422096e3d26f6c8b5b75f0ee9.npy +03001627-e6a5c9fdb609d00a5ff6fe84f53e00a5.npy +04379243-bf9df04aea08b0f0f51f77a6d7299806.npy +03467517-62f77c35b213ce976ac47c8f9e87947a.npy +04379243-2b6fd7a94ad69b019ad1212263439f22.npy +02691156-444d67950ff9a4cc1139bebb00fe5be8.npy +04401088-c6ad139da5e0799c712cb59213324f9d.npy +04256520-aa1da8200477456bab610b0c94236463.npy +04256520-a0c9e23365a3516dd60ef9801956a8d9.npy +04379243-ca77f1d8d0151975901e3cd572b4fe52.npy +03001627-932bb63e4525d57b3b8dea4a358cbf0d.npy +03593526-7dcc9324c5c23029bc54d7012755d50c.npy +04256520-2ab2a7cdbd8770318f17764fa642770.npy +02828884-f5f8c8e5d2de751f63b2acb037dfbcde.npy +03636649-853c5ea3c279b9e9f7887b5467c02fc8.npy +04090263-4315071df41d5766a7ebb24c1614411d.npy +04256520-4d33fb26aa7baeef88dcbe86402c7c15.npy +02876657-7bf5bbcff98f3d272561bfd89201eee3.npy +02691156-460f2b6d8f4dc18d565895440030d853.npy +04330267-994e7339a67306d75eb64c1003065596.npy +04530566-b9c516eec45c825979283d5c77809cc1.npy +02691156-e8ceb64406509714e5dcd47593c60221.npy +04379243-a877ec39efb4c8cff37af16b2893f1d4.npy +03211117-b05a54988fb28d20d0b341c1c5648015.npy +02942699-5334cfe15f80099f15ac67104577aee7.npy +02691156-d276954441de1e878a3d2bbe7d58317e.npy +03001627-8bdb589e5e0e7f57b04cb542e2c50eb4.npy +04090263-5f68ccfe85cba73d2a23d93958262ccc.npy +04379243-6b1b63af6ccd71a1b129901f80d24b7b.npy +04530566-2f0acfd47622a8fa419fe456f622e6b2.npy +02924116-294c7bbfbc67edf72232a4c7acb57248.npy +03001627-58867a00409c47c0813a1237d2827540.npy +04379243-35e033efcf79391ef581ec61f9db71f.npy +03991062-990903dc0a1b416681faebbdea6bd9be.npy +03991062-9d7710e65ad393114b3c42e318f3affc.npy +03001627-a7b9f9e341c74b8d57ddce8e42aa6e90.npy +02691156-f59a2be8fd084418bbf3143b1cb6076a.npy +04530566-5e9890e2f4cab96dbc6cd96a5e6546c.npy +03691459-dc8d31790da3b1c6c06fb481fc51ebd6.npy +03636649-3533b9eff82f2f9cf22140029982c6f4.npy +04554684-39e2a2eac45d9ee9961469926610c5fc.npy +03691459-bc547d63373a98997dc4f6934317af74.npy +04379243-deb8b5c0baed637625f61c02205f9a5c.npy +02958343-b30efada80553a1d202258c0423dde73.npy +02924116-7d9109eeba6fa218ceeb72b524f3e0ca.npy +04225987-87115860707b0208813c2f803c03ef9f.npy +02828884-afe3b299132016512056b4bd5d870b47.npy +02958343-37a75534a7a006ffbda733a39f84326d.npy +04256520-9d5815f9ba8f0ddb19fb4103277a6b93.npy +03001627-4c0d8f04f27f96284417bea8868af4d1.npy +03001627-b884ff155c4117a7508dd48e67ad44bc.npy +03046257-70e6d9a58bec336898d5fc0473d00a1c.npy +02958343-e5d6df012b219fa6a7c4dca3ad2d19bf.npy +04090263-157c2b391f7a7dda1a857c47fd0ecdc3.npy +04256520-28e246db6ffc3497384b87f5fc9c7afe.npy +04256520-8b62bb92edcede30886ee1269f93c784.npy +02691156-64dbeac5250de2bfc5d50480246d2c40.npy +02747177-.npy +02958343-70e27da90dec2de49604bf8c981ad1eb.npy +03001627-2de1bd62aef66dc9bf65e1af50b5b7d4.npy +04379243-a90e18bb9bdadf6a6d8b4dad28688a76.npy +02933112-a631a1a99b21cd92b87eaf81a9afbbe.npy +02747177-e91da0c5c59ec4c8cb2a965e75be701c.npy +03046257-6d12c792767c7d46bf3c901830f323db.npy +04530566-368dadba3b837dd926be51fab07b7ec6.npy +04468005-212b58e8aa6ceadc196c433756c6bebf.npy +02691156-7dc614fd957186cf216b327569dd806e.npy +03991062-b00fc3306eab53e0459a1ad9a3821e02.npy +02818832-2b8633b9bdb72ea215dd7d7985e749c1.npy +04004475-90fc6f7b0b84755796348cae6ab0021.npy +03046257-341c76da1822e1793a86a6fba656f58b.npy +03001627-5893038d979ce1bb725c7e2164996f48.npy +03337140-5ce6aa474b597edb4d3a0a56bdd58a7d.npy +04379243-99d03f162477263b22996d48badb33c9.npy +04401088-82aeb34ab6fa282766148e8aa85ea356.npy +02933112-6ab14d89360d0a55ff3ea34d08547895.npy +02691156-72a74e13c2424c19f2b0736dd4d8afe0.npy +03001627-f4a0767a3d7039c38a841ccdc50a763.npy +04379243-aafa8e4293eca14d6bb54533c16c8fa.npy +02933112-87b62cc2f0368983824662341ce2b233.npy +04256520-630d612af74628053b28ebac0b25d03d.npy +04379243-4a4f58b882325236f6e8f2cf4a97051f.npy +03001627-f00c1688bd33aae28cbb8bac2032149c.npy +03991062-7b0e40cc37ff733d4437e0a6aa050dc2.npy +02691156-c91e7b5681d8aeadb81009266e6622c4.npy +02924116-cb39ceab50b3c984bcdd0fb2fc18a716.npy +03001627-268f73b8f57676a71732dfc96352c472.npy +04256520-8426b07a7f599d011a3b39b07e4b3d0f.npy +04379243-5d7631230b4fab707934a0d24a61231.npy +03001627-3d66c60796d59662ea693790a1608aab.npy +03467517-ed1ca9a829715b78a71985b33d2601e3.npy +03001627-f6988e6ca8ed9261492d9da2668ec34c.npy +04090263-f6fceaf62bdb85c05e9786b1603f45c8.npy +03001627-398c1d570b642b6cf91663a74ccd2338.npy +04379243-79ea27001d37617b4f7c5e1744a5e6f5.npy +03938244-ab60bad52d6244db86052e834fbd2c4a.npy +04330267-9bc1d272c82f528376a2788017b16c37.npy +02808440-5841ba7ec3f334dab362845c6edb57fc.npy +03624134-481f304ae81616c54e09ebaf49b0cb2f.npy +03948459-2acea60043da129a5a003776cb72cb3a.npy +03593526-9d1a07991391ecec6b7154919b02cbec.npy +04530566-7e35bae76c10fd7968cdca3005c2cffc.npy +04530566-9798a8da8fb83d63847c4e55bb965ab0.npy +02691156-d5f01e2aa54bbf28ca8607f540cc62ba.npy +03691459-457c7205d3a193c01692dd4d739ce02f.npy +03001627-b13a4df698183bf9afb6676a5cd782b6.npy +02691156-57f30880519c8270e58d21f41272cdad.npy +04379243-30cd6bee25352baed5857f15f877a4e5.npy +03211117-668f2602ee2cd581a312d1c0842a5165.npy +03948459-50fcbde9d69020130a1f1f44ddfeac.npy +04379243-df7f8b7ea0e2c4ee55f46d55537192b6.npy +04530566-782b29db43c02f7442b917ff8145b491.npy +03636649-e5e9ff118631c2a3ee088de33038f12a.npy +02828884-1167fd85d3dc7c8df4fb4dee5181bee.npy +04379243-dc1645a2d2b61e5950794366030f78b.npy +02924116-32cb1cec0bcc12c7c6bf3b18b8ca71a.npy +03790512-49b7ec863c4599aabd1734e75169b9e0.npy +02691156-a26639a06e2ae1ede7d756565593b850.npy +03001627-29656461b26f620ff3c9c1464e55d580.npy +04090263-e59086e0a9bf161b170efd05fec8727.npy +02933112-4b2e20535d3ecd016b7154919b02cbec.npy +04379243-da09745bd5be34b9aaff8bf395bfe94.npy +03691459-a1c80145373d98837dc4f6934317af74.npy +04090263-8456aa006d740061bd8fcb0281cd4d0a.npy +04379243-cc554812025dc498e7ed5b5b11f935c9.npy +02933112-47ffa354257d2e3b20f4d1b537b5ee90.npy +02880940-38d2122b2aa05f92e1b9b7b3765e2bea.npy +04460130-1ebb17d0790e384844e2f9503fe415b5.npy +04379243-2c0b0f0e9ac21f6ca1a2ce4cc65d552c.npy +03001627-9ec08262ef59d69d6412cccabcef91eb.npy +03001627-fa0e922a339bc7dfeb9a9ca952f63e23.npy +03467517-32969766a65974e9e52028751701a83.npy +04379243-69ec86dbd4df85e51ee2805756841071.npy +02828884-988d4a7f08e66aa3d42b9650f19dd425.npy +02958343-6d618b1cbb187baf6c6f7354ef18ac49.npy +02933112-2175d15f93051f0bc59350d819542ec7.npy +04379243-6d4e96c31d1b1f9d16aeb5e4ffcb8813.npy +02871439-bfcced53e67cf63ad80f4eff3307724d.npy +04379243-3dee82c33d65b74a99e8bf807e902261.npy +03636649-f6a7d85ccca5e5e34a6ecce2eeb45768.npy +03001627-4b3ddc244c521f5c6a9ab6fc87e1604e.npy +04379243-f5de3fdb7c073f48dbbc9440457e303e.npy +04379243-fccd86d2aa3c565334aff3344c00890c.npy +04379243-bd12dca2d655a093bda72093f9b5aa73.npy +04530566-f65e78e69d1d5eac465721b273720f4c.npy +04379243-34ec5656afb6860af3c9c1464e55d580.npy +02691156-6509073d1ff37d683d41f76be7f2e91f.npy +03001627-cc8066a5107a2bf5926f2c1927eee8ee.npy +04379243-b15ff00cf3ec4dda14038d588fd1342f.npy +03691459-74d27bf812f4a7d83a2dfdc3f38ea6c3.npy +04379243-ac747a86af391b9548f9d76a105d8448.npy +04379243-c472e242175ecc75dea0c7d7198f1b0c.npy +03636649-8e03bd383d8696a7ccca59c0649ee0d0.npy +02691156-f88906b677e97695f4126163bc622a34.npy +02871439-8eeacd5e91d7f70e9881fc457f8cf42.npy +03325088-50090633b32bb6adb362845c6edb57fc.npy +03593526-bc6d5b787a1672cec8687ff9b0b4e4ac.npy +03211117-8c4a886b6b2c8d94d7f301df5d83f77e.npy +02958343-6d8da7ec9ead6677701c1f58e22b85e8.npy +03636649-53afad2e573b26b141657e31b569b105.npy +02808440-e7f07d51b5261395ede9471c962dd6ba.npy +02924116-3ae82c64c5c9c0b7ab26c897f52b5439.npy +04330267-df78913fe9070bf682b4ca3750aa2fb.npy +04256520-9ab0a81e580dc1f4f008d8a3590fb522.npy +02691156-5515a62182afd357f2b0736dd4d8afe0.npy +04090263-25d950a8c7fcf04b57855ed10703bbe0.npy +03691459-a6453864512f46dd747b49524a1246e.npy +04379243-7efa6d2ff959183c3002761e7a3ba3bd.npy +04090263-581f03521f0253636d75fedffe6398b3.npy +03001627-13990109140043c919fb4103277a6b93.npy +02691156-739c8cadb1db6db39a6e43b878d5b335.npy +04530566-1317defca6e05d78e9fa15608cc1561f.npy +02958343-3c685bf24a135262e88791d6267b8a1a.npy +04379243-6a52c7461aa23233c2e50348f23d3d.npy +04379243-4fde6d734ef8490336d4accc80b34c1b.npy +04256520-e62a984beecfdd9a695c69bb6f9606c8.npy +04460130-aec546edcda7c5abe579ef1e3d185e3c.npy +02876657-dd280525cf000bc3a608634464309a70.npy +02691156-1c673748703c99207f1f82f6fc8747b8.npy +04256520-fdb3ab843f2a244eb9b4a0bf4166f120.npy +03790512-803f90199731098552ee90e577613070.npy +02691156-a68e67e5fa7ae694d9a7daf2d70e57bd.npy +02958343-988108a7536d686824065b218dc1b5b9.npy +04379243-5a38d21dd30f52e972463ee0ec4cc614.npy +04099429-e02e5bc1a52b63523df4fa4547276fc2.npy +04379243-d634c7577c8bc1f0492d9da2668ec34c.npy +04256520-e61751c485c937fa717300ec93e59c63.npy +04379243-bfcff8d45de2f950f751d8c0e5773abb.npy +02828884-557899ea369eedd4cb2a965e75be701c.npy +04256520-fe602b7929307607e59b39f8355b80d.npy +03797390-b4ae56d6638d5338de671f28c83d2dcb.npy +02828884-5dea347d55e0704d1992408f320d16dc.npy +03211117-871dcd6740ed8d2891a7ac029a825f73.npy +02933112-3824d4b03e74afe0743d4e4333af43e6.npy +02992529-bef91c1804ec226e5b1c02ea3a290822.npy +04256520-2528b8f7ad0a177e1491843220e463ea.npy +02747177-6dae7248443fdad9f4fb4dee5181bee.npy +04379243-e6cb8965b985b8a07eec403e4de3e723.npy +04379243-1f8ff48858b1d78136c236fff3cd03ce.npy +03593526-d31eea002a8dbbd744f73d1b4abfedac.npy +03636649-c89d854d5c61e751cdd3c867acb77e12.npy +02880940-709778e5ebb67e32b396efafc0d0d8ac.npy +03636649-bb0ab5c460ddbd65ef3a269219210793.npy +04379243-a9b81cb82f73f249f7248d9dbed7a7b8.npy +02691156-ed73e946a138f3cfbc0909d98a1ff2b4.npy +04379243-5fe3476df92392e1397aad305ec14786.npy +03636649-f41fdea6ec38439193b00be700931140.npy +02876657-d74bc917899133e080c257afea181fa2.npy +04256520-4781d90373fffdcaf9aec59741c69cf7.npy +04090263-46ac5939e2eb53189a3e2fa8a8e389f2.npy +04379243-201833c55354f1a2d1d1bb832a2f0352.npy +02691156-e3c26c3920b93f36eb7fefaef8eada2b.npy +03790512-47054c1839830834a88e8cb97b773125.npy +03001627-2c2fbe0622220e7cf51f77a6d7299806.npy +04256520-22ca96b824795ba8ef188758bf2e3a30.npy +02958343-eb40501934995e1a6560c47a91b4db1.npy +03691459-d80f344b9de3e280610652dddb029059.npy +03001627-b2a658572331c578340a1d09e918e861.npy +02958343-db14f415a203403e2d7d789814cae761.npy +03325088-486fd6e4809c8c59b362845c6edb57fc.npy +03691459-c4ca7f58c6144e1416eb1b6d0ba9133c.npy +02691156-8af46946b9b2b3aacf0820a704ed425d.npy +04379243-7f1019432a168f451512cfcf562674ac.npy +02958343-1a3782ae4bd711b66b418c7d9fedcaa9.npy +04379243-89580ac98637f985c3bd24f986301745.npy +03928116-638cfdad8f5f9e0989964e04888bd74a.npy +04379243-55d2be43d71717e1f4b6538438a0b930.npy +03211117-5a9951b9945e67566d260179aed5cd80.npy +03211117-87882e55a8914e78a3cb15c59bd3ecf2.npy +02924116-38ff0caad9fc3437cce85fd33c4e1aaa.npy +03636649-80e9c1d6499b6a9689ab11a408196888.npy +04379243-99a43717f3487aac63fba60e6c90121a.npy +03642806-fdec2b8af5dd988cef56c22fd326c67.npy +03790512-6921ac96d7bedf7bd5dde04c96fd8146.npy +02958343-cdec84be0cc9364eecfe83f5db813c4f.npy +04401088-234d1646b21fd765ee45e1eced971f52.npy +04256520-1fe1411b6c8097acf008d8a3590fb522.npy +02924116-cc8bc88b246896e92f8244e4db35c973.npy +02691156-7a97d3dadc608b4350f01eb2b12b0a8.npy +02958343-86d5ba5d14672ae7becf71e2e014ff6f.npy +04256520-3af5eddf5022015788dcbe86402c7c15.npy +04225987-36221454034311a4fcaae723fa352fe6.npy +02828884-50612adf11f22931d2b12aa6a0f050b3.npy +03991062-1a1a0794670a2114d6bef0ac9b3a5962.npy +03928116-e3d5f6dbff73a7a5e769f0986786b881.npy +03001627-3db18530ff6bbb50f130e9cdbbb1cf40.npy +04379243-e9d6ce5bdae4462aa187e6150daf1a0.npy +02946921-e8c446c352b84189bc8d62498ee8e85f.npy +04530566-24ce8f07f05d14bfb274bf54d5e89093.npy +02808440-1dc36bb29702c28b3321831d2245cf06.npy +04379243-9d547457c4404412635469b95109803c.npy +04379243-cc8e9d46def8065c5fc367a00ce4b49d.npy +04401088-68189c0fdca1a8744db121a0d72356af.npy +02828884-b3c8573a2d8b0a14c347936f40ef6857.npy +04530566-60ecf4adf9e115f91eff78a25c58572c.npy +04379243-49e0fb5a2318e4c1b0a15036380e635e.npy +02958343-325ce7d1af0e0621221f497d46720397.npy +04530566-3b8c16861667747fcfea3d4fc15719ea.npy +02828884-273c618c2d24a562ad5067eac75a07f7.npy +03001627-b7aabc0069ea63e096d5fa1ee6ada8d1.npy +04256520-5e0fa460af0e5e898223ee0bdd50697.npy +02924116-acdd5984ea1c11d3d687ba8afc125512.npy +04090263-5ffa1a012a2b18fc83b41d2cfd151bad.npy +03691459-10e079ff34f99777bcb3fc1376c3a85d.npy +02747177-889768abe1e56957769df73d7c60d904.npy +02924116-4ece51cc1786dd0a7a49a4f3f2ced32.npy +02871439-a392e8e541daf1d9b33454de94308f9d.npy +03001627-5ac8b44ff77e5490c8687ff9b0b4e4ac.npy +03211117-14add565ff90153855f9913e822d5318.npy +03636649-dc6c499e71d04971d22730b0728b2fc9.npy +02843684-b4449f8b823bdba634e9af37b2b44021.npy +04379243-5c8668d215fd79079a037b4abf810691.npy +04256520-523516236632fbc8c799384bc2c5517c.npy +03797390-e984fd7e97c2be347eaeab1f0c9120b7.npy +03624134-7cfcd09e09a697f3d870ada59aadeb87.npy +02871439-28af0f5a5e055917b52c730840dc727f.npy +04256520-26d36969b0ef62b1c2c449c0c0579ec3.npy +02933112-9460ebcbd28a8cb7d5a4a04ac21f0578.npy +02958343-7c7e5b4fa56d8ed654b40bc735c6fdf6.npy +03636649-6ccb43088eda061dbfc838749f053cf9.npy +03001627-413a7b8c5de6dd4ebb7b779fe99ae983.npy +04256520-776e86412e7f3c6dffb78a7278f8e374.npy +04090263-f955bfc9ff0d300cbd2411bccc731f79.npy +04379243-c8662ebf433759bd4bcc3951a8858950.npy +03467517-b2f7148aedd45f2e48067bd564571c7d.npy +02958343-31998170afc1a0b9d13bda570aea1f6d.npy +03642806-519e98268bee56dddbb1de10c9529bf7.npy +03001627-bfc6b2328c9c12bf283b00891f680579.npy +02828884-7b17313f2c00178b2a4d67a8ec314d2a.npy +04401088-a53b3ac989d9e6f35f8a15a7cb97bf7a.npy +04530566-49665c3dca5441d77c0ab7347b9e831a.npy +04530566-72d110284cdf597e68b6f3ae18faf6b7.npy +03991062-ddabcd35f817876272d7be5a06d0679f.npy +04379243-bf3b3076b1f43b8a855931d119219022.npy +02933112-5217e7aa71d06df2921dd903dd0b8b17.npy +02876657-948e374b08979da230612f5c0ef21eb8.npy +02958343-d9deccd1a5dcd5d1b7ad70a0cfa5f7b6.npy +04256520-8aa7651cbe3651d64af957103f4767ac.npy +02808440-68f9ebf8529d567ab362845c6edb57fc.npy +03642806-fd54faba3bd95b6d6d59d46ccb8deb56.npy +03467517-590110ef2859bc70a3063540dfdfeebd.npy +02958343-e95d4b7aa9617eb05c58fd6a60e080a.npy +02933112-3332c4ac1fd931d01586ac387fea1cf9.npy +02958343-17600a4881b1ff6a5c14de0cb75f4d3e.npy +02958343-51048ab1eeca5e8dee79ed7216eaef91.npy +02933112-11ee3844cf96c7194da5feafe6f1c8fc.npy +04530566-aca0172e1b301b8b60c68a106ad561fd.npy +02958343-298e8c0d9ce547b4e1e2aee44e822aa9.npy +03001627-f73dde8df5d0e5c7f91663a74ccd2338.npy +03691459-52e710a9bb750e3235cd53a06b1d2317.npy +04090263-596c401bf2ea21e55e9786b1603f45c8.npy +03991062-bcc3ae4de443d29b1b70317901324056.npy +03636649-a0963082bcabc46b762a4fefad9c8461.npy +02691156-f8f4cccabf7ac33b199dff268d0aba38.npy +02828884-2830e62e4c5fc707f155d75bbf62b80.npy +03636649-1c6701a695ba1b8228eb8d149efa4062.npy +03001627-bd7566c32259e41b4c161851ed2b4e4.npy +03001627-4e5c18c87a10f050e7469a3f8248f48.npy +02958343-1e6e7bfb08b6b44d615949fb78ffe44f.npy +04530566-fddb69f72a853e2f8ff5243f1df2529.npy +03001627-44b0b359d2eab610c2a3b7c9bad24907.npy +04379243-827af0ff0d9eaad196a3517f50eeb9f4.npy +04090263-71d9d636a30ed1e7d6a22172ba0f0af7.npy +02924116-1aeac7d5572ece389cec6ee5e26b0519.npy +02828884-7f7956f11a1fdfd0d81202a54291c0af.npy +03948459-f3f6678898938575575e33965575974.npy +03991062-486eb0ed2f97b9fcffc6e457221b9271.npy +02958343-797804cd4594553156b22cefbc2dcb87.npy +03636649-ea5ae3cfd142c3b923f93f957094a824.npy +03624134-9c7caa0ce8694300ab448fe46134225e.npy +04379243-30e12322c7e23ac358db0ef36af1d3c5.npy +02992529-5cf5bbb8f745033195c9a4bc0e92777e.npy +04256520-724ee53f18ea8e77cc166099a6fe7573.npy +03046257-108b7ee0ca90a60cdb98a62365dd8bc1.npy +04379243-18be1556eb4da5af7ccf848ce05c84be.npy +03642806-7bdac195f81588ff743bd44138e7d2e5.npy +03211117-75617d66e4d82ea2318461dc09ee739c.npy +02828884-b1adfb9857fc98fc28fbd1dd69384cf9.npy +02933112-73c2405d760e35adf51f77a6d7299806.npy +02691156-db0c0fc7ce05d372311e3590f044c241.npy +02958343-fc1840952ac878c99b63159808b36877.npy +02691156-f1210d8f895e40b663c15773e7567372.npy +03001627-6abdb0b46d2a3fd02813aa30be7ebdbc.npy +02933112-140c308db70cd2674da5feafe6f1c8fc.npy +04379243-57754ca0ec4fce12990d726e600161b7.npy +02691156-521b82ced564aa2c8ee17de2c75c8e96.npy +03593526-f84313fa79e1bbd3d826e39f6130227f.npy +04379243-d3c31829b1295d0abf22a5ca4fa4678e.npy +02828884-531658856a6347b1f4b6538438a0b930.npy +02818832-bf6bc80cb11e131362cc0ece5cfe0d88.npy +04379243-e0e00d2012c4306117fcdb9c02a9e950.npy +04090263-5de8bdd7f586399ee0685d22b2927984.npy +02958343-d21ffd4838ff2ca75a30f4aa03635c5a.npy +02880940-5b6d840652f0050061d624c546a68fec.npy +03593526-6e97b8fd720790455ca1f314f1afc186.npy +03790512-c1acd4ce749a46a6dc2693ab94b1f3be.npy +04379243-3fcea883442d7e5bc0f947750540fb22.npy +04379243-3f9b11fdf6d5aa3d9c75eb4326997fae.npy +03001627-a9ee7abdaba4ed6c14817c31e6492a06.npy +04401088-692e46bc27bcdcebbdc2330c91f5a859.npy +04379243-69d4ba3043aee963dc2bc8a782be94b8.npy +02691156-4ee420a617a2bb40bd4fd4a5b9107dc4.npy +02691156-f13827d156628467b4cdad9a5bf52dd5.npy +03467517-a7f449a1f2cd1f1693f0194265a9746c.npy +02828884-5a383d9a0e67caed4ea8cb420cbb292f.npy +02992529-69b74f6c66dc2adf5a627be422951096.npy +03001627-295a3bb2aa43b691ed2d43425218e827.npy +02958343-98316f2e772d60587e5e3333f4cc9f83.npy +02691156-f2975fde05d9d63eeea0c0561850e04e.npy +03001627-47a661b489119b764b3c42e318f3affc.npy +02691156-ecd19c1f74064962c6603e997b54421a.npy +04256520-c80c48b901ad94effebad4f49b26ec52.npy +03001627-86a25532f255728fdaeb838d0771f3b5.npy +04256520-3bc7d4d59503cc92c1a25f36f85c3fd6.npy +02876657-8f2b8d281413a8bd5b326e4735ab9003.npy +04379243-ed45493414f9214687694c57464ff1e3.npy +04379243-41283ae87a29fbbe76bc197b3a3ffc0.npy +03001627-ff9b59e29b547dd504721639e19f609.npy +03001627-7238d2ade707fd1e6c63b8b48495261a.npy +03001627-2acc2a87aef7cc559ca96b2737246fca.npy +03001627-afbd7d1e68be93ac35836c728d324152.npy +02933112-c5212968cd5ef1dc3c6e7539caf3791c.npy +03636649-60697ef538d1372f5bc104fbace43d56.npy +02691156-98c0c90dcce8f9ee3ba77af508a192c0.npy +03991062-f1dfb16470f5c7e22553e89eb4de13bf.npy +04401088-fecfbab790d979a25d560b84ad8d9e87.npy +04256520-aadc03f6499b5ec5b60747861a92b009.npy +03467517-86088a6aadd3e08963e148e250c0340d.npy +03593526-cb9b25b587bad917e6085a0a38e2f255.npy +02958343-7825218160564f137039b7b9eba2e0f7.npy +02933112-d410c925c5e8ebd65b7f630bf166b499.npy +02828884-a4c8d232f7943e61af8dca8fa046a737.npy +03593526-d3e31e11258926104d38ef17af2f7d70.npy +03636649-f1cc6b6fa75bd67ff51f77a6d7299806.npy +03001627-e56087cd55cce8b4f41a4361d0ca9bc8.npy +02691156-48cb2de06f46cde25ed29e0a9f14425.npy +04530566-9c4d83025107322b2aed6a9a322ced74.npy +02691156-e4bdcd6baad501ab2a8b9d468136b0a1.npy +03001627-df59c2ab638e5bf47c4b9c3e153dc1c0.npy +03001627-ba3b1064eddca7212d19175e7d19b7cb.npy +04530566-31f7c298ea24bb99847c4e55bb965ab0.npy +04379243-f73d62321bd0a5b7d42ec7e303174a87.npy +02828884-4fb9527f357f37f99dac46bde4c69ef2.npy +04004475-71bc31bea1c38cc22e90f5e9b0ad48f4.npy +04256520-b16b22f49cfd1d2541dc8e09670d2b5d.npy +04379243-82f5867145f64346a9cf1782d21bd9ca.npy +03691459-a88fabb4286706afbb9b205a4c97698a.npy +04379243-bd4662a53f8efdd955f46d55537192b6.npy +04530566-5b6044746e12fb6733b68f5ec4e8a690.npy +03636649-9af0807b146c564a45c4ecb2f4b73702.npy +04379243-72cc0fe296b9172617271868b642acd3.npy +02992529-a523f6e5662f8f178ddf0e44d13d17e3.npy +03211117-dede15a6e1d27b9bd2458bf307c1dd72.npy +03636649-e1fe4f81f074abc3e6597d391ab6fcc1.npy +03001627-f3e50f6d0b7b293035836c728d324152.npy +03467517-13c12d297a29357919179b9e5a0c010c.npy +03001627-5b1d0dad82acd6e5893104fdda835c64.npy +04256520-2fbf971de875a1277df50de84a56e505.npy +03636649-b54f6d30b6edd7f1579cea75b38cb7ce.npy +02871439-a96c3d0ab048b72d1e678557cfa9c9cf.npy +04090263-87dfac7fdf6e81bacbc6ff5546f4ec42.npy +03001627-9527b62eaae8f007259ae7b2899be714.npy +03337140-3a40cea19ff1dea4ce5d6e9371bb5c33.npy +02924116-5271016b64559e2141cefd10ce5d6cc0.npy +04256520-f98615e51a596fc5c05575120a46cd3b.npy +03211117-cfe8df98fcd4964d9d58cf21d5faaa2c.npy +03991062-70a30729c23aa5ab5425a71c247ca5d1.npy +02958343-88a476c48a4cb5e72d0c578824da8af5.npy +04379243-c547a17e35360322fd6501c4dd41b22d.npy +04379243-ade4f7281cc55e016fad58965decd164.npy +02691156-41c7470ce9ecb74b6f9423fcc87803f2.npy +04099429-b66ae0c5ca74decf613bdc6883aa3f40.npy +02691156-5ac00867c7d78b1690b1d6deb98feec6.npy +04379243-ea3bcd9e6c4205031964126395b17c2a.npy +04256520-40cdebefbd3bc2634c7384dbb75cab0d.npy +03001627-a09a88c11d0b27368821ad3452f1c8c9.npy +04090263-e0513d1ceaac23ad341b8a806253912c.npy +04090263-fccd8e7b6bb1a6eea1ce1dd4c7e01188.npy +03001627-4178fab56c04a32ae8f8c11a24c52ebb.npy +02691156-d9eaf9c7d58279dc9a6e43b878d5b335.npy +04256520-22b11483d6a2461814038d588fd1342f.npy +03001627-811c349efc40c6feaf288f952624966.npy +02958343-532070461b869aa7468dbcd58a793b1.npy +03991062-7aef12ad7f602053d4d8765e3910f617.npy +02691156-c1c341e597c01d3814a46d7ec44fc258.npy +04379243-2367a0e01767df36dc40b058754deaf8.npy +03636649-a1f602d18e9c0f06733c22d8b8e1c33d.npy +04530566-6313352481b445a8ecbbed03ea2b4cdc.npy +03211117-dac4f4f039a9467f46d83d16be057f3e.npy +04090263-a262b6955756cbea34250dfcf5a9a6d5.npy +03710193-a1fd2eb471c5b5345a3d5de8976cd08.npy +04379243-e7c8486921138d5c7ff6ace05b36a5.npy +03928116-6a0839a9bd3c10b7f2c5403cbf111281.npy +03211117-a536c6a5f1a118feac653254a68e1397.npy +04090263-58e1eb81bae67052c79f92df566f8c6b.npy +04379243-161be2d2421c18154e61d5e9018b6ba9.npy +02828884-77fd0def3c3469adf155d75bbf62b80.npy +04256520-d6d69d04e3c34465e9fa215d22832290.npy +02958343-307e83044ed81f6c473f10e6caaeca56.npy +04256520-cb643270a86e8fcc19fb4103277a6b93.npy +04379243-60c0cb7599fddb50d3d709dbfce9caca.npy +02933112-1fd36ae1d93b6f3fc59350d819542ec7.npy +02691156-611c65a9a9099c6121e570d3da54bf9d.npy +02808440-b450fdd06d466db83321831d2245cf06.npy +03001627-80e45b0a5fc1d3ed68bbb8e471856979.npy +03325088-9b68d5578e58f8c46d0157e3e7a8917c.npy +02880940-be8a2f8460a963426a6acc5f155f864.npy +02933112-3e858a898accc14132f8567794723a79.npy +03467517-e3f45b5945315a939526648647837830.npy +03325088-227084bd966b704d50da8b99982a3057.npy +03642806-6a9cffdd120720a6512143cd347a4650.npy +04379243-ced7d80d220dca01ce5b275ea2158e2.npy +02924116-5eecd4415ae176b6c6bf3b18b8ca71a.npy +02691156-cccf4d96e0e3d728c93b40751084c22.npy +04256520-882d5d8f49e52e81a53276bbe109327a.npy +04090263-32d410088758f9bb89dcfda443251892.npy +03642806-56517e22979b563460ac9d6174947ab2.npy +04379243-523ac3575244c7f3a130bbab7337a0cf.npy +03642806-cb6ae19022733ef1956ad4a5a9b8400c.npy +04379243-c31fb1b1dc95160d8f893d87da13e049.npy +03642806-cc0535a34cdc7d676bf98d15712168f.npy +02691156-a5cd14be786fc8175e9e2656aff7dd5b.npy +04090263-12ad493bc65380df1ec84866750af1e6.npy +02933112-b399f7819e05c8bd492d9da2668ec34c.npy +03001627-21e0ce3ed3e9452c93271d2223fe04be.npy +04330267-58caa0426be5f71f41965be83b7745a.npy +03046257-f7f1df271259f793ba0661808286ba45.npy +02958343-5503658520e08b519b58a6529594c9d.npy +03325088-92637cff21142487d84d1b7b18d6e7c7.npy +02691156-657439efe649f57f47f8deec944763f7.npy +04401088-f6679591247bc328afb07a946d621b3c.npy +04379243-b62798e1d1075115e870ecf4c364a4c9.npy +04401088-dacb3f6f6b0cc7a52b1abd641c06dcad.npy +04256520-5f5c4e66f07fc2695c0be177939e290.npy +04379243-a342324aeff75ec7983d269bb8e4ede9.npy +03001627-a4d7c8b97066cb74f63e8e405d49b8ce.npy +04379243-80e1d8c228dced88ba6d62b5b05dcbc0.npy +04379243-fe20b0cb9c6a922d58df8eeaf3dad1c.npy +03991062-6ba49cb9ef1992a2a2c59a4d90e63212.npy +02958343-445185842d893b6978fe949fc1419876.npy +02691156-29fd29045703ff18b4a8b7176ed97248.npy +04090263-ab379b3916c45a78710c119014476e8f.npy +03001627-2c4d7d33ecb486532569827d39fc0af3.npy +04256520-7ab86358957e386d76de5cade2fd5247.npy +02933112-8cf41a94663c7fe24da5feafe6f1c8fc.npy +03211117-9ff60c2ab8d5a15abad8372756ee3232.npy +03001627-bd1787066323c7a64424fc4d3c9cb157.npy +02958343-dc3c6748e5f96cee9b3f352e6fa9112e.npy +03691459-d1274fdcd4f8a611fe10244ee697dc96.npy +03636649-d385523f0cd93d48d6084fb53091249.npy +03938244-24b7f744e060522993450a6db2a946b4.npy +04256520-7d71922494b8788ce10ddc5f810dd417.npy +03001627-8d1616ada1d6f239d1f4836ba5ad2863.npy +04090263-39eb4b7bb1d93d94437724fec373d206.npy +02691156-51c0b132806335051592a2f89cfd307e.npy +02871439-5793619650b38e335acd449a2ae99009.npy +04379243-fe4984dbd32e69eca4ba22b64b537bba.npy +04379243-214e9b1346a498c0f51f77a6d7299806.npy +04379243-68bdc363716f181c61b4bfc684868124.npy +03467517-d37d82695b935e59d57700c05b1862d8.npy +02828884-27fd962813feeb26be25fbd47cafc694.npy +04379243-11fcb3abf0a487b9c3bd24f986301745.npy +04256520-964887dfda95963fb0957d845ac33749.npy +03636649-ce8a14614b85a8fbfcb8d8c6d4df8143.npy +02958343-7434c137695be0eaf691355a196da5f.npy +04379243-a3d5d0122b01f7be62a280769c3934a3.npy +04379243-e02925509615eb5a4eaf5bbf36d243d4.npy +02691156-8996445c6d2407c0fb5c1b0f759e2bc1.npy +02992529-1727e7aeb3d159a57f521a3dcd28e9d2.npy +04530566-a88f4ec8440e412c92336765b86c93d9.npy +04090263-1205174a90e130bf595b6fcb838bee85.npy +04090263-41c55010eb7ab373a4dd752ddde80fb1.npy +04379243-9f7a8670a87dbde9b50d0c6a0c254040.npy +04379243-f741f1bb6a7ef8ff7916bf6f8da94ee5.npy +03636649-3a0edfd418e020b97f32712aef0efc5a.npy +03001627-26638126794a48d9b0957d845ac33749.npy +04090263-7ccf43d35755a35976ad064d1c5fdd7c.npy +02691156-f9589c9b900fd33ef23c3116d040903f.npy +04379243-780799646ab0a19b589fc18f8d1e43a.npy +04256520-63484c8326f8fe73cb922bcc33df0268.npy +02691156-2d43bb802a8faf0bce15d210eb57e565.npy +03593526-1febe89e0336d5bcee106795de609335.npy +04379243-5689abd8ba685b3e72075e8b19ae0485.npy +03001627-280fe2696faf0f3a53e14f34c202d656.npy +03001627-5e706e87ca60bd19ecb01bc908e8cea6.npy +04401088-e2784eee13f340f2195cb740f5da17ea.npy +03642806-6103fd8c11413be975e42c1faa1148bb.npy +04256520-fb88e94765c2b3e9f16b2a6e0465cbb7.npy +04379243-b08e0a90b1bd3f0879492e1986fdc4e.npy +04379243-e88b21faa1d937f3695cf5feae151847.npy +04379243-32d06518fd07df9bcf004563556ddb36.npy +03642806-9f4a0de5fb60ca3e1ec0c47eb137bcb.npy +02691156-5d2f0bdbd08be6fa3105bdad0abb9e24.npy +04379243-14ae5631e7dfa10430bbd4cddd04c77b.npy +03001627-c04c13649c4cbc5ebed0f345f50b6a5.npy +03001627-2892ab19f2d3a88a3ee8e30b29f70dfc.npy +03691459-de5ecf353cace18574b0aadaa58fdcf7.npy +03467517-a628f408f1062c0649788b38f0ff60f2.npy +04090263-c1d5a68f196d647fb5070c7ac310bcbc.npy +02691156-b45e5b92bb4623ff151f2df200a24ac.npy +04379243-45722fed3a3035fc59f8e31ca87c470e.npy +03593526-de61c6f2300249f45dc9e54641a3f5bb.npy +02747177-af8ae2bd4ec21bfe63b2acb037dfbcde.npy +03001627-5e2003b18752e5f82f809039658ca52.npy +04090263-ea2d9117c341df9377b7d0d4764c121d.npy +02933112-d88116de5721301298fc1d0403f6ad0.npy +03691459-7e3e0b648aff4aeb6a6d1e86c6266511.npy +04379243-e1581daad0ddbbe4465d230735fb8831.npy +02958343-2ccaaa66525d7f095473e57e894e0ef5.npy +02958343-2262d8b1d5fc79b67211919686015200.npy +04256520-9af15fd5baed25b64b3c42e318f3affc.npy +04401088-cfeec23a9ea66a5021844676433a0aca.npy +04090263-281790c93c1f8876972d2a72136fdc80.npy +03325088-3dccc5e096aa99e4fe2ecb70903654e9.npy +03991062-2a7d62b731a04f5fa54b9afa882a89ed.npy +02958343-a6a1c91c92f86c463a93df79ef2b80ef.npy +02808440-f7c8d4e57a30918944221bef0fa3c36b.npy +03207941-14e9d064fe9d247127787a85c3bfabc6.npy +03636649-e4258a09db0c03bc97bc1a2d2578970d.npy +04379243-5cf6612712d8ad26c5c86021644af7b5.npy +02933112-5b08e72cfe785f4912de5317fe5b354f.npy +02691156-879a8f69cd931fe9f64801ad2940cdd5.npy +04530566-d5f0a8785afc39120dfe072b77502f8.npy +04256520-374fe2584abb594da094848ea4d06501.npy +02691156-edd9f45c7c927032db5e5b1ef1010d8b.npy +04379243-1d98ebfb72120470283b00891f680579.npy +04379243-d1611599e3dad7292f4c88fd91c6b1b.npy +02828884-7c33a6f55768b7acb97ad864945165a1.npy +03691459-5a59e8590b3f12580275d4a88484513.npy +02924116-ee672a58bf542ea464bcef064272eebc.npy +04379243-98108861d6d5235017b431cae0dd70ed.npy +04379243-739a97e0e3c446c15255bb0d3c16575.npy +04379243-7a8653592db2dea36518d4b6acd71be6.npy +04090263-72e4b314e45d67bdf371f38ed06fa82a.npy +04379243-9c510bfa2304c78480cd53d4e54e1fe.npy +03790512-7b4eb8cbc470d0d6d5dde04c96fd8146.npy +02828884-fbf16da56e709e422056b4bd5d870b47.npy +03211117-184a3f58220427c39fd28cfa9e6e405f.npy +04379243-90b0880e3c85c133cf7ff48fd8d30a70.npy +02691156-76788a2758e938f435fc197bbabcd5bd.npy +03001627-38732a2b4c03e7a8b7a8bf5e3604ae72.npy +02933112-444ff46c1275b83fefead98a255f706f.npy +02828884-1b9ddee986099bb78880edc6251fa529.npy +04379243-c712261a32a0efca4b3c42e318f3affc.npy +03593526-b828d1859065e0e4cdc03f207b7c6c79.npy +03001627-f1a1c9f231d2db078a8a3348259a374.npy +04256520-771a9729f19fcac4bbc7a6acbd8f058b.npy +04530566-5da7daeff2b24f23206066da291e8981.npy +02828884-5ee7a51ae38eda6b26b7fce5a7fdd285.npy +03991062-dab9d3c4afc644764732d159b629c6ab.npy +04379243-641f479a3b90e659282c910029b5cf54.npy +04379243-339b9707363c16d895341c0dcefceb68.npy +04379243-608ea98ce4a80a61aed393947b9cb125.npy +02828884-c20409a88bc98bc8ad5067eac75a07f7.npy +04530566-19b29e973ad05c71e0a1fe48a8d148cb.npy +04379243-22a67cefe94bd5eedb402a46aa8f1779.npy +04256520-a053322861de88a21725b4111480fea8.npy +03001627-b34b1a7cd8b645829d0103304b799f18.npy +03691459-24e25e63d6871f884358473f5b9be205.npy +03642806-7da4f6dcda3fc40db1ef4670cf6c2a91.npy +03467517-5df08ba7af60e7bfe72db292d4e13056.npy +02924116-d68a726ced8cd11848c6282fee705e22.npy +02818832-ab9e57b316f43962b738ef7a6757633a.npy +04090263-ff84eb89a2c7e1b55cd168ffead8840c.npy +02691156-53011f6c40df3d7b4f95630cc18536e0.npy +03001627-3aab16309520fb21dc0a8cba62d9a78a.npy +03636649-58e0f2ca80931a77e99f6f079f038d.npy +04379243-ba3120844f785a1430730ba8faffbad9.npy +02747177-f2c7e1b8112282dbcb2a965e75be701c.npy +04379243-b8411c6434b79e59d6686dc2df08cca5.npy +04379243-c27a1c6a26642c907ecc778b34d42f32.npy +03001627-1d9bc60209572861473f10e6caaeca56.npy +02924116-cfcf79d337e79438c98c13d6112727de.npy +03948459-cb4b38a0535101f2a39dc4a567ce225f.npy +04530566-efd174efe9130399be7ca2216dc1576a.npy +02801938-133d74f10a0401317773da01b1ba21ef.npy +04379243-b3cadc82852f5f5381901288eaf14401.npy +02691156-3948ac8a29ae42c761f027f2a55df6ea.npy +04256520-65c32eacefa3f4fe2058afcc28d23393.npy +03593526-1a01c2d7705193b4917cb569753af492.npy +03991062-d0537f977c7442aa2e51995ed62a7d39.npy +02691156-8277c0294461b76e8405970680284869.npy +03261776-e33d6e8e39a75268957b6a4f3924d982.npy +04090263-f0cdfecc69f4beb7fd434dfa483c57fa.npy +03691459-f7366c0025b2eaabf5fb60584950565b.npy +04401088-93d617cb7bf7558671fd17a89eb6aa70.npy +04379243-7eafe1321f7d566c9654713ddaad32c7.npy +02992529-88c64c14d4b6ae5aa7636d58d56f8570.npy +02828884-1ebdf871b03ae445f4b6538438a0b930.npy +02691156-db5fa6a73bbe6d35ca8607f540cc62ba.npy +02958343-eec2ea5ac4e048836a2345809e2bb169.npy +03642806-8834560018510194d8caaf6298f89d14.npy +03001627-7ee09fdece7d9142afdb9a672b7d3b8a.npy +03001627-5bdcd3d77e1c91f78e437a27fb25efdf.npy +02958343-da59928c982bc34a2a9eb0f146e94477.npy +02958343-ca6baf5768bc105ace827f20895c88ad.npy +04256520-470bc951c8b9bb5b4ea6967a5607d572.npy +03001627-a8e5e4016c44f896b1b3c8adf02d88.npy +03636649-a37695d83a39adb52866fbd701f50f71.npy +04530566-4ce56405f7f67d3c38cd6a6c9620e96d.npy +02924116-e311aaea6c2662e7193d7855ecfc1bd3.npy +03001627-e8fcc8054e445a0c20768660cf080d12.npy +04379243-c3732b612ee72d7f1071105723d4cf63.npy +03001627-7e7f1989e852eb41352fc7e973ba7787.npy +02933112-8f39d603e733eb58fcbe4e14ff0c4707.npy +03001627-6731a24561fe44839b92627dbcf8ae26.npy +04379243-910db4c45df40b67d3e19c2bbe0ed38c.npy +02933112-c7418e21982dcb508c2f9e4176bfe555.npy +02958343-3ef364afe692557edd344a2b29517bb.npy +04401088-e2ffd39f88dc381c3455cac94a339dea.npy +02933112-be1978696eddc1e980a88936375f2ef4.npy +04468005-44fa6c544b0e67ac4c4a58bade1fd64d.npy +03467517-4614d233c54498408f3f9a4bccfe246c.npy +02691156-2c3df6a4d0ddc9a69725372054c2f091.npy +03001627-9b6f17ce2db29c4c9ae35d137ece64f9.npy +03001627-e59cc0fed1520985b21bc3cf138f79e.npy +02691156-fa27e66018f82cf6e549ab640f51dca9.npy +03211117-d206f9b91dbe5693cc5743e8d662956.npy +03001627-f8c5604f39699e0fbbc2b2aef664ba29.npy +02933112-ac7935b217aeb58e19ca41cdb396f36.npy +02958343-4cecc9df9c777804816bd8f64e08b2bc.npy +02808440-8e22e5984d5149c835e1d1ee0e46a9dd.npy +02958343-ea58938dca17f3853c9cf79df3851b10.npy +03001627-11d4f2a09184ec972b9f810ad7f5cbd2.npy +04468005-bfcea023feb6fbc15c636c73fb4546c.npy +02958343-2dd2a5154bcf52c2aeebd3372dbf7ae6.npy +03636649-c2e2cbcd1cf9a5bcfcb8d8c6d4df8143.npy +03211117-a0383e1388e74ad8b0851ce87f32a267.npy +03001627-976f1a2aa3224af329d2a9b1cf0c2446.npy +03001627-4365a4d98c9b979019149a7f35de06bd.npy +04379243-1ad008783272fee4c3bd24f986301745.npy +03636649-df0823f1c81eb6bbfcb8d8c6d4df8143.npy +04379243-dd276ac55465f51e1457f3eb061a2fca.npy +03325088-c15d54b2a98d4debb36717b39afb6ad8.npy +04256520-82927175fc00ca7e593ebeeedbff73b.npy +02958343-bc9cd53b74743dcc8772afa45900d07f.npy +02933112-b8300f2e4a8adf9b31de0931bd5b560c.npy +04379243-9245ea14da5198b64b21175170c559e7.npy +04401088-ed004bce9e457ab037c7c775913296f5.npy +02924116-69233ecfef5d67e1c00633847c439a52.npy +03207941-a5a6b467cc0e55eb159fbcda62e85465.npy +03001627-4f520217376a00ac3e4dcc9f0008b73e.npy +02691156-b356ef92a2052648b8494b55ada518dc.npy +02958343-de6b2f1796b1887d84e2301109bd5b05.npy +03211117-ac06493582be880388c7562a134f5ac2.npy +02691156-6a861b7cf2552818181edaa32d7673d8.npy +03593526-26795095a52c788f664b3b9b23ddfcbc.npy +04099429-9b75297c580ff937b61ce5beb9f92726.npy +02747177-a23c4789341aa242cb2a965e75be701c.npy +02828884-d34e91db39030275fc94591f6f745953.npy +02808440-4d7ce41fe16725c5e346f79b9a86790.npy +03991062-478bb08c9de3c176a2c59a4d90e63212.npy +04379243-bccc9bc81809cc0d31a3de62b78a7245.npy +02871439-4552f6002e96cb00205444155ae5c84d.npy +04256520-43e3fd98669121eb826fc8d57346a2e4.npy +02992529-7f41f4b186fdf84c7ecaf377af2046d6.npy +03001627-5c70ab37293d81911b17743c18fb63dc.npy +02691156-796bb7d6f4d5ce8471d03b466c72ce41.npy +03797390-c0c130c04edabc657c2b66248f91b3d8.npy +03467517-8b8b084109eef6d81082f2ea630bf69e.npy +02958343-7d7af9263109f8aed4fdf31cc2d78fd0.npy +04379243-25bff1399600790bc3bd24f986301745.npy +02924116-ea5ac377dea6214c9a54987d702a03ac.npy +03337140-3d35053e01610058ce5d6e9371bb5c33.npy +02933112-94883014b900c6d6647872b8585e132f.npy +02958343-10e15fd62309a13d1812324a4c0d910.npy +03691459-fa37905b884bdb169f69aafaa5236e51.npy +03001627-60a1742f1cda02ecce5a69be7dc7d68a.npy +04401088-a262dd4b61d374c8b91c0e89daffb776.npy +03691459-f4ecacfd4fd61afceb34db531a289b8e.npy +03046257-64de924c24fb12968b48a6a0b4b6d38.npy +04379243-cebc20baf900f828147637a0471f2f73.npy +04090263-d08bf745e6f7e4b14aef47a2c7bc343b.npy +03325088-f5b60361fff872a676c18e71fd49c4dc.npy +04379243-a568d1602f94c814f8a51dbffe0021e4.npy +03337140-b8e0513adede8586820018801b237b3d.npy +04554684-da021d3f1eceeea49ffad002249ee384.npy +04379243-bfaa1c23d2622422ad16260d4d73b56.npy +04379243-a98482ce1ac411406b2cda27b9d80e15.npy +04379243-569095c884b4361f77161ca74d215eee.npy +02828884-f4b6526b744290ee5459024571014ce6.npy +04379243-443eca86041e57ab1e99b149cff6a230.npy +04379243-f39e46c8468ba7f07ba6f8f10959534c.npy +02691156-ab9e9045e6c7bc6537678474be485ca.npy +04090263-7fc4dd8163f4a67d6327d46d93c637b.npy +04530566-705df680888e17ed8841beb2e0280e42.npy +02691156-11d2af04fad0a7e2ce19d55bc5e6a406.npy +02691156-6456e87ff00e31a96efa61580a088aac.npy +04379243-cb71e1cf52531981593ebeeedbff73b.npy +03001627-741ea721bf610a9b9225fc8da7ab1c1a.npy +02828884-f5ca026c6cb2b06b56be5749887a17a3.npy +04090263-6646f169a45f40bfc510111f5d1cfcfe.npy +03636649-9b8f6e93608fb244aec118775e1a3eb4.npy +02828884-ac1b9a34ed8450bb2644d7d4d7ea2c7.npy +02958343-9803af6123238620247a5be450795511.npy +02828884-57fc8345fc8667a4d2b12aa6a0f050b3.npy +03046257-b9814ed05c91121edc6e40059e75ca86.npy +02958343-83f205b7de8e65e517f9d94e6661a9ab.npy +03636649-ab02e202accb9b4b65b77a565916c7f.npy +04379243-d330377051e6180319fb4103277a6b93.npy +04379243-3a8b062c50c0a5b7977a08097a2f2d7.npy +03636649-7cb828eb3b8e424b1e88064118b89a3e.npy +04379243-a30eb4a16f30f29498648daf3d784f2f.npy +02691156-43e078c68d2fa3b4d5d30e1306d90d74.npy +04530566-8b5ccc3b1eba2c9bdf921d807a1adbf.npy +04379243-f9573b0425b08a38f673eef39387003a.npy +02958343-2b0207d7f6a6f23bf0ff8cc77ea4c273.npy +04379243-b6457c273fca48f8b5b7c35a8e7396f2.npy +03636649-5516c456d95ec0df2de0bc4fc4d02dd6.npy +03001627-b67aacec8e98edded0b19424de5f7fe4.npy +04530566-b5a1facfd0a023251e6afa6efa6add34.npy +03211117-cfac66fe0cec664a8069dabf6dffa846.npy +04256520-1f899a4f5418158f6721e288acfdbcb2.npy +02691156-da67955425ffe66071d03b466c72ce41.npy +03691459-563b0c299b32e73327ac18a9705c27f1.npy +04090263-2e3256b3de213e7ad87c63d8b3018b58.npy +03467517-3ddfc6cbb08d60b393f0194265a9746c.npy +03642806-6227e7dd1a391e8d54f22ce0a3592d5.npy +04256520-91ceafb0b1b2008d98223ee0bdd50697.npy +04090263-32909a78138cab24d4f4334cc3aff513.npy +03928116-1b76644af9341db74a630b59d0e937b5.npy +03325088-92bff24b0c36862e979c556124bee033.npy +02992529-625e2b043a61452b80d5f0084d375f75.npy +02691156-329987191cce68bfe64acd170567d820.npy +02871439-bcc620a199d0155e6bf60d91b08331aa.npy +04090263-21d6c28c11dfaa72fb5c1b0f759e2bc1.npy +02691156-c9be9f07f5ae7c375d7629390efe0a2.npy +03001627-971539fb57b476d5c40593250b73d0c7.npy +02958343-37a7f79b9eeb5096b11647ffa4306609.npy +02818832-6df4a4c52c90d70d438e4ded908f7146.npy +02958343-4618489fc34c3367323a23bddac1281c.npy +04256520-30e95358ed817addbaa0f6b191f18222.npy +02871439-d486f1d668cc1376a3fb70cdc0074f48.npy +04379243-7364fd26628b7f6a3e0881f7de9a6e52.npy +04090263-3d7dfeb58c481e88e16974ffd95b0c65.npy +04379243-9d547553b8b68c062f3110a733450426.npy +02958343-bcc3625a31bea6cd6a2345809e2bb169.npy +04530566-adbbaa33c52c3b0d5c0be177939e290.npy +03467517-1fbbf4450cb813faed5f5791584afe61.npy +04090263-d5714c28b82df83d8d5783af2345d2c1.npy +04256520-1aa55867200ea789465e08d496c0420f.npy +04379243-2b8ffe339a50f0a5f51f77a6d7299806.npy +03928116-63bd5dd05e693b762cc8c3d5fbecbcf1.npy +02876657-48202d357e79315e45891653421dc140.npy +02691156-7b4b931c5b6f8167295338c0e33a082c.npy +02958343-261f4a30328cd40960a676833b21afd4.npy +03691459-c805f5a262130e6cb4f6b6fae7a188ad.npy +02828884-98fe81af9b74e4c278d386bfa54545.npy +04379243-35e62b9c23928bc57f5df2bc47846a54.npy +03001627-7a338e9b13ae5da3245e874042d8b8db.npy +04330267-e3d4640125f5eabce793cc5433bece89.npy +04379243-2f8395ded89cf84f40b4c5428883e585.npy +04256520-302fc57b3d180ea4733824eae5cd9ae.npy +04090263-345179cdbb6ac9da4dd752ddde80fb1.npy +02958343-bc803cea33d77530a5038167d6f08983.npy +02933112-927ac18cb336cfe3df289a3ea5d3a440.npy +03636649-6d52f0b6141dee194a200f5f1797d729.npy +03337140-b6e0738a9b5b4d572fcdb68f2467747b.npy +02958343-a4b793df04e3bdb11fed6082009db27d.npy +04379243-75b0a926c795a110dd965e6a8387505b.npy +03593526-3585601ea0abfdfb409421506a05b6e1.npy +03001627-71aa917674beaa2926d044baef0e5df2.npy +02691156-47006ce926cd5519b3f2b01de37c0b29.npy +02992529-5f4c8cb8b3feae768c641604807c82a.npy +02933112-146c3a9cbe3d8f703fe047712e43e185.npy +04379243-74cca53996772272e91a460ae1e88b96.npy +04256520-90275a9eab184067e2ca61e91f2755b7.npy +02958343-b21bc9621960f418c330b66f68c70be2.npy +03691459-8a3b591b72d0f5326d9bd07411a71e3.npy +04379243-f6497e9f02f50c98c065481f0c2ebbca.npy +02828884-3461cf51ad90f09ce3dcb92695647492.npy +02828884-e8ff891162fa20607572046550aace88.npy +03046257-2f570bb2ab6bcad896d5fa1ee6ada8d1.npy +04379243-ecfb5ad31b6e40b72b70eac6546e93fd.npy +02691156-f9d30b24d9651ee476c772fd813166d.npy +04379243-4ce0cbd82a8f86a71dffa0a43719d0b5.npy +03325088-fed454953dfcbb4bb362845c6edb57fc.npy +02942699-9b4953f653bfdd40ea41ceac179ca4d4.npy +04530566-70e4afbe0fa15ef3bc1624bd222f607e.npy +02958343-56dc27e4374cf87132eaaf3b7c9989f6.npy +02828884-95096288ad7e0777f155d75bbf62b80.npy +03001627-e803b31e2185d0405784b22e1081a3e1.npy +02933112-c7a7a1254c5d98b8449f1c29830da6c6.npy +02691156-ab2f47cda3622573c231d70e1e0cc567.npy +03593526-7797bf6a6f3f4a809e9e01b160c24e12.npy +04379243-3250cee2b00f2bfc9141594c44ac35a8.npy +02691156-7175100f99a61c9646322bce65ca3756.npy +04074963-dd110b09266edec5fdcb551a4a7a3f9f.npy +03797390-9fc96d41ec7a66a6a159545213d74ea.npy +03001627-38444677513af4e7bc41009043d88b0.npy +03691459-221a981adf503875e17b9e33c097dbff.npy +03691459-62021776119f573bc7c51d4ea74651a7.npy +04090263-397b2068e029945216b34c3751bc447d.npy +03001627-2b8380ed4b779be7af7c7ad2549a1b15.npy +02828884-b625936e3db6af6318df1fa50d2b64c.npy +03001627-39d1a6007a4a29fe492d9da2668ec34c.npy +02924116-335795e7ab1cb5d84d44f5db04bf14b8.npy +04379243-573922f28958f34446bb945d4cb1ad55.npy +04379243-99224e792b7a7f7bb98f36033d4304b1.npy +02691156-26f8a11864fd6bf7b68211fcc7956ac6.npy +03797390-9426e7aa67c83a4c3b51ab46b2f98f30.npy +02747177-4c89f52fde77d653f4fb4dee5181bee.npy +03624134-28f21da67a53771772c447ef6e5cffc2.npy +04090263-84ad561ea0b15621e33e9d99abaf3052.npy +02691156-558d3d7e6e78f2d941756cc47b70ca20.npy +02691156-aafbf69ed97274cd462a084c3c6d8557.npy +04379243-d956062bec339ab6c67bebb34dbddc1a.npy +03593526-396534e7ea5b33c482db9fca4b68095.npy +02808440-311c8d3738490a553321831d2245cf06.npy +03691459-ce90cf5be2ffbf92505e438c8a36b3e7.npy +04379243-7c07ffc0147bef7df3c9c1464e55d580.npy +03001627-ecfcc42f2386ef37f51f77a6d7299806.npy +03636649-e8006513d5f46d79e738f481f8560d58.npy +03001627-260f65e1b1baaf7c7b707c797539b200.npy +02933112-221d442d733de66144221bef0fa3c36b.npy +04379243-7a32aac4ead10e0bf51fa0238791f5dc.npy +03001627-4f6a5769aab5de542b848a53a7028d2e.npy +03467517-6e8b6c64b425ab9fcf31738f69fc886a.npy +02691156-32a2723086f770e9233d80f3ecb7c6d3.npy +04004475-63ef3350b84efb4b5d45f15f95346a04.npy +02808440-2cc413a8680b6269b362845c6edb57fc.npy +04554684-7da46c2fa47deac5f509767312277f4e.npy +03636649-7474deb91f55a63840719e09f7e71f01.npy +02958343-963a4fdf819cc5ab3174b45571ecff3d.npy +02958343-698cface060385ef9113c2c7a4e97ab.npy +04225987-937c41b3d0d3a87fad1f278e1513f3b7.npy +03710193-17f741662540b2f08990d2712ce4d993.npy +02808440-414688637cd72b6c7685118aff98cc67.npy +03325088-c322cfc79e07849bb362845c6edb57fc.npy +03642806-7ebff305b2e93504239603972bcd2e7b.npy +04379243-5d24567426a614ecfd726e98b98fb36f.npy +02958343-7b0ed2e4d59ad5261d5011bbe723eeee.npy +02958343-504793ed2da6cf7eba3e2415e22cd45c.npy +02933112-3f51197359289bf839d3717288022c20.npy +04401088-bfba0e8cdd5462e4fe103fdbd20df6.npy +03467517-db5e01167c49c793d5d673747c0e3adb.npy +02958343-648ceaad362345518a6cf8c6b92417f2.npy +03636649-f2dbcc8dd8a7c604865a5ebd0b487fe6.npy +03636649-b286c9c136784db2af1744fdb1fbe7df.npy +04379243-9171bc27d62095bfe82a8550427833e4.npy +02933112-4768d015c33de0acc6e4e9360ed1cfdb.npy +02933112-721bd0402e92e339c59350d819542ec7.npy +04256520-e68c603dc62dbbe5a1281b4d4bd889d7.npy +04379243-4bf6707d8cc11c0fc631e7eec6a153bb.npy +03001627-5a3ac1ba6f751bed79368d1198f406e7.npy +02924116-60d958a773186c31f4c1adce71073351.npy +04090263-dc263bc31beedb09589c07868201b17e.npy +02691156-c380dfb1b098757ace19d55bc5e6a406.npy +02691156-ec03d76cbd50314f5c7319b71bdce6e.npy +03642806-471005df47f0b4a6625cbbe81bda8c5c.npy +03001627-d990c996a67bab91d9233930731da67.npy +03211117-5286df5fdb7ab5cf403c2939fca0114.npy +03046257-b1267cecf443b88f4b3c42e318f3affc.npy +03467517-7f3f5c9953fb7e0a6cbec6f3d994a573.npy +03001627-a4ecc0a3d68dafd44925bc492489de9c.npy +04379243-54ba7e77a2bf5fe3158b7df020486ff2.npy +03001627-4c6c364af4b52751ca6910e4922d61aa.npy +02958343-29043510fd903bae457cdd14086d7361.npy +04256520-d98731f20d3de9c4d9b53420a5458c53.npy +03001627-9a0571ae6169a6ebfebad4f49b26ec52.npy +03001627-60328528e791d7281f47fd90378714ec.npy +03636649-8e8f964be5bea1068616812464c86290.npy +03636649-8be8becbec0d42b799e70de063b51884.npy +03001627-fc557cf617e03564da733bb42d274ff9.npy +02691156-1cc3ebbadfe69e8011f5789deac2dcac.npy +04379243-fb1b4b6d51cbe29967d783b4714d4324.npy +04090263-a4d20d766e6bdca4b0659fe8776130e3.npy +02992529-609321c1351a955c1e1f8455cdf1c0bb.npy +03513137-bde25e25b138b1f75d21ec234969aa2c.npy +04090263-a6984e79681321d7665e26d8660e8f05.npy +02691156-1eb1d7d471f3c4c0634efb708169415.npy +03593526-fe575d606cdab4ad713f2e93cbeac35d.npy +04256520-3681d113ea4b98546609f3f8aaad34cd.npy +03325088-69c012fcf92a926414b35a7d7cea7130.npy +04379243-9eac41860580d9ea8a75ef32ea6ce62.npy +03761084-e0d08b4c03d1a0d36be98452b3c7a6c.npy +04074963-33f2d5cb9df739a0cf01bc59d215f0.npy +03001627-e4834c88847b288648d8ff57878739ca.npy +03636649-5bb0ad1e0c9432b2dc6493177a28df03.npy +04379243-fc9116a6ee32b9b79223fc014b68160f.npy +04401088-c145f0b0f18d4afe99aee91747c9768.npy +02818832-9e0733f8515335ba9a87002a4eeaf610.npy +04530566-d841f12d8e22039f56f77b6bc6731cda.npy +02924116-5798b82280016ad3a2181d7deaec8f2c.npy +03001627-30dc9d9cfbc01e19950c1f85d919ebc2.npy +03948459-8efdd5a6333179619f433921788191f3.npy +03325088-33135d27972e8d496c5fbe25b434bf62.npy +04379243-b267c88cc2a3cdbf48d189f942cedc62.npy +04379243-41590fb9de5414f244b154f79bdb5bdb.npy +04090263-dcf9d53ebe90d9a85f14a92a8b55f317.npy +03325088-cc060d05ecc6b760cb6267f1b348aaaa.npy +04090263-9ed34fd8df53c865cccd2ea14d020703.npy +03001627-4fa95ea95b42125be5c1abd833032715.npy +03001627-31ea40d2624b40a17b431cae0dd70ed.npy +04379243-c3884d2d31ac0ac9593ebeeedbff73b.npy +02691156-d24e6c81b5261fe5ca2bd098b9203af.npy +02871439-50fea70354d4d987d42b9650f19dd425.npy +03001627-1eb8558d0f6885a1268ecf2838ad6f15.npy +03001627-48190d05babcbe2c68b95f9576f01a6b.npy +04256520-f0f3a9b0aed5ff1cf1c0e03f321d0b20.npy +03211117-5ecf4a1f273ae695729e474769d21582.npy +04379243-5b06d5db4da42b96492d9da2668ec34c.npy +03001627-3885255ca5d75e69da2260dc4a1fc2c6.npy +03691459-5b2afef3206a153db06d0ef27244d1aa.npy +04256520-dca66ae8a95f7f70552a7b4f3448af2e.npy +02958343-4c6aa3e7a8130295b528c0abff96f586.npy +04090263-b4f152116e77505d202b6e2a481f1de6.npy +03325088-234daa663f5f79b7b0957d845ac33749.npy +03513137-fbe830888a111027b20f6e48f6a30cbf.npy +04379243-a8473c68f6a6f9ad7a1efe7ddaf6952d.npy +04099429-55ac6badaa420c04a19c2099429852a.npy +03001627-bce6cb5f92247eb6844690e7ee348ec2.npy +04379243-252fa50674207d749eb332cd2d2a300.npy +04379243-631028ddb76eed4dbb0085d0daabdaea.npy +03325088-453557d8109ff422c36fb70296e45483.npy +03001627-4bdbecfbc925219157915a20ae9ec6b6.npy +02871439-484a99e5ec7ba9f4b2029d92310f4aeb.npy +02691156-40278c4bbf6c1f3d9642905e5096dbcb.npy +03642806-a96983022f36a0a83ad38b993d9e745f.npy +04256520-ea9aaecb6305da9ff51f77a6d7299806.npy +03211117-a51ca49763fafecf8f25f3eae9fd9c7b.npy +03593526-32e863f0d34384cc7ad908dd9229dac8.npy +02828884-7ab9419e7bfdc80ac51268fdb437a9e.npy +03761084-6aa4b136ec94b46472a38ac2b8f5cd48.npy +04090263-163101758687bfdf30d6a7e7f84a00b3.npy +02691156-ac75db84aa4e72e28f21c6f032637775.npy +04468005-3a1614d8da39aa2a8be7c8c5fdb9bd6d.npy +03001627-f9cdefd31b167f95e8f8c11a24c52ebb.npy +04074963-e08c8823d837fceeb2b53d011d5b25b.npy +02691156-508fa09e7df177e7fee8021c81c84603.npy +02876657-701ea218827f9a7a733657da4b6687f4.npy +03001627-d3ff300de7ab36bfc8528ab560ff5e59.npy +02691156-df25be12ae47d2517ef7776b3bf5815c.npy +04256520-390562a0a7c74cee19fb4103277a6b93.npy +04379243-aa3a0c759428a9eaa5199c5eb7fa3865.npy +04090263-552e31db6701e0b7381178c6c47f7400.npy +04330267-6265be481c953acd8c159f8d5e761b17.npy +03001627-dfca4eae14e0bb541f6399f392c887ea.npy +02880940-a9ba34614bfd8ca9938afc5c0b5b182.npy +04379243-f7a0f1e7e03fba8c9628f611995a13ab.npy +04256520-9b5b636b4b412d33d93768e7b9b1eabf.npy +03046257-25963f5a66bab37529a60d6ab40898d.npy +04530566-5e65f519b9f5361e657a96a9bceb8713.npy +04256520-c9f83c2615326e7aff04196502786921.npy +04256520-e68e91ef2652cd1c36e3b2fa8d1eb4eb.npy +03636649-6b10584984035b088314f68ce9e12e4c.npy +04379243-96a2a4c8e6b988d5676612319c6a30c3.npy +03797390-64a9d9f6774973ebc598d38a6a69ad2.npy +03691459-311354773f4c016ee1e724fc0e43bde4.npy +02871439-22cc76cf032e93d63f200afe6e0af4d6.npy +02828884-522f8c069a76c21fad5067eac75a07f7.npy +03691459-d06efc46aa999fa21574d21c0c95092f.npy +03001627-12c2b7080b07146a9d4d5dcd2cc33826.npy +02747177-ca901a3fa7a02f07912bc5b1ad60720.npy +04530566-73be7ff2caea7fd47c173089abc6401.npy +03636649-edf15d323abc7333cf66a9e192dbe265.npy +02691156-1c16739bbf3fa7c44276157eea5f8676.npy +03467517-70d9a5d0330abd9df4b498e11fb60a4b.npy +03624134-4c632e73e331063a942c72c00d252030.npy +04468005-7ae6c3c5d9518a5e982c7c6a3539d1c.npy +04379243-28447e9816bfedd268a2b8e2b27b7d8a.npy +04090263-8c151b8df929ec9616cf8b1cd2155e02.npy +03325088-b0f7fc62dfea232f14b35a7d7cea7130.npy +03001627-4e358c2dc0513971f98c0761af40e04.npy +02958343-952160c39258af7616abce8cb03e7794.npy +04379243-b491449d06aa40cc82e6c3a4e742651d.npy +02871439-e4fa76351e8733d3d810b14a81e12eca.npy +04468005-f046ee2a338501aa1ea6661badd5a5bd.npy +03593526-c637b5e2387eec7421aff7e1274fec72.npy +03691459-970ada2dffb5ce49a663d9823c133130.npy +04530566-9a0c149f5c47207f22252c899eb7861f.npy +04256520-11be630221243013c087ef7d7cf00301.npy +04256520-bab33dad5baa7983ecaafbe064b13083.npy +04090263-9dd91ae86cb9914678cf950c87657866.npy +04379243-ccc9cc45699f95f21bec2e8246842c2a.npy +02747177-46bd9fb29f0ad74151f881addeefe983.npy +03211117-64a769a9a884d63f802380d5ccf70dc.npy +03001627-697cfbe6e043136b737a00f007529fbf.npy +02880940-a73d531b90965199e5f6d587dbc348b5.npy +04379243-b254462a49aa73df51f77a6d7299806.npy +03642806-d1388dc83fa45da33a8222bbf59f8f16.npy +04256520-db49ee0d87af106f2de0bc4fc4d02dd6.npy +04401088-d21231fb7d7f7337f521a3dcd28e9d2.npy +04379243-77c74742e9504005a7d0cc9b15400f65.npy +04530566-6fabf91638fda8bcce1decf313ece97f.npy +02933112-9b33a5363695ebc3391e4d6c585a697a.npy +02691156-e24be0487f6a3a92d4fd6e0556ecdd3d.npy +02747177-63adebf24a1de9ecf91cc5a18046145f.npy +04379243-7cc444f165a22b80cb2a965e75be701c.npy +03325088-272582c1e1fd8a7876d20e73c57c9a03.npy +02876657-3f6dd828b9880456807c41acb554a82.npy +03001627-27f4207dce674969c3bd24f986301745.npy +04379243-e0aee89fa986647257256b1738023f7b.npy +03001627-9695267b69d145dea14bb1d7e401bf06.npy +03636649-656d25df742a84877e44e3c724db889f.npy +03001627-73aeafc0af4f1a62e1c624539dfec6c4.npy +02992529-81ad8af206d6b21b89b367279b017ccc.npy +04090263-a15719f77035596aea1c54714433d676.npy +04379243-ba8b2d50ab955e94beedb4c8fd29e2d1.npy +02933112-69949f47106c9140391e4d6c585a697a.npy +04379243-783f84e17b53447de76bc197b3a3ffc0.npy +04090263-6fa6eb2479a09474d87c63d8b3018b58.npy +03001627-34ed902dfa2d8eec2cafe1b125cab8fb.npy +03636649-52783aa89adf06f3250c527721570ba0.npy +02933112-2441395102a132354da5feafe6f1c8fc.npy +02691156-206a4bec609b727566cf1b4a8fc3914e.npy +03691459-61c61c893164dbf275f6e8ca4d589c7b.npy +04530566-e5524ebe2d9f1e8c47caa6b5f3c46e10.npy +03001627-78505373e756b214a3af90debe5fa17f.npy +02808440-2a57aa530ef82b91904e03fa15bd73ec.npy +03001627-38afa26a419ea3abed040525648fc6d7.npy +03636649-bac7b2c006c9cff76739a7caa0c577bd.npy +02958343-68c72623c8d32451f44e15caa8fd94b4.npy +03001627-4f061233795740bb411c679938d00104.npy +02691156-ddec69970cbc4d29112a90660b187a10.npy +04256520-f8519e593fdb348ab3d135d7fc8306a1.npy +03001627-64952439f8d9e1da9c0c9824ccd078be.npy +04530566-6a5405246814b82281c5ee986f4484ec.npy +04379243-82236bf856dff003b8fe77caf901462.npy +02958343-afb36ab0a7bb906bd95840a0da458be0.npy +02828884-74983e99e7606eb114708467db3d00e2.npy +03001627-701551efa4f1f4fe3e478b26cb10ebe4.npy +02818832-96bf3b5230681dd9e595fd37db7104a.npy +03207941-dd4cb99f1f210b196e25f3efedf6785f.npy +03325088-6555b55b9782e592b7a867e9b35a1295.npy +03001627-a6f280a490010a1d593ebeeedbff73b.npy +02958343-4e42e2b6986a3d86a20249b45c17a5c9.npy +04090263-fef082ee4cbfecc4a65322353bdd17ff.npy +02992529-24f3752312dccca3e23b34f33128879b.npy +02691156-d39075b8eb890a898deb28944f3f72ef.npy +03001627-226f096dbce49857bdfa5e0753fa3240.npy +04225987-6e76a333d9fc9a2972e15b580d9a5b3.npy +04256520-cc5f1f064a1ba342cbdb36da0ec8fda6.npy +02958343-f414e36d6daba864d9bd5ae694086d5.npy +04401088-4133d764b4ce5323a44bdc236120a21e.npy +02691156-527975c6c0e1c426ca8607f540cc62ba.npy +03691459-767f4a63260c8419e279011f622f20b0.npy +04530566-d8b92646ee0cad39866219ff4a62ebc4.npy +02933112-53d1e4d3a815840b7753393bcfa5f775.npy +03991062-fa3a58bb2806913ac77ef7a50d334603.npy +04530566-43bc1dd4f4d7f07a84f7e91f7eafd792.npy +02933112-6d54014c7e0847376bad80b4002b9511.npy +02958343-2a887d0b865d8ab4dfb921b4cd0b4571.npy +03467517-fc0dbc2ff44c860ed57700c05b1862d8.npy +03691459-49c6597ddbc1196be50209c399f9eaed.npy +04379243-7fef7125c14e0fc3b3ec4062c13aac32.npy +04256520-312ee9c8bc6ecec5ce59ea70152320fa.npy +03593526-93fa7a1e2aff0b84154dddaf2978e13f.npy +03001627-d107532567ee3f316663d1953862c637.npy +02691156-694da337c806f41a7209009cfb89d4bd.npy +04379243-291e43df05fba9b53d36088e1ac945e3.npy +02691156-afc2efb530e899634d4cb1c2a5e48b7a.npy +03467517-34874708b51c7ed493f0194265a9746c.npy +02691156-c31bdeebd8d74a7dbbf3143b1cb6076a.npy +03325088-cd0b16a0ee7ca94269fb38085fbc320c.npy +04379243-83b8e64089968ae8fd3feb4581507302.npy +04379243-998d6e318306153c3d67fb6c1e0f28.npy +02933112-ac11c66661c8f95825b0a60e00f47d7d.npy +03593526-40f0d91382abe04b2396ca3dd50467ab.npy +03001627-c709aa613431c0538a653a9f65a410f6.npy +03691459-65425eebdd205119b128e24d154447c.npy +04460130-26e099d5d7040b03b96aa5dc23c036c.npy +03642806-343c090b2004dfb0910bfefeca21d514.npy +03513137-64010c4042824e03b13741399690655.npy +02818832-d3aa611e639ea0228998b3b64a143d42.npy +04379243-ffa875f5e2242d62d13de1e342854aa.npy +04379243-48cc2f299fb1692288c3056e77bac805.npy +03211117-58eac12dcadab8bd6ff188b4687b7936.npy +03636649-c3277019e57251cfb784faac204319d9.npy +02691156-bee504b4909890df1dfabee9ba27dc70.npy +04379243-b8efc08bc8eab52a330a170e9ceed373.npy +03001627-942a10a33418205819fb4103277a6b93.npy +04554684-9e991b898c6362977123ef821e961857.npy +02876657-dc9247034a68285efea8a3df5e20f054.npy +03046257-c154e48d36e44c179e8f28fdc2cf9ec9.npy +02946921-a7e0a5111234031fbd685fccc028124d.npy +04379243-30c669e02f875ae6668ae11a7db5e82a.npy +02828884-38403c071594b1cc749694da9ceaed25.npy +03928116-818575447bfc6dbfa38757550100c186.npy +04530566-703c1f85dc01baad9fb3e3631a88cdab.npy +02958343-7272b7e028737097f200a72c9245aee7.npy +04379243-62ae9ded861138be9d2be74cfb51ade1.npy +03790512-d08e47404f0fa3f6a05d44ba0445fced.npy +03991062-2d890efbb22ef27d72652f4081ec5a77.npy +02876657-d3b53f56b4a7b3b3c9f016d57db96408.npy +04379243-9eeea5f7b030ff6ac155f88004a92bc8.npy +03211117-f9acfb901156d3b7dfa29c60bc1700e1.npy +02958343-24dc3903b254fe41b448bf2dc92c4fab.npy +04379243-a3db8fc07fefad03db984b8f0550fcd4.npy +04379243-ad50c756edb20111e76bc197b3a3ffc0.npy +03001627-d7db1353551d341f149c35efde9de588.npy +04379243-14ba2a965791a003b37e6e0c89177ef9.npy +04379243-2330e9debdedf9ff99284d844aba7576.npy +02808440-cca20dbad3faf4343321831d2245cf06.npy +02828884-287475ec16f5b7477b636e5c31038bd.npy +03691459-84e6e1fb56eb60e918d385624fdfc6d0.npy +02876657-ee74f5bfb0d7c8a5bd288303be3d57e7.npy +04379243-3f31ad5e9cf3e51fa6255bf8e0b4ea3e.npy +03001627-244eb71b1dd140dc6f64461f0eb7cd69.npy +04256520-f34cda8bde3c79709829306a513f9466.npy +02933112-c65b640e9a3838f91d76d38b3dec9476.npy +02828884-fd359f64dda4e753870f22c94729669b.npy +02691156-1af4b32eafffb0f7ee60c37cbf99c1c.npy +02933112-d33e54d1880f70c310cd758d9b7cf.npy +04379243-50b076e7917c1297cfb87ab5efe3dc31.npy +03001627-1b4071814d1c1ae6e2367b9e27f16a71.npy +02924116-84d920a145b5487154d963fd62c89fef.npy +04379243-ead13c29c385832eb4c2969e5244fb83.npy +03001627-9a82269e56737217e16571f1d370cad9.npy +04401088-49081a0c0cd4ad32166f3c6af52a7c59.npy +03636649-81e42a3f9e13e1e52beec56b24479ed1.npy +02880940-c25fd49b75c12ef86bbb74f0f607cdd.npy +04379243-c52a6a569770d1b39ccce4c6d5bb195f.npy +03001627-5202edffd4882c252192179b64411b43.npy +03624134-8f0e77eb8d646ea8aee6942381ab7f9c.npy +03636649-da5db67a2385d5e8da9baff5f5368802.npy +04256520-9ec7016d6978216c94fadb3555028734.npy +03211117-95df08344f4737e078785e24320d5ee9.npy +02828884-f44b93dcbf00d80acb2a965e75be701c.npy +02992529-11e925e3ea180b583388c2584b2f0f90.npy +04401088-ccfac9fefb0326003f548cb8701b2293.npy +04004475-52574afcd545b512a370c653486c68e0.npy +02876657-ac131ac1bbe3dd10846564a8a219239b.npy +02828884-e0e2dfd6ed0880a6d6421fd2aa576b15.npy +03636649-9db87bf898efd448cbde89e0c48a01bf.npy +04379243-8f9f4ac0dd2734d77ff6ace05b36a5.npy +02933112-3105e7ff7fbf3e423e72cffee9fc75b0.npy +04090263-71f31b9a96f1b312ddd7320ddee77bde.npy +03001627-d0d3585a2c4579bde290ca81b042ebb4.npy +04379243-2c72d9ccd9399fe8968731dfb1dc1f13.npy +02828884-ebc20661d9e103334b3c42e318f3affc.npy +03046257-849413d99fac88c48cc8fdeacb50bc7.npy +03001627-f350621fba76ee29e7b1367d085b7e66.npy +02933112-1548461b13adc0d0c59350d819542ec7.npy +04330267-1e2a3147e365744f41965be83b7745a.npy +02924116-2f9aecaf8c5d8dffc90887194d8d151d.npy +03211117-4440935e5e566502250bf58700b4d8f.npy +02933112-1838f9b62a102d704c7384dbb75cab0d.npy +02958343-94c0575659c6cdf2091b4cb93147ff9.npy +03593526-a2da98dc3d78788435836c728d324152.npy +04401088-17072ff9ec47bfadc3fd2392bc923b2f.npy +04090263-2d4ba3b93ed69bca2bf266a8f0187ce5.npy +03636649-923097cec128ae77469cbaa3d6420fb4.npy +02843684-cfd6df4bf7abeb318ac033353d37592a.npy +04379243-5771d5a3084b3ca3a2d7b309863cb1b.npy +04379243-7807ff57a21a0ab8740c0058fed336e9.npy +04401088-b18f0d53dd3db1999410a04d09c14d1a.npy +03991062-ac9b4ff01655e74c67a2f40ab335eb08.npy +04379243-28db458b524dc934f2c9082debcece6.npy +03691459-e878e519af882f493fc48162942e3418.npy +04090263-ce43c7f0642a72a25e9786b1603f45c8.npy +04530566-20e8718d1c6d5a665a525c461820c6b3.npy +03046257-428647629e3a9906f0df3cdcd733f686.npy +04090263-5076565550186d3a1f23c99243882ce8.npy +02691156-eb85e7d86e2ef861e7cb9c477e2b7be.npy +04256520-3a053bc6997155674ee2933c1153f63b.npy +04379243-10506aab1adfe9f4eb7b988bf4f0d1ef.npy +04401088-976a8d10e8423f8d8f15e8aad14ff29e.npy +02691156-862f246e54900f48ed4212b3ec7c4371.npy +04379243-6349f0d123ad1ca62ee5d388bdaf2f.npy +03467517-aed378fa2803c946dede9e8b66028607.npy +03001627-2be29f8ad81e2742eaf14273fa406ffc.npy +03001627-360a12c8666f5f764c6ca0d259b5e0f5.npy +02691156-a60b2775f1955153ca8607f540cc62ba.npy +03046257-7830949f6069c4fbf546596ce7364503.npy +04530566-7dbcab223200092feb2c303a0e0d287b.npy +04090263-c41ea087ba71931967a4cd2863eb1ca.npy +04090263-43c51dcb5c9c812ec1385c8c0f4d3915.npy +03790512-2fa098eefef49c8c85b48ea6a7114159.npy +04401088-4458a5056f633fa13abacfd1353cca42.npy +03467517-5dcc689f1472b2c7dae24eae11385498.npy +03948459-f6d74e48206fca39a6e43b878d5b335.npy +03642806-9b4ab67eb448c49c11ced4a54f2e6229.npy +04090263-cfc172b9164357ad42a9381145738f08.npy +02958343-35a32cbdfd9e7ba460ed0d611ab79ae0.npy +04379243-4967c4df72373464622e43c0e0591de0.npy +04379243-1fc4b8f3fdbb5cca12464df1bb7d5f0b.npy +02958343-fc28356cd7948b90466f54ef02e60f2f.npy +02924116-dd21b1599951d4bcb84877c61813ddb3.npy +03001627-e605d3ea3be01ac3b11a97ee9284a563.npy +03001627-e4384c55342db206713decb1a0563b12.npy +03001627-6690683366993cb1d42ec7e303174a87.npy +03001627-22575f5719f3eb3d23bd3a8c035c98ff.npy +03001627-4e664dae1bafe49f19fb4103277a6b93.npy +03001627-b80e1766b45076ff492d9da2668ec34c.npy +04379243-6e13d5d26a0c53e13a66b6fe2c876ded.npy +03593526-809d15e11cfdbe10a2ee63b46530621c.npy +02933112-fc5b7d19b1ab1e8bd0504a433b7a549.npy +04379243-5d53ed3005f4dc6856786b90799c4fdb.npy +02958343-dee6d83ec808d673c4e77c640c2391c7.npy +03691459-ba63e6e1bd33064a90146e2a0489a257.npy +04530566-969c3262a594bda487a9e46bb7812fbd.npy +03991062-f7fd1967f8c15bbd52492ca5b5b3a7af.npy +04401088-4c9760ac0bbd2003151c744078238922.npy +03636649-e4df4ee697e71902f95e2a1e9997b85.npy +03001627-381782d3562f2fe0302dea4b3acac371.npy +03691459-1ba62454cd137945337410fccb2e7331.npy +02691156-e6236c5ec784a48111dcece1819895c0.npy +02992529-eb58b011745519194fde46457697d80.npy +04379243-2e86b383f43bcb1b66dc6ea1ac82d91f.npy +02828884-54c05e235c8d3a4cf09874e0e8a75195.npy +03636649-cf5b6127ac18e85b6aea2f18ee404fd5.npy +04256520-c0b61d423f449b3c6f37a8be59c15bbb.npy +04379243-6f317ae1892ec6e22f63d70fe82e78de.npy +04379243-133686fa1a2136092c280c3b5abf8255.npy +04530566-d4079a1fa9c5eee8a3599da6d4b3696d.npy +03513137-13da2cd827cc8b9f99976ddcaae4d11.npy +04379243-2e61f5b4f26b890cf27383fc5a5a711c.npy +02958343-7f7bec6423847a583002e98d41e915cd.npy +02691156-8bb827904cd9acd36c1cd53dbc9f7b8e.npy +03593526-ac40978140155f2e5d878ba9ec3c0d6a.npy +02933112-c4fc9ac6e45a8ebc90546f5d45015351.npy +03001627-450b4a6b6afa6280d5a910bf1c23bf18.npy +04379243-d4fc029d3836221b76e9713f57a5fcb6.npy +04379243-733722cae46eb715febad4f49b26ec52.npy +04530566-9de5e010b46919293bb25e78abe7f382.npy +02942699-cef23409b1a030d516fe5320f9715eef.npy +04379243-2259e09ebd0ed2befebad4f49b26ec52.npy +03001627-126e65c55961e5c166f17d3ad78f5a62.npy +03001627-e3bc0a03103cf84e7a471a654ffbc436.npy +04379243-bf06de9143b2e36190eb1f8a00f61726.npy +04256520-d644ef328d35d28ffebad4f49b26ec52.npy +02828884-bf0b9b88be76628440126a5bcf48fc87.npy +04099429-7f8f5ba0ab543cd99cc7053a5669450f.npy +02958343-45563d97886d68eb12d484f58f506441.npy +02871439-e4c42bcbba4ef5b09a2d4f7bacd6e0d8.npy +02958343-1e17510abe8f98bea697d949e28d773c.npy +03467517-8b61adb73d6349838014d29eab9ba665.npy +02958343-7b35ba084bfb741780e98029b8cda1b.npy +03790512-c8a99ee61a2003308b543692e5ab59d9.npy +04256520-4f7392168ffafb8aea91375557c834d7.npy +04530566-e82e97e22066a75d798832e32e32aae6.npy +02808440-4bba4847c53eefa43121505b9493314.npy +03046257-9973f62eeb03fa9b6e259a0b666e79d.npy +04530566-9848322f786fc6d9eb2c303a0e0d287b.npy +04530566-18a4466173b31541a66c1707a338712c.npy +02876657-1ae823260851f7d9ea600d1a6d9f6e07.npy +03211117-2711433532f6d1fdd7426bda0fe4ebcb.npy +03001627-376b0c463a2bb625c036371d3ae886e1.npy +03211117-78c2861ca4574a8fd9deb3f829cc2475.npy +04090263-bcf362f325cf658e282dd3b430ec2654.npy +04090263-84735b7ac61d2ed023c69c7ff0f71040.npy +04379243-974cc395f9684d47c955e5ed03ef3a2f.npy +03001627-9189415b98c9981cc2b6cd34eca9d8c1.npy +02691156-78ceee44d207e826c87f6dba8af25d8b.npy +02828884-c36cc90d01f21180c3c8317b7074dc0.npy +03691459-c3180cdddec577f2e17b9e33c097dbff.npy +04256520-98f2d21c4dcac477f7628281ecb18112.npy +03001627-5fc3bee56e8ceae26fa2cfca412075ea.npy +03790512-bcbcfdad5e0e1d9ba88e8cb97b773125.npy +02958343-48863925f0e70aafdf8e4da0a37cb43e.npy +02880940-11547e8d8f143557525b133235812833.npy +02924116-c9fe4ffcdd6c5ae1f4704cbd27fa6eb5.npy +03593526-1c0a264dfbbf285cafe995003c9eaf93.npy +04256520-9bcad07a9c2e8e13490ad276cd2af3a4.npy +03467517-2d31ac290daab56a4e96698ef01e7360.npy +04379243-b2d64a218b373b0456d80c2792e1f42c.npy +04379243-5c3932413e5433e0f51f77a6d7299806.npy +02924116-c68284aa7904fb4d5e2fdc02779b5bdb.npy +04379243-45da524a32676350b5817dafa1567392.npy +04256520-fa877c7d428253515e4b35ff1ea95f37.npy +02933112-54daf9093eabf27a34d6aa31914c287d.npy +02933112-e5bd1675d43422bb61706e18472540d6.npy +02871439-71b87045c8fbce807c7680c7449f4f61.npy +04379243-5c5f434f9ea8bf777bcb070cc655f13a.npy +04401088-3c244a5e76cec2cf6f108f2b64e6593a.npy +03948459-abc7a1373f4b30291adcc40d88daf7c8.npy +04530566-a755dbab93afbb3a1a05bdebf75f301d.npy +03001627-a75e83a3201cf5ac745004c6a29b0df0.npy +04090263-2757f06b6b4d3ca3f02ee453ff283e26.npy +04379243-9e5926bfdc7f01749e65a3d2929a9516.npy +03046257-969841e102fe5e1c2de0bc4fc4d02dd6.npy +03636649-20e1e4849339e64f5077539b37310c29.npy +02924116-e205f10f3b2dbf0941cefd10ce5d6cc0.npy +04468005-7ad6c009fe02d1845f73a346378dad81.npy +04256520-83a7b2e11589b4cc5fc6df6674be3b9c.npy +03467517-3c125ee606b03cd263ae8c3a62777578.npy +04401088-48a2000b54f4fc792a56a29c6d979b82.npy +04530566-71aedddffbb7b1befb4a964cf6619fc2.npy +03001627-ef544a816432b0a78dabc11b24766ce2.npy +04379243-7eed749ec4a3e391289014a3a9ce92.npy +03467517-fc003660554be7334dfe0ed95d7290cf.npy +04401088-addf767a669d9732691c3af43bf5f97e.npy +03991062-b3a1437b16fc2b5b88650557d3dcdb73.npy +04379243-482123c5f097d29f278d386bfa54545.npy +03325088-12eb51d74f30c3c054d7082b34825ef0.npy +04379243-5783c7479b89f76b0783d9ebb200d10.npy +03991062-4e5172f357714b7f78caa162a41a851e.npy +02958343-3476290a1220338ffa975bcfd21f6dfb.npy +02691156-3716ed4fa80dbf5f41392ab7a601818b.npy +03001627-8ad5b0bd9f1297e5492d9da2668ec34c.npy +03636649-cbea72b8621f99703394926146371698.npy +02691156-eb8fe6d82d195ab5bc8feea465aa74f2.npy +03001627-b8e40ffe5c8e61ba3c8d0fdfb1cc2535.npy +04256520-262b2e2a13c8099d60f888b4e2fd3e4.npy +02958343-105dedf1b70c2826b2dcc642c86ae8f4.npy +02958343-4d8045997209a8cb1bb46d2556ba67d.npy +02992529-2435be698167b2167120841458f79dbe.npy +04256520-3c0dd3719baecf3319fb4103277a6b93.npy +04090263-6e1572214d2606dbcf7516eda265328a.npy +02876657-8ea8ced5529a3ffa7ae0a62f7ca532f1.npy +04379243-78ecba6d2bdb55ba9174750cc2a009c3.npy +03636649-f34d9842b68f0b59fcb8d8c6d4df8143.npy +03001627-5390dede41d523f71a782a4379556c7.npy +04379243-c15f3a4903ca16b98c0a2d703f217201.npy +04401088-71899992cbb987ed5baadcb81f14fd84.npy +04379243-1c259cf6c1206aadb6f6d1d58b7b1311.npy +04530566-512251a635bd548f3463d0a80e47bc52.npy +02933112-da62a2f330280273896f268d8862011d.npy +04530566-8851329ba7c3394d41556f795d265590.npy +03211117-518b97c2a0892aced88854fc3e3ce05.npy +04379243-45b23ac79688170893ba1eeaf62819a2.npy +03001627-ef018d0bcb3d4c89601104cd2d998272.npy +03046257-a294c351a2225ddf6b0c35068783779f.npy +04256520-bba610163b83053514038d588fd1342f.npy +03593526-353709f2c6862ac56bc258c0f0234be0.npy +03624134-e6b5462b34d8809529b0445cdc28e4cd.npy +03636649-3e9ce9f30f1999ab45bb7680f88b3d99.npy +04256520-3b72c4223eb452168f5c37fe197319e1.npy +04256520-b23dc14d788e954b3adc3470b30138f3.npy +02933112-6f679ca92bfaca984da5feafe6f1c8fc.npy +02691156-a4678e6798e768c3b6a66ea321171690.npy +03001627-120735afde493c277ff6ace05b36a5.npy +02958343-47fcc0e1aee36584b1bb46d2556ba67d.npy +02933112-5fc881594598fd937eee615e75bc3b77.npy +03001627-a976138678aa74d0d9ed5cacfd88cef9.npy +02691156-f9505b01e3ea959cf9700e397b8b4e4d.npy +03928116-1f0153042cceff37d20e6bdf4e0f4a18.npy +04379243-9b8e7652eac8daef33e6ceca7fd89911.npy +02958343-d862b3766583ace6c2aae5fbcd555ab4.npy +02691156-543412ccea0db2f8f37f38dedb2f1219.npy +04090263-ceee9df336427c427e1ff5b356a80cc6.npy +03001627-a6d282a360621055614d73f24792753f.npy +02933112-181716a7a34f2708c59350d819542ec7.npy +03001627-2ab2ec342a3b2a45c242632b2a8c3129.npy +03691459-57412ca31eeb15bf75fa5879e0c49e00.npy +03001627-51e27bd3ee95338588d458757d655e0a.npy +03001627-b29d302a87099d924d8777315ca26f7d.npy +03211117-3e9af28eb2d6e216a4e3429ccb8eaf16.npy +04379243-6361a90210b69a9590a2e9c21353bf7d.npy +04256520-61cedacdae156b4dcbae681baa9e61e.npy +04379243-adc1d752f04c338bfbe07b96393f97f7.npy +03001627-7250e86b4feb699aa08cd647a48e605d.npy +04379243-fa3dcf1562e5f60829e4b5aa807bb4e7.npy +04379243-8c878bedb8e052041944bfc1093ee4d3.npy +04090263-198bf0b56e9235a11afbc27572ea3d1c.npy +02958343-9698be0fd3516f01fbeda5389ab05f5f.npy +04379243-161da97088255c645ff9646ea22eac1.npy +02828884-d77f648c6df22a05c6510aa63622330c.npy +04530566-8682988328acbc62b8acbfab1478caa1.npy +04530566-44571992d18375483506f52bbfa5b648.npy +02871439-2f30f402c00a166368068eb0ef40fbb1.npy +03636649-646031cc994df3be11fd25b4ef1afe87.npy +04090263-4edb165109339c63cc4d8251423f62a2.npy +04379243-dc5a136f23bd3f31c710d14956729baa.npy +03001627-9c3d7b65c739a618285330f26226f8fb.npy +02958343-1c3c8952b92d567e61c6c61410fc904b.npy +02958343-3154c3dce06ae7e216abce8cb03e7794.npy +02880940-817221e45b63cef62f74bdafe5239fba.npy +04256520-62e90a6ed511a1b2d291861d5bc3e7c8.npy +04379243-6dee2382e2c710fcdb266b832300e6da.npy +04256520-1e4a7cb88d31716cc9c93fe51d670e21.npy +04256520-1037fd31d12178d396f164a988ef37cc.npy +02691156-579187a52086b0a63690bd3a9fab7134.npy +03001627-48b257f80c7434cb56f6fc4b4ce1db04.npy +04090263-af1778e415b0e0be20fc54d2500eb7f1.npy +03001627-3c0dd3719baecf3319fb4103277a6b93.npy +02924116-1b74500dc5d2a6547c02d07bab7b395c.npy +03593526-edb8e199485be4e968747a7f12307bdb.npy +03211117-692db5a6fb6cea2174649592553d1a1f.npy +04379243-18cea57b061a65e5a346e6ee1c343985.npy +03001627-7eb842de7ad4cbad3e329950ec40f6dd.npy +02933112-43552fecbd07876acac27d617fa518f5.npy +02958343-7f198a2357dec222f98feeb6b46f3cac.npy +02958343-ace409d84c89d7258a0683934fae3156.npy +03642806-942156d763bd7e867cff7d16e20f126a.npy +04379243-704f75e32974f0f9d5316414c56bc1a8.npy +03636649-aa4720a899ddf5456a5c4fd998d89f43.npy +04256520-cca6e720741a6d00f51f77a6d7299806.npy +02958343-ee0edec0ac0578082ea8e4c752a397ac.npy +03337140-c6c6cea3ab70a9fd4c3aee8e9d3a6ffa.npy +04256520-71fd7103997614db490ad276cd2af3a4.npy +04090263-3c9b810025d7167fe641d7676ac20451.npy +04379243-d9ed9f1577b22330aeba6a38e5ba02f1.npy +02828884-ebdcd5f64e44ce0cb2a965e75be701c.npy +03790512-c52be51c1aa7cc9752fa4ad29a1236d7.npy +02958343-924599eb8b6aa6429ed410a010efa019.npy +04256520-6658d651878eb023c7db9c21ccfbc4a1.npy +03691459-b703762eb7b1fd39d0cd692038573317.npy +03642806-39b54fd684a4ed3e6f0a9a10dc885e17.npy +04256520-3582dc0c828ae4b1febad4f49b26ec52.npy +03759954-b86751a9f75423dcffbcf74570805a6f.npy +03938244-ddf0c95f168e43f2283b00891f680579.npy +04530566-70b7ef0d69c7013473965669ebe40616.npy +04379243-d533837495d31706d4bba81d85a6a53d.npy +02958343-cf3a2894431c55f43b5ec9bc4ed9097.npy +04401088-c7e4a425cebaa04bf9c8feac0b33491e.npy +02924116-bd8d7b8ad35df2d52470de2774d6099.npy +02808440-be9496165cc6322244221bef0fa3c36b.npy +03691459-108316842b17210394a42262667addbc.npy +04379243-e24979696e6b8e7060edf8bc2f5c8881.npy +03790512-11b1e520db0bf1a1d5dde04c96fd8146.npy +03325088-78a7613f9eeb866ec36fb70296e45483.npy +03001627-79401adba0311d9b19fb4103277a6b93.npy +02747177-71f3b101a6d47811cb2a965e75be701c.npy +02691156-d1df81e184c71e0f26360e1e29a956c7.npy +02992529-d130a357978694bf58efc722b5cff71c.npy +04256520-6aac93deb58a35f56a3237a661a9fa9.npy +04530566-f3a1538193bfc54fad3766494450e53a.npy +02958343-1714b6e57c8c4983fb1aad5dae793ff4.npy +04379243-2a80c95b4bbcb73d87ed2480ebb0f3d2.npy +03046257-681a251290c5b59583f01376c92cdee4.npy +04530566-b38a6ed1bb88dc6ccd57b018370ca909.npy +02828884-cff15ed24c45878b3567b82c74e275b4.npy +02958343-e308a6e4472658b618e9d35559b7aa.npy +02992529-a4d81a74a416b88948637414dbe9de8d.npy +02992529-e862392921d99119ee50cfd2d11d046b.npy +04090263-db396982ae541ac97f5c403400264eea.npy +03001627-c7f607892513a2f787bf0444104341d5.npy +03001627-5f06664b4eb0af4c352fc7e973ba7787.npy +02958343-48071634bdeb66e271a126804ae24042.npy +03593526-cf65c7fb56850194490ad276cd2af3a4.npy +03001627-2c2a5f5a8931fa0822f0b32ec619eee6.npy +04379243-d60a87c721416783ec7a87c695ada295.npy +04256520-499242b0da957d1e33f2b52ebeafcf18.npy +03467517-65b6279a17e7ace2df17c838e7147b58.npy +02691156-31b75f20c64b03ff6b7bd17e458d0dcb.npy +03636649-699fcda4f4e9166ec5eb7aae719027b2.npy +03001627-9efb86c07170d7e897ec301178d1c7e.npy +03001627-94b779e6bdf6c3d171a782a4379556c7.npy +02992529-854ab60bd57d3d6d2f412e1bfcc51526.npy +04379243-6b8b6d09fcd05c1819fb4103277a6b93.npy +03001627-e5b8d52826245f3937b2bb75885cfc44.npy +03001627-8a2a0cad888b871eaa84c578b771896d.npy +04256520-49b2df85a32176c8e47780c3e225251f.npy +02691156-1e8c56bac4e66672e85e222f6559b47.npy +03691459-d6f0a0ca6446eab0c0b5947ffe18a468.npy +03001627-b6cd2d8af74226a3cd8b5e03f65e1405.npy +04379243-acde36e1b4c14b9aec2d07c46434bacd.npy +03211117-4d033564f0dcb412afac285245c66df0.npy +04468005-ff41a3016d0ed18552318481004055fb.npy +02691156-da1acb401541235be4d2773f0358b43b.npy +03691459-5820d7ef5c9942e6d49b96b9f2811c7d.npy +04330267-72508fd1bd92e1d39c436f89fdc07cfa.npy +03636649-3dda46a537bc16e689ab11a408196888.npy +03001627-250e0d866303abedfebad4f49b26ec52.npy +03001627-b6b911aecb417295e8f8c11a24c52ebb.npy +02946921-bb487f4b77abbef0a8d976d1bb073663.npy +02828884-6194e1897f8ebb17b40f0ac0fb9a650d.npy +03325088-70ba2ae5080de487b362845c6edb57fc.npy +02691156-a4cbb0489a3a680eca8607f540cc62ba.npy +04256520-fa5a0b7134e3e9ecb04cb542e2c50eb4.npy +03928116-38900730fdf8d22b8377768c43f7783c.npy +03790512-d165adb88d2e569552ee90e577613070.npy +04379243-18a9c13c3999e9c186abe5555a3b447d.npy +04379243-4ea4834db898a3f58cbb8bac2032149c.npy +04379243-2bb9537b798dfda490ad276cd2af3a4.npy +03691459-2edc94885c4ba7ad2d563c85edb49108.npy +02691156-3b0efeb0891a9686ca9f0727e23831d9.npy +02691156-895ae296f701f5e2ee7ff700fef7cd22.npy +02958343-b27c818401f48e5220453276fad563e4.npy +03001627-e4494542ab04c033e6fe3612af521500.npy +04379243-79d992df7306436da1ed581c544d9fd9.npy +03636649-6283ad834ec0730720efab7988749bc4.npy +03001627-f2e2993abf4c952b2e69a7e134f91051.npy +02691156-eb658ff31f0becea1d0f8853f6d023e3.npy +04256520-1149bd16e834d8e6433619555ecca8aa.npy +03790512-d82165e9ab3cbde7eba25bbcd3786140.npy +02808440-51ac21c5f5c10583b8724a732b3d4cc1.npy +03337140-bde6f229cd9fc1aaadd6705c8c483552.npy +02992529-e0ccc0cae4dc414cb4e7b68321c9d305.npy +02924116-b2fea5e98eafe6014edf4a0df1fbc500.npy +04090263-2a525d9178f347ce5ab27081157ad594.npy +04379243-a37bc9fad75b6def3087f84b199fd297.npy +03691459-461441f5606348f3d88a3e0e92891ad5.npy +03001627-2a2ef361fbe78f1e9f3cdee390cffc8e.npy +03001627-795f38ce5d8519938077cafed2bb8242.npy +04379243-e2c7ca786fc4b050a8a813669d8b4f2.npy +02691156-e283e3825d66a985b87697d3904b168b.npy +02747177-caefb14d743df2d69c3870d54ab64b77.npy +04256520-b351e06f5826444c19fb4103277a6b93.npy +04379243-874d1890f62375ea30bbd4cddd04c77b.npy +04554684-e51ad19bf1dc680b525bdb2a29d19760.npy +02933112-c031c55d7ff5bd7d824080f516909671.npy +03636649-c58b04ebb038758ba866d377a1785e37.npy +03261776-1f66f8c897bfa84b8c08913777779fe.npy +04379243-18c7c6eed722b9761f8d2643b5438b70.npy +02880940-d5b3fb99c8084a6c5430c0f7a585e679.npy +02691156-371a609f050b4ed3f6497dc58a9a6f8a.npy +04379243-1fe2d919fb4685ea93271d2223fe04be.npy +03001627-8654342caec219e07cbc6cda01aaca49.npy +03001627-e5ce7b150310f288b04cb542e2c50eb4.npy +04401088-60df2f27d33f3f472eb2c67660ce4f3.npy +04256520-930bf61aa004692c1834dcb2b62a80a.npy +02871439-ea1a28f0b31f1be34bd9e0690b0b191.npy +03636649-108a5262552050dfa9370719b830fc2c.npy +03211117-ad0b349657fb807d88d19ffcab9e20eb.npy +03001627-be1546c576c7c189edd7ee0476a331f6.npy +03642806-ddf5d6d855c2aa5d1c644ef3ab0c8ffa.npy +04530566-9bdb0cf464f5c65956b5365bdce185d.npy +03593526-8f7f15db817b3a1982db9fca4b68095.npy +03991062-ce008e86ab858be7ba90901a608c6cb.npy +03991062-3cce39eff2128c34ed390075067c2702.npy +04379243-32c4e455cd92d2a3c3bd24f986301745.npy +04090263-d90b571a1259cef1ad51de5d9ac9dcd2.npy +02691156-e85cd06b4a14d3ffbc0909d98a1ff2b4.npy +04379243-2ec254595840417424754d384796666.npy +02828884-17d8e07c30ff1657d201085e80edb26a.npy +03636649-98c6cea5f2d3ea28fcb8d8c6d4df8143.npy +03325088-a7c12a4d02bf3614378f7f7b635ccd96.npy +02933112-779cda069c3b6338824662341ce2b233.npy +04379243-229d510bace435811572ee5ddf1b55b.npy +03001627-ce2d77c8b0436db4f5d0dadcce96e179.npy +03636649-fd1371c24e12c16251d6edf97cc5502d.npy +02691156-d4dac019726e980e203936772104a82d.npy +03001627-e8788e6f0292f503f4b6538438a0b930.npy +02933112-7759a26614f6c4fdf815c17ff5624f52.npy +04379243-c5faa34d589240b859d0a47cd36512.npy +04379243-b796639ea7368f3bec11953b27b8a03a.npy +02871439-ee7049259da1bcbbfaf46ebe96d4859c.npy +02691156-52e7f93d592622a9615ba7bf3620290d.npy +04401088-a120a29467045d34c3f199bb1cdfc734.npy +02958343-244a8476648bd073834daea73aa18748.npy +03001627-33e436e30da86f3bc5beea20858a99d5.npy +02691156-a9b95631bcbefe9ad225a1c252daae25.npy +02691156-53eee66291c47a91bc0909d98a1ff2b4.npy +03001627-550fa302257e193ec93d39652bbb58f.npy +04090263-17bb6d46e1b07ed789cff8e09537ec10.npy +02691156-ac39424c7666c318cde5b07c0f09692a.npy +02958343-f60779c934ee51eddd1e15301c83686f.npy +03046257-cde7dca42588ba9c93d604ee670f39e7.npy +04379243-d2d5b8f99d977e353002761e7a3ba3bd.npy +03636649-f9bed8743eba72439a4cbf5d3b79df06.npy +03938244-f19f78894858d57c38bf051f9aef03f8.npy +02958343-cab3b584786dda8c85c68dc758ce6c5.npy +04401088-427e06d425b901be5c0be177939e290.npy +03593526-7b0b4571876644fcef76898f881b76a.npy +03593526-b67d4f4361affd4d664b3b9b23ddfcbc.npy +02958343-5cad9a0e7e69c6dfc427f8508e3d634b.npy +04554684-da0179a5b68f13586a6a687121d74e50.npy +03624134-fc40e3685a99eff084db38829945aab.npy +03467517-ed2823c4896d692ed5ab54dd668fd99d.npy +02691156-bc3b68407bba00d92756c2c914ecfebf.npy +03948459-abaf150fbbcfa58e9f433921788191f3.npy +04379243-9dd63148e5b0a4f79eaa55bb236fb6e1.npy +04460130-3defb00d43c0ebc853b60a2c38c44521.npy +04379243-161a209c418646444b3c42e318f3affc.npy +04379243-1ab2ac2a0af6bf36798e7d16c343c306.npy +03325088-495fc62a822f66116f893b5bc716a3fa.npy +02958343-ea529cacc239f82989a8ac0e4c77f4d2.npy +04379243-6bf058da5c3835b415ca6115a4467dd6.npy +03046257-f2a47fbb788c05953ddbeec164af367.npy +03797390-dfa8a3a0c8a552b62bc8a44b22fcb3b9.npy +04379243-1e6143253f8f984735d95c26c81752cf.npy +04004475-3c5a8a2262dc3ef1ab4efe44a581aee7.npy +04379243-6081fd59c46769fdf4b6538438a0b930.npy +03211117-c4b636e2c361be9dece694d60a812f12.npy +03636649-36a1e900d1b4d4b287b2013bc93e747c.npy +04090263-d8e7abded14c00cef02ee453ff283e26.npy +04099429-cbf630e17e0dd6fa8db04a0e4b407440.npy +03636649-446f8c76eed76c199df50b7f68c99baa.npy +02691156-46ae88cad17edca7ae7c0d0e12bd33da.npy +02933112-4dcec5b89f1e9e4915dd7d7985e749c1.npy +04379243-ed59907918516bbb4c24aa998833ed98.npy +03642806-9e5daedde75196487548281e465c9303.npy +04379243-bce2998e60345f86ab610b0c94236463.npy +04090263-cfd06e58d354213c8f2a8ddb5c970b6.npy +04530566-cab0b302a23381adcdcba7385a96c2c8.npy +04468005-f91686b42d529db2dc14ba0818ee5cec.npy +02828884-b4584ca6fe22a0be599937922ec198cc.npy +03001627-8ec79ed07c19aa5cfebad4f49b26ec52.npy +02958343-1f8fc7a787f254e6428df271ebc70bc0.npy +03001627-30b0196b3b5431da2f95e2a1e9997b85.npy +03001627-8bba3f2eac551ada2c0e1e24bb9eb3ab.npy +02933112-6336b5516cc8bd50635469b95109803c.npy +03636649-8e78283cdb07db1fb33cda5c8e604e7a.npy +03001627-72713f2b894ad2846d16cefc94cf3648.npy +04256520-527bc61087456aebbf27ea70a1a65d9b.npy +02691156-8264f874bc7fa58ac3d9e92d9c33325b.npy +02808440-97a2ac7e8ada9d981f003e83c2518be8.npy +04004475-bbeee5ffecc0f04c8476f77a9e6aa3bd.npy +04379243-bf3b9638b7be27bb4c26a0d2e78f0aae.npy +03513137-d7a860627e8ba083ec3df6ee3b84fcd3.npy +02924116-378c6395b62df11cdc6c67d3cbca448e.npy +03991062-3c73f2f15c10d253f2665ed92bcd1166.npy +04379243-8eed35fd5b777acf58316b27df6c8e87.npy +02958343-6c5c45f7a474daa9a134736201a79843.npy +04379243-734a664e9d0aaa1230bbd4cddd04c77b.npy +02691156-c6306d07f28bc5231309643a94d8a5f.npy +02958343-b31c2984546d2746becf71e2e014ff6f.npy +04379243-f27b818a99bf195f76e9713f57a5fcb6.npy +04379243-296cfdd6b347a8e219fb4103277a6b93.npy +04401088-8e00be7402a612e17d6b888b4eb1ac9f.npy +04379243-8ac4d93e65b9d58d9b937d98d58545fa.npy +04379243-5690d17b330f73adfeb8ceb93793cb5.npy +03001627-4fae9528f1403fd0f9702e673573a443.npy +04379243-1c123801cd052c833bd248747cb27ae2.npy +03001627-474b82a849e5064fa9dea4db53ba3dd.npy +03593526-3cd46f573c68e5fcfd41ffe96f6ef4b4.npy +04379243-d820b240ee17047fac51268fdb437a9e.npy +04256520-8daffd33afca5e02ca8dac6d3025a7da.npy +04379243-933096cbd0f7ef0aa73562d75299fcd8.npy +04530566-e49935adf322de2f77e672c4996ec4a3.npy +03001627-5c4e1a58eeb3171dad8af6714b643432.npy +04256520-34878cff5db772bad810b14a81e12eca.npy +04379243-9184aa5ef68a383918c27c564e9b3b91.npy +03001627-58616932b0e7ab6d78b03575bb54dfd4.npy +03001627-97396529412ab7602f81cb887dc35578.npy +03790512-e55e06e7a84f49e2b37378f3c85478b4.npy +03001627-cf24fc2d10f8da31283b00891f680579.npy +03001627-d01321ae63ae0b40ad1f278e1513f3b7.npy +03001627-903e861a95d6a2d5a6db47a0a040d0ff.npy +03636649-7d097f4b38f0a8a65b6c7da997b0e5e3.npy +02691156-775f06502261575c26b390daf74a4b00.npy +02691156-a3fc9ef9f611a783525e60273896d30a.npy +02747177-78f8bb00a5850aaf81faebbdea6bd9be.npy +02691156-cce565137003bb39b2da68ec42b2eaf6.npy +02818832-3a627c3fe65325ab052788001910919.npy +04379243-1815c6431b06dfb4f008d8a3590fb522.npy +04379243-471f9b50c57b07056abfacdc918044f4.npy +04379243-50da3e6b87b52ccc99e8bf807e902261.npy +03467517-16d9563fe86318cdac496d9f900602fe.npy +04090263-6ab8bee75629e98d2810ab2c421a9619.npy +02924116-7f0f12b1280c47ebe2dc67b821479cc4.npy +03001627-98a1f8651c962402492d9da2668ec34c.npy +04379243-e993ddaf6d03003071a782a4379556c7.npy +04379243-c5d499a443ef70906b882130fa92c175.npy +03001627-2b5953c986dd08f2f91663a74ccd2338.npy +04379243-83ca8d37a6f44dff1652fb73e93ef5e7.npy +02958343-79aafe31e4f2677b1f0fdc8ac183f8b.npy +02691156-b9e6298004d7d422bd46d022fd7d80aa.npy +03211117-bae43dafa75f827f4375bc8943daa105.npy +02933112-b4130f8f597c8f38986f688b80d667f0.npy +03046257-97fc20eff457b57fe6fe3612af521500.npy +04379243-f476ea8dabe53bb8efb94709f30ce0d2.npy +03001627-ea918174759a2079e83221ad0d21775.npy +02958343-91b636d0c4729cda1d9cc9d194c8533.npy +03001627-40e9fdb477fc0c10f07ea52432becd0a.npy +04225987-abdc4a823b1f78c397f47f3057557cbe.npy +03325088-3814a29d435de3db54d7082b34825ef0.npy +03642806-b36c5ee8b04b4b0243cecf206f8bdb34.npy +04379243-da2f2572b10c0ed8f1783a44a88d6274.npy +04256520-c37d49d715cc4d2ec7e48270ba1490a5.npy +04256520-89e00bb2b82e9e86c036a40816608369.npy +03636649-d682bfc447413fd167a9bb855340227f.npy +04379243-d2f811bc37858425a63ceecddc308b25.npy +02691156-cfc075c635df8a7a94b9c9a92aa36f8c.npy +03636649-60fba8438739f3cfba9ea396e14c59f2.npy +04530566-4fc0f4f2d29a463cb1bb46d2556ba67d.npy +04530566-36123091df7600dab1f22ce939b4db68.npy +04090263-c9b36427b66414de42ca7cc070f21ed3.npy +03467517-6c438af8d57d047cdc6782957fd2f5d2.npy +04379243-ab8cdc829a360d59339797c21e8801b1.npy +04090263-2d310466453c3e42fa596c3267b95876.npy +02876657-3bf6160225cd15453a762233fffc49ea.npy +04379243-f1c17621d394670b48d1a35afd3934.npy +03001627-7eb4a453070b3f090d1267f8054d8a8.npy +04256520-382d5ba8f3f89385debd258f4352e626.npy +04379243-b052445a4de3c06a10c0c01485abc473.npy +04256520-810e4815b0ef6f1314038d588fd1342f.npy +02691156-f7c11b5e07e9ccab3a116bc3efac4e3b.npy +04379243-d9744ed1255664e7b0c90fa5479c8a6.npy +03211117-64c23d38d98f7529811348287b48cb45.npy +03046257-5437b68ddffc8f229e5629b793f22d35.npy +02924116-7fbc3347e024ac2f3cc48ad84c73863d.npy +03691459-f98620e647a77e1f8b5ea808b63cd2a6.npy +04074963-775230183193fb9c39054ca4bd28c2fb.npy +04090263-bd1711225c6b87332e60a638a5e115e7.npy +04530566-cdfe819679f7c2e2916576b265053633.npy +02691156-7664f3809169e998a4ee0fb6a51564c3.npy +03001627-a0a01b87633d31061e6becdb5008d9af.npy +03001627-9c5b246616974299f1783a44a88d6274.npy +02828884-360d9cc763aa370320768660cf080d12.npy +03593526-8029c2527230111aad1d789f3b2120d0.npy +04256520-c4b2bd128c424f361b02cde7e81f0fc3.npy +04379243-e64f3681d7c76bb743638dabe1eb5336.npy +02808440-5634cbd9ad6317b444221bef0fa3c36b.npy +04256520-3513af0a9abe4b48f13ce777d031b4b2.npy +03001627-8ef2d2d320e4f3479e3ca99089143c61.npy +03513137-fd861e0998b5acddb20f6e48f6a30cbf.npy +02880940-46d014209027ec188e74a3351a4d8b3a.npy +02691156-2d7aff5577ae7af0d8ff6111270336a9.npy +02691156-d617ffca7890b33eeb9d949e4b90f4af.npy +04256520-7b9d9c738c6042ad1c2c02171f63f02f.npy +02747177-90669f582a8fccc5ad5067eac75a07f7.npy +03001627-32563c1b8b31667bb6695fcbbfeb161b.npy +02958343-9d77d4c959974035fab60fc805223a73.npy +03001627-b455c3037b013d85492d9da2668ec34c.npy +04379243-ebfe93f04bd040ced98bf80379cd1d6.npy +02958343-4a23138e9dc20916147f7a82b2d95068.npy +02880940-aeb7b4bb33fd43a14e23e9314af9ae57.npy +03636649-4dde6d694443a488edb5be732846826.npy +03325088-f4f6333e2342ea4276c18e71fd49c4dc.npy +03691459-5b3bf009f0dee3f01ad88f716ea80910.npy +04379243-d31b0d2a41051f2c7b79156a61ad4c01.npy +02828884-c3531b822720720bf27f378f9a625c3.npy +02691156-a3927542339a2c491b1cc145b0144991.npy +04004475-6039a39331a844138796ffe7637b86a0.npy +02691156-6ecf2dd001e3b029dc53c0dc42fb387b.npy +03001627-541746ddb47aa2af4e186c8346f12e6.npy +04379243-9c9554e0883818c9febad4f49b26ec52.npy +04530566-51f002bbc33e4b34aff407511d7dfc96.npy +04379243-5e3f91e841bf74d240cb0a485b0065bc.npy +04468005-7c35b5da555b7a0c3b2a9f4a86c95221.npy +03001627-b9382558b6b4e858ce5de6b2dd443a15.npy +04379243-6e9e8100ffa2a7fb3b1bee6df796f998.npy +02958343-b8f6994a33f4f1adbda733a39f84326d.npy +04468005-54538ea15381fb87175776dbca7c7036.npy +02691156-e138a98d82f3aa692142bc26f72ae44c.npy +02958343-56a3f3d118f350a516abce8cb03e7794.npy +04256520-4f6ba19d62789d90d71c0b5c63bf171.npy +04379243-3b569be398a7e56eb4d174e5c61f344.npy +02691156-dbee200cebd464779b0ed23034a67f7f.npy +02691156-fc76d0a9da7cde0bef5ebf5f74916182.npy +03001627-bdd29e651e5f6fb2b079317292bdc5d4.npy +02933112-6e5ac40051b3e17b697129c0aef9e5f7.npy +04379243-5ee4cbe45bdc4cd571a782a4379556c7.npy +02958343-3500ccddade6926233307cdc293a210c.npy +04379243-b8cc89f8dbffe099a2da1afa391f92db.npy +03325088-9ce16ab9b4bad6e2b7a867e9b35a1295.npy +03001627-2c250a89e731a3d16f554fd9e81f2ffc.npy +03691459-9f4aab6206870d5deb34db531a289b8e.npy +03636649-91b7d2915bfede639b3360f500ac52a.npy +04530566-f226832ef907984fd8d4a0e4fc199475.npy +02958343-730608de801837b495b02c654da6c998.npy +02808440-549663876b12914accd0340812259a39.npy +03593526-2d5cccc84167c652b5918a323a1320cb.npy +04379243-7dca56442a9756a2e38cad80f0be5c63.npy +03938244-94e39fb5f01f15118998b3b64a143d42.npy +02924116-636f88c563c889147a69fd1f16c84fc.npy +03001627-89b05900bf1df4d8c8687ff9b0b4e4ac.npy +04256520-f1a09674a12a3aa7297936c81e7f6629.npy +04530566-d37263bdd876ddf6f885c09aa3e51c57.npy +04090263-33d90fc45cfadd54cc273c614d275d95.npy +03001627-d504ebe36ddde74cb5e61088d6c054a1.npy +03001627-670c7df7c840f78bcb7547c95fbdff26.npy +03001627-8a21b853c8de77f0c8687ff9b0b4e4ac.npy +03691459-9b4d3ead5066a6c5844e9c5caa6d29c6.npy +04379243-bd9758dc06e3c2a01e4317813b39d4fe.npy +03691459-5578446e4a13451a6c7c9dba2abc9f8b.npy +02876657-59763dfe99084f0440ba17ccf542984c.npy +03046257-312304e53430a5afc1f818f3a4aae3be.npy +02691156-90769434f2b588c1b675ec196a869fe5.npy +02876657-591153135f8571a69fc36bc06f1db2fa.npy +04379243-ca43d45909245ceb4ca2c1f43556033c.npy +04379243-78ccb410de7bfd821f8d8332ee17945a.npy +02691156-80b8f4da6b77eb66d208f79049825a82.npy +03790512-fb3e72a17d45156eef7c0039cbd1871c.npy +02828884-530b1267e70cf134d4d8765e3910f617.npy +02691156-66cd9502b63e8a97bbf3143b1cb6076a.npy +04379243-492de0f32fc58c83297936c81e7f6629.npy +04090263-7ce9eecd689e432892cea77f96988ae6.npy +04379243-1417875756d55264ab94214c753c8efe.npy +03001627-eee352c9cadd79cedb1051713db42252.npy +02691156-fd425567d79a43d14f8a08a5e6b028e7.npy +04401088-f9023b680f219f7c363111a4e20c10d0.npy +03001627-2c052f5541d4d5689b2d7f86be5d0083.npy +02691156-f89b085c37779a5997517c313146c4ab.npy +03636649-dce4bd10d499b2f24b3c42e318f3affc.npy +04379243-87accfd64238d29845511d16be3037f3.npy +04401088-e870d160aab8a55f1a696e9ae9fac3ba.npy +02958343-95d18b69c9624a05473f10e6caaeca56.npy +04004475-d918b4b7498972bdc9a1694d5d1efe00.npy +02691156-5cbe5be753b5c7faf389d19fad321c37.npy +02992529-9952f0dc41b20fcfdd5b23028b480cc3.npy +04379243-3512806247a9e1ae4ffcc2bca1c09e9.npy +03325088-6909b927f7712ee7f235ab3c41aeb5b6.npy +04256520-9eaaf854334b3bca676de9b6e111da8b.npy +03001627-6dfa9675d27b5fc134f6a34e269f5ec1.npy +02691156-fb2204e98090448ebbf3143b1cb6076a.npy +04256520-85bb20bc97b61c17261770c74651d29a.npy +04379243-a8fa391882414febad4f49b26ec52.npy +04256520-96ee3d286bfb909a204812d6a020ec9b.npy +04379243-f1b42fa8b6b48e927c34b035140384.npy +02691156-8a47b24f85a0eafa12234b062bc6c471.npy +04379243-763737ea91a58b0360eda59359536e76.npy +02876657-42f85b0eb5e9fd508f9c4ecc067067e9.npy +03991062-297999156841f16ade98d10ab5975b59.npy +04379243-5970844b794a55a736d8dd30a594b2af.npy +04090263-1c231bd6dfbefeba6bd753a4bc3410c1.npy +04379243-8a98eb9c64d878dd419786e9c37fabbe.npy +03325088-b89336e1f0e8aa3d76c18e71fd49c4dc.npy +02992529-ed53e90551ef9cb7118f00b061390b2.npy +03790512-9dd4ae1c34af4766b4f2746c8140d6d6.npy +02876657-347f9f4a04cc00841fba588fa05a3c38.npy +04256520-89f4fca1f562f9103264e1c4b42b3e14.npy +04530566-4b7642b98790bd4a58a8952c93ff9829.npy +02691156-f2f779b4f12ea6d67209009cfb89d4bd.npy +04401088-5f4c8cb8b3feae768c641604807c82a.npy +02828884-9113be55eb8ddd8ead5067eac75a07f7.npy +03001627-3115864130f4e8188f56c17c21b5509b.npy +02992529-959975a60ae104c48780444eaa02106b.npy +03636649-b2347fe81bd2db6a4b3c42e318f3affc.npy +02958343-460f7950d804d4564d7ac55d461d1984.npy +04530566-491a1618a4891fc73d1328bfe2caad0a.npy +04099429-1ab4a282a803461bf3e918c6494ec5fa.npy +02933112-30675877e822626e3fe047712e43e185.npy +03761084-c261ced82d435328c5b43a3b554f31ab.npy +02691156-87d764f79c2f3af24c2c88971423d0be.npy +04256520-8ce496ed6befb8db78fffc86da230525.npy +04379243-eecddd2b28a9e59866f379f51753f72b.npy +03325088-efb3a634efc20f9a4d4b39461684fdf9.npy +02992529-396fba35f02a9cc9bc1f690a77fffa14.npy +03001627-191360ba29f3d296ff458e602ebccbb0.npy +03001627-cdfe4ea9d00ce861f77e1de7c7a7b6e7.npy +03636649-a654df55875a2104d663817442d5278.npy +02691156-e15f4c98857b67e41e287f9f679ab620.npy +03001627-2b8c678b99f7b2807ea88ba060407992.npy +04379243-45a09b1ce3111e4f22f4fabdf1ee0670.npy +03001627-e916dfe829b5b3daf4b6538438a0b930.npy +03691459-337db7fe63aee7512d97367ba974aca3.npy +04090263-eca3075b0b976054f471dd2a9b3b53b1.npy +03467517-46354939c9eb3e20d7dd3e22ab50af23.npy +03691459-1aa51463dac23d5cc9f08ea7a19d874e.npy +03991062-3f9f732d2921e37781faebbdea6bd9be.npy +02828884-550b7b205e57c3b2315d0535381646e0.npy +04379243-ad26e8e474d42a4a79b3e1be3524f72f.npy +03001627-738188ae01887d2349bb1cbbf9a4206.npy +04468005-83806f7ea055359cd0656aee7124fe30.npy +02843684-3ee8b741d2a93a146faea4ea390b4428.npy +04090263-faf37c99fc99b88ba3e868f66b3e92fb.npy +02691156-f1b407dd7f610bb1a266a0298675ed53.npy +04530566-591d1b833b9ebfe798b8c800ae001b66.npy +03001627-1997d5827caf81df67d783b4714d4324.npy +04090263-4d355e20ad1b6eb6e7da0b4c2db4425f.npy +04090263-8deda7d1c75b33676314c3b6a3a65519.npy +02808440-49e43bbff6765f95d16ed9439ea3f1a5.npy +04379243-3f21494d8a34df8481a172d69c52a28a.npy +03001627-fb381061e67388ba80360680c1602c7d.npy +04256520-4076958da964edb95ff61a3a2a0e2484.npy +04256520-39a922f31e5a93bdc563fcc2752ece39.npy +02933112-7910e29e5285fa1a178e7d331e641179.npy +04379243-17b2481d38b84b334c37b9ce3a3de242.npy +02880940-a83b2eb519fbef17e922c0c19528ec07.npy +04379243-c74bad51457fb0faa0ab1d82ef09f78f.npy +03001627-80415f427a9368227678f114ae956b82.npy +02958343-7db943b676cd86d5729c04438af8eabf.npy +02828884-80d62612758f74d4e8a5546ad55c2a41.npy +02958343-5c4bb9e23c6cd8511371f3c322b54f2c.npy +03001627-a037d4ba135bea9472a38ac2b8f5cd48.npy +03691459-fb6bb656468452fb22d1a40e420084a6.npy +02933112-7e0483b10eb6ae141620773c2aaaa465.npy +02808440-9db2b3689da207ddb9cf447f0a2a43d3.npy +04256520-dbe7ab8fbc9429c2cf40e78cb31675ae.npy +03337140-c227d03fbea989c6ef93db01ab079fcc.npy +04379243-aca4c523f999de86febad4f49b26ec52.npy +04379243-dd0c4018a8b310edafaeb6535dda1ed.npy +04379243-5a3e5f0fff5a7220b4ca2ef8c032d07d.npy +03001627-a6507d76e88e9d68c28a12683f5d3629.npy +04379243-758df6055459cdf6cf58a1b90d479c9.npy +03001627-107caefdad02cf1c8ab8e68cb52baa6a.npy +02958343-c4a2e92c4b79ef3140273d3a78e6b502.npy +02958343-f9f6c13367f93890657766c4624e375e.npy +03691459-e4edc21690f623a35587d8c9be86464a.npy +04379243-174832b73cd6d91c9856fa70a578baeb.npy +03211117-d1718f74c964b34e234c2f2e8f2fe6da.npy +02808440-ba86184fb4bd46a23321831d2245cf06.npy +02691156-d9a263d86ae0fa599751c7a6f15617f4.npy +02992529-725cf43af935ee023832db239383a26e.npy +04379243-43fcddd5232a6021a56e8b79ca4e2911.npy +03001627-a5abf524f9b08432f51f77a6d7299806.npy +03211117-56dee4eb44b2f0e64a6b6d001599a1e5.npy +02933112-4b80db7aaf0dff0c4da5feafe6f1c8fc.npy +04379243-6f1985e1c09aa1be7dd7d23ce6ceed2e.npy +04256520-e3b28c9216617a638ab9d2d7b1d714.npy +04379243-9c0485519f34076a486150a9b7f2cf18.npy +02808440-449e90cbbe310030b983088451bda93b.npy +04090263-5aa0e518413524436ea2d3b1b25fdbb7.npy +04256520-4769bb2062392beb453a4adde9273930.npy +03948459-c045c2df9649384e58da2ab14df356b2.npy +04090263-156dbdcadae5e010337b0188275140f9.npy +04256520-dd4c87420882a7e6dcfceb73ef9b6e3b.npy +04379243-2e8500336964ddabcb51f8085cd316d0.npy +04379243-d1a0b26d98ee4a877fa6d07b5977c143.npy +02958343-863f9284eec4a256e9d8921ebe6d5b8e.npy +03636649-8b60bb548c0813a7e420612cf7bb547c.npy +04379243-bb1ff02f14d1cdd19ccce4c6d5bb195f.npy +03001627-5a3228a34ec0572b4b3c42e318f3affc.npy +04256520-5cc8f84b9b53b30bdfa4ff010b8b9d1c.npy +04090263-9c70690a9d79a4d412a8e5e6e6618c8e.npy +03636649-1b0ecf93a4a36a70f7b783634bf3f92f.npy +03467517-ce3e563f291d1b3311a3eda9aff2873.npy +04379243-e10181e68d41be9a75f27865805fd94a.npy +03691459-6c31773432190681f46dcb5d9d87ce1b.npy +04256520-a3feac5d875f764c1961e650f3cfa396.npy +04256520-447856e1071e8b83c036a40816608369.npy +04379243-65cbf486ccc5afc53002761e7a3ba3bd.npy +03691459-c50c27f14da0f7fb86785c91e1a79038.npy +04256520-ee71654238a92dabddcbda91db0cadbd.npy +04090263-6e0e38455b33bbf7632bedb12ff8cfc9.npy +03642806-e5559cd005d5c4942a7b0c74c5f22fc4.npy +04379243-b7fa4e123bcf7457ab610b0c94236463.npy +02691156-9a266b3a734e374687bf26680c510802.npy +02958343-ba9097cf9c836c0f2a9eb0f146e94477.npy +03211117-795fab6a3c23c0779f8445dce6fc950e.npy +04379243-7cb4211c4a8dc2cbad5067eac75a07f7.npy +03211117-2bb72bc8157a2d8dd5f7c62c7dfe63f9.npy +04379243-766fce6fad5a071bc5beea20858a99d5.npy +02691156-d7a2512d9d8ad4c8a18e0889038e4fb6.npy +03593526-41fcf346a7b3ceb75337cdc4b758988c.npy +03046257-f63ad6dcf847c2f95860148f7c2404c9.npy +04401088-c95b7121b6408df49fda13f2ab6d2b41.npy +02691156-d708c311bcd60e61c9ac656f0c2edc4b.npy +04379243-75f2bc98aecf198974984b9cd0997a52.npy +02691156-f39985959d394f8c863ab010b80d9ed.npy +03001627-631671b636ab97d4da41a38d2e317241.npy +02958343-b06c5da878580bec3c0146ad3ea2d7d.npy +02691156-35131f7ea7256373879c08e5cc6e64bc.npy +03691459-efb33523a6be2e105a31d91ec836a511.npy +03642806-773e395af8222f5a7ade0e7a3afdc8.npy +04530566-c00a8f1dc19a0e5341213ed93def741e.npy +04379243-64ffb47735074fb128ea9c4c28e5ce40.npy +02828884-8ccb3bf7c49c24c0d4d8765e3910f617.npy +02691156-37f251fbd5e094348139630c61d12904.npy +02958343-eef8e5bd46755164eb2d90cf3f6fcb8c.npy +04379243-33b56fcb0b86e914c3bd24f986301745.npy +03046257-dbec11f4a9869cdff51f77a6d7299806.npy +02691156-b2960c2be8fad9dac140e34b6af37a1d.npy +03691459-bda24b02920f91d1887e8faf8f33b0c5.npy +04256520-f2446f65ba438c2119fb4103277a6b93.npy +03624134-b382ba6ce202434bd3802c3145f560bc.npy +04090263-4dff14f1635e9abeb1e00d60b0f9cc70.npy +04379243-7f0aaa160a9f024e492d9da2668ec34c.npy +03636649-2da9d9bea10d936e23c0d2e0152e91b5.npy +03948459-fe6368e73425bdc8ea70d2e1ac81279b.npy +03636649-1ac102f4a452771521e935c3c465f9f.npy +04379243-6d580c3fb8702ceaa864ae08f4e79056.npy +04379243-20bc1ce03f5996bf9ee02475d7f98585.npy +03085013-e2cd4218113ddcfe75b627155369ae7.npy +04379243-188ce43d9c8caabc5213169cc9897a9d.npy +02808440-805f3d85487a6e523321831d2245cf06.npy +04256520-a65534c7545a4b3a19fb4103277a6b93.npy +03636649-b95719df909773fe65d8717db5192d1.npy +03624134-8c2a7aab604336ebb1ca50cbadeab92c.npy +04256520-49d6f351e82d186b366971e8a2cdf120.npy +04530566-9a9bd517b3d9c60f9e23f6fc87a31098.npy +04379243-759cb93134fd5efde76bc197b3a3ffc0.npy +04090263-a4ad8e643348a9ff3f217b945a063dd2.npy +04379243-963f0a74420659066c09be1a24173c83.npy +02828884-66aade9f5d8c74ae924bf081da6f024c.npy +04379243-7153026411fbb33cae685ca100c909e8.npy +03642806-80523db48cdfd058b9e4d514e1e82b2b.npy +03001627-u481ebf18-4bbb-4b49-90c9-7a1e9348b647.npy +02924116-7cb9f004d48454e18cdfa422d76ee8.npy +04090263-339ae95cab075926c1fb6fdac33c3f5.npy +02828884-ec3b32347c823f258c2b40655482a651.npy +04256520-cd9ef0c92376e604963cdf8b01c64c16.npy +03337140-c06792fff0774954492d9da2668ec34c.npy +03636649-89ed63af13b79f3ef42a90fe4baf4591.npy +02924116-2dca337ba2d9d12a0fba45aa212129.npy +03001627-d571022446bdf81ee83221ad0d21775.npy +04379243-c4b5ed6c9ae1ec5e8c54ec820a9ed1cd.npy +02958343-7c421b6417152aae473f10e6caaeca56.npy +04256520-c91ed7cebef758f935836c728d324152.npy +04379243-12fa3eea2b02ab9e931178a47d29b194.npy +03001627-c47f71319ead4eb8a4fb72f4f3b0e317.npy +03001627-4bc5920f74bbf6412acd2bb6205825cb.npy +02924116-f413b641dfdbf6317f8c317a43ebc941.npy +03211117-c2b4ffa6f1911d4cd1ecbd6620e3fd17.npy +03790512-d54e0f22d4604d741f24b86004bccc4d.npy +04090263-be55b1a477c465226f8c560cfa1fa0c9.npy +03001627-330d08738230faf0bc78bb6f3ca89e4c.npy +02828884-6accdfe97ecfa9952056b4bd5d870b47.npy +03001627-1c17cc67b8c747c3febad4f49b26ec52.npy +03991062-ad200681b4a58c30de24f3da4a0e8540.npy +03001627-763bccb675b7439ab9afb6208cab1d.npy +02958343-7a13aaf4344630329ed7f3a4aa9b6d86.npy +03991062-b84f95f09345b864a249f8489bc060dd.npy +04530566-fd255f604c44b9cf497768bbb615071b.npy +02691156-1628b65a9f3cd7c05e9e2656aff7dd5b.npy +03211117-2a08ac484551337a90eb6645edb4567b.npy +03001627-2fa044df89ef13b0e5c1abd833032715.npy +03691459-37992f1a3a6eb8abf398d0c5832df00e.npy +02691156-1cfada8b8ad2428fcabcecce1c335df1.npy +03513137-d8736fc5b77ac6d26e686498ed562f91.npy +04530566-8eb481ee0fa4f55bf9d742d7f0246fb0.npy +02828884-349e1bf46f54c4f267efa971ab69a8e9.npy +03001627-f35abb8246614d7ff38854b09cdc7cc5.npy +03001627-e2acc4d276fda3d77d70172a29ade99a.npy +04256520-75a451559a48b42f6e525b37bf033529.npy +03001627-7182f94bdd17c0ecd6bbf317cb591f56.npy +03001627-fb369c50dc8fdcc5ff2c92c2a4f65876.npy +04225987-5aec8d7745acbca498c63cb68f11df34.npy +04379243-63b5d8f4fcb29b12d0125a4a81c5d058.npy +04379243-7807caccf26f7845e5cf802ea0702182.npy +03207941-276a54bd18473b58703939fc621a3e37.npy +02958343-b6f76fc67324911616abce8cb03e7794.npy +04530566-ec4a394fd782e66b749227c7279794e.npy +04379243-7602875276e42d1990eb1f8a00f61726.npy +03636649-596ac8748f6c946efcb8d8c6d4df8143.npy +02933112-2d1b4c33c0a40653c59350d819542ec7.npy +03325088-7bbfca0420c26d692db5d63410b93a87.npy +03001627-7fc00af759f4382c48d90eef8384210.npy +03001627-5e685e076287215be8f8c11a24c52ebb.npy +04379243-d14a4b797fec250b83768a4ac1607d73.npy +03211117-33083674276c5cf5b07a27512172330.npy +02691156-de5cade3966a1dad94946b454cd190d0.npy +04379243-46a07944ca646df01ff8bce0e3352d0c.npy +04530566-6c2c2ce0215d3f979b3523fcb9cc5680.npy +02691156-d21c556af88582754c3a35cee92bb95b.npy +02954340-61437489633f5d167c35d3c5d3b1fcf7.npy +02958343-fc99fdfd71b5662a669a6bfc71569d.npy +04256520-fefb2c5e88d7e647eaf288f952624966.npy +04256520-6aef3ffcf683005263cc440c7caf3d76.npy +03928116-214ddee55941f803a94b8a2c7c1e5b8b.npy +04401088-fb050aca4d5f2573cf1d3d11d6121bb4.npy +02958343-510df40932e79779a324deea8acbeebe.npy +03046257-d5cf322e44690c0d6030431156406c3a.npy +03790512-104d1e5422e79ff667691228a451173a.npy +04256520-8bf3680dded4772ff51fa0238791f5dc.npy +02691156-73fb8c3c4530ed4bbf3143b1cb6076a.npy +02808440-a0c19e3a7fddb5733178fd967888865d.npy +02808440-f9fe136c1738dcb1ec3cc26553cfa06b.npy +04379243-34d82982f75a6249ccce4c6d5bb195f.npy +03001627-edef00af1cdfbe1419fb4103277a6b93.npy +04379243-debd06d3176a5b728cbb8bac2032149c.npy +04379243-7d0eea8581ece273820018801b237b3d.npy +03636649-ebdc97f5fa29b1dae6597d391ab6fcc1.npy +03790512-c6fbae9bbff2829db3a2525d53af0903.npy +02992529-3c244a5e76cec2cf6f108f2b64e6593a.npy +02691156-4a837740b388aa45d8ff6111270336a9.npy +04379243-669a8114b9a602c2febad4f49b26ec52.npy +04090263-dc9a54a41fbd77314aef47a2c7bc343b.npy +04379243-9e2cb89de5564d7c1dc5f68d8d7e8ab0.npy +04401088-4157af4a11fda8ebdd3d821abaa89276.npy +04379243-1a2914169a3a1536a71646339441ab0c.npy +04090263-4e699ed7d6b3e556d3cd5c5355c4e1f6.npy +04330267-44d882d8627163957a35fac374dd53e8.npy +04090263-f42ef3273a8b4cbbf4f70c928a738b3.npy +02691156-eb43db95d804f40d66cf1b4a8fc3914e.npy +03513137-77266730e34800638d23b8b99c98bb6e.npy +04225987-dcb9a62d5ef76f389da15808191f1405.npy +04468005-8a147e233c90a5d52470de2774d6099.npy +04379243-2642d805c53e243d629f73b53bd7a234.npy +04530566-4fbc7c634bd4488798b8c800ae001b66.npy +03211117-c65b30c8ec2833692d56866e214da3cf.npy +02691156-3d2e10ca9a5db964dc398f7f89f37ee6.npy +02876657-3b956918a41da89c325e6e8eb2c67fd8.npy +02958343-d9838c0fcfd30659d9f8911ce020a037.npy +02747177-3be3e86b2fad511048d5a1386787189.npy +02691156-32edb6ba5788dc12d8ff6111270336a9.npy +02691156-229cd78f9ac3e77c8b96ae1a0a8b84ec.npy +04379243-7722e83d837b5bfcddafe9b591eb9ebc.npy +04379243-cc3cdaa52b4b96fa55f46d55537192b6.npy +02992529-8fcae817c180d5224208dfa1c5fa1065.npy +04379243-7093cec0f1eba67e11f3f1bdf34ac930.npy +03001627-47fc279d7f0c2a492d9da2668ec34c.npy +04379243-5040f8f3e2293db448e116352760c52d.npy +03046257-738dbd4808eec6c5472c1918bd40698f.npy +03001627-c877660e0ec15c0d22be63590e183603.npy +02958343-5c04452276a26b80d97e5ba4dc9a93c3.npy +03001627-643e55c58a248949b24e615f75a5a1bb.npy +04379243-f8f22279842d9b8bfc6d85675a0e869f.npy +03001627-d1caa22978e516655c31590a2627247.npy +03636649-46811f96fdad80cf912acc8c54e7fc1.npy +03001627-3df44d30265f697e7e684d25d4dcaf0.npy +03691459-fc5315b04ff094686d564e28438f8cbc.npy +03001627-2fb9c50ebbd98075ba5342d638d0c267.npy +02691156-e09c32b947e33f619ba010ddb4974fe.npy +03797390-a1d293f5cc20d01ad7f470ee20dce9e0.npy +04379243-e28af7dd5593fe6f820018801b237b3d.npy +03211117-6f3c489407842f81c36ff2417ee947.npy +04554684-ded40c1866a00ea02b5631520b7d94fe.npy +03211117-9aea8bba40aa793d9429f6a938b3978d.npy +03085013-6b8b2a80a834a297590e6ac98d4b27b0.npy +04379243-d7b56f61904aca6b7422d2e1b1d40882.npy +04379243-376c99ec94d34cf4e76bc197b3a3ffc0.npy +04379243-6f934779da945914bccaad2aa3926367.npy +04090263-c18b96da3e1c8a2350780f5a8c844eae.npy +03001627-6e1fbf46f1d0fb73d8cc7a9b2448f97.npy +03001627-37aa434da4ef00038b424343280aeccb.npy +03636649-dd818b0269b1aa15fcb8d8c6d4df8143.npy +03001627-e28a52d8864870b222ed3259ee7e608a.npy +04256520-34e10b72cfc4f36ad8e004adc6acd545.npy +04379243-4f7497a449c2e4a56b9e47850f23a791.npy +02691156-3fa6a05b62169e0d2350d07acbcc057a.npy +03636649-37aac1913201b058c02170c33e00ea64.npy +02691156-7e75688f4b185d4193a78ffd70737098.npy +02958343-9a2854600f24017949b12cf3977a48b.npy +04379243-e18d2ccfd7e0da86bc22c9f90939338.npy +04379243-246b26ca99193386668ae11a7db5e82a.npy +04401088-d932fb5d06d5e4f8da8c8a88ff86c5a7.npy +02958343-dd37570a8876c4a4a513de4eb79b310d.npy +03636649-53ae95290cca57d430c35ecdb9dea035.npy +04379243-7d6102f23f51764d2ed4a731510fb423.npy +02958343-5bab0881b7a18b12733269057ed164db.npy +04401088-c3a90bcecce7f4817b6fd5468f603b31.npy +04099429-d6c905e92a1da84fac912b2d8003cafc.npy +03797390-928a383f79698c3fb6d9bc28c8d8a2c4.npy +03001627-753c5b7f6ee56a77d73237b8afc2f0a9.npy +03001627-c0cdfbbf3a80105fa8699b6183baa203.npy +03001627-2a197b179994b877f63e8e405d49b8ce.npy +03046257-22a1e55050bce5c3b441e189e5a85c02.npy +02992529-25eff75e43287223f1cb19f636b1c2bd.npy +03211117-9c23caf872048374ec8285b7fd906069.npy +03325088-1e2e11043b3d67d76621db2c3226f08.npy +02954340-9c225cd8f50b7c353d9199581d0f4b4.npy +04090263-3ca8b397052d4da818336d317bffd215.npy +03001627-2ac88058053d5c2671a782a4379556c7.npy +04379243-1345a6b69c9e7330427e34fb2aadd7a4.npy +03211117-cc4b7dbffb52fdacaccd68c8aac6846c.npy +04379243-ccec9e173fb41a3323eb3ad3d378722a.npy +03001627-59b79461f64a41c3d225e12279334514.npy +02924116-6934ae6c15afd23ed687ba8afc125512.npy +03797390-1dd8290a154f4b1534a8988fdcee4fde.npy +03001627-f5b08ab02727922b738dd0d3509c7e47.npy +03001627-fb912528e642f6ea7c7cfdf5546967dd.npy +04460130-5bae6e286a9ce96de6bffcc6da770837.npy +03325088-7d44ccb1ef1ddb483321831d2245cf06.npy +03001627-9cd0529b7ce926017dbe6b236c44c533.npy +03001627-b19f85fcd46f456bd5cba62773b8025b.npy +03790512-450aa58cb4bcd8a34d8ad024e30db0d.npy +02691156-f07028f2080aaf4e75b90b083ed202b.npy +03691459-cd451b74570bd84f44dc88afcdcd380.npy +04004475-ac2ea2d41c57d1075999f9ba82d15928.npy +02691156-e039c9760ca026cc6aa3bf023a2b42a5.npy +04379243-3bd1fcc6ef50264112126d1916209079.npy +03001627-c405857cd7d8aa04d225e12279334514.npy +02958343-1c351358afff1cc582e5e3e7771ea25.npy +02828884-32563c1b8b31667bb6695fcbbfeb161b.npy +04256520-5259557e17d437954c90f2ddc14dc59b.npy +03001627-4422c64dffcd8662eaf288f952624966.npy +02818832-b9302be3dc846d834f0ba81bea651144.npy +03001627-a67a09662c39430bc8687ff9b0b4e4ac.npy +02808440-c1b69f70751648a0b362845c6edb57fc.npy +03790512-832c4a316c419228b37378f3c85478b4.npy +02933112-9c87aebafdb4830ba5dc3fef8d22887b.npy +03790512-58705c949dd5d944d9d3572bbd9cf789.npy +04379243-fe7dd4f6b988123bd810b14a81e12eca.npy +03001627-98d1fb12c3354d341e67ee2399c63faa.npy +04090263-d1e786e052c26ed3cfb3f4d4e98ee41e.npy +03211117-13c8048199d8063c6c6253deb0c008d9.npy +04379243-f7dc5f5fde343cc5c955e5ed03ef3a2f.npy +02958343-c41fc68f756437b2511afe12ef4fe731.npy +02828884-39904b25a6d2f13ed4d8765e3910f617.npy +03337140-2ffd2e6d1a55bdf44c3aee8e9d3a6ffa.npy +03001627-5566ad94be22e7b5d85141a9ad5b3597.npy +03636649-ac662716b87687be71e364dec61013a6.npy +03001627-df609533cd186278398c7598b0d2e5d5.npy +03636649-12e8d8176f2bd111978e8f21c8f49a92.npy +03001627-a990ac870ac807c4d838ae16242881dc.npy +03001627-efefba3f45a9e16dd64ad79e5981cc8f.npy +02747177-ada5b924669c5bf4cb2a965e75be701c.npy +04379243-96fa9d34fcb17ff21fc43d5b32fa230f.npy +04256520-d15ccf2af52a95f619fb4103277a6b93.npy +04379243-92fed8fdc8f881d2dfda46c9a34dab22.npy +02958343-a5a6c94b8a93c11b679506fe2f937c34.npy +04256520-855a071aeff2351a593ebeeedbff73b.npy +03636649-c6612c884c025a48f647dc544bb0ab61.npy +02933112-eb2843ff62280f5320768660cf080d12.npy +02958343-acdb7b476fc5a1ca96f65931c8819eb.npy +02871439-80276f2c816c9e2342fe42ef24970417.npy +02828884-99cd1d8970feddbaed98cca8f0ccd5f7.npy +03790512-77e00aae33f3ecb4f5724931a8c2eb52.npy +03790512-f5badefe2a054ff7d1cdd91e6d9c7a4c.npy +04256520-8f4ba17b19d2d5a0ee50221b2a22a6a4.npy +03211117-b86af5698f9a04a4d0d1157c0bfa4669.npy +03636649-e0577be012414515fcb8d8c6d4df8143.npy +04004475-ca6ffcb4cdf260e62f5798686b2c3330.npy +03642806-2926c35f9f2b8c7556faf77ac8662d5b.npy +02828884-51c60589bdd1ed73d4d8765e3910f617.npy +03337140-49c97ea1b6f4d3c9b5418cab1c661a7e.npy +04090263-35f7e2c8a6c9072eb43c84780cf56b88.npy +03593526-7bf1c516ca16d0c02367de4cd267ca0c.npy +04256520-7d4d8e65979c28c1f8d4231017d95f74.npy +03001627-b162f52f6a1ac00e519f3f3e6cd6d1a6.npy +04379243-54b4555dacd9fc16e1eb1991fb37eb9b.npy +02808440-c97d74e85fb248e6bf258aa99523f66b.npy +04256520-9770f3e5ebc261794f15b22cc208bec1.npy +04090263-1d69667fdee51c20e6fe695987d47043.npy +03001627-bb9bc0e6f8ec17bb7b07a77641318a82.npy +04530566-332d072efa23ec9ae89f0d5485194c5.npy +03001627-d64a812bb87a822b8380de241b5e0725.npy +04401088-98eab6b7dee0d64519907bbfddac6b6.npy +02958343-490812763fa965b8473f10e6caaeca56.npy +02773838-e8039f73cf912ff5e8c69fd29511206a.npy +04256520-d54be63f3df4a80aafb1dd61dbf468dd.npy +03001627-866d6243ed67de2ee0a87b67b4933300.npy +03046257-368d9126e2053bd4815b2b467e8e2eac.npy +02828884-6198e40d0055c59fc34a45b74d0027ff.npy +02691156-ac76572656c1e36ea79176d3c96ca1af.npy +04256520-17b1927dbf59786a45b09d36414f81ec.npy +04256520-2bc178dc567eaaa7e01b76a0b6e5fec5.npy +04379243-76f4352b12cebc55685756818b5a05e.npy +04379243-452a33df06b678c6822b5ad61b22977a.npy +03642806-e9e28a11f71337fc201115f39f20d1ff.npy +04530566-6e0f329ced87d7a3c9cfe13d43d30dc.npy +04330267-27e067d588f8fa27ae410fdebd404ac2.npy +04530566-80e8c7703883a40c9e4614310319ea50.npy +02691156-a273a18b004c209c90b1d6deb98feec6.npy +02818832-7afc224d6b6cb2e4a82f8da544827cac.npy +04379243-5b4997ae8d1e46fd16a2b5862518c93.npy +03636649-ac2a766efbe869cdf51f77a6d7299806.npy +03001627-d081ce6cdafa416c8687ff9b0b4e4ac.npy +03337140-bd86234b060b77857a50afc9c93f8a50.npy +04530566-c600a1ae674cb65c335aeab2c20177db.npy +04530566-f89a76e638ecb1aec79d3cf109867c13.npy +02691156-5bd746709adf5b3ccffae3eeba6126e6.npy +02958343-9c846ae63f5fbd9a16abce8cb03e7794.npy +04256520-5e217fd0fd2b1ce7d3a80acddc1093d9.npy +04379243-3581d1bdd22e782a855931d119219022.npy +04090263-3945a1d805dfde6a989c6c7df583f91e.npy +04379243-4bb8e7499f9c5466a341228b21d337a9.npy +03691459-c117b031376d3c12cd5cc02ebe46ffbd.npy +02691156-48fc59725119ac1133de69c9cd670995.npy +02808440-56fe318a9d7fb0503af30a3946d92feb.npy +02691156-b7bd7a753da0aa113ce4891c7dcdfb1c.npy +03337140-205bf6a78db9e112e7ecdbe73ef4323c.npy +03636649-f8bdd98f53fd851ec1537287b5c50d9d.npy +03211117-92e757e989dab6225ad009ac944c169e.npy +02958343-8364ea0a27342c9d16abce8cb03e7794.npy +03211117-bca2b66a9ef701bf585db0bff5175f74.npy +02924116-9178a769f38b01e8245f1bff867e8982.npy +02954340-c7122c44495a5ac6aceb0fa31f18f016.npy +04256520-58915b74af8f69af5213cec267286d18.npy +04530566-2ee1a459db90488826fea6918e74b120.npy +03001627-cb74cf36ff8fcb8d61d7edc67034608e.npy +04379243-192812aa4ad73d2fe6c5cd45aa112726.npy +04401088-645c1b7e5297cdf567b9bb226efd81df.npy +02691156-241648add391b8d54d210d9468aedaf2.npy +04379243-351057418704d299f51fa0238791f5dc.npy +03001627-6b38324cb8beedc5ca86e527b84d8854.npy +03467517-96af19353b4e3f44bc461aab61d7a636.npy +04379243-b1a156c751cb960f270371af13f7e37.npy +03001627-1ac6531a337de85f2f7628d6bf38bcc4.npy +04379243-f9d405eae2dd08fd12439bb9f264f4d9.npy +04379243-a9a618507a691298febad4f49b26ec52.npy +02933112-55b945bcc9d3525be005c5c244da3c48.npy +02958343-72a35a471514d6299e317a6cc797b629.npy +03001627-986e49bd8314d7424addf6a5f8726274.npy +03938244-7d9cb088956a9c4993e60794f9200b7.npy +02946921-56dfb6a30f498643bbf0c65ae96423ae.npy +02958343-14d47aa57151ae4baa93570ec0c0afff.npy +03211117-a6ce00ec813199804e2b01a3e0fd3197.npy +04530566-b3baa99a603abe4415aeee24c2916cad.npy +02808440-5b7d8d0f5c9ac09a5a4742c0584c3335.npy +04090263-9c0a483ea22323c78ca4596df3cbf136.npy +03001627-8f2cc8ff68f3208ec935dd3bb5739fc.npy +03636649-26cdef36773542454d1e14997920b517.npy +02691156-de29a1335c332a5ef7bc9a344bb7bae5.npy +03001627-45c998547946bc4d6a88c250a18c2861.npy +03642806-62b25a5e3119b8409023147b38c03c9f.npy +03211117-f89e49aa0058323d677ccd99bc42875d.npy +03001627-4909c59d7326a2e6217eabb7c57f6292.npy +02958343-4d8a4808e9bf605b11647ffa4306609.npy +02828884-b09f17c66d25a38cf155d75bbf62b80.npy +04256520-52f6fbe3a36a4d1f19fb4103277a6b93.npy +03046257-8c00d87bcc8f034aa1b95b258b5f7139.npy +04256520-1613148b579a747814038d588fd1342f.npy +02691156-2a801b1918ef23f1121ca0b13e917b22.npy +04379243-53afa98f1de6af6d810b14a81e12eca.npy +02691156-26830050c44b5a8f9cf081e9d8a0b57f.npy +02933112-29ce2b045bc6111912de5317fe5b354f.npy +03636649-2ed8dcef657845be4a8e02787dff638e.npy +04379243-89054836cd41bfb9820018801b237b3d.npy +02691156-d1b407350e61150942d79310bc7e47b3.npy +03001627-a5df9c511f51228f19fb4103277a6b93.npy +04256520-61d93b7c3e83541c81dff5c2e57ad46e.npy +04256520-2e17fbc8ae8989911751d30f076514e.npy +03636649-92c74371acbdc4b1b8e1b99345a5afd4.npy +02992529-30d54e046b9abe8bf1cb19f636b1c2bd.npy +04330267-b6a2fb4fba91d35099762eab905e5e24.npy +04468005-210891be5182a77a74b43df14d002c9d.npy +03710193-168b842e1b905547e5ffa6096479cd83.npy +03710193-b079453fe8d3f43ac51268fdb437a9e.npy +03337140-71da51493940abadce5d6e9371bb5c33.npy +03325088-d613fbb4f7e4cf6a9ba4d8847eef9270.npy +03001627-cf80306fbfc886095213cec267286d18.npy +04379243-e1d8f005e47f3a4ead01cc66cfa1fb80.npy +03001627-f1645567130e99a878268642d8df40d1.npy +04004475-70d90d42d01ec9c479dab49a427a6afa.npy +04379243-c613e4469bfeda17cc4256bed53b2ee2.npy +03636649-571027d7f9639bfa7d7103fc1114c50f.npy +03001627-d0fad7458cdb5178d3f6d823f04dd65.npy +02691156-61c804d4751079962df73a6189a3b87.npy +04090263-b0417ea1c8623f189c5408f4f799fe72.npy +04379243-2f1a310ca0fb6b0177e131ed5f0fcc86.npy +02828884-9891e489f1f4dab52056b4bd5d870b47.npy +02958343-191f9cd970e5b0cc174ee7ebab9d8065.npy +03001627-751667777ff0926ab03957cf6f6ea666.npy +04379243-b825cc91b6257e73002761e7a3ba3bd.npy +04530566-8e8a38abbfa3ddec942654e703edf3c5.npy +03211117-d9bac9c418667d2ba62bc668cb34e698.npy +02933112-132185edbe4f2c5fb4c161851ed2b4e4.npy +04090263-3d5bdd3fb1f4ac0e12a8e5e6e6618c8e.npy +04379243-2aa624d7f91a5c16193d9e76bb15876.npy +02924116-f30209622ad392b1dca398a9db6025b3.npy +04090263-6e4a5a5577d06899498dc39a5b1a1c7d.npy +03467517-af4e80985f965bb091437d7de92c7dd7.npy +04379243-5884f7c8367ea46c7c6c78d6efdd12ae.npy +03001627-fb056f0260d4855d36c8b9bf2576aca2.npy +03046257-f82e94171acffa9cb3914c1351b16c4d.npy +02691156-1e9acb74ad09ba97192ddbe75f0b85fe.npy +02691156-afcb946d2d36a77abc0909d98a1ff2b4.npy +02958343-6a737d71a4c4d81958943aeb17f0d326.npy +03691459-361a97dfbbcdd820b182f50d8877b64.npy +03001627-67bee683e394395d84ea893d074ffaa1.npy +03001627-11358c94662a68117e66b3e5c11f24d4.npy +02828884-1480fa8916f31b6d3c77a85180cab6b6.npy +03001627-fd9b63c23342e57045b799df37b9f05.npy +03636649-57dfd0ac5a78c9322f841233486fac2b.npy +04530566-52492bb52701aa4eac05cacef62577ec.npy +04530566-47a07536cc3ff3219c42421cfc900873.npy +04379243-273b31cfb08c2f2aca9e6cd07e5806da.npy +04530566-7400be7b247ce021be99fd8a5f540d8f.npy +04401088-89019c955310bc56eeb3fafe1bc8c07d.npy +04256520-12ae9aa6900536aaf24f0645d0949356.npy +02958343-575266906372ef117cc922af3684d251.npy +02933112-10c14b0cb76f87584da5feafe6f1c8fc.npy +02828884-80ac9f2999087c868c0a51976aeebbec.npy +04379243-668fc6063bd05447e4bf96d5b836adbc.npy +03001627-2fc85613e0c1fd7c6ff6a1869fe2467f.npy +04256520-eb3b29fb1782c83de8a4454323586e35.npy +02958343-95d8510258f7f919c9be4fc52f26b7f5.npy +04379243-4b237530ff7c8c064b2ec20c30ace65f.npy +02958343-df7c767eba9455f651a95aaa6caba1d3.npy +04379243-1c4192bcee62e018a4207c8c70da88f1.npy +03001627-a4ebefeb5cc26f7378a371eb63283bfc.npy +02924116-6cb8d31ae40d5cacef2ffd8d8b11b2c3.npy +03211117-6f7bbbc83183a93daafac0c8d5992bd.npy +02871439-2a9acc146f7310b1492d9da2668ec34c.npy +04256520-9625852787b360bf20900f5b6ea8b024.npy +04379243-f64617385056e0b1beedb4c8fd29e2d1.npy +02933112-92a1e771eb621c14c2a5a06bb7a05e87.npy +02691156-bd48d0beb5d1acf1d2106c9042f1bde9.npy +02691156-5c3e308093e9f287f019a51d1a3b2e07.npy +04379243-9fd065502f87d1f4c2cd59b38b35eb54.npy +03928116-26aefd556e434170fc33ea9eb1363feb.npy +03691459-9403368e6a0bebf5664c61db46dc2c9e.npy +03211117-85d0ff09690c539cfc727671f5682283.npy +04379243-8b54150f56e59a91de9149d4acef1da1.npy +03467517-36145d7338b0dc2040c20797381ee39f.npy +04379243-c7ff0afab4b7885a52160ba64fb535b2.npy +03636649-fd074c0819b9934f73b8ea30c1700f67.npy +04379243-2e9be34fe47802b217ffa9a4ab48724c.npy +02808440-d34d1113a1125ac756abb3039ae17c7b.npy +04330267-83341c37c4f58ebeb3abbd2edaada094.npy +04379243-1c2e9a364b82f14fb9a0f5d18f1ce54c.npy +03636649-ed6f57c8e550c60d39adae6ec56b2451.npy +02992529-d72b00ba0cbe10a1157f4a560c24391b.npy +02924116-71ba773a665447b583c8e6d5420def84.npy +03593526-1c73c8ff52c31667c8724d5673a063a6.npy +04090263-c26b1d42bad81b6397fd8ef0d14ce047.npy +03001627-dec4d499ce2ff518dc732bd0305fe3a3.npy +04379243-ea559127f7f21405372d8d157558385e.npy +03636649-f8534299ecce5c16eaf14273fa406ffc.npy +04379243-af057970729b2cb255182f299fe41fdc.npy +03001627-d15ccf2af52a95f619fb4103277a6b93.npy +02828884-83e7c29954256530e2c4291819b46f29.npy +03636649-981e7c99ee1fbf91fcb8d8c6d4df8143.npy +02958343-76f35efa4083dc6a4d31b03e74c723a3.npy +04530566-87e1eda2a99c713d4fbe64e9d0fe42b6.npy +04004475-d44c19fe6b01e769f040a28fe9ae7.npy +04401088-afa806973174e442ac4f72bf08dc79a6.npy +02808440-357e42ec5c66861cccd0340812259a39.npy +03001627-78261b526d28a436cc786970133d7717.npy +02958343-f9b9b12c6061d32ab910dc0e33e50abd.npy +04379243-4dc3e9e293450817d3dad974dc098fa1.npy +04256520-b6de66042941f5691301e24e9e27a9c3.npy +02958343-389cc4b8b1e28d1770905bc56bbeab9f.npy +04379243-b4b5eedfa5c159e0d4e369d956a06b76.npy +04090263-7b0889c55d482cdcf0fea2ee98610322.npy +03691459-bc611920d1608f96df172f74754804e6.npy +02808440-f37c6c427d253657bbf140c61ceddce2.npy +02958343-c57c11cbcb97f74058c27e607f6e2d4c.npy +04379243-fed87d16ece9ac0ad42ec7e303174a87.npy +04090263-35976b05836b249552c3271e911ffe19.npy +04554684-e66739cb1df7e6e92da2064a99bad66a.npy +04554684-a4773b8eac98c358cc9b47ce449d317.npy +03691459-1f929c099da1f3d890824251c0961f3.npy +02691156-b1dfa9a6274688cd29ba25678ec45698.npy +03593526-3dec5904337999561710801cae5dc529.npy +02992529-9e302a3f21a992c0bb579d1d8d989550.npy +04530566-6824763a090a0b2fd942f20c59bd7ad0.npy +02958343-4a6dea7ffa04531cf63ee8a34069b7c5.npy +04090263-60035e734229f5eb19f2faa30e245eec.npy +04379243-cfa823ee81496f5912b57997414c1d71.npy +04379243-66e49590fed26b4b8a6a1538ac23319d.npy +02691156-6b8bd13bb6c2589db61f9d3f64979662.npy +04379243-2d8fd94c6aeb5be2beafccdad931a74a.npy +02958343-5fb19e8ecfe42bd170bc1eaaf2d60138.npy +03001627-cb1986dd3e968310664b3b9b23ddfcbc.npy +02876657-9e274df011a9643c21ec51d5b72ac4e7.npy +04379243-7e15b41158aa0bf73542594e05cedc89.npy +02871439-c91abdb369f0e2a1933ffef19678834.npy +04090263-226917d478be80f3542283b6fc64a8f9.npy +03046257-4b317124cfa511b7e26be0306b963c93.npy +03001627-ad64210b56ed1bbf9096ff01c3d5022b.npy +02958343-5695a98b66b2b9a9c81ddeca50aa3117.npy +03001627-41f3a12d9f29f204dbbc9440457e303e.npy +04379243-3f94c1aa9254356579b3e1be3524f72f.npy +03593526-65bec5b1e02db6573543a074b9dea19b.npy +04256520-4c044b514ab3e0eb6eb9b08c8a74d159.npy +04379243-50e269a6c3f3b558db19fa16d5cba023.npy +04379243-ad41461d3fa9b483f6bf408264db131b.npy +04330267-e55fbacb7ca1262814de2a9aaff52ac7.npy +03691459-eb8f035d56539657f90555a83c8826b.npy +04256520-3d164c442e5788e25c7a30510dbe4e9f.npy +02691156-6cfea839d3dfe358bc0909d98a1ff2b4.npy +02992529-b9f67617cf320c20de4349e5bfa4fedb.npy +04401088-202fd2497d2e85f0dd6c14adedcbd4c3.npy +03001627-2b1af04045c8c823f51f77a6d7299806.npy +02880940-64b180d51c6b8cc1e4e346ee2650d150.npy +03001627-97131916969631a379a212fc9db8be5e.npy +02691156-e16f9cc7dedcacdb9b0435532743fd43.npy +04401088-e4d794e92cd098d740dec81c6722f67f.npy +02933112-7328b4c001a249ca39d3717288022c20.npy +04256520-ce424dd12ccad62575206c207a147264.npy +04379243-5d30db5c8d27e120a653489f44e1bf89.npy +02933112-14e2319299a434b24b8710a3469971b1.npy +03001627-e8dc06c3d01d6592f4b6538438a0b930.npy +04090263-3ed4ce6dee76fc90180d8ddbbbd9bd3b.npy +03001627-37ec57f6376fce6d19fb4103277a6b93.npy +02691156-2d43c1430df8194ace5721ccacba16.npy +02958343-1ef8f98842f2a388a4dbb766064f8bbf.npy +04090263-f21a0e54ed515d344110c565e849308e.npy +02691156-6e66c96067f3c631ce58b9b5a8f9e3b2.npy +02691156-1c93b0eb9c313f5d9a6e43b878d5b335.npy +03691459-481d17e1ab933142b868767ca39f1cf9.npy +03046257-7e6fd9692405db19ae46613afc6454.npy +04379243-ece7f04700c5767a4cbf9a02e3342127.npy +03001627-9e9e6025f821c2bdb6d6d1ff246c4885.npy +04379243-e2f632abcd84c03ae7354dcb6082ee59.npy +03001627-8f0deb6b599006a22cc460e9d064e57d.npy +03928116-b42a05bd28f090b3ebc1a7ae7c4c250d.npy +03691459-9a37a34c652c33d37b46c73cad9e78ec.npy +02933112-3c1f9b42e848c740c59350d819542ec7.npy +04530566-5b1552a30341a3b27ac692756be9e24.npy +03001627-489391452ccb38e4c8687ff9b0b4e4ac.npy +04256520-8ae5acfaf2b115382d19175e7d19b7cb.npy +03636649-fea629edc206a49529fbb534b2045025.npy +04330267-f65123e8c8b2fb93324d4e93d8b9cf3d.npy +04530566-481e13e24905af01ba1e7c529a2559b5.npy +03261776-a501174de50bc9e675bdc2c2f4721bcd.npy +03001627-effb1b260f100f5919fb4103277a6b93.npy +02691156-8ef4637cb349584420c6a28228acb628.npy +02691156-562a94308f7bf09b8aa0062ef5480a6d.npy +03636649-19d4c28ca3da609a5beaf00da5b709c2.npy +02924116-6b8a93184bd984cc8b89799e9a2e578c.npy +02691156-66bdf712963b9a17efe0d4e1eba2e3af.npy +03001627-2abe8d5b5d29ff52f7628281ecb18112.npy +02691156-b74369cf3556cc822fa1bda037a5a7fa.npy +04530566-bb248dedd82b2f28deed0e4a55ad5dd6.npy +04379243-8cd343b3adf5118d7fa29a3ea424473.npy +03691459-acbcfec18a26c4583247f812f2eaa97.npy +03325088-382b1b947fba964dc1def5c6acc12bbc.npy +03001627-5edb33755a80aded3da27ece6ae88fff.npy +04379243-7eac5c3e4a8e4e086e5b9257c4084ca2.npy +03991062-1dcd1b5af8e876185894318693217d52.npy +04379243-788a2ae90158f42af4b6538438a0b930.npy +03001627-b6d43a52bc2eb8504d5af97121b5f.npy +03636649-bde9b62e181cd4694fb315ce917a9ec2.npy +03761084-eda35c1f6db60a9557b6140a0b345e1d.npy +03467517-bd1705d6d87fc81f6505b7589f976309.npy +03046257-a8b354178a8e4bc5a7e57b3c1c645a2a.npy +02958343-a4017ff2cc8b9150f4d6a46019767b57.npy +04090263-8588b43940114af7eab5ee569c9de1b1.npy +04530566-b093af9dabb14b70cfd826dd468a5497.npy +02691156-87348bdeb8bc74139ebd7d1067b13a.npy +04468005-fd47a012475b88815392bb73ff1a60c8.npy +04379243-7d04f5a75055273af9aec59741c69cf7.npy +02933112-643191e8ee56104e424f8f8e828c9ab9.npy +03211117-ccd6958947505b34f9f3c6290096f50f.npy +02828884-66670424b72dc0beefe2ffb03223403f.npy +03325088-1c684a5a113c4536b7a867e9b35a1295.npy +02933112-a4c79586ed938b5ecd81cf227afdf993.npy +03001627-f58ac8ac63d5a52d19fb4103277a6b93.npy +03761084-400d1bc76504769c1d5ccc40b510e4bd.npy +04379243-1f7ae7a902f453b39dd0cb4dfd5b80bc.npy +04099429-1a3ef9b0c9c8ae6244f315d1e2c21ef.npy +03790512-5e4fe8a57130744dece0b0a75f5fc9f6.npy +03001627-a7f911657d2ac259177faed93fef7451.npy +03211117-f6515d1343e25bab8913de0e5cfdcafb.npy +02942699-b92acfcd92408529d863a5ae2bdfd29.npy +04090263-76fb0e79e77923de9932cdadec1db39a.npy +03001627-c8420e434b1680edaf7c7ad2549a1b15.npy +02924116-b6c7700eb147491883b8b9c448a35518.npy +04256520-359e995834270ead614871b18a2b1957.npy +02818832-3d51b8ad6b622c75dd5c7f6e6acea5c1.npy +04256520-4e3f1e4f1fc88029d028c2e338a88f09.npy +03642806-18fdfff5acc4eb28e2720b34eb9e71b9.npy +04379243-f954f8a605974809dafcfea63f0b694f.npy +04379243-2e3e46e427b45207765ee729adbdf968.npy +04530566-8742b1778f2a6e7deb0cc8797c62d3c8.npy +04379243-dc537055864526217d970cb50eca3a9c.npy +04401088-2435be698167b2167120841458f79dbe.npy +04530566-9e4f7b6ed7936401af2bbb4162e3123.npy +04090263-2f9d017b565a274f2a1ecc02c3ced6bc.npy +02871439-ea2a60c496731ab087ef0846c4705cc1.npy +03797390-24b17537bce40695b3207096ecd79542.npy +03207941-21ee412299f40368df0c25a5c4f4cf31.npy +03948459-4c152610b23bc4db9a6e43b878d5b335.npy +04401088-dea7ce7ab01c08dfd4ea3f4c41b1b9bb.npy +02691156-ce12e8c1a5f5ce1df58f507a9f1e3e03.npy +04379243-370e911bb0313e0cdf76e252f60565c3.npy +02876657-5d6b5d1b135b8cf8b7886d94372e3c76.npy +02933112-663c290dd2e02f03e3f8b005c90fbce8.npy +03001627-40acea1827a81a774f7f6d1fb681883b.npy +03691459-21127c6f6f4a28fd4bbad62bb35c0a72.npy +03001627-a32febea4a0ac30171a782a4379556c7.npy +03001627-69735def3b0f009eb098f5649ee97d24.npy +02691156-4ec2aff45e8c495a667f1f26ed74631c.npy +03325088-2781a072e2645ccdedf1aa83ea962bc0.npy +04379243-97610f0edc786956d5cc62720ec8273c.npy +04004475-142a8e6cf56b63b2f31b18e68eb944af.npy +04379243-6ef3a3de6152b19be513a3136ebdf08f.npy +03211117-144ab629198c837eeeb8d422649e5f2b.npy +02958343-891b06955bdd04a7909e2381adbddb4b.npy +04530566-715699f07f8e59a1620e7892e762134.npy +03001627-e76f7d88022a0bf91b17743c18fb63dc.npy +02691156-d4ed7de4aa7799f066cf1b4a8fc3914e.npy +02871439-e1f316c10167d2a54dc4e0eac00a09cf.npy +04379243-5325e56ec7dcfdfb83130614d8020b3.npy +03325088-5940435f40a189a4b362845c6edb57fc.npy +04379243-db247fa7a6d2ae45aff7c08b060f5ed6.npy +04530566-4e3cd4d3b11584dda70cfb3232f40c6.npy +03636649-6b837caba2f63098360a9d5ff73ffdad.npy +03636649-b9a8cb27dbbcdb2a404a436d0f18c82a.npy +03691459-40f8addfc03b2b1e4d0c24eb0094dc21.npy +04401088-4a81237a7fc743763992b1138bb05b3c.npy +02871439-fabbfb00c3d698a8b022c94235bc8601.npy +04090263-de0bb836ad8b5a24fa9286f039319ff7.npy +02992529-98f0a229291ea982d670fbfea4c122db.npy +04379243-cfd0fa8a6d9ee06e6456cc507eb8f5c1.npy +04379243-8b0f94dde4b772d41ca25a4447d3477e.npy +03467517-3492e05bb96d5c8093f0194265a9746c.npy +04379243-37c76d4830a4968b719d8721fec72f0c.npy +03325088-d0c1d926a69a0d186d0157e3e7a8917c.npy +02933112-b261964d7c920a4cd8a45f471fe2ac0.npy +03710193-12839e81e67dfa88bc41bf82aa0f2714.npy +04530566-4b501c73f3cb02c63438e17bc657daf1.npy +02691156-bd91c1eca592312048464d2edba1bcf0.npy +03467517-8f4b1f242bc014b88fdda65f2c9bf85.npy +02691156-fe00bf68a2cd32b6dd455eb19d4d269e.npy +02958343-f8dc466677c26ac6f63ee8a34069b7c5.npy +04256520-8cba819b9a56da95b91b871e750ca615.npy +04460130-2af6c073f8b0ece92030f08aa0abc03e.npy +02691156-36a5bd4ca6a0b191532d23702363f9a5.npy +03001627-717e28c855c935c94d2d89cc1fd36fca.npy +04379243-d8c35b0ed66cfafa426c7177f78cd656.npy +02691156-6ce399fe42d54815e4406b3bf37e6ffe.npy +03001627-e1791ff04ab8348fdb63e6ea2fd66753.npy +02924116-b5fd5589a7e2b45a550f48125b5f584e.npy +03001627-18fd8342fa5d1d4f5268b70948af88b2.npy +03001627-40e6fb27aeb9c9ab44f999802029a79a.npy +03467517-2028861c76471591c64d0082475b0472.npy +04401088-d51e5d7eae216c9ef1cb19f636b1c2bd.npy +04256520-1d8716f741424998f29666f384be6c43.npy +03325088-1db4071178f5818250da8b99982a3057.npy +04256520-340daf71c78f53ac593ebeeedbff73b.npy +02958343-2254e63f695a1cccbbae182929bb7dd.npy +03001627-4acc9de888c0a73dca6910e4922d61aa.npy +04401088-57056c8f465dd1aec03bc4569d70377c.npy +03624134-4e0f2c48c02815e3f461fcc2f3999efc.npy +03928116-8edcb709ebd1d09e5f3d43a486973313.npy +04530566-b1a080228ad8a7c6eb2c303a0e0d287b.npy +02958343-998aaaf6624deca41548d161b5bc02.npy +03001627-aac5882aff90763affa93170c5cc3d58.npy +02942699-935fc76352a4d5fd72a90fe1ba02202a.npy +03593526-3c70ecd8d8c92f7b2ff65fa033da81db.npy +03636649-33b77c66e1f849b790c4e2a44fddf755.npy +02808440-816cad16553dbb004f2d909c705c7509.npy +04379243-868d86e47bcf7c9d1dd03d3141d85a03.npy +04530566-50ec883d9c1f715614edc3c9b2489f4.npy +02958343-a262c2044977b6eb52ab7aae4be20d81.npy +03001627-3b5364e2f1624ef992979c651b40698c.npy +03001627-d30e58a2361785683fb0851e9bc87551.npy +03691459-77c70fcd8ebcfbd4c83db093c68b1d7b.npy +03001627-c9f5c127b44d0538cb340854b82a069f.npy +03001627-1be0108997e6aba5349bb1cbbf9a4206.npy +03991062-6f4d7b8e06df314531b606c8e4dc32d4.npy +02691156-5e6c986605a2817ed4837a4534bf020b.npy +02691156-103c9e43cdf6501c62b600da24e0965.npy +04468005-1d4be24ba28946152470de2774d6099.npy +03211117-ff512c4ebd3f9e27f08984f51debc075.npy +02828884-2c6c50ead2551d51a0e159a720dabf7.npy +04379243-ef29c3dcc28f4e314785a5d3b6c47521.npy +04530566-43ff0403af233774a245ccf922912805.npy +04256520-227a9255c15c267aa5c25aecef10278f.npy +03928116-e6545f30f7bb6e2115426084cee9d242.npy +03211117-a990477e9c1bcaf4a70518e25ed617a7.npy +03001627-5b9ebc70e9a79b69c77d45d65dc3714.npy +02876657-2d1aa4e124c0dd5bf937e5c6aa3f9597.npy +03691459-792be08647d7e0fdd4221fb0ed444ec0.npy +03046257-b0251e1b5ca130eb50dfe5d3d82f3d77.npy +02808440-673e5bae900225783956bf2322987dd4.npy +04401088-933d5c217d9c01789daa2bf0c68f794f.npy +02924116-f9c9cb740629615426479a182158bae5.npy +03046257-b756ddadd752021b4a9073afd3cb57c.npy +02691156-4bae467a3dad502b90b1d6deb98feec6.npy +02924116-f2e8854ee4d0c7bdb55c3d293b3b9a94.npy +03001627-825bd436471f47457ef29b55d8edde64.npy +02691156-ff7c22a964a5a54e3bb4b8f3758b3c41.npy +02958343-e3b306ad8f7297817a81f08639c57244.npy +02691156-60b5f5da40e0dd33579f6385fdd4245b.npy +03001627-6189b30ed01f7bfa5692a9640d6947fc.npy +04379243-680a106cb0098e7fa71c812e027f94d9.npy +03001627-efc684ff4dc6ff49ccd42a2d6eea63ed.npy +04379243-7813370035ee02eee0c5923879d79f21.npy +04379243-809af89dca17068ea0ab1d82ef09f78f.npy +04379243-e921675e5dddf58b30477f27f55db318.npy +04379243-bce02d42bfab37b2f4f06a8cc0f0315.npy +03691459-fb86950be1b0ced7760a6b24be218cf3.npy +02691156-ea06bef342fbfd4236f3a2343a8221f2.npy +04090263-c92c0ddb2c729589b6dee66cb1bf8e00.npy +04379243-de205371514307babc2e0a60f47fe031.npy +04379243-981f5f50bd8821e8d935bb36a3b0560c.npy +04379243-5b2c4198bb1be0373704a45f4027ebcb.npy +02808440-b425065d760552afb362845c6edb57fc.npy +02958343-17bf28a8d9b5a7ccb5e3401710af905a.npy +04530566-6a43eb690d0157bddeadc9ca0263db5a.npy +03211117-3b188e87ba5f109e377cf79903309074.npy +04090263-42c6d1184ae147ce6e00f130b3bd101c.npy +02933112-3ba62bcd5394d5504c62bee40dcdc539.npy +02958343-900c32b154c0dced994a3466f8481f8a.npy +02691156-e50f001069380884b87697d3904b168b.npy +02876657-3d295fccf7d4e4dfd317c475f024f3b8.npy +02992529-338c3f116cd39022a40276c99b77cde3.npy +03207941-b66bf349bacc035437b2bb75885cfc44.npy +03948459-94d1e4013b9713ecb97b7b911836b479.npy +03001627-1c199ef7e43188887215a1e3ffbff428.npy +02933112-86d1c6a6a2278e7e1b17743c18fb63dc.npy +03691459-40511e6769c91cbcd3dbdb797d2f78b5.npy +02691156-c1260a89eee28413f2acf00738ce9d0d.npy +04090263-9ed0aa906ffae0c26bcd32c43682e841.npy +02958343-10fda5aa525f6232be8100817bfe3c8a.npy +02958343-a9876012922192273a8cad69dd295a56.npy +04379243-cdb13917ddd5fec6f712b42a5a217e5e.npy +02691156-40a828b10b1b092bd208f79049825a82.npy +04256520-7c8dfc67f9d03d02bddaa551be7f3f7d.npy +04256520-1c912a8597962f1514038d588fd1342f.npy +02691156-89f21747e6403735d9e1375411b582e.npy +03001627-77cf4ff8297014faa6fee8e2140acec9.npy +03624134-73dd7fb60dd52b85ed4efc1a1dc582cb.npy +02876657-27b9f07da9217c89ef026123226f5519.npy +02691156-f8fa93d7b17fe6126bded4fd00661977.npy +04090263-d47fb169bef4420bc4e8ec0d6d668411.npy +04090263-18e5827d2cfafd05d735fa1ab17311ec.npy +03761084-81e961930e6ee5fd843f813f752a5e35.npy +03001627-68fab23a050707213436bcb4a3bd19ad.npy +02958343-b5367bf3cb07b8ea593fee7ac9114e04.npy +03211117-4ee9c39b1f77a29a9d5e963395eec7e9.npy +04379243-86e6ef5ae3420e95963080fd7249126d.npy +04256520-5c54937316aaac98c563fcc2752ece39.npy +04379243-40b9f144ea6f35659928e3bfce70611d.npy +03001627-b1d4d7c5aa13b0642a3f8f484e6c5c4f.npy +02958343-72f6c3c3078ef567dfb1ee6a4b12bf8.npy +02946921-ace554442d7d530830612f5c0ef21eb8.npy +02691156-6f72a0d86494b551a834b9c8bfc8647a.npy +04256520-a0646924dec3b2c97348ac642586ce23.npy +03797390-6661c0b9b9b8450c4ee002d643e7b29e.npy +02828884-69ab287543b3a04a7e3b0132a2f87650.npy +04379243-5c6748b094725d9af008d8a3590fb522.npy +04379243-3279edef6a631940ea41b93204b74265.npy +02691156-66ae19841350ac2d4ba2821676102936.npy +04379243-f577193ba408f5eba71c812e027f94d9.npy +03325088-19fe41f0a0b6bee2979c556124bee033.npy +04090263-c4a5c40e5fcd1727a2bf3fdefce3fd4f.npy +04256520-90aa5fb0cac28bfbf91663a74ccd2338.npy +03046257-ea7d8d3f6b660e8f9f1a71e46bbde97c.npy +03642806-3dc60bce3e8d3ece3077dad41839c251.npy +03691459-3490844946e68402e47833b310955a9f.npy +02818832-d52149ba05e9efbfd54014b91baf8631.npy +04379243-1ea28bffca73c3d44b8710a3469971b1.npy +02958343-e4886a4d0c6ea960fe21694bd5f519d1.npy +04379243-b2aee339ca0dfe94de1b0b03ca051f02.npy +02691156-c58e9f5593a26f75e607cb6cb5eb37ba.npy +02828884-8d4693c04d684e61a3430e4fb40c91fe.npy +02958343-68b62b9b9d49f262b12ea83455b0f44.npy +03001627-ed948a3d2ece4b3b71a782a4379556c7.npy +03001627-7e5a6a86dc490f7e7288e3849fb636ff.npy +03790512-4a2f0b20ef680347395d58407f193ba.npy +03790512-f1693f82a326cb8afe11eeaa72c8aa36.npy +03001627-1f3336163f11015c1a7069a11c22548c.npy +03001627-3469b7f0709ed90ac681404257d94ad9.npy +04330267-9a5ece8646e88468877a6b14ac3aa8fd.npy +02691156-9c916b72d9f9f93b9f2700a6b7be99ac.npy +03001627-511c6fc6d3881b4ae43df8c9a38bf11b.npy +03593526-947cf0b19783a119154dddaf2978e13f.npy +02691156-96168894d7331c75acf77e718d93f3e1.npy +03001627-2a5abe261ad074f1c6fca4cd59d9149.npy +02871439-9cef7572697b44ede98e4da245e0b83.npy +03001627-19f597c6dbff03c114038d588fd1342f.npy +03593526-a317ac0956d4e885535deb3b0c692a2a.npy +04256520-b337556f36a5e1bb9a2041f674671d05.npy +02691156-fb68077d405c233ef879f4163a3ec7b.npy +03001627-1d1b37ce6d72d7855096c0dd2594842a.npy +04379243-b1a1d78a2736dc2755f46d55537192b6.npy +04379243-33b9bc49338800e87dd2ad68f72eb830.npy +04256520-c9241b6f755e7134f564f8e3eeb8449e.npy +04256520-b6cbabb92f1d0965de85c11d95003a6a.npy +02808440-3ffffa5a05b2254d4ee769ccec97aa83.npy +03046257-4af34d709f39ab8e76460fd7f97d7f44.npy +04379243-e69dd1a9bbeb62523002761e7a3ba3bd.npy +02958343-e20b8a9c388eeb012c8b6ee41d7d5d62.npy +02958343-2961e679a651dd5ad95ed6bb7181c98f.npy +04468005-d985e5c98e8a97989954eae9164faecb.npy +04379243-acbc99e153b9d4d419fb4103277a6b93.npy +02691156-c1b5dc92221bcdad5fc84bf2b9ef981.npy +03001627-3d390c6f1051295d9501f2fa226917d0.npy +04530566-6c687a500aff678ad83f267e8f0b536.npy +04379243-4d3cc502d4444c848cbb8bac2032149c.npy +04530566-98a9c16aa2c6030f7d962e3e9892f8dc.npy +03001627-179b88264e7f96468b442b160bcfb7fd.npy +03001627-c5958d1f079b0be47b8e25a5db8c2573.npy +02691156-19e2864af4f6de438050e8e370967931.npy +04379243-61cb695902f7905e7afed106527393f6.npy +03636649-6af800e7bbdc5f21735ea0e092a805a.npy +02933112-e16c0191973a25f02d63c890dc92b5.npy +02691156-e3de366a0cfb59ed38294c37c250d7cd.npy +04379243-e08d1cd0dc7dc73db9d7c2fc41e80228.npy +04090263-cd6cbd60e8f7cbcbe378cd9d51dc5be0.npy +02691156-bf93f4dc64eff22b4d4cb1c2a5e48b7a.npy +03467517-b35e8f73d68885059e25703eed62525b.npy +04379243-b0d7e13b20b190afaf1a814fb0f45a9.npy +03001627-9281f52d6c5908987ca6caab209ed3be.npy +04530566-99b36b2d2174f061ff8f632f1c753803.npy +02933112-9a2c9e5bda713668674056261e8e6523.npy +04401088-2fe4f1ea84cf924ea4d4dcdfc6fd3059.npy +03001627-4566839a362c5c223ec13b32c4d64f06.npy +02828884-10a66ce0a6b469d3b2cb19fcedc32ddd.npy +03001627-1d7fdf837564523dc89a28b5e6678e0.npy +02958343-ce63abf6d78ea5bf4f39b2731f699e34.npy +02958343-b8cee2711b84bebb425b2c354eccabaf.npy +04256520-ba5cc31429d4c97479c67f086ffdd34.npy +03513137-d25312c53aa9ded3b57cb9238c4c8e81.npy +02808440-259a1fec7969d3e3501f3c19b1676682.npy +02691156-52ef4ccb24accbb295673ce3194af95e.npy +02876657-ab6792cddc7c4c83afbf338b16b43f53.npy +03001627-ec9f1fc13f2e4ae2c3bd24f986301745.npy +03211117-a6fe1a137c076e51d404da78b2c36d5d.npy +04468005-d76e81f2dfc3ad9162c75ca00b8927f2.npy +03790512-e792c49e0e4b2872d83cd5d7c4553c91.npy +02691156-8c6ab402ad29ff5c3b9dffcb3e0245d9.npy +02691156-47e48c70040beb9c8db97d9bc169245.npy +04379243-41264bc3d705a6c1cea003eff0268278.npy +03001627-8f226d6b3089d3b7bca860dd9b04c52c.npy +02828884-e31212e9f9f5888effd5817f210f277d.npy +02924116-eb5b4205ad06d6a17dca29b91e24dff2.npy +02691156-b481294a2692419cba5f6626ebfdf87f.npy +04379243-1a9bb6a5cf448d75e6fd255f2d77a585.npy +04379243-328e8b5e3419c66c493f7199d76f57a.npy +02808440-450fa1bb2cc0ee578c0a569dc2eaa6c1.npy +04090263-8872698c6eae3a8ffb8c26d5226415eb.npy +04530566-34b77143d6313e3f717ad2ef4c4af2e5.npy +02958343-2faff2861e87020a4d9558e8f1b57178.npy +03636649-e15960ae59486c464ccb9dd377d00737.npy +03001627-2276d36a40335c19215045784774049.npy +02946921-fcd14e7ad72bfa70471c65fdb52b88b2.npy +03207941-77ddd857eb3c1460121859336e292a5d.npy +03001627-5af36cc3a98642019fb4103277a6b93.npy +04401088-467ab7ee9487525b13e4f8e4c4578272.npy +04401088-61424998613d67b75ef3453134070b3.npy +02691156-b3066d613364710797020a1f4453e3a4.npy +02958343-85d04dc3f455bc56ceb5044e1e1e9739.npy +02992529-bf259988d2e8728c391790b8b8084f0a.npy +04256520-c53ec0141303c1eb4508add1163b4513.npy +03513137-57ffd28975abba38480514d7f2edc0a3.npy +03001627-557542994c02cffce83221ad0d21775.npy +03642806-b14ceb94c7930ee55054cc2bc9eccddf.npy +03636649-9b7d490678f2c9db3d2be70e06ed6b30.npy +04530566-49075ee8db9d66538d1140748efc85ed.npy +04379243-40b55c0578228337f521e1d72c94993.npy +02924116-1ca19240b42fd2f049d40c74f2720fb1.npy +04530566-d3de6c76e6d96f7fc5fc3eafa9cdfb3f.npy +03467517-6ad792f9321dfb82aa0c867d5b070a5d.npy +02691156-d64caea6c332861bcc14f1e6f4f4f49b.npy +03001627-6e21df8cb8db3819899718fd4553951.npy +03593526-4d392c12240cfe352150a45ec52bcbd7.npy +03001627-a919152f07e9e0d0fdef1c01cbd4ae0c.npy +04379243-c083552372e71f9c7ee217c21e683487.npy +04090263-2b44f7b45ac72b24683e3750b53385d5.npy +03001627-7e097351b98060b8a8dad913bb47fe00.npy +03001627-3ae2857e04641093b0957d845ac33749.npy +04401088-6b9cd9c72e69fb81d8630b8390e34e0d.npy +03636649-f530508e27911aadabd4ed5db7667131.npy +03001627-4f467dcef4a710a5911016bc0ad99a16.npy +03636649-b8350fcf08ff0b2ca950bf8f33cff658.npy +03636649-d378c508566d68cb48d2aef7552b65e3.npy +03325088-83c9c0a13e3bb6c76c18e71fd49c4dc.npy +03691459-18abbf4da8320e69438aef443c33bffd.npy +02691156-32a547e29d66132110b2a26d47842033.npy +04379243-28912046d42946df7db48c721db3fba4.npy +02691156-ded529516b4362c9f019a51d1a3b2e07.npy +02933112-7a9feaea9793b570fc9d1bd1b5b90d13.npy +03593526-79a582343eece9c645c7a8e7c70da8b1.npy +04530566-f7f62b9657aecbe77f00b68989ad3ebc.npy +04256520-9a1b39f920863964b3c42e318f3affc.npy +03636649-aa5ebe13f6d51761d197f67767b32741.npy +04256520-dbbf72729fafaf3737f67f4322e8d3d0.npy +04379243-d7da105cbde6ad8ad027f5769c5504b9.npy +04090263-509f0edd2fd65d5e213f0776ba8707b3.npy +02958343-3a48188e012364f8921cb81cb1632a5e.npy +03001627-74c06950e3f8d25157f40ff86fe708ff.npy +03001627-2592e69aaa2344292463e74275a0e3c.npy +03001627-cc1b4eb1a9164e04f06885bd08de3f64.npy +04379243-9e99421220d92f1da8699b6183baa203.npy +04379243-f00992135ebf50a9339797c21e8801b1.npy +03691459-c3733b26c3fa23ce2633ff66beb9cf31.npy +04530566-1a2b1863733c2ca65e26ee427f1e5a4c.npy +03001627-98e1936d3f25389bc3c6a889ee0bd115.npy +02992529-8da5c29d14a1003d23247d005da93d43.npy +03593526-ffc7e98720e71017b3878cedd8c8fe6c.npy +04530566-9ac6483c969f1120b05dfc874f00d5f3.npy +02958343-99c2ddb7e6169412cb9ff477a2867fc.npy +04379243-765d6e5ebce3fe25aa11adad6b2a69c.npy +02924116-a3601225009a1f63481aa8b5531c68a9.npy +02691156-4ad92be763c2ded8fca1f1143bb6bc17.npy +03001627-7aabc57856fc6659597976c675750537.npy +04379243-fcc5717aca6a3be188bda5f1df0be8.npy +02958343-1f167c74bca9ec83622a8f038ee88042.npy +04256520-8ed3fa69c808741a42e1bb4fe264125f.npy +04379243-c68407d2f752ae71ab2bcc3443271151.npy +02958343-3ea2b72ba08a2e8097df6383472cc5b6.npy +02933112-be4c2bb409fb8374b5f72e2923ab992.npy +04090263-6aaca4e199c1f84f1087ca95a9795303.npy +04004475-4c7a10fb9bf4905d983ec12a2b33f18b.npy +02828884-48f517497df57a2c2056b4bd5d870b47.npy +04379243-940dc92bda153346eaf14273fa406ffc.npy +04256520-de4e483a1587da9fdb24ee630144f57f.npy +04379243-83e669596e491dfe20070923ea969bd1.npy +04379243-35f7655867f9223d82db9fca4b68095.npy +02958343-83098846c82db490a00a2bd11cd80551.npy +02871439-b7b5978bbb72747f9a2615537bdd5695.npy +04379243-2fe5bbb0df6925d1f12d7184a2ad3430.npy +04379243-1db1bfaa8eca186e9295484d295fcc9.npy +03001627-2de10784fa2655d6ad01ec966c80ac91.npy +04530566-573c69987f0508d210572d5e96d039f0.npy +02958343-4a423ae9a28afe3588cf40718544e7cc.npy +03001627-4f24a67f85e71e144719088c8e42c6ab.npy +04256520-55e0dfba8cc226871b17743c18fb63dc.npy +02747177-af7a781f08fdd4481faebbdea6bd9be.npy +02924116-8df1feb988e51609db7aa9f86faf9bd0.npy +02691156-802cbaaf1a51cf38c863ab010b80d9ed.npy +04379243-fe0a8440aef8f597a6656391f7752a4d.npy +04090263-c42ca534ab455a778625e5523ac2ce12.npy +02992529-2c03ac9bbb3d918411f02c4c36ed7f25.npy +03211117-19a4584a4d29778a78585e33b915d9a5.npy +02691156-f24daae76836e249f0878b58b4e887bf.npy +04530566-cf254a334ba1af0aaf96425967f2d458.npy +03001627-516c4adba7205cb43e9bdff70754d92c.npy +02691156-48c4e5e2c2dfccc7a68efacd2d601104.npy +03636649-4aee1567027d9dd14357a62465045ec4.npy +04379243-bdb5a2a25223d1b645613f5c2df1029a.npy +02691156-69d7ae2143c2a2709c6df67fce5fa25a.npy +02946921-788094fbf1a523f768104c9df46104ca.npy +03001627-18e5d3054fba58bf6e30a0dcfb43d654.npy +04256520-1670f9ce4de8a548d08f8c5dee475682.npy +03928116-c554d50fe22d9fc57e8f7075286950f9.npy +02958343-f044724a6fb07ec73b294ac02412e874.npy +04379243-1671665cd0e2ce05660aaee3010d2fe2.npy +04256520-ca6a71e5ad6e8964ad33b69f9597739.npy +03467517-4b0c7381c4f2c5bacc34b900bb2492e.npy +02958343-a4d535e1b1d3c153ff23af07d9064736.npy +03001627-70a2b281cd8d59a52d19175e7d19b7cb.npy +02933112-3106e06eb594238c59350d819542ec7.npy +02828884-2731687dd460a263d8eae9bce48bbeed.npy +03001627-632bc741220bd52e51c4deb11af7079e.npy +03001627-d528a94f72c994f3e8e5fd5b1798c97.npy +03636649-69762de7892483b64fa8d6439169bda4.npy +04401088-b490aed1d7d9a42ec4e2c9b051d6a014.npy +04530566-6367d10f3cb043e1cdcba7385a96c2c8.npy +03001627-66a36dfe1cfd2d17b40f0ac0fb9a650d.npy +02691156-61fe19a62a786c96950d2b3eef73a70e.npy +02958343-491653e537f1a701697b84068abf146c.npy +03797390-8aed972ea2b4a9019c3814eae0b8d399.npy +02958343-e337e9940356e866b82298c7ee2fcc7.npy +02958343-5389c96e84e9e0582b1e8dc2f1faa8cb.npy +04468005-5dd69dea0b94b9abb216fb38ac0eb009.npy +04379243-726ffd1d94bf5c0558df8eeaf3dad1c.npy +03636649-50f14b490f3f4589f51f77a6d7299806.npy +04379243-fc9910fa6262cd4e1125c64abbb51ddf.npy +04090263-791efe6841d0995a1d9b004d9d8d2781.npy +04468005-40fcd2ccc96b3fbd041917556492646.npy +03001627-c043285da4600e168a5e49d8f4867e8f.npy +04090263-3238588ed960920c400c7ace1cfd742a.npy +03691459-b8b54d43aabf84a67aec59a4d1722658.npy +03325088-7ade4c8d7724e56b76d20e73c57c9a03.npy +04401088-d050f7389538de04ae0591d02e40f07b.npy +03046257-b750e23ba662cb4fe0865a0bf86de287.npy +03001627-9b8f69874b502bc2742728b30848ed03.npy +04379243-ffe4383cff6d000a3628187d1bb97b92.npy +03636649-b2ed0a4a8caa5139295966c2452536a6.npy +03046257-a1a8a811f5260ae675aa7f24a9b6003a.npy +03001627-9e19e66686ed019f811a574d57de824a.npy +03636649-e9f83f1d54e959bd35836c728d324152.npy +04090263-f8a772a405e76adcf02ee453ff283e26.npy +04379243-8c0999396ba60e758738e7290b6f3237.npy +02958343-7f0f750d6ca959b6ac5eab1f4e9b0f1a.npy +02958343-ac85727971fe63dd2c67ef33d7521ade.npy +03691459-b8410a2c19a50aa88b04a17db360913.npy +02958343-4dad98955a47e81a8b3877a62f2cbe1d.npy +04379243-e8599df1d0465e3811f3906fc1b00350.npy +04554684-6bb2e6f20f189167d48855885373053b.npy +03001627-d2a48ffb6d25f88dfb0eb7e753c06942.npy +03467517-71139bd2ff6c4257280ec2e5049bb369.npy +04256520-8ce7a3ce304220257c071b4859b99983.npy +04379243-98feac40e78b92bda1fe796dee2910f3.npy +02924116-1b8d1c5d1b463a23193d7855ecfc1bd3.npy +03001627-dae8b3ac69d80cf1b94e60a139ac4b1c.npy +03636649-a8d6e75a7d2712f3fcb8d8c6d4df8143.npy +02691156-3e4b522e38ef9a781b5928ecfc4b0684.npy +02691156-4204361e3781952a8e951223a21e1fc1.npy +03046257-78b20642a66f421630cd51d117004d92.npy +03001627-3421ad5a45b85f7a4b3c42e318f3affc.npy +04401088-27f7ab052f3fce42b35f223cefd97829.npy +04379243-48baef3ab18d2d43d2afe8d5254a0d04.npy +02691156-5f6b6f649b419cea71f4784575c35350.npy +02691156-8fe406a829c40c933b353a5057e248f5.npy +03046257-c422e03b825d5e0046043f7519b6b4c7.npy +03467517-6a2e66511506a517a716de2121565fe.npy +04256520-c29c56fe616c0986e7e684d25d4dcaf0.npy +02691156-5454ef3f1e0367f38f92ff0dbc52d7eb.npy +04256520-1908750cd67208e0c4f370f57df9b202.npy +03642806-11654b536fd6ed67616b0fada7303ece.npy +02992529-16ac60220ed738901cfeae953cc2339d.npy +04379243-2563d1fd68ae9d77ac803318d4b3b4b2.npy +03790512-74a3df7e06713f4a48272812609617e2.npy +04256520-304db04f545f53b021bdbc0445d9f748.npy +02828884-bbdc34eb50c32ff7c6e70747a64ccaed.npy +02958343-7240a21ee34bef83dd141480e2c154d3.npy +04379243-d256323d2b756b9e76bc197b3a3ffc0.npy +04090263-8bf221c8f17b152b2607a47034bf62a6.npy +04090263-4faa63f17be98cbf1389e18ca61056d3.npy +02958343-d9e58ec3ad748aae2051f6248df99d19.npy +04379243-d94de64641651a2079b3e1be3524f72f.npy +03001627-d324baae6630d7c8fb60456da917147.npy +04530566-37ea55e2d023f9ae9588e71e21de9f30.npy +02691156-32fb1aca48b3a0d197eae247c9b1df47.npy +04379243-fcd4d0e1777f4841dcfcef693e7ec696.npy +02958343-cd67376cac9f989151008e496c6cfd2e.npy +04330267-f490138e211ad6e9c3c11bfa5a6c7ac9.npy +02958343-c6b98edfbb65320654b49557f8ea8b42.npy +03211117-be89d32290b9dd4aba27b59766aaedd9.npy +03337140-474fb0ff79e036b0820018801b237b3d.npy +02828884-639dd737961f1806985ef0bf52b97bf5.npy +03001627-d015bbb45833955537b2bb75885cfc44.npy +03691459-7317a113f9999e28824aa039bc530c36.npy +03797390-15bd6225c209a8e3654b0ce7754570c8.npy +02808440-1acfdd86f8d48bb19750530d0552b23.npy +03001627-834fe65aac9ea9bce589b08489d157d.npy +02958343-56b6c950f4c5de80ce27281f3b76d1f5.npy +04379243-3dafd09d21c9ca607d55378e40c7c3d9.npy +03691459-3575177296452c98f149a4641e0b7067.npy +02691156-efbf3d4c8877e7dc7ce8c809505eca2f.npy +02924116-f4e25d681ad736eb52470de2774d6099.npy +02876657-44dae93d7b7701e1eb986aac871fa4e5.npy +02958343-3c1ecfc2dc88c1919214bcda3ade39f4.npy +04379243-6571fbfba919ac76eca66eeb3eb4982e.npy +03211117-f3ab112671b02010be54ae8147665701.npy +03337140-84e7061f807f8f7e91c352d02061b3f7.npy +03467517-5e452914684ea7fc398707f20de9db08.npy +04379243-11f1101ba2e29206cc963bba1556032a.npy +02828884-9897a75c64a369d458c73770090b865.npy +04379243-49dfb00ce7ed1602b05fbbe21a0097ea.npy +04256520-983f0b9bf020010159f8e31ca87c470e.npy +03691459-3e21834bd08c078963de47aaa413f122.npy +02818832-9249fe17635540b594ad6c58a4781766.npy +04530566-849c8b9c0acc91b6ed4404549c4013f5.npy +03636649-d73b4313372ca6e1a6a7b6e78d8d5bcb.npy +02828884-e01c283efd6a0d2120d53ceb96ec7d24.npy +02958343-2ba7ea78b9b6e2a6b420256a03f575c0.npy +04530566-9e653d3b0b8f8c6b28f998b2aa4c5983.npy +04379243-c3134ae6fd6691d7db039d8689a74349.npy +04379243-e6bc7735ed67822e60a09749bdad79a6.npy +03001627-3276361e9e651238ac4ed5495364a497.npy +03761084-87bae84777fe8b702bac1bcdfc2402d2.npy +03636649-d6db6a800c1ac87bcd783766d090e665.npy +04379243-e36e90c1db6bf1d5470412e9b69c8933.npy +03691459-c7d423c4d63ae4dfa5bf0df4639be0b0.npy +02808440-62f4114f43f07786b362845c6edb57fc.npy +03001627-badfcd24d9b640fdf74aae127b28c047.npy +04090263-99001b28e4fc6bdcfa9984f75a870c1c.npy +03759954-5889d83902a9c2c478a2ccf0e4d84b2.npy +03001627-9f8708db66a4ff07f4b6538438a0b930.npy +03624134-171c19d5205fb3291fc43d5b32fa230f.npy +02958343-1166b049a7230db9f50f5d46dfed0533.npy +02843684-45c547298f85241b959ad2f80f4dbcca.npy +03001627-cbaca6a6edfa2d512b520984c067934c.npy +02828884-ba58fdaae9a5520b421b60451f2f74f3.npy +02992529-68b80d0086322ea33615136d92a66ba2.npy +03001627-7b5b032a2cddeebc54d7082b34825ef0.npy +03467517-ef1c22bd3b74953689f0379846507dd3.npy +02828884-5d88fc00adb325e6f3a134eb65b35f7a.npy +04074963-7852a457e59fd546d26c2593d1870bdb.npy +03046257-5e10ee8a39ff0e519f1a71e46bbde97c.npy +02691156-136c2b868c5326dbba5db366aa3ac475.npy +02871439-1d3014ad5c35944f9af68b4b3261e1f8.npy +03761084-4ab6c77bf27d4c86b8776ad71dcaa161.npy +04379243-a145bba4e4409bcac905813b9803ef0d.npy +03624134-b8fe56eeed3951392f98be9d5bb04d17.npy +04379243-614f1c6f5e0d2372ef5f18853edea926.npy +02933112-975884e7d9cb74ff39974e6e2bbe1adb.npy +04256520-8c69c0bafdf91e85c05575120a46cd3b.npy +02933112-9b34b5983bd64409e08dea88cca8641e.npy +03001627-e3b625f979f3a32fb591e8fb800990fa.npy +03642806-7df09674bc991904c78df40cf2e9097a.npy +02958343-7c72e179b251171d4d1780ed2b3fe073.npy +02880940-b195dbe537993945e4e346ee2650d150.npy +04256520-a409a2548e7cdac7febad4f49b26ec52.npy +03624134-c1ab7029de67351cf97a65c35ea619f0.npy +03467517-d685415d4fcd3205a24eeca91f583600.npy +04401088-c3c5fd4ce226ab0c4694b8455e89054.npy +04379243-ac965c2d5c68551be6c5cd45aa112726.npy +03636649-a5423069e30181a019655a581ade300e.npy +04379243-2cdbe6c91dbe4fbabc7589eefbdbc3c5.npy +02691156-d0ab3ed71a4ac9319d1eb836604648db.npy +04530566-feaf5c41e664348220dfe072b77502f8.npy +04256520-75f69b9fc22c4c04eaf288f952624966.npy +04379243-7dfa5642ccc2b8fe5e2a5c16927ff414.npy +04256520-4264fffd38596e3a60f888b4e2fd3e4.npy +04530566-ac5dad64a080899bba2dc6b0ec935a93.npy +02958343-906e2e532b7156b612be63c74304797c.npy +03001627-323f0787810ef9a285a030bdc6cb9884.npy +02958343-ee975a7e62edc7996a2345809e2bb169.npy +02871439-b6264b92d0cbd598d5919aa833abb5a.npy +04256520-c88d26d20803d385e8f8c11a24c52ebb.npy +02871439-f6c0d095a49f5880fe1a61f05bc63860.npy +04530566-e3206eef4da407e7c08fee43ebed0bfa.npy +03046257-c74cef5d18061c5b5dc7f4502a6f8c8f.npy +04379243-eff2f84104e78435d6f4cef762589739.npy +04379243-bfab799cd63b345e232dbd6edd2fe625.npy +02828884-338fc00ee5b182181faebbdea6bd9be.npy +04090263-75008b972144b426b8eced526ddc241c.npy +03001627-18f2f833d95ad137111c729c2fe5f751.npy +03797390-645b0e2ef3b95979204df312eabf367f.npy +02828884-a1276733811a864b99cb1d062b75ee73.npy +04256520-c5380b779c689a919201f2703b45dd7.npy +03001627-c0689f191df5cfe1c785f06f424b9d06.npy +02958343-23bfcd49917919006a34aa94ca8a3355.npy +04379243-aea8be27a9e5dcec1158f00955d38a.npy +03001627-331ddb6fd9c333456cbf78e1e89022.npy +02818832-ac97ffc6b6ef238382c3b56998e08a4c.npy +02924116-60c830af5fed1ca5193d7855ecfc1bd3.npy +04379243-c2a33328b7df204e1754bd6e58ab2748.npy +03991062-3f7d866f4e28e8014b3c42e318f3affc.npy +03001627-4300fb717f89c832d42ec7e303174a87.npy +04554684-5f8991a5039ca4385c8adc541f88498.npy +04401088-71240556952395e0925bda4660525f97.npy +04256520-23e7767edf2f861e58c75a3520cc91a3.npy +02828884-9663627be99d2e27d2b12aa6a0f050b3.npy +02828884-fd2394a5f4d05d4c331bc7630c8705e8.npy +03948459-2137b954f778282ac24d00518a3dd6ec.npy +02828884-f3db005b33b9f8916cd47ea628d8cef0.npy +04379243-c86d75f3408c7ab5a6b3538efbf4faad.npy +04379243-b52f6dd58875030ead5067eac75a07f7.npy +04379243-51149acaab6049d05938488ff499d96a.npy +04401088-dca3f5a8ab0b850c8c8e7e9e3310fb01.npy +03691459-f0d27525fa81798d982acd4b5c0a58b0.npy +03593526-ed3c75975804636e34a8988fdcee4fde.npy +03001627-f9c4baf01dbe6c488616812464c86290.npy +02691156-256626ea73837e032625b83fa7422e2b.npy +04256520-b64277db98afae7f8efae927921987d4.npy +03691459-2dc57057c96ae0f74c24a2a9e289662d.npy +02992529-ef2b505068cf120efe48f52a0ccc160d.npy +03593526-3304e9400b2d610a69eaff4d4a8a103.npy +04379243-cced836d07325938f51f77a6d7299806.npy +04090263-511dbae3805dad80ab5938f464bbb85a.npy +03636649-f673fc77f397a061d49b2e04785f8492.npy +04379243-bcdf93ab467bd7d84fb315ce917a9ec2.npy +04530566-4f8e847d3453f2f17301f2b895d332ac.npy +02828884-7e8caf5bf2eb1a61ecaa3c66b0328b42.npy +04379243-2ef28aca6afaff1d88863f114bcd9f80.npy +02871439-ec882f5717b0f405b2bf4f773fe0e622.npy +03790512-22ae98e613bb8e188249f134aca4c817.npy +04530566-ec8d021a7d3816f2e46fe97e5f3e2c98.npy +02691156-571cfb1da3d5b3704b5910188444efc8.npy +04379243-9c12fada31224bdf58c4e7e56d799d97.npy +04379243-31c090b23f52bb61208c8c852ee795bc.npy +02958343-21a1f2a7b7e671826405999d829064fa.npy +02933112-9b1175f3e0b7f0938ab7e957399ebbf0.npy +03337140-a5626b08c059654b4c3aee8e9d3a6ffa.npy +03636649-f567bc1dd416ebc9dcf2183c858e6e5.npy +02880940-5bb12905529c85359d3d767e1bc88d65.npy +03790512-1e664c94e932ece9883158c0007ed9ba.npy +03001627-c24b79602fccaf603379c738ca193530.npy +03636649-a48ee5668d042342eef5d83b671bb264.npy +04530566-20286f6d7aa7a853b48c6de5e38e3312.npy +03691459-aee6f0ef9f8a7c13b54cfe6aa07c2036.npy +04379243-460a915796f36eaa55f86bb3ad320a33.npy +04090263-e53badb78702d54e15b3bff1113c0f8.npy +04090263-568728cb599dc18880c2e60c312b0f09.npy +03001627-9eecb9726ab34ae0492d9da2668ec34c.npy +03948459-6fafe3b82e6e07de460c5cf20e4c5e41.npy +02691156-640c9b76fd75aa94d13ef00338ba8c52.npy +03001627-9a83000e9128d677b04cb542e2c50eb4.npy +02691156-49aa625393dbd1a4d443895deb2f03aa.npy +03593526-bcf5a4b764ddeac759f9892433e1b1f4.npy +04379243-a927b0088531dec823500a5b036df62e.npy +03759954-fa06eacff134fbcd59a6208793b9dfca.npy +02818832-75b74fce7335d1122c1fb51c278f01a4.npy +02828884-24eac2668c9f241fd2b12aa6a0f050b3.npy +03691459-2edb8ba1a031b3f5ce029fab54b6cfbd.npy +04256520-f144cda19f9457fef9b7ca92584b5271.npy +04379243-9e3586331eca79e48a5e3400c9c8f4e3.npy +03211117-bdde8a0134ad5283340f0692b6ac89e8.npy +04379243-f46fe188be699e5c593ebeeedbff73b.npy +02828884-2cd9593e8b7f0560d41e37baed87521d.npy +02828884-3eba7b7b2b1d139956f6fc4b4ce1db04.npy +02691156-b46455f82ad28fb595ff232cd38210b4.npy +04379243-eee08384e4f5c338a6ff78107fd2d715.npy +02958343-448efa9c287dac40a1523482d6af89d8.npy +02958343-4d24f5e0f3f394c030e91498c0369393.npy +03636649-5ffcd5bc4f1548181c7f081cf615f39b.npy +02691156-59f258b7aa7c1f7aa7d0c1e4eb8db7dc.npy +04379243-8b319bad7b3ff1b2ea60ed8d67a889c.npy +02933112-a268283b0fab6092eb835f4eccb92a70.npy +02876657-39d4723b8ac197d4dcc91b6bf08a2274.npy +02818832-d934090d6e0be2746121178eafd002fd.npy +02871439-34d5923ee8b8a6333bb4a1304fe504d3.npy +03211117-2049436c2457a4203087f84b199fd297.npy +02958343-4ceeed48d1a48d4ce09e4fc69d1a2697.npy +03593526-3e82203bf2cf0c81e6597d391ab6fcc1.npy +04379243-580e48297791fb394e684eb336479e2c.npy +03325088-f76ee8c9af6323bdb362845c6edb57fc.npy +04256520-e1662c8dfabda9e76eb9b08c8a74d159.npy +02691156-ed50758d8792491314777db9411e4949.npy +03001627-2bb65d6612027f18591999955e20a6d0.npy +04401088-cd1739ec8797049072f1ebe52d9b9daa.npy +02691156-aecd996b2ec3832771d03b466c72ce41.npy +04554684-8340c44f09408180d122457e1745c167.npy +04090263-8cab7fcd543a1d0a74e18e0e7a19212a.npy +02958343-f73858d58e6371f7d76439fb95cdd2ed.npy +04530566-2d702653fd65092cd3ac8c766eb7aca3.npy +04379243-6bc7148a5138aa6765eacc25f128a1c5.npy +02691156-aa70737ddaede2e3368d7e7849f8df62.npy +04379243-18e73a715023714691829b477862aff6.npy +04090263-94a7069ee4d637de40aa5b072f9ee3d1.npy +03467517-8cc7d40d73be99c9d57700c05b1862d8.npy +02828884-28ccec6ab49631e4e0f41fcfea9716c3.npy +02958343-e625eb804f2fb6caa26598ab726b7540.npy +03593526-e57f67c2da68cf1d6bc258c0f0234be0.npy +04256520-e4e0f428fcaa01bd19fb4103277a6b93.npy +03001627-e6e00a7324357c7dbec105fec16416d7.npy +02828884-5cb02fdcd0f1cf5d3d06403e6871e4f.npy +04379243-9bdb8268baafde1f44c642950fb4550a.npy +03046257-182760a92182873b4cbbb913355f84cf.npy +04379243-40ad41340725a2477251178be84deb2e.npy +03001627-e1e2a1aa3a6cc913eab1a145ba6f6383.npy +03001627-2b2510922e763c2443b0708c694aaf46.npy +04468005-65507a0e35c02ed24e971947186deba4.npy +04379243-33a3aaf17cb7d0ea351aa299020a0e0c.npy +03001627-6cbed10088dfb841e2a5f8edb044130e.npy +04379243-91d47945645a1039eaf14273fa406ffc.npy +04256520-c73d63f9080e84a91b17743c18fb63dc.npy +02958343-732ed918e2bca89ae6e1c83427eed339.npy +03001627-e4602d2f261da4a314b029b11f36ab2d.npy +03691459-29faf5a7c444df58a1fabddca717cbad.npy +02691156-fc6decc887f6d8a0bbf3143b1cb6076a.npy +03001627-22af872ac796ed26ff8d7c1096fae070.npy +02808440-352453edb5b6f8b4a485efa4c77b16eb.npy +04530566-6cae5a0551aca4fdb39afb07adb2a544.npy +03691459-b16d2f432bb57fc76dd78e11c421d52c.npy +04256520-f2bfa61e1a8894dd1071797a42296ada.npy +02828884-6512b58401c7ea51ad5067eac75a07f7.npy +03001627-f515332dbceba51120768660cf080d12.npy +03001627-8a38d65b4909e79d727e9f790cd597.npy +02691156-7edc7e17171b488bd33efe8cc2e2bf98.npy +03513137-2a6f4a2ff5e11b264dead5f22c05efdf.npy +03691459-b044555289c7439f4c40f34de8f3bdb8.npy +02958343-33395dcb83b43eee21e570d3da54bf9d.npy +03211117-c28d66941e2005cd11ea7f12f22c0e84.npy +03046257-181d994ce6c150df9cd779a86f74ad9d.npy +04530566-54ad30894e9c74f28abdeb0a990504a.npy +03211117-956f4464a0c344d621c6aa624f82ef1.npy +02691156-f04b62deb7737c86d37636af9c7bcc34.npy +04256520-1d878962087fbab2350c104b3ba8ddb.npy +04379243-f06857189fae823f35836c728d324152.npy +04379243-cbc2d0b1d7a64ffd2ce1f2e292dc9c31.npy +02828884-b380b855aca5632dad5067eac75a07f7.npy +04379243-f6b3638983b0effaf3bf08ec218707d.npy +03636649-1eca42abff644eee57a48b78ff77644d.npy +02958343-6201a29763c2256a2bb5796f842ca661.npy +03691459-3db832895812dd37230584014222e685.npy +02992529-6753572868705eacdd043998582f5fa.npy +04530566-84b75e53176c9f1fe1e2f026632da15.npy +03001627-48d44532ffcdd4a2fc30bf6907b3dbb9.npy +03001627-314f567d460a88c7ad02e4a3aca566f.npy +02992529-980cefc1df9b24458b13932a0c28e98b.npy +04379243-5a5d896489318c0279c251b4a7838829.npy +04090263-55bc5e1223f4868646862032be5afc61.npy +03001627-4199756380f14898e8f8c11a24c52ebb.npy +04379243-f86c1da9ed243ff055f46d55537192b6.npy +03211117-840dfd5a8a5ad3f31db54d45f574231f.npy +03001627-e67d503940c1d95b73e5f839658fc536.npy +03001627-a95df2063ec98e429e6aed0cfb3be6d6.npy +02958343-3a3f3ee1eb027cdca413908c0e169330.npy +04090263-9a8186e85c80d89541deee31792586bb.npy +04379243-b5d5db47b33a9186ffac3d5f2301b75e.npy +04090263-149adc06e4b1404940232a3c75f1f92a.npy +03261776-2b28e2a5080101d245af43a64155c221.npy +04379243-a4b09d3dc36ce23bab4d0308b2ec6512.npy +04090263-a58beed0a033875567a4cd2863eb1ca.npy +04256520-f736f06f8fd04e1119fb4103277a6b93.npy +04379243-fa259703a9f28b1c62d7d9f5324445af.npy +03593526-88160fcb6c1eef2c35ac4a6a37bb3b6.npy +04401088-62314ec7373898059f7477e2986c440f.npy +02691156-cb55e0710b727bf62e36a049ed2b7f88.npy +04379243-b4ee137cd86d7e3a6afaa22adc38077c.npy +04256520-1d3dcb5fe999334f83de73f58b2fc4ff.npy +04256520-a007a3cd5b8ca7fb19fb4103277a6b93.npy +04379243-681c53daf7810b9f92d5b25c536d8044.npy +04379243-ca6c07357ba5125b8e2adb29857f8a1.npy +04256520-402c270ea6fd4754d93768e7b9b1eabf.npy +04379243-94df93e1c5f96c1891bed99343331f7c.npy +03001627-732e0abfbd4d09858d775f6f7c8f1b0d.npy +04379243-fc8768524737826190e7e9cd4c47f9dc.npy +02933112-9eada38b3a65963e30bbd4cddd04c77b.npy +03593526-7def6a25e235f2deaf0245cb9d7ad8ee.npy +04090263-461684f261c66471e3bdba9430565083.npy +04090263-bb8ffd0d313c3e33202be79d8b285c1e.npy +04379243-ab8f7cd2ba798e33b035d20a1a3ca345.npy +03001627-eda9dd4d0d18c3f2296420d5ebe64c52.npy +04379243-26adf340ea5d552d3c5e1addd9922bf2.npy +02828884-110f199f516657c1473448e3f3f73bc2.npy +03001627-63fb3c970f0051c730bbd4cddd04c77b.npy +03636649-26ce3db3122afe74a5f600ed2cf472ac.npy +03636649-bc49fe3559e18fcb7d910d51d878f708.npy +04379243-3820449f17744298847dc1a0820caba6.npy +03001627-384dc36226d1d4deb7f1aaa55af02518.npy +03001627-a2bfec12cf53f198d810b14a81e12eca.npy +04379243-7105bd044f464358beedb4c8fd29e2d1.npy +04379243-be81240ed3cb8e5a7d8864caa856253b.npy +04256520-7b8a8776c2bd135694e14fba4acebb36.npy +02871439-4c773fb32c39ef14891a7a8a744cd90d.npy +03001627-c7a87dff6ab53f3b7490c34ba5d2779.npy +04379243-ad6317f2a90d71f6f4b6538438a0b930.npy +03761084-3a78c8e5c361ff554a44340bf227e40.npy +04379243-cd44665771f7b7d2b2000d40d3899456.npy +03636649-a708a75b3727b12fcb8d8c6d4df8143.npy +04090263-9a6c8702a8f5d01ad6945707de93a7ab.npy +02933112-b592fe51cdda66394692707833167ca3.npy +02958343-c0db588c8c816cd2dc668d3d64c871ae.npy +03001627-1022fe7dd03f6a4d4d5ad9f13ac9f4e7.npy +03636649-6267ef99cbfaea7741cf86c757faf4f9.npy +02828884-3f49fe14826172dff155d75bbf62b80.npy +04256520-2cb0f608feed6256165ce3a6b1468e1.npy +03325088-a37a43fd956d1ea73ec0850b5880d3f.npy +02747177-a7441227a374ee8cad5067eac75a07f7.npy +02691156-1bba3fb413b93890947bbeb9022263b8.npy +02691156-4a9f55420d17c815d37636af9c7bcc34.npy +03513137-e176a78b82a5add0de8982fc28ddacc3.npy +02828884-3776c500e1654d55c50517751ed5f28c.npy +03636649-b88ca09d13a5a472e3e80050b31d1851.npy +03001627-78952b099c650a85d42ec7e303174a87.npy +03001627-fdb00b6e3c3a8c6e9e7154e1e649e020.npy +02691156-8383e10a1d1faf89c7749c7e68c22ddc.npy +04379243-eb097732d3f31469aa11adad6b2a69c.npy +02942699-58e9faa223142b7fd5af42f3e1f05e3f.npy +02828884-2356e0b210f85371f8fa66012789e652.npy +03046257-a1671be5957cfd688bb3deb7fab7c9b7.npy +03001627-8e19d2ec95c45186a6fd617b2ff5d2d.npy +02958343-5d62b276cf9582e2473f10e6caaeca56.npy +03001627-4b7f260d832c2776a7b43f93c63d6e63.npy +03691459-59ed437f426da7c8c3eb2e07e7561a08.npy +02828884-682cb02cd40c9fa412b60d5939b55d61.npy +04256520-1dd6e32097b09cd6da5dde4c9576b854.npy +04401088-ab96be5a6e3827932a6d73bcecfd73da.npy +03467517-a5e2f05386e4ba55a894e1aba5d3799a.npy +02828884-4e3e67fa22620b82056b4bd5d870b47.npy +02958343-7c9136f3fdbd6c5938948312b270283a.npy +04379243-89827ac677337629ab610b0c94236463.npy +04530566-759c3321f016c1cf7cd1f8dd6fbce8fb.npy +03790512-f26c108283f42995a41f6474541ac161.npy +03001627-4231883e92a3c1a21c62d11641ffbd35.npy +02828884-a77b423dbe9f9a34beedb4c8fd29e2d1.npy +02691156-9bd8d0fa75bc21c5e3375a6b96a1d765.npy +03691459-bbda555f0874e9d5b35234ceed4dc815.npy +03001627-cc3d9160369d09845e61ef8e2af97499.npy +02691156-55f212ad58883877ca8607f540cc62ba.npy +04256520-199f330c7a4880b84b3c42e318f3affc.npy +04379243-3273b3eb8dfbbd8e6942c5426df6055.npy +02691156-1605bdb8709be6773c4d876662ed7ef0.npy +03928116-cbe392ea073dfc763fbcdcb4c54d4ba8.npy +03642806-a9aaa5daad084d18cb5b7dfc5966f56d.npy +03636649-6e1fe96adbb5ffba8bae2d07dadd1b5d.npy +04379243-139e0706288b7ccf1657aaca7aaa9a5c.npy +03001627-e69e032ca0bd60a4febad4f49b26ec52.npy +02818832-c9eb8864f33152a3e09520ec2bf55884.npy +03513137-69ece333c6d386ebbeee9a165d0dbe2.npy +02691156-e96cd99f545a4d22b0a339fc52929deb.npy +02691156-a6afd80fa3d70682ca8607f540cc62ba.npy +02808440-529eb2a106db950ccd0340812259a39.npy +02946921-3a9041d7aa0b4b9ad9802f6365035049.npy +03001627-319115572f7aa81d06ed06732b21e08.npy +04256520-c0580211c63f4fc9cd3f9e8648111d1.npy +03001627-639a10b856336f1fff2c92c2a4f65876.npy +02924116-a5f52fc53695fe9897d0a7f777e9238.npy +02958343-58f447ce8de6b9794c40f34de8f3bdb8.npy +04379243-12a5cc49c75b93af5b4aea6c98f52b6e.npy +03761084-a13b51c46b590287df75fdd4632be672.npy +02871439-f1181054abd6ab38335e5968fd22399.npy +02933112-6478d877795d2214f51f77a6d7299806.npy +02691156-d441a12b217c26bc0d5f9d32d37453c.npy +04379243-c72f97d0b25e030db0892e337a99f42d.npy +02871439-fb1a15143f6df0b35d3dc7a81f13d5e8.npy +02691156-85462aa8b58d5a1ae753c4c9af8a19d7.npy +02876657-495dea92a04b43e6be9fabb33de62010.npy +03001627-78446e1cc15f757297936c81e7f6629.npy +02958343-5351646fca246bc989c6f1079da7a8d4.npy +04379243-ae1cc74a1db83b0e6ab95c4e859970.npy +02958343-884014d60de73249af551becaeca18e5.npy +04379243-8b972b066bfdd7c44f016493aa9fd9.npy +03001627-3a4843e09b8dcafae6c5cd45aa112726.npy +03513137-82e027e4b43fa602f99976ddcaae4d11.npy +02773838-e49f6ae8fa76e90a285e5a1f74237618.npy +03001627-4d3bf8ef55b4e4fcdb66736e6592e424.npy +03001627-d670d3919c87c91cf1783a44a88d6274.npy +04530566-9b5077b81457cfc2986bcbcf53ae184f.npy +02933112-202ea0a26125f716ce5d6e9371bb5c33.npy +04090263-30a009a1877c9ae282a52e2a06478500.npy +04530566-1dffc8919a03627ecc015b9f8906f7b4.npy +03636649-5828e8ad9fd14a1cdb1afe6c464e7652.npy +04379243-881756250fe9a7fa5fceaa39a8353bde.npy +03691459-213d39983b0a865d1369827a16f97392.npy +02876657-f03f9704001d2055ab8a56962d772d13.npy +04379243-a96eb4bdd69c103dd293c20958d173d3.npy +02691156-ddf4aa5f68f89616bce962d6c4b37336.npy +03001627-e88b094644e1e80d8f2ca82d6e1c314.npy +02691156-723a86a2b266109d1fc43d5b32fa230f.npy +04554684-dbd0ba5a349a8849fb0f1b7266d79466.npy +04379243-5a945b9e86d60a4aa75d03186a0409e2.npy +02880940-d98455f19960f99ed684faddec3c0090.npy +04256520-92be674b2edb7f54d18c447b567dbc27.npy +02691156-14282db0ca4238429a6e43b878d5b335.npy +04379243-61397fb909774541e3c62e8199fc6b89.npy +03001627-e279758e8a5b6a8d492d9da2668ec34c.npy +03001627-3efa8030c71fab9055afe589a9f09982.npy +02808440-c4f40a208cc903b18faaa3c714890be6.npy +03636649-9adee08c737c7c134c6deb9ede0648df.npy +02958343-6ad0379c2f24581a1c0f83a9278e7dbc.npy +04379243-6777c68f2b62b581b3f89af909332a40.npy +03001627-428bd9c7c8a0a6bc7ff6ace05b36a5.npy +02933112-88982fc3cdf5d2b212de5317fe5b354f.npy +03467517-3d65570b55933c86ec7e7dbd8120b3cb.npy +02691156-da9c541228a171b7ca8607f540cc62ba.npy +02808440-32a286ab7be40cfeb5c63839abd9baad.npy +03001627-dbfab57f9238e76799fc3b509229d3d.npy +03593526-7775947ce2333be398910e50f05b8001.npy +04090263-5b2fc9e582dd7052d957eaf7f4edb205.npy +03046257-48784197e358000da239e7f1ff51b07d.npy +04379243-e74841627e110e98d9de0de5dc66ab1.npy +04379243-ca82beca43a3b9b59ccce4c6d5bb195f.npy +04379243-83dfe7d2df18ab58fcd4910413c446d9.npy +02958343-cdc8453c63ffc13e20f29d4da2b76f7a.npy +04090263-c1b9ec727b9ad093fd0b1d4a6a5da4f7.npy +04379243-7d7510e6bafe8d2aaab74c2fedafd.npy +03636649-441726d957d718a137b2bb75885cfc44.npy +03001627-df487c3660e7030dc5ed74d70201d4c.npy +03636649-97c26d66399ecdc973b8ea30c1700f67.npy +04468005-d5ed0af28683130b4b0b2e6e63122009.npy +03001627-4133e9d231ca52c6a16baf954c1d99bc.npy +03636649-67a087a3f917c3a7cf004563556ddb36.npy +04256520-fa46769b0817a8744f52551bb6d0494.npy +04256520-d3a8b906f6909b0252899f0b4e8d8ae4.npy +02958343-42af1d5d3b2524003e241901f2025878.npy +02992529-e4d794e92cd098d740dec81c6722f67f.npy +04530566-d04816fe3c531b66f647317afa6ffdd4.npy +04256520-e2c68936d051b926646568c803ce68ef.npy +03046257-b13b3f7b09b6534ce02c475590efce0d.npy +04379243-567ca6e5eebb09f87d0efae8dc996b9e.npy +04401088-a8d72bc949bbf361d8dc338f42ea38e9.npy +02747177-501154f25599ee80cb2a965e75be701c.npy +02958343-b67af8c92198eab432e9b7d6df5ccd43.npy +04401088-7a2a5b36831f45501b670e8e7f0f2c3e.npy +03636649-1854bd4bcf32ca32e95ee7559a2a873b.npy +03001627-f0bd1732f37da50c7000797f53fee6e4.npy +02691156-ffc1b82bec23a50995b8d6bdd18d56e8.npy +02808440-e34833b19879020d54d7082b34825ef0.npy +04379243-a8fd0c73fb6214cad56c79d3df7792df.npy +04379243-2f33abdfe147813e44949d7685cb63ea.npy +02691156-bdeb0a21cf1d602962347b4731688b0f.npy +02958343-948827c3833b8ce26d709900f94f0df3.npy +04379243-d3624229f0310175658d908a2254f194.npy +04090263-1ef4b49ad8b4e51f1dc5248baf82e0ba.npy +03046257-c764e7f423ea0b0251dd279724dd0c.npy +04256520-20b601472e40f47b17b431cae0dd70ed.npy +02958343-5be0fa6b0bb7a281a170b3adf3b6f220.npy +03001627-e30b412be565a1026efe57da6d3d385e.npy +02691156-445404a75a0ba2ab1fc43d5b32fa230f.npy +04090263-546acfcb08d2af05be90eac69c95aeea.npy +03467517-4a3e5c774d15a35c1082f2ea630bf69e.npy +02958343-5ea6bb423b1600141d225d751745cd28.npy +02691156-c12362906beecc796059aeb39e538eb2.npy +02828884-2480c05ad2b4969971a782a4379556c7.npy +04379243-39dba8b2e416449a19fb4103277a6b93.npy +02871439-33b29c9e55250cc57f0bdbbc607f1f0e.npy +02876657-41ab1142420916e374bb1e92fd01dc00.npy +04379243-29d2c8d1297d9f5c9fa24672a35ae8bb.npy +03211117-9ef960721520d46a922e9adbedbcd67.npy +03691459-46acc0258b449d18f01503c3476a4944.npy +03001627-26da81dbdf7784dddb984b8f0550fcd4.npy +03001627-cc6840207c0cf55db30e42459dcb06f.npy +03642806-241ec8a746dd1cfc78f71a335ebabfa5.npy +03211117-d85f501bf76933c609d7d8d27dbba7f.npy +02992529-e691c8f0fd7d64d7ab0b172d4dea80cd.npy +04530566-27d5c5d0dec7b209124dae0a32996c4c.npy +02828884-3ef52655b95ea7828d1fe8cdc415f4c5.npy +03001627-b8bf7e161cbff74066ab323d8f805a57.npy +03636649-cf9987efe529a5c538b27a25d1336579.npy +03211117-bbfac23f57b5fbd820e867fd9fb7164.npy +03691459-240521f502e491cd4eddc7a5aaee958e.npy +04379243-20b72612211287d43002761e7a3ba3bd.npy +03642806-1d66c26055573243a0efaa0482f35281.npy +03593526-be91cefe6cd75c15ed7e8845633fd652.npy +04379243-2fe5e4d8a871fb861b1a00a31bfed97b.npy +04530566-e4717ec5f7e12fbf07aa2d157764a08.npy +03046257-99d0eb7e23df54864d46ab71b147ac5a.npy +04256520-601bf25b4512502145c6cb69e0968783.npy +04090263-377289b4275551e83624215edd93853.npy +03691459-acc5b71d898d510f1ef58b31c4ba0d15.npy +04256520-d87a4ae5c2a768d4283b00891f680579.npy +03001627-71e139bf13970c94492d9da2668ec34c.npy +03001627-34bda4dba48231b97a90098a7525b367.npy +03001627-5a3fe2c1f1e2009e762ec387b772e9e1.npy +04090263-af06013159ad2e45cc34b900bb2492e.npy +02958343-c179735c4d9f65d7d1521952154c90ff.npy +03790512-1a48f3b3c0ab0fdeba8e0a95fbfb7c9.npy +02808440-7efbe90c9685e23cede9471c962dd6ba.npy +02958343-752a3ce746670be176ad064d1c5fdd7c.npy +04090263-1a8c91b4803b3470f9c75ffd2648d7cd.npy +03211117-762b30a37bb098ebe7db3cc5ece34048.npy +04530566-98cbe2b3e62879058e3175d49fbb0f30.npy +03001627-19cbb7fd3ba9324489a921f93b6641da.npy +04225987-8310154df085baf3e3cfaa4e6977fab6.npy +03001627-92175cfac21b10e76e5b9257c4084ca2.npy +03691459-16245718c786456b35949989d0ab81d2.npy +04379243-680414bc3ea1e9a67ff6ace05b36a5.npy +04379243-772b0908f5aa09c687d3d93a515ee29f.npy +02958343-7e7f0637d6798113ddb4014f0e8d0dac.npy +02747177-816d92c78f85f5002056b4bd5d870b47.npy +02808440-b6fb767050949172ccd0340812259a39.npy +03636649-2f46b8a15b15439d713f2e93cbeac35d.npy +04379243-3398658268644c2539eff6a5994f7472.npy +02808440-564813720bdb0cd93321831d2245cf06.npy +02933112-13aeab12a8ccdb244da5feafe6f1c8fc.npy +03642806-367fbaea8743ec1cc98452c8fce6b43.npy +02924116-75e1a6e156e8373b193d7855ecfc1bd3.npy +04074963-b9714784de07ad31cae0e78ad4bea7bf.npy +04379243-ba0cfe7ad9775de3276b6f6d90ee3a83.npy +03001627-a374415a1ccc05aa283b00891f680579.npy +02992529-adf64019f7a54162550c9b1b1c5f7e5f.npy +03211117-d5ae3a2aeb50a07e75e49fe23848bbe5.npy +02958343-3eb545f745d827752e4d5bd853781216.npy +03636649-211a5b7347645a99967cdbf1c849239.npy +03325088-31b197f507561fe7c91cb0beedee33fd.npy +03636649-43b59fbc4703d7d1c8e6d2030713566b.npy +03001627-b0531a0d44fc22144224ee0743294f79.npy +04379243-2bc37c326782ecfb9bbc8ad5ece3c1b.npy +02828884-65f6f33358b798892056b4bd5d870b47.npy +04256520-f1ae0c66488c39c8ecf6d12e1f8958fc.npy +03001627-99e4c4b39b75a06b30e06a011e63236a.npy +02691156-16f67f87f414a5df26360e1e29a956c7.npy +02933112-b12fd3c4e5912a7dd8b510632cc84b8c.npy +03046257-4dab14b822fd4a06adc5f5aafedb1c38.npy +04379243-41056728cbfd7aba9f8c3d2002c77ddb.npy +03001627-5b6a608c22d77fbcb04cb542e2c50eb4.npy +02992529-d51e5d7eae216c9ef1cb19f636b1c2bd.npy +03691459-3ff2ce8b7432b5d6feae521e94848af6.npy +04554684-a339c3e29128a402c8e4135ffa0bbfdd.npy +03001627-72d7299f4a0a542c76f992c4dd795e91.npy +02992529-ed71d2ed652b911e7f521a3dcd28e9d2.npy +03001627-699fb3293e219808599dcc439b161a52.npy +03001627-5fe56a4a9d5508c3b2373df00b89e5d.npy +03991062-5044332515e02a2b78caa162a41a851e.npy +02691156-b53ea9af10f2a151bc0909d98a1ff2b4.npy +04379243-f28874ee319d1e2dd3bd10ac60e54bc9.npy +02691156-bc86e4461bd4c955a34fb3db6a11a22d.npy +03001627-33774f1314ea9b504b3c42e318f3affc.npy +02691156-9a847e8c8f9c0acbbb05fba9fce1c1e0.npy +04468005-d26eb320ce4753d03ae1361afc45ac52.npy +04256520-2c7fd96b46b2b5b5efc579970fcfc006.npy +02958343-afd73137221d690761c6c61410fc904b.npy +03211117-e38a7ba01d45953ccb7547c95fbdff26.npy +04379243-15bae7fe612add11bf899e941ea0fe55.npy +02691156-7b1859e6b57bb6621c795eedd7ee6db0.npy +04379243-ac646aa05a0ae0e11b604216cb6e7d3d.npy +03046257-1d5a354ee3e977d7ce57d3de4658a486.npy +03211117-9711341338f550145b778a830599543.npy +02958343-894e186c1224c14f86590219e6a70ff0.npy +04379243-3d7f82a1bfc5e1ee9dfa717f86ba8028.npy +03593526-537670c883cc57f730612f5c0ef21eb8.npy +03325088-291eba55363e33cf979c556124bee033.npy +02691156-1d68bc47a558ec9b266eb575093ccace.npy +04256520-8951dddfc3cd6b08e8f8c11a24c52ebb.npy +02691156-22ced10a5d20b1c1fca1f1143bb6bc17.npy +02691156-d6cc7ffd165de05e2e2de556c136fbc8.npy +04379243-e8dedc79c201f076973f95b50a1641d3.npy +03636649-9cfefdc1e63a3c2535836c728d324152.npy +02691156-5d7b52a58c667ca835fc197bbabcd5bd.npy +02924116-6718e0455f3ac9a4459eff669967d5b0.npy +02747177-ecd9af137b451664bb46eebc96453b8e.npy +04379243-8118d53cd86b7aa6436e6787c76ef3f0.npy +02691156-94379090010cd6bb874c9ce092a813ef.npy +02924116-b73fd7769a870f7e52470de2774d6099.npy +02933112-39db396f57ec698cc59350d819542ec7.npy +03325088-cb80870b4c80d9c4b0bf85736b51ccfc.npy +02691156-d2faf50d6d88dd0690baeef8ba5b93e5.npy +03624134-5c5e4a7e5670eace44841730d607e227.npy +04468005-b9257fc9ef316cb56d99dfe91d90e769.npy +02691156-f40fe7461dc4e3396b7bd17e458d0dcb.npy +04379243-5a6c1cc3731fedeb55f46d55537192b6.npy +04256520-8f05bca2d46582483b28ebac0b25d03d.npy +02808440-5eab643d440c4a4bab78f79703f1828f.npy +02691156-613bf91bc5c201e115392a14b2886d23.npy +03001627-451458fe90bd0f4144f23566597ec464.npy +03001627-2195099b0295f692afca3357bb07ab96.npy +02828884-fd355d06238853c7f0d9805ad6c2059c.npy +03624134-82ebc48a41abaad2e72c243118d89f07.npy +03636649-a04e341e7dc206edfe10244ee697dc96.npy +02958343-536b6629c4f60d07e78002a96f52ef26.npy +04379243-75a824a5acd71051bb29ecbc4d013bd1.npy +02828884-a0ee85921d1bcfbd81faebbdea6bd9be.npy +03467517-f430d1ecf9ebbf23d57700c05b1862d8.npy +02828884-df6fd36040a5719662701a18243b45d3.npy +04379243-9f76504d9b551e548c37cfe791015e2f.npy +03001627-bab30539155767a59f422d8258cbffab.npy +04379243-f4b5313a0bc95a48da7c128b58fc7554.npy +04379243-3f5daa8fe93b68fa87e2d08958d6900c.npy +02933112-7eca681f6174f1ce12de5317fe5b354f.npy +03636649-6c33f42a0f97360143dbb6421d614c0d.npy +04530566-b6eefb8fe960df93d4dd83fc93961e73.npy +02691156-40192d0e50b4d2c1f27a705edb2f9ba6.npy +03636649-f7b3550d5e59934595bea7c29e873d16.npy +04379243-a034755df11115a1a71c812e027f94d9.npy +03001627-6ff87a46571c52c4f4b6538438a0b930.npy +02828884-f0b85200702e4739391e4d6c585a697a.npy +03337140-1e22bb0b68275ddfce79c0972693d245.npy +04256520-7b3bab9058f7de33fab6e40cce6926d7.npy +04256520-24bfcb97fb60fab7e812c99c6645894b.npy +02691156-ca16041e31078463afe21c1ae3d91b49.npy +02828884-8b677cef30fba873240c1f0f1e25335.npy +02924116-d3c35d123af3c8e826829c11d9aba173.npy +02958343-40c2b97577b43161aaafd94b9f216ef6.npy +03001627-1be38f2624022098f71e06115e9c3b3e.npy +02828884-b9b708af97a57de481f502b2c7b6ba78.npy +02958343-3462d5da3654b52d4a47c09276b7f6b1.npy +04090263-c802de6725483fd9ab66079ce2700442.npy +04379243-d5a3401380fdefa0f51f77a6d7299806.npy +04554684-a94bec767f059a013bf7bae2651d2cf.npy +03593526-5a4af043ba70f9682db9fca4b68095.npy +03001627-6aa86c295de207dcedad5734e2d87ca2.npy +03691459-483c63155f2be7a8983b2cee8fd0fb3e.npy +02876657-b35081bcc11ff7847b8ec2c9a49686dd.npy +02871439-2f8f1d7cd9f61a07b1edbf57c29e5fb3.npy +03046257-166bd86229867093031b562a9def0c1.npy +03211117-6437fc773d50e93b5c915b36bc455bdf.npy +04379243-aaaba1bbe037d3b1e406974af41e8842.npy +03691459-f4b733690a0fae8ff357e7c4167f3100.npy +03636649-80931bba35ec76db7088591b1a3e2750.npy +02808440-49b59c49ceed072491b664dd7cf765a4.npy +03211117-e70f6a81158cfb213a762233fffc49ea.npy +03001627-b1908805f05c6f47f51f77a6d7299806.npy +03001627-95317d46812e4ed4df5aea2392d894b4.npy +03991062-27d804a7d8ecf4ed148a76a78b10eb5d.npy +03636649-fc8cfb4ad6730207ad90876bf5435820.npy +04090263-722051c679217db6f436d0d7fdd21532.npy +04401088-144d8038c1688e37ab3dd76bf33b0f5e.npy +03325088-c46661274623b6cb3321831d2245cf06.npy +04379243-8a1687e286cb0b6f9f2349486c570dd4.npy +03001627-357f1c031b1bdfb3efaf604fa2300241.npy +04379243-cfeb699abe1b76c9964afc371e247bd5.npy +02942699-74ebdf5a3cdf33ebc6966f67e1bb9e90.npy +02958343-46befc634315de3f1ccbd9e5bb82dd04.npy +02946921-7bd05573c09fb0c2af39ccaab9314b14.npy +03467517-2f9bd6e61e038d8fd4b4ae2ff4c58b57.npy +03797390-659192a6ba300f1f4293529704725d98.npy +04090263-cb842e500cebf07a87856c3f95c33cd0.npy +04256520-75e62dceb6fc577e593ebeeedbff73b.npy +02958343-bbc2f2ffeec425a38eac574d099cd5d2.npy +03991062-440a38d6a90a5243de98d10ab5975b59.npy +02691156-99dc4702d20942da18e0889038e4fb6.npy +03001627-269539368eeb8ba95d99e410bbfdd132.npy +04379243-f621e2ad900ad48535836c728d324152.npy +04530566-991b0f19022a0233bb97258c2be2acca.npy +04256520-3c05461b9f6330efc61d98cf72b72c17.npy +02843684-7f53db3b31fe08283c2748dd7bf1793a.npy +04379243-276e35b78c24f8b2127787d2c89d5a93.npy +02691156-f9a8c5ae39362284d538ebc793e748b2.npy +02828884-e2cf4a7357cae6ed2dd04fa3e4c2a53f.npy +02691156-209bb7656231011d7965bced3a0d8967.npy +04379243-3b9b877ffac13289b6536581b321be90.npy +02691156-e55224bb456066c618d508b491dafd46.npy +02828884-6a6aba2dd0491b99cb2a965e75be701c.npy +03325088-ed8a6218e467e8a676d20e73c57c9a03.npy +02828884-616f9d109968982ced98cca8f0ccd5f7.npy +02828884-c327cf2527737f7ef155d75bbf62b80.npy +02924116-6ddf96982bc07456813f04ea98c97256.npy +02924116-2cf0cccfc228d92fc98c13d6112727de.npy +03636649-738646252a89e865bc5cf22809274024.npy +02958343-4acc28685ab111b672601793664460d.npy +03001627-947dfd74fc8b2e60643b321651a8f917.npy +02933112-a66122ff2d0e4bac6ba14bfd91a75020.npy +03691459-c3280f7bc5fa9ff28a0181490cb73cbc.npy +02828884-1998e800a95bfd18edd7d0866499ad97.npy +02958343-275df71b6258e818597505fd7d99b613.npy +03624134-23d7c17ddf80cd5549f73a97204d432b.npy +03624134-118141f7d22bc46eaeb7b7328341827a.npy +04090263-bb3f4468dc88370c9caab46c14deb892.npy +03001627-43569dc880494256b40f0ac0fb9a650d.npy +03593526-decc21646f053418df2fa7eaa812363c.npy +02828884-cad58af144b615b674a3201fd136f855.npy +02946921-2b08d2c26d1fce3afe34061aca66f702.npy +03691459-53856db6d2a2873c80ce1b5d66a0b782.npy +03636649-1a48f00729981afbc01ff6a6aade8d2.npy +02691156-52151d6a699ed1acecae07472b415b97.npy +04256520-eaec2a137b0858aa599dcc439b161a52.npy +04379243-a7ef45d86ae5b496a97f238e46bc2221.npy +03001627-6921b41c2f6916e2bea04b36c2ada3a3.npy +04256520-ebdeea981de34c1b2d19175e7d19b7cb.npy +04090263-2f2f7819edaa4ab7fb47f041a00e8417.npy +02876657-dacc6638cd62d82f42ebc0504c999b.npy +03467517-5852a24dde24a8ef93f0194265a9746c.npy +02958343-d4f88e7219c4b9417b5adf84ce6f7865.npy +04379243-50d898f6d1c05cee2d99129afd32edf4.npy +04379243-59e1afdec89de9442b70eac6546e93fd.npy +04256520-68aa553c520fdeada30a92122fc999e9.npy +04379243-23d1c6e2e35cb252bb85b5a298d72ac7.npy +02808440-cba294fd8320a4b13321831d2245cf06.npy +03691459-fe613d2a63582e126e5a8ef1ff6470a3.npy +03691459-98ad42e08a991125f0ea0ee719f6dcd1.npy +04379243-8a8934756916a42855ce350c1c834503.npy +02691156-bc59a1d1f959b6f9b2acbfd8323f804.npy +03691459-d956f40d4b3cf48f7889725d46ad23.npy +04530566-db01f2f8cff7b7e1c517f0fe59ec7ee.npy +02933112-bb9ac4b110f7ed3815dd7d7985e749c1.npy +03001627-d66b701631851e7b4b19d2c99e22ffe0.npy +04379243-cd27c39dc711626d7e9fb8aa5670f37.npy +02876657-365f8a3cf397adf66e71bbd43f7f5d20.npy +04379243-b0264f893f25e10ec955e5ed03ef3a2f.npy +02924116-672173207e1cd8a8c567c0a983faf2bf.npy +04256520-ad7dd9434ad5f61db759217db94d2883.npy +04379243-3ac209693a4e89c4a4b99739648f763.npy +03797390-a8f7a0edd3edc3299e54b4084dc33544.npy +04379243-b323d3002578f5f3f6cabe1df6f4c9d9.npy +02828884-feb6a23a5e25abe459af9a18ecf57ec3.npy +03211117-d5eaa13bf0dae2fee2e6b284e4b0319f.npy +02924116-b60af2693c12f6181afedc87fe387fe.npy +04530566-cdd493581ed137c5a6dae8586082d789.npy +04401088-641234f284243decea95e61f66327e28.npy +03593526-94b833e6157f13565ca1f314f1afc186.npy +03001627-e5d285ad477a33a27eaeab1f0c9120b7.npy +02924116-6886edda8e86aa84af02ff7e690e1b0.npy +03467517-faefd0da82f1606d9e0d303f663a5614.npy +03046257-3c5690e5ecfe5f0afd9cfa6c7f5305bc.npy +03001627-11b7c86fc42306ec7e7e25239e7b8f85.npy +02992529-db1f83761a7a19f6d0c7ebb68662b4e5.npy +03001627-640f61579181aef13ad3591a780fa12b.npy +04379243-8fed49d9a02124903002761e7a3ba3bd.npy +02691156-e7ff46a15ae32ede7480441c35610069.npy +02958343-2b08d1ac4111542f3a2b1a2e5e169910.npy +02801938-3071896180371f53eab2bd7322386ffd.npy +04379243-440b50a6bd10d00eb000f20a5153622c.npy +03001627-90587a80c1e58a7ecd447b0bcf9cfb5.npy +02958343-37c5ac3d5b34761add75f724c0ccbe00.npy +03001627-d4d18aea46db0b4d42e792292462a0ce.npy +03624134-b60d44263ebdfbb24b7644126b1d71e0.npy +02958343-9901e5d7520df242c61cbe35764dfac1.npy +03001627-550dd11407c28f9f3bd04286517a8395.npy +02808440-46bf8401785b96e336d8dd30a594b2af.npy +02828884-b6410fb9ca3cad2170a97514aa270017.npy +04379243-6aa865b9e1e9384d40ed3786e46af8d.npy +02691156-8db0b83cee14e1e5eacd58bc9fc5db51.npy +03211117-93b288efbbffff30c1dae5936fc55ce0.npy +03691459-b4e360a10bed4677aa0022295937af95.npy +04379243-c734ed1d590bba80df6cfab91d65bb91.npy +04379243-794f6c8575cb9828b44aa1973fabbd64.npy +02773838-68b7ca73de30ad6df2197da8dec8488d.npy +04379243-fbee497d2941270d79368d1198f406e7.npy +03001627-30e8a82eccb30369e3ca99089143c61.npy +02958343-441d0b3f687e3721fed6082009db27d.npy +02828884-54239ba1b945460ae4409e4832196128.npy +03691459-3fcff447f43c75c3ea3d2e9efa07ccad.npy +04379243-f078a5940280c0a22c6c98851414a9d8.npy +02828884-783b224ec9a89638736ecce7d21f395e.npy +04074963-80701d854496d6fe67a964feaf6ebeb.npy +03001627-470d626518cc53a2ff085529822a7226.npy +03207941-35617fd7ece26150ffc6e457221b9271.npy +04379243-910a506648c64970a8737fcf23389014.npy +02933112-33ad208b1b1468bc558ef7f77265c6c3.npy +02691156-e52f809111bb75692b5a1d128057b6a4.npy +02958343-24c46b3a467bb4954b1bdab82d834140.npy +02747177-b6fa6b957d2ed982e4612a77ab3114c6.npy +03001627-79862d8abd869cf6b3a8888e78d004b3.npy +04379243-57b68a9891773c89d27b31bdeb5f5c79.npy +04379243-b20204ca63c530fae3f7a74e12a274ef.npy +02958343-3a6a1feb338c884a8079d5a13e411210.npy +02691156-9b09169e0a2b8650dcadc22bf3c23ace.npy +02924116-2c10db171628f11c462dc6b25a076dfc.npy +04468005-7578f09ea13f2d04ed79a511eb448339.npy +02958343-d3f5e04481e69974d1521952154c90ff.npy +04379243-ea45019340b754c155f46d55537192b6.npy +03691459-e0c6692e0af5dda1459a1795a6d0c69f.npy +03001627-6bd131b9cc3e8b97b2ce8575669c9dbb.npy +03691459-7f448ebca95a536f40e7eb33087f3287.npy +03691459-2379915c82c2b2d02530f02db7e9157e.npy +04074963-4c78551ab00fb1873fbe480a485feffd.npy +02691156-7bb1d2f8be9593b3cc14f1e6f4f4f49b.npy +02691156-3c9d577c78dcc3904c3a35cee92bb95b.npy +03636649-fd5f6ab819910a66dc7f95a5a82e36f7.npy +04379243-a7164d4766ff0e1b4ff124faf2d8d947.npy +03636649-d6d7fb290b69e985ee2b478fec745c0a.npy +03636649-dd40743536da78a2bf964fc57f6a7d6d.npy +04530566-aa695b15cb58096f36aafa2ff65e6955.npy +02828884-448010b6066f3da3b069944d084e877.npy +02933112-e408c939829d0353a6490b68274665e.npy +02958343-4bb61e5a72bea4506ca2b6e5474aad11.npy +02773838-a55b721ea5a29d7f639ff561fa3f5bac.npy +03928116-a9292522fb6fbb987de45a8ca0837da.npy +04090263-5c28fd7c3d261e1b3e243aaa4500940e.npy +04379243-3ab6e079e4af17401a53162afec5ca5e.npy +03001627-376079d4c844328ad6eefa796d2f261c.npy +02876657-758fb2cab125eb6b153b368d6f14e275.npy +02828884-d73143a767890e26505bbba2c4eee722.npy +03211117-37ed0bdf52f2eaa83c5474c35497dc65.npy +04379243-12ecbeacae03825ef211221ba01b03bb.npy +02958343-c8a69b3e40337ba8c44c06ae133f875a.npy +03085013-485e300538ca1fc9f1e852be2b9d80e8.npy +03636649-ec449d7c89e84657cf66a9e192dbe265.npy +03001627-d36de0f850783d8fd6b3090036b71698.npy +03991062-31923669954ca57025ebd1cd0b422e32.npy +04379243-4d8abcddafc52ccc95e7043c2fdf14cf.npy +04379243-b977915b93e87cbdd724c69102d5ef2.npy +03467517-8f59fee745f1e37ea5c8e9fc8b2242fd.npy +04225987-e314be67e02df59c520f00c860557591.npy +04530566-6c99359667a1b49d657a96a9bceb8713.npy +03001627-2c67f62020ca22927297db8481c2b16b.npy +03001627-bcdcb4928e07e4174a623eb2e3317415.npy +03691459-f8b0dcf0788e775db98f9e89101e3f14.npy +03001627-81910ec49fc4951330e06a011e63236a.npy +03001627-9f1a83a9fe6ce47afe74f7508ff628ce.npy +04530566-713861441f4c7110b7b1411b0ad3bd0d.npy +02828884-972e0e5717676e47d201085e80edb26a.npy +02828884-89f810f17284aceb85ef4356ea4ff622.npy +04379243-6c4cb518c38c50c9939c47ac2990d9c1.npy +03624134-1460eded8006b10139c78a1e40e247f3.npy +04256520-6ed77417302eb83832a1c3052eaae289.npy +04379243-ea7ca8c7d68c1f62660d2c57f39fb65d.npy +03001627-6cf7fc7979e949c72dc9485cd94746f7.npy +04090263-c9e4c1b4cdc45601dde078ce46d9fe3a.npy +03593526-869a98e1ef4fdb543c8d0fdfb1cc2535.npy +02958343-79c9b9b6e2cb15a2dc1f7c6230f38f00.npy +04379243-2d018cff733a8e176870e413ec7729b0.npy +03928116-673c3f77f3702338a1845d2858b500eb.npy +03001627-29b3a8cb9595cbe63b7fe46c7c128390.npy +03001627-5aeefb539699524044b2fa2cac0778f5.npy +03691459-ed06c596dd9b9cf3dc99793862c889e0.npy +03991062-4e377c970b6dcf4347264d6335395c04.npy +03325088-d62a9031fc6961833321831d2245cf06.npy +04530566-a6d50000249d71cf70c8aed16b49b164.npy +04090263-f0cc8d1741f287fa276c3d558130f8b4.npy +04401088-b02d8e0fb3ec903b4a952171144f2812.npy +02691156-a7394a6f2dcf8e9b3cbb132878a747df.npy +04256520-f4370eb6449a1e8e191682d3b3321017.npy +04090263-9b9d03274e856982c2c44977d8755d41.npy +04401088-9fd7db6d334e6acab29f572d1167c0ed.npy +03001627-2f4b0d6e2faf22d68c18ac3fe1584a6.npy +02691156-4a9d28a5f272853fbbf3143b1cb6076a.npy +02691156-6c613c1893bf7f9ffae8113cc147b3ae.npy +03467517-a10303f8b98342cedb6edcc84d526a7.npy +04379243-26ebcfb2ebd8345f14b86d5282eb8301.npy +04090263-154c779086865eafe906ff5bb78d7b1.npy +02773838-2ca6df7a5377825cfee773c7de26c274.npy +03001627-6de012f3ce256e9930c7810cba6da248.npy +04379243-660deb63defcf872e76bc197b3a3ffc0.npy +03790512-6611e5f5092d1ac1104831d5b063e54b.npy +03513137-17969fc40964dbe0288d8f1144f7979f.npy +03467517-153e7883f6cf0e66d57700c05b1862d8.npy +04401088-ab8243a880170c00cca1221aa4c4f70a.npy +02958343-b4110c921adb2c40bda733a39f84326d.npy +03001627-d561ff6788ab46517b016084e2ae95e.npy +03001627-ec637164befa6a016bba96a850a0781f.npy +03691459-f996317de417329b1574d21c0c95092f.npy +04401088-5bbf52512a45bddb7525dc2f981e5489.npy +03928116-fd2d4458a90405c0b60747861a92b009.npy +04530566-c2eb256cde2dbb93c17ff170974eac43.npy +04090263-9b59affd52c33944c6c1e54aa8170142.npy +04401088-9952f0dc41b20fcfdd5b23028b480cc3.npy +03928116-604b2240f6e827d21995b51f9c4e1836.npy +04401088-9b608bcc7e62c3e2dbe1e810cdc7471d.npy +04256520-903dda9c731b73acf661d29029f2c819.npy +04379243-8f0a115dc4c1c183f16363d52e74cddf.npy +02691156-22829f20e331d563dd455eb19d4d269e.npy +03001627-36f4f54d500dfcec9969831eec1821d9.npy +04401088-a860adc078391edc6774046e1fe3165b.npy +04256520-164f50d574036cfb2ff0fced1c150b31.npy +02924116-cb6defc2b3478f2223448236beaf8ea1.npy +02691156-2677c3793143e75766cf1b4a8fc3914e.npy +02876657-9c8d90ef60e0b37fd317c475f024f3b8.npy +04379243-fc1fff82a7c97884fc5e332306225be0.npy +03691459-46b229154ab6434177818a0572bf1777.npy +02958343-c1daf553ebba8c07e4b68d3b17c43658.npy +03636649-79861fc79f8dd8b478b03575bb54dfd4.npy +03691459-b02ae2bb9756acdc5587d8c9be86464a.npy +04530566-20c2e1a09d00f51294daa4565dd30535.npy +03642806-1497a7a1871af20162360e5e854659a.npy +04554684-933dc825712acc8ab5a3b8119a3da34a.npy +03761084-cc932ff79453c009a6bce7f3d1dfedad.npy +04379243-8aeb236e281bd5a4f51f77a6d7299806.npy +02933112-ce9c5aa7a4016f138c2f9e4176bfe555.npy +03624134-81d9a6aeafadb719ed6e4dd9aa9b9ab0.npy +03991062-bdb680eafe46baff3f7e27638e63d848.npy +04256520-a157ab590ef0f9b6dcdd187a6a5d68ad.npy +02691156-3902709d4b10903579995cc5afab9d5.npy +03636649-3834d7f376879c03eca29403b7226aa1.npy +04379243-f674a5a3c9c5c7c781faebbdea6bd9be.npy +03001627-712415ce3f126dd921bdbc0445d9f748.npy +04401088-aba1179bf8b62c812a6d73bcecfd73da.npy +04530566-68f118940e88df383ac122c0078b9b60.npy +03636649-120f940d4c32c48df51f77a6d7299806.npy +02958343-b4f06573afbb3c1d9a997e8df355a668.npy +03948459-2eca5fa283b317c7602717bb378973f1.npy +04256520-9fa4f3e75f6bcd89b758c822519f97be.npy +02992529-c6f62eb51d1750497dbf89b54afcec5d.npy +03467517-d7e1b36ab46e2d9130f83c7e8a7d80c9.npy +04225987-58ade10f7f87edc6e860048d7ced02e3.npy +02808440-bc990a3fff60a55ea64e5c46abb30c70.npy +04379243-1e5f3bc86bddd77f700e86b51ee00536.npy +03325088-d4939c7a314174e276c18e71fd49c4dc.npy +02691156-a0095db392a8b520884a857d19f7439f.npy +03001627-469d04bcf9576a8b8cbb8bac2032149c.npy +02691156-c7df0d3a924147a49a6e43b878d5b335.npy +03001627-c2b898dd5601454d626d7e3d07da8352.npy +02691156-1beb0776148870d4c511571426f8b16d.npy +03636649-2e5a58c43539442a6858978be907b0c1.npy +03001627-fe9467d48dc6b3491dfc750afa3f442.npy +04379243-e407b3cb5cbd7d4fe0f0631862fa9bfa.npy +03211117-5f248c8e804af22f6436916a86a90ed7.npy +04530566-41d1856d2e24a738b4624ce09086ad45.npy +02871439-1b301a8217f3b0ae13b18ba49b3eb9b4.npy +02958343-406ff3d73672bb2b21669bcdba443569.npy +03636649-85b3f0b7d9968d79664b3b9b23ddfcbc.npy +03001627-55bc1f325928f28c738dd0d3509c7e47.npy +02958343-6fd9b065c795d915473f10e6caaeca56.npy +02691156-df990580230f0254d21176457f0be3a.npy +03325088-b2a3d57b66ec42f350da8b99982a3057.npy +04256520-28940687b3516d6e8dd711af5650bdcf.npy +03337140-ce20ad86c7e6e0a16c8051be410ba0ef.npy +03001627-cfd2b4a2c8398220731d11154716a6b8.npy +02924116-afb664bf0c6e3311b2da04cd324f7af6.npy +02946921-c4bce3dc44c66630282f9cd3f45eaa2a.npy +02691156-cbdf611a2146031823a665a253ac8cae.npy +02691156-ec4cd947eb2ee3103554ccf8c30febe7.npy +03325088-78412afa26ae9e4d76c18e71fd49c4dc.npy +04379243-82d1c45956b00636b7b774bdb9e14e53.npy +02691156-44e08106211ff2596ed8c57a1980bb26.npy +03001627-747667ef89d03f0dc79b7c4f72055bcf.npy +04090263-8f4a280e59ed5fe859360964d7fe1813.npy +04530566-69c4fbba77ee7891a3c3bb12365964c6.npy +04256520-7cc630a72eca68c0457ba044c28858b1.npy +03991062-9bf2153c2068fd39a2c59a4d90e63212.npy +04401088-c28ca490e5e7d104b1508bbfb8b56edb.npy +02958343-719a65d25f0f97b22935bed12a852dcf.npy +02691156-a6aa2281ebfd822e9b2acbfd8323f804.npy +04379243-2d22f3f0723011548aaae3d020f5ddf8.npy +02808440-7ec638ee1fa35cbc125fa9990176f0d5.npy +02691156-3a7e396786751f544c3a35cee92bb95b.npy +03467517-ee434f96e8398084a9edb43ba009e64a.npy +04256520-450b2b913495b73e9069b3c9aa123329.npy +04379243-7c7e0d1157c727371c7fe5be55ca5cfd.npy +02933112-13a42286f65c8b559f8c3d2002c77ddb.npy +02691156-471f072ea9d51f639d92b4de623f5639.npy +03938244-5429faac916362e185bc264270ae0601.npy +02691156-a849d4325008fbea85dfb1711fe4ff6d.npy +04379243-5026668bb2bcedebccfcde790fc2f661.npy +02808440-ef39099e75d450b46012ae9c733eecc.npy +04090263-7bd6db14ec6c37efeac2c9f41d1276bf.npy +02691156-758b67f9af18602715aa5b227c027ee0.npy +04090263-2cf699bd28ec65dca58b002039bd187f.npy +03001627-4d6107c32c75ad6b9f4b4145f6688869.npy +04379243-a5230f3ef20e6d460a7085510f65cd6.npy +03001627-9233077bbe6926c239465fa20b0ba7fb.npy +02933112-31590e22b5abce1191c352d02061b3f7.npy +04090263-b26c0df3e57ab7a298a1a2453e72ce7a.npy +02924116-a079073bee81509552470de2774d6099.npy +02958343-b51d8c15d8f603c350937622ac92802.npy +04256520-793aeb3e33325c491f4fac9ac5e71796.npy +04379243-a00b79f779bbf4d7bdfce662c3df88af.npy +03991062-6c683fac62caf6c23b0674ad753b6090.npy +03001627-a6afbf5a5eaafec74ccf4672ec1e7efc.npy +04379243-73bbc651e2d6eb22ea65c47b660136e7.npy +02876657-1b64b36bf7ddae3d7ad11050da24bb12.npy +04530566-528689641a6562e7bd7a55708242b1bb.npy +02958343-ce375f51744396e52a9eb0f146e94477.npy +02942699-b42c3da473bb4226dbe4bc54590e1d59.npy +04256520-a8395165dee1adafe0c381fdfcdec36d.npy +03691459-6e97134cd7dc3067c24c52be855c1525.npy +04379243-5b109b578e82cd4f40ebe9b2fa95ae8.npy +02691156-a34a6611fd6b2451690ce339b831e7e2.npy +03790512-13a245da7b0567509c6d15186da929c5.npy +02801938-f8a8501a980f1688d5f9523b8b36563f.npy +03001627-7139a30ff80da3a6b12dfa50fc9e07e6.npy +03001627-35053caa62eea36c116cc4e115d5fd2.npy +04530566-dd4b3fc340bddb7f70adfca72a15271b.npy +03001627-73b7d6df845221fa9a2041f674671d05.npy +03624134-1f8d5050facea8cb7e0660626012c911.npy +02691156-e430f24c3125997339cb1b92881e8e76.npy +03636649-be60fdf6e4c9e45fdac42bdc1d2df4a3.npy +02691156-53f0e2f6671346ae5ff3feb917a6004b.npy +03001627-9368cd9028151e1e9d51a07a5989d077.npy +03636649-e8568e17d0fc6418e6543556f230fe9c.npy +04256520-732f5f4226ceba1e593ebeeedbff73b.npy +03001627-b9f80c27c118564a9a318f18e43edb72.npy +04379243-d63496bc51de5d77e3837ef7356e7613.npy +02691156-5d022668941c6559b0ed23034a67f7f.npy +03001627-b718fe66075a7c952af70677c0b21b90.npy +04379243-fad62f2339aefa8f9d86e5f05f1da2b7.npy +02691156-f680ee392bad2dca29348d14ca881f7d.npy +04401088-83dedc1afeb57e199edca1fee171b669.npy +03593526-f8ba5c5c9530a2d43dddf957f22bddb2.npy +02828884-9b7b628bc8cc7463103d45b529610c5c.npy +04090263-6e4ed358feb31feb27c767f081f1365a.npy +04379243-38ad5333308ec5b5f4b6538438a0b930.npy +04530566-eab41e8a5c5fbdff151300a2afaaffe0.npy +02924116-4293b7b9281953e74aa94fe75fa150ae.npy +02808440-d8c81bf718d534776b448b8aaebb705c.npy +03624134-c4851aee1af7d874cc34b900bb2492e.npy +03046257-f2d0906afe91c7ceff3e00f1a386bbd4.npy +04090263-973a961200eb14f1a64fa3a308f2f098.npy +03642806-9728d5d4ba7fc664aa4473b82fdc5099.npy +03001627-e9a16aa9d2ffdbe174cc0d9ee0d1e8c8.npy +03797390-d309d5f8038df4121198791a5b8655c.npy +04256520-e09005010542d8193d28966b7ef7a935.npy +04256520-3a44efd1fd14ea66dfa4ff010b8b9d1c.npy +02828884-8c6057a5258539fef155d75bbf62b80.npy +02691156-91f3ccba290da90671d03b466c72ce41.npy +04256520-1d19f508f104e881a239479de51795b2.npy +04379243-bbae4abbff206a2a14038d588fd1342f.npy +03046257-1d476f6d585baf62e1292650537a7c1c.npy +04379243-2e5d2487b7e1b708e4f659f0755a47a.npy +04468005-ece4c9bf30e601575068939b1e366148.npy +04256520-1193da9a06f87fd6a0064771a6f2cf3b.npy +04554684-6e606fb36a1fa72370011ebcb36fd95d.npy +04256520-4e25ae1d1ce18c4a40ef1c8b63a628f9.npy +04530566-f4aa1a1c7216fdfcd3d8a17e1b074875.npy +03001627-d50c5777a2727679b247f6fe3b8f7af8.npy +04256520-e8342d53ae929341b6feeb62eb9d939b.npy +03593526-6488a88563cb1f3b2dcb7217e1ed4196.npy +03691459-3b6f73cc36cdabd2b3b44ad99a214777.npy +04379243-16aca29aae2d252cb8372f06f79c32ca.npy +02933112-e22f10f551cac7fc6cb99ff1a702c4e9.npy +04379243-3d6e337c521f73f3fe222bdfe4498489.npy +04468005-923313c1b085c415706d1c54190f27a.npy +02808440-6f1c542f24b8e50554d7082b34825ef0.npy +02691156-4a21d3920b11cdbf1592d7a04a86fa53.npy +04530566-7aeadfeb93825b387b3c166137b0d772.npy +04379243-1d6e0462e30692d8492d9da2668ec34c.npy +03085013-fb6ee1aeefa551e188e2183678696c9a.npy +03636649-d1dc19013dca2182536407ae4270b9be.npy +04090263-b65ba6d3f77ede2d79aaabe4686a1aa9.npy +03337140-ccefab3547696e1791c352d02061b3f7.npy +04379243-e2930bd9b16db2a80d6227ff9b21190.npy +02691156-9267c510247327a2297d46b42718e32f.npy +02933112-7941cfe08a5288337a3bc7b2417286c9.npy +02691156-6a242ce20c44e82bcc14f1e6f4f4f49b.npy +03636649-e7b9477eaf6e2b64fe755e3418b63110.npy +04090263-8e27088dc71b89f9faea005b8f19889.npy +04379243-337479a0afb08dc91933ffef19678834.npy +04090263-74b14a0da86ff0b6e1f2a1daf140ac9f.npy +03211117-e4f34d5f5cc64a85f2e5d34c7b677bc4.npy +03991062-620fc0a4a978ebf870e620cd439a45f6.npy +04530566-99102724561012729ebc23acefb248a.npy +02958343-a166f97f10557feae7a7d875eac9a93.npy +04256520-4b139ceeb56ca3a1991d32d5bc1065a5.npy +04379243-db9458fd1459982347b1b3e368e511da.npy +02924116-6a202c870a278b131db751af8df870f4.npy +04530566-b1b5e16d0c96f34c46b7a006accd201.npy +03001627-537c7bd16e8a00adbbc9440457e303e.npy +03001627-a7154b3c2b2a0641a9fe1734a6086750.npy +03636649-6d8cb53f3b1cd94a4da9b199f21864cd.npy +03636649-3e7ef877f826230dedde7b5a5ea6d004.npy +04256520-28ce909659a826d1599dcc439b161a52.npy +04379243-fa719ece51c607383f3fb2f375c18a84.npy +03046257-e37eff8f127dbaa9902a571380e15334.npy +03691459-67967d0213be8b199fa004564ade09f8.npy +04554684-8fb4749a25eca524cba07fb2573fff75.npy +04090263-a4046d9996609d50b8b37cfdf060fff.npy +04379243-fa4d09b10928d8322685733c782593df.npy +02691156-ee0105d05a5007ab827afb33b6d5eec6.npy +04256520-15d59eaf24645f501030665054ebb2a9.npy +03211117-ff62121443345bf76cff78602fbd834e.npy +03636649-2ceeb17225f4e460d493bfe20f94b6ab.npy +03001627-653c0f8b819872b41a6af642cfc1a2bc.npy +02924116-8abad4c89c0a7333a6a511745136dc32.npy +04379243-16ecdb0dcbd419ce30bbd4cddd04c77b.npy +03211117-8399366b1dbe22edcb349a60fd15aa15.npy +04401088-407e5ee21fb23fd92ffe71e0e78fe3b7.npy +04379243-1f2fe0bf66eba0b03968da786c4da00c.npy +03642806-7a4342f61ed7b153341aafe10fd0cbd4.npy +03001627-54f13fbf4a274267a50b88953d263a42.npy +02691156-2c9e063352a538a4af7dd1bfd65143a9.npy +03211117-d5b088ccd7d1a7ba8e2d66cbf6a91063.npy +02958343-8fdc090f498ddb39f63ee8a34069b7c5.npy +03001627-cdfd278e8b1c11bfc36d58d0f13497a0.npy +04379243-45b4df78e3cec0d99860e9353bb52a1.npy +04256520-8d91786e13808f73e4248277d408e4b7.npy +04379243-ebc82e7df36f6e9a33963916b86d221f.npy +03001627-4cc17e003a26a3d5eea9006d9d8918a7.npy +03325088-27588aad5d5bda1fcb6036d6e778885f.npy +03325088-e8d35278a035f50d14b35a7d7cea7130.npy +03001627-17b77403b80de623f1783a44a88d6274.npy +02691156-165c4491d10067b3bd46d022fd7d80aa.npy +03467517-913f3c90f5b78256e98e318d424a4bb9.npy +04401088-74dd744f5c5b9d132fb56cff2a0f826.npy +02843684-a36e1456c6d68281132a08135eefe76d.npy +03001627-d6dd3de6d6ea6d0b1931ace01cf1b948.npy +04468005-3df90286fb1158115ae1d71af1bb3fed.npy +03467517-cd80049dc2c99ce0f75374472ac71de6.npy +02958343-8c2430564a8e3a2354277bd8a941f068.npy +04256520-f05f6b3e7c0afdb352fc7e973ba7787.npy +04530566-606b512701e71ef6fb80910115d3c39f.npy +02924116-42aafaab0612f10dbce4c69e4f1ee611.npy +02933112-acba82ca76cb0201774bc00c294ec5e4.npy +03636649-8cc8499cdf11e9fc1735ea0e092a805a.npy +02808440-e37fc3b3ec688a44a451f23dc98be5f0.npy +02958343-a49041daedac3ecf2fdea40a56b4c57d.npy +03211117-df35d335e76abf5618ba239e198ef2ba.npy +04379243-1f267da10062622092018116c595a95d.npy +03211117-ecb3d57cc0e8018f3f6b4923416758fd.npy +04401088-2163366f7c3a7a0e6c63b8b48495261a.npy +02992529-17d4ef9fa59ede481cfeae953cc2339d.npy +03211117-d9b7d9a4f7560f6ffa007087bf0a09.npy +04379243-425ccd56a558a719754784b56fb4c23b.npy +02958343-d000ef0c691489c9801b0db1d49ea10c.npy +04256520-ece3f9c071f7ab04bbc7a6acbd8f058b.npy +04379243-5fe429691ecc5f0311e6fe968f9f8b0.npy +03938244-7c1194c82d28663d7d910d51d878f708.npy +04379243-63ca298a0bc7dac4d1f4a577576ffb5d.npy +03790512-86b8e4e5ed18fe082a45a87054fa7272.npy +04530566-93304640e3a2a60d611cd70ef25f5235.npy +04256520-664a84b65396e168707aff99601b0e71.npy +04530566-c6e36ffba5630fcd7301f2b895d332ac.npy +04256520-93b421c66ff4529f37b2bb75885cfc44.npy +02828884-6a237c1e61fe2bba8490246570868c8d.npy +04401088-72e61015d1e4fcee8739b6dd0f9695f.npy +03001627-9343df9a7ed6cbba1923501fcdd899bb.npy +02691156-a9545fac33430c6062347b4731688b0f.npy +03797390-c7ddd93b15e30faae180a52fd2be32.npy +04379243-314f35827359105d6faea4ea390b4428.npy +03001627-ff546450fb0bd81f6e7c5546c1dbd220.npy +03001627-c5d880efc887f6f4f9111ef49c078dbe.npy +04379243-92bfb87451cca049febad4f49b26ec52.npy +02958343-9e52d425db48a33bbda733a39f84326d.npy +03001627-b9908906f1e1f65b8e800d2aff155191.npy +02828884-ca21ae1c48c020db1a7fdfcca5768f88.npy +03467517-7eac9185f94e7be35fd682b25025f90d.npy +02958343-5e4a1ac9bdce2766473f10e6caaeca56.npy +02992529-901a0180abe1011b3c629b56d283e7b8.npy +02880940-e3e57a94be495771f54e1b6f41fdd78a.npy +02808440-47f169c6aeebd2665f9b40f981270a7b.npy +03001627-6f70a7948c59b49943da6ec23cebe068.npy +04530566-7bfd756573de367176098e230fa177d.npy +04379243-7a22339a0b7dd26aee088de33038f12a.npy +03624134-8d777e28695e8bb1b036a5cd72ed9d11.npy +03636649-551bec14757bd4b27b79156a61ad4c01.npy +04468005-9c1dd6638cbb2ca05ac4d0d3890f2d0b.npy +02818832-e7d0920ba8d4b1be71424c004dd7ab2f.npy +02958343-5ad82d706e57607ce4b68d3b17c43658.npy +03001627-9c68011042990da3abe36bab1da1fa35.npy +02801938-9d0428e82fee9fba50da8b99982a3057.npy +03001627-2c14e910ad4173a898d5fc0473d00a1c.npy +04379243-98bab29db492767bc3bd24f986301745.npy +04379243-4058207a9467712966a503e0f1ab5917.npy +04379243-9a1312e39df01dc1d44683cb4ca416.npy +02691156-9c7395d87c59aa54a79f2ed56427c6e6.npy +03513137-709348783d9c30c970290a7176ca24df.npy +04379243-cd0581de9bae7c6c7d1aee311ce12c70.npy +02924116-f08b481b079d9c18ad19b94b8069bb8b.npy +03211117-ffa987a79bc96e869e23f6fc87a31098.npy +03325088-a2a6c837e09bffcd76c18e71fd49c4dc.npy +03001627-2bf1fdef16967a929753496ba23f2183.npy +04256520-e3992b75b446fb5af7c7ad2549a1b15.npy +04090263-18fdbd5f5448e1eb9556d0a8c8dea494.npy +04530566-bc9448e22c2379d487f08fb94cd2785e.npy +03046257-332ef2906bb304e8b0aa15078ea6f391.npy +04256520-a841d5d39c5ddbc28ec45320afaa5d0a.npy +02808440-44bf3d065ab35d43b362845c6edb57fc.npy +02828884-94bd6118c10de515d201085e80edb26a.npy +03467517-2d767b3fbb8a3053b8836869016d1afd.npy +02958343-83f26e6b8298c3a0a134736201a79843.npy +03636649-7603ca578be87f24b48d582908a164ed.npy +03001627-6e9a3650b8ff39a02dae74041d029566.npy +03636649-1b35827236954b2bb6436276138aac1.npy +04530566-d8ea840a28472e04954c06f15cb2b5c8.npy +03691459-58d0623bfc9043965c3fc20f066d524.npy +03001627-5042005e178d164481d0f12b8bf5c990.npy +02691156-47fe79cbf9d6ef36dc3607950feada54.npy +04460130-92e4cc97df1ebe141203ec4ca6ccf208.npy +04379243-d5d7324c2233d6edf51f77a6d7299806.npy +04090263-18b4acd3b0809e6fc14e2939682bc455.npy +03001627-287bce5664e168fd744dcb8aae5f2395.npy +03001627-2a28a1658e9b557062c658925896f75e.npy +04401088-16ac60220ed738901cfeae953cc2339d.npy +04379243-a713adfd7d82df5bebf5869836d37497.npy +04225987-463434d2fcf567d56a93dc68b4021dbb.npy +02691156-1c27d282735f81211063b9885ddcbb1.npy +03001627-7d59399c37925cd7b1b9d9bf8d5ee54d.npy +02958343-8e7475bb6c54d39f398bc3e9fa82bf3.npy +04379243-40a402e1d949364a104ceb84075e40d6.npy +02871439-5f1abf912782e0d7350be33372161c1b.npy +03001627-3d267294b4a01900b04cb542e2c50eb4.npy +03759954-e989a2cffc4d967bd80ce3f2fd66be0.npy +02958343-398a791990b106dda5a4c80d90b70728.npy +02747177-2ce9c6ec2d071187ad5067eac75a07f7.npy +03797390-896f1d494bac0ebcdec712af445786fe.npy +03001627-ec5d90a37ec99980e2b417d08f69e019.npy +02691156-6459a6977cce8f8789b0d69aba91f1ef.npy +04379243-9928c36919730b927c077130cb57dad.npy +04379243-d7d732d0ad7537eb610c2a68437007d6.npy +04090263-782f3821e6b638d6fb6bde4b7e6c6613.npy +04379243-a31867914b71ac40d776c08b6a3d0a38.npy +03948459-ca012a47cf5efca23f9d84f9a87a44e4.npy +03001627-dfa7aa13ee696833593ebeeedbff73b.npy +04379243-16f603525c5ce57b23f7198a00163bb6.npy +02933112-45039a5ac0912f8523d871b44977a702.npy +02828884-68d603f0483f4f869bd9ce04b3b1fd54.npy +04090263-76d55781aaac09f918b61860f81c82f7.npy +02871439-959c45c154559acc6e1ae929b00acbc4.npy +03636649-99ab3dce10653cb7f4525a0066419a00.npy +03001627-cb78334a5ad9517d7a31dd5af93fdb5c.npy +02958343-bf652fdb40c4cb3696ab9df3b3d7537e.npy +04379243-82e4990a3a9290f33ffd3a8003988fa3.npy +02691156-6e5810d6fc96e4a7db73445864b72015.npy +04090263-253bf52d80c11314c7d00c29d97b78a9.npy +02691156-c0375c2ce28292d9a179137acc8d4437.npy +02924116-2ddf7274d729c372c98c13d6112727de.npy +04090263-e6017a1e15095b4e6314c3b6a3a65519.npy +04090263-4929111d16135ccf613792009f64ab4d.npy +02958343-d09039d34746615fbb164ad50a9faee3.npy +03001627-2cf7ccf97b09187fcb7547c95fbdff26.npy +04401088-3ff176780a009cd93b61739f3c4d4342.npy +03467517-ef4fd97b0605d39d3f1082c2ac460e88.npy +02958343-36f17730152ac28116abce8cb03e7794.npy +03624134-102982a2159226c2cc34b900bb2492e.npy +04379243-95a7581a491d3706996336ab975e6575.npy +04256520-ebba3b7239bd43cbd4fd21ba7448467e.npy +02691156-53edcc6832e776dcca8607f540cc62ba.npy +04256520-3eb9e07793635b30f51f77a6d7299806.npy +02691156-d01da87ecbc2deea27e33924ab17ba05.npy +02933112-d3759f1bd6dc9652f51f77a6d7299806.npy +02942699-73b02fe7b4b2e45f74cd541b34c6124.npy +03325088-bd23c02e78913855b362845c6edb57fc.npy +02828884-3b7fc97192e483ebb0bf045ee98272fc.npy +03991062-5091d2d8b43472ad4182a764d1311955.npy +03948459-a2ae72e791228034e209cfa3a83f54c7.npy +04379243-a54eeb7ca4dfe0bea71c812e027f94d9.npy +02942699-e9f2c58d90e723f7cc57882dfaef8a57.npy +04530566-24a0d85f723fed2d7f332834f123f44.npy +03636649-32a196685d10bfcad7811c9daa943fef.npy +04530566-30cf2b36478a21ee701c1f58e22b85e8.npy +04379243-fb91ba29b46a519f8f37c398c1a74a0f.npy +03001627-94464e51e6f3be07f9443c9263f2354b.npy +02691156-7cfb337744133ea1bd46d022fd7d80aa.npy +03691459-9785f01a6ee36e6d874a6a37ca17d9ff.npy +04090263-4a9c2632d6055fed735fa1ab17311ec.npy +04256520-8e61d151220b5397970d4dd67731c543.npy +04401088-112cdf6f3466e35fa36266c295c27a25.npy +04530566-d45f39e14c365801892294bafc22e040.npy +03001627-a1734a851af178bee15475f0b1eb22aa.npy +03691459-d337b40eca9f87259fd3da8ff7252b25.npy +02691156-d220ffb04a5ff31abd46d022fd7d80aa.npy +04379243-ccf3a20e438ecb09384512f195951058.npy +03001627-8daeb5877bba8cf5936c7265c890fef.npy +03001627-36843ea8984df5a63719086e0b4ab8be.npy +02691156-530d0edd6e2881653023dc1d1218bb2d.npy +02958343-d2b847baf4a6d1a5ff1370452e3a0154.npy +03001627-22fe855981e97ec5a1bada754e9e91.npy +02828884-c541d59409647408ad5067eac75a07f7.npy +02924116-98ab95c8a34196e1894431539dc5c19c.npy +04256520-1dab0c0c72f9cd6f593ebeeedbff73b.npy +02958343-7c0bad8b2b62cb7c673ddeabdcc8c6e.npy +02992529-f1b9de7276c1b07fe5562f06ed322f7e.npy +02691156-cd9062c0065ee3a4727e0d1e650e3b69.npy +04401088-6adb3426ac55ba827efa8dff0d683ef7.npy +03001627-c16a1a47bf34a84d157e7edaf1e3e602.npy +04379243-e3cb6cc8df6f7390d1a63a2e2039ff73.npy +04554684-cccfe2cec3069c449c72dfe3cb318a90.npy +03001627-3d57e65ff4cc42df70a7748e958c62a2.npy +02691156-8ff8f3c845e7ae8443afdb9c81ff2967.npy +04090263-809d2439412bcdac896cb6094e2801d6.npy +04090263-ee5aede335490e0f76b7c600f9352862.npy +03636649-295ba9410657325f9d7f638b2b2e0564.npy +02992529-41f5caf37dafdecc5dcb6feb4bf8ce13.npy +04379243-a9a81543d5297d13dc20930e6fc85682.npy +04256520-deb0889d902f08bef51f77a6d7299806.npy +04330267-bda4558e0312ccc174dae1b41226ef1f.npy +03001627-2a1d80a0aa67ee7585d33ad8f24c4885.npy +04379243-5aa83cb8217619d9ed8de30c53213f6f.npy +03001627-ce074e18e988a481d082d95e9bd50b49.npy +04379243-272a4cf3cfff3eb1e173cee47fbaa88.npy +03046257-5ffbd3bcc935279a8cbe149774a11d9c.npy +04379243-e35775e1f550d3d65339eb67f6086a2b.npy +02933112-47344f869d6c12e486d53ab0fe94e911.npy +03001627-593f7c848e6246ad8c37cfe791015e2f.npy +02691156-e431f79ac9f0266bca677733d59db4df.npy +03001627-5f30af30db19dd23afd330d4b2aa45c9.npy +03001627-5c247c042e5fa6077b712dacb1db0737.npy +04256520-3c30c45a5ba3b535f564f8e3eeb8449e.npy +02691156-54066a3cdb79ac8fa5cbab5aded19a14.npy +04530566-bed3fb84c9b876f930d7c2b672980ace.npy +02924116-c7547c076d6c51d752470de2774d6099.npy +02691156-6fe837570383eb98f72a00ecdc268a5b.npy +04256520-470dd8c92aa1b9ba593ebeeedbff73b.npy +04090263-783e6e45a8b4125b29ac2ce4d16a7d50.npy +04090263-389370f7e03b6312eb73ff4c9e061b8e.npy +03001627-5b0e833cf2ea465e42bd82e95587d8af.npy +02691156-461891f9231fc09a3d21c2160f47f16.npy +03001627-f93bbb0ae5d66c075fb57c89160d1cb7.npy +04530566-3d33ac667a885a1a7856807e3e4b01ad.npy +02958343-7b067be3aa39b1a124853ec273f6c1d2.npy +03001627-780aec25d416fa07ca9b40e76e725878.npy +02808440-3bbf438a17d77cbe3321831d2245cf06.npy +03211117-f3a03a173932c42b4b9b715645ffbf22.npy +04379243-b1850a02aafbca6aba18ade30e563d37.npy +03001627-6af67c2dcb4c38bc67f0a77fbca7cda2.npy +03046257-4ca5e78eadeefd8651c1709f78d865ba.npy +04379243-9f56c17cafc1ba35bcf7c2310bd3f83.npy +04090263-b6cd61c71fba44d512b38b1d99376c0b.npy +04256520-4cd5a2a90a9bdd5eec2fdb822d0e9d44.npy +03797390-7d6baadd51d0703455da767dfc5b748e.npy +04379243-2b1684e4cb37d9e8ab541fe336214393.npy +02828884-4cd23aae912b7de019fb4103277a6b93.npy +04256520-6a62d0d3c8eeda396ba836372832f055.npy +03001627-e94089cce370e7d1aae894b47cf9777e.npy +03691459-82b9111b3232904eec3b2e05ce8fd39b.npy +02958343-45f0ea3cd0df8624e341b5704aa568bd.npy +04225987-792953b4101753c6ed3696d854eee1ec.npy +04256520-725041f78f7c4274515d5d6477915e98.npy +02958343-93942ab3fc970415c596a26318046886.npy +03337140-c328da20f2af4eb14c3aee8e9d3a6ffa.npy +04256520-b53bbce3774bba2f5ade1effc174de.npy +03636649-7a1d06ba4fec22e8dac42bdc1d2df4a3.npy +04379243-645500232eb286aa8f6d69f1a6681149.npy +04379243-4bb4904b8f4c7f8b0e5927ab4191382.npy +03337140-2731349879db84fc24517c38da518f49.npy +04090263-d05f6ac929eb1019f5cbed688a0bb106.npy +02876657-7f5db4889a433ce5e7a14f6d159dcd47.npy +04256520-4c6f6eb326716c8fc71d1873c074ffe5.npy +04090263-3d0b35ba89b8c600efb47d8e2c9f3b57.npy +04530566-d7fc7ed59558b7b3f3e39f2e17005efc.npy +02691156-6859dc976c0528a831fec775e1dce6b3.npy +02691156-67a6b5b12ba64c529a6e43b878d5b335.npy +02828884-d23ca8dad2064c4ad5067eac75a07f7.npy +02828884-d3a5134df6cd94e2e8db995f7899d418.npy +02828884-621c4fcded12fff2d07d128adae16ff.npy +03636649-5c5119a226e1ce9934804d261199e1bf.npy +03001627-6ec4d5fa96861bcd70311dea98ba710d.npy +03001627-8d2a4106de2e0e9f952334e469766710.npy +04379243-6a3e7d05a7ceb4e1a3df3190f4f32918.npy +02691156-c5143d3be7f1d0eb27745e9b6b461e93.npy +02828884-7c3314a24702128d19fb4103277a6b93.npy +02808440-5bcca919768845bdd0043cfa915003ff.npy +03593526-3879379848c2c0c55b2f23b9c7b146a8.npy +04530566-dcaf4238da8ef379106f24d0bacaba69.npy +04530566-6737f75bb87e3cc0847c4e55bb965ab0.npy +04379243-8d9e1624c85dc88621bdbc0445d9f748.npy +03624134-7e0ea29ff4fe153fee2a04c68bc263be.npy +04256520-b6694e5bb51f8861f51f77a6d7299806.npy +04379243-bc6646a52843dd63474659fc572ff56b.npy +03001627-ce1237c5ad42dd7b737a00f007529fbf.npy +03001627-d409dbda0a34a953c9020fbe6b2ff6.npy +03001627-a2eaec61c28670a459b42406a4cdc4b3.npy +02924116-54de13044a09529b3b16ecf86da2e780.npy +03001627-c54aa12a3d8c34e2efacb264ebf1ec75.npy +04379243-335bf5e7f636ea198be1375d26d1cb89.npy +02876657-46b5318e39afe48a30eaaf40a8a562c1.npy +03001627-3a5c8d46fdc6793b956abdbfba57903a.npy +04256520-53812514f0d50568efc579970fcfc006.npy +04090263-74a38b74bb57a2af6a405aa597e7fe24.npy +03001627-fad907934656c52ba1abaa6eee3840a6.npy +02992529-4a7c0d263fa0cc119553267f4c8c48a8.npy +04256520-f01f6f88519a58e0e015ffca2672af29.npy +04379243-1abed35643d34f60afed86cbd9fd5335.npy +04379243-f5f7ce79ef61e0ff3f0ee3307f850b4c.npy +04090263-a51c1dcbed07d1de27be842e82df28b3.npy +02924116-9af22616a6b5b59326fc4e4686c940b.npy +02808440-9a4d71b2741f45f3afc9f2442d869509.npy +03001627-e72bad036bcc04ea3f68fa735d443de2.npy +04256520-3ce2794845ba4bff5c63d035d2a7c889.npy +04379243-b7bd6522f540436c23500a5b036df62e.npy +02691156-f7110ecac70994a83820d8f180caa23a.npy +03001627-82979f3a00ca7b5b0003dd98e70da8e.npy +02691156-729aa8cba8e1398a43afdb9c81ff2967.npy +04379243-b61984e31dfb04c1d1d031a1b745cd85.npy +04468005-45920718b96cb262ddbeb5a3d249400b.npy +02933112-c11449b64486b4df4240b2500b599345.npy +03636649-7b53493f7944fcf2b691e708071fb777.npy +04379243-2e2a612aaeafebd5ea23ec7dabaae1fa.npy +03211117-bdb87409ff3ba876cfc4c39af557e76e.npy +02958343-ccccf7342390d139ff1370452e3a0154.npy +04090263-305a895b0b06808b9d5aeb7097eddbda.npy +02691156-39ae262853031e42aedf20f7099e25c5.npy +03001627-fd5492b732f41dc3f7628281ecb18112.npy +04256520-5d9f1c6f9ce9333994c6d0877753424f.npy +03046257-4d804d5f4e5d87e88d84bad46345484d.npy +02933112-1ff28690a2ba31e4da5feafe6f1c8fc.npy +02801938-5c3dcc9b312de5b5a5d9ad16964840ab.npy +02691156-b174db77afdcdd055b2a16b1d9c48e6b.npy +03001627-52d687e4f4c59dd72535b68a1251d8a8.npy +03642806-a01beb9be51756f3a507c96c993b141e.npy +03691459-3dc77d756da1ff5eb3b44ad99a214777.npy +02992529-bdcef95e8efb2665408f0e810863705a.npy +02828884-c104f4e4a21ef8d42c29915205c35b65.npy +03790512-8bf620bd023c602b74f7bf9c15b075d9.npy +03046257-31d2d0a213bc09b33c2e50348f23d3d.npy +02691156-bc2c90ea00831423908b15214255bff9.npy +02924116-af060666a0e474adf59ad08996c77e8.npy +02871439-d841664bb8c7b842cbf15a79411ef31b.npy +02958343-fe860c6a74a86905468bac13e007a6e9.npy +04256520-22f89fd9e2a9f1a6bb6bc0db07c71e8.npy +02808440-61a7615cde3ec86a2cb48639eca80132.npy +02691156-5aeb583ee6e0e4ea42d0e83abdfab1fd.npy +04090263-4d772170bb26d40ea36c408ff083fee3.npy +04379243-9aa0b98bdeafacede76bc197b3a3ffc0.npy +03948459-74264c103701bcc23baa63499ddcb388.npy +04379243-3d7101bbd994e2f5296ea8292ef2edbc.npy +04530566-aba35304010a7ca093f1a6337ed3a54c.npy +02828884-2e2518a8a2f335ae76bc197b3a3ffc0.npy +04379243-23506d31a9ba77201b54d8d0b255b88d.npy +03337140-3bf437403138e6c9aa669fbe8e7a7c4d.npy +02958343-1ba30d64da90ea05283ffcfc40c29975.npy +03624134-ae7744b9e5bb5a11e9ff7117715adddb.npy +03211117-3899bd2eb8f9e9d07e76a21e51d48a61.npy +04379243-58bfcc581879c121b20808ae6de0ac93.npy +04379243-9ff98fa1fd750053cf853995b84c068d.npy +04256520-45963319edb54bc0dcb4d348d782a96f.npy +04379243-bd14692fff933409856ce0c2a704bc40.npy +03467517-a7c0bad6e907cb8793f0194265a9746c.npy +04379243-cf2ea610fbafece363944951133f1c85.npy +04379243-bef379d51df02d5fdbcb30b4afc25496.npy +02747177-37c9fe32ad87beccad5067eac75a07f7.npy +04379243-ecf3f077d30540fe5d5ac0a8c21f0bd4.npy +03636649-3c4d8c4ebe9dedbc2cd2160e449d45ae.npy +03001627-1e0580f443a9e6d2593ebeeedbff73b.npy +04530566-135a15f938c824ff90e2484c52623a2.npy +03001627-7e2b07c0ebc5781a297936c81e7f6629.npy +04379243-7e1d0214a916543b37b2bb75885cfc44.npy +03211117-7467b25f70675892d50c22be0354e623.npy +02924116-3858580452682f43ac1817b697e11672.npy +02828884-f57c2037fdae635b29a9b1ca9709749e.npy +03046257-32ace01a69fa498e177ef3150c947f22.npy +02958343-e9c5e6d46c47129c5b72003cd427d0c1.npy +04379243-6d09606aeb54b55659a44e6453790000.npy +03991062-dd2f38a2acf5334781cf48bf3eca784c.npy +04401088-c56262f4a6a7fbe5fcae16e8230396f7.npy +04554684-73425393306ec8cf46d396f47f99de3b.npy +04256520-98f43bc0ca2c510ea12caf23554642ba.npy +03001627-d31ab2866270fb1c19fb4103277a6b93.npy +04379243-8a63086a3c861151ce2bbb5a9dafce04.npy +02958343-3c97b002e510db11e23d60a1b706b44f.npy +03001627-4607280c3a4286b7319c7c751f273141.npy +04379243-214374134d21f90354482522828e74ae.npy +04379243-c2f870eebd0ac7494719088c8e42c6ab.npy +02958343-791e45f93e9ba58071a126804ae24042.npy +03691459-57b8d08d37d835995d0dded52efeb4fd.npy +04379243-fb4d877cc4f2c63b20768660cf080d12.npy +02691156-300a0c78e402decd7e67bd3e242c324.npy +04379243-f84b49a7d9e6f31ae0c8359faeb78bbe.npy +02691156-ffce3c994052ffea339b6c8cc24f619d.npy +04530566-61df71a58a9d0161202de8d12c6f7633.npy +02691156-ebd991666f177f8f575bf8a4b14be4f4.npy +04379243-8574daf4d23e75da042d36b1c1b84.npy +02691156-2705c3edd082f0987f1f82f6fc8747b8.npy +03797390-3c0467f96e26b8c6a93445a1757adf6.npy +04379243-7b411de42d4960eb6e25f3efedf6785f.npy +03467517-1860264e320c7979f4baed97c2afc4fe.npy +04379243-b48d04aae94702504b3c42e318f3affc.npy +04256520-d7a7bb6725ac5248febad4f49b26ec52.npy +02818832-f6d07714c090b2afc6c1b30c2119b092.npy +02828884-1ea895308f2aa98f966097adcefba56.npy +04379243-83248f27f069f0fc8312881285c04cb3.npy +04090263-313c2f35e1c461219f433921788191f3.npy +04256520-8f71670ddaa954c963860d683ccd0da.npy +04256520-7b76ae65480d1312538c0715f23f94d7.npy +04379243-1949b4cd6b88fa0713a5873d239ac557.npy +04379243-9823679747e563b4d42b9650f19dd425.npy +03001627-60cbca441e3f062444ac83b3e97ad658.npy +03761084-ed20db84209663b0c22f3fca4a074c25.npy +02691156-e59c4f290d8585a862b600da24e0965.npy +03001627-2b4f2fc77c47056eaefb25a27e962525.npy +02933112-e4523c675fb6a103d08b0f17fdc8a28.npy +04256520-b5c6ede83e55d05048f174663905cbff.npy +04379243-54f4d28ee9986b329a1a0970b4896ca3.npy +02808440-e3779000fe8c6805ccd0340812259a39.npy +04379243-3a7fb4cf118c30d36f3d2b1b15fba494.npy +04379243-dcf246280361e20d1bf2b66b52bf6885.npy +03636649-b0a3cf1e09f7a3591c1ef519b9196b63.npy +04379243-22add506f2a09c8dab93f6188b226527.npy +03467517-5d27923586133803ba3161efeed0ecec.npy +03001627-228d5702c588fc1cf7628281ecb18112.npy +04090263-6af8538d532e44237b1f1d03ed22f671.npy +04256520-c474bd0e12d386dfe25bd42000b74e3f.npy +04090263-7bef98c5eb45b13c6c1e54aa8170142.npy +02808440-f1395152e42dbbb33321831d2245cf06.npy +03001627-ab62680f067bf94dd6a6b5838ef6b356.npy +03001627-e04ceec8711a6027a6e27bc066049db5.npy +04256520-a32e10cb422cca67eb9f96cccd63af6f.npy +03001627-31fc10f348cdd2f77f754cef9da1323a.npy +02958343-2bfea38242ba63cce77aa0b62eed1492.npy +04004475-79281796bae975956751803240e2d3aa.npy +02958343-1104f0924e03f2b6fc5886e868449015.npy +04530566-3f3912cf68cd28eed7259ae7450dc47b.npy +04379243-a47fcd8bc5aa29dc998473a1ceac4e95.npy +04090263-f79014425f660bc4d93d9e447c233c3c.npy +02691156-7206b1f248826f2398b39d2f77aef0eb.npy +04379243-2eb880249672bc2386b647696ec80093.npy +02828884-b997659a319cae6369923f7b2ea9aba.npy +03001627-79be636f7f6b66724fde46457697d80.npy +02958343-12f2905dc029f59a2479fbc7da5ed22b.npy +03467517-77f178a2b61cbd1e76d05024fabfa1e5.npy +02828884-46cfcb7eb682d16d2b12aa6a0f050b3.npy +03001627-dacbb2d9dad289b1492d9da2668ec34c.npy +03636649-99d884a5b3a6677bbebfb887e83028e1.npy +04090263-9c4ba5d99727de4f737477c115ad5b33.npy +03211117-f34958255486228cd174bb92d075f795.npy +04379243-606b2e47238b02178c37cfe791015e2f.npy +02808440-295ea26696a0e45b3c5aa738749715da.npy +04379243-5db80b2854ccfb6ae2b372d25f6c9482.npy +04225987-2026cbe0ebbe1153d975109d955e6652.npy +04090263-5b1434e9b907eab76bcddb6c0dc071c3.npy +04379243-adf574f947f00bdd548b2639ebc3e759.npy +03001627-ef4e47e54bfc685cb40f0ac0fb9a650d.npy +02958343-26d201a532879a60a7fd25564c2e888e.npy +02691156-b7f6e94ddb5ecc2366cf1b4a8fc3914e.npy +03001627-83d3b40a6ff6a04af4b6538438a0b930.npy +02958343-6749e5a1458ead5abda733a39f84326d.npy +02876657-30c6b5511ff09ac33526ea1c3de37e7.npy +04090263-3c10faabf2ff5415ee72fba28fa8d35f.npy +02958343-1b94aad142e6c2b8af9f38a1ee687286.npy +03691459-1ac22719af776fcea2626afcc786d93.npy +04530566-7d2194fb89c42da8ae5c852356538a5e.npy +02958343-206e39a5f67f4a4a81d0c86cc18e6647.npy +02828884-3e5f4d788fcc628f442b181d72d9d1e6.npy +02828884-f3e13747a652b96bf5fb97c1f9661c61.npy +02933112-b184de34d988236464a7317444d5a8d.npy +02933112-1b92b53bdb962de337aa612844f43db0.npy +03001627-fa6a5806956d82aaad484915511ccff6.npy +04379243-1d19305840960acde220a4c1303a51c.npy +04090263-8c9e592c95f95e7c9a6e43b878d5b335.npy +04099429-ca746c12c01a09b58db04a0e4b407440.npy +04379243-94ffc8179ae6bf8ddcfd6ca2b952d624.npy +03636649-bafc295a6ffcb375c3d3652f80cdec64.npy +02958343-192bc73d5825bfc7bda72093f9b5aa73.npy +02958343-14330011009dacfed49701eac14326ae.npy +03467517-2ab76c46285aaccc6505b7589f976309.npy +02958343-92a718b74a2e5e84fd2d6c7ed5a8dbd.npy +03928116-934d437cf82c0de5cfb9b585aa85fffd.npy +03211117-e1d73ee44f1d2422b5fb024f65f6da.npy +04379243-2a88f66d5e09e502581fd77200548509.npy +03991062-1a03376343b2e4f0c27d3c9a6f742a5e.npy +02933112-4b75b3d199523a91f8d6a4359d6a181b.npy +04256520-63e8ec717a68181fae1162148fdbcc5f.npy +04379243-aa96fdfe679adefb203eb08a0c3b4355.npy +03636649-2ac3b0a04514988e8c451c71f65d5dec.npy +02933112-bdb118e2b6c9f4d712de5317fe5b354f.npy +04530566-996c90952cfff5b24baa0720a34ff704.npy +04530566-67dd862f05f659c71f98035449adc4bb.npy +02933112-5f44807953f9babdaf31a22c7bed177d.npy +03001627-3ff53879d12a2259cf004563556ddb36.npy +04401088-1621e08661de948d7532dfb76fa58e9e.npy +04256520-2554d1db5fc9ebe525f8fb09254b26f9.npy +03211117-d59cbf752abeeb17f1a5dd559b550d68.npy +03001627-2c251c2c49aaffd54b3c42e318f3affc.npy +04379243-6c06faf4538bdc00b9e8bdc9c4a49aa2.npy +02876657-a118d15a0c74091e3ba6f328e4cd62be.npy +03636649-c4e8a6d40f6433928eb8d149efa4062.npy +02958343-17926c1ef484b73e6758a098566bc94e.npy +02691156-d5189c00524f662c79f9bc8b647dba0.npy +04530566-1c4ea31563b54bc8b77192b0405b4a6d.npy +02876657-cbc1cbc9cf65e9c2fd1d6016d24cc8d.npy +02958343-525c1f2526cf22be5909c35c7b6459c6.npy +04379243-5472624a2a130443e70021280aa1db1b.npy +02828884-b8ae866a44a272bead5067eac75a07f7.npy +03790512-a7554de7ada3163fbec38f8cdf3f0f2c.npy +03211117-538eebd970e4870546ed33fa3575cd87.npy +04379243-19b46cdd0a44286823eb3ad3d378722a.npy +03642806-ec3223edbdef2db93334fb6668ccd834.npy +03624134-850cc847a23896206cde72e597358f67.npy +04256520-1a9d0480b74d782698f5bccb3529a48d.npy +04379243-ddeb44a5621da142aa29e9f0529e8ef7.npy +04379243-7713f8a266cfcb1ee31752932c101137.npy +03790512-4fd8e8522a431781924dd6806b28c0a2.npy +02992529-fa1088998ad523edf85a324c5324329e.npy +02808440-275005a67aba33ca9d97e7b300a8d98b.npy +04379243-719c8fe47dc6d3d9b6b5a7b8c31557c.npy +04379243-e7058b820e66c9249cd431573238602d.npy +02933112-cf57b6a6baeb421c8c180d5d98aa66c6.npy +03325088-e7e03d363f0bb22376c18e71fd49c4dc.npy +02691156-e3fd510add7b1aa3c19eb6ab3736de88.npy +03624134-1e198106fd8339674e5a4dd299df24.npy +04379243-5ac2020b6b8e2c5c8e5e60055b9b9f67.npy +03636649-bb04811d84ec072130cc41b666fd9890.npy +04379243-f720b36f39f9dc0e5582a46a1071249.npy +04401088-2488bca663eab268d53bf953feb52e3f.npy +03001627-8c7d2eab593269f8607566378b3d8827.npy +04468005-7670f8aed98c8a653015b0b4292af7d.npy +02691156-6fd578ff0ad4f6e8203936772104a82d.npy +02954340-5eb9ab53213f5fff4e09ebaf49b0cb2f.npy +03001627-3d32d89db2286377e63c6421b71f17c8.npy +04379243-e7eec2839ea91f07df6cfab91d65bb91.npy +03001627-b371bb691811acae68d92632b2a01360.npy +02691156-f58a26c915e7a1dceae7a0fa074b4a2a.npy +02691156-6422d4a9c5b5b8f350361148ac946a05.npy +02691156-87d37c43f41871fb4dd260a1dd3357bc.npy +02691156-a61bb94e08709f2bd0734afa0d357999.npy +02933112-2a3a3bf0878f1fa4c59350d819542ec7.npy +03642806-a4eb5dea7eda6ab58e5480b52f7861ca.npy +03790512-3837c8ef573c2a7b360cf6eb12fae4.npy +02808440-dd49561080df1a3f798df87163b1956c.npy +04256520-605b9827489d47a14038d588fd1342f.npy +02958343-6cbadb3a39216f12ac6dec6f3725ccf.npy +04530566-19cbb5d8d74f8813e60e51f454cfc3c9.npy +04256520-2862150fe6816499130963f0203c947.npy +04256520-4ed87061082a0ecb273e86fe77f08a50.npy +04554684-6b5bd7b97b0fafb83bd5bed2701d5593.npy +02691156-3692c62cd29c6f1378a64d47db225ea2.npy +04379243-bc4167ab0fa22678e0fcc90cf126de96.npy +04530566-b7f288e9187a72ea5d3426ee101e9f8e.npy +03046257-e133ca5fa7e49536fc5a6a6856432614.npy +03691459-348d289b6a08e7b44884161c20b458b0.npy +04090263-c89488a80cba5fa5870906b5178d97bd.npy +02876657-b13f6dc78d904e5c30612f5c0ef21eb8.npy +03691459-39318878f6e98ed2150eaf7a4ddb8bec.npy +04256520-253ca4f655355b6f8bc1f8036e08e44.npy +04379243-1e588358e4681e1ac3bd24f986301745.npy +04379243-31af0afdf9d7bcf7855931d119219022.npy +04379243-5f2b41b50439518be679b7e0ecf5c9b0.npy +03001627-9c0c0e1a83243dde6f283df3449ca535.npy +02933112-7f416248bb57f1c0598f1102685df4cd.npy +04330267-f8c7e054fc46898a41965be83b7745a.npy +04379243-a6c91690dc96de97f1c28c9b4267c8f3.npy +03211117-88be1603c4e07fed6418651cc29befff.npy +02828884-4de8d632bae6b3719e76a83ca837d918.npy +04379243-47008a5646d3d84d85969b141e43f51.npy +03001627-d57c9aac973c3722197c43c7dc584772.npy +02691156-46d4d453ceac2f5c3c3b254d8683a766.npy +03991062-be681177e9540e4be4406b3bf37e6ffe.npy +02933112-d22fae260519b9cc52051c3ad59857ed.npy +03325088-a61075356271eb72979c556124bee033.npy +04379243-c65061bae7f351e419fb4103277a6b93.npy +03636649-c263fec31c8d33874f51382fa3549a00.npy +04256520-3d863a4eb22c548e9d4d5dcd2cc33826.npy +02958343-2cd119ce9ec61f1af63ee8a34069b7c5.npy +03001627-6ae92754a0a90af09eb811e8e20749ae.npy +02958343-669974eb491f2bf7f8883e486ec8cb7.npy +02958343-86fa16c6da908e6b44221994b043fd86.npy +04530566-68dc6f43a895e7e143909b9ada90aa22.npy +02691156-dfdcc024d1043c73d5dc0e7cb9b4e7b6.npy +04468005-3149e8ae0b352b90b2faf16541f353f5.npy +04401088-2c1cf34eb46756c1aa8ee930afa0ad31.npy +03759954-273e1da4dfcf82443c5e2d7fd3020266.npy +04379243-6fa2751d57a4ee44490ad276cd2af3a4.npy +03636649-fe02f6594ed8b96ae85a3dc26b76b2ae.npy +02808440-1e454ec01708c3b24c62bee40dcdc539.npy +03691459-65688eeafdf06f8752e2d18963a75b4d.npy +03325088-98aa4c5587088c4430397be0cba58a16.npy +02933112-cb9c0c90b5c6cc9c189d4f3a6cc879f7.npy +04401088-fe553cf733e29a349426aa93c5c54668.npy +03325088-3c38d1543ca1b63a9bdc22a1e02e82.npy +02958343-53502c15c30d06496e4e9b7d32a4f90d.npy +02958343-ef3ed9f139571826ce27281f3b76d1f5.npy +03636649-d6fb6984306d5197e96d94a67d9df99f.npy +02933112-7664b9208a84674926a555721514c9d0.npy +03636649-fd15a43ef545096fb6f5e7b313e4eaae.npy +02958343-db216ae493f303f35b4953d8add91f.npy +02958343-fe3dc721f5026196d61b6a34f3fd808c.npy +04530566-10212c1a94915e146fc883a34ed13b89.npy +03001627-11347c7e8bc5881775907ca70d2973a4.npy +02691156-d2c7b95823938833339bd6b570381585.npy +02876657-c1ebc4254a9f43823c0d2e0152e91b5.npy +03046257-ee6489d2d306ca11f04a4560b57187d9.npy +04379243-c3c467718eb9b2a313f96345312df593.npy +02924116-dba9527c3318d060973f659238edf3c3.npy +04379243-616a8ac7d1667a062c1a544eca74c954.npy +02691156-912d89d2d910a81cadcbeb54f3d014e9.npy +02828884-5207969c5c38875a6eca3a103e1326ab.npy +03046257-7a7d7bf03278d81854bec7a9a0a11b9.npy +02933112-bc1bca3cce664ab11fc2b865c2a185b.npy +02808440-6fe99f67b888794254d7082b34825ef0.npy +04090263-66c92d4b4cb90639fb5c1b0f759e2bc1.npy +04379243-2b51c3e9b524ddf560b5fd678a94e9cd.npy +03636649-45d24c9106f2cd7614cd86cb97af8937.npy +03636649-701dd0ee2f3c86502feae54a926ce14f.npy +03636649-66b98bb2b9d34431ec7cbf3284585a40.npy +04379243-da2a145da58d39c7aa5ceeb306445170.npy +02691156-a19a5a459d234919c1ccec171a275967.npy +02691156-29c0b705d6368b6ef0483511b875f0d2.npy +03046257-40f7ac90780052f99539294b73a00f55.npy +04379243-a49d69c86f512f5d28783a5eb7743d5f.npy +04090263-403f8de536d9842222b13c48c34706de.npy +03001627-182c47283b90d8b2d85934de5898f0b.npy +02958343-e0bf76446d320aa9aa69dfdc5532bb13.npy +02933112-93ee050394f3b15e3c8d0fdfb1cc2535.npy +03948459-298d300e70d6bf24e1f2a1daf140ac9f.npy +04090263-a9af1bb4648a448c8ff23e7e19499284.npy +04090263-f0bf5f36ac0cbb2b1a77229b9f90bf5.npy +03636649-fa80490adfa79863aa9da28fb4d9b628.npy +04090263-69e470b712063a2212b38b1d99376c0b.npy +04090263-9301403c048cc8a3fbd94d73a34fbe80.npy +04379243-675c225ef7bf4b4b3db912a90d289dfc.npy +02808440-7e6b409823580827a80d0ac32aa1e5ef.npy +02924116-f7c66493e877829eff8a739dd4de4368.npy +04379243-24b27de7ebb852ddb472f782e8890df8.npy +04530566-42b1b67e53c9a8ad14de76bc030c9322.npy +02808440-8b42485c93c122643321831d2245cf06.npy +02958343-e6581335186f5f6d8f01b3789ded1e40.npy +02691156-572cae68af04663cb145cb2b20ac87f8.npy +03046257-c2a14e7178f4153cf100868565cc78ce.npy +02958343-3ae62dd54a2dd59ad7d2e5d7d40456b9.npy +03325088-9f6a53de1239fd6f50da8b99982a3057.npy +03001627-44689408a7d879a664d56d7ed347e929.npy +04379243-746ceaf694d85eb5d5192f88466da1dc.npy +03001627-502d0f698e20af83de03ab2a27ba7531.npy +02691156-2349e4b9a4ccbd97bbf3143b1cb6076a.npy +03636649-2054bfb594262929a89fa001ff6369ec.npy +04379243-f76bddb92341f2a8a8a7283d9841addf.npy +03001627-30fafef5c734f926781ba0fdb47276df.npy +02958343-77a759df0166630adeb0f0d7312576e9.npy +04530566-2212a794bfca650384d5ba37e7a649b7.npy +03001627-50afe00f341993ae7d63360731b4227a.npy +04099429-c55fcaaf3301f97e978efdfd2ccd8bdb.npy +04256520-4e37752b33506d0313dd6eafe1477be1.npy +02828884-cb4389a968257a7dd2b12aa6a0f050b3.npy +02691156-23616b4d03c5bac61232236eecec447b.npy +03001627-5ceabffee1c333293002761e7a3ba3bd.npy +04379243-326342c53d6b26bb423d2dbc3b38c389.npy +02924116-6fc6b7d388c5665e455762fa3afdf17.npy +03001627-1861715e59337785dd7092ed47061a36.npy +03001627-a4b14d0f3cf8a8d7b37a59fbad57ca4.npy +04256520-f16d8f18e03669308f00a5ba54aa8088.npy +04379243-51b4537837adf046fec95a1eac04b338.npy +04379243-612117acf07984468e52a975e7251969.npy +04090263-6bdec3364b44e8d8ec69d13496bd4a34.npy +03001627-3aec502173e565d9f7628281ecb18112.npy +04379243-1fdb34aefd1d6eebb4f9aaea3b860d10.npy +03636649-d12558a4b1dec5ab37b2bb75885cfc44.npy +03467517-9ab3ffd9fb12633227849fd89ddd1d7.npy +04379243-e857e87654e3807e201a7d6fe269f8b8.npy +03593526-ad035d236a8fe58bc8f30866a59f8bdd.npy +03211117-caed0c8c10f5738bafe08eb441adfc09.npy +03797390-d32cd77c6630b77de47c0353c18d58e.npy +04090263-ec0706775e0585fe4c82ce83dca284f9.npy +03593526-79ee45aa6b0c86064725f67267e31c89.npy +02808440-e15eb12dd12574171645a90c3364810c.npy +03211117-cd859f728ba259b0eb5d382c7eb13b28.npy +04256520-e9e54de1814ccae5bbb6a513934583ce.npy +03001627-d29445f24bbf1b1814c05b481f895c37.npy +04379243-7303502cf80ac41481f172e682de585c.npy +03636649-b4b15a84b9067f94a75d03186a0409e2.npy +02924116-314eb222862a53c7249d7c2e6eb0a2ff.npy +04256520-d9ed3fd60f4d42aa5f75bf17509b9bf8.npy +03636649-2871a6c7eca55e63d0482422df1ad01d.npy +03991062-304438fc83a3d9b237ab51e1f8240a33.npy +03636649-b2ed672f1d7c2a34664b3b9b23ddfcbc.npy +03001627-8d2fd4b9c583e1e6a12cdfe22cdc2f5d.npy +02871439-ebb7a6ef91d05970e3ada376097bba33.npy +02958343-31546074e22ec0b69ce1b0be9ab0ab75.npy +02958343-7faf7e8c2f383eafca92a4cdad802b45.npy +04379243-f27eba536ca8d428eb1f243bab39fb29.npy +04090263-3222936b563fbccddb83191ac0ff763a.npy +03001627-c5637356cfc865b33ad3591a780fa12b.npy +03642806-cbbfa8d8eff7a681797b57ae3deab1be.npy +02747177-c21d8f5641be31a285cac25b72167160.npy +04379243-90d08564f19279ce714531f0291497fd.npy +03467517-ecd53707110dbc208d8778ff441ce85d.npy +02954340-e823673c1edd73fb97c426435543a860.npy +03636649-a87825df690f900c408d050f12518231.npy +03085013-657c0de244576d26add3e496533730f.npy +02828884-469235b1160c6df1bd44b6fcd3e363b9.npy +04256520-828a2a981ec78e7c14038d588fd1342f.npy +03001627-668c488e900c2ede62a9eaa32bfe99c4.npy +02958343-cc8b44ddf6ec80fffd8e7b05498794b9.npy +04530566-fe7b7ad843678dfcd8c527d4042f291.npy +04256520-725af978a11bb5c383a0857b7b9398b1.npy +03001627-48bb4afc8cf90b4664215ab2598fd5cd.npy +04379243-9d0c9d8e03fa4f281a67ed3cdf707521.npy +04090263-b7f7746fc15d67343571d7763ba5a413.npy +02958343-46726bf3daab9d14b1bb46d2556ba67d.npy +02691156-ec2ceb5d65007bacfbb51ecfb25331aa.npy +04256520-fce0ca2464802f5ab0474c2e080078f5.npy +03001627-a65cd22689f14147f155d75bbf62b80.npy +04090263-f8ac577e9f60ccaf3e7a62ab2a088af3.npy +02691156-dbdca81a0f9079096d511e9563e4bbe7.npy +02958343-5d2e6410d4fb760befdff89bf9a96890.npy +03046257-ae4bd519ca0158d1624540d1cf03ba7c.npy +03001627-d4a2a7d81cef335cdf6cfab91d65bb91.npy +03948459-7568ed12e06320b32ee0f9a97b71d505.npy +03513137-f0a1e3c919471b2819fa27f3bdd7d71c.npy +02808440-a92ca67b245f008b54d7082b34825ef0.npy +04530566-337531151abc41a7b390176e65ea3f39.npy +04256520-b6ac23d327248d72627bb9f102840372.npy +03691459-e11cde2df1c508f7e098c9e597ef1d0.npy +02933112-38def13ea098f098fb266533561ee98a.npy +04401088-a04e8cce46e70fc48f2c50408e4e65f6.npy +02691156-b7fd11d4af74b4ffddaa0161e9d3dfac.npy +04256520-4da36f40feb209fedb52360728b4b83.npy +03624134-8e1642ad868579a57ef00b10b1a864e.npy +03928116-dc078a781ba248f016a0adac6af4232a.npy +03636649-5c8df2c17d09028543ba2b548bab2839.npy +02958343-d56104e27f9d5f55725a7749daae1afa.npy +03001627-a27818db3f288ac8473f10e6caaeca56.npy +03001627-bd6a8b133fa4d269491d6cee03fef2a9.npy +02691156-cfaff76a1503d4f562b600da24e0965.npy +04401088-2eafc16c78c43b35d9f7ce5b19e46227.npy +03691459-4ddccf2b67d0cef538cf6df9faa9b65.npy +04379243-460bd446c3f1cd5711beb49b60c734f.npy +04468005-9518c86ac24e7c91bfb63e2c713ae7cc.npy +04379243-93277f95f365b958ffd5817f210f277d.npy +02933112-51d9a60e0654e3622ea98d69e91ba870.npy +02828884-cb81ce8d2558935881faebbdea6bd9be.npy +02933112-59e0e7f6eaa54e359cf7640f6c7f518b.npy +04379243-eb66e5ca3eeddee87fc7604ac712879d.npy +04379243-941c99dcbf881c6939070a7367ed1554.npy +03046257-6073c2fa3bc752b314038d588fd1342f.npy +03797390-5fe74baba21bba7ca4eec1b19b3a18f8.npy +04379243-faabf2f29b99589991752ed21892d778.npy +02924116-dc172096d37448faa3cfa46226644b04.npy +03001627-9fe840a156a5647c9ce67e77fac3db9.npy +02691156-62e29787d3623618575bf8a4b14be4f4.npy +04379243-5700152736510e2b45c44a42b411ced8.npy +02958343-5d756a52f6f361abf500cc506a763c18.npy +04401088-e8345991892118949a3de19de0ca67aa.npy +04401088-267a2d6fbf29c04cbc17518d87dd1f7a.npy +02958343-b1f75a8e8b9e921a8a6cf8c6b92417f2.npy +02933112-70c0c5438f0da757307c5c16466b10c6.npy +04090263-43dade9260b93b2c3d204f0b9150b384.npy +03636649-57aa536c02ea697b2195f9e636aede6a.npy +02954340-3a666502c0432522a3340564b56a7f70.npy +04401088-b91bbf0a0d09d2eb243525d45e430520.npy +04530566-1dabc979fd569a0e850e00840470903a.npy +04256520-b08fb5e8df4c11c090a9ce3e4b15521e.npy +02992529-722acb5e8ccd39391e5d846d206adf3d.npy +02871439-caf2c03bfb37bbce35836c728d324152.npy +03624134-713e17148c90c902830e3a69f9610d57.npy +03691459-1297c443d9a147ed9d783559814f4705.npy +04004475-b5d3d85c016b25b0f39d7554d3e63ae4.npy +02958343-f4b86f895a221f353b0907d01b34682a.npy +03001627-1145248e1eba424d492d9da2668ec34c.npy +04530566-44ee47ab9926aa821e062833a4a1a38.npy +02691156-40c730231c4da8f33c3bcafb5ffed4c0.npy +03325088-d3aa2eeb7641d99fb9101063463c970d.npy +02828884-3824b040bd8906e0f155d75bbf62b80.npy +02691156-1bcbb0267f5f1d53c6c0edf9d2d89150.npy +02958343-8798825a3c68e5c7e0470509f60266ee.npy +03636649-48a5b451573920d44cb3aae7b27db2ba.npy +03636649-5aaf61da59f1c0773225afab722d9fd2.npy +04330267-2d5b7183f052b34f56efcb65c52d83a1.npy +03001627-3d029e681e0b4a0c12bdfd84d1dcaa33.npy +03642806-520d98e360cf44ec8139dd63d55edc44.npy +02958343-93d49d2e5e4ab1b7ae33d942430658c.npy +03046257-a911990b617749ee738f481f8560d58.npy +02871439-b7697d284c38fcade76bc197b3a3ffc0.npy +03001627-6072ff799065609b6bc601efa799c927.npy +04256520-615ebac351d7e8356051d49e4b21b83c.npy +03636649-bf659a08301f20f2ac94db38cec7b356.npy +02924116-e9afd0d7aa653df4b129901f80d24b7b.npy +04256520-b913574ffbe7400ce8417aef1b7a422.npy +02958343-3027a9d3b70435416abce8cb03e7794.npy +02958343-3b95f46c0133167b80e98029b8cda1b.npy +03593526-cdfe4639a2da7801d50406298c1adb95.npy +02691156-1e7dbf0057e067586e88b250ea6544d0.npy +03691459-b8b1643518382596aa623a443910bb58.npy +04530566-819a7b31f925a302474a33db0a80b327.npy +03636649-e485053f3e0d18252cd2160e449d45ae.npy +03001627-1fe0a612dfc3fc548be8b77157b819c9.npy +02924116-6f59f085a589522b6481aaaba8c72ee9.npy +02958343-96762f5d7f7e93343f9daeef6b843610.npy +04379243-8ccbd2949fd8809b82cdf8854f156846.npy +02876657-ae52386c7a6e25a1a666d1503f8e34ad.npy +03636649-4631e756666a8a208ca4aeb5e3b33af7.npy +02828884-f7b5756c04e354a0c1c40d87de24d930.npy +04401088-558c9b7e854db7da21844676433a0aca.npy +04530566-e177d4186bff96ea6dae8586082d789.npy +03948459-d706263b307d12c9d4f4334cc3aff513.npy +03001627-4aa70df1db0ff6ce2d19175e7d19b7cb.npy +02924116-967d5e9bb9b79d92ab2c2809513f396e.npy +02691156-9634ed6dc8ecae0026360e1e29a956c7.npy +02691156-18806a80387734b754c7b6e11bf7148d.npy +02691156-ab95a4e7f2d3cf9ca8607f540cc62ba.npy +04379243-e435c1e3430eb7b253fa79783efbc3bf.npy +04468005-b36bcada3b5d7c7ce0ba12f63b0c5b5d.npy +03001627-88042e6d331ffba0f63e8e405d49b8ce.npy +04256520-bff79b49732569307ea323bc74055b8.npy +04256520-82a13477581d96a1fd3e75cecd4d5ab7.npy +03001627-cacb9133bc0ef01f7628281ecb18112.npy +04256520-7fde281d5d2cf5bcdd2b32fd72ab4fd1.npy +02924116-f3f22f9a45ec3592b747ae6b3860f54d.npy +02958343-5823e5205bc7eb46cebc874b6631de1.npy +03001627-74636f18a539da1cab610b0c94236463.npy +03642806-ef6d43add46d0cae4e07b09c086cc5c4.npy +03928116-ce7a03d645722d503f7e27638e63d848.npy +03928116-f858955bcd01c82aabbc032d2bc8593.npy +02691156-4d139f21350f64d2425a06bba46b20dd.npy +04090263-a4a62998899fcea2fccc89e375e776d6.npy +04256520-34e48812eaf19420499252a7ccb366fc.npy +02691156-bbaa22bfada1dc0fc6194c8172019a35.npy +04090263-9c3f797d9b352d35669d741f4ab14065.npy +03991062-70cfce0a272195a236b0f2a1430e993a.npy +04379243-758649ba384b28856dc24db120ad1ab9.npy +02958343-4fa9b14789c8af5e3781057335c8a2e8.npy +03211117-5a20c7f723b42d2b74ff95ba57b167a8.npy +03211117-45406c697e4fcbced742faccfe08d94c.npy +02992529-748f4a9aee8f610e8463cde8953cc1a5.npy +04090263-81ba8d540499dd04834bde3f2f2e7c0c.npy +03593526-971d8456fc6fde71cf644619c59e0de.npy +04401088-9e302a3f21a992c0bb579d1d8d989550.npy +04090263-7dbf5ff231497ee511f7dcbb4a32aee5.npy +02933112-c0d58499d2cecf07e1c245f9728d365.npy +04530566-dbcf36d87385eeadf64bc205d76349ec.npy +03642806-4fc3d56243d2d8801ef1ccfaf50f2048.npy +04256520-64c8591e8a837cd5dc8d41086ec55d96.npy +02992529-c7ec332bd52f939f04143dfe595ba79.npy +04530566-ff7b2ba047233a5b149489fae2289e6b.npy +04530566-5fb24b87514df43a82b0247bfa21216b.npy +03001627-2e28fe9594c48874a6eb1dae0394cf12.npy +04379243-89157839dd80262087e118e254d6659f.npy +04379243-dd2238408ee5d84d8d1c97149a00bd19.npy +02958343-347ffb0b0761c6ba8514fc08fc0d2ea6.npy +02828884-2f0cd28e2f8cdac16121178eafd002fd.npy +02691156-6a54d956a8adb2d0e691625fb79e2c2.npy +04256520-5f5150a80e5be6159141f9b58470d646.npy +03710193-e6f75c44739ee7b48f74cdb60878d9a.npy +02992529-9b74db2ebc90ae4789905122ac8b41f3.npy +04460130-3668753b904e53c4b96aa5dc23c036c.npy +04379243-33c4c7c47b8874123c8f5d3bbb1a3215.npy +04401088-e70ce62b41a598dba48aee3bc134fbf8.npy +03636649-e35c4fadbf8d0426c26e81144f3196d5.npy +04379243-5a7f0ba2b1845e7bd2a79e157dad9b1a.npy +03636649-dde3b4bb9fb1ad25e0d089cf3411494c.npy +04090263-3dc3dd08910169be2e3059b0e19cba0b.npy +04256520-8dc7bba62eabeae9b3af232f92902efa.npy +02924116-8886dc9b9405c6d914f96752ea902e3d.npy +03001627-3f95c370fb3871621f98c0761af40e04.npy +03001627-e9f36f74e22ca0897298e452825d1f0c.npy +02933112-85ddbd698b3e7dfec59350d819542ec7.npy +03790512-4f30742005b7c20e883158c0007ed9ba.npy +03001627-bf0ba9e2ebcfb431e6fe3612af521500.npy +03001627-9d05b0a242a5ee06639159c697a89e8c.npy +04530566-ac52cf0b598e930ab38d3c03866c1379.npy +03636649-d357edb3b9ae47f230f6e0ede20c4525.npy +02958343-7751f6695ce5013bbda733a39f84326d.npy +04379243-aba18a9a32753bb6390dcdc075aa60c5.npy +04379243-21a65be5dfed538fa3461a37f23a9515.npy +03001627-5f2441ed2a9ec8fab5d55ded7962c792.npy +04256520-1f860a494cd615fc7d4bf609d539b368.npy +03948459-4af05095ad02dd8c9cd99d3d15a8756e.npy +02871439-465bb5a9ed42ad40a5817f81a1efa3cc.npy +02828884-26e3a9d86dc09155cb2a965e75be701c.npy +03593526-578096b08ef3c3534637188d1bc69cfd.npy +04090263-15a209524ad3fcb67b84b9482c4b66d7.npy +04256520-21b22c30f1c6ddb9952d5d6c0ee49300.npy +04379243-6f630e2080aa9f10e45ef4135c266a12.npy +03001627-3316a00869217c2632ed7dae08823495.npy +04379243-525148edf1f9aa72bc7f58784fda27b5.npy +04256520-288837a47f55c0e9d8d964adc0b6502a.npy +02924116-b875a7af988b644d29ebc23acefb248a.npy +03211117-fc0d0287ea544c707c65e97bab3e4970.npy +04530566-1d176576e4ded157a313c221866393fc.npy +02828884-edf14e0208ac61b570eb586f56eab45.npy +04530566-dd012d1ee91543ff500cc506a763c18.npy +03325088-aef73acaaf17e0b614b35a7d7cea7130.npy +02958343-54b89bb4ed5aa492e23d60a1b706b44f.npy +03211117-3077837de566c236a42abfb83da6a2e.npy +03001627-47ae91f47ffb34c6f7628281ecb18112.npy +04090263-5370fd7b6529876574e18e0e7a19212a.npy +03636649-206ef4c97f50caa4a570c6c691c987a8.npy +04090263-b68218340f090e03519f927f2bf92da9.npy +03001627-226f38ce0d46fddef7a06a265fb36208.npy +02933112-6219b46946f62474c62bee40dcdc539.npy +04401088-ac0967f9fe8f63f46b2ba76eab0d2b1c.npy +03001627-234f40c665976a51dc1e30a57aedbe31.npy +03001627-8affea22019b77a1f1783a44a88d6274.npy +02958343-f6a93b95e10a8b2d6aea15d30373dbc0.npy +04379243-bdf30e94446293c645de94e1bc93a4f6.npy +02691156-18e86ba0172154f3bc0909d98a1ff2b4.npy +03211117-94482409d0396dfa3f8f528a267748f.npy +04468005-d2a55d5745da47892aa93fe7a6076a9.npy +03046257-9937b55d4b6bd3b3f78bdf37d618e97e.npy +04379243-d126210a20db32c23027f298c7ea0c6f.npy +02958343-15c3b923c85d22796d8b9531f93cc8de.npy +02691156-d59bb0ad79371634f3d7c71ae132007d.npy +04379243-f5d9f518e284989cf930da774352b970.npy +02954340-6e983d20e0bf80296829cd4082fbdbdf.npy +02691156-b8720c5fee3264f735fc197bbabcd5bd.npy +04530566-9380065fd20eec791a7be2887bc37d1.npy +04379243-48ff9804a1ae69f4ad5067eac75a07f7.npy +03691459-a5c19b4bfab3a826236632eedd876bae.npy +03001627-e12ac2c1c707b7b2f45a7a3d26bcb6ad.npy +03211117-e7409303fa52f74b98de02aebd38a1f0.npy +03046257-3234632251c769afe460d06cd9b374c9.npy +04379243-2e30c286710fd73d492d9da2668ec34c.npy +03593526-1f5c74f0a55cbf9798d5fc0473d00a1c.npy +02958343-705840df46a582e2ac826a3c82da491.npy +03624134-9b3bb2c269ed48741c63053ffe1a64a7.npy +03761084-e1e2879a951cac7b178e7d331e641179.npy +02924116-462d1cff923e1e94c366973b1ac73478.npy +03046257-97789558032ec294f166e7ba85df03e0.npy +02691156-31b201b7346e6cd15e9e2656aff7dd5b.npy +02958343-6942e70e574edda3c8831f15c6e487ac.npy +02828884-9d7185edf0717575a6195e775546b04a.npy +03001627-6501972156717723e8b2b8dc0c816caf.npy +02933112-85b82499e3ce7aea3a5893ad04c930a0.npy +03001627-2abb64b16e61663ce99b044850de1b87.npy +03636649-894cdb80665ba73dbfeb5b5bfc3dfc3b.npy +04379243-97894130bbbd202df4b6538438a0b930.npy +02747177-5d756e92b734f2d2b12aa6a0f050b3.npy +02958343-4c1504f3463445dbbda733a39f84326d.npy +02808440-5b088060eeffc5723af30a3946d92feb.npy +03636649-9a976020602ee60b5fc8f4c1fc00b380.npy +03001627-3b57aac4b7f4b9f52d19175e7d19b7cb.npy +04379243-15ebb1e7e6663cbfa242b893d7c243a.npy +04401088-1984fb95afb6dae5804722305621f918.npy +04379243-3a3c922623ddb42e5d81820421265171.npy +03001627-8af939d95f201d17283b00891f680579.npy +03001627-507a5974b24dce2ee1fc1bfd241d8d6a.npy +04379243-d37fd2ce56b3340eaccac37ae24b8e2.npy +02933112-9ea0005f3d702b4f6cc679ef84e06ad6.npy +04379243-b63c8ddca680a2a3492d9da2668ec34c.npy +04379243-62a4f3c24bc69f593eff95e5c4b79279.npy +04379243-752d13c1011bbe94f68132aeb243f95b.npy +02801938-f76b14ffc2fe6c7485eb407ec5a0fadd.npy +03001627-b1f4b2c32f8a2fa77ee217c21e683487.npy +02691156-8675974f9f6ec91ceb3b5fc90bde085d.npy +02691156-d54ca25127a15d2b937ae00fead8910d.npy +03325088-57c9713acf2765a13321831d2245cf06.npy +04379243-a9747a8f0c31b46188793ca7bd0e6fb0.npy +04379243-ed0be8928caab4bdab610b0c94236463.npy +04379243-d70bb0c4015f6e10df2b21995cbbbc4f.npy +02958343-e07608ddf2b0bfeec726c061bf976915.npy +03001627-b47e994452b71943bf30e5b4764cebc0.npy +04379243-73f34f95a001731b855931d119219022.npy +02828884-608af07bd357d605f155d75bbf62b80.npy +04379243-30f06495dec55016bde93a1daa41f517.npy +04256520-ddc31f9e7064be80f51f77a6d7299806.npy +04401088-5e87bca3231cbdf15b5f05be350ae67e.npy +02992529-1ac1e6fc09611ff049c647f92ae11714.npy +03636649-fca3ffd4ee694c1a9c0ca344f487323e.npy +03001627-38c67c695eb4cd819e179bac86183112.npy +04530566-563d66d82ad3f27e324be6ae66f7fdf.npy +04256520-b653a75f89a6c24237b2bb75885cfc44.npy +04379243-99e89417f985d077738e43095496b061.npy +03001627-5db74dcfc73a3ea2f2ca754af3aaf35.npy +04256520-a693b27591fe6ca2fee6b7db2f5f826.npy +03636649-b4aeed70a21518fefcb8d8c6d4df8143.npy +03001627-d2c93dac1e088b092561e050fe719ba.npy +04379243-e3820857258a0bd2800d7b7d07715065.npy +04379243-7a0a47c08464a493d1433b6d2f686197.npy +02958343-7121e0332f0c2e0551a95aaa6caba1d3.npy +04379243-327f5df925ff54121dc8654936e2968.npy +03046257-50015cb7c658ce3d93f709c6d6d99cb9.npy +02958343-38b80589a780fc3af63ee8a34069b7c5.npy +04554684-49a0abbe22fb557bee526fc96b277c69.npy +02958343-dfe114950aa726f1cfd826dd468a5497.npy +03001627-286c07abeb67b83bf7248d9dbed7a7b8.npy +03001627-9b902b5c6570acb314b96b665a8ac321.npy +02958343-29b558ed31fcbb48a2cf64b275615f0b.npy +03759954-d48385dd958c4ec2f1e87737afc5aa24.npy +02992529-e8345991892118949a3de19de0ca67aa.npy +03001627-4f51dd4fc61c41a27ad11050da24bb12.npy +03691459-ec0a8e2fa00a746dfe74514a9fcabaf8.npy +03046257-447b9c347c64d6ab2d2d2896f4b277fc.npy +02808440-deba7a0e1fe26833f0aeabfdcb4e1dd9.npy +04379243-aa0d0d753ed85d62389bb6b6a6e983d9.npy +02958343-3831ed7bc22100f7c3c8fbe62717803d.npy +03001627-9a3a80065f75e33d822e11aea23332c0.npy +03624134-3bc1492102c727e420cb8f10e0bcc790.npy +04379243-8aab7aa2fed02c6f3de1a463b8ceba0c.npy +02992529-2874447c7552c6b942f892024869e751.npy +04379243-817f1c820e82cd498962005ce0e986db.npy +02958343-ba0ac1d1e25d3fad63f2c3a55558a78f.npy +02871439-e3edade4418b0b88bcb7a87b4876a2a8.npy +03624134-bf5cae3922d3cb2bca7250d90eb506cf.npy +02871439-74311e787aca16d661720f1d4858ecd6.npy +02808440-166f3c900cac3bdeda5444b776d14740.npy +03325088-c297a977dba85f9fb362845c6edb57fc.npy +02933112-b29de5206eb16c146ec91c2f4565a1ff.npy +02933112-1e25501b8930873129a50a2b3c5e5b6.npy +02933112-40df2ce55ea8f002c59350d819542ec7.npy +03001627-fbc87a27b5691196bd3b190b59dd9fb7.npy +04379243-4dba531ab70199ec3002761e7a3ba3bd.npy +04379243-a569cf5284a45a3f353c1d159a8a8422.npy +02828884-9699995246fd521ca909cd1ba5751669.npy +03001627-1de733a48e5607b22d9c1884c92fce12.npy +04379243-be4db395f7b2f089391e4d6c585a697a.npy +03593526-5e914dd726313181b1b4b514128408b0.npy +02828884-133d46d90aa8e1742b76566a81e7d67e.npy +04090263-df6581f0ce7c00421b00524af022276f.npy +03001627-56fd0fa3863cd4c17d63360731b4227a.npy +02958343-d776d298be6bfe88e78002a96f52ef26.npy +04379243-93a6eb93e11437e1bdfa5e0753fa3240.npy +03211117-25c6bdd929f9aef77d6fbcfb6b291844.npy +03593526-8b9432e22e801493ce364511e87f52b0.npy +04256520-7882a06b4612d536ae882f622d5cda14.npy +04460130-224934a28705403238cd8eb23853c009.npy +04379243-d6ef0aa7b674c171fb4f26e87f6a6814.npy +03513137-65bd772022c2ac094fd7d35b0d9ebb77.npy +02924116-76b521e4dca09e7f673ddeabdcc8c6e.npy +02924116-dc771f013d077fe4dde60bf2d879e14d.npy +04379243-138a1ff3aa457b30497839e108373e6e.npy +03642806-9cb54ee28aec14013cb02989e2da5a2a.npy +03001627-9b6d1c0f3a20783af51f77a6d7299806.npy +04256520-d9fde31ef5c2f3ed17b431cae0dd70ed.npy +03001627-91e4eb92e010047d3fc7406e820e0781.npy +03790512-ebd02a4811dbb91b594057aa2102e240.npy +03001627-6326e2f6e17cfc21d43c0a5e70f98227.npy +03001627-5043512b70a157835a15b6547f08c8fe.npy +02828884-605b2c687b73695c8da90b986150cc3b.npy +02871439-edf600503d359b7975e8c36bab2b18e0.npy +04090263-65bdbbcd861aa385ac52f5edacff5504.npy +02828884-c3f92e6a78ad156863b2acb037dfbcde.npy +04090263-28d70dbbc48193e0a39dc4a567ce225f.npy +04090263-8b1b66ae9e416cb13b5076da3c7eba98.npy +04256520-6f84940f81a61eef2e9208ffa1a27124.npy +02958343-e607a20da6c5132dd141480e2c154d3.npy +04379243-b0890c9a4332f7a07e28af1b4b42317e.npy +03001627-6549c13a4c96b926f51fa0238791f5dc.npy +02691156-7bd43965f17c25377209009cfb89d4bd.npy +04401088-2964d10d72ea38cf4857f88b08630a42.npy +04379243-713c28954944221f618af5c2f6d28c1e.npy +03928116-a6b26dfef15ace459e0d848896b0095f.npy +03467517-9925355d4b0deff6247a5be450795511.npy +02808440-a88e254ea9ff7b4dfe52ffd0e748a1ab.npy +04530566-88baa5e1db4d1c624c24aa820d0994e.npy +03624134-dde6b5fad601b25e80b72a37a25b7e72.npy +03636649-bfc4cae9fc343792fcb8d8c6d4df8143.npy +03001627-d38129a3301d31350b1fc43ca5e85e.npy +02992529-457b4310870bcf047f4e0c14aca1a926.npy +02808440-469536fd1244fed42bb02d55712c595d.npy +04379243-fb3c684afcafce085a3075d93a0a3a93.npy +04256520-7b914fb42c8f2368393b1800bfc51a93.npy +04256520-a3faa167208786cef81b7bffcd0a03c8.npy +03001627-403b4eb7194f563f79b3e1be3524f72f.npy +02958343-f45022f442368e60c038d3a33427a80e.npy +04099429-c486afc7d7184e0457c81888891466e2.npy +04530566-48a584c9080f7495b97c9314bd4647d5.npy +03001627-94b55dcb770626d9c8687ff9b0b4e4ac.npy +04379243-346db24c1279e8d273fdbe4b39ff4036.npy +03636649-e02cc9c4cac285419cb07ecb5b4102.npy +02828884-96d87da2fecf81ddd2b12aa6a0f050b3.npy +02958343-29fc55965346a53733d7c9e122eec9b6.npy +03790512-896f688e07909b9b893e67220bf9be7.npy +02828884-a90115832bb80dc956f6fc4b4ce1db04.npy +02876657-f079d5f4f4a8cd9318431871c8e05789.npy +04401088-da24f27173874672ed7485a1aa598365.npy +04379243-18b1461f48e0fe9aaf15b62af6b513f.npy +03691459-a1d1f232168607c81dd4da6e97c175c2.npy +03001627-c67949ee2c241e8e9b9f2eb77f5e247e.npy +02691156-6c8b2544144c38d99e8d5aab043eeb56.npy +02828884-71225307ddd5a772dc11eeca04f912e.npy +02871439-8f16bba329b15e6bdc219d6984e72318.npy +03325088-5b7e61559ed415c6f893b5bc716a3fa.npy +02828884-4b079b2e510fffb8cb2a965e75be701c.npy +02691156-55d0772f003a362916c1ee83fd7a7f1a.npy +04530566-f3f66f0bce27d439c1dbab1d1ee81853.npy +04379243-2b3b491b70535af2f7f596f1d05d059.npy +04256520-107637b6bdf8129d4904d89e9169817b.npy +03691459-8c23967793e62320825138352acfcb46.npy +02691156-aa2af754642256c08699933784576e73.npy +02808440-96fd142c3abacda0ccd0340812259a39.npy +02808440-290df2ce1251492db84959963148f2a2.npy +03991062-6bb307429e516e2f129f1cb6c6fa9dd5.npy +04090263-d980e47a5890b42e296e0e62674e2efb.npy +04379243-8b3543f09b36696b488017d48a7f7eb4.npy +04090263-2eea6b3bddd73b1be768fc5ed1ac23d0.npy +02992529-113303df7880cd71226bc3b9ce9ff2a1.npy +02933112-e0f6e225c7f88db19ea59510032cbc74.npy +03642806-6b6edbe38c23db5a4599f539a26d98d1.npy +02691156-ece25d89898c7d9090b1d6deb98feec6.npy +04379243-1615fc31b6daa088c3bd24f986301745.npy +04379243-4c18b279e078ebb91a8781c24b79ae57.npy +04530566-57b1795508e5f9d19996f95a20b4c45a.npy +02828884-16ce0976d3bca243e6fe3612af521500.npy +03928116-1a8a5e4095e7ca4749f90dfc30e57686.npy +02691156-7f4b166fba71407490b1d6deb98feec6.npy +03001627-72fd9c2f47db23987f377effd1f7ba9e.npy +03001627-e76b4872f067395988dc0b76b0c63f53.npy +04379243-b723429f1ff9df7dd604f93937ce2d3f.npy +02933112-6343efcc64b331b3e3f7a74e12a274ef.npy +02958343-40f2f3962e360a3c16abce8cb03e7794.npy +02747177-555a9bff25db49ddcb2a965e75be701c.npy +04256520-31e343b657358ed0a4e97ce1d10a5ae6.npy +04256520-23d1a49a9a29c776ab9281d3b84673cf.npy +03001627-60a8c55e653a107ca192483aa282f8e5.npy +04379243-d1525a08cc96beeec786af79f5203d8e.npy +02958343-953531696c554fb275dadc997718614d.npy +04379243-496b37559f4ac973b9fd3978c6bb311c.npy +04379243-409a932e371e12d490ad276cd2af3a4.npy +02801938-781c3a0887e320575ce2e5974a5aa15a.npy +04090263-51a8def44b1e4f40e8e10eefab4b2a63.npy +04330267-ecf21890f17fbe04a3cdeb33500ff1b1.npy +03948459-96013016f3e33bf3e1f2a1daf140ac9f.npy +03467517-95f9f944e62274e8a2bdf3e6e90db79a.npy +02691156-319cf93077118d19f64801ad2940cdd5.npy +02691156-bd22bcf18a9c8163adecb6fc00604132.npy +03467517-ad605b17253e57a9c0f719b596bfb81.npy +04530566-3f6340ffdc0de35caba19ce79eba1cbe.npy +04090263-25796f85c74347726a34aa94ca8a3355.npy +03325088-541954f6d461d83d76c18e71fd49c4dc.npy +02691156-4e2769ec84c0bd0454eefcdc602d4520.npy +03211117-a71826a92bedd8e1f3c3e7bb31acc31a.npy +03337140-67571ae65a181c09d42ccf5f969c90ad.npy +03991062-db562d86ea10c9eefcf9154182ccb5a4.npy +03001627-ee4858f78dc33591100e9bd5c4b0af54.npy +03001627-8f70be87d6eeefdf213c3458a0fe5598.npy +04379243-3eedf733e9318ee06bf0788e630e3deb.npy +03691459-5551b67ffe95c01b73c7253ec9acd58b.npy +03211117-dfe294c64407f6035c6271c95adbdee.npy +02958343-54473bc01457b7291b3636ad9ef344ff.npy +03636649-fed712ffbeff29defcb8d8c6d4df8143.npy +04090263-677d8473fe8fb35280c2e60c312b0f09.npy +04379243-c958f04d72957fb855182f299fe41fdc.npy +04530566-4abbc9f36affe95dbcbc3fd6f72b94c.npy +02871439-58b97051fb1efb3b4bd9e0690b0b191.npy +02958343-3b578ddeae9eeb9ffb8de648691848ea.npy +03001627-61917c7f7953ee7fe6543556f230fe9c.npy +04256520-8f3545743c58b730a92a1b6e1dab7c04.npy +04530566-fcab40b30e1ca530713e7356d62985db.npy +04468005-110a2bd7bf9f8c74de773d95513f207e.npy +03261776-db076e314df03db9235fd81b905fa6b.npy +03593526-2ddd2ef6c8ed56afbfec1075852e48f.npy +03001627-eb7c250519101dc22f21cf17406f1f25.npy +03691459-5e320dffc984b6b5769dec5ec0157054.npy +02958343-a3672e5ee27e389ab19dbf7b5aff7ec6.npy +03001627-9e0a0ad80be6df7789d2595edb5088ee.npy +03001627-b79a15077c4a662719fb4103277a6b93.npy +03001627-f112035c6413080a664b3b9b23ddfcbc.npy +04379243-c27e9191723f352d91829b477862aff6.npy +04379243-af4bb12decb39ab082f29b648e624c33.npy +02691156-688c645ad207773f5c3e79a10705422c.npy +02958343-3bfa196d1b48f1e0c5dccef20baf829a.npy +04256520-d1f68ceddaa3b0bcfebad4f49b26ec52.npy +03761084-94c1905c213382a71a839a72929cc712.npy +03001627-f2dae367e56200a7d9b53420a5458c53.npy +04256520-3a01d750779057f8febad4f49b26ec52.npy +04379243-8ff873162e6237fe571b2dc3839da461.npy +02691156-2018b7614e77d726c1ccec171a275967.npy +04090263-691880ea91ab76abde423072102e0bc5.npy +02828884-4ed2e0a972432881ac3644c4bb0fb64d.npy +02691156-909f59399d056983a0a3307f8f7721fc.npy +04379243-c3e5380fb498f749f79675bb6cb63c97.npy +03046257-4d9733eb21fe5c76eed4b2bb88c072a8.npy +02747177-8f641a48f55555f7a2105179d0c9d51e.npy +02828884-a0ffa64279a8c6f0f155d75bbf62b80.npy +03001627-8086d53c2535511597976c675750537.npy +03797390-17952a204c0a9f526c69dceb67157a66.npy +02691156-1b0b1d2cb9f9d5c0575bd26acccafabd.npy +02691156-1ba18539803c12aae75e6a02e772bcee.npy +04090263-69d0e94a5dc3eeb3fcfb3ae2df2f7efd.npy +04004475-df48a134fe1abe30ef77ec138083ff82.npy +03642806-f1c6801e84c85a07bfb149497503af.npy +02958343-d0a906517e0ec98589fc8cf5232ee9c.npy +03001627-419698e72a0d4d75d8f2ca82d6e1c314.npy +02958343-b61b7103e8d8af91fe21694bd5f519d1.npy +04379243-bdc159bdb0147e2d54f10b531fe5914c.npy +03001627-d40e314fbb7f37199753496ba23f2183.npy +02773838-cbc1512b28e9ed382bef451de0ed6949.npy +03001627-cc70b9c8d4faf79e5a468146abbb198.npy +02691156-446f9144536c0e47f0c7ca80512a3ddf.npy +02992529-50504687883a08e3c6587b192c4cd3e.npy +04379243-876794a6a673dcfe502c728096f4ea53.npy +03636649-ca968e46ba74732551970742dd566321.npy +02958343-3b56b3bd4f874de23781057335c8a2e8.npy +03001627-9a68fc6d001c4ceadc75c30c88b2f7a9.npy +03001627-9324b077e28980f3e3dec121245a30.npy +03636649-2269f268b32b40b35fc8f4c1fc00b380.npy +04379243-206cc839c7796a82a09e5a1a20aee2ca.npy +04379243-9417a62558b74cb8fda92aec8c5adcfe.npy +04090263-4d1881a99b034305e71e857afa9df271.npy +03624134-97ed13011e2d85e16029317225a75a9f.npy +03636649-ca4607a427a5aa127715096cb6ba15f2.npy +03636649-f7a4590c54e2ac7ce62fad6b4f42c880.npy +04379243-8f1efc5edaf6d44a8e6d6e67bd4767b.npy +03636649-f40624156dcbab68620a56d13e6d773b.npy +04256520-6b8908f72b78ddddf51f77a6d7299806.npy +03636649-c28d9f943fbf806ca0f23466c3c25e2e.npy +03759954-2d680a6c4d0097f1127454bdf69cf23f.npy +04256520-fff8834b262dcf4aa89012425147541b.npy +03624134-4e5602e8a655ab0ad43bb185feff0470.npy +04379243-43842d53c1ecb4ef2e3a784001157d1e.npy +02958343-c033fb1c91079242ed3696d854eee1ec.npy +03636649-be6c5d39cbc0d6f9764567afd7c5990f.npy +04379243-57362886500b303632a11457e23fe120.npy +03001627-84767939783aade4611ea9b20dcb5c83.npy +04530566-e964c2fe232f6c3e3ece64552d44d319.npy +02691156-4374a3b4b98e247b398db3ebdf468ed7.npy +03001627-7bc3dbe5a36791cb451e78cdde0ba44f.npy +03624134-74a175fcc024644cc34b900bb2492e.npy +02691156-3bad4bd2c944d78391d77854c55fb8fc.npy +04090263-6072a9dbefe5fb3ab397b12318e6683.npy +02691156-bfd606459cace196e7ee2e25a3cfaa4d.npy +04530566-8f9e62cf323515c4ca380c8375c4cdb6.npy +02828884-5a6e7c4fb53f27925d3bb412062af8d4.npy +04090263-b8430f8c82e80d4dffc0a401ac49c50.npy +03001627-61d313bb88532dcb74039aeb9f7d295.npy +03001627-3297a632aee6ac55dbbc9440457e303e.npy +03325088-4524aa501d924471f7efbe2b298523b2.npy +03001627-1d498876c8890f7786470a1318504fef.npy +04256520-cd249bd432c4bc75b82cf928f6ed5338.npy +04401088-6f63df7ca322514f41ced50d3a574698.npy +03001627-d8e5d15cca97d3fcbda72093f9b5aa73.npy +02876657-150108e481b52e41bfeb5b5bfc3dfc3b.npy +04401088-84f07a9773374b062da40fdb29d70537.npy +03467517-6a983b2ff1b8a42e1285d7bfa3e922e4.npy +02942699-b42c73b391e14cb16f05a1f780f1cef.npy +04460130-7feb6c263e565cfb16a06efd4ad41db2.npy +02933112-c0b055d5060f7f6b4470f9a1ecf7bbc.npy +04530566-a36f6174628ee5807789fc10abcbc749.npy +02958343-26f20ab8033f6937ea859f774de0c90c.npy +02691156-4f3f39ddde5874f2db73445864b72015.npy +04379243-1875947951e8d536365c18a0ba9d127c.npy +02924116-d9c61b05cf7146fd7195e86ac1f6df00.npy +02876657-d910d855fd179dc066c1a8ee69277898.npy +03691459-19f4ee5b1f70c6a47117786c46f53d55.npy +02808440-e3129b782d99d04a44221bef0fa3c36b.npy +03001627-cd10e95d1501ed6719fb4103277a6b93.npy +02933112-74c692a9018b66592246f58eda789fa1.npy +03001627-8e2c39986badb61e6fe3612af521500.npy +02691156-e5f08a5e3dad6cdff810506e9ae2dcc2.npy +04256520-3ee93f4b1efe249bb21450114b9ae3a.npy +03001627-c4a73db5b3503ffa86abe5555a3b447d.npy +02828884-ebf5b387f119c51cad5067eac75a07f7.npy +04379243-580a053d716c2d5aa09e5a1a20aee2ca.npy +03636649-f835c863f175df72fcb8d8c6d4df8143.npy +03991062-7c506f558c25a6cffc6e457221b9271.npy +02958343-4d12d72baa7641a1d1debe6139d9c454.npy +03928116-8e3923a40b3889e532f775d262a68ce9.npy +03691459-5d0499650653cdb9a37f3fc191551700.npy +02958343-fe8850296592f2b16abce8cb03e7794.npy +02958343-4d1dc1ad555807559b0a29632c8d0005.npy +04401088-abf5c8d2cbcd97d81a0d6bd0d03a1fc9.npy +04530566-67f3fa7b1ae6df7bd36a8aec7c2382cc.npy +03691459-3b911043f7cea0639f2401cb9e9e4a2.npy +03991062-fcbf5e87e140b2e78f672c860d940b4c.npy +04379243-b31bf17ab00837ce30bbb59b54a585de.npy +02691156-50da48c8e7644508fca1f1143bb6bc17.npy +04379243-34309cdc141101e42027cee422df2aa3.npy +03001627-c18cbe2537859ab6877a4d9f8fd3e241.npy +04379243-1c7ce8d5874553ccc3bd24f986301745.npy +04090263-d72ea947f961b2bc589c07868201b17e.npy +03467517-4fc341332ed9e642604b03739297cc32.npy +02801938-5c67e859bd49074c5a9dc003587438be.npy +03046257-9d7439534373886fb8183a4a81361b94.npy +02924116-915a57c5635457bd38b9be827bf6fc77.npy +04256520-b567bd1f46bb3b347cf414b698427dbd.npy +04379243-809dd3a7fc2bbd2dec89626a4213fd07.npy +02958343-43cb6a878cf18fd92a9eb0f146e94477.npy +04530566-7103677dbfe63b1ff85fa5c7c88c6c9f.npy +02924116-3a9f2ce77802ccd2b8c11d63630fbd96.npy +03001627-f413955a0f16ae18b76e29c9c43bc7aa.npy +02691156-5678fc24603d25cb74745e8fbb11e3df.npy +03001627-dbcea1998258b0fa6f500315ae356942.npy +04090263-e33dc844a5227c3d410e09f4a064836b.npy +04256520-d27b9c12f500c3142d19175e7d19b7cb.npy +03636649-f8a6f60ee9926c01e7822b3160005e08.npy +02691156-f986604528abe35554eefcdc602d4520.npy +03797390-a6d9f9ae39728831808951ff5fb582ac.npy +04379243-d9628700a086ca293c85bd0482f3094.npy +04379243-db3f9b48562440acbeedb4c8fd29e2d1.npy +02828884-f495bd67af8d9f0cadd1cf65e8dc4de.npy +02933112-c48151eb47f0e4ffc59350d819542ec7.npy +03790512-6046f323c82b280ea75120c0e0c5316.npy +03691459-d12ec06509389e01574d21c0c95092f.npy +02828884-5d68fdf84dfdc4809f136629ee03397d.npy +02801938-d8b9cb175465fac03a360f4a31f99f4a.npy +04256520-5a0fb2d34e0dc4445369e32fb818f337.npy +04090263-27803e00894dc087da95b0caa53ebe1c.npy +03691459-38e4bd990b3031bdfce87fb06e25db17.npy +04401088-8d55c1677626cc48214d974150b798e9.npy +02958343-d22a2d20acbdca70c972ff3f74d38438.npy +04379243-2cd0f589d64ea3ec36ac40071701c687.npy +03001627-e23400a634c81fec3cc5c2b17dc81196.npy +04379243-4f2b4f1c35054480438d580e74643a65.npy +04379243-9d41c5e8ac8ca4e6827b73eb36515554.npy +04256520-fdc419e377f15e728101accd22c701b9.npy +02933112-422975f531854eeaf36ea1eb6542fe7e.npy +03467517-980e470ec52ca71863ae8c3a62777578.npy +04379243-631251b7c08bad443e890a18a7c6a6e8.npy +04401088-8270c952b147d263b9746cb9e2b9d08.npy +02958343-2b043f3cae45d4937cbc6cda01aaca49.npy +04379243-535911bcbab242877543d7dbfecfffbe.npy +02958343-35f6b9780e173878a8c38723d07b122f.npy +02958343-5f2ae8bd2d571e7c6436916a86a90ed7.npy +04530566-5ef0011ffbd75eb6dc1a42a6163b8fdd.npy +02808440-3e9b4b309c9db612b0957d845ac33749.npy +04004475-f3ff60a4243d6667b609fce60c2dc7.npy +02933112-b6c1fd850c5b042c738e43095496b061.npy +03691459-ff9c1754252b9ebf73c7253ec9acd58b.npy +02691156-7220043361fe9e50eb983188eb4e930b.npy +03593526-c6506a2457f14e9e5ca1f314f1afc186.npy +04379243-4bff004a90877ea319fb4103277a6b93.npy +02691156-ff2f975a23b78bc78caa71b1fbf7fb98.npy +04379243-5ac80d0ff2237fd8e2dba1fdf90cf48b.npy +02691156-9a84ed39f9a2a3c0b3f2b01de37c0b29.npy +03948459-8cf7c6268ed360c35ca3862a7efa6401.npy +04530566-cc03dbbf18adc483bcf964ea747b39ec.npy +03593526-d61010bad35efd8199e8bf807e902261.npy +04090263-bbe366b82cec5894c082409e8305f221.npy +03636649-cab6546da3916aa53c8d0fdfb1cc2535.npy +02933112-7728f0ae18c58d067e427098d75ece6a.npy +02871439-a69640051e489a414b9112ce9ce98204.npy +04256520-9451b957aa36883d6e6c0340d644e56e.npy +02992529-93556001d266860513ddb059403c66d.npy +04379243-f03a86b27bd0a6b3d86234e915108e6a.npy +03001627-6dff84a93b82c888486150a9b7f2cf18.npy +03001627-33abfbb0993473bd71a782a4379556c7.npy +03636649-d508d163bd2e50a41b62028fb8bbd788.npy +02958343-92ff3c7b2b8b1f65e2693f33cdca907b.npy +02933112-8a2aadf8fc4f092c5ee1a94f1da3a5e.npy +02946921-f8fd565d00a7a6f9fef1ca8c5a3d2e08.npy +03710193-e434e428f65c56ed79dea5ba5d13aa5e.npy +03710193-b06092a58fd7f1dc9981642c1048582c.npy +02808440-d066024b84c1b4fb469ceade478d6997.npy +03001627-103a60f3b09107df2da1314e036b435e.npy +04530566-438a1ce3825bc06a18803813f0c0dee8.npy +04401088-9c2e939e173fb6e88af54f33b2f21f70.npy +03691459-f7624b0826b4da3ae7e41e72dd76c27a.npy +03761084-3420e627144ab8bcba7ad9409a09b1a9.npy +03337140-bfcdaac4627b7c13a7a7a90dc2dc5bd.npy +03467517-27e36c61a12d6df8d57700c05b1862d8.npy +04554684-4b5552c17c1fee56b6c98c3c1d4f4fcb.npy +04379243-9b8e6eb835f0c8bcf37af16b2893f1d4.npy +02933112-2fff20fe8b4b4a6cc59350d819542ec7.npy +02828884-722458bd2a0eb811214a15a5a42c49c0.npy +04379243-d799cc222f34fc0879bb09dc5605a57.npy +02992529-434e23fb04effbb86bc30c6a9ae3d46e.npy +04256520-7446fc82485002938db1c6c15d875c99.npy +02958343-485df8eb9c410c132a9eb0f146e94477.npy +03001627-3f11833d3d9309bc9952c05a06935ddc.npy +04330267-558f7129b2b31c34134a4ff70ce43955.npy +03624134-8280b4bba3a38926ddafe9b591eb9ebc.npy +02933112-d3257b1df741d9a099c549327bba1953.npy +03325088-cba9093647736733275d003e423c59ba.npy +03624134-7aed22a7074f16431cf05d6e4dbb95af.npy +03790512-3a247c8b82bd675c1fbdb352261d023.npy +04379243-c27bb0cf69183cdf78ebd8af2a314e49.npy +03046257-f1bb9e3a9f4b37984ccc5a59d21f8efb.npy +04379243-20714210c5319a68b16d12ee250aa07.npy +04090263-4b4273fd49971552cb833b31b53d151.npy +03467517-e0ca9ed192df5529e5e24299d76e4a78.npy +04090263-2caebc928dca9f84b205c7feccc0f737.npy +02691156-132111c575000a3c146e44cc99f07c52.npy +04256520-152161d238fbc55d41cf86c757faf4f9.npy +03001627-2d08a64e4a257e007135fc51795b4038.npy +03642806-3237f5cd4bca555955357c338ec9641.npy +04090263-9cc96465d70061cb94deaa9fff391d41.npy +03001627-90b6d8a730e9e17cc55161a63fbd109a.npy +02958343-4773cf28df771861b112e5ac235c21b7.npy +04401088-90010049891220187eda1e12bd28fb7.npy +02876657-912a49eeda6cd8c5e3c462ac6e0f506f.npy +03691459-74a4f472155ed5a3b2bf4f773fe0e622.npy +04256520-16ca439cd60eae5f23500a5b036df62e.npy +04256520-51e5da3e9f55c77ec15dc8fdbaa55abe.npy +02828884-617fa8d6d65af35d71295682a9280b8b.npy +02958343-604d915e7bf91cbca22cf2b42142a7ea.npy +04379243-1d43a3a22ee451e62511fca00e0288b.npy +02992529-fa9b007a326be6975c8fa950032e0987.npy +03001627-8862fe77a7856db29a8ef44e1d2c5b75.npy +04379243-8d0e190bf8d8021cea7b477e7b62986d.npy +04090263-90859d41f2b4b996cc34b900bb2492e.npy +03325088-abce921108990509251c40136771148c.npy +02992529-8e00be7402a612e17d6b888b4eb1ac9f.npy +04379243-a2f9a8c649bb70d35c08aa223a05362d.npy +04379243-7f71383698c24d4f43dbb6421d614c0d.npy +04090263-c3d75ea41abecf51519f927f2bf92da9.npy +03948459-b8fc16725ae2daf076a05817943c3b79.npy +02992529-2acb9ffbc050ac2e48bb2194a2a904f7.npy +04379243-8b5061128585edb49e9583a661702ed4.npy +03691459-244f40cd50620b32dfdc04b8b8434e84.npy +02924116-21be26f34e5a017f70a039e6dffc91d4.npy +04379243-33e344d8250471396f6d5059be65ac2f.npy +04379243-59ce1f3fbd81ab18f4b6538438a0b930.npy +03001627-46323c7986200588492d9da2668ec34c.npy +03991062-2f6399df18f55c0f5076fe09061f1a7a.npy +04401088-eb6fd5cae6ee26c8a2651abaf391628e.npy +02958343-d474f5971b5e8ecae9795e5d56b7e9f.npy +04530566-c929e6d77b548b27e6f3ce318264cd13.npy +04530566-3d908c2b4f5812702fc668af6d3ad0ad.npy +02924116-a58cf9f41c11e32541cefd10ce5d6cc0.npy +03636649-31c9507ec40650d0d5506bacc83bff24.npy +04256520-2e0f5e0ed5acb122597976c675750537.npy +03001627-a345ea2820d2f4af7ff6ace05b36a5.npy +03467517-d8fe40b706db9bedcfcd7283054963fe.npy +02691156-d54a694d514b1911844ac48bcfce34.npy +02958343-28c83c5adf799340f2cc18e077b7ba53.npy +03001627-842130b6eaaef7a4932471681ea5bcf2.npy +02691156-92a83ecaa10e8d3f78e919a72d9a39e7.npy +03001627-6ea006e5c76576b89753496ba23f2183.npy +02828884-86341aada547727593ebeeedbff73b.npy +02818832-ede5fb0f443d4f6afff56d5190327d3a.npy +04379243-958c5eac527deb6e89a6f9d60821eb9.npy +03046257-68b82646290e0be6b0a29c51aa6f10ce.npy +02924116-c2799e2c3f5845f22d42c1e28ea24b6e.npy +04401088-bf1f95958ec4d3e8d485372bb746f3c7.npy +04379243-a5b1e3e2c602d464ded526a7be77b30e.npy +03691459-1c25b626dddfc36a28d267d044b54402.npy +03642806-97df7577c2690ab82290f0f0820b73a5.npy +02958343-147889b73fa491d82e877e82c90c24d.npy +02871439-bef0368b3a9c6424d810b14a81e12eca.npy +04379243-5129899201421fe84a873bbe35452b88.npy +02808440-830fbc92254de7051c17aef130ed6213.npy +02933112-329f80229edd920a82ef94da039e491f.npy +04379243-e4571a5b7457d2dacea003eff0268278.npy +02691156-10155655850468db78d106ce0a280f87.npy +02958343-28009514ec0e2b4ebda733a39f84326d.npy +03001627-602ada3b41238c77b87028a4b477349f.npy +02691156-37608404f9e224d4fd180252c91ed0f3.npy +04401088-725cf43af935ee023832db239383a26e.npy +02828884-5b45d3a1edd81a8f2056b4bd5d870b47.npy +02828884-e285e553a6879a5e2056b4bd5d870b47.npy +04401088-6907dd835a22c32f46895db2a69f45e2.npy +03691459-80aab147daf83cde332fd8bcb8108236.npy +02691156-852e1b84dfa1f7e8e075f0bda7acfbe2.npy +04090263-602c00b06f2b47af8bfdbc9c53b14228.npy +04090263-263cb889dcad2b6ffcfb3ae2df2f7efd.npy +03761084-7431c55078a49981f557d80e0a8a9303.npy +03001627-2f1bc92c53f359d759a6208793b9dfca.npy +02933112-82f7946adba23f5f1c6beaa592f1b2c5.npy +03991062-a96ae58bf14794197e03b8d39fd0ad70.npy +03691459-e2603611f6d3c661b9b2b9d5b2804865.npy +02876657-24feb92770933b1663995fb119e59971.npy +02828884-a0cadebde61910df98e8242d4a63e1e5.npy +02933112-a8bb33c995207084bed1bd9593e318c.npy +03001627-cfe139c0e8b8cfdae342bce0d924820.npy +03337140-7ac63d16fe21f2a491c352d02061b3f7.npy +03467517-675a76195e608c749f817bf67854cc42.npy +03691459-1ba6735cd32d907ad493bfe20f94b6ab.npy +04256520-c70310da520e0499c2c449c0c0579ec3.npy +02828884-d06cf2129d36dec7a4f92840428bbcfc.npy +02958343-11dba0c2ec8127356c2fe9dcfa1ee2f8.npy +04090263-b3bdd86b01306e7b410d23b0a192e911.npy +04330267-12931afc82f7925359e2566a2e6781e5.npy +04379243-486b0764bb1fb92cc3bd24f986301745.npy +03001627-52f9bde46afeecc5dc3653f8341633a.npy +03710193-df7337cf26adeb865bee258e658f9767.npy +03325088-d35b4af3d4e779d4c36fb70296e45483.npy +03691459-48c21ec6f9623c997ededbc2b9b4362a.npy +02958343-c778e4d590417da82205cec171865d70.npy +02933112-9d0a9c46bb6768fbd37a1bae74ee50a2.npy +04379243-bd75fa23435df54b8430b7446f9e1252.npy +02933112-115e4c9a9150fe8e99dd23ec22c4943b.npy +04379243-f5d87f88bd9b31ad2f0ebd444c10bd0c.npy +03001627-3193949a635d8682648909df12856289.npy +04379243-4b399cdce8337c29285e0e27752e54a8.npy +04530566-c2eb5277d66ff1af79953c8c5ce3505b.npy +04379243-e99f7a450afce3b62553cc33364504d5.npy +04379243-4cd35d6ec155d39633207e4c3ac155a4.npy +03001627-e6719610fd2c44c99295da7959c963a1.npy +02958343-135c965744d1a523a60665b13300f1fd.npy +04379243-4231174a23bac5d354d30af857cfae06.npy +02924116-a3841f9c67d82a24193d7855ecfc1bd3.npy +04256520-d2a4faf6613ea1e66db434563c7f5ea3.npy +04090263-d439acf80dc6e1a9d40e00f72aac160e.npy +03001627-22b8498e1ee46520737a00f007529fbf.npy +04530566-7e6aa3337c2e52ff196f35b142096073.npy +03636649-b2c3fb8c5b65a63ce2c3d541bbe76212.npy +04379243-45b9800c1bcdc13735836c728d324152.npy +02691156-46c311894026d9a762b600da24e0965.npy +03001627-7740fa5979753c734209d14d674fb332.npy +02691156-d5ad529ad399086e4e9a6f7cd468e49d.npy +02992529-2009fed0ea8d1fc3e2dbe704eec7e8d9.npy +03710193-42cf808462bfcc2a8d1fe8cdc415f4c5.npy +04379243-a131dabb9fddd3c97a845b3267216856.npy +02691156-b4b21950f0627213fba066e52ee0e502.npy +04090263-5833fa72da0bab839c82b3f5ddca589c.npy +02747177-41b946cebf6b76cb25d3c528e036a532.npy +03636649-6faffa042190494a3def89b32cef8e45.npy +04379243-843713faa2ee00cba5d9ad16964840ab.npy +03046257-7b10961a2fb3de4b4b3c42e318f3affc.npy +02992529-fe02978cb3b6fcc4cec837e48e8de67.npy +03636649-8422870b0a65255d5cae1a083183a237.npy +02933112-30b75567780d84638ac5263758737a81.npy +04379243-2baa1d2adfec9a58445e85eb534460b0.npy +04401088-30e53b35873e59da73ea3d752b4ac8ec.npy +03691459-ada71fe1283154ccdd70fcdaf3665b80.npy +03046257-de0a333f86fd60713b48a711df82173e.npy +03001627-97326604c5fdff1febad4f49b26ec52.npy +04379243-e6ee101d3cb13bdd16a2b5862518c93.npy +02818832-89675cd9d71a905db0541044a1a3304d.npy +04530566-4b491c434e9c230c9e450dd115401ef.npy +04256520-76bef187c092b6335ff61a3a2a0e2484.npy +02691156-26e26e21438ed02990b1d6deb98feec6.npy +03001627-d460611ebc267961d838ae16242881dc.npy +03001627-46dfeffa91719044de2bbe257d2639e3.npy +03636649-e22cc77e9bf9eb0875d36c94c257eb30.npy +04379243-212756a9f7bff5892f6b08a7db6d1426.npy +03001627-c4170208c9586eb63c2247b30d3fc073.npy +04401088-e3c02395e83fefaa42dbe6bfe3cdb29d.npy +02828884-d290989e0cd0ef7acc546d806a30d5b.npy +03001627-59bbf4d0360e4cf733e5ff708bab9b06.npy +04379243-cae89eddba3c4fa1b20aa91e9e90c311.npy +03467517-13692f8afa936159b1a94e2dc3e48368.npy +04379243-592819b967c53ef0f1755b5047ed68f.npy +02828884-1ccab18605adebb15735dec4de5bdaeb.npy +04090263-49083d2b9f3e6222bde9b246866ffe11.npy +03001627-2a1f13b41192e80bf51fa0238791f5dc.npy +04379243-cc4c36724d3c26c65ff61a3a2a0e2484.npy +04468005-5b4131c68ac6062152470de2774d6099.npy +04256520-8ea0e8e7a863b6dab2302e21338c08b.npy +04468005-12733f035bee06de52aed63c67d1c6.npy +04379243-798fa47b8508c8b162a510b8f97c658e.npy +04379243-e65cd563d3a74dd4c0a61ad1cf92b694.npy +03046257-6ed55af31d57c4f929a60d6ab40898d.npy +02828884-501e374fc9a9e5c263b2acb037dfbcde.npy +02691156-2d255ec7a05b301a203936772104a82d.npy +04379243-d4c330d27bbef3808f6610bf672cd686.npy +03691459-69212e8c41ec753fbe62db7ad46c40f3.npy +03325088-fc13ea21c2542368c36fb70296e45483.npy +04530566-a7fdfc15268ff4d68413778731d6cd28.npy +02691156-299ec43108d7109113ae47e860a2333a.npy +04099429-b6a04a1ad7e71394973c59607554704c.npy +04256520-bcc3c5da89afe93517a7e95ef7821038.npy +02828884-715445f1eb83b477b1eca275bb27199f.npy +02691156-576edc1da4e3fb47b627754c4259e985.npy +02747177-f2ee002e961747032056b4bd5d870b47.npy +04530566-af09fac5d37072a3b830672ec83e0072.npy +03691459-c98654c348ccf6baed1d3c8863995334.npy +04401088-7eb1bb8e7f83313b5bfaa3ead015ed29.npy +03001627-f51ab8433184dfd2c8687ff9b0b4e4ac.npy +04090263-46b29fe9796be46497ca877cfb285ed8.npy +02958343-303bbfd0c5862496ec8ca19d7516cb42.npy +04379243-eb62d577d4de8bcbdda7f1d27cdf247c.npy +03001627-d5939ecbcb583dea9753496ba23f2183.npy +02958343-e859ef0e793c43dc159a969baa659ca7.npy +03938244-3e4659a2dcb7bd3f959a2da56ff43b4.npy +03790512-1650afa5bf6c8335b37378f3c85478b4.npy +04256520-be5def882071141c1a8781c24b79ae57.npy +03325088-6b513f89b3b0a06b2b3e9b6eb52d35df.npy +04090263-48b607ea57a1e16d309c2ee598f7f2c8.npy +03325088-cdd72ac0d6def4e8b362845c6edb57fc.npy +03636649-904f90ab5c4d408b313c6de30934784.npy +04379243-685b5890e66bd010dcba2d9cc78a3a32.npy +03001627-8ec247d0e133ad3ce922ceea1248b9b0.npy +04401088-db4c6fcc45cdee08d8dc338f42ea38e9.npy +02992529-d299bcdfee69c57d419fdfebc874eb8f.npy +04379243-6f88879125d12e03492d9da2668ec34c.npy +03046257-86c295f96d02fda679e11b00c4c5627c.npy +03624134-60e7b05ddeeb48eb37fa2c3ecb75f337.npy +04256520-21f76612b56d67edf54efb4962ed3879.npy +04401088-ef57d8665eb5ef7cdb965514105122a4.npy +03948459-c3906de76406ea607086518c859a3e32.npy +04256520-d334047dcbb37017f5f004a628d601ce.npy +03001627-b6c9495629c00419940806ade53ef2f.npy +04401088-447cb44311eb5dda57e80f5278d5b50.npy +02924116-3a9ea0b73c70deb015c32d7ea7a11ea4.npy +03046257-ebb7e54b68ffcf2c3ee5ff7ba8322f9f.npy +03001627-673c396b8989cd1971a782a4379556c7.npy +02992529-e458abdbff34fefe255591a17641445.npy +03001627-70e3e98efc6ec0dc611a1a85a9d58686.npy +04379243-c9c29b00aa05386562daa5fd16a7828d.npy +03691459-fe13f67712bc5e4a1b02cde7e81f0fc3.npy +04379243-72c884f3b9b9119966f379f51753f72b.npy +03593526-d7c1b9b30600ae252a6759f6ef8e2848.npy +04530566-83c90f7b104816ecc748af2814b558c4.npy +04090263-85b6261930b2174d85639a40426ad4d7.npy +02808440-62b3b1e91deef860ede9471c962dd6ba.npy +02958343-777365016f4b7febb623d8d239f6c6ae.npy +04379243-9a52ba3ccb97a11426392a5b643ed5e3.npy +04379243-5af813d1c68d4e557307e0a6ee770fe0.npy +03001627-33f5c19e34d74fa97f07eeccaaddf1d0.npy +03938244-71dd20123ef5505d5931970d29212910.npy +04530566-a88fa5daf540c14a4f6190a680acb783.npy +02691156-c0bb4f92d12f4504d65766fd3c4f994c.npy +04379243-f183fd6b062f642b5fceaa39a8353bde.npy +04379243-689ce3419913a1c5ad5067eac75a07f7.npy +03691459-82ccc798c04e4592eb34db531a289b8e.npy +02871439-bf8c485ab29e0c3549a1e995ce589127.npy +04256520-1543a5ea73b6ab10df2fa7eaa812363c.npy +04379243-2bc58f346be3570ed739a99f2688300e.npy +03001627-c535629f9661293dc16ef5c633c71b56.npy +03001627-8f6395e2451cafa6473f10e6caaeca56.npy +03001627-3dd8c11bc608441f1b17743c18fb63dc.npy +03467517-2b394d7e325c0ff5f48dc85fa744ff46.npy +03001627-e026adae39724b4ff5f913108da5d147.npy +02958343-498e4295b3aeca9fefddc097534e4553.npy +04379243-b09894688b176d426f3d2b1b15fba494.npy +02924116-ae370b6f9e51b0b26ad203a886d7045e.npy +03001627-935f5e58e9e15231febad4f49b26ec52.npy +04530566-8666e4e88dc55c5795ea46728bcdc15d.npy +03001627-f29cbdb2c7bb10f9953d950bcd7de7a.npy +03636649-92f9d60912030cfb3a8888e78d004b3.npy +03001627-1e4fb9149de6be81f51f77a6d7299806.npy +04090263-65e3a44a0a13a1bb547046f04c724fd3.npy +03928116-13394ca47c89f91525a3aaf903a41c90.npy +02958343-626a407fd0fa17d3aa1fca93ac59c77e.npy +04530566-a8db7dcc16750af73c83f6e156ad107a.npy +04256520-3e3ad2629c9ab938c2eaaa1f79e71ec.npy +03991062-a487dbb48fbbe5393f437989dda71b40.npy +04379243-c64b12e620977f0a87039a8d98cfc027.npy +02958343-879121a1bb623324eb79f1a2fb4e869b.npy +03624134-7fa2fc6addfa9191b70d6d22050634f8.npy +04379243-73dfee7c17dd0b2e469ceade478d6997.npy +03001627-4e1948cb03956c9079b3e1be3524f72f.npy +04256520-d21b63623023b40a593ebeeedbff73b.npy +03211117-c7185c6e5dd741e139b7c00cb61e68ec.npy +03691459-6833234a218df871aa35b1de51ec4cad.npy +02808440-1ccb1ab19056b80891a2440e0fc33776.npy +04530566-4af6289f159094d21197663c308adec2.npy +03001627-51aa5f1157cd456f9f9dd9e7d6540d50.npy +03467517-605ddf879e8601d4a072700b3aa0dc00.npy +04379243-625d465a8d9342867ff6ace05b36a5.npy +03467517-bf038654db326b819f585e02b4e871f9.npy +03991062-911256bae9b19fdaa2c59a4d90e63212.npy +03691459-f0e562c21dfcaaa1d1936ff8c5fb2337.npy +03001627-100b18376b885f206ae9ad7e32c4139d.npy +03636649-f85f26c5a807b22312bea13341a54c3f.npy +03691459-8e55b303ce059ac5aca1a38908852eab.npy +04530566-18761559208a970188d5590328ce0ddf.npy +03001627-bb88bf9eb071f85bb232f4221eaa5610.npy +04530566-7e96722d076d9e9020dfe072b77502f8.npy +03642806-4504a4d244d05ddbf5f79806bd65844f.npy +04379243-af8636a4e4d6bfecfebad4f49b26ec52.npy +03211117-6f9ee2b839d3a03683fb187ab7c1f026.npy +03691459-6922e97ab45e4e47b59e9758ae7f41a7.npy +04530566-303736b1be32f43c1c426bf7baf37c25.npy +03636649-441d06d5a657a5dfe7ae87d20a4fdaa5.npy +03642806-c3382162e3502ee41bd042808f3b79ee.npy +03624134-a105080ce4564145aeb54153795ede63.npy +02958343-73e977c312f8628b1d65faadf0df8f28.npy +04090263-552243084ecb0eddf500cc506a763c18.npy +03513137-500502549d46f6d34e61e54863a9d5af.npy +04090263-6f652f3940aa986e3e243aaa4500940e.npy +04090263-b7b3f609d8af14965d0dded52efeb4fd.npy +02946921-efa4c58192cc5cf89e7b86262150f.npy +03001627-4c5ae0ca12a5e8b3490ad276cd2af3a4.npy +04379243-71d35a394d35f70619fb4103277a6b93.npy +02958343-139df45393b6847838805e546aa28d99.npy +04401088-b442b550e827cbcc8ea897fbf75dc392.npy +04256520-79b544db8d95c3dbc1a25f36f85c3fd6.npy +04401088-2216e78a43c5d587b8e1b99345a5afd4.npy +02958343-eee2c0e2912f27b15a49026b22f63b06.npy +02992529-fbe18b762a1328916b7f36a4c89ad37.npy +04379243-469fba8f6fa06e6d2668a5ff3e8889a1.npy +02958343-b41bb2a3159a9506977b27045b1d8055.npy +03046257-e2f7bb607fce0e39cb0b7c9444ff3e4f.npy +03325088-a85bdfab2e46ae2ab7728045d0c829bc.npy +04530566-a53eb39c51a7e0a2dcb7d7c06abe0da3.npy +03636649-ad5c4651205a59f7fa0f332f678cca2.npy +04379243-45f04dd3dfbc4926d42ec7e303174a87.npy +03207941-fdcd7f8a036dae3a96a401b0ce8b43ce.npy +04530566-8c4fb998d99465b48cfe472915a175bb.npy +02958343-d85d6bcdc81df377f52657bb1f80be90.npy +02958343-67ec617aa2352596ce6bb1d0811960f.npy +02691156-e08402fb1e5953a2a93f0f952e72609.npy +03001627-366118e316f03a35327289c00b6dc9ca.npy +03325088-222c02d696583d5b362845c6edb57fc.npy +04256520-7cf9738a01e47dd6a123ce0dff5bf4e6.npy +04090263-ff3425cf1860b6116314c3b6a3a65519.npy +02691156-3bc8cebf08ac975dbd46d022fd7d80aa.npy +02691156-9e4c0840aeacbf10f119374ee5d5f944.npy +02933112-d894ca00249da3fbecbb1f16dced7a99.npy +03001627-f3fa7bd00b76f6a87a8a6b9421844d96.npy +03636649-bcd32489ef6fc12d8f32b552c0a1567c.npy +04379243-3834bf577a25eb2d1ce5b91ffe4491de.npy +03211117-ab69e803c34c6b8536871b478a4420ba.npy +04090263-40f9c088e4a4eb77df3029a778e2c881.npy +04530566-b78f1dd3083c35a1a716de2121565fe.npy +04090263-ddc90b69e90b208580c2e60c312b0f09.npy +03624134-de62211649b4cced49384f9741ad64d8.npy +02958343-c1aef2e67a9608511c4ba4758a592406.npy +02691156-4244f171a6065c2f71e3a79f2415f19.npy +04379243-25dedf655982acf6490ad276cd2af3a4.npy +03001627-4848b62ac4a996b3f51f77a6d7299806.npy +03001627-ba5911cd07d1eebb31475fd256bf1b7a.npy +03001627-ca4900c42b8016ef8397cd720acaa508.npy +03001627-7b17a70aef82c51cb8fa4cb65e077db1.npy +03790512-6b93d5f2e88326f91f80189578e6ea85.npy +02691156-6dfde67c8b905939bc0909d98a1ff2b4.npy +03337140-58e1ece086677b135d354898d3243eb3.npy +03513137-854adc84a21c0a1de8fe5a1391785bf6.npy +04256520-8e74405f71017cd5d509fba1e6dd3b0c.npy +03211117-35003dc3d74527729a1d432cc80562d9.npy +03211117-c8223ca4a4fc81b3ad1f278e1513f3b7.npy +04530566-7d3eb0d2de5c5b8672a78a0929ee12bc.npy +04530566-e708ec80c30086c36dd8881532b5a3d9.npy +04090263-e37b87e001f24db1e55d13d7a8d27c90.npy +02828884-9790980a8ff823287ed9296ee19fa384.npy +04379243-d69a4fe99afe6e0097a5b791ac4ae3c8.npy +02933112-38c9f4bc9c5583d7824662341ce2b233.npy +04379243-f252711946bff75aa5234533e6540c01.npy +04530566-4a7375e11a8ac1ae565f244baeeca983.npy +03001627-d29971cef754cc91cd8c5d1ba690a2c3.npy +03337140-946ae7b4553f69d7784168ad9d1dbd5b.npy +02958343-8e85cc8c9b9ead7562b21e1bf23b9ba8.npy +03691459-1152c16d1081c32a561e8b31a1141890.npy +02933112-c95634c0a44d6596e71fb4d3a412f2d0.npy +03636649-846ae34d173c06d828e0b580c4eee0e6.npy +03046257-9f997f890bf6143d5bcd4b910d7ff028.npy +04530566-5ab18f317c0a5d21576932faf8645222.npy +02958343-4c53afe560e36d8380ba2a9340bf2d77.npy +02808440-6fe04845ce20dd244221bef0fa3c36b.npy +04460130-614ea50301bf9179514f720d40bfbeb2.npy +04530566-9d8d5086930871efe2e5f41247736024.npy +04256520-9ecb691016c6295a50f06b72cb7e77fd.npy +03046257-2be4aa0e5ee54d80ae77574c7d9d2318.npy +04379243-e09377eefe363b4f8101accd22c701b9.npy +03001627-b85de1f567a654737f8769b595aa12b0.npy +04379243-d4491f4fc4d37391f8333d818f5f80e1.npy +03001627-91d84fd5e5ad5c09e63beedfeef0900b.npy +04379243-9c5571c45d44edebb6aa381e6d41cd4.npy +02808440-10d8ddc79b74d150d9b53420a5458c53.npy +02933112-3bf437403138e6c9aa669fbe8e7a7c4d.npy +02958343-fc5d8e25052fb713f559279c88cd9a37.npy +03467517-f411d80eb0dbc9158757b091804bc082.npy +02828884-f7fe4b70b7268f6cc118bd35b5372812.npy +04530566-9004946f75082a8632c0857fb4bcf47a.npy +04256520-bdfcf2086fafb0fec8a04932b17782af.npy +04379243-9affa2569ec8968c60edf8bc2f5c8881.npy +02808440-e90b251f9f026ab36b354c7301136f53.npy +03001627-729650e08d4ddb97ed98cca8f0ccd5f7.npy +03001627-1c6eb96eab5e75b67b79156a61ad4c01.npy +04379243-a8e015f1de2c48c5f51f77a6d7299806.npy +02876657-4c95086448461907d2e07f4a91040392.npy +02691156-9a5f4508a4337d195e48cdafd0101d9.npy +04090263-3387f6bf3cc73546434837e2aadd6d77.npy +03642806-8fefaa8179404c4ae165aa9cd54a0a29.npy +03001627-ce474d7c415941acfebad4f49b26ec52.npy +03001627-48fd6cc3f407f1d650c04806fcb7ceb6.npy +04090263-24386a93c942c7ebad7daa06d33b72e7.npy +02924116-bca84022a19d22f041cefd10ce5d6cc0.npy +02876657-275b8572dbfabb9d88873c05c27001.npy +03001627-f9bb302961c91d7220160736f02bc9e4.npy +02691156-de72864008c4db8bdeadc9ca0263db5a.npy +04379243-d1087cbbd15f509c20768660cf080d12.npy +04530566-3ffae5def89153e911141f4b3ef0acd0.npy +02958343-22d57b895b9cd22137ca7da637f7c918.npy +04530566-d8acb2681ea3e2466c64e0542c2b0af.npy +03325088-54eda983813a7168bad9bd0c4ab8e3c.npy +04530566-7eedbeaa5216ff06ccd600f441988364.npy +04379243-6f1d3ad68c0440a38b424343280aeccb.npy +03001627-5f45bb76bdcf883d5adb3ef1dbe9e3b3.npy +03001627-b23cd3a93c8adbf56d33c8b6c0fec1f2.npy +03001627-96e8a51b1680b756e99481ddc3bbddfb.npy +02691156-d6749fad86648a9719ba010ddb4974fe.npy +03691459-3609604595f025801f9f3ce366e030fb.npy +02958343-dd35ef6632cf507804272696dc83193.npy +04530566-769a3afbadaa92648bfbe54b5d01550.npy +02691156-47c7b3cb099b3212d1c83bc8b134e4d8.npy +03001627-7aea8e52f24cd40c496c9cdc8d0a8c08.npy +02828884-717019a5d139874f44dfa7c5506ef235.npy +04090263-dc222cfc347506ee73482852b5932f76.npy +02691156-2ebfd5fec5c0bc85a52a419d042ca7b5.npy +02828884-76e5103be2d6199071998932c708d327.npy +04256520-23833969c0011b8e98494085d68ad6a0.npy +03325088-7b1678602d33579254d7082b34825ef0.npy +03636649-42bc0dce81734d892610e2a20d7c4b61.npy +02933112-abcac243e3ed325b34943af333340cd2.npy +04379243-9e55b1135ddf93211c8d18742f91c015.npy +03797390-39361b14ba19303ee42cfae782879837.npy +03001627-da02c479d1284ad38727553325e63baf.npy +03467517-133ebdf2ca7bf4b81d4e8021f58beea0.npy +02828884-64010fd77c10672dac3644c4bb0fb64d.npy +03467517-54aab60ad947a9da37d3e9143e987d83.npy +04256520-3fcb0aaa346bd46f11e76965808086c8.npy +04090263-a7da2c6df867c3e91c1943a82a09125f.npy +04256520-aa2d1614a9bbaff7e6fe3612af521500.npy +03691459-b03b88ff24870f2720363e2561dd589a.npy +04379243-681581df89b7d39975eb2bddebec5e6b.npy +03593526-d3b53f56b4a7b3b3c9f016d57db96408.npy +02958343-c61ec8875746ab78227375499b768057.npy +04379243-5bbfa33dfdab27e5821ac289e2458975.npy +04530566-693566461a33af90d7f8e93419dcfd5f.npy +04090263-adef049969b447f87ddef91dabb146f3.npy +04090263-de637cf64b212f4061b28e02a259d647.npy +02958343-88fda6df0a162605e52943dcb52313c.npy +04379243-4b2a7beb13fbe74296610c8d5ae64f96.npy +03467517-4709e55a82a63f64d57700c05b1862d8.npy +02958343-89c7e63c3d3d14aa17b597d473206848.npy +03325088-10fe88cb5484797d664b3b9b23ddfcbc.npy +02691156-41afa42c77cd167c2b5147716975ed8a.npy +02691156-c01746b173e0870b3a4cd082c6787017.npy +03001627-bbef67b2c3d3864e8adc2f75cf0a8389.npy +04379243-63e109fc1e40fda246b9f3b6ee20ff4b.npy +03636649-75cdbf96a597b57a29a42a0444436860.npy +03636649-bd0bbdadcd0b9fca7d57a0513a353be5.npy +02828884-7631a05d80484ad6d2b12aa6a0f050b3.npy +03513137-21d201f43ddd36c52fafb0cab311e6a.npy +03001627-5eb38d4e556a893a3b832d9b48bc2dd3.npy +04379243-b6a24109a5076d4ba5a296b0eec81c96.npy +03636649-84ab363e60b9bd9185d624cfcd9a37a7.npy +03928116-bfa3b2dbacd27547c124f92750a205ca.npy +03948459-898424eaa40e821c2bf47341dbd96eb.npy +03001627-8a5d60067de905336c183a120a388982.npy +03636649-d3380ee3db68aefb3f214ef9c53ac06.npy +02808440-ea8891fa9a19f8cb9e2e2edd05265482.npy +03636649-3bc8edd5ab3a2ddafcb8d8c6d4df8143.npy +04379243-6f87c833355679ef36b0f2a1430e993a.npy +04090263-f70396fbee1bf3f2f2866d10640f3af5.npy +03001627-4a48b39219bb7d64457ba044c28858b1.npy +03001627-acbcfebf917e708b2b5bf1f191733d75.npy +04530566-209f569f50d42f7e45e2a4e5729b970d.npy +04401088-e85bac837e951f3780ed245d94a6a268.npy +02933112-403661cbfc8deb029a50a2b3c5e5b6.npy +03001627-1fc918b0e5c7cf2da5c25aecef10278f.npy +03001627-d9bbd1a1eaf6d2259d3ea1c6b57a0095.npy +02801938-95385afe0390705a36b0f2a1430e993a.npy +03211117-d34a267fb332b052901fed29c825c894.npy +02958343-a77879318434261612725caceb9cca76.npy +04256520-a4de0830d9a1020e3b85980206d96693.npy +03797390-642eb7c42ebedabd223d193f5a188983.npy +02924116-fa47d3c4547b4d4fcf8b2866c5b881bb.npy +03636649-54a7ea6d6e297a849eb34048e600e1ea.npy +04256520-9c1b448ec62cb9fb36dd029536673b0b.npy +03624134-b0c7d11b2c7a3515eec6d8d24f1fde1.npy +04530566-e9cb5c7799f291ce51b48b48046ec39f.npy +03593526-c7fa54dc356f039d2f2318fdd66be40a.npy +03991062-eaaa14d9fab71afa5b903ba10d2ec446.npy +03642806-d30e41084edd4d73487f00a15f77c99.npy +03001627-abddac917b144928f91663a74ccd2338.npy +02924116-d236a2d3d923650aa3cfa46226644b04.npy +04401088-e2d49d74845ff0207e1c85c5c15da7fb.npy +03211117-3e1d0fb46bc7f84f9c4081063e213a15.npy +03636649-1ef03aab18277ff1ef3a2c64cef919d0.npy +03001627-fc369b19cfb50322492d9da2668ec34c.npy +04090263-5428fea9cd816d764fe44fa90b97c5ab.npy +02933112-6c7a1a40e645c48e9c22f14c4b6aad23.npy +03636649-d00157a022079bdef3655a2ce983ab1f.npy +04379243-44c35996414c4d89f1f3662486c882e5.npy +02933112-443a726ba9fa8d04d99265061a435799.npy +03710193-10e1051cbe10626e30a706157956b491.npy +02933112-6bf0f5e06cb748bb9671c58246946ed6.npy +02958343-7b57af1bd2d83363ea1216357e7f0768.npy +03642806-dafca3237829fef9f6fef4a0ba2e7186.npy +02808440-20c8ca22f5010bc81291d1279f7bf122.npy +03636649-3e1a71694488a4cd77b98fdac17a3204.npy +02958343-99fce87e4e80e053374462542bf2aa29.npy +04379243-9e560ee4c7438578f51f77a6d7299806.npy +03467517-576ee680a8aa61fbd4c2efa838ad32da.npy +03001627-f1f670ac53799c18492d9da2668ec34c.npy +03467517-fb1a79f06ffbcaf540c20797381ee39f.npy +03001627-23218bd682d522d19fb4103277a6b93.npy +03467517-f2b4f9d8f31d0dfcfffda81e9d316a1d.npy +03636649-33db0d4bf66731a7e7c7920f6a65a54d.npy +04256520-bb4c963786dc746855f9a00acc25f137.npy +04379243-3e760133301353a147cddb7c026e92eb.npy +02843684-91c3a3be8f8c5ed1a309fc846e6b0c18.npy +03691459-efb2eac3d84429d6363cbfdd3d5388a.npy +03211117-4b2a5a666ebcc1ae57c0e3dc4a759a6e.npy +02747177-c50c72eefe225b51cb2a965e75be701c.npy +02958343-e9738c96c8ffbdfdeae19b6e682da29.npy +04379243-b6afecd780203c81b9a51c308250e422.npy +04379243-cacf61ed869db8e7f84b0be7f50940eb.npy +03046257-3d18df96d6de08b1cbf3dda885c64a76.npy +03636649-ca6c2a23c86be64e2b93fb2743876c57.npy +02828884-1695ec4ee4d2e60b50039fe1590fc615.npy +03001627-e07c7d5be62d7cd73ff4affcd321d45.npy +04256520-901eff0fb9cf6e0646a3128b588876cf.npy +04379243-bed0b40333f195c52ea6ece84d077ef0.npy +04225987-30c835f06a930d356e6c9ebd9b889ec2.npy +04004475-2135295ad1c580e7ffbff4948728b4f5.npy +04090263-cf21d9de1440d3d203f35d9b3b48203.npy +02958343-4fcf76fa7f07a0008bb11dbc05ffaa74.npy +04379243-9665f677dff2405ef51f77a6d7299806.npy +03593526-ddad820c8cd5c1ee564eaedaeaa04f28.npy +02933112-1d7b04fd768eccb5f838a2212356e267.npy +03001627-434512cad2c10e09e8b2b8dc0c816caf.npy +02942699-db663e3f7ee9869f5c351e299b24e355.npy +03001627-987770212e08392d2c528d33bca1ac2.npy +03636649-3a29634236aa0596f9e8cd846ef13776.npy +03642806-6a360b7d69a4d522ce45dbec0d835ca5.npy +04330267-ae6e6b33ef0f78d8c9a835319c0150eb.npy +03636649-8adca6727b3275cc305056296c226e1f.npy +02924116-e887b5b410aa97d347eb2ab702fd92a8.npy +04379243-d903be5d4ceb3fd56eceb9b47ba95c.npy +02958343-1d5872004edf12038644d87f4c93cda7.npy +04379243-73a870e530c3a9993c77a85180cab6b6.npy +04379243-f979c7a650d29ea819fb4103277a6b93.npy +04256520-1b4cfb30e4f49edb4b3c42e318f3affc.npy +04090263-3aa24b3c616c2d649d5aeb7097eddbda.npy +02828884-6daa439badf26355593ebeeedbff73b.npy +04256520-3c08ae3ae78253bb73800789ccff9705.npy +04468005-2c7bff9607252a9829054625f34e281d.npy +03001627-800f60058f12a5243c2e0b170f2ad8bc.npy +04379243-898936a8b8e448ad1d70b774ac91773.npy +02933112-2bdedc5d70cda02cc59350d819542ec7.npy +03001627-66c791cf5f1e61a09753496ba23f2183.npy +02871439-60a120d9fd6d2e6afa910dff05693976.npy +04460130-f584f1a14904b958ba9419f3b43eb3bd.npy +04256520-82f8c687a9cf7dcd5dc3653f8341633a.npy +04256520-9cddb828b936db93c341afa383659322.npy +04379243-f2e6820ca69d9b7719fb4103277a6b93.npy +04004475-a3cbd7f73ef9107ac79ad43fc7954c58.npy +02924116-cda78b99ad19e0bf7cd3cf23748abfc7.npy +02924116-da206a22fab289812dcbe72a6f5292ad.npy +04256520-d13cd4fdf27074854b3c42e318f3affc.npy +03337140-10f998ca3f52fd7991c352d02061b3f7.npy +04379243-f294a34bf1c9ebb7f12d7184a2ad3430.npy +04379243-6af9a593129b028eb67e68783d58425a.npy +02958343-c5f77a00c9cae334cfd826dd468a5497.npy +03467517-2a5254c39a3ada8ab7f9d2da6fc61cf.npy +03636649-b57bcdb88c669663ec2a7a1f5fe7365d.npy +02808440-945852e568b5674a1c17aef130ed6213.npy +03211117-1ec7d9fe07b94f6e274d4393e80e99fa.npy +04256520-933a9330407d51b6a8cfd114c4b34e97.npy +02933112-a58e77d8a9b37e0280b9485fe431cb14.npy +03046257-a70d4a4cd569e7ae4e09ebaf49b0cb2f.npy +03624134-e4f610f36ba3c6f69246ea0301684d80.npy +03001627-2acb11399d4d6cc335836c728d324152.npy +04379243-70f9acbbc2881b7657629428a2666327.npy +03991062-79e00a2e90a0f4e37680453d225551f.npy +02808440-a00e66c628e452413beb0acbcd481c2d.npy +02808440-751e8ebf30e1045e54d7082b34825ef0.npy +03211117-5a440522b7df4cdf318d408ca5b702a3.npy +03593526-1a1905d6da94d9c7561ca0447e446f39.npy +04379243-b10d84b3a04085b17618b16b281bdf56.npy +02691156-92fb0d6a866fe7aca8607f540cc62ba.npy +04379243-8934c3cc317957db4637188d1bc69cfd.npy +02933112-b64d237b3718134b6e5b9257c4084ca2.npy +02958343-e23ae6404dae972093c80fb5c792f223.npy +03001627-3ae4d69fc1f9b15d2f008cb82e08f24e.npy +02876657-f2279b29f7d45bbd744c199e33849f2a.npy +04256520-f49df2996692bda02c528d33bca1ac2.npy +04090263-d7192df213be19cb365a9fccb786f8e4.npy +03636649-fa0a32c4326a42fef51f77a6d7299806.npy +03636649-bc4db3c90716f7ede76bc197b3a3ffc0.npy +03624134-40ccb8ac250e0ea5880595487ba7a30b.npy +04379243-99ff33b261920e8a55f9913e822d5318.npy +03513137-dfc0f60a1b11ab7c388f6c7a9d3e1552.npy +03001627-a598b87a9e37a438617c72672c86a49.npy +04379243-682263e19fe7c52d492d9da2668ec34c.npy +04379243-6ace903899706a5819fb4103277a6b93.npy +04090263-9b570b06ee8a7b6f56642b7cedd4edb3.npy +04379243-743992f3e73c7e258ba8ff316aec8d3d.npy +04090263-369127e85227fe5e218e4ad7111aa13f.npy +04379243-a88b21425768bce39f6ec855d7c1f09c.npy +03001627-11c9c57efad0b5ec297936c81e7f6629.npy +04401088-fca7558e383a8200a1a64f95774cf79d.npy +04379243-124c4b3afa6a3e56eaf288f952624966.npy +03001627-fbe08af112773184e6fe3612af521500.npy +04090263-3d4d7ae437d1153317c2892ca017a9e0.npy +04379243-a3ecb4d209807312492d9da2668ec34c.npy +03691459-56e41e5e3bdb2c8dec29f84f96a7e29f.npy +02691156-4542b5cf23a95691ca8607f540cc62ba.npy +04468005-3158fe582164b940cb2ecbd32dc2119e.npy +03691459-e637b80011db78c3dd6a08110bca7bd5.npy +02933112-76172d3f487ccc6cf4ab13f4b49ac318.npy +04530566-9b02ecc129d89000f4841afd366e16cb.npy +03624134-67b845419e36948dbfd8c61edd01bb6c.npy +03337140-2a9fe1253f9433d1a2651abaf391628e.npy +02924116-56c9074a335703c8c9684e1b606d6226.npy +02933112-763c7a6a8821cc75ed40cf95f720995f.npy +04379243-94ef4f9589a1577e123691872d565e10.npy +04004475-d4786d9d56c74302b216fb38ac0eb009.npy +04090263-311f3a46111ef5346314c3b6a3a65519.npy +04379243-41c027788c1388bbc48d90eef8384210.npy +03636649-b8e26fbbb44def8d1deb48513aeadf93.npy +03790512-103e3c517cd759657395d58407f193ba.npy +02828884-9a7847726c939d86c267d7dba6c1d40c.npy +02958343-7076464b3733aa38d2c2bfa672ed621f.npy +04330267-b41c827cde59b18c41965be83b7745a.npy +04090263-cb9255733bf39c58f2dfd8037041a218.npy +02691156-aa4df918db6c5973db6e67bf56014264.npy +04379243-ac864eb8b8a084756ddf5c10cced4ccf.npy +02924116-cb92e325a921477cb2396a459c8a8602.npy +03928116-f687d16e2b69a6d48a8cf1e3e05903e3.npy +04379243-4e08d2efcf14b7adee170fb6995748d0.npy +02747177-21a94be58900df5bcb2a965e75be701c.npy +03636649-da5f13f4048dbd72fcb8d8c6d4df8143.npy +02808440-10912c73b7290f963321831d2245cf06.npy +02992529-49ce3fc723ee4b362d43b5caea00b490.npy +02958343-d5f1637a5c9479e0185ce5d54f27f6b9.npy +04379243-59d4c154eea079c5492d9da2668ec34c.npy +03636649-d543465b35604aae1735ea0e092a805a.npy +03593526-82b47431bb7a115a797bc94512844136.npy +03636649-9cf1c74f842be30624a15e3e5e0014a0.npy +02691156-bc48b77452fd108adf8f666ba0e601ac.npy +04379243-12936ff9bc1103944b3c42e318f3affc.npy +03211117-cab3f094677c1070202380f1becb8a55.npy +04379243-73d02435d9e077a75e062e3835b2d911.npy +04379243-1955e341a77661a749684afbca35f3c6.npy +04530566-44a50dc1a9d8a8a65144962e2c20b832.npy +04401088-597b3a321198f0a029b6ce1cfa22349d.npy +02958343-27645458fec3d7ed514e3d96995c555d.npy +04530566-969163f17ce6467d9378da473ee38a8d.npy +03211117-3fa2125a637970e2dc43f1f9f0a849c6.npy +02691156-6615bb23e68159c193d4024985440d4c.npy +04379243-15f0878e6bd57e6c417da6e71c86659f.npy +02691156-fdcb11fa39661f0fb08f81d66e854bfa.npy +02828884-82b8609a6b1dd9c1c1c1ff0fb1d59ad.npy +02808440-35cda808679bc2544221bef0fa3c36b.npy +04379243-14e1d60337a533acea003eff0268278.npy +04256520-34d7a91d639613f6f51f77a6d7299806.npy +03467517-93ee32a4660864eb1c91d5bf986c0423.npy +03325088-1cc79cefa63fa41d2d3adeba9d9c3aae.npy +02992529-25152b4f593e5c0555940ab8fd747fc0.npy +03001627-85c2609fc7a511ece32cefe0e484fed3.npy +03211117-9be4d56513c06315a045e7ca381c39f6.npy +02808440-b27bff29f03406c63321831d2245cf06.npy +02933112-26dcf7a76c89d5aa4da5feafe6f1c8fc.npy +03797390-83b41d719ea5af3f4dcd1df0d0a62a93.npy +04256520-9f575d367e59591128fff7ee99dcfdf8.npy +03211117-3351a012745f53a7d423fd71113e0f1d.npy +02691156-da7354a90e6596e6139336f03eb955d2.npy +03001627-51adac207965e93559f8e31ca87c470e.npy +02924116-93bc3e5c081291c2fd8a70fadf367c22.npy +02876657-b8fd592b4b5dcaa41aa761bcc4793321.npy +04090263-62217abb02b74e9deda1c1890030d195.npy +04379243-993ce4314e32140f38454b411e0edc29.npy +04379243-41cdb5b619790d5a74eb542502c2205f.npy +04379243-d05ff7b47febe58a656db3f863b4b796.npy +04530566-e738f72e4c461e79cd202a4790115f0c.npy +02828884-94ac417b7ec10bcc6420261eb2dfc717.npy +03467517-48d8c9000728c71d9cfb8e6f6728789d.npy +02747177-632c8c69e7e7bda54559a6e3650dcd3.npy +03991062-5b79c55d2266d4f272652f4081ec5a77.npy +03001627-df7fc0b3b796714fd00dd29272c1070b.npy +03928116-5a91c90b73671e35b249ce9318fa571.npy +03001627-df8311076b838c7ea5f9d52c12457194.npy +02691156-38884564ee0da15798494085d68ad6a0.npy +04379243-c094e213b2199035ed90a8a4ccf0ca93.npy +04379243-6f957742745697cbceddef1607dd507.npy +04256520-29fb859b965bc4af691e0e3fa7867bda.npy +03636649-50cade4e6f714f2fc72e6d708486db91.npy +04379243-64aa142f104b99379a535d0a5590e4c0.npy +02808440-9e0e6ad9f5fb863bb362845c6edb57fc.npy +03325088-e1e7f5f1d431e77f6d0157e3e7a8917c.npy +02958343-ab2759c8e0cf3b8da9d243597c4c2c2e.npy +04379243-611354b629b71f72d5b708f09789d978.npy +04379243-41e1dd0f69afd7b093e18ebd46d61795.npy +04256520-baa8760ca5fbbc4840b559ef47048b86.npy +04379243-fd861b13a3fb637e463650bb8b4560e7.npy +04256520-136d5a16b110c84566b7da89cd9376ad.npy +04460130-aa20fa2c82a588d381b0d56f7467d8ca.npy +04256520-a4ecec332f0ac0d22906e6acfda251cd.npy +04379243-399b6e11c037f7fb5a11acddfe168a04.npy +04379243-db64db160fd13a514e1a714ee619465a.npy +03001627-65840c85162994d990de7d30a74bbb6b.npy +02691156-85d3691b7bde76548b96ae1a0a8b84ec.npy +03642806-d380e53dafa66c1a86a7e0484f5238e4.npy +03001627-c2ad96f56ec726d270a43c2d978e502e.npy +02924116-638f96b7300e754178d5e65673875191.npy +03467517-2105dd5dd6a40240142846fc3207334e.npy +03046257-299832be465f4037485059ffe7a2f9c7.npy +03636649-c125ab8675fdc2b03225afab722d9fd2.npy +04090263-156fbb9dc2645686a3daeaea95a3adc4.npy +02958343-71304f56bb1165e7f42b5c72b4901f94.npy +02828884-d41ba8cd6a5b1071c1237601d86c1b5b.npy +03001627-b38d05caee69c7ac8fc6229eb64e56a.npy +03001627-38279fe5f442d95f458feb88086a534.npy +02828884-4ba9cbd97e4fb17a75e6bc7c944c5642.npy +03001627-17b7a0e3c70dbc3d90a6b1b2b5522960.npy +02691156-b23e79036b214fd4ca27bba175814d1.npy +03001627-74cc57ea0e2e06dbe4106b1d06dc89b3.npy +04530566-d9e8f45b4cd81f0fd1c387e16c0a41b0.npy +04379243-32f116e50ba1dcde7ff6ace05b36a5.npy +04379243-2167f82caf4ed2309eea323f522c6486.npy +02942699-ce40b134b11e8c822bbc2c380e91dfe2.npy +04379243-5315fe89ddcd618a6b9a552adee29b1f.npy +02801938-3ebac03588e8a43450da8b99982a3057.npy +03325088-194ad4c66c27718b603f99a15dbe4cf7.npy +03710193-7970cdbf8b2f60922ccc07812ccf5b3.npy +04256520-58447a958c4af154942bb07caacf4df3.npy +04256520-beb06b61dad3795c95c7d6b48c371712.npy +03991062-7ae8b260ffda13745d90c2f8862ed5c1.npy +04256520-a6239b94b8def78a2f7a42055c3e9340.npy +04090263-86baf335855c96d212b38b1d99376c0b.npy +03593526-6628119d7cf6ca8b82db9fca4b68095.npy +03513137-bab3a20dee03a0f0e4773d7a183337d9.npy +04379243-48ccce122177c96c3dc1643807625350.npy +04256520-10f2a1cbaee4101896e12b33feac8da2.npy +04379243-8478187660d5443186915ea7a2083dcd.npy +02924116-2466d6065594dbd373873da0bf53928f.npy +03325088-bb727c220cb940bad3ac876afae3fa86.npy +03691459-27266a732bc955e4db965514105122a4.npy +02828884-3a8f4586fbd17e6d56f6fc4b4ce1db04.npy +04256520-458bfa76a934921f4494e96d71433541.npy +04256520-fbd0055862daa31a2d8ad3188383fcc8.npy +02992529-2266b891f080ad7eeb2a3da43bd37462.npy +03001627-a18b3364ce7ca94d5921d1ce0656232d.npy +03001627-8841a35812d5a95f98a4820926b2a786.npy +02933112-1b32d878eeb305e45588a2543ef0b0b4.npy +03046257-c00fa590249faaac140ebdd4d6d66fc.npy +02958343-d6b7bb6c6203fd9590f0aa5ae25c9b7e.npy +04379243-72194d338303b1b155d7f0828042fbd.npy +04530566-45642e87b3904a1395f5b96bf7fdcaf5.npy +04379243-6c844e3f4a99bc3ae8375def5e736d8.npy +04256520-8481271bdd974c424b3c42e318f3affc.npy +03001627-1886b3e3f3d4af3ace522e6dda26fb51.npy +04379243-6fa6f986755409b77f4b44e9ef57971b.npy +04330267-a036b70289e45fc177fc9677e91cfd1b.npy +04330267-830b31818f5b91474efc7e7114f1b9c5.npy +03593526-4689cff7bb28dad35425a71c247ca5d1.npy +02876657-a4a6a464cb1db9286bdbc69440dbff90.npy +04379243-26797a03b7940d43d9a7daf2d70e57bd.npy +02933112-4946c14a466fb5094da5feafe6f1c8fc.npy +03642806-cc596eaa22c3e6cf37e1b9ea967d5071.npy +04379243-266ba504ee57b85c5298386582afecd3.npy +04256520-ae4b600e137214dfb675aa3c10a97f3a.npy +03001627-b526dccbbe8417bd6cf45f1c1a3d29af.npy +02691156-ff77ea82fb4a5f92da9afa637af35064.npy +02933112-5b6195448cbcfc04b8cac7fbb9e49985.npy +02958343-a34dc1b89a52e2c92b12ea83455b0f44.npy +02808440-d319ba92fbe38bf4429d80a62aad88ab.npy +02801938-f870bedc47fdbd287ae6f33544c233fe.npy +04379243-bcfda4ca76d65ca8d4eb6d6477feba27.npy +04090263-5cb8be7d0224277b74e18e0e7a19212a.npy +03001627-458637d073cb6e9dc8687ff9b0b4e4ac.npy +02958343-1e6ba139bec5e49dd9f9c2955f462abf.npy +04379243-84f5e52756fc84f86df14337f24e49f4.npy +02942699-d6721b4ee3d004b8c7e03242f1bf8d19.npy +03691459-3a346d78102ca842b996cd669da05484.npy +03211117-7a5a80c7a2d89bc6728fa2df514c65d4.npy +04379243-31f09d77217fc9e0e76bc197b3a3ffc0.npy +03001627-c98e1a3e61caec6a67d783b4714d4324.npy +02992529-33cd4232a87e1f416a1f7081746396ba.npy +03001627-e7304e89fb763e45507243968c1db8f3.npy +04379243-76814dd29a8fdd76e400ee8c5c49a7eb.npy +04379243-4e855038d6060cbb47e81ce1f9a6ff7.npy +02691156-e0ad511aab31dfdb3e237dc81fd8be72.npy +02691156-655dc5a5376e9c8152c3271e911ffe19.npy +03624134-2bf31f2abe9aad6d1a768998fd92e128.npy +02691156-487c60f57489506d5d515fd83cfe3891.npy +02958343-718bfae0c87ad9fdb04112587bd2b79.npy +02924116-7c39944cf7564a05c05ee00ba679322.npy +04379243-a3d05dc39ca639bc662cdc2f77e49a85.npy +02924116-3fe3cc5389773fc21f3f27ff04a4459b.npy +03636649-e474916f1ee1635e0bc0e32d71e297.npy +03001627-35c3575340cc8234456cbf78e1e89022.npy +03790512-a94060c97cfa0c6350bbf5cd198b144c.npy +02946921-91a524cc9c9be4872999f92861cdea7a.npy +03211117-bc690122f4a3646047dd811b692e315a.npy +03001627-66683c677e7b40593c2e50348f23d3d.npy +03624134-423adc73596672f08bad9bd0c4ab8e3c.npy +03001627-b856a62e23ef65324b87db09ac4cfa73.npy +04530566-a31a0ca1247e23ceb1bb46d2556ba67d.npy +04256520-7f0bd726971e34eef9aec59741c69cf7.npy +04256520-a6acd78fda77bddc52862c62c571b1e.npy +02958343-e1c16a07b6e974b951a95aaa6caba1d3.npy +02876657-4fcb653e7978812d9c3900c9619d4db4.npy +04379243-e44531f7204b6fb9fe43ff1e45af424d.npy +04530566-c6bc9330b0a75d83cc73edf5d735208.npy +02876657-1cf98e5b6fff5471c8724d5673a063a6.npy +04401088-5a7e19fca06d2bb7f2848e928a160066.npy +03636649-af3d58dc258e0fe06ef604d255267aae.npy +04379243-ef92a53a5aa6ce008f88435cd882fb0c.npy +03624134-df6ce028a9a0d8178bcec9d54ae64e9.npy +03691459-84adc06696eea1774a2b8524bd5c98.npy +02828884-de80be770d51dbf53567b82c74e275b4.npy +03790512-aea3c4f2687e97c92942fa3063963cb6.npy +04256520-11007f74b06bd90c518b6fc7ed4f3487.npy +03642806-f811252fcd1f7d686845a0762dd07baf.npy +04468005-4ee9bd908e79cceba09163d0bb607639.npy +03085013-a5349bc8e3a7ff77c600925618bc4f77.npy +03337140-e58274d0771d56f77984fb9ec7e40829.npy +03636649-ef9e0709f535c549b3914c1351b16c4d.npy +04379243-eeb23be65d6c76123199fadac163f8c6.npy +04379243-ba8378a73db72f51febad4f49b26ec52.npy +02691156-68899f486f3a6015ca8607f540cc62ba.npy +04330267-51c2dac89ab9db802f79567a8778b1cc.npy +02808440-6bccbd29c44ea50d54d7082b34825ef0.npy +03636649-9282928d320e83091735ea0e092a805a.npy +03642806-55a05b33f34e7211f71cb38553f14917.npy +03001627-7fa5ce045ee0a286606aad310bc344b7.npy +03797390-9961ccbafd59cb03fe36eb2ab5fa00e0.npy +04090263-69252c7838ace59f8aa7cb0651220ba4.npy +04379243-c5a02d586ea431a1e76bc197b3a3ffc0.npy +02808440-29ad8134c0e600c458661a3fa3dffb70.npy +02747177-fc62acf82529b74867964ba700cd97f5.npy +03624134-67802020163f6b8c1395331ebe4786cd.npy +04379243-b00d6677641be37dbeedb4c8fd29e2d1.npy +03636649-348fa2fd3af7dc0a4016a312c4d162ae.npy +04379243-4e87db85d5dab96822339a4b4aacca6b.npy +04090263-6f447ae319cb3f8c95822127460cc765.npy +02958343-457ef8db81db726909e2381adbddb4b.npy +03046257-b7b988707b63c048c5c6c5671b8e3bb3.npy +04256520-a015c48d41079f9219e48122ff512ea5.npy +02958343-6979a814a64f6da8becf71e2e014ff6f.npy +03593526-9e8595c3bbb0a5d0ba5342d638d0c267.npy +03001627-3919e93cc1f3bf5bd7f7a4c4609b0913.npy +04379243-9d63f4971a332c55f7628281ecb18112.npy +04379243-b69df94b39931f196c8336429b11e233.npy +02871439-3c6b1e5888e5fabd9463d0e381798ed8.npy +04379243-12b1fb7c765dfe8eb76e29c9c43bc7aa.npy +02691156-326e859d86a8078427eb9e7911a17418.npy +03467517-cd26da8e82da2ff36212ceeee46a9894.npy +03001627-9ab4d3826bd2f07b51bb569b4bf0aada.npy +04379243-ed320d80089655bedf6cfab91d65bb91.npy +02958343-d967be366b99ac00bac978d4dc005d3.npy +04256520-17c61068a15115a87c2f226180343d2e.npy +03948459-708e38e7b733fd22bfae4699de9cb91a.npy +02958343-36b211593bfa7c2f7f33a9b0659de0d7.npy +02933112-600d06bd779fbedfce5d6e9371bb5c33.npy +03636649-a54ea55a07b96a237b2bb75885cfc44.npy +04379243-7ee81223e7a4785ea7866257ee5db61e.npy +03001627-76ee694df725b5b4664b3b9b23ddfcbc.npy +03624134-854e7bb73afaff7591ea3afb2749822f.npy +04379243-b21a6839869018c6ab10c969b34d14c2.npy +03001627-7f4f73ad1b3f882ba14472becb07b261.npy +03991062-4996f1c0120f4c62ab361b6be63163da.npy +02958343-f45268c928a4b3fc8bc584bb94b0b13b.npy +03001627-726996e3177354cf2095dce957a7a5d.npy +02828884-516e288a1f609250d2b12aa6a0f050b3.npy +02691156-7201f2a0f410dd0ea79efb489d71d723.npy +02691156-e51bd7d434d1ee6622096c1bee7ddc7a.npy +03624134-581bc5e4154baccbadbb944d3d9cad9.npy +03636649-817c0b1b85437923e7321f25048c6142.npy +04379243-fb50672ad3f7b196cae684aee7caa8d9.npy +03691459-f0f9a2082454542751dfe6844b6e8393.npy +03211117-f47044b611046a7bf901627f525bf7a.npy +03325088-f92135b11ed446bed42b9650f19dd425.npy +02871439-c947f9834b2e3dd66a2c9acfda86bcf1.npy +02924116-514623ec3be9f8ac9f46749e28e16975.npy +02828884-582ecc11367a2aca2056b4bd5d870b47.npy +03001627-fb794b0b3260794bfebad4f49b26ec52.npy +03928116-a51c7a09c0bd3e8535a276fbe43f61e5.npy +04401088-f0b3e6f5bd34ca3cf0c6f578f0594c3.npy +03636649-a0812cee3fff72103ca265f557f5dc3e.npy +04379243-e0caa2e794d98c814c9587cb3f654544.npy +02958343-37ad66d0433beb633df8f4ac45647158.npy +04379243-994fac397c6246beba878f7904755875.npy +02958343-37e781aa8ae8933a61c6c61410fc904b.npy +03761084-46dbba829a57ace8cffd61677456447e.npy +04530566-2d07f2ed9c3d78b33f222a37719e9945.npy +03948459-d0116dcd5bf9b88fea96bfd37cd8bdfb.npy +03046257-ca9d22c90fb687e045a3ee2cfbb67212.npy +03001627-bf01483d8b58f0819767624530e7fce3.npy +02691156-babf58c69501ae6b9b46c030f642fc41.npy +02958343-1b85c850cb4b93a6e9415adaaf77fdbf.npy +04225987-710467261256490ce1bed90743417b0c.npy +03636649-da09a8c73054e9220ca3aeb14e36a45.npy +03797390-d75af64aa166c24eacbe2257d0988c9c.npy +03691459-14e608a76c6b77bdf6045e4ebc9df52f.npy +04379243-8421fd68fddd2a033f40a91f25bb93a.npy +03046257-5924dd5aeb057e576ef2faffa907bc32.npy +03636649-11913615a1b732d435836c728d324152.npy +02828884-895563d304772f50ad5067eac75a07f7.npy +02933112-bd89eb4a7407f07e54d8afaf6caac97c.npy +03211117-f800fbcdef1ac9038b5dbcd4be5ceef8.npy +04379243-b35bba0caa2faa642eaa34003788a9a2.npy +04379243-73ca85d8666e7e26e836e479c0864af1.npy +03001627-218233bd68f5261dff318cdb0cb45ca.npy +02958343-4b67e004d83d62bca1aea50fbc4b17d.npy +04530566-72a9394882b8151bef94bcb012573cf2.npy +03593526-ee81529fb1ab07754b3c42e318f3affc.npy +03337140-25ec4822418e70cc91c352d02061b3f7.npy +04090263-3925a46f22a5587551f49d4582a8d17.npy +02747177-676aa5ae01563ba9ad5067eac75a07f7.npy +04379243-87c752e8280cfa2316a2500eff5eef3a.npy +03624134-bcd5c95026dff530542a1605686ede02.npy +04004475-2263c8fa2d951833ecc46197d5349c6e.npy +04090263-c8cf9fce86c7bcb3b38e8b1e877a5704.npy +03001627-1fb9ffbcd38f8ba63eec26c23f5bc80b.npy +02933112-88e89b29e8100f1c1bec2e8246842c2a.npy +02992529-3f4a507d616678da650fb6b8f6bf3419.npy +02691156-4c008f39378be18bc0909d98a1ff2b4.npy +04379243-3804253f3eacff56a55e6ad8c321a190.npy +04379243-97f5d86912ce0f872caaf8842dbb8ac2.npy +02958343-beef4a450e0d42db6436916a86a90ed7.npy +04379243-fe84ae93e0eac1e45b903ba10d2ec446.npy +02828884-50a3b398b3a2e5979ec4bb690ca24962.npy +03325088-228a2b60a63135eec36fb70296e45483.npy +04401088-4116965029bd24393423610e52061098.npy +02828884-c79fc66b27a900ac842d08202a7fd76.npy +03211117-9e1b897c08a6a91f94cedf1e55d56e03.npy +03991062-f4fc8dba27f70ba8d4d8765e3910f617.npy +04379243-307474fd0cab5c982fa77440dcb93214.npy +03642806-2d47af483371ff60672faaae04fc887.npy +02691156-fc2c9fd0bbd77dac4d210d9468aedaf2.npy +03337140-6479718ba7e517e6492d9da2668ec34c.npy +02958343-8d560e44c4eb588d4fdf31cc2d78fd0.npy +04379243-95483e7754185e03986b14b31452df23.npy +04090263-bf76395bab45ffac2249915e95f55f08.npy +04379243-25bcea593e4314c3436e6787c76ef3f0.npy +04090263-3be0bc4b1169ca4959db9878902bfe69.npy +02958343-25480875a6be8e11afe1d4530f4c6e24.npy +02933112-b13778ff6594e980605de7eae9f0b0f4.npy +03593526-507b672473eda11032a1eca0e8e4f468.npy +02958343-65f0321c5aa8c303a1936d27bf774e9.npy +03325088-576e6b3d7b188fe9b362845c6edb57fc.npy +04379243-e77fbb3e21ccacf1a03bb2c2325d6f92.npy +03642806-f9f484e4364663d61bb5a64b9a0f552b.npy +04379243-a31e317e57540f3ffebad4f49b26ec52.npy +04554684-452f7e16dcf5b2cf46cde67a6a1ea328.npy +03991062-7eaf07e7139f5832a2c59a4d90e63212.npy +03636649-3889631e42a84b0f51f77a6d7299806.npy +04090263-5a2232cb9dd25917768d4c3a89626da8.npy +04379243-22cb00fd7f4d016429b55029703aed8d.npy +02828884-976636850849c3d6ffd996335233167.npy +04379243-f7646a27fa757afe1829bffea9d18abb.npy +03001627-32a4ddf426cef33c323ad87fe7d4deee.npy +04379243-faa36ee5b5a296ff7e66b3e5c11f24d4.npy +03467517-3839f1edddecf07c502e2eeb62a0f66d.npy +03001627-a5d41f647e7ae9deeaf288f952624966.npy +03001627-1c758127bc4fdb18be27e423fd45ffe7.npy +03636649-4b48b7f72cb4f56ef00f0216ab99ff30.npy +03001627-db549976c0b7b960d42ec7e303174a87.npy +02691156-167740d2a5f5cb6c7f4561609781d8c9.npy +03001627-929ab79b4f45f747e6fe3612af521500.npy +03001627-a6009749fd05fed82d19175e7d19b7cb.npy +03325088-d9e81180a1dbd0a550da8b99982a3057.npy +02747177-dddfd6b37ca28647167a483e22d2eb7a.npy +04379243-70f408c759664b953f99a25d2bc1902.npy +02992529-4b72058b03234d188a81847056b4708.npy +03991062-cc7c12306cc3785fe15a365ae69dc5c5.npy +02828884-f8ff2310c6b130d38aaa31e538081318.npy +03467517-3a234019cd1da956fd3e16c646c7a0a1.npy +02691156-c489f0cb96399da63c326782eb2d380e.npy +03001627-a98b128938b56846ee316b26c8d85c48.npy +02992529-4b91c9711ca991768a57ed2dc0905847.npy +04379243-8963760f8bec0fee7f807d3c406ee.npy +04256520-f114b76d551b5e5affcd08faf4fccd0f.npy +03001627-21da49c5fccfc3e68d861be5b561accd.npy +04530566-6b72a64f1a6a745ec99bbfcf5650bf52.npy +03001627-a36aa9aef138fdc1377b9297f3055210.npy +03325088-1818f3ba4874e5ab362845c6edb57fc.npy +03691459-7998efe14649e07c397a4ece637a5.npy +04074963-a6a121234c2077d6dcd16fe97fafc2c6.npy +02828884-8d1f361eb7a927d8907921e9162f6a43.npy +04256520-70cf74bb4e1e14dac15fcbb4bdbaf13.npy +02933112-47e09607098c43b5768049e7324c832a.npy +02958343-edc9a70958a17433b1bb46d2556ba67d.npy +03001627-896303208667c3e9713decb1a0563b12.npy +02691156-273e90f5c26654ea8b96ae1a0a8b84ec.npy +04379243-ffd45a17e325bfa91933ffef19678834.npy +03691459-bd2d91052e6c10804c6c80caaf15808d.npy +03593526-44e3fd4a1e8ba7dd433f5a7a254e9685.npy +03636649-d5a67642ff0a2908dbfbef883e8d10aa.npy +02933112-e2de47fd0e63a280490ad276cd2af3a4.npy +02958343-481999bad4bfe8bd3dc7f272b20d8426.npy +03001627-916a6ff06a128851ed98cca8f0ccd5f7.npy +03001627-4978fcb47c15f96dce88197ffe0c21da.npy +03790512-edc4c7a08293697db37378f3c85478b4.npy +03636649-a22c4d43974086de31ae8c8ff1eb3d45.npy +02691156-9705e3c2d21106ced7f23cd024f22c12.npy +02828884-bb020b7d9c7fca9cad5067eac75a07f7.npy +03636649-a51f72154f09a2f926d49ab26d3c4ce6.npy +02808440-125720e2aad7cbae412ac8cccf0c180f.npy +03001627-b8772904c25b61ac6b2befe83a0efe39.npy +02691156-59b851010f0aef7422b13c48c34706de.npy +02880940-95ac294f47fd7d87e0b49f27ced29e3.npy +02933112-dc4e9bf3eaadf2544c62bee40dcdc539.npy +02808440-a5554278ba72e07213d2510999d0f1d2.npy +04379243-e48675e37096a6898527e24d5de49fe6.npy +03001627-6e5c0ca5ee70c88b77dbab4c80b965e5.npy +03001627-4f243d655c40702ec772d43f7a27a1e.npy +02958343-4270f4f3372a1b24546b7395fb17f97e.npy +02691156-b8e4e4994d4674cf2023ec956848b741.npy +02691156-22393fa9307224ec853c6f214c15e60f.npy +04379243-21227197948fd2857c2f94a943a8669b.npy +03046257-289850e742ec351bdc7cb2def50cc404.npy +02933112-964258d29263afdae76f0f0566cf10f2.npy +02818832-e154ac0ffdc047b8729c04438af8eabf.npy +03001627-3ba15bab072af6ced014b923da2a041e.npy +04379243-3a52892dc6c06efeb2403dba7fd079eb.npy +02691156-78789e98f905fcdd9107f68a9cb8e3c.npy +02691156-5d81abbccc11935b4d4cb1c2a5e48b7a.npy +04256520-83d39faa5782395b651fb4677c188d35.npy +03001627-72fe5266a93c1998dbbc9440457e303e.npy +03001627-a4bf3b34bf49c5aa799b0b9a0d4a12cf.npy +04379243-3ffe22ce4ede7a187886a3eca4dfc4ab.npy +03001627-669a23c329080506d295b24579cf55b8.npy +03642806-29f5cfcef7272f1f640578ae55230ebc.npy +04330267-bee6f7918373cf8026587cb13c78fb9b.npy +03636649-2ce7732982343c1d9792f6094a78f8d5.npy +04090263-337d3642a2d949a4f58d2dcaa6073061.npy +02958343-da82ba81a8fb0737d06f1bbd2acc051.npy +03001627-43c71ca7f9d3dceb8b0742c681b435de.npy +02958343-6208c5fcc94fb6ddafec9b6a5ecfd79d.npy +03001627-43f15ce32c7c97ef19cb07ecb5b4102.npy +02958343-1159faf9bf78998493680c5a9a367b4a.npy +02691156-5f73e503595094b783b772877a547745.npy +02933112-25c3964cf7a607b1f51fa0238791f5dc.npy +04090263-f3298345f6d6ed3dac4f72bf08dc79a6.npy +02871439-b8e455419b42c77e262b272ccb3b11c2.npy +04256520-1a201d0a99d841ca684b7bc3f8a9aa55.npy +02691156-cc113b6e9d4fbeb23df325aac2f73830.npy +03797390-c6b24bf0a011b100d536be1f5e11c560.npy +02691156-22ce6f6d1adb08d7bbf3143b1cb6076a.npy +03001627-d7e4851fb3001a10f652f706160dc96d.npy +03211117-6a743f7ae8deade97e0bbc356ce23758.npy +04379243-45bd3bed8ef1315ed42ec7e303174a87.npy +02958343-40953c3fd24e9d65ecf689885b7c1e59.npy +04379243-3fa5372c0ff38e447135e387a71e9d31.npy +04090263-1639ae190f0e05196df38a7dd1b448e6.npy +03001627-769b26b459617608b04cb542e2c50eb4.npy +04401088-f66d8ca1f6b259de2a9eb0f146e94477.npy +03797390-6aec84952a5ffcf33f60d03e1cb068dc.npy +04379243-c35a4a82cac49ecc55f46d55537192b6.npy +04379243-91ed62f2b3fd5919f12d7184a2ad3430.npy +04554684-8f9232a493ccf77e46cde67a6a1ea328.npy +04379243-1b5e501a28921c43d46cc1240811b39d.npy +02958343-2a82a66ce6273dce601c8ebc794de3f4.npy +02691156-b75575684fa8ffaeac7e7b41e1ebe3e4.npy +03001627-85654bf43265664eca5d1f82257fb9d9.npy +02933112-8e897603bc5217174b8710a3469971b1.npy +04379243-5d82e3924ace17d814038d588fd1342f.npy +04379243-138c29cb642dcd6352620f29156438e2.npy +03001627-a838d73a1ae66934b161f36d4e309050.npy +03467517-4bcac7ffff02037f624b30f45b82fb10.npy +02933112-55bfa46d7b39f4dcc59350d819542ec7.npy +03624134-3ad3c5fd3ba04fdb12cad8be168fe72d.npy +02691156-f7739764eb1c78a053f370d353cea84.npy +02691156-a3bafea9edc457463da2ae40e7681e7e.npy +04379243-15ceba504a820cdfb4c161851ed2b4e4.npy +04090263-4c727a571a5226549a6e43b878d5b335.npy +03691459-569fc1b111617f4038b28f94c165f833.npy +03467517-a0f18369bec03d61e32ec871de9544ab.npy +04401088-2c6d9512b4013504ff0682cfb57a62dd.npy +04256520-104256e5bb73b0b719fb4103277a6b93.npy +04379243-5243b5491a4f8a16a2b5862518c93.npy +03211117-dada218e78c9c81e2250bf58700b4d8f.npy +03001627-747d2db60ca6b98f3eec26c23f5bc80b.npy +03636649-6999ab054bc900d1868fb986bc092533.npy +04379243-cda35fec5923a8602250bf58700b4d8f.npy +02773838-e6daa1435018a044da5feafe6f1c8fc.npy +03001627-b81be96660f38a8c7543d7dbfecfffbe.npy +03001627-5b185142b33f3e45c3bd24f986301745.npy +04379243-6f2fa876147a970c5acde0d39b1b9dba.npy +02933112-962b62d2b3823aff51f77a6d7299806.npy +03001627-33d8a82696afadcbc3e3d5df2a6ddacc.npy +02808440-1f0ae93f9aafbe27322d134e1c4a80fc.npy +04401088-d37afdca0c48251044b992023e0d3ef0.npy +04099429-d781243cc1d1d2e91a0ec553feb1c2c3.npy +04225987-776eaffd7cbe7bc6b9e8bdc9c4a49aa2.npy +02958343-49a93fdbcaa0302ae434963ea517a487.npy +03211117-191bc5c03d27789379857d0b1bb98706.npy +03691459-61ec03d50268a852d4c639228615260.npy +03636649-6a11bbf62bfb5a5a59f8e31ca87c470e.npy +04379243-7607b1762ab9c79719fb4103277a6b93.npy +04530566-a346005de2c522e9c9078664355a9ff2.npy +04090263-49429e1d1e90c1ca202be79d8b285c1e.npy +04090263-3332ad937d4cf220d34156e5a2f990b.npy +04401088-60193289e8d9689b62f6b877265e2679.npy +04379243-a4b1d784abd7eba15b17dbcbc75d58df.npy +03001627-eabdb3aa920b216820b64028d2efc877.npy +04379243-1c90216659d7b97fec5d8105ca6b7dcc.npy +02691156-f25da5eca572f01bd8d90babf3c5509a.npy +02871439-d7f1a22419268800e76bc197b3a3ffc0.npy +04379243-f0c1fe7cfedf97e9b91b871e750ca615.npy +04379243-a392cd632ea01b6f53a71d150e481685.npy +03991062-81ad2114304874ccb7a1efa8b86b495b.npy +03001627-21ba49d0622c590c8a93d439b5823fb6.npy +02958343-65c225fae513a6dbe7b23463fd9b0ba1.npy +04401088-9adae247285e9538836a2d8722d73dfd.npy +02828884-12ae14d584758b4ee42c56c78fb88524.npy +02691156-7462d130f9c7abcd5e9e2656aff7dd5b.npy +04256520-465e28e9cee51df8d5cb6d178687b980.npy +03001627-1ab8a3b55c14a7b27eaeab1f0c9120b7.npy +02828884-af06152e440a5224e23bd316353fa056.npy +04379243-2ef075a7b9433b06b2b7d07d6c0cd464.npy +03325088-7ae63b6abb0eb0f4b362845c6edb57fc.npy +04256520-d52584133659bcb24b3c42e318f3affc.npy +04379243-a6681ac778c7c314843f1df79528e538.npy +03001627-27700c06980561845c7f80200eb528f.npy +02958343-d63110386a6bbd52d647b1c17442c93.npy +03211117-415b39d4f60a36d742274cb89cb6c841.npy +03636649-e293003f297e155624d1b7c6bfe44fcc.npy +03001627-ea1566ac9fe1670d3b622c8598928cdb.npy +03636649-e180510d07b65fff571108a6d1e94edd.npy +02691156-e9704a563a5a0a3f5a4b8d382b9decda.npy +03691459-2eacd8302d46093ee138e561e8f9c254.npy +04379243-d3fd6d332e6e8bccd5382f3f8f33a9f4.npy +04379243-176e6b9b4340f25a7ff6ace05b36a5.npy +03636649-22315c51156a826525b5da4000a94497.npy +04379243-9199b088ede8a2c920768660cf080d12.npy +02828884-85db4f1bf9e2b62c492d9da2668ec34c.npy +02924116-4fcb65468c2a5a56592ecd319dfd8c5d.npy +03046257-eda7c21b3ab9fc61592f292ab531da8.npy +03001627-99e2f8ae1bef62dcb74c46f4848028ad.npy +03636649-bf6674af4ba8b95fa4080573400e0dc9.npy +04468005-87886a91100844985f72adf4b0bfab9.npy +03467517-58543cda179fda8e6761cb5f9159210f.npy +03001627-90fb9a742f5a0cedc9736640ccf985f5.npy +04256520-93e20cc90bc4ead618a6353ea60f11b6.npy +04379243-3e0f8c39a72f3c91200ad3f421b6c3d0.npy +03001627-43db37a72cbe0f5d4ef0f56ac2c64e7f.npy +03001627-aa4b1153a1c4248930e06a011e63236a.npy +02691156-91e3ab3e12059b4a9d92b4de623f5639.npy +03001627-c42bedf7a36202309056fd4a77b3a4bd.npy +02958343-ef7f623beb7260287b5adf84ce6f7865.npy +04379243-1fb025077ea5546bf7af398806a30cc7.npy +04379243-5b3b19203b5da49c310af74324aae27f.npy +03001627-3fc1e991fee82e42713decb1a0563b12.npy +02691156-538f0b5ee7c786e6d3b936925082270f.npy +03636649-c7c15b7d23fdfd98808760409d52a60d.npy +03325088-26abb7085ac6d50250da8b99982a3057.npy +04530566-fef52f113f59137dc541ae04c251c7da.npy +04256520-f398deceae25a0e752ac884aea4686b.npy +02691156-4f9a01d66d1de632f810506e9ae2dcc2.npy +04099429-9d6c3971491bd0de616ce6fe9495197c.npy +02828884-32b74d6b08ea4603d2b12aa6a0f050b3.npy +02691156-d940f33afc01ff036da97d9f744f7e97.npy +04401088-b7dd49e4f54f736afd5d38d2ca555422.npy +03001627-3f7c81bc7eab161e19fb4103277a6b93.npy +03636649-2a05423b37f2620e1b17743c18fb63dc.npy +02828884-73cc1e9a8f666ad2d2b12aa6a0f050b3.npy +04090263-5f03499ea2b4adb5857835988c6a287b.npy +03001627-2b6c09e26719b256c5facc3cc8dc041e.npy +03001627-ece627bd883d9bbfb0eb7e753c06942.npy +03691459-126ce29983c5421fce567a7bafc3f52a.npy +04379243-67fe5ba50738e325beedb4c8fd29e2d1.npy +03710193-d0b43f44ee976eedbcdd9afbbe6eef74.npy +03085013-21f6bbe54dab206a571ee28145703271.npy +02958343-4ff291758d03aab8d935b10ea652d50e.npy +04090263-83d1b16c362e03ee99362c38b018f042.npy +03001627-56eca3d859b5e8b4594cea63c14fa879.npy +02958343-2e37a9a6abbdf6cf25d175f53644eac1.npy +03325088-7c33d6466f9e1df350da8b99982a3057.npy +02691156-33c9e81a88866451f4fb6842b3610149.npy +03001627-e7a0200c28cdfea7c3bd24f986301745.npy +02818832-9fb6014c9944a98bd2096b2fa6f98cc7.npy +03761084-2b7006326f739b3fe793cc5433bece89.npy +02924116-b943af5eda244f66784879e4d6b78ba0.npy +02958343-425ba801e904cb50f3aaed7e86215c7b.npy +02691156-ebedcd06f1770cd4bbf3143b1cb6076a.npy +02876657-74e5ea1a783a5f5f533775ea6714a372.npy +04379243-3073165c54b44f276e1bbb3913878400.npy +03636649-18010f1e7133415290c2e24416edfe5b.npy +04330267-99f1b9951d4ad128453c30eadc73690.npy +02691156-a42bfdd67b3fc9926b2f6b824c9990c0.npy +03001627-2952ec189e993eeb17e114a7b3c6fb1.npy +04090263-ef672b394e09257d719b648239c8e160.npy +02992529-bf7daa3ade10ee75bad093be69512dcd.npy +03642806-8ac9eb2b975c0d12b5328fde615e4a0c.npy +04379243-cb65b7ed48165ab09e9f71d2c7dacf45.npy +03001627-dfd92aab082e4915e3d9492680c47206.npy +04099429-d1b5300610189ff4e972ca7ee40523d1.npy +02880940-e30e5cbc54a62b023c143af07c12991a.npy +04256520-cf027d5b0debe18321bdbc0445d9f748.npy +03001627-10c08a28cae054e53a762233fffc49ea.npy +04554684-a40e52582bad42308961a7696b4b91de.npy +02691156-e8289fd7e6ab0df4d37636af9c7bcc34.npy +04379243-854b885039dd51e7ba57e2d7b7436136.npy +02691156-dc7c5d12854b9467b96212c8f6cd06e.npy +02946921-29bc4b2e86b91d392e06d87a0fadf00.npy +04256520-1226d123e89626a2406329dad4c94770.npy +04401088-ae819b81ba34165dd6ec95d8e6b9f557.npy +03001627-abbe727944da8cc55f0f8f79871ee942.npy +02992529-bf2a5f434972f11a690a03770c5de186.npy +03691459-96d6d519784e40c0c066b9622c005c53.npy +03001627-31ab0936f07c21ba7b11ae648ea92233.npy +04379243-9a0d79f4e766f18c7d10f85858b5d957.npy +04379243-f74b9b8412dd152f6558f5c8c0d2d888.npy +03513137-be9b9c3bd70c6f5c785b8fa1ee371fb3.npy +04379243-3b9e28ad033825b6d0ae74ce506ca590.npy +03691459-3983ad3c93f4ff0ce029fab54b6cfbd.npy +02871439-6081348fd96b21c3eca22c501ad0a77a.npy +04379243-415c174ecdc612fb6f5c30e29039b12d.npy +04379243-8b7f24a53beb18e8a69f5de385a4c191.npy +03710193-b9f695f1f05c06c573b8c60b60e50ba9.npy +03001627-73abab8429d1694c82e3bf439621ac4d.npy +04379243-dfef8f26e9a8437782db9fca4b68095.npy +03001627-e3a7c517fbe992ddd493bfe20f94b6ab.npy +03790512-9ff5b01d1aec18b2aae529ab4a75c4af.npy +02958343-87ee241d3d0d1dda4ff3c6764341833.npy +03691459-1c29d002435ce5f484f78eafcf19b8c2.npy +02958343-3428307ad66c58c53a0daf3e5400b95c.npy +03001627-aa05a0db9ab12c5e3e7d886a315f2350.npy +03636649-3c1c411ce82c4c43f193a5d512f2c2fa.npy +03797390-ff1a44e1c1785d618bca309f2c51966a.npy +02880940-afb6bf20c56e86f3d8fdbcba78c84028.npy +03211117-941c16598b8fb4f92ddfcbe9b600cb8e.npy +02933112-c8f5521a1f0ddac6c59350d819542ec7.npy +04379243-fa83ef67ce97491ac955e5ed03ef3a2f.npy +02691156-83b55a6e1677563d6ae6891f58c50f.npy +02924116-60e9f9301610e0d8f446f92b52bbd82a.npy +03001627-7a427785ad85f0c771c3cf047830ec1f.npy +03325088-938780d2b2148596bca5df27f3ec6373.npy +04554684-2ecde1b0c35fe63b4e4ed13543f85ef0.npy +03513137-58fe8b9f7026cd2bf1c20b7f59bbc099.npy +04468005-a2c5af9fa5633c3ecb607ef51aa2061c.npy +04256520-7051b028c8c1facfced9bf2a92246703.npy +02958343-d0e68e14e8012b497d6d702dc488f23a.npy +02992529-645c1b7e5297cdf567b9bb226efd81df.npy +04379243-e67447e5ab4b63246d871377f0c1e8cb.npy +03928116-ba07707823473bff5dea31ce253437e6.npy +03938244-397d66329fcf4b862bf863b361489dad.npy +03325088-7d6baf6cdeab0db93321831d2245cf06.npy +04530566-4c1c5200b239b15db700877f4d4ef8cc.npy +02958343-aeac711326961038939aeffada2c0c5.npy +04225987-bdfa2c97ef7089d6b267718342f3f316.npy +04379243-dd63ad97240a5744a022be8e8ae85897.npy +02691156-dadf41579d385b0aacf77e718d93f3e1.npy +02958343-f78bf954495be532afe1d4530f4c6e24.npy +03624134-245d7d1911237928c36546d954c4fa3.npy +03001627-52240b141c70e6d8a5901d93c937a07e.npy +03948459-4a5ed50fe28a7380fef144202cb2b935.npy +02691156-595556bad291028733de69c9cd670995.npy +02691156-ce339f515469303979e13964f05c24f9.npy +02691156-315f523d0a924fb7ef70df8610b582b2.npy +02828884-6e84c668dcc028e6864f7d01926c6c64.npy +04530566-ebb7451625233d772afc5c10dbf83b25.npy +04530566-c715bbc7a1586afe64ab9e610db7c692.npy +03001627-720bc3f0677a75fb2f134420f7b0d7e6.npy +03593526-e142e0414bbe9b39cb6782d0f0acad78.npy +02958343-29c0b746704727593030e8e3910d2b3b.npy +02933112-a08aa6e386cd983c59350d819542ec7.npy +03642806-1dc28ae9dcfc3d773487ed70d4534caf.npy +03001627-1e44e3c128b667b4fdef1c01cbd4ae0c.npy +03001627-c2956c43f763e135c9bfaa062f2e9d4c.npy +02691156-f0137228f926dd464f8327dbe71ce85c.npy +02958343-29487596941c12dd99f6b4f86609dd6a.npy +04530566-b77075c46e424ce9eb2c303a0e0d287b.npy +03001627-6730fb4ca7c90ddccd8b2a7439d99cc3.npy +03001627-66342d92d51f402d3f7e27638e63d848.npy +04401088-c8550b3e45672f5d891ef59b77a7541b.npy +04090263-43ea7cdb23aa0e3de1f2a1daf140ac9f.npy +02691156-b1f08c51a098c43696d224195a988f09.npy +03513137-5174613439e9cf79d2808af04871028b.npy +04090263-bc1d02e51b46cd8f12b38b1d99376c0b.npy +02691156-6ea21a2265075beb9a2f7b9a6f4f875f.npy +03001627-3fdc09d3065fa3c524e7e8a625efb2a7.npy +04468005-2d0265b94d87d381dc14ba0818ee5cec.npy +04256520-1b17f84df81e0165e336453ccee6eebc.npy +02691156-d844094b073a0452b04b2d1c5ce9783b.npy +04379243-659e7b7166d8b9972f84a7804aae667f.npy +02871439-6d5e521ebaba489bd9a347e62c5432e.npy +04379243-ad75eb223ce16ec5b6dbeff8ebe9459.npy +02933112-c4802a2901dcd6e84da5feafe6f1c8fc.npy +03001627-981bbe2950bc9b188f1d1d7c3673dc3d.npy +03001627-fd3759f684abe981d85b29704f5fc7f2.npy +04379243-36fa3daee9a560f049ad73d13f0c98e0.npy +04468005-3b1d2be218ead5992217baa3b8e01690.npy +03001627-5963e316d9015ff1785d41fe7f67162e.npy +03001627-cf88ae03d8cc2fabfcce6278f5ffb13a.npy +04379243-46cef01263d9b449405738a4d4d0fc7f.npy +02691156-1d4ff34cdf90d6f9aa2d78d1b8d0b45c.npy +02958343-5494ca610eb9fad59bd53ddfa65bb6b1.npy +02828884-26240de6617ea89cc6c4a9ba1f33346c.npy +04379243-a2781622b5941ff2a886fe6408aa7382.npy +03624134-dfabed4f151870eb4bd26ac3bc3791a7.npy +02691156-1caa02b831cccff090baeef8ba5b93e5.npy +04379243-3cf25cdc0cc8b384c652d01955093125.npy +03928116-af4904dfed13c508f6646a841979f507.npy +04090263-74a11a9b7ebd4baa424c267cd8f453c4.npy +03211117-ed9d09a17e472e0acc9692a1d1e7dea.npy +03001627-681f4302a8bd9698f4b6538438a0b930.npy +02958343-4b6e6fa36c1e6f865cb51d79fcf5dad4.npy +04256520-3ffeb5868d6f5dbd8c46a3a266762d7.npy +03001627-77a4269a0d64d48336b0f2a1430e993a.npy +03211117-aef2bbdc3b1e9e026a5e01bb88954fd1.npy +04090263-ec688ef9a40c78451188f2b8eec55c9f.npy +03325088-5f76becd78c7eb2bb362845c6edb57fc.npy +02933112-47b069b828d9fae54692707833167ca3.npy +04225987-35c281c44b5ee115f62521393bb9c2f6.npy +04379243-132ffa7d607ffc53d810b14a81e12eca.npy +04379243-fa1317f3a80bd8b1278d386bfa54545.npy +03001627-4ac17ecd78880859e302b6082b0ffc09.npy +03001627-3789c5b85f49b21ef7628281ecb18112.npy +02691156-e75ce21b914ba565b4c6d1a32dc4f554.npy +03467517-40ec077329c26d773127c5e409872bcc.npy +03261776-d768ee2d3f60aedad4ea3f4c41b1b9bb.npy +02876657-21239b0cafa13526cafb7c62b057a234.npy +03636649-8c0380a0d385c98145d451096984140d.npy +02871439-6422a1f1dae8fd231e23f97c3de97d74.npy +03593526-117843347cde5b502b18a5129db1b7d0.npy +02933112-8ee0fd1d620ac1ea974523dbdd88cc4e.npy +03001627-f3f331e64d12b76d727e9f790cd597.npy +03001627-325f9ca506317aeff2c0658ad22a9a9b.npy +03001627-4dd46b9657c0e998b4d5420f7c27d2df.npy +02691156-a5021faf372fa2c48f329df3701cbb3d.npy +03001627-f7dec3c72af895884cafc8d32c041834.npy +03001627-5b2b23120a4607dff7628281ecb18112.npy +02958343-df91db4ada9bad0f9c0cac0d72a31ff9.npy +04256520-3f1e897f2da10d808e52cc55aebae3ed.npy +04256520-2351fc9da59d571d9a404da609e2789f.npy +02828884-74a91aa0a8d9f2b5bef71ebb79d44440.npy +02924116-27b53c8572a52cfa0ea4af438fd24ad.npy +03207941-a7b9af190b190bebc8a1bb0c38d7dee6.npy +04379243-e15a28c0743ded35673b9aac59c306c4.npy +04379243-4ff87c5a639b181b6c6add082247679.npy +02924116-454ff74dd295dbc52470de2774d6099.npy +02958343-1d4b2404a00ef4bb627014ff98c41eb1.npy +03001627-ceec3aaa6ee72dee613f0dbd986ed6f8.npy +04530566-995547c0276be2626bd4106c65ec103c.npy +04379243-b48d04600e7cf2bebeedb4c8fd29e2d1.npy +03642806-d37f5f4d76bb5aee6d0e9ec8b698ce7a.npy +04468005-6f4ac6a0940302a31307b8e7d9f7be90.npy +02958343-d32cd105c2dd79259d959a8bee08198a.npy +03001627-b6a0afcc2ad2db2b490ad276cd2af3a4.npy +03001627-1b8e84935fdc3ec82be289de70e8db31.npy +03001627-b8049c767cb298745dca6305fb9f97ca.npy +03513137-1ae94e883149a07a242154514ef1967f.npy +04379243-15616cf6115c302264e63375fc652d6.npy +03642806-42f71a2df30eabb1b8183a4a81361b94.npy +03797390-71995893d717598c9de7b195ccfa970.npy +04379243-7fd9f6bc9a89d240800a0120f3e757a2.npy +02924116-304d18039eb8f78cb362fb9a75ddde8e.npy +03001627-fc97c771d058556f593de14e4664635a.npy +03593526-d6b6a7a860cfeeda2f2318fdd66be40a.npy +03691459-d4fa4988db7f2eb477818a0572bf1777.npy +03691459-908202c73ba60671c0d274eb53f065ff.npy +03761084-4809d18c7a655877178e7d331e641179.npy +02924116-e21827cb731e3e8d52d3524c5bacd7cf.npy +03636649-16327d928854b34ef11c3739edd52fa3.npy +04379243-d2a331898525d0d1c955e5ed03ef3a2f.npy +03001627-d02f9ae175fa83d3e6fe3612af521500.npy +03467517-22b21e858c58a3d59a6208793b9dfca.npy +04379243-6b13e49c5c13050f5589b48ab7a00cdd.npy +04468005-5e09f52f141e1c04e8784f880dac0f61.npy +03467517-e5fc7cde70b4d5dd63e148e250c0340d.npy +03691459-10421ef12dd27f3650f5fdf97aa1ef24.npy +04256520-8bb72bf16f65fced40ef1c8b63a628f9.npy +02818832-c758919a1fbe3d0c9cef17528faf7bc5.npy +02747177-89aff0d006fc22ff9405d3391cbdb79b.npy +03001627-2eaab78d6e4c4f2d7b0c85d2effc7e09.npy +04090263-7d310ff81ee66564b38e8b1e877a5704.npy +04379243-d51dfe604d380ba9bf01c8d1f07a5c67.npy +03001627-5d0a9fa5c8d9bef386f6991406b6a562.npy +04379243-252d046ecff65ed1f9f3162e7c61521c.npy +03085013-3df729da3b80c91033297782c16a4e28.npy +04090263-56141e8844aea9e4d6c7a58fae95cf0.npy +04379243-4a6d33949265bb6569eabdc5c4c6d724.npy +04379243-46bfac85035dc6f0382c5a0f87d73d23.npy +04379243-15090e10ae2d06306e25f3efedf6785f.npy +03001627-9958038b6d06278a68d1b9a1d97e2846.npy +03001627-bffe3e68857faf7f4d1242a685303c47.npy +03001627-3fa1eeed2e8e2534febad4f49b26ec52.npy +04379243-caa172578943812ec50fe5c30bda6ca4.npy +03691459-4583734434ae5842a820191310c9bacc.npy +03642806-91b857a748f0ccf2ab0b172d4dea80cd.npy +04379243-d87841ba0db5931576a45e9a12af8158.npy +04468005-59b81fe0e2223ac752470de2774d6099.npy +02828884-41d8b7b9480fe27dad5067eac75a07f7.npy +04090263-6e2dc15452034791a791c4f82c7b99c6.npy +04090263-6d751616e0ca4ca0aab32791f5a03201.npy +02958343-c9e555bb1a17cfbc5d918097f81825e3.npy +02876657-523cddb320608c09a37f3fc191551700.npy +03001627-324b0bc4363cf4e382db9fca4b68095.npy +04530566-cc7369fee843cbfc8d1322963ff40d1e.npy +03001627-91bd85c70bf89da2a8737fcf23389014.npy +02828884-9cd6dc2b9d11016c49b3ccbe36f67015.npy +02691156-605c79a4937e72aed0f4914f6d630bad.npy +03001627-f8b90f63fa9ed154e759ea6e37e5585.npy +02958343-7cfd1dad90b79cadfe2e8ee5c450bb81.npy +04090263-206d5e32ece7b8878cb55268d473f123.npy +02691156-e8ed294534ba18df4a29fef5d2b2f3d7.npy +02933112-37fbc4e7c9e46b602b5631520b7d94fe.npy +03001627-1055f78d441d170c4f3443b22038d340.npy +04256520-4307657b2731fd392c37553db37ec752.npy +02808440-240302fe2eb2dafc322ed2ef5fc90e25.npy +03001627-70be8ecf5200fddd818fffcf4a59bbc9.npy +03001627-f68c32ea1e6cecd3c48d90eef8384210.npy +04401088-5891622298f30916f31b75c4a94a8879.npy +04379243-b08310a1d75702eda09ce9c1262c7237.npy +03001627-106e9487a1d47ff1a09cb462b3e723e2.npy +03948459-6f8956455813727c3e93a3c4fff5237.npy +04256520-3a3f425190044bdb2efb565c08a63897.npy +04379243-2e007165e4f48ee3cd4a89b0fee32930.npy +03642806-cb1e3a990782678b4b6682da890df381.npy +03001627-791c14d53bd565f56ba14bfd91a75020.npy +03636649-39acb6226133f9e0e4c9b82a33ca42e6.npy +03211117-4dfbb9a4ee89b5b29382b62c9161999f.npy +03325088-484b0d59f6954a8854d7082b34825ef0.npy +03636649-5116452b7826dfd92548598e855f0844.npy +04256520-24cbeedf72674d1eb615f5e15a637115.npy +04379243-1e3dc37e2cc335441326da246d3ca9c5.npy +02933112-6ee01e861f10b1f044175b4dddf5be08.npy +03636649-ede739cf0fdf5af9d49b2e04785f8492.npy +04379243-2ee72f0fa8848523f1d2a696b973c343.npy +03211117-42a81c2a4a261f1e1bb088904f7cb154.npy +02958343-8053e014516531ddc3f500d7b182f6.npy +04256520-9b1a7c1df1ecc3c0cabc196a7f35f1aa.npy +03001627-ed7ed25d40b3c16b37bf42a4ca375618.npy +03636649-f91b13fe06141138fcb8d8c6d4df8143.npy +02924116-188ec01e6dd6b60ddfe356ac4b10fe3d.npy +02691156-b788ca6fc544c0aff3f3e17ace8695b.npy +03790512-7fcee59a33976221a88e8cb97b773125.npy +02691156-fd6210721415e4bb51a9048f9848535d.npy +03001627-33fa27b08aee4432e8f8c11a24c52ebb.npy +04379243-fe4c20766801dc98bc2e5d5fd57660fe.npy +03636649-5f24434ac22353708749901456352d5.npy +02691156-ccdec989c4ca289d9a6e43b878d5b335.npy +02924116-2f3d0b1432f014caacf9e4b0d73d2434.npy +04256520-9c3b2d053adaca577b50cd55c08e6bb6.npy +03636649-daaca6107846a666a8737fcf23389014.npy +02958343-b0801e9d8e004e7758dbdf2b5c6acfca.npy +04379243-ad61a5bc7cba29b88cc413950b617e8f.npy +04379243-42f22cf6e29876a9c19a59cdcb309b91.npy +03325088-416dd83d7a18d2543321831d2245cf06.npy +04379243-7c3507fc4eeb9854febad4f49b26ec52.npy +03790512-1d8fb258aac4175a5834749a5ef37100.npy +03691459-a9957cf39fdd61fc612f7163ca95602.npy +04090263-d7806192d775465cf26216cc0b9f4269.npy +04379243-180dd8913e894dbf5c6a44a505804654.npy +02691156-c6009ba1bf947303ca8607f540cc62ba.npy +03636649-b2e4c14ea09658e3d0e9f1d4665fda29.npy +03046257-ba3121c7429ff19b83cd0ac541913e0f.npy +04379243-e36dc839d70d3bb927445c0c7cf3becc.npy +03325088-1396874a375c365e3eef3cf37d74e423.npy +03636649-34e4bfd2000916c6a5f9d52c12457194.npy +04379243-2145b7d411f1cf91bc4e0550f830290.npy +04379243-a18a9e2ea68eeacd36b0f2a1430e993a.npy +02871439-701d5ef8d155c3c7eb6d6d4fb283476.npy +02691156-52a1b6e8177805cf53a728ba6e36dfae.npy +04256520-9508699d8e6112cbc6b21d0fcb810056.npy +03001627-d810a38ebae55007eaeab1f0c9120b7.npy +02992529-d565df5aa65604c86b69fa5331093439.npy +02691156-c2f43dd2c483e0d86b7bd17e458d0dcb.npy +04401088-9644fb6a1520af7fa90f3ad3635b46d5.npy +04379243-799a262e7eeacf2a593ebeeedbff73b.npy +02958343-e46d79a5d356436f23a5d95daeb50835.npy +03636649-38eedb7c36b785fda81f841e85c630d5.npy +04090263-804342eecbe40a4c79f92df566f8c6b.npy +04530566-3899f8b55ec9f1db8a1ec28cb7d97871.npy +02691156-c8b848f32a850b15e816c75152573ee0.npy +03691459-ba85d89312054ee95793a80f4f864500.npy +02958343-b7707e9f69d6c0ec6c23793d085f1519.npy +02958343-e90a136270c03eebaaafd94b9f216ef6.npy +04330267-dfcc7689382e0f91adf06fa21339d492.npy +03691459-95b29837dd0209a413e18f148987464c.npy +04379243-9e6d6817c0a0a022fdb7f86985d6e5ad.npy +03001627-2a445cdc8cac449271c43550cfb383a8.npy +03636649-6b29d8827f1705b0eef5d83b671bb264.npy +03593526-eaaa14d9fab71afa5b903ba10d2ec446.npy +03991062-48c94c6283fa5566a4136492f17b9a59.npy +04090263-dcf13ca83d9580bd44c069e8827241aa.npy +02691156-14762404f34eb050bf7a28999a707afd.npy +02958343-fd5a6dd153a455bdb112e5ac235c21b7.npy +03636649-c5da06189b219effcb8d8c6d4df8143.npy +03691459-b987e53822ad2809c7e1c32ca6dfa00d.npy +03948459-ac8ecc77946b9578f342a9bc61de5ab2.npy +04379243-b1333bac9640db456e5061f0592f234c.npy +03001627-59155eb9123a9aa330bbd4cddd04c77b.npy +04004475-4dd4acc48cf804d39b5ce3f3ee534f14.npy +02691156-347d86d7001cef01232236eecec447b.npy +04379243-392093300321b9e1eca22c501ad0a77a.npy +03928116-7a7f23b15bad26326753813b2a3a4093.npy +04090263-c57d7e81270598096314c3b6a3a65519.npy +04379243-1aebb6c07b8d53737062f2d72cde5c95.npy +02933112-21eb0039185dd955c59350d819542ec7.npy +02691156-cc7a48498e745baef828c8b5be2ff54.npy +04379243-ab7b0db92f96381f8cbb8bac2032149c.npy +02958343-6cd11fccae408795a99406d7384c870d.npy +03001627-6344b2a2fce93cc3d2f33aaf794b5932.npy +03636649-5eda619e5f36499fc1537287b5c50d9d.npy +04379243-ea37d7670bf3294e60a3b49d78923dc3.npy +04401088-aae6554b1abe736c70ed77f7659cc6f.npy +03636649-369555d5aca3e7e65a31d91ec836a511.npy +02828884-38c4c2ddbdb502e162701a18243b45d3.npy +04379243-a3f369c885720efc459b850e737e0048.npy +04379243-4381d6508786fbdbc694ced1c311421b.npy +03467517-ae0b98bc6313c33940535e68d82b97bc.npy +02691156-3fe365251b54087af0478431b5ad57db.npy +03991062-5b56ec15c6b412115aa9d06b3815555a.npy +04530566-a554a62acf40e578cba07fb2573fff75.npy +04256520-ff2a456b438b0f2ba494798fa117187b.npy +04379243-8b077b3be444a1338aa76d17cc411fb3.npy +04090263-bc3dcabc80b38ab6ba3efb88a329778b.npy +02958343-9702eb7f07f013532764cfba57a5de73.npy +02958343-8bbbfdbec9251733ace5721ccacba16.npy +03001627-b54d0fbc33d125bb7a6d149f6c9151a9.npy +03636649-abf04f17d2c84a160e37b3f76995f8b.npy +03046257-cd074c458e0aec2a4b3c42e318f3affc.npy +03001627-5107542cfbf142f36209799e55a657c.npy +03261776-49b17a26edadad7f46619c79b20f2c6e.npy +03001627-903a14845425ca3176e30bf48cd56fcd.npy +03636649-20d36ce3148091c5764b5e62529f6d7e.npy +02958343-d04fd72c36fbc71731d383b4a9dce77c.npy +02958343-64ea044763ab4d742a9eb0f146e94477.npy +02933112-6c7a2ca9ef6cf7a3ef4e42d70375aed8.npy +02691156-e18b6350437cfe0d727249e8d9a90100.npy +04004475-a6d9da1c37aab01129f8bad8fa208851.npy +04530566-6ea8d00d7359f08f9e4614310319ea50.npy +02828884-beb4feca82b0082efd60059ad8523f1a.npy +03991062-8f45584aabfb17e9ffb8dd272bf2a810.npy +04379243-dfafa039da1cf318a42557fe008dfc94.npy +04379243-8e3303cae6cc104bad4f8ccb153c24e.npy +02876657-a02a1255256fbe01c9292f26f73f6538.npy +03325088-a0642a6b2849d4f5b362845c6edb57fc.npy +04090263-2f4209998288a4634d0af51460733e47.npy +04090263-604d927e4954713fd735fa1ab17311ec.npy +02691156-1a963a929d9b1332290d63dca780cfb6.npy +04379243-a379cb01e0a98298607974568e26586f.npy +02924116-aaf17fbae6721ff4839e2313a3cf4083.npy +04256520-4e664dae1bafe49f19fb4103277a6b93.npy +04379243-a713c7f070c4fda022abf78951dd8624.npy +02958343-d0aa115eb63f6f0c97df6383472cc5b6.npy +04256520-f5960ae57bf84fe77b79156a61ad4c01.npy +02958343-6b642c1c62ae5b49247a5be450795511.npy +04090263-36d72181bce0939c49f0e3dd7767881.npy +02691156-89a6af782a025acc62b600da24e0965.npy +03001627-cbc47018135fc1b1462977c6d3c24550.npy +02992529-49081a0c0cd4ad32166f3c6af52a7c59.npy +02958343-8141677722f680076a2345809e2bb169.npy +03001627-730a4d879380fc78990561fc34164364.npy +04468005-8ce6b54c47bb1b1671547adc319f74f8.npy +02691156-6bfb3e84a0fe44c1bc6e7c82ab33ecb.npy +03467517-97e8ee1b6df404bd57700c05b1862d8.npy +04379243-8bfdaf14a1b271954be714694b176f45.npy +03636649-aa734f5c5dab1e672d26f74bb535ca48.npy +02691156-12c66a0490b223be595dc3191c718398.npy +03636649-15e38eb29fb84898e7e684d25d4dcaf0.npy +02958343-b2b22a1454f2c88bf63ee8a34069b7c5.npy +04530566-a56c3a66dbe0ddf4a70cfb3232f40c6.npy +03991062-eff3b8277a2f1fb9d4d8765e3910f617.npy +04530566-7cc3c41e998caed8a70cfb3232f40c6.npy +04004475-586a0979ea3792f1c17df6b0271bf00d.npy +02933112-6c2762c2c95d7a2063b3c67777442463.npy +02691156-89b6f678789287a3d3128304aa2279ec.npy +02691156-c1d8614b0e5e3f3bf5a498db2fc1d347.npy +02828884-45dc4d46a456d36c2056b4bd5d870b47.npy +04090263-97532871e6ae97d8f0e1c0df18936d05.npy +02992529-ae942af3b88d07af2c557fc696108818.npy +03001627-d9902456104543c898d5fc0473d00a1c.npy +03207941-dfdf181c7c4b9a0a525c8adfc0dedbf6.npy +02958343-2307ced410b955a8cf1e58caa15acb49.npy +03642806-8e38d4d1f849f024296462783ef76d22.npy +04256520-fce58f4938a670db91c74eb018d3bfd5.npy +04379243-2ba4638aa672a0c419fb4103277a6b93.npy +04256520-899389d5ac054e7f33a851a05440ba33.npy +02691156-121b5c1c81aa77906b153e6e0582b3ac.npy +02773838-756066117169dbc96c1d5082d1bdea19.npy +03636649-ef40f27470d99d6fcb8d8c6d4df8143.npy +02818832-57764cebd92102552ea98d69e91ba870.npy +04379243-460bc82ba3a41a4f492489969eb2d929.npy +04090263-5835fd744208d5c9e6f7dedb7e5f584.npy +02828884-4f4416c9c53cee10b3a46b931571f116.npy +04379243-3a3f32deb30dc4e32ea98d69e91ba870.npy +02691156-9e06044df59e7f9f953041d9e16fa262.npy +02691156-56616237ed5168f3a18e0889038e4fb6.npy +04468005-e9dd4e42bc49b8c230a8c472227cd05e.npy +03642806-bb6af0aea6bd2381b0d7b0d4230df8ca.npy +03513137-a1bf8b293de641b5a5cc2b36a8952e0d.npy +02924116-a78fa491148db09526479a182158bae5.npy +04256520-33384d4600a8bd0ad88a7002dfb37846.npy +04379243-9b32bae53b91a01f278d386bfa54545.npy +02933112-a8cf3a04f848ff0e4c62bee40dcdc539.npy +02818832-d59ed3ebe65d978a922962743a259201.npy +04379243-eb34935c60281450d42b9650f19dd425.npy +03046257-56a3239391f73773a5e3e028709e0474.npy +03325088-81ca48ee431c29d472101dcac4ed75d3.npy +03636649-9b786274df42d55b774476b2e205b9b7.npy +03513137-96e81d71a15ecb1dd3f1ead878957615.npy +04004475-1f2a2824554a679abe4baaeae0897839.npy +02992529-7731182b7b8702bb357be8fc4a9ec12a.npy +02691156-b2b3fc16b9a676f5950bd071d87a18b3.npy +02808440-44bccd348dbbc2d6b448b8aaebb705c.npy +04090263-c12e1342d88e78bfdb132fbd93e54108.npy +02933112-278d1992a0aa9116ce8f46fabe978829.npy +03467517-33f932665104970740a420d466980e34.npy +02747177-cf09264eb6d80455526c1122178737e6.npy +04554684-270df61e08a104c4c2180858eb6a5f28.npy +03211117-dc73dee56c43fe018047f0f85f295702.npy +03001627-1e6f06d182094d4ffebad4f49b26ec52.npy +03001627-eab716562b582538f2599a47b2a7e92a.npy +04379243-798c315f86d8f02f931e98da3a93e73e.npy +02958343-c59e3f28f42e6ca3186fee06ae26176f.npy +02958343-f120085da70b2913627279ad10ae805a.npy +04256520-f094521e8579917eea65c47b660136e7.npy +02992529-5bc22a940bd88a21886d9e4484b773bf.npy +03636649-6e46cdd2f97cd28ad98bf80379cd1d6.npy +03085013-4c0d7cf86419a997d528a236ffa583af.npy +02691156-e9f39176973edd33a8cba409c4409ba9.npy +03001627-4e222d6b128a7af7b8fa4cb65e077db1.npy +02958343-171c20ce4de5ee8730f65ce13e7c1910.npy +02958343-355e7a7bde7d43c1ace5721ccacba16.npy +04379243-b3ca1f79cfb6b29cfc25405fbf8f85f4.npy +04379243-c47d1d0aae5de919f2bf00ef0d8c7aac.npy +03467517-66a6838a0887a85fd2f0cc036969ee4f.npy +04379243-585f8cdd992f541d23500a5b036df62e.npy +04379243-bbb7ad20cbe09b9b2ae0028d477b835f.npy +04090263-6e10893742a5add1139336f03eb955d2.npy +03001627-9a54daea9071a536bf80985a99195eb8.npy +04379243-bc8e050a6c0e49afea5682a3b818969a.npy +02808440-225742b31d7e28a97c35d3c5d3b1fcf7.npy +04256520-a05d53587e59b2ead6784d11c8f5b5.npy +03001627-eb3029393f6e60713ae92e362c52d19d.npy +04530566-ee3d521376d89f408c954439655c356e.npy +03001627-60512d74c623484bf27383fc5a5a711c.npy +03636649-e2209dc7b188f4a061f2222dd11ba79b.npy +04379243-649eda5783cc47e7948cb8e1d9ee487.npy +04090263-6a5c090b753cde05b5c25a656ff55929.npy +03001627-32408a694ac56775ce62834dbceac22f.npy +04379243-b9009a7b33df161ba022b82859ebabcb.npy +03948459-7ba9f65e926d5e3e6fe695987d47043.npy +03593526-d4b9e1085ebd4f226bc258c0f0234be0.npy +02828884-5aa9a03af76807fa94f937d854219137.npy +03928116-4a28d4c85e55a252a876e1c6fd98a946.npy +03467517-5621a833a3b1609145692e007d878b1d.npy +04379243-31e3a6b2e0b40045cb2a965e75be701c.npy +04379243-79b1e6c1e72490c98ca0fe30c6caf3f4.npy +04379243-e14f505926399396b5997278ed74fcb5.npy +02958343-80642f8965edbc51ba01f2d8d5d9ff0.npy +02958343-614d683fa574cd817fea5423f91210c9.npy +02958343-bcf4d748b5f3f13dafe1d4530f4c6e24.npy +04530566-52176ee07927984ab13f6ba928a796f.npy +04379243-505a99351f70664238b87428c6845ef9.npy +04530566-29f385987ef4594ff6b98f041a0ed52.npy +02691156-45574293b59c62ff301fa0a0663ee996.npy +02958343-fab45f900797908bbda733a39f84326d.npy +02808440-7072816b1da8ca1b1c17aef130ed6213.npy +04256520-b5c61f497f9354d535c2f4da17c09efa.npy +04256520-4e05ca172c988b72dc1f6c4cdb4bb9b3.npy +03001627-9a711bb7070ae88de948e3d64826c640.npy +04090263-1c96532b385e22edd0a6af9bfb470a20.npy +02958343-9e44269655ec3df9afe1d4530f4c6e24.npy +03513137-b3049575684f6ebfc0e57505cc92501b.npy +02691156-63a2144cfae402149b30aa09067b7eef.npy +04379243-2a88b6cbfe4b9a3ce2dee6f9fbe318ea.npy +04530566-ff2b8253ca3190d5d65fb76f5f0a1db7.npy +03691459-2a77ba363947f4f38a9641b35ef045a.npy +02933112-12f1e4964078850cc7113d9e058b9db7.npy +03001627-ccea874d869ff9a579368d1198f406e7.npy +03928116-3a8539e63cffccf65420ad944870069c.npy +03593526-e1835d106d89c69ef1f3019850abf317.npy +04099429-95fd683ddc8298d0b5a019b4fce31328.npy +03593526-661f1f07ee3cf13a77d7528e1646c585.npy +04379243-6a94aa414d11c624552edbe2a62e882b.npy +02871439-32131c4f13c51192bbb25886240eea46.npy +04090263-49ff48905ac9d95e585eba7ae331fc47.npy +04256520-43131890e972bb1febad4f49b26ec52.npy +04379243-fdf1cbe0d8aeba868c1cf3f7d7f0373.npy +04379243-e50bed5236712874ed258f1e4fbd53d.npy +02691156-3390c5050cda83c09a6e43b878d5b335.npy +03001627-2882587cd2fc021c168776226d349d71.npy +03691459-4c18da768d4c81c787695b38431695f3.npy +02828884-ab891fba7aa43f9df155d75bbf62b80.npy +03001627-2853ec74532f23f3670cf6c75c1c5868.npy +03325088-449ca62078205918d79b16e52324b152.npy +03211117-7422a1f42ebb1a1bea9ea4147227b8a3.npy +02876657-ee007f1aac12fbe549a44197486ae284.npy +02992529-84f07a9773374b062da40fdb29d70537.npy +02958343-db8eb94d24f5d8a2350dd0b332d84c76.npy +04379243-8915112d9819c83633b2a5760b4dd1f.npy +02958343-65ccd33df41999496d6573f48a06281.npy +04379243-599dfdedd707f7c8ef38727c2b4dc2e6.npy +03211117-a47aaca6619252acc4f499be00229a55.npy +04379243-d9ce0b512e0420f8be95ff480950e9ef.npy +02933112-8f30bc2f3ae12300a4669f677ccd56a9.npy +03948459-224947e496219e1da39dc4a567ce225f.npy +03001627-eea9a17689ef174ec14f867747674e73.npy +04379243-661b8e9d5a93e2a4b4c161851ed2b4e4.npy +03797390-3093367916fb5216823323ed0e090a6f.npy +04379243-9a5cb4122d518111b339f790b1757e92.npy +04256520-8e6312c23b6ac12f956c23e7ddc28c00.npy +04256520-8b066cf28fc1319da11411fb873de302.npy +04379243-438b2dcdbd25a93dea65c47b660136e7.npy +03691459-add914368a6ca448732bda87f2718525.npy +02747177-f095cf11c6049709d395fa91e75a7dc7.npy +02958343-9cabc9b21a7c5fcab02964031d37f87.npy +03636649-58b269eba3c6d09b57f40ff86fe708ff.npy +02828884-d5fd97ad2620480c62cdb4b7b7821421.npy +03337140-bbc516fd63703eee9dfa717f86ba8028.npy +04090263-aa235b7d9006c30de98e3214935cca1.npy +02808440-9de93ed7919c499854d7082b34825ef0.npy +04090263-144f38700549b35b31f639996cb3d35d.npy +03001627-27680e1b7951526518694a7306254063.npy +04090263-5e3e2c6779b3bbcf5e22590d7220b895.npy +03001627-ff49ca82d7f8e2bef27383fc5a5a711c.npy +02933112-40209ed0c2a718bd82ef94da039e491f.npy +03001627-37607ea19e352af4fffc97a61124b1a9.npy +03046257-f035ac6992723f9ff546596ce7364503.npy +02924116-b0604333bb40f58136c3fba5bd012bf2.npy +04379243-75e59e4626875167b2f7093e7efce142.npy +04090263-21acb1cc84ab5e5040aa5b072f9ee3d1.npy +02876657-77ad88568cb55237e01d7dc978602402.npy +03636649-e959384247c0dfbe1e18a354bfd56290.npy +04256520-de4d86efa8bdc67684ad2abb799c0f8d.npy +04379243-2fde3d8a04798c325b937c87a8810c08.npy +04460130-90e931890719c1b43d36e0a1be1c720.npy +04256520-53319f95d4bb6a0beaf288f952624966.npy +02691156-e712867dc4c1a4a6d016d0153a25a372.npy +04530566-d25d9a2bf4820003f3e39f2e17005efc.npy +04379243-73fc0f27cd57942ea2edf7a1fa4be45a.npy +03001627-e71ad853f50ea7872acd2bb6205825cb.npy +03593526-eb344ece6d6669fe68dd306b8ea5e1c2.npy +04090263-c61fd3dd6eee6465ccaf38f4d3340ec.npy +02691156-45570756a871989cfb5c1b0f759e2bc1.npy +02924116-b8f32af73acc268939f4ce9a2c9fb9f4.npy +02958343-cfd7228f455912dd9618aa9e2febbf80.npy +04256520-614ee0988dd6661d9559145fbf4877c0.npy +02843684-fa74d414933cb06d8c1dd15b51930812.npy +04379243-c4e7fef0548b8d87247b7570b0fbe63d.npy +02958343-425431f166ea35bdbfed25440ee4185e.npy +02828884-c9ca9b7317ac41b82168e5dee0d7f21.npy +04379243-48c2e34854c9aab889b74a90878aa3cb.npy +03467517-a2610d25db838d92538d7c152e19632d.npy +02958343-93c647af0338e9f35a06092d926a13ca.npy +02992529-16d7d7be19cde848dbe1e810cdc7471d.npy +04379243-3f1b826134c88f5fa0a2f1a46df5a003.npy +04468005-1461a40ebd86a9173c38a6d7dd5303d7.npy +03797390-b9be7cfe653740eb7633a2dd89cec754.npy +03001627-b3ced617a2923f674c9740802f05a1f4.npy +02691156-e33fbcf5b616d6f9f44f89e40af48618.npy +04379243-e4f9062ec3d2c6247d7b76078f434820.npy +03325088-bf1a08ed8d7a09833321831d2245cf06.npy +03593526-912c3e1cf2ef3b9ea7d0cc9b15400f65.npy +04379243-eb31e5efeb810c5280d6227ff9b21190.npy +03325088-bb2c9b746e450ae514b35a7d7cea7130.npy +02958343-fa997987367ed84ef15cbb7bb6511cb8.npy +03636649-d1ec5f73a0d3d6e4f3ff0017952fe4bc.npy +04401088-56a32f9e4785d3928a4adbc089030705.npy +03636649-b45b8df0557da6acc14d5c159bab8297.npy +02747177-f116f3c432856fccddd8899c86e55073.npy +03001627-bcadc00cd1bdc19494db33559ec0df30.npy +04379243-a3d155f1ab4731a515dd7d7985e749c1.npy +03001627-bf236db6dfa517aa456cbf78e1e89022.npy +04090263-3564b539a24a1b721a638d3d0d97d12c.npy +02828884-cf4075a6207a77fad5067eac75a07f7.npy +02691156-ff569b4018fc2640cea77fac5d58428e.npy +03636649-a049ad0f20953a144cc30865d6337b9c.npy +02924116-cfff3b5dd35f0b7d174bff1ac228f365.npy +04401088-b854fc846c1fc2ba619a006c72381476.npy +04090263-1d285f3bc7767bc8b4cdad9a5bf52dd5.npy +03001627-7bb5321d1e63d8bb36b0f2a1430e993a.npy +02828884-8596664f3d7925cdfdeb515ad63cf4b0.npy +04379243-670c2d3d20dded2bc5a208307819a3a1.npy +03593526-bacb6b671e5904d8274d4393e80e99fa.npy +03001627-446430548f6ac25ef25f6a97c97019cf.npy +03046257-921afad0f119509c4e09ebaf49b0cb2f.npy +04379243-a80c06903eca9eef7b05ef4148fe3aff.npy +02691156-939f3dcf67a1e1adbe13ce34aa7c0c1c.npy +03211117-b9cc669597085c028766390809048ebc.npy +04401088-ed53e90551ef9cb7118f00b061390b2.npy +03691459-b51a5f044c349741ebc9199df8e5ab6.npy +03636649-99f8c4a6b9ff1a2ab7f1f0dea571cede.npy +03691459-f9e6e10cdb3066929a3fe7e437a02206.npy +03001627-49aa713bec70ee1f1104b8f54582c707.npy +02808440-93e9520a999562f93af30a3946d92feb.npy +02958343-707d1e19b465d075adbfb30d8d1b297e.npy +04090263-1abeb8d7f5dcdaa4e06ed7bb63be5503.npy +04401088-9fac50c7b7c72dc694f8f49303e93f14.npy +04090263-5738a6de833d8da68d4ca42bc1bef451.npy +04379243-855f3c5541cfeffeef5609fd2064c33d.npy +03636649-a4c50a7adeb7d20b51014c684c004c28.npy +03001627-1e67e443849379fd6666a748bda83f67.npy +04401088-ce0ad218c6b19e76e7eb1b9b386befd.npy +02808440-ccafecd2880b61f754d7082b34825ef0.npy +03325088-fe9a455eb6d7867c3ca0c4be71e7b721.npy +04379243-f6f9626b892a529c2b642dfce4c7d8fc.npy +04256520-57183931e41c7aaa5ff61a3a2a0e2484.npy +04379243-4903be367953db8c579961b8f4afc151.npy +03211117-a9a2ec15d1223290916cd984b3abbf4d.npy +04004475-6f754dd4251d2bfdd4713685ae50fa13.npy +02801938-e3ef8c272a15fe83a0a1ab077d2d8b1e.npy +03001627-17f9eb6c0d818d45d7b20fded0142d7a.npy +04530566-47130fa6563a4712af6320700e3cf173.npy +03636649-c561496324b6d8154c5b22ae639d5204.npy +04379243-9bf704d5e2474cba3a6b5b5b9b35aa8d.npy +04379243-509d9d137fd7465a85c5f690e9252fc5.npy +04256520-ccbccd9a5bfd52cbd29d1a0303294bae.npy +03636649-8b85d01ba70a09e9a5f600ed2cf472ac.npy +04379243-46eb174e4df0f2e53719086e0b4ab8be.npy +04379243-a4990b3c86c680c3a71c812e027f94d9.npy +04090263-19fb748dbb9a97d3bc6e84bc30e573cd.npy +02691156-721eab5632f60887e72b7fd373921885.npy +04530566-12159b68a31a4a7eacb3e49e16caebeb.npy +04379243-1dbb8fd083f96ad279b3e1be3524f72f.npy +02828884-a12abb06ee3aa30ae074517a246f1e65.npy +04256520-73bb6025df29d208ae17f74ec30c4d4.npy +03211117-75336682aa3e245f80ecbe6250826360.npy +04379243-7249c3e41c4807c0f7e0e05bae6131.npy +04256520-a86bf379ca2ba8d8f2d5a0d235580548.npy +03691459-5b83ccf84149f28882613fcb45c2087e.npy +04256520-44d55ed577b77106599dcc439b161a52.npy +04379243-eabe7e2ee9547616214a15a5a42c49c0.npy +03211117-ace79948f769c652fdccfdbeccce2c03.npy +02992529-96b1d230e88cba16f71555c6480aef72.npy +02958343-98aa3b11abac3d73b7e1a37f8df80928.npy +04256520-3d5084d5e7654bd11cd6319703a6cb25.npy +03624134-d243969f5010c6c29b5844aa8fc56c71.npy +04256520-15fad17654ddfd3c33defcb28e53dee4.npy +04401088-49db0f97d215a109a2db3e68315c7819.npy +02933112-9ffc432bb61dff9f339797c21e8801b1.npy +04256520-625ffe6a78f1697d87ea4c09ea2202b1.npy +04468005-d433ceb5bb3eece98c8b260b832217ab.npy +03642806-69850d70fcaf5a464161e123a102b12b.npy +03691459-c725f6e275e9942f989542bab68e6843.npy +03001627-67d9afec46e20fd279c4b4a860b67e81.npy +04256520-192afbc1f0977f74861e0db9bb7afc48.npy +04379243-bc38dd123d9d50ad8b17d6d1965c2fb6.npy +04379243-92cae8ac60b09e3c6cfd6748e1399a49.npy +03001627-33ec1e64a02ff718faaadcdc0221eb72.npy +02924116-ef798c5d0e531dc53a56022c831f34f6.npy +02691156-918b46dfb239ee044a8d8b0dca1fd34.npy +02691156-a374b0448461438ef3d4cc10d9776c62.npy +02747177-aa547280eb99fd3fc8a06b09a9a18b3d.npy +02958343-bb9109ffb1789e98e55e3289e5df0916.npy +04379243-b7f733e648c850abdd91f8f6f381b291.npy +03691459-209086558286d4621ad88f716ea80910.npy +02691156-ff6f81eba664481126360e1e29a956c7.npy +03337140-4d591f85405c6a458eaad608e74402f5.npy +04090263-b8ccd8d1b693e4fb11f7dcbb4a32aee5.npy +04256520-7b1d07d932ca5890f51f77a6d7299806.npy +04256520-e471ff9cacad70d391fa1c643766450d.npy +04379243-7368b47a95e0db8886cc6209ffc37d3a.npy +02958343-405cb7dcad3d6f2f65af93d4326737fe.npy +04256520-51ccdee7080b11dde21111e385a0661f.npy +02958343-ef05b5fa8e2377f8fa7a46166f316347.npy +03948459-6663978acbe7f2b5336eda14178e5ec4.npy +04090263-16c510cfb4186a46d44d717fb37058d9.npy +02958343-a242c0446b186585852e57cec5098e60.npy +02958343-928a5f0e95e7aae5780bcccc86c008c3.npy +04379243-14ed71cd9f154616bdfa5e0753fa3240.npy +03211117-6fa8694a2b5dd0b9db768007c05f817.npy +03001627-5e5d9a681b53ee0d3b8d5c0ebdd194c8.npy +04379243-cfa43d56d70e530160dc76a524f85955.npy +04379243-10ca7bfe736d81b64b3c42e318f3affc.npy +04379243-ad060b3914729efe2175f7e45480df72.npy +04379243-16532364b5876d3881a172d69c52a28a.npy +03001627-4519d91ba59f0267cc0484ea4f50062.npy +02691156-1e4bb798f236f0b17f1f82f6fc8747b8.npy +04090263-607a6770f3bd10a16b2c8bb96250e4a0.npy +02828884-3ef2e306aadb9f98dd1f70bbc27696f8.npy +04401088-975de17c0b5d96cda38e5bd2fdb10d11.npy +02958343-f7b61de5d6d919a8953536e7c905b301.npy +02958343-4244e025c4a5de67ad411f846a866947.npy +02691156-219fa6821c9240e42476c2e017302af2.npy +04090263-21f013795d1b241d525cc89e716770ad.npy +03691459-21612bf3e866a8831d6b14cb827cdf85.npy +03636649-f39cc29063a308168466f606a3db18ba.npy +04379243-fa345f8f107d93b9ba70f71694a4b74c.npy +03691459-5b7cebe280c5aee935cd53a06b1d2317.npy +03624134-7725d5d2067f8fc0dd9394cb5004b836.npy +02958343-26c2c91d8eb660ecbeaa545f7f633287.npy +02876657-74690ddde9c0182696c2e7960a15c619.npy +04256520-7525a8d905a7aef4b3c42e318f3affc.npy +04379243-5919dea71f3bcb071d54ab02e78bef2.npy +04401088-ab621af8d265667a396287d16057dbdd.npy +02828884-410c1c5ae4e9d49f5ebcc146be902492.npy +04090263-62f99c3f2e7d133131e1c03c914d6f10.npy +04256520-14aa542942c9ef1264dd558a50c0650d.npy +02958343-72d4244540e81c671d9826a79afd9186.npy +04379243-81d84727a6da7ea7bb8dc0cd2a40a9a4.npy +02747177-3562096fbba555eaad5067eac75a07f7.npy +04256520-e5dee68606d47d3aca9b40e76e725878.npy +02828884-a2c53b2490e4151517a6e523c9595e10.npy +04330267-ef97ff5c1d6a00f2a760e402290727de.npy +04379243-8a45e9dd681d40d4789ee5c8d247b09.npy +02691156-ae8a5344a37b2649eda3a29d4e1368cb.npy +04379243-68b2ed56ad8d4e1896b84415a3f1393b.npy +02691156-f5403d3ffcc6bb17adce4f2283adbdbd.npy +03001627-6131ecb5a6fc9329f51f77a6d7299806.npy +02828884-5ab786ce3a18e3a170387839208c8db.npy +03001627-b69401b412d9300454d7082b34825ef0.npy +03001627-c6786aeee29edd1b2bca88fbd368f59a.npy +02808440-176b7a226dbede9ba9fe1734a6086750.npy +02691156-4fb69651d04e010554eefcdc602d4520.npy +02958343-755717e2f9edd1e36782fc9cb2c37844.npy +04256520-2dd491294a34ed7eff98db9ea1554f19.npy +02958343-7478183ebde9c6c2afe717997470b28d.npy +03636649-dccb4da9805924c23466f97f37dccbde.npy +02876657-5561fe6ad83a5000fc0eb7bdb358f874.npy +03948459-5f487e398bc0551c276c3d558130f8b4.npy +04379243-64f73518c32b8b7af49a23658fe5597c.npy +02958343-373cf6c8f79376482d7d789814cae761.npy +02924116-7c3411d4bcd34e6de841ebdde48e3937.npy +02691156-fddcb2b3d45ce98e641c309f1fd7e183.npy +04090263-a12b0328e2b9eb17f084db89eb9085ce.npy +02958343-9d5c0108ce2c848e977b27045b1d8055.npy +03001627-39d357d7ba9645d4647d4fd8d921152a.npy +02691156-37fbd275a734ec1b66cf1b4a8fc3914e.npy +04090263-84ab70232093057c12b38b1d99376c0b.npy +02691156-e7c6e2f7c5fd372e8e9091d822257500.npy +04379243-639d99161524c7dd54e6ead821103617.npy +02946921-100c5aee62f1c9b9f54f8416555967.npy +03467517-ef8874b3d10303c793f0194265a9746c.npy +02691156-3cbc83ba49edeccebc0909d98a1ff2b4.npy +03636649-d748241313e5664696a3517f50eeb9f4.npy +03001627-5d72fa9aea5383384a73e364671ba824.npy +03001627-898dc475a4f36d0d35836c728d324152.npy +02958343-323c9dc2a8911e146f2f07de403e98d8.npy +02958343-ee5e6649db524dc2eb22840c40c3154b.npy +03325088-7d1c4b0c119adf6914b35a7d7cea7130.npy +03211117-ff9a428991106434b9e65df431a37c1.npy +03790512-68e8c73ec51aeaaeab548456bc75847f.npy +04530566-77331918e10b8eacd07153997ca82b26.npy +02933112-54d9053622deb8866ffe0f6a1d92eb85.npy +03467517-2a0a47930aa7ac1163e148e250c0340d.npy +03046257-fb0fd780eb40e7151b02cde7e81f0fc3.npy +04225987-1c8d5e05c3faa05861be5ced44bc18ac.npy +03337140-bc07b1d9c50dac514c3aee8e9d3a6ffa.npy +04330267-a7414667b8274cecebe9a187b97c9295.npy +02958343-ba7a583467ff8aee8cfac9da0ff28f62.npy +03001627-38dd3fee84698e5242ecda58458cd17.npy +02691156-262795bc8a994b11ba0d990ae229b477.npy +03325088-2c80e8261b08d3e76c18e71fd49c4dc.npy +03211117-44d14268d1e961e02f653d2c3f9c5e62.npy +02691156-62fa636e217a3db25a70c4e5328e0b9f.npy +03636649-1a9c1cbf1ca9ca24274623f5a5d0bcdc.npy +03001627-bebd1aac01d747e82500a3366a96c301.npy +03691459-739f89b772ccf495b9451ae41e1d9ea4.npy +02958343-42eb287e220fd02c2e466666025c187.npy +04256520-a0a53f2f112055d496626c84a010ee5c.npy +03337140-53e41619c15465c14c3aee8e9d3a6ffa.npy +03691459-4678a534b01fd4d6a29efdf1e3212661.npy +03636649-437b5e12cf1b8771146f6ae9394828b0.npy +03001627-540aaf05d1ff41c0c90a83871023986a.npy +04468005-cfe064a6bbc9a33a64efb12b82a690dc.npy +04379243-1315d61d095210c05510d59f3ab1ed64.npy +02958343-79d684368c596b4613f9826aa0cb4736.npy +02691156-44dece8f8529374ee2199ec015f35ba2.npy +02871439-8db6a080f00b52e46b8fdc9bc8edc250.npy +04379243-726164afa497b154b075b4c36d25279a.npy +04090263-57bc575daa1a56109609aa6ba54014c1.npy +02828884-6b2caf6470d3dcb58ccde000e771fc1a.npy +04530566-c8f5e3891a7b0d1188d5590328ce0ddf.npy +03624134-150ad6a5c35beb17ee79d445a3ad4fd4.npy +03790512-1a2d2208f73d0531cec33e62192b66e5.npy +04379243-bd594555e192d5797d3a650ebc940efd.npy +03001627-798a46965d9e0edfcea003eff0268278.npy +02691156-db8ee29417ddae1bae6908c1ddfd8734.npy +02808440-eb00cc6ea32fdf6d3321831d2245cf06.npy +03642806-5678a2173ff575d09cebe817bc1591b3.npy +02828884-e329a9a5e7422b0a43638dabe1eb5336.npy +02958343-9af8945bd83ba89dfb115c90506f20e3.npy +04468005-55c595c848a8478da09163d0bb607639.npy +04256520-698a0a47dd9bba797ddb7abd4c043364.npy +04554684-d2711c36636e9b1eeacaf08e3ee3b2b3.npy +03636649-538dfee2a9b520962301d516d0cd4456.npy +04004475-c34ab9023b4d12b8b49ae6eb1612b7b9.npy +02958343-3d81e36e5252c8f0becf71e2e014ff6f.npy +02843684-4fdd9afdb1b0785c74b7a6c82ccb98ba.npy +03790512-30157c4a6c09f884c97a3fcdcfe70d5.npy +02691156-df68b8fb9f4531b42e690fa6dfd5d610.npy +02808440-61475bc1cf693943d6a6890cb66ada39.npy +03001627-7228564fe629f578e8f8c11a24c52ebb.npy +02880940-381db800b87b5ff88616812464c86290.npy +03991062-6f3e2c8b4647f488ce6b277e4d642b55.npy +04379243-9f3d0cb709260aa09ccce4c6d5bb195f.npy +04401088-434e23fb04effbb86bc30c6a9ae3d46e.npy +02946921-28c17225887339bd6193d9e76bb15876.npy +03467517-5294e1ae86ec43bf8b6c1eb99bbc3bf2.npy +03211117-f39b7f08d4ea066be57ac88f5432bb4e.npy +03991062-d74b9f970a2f4ff098910e50f05b8001.npy +03046257-3eb3ca1c532733841e085a650cc639f.npy +02992529-c410d13694b8ca1d15e144fc878b7afa.npy +04090263-f26068a05c107a8823c69c7ff0f71040.npy +04379243-884f15cfc6a3eea3dcfcef693e7ec696.npy +02801938-e57f5dcfc6c4185dc2a6a08aa01a9e9.npy +03001627-575eb48e4bf8f7b4cccc2bf504407f19.npy +02828884-b19e1c6ab766b09bcb2a965e75be701c.npy +04090263-575ccbbf4be84e3ff85b811e02bb4272.npy +02828884-3b8d16dc796f667af155d75bbf62b80.npy +03001627-8c2a3ae39c683fde3ae7d83fae2b798.npy +03790512-6d4ee0be5746095d7c088bd2a4124c69.npy +02958343-3db560d20e40c3b835ac1a825225d411.npy +02808440-b19ff5aaa6a6940b412deb0d2b0f3dcd.npy +03001627-f39d0db80cf41db9820bd717b66cebfc.npy +04256520-9c0ed8415a0a9e5c49b1e464b71de577.npy +03001627-82b42b0f3ba76484e4fa0af6f7c25e58.npy +04379243-21486e6d0bd896ad5cca18918d24f6cd.npy +03001627-bb0c057df2dff54fba4b91e89f6f35cb.npy +04379243-27d846b100a1be0535836c728d324152.npy +02747177-46fca3bdcd454402f155d75bbf62b80.npy +02924116-e3c1213d68656ffb065f1478754df44.npy +03211117-ea7dc70f0ef4b04bcbe0b8af4aec5d6c.npy +03001627-bc78f5fc9b614e357cee0fb3ce7bfbe.npy +04379243-768cb2332a16fd63855931d119219022.npy +04379243-3d8feac23ebc7b5dc6a19173dfae14a8.npy +02933112-353dd8c418146de16c7d1f675f2a04a5.npy +04256520-f43414acdca3878674c5bf7a74b1b6df.npy +04379243-ad5c26058efb026446b5ed2bbbe6c.npy +02691156-186ca7892ed6de2adb22b838c125a50b.npy +03001627-ed56af61297594bf1c4300651205adf3.npy +03046257-3c100b0dea7a60b768aab09a0ea50724.npy +03001627-9bda786a525b1ef93a11565e5be9cf53.npy +02691156-4710274bd87b099f19cd118ab9f114a4.npy +03001627-9214670b7c1e36bc1b1e2ecfb322ccbd.npy +02691156-5fc53108f6bf2f45893f875739da1b24.npy +04401088-e7ef78ddc23ab4edbad0eedd46c6260f.npy +03001627-c649c3e28d05e0877c65caaca24f3fa0.npy +04379243-8b835170d8123a1dcf004563556ddb36.npy +02691156-c00d38c09ac5e6b8405970680284869.npy +03001627-9ad2ee3a38a3d0ce3b32c8e0ac22ac44.npy +03991062-133dc38c1316d9515dc3653f8341633a.npy +02691156-fe23572aac36c84761cfaa00f7177470.npy +02880940-a042621b3378bc18a2c59a4d90e63212.npy +03001627-e26ac9cc4c44f8709531b4e1074af521.npy +04530566-99c19a1c05dea30454e3de9fd2bf8dea.npy +03046257-c526b6315e1600092a8827a91069be93.npy +03636649-ad7fedee24a70d82a5f600ed2cf472ac.npy +03948459-467ac647f0aee4453a4133add633b5c3.npy +03710193-51ad8559caed86a55b2b887334b359e7.npy +02933112-97902b0e2ce271ae60f16a92a4f24bcd.npy +02818832-7c8eb4ab1f2c8bfa2fb46fb8b9b1ac9f.npy +04256520-bf264dae9a5fd53dd39e33fed94f56ef.npy +02808440-fd34f47eb1b816139a625c8b524db46e.npy +04379243-5bce0f5c92198217aace21c72a80029c.npy +02691156-172ac13acd9aa91f3df325aac2f73830.npy +04379243-4502c9c63e7b0bda412dfc90452742c7.npy +04379243-933937b12b4313dbe7c58a5ade21d962.npy +04379243-18c25f8049fac943bb7ac4d22a68ec08.npy +03001627-953a6c4d742f1e44d1dcc55e36186e4e.npy +03001627-ccc772dd462e8d2da6fee8e2140acec9.npy +04379243-995b7cc4da9f0371eadc9f074ecd1df1.npy +04379243-afab57dbd3c7ef0e98d5fc0473d00a1c.npy +03691459-94944fbeaf37861c61ffb06b88ae391a.npy +04256520-371b7d7d2f2d334c574754e046bb9a7d.npy +03691459-93e9c3de55b1a662989c6c7df583f91e.npy +04256520-8880686b417a054fa1e36ad603c7b9c2.npy +03691459-736820a85063a4371e5b68ee10358ea3.npy +02924116-beaa2d7bb79d11758b89799e9a2e578c.npy +02933112-65dcdb468234c4f64e2e1b2af0cc59a7.npy +02801938-7a0a4269578ee741adba2821eac2f4fa.npy +03001627-bbf45d2d189dcd758e5f5b49c9f5b3f2.npy +03691459-ec1b85abce89d680a7bc6032416bc8ae.npy +04379243-69604fc24b7976d69ccce4c6d5bb195f.npy +02958343-df72f352c7fedcfad9951d9ecda74409.npy +02747177-9887c4dfab0816a0febaf541a3d4b03e.npy +04256520-c57bac39e7c4e151c8a0fe52b1df3602.npy +04379243-3b9f12fa1f257b9d85fcc38efca7d59c.npy +04401088-ab3ebae8a44e1ae8ca47cd18decbac61.npy +03001627-312df229ef2675c4492d9da2668ec34c.npy +04379243-ba03fd0b4b54655df51f77a6d7299806.npy +02691156-7ba9eb4e8405371ca8607f540cc62ba.npy +04379243-d21ad1e0d76175e3486040c0d9e85846.npy +02924116-f6f71cf39d30d421269ee466c7a9d8b0.npy +03928116-dfc9e0e55de5b717c4fc722cf32cf40.npy +03593526-5e421da99a879732d8564c06b061019.npy +04379243-1d8278324bf01d50c45662a6a951b979.npy +03001627-44c5b57d406c663403f064eb1ac2f31.npy +03001627-1e68489b0dc2bfc3327289c00b6dc9ca.npy +04256520-6d0cd48b18471a8bf1444eeb21e761c6.npy +03001627-6986aa6ac96abebc71a782a4379556c7.npy +02691156-22acc443fd007fce6e80138ae17d7d07.npy +04090263-785ec43cb6f1a534e1f2a1daf140ac9f.npy +04256520-626104245de40df863860d683ccd0da.npy +03211117-9b7cab4099b2d1dcab29d5c9003deef.npy +03046257-1ce45a951007b5948ead471f0d2cadc0.npy +02871439-67f5342ca73bcb5a664b3b9b23ddfcbc.npy +04379243-2312d2762c1bad27f84b0be7f50940eb.npy +04379243-d291243cfb51ea7dcb25d116843b43a4.npy +03928116-a5c7e8103ba4ad8e950035704d666ca8.npy +04530566-afe3c44c5c05c22649d2623ea24fca00.npy +03790512-b1bb49d472fa7a39e0dbf31b32c641d1.npy +03337140-7074f91370bd1acc91c352d02061b3f7.npy +02876657-618d55a791b8280cf256a8c3e3396495.npy +04256520-70a16608ffc4988a81ff2b419139512d.npy +04090263-2bc57c73ab84f2c7d14664a287de0fb9.npy +02828884-ac477aa3d54d0e06f9e4cc51c75c384e.npy +03991062-91e4df396135fc1e368b14e48c164a6e.npy +04256520-cc20bb3596fd3c2e677ea8589de8c796.npy +04090263-e98b64d14d3fbf40b4b0a5ba224bba06.npy +02691156-75db11c354c6342aad01ec966c80ac91.npy +04379243-9f1d1d13f42bd2728490246570868c8d.npy +04530566-27f0d2bf42b0e3374ed242fafe836df1.npy +02691156-812111e3a4a545cbc863ab010b80d9ed.npy +02828884-514ba7cb3392ca5ad5067eac75a07f7.npy +04379243-80f986ae572fce791429f9a19502375a.npy +02828884-8c942a8e196a9371a782a4379556c7.npy +03211117-6ffb9e26f6d0ac61e4a4a1a686b4ec8d.npy +02828884-4145da9aceda5bcc8b6ad894ae3d111.npy +03001627-3adba11cee055363f51f77a6d7299806.npy +04379243-2fe32a0c23de48b7a4462b13868efd3c.npy +04330267-cb5668415bbfd5dd4af957103f4767ac.npy +03001627-83649708d0f14dfb8367ecca203c14ae.npy +02924116-8bd2c0ed3ad104266a35b75910eea5d3.npy +04379243-2692e57df4705d4d10faac7a8c2754de.npy +02992529-ff9e8c139527c8b85f16c469ffeb982e.npy +03046257-d697509cab438f240ba17ccf542984c.npy +04090263-e6fb0c7f8a5f944363e66191800dfc8a.npy +04090263-c836ef9c895460ae9e4b997bcf5c860.npy +02828884-d1caf5fd22c6c5083892cfdb72a66fb4.npy +02691156-472e6c2a77198432e1211756a8e887aa.npy +04256520-13a8c6129a8e80379904131b50e062f6.npy +04256520-436a96f58ef9a6fdb039d8689a74349.npy +03001627-bdeb8ea8a146bf69e54cb890e8682c84.npy +02691156-aa05bf3c5a7bb61bcacf204c07dae519.npy +03642806-928c86eabc0be624c2bf2dcc31ba1713.npy +04379243-e0b849b1545d35dab04cb542e2c50eb4.npy +04090263-b632d00231acfc0211b5cadd4563c164.npy +02946921-926d45845c2be919f8cd8f969312dc1.npy +03636649-6f984fe4627c8333752653a04e5ed7ed.npy +03046257-42529911fe6265862b5fee72119e2778.npy +04090263-48e24736473ae37f4b349e4b3dd5565e.npy +02691156-b22014408721ec314567cadca15fe337.npy +03513137-6e082b8d5dfe38c0c4278fc12d4f4d35.npy +04530566-da57d296d06af50d6fbde5631e3e226.npy +02933112-329f11a156aee39ac59350d819542ec7.npy +04256520-76fb7ca32181075e9a547820eb170949.npy +03001627-6419887905d9d67b7d3115a956c20163.npy +03636649-e69b661bb90d7e9c9dcf2183c858e6e5.npy +02942699-936a458fdb8eb12171dc2053392a6e6f.npy +02828884-2f340f2bd55d51e5c8cbe1805e7b8eb.npy +02747177-7bde818d2cbd21f3bac465483662a51d.npy +02933112-d707228baece2270c473585373fc1fd0.npy +03624134-5cdafa063633c35ea326c894c9217cb.npy +02691156-e9dcdcd8963ba18f42bc0eea174f82b.npy +03636649-d98c3d6304228f36d3cb982c5a53c2d2.npy +02880940-24907349b2323824664b3b9b23ddfcbc.npy +02958343-63f6a2c7ee7c667ba0b677182d16c198.npy +02691156-37ed9b767fb055959d61264e98b74348.npy +04379243-95b7d8f0fe70e768827291701dfaa1ff.npy +02958343-7448f1cba230298fcd61ab83ca5e9957.npy +02933112-c35d287217403cf3236641942dd4b3c.npy +02933112-c73ebca7db882f3ef26c21d3bbafae87.npy +04379243-7ab4a9f2c8aa3636cce18f92a75d5ffa.npy +04379243-e8d55124a196c71f64a8099f44773f21.npy +04330267-50c1f300272df84cd696cc46feeb6125.npy +04530566-d3f6fc016f72c08f1346991b5a9f4d21.npy +02933112-8994e11588b62bdfed208c42f7ada5c4.npy +03948459-50ad0fec4ad3b273839b0ffdb91ef00f.npy +03467517-f6146aa6171dd4f4828b9741c7dfc3ed.npy +04256520-55d89b64ec895fbbf2ca754af3aaf35.npy +04090263-6f0de5ca4ec2493ba7dd22c0aa3913f0.npy +02691156-21c7cc3e5f27540be6553f96496649c9.npy +03001627-341bcae1e7f366a233d93f57729688db.npy +04468005-84f7242486ac543b40f45eea058ceeda.npy +04256520-d60975380ebd13746a12da8b0e0f66fa.npy +02876657-fec05c85454edafc4310636931b68fdb.npy +04379243-9eba16c76875225a2d69ef58c7c1b72c.npy +02691156-2a7c34d4f5aaea962b600da24e0965.npy +04256520-31256698e33ac007dc149927e19d9b07.npy +02828884-450fd49e69534ee6d5032aaea433efa4.npy +02946921-97ca02ee1e7b8efb6193d9e76bb15876.npy +04530566-cc3ebcb96229bd325f8dd1b77a5d87c4.npy +03691459-90882268b1169ce79428390c02f266d3.npy +04256520-f986646cfa075237c02170c33e00ea64.npy +02876657-e101cc44ead036294bc79c881a0e818b.npy +02958343-187b002f0af1ab5a473f10e6caaeca56.npy +04379243-c1371e87799885a7a329355bc8cbc0b5.npy +02933112-bfb9eda1e7f92339800f2aaba8549124.npy +03636649-dafdd320477802a19a4cbf5d3b79df06.npy +04379243-927903e9992ce4877b619f30d1fed49.npy +04090263-e639996b832a157e6e0c9892807c7fa1.npy +03790512-12f06f32ede64d613ff4d2f5a7608a24.npy +02924116-eb073520d0c4db4d346f9a49ab523ba7.npy +03636649-3469cdf83a3cba1f35836c728d324152.npy +03001627-990ae87d8fb108ee80bd85224f0b94aa.npy +02828884-d87bd42b60591573c83f7280476c6eef.npy +04468005-4bde97a6453c809adc14ba0818ee5cec.npy +03001627-3869d2fda85428c4f91663a74ccd2338.npy +03948459-9accc818df62042146be58202cd6477e.npy +04090263-f7f945288a571090202be79d8b285c1e.npy +04090263-1068169d0f5df80e91cd21d02e676faf.npy +03001627-d85b661f2c9345f819fb4103277a6b93.npy +04379243-154fd969a077a39772dc9d42e683347.npy +02828884-5b50871735c5cce2d2b12aa6a0f050b3.npy +03001627-a094ba480568333819fb4103277a6b93.npy +03001627-1ee92a9d78cccbda98d2e7dbe701ca48.npy +04379243-33eff70928eefb54738e43095496b061.npy +03001627-df91f68fcd968fd0e4f1a5bf17db27b1.npy +03636649-1a5778ab63b3c558710629adc6653816.npy +03001627-4c1c81cc186dc50fd84b8ba651dfb8ac.npy +03001627-cb711f2991feea1de6c5cd45aa112726.npy +04379243-ed59a9478c7cdaa27d892bb924f972b4.npy +03636649-2388c99892c2185268d1b9a1d97e2846.npy +04379243-d35890b708c633546f31a2b0e5969628.npy +03001627-1d6faeb6d77d1f2cf95cd8df6bebbc3a.npy +04090263-2ab086ef262c8688d6a71f46c1c1c5da.npy +02933112-babe716e40b3aa81a54c1b71c072d546.npy +03001627-e7316ceb5b944b6fd0a96520c31993ad.npy +02958343-67e1b04f88c88a5c6d07c55cf995503e.npy +03001627-895be5f65513a7d09a8ef44e1d2c5b75.npy +02808440-6c1b18b0fa544552d93d979414505038.npy +03001627-52a96a3c89305673504721639e19f609.npy +04256520-40337cef87a495ff6e8f2cf4a97051f.npy +02876657-ed8aff7768d2cc3e45bcca2603f7a948.npy +04379243-a14d6cda9c2ca5c0c955e5ed03ef3a2f.npy +03691459-2bdeb030dc3caba21ad88f716ea80910.npy +02933112-58b97051fb1efb3b4bd9e0690b0b191.npy +03642806-f53a54a64dc475195f2e56f31ec62a24.npy +03046257-fb0c59c0bedf2276f51f77a6d7299806.npy +03211117-4bfa2e1e43d64c51cbdbc7635e6b79a5.npy +04530566-8410626d841dca3218b14db3b83de9ff.npy +04379243-497bd3f966eba2d76402b8f491cd92c7.npy +02691156-5c6590461085c93ea91e80f26309099e.npy +04379243-856e86709df98497dcfcef693e7ec696.npy +02808440-654362e53ebb6e303321831d2245cf06.npy +03467517-222b705a80d75a4343b0b12983b9982.npy +04379243-1c996c187f4354db7252c133a7e17d94.npy +03325088-86e97fe0431d070fdf279ac1867e743a.npy +04379243-d47189d9686125553caaa84ea4cea094.npy +02691156-f6e6fd724a9eab24ba8e93696257b3fc.npy +04379243-c06a4b0f57cac2b020afdc30846c0661.npy +04090263-320c462553b4eb18d18f925e78a25ab7.npy +04379243-322e8aaa889e25720768660cf080d12.npy +03636649-df22225de54de36d71d7520e3757f3e9.npy +03636649-b4be7d84e2151a3e8bb3deb7fab7c9b7.npy +02691156-e2f91794c302f5c03221f63172285740.npy +03001627-61a6a9dbd3d0efc2c3bd24f986301745.npy +02843684-9c038a6c2564f3b0560e99aa033eed2e.npy +02691156-55036f6b22ddeeedca8607f540cc62ba.npy +04090263-744064e205da68779180711d39b16e1.npy +03001627-f030f5181057ddf75622d7484764b58f.npy +04379243-e686855b4c95330db3a8888e78d004b3.npy +02691156-b4d64b689e870d1b828204947d78b9af.npy +04530566-f83474c31e7bb6bc1022decd5ff96217.npy +02958343-caa26e8b5033be6ac02f176e44f0fcec.npy +02924116-2e86a7793af11e422d32966c67e5becf.npy +04379243-905628a74c7cec233a574a2e3bc99a1.npy +03928116-4b108a9725e4d514f787be2ffd2fc6c5.npy +02992529-b854fc846c1fc2ba619a006c72381476.npy +03636649-1d89da4ac1538ada9c949ae6274aa016.npy +03636649-4775f35d9b6942081b42cc426459cc26.npy +03928116-b4c3484639d15d24d6cfdd2c4c6de262.npy +02958343-274bb81c9dd9420b748999a5d81a158c.npy +04530566-bf8995f756b59102698137c717c4ad11.npy +03991062-80608e58db79d4d83b722c86abee0751.npy +04090263-d032874b5c3129a313b55e8563d02319.npy +03467517-5062f174c623b70d4bfcfdb26b8cb2c3.npy +03001627-56bd6bcf5034c7e2f9b9977a2406713a.npy +04379243-30d6d671a33b6c22e76bc197b3a3ffc0.npy +04379243-57d6c26b519918d770cd267ba4f2b2ee.npy +03046257-7e779affe56aaa3645a3ee2cfbb67212.npy +02933112-37ba0371250bcd6de117ecc943aca233.npy +02958343-7ff4c1fdfd0e9bc7b99adc532ba20916.npy +02691156-b3ac8c2c48af1c07ca8607f540cc62ba.npy +04256520-1c9d333bda4b2977f92f3e7bff4c4ab0.npy +03325088-a954783de7f881e9c36fb70296e45483.npy +03513137-43f6f91a2a64a62b5fd0ea7ae0dec99c.npy +02691156-8bb8876d55433eed216b327569dd806e.npy +03636649-1f15e31094a7460aad5067eac75a07f7.npy +04090263-28f82ff412a37a304c8f375eb1452283.npy +04554684-24d50c4d744c20494a084dbeb79b6bb2.npy +03691459-7bb0cc242729aa90eafe995fd10c1326.npy +04379243-f3b8c91c5dd1cb6b8722573b29f0d6d8.npy +04379243-d97819998f885d54fb977fd7ef10cdde.npy +04379243-3fde8835e0f31a64d8cad143689f8b51.npy +03325088-3be00bc0418fa112b362845c6edb57fc.npy +02958343-9f5d5b655ebbbb9c4d31b03e74c723a3.npy +03325088-a088bb2b65e1275f76c18e71fd49c4dc.npy +04379243-224820b020c1b6136b0f2a1430e993a.npy +02992529-ecbb1c53e881c2b25f4e4793ed432bc1.npy +02876657-10dff3c43200a7a7119862dbccbaa609.npy +02691156-700bc5991a46c1d53ddab476a0f5c5ee.npy +03001627-34108b791e6bc4ec1bb7158ebaf7e1c8.npy +02808440-f3cb920a47e224cb39773ee5b5578e3.npy +02691156-e86fd13a49f0ee0a62b600da24e0965.npy +04379243-bfa77d6ff4e853a275b278bf2780ee51.npy +04379243-440d371725f4f6bca570c6c691c987a8.npy +02992529-359be05b5042209a502122ac3599bb74.npy +04379243-8647063ec039c4eff51f77a6d7299806.npy +03001627-32d67f875ead7f1eaf46128407fbd2a0.npy +02871439-7d8a58d4c6dae408b4e3935c6cee4b35.npy +04090263-3babca331dad56aa1b3a159059d827bf.npy +03991062-d31fd6abafb3daf3153f43b48d21615e.npy +04401088-43f7d0cb3f0ace029bc144914804a8be.npy +04379243-b278b58e294a7d2bac242c3aebc81b2f.npy +04379243-b6ad7be371729438dcfcef693e7ec696.npy +02828884-e807cba7fec6d514bb5d4e2d93fefdc5.npy +02924116-ac69801f426df5c76ca2b6e5474aad11.npy +02691156-6047f2c5854dd38526cb540828830330.npy +04379243-821f2cc776043008efe8aae804e55d6f.npy +02691156-2c9797204c91e3a440975e4feec771f6.npy +04090263-77241daf76a045c099d9d900afe054b8.npy +03211117-e5e5018fe96e414528d0f4c81cc1f1d8.npy +04379243-df767f2df999315b74ffc2f06690002e.npy +03001627-eb63908dde4b579e25d45769a218937.npy +02808440-1c68386f4be530973321831d2245cf06.npy +04379243-224ec626233b7a0c14038d588fd1342f.npy +03991062-db36c80ae2c96e3dfd8e2841125af0fe.npy +03691459-f25cae5549e30302803f272bf12359d9.npy +03001627-c8265e04c94bcb5a1346e336f65f96f6.npy +04379243-ee6a58b9f4a5a129ba5342d638d0c267.npy +03001627-27317a0db349369c8b74e4684f0d409d.npy +03636649-a2c9d00ed67862af2c528d33bca1ac2.npy +03593526-ef5269ba557da598561dce3fe08634b7.npy +04256520-ea0ee7b60919e35bb1dd813f3c0d0dd.npy +02958343-a6acea161250379aba3e2415e22cd45c.npy +03001627-2dca240a3726c004a83826e22c7812a6.npy +03001627-8f23005418fee71819fb4103277a6b93.npy +04256520-baef1491d5bfb6cb58e51facd8ce1a25.npy +04256520-87936de578cb81c4c61648d3e90c5695.npy +02924116-bfa9f15a8aad2e4d37bff66a594d9608.npy +03636649-381c2fb265c32cb093be5e169656ef71.npy +04379243-ba4ffdf3eed29dea9f8c3d2002c77ddb.npy +02958343-d953bbe38edbc6f4ea999fe4ffdc2504.npy +04379243-5485834dbd8cd031c963bc72ef3a8742.npy +03636649-b0c346ea1fa3ad0b2d7dd0a148440b17.npy +02801938-eb58305e6c1b4455a9e3e4940ed610e4.npy +02747177-2a25715df1064c8ad5067eac75a07f7.npy +02933112-c7c782fd5976ed7214038d588fd1342f.npy +04530566-9e4cf06ced9331d3bed4193378c6c5c8.npy +02933112-6a121783609b4a18824662341ce2b233.npy +03790512-bb1c9e1346c5262bedb66d5d04c0da43.npy +04379243-17f4b14ebbe37179ab2b7e9ed9191486.npy +02992529-e30f2d19e9f44f6ab0cb879d4613195c.npy +02958343-2fb5fe84c28b8b35cc02882a83047172.npy +02691156-446327ea5e2e50aebbf3143b1cb6076a.npy +03948459-af10941be2d5778d25c70fb1df3f879b.npy +02818832-be8ce1bffe716f7ed2ebda13f0b603e6.npy +02924116-cb3bb1c939c73f5752470de2774d6099.npy +04090263-49fb34153b09db8dff790997f2048517.npy +02992529-53ce93c96d480cc4da0f54fde38627c3.npy +04379243-ac1f8fe1e544b87fc798432661977bc1.npy +03636649-57e53cf314a173f835836c728d324152.npy +03991062-6e8297cba6273bd172a90fe1ba02202a.npy +02691156-7f09b3b11ae3f22dbe13ce34aa7c0c1c.npy +03593526-451d7b1633aa8ee741da9a75408092f6.npy +02958343-37fb762e57f343a7aaafd94b9f216ef6.npy +03691459-a0f57b3d2c2ff2ee2666ee81c3e6ae4f.npy +02773838-6187bd900c3bc002ed13f430b2941481.npy +03636649-b444be0623b2e237d73e51f8db3a696e.npy +03642806-f3d162798a285521da0ccb8671dd235b.npy +03001627-e9f83e38241515a7438d8caa9ae106fa.npy +02808440-a7e6c5f63e2ed8c2f6b70f40d73aaf47.npy +02801938-f15e1a252c89c4d3494d18cf12f347f3.npy +02958343-3d693af6fbae47f9cfb661f69a0dfbbd.npy +03001627-2a6b8437623a374e504721639e19f609.npy +03001627-19861e56a952fe97b8230112437913fd.npy +02691156-d1cdd239dcbfd018bbf3143b1cb6076a.npy +02691156-2b5c0a38c754927d21abaaa81d1a4195.npy +04256520-9357812939117927c0450f087c15de65.npy +04379243-dc611d5add49200d868cace2a58d7210.npy +03991062-5b476163b025a5931143841839c8c312.npy +03046257-83215aac91958278ee2b478fec745c0a.npy +02691156-9dbab9e46b372e837645a27090729af6.npy +02828884-1d9fc51fa296bac9a1770107888e7eb8.npy +02773838-581af450a3a8009abc49cae1a831a9e.npy +02828884-1ee7b919637a2acecb2a965e75be701c.npy +02808440-e88fb160e35aae493a762233fffc49ea.npy +03691459-9a91398e66a8c980ebc29484102f14e3.npy +02924116-d6b48aa8ab3b5c8ea22d178fb4ac75ef.npy +03991062-297b925ff864c56c8ec58bafa7a6bebf.npy +03790512-70d9cc5115bfedeeab548456bc75847f.npy +03593526-9a5cb53a2858225e72a5c49c981e6593.npy +02871439-f807ffc89f4855f7d927b44c79143ca4.npy +04379243-ad63116007d98a6d19758238d4c7aff2.npy +03636649-67780176ebcb050dfe3e90bc90e90c63.npy +02958343-528fffd59eee9bc5851f021b9ed69c58.npy +03636649-3c756a2c1c62e73b7252c133a7e17d94.npy +03642806-151fccb37c2d51b0b82fa571a1cdbf24.npy +03001627-28844eb55fc82dc8f4b6538438a0b930.npy +02691156-6eb12144093da25e816e98a113f4d393.npy +03325088-7e8cc52fa74c26b4eb1f243bab39fb29.npy +02691156-8f33d2c0c08befe48caa71b1fbf7fb98.npy +03467517-264811b5e65101acc34b900bb2492e.npy +02691156-a430ba73d3ee2c0fca9f0727e23831d9.npy +02958343-b619910e7e51d8e176ad064d1c5fdd7c.npy +02958343-9609eee1c5f60dcd610425baad975046.npy +03761084-b2ed63bc028b50096c3c8e8c91d35a17.npy +02691156-9378f4e9b3bc187e621c837076d6923a.npy +02958343-d014af11d76dbf667aaf79c2db0c7371.npy +04530566-3c52a65c90a604f36d41dce38b96c472.npy +02691156-584e076b6cee78addc3757fd1f4189a9.npy +03691459-28be6cc8685c68464aebea9384ce74e0.npy +04379243-90631514bc5dd234c798432661977bc1.npy +04225987-efdc98987203bafb183fac288c6ded1a.npy +03001627-1d1641362ad5a34ac3bd24f986301745.npy +03337140-b4194440c21b4db77a50afc9c93f8a50.npy +04090263-329f6414584d87a999b3da21343e5637.npy +04004475-d80d585502fcb9d3199f2eca998ded6d.npy +02828884-729650e08d4ddb97ed98cca8f0ccd5f7.npy +04401088-bcb8525b5aa7e4a5a62dc47412730fc9.npy +02808440-dea2eef8fa6690061031459726e7e8b9.npy +04090263-a8e3b605c0eb659e5f6c4107d78f2cc.npy +03636649-bb3f359cbcb046a8d24a4ba64e02f65e.npy +02958343-e7f40f595169f1b44a383db4764d5432.npy +04379243-fc3d08b88b00d95212610a4585592f3.npy +04530566-697c8a9055e5ff2ea7a62969e8bea32d.npy +03790512-6bf1f988493dc23752ee90e577613070.npy +02958343-1a64bf1e658652ddb11647ffa4306609.npy +02808440-1f3abd1016b4b39e4c62bee40dcdc539.npy +04225987-141616a00df67c351082f2ea630bf69e.npy +02942699-9d79c246317bbbe87f72d6c7f2024896.npy +04401088-46261b630244bdda533775ea6714a372.npy +04379243-7b9a5531e98308c8c3bd24f986301745.npy +04256520-75d58cb9ca1475f86f37a8be59c15bbb.npy +04256520-83f9051ae9fb1598cbf5d61bee02065.npy +02691156-77c86e12f27b2adff602d628e1c92113.npy +02924116-48a23d75d3bbdc1c8c6047ec67401af8.npy +04379243-6c322cbf532f87337c577fdb71c158.npy +04004475-68a0a6e41a0409ac77efed640f9b11b5.npy +04379243-904a4c3f1ecef5f852046ee916d15a12.npy +02992529-df2299185baf20a17b1546f309a98bd9.npy +04379243-649da94b45bafa807f8769b595aa12b0.npy +04379243-7937479e527b07dd19fb4103277a6b93.npy +04530566-e765446c37351a26850e00840470903a.npy +04090263-b0bfc504cf144baf2685de1ac73dc74a.npy +02691156-e1e7f3843b1fb876f5156bb441883fa.npy +04256520-4afee57f3134a483d9b53420a5458c53.npy +04401088-96b1d230e88cba16f71555c6480aef72.npy +02691156-52a84fea7c314f4c3dfc741b4df74043.npy +04460130-10312d9d07db5d9a4159aeb47682f2cb.npy +04256520-63e91cd73f169af037f251300f603b8c.npy +04379243-8c67fd5a15e8d9defebad4f49b26ec52.npy +03593526-bbaf380835e362d0de03ab2a27ba7531.npy +03001627-4446234d12158c42b161f36d4e309050.npy +04256520-c2f02274b4dd4431b4e7c0374e7ddf69.npy +03691459-40007a605a25c71d747b49524a1246e.npy +04401088-d944c42ad08401651e5d846d206adf3d.npy +04401088-36290375c3ff67b9fa391a6b067626b4.npy +04379243-387b1c9a2f50ec314b3c42e318f3affc.npy +04379243-a50fe14a700587304b7b1010fff3cd07.npy +03001627-21fb308ca737174e22f2f93459bd863e.npy +04256520-990adbf32c6452878eb3bc6c6d15f9bf.npy +04256520-dd78c16d85780d6b413102507b68bcb5.npy +03593526-44a5d28686a9b8c9182816640e3b1915.npy +03938244-2805a2c180bdebfa38071eaa0d0d49bf.npy +04379243-d8b547a164d2f356ff24b36f1450b61c.npy +03593526-e42b51de027eba748b9db7e7b88ffbb9.npy +04379243-7e85deaa7bd114eedcad73f240f03a20.npy +02808440-eaa7c4771b639fc554d7082b34825ef0.npy +04379243-5530f95795fce09ca71c812e027f94d9.npy +02876657-a429f8eb0c3e6a1e6ea2d79f658bbae7.npy +02828884-595e48c492a59d3029404a50338e24e7.npy +03636649-f97011a0bae2b4062d1c72b9dec4baa1.npy +02828884-db663d2bc7e398ad67a2f40ab335eb08.npy +02958343-312da43baca104262c98dffdf7adc4e3.npy +04401088-504c453471faee3ee304974abc9afad9.npy +03001627-94ae179dd1a1492d1191025061735ea3.npy +02691156-9a3cb94af2f2a5b826360e1e29a956c7.npy +03001627-539ddc43afec160e57b8f616df7adf9a.npy +03636649-28210d460a79e323322123314d92e1d.npy +02958343-a015b428cf628af3522dcdfaad316d22.npy +04256520-13534db5278d476d98e0d1738edd4f19.npy +02691156-9259906152f9d885a8cba409c4409ba9.npy +03636649-c6424950ca9447627d8864caa856253b.npy +02933112-d56ac97208393d54bc8967b0321bd9d2.npy +04090263-a32acd243e91fb32a59327b8ab7c01fd.npy +04460130-fd6ca820662bbbf3ba10616cfe5316d6.npy +02828884-33458d73568cfb62d201085e80edb26a.npy +04090263-c044bff4423c7889a2ee232a197081e.npy +02691156-8b72934186e1d8b0f510cd52a5f27547.npy +04379243-69e670c5a40a40ec9095fe1213108032.npy +02691156-3112ef52e6da5d6142320ab3b0c39c62.npy +03636649-c52af321a31d28a2e95e8a5faf311c2.npy +04379243-25c9cd32e5ec1e7cdf54d2cac06dae5f.npy +04468005-e02ea2b2d926095aeee40229e2e3ae1e.npy +02992529-3993102ecafa0826ffd1164158ab2e9f.npy +03691459-ac27fec4b0460b00318a4feb4ab5fd2b.npy +04379243-237e15796ba16d86e1b32bbe69d5bc15.npy +04256520-71e0e0315d718004e7c7920f6a65a54d.npy +03325088-16ea35ec6ba0c4a7b7a867e9b35a1295.npy +02747177-2f1aed8925147120c62ac18334863d36.npy +04090263-e892f50659fc9f8ad33dc284f29d8394.npy +02946921-a70947df1f1490c2a81ec39fd9664e9b.npy +03691459-421eb9597a33cffdfdd1073b17e9e51e.npy +03001627-8db4d399adc4d6148738e7290b6f3237.npy +04379243-75bb849ce0a252e72c1a544eca74c954.npy +04090263-b3e73818cd2e03c080149f7d680e9c1a.npy +03001627-20d01aedf15d4d1d23561140a396280f.npy +04379243-1a3cf7fca32910c4107b7172b5e0318e.npy +02691156-ca88882d06ee5468c34c40f49da8010e.npy +03642806-ed35ed3a7c8824e5996bace9c8deb982.npy +04256520-c35d42881295d9cb86debb0a33c851f8.npy +04379243-d4937d73a4602e66d9a65329a03d80e5.npy +04379243-379ad91ceb20859b0a3f25f5d8cb0f8.npy +03624134-d7cd204b24ccfc99baa86a06fa108e26.npy +02691156-6e25548ed9d2c7b597dec65c2238cb8a.npy +02992529-f400eb5421283e8a102f4912aece242b.npy +02958343-53c118280e60df0bd2350421a9405ba.npy +04090263-8e461cdfdb0536e1b5666ac9dae008e8.npy +02958343-2d1718bda87f59dc673ddeabdcc8c6e.npy +04090263-c5cfbac689f8f49310e71dd8027aa9c3.npy +04090263-5004ff6a719d0c16c52533855abed4c.npy +03001627-2f0bda4f2c225e0254141309938df7ee.npy +04379243-c0df578cee43eb8526f51cb1aef0ea9c.npy +03001627-330dfd669062043f5e60ee22a227533.npy +04379243-c8575754df874644dbbc9440457e303e.npy +02958343-9ee32f514a4ee4a043c34c097f2ab3af.npy +02958343-cdba926f41c3b1ce92dd8154d7e0933a.npy +03085013-6c3bcb83c57e430f584c9f4a9f37e15.npy +02691156-1f7a516fdf80dcdc1006ed55bc1a3fc.npy +04256520-97334ba30676598958f7bbfa65d864aa.npy +04379243-6efcaa530059319a720daf9b94e7a5a.npy +04256520-64800f14a795d8759055f83d11955109.npy +03001627-523269ef7703a120cf004563556ddb36.npy +04530566-82180d1a6a7edf815e585de41f56d4fd.npy +02808440-e3a0391e9fdb7671fdb7801f07fef3bd.npy +02992529-ab4ddf9e4130d6b560cc5a290ea3b31.npy +04379243-2943ee99465c7adf30bbd4cddd04c77b.npy +02691156-f21a375ca5fd26994fb6540b6bb872e9.npy +03211117-2d8a4b48acaf84d791bf924be509bc17.npy +03691459-b488f301cc8c7d0d4079257326eb1699.npy +03001627-3c81fab5678a3872327289c00b6dc9ca.npy +02691156-65468fa9ca2f3e9e642566c028df23cd.npy +02958343-4271d0c8cdad6a84e572d3df5e4fc85f.npy +04379243-683ca17c9b0d6c83f15d71fccc06917a.npy +04379243-2dedcb98bb6e9375aa2e219918fb41bc.npy +04379243-db3d26a5f2a99aec433eec73a2fff97a.npy +04090263-85eba152f5c367bdb3bf5cd8f4c141b8.npy +02828884-ce9c518ef76b4974d56cc378741d37e8.npy +02933112-de23f702d6e8232f12de5317fe5b354f.npy +03046257-7c62a7d42797a720a480742f4529182b.npy +04530566-12b5302a8aa697a138b0c448fc291f4a.npy +04379243-c7fb18d9ee7dc33318a6353ea60f11b6.npy +03325088-1216d075b84b3557979c556124bee033.npy +02691156-dfe65f8a20df11c5d1df55cbe0874aa.npy +04530566-6f8bb01950141f63b3e3c8d3ee0e8f52.npy +02871439-128a322c75bb43195050d6a2f5d42f74.npy +04379243-12cecbf8685f52aaad762904f2c09cd0.npy +02933112-d7762b2997bb9e2aa70a592d6c8c9234.npy +02933112-1b269019c7698355a8737fcf23389014.npy +04379243-210ad02f34db100c236f7a807f5aed3c.npy +04256520-b929ff628fee53d452f2ff843abfed75.npy +02808440-8bb8368541ec46f654d7082b34825ef0.npy +02933112-6aebdfb1622324617eee615e75bc3b77.npy +02933112-54c4eb19c59440128f7c4148465d43b6.npy +04379243-e13ea4661bd5e168e7fcbdad594ae05b.npy +04256520-1731d53ab8b8973973800789ccff9705.npy +04530566-5cf29e4dff6535c394eb4a27c704b88.npy +03001627-7139284dff5142d4593ebeeedbff73b.npy +03001627-2b69e899da0c15cfb40f0ac0fb9a650d.npy +02808440-3124505d1bab02cbb362845c6edb57fc.npy +04256520-cc906e84c1a985fe80db6871fa4b6f35.npy +04379243-fdc04ac9fe8dd6db04cb542e2c50eb4.npy +04379243-a7f98e26ccb27f0b52225a4689f7f600.npy +04379243-485516a2c88eb0b8b516c05d046e8e45.npy +03001627-ceb04c53d8aae1319fb4103277a6b93.npy +02992529-6710c7894efe94cb918f30c146a92bd0.npy +02924116-36c043dde81d976b9c331a603e039290.npy +04379243-42384087aab891baee18bc48b60b36b7.npy +02691156-c235f2c6d1e8c80e7f436bc8bb8973a3.npy +04090263-5aac06335039030132f8337ee2b84248.npy +02828884-9ceab93b37b71c47c62ba64662b2626d.npy +03085013-aaa82b33a0414ab6a374d341749045f5.npy +03790512-f5510d06aba5b0f683a3e53900c6cbba.npy +02828884-80b20fdbf1183f37b7491f8d3451cded.npy +04090263-94a724430f78e09bf0e835155cdd677d.npy +03642806-2ce3a50ca6087f30d8e007cc6755cce9.npy +03211117-58837198e067db4cde008fce66fdc56a.npy +04090263-27b6d2084f80ef3a7b7f00333604764a.npy +04256520-ac16057c9ab79f7f2c7685af80c3d87f.npy +02808440-9c66a619b577ae713321831d2245cf06.npy +04256520-e877f5881c54551a2665f68ebc337f05.npy +02691156-a36d00e2f7414043f2b0736dd4d8afe0.npy +02933112-2cfa88eb16cfd27b921dd903dd0b8b17.npy +04379243-7494fb1b493b36db2b3f122bf827792d.npy +04090263-b017d865b68cd1adb4cdad9a5bf52dd5.npy +04379243-41adf7a8d492a41ff12d7184a2ad3430.npy +03467517-1070208ea6a020b8782a47e264016477.npy +03001627-ecb57b01c7ff75cd416e7824059e108.npy +04530566-1b00e4c41b4195807e1c97634acf0214.npy +02691156-c0edd36fbf8d63fa35fc197bbabcd5bd.npy +04074963-7af8b6f6f78d0eddea30b1080420ecf9.npy +03046257-95603651d927cd6c36a36f8fd7d27134.npy +03636649-9fc3ddc511f4ef62dced62abd38a02b0.npy +02958343-b0945cdea946d1a363c65629bee30ef9.npy +02691156-a87adc4fb1229b7f6d0f2528dd6f85b9.npy +04379243-4c0e985f49767f90388021e2e5bfc1bf.npy +02958343-b1736379a44bc475352a2541f8b4515a.npy +02992529-8d55c1677626cc48214d974150b798e9.npy +04379243-d6acd7d7c9e0deaacc963bba1556032a.npy +04256520-aa41f9c1ea3647ef5dc3653f8341633a.npy +04379243-8ac4ba5328ac4f423a14972b15e80b93.npy +03211117-68944f7b386310c2515fc0d40df6c5c1.npy +03710193-34b80115a8b77c8c1647dbe61e0fcd1e.npy +03642806-4c7814676c42d67b902e12fe4da5924d.npy +02808440-51ec60c0a42d6b23911cae4661bfbfe1.npy +03691459-5ebf73b0ef33aac5451319990092e2bd.npy +04330267-50557c5a0d38b38920192a5319e3e2e4.npy +03325088-12e62ae56879bda8979c556124bee033.npy +03636649-4bb0f244d4abe00b44949d7685cb63ea.npy +03991062-6c2bb8a74adf58305a340b65638f743c.npy +03046257-52255064fb4396f1b129901f80d24b7b.npy +04256520-5319006bf5783b6919fb4103277a6b93.npy +04379243-c21637acf98dd08649bab4be538c970f.npy +02958343-c1b4d407168867c45dca6305fb9f97ca.npy +03085013-3ebc2b3e6235869fc7be8dc1ce3991c2.npy +04379243-2b4d9c4722bfc075ebeb8f91be624923.npy +03001627-388ffdd2dd3c0dc0780672cae8ec94c.npy +04530566-ab40191e935c415cef0a5cdc2cab422d.npy +04379243-6ce30b0327db26f340b4c5428883e585.npy +04379243-bc5d39edb7a6efd77b9bc6a8e1b90da7.npy +02958343-b67d3833e6991de8dd141480e2c154d3.npy +02871439-6003c51eee40d5942f84cb7932f866fd.npy +04090263-f90191dfe0bce3ad49f0e3dd7767881.npy +04530566-1b2a8980c17fdd97c897e89b561760b1.npy +04379243-46c3080551df8a62e8258fa1af480210.npy +03691459-28b91f5ca7e3d174fb0a4dd466ef3d66.npy +02933112-938d8ae0cdc787107bcb070cc655f13a.npy +02747177-a9cd539f8a5e19e06af350e51093426c.npy +03636649-12dd2b962777328551014c684c004c28.npy +02933112-22cc22fa33c8203ef1bd05634b542a1a.npy +04256520-6ec8a2dc3bae5a9b8b709c58c1c5ee96.npy +02958343-d1a54cb41a88702b1e8e2692714b2614.npy +03001627-13d4fceabfda96c0bff8d8db0f9298ac.npy +02871439-fcb0bf443c62225b4bd9e0690b0b191.npy +03948459-b86cc2e83384030d91e284193311f752.npy +04256520-d3c5ce89b20dafcc57ae08c3105b4e6a.npy +04554684-d4305fddf4c03812625f0e5788fbff74.npy +02958343-fffb1660a38af30ba4cf3601fb6b2442.npy +03636649-dd284c442afd361e37f2340db925336.npy +04090263-37cbf8e368b06b655e43a6efcaa57d09.npy +02691156-75916f78e72f90984b70ddbaea6e513.npy +04379243-a2405bb8642d5bcecce90f0d61ed7a70.npy +02808440-1dc8e88da760f186ccd0340812259a39.npy +04379243-4abe61d5f1f800b6c8d74856214be3b8.npy +02958343-c8c51e709d1cdbe0673ddeabdcc8c6e.npy +02691156-44836457aff60736e10e757961deca98.npy +04225987-8f78a26403f09b708b3b3a08d28a7d7c.npy +03636649-d4498a4ba89b9a0d4a73e364671ba824.npy +02691156-48c4b6bde824e987a8cba409c4409ba9.npy +04530566-ac8afdd8c70178abf0a977ae17a6b223.npy +03593526-82298657eaa980d323a295070ca176a0.npy +03797390-b6f30c63c946c286cf6897d8875cfd5e.npy +04379243-96edd3d807d2b1c7d1869c3a235ed163.npy +03928116-8c021db546a9248b582c9847073623b0.npy +02691156-251313501093a024599faef54fd54e83.npy +04379243-1f748bcf0ee8eea7da9c49a653a829eb.npy +03991062-1b39d7b69bee8a09a2c59a4d90e63212.npy +03211117-f7d209529e47778d7a39f8821ef8c382.npy +03624134-dce941899bcb752dfe474f09e3f3ac9a.npy +03636649-522bc10920249e67141c66e2b49d221.npy +03001627-4438e29f9d3cf45bfe52ffd0e748a1ab.npy +04379243-8c7a08d437dc8431369b4bd8c721a288.npy +04379243-dc13119307bb03338aaae3d020f5ddf8.npy +04554684-2010a39c4b0c58b714b35a7d7cea7130.npy +02958343-f7362613dfd3772faa69dfdc5532bb13.npy +03691459-9432e02e277a206e3fccb208b0350a.npy +03001627-2d6ec4afb0ef827e2c5b2f528cea9dd6.npy +03001627-5cb06ff2b420c24721711c78ff413696.npy +03636649-a17a7f72494b303abc5744a94c74a7b9.npy +04256520-75071b6962f431175becd8a4c3f1866.npy +02958343-b88a4c0cb2092fa52fa4ad29a1236d7.npy +02691156-324304121b61339bc36cfeafa51d54fc.npy +03636649-8425ceaafc6cdb0b159fbcda62e85465.npy +04090263-b449f16a0cbad90088be2a30dd556a09.npy +02808440-2e752b6c5b6c1cf865793e85eb09b261.npy +04090263-baa007b1a903fc432ce452abffb6910.npy +04379243-7084db2193bc9ee43d113b8340bd5029.npy +04379243-913c0ff011ad0658dcfcef693e7ec696.npy +02691156-40dc09d726aa6325ce2cec85ea6ae00d.npy +03761084-1674b409f2dda7774c86b1fdc94892eb.npy +04379243-c06f1cb96170e548b2c2cd006d206129.npy +03948459-2f50338488d6254c6460d209041b501.npy +03211117-f17247f450ab313489d3a03b2edae972.npy +02933112-6e765437962f4c578e51433393e177c0.npy +02958343-4b7f9ec47ede386222f104fd8dca95f6.npy +02958343-63959ab016687a50618e9d35559b7aa.npy +02818832-efdc740a363e1521a58e28eb06d46abc.npy +02691156-4a199b1c3c80c8823bfdf036d38c839b.npy +03642806-517de75577ac6e8a42b9615216f9a30d.npy +04401088-bf15900bf5afb946b35f223cefd97829.npy +04256520-be5f2498434ecf9a4b3c42e318f3affc.npy +04379243-5df14a5997ca80fee45ef4135c266a12.npy +02828884-6b05c22024088fa92056b4bd5d870b47.npy +02691156-5c379a118ec80927febd4e8b843c95aa.npy +02691156-7662fbb435dc1d0760bb9786c97a649e.npy +04379243-27a90972dfe64be5c3bd24f986301745.npy +03001627-fdc7f288b8c65494a7101992f797b6a.npy +03636649-4ffb03a364a13c376b41b8bcd0404ec.npy +04379243-724fa46215e03f4c52d9fc61873164a1.npy +03467517-eece2b501ee7563683ce694a1c6f6c51.npy +03928116-5e3aa6ba5934dfc6a9a82795b0444b1e.npy +03001627-49cbfde1ae92ee555706d1c54190f27a.npy +03001627-f3718bcd0e497868af7c7ad2549a1b15.npy +03642806-b962658596d9a6ccc05c2f3d0d461abf.npy +03991062-51a88bd35c6d7824eaea040a8e2015d2.npy +04090263-68432645acc0d554def607f4d4140edc.npy +04379243-d48ceb6fe098d078f0cfa7d27eaf1bef.npy +03001627-cacaca67988f6686f91663a74ccd2338.npy +03001627-d49ce68499ee980de6c5cd45aa112726.npy +04379243-dff9b5c37bedc55e9f011a37a96f51f.npy +04379243-cf52e17b21021ad9490ad276cd2af3a4.npy +02691156-f2fda88e9688fd81d972c9dd75ed77d4.npy +02958343-de0cbca344b9de834f36122a581b2941.npy +04090263-7bde81ebddddd161cba7035647fbacdf.npy +03624134-693c599683ba86a410240762b65ed973.npy +02828884-a064a3e9b537fd64818b16b10229b98.npy +04256520-ceb04c53d8aae1319fb4103277a6b93.npy +04256520-17555a8b1def80abce101336817a135f.npy +02691156-efc2f4eb92871bb2b7a641946dd77b16.npy +03001627-3a4d572dc16ac52e201e82f29479384c.npy +02946921-e928ebedb376404f8e5478c8425d418a.npy +04379243-79650ee83a0aabc8e1dbce34224f2394.npy +02691156-53958f924a50069090baeef8ba5b93e5.npy +02924116-f55c41a1f4dfe4e5a1c12b50998c10.npy +03624134-ebfb56c4968055e794581d435607029.npy +03467517-d4ec02d3ebae75249f4d0101328eae2.npy +04379243-89875a037902c0664bd9e0690b0b191.npy +02691156-a2b758aa5d51642bd32761b337f8b72a.npy +03636649-376c16f40c95e81429eb9d04ea723179.npy +03642806-be6a1fba2165bdfe2f81cb887dc35578.npy +03001627-200597e4eaf96015a4fb72f4f3b0e317.npy +03046257-729270762f381e7b1bd71c75e3a794e0.npy +04379243-a8126dbed61e760433ea3991d83e660a.npy +03467517-aebe041eaae1962921d62dae9ac1d30f.npy +03001627-ba074c9ff5e36f60e8b2b8dc0c816caf.npy +02958343-555a48617127033c25ad20bb66839d61.npy +02933112-85868e1440bec257a4bc7fdb4c84963.npy +03001627-45fa737cbfa8a8b69b75b6346baf0c12.npy +04401088-5cf5bbb8f745033195c9a4bc0e92777e.npy +04379243-1dffc3840500e89ab8e1b99345a5afd4.npy +04379243-394c63a5658ef759b515d1675be6b5d3.npy +02828884-433253d0d97f814025444614eab3fc33.npy +04379243-e92a4ff2b36cbf83490ad276cd2af3a4.npy +03001627-28a60e0e9adf7eb0a3340564b56a7f70.npy +03938244-cf2ab5d9bff184ca6325569942918d9f.npy +04256520-3aa613c06675d2a4dd94d3cfe79da065.npy +04074963-86982fe32e06c96b11eba86b475bafe7.npy +04530566-c96d837820b8fad281b4fce04c14eb91.npy +04379243-b4a66058027312c7ac51268fdb437a9e.npy +03001627-697cb70c54a483f1f80ff10f4838c137.npy +04379243-9e3514da2268557855931d119219022.npy +04090263-c4efdc79b1132dc6533df38649ea120.npy +03991062-f7e29e0b93652ea4b522742df2e8c383.npy +03691459-1e9032f25c5d068fa7a69b946cbafa2f.npy +03211117-241b26438e8523ee2846fa729d90e125.npy +02808440-ae8938fbd91ce8e0c790d7efcdfb5239.npy +04090263-f16eab54ab97a97c8cb82d02bad057b9.npy +02691156-1deb997079e0b3cd6c1cd53dbc9f7b8e.npy +04530566-fcf21e1176459664806b90e3f08c9a28.npy +04379243-8aa73d4e62b33e8787e41ecbc4197db.npy +02691156-12c82319147385e7ef0e1705c5c9e361.npy +02958343-bf1893badd1c6bef59a47b1880958de9.npy +02924116-30c34a579410bbf2102055801a18154b.npy +04530566-e2446b9f4b9fb179f525bb02d30fbbfe.npy +02828884-7cbde340db4f4ee2cb2a965e75be701c.npy +04379243-392315d4bc7f11f0ca67acef5667509c.npy +02958343-cfac6b6374bc4fedeb7780cdb3ece367.npy +02933112-942e67160b47dee1b27fe5b4f7a28eec.npy +02691156-8448475504ba9fdeca8607f540cc62ba.npy +02992529-ed9149921b734b2941edb96d309c9a23.npy +02958343-5ce9ef613933a245538f2c6e5c51cc7e.npy +03991062-f294c6f54167f608f5c37fe197319e1.npy +04379243-3083f8a34c6a2087a538396439009b89.npy +02958343-a8f7a7271a02fd56afe1d4530f4c6e24.npy +02958343-fa37419c844e77076489e70b7c61a054.npy +02958343-8d14c94dd325400d93b973d059f27e65.npy +04379243-bfd91773d0b2a32fd39e33fed94f56ef.npy +02958343-e673f203b40ef869567880160b3acb12.npy +04379243-ecd56b7b86c4d94ad1f278e1513f3b7.npy +04379243-a871ec9aeea7cc5ccb5cb7e88a8b34ae.npy +02958343-d224a01422266fc51b3c1c9f0ad4025.npy +02691156-1d396e76ecfd973575ffe5b08493cffc.npy +02958343-cd2ac3225eb36c0e1a04a94f2d5fba0a.npy +04379243-441bfde4486fb4cfc3bd24f986301745.npy +04530566-d65fc1dbe7fe802a5761a0b53ed37cec.npy +02871439-aa0c28ead04591cf85e5aa3b80e9875d.npy +04468005-ab084adb3157a8d44b0b2e6e63122009.npy +02924116-134537791c7e420180288501d9901d7b.npy +03991062-289ae5a92b072ffcfa34c1a2d1bce0e.npy +03642806-b6b27929b34cec44125129881929616c.npy +03001627-8c629a89e570c8776a9cd58b3a6e8ee5.npy +02691156-ec879d7360572a5db65bd29086fc2a67.npy +03691459-55e68ac8c812b332ce1db673cf70420f.npy +04379243-2d466533183daaf027cdc3d721fe0086.npy +04225987-47bb28c62a245621ad3e04762b7c31c.npy +02691156-1d6afc44b053ab07941d71475449eb25.npy +02691156-3998242c3442e04265e04abc9923b374.npy +02933112-247dfd279585b1b0c59350d819542ec7.npy +02828884-63a218005fa1bee7fd313061a14ce51c.npy +04090263-2d0eeaae7231064af4de29b99f103946.npy +03691459-bb1b387c674fdc4750577cf04f3bf74a.npy +04090263-2036799fd4fa273918ffe448c7d16fdf.npy +03636649-ab3e153cd23e992b576a354bb9319732.npy +02992529-758b9da6bf573838d214322c26aa0cfd.npy +02828884-c064a0ebde53de5ad5067eac75a07f7.npy +02773838-4e4fcfffec161ecaed13f430b2941481.npy +02958343-2b800f158324986ab6f657757c95f74e.npy +03691459-47d3fbf37d73e0bfb9b1918ad0534ba6.npy +02958343-846e6c678f53bf422e877e82c90c24d.npy +03928116-c7ab660e1fde9bb48ce2930380f4c6e7.npy +02933112-736e810b71d009bbd40c07d3c15cc681.npy +04090263-fb62b780ab54dbaab20f6e48f6a30cbf.npy +04256520-d6f95d8ef06e6db3ba0604df5d71bead.npy +04379243-5261950cc1cc0d2a9ccce4c6d5bb195f.npy +04330267-2de24aec04fa960a5eb64c1003065596.npy +02933112-56e1f35c70ad2859c59350d819542ec7.npy +03636649-169ee245f8ae927f5dc3653f8341633a.npy +04379243-ab10c2ec41e0e7f1391e4d6c585a697a.npy +03797390-e94e46bc5833f2f5e57b873e4f3ef3a4.npy +04090263-5a64d7b0677ea932d08e423afb7a8cd2.npy +03636649-4cf4ca85d2685b9b98d5fc0473d00a1c.npy +03211117-2a2369e8b0a139f67230cc2111ecdc77.npy +04379243-5353ec05576ed7c0aa7cb30470f3273c.npy +04379243-f98b9036a56fae4626da964cc0cf44a4.npy +02924116-7290270e8dc33f5bef54591980b8a426.npy +02691156-5a4c3f3af30e42e057891d676f728bc0.npy +04379243-e2ccba151d9fee85a71c812e027f94d9.npy +03046257-eb1bfa668da64d48beb12355e9e20a98.npy +04468005-b46cc19663effd52c6a67affe9c25b21.npy +02924116-6f4317ada701853d76c2a9de5c96f76.npy +04401088-72d3c4148500a7fe1bf02ad5664135fe.npy +03624134-820138b6742e713ddaf44b37a13dc4d9.npy +02691156-ac463974cee5a8867bd1a5c452e6bb5f.npy +04330267-3ea1ace396f6ccae48407a54b1fbfda8.npy +03001627-fe8b246b47321320c3bd24f986301745.npy +03636649-20cd92a6797a9ee12ebeb1e6a8111f53.npy +03948459-6dbc7eb805ad5830bb1cd7e49c28b731.npy +02828884-210ca657d9a1b85cb2a965e75be701c.npy +02801938-acfe521c412fcd04564c0afd61663476.npy +02691156-391b9c5bb875607c19ba010ddb4974fe.npy +03948459-990a4cb8e20177dad957eaf7f4edb205.npy +03001627-672a6459e7606b23532a8e162f399205.npy +02828884-c7fb65bd3bd09a852056b4bd5d870b47.npy +03691459-ebbb434aba6d7c271ad88f716ea80910.npy +03211117-c201c9ddb8493c15c3b69089417dba57.npy +03928116-ab86f892d8efc2f263920080bd2c2ed3.npy +04090263-ea4247ef739736199f433921788191f3.npy +04530566-9262aa413df7b369d735fa1ab17311ec.npy +02933112-148180c71c8ad4e3a1bfe809f99d2951.npy +02691156-297316f1c8a6f59bd007e7980e2b01ba.npy +04379243-fc8e92ecfc4a39a47149dc6ae5708157.npy +04379243-9ee885f08e0dd5273d154a49485f64f1.npy +02691156-14bf5197d60d733f2a3ecc4a9713cabb.npy +02691156-c85079e83e463fac65f50257ecdfa5c7.npy +02691156-41abfb4a9e8071754a40844f179aeca9.npy +03691459-573a662d56db6a9d1ad88f716ea80910.npy +04379243-7b8c92d0202211d53d098fcb46b95c.npy +02946921-9effd38015b7e5ecc34b900bb2492e.npy +02958343-9cd875a215c8806731b76be6623555e0.npy +04256520-8a4e1f7cc3bb76da9c9245e96a55cc5.npy +04379243-f96c029d342f72d6ae59128002f89f91.npy +03691459-afb32fcdbc6716b2fb14bc0c4e180ab9.npy +03467517-8a212984c1175c8fe2b49d4be00c74da.npy +02691156-41dca8046b0edc8f26360e1e29a956c7.npy +02691156-be11ce096084bd784f95630cc18536e0.npy +02958343-189c2b53ef76d02978a20fe14185667.npy +02933112-bbc516fd63703eee9dfa717f86ba8028.npy +04256520-a8418bfeae7c4cffaf802a9d0ab09410.npy +04530566-2ca06dc9165d4cdf5fbe3e7e4d41e98c.npy +03001627-3dac0fd995c747ab336e8bf2357c029a.npy +02933112-94b497f0a8606eb96dc1f81f95db52d6.npy +04379243-8627071fef9f1ccfc79fd92a0bf07e20.npy +03691459-35fa721c71ae04c1472cc88b92e0d72c.npy +04401088-baafe1add38af23a5f0b5b54dbc4f35c.npy +03001627-865551d21a4b2c09ad484915511ccff6.npy +02691156-1887d7e3ec69fe06a5cac89017eae8d1.npy +02933112-aba010c771d153069c7285ae7854d4b4.npy +04379243-2a34205ffef345d13002761e7a3ba3bd.npy +04256520-b6e744f896a202c119fb4103277a6b93.npy +04379243-fc731e1489031acbe02c30c9027468fb.npy +03001627-7dfdfe28e3d25a0d19fb4103277a6b93.npy +03001627-76de2f91710e9bd85f31725202dd5bbc.npy +04468005-861e13b787eacc236568be7ac7858e63.npy +03691459-c3d845c1fe644b39b6ab6d583025c7a1.npy +03001627-61b76525022f44fa9f2fd5a6f642de3d.npy +03001627-40e603e93818760fa7e431436fa7573e.npy +04379243-66bda56e82bf90a677ceee024ab73ab7.npy +03642806-d7e7e6651a23afc68ba4e518219eb66a.npy +04379243-8c68ea99b5de38d3a6d7a9f3c5f7bb41.npy +04379243-92aab082da6375cf5b9744d121bf802.npy +04379243-ab04df0d02dd6126c183308b9aafe2ca.npy +04256520-8f784e9c1bcf3f04225230e9f2d3c8a7.npy +02747177-b6833a66eedf457af155d75bbf62b80.npy +03467517-7027bc171baae1d663e148e250c0340d.npy +04379243-2eb4a0d015b80a8d9ccce4c6d5bb195f.npy +04468005-e14470a10179d300e810c01b1498aa2b.npy +02843684-11dc4e10ef6e592f1aab8791875b3551.npy +04090263-d27b357966e47647f8fb6cb99631d97.npy +03001627-d761518bcbcefa4080067e3fdc6db24c.npy +02933112-13d5f9d6a7464e39f0f01f1432a517c3.npy +02933112-de30133b2550826647d37c7945792fff.npy +04401088-c1ae3b758aa9ea5e6dba92a4e2177102.npy +03467517-5d629c65f490d33063e148e250c0340d.npy +03636649-e365a641480635d330c09d86acf3d5c1.npy +03467517-5715a289185f284dfe12fc760976ec8.npy +03001627-44875441fe578186d35ac2e5000061ec.npy +04379243-5db63af675507081118ddfdb81cc6068.npy +03624134-ce57682fdc1209731395331ebe4786cd.npy +03001627-8d983a0adc059082b300c4ca2f51c01b.npy +03211117-586b4ef8eb5a59b39bd9aec93599c5cd.npy +02924116-9ec180fe80e8d0d46bf1727fa78b974d.npy +02958343-e4bc9cf3aaff441f19d740e0f6a9a113.npy +02691156-67636e7d15d082089412a62cd6b1bf5.npy +02747177-200b3f3d859c8677ad5067eac75a07f7.npy +04401088-c06c6362fc6d1c9c5677057f93c3c270.npy +03636649-2ed7e410931f984cd59517820ada1bea.npy +03001627-f3f0238ae8d9ba8dc8687ff9b0b4e4ac.npy +03001627-c07c96f19ea1d431d4f67da0de6a1054.npy +03642806-9c6176af3ee3918d6140d56bf601ecf2.npy +04379243-fa6952fbf7f52682aece045e8bdac80f.npy +04256520-89ce842fbc7c786d2d19175e7d19b7cb.npy +04530566-254f1c0cf13108c46c63b8b48495261a.npy +03636649-a0e4661a3c458405899bad344dc01f2f.npy +03001627-de3e082195346ca419fb4103277a6b93.npy +03001627-f1c390f2a04d13f6742728b30848ed03.npy +04379243-da9ae22db57775cf67cda8f7f78d0d19.npy +02828884-cbe802da10dcae19f155d75bbf62b80.npy +04256520-9484665b03423168fd1e5a951c425f11.npy +04090263-5341d156f8af28966a52e97955091b6d.npy +02691156-675a2332a973401f6376dff6c42ab2c2.npy +04379243-3de49fd2e80f8c95c97cfc3e8a6b1d16.npy +03948459-56a293cf1103aae4c6e34b38e9a5066c.npy +04256520-6971254cdae82dccfebad4f49b26ec52.npy +04530566-fada91842e68dac015ebc00dd3588bef.npy +03691459-7e63f06b3c48fadfd6d49cce41472b6e.npy +02958343-d3d121f2e2d57b5cc5903e2355330295.npy +03001627-6f8ce08e77bc27cedb4331c656714a1b.npy +03691459-be2df150c86b57d2c9db3276cf490d3d.npy +04530566-6c1c628f4ff60addc5b0cf694baa734f.npy +02876657-abe3a232d973941d49a3c1009fa79820.npy +02958343-819b98c138192c88e5e79d9024e2fcae.npy +04379243-d26f2c85a4aafa72db6f3ca49e992ad8.npy +03991062-e53e623e49b97bbd72652f4081ec5a77.npy +02808440-cb4d05a8749093ae3321831d2245cf06.npy +02933112-68220c134171d105f0fb3e3d2a0d34c9.npy +03001627-90c8ae65e3ec4ef119fb4103277a6b93.npy +04379243-4f8ea79100a324b77445d25f394949d0.npy +04379243-f4fb644d5c81e60e1a1485fc0329e88d.npy +03211117-48f2b6c3c82635c119609759f8339ed9.npy +03467517-a19fe6a94d0c6d2c56d301ea6c7f3155.npy +03325088-2f46e4d513207150b362845c6edb57fc.npy +03691459-50b1f4e5a130dafbb5b1048c702c9b77.npy +02828884-6df5b51b250a823b147d36b9f2f13116.npy +02691156-8c0c8307c5de1b65ac96c03d6280efb7.npy +04530566-a4d9445d191c80a235a6b421c152ac60.npy +04468005-858da2187b0dec8152470de2774d6099.npy +02933112-a8725dd0e0eb8d7d492d9da2668ec34c.npy +04530566-27e9a27b6e3b49c227ac692756be9e24.npy +02946921-ebcbb82d158d68441f4c1c50f6e9b74e.npy +04379243-9c09df47d2aca46ed6f21f7a864a309e.npy +03325088-ba9606bd6aaf2f0a50da8b99982a3057.npy +02691156-1b171503b1d0a074bc0909d98a1ff2b4.npy +03211117-181bc7c78185f30516a6c448fcdff967.npy +03938244-e973f4a81707004ef2197da8dec8488d.npy +03001627-2773ae187d1e9d3d504721639e19f609.npy +03001627-342d41101756553eb3ad032acba61b79.npy +04256520-4b24bbd3cb03206b58db0ef36af1d3c5.npy +03636649-2e583ea74f46aee239b3360f500ac52a.npy +02933112-8928e0f1fdd7f107f975e70a1bde427d.npy +04379243-34ba7b78ffcf0b46d30ffa15d9c1eeb4.npy +02933112-8ddd7f1e19ff809abe81a9109a782712.npy +03691459-c91f926711d5e8261d485f425cc21556.npy +02691156-440ac1b4ac3cbe114c3a35cee92bb95b.npy +02691156-d615a8217b70af06bc0909d98a1ff2b4.npy +02691156-70295db03521e219a5be3c7b80fdc3d.npy +04256520-a73a49fd2887a030f51f77a6d7299806.npy +02691156-b72804a8bd3dbbaca8607f540cc62ba.npy +04379243-5f3fd62e285aeaae4e2090b842effe89.npy +03001627-b8af96d9c542e1bab34e8f502d7c7e1a.npy +04379243-ad139879f97c141e1ac9af6c714d1419.npy +04468005-fb26c97b4f84fe5aafe1d4530f4c6e24.npy +03691459-dd57cef71e09d11121572f6a2d968d88.npy +04379243-6fa34794adb6acde24dca86ff4e91ac2.npy +02992529-73b87e2025cfdb6daf19fa8e8218bf64.npy +04256520-3d297a9092136d914038d588fd1342f.npy +02958343-2668f2d9b8a2daad95551e0d9e50cb0d.npy +04256520-4538a9c622fc554dc048a125b47d14c9.npy +03001627-b8eaa2fca64d7e4da52ed1964df255d7.npy +02818832-cecc7a6677eab8accf9f37ec17841254.npy +04090263-ee4ccd4b40db28e2eb068a83f75a6c3d.npy +03211117-dbc61cbed5f7f2b33c1abb78f1519c49.npy +04530566-731b8fb370639bec2c8b4a1ac32beb2d.npy +03325088-3a86bbcb33d39bc72636ff7d41908032.npy +04401088-9e98174951026624164c8c77555f8e1f.npy +03001627-7facccfa81369078a8930422448288ea.npy +02691156-7526757d0fdf8acc14f1e6f4f4f49b.npy +02828884-95eed587c3728d22601104cd2d998272.npy +04379243-6ae77e7aa510e044c955e5ed03ef3a2f.npy +04090263-f30464cf9aef3abea7f9996575f1f5f7.npy +04379243-2b40fbee96b93a5eae25f6fe802a8997.npy +03991062-f4e2f7d4ba0f8af8c7c88564709ab8d9.npy +04379243-c927a92a2ce0be7030bbd4cddd04c77b.npy +03593526-a263bb1f29feb8354dc11e421397c795.npy +03261776-b14f3ad3044ae1545f16c469ffeb982e.npy +03593526-c067e10ee057104abd16d4490a10a752.npy +04090263-9b0867286d296d3934057837e526fb02.npy +04256520-37b94e004ee1f7847c63c1e5173c47a8.npy +03001627-287413404880403751e5a8425285015a.npy +03211117-898073ee0a493fed4c58a7782e1dd690.npy +03325088-3cace6ee49f5bfb0b362845c6edb57fc.npy +04256520-fc7b96235eef479075becd8a4c3f1866.npy +02933112-931fcaa08876700e788f926f4d51e733.npy +03001627-cdc2a53559d3db78febad4f49b26ec52.npy +03001627-66aea803dc4a6c5390907a4c1a185a7.npy +04530566-7be86a514fd217dbc91817453f80389d.npy +03991062-af689238ec306deecb2a965e75be701c.npy +03001627-3e34987bd5e7cf0e6c5cd45aa112726.npy +04256520-a00bdbddfe3511208dd711af5650bdcf.npy +03467517-6f480a2f23eebe9b552ddced979ec9be.npy +04090263-1fa2cbd03c1d57829f7e0a8a6309376.npy +03046257-8944ac6e4a7ee7d1e47b5004844debd8.npy +02958343-20e01ed9c14d4659e61b9ff60b1be412.npy +03207941-2666ea267824515b6a047293eefdd617.npy +02958343-df1d1694cb98584cc23e2024862e7f3.npy +04090263-8c43f0fb829887f972cad024c77ecfb1.npy +03211117-14a02f4475a5df5e337758c9d9c83ebe.npy +02933112-68bc79caeaf162a7ce5d6e9371bb5c33.npy +02828884-bd40921448838cbcb2a965e75be701c.npy +04379243-78a144a7c0f60dde744107c67e903f9a.npy +04379243-91763ac2faf129e9b35bd41c666704ac.npy +03001627-3026908df3400c1a11d9b84664f8595c.npy +04256520-ee7ffc0b1cead515b2cf0fffc23ad5.npy +03636649-4bd69765d13c26ee29a42a0444436860.npy +03001627-6e1e73e14637a28da1c367d7a459a9b7.npy +03001627-22ff2267856b5d369158e0f216b27548.npy +02880940-80608e58db79d4d83b722c86abee0751.npy +04256520-77a5f44875119a6b5369e32fb818f337.npy +03691459-a288498f21acdedb2a65278501cfbe7.npy +04090263-10cc9af8877d795c93c9577cd4b35faa.npy +04401088-4cbd57cc8e6aef9f2ed91d160fd4ae97.npy +04379243-4d5362a8446fbc8f8cbb8bac2032149c.npy +02843684-f04ba261ea073ef9390cc49064ed7b4d.npy +04379243-f6c5bf92d03a93e247839bae1bc65257.npy +02691156-8ddc3bfd5a86d4be2e7c68eb5d1b9123.npy +03001627-2ca6d10b1ba99fbd9784ddd96453bcc2.npy +04090263-61796c118778fbddd0bc9224a67ebcda.npy +04379243-11cf833ad0f8ddc1a6f925961cc8367b.npy +03636649-13daa0657f5c3e32cb0c0d433974e32b.npy +04379243-7b5b7bfa8580e913e2580b23e60e4674.npy +04379243-51fd921d3703b86381289b3cbd650b9d.npy +04379243-be025ee89a077c31a9bdc22a1e02e82.npy +03001627-d7ea1356ef7664e2ad5067eac75a07f7.npy +03207941-cb469755f7d9e486abb564bb0657e0d6.npy +02691156-be92048655bc5b001d4c061b53288f62.npy +03001627-786c20111b691c152b4875f731f71cd.npy +03691459-c94dfdebffb371022b75817a0faaa5a0.npy +04379243-b60145d7ace5fb53aa7cb30470f3273c.npy +02691156-2229bc4e646f506679f56e78e8640bfb.npy +02958343-39279457a4bc87285e717a211c863fc6.npy +03636649-c080aefc6cbff8c81185ac82ed4da80d.npy +04379243-285857e7d12f1b74a4d2a71d4ca57f99.npy +03636649-d6ae7a5542800519fcb8d8c6d4df8143.npy +04379243-6f1594512b88901798fc1d0403f6ad0.npy +03001627-9f212a5127b4544bbe3ca6e34dba44de.npy +03642806-3b9a99663babc301e2ce1e6d2467cb03.npy +04256520-de2bb45b7e200d6916d102513d0383c0.npy +03001627-6e1dd008531f95fc707cdefe012d0353.npy +02924116-b7dd213f86614a464a166e19dc7bdc6b.npy +04256520-7ae657b39aa2be68ccd1bcd57588acf8.npy +02958343-ff267b1a6d986426c6df82b90873315e.npy +02876657-898101350771ff942ae40d06128938a1.npy +04379243-7c7434a9db4a407a2b151d8b52c53b90.npy +03325088-a159b9589f58872c4170d40a78a51640.npy +03001627-3b4292989394ba62f51f77a6d7299806.npy +03642806-342150823878f1ec9aeacfc2a1a52243.npy +04256520-9df9d1c02e9013e7ef10d8e00e9d279c.npy +04379243-7f837553c70b2a63684b7bc3f8a9aa55.npy +02828884-8a03039b614b41b319fb4103277a6b93.npy +03593526-ffd399fabbe3c6268798e1381538cb0b.npy +03325088-1fa06b97a0498b3ebb201909fefe7321.npy +04004475-598ef206ffbed1476307a98defed0dd2.npy +02958343-2521a90182ccc29c253c03b7df20edd5.npy +02871439-f081b7f255aed00053d040168a517ac7.npy +02958343-f34c03711c3fc44ac10e9d4ee4bae4f4.npy +04379243-5430799502754b5691fcddfa9c1209c7.npy +04554684-33d3f4a7b2df861248bfbf0a3bc453a5.npy +02691156-542a1e7f0009339aa813ec663952445c.npy +04090263-460ad09b269895f73f82da5dbc1a5004.npy +04256520-75b57fc1eb40d27114e19520b26970dc.npy +02871439-e7e3aacb7ef4ef00f11caac3db6956bf.npy +02691156-362af793b1d0084423fc69eefd95e6d3.npy +02808440-bdfb4d590b4810f38d90c09521490a5e.npy +03691459-2dd5a69034a03d267aec59a4d1722658.npy +02691156-fca40e8cba1e5fd75bba9363f40680af.npy +04090263-1e57dbf3e917e55c25ef5089f95ac09e.npy +02773838-3077a9b76724b6d35de21284bb515a83.npy +03636649-fd8f9cb134743e0c80bcdfbddc82df7a.npy +02933112-ce85ce0eb106d409b8a453d61eaf046c.npy +03636649-990aa9dec2223f108bad9bd0c4ab8e3c.npy +04379243-9d90a58677e619f94b8710a3469971b1.npy +02958343-4f17af1ca7ae689d409b2c4484d833cc.npy +04530566-79803d0a02bbdc93ff790997f2048517.npy +02691156-ed95d9219432bbdbbf3143b1cb6076a.npy +03948459-6aae44dd39fb9476f059c10da31213ea.npy +03001627-d6579d7c278cb9a47f093285855bdfd7.npy +04379243-972ff7998554988ae6c5cd45aa112726.npy +02691156-af71e72822241808a8ab13c300600dba.npy +03636649-466af3262bb31094c35131da26f8061a.npy +04256520-a47c0cddeb15490cca68d7e2f215cb19.npy +03001627-a7b82d009e29bafe705fef512417e4c9.npy +04090263-152f03b7d3eb03c8276c3d558130f8b4.npy +02828884-4ec290c73990a82aad5067eac75a07f7.npy +02958343-6a23da6a9ab0771caa69dfdc5532bb13.npy +02933112-33445d9d7f166d6c5588a2543ef0b0b4.npy +03001627-619a795a84e2566ac22e965981351403.npy +03337140-9864a3d01b9627e94c3aee8e9d3a6ffa.npy +04004475-4641b207d1190937fbe68c7a7c2ae4b.npy +02876657-a34966853ab2272ab2047d3072d5e051.npy +03211117-52a7f3e36d09848ca63c1bd05197cc.npy +03691459-3972d44065257859c0b45c582c6ed736.npy +02691156-bbd1b96d77b8dc08b96212c8f6cd06e.npy +04379243-3f843409e853828803734eb00d01e20.npy +03046257-57df2e218911273d68661782af60b711.npy +04530566-ad8623ad47d72317eda0f8d4b3ce03d.npy +02828884-135765739f0cb969f155d75bbf62b80.npy +02773838-dc52131684ed9cbbfe4a8257a424ee86.npy +04379243-e9a1325245afff7c405d9b5bb7b18be5.npy +02876657-63f60daa8d254f445200bdb78a83bb9b.npy +02924116-b70e1062c67b159367f73e2a1cdb19c9.npy +02691156-67217ee1bb8443c8316b8b2265213f7a.npy +04379243-d2b7b34e176262513521fe8ac6222005.npy +03636649-27436a813a1abe835836c728d324152.npy +04379243-ba68b45f1cc9038abeedb4c8fd29e2d1.npy +04256520-cf651d12e2048e1a4b3c42e318f3affc.npy +03636649-a1a8616e38e5f684fcb8d8c6d4df8143.npy +03636649-e9b1b74a44465b8b192ae1372f64f330.npy +04256520-bf28dd5d38900b1314038d588fd1342f.npy +02691156-7a3392340af9ec7b62b600da24e0965.npy +02924116-4df2284d70a36be2dc033f2a4b1df7ba.npy +04379243-6fd5741bbf559e0ff51f77a6d7299806.npy +02933112-92ef2c5091a97df18a6e1efe1f5fc0a3.npy +03046257-abbde103685802186e71174964d90e49.npy +04401088-1c3795fd5c4c0a3c2efb70bd2c052734.npy +04468005-d2eb4582107f4d8b929629f626be0dd8.npy +02691156-87fb26b8e56d25f2b87697d3904b168b.npy +04256520-4cd14d58eff772da946789884353d9f6.npy +03928116-b170bbec8f10e7ba5a64dd604e7f66d9.npy +04530566-a3109a4b09953b5e2b141dc6bd7c4bce.npy +03001627-63ac45ba2c2231d155f9a00acc25f137.npy +04379243-bfcd5d38663fd5338738e7290b6f3237.npy +03761084-6888d8702b758476fc350be62d126bad.npy +04256520-81c3f54ae8f5c434970d4dd67731c543.npy +04530566-d7fe3d95cde66115874f0e42f84eb4f5.npy +03642806-b272eb1541844f55ad7b15cd0061e5ee.npy +03001627-1d99f74a7903b34bd56bda2fb2008f9d.npy +04256520-5015912352daa0113e2f5d8f8875fba6.npy +03001627-c5abc457162ec704bfffd5d6a62e360c.npy +04401088-68b80d0086322ea33615136d92a66ba2.npy +02933112-953f545f33716fd01d860ee2ad2a42e1.npy +03636649-b82e5c6e1133aafedf6cfab91d65bb91.npy +04401088-ae7b93f3ea4238712f20ec3aefa0fb91.npy +03636649-2f972bfe152e4c23f36ea1eb6542fe7e.npy +03636649-15238270f4f59a011b17743c18fb63dc.npy +03691459-a1f0c93f000051c7f1aca3fcb64b7fb2.npy +04379243-2a5618e34de3e26a20768660cf080d12.npy +04379243-5b2fcf551345b64bf3412e3273fc1682.npy +04379243-4d2f7c689e77df6b6dc1766995c17a41.npy +04090263-851afe676885dd1dd5c93d34ff51959.npy +02992529-cea8f15682797fe6eb386a4e845c05f5.npy +04401088-1727e7aeb3d159a57f521a3dcd28e9d2.npy +04379243-610709315a0f542552b3505ff8f3d685.npy +02992529-996fd7ccc0567c3c6b2ba76eab0d2b1c.npy +02828884-32fe3c383ab3687c94c13f8f78a6d62.npy +04090263-8d65e71e5f925fac58dc97820d1d9537.npy +02818832-5f9dd5306ad6b3539867b7eda2e4d345.npy +04379243-2391f652acdb73dbe958df2e8332e31c.npy +02958343-5316fab78a6732f0428df271ebc70bc0.npy +04379243-b82e068c2c18cd67b09f0ca9c143fdfd.npy +04460130-7f38c8033cc2f0854d423544e7c5cb27.npy +03691459-a543d9e58d4501422a9eb0f146e94477.npy +03001627-f2934658407472a92ce025aebfea84a4.npy +04256520-4991f4fe771cae7f18b14db3b83de9ff.npy +02924116-38213f1b26479fe87586f47a860969f6.npy +02691156-1954754c791e4571873ec74c119307b9.npy +02924116-3e9d38a3fce2070312aee40928395cf.npy +03001627-cbc9014bb6ce3d902ff834514c92e8fd.npy +02691156-4653be69e215a1a4b378822897b79a81.npy +04379243-678f7fe1c4f977927e9fb8aa5670f37.npy +03001627-7dc902a12843fa60e84c9243a4e577f.npy +02747177-6d1aacdd49c4bac781faebbdea6bd9be.npy +03211117-9cdad8b178d7743326782c9200ca97fc.npy +02691156-6c36b0f84118a75cf9c41a0805a0d953.npy +03001627-6e12481d3158dd4e8f8c11a24c52ebb.npy +04530566-bb79e21e85306ba19e51f6d13f6d609a.npy +04379243-db49ebac740bdb91d016fde69633b7dc.npy +04379243-c26dfd3453d81bf7788eb1f5e7ba6e7b.npy +02843684-65b9d72427e109fa1d531071e42cd4e.npy +04090263-82c241396ddd0232b3f2a90d50e9caaf.npy +02992529-2d26f853e710b3e894088ff49a6baac4.npy +04090263-da421715af11fdb4beac07ad11d3663a.npy +03691459-bc6dd957c20a08f67b440c5df8efc309.npy +02933112-9fbb34244e00b2a9eacb155f400b9076.npy +03001627-bf52432c9b1b5e11f98c0761af40e04.npy +02958343-ff564f7ec327ed83391a2a133df993ee.npy +03001627-7a712ca74183d8c235836c728d324152.npy +03001627-3aa228edd648d1e1f51f77a6d7299806.npy +02958343-2ec9a7479a8ece30ebe23ea7d95f2a30.npy +03691459-4e6e05676ac77f30ce029fab54b6cfbd.npy +02691156-6ea4e68428cba49f68557927e45c29cd.npy +04379243-5407f938370ffd34390dcdc075aa60c5.npy +03001627-19e2321df1141bf3b76e29c9c43bc7aa.npy +04401088-420138dffb14f929f0b45b4b4c7e33b7.npy +03001627-cf04f5b16aba20e3e3849910c5019154.npy +03991062-23dd0031ba0db00d1a08ef511bce5615.npy +03001627-31dad882e67008adab1b53c63e6e87b3.npy +03001627-77105ec0251d92a8ba13aa51cc141639.npy +03001627-75a2cfe5b82e03d2fb0eb7e753c06942.npy +03636649-eee7062babab62aa8930422448288ea.npy +04379243-3adaf5ec2c9fa6fef7248d9dbed7a7b8.npy +03211117-31f6f2b4bb6c524cab1a5567c60e2688.npy +03513137-a50fdcc3128ca95c663e90eaf6b4ca52.npy +04256520-8fd43f2955e4d397b822d48a43773c62.npy +04530566-567e385bc5c40247e414f982f9c422f7.npy +02691156-2af04ef09d49221b85e5214b0d6a7.npy +04379243-b1cb375e7f3fe171c242632b2a8c3129.npy +03001627-5ea01d852c88e30a6f2222642bd41c09.npy +03467517-cda7995e00026129e33462de7b4c569b.npy +03211117-54f5393846bbdc64e34e21eb7fabb319.npy +03691459-6abdfb1ca4d076a09c4dd878242c44b7.npy +04379243-abb8d6d056f48eccb8015e57f308c60.npy +04530566-e6fa4d02d2df5a9b1bb46d2556ba67d.npy +02808440-752f091bd4264d2fce772b67783de9cb.npy +02691156-ca6e0a1d5cfee53a8cbc4ababb61ad1.npy +04401088-9e5b9dd860689c5c217f93816a639386.npy +04379243-892e2630024144f94f29aafe46fcf418.npy +02828884-bd39e9a5489f89c8d6d3866b78fd4902.npy +04530566-6419254bff42d878e820a92cdd43b76d.npy +03325088-53270b19da085eb1b362845c6edb57fc.npy +04379243-1264d88ae599df3fbeedb4c8fd29e2d1.npy +04256520-429d58759c85f4750276e25240d21a2.npy +04330267-b37d8ea38b1438f6fddd891c70a6adba.npy +04090263-1c1008be00fa5edb30dd2b88f7efae34.npy +03636649-44eb1db902d44daa30f6e0ede20c4525.npy +03001627-6d83067056915f4dd2f15044a9418e0d.npy +03636649-5b744ac897fe8bc557f40ff86fe708ff.npy +02691156-6720352c366eba1a60370f16a3e15e76.npy +04379243-e055a8a5d8ca0b9869df3aa2bce421f5.npy +02958343-498b7c799350d1f7c4acded0fc8a9118.npy +04256520-f15d3637d11e93f5dd17d7a192a3a64c.npy +02933112-62f5c85919a21aee7868105076bde789.npy +03001627-3230b6c7f396afff19fb4103277a6b93.npy +02958343-383f8d508b6f25f565d21723f535417.npy +04256520-192b06cd91bf659ce3db80a3cacc6e3.npy +02828884-6a7ea728941d3f4f4fb4dee5181bee.npy +03211117-c57f3b53b19aec84713decb1a0563b12.npy +03001627-4e4570768f981ca7b95617254e8005c0.npy +03761084-b92829a039380e31cf7f052999a00e5c.npy +02946921-129880fda38f3f2ba1ab68e159bfb347.npy +03211117-c4c15ab5dace66f81ba1d2ff478f3057.npy +02691156-a2491ac51414429e422ceeb181af6a7f.npy +03636649-399573561336a341b754c9a53619150c.npy +02808440-35a0ea7e7f9eac13321831d2245cf06.npy +04379243-ddc16ae1263d506c955e5ed03ef3a2f.npy +04090263-a7b3c912a793ddbdd107072754c68ce7.npy +02958343-5d2e0f8fa5d5bc1496bb71fec38e082d.npy +03325088-808b5b4a67f645db362845c6edb57fc.npy +03593526-4b16d8e3aa65a107e9814058bbcd7b44.npy +04530566-9a7b0effb53375625f647c1b0a6369bc.npy +02828884-d9b39a2a427c17ed43d55fea640906fa.npy +03642806-8d70fb6adc63e21eb7e0383b9609fa5.npy +04090263-172a4e03c151d14a9f433921788191f3.npy +03636649-98d0f886ae05db5af54f0f3959ecff67.npy +03325088-c6815bc73e12dd1f8f64d37593728c5a.npy +04530566-7551b29b91fa4d47ca732a92ee1dda3b.npy +03001627-3f55eca70a6ad5dfb4f2d409b6697059.npy +04530566-ab6724e38aa593602a99899765aa8dc1.npy +03001627-60790035c8126a677645b4fdaedbc34.npy +04379243-bf9d12b9a6a79eed342501391dc44531.npy +04401088-350dad20c76cb54b7ad5140f7d56e11a.npy +03797390-d0a3fdd33c7e1eb040bc4e38b9ba163e.npy +03001627-56184b3a4ea198af7e14b034d75254c9.npy +04225987-aa2c5469590761793c497dcbf6659611.npy +03046257-464a76c004ba77e8cc14b65ef8ab235.npy +03001627-22cc9b68e67339738d2d730aebe7865d.npy +02992529-90010049891220187eda1e12bd28fb7.npy +02828884-93e43734f99c7ca6c42fa56863e48020.npy +03001627-fed8ee6ce00ab015d8f27b2e727c3511.npy +03001627-d90b1021dc6e09b455369e3e5b79b017.npy +03593526-3074ccca5d98c71c197894d64e83a327.npy +02876657-7a82a497bc4d10511d385f351a1d14c5.npy +02691156-7e8be9c88e596b84198609c994ea801.npy +04256520-6f0b36b76bb0946ce642ef37786b5c80.npy +04401088-10b3b46298af96d40e7407386eaee0f.npy +04379243-941e751844d8b0aa8b424343280aeccb.npy +04530566-97402ccd78c061251141cd3611961b0.npy +04379243-4d4eedf718daacf945714140d50db61.npy +04530566-4690184ef7ea805dfdd29529d1a15514.npy +02747177-a513393efc093c7cb00bfc975577e7b5.npy +04379243-b814241f84521f797ea323bc74055b8.npy +02933112-7aa00b5d006a7e8de6860aa648421493.npy +03046257-b5c200a23c66bfb4617724635ed7cc4b.npy +02924116-931f70003561699ea8d89e4d21910b0e.npy +02992529-68189c0fdca1a8744db121a0d72356af.npy +02992529-e06b902efc1576c62fd4061aba358325.npy +02958343-b8d3a079edbc04fe51a95aaa6caba1d3.npy +04256520-8428d483ba327a2da11f6bacf5c7662d.npy +03211117-dbcd5a88a9d4f1d7579cfe4420588034.npy +03691459-3d7e4939b677bd9f3670cf6e57497e9a.npy +03001627-7f9733a6370440dcc8687ff9b0b4e4ac.npy +04468005-3a20481892ebe6a0e810c01b1498aa2b.npy +04379243-df7761a3b4ac638c9eaceb124b71b7be.npy +02876657-b198ccb35182e73ffd2866d52d2e8042.npy +03636649-308bd35d5f52de4e57b8f616df7adf9a.npy +03046257-29d4598fa30e51958e2b55561bfbee30.npy +02924116-9baaa5688e83f884f4d6cfb91981e4c9.npy +04090263-62fc2e971d8023e61a6fae073bf19933.npy +02933112-14864858c05f52ec4da5feafe6f1c8fc.npy +02958343-40c05e511efd3fa96945ae93118ea9d6.npy +02958343-63cc90709837d314a0b2db16370345f0.npy +04401088-52a81d42c352a903a0eb5a85db887292.npy +02828884-abd7c6ee28e19480a00f752d8c024637.npy +02871439-65f8af76d8e4f477c6baf9d9782f25e1.npy +03001627-c2e50f21663db36af8f5708c6c7585cb.npy +02992529-4ce4f7fcf5f0c57a3caebb882f007959.npy +02747177-db9d164a58b37117ad5067eac75a07f7.npy +04379243-be461a1a083481c8488017d48a7f7eb4.npy +02992529-136ef91c95ca5c2d4b9a4e1a888c5f59.npy +04256520-9de6e26211d151931ae8c8ff1eb3d45.npy +03948459-c6f8a4781d8a5b228c8cac88a8c48208.npy +02992529-9090bc906ec8d80aca54a3214c333cc.npy +02691156-cbbf6ca6a621c5f9acf77e718d93f3e1.npy +04379243-3c1c6695e665ab474b8710a3469971b1.npy +04379243-6c081d6351e07db937251258858a7a58.npy +03513137-ecabb65ac86924cfea1118e44682a5ab.npy +04004475-322a2ab28ff01dc496f0bcf2d61abe7.npy +02992529-388798a892636235d2a526c0a7ff71e.npy +03928116-ac47e870aee0ecf5c4dbe872a948b23.npy +04330267-41da6df6f2a4e48b5e4e23ed78187234.npy +04379243-faa05897ccdaa0e4f51f77a6d7299806.npy +04401088-6909da0ff58823615a82137b384b94e.npy +04379243-e440f87f88335680b20aa91e9e90c311.npy +02933112-2b6bd6e0b3c2565839d3717288022c20.npy +03001627-96af52c34e42b546cd2c9316e943c316.npy +02933112-10798ccb7072393e86d53ab0fe94e911.npy +03948459-2e3a11f4328843dc61da9de756ddfd97.npy +03938244-1399af537cd5f80723a295070ca176a0.npy +04379243-b3e92f795bfea504492d9da2668ec34c.npy +02958343-25a44213579e75782e877e82c90c24d.npy +04530566-e27fc8b68996d205f650f4803ec7962d.npy +03001627-3186f9dd5179358b79368d1198f406e7.npy +03948459-732dedcf453bcf0615ea1d7806d654ad.npy +03928116-a8b047e1ccb66c889e4f174839257564.npy +02933112-2f12c90e2001a0bfd7bd133fd14c164d.npy +02992529-8b11b38e035143ddb007a3ad40c5add6.npy +02808440-f2ef257f008b08277f540470fee080f3.npy +02691156-ff725af6df1b76207b164268a44f7712.npy +04379243-14b96e25f93105674ee71d2f70ae4021.npy +04468005-30fb22cfe7db9dc7ad4ca49782f6b451.npy +02958343-88c884dd867d221984ae8a5736280c.npy +04256520-8603da907b2d1bf0a9c6c82c1fd82c5f.npy +04090263-60a861a5b416030a93153dd7e0ee121c.npy +02691156-fa7cf8d11d1340ff9a6e43b878d5b335.npy +02691156-1dbcb49dfbfd0844a480511cbe2c4655.npy +03636649-2ac7f0509507c6cfbaaf4e0b7520fb81.npy +03001627-29d5a6ae911ef708f51f77a6d7299806.npy +02691156-22d0100fa46f20eb8699933784576e73.npy +03001627-cecbaaf284d32574e669ded0ef71cc0d.npy +04090263-a467801481b450b8cc34b900bb2492e.npy +03467517-9aaad035af7e6ab1ed724609df3eb104.npy +02691156-617259db5ef0b9f8bc0909d98a1ff2b4.npy +02958343-c09c9e2d85df1abf6a3f171e9d98eb02.npy +02958343-c769d45be62178f516abce8cb03e7794.npy +03046257-e67f610cafeb2c0dbf93f50e43a43f7e.npy +04379243-ac35b0d3d4b33477e76bc197b3a3ffc0.npy +04379243-796fed2b90efc756dad3b08da15912d.npy +03467517-aface94c7aeb373865ffdcf45b6f330c.npy +02828884-be9c2b70082503eb352fc7e973ba7787.npy +04225987-a6d79366eefbfa6df9034ea5f524d56a.npy +04379243-82e47329faf11e5c7235016c2c2c8150.npy +02808440-9c72e9c273fa91701b5647ac5820a290.npy +04379243-f714747e5abc01cc14038d588fd1342f.npy +03691459-b8da73245beb77848d257d2dc106cc1e.npy +02958343-1c1bd2dcbb13aa5a6b652ed61c4ad126.npy +04379243-3565f5bce51b333e9b19181a19104021.npy +04379243-8c3c81a802ecdc45609fb05dbd8681bd.npy +03001627-1767c5e3771b0510f5225bf5a419e95.npy +02933112-1252e89db37d786386d53ab0fe94e911.npy +02992529-ef16dd3bd944608821844676433a0aca.npy +04379243-b079b8fbb6199f0eef53a66b4f397367.npy +02691156-e30e25fe047ce1ea10b08ceced9a0113.npy +03636649-c414d046062b529ffcb8d8c6d4df8143.npy +02876657-712b597f47b04755f715d98aead3ae6f.npy +04554684-4bca315fd61741797fb96900a295055a.npy +02958343-f0d16187cae178e7e9d8921ebe6d5b8e.npy +02876657-8a980192662f95b84f42eadbd9a0b820.npy +04530566-8b57b62c984575334f89761f054e2019.npy +03691459-bf27f6d33ea63c041df7ea94ca903361.npy +04256520-bc007cba6288e3503790005cfb7639de.npy +03001627-ea762c2f1c6e966be464faca7dae7fdd.npy +04401088-e1a4ea72b1f98e92d265c94f4d41d924.npy +03593526-a96b8f654eee2e8168825f3d0ad04fa.npy +03642806-5ea74fdff0f69a60546d7b6431984ed4.npy +02958343-73723a79817b594098c11e8f05368fe.npy +03691459-4e8eb4a0a6dc83e0c779d976f4b3d7df.npy +02958343-278f301a4ec1382865306f052698c1e5.npy +03948459-89bf5ef4ec5f275a70eabd84d42e060f.npy +04554684-e3c637980c8c22eaf4a3d771dd0a0ffa.npy +02691156-cfd42bf49322e79d8deb28944f3f72ef.npy +03001627-86fda548f0fde39328f80188b7c24dcb.npy +02828884-84d0db8ad40017a195c500dedd6e2c23.npy +04379243-66f1182a5e4dcdf9ccce4c6d5bb195f.npy +02924116-a32145f859e16c791bf41075ed1aebfc.npy +02691156-64e36b948869a79683653a771e25099b.npy +02691156-15442b53631b7e88232438a710acf1da.npy +04530566-28c2e4576e53da5ee25f26a257fd7871.npy +03991062-125ef534450afd4de770d8514271b45e.npy +02691156-c94efebebb2eaefcedc8262267425d73.npy +03759954-b4df512cd2ecdef445eaf8d7198d3016.npy +04379243-425e21671035806ff51fa0238791f5dc.npy +04256520-ae69ea12f45b428a327289c00b6dc9ca.npy +03001627-fe5951beafda9dc5b76982957f05710f.npy +04004475-a47045e07932413812bc5d0d72352297.npy +03691459-7fc23785c19991e4e180a1a604561d3b.npy +04090263-65b1329eee48bd00d87c63d8b3018b58.npy +03636649-20af3e3a79e7023a6c342cf382162bc7.npy +02691156-c8ea73dddcd80d901b1cc145b0144991.npy +03001627-40d202afdcc49c6d35836c728d324152.npy +02876657-2ed752a96e55398928beb1ac60ef8914.npy +02958343-c0aeb1f7a3fa4e2aea914417bf582f8a.npy +02691156-f9f4daf3015b5ece5e9e2656aff7dd5b.npy +02691156-7c7fe1664a1f36b8ad6a38fcc21e6e9e.npy +02924116-96ad7a734ab428c4193d7855ecfc1bd3.npy +02828884-651141a1e0138b82ba6cf6cbb9f4c2bb.npy +03691459-e796a74db4708efcf115c1f523ea8464.npy +04530566-448148366050fa2b17dccc00bc197b9b.npy +02933112-cac3d104981b47cd3d113b8340bd5029.npy +02933112-6f2ce914b5d4db81e28993aa4d91dd77.npy +02691156-b0f3f0f754c0129486faacd7b0ac262e.npy +02808440-d9bb699461f28db61c17aef130ed6213.npy +04090263-91156c525c67581f0cadf545f40c8f9.npy +03001627-b46361e53253c07b6fa2cfca412075ea.npy +04530566-498bc74044946e85484d83b7c37bccdd.npy +03001627-8da327a8eea887fd492d9da2668ec34c.npy +02958343-6a02e129dabcea8ba7dc87c65b6a70a.npy +02828884-bf504bde782c3f2ce8ced3508709e1db.npy +04379243-b9695f4e1589c6bde12186cc8c5022c7.npy +02933112-7e881ebf38366c6b5c91aedc71c80652.npy +03001627-abf03d43cdf0825ff51f77a6d7299806.npy +03001627-6446846bd5cc3cef5b4aea6c98f52b6e.npy +04530566-7677121309eded5fbbd09450267d17cc.npy +03211117-12c1b3fa24cce3e75745b9fe8da12812.npy +03001627-cc665438c4f7baab137d9700e13a503f.npy +03467517-73a1ac3658e2505f76d05024fabfa1e5.npy +03642806-3909e96930cb1e32a4f2e5eab55eddea.npy +02992529-30efef3eef4b37eb9ed75a6428ac0ca5.npy +04379243-812f86b9e1de03419c0ca344f487323e.npy +02958343-1f6ce6dd6720436642534f02c8e8b5ac.npy +04379243-76665ee7994012f2bc74913d2fc4a0c.npy +03001627-27efa956ccd86120464bf8a1dbad4432.npy +02808440-868d4ab648e8cf62b2f1a4f3f8449762.npy +04379243-dcdea1e749d4e20c63eb57c871ab1d8e.npy +04460130-1fc436fd53db26d667ff3be08608de4d.npy +04468005-5df84478c357fc7c5b056960183c4aff.npy +02992529-99fcfdd6edb3898a1117cb504804bf09.npy +04090263-9319229e8b90b7d794a57adad86ebb52.npy +04256520-a9da19aecc65656019fb4103277a6b93.npy +04379243-e4947c9bc17eed10e54cb890e8682c84.npy +02876657-5fb5ef6280e09d96d11ab9fa7ac20266.npy +02828884-ea6da848da3f603f81faebbdea6bd9be.npy +04401088-c3e0378cf861099ae3f7a74e12a274ef.npy +03001627-39311ad85e77d3b7492d9da2668ec34c.npy +03001627-c19ff7d2a5a3d29aab966e32f5a3808.npy +02958343-7046566750f129126aa0f1550c0a545d.npy +04256520-fd56410fc541a09a749add7c3dfb27c1.npy +02691156-d34eba7c2ce4db53adecb6fc00604132.npy +02933112-d69d9de0c79ac6a9c59350d819542ec7.npy +04379243-ebfc108a60197d8d55f46d55537192b6.npy +04379243-74b86828a5adb4c15b4baf82e4d24faf.npy +02958343-95a6e03656bdff26f69bc9777f9c3c39.npy +04379243-16dd49ad350321e678996b707ffa04f5.npy +03001627-71372c1f20b6a04c43c40c5aa3d5c5b7.npy +03691459-a11a2f20b1680f91b626640605322b5a.npy +04530566-2d847f7ada349864a4f87aa9a31cd70.npy +03001627-2e17502c7a131b4061962815e1518ae1.npy +04379243-4f0fd96b50c261ed48fda83c10428379.npy +02828884-e941e1929bdc87d5ad876645af0395fd.npy +03467517-7e4c32c76690d64a59ca4b9cdfa4cd73.npy +02691156-688f4e273beef132f0daafcf2996daaa.npy +04379243-eb98dcef687ca46970553da2430bcd98.npy +03211117-cdede148ed40e40187cd01e4a414d87f.npy +04090263-c825f86ca0c8550d45e0c3a4b827d51a.npy +04256520-d3a550ef8b98f55b21cfc6e95839d798.npy +03001627-2783a969fa42cdecbe31379a5751d820.npy +03001627-a39f54db298e53b035d20a1a3ca345.npy +03691459-1f59ba1fc5d296a817a0d4867f131bc.npy +04460130-63150ddf5088cb6a1b4b48d3a6cc767.npy +03211117-a8e109c66a0fcce7a87d866b539e4b68.npy +02992529-bcb8525b5aa7e4a5a62dc47412730fc9.npy +03211117-64abc0ca2670818e441f5bb6f88ca61.npy +02876657-3dbd66422997d234b811ffed11682339.npy +02958343-c6e3d9cf26016b5752aa494042b7c9db.npy +04379243-2c08886cba42af25f1acf3f2c6f9e1eb.npy +04530566-1b3a8fa303445f3e4ff4a2772e8deea.npy +03691459-440745e23b80c41f398d0c5832df00e.npy +04379243-352be15a6b1439c135836c728d324152.npy +02958343-6710c87e34056a29aa69dfdc5532bb13.npy +03636649-c8305b6f8521e9b3565822a81bbbb03d.npy +02958343-93486febc6ffc1aa7f04cab89c8d2959.npy +03337140-9d4189605087b029ce5d6e9371bb5c33.npy +04468005-dbae1cce1fb122d7dc14ba0818ee5cec.npy +03790512-e86e4d0b530743e129c87d1be93099f7.npy +04530566-35e014dccdd4fed12c791a7edd1fdff6.npy +03636649-e30a70e900f0a9565d28221e3b996124.npy +04379243-827bfeaf1de70f08f7d9678498f2295.npy +04256520-e2b1b05de388e7db3b52c6376e0759d3.npy +02958343-4849c61634fe3023fbeef84a1ff2df7f.npy +04530566-607b88a99de743eda0fefbd3658c7966.npy +02958343-5e236dc6f4381ed37af61b3a12bec0aa.npy +02871439-da85e3cd457b2306a64bdf68b802832.npy +04530566-99450835aba6e4c4da2951c4977eb283.npy +03691459-e750bda061e86402cf39ad4726172e1d.npy +03001627-6ed05dd2e39e06223b12a1486cdc4b7.npy +04379243-9be565678aab11cba0ab1d82ef09f78f.npy +04256520-834fe65aac9ea9bce589b08489d157d.npy +03001627-d69aad24d253474dc984897483a49e2b.npy +02958343-663bec87ecf2e0adad0e351bfd714e3b.npy +03642806-16c49793f432cd4b33e4e0fe8cce118e.npy +03790512-90c209ff795be387afe1d4530f4c6e24.npy +03691459-1c5c9d780dffb5c2599d9c8430d600ff.npy +04379243-6acf2b080e171859412dfc90452742c7.npy +02691156-99ee9ae50909ac0cd3cd0742a4ec7e9b.npy +04330267-91171b5e88099d8a642cdeb209ce68c.npy +02828884-2212ad7db1587578d2b12aa6a0f050b3.npy +02933112-8bd6e4ce15468e1ad6eefa796d2f261c.npy +02691156-876127a17b7285b3c1fbdb352261d023.npy +02828884-bcb4f576747e10bdd7f6e86d7d335698.npy +03001627-a801ccbf4985a57f17adebabcec6b7e.npy +03636649-f12822778713f5e35b36bbc16e99b441.npy +04530566-62cebab704dbc0d02b76c9fef45435c7.npy +02958343-7eeebaaf4df31022aaafd94b9f216ef6.npy +02691156-94bb7abec5f1b984dd1c97b5ee3d49a6.npy +03001627-bd3e65b625c9d994b022c94235bc8601.npy +03001627-662928421872897f489452a0032ea575.npy +04090263-3fec7abae87ae773560ce90a898cf5fa.npy +02933112-54ea003ba0d36f34da5feafe6f1c8fc.npy +03636649-97b7d9aabe38f91df11c97be803c47d.npy +03211117-a5269c81a3d7e8a01242824b4827fe77.npy +02992529-595901b2d5b23f58ed756341424d6b8e.npy +03001627-9b4e072fbf32d793e6c5cd45aa112726.npy +03001627-8707cf0c311ba8f34b3c42e318f3affc.npy +03636649-c97cc6e7fd4b4a07d650f729d0ffe69.npy +03211117-5880abd2815da0492fc6a8cbc82a5bb1.npy +03001627-4647b2b982deda84217ad902ee02afb5.npy +02808440-1c6117c2eef53221b362845c6edb57fc.npy +02828884-cae6c2b329bbc12de5d5fc930770c792.npy +03001627-a8c0ceb67971d0961b17743c18fb63dc.npy +04256520-a680830f8b76c1bbe929777b2f481029.npy +03001627-bb5791b1d4cb5fe81c1b3b2ed8d13bf8.npy +03001627-52a8dd8b79ac85299d4d5dcd2cc33826.npy +04379243-da9ff1881e8d59847d76632660780a8c.npy +04090263-f4239f72396f4170e80f8461d134c14f.npy +02843684-1b73f96cf598ef492cba66dc6aeabcd4.npy +03001627-f31f8722de9008c8c5aaa7f1cfa788b7.npy +04090263-f53d6eb7baf5a29ec24d00518a3dd6ec.npy +03636649-a1194aa9dd64c3c849d61704e3b15013.npy +03001627-c5c90d3e84be70a11b17743c18fb63dc.npy +03001627-be9d5105e48ae27e713decb1a0563b12.npy +04090263-bdfb8df0d6d316012b38b1d99376c0b.npy +02691156-d37781e47470fa3d664a56105f5816ce.npy +02828884-6e045aac2c52c7c556f6ef8b6ca8f4cc.npy +03467517-f7938e387f8ee3f8f94083089dddc4d3.npy +03001627-797df32cd5248558f779fe11f536ba12.npy +03691459-fbdfa353d97d91fc719d3f85e0c9919f.npy +03261776-5b2847f952068fd8992fd3dac901d508.npy +04468005-b5be8fd2d66546f452470de2774d6099.npy +03325088-b3553c13686cc769ebde9a63a3b4b302.npy +04379243-343bf23c280a14cc4ee8db28f96ad26b.npy +03001627-488041c2e021e8e87b11ae648ea92233.npy +04379243-5a9e3e5bcfe506cb323ead02771c3ad6.npy +04530566-2e19e953c01ddd69d5bb7fc09b61862a.npy +02958343-1710ff46ca275e171df27141dea8c9a.npy +03001627-d04a1ec4ac9de6d6eab55e294b4eea02.npy +02958343-1552f1a6521bb54a4bb135bcd06914d.npy +04256520-27be61a3c437d7a0eaf288f952624966.npy +03325088-88bed42acf279854c36fb70296e45483.npy +04379243-7f5c20bafb143b92492d9da2668ec34c.npy +02958343-3ef041182cc1d037a9d3767c58267708.npy +04090263-8cac8a38e96e3754a59c12bac2e48f46.npy +03691459-5000f99de4ae981bc52c9abdcf87548e.npy +04256520-e48455c2ad642df1febad4f49b26ec52.npy +02958343-679a25d96d21cae4a7feb903e89a6153.npy +02691156-34c656eeca31045724a182d01c698394.npy +03001627-477fdfa65563f180f51f77a6d7299806.npy +02691156-2993c233805d2718ad8912880b776dcf.npy +03593526-f8e8740b44ca276abb6f5a9e4b6b8b34.npy +04379243-45dee2774ca0527c9f8c3d2002c77ddb.npy +03001627-54f33a7cb3621d5ced98cca8f0ccd5f7.npy +02958343-c004e655af0b35e3bda72093f9b5aa73.npy +02828884-9d7a51641609efeb54db38a439aab3c3.npy +03001627-cec74855ee27972040a35da25154231f.npy +02828884-9159af619d9125ecf4fb4dee5181bee.npy +02924116-52f8b3ab45b05c27379393d232db737.npy +04379243-a24cc636d32bea058c833bc3a0fba1ca.npy +02958343-c0b2a4cec94f10436f0bd9fb2f72f93d.npy +03001627-13c18609602e4ced37b2bb75885cfc44.npy +04256520-1429db0e06466860dfd64b437f0ace42.npy +04090263-f54a04aa65598c3cbd32f07d6724eb4.npy +03691459-c56e62ebcae613624c40f34de8f3bdb8.npy +04530566-e2595bc7ef0809097c0ab7347b9e831a.npy +03624134-960333056428b9302393df8f7c1d9394.npy +03001627-fd9e909b082d8175d319c38340319ae4.npy +02691156-330f797ebbc565e71560e45167753555.npy +04530566-90a71287364b3d1bccb9d5278825aef9.npy +04090263-243a8273104d83b6e1f2a1daf140ac9f.npy +03001627-cdea84a63ad8c44febad4f49b26ec52.npy +03001627-87e11555e7233fb4a9bdc22a1e02e82.npy +03636649-6d5d4e506d6630b193528e10aeca0aae.npy +04256520-ea35493dd0e9039e8d2d730aebe7865d.npy +03261776-6bf1559769018cbb354b166143712fb3.npy +02933112-1dcd59ab33d275705ac7b7ceda74ec30.npy +02958343-ef686b06e51b00601c9427735f8d544f.npy +04379243-852826a94cce36ea9f1deb04fb8ae481.npy +04090263-e1e43d3916a7e19acb7b0ec95e9a1b02.npy +03001627-37a273cab5c24d457e871e09a3769b30.npy +03001627-3311f1cf612be98290a9ce3e4b15521e.npy +03001627-9b12d223347d4bdd4a11872aa986426d.npy +03001627-c0720c8d54745ea8c8687ff9b0b4e4ac.npy +03001627-1f857fce279b761435fbe95f496199e.npy +02691156-bddc2c1a4fae008947a1dbf5fd48a4dd.npy +02808440-f0fc7248fd16e45dfac6ca167c92d21.npy +02691156-1f5537f4747ec847622c69c3abc6f80.npy +04090263-621502aa0a01864d20ded1536778b0f.npy +04004475-b13d7229f113cc6fa3ac1bbe37d03a29.npy +03467517-c33328c564f0f6be799d06ad2011f8d4.npy +02958343-73dd68fb65a4f4d25d9d397842621b7.npy +03928116-c8cf8b011d5a3dab2203dc8a6e206818.npy +04530566-58d8ded0bcfae37985974f8a4d3be0b0.npy +04256520-360c1058f401dd27fbc060fd555478.npy +04256520-46eaf99e641a0fd264558a1c6a2a9f11.npy +04256520-54eb2ff4ee8889f65ff59927d484940e.npy +03710193-f1f92f0942b4d85b5b9eccd25a4faf01.npy +04379243-ebcd23b7d8d9247292cf95a109e87d7d.npy +02933112-28bd3151d50a4d78c59350d819542ec7.npy +02958343-f8b92a0ea7f4705c9fec71e8f4aac226.npy +04256520-e771166e02fe1016bd16d4490a10a752.npy +02958343-77065a7bc997bae82d5feb260eec50c.npy +03001627-475e2c8f7a2c1bbd9acf9a86c283d1a2.npy +04379243-10a4e263f8087c4b8cf2bc41970d572a.npy +04530566-953adc8c58842c1281d9d9b1473043a2.npy +04330267-e30e4f8c9383b4b3a805114916841d69.npy +03001627-fffda9f09223a21118ff2740a556cc3.npy +04379243-a7949f6ffcb23c178339e983761bc4a3.npy +02828884-d26818a4e62d931d2056b4bd5d870b47.npy +03001627-d619fd50c4d0fb46dea83bbf303af433.npy +02747177-4648772290e4dcf6ad5067eac75a07f7.npy +03691459-f8d4287a583bcc499393793f9cf3dbea.npy +04256520-ead4e128aa3ef03b9283104e53cccd61.npy +04090263-b7d6f5e0a80f9502d4eec64750f57123.npy +03211117-600bb2a17b238a927f7954f9ba534b6d.npy +04379243-5924fe80dc26ae812b0c00d36a59e875.npy +04256520-f6d695e08f246d4ef5b0cb6df351ab49.npy +04379243-3d54679cfdfe8d72e1aff9039d025.npy +03636649-b10efcf01493c922e7e684d25d4dcaf0.npy +02691156-f3f3805b0f1c81e6f1218670339368db.npy +03001627-d490f77bed3bded5af7c7ad2549a1b15.npy +04468005-2c66af94406704f3bcce76f79beff867.npy +04379243-8b62f4352dca92f657c81a572b80bc7.npy +03001627-77e703a4baba613937f1b3cce66816ca.npy +03938244-a97e7bc8291f73d521788cb501e76904.npy +04379243-1fa966f9c1d9b994d2ae2f26e86f819c.npy +02958343-2a1523ee15233761d9f8911ce020a037.npy +04256520-c4dbc5a64db6c2d72a9a1691b6f98331.npy +04401088-cbe652c317a4366b4298c9fe028be1cd.npy +04256520-15ca4d51db95edd783f3ef99fe735c7e.npy +03636649-d7a10c837316de2f3ca265f557f5dc3e.npy +04256520-5f5ccb837124abe11298312f680c9cb8.npy +04401088-a6fa27ebfdcfb0e165f198d5d73e9283.npy +04379243-d7c40ca08579ba4e664b3b9b23ddfcbc.npy +04256520-73f7237dd7ed9c1d593ebeeedbff73b.npy +03991062-8d7083a120eb546c1c3b3ce292007d5b.npy +04090263-12038871e583f645af56497f051566ab.npy +04379243-391fa4da294c70d0a4e97ce1d10a5ae6.npy +02691156-3c1e298b4222f4d15d3bbd70fc7759b7.npy +03001627-ecb43e4b0fc96935664b3b9b23ddfcbc.npy +02828884-e30527e054c1bf2ed201085e80edb26a.npy +04256520-c71a8fe3f0f14c074016166a4bbee8e7.npy +03001627-c86cfe147872280463626070a93463cf.npy +04090263-154d2a83fc91d473d735fa1ab17311ec.npy +02828884-7807c68ed9963df7f4fb4dee5181bee.npy +03001627-5cc61516525325f55e0d6e917505f52f.npy +03636649-d97a86cea650ae0baf5b49ad7809302.npy +02958343-4dc19314aab40eb83a93df79ef2b80ef.npy +02828884-7047ed12851201138cc469a51e5a5cff.npy +03001627-49345c62f63818a036be1486373f076.npy +03761084-7672e8f619765cc51af9a5a7008cc3ec.npy +02808440-7e5e0372dbccecb244221bef0fa3c36b.npy +03691459-c216e0b5470ec21f6ca2b6e5474aad11.npy +02924116-a4b740849e66f14241cefd10ce5d6cc0.npy +03001627-a48e359faed3da88d3519c62a8100783.npy +04468005-5e4a6599e030061d9f47439175208c26.npy +02933112-28ad7242b0bd168ec59350d819542ec7.npy +03211117-72353901edbe553ef5f9c04ae80a1c59.npy +02691156-1272dd98c66f13579a6e43b878d5b335.npy +02871439-a65e62186ca1b1eea58c3abb1c7c441b.npy +02958343-437f3ed08c32f2b9092ea6b09901598.npy +03211117-2bd7f9ea0c695a309c739d3276070b8b.npy +04468005-59b9e0fc43c367df52470de2774d6099.npy +04379243-3491a4102095b1e87ff6ace05b36a5.npy +03991062-240a7e8eb09d64e2b1a98fe8994d06b6.npy +02933112-76271327a3224e56c59350d819542ec7.npy +02691156-34ddff243ac3783521b85e5214b0d6a7.npy +04379243-9a60b3b87a457c73f522eecffc49e6a3.npy +03467517-ca9d66e82f8495a790e6e6b4a6e53622.npy +02933112-243284bf14a193771f6fe06b2fa3ab21.npy +04401088-520bdc1f312a9c92e44148b82b01a424.npy +03046257-3c78e14b999a04bbcfa93d76721b3c29.npy +03636649-d60a54564aa1856fb18d6f615cb18bdd.npy +03211117-8dda338160076595234c2f2e8f2fe6da.npy +04379243-d4a3c7e26b4a6eef30bbd4cddd04c77b.npy +02992529-2488bca663eab268d53bf953feb52e3f.npy +04379243-c25167c0af7517778cbb8bac2032149c.npy +04401088-20bcd48918a843946e74af071fa12682.npy +04530566-acc820666df876cb33af5a5d96363fe1.npy +03001627-da1ef4e9ccbfab13b3234e0da44b11e4.npy +03046257-e6d392fdd687188981d125a53e3295bb.npy +04530566-b26565bf67d9f61abdda868bb83c524f.npy +02876657-40e5d2c6e9e9cbbf5cafd3b1501bc74.npy +02808440-1b021f1332e7d185ccd0340812259a39.npy +03001627-a33c519a3d90184f504721639e19f609.npy +02924116-992436dd99cf145a19fd3efae56693ab.npy +04379243-74a626c1b31c14cbf8b8d4a282992be4.npy +02992529-57657c2b0d983a1658975870bb96a55c.npy +03001627-331e7c7897b8243694887ea54f3cfb87.npy +04256520-c2294d5c7d629f11b17743c18fb63dc.npy +02933112-54f801646e066ce92afc25cef0918375.npy +03636649-b8f5122793e92cccfde2773767fa47e8.npy +04330267-39a419de848fdf542a2fbf58d878928.npy +03691459-4a158b46d8e943f2d612e9885a7318aa.npy +03046257-31e745ce313c7a786463df620b7b4cbc.npy +03001627-18d391ede29e2edb990561fc34164364.npy +03001627-e545ff0d2058b382c3bd24f986301745.npy +04379243-b5feedcaea797add4830ebf7106a333e.npy +04379243-6d67f92d6e11f29e5792b99b8245d225.npy +03001627-81519481b3e24fd7b0957d845ac33749.npy +03001627-39ac9a459a28e252763d2f5638da324e.npy +02933112-5ff47fe4724d0c9320768660cf080d12.npy +04379243-f8e8b0059395805d9bd3e6056359bce9.npy +04256520-25220d902288e352632c9ddc45ef4651.npy +03001627-fdfedb5bb8cd35374233148ffd345970.npy +03211117-6f1c8a6b5d684a98e3d888a4f2b9ef73.npy +04530566-8411cba605709e46c26de8baaf779d69.npy +02880940-b5d81a5bbbb8efe7c785f06f424b9d06.npy +03001627-7228d43e00af4c1e2746490e2236e9a8.npy +02933112-b4cb08749e099f0a899736e5d685d0c2.npy +04379243-52329d991c54c5104febf42664c91820.npy +02691156-733db701650ed0d4651e8da9cf70afea.npy +03001627-e4114b81f793628fe8f8c11a24c52ebb.npy +02924116-f86dbb66cffcfd9b38b9be827bf6fc77.npy +02992529-7afdaca858bb0a964a28575f3344964.npy +04379243-d4bf9872856d6fc2b300c4ca2f51c01b.npy +03636649-d1ba336c09928deefc91db1746a83b15.npy +03001627-ed6bc67f247a5aa3e43df8c9a38bf11b.npy +04379243-697779230551768eedf21eadb26f2ac0.npy +02958343-60c6194b6f164cdc30276fff5ca3093a.npy +02691156-b7eefc4c25dd9e49238581dd5a8af82c.npy +04090263-9fc9bed98828febed4713685ae50fa13.npy +04530566-36c8dc4d5bbc44c87ce8c809505eca2f.npy +03691459-93aeccb6a5e0a62035cd53a06b1d2317.npy +04256520-730dfb84b370682d9cd8353ccb52cf6.npy +02992529-ed5ac4e8c681102e848d333362aaa342.npy +03001627-1769c3cf3391d5c1a1d7c136d0e341.npy +04256520-254fe5715b9de05db499b6b5bf6f9f82.npy +03325088-5cc1d274e57dcef73321831d2245cf06.npy +04379243-156d606fa86ba19c4eb174a255d0ec5e.npy +02942699-3b56239e45828d2bb4521a835b1946c8.npy +02828884-3b18e32e6e0c5942d4d8765e3910f617.npy +03948459-89e248c25d3fbbeded6071560148e6eb.npy +04530566-49fb20c0d5c84e2757920cec1ab34b29.npy +03001627-9a522f446662bd23a07a1bace8cff15c.npy +02691156-7cdbe41e6701c661bc0909d98a1ff2b4.npy +04379243-f52e33287b89f0109bbfb8262cd69a18.npy +04379243-faedeae65bb5644040ef1c8b63a628f9.npy +02992529-2df0bc8b46ad3cb858932236a22029d3.npy +02691156-4d2d87e61a18760ff64801ad2940cdd5.npy +04379243-3c1f16ccf38710e64b3c42e318f3affc.npy +03691459-8dded99a589a526d609daf4d63b3df5d.npy +04225987-d31aaca67fd8ef1827d17dabad15093.npy +02876657-e24fb21f7cb7998d94b2f4c4a75fd722.npy +02871439-fb577abb5e7b7835b5268e212359ccea.npy +04401088-e0d9622225e1361883b4bc86420ed21d.npy +03001627-9a6061dc962c0480ec2a7a1f5fe7365d.npy +03790512-4df789715eea8fa552ee90e577613070.npy +04379243-43321568c4bc0a7cbaf2e78ed413860a.npy +03636649-b074f648cc99aca6fcb8d8c6d4df8143.npy +03691459-cfdd69078d7752298b54295fac36ff1b.npy +02871439-dcd43c744d65d713c351d52e48bdbbe.npy +02828884-5775bf637d14acf1eaa4526a35f01085.npy +03001627-ff969b22a8de5eac30e06a011e63236a.npy +04256520-f39246dedaea087c397356311cbeea4.npy +04090263-17733d33502704ce9555419173518aa4.npy +04090263-8b8baee427b1adbe30ae8c7dca0728.npy +03691459-5ea3d1068a624c1da91bbba4742a1643.npy +03001627-ebaffb5ce608e7158d09bc92d0fc6d3a.npy +02958343-e54eb2674d6b3e241e351ee0a9db4268.npy +04468005-c4634b70047f855292f8ff9dd121a20.npy +03928116-b549a0c108ff0272e4b68d3b17c43658.npy +04256520-b67232c18d00fca7593ebeeedbff73b.npy +03636649-266ca6ba2582dd9dbc24b3e693083ca4.npy +02773838-d5881d42567baaf5dc19a9901b7e9a4f.npy +02946921-3fd8dae962fa3cc726df885e47f82f16.npy +04379243-4e5172cf359d577154ffd0de2b0db5e3.npy +02876657-5566c65116a9567078fe949fc1419876.npy +03001627-e175bc785390e8f6c05575120a46cd3b.npy +03636649-e083ee4f045402b2806fa01b99bcd24.npy +03691459-b10f7a407b4a3722296ecd3bbf65f1a3.npy +03001627-5ecaad1f7575b3918ce66f12ba927a2b.npy +04379243-b69b2ff85d0ec661d8f9dd7647048a0c.npy +03991062-1b121101806758e4f9aec59741c69cf7.npy +02933112-98e47ed9746cbc88ef9b1f19ef4b8cc0.npy +04379243-8aaca7e2c1b0ec549eea323f522c6486.npy +04256520-ef479941cb60405f8cbd400aa99bee96.npy +03928116-e966f5e34789b32210240762b65ed973.npy +04379243-ca6071926d0d910372ee08e78374a212.npy +02933112-4a007c5263b36c35f51f77a6d7299806.npy +03001627-42f77dcefe75f7eb19fb4103277a6b93.npy +02958343-b4f385b36ef0918d9393793f9cf3dbea.npy +03991062-4fcc70a519fac2a3f11c3739edd52fa3.npy +02924116-f1620392bd8d9249193d7855ecfc1bd3.npy +02691156-65bdf7b997087055ba30a078a973ced0.npy +02808440-9b2952001ce703ab6b448b8aaebb705c.npy +03001627-267dcb267138fc92c242632b2a8c3129.npy +03636649-c0f67a9a45cac532fcb8d8c6d4df8143.npy +03001627-a73a49fd2887a030f51f77a6d7299806.npy +02876657-908e85e13c6fbde0a1ca08763d503f0e.npy +02876657-22249179e88b0502846564a8a219239b.npy +02958343-9e3a69fc219ef73d37c910d2f91b3d73.npy +04379243-1ceaa8bd231d922cc3bd24f986301745.npy +03624134-a0e6f9f1061e2f2c1e5999ea0243607d.npy +03636649-bc40c19e71fd258046f1a7cdff74f3f7.npy +03325088-f1d5eb645eada0c03321831d2245cf06.npy +03001627-2025aa3a71f3c468d16ba2cb1292d98a.npy +04379243-a5e951c9d7a9a93f8cbb8bac2032149c.npy +03001627-cc8fe2000b1471b2a85f7c85e000fc79.npy +03593526-afeb60dda62138a04013b7b0fb1ceaff.npy +03325088-d79fbf2a080e30a2b362845c6edb57fc.npy +03513137-2750a9be8f6cbce54e5e6ac3ef6bff73.npy +02992529-ae86fa976ddb0f923bb35aa9d5fb636b.npy +04379243-ecf3cc67ede747adba5342d638d0c267.npy +04090263-e93954daf5406e15e564d15be4778337.npy +02933112-1ad4c572e0fd6a576e1e9a13188ab4bb.npy +03001627-5cc0b0e0035170434733824eae5cd9ae.npy +02691156-2be6cc069c95951a4304ffdb51711149.npy +03001627-8ad57afa55cebfe0dad433a29cb627ea.npy +04256520-f5d7f60d4b33ea4f63d977b06bbd429d.npy +04530566-baeb1f25ccc59698cca5d826f4b024b3.npy +04379243-f71296c0a7e93ec282db9fca4b68095.npy +04401088-295d6f0caa702a1a2f58405e4baaa2ed.npy +02958343-414ae320397821af8bf92e87e504146a.npy +02691156-86099a00dd63ac05aac413eef609e99b.npy +03001627-674f8f89f68491ff38a7c518e9c1b4ce.npy +03636649-6750d3745d49f7ad3c1ac1040256359a.npy +04090263-178539e39c6a83efb1c46f058c033ec1.npy +03691459-b1112f7597347113892a11caedd0d90c.npy +02958343-c3cfbe068adab0579583ff717105f70d.npy +03636649-3abe4c174e5e5ffe490ad276cd2af3a4.npy +02992529-983b362e25c008b1b36be681f90b79af.npy +03001627-10dc303144fe5d668d1b9a1d97e2846.npy +04460130-8b5f398ede93e1fd8da631348bdc760a.npy +04256520-383e435cdbe406e76ab870ad2db8ed02.npy +03001627-c30813d1130b492e81b31fbac7146568.npy +04379243-81922145630fced4b49e18913f04bee3.npy +03642806-bad11c851d356f6363920080bd2c2ed3.npy +04090263-e6b01d0349c34a4b9d40dc50674e6347.npy +04379243-fa871f2f88b933cd7a63d8989415726b.npy +03001627-a69a2807ca667fd9492d9da2668ec34c.npy +02808440-a26f1817df243dbf601f1922eb3d98df.npy +04379243-bfe05e0cf137791d1029f6318b92e21b.npy +02691156-dacb447d7820e7f7ca8607f540cc62ba.npy +02691156-48bcce07b0baf689d9e6f00e848ea18.npy +04090263-1fa5a9170bb276e7fcace4d823343363.npy +03001627-e02949c5e582d20682574dfd1b102fb6.npy +03207941-91cec7275a9b3266a6eaed098287ffd3.npy +03642806-97e94d800fd6dc07dbaa6d42a4980930.npy +03001627-7520005e70a54526c266013a269e5f81.npy +02691156-af04f04964fc2f1b64a62403221fd59f.npy +03636649-d284b73d5983b60f51f77a6d7299806.npy +04460130-dcc345e983796eeecb9157ba706d9589.npy +04379243-5be5ddf3780d2cbf71a782a4379556c7.npy +03001627-5b69cc96d156f286e7c7920f6a65a54d.npy +04090263-2a58d9c3a766742cc6f30d9ee0d5574e.npy +03001627-bafb9c9602d00b3e50b42dfb503f5a87.npy +04460130-5da1ddcc8d5f62577f5d4139a48ddb6f.npy +03001627-64d535abf6fe5ec46874ce99dea28d5.npy +04090263-7b0137debf39237d618f190677511085.npy +03001627-eee7f5138b978078fdef1c01cbd4ae0c.npy +04090263-22c33fb33a18b5bfbe250bd311b0c6b8.npy +03001627-63a1c3810119e2b660389b3f7b5c9026.npy +03001627-54c9f96ffc35d0c2eec2ef73f04d4ff7.npy +03636649-1c7f8ad295bcc3795a233e989a47d3aa.npy +02828884-84efcf2796fad0d2917fe9209d09e56e.npy +02958343-d01a821c8b2c43cea0061ac8d975ad8.npy +02747177-480e98c025179a68b47ef2a0cb1f9cbf.npy +04379243-4894b2193e36814dd42b9650f19dd425.npy +03691459-df8afdea84c72cd5c3dcb7e0e318dce1.npy +04256520-1059a78893d810bb14038d588fd1342f.npy +02691156-f6ec20afe98e37ef6e2a24768a2fccc.npy +04256520-277e5fc4d325fb1381f667e2a25e0619.npy +04379243-8cecee14e55bf1f4c255a5f53b753fe4.npy +03001627-86eeafeae817263414038d588fd1342f.npy +04379243-f0275c22904d275222dab9b5e1c1282d.npy +03001627-d239d38424429a9a4626612b5d655dc.npy +03636649-5e6abfc7d93fa5f1dc0efee4b442070.npy +03046257-171a6752b9a2dd95651adbce8f1811d5.npy +02828884-5d9880d63d54b9c442bdc91bf8c0f902.npy +03001627-2c76aaa00e55c26836c07750784b6bc6.npy +04554684-8a0a7c14b9cd6489d202e705a59e5585.npy +03207941-5d17e90f512a3dc7df3a1b0d597ce76e.npy +04256520-4e1a956e406bb70714038d588fd1342f.npy +03001627-89dd53d0377c28207f7114254c4286d2.npy +04530566-66a90b7b92ff2549f2635cfccf45023.npy +02933112-ca6d108120fa949163d977b06bbd429d.npy +04256520-2aa0288017b4e249f6a7b03b801e1d47.npy +04379243-89b23586ad3af3d6252e0775cff1c394.npy +02828884-146934a1cb852afc1a1a2dbbd3d54d53.npy +02871439-6be63942b2fe82eefcd4910413c446d9.npy +02958343-2cccdc287a5329c2ca92a4cdad802b45.npy +02691156-31af9b965002990e27e7e81f554f78b.npy +04401088-fb1e1826c233104a4e09ebaf49b0cb2f.npy +04256520-26205c6a0a25d5f884099151cc96de84.npy +04379243-a41865cc8dfffcc137ad4a99518dba6d.npy +03211117-5b2585db758fac87bed75a82d9bfc7c.npy +03001627-4b3c381658cfe96d4db79ead79f57b22.npy +02933112-958fa3ccebcaa8246c4866b1c92b8a35.npy +02958343-d2064d59beb9f24e8810bd18ea9969c.npy +04379243-5a550763e7705e532ea98d69e91ba870.npy +02808440-68970c4f57bb44167d54ec3c8e01d52e.npy +02958343-312cfe616ce515be5826faa473422ba6.npy +03761084-7d83379d6c2239393bf7bae2651d2cf.npy +03636649-c464b5be51b387fead5067eac75a07f7.npy +04090263-96fef95e1fbb3763276c3d558130f8b4.npy +03797390-9737c77d3263062b8ca7a0a01bcd55b6.npy +03001627-8a2349fc21f48ca78ce66f12ba927a2b.npy +04379243-fed1a75cf5c1ce38dee1e85d063fe6b.npy +03211117-8a89e2085e5f8404da89bed86b8f9261.npy +03337140-3421141b1e11a501824080f516909671.npy +04256520-47fbf101a830769fd1dcc55e36186e4e.npy +02880940-ce905d4381d4daf65287b12a83c64b85.npy +02876657-216adefa94f25d7968a3710932407607.npy +03467517-a74168d620cc4fb1b5fc96dea70b7e52.npy +04090263-4a90c8a6980c9b53aa6420fd028bc571.npy +04379243-56b7150b4fccf41355f46d55537192b6.npy +03001627-28b605f55e21acffaf88fb4321b22872.npy +04379243-456601c88eae2449f51fa0238791f5dc.npy +04256520-785b692194203f119fb4103277a6b93.npy +04256520-ff213b889d304febb6f5fb02f36f9480.npy +03001627-b04f736cd05361d1cf63f06c65fa88b2.npy +03001627-a749c31cee6965f33dc9e0e58bb697d3.npy +03636649-7e4905eb4670c6df2f939979b0dbf5d5.npy +03001627-a10ee4a0964f4ef9e3b9dbfb07aa21fc.npy +02691156-db5146b7695fafba78d7c0e1adfe122c.npy +04554684-d1aa6a6c230b5150f0ddc6174ecef5c.npy +02691156-58e7f5046a0eb6474298cee0ed15ce9.npy +03624134-464dfc36b0b340724b7644126b1d71e0.npy +04379243-8f3642beb6eb088d37251258858a7a58.npy +03001627-4a9ed043cb91fd91b04cb542e2c50eb4.npy +02958343-a5dcd1196a1ffa9739f20966eb25504f.npy +02801938-557c0c8dcc9d84b2250c527721570ba0.npy +03467517-21a517abc4729e6e352e5d4d2615db5b.npy +03636649-e1fedf82bf8fce9eb8b431083b6191e2.npy +03001627-4af5131ebc2ffc25ec7cbf3284585a40.npy +04379243-ae9e04d050f5cba1492d9da2668ec34c.npy +02924116-8cd0cc99910e471d3fc5ff9790be0ab1.npy +02933112-955a80162f342ab45d64ebd26708751e.npy +03636649-60d7d0e9c45368c282db9fca4b68095.npy +04256520-7afd499e9b3a2e0c1a90a4432f1af114.npy +02958343-bbaef5a610b0b4d5368f3995546e59c8.npy +02818832-22b8e1805041fe56010a6840f668b41.npy +03467517-c55430c190de1580922b76fa1a7a2ce0.npy +04530566-370ab590d5f9f6e12998de2923cbf8ed.npy +03001627-5ad3a3c3b67433174733824eae5cd9ae.npy +03001627-67fd2b1f102f4f76ec89626a4213fd07.npy +03001627-8df0910897498e764d183b64817fa09d.npy +02691156-5a0fe6557b4e2b9ea8e091cb544689d5.npy +02958343-fd7741b7927726bda37f3fc191551700.npy +04256520-a6d807661eec51a8c0b437e347e8066.npy +04379243-1241ec2dc5e59b0ec3bd24f986301745.npy +03467517-5c4ac761701cbcb21021cd55d164c0ed.npy +02876657-fdc47f5f8dff184830eaaf40a8a562c1.npy +03001627-5b0dd54eced22552b283c8c7333d797.npy +04379243-93aafe1aee82e2fadafcfea63f0b694f.npy +04401088-dafeda191170938ad33f96248c28a3a9.npy +02942699-fc83047701a0e21b901ee6249a8d9beb.npy +04379243-6a3c9ea7e4cc8fabb20aa91e9e90c311.npy +02828884-687efa006864f71d46c340938e2ff1c.npy +03636649-25427fc8b45e4c6370ad12dcb213189e.npy +03001627-6dd5e21ca65a9ff73c837ed50dd492e.npy +02828884-a31ab48a2b96574b9c3a7877712317b8.npy +04379243-1ca75076bcebfac76c3484ac7eef025f.npy +02871439-d8d3d2c777b12d4996b705a68a9174b8.npy +02691156-f1ef7546cc85a1815823df672991ed66.npy +03636649-61b57e8b5da8fb13d527a9a6f5a872b9.npy +03211117-3592a95cd54f38599bb952e15a37e248.npy +04330267-33cc4ac44ff34a789f71457a3f84fcdb.npy +02876657-7778c06ab2af1121b4bfcf9b3e6ed915.npy +03593526-a32fd1283c58bebda7f0dc86456c3021.npy +02828884-5e0c9babeb535aa4718e797a380b813f.npy +03467517-8e15e57014a36199e52028751701a83.npy +04090263-a4d66892876b5e0cb5acf79024643c18.npy +04468005-2158a6182c1be38a4b0b2e6e63122009.npy +04379243-fcc387cf43f5c63855931d119219022.npy +03948459-2a0ac4cb28aeea64eb127ea937b74f9c.npy +02958343-5785192c95cdd67b704715417c0f83c1.npy +03636649-cbe6d8fab4be74a11735ea0e092a805a.npy +02691156-b3dd0a06e7f727449a55c6af6f4b2bb3.npy +02958343-51c957fc4a2690ea7af49dac67ce8f.npy +02691156-eeeb30213be73bd14c3a35cee92bb95b.npy +04090263-59997a310b8fb3c9c1cc3f503d10007e.npy +04460130-4d1af8461018b714579e0a60e99d2683.npy +03207941-44d766f0954159773321831d2245cf06.npy +02691156-bdb7294dc4742b33bc0909d98a1ff2b4.npy +03001627-5c0d4cf28a71ad7296db593b49da23e5.npy +03001627-b4e30a512991aeba67903707764646db.npy +04530566-9f468767b1fd9285eb2c303a0e0d287b.npy +03325088-135cc2e885a4a46bc36fb70296e45483.npy +04256520-741dd57baaea906cb0449d422c1e5657.npy +03046257-93558e7f6f5ee9dea6a9ef34cf76a74f.npy +03797390-6c5ec193434326fd6fa82390eb12174f.npy +02958343-95ddaba8142bb8572b12ea83455b0f44.npy +03790512-8ed4bdaf0c8b88ea8b31e74d456742c7.npy +03991062-dee4dc24ecc3067f44c183864792bc2b.npy +02958343-1164dc97642a22ff5acf55f30acc008d.npy +02691156-12e127c0416f94ca4c3a35cee92bb95b.npy +04379243-b0e3b90a33ced56e2029d06c0cadaf74.npy +04256520-62a0f0734b9111084e78d6c405d01fac.npy +04530566-fda1e57da58ec9bee88464b900e0eced.npy +04379243-2add476bbc4144e57c9cc507bfc0f85b.npy +03797390-3d3e993f7baa4d7ef1ff24a8b1564a36.npy +02691156-6dd16a06f0e9a286bfc945be58e73eac.npy +03636649-fb8be091d77118ab90fd203f931c9af5.npy +04379243-23ece3bf871619366ff454af1e8947f3.npy +03001627-5346017af72c1843169d299c5f567c18.npy +02691156-3427fa8e6ea160f1fd138baf628cf158.npy +03001627-9ff6c78f309d55471449a39c0fb09f2f.npy +03636649-a90233920f619e03fcb8d8c6d4df8143.npy +04530566-24beb61e46bf6b1970d557f49392fb1.npy +03624134-8d8f91609580d8527bbfbed6e6c4dd29.npy +04530566-6d0c48b62f610ec0b90142192ec795d.npy +02691156-a1708ad923f3b51abbf3143b1cb6076a.npy +03624134-819e16fd120732f4609e2d916fa0da27.npy +04256520-bbd385cb3ee28279e3cb1f46427ab37a.npy +02828884-419f4ab8254c97a2056b4bd5d870b47.npy +03046257-7b4bb93293c880d3e61f61099b064399.npy +03642806-2c697db8a982242d54a8d8e3b6972768.npy +03691459-6c403ea54430684990146e2a0489a257.npy +03211117-3934f942bb0b462a90b6c749bc63f3e6.npy +03001627-bea846f692c8bdc8ce6fb1d4c6089968.npy +03790512-9cb038f61be71ed0cca5d7fbf4f17f56.npy +02828884-5b5be5419120ddbcb2a965e75be701c.npy +03624134-e8a6915bd0bcf1bebaa284808a1567a8.npy +04379243-797ecd23342e744bbff15b656f256f05.npy +03001627-6c0fb1806d66a9cc3002761e7a3ba3bd.npy +04256520-f8e0bc0d84a8f76cece93aa52d895bf1.npy +03211117-3017481ad6a978393eb1d3da560687e9.npy +02828884-4cb196a794bb7876f4d63bd79294e117.npy +04379243-c490945c032f5ca0fc0035da39bd5e1.npy +02958343-c3a1e04f49e80d22a10cf495b6dc4ef.npy +03001627-fa277e2693cba669731d11154716a6b8.npy +04401088-a523f6e5662f8f178ddf0e44d13d17e3.npy +02691156-e3473fc8fffca7d4d972c9dd75ed77d4.npy +04379243-c8f29afd512b8595b000f20a5153622c.npy +04379243-f8f36e7871d0e8382c026fed19c0d206.npy +02828884-b6b10e519fed3c9ea9d99888ae8a3eb5.npy +03797390-1d18255a04d22794e521eeb8bb14c5b3.npy +02933112-7f726fa36a428c0e11fc2b865c2a185b.npy +04090263-93743b9b3e33a272531756272f07b3a3.npy +02691156-983cb909846f4e1bbd46d022fd7d80aa.npy +02808440-e5c97c7b5cca57cb30f98136f75a1800.npy +04090263-b87fa4a82de9567af877f04737ced5b5.npy +03636649-1917888a2b6901091735ea0e092a805a.npy +04379243-54b3cb531febad83bc9f3fbfc126b5e4.npy +03001627-5a10fc10de7bd8cb8bd24d13dcc47e64.npy +04468005-51a8f19d22c1bcfcdc14ba0818ee5cec.npy +03467517-d9cd03133da5c44940c9c81d87cadc01.npy +03001627-d712f92ffb883fe6fbe6ed8d24e16d28.npy +02958343-77a170eab59d866d8a1aed4fb5fe5280.npy +02808440-fe59e0e02ca91956b362845c6edb57fc.npy +03001627-38a2b3491e8e8a0d490ad276cd2af3a4.npy +04090263-f6f254a6b02ad5268fc148cf8ab667ca.npy +04256520-9fd96a966aec6594f51f77a6d7299806.npy +03636649-6b42816b1e70429f61bcdcc7d95ea51c.npy +04379243-cca5144ed02e693f83ab30e82b39a93d.npy +02933112-19c79a42f68d7d444da5feafe6f1c8fc.npy +03636649-40c3135c95004291240cfa0649692c0f.npy +04530566-9feb86becf3f22f93df8f4ac45647158.npy +03467517-6ce23c82af30b629e8f705eb96ba3376.npy +03001627-7a962a612d7cd0feb7611322d07bb05e.npy +03001627-7eb566a254731d8871a782a4379556c7.npy +04090263-45c5c36e3736d3d64e868b194cfd912.npy +04468005-87952a04a88c9316a79fe2742d7899dc.npy +02933112-acee69c7c5517899af4d0096b3f9aa03.npy +03046257-f41e23b98991d0f535836c728d324152.npy +04401088-748f4a9aee8f610e8463cde8953cc1a5.npy +02958343-575ac5c53ab9fe21a26fdd1a1e470de9.npy +03337140-eb31fcf943d70e44f9d623e237698c54.npy +04256520-a0608ab77f25ae922b8f1e4489d2e1b1.npy +02933112-1971024c0cac65a824662341ce2b233.npy +04554684-9cd0227494eeaafabd2a8bf2cac51544.npy +02691156-d1e3bba19cb9447dcf6c095014f481a4.npy +02828884-7a0d913c66278596ad5067eac75a07f7.npy +02691156-1f7dbc112b7375dae0cfe7507a46f0c.npy +02946921-91483776d1930de7515bc9246d80fdcc.npy +03001627-6f37fb57f3da696265ba78ad9601cf1b.npy +02691156-88fe762bfda775f84c3a35cee92bb95b.npy +03790512-f959ea5503659fd33bd003e0bb7a3ed9.npy +03790512-d2f6dec6d70b111fda8b038dea29f4da.npy +04530566-79c98bef5c1870b64c55cd455710ca53.npy +04379243-4cd7d883aec1db86890992ddacc04113.npy +03636649-baf7b66d35abf0ab1735ea0e092a805a.npy +02691156-48d03ffabd0399f4303510f9a56d94fe.npy +04256520-e4066cefe0230cc7b2ccd937df5da28f.npy +03624134-e47774ba19c5aa99988abef1fd117e7.npy +03759954-c9fe3b38eb59689175a3010d3ada28ba.npy +03211117-3b01bed34001c78211eba86b475bafe7.npy +04379243-22ee7f1fdddddaccd78a975872fcaff.npy +02958343-1cf14b4004e1d2e22c6ce678c9114ba5.npy +03624134-d4be83e3062bfe9086bbb74f0f607cdd.npy +02958343-a0fe4aac120d5f8a5145cad7315443b3.npy +04379243-d4054b29b329a700490ad276cd2af3a4.npy +04256520-67d7f94aa2ab272bab610b0c94236463.npy +03001627-8d458ab12073c371caa2c06fded3ca21.npy +03001627-cca975f4a6a4d9e9614871b18a2b1957.npy +04379243-c7623649c8f34cab23afb61f25e1136e.npy +04379243-6f4c33b5becd1f3920768660cf080d12.npy +03001627-a592c3bf73afeb9294741031f62be2f6.npy +02958343-b2b2f4952e4068d955fe55d6e406ecd4.npy +02933112-2bb2456b272a23dc59350d819542ec7.npy +04379243-12ecd8ff5fee05c68cbb8bac2032149c.npy +03001627-2f2da13322d30ccaf4b6538438a0b930.npy +04090263-2a18722913244bc3c24d00518a3dd6ec.npy +04256520-17278f64413654cffebad4f49b26ec52.npy +04090263-ca012a47cf5efca23f9d84f9a87a44e4.npy +03624134-5663637633c938d1395331ebe4786cd.npy +04256520-42e06113efdedd0fbc19762eaa7ba40f.npy +03001627-b97dc64d0406c07259d43b06ede1b24.npy +02871439-de4168fe61b0968a7351a916a214ce9f.npy +04256520-755f23d93b06bc168cbb8bac2032149c.npy +02958343-ced46f74119cdb36a7fc8832cd5fa42b.npy +02808440-a23e7892bd3dc65b6f893b5bc716a3fa.npy +03642806-4ad5cbcfd2e2256414f029a400534157.npy +02691156-8d2903595298549959bf29282ea7962d.npy +04090263-f0b6875689fb72f6feafd6f06fc45258.npy +03325088-3c8af998b8d3336c7793996e6e93af11.npy +03691459-19b900dfc658cdcbd4b4ae2ff4c58b57.npy +04401088-2b48b14e226b131af3b2c084b195b056.npy +02691156-237b5aa80b3d3461d1d47c38683a697d.npy +02691156-3a3d4a90a2db90b4203936772104a82d.npy +03636649-47ff70265cba94df900cbe2c18fd90e9.npy +03001627-41660fd9cba4d5b72f4413c96d686e51.npy +04090263-9dd3d881c473a5323666119626b2af32.npy +04554684-1a23fdbb1b6d4c53902c0a1a69e25bd9.npy +03001627-d5bd6ea417eba6ce456cbf78e1e89022.npy +02933112-1c4e2879669e949e3fe047712e43e185.npy +02691156-7e10d8f0457cb48219ba010ddb4974fe.npy +03636649-cef6757831b4d9738c8f019f17f4687c.npy +03790512-db5b6c2f64fefe5b448c90b3a2fec4b8.npy +03001627-8c281caf626df58671a782a4379556c7.npy +04401088-6d053ef40bedd8fcbfa0195eb6461a44.npy +03001627-64ead031d2b04ef0504721639e19f609.npy +02871439-9a078a05f9ffff1b28f28448e3bb829e.npy +04379243-e13f70868bd5e3a08d9d8badd9c0cbf8.npy +02933112-39f7a4eb09dd695d46dbdd6b5b884b3a.npy +03691459-c27f121649123d0a51d91df189dc282b.npy +03211117-2ea0fcf4f443b36c5516f88085cb9af9.npy +04256520-124bead2c137a6d1f652f706160dc96d.npy +03624134-2cc5c29fe6e2d1e92e933547dc663323.npy +02808440-95ef936127865ae2a9a1691b6f98331.npy +03991062-e2276eb0322d1885cb2a965e75be701c.npy +02924116-6083ff0f7219d82d6d45d698c7dd7b29.npy +02747177-44a64fa7c3378f16de27b9aa1df630c0.npy +04379243-9c8c8bfbf77716f36b4fe272da0db543.npy +04530566-ab01205090242c7277945fcb3f0ff3f2.npy +02828884-c02649dad5a5946dfcb04979ea30d7e8.npy +03001627-5516e76a34984182b6f6d1d58b7b1311.npy +03991062-9d0b790fa24015c0f9aec59741c69cf7.npy +04401088-a7056690a5bf34d24ffbcf8cf904ca12.npy +02992529-6d053ef40bedd8fcbfa0195eb6461a44.npy +04379243-6af7f1e6035abb9570c2e04669f9304e.npy +03790512-aa619a9f4b2e200495ff232cd38210b4.npy +02933112-c55498c03c913177d200faae04ce3f8.npy +03001627-50415355dff6f4e0c2c1a442b53fa053.npy +03691459-e66486c1f5644e298a0181490cb73cbc.npy +02958343-c3858a8b73dcb137e3bdba9430565083.npy +04090263-b451d4091032fe57aca1893e093d31f3.npy +03001627-d9558dccfe8e3381e45ef4135c266a12.npy +04256520-ecad0dfdf6338cbd457ba044c28858b1.npy +02958343-bc9c588a00ae179fa2645d665a7d8fa.npy +02871439-3d422581d2f439c74cc1952ae0d6e81a.npy +03001627-bd9137fb2f1151b23def89b32cef8e45.npy +02747177-9c0847d6c42eca062846fa729d90e125.npy +03691459-b819ee65569e9da21acadc443e8b347d.npy +03001627-57b043906feef78fbeae145d587f201e.npy +03001627-2d75f86921cb919b88dcbe86402c7c15.npy +04379243-ba52d8aed2dd75bba75f2876a99ed045.npy +03001627-95d8553504c65fb4b770bfdf3ce10896.npy +03001627-d4b4d348cfdc2aa5f99372bbf9c0b8a8.npy +03001627-b24b70c9aaec3932cf577b918c6f725b.npy +02828884-7bcb67e77adbb19bed98cca8f0ccd5f7.npy +04379243-43ba3898894751d4a2be11b607ccaafd.npy +02958343-6d296f7fae3f7f34981c1fca8c617850.npy +03467517-16e71fc6e50d0e6226587cb13c78fb9b.npy +03691459-119d64f6de33ed4093eb0b4dff044a09.npy +04379243-96e9571393290511be52c3c71dbf7749.npy +02992529-ad66da8440023d8a1e929774f9727b5e.npy +03790512-c4e0be3db8960e7799c206f2618a97af.npy +03001627-4019d848076af6157fee47aa19e2e28c.npy +03691459-9dcf9b3c53f1cb135afcf0aaed5d73d0.npy +02924116-a47488463d1fea38550f48125b5f584e.npy +04256520-3b8f2b955ee9a904b3c42e318f3affc.npy +02871439-3cdcdefc72c3760596dd43aa0ec847c9.npy +04256520-65711cb0e57123e037b2bb75885cfc44.npy +02691156-1397f5bfd89673b21fc43d5b32fa230f.npy +04379243-c4d4d0cde7e39bbeaeeec543ce96f24e.npy +02747177-e5050955cb29144b907bde230eb962dd.npy +04379243-4788fa0af36e94ea38c2e72e63f5bbba.npy +04090263-1f4f948abd74399572e9add3b9371377.npy +04330267-69d2d6bab648bcb487dd60af81c93a3c.npy +02924116-aec4d33a26e8b959193d7855ecfc1bd3.npy +03211117-68e75f7265569b8ca2d7e4322f7f9e03.npy +03636649-54654f299bbf5ce4e7a1d4df7812ed0.npy +04401088-fcdbba7127ad58a84155fcb773414092.npy +03991062-eadfc9d3098273dd6ba14bfd91a75020.npy +03001627-fa4155f8091689a273801486f0f205ad.npy +04379243-cf37563a68edc94bd71ce74ab5e9c1b5.npy +03211117-d9960f7455676e94a0a7b8ecc42036d5.npy +03337140-aeb08906aded103ad61a2ba1b75d9b90.npy +04379243-ba311a09f08ea7899c39abaf208a73e5.npy +04090263-95cb92425673feac6b2c8bb96250e4a0.npy +04379243-e811612c42cf5c5ae0cc7e7449604bbc.npy +04256520-13568cb7d4bb7d90c274f5fac65789d8.npy +03636649-bece8f6d89e653e6fcb8d8c6d4df8143.npy +04468005-b8161eb1622da15d9762e982d16958a5.npy +04530566-a70c472cef0c354dba2abf2ecc57eeda.npy +04379243-84d5c290aa1c5c3e28d0a21d73b2739d.npy +02992529-280a42d54e91c6968a02f6ad0818c761.npy +04379243-90889a0cf4285ff4f46e6e4e575a5bf.npy +04379243-b7bab2a7986f34005268928fe2c1fae8.npy +02992529-d9d06d2772ecc526c0dc3ed657ab97f0.npy +04379243-14d6b4b09dfc54e9d679a95896f75103.npy +02958343-61bcc13c67a92542b6aab5f7ece0e6cd.npy +04379243-8d0390d8d66bf1cc30b07c64830a47f3.npy +03001627-64e440b5350da101512d71be7dbf2d60.npy +04379243-97bfeed6025f68de5fe8cd129a2c0fe0.npy +04256520-7511cf30cf10869b4f7ad0010e5a372b.npy +02958343-33ca3037b6dc96c1df7375fd56cdeb81.npy +04379243-de5de9cd2d952cc5278f90ef85162deb.npy +02871439-e5d5ee2194c108bbd295ae4632dfd941.npy +04090263-e8ceb645b5a82aad8e27654291ea5e0a.npy +03593526-de673ddf9df03b8278cf1a714198918.npy +04379243-3f682ce98ca01c85b3cf15c77de45986.npy +04256520-bc1b55a6807caa9b490ad276cd2af3a4.npy +02691156-2c9d5fed0ebb4a544c3a35cee92bb95b.npy +03467517-dc7708c870000008a24eeca91f583600.npy +04401088-57657c2b0d983a1658975870bb96a55c.npy +03691459-5775db2064a6b0e87d72888c0a9277c.npy +04379243-abd1518f823abd0ff51fa0238791f5dc.npy +02808440-247a755e3e86bdd254d7082b34825ef0.npy +02747177-f7c95d62feb4fb03c0d62fb4fabc5d06.npy +04256520-b543411f1fce1f30e6fe3612af521500.npy +03001627-877391ca125a5ad07a56985e287037f3.npy +03046257-84d1404385710894fe3e90bc90e90c63.npy +04379243-73eba3054b62c14b76c7054c38bb1311.npy +02747177-7065044631c0eedaad5067eac75a07f7.npy +04379243-1a23f3f25a8584cc49fc9876b157a42.npy +02808440-b4e2c11f4c01123933d9cf37f30825d7.npy +02933112-87e7c6e590eaab04f42a90fe4baf4591.npy +04090263-7da1ea50ed1445ce2511f68da65f4c4.npy +04379243-ff42855b8cd62a1060fdcc1483180fd1.npy +02876657-caa8379f21c74f611f058bf0578300.npy +03636649-1fcefc2c2ff00dd6c7c291dc7d41000c.npy +02933112-d06a1c6dc8a4dcdecb3bcacd97bbd8b8.npy +03001627-bff224175aed2816597976c675750537.npy +04379243-8b0e0e3fdf70192e484776fb236aef2e.npy +02828884-537a02eff282b33df58bc14da5676759.npy +02958343-3ea856c52fbb213fe151fba1241f1efa.npy +04379243-217a31e6044506f41b17743c18fb63dc.npy +04379243-f0e18881d2d01e91286a9d56d8187adc.npy +03211117-23f0e9274d835f2d75796bb36346e6ad.npy +03001627-813f2777195efc4e19fb4103277a6b93.npy +04530566-bec39afc5bad2dc45ef003dbb9fb9184.npy +03001627-c976cb3eac6a89d9a0aa42b42238537d.npy +04256520-377fceb1500e6452d9651cd1d591d64d.npy +04379243-3629fe311f6a83eaac8336231c53cd1.npy +02958343-6a81b52d03080172ea7256175786076.npy +02958343-ca93e4d0ca75ab1bafe1d4530f4c6e24.npy +04090263-e03a316409096ecb625f0699ec733ab7.npy +04379243-4b39fda4ce751bdaf51f77a6d7299806.npy +02958343-bfa5b41549e86f3c618e9d35559b7aa.npy +04530566-7cf500d15ff839e92f35bf9c34b31609.npy +02958343-73df85f3bb763fcf148474f05635eadd.npy +04401088-78b4f3aa956b52139531a714ad5bf7d5.npy +02828884-5f12f2a5d67a1e9fcb2a965e75be701c.npy +03001627-aa1e9626e1e23038cc0b9bf177196e52.npy +03691459-c3661475a6b1f7bcfbe246021081638e.npy +03325088-869d5441e74a94b3251c40136771148c.npy +03001627-3457146f11dab7eff3c9c1464e55d580.npy +03211117-2112d3266c05ad92d99bf9137e86c0b.npy +04379243-4d9a737a9ffa6277589aae130c1f06fb.npy +03624134-db33d647c8e9c8f9aa19ff1f7032d4a0.npy +04379243-f94e4eb78fa79d9d41578d1a851771d6.npy +04379243-a5f1b90f85d875f13afadfff198a630.npy +02691156-ad10ae20ac2e87a2adcbeb54f3d014e9.npy +02691156-6ad44d7abe7492b7d89ea85a4a66c0f9.npy +03636649-b474613907b293682f8b82e61bb347fa.npy +02828884-367cc7ed7b83b7c8fff16555386d173d.npy +02691156-effbe2683574dca2b37a6cf3f07b9ff4.npy +02871439-ad808d321f7cd914c6d17bc3a482f77.npy +03325088-a1b38345041badc5b362845c6edb57fc.npy +02691156-4635326bc4fdc3e9297cd7e2ef7dfa80.npy +02933112-d30e98009559150df27756ab62184cd0.npy +04379243-d03cfa4dfa08467f19620b61f6587b3e.npy +03001627-b9d60d124e24849d37b2bb75885cfc44.npy +03691459-7174c62e843e444286a8288f8ff176fe.npy +02691156-a2c5e769f19c7e97b7d7aa9b9ebcccb0.npy +04090263-c7774cf7e0e74fd2194ef2821d9a630e.npy +02828884-1b77f2fbf17f28e726cd2499b0c05f5a.npy +04379243-1645b28322131b6258c407efcf93be6b.npy +04468005-7003287f015d22fd52470de2774d6099.npy +02958343-9e2e375fd5fd55b02a9eb0f146e94477.npy +02828884-7aca4c47c6861f2122445e799be0f18.npy +04256520-629e4382f2d569f366b86624c235daca.npy +03211117-e09670b2d890f63d84e349450a5c51b2.npy +02958343-22bc49837550bed21e570d3da54bf9d.npy +03337140-96ba97564f5ab63191c352d02061b3f7.npy +02828884-86ef2d2a38bde1ebad5067eac75a07f7.npy +02992529-4a48ce1a067f686dfb63369d5dd85d25.npy +04256520-337b0e3fb3c00f6e6ff454af1e8947f3.npy +03691459-dd05c61250149ba5d49b96b9f2811c7d.npy +04225987-10b81426bea7f98b5e38a8a610bb08f5.npy +03261776-f90f01ec45ea95d65481d2ca627e43e7.npy +02808440-170cf39eca88a50e125fa9990176f0d5.npy +04379243-caee24359d445f4fac509329c62279e6.npy +03001627-3a123ae34379ea6871a70be9f12ce8b0.npy +03001627-ef463d298bb401b3ce1493daf6a835b0.npy +02924116-4f934ef7f9b725057d5938f6fe09fcd7.npy +02992529-6a073661711d8b9f1a5b805dbbf26206.npy +04468005-574ae16c1b6cabbc8a3f1a8dd89692c6.npy +02828884-fb9775e4ada511d7844283a0969502b7.npy +03691459-4d165a6accfad3d36f18f54fab5ec8d.npy +02958343-89edb3d434f4c983afe1d4530f4c6e24.npy +04379243-94c0ab5650ea392ddcfcef693e7ec696.npy +04379243-74ade89963828a37d94ed55f750426f.npy +02691156-85a15c26a6e9921ae008cc4902bfe3cd.npy +03991062-bc37a3aaa9651aa410897bb36a0ea9b4.npy +04379243-2a2d4bc0c2ad2e7e332e588d1e0957a7.npy +03001627-c06a8f95fc273106b0f4a0d43d1e4c23.npy +03211117-12c64d690700ecd2d25ca1a27cf9bdec.npy +04379243-db96923291ea465d593ebeeedbff73b.npy +03211117-ba0f98e212668fdd22532be027c41b0c.npy +04090263-f1938c5ed63aaa7c91c108af8af49f8f.npy +02773838-e90e27c3020d25dd76bb31db0358e9c6.npy +03001627-f4268a28d2a837a1167c009da6daa010.npy +02691156-ce337df2f75801eeb07412c80bd835.npy +02871439-64eb95e3fd7cfdf759bc1c69ff20e0.npy +04379243-80a86204247b30fd21ef666e979e4e80.npy +02958343-b4715a33fe6d1bb7f63ee8a34069b7c5.npy +03001627-9e9697da825cbe4b3002761e7a3ba3bd.npy +03467517-5288448a001ace0b47a275fea6658912.npy +04090263-d9c6c64bc9b2c1e0a5dd675711905b91.npy +02828884-7acc1a370dfcd3a85ff6fe84f53e00a5.npy +03001627-a3e3eee0669bec82c9f016d57db96408.npy +04379243-47f25d5b367326ceaaf15b62af6b513f.npy +04379243-6ff63214c89d65d7b87028a4b477349f.npy +03624134-954fb0819736737a1b9c8e2fdbfc1118.npy +03938244-7c94c3ede6a3d3b6d0a29518c983e8c6.npy +03211117-2eb15877e9ae80d1d50505ee01b106d8.npy +03001627-226927edcf014278cb94e5b490ba717a.npy +04379243-be5349431760322c7b7b1bcdebeec13d.npy +03624134-2e9a0e216c08293d1395331ebe4786cd.npy +03761084-fadfea8610d0a2f839d3717288022c20.npy +03642806-fae8d4929159d0df7d14ad32b7473fd2.npy +02958343-713b7eaeea5580af1f71b98bc1f8bb06.npy +04256520-fd1ca30eda9a2163e2ca61e91f2755b7.npy +04379243-332c75b56c4a80f77ff6ace05b36a5.npy +04256520-8188a091928db3cb489883f17c1c79b8.npy +02946921-f4ad0b7f82c36051f51f77a6d7299806.npy +04379243-1c679d8a4fc274f47523f50a56d94935.npy +03046257-1b85f3cd227da31de4511d9a59e40339.npy +02828884-4e4b38efc9345bc3cc543a6b1ba2fd1d.npy +04530566-56e2b7332f9011b28fecb9f40039f353.npy +02828884-481885f3ffe14c40665f42dc26fed092.npy +04379243-2b68cd4ffe443506abb564bb0657e0d6.npy +04379243-a78bd5277a6c03cdd3726fd70b88cb7c.npy +02958343-c5079a5b8d59220bc3fb0d224baae2a.npy +04090263-fe9777c5bc60bc393554ccf8c30febe7.npy +03991062-756cc1276b4894682271466eed05a4d3.npy +03337140-7cf0301223e59976e7ecdbe73ef4323c.npy +03790512-fdb6223c286cb653cc9e7530f9d8e186.npy +02933112-634fe05a380adac585430ccbd2632877.npy +02946921-11c785813efc4b8630eaaf40a8a562c1.npy +03046257-18de33d37e409ea296791035e86a30f4.npy +02992529-fabcaa4858df16e35817e30de1dabac4.npy +02958343-aeeb2fb31215f3249acee38782dd9680.npy +03691459-e7560ac665c6fedc7d54ddaedba43004.npy +04090263-6834350f16324d0527d7c45115828e34.npy +04401088-a0efaa2ba04bf091adbfb30d8d1b297e.npy +04379243-55accdd4bb5337db5cb8c3b627244050.npy +02924116-b743b94f562fa33a7c3c6f82a395b347.npy +04401088-359be05b5042209a502122ac3599bb74.npy +04530566-9e49192ba54ab0fc92c108c58096cae.npy +04090263-846075a4b76fe0c3052214d75e02efc.npy +03467517-567df77255c293b3352e5d4d2615db5b.npy +04256520-dda3a0ecc85a337a593ebeeedbff73b.npy +04401088-a434289b281e629b81139543c959a70a.npy +02828884-23c874e54f1f9f152d07d128adae16ff.npy +03211117-8359589eb5c647a61f571c9e890db987.npy +03467517-79e1607ac6676f3a1ae1027f8632e61.npy +04330267-27cebdcd07cf90aa500158c23c4c5a8e.npy +02992529-e55c20e95bf299b5fc4d1dd4278b31a5.npy +03948459-41bca1dbde9fe5159220647403cfb896.npy +04256520-b918cd058e822e00cce02970cdd7e7da.npy +04379243-e2312615b21d7690c4f22423196a0dd2.npy +02828884-22031fe0420834a9ad5067eac75a07f7.npy +03467517-3e4bc88d2f2456f4ac705d0d37f5ef0d.npy +02958343-e7f94161bd90444f8cf4cf458d5ff7b.npy +02880940-4017528ab5816338664b3b9b23ddfcbc.npy +04330267-89550f9f628589bd3e65b46d4ef6236d.npy +04379243-54bc0f4268150dfc616626762e4bb71d.npy +03593526-c0d3656a60fc5e3b16acbecd8bf6925d.npy +03211117-e65ace5f42977a75cae346657a37ed71.npy +04256520-70e157cf567eb3aa79b26024bd30ee26.npy +04379243-fe38d140fa386ed4c434c6fce2e7773.npy +03001627-4217f023367a28b06747dd1c5ab1ba16.npy +03593526-ccfa627a398599ebde03ab2a27ba7531.npy +03624134-e199629e24c10052ed9c5b25fef60d04.npy +03593526-189996124312ea7430612f5c0ef21eb8.npy +04379243-ff32ec299e6c37e767d783b4714d4324.npy +04401088-9028fceed53a144e10bc2436075f6a52.npy +04256520-cd2a6bf7effd529de96ac0c4e1fb9b1a.npy +02828884-675f7c94f5422ebe9e4965f0106e00d9.npy +03636649-3eb6c3bf89e5c9312569f5d050e29bc5.npy +04379243-3d38d16334e796526f3d2b1b15fba494.npy +02958343-5e5d7901f587c39726d36807b4d406ea.npy +04379243-6ec67ee0e57282c01e6058fbce2703bb.npy +04379243-9da75bbb92f594f19cd431573238602d.npy +02691156-23fb92d8cc0f8ac4def547874c3364e3.npy +03624134-2514540f36b2ced12f8c68dc62edc38.npy +02691156-1385305478499e6c1e06124bec25a766.npy +02933112-1fc8231114fa42a7c59350d819542ec7.npy +02808440-2272656841c3c84a61c4f2a9857347d.npy +03001627-47d13a704da37b588fda227abcbd8611.npy +04256520-aeff3da4a02a22b07b0278d6b5ba1920.npy +04530566-ac4286c2e92e3367d5ba5130450bf929.npy +03046257-faf4bfc17b75a160af04fb2a17e783e6.npy +02691156-2af93e42ceca0ff7efe7c6556ea140b4.npy +03001627-577d1c446658fdc7ebc935c637c3e3a0.npy +04379243-93f7c646dc5dcbebbf7421909bb3502.npy +04090263-f5a1080ff36f7b8c38cddde805fe966f.npy +04379243-98b0b99d86a2342b2b23d7805f9b288c.npy +02747177-4117be347627a845ba6cf6cbb9f4c2bb.npy +04090263-3ddd478e24daf437f99860cd321d6c67.npy +02958343-6fd6bb6ccf11968c5242705df8faa8e5.npy +03325088-75400f002f5ca46f275e59035e1ccbda.npy +02808440-a1531938a8f8c32b6e1f781c3bfa1222.npy +04379243-98ec86d721b235374d18c1ce5fca6777.npy +04379243-3297d1740b06d444855931d119219022.npy +04530566-605b56aa6a4c9ef49f1deb04fb8ae481.npy +04379243-380f9d534e139af5dde0caad53ba7e0c.npy +02958343-f61888bca4392106bc790478b4a84bf2.npy +03001627-77b457b102a9b82f5dca6305fb9f97ca.npy +03467517-ffa8015ea7ab2e0b900fb9e135826c5e.npy +02691156-a73231f3d0342db94e8b48a4c01e36f8.npy +02691156-e452189bb7bd6617ef7cbef6334698fc.npy +04530566-f99537c4b6d50126d87c63d8b3018b58.npy +03001627-430f87764dc3f455ad484915511ccff6.npy +02876657-3108a736282eec1bc58e834f0b160845.npy +03001627-7929676e756dcd41577b5d737869717e.npy +02691156-d80afa36aeb72c552b5147716975ed8a.npy +04379243-15180f731834feeb2f0a9a342c0178db.npy +04530566-5d0d84924e96eee6b6162efbd23a9d5f.npy +02992529-9e5b9dd860689c5c217f93816a639386.npy +02828884-edec9a4512b98f6f2056b4bd5d870b47.npy +04401088-cea8f15682797fe6eb386a4e845c05f5.npy +02933112-2dddaf7774fd11efe4d4a3bf05a8b705.npy +02691156-1d09583e9236b8d149d860a48be37092.npy +04256520-3dc8e7cd623f5aeb65498947b67a3f6.npy +03001627-4275718494dd309bc7d25fde6b97816.npy +03001627-92db07d09bb110386bd0aad3d992cb54.npy +02876657-ac7e1eed3c4ded7db3010b85c6cbc688.npy +02958343-61bbfe43afb10fc8360bb9d5bffb2354.npy +02958343-e2e9b87d7aba1dfb28044fe9244db50a.npy +02843684-ba88e788ae3bca5e84ee0c32fc6ec7d3.npy +04530566-d317c39473534f97b1bb46d2556ba67d.npy +04530566-2340319ec4d93ae8c1df6b0203ecb359.npy +03636649-d1aed86c38d9ea6761462fc0fa9b0bb4.npy +02933112-1f1484649f0b2d9f6820cc0e7030e15e.npy +02958343-ef0703db8a04f8c0c0e3666c7d0ec7d0.npy +03001627-4a671498c6e96238bf8db636a3460ee5.npy +03636649-3ba4b7bb7b6d89415461e7d030e03e48.npy +04379243-4fb3b350f197a7e64e045e9030a39002.npy +04379243-a6311f0c2108867aee18bc48b60b36b7.npy +03691459-85399d0503bc8a5b59a6208793b9dfca.npy +03001627-bc76dfa9e0a91e131e06124bec25a766.npy +02691156-3fa511e1882e41eeca8607f540cc62ba.npy +03691459-af97965ad9dc0ef01ad88f716ea80910.npy +03046257-c805c00b467a90227cb512ba2d8dc1ab.npy +04468005-7adc8184ad679791e810c01b1498aa2b.npy +02924116-869d7fde444e238d87cfb85cd974d515.npy +02958343-2fc27dad23406a2a7ae33d942430658c.npy +02933112-c07a52687cad81a4824662341ce2b233.npy +02992529-8b4d28e4df5ac6e8656557acf97c5e2a.npy +03001627-49e920c98895f90281a172d69c52a28a.npy +03046257-83255e2f9b4f039372f8ff3c650e385a.npy +03001627-9663b0a707ba9753983e0ae0e9b98f24.npy +04379243-1ad0e2f815c6f242d197f67767b32741.npy +02828884-c9d456bacf459248930524909158355d.npy +03467517-c651a91562b86ed8edb9371445f615ae.npy +03636649-330b05e262c93e216078c74a96498820.npy +04379243-7191fe8893bb6a89b5b7c35a8e7396f2.npy +04379243-b2867d5067f44e0d6b1cb83d86c19bfc.npy +03761084-86bda959021c63b48242cb5dc48c7177.npy +04401088-5681c4fec43043c1a9f85d9079e13c55.npy +04379243-175c0be26d0f2e916cb0bd372b0960ba.npy +04379243-262f3ee836b6b023c5beea20858a99d5.npy +03636649-2156df35753fc26c6e285dd101afcb51.npy +04256520-3aab3cf29ab92ce7c29432ec481a60b1.npy +02992529-cfeec23a9ea66a5021844676433a0aca.npy +04256520-103b76b2594a1582eaf14273fa406ffc.npy +02958343-74b37c2f88e0ef7a469bb3d27ee3bc4e.npy +03691459-d2553e5fc4f1527cfeae521e94848af6.npy +04379243-be8a750947549c7555f9913e822d5318.npy +04379243-adf9117f3cba509cb4e3935c6cee4b35.npy +03001627-7772a25ce35049881dff5c2e57ad46e.npy +04401088-2acc3bd87282a7e31da45817bd55c1e.npy +03001627-8f4750616cc16a3f84633b41c8a09fa0.npy +04379243-202e7b5c3ec079e299e8bf807e902261.npy +04379243-61ae29ce7a0d71bc57f15fc9385a8a01.npy +03636649-afb7cc3bbc3595a4e9b3dff83c7ff715.npy +03001627-e015df603fbf0852f58087d377226538.npy +03211117-8893ff22c6dae8e3a276bea9ebd065c5.npy +02933112-4dabd28be1615419546a56a24fdd418a.npy +02876657-5d6001f9e6a15de3e3edb5ba52088f8c.npy +03691459-bfce87b0ea79c8aa776400d171cf9dfa.npy +03691459-8ae34239b6c46afd55a4dbb6a97481d9.npy +03046257-813fc7bf6c5cc031fcda1fad26dee92d.npy +04090263-af727bd232a8f1f4c3d83d64958925ad.npy +02958343-a03c7c73c067afa9e5bf84cdd88910df.npy +03001627-61eb0af11765544ef91663a74ccd2338.npy +03001627-3c27660aacbcf99886327adaa986dff.npy +03593526-5e61ce9dd25efc97eb7b988bf4f0d1ef.npy +04379243-36a14a47b91d7c42f51f77a6d7299806.npy +02933112-5413dbc1844cbed099dd23ec22c4943b.npy +02801938-b884587324a0cb7a643af06537e992c3.npy +03593526-57c542a72c735adb7e2297b5fd58c53e.npy +02828884-a968b5d4ba65b1af155d75bbf62b80.npy +03211117-b2257460f3465f76370c049e2352d133.npy +03467517-d05fcd42a07cd11dd57700c05b1862d8.npy +03001627-56d06d2b12a40bebdbbc9440457e303e.npy +03337140-4563c70da4aa13814c3aee8e9d3a6ffa.npy +02691156-e8e1b765fdf5edfa14c19f41d007670e.npy +04468005-ebe70e10c1b17c91616c9d4a76208d49.npy +04530566-965153f3599a6ed6be7ca2216dc1576a.npy +03593526-5c1128439ea33c8398910e50f05b8001.npy +04379243-cf1a7653c10aaa0eab610b0c94236463.npy +03642806-21e03f21a8724ab5bfa1d058f8ea2f0a.npy +04379243-8069dde16a0f987664b3b9b23ddfcbc.npy +04379243-39a0cbf3e4b34ca44499f83a01888ef1.npy +03513137-8322568841b84054b581f592cbd3b472.npy +03948459-d4705e348edc0e405f4103077989355c.npy +03513137-c354dab2bcbe9c68d6d40d1978baee1c.npy +04379243-18cc2e8b4034da8fb20aa91e9e90c311.npy +04379243-a10406dec2b6e9a2df81d783214232f2.npy +03261776-724c6fc81a27625bb158ade66cebf744.npy +04401088-e458abdbff34fefe255591a17641445.npy +03001627-c4a4710012ee39bd19f4b416b31c46e0.npy +04379243-2acce0e402725f80ece694d60a812f12.npy +02828884-188a2c6c2add34399dcab1d3e38b3b70.npy +03211117-3de6f62a6faeb80933e9820fd7ca74b3.npy +03001627-465ea1eb1c76c1478d1fe8cdc415f4c5.npy +04379243-1901183525f0063d2822b5101b06e070.npy +04379243-32ddda038bd1bc15c3bd24f986301745.npy +02808440-841e9b3d40aacec23d89f1ada385db86.npy +04468005-bcc41de06b8059f5ba32f71f79130dff.npy +02691156-ffbc31352a34c3e1ffb94dfdd6ddfaf0.npy +04401088-f75e6866c8965374f1c81a6df84170c9.npy +04554684-41f9be4d80af2c709c12d6260da9ac2b.npy +02958343-ed91b2509171fdc1c48492b454f1615a.npy +02808440-da7c0e8e5a2d87f190a2f7468a138e7a.npy +02958343-1713a1ac8aedcc522b12ea83455b0f44.npy +03991062-2d97e5970822beddde03ab2a27ba7531.npy +03001627-ce8f3a0c0c0bb0b9b20716e5484f7807.npy +03636649-5c9f3efb7603bd107c57db67d218d3b9.npy +03636649-9b876bb9de59e5e9aceb781f079a299.npy +04530566-d3c26b292a4a6a82621153a3cbe4a77f.npy +03593526-94f4ad8b9ef500221952fef39dab6347.npy +02933112-2856634c4c0551a814038d588fd1342f.npy +02691156-157bb84c08754307dff9b4d1071b12d7.npy +04256520-f080807207cc4859b2403dba7fd079eb.npy +04379243-7653898ee4d8173827edb0fd78caee34.npy +04256520-19f52379f01878ad9517a37c9996fdf8.npy +04256520-92ee5842113109b05550af5454dbad36.npy +03642806-5363c4a882e17c9088557758112e80be.npy +04379243-5e0b6969f252cee2b355cfc2bfa121d.npy +04379243-1af5dee23444c104fff16555386d173d.npy +02958343-3026dc837dc5dd7a157e36ecb370d387.npy +04256520-69e983e816774aa01b17743c18fb63dc.npy +03691459-1742419bf5a54be3e1a894502fdbf97b.npy +04090263-2632b2d716be1677914c738e92faad58.npy +03691459-56e2847e61b36a134c7bf604b18af84d.npy +04256520-e596ed19966b698c10edd100dffd8d85.npy +04379243-c363667046c562c7d9c568a52c35ec71.npy +03636649-3f7eb5ef5d304040d847cb32379eb854.npy +04379243-6f7260eb15f4531348ca89b7a9405654.npy +04468005-ec0dc5270b3e1fd4a5e12deb37e3ef08.npy +04330267-a46e0c10f17f928ba2bc8d1e386113dc.npy +03691459-f5024636f3514eb51d0662c550f8f994.npy +03211117-5f0119e9c7f437ff83361808b78d50c3.npy +02691156-1d63eb2b1f78aa88acf77e718d93f3e1.npy +02828884-d8b87f36fde3f2f3bc5996932c1238cd.npy +04256520-9294163aacac61f1ad5c4e4076e069c.npy +03636649-4078ba4cad280d72b8b431083b6191e2.npy +04379243-8bd48b85e15e23e162c098c9081f25f4.npy +02933112-63cb49d18eef102a5c910a98e42d23d.npy +03691459-5da2a1ae6ec64155dc7dfac1f2c9f0d4.npy +04401088-ff8ba237ee9164c8ff86292618094648.npy +03636649-ed2f272286506a5786e8e92cc08146.npy +04090263-5ff5a86fd864ddcaf0e1c0df18936d05.npy +03001627-b0fdc43b0b4e990719abd93be2967664.npy +04379243-d62f718a14db87cdb40f0ac0fb9a650d.npy +03001627-412b79b2d0572c6afb76895427c01995.npy +02958343-e1197a4adc50d16abecf71e2e014ff6f.npy +03636649-9150920591733fae0fa444666ebe22d.npy +02691156-619f0ed9bd92778e1c6bce26aea93f68.npy +04379243-f0b044c592e19f3d8dab161b48d8b921.npy +03001627-780441a4b2e033f2796c584ff1fcf56d.npy +04379243-10d9b52541550c909cd431573238602d.npy +03636649-ed81fd0ffffd360638e74158ae3d41a0.npy +02691156-350110d2828b3b927370804727e72eb2.npy +04554684-1a53e51455e0812e44a7fc53aa1d411c.npy +03636649-266d6b136cba49504b3c42e318f3affc.npy +02958343-a3e1cb03e1af7c6161c6c61410fc904b.npy +03046257-3edef12fcf087125868fb986bc092533.npy +02876657-e593aa021f3fa324530647fc03dd20dc.npy +02992529-1c3795fd5c4c0a3c2efb70bd2c052734.npy +04090263-6c82de0208ed0f551ff1879fbc41d0b.npy +03636649-2ac3425dd13590ef1f9097f35cf9fde9.npy +02691156-b55748e796006e18b3f627c3cfda6efb.npy +02958343-bfae73d79c066a1fcc0c0cae12126488.npy +02924116-22f056f45adc9b81cd9505c17c2fdd7a.npy +04379243-62f7c1abde6bd25e601bea3dca268229.npy +02933112-c54828598efd80d78542f96306060db4.npy +02808440-93818961a43764e23321831d2245cf06.npy +03593526-e3fcf5ec83e5fdc54b3c42e318f3affc.npy +03046257-23f83dd607100e84b5c397b37fbf4059.npy +03325088-90ee4a3d500e4ca4c36fb70296e45483.npy +03991062-762ff1483169859d44c183864792bc2b.npy +03325088-f1cc1b5b92f010a73321831d2245cf06.npy +04256520-e3ce79fd03b7a78d98661b9abac3e1f9.npy +03001627-4966ef665c6ed17d4240438e2a9161a.npy +04090263-6571520aee22fe52eab5ee569c9de1b1.npy +03636649-d2d645ce6ad43434d42b9650f19dd425.npy +03691459-f858ecde18c5dae2f398d0c5832df00e.npy +02808440-189c1ffb58c74c3bccd0340812259a39.npy +02958343-3129657917191e101f0d59cde6139796.npy +03001627-8e93fb99aaf17b9504ca5aa564aebd0.npy +02924116-27f138cd6641ce52b038a1a418d53cbe.npy +04004475-b2ff768db80d2d723e6c258d47d0b669.npy +03211117-d8b955cb8ef35cd22f2d2270d816bf3a.npy +04379243-ca7bcac6b92b5a7d377b9297f3055210.npy +03636649-8261f96cc33ddb264a7f20ad39e7a642.npy +02992529-b91bbf0a0d09d2eb243525d45e430520.npy +04401088-ef34d9789a83659c9f8f9b52e89f6554.npy +04256520-bc8e9f4d4076ce4f6b4675882670d943.npy +03001627-d50b0c6c006936f8de03ab2a27ba7531.npy +02828884-1c47c37d6c785d4fe7fd9a18c19837e5.npy +04379243-211d17b0424b10c539d3717288022c20.npy +04401088-831d6d9118e1a2fb71f2e8f64dc1f509.npy +03593526-8e7b2732b637559976fd405e95f98511.npy +03337140-5ab4826be1de80dab7a33532f4904aca.npy +04004475-1d2a6082238f011c22d3f170937c6a0b.npy +03636649-84b093611cca35f86f104b4f395219ec.npy +04256520-3aba6ceca44f747b29a72cc7a32af9e5.npy +02818832-1f11b3d9953fabcf8b4396b18c85cf0f.npy +04379243-a44b3e23fa01c205c3bd24f986301745.npy +02924116-43bab6803534b01f52470de2774d6099.npy +04256520-d4a80e7a92e2c4f98981b7cb87854e68.npy +03636649-32e9d8a4b5a141a2615efc34c3b36ef0.npy +04401088-74a65213a90e1f2d850a112e6048afc4.npy +02691156-a00ed5d078c6244c37678474be485ca.npy +04256520-181f594fb55e7d811b17743c18fb63dc.npy +03001627-5ee976518fc4f5c8664b3b9b23ddfcbc.npy +02924116-183c1ef7e783a05a8aa27cedfe9e8bf6.npy +02691156-5524fd6b35f47d5ba8cba409c4409ba9.npy +03467517-2dbc73ad4ce7950163e148e250c0340d.npy +04379243-449c32cd053b97ac623f20df7a811122.npy +02828884-220ab2896e0b5d87dae58dd9656897ad.npy +04379243-5912cbf7bd756d3bf51f77a6d7299806.npy +02876657-ffa6c49aa8f7ec19971e7f8dbfabf375.npy +04256520-2eb0a772c36144eba3f22b4b00de6dfb.npy +04090263-54ed1b7f842914285488420adf4edfd0.npy +02801938-b9a555f6ce431c8a3adfd94cc5954055.npy +02691156-fa4e8f24d7f0ae1cc1ccec171a275967.npy +04256520-62b02c1b27a5793fef188758bf2e3a30.npy +02801938-717f1009cff7c62e741621be11e9d307.npy +02818832-5cdbef59581ba6b89a87002a4eeaf610.npy +03928116-9b3fde7f4559be2363915d3d0e86b8e1.npy +03636649-5ef8a1aeeb1b25bd63fba60e6c90121a.npy +04401088-a1e51e185a9f24354b8478bdb97333d3.npy +04256520-d28912450f62b4efa8699b6183baa203.npy +03636649-5d45d41ee7fea0187cbb0b604dd1148d.npy +03636649-a5fc64e1faa85794de03ab2a27ba7531.npy +03001627-1c2b230840baac57df3c82bbe2e3ca02.npy +03467517-4590e640c4828cccd57700c05b1862d8.npy +03211117-20476424cf10985610b144a5a224780.npy +04330267-d98da0d1b24f509d6134c153bee8ea0.npy +02691156-396c8e232192a44be1a9c234926c21e2.npy +02876657-78f5db072e28145db1e647730e72f91c.npy +04379243-d14dfaade3e105306ebc5c7b8e36e351.npy +02958343-b76bdcfc277f54007f3efc94c2d31dc5.npy +04090263-a5f55a60971922fff3059fae889f5fb2.npy +03001627-700b11e2ea3e941faffa8ecba9b9d6f4.npy +03636649-ff43ef647c75b5a4fcb8d8c6d4df8143.npy +03001627-c9288e09458ec0e9bbc45ba666751519.npy +02828884-b852e63ad5983f1a8ccde000e771fc1a.npy +03636649-bf2687bb57e94f4071d7520e3757f3e9.npy +02924116-b4ad2006f3c6e09adab8f5f5224d1d8a.npy +03325088-fcfe9beedd2970f3b362845c6edb57fc.npy +04554684-d78b4c3dc263a8f9c5243a0ab191990d.npy +02691156-1825c91c5f2da4bab12962b43f188cbb.npy +02924116-d48362c5a290701f78194ea2c3f9c38b.npy +03001627-c41fe0605cfe70571c25d54737ed5c8e.npy +04256520-f23636645d46b743ad4f8dd77b0e70fc.npy +03691459-b2ed74172242cd805b2ae1f253050025.npy +03001627-7aacb2d4940e1af772ee08e78374a212.npy +03761084-5f51f5e0607167b4178e7d331e641179.npy +04379243-e37262abd76852ac00ee852f6d8aa3c.npy +02828884-8141d9182908d7288be87af3b9c7b4c7.npy +04256520-79745b6df9447d3419abd93be2967664.npy +03991062-c19c6178ed0f6f9da989559b7c93527c.npy +02691156-820c903c55d7a1908f0d19519a0ef908.npy +04379243-3889c517afd62ac5dbe9c90af547c85d.npy +02747177-5eea24527c8b3124cb2a965e75be701c.npy +03001627-b987a2ca54c6ddecb74697ced5978572.npy +02691156-3b86245a5cd388ccf12b4513d8540d7c.npy +04256520-4271d43fd97a7baa591cc7aab9026e54.npy +04379243-cb87512d706828e1e95cd0dc8c2f0e83.npy +02924116-6c3e80092fa36371cb2ecbd32dc2119e.npy +02691156-e41bbd12896cdc724d210d9468aedaf2.npy +03624134-d78c656d1847b92ddadc002e53eaf226.npy +04530566-816efac46f2f3c99452a4c76a476a0f6.npy +04256520-3f8523f11a622d8d6983f351200ac6a.npy +04256520-19192524e6ae1e85cdca798c54fdf54a.npy +03001627-2ba1779986eb9546f51f77a6d7299806.npy +02992529-6f63df7ca322514f41ced50d3a574698.npy +02958343-d22cec9b9f500ade28e9ca8e8fb04e0a.npy +02691156-8b9a404737736ece774a720fca15e35b.npy +02942699-2153bc743019671ae60635d9e388f801.npy +04468005-e5c8853f28328d0c2511f68da65f4c4.npy +04256520-f6ccf5b4afd9171c818b86d9fa7a616c.npy +02828884-32b62bb2758b4c7fd2b12aa6a0f050b3.npy +03001627-7a79745b6bba49114ee3d18ae9bb4bb.npy +02871439-d616e70071825c91281816ff6b8d922d.npy +04090263-41fd7683b4e722b716b34c3751bc447d.npy +03513137-d516787b65d08365480514d7f2edc0a3.npy +04004475-c2579f3b815ca02d9318709b609c3a71.npy +04379243-e49b95f478df00bedbbc9440457e303e.npy +04379243-4d56ccf8487a0a64fbd58bd1e0b7491d.npy +04530566-eea06d3bf1f7ce6cb538a15c6737824e.npy +04256520-4f863fb727ffab64ffffee5f2b1293da.npy +04379243-a5c6be40bd9332e873d4ab618ffba803.npy +04090263-173dd045c9da9aff6099a039722df68.npy +04379243-fa0580ea9b8940dfef1b7984700142ff.npy +04379243-bbf0968957f58e78f00f21861968ae14.npy +04379243-8ca1fd346eb62580ffc6e457221b9271.npy +04379243-5fbbdc1e83a45d258d1c65d617ea0b5e.npy +04554684-8c122f99b5a0aa047ca3f903b5926fb1.npy +03928116-6806f3e6e973f715c114a8120a565776.npy +02691156-2a856d0462a38e2518b14db3b83de9ff.npy +04379243-99737ff619cae25d6effbd64ad6b71b8.npy +03211117-d6039aa6de8b5992af6cfa169befaf46.npy +03636649-d6ebf710756c5839f8d3a35c7c106515.npy +02992529-7fa841359a3dce3dbcb8492ce3867c34.npy +04379243-2b39330072a4d5c83825a5bc524f67c9.npy +03001627-5fdb10483f79355581f5ac91b0c9e99b.npy +03211117-d89cb5da6288ae91a21dea5979316c3e.npy +03325088-840c861dd22947bee3f7a74e12a274ef.npy +03001627-3e80bf14b5e02aedeabde033450b7299.npy +04256520-2459280764bc155554a99e49f597fe94.npy +03636649-9de2685230d41d58c397356311cbeea4.npy +02691156-7932eddb8032b6f1e4d2773f0358b43b.npy +04379243-38d5b6ad3077e8b1caa22a10624245b6.npy +02958343-100c3076c74ee1874eb766e5a46fceab.npy +02691156-38edc8fad5a5c0f0ac4f72bf08dc79a6.npy +03046257-3182826d3c212720c4440dd41b08b3f4.npy +04379243-ccb1c5fecc863084391e4d6c585a697a.npy +03001627-39c629e6f9e752964c6ea7add0063fc3.npy +03636649-b736ffab5afcc08ace1d463bed0d7bb4.npy +03636649-52cd206dd4674bbd4fbd95145f67665c.npy +03593526-99f6281962f4b4e598910e50f05b8001.npy +02924116-abbb6509d2f4662452470de2774d6099.npy +03001627-375dd87b163dc8a3a3c9394112c76917.npy +03991062-28cdf1c93d91dbc671fdc118f95a3db8.npy +04530566-63d91bce2f3d26abdeb3e56da26a6974.npy +02958343-584a78bbf7932674d4fdf31cc2d78fd0.npy +03046257-b4604066f95413ffd2d25e908d9cfaf6.npy +03001627-ba5054bd7c2598ed832fe5f29a662936.npy +02808440-72685559e732565bc394d70fcc44879d.npy +02958343-2525b83c84bd3afbde2d51ea8231791.npy +04379243-23d68e01b77089ae76ad4f5e7c7020eb.npy +04468005-afbb150345afadb35392bb73ff1a60c8.npy +03691459-b40b4cbf6309c3519fa340262d231abd.npy +02958343-21eba3c73a705597db2c2b0116c82e56.npy +03991062-caadd7927e891931b27dc9f9b9dc6f03.npy +03467517-fcc1d297e1c4be5d93f0194265a9746c.npy +04379243-b3477e3ea9fd1676f016aee3d784d83c.npy +03001627-5a960456884d2a3b04cb542e2c50eb4.npy +03467517-bb36b42935f0a1bfe5ef386e39420701.npy +03467517-275c4f98ef07f2b393f0194265a9746c.npy +04379243-e75ddddd62dac8a119fb4103277a6b93.npy +02691156-23e30666530887e69a6e43b878d5b335.npy +02691156-de863b025e53c9a63554ccf8c30febe7.npy +04330267-7963f2d868a8cbb01989a128e43b35b6.npy +03001627-70eddfb0000447c637b2bb75885cfc44.npy +02691156-7f0c20bc26b08a163e2ffe63fcfe09ec.npy +02828884-152617f1e955e8baf4fb4dee5181bee.npy +03046257-6fd5c3b0efc04f3986c439c0403660e8.npy +03513137-4f0ae9814adde64f6a12484fa9d9be10.npy +03001627-5f0f17c97234b510b4bb271cfa904d13.npy +02992529-4303a97b71a1bb894208dfa1c5fa1065.npy +02958343-2c6b14bcd5a5546d6a2992e9465c023b.npy +02691156-7d19ed245331582c3fe7930fce05ded.npy +02747177-45d71fc0e59af8bf155d75bbf62b80.npy +03046257-ef17c03de89a1ce3b1bb46d2556ba67d.npy +02828884-ae2605e9e8c47cbfad5067eac75a07f7.npy +03636649-ea8eb3f3d917d61850c421917af4a474.npy +02691156-2818edd47cbd2aa1afe30fe053f7a977.npy +04530566-adb1b651af34dc6f42534f02c8e8b5ac.npy +04379243-7cad0234edde1e90edd9ab1253e1a9c4.npy +03938244-218f86362028a45b78f8b40f4a2ae98a.npy +02691156-cf6fa8a054ed7bce5de04aad18bd94c3.npy +03691459-3dae5a52602e2fe58a0181490cb73cbc.npy +02958343-59c39dc0b47f338c25a535f4350429ed.npy +04090263-52fccffbaf93c3de71e857afa9df271.npy +04379243-343838f40056270a738e43095496b061.npy +03636649-d526a340408764d8ec0f2eef0b7e551e.npy +03991062-95fc36833cee2525ffc6e457221b9271.npy +02828884-49ab2a5a9005eab9d2b12aa6a0f050b3.npy +03636649-33d0e0731c771712eed9bc72790ab85e.npy +04379243-b9aeea4fbc8db8f3a08ae93bc9509b4e.npy +03001627-ef4f9cd2b498a10a614871b18a2b1957.npy +04401088-2703b7edaf11d79a6b203c09a4932f5.npy +02691156-a69c25f93540eaed6370c33da8a7988f.npy +03636649-35b23397ce08256e847d4e46a1f9f05.npy +02691156-4d3fca1d1cacc27beeefea58691b769a.npy +03938244-9451f92833603bd3630771196b76eab9.npy +03513137-fe47f10f637b54594e5e6ac3ef6bff73.npy +03790512-dd38890e85c6dd91138452c33de4a3d.npy +03001627-4ed25bf015585031490ad276cd2af3a4.npy +04090263-2150ef6d0dd9333ad1f5735620433167.npy +04379243-8f27f3da43406402bd5d9cd72de2e1b3.npy +02958343-dbd67f5f505a795161c6c61410fc904b.npy +04090263-914cae3548759cbeb351750c5651f2bc.npy +03001627-918145be863f7aeaf050758b903e6054.npy +04379243-81148566eef063bf6b1cb83d86c19bfc.npy +02691156-f44c0e1e55a3469494f3355d9c061b5a.npy +04379243-ca484b4b04e546938c9e244e3fbf98f0.npy +03001627-bfa5964a53730c783136fad73a1be67b.npy +03636649-9326c0efeda12e4642f42b7e6beeed8.npy +04460130-75f72747ea9ea6cc459aed24ffc76d42.npy +03001627-26891b80550301721a648655355dc699.npy +04330267-a6d6bbbf60c1a5829d76e54b77715d6.npy +04379243-52ed857e6f9965886b429fe8da4d4ec5.npy +04379243-23fa6ee1004e6c6ef4b6538438a0b930.npy +03790512-5037cad0901fb395b37378f3c85478b4.npy +02828884-190bc3dfbed8c9ad4e77259b0944c35b.npy +03001627-e3f1f899d63ab008492d9da2668ec34c.npy +04090263-58f9adb6b5065dd6ad2b8e02a4932f3e.npy +02828884-67bee18dec77f305e4af5827e8177766.npy +03001627-70ef2b4c4b287c4e3c00c853d8b7ab22.npy +02958343-e97d26f05a68f833cd89498c213958c8.npy +02828884-4769720a332fd899d2b12aa6a0f050b3.npy +04379243-3ba656a9bbc2a38ba22a3fbee2fd609e.npy +02992529-e48a2eff0b0d0a39a0eb5a85db887292.npy +02958343-1687b77b048d1aaf635b88185c42637a.npy +04256520-42dc453547b31f0b71a782a4379556c7.npy +04379243-af65bb882c818f9861dcc050524e1d17.npy +04530566-bf47c2f0b5d1c6fef37a9c459d3dd62a.npy +04379243-742524cb455a050f246c3d7aafc9b697.npy +02818832-b96d8d6400e319eb8d6ee799b331d163.npy +04379243-76b32980bdb108df1b17743c18fb63dc.npy +03001627-74500999671b4c99d7bf6fb68df7f786.npy +03001627-420709f63a0b15ca35836c728d324152.npy +03001627-b8f4ce34b44620cc9b9f2eb77f5e247e.npy +02691156-3b41c0837f22555871d03b466c72ce41.npy +04256520-8cb3672d113ac9aaef188758bf2e3a30.npy +04530566-8a3a23f85c4c4fc4f2ad837508eb2db7.npy +02958343-fcbf9e1dd55ab172ce27281f3b76d1f5.npy +04379243-b514d9ac72abf291914858ee6a7fe3b8.npy +03691459-da9317e5776ed22b732bda87f2718525.npy +04379243-449491be7c2586bf261efd8e659b02a2.npy +04379243-4dae8fbaa2411c5598e0d1738edd4f19.npy +04330267-35f6e6a770258328c7667da8fd923578.npy +04379243-945565e4684886ea9db6feaa7eb1b013.npy +04256520-a7908e8fb217aff63d6e282938a47f9e.npy +03001627-f2440b15f3773299490ad276cd2af3a4.npy +04379243-4cb84e424122cfa7b9148a949a91556.npy +04379243-e285d68fe197f968492d9da2668ec34c.npy +04401088-59a168f51f8d7dd9e59685727bdd9ae9.npy +02691156-7e092d9460157e968b96ae1a0a8b84ec.npy +04379243-7eef97cfb1b73681f1755b5047ed68f.npy +04554684-9b744b01aaed2d603ebd14c45634ff71.npy +04379243-37726dbb4357739bded526a7be77b30e.npy +02933112-29c6f3ce118576724da5feafe6f1c8fc.npy +03001627-6d30eabb3b56d8f897842bde7f51d0cb.npy +04090263-e63bbc4b3a28f6fce5f887ddc636e202.npy +02691156-395afa94dd4d549670e6bd9d4e2b211f.npy +03001627-9a75ecc1e677dfe755d57295806b2c59.npy +02828884-cd385ebe6cd0c1262acc546c71bed8c7.npy +02691156-2a2caad9e540dcc687bf26680c510802.npy +04379243-c0ef2c3ec04860e5b0e0dee6075b101d.npy +03001627-c1e8b1bd34874c83febad4f49b26ec52.npy +03636649-68b79b143cb1538c3087f84b199fd297.npy +03761084-f9ab08ad0d7d8bf626587cb13c78fb9b.npy +04379243-c8276ccc8fc631104a7dc8b5b1635d46.npy +03759954-f8b19d24d53102805495b39f8c929b31.npy +03624134-a966fb3045e83dec68661782af60b711.npy +02871439-b1696f5b9b3926b1a523e28192de797e.npy +03046257-b8c0cbd2f9c6e9269ba80f08c401fbed.npy +03948459-d13986cc2403a2034b4b3d2a28039009.npy +04379243-b588c0169924f8e32d6a698a89d341f2.npy +02691156-52764ef0877372245ddb9958cad651ae.npy +04256520-3bde46b6d6fb84976193d9e76bb15876.npy +02924116-5354c4fdc8585838cb2ecbd32dc2119e.npy +02933112-ba1230fc38050b1bbf1d236bec6d905.npy +02808440-9fe14f7850411851ccd0340812259a39.npy +02958343-ee9b3f31f40a0161b1fa0b2eada93a95.npy +04256520-33eb5d4c6ebbd6b1327289c00b6dc9ca.npy +04379243-a224010a537bc683104e417f71823787.npy +03636649-809ed642119aa5799e8bf807e902261.npy +04379243-6777718e193b45c4f2b931201029bc76.npy +03691459-d11f1c28831e85a920363e2561dd589a.npy +02871439-db5b6dc38fd82fa7cdfa73f789b383fe.npy +04099429-5408f17e0356fe547462fea59b81b370.npy +03211117-536bbf9f697bbe881df9770149d6661b.npy +02958343-b0f1e8e11aea5f622fdea40a56b4c57d.npy +03001627-d959b7666dc2fda41c691caf3fc2f46d.npy +04468005-21ae3c4b2d31b10fe810c01b1498aa2b.npy +03001627-1e3fba4500d20bb49b9f2eb77f5e247e.npy +03211117-4b29b207acce575dafb07a946d621b3c.npy +02691156-ed709305e61acf6a9b017c80f62649a0.npy +02828884-613e9e33ebb303b0e9e2744369bf17a3.npy +04379243-d5c3542c080d61462c45f75322191dd7.npy +04256520-784093cacaf5a2fcf3598efd14e493d5.npy +04379243-bd25dfa62c3c2cf772bd03149507655d.npy +02924116-b2204b9d48c30d7c28a7c1b14d47bfcb.npy +03636649-6dd3bf7b105e88e79d3154c451a33fc0.npy +04379243-7e215b6386f3fd4156d1d06c447a736.npy +03211117-2b70ecfd4dfd162d4a5f5cae871f39f9.npy +03636649-6be148a3e219dc68e6597d391ab6fcc1.npy +03636649-5f3f11372141da8def0b2fc3511b6fbd.npy +02691156-ce3c18550fb997d1107e1ecf38d6ca93.npy +04379243-ff58a52586bb1f692c95f6d76cb3094c.npy +03001627-103d77d63f0d68a044e6721e9db29c1b.npy +04379243-babb0963a0e17bb59cd0aef0207ac8c6.npy +04256520-3a72dc930392152e27787a85c3bfabc6.npy +03691459-a1118bb5b6afd77e6f11d65f7a59b6f5.npy +04379243-cda580f16378e12c3002761e7a3ba3bd.npy +04530566-71fb9e98e62ae65f6a8fde3b294e520d.npy +03001627-5a28539d01a0bbfa8ccbef2c1e41835e.npy +03636649-62ab9c2f7b826fbcb910025244eec99a.npy +02958343-714e69d3b56560ec41a5d15a014fb347.npy +02691156-78f32f279a50beea216b327569dd806e.npy +03001627-4f22f44c331ad407166390f4a0367453.npy +02933112-4c4043756b3aac2ba80ff03f6dc10926.npy +04256520-271cb05be2eb02c53b2e058a33951560.npy +03001627-4c52204e49ce9449492d9da2668ec34c.npy +02747177-5c7bd882d399e031d2b12aa6a0f050b3.npy +02958343-eb59c9376d1e04ab49352dd33f95cb9e.npy +03211117-9a64fd5e660a8725ae95d460d60954d6.npy +03636649-5bc478e9c4e0bb8180936c51aa7ffcf5.npy +03001627-d3f31fd0fc99f45e8b3f6b4a44a70e52.npy +02992529-5e6ee0c5d155d2298b13932a0c28e98b.npy +03001627-635906aade1c775df6cfab91d65bb91.npy +03593526-5d3c251a9c593929c268c38e2d88a8f5.npy +02691156-62c875c3db8bbc512842bbbd2f23c97c.npy +04379243-eb8bee4832b65d8655252a6eccfc24f4.npy +04004475-dd749c531fbe92ea882c1cdb32ffe2e7.npy +02924116-6d22bb9007a4b85e76dbcdc2c193a074.npy +02828884-78ff35f4e229d1306f08940aa2c35d2c.npy +02933112-d0421fb0b59291df7eee615e75bc3b77.npy +03636649-ff07372af062502af47e57eb62ec59ec.npy +04379243-d8e3d77a83528e5cdc1206c3c8202eef.npy +03001627-1016f4debe988507589aae130c1f06fb.npy +03001627-bf91d0169eae3bfdd810b14a81e12eca.npy +03001627-6db2255a51caf84e823e7e244bf84209.npy +02747177-658247fdcc33f379cb2a965e75be701c.npy +03001627-6dadf2259bec12c6a51c26819f8dbb51.npy +04256520-373b91686b4ac7859829306a513f9466.npy +04379243-d5d1e750bb492dd5391e4d6c585a697a.npy +04379243-de214239a28de6b9d00689b1b6482b4f.npy +04530566-f5812d814e114a185c8b6bf3197caaf6.npy +04256520-17bcd5b12b4c3f96d8f5a246b73a66ee.npy +03797390-162201dfe14b73f0281365259d1cf342.npy +04379243-4bbedd35668b06514b3c42e318f3affc.npy +04256520-36980a6d57dac873d206493eaec9688a.npy +04090263-5df56f5b5c339b15df46f2ecb43811d1.npy +03001627-fcff900ce37820983f7e27638e63d848.npy +04379243-7f28dee9ae1a39f1700e86b51ee00536.npy +04468005-deff7415ff1e0424b0b2e6e63122009.npy +04256520-9875190ff87d3eb6a510987e3d5db7c5.npy +02958343-9907db7f1b96ee9a8b55a52bfd1cce7a.npy +02691156-b26d238e335c59b567b13a456b2224a6.npy +03691459-343678f49806ebaef09c0ee854308ef3.npy +04379243-7fadae39394c5622c3bd24f986301745.npy +03938244-55a09adb1315764f8a766d8de50bb39d.npy +03001627-4a45b026317349130e916fac260c672.npy +02808440-38773e1ff9871cb33321831d2245cf06.npy +02691156-64a0f304fa3c113bc817819d30841d0.npy +03001627-59f9d0acb4cbb1465611cca00f1f427d.npy +02933112-2dbd6cb6a14805297812c3baf25c5bb.npy +04379243-9e97c5ba09adfc481b17743c18fb63dc.npy +03261776-6475d0da1bfe0006c78df40cf2e9097a.npy +02946921-90d40359197c648b23e7e4bd2944793.npy +04379243-3fff3e35a4b68352820018801b237b3d.npy +02828884-423a75018428cffd46c340938e2ff1c.npy +03211117-56a247c3688af350723edebb30e0215f.npy +04530566-201fdafa7287d2fe8a55122197709269.npy +04379243-3154c61c595bd600e56ddd87eb888f65.npy +04256520-fcbff3584d926ea3f13ce777d031b4b2.npy +04401088-1292caa1282ad8cffc3c4ad908ac06f4.npy +04530566-3c3161464bb86b2d3ece64552d44d319.npy +02828884-9d68ef4ac84c552819fb4103277a6b93.npy +02958343-54dfce0866b65c4778254b98f5b75eb.npy +04379243-a452252cd1112d346cacd811e7524a0d.npy +02691156-b64f57298cf3e4328b96ae1a0a8b84ec.npy +03636649-29f2e3d2815a018ba77f16c25b1f7f4d.npy +02946921-85fa7911905e932bf485d100eb31d589.npy +03001627-313bfbd7bc2d516e14d782de5388fe8c.npy +03001627-2aa1d5cc784b0b65f51f77a6d7299806.npy +04090263-689a9c745c6a776021d9cbc846872d86.npy +02933112-1eed828f325b45bf5f960aba13b9c630.npy +03001627-758173c2c4630eab21f01d01c8c9dec6.npy +03467517-624e93d139be86a7e46203898ce1124a.npy +03001627-30f862f46bd96da835836c728d324152.npy +04379243-6bb2a335613e8e2ce26ba91c6bf4ff82.npy +02828884-1a40eaf5919b1b3f3eaa2b95b99dae6.npy +02691156-35ae2885a0e645fb7843a50f3dd2047e.npy +02691156-f57c74e194cd2b2bc8727b27ee96a4b7.npy +04074963-cc5571508716b1e5808951ff5fb582ac.npy +02691156-5df7124460d8cd14fd17e1e0553418c6.npy +03691459-5ee19a13a20ab65edaa5dd7053bcd03a.npy +02691156-f3cc7d5c4089b842df6e254b0245ddcb.npy +04401088-8ea128f9035474394cb30fc798a4d976.npy +02933112-7fd938d174a81474b4aed946870413c3.npy +03001627-ce7cff543f8cd89f8d1dabf86742ec3c.npy +03001627-f595abef9bc7320944b2fa2cac0778f5.npy +02691156-aa3a317001bb8617f7fe0727acb55c39.npy +02691156-d5e01850a9d1f3ac5fb48d488d5dfafd.npy +03001627-ea06ed485ab0833a2ebeb1e6a8111f53.npy +03467517-437b134bcf55f69e9c66a84603388766.npy +02933112-77df125bac962fbe4c5470734f591843.npy +03001627-c06b5a7aa4557182f51f77a6d7299806.npy +03624134-431b87d480ae0699a95c6095f89cd899.npy +02691156-ecb0d8d1c592bcc11bee3078a673c2ae.npy +04256520-6caa1713e795c8a2f0478431b5ad57db.npy +03325088-d1971a4133203c8976c18e71fd49c4dc.npy +03001627-69d6d2835bdf709b6df61a30cc649b07.npy +04379243-60f273bb4993eac8d4c42dd307b636f8.npy +04379243-d732f1d1e8a8510ff68e7a883fa7f8e4.npy +03797390-f3a7f8198cc50c225f5e789acd4d1122.npy +04256520-1bbc63fe00a7c3e2bbc7a6acbd8f058b.npy +04379243-6170a0a35febdd19129dc72c6879c0ee.npy +02691156-14ec1da5f5499d83bc0909d98a1ff2b4.npy +03636649-4bca3194ec4308a837b2bb75885cfc44.npy +04530566-306aa8588bead6f3ccbb877d944b8a64.npy +02828884-3250f6d70feb1e77d2b12aa6a0f050b3.npy +04401088-e3291bf83de108ad98b4ae7d0ad0f9.npy +03001627-69e6f0a5e903cda466ab323d8f805a57.npy +03001627-f4cec47ced59d95a3002761e7a3ba3bd.npy +04330267-7325f7bda50b7dc41965be83b7745a.npy +02691156-52e27aecdd55c1bf5b03388497f76a9e.npy +04256520-4b529738e7b5f910288138d7d3420148.npy +03624134-6061ca49f854f6e5e889573847ae2a32.npy +03636649-3591b4c764217d2833e4e0fe8cce118e.npy +04379243-15b495c101881d96e2367b9e27f16a71.npy +02958343-f11d669c1c57a595cba0d757b1f2aa52.npy +02808440-ca14dca61e50a05b3048063251585afb.npy +03624134-34cb3fade2a5de47ffb638a278d56097.npy +04468005-dc71a910775b2106995425f067333fd3.npy +03513137-1f3aa976ccfc9e66780b70108bbf4c51.npy +02958343-127b9ba77b54ba59bda733a39f84326d.npy +02958343-74f7b559d6af926012f2e446484bbaf7.npy +04379243-323ed7752b2a1db03ddaef18f97f546.npy +04379243-4c4675bc602b2a95febad4f49b26ec52.npy +03085013-e9e5d448b7f2da86edb8bbed3955f432.npy +02747177-fe2b3c0ca29baeaed2b12aa6a0f050b3.npy +03636649-e15defcb3dd448094fffb007974c9976.npy +03001627-efc62fa0fd71d739d42ec7e303174a87.npy +03001627-b9027939e6c71d844d256d962a5df83b.npy +04401088-c7407877d3325f7f391258277c122351.npy +03593526-29b41e593f8c1db24b3c42e318f3affc.npy +02958343-12243301d1c8148e33d7c9e122eec9b6.npy +04530566-99acfc63ec4f4ad09f97ca916781e800.npy +04379243-35e5159ed908c99c8fc6229eb64e56a.npy +03001627-c953d7b4f0189fe6a5838970f9c2180d.npy +04379243-3b7fc97192e483ebb0bf045ee98272fc.npy +04379243-baf006da82e4007a2d79e73bf7425e50.npy +04379243-22f298bfabc8982691a76c36d0ba1ac.npy +04379243-2e4fbab46e264616d93768e7b9b1eabf.npy +02958343-90ba6416acd424e06d8db5f653b07b4b.npy +04530566-108d62bb197c948c60c7b57bf6d67c74.npy +04379243-e7abcb9f3d5876962b70eac6546e93fd.npy +04379243-f7ada05f68013e2dbcedcb5f4c7257b9.npy +04090263-f730043e6a9843befe2133a365e39c7.npy +02691156-735466165c04f71f62b600da24e0965.npy +03636649-6c19af16f46fa4699b2dd2b9747d7d2e.npy +02933112-bb5c331b32e39d0d3ec45bd2bc895504.npy +04256520-f5639e976f7b8e70a6fd13ab3827d508.npy +04530566-d4fcf6486fd18a4982266a2b21a2294.npy +02876657-9edfe64416a9646e30612f5c0ef21eb8.npy +03325088-84496aa6efb270c9b362845c6edb57fc.npy +03467517-50647eda7b5aec4b1994831be6654b30.npy +04256520-821bebd7ac070a0550fc88ed745bdb67.npy +04379243-d4f8060cf95edeba6ac2b0edda2c907b.npy +04090263-5c59e7cd62f20a8bbb0bf6d0a9fb50c.npy +02691156-2f5c1ef50794aa92a55d095b876bb574.npy +03211117-d31610e1a17c5d31631465dbc2e64814.npy +02747177-5f14eed855c48a7f63b2acb037dfbcde.npy +02992529-2725909a09e1a7961df58f4da76e254b.npy +03948459-1226a05aba30d0987deae9192b6f5fdc.npy +02992529-ab96be5a6e3827932a6d73bcecfd73da.npy +04379243-ba993afc907987b33087f84b199fd297.npy +03001627-7121296a75c725aee8f8c11a24c52ebb.npy +02691156-62bd247f0e8081a171d03b466c72ce41.npy +04379243-25aae534f3aadc9c9aa9d7f676c1fd7e.npy +02747177-e8878aa23064c704ad5067eac75a07f7.npy +02808440-c66b0bdad2628150ccd0340812259a39.npy +04379243-67d11f49bb73a66535836c728d324152.npy +04256520-9428c331f2230e33a066c1f884f0378.npy +03642806-1ce087aba42caa73b8152979f6537fad.npy +03001627-453be11e44a230a0f51f77a6d7299806.npy +04379243-6cb965ebd6fe2e3bd8d12f352b5e1839.npy +02808440-6abb270bc9fc54fe4c62bee40dcdc539.npy +02691156-fd8d7742ee03905df446f92b52bbd82a.npy +02691156-1d4f988b009edadf54a2210c7b2aa25.npy +04379243-963bfaef4271c4e6955824885d6e7dc0.npy +03001627-b9415bc240e074837e76245c0a9e51ab.npy +04401088-8b17963baf2e54f87a0b781a26650bed.npy +03001627-fc07472e4dd1b6698ae97f14e63e7e01.npy +03001627-4cec451d0ffae39b79e99a4e49de900.npy +04379243-b160e3f80850d23755f46d55537192b6.npy +03691459-b93169c2360aa02ea14443313213c384.npy +04379243-594564c315e37c57925b56a4db8bb70e.npy +04379243-e791f274c6cc7ded36a36f8fd7d27134.npy +04379243-a6543278e970aa7a396d452ec85b027e.npy +03928116-282e61eed4ab9a06bd049a07b95e6725.npy +04090263-5ca0dccd8b0f6357d1987c07c912c6e1.npy +04379243-d9a0b526a354225dad1da5f59ea6f4e3.npy +03691459-9c1bc89152d90500c92750b56fccbe69.npy +04379243-3736ae6b32d288fad832a3fe59576848.npy +02876657-dc192dfce3556031fc0310aa34dddc94.npy +04256520-7b0f429c12c00dcf4a06efdbafdd7ea.npy +02828884-fefc87e051b4776a2d8a6d5087fd263.npy +02691156-a1ce38065b93520335fc197bbabcd5bd.npy +02933112-10c484963692d3c87d40405e5ee68b4f.npy +02933112-81bef552e83476ad3da27ece6ae88fff.npy +04379243-711de3c464c11233a82ebea018a340e4.npy +04379243-7cf3167e5a469fcb4c7384dbb75cab0d.npy +04256520-8c29f480d31a1a521908c34adf823c32.npy +02747177-b4b4f2d95de89e88b693b28f9c9c2143.npy +03046257-8797071b5219973daf7c7ad2549a1b15.npy +03636649-cfaf30102d9b7cc6cd6d67789347621.npy +04379243-e7bf775ba6774a2e278d386bfa54545.npy +02691156-96600318559071d48caa71b1fbf7fb98.npy +02828884-89326f54e97f65d82056b4bd5d870b47.npy +04379243-2f07c59d4099b5762241dba92389a637.npy +04256520-13990109140043c919fb4103277a6b93.npy +03691459-7f7ca259133096cc4d8df313232fc497.npy +02958343-d07c8208ad9dc35780e74058ee862f05.npy +02691156-6d6b6777cf1c15106540a0ff73700634.npy +02933112-4e0cc6a0dbeeb87df51f77a6d7299806.npy +03991062-f7a32f51a03a37f3e422be95e44ce930.npy +02992529-db058088ec098d9bdfbc59eb47b047b3.npy +02958343-ad1d30f2294f40dc622ac2f50deaba1f.npy +03636649-9a447967a9fb5938bb3deb7fab7c9b7.npy +04379243-b4fe4d5be595c1158c1cf3f7d7f0373.npy +04530566-e74a9275bf24d3e47dd35385411db37c.npy +04090263-563097fac348e6463d476be0564f2b74.npy +02828884-f343599b3eb41ae3f155d75bbf62b80.npy +03642806-9a0cafe6dfafe0503fe4aa36ea0cc020.npy +02876657-5872e807edaf985878fe949fc1419876.npy +04090263-2fda76fc28c9133d8428b8de1af34c50.npy +04379243-6581edd8565321685512673aa47c7e3d.npy +04379243-f37348b116d83408febad4f49b26ec52.npy +02933112-2817480c23e4a106c59350d819542ec7.npy +04379243-259125651db34085a4865f78beea84b7.npy +02871439-37ed10ebcb9c0cbc932ec7aa2da5961e.npy +02691156-d3dcf83f03c7ad2bbc0909d98a1ff2b4.npy +03261776-937cdf200b33bdfd1aec2282dd8bc87a.npy +03948459-edec08542b9312b712b38b1d99376c0b.npy +03790512-31a96fc694f0e58cd5dde04c96fd8146.npy +03001627-beb4c42cfa1c3b282811d30bba54859.npy +04379243-33c8b21a29bef56645de94e1bc93a4f6.npy +04401088-c3b9cb70c6a80ed686a04ec9e4169973.npy +03467517-6f3e9247e77897989ce06ac269757e69.npy +02808440-ec840887e7cae5b6ccd0340812259a39.npy +03797390-73b8b6456221f4ea20d3c05c08e26f.npy +03001627-516d94f2658b2258d79b19c7c4f0e293.npy +04379243-b8ad178c1d78980472dc9d42e683347.npy +04256520-1bce3a3061de03251009233434be6ec0.npy +02691156-71a3888c2229715b694188e21796efaa.npy +03001627-a40133bc1af575291bd0966183650a4.npy +02828884-e223e77b8db4aea17d8864caa856253b.npy +04256520-cb71cb7b36dbcb6f826fc8d57346a2e4.npy +03001627-546c4449b8001f0815d1fabef5f236ab.npy +03593526-dd37047caaffb379f9215f842248bc25.npy +02958343-1a87a329781b15763820d8f180caa23a.npy +03001627-177849848dc83fb9cb85ba5866080618.npy +03337140-97d83d7e969a309991c352d02061b3f7.npy +02876657-9fe7e6a7bf8ca964efad53eb3f0b36fa.npy +03337140-e4497669bb1457c655b2aedb5bd199c6.npy +02871439-301c2df72793fd33d42b9650f19dd425.npy +04460130-df8591577e0ef1095ae4226ec4ca9d4d.npy +03001627-58d39cbcd842cf6eaa90ad3e0254ffab.npy +02828884-bdf722327e02a0f0ce7719c693f5802e.npy +04379243-91cf4849ad3f7ac2a81005b904311cb4.npy +03593526-a4f56aa9a291cffb80067e3fdc6db24c.npy +02924116-ea3e697424a86f89f607cd34b3ff94c0.npy +03001627-bdaaebf065b112da492d9da2668ec34c.npy +02828884-a380e75d8efcb4192f550a4f461edf6b.npy +03691459-48bf5d4693bb7ecfb4bf1edf2dd92af.npy +04090263-3240b627007008146a2345809e2bb169.npy +02691156-60af3c930040c8b915d4d2fdca08573e.npy +03001627-eb59a4b8deddc6f659fe320c015eae2.npy +03467517-83e4f00f3c5b50ceb470346f25b26583.npy +02958343-e717bcb56d012a48b1bb46d2556ba67d.npy +03691459-d04ece855d678568d74f2f4a7f5598c2.npy +04379243-a68f06157d6ba8d4f51f77a6d7299806.npy +03001627-38e904bee502bd31e8b2b8dc0c816caf.npy +03928116-39d9f17c8fc14f6b8dd4b8aba823ee77.npy +04379243-4506f150e4f43633fab6e40cce6926d7.npy +04530566-85481518c0938a6eb1bb46d2556ba67d.npy +02691156-8de793e2e964f40a26c713777861983a.npy +04090263-97a75366f7c6ef24b8d6e958e0707d71.npy +03797390-10f6e09036350e92b3f21f1137c3c347.npy +02958343-6c7ed2d306fc7cfa4ccaa6b556a5ccc5.npy +03001627-2bd045838a2282ab5205884f75aba3a.npy +02992529-312c430f8b1a3fc80249ed612e14df4.npy +02691156-5d1d88958bd1c9c573328938c756eb4b.npy +04401088-e006061cc51617b9498dffe5de12eacd.npy +02828884-f061967a9b5ab9b6fecb38606c52659f.npy +03046257-ef6c1b823990c0f4f51f77a6d7299806.npy +02871439-1ecd9316bf586354ae25f6fe802a8997.npy +03642806-40e0263822860cc5d69e26904fa68e7f.npy +03001627-bfa242a09f35dcaa38fba5f798d10731.npy +02691156-14c954d5d3c8e954b6b87e72ead132ed.npy +03001627-97df0e7773e51feb331fc18393f04d2a.npy +02958343-af2f10112f943f54c730b513773cf286.npy +04379243-ce56b5a3ab23e12489aad4e9e4feaf9f.npy +04379243-1c00da8a9bd6f7403b846408f8d3469d.npy +03467517-a2c1ee6a7ddb50a493f0194265a9746c.npy +03624134-d9a9c77250224c5c9037640567c760d8.npy +03001627-3622d983fd6d7b98e3a73d090627e9ba.npy +04090263-aad61c4d490d4a8b6dbd8278fbb6bf38.npy +04379243-3c899eb5c23784f9febad4f49b26ec52.npy +02691156-5abe1e80846dd485c3e7213e9e8493f0.npy +04379243-58475b1b20ece0c5eeb8d422649e5f2b.npy +02876657-c4b6121d162a3cb216ae07d515c8c56e.npy +04530566-d5c7613bf466d33e94daa4565dd30535.npy +04379243-50480d9733231475eaf288f952624966.npy +04379243-1df409cfefbb51658b9b51ae4415d5aa.npy +04090263-b3ccd1643cffcabce37934d75f36098d.npy +03211117-314bcf37588dac1ca802f44e0266ca93.npy +02828884-745ce171571074decb2a965e75be701c.npy +04256520-19dd57f04ed04422c528d33bca1ac2.npy +04379243-4c7931492b41f960d50eef20e0914a48.npy +03325088-f4c37e34ea1d940a50da8b99982a3057.npy +04379243-77ecc55547840f06d42b9650f19dd425.npy +04256520-3a98a93f381ff5fb4b3c42e318f3affc.npy +02691156-8ac8c21b63ff535fca8607f540cc62ba.npy +02958343-c4f6540454e65939921cb81cb1632a5e.npy +04379243-cf24aa524055dd5ceebb0db1929cfe93.npy +04379243-8b0480b9d0bffa6e8d740231f5a3de96.npy +02958343-9ff9c8287fdb49be8b55a52bfd1cce7a.npy +03325088-607ecd0df535e60176c18e71fd49c4dc.npy +02924116-3b90b61ecb49cc2c65b80aea88017aa7.npy +03001627-33bfe7ad9544eb93d7f25634a7c65cae.npy +03211117-dac5376988db376b7700ed9200d31a49.npy +04379243-4b887a7bdcfbc4ca7e04e68609264bc1.npy +02958343-173669aeeba92aaec4929b8bd41b8bc6.npy +02691156-bc3f4d2bf11e1c6382328b5e05417037.npy +03001627-c5d58dd0119f0e49503aeac2cbb6e06a.npy +04090263-2689d78a4fba15bbf3998727b15249db.npy +04256520-e70fb6dca41fc8bdfebad4f49b26ec52.npy +02691156-74b0d11834cd8ec258a4fbb6b625be1.npy +04379243-34e260786b78eef475e2a70bd3d8ac6f.npy +03636649-81dd7cff35cfcfba4b3c42e318f3affc.npy +04256520-f644e0ae72dbe83d72ff9ec64cb596d.npy +02876657-725c3906071ecad52701ea82a42c662b.npy +02801938-1ed60448a8cc4b916e6624d94e2e0a1d.npy +03691459-2ecc5b85b343b20c2ca06fd2350bea43.npy +02828884-6f630f561e5ae2a5423efd8c02bd12f7.npy +03691459-6aa3bca1ec6b261edbddba07a492a0ac.npy +04530566-1f4e0613a3ec7b5a975be43df8325f3d.npy +04379243-565c8256aa446f152685733c782593df.npy +02924116-7c79103dfd1dada03690a69e4cb84963.npy +03691459-6d28e2683df5f013c9d5b08933b9e0c1.npy +02691156-bc140e3c54b27bfabe13ce34aa7c0c1c.npy +03001627-6f194ba6ba254aacf51f77a6d7299806.npy +04256520-3ffc1c26db51a3ac948a3bd895ea5ecb.npy +03001627-f029adb6cdf37c402b339ec555ba3bfc.npy +03001627-e4b40369894a16ce6821a1e68ba5ebab.npy +03636649-4ba237c2c40313f373b3ec02b97cb0f.npy +03001627-8fe0e6780b3dabbbb098f5649ee97d24.npy +04401088-9dc1088c4f5de29ac78df40cf2e9097a.npy +02933112-382b6f8e93e1f576149dc0f3c5ce899e.npy +03325088-4eca4ca3fc1a63ba50da8b99982a3057.npy +03636649-e43996a9154a48e0db039d8689a74349.npy +04379243-7dceb027969fed5e2c0a7b8ff2381a5c.npy +02958343-e7c4b54fe56d9288dd1e15301c83686f.npy +04379243-cf63d0c639cf4d36da1aea1fe709296.npy +04530566-25677ae07e0257955dd2c581ea62184.npy +03001627-440e02f574afa478ac38b834d5dbcdb3.npy +04460130-a07c8e2d0127b26195405124ff912ff6.npy +03636649-44820a27f86f13e7e420612cf7bb547c.npy +04256520-f8998de3b4d36dea4b3c42e318f3affc.npy +04379243-dd4f28a0e0d3f93c614a26402360d21a.npy +03642806-2134ad3fc25a6284193a4c984002ed32.npy +04256520-a28a2bf7c899fa38baaf4e0b7520fb81.npy +03001627-89f8c12dafc877009f8c3d2002c77ddb.npy +03001627-5bec8011c4042baf14038d588fd1342f.npy +02924116-59db922e827def242aa8b7caea8a1807.npy +04379243-57fd351d970d60fd60a25ec0f32e89e3.npy +03001627-4344509d0442364d3f9d6e0ade5188b0.npy +02691156-24968851e483feb237678474be485ca.npy +02828884-5cce62b38c0486d74201e10f9a6fb035.npy +02691156-3e0561d70c7fd4f51c6e4e20f2b76086.npy +04530566-3625522559a753b78dd2cbb9124e6d20.npy +04379243-1f47bcef63468cd9b90b306cee0c8c91.npy +02691156-a4391c7977d990142c20743f866e1a6.npy +02992529-3dc95447a57f8d06c1e615a94e798da1.npy +03624134-ced1a454c0e5fadd567f010bb1e0a2a4.npy +04004475-e0b4fb5f282bab11d18dff33f5d779e3.npy +03001627-971a98d242991e2222ed3259ee7e608a.npy +04090263-4e4b42da5513ecd175d25d68bfc74949.npy +03001627-e6b822bea1d5a5a9f7b783634bf3f92f.npy +03211117-fe75bacab7594206ab0b172d4dea80cd.npy +04530566-ae93355992a29c428064e4301e947b0d.npy +04379243-15dfec695110505227c1f8d037f650.npy +02924116-fc6c9de9bab5154e481aa8b5531c68a9.npy +04256520-ce863933e9e5193322d11432250c3331.npy +02691156-6659e72d40cef80be07c29b23ef67611.npy +02992529-d7c350e5d29074c9b4c216fa1de7d5a1.npy +04530566-c46aa66acaffc37af4a06efdbafdd7ea.npy +04379243-2c6741a965bc580072f9a9353d57f9ef.npy +02958343-3ada93d04b72256df63ee8a34069b7c5.npy +04256520-8159bdc913cd8a23debd258f4352e626.npy +04256520-ad1428e73eafd4a6660dac8da5753e14.npy +04256520-1ff1912cc74a76c3b2152dcc3ff6a477.npy +03001627-ca1bf3f8bac2927cefda51b1bbd149fd.npy +03001627-323bae92774d8def78aac1ce4ecb73b6.npy +02958343-4af41048861594b4897e805df74453bf.npy +04379243-6762370303178268d323d6bd8db8de5b.npy +04379243-7aba44f7a5ca1fd9a35da04de92b0f11.npy +03211117-2c4bcdc965d6de30cfe893744630a6b9.npy +03691459-414fac13be35799d19077496eff9d4b9.npy +02924116-6aadcf70fc49873ae14cb463f23a6803.npy +02828884-1f0c3038d2a9bb391b305ee09b6b9906.npy +04256520-acf23f78322f00f219fb4103277a6b93.npy +03467517-6554f6429eb7b67585e3c97721f726e4.npy +02958343-8606a6353a2c0f7a453660f3d68cae6e.npy +02958343-51ae6558e6914920253c03b7df20edd5.npy +03467517-a5825f1ffa48c72f3754416ec24e02bc.npy +03636649-d13f1adad399c9f1ea93fe4e1ab627a2.npy +03467517-bece1efdae5f94d0e4ca9fc57c06f078.npy +02958343-8320c70894c3cdfdff1370452e3a0154.npy +02828884-cf24c6b52b12c56ced8d4f003c2a833.npy +03325088-9df6805f555e98fe944fd4e41cc8d418.npy +03691459-a29485bfe6a688f0ce3ab2c820261e42.npy +03991062-bedda59ae84775aa37b2bb75885cfc44.npy +02958343-1328a95d69cefe32f200a72c9245aee7.npy +02992529-a2dedd1d1369d4ae25bdb70a4d3731d4.npy +03928116-b11213949b59e6bdfbed28a02a11bd9b.npy +04090263-b8970e3d0eaa2880dd0a2071dde26395.npy +03001627-1d1c829a54f0ae426cdb122727dd360f.npy +02828884-49a07e9db250cb5ea17702c02a7c3b1f.npy +04256520-a0bb04577e35ca2440ea7eb155c4e420.npy +04004475-9df2e49709f014d242eac36fac92c11a.npy +04379243-78a81cbd2a5720d93a938fdd57fac3b4.npy +04256520-dc6308addc91fd9eb9e8bdc9c4a49aa2.npy +03691459-db90e043486f216ead1d87becf13ddd9.npy +02871439-3826a129f5d8324446ebf4f1147c3f0f.npy +04256520-b672f2487b04c2e72a7455a9948f4f3c.npy +04379243-f87ef5a5c13e7b29d810b14a81e12eca.npy +02958343-efade459a90b2b143337cb9d908ce86e.npy +03046257-73fba47ad11432dd14daed0f93827804.npy +04379243-c0ec7cca02bd2225f1783a44a88d6274.npy +04530566-5a84b0529edd7101d3ca4877ecd2c01b.npy +04256520-ac96d2fa0e2052a790a9ce3e4b15521e.npy +04379243-d0220473a40678ad137619fe8083152c.npy +03691459-113aa3b68f515427205b075c6f63f661.npy +04379243-8f73278956fecb80327289c00b6dc9ca.npy +02954340-18387b36aa7b2d4af0d11ae402ef940e.npy +04090263-1220880371b176f9a06a81572261e82e.npy +02828884-d03199998c84839a844cd843a27223e5.npy +04256520-77371d342cddea8d8b424343280aeccb.npy +02691156-b87cb85be0d8eedb44bf3710e93f8cf7.npy +02924116-a6799d14b9d42a85d4ccd960d9711d72.npy +02924116-d312082e00d08d43aff1be9b3d197e11.npy +04379243-5b04e4677f1a45d3609211b089fcd35a.npy +02958343-3ddda21d4496fbc693680c5a9a367b4a.npy +03001627-bfbc5e6ebe1813a5d9fad8aba2c312b7.npy +02691156-5eff54a76d8ef89d7e1c97634acf0214.npy +03991062-8a88fff550a841c5fc2b7781f0f02585.npy +04460130-64f50754e6b67305ea3f1ffc49ae6b01.npy +03046257-67f8adff4cb252bbf269315e1b3458a7.npy +04379243-bcb51814564c9308b27067c40cfa2f80.npy +02828884-5c31950da8e2eb09929ce23741435ae.npy +04256520-163af537cd485a75e73748f506e4b955.npy +04379243-516f73ee8b530042593ebeeedbff73b.npy +02808440-11955ce486dd9b6954d7082b34825ef0.npy +04256520-31b21dc34d770ce8dca17035ebddd61e.npy +04379243-bb521fb4f1ec77a0ebf17edfda20712b.npy +02691156-284e6431669d46fd44797ce00623b3fd.npy +03211117-a57682cb8ebc224eedb8bbed3955f432.npy +04256520-b821fbd0ea6086ce9670b99b613138c4.npy +03991062-b4bc7d35f20935f9aec59741c69cf7.npy +02691156-bf54b050d092d1e35b5e900e37653d26.npy +02691156-3c98bc293d33375a9a6e43b878d5b335.npy +04379243-13f7210d5d472518febad4f49b26ec52.npy +02871439-45f111fa4aa4bacd6153b9900b1cf5e.npy +02933112-bd7cae3c39773a4ed0a0c43e4971be14.npy +04379243-4eb395cd5dfe658318a93a45bf780820.npy +03001627-1f8dde91813456e87e777e4db5dc272a.npy +04530566-4d5d231a701433110a313d673794913.npy +03001627-3bcbf7c8c8eef525c5b0fe224c67bd68.npy +02933112-cb75de930881a633f51f77a6d7299806.npy +04090263-f267ad7ff7c3a5dd763221be209af140.npy +02691156-b74611a3b3b3ac72ca8607f540cc62ba.npy +02924116-c327201f40fc6a03621930cd3ccccaef.npy +03001627-3bbcd9e945c6ceb8d3c29b715a9f3afe.npy +04379243-59d780e98c0c3a6f41c78a933c3b0bad.npy +03636649-62a5d7a59b87d150e6597d391ab6fcc1.npy +03001627-3372fd42f389a36a762ec387b772e9e1.npy +02747177-38418e5ea375d66a56f6fc4b4ce1db04.npy +04004475-4280940636bc0c3686f436bb2260061.npy +04379243-d430b0c4136e87327e72463702194870.npy +03211117-d96fda816cfd848e9aefc6fb585e9617.npy +04379243-bde0b499bb218666c6f42ae239fa6819.npy +02691156-5676893c90ec0f6dab81b7399bdbb6e2.npy +04256520-e37b46236accac968cbb8bac2032149c.npy +03001627-ff6e6b7b7c7f1c0f15f78c98555ab41.npy +02946921-147901ede668deb7d8d848cc867b0bc8.npy +04256520-c602f932c692ba2714038d588fd1342f.npy +02691156-124a579e0635b8eace19d55bc5e6a406.npy +02828884-397ac4bbb11796902d92929fa159facf.npy +04090263-56b409a50c8404afc24d00518a3dd6ec.npy +04256520-a23357a29af9f63ed26fff8ae28c5292.npy +02924116-4c5cae9a12252e1db1626da45836ca54.npy +02992529-a9c181d7378f92cfbc59a3627d9edb6f.npy +03211117-7e1212c48c877b87eca8a38e13335285.npy +04379243-9bb816d6a3517a5ca74c2333655a11dd.npy +03046257-7b1f529f00ea482a788a9e26a791a23a.npy +03636649-ef612752f6192e8d29eb9d04ea723179.npy +04530566-2ceb5d34a15b73393302308333adc4be.npy +03337140-abd27e76be6194d84c3aee8e9d3a6ffa.npy +02818832-e2532c6b9a56fe984bef72f03d7235ca.npy +03001627-83f74ff9d96c4d77bc5804ffb7fec416.npy +04401088-2ea4a3d502b12c61707fb0d61a11775f.npy +04530566-973b398bbcc97c3fea9bd4954e1c8c49.npy +04256520-1c4bfbfceb9e579c708f430fbe4ae8ff.npy +03001627-646ce5490817ceef4b6538438a0b930.npy +04090263-73903a9846293890a1ce1dd4c7e01188.npy +04379243-70a17261539dd92fce1403db8f7dbbbb.npy +04379243-cdf0a34dc3504e40643beaf431c0975a.npy +04256520-7d4113d5cbf4ba376efe57da6d3d385e.npy +04256520-e3c42f99d05348c6d456f2c60deb666b.npy +02958343-fe2e5f0993bbd4726fadd0e0ad926818.npy +04530566-1dce61f6dd85dc469811751e3fab8939.npy +03325088-63b97b5f2f209f667ef3547d02ab05dc.npy +04256520-af9d9a0ffad9c2dc8a243182cace7dbe.npy +02933112-b2b89d3ec5918f69c59350d819542ec7.npy +03001627-e682c43e2f4e7463d0ad32b8d8cec005.npy +02924116-8b95a88f6be4038841cefd10ce5d6cc0.npy +04460130-f679821836f140f39ebe905ef4009f84.npy +02958343-c558c64b6b97a529658e57fd275f6bed.npy +03691459-71b4fb2d151a9d70fb0a4dd466ef3d66.npy +04379243-fe99a1127734f7852b70eac6546e93fd.npy +02691156-e511258df02edf1046ed10e8f7fe336e.npy +03001627-af34090f13146fef15afaa91253fa857.npy +04090263-99957708f69cc13acd0bf1b7ed0a63c9.npy +02691156-52712e1c07ea494419ba010ddb4974fe.npy +03948459-30195a2d2fe56a1f6887cd98a5557c7b.npy +04379243-c93aa39b76980ff655f46d55537192b6.npy +02958343-e7141fa81a2828841e8bd72b0feca0a8.npy +03636649-fa6f034a8beb74f6fcb8d8c6d4df8143.npy +02876657-e90e0506fd00fe93f42d6bd378df1c70.npy +02747177-fa723633a3cfed271e74a5e93d408a1a.npy +03593526-930e0e91518dedaf8b5a342cfa6159b4.npy +02958343-e66cb97aabb79193da5cb3be8feeaadc.npy +03636649-ed4f7f214ae7042cfcb8d8c6d4df8143.npy +03001627-1cd152cfd71cd314e2798a633e84d70b.npy +04090263-350c4bccc1509f83583c7e128cdb4e36.npy +04090263-c26b3833f66cf4691756b5d674acc4e5.npy +02924116-b52d68042ec5e75e193d7855ecfc1bd3.npy +04379243-fe3a8b30aad625ceec56aed2da084563.npy +02924116-21675fd70633384bb1626da45836ca54.npy +02691156-b81339a2f1dbc0de9598ceb95c7f0752.npy +02828884-2e8f1b6cb9b4f568316a315354726289.npy +04530566-3632e9d36e280dcc6a6cc078f0eef937.npy +02691156-67d9607d84fb51435fc197bbabcd5bd.npy +03691459-54fadd7a6c5c04d752560296120d4cb.npy +02958343-69e99923c3cbcbcca9fe1734a6086750.npy +02828884-a4d107815780161ab7ea82317702e856.npy +02958343-aebd98c5d7e8150b709ce7955adef61b.npy +03001627-40ee8ed17f6ea51224669056e0d19a1.npy +04256520-221e8ea6bdcc1db614038d588fd1342f.npy +02933112-984c969b9948fea738e43095496b061.npy +03691459-f64068aad93d502abd1cba733b111584.npy +03211117-5fda7abf1b684ae8f464a4627ebb5e55.npy +03325088-9ff3b5c3aa7c2d5c36fb70296e45483.npy +03211117-b569ba9d9d74e7d5184dd44a99578080.npy +02958343-7e7b757052225615a73f47f4261c01dd.npy +04379243-2a44f4def2a20e7f4b3c42e318f3affc.npy +02958343-efe74cae23f8061382fe9569faf087db.npy +04379243-50bf2749c1963d319d84faf1493a1f98.npy +04379243-c5ea662fb31f56cb2a155afd9dbbb0a.npy +04256520-d84ffaa12c52d6a9994626ba7fe8ddf7.npy +03211117-c19d616f13bb70d39306959137da47ca.npy +04379243-f18c9ab4ebdcdb8ac8595ea32135ffd9.npy +03001627-54e2aa868107826f3dbc2ce6b9d89f11.npy +04379243-9cd301c49dd65c68819b97ced0e92930.npy +02933112-ade25be3b1ee38bff51f77a6d7299806.npy +02691156-422700fbef58a0ee1fd12d3807585791.npy +03001627-a6ab184a68bc67d179b3e1be3524f72f.npy +03325088-95d17d2a88d82812b362845c6edb57fc.npy +03046257-8af7cb8b42d0c8b1f9e8cd846ef13776.npy +04379243-1f2c84d387bd1af9609fb05dbd8681bd.npy +03928116-90af8109ae86f1d4f7895369e50c9000.npy +04379243-2f257e35ef61553b63c9ead28992f1.npy +03467517-4d98e1ec983e315f8e7905003bf56417.npy +03261776-c6d19db35f69bae7b6d9c2cee7f2f72b.npy +03211117-68dd0f25329c5779be95cd31e095c9d4.npy +04330267-650ab459ed284b4349bd139dfeecc324.npy +03991062-eb485c8d5b0acd5dff67c12005f72d2.npy +04090263-10439f1f81fbee202be79d8b285c1e.npy +02958343-606c0050a2ed4e19d834dead2eb68d68.npy +03636649-525109ea19096fe8eeee03ae21af2d39.npy +03325088-bb5589eac797c14db362845c6edb57fc.npy +04256520-bdbdc31c4ba48868bd91edd7a65c1323.npy +04530566-7f05275eddecedd06f3d18c7cf5f8b6.npy +02691156-d59d75f52ac9b241ae0d772a1c85134a.npy +02958343-348fe55c1976b64c45aa033a20004998.npy +04256520-bc0971df7f259c581d38890680ce527f.npy +03001627-ac9cb6f769bf90c824d8364776ff163c.npy +04379243-7853c9da0f57af87e649091ae21aee74.npy +02801938-9e2a1751b9129b1132fd0b3f17b0d6c.npy +04379243-58f8fd169c9578e62f81cb887dc35578.npy +03001627-7ad134826824de98d0bef5e87b92b95e.npy +02958343-26b7a9c6c7e74829eabc798aaf5f039f.npy +04379243-a59b2884db9574cd1a72c98fc69f22ac.npy +04379243-de2d98c18293a15219fb4103277a6b93.npy +04401088-6682bf5d835701abe1a8044199c77d84.npy +02828884-4b4c1a775f9a49958cd4e3ad2fcaf039.npy +03211117-87fb8857bf2bd3a7420ada7b49a056b8.npy +04379243-3456178d3ff37ae1e76bc197b3a3ffc0.npy +03797390-8f6c86feaa74698d5c91ee20ade72edc.npy +04090263-caff0ebc560479ced735fa1ab17311ec.npy +04256520-27edeaa6c6e2e670ce4f274577283b16.npy +04256520-735578d3cfa39279d098b24937823a09.npy +02828884-2edcb17b897706cf71a782a4379556c7.npy +02691156-a02387f2b9d73a01a5cbab5aded19a14.npy +02691156-9a9f615801c2dfff4d210d9468aedaf2.npy +03467517-f11881e9363c00f6352e5d4d2615db5b.npy +04379243-6df5ad89a152dbd26e79c14dd16aa04b.npy +04379243-6db77fbd32e0af3e3f9d6e0ade5188b0.npy +03691459-87a0dac4a3c483de6671a3cd2be21041.npy +04090263-7c10b90abbe17fb9935777dcb8deec2d.npy +03467517-890bfa7ff894aeb3ba9e56c15cb175df.npy +02828884-7536b671103f96e5b12a55dfcc392e26.npy +04530566-ad440e99d3a9bed3cd202a4790115f0c.npy +02828884-40279f85fc80e16edccc47bf0dcf5d3.npy +04256520-d9bb77735ff0963ae7e684d25d4dcaf0.npy +03636649-cf0c13fb0e57bad9cb02404e1e21ec1.npy +03001627-4a0e7f1129a9172349bb1cbbf9a4206.npy +04379243-21a5b3d29075564e2314deb821327685.npy +02828884-da92767c2e0fe6bad5067eac75a07f7.npy +04090263-b094f9184c3098a781fbd53a4fc6b7f8.npy +02992529-a3bc032d0842d570348e2c62a688b780.npy +04379243-5c11a1fa21e8671cbafa5bee623d5d.npy +02958343-f03a4533fe681a155b48f89d50b1db79.npy +04379243-5516cbfe2ae44c0a7062f2d72cde5c95.npy +03046257-c7704d12c66e09dabcb557b5b19897c9.npy +04379243-e4a9b9db82ff871a1b17743c18fb63dc.npy +03001627-247dd48e4b6c029e4b3c42e318f3affc.npy +03325088-c1c7a391d18c9ac54392467549e2de91.npy +04401088-1847d3782970e60679510444cc61f839.npy +03636649-67f6c0f40fc9216e8aaae3d020f5ddf8.npy +03636649-2c0177660b7ecc915c118a000b931714.npy +03001627-4c9d9b37b13b0dc720211b71e9c4c8b0.npy +03001627-69933c14a02d65166e28ffc6e1f368fe.npy +04530566-611824dac2873f5b59f280bab375e8b4.npy +03691459-e767a0e8df4e41f4b3b44ad99a214777.npy +04401088-ed0f3e1d20fc722bb0478ec258b0ea3d.npy +02876657-6f4749e802e6b5eb30612f5c0ef21eb8.npy +02691156-617a3d4bb40402679c411d305417ef6c.npy +04379243-79a3bd60b48584b11ea954af295a6a98.npy +02808440-4a6ed9c61b029d15904e03fa15bd73ec.npy +02828884-1ac6a3d5c76c8b96edccc47bf0dcf5d3.npy +02958343-5dd97775bf24ffa2283aaea3c1a7dc36.npy +03636649-ce879c871fe2015b4cbf9a02e3342127.npy +02958343-83491cab81e3a330bda733a39f84326d.npy +02691156-ccb9e8dd6453b6c2a2981e27422ad4a7.npy +03593526-4b35db459bc209bf5d878ba9ec3c0d6a.npy +03046257-6695577b5fb358ebdf5f14f6397a827.npy +03001627-473afe27e45b37101c8d18742f91c015.npy +03624134-665bf5d30d342d64adee73efb2c043f8.npy +03948459-e9e6426605eb6d5952d52701459b1f0.npy +03001627-8a8c67e553f1c85c1829bffea9d18abb.npy +03642806-de2e95eac460c361e862e3cac45aa769.npy +04530566-341905f73563a75717e4d86bbbb01f9f.npy +02924116-1514f0bcc843fc62ad19b94b8069bb8b.npy +04379243-d481ee7e971849339db8ad97fd392b59.npy +04256520-499edbd7de3e7423bb865c00ef25280.npy +03636649-a9f5d780f8303489d8f5adb469ca89d3.npy +03797390-e6dedae946ff5265a95fb60c110b25aa.npy +04090263-138cbc9b5456cfef55d33831e71fa52.npy +04090263-5fa42f48d1d279bb7de50e1a7b436c85.npy +02924116-da69974a1e548e8c95c7a8a79dc0c72.npy +02828884-1bf5b1fa54aeec162701a18243b45d3.npy +02924116-c851c4559c262b77473aeab56f2a35f4.npy +03046257-f4104a9af5a0fb3cf016aee3d784d83c.npy +03001627-1d828c69106609f8cd783766d090e665.npy +04379243-e157bbb54d5a2ffdd6944324b21393b5.npy +02933112-ab7ad8afde03897aa52fef6f94fcc8a.npy +04530566-2c23f32d6eaac557b93dc42f7dcef6a.npy +02958343-baf3415a57e6f282b23c333ee1a445e.npy +04256520-804b776428062f18f024b0f23b15c6c8.npy +04468005-8ed080571013f33e8be7c8c5fdb9bd6d.npy +02691156-56b44fdca08540da71d03b466c72ce41.npy +04090263-e534d084d3bc37184d0af51460733e47.npy +04379243-81b379e6871c97e45964cca694d01a7e.npy +04379243-43bc8b8b33811a2a54afac63dc6bafa8.npy +04256520-e4ac864732a8dc40f99656b78fd61fd5.npy +04379243-95eed587c3728d22601104cd2d998272.npy +02691156-21feae1212b07575f23c3116d040903f.npy +03948459-96fb7421c604f2f89a80640ff158687c.npy +02933112-bfdb60bd61d083536739a7caa0c577bd.npy +03001627-fd5ca05b59b30241d838ae16242881dc.npy +04090263-935645a83387dd25719c27787d6741f.npy +03624134-c7fcf3077b230ce17b635ec9828c6ec2.npy +03211117-5bd1493a07c13d675f1b26547b9ff327.npy +02691156-a3c928995562fca8ca8607f540cc62ba.npy +02958343-5fc83a88645b1869514e3d96995c555d.npy +04256520-8a470e5b043a38904b3c42e318f3affc.npy +04004475-f9553ec63a0724cf52c2b779770ba628.npy +03761084-52000b7c14d7804e976040de71c9b526.npy +03001627-243ab0d808fae5b76f1d1c49624bcfed.npy +03001627-48091b14719964986d075d8d4fe1141.npy +04090263-ca4e431c75a8242445e0c3a4b827d51a.npy +02924116-5961772d9c7dd56193d7855ecfc1bd3.npy +03001627-f550b5413eb040c29829306a513f9466.npy +02992529-aae6554b1abe736c70ed77f7659cc6f.npy +02691156-329a018e131ece70f23c3116d040903f.npy +02691156-7608d7a5a3e3c2b13d4b1f38e3dfce4b.npy +02747177-55e6f6e5a37777b7f9e1e633e708c001.npy +02958343-7bb54d802ac6156ab96212c8f6cd06e.npy +04256520-17e050b62fc249687d3c9de9415fb224.npy +04379243-edfd25e28cc7b003869c91937070800b.npy +03636649-7a67bb268436b3636a578f1b525d976c.npy +04379243-e5f797c0266733a49b8de25d88149da8.npy +04379243-370b45eeeb9b11416f04d49e4de95b59.npy +04379243-198551bcb90f2fd5ef40cf5f2b241770.npy +02828884-b7d0a6ed347a549b278d386bfa54545.npy +04379243-ce998bbfe6fa0d22bd6c42a70e9434e7.npy +04379243-b1384cf261fa99a03002761e7a3ba3bd.npy +04530566-4214845c44563c5fb1bb46d2556ba67d.npy +03636649-6936b0f0e7c88e3bdc22f557e01eba14.npy +03001627-aa0ad3538d0d7b3be6fe3612af521500.npy +02801938-434194622dc684f81de9d8208aaa2d25.npy +04090263-d65e4cc9b69a3ec4691fdeddcb509b59.npy +04379243-a447c1fe6f458a02e76bc197b3a3ffc0.npy +03207941-a2caaa68364f6207f054969eeb39ff86.npy +04379243-cb8ee43492cbdda3bf6f067b2fb335d.npy +03691459-b70c600b20614f4c690135fb845b8de1.npy +02992529-40dbb04ab8f780d6cc571cd3cf8f17a1.npy +03691459-c556fa897131c0c833b20ff045584bf3.npy +04256520-da964fb2d92a461f6295e8bd02084b6.npy +03467517-2292b7ee00d2955723b563ac391a63a7.npy +02691156-f1384d3fd2d59e63f4d6518603e8629.npy +04379243-8a64395b321a34161191025061735ea3.npy +03001627-ea7e09260babc698983c05814b11dc86.npy +03624134-fbce3be99b20b169f1ae0a5e4119d01e.npy +04379243-10e6398274554867fdf2e93846e20960.npy +02691156-b31bbc50a0d3a4366cf1b4a8fc3914e.npy +04401088-595901b2d5b23f58ed756341424d6b8e.npy +02933112-5aee956ff28e337a44221bef0fa3c36b.npy +03337140-6a98c9c55ecc6a2f4c3aee8e9d3a6ffa.npy +02808440-549245920e6e0e7c6b448b8aaebb705c.npy +02691156-fb48754430b17846e3375a6b96a1d765.npy +04379243-2f7a2d27e58224e689035c25f0dfeb63.npy +04379243-fff492e352c8cb336240c88cd4684446.npy +04379243-a09324ab0389029260885f79b3a5579a.npy +02828884-8f24d2e90bbd5855b77d52b64ec9e9af.npy +04256520-99175131585f4cfded403132b02528bd.npy +03001627-308e56be04f6214e50ed95708c70cdfe.npy +04530566-d25531bd6b7b8274ceb0dd441125df3e.npy +04256520-9001c9558ffe9b5651b8631af720684f.npy +04530566-cb7bc049274173df73a75ef44d66eede.npy +04379243-10657fcfce1d326b30bbd4cddd04c77b.npy +02933112-698debfccb32f7404c62bee40dcdc539.npy +02691156-f944c570191885e8ca8607f540cc62ba.npy +04379243-3a36028507ffd1a6ddd15630382184f.npy +04256520-eba5b24b9c3dc8cf9c0ca344f487323e.npy +04090263-c7fc0b36bbaee6382bf26da672b84220.npy +04379243-46957ba752c3554bd42b9650f19dd425.npy +02958343-e6e932a5d92d62251d15f502e679d4c.npy +03691459-65dbba7ce5b4c40192e34403f6f6f5f0.npy +03001627-248e014f31771b31d3ddfaaa242f81a1.npy +03001627-5f1b45295c72cdf03a4a5c95fa1b0032.npy +02691156-d4849eddcd93569ac119f94203b4868c.npy +03761084-4e0b08959229923f2ccf9daeb92717bc.npy +04401088-5bb9020da1d3bdc260a9d7568d474ade.npy +04004475-63c80a4444ba375bc0fa984d9a08f147.npy +02747177-a8b39c32604173c1d2b12aa6a0f050b3.npy +04379243-29f110b8740bd8068c427edcde5d5e2b.npy +04256520-1f8098eb2fe947398dc38b92af981645.npy +03001627-b69ce6bf8156deb155252a6eccfc24f4.npy +03001627-65b21a2af8709510f91663a74ccd2338.npy +04554684-ba5ea28f0065c71cdf3a1b0d597ce76e.npy +04256520-bbf1d8071651580cc79b370d801db3b7.npy +04379243-b7d6030b31b59895ba0b91d2ba672bfc.npy +03001627-ba707bbbc56d1bc319620b61f6587b3e.npy +02828884-88440ae4e218fa6ed4d8765e3910f617.npy +04379243-166cb38606acc1834265eb8d6103818.npy +03001627-2620443433d2292ebed0f46f915a3980.npy +03337140-59184214eb54c1144c3aee8e9d3a6ffa.npy +03928116-5c2a57c2cff7cc06d636d2b2e734dd7a.npy +04090263-b9220d1c981e2824377a1335e81633a9.npy +04379243-9be8aa90001e8f6b492d9da2668ec34c.npy +04090263-ff46f3fdaba78638aa7cb0651220ba4.npy +02992529-df768d07fc99eb30142bee3d28727203.npy +03691459-b0705be54d6220d9a344697865361601.npy +04090263-287f4e9b70b010a29ddd1aa0a00ef579.npy +04379243-5d30966509f58394237c47118f6132c8.npy +04530566-160271b40b1d6822c40386bdd72f9a0.npy +03001627-6251b398004a02fffebad4f49b26ec52.npy +03001627-428b77d0ffe6ab456e06155d245f15d6.npy +03691459-8dfa9921e51e0fa3f99860cd321d6c67.npy +02958343-cc7dfb5ecdf370a178c14a9d99ecf91.npy +03642806-aec07e314b2fdb8a60a676833b21afd4.npy +04379243-2698d4b8ff59120179b3e1be3524f72f.npy +03001627-c12ea730ea29f8945914d57d976758c0.npy +02958343-a75ff576da012340468bac13e007a6e9.npy +04554684-c18dffc90a4633d191219aad82abc053.npy +04401088-457b4310870bcf047f4e0c14aca1a926.npy +03001627-32d243fc56b7b8658cbd400aa99bee96.npy +03636649-9ea81b2f43dca29c5412c66cb6f267da.npy +04379243-4df369ee72ea8b2c3da27ece6ae88fff.npy +04256520-dbadee62f27c31e9214c7379b0e80b7b.npy +04554684-30925e14af2a92814b35a7d7cea7130.npy +04379243-fcbc0127388b446b7d6b442f66caef56.npy +04379243-ce422cb06b1f372c561f802d2e81cd69.npy +02691156-9f18925334b6f37bd560687a81f263dd.npy +03001627-9b82e2d4714b97827eaeab1f0c9120b7.npy +04090263-6cf13d5b7791b8618af39b443dc477ce.npy +04530566-18f650bbd1068f0589c6f1079da7a8d4.npy +04256520-5f145696aaef1e6f342398ca9dc32672.npy +04379243-d9512362b43efd8f91fee7773e951339.npy +04074963-9716c839bba80514906ed109a4ea50d6.npy +03991062-636b7d403c7717c3edad66bbdfe0c434.npy +02933112-367044e655cdce1f109be8beeb87a681.npy +04530566-5573567872450417d61794222ef2800f.npy +03001627-73970143d9af7218c8687ff9b0b4e4ac.npy +04004475-1d8d5d60023482dcab0a8ebbed30d677.npy +03636649-176b4495ed006475bbf899459f3f71bb.npy +04090263-bc135e8d9571775f20b92c47b3d5c1a3.npy +03001627-4fe364b3390d3e158afe76b3d612e00b.npy +03636649-e04e5a96efd77a6ed2f5c44a5922d7b9.npy +04379243-a3f3c3f288a750de83d38badc3559dbd.npy +03046257-23bbab353b849d3a6077d83faabf62af.npy +04256520-a97a1e97d08a236a68d1b9a1d97e2846.npy +04379243-e03d534f3ce3c77d19fb4103277a6b93.npy +02958343-c5b67d87b22583dc13ca2951bd3ea3d2.npy +04468005-429f55d65314335592428dddcdfd8a50.npy +02992529-5c8d554075a904bfa7ca3fec59d82214.npy +04379243-e3e1762fa7f935b3f6287cb48a47c45c.npy +03211117-28ec688f444eeb4a394b1e418d5c594.npy +03001627-bb9027dded04f7da2b3e9b6eb52d35df.npy +04330267-e8838770de9a6e4595feea036c244c98.npy +04401088-6d85b3dfd681eba530400184d5d3220b.npy +03001627-2e62d5829f60bd7758df8eeaf3dad1c.npy +02992529-bf2f0de18abd3bebdc858d428f2620a3.npy +02871439-35afa1b806556803e99c79bad29da781.npy +02933112-c3dd5d3f16f231c7cb0c0d433974e32b.npy +02691156-a9cdbca070047fe61e9dc95dd6a9f6.npy +03593526-b1271f402910cf05cfdfe3f21f42a111.npy +04379243-d1b4a4f43818c34e490ad276cd2af3a4.npy +04554684-e0bb2eefa09251a6149c1768202b4e64.npy +03001627-e31c6c24a8d80ac35692a9640d6947fc.npy +03001627-c64691882dd54d0eec1a944671ba8259.npy +02958343-7bce50c36d8166608e35db9103756ad5.npy +03593526-59deef87601c4a86664b3b9b23ddfcbc.npy +03636649-58d8496e15d6945bc562b0b258e20992.npy +03001627-e2cef660d0d7a4629976735d0dd7540d.npy +03636649-280fa01686e780ba3501c961e91ff6d7.npy +02691156-24db19ddb06fcd3f9a6e43b878d5b335.npy +02924116-ae4ded29e55b2173481aa8b5531c68a9.npy +02871439-131b5b691ff5bff3945770bff82992ca.npy +04379243-df63a11436240ec7fb906a2c84fd375f.npy +04379243-ddae5f8a28d8d616e4bbcfa1dc6a2906.npy +03636649-73ed11936acd99a627ebefef2b2130c8.npy +04256520-a0eeb4524c84f7a0b8a09f7075b904cc.npy +03691459-ca3d4a62e7a851816463df620b7b4cbc.npy +03513137-10dee7587a785cbfe22dbe8dd678fde8.npy +02691156-64da2f66ccfb98c6c511571426f8b16d.npy +03691459-6b5458409e54d8b99c5da70959a4c7d1.npy +04330267-e8deb7d4453601a5a53276bbe109327a.npy +02958343-7582e942f3e60a7c1477c1a2d9ef8312.npy +02992529-c145f0b0f18d4afe99aee91747c9768.npy +02691156-152d35bcceab5592eb1a0518c224975f.npy +02691156-c3454da26509937d4b4c1e25039af4c8.npy +04090263-ab0fa4305623f6c3cdf27c4099cb6beb.npy +02691156-130422d62194cf026c8067e570d6af71.npy +02691156-c64e43e18b01fb5eca8607f540cc62ba.npy +02958343-c83458f94ae8752f63ee8a34069b7c5.npy +02691156-b5d0ae4f723bce81f119374ee5d5f944.npy +04090263-8935329f244ca398cd89d443b4b6353a.npy +02691156-2407711ff7759994101cacf58b339533.npy +02808440-986351819dec1974fe52ffd0e748a1ab.npy +02808440-8c4d0c92f26217a84c62bee40dcdc539.npy +02828884-8861988f97b2e8c722da8c30c5c6c8ca.npy +04379243-9d57cb805345d761beedb4c8fd29e2d1.npy +02933112-3e4d14a8716d2418999b33727fe6db14.npy +04530566-7ba457477629beb8888d5ca4abf8aff.npy +03001627-2a2e5ecd0ef6ab2f80360680c1602c7d.npy +04530566-c3d22ce3607156466ac9421934926ab8.npy +02691156-4c3b1356008b3284e42e14fe98b0b5.npy +04379243-a94ea7183f27073248c0c0980e363341.npy +02958343-d142c919254dba0e41ab8016efaf0266.npy +03337140-db9fab17bc383c9e91c352d02061b3f7.npy +02691156-ecc50d702133b1531e9da99095f71c63.npy +03636649-ed1de19103e97b74c30ba10ebbf8ea21.npy +04530566-2fcb8c472f1cbdef185cce17ce166549.npy +04090263-899e86a8dc53568694deaa9fff391d41.npy +04256520-6fae3f21375b43b24ad33b69f9597739.npy +04256520-6bbbddc84bc4d3a68eb3bc6c6d15f9bf.npy +03691459-9de3cd602d12d178887e8faf8f33b0c5.npy +02691156-aabbf242aabd1af7766c6046535346e7.npy +04468005-fc21dfd12e8eb8ded4fec646771c576a.npy +02691156-32637024c9aad5289a6e43b878d5b335.npy +03636649-2b1817fbc0f3ddbe8220566e85550c0a.npy +03001627-ba747d0535cb7fdfbfb5bf9fe49f43af.npy +03642806-ebc59a9b4291ce274c3c121820623e4e.npy +04554684-aa9d1a55c1a546a1df3a1b0d597ce76e.npy +04379243-d177f7632a4bb3405073c32a9cf4a6a9.npy +04379243-f6f3b8e08af617e44733824eae5cd9ae.npy +04256520-16bb3ec52397cdf9cf01bc59d215f0.npy +03211117-646b0bd4e03fba8d566636e42679cc7f.npy +02933112-c060caaa105890d74da5feafe6f1c8fc.npy +04379243-28fb9a81898f88c4ae8375def5e736d8.npy +02871439-5c7914575a4f671d4b209708994baff7.npy +02992529-424ccff9ceea33451c81652b127a0ec9.npy +02691156-f11d14402a759a1465f50257ecdfa5c7.npy +04379243-103ad97126bc54f4fc5e9e325e1bd5b8.npy +03759954-365742901915252a9c75eb4326997fae.npy +04379243-7d6d7984fe8eeb3099e8bf807e902261.npy +04379243-c2c36909e461e10adaaaeef365d8f6e5.npy +04256520-11d5e99e8faa10ff3564590844406360.npy +03636649-e7e45a8f0b0ab311c754474f0ac106.npy +03001627-26e85b84b3b6eeea21711c78ff413696.npy +03001627-19d7da928d179a07febad4f49b26ec52.npy +04256520-5c39c2691a36d9e5a8f59bb67a917984.npy +02992529-612466085d24ce50b260ba4e94db1a27.npy +03001627-7b8e24c31b7509b6dec3f6fd3a03085e.npy +02691156-32e8412ce01e63c1a47575cd04a1d851.npy +04379243-b7e3aef758749005c3bd24f986301745.npy +04379243-7eb961d3f19080983ac416718757a350.npy +03001627-3021054d61c4862bf29666f384be6c43.npy +03948459-ddcab81a79b6d9448618c83c15f2c76f.npy +04090263-96c60386a5888d2094deaa9fff391d41.npy +04379243-64dedff769355d281bce08795c661fc1.npy +02958343-4036332be89511e31141a7d4d06dc13.npy +04379243-a96c429fad0af4c6bd1cdc725a461877.npy +04256520-638c8ca3dc94b152f6d79b8d34aa426a.npy +04256520-11f47772cbe2a2d0a5f9d52c12457194.npy +03001627-46bd3baefe788d166c05d60b45815.npy +02808440-5ffc44cc5b953a4b572c0ed39433d683.npy +04379243-3e42e3386f4aea9277cf3bb06f394ad.npy +02924116-35bbe8b3dc78680f2232a4c7acb57248.npy +03001627-b1f311d5fd262efcbc47c7f012e5fa27.npy +04256520-235c8256c6e973de19fb4103277a6b93.npy +04379243-4a579619524b60aeba18ade30e563d37.npy +02954340-a3d8771740fd7630afd6b353b2d4958f.npy +03624134-fb1f385d487d13d7aa0079d6fb0f853c.npy +04379243-97cb53b5e54a2abedf6cfab91d65bb91.npy +03636649-abd8a95ebe132c58cf004563556ddb36.npy +03001627-7224a8114ee2daeb0c0a8b87064ef09.npy +03001627-a7f0f0dce71747624671d97b0fd17f51.npy +04379243-a4d149a48607de3d92f4c88fd91c6b1b.npy +03938244-3b5e274f653258a737f437b479038901.npy +03001627-5f4af72ed8cd633a14038d588fd1342f.npy +02691156-30b317e256e9bfcb1f17e8416b3322a8.npy +03001627-2dd12e29d36c2b5519fb4103277a6b93.npy +02691156-959044f10e27b89ee664ce1de3ddc8b4.npy +02958343-96bf8cb730f728414a383db4764d5432.npy +02924116-e3c8034ece8bb14ac72758c329889173.npy +04256520-484259aff803ddd6f51fa0238791f5dc.npy +02933112-c7165635f2288945585ed17f54616d23.npy +04379243-f580dcfbb898139df6cfab91d65bb91.npy +03001627-a996cc501faa4ec841c6494d29fffa82.npy +04256520-6a6c10088c857de114038d588fd1342f.npy +03211117-830b29f6fe5d9e51542a2cfb40957ec8.npy +03790512-efe1456e80e2a8646350c50e0a456641.npy +03797390-c6bc2c9770a59b5ddd195661813efe58.npy +02958343-5ad845ccc1a5795ecc19d582c2bc11b6.npy +04256520-f7efea85176f8cd01f274b4885739ec6.npy +02958343-4eb9dbe42616e407b112e5ac235c21b7.npy +02828884-aa2571b8067d6d5383c4907a93b0fbc1.npy +02958343-586da8cf648767222a9eb0f146e94477.npy +03001627-c08c39b6ae7a44ff3935ca98160cbcab.npy +02691156-1d0c128592385580e2129f6359ec27e3.npy +04530566-3fb4fa12a4718cdb2001fe4ad7074729.npy +04530566-7890b89eba662af0ce90854bc9efdc95.npy +02924116-2b5dd01279b39fbc128fe65339f3ddb2.npy +03001627-b33e6d5d6bdab020af7c7ad2549a1b15.npy +02691156-2f7253f8fd1a6a999a6e43b878d5b335.npy +04379243-424c77a1f39ac41620dd2dd4d7d7656c.npy +04401088-6039379abd69be2f5383626fb6f0dbda.npy +03691459-4fca42120b49baa526841583f16744a.npy +03467517-b4fac38edb5b311d4fa7c0fdf6bf7f60.npy +04379243-700f59abde33ee3ec2d043ecbc42284c.npy +04379243-14624a2cc43aac50e3a031805ace4a99.npy +03001627-4148f94098b428095dc3653f8341633a.npy +03001627-7ec2388fdc271fc4ef22b31268b1b7ab.npy +04379243-d236d890ebc96f9ddaeb6f944439aef2.npy +03211117-df81df82811b2b2fe2d8a7cb76d59615.npy +03046257-b53a925ecca75b04455baaa8ae183248.npy +04379243-855e3ed8e5f233cd2b722fc42ccb4c6a.npy +03642806-ab21f75b97d6b1054f22ce0a3592d5.npy +02933112-29b34b5121639a65c59350d819542ec7.npy +04256520-b1b2195e45bf0495593ebeeedbff73b.npy +03001627-9e9dc51a4e0db2e4c3bd24f986301745.npy +03948459-7bd66b182aad44e79a2ee232a197081e.npy +04401088-d62ebc23fe1a7e6a985b19765176f4ab.npy +03001627-a58e894d520ebda28f94476574196c14.npy +02958343-702edad0d2fa9eda2a9eb0f146e94477.npy +04256520-effb1b260f100f5919fb4103277a6b93.npy +04256520-2d3a484f14ec3d4d7b11ae648ea92233.npy +04379243-259775bd1af2954e30bbd4cddd04c77b.npy +02876657-8a23e8ae357fa2b71920da6870de352.npy +04530566-6d537a1a09de6b13f5678db9e73ab77e.npy +04379243-1bf9ee6578bfbcb0f4b6538438a0b930.npy +03001627-5a2c6a6f832b14ed31251f4428012eaf.npy +03001627-f14fd8433dc1b43efe9f0f410eddfda5.npy +02828884-694681de16b492987170f3141eadbf9.npy +03001627-a1949183ec03f3ab2f6cf9c2cf79a5.npy +02691156-bb6bc2b0786734a79b2acbfd8323f804.npy +04379243-4f7c024d01141f23f51f77a6d7299806.npy +04090263-955021cff365f5907ed475464ab76870.npy +04379243-f07cde4ef5e76ae6c4cd9efc031e94b.npy +04379243-dc5b7cbcf45e557f310af74324aae27f.npy +03636649-6fbc93ef5b90b06ffcb8d8c6d4df8143.npy +03691459-9a35e159b52a7b1897bc8a58bf164429.npy +04379243-388d9e7b2b8a8f909492fbce0bd54e2e.npy +03991062-2399ba91d5263c913666eb1bf2ae701.npy +02876657-2722bec1947151b86e22e2d2f64c8cef.npy +03467517-e12d45cde8e886c463e148e250c0340d.npy +03001627-f05cdaa4f262ebfba16baf954c1d99bc.npy +02828884-8f52743c3cb564f149e6f7df978f3373.npy +03636649-581ad338a34dc3bc30f6e0ede20c4525.npy +03001627-66b5fd596ac18aa79c1db271ad9472a7.npy +02946921-be67418a10003cc9eae3efbc9dbeea.npy +02992529-d8ee6baa8b57a89add62317fcd30f203.npy +03001627-523a54d33ce5fa9aadcbe68a4d5871f9.npy +02958343-53e7ed598e9c3a09405f29f7fa3f25df.npy +02828884-360d4f846b37b7fb5b9049c85f69b9b4.npy +03636649-934981825fbc4e14ff458e602ebccbb0.npy +02691156-8338cdc32688a863bc0909d98a1ff2b4.npy +03991062-53b0b1db08024807c995f1efad0eebc3.npy +03001627-c31483b018ba90c30e62accf4408263.npy +03001627-bd867ce1ff2dd281a0f7d9635ddf7a01.npy +02691156-1e9ef313876bfba7d02c6d35cc802839.npy +04090263-3860f5c1ebea3de7fc3c7341bf676efa.npy +04379243-5e8452a2014eadd5ea8049eca11c54ef.npy +03001627-d040157682f60a7ddf6cfab91d65bb91.npy +04256520-17fbdd9d8e8b3e8dd2afe8d5254a0d04.npy +04256520-4a11e50e8e5c79e82cc460e9d064e57d.npy +04530566-6729875f6c9b48cbe4707b1374ec004d.npy +02747177-555f9430c2ca273ccb2a965e75be701c.npy +03211117-b7a259bd391ad43c69b642ba22680f87.npy +04256520-1e70ddc0e4cef3a832a785b4a7e37e67.npy +03636649-c233bd44815828b08bd5065c89cb7063.npy +02958343-ab8b6d39057d2f6cc86779a6788ad464.npy +04379243-7041d4ec390b8b12234a98794d9f2b5d.npy +03046257-4325f0de6001e3a195f577622f465c85.npy +03797390-b9f9f5b48ab1153626829c11d9aba173.npy +04256520-4653af854bf098f2d74aae0eb2ddb027.npy +02880940-154ab09c67b9d04fb4971a63df4b1d36.npy +04379243-6b9c15484369406919152a83d1ba40ea.npy +04256520-7b7c14e8fd0521bde4511d9a59e40339.npy +04379243-4f70d14dc276a9539a83764a2641fc5c.npy +02691156-2767994ce3078824f38bce64a8733419.npy +02958343-c73e146596486bdac427f8508e3d634b.npy +03001627-5da96a876b66cfeb922f1115ce03b77e.npy +02933112-61b9d7c12ba7aed4c59350d819542ec7.npy +04379243-614c37441ed33c338a3c75a1023723f3.npy +03001627-311e72dd86f0daa981a172d69c52a28a.npy +03325088-160bf4447843d769e6460c75101f5b6.npy +03001627-6df81788b1cdd1c3ab93f6188b226527.npy +02958343-f9fbc58e3692c4d5583d20ad0a6b981d.npy +04530566-5a4e0cb4562b2e0ef647317afa6ffdd4.npy +03948459-948732c47471ea808e75bb5638d14ce9.npy +04530566-aec5ec913aa2084b543941eaaf04581f.npy +03001627-c5ee6b77f9f84adeed52100e321c9f3e.npy +03001627-2282142b6b136a6f2ebeb1e6a8111f53.npy +03337140-fea46326afa3180a4fb42087918269e.npy +04379243-da7310bedd8595879daeea1362fbd792.npy +04256520-1d4e0d1e5935091f78b03575bb54dfd4.npy +02828884-bff5fff9215b5c412056b4bd5d870b47.npy +04530566-e57c1a72d265147548c2e07e979bc75.npy +04401088-67b3696286a96a8c171bc7a10f38839b.npy +04090263-56a8f2d9908cb417609e2d916fa0da27.npy +03761084-7acbd3fd7d1425e38f029c88b393c0c6.npy +04379243-4e3d100672af00842dc02296076d8ee0.npy +03001627-d554adc917b635c0fdef1c01cbd4ae0c.npy +04379243-28ff86c01e0faad758df8eeaf3dad1c.npy +02958343-c31891b69780886ffb907109397a6c7a.npy +04530566-860e632b27b9d2469f1deb04fb8ae481.npy +03211117-d9bc4b2da5df08b7eedaa5970dd41792.npy +02958343-7fc1cbdf81a1edf5bda733a39f84326d.npy +04256520-69e8d0b7366591dc578d107c71db28ac.npy +03001627-537924063294eb5f46ed025f8f85e067.npy +02691156-77ee6ccca238ceec5144962e2c20b832.npy +04256520-b2d70313d7d408f729404a50338e24e7.npy +03211117-e1eb75d031091e422616600cb9fa6226.npy +03593526-3ca8bda43d9d5775499773b0b5888ca6.npy +02828884-50ef39d633520df0855931d119219022.npy +03691459-dc9f8240a57b7be77fd9594c37158b0.npy +02992529-f48cb1a242e99745ab905891b6fa1a.npy +03001627-6b796faf03a2806f397aec0de5712401.npy +03001627-5d92fd12417a9405cf004563556ddb36.npy +02691156-b8df5a1fb0fa198a9a162c818d22a620.npy +03001627-eac0a44a4b4bf460f37e11038ce8fb27.npy +04401088-7f756e697cd03ac821844676433a0aca.npy +03211117-7525e9e986fa5059f64945cf4aa3c1a6.npy +03001627-1eeae84f10df85cd74984b9cd0997a52.npy +02691156-95a79d9ea571592bc3e5025cb598f546.npy +03790512-115a5200ff80b5d0b37378f3c85478b4.npy +02808440-c6ff7725e2e3832835b3d63776480dcf.npy +04379243-8d3d9f1bdcb245b49eaa55bb236fb6e1.npy +03691459-40f0e44f749ec0c7b3e0a2cf776be56f.npy +02808440-fcafadf19df05ee11bb088904f7cb154.npy +02933112-d68b1b0c95408b95380188eb80c957bc.npy +04256520-d6f7727a3e5736437b9c6deef486a7d8.npy +02958343-48f5446e6ac9c1b51f1446551412bde4.npy +03624134-81ba3f06ec38eaa46016d22b1dfacd4b.npy +04379243-e476ca4169c3d0ca490ad276cd2af3a4.npy +02871439-6ae80779dd34c194c664c3d4e2d59341.npy +03001627-323ab1a1a81ef0f51f77a6d7299806.npy +04090263-db313451e6581570e16974ffd95b0c65.npy +03001627-6f754a2c354b17642c0eb4a518e123ac.npy +03325088-a4bb5d2f36b1319f50da8b99982a3057.npy +04379243-b3371ffc36150f817bb281f66a49b55.npy +04379243-ed20a233783090839039bc4ea22a379b.npy +04379243-41fb180e6e8b19a14ee40fa7f6af487c.npy +02801938-bd11c268ebb14e2d7ae6f33544c233fe.npy +04379243-ae6594f65639a51845f0e5dddef26b1a.npy +02880940-6501113f772fc798db649551c356c6e8.npy +03046257-90526ad050d212adfc00df8700518cc6.npy +02691156-4853e07c17127af7df92be10876fa000.npy +04256520-71147c7ef2258b894a1a4db9532622c3.npy +02691156-5fc63354b0156d113136bac5fdb5050a.npy +02871439-f5114cdda24d49216638e88207c822d8.npy +04530566-9b300840d96e46f08c173f7caf7ef0ff.npy +02808440-89ab13233adb2f879d57ee14f8ee702.npy +04379243-8d84471c4af977d917271868b642acd3.npy +04530566-4b54d54c1e9cd6cbff5cc490d863ff3d.npy +04401088-8e9c97d54060d1282085d549612807d7.npy +03001627-7f8d63acb7b4b5e84d2f52566c6c4e9.npy +02924116-9e14792c344aa053e78cb83d32b44564.npy +04256520-a73fc5b447cab6493ca57f5648ff1b0d.npy +02808440-5b8d1278d408864eba47eca8aa80094.npy +03691459-91ae8db92f3dd88b55a8aec4bacc60b8.npy +04090263-c7f8678e3ea91a99de50356926b60476.npy +03790512-25ae9e6628ed05d81e32f79edfad8027.npy +02808440-e34dbb83a23b3b019bb88ff9c0d772b2.npy +03636649-4d44c896993e80a11391d5b018495c2c.npy +04530566-f2c8239dc51b315858e86ae676396826.npy +02691156-3a6d6534045b1895e8ed194c80e0b1ef.npy +04256520-aebb3daec0cf81e695b2988c41a35527.npy +04530566-99d12cf62a1b5cc3f4352ea917328a5b.npy +04090263-6cff6f4bd6a5d73e8411da876c84603f.npy +03325088-e10b62f9792ecdc1b362845c6edb57fc.npy +02871439-601359d274c2c00a1497d160eced5e7a.npy +03001627-8b3d1c34753e095cb05550de345b6d0a.npy +04530566-e456eded209aac05a8b0c9e2ebd8eeb.npy +03001627-e2c3729e9729b75f40ef1c8b63a628f9.npy +02924116-fc5863dd1595add5f95dfd5eb5f06d19.npy +02880940-aa70f5e55fa61d8dac6b8e58caf61f95.npy +04379243-30820b470df63087afeb21083ecb38eb.npy +03001627-8e945aa01bbacf7c3fbe480a485feffd.npy +03001627-5555c24767e66a3384633b41c8a09fa0.npy +02691156-86e19045d9f27bfe269856bd6e519d10.npy +02880940-4fdb0bd89c490108b8c8761d8f1966ba.npy +04401088-1ecbb2ddeca087b5fd71b7a0b881ae82.npy +02691156-bb5844976bf8ec479e8d5aab043eeb56.npy +03636649-cf09b30a89f70929cc67b3de75c44c76.npy +03991062-f33a6fd8d570b5de4e7284648d65204e.npy +02958343-7c4aa4b3f916d26c9cdc71dce6a3b485.npy +03211117-993e7df9e8166312af8f68791a7d624.npy +02808440-60427211b9845f4e9ee028845f1b68b.npy +04379243-4ba447371db8c37c74739c2c9ecfb3ee.npy +02808440-5592d42aab84d67dd27bbf2d1aff38ec.npy +02880940-13e879cb517784a63a4b07a265cff347.npy +04379243-8bb3a7e1cb24fe6febad4f49b26ec52.npy +02924116-57e1aa38fcc42438d3a958737449e7cb.npy +04256520-b24e1117e49c75f817b431cae0dd70ed.npy +02958343-b2f06baf5851e7a36df8cb2765f8ec95.npy +04401088-5ccde0c95cc0538ef39072555215f568.npy +03001627-4afbcdeba648df2e19fb4103277a6b93.npy +02992529-83f766eff3c5c12c781fb7da315db2c1.npy +02691156-aac4ceced7042e4c1a6d59f1fe711d12.npy +02691156-7f895411162624e92023ec956848b741.npy +04379243-ff5a2e340869e9c45981503fc6dfccb2.npy +03001627-e401be99c5a51d8bef8e9284f76f3024.npy +04401088-294d1fa4193f54528db944c07f28e3d8.npy +04468005-1fee0527788d5f6fbefe0ffe2abbe914.npy +02876657-e29e8121d93af93bba803759c05367b0.npy +04401088-1cd8004a1e0dd825c33f370fa5b41cf7.npy +03790512-d91a81a1d57ce78a739936b7765e22ae.npy +02691156-4385e4300e72e49e90b1d6deb98feec6.npy +03001627-c79532846cee59c35a4549f761d78642.npy +04379243-712a7d7ab58960829408655f72318aa1.npy +04401088-4991cd37af08577070346e4935b9a42b.npy +03325088-d40acf58d3ab13763321831d2245cf06.npy +03593526-17bd8e7317498f21f0afc55e2266b11.npy +03325088-80b9619326f25bac3321831d2245cf06.npy +04379243-7122eeaaedc364fab5e360679943d9fe.npy +02828884-238825520fbdda8e6a4265f8860b466f.npy +04530566-eb1b91b2e6458a813f6d8df212adba77.npy +03636649-2e32934d4a49c374b20bab10aa3ece03.npy +03001627-4dde5285971f0b73ba4ec8b7deb104ae.npy +04256520-9cf60525ffd70735edcb0677ec04fe0f.npy +04090263-8d5c7600f31e45482249915e95f55f08.npy +02691156-e726c8e6897130439a6e43b878d5b335.npy +04401088-9f3ad4e5f16f40b3d0f9f958bc79097c.npy +02808440-3a5a6113f20f7462c0f3ab010f0dece7.npy +03046257-4d7de5c46a7644fe8b7965c971f6e497.npy +04554684-880a6bcedaeaed1fd095418bcfa348eb.npy +04530566-55dce6844c2bb0145368bed34e5564d5.npy +02691156-e8409b544c626028a9b2becd26dc2fc1.npy +02933112-140ec01582235e15c59350d819542ec7.npy +03211117-fc0b4809f5a1a613496b87cefd345586.npy +04379243-aa3eb180a4f6d8d42de421c2ab5cfb52.npy +02958343-86c31c04c436f5932e877e82c90c24d.npy +02933112-17ad636e45c233bef79e00aae9a7dcf8.npy +03593526-7333b1ae767c03db2396ca3dd50467ab.npy +03001627-bd0b06e158bcee8ac0d89fc15154c9a2.npy +02691156-688c6d406c789b8d71d03b466c72ce41.npy +02992529-f6679591247bc328afb07a946d621b3c.npy +03001627-a63d7b6e62333b23ddc809959e304d48.npy +04330267-55878303fb7fccc58e4d888a487bbe11.npy +03797390-4b7888feea81219ab5f4a9188bfa0ef6.npy +04379243-a39677e069564a7ea7e7cb173e141227.npy +04379243-f7ddd0ae5b0107efdde6d22342684df5.npy +03001627-e594b1e2f7a7f677492d9da2668ec34c.npy +02958343-92c882d35dfca864acee48fc4abca0f4.npy +02747177-abfc82b4f2071aa6ad5067eac75a07f7.npy +02958343-6ed2957beeb7940a9fbaa69916aaebda.npy +04225987-254feab290d4b460d4e77499b42cadd3.npy +04090263-c640c5ff1527fde7929ae5eb653afaef.npy +04530566-aec79b6f0379b1749fb6fb8ca3454a08.npy +04256520-9d1e8c37315e292f31a50841704a69bf.npy +02933112-31a142710610023cf51f77a6d7299806.npy +03991062-7c1303d3a19a1cef51f77a6d7299806.npy +03691459-20fa8d1542e7f835efaf604fa2300241.npy +02818832-1101146651cd32a1bd09c0f277d16187.npy +04379243-e6b61073fa46571df71e06115e9c3b3e.npy +03325088-9199954a99393c6e6d0157e3e7a8917c.npy +02958343-4cabd6d81c0a9e8c6436916a86a90ed7.npy +03001627-cc1dac5070d0bb7d5c43d2b61614d0d0.npy +03928116-d9b103dda28d8d20bab3d34d85dc6ddb.npy +04530566-4e6313bce5ee3698909d4348e3fee2dd.npy +02958343-7c5e0fd7e8c62d047eed1e11d741a3f1.npy +02808440-73baa3af38c96a52c85e7a9bf0779313.npy +03046257-8978869197f846ab31a50841704a69bf.npy +04256520-e014e3cecb1bc2b949a3c1009fa79820.npy +03636649-98ae07e021f3227711d89826bd8e0670.npy +03001627-a0196df591bcb5f7e404848d22e4a58b.npy +03636649-833d33785c62634b192fe29c2d3d296a.npy +04225987-c190e478faaca09baaf812076502792.npy +04379243-83952bdf5c426c4a85cad391c250db01.npy +03691459-99dce9c359b0bf4afb33d0031815b3e6.npy +02828884-6eaa388bfa782df4392580629414747b.npy +03211117-732dde95416888ac21d25a6a55757584.npy +03001627-3c363c3a75aa1daee8f8c11a24c52ebb.npy +03691459-37758713e7a31d1710b84d6f34c2f2e1.npy +02828884-8d3e69ee2d0168a6d4d8765e3910f617.npy +04379243-1b1f24767e5555d8c3bd24f986301745.npy +02843684-4357b7e7d5b0607d961dc4fac22bbd1f.npy +03325088-667db69a5d07b34f50da8b99982a3057.npy +03691459-fe977bebc78501995996c3a82deb78d6.npy +04379243-a7ab2b8bbe94bc89b41f4c6c5919541.npy +04090263-ad945e636e38338d8aa7cb0651220ba4.npy +02691156-38a8e07ed9b0da99fa7918e5874b2c16.npy +03691459-38007ed3e5ce40ab13dd6eafe1477be1.npy +03691459-86adab79cdfbc284d7872acf770948a1.npy +04379243-2d4005749db552232430716fc386281.npy +03790512-177c8a8394f5a78772408d74edbb952e.npy +03001627-f31a13e903da7e865e61ef8e2af97499.npy +02958343-36d0b6beaffc68ceafe1d4530f4c6e24.npy +02691156-213cdfff847f32135ae839ffe09b9d31.npy +02871439-dda1bce96f08098ad072fd39a51dc44c.npy +04256520-2a154c6f14a749179f6fd848d2db8a5b.npy +04256520-57e1cdb6f179cbdb98e0d1738edd4f19.npy +02933112-8b24699e1351a78ef8e7f2c38fe37243.npy +03790512-3a94134ec9698b74ec5901a85efd6b67.npy +02958343-44108b58784ea6a1b5c12c7484d0ec31.npy +02933112-4ae5df17829fb50799dd23ec22c4943b.npy +04401088-58d40261b05f9a148abea0092096036.npy +02876657-d3ed110edb3b8a4172639f272c5e060d.npy +02691156-167a44b60adc37319ba010ddb4974fe.npy +04256520-9ea38e213819c55680dbca6e7b64a4bc.npy +04530566-afcafaf311af722a5446fdbcaa866773.npy +02992529-7bd964021c9c26e0e4b68d3b17c43658.npy +04004475-4a49d478c563bd7dad3955f0fcf64b8a.npy +03325088-19a3ce38f92f792376c18e71fd49c4dc.npy +02924116-fe66024bddbfb69310c9db2520d67003.npy +04379243-b390566645360e5d69fb38085fbc320c.npy +04379243-f5526d438b53a244bda2eee2725ec127.npy +02876657-3f41aaa42a237fa3c785f06f424b9d06.npy +02958343-695bc26f67e001e65bcdedfa3370f5e1.npy +04379243-c67b454761d7c84eb2a155afd9dbbb0a.npy +03691459-102f9164c5ae3846205b5aa6ba4df9c8.npy +04530566-2552d0de59d21f1bfbc6fe0b6b7dde54.npy +03211117-7a2d9d3d185cff794b85c79082892df6.npy +04379243-948f1bc3a1d574196086aaeef17e8c87.npy +04379243-54c121f22e8fb768b129901f80d24b7b.npy +03001627-497833f2073ba6ff70d45c28bef72613.npy +04379243-2362ec480b3e9baa4fd5721982c508ad.npy +02691156-81b67bd14fbcacefd67fc01cbf5eb7c4.npy +02691156-8c622c7e0b15a0243ec67cba9d24f2c9.npy +02691156-d109c08886c2a3dabdf566b587d6b21.npy +04379243-596f93940a4d97866c752a9b08e87ad3.npy +03325088-c5ec1e91a2de288fb362845c6edb57fc.npy +04379243-5c1f92f1c0bd459386a48a74e08b1cc6.npy +02958343-61ff6beffb91b6a82a9eb0f146e94477.npy +02876657-547fa0085800c5c3846564a8a219239b.npy +04379243-adbd3814cdb655a7b11ae648ea92233.npy +04379243-7d0b868cce75a059a0ab1d82ef09f78f.npy +02933112-55f08c36c20f161be186198f40d88f09.npy +04379243-3237f2e39e0f2f38c3bd24f986301745.npy +02691156-536e1640461854957a86454b5377c47f.npy +03001627-9e8e454c76cc6815dac5061520ffd33e.npy +03636649-e519ec9a23b1612dad19a449ad99c8fa.npy +04379243-6962e8f899bf60393d9c503e95bc363.npy +03691459-39ade62ad13e3c79206861ce7df4037f.npy +03001627-d323e6d19dc58526f2c0effc06a15c11.npy +04379243-fb6d011741ccdb374a00834418a35d1d.npy +03691459-e2d6a0851b9357141574d21c0c95092f.npy +03001627-954a964459d33b8a71a782a4379556c7.npy +04379243-ffa71bb0a75ebd7f93ad7cfe5cf8e21f.npy +02691156-3f80ce1461f3dbfe16af5d7a0b735543.npy +04379243-f695567555986b6a71f08386b3af436f.npy +03797390-34869e23f9fdee027528ae0782b54aae.npy +02958343-fc86bf465674ec8b7c3c6f82a395b347.npy +03691459-4421130ffdb720c7421e5649908a4a06.npy +03991062-1ebbd0a9e447cf62a2c59a4d90e63212.npy +02691156-e0058b4948f87d3b87697d3904b168b.npy +03325088-98b09e32fd09e51ab482922dfbcdcc.npy +02828884-4b495cde98399a83d4d8765e3910f617.npy +04256520-366c86849245170262f6790b971792e9.npy +03001627-76fe7cf10c5dbf1edcb466b6f48b5810.npy +04090263-fe21904b4e1548ba5bd1f946b0dbc061.npy +04379243-3c5281bf572e2b6f2b70eac6546e93fd.npy +03001627-8e779c0b252d4b5e118ddfdb81cc6068.npy +04530566-3f35daa80c8b364fb7b1411b0ad3bd0d.npy +02871439-1c1795169de018b97948cb8e1d9ee487.npy +04379243-c0b74c61865b563067dc358060e3c47b.npy +04256520-d0842064c9900af698e0d1738edd4f19.npy +02933112-e619cf6aa221424cf80ff10f4838c137.npy +04379243-f83f03cd8d6d787f73678cf8aa86fc01.npy +02828884-3f50c37f196c541e776d8bc79b9caa2c.npy +02691156-f7bf32d3aecd197360c9b6e4c75a092a.npy +04379243-bcc14b683930f8d33924adb2bfcfed72.npy +03001627-92cae2e67b788eaa9dcc460592c0e125.npy +02691156-25a057e935aeb4b6842007370970c479.npy +03624134-6128958f839431276978912735020245.npy +03001627-ed97d1c954fca49851ceffe90913a32.npy +04256520-509a533e17fa45572814c9aa90ee14e.npy +02933112-a53a96efb6b9f29a490ad276cd2af3a4.npy +04379243-372d52845e1c620fef3b6dbf349349be.npy +02691156-310f0957ae1436d88025a4ffa6c0c22b.npy +04090263-6a62d0d41a2351af7f683793234d478b.npy +03001627-8a1187956642c3895331e304403f2050.npy +03001627-5b89de55ce0f464221f824bda064425c.npy +03691459-8562c442745af497b5b6356ddd072fd9.npy +04379243-8ad09d90888f71dfcb9cf5f7d536cddb.npy +02992529-c71acd79ec4cf1cdd11ec2c68afc26e4.npy +04379243-b97a0bc7e2213913ae96150e4aa362f9.npy +04379243-3cb17903afe49e6962e682c9809bff14.npy +03691459-acd123e2a1fd25366cde9ab9486e09f0.npy +04530566-b9dde09099e081e65f76b0776a50c136.npy +04379243-4fc00c3e48cdee77883679e873099585.npy +03046257-ddc323f128d4bef76463df620b7b4cbc.npy +03046257-b0cafe0b5efb6cb44cdd82d9cdddaedf.npy +04256520-28e546337f4a5188e6fe3612af521500.npy +04379243-b7eecafd15147c01fabd49ee8315e8b9.npy +03513137-8e624ace735e6baf96c3bfb1b184602c.npy +03636649-3ef55697cf7f68061173b43d09e96094.npy +02691156-f9fb41a3b1f59bb027745e9b6b461e93.npy +03001627-aa2242ae4ea1074bad0881e4ef1ff29c.npy +03001627-1166b15756ed9b8897317616969032.npy +04256520-ec4948183b308204e4d5ca1617e68f91.npy +04530566-fb8206abb1fde4c08abe79d18310fd73.npy +03593526-d67ac9e710ba445089035c25f0dfeb63.npy +03991062-a30eea3bbb52b3d4f13ce777d031b4b2.npy +04379243-10e279c69b5678d39a45b69dede1154b.npy +04379243-f4203c90d740596f70b396e6f5e48bfe.npy +03991062-a2970be7c866fe33a2c59a4d90e63212.npy +04379243-7e967a3c6d2a46c3e2d62d6f0e6f01ec.npy +04379243-5d9f67dc1f1518b6d5f8f84e75452c7.npy +03001627-e9c9d998f7b0de3ca6afe5903a01a59.npy +03636649-2fa7dbc66467235e2102429c788ba90.npy +03211117-d2f37af28550950f4161e123a102b12b.npy +02691156-d3580448933d00fd90b1d6deb98feec6.npy +02924116-fd2ae226f9c957e8bd69e36f5d4705c8.npy +03761084-c597a020f422d48a90071898148dca0e.npy +02958343-66d4d1f28cdbe97559139efcde1fedcb.npy +03636649-878d76c9657bec71fa58f9bd5c78b9e4.npy +02924116-75fc875e3d2bd8fbf01129d246a5d1a5.npy +04090263-3b22c066b7786677b1c46f058c033ec1.npy +04379243-ae3f65ef020c8170cd80f9971acfba.npy +04256520-3ddf9a51c44970fd5e4b35ff1ea95f37.npy +02958343-45738568b9c0eb2ce2915d41189be12c.npy +02958343-2d9b790608d32763ec2f3f4c642b88b2.npy +03593526-c673160553979cebd37947b3ce04a083.npy +03624134-824ef824c95632932ec2ef9f7cbb064a.npy +03513137-179b3b1df301b95ccc34b900bb2492e.npy +03325088-66c916bcb881f8b13321831d2245cf06.npy +03001627-8fcff2582b55291389e2d345fb844f4b.npy +02958343-d34b0494fc4d756ab927782fc69a1fbb.npy +04379243-5e68b3e485b9e033ab4d0308b2ec6512.npy +03593526-ee07000195ef7c93e89c405d853359af.npy +02933112-5b2201c133876813f8333d818f5f80e1.npy +03636649-f01ce55e789efa7e5127e0873cfaa7b8.npy +02691156-1280f994ba1f92d28699933784576e73.npy +02691156-7e52ac52a2eb74ac26360e1e29a956c7.npy +02933112-27cfe222aec3463bc59350d819542ec7.npy +03636649-e2e7f45670fc5e369a6c869309041adb.npy +03467517-7068e37ced4e8e0ca9f121364bea84ea.npy +03261776-9cffc684f6f3a077c0a508349d9ada60.npy +02946921-8cf26f6912f4a9e34a045a96d74810ea.npy +02958343-9f610a7b0be81dfa3a0daf3e5400b95c.npy +04256520-d9c184cf0d80efa6150855094a28ed1d.npy +03001627-5073d7a546b9a4d0e810eba61b778ebb.npy +04379243-9012c6ca245c1bf4e6c5cd45aa112726.npy +02992529-37846d5854ef7da646e4b9487666a2f7.npy +02946921-7b643c8136a720d9db4a36333be9155.npy +04530566-c48e3ab1cc01521cdfaef96860d73193.npy +04256520-2b79edc3da006592395a2b8836b4be75.npy +03797390-e9bd4ee553eb35c1d5ccc40b510e4bd.npy +02933112-33ebdfbed1aff9fb12d532e9deb7e02b.npy +02958343-e7c5fb8f7a553da7d7755e7baabe8a6f.npy +02828884-5a96b6b335bada106fa8ce57c8ec2e09.npy +02871439-68042811281ce35a3d80c564be8c917f.npy +04256520-c44ab66d4938052a36e4b0ae0f52067b.npy +03325088-7aefdb866624662114b35a7d7cea7130.npy +02808440-f629c8296f95491d83fe9e17f17632f1.npy +03001627-a7f9e2612d0764a0656a19d1d18fdbac.npy +02958343-8ee2dfd1460eded9473f10e6caaeca56.npy +04379243-89b478643e53d3d6285c99063fc6fcf8.npy +04090263-8cff6a796ea47a9cfef144202cb2b935.npy +02828884-ef018d0bcb3d4c89601104cd2d998272.npy +03001627-79a3115a6f96eef7c151419181ef256.npy +02843684-a842ad87774e1948a89d6f0a00bf90fd.npy +03467517-2c1b6a4fb58b04371a3c749a0d8db8f3.npy +04256520-130c64a2c0232fd03fc2ef4fdfb57f60.npy +02828884-fce4206a99792d47cfb87ab5efe3dc31.npy +02958343-bafacc7f28509d4157abc6fa0d632bc7.npy +04530566-dc38553436df0e4bb129901f80d24b7b.npy +04379243-43906b48471bc76e7571d17c374fac42.npy +04379243-1a35db5eb4f931a3eba0693b2c2a423b.npy +04256520-a1743777bd7c796b57ae08c3105b4e6a.npy +02992529-f649a5368586aa77eecb4e0df212ad9.npy +04090263-3d9907c402689521d8a2f3b4102511.npy +04256520-681d226acbeaaf08a4ee0fb6a51564c3.npy +03467517-3463e9eab1648fdd91c260ea88c0b690.npy +04256520-c837f4472115496cc93e5ef112648b04.npy +02691156-47331e4c26dd1dbc66cf1b4a8fc3914e.npy +03001627-866e7248434968051cc7750d0afca796.npy +04379243-f38a18709e55e4647ee217c21e683487.npy +03001627-b596b505cbeb456e763d8d4012bcdd98.npy +04256520-12766a14eb23967492d9da2668ec34c.npy +04090263-4d55fbf2ec19dc227359b134afde902.npy +04379243-f166eeb3434b9ea4d79a1acd1a8c2d4e.npy +04379243-e603bf3c3d2d26f9579e0a60e99d2683.npy +02828884-e2f79a5d9126b25aed98cca8f0ccd5f7.npy +02876657-6d652a95363bb682b692b490d9871ff1.npy +04379243-bc29a2ba03444764c3bd24f986301745.npy +02828884-186da14db8a38403612d80eb7de76ff.npy +04379243-e046b02e2d5c5187fe38a836aa59c483.npy +03991062-7ed1eb89d5463580a2c59a4d90e63212.npy +02958343-56cca58a4f37323bd0889537a7d54003.npy +03636649-8843ee2b220a702e5dac14d8f50c13f3.npy +04256520-93e652f343412a3e1c8509b1d97a23bb.npy +04090263-99a1608f8e848bf6519f927f2bf92da9.npy +02933112-731733f855e5ec4ae4c30caf4bfa735e.npy +02933112-bcceb065b8c433b99a87002a4eeaf610.npy +03593526-998c2b635922ace93c8d0fdfb1cc2535.npy +03636649-7634fbdcaa6b304d62c83ac1e3a4ebaa.npy +02958343-e75846320e6aa623960b997a49ac99a7.npy +04379243-1a2abbc9712e2fffc3bd24f986301745.npy +03467517-a541f89066da370693f0194265a9746c.npy +04530566-848164edcd9aa41594daa4565dd30535.npy +03642806-d31e025e9ff79c58db3780255bb0fd19.npy +03691459-864546c6fbf636a2d0d6252a768bb9c.npy +04379243-4e9852331e1d5d8dc3bd24f986301745.npy +02992529-ef57d8665eb5ef7cdb965514105122a4.npy +03001627-64f6991a3688f8a0e49fc3668cb02f74.npy +03211117-887fdc9a9940ea57bd59d5b2d356dfd7.npy +04379243-4ce62e31dff3ac18ffc6e457221b9271.npy +03001627-9f5add46af4a41a1305e886266e302e1.npy +04530566-8d8e8de880b4d7dd12ce033f7610a23e.npy +04379243-a2824ff9eb173055f4b6538438a0b930.npy +03636649-d1948365bbed9de270bb6bcb670ecdf5.npy +04379243-818258b7cc1925031b17743c18fb63dc.npy +02958343-ff794bcc5ffe460169e495ca617c20a7.npy +02691156-882c6bdea5fc5e82a3ee83e6cad78356.npy +02958343-8c1741a5ee03b865bf5aa6fd28a4a75b.npy +04004475-e103e8c985edec6ddca809889e6575d9.npy +04256520-ff73fbfb9f4a273be738f481f8560d58.npy +04379243-531381f5bbc69e485769b3af36a2ff9f.npy +02747177-dd2ebaecb3d046d2cb2a965e75be701c.npy +02933112-b0f01584cbb37d2ff546596ce7364503.npy +03691459-5aa9c76ab234dc2234560c18f9de360.npy +03642806-760b1f82f7133ca1de7d2830be38218d.npy +04530566-2defbf22a2d6c97d48f817470e1b499a.npy +02828884-99e759db1e01bc3196ca2abd33a2baef.npy +04256520-df70c07c2b0a066382241d99b4e87f38.npy +04379243-c1254fc0d8d0625b8738e7290b6f3237.npy +02933112-123994ddd751ef58c59350d819542ec7.npy +03928116-6f5036645aa28645a2b96515f0a8f928.npy +03991062-7d4aeb5d950a335cf700ea08eca56581.npy +04554684-64e1c85034dfe93ab7dc65d7950bd55b.npy +03593526-b2507913d631e8b8bcfad79fc308fa6d.npy +04256520-b42e4fd21f39ff4a19fb4103277a6b93.npy +02958343-4ac021653126a29e98618a1ba17f086b.npy +04530566-f791188138166b4d9db44e8b39ef337.npy +02958343-ec18723333333a6e2fb4628a7a8b337f.npy +02933112-f939cc4fa30511963fe047712e43e185.npy +04379243-5883da6d43e3b9743087f84b199fd297.npy +02958343-41d9a381c12ee3e2b7863a3a9a8d5d0d.npy +02828884-d0ae223012be978a49a531253b5beabf.npy +03761084-a91fc98fb71dfa46eed4b2bb88c072a8.npy +04379243-c8dc82f68335fdbe6b41b8bcd0404ec.npy +04379243-2a896f1d6925cc61dc89a28b5e6678e0.npy +03691459-211cf10bd078f91c01c4160f17211fe.npy +02958343-e3dff7195a2026dba4db43fa521d5c03.npy +02933112-c7dd92386b9d18bac502b42dc3551a09.npy +03642806-47583d8af57c13d94145b5f47fac09a5.npy +04090263-3907ed2cfe0cbd22853c6f214c15e60f.npy +04379243-ff1c8d1e157f3b74b0ceed2c36e897b8.npy +03759954-e074316e42dcf9e15c8e7963449f8577.npy +03636649-a47a54ea870ac35396280c8d384f22e4.npy +02958343-a70703613b83063d27c34dcc9b552d03.npy +04379243-d9fb408a6fd11e6c22ce72a02bf771ea.npy +02933112-346419b6e2131dda5785f58f071c8c43.npy +04379243-2f9f15a48b674ea25c87325f4fc53794.npy +04401088-6c53f579c7a8da15c7ef7dadd1baff8.npy +04530566-ad00fa76c831858ebb4a6ccf078584ed.npy +04090263-c88aece300c3c4e05127e0873cfaa7b8.npy +02828884-35554b4c00816a08b50485c33b91d8c0.npy +03467517-168cf0014eb65a479c3e3fc875294773.npy +02958343-9aaeb0852a4cca28471ac7b6a0462075.npy +04379243-580373e581fa155d3ec45bd2bc895504.npy +04379243-5f274ad7c2989f5119fb4103277a6b93.npy +04530566-75947361891546713c3d3b81c7ce4f52.npy +04379243-9b56632bff0d00dbd626c689702869b7.npy +03001627-f2aa3808b870ba95429b498f2f24a42.npy +03636649-6e51353655289e10ad885ade4bf3150c.npy +04379243-5897116720fbf6b5d1308d82a3302eb3.npy +03325088-a0e8cc8bc5f9c00143c5a4b82cd776a3.npy +04379243-2b8961b3c1deaab8cba466d56886cb4f.npy +03001627-af96bf24c341e56436b0f2a1430e993a.npy +04256520-273e8e15b6740e5932a526e2e9a7e9ae.npy +03046257-79e6df3c7e4cdd027ed10ef1927ebd15.npy +04530566-bdc39427c6267262c541ae04c251c7da.npy +03636649-776e4b38023091002cd2160e449d45ae.npy +03797390-32e197b8118b3ff6a4bd4f46ba404890.npy +04256520-20050b94da092fb8803805d815ede61.npy +04401088-f6b4f01d4c9c09e6af1fe3c052ed3a8c.npy +03624134-1db70d6edd9d27cd45e6ffe8c3b08de2.npy +02691156-de7cc3442b1775d46559a92f80e3672e.npy +03636649-b990d515ee1cfc214a200f5f1797d729.npy +02958343-8478439998e4af846602d94d941a9c9.npy +03001627-27574a49bb8055ace6fe3612af521500.npy +04256520-5cfc913387c753f114038d588fd1342f.npy +03001627-85f1b136e6935b7baec8a763854c53a1.npy +02691156-13daaef458d6bb11e1873a3963e0d14.npy +02958343-ab7eaf660f1bf4db23fa56f2e03fa992.npy +03001627-813be9a8485050571563f0911e3e5fc0.npy +03001627-9e519ddc82bb9417813635269a32e293.npy +02958343-5c5908b7a19d8df7402ac33e676077b1.npy +03001627-b944154f00e7cf1fad484915511ccff6.npy +04256520-2ccd286e8d5963199201f2703b45dd7.npy +03710193-4ef4cdfc65eb235aa26a056a2194a6f0.npy +03001627-e4214fa7a544e12a37b2bb75885cfc44.npy +03001627-a578b0027e7d9ec7b2ca3ea77e53abe.npy +02691156-4afcc2cf695baea99a6e43b878d5b335.npy +04379243-c418195771c7625945821c000807c3b1.npy +02958343-56dafc275ef1367d307cb03f4c762959.npy +03001627-5cbd738436d0523d6996454765a52e50.npy +02924116-a642cd8a3cf8de31797ce0caffb8a237.npy +03513137-272cd30169e040d3aac6013f3e2b09f9.npy +02828884-65470e16a5880d4dcb2a965e75be701c.npy +02958343-f90ffde4e5ac04bcc627f7f719e1032.npy +02924116-e13587cf4367206627787a85c3bfabc6.npy +03207941-66725b8cad4355a03735baeeeb56a00.npy +04401088-ac8d3abc6a6f7a939260029564d4cf0.npy +04330267-a98941af1bff5bc6843f813f752a5e35.npy +03001627-62d160f560c31e0ff1d6726679b21945.npy +03001627-6def527e32885b7888dcbe86402c7c15.npy +02924116-2292b067ccd1bb2dff93e4ecafd3dedd.npy +03642806-7f6bd9a933f6cbd33585ebacb5c964c2.npy +03467517-5fc56e6d220d775e381b7fbf79296afb.npy +04256520-485fd17a8679ebea638c2f4fcd9a8e7b.npy +04379243-53bad3b72a7b6c1bd810b14a81e12eca.npy +02818832-1e820e0daaae16c7c3bd24f986301745.npy +03642806-5baaa726f51cd09b507f3bf1d3472684.npy +04379243-34157148280e9342d810b14a81e12eca.npy +04401088-a3bc032d0842d570348e2c62a688b780.npy +03001627-6fd76577d0df60669b9f2eb77f5e247e.npy +03001627-8bd8c34158a3aa04f91663a74ccd2338.npy +02691156-b70b049cacaee0f210af2c858faa12b9.npy +02828884-c81cf82daa56a165271513b292108db.npy +03691459-576fbdcf1aab3887e4e65d5ecb84eef4.npy +03624134-948e15ec5f61a445f21c57f8caa5d803.npy +04530566-3c041c05395b37782c8a76ae283dd98b.npy +03467517-6422681d33a052c393b667ec2f48a310.npy +04256520-787e23d8521faa3a6b3538efbf4faad.npy +03636649-34020466b4342812218c9f1216abefd.npy +04090263-85a1d16ecd3989cd2e3059b0e19cba0b.npy +04256520-6a42a50f5f6d959ec036a40816608369.npy +03211117-300b49e25538c0ee5088116dfed138b9.npy +04379243-d4a7a1dc0f1a51986f15d61c214769af.npy +04379243-778d75fb125165379d297e74104d3ac3.npy +02691156-407135e4c3c7cf2523c853ced7da0343.npy +04379243-1600f311c31ad47fa4bec68446bb57f4.npy +04530566-b9a6e086fa26907897eb0d3a9685d3ed.npy +03761084-95bc6fb98624ea3229d75ea275a1cb4e.npy +03001627-e6ea5e70c2f29d881e8fd793667dc14f.npy +03467517-214f6a08b78670de2cb522418d5742a0.npy +04530566-b31884906c966b4fa54923b7d85aee7d.npy +04256520-5d2ff1a62e9d58baeaf288f952624966.npy +02958343-4c456e47a09ec8c96c13d41607812b45.npy +03001627-e67c305a676930b123c95a77265c8dd.npy +02924116-c4d20747c3ba3ab8d4a3ff2918680f4b.npy +02691156-5bd21df38ef89239ba4ae55719e5e195.npy +02876657-488139f06d9905d830ffab76baff35a5.npy +04256520-55432fbc7604292ed9993d66b5a0e2be.npy +03636649-8f85c2195890ccf671f0940f5ed452dc.npy +04379243-5be1589df948b227c955e5ed03ef3a2f.npy +03001627-710a0a005ba7b0cd6a6b5838ef6b356.npy +02691156-3a72adcf14ccec9965f50257ecdfa5c7.npy +02958343-bc8e978655bb60c19fec71e8f4aac226.npy +03001627-42c27211881f1377d7f7a4c4609b0913.npy +04330267-a0cc38afc62d6d102c026fed19c0d206.npy +03636649-be5b76136b37205738e43095496b061.npy +03593526-2a7c0beb84e99d6636b0f2a1430e993a.npy +03691459-e314110b72e1d310dae4b8efbd2ae014.npy +03691459-c72753b17403466c51fb196f32308d0.npy +03046257-bb0b0afc8059701076e9713f57a5fcb6.npy +02691156-b9fabfa6d5fedbc3a8e091cb544689d5.npy +02828884-2cdd25a716ab2ac12056b4bd5d870b47.npy +02808440-b657b07733051ef83c7c1f545abb6527.npy +04256520-aa7489c9c7cd0c1dc3a1be62b60323a7.npy +03001627-4fd4cda3d713bb29c8687ff9b0b4e4ac.npy +04530566-5f5490a8a7af2898b1bb46d2556ba67d.npy +02871439-9c1781c13cd9bab154b4839e5dc7b736.npy +03636649-e86e6469000a7e7deb39e694585254c6.npy +04401088-767205e25c8755fd89d59b774c6bc1b3.npy +02691156-edb916c2cdc2d3b9ce2cec85ea6ae00d.npy +04460130-acc8313c1f285a51d3a20b36eab6731d.npy +02958343-b688cde1a09ea5d3b1bb46d2556ba67d.npy +03636649-58588e4f7c57007e11bd92e9690e7fc2.npy +04090263-fee4130baaca04225516c1e9dd717741.npy +04379243-149b59e69d25ad09c3bd24f986301745.npy +03636649-2a5e2e5ec5eb986385bf3590978fc71f.npy +02958343-a9abdcbb5cddac8117e76f36a4eac3ec.npy +03001627-c7cd67d1a9def55aa192483aa282f8e5.npy +03325088-642752ced8ceeff0b362845c6edb57fc.npy +02942699-e3dc17dbde3087491a722bdf095986a4.npy +02691156-958c54f8da7a1359cea2c06142ecb1b3.npy +02828884-866b0fab7a3e54053555de1e3169ac6e.npy +03046257-d512e75fe5142f9cc23b8534bf62ba29.npy +04379243-5510ca90cc08d0c4e825832d1f6b3273.npy +03948459-c34d4ec7a3340f375e9786b1603f45c8.npy +02828884-faa74f8980fadf504777535b9098089a.npy +04379243-c8ee4a8b703180992985858e6f5832da.npy +03211117-d8a44fc1f40d0ec271d096a6914e7333.npy +02933112-a5ce16faa5ecbc4bc6a5c971c030877d.npy +04379243-cbf3470a35aff67e483fd274b1c29225.npy +04379243-63606249852d537ee958df2e8332e31c.npy +04379243-2aca16abe2e5175281faebbdea6bd9be.npy +04379243-53c11596c3fc36a8a5094cb6d104b35.npy +04379243-ed964779023b7af85f6276ff8d24e520.npy +04379243-1f7e4805b267e71f21da01c0bdc324b2.npy +02933112-7b02f0d94886f66a121859336e292a5d.npy +02958343-6d7472ea15dd5c18433f1e7c64b884cb.npy +03691459-c7b58eb662984d701df2664cb33da9b9.npy +03211117-7621d8ca26b9296b104dc10235c6ecca.npy +02828884-b57079e504413f02ad5067eac75a07f7.npy +03001627-3b5eb8c85130476a38dc42f802aebe31.npy +03593526-b8e8182813626e7a3792407aee21900f.npy +04090263-5b99c77733a74f36b74ae5e50aa93037.npy +04401088-54f1cca754751ec14857f88b08630a42.npy +03211117-786f74cbab946ef78517036a5ca6b1c7.npy +04379243-6c0fe6541769a3f6ff4f2504a49d0458.npy +02958343-ea7ce310216a5a64a1bc65068a7d3cef.npy +02871439-ed6e541f87d15abbe76bc197b3a3ffc0.npy +04401088-80d73417fa12508d7d6b888b4eb1ac9f.npy +02924116-bbff113e57da6566e99562689078395.npy +04379243-614b46cfcbe04994d91158b2b7873a40.npy +02691156-dc3bfc83bc2d1db643afdb9c81ff2967.npy +04256520-dc079a42bd90dcd9593ebeeedbff73b.npy +04401088-2f468e01f4fdcb54d81a607e3ac2f927.npy +02828884-5f0e28d1324397d9c0b027ae5b223d6.npy +04379243-65e4bde475632e5bbeedb4c8fd29e2d1.npy +04379243-9c5ed0a888a5807ca9b8d9d3b5cf54cc.npy +03467517-fa6e4f4c21032d4befe0d4e1eba2e3af.npy +02958343-dcfdb673231b64ea413908c0e169330.npy +03691459-f153783eb4ae84f2405c6851258f4dc0.npy +03001627-e51df025a8c64a483147d51c94487639.npy +04256520-25f1d50f80494d624b3c42e318f3affc.npy +04256520-a55140d6d7b1148519fb4103277a6b93.npy +04256520-2853c28f2690b0a48888e7425bc4b85.npy +02958343-5b7985f5dd37dec2c2509a0026f2a07d.npy +02828884-941c1bc0f10560a2310d80140e59b9e.npy +04401088-774bec08bd534dd28a1687774f473322.npy +04468005-5824eaab128d5e89109becaa93f86177.npy +02691156-a49a75d2b22c9eeeb87697d3904b168b.npy +03593526-b55c349c1a770df62edec63e41367782.npy +04401088-5f919ac1f790280f563028cebd5782b.npy +04379243-f65decafeb2b8518dcfcef693e7ec696.npy +03636649-53d7272eee54bad2f841233486fac2b.npy +04530566-5b6d80dac7d626baa218acf6a387078.npy +02933112-96969d7adc540bf686d53ab0fe94e911.npy +04256520-608936a307740f5df7628281ecb18112.npy +04379243-7823530be7179f50e08668a8b378b020.npy +03928116-336e206fa25555adf4e0e15368c84346.npy +02924116-d54947552a72fd70a2ffe654fbdaa117.npy +03636649-2324e8f0e334c218f7248d9dbed7a7b8.npy +03001627-341a2d3df9800314fa260f4362cac599.npy +04090263-f05e17d75e8f3e2ce378cd9d51dc5be0.npy +02958343-17f89c25a3142ee09d2b99af43da16b3.npy +04379243-2325ec6e77f29578d9b00ae2f30c0a5c.npy +04379243-1deaeff17e093d1c8029e7f07c5ed73a.npy +03636649-76db5f1046bfcd97fcb8d8c6d4df8143.npy +02828884-8d9903f1a197ea9af4fb4dee5181bee.npy +02924116-3c1395041fc842dd193d7855ecfc1bd3.npy +03001627-97febe7745f35b9183e0de42574c850a.npy +04379243-da76df9a506534fa5eee45c00c4de9d3.npy +04401088-ae0b011684a6c46c10bc2436075f6a52.npy +04379243-3d01fd2f13ece278e27790b0ec8671f7.npy +04379243-86eea3415d5a61df490ad276cd2af3a4.npy +03593526-9b9c50a911bbccb0bd16d4490a10a752.npy +04379243-2144d79a6310f1e2934cee69ace78b94.npy +03046257-184454aa3ff239ccb16cd2a45f8cec20.npy +03001627-8031478c3fe31ddcc337647acafe65f0.npy +02691156-828176e6eaee542ceb532c8487004b3c.npy +02958343-cfc8e5925bbec93de20af544ce47dd47.npy +04379243-776732bc127417f28a7219d923f4718.npy +04256520-4ad0739a957f27dcad2fb8cd0793fa9a.npy +02871439-8fe314abb1af4d23e7ef9fff09638f8e.npy +04379243-7a33f3e6c8a1cd0c9ccce4c6d5bb195f.npy +04379243-9b673972e8873bc403c57e7ce69f902.npy +03325088-6b48e8d129f22956b362845c6edb57fc.npy +03001627-f19e8da9d8f369c531e63f1270e2b445.npy +04468005-30b543e0b45fba65e810c01b1498aa2b.npy +03001627-884341d10af51df9737a00f007529fbf.npy +04256520-2ff7a54101b3a51283c1014d9ff52cf3.npy +03636649-1852cf691d561b97760c1770d1a1230.npy +03948459-da0dfb17cd9ab1459be47ac7c7e37815.npy +03337140-a23e4375e78df8d0e7ecdbe73ef4323c.npy +03636649-f0421826cd511f401592f292ab531da8.npy +04379243-1e5db720b375205315bb540f42facfa9.npy +04090263-ba49c58d6d320357f1cb19f636b1c2bd.npy +02808440-d401cc66a61e9177355e3146e6882aa4.npy +02691156-fcc94cf74fb886b7bbf3143b1cb6076a.npy +02747177-f8b6bcf0dcf240e567e4c36fcbad1d04.npy +03001627-e4ac472d21d43d3258db0ef36af1d3c5.npy +02691156-56ec4638067cfccd3dd4ea7aa5ac3a5a.npy +04256520-118a7d6a1dfbbc14300703f05f8ccc25.npy +03001627-b5350feacacdec9e1a4c9a8c5e7ae925.npy +03636649-ae37dd444b0813b8fcb8d8c6d4df8143.npy +03001627-1f82011c2303fc7babb8f41baefc4b12.npy +02933112-4a4ae602159a711c824662341ce2b233.npy +03761084-15e1055bb947747048407a54b1fbfda8.npy +04401088-ab9c56981431ec70f7b18034d9df056d.npy +03691459-e911bf2418eae6241574d21c0c95092f.npy +03467517-fecefd8313bb5bcdd86d4f3257dfa437.npy +04379243-86c467981ec229909b21a1a3552b6ab7.npy +04090263-e4289a32092b3e667f8cba909d4faac5.npy +03948459-2ea634a6b6e9323a035111f6a92f4e5.npy +04090263-6efe78a38abb45bebab70e35b0e13530.npy +03001627-fc66e46fe850a243f51f77a6d7299806.npy +03046257-57c8fe2fb023b648ae29bc118c70aa10.npy +04379243-bf29f1397cfcf056febad4f49b26ec52.npy +03691459-94ffa3ebe53ca46327eff743d2137fff.npy +04256520-f92dd3f4d0b4475514038d588fd1342f.npy +03211117-1e6d8cfd991e829ae441f5bb6f88ca61.npy +04379243-96dd123d4b16ce2afc62a892407efc0c.npy +02808440-3fad29fafe787406b362845c6edb57fc.npy +02871439-4623d2cf0aad860bed729ab50bba7ddd.npy +02808440-881043bb57784d4e3b918969f743aebf.npy +02828884-1dfcce44c2f98d2c81e7c6cfefba0d68.npy +02933112-9aedc18053d412048ca998f0f87d0c84.npy +03001627-ca804e0f760537cac4545d2091e9ba5d.npy +03046257-4e979d296586eeb880aaaa0b0a5c59dc.npy +04379243-f41ff2d573ac836dad3a17b61c0ca09a.npy +04256520-4760fede61ec9babef410cd6a99ddc.npy +03636649-fbb4a4faa8f2faedd661ff085a0f14b7.npy +03325088-eec7f9256d78d41ac5e10683f58486dc.npy +02924116-d53912686e1fb1cdb687507a46e99ba9.npy +04379243-91aa75800ef385e9f51fa0238791f5dc.npy +03001627-ea62254f0a5650579a8ef44e1d2c5b75.npy +03691459-24cb5019659114d5176545ad403d244.npy +03001627-6d5d42d1272467953b63c9ead28992f1.npy +04004475-ce2e32b26627c25a64368eb37d895c58.npy +03001627-6caccdad9f8d4f0a7f1cdfc0a8f38f2e.npy +04090263-e06992f45548f0416b34c3751bc447d.npy +03691459-cbfa6c888ffd893b31b5f9e34ff03906.npy +03001627-9a37886efaa98354317e912dcf9f9b6.npy +04090263-c8b9fc62a220f63fbd6317b3418b592e.npy +02691156-a1a419007c828bf290b1d6deb98feec6.npy +03948459-ca7ae7fa6fb11ee460956dfa3cfbfa04.npy +02924116-96aa88bc3fb67b5fcf8b2866c5b881bb.npy +03001627-30f077da43f30e64c862eec8232fff1e.npy +02958343-491df319c52dccdafb5c1b0f759e2bc1.npy +02828884-65aa814b10f778b2056b4bd5d870b47.npy +04401088-39b78390f8d5067e983a0c5c52bdbaaa.npy +03001627-b4584ca6fe22a0be599937922ec198cc.npy +04256520-57f383c1eba6bdbbbb07e1e44f4c30aa.npy +03642806-dda1832a36858f06ea791b47ef8b531a.npy +04379243-98440aaa709af51192d5b25c536d8044.npy +02818832-21f11dd1eda2b1dcf51f77a6d7299806.npy +04379243-b130260b9f5d05bb5510d59f3ab1ed64.npy +02691156-8daba5f5c906b3b331fec775e1dce6b3.npy +03001627-61fb89fca404e37f598bcf8ac674b63d.npy +02958343-b4a0711a46f9e2bdba3e2415e22cd45c.npy +04256520-447281db87623862413102507b68bcb5.npy +04379243-238a974ab3fd46e0ba7b07dcdf3d00b4.npy +02808440-6787698a1fbd9a6d44221bef0fa3c36b.npy +02691156-4b20c1736440ff9d90dd6eb126f6cbbb.npy +03211117-66a71f2cb778aa726321867cfa9ee57c.npy +03642806-cbcb79f534518dfbcfe78be5b7b99c8d.npy +03642806-13330d1e7b199dd82530b9c2b65d3f86.npy +04256520-1dcb4a52dbd349ceb9b8611336bc3051.npy +02828884-f0df158b0694ee1f2056b4bd5d870b47.npy +04530566-f31b394d652f0bd0592f00ecf480857e.npy +04256520-7d04346070eb5b9d19ea2628fa9897e5.npy +02808440-d2a511578a387365ede9471c962dd6ba.npy +02958343-ea76015145946dffc0896a3cd08800fe.npy +04004475-b9a71c2cefd6da6ade43eb83c675552b.npy +02828884-f5d370e9fe5b7452dbbc9440457e303e.npy +04090263-7ee51d04734c82198ca4596df3cbf136.npy +03636649-d3a3d52234e722825208aab875b932bc.npy +04256520-f2edaaa8bef11dedbac8a2db6cabda6a.npy +02933112-7359539c1b62cf1e29a50a2b3c5e5b6.npy +03928116-4935addf7de12539c273f5d1e0123211.npy +03691459-5adc7f63a154a43be9bb042b8623f922.npy +04090263-faaa98e92d722d0ba7dd22c0aa3913f0.npy +03001627-31d026a65b64c4d5f529761e946287b2.npy +02958343-6acb271397e6f9b9e858db1dc3499392.npy +04530566-e3923f2d2fc2d1d39263b5578aef09fa.npy +04090263-404acdd4cbb0544eeab5ee569c9de1b1.npy +02828884-276195bc09970fdbec0de4d645145eaf.npy +04379243-f36f3912a86717146b82340329d7ca26.npy +03691459-995ad1befadce7771148996e35417db6.npy +03001627-4918512f624696278b424343280aeccb.npy +03636649-85dfdbe562059fa058b65cbe3be2c45c.npy +04530566-eaaeb5f4195eb55c1cec93449f0f44dc.npy +04090263-f71fd8ebea347bfa3ed1dc72750c6f75.npy +03691459-635db4f2e3fe1f918e14a32e5ed95bbe.npy +03207941-d08a36f582d2acb5b425b904f1063e75.npy +03325088-14cbcca59f500f5835efe6970c23032d.npy +03691459-196d5295dc5c62d513bedd75622dc40a.npy +02691156-96a69c2add6d55379a6e43b878d5b335.npy +03001627-3b606ca14c5f968319fb4103277a6b93.npy +02691156-8259a1fdcb9bca7526360e1e29a956c7.npy +03636649-ffc3e351b9ae77b0d42b9650f19dd425.npy +04530566-2c7a846828d3584f2e332a83fed6fe76.npy +02958343-b9e20b751d869418ce2714c5fa8be19d.npy +02808440-15c43d52c1c50d373321831d2245cf06.npy +03467517-7e49ef6e1b1dbc8dfe96ea0860283ff8.npy +03691459-6592d33f84263ef435cd53a06b1d2317.npy +02691156-aaefbfb4765df684cf9f662004cc77d8.npy +03991062-25a032e5624789da843bb865a04c01a.npy +04379243-3ba61eb411ec52c41586e0414b03ff10.npy +03337140-f5c863ccfd78cc6591c352d02061b3f7.npy +03325088-372e27ec3af50a91b362845c6edb57fc.npy +02828884-a8c8aca72463418581faebbdea6bd9be.npy +04379243-e9faaa484cb11948cc89f898f3cf6588.npy +02691156-22eb91041de27ca4936b2c59e7c43ba.npy +03001627-634524d6d74142ecd2b12aa6a0f050b3.npy +03636649-af93ccabac8d1aa9f4482a3d4ebf4782.npy +04090263-a52c4c07d951fcbc3068951f59ff267e.npy +04330267-af07fd43dde94e02bba2a247817a4593.npy +02691156-9a8aecab136ce50db7ef47444625afb2.npy +03513137-3497a6217d54da094dd343ea1de55435.npy +04256520-d5a11602655790bcdf6cfab91d65bb91.npy +02691156-5d5aefde5935fc9eaa5d0ddd6a2781ea.npy +02808440-ec1d737b5962bd306e12d65bc1882e95.npy +04401088-b7ebfa514d14036e2da685d55be1eb.npy +03211117-1063cfe209bdaeb340ff33d80c1d7d1e.npy +04379243-a69b27f76baf9f75d612e9885a7318aa.npy +04379243-a133b092d24da436e7d9f0fed41b005f.npy +02992529-73339a7ed1e72d89aef10502d58d4967.npy +02992529-4e8cb66f915fb5ac5fdc2445fe061736.npy +04256520-4146baad4a04882613f96345312df593.npy +04379243-760d38c2740eddfb8b38796afe7ee552.npy +04379243-6cae7a045734cfcecf03af5e7a1277b.npy +02958343-9fa56c19e4d54cca99c8d14f483ffc82.npy +04401088-ba669a9b03186ee8108c9111b239151.npy +04401088-29cf2bce2e67ae76264e721f309fb873.npy +04379243-615417f66fc542c6f51f77a6d7299806.npy +02992529-774bec08bd534dd28a1687774f473322.npy +03691459-17ba9b90304be1b4ebe67d9b32c3ddf8.npy +02871439-fef03ca588a2b475a7bde56da6d9a270.npy +02933112-42c3c76c8c8912c61b17743c18fb63dc.npy +04379243-59cd90e24a68f3f5f1783a44a88d6274.npy +04379243-29531549b0a6a0f5ed403132b02528bd.npy +03001627-1803116582841b39a8ecfcf20e8cc0a.npy +02691156-58fe58e9f7431a1a428659c2b5124968.npy +03046257-422505904f773dddb441e189e5a85c02.npy +03337140-afaa6975c6000ecc4c3aee8e9d3a6ffa.npy +03001627-375aab9251b2df59b7a68845946bb67f.npy +03636649-367773a008b63a2c5208aab875b932bc.npy +04468005-277c840eeb343b7d85b408a8edc983b.npy +02808440-6e0d5ac416c002d13321831d2245cf06.npy +03001627-99996ded94b8bf974cddca4ca9fe5080.npy +03001627-a1adf14b24469f8835acfdef2ece21c0.npy +03001627-e50825b2477ba5a0dcc52ca811e565.npy +04530566-340a4a4420b4d9c0406483a4cd65b281.npy +02958343-12d7c4013415ea147f5b0cb87a91de52.npy +02808440-52f17cc850b55edd54d7082b34825ef0.npy +04004475-e00f543043e36ba2199f2eca998ded6d.npy +03001627-5aea2a227125a81bccda8d28b44378b7.npy +02958343-c4744d66623e04b7518f93fcf50bd8df.npy +02691156-c2e38200a238177ebbf3143b1cb6076a.npy +02992529-2293983c6f234d94e304974abc9afad9.npy +03211117-d32688a505930c96e2c8e43c97ec5a85.npy +02933112-2e6c2878b005b5c8bd7feb85baf9225b.npy +03642806-6fd01f7db45bff66cf01bc59d215f0.npy +04379243-455df1ea3058c48e33c1aef7ee7c6797.npy +04256520-d0bdb5de2ae0de1adfa4ff010b8b9d1c.npy +04530566-cc3957e0605cd684bb48c7922d71f3d0.npy +04256520-6f08148e6be15ec812ad7c55c944504a.npy +04379243-539d207a10c615fe76bc197b3a3ffc0.npy +03211117-61a9c9dd90089425769ba004c0947e77.npy +04090263-c7e59e374c2cbb7ed33646b0990bb4a.npy +02808440-e814a58e52652f43e702e0688ba77bb0.npy +02992529-2601fb1cdef9d37223d5a55215ee8f43.npy +03636649-89ad10075443cc8ece868a9ece283694.npy +03001627-ed9a4172130d3d5baf1a85b857ec9afc.npy +03790512-5a997a42abaf1a0d52ee90e577613070.npy +04379243-7a0ec4445356a79410643b0cbd7095e7.npy +03001627-2641f174d2d240ea788a5c6586b10c59.npy +04256520-a84ff0a6802b0661f345fb470303964a.npy +03636649-9c2a936a664a59823c10371ef1aaa57c.npy +04379243-c26d26e409d01e8420d2507f5cf72c4c.npy +03636649-3fb06dd95ac94436f51f77a6d7299806.npy +04401088-436d7a114f72dc03d4713685ae50fa13.npy +04379243-4b82103c9ee9ae4f98e0d1738edd4f19.npy +03211117-21d627f21efd9298c9b80153270af5ed.npy +04530566-215e4b59683247378a3e8bd3a4e48433.npy +04530566-a4d1ec9841281a3cd1e97c10e2464c2d.npy +02933112-a01619556405ba3f2633ff66beb9cf31.npy +02691156-19604020a86ab1790b1d6deb98feec6.npy +04379243-e83930a4a62413e1187ef2b10c31bd17.npy +04256520-c49d9fb6c8b32b265beaf00da5b709c2.npy +02808440-24bbfd544bd0db74ba2cb2a05654d738.npy +03624134-6070b6817869c14ff02ee453ff283e26.npy +02958343-45953aa831508fb51e0d92ae9d1b10cb.npy +02691156-9e8ab1862683399f570726399d67ccc3.npy +04379243-4ceba450382724f7861fea89ab9e083a.npy +02992529-a0efaa2ba04bf091adbfb30d8d1b297e.npy +02933112-4b2bedb7014636afd38913e96bbf2a5d.npy +04379243-7fd8601b0b0a01c9beedb4c8fd29e2d1.npy +04256520-c304687f0778986c6f1e631ee7d027b9.npy +03001627-658c983e6982f6a43b48a711df82173e.npy +03211117-2ba6e0c4ea459f84f5f79806bd65844f.npy +03624134-94f20e34be2d0a6dc728559272e2d712.npy +04379243-4d6b0bcf351183bef8c4b4cfc2702232.npy +04256520-9808424960998ae93d4d11ac89066d36.npy +02958343-149978eefad83cbafd8e7b05498794b9.npy +02691156-9a4bd6fa35e2e59689437db5f9b0a8a1.npy +02828884-348c52c333d7a7953722bf980385c3c3.npy +03636649-4a868756ae6404a5c0bc57897eddf6f.npy +04379243-ff9bb9597cac5ef17a50afc9c93f8a50.npy +03211117-d10dcdae2d7645ebcfe78be5b7b99c8d.npy +04401088-f2245c0ff356a85dda10b9c82531bbc2.npy +04379243-cea242a600c342fd33891f25755e1e1c.npy +04090263-b01199433137d6123547ed4d05d19f04.npy +02691156-a53846c68d0df55fbaa5dc5e42189b81.npy +04379243-f4f000158796b9593002ed4dcf002f44.npy +03001627-fbd234dca7bb201c1bfa4cc8d66175d1.npy +04090263-ca25a955adaa031812b38b1d99376c0b.npy +04256520-de1fc3a00a11e87af62af8489541547b.npy +04330267-87530f4483e4f4a0b8183a4a81361b94.npy +03211117-ffc224f284b63b17b0f6d70666df2668.npy +04379243-47aa3e340eb5be093fccb8cf9f00542f.npy +03624134-f5abb706dd1c1e931fc43d5b32fa230f.npy +04379243-532a4a4b8ce7b6feb9ac39a10cc48e08.npy +04379243-db6561b883e56b9072c6d81e4b9f21e4.npy +03001627-2a05ae00b701fda36567137a59cb1a56.npy +04379243-e9fd9958920adc279943cffe175cad01.npy +04379243-8e424220b8f053c81ee2805756841071.npy +02691156-ad85ce4dde9fde14a13757cba42c461a.npy +02808440-31d9bb666cd262004f535519233c8e8f.npy +04530566-eb90fdddcb1f25fca60ce6f0a0028c13.npy +04379243-1b84ce3667a99f1d30bbd4cddd04c77b.npy +04379243-e64876f5590e6fb7c3bd24f986301745.npy +02958343-da73c98813b82014d94cee2a22cdfdd2.npy +02843684-ed8eecb25a61ce8ec30aa7d959330a5f.npy +02828884-137fdd05ae4e69c7a68359455a0ffe24.npy +04379243-2783c8d705a1a146668ae11a7db5e82a.npy +02958343-be28d4b681ab04ecca92a4cdad802b45.npy +04401088-c0969979d6ff51f3db27d84853613218.npy +04379243-7cd2c11133d7470db9278b13f52df097.npy +02924116-ca75cad248b081a52470de2774d6099.npy +04256520-13169bd2b9b02ad44089c2a25bbcbf23.npy +02691156-2bfd3dc8b0630de9e1873a3963e0d14.npy +04379243-a186ef9f36fb95c3bd24f986301745.npy +04090263-fb62c74f88a285a712b38b1d99376c0b.npy +04074963-28f2a5df4a926c3e140a527375fd6757.npy +02691156-5a1d4af1f417d28566cf1b4a8fc3914e.npy +03001627-c76b2d2e9b7cc59e82eddefc99ebacfd.npy +03046257-39be4ef0dfa6833e49c9c494c2fb14ce.npy +02691156-d05cdbdddb68865d2dcd3faa5a0a5f24.npy +02958343-785cb635a01fb7ab2a9eb0f146e94477.npy +02871439-5dca62207dfe3e0e1adca12ed8c544ac.npy +02958343-b0a659083ec6e936ca92a4cdad802b45.npy +04256520-5cfec53fca53be4cc9fce74028b97ec9.npy +03211117-339950e98c5d943a20685b5a7e34b501.npy +03624134-198a109dc6c19ba4c09190536c002dc.npy +02747177-c0686f7b0da06f36cb2a965e75be701c.npy +02933112-98d2b95fc4f59c426ba8b3973e201d74.npy +02933112-7aca460dbd4ef77712de5317fe5b354f.npy +04401088-b35c2da756f8df5aa0eb5a85db887292.npy +03337140-3259ed5798f633c8784168ad9d1dbd5b.npy +04090263-b20e2aa33c1a54fba791c4f82c7b99c6.npy +02871439-ee00bd67de87106cda268e3f4aab0907.npy +04401088-f9418c13ca82fb887f75fa9740df3aa6.npy +03928116-e83cec9fb3e0d81d82c5b9bdae127001.npy +03001627-47b37ce8f304dd0bbababe11fcea8796.npy +03001627-1ace72a88565df8e56bd8571ad86331a.npy +04379243-6176df18ef54e0a3f12d7184a2ad3430.npy +03593526-353015291fdbc5589de5525299ba58f.npy +02808440-bdacdeb89e174d743321831d2245cf06.npy +03691459-adab0912bc0ad1271ad88f716ea80910.npy +03001627-9fd3f3034d3e867336587f5b4db3e782.npy +04379243-aa03428d48a820697a138f06ba3ebae3.npy +02958343-65e3e2893669a09cc7b48e36e31209b9.npy +04090263-479adb86f868044b82771a19d76c960b.npy +04256520-c4d472c94921bfc63a36ba9606d732a1.npy +03001627-e1f6a4f5c856ac07bf80985a99195eb8.npy +03636649-75e788db909c6e07bd4160ae8a5798e4.npy +04401088-2bb42eb0676116d41580700c4211a379.npy +04530566-22a66588db3822831d20b5ad5ef1cb1b.npy +03001627-82d8391c62e197161282d4d9178caa92.npy +04256520-2b9612dac350a3d6764a784715fb668.npy +04468005-43ef3b9a4b46aed5e17c2efe05365fd.npy +02992529-e6f4ceda4907fcc13c47272ccf8f316c.npy +02691156-2997fa1441eb7bb735fc197bbabcd5bd.npy +02871439-abe70fd61bf0b6e0504af6e1321617aa.npy +03593526-41dc952ae902bb2d2a087337e55e3e2e.npy +04379243-de24c1b05f0ee7dc58674871bd9b2e6a.npy +03001627-cebe4dbc363265ce46746f657ed598.npy +03467517-280e5926a81270463e148e250c0340d.npy +04379243-589d2e18f9b85e4715dd7d7985e749c1.npy +02808440-ace556a5c45fcccc1c17aef130ed6213.npy +02691156-ca91bc0603ac0b808303d346f4be7d4f.npy +03001627-dfdb73c6bb358fec18c4d7ee5b83ed4.npy +02828884-f123b8da77f6d17e50f9fc0e2c94dd76.npy +02691156-d532217c7fabf1d44e8b48a4c01e36f8.npy +03761084-753c4428f12b2233b5d3c5ea5d496caa.npy +04379243-a757f06addc26f314b3c42e318f3affc.npy +03797390-ca198dc3f7dc0cacec6338171298c66b.npy +02828884-8f102661c3efbdd184f92715bac39b74.npy +02691156-f80343ac3064e74862347b4731688b0f.npy +02691156-4a9d3df03a7d41d77209009cfb89d4bd.npy +03642806-818a8f85eb37248f7e51366b0cf7747.npy +02808440-b65f30d853b7cc96f86926db87a5c419.npy +02958343-b61f6554d83c50684fa22c482c32995d.npy +04256520-b4c1dafcdd5cfe67d070a4f9796238.npy +04099429-f77daf9340eb6faa262f035db428cc4b.npy +02924116-f0947e7dbdd0c5f1a70590fff7a7d815.npy +03001627-5695fd37d1e673cebf964fc57f6a7d6d.npy +03001627-85f4e9037425401a191c3762b497eca9.npy +02691156-db4e26b10e48f0202eb17a4a1756af76.npy +04090263-277fd403270ca32b72e5d9d5746d6da7.npy +03636649-540335c2788125cbc9dd845c88786daa.npy +04379243-91dbfe4dac593d3e35836c728d324152.npy +04379243-5808fa88b17592217caed426d97afe76.npy +03001627-d18f361e22f7626b707cdefe012d0353.npy +04379243-ccf0059e0697982ecaa22a10624245b6.npy +04379243-10c25bdfea5eccfd153555abe935e806.npy +04256520-95829021770f25fe15afaa91253fa857.npy +04379243-7df9115b511668bdde98d10ab5975b59.npy +02933112-86905b35aca5a3f11f8d8332ee17945a.npy +02933112-3b577e2c7bbb8ca4c59350d819542ec7.npy +03642806-2f9cc3e20647ebb1cb8118818e564f96.npy +03001627-47db22433821989e35910b9c436db932.npy +04379243-7a1e70d3b087970a23fe3501bb9e7193.npy +03001627-a8da22b87a249bc9c9bfaa062f2e9d4c.npy +02992529-f760cdb0f8cbc6fa3c28e819722231b4.npy +02924116-e8a03353afa0253c15a7b5ba389301f1.npy +04379243-f81301719860a0e14626b1c05b10e40e.npy +04379243-cf046edeff204b81cdf7280ff8af6720.npy +02691156-58e967e02a183d49bc0909d98a1ff2b4.npy +04379243-2fcc875b28c5557dcfcef693e7ec696.npy +03513137-7f03445e003b692f3fd0acbaa54efdfa.npy +02828884-ca238683133f6a7f38f6614f37ed2984.npy +03790512-8fd0238d882c6f45e3e8453287c65951.npy +02818832-df4d5db0d81fd245c8b7b6fe706a520.npy +03211117-5757f2fe8b1b4b559ee60daa6185f65.npy +02691156-45a4b43dc4c77dea6818e4a1f2613507.npy +02880940-5f2ef71aa9b94edbb84959963148f2a2.npy +02876657-aec6aa917d61d1faebe67d9b32c3ddf8.npy +03624134-b16961b5dc1404d4df0719d707e5d64e.npy +04379243-520b83f501329fa955f46d55537192b6.npy +02933112-a2dcaeb9f64566672027cee422df2aa3.npy +02958343-bb5264bf7306327abecf71e2e014ff6f.npy +02801938-80765e61d1305e5936b0f2a1430e993a.npy +02691156-990431d8a1ef435bbc913a3935f0ae10.npy +04530566-1f883bf1bf0f6bc7a993db466b6d73d3.npy +04256520-aee5c13c32775f24b1e5b4bb39b2ab9f.npy +03636649-f6eeb5d67c32616648fda83c10428379.npy +03467517-e0d7fbacf037855393f0194265a9746c.npy +04379243-7d22cd72bf2762b19a4b266ed4d507c9.npy +02924116-73eb995e9b1fd1377cd3cf23748abfc7.npy +03636649-66cf69a98ff895e2b55fde51a411949f.npy +04099429-9f71204ece40e327c4c8e4ace0fc3aa7.npy +04379243-442546c2af24d782d197f67767b32741.npy +03691459-f1cab229b68c9ac1c4dc2c94f81faffa.npy +03211117-9b66be71bb69a85b3e6db88fd9485c19.npy +03211117-9852ad45bb14a66fce2fdea99c5936e8.npy +03636649-639c2bfefe1bb6af1cce8c25b11ccdd9.npy +02924116-ab13c9869343bd8cdde6e3a892dcc1a0.npy +04401088-320d0f9256ab9cc3a046bbac53886364.npy +04401088-7114283643761bb4a5545c1d5c84020a.npy +02933112-253c1fd3743c47234da5feafe6f1c8fc.npy +03001627-e4cc5cee7b011df316037b4c09d66880.npy +02933112-c700103d0294eb186c66754c2bdaefab.npy +04530566-c8bce97e59665f2811b9a587ace886f7.npy +04379243-c1dcefb2613afebfebe4b9fb2707d260.npy +04379243-4b21a06b433b563f450195dfcfefd1b9.npy +04256520-9ecd7b01b9be890d19fb4103277a6b93.npy +03001627-a7579c588d289fee4671d97b0fd17f51.npy +03001627-5ce98a1c247f0a2d623ddc7262bf3bc6.npy +02933112-4068c751d46ca222de650492e45fb14f.npy +04379243-33f9152bf617f22a16a2b5862518c93.npy +04401088-14726c2482a092d3a9fe1734a6086750.npy +02958343-abd0aa2e0ca4fc4793249f89773e858.npy +02691156-d25572a7c7bd40a72d716a8ba99beff8.npy +04090263-502bcd962340e12838bd5e76f1ee812b.npy +04379243-9cf9313fcb038801815b2b467e8e2eac.npy +02691156-a28b92f0ed237d6d13256b8319a93100.npy +02933112-a6d90c5628a598a1598a453fd9fbd988.npy +02691156-6fc4f30540b2fa9dbc0909d98a1ff2b4.npy +04379243-53e8fff5ddea1b47d44dc16af152638.npy +02818832-94855c7a018d53e3dbfdb9be425ff2e5.npy +04530566-8d7c4ca5e08a8a3a6d4334e260ec617d.npy +02933112-6e2beb63c61144f54da5feafe6f1c8fc.npy +04379243-1a00aa6b75362cc5b324368d54a7416f.npy +04379243-3779ef1608ed12dae074517a246f1e65.npy +02691156-bad95673c40e3bbd66cf1b4a8fc3914e.npy +04401088-b7ab1b6f7dc5026dea8f4709e6949c8.npy +03991062-2ac8e00463d247119201f2703b45dd7.npy +03001627-11f1511799d033ff7962150cab9888d6.npy +04379243-2d11e38388d212634cafc8d32c041834.npy +04256520-db49cbcb6a2ac87657b1c0b6d5084bcf.npy +04401088-16c6403551e81a3eeedfca8b846d3b01.npy +02747177-24884ef01e9a3832d2b12aa6a0f050b3.npy +02958343-f723dd6b7a95e230c75bcb366ed55ad8.npy +03991062-106676e68e8031e51085ede6a3c1fc8b.npy +03593526-8354259c3fcf12fa31f42a72ddeda489.npy +02691156-541db123c3ae32cda91f7285bb2efb4d.npy +02691156-707da8b9f37fd990bde4f466a45d975a.npy +04460130-8074bede148f1cbf8a982597ea241696.npy +03001627-9d2cf09ddd9a05fa1f8b303c0da5108d.npy +04379243-d8baf8507ff705dc2787b53b27e2d44e.npy +04090263-b548a4e02e014405de423072102e0bc5.npy +02871439-edab7fdfbcef3ef2f77e23ececdab4d8.npy +04379243-9b18c8de0d9d2882166ddaef2c2c61ae.npy +03001627-b1c221e3ec7fe34782b50ea5cffa80bd.npy +02691156-9d7e431ebd35cdc2bd46d022fd7d80aa.npy +02691156-cf402c23d4ce807d847335355bf4459e.npy +04379243-1cb5ed66917df7b3615b3e12f53b391d.npy +02933112-9140ef4099eadf73887c1a82cf8c6eea.npy +04379243-589e7c32a63816b1d4a147733422d301.npy +03325088-ec1c146241042d2c25faa413356e0316.npy +04379243-7988dedacce42552ab610b0c94236463.npy +03001627-9d7d7607e1ba099bd98e59dfd5823115.npy +04401088-25152b4f593e5c0555940ab8fd747fc0.npy +04379243-4fdb53755e578678cd7f32327bdc729f.npy +04530566-6d71354936e0e1e8c362d63d34a4d0a.npy +03001627-78c9204b2eac432b65b77a565916c7f.npy +02958343-3344ba7f18d9623d549733b112275285.npy +02958343-39957ba700c2461d6b6786771012aae1.npy +02933112-165c00d292773865ae6eaa32356aaf3b.npy +04090263-15cc5a007bb325a3405d5eab6bdcff6f.npy +03938244-2fe82cff107cbeaeb357233991a61d01.npy +04090263-2ce39c653c42982948b7bcada24e2926.npy +04379243-f46d7f7da9a056d7fff16555386d173d.npy +03691459-ff383dd89f76410a49c18a2c5bf89a47.npy +04379243-8c81742da70c5abba7574b4673f4d777.npy +04379243-af0206602e75c8bbdc6a693174c70feb.npy +04379243-798598965a343fc9b0957d845ac33749.npy +02958343-6b44be4025c966d4672601793664460d.npy +03211117-3813c5f6f50bb28a3e2061cce7606c61.npy +04256520-4b9c06e04d329213843ead12644a79bb.npy +03325088-393fa5f93b539b1914b35a7d7cea7130.npy +04379243-54a22269051c9674cfdf2d08e1ba2a48.npy +02880940-2c1df84ec01cea4e525b133235812833.npy +03001627-ce12614d019f86e840ef1c8b63a628f9.npy +03001627-c375f006c3384e83c71d7f4874a478cb.npy +02924116-2bde632f14fa5a8377940b0d988b91df.npy +02958343-2fc99d3fe3f1f3b3b5e3401710af905a.npy +03261776-719b4249339e7eb4c030d1f2c16e4c51.npy +03001627-103b75dfd146976563ed57e35c972b4b.npy +04530566-85ca7456e200e8cb874f0e42f84eb4f5.npy +04379243-98583f22ba708ddb4b3c42e318f3affc.npy +03337140-6125e3064e7324f8e4e346ee2650d150.npy +04379243-e3e1d9e88b396e6b8cae28243a4ae130.npy +04468005-887636e0984bcc7984ff53e2628fd6d0.npy +04379243-ffb5e48fde2cca54518bdb78540c51ed.npy +04256520-6e97f3391a8de74bc862eec8232fff1e.npy +03928116-89e4214536b63bb13fbcdcb4c54d4ba8.npy +03001627-bbe63bca5688ac6b7236a8143b10600f.npy +03691459-f657a906298e9151e3178ebc750d175.npy +02992529-17072ff9ec47bfadc3fd2392bc923b2f.npy +03001627-fd5f6ed4a873c5ec300fe8666348bd38.npy +04530566-d4ffdf377bda1aa5f650f4803ec7962d.npy +03001627-f4b141ab64a6c4e771a782a4379556c7.npy +03001627-18f57a3d41117140ed98cca8f0ccd5f7.npy +04090263-ff6e6c1fd1069b92116f3b4758e85d85.npy +04468005-97ef43be022c84d334a4f565076f7529.npy +03691459-65dfccb2d5e47538a24143eec482cd09.npy +03467517-defcf80fcef4b51b3f431ca2c1260d62.npy +02924116-8114866e788441652b4948f27a5833ba.npy +02933112-a46d947577ecb54a6bdcd672c2b17215.npy +02933112-90e6262b1713ab09fa3b6936d7879478.npy +03001627-c5e3f6da9e818851618dd45f797b66b4.npy +03001627-db0925930500d67d7094f114e4783e96.npy +04401088-2e6c1cc7d262bc36c1d28dd38097a536.npy +03211117-b72579335543691423c841f9d5051936.npy +02933112-a81a218a06fa2cbabc78261b35f7ff55.npy +03797390-ec846432f3ebedf0a6f32a8797e3b9e9.npy +03325088-ec3a09d4e06843823321831d2245cf06.npy +04004475-d12512c99c7836c0aa4b3fb09d44650d.npy +04090263-d0d4e25322d8fd3a1f58b8bbfc791148.npy +02880940-eff9864bfb9920b521374fbf1ea544c.npy +02691156-94843fffd7d2a8c0dfb86dddee1d6ac3.npy +04401088-3993102ecafa0826ffd1164158ab2e9f.npy +04256520-853707d42be3a24c3eb520ff7cd241f0.npy +02924116-43195339c363c8f1cfcd1fbe1cf0ecec.npy +04256520-9955ce757c0bfaa5843ead12644a79bb.npy +04379243-55c2262e68f311fea5526f91aecc0c37.npy +03642806-1b5ec8c5ca53caa5ad6be7ca8dcfc55b.npy +02933112-18a1c4eb2e4b31fce83221ad0d21775.npy +04379243-f85e243539823dd56fa63795f94c4d8c.npy +03001627-2975a651cf06a21260902b587804b688.npy +04379243-15c32aa0f0dcad130bbd4cddd04c77b.npy +02808440-2e61279ce7db97ab3321831d2245cf06.npy +03790512-57a7a9e163e8f087fe11eeaa72c8aa36.npy +02808440-55f7cefd2fd58bd4f4dbd7b2c34ea2f0.npy +03001627-9dad5d3a04753f69febad4f49b26ec52.npy +03325088-1de8f72e190d7ef1979c556124bee033.npy +03928116-3fb81f5f3a3f0d69be3ca6e34dba44de.npy +03467517-dd95faf803299254d57700c05b1862d8.npy +02958343-2b5a333c1a5aede3b5449ea1678de914.npy +03636649-a26a9f9ddb5f345fcb8d8c6d4df8143.npy +02958343-58f2baf01b8a3baf24da76692f3228e0.npy +03001627-ce50c6235cf3ad8855afe589a9f09982.npy +02876657-80a3b56c86f906e5f913a7c27a7e15b9.npy +02818832-8ce474b9f38b5e11130fdafa1dfb8326.npy +03624134-5e15d63317014f30ceea8802f71596b5.npy +02691156-d75ce9ee8a64adfd98459325335edae9.npy +04090263-e4540723eab9ff0bef0c52e20895a77d.npy +03001627-23299a939a6ecacda5817f81a1efa3cc.npy +02818832-6e4707cac21b09f0531c83488903771b.npy +04090263-e998d23c1e691a33a0d2eb90fc1468af.npy +03636649-2f216bc398d3da98cddf96969ede3013.npy +03001627-3f04adffb69b5ebee95cd0dc8c2f0e83.npy +04379243-cf7c2cfb403f2819548cdb167cc8bdd.npy +03691459-6b621f006878b74f2a9eb0f146e94477.npy +02958343-666beb2570f33c64f64801ad2940cdd5.npy +03211117-8fb07bba1524168f7f6853a06fdb3f45.npy +04090263-f92b4caff4bc0f6d9352b002a7d38daa.npy +02691156-787d2fbb247c04266818a2bd5aa39c80.npy +02691156-f592e88114a240cc61a8d3163a0a75a7.npy +04256520-b216efa7925318b1e466d83a76d6230b.npy +03001627-faca91ff3f9e2b93a87dbaf229daf408.npy +03001627-d00a7550cf050fb3720daf9b94e7a5a.npy +02958343-8df9feeed8678aa6bdc56c6b6d74b51a.npy +03991062-a641529c7e3cea2293df73cd41b59aef.npy +02828884-d7eec9ea272f5fc9cb2a965e75be701c.npy +02992529-447cb44311eb5dda57e80f5278d5b50.npy +02958343-a3e7603c0d9ef56280e74058ee862f05.npy +03001627-c790496caf5f2904f14c803eab703899.npy +03636649-b2116d5a9b93a0704f377bc8602186f5.npy +02958343-d86119f06459e996897844133a297d65.npy +02871439-f4143a20243d832152e2d18963a75b4d.npy +02801938-a0e69e333f8aceaa24ad83a2d67317f.npy +04256520-cd47287d6da7492e64810cc21086da42.npy +04256520-4fd35417e08ffd8597e11b0362ef2f51.npy +04401088-383a304edf67f757769dec5ec0157054.npy +02946921-fd73199d9e01927fffc14964b2380c14.npy +04379243-be7a1bb508905459f51f77a6d7299806.npy +04256520-511168d4461d169991a3d45e8887248a.npy +02958343-e9ae93e6ddd5bc1e6047f64eee8fcb68.npy +03001627-ca764efc4e76a8b48d69616377752ecc.npy +04379243-3144ba0c286cc61f490ad276cd2af3a4.npy +02924116-c54d49c3e1d9c53f1a1d4468b3f01868.npy +04379243-8569c03c2a233f7b4b3c42e318f3affc.npy +03636649-eb8466da51199e0ecc4c445068949125.npy +03001627-7ee46c6f7c028fc6d661ff085a0f14b7.npy +02691156-697b269a890237fe15796a932d10290d.npy +02933112-2f2e54607ea04be4c93bb8ae72b9da71.npy +03467517-bf7026f9814230414269db3f92b7aa5e.npy +04379243-1480684381add1e7fff16555386d173d.npy +02828884-a2ee6b6eb6f94856c35213a917b76486.npy +03046257-8fcb8178010667392f84cb7932f866fd.npy +02818832-ed40b57386714d23940d5ff3114b57.npy +04379243-59a2490719d49a25aaf15b62af6b513f.npy +03001627-ef66111933d5cb32e46ed8e42660ff49.npy +03001627-6ddb87a44f7f68b89c0ca344f487323e.npy +04379243-734271cab27abd133d0f9f8a61342808.npy +04379243-60fe09a5de2a484f45613f5c2df1029a.npy +04379243-1de679dd26d8c69cae44c65a6d0f0732.npy +02808440-3db95e318c29a2ccb362845c6edb57fc.npy +02958343-c6038e4cf08de1a7c805dfe4ca9f2fdb.npy +04379243-1c20d8cce30ded086ee08f750473a436.npy +03001627-9f7dd8cb949fb0971f6138b700829a47.npy +03001627-614347b0e864cdc7492d9da2668ec34c.npy +03642806-4d3dde22f529195bc887d5d9a11f3155.npy +04379243-7b504e7d89d9e8d822a33e080d0e71c.npy +02828884-ab131feec69007a42250bf58700b4d8f.npy +03211117-2f12da0c7460b22cd3ab2bc0f53ca878.npy +02871439-c9a603de83e6914199e8bf807e902261.npy +03001627-c1a0882e6e8f8b082b722fc42ccb4c6a.npy +03001627-5bfb8edf221c7b0e84edfe802bb43dcd.npy +03001627-1033ee86cc8bac4390962e4fb7072b86.npy +04379243-672af8a6cb34e00678a875f897a47818.npy +04468005-22880ed187b2c5ec95f2655a7e810da.npy +02808440-c3524cfa04be2a427568fd1ca5bc0200.npy +03001627-bacdce8bc1974ff82c528d33bca1ac2.npy +03001627-989c95491d7e823fa413908c0e169330.npy +04379243-5c938860481a2d0f62ba00e4e73bbc2.npy +02992529-af983238a3e47692f90d7ee51bc3530a.npy +03211117-cccbf9be5d578b49bfba6cd89592cf9e.npy +02958343-4a8aaa19c413328d2557e2b5350c7e1f.npy +02828884-913cb50bf5d336238b0239afbed4a626.npy +03001627-ca05bd1afb0ffeaf6b9a484dedfb7d25.npy +02691156-65511fdb2afad900203936772104a82d.npy +04090263-1ab4e79889c1288995f22290198b089.npy +04090263-f7ce17ee88cdec33973c46c285b944d7.npy +04090263-7faeeb69a870d18a2850d4a1a9c25bca.npy +02691156-823de294a08784fc879e4d613e8d4e33.npy +03624134-19dff8164764e2a259f37b6e82c5e93.npy +04379243-bb027ed892722b1f3399de188dc5ee56.npy +03001627-c0d25cd4481b3c2a365f491f6e3dbc3f.npy +04379243-54db32cdda20128ffff16555386d173d.npy +04379243-7a6cf20a719c16cde8258fa1af480210.npy +02691156-a3c1b9b0c75af9a65cbd1a70b5b90a8.npy +04379243-dace4e7f0ec285abcaa22a10624245b6.npy +03513137-6f41517d1eec863b52fafb0cab311e6a.npy +02992529-53cd656555da181db6d41c42f7ade8c8.npy +03001627-98d37b373c0207915dca6305fb9f97ca.npy +02958343-144d0880f61d813ef7b860bd772a37.npy +02958343-e06082fd22dbd3d425da9962b829b47.npy +03001627-7a7273d390ea180db857892c38c46c13.npy +03001627-5d02aed0e9c93e829b9f2eb77f5e247e.npy +04379243-1f59698c02bd1662dbbc9440457e303e.npy +04379243-4f35874fc0301d015cd4f7d5b0608a.npy +04379243-fd07e0a8265d1e15db11d29991a4fad8.npy +03691459-26369dd5c4cc8c55e9e3ed40810044f.npy +03001627-4ae919ca418d3625d30ba6a673002f3e.npy +03001627-b7a04fb7a5fb790d96626c84a010ee5c.npy +04256520-2314a3400230f50d14038d588fd1342f.npy +04256520-32464457314622264587e90e2fc67ac9.npy +03001627-46c8f742ae31294cb4a4ddb21cda79e5.npy +02924116-e0275ff6dfb3de5ae550942ea36e5443.npy +04530566-602df167ba6cb5f5443efa8c2bef3b97.npy +03642806-7da524a31c9cfe22ea8725c845547c21.npy +04379243-b696793f05faa0debc5c12f67106b799.npy +02924116-154eeb504f4ac096481aa8b5531c68a9.npy +03001627-d8f7e27824e61aaa81dff5c2e57ad46e.npy +02958343-48862b67f5932cd4473f10e6caaeca56.npy +03325088-5f9c1f87d28294153321831d2245cf06.npy +04530566-a0f1e4ef99b57121a9142e7277ee08f1.npy +04225987-f52d56b5f81f1258c70ae17ca06472e1.npy +03325088-4de8400e15f1ce79b362845c6edb57fc.npy +03991062-da871256377ad8fa53d040168a517ac7.npy +02958343-b0c2225ab347e28f1a48cf85d161a723.npy +03691459-7a7193771ada6796a1b0d9ebe362f8f3.npy +02992529-4c9760ac0bbd2003151c744078238922.npy +02933112-1e200d34c5555634c59350d819542ec7.npy +03001627-52d747ca443134da81dff5c2e57ad46e.npy +04379243-37dcf713a1842b93a8699b6183baa203.npy +03691459-596f7a94c6d1443870896ebcdb67d8d7.npy +02691156-6b6cb0c71731aacc277d303e3a640f98.npy +04256520-9c113b80d75659ffdb8fa1712f9ee93.npy +04379243-e5c44394471f29d874739c2c9ecfb3ee.npy +03001627-7644e30dc0d88481a3d974b4624d6717.npy +04256520-de3589ff77017c7df15e23b99997e42b.npy +03085013-442a30c7e3d4f820cb07c68667cfdc00.npy +02828884-3a91034ceb33784b562fc21c99684e03.npy +02828884-cf14c102e6da1a78e6d475a101a6dfca.npy +03593526-1a9dade4e4a4c47589035c25f0dfeb63.npy +02871439-f605462946e280e6ed46ddfe25ee83ba.npy +04256520-98546869c4ac8516febad4f49b26ec52.npy +04401088-3dc95447a57f8d06c1e615a94e798da1.npy +03691459-ea944f309ec70895c9fff209a296912.npy +03046257-51b07fb2a039850c384368499a680cf1.npy +02808440-c118e19caa1c626431f28caafecd610.npy +03001627-6ec9b7c65db28eb32342d056300eceae.npy +04256520-32c1445f65f4ceb23eec26c23f5bc80b.npy +03001627-2909a46120ca93afff16555386d173d.npy +03593526-2fa653cd90c27f8fbd16d4490a10a752.npy +02933112-11694171ff49a7521ee0429e004db48d.npy +04090263-55966a1b272679b256dafdacf26ff875.npy +04090263-5d8c7291e06122c14eb1cb28584abf8a.npy +02747177-22cac9601407b70bad5067eac75a07f7.npy +04379243-38aab2d4679f51a7d70e365688839034.npy +04554684-2ba54a5656c25096174c6fb6a5678c41.npy +02958343-4212ae43231ba858b1bb46d2556ba67d.npy +03797390-6dd59cc1130a426571215a0b56898e5e.npy +03001627-8e0832b4ee38c9743b8d5c0ebdd194c8.npy +02843684-bf9a6c379d2dd1ce5bdd1b5cdc787a49.npy +04090263-48eaec39f20dfafa7e270f84701afcd4.npy +04379243-623c9a5812ff9ac920768660cf080d12.npy +04530566-dc422a7fdde68d8bbfc744c1348ee017.npy +04379243-8f7cbae92fc1c6f9327289c00b6dc9ca.npy +02958343-709774861793cca453da660a6567c5ff.npy +02958343-a1b7a3cc11b25b3a82c0a051a54c0e33.npy +04099429-5925619f2bcb830aec83434daf14e347.npy +03001627-57c6cf844c09c5d8b40f0ac0fb9a650d.npy +02958343-1d2c5ee3b5ef205164bd4e0c23ded276.npy +03211117-b5f473b7fb7cb7a7cc12bab62e8ade64.npy +03761084-a4a556292a3d9395230584014222e685.npy +04379243-bdb44c3f5215ca84b6d51da3ac2ed48.npy +03710193-e29e2eadf4e79ed6b34538f1e32363c9.npy +02691156-8a343fecfe2b8660d0fe0309648c1f07.npy +04090263-181d88c9e36d9ab88aa7cb0651220ba4.npy +04379243-e300cdc549ff426723fe3501bb9e7193.npy +04379243-6fe854efba4d9ddcd4cfbd0aef5a371.npy +02992529-e55ef720305bfcac284432ce2f42f498.npy +02818832-51223b1b770ff5e72f38f5bd71072746.npy +03211117-18dd6b73f3ac2fa26da250acc5e18ffc.npy +02933112-83db7fe5bdd2df12824662341ce2b233.npy +04530566-f84196260e558ff5abb59ca95d19016.npy +04379243-2c1d79e1e1533bf1f51f77a6d7299806.npy +04530566-8dd5ad35a45f72a64bad9b80eddb4cd1.npy +04530566-d8d0fcfc22f1b587308717e0a8b6a9a.npy +04256520-be19ff23b9cf375d6ee717407316be0.npy +02954340-60104a0945f83b063f30fadefd6911f2.npy +04090263-587cee5495322f18cf1584c5b09d332.npy +03001627-6d5207270292fa01c914a9f52c152c86.npy +02958343-c29ff3df2cb0139f635939ef1a7d59b4.npy +04379243-5b5532f71d63a7a772051d450c32f58a.npy +04530566-143df6dce1d90696874f0e42f84eb4f5.npy +02958343-da34cb394fb3caa58dcad5127c74b8e0.npy +03001627-2fca00b377269eebdb039d8689a74349.npy +03636649-1991d403d8ade0ad338afc540c33f34c.npy +03636649-ae67ee6392fe8ab94e7cb04dd663c825.npy +02958343-27f7336ff6ace6d460c94cf1a48e53cb.npy +02691156-f74cbd91e6fb40dfce5965228d7e8c9f.npy +03642806-a7069a96e11b8825483afc91de6851e4.npy +03691459-7f2cb859eb00046d3bb72a8bf55ec27d.npy +04379243-3ad4ddfda32220c388eed60433632c64.npy +03467517-824184668c5a297a5ece9c83df74def8.npy +04379243-5326de43a392840657f40ff86fe708ff.npy +03001627-6be3e544deece8441191025061735ea3.npy +04460130-9c3a256496120013d444bcd674952301.npy +02801938-55f00572c277b1876effbd64ad6b71b8.npy +04379243-f4fecae627f0c8906a4e86536413f450.npy +04530566-90bf73b91185303139555c8c231d0eb7.npy +02933112-5d765603dfb0f151e367f8f62a7e9398.npy +03513137-5021db37ba1fb177202339ec5396045d.npy +02828884-e6f7d84750ac46b260bedcc07a9f285c.npy +04225987-db4c8bf323465e4c537d393009a79347.npy +04090263-e74ab615b3008320e2bb19fbad3e4596.npy +03467517-77095861248c816693f0194265a9746c.npy +03325088-72863e1ef3c0a6fbdd5cf959690bb73f.npy +03948459-7f3ec97cfaea31137504cc74f24f0eee.npy +03001627-6c554635dcd6123a35fd8a41e49d8421.npy +02958343-2a07432c2860b54becf71e2e014ff6f.npy +03325088-e76c3dd5d8baf0c5bb9760cf9cd1a953.npy +02958343-a49107f738b26379428df271ebc70bc0.npy +04530566-43f7e9f8ad44e8236557d610dab4f1b2.npy +04530566-768bb9fbc3a5e3724f42eadbd9a0b820.npy +04379243-20edff7e1500fc4ed45f502ecff9e44f.npy +03691459-4a0278285d649ac779b2745bcc82f6a5.npy +03790512-de4d518333b82995d5dde04c96fd8146.npy +04090263-e4bbdf84d07fc208703494a0657c2b45.npy +02691156-457c12e05d0f5d15762c3bd1a2b3f377.npy +02876657-541c4dc1d1b42978648ed39e926e682f.npy +03001627-4960144353a6dd944c5483fab67d9a50.npy +04256520-ada8ce574ee473827c373e0e7470a338.npy +02958343-f795a928e1c7136f94d732a98738804e.npy +03001627-73b37c243cbf23e0b516c05d046e8e45.npy +02828884-b3548e858e4fa7e0ff3245f22be4d221.npy +03593526-8e5595181e9eef7d82ec48ff3a4fe07c.npy +04379243-322b055809086143c7860707e3deb3e1.npy +04256520-fb1bcd50b847a99d7948cb8e1d9ee487.npy +03001627-35f94bf244a7fdc5f51f77a6d7299806.npy +04530566-973a6d80a9dfba962625c670c48fcecd.npy +04379243-83786b4a5d955949a495869179e36802.npy +04530566-d1a5a246ffc956d68c841014ca8dc002.npy +04379243-21ce94947b07b5d1f91663a74ccd2338.npy +03467517-25a108bc4c106249480694b9b5582e9e.npy +02924116-26c334c2faacbbdd9f46749e28e16975.npy +04530566-a034dc83750e7b8144c1f09f7df84b24.npy +03636649-1e91664763d371937dd73da65dc0e6a7.npy +02773838-5d4f774fdda6fa1dcd99ccc7ff441abf.npy +03691459-61add6842a1dc131b59e9758ae7f41a7.npy +03636649-b8c809f74a592a91ad5067eac75a07f7.npy +04379243-e2cb95f03f5dedf9f198b94f669bca91.npy +03636649-9c62735cc43add358f63636e145483fb.npy +02808440-c4d230faadf735c3ac7bed72580dc30f.npy +02828884-7bdea368f85d9eb5b47a47f71cb78bc1.npy +04379243-38ae45935dcc83fcc8c2a1a2edf00686.npy +04379243-2700f6693447c32d66c64744a4252d3.npy +04379243-bc15e43c4af5a6d0f51f77a6d7299806.npy +02828884-3749b110a6f7895afdb310510a9dc39.npy +03001627-75369f55718d5adba0bb10bfbc5d4718.npy +04090263-194a4d0bcc1443fffcfd5149a4a15414.npy +04379243-1ab95754a8af2257ad75d368738e0b47.npy +02691156-b97b9cde30c23b4d71d03b466c72ce41.npy +04090263-c02b44f51d159cc4a37c14b361202b90.npy +04256520-953196a4e8a813e8fc909e63d58b00ba.npy +04379243-3134eb0e0dae6dd7b26d198318b74e09.npy +04379243-4b1bb0475e67abe029426a0f57e4d15e.npy +02828884-71b9976c657291772d07d128adae16ff.npy +02992529-9644fb6a1520af7fa90f3ad3635b46d5.npy +02924116-9294e3a8412a9219928aff27104da001.npy +02958343-e2bc765fc68afde6afe717997470b28d.npy +04379243-3a44efd1fd14ea66dfa4ff010b8b9d1c.npy +04379243-af90af72a4808ea767c8e42cd3ac65ef.npy +03001627-f9b24a3b88f9037e4b5cae2ecfffe51c.npy +03001627-cb17f1916ade6e005d5f1108744f02f1.npy +03691459-1eb0b35e8e8ca4da85113402a7623535.npy +02691156-b008491b09894384451efd5041dc713.npy +04379243-3bf20deddacf5cc64b8710a3469971b1.npy +03046257-844b4e8847e4612d30949acb87806dc4.npy +04256520-b6d1a72c1f27f4cbcd701e9c04d3cf7a.npy +04401088-fddadcb723b843eaafb07a946d621b3c.npy +04379243-8519a614ac4b1c642b70eac6546e93fd.npy +03636649-b07acedb329345f0157f5033576317e1.npy +02871439-60a48fd8f1191133664b3b9b23ddfcbc.npy +02958343-9e6156aea0c7e60ff7d6fd2038bf9a11.npy +04256520-7b57ecf4b5e9617d6282231ccf88d909.npy +03001627-117930a8f2e37f9b707cdefe012d0353.npy +03691459-96ff36cb731b29a61ad88f716ea80910.npy +04090263-5ecb203a4b00b9a5a6d1f73319179578.npy +04468005-9261fb7f5dfdb35f92236fdea0aebebe.npy +04379243-f6cd420f08155054803d0f5bac2abe4c.npy +04401088-652a6fd052491909ab19ce2dec0d1925.npy +02691156-7089929d7a778403e91b0867f5d9629f.npy +04530566-74480b3e812f7c1428cf87eb5ebe5e6.npy +04379243-7634b09c8ce172ba71a782a4379556c7.npy +04379243-735afb29934346513d41bddf307a46a8.npy +03001627-6782b941de7b2199a344c33f76676fbd.npy +04379243-a546045291e8f61c8163a33a6bfa14ec.npy +03691459-702c2f9c3e8770b534943af333340cd2.npy +02691156-b82731071bd39b66e4c15ad8a2edd2e.npy +03467517-305367bd8723cce9d57700c05b1862d8.npy +03636649-8bd35721e2767dc43225afab722d9fd2.npy +04256520-210076a2e26d5d53adc3470b30138f3.npy +02808440-35576badda1a56e6ead5604ea0ec0346.npy +04256520-af0c4f45e0444ecb01c58badc8bbc39.npy +03001627-6fc581beb03eb73349c9c494c2fb14ce.npy +04401088-12f2156b99444e955d73afbd7c310e93.npy +04379243-87ff92c179ed5ed292f4c88fd91c6b1b.npy +03642806-7f75b94bd59d649958dd315c54df0c15.npy +03691459-869225f275f3dee12a42340e65c9f0ec.npy +03691459-2cc52cc8e9de5c12f398d0c5832df00e.npy +04530566-70744087c22ee199a51aab4cdab636bb.npy +04090263-d3795e145d8fb811d735fa1ab17311ec.npy +03211117-68206e7d85afe3619d8d0b45bd2b5b8d.npy +04256520-847ce2a3541a085ccc9651014a82e2b9.npy +02747177-2a20ec86e1aaf196cb2a965e75be701c.npy +03001627-a6a7b00de9ccce0816a5604496f9ff11.npy +04379243-aaf6be1d92a8c61fdcfcef693e7ec696.npy +02691156-1f86a689ea6c35f0d9da70c3ab6dcf3b.npy +02691156-deefcd290f7f2f1a79201593c1eb4b0.npy +02933112-552b14104b7add4049cca13fb3e44bf.npy +02691156-1a04e3eab45ca15dd86060f189eb133.npy +03467517-18da35f3835f75bffb5c1b0f759e2bc1.npy +04379243-9ff56887e5f00cff412a0eaf6d0f1809.npy +04530566-dde98d21d4359f24799c6c3b2fff049.npy +02958343-860b7d89728a27b1afe1d4530f4c6e24.npy +04530566-320683da0d8bd1f394a6427195fa0bd9.npy +03691459-841818bf97827792b6fb1533bcae7a75.npy +04090263-638b5b75b9e7b0c4bb6581a048a6fb18.npy +04379243-599cf052b675ac2c8457b637f6fe1690.npy +02818832-b7abde250c295574d26ae70d41aa7c7b.npy +02808440-e1315ed591ae2c6af6a9cd46986959f7.npy +03691459-4c5b7420078b23b098935bd14e27f0a5.npy +03938244-c9f732b5bfe7b1cd29c99526bacef0da.npy +03624134-47d1191bc5bf94bc625ac64d4da8b7e4.npy +02828884-eeb6784f5812bcebb281680297eb79f2.npy +03337140-820868b702c588e0ce5d6e9371bb5c33.npy +04090263-1d9d85fdf5241ec31dfb190851825aa0.npy +04004475-99df53ab6417e293b3b8d66c43b5b940.npy +02958343-1f9a735052840d4fba1ba1170e0a8dd9.npy +04379243-934f8fd5d11af1e6e75232ab5942fa9.npy +04379243-db5f1c46d8af7d17db073a02eddafbe6.npy +04530566-87a750e55b04395e668e250d23d1f86a.npy +02958343-57aa7560dcfecea81edf5a868fdffb8d.npy +03001627-cd5ad4afabaed0d3e762624dc3c8fa2a.npy +03001627-24bbe7f32727901aa6fee8e2140acec9.npy +03001627-c50c2887ba2b5535c32fd7e88552aa9.npy +03325088-da28d9077b9bf42876d20e73c57c9a03.npy +04256520-e2965d9df7974ba25369e32fb818f337.npy +04256520-7c9e1876b1643e93f9377e1922a21892.npy +02933112-452ef94b9cbd238dd869694b17a45f49.npy +03636649-238138a3b01dc4fa68f9be495c6674d2.npy +03928116-82e0e96bd89956d9f330eedffaf3339e.npy +02691156-33a4f9403600f29c281f657e8f8481a1.npy +04530566-ae9ab937f6c1998fcc34b900bb2492e.npy +04379243-84c52a5ac0f8d1d060ddc468fe733ed1.npy +03001627-3a91034ceb33784b562fc21c99684e03.npy +04256520-c309f25d69ad12dd4733824eae5cd9ae.npy +02880940-4b32d2c623b54dd4fe296ad57d60d898.npy +03691459-48720ac336dc7012d20ac02530d96758.npy +04460130-10be0ff0e5eb12584edd82d34d189d0d.npy +04256520-a259b6ff6a4a787b4c30acd2d55583a.npy +04468005-1cc54ea296582d76793d6971ed960dd.npy +02828884-7cd1d8b686ac0059ad5067eac75a07f7.npy +03928116-36b6209b6450a35993680c5a9a367b4a.npy +04401088-77817771db0788d3241d076ab53023c1.npy +04090263-55518164337571f9ad0854712de182c0.npy +03691459-cf42a073500a1a222a9eb0f146e94477.npy +02691156-d9c080cb6634a902ca9f0727e23831d9.npy +04379243-4b11be42b0c0482dd94faaee2b20e2bf.npy +02828884-da52e5b3a29c06b1eb8ae9cf8e3a676c.npy +03691459-78efefe36b492b6e5a31d91ec836a511.npy +03325088-9cc5112d89d6c79720ea64e16f9dc224.npy +02933112-ebc49b9b624dfb55f9913e822d5318.npy +03001627-ca1cfcf4d5060ead8610f0b48b38e644.npy +03001627-5752f7caf0dbbe4d94210977e5394f26.npy +04379243-c50794596b14605421c4aa1c0e1daae3.npy +03467517-3f94fd316d4f2ca1d57700c05b1862d8.npy +03001627-2a8d87523e23a01d5f40874aec1ee3a6.npy +04379243-43c1a78d9d8b3735f2b931201029bc76.npy +02958343-67e2f8985a28e895a592cf90fabddd34.npy +04379243-6d9be8619f48e3dad096bf408b606360.npy +02691156-6af4383123972f2262b600da24e0965.npy +04379243-74983e99e7606eb114708467db3d00e2.npy +04379243-6724ae69c0bde4c09b7dad6c9c46bcf1.npy +02933112-81cc63cbfa6e492154cd2a0ea6cb618b.npy +04401088-9c5952804e0b2ba3e1fb8c5792a5768b.npy +03001627-9b40015761a54e18c29f8b0ac356b8ca.npy +03642806-eeca77a4ae8aa0ce3bef19ecc8621d89.npy +02958343-e9b2aebf673e516d1f0d59cde6139796.npy +04090263-98572b8a17031500c2c44977d8755d41.npy +03948459-61064e4a00abaaec589c07868201b17e.npy +02924116-59d03143935a47811bdb28bea09e3a92.npy +04256520-9381eb770cfa95bf6bd365389d6dc6e7.npy +04090263-5f356bfdcf9cd4218d4ca42bc1bef451.npy +04256520-27f0c4cde547763ab8a40f9116438027.npy +02691156-f222d51d7c6fedc2db73445864b72015.npy +03001627-eda92b7bd76d8bb0b083574fdbdf0a98.npy +04468005-214442a4247d8c049cbb6423d7247328.npy +03467517-71574955078e0e6191437d7de92c7dd7.npy +04379243-bae99f3e4af5bd5ad9b53420a5458c53.npy +02871439-5cfcbeccf9c9681220192a5319e3e2e4.npy +04090263-2e7c6e5ee2f07f3ce19905e7053d006d.npy +02828884-54197739c383e3b9ad5067eac75a07f7.npy +02828884-843cbbdda45de37970709281289b3745.npy +02808440-a78afbaa1c7e8795e44d45504b29e834.npy +03001627-734ac9809aada180d18df440db206fb1.npy +04530566-395ce591ad2e2d9be47b958d3d1f5177.npy +03001627-9a8dfc7a6831749f504721639e19f609.npy +02958343-49888b45d4bf55a530855e8db75dec30.npy +02958343-56478692749392a19dfd5136ef0f2af.npy +03001627-5f7152813631754bba07a29886846807.npy +04256520-82c4b96fb61723aef3598efd14e493d5.npy +03636649-fa9dc903c8324b85e3d605ae370b7c5c.npy +03928116-cd53fdcb3213ff4a9012f53cfe64e327.npy +03001627-2c5e32bb738a5306e27790b0ec8671f7.npy +04460130-1ec4566d10cc58d7a2f3410d5eb66b3d.npy +02933112-ad4ca1e6d178dedfbdc5348d65406054.npy +04530566-907c179103304ce8efcba30d0f49b70.npy +02828884-26c48cae38ed374e786f181221f27278.npy +02691156-ac026df0c0add322f37f38dedb2f1219.npy +02942699-3019eea689e5d9c1fb045022c5d3b1e2.npy +04379243-a3064f61346b7891ea0464486db6b687.npy +04379243-4cef53c3310bc0561826247b46b2ae8.npy +02828884-7be476ad18fc7b40d201085e80edb26a.npy +03001627-4a17e5189aafa9afc8687ff9b0b4e4ac.npy +03211117-917142dae380e5591ae30faf8d21acd7.npy +03001627-d1436d73b3060f2ffd6176b35397ccd5.npy +02691156-a3e15e215144dda0a03ebab0e8b8f7a0.npy +02828884-874577f61fe70621a1370c1659f8eb45.npy +02958343-18c7b5644290ce2caf0c754abe32de.npy +03001627-5158aa43b78b81a0f7628281ecb18112.npy +03001627-7e4e9703841f16194e045e9030a39002.npy +04256520-742d1d33eb66d91014c0ce0d45458397.npy +02958343-233ac4ee75d1ff0c6d111cf7e70d924e.npy +03636649-6778917189e50370a894da3d4a669d7b.npy +02747177-8b8668ba154df43bad5067eac75a07f7.npy +03636649-b7a6c5c6c27273b3253cb5b81530269b.npy +04090263-cee56f2ecf92cdeca0834a5219dec81f.npy +02958343-a281de4b24f5500d4c40f34de8f3bdb8.npy +04379243-9b7352c3a8d69c2a1185ac82ed4da80d.npy +03593526-2ec608cc4d3287bb92e0b07fda7527d0.npy +02691156-c00b97813a9cbd72ec85c5551a78ef2b.npy +04256520-d992ee06ffa2455219eb0cf70882af88.npy +02818832-8589909841fbc75a11099baf02792d0b.npy +04090263-c44c0319f2f31c455814fafedc6971c7.npy +02992529-855a8a4c39e8fe81a060e584e7409aab.npy +03001627-2fe5d78dfd82bafbcec24f0586fc0928.npy +02958343-40313368870df2c0df59ad08996c77e8.npy +02808440-980d4377aadf1fe1b362845c6edb57fc.npy +02924116-60c6d162776e07178c468c10bc96961e.npy +03001627-eb6e55bb557701e37df0e9a69c97c97d.npy +03642806-caa4afd404f24d21275c1147a304ed86.npy +02691156-123ac29b0aac8c8e5d07633dda45110.npy +04379243-aa6a63745fd7ef284084fa5d51d65c65.npy +02992529-8a26be623e40850a203d19a168d29f04.npy +04256520-e922a4ef330ad87ca37f3fc191551700.npy +04256520-951e63303cf5eed1cd4a89b0fee32930.npy +04379243-3b91620452041b664b3c42e318f3affc.npy +04099429-2de8ee55ff69502863098049d14fe32f.npy +03636649-7293f886dfe144f3496d07587574cede.npy +04330267-54b9ac27f2bae92627a11dcb35000f7a.npy +04379243-672cf4b2e0deff1e693e54627de491a9.npy +03642806-62cf794fb5fb174aadbfb30d8d1b297e.npy +03593526-8ec888ab36f1c5635afa616678601602.npy +02691156-e42443669339a6c1a5a118bd15e6e34f.npy +03001627-ed0d65c68a1fa5c485e2f8b1d3a373fe.npy +04379243-3a651c78081152e77bb4e437e41d3c3f.npy +04379243-17a5f7fd90d2bf98b40f0ac0fb9a650d.npy +03325088-eecb6ef43e0902eab362845c6edb57fc.npy +03001627-ed51660fd119dca819fb4103277a6b93.npy +02924116-c150b150e25f4bd438f13d421c59f8e3.npy +03642806-1b67b4bfed6688ba5b22feddf58c05e1.npy +04379243-70cfb2647d8246971c81cfce8a9fa8b.npy +03001627-c22ce6ebc2b5bc9b59a44e6453790000.npy +04090263-b28e6d6cb4bb868ec27f2d9f006d69eb.npy +02691156-6c3593d0cc398e715d058822e4c8a2a8.npy +02992529-bf1f95958ec4d3e8d485372bb746f3c7.npy +04379243-575fd4acf0112feae2b24d5cb1e4e616.npy +04256520-7a32d6d22231a58d32388c13cc4a0ba3.npy +03001627-78f5b44157269f99fd60059ad8523f1a.npy +04256520-9beb39285a581fa1f2e202d571b458dc.npy +04379243-f0e98a20a4ad33b15578685df571d8b6.npy +03046257-8c8c6b1c3d201d55490ad276cd2af3a4.npy +03624134-d69e028056c9291069654277b747a908.npy +03928116-508962b8f60b4b0d8c6ed1c74b495e08.npy +02691156-e332fb3eb2c4016ec1f9d235878ff0a9.npy +02958343-cd5223d35c9cf611ea7efa739175072.npy +04379243-517683d0866085dd2beec56b24479ed1.npy +04330267-ab95b15a38c246c3cace11e1dcfb4b5.npy +04379243-7ad4285694233688105ea47d266f5adb.npy +03001627-2a417b5a946ff7eb2a3f8f484e6c5c4f.npy +02992529-effeac02fe96f769146071e83265f12e.npy +04256520-b3d216ad7575478d202316dd49948ea2.npy +04256520-396ee2a2333e80815b903ba10d2ec446.npy +02958343-36a5117c64d8ca6ca10cf495b6dc4ef.npy +04379243-f9ca04891f79cf2871124212e03fb7de.npy +02933112-60508a8437c09eb2247353095dc395a2.npy +04530566-36fba9c2f4c256dc4387c5ea62cbbe8b.npy +03642806-21c0187bf2174c1684c4330348773d0a.npy +02876657-40aee078f0390b7134076b5960251711.npy +02958343-59a8ea75a9c70f51a0e1f1086c88ba71.npy +03691459-e6e09672fd21f3d887695b38431695f3.npy +04330267-b23b39522e810d8d47605ecd69fe97af.npy +04256520-d83aea7de9d3d4242c37553db37ec752.npy +03001627-4dd8f21d05f7d9a99e48f9f4020457c3.npy +03636649-15211f5ea7c7432686c701087a194026.npy +02958343-262a03114b8095856a1de667a28251e7.npy +04090263-da2799e2d7b9334ef0b45b4b4c7e33b7.npy +04256520-e963f9423720600cf506f5cb7d8ce57.npy +03001627-b89cbb45476e94a5e65235d5580cc3e0.npy +02958343-34ab29cea66952f16f48edd113a40fce.npy +03636649-4dc9f86110ea40aaa570c6c691c987a8.npy +04330267-a18d795628d848a5589577ccf07b31e7.npy +04379243-305795f4aec83b53a51d50d3f9ced065.npy +03467517-86788d23472ba4de8cf17104f488ed2b.npy +02828884-66adf182075ea88177f32db2e5e73311.npy +03211117-48edccab11f0698be441f5bb6f88ca61.npy +02808440-5a67b4165fca8f4a34558e566e818bea.npy +02876657-a87fc2164d5bb73b9a6e43b878d5b335.npy +03001627-5392f55620f601471a782a4379556c7.npy +04379243-fd7769d0eba554c53def89b32cef8e45.npy +03636649-8b674da68033700333d93f57729688db.npy +03211117-d72732ab9e03ca861d73f583f51a758d.npy +03928116-71bdb3a149c93be6834096795cc3cf10.npy +04256520-45d96e52f535907d40c4baf1afd9784.npy +02958343-832a8f6cfe462e48402013bef9b89b74.npy +03691459-aed74c2fb80bf363f5776cc601097c0a.npy +02691156-49917fb82beca4beca8607f540cc62ba.npy +02958343-7a0f252961e5bffad95840a0da458be0.npy +02691156-c7b1ae292fb3d011511e2f9385a386db.npy +03001627-c826c65111c867ab45a1df43bcd9e471.npy +02958343-bd33b9efe58ebefa99f8616cdb5dd27c.npy +02691156-fe58e1c34a7fc8ac7f6b2c9a3874dfdf.npy +04379243-303ac20ea2febf9ec3bd24f986301745.npy +04090263-d75ba8d56bf868b75a950bb73f1dbae4.npy +02691156-b9168b74c6d459e65a73760c6feb254c.npy +02958343-ee2b541ccee732254c938921b509ee11.npy +04379243-dcca76b81c747e76a65e19246f8119cb.npy +02958343-57a2d812153fa225c740046119b36696.npy +04379243-b595da70965fff189427e63287029752.npy +03001627-61bc4930719717a9492d9da2668ec34c.npy +04090263-f32e61f7124ccf327aba5d123c068416.npy +04379243-db0685c490a05ac7c5facc3cc8dc041e.npy +03691459-32ce47d38aede60ed614b9a1d2062a4a.npy +04379243-83433f0c0a3801942eca57a2fad76f58.npy +02691156-21827b0be78dd3e17dd9ca9e282b9209.npy +02876657-f0a5f6d2cf8fcb72c12d8e00a78db6e2.npy +03211117-9fc580b2097a1d3beaa3086aec501406.npy +04256520-1b0432fd7b56f7e219fb4103277a6b93.npy +04090263-5f3487876c91c0b5ddd7320ddee77bde.npy +02808440-96777ae57747ee41ffca1588abe4e39c.npy +03636649-59e852f315216f95ba9df3ea0397b1a6.npy +02924116-d39202ebc7b025a012128d25485af84d.npy +02691156-854c2f430e7aa00f4d210d9468aedaf2.npy +02958343-c916164d0e5c667a75ef328fc121b1c5.npy +03948459-36e0d91630f7c958d4ca42bc1bef451.npy +04090263-1be1707593a15cf9fa9286f039319ff7.npy +03790512-5a34a535ced91869354ab1decf4fe605.npy +04530566-7a1754186937d247ad78ed9a26ab1091.npy +02773838-220f08ff0c1d2a4542282fc88db7886b.npy +04530566-e0845c8579c5d4acc3e7754d5a998758.npy +02691156-df8bb967a346ccc25e9e2656aff7dd5b.npy +03325088-dfd23237c9ccc149b362845c6edb57fc.npy +04379243-919b2b8877c90f6885718c281d7fdf61.npy +02958343-5089b134ef31941edacf4de272c1e30.npy +03624134-1e491eee214ee77eb71f7555d9f1768d.npy +04379243-64298fc3b7cb8171eaf288f952624966.npy +03691459-10d16ee9c9402e6df2e5d34c7b677bc4.npy +02843684-b6348429292d990be67195cc1ecf4787.npy +04530566-6f36c486675210cdd566d7f46e9a16d3.npy +03001627-53d88f50e3abc2888dcbe86402c7c15.npy +03624134-46723d416c8a27ba104aa0e918fc8fde.npy +04379243-268a263f41b82227f10f2cd5149de8c9.npy +03211117-288a8917e51c57deb0957d845ac33749.npy +02691156-969455251a1ee3061c517f0fe59ec7ee.npy +03001627-831ca4306245810435836c728d324152.npy +03325088-184fdaf0ea2fda9c5dc3653f8341633a.npy +04379243-68c76bd1d8ddd433dcfcef693e7ec696.npy +02691156-d74767519393a937f73e5bc170b7e2be.npy +03467517-b6f67c7088197a76f4b498e11fb60a4b.npy +04330267-be935d47bfa0fd025eb64c1003065596.npy +04256520-8a5a40fe10eb2b2eb022c94235bc8601.npy +03938244-8b0c10a775c4c4edc1ebca21882cca5d.npy +02691156-20f2a121d9dbbf9e98494085d68ad6a0.npy +03624134-1ecb37ea8f0c4abc20fc54d2500eb7f1.npy +04379243-13c8f06bf87c074f9b75b6346baf0c12.npy +04256520-24178c4efeadb8bbadd1969a2adc38a6.npy +04256520-47ad0af4207beedb296baeb5500afa1a.npy +04379243-3e915e96e22f15a1af9174ac65b8d24c.npy +04379243-ec91cae6576b5149484539ed1814944e.npy +03467517-ce5aa7d561bd83122d1748032da3d7b6.npy +04090263-192309e06577f893bb4594cb67b6eaa3.npy +03211117-e3d94861020f97eb37fe7bdc65e35547.npy +04090263-84a95f9216f5c3255d3426ee101e9f8e.npy +02946921-3fd196c22459cc66c8687ff9b0b4e4ac.npy +04379243-724b8cfc8c4b8e16300009db8b7749e9.npy +03001627-e984974d54645e8328c54e8f8953f499.npy +04379243-889654f30ea7b4c3ce84b253beeae59.npy +02691156-9daa49ab2f97fc14d85e5191b992b560.npy +02808440-768acba240b21a492beec56b24479ed1.npy +04379243-d41c8af82fe98a019fb4103277a6b93.npy +04379243-c826802d2a084845979f073230404b25.npy +04379243-4d24a0d4ed77db9f4b3c42e318f3affc.npy +02828884-bfaad1f9dadac9b6a385f05be5d65f80.npy +02691156-a591b49406ab0d2abbf3143b1cb6076a.npy +02691156-13f9eb29d699488a99eab31c7df6f5c3.npy +03001627-906608e3146548e6a4e733e4e18a6d05.npy +02933112-35faa6d255a474f3dde9018a607defc5.npy +03636649-e2343ffc39e5f4bf85a18a4e86f89dc9.npy +02876657-200b3f3d859c8677ad5067eac75a07f7.npy +03642806-95908e92aba3fb46fc588a8e4bb2f15.npy +02933112-bd55f9190cb5c9ea3fe047712e43e185.npy +03337140-75b534f907b9d89491c352d02061b3f7.npy +04530566-77d2d34922964c7b57c58fd0f9b1d74.npy +03691459-ccffe9befaec2d1c4ffa46d1fcb77f51.npy +03001627-e1092c9dfe55273876f83644d71a31ee.npy +04379243-c46135263f88cf68bfca5f90d2eb0e0.npy +02747177-d30c7f6073bb8565c8a06b09a9a18b3d.npy +03642806-51dad6ff8c00b7be288d8f1144f7979f.npy +04379243-3e51742cb382aa1f79b3e1be3524f72f.npy +03710193-cc208bd200cd7cc5276cc2218f09ba08.npy +04379243-4cd11ae56eba48684733824eae5cd9ae.npy +04256520-25bcc7d412b1b3f27713a8d3e281895a.npy +03001627-7114ef00fe68d053cccbd142483bf2e7.npy +04530566-d14c92a31d848b1371090852934fa2c1.npy +04379243-ddc6ea7906f28cace8e2c411e1e93d03.npy +04379243-24bfb2f2e403e025d5b708f09789d978.npy +03636649-a56224d991c3eedf77d8f08447bad584.npy +02924116-1e10538e90c43ff33db75a4ec21446d9.npy +03691459-c55edafad476d908d17058acd487e2f1.npy +04090263-ee01a3d156cfde95b6f73775a54c59c6.npy +03325088-721de72c2dd58fb33321831d2245cf06.npy +03948459-dc50408025d922eb1c81652b127a0ec9.npy +02876657-cf0a733f9a63f4f5664b3b9b23ddfcbc.npy +02876657-ed55f39e04668bf9837048966ef3fcb9.npy +02808440-5e9c7ef153807504a58a5ecb2008fd42.npy +02828884-87dfa3332d118867d0d69b51a45f7aff.npy +03001627-4b7cf20cac8f2344664b3b9b23ddfcbc.npy +03325088-872a7873bbb56f1958c88d30f502a452.npy +03001627-a287b508914a00a6857b1bfbb80503.npy +04530566-dc3336883fae5239d76134f29a265550.npy +02933112-a746b71bbbb56c93c59350d819542ec7.npy +02828884-d2193ef2753921aced98cca8f0ccd5f7.npy +02933112-243cea3dfd6619944b8710a3469971b1.npy +03691459-b7a6e59fe546d81cdb2e05daba43d6f.npy +02691156-f59470cae839ba0e9b2acbfd8323f804.npy +03325088-bf4dbc47f8688cf2b362845c6edb57fc.npy +04379243-c6442db6d5fc94a62744bf8869518694.npy +02828884-2e016658e44247bd2056b4bd5d870b47.npy +03797390-1eaf8db2dd2b710c7d5b1b70ae595e60.npy +03636649-b5c4331e5896bcec1119ad686ed3f611.npy +02992529-cb80f0eb9d3566da655b6157f54b4abe.npy +03991062-a5975549391ef2215d2b72e86737c92.npy +03691459-87d70f424653c8c9e2a6fc5932a88f35.npy +02958343-15f605c6fffea827e7436c0fba14b4d2.npy +03325088-b8e1178589c797e5da12673acac7d94f.npy +04256520-7e40a1af933a05a6ab610b0c94236463.npy +03001627-d9156f5552178de2713decb1a0563b12.npy +04530566-65577c66f22fd84d6eb9a4c3b55eb0c4.npy +03001627-94461b3e6212f63265b1b65ffcd737a9.npy +04401088-2a38116473099355498dffe5de12eacd.npy +04256520-7eddb52d83f3d48eee5580e1b1723da0.npy +04090263-334ee6c5bd30011af8edafa0d47e47db.npy +04379243-1e4bf6ab2b2be368614fa2de2dbe583a.npy +04256520-2f85863e90aae79240ef1c8b63a628f9.npy +03001627-4706461c517a755d4e6ea835fbc6facc.npy +04379243-d49d33a379000a8d4b2ec20c30ace65f.npy +03691459-552dd48f9a264d721574d21c0c95092f.npy +04256520-4dd014b6e5a87cf462158b7ee658e910.npy +02747177-b401be1a08b87882f4fb4dee5181bee.npy +02876657-abe557fa1b9d59489c81f0389df0e98a.npy +04090263-5e2661c632995b4e40c568d90bfc809d.npy +03691459-ae66dc3ecd9c8932fc459988e6a7eba7.npy +02876657-2927d6c8438f6e24fe6460d8d9bd16c6.npy +03001627-d388617a719f23a191d0dff7aea42471.npy +04379243-e21392ebcec0e7cb1a3a884dfddd1bde.npy +03467517-e0d1720034ed6333542e93670cfd32f.npy +04379243-edffc05155544431436e6787c76ef3f0.npy +04379243-72c957a020566f4bfca61b0bec17b8d3.npy +03001627-99a9e829fd4bece8f5f520af1365ee71.npy +03636649-ab999b20d88829d5efb94709f30ce0d2.npy +04379243-40ee6a47e485cb4d41873672d11706f4.npy +03636649-e20889cbe2d917787d616ef0c11d6a7f.npy +04090263-26c60364ecc5858c80c2e60c312b0f09.npy +03691459-da9c218b79205d489c4dd878242c44b7.npy +02691156-448ff32981729dd38eeecfc1f147b56c.npy +03001627-9e140d4e30a90721b459fd126141e9e6.npy +03636649-49cd0dd4d1c008edbbc7a6acbd8f058b.npy +04554684-74dc1a59c3585ed746cde67a6a1ea328.npy +03001627-79b65e898b52b197b11ae648ea92233.npy +02691156-4e4ae13865bf47f41adbb4c4e06ad649.npy +02880940-468b9b34d07eb9211c75d484f9069623.npy +03624134-67ada28ebc79cc75a056f196c127ed77.npy +03001627-ff3581996365bdddc3bd24f986301745.npy +02958343-6ee903e016ebbd66921cb81cb1632a5e.npy +04379243-7a7590d19cf8274dab610b0c94236463.npy +04379243-dd86b0fcacb9990914038d588fd1342f.npy +03001627-d2b334ad08ac9857c3cf9ae716575390.npy +04379243-6bf4bc4a845bf639ce65ba7fab42a621.npy +03636649-1ce3f06d80025d9528eb8d149efa4062.npy +04256520-c9ebc7c6abcc9432560dcae81449eed0.npy +03636649-683118b2740958303fe64ec32ae84891.npy +02958343-e300d58621f7d0e963d444e16188727b.npy +03211117-62188618e7d0b2f23dabafedd9562ca6.npy +04379243-d4a1fb16866d22287db09046a5e7a0a.npy +03001627-8b1af8f7f37c36bb4368753867df1156.npy +02828884-46a1e2560a1e96f3897fc31a9c059e16.npy +03642806-7dd0b4787a78a9b6ec6505914db06723.npy +03325088-5732785a362a6f0135cab19ce2dc6f10.npy +02747177-16e1950b2d507f532056b4bd5d870b47.npy +03001627-4b4773ef582c002b5bfd842976fb7956.npy +02691156-e70bd95ab764bc1b3465be15e1aa6a0c.npy +04401088-6bda193370e2c7e9a30edee0b4a86a6c.npy +04379243-421d60140736eb03d098fcb46b95c.npy +02958343-bd8654fbca233e41ddb8f37b1865d989.npy +02924116-3cec0247f726e9ee41cefd10ce5d6cc0.npy +03211117-600fd2598fd5761eb9099be21c212692.npy +04379243-8e5866a0c093f5a17eaeab1f0c9120b7.npy +03211117-e477ab5ea25f171172249e3f2c8f56f7.npy +02942699-cda4fc24b2a602b5b5328fde615e4a0c.npy +02992529-c06c6362fc6d1c9c5677057f93c3c270.npy +03710193-5449665fcc96c12175becd8a4c3f1866.npy +04468005-6c7a374d85da1ac0ec8621169acea877.npy +03001627-6393b49ccd72e8b312cef4e6ce7bea86.npy +04401088-a1c60f087535c7726fde3adc6768fe52.npy +03790512-7b58dca40a1e09dd393c2e9c64ac953.npy +03001627-47c540c2e9c3483ce79a6b87656a120a.npy +03991062-9dc765021f27a4772e079ea2858e15fb.npy +04256520-336ac1316e0d5cb7e6fe3612af521500.npy +03636649-bc218fcb647e7127984fb9ec7e40829.npy +04379243-f46c84466664f3162f023f89cad43868.npy +04379243-fc9f18e509b363fcac7bed72580dc30f.npy +04256520-b1d7bbccf07f38d34338dd5307c2e704.npy +03001627-u45c7b89f-d996-4c29-aecf-4b760d1fb2b6.npy +03001627-7275cb0572b1c0042725cbc5586c6d7b.npy +04379243-3f10bef75e979d83b32d32632cd702eb.npy +03001627-5974ff38b45265bb352fc7e973ba7787.npy +02933112-b154cb1a8dedb14345ef69cff7e6d57d.npy +03211117-597a278f80d04db46d3e11439c6c22c8.npy +04256520-2b8a9009d91dc09863d467b618e97922.npy +02808440-86cc268fa01fac6b9f4775ea8562d2.npy +03710193-d81d64c36914cce9252e123654a8206.npy +04256520-f157bee08e60f88ce6fe3612af521500.npy +02828884-d58239c7178651ed1fb7397472fde3e9.npy +03337140-33715bab747f569e4c3aee8e9d3a6ffa.npy +03001627-463fe7f155dd7279a7635bec8b4f9183.npy +03001627-709204dcd233483f242f861207c6d189.npy +02818832-359c25c700ef86bfb4e9891cf4a003db.npy +03211117-2f3bdb6fbaaf9e60eeb8d422649e5f2b.npy +02691156-e88ce288726375ff87bf26680c510802.npy +04379243-9b4acfe0ed67b32a63848853b5b7618f.npy +03691459-9165f1681f4c5df6f63ee8a34069b7c5.npy +04530566-5f1956ad3dd52a69d3a2c7c88c74aa63.npy +02828884-78f68a5f65ef88482056b4bd5d870b47.npy +04379243-9130392b20b977813c41e9c62d62dbcd.npy +04530566-c84cc7d62a9112f7b9d24c378f086d93.npy +03001627-8a53c692453e7565c1fa182c22e95706.npy +04379243-e5140547647bee72490ad276cd2af3a4.npy +02691156-aa0802b8b940b7222296d88107d065f6.npy +04090263-98205844a3267ac6423adc2e6f1b28d.npy +03759954-63f5ef382e8bd0e0727b9c4a6cf12d11.npy +03046257-8426dc58f4b4d94bb43e6e0f22ab9ac9.npy +03636649-1833ac3f2c14e6bafc26f53456c58834.npy +04530566-4d9a23b8b75a412c82fc4dc31c839439.npy +03636649-e34d17542b26773a84aed1cd93567b2.npy +03991062-57a0bb44f5a68151ffc6e457221b9271.npy +04379243-462d928e94689592cb2a965e75be701c.npy +04401088-496270f12655bb84e38ab39b0490e043.npy +03001627-26d0416a064d23f1f9aec59741c69cf7.npy +03211117-792427e9b92c4de63b1969d0afef691a.npy +03593526-ee10db30b91b9683f9215f842248bc25.npy +03624134-2afaf2674a25fd16d444bcd674952301.npy +02828884-690aa4622c4d3246ea1bc0d82403165c.npy +04379243-49f7fadfe67b54c478b3bb39df25d28.npy +02808440-52160c130b4c132244221bef0fa3c36b.npy +04090263-31a0c1adeefa95f488b9635e60aa884.npy +03991062-1cf2f201bb36708be053f54949c9bf20.npy +03593526-7cd890d57c3d5705a0c6f54ff9ff2ca5.npy +03337140-76881763d22c637ee7ecdbe73ef4323c.npy +02828884-597cb92a5bfb580eed98cca8f0ccd5f7.npy +03467517-67f24d338d812f8049e3c7e37819c26e.npy +02691156-3656c9bbd79f6e29f6439977935c2784.npy +04530566-c1b48711737649616a740b8023d40f30.npy +04379243-c9857deb88989a67b5851007eadc6f74.npy +04460130-46a090f0bd14180bf1a48a667d61ced6.npy +04379243-ebae52c84acf994e9e4da01b847d5cb2.npy +04379243-d1e9a83ee99b48a49856fa70a578baeb.npy +02958343-98fa551211d228ef6a089bd459bbc1be.npy +03001627-6bff9667fa51178ce9930a50732a44eb.npy +04090263-59159483028516c55de49355f870af76.npy +04256520-17a768e79ba434b91ca25a4447d3477e.npy +04401088-452b924abd2ece2d58932236a22029d3.npy +03001627-d7e5de817d603fefa123ce0dff5bf4e6.npy +03001627-d1f76ed6072b9332ee558d9fec5dbe41.npy +03797390-159e56c18906830278d8f8c02c47cde0.npy +04256520-4ba2ad7525a7da6c4daf5898cf18a390.npy +03001627-9d9992f7da4c888c7d3c9de9415fb224.npy +02992529-24d22e3257420bc2b785a4ac4a0dbd73.npy +03636649-fc6ca834ee897c2be13f009579d33764.npy +02828884-7f67934afc4f95b014bcc66f599f3e46.npy +04530566-544ed8713bb6b697846f1b9d68a7eecd.npy +02691156-cf61af3c52dae1e0651e8da9cf70afea.npy +04090263-37681c6cd8bd88d1d04b05b0f20a897b.npy +04379243-b95e59bfc90c4a0a266a96e416bad065.npy +04379243-e705fde0d14090d05f2733e561547b29.npy +04379243-827166feab020929811cdd52f3d07553.npy +04530566-c52ab3a375bec0baaff407511d7dfc96.npy +03624134-3dcaa6f00e9d91257d28657a5a16b62d.npy +02691156-cf93f33b52900c64bbf3143b1cb6076a.npy +03001627-753452a3a8f44bd38b69f185154696a3.npy +03337140-b766d5783ca2e1ce4c3aee8e9d3a6ffa.npy +04379243-7960127aa69c0447492d9da2668ec34c.npy +03691459-8bd1d73922ebc098627a66821130f814.npy +02808440-b2a500b97b21c4eeb6adb81b8de263a3.npy +02691156-5c7ef3d5de5ca9a1ca8607f540cc62ba.npy +02691156-ecd761d36abc0fb5250e498b1554a6f.npy +03001627-9d443b06a03742b9bf6931cd2a81bae5.npy +02876657-dc005c019fbfb32c90071898148dca0e.npy +03991062-c03bbfcd33f310155076fe09061f1a7a.npy +02958343-19d49c8015948b742d60c8689a64d7a0.npy +04401088-6e6d7c2ffadc2fad2fffec7af390883.npy +03211117-bfa95d845671c54c26d3b1eda72fa17b.npy +04256520-cb3bb5481f214d6bf51f77a6d7299806.npy +02958343-8fc3cde1054cc1aaceb4167db4d0e4de.npy +03593526-e4c871d1d5e3c49844b2fa2cac0778f5.npy +04379243-9162c1cfbd1e42db9ccce4c6d5bb195f.npy +03001627-fcd25e25dfffff7af51f77a6d7299806.npy +04379243-97b1b1f674df7fd08d413b6cca5747d1.npy +02958343-6ee1f28244a72fcadad3ef3f3ebed150.npy +03691459-6bef36ab570225cae7d74840e6097218.npy +04256520-45ff5f465a6a907488e82c4bb71ec6f6.npy +02691156-99c0ee178c5a4dbd8d8a353a30b33dd.npy +02958343-2ab27beb8a37ba37ac00fd1150223027.npy +04379243-df2d80be5033d200e2af4d98190aea8.npy +03513137-91c0193d38f0c5338c9affdacaf55648.npy +04401088-625e2b043a61452b80d5f0084d375f75.npy +03046257-bc66e7f0d88274ac58308ff4b09ad476.npy +03001627-66312d6c06a24772a8e75a1a0cf7490b.npy +04530566-d76ad4ffab09bf27f3e39f2e17005efc.npy +03001627-e68bb6f55e2454fac7f1f7c0570e288d.npy +04401088-d0c5bdc45a59669a39a4971adc53c51d.npy +03691459-dd3f884d9b5b3c0de7b7e97e5332a9cf.npy +03211117-9a8487c37ea68b49e5a14a547274f040.npy +03001627-33ab50198c84645ef91663a74ccd2338.npy +02958343-a44fb2514e9ab51f79138cc3f6db7577.npy +03001627-7a617f62ec5bb2075e7faf7f49c2907a.npy +04379243-3f4e117f6172555bd7691f54dfc57244.npy +02958343-f36ce0c0cd0cfacba7742c4ce47c2229.npy +02958343-de78fc3652596d3e9ceaa43540dc0e9a.npy +03211117-7a89e5ca49a48bf6fc22823f73266007.npy +02691156-4580804c798365a094a6f19fab16fe62.npy +04379243-2d0f4d977d61aecf89c33ded8af67808.npy +04379243-52ec1d25f2d6aac661d4e2b4b8b99e7b.npy +04401088-88c64c14d4b6ae5aa7636d58d56f8570.npy +03001627-d07675c29d0bd535580b0de4af0eb56b.npy +03001627-7ae6518311bf2f66e1a0327ca4c4d5a5.npy +04379243-f82473746c17ef04f2baf097673c64e5.npy +03001627-dfdc94c658a98c79627fec6651ed13bb.npy +02808440-29aaa8f337632ec125fa9990176f0d5.npy +03001627-7fbe0c40524fd37465ba78ad9601cf1b.npy +02691156-a162465f9664d92a94eaa56dbee38b5b.npy +02808440-302618414a9991de3321831d2245cf06.npy +04225987-55da5b37f4fca69947d4c8697a40872.npy +03001627-3de9a7a40851ceb971a782a4379556c7.npy +03325088-49a6f4ee7fabf08cb362845c6edb57fc.npy +03001627-d62051da1ac1ef21faf575cbae5008b8.npy +04256520-e6cc5fa521f970874c6deb9ede0648df.npy +04256520-68fce005fd18b5af598a453fd9fbd988.npy +02691156-6f96517661cf1b6799ed03445864bd37.npy +03928116-e8f207efd9bf825bb9683248e4a5465d.npy +02992529-31e8327ffa4ba6a87790cd6f6e8952aa.npy +03001627-99ae1b3f970c61fd5b56aadec5c0be6b.npy +03593526-dece4e1eb0d2f202150a45ec52bcbd7.npy +04379243-55b586076edb416ea169b9ecd9e046dc.npy +02691156-4de653411d132abdf1e2558bb9cfc329.npy +04530566-cdaff2fe98efb90058a8952c93ff9829.npy +04530566-e70fa867da6276efa65562f270f71c81.npy +02958343-d9ee9de8527d309cc0c0cae12126488.npy +04530566-bdf142a3fdc97a23af018ffb2ed4ff85.npy +02958343-bb1afdd76bd9555abf3af70ab74680f8.npy +02933112-70b15dbfed77ad2d4da5feafe6f1c8fc.npy +03691459-b06106540932feefbb9b205a4c97698a.npy +04379243-37f684f64af84541609fb05dbd8681bd.npy +04256520-5d27c5cc1395586c66eb0dcc2b2e2221.npy +03691459-f8aa418d093076c4c194eaff7ea54233.npy +02924116-29c7615460f943a36ca2b6e5474aad11.npy +03211117-6eaba6819fa9b07a37a807a435008662.npy +03001627-fa7f42b395c3cfce520ab6214a789faf.npy +03691459-a55295b8538238ad6ab2ad957c1db573.npy +03001627-fd3d59ad4d0ddb44e15475f0b1eb22aa.npy +02818832-3797bd46f01466f8c3bd24f986301745.npy +03636649-3bd2db092bede98957e3b0a0099797c.npy +02876657-83620edd3ecbce0de3bf00cc25b4223.npy +04530566-35857ac61388f9fec2912ef1a1302821.npy +04530566-25164e1af059f8507129983ba40a1750.npy +04379243-8438555826c5a19079368d1198f406e7.npy +04256520-80c143c03d0d7b3087752c136d371e3f.npy +04379243-3222d3e3c90f4a3238b3634f169dcc74.npy +04379243-52989e315ee1d3839ccce4c6d5bb195f.npy +03001627-486863b7fbd169fe67903707764646db.npy +04460130-8af5e20ddd4ac314d3e8c09edf9de80a.npy +03467517-aa8f6fbdc184a732cf45555a18e7351a.npy +03467517-85bef84a26a91bff9ce363b13bdd195d.npy +04379243-3ab1e5d4f889f8f1cb7b25164a43bff.npy +04330267-c70176038a545f3f9a6c869309041adb.npy +02933112-92aa3075799e275a3fe047712e43e185.npy +04379243-f2893a87ec37f8b3781cb4570305e329.npy +04401088-1d53adf8f82d223db0a79e28606cb167.npy +03001627-fd31b09de6b3a75666764c53f1bb4495.npy +02958343-50af70a51a2db34d777b3c68b2536729.npy +02691156-eb4396ab17012b3c9a6e43b878d5b335.npy +04379243-336c81a0546a4ebaa71c812e027f94d9.npy +02691156-71e9496397481233a8cba409c4409ba9.npy +03624134-cff4276a47f1a4e29d5aeb7097eddbda.npy +03001627-459a01afd2d5d4225267ac530b1d88dc.npy +02958343-a0ba66028d22cef6975be43df8325f3d.npy +02876657-e37cfb42fe03034842ab55d7ba3461f.npy +03001627-88058de808184f3937b2bb75885cfc44.npy +04379243-6b9b672041acc540e61062b89cc2de3b.npy +02691156-3c6c4be95d2dad2937b25178f54477f4.npy +03001627-9518130aa4876f146ec0232dc7739bc0.npy +02958343-f605c1f4d1be8d00f63ee8a34069b7c5.npy +02691156-e9df546c1e54af0733d72ae4e2c33411.npy +02992529-ee7d2d986f2c989ac66dc18b3cf1700.npy +04379243-f2bca089598c94f71d246659f49791a1.npy +02691156-86f2c71ef3700ca2cca362d2a61f33e4.npy +04379243-b685208ccf38786a6f1e07a56c129dfc.npy +04379243-1aaaed47c3a77219f2b931201029bc76.npy +02808440-7e32602a20e478ddb362845c6edb57fc.npy +04530566-e5c3835b9f3ae3634a27b0b4657ac8b5.npy +03642806-33b46231ff0ac2e46c8f71c9d7a79dc1.npy +02992529-92ec69548761efc61f74e5d5bf005208.npy +04256520-dd6f44f5b788d5963d6d3c2fb78160fd.npy +04530566-f81ae8a4452ad290aa9bbcb26e1c5ea7.npy +02871439-1e95c521f70972a2f5758e5628273c4e.npy +02691156-3cdb3a166a13e44dafd477f714c68df9.npy +03642806-606f4b61d81085d1adbb6cf5d72fbe37.npy +02871439-962a500ebd7175dc702cb0c2071c40aa.npy +04379243-7327bdbb165b8d034761d0d07b9cb991.npy +03001627-a113c1f24b803d37bc5a6eb75687367.npy +04530566-b1dea53e9995486c1b4a375734e87fc5.npy +03467517-f288cd2146b8f4c1f0e1c0df18936d05.npy +04379243-c103c0f93c690f5067dc358060e3c47b.npy +03636649-9cdc3191bede2d0eef3a2c64cef919d0.npy +04379243-e9e47d6b53c915f3e12186cc8c5022c7.npy +02933112-d6523ff3e0acb768490ad276cd2af3a4.npy +02808440-e34616db6be63a881c17aef130ed6213.npy +02808440-7c9e7480ab034225dcfe5e111166f221.npy +04379243-f3164e1781a296597f6f00dc967c386.npy +04090263-5005f42fcdf718e558f55d364b38127b.npy +03211117-3c495b3a2c2af890acc9692a1d1e7dea.npy +04090263-e6ef0c7bb7c73e4bad4c449f974dc221.npy +04379243-f7ef48c7de69ae03cea3bc3a9009695.npy +04379243-b9943f2962f4ac9840ef1c8b63a628f9.npy +02924116-b9fe8bae926d5cd8e5a1c12b50998c10.npy +04004475-70dc97e3f5f7465e9a4c189047192f81.npy +02958343-129921679aaa3009e44df9b78a00d12c.npy +04379243-13c680c1fd4d1ab4bdaed8eb424ecfdb.npy +02691156-7b3bd63ff099f5b062b600da24e0965.npy +02691156-b4de0e888e562f40873ec74c119307b9.npy +03467517-8d9fa6f14ab6bb3293f0194265a9746c.npy +04090263-bf89af91f6f699a3b758d4b2d9dccb00.npy +02924116-6f2436c52c0a78947d2d874548544c4e.npy +02958343-8aacf6e90bfa4610becf71e2e014ff6f.npy +02958343-2c407d592623011eda2ff65a113288d.npy +03001627-764abaffc5872775f0dff71ec76b46f7.npy +04379243-6ab805062d5d945d53e946fb2184f0c4.npy +02958343-6ae21b4b5aa92db4c79d3cf109867c13.npy +04530566-6f5df8d6d0d77039be286ae2fb79c470.npy +04379243-cc2a9dd5dd6fda66e02a8ce45e810a15.npy +02808440-1257e60da04ab350b022c94235bc8601.npy +04090263-e1ba58d83c23c6d1fd4f49e0598b199b.npy +02828884-b9263e32f3d7a9ff81faebbdea6bd9be.npy +02828884-aa88a7bb135e074e2056b4bd5d870b47.npy +02828884-42be414abcd4f66113c01fa2f350f6d.npy +02958343-55e0897c0ac089a6da5cb3be8feeaadc.npy +04530566-461517433312704299986cc2d8a2c28b.npy +03001627-dd0e48963b73476f7fa93550ab8061c2.npy +02958343-e14a04dd31112dbcafe1d4530f4c6e24.npy +03636649-71dffdee89efe07cdff00b2637ddcbde.npy +04256520-207c81a9bbdccbb8e8058cf23f6382c1.npy +04379243-175b6c97de52974a8f27e336794e60cf.npy +04401088-ceb47998c0ffa704f1cb19f636b1c2bd.npy +04379243-27a463aebb289175f51f77a6d7299806.npy +04530566-876a4bea4fc35db067fd6c1ab7f8324.npy +04379243-4cc695f3d582116fc655d08d986ea26.npy +04379243-14c35137c3612fd0d409d3400adf2d96.npy +02958343-c314a4de4aeffc0854ae303007921fb6.npy +02773838-39381a2718d2a1d4d5f008f38a566dee.npy +02924116-42bc15ea6374ca6652470de2774d6099.npy +03211117-65d100a427b8078de1fb8c5792a5768b.npy +03001627-2ed8d45343a442097869557127addfc0.npy +04256520-1cd54be30a2aa4effe3e4e51c69744ad.npy +02958343-1feaf720692bdacc27a1a7fdc1941283.npy +02691156-6cdc9acb022b2d7d98aeb62a3dfc01d8.npy +02933112-cb4234b5106ee84dfba786d6c256035b.npy +04379243-12e1f83d5fb0af107d0cdce142e729b2.npy +04379243-64e65f881d846d9235836c728d324152.npy +04379243-80b2eb0e500bca46f3412e3273fc1682.npy +03593526-9bf9f7dc9f7160cf82db9fca4b68095.npy +03636649-e515076a09191d075fa6da97b9eb4a2f.npy +02691156-d5b08d1355502d325f83a2299c09f64.npy +04090263-823b97177d57e5dd8e0bef156e045efe.npy +03001627-1b6c268811e1724ead75d368738e0b47.npy +04330267-8b3b891df4dfbe2d41965be83b7745a.npy +02933112-195b0fd745df898d86d53ab0fe94e911.npy +04379243-79e7911ce615b63078831722644c29c3.npy +03001627-1c08f2aa305f124262e682c9809bff14.npy +04379243-a882ada8bc14e42080d6227ff9b21190.npy +04090263-42b7e8c381cb392740112771efe22586.npy +04379243-86a7bbaceee66eb36b63d78a2e71a26.npy +02958343-3264f78bfc3bc58c9213ea6cb12e4e3c.npy +04401088-cb9e8cd0a29cbb26b6d41c42f7ade8c8.npy +02933112-dca6f5a582517758eab2bd7322386ffd.npy +03642806-fb641fe28d0f5e73d51fce576fbd4600.npy +03691459-e270c383e0d9c8e0ce029fab54b6cfbd.npy +04401088-ecab7b7bfef8d7f423575ca8cfe7da9.npy +04379243-44a3f66a0a40f21119fb4103277a6b93.npy +02933112-134055516ed892913ba1c51b82b58419.npy +02843684-589760ac1324fcce5534ad7a7444cbeb.npy +03001627-11506b96d41f7d3dd7c4a943f33e0384.npy +02958343-3cd83324de4a2fecbecf71e2e014ff6f.npy +02691156-707cb24ab99bff07e2aeeb16e93626f.npy +02691156-a6693555a4c0bd47434e905131c8d6c6.npy +02747177-9e2a1751b9129b1132fd0b3f17b0d6c.npy +02958343-5a91741d3a0ca58cf200a72c9245aee7.npy +02828884-117f0ee18ed91ea2d4d8765e3910f617.npy +04090263-5ca2752062ddaa0e21fa7072ad9ba0ea.npy +03001627-c69ddb5376e22cb8c4e8952b27b5f370.npy +03797390-5d72df6bc7e93e6dd0cd466c08863ebd.npy +02992529-77817771db0788d3241d076ab53023c1.npy +04256520-ab2f0f582e3fa5b1780c9f3df5b1ce52.npy +04379243-e5aba07854af35d89e6a137715910e1f.npy +02958343-1d4eaafea3ae8303ce94fde2d6224f79.npy +02691156-c4433144c905ad0b71d03b466c72ce41.npy +04256520-d8087961b06c9f7d4b3c42e318f3affc.npy +03001627-56cf253d14abfeb92c528d33bca1ac2.npy +02958343-fd3b75f7f1e9172fb6f657757c95f74e.npy +04379243-bbe30ffa9234cb3af268f6180933aa3.npy +04379243-658138c87c9184f279368d1198f406e7.npy +04468005-2a89a00cd90ca5b844b1f4461f7a073f.npy +03325088-8267bf624e6234f776c18e71fd49c4dc.npy +04379243-7135fed6de70df8d25fc264b1d80bb27.npy +02958343-8feac5dae8852d2e175f8ba1fccc4d0a.npy +02992529-9728d42d4de74ff69ae0ec37bea5341c.npy +02958343-18ff13d7f181e7625fa21635eac9e4ed.npy +04530566-57b3fb45b6c484c8cd9052ebaae01826.npy +04379243-97661c4a58929ff2d9886e45007f4f88.npy +02958343-cac12f8e291f3d1fe43409f9be327bbe.npy +02691156-6778c46aff633538c0676369cd1d063d.npy +03001627-2364d6cbee1425fdc3bd24f986301745.npy +02691156-d0b7060229617935d2a4e6ac398c976f.npy +04379243-392b7f2c8b72ba54d05b3855d81c2ed0.npy +03001627-c88eb06478809180f7628281ecb18112.npy +03938244-ef5ee3879df49ce7f5b2cf5056edd6db.npy +03001627-54bdda983ea87dc9d727e9f790cd597.npy +02924116-b478069e03e9bc07583e351622462335.npy +04379243-dc61d1287fff3ebdd2afe8d5254a0d04.npy +02958343-6e5340cfe979238998ff545c3abe3e44.npy +02808440-2c217197bee9dfbcb362845c6edb57fc.npy +02691156-9825919cffec79701944f01d3ab2091b.npy +02958343-e21ff1f90750ab24b8085998d32fb54.npy +04379243-6f8f9aa1ac705db9fcbe4e14ff0c4707.npy +04379243-cb48a015b203b3084acc8059dcf0a054.npy +02747177-c3b31dc8c48265ecfffc97a61124b1a9.npy +04379243-39dcbf2d99d0e7e778104ea7bb00d557.npy +04379243-e3da34a62e53689e82028a475156419.npy +03046257-c04f2df69acd7361bebd3c0c0c70fb03.npy +02958343-c887bed724f4a30c31d6c59225b395cb.npy +03636649-1833ca8ab16a7b7a43448fccd73e2957.npy +03001627-77fbfd2f194ed73975aa7f24a9b6003a.npy +02933112-15d3297d200f8979c59350d819542ec7.npy +04379243-372a6ff9847c899bfdb026c58bb97e2e.npy +04090263-6bf8c32f62fb38bce1f2a1daf140ac9f.npy +02691156-b77aae4fdee662f487dedd9dfc0f1d4d.npy +04256520-c81d3992ddcf2fb41b17743c18fb63dc.npy +02924116-bc544e6a141e26227c0e7feb0b8d987a.npy +02691156-885b7ba506c9d68ab6ecbbb2e4d05900.npy +03211117-9727d690fe514475ac5153554deeb14e.npy +03001627-3b342f2ef792ff6a6006cd11c597105f.npy +02828884-9f5ae162a075ec741e85d47a2a5461b3.npy +03001627-a272771d6e9a29c2f4eefa83fb709ec6.npy +04256520-556166f38429cdfe29bdd38dd4a1a461.npy +02958343-6a8058611e45e7d243ff4cf09319bd2.npy +02924116-2f1b2510d1481e9573ba5c85a4ea149f.npy +02691156-22d0561f06900e165140beb2199de2af.npy +03325088-b6a1fb06d6658d30c36fb70296e45483.npy +02933112-b99b7673b0927283b1732c7d45a02ba0.npy +03624134-681cb407b784758b74d6554e3155d415.npy +02958343-26e2b2920a2330b2cdb8ce1e61248143.npy +03001627-2ff12e3a324071c0525a3d382a240768.npy +03624134-43ec2092d43691b4d7d3985b6fde9645.npy +03001627-a69c999cd76e29862f8c68dc62edc38.npy +04256520-83ce58add39dd471d314007fddce52b0.npy +04530566-597975f72770523eedb8bbed3955f432.npy +04090263-fb9a94c179ce70c4561dce3fe08634b7.npy +03636649-a500dac5ab226476b9445129e5607c02.npy +03001627-4363eb3e65ada91ae3f7a74e12a274ef.npy +02924116-239459cc296a1b4a995425f067333fd3.npy +02876657-7984d4980d5b07bceba393d429f71de3.npy +03001627-6fd485a2345c3dd69233bf560301e53.npy +04379243-413ceae95ebcb6b5707cdefe012d0353.npy +04468005-62f8ee99e2961024834b1a533ffa0490.npy +04379243-4cdfd605352adcb0da13974b3533fb59.npy +03207941-4442366563c116fbdcddd0cba5e9fbec.npy +03046257-22d83db25a203f8535208cce48b17170.npy +04256520-ff51b4ea697e7bd2a59fc0a73ebddd23.npy +03797390-513c3410e8354e5211c7f3807925346a.npy +02958343-8545a6862135379c813e8e6859b9f2f6.npy +04379243-6b5cfd0de413ce8841b160b9adc112fd.npy +02958343-1d82451a55d19cdd711f9e3a79a13dcf.npy +03691459-c37c230e15f8c561ce029fab54b6cfbd.npy +03001627-6333b3de61610070cb443b1c1b54049e.npy +04468005-367904ef57b82d848be7c8c5fdb9bd6d.npy +03001627-23af2a09ca2509f817dc12307fee9432.npy +02691156-d6b4ad58a49bb80cd13ef00338ba8c52.npy +04401088-68376369681e50847e814a763437cd9.npy +03001627-c59cdd1537bd75ddd0818327fc390a5.npy +03001627-50e97407fe2f7ebaa8135ec53db502ee.npy +03001627-1f343169e6948a2a5b7d8e48ecc58356.npy +02924116-22509148f79b14e09afb67dd284d342.npy +03001627-639e40029ef06d6f7e67c36deaaa271e.npy +04330267-f4a1b9d53784e55682b4ca3750aa2fb.npy +04256520-50a4aa069dcd171937b2bb75885cfc44.npy +03991062-b036923580ff3db6eab2bd7322386ffd.npy +02958343-6f1888091dcf4ca550577cf04f3bf74a.npy +04256520-3b7f2867c3d56290267536df1b0cc6.npy +04379243-e460f8b0797b44b06a20dcde106482d4.npy +04530566-507e097913d1364bba2dc6b0ec935a93.npy +04401088-8b08eb5ebea05e49a3ed2b429444c197.npy +03467517-ae52de8945d1626e79138d56f2e3aef3.npy +03636649-8937a2d361775c68aafd61baec633e88.npy +02691156-c5e999752db444eb91a464c5de1b632b.npy +02828884-691480901ee9f047ad5067eac75a07f7.npy +04256520-3319a9b24416ecea7ff6ace05b36a5.npy +04379243-5ba5f9648b50ede83918f23e2305ede2.npy +03001627-b709b41d6bafd77480cef45d94d1481b.npy +03001627-d6e0a95f00c7af6fbae0ffb97058b7cc.npy +02691156-f3e2df468c15795872517bb0a6b4d3ef.npy +02992529-71240556952395e0925bda4660525f97.npy +02958343-886246c286351bc6cc010a80df5d3c87.npy +03211117-6e26dd3afa4eb0a889cc5332e945f058.npy +02828884-77ed241c90b88a189f197237213064cd.npy +04401088-bc301249d58b89b638d913262f25e96d.npy +02691156-4f3a64164fbe16f54c2c88971423d0be.npy +04256520-aa86df339042feeba4d9f38918617d27.npy +04401088-5ec85395159a335221844676433a0aca.npy +02958343-98a4518ee8e706c94e84ac3ac08acdb2.npy +03046257-fac633a56e88786559d14889fe22f10.npy +04090263-280896ad10aa1272ba11c8c9c0c3770d.npy +04256520-7a6c2247a36d93b6f4553a0692c9821.npy +03046257-fc5e57ba9bade79a86a499d1a4d80ea4.npy +04379243-cb31b6293506eb639a3528690d225ee1.npy +03991062-4d054c0a0c2fd8e4503adffe35460705.npy +04379243-80a2c69d8ca29bd136b0f2a1430e993a.npy +03001627-be50a399623910e1fd03f420a0b8656.npy +03325088-5978d6e26b9db10db362845c6edb57fc.npy +02747177-e6c0e2578876d6fd808bd51049b82b48.npy +03636649-5849d1a237cb493c659dda512294c744.npy +03593526-90c112fd862cfca1cb497d0953a32f5.npy +03636649-859182efd11b40669018dc7bde518d9.npy +03001627-a7dbbe66942a7b7c40ef1c8b63a628f9.npy +04090263-a8e185dcb791be07ebf69cf03ff6f737.npy +04379243-a5071459f9774ff43215fffb0cc2c59b.npy +04379243-2dc57230d14506eacd6ce29440b718cf.npy +02773838-45f56ad8c0f4059323166544c0deb60f.npy +04468005-61a269d35f68a189ceeb72b524f3e0ca.npy +02691156-893c03e02dd0e1ad7d64cad20089f027.npy +03691459-5584bebdc80ecb42c9d5b08933b9e0c1.npy +02691156-7a80f3950b5e31f6b0d51feef5761dce.npy +03593526-b20ca8a345790b03d3dad974dc098fa1.npy +03001627-7d0467dcbd13505f2314deb821327685.npy +02933112-b30ee0cf13247fa7f51f77a6d7299806.npy +02691156-934b1ff5cf72b25c4310636931b68fdb.npy +03001627-4362e715455f42ba9b9f2eb77f5e247e.npy +04256520-36a6725f30a73f0e91ffcd1d3522e1d6.npy +04379243-d91c5659ba4770b3650590f03418c5e4.npy +03991062-2d815a9139dc24e5adfef0837ef69723.npy +04256520-85bb2ac1c8896881837d598c1c392d83.npy +03211117-4270cebd8ca0f2593dfb5aeeb86be115.npy +02924116-ea4feb09b8f4c7be41cefd10ce5d6cc0.npy +04256520-8981c0ffae1af00a50fc88ed745bdb67.npy +03211117-42fe49800a1e65d18a6b1cf8170af1b3.npy +04256520-b7cd67499b36cf60417a8f1d2c94eaf6.npy +02992529-8ec3b148b8c608a0562c671ec5000f23.npy +03624134-a385e6b7a1953838a1c6ab435d705f36.npy +03211117-e42fdc1419328bd7efdd13124d5ebc47.npy +03991062-fc7ba0ce66b9dfcff155d75bbf62b80.npy +03691459-a2b1f43ffd80d53aed46d95e646228af.npy +02924116-c97f1811bd4104e652470de2774d6099.npy +04530566-b998ce1c2a335d80868bf275e08c687.npy +02954340-8338e10954ae6c5296b84415a3f1393b.npy +02691156-dfa36bffe436a98ee0534173b9189765.npy +04256520-fed8a89a89c96271490ad276cd2af3a4.npy +04256520-8243278b0b5881fd41ee82033240ca28.npy +03325088-2a7001af4f018827d86a78ce9bac042d.npy +02828884-aec1143f9e7375846555a8578c9b250.npy +03624134-d1c757548ead4a4d8d03ca4865da5b6.npy +02958343-6188f5bafcd88523215d73d375c978d5.npy +03207941-85f3f3bfec4b787814b35a7d7cea7130.npy +02933112-d89866af0e191e40c4ac7545c4775b33.npy +03211117-46c594660d9fd584c8ec06d23612ae6a.npy +02691156-750000e25d4078f64e61a0c2eaaabe87.npy +02924116-6b5c172c49f15064e550942ea36e5443.npy +03211117-542ea1fa89d51f12dbb15541d28bf6f1.npy +04379243-c5b83c681c085f2195493ccf8f26ab2c.npy +03691459-300d579cb4dea9338cbc76a30015552a.npy +03691459-b859938280d0c7346583871b5c274818.npy +04379243-d3a72603f65b921b391e4d6c585a697a.npy +04090263-5fbdc4c221b31d5b93153dd7e0ee121c.npy +03337140-a4a939a0bd8f8cd9492d9da2668ec34c.npy +02747177-6d21c75bbe308322513c73fd461b230a.npy +02924116-4faf2b87d20ef1d6ca2b6e5474aad11.npy +04379243-5f31ed4efc21b67711a59b122fb65ee9.npy +04379243-e222abacac76f2a5470d3ca356fc4190.npy +03691459-70d2fc496ad0da4aa7f1b033d01e1364.npy +04379243-8f440a7c0e2af79f3ed0ffd59feeec00.npy +03513137-50c322394e1587c54e5e6ac3ef6bff73.npy +03991062-5dc2fd41c59a87e1a2c59a4d90e63212.npy +03691459-cb320fd1f48f60d347e20662b9cc792d.npy +04379243-485b69363fa53a5ec35131da26f8061a.npy +03991062-312b2a3cc205857ccebb4bcb108e5022.npy +04379243-c1d44782ac45d6fe3671949e4f99cc76.npy +04379243-b77556086eea0ab181187d9890753294.npy +02958343-24b9180ac3f89ba4715e04edb8af9c53.npy +02958343-998f600899c76e4583653a771e25099b.npy +04256520-e1fe7e3d2dbdfda9bb5bd941c6665c21.npy +03467517-ede91ce18b53368484d922f11bc5db6e.npy +04379243-b62d45745434ac46c4cfe384be4426c3.npy +03467517-de9ca0c3e32f907dcb61cf5d9c47c2c7.npy +03593526-c13437979b41c607cbcddf7f55015a5b.npy +03211117-b47b05891c5161189722ef9ae1c74e1.npy +02880940-cda15ee9ad73f9d4661dc36b3dd991aa.npy +02958343-42ad4b456bb964e1d57c4849288ce494.npy +02958343-43be650d6fd7468fd9952f9e00a53f0e.npy +03001627-4b785965d54454a4e82cbac5cad4b7d3.npy +04530566-de55eb89c357cd5baff407511d7dfc96.npy +02808440-f7db8bb845d6024e7935a3238f63108a.npy +03001627-3b2c9428da926e939ae03736d955651b.npy +04379243-33cb211cda607e9b922752cea2acdd17.npy +03691459-58c7ab29b2cb73171e652fa812161367.npy +03797390-f09e51579600cfbb88b651d2e4ea0846.npy +04379243-f472e9e63984b443f155d75bbf62b80.npy +03467517-977d172a08113bdc1082f2ea630bf69e.npy +03790512-5742426c4c9fa2e4b37378f3c85478b4.npy +04379243-1f239239d1039d60ad8e5e47362bc281.npy +03001627-5c9d582488732ee0d7f7a4c4609b0913.npy +03211117-8798383e9e4181d3f4c39a35147bf949.npy +04004475-1773dafc24ded61cea3aa8137e136b5c.npy +03211117-47cc124678ef84c53bb4a1304fe504d3.npy +02992529-45301b15dce2724e483a0f6665d9ffe0.npy +02828884-5a0f0d22870fc83b2056b4bd5d870b47.npy +04530566-ca586d3aa941479ed95226c21abfd72.npy +04256520-4a7cafc9f91cde86200f88c4e37ac5ad.npy +04379243-dc868ad981c23d22f91663a74ccd2338.npy +02828884-f21333a7141e7fbdad5067eac75a07f7.npy +03001627-570ee99e247c6cb0492d9da2668ec34c.npy +02958343-7486c73293cb8af3175a3b42530b4c51.npy +04379243-6daca3df48c0e8491cfe337d09cb7c35.npy +04530566-6fd433c69f9c498a12d1578498a3b488.npy +04379243-caf7f51add1284ab7ae016d7bb06fd0d.npy +02691156-9a007813a38638c379a04281ec8c6618.npy +02691156-a7a0e7eddf4ffb8c19378fd691582500.npy +04468005-506ebcdee663d5ba52470de2774d6099.npy +04379243-fc7ec69f0402424de27790b0ec8671f7.npy +03001627-d13eb19745344ae5fb0eb7e753c06942.npy +04379243-d0578233f05855fcf58998c8c192d0a9.npy +04256520-c344088939a4d4e4c8687ff9b0b4e4ac.npy +02933112-c99ec52d66a6e89c3c8d0fdfb1cc2535.npy +03001627-7f14058e6bf50047ea1d47b7c8c17fea.npy +03046257-b029b05ae3761f0b582ed853b74eeebb.npy +02828884-3e59aa33fcf672b8f4fb4dee5181bee.npy +04379243-4021d983b2359b2d4354f9eea413cf2c.npy +02691156-b976a48c015d6ced5e9e2656aff7dd5b.npy +04379243-124583cd4b54d9c01b17743c18fb63dc.npy +02933112-9f07ee5bcf6a4b11151b305e5243d9f8.npy +03636649-1e0f7ff92144792ac3ab13a0474803d5.npy +03467517-ca3930d49357ef676d9376f644442e99.npy +04379243-b0b704778e9e06ee22dc61df4cdad42d.npy +03691459-f9a615ecebfe7ae1b27175774c9e33e9.npy +04379243-a422fe1fc47fd85d59a230640e61666e.npy +04090263-45c8f8e154fe9642220da6190e4d5a0b.npy +04379243-3253af88a5568d6e5e0e77e9cf965949.npy +03001627-69314c01e2b6ef2a95a4f7ae0be930ac.npy +03636649-102273fdf8d1b90041fbc1e2da054acb.npy +02933112-cece5afa11b5ea16d2096b2fa6f98cc7.npy +04099429-cdc4b9b25334ee6f789a31ba8b4b1248.npy +03636649-5c8da21eabad2dfe3d59e2f2ea85dc18.npy +04401088-912d81dbf33f20956aedbd2a02b96953.npy +04090263-9f4658773bf2c31ffbf44f447f38c175.npy +03636649-928505a660acfc20c7e400d2701a92d3.npy +04256520-42b297f23638f17e27813b202e608c61.npy +03046257-945d98aacfb5842f8e8ef5f0615457e2.npy +04379243-7f3e2154bbe217d4143e713a73e832c1.npy +04256520-1a477f7b2c1799e1b728e6e715c3f8cf.npy +03211117-5c79b27734380b011a9e831992816ab.npy +02958343-d8b50ce6cbfb56a4786993ccbbbff425.npy +04379243-dcda90e411cb4e35506d1e1cc84da713.npy +03001627-5623d0ec9efedbc9d4da89766e80607a.npy +02958343-2236a1b9cde71eff13d31c5a107f3c4.npy +03211117-2ca1353d647e5c51df8d3317f6046bb8.npy +03001627-8cb521c0e96b349d65ba78ad9601cf1b.npy +04090263-da50ca3dcd5aaecd8bdd85f9e4c21fcb.npy +03211117-18371c836b01c024b41d52ced3f83dc3.npy +02958343-d9867d92edba3d0cb96212c8f6cd06e.npy +03001627-e0276adea0d4f4bf1783a44a88d6274.npy +02958343-dfec37059dcbf6e64819e00d73fd49e1.npy +03001627-fc0e86a20a9606493cd6abbbeca4e2ad.npy +04379243-8d01e61b216324d0f9814818e8ac1c35.npy +03001627-6f8dfc86a34548dfb0380c06db6e7e.npy +03624134-fba0688dcfa8e2d6b9db80316f5d0ba3.npy +04379243-83ce738c3cc05c54283b00891f680579.npy +03337140-7d08f0d49ba912bc91c352d02061b3f7.npy +03261776-ccf84f2cbd3ebeb247ba1bc05b9a0f37.npy +03046257-f36af79f59ace6f3b48a711df82173e.npy +04530566-e88c7403ff401716b7002bddf0942f8e.npy +03001627-3452faac2f4ef4d1f89f4ae158f2441.npy +04379243-db4f8c9f1c62e421efca4f7cb98e0c29.npy +03691459-8aea25f1090e419c9f78b1e1185445c4.npy +03636649-c7b77a991430bf08b8812f80908a0273.npy +03337140-1bee7b073a38d30a4c3aee8e9d3a6ffa.npy +03991062-f74e2aa18622de8872652f4081ec5a77.npy +03948459-c29bc7b0dcdbc2b9e1f2a1daf140ac9f.npy +02924116-7e1ebfe89513837f4b49e2e4c84b2e43.npy +04225987-c4b7db8e09375b4d6830ad3775f4cffc.npy +04379243-eeb6784f5812bcebb281680297eb79f2.npy +03797390-e16a895052da87277f58c33b328479f4.npy +02828884-fc301ae04efc46cfcb2a965e75be701c.npy +03001627-d1e9d5b534c77a2a14b96b665a8ac321.npy +03642806-aaebdb95de0459f66a51abe62a0f8cce.npy +02958343-68b4a03cd8d49553e98e65cfc071e8a0.npy +04379243-139c9b504cd85237c5984c8ccbe1a38f.npy +02958343-50e3333f66829c8fbe40bb45ea25a041.npy +02828884-9787c8521ba8d46b5b83c5170da4c6c2.npy +02691156-c5c726006697aa19b5666ac9dae008e8.npy +04225987-fc5c4986b2661d848fc8944fc8bfc667.npy +02958343-3a0c0927ed24090355f11dda63ed3832.npy +02691156-47319a4f6de68c2966cf1b4a8fc3914e.npy +04379243-3b391b1f9337fb5490ad276cd2af3a4.npy +03001627-90bbf2bd1acca50fd684faddec3c0090.npy +03636649-fce6b0ca06f8a565b45df535caecae62.npy +03001627-3a95602170ff3fa89c0f0342c78089af.npy +03001627-d93133f1f5be7da1191c3762b497eca9.npy +03001627-8a9630332c2cb42644ac83b3e97ad658.npy +04379243-da0ee60c93c215a05b30881dc0ecdd7a.npy +02691156-dc74cd06430b61f478d9c09d692f9057.npy +04379243-9c71de3e26788e20d810b14a81e12eca.npy +04090263-7e13df65e9fdba575814fafedc6971c7.npy +04379243-5094e6f7e49f2006e6942c5426df6055.npy +02801938-a2038457c94b4a5a36b0f2a1430e993a.npy +04379243-2e3037a285fd8b5c1be2a853ec4f9e8.npy +02691156-b2c69aa6c8d78b59f119374ee5d5f944.npy +03211117-801812bb859e6c91f9786f6e93041cd8.npy +03624134-c67be2da5eed3d10d50d1e618e5eb2bc.npy +03211117-9329eb153c1e8b4d8479362ee6ff3679.npy +03001627-64067f7029087ee07eaeab1f0c9120b7.npy +03001627-51375e5aaac17a8ef7628281ecb18112.npy +03325088-13b8c245f4fdf1238d28f213d83c9d3e.npy +02958343-c4c21e09e91292b03f82402961906323.npy +02958343-5ebc7e111e9d0b5d473f10e6caaeca56.npy +03624134-93b1e4a02037c52e679c9e94dfb2276d.npy +04530566-4ec2f4afebc5933638d037116a032a18.npy +03001627-4a367285ab5c22d07548800e3d70d83d.npy +02933112-5ff7e1be775072e5824662341ce2b233.npy +03636649-1f4df93fc1ca81c985bde43adc8959db.npy +04379243-224be4e98e6edc46cdc7385b337a3db1.npy +04379243-2f4d4e41a5ea61df8cb5d9909aeb1309.npy +04256520-a0a164ffbbbdac8d52979c729a1f9cc2.npy +04256520-b2f2058ab083cfa0a8055fb11b774454.npy +03001627-3776ebfcc23e6d87cfab10986e008a3c.npy +04379243-376a1d212ab8971125f61c02205f9a5c.npy +04530566-409ff4fbba1ba94adab1bb7802748e9e.npy +04225987-871516a54b6c8689615c01c6c616fbc8.npy +03467517-e0d74618e316b0f16d9376f644442e99.npy +04256520-dca3a1737e2e3c5c6d0fc9460109eda7.npy +02958343-49defa8dd73d03f1a7fd25564c2e888e.npy +02876657-2eba1ad799a00142938c8d9daf9b36f6.npy +04379243-75234e713a2baed84d5f12fa5114b4e.npy +04256520-1667fb24efa940b9527e7f2c027f7469.npy +02933112-9c87e3b439c20e177f1513678f5ee92.npy +04530566-29c5c9924a3e1e2367585a906cb87a62.npy +04379243-1d3d621e02b8a6edc6fcb6f3205734.npy +04379243-75fb953aaa9924d1f28b9459ae3635d3.npy +04530566-75078bd36089fd98243f62fe7d2ba690.npy +02992529-d944c42ad08401651e5d846d206adf3d.npy +04090263-af960bb41e705a579a6e43b878d5b335.npy +04379243-f54945d1d185b387659dda512294c744.npy +03691459-d458f71eedc7146994fa1ea146084110.npy +04530566-7baed55a551f03efa27ad5a09bb4c2bf.npy +04530566-bacbb452a0f6917a663e90eaf6b4ca52.npy +02933112-147eb60e7a6cadde4da5feafe6f1c8fc.npy +03636649-62e887efeecdc1a31ebf42c64df00eb6.npy +04004475-fc9bc191134f08ad18dff33f5d779e3.npy +04379243-83c5f5d8ab0733093fa313db82fc9cef.npy +04256520-8e7d422141080fee59f8e31ca87c470e.npy +02958343-8549c4948c7285f438acd89c0735f4f7.npy +04379243-b158eeea059f2c7484edd435e02f1ecb.npy +03001627-d5d18ba694ad228346b9f3b6ee20ff4b.npy +02691156-221c079c90d4d5779e9cd6cd13c91bb9.npy +02958343-ff809d58a66fb4e85174ee1075ae80c1.npy +04401088-2fe9e8fd2a7c512ad1f278e1513f3b7.npy +03001627-c5be8052dddf9e92283b00891f680579.npy +03467517-8c14b3b474245ce9465b60d363b610aa.npy +02801938-242e6c21d53890a236b0f2a1430e993a.npy +02958343-52c0adae9be5dba12e877e82c90c24d.npy +04379243-fa5dce1043f44c06ab88e3acae6e8bc5.npy +03001627-274189e25f44397f51f77a6d7299806.npy +03001627-e344e50eb6754cf890ef7803f19df417.npy +04379243-7e725fcf5f56b74bdfef331c9e51db71.npy +04379243-2ca0370bb8ba5ad0e46a4046edfd3265.npy +02958343-fd243c10d91f08e46e282bcaec079702.npy +04379243-b305fed48f77f5d3b40f0ac0fb9a650d.npy +04090263-d96e0f2fdcdfc47cf1cb19f636b1c2bd.npy +04379243-44ebc446b2cb44b0c12f5058c05b3979.npy +04256520-e9017aa5115303957be8ee92c39a9d4b.npy +04530566-fe84b8e3bf172880f54a2210c7b2aa25.npy +03001627-961396e0e5e46a4a208462e8bafe70e8.npy +02828884-3d470843f013f9d8c9fd4914d3d18461.npy +03991062-e089186adbcdf495c0781ed2e47426c.npy +03325088-34faf4adaf07fd9dbd490710936da71a.npy +02958343-919b95beccb25d2eaa3fe7369efb56d4.npy +04090263-2315893467e8b5eea50ef3fc203c6ba0.npy +04090263-ed9225ab8a02b0fd4b349e4b3dd5565e.npy +03337140-6b4a0b4d90640e45c78621ab7e0ef193.npy +03467517-ad2711786f1bd2f3bece9f494cab1c6d.npy +04379243-21d141b130a76e0e497b98603e1cd1f.npy +04401088-cf7973f49aa611346be7f66e5722d994.npy +04379243-39f6dc2839dc4e1bbab624e35355496d.npy +03001627-59879a7a34ee2ca840e8b85dbf5f349.npy +04379243-46184eb6f03e8d2afebad4f49b26ec52.npy +03325088-adb985820edec4577eaeab1f0c9120b7.npy +04379243-416f41390bcf0f87a961b86aefe617fd.npy +04530566-5261e8e52d1581d2398589a18564a81.npy +03001627-34ce485c1fbb9af578785e24320d5ee9.npy +03001627-3d703ecc2358ea0ff51f77a6d7299806.npy +03642806-dbc61cbed5f7f2b33c1abb78f1519c49.npy +04379243-f850a69b0d308fbc19fb4103277a6b93.npy +04530566-b4f254a5c49748a2db2b485c26c9f191.npy +03636649-d438e1e1b540a30b1f329c416dca6157.npy +03001627-93a6876247c7a015d84b8ba651dfb8ac.npy +04401088-97669779da217dce4f37c101c765cd3f.npy +04379243-2a3297e263d9931b814465edb1048711.npy +03691459-72d2729801d56aa51f9f3ce366e030fb.npy +03001627-3269630cf8dd9e87bfd5f349b1ab226.npy +04379243-e7abab128d0edb033396b0dbcf4d4bc7.npy +03797390-62684ad0321b35189a3501eead248b52.npy +04379243-74db7acb40bca6eca707ebedc87d7580.npy +03211117-402938797a9a63bee270f79b60ac4232.npy +04379243-3253f2c59e6bd2a119fb4103277a6b93.npy +02691156-aa0b34d9bc5b77e0d86ebdaa02a63c4b.npy +03593526-72a7b73460850cd777939c607179153c.npy +02691156-35e2eceef33804d8196c5820729d438f.npy +02691156-9483e1b0e4222cb4f2b0736dd4d8afe0.npy +04379243-e3c8c6e7bc421e52e4721974983917c4.npy +03691459-9e2230b0d4d8d33e4ba7340387a30ad3.npy +04256520-9d6ac979ebf86ea9f37af16b2893f1d4.npy +03991062-fa2f25665c561e7be4179a13aff1e10.npy +03337140-53e1d0645ff2afc54c3aee8e9d3a6ffa.npy +04379243-66255a0a235927ea1b81a92ddeaca85c.npy +02828884-831955faf1c5eceb433fb7e44afbc69d.npy +04225987-1d527bbed4d12817fa3bb91f4e3cd35f.npy +04379243-7fd24508190c2e5351d3c864cc68e22e.npy +04256520-80e34c832c4881c1c1acd07b40d583e7.npy +04379243-5a04d5055cb9e3c3e45ef4135c266a12.npy +02958343-d849e0fee026c98aeece2324fbbe339.npy +03467517-af69a061bed20d8a2ccb8d77f3823711.npy +02808440-44278df837544b8a412deb0d2b0f3dcd.npy +04090263-5a79d10c5665b9dc895b56cd0d702185.npy +04401088-e5bb37415abcf3b7e1c1039f91f43fda.npy +03001627-4f42be4dd95e5e0c76e9713f57a5fcb6.npy +03636649-42c6478d294d71adfcb8d8c6d4df8143.npy +02747177-da9ee9282a5e7c77ad5067eac75a07f7.npy +03325088-4f3871c661ac8ae6c36fb70296e45483.npy +04530566-9122c94c6aa76d9e652b5e55e45d0bc1.npy +02828884-88f9fa58ee9ce3de1c863a93a9948fe0.npy +04379243-62bb78bfca7f4bba6113140c4b8aa3a.npy +02691156-78bd38a7282a73f8b184ba15dd506a2d.npy +04379243-7e51fe2b0e56f2e771b7a1511b87f5b.npy +03001627-59009d87f73ce9385dc3653f8341633a.npy +04004475-dc5354098d9fa08d49843c4f9ce432be.npy +02818832-8c1f29ccd64da4a6eab9455d2e880746.npy +02808440-9c2c7ae1ddbbf166eed6cfa9fc6d794c.npy +03001627-e78f25a1f66c19a38a63c123f2a561a6.npy +02828884-20222f467d257022c8bbbd98dee48cb.npy +03001627-a6d850761adf6003dc89a28b5e6678e0.npy +03001627-e017c5c8562ae50882eddefc99ebacfd.npy +02691156-c353ad7ae6ad2b9df1cb19f636b1c2bd.npy +04401088-393ae1877a5e20478139dd63d55edc44.npy +03991062-b3c256f5013d9c2244c183864792bc2b.npy +04401088-9c8bd4fce744a7df5d4e1af18c85258.npy +02933112-1e40a4dfbd78455812de5317fe5b354f.npy +02808440-2a83a721763cb79df15dc88ff54e5f9f.npy +03593526-4b5cfef99f228397cf0c9e00a1c0d141.npy +04256520-408199b4b50fca50f415ddcc43feede.npy +02747177-f0f6b79c748c9598ae1c1abea367249.npy +03001627-91ffa0718376a4fb3f7e27638e63d848.npy +04379243-6ab612b7a5d4def82454f22008de5a3e.npy +02933112-895de6b9d3e0f1ad11b65536c08c170d.npy +04090263-2ed25f939dd286cbf4c4f1f541cfa2a7.npy +03636649-2071651fb8407e4314038d588fd1342f.npy +02691156-aebc4c46b3cb7c3bca8607f540cc62ba.npy +02933112-ca9e248cdcca240f11a59b122fb65ee9.npy +03593526-8e88eb643cde1363ba5342d638d0c267.npy +02933112-39d9512e482ef253c59350d819542ec7.npy +03001627-9e1b32f73908cae7e8f8c11a24c52ebb.npy +04379243-96ef0920cb6be395e44bad6fc9badfe7.npy +04379243-1408914f71c66166febad4f49b26ec52.npy +02924116-dfacef652f7f414e4b88ac4b14fcb8bf.npy +02992529-ceb47998c0ffa704f1cb19f636b1c2bd.npy +03642806-1971fd62c05b664a816d6ef08b9362ac.npy +03636649-e94aab17400945413225afab722d9fd2.npy +04379243-8ed32fc808a31eb5ecd447b0bcf9cfb5.npy +02933112-8b0411fcc2d48f9a4b8710a3469971b1.npy +02747177-ccd313055ecb8799f155d75bbf62b80.npy +03001627-e6b0b43093f105277997a53584de8fa7.npy +04090263-a84652cb6886d873643ae903098a314.npy +03325088-7793cb4f3cb7f664979c556124bee033.npy +04379243-a0864018495ae55cdef39da7703174e8.npy +03624134-385bb539629cd6991dd89e5fcd05911a.npy +04379243-61198aa59e0aa31764d8b0368afacc65.npy +02691156-20dbfa169424bb8ed7b90ecb4a11cd32.npy +04379243-db77ba0cf616e2908369c37b40e82efa.npy +03948459-f6e410358d5a095a49a3c1009fa79820.npy +03001627-f0fe5f6030e999be3b9dbfb07aa21fc.npy +03691459-fb231e827089f9db69a175548b8cecb9.npy +02992529-3c0801c11fc7e4c5f31b75c4a94a8879.npy +04004475-4d246967795180971ed16b27fcde478a.npy +04379243-8fe842d92037d55be6942c5426df6055.npy +02992529-f7cb2d921f246c00cc8eea03ea8843cc.npy +03211117-f47b9fc9a55a731a7bc6032416bc8ae.npy +04379243-900afcc9f0f5fbfd858699aaad4acee4.npy +02828884-9399c7769b01d4742591fa6348c25a73.npy +04379243-abb1710ecb79812d93f55c796c857bef.npy +03001627-600f6f126d0b6c046dbda90cc7f3517e.npy +04379243-bac7bae00f0553bac88c75598a661012.npy +04379243-a7536a73ce066981c6641602bad03c73.npy +04379243-594a7dedea7abb21f77e460087130a90.npy +02808440-85bafd18f0457795810b41e4924ac586.npy +02958343-e3181dcc6b60432f658e57fd275f6bed.npy +04090263-45d3b7dd92a80269da4044967c19cf99.npy +02958343-3302dbdd74d978eeb1bb46d2556ba67d.npy +04379243-421657269cac10f7492d9da2668ec34c.npy +03691459-64058330533509d1d747b49524a1246e.npy +04379243-127e202f77eee5725d02cdadf545c773.npy +04530566-65e829c5a8a52b9491347c63d1dae43c.npy +04379243-613888be9e80b92fda684e203423d5f5.npy +03001627-582b375411f6a4565ba78ad9601cf1b.npy +03325088-4349f60256e8bcca76c18e71fd49c4dc.npy +03636649-66fcb967b951c0f11bb088904f7cb154.npy +03691459-93927ab6b44bb95a1c4980134f4ff624.npy +04330267-3e8165c41c526ea45eb64c1003065596.npy +04379243-104c5225ef0a288ff932326d9778e21b.npy +02691156-98ca06c300ad5a6bdc9181d6fa468db3.npy +02958343-598f0aea814b1d0f8db98a39370e7faf.npy +04379243-c842f85477f9bac0a7a7a90dc2dc5bd.npy +04379243-c6dbc7938060818cf51f77a6d7299806.npy +04379243-e6ddcae1c08b880811d3792a7f546aa8.npy +03636649-ae25da30c4293fcf230584014222e685.npy +04379243-b82e94209375e92a17b431cae0dd70ed.npy +04004475-29d22386bead2931a066c1f884f0378.npy +02876657-5566f264a6fa08cd2a68e506fbd6eecf.npy +03948459-d7e86e0e5b1982d4bf0ab4d7096d87f2.npy +04256520-1cfaa8ba4979b36ea60b4d749290e4f.npy +02808440-f15b0f42feae8d75b87c8f5e7f9beb6e.npy +02924116-cfc817de0241de11f5faeb3213703480.npy +03636649-380a312c4eede2eb72ce68571bfc4bb2.npy +02958343-e0b9bb886c578be86e9dcc2d1ea2784d.npy +02691156-997cb29f544d6f2726360e1e29a956c7.npy +03761084-c75ebd7c340649ba5ad304c2564ae1df.npy +02924116-7796efe8e1b0dede4c949161e83c47b5.npy +03691459-7c02e1c88907e8426b424c689f1d711a.npy +04090263-b52e26101ea750dfd1f50c75142faa8a.npy +03001627-64e77e9e5887ce95492d9da2668ec34c.npy +03691459-1e8aea643deed7cc94c70e7fd262be3.npy +04379243-92cbad40c55de5843002761e7a3ba3bd.npy +04379243-ec07a28c3d57d3275c6a44a505804654.npy +04256520-ce6c597847e7dd1e55eab99951962891.npy +04379243-ca4ce5ea2835b9d71e9c9b11de2def7.npy +04090263-81d26c915198c2d857f253aeccb15f0a.npy +04379243-cc1a9fc08b4c481c382c5a0f87d73d23.npy +04530566-6f61d84f9373f7c5c05557706bb20c4.npy +04379243-ee642ce4112cda8c229ab176c921b2b7.npy +03636649-9358ffb1bae027166aea2f18ee404fd5.npy +02808440-24c288011f4c14463321831d2245cf06.npy +03211117-3783ec2d4ac3b097a7f97cee360e8d0f.npy +02958343-97970b4b0f351f5a9697635485e4aab7.npy +02691156-12e6e5f07b3aad3c5b9f44d7cd72a051.npy +02958343-8cd32df8c0c566b2fbeef84a1ff2df7f.npy +03991062-471fe0704ba80876a9e86fec93eaa6ef.npy +04379243-34ca15546a48e34798d5fc0473d00a1c.npy +02958343-685f2b388b018ab78cab9eeff9aeaee2.npy +03636649-c4d62e5fe71fa71f1ba2f806cba87b47.npy +04379243-56cee7545143c9b67bcb070cc655f13a.npy +02958343-c54dbefca6290ee8a3b392b986583.npy +02691156-e025a1fc1bd71c2aacf77e718d93f3e1.npy +03642806-621882a4afd2a126369873c1090720a1.npy +02828884-f1252c297d7ad9a47c51ec7d2716b33d.npy +04256520-1a713136ff3c0a506298eed3ee847aba.npy +04554684-c1e9cbae0d223f9135e770f723375070.npy +04379243-2087680eed2edc0a20bf3b65a70accd3.npy +04330267-e4c8385cdd91eec0be8b4a628af8a88c.npy +04379243-52eaeaf85846d638e76bc197b3a3ffc0.npy +04379243-161e0ae498eb2b9be3ea982be8e701e5.npy +02933112-b56505eeac0de779289f8cbfc8541c14.npy +02880940-6930c4d2e7e880b2e20e92c5b8147e4a.npy +03325088-f3f585885793fe4814b35a7d7cea7130.npy +04090263-d31008f7c9b5d67678fc07d6c8069b8c.npy +03001627-9f6b1b905ee5ee9ddacbd849c304f00c.npy +02747177-1d5e46b18684ede7ffe3432ba4f2e6d3.npy +02691156-ab06b28f95e4c2caca8607f540cc62ba.npy +03001627-43fc49e4d4ff831b7df0e9a69c97c97d.npy +02691156-ec531add757ad0fa9a51282fb89c35c1.npy +03928116-accff92f4636f077396d085066c4d70f.npy +03991062-5e59e0970a6b05a5d67c0e209ce7200b.npy +04379243-14c9ffa70653cde3492d9da2668ec34c.npy +04379243-e8300d560b8d60244cbf9a02e3342127.npy +04379243-ed2d7f09d80ec3a259577d199a67fd7.npy +04379243-3f0e61a567fe7d366349f6b5431fb3d1.npy +02747177-74949d20ce6f5162ba6cf6cbb9f4c2bb.npy +04379243-ad461a7b5e8cc66efebad4f49b26ec52.npy +02958343-ca5236a5d06b9bb13fcfdd465734daf8.npy +03001627-35bcb52fea44850bb97ad864945165a1.npy +02876657-3f6d549265532efa2faef6cbf71ebacc.npy +02808440-c52b603a212365a4670204dee97dc037.npy +04379243-9db8f8c94dbbfe751d742b64ea8bc701.npy +02933112-c55eef8d5b4d3db563b3c67777442463.npy +02958343-7e4667d837e39d0945e930a0b8a8cbc8.npy +04530566-d2f2ccde17f68aa6f0a2921fde94663d.npy +03211117-2eb7069d227393558ea0068b966c5177.npy +04379243-b03bb928a8842c7ab748e35bbe935720.npy +03001627-c09cab69cc04378cff24fe90298ffa71.npy +02808440-7ea685c4ca42c7df63ffebf86d8dd00.npy +04401088-3d5c17c3e60a168bdaab9d410eb59af2.npy +03691459-dafd6b7408e43ae5ec3b2e05ce8fd39b.npy +04090263-45272a2a7c41e0095c97ca64716dc6d5.npy +04379243-c715a29db7d888dd23f9e4320fcb3664.npy +03797390-403fb4eb4fc6235adf0c7dbe7f8f4c8e.npy +04460130-376cc07140ada8e0b21a5c4b7083cf07.npy +02958343-2485b755d54f95b17461dc7993bb5c2a.npy +02958343-c34ef43ef8ccc3a701a8678a1e8d9e5.npy +03691459-2daca96a8e202949c67b8955be358784.npy +03636649-c6b545ae1a7b180879c251b4a7838829.npy +03642806-d838fc238fc640b83bba289a9fdd2a7d.npy +03046257-25f5f0d55feb7662f546596ce7364503.npy +02828884-64cf18fe86206f6e1b1a00a31bfed97b.npy +02828884-733cae1ea9a85122d41f2c02e27f6d9c.npy +02808440-f313673174ba24de1c17aef130ed6213.npy +04256520-16dca17207a6a2b87f6fd4fd84c364f4.npy +04401088-2d26f853e710b3e894088ff49a6baac4.npy +04530566-7a188a5ed26af4b360a251068e7dcf6d.npy +03001627-4a89aad97f4c503068d1b9a1d97e2846.npy +02992529-71121add7e94b024fb88c3d40924fb73.npy +03691459-62fa02df51eb19a5679c9e94dfb2276d.npy +04256520-ed80dfdb4a552b189d4d5dcd2cc33826.npy +04090263-1e83ef6ed5d0b78b7efb854782e23566.npy +03636649-1ea51a962ebd04f5775b45d31226d2b3.npy +04530566-91fd8bfce87a0e7d847c4e55bb965ab0.npy +04401088-11e925e3ea180b583388c2584b2f0f90.npy +03593526-c5fda0e7168d23ed89035c25f0dfeb63.npy +02808440-f0836272c93c3c40b362845c6edb57fc.npy +04090263-b9b2f960a937bb22643ae903098a314.npy +04004475-528e663093a892594eaf2ca511fa4e67.npy +02808440-a1774ed7dd03d7b717e29780ff39c480.npy +02691156-6ba3a181a40ac7aa35fc197bbabcd5bd.npy +03001627-fb3cae311c16eae32b18cbea175ad66.npy +04379243-8fae5133d952b2ddcfd3cc1d09bc8fc6.npy +04379243-511a939f29ca6763f169404e5c013db.npy +03001627-33319915ae51cbf33542091189dc62b5.npy +04256520-fc48d6602ba4904b5bbac631310d500f.npy +04379243-5918b05f59251e8c24507ea38c2d7c6c.npy +02828884-f11c39810334bc2a45bf743eed1481df.npy +02958343-ce93ae42d9cba64c8dcad5127c74b8e0.npy +02958343-ae54e2952eae6ce4473f10e6caaeca56.npy +03593526-d9ec6c788995408997e88473b28104.npy +02691156-2ce94527ad7f57333bfdfb6cb363d727.npy +04379243-c0b7cf5017ba0f21504c7f76533ac19b.npy +02958343-4c8280d581df259716abce8cb03e7794.npy +03325088-eaceb24407c702da3321831d2245cf06.npy +03211117-fb62e62c2b1584b45d32c81b99496e1d.npy +03642806-ca98fa6fe9c91b8b8b0a7ba4456e7659.npy +02880940-2a1e9b5c0cead676b8183a4a81361b94.npy +04379243-46e097e8c17a4098593ebeeedbff73b.npy +04379243-f6ec4343f78b94b42553cc33364504d5.npy +04530566-92fec5e70e9c972130327a4f3a474384.npy +04379243-d78c722ea1a1b2d4df253edc1fde0322.npy +02691156-7568400ccaa12eb9d972c9dd75ed77d4.npy +03636649-6e705a94eb0a7210e0ebca47533963a7.npy +04330267-bd6f0ae37e25089e136ac3990ab77b2.npy +03001627-974afa9a51eb74245c26acfe9040fa59.npy +03325088-b485f4d94b00763b362845c6edb57fc.npy +04379243-d12b589d464fab1862ba5d2f24e5abbc.npy +02924116-2a20a7a3da107ee749ce6dd3d22ed666.npy +04379243-5fc08f3f8c3aacb8456cbf78e1e89022.npy +03325088-182136abd343be8b8fa6d5040a6c641.npy +02828884-c5625ef76473a5cc7c3efce71c4e8d70.npy +02871439-3fe283e402ab8785937a1594070247a0.npy +03948459-d7ac2d2fafd9b9076314c3b6a3a65519.npy +02933112-6fcae7f06d9f86b2ce5d6e9371bb5c33.npy +02958343-f04f2fa810b6a66994abc9429888948c.npy +04256520-813597b7f538820ef51f77a6d7299806.npy +03593526-e4bd6dda8d29106ca16af3198c99de08.npy +04256520-c47bb0485a3aa2407252a102efb37f50.npy +04379243-e8f5c6944e41c12840d79382490f0976.npy +03928116-bb8acb49245b8f6ee8a1430c80ad4e85.npy +03636649-ec2806b889462892a84fca5de7f98b9e.npy +04379243-2ba8eb5ec0a05694593ebeeedbff73b.npy +04530566-502f848385718cb76e1f79eab597a3af.npy +03046257-4c0d048f0414e92e1b25839d42de8df8.npy +03001627-20e71125748a11bc3c65ef99d4b819a4.npy +02828884-1e4eacc8dc69a40e414354bfb060c386.npy +03046257-38b77917fc05e5a390e588f8bb3fb0c.npy +02992529-2d5f1105a92045c8af0fa49592cf7bc7.npy +04530566-29a895c9367516c1de08ac29282054f6.npy +04225987-9d79847df77172f5ee8f98672c31bd1.npy +04379243-c11829ca8ee139283d2617f9171b5ccb.npy +02958343-783bafaa18e8e5a0bda72093f9b5aa73.npy +02942699-290abe056b205c08240c46d333a693f.npy +03001627-c4f9249def12870a2b3e9b6eb52d35df.npy +02828884-969f830a531682cef155d75bbf62b80.npy +03046257-bf476938942c3e7e510ed2bc209ba71e.npy +04379243-782cef41b14a2009a71c812e027f94d9.npy +02691156-208114e3aafd381ef27c5ff0af8b0e80.npy +03001627-7220dcc0f3f95da3a84d309c7a35a478.npy +04256520-68c58177f6ead1ba9f2349486c570dd4.npy +04530566-4e6264af2f2c3e135a15c264bb25007a.npy +02691156-c4111dbb21e1f17043afdb9c81ff2967.npy +04256520-2a7fb9c95b0e8eec8de75bb03756213a.npy +04256520-6600d60c9d3bacf8d34d30b545306d1a.npy +03001627-d9159a24fb0259b7febad4f49b26ec52.npy +03467517-b8e67f04491740ac2be4d2d80280cd11.npy +03001627-21f2927b04e2f22830ddb6ead95f49cc.npy +02871439-34411a9fa3e00f668cbb8bac2032149c.npy +02992529-983b045d30322f96b102e855af58e521.npy +04379243-30e642f1d7b0d8818430b7446f9e1252.npy +03001627-535289ef7d9bdba8a69bcaf4198ba9da.npy +03046257-557a521bb01e092b503c5b0dd3b93560.npy +02958343-9e136de952f33de0a1830153974050c.npy +02828884-de00838284782bfe97fb25ec4f973add.npy +04090263-48f60ed3a4e32891fe00453e7ccbcad3.npy +04256520-fa5bb6d18535f66219fb4103277a6b93.npy +03467517-6dc4a1063fe83275a693a2475d32392.npy +02691156-577ef32f6c313a5e4ca16f43c2716caf.npy +03636649-7d7dfd2bd5cdcc4cfca61b0bec17b8d3.npy +04401088-b72ec892f88ab015433d4f1444243caf.npy +02691156-ddd729a8623bcb6e8699933784576e73.npy +04379243-adee49b8f5251efeaade78cbbf8fad3b.npy +04379243-fb158adc15a6b5aa75a82b88fe6e733f.npy +02876657-6a96b74beea7f5b316aa41fc58452f78.npy +03001627-d93760fda8d73aaece101336817a135f.npy +02876657-244894af3ba967ccd957eaf7f4edb205.npy +03691459-4f228d116af6e6ad88a3e0e92891ad5.npy +04256520-207e1410735bcf5a62556536221025bc.npy +03948459-14357d3397d55ed2ee0f9a97b71d505.npy +03001627-116a9cd5ac9a008ee8cb931b01d0a372.npy +02691156-b831f60f211435df5bbc861d0124304c.npy +03513137-7da461d2b7ac1454e5e6ac3ef6bff73.npy +03001627-ec758c4557250ca79f2349486c570dd4.npy +03636649-4b43b17b960930af53b1634376cbfb93.npy +03467517-c3c9bc3aae8231ba93f0194265a9746c.npy +02933112-26979d498a0425b6f51f77a6d7299806.npy +03325088-95e13660ebae4953b362845c6edb57fc.npy +04379243-c477235c02413bfc44d2ca62bee212a0.npy +02808440-b08d711c39561b793321831d2245cf06.npy +02958343-6fce36e4df1eac4fa7fd25564c2e888e.npy +03636649-f7495b2e74c906b5922ab3cc7ca1ae2c.npy +04530566-69379ea3029bb2f6ee5140f12d845ca9.npy +02691156-223b0ac8399bf9c5ea1bd6f2443b43e7.npy +04090263-fa811fb70a13c68f95eaa1471ee21cd2.npy +04090263-91b0c8975ce241d69557371cff545901.npy +02747177-de31ede76692c36271c1c4a28b10d064.npy +02933112-6081348fd96b21c3eca22c501ad0a77a.npy +03001627-fa0eb1bb05ebe3f2dd3adf3090c701f7.npy +03001627-ce774c6584d282ce843ead12644a79bb.npy +03337140-c38a124eac2adf5b91c352d02061b3f7.npy +04401088-caa0cf3c7bf2cc4e50e8879f012090b1.npy +03948459-a2439ac7a1f3ac841ba5cdb283b62da5.npy +02691156-be02fd401a12d23822362be7f5226e91.npy +03001627-c05ed12b1bb79ef6d8e8a8a207ee5bd2.npy +02691156-3fd97395c1d1479b35cfde72d9f6a4cf.npy +03001627-7fbde9d7cd67587712ad7c55c944504a.npy +03046257-71eafda69c77150914038d588fd1342f.npy +03001627-352aae8597fc6ac679c251b4a7838829.npy +04530566-19df5aa5324f265d4de203ef6842ee61.npy +03001627-c109b45b290d4cacb161f36d4e309050.npy +02828884-4c26d27e41726d87f359d99f906f117a.npy +03001627-c5be3a0cd25402f0242f43e6bc9e11b1.npy +03948459-d45435235c262f179f433921788191f3.npy +03211117-3bb7a8505b99216a53227dcd0d547ba6.npy +02691156-d629589ee52d48ee4d210d9468aedaf2.npy +02958343-baa1e44e6e086c233e320a6703976361.npy +04379243-788c9d078cc971bf91a6d2f5a0fae0.npy +02958343-8fadf13734ff86b5f9e6f9c7735c6b41.npy +04379243-d3b644f9eb32ec9cbe1fb1bc0addfcca.npy +04379243-f619501cf26b4d533b7f931c53ba66d8.npy +03593526-7becf46a6f6428404bf49568516d5f0e.npy +02691156-91a00801903a1f64bc0909d98a1ff2b4.npy +03001627-d25b6ce1b5ad6198dbbc9440457e303e.npy +03636649-1feb0beac92a26bcb0aa15078ea6f391.npy +02828884-723138769c7c84eb5006d092e9ad4f03.npy +03001627-e8187497dd464b62f91663a74ccd2338.npy +03337140-b406aa9ee044a9f039e7e5a97caed0d0.npy +04379243-b1335d826d7d60726e066e11deddab75.npy +03001627-6dddf2b95ca09bf5febad4f49b26ec52.npy +04379243-c8ddf2c234adc19b6e848052f86fa0c.npy +04379243-f090d4f5e82b3c25f63a1cc836eff7a.npy +03710193-a305c425f2409d562e33f9f68dbe6c42.npy +04530566-9c41a1bc835ab6d81194cbd9c0740031.npy +02876657-22d18e34097ec57a80b49bbcfa357c86.npy +03691459-c7965a5da1143830538cf6df9faa9b65.npy +02958343-b12e8616bb73f5daccaf7041f92bc85b.npy +02876657-a1bc36109cd382b78340c8802f48c170.npy +04530566-51f269a4ff48c2214de203ef6842ee61.npy +04468005-26d7ebe6f434ac67e810c01b1498aa2b.npy +04379243-a10ed77ab3a714f43dbb6421d614c0d.npy +03001627-8b2949a4ab8f5a7d84c7dc40ac6d743.npy +03636649-a58ef2d9168f9b44de195732ce36834c.npy +02958343-36190ce6fe041e452d647b1c17442c93.npy +04379243-e88f6f4e0ed6d01effc6e457221b9271.npy +03938244-b4175523993f66e8d330ae3d046a415c.npy +02808440-5540561e61ad6e063321831d2245cf06.npy +04379243-62e723ad4ee0ba9d65579260f47a2d77.npy +04379243-3c65571a506b6486db5ebc3f027decaf.npy +02691156-2d33ee87ee5230c335fc197bbabcd5bd.npy +03211117-50575a330ffdc66ff5a91610a18641eb.npy +02691156-bad8f0b4602df33fbe4274edc10c1c8e.npy +02924116-eecc64e912b980241e797b014c500fad.npy +04379243-aef9ca5d1b98b85186ac7f2dceaa530.npy +04256520-72988c811a2c88b11206ff076758ec85.npy +03636649-ed57181b9e7644a3f51f77a6d7299806.npy +04401088-d1b34149a8faba42faab2c6c450c7c1a.npy +03636649-adc8129076715686b3742b0325c8aa1b.npy +03928116-2c740240be7df1958148161f751e44a.npy +03211117-1a92363c2a155ed3c397356311cbeea4.npy +03046257-f764a6a70636d54cafcd02e9a1a7ba34.npy +03691459-5acc9b2fd33a9568bf19c71eb972f14e.npy +03001627-6932261b5c17f0de4733824eae5cd9ae.npy +04379243-d7dbf6005f2e8fccf6ef7bb1183682c.npy +02958343-f4fffa99e8c2b9b627a00642873b9759.npy +03691459-fbcef568b50216e3e180a1a604561d3b.npy +04074963-f3366e751820f0f77e1c85c5c15da7fb.npy +04090263-c1e4e78ba2b714175814fafedc6971c7.npy +03001627-3e2375ff9e7af8002861ed753d5b88a1.npy +02691156-8200621d7b5cb84a6b7bd17e458d0dcb.npy +02942699-98fc1afc8dec9773b10c2418bc64b141.npy +03593526-1ca73dffe31553efcb349a60fd15aa15.npy +04379243-e71012d27b3b3eec67142c6ea337b7b8.npy +04090263-ad5165b445e67c06cd1b85350f224c08.npy +03001627-50aa55467c87774b7215a1e3ffbff428.npy +03691459-c91e878553979be9c5c378bd9e63485.npy +02691156-fc5dade8622f686b4aba1f0cb15b1439.npy +03001627-3837e94954187dbf93b0969ba78346b3.npy +04468005-d8cb93fb3dc3609434754e47237bb24d.npy +02933112-d5058b014492f748220c986172788383.npy +04256520-532e2a8e2ae6f5616bfa0701d875ff10.npy +02992529-df23ff3151aa1f0a3cb2f20e21cb06ff.npy +04379243-cf076ced8264a480cce90f0d61ed7a70.npy +04379243-e5b4980736c034257de96030404c16e9.npy +03046257-e13f5f28839b623bcff103a918fa8005.npy +03001627-4b71f633ddb55c6e309160eb001312fe.npy +04530566-e853f137948055b188d5590328ce0ddf.npy +04401088-4e2f684b3cebdbc344f470fdd42caac6.npy +03001627-6367d64115d665ef51f77a6d7299806.npy +04379243-dbb28a435349c9c76b1cb83d86c19bfc.npy +04256520-85a8fa447231a4fe2d19175e7d19b7cb.npy +02808440-25709b9ab8facc1b3321831d2245cf06.npy +04090263-8325595fddab7e47dbf42f7773eadf2d.npy +04256520-44503d9ba877251a4b48718ea0a8b483.npy +02691156-40fefe66b018c17b4c2c88971423d0be.npy +03691459-93c54cd14ea713d34d0c24eb0094dc21.npy +03636649-a5b8eda3cc13acfbbc8967b0321bd9d2.npy +04256520-aa36fd4d76afcaf8bdcda0bf7e7b4744.npy +03001627-cbcc5cd1aec9f3413aa677469bbdd68c.npy +04379243-d7edd292f614e9dc58b7984178830447.npy +03759954-e9178d7aa6d35cbd76f6deb1c78dfee8.npy +04530566-ac93c084dc99fa8a1613e32ab05e546d.npy +02933112-90f66de8ce581ee39aa778fe3a2080af.npy +03261776-e8195dc3c0235dfe49852b2ef384d236.npy +02808440-2a28b3c0318590983c8d0fdfb1cc2535.npy +03624134-b918bf1a07d71b4f1b9c8e2fdbfc1118.npy +02958343-54d525937d9c6921afe717997470b28d.npy +04379243-9b17a95b794b3dc341a298cc53deb86e.npy +03046257-854f8ec7013d30aae6fe3612af521500.npy +02958343-fc25e4c1bcfd9167b376886260eb15c1.npy +04379243-1a9036f081dd51683a9bf8c718fc345e.npy +02958343-ba0c32b3feba49b0b40adee184c371d0.npy +02933112-22e77a41cc388839824662341ce2b233.npy +02958343-cb5a320fbd846fac28e9ca8e8fb04e0a.npy +02933112-60ac3a02f8c1116b5588a2543ef0b0b4.npy +03636649-27623aecfdae2d887eaeab1f0c9120b7.npy +04004475-f065815f98d3f2e52711ed0adf8251d4.npy +02992529-df816deae044cf448e53975c71cdb91.npy +03001627-9eb0c534624408a6ca9b40e76e725878.npy +02828884-8afe9533153bb82b157f5033576317e1.npy +03001627-a3ba5f8fdc8f17ee95bea7c29e873d16.npy +02691156-9465be8f818fbf94b01a0cb11141e033.npy +04460130-2b6257595edd2e62159e1f7290c9a432.npy +04379243-e7c350f18bab885bd0bcb58c58eddb59.npy +03636649-41c1e411592ecabcb7487183c0e206af.npy +03001627-41ea9182aa12effef47265090d8660c7.npy +02933112-9d75f1513c57e433c8f56fd282ce5ea1.npy +03001627-f9e386d968653602d68fb8f5d99affa0.npy +04090263-981b30a44557ae28caf05f9cece7ada5.npy +03001627-bb380888cf0ac2e79c0b027ae5b223d6.npy +02691156-c2ea74539ffe96f8be4274edc10c1c8e.npy +03691459-f2a13a030a8153d9133aca0b3ca7f0a8.npy +04379243-cd0dccabc5966b40d42ec7e303174a87.npy +04090263-298d300e70d6bf24e1f2a1daf140ac9f.npy +03001627-fedfc00265711f4193c1e619801da0a6.npy +04090263-641157eaebb2183ae96eacf8990e6676.npy +04379243-d67265ea100ceb32ce11183544874734.npy +02933112-740f399fea35db05490ad276cd2af3a4.npy +03001627-8920c0e0737409e29f2349486c570dd4.npy +03642806-ef8ea9a542b06adcbd6e55f88e701c4.npy +02992529-c8948cb8ec0f10ebc2287ee053005989.npy +03691459-2b3e7da84b849a84d3dbdb797d2f78b5.npy +04530566-a9eda0d90297844cf92c4a072103d4f3.npy +04460130-34e391f9e9a72f97c5e86946f2168706.npy +03001627-6cb3d99b20e7fbb5b04cb542e2c50eb4.npy +03593526-7d71fc51ce793a44befd8bfd61b07f5.npy +02942699-2c0b4e318766e01723cd81bf29b64a1.npy +02691156-fc44636ad5fd9754927b6179bcc6e892.npy +02691156-6187d076d53429aa67c54439d6177032.npy +04379243-7ab9eefef9fddaa416a2b5862518c93.npy +04090263-acc7a95f567e94355ce192ce2ee187bf.npy +03001627-5f9fd9bf28da76ebed2eab6efdeec5f8.npy +02691156-68f26c36ba5340ede58ca160a93fe29b.npy +02808440-1c908b81867d6d85b362845c6edb57fc.npy +04379243-4726a178bb7b40544b3c42e318f3affc.npy +04379243-8b5c74d6fc057bb24789ee5c8d247b09.npy +03636649-94e8b7adb07de08e714531f0291497fd.npy +02871439-61ea75b808512124ae5607418ff674f1.npy +04530566-ffffe224db39febe288b05b36358465d.npy +03593526-ca00e43903812f9bf8f2e9a6f7085339.npy +04256520-3230b6c7f396afff19fb4103277a6b93.npy +02933112-a593528259cf4d78c0f947750540fb22.npy +03636649-8ef9c1ffaa6f7292bd73284bc3c3cbac.npy +04256520-c1ccf7d15c32b156cc2af5791bd669b8.npy +03001627-498755187e526e5c1cbcc2e1b14b6d41.npy +04379243-7c46b661b94fdfdd34528a88ad1d85d3.npy +02828884-b95994218ee416f492d9da2668ec34c.npy +03211117-274acc511daf0161bbf0c65ae96423ae.npy +03691459-61508357d7d9ff38a605f453cefe7e92.npy +03001627-3d63ad34e3deca1982db9fca4b68095.npy +02958343-492f36ac59d2d3eb450d7227edc25975.npy +03636649-2fc19897a2f384ebc77d45d65dc3714.npy +04379243-da9d681e20d2c123604b3895514420b1.npy +04256520-697161cff5d04992a4dc2316a7e66d36.npy +04379243-91fa004401e96d0797059057d5df0d8.npy +02691156-137acaae47b50659348e240586a3f6f8.npy +04379243-680d4a8b5a30601a4b3c42e318f3affc.npy +03001627-6398eb498fa1c291ca22b08889f6ea0c.npy +03211117-9716c06d43de24387103ae93fdb3bd5f.npy +02958343-aa78d4465ae18312711f9e3a79a13dcf.npy +03636649-2ab86b983d36642141b0e36ebdbf4b7a.npy +04090263-c5c335bfc5858d11137e0f55e7272392.npy +04554684-957ddf9eb718876dc2180858eb6a5f28.npy +03593526-c03bbfcd33f310155076fe09061f1a7a.npy +04401088-5e5c0391952208e81213f8f7891e7fa0.npy +03046257-1710033fefac979deed60df91eb05a5b.npy +03948459-2a66595c64d5e6ded957eaf7f4edb205.npy +03691459-ae39f8cad4fe0981332d76467c18dfde.npy +04530566-733105c0a74ab0a2b83ec978f31c7f76.npy +04256520-99a3e307a8e08afa575f974bef523d40.npy +04379243-22a19599946e4db6c3bd24f986301745.npy +02691156-6693d4bd6edce2a7fd3f94e9ae089f96.npy +03001627-eaf231f17fccb96d81dff5c2e57ad46e.npy +03001627-d2815e678f173616e6cfc789522bfbab.npy +02691156-7578bae68447de8498427765723d5e48.npy +04256520-d8a5ba127550669d55030a5efaf6babc.npy +03001627-6831b0aaec44c01f5d0b6dbf2c4992eb.npy +02691156-a5cdc19967a8f69fedf24d76037ce02d.npy +04379243-3c5b03a212d8cd3951f776d3ed05550a.npy +03636649-9b1c1def3467c1a7d197f67767b32741.npy +04379243-75f2e71073707ffd9ed6e8a0d47c5a7a.npy +02828884-9fe85429413af216cb2a965e75be701c.npy +03325088-482e8134a2d5461b14b35a7d7cea7130.npy +04530566-ce6e40c533159b2db9e8bdc9c4a49aa2.npy +04090263-86886a49bb69dce3fb5c1b0f759e2bc1.npy +04379243-f7b8a1d716dc1725aa7cb30470f3273c.npy +03593526-682de86ee8578339490ad276cd2af3a4.npy +04401088-5298e9c7eeca74f8ff2988f561e515f2.npy +02958343-f60f11a1a8c8f89992691fb966926839.npy +04379243-edb7dfd7fe00c08e25c8be43ebcd1add.npy +03001627-c8d6e4e789a0c6a7eaeab1f0c9120b7.npy +02691156-fae6ae6ef62cfa107b164268a44f7712.npy +03337140-cd37ee5f404f393cf3a0b1845ee9aecb.npy +04090263-da4294d14502707a82cb4f2e118e48f4.npy +04379243-5ce75eec38f8437c8a64c4f643bb7cf6.npy +04379243-11f2882ca78cd85c9c75eb4326997fae.npy +04379243-ec8a05151bdfd44779368d1198f406e7.npy +03691459-a12a46aa47ce021a0ac302bb9c69c6f.npy +02958343-47748464909a5af473f10e6caaeca56.npy +03001627-cbdfedbf2dbeed3a91f6e3ed62ffa5d1.npy +03691459-7263b5bed1c020d3fd8284eaee3b0fd.npy +04379243-ad6fc60679879c234e08ba22112c59b1.npy +04225987-eb6246b73afb6383b77008f97c3030c.npy +04401088-b45f58361ed3ae739d2375e90e0e0425.npy +02924116-dd932656e7f1d74452470de2774d6099.npy +04225987-54b9d9a3565820e17f267bbeffb219aa.npy +02691156-4788f4d5afd92e151df8f3faa46a0206.npy +02691156-bc16d2cf6420432cb87697d3904b168b.npy +04379243-72f0bf15522498993f10a8b8beb12d1.npy +04379243-dab06bbea57f6051d0b93fa304cfa755.npy +02933112-180154895560cd0cc59350d819542ec7.npy +04379243-ef02c88a34b3888a1b1a00a31bfed97b.npy +04401088-8873af9392bc7506f1cb19f636b1c2bd.npy +02958343-2e27309be42276bebecf71e2e014ff6f.npy +02958343-163786646ae2578749a5fc144a874235.npy +04379243-f5d97731def4d875f51f77a6d7299806.npy +04379243-e2d5de278cfff9cb55388518b8ef9c17.npy +03001627-816d1c517ef6bf7890a9ce3e4b15521e.npy +04256520-fb74336a6192c4787afee304cce81d6f.npy +02933112-1caaaa5c1da4dd2dc59350d819542ec7.npy +04379243-d950e75bf7eba6ff35836c728d324152.npy +04379243-60c942ccc194a8e88d4313dc14de486.npy +04256520-8aeec0b2dc06c3df9274d508495753d2.npy +02828884-1d94afb9894bf975e76bc197b3a3ffc0.npy +02933112-2993b6f0fa043f2744b0bdbb4386e313.npy +03001627-90500d52ac30dca9f51f77a6d7299806.npy +04530566-76dc1a35fee28991a5103c3a2f33a5e9.npy +02691156-132fc603f8f69b08e816c75152573ee0.npy +03001627-a9cc6920422b9d9c2af8b1d491b7ebc.npy +04090263-fbba8fc424ed0ad6f8edafa0d47e47db.npy +03790512-6a05091b7b1bae0352fa4ad29a1236d7.npy +03991062-71421e76243826a8a2c59a4d90e63212.npy +04379243-5c94122a5a3682bdb2d2900ee0ae7e0.npy +04090263-1e7dd1677a62d3caa672357dc73b83a6.npy +02691156-a05cb1f091b01cc87aaa57326478bd1f.npy +04379243-ca9bbb0ecdcde978178548484b14e6f6.npy +02808440-916c3b82c5ce6bda5be62ca6b91c7ede.npy +03636649-2f6f1fe66631572c6c5b8009db95f66f.npy +03642806-877b995954f127225df8529b323d6f29.npy +02958343-b48b8791a3b09753b8d3554bd033ee9b.npy +04379243-4639656b53d21ab1278d386bfa54545.npy +04256520-4954953090ca7442527e7f2c027f7469.npy +02876657-5ca994bd512be485db3bac7ad77ae88e.npy +03001627-4c97f421c4ea4396d8ac5d7ad0953104.npy +02747177-7a73f3cf362ef4fa619b1cc3b6756f94.npy +04379243-3cbd3d2da993a389fb05cb5458b1da64.npy +04530566-8676b1989d68f3e970c565b5a7d76650.npy +04379243-fc8b1310927ce3e6d8d12f352b5e1839.npy +03211117-c5d14b600ba28289ef2d91f96fdec842.npy +03691459-d233b0a03f171cef47e72126a394af4d.npy +04379243-c9e09052118e6fc112e2da326535f859.npy +04256520-d65ef2797ae836ca8930422448288ea.npy +04379243-4949aa2bb737317225f1bb0febd3472.npy +04379243-4775e71d37374444febad4f49b26ec52.npy +03642806-d9acee6657134387c664c3d4e2d59341.npy +04379243-4f7f8af38b1a13f67c1b348241918030.npy +03642806-b913c80eca0afa4a1b7e0829f0e4fe61.npy +04330267-48d103efdc593eb9397a815191739e2e.npy +04554684-ef6d0cac2707dd6ee262a7452d41c334.npy +03001627-7d4aff5680062f0b1143841839c8c312.npy +03691459-eae023e4c609a77799234ad1a4f88718.npy +03624134-ba521f73a0a69280f5125275d6943657.npy +04401088-36760a27d679f058c4a0b6f738c144f4.npy +04379243-1f0df5b240c73a5078dd615a59de5f05.npy +02691156-800334df5da57266a4642ec4b6f68a.npy +04379243-b6ee1aa4e11df2bf8f5708c6c7585cb.npy +02992529-9c8bd4fce744a7df5d4e1af18c85258.npy +03001627-663f02b2ed46f991480b0456bf1622f1.npy +02924116-4e1fdafd569814c241cefd10ce5d6cc0.npy +04379243-860995856455e258fc0004571aec2fa2.npy +03636649-e053e531fc4341b5fcb8d8c6d4df8143.npy +04090263-66e287e1d2e9c9f6e71e857afa9df271.npy +02808440-bdac92a52bc53cb4b362845c6edb57fc.npy +04256520-87f103e24f91af8d4343db7d677fae7b.npy +03759954-3484d12ad3b2f06b35cd53a06b1d2317.npy +02954340-7f9ddfff396634f17790cd6f6e8952aa.npy +04379243-fc95d34ab1afb92b9118eee0b123125f.npy +03001627-f4f1aba65ebe48eb70930286c914896b.npy +03467517-71d0016078dea05a94ca7929d4ba6d2d.npy +02691156-86bba8b007786db7be00b7fbad2ca0e8.npy +03759954-1784a6bea782ef4af50956e9de496e43.npy +04379243-21fe96bc7ca206cf4ce89debb609dbc8.npy +04090263-ac88c6856c21ab422a79dd7a0c99f28d.npy +04090263-8ca120d9501983b312b38b1d99376c0b.npy +04379243-143e612ff081f2fc3dd0bb3e608c7548.npy +03001627-8e1f9f4e3cd226bacb916d8f4f1ff996.npy +02691156-ff6ab0fe13f58e22962a5697e98a94be.npy +04090263-e01eee98a8d18a29a2d71a426315b93.npy +04379243-b7820dbf7820befb99860e9353bb52a1.npy +03001627-434cee44934612a81f98c0761af40e04.npy +04379243-591a2b1a6c44e5ae535089b1cfcbf17.npy +04256520-306a6efdecd98ab1456cbf78e1e89022.npy +03001627-28445d445cb8b3aa5de04aad18bd94c3.npy +03001627-986058a64eb343c6781b8c940ab86a39.npy +04379243-9dfcd3488a7109745b5b328c62af5142.npy +02828884-5ab38425eb09fe33cac2a982f1c2a5b5.npy +02691156-b55af8905ccc3b35102bb5032a53eed8.npy +02691156-88c4ef9645eee90866876073bf7a9ab0.npy +03046257-619cbd4aa6ae5578f5635ac8b18fdb9.npy +02808440-f96cd761f71daf3354d7082b34825ef0.npy +02691156-816f1a18692bca2abc0909d98a1ff2b4.npy +04090263-d0f3ee45d483cd659f433921788191f3.npy +02691156-4fb10ce02887e35efca1f1143bb6bc17.npy +04379243-36770c30c74a32e16dbc8927361b2733.npy +04090263-57c6c69a1406e9be21d9cbc846872d86.npy +02691156-78a63dc99b3b68962b600da24e0965.npy +03001627-48c0684d1c5e279dc3bd0b373cb604dd.npy +03046257-555f0083553a7cbbe4bbcfa1dc6a2906.npy +02880940-a0b34a720dd364d9ccdca257be791a55.npy +02691156-740e79be16a92efbf1f2e10bfa81e2b.npy +04379243-a7887db4982215cc5afc372fcbe94f4a.npy +04379243-839af4cf455c049347839bae1bc65257.npy +02933112-203ef2b06c3ad6033fe047712e43e185.npy +02691156-c2e047aa11190a0f3523242fdf9b75a7.npy +02958343-854881671316e926f63ee8a34069b7c5.npy +04379243-6f85f70a77782307f4ab13f4b49ac318.npy +03001627-1959a7d986720364c8687ff9b0b4e4ac.npy +04379243-9eb1ec4c70696799851f4ba6aaedaaa8.npy +04379243-6b4800452f4655e7d34b068b4d9c2c60.npy +02958343-5aac7e6813771b2f22cd6c209adfc63b.npy +03001627-d764960666572084b1ea4e06e88051f3.npy +03001627-e7aa94a2dd59a5ed492d9da2668ec34c.npy +03636649-7c23362b39f318cbb18d6f615cb18bdd.npy +02828884-88a00b80d432ed5a577e7964e0284adb.npy +03001627-cef1883847c02458cf44224546cb0306.npy +03991062-d6209472e79d0a2422b13c48c34706de.npy +02808440-9dc757fba512200b167a3045f56a81f2.npy +02933112-1e73a722906872b64da5feafe6f1c8fc.npy +02828884-324257d878597916bea0f59596aee501.npy +04256520-b50519cfcc841200e8f8c11a24c52ebb.npy +02924116-1ddcb6107e5b08f39206ca9600b83578.npy +04090263-5d3a612df6585a90cc34b900bb2492e.npy +02876657-7712db835816a52b250241e1ab69b97f.npy +02933112-19127cb1f535bf2c62c9e7b595148d6a.npy +04379243-5d2c769d1afa6e3742f75bc7df727ae.npy +02924116-6df43a1f0bc546a71759ca9eefe0e251.npy +03325088-7f10cd36ec471aacb7a867e9b35a1295.npy +02808440-f1910f9ad5c58ba7f5eed355a820c382.npy +02828884-b6c745406a599dddad5067eac75a07f7.npy +03691459-b8d62dc24152a3463d91ae2b92426394.npy +03001627-97cd4ed02e022ce7174150bd56e389a8.npy +02958343-aadf8736528b0f46857652684714945f.npy +04379243-bb1aa2cdf216d348e76bc197b3a3ffc0.npy +04379243-6bb78393aaff36b8f42467d8c501ee9.npy +02691156-c854bf983f2404bc15d4d2fdca08573e.npy +04379243-46f6cbaf4897aa45aae567e8dbab47de.npy +03046257-5f4711bd703bd262f51f77a6d7299806.npy +02691156-6a3028e1c7205b22ad6a38fcc21e6e9e.npy +04090263-df531a3c9ed88efcac074df1dc27122.npy +02871439-3f543bc217133f7369867582939a3cf7.npy +03642806-535edbd064647a2d21c4ab26dcc5566.npy +04090263-1a1c0ae2b0a3cf3c80c2e60c312b0f09.npy +03001627-74518f7c342b49191030665054ebb2a9.npy +03636649-1ae630bed26fcf4d448e1c9934d83117.npy +03636649-6c90f92219fd4ba74719088c8e42c6ab.npy +03636649-c02a408b63a91d294cccbece4754c7cf.npy +03001627-3a96b4ac78928fadcfd33d85f931f6e8.npy +02876657-6d3c20adcce2dd0f79b7b9ca8006b2fe.npy +03691459-9a8a760dd2094921bb476b1cb791329b.npy +02691156-967b1afce4221816cf67c0b63878e138.npy +02828884-263f629d385be2b1601104cd2d998272.npy +02924116-fb65524daf2a034bbfc1f7b38863194c.npy +02691156-26048b00f9227a9f8699933784576e73.npy +03642806-67e882442eb4c03255e8ddeaf1791474.npy +04379243-e7eb326a867912fe16b2b5432674ae6.npy +04379243-4475dea2d05c1ee4fd9792d1e260da32.npy +03636649-300a2c57c5c0a31c35836c728d324152.npy +03001627-57dfb295c3e699ab2875319f84a135b4.npy +02958343-6c28f87aebb33c294386e619c2d3f83e.npy +04401088-b159743a482e73baa56eeaf8467b96e.npy +02808440-fdcc9d0d2e24b4f854d7082b34825ef0.npy +03691459-90a050674ebcfffe475649efc0ac5403.npy +03211117-df8e098d4dbcb5b2ccc4d915989bc424.npy +03001627-18845d9336d8be637b11ae648ea92233.npy +03928116-9b3e41030538e8b459a6208793b9dfca.npy +02933112-515df524aefbb9c2376a431c347bc40a.npy +04379243-95301825e69b3b2db04cb542e2c50eb4.npy +04379243-f1bfec97b7e9f7b776a402eb60ff1f9d.npy +02992529-f973c91a4c239da9dd14866f469b6370.npy +02691156-151550551758af098b96ae1a0a8b84ec.npy +04554684-5517868119f44388a027ae047c88a1b9.npy +04401088-b514d253eefdbfdbddfa02c62bdf0f8f.npy +03001627-cf975250fbeec5148b01ef724ff374fa.npy +02958343-e0762bd3cd381408bda72093f9b5aa73.npy +02958343-557315ec87e7ab9d3189f4fd2261a1d0.npy +02933112-a69a97674b732b6e951c1fffab4f5807.npy +04256520-b58291a2e96691189d1eb836604648db.npy +03337140-eeffac7af3c013f2492d9da2668ec34c.npy +04379243-3281ed5a4af3494f67990f5b8451542b.npy +03001627-1e7c8833d231178fdcddd0cba5e9fbec.npy +03636649-ca8e73b360017dfafcb8d8c6d4df8143.npy +04379243-650dd98cb20580cb99860e9353bb52a1.npy +03211117-d4d94e7a1f75a67e3f7b7c3393bbad8.npy +03325088-3e208d2bcf317a2b362845c6edb57fc.npy +02691156-ef20d432f2a7b1752c164e0c5ea74611.npy +03046257-fddee751fb9c7244b3c42e318f3affc.npy +02924116-3c45d466c7e1c27367aa983983f9bf36.npy +04530566-8d95b6ddd06a8a80f57109a0257e61dd.npy +02958343-4de80d6104368f4be194052f3f12cb2e.npy +04379243-1bc326fc94e0cfc1cf5a37a70014c623.npy +03691459-e30bfb0ab456101cc0b5947ffe18a468.npy +02808440-2901f503b077e7a0fe52ffd0e748a1ab.npy +04379243-a003e49331f19341b0449d422c1e5657.npy +03211117-bd3df021605a8aa24c619b8a18eba62d.npy +03325088-2439d924018a3b198616812464c86290.npy +03207941-503b4dff71b404dabf195d81040cc60.npy +04004475-dd8927d6710e354479510444cc61f839.npy +03991062-1e2ffb73f4912932cfc0d4d561c11099.npy +04401088-a9c181d7378f92cfbc59a3627d9edb6f.npy +02933112-71bca48ccefa3cd080f94e6470f7d263.npy +03636649-25bd069704996e073225afab722d9fd2.npy +02924116-4e2154c96b2268ba52470de2774d6099.npy +04379243-7d358a01c9467815a9505c473725122e.npy +04379243-57c21a71a3518b6a1af550e7b4aa14c.npy +03636649-9004c69559c8e6f99ea7ba54de81fa1.npy +03001627-7dc91406f30074777b707c797539b200.npy +04379243-1c6eb4cd121175f5d009c98a5b96836.npy +03636649-f97506704760741b460fa882e24b7e4a.npy +03642806-b9b521a7e25caf837b18e772ada5a339.npy +02958343-eb46e6071b4f72659bc0c5b67eaafbc.npy +04379243-37ca38d0074d19978c9e244e3fbf98f0.npy +02691156-49131e925ef3349566cf1b4a8fc3914e.npy +02958343-80e839edb7aeae0bc54427e2c0943fd5.npy +04379243-29367fd1bfe6b23827775562146ecea9.npy +03337140-bdd91f5a44301af0ce5d6e9371bb5c33.npy +02992529-692e5fc16bc6ebd23737433332467411.npy +04379243-1f326aac412e727b62ca3aa650ba65f5.npy +03691459-fd421313164e2d7f1be6fffd725195b9.npy +04256520-a53114ab5cfe2048f51f77a6d7299806.npy +03001627-60a5795c905f3bb157f5033576317e1.npy +02992529-7f5b9c8fdb46cf7c562c8e1ac545ef78.npy +02691156-ae4fff8877a5a64b3ae1361afc45ac52.npy +04256520-dc097b47bf15ec8e7934a0d24a61231.npy +02828884-a7096667d133db73cb2a965e75be701c.npy +03759954-98b0e21d5ca46e222afc25cef0918375.npy +02924116-74ec0dd3a200686f58c7dd2ef106ede3.npy +04379243-d6c68f9d1844c3bfcb002c1e2b5fc68b.npy +02747177-126ae26edcd76f27ad5067eac75a07f7.npy +03046257-7d056103f42dff83788a9e26a791a23a.npy +03467517-dab53ffe5ceafeb198e9e7d2e581bf6c.npy +02801938-9e4a936285f32194e1a03d0bf111d109.npy +04379243-254bf8d40be1fcb025a517a55e2a2141.npy +03001627-9ea39b8f5a9b88d56eb9b08c8a74d159.npy +03691459-460f07680e1d50866f6dffbb7673354d.npy +03001627-1a6f615e8b1b5ae4dbbc9440457e303e.npy +03046257-ad41efed0f69060fa86b76551c6a3b2b.npy +03046257-44930d69dfc35c71f5b59380f08b08f0.npy +03691459-8c919e992db7cb081e5b68ee10358ea3.npy +03636649-b96c8cc6529167bfcb8d8c6d4df8143.npy +03636649-9d9ade887a3fcfee89d70669fd6a0e5a.npy +04090263-4081d740a9bbdc7eb5e784742c8f0ee.npy +02871439-b2f525e82668cca251aad687ca458e7d.npy +04530566-e23e4845d3a990d25fc186cfb5f359d1.npy +04256520-7fe0602271e7b31f52db1d2b4104f173.npy +03928116-14755c2ee8e693aba508f621166382b0.npy +03636649-7691ae0488f3be56f92cb63577c2f16d.npy +04090263-cba7b6437ab3621ef0fea2ee98610322.npy +04379243-5767cd2fa0c64c92a0263d691f98a9af.npy +03211117-73895e2bed7007fb2df5ba101cd14a11.npy +02828884-88134efda194f8f422f9a913dd25c68a.npy +03948459-1dcdbb1ee028412253630d3fa9f23590.npy +02958343-b57bdd19852e0084f7a5eccf728c3b75.npy +04379243-5153292b91b93dc772ee08e78374a212.npy +02691156-bc58ff3369054fa68f52dc705c3109b9.npy +04379243-d43d8df70f357bcb83776366d314ddd7.npy +04379243-575e42b02249f2b3b87a068961a20739.npy +04379243-339092b2aeffea998629cea277916e93.npy +03046257-ad385337f0737d9df546596ce7364503.npy +04256520-b146fb259f64cefaeb6c29873b08c02.npy +03636649-c8b19dd635c346a4bfe7d977deb71340.npy +03337140-eb572820ef16a7bf389e94c9d197b196.npy +03211117-5664e1d072c3f39dc39fc02d4c9e2419.npy +03691459-ab651261126de20c145adb610a878e88.npy +03211117-eb75ac8723230375d465c64f5322e86.npy +04090263-58f98b4bc889c7f580b72a37a25b7e72.npy +04256520-e1a653600512eaccc862eec8232fff1e.npy +03991062-23d866397feee7a4a2c59a4d90e63212.npy +03928116-b2203c3500e0040a1baefda9f87f2d8c.npy +03759954-dba3e5a0273880c8773583ede7320303.npy +04256520-fce0bff765d0c49777ccdc3441fdc624.npy +04379243-5b9a7b7952996844d802aa676be38da2.npy +03001627-b4ff370c931ce57d1705b902738021f.npy +02958343-f91d1032b7cfae618e4e882feb9b406a.npy +02691156-5ac0cd21410b2a6a341877ff7a6c751f.npy +02933112-d5fc42532aac8ea8ad046fea8c3e99d0.npy +03948459-19e45672a3109f18be4927dbd39f74e9.npy +02958343-2dd397a57b35e57f2c6000457712c234.npy +04379243-2e3ff4aad6da120784a05e54516915de.npy +04090263-a2f3ad5b5e88482c30ae0c71c8e3e486.npy +04379243-608f7cd5e647e4a4e8258fa1af480210.npy +02691156-1930a979c7a9a2d662b600da24e0965.npy +02828884-cbf9773bfebd4321cb2a965e75be701c.npy +04468005-7d337d1be2d02b624e38abcf1c844caf.npy +04379243-a9dcc147e83c2a0619fb4103277a6b93.npy +03001627-20310d1bd22d8e28890eb7072fc1df21.npy +04256520-15410f94aefb4982ded10515704c9720.npy +02992529-fc1675526d043e81a2811061ff7e0824.npy +02924116-c970097584110627b012af5689af8c1e.npy +03467517-75b204a6aadb6702d3193ed047bef161.npy +04090263-fc1cd79a8643fe66def607f4d4140edc.npy +03001627-90eea7c7aa913fac57b8f616df7adf9a.npy +02843684-9fe2e8fb0e94a179b9e8bdc9c4a49aa2.npy +02691156-cc60baa1a796f5c14c3a35cee92bb95b.npy +02691156-f2f6684e930651df3dffb45955223d25.npy +03001627-108b9cb292fd811cf51f77a6d7299806.npy +02871439-28570547091748edc2cd59b38b35eb54.npy +02828884-55c97131574186c0d4d8765e3910f617.npy +04256520-6f27ca8835f0d0b54b3c42e318f3affc.npy +03001627-d76ec8373d0a8f0dbb44d2e3e3af4857.npy +04379243-4b2222cc86f2324f7383fb84b914b75f.npy +04379243-746f953a49a68cc2b76e29c9c43bc7aa.npy +04379243-de1d6e1294552606a625499f7117f27c.npy +02954340-357c2a333ffefc3e90f80ab08ae6ce2.npy +04379243-ef56ffb992754ef9efd9e6e4dec9682d.npy +02958343-4c36e3b0210fb9e899232e04f9a28249.npy +02958343-7a756a1c54cd3a5a1b3611fc576bceff.npy +04379243-242b7dde571b99bd3002761e7a3ba3bd.npy +04256520-13de905fd21e501567a4cd2863eb1ca.npy +04530566-1c89943a24952d1737f4612124cea14f.npy +02933112-6bd87f32df22ffe2854a6619c08bff6d.npy +03001627-341ecb71545d84835ecd29875b6f0d44.npy +04090263-3eb4bf4ca864e428ce168de955fd5025.npy +03636649-d82a17b1f646e95dfcb8d8c6d4df8143.npy +03001627-2a2d705d0238396488422a4c20c0b1e6.npy +02933112-21d4a168aa6fd6c74da5feafe6f1c8fc.npy +02958343-b6abe0f00fd452fa4101e38beb790a92.npy +04401088-21056b8560bdd1a9f63375fea17cbfe4.npy +02876657-92472817f72dd619467ca2ad6571afff.npy +03001627-e40d5fac8951692e3849910c5019154.npy +03001627-3b2710b509c3df0ea5e8cf3aa1686d66.npy +04379243-48600b28f63e0dd2de98d10ab5975b59.npy +04256520-1e887a97e283f6dc4b3c42e318f3affc.npy +04090263-a4509077129f900932dee48b245ce100.npy +03001627-fead8d07aa53de5871c3cf047830ec1f.npy +04530566-834dead664b43efb1ca19e5e5c1d5766.npy +04401088-4b72058b03234d188a81847056b4708.npy +02828884-be2bcc5a5ddedefa80065a186bd67f86.npy +03991062-3000b6de1c5ecbdca2c59a4d90e63212.npy +02958343-b09f4d5af99be6c5f5f45e906b41d1f0.npy +03211117-1a92ca1592aefb2f9531a714ad5bf7d5.npy +03001627-e80ade8966a54fe419fb4103277a6b93.npy +04090263-897656f468deb1b9e96eacf8990e6676.npy +02828884-91e169ea3ceb587beff42b9e13c388bc.npy +04379243-9ce40bd942c332644ee9d52ff0ec4dcc.npy +04090263-520ebb92353e7fae6f21883e4b04581e.npy +03991062-5488022c54116756a2c59a4d90e63212.npy +02958343-49e8bd4cf55ea566d97f019cb91636fd.npy +02691156-51ebcde47b4c29d81a62197a72f89474.npy +04256520-a3c1bd440f319a39dd7092ed47061a36.npy +03593526-151a80ff1ad2fe11c8c4893204f16cf.npy +02691156-95a6c003f5bd8a4acef4e20384a35136.npy +02933112-df55c6665781293cbe53b3b9f1274310.npy +03593526-be28bf161b022a1c178bbb7623060b16.npy +03001627-969375970515e5f6492d9da2668ec34c.npy +02992529-878135eab6ae9aa181471a5ba59fd0fa.npy +04379243-7b3dfbd70333485d219a1300d9489f4e.npy +04379243-dce2d814513f5035bfe64eef3e5b93b8.npy +02958343-f4814bc5063ee3a95f0ad3f281ff385b.npy +04530566-7380c6bedbd13059eb2c303a0e0d287b.npy +02958343-fda43d663587c7a9caf180c847b8b75.npy +04530566-e50e4b01588116c69eadbed0f2d15378.npy +04401088-6bd7f7a17a7bbd2d68acf22a03600648.npy +03636649-e4d491fdfd795a9339de811989288fab.npy +04256520-89b66c5a15e9c00b9b43c20267c98bff.npy +04256520-fe56059777b240bb833c6c72c4b62a4d.npy +02871439-d5064a4f00528425e89ebcecd11a393b.npy +04379243-c0eda75ff5b23100a6536c847a708e24.npy +04379243-179841c6d26cada5d75fa3d7e144089a.npy +02958343-80b5df2ecf1051fd61c6c61410fc904b.npy +02924116-9525a66bc137613399ebcb8df4d39cff.npy +03001627-3374905da20ad76f3c9c1464e55d580.npy +02933112-5366e82cfca7382729f1ce9399524695.npy +03624134-96eec3afdff1ceb0d7d3985b6fde9645.npy +03636649-e688f147080f123828eb8d149efa4062.npy +02828884-1b6a5fc808388138cb2a965e75be701c.npy +03001627-45833f137eb7b1fb77591d1bf8931b62.npy +03046257-b4777d47dec08048fd0c7dcabf865c9f.npy +04379243-4c907aab76195556d728db1e986e0b74.npy +04256520-f846fb7af63a5e838eec9023c5b97e00.npy +03001627-fd244782842c611b6443e5551f9d3958.npy +04256520-f8a6cb92786bbafce8f8c11a24c52ebb.npy +03636649-6bf0f3417f775d2c2cd2160e449d45ae.npy +03991062-a3cc533ab668af4ec0708f7bc962e512.npy +04090263-471f57562c00a5c7bb6581a048a6fb18.npy +03691459-ea95cdbe8f4114107354c46aadb2b2fd.npy +03642806-ab9321d89df4d58e78c854de246ffde1.npy +02933112-89ddbdf6366df2a93c2e50348f23d3d.npy +04379243-53bc187c97cc02adda5d247a475c516d.npy +02958343-dca8ed788347b28c171cf359a50c99bc.npy +04379243-d5c3aa73e043303b7ff6ace05b36a5.npy +03001627-7293291b3fe8233fdef1c01cbd4ae0c.npy +04090263-68cf8f5e1bfb9ff8e71e857afa9df271.npy +03001627-22086876a4f3bba0504721639e19f609.npy +03001627-265c564e26071961e27790b0ec8671f7.npy +03636649-aa6cdecffb9d4e403ec7ad443e0ae81e.npy +03001627-bc743137d2070eb1f51f77a6d7299806.npy +02691156-718b6f112f70146c62b600da24e0965.npy +02691156-f1a4a370f9e50890686c25eb09ee7de5.npy +03691459-ff8251d486de70545272b3489d12484f.npy +03211117-e2e40536be6daf7615000ab5e56184f5.npy +02828884-9bd9483c8eeeb703cb2a965e75be701c.npy +04379243-1a1223b411a9cf92e7c7920f6a65a54d.npy +02691156-db4079b8c7d3d674ca8607f540cc62ba.npy +03691459-1f6b0aa7568e70675c91d2edd70c353.npy +03001627-46c7367eede2d9c5ca2ed12df13a916a.npy +03001627-e8c1417f4eec96d228a7992bee4d8cde.npy +02871439-a3bfe9cd86ae43ff36ea1eb6542fe7e.npy +03211117-631ebdea5af51e499399ee63318a21b.npy +03211117-2cfbaf480d94552c43c8f1cd479ffb1e.npy +02958343-330a8f1243e7bf8b2ca8bf2993ca245b.npy +04379243-df03ded86df8fbd2ebd284456950c944.npy +04090263-3bdae6ac0efbaadb49a3c1009fa79820.npy +04379243-2555c9df5fa919692250bf58700b4d8f.npy +04090263-e69cc1d337df7c83cc34b900bb2492e.npy +03001627-2a75b2bb82d7f77c3f9d6e0ade5188b0.npy +03991062-129f9498c8f842b837ab51e1f8240a33.npy +02946921-2eeefdfc9b70b89eeb153e9a37e99fa5.npy +03001627-43e74f15a986eb626a90f735365ac29e.npy +04090263-6b14119033dccaa5d735fa1ab17311ec.npy +03636649-f7627b6ebf92fca6d3f6d823f04dd65.npy +04379243-9bcd5f77b6eb92ec415434d4384bb66e.npy +04256520-a6cfaf6913d9559b7e66b3e5c11f24d4.npy +04401088-d7b2a9546b6f68bfd0659574aaccef0b.npy +04379243-932079d89ba2e7ead16260d4d73b56.npy +03691459-bdfa20e11d204ecd35cd53a06b1d2317.npy +03337140-4106f81820af1541ffe3432ba4f2e6d3.npy +03001627-3dc39c34c37860da2ef1c225dc7772c5.npy +04379243-5f62b83cebad8dd1473f10e6caaeca56.npy +04379243-88789f9c90fd644550c5faea6c3af4f8.npy +04401088-aaf1159cdc4e6ce5b2ff1d6fc3caddc1.npy +04379243-832607835e99761c276b6f6d90ee3a83.npy +04530566-c89c8eca488d5072cdd34f38f87d26cf.npy +02942699-f7e2afd70e37f60ad2b6f4e920e50f96.npy +04401088-c3ded7599240c96f8bbff91b1135bb3c.npy +03001627-432ed2387d4982a635836c728d324152.npy +02808440-fd415d5823bea51f44221bef0fa3c36b.npy +04379243-9fecccf2e75e7c8e1099144def22d76.npy +04379243-b1a5b2caa2b7dc95f51f77a6d7299806.npy +03211117-c4e4d46434173023ddc138ff009971cc.npy +02958343-38f9aa4c68327bec760191d847b7480.npy +02691156-4def53f149137451b0009f08a96f38a9.npy +04530566-d795b03f47dc7cd5525c5b030c9fa146.npy +03001627-c54a464d63efcab2c389b3ea958c8248.npy +02958343-ed799c077fdf7dc47e5246097b57ccd.npy +04379243-64e572ed8f8f23bb815b2b467e8e2eac.npy +04090263-aeba4ad00dae0c78c79f92df566f8c6b.npy +03642806-195e2a65e5396271bc7eb7ec22211551.npy +02808440-27e0851e99c4d04470374408dad00379.npy +03001627-8ef2169d274aa2e9b16dca03855925bc.npy +02871439-5e60b8632d1d2c665dd0ef7a12d95543.npy +03624134-24c6c5c56fe9bd3c37b23f392db50c63.npy +04530566-a51410ca51a40c2529412f6cb23454eb.npy +04256520-ce99ea72f222e7d58bf939d21e50c410.npy +02691156-5793a442744f4bcf7af203abeca5ce86.npy +04090263-49e4708854f762ae9c27f9a5387b5fc.npy +02828884-b51ae78137662b05d2b12aa6a0f050b3.npy +02958343-4bb89ac11d478c0a71fc473170b0a51b.npy +04401088-ad0af9e3dc8473296841a8d53aa30506.npy +04225987-cf04a6f4312be2c0d6f39b72607d85d7.npy +04379243-e696a670af11d5431234386b1304ec62.npy +03261776-20e16ae7c65d81269c1db271ad9472a7.npy +03636649-70e29a12260f811d8f1b70ceeb5e9a89.npy +02691156-e380f6fa720e1c15560a4691498bd2fc.npy +04379243-bb794c54a628a3db6ff454af1e8947f3.npy +03642806-68adcb59ad19c431676394b063daab40.npy +02691156-aea5192a4a7bda94d33646b0990bb4a.npy +04004475-2b1e3a43701dd4c31f49b1a1e04897b9.npy +04379243-e501ac06884534b5d5f962f170e40e8e.npy +02933112-688102337377c19d1d860ee2ad2a42e1.npy +03001627-901cab3f56c74894d7f7a4c4609b0913.npy +04090263-604d962eb17dfd5166c0c88d96ba938f.npy +02958343-decdf28e46edc632bda733a39f84326d.npy +04379243-c45633a0a85fb4d0631c3671ad15929d.npy +03207941-b1080bd937b04a44575f4e5007488531.npy +03001627-1a38407b3036795d19fb4103277a6b93.npy +02958343-fb8adbcf67d858fc28044fe9244db50a.npy +02691156-6fdf55a7ca1e64ff7d7b38cb4a2969ae.npy +03636649-7869e39e4fcaa1b7ab26a588d1ab0ca4.npy +02933112-8a3f6cd19f3f92fe7242f2b1500945dd.npy +03642806-6b78948484df58cdc664c3d4e2d59341.npy +04379243-76338ed3326689b249524cfd5973a145.npy +04379243-a16a6d438d57667bd3299846d5c00f08.npy +02880940-a98b76254bcd32c05481b689f582aa44.npy +03636649-a4c0f3aed58f0e092fdae21c212bf119.npy +03001627-1cc3513e4d81516267510d684b7bfd11.npy +04379243-914293e9cb32a51c880e543f747aeae.npy +02691156-4cbca5f95cd6cbc6e59552931a2cfd3c.npy +02828884-49eda923afb7fd21456cbf78e1e89022.npy +02876657-da2703e6d87a28e75887f1f81e7530ec.npy +04530566-bf5112a856a8f6a3819d76d0172b8abf.npy +04530566-4140a889b730d00cc613c8345c33a85a.npy +02933112-77342f11ba666144d71237b3923fc09.npy +04379243-57dbdc49bd549a508d1542df8403619f.npy +03001627-6b9149d69d3140da258ce5fdea186c4d.npy +02691156-cf71f5442c4120db37678474be485ca.npy +02958343-515492715a04d8756a2345809e2bb169.npy +04379243-3c04f4e0d183976a7e7cb173e141227.npy +03001627-3e72bf47e31aa669f4b6538438a0b930.npy +02933112-80a3b5b036021b8e404dc8be84d677e3.npy +04554684-bb609567ff4d46a0a44768a940557d1c.npy +04379243-33b081062b2195e71771ee930e861b13.npy +04401088-5828a8259ba570bbd24e3068806a8c67.npy +04530566-5e8ce498a93fb7eae1a9c234926c21e2.npy +03211117-6bc1a795d199d952f97ef3b999ddb957.npy +04379243-26305aa1754510f79b3e1be3524f72f.npy +03691459-9f90d7bf89231ba94f5aa6ea4540caa.npy +04099429-5a7f14f4b25dd99ceae5cab1248d1ec6.npy +03211117-b08085c7aad830e3f45db6a75d78cb47.npy +04530566-92f08b4bd8aed9bedc2616ac929c8116.npy +04379243-a4f302ce157687e0861ac00f334ea98c.npy +03325088-a06f174eba7c6553b362845c6edb57fc.npy +04256520-a3a22ad51e59d79a2fe54017cbc6c7d7.npy +03691459-d69d5cf7868651effd28950562697757.npy +04090263-d03854e6d6c6eaa19be81fcc2b07ba08.npy +02747177-ef22cb2b0800568f63b2acb037dfbcde.npy +03046257-8883b1a1a421a178ddd3f1aa46ac1f89.npy +04530566-efa50c4e3e691d3bda1b3e013aeb1e59.npy +03636649-49d9e5b7560eaa89819e369e3c49bff.npy +02828884-b58a0307a86959bd564f6f5de611dfed.npy +04530566-ca3d2f904f53f945d02db4eaa8d7ba76.npy +04379243-ef575c402b734f8d810b14a81e12eca.npy +03797390-4f9f31db3c3873692a6f53dd95fd4468.npy +03001627-131edf0948b60ee6372c8cd7d07d8ddc.npy +04379243-627b977736bac8b0a1f97bf2d7a10a96.npy +02808440-c534e117a4fcebf67843fb4efdc19510.npy +04379243-50f52f9ce377596fc955e5ed03ef3a2f.npy +02808440-95b7632f605a0223321831d2245cf06.npy +02933112-9f17f45a28d063e7391e4d6c585a697a.npy +03001627-52469c47362e41e719fb4103277a6b93.npy +03001627-3f60205b1eef5555a4bf007e7299d9cb.npy +03001627-60e36f3ad1dad5cf71f761119ebf0b45.npy +03001627-3f55885c27d84e5951ae1a6e89264401.npy +02924116-65af4e2e5f2e31431e797b014c500fad.npy +02691156-2e3c317357ecb038543941eaaf04581f.npy +02933112-24b3f8b6bf4a9a7391a3d45e8887248a.npy +03001627-325bf2aee84a1fcdfebad4f49b26ec52.npy +04090263-58f7db3c6be48a83537e3f6cd50ed63c.npy +03636649-9802abad61f4ea7c37c99625b0c170be.npy +03636649-7260ad08488a3156f78e32cea3be35af.npy +02691156-78646117554e23162c00431da4ecd526.npy +04256520-39a79339b49d7cfbc16a7f7cb5642902.npy +03624134-ba31cc5e739da65b8295dee32711a98b.npy +02691156-b6da5542f0a81fb5aae46a5cc955c766.npy +02871439-5b794f8cee0075b53e96e486ca7cfab0.npy +03467517-41262de6af84aa8b57e59dddfaae7826.npy +04090263-64e5444076a4f4f53d69fb2c36f9ef2f.npy +02924116-de287261fce4d8df114c8eea6eb81d0d.npy +04256520-7b2ee63737854db3bd16d4490a10a752.npy +02958343-5c8f71dcfe980f714f3a54559bf4cbcb.npy +04379243-2e666b458f1641f248cb96c78f6ddc11.npy +02691156-49f400e6574c75554c3a35cee92bb95b.npy +02691156-b0b164107a27986961f6e1cef6b8e434.npy +04256520-65ec93f47687b6b4926f354063916d1d.npy +04401088-7a458ea841e4e67a11ee7ca4f000feba.npy +04256520-ed394e35b999f69edb039d8689a74349.npy +04379243-a4fcd8afe8b6de585beaf00da5b709c2.npy +04379243-8b7175b6c74385ac87187471eb78d702.npy +02691156-cf310fe73705eb85a099666f6cac75b0.npy +02933112-d2dc852235fe39ca1112a51947cf2b61.npy +02958343-b7f957411c3353432fedd0aa3d156746.npy +04090263-e9fd75b68e06c18cb056c98b2e5e5e4e.npy +03001627-f4db2e2e90e83c759b9f2eb77f5e247e.npy +03001627-bfb93705c05ecd0d31e7ccd4db190c0d.npy +04090263-36e0d91630f7c958d4ca42bc1bef451.npy +04401088-453c590f0a1b37c1e0c2427da07ca8c6.npy +03691459-78d16c052215997b925c6624a25951b5.npy +03001627-92242be674537e3df6e4c3538272fb27.npy +04330267-3c7cb5ba87684ffaf5f4f288fb912362.npy +04256520-9d77156d64599e9b1206ff076758ec85.npy +04256520-de5ac6717fb307e6b01c58badc8bbc39.npy +04379243-9e0284056aed2a097543d7dbfecfffbe.npy +03046257-10ce229d913c23d56b08f078360ade39.npy +02958343-fea2f9ae1e25b74c12f962c15d41de4d.npy +03325088-f0d703dcfae9e2aaf38c4a12750d961b.npy +02958343-3c310afdf363201cefe5f291bc2f5fd0.npy +03001627-894f033f10abba014038d588fd1342f.npy +02992529-e8db0c85b07ac581d409d3400adf2d96.npy +02924116-4d2d4e26349be1f3be2cbcda9b6dc9b2.npy +03001627-ff3a6eb4556b2c0eb04cb542e2c50eb4.npy +04379243-ae5b18b3515c84ee39683a06407f7f3.npy +04099429-b3956a68fc4a62ed861cd78a675a5737.npy +03001627-cce9ffdcc7ca8ddea300840c9d7bfa74.npy +03211117-3cbe9bb95e5004eb342398ca9dc32672.npy +03046257-81dd20fc58ca6855c0c2cc2dfa2c0319.npy +03001627-3037c7d4d9dcb8f535b063aa516d32d0.npy +04379243-30e0f3d959b16c64473f10e6caaeca56.npy +03337140-2fc468b98c0cd227c8830fa1ef6e3e71.npy +02828884-ed9e22eeb11ee9669fc351f487d31208.npy +04090263-79e07478f6a0a2305ee5dde2964c294c.npy +02992529-25e03c305f41c5dd226bc3b9ce9ff2a1.npy +02691156-29f514bdcf72e779bbf3143b1cb6076a.npy +04379243-d826ce80b06bec855e5dde99dbb2920.npy +02691156-8e50f707e506f65f66cf1b4a8fc3914e.npy +04090263-b3ae08dad4ceb33c16b34c3751bc447d.npy +04330267-9aaca16b41037ccdb4522b651100b435.npy +02691156-313758cb2eacbb576d3e60add9f0d715.npy +03636649-a82af4e7e81334f8876b399a99a15c0f.npy +02747177-36d4caf867e0afcd56f6fc4b4ce1db04.npy +04256520-42486ef061ba8d2e9deec47d8412ee.npy +04256520-8568498cce4c2441ebc1a7ae7c4c250d.npy +02958343-56e0fef0632aed0f1d27be7764701cfe.npy +03001627-b09e3b329eb11c7dae659483f300cdd5.npy +04530566-5059b4e973a0fc7f928a2a26ac296b52.npy +04379243-c177762c0445d57ab20aa91e9e90c311.npy +03046257-f4877fa753aa6f515445e46058840642.npy +03325088-f095f7f95edff9ae54d7082b34825ef0.npy +04256520-11a47d5cdd42a5104b3c42e318f3affc.npy +02958343-3045cc22be31372859139efcde1fedcb.npy +04379243-325d922d3092f7bfc3bd24f986301745.npy +02933112-ab072b1506cbfd921b7554913e3d38e6.npy +03001627-ba40e15e28eeaabb9fad3726e97eca06.npy +04530566-b270ca5a6051053d88e2183678696c9a.npy +02942699-d680d61f934eaa163b211460f022e3d9.npy +04530566-3efda6b0c4e70f7decdcd70d755bfc70.npy +02933112-b6ec38384c0904a666023b6076341c23.npy +03593526-1dee9988a1ece53e4b3c42e318f3affc.npy +04379243-293f2e28d5570bfeaff8240d22dfd73.npy +02942699-87b8cec4d55b5f2d75d556067d060edf.npy +02828884-68df3d5c8ef4cb307cd7dbf0f3d6d9cc.npy +03691459-9a017f96829a34a2b17f090763e2921e.npy +04225987-f74a5dfc0094e2d5561dce3fe08634b7.npy +03948459-35b5b01801304bd9faea005b8f19889.npy +03642806-51be62d456a272fe96a7d658c4b5ee82.npy +02808440-f356aa82f68fe7d9adbcc9ee28cee4cb.npy +03211117-d4d8dd7053596249bc1905b3bc668597.npy +03790512-485a6b42bc4f7e59d373c34785838ee4.npy +04379243-348b2880842cbbca4ca84d60642ec7e8.npy +04256520-2f87e4958b3c1d80b5da5256e41fa569.npy +03691459-b0ba01e0a7f3553897950841baebd2bd.npy +04379243-276d614d42ecfd1490ad276cd2af3a4.npy +04379243-67eaa2b16399f3e88809fffd0cefbf72.npy +04379243-e448e3e40395d4d679414e04132a8bef.npy +03207941-fa01ff7f1d217850df3a1b0d597ce76e.npy +02933112-995a40846929e9753da27ece6ae88fff.npy +03948459-425abc480a0b390d7cc46b39c0cc084b.npy +02933112-dfa0bf0f2b48ea33e3a031805ace4a99.npy +04379243-3e504f94b63c77c34b3c42e318f3affc.npy +02747177-c5d49f41924ce872b7a97a3c2b004475.npy +02933112-c66e77615d80399466e506c113d5d05e.npy +03636649-412cac2afa6299c3f42a90fe4baf4591.npy +04256520-3aebadcd37bd3edd8f5ae2c97614087a.npy +04401088-74314be9ad38b02171eade9e9bdd0f45.npy +04379243-99ebb9278165f04f72559100997b742e.npy +03001627-22b287d232fd062bf51f77a6d7299806.npy +04090263-6a7244726ee48fc560238d65d99cb6ca.npy +02958343-c41580019d43348d3a3afd30f2e86bd7.npy +02958343-a2f658d639f46d95c6d2c2010c35d0b9.npy +02691156-daeb27ada93505b1e24e4b657f0a298.npy +04554684-1ba5e13255aa9d4840b559ef47048b86.npy +02958343-53507d1d09b3c2671cd97374110efb0a.npy +04468005-cb800fda25e740bf9f97ca916781e800.npy +04379243-1ae9db7da9a6bd449453695c10a417d6.npy +02691156-4d0898c7cac1199a4b0853084d4042f7.npy +03001627-8ade0afeb517ce00aab45a6fe87e3c10.npy +03001627-7e81b5f79e6899cea570c6c691c987a8.npy +02691156-ccf4e9c074c3395c26360e1e29a956c7.npy +03691459-bc522596f5da2ecda32913968eae7f30.npy +02747177-99cf791f4725be642ad490d4d7fae486.npy +02818832-9c203361eac308754b8a0e1f781de28e.npy +03691459-7b7d7bc551ca91b3a03d35fe89e56e4c.npy +04256520-d01ce0f02e25fc2b42e1bb4fe264125f.npy +04379243-2425d3befad0440febad4f49b26ec52.npy +03691459-b0f209faa41b8f0879da6431b0766445.npy +03001627-eeaac38269e8f591e55fdfa049133df8.npy +03636649-927e0654427c4d0b82241d99b4e87f38.npy +04379243-22c2431d6be8a3a8d6983f351200ac6a.npy +04256520-ccb08f869edde5e6d8adf1ca87495d41.npy +04090263-c414225a3a0fd0211513ff7357dae269.npy +04379243-f52e52094d8240b2dcfcef693e7ec696.npy +03691459-68bbfac3232f153c6ecea800f06e81d.npy +03001627-9ee5eb90d1176e2547dcda54be6a23ae.npy +02691156-3921f5f454c5733e96e161ce7a956a8.npy +03001627-eb8d2003087a27cf63e9f3319eb5ebb.npy +03001627-715530026c6459873e8366d7fa2c218f.npy +03001627-5a30a8edad307d8b04cb542e2c50eb4.npy +02958343-6f1c766eeafc7740e5424e4e99c9576.npy +04379243-279351131d06222cbe9bca6d7b2e5b3.npy +04256520-c8b49063b5c805ff62a510b8f97c658e.npy +04530566-d350936cad33863bf2ad837508eb2db7.npy +02691156-99c13d3c3f30c34dca8607f540cc62ba.npy +02871439-a976a61f71a8e700876ba2153f34d1b9.npy +04379243-bd9257f538038fac2d9fe390e23fd20f.npy +03636649-f29a94f969dd55ffc35131da26f8061a.npy +02691156-12991e9529a2b2bf9ac9930d2147598f.npy +02801938-97c3dff51452522814513156cf2b8d0d.npy +03001627-78f722590b0885a61efc6aa41666df08.npy +03001627-6c7a07030e673b0b9c9eed7651b77d0f.npy +04074963-240456647fbca47396d8609ec76a915b.npy +03691459-5a943e38dc477bac4310636931b68fdb.npy +04379243-b0d1fc9676e551849e25afd4f06934a3.npy +04379243-db8756b02359c6553f28718dab796f68.npy +03642806-894e47a6adb76680d4eb7e68e898dc44.npy +03467517-e90e8c13288718055216163257dea99c.npy +04225987-ea25b5f1fc8d76a36a1b26eff73443ff.npy +02691156-fb110c5d01f1b3fc59dcf12563d8fce3.npy +04090263-7c426a52358e8c1d64c4db7c3b428292.npy +03211117-a1e844489abee455972d35c68e1bdca3.npy +02808440-3b59f9cff3d39a0b602ced3945939e8e.npy +03691459-4014de6b20178cb92633ff66beb9cf31.npy +03001627-fbf085824e25d7c440ef1c8b63a628f9.npy +03325088-63268b9a020fdb0e2f0f992e258eb5f2.npy +02933112-29dcadb19ddb448ad98e761e6d91dfc8.npy +03691459-8edca4e07dee64e0a08ef684995f5adb.npy +03001627-c435de7be7f5bcba65ba78ad9601cf1b.npy +04530566-ed397dd3d2ca4c8a69852296a4bb593c.npy +04256520-53ce13a6f6a1a5f9f15e23b99997e42b.npy +02691156-f2171bb2d715140c8b96ae1a0a8b84ec.npy +02933112-1a658b76afedb342490ad276cd2af3a4.npy +04379243-26a97ad8dd79eb1ad0c63a304a95442d.npy +02958343-293c7cf5fdde18258acb0ff76f4aec7d.npy +04379243-7bbf01c219dd51fd7d8864caa856253b.npy +04256520-7822a1ef8d1eca8af51f77a6d7299806.npy +03261776-301d3c7e7a8cd529c37e70ff83bcc2f.npy +03325088-80d6971df918758f871adc8ea82b7293.npy +04090263-62d97682c57a0a14758f3dd6623cbf27.npy +03211117-937190441ee0d2568b7ba679b8625927.npy +04256520-9bc53cf72e1b969deda761b10992452d.npy +04460130-d9b4d966b63ba5e12a83093ac1bb2d64.npy +04090263-b73a819d88bde44c24d00518a3dd6ec.npy +04379243-e77d26aa88ec531cc17e7f250c5222bd.npy +04379243-384dc1f8ec0a0cc2ce152ffe2d789882.npy +04379243-9052a28510a4240d49d36f5b69384ad6.npy +03001627-b239fa34b4cb5a8e9b75b6346baf0c12.npy +04379243-7da66ff46ecb79e52225858d7500e21.npy +04379243-831985fb385a5b2a9ae2d75b4fc35b7.npy +02691156-e028fd73515465da5e9e2656aff7dd5b.npy +03467517-d155056f08e7bb10ace273aa67d227c6.npy +04379243-67c246e981ece9aa9f0f464e9e8e09b4.npy +03001627-77ed9ca45b928542266f89139e159db9.npy +03636649-33caad3abdb4f5192d48ab934af26487.npy +03001627-78393a855f214f387fdfb54d66251309.npy +02992529-27c4bf6a96c6439a86a04ec9e4169973.npy +03001627-3bb2201ba3b8709523f4da4464aa0c0b.npy +03593526-8fb8d64e04e0be16a383bc0337fb2972.npy +02828884-ca6a1a938c160036a0f31147c37537e5.npy +04530566-35e1639eac2c9b96cfea3d4fc15719ea.npy +04379243-64fd4269b04f91ecc68c5db94fe444f4.npy +02924116-fb659ecfc831c9915b4eedf3392260a.npy +02691156-d405b9e5f942fed5efe5d5ae25ee424e.npy +02691156-9912e7eaab960bf0e3639a60ffa58b1e.npy +02691156-b3135ae5bad8cc23cbaac693398e53fa.npy +04379243-1b4bc147baf68d4ff008d8a3590fb522.npy +02828884-b6da9b2fefbad3d9693697d8506b1c6d.npy +03337140-5ff8f64baed1c8ea4c3aee8e9d3a6ffa.npy +04090263-64276d3a962f6093923f5cd444c75b1c.npy +02691156-150cdc45dabde04f7f29c61065b4dc5a.npy +02747177-fc7ba0ce66b9dfcff155d75bbf62b80.npy +04379243-21691795da12fdc7bc95db5d49def9cc.npy +03636649-d6c6665366854e6abec99d5b4657d5b1.npy +04460130-9b1903c94dc60e7e38cd8eb23853c009.npy +03001627-c0fa1417c0cf2f20593ebeeedbff73b.npy +03691459-a10f7be978f78f085e2bf91b698938de.npy +03001627-91b738d40201bf18a413908c0e169330.npy +03001627-ca9f1525342549878ad57b51c4441549.npy +04401088-901a0180abe1011b3c629b56d283e7b8.npy +03211117-7cff26e6dc84bd02c598d38a6a69ad2.npy +03636649-60272eb623298fd190a9ce3e4b15521e.npy +03001627-a6bdde9da1322bd5116162acefe23592.npy +02691156-dca7f88e151f196b8179909e06795c03.npy +03642806-b233163860361eda8cfacef5204026d6.npy +02808440-506a041b7ad271813321831d2245cf06.npy +04379243-bcceb065b8c433b99a87002a4eeaf610.npy +02691156-85743f17e13271e0709eb7790ef48e0c.npy +03001627-5d8736041ded1ac7de03ab2a27ba7531.npy +03513137-27e52dac4cafdfee2a04c68bc263be.npy +04379243-a1dabdb19c7e5bd1426cd1b7e837ebc6.npy +04379243-48efd13f8115e3cb855931d119219022.npy +04379243-67e32538a35a5011a0ab1d82ef09f78f.npy +04256520-8efa91e2f3e2eaf7bdc82a7932cd806.npy +04090263-30270408f4d258d2feaf99d0c6c9094.npy +02691156-1807d521bc2164cd8c4f5e741c2f9cdb.npy +02958343-aec393b8c73d3a8ae4bee94a37836d67.npy +02958343-48debbfd63725a743978555bf44cfc9a.npy +02828884-11e98db089a66426ad5067eac75a07f7.npy +03001627-588ca1d34f93eddd8ee30571b0da74e4.npy +03691459-8675e32f2e122ea5c13bcab6e4ecd7e4.npy +03001627-5fe6b79e75130974e8f8c11a24c52ebb.npy +03001627-3823798ca4fe0b439710e093c764abec.npy +02801938-87b731ecd900e291c763c9d0f7bd78f1.npy +04379243-57de7158b2547dbaf2a235c3708accb7.npy +02958343-e738466fb6cc90530714334794526d4.npy +04379243-c1c52930adc815564810cc21086da42.npy +04379243-7d14ae7d0b7338bda0ab1d82ef09f78f.npy +04379243-a7ab34edcd45d7573da27ece6ae88fff.npy +04379243-7e261e5b2b11cddc557e22af3c71c6c.npy +03001627-f439a2db6341cd85f2b931201029bc76.npy +02691156-33d955301966e4215ebedace13b486c4.npy +02958343-63316c4cff51de417fb21fb4ec0d8d1b.npy +04379243-17d336aa38bb77fab1b6b0c5ddacb607.npy +02691156-4100df683795dfa1f95dfd5eb5f06d19.npy +03636649-d5e278feb6007ccb88e7662971dc736f.npy +03001627-8bb332c5afe67f8d917b96045c9b6dea.npy +02828884-ea4740ede10b7620c09352f205bd9134.npy +04401088-f2db6829e0c0298140d50eb4da376b1d.npy +04379243-745a2b060d0f692bf4b6538438a0b930.npy +03991062-b2e03341b4648a3d63b2acb037dfbcde.npy +04099429-3c43ddee5e1d4723db652c825617e3be.npy +03761084-255a0ce59720bf24a53276bbe109327a.npy +04256520-b10ae372f7988e3bc242632b2a8c3129.npy +02958343-bb7fec347b2b57498747b160cf027f1.npy +02828884-153116d4415ee016601104cd2d998272.npy +02828884-3d5cf677f2aa9ad978d4d2afb777f33b.npy +04401088-3ca1d72d2416bee6f4e9c7b80248eec1.npy +04256520-1db7c7411c5d957918f52c8a4cfcbe33.npy +04379243-6dd08b216592dec6a6797fa823fd42d2.npy +03325088-ad51249f5960d841c36fb70296e45483.npy +02691156-78c5137e361e02cb24624455c20aef91.npy +03211117-4ee8d3a617b574ee30582dab79e5c58d.npy +03691459-35196460460f022a105260687f2b18b7.npy +02828884-f2c542ed9750ee4668db2d7865d1f724.npy +02828884-ddb2c6abe41b2063ad5067eac75a07f7.npy +02876657-df4ec460683acbb89d789ef7917b7723.npy +04256520-6f6a4f12041ce6d2593ebeeedbff73b.npy +03001627-53fc74fb69742cab20768660cf080d12.npy +03211117-9da823886a808f7da8f1d83a370a51c0.npy +02691156-16d40e779903e77863b132896d8bc65d.npy +04379243-a1896691fe875eccb9968f25875bdef4.npy +04530566-bfe67a6080ff5bc17ac1d5790f13a22c.npy +04401088-df90c50a892611ca8536be73396b323e.npy +04401088-2c03ac9bbb3d918411f02c4c36ed7f25.npy +04379243-d1296da8d3a45ac88aaae3d020f5ddf8.npy +03211117-ed7d00e977de27e2bdfd4afbfb3ee4a.npy +04379243-872e9d0bc078b4c8b9a1f0848a4940cc.npy +02958343-e5ba98879f06d013b2d3f2371f6b0762.npy +03513137-51ee565cc330e131b20f6e48f6a30cbf.npy +02958343-c6191031c1d685d580360680c1602c7d.npy +04256520-cbe2e3145eea246cff40be78d008f276.npy +02958343-8f87755f22470873e6725f2a23469bfc.npy +04530566-a848decbfe26833c4a27b0b4657ac8b5.npy +02691156-eac2573ef637a0dbf31cac033b2c0831.npy +02924116-6885092b0d1fbb6a8db35146c0a9b3fb.npy +03001627-71eca23b5fc484cc59fe89a0706f1a71.npy +02691156-a762fe69269fc34b2625832ae05a7344.npy +02691156-ff28d340bf0b5d9387b2a887422ab97.npy +04256520-33f47039e62a39e5febad4f49b26ec52.npy +04090263-5a5f7025b960f4bc745f2f3a558dc3f8.npy +02691156-9052a53f45d5f8487d64cad20089f027.npy +04090263-c9b540abc1cc7a107d0c348381a9a6e4.npy +02691156-67dbb0de722cf5cd7a734abc5ba1db0f.npy +04401088-1f4e56064de606093e746e5f1700ce1a.npy +04379243-eeabc27816119ff429ae5ea47a8f21e0.npy +03636649-ea235afbbaa6fcccf32735686fcd8ec8.npy +03001627-6aa1ba85285feb756306d83fc23a955a.npy +04401088-9c26b9b0584920f1539baeab407f4a02.npy +03691459-b7285ba6fc6628a1a43ada367b02a4fb.npy +04401088-2df0bc8b46ad3cb858932236a22029d3.npy +04379243-94a53bc306d106708bc6f322a9608b07.npy +04379243-b67fc33298d026033e0a119fd0be5d3f.npy +04460130-fe5ca50ef83ab52438cd8eb23853c009.npy +03636649-414d4397dddc0134fcb8d8c6d4df8143.npy +02924116-6c0b2009e8496a1b6025f5d96fba4d9e.npy +03001627-f229c56eca8c0ecdc3bd24f986301745.npy +02691156-accb9ee4edf6af6ce4080dcedcbec993.npy +04379243-71115e3a391785be853acd6c98b3fb18.npy +04530566-af07125f24a17476eb2c303a0e0d287b.npy +02933112-7dac6c932ca4f2fbb1cbe768f98549bf.npy +03001627-78b7f3cb97da38c41471b11f88c7b46c.npy +04379243-d1cc46478cde981b9a980acf1a5058aa.npy +02958343-c721c1e89e68e01fec4be884ee173bab.npy +04379243-1b43b4892ab3a4612e85eab6bca44d5c.npy +04379243-968714b674baa3152cf0938654a53e55.npy +03636649-1b79210962721517fcddd74ee6c69025.npy +04379243-76c01c98aba64318fafec1d6d9ed06d.npy +04530566-38189a2101b5e6c3da32b7c218678a0d.npy +03001627-66e204998b6c4f06ffe5cbaf6252d67f.npy +04256520-f6f563d47fcdfe82d67386763ad34603.npy +03001627-d8d5829083c66bd4f4b6538438a0b930.npy +02691156-10e0a7255d279a419751c7a6f15617f4.npy +02958343-ae0058d9ae9bd33d51a95aaa6caba1d3.npy +03691459-e51ccf3bb4413ceb61775b840d882da9.npy +02808440-18a3dd79ce17724bfe52ffd0e748a1ab.npy +02691156-4ae3924f14d2c0084c3a35cee92bb95b.npy +02924116-b5b6404c3267e782f446f92b52bbd82a.npy +04530566-a230c555488ec2664b07b7d8c0d68c50.npy +03636649-b6989c99bba1226539b3360f500ac52a.npy +02933112-4392ad03e7d769a6180dd1b6c5060a26.npy +04530566-203c2cac2c46e06c320fa6e2cd857828.npy +04379243-f09cdde03794151a17be1b91fdcd9df.npy +04379243-b602636c7967016f7305052ff007b248.npy +03001627-fe99f16c2532cdd07ba99ad16fdc05cd.npy +04468005-a89aee8719ab69704da9f355ed79f620.npy +03691459-fba87f3cb973b06871bfdb4b1c2ed05e.npy +04379243-d62417059f78e8e79d2be74cfb51ade1.npy +03001627-b58a0307a86959bd564f6f5de611dfed.npy +03325088-a951f273c8dee77f96a7dbf21dc55841.npy +02801938-2ca614e0e17d4e93162da3dc7be329d5.npy +04256520-f20e7f4f41f323a04b3c42e318f3affc.npy +02828884-ec79d41034e8deabf4fb4dee5181bee.npy +02933112-7fadf6464f6ba381921dd903dd0b8b17.npy +04379243-7c29fac52d4a061140b4c5428883e585.npy +03001627-38c65f38e51df0746fd487bdb55ad0b9.npy +02992529-72e61015d1e4fcee8739b6dd0f9695f.npy +02691156-b3c7044fcd6f15c24b0a1bcf2fb497ec.npy +02958343-8b090b8ab3172dad2d7a27ffaafaaddb.npy +02958343-8efced0ecbd1dd99713391d1ea8d388.npy +02828884-756c2cbd2d42644052b192b5b7698446.npy +04379243-1bdb9df06d749be1a7146643e6b355e4.npy +03001627-668aa5d430fd6d4e8f7d9678498f2295.npy +04256520-7d804eb69e0eedba450447b3239e17e9.npy +04330267-9fde0df9146d61f119bea36737d5c9cb.npy +04530566-1b4268c4d812e54943bd01645155d3ee.npy +03928116-22ea33abd17d1a24c87275f53cae84a.npy +02773838-f72de241037d474e76bb31db0358e9c6.npy +04004475-bed705ad5e375edb5f8fbe378caeb270.npy +03001627-60637687ad5682ef2b93a65c5f642e3a.npy +02954340-1fd62459ef715e71617fb5e58b4b0232.npy +03467517-fc8cc32bfeaca537c39ad9186be3fec9.npy +03211117-66d6590ce707340f1c7075c2bc313334.npy +04256520-20b12dcbb70869c06b5c5023b0ce157e.npy +03691459-4d264fc57f6ea6bde389c9be84ff7ec.npy +04379243-2b9153514eb1c46bc6a830e27533d086.npy +03691459-36206fcd5fd8821996ee15847b17fe3b.npy +03001627-d5b132a3e903e8fc8ad3a7d07aac2767.npy +02691156-5aa22f8c52d2f777a80799ffaf21ea7d.npy +04090263-7744efae453f26c05e9263096a26104d.npy +02691156-4063fb031d8fb78e505ae8d422ba349d.npy +03046257-d9543e5f16e6574a8e9a0e51a554788d.npy +04379243-ab55372db393e4259ccce4c6d5bb195f.npy +04379243-d19c946f825a9786db6175ef18ad3f80.npy +04379243-88b227c5fb3906ce47c638c0eee4a2b3.npy +03001627-2ad0943e70c0bd1481f667e2a25e0619.npy +03636649-6faa72d18f52d7172cd2160e449d45ae.npy +03001627-9ef3323c6ced7dfef313a0fb5fd4d79.npy +02992529-77f5498dd2277aacfd71ce99fb45ba0c.npy +02954340-9bd54e0123d3cd70a52821bf1aa3b19a.npy +04379243-bbb11b745f7c75fdb5b101ae4c3e9377.npy +02808440-c473362142f5cbdd8dbde1890f8a76e.npy +04379243-9d71f9424fc659e17a50afc9c93f8a50.npy +02691156-94ce3a5ad2576e73a5cac89017eae8d1.npy +03790512-e30b8ae3e945d7f5a40fa6b4bae5e67d.npy +04256520-76a9d700dcc91a5fea4a3d2e6628d0f2.npy +03691459-2e40fbdc900e69593971c6f4f1d0a4a0.npy +02691156-b2ceeee3c5b75962ac4f72bf08dc79a6.npy +04379243-e0940f2229e42007d98e761e6d91dfc8.npy +02691156-cf911e274fb613fbbf3143b1cb6076a.npy +04256520-62e50e8b0d1e3207e047a3592e8436e5.npy +02933112-11b8fd945de0ee99642f6fb37a230b5e.npy +03001627-69e35c579a68fe146045fdc35419ee6c.npy +03938244-d534e22b823ad56f630771196b76eab9.npy +02828884-d21839a3d4b5b30f55f46d55537192b6.npy +04256520-24223e3bbba442ffd19c4e0cc3eb15dd.npy +03046257-2451f214bcfd8ed9f3a54fdb52b446ad.npy +04379243-8af3fd230ea7ac6518101790733ed6b2.npy +04379243-f7d727fce5ee3007984a3b60f45af7f.npy +02691156-fc0097a6ad81e5cc1c2daaaceea98731.npy +02933112-acd46f0b09a84c226b987ec2db2ce6b1.npy +03636649-852feb3fca95b6d5dc3653f8341633a.npy +04090263-1f01ba0f7e0948f56108ae6b1ec0f04e.npy +04256520-d9d61f08002dfae421cfc6e95839d798.npy +03636649-8c410dce9de0c632ecb14096838a20c5.npy +03593526-ce2508ec4476b2cbf51f77a6d7299806.npy +04379243-7c770e38383d59be279e896561802d26.npy +03211117-c08e59a3d09cbabf6002a1da9aad9f4f.npy +02691156-fd67c89ff247f9e7442ed26ceeb35a60.npy +03691459-ee962ab0dbd24bcef78c4384b551bb5e.npy +02958343-e2a4635c392e750abecf71e2e014ff6f.npy +04256520-cc644fad0b76a441d84c7dc40ac6d743.npy +04401088-18cb51f36acfe30a487d18402ebe69d5.npy +04256520-1589b8a09c8bd67551d07d3e9ad67a2.npy +03624134-581ad58ce8664d2d4ff0e6230d32c1e3.npy +03001627-9b42da9217caaed8f51fa0238791f5dc.npy +02691156-97ec5b82d9757b639cb1b92881e8e76.npy +02933112-56031b004d5306954da5feafe6f1c8fc.npy +04379243-4a41fa511183aa138cbb8bac2032149c.npy +03928116-b36576fa2483c97a3c81f7197f981187.npy +04379243-f1324b15b7cc9cd48e689df3ea785530.npy +04256520-d08fc6f10d07dfd8c05575120a46cd3b.npy +03001627-3075380de1f28ced3d290591da43d03e.npy +03691459-164ac6f6252e22b5f5c320b27d54d683.npy +04256520-7994498bd9b426cd37b2bb75885cfc44.npy +04379243-8c65dd783d2afcf468cdbc8b02ff160a.npy +04379243-1cb0232d2ec82f9ead135ea7bc8aeff3.npy +03991062-8c3c0ec3779a163098910e50f05b8001.npy +04379243-34fba2f856e97796b0a6e87d5d5521b6.npy +04090263-ed941e7672a4cdb0bddd549216d19f7a.npy +04379243-f023a5489450b924520ad20925ff9d2d.npy +03001627-c20dcfe55ce58c055c10b08ea69398c3.npy +04379243-b1c80d73aa4114811011cbc4b5232a4a.npy +04379243-f4692dabc20f58e0f51f77a6d7299806.npy +02691156-24cc8816b384723510a7b8c5fa89c603.npy +04530566-2988a53fc376653aae529ab4a75c4af.npy +03001627-8e2b4f8e0a38d2cdfe74384b8bc69dda.npy +04379243-c1c81b60f786873262379fe9a26f5cb9.npy +02946921-4d4fc73864844dad1ceb7b8cc3792fd.npy +04379243-629d09ce8c10a4f866603970dfcc17a6.npy +03325088-327d16b036d840a2e1bf57430463e143.npy +04530566-571a2485fb205e5fa9142e7277ee08f1.npy +02828884-f7ffdf91b66c0c989c9513cebb0fb44c.npy +02958343-edf4007e23cd00b359c19df2d1879464.npy +03636649-b89c79537ead39c1cbf3dda885c64a76.npy +04256520-ca81512a7d7934d0b8e42b2c59ee19ec.npy +04530566-59585673328efdf2efa33903c8f77ab8.npy +03001627-c8713376eb588f422c0e1e24bb9eb3ab.npy +02958343-3d85915d8726cc1845aa033a20004998.npy +02958343-c8fd6ee4bdbfa5cfbda3e4f05af7d436.npy +04468005-9b34d4118d5d72e9ed2f8e1c74f9fca9.npy +04460130-c47a34f2a3acdc0bce8973e274e9f27f.npy +04379243-19c2fb727de9c13c51d3c864cc68e22e.npy +03001627-72a86c2fc8d5cb3713d2510999d0f1d2.npy +03938244-2873ef9354972727b376ecd25749b977.npy +03991062-61fb1e91cb867fd930c7810cba6da248.npy +04379243-82346c794fd098f77a1f550045b16384.npy +04090263-4e007e41bad1b1cd735fa1ab17311ec.npy +04379243-f1c64d90ecf5212fac0d0a08bc077486.npy +02691156-8e2e03ed888e0eace4f2488af2c37f8d.npy +03691459-e40e7c3dea88a733eb15975241f6a53c.npy +03001627-3a3ddc0c5875bae64316d3320fdfa899.npy +02958343-470f53291d23cf0abecf71e2e014ff6f.npy +04401088-e0ccc0cae4dc414cb4e7b68321c9d305.npy +04379243-592296965078028282db9fca4b68095.npy +03325088-9797db191dd9813b14b35a7d7cea7130.npy +03001627-379f0efc898d7a7e9fe74a48bbc553d7.npy +02828884-c2e0cc96c3ae97932997d70e9237dd6b.npy +03636649-5850799c5af71d58c13933f92cd75682.npy +02871439-3040f51df4b6f5748abbce8b0b4c2d45.npy +04530566-307a956fb5eaf7a629d81e9641dd535d.npy +04379243-52e0dbbb53159e0fbd8980415d183a3a.npy +04379243-60b2e4ccf3ec715ec3abfe135b5412af.npy +03337140-a3c7255f5ec832c3492d9da2668ec34c.npy +02828884-fdf0f799b897b0c99917ad57402f53f1.npy +03691459-81eafc16db11da806583871b5c274818.npy +02828884-750cec373ccc38a3a3d37e70863d948e.npy +04379243-3c3c0da7a2581f20490ad276cd2af3a4.npy +03001627-dbf235de67b39c2d25e2408bd7177733.npy +04379243-3f48840eca0de14ee693975eda4e3db8.npy +04256520-6ab5321efc4b3772492d9da2668ec34c.npy +04379243-c4071718e45630ee5510d59f3ab1ed64.npy +04379243-7be495e700afefe6cfedb1d8b135cde9.npy +02691156-9f90f3298d7b6c6f938204d34a891739.npy +04256520-37939caae967b34da14c5748cc240cc2.npy +04090263-425279eb4cbd51a48bfbe54b5d01550.npy +03211117-e71f7231406aa6ee4019d3f83e009e77.npy +03001627-b4c73f4772efcf69742728b30848ed03.npy +02933112-a9bc0de459504729eca1c556848f5db1.npy +02747177-1b7d468a27208ee3dad910e221d16b18.npy +03001627-a3cb39c5271c3232feec1f13d2353f3.npy +04530566-511befaedb0123cd96600832daa83ed7.npy +03001627-22b48b577aab6201bb99d7af794753a2.npy +02801938-8ba662af65531fad1657aaca7aaa9a5c.npy +02828884-6a474cb5a494c1e6ad5067eac75a07f7.npy +04530566-bfd8b473e1a8fd650eb615eb69452b.npy +04401088-237b8445c70b1749ce2eca356a0e3474.npy +04256520-4e43e29a68b72d9fd9246d8a288bd77.npy +04256520-eab4334a06fafb7171c3cf047830ec1f.npy +02871439-712d0b79acf23e674dba58e91f113bcf.npy +04401088-3a6a3db4a0174fddd2789f496481c83e.npy +02933112-e0393e80702d9a698cbb8bac2032149c.npy +04530566-ac736a87ca813c6d701c68e1045b606.npy +03642806-1f507b26c31ae69be42930af58a36dce.npy +02828884-77aa33479c2ec92f610c2a68437007d6.npy +02691156-cb8fb401a278fc36bbf3143b1cb6076a.npy +03261776-c5e47b627cb7818f17e22b7299bb7bc6.npy +03211117-5ff51c478471d1f15468776e191863a2.npy +04379243-5525e36ebab96f98d989c9f989a09ff.npy +02871439-46579c6050cac50a1c8c7b57a94dbb2e.npy +03001627-5923697231e1bc86af38a3b0483df58.npy +02958343-e8c48b9ed916910ec800bf2938639a70.npy +04530566-be357b15497cc2133a18a4a0def966f.npy +03636649-6d7aeaf3c1705cc5fda82f1d3dffb320.npy +02691156-842e5dcd452f34aa8caa71b1fbf7fb98.npy +03636649-a68678b3e52fcda2bd239d670cf7d8dc.npy +02958343-a36c53acb3255d1e84b1aa0ed7e58be1.npy +04379243-fbf5c95ec6febbeb07cbf788ba0557c.npy +03761084-29012d42054b3a1087bcae7a654cc37.npy +02958343-260f0644b293fccbfbc06ad9015523cf.npy +04379243-3ce4b963a4869248febad4f49b26ec52.npy +04379243-d91619d6c9915368e6c5cd45aa112726.npy +03001627-d350f40e5f04360565ba78ad9601cf1b.npy +02958343-86a9eacf6b362ff398494085d68ad6a0.npy +02876657-9ba6291a60113dbfeb6d856318cd1a7e.npy +02958343-c2d2eae7ef1a34e1f500cc506a763c18.npy +04530566-9696dd7f30247c5c573080510ce7a6bb.npy +04004475-3800e1d7cb83b4073ba96e34ec81ed42.npy +04379243-884a1ff382ca00d340d1d1b64916e0c7.npy +02958343-5ef8eeb5ba5d2c6ff6efcf1cf084a608.npy +02992529-45e907ca47e0122c1752adf979b66914.npy +03624134-decf7a4989469d3289eec1cc60f7c002.npy +04379243-83b28dc11de6b2625c8a41baad250b1b.npy +04256520-ad856cfd25b91563c681404257d94ad9.npy +02924116-a81cb450ce415d45bdb32c3dfd2f01b5.npy +04379243-65f9103ab7a64e83cb7105765410e2d6.npy +03001627-54a6748359055b5ae5e2f0eaeb6aa550.npy +02933112-d6138b5bee8f009ebd9c9454e3d4e73d.npy +03691459-2e530fca4ce161902b12aea3a74e3599.npy +03001627-39031caf2b11a7f665ea3fba7f481d97.npy +02747177-8be2cf5a52644885cb2a965e75be701c.npy +04256520-6898a9ca21823570a888124bc30aa1c7.npy +02933112-84f34a2d86cd4f0211926054acb73bec.npy +03001627-be8dbd9726372752412dfc90452742c7.npy +02828884-8893daaecc8c76048e53587ea99de59c.npy +03001627-490941bf4a532b62492d9da2668ec34c.npy +03001627-76dd2d9f0183e09dd835cf838a2f2758.npy +04530566-c3bbda10fd915342c24de8a3b5a07552.npy +04379243-59dd0aee74ce6d1798b8c800ae001b66.npy +04090263-7fb2ec71361813bfcec05e03e317cbf8.npy +03325088-7de46bce9c800cf3979c556124bee033.npy +02691156-755b0ee19aa7037453e01eb381ca65.npy +02691156-cb91205ac0f2f62429dc68c96bb3c4.npy +04090263-6b0c761060feebe4affd759bf1ff6b0.npy +02992529-e3e43df4a3fc1870d4d7de9e3c2bb6f4.npy +04379243-e7b0ff6ffeb24ac2cfde2e560cf498ca.npy +02691156-9ba460913d86466f62347b4731688b0f.npy +02933112-ac4e80d4ad2d0ce98060a555dcc63fd1.npy +04090263-55171896c70646cdd87c63d8b3018b58.npy +04256520-96de367b3365416ac580fdeb5460f6d6.npy +04379243-5e978c92d55f7852185574a5e2255bb6.npy +03636649-77d1b5aaf145f8905ecb3cc57fe87cee.npy +03211117-534d3c5dca2d44641af9a5a7008cc3ec.npy +04379243-cfd7e354a5ae982aa0ab1d82ef09f78f.npy +04379243-398dbb0a34ca527871a782a4379556c7.npy +04256520-332b2573bb3675cf14038d588fd1342f.npy +03710193-fd3227fb95b8d29b60ffa41581e372a1.npy +03337140-4c38f799ecb6cfdbb39d771847f20151.npy +04530566-758c75266d7788c0f5678db9e73ab77e.npy +04090263-b47d65a7c6234d06b349bd01da88f0bf.npy +04090263-9397161352dec4498bfbe54b5d01550.npy +02958343-4a30d2147d0e27d13ded1857c15b5b6.npy +03642806-48e07903fe5057a1d7289d94a5c9ea3f.npy +03797390-9af98540f45411467246665d3d3724c.npy +04379243-615b800fb332525385c5f690e9252fc5.npy +04379243-57d7f4c5b427dae69dac46bde4c69ef2.npy +03991062-45ca193e946b5e19956b2452b4c13510.npy +04379243-3e645e9f5703d14e51d3c864cc68e22e.npy +04401088-6d7a0e701b4417504161e123a102b12b.npy +02958343-ddb4ad84abca0edcdb8ce1e61248143.npy +03001627-2718b1d46ca52df052bfb1d5ec273240.npy +04090263-d64825461795cad2ac2ad609ecafdf83.npy +03636649-fd2f5320fbfbc88a47c71c6d277c802d.npy +04468005-537decdce3079c857addcf2661f94d39.npy +04530566-2571a0b3d1eb9280f26f17fb5c4740a9.npy +02933112-62a332e54cca36f547b925ad5d9d8738.npy +02828884-95cbcdc64b28bbf396f61afd58e50ae2.npy +04379243-f8050e698bff9fef8d1c65d617ea0b5e.npy +02933112-c1f419412a6960a27775562146ecea9.npy +03001627-77371d342cddea8d8b424343280aeccb.npy +03337140-dee0925183a5350732fb9a763fd231a7.npy +04379243-89cc879f005dcf50f1f50f6a678fb494.npy +02958343-3232d99c41dd949a8b257f8b62755068.npy +03046257-a60acab7ef47ad82642c99c10134b38c.npy +04256520-3f5fdc05fc572730490ad276cd2af3a4.npy +03001627-4c0983329afcd06f730e89ca0d2d13c3.npy +02691156-48a9b9c041d377b26012a714b05f25ca.npy +03001627-d57bbc72d1b2670e4209d14d674fb332.npy +03001627-26aa22bd1da8b8c5b1a5c6ecbc81953c.npy +02954340-254e230d31a62470a52821bf1aa3b19a.npy +04460130-6d69bdc0bd266b7af7f1024a921d6d8.npy +04090263-60db20e995801bdcac8247d8f020ed1c.npy +03636649-2d2a1da36b840ecfd49b2e04785f8492.npy +03636649-6068920e350f1fcef04bb0474a98ba2b.npy +03046257-73956ea1cfbaa5ef14038d588fd1342f.npy +02958343-6c85063bf5e983a3d14b144052416695.npy +03001627-d2a1aaba7e047897492d9da2668ec34c.npy +02958343-d513c968e5bfefd2516624d6e93a68b.npy +04090263-c2be1232f61da4b6e79db68bf2508b3b.npy +02691156-72537a008bf0c5e09d1a1149c8c36258.npy +04379243-cc6696abd1d76062f90f8519e58d5382.npy +04256520-b99058a0054ea0f8387625a8fa2965.npy +02808440-76004a2497f3bf98581a5df406f5588.npy +03001627-1eb2e372a204a61153baab6c8235f5db.npy +03467517-4dd3b42e67a19210925e0edb2365fb11.npy +03636649-15c51ecb58bf304fef3a2c64cef919d0.npy +03001627-58e6fa617a1bed1a20b64028d2efc877.npy +04379243-a63d31d92b6bee14febad4f49b26ec52.npy +04004475-510a9921ab03cf6ab331a25788d3c6c.npy +03046257-44d60011d28940a0eef5d83b671bb264.npy +03325088-cacb193f82cbaba0b362845c6edb57fc.npy +02828884-95e97cc6e2f7e2e1d5183890546dc397.npy +04468005-9f0b225a83d16aec84e8a55c6921f1b9.npy +03467517-aa86d20d03b2303593f0194265a9746c.npy +03691459-df678ca1f17e32ec3d65eaf8cbd60895.npy +02933112-2f2a87c3626ff6fe1aae34e8209c4d10.npy +02924116-9c15f5571329510792f19acc54e02dc1.npy +03691459-d3b324de8e23851e55b62c3398327a83.npy +04379243-38bcc47be092398cbc2921df9ee1c4f4.npy +04256520-e8aa02effc458838f2098a9f7fc86999.npy +04379243-c3cd2a7f997a6a40f3017d945b17b4d6.npy +04379243-2ebe5dfb7bd9a50c6effbd64ad6b71b8.npy +04379243-a406ef7c367e9c043ce425098c6116e5.npy +02808440-6ec3dbef4a3e1cb279d57ee14f8ee702.npy +04379243-5b99ce5dc47c76af3e57e49d8269b367.npy +04256520-9ec5fcbfe43af15b851a116903680096.npy +04530566-33692290561c798e780bc2708a85ba9a.npy +02691156-a053f49d808b7b36c8db97d9bc169245.npy +03001627-40f188600cf8362b654ea6737b0d3597.npy +03001627-e6c7e75046f8946b27bf2eac25b523a6.npy +03624134-acc8da45bb6d772ebf103b0ce6f42d81.npy +04530566-6d6e65b938b88eaf3a4406b2a58a646a.npy +04379243-7f1548ee7cdd456fc2b9c3cc12089fe.npy +04256520-5b94025a52c244bfc51d071e487f31b0.npy +03691459-95d01543b46b5e43f398d0c5832df00e.npy +02933112-5382680280ef5b57d0b36851d61b6fca.npy +02691156-b11c03976f121b3537007500db3b770e.npy +04379243-3344c70694e1bacdc5bd1ef3bc48a26.npy +04090263-569416cd964e365e20152153c3a56171.npy +02958343-45e9059c3ac5825661c6c61410fc904b.npy +03211117-9db1c375f76c8ac1db01c957364e77d0.npy +03636649-8f5347fce0d9b517cac7c8ef7fe2392d.npy +03636649-54f858f74a0eb7d5ee11949398abce38.npy +02933112-9402e5123bd831e276f1f48f36df7df4.npy +02808440-370dea2a2719b07744221bef0fa3c36b.npy +02924116-ae5b72aa78a2b7f5708871f5411a4ec7.npy +04379243-e013ba1ff446bd56140a527375fd6757.npy +02992529-a4910da0271b6f213a7e932df8806f9e.npy +03691459-1bcf25863e840c11f806e7110c573eb2.npy +04379243-4d3bdfe96a1d334d3c329e0c5f819d20.npy +03211117-33c639831fef416957015074db1e51bc.npy +04530566-c8414ce9b8848c3c1a3ad8aa8e24c7d1.npy +04468005-b3d1c0e95d344ec1dc14ba0818ee5cec.npy +04379243-b2b4829e281f1ca09a87002a4eeaf610.npy +03211117-6e4c06e5dc03291bec77bb7db6eae005.npy +04530566-cc4f56a126353cd81985296f8eaaf6ef.npy +04379243-c76b1d97bda153f51226a0a31e4f771f.npy +02691156-afd43430bd7c689f251fe573763aebef.npy +03691459-58af19399a5a447e4310636931b68fdb.npy +04379243-882d74e3afe42d0b651fbe0e01830a4a.npy +04379243-40604fdd535fd2b2e393e26dcd2928e3.npy +03001627-6e92bdda1bca7b72f9a4f3015fbf70.npy +02828884-1422f82a72e0b7f48ae1c1abea367249.npy +04379243-852e28dd91e4fdb35c1975633309d43c.npy +04090263-e5a481c9c2e1f17516f51ef194451b39.npy +03001627-501bf2a6d014d22ba169b9ecd9e046dc.npy +02933112-c3755418f2df9369e7e684d25d4dcaf0.npy +04379243-5bfef1c85186b2d836b0f2a1430e993a.npy +04256520-5f531e379365040936a36f8fd7d27134.npy +03691459-923b7f0a4bf93c4fb66814b45dc64bc9.npy +03207941-af913c310f1b978ae6488a574e8954a5.npy +04090263-30ee49fefc0d62c8f14183c264ad03ef.npy +04379243-6b0fc2214ff06578eb3bc6c6d15f9bf.npy +03467517-69721c66520226b3f435ae560621097c.npy +02828884-9d4086be72fa427cd2b12aa6a0f050b3.npy +03691459-f4bb44c3b9a044ebaaa7694cf6c95b84.npy +03337140-dcc1c79e9650b987492d9da2668ec34c.npy +03001627-6d619704ac0bed9827eb00c151c6f711.npy +04379243-668da5fd442fa5ceb74af32735cc24bf.npy +03636649-b2e46fb6018d2cf2d93768e7b9b1eabf.npy +03001627-a42aa59fa23b4a4d9c0ca344f487323e.npy +03691459-5f41f45cd57adc0b885333683933c555.npy +04379243-912589813b9dbedaec85606b5c87ea7e.npy +03001627-8f521c85697cfb73f51f77a6d7299806.npy +03001627-d24f623af8e7da479dbf298bdf3162be.npy +04379243-9f760e1d7ab97519eea323f522c6486.npy +03001627-751342c7107c86f0fa9e9ca2723d9727.npy +03001627-9e145541bf7e278d19fb4103277a6b93.npy +02828884-80f9707a7e4a0cc856853064b332a2ae.npy +04090263-80b03f350a5de86e3a653cb492d78488.npy +03636649-b3a98808fb1ccd892a5041fadf25a502.npy +02691156-81e4cc88fc757ee220152153c3a56171.npy +02691156-5ae05c956af61890b58b3ab5dbaea0f7.npy +03991062-cc71eaf7278d78ce72652f4081ec5a77.npy +04530566-f03f7c963928073227ac692756be9e24.npy +02933112-34e80aa7b579469bb163e775a4d52465.npy +04379243-1aba52edddfad70d1bf0233e4c77d163.npy +03991062-752a32c80e716fb8a2c59a4d90e63212.npy +04379243-a78e8ad852e8d3e3cbb2a1d23fae41be.npy +02958343-bf0e8d944ba4843e94e7e8e27399daf7.npy +03001627-185bcb9bcec174c9492d9da2668ec34c.npy +03691459-63f006488cfdb69bdfa0db1c1e10ab1a.npy +04256520-c15b0bca48207d9d8cbb8bac2032149c.npy +04090263-76fbf623256644116c830d654bd05bb9.npy +03001627-834af6ad2a1d5581492d9da2668ec34c.npy +02828884-76efe392461139df80ac1d1d1048ad28.npy +02933112-1f319101d3c05a16886a4b751e0cc0b5.npy +04379243-d60054176a178d18febad4f49b26ec52.npy +04379243-9aca8b4392e603fcb1763573e754f7af.npy +02958343-baa424fcf0badeedd485372bb746f3c7.npy +04401088-759c984fa6831ad7bf0defeaa770e93b.npy +04379243-c809bf0ed02eef7016a2b5862518c93.npy +03001627-47dde30e987efc6c8687ff9b0b4e4ac.npy +04379243-81bfbd041dfdb827c08b855dcc4d6f49.npy +04256520-bcaf0bf7eebb7d7f4fa36fe4cfcd8f6b.npy +04530566-587793fcbae6a6fbf5abe4b4be4c3d4b.npy +04256520-8fc21752c5c874626b4675882670d943.npy +03691459-f8fde8f5f364087d2d563c85edb49108.npy +04401088-d5561b05a6b84a5489905122ac8b41f3.npy +02691156-d709b3afd41a578ba03df56f69a35fcc.npy +02942699-d1a3482c576f8c50592ecd319dfd8c5d.npy +04090263-577388c27e850a97f0fea2ee98610322.npy +04379243-3239a4e1c62099556ee5c30704fa2d08.npy +02958343-1cb95c00d3bf6a3a58dbdf2b5c6acfca.npy +03211117-31daffe57909195455357c338ec9641.npy +03691459-7e061336b31b8604d34bdc365023cf4.npy +04379243-fa1e6b0591047eaeef78a907ef09669e.npy +04379243-8f841c9a11ad77a6794a9f593d938882.npy +04256520-27781344ab489f2df29666f384be6c43.npy +04379243-29b2aaca87d19a3c5759f4335ff2e408.npy +04379243-5b0185f3a758e481618970cea28848f6.npy +02958343-f6ed076d16960558e6748b6322a06ee3.npy +04379243-e095933fc153f7371ffe260c5a3e6b53.npy +03790512-e5a9a7b8c947aaa1949b12cf3977a48b.npy +03046257-ce4de74b5487d0b0e7c7920f6a65a54d.npy +03991062-518360745bd7eb881255bc546ed0fe3.npy +04090263-322a9fd05f1f68b4dc99cc00991f7287.npy +04379243-c850233cd5ebd8a49725e3ec23636256.npy +03691459-4793c0b78701e47dd529f6660fe10a17.npy +04379243-3b465822b34ed20ca05d3424fd8d541a.npy +04379243-9b722071fde9069ccce4c6d5bb195f.npy +03001627-e64275c95e41605caf7c7ad2549a1b15.npy +03759954-c66b5236940fa0c474d0d70573a389d9.npy +04530566-721a41c68f8d1e1af898a4b2192a12e.npy +03001627-56ab99b69cbc1bb50d55c58aabe6e7b.npy +02691156-16868a30ebe634053dc22b596edc161e.npy +04379243-c6fc21c5f51f169f365368fe0de21d22.npy +04379243-b72bd5538da87c0da54b9afa882a89ed.npy +03325088-35cc4aebc9da75a1b362845c6edb57fc.npy +03337140-8032a28768c3f22a7843fb4efdc19510.npy +04090263-f1bb43c7758ad37c12b38b1d99376c0b.npy +03001627-2d1f6e50aad6d88721fbac718728a36d.npy +04379243-8df054f74a538e72c955e5ed03ef3a2f.npy +04379243-c53b11ceba592177564c88c75bda3a02.npy +04379243-6791c92944c99c029f1deb04fb8ae481.npy +04554684-aef595f6f7c14cf4fe43ff1e45af424d.npy +04379243-c1180df0a7ad92afad5067eac75a07f7.npy +02818832-aff661c669a2bb4fe3fb5e8ccfbdda1f.npy +02828884-fc0486ec53630bdbd2b12aa6a0f050b3.npy +04379243-50f93f2278c3cc066bdbc69440dbff90.npy +04379243-f5cbbe04afdc4697562b835b63cfd09c.npy +04530566-2abe34f72a7ed4eb0d00cfc385a039b.npy +04379243-2cf794ec5ac1f1e0f5a97170d660a78c.npy +04530566-4e341338a4425ea391fb4dce28166bd1.npy +04379243-1e2565b2c28e69d3deb25e31ec3122be.npy +03636649-b02bd8e5ef9cfe354b3c42e318f3affc.npy +03211117-792002ca0c65b1dfaf7869e0a5920f2a.npy +03691459-75112a1fb101921edc1b62a5dd6fee95.npy +04379243-d0b38b27495542461b02cde7e81f0fc3.npy +04379243-c5ae96124c15c734e6c5cd45aa112726.npy +02871439-104874322c6f7a75aba93753eed86c0a.npy +04401088-73b0bcdcf57a8a7fe8d8ad3bdef6aca2.npy +03001627-5748c2c222d1528deb0a72cc21af76ff.npy +02691156-c2d90cc742f17ce828204947d78b9af.npy +03001627-6a152238c2ae02faf7b2f235a439923e.npy +03001627-6fcdcbaa1cbcf217be8211d595eb405d.npy +02958343-933b88ebf7eff4c095551e0d9e50cb0d.npy +02958343-e4be3f3bc271ff71c805dfe4ca9f2fdb.npy +04256520-e59bd11e144f6ca49aff919557ab16d.npy +02958343-fb20b20452ef661f500cc506a763c18.npy +02958343-137f67657cdc9da5f985cd98f7d73e9a.npy +02871439-3c9f48785776ee8efcd4910413c446d9.npy +02691156-30d8f7fe0da9d5d0c164bdcf3c9661ee.npy +02828884-17d085303d4c5121ed98cca8f0ccd5f7.npy +02933112-83a9e08664eeec09c59350d819542ec7.npy +03636649-90e5bd9f10fd5216fbb8cbddab1c2002.npy +04379243-b256041abd83a94862158b7ee658e910.npy +03211117-765526579b03cea972a71697434c2820.npy +04530566-80d381a6760185d8c45977b13fbe7645.npy +02828884-bacb5f46add42da9a53649a80e5aff8c.npy +03325088-8941e1839d0e718bb362845c6edb57fc.npy +02818832-4bc7ad3dbb8fc8747d8864caa856253b.npy +02992529-5a37ad3759b4d93df843a7d4732b1d6.npy +04090263-84b0027c1568c9c3694547efe15425bd.npy +02958343-a88d69e53a01aab9ff1370452e3a0154.npy +04379243-d8bd55abd721dc0c99860e9353bb52a1.npy +02871439-24c62fe437ecf586d42b9650f19dd425.npy +02747177-16ce4a2ff48b8a81d2b12aa6a0f050b3.npy +04530566-62255074b0df6a115fa2a5df3ce5bc40.npy +04090263-c95d2ac372888ef349a3c1009fa79820.npy +03636649-6138faeed623475b43ac09133d4c1d60.npy +04090263-218c020fa843aafc99f5e7ab39748cd2.npy +04379243-5d90c1e74acbae27475bcdf5ead5bfb9.npy +03691459-dd6a03f9fdc339c6538cf6df9faa9b65.npy +04379243-c12147db9b29ef9ee0480c954dcd56d1.npy +04256520-cd280bd68e1ce7f266260c2464355988.npy +03001627-573b3fed3942a148c681404257d94ad9.npy +03001627-c3778a3db3d7060bbb40b038e5e0b7f0.npy +02958343-4f2ef861d32a6f0b45594023db7cd10b.npy +02958343-10e99b1475098c0aaa69dfdc5532bb13.npy +03001627-96e9b84ee4a556e8990561fc34164364.npy +03001627-5b27b7cc16d2b25231f8120b4da8e523.npy +04099429-e7bd2548af6584878b95fd0292417266.npy +03636649-4d08db52c717b74d49c3792a0dc29860.npy +03001627-37e3b1b00196001160902b587804b688.npy +04530566-7127c0b5fbcdbf21adcf800d8263e5d6.npy +03593526-ff24afcf157e1b95bc311577a374c00c.npy +04468005-6c616860e640736ae182c6d0e8257bfe.npy +04379243-44f0353cdb820886be25fbd47cafc694.npy +03642806-b02c7e6b02d1ea5350f2b6c0ece5e801.npy +04256520-2a9fbcc138834d07a6bc98af4c2f54ca.npy +03642806-bcf57a7cbbe77f2e41567ce9c420c236.npy +02691156-d23eecb0437107756c63b8b48495261a.npy +03046257-9b9e9ebdd5c4941452b2c671e4d4765b.npy +04379243-5a6e7c4fb53f27925d3bb412062af8d4.npy +04379243-37ac02e6ef9c1ac2e21111e385a0661f.npy +04379243-48443cc15bbca01f20768660cf080d12.npy +04256520-9f4ad442e9cb51125a31d91ec836a511.npy +02933112-a679e4fb660b3751f51f77a6d7299806.npy +02828884-beece550c6a1bb1cef0add8da8532fa8.npy +02933112-bceca165030250f94da5feafe6f1c8fc.npy +03636649-49647be2c7460c5b8749901456352d5.npy +03001627-1063d4fcd366de4060e37b3f76995f8b.npy +02880940-bd2ba805bf1739cdedd852e9640b8d4.npy +04379243-be1a98a8e06c59311556e8f97439a098.npy +03636649-4924f75c6be38334f51f77a6d7299806.npy +04379243-19bc9c781df1da46824080f516909671.npy +03001627-4b495abfcbcf4b76ad484915511ccff6.npy +04379243-1f3e217cbc871152d7465eca206fda6f.npy +04379243-3cebd4314f773f8ccb9cf5f7d536cddb.npy +04256520-22d997a2ee077e3f48fda83c10428379.npy +04379243-4cabc64d91668d76890992ddacc04113.npy +03001627-be9ced795316066f38620af15fa7e604.npy +02691156-a931895438ae4502a9f468923d4ea2fd.npy +03636649-8a6d770e6b4942c5ef3a2c64cef919d0.npy +03593526-2d9fae9136d41ee2b978cf07d1cb130b.npy +02958343-3bb3b6b85e4e42873680ae1a67758160.npy +03001627-80f9fb95252e6e535bc104fbace43d56.npy +04379243-9d59a4bb0e08150148eaa510713cb074.npy +03001627-57a54d8b1594c399423a79096715f202.npy +03691459-2a59accd6ff9b5265c38e15d823f1476.npy +02876657-546eded3ac7801412389a54fb53b0765.npy +02691156-a675480b02f939424131d9ef9081c198.npy +04379243-3f9200756c2e3aecd028c2e338a88f09.npy +03593526-4996f1c0120f4c62ab361b6be63163da.npy +02691156-1a888c2c86248bbcf2b0736dd4d8afe0.npy +04468005-83dd4b87114ddf2ec51d8e07a45cfa0e.npy +03211117-dfbce5e6cca00c1448627a76b6268107.npy +02691156-34ef846a22c6a6ac5e9e2656aff7dd5b.npy +04090263-43aa82d8c71e6ec69f433921788191f3.npy +02691156-9b5e193416d5b2c09d608d5eb8e56ba5.npy +02828884-62cc45e9d704d87f155d75bbf62b80.npy +02828884-7cab2809bcc7b73a141c96faecd80bdd.npy +04379243-adf35ea69635bade7b9c6deef486a7d8.npy +04379243-9a4303e83aaeae9cb2ee6b27e0eef6ad.npy +03211117-fbe9615a45afa17524f0493013a8318f.npy +04090263-cc4eccfdaa0aaf25efcbb3a4a9f89cf0.npy +02843684-4abad12b5ed565da7720fd193c09c4db.npy +02691156-345570c792fde290d49cdf0198aeb01e.npy +04530566-804e29433fda9657746ffcbc44510229.npy +03001627-36447db5cf7b5a27ab5c60fa85a57ffd.npy +04401088-59e5dc88174971c567964ba700cd97f5.npy +02808440-842839d83fea08eeccd0340812259a39.npy +02958343-44f4bebe8b14badf314b3b3dfd6337f4.npy +02691156-18d123aaef6b911954eefcdc602d4520.npy +02958343-6f7cc4940eee83e57bcd1993e004117a.npy +03001627-bf7e8e0dc4f4038cc2567be77cb7ab45.npy +02958343-550d6c4149699f4f93de227e8a339990.npy +04379243-d48b1d27c46b56f2bde1c279d540fc66.npy +02958343-c9b956006607a48c75dadc997718614d.npy +02933112-3efeb00eeba8a6fa2db3e9b673557fcd.npy +04379243-3c991b31710144c5923e4a84d4dce694.npy +02818832-19d88337c81737d3bc19762eaa7ba40f.npy +04379243-2b567360f02ba48e4923701c409a8965.npy +02958343-b50f9931670e25ef44ccce632b473b8c.npy +04379243-27295a6f585b7817febad4f49b26ec52.npy +02876657-634c59bf37676ca64c3a35cee92bb95b.npy +03046257-2f2e423b7155dbc5844442d12ed656e7.npy +03636649-9c4a3637ca2ce09d4454439c22a43db6.npy +02958343-1c53bc6a3992b0843677ee89898ae463.npy +02691156-420f92d84c88244b9a6e43b878d5b335.npy +03001627-4ed2bc57d5fcfbd82c37553db37ec752.npy +03001627-4608b290c2383d7c9730cb37c9a5f63b.npy +04256520-c05bf63cd7818b6f19fb4103277a6b93.npy +02958343-d0552c332fd0182df3cf3d2cc3dcb043.npy +02958343-fe78ad3863e25cb3253c03b7df20edd5.npy +04256520-a1dbdff3da83425f3eec26c23f5bc80b.npy +03790512-6e37615194e808d3b37378f3c85478b4.npy +02933112-6788de26abc86a8480fa521a9c7198a.npy +03928116-1cc9f441f6633b932d9da001bf4482cc.npy +02828884-8325e5496a7ab8abd2b12aa6a0f050b3.npy +03636649-dc005e462f4941078a3097a6302b0866.npy +04401088-e8d704bfd9b6c7f39af985c9d0dd6085.npy +02958343-92c4d4bcb122509aafe1d4530f4c6e24.npy +03211117-1f4b16094bd83af82d2d2896f4b277fc.npy +04379243-34787e9a9a0c1ff4905477d2a8504646.npy +04401088-471a1ba8c1e1fb0a5b031707d900d7ec.npy +04225987-570fae86bb5e1843d587b281fa5e7b27.npy +04379243-aae0d0d70c13b8c781faebbdea6bd9be.npy +02924116-7930d2ca4a3f4b46d64784d8f0d2a643.npy +04468005-62233a4705338938f05cd1b93df67c5e.npy +03636649-a130ec5d53e62931d93768e7b9b1eabf.npy +03001627-d794f296dbe579101e046801e2748f1a.npy +03636649-9ef7ccb91a25dc988cc413950b617e8f.npy +04379243-be509f0aab6ce96251d3c864cc68e22e.npy +04330267-1a98ec71c011d3c1980d7e8bc442d06e.npy +02808440-c033a70110171a594cc3b7bdfa613934.npy +03001627-8bc130dee1e488925a7b0949b519072.npy +03211117-4abc3db68398e2cf16eb1b6d0ba9133c.npy +03691459-3d18b9cbc81bd83b83247f812f2eaa97.npy +03001627-1e304b967d5253d5dd079f8cece51712.npy +02808440-d11d01a4ab7912347c34b08df917732.npy +04379243-75e206fbfaa7a973eff7102cbb9312c2.npy +03797390-f1c5b9bb744afd96d6e1954365b10b52.npy +02828884-d1190ac57a48b879413d0cdcf1f63207.npy +04379243-8ebe791395cadf8dcdc074d7b3f1e7e1.npy +02828884-b1117a83ebf5a4c9c337a931444a5063.npy +03636649-6ee5804580c170cdf6da603e92626bf9.npy +02691156-6da4590bf9d7bb9698b8c800ae001b66.npy +02691156-c7e74cb0f2dcef904abea106683105f.npy +03001627-2a8b0d30928d3161f7b783634bf3f92f.npy +02933112-7abc6f3fcabd914157d513bbf87f8d1a.npy +03001627-86fed830cd355f591c0f52f4ec8b820b.npy +03691459-115115104976edfdc066b9622c005c53.npy +04256520-8f1ce2b3b4f352254b3c42e318f3affc.npy +03991062-58535fe2845a3427ff1ebd5836684919.npy +03636649-ddc2d39dac6e84506c5b8009db95f66f.npy +02924116-fe216feb2fb07f8dc9a4da29878ca580.npy +02691156-a14b262838529c2c81e1d9f6b27f1a92.npy +04256520-708e7253604979d06d83c04495f2aa08.npy +04090263-5febb85000f9df46c2e0257dfc41d300.npy +02818832-6cda64954ee8f9c122347dcaec583703.npy +02818832-76db17c76f828282dcb2f14e2e42ec8d.npy +04090263-8ec7ce14af18580ea5291b13c05695e1.npy +03797390-34ae0b61b0d8aaf2d7b20fded0142d7a.npy +03001627-37078d0597a05284b05550de345b6d0a.npy +03001627-adfab5a4d020094f98cfd47a860803c5.npy +02992529-d1b34149a8faba42faab2c6c450c7c1a.npy +04225987-7c009b2a37ad02a9a72f80277e176a2f.npy +04256520-56652a99cd43b77744dace04559bf008.npy +02808440-1f5642ecc73ef347323f2769d46520fa.npy +02958343-c00ec8e0880f507ba2e48b029cec5d4b.npy +02691156-afa65aa66f7ca040873ec74c119307b9.npy +04379243-474816f0203184f13ad51ab774fc9235.npy +04530566-d80bd439608923e07610cb1c03c9c3ea.npy +04379243-e6a1c65789846ca8c88ecf8c33c3edbe.npy +04554684-17dd78a433c3840b51229e7d6fc0cda8.npy +03691459-14fb43f3962bef40ce2d0b720afe8196.npy +04379243-6ba59a9ea719aefcd323d6bd8db8de5b.npy +03759954-9a4c236fb8dc6e3e1ef58b31c4ba0d15.npy +02924116-f9a30461da15db801b54449bede4940c.npy +02691156-7b7ebc856120f97a1944f01d3ab2091b.npy +03001627-4610136087e41261f1d6726679b21945.npy +02828884-efe997f288fdce2d985ef0bf52b97bf5.npy +02691156-85da8ecc055fc6cb58328b65a4733701.npy +03001627-ca9023f1c44aa7db82390c5f604e0d9b.npy +03636649-d5400264679eac33ef3a2c64cef919d0.npy +04379243-382889dbc86b5dd919fb4103277a6b93.npy +04530566-2ba37ef44fa116f8300ca77569ad3884.npy +02876657-7980922e83b5461febe67d9b32c3ddf8.npy +03001627-3cc90d903e0ec7aa61e11d707ecb7fa0.npy +04256520-1a4a8592046253ab5ff61a3a2a0e2484.npy +03001627-20b0a82068ae767c34cc22336880d45c.npy +04090263-a159a15c0f0acc22cd8875a52047b4d2.npy +04379243-dccb87aacbcb40a4f1783a44a88d6274.npy +02747177-4c8fc739917e3d4aad5067eac75a07f7.npy +02933112-94d10abadfa0d88bf51f77a6d7299806.npy +02933112-d5c60b873643f0e99f0825ef57cf78df.npy +03001627-e89689500a1e3b95fa935eb36a2e89fe.npy +02828884-7792b15f8c598763d2b12aa6a0f050b3.npy +04256520-cc7b690e4d86b471397aad305ec14786.npy +03001627-4b38f041ed60b99f7fe17e97940646fa.npy +04379243-392ed157b61814e2febad4f49b26ec52.npy +03948459-cbe47102e2e71f8120b92c47b3d5c1a3.npy +04256520-a87440fc1fe87c0d6bd4dcee82f7948d.npy +04090263-a14e353d1bb05f46b785a4ac4a0dbd73.npy +04401088-88c3248ee6950fc3d24be492f98354f.npy +03948459-ad72857d0fd2ad2d44a52d2e669c8daa.npy +03691459-601d696b56ed35a3b4f9aaea3b860d10.npy +02958343-433481aa8cde9b692e3dd7c278f108dd.npy +04379243-e053e9199d9d7f2d276b6f6d90ee3a83.npy +04379243-282b2cd82ba901479f8c3d2002c77ddb.npy +04004475-8f8e4848bc5769d0c4d354a5c6371202.npy +04379243-52896ba4c6c35090d3c1501c166e6b2a.npy +04256520-541e331334c95e5a3d2617f9171b5ccb.npy +04379243-c9675e9b6358165f66ccbd11a6ef0f68.npy +02828884-ab13fb5a4eb5897eaa9fc9f9a28d2718.npy +03593526-58757fb09681ea3236b0f2a1430e993a.npy +04530566-74d3bec29981aaa0efbed58ec3ee6f0a.npy +03001627-2c6815654a9d4c2aa3f600c356573d21.npy +04379243-a7d4b7751892502a9055f83d11955109.npy +03046257-11a3be19e931e77caadb7997f5aa04c9.npy +03467517-772d6017a18caf6f93f0194265a9746c.npy +03211117-5ebad73554fd866830bcd442adebae0f.npy +02871439-5b39e6a8f57199409bda39e34f423da8.npy +03636649-83254a427fd8309a36ca19fb57d01d2d.npy +03001627-d0b06607653b1744a8ff3e07cfca4801.npy +03325088-b56699547687adf76c18e71fd49c4dc.npy +03001627-b0a0f58be9f5dc0d3825a5bc524f67c9.npy +03001627-d15543efce9acacc8687ff9b0b4e4ac.npy +02691156-dbd74d18fa992eee7f1f82f6fc8747b8.npy +03513137-8b6b50321f5d5ba114300f3e8908fff.npy +04099429-c602b0228bf58aa2b5a019b4fce31328.npy +04468005-e7bca1d29be28c92d12132319299ff4b.npy +04090263-75af21a2be51a8df49f0e3dd7767881.npy +02933112-83ce531fdc507e34f51f77a6d7299806.npy +04379243-bfa2808f136b8f7f3c8fd4a2aec82d26.npy +02691156-7edf83742bece6be7cc4b32c704a58d2.npy +04379243-9be919e0f9243b9beaf288f952624966.npy +02828884-206904737710cfdded98cca8f0ccd5f7.npy +04090263-11b137bf4816ed40f4c39a35147bf949.npy +02933112-68aa1ed740374787de650492e45fb14f.npy +02808440-8692ef3bc81aa4c84c62bee40dcdc539.npy +02958343-764f08cd895e492e5dca6305fb9f97ca.npy +03797390-27119d9b2167080ec190cb14324769d.npy +03636649-7a8615c643bc3d96ed6eef8e856a36ea.npy +02871439-89dfc1520f7b2eeed42b9650f19dd425.npy +04379243-24942a3b98d1bcb6a570c6c691c987a8.npy +02691156-fcd7a8834a7f26f15069db69b8c1c70.npy +02924116-afce9683ea4fb46fb14a1e316f26e787.npy +02933112-3c2a50e5907b0fb64da5feafe6f1c8fc.npy +03636649-92e0f64c08f0c8ac3c8d0fdfb1cc2535.npy +02958343-2e0051c6acf7798d2c581ef6c05d52ce.npy +03001627-4959bcf3886dc907108366689dda0d5c.npy +02992529-df90c50a892611ca8536be73396b323e.npy +04090263-a2b803e958f8b80b8903bced1c63244f.npy +02828884-294613465801739b4739fd13bce14311.npy +04401088-cc3f77485b8a18db562c8e1ac545ef78.npy +04090263-a2b9d8c5357fc0aebc6dd9ba5ebd71f.npy +02924116-fc5944ab92962debc374eb2c1ec8a1b6.npy +04530566-95de565a937cc4ccdb024f6e72f57630.npy +03325088-f884c50c7afb527778d17489f52f679.npy +02933112-18efc77e6837f7d311e76965808086c8.npy +04379243-2555bc9595a45e9af36ea1eb6542fe7e.npy +04379243-9c33336af33fd905776d8bc79b9caa2c.npy +04090263-8210a8ae16f55c4bfb6bde4b7e6c6613.npy +03636649-dd278cc37ecff49ce6597d391ab6fcc1.npy +04256520-67708b6fc3e76563ca691253f597ebb8.npy +02691156-1de008320c90274d366b1ebd023111a8.npy +03636649-31ddb926f7e196a7fcb8d8c6d4df8143.npy +03001627-b58f4a6b71759e59de1e664b0a22c4a8.npy +02843684-e2ae1407d8f26bba7a1a3731b05e0891.npy +03001627-513686d6d63a1d8e577b5d737869717e.npy +04090263-91ccf1fd54bde780857835988c6a287b.npy +04256520-2d987393f7f7c5d1f51f77a6d7299806.npy +03046257-e8e68c0919fa0e6f1953882160211b1b.npy +03636649-a4e4446f8ba07f1730612f5c0ef21eb8.npy +04090263-5bb16f97c928f6dc4b49cd65dfcc3a9a.npy +02747177-31d318b5f2a1be9ee88c1d6fc3580355.npy +03001627-6e71bcc876af0e319b75b6346baf0c12.npy +03325088-c83b30147dc22d0bb362845c6edb57fc.npy +02942699-7ef29f8a7a132c46e0afa7d1aded497.npy +02691156-20aec82ef5f61b0bbd46d022fd7d80aa.npy +04256520-f261a5d15d8dd1cee16219238f4e984c.npy +03001627-81397314ef43f59e98cfd47a860803c5.npy +03642806-73b436084ec1697627d962ee5b0a40c1.npy +03938244-f7a58269c59ada7c4b3c42e318f3affc.npy +02958343-7e6da78c8dde0479f30da7304391ba9f.npy +03001627-cdfa898eadf316122056b4bd5d870b47.npy +02880940-c82e28d7f713f07a5a15f0bff2482ab8.npy +03046257-d352b743810b3b9e8c95b6223f519d17.npy +04379243-1d53304accfb6fb3c3bd24f986301745.npy +03001627-1079635b3da12a812cee4bf5d0f11ffe.npy +02828884-aab92a965e310885d2b12aa6a0f050b3.npy +03642806-212bf74d7c711a1634dedfee80b7006.npy +03513137-f59e8dac9451d165a68447d7f5a7ee42.npy +03593526-dde696b23a0fa0d01529e78b4656a338.npy +03790512-90dd1c4d894653322cbca070ad1b4ac0.npy +02958343-90b4f0d3187ad88c26a3125b78368401.npy +03046257-85551ef04a5bf758c0a61ad1cf92b694.npy +03948459-14fe99eb0c105a90fc9c56fb43681c11.npy +03001627-7a7b08cf81cf358a8616812464c86290.npy +03325088-fae7848a58bdf27937b2bb75885cfc44.npy +02871439-d97562d2e2eb296dd096bf408b606360.npy +03991062-ead1acf723d7b25d61aa3db764c0b4fa.npy +02691156-5392580fe70da9043554ccf8c30febe7.npy +04090263-18807814a9cefedcd957eaf7f4edb205.npy +02924116-41bfef394b803a9044f19502064e0a74.npy +04379243-971939c687f63b9eca76c527f185435c.npy +03001627-def03f645b3fbd665bb93149cc0adf0.npy +02958343-b15c72a5ce982b9ddc90bfc1d450ece8.npy +02876657-d3eea69d9d58401c76c2a9de5c96f76.npy +04256520-5aed18ebaa1360229d51a07a5989d077.npy +03691459-77f5a7479859ef79d97a4c09acdc158a.npy +04379243-c68ee4070eb551c84e71b4762a7e566.npy +04379243-66a3fb3a480c2b9e7b22e9efea2f565.npy +04379243-81fc73cf3796dc2ce14c803a60e383.npy +02828884-78585e161ee3e39acb2a965e75be701c.npy +02924116-fa9612f559f3cf53349a6083f1797025.npy +04379243-9b0a6771ddd952a036b0f2a1430e993a.npy +04530566-861048281f4507b45935a8bd0d2fe1f3.npy +02691156-333278f95a359498e768735f27170bc4.npy +04090263-8aff17e0ba5d749f6b2c8bb96250e4a0.npy +02933112-25ed0233d292deb413cf34dbb0dd8875.npy +02992529-922380f231a342cf388f6c7a9d3e1552.npy +04379243-daa7a962994ff710d19f6764502e1046.npy +02958343-70b8730b003c345159139efcde1fedcb.npy +03046257-375bdb86278eed0cafd37229d372aba7.npy +03642806-cacb3a7908b0bde4478a2ccf0e4d84b2.npy +04468005-ee72e852bf1d95c875302cecd0dc2ac.npy +04090263-7f7efcc097dd76ac8c0007e5a8235290.npy +02828884-738f4ce6e01920e72e558e0eb05b86a4.npy +04379243-819676c81556d0d09ed5db740d23ca46.npy +02691156-427240c0fde25a90e6901f9a264cdbc0.npy +02992529-1f565ab552dc89727e51366b0cf7747.npy +02691156-cc23974115a8de15d13ef00338ba8c52.npy +02691156-b43ccbfd5e1d88bd780469afe5e05eb1.npy +04256520-e29fbd1feb9659dc843ead12644a79bb.npy +03991062-15bde6780bccf1cbcd075f7b8318eff8.npy +03001627-1bcd9c3fe6c9087e593ebeeedbff73b.npy +02691156-3fc25f2cd192f7d262b600da24e0965.npy +04379243-f67d8afd7611fcdb45e0993de2a122d7.npy +04379243-6e29806cb341576ae9deec47d8412ee.npy +03636649-cbe4301ef1418bd8b036d6b8e2579386.npy +02828884-738e4ec61f69606bad5067eac75a07f7.npy +04379243-d07b44f271ded6a9c211251dafe812c1.npy +03001627-3ede0a86fff6f79632284c722d808bec.npy +02958343-9d2b7938d426633b28044fe9244db50a.npy +02924116-8757c29fd2ad648c193d7855ecfc1bd3.npy +04090263-bfd8b5214e4a174d589c07868201b17e.npy +03691459-c8b4a5d2588868a7a1dc1681ada9b3cd.npy +02958343-43a723b6845f6f90b1eebe42821a51d7.npy +03211117-700dca3a410b751551d078b27da66690.npy +02828884-b179e972d13ffde523c05fdd9cf000c0.npy +04379243-6a3bc6b44ba974b69c0c9824ccd078be.npy +03261776-1757fe64e76a9630fc176230c2f2d294.npy +04530566-fa18b7197a462d9b87c4e42a13b47711.npy +02691156-e5a7a353d5fa8df844b2fa2cac0778f5.npy +03991062-f509d1cbbe3e5bc7e88c1d6fc3580355.npy +04468005-33bc37e13333430552470de2774d6099.npy +03001627-e2dbe84030167f1ca5aad165050e534c.npy +04256520-483518216d58f2581b7dbdf53d301715.npy +02924116-7ee6884bb0bbf9e352470de2774d6099.npy +04379243-2c3a4ab3efbf12d74ef530b007e93f59.npy +02933112-cdc3762d2846133adc26ec30fe28341a.npy +02691156-a1017765200c668c6ecd5ddc73f570a8.npy +02958343-4c427f14f21f128ffa38d2670ab5169c.npy +04401088-983b362e25c008b1b36be681f90b79af.npy +03636649-5d91d6f6fae09234275d003e423c59ba.npy +02691156-bb8c3e64da2788b98057ec2068d8fa1.npy +04379243-f408befab026f5001e5e1a907376dffc.npy +04379243-6722714a020f703451c4deb11af7079e.npy +04379243-81e991df9ff8b970a2ab2154e681ce15.npy +02958343-2c304c54a6141d214ff3c6764341833.npy +03001627-90f124aab57c518eb866f4a999c2a978.npy +02958343-69c6599f55cbe2474eb766e5a46fceab.npy +03636649-51561910f274337c452b6f7f8fb75eae.npy +02871439-c11fb13ea583b02ef6f1a9781d483f33.npy +03790512-a9c432d1dc4034762a45a87054fa7272.npy +02808440-36a1ff10474e401ae440cc76354dcf85.npy +04379243-19d04a424a82894e641aac62064f7645.npy +02691156-3693696a7d11f2a866cf1b4a8fc3914e.npy +03001627-40db46d8496af369c605aeab73103431.npy +03001627-9af15c2a94ef79844aebea9384ce74e0.npy +03948459-db298a7cb95aea676ecdf20adf3e54ce.npy +02933112-8af204f53bc871a2c05575120a46cd3b.npy +03211117-ad0edcc0855d1218dab76ad0db1f9537.npy +02933112-c9576be714b6cf2d219113a79b8c092d.npy +02933112-5bfc4cb92e9d3b1f79b0363dd1368699.npy +04379243-254cda2719087d58d810b14a81e12eca.npy +02958343-cbe2dc469c47bb80425b2c354eccabaf.npy +03467517-22033c6d7e5a90f193f0194265a9746c.npy +03001627-377fbf95d0d5e9eb90c9244ba8c4eaae.npy +04379243-3af1f6a0d7a8584d719d8721fec72f0c.npy +02958343-808e19aed606f10cf919864ecec729ac.npy +02747177-64976ee2a69d3202956c23e7ddc28c00.npy +02691156-ae8073beb28788809f576466d21c96ff.npy +02958343-df741c5b5cf87b16c85067e81ba6deda.npy +03001627-439418b35f600f4bb10dc0fca58d0b2c.npy +03761084-a193f33f35e42bc473a36a7f4c39198e.npy +04379243-4de159bb2663fa4d58b22e372d13dd2e.npy +03642806-69c1b09e3cd5056d11f9b5b6530d6e16.npy +02691156-1b90541c9d95d65d2b48e2e94b50fd01.npy +03636649-5489ecdeac5c1cfb38bc5dac9ac556bb.npy +04379243-b879ff9d30911558fe2d13a096d8b561.npy +02992529-3921288228020482b305960cf7a7281f.npy +04554684-c2eb080246a97865c4c2cb2195d7bfe5.npy +04090263-149785138bfc9c2011f7dcbb4a32aee5.npy +03046257-9c5997539e0a6309356a0af0abfae2cd.npy +02691156-8c2f2570e178823562b600da24e0965.npy +02691156-e6f0811f15286120cedbd07f4cf21a81.npy +02773838-3edc3bc2ecf58aae40090e51144242ea.npy +03046257-d6242c261709ec5286d51c34f8e7e658.npy +03691459-8b73786c112d262d4852385de47501f6.npy +03636649-dfd06ea82f5a5b324aeb986669a16017.npy +02958343-baa2f488ec67a0a7c66e38c3984e156f.npy +04401088-35dc3f0f2f5fe8d667a434dda72a2c24.npy +04379243-f22dc1d847c5b82f585f699d798e7ecf.npy +04090263-ec372fed4900876350c27b805d1a86be.npy +03624134-390448ff0ec27c20c1abdd9923e0a8d4.npy +04530566-48cfd8b4bc4919e6cbc6ff5546f4ec42.npy +03001627-d50a49368f5d0e7c284432ce2f42f498.npy +04379243-4d1d28d15b19f9101e0e41d96d3d0a78.npy +03636649-ade3cb8149a1fe6dc066b9622c005c53.npy +02933112-583c242abdc4c08e4da5feafe6f1c8fc.npy +03001627-73fee38797aeced4de03ab2a27ba7531.npy +04256520-c81cf82daa56a165271513b292108db.npy +02876657-d851cbc873de1c4d3b6eb309177a6753.npy +03211117-6a759a4b85141936e4157a1ae61981fe.npy +03636649-d2c9d9efe9592eefcc901650bbbbb0b5.npy +04256520-e9ffbfa88c9bf2662f3a69b1a6aa6812.npy +02691156-2a05d684eeb9c1cfae2ca9bb680dd18b.npy +04379243-edcb2dc19b063f8ba8737fcf23389014.npy +02933112-8c7cff4d76ceef7cff900d986c9dc4b4.npy +02691156-827c877ebc70fd01faaf13445ab19dca.npy +04379243-aed5697ff59e3d3035478a6869a3602d.npy +03337140-126974e8219d2fe71fe8e0bfc9ed267.npy +03001627-3309d6cdd3f30ece3eec26c23f5bc80b.npy +02828884-2c183b1b94d94d34ad5067eac75a07f7.npy +03001627-21bfb150cfc23accb01c58badc8bbc39.npy +04379243-f742dcebb1d9ab0cf51f77a6d7299806.npy +04256520-9e0b01fab5d15b768695754f4338760f.npy +04379243-87f355b618f13233d5cb6d178687b980.npy +02958343-1a1dcd236a1e6133860800e6696b8284.npy +03001627-73828d9eba46266c4b2e4a0ad7c25461.npy +02958343-167a645149efed1fdca2ca2624f821d9.npy +04256520-e40e193e6468db644b3c42e318f3affc.npy +02691156-5466493424ca47bbfca1f1143bb6bc17.npy +02958343-c6a7b37a33b5eef728af9bd424dcd6fa.npy +02808440-63c94de548d3536eb362845c6edb57fc.npy +04379243-a53e528827345c7b593ebeeedbff73b.npy +04379243-668deaeb91295739664b3b9b23ddfcbc.npy +04090263-2ad5e27d42573768adfdd35441a4b4ea.npy +03001627-ef03458b97c8775b492d9da2668ec34c.npy +04090263-cbac383f55b031eefe3324230bd9365d.npy +04530566-52f3ad585a3900792de1329cfb242f46.npy +03001627-6d6e634ff34bd350c511e6b9b3b344f3.npy +04090263-d0062058d4eeaafe494dcb92319db1d8.npy +02808440-6af7584c142246a23321831d2245cf06.npy +04401088-3f3770476f094a6f2093f68f248ba9f6.npy +03001627-f3955fc72bd9f91e30e06a011e63236a.npy +04530566-abe4b3c405e1cc67bcd376892ed4f5df.npy +03636649-71491d1e3a4c96412474124825d469e.npy +04401088-76781e8b967f98b5a0eb5a85db887292.npy +04379243-ae2575fb16051c6b668ae11a7db5e82a.npy +02828884-a451f5d4b01cc78856f6fc4b4ce1db04.npy +04530566-c77c30796e80cc291edf59b9c77b0b75.npy +02691156-5e77ccd7794465dacbbcf57b22894cc3.npy +04530566-9c50b10fb651e57fdd93d77eaf89012.npy +03691459-926b6071c45525726d3462e1e02b75d1.npy +04379243-d8fa26d89a3ec264ee1dfc331dd3e94.npy +03593526-4708d67a361201b2ff7e95552a1d6a0e.npy +02958343-817bb8c69e4ac23ec81ddeca50aa3117.npy +04090263-56f810f9af40b569fa57ccfa6a55cc4d.npy +03001627-5c1c5dd72247cb6526428c7519676cd8.npy +02691156-359f69a030d69b3da8fcf7222eacb152.npy +03001627-c8ccac20f5cc12528ebcc1a99d4058f2.npy +03636649-4d6ea3aabaf02bcd29c39f613cc72411.npy +03948459-b2bacf7d683379db2f4c3670d21f5380.npy +03001627-39825fb4341ebd1ccb002c1e2b5fc68b.npy +02808440-b82ff88475f56b66c7bff4dd33a963ab.npy +02691156-24e79ed92be932e19bfb78d2af523ae.npy +03325088-50334e43e1fb8c03c36fb70296e45483.npy +02801938-c1abb91a5a9e2ea36d0c80f3bebb5ec0.npy +03624134-44ac83f91f1c5a3d76dac8bd43cd3e3d.npy +03211117-45c66a24bf0851246e22e2d2f64c8cef.npy +02691156-5b86cf0b988987c9fca1f1143bb6bc17.npy +04379243-e3b7fbed310c2c397c8d78b9aede742.npy +02958343-10716a366de708b8fac96522b26f7fd.npy +03001627-e3394ec3b63fdc255d59dae8d8b300a8.npy +02876657-3ae3a9b74f96fef28fe15648f042f0d9.npy +02880940-292d2dda9923752f3e275dc4ab785b9f.npy +03636649-84f3f1dec806b1df82e8c06333eee87.npy +04004475-f944db0e2716b8bade1e489cf4404f34.npy +02828884-6e77b16c5463bf147756371b6ccc35f2.npy +04256520-f0a02b63e1c84a3fbf7df791578d3fb5.npy +02691156-817add33c6fdd1534d210d9468aedaf2.npy +03001627-5cf7a44b8cd841d01f0ce9df23303cc0.npy +02958343-21e028eacc690c9de13f97dcb961e16.npy +04379243-6a61c9e8ade75fbbc3bd24f986301745.npy +03938244-b5cb58fb099204fea5c423249b53dbc4.npy +02933112-3bb0b093c66b1af37a0a46ab3b36f780.npy +03001627-6829ec525eab85671f2351826b1ffa67.npy +03790512-b1f2ea1859ae2aabe4d4c489303b7b1c.npy +04379243-c15e74a91f0b59d533f68dc899e13f.npy +02828884-45c49b9d7cf74ed261477e162a5a4fa4.npy +03642806-2dbabd43fdc9e21ffae724b4e4a1ff51.npy +02691156-e5bb559c00276ad354eba1f1b35fb0c1.npy +02691156-486f1238321ffd2825eb6beb311c44e1.npy +02691156-7df1ad6363410383f3cc56bc9bfcde3.npy +03001627-55fc24bb7f0cab50a24ad2a1ad4f7142.npy +04401088-68082af238b7973aa4d4dcdfc6fd3059.npy +02871439-e4a1c757cc0564f5ca3d3aba150597ee.npy +03001627-d8592dc28b9f0afa387379bbd607d69e.npy +04379243-1e31a474b6867a7dee32a260ef9debf1.npy +04379243-2ef012ddcf1cca54f51f77a6d7299806.npy +02958343-fdf2a756a86b2946c427f8508e3d634b.npy +02880940-5e2c558555092b706e30831c34845769.npy +02958343-ba0fa0e807fd275e0445fc6d980dd5c.npy +03691459-e9723b5243412b462a8eeb2a1f362462.npy +02958343-b72355cdbf1127f4becf71e2e014ff6f.npy +03001627-bc78aefe3bbceb4617b431cae0dd70ed.npy +04379243-a42ad074c9b1bf2467dc358060e3c47b.npy +03691459-a76f63c6b3702a4981c9b20aad15512.npy +03928116-1717a1704e85103240257030127f8974.npy +03001627-bbe36f91f3f0de06fbbc7c456d85ce59.npy +02691156-99b2ee98a16b3c0b1338b1079208569a.npy +04468005-831d42f28813d72ed3e657703ccaf9a5.npy +03001627-b541d3afd111d86f265d8abf3d2f9c3.npy +02933112-1055dc4f3f2079f7e6c5cd45aa112726.npy +04468005-aaa3e125e77e4d6e5f72adf4b0bfab9.npy +04379243-fe5e1df0653804d6ce4670b160b81e9.npy +03624134-508ca8fa00e0cbb3e168961dc7b88f65.npy +04379243-45e24015d08d65eb8d861be5b561accd.npy +04256520-c460cbeabad41fae963cdf8b01c64c16.npy +03001627-94cc9d6473258381171b03ec6def09f6.npy +04379243-8e3bfa092e83c28d55f46d55537192b6.npy +03001627-871243bc93615a758df4f3f615062e0.npy +02691156-d51bd83c27fc3167ba4ae55719e5e195.npy +03001627-8ff4ba87d700054546992ce9fde1b2c2.npy +02933112-d6724f5b2761dd49ffd5817f210f277d.npy +02691156-aeaa3ef74dc4c60c95175320d65fc89b.npy +02808440-65b424795fe6d071ce163f4a7838826d.npy +04256520-7ca57c98a3557774f251828d7c328331.npy +03001627-b8ca8a0c021d152887bcae7a654cc37.npy +04379243-4da9a56cce188c838aaae3d020f5ddf8.npy +02871439-3edaff50f5355da2666ec9bdd91ab5f1.npy +04256520-b233a919f5d2f6ac2ad490d4d7fae486.npy +04379243-a82406382a5d563099e8bf807e902261.npy +02958343-bd6eb1dc7d16372651a95aaa6caba1d3.npy +04379243-a62114bf11affdb1139408582c8ed98.npy +02958343-402d1624e1c28422383a5be3771c595c.npy +03001627-19c01531fed8ae0b260103f81999a1e1.npy +03691459-b8cf1ee73b068390205b075c6f63f661.npy +04468005-826a31947264bb9abb8a744d2911bf5.npy +02828884-77c25a03784c8ea4d4d8765e3910f617.npy +03001627-cb8f3b4355d891514a87d579b680d4d6.npy +03001627-ac041c720dc66c06d1c83bc8b134e4d8.npy +04401088-aa833540c3f2d77e2915acf4d1de24fe.npy +03001627-fb4e388b57e36e7ceca29403b7226aa1.npy +04256520-b5fcd21b70bddb3fbd16d4490a10a752.npy +03001627-9ddec02fc7a03c19a8699b6183baa203.npy +04379243-2275823b40c3e669be2020f4ae1ea66.npy +03636649-1a44dd6ee873d443da13974b3533fb59.npy +03636649-1728c555de071aad3ea96ac97db63fa8.npy +03636649-609dfe9367c0e64e2b520984c067934c.npy +03593526-3986f7e461d3239ed8a9aa07aad9b484.npy +03046257-be4745a1ccd316a914e970d26b98a862.npy +04379243-4dbea9b679493c3c31ec4caf9b70d4ed.npy +03642806-97be95bc027c84da5a7ade0e7a3afdc8.npy +04401088-8a26be623e40850a203d19a168d29f04.npy +02747177-f249876997cf4fc550da8b99982a3057.npy +03046257-c5fba67f2cd5797e4d46ab71b147ac5a.npy +02942699-46c09085e451de8fc3c192db90697d8c.npy +03797390-6e884701bfddd1f71e1138649f4c219.npy +02808440-f8df3a70da926ff2d53f422837597b30.npy +04379243-d3a8019633567d71b20716e5484f7807.npy +02691156-1e155559446469112e690fa6dfd5d610.npy +02924116-6a9fbc6a3b301736191c3762b497eca9.npy +03928116-423d14787208578580ff80bf789cd.npy +03001627-277fb4da6bea894c19fb4103277a6b93.npy +04530566-f10162679968fb0d8f21fab201b7ef8d.npy +02992529-5ec85395159a335221844676433a0aca.npy +04330267-b296fbfbbe5dccf09c12d6260da9ac2b.npy +02691156-bdfa5ff6aefd3fb8a57854d2ce086d65.npy +02808440-77c08eaf01312160a967d8a8714fbc16.npy +03948459-3b4def7c9d82c19b4cdad9a5bf52dd5.npy +03593526-24d09682cc8ead67191c3762b497eca9.npy +03001627-7aad83423b294c59f4b35f4029eb1ecf.npy +04256520-1d9a26feeba782e3f91663a74ccd2338.npy +04090263-3af4f08a6dedbd491703868bb196594b.npy +03001627-53f01d977de993442ea98d69e91ba870.npy +04256520-75d52bdc003e828af2ae88c7a945acd.npy +02871439-1b3090bfb11cf834f06824a9291300d4.npy +02691156-70ed0fe305145f60e53236e6f2fbeb94.npy +04379243-9cd3cd9e93ac389e82db9fca4b68095.npy +04090263-bc79d0cc0c27731a3a04e41b7ea7de8d.npy +03467517-b83a81b2476ec59e59610f6f40382499.npy +03593526-2ebd0fb6ed39fcaeb72e05c63385c6b5.npy +04090263-fa4dfabf8e55704532967a44e902e4c2.npy +02808440-198f8c170347741c54d7082b34825ef0.npy +02691156-b4575e5e6161fd497b164268a44f7712.npy +04379243-b47d8874381c5a03a561edf54b47b109.npy +02691156-fbc429365ab7136be1a9c234926c21e2.npy +03001627-b7012b9baf6a71526cff9b44fdf0517e.npy +03636649-d2d76338428129f62ffd6bbc7610ab0.npy +04379243-6558819685f96577c0f947750540fb22.npy +02691156-5d0d3f54c5d9dd386a1aee7416e39fad.npy +02691156-ebf8011ea1f4b4190b1d6deb98feec6.npy +02958343-9025ac13eac31cccf5cb3ca022cf045c.npy +03001627-fde328d91eee1480fc0035da39bd5e1.npy +04379243-70500798fb5d593be76bc197b3a3ffc0.npy +03046257-3ef61322360370ad81cb5f482735cd59.npy +03636649-380d313b3c277f5e1735ea0e092a805a.npy +02876657-632a0bd7869cb763780bbc8616cb15f8.npy +04379243-bc33b97457ce7a0a569537f38fcb7202.npy +02828884-17b7a0e3c70dbc3d90a6b1b2b5522960.npy +03211117-16e6d2d5b895f04dd3e94baac7a5a368.npy +04379243-3c9c9adaebd66ebc5fceaa39a8353bde.npy +02691156-63dda61ab3ccc4304a3b534252984039.npy +03001627-96c0ecd1ef80e818c8687ff9b0b4e4ac.npy +03636649-229b7e36459a9857ef3a2c64cef919d0.npy +02691156-36ce6d61721805abbf3143b1cb6076a.npy +03001627-b5b0a880ff4e26c1a48e53188865c070.npy +03211117-ec77fd7cf6e4810ea0a7b8ecc42036d5.npy +03001627-5eb42c663aa7c8afb05550de345b6d0a.npy +03001627-51591397480eecccf58894a68fdb6cca.npy +02958343-2861ac374a2ea7f997692eea6221681c.npy +04256520-5f50fabf8c2012034d4134b9987a1946.npy +02828884-5ed9651c928575aab719144d1cd30cfc.npy +03691459-2dbb22fe2a25064a7e95eb283a46224.npy +04379243-c93685c8343e995d760858b697ef756f.npy +03636649-a26918d26e74fcb796433fd91744c67a.npy +04379243-a99b37edfd721010bc7eb7ec22211551.npy +03636649-66a7a9a417660413e2364c65f912dcd4.npy +03467517-740e196e2046c18c352e5d4d2615db5b.npy +04401088-396fba35f02a9cc9bc1f690a77fffa14.npy +03001627-1d6f4020cab4ec1962d6a66a1a314d66.npy +04256520-9ed01e198c9d70a5df6cfab91d65bb91.npy +04530566-bad5505a49b50dc8b89145155e320b60.npy +03991062-c53bab9d7a20250d6a74b20a76e8ee44.npy +03467517-fc49acc3617915075756f5593365c94.npy +04379243-b0abbb1a540e4b3431540522caac8407.npy +02747177-ae33867e3c5e1703f155d75bbf62b80.npy +04379243-34bbe284f7499df071a782a4379556c7.npy +04330267-f093b08c4997bf631b3e6b75a323070.npy +04379243-631c8be7f3559e4e5691f959a7121ab2.npy +03001627-f979d2ead3517a67f20b781026d21763.npy +02808440-2bbad1610128749e1c17aef130ed6213.npy +04379243-45d1e19ee0b79df377e131ed5f0fcc86.npy +03211117-fab433a56c7734aa16eb1b6d0ba9133c.npy +03636649-353224cca3fc3ea6e5da257192cf051.npy +02924116-471005e286f5626b6eda31c44364df9f.npy +02828884-44c720c5edf8942798cfd47a860803c5.npy +02691156-45251b4f76c9a840139336f03eb955d2.npy +03928116-7cd35ab229decb47c05575120a46cd3b.npy +03001627-818c483496ce96745eea3e3d89293379.npy +04090263-2c2abe6a7d754a95c79f92df566f8c6b.npy +03001627-951f1376751fc7294b87db09ac4cfa73.npy +04090263-7c31ae88ca4faa649a2ee232a197081e.npy +04090263-7d03cdedf8e023728d00a96649d5cda6.npy +04379243-f0abcd11d8987f7fbeedb4c8fd29e2d1.npy +04090263-f3ffbc00ec1a1aa7ff5653e278e7cd2e.npy +02933112-e72235ca5b0f9b5de485c93908cf58c1.npy +04379243-6f2ffe8c014a6a458af30108ea9ccb6c.npy +04379243-5fef79348f4bc7b8c710d14956729baa.npy +03001627-74f246c1f7633eb31d1a08d58541ab5.npy +04090263-1bcf4a290a2fb6d288be2a30dd556a09.npy +03001627-4dff2fded7130c631a8db2c23945f1fa.npy +04256520-efddbcc9852c0584e235eb1ec8984f53.npy +02818832-c2b65540d51fada22bfa21768064df9c.npy +04530566-a7b07a2aad642f3f18b731fab8bc3743.npy +04379243-d1ecfd2ca0baa6ad47efcaa87d68903f.npy +04004475-18306958742f8bfbab0b172d4dea80cd.npy +04330267-993d687908792787672e57a20276f6e9.npy +03467517-1ae3b398cea3823b49c212147ab9c105.npy +04099429-d68e08b2be825d1946f4fa69a8f7f711.npy +02924116-5b69ff9c8fa61143973f659238edf3c3.npy +03691459-999e0646b798f67a5a60f8212273313d.npy +03001627-c8df724ce6f12ca2d86a257784298546.npy +02958343-8824c06f737f2888e35db9103756ad5.npy +04460130-3735b272459f1b15db439ec9067ff33f.npy +02828884-a5befb3443b070f8d2b12aa6a0f050b3.npy +02924116-29e5a19b6acef3113a06539f92e15e9e.npy +04379243-b3c5ef225f841cb59725f8348364f5a8.npy +02828884-110d24908bd4f49b93d3c9c269b9b9e3.npy +02924116-c2640c82f7bf960152470de2774d6099.npy +04379243-592420fc90be625a8b83086412477462.npy +02958343-df34c25a1e1abe9428044fe9244db50a.npy +04256520-c23747cbba5d5f9edbb047330001d95.npy +03991062-92ca0eac025afb5a5d8d4d8a3cf8b294.npy +03337140-a25ab4cc7a9df73a4c3aee8e9d3a6ffa.npy +03337140-bfb230a906645dd14c3aee8e9d3a6ffa.npy +03467517-6734fc1b08d9572d372fd8fa16ad068d.npy +04379243-77b60e760e8186bfee18bc48b60b36b7.npy +03001627-a18a82b239fc07cf433619555ecca8aa.npy +03636649-28d35fb9035fcbfffd5c9a0fa28996b4.npy +03001627-e5b0325d624a692467d783b4714d4324.npy +02992529-b18f0d53dd3db1999410a04d09c14d1a.npy +03636649-a711c673d5b6a4b350075206bc274050.npy +03001627-387600bd541f7b502d7ee37bd88bacc0.npy +04379243-7178d8a2f91a9e1c713656cb7b79f97c.npy +03001627-9a8bab7a07a869d1ac822f8036859e60.npy +02691156-ed1d51ac367d0fa5f830b2dc9bf63133.npy +03325088-6ca769c3a4429e4150da8b99982a3057.npy +04530566-7703ba29545cc381acf9e4b0d73d2434.npy +04256520-559019119818194931df860464c5f16c.npy +03513137-37f55552b517eceb501db4f27570eeec.npy +02876657-dd686080a4d1cac8e85013a1e4383bdd.npy +02691156-743670f7f3a8042e6ad6a28101cd3ecd.npy +03211117-d965c9192e2ef568d36eadf9dfcb1300.npy +03001627-2f296d487ade29fe770bec7a2461d9a3.npy +04004475-4475cadbae94638fc4ad1ac611778322.npy +02958343-209c79dbd4f7ad944ee32d005103a21a.npy +03001627-da335ee36e78e24988dcbe86402c7c15.npy +02933112-60d7e8aba1f692a8c2185cc0ca1b306b.npy +04530566-6834c4f307753dd1427c8de062c1497a.npy +03624134-5c6c271d248294e0e0b68f51ad1c0011.npy +02808440-d446c087555f507b412deb0d2b0f3dcd.npy +04379243-85e359daf7e56d6a94ec70278e148371.npy +02828884-19399a9aac37442359cbde03ded257fd.npy +02828884-c06a17f2c79d01949c8a0ee9a6d1d4b2.npy +02691156-78edc61edc8835b5bc0909d98a1ff2b4.npy +04379243-d2f884d5637c979214c06184923f6962.npy +03001627-daabf4a2afac24c97eaf5bcc4a8beb17.npy +02958343-abb2cf2ed0d8679e9cace18601e5d3b5.npy +04530566-10a57262251f03b28b27d51d442cae1c.npy +03001627-564f5f96bc718194166420d06689fcf.npy +02828884-18000ed6034007caf4fb4dee5181bee.npy +04379243-e469e53c260a5ca47d2695833906aa3a.npy +03991062-a19b10e509f6ebb758c88d30f502a452.npy +03642806-36bf7cd2652ccf48dd42bb2503ef78ef.npy +03636649-89fb4886797187e7f63bf7d908efc575.npy +03001627-bc4d7324d2438885f4b35f4029eb1ecf.npy +03001627-eb04d1bffae6038c4c7384dbb75cab0d.npy +02808440-b811317b75610314f7bcd99767bf77f4.npy +02933112-a49eec529b5c44eaac00fd1150223027.npy +02933112-aca4241639feb8f0921dd903dd0b8b17.npy +02958343-e9c2c31da871e0d6c203986ffbbb5e4a.npy +02691156-552871abb864d06d35fc197bbabcd5bd.npy +02691156-4508864390ae424d663e50e76f163b3.npy +04379243-7207fb41b7f9a0669223fc014b68160f.npy +03928116-a2dcfb6f77a72be8a2b299c40b68f70c.npy +02958343-2f7cf2c2d170e3c936f37029483b3e41.npy +04379243-840ab934a623e29d4253be890e153964.npy +02958343-8c710a2319c1a5683f86d898378e5d97.npy +02942699-d5624d29159a4cdb7e1c85c5c15da7fb.npy +03001627-3aa81c6d6d7d7d66c08256cf85537e.npy +04379243-2764d2783f999fd0214a15a5a42c49c0.npy +03991062-d4b9e1085ebd4f226bc258c0f0234be0.npy +04379243-4b6276df295b3967601104cd2d998272.npy +04379243-f797885ebb3b15fbf417851aee42d8cd.npy +03211117-7c16ddd8f3d099dade6274736c2a6b68.npy +02924116-424d411c37fd30384f224d639c7b7c72.npy +03337140-abe41b86df0dcd5a3da04ac9f7df60de.npy +04256520-dd36ab979c4ff93038dc42f802aebe31.npy +02958343-90902c72c195d3ce8256c497dfca7529.npy +02958343-c3e49f8c560ccc216108f064aff2426d.npy +04379243-c74ea23fce212291943df36e40894fd9.npy +04090263-8650b7b809ea14be6314c3b6a3a65519.npy +04090263-fcc1826e28e6f512b9e600da283b7f26.npy +03948459-b4341b7259f66d529f433921788191f3.npy +02954340-48052012e0500fb5a52821bf1aa3b19a.npy +02828884-a393945aad7a2cad5067eac75a07f7.npy +02958343-215da971831129bf63ee8a34069b7c5.npy +02691156-448b45ac858784e9b020e22bd5fe2e73.npy +04379243-3645a90e02d16f0584aa8fa8b66ba302.npy +02808440-dd544ed9e15f9a0e3321831d2245cf06.npy +03710193-54cb538cd36a060bf145bef7cd14676b.npy +03325088-8e8173ea18dec2c8fdbe2bf897d8a820.npy +02828884-5870d0ad92321f8cad5067eac75a07f7.npy +03691459-b18b9f87117cbc94c274436d9bc22f7d.npy +03001627-d20de927fd1b15ef104c86562c321749.npy +03211117-70c042c5761072bda543b6c4e1dad166.npy +02992529-6e183cdeba6b83b3805062aaa3bb7665.npy +02880940-36ca3b684dbb9c159599371049c32d38.npy +03636649-9a0fc544ab771054b45df535caecae62.npy +02828884-76463803e8be994e6716685cf333d2c1.npy +04379243-6da3c94506cd3e114a163d2b227b320.npy +04530566-abb6fe97ba97e1f84e3f9dc2fe7cec4a.npy +03211117-e3201a9e4ac0a8a9e255d96ab3987a.npy +04379243-197393cdb4c836a713c18ca5acf69765.npy +02871439-2c86a69902c2df5f6831079c2c481dd3.npy +04379243-7ee773e031400d09b4fc0a2b20c3cddd.npy +03001627-b24ed89d85b74771216fff6094e6695c.npy +02958343-1dbb02c20bb93af81c1b3b2ed8d13bf8.npy +02958343-ef2406c5f2f280f366cdbd877f6ab1ad.npy +04379243-48ce2cbc14f391e7d7262b1b986920e7.npy +04256520-4c0aeda1ff524383ce4f58889c7849e3.npy +02808440-45b3975a2935d2fe3321831d2245cf06.npy +02828884-9a2d51fbd6b58048c955e5ed03ef3a2f.npy +02691156-d605a53c0917acada80799ffaf21ea7d.npy +04379243-cb374c698a5339f3d6fab6a6a552905a.npy +04401088-f18dbf3cbc7d3822de764ca2f457c756.npy +02958343-9a63aef0a99f7bfab2c2809513f396e.npy +02828884-a9aa868b77c3769ba873941124e3356f.npy +03001627-3612bf5942858c5976ccfcabdd2d6349.npy +04530566-18642f35971d1bec86c51c3aa93bf029.npy +04256520-f85f8e6cefe5aaba4b3c42e318f3affc.npy +04090263-b63023bf7697571912b38b1d99376c0b.npy +04256520-2de1b39fe6dd601f1e03b4418ed1a4f3.npy +04379243-6ac583c624b9b76b9d6741c36fd1cd2b.npy +03001627-94ceeee26248a275e8e2378aa23e4253.npy +04379243-b9bbe91d581fbedac8ba7a179c3a36e0.npy +04530566-39ee3af7e07310f494daa4565dd30535.npy +04401088-33db5943a8942fdfd998bbb6a9d203d8.npy +04530566-cb89a617351ec4c4eb2c303a0e0d287b.npy +02818832-90e5b3c4b760b0b5c5df8e3012a84650.npy +03325088-e53c6ac72d0f1bc13321831d2245cf06.npy +04379243-77e24ba0c290ac3eff87aeb86717e73.npy +02691156-2087ba820bd70001243402995adcdc4f.npy +03001627-60d4a780abba84d20c5de2052b8e2de.npy +04256520-137589e785a414b38a2d601af174cc3c.npy +02958343-7c768295f93290391d0ca8334e014176.npy +04090263-26829f9c5626be049be47ac7c7e37815.npy +03001627-60b3d70238246b3e408442c6701ebe92.npy +04379243-bc2a117e1c6b9d0da9f547acc5e1dd79.npy +02876657-799397068de1ae1c4587d6a85176d7a0.npy +03761084-b8cf469bc1b42ab64a44340bf227e40.npy +02818832-50e6081ee2b47031efc3b1f471c445dd.npy +03636649-b9283738780e29c23a5fb687d9cb4ec7.npy +03636649-40bbb4b123d9df2028c187222995b2b5.npy +04379243-41b492376a6774f9cdaf1a853214fa9f.npy +04379243-869bf2bfa51062c47b8ec2c9a49686dd.npy +03991062-37c60cf073b86328a2c59a4d90e63212.npy +02958343-9ca127580ac4f9712aba37016d02e162.npy +03001627-3fdef0a7606c397331ad067823a3f0ce.npy +02691156-b7b0068ecf75d279afd477f714c68df9.npy +03001627-56262eebe592b085d319c38340319ae4.npy +04401088-ed52bccead5926dfa9fe1734a6086750.npy +04401088-b21610e986fa4c9c7cef36fa43392c52.npy +04379243-13ec1052a32ca23bfd60059ad8523f1a.npy +04256520-49d28b2dbf11e3975e4b35ff1ea95f37.npy +03001627-5c8ea11840795cb5f1783a44a88d6274.npy +02691156-f79fce6480d9276facf77e718d93f3e1.npy +03642806-9f8cc20d6b78fc3f2c545442439c8b8.npy +04256520-272594b65264b90192fe219f5eb82836.npy +04379243-d237260f66c00364dfe9cab879fd37e8.npy +03046257-5a1a2e257a862cabc5d70d7dd4a0dae4.npy +02691156-ff6e377e8e5b3757cc34b900bb2492e.npy +04379243-61ed0adc69dd8eafc3569a6df9a670f2.npy +04090263-2da91be46310f550fa6c79a0c671edcc.npy +04379243-6cf6a546e2ecbffe815a7efb12912.npy +04379243-a9dfd3433837da823fe4267232c5893a.npy +04379243-324f0d772a7b728c36350d50e191a45.npy +04256520-5509f181ac72de8478eec18a8a3356a2.npy +04256520-acaf2b81121c78f6acacae5381781ae4.npy +02828884-a6947bdac4ebc97517b431cae0dd70ed.npy +04379243-e834ef941f7bc9c9e7df9f1005942e3d.npy +04090263-869ba7b568be23521c63053ffe1a64a7.npy +04379243-b14a14cc2f3c38c9e3def9c422df2282.npy +04090263-61064e4a00abaaec589c07868201b17e.npy +02691156-162ed8d0d989f3acc1ccec171a275967.npy +03211117-611a15a623643e12fab31d1a99fa2e.npy +04379243-3aebb428c4f378174078a3e6d5ee40f4.npy +02933112-a234f5b48a26fe1d12de5317fe5b354f.npy +02691156-33c8abb3658f2d4219e06ee1b2e7b1b4.npy +02828884-62ec527e6093cd007a9af08d0375df56.npy +02958343-cded640727157c18c6142312719d87cf.npy +04379243-5ebc9d8f82e8bd9fd3533dfc6ae82761.npy +02933112-ca3c48798200a14050e21024808d3b59.npy +02958343-2cb6de89f5b6e702b626f6a649199824.npy +02958343-98b30f0a29fe2a1ba7fd25564c2e888e.npy +03001627-9d7f79e306288aeac6bcadaedba80eee.npy +04379243-30dd74f09af6b1c2fe5c8ffd0f5eba47.npy +02958343-4eeac6360031021b8141ca5f94f1242d.npy +02691156-de45798ef57fe2d131b4f9e586a6d334.npy +03001627-5eb6ad0960250dddffc127a39b3c57b1.npy +02876657-6ab0ef1973477031ad5067eac75a07f7.npy +03928116-20cda8719140c1dafaf5a63e8f4fada.npy +03001627-502116e5b87d1fbe69e92c4e191537ef.npy +04256520-5fa872fc2e0447fe75fa15ccf4d13b00.npy +04379243-29b70ee8da440240de98d10ab5975b59.npy +02828884-52e921d1e558e6cda19b1c45fadaeb5f.npy +03325088-4af74fd7eaac11a2b7a867e9b35a1295.npy +04379243-98416e9f15b3f80fe76bc197b3a3ffc0.npy +04330267-eff23594cc0aed121b3e6b75a323070.npy +04379243-4ec8d6b5c59f656359357de4ba356705.npy +04379243-bbeb870f0ad9a17af84b0be7f50940eb.npy +03001627-294406eb0453d6a74aad3d2faf99eb1e.npy +03001627-1842797b090ce2ecebc1a7ae7c4c250d.npy +04379243-98b4af37112000d6bbd07219dafd2111.npy +02954340-6cfb76b40fc41da2a6e67635b9d1cee5.npy +03636649-b1ec680145762d1eb784faac204319d9.npy +02808440-a095cdd68d69912b44221bef0fa3c36b.npy +04256520-12aec536f7d558f9342398ca9dc32672.npy +04401088-388415634e1056942ab70120fece57c0.npy +03991062-4224c4923f50229e8cb30b9253efc371.npy +02691156-380e9e8c3ef07372acd7e882b88d2b.npy +02828884-61e3c4fcffab96b9ed98cca8f0ccd5f7.npy +02933112-94bb7157062d59a5f51f77a6d7299806.npy +02691156-7631caf6989bd17e4a51f4b900f5eb50.npy +04379243-ac2f8d240e2fd36ce2acfd5544378c96.npy +04379243-400a2dd6c371a2d446de2420e311135b.npy +03001627-cfb40e7b9990da99c2f927df125f5ce4.npy +04090263-ee4cf4706ce605bd37e67c992a0a6e51.npy +02691156-4f0bf26c62bb7c8b7e1c97634acf0214.npy +02933112-c5eb5577e728c4c1ab4753fa80886181.npy +04256520-289e520179ed1e397282872e507d5fff.npy +02933112-bcf7688f64a642e3fb266533561ee98a.npy +03325088-33faed70ef14d4b362845c6edb57fc.npy +04379243-728ec88a2fe37abd4a2f90e76b7328d2.npy +03636649-7b1fef0071908d4bd93768e7b9b1eabf.npy +03467517-72e8c3d93b75d8c888bb86092c911c95.npy +02828884-4790c04ee2586772d0768f88bbc39dbc.npy +02691156-7fec4732aa03b54e7db7c8d619fa260f.npy +02933112-4298f678b53d370dc59350d819542ec7.npy +04256520-1d31309c617d32b51652e2e95099f284.npy +02958343-7be86bfa8edd04fdced2b3ef33cc51ac.npy +03211117-d54253b71f017565b441e189e5a85c02.npy +04379243-7d0e1c7c5ef289bf94d582a4a37a8dbb.npy +02828884-f1fe8c6c1f9f28321739c3c7bfb786a5.npy +03001627-b2b359d7ce583ce5ed105888ecf0e97d.npy +04379243-eae36b396f6b5f97664b3b9b23ddfcbc.npy +04379243-bdf183022c888426fdda2d9537f811d4.npy +04090263-608c126f0acb73dd7e338aebf530613c.npy +04379243-284831cd2c3c4641668ae11a7db5e82a.npy +03624134-e688f0697b9a970c6402b8f491cd92c7.npy +03513137-e0b4672fbbae71a49617e37e5a669a71.npy +03001627-a33e91aea2b278e0c5ee4aa82bd336ce.npy +03759954-5e0d940640c1808a4fdb7f619836e43d.npy +03001627-5a871d6613216ecebda72093f9b5aa73.npy +02808440-878767d96ae00079a1ad4813ad2137e.npy +03325088-4ce9747bda12fba68616812464c86290.npy +03211117-89f3262d8e06acfdeb0ce5843fe6b264.npy +04379243-daaa70967da2bad4e80de6380bdd8c21.npy +03636649-e5ff9311bee487f5ca4aaad7dc0e3a16.npy +04401088-158f605ffbe6b036436916a86a90ed7.npy +02691156-63ee010741ba665c35fc197bbabcd5bd.npy +03761084-ee586138bb142e67178e7d331e641179.npy +04379243-ef4bc194041cb83759b7deb32c0c31a.npy +03991062-9dab2204d0e6a31114038d588fd1342f.npy +02691156-b95510fb88096a208fc2d09ac4aa4e78.npy +04090263-840eba6d395c192c40938a189bac3257.npy +04401088-e9352850a60bbee4975308da62ab2e39.npy +03001627-8c4ffe44076e9d4a15f62f0f1afbe530.npy +03046257-cb73394b6bf07fd61b17743c18fb63dc.npy +02808440-a57f7ca2555de207a6ebaf0d97eea08.npy +03691459-d8023575778364b035cd53a06b1d2317.npy +02828884-35948e4d06a9b07e8ba8ff316aec8d3d.npy +04090263-8fca9344f9583ed9f433921788191f3.npy +02958343-bc86f6cdcac3e6a5afe1d4530f4c6e24.npy +04530566-268110d849a3aafdec2f14500e179e92.npy +03001627-2ed3b981a9827fb0392642605da2a1e7.npy +02958343-f9584908ada1c74bc2b93f7e42be3ac1.npy +02958343-6ca41d6e48d8cda0e7c0978ffb411d3f.npy +04530566-abb16b391d1634a84de203ef6842ee61.npy +04379243-d40aa82ee8ef7f674e0fb7a6bbb665d.npy +03001627-6419d67905503bf7a09708b19d8be603.npy +03948459-d5be7a5fc72f11498ce08763cba10343.npy +03085013-7e984643df66189454e185afc91dc396.npy +04401088-ae86fa976ddb0f923bb35aa9d5fb636b.npy +03211117-4714a692a7e425285d534b823e951083.npy +03691459-50ab4ba93bb4141320dd2dd4d7d7656c.npy +04379243-1c76a8a55699eb9694605bb30ae47fb2.npy +03636649-fb279afc9faba7ec36d735c5e1c16d13.npy +04379243-244b56d46b9eec86f51f77a6d7299806.npy +04256520-d321d0c149d7762acc8bd7a04c9659f1.npy +02958343-558404e6c17c58997302a5e36ce363de.npy +02933112-b6b378a05bf6982b70c33714b19283df.npy +04401088-5101c0131cdf76d03f9d84f9a87a44e4.npy +04530566-f4f66aef4ae1ca243146aa85e47ab8e1.npy +02924116-9e66732bcbcdc461dd0aaa1eb6128474.npy +02958343-a07227a41b866d26473f10e6caaeca56.npy +02691156-4303c9458a723504d972c9dd75ed77d4.npy +03636649-ca5a19cc0a5f34273b8ea30c1700f67.npy +03001627-ff3ca63c75482c31f51f77a6d7299806.npy +03001627-564b9543fe715f9e1a4047c09ddc83bc.npy +03691459-64b14af80e246549a82acc849eb5e81f.npy +03691459-ef720d2b2de59184e775d184845c9f5f.npy +04401088-1f565ab552dc89727e51366b0cf7747.npy +03636649-85335cc8e6ac212a3834555ce6c51ffe.npy +04225987-99130967461623c37ca71234c2ec5470.npy +04256520-90b1058de189e4589215045784774049.npy +02880940-f2cb15fb793e7fa244057c222118625.npy +02958343-30ad4418703c8cd2f1da888faee23fa4.npy +03001627-4dd8862c73931cafeaf14273fa406ffc.npy +03691459-9c8dd83df9678d3bc33323f64a5f289e.npy +04330267-fc05549add432c08c5f3208c32f3ec87.npy +02691156-a48676cfe44fd9bee40acb87a6be88b3.npy +04379243-8f940fbfffb9b3cfebad4f49b26ec52.npy +03642806-85e029acb2edbd3a86a7e0484f5238e4.npy +02691156-85a62cdab580058925149ab881d5692e.npy +02958343-6af0ad6553d3f42f21f6e2b0f75cf9c4.npy +04530566-a64d2249cbe63b5f9cbca1f73829701e.npy +04379243-f48d32cd065088b6a6551b53c4ec69b3.npy +04379243-8147ebedafb763f21fd3f440755dada6.npy +03046257-408a3303ef2731a48358026595a97ae9.npy +02828884-afa7876470b8b7881d3a1f40308f8b8d.npy +02828884-1d0dae2db37fcb6ab078c101ed808ecf.npy +02828884-3a8490a38cd7f21929bffcef22233b9d.npy +04090263-51dba7756ad837615e561f212b7229f3.npy +03948459-f33f1645e9e35e6ef4de29b99f103946.npy +04530566-5a0ca7a6df97542e69c3c818538357ad.npy +02933112-148638f9a7c72ab55a0e5699b3040a35.npy +02958343-7197ec7776d4e23f10a4b3894aadc04.npy +04256520-536cae63d37ef32265ba78ad9601cf1b.npy +04256520-3a1cb5501dad77f360257b24d454e22f.npy +02691156-c93f76888cf5a14c93421b5e4ff654e0.npy +02871439-96c6507b07129f4ce0e03ec44119b17.npy +03001627-df9eede2969408d0bd2b1bd66a734698.npy +04379243-ada2aa7ccc81977d4ba437934dd25596.npy +03001627-bfe3afaa774eab6e29e17f7efc5a2421.npy +04379243-e77bdb7d3e12d6231eb51344489c49f3.npy +04256520-35da4cce6961e4f2ce9d15b850baf786.npy +03691459-aed97e60cd2802ce7ffb47acd56f396b.npy +02691156-384e72f69e6f24404cb288947cda4a2c.npy +03001627-d72f27e4240bd7d0283b00891f680579.npy +04379243-f8c37aece2b1c730928918e6ee92e0f2.npy +04379243-2475fc0196ea39aea81329004b7398d4.npy +02828884-ff5c5895622d2123aa979e53c1a67c26.npy +03790512-86b6dc954e1ca8e948272812609617e2.npy +03001627-79d7e50715b3b00cc2dd59754f61bab6.npy +02958343-f4498022df553505c35f22936e5aea5c.npy +02933112-3b6042e3f223da66200ec3fc5b3ae5f4.npy +03001627-74625aaed8902197f51f77a6d7299806.npy +04256520-ea49f8fc66df2b1819fb4103277a6b93.npy +02871439-a02dfaa200999ab05e61ef8e2af97499.npy +02958343-18927999d0c5a9687ba2618ede0d52ff.npy +03211117-77f4c991478ad1c26cd5a1d5c8bb85b9.npy +04379243-5e0e607f01cdf9ed93f709c6d6d99cb9.npy +02828884-394563d19e157c126f2e3fcce6bbeeb5.npy +03001627-3ea40a75f22515557dcf230d8b7d162e.npy +03001627-3d9dce1953180fe6f9c9f9697d1ec60.npy +02828884-122a480cfcdd742650c626aa72455dae.npy +02828884-aecc04ab28ca258181dea46b799d4f46.npy +04379243-6ca66a443e651c1423500a5b036df62e.npy +03001627-b1a30ad2706247b53c5f24f851caaab7.npy +03761084-9174b5b1b7306e1edf3a1b0d597ce76e.npy +04379243-a0b11917da240c98391e4d6c585a697a.npy +03593526-bb46957091f2a282cfdfe3f21f42a111.npy +03624134-d5f29a19d7523c8df1f105747d69ebcd.npy +02691156-177ea8d43905b1646ee4da51ee0005c9.npy +02828884-d0fa12d918d97314738e43095496b061.npy +03001627-d04d854533d618fbfebad4f49b26ec52.npy +03636649-e6cd04818644ee6f23acb241f0917910.npy +02828884-161bd345833d982325953d410324c2ee.npy +04379243-b112088ed4afade413b554f4133f4b49.npy +03691459-bbb7275f2a0224eb90146e2a0489a257.npy +02958343-9a806af16e5a102786d01a5629641c74.npy +02958343-3ac08e66bd7da4c35da01f298003d56.npy +03325088-cf9b1dabebb64e20b983088451bda93b.npy +02691156-b6af488133a67825881b4ad693eafd3.npy +02958343-a3d77c6b58ea6e75e4b68d3b17c43658.npy +03001627-453e8c067c8cb5d8f51f77a6d7299806.npy +02691156-9f75309b9744f1b54eefcdc602d4520.npy +02958343-f238821689b42db5d95840a0da458be0.npy +04379243-d1a80144a7efe02e585ed17f54616d23.npy +03001627-629117f474a4bd482d7c2f5a9f32d6bd.npy +02808440-edeee2a9acec49ab44221bef0fa3c36b.npy +02871439-bae48c009fe2a954a4e1718e2dd19866.npy +02958343-41bd68dd23107cc4b0aa56928723eca5.npy +04379243-a1593fbe3a78c7858795000a72749c36.npy +04530566-6b7284918634488da1d10a704f5ebc89.npy +03001627-a4b690e66e3937c88b42931b6e108d6c.npy +02691156-389dd6f9d6730b0e29143caa6b05e24f.npy +03325088-8aebc9a91265216e843f813f752a5e35.npy +03691459-6c71c0791b014bbe7ac477bac77def9.npy +03948459-e534d084d3bc37184d0af51460733e47.npy +04256520-35503a69108fd2a790a1391b3fdfda26.npy +02876657-adace8a468fd575037939c05190e283f.npy +04090263-fd95cf27de958d85827b7030399884a4.npy +04379243-161b5260bcc6f8fc9befe610bb4b9f25.npy +03636649-183e79a892e4294d65666d9a7426c2c8.npy +03636649-38f3a721c7ac21cb8a1a0260fe4e4cb9.npy +04256520-c3cb7d181b205d58a72e1f459869ef30.npy +04379243-38b5da2eb70009d6c045ebb62fca20c6.npy +04256520-548f0e39d6ce5adac036a40816608369.npy +02871439-12766f3b398d1cbd071cf06b697010e.npy +03001627-f239fa77c7b8aa2e81f667e2a25e0619.npy +03001627-d1b2d8868ca506f2a248097aeae36abc.npy +03001627-3853339519aca1bdfcd4910413c446d9.npy +02958343-634b6b50c7e8912f2ce3f1cb66884331.npy +02958343-fe0c5b57b5cf4226bda733a39f84326d.npy +02958343-841a80eb66a079e8e0f3abdce6812423.npy +04530566-2c0b850acd7d11dc428659c2b5124968.npy +04468005-3b4e18c6cfc37f5b4f1cb174d735547a.npy +02691156-fdb107ea7a600f5fe3f3aec01b086ba.npy +02828884-40280757b447eb3cf4fb4dee5181bee.npy +04379243-4517f2aee2482e904da62592caaeb495.npy +03211117-6c56f6063ceb2ba4de1b0b03ca051f02.npy +02691156-e1fbbf2ea1989b49fb2ad20449a93a60.npy +02691156-fe0b8ab916cd568d749f4ec7f5556c32.npy +03948459-1b63a4a6fad149acfa040b4405acb380.npy +04256520-fc786a8d62aad7e7e6942c5426df6055.npy +04379243-8cb6234ed889390df198b94f669bca91.npy +02958343-d67f5ba8950be214aa69dfdc5532bb13.npy +04090263-ae688f34caf5bf7bf1ef0cb5613661a0.npy +04379243-aeb34b796044d26f2705f56670a32884.npy +02691156-c107063f573cbfb3ca8607f540cc62ba.npy +02876657-8d861e4406a9d3258534bca5562e21be.npy +03001627-cbc76d55a04d5b2e1d9a8cea064f5297.npy +04330267-9191df20dc5559a38a68adc64e25938f.npy +02924116-9e117c48527ec9b741cefd10ce5d6cc0.npy +04256520-588556b08760e93b928c76b41dda6e10.npy +04401088-5deb3e8911dbef1adce6ba04fb42df.npy +04379243-c14e9980452c9411aaa05ac4e55dbacc.npy +02933112-41d9c4bc97447c4530ed3cf7f7e32c4a.npy +02876657-af4ff1c4a94383e9ca017e2245ec1dae.npy +03642806-f00ec45425ee33fe18363ee01bdc990.npy +04379243-32a7a2b6974a2e5ccd79ad97258166cb.npy +03001627-e3079223f4714116ad484915511ccff6.npy +03001627-483308834b307b75d5f1108744f02f1.npy +02808440-191c2a4444cb562554d7082b34825ef0.npy +03001627-2a3a847a3d4c39c1b17743c18fb63dc.npy +03467517-8d45c79841bf56331108db7cc39bd3b1.npy +02958343-2c08c221f7c6ccdcca92a4cdad802b45.npy +04379243-fb4cfc22ce88e69625d15f7f2ce4065f.npy +02828884-f8651ae6dc32338ff7010d9d85b1eb2b.npy +03691459-6d83986459f72abd4884161c20b458b0.npy +04090263-7c07a31eca316cb83f217b945a063dd2.npy +03001627-257deb231ce652169f2349486c570dd4.npy +04379243-ef3ae300317c571b490ad276cd2af3a4.npy +04379243-1311cade594e030fe497c7dfb96f4c60.npy +04090263-88cb0215d342a49abddd549216d19f7a.npy +02876657-dc687759ea93d1b72cd6cd3dc3fb5dc2.npy +03001627-bd50871647e3712f79121b38af0e3f47.npy +02828884-f70fe48c38bda53282c132e825d0d08f.npy +04379243-5365dead8b3f7d4166ccbd11a6ef0f68.npy +04554684-a9b39195ae8c707474e92060c1aed1a2.npy +04401088-5b826c910108d27a684b810d277e0e9b.npy +04256520-281330718b2988624b3c42e318f3affc.npy +03001627-249b40a630dd751f8023b347a089645c.npy +04379243-62b7145b5920a67aba18ade30e563d37.npy +03001627-9db1302f2fd980cf3cca2657c9d0b9e4.npy +03001627-d97c5945e9449a58737e4e0df09d751.npy +04379243-f878dcc6987a7a8a4719088c8e42c6ab.npy +03001627-e1e3796be1c4313f9a59e20336b93b69.npy +02691156-2fb78c8d2f27598826360e1e29a956c7.npy +04379243-14f18c8b697d79e099e8bf807e902261.npy +02924116-a08a579a7225b564fd952eb662903548.npy +04090263-d7da6065a37b9b42bc352a3301e817d3.npy +03467517-ed68b19f2f34368bc029bcb600cee01.npy +02691156-56c605d0b1bd86a9f417244ad1b14759.npy +03642806-e6b92cc71ad04a775872a8d7ae27b927.npy +04379243-b6758a9b899d540919fb4103277a6b93.npy +04530566-c3119babc97b4cb374f75d9e92dd466.npy +04468005-bfca8640e2b87091bd76ea3609a7cd12.npy +02958343-1cff510c0630c3cc673ddeabdcc8c6e.npy +04379243-5a09bc1430a2918d1f191e8de8001d7d.npy +03211117-e2fab6391d388d1971863f1e1f0d28a4.npy +04379243-8be1ff29a5088b482822b5101b06e070.npy +03991062-5ee97eb2f085db76993afecc2c675915.npy +04379243-177f4749d22ccddbf4ae8c93f4db5e6.npy +02871439-6cb507b4c8931bc51e006d63cfdcac0b.npy +02691156-ce9246d409f1c688bc0909d98a1ff2b4.npy +03636649-c9a0c193805df62accbc9e602dbf6a4a.npy +03001627-d2f844904a5cf31db93d537020ed867c.npy +03001627-850b424d90dbc66f4d68bade576979ab.npy +04379243-f50603a59b5c2ac7650419cd627ce18b.npy +02880940-b4c43b75d951401631f299e87625dbae.npy +04379243-667a88cc3ca1cef8f37af16b2893f1d4.npy +02691156-84d5ab52436c832d36813a9f7d8d3045.npy +04379243-d0b6fa6b908473b05213cec267286d18.npy +03001627-e05172ca06db0781a0a34f494d525bb7.npy +03001627-27fef9fcdec5a001f8f60938be4e769.npy +03207941-7fce8c7fc6ce0364fcd4910413c446d9.npy +03046257-327182214670d929f51f77a6d7299806.npy +02828884-1b78416210cbdcf1b184e775cf66758c.npy +02958343-2cbe6850de4fa5a34a6a7ab072f22d7d.npy +04379243-184f3a06dc5eaa52881e214542763909.npy +04401088-89f17a3563941ba9f2fdbae39bae1eff.npy +03636649-7075ee8d16f012e350a4c7031a41d126.npy +04379243-f875ff7c72fdada820768660cf080d12.npy +03207941-ba66302db9cfa0147286af1ad775d13a.npy +02691156-d63daa9d1fd2ff5d575bf8a4b14be4f4.npy +04554684-25b6e21ae9aa70824657977e55055ba0.npy +02691156-c271badfb6842c882fd5ed7e39258c7.npy +02942699-6ed69b00b4632b6e07718ee10b83e10.npy +02933112-fdf32559c6b7a6643fe047712e43e185.npy +04379243-d0891a7d205203a9beedb4c8fd29e2d1.npy +02958343-891aac401b4a3273afe1d4530f4c6e24.npy +02958343-8577f3f82d5ce3ecc2fe329dd557eb52.npy +04379243-3c12d6e9cef0adaede2627e1e10e2802.npy +04379243-fd7380eb29fafff3742728b30848ed03.npy +04379243-e750a8adb862c9f654f948e69de0f232.npy +02876657-8d27a39b1a33dcf9660045a6e369fc9f.npy +04530566-d35a759e08855e24dfe2d17b28f48786.npy +02691156-5d6334ae2a0dbf70bd46d022fd7d80aa.npy +02958343-d153b871182b8b3df6aa1413413c923.npy +02958343-97119a85ec049e1df59757e1209f2c7.npy +02691156-18d0da47a238945abc0909d98a1ff2b4.npy +03624134-308f294e2fd166f78000bd932f680a79.npy +03948459-706a2ebf066f3cfc8af105e8848bb6ab.npy +02933112-1a2c199d7c8cb7f83d724fd1eb6db6b9.npy +03211117-3c4382b40b0e9400279326882e8430cb.npy +02828884-9c32648f1412d8a6db6e463bda4c63ae.npy +02933112-6ed6e797fbb6f0c9b4979bfe197a8c89.npy +02992529-271bc457eb5f8f4d2bcf2225e929a245.npy +04468005-9ee07849ff9cfec39954eae9164faecb.npy +02924116-c68f0a21d0c6c4018ae96729cd441b.npy +04256520-7e2fb2fd4c604bb1ef6c510e24348d3b.npy +02691156-5f2aa0bc5a7fc2beacf77e718d93f3e1.npy +04256520-4e925afce2f8fcedec9587880f9bd7d8.npy +03691459-98db1220073f905159f43e87f0a59fc.npy +03636649-a9ed31fba7eacd42f51f77a6d7299806.npy +03001627-d8ea454fb35e38887b11ae648ea92233.npy +04401088-5c141e299b50f1139f24fa4acce33c04.npy +03211117-be2018563a5bf1a088fe6ee2419d9481.npy +02691156-687ebd7d2b1e1475459cbe66a12329e7.npy +04468005-cc206ebaaef18bf3d4fec646771c576a.npy +04530566-c21024d97247df5ae922b610a625137b.npy +03001627-7316e49785de77b9630abf945d2f3e0c.npy +04379243-6110d87def4fa88c154c6bbaeb7d331f.npy +03467517-d3eba720791d85401e67b43145c3c515.npy +04379243-ffe02f7b3b421ee96cff9b44fdf0517e.npy +03691459-7cb1aaaca10a8efa8d8155ff8532e190.npy +04379243-cfb7e0b0f44819c5e2f409c9efab99cd.npy +04379243-c8dd6d63b6d82f8399e8bf807e902261.npy +04401088-5f03b8d583798f7fac18d1d66482053f.npy +02958343-63b0fcfb7a1ac7efe8d8cc304201f02.npy +03691459-710c0a8ede7edb6eb31ee294b2971a9.npy +03001627-4855971647f786b642e1bb4fe264125f.npy +03467517-8a68dc60f7ceebfcd3728028781ec3f.npy +04379243-4bf61d3643b7e6ba19342061b16c380c.npy +03211117-15896858de30017d8e75bb5638d14ce9.npy +02691156-f0b22be59432dc8bca8607f540cc62ba.npy +04460130-a739f388def3e027a72b66695a920fe2.npy +03797390-68f4428c0b38ae0e2469963e6d044dfe.npy +04090263-105c9e30b6fc033d96e5f13299458076.npy +03325088-2559df6172ff5b1a840312071e438eeb.npy +04401088-df816deae044cf448e53975c71cdb91.npy +02691156-296c3ee559f87c9354eefcdc602d4520.npy +04379243-3ea2fc7c32abc9f758df8eeaf3dad1c.npy +04256520-5c66c3e86a131bb969c8f7b0ff61e3de.npy +02880940-a5f42bbfddcadf05eeb8d422649e5f2b.npy +04530566-aa0be5a337baedac950c27aa880e8898.npy +04530566-2f4d7a1873384f5a7301f2b895d332ac.npy +03046257-605c9deae76d0f19b9ed8f64c2cdb8b1.npy +02958343-f9cbd331bd475e07dc1fa1f50eb490cc.npy +02691156-98988dc4e5c62dfbc0909d98a1ff2b4.npy +03691459-35815951ccf18e3eb1f6750101befd14.npy +03691459-acf4daa2ed704ef36a27540a4ffd1b08.npy +02691156-ce00bc7519d595c525a407b55f350179.npy +03001627-3baff0f05a4ac225b872c385efc13c74.npy +02958343-65b9b2df0985821463e6a626b8b4d07a.npy +02958343-79f4f7378074d3478e42313717d27982.npy +04379243-1893e7831f8852a2f51fa0238791f5dc.npy +03001627-9795162b409011c2a6fee8e2140acec9.npy +03211117-3531ea4e850159dc43a6722dac94523b.npy +04379243-11ac24d90fbc20bc5d714c9d7df1c4ed.npy +03207941-14877e33095c0595a86b76551c6a3b2b.npy +04090263-40267f5d09bb0c422c4683dd00deec1.npy +02828884-919f90e92283eff8febad4f49b26ec52.npy +02691156-a1784ead19fb7645b6dd6448cb8a70ee.npy +03761084-4bf44e878bc9bc41ccd4500d193ab05f.npy +04401088-93cc80bca9e1812a64a09de5345a6fef.npy +04530566-410b12d445e5deb49588e71e21de9f30.npy +03001627-2a8bb463e116e51de58b00a9dd2403d.npy +04379243-5554b586330150ab6d5ac6b606b81bbd.npy +02958343-78c3bf6ae1bdf75419b43924bf120208.npy +02691156-69a7b9b7265a70f1a9b2becd26dc2fc1.npy +04379243-da9676ff70b2e78a0a7b8ecc42036d5.npy +02958343-93f82393df6d4b7c315a637e839f5286.npy +03211117-2c1e2873955b563920685b5a7e34b501.npy +04379243-c0c836c630cdb4bb664b3b9b23ddfcbc.npy +02933112-11beea78b1d558d4b246c4171f2c393b.npy +03211117-44bf642d0b33752628fdea86734e40fc.npy +04256520-8bd993fc6a605a63ac4c87b0cf5278e7.npy +04379243-fa29ae17ed1482ed8aaae3d020f5ddf8.npy +04225987-b6074c8d74b58d31ef566954f332b813.npy +04256520-c951d9b4f3da0b5519fb4103277a6b93.npy +03001627-51e14c516e45ec3b18ed59365c9648a7.npy +03691459-1e6a6ff6f4168459e5c00598c3e9532c.npy +02992529-2964d10d72ea38cf4857f88b08630a42.npy +04256520-7f0a1abbf748d3b09a91829e64097423.npy +04090263-948d90262559d560886a4efa4119c824.npy +02958343-57f592c3ec49318661c6c61410fc904b.npy +04379243-8dcd27d37c9b8bbad0733ded25052299.npy +04090263-f8aedbd628e010a64033826da8c9e89d.npy +02691156-146533404a778665c93b40751084c22.npy +02691156-987e67ef16969b93663e90eaf6b4ca52.npy +02828884-40cee2893781b47f50f9fc0e2c94dd76.npy +04401088-709a0c498dfa2b32db9f110046803f4f.npy +02691156-7ea57db538494a2fc1ccec171a275967.npy +02691156-480ee59947a01283873ec74c119307b9.npy +04401088-ccf2058300cac188639e45fae4b57d2f.npy +03991062-75afef7dee74151936b0f2a1430e993a.npy +03325088-a0b96fb7f9ac68cab362845c6edb57fc.npy +03001627-917f2800d9fa9fe8c862eec8232fff1e.npy +04379243-f80cce35d167ff9b855931d119219022.npy +02691156-d4d61a35e8b568fb7f1f82f6fc8747b8.npy +04401088-743b747a119307e8e3785a46a5c831bd.npy +03325088-497e448f82ef1ad3321831d2245cf06.npy +02933112-238e8b7747e7a2503c4f66791e25960f.npy +02933112-4c99fa08135a52d04c62bee40dcdc539.npy +02924116-ce961fddcde47dc972a38ac2b8f5cd48.npy +02876657-d1792ebb96fe73ff30612f5c0ef21eb8.npy +04379243-7918d848b37db85ee1495fb833264cc9.npy +02958343-8d78c8489dc927dcb07f27f3519a9cd4.npy +03337140-99b060ca274d8613540291e94bc8ddc3.npy +02876657-b2498accc1c3fe732db3066d0100ee4.npy +03001627-94c8b873c9214a726e18d8b0769ce75d.npy +03691459-7ab21928504c8f5983247f812f2eaa97.npy +03593526-46eb2397e694c01e2b0ee99af125a449.npy +03001627-603351f3a2ae3259f2b931201029bc76.npy +02933112-886031ff2a514f86c59350d819542ec7.npy +03691459-4294d3cc2e413bafe45b40770dd7ed5c.npy +02691156-40d6a54bb4f276afefe0d4e1eba2e3af.npy +04401088-b1feb3020d9380ba4fb324159a14f34e.npy +03001627-99ee0185fa2492859be1712545749b62.npy +04090263-1a2038ee147fc6d434837e2aadd6d77.npy +03691459-3fbf353af74136feb9001bf6cb0603cd.npy +02747177-62d897a92c86cb392ab20b9ffcec9f65.npy +03593526-dfebdbe996e582f453b5e86c4b574a4b.npy +03991062-ea873ee1dabebca4eab56eee78a237c3.npy +02958343-2b075c9c5d85bc779c75e543b21e90a7.npy +04379243-7f52ac1cf8e52a58be46d062a5971723.npy +04379243-cbef425aa02873c0f51f77a6d7299806.npy +03001627-58479a7b7c157865e68f66efebc71317.npy +03991062-d7ec18a98781e5a444175b4dddf5be08.npy +03636649-297d929269bb62da43fdcbcacbbed64c.npy +02691156-f134306ace70df3ac1006ed55bc1a3fc.npy +02958343-75bb1fc144e6d17a6d00e450aa03077c.npy +03211117-d8f4c5160059ef245d79a44cb814180d.npy +02924116-f7f015833b432f60fd856e0e4b7e59c2.npy +02691156-fff513f407e00e85a9ced22d91ad7027.npy +03001627-fbe64bd927721467dff2bb0129eed40f.npy +04256520-7cf34cdf58717ef0826fc8d57346a2e4.npy +03337140-a9e1a1d22b3f9231dc2bad4d8565b716.npy +04379243-8b094873d775f6e21130871dbfe24c18.npy +02992529-e8e9617b4f7247fa3578fcb734a22822.npy +03797390-2037531c43448c3016329cbc378d2a2.npy +03593526-a84361eb6d9f55d99d3d767e1bc88d65.npy +04379243-e1f9b43eda445dc8c862eec8232fff1e.npy +03691459-859ab0a5ce89e271b4607134dafdbd9a.npy +02828884-d3b2e0d1482ead96f4fb4dee5181bee.npy +02843684-42e9aff6647766ed265d1076b4b6c5c.npy +03001627-77c02e92d5628be59db8ad97fd392b59.npy +03001627-bc21c95f766502a78b03575bb54dfd4.npy +03624134-9ca44477e52bf36b5f43099cebc43623.npy +03046257-a91fdf8f83aab0e56e71174964d90e49.npy +04379243-140f12d10c2b7fd5c77467482d6e756.npy +03636649-7b2b1c24a60bcfab2cd2160e449d45ae.npy +02924116-2ef8ecfcff403cc0403492478acd0aac.npy +02691156-bf448fcf33a5349619ba010ddb4974fe.npy +03467517-6c9a9c0e2af9d5b35f713e773d664ec2.npy +03261776-c6dccc2985bfeb7c2b8ed48c6a7daa1d.npy +02958343-df00eb409d4e8fcec07224da8e53476.npy +02828884-8ad9910699d6a21781faebbdea6bd9be.npy +02871439-403a35d06a12b07070048d788a6ab3c0.npy +02691156-65166f18d4ee36a61cac9affde84fd21.npy +02808440-e3cee2a50dcd43bdccd0340812259a39.npy +03948459-820f8b82a945eada1123c3d969d6331f.npy +03211117-385b89320cb3db4b958a493036fc8628.npy +03001627-c394dfc3c8573d1b19fb4103277a6b93.npy +04256520-7a77351c67566e4159a4e5a60d4753a.npy +04379243-1ce87c214e0be0e87dd6aeb162858c12.npy +02958343-dec396fa569fbd20618e9d35559b7aa.npy +02992529-a3c1c9fc390b1bbbb099170e6f5a4af9.npy +04379243-b4c66c291f2c46581c1b3b2ed8d13bf8.npy +03636649-2df829fa60a85466a2f2a5c7a758a47.npy +04090263-e35192fa08101d5db257aa9856dac07f.npy +02958343-db79ceb1bf94fd81851f021b9ed69c58.npy +03636649-78ccf7d2ee6d5e34fcb8d8c6d4df8143.npy +04530566-2615224e88e47ed29e5ca238b1551011.npy +04256520-27d388a77f5b27db48186eab550b0d6e.npy +04530566-490ba339e10c0b7f4de203ef6842ee61.npy +02946921-51f0b5ce9711f63bb15a1cf05bc3d210.npy +04460130-61dfd94f040757892606d242dcfd275a.npy +04379243-62ca9722d848d0d17f74248f969ff9e9.npy +02958343-f934155d32f9ed5b4101e38beb790a92.npy +02747177-d3cab0515bdbf311ad5067eac75a07f7.npy +03001627-3f5fdc05fc572730490ad276cd2af3a4.npy +03691459-d14e6214d7dd4ed62d563c85edb49108.npy +02924116-9e8edbd1e7b79f058b89799e9a2e578c.npy +03001627-4a2b8f9d13afb39f8f1abd08ebea3018.npy +02933112-a256bf234c60a150c226a4421a1fedeb.npy +03636649-3815469d7a7d336ab0a29c51aa6f10ce.npy +03636649-122fb7bfa09c184ca249f8489bc060dd.npy +04468005-82bc9cc9a34fe639e855454b1172ca3.npy +04468005-52b9747ae68db7f3ae4054efdf73ba81.npy +03085013-9d86f895dc2d54c9b09914703fdadd6.npy +03325088-e09fdcf6ca6cc44969f45219d1cec82.npy +02958343-6283a8fcea4976fe47bff85f09fd66b.npy +03046257-36ba88f12840e84bbc3768389c53bfb2.npy +04330267-41292ef7b99473212846c469aaca3af9.npy +04099429-4c553d6096440b7b64b95779c8554990.npy +03691459-7578b2e27851b989a374ee921da07aaa.npy +04401088-7f41f4b186fdf84c7ecaf377af2046d6.npy +04256520-f1241a9c69cf35feb3104e94482ea9ce.npy +02691156-d18592d9615b01bbbc0909d98a1ff2b4.npy +02958343-8a5b15ec0ed8e9aaba44b506f43666fc.npy +04379243-937fba1b3389783684b7bc3f8a9aa55.npy +04256520-8827bca86b63f748b2c9b996c5b9e81e.npy +04530566-cd1d407bf8637a019a6249baee317a57.npy +04379243-dca821b9d2fed090f51f77a6d7299806.npy +04530566-86fafe5bf7013d18248c5646daf6718.npy +04379243-f9ed6c993f7d65e2e5f83d0df19ff934.npy +02843684-fb7402f91e300ead8ac033353d37592a.npy +04379243-10db06b0d15bd4ee72f847ab4bec38ed.npy +04530566-10e10b663a81801148c1c53e2c827229.npy +04256520-1fb52b6bac60286afebad4f49b26ec52.npy +04379243-84a0b93cb41ee6e129cb4c9f87f87751.npy +03636649-587b4419a39cc088ccbc9e602dbf6a4a.npy +04379243-91d5f09b7126c4b9d158bbba9bf9a9e1.npy +02958343-158a95b4da25aa1fa37f3fc191551700.npy +04379243-5aefdd5252fb662df51fa0238791f5dc.npy +03001627-30afd2ef2ed30238aa3d0a2f00b54836.npy +04530566-7bdcc3c9462eed64482170356260f668.npy +02828884-7cf981899878464e2056b4bd5d870b47.npy +03593526-e0af9e8ee2cf2a82813fb41783e5db30.npy +04379243-761a4fba430377171f335cc23d448de8.npy +04401088-bcf3ca7e860d04eaf0fbb92458462640.npy +04460130-166bd86229867093031b562a9def0c1.npy +03636649-5b12386df80fe8b0664b3b9b23ddfcbc.npy +03691459-5daa294dfd41b3c2e01d588c78e60948.npy +02828884-28530ebad05e63d9d9c2d24a3a0c74af.npy +04379243-ec68e1edbb7e9bc7e93cebb6ba9ca43e.npy +03642806-846c5850093a080f54b2a16efa6e7b19.npy +03001627-562fe0ba05c24bdaa52abcb0c06a3598.npy +03001627-7a1515106a9dbd2bae4c6ed7474cdaa3.npy +02871439-c4966c7d5f8aa1216ca79a8390566bbe.npy +02747177-cfb3a57ec847ebefc99e09be54ad23a9.npy +04401088-99fa43c391f71ffd592461222e5fed0.npy +04090263-bc74663ae3ef56508f65605792e3e409.npy +02818832-3378d2b70f083c173f71f25fc2bf23a6.npy +02958343-f2a990659efa05c5452d05118c2bf489.npy +04256520-691785b64177ec582461aedb84ab8436.npy +04379243-de10ce891b1cd33635836c728d324152.npy +03211117-f155df0854fb33a11030e4efcf938b6b.npy +04554684-265d042dcfed6f15c357c21161963e89.npy +02828884-95db80660b4d979f601104cd2d998272.npy +02958343-25378c7370a06c497ef186a2ac298b0c.npy +04401088-4a0cd042d7479d6810bc2436075f6a52.npy +04379243-b2d9065a028e52c7bd1dc9077c6610f5.npy +02691156-b1762428d609674598aeb62a3dfc01d8.npy +04379243-836ddcae13c81d88a58a5ecb2008fd42.npy +02691156-575b8ec48c550f456252573e97057236.npy +03325088-2ae78fcdf7e0bbe0c36fb70296e45483.npy +04401088-854ab60bd57d3d6d2f412e1bfcc51526.npy +03948459-a8aee0ed266811e5cad3066323224194.npy +03337140-cc9f54a7900dadb2f813f0670c9eb744.npy +02828884-d6075b23895c7d0880e85c92fa2351f7.npy +03636649-15332cc15b3de2e7a4ee05a5737b7178.npy +04256520-c6edb435655e832debe45ef6009149dd.npy +04330267-3486e9ea474af3ebe793cc5433bece89.npy +03691459-15fb39da1ab90994a9504db65c138da5.npy +04379243-bd3dddce162f59ead92dd8f41946f1b2.npy +04379243-501f61f01aaa195adcfcef693e7ec696.npy +03001627-47362cb47416904b76e38b52d9aafc11.npy +04379243-f0c5410293e85a695a96bae7b017a6d9.npy +03636649-7b39100755e9578799284d844aba7576.npy +04379243-52c0950979a8572ad42ec7e303174a87.npy +03001627-b8552f663f2a4f4d54e4f80955961143.npy +02691156-5eb91263da1f0bf3e816c75152573ee0.npy +04379243-2b6ce4f0d57ada2ce6a02cdde4c23286.npy +03001627-84f7061e038484492f8cdfb829e0f65d.npy +04379243-8a2598fefd4a81e9c7b11e86284a2e.npy +04379243-797c7f154643169bb07cbf788ba0557c.npy +02958343-a6d494af391a97686436916a86a90ed7.npy +02933112-91ac5c074c7d137762646c8cd54d58b4.npy +03001627-60622d74c0712934a5817f81a1efa3cc.npy +03593526-d4b38a6a694cc2bf55f46d55537192b6.npy +03211117-2979d8814a450f884b8894e5e467986b.npy +04468005-a6379623690fa49f5483aac47b870866.npy +03001627-4206cdb567679c0dd197f67767b32741.npy +04379243-462e8745e766ed9fd4d8765e3910f617.npy +04379243-3c4786ea0997d6bbc0f947750540fb22.npy +04379243-bdd12e21daf8664689940e75c3dc3e7.npy +03636649-a833d2cae8fada7430f6e0ede20c4525.npy +03636649-80eef85b735218b0ab8d22b09768208b.npy +02691156-3826bf5c55ee469cec4dff11e684b695.npy +02958343-83c31a4085063873dc2afbe43bc71afa.npy +03624134-c68e65d16ebb046b2ee0f9a97b71d505.npy +03001627-2403b6769a03c8a466ab323d8f805a57.npy +04530566-91eda08cecf2e0f1c6cb0dfa2f14f9d4.npy +03636649-930d6656e3df0635fcb8d8c6d4df8143.npy +02942699-fb3b5fae94f7b02a3b269928487f8a4c.npy +02992529-d79b59ea51a9d80c483afc91de6851e4.npy +02691156-a2f0c1bdfe1475bdc1a897657d9a1924.npy +04379243-1cc5bcbad2fdc660d942e529754fbd45.npy +03467517-9f938cb5771d594580cbbabb0edf7284.npy +04090263-54001db75b6071eca7dd22c0aa3913f0.npy +04530566-47adcb0683a3de6cd202a4790115f0c.npy +03001627-e3ada26cde5b4de01186ba196e9dda0b.npy +03797390-4b8b10d03552e0891898dfa8eb8eefff.npy +03001627-d2c465e85d2e8f1fcea003eff0268278.npy +02691156-fef1c15a5db21b00a67cc8f661e7890a.npy +02958343-88161acf1ef955c5d76439fb95cdd2ed.npy +03636649-8d1178acdd04d633c35131da26f8061a.npy +04379243-a0379565daf4b6e6579cea75b38cb7ce.npy +04401088-24f3752312dccca3e23b34f33128879b.npy +03691459-2f7b5ea50c09d928b23f3e90fedcfa3.npy +04379243-f2087cbd26a910355c16106acf3e4b14.npy +04379243-c04b363fd824528bd42b9650f19dd425.npy +04256520-897e43119c6e4b8710a82b807fbeb8c.npy +03691459-438dba79401818884987b3f5f9a53cef.npy +02933112-9c15e8897adce40c963aff3ec12fdcb.npy +04379243-5ad2333321746a8b3f222a37719e9945.npy +04530566-1849ee33d087288ebf473eeb55ae85d0.npy +03691459-5976630a3b8452617ae81ddf970c0d9c.npy +04090263-35818f16eb3540c0bc6e84bc30e573cd.npy +02958343-dfa6c32dec07727ee9d8921ebe6d5b8e.npy +03636649-c0644ddc5cac342b565ae30b0a8151d8.npy +03001627-96d9944f46bd330979414e04132a8bef.npy +04090263-ee36a8770c74281b52188a7e683f7f4c.npy +03991062-ff08db7c7c1f3e522250bf58700b4d8f.npy +03467517-601e01d49a1daf2c79f4a19b034b33f.npy +03691459-18e1be943fecbad143662aee1fc05d23.npy +03691459-33d61def031dc1ef256097a658bc66b2.npy +04379243-23fc3f07efc7ae4d19fb4103277a6b93.npy +02691156-fbd800d43c5f0d74250cb4f7fcd9ec03.npy +04379243-5fdde770581fa1fcbae326b60581fb7d.npy +02958343-d6390f62d9e036efb1bb46d2556ba67d.npy +02691156-a2661597dd2e8a2eb87697d3904b168b.npy +03325088-bf8ceca3b60295f5b362845c6edb57fc.npy +03001627-2ba108b72aa4995814513156cf2b8d0d.npy +03642806-7a6b074fec1b8b9c810b27ad0ef73ed.npy +03211117-c906b5644fe468a2b61fb7ca6803b7a5.npy +03001627-fcd8163b26250f499fe49e672436bc45.npy +02808440-63c4c61e156c25d23321831d2245cf06.npy +03001627-e92bcd55d36a2b70ea934df7efd260bd.npy +03001627-5e13ddf9fa4ecf53c62f0847fa177f8c.npy +02958343-c46a940147e6da66ca92a4cdad802b45.npy +03001627-39c5291a2dd17d6430e06a011e63236a.npy +04379243-fbdf9bffeb353474c3a767747b75e56.npy +02691156-d7e8b636d4a7dab67e697b0700f10b81.npy +03001627-d609864ada7d0170278d386bfa54545.npy +04090263-d7ac2d2fafd9b9076314c3b6a3a65519.npy +02933112-902a342783278a9d824662341ce2b233.npy +03593526-57b186ba25a680584289430f919c490c.npy +02747177-76bd9785d3f6e77f81faebbdea6bd9be.npy +03790512-e59b0be8520e4a899cbc1c09129e1507.npy +03691459-44b9054ed15fac2c3a67bba344536c8c.npy +04379243-47a9339b6a731a1019fb4103277a6b93.npy +03636649-aa001d69c5b051591736c5c04ed41019.npy +04379243-db545f0422e72d3379368d1198f406e7.npy +02808440-86624ab3ee7f840d3321831d2245cf06.npy +02691156-19e6717acfa7d2bdca8607f540cc62ba.npy +02958343-51062ec9b0dadf971c65421fe734e7bc.npy +04379243-ca13cadaeff93c58ad0e9e0d146abe05.npy +02871439-1e46876da968e5de233e9dd8288dd718.npy +03636649-8b4cb57c4d21a84d6af65e5aa19d2e8c.npy +03513137-e143d40f9df57d92288d8f1144f7979f.npy +03948459-b42b1c0c621d2217a8ef632591b544dc.npy +02828884-34bbcc05fdaed2e437638a2ced7d0ba.npy +03642806-3f45cde6f7a13138e256fb3794905772.npy +03467517-3054dcbd4fe67597f57c034b5317e704.npy +02958343-dbd0651a6d5bdad69bc489396a21b465.npy +03001627-ce2ff5c3a103b2c17ad11050da24bb12.npy +04379243-56188419e8052c0b36b0f2a1430e993a.npy +02691156-5274742871cef1aca8cba409c4409ba9.npy +02924116-411d5ea3c73b9214a1f49c8e152c519f.npy +04256520-81d3c178c611199831e05c4a367a9ebd.npy +04530566-fd850819ad05f139bd4f838682e34d2a.npy +04256520-2e2f34305ef8cbc1533ccec14d70360b.npy +04330267-bbaaaf017a32d63a15cef3430fd3876.npy +03001627-ecfc0cf5081976323002761e7a3ba3bd.npy +02933112-a909c649ca19e9c9a45565492492fdbe.npy +04379243-a6ffc5d46a146796ac4c0903ae810430.npy +04379243-4185ad2b10b278f83889b52430b1ab3c.npy +02924116-38aa6c6632f64ad5fdedf0d8aa5213c.npy +04090263-8c6c169c326e61df67b9bb226efd81df.npy +04379243-891c1cd45e849766b07cbf788ba0557c.npy +04379243-78c4b505894342269299936b751bd77b.npy +04090263-10bcfa94dafb185411617c2f1885cb59.npy +02691156-f7160900b6ce7bc4e63e266a803d9270.npy +02992529-7a4619d2240ac470620d74c38ad3f68f.npy +03636649-d4331a5810e36726b8c3db3876404c90.npy +03991062-ad6b3774f97b35ee9eff3cfd975ea4b3.npy +04379243-54401b6df397d9464719088c8e42c6ab.npy +04379243-89e9fa41863867de72ee08e78374a212.npy +02958343-7fee48354a144b5604a60621dcde9e6.npy +03636649-20c399f42ea5e6ee748af47e1b2121e7.npy +03325088-87a6968aa7057c61b362845c6edb57fc.npy +03001627-984900a401b412368412406fac9aee.npy +04090263-2c867f76c95134e6d17373579e6fd9be.npy +03691459-707f0e44e935dd55edfd593a4f114036.npy +03797390-28f1e7bc572a633cb9946438ed40eeb9.npy +04379243-2c6d9b85e2be02d9d76ce82841b0eded.npy +03001627-e64562ae2925d5f3f58087d377226538.npy +04401088-bdb87a4218cc7ecd23bb4223d09fa6a0.npy +02828884-9d01b7c51223f973f155d75bbf62b80.npy +03001627-d5cadd520263753b65ae658fdfdd758d.npy +02958343-5ad0fd6e9fd786937aa522cf442e862e.npy +04090263-cbc84bcebe71e468d398c75d8b3af045.npy +03001627-63cce233e9e5c33cd8f27b2e727c3511.npy +04256520-c75ade3248fb4f2f8962005ce0e986db.npy +04379243-a52ca2940a24a916ebadcdfba7971b71.npy +02818832-5e651f1c15fc66f74eae82c629c10c2.npy +03691459-3adf396785cf9dee7bbfac568080cdbc.npy +04401088-73b87e2025cfdb6daf19fa8e8218bf64.npy +04256520-cb93c492c1c3c00a94c9842dcb05f464.npy +04530566-3e7923c788b0b9a67297c18bca670e89.npy +02691156-3788ee24009c65cb4d210d9468aedaf2.npy +02828884-9f17577e34237f74c2f16c13e1941c0.npy +04090263-4a8f8e108cfa6503202be79d8b285c1e.npy +03001627-e3fba8a576d4d875e1d0950dd1aa903d.npy +02958343-2f03e5379f3e9b6857652684714945f.npy +04379243-cdb0bd21fd5d075bbd1f60c111786ed.npy +03636649-95099d85ebd865f46d11dd9fe20b7791.npy +04379243-c683f7280179260a898f72fb23e1ea6f.npy +03691459-46f25e8462258a85a398a0556683e6e3.npy +02958343-85914342038de6f160190e29962cb3e7.npy +02801938-ff796cbcee132bad747e9c0bb7bd88eb.npy +02691156-29ff751f989bdcfc9bff604afc480b65.npy +04530566-a10a3ed95539d9e81f0c83f3777b8bde.npy +03001627-8ddae5e2493ab76af91663a74ccd2338.npy +03001627-48de3e38b0c5fb40b07fa14c34cd0728.npy +02691156-21e9ae6cdd3ddc27e1c97634acf0214.npy +03797390-8f550770386a6cf82f23d8349a133d2b.npy +03593526-386a6dffaef80143fa0d49b618d792ba.npy +04379243-ac9a28dab6b10451beedb4c8fd29e2d1.npy +03211117-75432c09d6b34efd336e9e51cf4eee59.npy +02942699-483c387d6886e603314b44839465ec00.npy +04401088-3a3fb2919b1bd92658c2dcb60645f75c.npy +04256520-2291855068cbe57442b5d6d90d0cc78.npy +02773838-d331a7bbfb0e7301e858db1dc3499392.npy +02992529-64b6ddb847da082d761eb63018291094.npy +04379243-678f5f5a8c95b0508cbb8bac2032149c.npy +02818832-b16913335a26e380d1a4117555fc7e56.npy +04090263-befe2c697ac907f5410d23b0a192e911.npy +03325088-1eb80664e450516e2c6c98851414a9d8.npy +03593526-6f43bf97b213b888ca2ed12df13a916a.npy +03001627-5b43111740009e719159f4cd32e8e02d.npy +03790512-bcabe20e46e5126ed5dde04c96fd8146.npy +03001627-47c04fe5c1f850b784cb23b18bd34686.npy +04379243-ed0b1bd723063c8ee1be359afa82825.npy +04401088-229077bcc4f52356f582eaab37b1c177.npy +02828884-405d1666d90df2c139842e32fb9b4e4a.npy +02691156-7ef375680d89c711c8db97d9bc169245.npy +02691156-77fea5bd4008e5f09a6e43b878d5b335.npy +03001627-99120ec1daa4ae1bad484915511ccff6.npy +02691156-7401bcbb1a184bf548627a76b6268107.npy +04379243-22c5cbe6271736bffebad4f49b26ec52.npy +02691156-eae958f99bad7dcb18b14db3b83de9ff.npy +02828884-ce23a5781e86368af4fb4dee5181bee.npy +03001627-52310bca00e6a3671201d487ecde379e.npy +04530566-b497c390de93b4dcba21fe79619ae253.npy +04379243-d268aa3ecf296572c0806ee26b689c99.npy +03691459-451f3d4fd10530b9d5a56ecdb5a1cd39.npy +03642806-b95ca4fa91a57394e4b68d3b17c43658.npy +03642806-b806daf849a5dba289c212008d2a390e.npy +04379243-3dab0646af0e6945beedb4c8fd29e2d1.npy +04530566-27d32838007b5a07c63bc8fdb41b8eea.npy +04090263-bbdcf803144145e09905a3939c890ad2.npy +04401088-9c1286570bbc6fc78f257ecba9a6ef8.npy +03001627-bb90094030f369e4305a3b2fd9173d6f.npy +03001627-f3499b524c5dbbefa23949c21eddef76.npy +04379243-b1b499e90f17a6332ebeb1e6a8111f53.npy +02808440-429ca6c2fc2c018944221bef0fa3c36b.npy +04379243-631ab9f813568a602b70eac6546e93fd.npy +02828884-981fb231709d4d2cfebad4f49b26ec52.npy +04256520-1b5bd45428de094f593ebeeedbff73b.npy +04004475-7d930b35795c8263ef895f9600eaaa98.npy +04379243-72ffaa15fd437b33dfecba9aa42b51d3.npy +03636649-34ce1de178694f87e76bc197b3a3ffc0.npy +02958343-5caad0d7bc6524531e51722eeef6dfef.npy +04379243-2602a7b129a08e42c3bd24f986301745.npy +02828884-bd51deddfdcae18b3b8dea4a358cbf0d.npy +03046257-a14c0041225ee741d1d1ea91a730b0e7.npy +04379243-f5a673474566ed53a9360d44e90d853d.npy +02958343-d9dd3e204f4aa43f473f10e6caaeca56.npy +02933112-cb84d931a90fbb8e91ea3afb2749822f.npy +03001627-f43eef7e3991f80346ebf4f1147c3f0f.npy +03325088-df36cb46f484094ac2185cc0ca1b306b.npy +02808440-fe063b20427b13bc1c17aef130ed6213.npy +04530566-9902e521bbd9ff3348d84ab7c5cd4c19.npy +02691156-51d6c3bf592a1fc16dfe8328adcc508e.npy +02933112-1a4ff09890565843c59350d819542ec7.npy +02933112-70424e9cde5be52e25194f3c5a4f307.npy +02691156-d3b39374c97d39da7dc01d89d8a05b74.npy +02808440-5db3375f0e4cf84e133dce51d963916a.npy +03325088-a2d329795c7e4c52b362845c6edb57fc.npy +02691156-a611fb88b28c3f2ec231d70e1e0cc567.npy +03001627-e28c5e90a01027bb4e83b37723b7fdca.npy +02958343-31ae8e03d831a85cafe1d4530f4c6e24.npy +04379243-f95f6251339b759b30bbd4cddd04c77b.npy +04256520-e5a4cb87310ec996e649b526d4e1735a.npy +04256520-e323d123c60c2f2e3c777ea9821e1518.npy +03636649-2e3679df6678e8776908456c5f4ff3f3.npy +03001627-862f70e73fa70c9b1a719e2a845bdada.npy +04379243-fb7124d1ea2937f252219cd24638ae38.npy +04379243-fad9dfcbb4c1755811cdd52f3d07553.npy +03325088-752773b189f2557986a0e7208530ce22.npy +02958343-bc533f9881b0775c3a0daf3e5400b95c.npy +03325088-a2154893d949e1053321831d2245cf06.npy +03593526-6e44adec0854dfaa93fb5c975e8de2b7.npy +04090263-5190f781a1fa9b9a733a41fc18f7f056.npy +02992529-c3b9cb70c6a80ed686a04ec9e4169973.npy +04379243-f1afa2f6205f5c552ecfa9be42d43d0.npy +03046257-5431835bca07a47dd274dcf5b21c1a5d.npy +03001627-79d5977609f99087473f10e6caaeca56.npy +03759954-f3bb6ffcfc132f34418c7dc49421509.npy +03636649-6f5b104f7c1cb4bc636c7e486232cac1.npy +04379243-6797d37aae0e1d4339b483f6ce8789c.npy +02828884-da39c2c025a9bd469200298427982555.npy +02933112-1566915c8a69d58812de5317fe5b354f.npy +04256520-f55beebe7409e84c873aec32fa476d61.npy +02828884-7e73d9c7082453987b019ecf3e106a55.npy +02933112-67616bd629dbf7b3824662341ce2b233.npy +04379243-bc4a64f68f9cfb0733286e10d1a7be57.npy +04379243-79fba03fadd8c00ef10b04ee8b1c6914.npy +02691156-57eaa54ff3e4d6f211f78b196c636566.npy +04090263-3d6ea8a01c3330ea8b22dc3851acefdd.npy +02808440-e6c56b5f2265d6423321831d2245cf06.npy +02992529-8f1ec459492c61ff562c8e1ac545ef78.npy +02933112-8d9fd58227bc92e41f3980612faf041b.npy +04090263-dbcad8c956d195a149a3c1009fa79820.npy +02808440-e8a5492555f645cee4c2a47658c3c899.npy +03467517-10c6c59350abb4c3a8a9e1c6e66d8abf.npy +02958343-bef5b9686c2f93f46a2345809e2bb169.npy +02818832-92e4d52351791ce9d9ba459409ec63ed.npy +02828884-6752d9230ae82d1ce67de87b371d4c06.npy +04379243-466e5bcb7038889d9d48ed08450a6532.npy +03636649-d3e339b83170d89629a60d6ab40898d.npy +03636649-a126861b5d720843aaf2b5b6ef88c2bb.npy +04468005-8a8ddf2debe2167c2be8d09ad36d35f9.npy +02933112-cb12bf5a4429ed4c4639ab25a6c4afd9.npy +04090263-eb11f8abbb974b1d12f1ef17d681ef3c.npy +03001627-2588ff9ade9f3c1dff2c92c2a4f65876.npy +04256520-e46d448389af3fe4500158c23c4c5a8e.npy +04530566-aeb094e328468631d3cf225db57b7a46.npy +04074963-ef639e9f766f2c097f2b5660c54d2f8d.npy +03593526-bd3408700fb963b436b0f2a1430e993a.npy +04379243-c83697d186fc799d7bf6fb68df7f786.npy +03691459-f0c6079a6dfd5e0a7a9e31f14ebb8cc.npy +04330267-2c4eb370f10b4667e6a1cd9763fc2f3f.npy +03636649-b31bcdeaae689dd862af18ecbdb58c38.npy +03001627-50d277986a78f9fc3eec26c23f5bc80b.npy +03991062-add11329471685d6beceb95982284736.npy +03211117-8bf7dbdae495ea9c9db805a3358d2d5.npy +03691459-f2918caa3fe8eceb47eac12ec180489d.npy +04256520-d3cc9f995b1f2b2dffcd08faf4fccd0f.npy +02876657-9b9a4bb5550f00ea586350d6e78ecc7.npy +04379243-efd67be7d7fff02d7b9a616d4541ada8.npy +03325088-2b4f980f62ac992a3b717863742b7581.npy +04379243-3be738da92d36dd09db2b194203875cd.npy +03001627-5d60590d192c52553a23b8cb1a985a11.npy +04256520-f4391a20638d415e76e9713f57a5fcb6.npy +03325088-e7ad0788029da81950da8b99982a3057.npy +03593526-b4d2dc40f931fa5e664b3b9b23ddfcbc.npy +04256520-f3a24b3131da1ce619fb4103277a6b93.npy +04256520-5599465b099deb5064810cc21086da42.npy +04468005-2de2972a127607198ed52f6887b0e63d.npy +02828884-30b57b828f961ca8f002715a08c57858.npy +02828884-8417c3b75ce474d217b431cae0dd70ed.npy +02691156-a75977cd75acf0f05ff3feb917a6004b.npy +04090263-6075b98d3dfb0bf5c1ff4c99e4dddd02.npy +04379243-f7196ec7d732af5166decb1b3cdc5557.npy +03046257-33a6aa9cd6a2aaf3636746e397b0c904.npy +02747177-161e5e86fa48686888cad7f6c0e6001.npy +02958343-2e8c4fd40a1be2fa5f38ed4497f2c53c.npy +04379243-aa8bc1794eb3437977de2663bcb4d12c.npy +03001627-a1314dcd76f53519492d9da2668ec34c.npy +02958343-f88b4156c5e8d35ff500cc506a763c18.npy +03593526-8302f9cd5e454de85d878ba9ec3c0d6a.npy +02958343-a886262ac3be5ca7c126a452758c84e7.npy +03636649-fff6acd5b543ae02a9bdc22a1e02e82.npy +04379243-873d8928f314d95045613f5c2df1029a.npy +03001627-89e6839589a9b450a3f6a82f1fd27077.npy +03991062-febc8f9f30673a7af4553a0692c9821.npy +03325088-a9bb6bb33cc438413321831d2245cf06.npy +03691459-d9b205873345a9b35234ceed4dc815.npy +02958343-a471cdae8ec5df5c9e317a6cc797b629.npy +03001627-5ef9991f0985302c2526940b0dd3ff94.npy +02828884-2c76c171562f6bdfd4d8765e3910f617.npy +04468005-e47a49cceae04d4c213c1a52c1de2c.npy +04256520-308f0ebcbcdad58119fb4103277a6b93.npy +02691156-24c499191b85dd55bf4fc6675b9d12fc.npy +04468005-3ed0d2d3fe223c7273f4e1f33d29626c.npy +04530566-f46a84c0b15f8c0492f7f11d4bb65374.npy +02691156-356a633ea047c549ca8607f540cc62ba.npy +03624134-938a7a0692360ec853b59f50e41b1782.npy +03001627-a2e1ddca35161484f4b35f4029eb1ecf.npy +03991062-cbad1d4f7eb51ad9368b14e48c164a6e.npy +04379243-e8d118117b86ab2e8884a069d9619eaf.npy +03001627-43d13e139d0eb78668007dfca4077105.npy +04379243-edfc8ca3568153d7e8ee6c6df61c5951.npy +04256520-73c8bd191a664678f5ba7cb98f498b13.npy +03642806-9ddc0f876f54a784f3655a2ce983ab1f.npy +03211117-a7dfbb06cf1803b0b6d41c42f7ade8c8.npy +04256520-d3a1db19de4e3fcf7cd71f0b7b44a907.npy +04074963-81cbe7a64eb030c6c221cf4c35c835e.npy +02691156-68b5cf1b10331dfa77c1f99ed297e3ca.npy +04379243-9203f560599ca558c16f7010a3b8fdee.npy +02958343-11a96098620b2ebac2f9fb5458a091d1.npy +04379243-af09abc2c30ac934b3c42e318f3affc.npy +03636649-5929c6937d617f3acf7d397dd220c7e2.npy +02880940-2cfecc8ce6c7cd1f3497637ec59e0374.npy +02933112-21224eab2d099f5012de5317fe5b354f.npy +04379243-a0a123a2c7e0429c1b17743c18fb63dc.npy +04379243-fd487468f7a33adbb2a155afd9dbbb0a.npy +03001627-47a707b2804cc98f1a3c0af5880f464.npy +02691156-589e5b24b3b0e30e2620819ddac40644.npy +04256520-453d56b5906989fff29666f384be6c43.npy +02933112-d30f01d6e50f128d2822b5101b06e070.npy +03991062-257cd060f1947fd336b0f2a1430e993a.npy +02691156-78feacec03272b28854fbae23376cbfe.npy +02747177-e519a53461b3b75b66f3eac0b0a36798.npy +02992529-e5bb37415abcf3b7e1c1039f91f43fda.npy +03001627-212e266cab46f1dd5b903ba10d2ec446.npy +02933112-b8be007c703f1a9eb336215553415709.npy +03046257-8f8858484eae0ef5cd94c4ddf9d43fa3.npy +03046257-3ef61faef1e75fa12b47e06a5eec5e27.npy +02691156-596c6e1e27b102aedf9d17a71b5ddec2.npy +03211117-d5d6824b5115b3d65167d3ead22db5b1.npy +02747177-48aca9c3a4006a5163b2acb037dfbcde.npy +04090263-e48d07c71fac7387870906b5178d97bd.npy +04256520-37b3c4bd619d1c6541ec70becd1ecc7e.npy +04090263-1c4361c083f3abe2cc34b900bb2492e.npy +02924116-a9cb2c6d8f3f502ad392e744726eb1bb.npy +03636649-fc602899fa852d6878aa68632c6b1d5f.npy +04256520-241876321940a2c976e9713f57a5fcb6.npy +03001627-8027892aa03a3d2c907a5a34fd8df2f1.npy +02828884-f560aae80e66f50585ef4356ea4ff622.npy +02691156-e9b29777e840e1fb63737f7c5d9fc39b.npy +02828884-c8802eaffc7e595b2dc11eeca04f912e.npy +02808440-e3ecae5ad7f21c683321831d2245cf06.npy +03211117-415324f27ddd70b4ec3d7b1a84909dc7.npy +04090263-b12d95ad4abbf097e149ba69dbb3f6c3.npy +03325088-d440dce04ceb8b83b362845c6edb57fc.npy +04379243-c5838a6cff5a0163a91116f8fe859a4b.npy +04379243-b5548e1e944a31c077ceee024ab73ab7.npy +04256520-6b0254f2a397129a490ad276cd2af3a4.npy +02828884-512511e994adef8c28eac72b6945b61.npy +04379243-3842d805856309df777b6246417c94ff.npy +03001627-809cd21e86d7caac3162de0102da9582.npy +04379243-785f073399d19cf5b000f20a5153622c.npy +03691459-5ab3bc993eec96709aa778fe3a2080af.npy +04379243-87a30f02d938047987b390f69ff83fb2.npy +04090263-333ef51861a0280a561462387555febb.npy +03001627-8d80cc5cdafc4b8929e17f7efc5a2421.npy +02958343-709ebbf3588849b88b55a52bfd1cce7a.npy +04256520-924339df8bd64d694b3c42e318f3affc.npy +04256520-dbe7fa11097535bae7c7920f6a65a54d.npy +02958343-f10f279643fbb3276a78cd0552215cff.npy +04379243-4606eee54ad02693e06d804f36424ced.npy +02958343-1ab80bc91a45b7d0a31091d2234b9f68.npy +03691459-65c24305578ee500dce0005a7422ebaf.npy +04379243-399797977a78c2c3542091189dc62b5.npy +04379243-f1468b16ea560ae551d3c864cc68e22e.npy +03211117-4428b3a883f177c262f318360c3d0c75.npy +03636649-463a3ee50280fddafcb8d8c6d4df8143.npy +02691156-361f57d736cfc14dc8bff13697c27fb.npy +03691459-6a538eac61644b0f84145006657ffefd.npy +03001627-789daa82e0366966c862eec8232fff1e.npy +04530566-a4cf574f52d4e8d4642f9e27aaf0c47a.npy +02808440-ab70496561127a0332d44b56830636ba.npy +03046257-11c8463ba58a134b68661782af60b711.npy +03691459-8b7afc9b056307f3d3ba59ac5475adf4.npy +04530566-cb79681fc1caae04a63e14ddd32fec78.npy +02691156-775120d01da7a7cc666b8bccf7d1f46a.npy +03001627-419520889432730a970d4dd67731c543.npy +03001627-6e50f19c52a760e3cc1159c3b443c932.npy +02942699-3175f1c1d0cca3c6901887a0237c0ac2.npy +02876657-bd6fdeae09b3c00c3ea96ac97db63fa8.npy +02828884-f4a67224c61f79b1733ee41496c73429.npy +03001627-cc5e3fff3e1325dad67c0f41a0da9c74.npy +02843684-9681386c65c676875efd2d175ccffe45.npy +04379243-199676c0434f5e176bdcd672c2b17215.npy +04379243-365bcd79e58fe001243d6e2cf3942343.npy +03636649-816bafd4dd0a04756da1275102abcdb1.npy +02992529-9dcc24af7e0df254525b3f0594400a46.npy +02880940-56803af65db53307467ca2ad6571afff.npy +03211117-49ad86b608403b8ce760531185a75b14.npy +04401088-a635a6b98eda6c1fa436566ba711d6a7.npy +03001627-b19c970b2b8d6795492d9da2668ec34c.npy +02691156-1a29042e20ab6f005e9e2656aff7dd5b.npy +03001627-f5643e3b42fe5144c9f41f411b2bb452.npy +03636649-f36cab1570442a83466f97f37dccbde.npy +03636649-6a1af043806ddc96ac789d813ddd2d16.npy +03001627-e79b6815925c07acb0957d845ac33749.npy +04256520-17e3db80502cd515bec7eb09198824ea.npy +04379243-a9cfaeaa85dcb7663ca57f5648ff1b0d.npy +04379243-38ef005583b3cfd955357c338ec9641.npy +02818832-3acfa3c60a03415643abcff1f32a8b0c.npy +03710193-786cb8e6d57a7912c3366e417a4acadd.npy +04401088-649c8024460077cce8f3b203d0634c16.npy +02691156-a90230831ba263e5f7fe0727acb55c39.npy +03001627-10a1783f635b3fc181dff5c2e57ad46e.npy +04004475-5259f995c2453ce52af8f68791a7d624.npy +04379243-351d39fa6f9b659f2377f2addb49ed93.npy +02808440-9b55067f02fd4a80ff2ce0138c86aa24.npy +03691459-16d8b1fde755f7f96bc5197cc4c47fe8.npy +03636649-71b7341f69f50e35e86c35c1c8efea2c.npy +04379243-75bde51fca930e35dcc7ddfa72357b1.npy +03759954-5e912251c54c316ea35a7666f0cfa5bb.npy +03001627-75acccc933a08ebd2afe8d5254a0d04.npy +02691156-3ab1e94b6c3a1730c56cc5a87f567365.npy +04401088-decbc541efe459a742f1242fa6dff2cf.npy +03636649-f672eccfe1739e962dcf15e1dea29cf0.npy +03001627-a800bd725fe116447a84e76181a9e08f.npy +04379243-f3db554c71dcae06a40d3d325dad76b5.npy +02808440-167bf252d547bcccccd0340812259a39.npy +03636649-a6ae06e879fcaa019e26fe04e3dd51db.npy +04379243-2b2d827267baf5e75510d59f3ab1ed64.npy +03325088-5ae9420bed69471576c18e71fd49c4dc.npy +02958343-239783ded35d9a4e9f40394aed156c70.npy +04379243-11aeb1b72f433cac279f06792ea23384.npy +04379243-18fa0155b4fd12f9a829287b9dedcaa7.npy +03691459-1a33c0bb3949cd3213f068fa484fb314.npy +02808440-3d6afd4a791e5bdeb022c94235bc8601.npy +02871439-5e2cfde5b2195a923e4ff93cfe0b7fde.npy +04379243-6dedce56f7f60da423f7198a00163bb6.npy +03001627-a5f8050192680e993e6a70f59cdd19a6.npy +03691459-853f3c53280aa44fb63369d5dd85d25.npy +04256520-5d94769d9581fa85295994a5a65844cf.npy +02958343-4b94cdc9c703d00fef3ecc8551d2c1fa.npy +03467517-854baed942f075b4d1f4e3beb8257c5a.npy +02691156-4396510f1346f13050586f69625e08a2.npy +02876657-b35973652d9a526c64848cfde3847b25.npy +03001627-f619416ed17ca24a5dc688388b7d266.npy +04379243-1bac0eef0193952558df8eeaf3dad1c.npy +04468005-72e2827b801a1908c645871d38c7adf9.npy +02992529-a120a29467045d34c3f199bb1cdfc734.npy +04379243-8d459a20748b23b8c0c6e803b020a614.npy +02958343-265f0587e4018f7aff6fa400d1cc4c85.npy +02933112-c08dacfd5dd248374e9bcf25298f80d.npy +04090263-47879a6571648aaf5a5d51f7f565712e.npy +04090263-9079c787f6d944d69a6e43b878d5b335.npy +04530566-7114f947ac296d8034d05799e615961a.npy +03467517-bb9ec41d15fc2a1bf9412922790d06f8.npy +04530566-1b00f29471a41f59e92b1dc10fc46551.npy +03211117-9cd4467976a27ac9f3b65283778dd624.npy +03691459-5d3c3b2e6645df602a328c65e88727a0.npy +04530566-c8f5f746daa5bd96b34ff70ac6c9e4d5.npy +02691156-c641785e297cc8ef74008994fb1880b.npy +04530566-45351c87f019646115aa5b227c027ee0.npy +04256520-9d117d7cc29c3ef314513156cf2b8d0d.npy +02958343-a51b3b0cbd9c24f3a7fd25564c2e888e.npy +02933112-45c91d543ef3c1a829a50a2b3c5e5b6.npy +03636649-58e32cefd2f0ca13e938fdd9451c3206.npy +04256520-6c930734ea1ea82476d342de8af45d5.npy +04090263-59ebbe41c7427a30967ff5ed297c1ff9.npy +04379243-825c5f7bad217f49d96790493cac7283.npy +02958343-3d3a1207dac28b9340d2ba94749368ce.npy +02958343-f81db986082fd0562ac826a3c82da491.npy +02691156-c78cbd0e53900a1ef34db3de24263f32.npy +02691156-80b9b2807547a2d3ab94ae13bc67d41c.npy +04401088-27ef3bc1f4a05157bcff4302eb453f85.npy +03001627-e27cb29cc3df4d0330989b15eb158e03.npy +03636649-2070e39377140bdd7f32712aef0efc5a.npy +04090263-4ce26b6d23caecb3cc34b900bb2492e.npy +04256520-cb6b81f8c581bd2ee6fe3612af521500.npy +02691156-4d97f6fcb6886f49cc14f1e6f4f4f49b.npy +02818832-76a7e959f3f752405d72770c487fd7e1.npy +03001627-498e81334b1dfe98882ebc6f4e497cd2.npy +04256520-8520016e497352aef51fa0238791f5dc.npy +03001627-5fd2d226435431976f283df3449ca535.npy +03001627-5ef73c9bee1b4adcd019a8a03d4a2a3.npy +04379243-938ea1c89e7a62a9d6d49cce41472b6e.npy +02828884-c0d3d5f8941c8014ad5067eac75a07f7.npy +02828884-ab92e0151866e32a9ab1f232db58cef2.npy +03325088-f9ff34cbd52103d3d42b9650f19dd425.npy +02958343-e1c6002b98b4cb2c32f56cbc65681ab5.npy +02958343-1e3f494626a24badf35b4953d8add91f.npy +03642806-37b5e63e9f80e2402052a3b22ea3f616.npy +03001627-117c0e0aafc0c3f81015cdff13e6d9f3.npy +04530566-ae65e1f6bb539fa775e66ae917e551ed.npy +03467517-81e02a57da5c936df4b498e11fb60a4b.npy +04379243-86fcaf63c9e6542c858699aaad4acee4.npy +04530566-5c54100c798dd681bfeb646a8eadb57.npy +02958343-c4d4de90ce7839107dcee93b87532f65.npy +02933112-a46373d86967b3fce9aee4515d4383aa.npy +02958343-eeac3253fc4c0b429092ea6b09901598.npy +04379243-279b9a722b9b203b341625d524f6398d.npy +03001627-9183a9f6e6237492c90fb40095d2be6f.npy +04401088-fe39a57b8137ecbd5b2233351507f22f.npy +02958343-af08f280395cd31719f6a4bcc93433.npy +02958343-435d3d83b7511e39f44e15caa8fd94b4.npy +02958343-4de61edaa8e41c3a53c5346b68828e77.npy +03790512-98ed7f86a65ed6ad4a6b6d001599a1e5.npy +04379243-c71453f2c3fbd5fc56cc009699d2a2b8.npy +03691459-8b0544e065d43369588e71e21de9f30.npy +02828884-f1b8f4c4b2dc4a63c2dbf50c3528525.npy +02691156-daedff5e78136a8b507c9a5cb0f72e1e.npy +02958343-1cf08633fc7e8d193d21cf61f69e40a4.npy +03001627-57285ae595c5cc67eea9006d9d8918a7.npy +03636649-cbf2fd4e3b923f9ffcb8d8c6d4df8143.npy +02871439-6ea3f59ca5b732f01bc471cd5b795bf0.npy +03691459-58142a4c3a71147a2e8dbf40bb4c181d.npy +03991062-b2f08901afcc55e3a2c59a4d90e63212.npy +04379243-bdeb03b610923d868ee99ab78c7c9d6e.npy +04379243-f2ba8040ab2d2745febad4f49b26ec52.npy +02808440-c3fc4231f0388188125fa9990176f0d5.npy +04379243-757deea50fa00eb4e5595fbfd7d35143.npy +02992529-5fea05a3cdcc05756dba92a4e2177102.npy +03001627-9b76a0424563e3f4dbbc9440457e303e.npy +04401088-864b69db6dfc4bd0d4b4ae2ff4c58b57.npy +04256520-e084204cf0c6a345febad4f49b26ec52.npy +02828884-7c40c1a2e4476afbaca9cc236210e91.npy +03046257-ae564765e5ba2f037bad031e1feab327.npy +03467517-f7645b3c690d954682c2412261cb8600.npy +03001627-21a8b1ad63a8d19dd7f7a4c4609b0913.npy +03691459-185315ddc6baf393e0b4198d87217c56.npy +03001627-cfc758bfe8a1cd478c159f8d5e761b17.npy +02747177-f67bf3e49cfffc91f155d75bbf62b80.npy +02876657-6da7fa9722b2a12d195232a03d04563a.npy +02691156-22944fabf8a9763f28132d87f74ffe13.npy +03211117-5f73ccba7af987789744d3b3ee0cc03.npy +04468005-8e6d28abeec94d171b801fa323cefa6c.npy +04379243-d0b6d6210a65f1e4e50369287c07141d.npy +04256520-99b87ca5f2b859988b424343280aeccb.npy +04379243-8e9954ebd739a4aa10234beea2422457.npy +03797390-6d2657c640e97c4dd4c0c1a5a5d9a6b8.npy +02808440-519fae15db7dcd017b39ab85244ee8e6.npy +02808440-7f7d48994b6915d8b362845c6edb57fc.npy +04090263-38bbdc92fcc8e310405d5eab6bdcff6f.npy +04256520-9d2bb2163cba8f54c0e58de02a99f31e.npy +04256520-4a747546b39003dcd59517820ada1bea.npy +04379243-7d8ed7685620a16db2c48fbe46b01575.npy +02808440-c6af9be0c0038798ee5eb4c41d8a7ecb.npy +03636649-a7f25e662466f59dfcb8d8c6d4df8143.npy +04379243-72c8fb162c90a716dc6d75c6559b82a2.npy +04460130-dd82af6c4dc9e26cd9bc2d75eb1cab87.npy +04379243-7f4a5479c612805bb04e388f56884ae1.npy +03691459-492eaa948ae2f795a6d5deb42d3af608.npy +02958343-9bc421a5b0bd481b4e76a17e357a8d36.npy +04530566-b6ec93c690df4cac711722c32e47b894.npy +03636649-d83fc71f3978130e335fe03ac3704320.npy +03691459-b6ec9f482f055259f2e5d34c7b677bc4.npy +03001627-55185010b0b6e42eb98f36033d4304b1.npy +04379243-91bf48934d3b52ea36658c6705d0c08.npy +03691459-164bf28ed57e29a6293982b5acb5446c.npy +02691156-8b65813c6ab0c972ca2bd098b9203af.npy +04530566-d2f5b582c65ee9567f79d93424b708f0.npy +04256520-2bbd5947aca68a81d329e53feaade57.npy +03046257-1c4cd3b790fddfbe2f87b9fc1ad90aa4.npy +03325088-56c35d8a53c2c5d9fb930e40572ccf2f.npy +02958343-99a7f916d137e69bf2cdad303f49c9f9.npy +04379243-e2dbb55cd453fc2ead852a56afc15951.npy +04379243-7d517ccbf0d2b16c50fa82c2f036109a.npy +02924116-18d6a93468a1d0dd41cefd10ce5d6cc0.npy +04379243-875758df9f03fab669a10a3a70c69e8f.npy +02933112-d4277bc8f1301983a77c359d9fe71e62.npy +04530566-8ff4c7162259b1d5cf816caaec167fbf.npy +03691459-e7588cbebdae5863629c8a4be6c1e509.npy +02958343-29ea7766414de256cb34360716066a25.npy +03642806-2cafa6107fff001f7a470f4d014a755f.npy +03001627-a10e8dc1cc9522b67a80d424f0f4074d.npy +02828884-53f19d1ab0828e3fcd3af3995946ed40.npy +03001627-c0f2673cb32574014e972edcee1ee23.npy +04379243-d9e3a8c4f093d66f3e474b0005d777b5.npy +02691156-dc7a703f94b3b17667c5e3041553656b.npy +04090263-fa9f56b25119ab802ca888e33c9ff27c.npy +03001627-9d472f3426868826c43cf68e273d1539.npy +04090263-a38da7d4126b4a4912a8e5e6e6618c8e.npy +02691156-8bde5a00c3caf9771d03b466c72ce41.npy +03001627-c7786437606ac263b04cb542e2c50eb4.npy +04530566-703e4a7096ac1aba8f7e96a8530f50cf.npy +03001627-2724c02bc7797bd1486150a9b7f2cf18.npy +02691156-3360b510b0408682bbf3143b1cb6076a.npy +04090263-1723dcee921fd152d43bb185feff0470.npy +03001627-a0436bbc1e00d9ce6aea2f18ee404fd5.npy +04530566-e92386352c19221ac99bbfcf5650bf52.npy +03001627-fde8c87a485a33b78fa2f6eb9fb1de7c.npy +02828884-cf3821cfe979f0214d84fc9b190bb79a.npy +04379243-d57bb12175463d188aeaff3bff7f4413.npy +02691156-35055f849da2cf0ec3fe7930fce05ded.npy +04379243-1cce1fd7a0184a48cbb8bac2032149c.npy +02958343-9909e197f7383a976d07c55cf995503e.npy +03691459-79e5aa259b3c148789df8842b5523a86.npy +03261776-17c9866b42ae1831df4cfe396cee719e.npy +03001627-bbf89164385610221587835cde687661.npy +02924116-5faa6ec58602029168fc806428a57830.npy +02958343-552233e882a65b6431f5c3d8b8dbfe3.npy +02992529-87aeb552057c3d1a65a7971ba2230c53.npy +02828884-d2d4d92195546a1ecac503d0f3cb1d7a.npy +04379243-1ae856def06f8ee36bec1b6707900b50.npy +03636649-9b34aba70145f08b3ba6f328e4cd62be.npy +03593526-dd815275fce18cdfd138a53ab0d038a5.npy +02958343-fb6c92a80dd9af59b528c0abff96f586.npy +02828884-3e16ff75bbe7ed27464e1d2ff524a75b.npy +02992529-3a6a3db4a0174fddd2789f496481c83e.npy +03001627-70cb8d70d961ca48b04cb542e2c50eb4.npy +03001627-4d7cb35d1d9f2434ccbcb819724fb563.npy +04256520-3cce581fbf55c31b8ccbec49bbc083f6.npy +03593526-5c589d9495c87d7da2fcca81c767066f.npy +02924116-3b5e31b2987f158e9f46749e28e16975.npy +04379243-62d2038ffb8b9df253041c49040be3d5.npy +04379243-711d439d6638b4c33efa790205f68f8.npy +04379243-bf15d331be699886a005442d4981d053.npy +04379243-de6f494dbebd91ede057b217c7790618.npy +03001627-e065edba45aee481490ad276cd2af3a4.npy +02958343-270b0846304e3d66bda733a39f84326d.npy +02747177-af1dc226f465990e81faebbdea6bd9be.npy +04256520-758895bf2fa5e4b5e68b9e5f5c3d0eca.npy +02992529-46261b630244bdda533775ea6714a372.npy +04256520-bc2c0cf666122cc68f5c37fe197319e1.npy +03636649-886ff4f5cd90c6ad39b3360f500ac52a.npy +02691156-1d5708929a4ae05842d1180c659735fe.npy +03636649-c2378f62797cbcb26a5e440d54e375dc.npy +03691459-f7023235e0282c797f357b05b0dcb89.npy +03325088-8cecc2d6db8756683321831d2245cf06.npy +02958343-100715345ee54d7ae38b52b4ee9d36a3.npy +02933112-21f3c0d4604587b4da5feafe6f1c8fc.npy +03001627-a128eda00983dd01fb7d9615be5ab4b0.npy +03636649-ec876529d01d4df490ad276cd2af3a4.npy +04530566-a89cda9712b67a97d1e97c10e2464c2d.npy +03001627-1157d8d6995da5c0290d57214c8512a4.npy +02958343-71b00ea32b1810ac373af83f3f2fe606.npy +03513137-d736c45c5b2397219092826e64279378.npy +03325088-b19d6c949c76e41c9be6726a83c38aad.npy +03001627-981adc1bb90e7cab666bebf1a1d4e946.npy +02691156-ee461612837ce39eedd03f781ec3ebcf.npy +02691156-75b151efa363c18d94b9c9a92aa36f8c.npy +02691156-e9bbeedf2681b8ad154c6bbaeb7d331f.npy +04256520-de82cd275086d50e41b160b9adc112fd.npy +03001627-c6cb59e7645dd14d661ff085a0f14b7.npy +04256520-854c9e951c2cf2e3492d9da2668ec34c.npy +04379243-578f935f182c5cb3bc5c4c571faa8806.npy +04090263-13ff0ba1e8d79a927f71da36e5c530dc.npy +03636649-2577723d02fd914eda113afcb6c5e140.npy +04379243-80f036ce585b1ef648ff063e62e02115.npy +03211117-28b6e44e37586fd797e8123bbbc761d8.npy +04379243-f907cab3a8373d56c3bd24f986301745.npy +03211117-9e087d56d1264f0bae8d825afe55a6fb.npy +02691156-5fe313e070d6fc4e2620819ddac40644.npy +03001627-f428a799c3185ee0c8687ff9b0b4e4ac.npy +03636649-30e5d9149ddfeef27357c8b8283e0cce.npy +03046257-c084297af1373b36b4cd1bd556007aed.npy +03636649-79af7fbe587692a583768a4ac1607d73.npy +02828884-6233b6cce0da0615d4cfbd0aef5a371.npy +04256520-1441ae85e34e1564ad33b69f9597739.npy +02828884-9d47deb11cac29f089345002d2594e4c.npy +04379243-67584a2261e175ccfbed972ae4fd63af.npy +02747177-12c4048e0d2f26a763b2acb037dfbcde.npy +02958343-3ed07ff8b46b2bdcb1bb46d2556ba67d.npy +03337140-2bbdcfcea1a8c5f3ce5d6e9371bb5c33.npy +03636649-ad7dbc3a78d37b4c8616812464c86290.npy +02691156-6a75658fb8242b9c590874dcd9dc8481.npy +04401088-16549bfa3cd0f53d2110cfd44d2335d.npy +02924116-83928dc21ca6588f67aa983983f9bf36.npy +02691156-b1835836e541766882568aa50e4e5dba.npy +02933112-39b50a129ff530efb4ba4a53b97265b.npy +03001627-f3e0042ea11660d0ff2c92c2a4f65876.npy +03513137-6ff1a99371f10144e5e6ac3ef6bff73.npy +03001627-b7403875e1d7adea331fc18393f04d2a.npy +04379243-e6d8569c0957e7453002761e7a3ba3bd.npy +02691156-d22521d217d89f8d5b1bb801ea1e2db7.npy +04530566-e11279543f1e3ea015ebc00dd3588bef.npy +03001627-5456ffcbb7bd6b3e4460d09678055ab5.npy +03790512-9bc8441b3b70b7014a4c9ebcdcc46c40.npy +02808440-e23251d421d5f7d6b362845c6edb57fc.npy +03001627-5df875e6f0cc0e37f838a2212356e267.npy +03001627-6dccf79814289bca5a15b6547f08c8fe.npy +03211117-61645237bf8de4df77525a753bdd4f00.npy +02958343-8285dfa786cf25b2c29fde65e51f52cb.npy +03001627-a33fcf84726cd862d866e3aa112e4663.npy +02828884-96ab21db41e4da2d848b05feebb5193c.npy +03046257-27c132708bab56bd32320778c4ce7485.npy +04090263-87e23cb3540dfc59c89145ad6791be51.npy +03790512-f521fe88cdfe3a291d87d0fbeec0e0ff.npy +04379243-97718e2651d22b3a74740f837351e7eb.npy +02808440-52f74ddc2d35e8e900a91cbf836390b.npy +04379243-d4acb5110512f5c38369c37b40e82efa.npy +03001627-3de3774ea9a05f51585ed17f54616d23.npy +03691459-2f1446816ac58936361167c63c6bbe5d.npy +04530566-d9ca42c1199196a8f8785957fc1b208.npy +03938244-2ec52ad731536d294b3c42e318f3affc.npy +03593526-d2b8e090125199c49edbf2f02d126923.npy +04090263-e8df7ab8879ae3f895bcf48dcf4517b8.npy +03001627-c67b7b62e529295dfc30525e763ef5eb.npy +03207941-fee1215825c04d1d9c12d6260da9ac2b.npy +04379243-8d900764c04127df4b3c42e318f3affc.npy +04379243-294d38860c334c4954a61dbdbc1ac262.npy +04379243-a59f0a9956137c0735962325b2299f4c.npy +02942699-317a7ea24e661ce3bfc146552c7aa5d2.npy +03046257-26150fdcce285cf49fb73a07dc7d819.npy +03001627-fb5ba735ef95fe417ca68e217a316e15.npy +04401088-3f95b3ecbe55c83e9c3a7294039d408.npy +04530566-f69f4b2abc707f667610cb1c03c9c3ea.npy +02992529-a7056690a5bf34d24ffbcf8cf904ca12.npy +03001627-85be4b6c37bd1e801d45bcf0f68506fa.npy +03467517-29a402726ae7c4ebd440718bd2c795cf.npy +03467517-b15aa0998b1453ba830536956f5eb8d1.npy +02801938-e9b6ef7375650b54ad2fb8cd0793fa9a.npy +03325088-9b65733ed1e66f1dcf87dab359f38253.npy +03001627-e505ab84808920d06031c9bf940ea7ea.npy +02992529-2dccc7cfff6f9a28aca331f9e5d9fa9.npy +04379243-bab2fefad03208b0935d906e24c18439.npy +04530566-6a7ce5d7027678c299429033f40f0f8b.npy +04530566-7ba19c8354c66edbb74e6fa236ab84b4.npy +04090263-1813aaa9a82a98789c82b3f5ddca589c.npy +03624134-792f252dcb06f042dd56c1edf3f6e336.npy +03001627-5e5121cc58c4fea78ce66f12ba927a2b.npy +02933112-4e2d3dee0f6c8e18754e8957cd76ff02.npy +02808440-dd3667be79294afe3321831d2245cf06.npy +04256520-c63e1750f61af4bc4be7464481982099.npy +03325088-574a71125f559fbeb362845c6edb57fc.npy +03593526-c59aa436f265a75b8f9c4ecc067067e9.npy +04468005-b5e64ec8070fdd8d299a59bfd8e7d284.npy +04379243-4f79ef44a08bc2ff4a60c1a189046dd1.npy +04379243-46165d8076918c62f51f77a6d7299806.npy +02958343-787ba4e958f1bbe88ec77d0d80815cf8.npy +03691459-f682ee3b4f4dc3fcce029fab54b6cfbd.npy +04379243-48273349239e81b64b3c42e318f3affc.npy +03211117-9536f9fd4795dc2d70ef2132a4b991a.npy +02808440-934bc8fa879c3f0244221bef0fa3c36b.npy +02691156-eac05be6e7f3bfa99a6e43b878d5b335.npy +02958343-22428fd70b02b83ffc567bb1bd08c1ae.npy +04256520-ea581514b73f4707febad4f49b26ec52.npy +04379243-2c671dc7902c140d3b52a6690de3e81d.npy +04530566-2d189012a5b5a64aeb5178df7a9bd7f4.npy +03001627-5bd08666f29e946c988a5637d6d8f36a.npy +02924116-4ead9b28515b97fdc0e2e9e9ade4d03b.npy +03046257-50be9eafe3abc283ecb14096838a20c5.npy +03337140-55054f56f1afd25ace5d6e9371bb5c33.npy +03001627-3b513237d90a4cd1576d8983ea1341c3.npy +03761084-a65e74617ff51c661b1fe5e2144bf114.npy +04379243-b9328275771909fe920de219c00d1c3b.npy +03325088-4a03d0bf342959e7c36fb70296e45483.npy +04379243-6e446bb5adf14b0b6121178eafd002fd.npy +02691156-1e40d41905a9be766ed8c57a1980bb26.npy +04530566-6271c832e8f629b73c83f6e156ad107a.npy +02992529-4b96f974453ef59ea2c7c5886f4bbc93.npy +04554684-9b1b90b033d6c6a42bf3161ae4fda942.npy +03642806-82edd31783edc77018a5de3a5f9a5881.npy +02958343-82d37fceb984256bf200a72c9245aee7.npy +03636649-7e5dc9256f9600d9fcb8d8c6d4df8143.npy +04401088-91240b6e6ca6136dd25ac584f0a4b696.npy +04530566-bcf9572e3f21a9505c0be177939e290.npy +03691459-85e8d20d51ce13cc7fbc060fd555478.npy +03636649-aad5c7256a7c6ba92a4d67a8ec314d2a.npy +03001627-787a4db5b3452fc357a847db7547c1f3.npy +02933112-30ad23a8f6a3a4479725f8348364f5a8.npy +03001627-4e438ade91769be8c8687ff9b0b4e4ac.npy +02958343-1be81460e620aea65cde8c99e4b182f9.npy +04379243-ba6e6f8263e961c243f6b77085610df6.npy +04256520-ede1eb2acb5ba12e7282872e507d5fff.npy +03001627-afaa508214b7515a161d68600952d375.npy +02958343-45e69263902d77304dde7b6e74a2cede.npy +02933112-586cd9ce3d22685f2280e8623aad43f4.npy +03636649-9000cdad54cd0285e6597d391ab6fcc1.npy +02958343-165aec174bb93968a114c8c036e29a08.npy +03691459-a3f012045e4b62b2789df5bd89bb3ea.npy +03691459-44cdc1204fa555be2633ff66beb9cf31.npy +03001627-e5cb5334f18c13c15a7f6c1314f7ac2.npy +03001627-524e4a1041ae53154b3c42e318f3affc.npy +03691459-bf83a8cfb72a6208432eb33b78f3e334.npy +02933112-8a7f0dd58fbf14a4c59350d819542ec7.npy +02992529-a2953e7ff6dcd4465af22172f09754fd.npy +04379243-6f6d4abfb84b9eb527c3aad6317cf3db.npy +04379243-c31155f4beed339e855931d119219022.npy +03001627-c53fa6829ec9a947d13b7d13ee32497.npy +04379243-be9a0901f9ac115d71b883b95236fc2b.npy +03001627-af0831d39fd8f794492d9da2668ec34c.npy +03642806-71907a4a567dce3bb0de1e7a6809fd90.npy +04379243-c393265168bcc56cf3ced7613d1c130b.npy +04256520-b0aab89e3318b09724a8d949d07d1308.npy +03001627-866552d994de3a252ea98d69e91ba870.npy +02691156-3a82056ea319a442f64801ad2940cdd5.npy +04379243-553213ef2a7657fa9ccce4c6d5bb195f.npy +02691156-3e9ff76da8ca4885d0635288642e63e.npy +04401088-c4dcbb047d219cfeb4018979c856c916.npy +03467517-fffc2fc5a90254de9e317a6cc797b629.npy +02871439-495deb98f5096b3be3241548166bb146.npy +04090263-354d382fe282ff567ce76669ca87ee34.npy +03467517-3a50cba9f6239bd037d3e9143e987d83.npy +04330267-50bfe9e46388341c3f175c5b5510099b.npy +03001627-3f12570d87da2383492664434c74d812.npy +03636649-cec552e824883875490ad276cd2af3a4.npy +03211117-2772ad703e5d4b73cf6f327fca156fb.npy +04330267-d8e0d47be86833ffe8cd55fcf3e9137c.npy +03211117-817aa8a9ac7f57f9dd936ff7b4023f05.npy +02808440-d498df3b7c7f53c6f74d83b4be105200.npy +04090263-32d8874aadbc73daa50ef3fc203c6ba0.npy +03710193-7ec679d4c550daf149400676d2d9ca64.npy +03691459-464da0c0df4ed3c0dfdc04b8b8434e84.npy +04379243-e65066d6b0b83719c3bd24f986301745.npy +02747177-b838c5bc5241a44bf2f2371022475a36.npy +04530566-87f68a979aece6f71f29de30ec1bf6a3.npy +02992529-19b1c1a790c6824578bfad8b5ed8c4ef.npy +02828884-dbacfce828f0598ad534c2812395a1c1.npy +04379243-4cf6b0e3320f0740521fac473c90dd4a.npy +04379243-1cb2fe52097b5304217ffa735084910f.npy +02828884-3b688abcaf09a495c62ae1031b767cea.npy +02691156-95bc1c56fd50037ce3f3aec01b086ba.npy +03001627-79780c35666f045d7ff7b6423ebfebc7.npy +04530566-80d9d9fc9c6138c4800a0120f3e757a2.npy +04530566-3a71bdf6dd3e42bd6d08077e9257af3.npy +03001627-cc2930e7ceb24691febad4f49b26ec52.npy +02808440-8c181fc92fbba230a341228b21d337a9.npy +03636649-ee8543345535674822aa4f44d9f697ed.npy +02808440-2f65f22224a48d26ead253ec715c9744.npy +02747177-9fe4d78e7d4085c2f1b010366bb60ce8.npy +04379243-313957e318bb7849febad4f49b26ec52.npy +04401088-678ed514423f067fba55419d0f0e294.npy +04090263-7a79d63c2cf6df519f605c8c86eb1ec2.npy +04379243-9228f548332eacc51287e03b5b76fc86.npy +03211117-c514d99259ffe1abe441f5bb6f88ca61.npy +02691156-a9bbba73d3fb7688b6b87e72ead132ed.npy +03001627-98f923c006fdd918e6d206b2ed87676.npy +02958343-dd84236f0ef27765a134736201a79843.npy +03211117-877cadd597775369ec059109909662d2.npy +03467517-bb4a5712da8f63330d758421dd01f45.npy +04256520-6ed0a767dc4c570e4cb7bc8e4c7cdd90.npy +04379243-5ba371858d595d4ef645e44148cef56.npy +04379243-9e6aba6596ffbf95a9bdc22a1e02e82.npy +02747177-1c3cf618a6790f1021c6005997c63924.npy +03001627-25d40c79ac57891cfebad4f49b26ec52.npy +04379243-2182028f013e7eb530bbd4cddd04c77b.npy +03928116-6d52a20b2a723fda16a0adac6af4232a.npy +03513137-7721ee80bfa4cbc583ce6bc80d855733.npy +03636649-52284fc0b5822495ce140b3448f2e640.npy +04256520-7a379a92b40f0efb3920d120afd003e0.npy +04379243-4b9ccbb4884f12376a5e440d54e375dc.npy +03211117-22e8d055ae154efbd12a1bc232f6622c.npy +02691156-bd46cedafa0568b070d98a97e17b4da3.npy +02958343-7a2cb890271a361799b92ac6181b3e5e.npy +03001627-c3bc47657b691c51e6fe3612af521500.npy +03691459-90cf7907801560fd27766fcc9fe2f132.npy +03642806-f28fe2f836cb0dfaa8f4918d18e28074.npy +03046257-2dc32ccf8ad7e74faa45d7cfa7825fb7.npy +04530566-acc71731a16d074f5a11da1e572e8f01.npy +03790512-c38b3d9be97383c2ebe67d9b32c3ddf8.npy +03593526-9cabda39008f86316d075d8d4fe1141.npy +03001627-f09af71bebd4bea8a2651abaf391628e.npy +04090263-d1044b04ea67ab2d3e10bd7b040a4312.npy +03636649-3aec7c839e247954a38859fd71bee28c.npy +04379243-8e3a98ea6d37d14c59a230640e61666e.npy +04379243-f10473382b623504d79b19c7c4f0e293.npy +02992529-f9023b680f219f7c363111a4e20c10d0.npy +04099429-66e0f9388b2eb6bedb7e97e28dbb721.npy +03467517-57c71d56ec72bd8d63e148e250c0340d.npy +02958343-c34f37b1bdd6fd62247035fb6ff31a15.npy +03325088-2007abffa44d274d25074a00e97604c0.npy +03991062-fe9ad9b2af48f5c28ddf4bbff6a47d4a.npy +04379243-4333e8cd288f47c4e0c9d6065dbbbe16.npy +02828884-bc6914d649379349ab3be97afdba4e8d.npy +02828884-d71d9473e08c108d2f210d96281fe860.npy +03001627-60647c98b5fc96b13002761e7a3ba3bd.npy +03325088-e8a23ca5394733a0b362845c6edb57fc.npy +02933112-1f4ccbdbd0162e9be3f7a74e12a274ef.npy +03991062-657913cf3b4a83a2557ee26019a883fc.npy +03001627-32b56fa66c73c450a86b76551c6a3b2b.npy +02958343-e5236427b42606f4cac26de9a01eefad.npy +04379243-81db02f2b3686761f51f77a6d7299806.npy +03636649-684b06c007aa83873c2e0b170f2ad8bc.npy +02691156-37cbf91baa58d6577dc01d89d8a05b74.npy +03211117-8a87846412b40900ab610b0c94236463.npy +03797390-43e1cabc5dd2fa91fffc97a61124b1a9.npy +03001627-9a91a491a9e74ab132c074e5313866f2.npy +04379243-23a4fc50f123d8801ec48bc3c478566d.npy +04379243-878414eb6e86494d9a8ef44e1d2c5b75.npy +03790512-582e995c76ba36a44f5a72a02a218ed6.npy +04379243-c5230678204a1bb8dcfcef693e7ec696.npy +02808440-a67047070d8693d2c2f0673fe60ad9d3.npy +02958343-96905400f6122662473f10e6caaeca56.npy +04530566-bf4386d3e823a09e57a4e26112104eae.npy +04004475-36391c79c1025c3867964ba700cd97f5.npy +04256520-dc89ccf0f13d42a83abfc4d0a5688916.npy +02691156-ca45f5d7efba158ca35e371359a547.npy +04225987-f5d7698b5a57d61226e0640b67de606.npy +03001627-2745c7d9f2027d605a9f35e635b7e48b.npy +02876657-405ee743f0d8601551238db1f507a8c7.npy +03001627-99d4e65625b32a1d151f08387c3363cb.npy +02828884-66304c61af32ca5aad5067eac75a07f7.npy +02933112-c129e7434b33f3cf1b17743c18fb63dc.npy +04379243-e5567158ce772a43fcf7d910cd22d7c2.npy +04256520-b048119e0f0828d5758f6def7204bd6b.npy +03001627-5c6c95a9a99d452e1d2651c636d3967d.npy +04530566-34c099dc4cbcb0ee7c304709a8c6cd35.npy +02691156-3391c664149308cb4f95630cc18536e0.npy +03991062-8306708f6aed84dee47222ca7f3cc9f6.npy +04090263-963506132e08855de5cf42144086d22a.npy +03642806-39e80a6570002a431181170a86d04637.npy +03636649-85a73c46a97649fa6d0c88a73d7cb14d.npy +03691459-6e542a3dfae28b1cf852111eed0a5c85.npy +04379243-426a9fb4da504a96db3e66b0a511465e.npy +02691156-1d7eb22189100710ca8607f540cc62ba.npy +04256520-9aa3c3c03d111640490ad276cd2af3a4.npy +03001627-73d534b85a1416eefba3e6a55f280fd.npy +02828884-d074449720d6b421e44204a7bf1b3ed6.npy +02924116-59e0e8d9a082548a103ab07d448b13c7.npy +04379243-4cbfd25faaa706daea0e09825584e0d.npy +04379243-234ca609205d8d80a1e28099cf3c0efc.npy +04330267-ffd3126859fdd15ccf0517eac2f2d331.npy +04090263-6f739c0ca5834e825dc7ef8b006fcb7e.npy +04099429-bb07f8aea99dd2cd533e0927d26599e2.npy +04530566-a02fb3d1e8e9d34ffdd29529d1a15514.npy +04468005-e0486cf313d2ad90eff204cce5c18b06.npy +03636649-6b0664c9fb1a4fd1fcb8d8c6d4df8143.npy +03691459-5eb44c2aa29844391f9f3ce366e030fb.npy +04379243-791987a0e943f009b5872b4cd3f92676.npy +02691156-40b916f7c41ad451494ac047ec5b052e.npy +03001627-2d74dcc00e449a5462a510b8f97c658e.npy +04379243-3fc1002b5a538aee50c9fe3e733d8740.npy +02958343-4dd97a6805c2797d18d95feceda870ca.npy +03211117-ccff142a647e673dc24648b5216c0d5.npy +02933112-59263293983a99d3de650492e45fb14f.npy +02828884-9a58d783e013b051d87d55641461d6af.npy +04379243-120f8e2ef276fc6b9a45b69dede1154b.npy +03636649-545672cd928e85e7d706ecb3379aa341.npy +04401088-283e3f79ecc4b74d1e4e60ebd003a0c9.npy +03624134-654ebe35ec5c1cc676b32b03a2729ae2.npy +02691156-cf2bbaaebcadfb282933085759cb1f25.npy +03593526-b22a31918c21981a275d003e423c59ba.npy +02933112-1d93291de09fa5c876e9713f57a5fcb6.npy +03001627-2bf05f8a84f0a6f33002761e7a3ba3bd.npy +04379243-f298b3663ae591a2276bf4bce35c96fc.npy +03001627-566e4f05071e86bbf3c9c1464e55d580.npy +03001627-741fa23c22d97ea81bd5f87ae5f3f83.npy +03001627-8e76d0002b592ef91663a74ccd2338.npy +03001627-bbdaf1503b9e2219df6cfab91d65bb91.npy +03691459-c2598d72d508a33060ee9c7e2ec5f91a.npy +04379243-38c184010d3dbed1d0c05eb40b42c942.npy +03001627-2b110b833111b38c420adf24e49f74c8.npy +02958343-8b722405131e569db927782fc69a1fbb.npy +03001627-6a28919186eb55ecf69d0cf4fdc89b12.npy +04379243-fe2c951f711bf1971a12d98ab62a7b8e.npy +04256520-cf81e26374530f8fc08abcaf67cf0417.npy +04090263-262990856b80d83d4382b46c76d2521d.npy +02828884-b711e64c92fc594c18e830a47a552b39.npy +02747177-d62fb12c728b273b1aae33b6f700ecdc.npy +02871439-abe8a3e6a25fb925cdc110c18589b6ec.npy +03001627-17aeeadccf0e560e274b862d3a151946.npy +03001627-fb9f11f128e006d2498725b9a1405ebb.npy +02933112-a3407d2fdef7386c278d386bfa54545.npy +02691156-1e2de00cf19a0a33554ccf8c30febe7.npy +03636649-2a3267758a3caeb7cf353869450feb9a.npy +02828884-7a5ecec36bcb9eb24c080f2371a3ed2.npy +02691156-22795c32b54719dffaa7ec7d870d2e09.npy +03636649-96b71e055f40cfc21735ea0e092a805a.npy +03211117-d9c951f1008183e69755c35f0639c9f5.npy +03593526-72b25fa022376928e4feabc80d16b5e4.npy +02992529-93cc80bca9e1812a64a09de5345a6fef.npy +02828884-72b6c4e1d8b93b21c2bf98e7124e149.npy +03001627-8169b36ef1ae45ec19fb4103277a6b93.npy +02691156-62ca091091053afd9a6e43b878d5b335.npy +04090263-73695c25b3ec4ae372333100c25acfb3.npy +04379243-af3ad492135860eed8fe1b8aaa4afeb2.npy +02808440-85663f3daba8a0d51c17aef130ed6213.npy +04090263-27df401605241825fb5c1b0f759e2bc1.npy +04379243-fdb61d6d639b1f51851f4ba6aaedaaa8.npy +03001627-c8bd3d33ff8cd4abf189bc4b6aa309bf.npy +04256520-4a01490054b15c90ea5adc188e5a2fc0.npy +02828884-a58cb33e8aa8142af155d75bbf62b80.npy +02691156-d28a3cd771b2bf1e71d03b466c72ce41.npy +03636649-5f4bc8ad5a1a0dd4cccbece4754c7cf.npy +03636649-5c324a7cdf6195a5303c85804d402599.npy +02958343-eb471949c658f39eca736b1d30b87e32.npy +03691459-4c722ef308bd6362d747b49524a1246e.npy +03636649-d16bb6b2f26084556acbef8d3bef8f28.npy +02691156-9cb21d68582e1c4ec1ccec171a275967.npy +03991062-e9f6c53454e068cb2ff65fa033da81db.npy +04530566-159d09a7bd7d09a59f1deb04fb8ae481.npy +03001627-7f70642500b9a3ce45881d7eab1353ba.npy +03001627-884a239f3dc6a91cad484915511ccff6.npy +04090263-2416892a9f7688b01638241f3ad71c10.npy +04256520-c37832a4b22cc13e6654a522b30cb96.npy +03337140-501d1a430865e6d7492d9da2668ec34c.npy +02828884-55ca4cb17b26110d3b160521ef1e85fa.npy +03001627-19ff1d5665c1a68677b8fc2abf845259.npy +04090263-db2916f1dbff9d9232967a44e902e4c2.npy +04090263-ea212437514740bb8b700cf351204203.npy +03636649-e9df996dd33c009bfcb8d8c6d4df8143.npy +02958343-cc7f51159a1a12fea7fd25564c2e888e.npy +04256520-324d7108aea113f5b60d98504d0756f4.npy +03467517-44c05e219618a6395b3335548350bdee.npy +03593526-dddd30f41cd6543e25e65d4b5f3b6456.npy +02958343-2a771048127cf0b85dca6305fb9f97ca.npy +02958343-3975b2350688e38c65552c4ac8607d25.npy +04530566-b89d4bfad9c9b64d476a01ad767951be.npy +04090263-8adb587e61fa424ad199d75ecc2a48b.npy +02958343-fe1ec9b9ff75e947d56a18f240de5e54.npy +04530566-5c313324778eb79ad976d6ec0305833a.npy +02691156-166d333d38897d1513d521050081b441.npy +02933112-9d59bf323b297b327885a2b9445961bb.npy +02691156-35bb733b13c48bbc839ab492b6143b9d.npy +03467517-9768ded42e36d84363e148e250c0340d.npy +04468005-dbe69c9cfc9d5ffa9e7fa80af2c89cf2.npy +04530566-5fd1b1b185638c49c13c29cdfe828247.npy +03001627-1ab42ccff0f8235d979516e720d607b8.npy +04379243-a18c4bd95d90f37091829b477862aff6.npy +02933112-8fa86c85b7985962598f1102685df4cd.npy +04090263-680162d9443e8a408e62f59b444d701a.npy +02933112-48555a476cfcd222c59350d819542ec7.npy +04401088-25e03c305f41c5dd226bc3b9ce9ff2a1.npy +03001627-37a05e83e529a1e044f23566597ec464.npy +02828884-f197553928fccdd2b12aa6a0f050b3.npy +04379243-5e14471dd0ac3e47765ee729adbdf968.npy +04256520-c3664a4a708086a448b7e15d7b3646df.npy +04379243-d6874aa362830375ef8af3aeeb9bcffa.npy +03636649-63da6d6aff4d14789bc41a35200a3af1.npy +04256520-761b8ef3b41a84b82f84cb7932f866fd.npy +03001627-969730a19872b564fdb60f509d2616e0.npy +03325088-903c4ce576afab5e979c556124bee033.npy +02924116-53772463c870f1a1d76caed74eca6172.npy +04530566-fa3ed7b176b0794d5b4b8b1a2a708ac6.npy +02828884-4a9a7e5b88cc4b79b985467c63dd34d8.npy +02747177-def815f84e0cc9cfcb2a965e75be701c.npy +04530566-459decbc3c6bb150ba2abf2ecc57eeda.npy +03691459-b3a4bcdee00ab993ebc29484102f14e3.npy +03001627-ba33781b222ca9346e23a4fabd87b2c.npy +02924116-fb5b5a60d254807e6af3f354644c5a9b.npy +03593526-133dc38c1316d9515dc3653f8341633a.npy +04256520-96ce3abe2e2d4bd3ff24fe90298ffa71.npy +04256520-abc6cff85c8282cf6fe2eb61cd6e74e5.npy +04379243-4391d4d7984a245be0182fa3e963fc11.npy +04379243-21925c161a6aa5bf6d65f86bdc92afdc.npy +04530566-189668ffa80d37877622984b5941cfb8.npy +02808440-12e0842f9f1c8cf02c3aeda648e0cc4f.npy +03691459-26778511109e9e76d936ebf2a7172ccb.npy +02924116-bbe7d3e157ff918541cefd10ce5d6cc0.npy +04379243-52837fa3e281763aed88854fc3e3ce05.npy +04090263-a5bfb8e604bb2d8173db096a9cda49d4.npy +02933112-31ab6947975f5747c62ff677c806df30.npy +04256520-46e6485e5bea085a2b450c5933dcfcb6.npy +03991062-d1b50f008ab9e3d7da7a4e0a62ae3e2e.npy +04379243-d5e79960180078237062f2d72cde5c95.npy +02958343-3e2c3cb4f4c65b9cde9d4070fcdfa604.npy +02828884-27539b0c42068420cb2a965e75be701c.npy +02828884-ca0a5a3a4c5e255b20768660cf080d12.npy +02691156-86b11ae736659136ca8607f540cc62ba.npy +02958343-ff5ad56515bc0167500fb89d8b5ec70a.npy +04379243-fb89493e6389039527d4fc401a34f3de.npy +02958343-60d8d7776789b4b1fe11eeaa72c8aa36.npy +04401088-20346d307d39aa7eb6a804c25e3218a.npy +04379243-5bbc7d606ddd5d17e492aefec5dc15c7.npy +02828884-2c47d12adb8437ed601104cd2d998272.npy +04090263-8c2748ffe88d346ab9915b62040615dd.npy +04379243-60c580efa09c28a91ceb062da003617b.npy +04379243-3ffeeae04bdd3b51c3bd24f986301745.npy +02958343-2d817a6f23d35494d991a658ca89186.npy +04379243-99224f3ab2705aa9985ef0bf52b97bf5.npy +02958343-588c2d2567fd900aefe5f291bc2f5fd0.npy +04379243-e20f1fff2b84f8ea71ba8e8bdf40d1ea.npy +04379243-7efc699b5fc94757f93239519b75aa98.npy +02876657-e656d6586d481f41eb69804478f9c547.npy +03211117-b097e8761c3cafe5a35a7666f0cfa5bb.npy +04225987-113783f51974426b92ba7d308c045fd8.npy +03467517-6f9d1467eb39f8abfae47f572c17b9cb.npy +04256520-a181227b44ccf1ce6199ff1c1ae229f3.npy +03790512-6ebb8ff387bc2510c17fa08d127e11f7.npy +04379243-e339e8b8f1bd5eb9626d7e3d07da8352.npy +03991062-d7e47dbd3b50a3688cbd3996b1c0adf8.npy +02992529-d0b5b899929975558ee99126b119afe5.npy +03001627-d52e7e39bed3ed954f62c7a282978009.npy +02933112-247ef69bd111e8f026cd8d83e7ef5b6d.npy +03001627-df2b3ab36704f9e944ebbc705ad8c07.npy +02958343-23e8adb3bf1961f85332d3b92481b499.npy +02691156-9facc516914dcfee6c32d954b1c7f41e.npy +03636649-7a2362fbddbee9a4d197f67767b32741.npy +04090263-a2015aca6b4268c4dfe6ef2726050c2c.npy +02992529-e483787b7f9c606042f892024869e751.npy +03001627-cf20398c0c3e0359fa2037e5e59ff423.npy +02691156-98011d15300361e54f0e6f5b218145e.npy +04379243-e6cd72665faf3180f2cf6a9bef44d625.npy +03337140-9f17166a3193a8284c3aee8e9d3a6ffa.npy +02808440-b188074441f74c6e1d17c7bdc785739b.npy +03046257-98e52f275290d28bdb54f0ac1f9f81ac.npy +03948459-7e90dc936dc1a725fef144202cb2b935.npy +04256520-250f7b0081d2be215cd6dcd866c8e6a9.npy +02691156-c68efb547224f1dbed4212b3ec7c4371.npy +03761084-2352e8aa50465297df3a1b0d597ce76e.npy +04530566-6974280e14023bd6bf984c00fef39915.npy +03001627-4e37b83cc4f762a5f51f77a6d7299806.npy +03001627-1f83e49ecdf209ddd7f81f50826c13f0.npy +03001627-e5d6c3d62f96e28db3d655d5fe021844.npy +02828884-702cebffa33a19f019f079d1b712f46f.npy +02828884-e7bb6ef568db1c986dfe473551340375.npy +04379243-bc644d8f492e3c25febad4f49b26ec52.npy +04379243-ea5f45fc61e1e26bf994e2a430ba61bf.npy +04379243-6fb0076db4a74b73cde18cb90697712d.npy +03001627-9c9f007599018973f51fa0238791f5dc.npy +03691459-afcd98e6a91b3d16569e2e0d2caa039.npy +04225987-94fc692e0518c0b0537d393009a79347.npy +02958343-1f604bfb8fb95171ac94768c3754c895.npy +02691156-9d230551c65af968b207f792ce9b3f25.npy +04256520-d1a40b075d8aaf62e7c7920f6a65a54d.npy +02958343-e2bdf01abc79a8d054b49557f8ea8b42.npy +02880940-c6be3b333b1f7ec9d42a2a5a47e9ed5.npy +03636649-a0a87d63af355b45615810b8eabca5b3.npy +02924116-6f2a91e27189d62f8bdce51dfacd37e8.npy +04379243-30b176f8b5e7e04ceed0bb714b97ca82.npy +02958343-49997c6f094c0f5e785c95dc3e37946.npy +03046257-3ceaeac7f8a243babd4bf7024dfa167d.npy +04379243-e588e603f5d0e366490ad276cd2af3a4.npy +03797390-b7841572364fd9ce1249ffc39a0c3c0b.npy +04379243-72ac0fd17bbe76375af983a27c524ad0.npy +03001627-313ba5c62a7e746d2974cfd5336a9b09.npy +03001627-1459c329e2123d4fe5b03ab845ae95c.npy +03636649-d0018775e9f2d109fcb8d8c6d4df8143.npy +02992529-43f7d0cb3f0ace029bc144914804a8be.npy +03337140-484a99e5ec7ba9f4b2029d92310f4aeb.npy +04379243-a6b54c79a942cad5a6589c01f678d8ea.npy +03001627-2df8d2af1bc4b9972056b4bd5d870b47.npy +04379243-689fce16d1f9099b9aebadb76803631.npy +02880940-2ffe06ee50ec1420adbe0813683fcfd0.npy +02691156-e0bb0ddf67462f4a8b686f76be476fe0.npy +02691156-7c4e1ab21e8d6549a46ec065c01b381.npy +04379243-e18b448f7e5f6ecc1baf720a45fc5c38.npy +04256520-c529a567cf7e69e2c16bd6fd1b8c7eae.npy +02933112-5556112e5f36cf2755f46d55537192b6.npy +04004475-75dafc4c55f370dd85cac25b72167160.npy +03991062-f6bcfc4694d8841596716aabcb2fff20.npy +04379243-785c03a00ad37ffb8b424343280aeccb.npy +02691156-96430e8f2174428ecbc790a63192d2ab.npy +04256520-c41b7b7d81b7ea5c60a641d065bc7a27.npy +03001627-c447f8e63d691e6f44d8225a445f54eb.npy +02691156-fd41d04f1aabbaea3fddedb0bf24c68a.npy +04379243-b97cbaff986d5db4490ad276cd2af3a4.npy +02958343-354c1c380911fd2f4fa6b747e2cb679.npy +04256520-ab347f12652bda8eab7f9d2da6fc61cf.npy +02747177-cf158e768a6c9c8a17cab8b41d766398.npy +03001627-72da95dd6a486a4d4056b9c3d62d1efd.npy +03046257-e0276227890674bae7169d15a0f0c88c.npy +03325088-1fbbe439f321bc2fb362845c6edb57fc.npy +02958343-d443e86ae023ceeb16abce8cb03e7794.npy +03636649-9936875de81346fafcb8d8c6d4df8143.npy +02691156-dd949574a91719eb7ab25516d117381a.npy +04256520-d6176ad267c3ef92f51f77a6d7299806.npy +04090263-fbee616945eba3a3dde107ed8a50fb4a.npy +03691459-12e055813ed50b7b85d581c11aa2371c.npy +04256520-16f90b5e8d9a36fe35dda488a4bbb1e1.npy +02818832-fa0e6c923694daab5fc6df6674be3b9c.npy +04401088-ff1e484e02e001bdf8a0d9b8943b4050.npy +04530566-67b312f1ecd5e4a9810b5070d24f8934.npy +02808440-babd4a4655d271b8ccd0340812259a39.npy +04090263-7bfdd659a04c412efa9286f039319ff7.npy +03790512-e3de3a51ebcc57f2635b931be375e37.npy +03001627-39b1cdf79b58062dfff16555386d173d.npy +04256520-f36535e1853b9aa5fbb258508605d4da.npy +04379243-535b4f96f57a03b2bea4b6e7618432.npy +02958343-ccac541c0db2044736815730d7fe4119.npy +03797390-bea77759a3e5f9037ae0031c221d81a4.npy +03001627-e89c76bae2ce47bcf4b6538438a0b930.npy +02958343-e3d7833469729b2024da76692f3228e0.npy +04256520-e817922063c3b24ca296c91af58589c8.npy +02992529-e1a4ea72b1f98e92d265c94f4d41d924.npy +02691156-ee30cf94a209a45b91d43bb96e1bb0b1.npy +02691156-6df2cf3685456b4c2e78e1154b9a2647.npy +03691459-bb304ec80f4ba31f8a0181490cb73cbc.npy +03046257-e8d35dc16f04ec9b70012411145e4fe2.npy +02958343-d4cec810b46292ff1f759e96682e340e.npy +02958343-1ebb7511feac4d62381a9e1cee6d0b00.npy +04090263-a8b352220fa53a06a0834a5219dec81f.npy +04256520-e9d6a366a92a61d979c851829c339535.npy +02691156-89a6407ce86efaeee1211756a8e887aa.npy +02691156-34d467fc26232f53f36024ed2c0874a7.npy +03691459-d5c3db96ef6559cbd867c39c06b7c506.npy +04090263-69cc7f3dcec397cd3215e5c5313f5f42.npy +04379243-ea5f31892496ab5457c6852b34adaf61.npy +03636649-e613b3c2006c457ea35a7666f0cfa5bb.npy +03467517-7ee2e600f132bb6f93f0194265a9746c.npy +04379243-26d22dde8b0bf6a345891653421dc140.npy +04530566-10fe40ebace4de15f457958925a36a51.npy +03513137-587ff99119fe5c0efac6099f3d4830fe.npy +02958343-1bb6b1ff46096f592dfac2620a0cf07b.npy +03593526-8c8f6d2b7b2d8dfb60cbb0bb881f838f.npy +02876657-be102516d65bcf23ff59f7e635b49cca.npy +03337140-1201cc45cd7348c94c3aee8e9d3a6ffa.npy +04530566-92e4ae4dfff684832dbef90d406185fa.npy +03624134-faa118fc5de302338ba8cbbd590b1b6b.npy +04256520-9e014bda9022a09095369230ec06c72e.npy +04379243-f9509165955416a79b4cf10910d2df7e.npy +03593526-477932969f473792433f5a7a254e9685.npy +02958343-81655a19f4ce2daa8fd988235de2147e.npy +02691156-71dad8605fbc699623fc69eefd95e6d3.npy +02871439-efcc1769d931a17878f02ba681da30b5.npy +04379243-1460b1e3fb02755e67db1ddda25e199f.npy +03211117-85e99418c109b98e8324c9a156c64d52.npy +03001627-8844e3830bbc5610d5cba62773b8025b.npy +04379243-3a8c86ee236ad156c6542d86974f9497.npy +04379243-e3aa92f57f96a50c4ac1ecd2766586e1.npy +04256520-777aa4f75debc4e8acbda81da5062d85.npy +04379243-1af43a3e8d164168e563c86a0b8645c8.npy +03636649-c7507804ba5ceca79573a52ffe6bb4cc.npy +03001627-5875ca8510373873f51f77a6d7299806.npy +02691156-858c0e466deead2c66cf1b4a8fc3914e.npy +03593526-73d1c7ed4bdb3bfd2f2318fdd66be40a.npy +04225987-488b9ae283b800b282ec895e014b9eb3.npy +02958343-81c52d54f9719736ce27281f3b76d1f5.npy +03642806-1bb2e873cfbef364cef0dab711014aa8.npy +04379243-2c8cb823e48531fa9d1db1d6d9537bce.npy +02871439-6726fdc49931be21d810b14a81e12eca.npy +04379243-6e18de4fa33bc9bcc0639593f50066f.npy +04004475-e12178732037ca9659e0838386a22482.npy +04554684-cbf8ea778b70d1c5ae0f84ab89df135e.npy +03001627-821c88bc79af232bf2acefc3b3178108.npy +03636649-26f2f40fa7fc0c5538b28f94c165f833.npy +04256520-34117792b1a8c180796c584ff1fcf56d.npy +03593526-8c9ffa8ee8f3b497e987f10c30c67205.npy +02691156-7336bffce72ea58b90baeef8ba5b93e5.npy +04256520-d29d2c5a1b35b85b40f0ac0fb9a650d.npy +02691156-f3660119189d3eca4c3a35cee92bb95b.npy +04379243-76635dc55e9783b6c8c2a1a2edf00686.npy +04225987-1e5fd1de723cc66cbb1ed6d4d8526a19.npy +04379243-1a5062241d7903076f88aa1b7f7cc6c6.npy +03991062-7cb2622fdebdb03736b0f2a1430e993a.npy +03790512-40b7a63fd9ede0cf48272812609617e2.npy +02691156-eb7bf553e500b9b544bf3710e93f8cf7.npy +04256520-9504e9be67514fe9c862eec8232fff1e.npy +04530566-deae1ec7a6e340e7c500d4aac3b87ab.npy +04530566-4cb135ddc5d3211c713a67cd30c1e1dc.npy +03593526-311399898943198de59f529cd1b6faa8.npy +02992529-521fa79c95f4d3e26d9f55fbf45cc0c.npy +03691459-5fdb0bb9c3c18d50602d6239bab56abc.npy +04090263-8181c6ea706bff129f433921788191f3.npy +04379243-1455ee780321fd14c3bd24f986301745.npy +03593526-3ce3a0a7adbaaa518e43a810a63361f0.npy +03001627-76d5bec920a9796a5e91295f1f8b2c67.npy +02933112-4e02dea48a1bed6bc59350d819542ec7.npy +03467517-d2cbbe7311f3699cfa3f3bbe4549e789.npy +02992529-2163366f7c3a7a0e6c63b8b48495261a.npy +04090263-c394a39997adf53d319f02af7c25cd6.npy +02933112-217d29a61745991f7aa75dfc74adc93f.npy +02691156-154146362c18b3c447fdda991f503a6b.npy +04530566-123c021333485d698a75485f44bcc744.npy +04256520-f78da0aa23162f3850cf3715818ccfe8.npy +03991062-f4fd4566ce4494b5a2c59a4d90e63212.npy +02691156-90612205109d7458e84aab2e1d454e3c.npy +04379243-3b57aa434803b0ec189c2d5c093a2652.npy +04256520-fabbe9b0db0846a8a823d9fb27aec30.npy +04468005-f6583ccb70cd71aa5ba3252cb57e6f4.npy +03001627-86a94d95c2aadcff1a1584303f0b5ee9.npy +02691156-3713302f0330f960970864f653fa080f.npy +03001627-518c58b170bf5847ff2c92c2a4f65876.npy +03001627-e9043a68f672c1f3a8699b6183baa203.npy +04004475-870a4a67312cde4562b4217d4b905122.npy +03001627-3797290f1dc83a3ab0e5659877cf3f6c.npy +03001627-1eb1a8acd4185f49492d9da2668ec34c.npy +02992529-4a0cd042d7479d6810bc2436075f6a52.npy +04379243-9dd5b7e6f90ee322b56d92c5d7b06038.npy +02691156-bcf7743f0dc85517bc0909d98a1ff2b4.npy +02958343-338eb8e836639e09f8f1f8fdb364ff3c.npy +02992529-fe39a57b8137ecbd5b2233351507f22f.npy +04256520-c55d36457611e7fb826fc8d57346a2e4.npy +04330267-3005a944902cf639fc1390934d948e09.npy +04256520-3e4a24e15c63edb95554764d7c3c0e03.npy +04530566-8b335b0be37debefd85e5191b992b560.npy +03001627-30fe29d73b410c3855efe429bf27a556.npy +03636649-d59202f9d1504c8cc65f1ed6a348c8a9.npy +02691156-d458335c758930c210b8e0008ef5faf6.npy +04379243-679e46c5c67fadd5c3bd24f986301745.npy +03991062-c1923b90d48f2016d86b59aca5792b15.npy +04379243-3441002a52b1cb2946b2a76c074a3f45.npy +04401088-16d7d7be19cde848dbe1e810cdc7471d.npy +02808440-c5a860b9e3a4ef5915aea01a869de65.npy +02992529-e7bb86cd04cfd98758f1d9dcdcb62d55.npy +04401088-fc07770a57d7a87022d3f170937c6a0b.npy +04379243-bd78847e636133c179c8c70bc853d3a7.npy +02933112-d8d2e500860312bf98d5fc0473d00a1c.npy +04401088-cf3f330fb6e3e034449ec657800ab951.npy +04379243-281f296380a0e4a81db7abc68608fde1.npy +04379243-98e8e686225b86aedb7603860ca917fe.npy +04530566-da675d2149827fe56ba3edb0853a984f.npy +04379243-b98dd46e9c1101e2214a15a5a42c49c0.npy +02691156-521916cfab629ce0b6ed9420d56b12a9.npy +04225987-bebaf2c5077b901e92ba7d308c045fd8.npy +03642806-2211a40cc77a085362c091e763f81d3.npy +02924116-791ea9a0664cb42a2f88d2c3eaf53e87.npy +03001627-4fe20ed873d1a80e21d25a6a55757584.npy +03001627-b11c616a19d702cdd7f7a4c4609b0913.npy +02691156-73945c1b294716e1d041917556492646.npy +03691459-e465af1099b63258e17b9e33c097dbff.npy +04468005-6c2c6c7e47c573ac636b52a9d219d297.npy +04460130-a422b6788bb8b2d5663d09b37dd6bd68.npy +04379243-2406cdcd4c60c84132884c4c87a2e061.npy +02933112-94cc8a8df8c78f5e14038d588fd1342f.npy +03001627-48fb419e9273c10a936e8f01c80c6ffe.npy +04379243-8a91b91802db34ea409421506a05b6e1.npy +04379243-49ad167497a2af8c9672e39f89e4622e.npy +03001627-31a3884f500d9fa2025d98fb9de28cb.npy +03325088-70221de88e240b1fb7a867e9b35a1295.npy +03001627-611a76dca411bf089579c5df0e7fa96.npy +03001627-774b94fd956a6601194565c2f3f896dc.npy +02992529-a3f4cae960ac74babc54d4bc75a1a826.npy +02691156-ed7e1a38fe33830b87697d3904b168b.npy +02828884-aad17ac8d5a1ccdfed98cca8f0ccd5f7.npy +02958343-4af44c67c14a477661c6c61410fc904b.npy +03790512-75f2dbb8204c01a4e1720743367d35c4.npy +04379243-4bf64ea69b9e7c85cf004563556ddb36.npy +04379243-9112b638a62b432e3521fe8ac6222005.npy +04379243-c4bfc29898e5a1b490ad276cd2af3a4.npy +02958343-a2a795ad86d1fa12f3aaed7e86215c7b.npy +02924116-d40461c73eef2a7ccbdda2562495e10b.npy +03759954-1d4ac8a8704792cd8e4c2796345a20e9.npy +03642806-20d42e934260b59c53c0c910fd6231ef.npy +02691156-72761d1c2c7e1418d86ebdaa02a63c4b.npy +03691459-e1385ebae6a7869d23a4cda08ffef080.npy +03001627-586b90e4b5e0530935836c728d324152.npy +03636649-75db7c2c9adbf2bfae18328edc91fc39.npy +03001627-d0fa70e45dee680fa45b742ddc5add59.npy +04379243-d1fe23dc2b62082121f2d1de8124ec62.npy +02691156-909548225096784cd5cf6c89d6cfc357.npy +02958343-a81d28a70bb06e18bda733a39f84326d.npy +02958343-5b0710d5e9467e847d80f0c0ccad8837.npy +02933112-d4e6002f0114461df879b7d55192442a.npy +03001627-402e47d9e3f825dcb9d7c2fc41e80228.npy +02691156-b5589ad89ceab860123d1d349cb8cfb9.npy +04379243-628c4fe12881efe2bababe11fcea8796.npy +04379243-a624ebf0bf0451a8d93768e7b9b1eabf.npy +02871439-4e26a2e39e3b6d39961b70a6f96df2a4.npy +02946921-d44cec47dbdead7ca46192d8b30882.npy +02924116-66e9addf909a3414e99562689078395.npy +02818832-41af7173657860b9dff53899485f7c2a.npy +02933112-9dfac0132596ff09b13b0af4c7a59aa0.npy +04379243-bb41a57386b1594c218a519212ed7c98.npy +04090263-1c292bec142b39a5aea3c9294e3d898c.npy +02691156-5608c1b40a0c2fc9c2912ef1a1302821.npy +04379243-ce82dbe1906e605d9b678eaf6920cd86.npy +04256520-cb61e530b7c20409512941e37c7d7dd6.npy +03001627-6895e7aa3c739623927045b355fe1fe3.npy +02843684-7bf5608a4d2c66bac5c86021644af7b5.npy +04379243-2bc4caa1941fed746500462ee46bc39.npy +04256520-48834ca61f0b759583e21877a4e60599.npy +04401088-d41b332b9e6efddaa0eb5a85db887292.npy +02958343-7aff83bed75b6778e5e8ebca62d4509c.npy +04379243-e38b1f4d210fb038c97f93e2910df644.npy +02871439-3e6962cf9ab0ec6d5a7942170a4965f4.npy +04530566-30e45246151fa36a9cccee214bcb0021.npy +02958343-8601cca4ddfd28af18bc22abef3f86ce.npy +03001627-bea7cfa3c0e7e16e63b2acb037dfbcde.npy +02691156-19a624cf1037fc75cda1835f53ae7d53.npy +03001627-7ad6cfc9aa35aa058573c953964a33bf.npy +03001627-226704c72560008421ceb39dc3069834.npy +03325088-b8bdf56796b123cb60cb08c7d22af96a.npy +04256520-46f1ec4173d32c0bf1af69e9778c153f.npy +03001627-d75b618231bf0815492a611633bf8558.npy +04379243-209b2271f9434cb3c242632b2a8c3129.npy +04379243-4fa9bcd45574827d4f0331b81f3e1ef.npy +04379243-48045af90c7959e5738e43095496b061.npy +04256520-b2aaf37365cd30776b9a660069df73df.npy +04379243-49a5c5f524eb73b8391e4d6c585a697a.npy +03261776-de3b9b253e8f1aaf8b15c58b209760b5.npy +03001627-faab798b13ecba08e9f0f0173ae2f184.npy +02828884-411f68beb7d27135d1dcc55e36186e4e.npy +02808440-76ebf4756a43b187753793048d44830e.npy +04379243-aa118e3ed06f00a85c886bf880a258e.npy +03001627-ce463d63d8771c5ccf19858fd1963d10.npy +04256520-7ddd55ed6481457d4211cc92ec35b195.npy +04530566-90c5c6b05a71381cd97a7aaf09adfff5.npy +04379243-2b1c1e0fad3cb3b8fad46760e869d184.npy +04379243-5f726d7fca7ec04131ec2883e34b06d0.npy +04379243-836157300c030c9a246b9f2ca347e8e3.npy +03636649-e4e93d5bfcfac3d72518f0b5d8933d6f.npy +04530566-406e7646609bc8bd8a53c9119bc523d3.npy +03001627-6a01eed3a575987211e48e4bcdc4a2a3.npy +02808440-e696c5d9b42ff5a0fe52ffd0e748a1ab.npy +02958343-825fb860d71c78a477c771b4b7eed82c.npy +03642806-6489453e322cdb53f9f3c6290096f50f.npy +02924116-805d11fea9dc852bfc319b95010c3346.npy +03001627-11d8814ed60b54002449009b96f8a6ed.npy +04530566-3d4b80858a5ae3d694daa4565dd30535.npy +03211117-9de3c0365edd0c0b3e487c876d55197b.npy +03636649-a1d2540e0ca159ec0735e7fd8e163ce.npy +03001627-4f81153b0a3d2fb25f5359f3b8f96a06.npy +04530566-54cf5783ca03b3e015ea3a1685d773da.npy +03325088-c2a09f60c43de534974f28a8ba184023.npy +03001627-9265413a74278fb5e45ef4135c266a12.npy +03467517-8a867571a5ba0e9b3de1a463b8ceba0c.npy +03642806-a59d3d87068d313c2656684d670220c2.npy +03467517-58de2533b7ce80b237058b1eaa7b4b1.npy +02801938-4b520e02e5bfed6ab8183a4a81361b94.npy +02747177-65d2760c534966f2d2b12aa6a0f050b3.npy +03001627-5d7b94584595d7a9118486d21a76684f.npy +03467517-83d6903f31a3e64c14268fe96e3c901b.npy +03636649-c4dc0ac169c91ff29f8c3d2002c77ddb.npy +04468005-79b834190bfcf065bc7069dbf29b2330.npy +04256520-be129d18d202650f6d3e11439c6c22c8.npy +04090263-5b6bf22e5c355592882cef3540bf556.npy +02933112-985eb4a8f9914873738e43095496b061.npy +03001627-89d2cbab56c5a1d7297056ac457c1c31.npy +03624134-4e39d4aff37d8502a0fefbd3658c7966.npy +03001627-ee03232aacadee87d4266d69a5c6f129.npy +02992529-b8a2c7c7df404ab8e7ef9fff09638f8e.npy +02691156-a211208ba6b752b1e75e6a02e772bcee.npy +02691156-51f51906f12681a1dc82b8fee1057b30.npy +03001627-6a20911ef197f358efa66822a012535e.npy +02691156-5a6eb0f2a316f23666cf1b4a8fc3914e.npy +02958343-3363bde33b9abfbf7c5640de9da0cd4.npy +02958343-66baad4c6e4bfa08cfd826dd468a5497.npy +02828884-17ebf60b6ba61ae949e6f7df978f3373.npy +02691156-149702d4e275568c18b14db3b83de9ff.npy +02958343-c4bad2da39f8021b3554e683803baa4c.npy +03261776-32b0b35517ed72e5fc176230c2f2d294.npy +03001627-3f7808c221b01668b4d174e5c61f344.npy +04379243-e4c8211dafa5b903febad4f49b26ec52.npy +04401088-44ce10ddb982c8ff72152988eac576ab.npy +02933112-72048f89b480cd411b17743c18fb63dc.npy +03001627-e7b1407e16d9d644c681404257d94ad9.npy +04256520-7cfbeb2c5af830a26a97150bb2a72733.npy +03337140-682ad244abc1c36991c352d02061b3f7.npy +03467517-e54a1fb20957d39dae8a6b22091f0f0a.npy +04379243-6a5ff41fa5aaadf84c29eddba1f2e390.npy +02933112-72d950ea1c029bf2369c46027bce7af.npy +02691156-9314289f486e58caa8cba409c4409ba9.npy +03467517-c73e40b1c97e24d8a1f251d725bedef2.npy +04379243-88c9c7a40227e935487003545673a337.npy +03001627-c0f18b32a4124eccad9a0199a27b3d8.npy +03001627-4f4b6167ef11ae4e8f8c11a24c52ebb.npy +03513137-7f8767aac7a5bbefef6f32a2a0bd4e8f.npy +03211117-70dacf62da510868a5ff93a193b16554.npy +03001627-63b2f7846c561efc20768660cf080d12.npy +03636649-1c003aabfe3e12976fd90c386180831a.npy +03928116-ef21ff42091957d19df921a933a453c5.npy +02880940-7995c6a5838e12ed447eea2e92abe28f.npy +02992529-d7ed512f7a7daf63772afc88105fa679.npy +04090263-b76f8c041122b2dbf112f20f44aa16b.npy +04530566-28be32d7361adce59e5ca238b1551011.npy +04379243-f09ef9a34df9b34d9420b255bb5956f0.npy +04530566-421db3c87037e7d6c2363c2f18a57bf4.npy +04256520-3ab95ff520d0970b6ae963205db1109f.npy +02691156-9300dc1ca5f16b074f95630cc18536e0.npy +02958343-9b4324a33b1dbad5a7fd25564c2e888e.npy +04090263-afa74746fa10939d153a22537579621f.npy +03211117-45a4d128553abb329bf8498db368caef.npy +02958343-949f6240e1a760992dc53e2d2dfd58d0.npy +02942699-7e677756898b40dc39513d756da531d0.npy +04530566-c74fe97df26a078facae7037c88ca7f5.npy +03001627-a7d124f0c0d9b27479b3e1be3524f72f.npy +03513137-b166d9115ed7b7638e75bb5638d14ce9.npy +03046257-435fcecdc24372a09e4965f0106e00d9.npy +02828884-eacb2a4fc51d03853c7e5bbf72a5f5ae.npy +02958343-b4d258dc5a12f9f7ade7f700b19bcf4a.npy +03211117-7c06bba1afa0553225a454369d791fb0.npy +03211117-15e7231a97ccf7953aeb14563b37e04a.npy +02958343-a7b76ead88d243133ffe0e5069bf1eb5.npy +04090263-fdcaebe1ef2f44406f21883e4b04581e.npy +02691156-560e0890ae86aa7624a25a765a1075c2.npy +03624134-223792d53b9d4d82ef1f81f15fbe736c.npy +04090263-82686f0ea15a7c24783a7c2adc432e76.npy +02992529-36b3329dc0bbd86989704dab2d2a8ab9.npy +02924116-de66b87e4f485c7f1e797b014c500fad.npy +03001627-6ecbaaaebb241ec34b3c42e318f3affc.npy +03642806-76005568c6a76385c8f56abbf37ac61c.npy +04090263-3a8526095bae7e553c79ad8cab094d8.npy +04379243-89c095a52766ecb05d2ac47f638a4ea4.npy +03759954-64af172f468f76a89675998826ae9066.npy +03759954-d9f87094f6a26f8ea2105179d0c9d51e.npy +02801938-615e24df86c59f4536b0f2a1430e993a.npy +02773838-68e4ba38895d820df6fec4b901a12701.npy +04256520-37113588c2d2566b4cf08511890c3458.npy +02958343-bccf69e2dd7de293ab2c2809513f396e.npy +04379243-9d832f72888892e66d907bf61e189d9d.npy +02958343-ea7d39fcc3cf045dfc73a41845471b0e.npy +02843684-ff90921e9631cd73c5c86021644af7b5.npy +04379243-54ec14c2afc2b7e37c5d07ba5fee5aad.npy +03001627-f268849e43f64861cb3a30f2c37c38a6.npy +03207941-f45ee6ab44e4be364f31b34e920051c4.npy +03991062-4765238a39e2a6f8ee5c4d873ab1a054.npy +04530566-1d389060e50915e223676ae79aaa08f7.npy +02880940-8d75c3c065fa3c7055f46d55537192b6.npy +02691156-214d7c0720b860091f21e5fbc0306e3e.npy +02924116-f4ec3e8621e5f7c88317d5418fbadd64.npy +03001627-4a63afd1da7fd633e6c5cd45aa112726.npy +03001627-df8bb7ecc402ede384a05e54516915de.npy +03948459-a3e6dcfc074489fd8ec2966c0323533e.npy +03691459-4d276aacd5e4c510de7da340cde8d034.npy +04379243-2c094e4bfe5958267da1098dc15ca7a2.npy +03211117-de5813ab2771ed36c3c11bfa5a6c7ac9.npy +03001627-951fb0d7ad8ab2bec5b5bea66ef4576d.npy +03001627-bc80b0b638f8a4e61a54bcb8e47577d6.npy +03001627-910bbf8701a4846c2993aa294808121b.npy +03991062-6cccc41151a9578d4b3c42e318f3affc.npy +04256520-159a8e14ee6dde05f7628281ecb18112.npy +03691459-f6958e13ea65bd521b45df3fb820c9cc.npy +04379243-7170910538470c80738e43095496b061.npy +04379243-515460eb527d3439e76bc197b3a3ffc0.npy +03001627-c0e3582a0c8273653c4f66791e25960f.npy +02958343-816f9a529bf7b14817d5c90faf553cc9.npy +04090263-561430988b5af11bd04b05b0f20a897b.npy +04401088-bcc1760ef463671c825b62bd6c28eac.npy +04090263-4327920bfe590d3d262eb9a9badf3c08.npy +02924116-bc65e17577d368674568f0f5b16acc69.npy +02691156-cbf4dc1c144ce656ffa79951b9f955a3.npy +02958343-9eef7b2c492bc1181f4a259ef9bb479d.npy +03938244-84693d928bbec2d18b14db3b83de9ff.npy +03636649-940a5e53f69e193ff42a90fe4baf4591.npy +03001627-d8c6c9fd4919e7f1c8d01774acf97a.npy +02691156-f5a8cae96024e709c1ccec171a275967.npy +03001627-e6a4d6fbdf722dbcc6ec74cc40a0a09a.npy +03636649-368188e7a9b9e1d3c24c2251620b1cc4.npy +03001627-e6b9b5d8b55df575cee7fc32eb84f3e9.npy +04379243-2b34724248743a36a71c812e027f94d9.npy +04379243-bb838e62bfa44f538705931e60ead6a0.npy +04379243-44a525e7793e37c5d340e35bb5304768.npy +02958343-107a17c6f2dd9c488924120dfad0e290.npy +04379243-895d688a910d8ba0bd647f71fcfdcbe2.npy +03046257-8f6b5dfebfdf8e34b3c42e318f3affc.npy +02958343-c6ca5b48d1e5f5ab89442e34f9143192.npy +04090263-6a283eba0e45bc63525c1baee1f19994.npy +03001627-8e5568ec663ae1b7e7526b618f37b43f.npy +02828884-7a8a8c523bcaa364a41bbb5eb703e15.npy +02691156-16b2f62791bd9f003554ccf8c30febe7.npy +02992529-d4407c240737b0c73455cac94a339dea.npy +04379243-1826930f388f5398e0c5923879d79f21.npy +04379243-bfa36cca677c512357f3bb43ed044708.npy +03046257-9a4b06f731898365afb07a946d621b3c.npy +02958343-f378404d31ce9db1afe1d4530f4c6e24.npy +04090263-63c944adedf86b80f8915bea3ae2769f.npy +03001627-d601777b8862bdc8b04cb542e2c50eb4.npy +02958343-530234273d5e31a57c7baeeaa3dedfc.npy +03928116-9de441eb54ec578a5b39a37797d4a0c4.npy +03790512-ef5e9989d2e00fd0d95f95e5406fe921.npy +04256520-9f1de8e71c8a85f23087f84b199fd297.npy +03593526-d447f75ce8f0fcbbd5570174b221bf0f.npy +02958343-52ff21d1ba10add4bda72093f9b5aa73.npy +02691156-6c8275f09052bf66ca8607f540cc62ba.npy +02876657-77a2242bf4ea8f9fc02fe00a7187a6a9.npy +03001627-d97a4a6f84f40854f51fa0238791f5dc.npy +04256520-42265c6cc8d24be09cd3f9e8648111d1.npy +03001627-cb7a4324fdfa690e96dd43aa0ec847c9.npy +04004475-97735b38d3b229d5e8be809ecac11dd.npy +03636649-4d63d3865d635b2be7c7920f6a65a54d.npy +02828884-8d7f97ef9187d6fff4fb4dee5181bee.npy +04090263-9b1d60945756d2bd33f9b4d665d32f82.npy +02747177-ab52671bb9b66e7663996f7debdc929e.npy +02992529-54bb14aad2406a124ce28f0f1b509eda.npy +02808440-6f0f8249e994c288ccd0340812259a39.npy +03001627-d7307a92178e74e055c774cb358c4539.npy +04256520-5328231a28719ed240a92729068b6b39.npy +04379243-5d5fe5537c5496f71f344185981b2096.npy +03001627-6e6ab9da02b8e3bd9bcd01fc6568d728.npy +03636649-918b197d2a157d70fcb8d8c6d4df8143.npy +02691156-2af529843a47df7aba0d990ae229b477.npy +02691156-c27b08dad98f802488a89a28f04ce622.npy +03211117-42c0246643c8ad0a2af8f68791a7d624.npy +03001627-32c1445f65f4ceb23eec26c23f5bc80b.npy +04256520-e49c0df0a42bdbecc4b4c7225ff8487e.npy +03211117-2475d02352162243cba9caf4d254cef0.npy +04379243-f917474a20558aa33bbab77a66bc3671.npy +04256520-819038a4b8db3ed24b3c42e318f3affc.npy +04530566-e2e0d0dbe736e3164947b319a9e09fd.npy +04256520-68a1f95fed336299f51f77a6d7299806.npy +04530566-e02d395707464e692ef42ab47be9662.npy +04256520-c51dc6c9f8db03f51e8fb9cbb32d2cb3.npy +03691459-6fcb50de7df5381835cd53a06b1d2317.npy +02691156-8baeb2c664b0bdf4ca8607f540cc62ba.npy +02992529-1f93dbc9622d83de7a9f0bb7b1eb35a4.npy +02992529-f2158f4f4141e07825a703f74bf22d93.npy +03001627-5d3060a3470d853dfebad4f49b26ec52.npy +04379243-f3efcbd9745da90619fb4103277a6b93.npy +04379243-217430853f56075915dd7d7985e749c1.npy +03593526-49f9a29866f0177bcc4cd6c58bd35c0c.npy +03001627-4dcf1f64f70f22d7b4569422e5e8ba0.npy +03636649-913ba6b6ac6aea3356c82fefb25b338b.npy +04379243-4cb4f4d4bb4771dd1d1d518ba4f78d6c.npy +03636649-9b5d13550ee386e686c0096e326e950a.npy +03001627-38fed916a35dd43d7c8c503b4b873379.npy +02958343-361f3fa1f09d25f07a5533ecb7691f17.npy +02691156-b59a7cab8e95f6eaf3a7414a84b5637.npy +04530566-4a886c242f8d02c8b5d16f91270f7fa2.npy +04256520-1d5675c6d28fcaa0f797b840852566c8.npy +04256520-a4fd0a514cabe8c34fb315ce917a9ec2.npy +02843684-88d4727a4c13ceb5613af97d40709241.npy +04090263-59ff0c5e24abf33f25ff9d2d1e4772c3.npy +02691156-2f988bec20218fa19a6e43b878d5b335.npy +03636649-c54d3a5a9c8a655e46407779dbd69b2d.npy +03211117-5318296d6d07e4e6d40cd81b129905bc.npy +02933112-4ac617dbce5ab494985850bfaa8d58e8.npy +04379243-95bb0549666284168d2b632e2708f79b.npy +03759954-179d23a446719d27592ecd319dfd8c5d.npy +03624134-a55c89bbd589071aee8a029f52654d3d.npy +04530566-614aaafb767bfe62dcf47132cab9d51b.npy +03467517-da8ee6c488a2f4e093f806b1ecaee483.npy +03001627-4019ee7cc7cc5f9e74dc49346c29fd4d.npy +03948459-42358a5cfc9dac388dcf178d0ce30874.npy +03001627-5c86904bdc50a1ca173c8feb9cba831.npy +04379243-6a9c7e9f19cd3583be92df29bb41e437.npy +04256520-26b508c478a9d363f51fa0238791f5dc.npy +03948459-1568357acf75987586ecff2582325794.npy +03642806-62036dabbd9ffa71549c63d8891393c6.npy +03636649-a700451d593a56b45369e32fb818f337.npy +04090263-fd2223d0b93e34dce3bdba9430565083.npy +03211117-2cb149b137f5182ec2c4d83da2705396.npy +02691156-a05347463ea86f1ecc777fcc6b5f19eb.npy +04256520-262833bd44fb0e522535fd8b96de1b55.npy +04530566-4adb08a459076889574b6f4c9eeb8eea.npy +03636649-1e322c9d236ed96d32acbbe2387ce75b.npy +04554684-22c6787bb43651f0f6eb1856550bd229.npy +02691156-fdc1a422b48a16f67341d39902b9e2e1.npy +02828884-7f1f873921ae0c63f155d75bbf62b80.npy +03691459-dbfcda5d40ebc2148bbd829479b32606.npy +04225987-8cea38648128ef1ddc75c30c88b2f7a9.npy +04379243-5bd924058c668abc269aba35b84eb82a.npy +04379243-dd46ae4a6d6cd1154b3c42e318f3affc.npy +02958343-17e146cb10c72fcfa2b80c598d71bf14.npy +02871439-fe571828e5b34d379d0a249a140da12.npy +03636649-b8e25e0825cb5db7765609a3f435fe9d.npy +02933112-4c94892ca2cd066e29a50a2b3c5e5b6.npy +03001627-4e8d4cffee2c4361c612776a678dd571.npy +04468005-34be2cf5c79e6648bb9715d4fc6aab2.npy +03337140-1bca7b1a5b92f44f492d9da2668ec34c.npy +02958343-234902223d35129de74a9a0d75c085be.npy +02933112-78c4b505894342269299936b751bd77b.npy +02924116-7c32b9a627f9f8ba41cefd10ce5d6cc0.npy +04379243-8fc0e4d561b5f551dcc34b96ec9c53d3.npy +03001627-7792861e0bdb95a270a43c2d978e502e.npy +04379243-ce1e09dec6387f715fcce4c360a80a36.npy +03001627-57a20ffcc530b8693b48a711df82173e.npy +02933112-580add3e9e4bd75939a06c149bd5b5b3.npy +02691156-5294c39d2a57bd7e5cad6226edb8e82.npy +02924116-27b7d3f2497848f87f0c75734d52cbf3.npy +02924116-98a557ce95a4e0fab0551d95e7a31051.npy +03337140-34e0bcd04523ae59d477567e8c8a6c59.npy +02691156-bb38d29611ba34572af1006be0f51835.npy +03001627-4a50449de8e26e82eacb498394990f0d.npy +04401088-c4b66fac952d4ef7d9039fb3a1715e96.npy +04090263-7d286b812a03c60e310bbd45bf9024da.npy +03642806-f4c6dec2587420aaf92e5f8fe21ceb0.npy +02876657-25b8ed5b02f07b6cbcfad79fc308fa6d.npy +03001627-c40ea8f03ae6407462e682c9809bff14.npy +03691459-63f06aff0721b648f322c3e7acea58f1.npy +04256520-dd1e9b6cfe8c2ff65ff61a3a2a0e2484.npy +04401088-2274e1f494d6d2c3226bc3b9ce9ff2a1.npy +03001627-25fe34942b619a2eaf7a219828cdb9da.npy +04379243-17e5a64889ca085fa5526f91aecc0c37.npy +02691156-ecbb6df185a7b260760d31bf9510e4b7.npy +04530566-c48ed09355e7ab34275e12937d8e1776.npy +04256520-c8e172e5708b1357545508cb156187cc.npy +02828884-4e3d100672af00842dc02296076d8ee0.npy +03001627-3e08f5809c2abe523ebc93db58e716e.npy +03797390-1038e4eac0e18dcce02ae6d2a21d494a.npy +03001627-9915f9247f671893b89b3e01b90fe955.npy +03001627-337050c0a5a7f965cc5cf3ad66086732.npy +03691459-76007907d4e0ae438c2ccb23eb70d81c.npy +04530566-7e16ed13ded8aba83f59687345e725a.npy +02808440-2ebcb0c668523047b362845c6edb57fc.npy +03001627-a1d217ba806367cbc13a0d88b632af1d.npy +04401088-85841bf9d27c85a26062f54263899d21.npy +03467517-d91b0745e57f6508dc6782957fd2f5d2.npy +02691156-e3dd7fd80f9e53be6ec2a8147a044691.npy +04004475-20af8c248e5719e6aa76432aa0a31cb.npy +02933112-2c1af98d2058a8056588620c25b809f9.npy +03593526-4c2eb778f9b6485480067e3fdc6db24c.npy +04530566-57658278fe1fe0571711b4192259c7f2.npy +04090263-8f70b211673e64c9c97e9355e94c4f15.npy +02924116-8b4bf94aeebbf8a652470de2774d6099.npy +04379243-82130114fee63442f51f77a6d7299806.npy +02828884-f136c5515364f62ed98cca8f0ccd5f7.npy +04379243-fbe97577070afd195c1975633309d43c.npy +02871439-e444eca1d18130c318f52c8a4cfcbe33.npy +02691156-ef0d51f895cee0e04485f82d9fa383bf.npy +03691459-5028625facbf77991a622b6f91cfddf.npy +04379243-fd79c30bf108dced1b17743c18fb63dc.npy +04530566-99ccd811a0e3052634e1b4a71050e6de.npy +04090263-60fdb51a9cc4011289172d41dca064d9.npy +02958343-8db161338795c215b1bb46d2556ba67d.npy +04379243-1bce2f4937d36446a32c566d71fa585c.npy +03691459-1e3da9e2f274b6a89585fee86900e65c.npy +02828884-18f57a3d41117140ed98cca8f0ccd5f7.npy +04256520-baaf2c0d399f7329e4b6769f60f49f2b.npy +02828884-dbd0698df1623b0391da37ff8bdd2524.npy +02876657-6b8b2cb01c376064c8724d5673a063a6.npy +04379243-dad614e8c01b8acd618778e799bced5c.npy +04379243-19e80d699bcbd3168821642e9a54505.npy +03636649-8e34bb5570f790b0796c584ff1fcf56d.npy +02880940-8d457deaf22394da65c5c31ac688ec4.npy +02691156-bb976c45b6812b9254e2b6da60f72ab3.npy +04379243-f726fcaa1d031391b2a0fa0a5d25776d.npy +02958343-be1929020e6bb4c9c2920de4c5efc2ee.npy +02691156-89887eb7413e51a55970a7489fd4b4fc.npy +04090263-16aade23487b928b8084b8c11aeb922b.npy +03636649-397f450de4fc6fd4fcb8d8c6d4df8143.npy +04330267-aad8160404996c1b73c03aee5e8475d4.npy +03467517-1b1c78a14841a4ce3630a3b40acf3144.npy +02992529-6167bf752533508dfd6e968ab91bff17.npy +03467517-5ac1d8b6d9ebb18d48385c672f40e577.npy +02691156-803fd1bf9b85da0aa79201593c1eb4b0.npy +02828884-7a7ca24c50662907bb808757415d8a76.npy +03211117-d475b620ef72756f795284068bb430b2.npy +04530566-5c695e7aa51d16ee557500503415b4e6.npy +04256520-35ba544cb0a342e529404a50338e24e7.npy +02992529-383a304edf67f757769dec5ec0157054.npy +03001627-6ccd1ba0e0d4408e56c513edc77abd33.npy +03991062-c8efa3566eb1ce9bdbbc9f7db3c7138e.npy +02691156-f258c40371334a4e90b1d6deb98feec6.npy +02958343-30c2364393514c5b1c685cd768514e67.npy +02992529-f77811bd35b9215dfd06b6d6f44d62dc.npy +02808440-bde516127c10ceed3321831d2245cf06.npy +03211117-880cec9f3dff564af81b347089add3de.npy +02691156-6058d6701a0ca4e748e8405d6c51a908.npy +03001627-c2d0bea1edd835b6e874cd29a3bc467c.npy +04225987-90dbe261a4d56dcf1082f2ea630bf69e.npy +04379243-5ec5b95d9c21b05ea9af104529ef47c3.npy +04379243-9458b7fef8e84b819f2349486c570dd4.npy +04401088-a4d81a74a416b88948637414dbe9de8d.npy +03211117-7560f6f70263aeb9f5b8dd4ebdc4068b.npy +02924116-4306dc8fac0e49749f9d6858184e60a0.npy +02924116-f735f0310f9240227037eba625e09a52.npy +03325088-804b09dad62f32653321831d2245cf06.npy +02933112-b56d8e21ac71f5d184296c7704cc40e8.npy +04379243-5c466b385c17f36dda6f252b9392c507.npy +03691459-bc3e89ef012a5904688bf677a786d0bc.npy +04379243-1581d2682187764730bbd4cddd04c77b.npy +04090263-8ac5aa7414e3c30030dd2b88f7efae34.npy +02933112-14e612a7cd0311905b539ad6c08a7283.npy +03797390-214dbcace712e49de195a69ef7c885a4.npy +04256520-e09afc136efcabd0dbb841c441320b8a.npy +04256520-b526808fe0903b4484e132150e6e3ece.npy +03001627-57406cae1c2978b40c306db1f141b05.npy +04379243-f0cee441d88de6dafebad4f49b26ec52.npy +03636649-f0b19b0258e8f551d5cb6d178687b980.npy +04090263-8fb14c7aad8e829bc6e84bc30e573cd.npy +04379243-b29e6b183014b61e49426bcf3088611e.npy +04379243-c9a3680859a722a0858699aaad4acee4.npy +04379243-dd363031a195991631b72d9d4e0e505a.npy +03001627-4fd654bdc7fa4658b0957d845ac33749.npy +04379243-424f30af1472fec6668ae11a7db5e82a.npy +02958343-856c62efeff8401567f6fefc01cc7126.npy +03001627-5a85b2ef58145949213c3458a0fe5598.npy +02691156-4d223d7a0e8162cabd46d022fd7d80aa.npy +03001627-98dc530eeece9f0ac3d18d4b522a4e80.npy +02691156-5739574537212a72b3f2b01de37c0b29.npy +02958343-3c6d7c6ce950917b3a93df79ef2b80ef.npy +02691156-7c76d7d8ecfca9c2b1bb46d2556ba67d.npy +03636649-75c15dd98de4ff17bd4bf7024dfa167d.npy +04256520-b797650c894719b99fd71c29e8052396.npy +03001627-23e726da58f115f69b9f2eb77f5e247e.npy +03467517-36dee516ac98dcadb6781382c9d625f6.npy +04090263-72405e2f1e4ad22027a9eb2a0bf0d0a9.npy +02691156-a516f9a6947bd0d639cb1b92881e8e76.npy +02958343-3c059c7851eafc192a9eb0f146e94477.npy +04379243-9200682ed0382e3f931e98da3a93e73e.npy +02828884-b2394480df328a98ad5067eac75a07f7.npy +03636649-7092dd68172560f410edd100dffd8d85.npy +02933112-727a4dbadbb74c33bf1b16662b6673df.npy +02933112-391d1f98ffc6f8cf4da5feafe6f1c8fc.npy +03642806-d2d90e352b2d0533ab0b172d4dea80cd.npy +02933112-12cb11dbb135ca9ac59350d819542ec7.npy +02880940-7c43116dbe35797aea5000d9d3be7992.npy +04460130-99316252e1dfbde1d810b14a81e12eca.npy +03636649-41c5a45c63f07f46c1c74fb098c415cf.npy +04090263-31da90b91370ff74f30ef438bb75825.npy +04401088-d8ee6baa8b57a89add62317fcd30f203.npy +04379243-d14752f7aa2f7ed5d684faddec3c0090.npy +03948459-2d573d37cce5b48b9f433921788191f3.npy +04225987-ac5b849680f5e3791bb7158ebaf7e1c8.npy +03001627-d334e5ab55188d62680876614ed35a7f.npy +03636649-de26f9660d34449f6838f5d4fcdeb579.npy +02828884-1f1f0cb43e65903d1d06bff8f83d7c23.npy +02747177-91a4d060d380409c2056b4bd5d870b47.npy +03642806-2d45f63c9ab71376a1b657e38449a62.npy +04379243-baaa6943a8adda4173705bc397297991.npy +03207941-785d6d568e0c7ea5575f4e5007488531.npy +02958343-d306a61faada97eda43f80a4a74d521b.npy +02691156-b41f477cd3c6843094b9c9a92aa36f8c.npy +04379243-4e9394f9f64859aef4ef86403cccc399.npy +04090263-22d2782aa73ea40960abd8a115f9899.npy +04530566-845426b7dd1b0e55a9142e7277ee08f1.npy +03211117-2963a8a608ba6833b6709846a0e82dc3.npy +03691459-90e3a0488b8ff079d207241113bee327.npy +04379243-6d6123585f79a8a54fa2fb9adc6e6779.npy +02871439-51f7a721c24712f35ce62bce310fcd30.npy +04256520-3ea6bec3578d7a0a24e449d22891bdba.npy +04225987-26cd3bfcef1e254f82b02baba7166175.npy +02691156-902b39a955eeb2bf35569910818956dd.npy +03642806-6170c9238fb2b5da2786f83874f709b7.npy +02924116-b19331d0683fe1ca402dc8d46be324b6.npy +02933112-b0709afab8a3d9ce7e65d4ecde1c77ce.npy +04256520-7104877ee2b4f68516cfe1233e767967.npy +03001627-8a9d8dad6800d55ff37af16b2893f1d4.npy +04090263-7083c94366b7c405330ab9259a8b176.npy +02871439-b079feff448e925546c4f23965b7dd40.npy +03948459-af9eaed1d9574387ab2c2809513f396e.npy +02924116-2de2984722a5bb59563e41b6f7313ed7.npy +04530566-d6ad84cfb652f5dd27ac692756be9e24.npy +04256520-96425edfd54c925457bd9a2a12d86bbc.npy +03001627-6b10b9f8b8f38cfadebf8d14d5516c20.npy +03467517-1300e8bafb819c8e1887f40a4f62df44.npy +04530566-70af463b4a51f0819330265a9fff38de.npy +02958343-6d03ff05596201e6d8df13fb69e08d76.npy +04256520-89155c23787c151219fb4103277a6b93.npy +04379243-aeb33188a1d1f0aaeb1b6e7f54488efd.npy +02958343-6e0e38fa4613df14af3abff6cd36a38e.npy +04401088-ec549f2ce1fd9acb634c1ac38a055513.npy +04379243-a4bea095f35a74d0e6c5cd45aa112726.npy +03593526-48eaa8465573a112bba080e9e0b1ed91.npy +02992529-e4a0f08d8a6d487ac9de9dbf8ea0d889.npy +03001627-dc182335876fbebbe6fe3612af521500.npy +03513137-176bb6178d49f5ace01c07526cf2aa4.npy +03211117-1fa9b1a775b6fd32d8d030206053b340.npy +04256520-b9a1600948000fbbba50f3b3c1c84054.npy +04530566-968848dda6faa772a9c79146773bd1b6.npy +02933112-170be0087472182bc59350d819542ec7.npy +03691459-91bab54d8d14100161d3e32ec60a98b7.npy +04256520-f17b64b1f764ba323bddec837aa40d6.npy +02958343-86d9b82220d7ba342e56818be5fde856.npy +04379243-c8e516785cbaa85259f8e31ca87c470e.npy +04379243-35e821cabad939df664b3b9b23ddfcbc.npy +03001627-96b4422833f806cecb092644051ec279.npy +03001627-e3adf2e6b3c3b015b63c025d1a57d1e5.npy +04379243-7625201ed0ef311eb65b71636c46ae49.npy +03691459-2e44c37aaae8052e587dcec4a739e277.npy +03467517-78a75ce8dc8dc197dc2b574e941c815b.npy +02958343-e914040a57618eb6d3e11439c6c22c8.npy +02691156-167250e2014c72dbb87697d3904b168b.npy +02958343-5ac9d85db6c0d396249cfd7cdcfe814e.npy +03790512-b1ad4777e9a8ad4e6e90540cf031a0dd.npy +02992529-4e2f684b3cebdbc344f470fdd42caac6.npy +02828884-3a93bccaa0b3161afca6ee915b120ce0.npy +04379243-9da02326599123989bb37ee549c6e937.npy +02933112-d7fe9a6bf2c5ad924c62bee40dcdc539.npy +04379243-40addb4af618318dad5067eac75a07f7.npy +04256520-99479cff448798a358db0ef36af1d3c5.npy +03624134-c50af8af50613e822bf26da672b84220.npy +04379243-2a901fa05ae444eff4b6538438a0b930.npy +02691156-9a5d4e2d21506f11c503a3776fc280fe.npy +02958343-1f37a6fbdf7c807e7d439639178556bc.npy +02933112-6059f5f009c40b814702663c3b3faf8f.npy +02691156-b46244d196a7f66635ae67400a94a6fe.npy +03636649-9f47c287c921e4b429eb9d04ea723179.npy +02933112-917de5653765673f8c2611a5a36e83b4.npy +02958343-28151fb21f5a3c94887b6e2409779132.npy +02933112-d917ca3f60dce05aaf31a22c7bed177d.npy +04256520-4fc8fd0b2951d0a0b035d20a1a3ca345.npy +03001627-c8cb59cef2f091e78a44b4d4aac56cc.npy +04379243-1908f2afe36335ebd97122acd7517380.npy +04379243-6402177ad47a8a9514d771bf63ae2f60.npy +04530566-2a492069b6009dec37363131ac7e8139.npy +04256520-a3d8fb85de7cf56fb2d2900ee0ae7e0.npy +03636649-f15294a164747178851f4ba6aaedaaa8.npy +03337140-a102f4ce970e4389126d9e54867801ff.npy +03636649-e30444ae7a929b6687d4034dde63c4f7.npy +03001627-1c685bc2a93f87a2504721639e19f609.npy +04256520-e12cf322cdec8ceb63860d683ccd0da.npy +03001627-34d3960d35d8d5219b9f2eb77f5e247e.npy +02691156-abc465975af79827dfb86dddee1d6ac3.npy +04074963-4e73215ae0f33d23a5e3ac6ff4952f3.npy +02691156-52747021197c7eeeb1a0518c224975f.npy +04379243-47ba08a0f617efc7a71c812e027f94d9.npy +03593526-1fc8104630b00416c151419181ef256.npy +02818832-9725ec5429b19ba05ac28d2931a0cac6.npy +03001627-8d0c04c99429ba8919fb4103277a6b93.npy +03046257-b7b62ffd6555121df546596ce7364503.npy +02691156-7c96e824c287f684651713cd1e90c5f4.npy +03207941-c9e020b0a288dde22404817055fb55cc.npy +03046257-fed6d8a816207b71af7c7ad2549a1b15.npy +03761084-506ce52bbfc7adecdb94e9396a25f7f1.npy +04379243-98bc840471b4fd568e6da51641e48238.npy +03001627-2cbbe7f1f1f75e34d28b52ade6c7e48.npy +04090263-86d90ec4c1e8437dfdf24ee0428a2075.npy +03001627-9d9b5f5b3fd41136244d7c2690850fc2.npy +04379243-50ea883b804766c458a565d8b69ccaf.npy +03797390-9d8c711750a73b06ad1d789f3b2120d0.npy +02691156-6f473d567942897b9908db9f2ff495fe.npy +03797390-ea127b5b9ba0696967699ff4ba91a25.npy +04379243-54dc32618be1ff18b3c0ea2ca7165b1c.npy +04379243-d89d8aff18d0f4fa6262f7bca314d953.npy +03642806-125c93cbc6544bd1f9f50a550b8c1cce.npy +03636649-71c9e25ec4fe08cbf7454c09d6230a4d.npy +02828884-146fb2790c11c7f1aaf6c17538652a1d.npy +02958343-b6749c2b917d4aad949b12cf3977a48b.npy +02828884-db4f8c9f1c62e421efca4f7cb98e0c29.npy +02871439-b60b0839b5cf71d997000b44d733da.npy +04256520-402ccbc3f5f26c095f8ca2b92d19277.npy +02958343-73a58e58e26e7e20e55e3ad998a1ecb4.npy +03001627-cbee0f33a45bc8231adfc48ece0d7031.npy +02958343-28bdade3806ef2f328044fe9244db50a.npy +04379243-25f69a74efbff4d071a782a4379556c7.npy +02992529-73d6b5dfb0f2bd8f5c351e299b24e355.npy +04256520-4f2c9a0709eb8cb9202316dd49948ea2.npy +04530566-3948782a95f084b92336765b86c93d9.npy +04256520-349402b08cc7e5e9492d9da2668ec34c.npy +04379243-fbdd516e90ad48902872e9c941f7c819.npy +02992529-ffe8cc1d33f3fb83d954b120b2d50f0f.npy +02691156-e523ba4e79a48d31bd46d022fd7d80aa.npy +04379243-c266a3883e001404721f5f36cb42501.npy +02992529-56a32f9e4785d3928a4adbc089030705.npy +04379243-f7e0e36f618039dff39d7554d3e63ae4.npy +03001627-7c68894c83afb0118e8dcbd53cc631ab.npy +04256520-225661a6dcd77e7dbd05ef637b36b199.npy +04256520-518cf789a696965b5e723252788c3d6e.npy +04401088-fa1088998ad523edf85a324c5324329e.npy +02958343-609f09c6ce74d6c44c06afea25f8c085.npy +02933112-1c87c14a44982206df3a1b0d597ce76e.npy +03642806-eda651202abbb90c94daa4565dd30535.npy +03948459-eff3abfc08348cf4be0132953bc535f3.npy +03001627-507a5070cde81fd867936ca58e67cec6.npy +04379243-9af7a071bbd432baa5526f91aecc0c37.npy +03642806-dc264eab83ca12b3da4c0d8596dff972.npy +04530566-5ae9838a4646c0551780f6e6561db9c8.npy +03085013-4a14f442ed519225a17d66eaa6c79db4.npy +03046257-b13143d5f71e38d24738aee9841818fe.npy +03085013-3714f64af44a135f6d3e11439c6c22c8.npy +03001627-5b3fd3199d1bc950c1ae25a29e9d46d3.npy +03636649-4fe9a79b382d30fb1735ea0e092a805a.npy +03636649-d779977c2417752b815c6de5374a8dd2.npy +02992529-b7049148a4ffa22fdfe197f9f37aa72d.npy +02691156-468e504d8c28d8c9b8b8dbe00be04f1d.npy +02691156-9695d544e326baeaebc75cd68927f0b5.npy +04379243-a45a7ba9a2842a55634c21965ee6bab.npy +03001627-c48014610839bde3b8e687cbf40e9e47.npy +03710193-98d4f56a842a777b28610e22176f685f.npy +04379243-b69d9e876e7a80a29f2349486c570dd4.npy +02958343-7d4fd8ed77355364fa98472c1d231070.npy +02958343-21fcf7b6cfcd2c7933d7c9e122eec9b6.npy +04379243-ece1e39b8c5f851b9eea323f522c6486.npy +04530566-d617c5194daf4f7298a97ddfb532e08c.npy +04090263-9a4c69fb30dd08bb5bfb24d81b25af8.npy +04379243-3fc6396e6a1270bdbca69f936e89647.npy +03001627-3a0e5dbb68e58cf543fad16a067ce812.npy +03593526-4cd37983220c5949946c2e1ea428382a.npy +04468005-31227f3fc286c00714c06184923f6962.npy +03211117-a17e2808f0176f87f1f3662486c882e5.npy +02958343-4822076e48b366371f0d59cde6139796.npy +04530566-b5b320871c5dd884a24134966691a2dc.npy +02933112-285864fbee3a4038178e7d331e641179.npy +02958343-7b8bcc3cafd34efa8b7227eb0fb9adaf.npy +04379243-4d81894947d08922beedb4c8fd29e2d1.npy +02924116-b01f3b4d7d18588b219d4a071eee0cb9.npy +04379243-b738d1a4caaf4dcb9cd431573238602d.npy +02691156-bf77987a13fc34b5b6c7da997b0e5e3.npy +02691156-de543fb92592aa48236a74f773a58aa.npy +04379243-7ce1b7444c3ba89e74f1cdda9579594c.npy +04530566-377ea2491f8db13c4808655181d482fb.npy +03593526-c42115bcac36e3569f8c3d2002c77ddb.npy +02946921-dc815e056c71e2ed7c8ed5da8582ce91.npy +03467517-b54b9a0eb5be15dd57700c05b1862d8.npy +02876657-158634b1d7d010eeebe67d9b32c3ddf8.npy +03001627-97a87f40f5eb6f04af7c7ad2549a1b15.npy +02843684-75bf6f6a98aea049ba5342d638d0c267.npy +03001627-85b16941984902f8facfa12c7d71c89f.npy +03636649-e44408513c20d08f37aef4415914e1d0.npy +04530566-dde0cd836238f7946cde899c8674e2a8.npy +02828884-3a60057b27f90ed64910664c4d1311f4.npy +04460130-6372299ee506123b52f2aeb043ecdce8.npy +02924116-2acae4f14a734f4972cf25af66dc82ce.npy +04401088-2874447c7552c6b942f892024869e751.npy +04379243-302ba9e290485f9c310cd758d9b7cf.npy +04090263-58d4a585abe57ff59a4b8c8271f09050.npy +03001627-57b4898f5b94a5a89d297e74104d3ac3.npy +04379243-bc7d143f0c666d816f80e82f51b5db7.npy +02691156-57575cb42132554af64801ad2940cdd5.npy +02933112-46629a0cff77972aa47e6c0a5f3e8240.npy +03642806-a4d779cf204ff052894c6619653a3264.npy +02924116-1584a923c35a42628dae4ffb029d1905.npy +03001627-64ef0e07129b6bc4c3bd24f986301745.npy +03046257-8b52d84dc97eb3a74740473002adcaee.npy +03325088-3a32f3b62d76fbd8b362845c6edb57fc.npy +02828884-bd88f333baa6cdc723d95f4309ade30.npy +04530566-ef666f3eb17ea5cbd56c7296613ec69d.npy +02958343-788612c1f9b2efccb1bb46d2556ba67d.npy +03991062-e0f429ea9201e20ed523ef2d2597224a.npy +02958343-72f56235cf1e18cf1ccbd9e5bb82dd04.npy +03948459-18a19c9d7ecf8ba9437e0b38fdbab2a8.npy +03211117-29aaace957daebc982c69f261576200a.npy +03691459-79c0d4ba54cb08ccec29f84f96a7e29f.npy +02933112-14ef9da3809148601b17743c18fb63dc.npy +03001627-582c67ae4d746d121b356ab8b24c147.npy +04256520-e55e87415f0c23baa1845d2858b500eb.npy +03513137-be9812128882a7957e167bb4cf1b28cc.npy +02933112-d15097b4c6fdd9001b6eef8565b06678.npy +03790512-8020984fc6e83ac1331b5e6778e27aa.npy +02958343-a9ae1558ff25e5336436916a86a90ed7.npy +04379243-19678fdb9bc926505e4b35ff1ea95f37.npy +03467517-451678b1ddcaf9e6d26aa1b9cb124738.npy +03636649-7ad15667f654fc08664b3b9b23ddfcbc.npy +03636649-348d6ddf9e02cbddf647dc544bb0ab61.npy +04379243-92499724962a368d53743fbb4759270c.npy +03001627-37d7029722aa0d91904cae5fc41c2d5e.npy +03337140-5738ddc421b5bb0291c352d02061b3f7.npy +04460130-5b0dc77df3bd924c25ed5c2b422915db.npy +02808440-b08727e640554b493321831d2245cf06.npy +04090263-7c6a21d8b91fd12a1b7837f7a64e3031.npy +04379243-52997bb331942b64f84b0be7f50940eb.npy +03593526-470392ec218fb13d63d977b06bbd429d.npy +02691156-db567b8afbaaa95060a762246a709d46.npy +04379243-980b85a3109e66562bbf333b6ea7b79f.npy +02828884-8d28e56cf5d2bfc8c3deaacdfa0e1e8e.npy +04379243-747f70e41b927e13b73481345ae9d2cd.npy +02691156-84615b34a2c8a2868699933784576e73.npy +02958343-e2ea542d46c76a002a025f627835d975.npy +04530566-4ee0ed0c56540273a6dae8586082d789.npy +04379243-a1da0c1db8220563b6b0dd2a0b939a74.npy +04379243-88ffa9b795f527b1969b9778c8fec586.npy +03624134-331bf2eb28033c1d1138511a51ff0534.npy +03325088-81a70dd1b34af19d92f46099482aad38.npy +02992529-b02d8e0fb3ec903b4a952171144f2812.npy +02958343-ae852f7f30bfdbcdf9d73bbb584eaa42.npy +03467517-ed978355ce673ab01009233434be6ec0.npy +02691156-f46df635ac669a9818b14db3b83de9ff.npy +03211117-f06cab8286ad4f7cecb44abbf263be08.npy +02828884-72d098aad341ae4c436455e65b78c0e3.npy +04379243-1033f41fd2decfa938da3ea2c9e0e4f.npy +02958343-1f43243b81df21277925d1ea63246010.npy +02691156-d1d308692cb4b6059a6e43b878d5b335.npy +03001627-55c9891ac274e076492d9da2668ec34c.npy +04090263-4fbeedb2f1f43293b95520b5e9aadee8.npy +04256520-64dc2fa7007421f9cf46315936cd9301.npy +04530566-d651a1f3e02593772b23aad8ba1ba03a.npy +03001627-8617fc907ff8cb36597976c675750537.npy +04401088-b1d1d6a5f46a30894884e1105772427c.npy +04256520-8173fe7964a2a06319fb4103277a6b93.npy +02828884-50cdaa9e33fc853ecb2a965e75be701c.npy +04379243-31f47d0373170683f6c84947abf8f003.npy +03001627-8b552c23c064b96179368d1198f406e7.npy +03624134-e43c5d6241344913c40c6b891c4913bd.npy +02958343-94b3689f899c8cfbd575863af568c85.npy +02691156-4782920ddfdeef4ef6bd63e31c40dc1.npy +04379243-224ccf4c3cfd4cc1b9a0f5d18f1ce54c.npy +02808440-56a19ee862125b28cf8c584ddfde6324.npy +02808440-af7fedb716fa3b119b5b1575bf5ce108.npy +04530566-88ea6d51dcf2cdee3a6f102e22936e2c.npy +02691156-e53547a01129eef87eda1e12bd28fb7.npy +04256520-44d172b5cd523df141b965cb8ba50814.npy +04530566-a08180869abc48b75b0cd10627918af8.npy +04379243-24181beca16bb46bf9931f8a466b18bd.npy +03211117-3a9dfefa52a6d2643ed8be9ed4b2b6c8.npy +03211117-adaceffcf1d89f9552b499dc8d840804.npy +04379243-8700e5f711dd180bef207763b5f4c54e.npy +02933112-6f56fdbf225247abcd8f3fe9ca2145e1.npy +04530566-25159673c007368b8b44023403d275d4.npy +02828884-43cae409bde302d4c88fd5e1f2929cbf.npy +02691156-5a12bc3a78c510cb366a5992755f2322.npy +03928116-e3be0badd5278d1825e1cdfd03ba4126.npy +03046257-191812cf4abfd6166e71174964d90e49.npy +04379243-1cd6a00b71f02b06430c2c15987e4cd.npy +03001627-113016635d554d5171fb733891076ecf.npy +03211117-6c8f7736660f2e97e441f5bb6f88ca61.npy +04379243-2cee786a3480113a2241dba92389a637.npy +04460130-48a1e31e57862a63ff679899febcb0d4.npy +04379243-e4089e22c991e2dcfd277d65d018c82e.npy +04530566-750f5d76abca0a05bdb69bbe5cb6055.npy +02924116-1c6d79edc1ce02b8ea89a7009dca2424.npy +02691156-cc14512d5fe6e8489a6e43b878d5b335.npy +03991062-6f96ea1f948bdb5a72652f4081ec5a77.npy +04379243-31b972951e7a8ed323fe3501bb9e7193.npy +04074963-6f6ed9e0d29b64e714be24585075d395.npy +03001627-c91eb95b40e4b6f8e83221ad0d21775.npy +02933112-48ad79b48a76fcec4da5feafe6f1c8fc.npy +03710193-133dec6c00923805f423417965ceb17c.npy +02992529-da24f27173874672ed7485a1aa598365.npy +02691156-1abe9524d3d38a54f49a51dc77a0dd59.npy +03001627-b3fd987b330d0d2acda56795a6fbde1f.npy +02828884-c6ccf94d3e512ad510b3ff08c68acccf.npy +03001627-7f6bcacd96d3b89ef8331f5a5b032c12.npy +02871439-7c93c71c1ca57d5c9c71f681ea4c5bae.npy +02958343-f7da98a59900ab60becf71e2e014ff6f.npy +02992529-bcc1760ef463671c825b62bd6c28eac.npy +02958343-b17929063c2b3d9a52aa494042b7c9db.npy +04256520-e4e660790950c277cb1362eb0fa793e9.npy +03001627-c9d8573a048c0e959c0ca344f487323e.npy +03207941-4e9832bbbb077f9c5c5adfeaec1397f.npy +02933112-891e56eed3fe1debeca22c501ad0a77a.npy +04530566-71d6ab6979e5a313dde8c025d72da437.npy +03001627-7e66472eb05cca212e77b4bab2489170.npy +02691156-862d685006637dfef630324ef3baae90.npy +03001627-605ebc9107c71d54d8f5adb469ca89d3.npy +03211117-bb6392ddfeb98b19822cf0bd2945d4dd.npy +04379243-2bf3e370da5d2f73ed403132b02528bd.npy +02691156-4e3e46fa987d0892a185a70f269c2a41.npy +04379243-f907cd8cfb723ee6d6eba0d14df5347e.npy +03636649-33e210ccfa79a0ed581fd19c35a5c8c.npy +03001627-e3479f55f5894bb3c7f1f7c0570e288d.npy +02828884-bbb448ee06bd6d83d838ae16242881dc.npy +02747177-93d5f21e94ac5fb68a606c63493ddb7c.npy +03636649-2848ad36017ecc69b4169e4cad9bb63a.npy +03636649-27b2a1bb96fbd760316fa82a71600dfa.npy +02691156-7bbe33ebb5429a0a7a9e881131950954.npy +02958343-94edffd805dc965ca5626f7e1b38f05f.npy +02747177-8675c75413c9938dccf149c7b4065e.npy +02924116-647c7b4faa7473aa54d963fd62c89fef.npy +02933112-4d79731efe402b0d635469b95109803c.npy +03636649-e98c05f4cc8c7afcf648915c85184f8c.npy +04379243-40ae20513a1ddcdcf6cabe1df6f4c9d9.npy +02933112-d8bf8dcbd5cae04094beb1f48b8b494b.npy +03797390-345d3e7252156db8d44ee24d6b5498e1.npy +02808440-19a77323e724b7c43321831d2245cf06.npy +04379243-bda51fed12335c5e999b33727fe6db14.npy +03001627-c5beb566f512bc8d9e989ccbad3213ca.npy +03636649-5b4856005da0ab61d18826cccc613430.npy +03001627-710441e3719c99e04b3c42e318f3affc.npy +03001627-24082b0254dd180c490ad276cd2af3a4.npy +04379243-4fc0bc3fb6438dffab1d1edf764243e3.npy +02691156-31d5be3944350915efde2c2b27dc1843.npy +02691156-bdcc8077771968d67c54439d6177032.npy +04099429-3f3232433c2598e779169036b64ab0d9.npy +04401088-8caf79a2bf3be9fabfbac23a8087e8f4.npy +04379243-c728329a22124fa7e8dd400ae08fade4.npy +03691459-7ec487384a050ccb82d710142ac471e3.npy +04379243-aa219609a504b01047c527f581cb7384.npy +02924116-45ce077a3cb5c211690493afe1d3a073.npy +03642806-7c1eb7cc7dbdb68268981420d1da6237.npy +04256520-fce717669ca521884e1a9fae5403e01f.npy +04379243-b909b35804e9751daece045e8bdac80f.npy +02958343-f1f78226ed08465f801b0db1d49ea10c.npy +02691156-ff554f038a338ef322031be9b666aa96.npy +03642806-f72dc1ffeae0168aadcfd37206a0d18b.npy +03467517-b48531b4e111f30d8388889c8d3c7bea.npy +03691459-cc6ebcef8d2e674690146e2a0489a257.npy +03001627-941720989a7af0248b500dd30d6dfd0.npy +04379243-90c19c729cabdb864b8710a3469971b1.npy +04379243-90992c45f7b2ee7d71a48b5339c6e0da.npy +02808440-63e2922c33f79afaec72042a273c8bd8.npy +04379243-6afd8ac8c1a2e31cd42ec7e303174a87.npy +04530566-aa6a256cce6f8248b1bb46d2556ba67d.npy +03001627-74c97be038139e9792d9ebeee84a8909.npy +04090263-ed1647e209a3f661e1f2a1daf140ac9f.npy +04256520-ef6ec9f481a67015ee3907b60a74e8f8.npy +04460130-6b78705cd18a7b7767b959cddc3d22e.npy +03761084-48eecde6f71bc1a2f99d92708f91e592.npy +02828884-7e2433a3cd020f53588060c928db75ed.npy +04090263-700b82751c12e8ea3745d03a006445d.npy +03211117-609dffc42c3507212492d8a3aa63f4f5.npy +04530566-5bcfb42ffc3490c4af802a9d0ab09410.npy +03467517-8f1f54d337bf6ccac782e6226a4f593e.npy +02958343-2e1178d969bdb3849ea5c205086e2a63.npy +04256520-583ccd71c56aed45f14c803eab703899.npy +03593526-9f62aed6538caca130612f5c0ef21eb8.npy +03325088-49553eee4f0403f850da8b99982a3057.npy +03691459-3c8dd5506a17628fa43ada367b02a4fb.npy +02958343-d98b63a9e35f50b46a835a8530f31f70.npy +04379243-cb242dc225308003de21d22522bdaf.npy +04379243-688bd4df748faa62820018801b237b3d.npy +02992529-407e5ee21fb23fd92ffe71e0e78fe3b7.npy +02933112-c33ab47f610b64e6ccab809eba079ca0.npy +03948459-4bb890182e9f01b26c63b8b48495261a.npy +02933112-b37d269e1ec64992ee71ee29c2167097.npy +02958343-87918f9d328b535befe5f291bc2f5fd0.npy +04530566-c45f67b42b7febf52b249fd16295bbfb.npy +04401088-9911b2ee8470d6dab2098fa3046754f.npy +04401088-fbd120d2c01484d56c95c6d882af3c0.npy +04256520-264d40f99914b97e577df49fb73cc67c.npy +03001627-c5e6c2b4528c371378dd615a59de5f05.npy +04090263-bd23795276854614182f019eac476ad2.npy +03797390-c2e411ed6061a25ef06800d5696e457f.npy +04379243-3eea280aa5da733e95166372d7ac113b.npy +02933112-6e6a324c244158325761a0b53ed37cec.npy +03001627-d75d41af68f4bf7f9af4053b8815b239.npy +02691156-ecb4ae05d7dd135a619550d2af0b6117.npy +04379243-3f4cb895d754dbd3ce47b13319293999.npy +03001627-93556cf01e19f638bf80985a99195eb8.npy +03991062-e74feb8fb03280e639c837a9524b9dac.npy +04256520-18f8fb3fd6222959e8f8c11a24c52ebb.npy +03325088-1e038dfd194d74863321831d2245cf06.npy +04256520-8458d6939967ac1bbc7a6acbd8f058b.npy +03624134-6f01f7579d0ba8238bf4d4792a57629.npy +04401088-cd7e6ab98a2d090099b101e0ce243aa5.npy +02691156-7eef160cf5e4188a5a8c25d312cc3c6a.npy +02691156-47bf091a7c919d1c90b1d6deb98feec6.npy +03211117-7034d396585632ef5450caead37a1c9f.npy +04379243-5292f2930f188e0a7ff6ace05b36a5.npy +04379243-e99a4c2fa99a0038a2aa7d89ba9aea43.npy +04379243-26432bcd60baec3182c17278756c0a5b.npy +03624134-3460fad7c54b8e54801723dfdf7a7a7c.npy +04256520-1512e3c41de7a461e10a48f2bbb9bef4.npy +02828884-275249a603cf7f6df064889421ac8911.npy +03991062-5afc3b1bd57bf6482c2c0fe8f75ba056.npy +02933112-a640e7214f7c5393a5b7c9f0974d595e.npy +03001627-473cbfa40ff731d92e75d78b4c7ea93.npy +04256520-faf387a11f3f944a75dc34583b0239b8.npy +02958343-8b4879617bd256391738f25e3015f92e.npy +04256520-ed1aee9100f58e26b9b072e1f62798f5.npy +04256520-c51e57530257f6e0e0771d4c079a0ec2.npy +02808440-12976a1c355efee1ae51c8fb67762055.npy +03001627-3319a9b24416ecea7ff6ace05b36a5.npy +02958343-599aede2de805313a87928f1d77303e.npy +04379243-b95072f2b12a3274d810b14a81e12eca.npy +02691156-d72a483cf8a0cf2bbbf3143b1cb6076a.npy +02691156-3c0a871ed33a1c6a296ee999ff54cc3b.npy +03001627-4ecb13c40d55bc24fbcb0345af819bcb.npy +02808440-66bf814e881c1c1a51c83dffb1e07a0e.npy +03001627-eee8b6fafd8af9d1ea54e1e7afcaee9.npy +03001627-bce7ff621a5440bb34ee5c94ebdf7f1d.npy +03001627-595b9c165214bdf0b0b1b4239165b394.npy +04256520-42eb9cb2f34c1ac81be5c5f8d4f77343.npy +02691156-e409d714620161c132fa725d7a62a02a.npy +03001627-a07ec767c0a395e53cc720af04c21ce8.npy +02946921-a5bab9546d6a1baa33ff264b2ec3aaa9.npy +04379243-f0d5eefef970fa4b9f2349486c570dd4.npy +03467517-28c3903b29f6b38363e148e250c0340d.npy +02992529-decbc541efe459a742f1242fa6dff2cf.npy +02808440-4033f8440d4b5e83321831d2245cf06.npy +04090263-8036d88d38432a11ff18bc1311316304.npy +04379243-ad0c4c25d7a4d4c296db593b49da23e5.npy +03624134-2d6e9b23e171760c3e332fb3cb6ebe50.npy +04379243-fa7a8f6d4c33a4081f4e3943babe5979.npy +04379243-d7de6b2deca39eb0b20aa91e9e90c311.npy +03636649-a122a15d97594ebcfcb8d8c6d4df8143.npy +02958343-a8ab20351c2e7542912749d867981a40.npy +04530566-4765a72ac8a0eec3993eb1c02818be1e.npy +03636649-78b8718a36910dd32534572dc403ed94.npy +02828884-bdce8b3475f59d38f4fb4dee5181bee.npy +03467517-bb895a87931f51c893f0194265a9746c.npy +03991062-8d2c6ce685eb1fd9368b14e48c164a6e.npy +02958343-b5938ce8c35aac9b46f8ee02bd8f9824.npy +03710193-73cd7f3ea1579431a97f238e46bc2221.npy +03211117-6a9dcf34fdfe8ba82d8b18d11bd45e6.npy +02828884-f5d5f659c9cda6d0ad5067eac75a07f7.npy +04379243-3c514c4f53e3f1ed4b3c42e318f3affc.npy +04379243-49230cfa054929bc718a34fa24049f1e.npy +03467517-4ff4b6305e3d5e2ad57700c05b1862d8.npy +02880940-3f6a6718d729b77bed2eab6efdeec5f8.npy +02871439-de3b28f255111570bc6a557844fbbce9.npy +03046257-a245bbf8367d33ec4b3c42e318f3affc.npy +04379243-bbc685f481cee10f668ae11a7db5e82a.npy +03001627-728fb292d234b43d49a71f577ceadcf5.npy +02933112-2e38fe7e4cd74bec76e9713f57a5fcb6.npy +04530566-ba5723d5cab50a0b7d86b3749977e29.npy +03636649-24c91045ef1c6a91e4407e92c4b0344c.npy +02691156-4e67ea4fbcd0d9a4bfb056e4de687088.npy +04379243-d5f5388411866fcd6f349f21cf5447af.npy +04256520-48a44ed3050ad12dd5b24cafb84903c7.npy +03325088-589cc2df7bf5a6243d7d93e47bfee597.npy +04379243-cdee5ccae3613c507e1dc03b595bd36c.npy +04256520-7e2d4791502378f2593ebeeedbff73b.npy +04401088-27085a2456319497f1cb19f636b1c2bd.npy +02691156-376466b562217c2abc0909d98a1ff2b4.npy +04379243-c1660471a22c98a9c7cdfa94351d0f74.npy +02924116-731b13f29603a7a183c8e6d5420def84.npy +03001627-2cf960825840947aa903b9ef0ae7fb14.npy +02691156-788548a68d7b46ec179febb7e11d3625.npy +02691156-16f81f41ba16edebca8607f540cc62ba.npy +04256520-d8892d8a902616b1669e5c8c05e138e9.npy +03046257-613a7dfb6cd136e3df6cfab91d65bb91.npy +04379243-42bb37f87a9a758ad43fe0060c5249d9.npy +02691156-af69c8020fa9b68366cf1b4a8fc3914e.npy +02933112-7b7067ed1bfcfb62377b9297f3055210.npy +04530566-a8455459a7b93aef9e5629b793f22d35.npy +03337140-2b37f9944a63ba4b4c3aee8e9d3a6ffa.npy +04256520-5b06dcaf32f92e7eb3878cedd8c8fe6c.npy +03636649-7893d0b50a7b6a768ec45924afa4ac91.npy +02933112-68d23effdc37ff8ab59213b4b43189c1.npy +02828884-14688c10826a81933792407aee21900f.npy +04468005-9241faa02acfe08f1b3165b3174f01e4.npy +04379243-6a72d6a26d28b02bd626c689702869b7.npy +02933112-3775c10b5502d12a1190e285a2cbc9c.npy +02933112-3d21c803cfa3bf504c96d44e0e286fe7.npy +03211117-b228f0d5208fd9ac30ae9117a5a20ccf.npy +02880940-cfac22c8ca3339b83ce5cb00b21d9584.npy +04379243-45b839c347e02c86b20aa91e9e90c311.npy +02691156-e533a1a758a1752b187ea8c086d9f2c.npy +03991062-c94497750ff15b998578f0cefc281dbb.npy +04330267-83be70da0f3def9cc1b69d6ad297ed35.npy +03636649-6196ca0c22f9f7271110d567ea61aa61.npy +02691156-fb92c2e96fdf6c37595dc3191c718398.npy +02871439-c214e1d190cb87362a9cd5247487b619.npy +04460130-4059fb45b27d8b1f148a76a78b10eb5d.npy +04379243-4220d2a91737c68019fb4103277a6b93.npy +02958343-c98c68f41fe8747fb376886260eb15c1.npy +03642806-ce13a85fb71694fcb611830890d7aa97.npy +02924116-4ed9d6cc9a4a71d73aa5bf64bbf56692.npy +03211117-6a08ffb169d2929cda4553545dd45630.npy +03636649-7b41e8307e85ab0b87e834be7739917e.npy +02958343-96e164d8347ff4d8d61b6a34f3fd808c.npy +02876657-c553b7e594942f0a4c0bba210aa0d1.npy +02691156-ac0234f2b9f195e3cc1281a5f11b5a5b.npy +02958343-23f31f379d6a5136ce27281f3b76d1f5.npy +02958343-1836f75baa094cd9372ca62e6806c5c3.npy +04379243-4cd119aa7b11f3f54b3c42e318f3affc.npy +02933112-30cf0cedd661880e86d53ab0fe94e911.npy +04090263-469427702fd95c3c6314c3b6a3a65519.npy +02691156-5b815e2726656685823df672991ed66.npy +02958343-c58db3209e58872556f3b9566f5b3b77.npy +03001627-d5439bb962c3cc8579170a5f8beda902.npy +02808440-4d442c72b0083566ede9471c962dd6ba.npy +02691156-896508fa65b8a31c12b38b1d99376c0b.npy +04090263-5f68383c820c1bc4a67ac8a08d7e171.npy +02958343-a944ae569bbff87716abce8cb03e7794.npy +02958343-d4919d3f70b699152b12ea83455b0f44.npy +04379243-78a93c794aa77beb47bc3701b998a7d5.npy +04379243-2f5d2dfc1c8b75666c8f2acb6194d7e9.npy +02691156-4e2322d4f1c0d29df96e777471c18dbe.npy +02958343-2e8a1ae108dd0d89e8a3b392b986583.npy +02876657-edfcffbdd585d00ec41b4a535d52e063.npy +03593526-852c6ad14d32d6272b6168eeac2194de.npy +03001627-ed751e0c20f48b3226fc87e2982c8a2b.npy +03624134-90021da7c71f6bcbf02ee453ff283e26.npy +02691156-94ee700c27e2c05f84fcdb4aed90c145.npy +02747177-69d3b9c9321e3e0bad5067eac75a07f7.npy +03001627-5fe9ae9eb1ece960c423490470c47d79.npy +04401088-42ce5fc532b667bf9f8c6ee75b301991.npy +02691156-525f3ec38c3baa7a4944d3c8bf9547cf.npy +04379243-590128c134fd2fb9c1535160ddca1c61.npy +03001627-9b9a114cfee79bfb492d9da2668ec34c.npy +02924116-ba3a5c4ea765aa6dd01b211d93f47d40.npy +02933112-9dcc7002210e6660824662341ce2b233.npy +04379243-415d7746f792eb1de0445fc6d980dd5c.npy +04330267-cf1a57415ade5703bec56bff764ba78.npy +04256520-25ce64639b8817065510d59f3ab1ed64.npy +03001627-c927b1352027fd6916d8d4903814cf37.npy +02958343-53b6f9eb4337276473f10e6caaeca56.npy +03001627-769f2cb98735158a2334de46509d60b.npy +02958343-c5ef2eaae2b2d8673cd3add5aad1c863.npy +02691156-48c2f17fd1610cddf9b189ce48b45ae1.npy +04256520-c59ef7c56b4d184f9cd431573238602d.npy +04256520-58738b85e8a13c14380e1a7742e001bb.npy +03211117-b95414b9723439a6fd28950562697757.npy +02876657-595e22f425839eac2d4b0854f7611ed6.npy +04379243-fa09f5e809d1c8c983b3f8b7586237f4.npy +04379243-4a9a73e93f19ece06652506d959dc71d.npy +02691156-50e6ab918250ac797a663d343339f8e.npy +02992529-a41e693828a65064e565c13e00bdea3d.npy +02933112-9d2bf81532da5823b69348aaef501740.npy +04379243-9a70b1d07f3027719fb4103277a6b93.npy +04379243-27cd239b41129a13c19a59cdcb309b91.npy +03642806-ef6d92c90aeabf5becae27d182a3e41c.npy +02808440-b768643834bdd3eedc749e0740d903a.npy +03001627-9069ccc5fcf22878564eaedaeaa04f28.npy +03001627-a691eee4545ce2fade94aad0562ac2e.npy +03636649-db759b73923a7e36b9df6a8c2c09592.npy +03001627-c70c1a6a0e795669f51f77a6d7299806.npy +04530566-7d7fe630419cb3e3ff217e1345ac0f8.npy +02958343-35fc22147c160f501636a25380d820df.npy +04379243-6f97636bb2ac5d599856fa70a578baeb.npy +04530566-68d32bb51ab2050efe999a207e6e230e.npy +04256520-fbb78f2c30bfa014703a79ff0df43433.npy +04401088-b207b3f3617db6cb85089a13cc567dbd.npy +03467517-52abaf50a0739bd8cdb542a68600a146.npy +04379243-aa69a26be784dcd2cf004563556ddb36.npy +04379243-3eba5f6a09e87969b76e29c9c43bc7aa.npy +03991062-5bf7954ab8168f24e3849910c5019154.npy +04090263-a66887b692d9326b51cfdb4c9f126c12.npy +02808440-f901b929f8c976793321831d2245cf06.npy +02691156-3b3b2777be8b6b31ca8607f540cc62ba.npy +02843684-cca3e35970a665e56dcb36a8108f189.npy +03001627-5f76562ab6c843cb575f9747ff6fb5e8.npy +02808440-a9d03e90d548a19d412ac8cccf0c180f.npy +03001627-4e50015368a4f3ea4eb6addc0d23d122.npy +03636649-5a502ebda119949ef7dc60c6a4d98c25.npy +02876657-3de5abb596766c5380dd154b5d9c087.npy +02958343-79db6e5fa70b39467df67c910758dfc1.npy +04468005-575289640b8fe387a0c6c5e8898c5f38.npy +03046257-abd4fd596171d33c2d1b942ffb1336a6.npy +02691156-c0f9c28c45e7c8354f95630cc18536e0.npy +02691156-baa3e1edf8870f755f1a3e0b9f8002cd.npy +04468005-e6392c22c70a5735f0f5113376645c58.npy +04379243-707e63122691f0cb490ad276cd2af3a4.npy +03790512-9154fc120f53eaa8d42c4cee3f9bac47.npy +03001627-4a86ad0d870a55e82058afcc28d23393.npy +02818832-415db413b280c69f42d8a8c5af8997e8.npy +02691156-cbacce3a17e061251ab9df4be75138d0.npy +04530566-291e48a99be418846c03c11657c96c60.npy +02691156-8a84a26158da1db7668586dcfb752ad.npy +03797390-2997f21fa426e18a6ab1a25d0e8f3590.npy +02691156-48996e27f430ce286f67a5681eaf4d9f.npy +02691156-c541b8c49b5d2d8e99ad3ba13045dc42.npy +04379243-b420e0461893854bdf6cfab91d65bb91.npy +02933112-9cec9c8b65ec9e4f4c62bee40dcdc539.npy +04379243-d5f55cf498a7562eb000f20a5153622c.npy +03636649-98d9619ca934b01df51f77a6d7299806.npy +02871439-7167cb1a30852249cb08ed38616b96a8.npy +04379243-445528514535ca621d5ccc40b510e4bd.npy +03636649-88153eca8600ecf05b1ab0bf4891d200.npy +02871439-66bc5227baaedf84997000b44d733da.npy +03691459-73f855f34572cf984bb93d09975f5005.npy +03001627-cd47ea438a9387c0ee088de33038f12a.npy +03797390-52273f4b17505e898ef19a48ac4fcfdf.npy +03001627-e777e42470ee9bf270ae142beb408e0.npy +04530566-840d9078c31c188feae47c2aade5a70b.npy +04256520-5d1c69aafe90cc3114038d588fd1342f.npy +04401088-6456bafbb5a656fc487f00a15f77c99.npy +04256520-b0b0186fd16220d4917b96045c9b6dea.npy +04099429-1ada292665f218a8789f2aa296a418cc.npy +02958343-1782558e47730989b96212c8f6cd06e.npy +03001627-a8110dab06c9c72a2c528d33bca1ac2.npy +04090263-16556179cbf2701916b34c3751bc447d.npy +03636649-66cec0a2ab63d9101b6c273f8ff0e8b6.npy +02958343-a5047d31a855ffd1f339a7f0f377393e.npy +03636649-762b4e2cbb8e643790c2e24416edfe5b.npy +04379243-ddc91eea0d38268d616fb9ab42452112.npy +02828884-ec7c3cb273f857ca785c8f27b37ec031.npy +02691156-7442ad61d59fac8c7372dc0a2f1067b1.npy +04379243-7620cd93dbf32cce5213cec267286d18.npy +03001627-3c9bc4876a03093414b65ac180970edb.npy +04256520-385990d0223c92b5f3598efd14e493d5.npy +04401088-36ff3418849b9b8635d9dd2d03e6c396.npy +04401088-183e8d61b3c4edcc90b5b1d619d7013b.npy +04379243-1ba26b0ca7507edd7c8ffa57cf4ce53a.npy +02691156-2ec4d9949f80154b7a571401e6605fc2.npy +02933112-948709ebfb6cd6ff6f2222642bd41c09.npy +04379243-8ebb14fe46f63d5a98cfd47a860803c5.npy +04530566-eb05e72eb8f94a24816427daa1887efe.npy +02933112-786566b66299405a4da5feafe6f1c8fc.npy +02691156-195ca2eabbf7c735a8d66821ccb813fe.npy +02958343-60aadbf4a0a42360ab62a01524fcb1ec.npy +02828884-f1515c5d78429613e80dd430e11432ff.npy +04090263-e8f32ab6ba9ab7713a72dfa25c767709.npy +03001627-d94eeec9f2fc4d6c33fe87c69b83ce63.npy +02691156-f7298a13f6d1644472a4466eb772f128.npy +04379243-bfb2cfb2e454160d78cf5fa17988625c.npy +04256520-25bf067de33706e62bc36def1a7d775b.npy +03636649-dfb6553d8e04cbaae1263552aa9a2d35.npy +04256520-a4b1c819d9b606473decfe0ce0584f.npy +04379243-bb3aa93ba6c9a38afcbe4e14ff0c4707.npy +04379243-df5ac7a785ab39fbb5677466d30ffffb.npy +03636649-357c0ff8a3ddddf5902078d0d905735b.npy +02992529-6682bf5d835701abe1a8044199c77d84.npy +04090263-e9706e37ac92aa199d360253182ac1b4.npy +04090263-71b79bf11ce7ac96b839c45792f79dd9.npy +04379243-3836e0568d0ab079ffc6e457221b9271.npy +04379243-a9dfcb1e1ac5ae67468b43c22b6f785e.npy +04090263-86873de47fac054612b38b1d99376c0b.npy +03001627-32f2998a16e477163c4f66791e25960f.npy +04379243-18b58b179b73dc958c9e244e3fbf98f0.npy +03001627-331e1247f5672328826fc8d57346a2e4.npy +04379243-5d00596375ec8bd89940e75c3dc3e7.npy +03467517-d4b2ddb52e8dcd3593f0194265a9746c.npy +03001627-e14e8241e0bb563f64810cc21086da42.npy +02828884-8b8b59fc52257bea58e51facd8ce1a25.npy +02933112-cc492f2749d63136504721639e19f609.npy +03001627-fe53dcce9a30c5b5348fedb5a291187e.npy +03001627-a85e81c62bed11ea7f4e21263a28c500.npy +03467517-14038f17e185433993f0194265a9746c.npy +02691156-ce0c461237a21cefdb22b838c125a50b.npy +04090263-b5f52968710c4a4de1f2a1daf140ac9f.npy +03691459-7b7904e3d5ac33a65afb688fc9d0c0.npy +03467517-66b24797480ba515d57700c05b1862d8.npy +03337140-412dc6b03934e4984c3aee8e9d3a6ffa.npy +03001627-56c8c9cfb9e6b1b9fdef1c01cbd4ae0c.npy +04379243-d058b63b957076771d6ac856ecde9eb2.npy +04090263-bfa059271ad449e13cf7a43bad229f6b.npy +02933112-295502bcb6d0c0f5c59350d819542ec7.npy +02691156-276908a82ab3728e6283c6757ac506b9.npy +02924116-2270b5b1956c665e193d7855ecfc1bd3.npy +02958343-8bd6b3e216ac44d2d1e34356c50bf8.npy +02691156-f1b3408a3ba452d0c1ccec171a275967.npy +02691156-3a92789dfc5186dcfdbac8c3ccfc63c.npy +02871439-987f3dffca4d921835836c728d324152.npy +03691459-a5e412770440524b92981997d5df910d.npy +03001627-f06d2963ad258feaf5adaa9eef900be3.npy +03001627-b78f64455e41db28341ebff340b2c71a.npy +04379243-e1369c3a3daefef158df8eeaf3dad1c.npy +04379243-c172807c444475ccab610b0c94236463.npy +02808440-129d84a2d2e5242a6b448b8aaebb705c.npy +04379243-8ac2feef21274a23f45db6a75d78cb47.npy +03211117-12c3e644bc371f30366648d52e38fd70.npy +04090263-d21247f000436a8a374d02834a57040d.npy +04090263-de9fcce5174bfe09db181f2efd806577.npy +03001627-a50887c625042b48c862eec8232fff1e.npy +02933112-4db0db06f86fe48f4da5feafe6f1c8fc.npy +04401088-c978be9ff9bfb9c67d2c763bf3599a8.npy +04256520-d669c884e2a9274b1e7ef3c0866377b2.npy +02691156-69ed3801f4f6f4d1e1873a3963e0d14.npy +04379243-5d9f9ee95a7e1623fe9d8ee1a924ac2e.npy +03001627-389ed34a0c989e325fceaa39a8353bde.npy +04468005-1f628dd817eedf50bc80f94fe0a74127.npy +03636649-9c0b48006e3f6aeda1dbdc0360a4cc99.npy +03593526-1da5c02a928b8889dfd1be983f4bd279.npy +03001627-35d62c8a02fc15b1a2c5a50ad2499011.npy +03593526-ad64ff0a281c92b7eb895521e4d63cbe.npy +03325088-953ea008e95d811154d7082b34825ef0.npy +03624134-3a4f0118a57093cbf7c4ed45ce654123.npy +03636649-e569a4ed12ba90c220331d4c3b7d944e.npy +04379243-3683fdc45dc98b8955d054336de5edb5.npy +02691156-3c80dde1fb615ff5ca8607f540cc62ba.npy +02992529-ccfac9fefb0326003f548cb8701b2293.npy +02924116-311dcc47c8f639a1f3f27ff04a4459b.npy +04090263-8aeacdb5884311663716c1574460b140.npy +03001627-d75d1c46cff08f4767c8e42cd3ac65ef.npy +02828884-ab5f53ca60521a231aab721727b6a1b4.npy +04379243-36047e4ed31420904738a251b334366e.npy +02808440-6f1ecf3e720f20e7d63fb7225e5a4313.npy +03691459-8834ec44bb6d291490146e2a0489a257.npy +02992529-f3aac8f54f5f2a2f983ec12a2b33f18b.npy +03636649-b5a0f10269e2f4a6ba5342d638d0c267.npy +04256520-fb0c0e7d7094b64c8e5f5b49c9f5b3f2.npy +04379243-685865c8de58d7dad75b93b39461011.npy +03691459-4f152b01f056d0c35363d5176df02e54.npy +04379243-88140d7ce3a1f6c4664b3b9b23ddfcbc.npy +03001627-704179dd47a2282e676de9b6e111da8b.npy +02691156-4fccf49d6356c756b833a96759a020e2.npy +04379243-3c275368d3e30e775517495984cceec.npy +04090263-1cd506c69f575ba530dd2b88f7efae34.npy +02773838-d9015890f9691fd593daa1a1c18444ab.npy +04379243-6200bfa29b2912048b083202dd9c4b6b.npy +03001627-37b8604d852791651a648655355dc699.npy +02691156-e9c78deefc2950be62b600da24e0965.npy +02992529-9c26b9b0584920f1539baeab407f4a02.npy +02691156-a211cfc04bf47039e933de2bdfbab002.npy +04256520-3b3f44ac9d3245b1e7c7920f6a65a54d.npy +04379243-599f4550ef24f59d19fb4103277a6b93.npy +03001627-ccd49951295cb4cbe139cf2f6f121cad.npy +03691459-774214a85b87204c33dbc1ea1716bde.npy +04379243-4b4ae1bfcf9de312d1dcc55e36186e4e.npy +03790512-46e38cf88b07de0ee2b85785c47c5d52.npy +03001627-6be6d6ae38d8aca4dc2cbc0befb06e1b.npy +02924116-f63095945ba79d10afe1d4530f4c6e24.npy +04379243-75e9e4fd6c512c92966130541a711692.npy +04379243-58c234e30f95394f61aa7729a1bc4626.npy +04379243-1b6bd64fda74bdc4d6983f351200ac6a.npy +03691459-542bc1ef866548c3d24fc75b2f944a91.npy +04379243-bcd046749f03aaab714531f0291497fd.npy +04379243-22c470174c40a0c33dc1643807625350.npy +04330267-c89edade3d122c535eb64c1003065596.npy +03593526-a1fae2bdac896ab83a75e6d000e08290.npy +02958343-73beb19621b7547af8a3d805c6a10776.npy +04379243-7a42b366e7f1da98a5d446d7637cc06a.npy +03636649-25f1a1563f38912250f0b0248b30425.npy +02876657-6ebe74793197919e93f2361527e0abe5.npy +02828884-fc3865756db954685896bab37ddebe7.npy +04379243-65624fa127a2537df3c9c1464e55d580.npy +04090263-8f905b2da32727682a2679e9ffca8e38.npy +04379243-d3a5d161ca44660d4671d97b0fd17f51.npy +04379243-6c10998b950dadd4cea003eff0268278.npy +02828884-eedc7453ee8b1cff9ca96b2737246fca.npy +04090263-8ec183fdbf3fb696e1f2a1daf140ac9f.npy +03691459-be83d48fc695dca62b4e8a84a498fb09.npy +02958343-371c5e74c66d22d451973ec97171fea3.npy +02958343-c35ebd98decdebb9db7706d93442f2a7.npy +02747177-e7682974949a6aadea9a778eef212687.npy +04379243-9472c006a5d35b9ab606ece4189242ff.npy +03001627-689dce303ca3781c19fb4103277a6b93.npy +02958343-7521398f7ab70a073c1d9add3a87bd2d.npy +04379243-889c9aedc4ba47592fb02b79d375eea5.npy +03325088-e9e2bbfded7eaaa99e6460c75101f5b6.npy +02691156-97eb9cf6c8a11a389967b23b351d6841.npy +03001627-9a42cff883cbd358106f706dac6c58f0.npy +04379243-d6577674aee8f8cbe986c6d94503b284.npy +02691156-5a815646537e3b39f51612c193433f02.npy +02828884-16592a1467b7751fbb9faba74eec2c74.npy +03001627-6e06af0dba36d9d8f3f3ee5e8ea028d6.npy +04379243-bb84310d8f022346f2b931201029bc76.npy +03001627-5421802bb8e6e9781ea54e1e7afcaee9.npy +02958343-3373140534463359fc82e75321e09f82.npy +03001627-e0a011619d6c9df19f1deb04fb8ae481.npy +04401088-e483787b7f9c606042f892024869e751.npy +03001627-511a03618c9bf2e7fa762d956b3074e4.npy +03636649-ca6812040234d1ecf57534363fbbac3.npy +02808440-c0249608f553686f3321831d2245cf06.npy +02691156-31a06c63b8932cac8bec85d7b4e1ee67.npy +03790512-e1382731f6fedaefd6207a00f6cde01c.npy +03636649-4f3f01e4b17d018ddaaf0f74e020d2dc.npy +03325088-ba1d52a1f3ea97f7ff8848ee936b8531.npy +04090263-39dae1fb0cd33173d2c901959c439025.npy +02828884-918507f83ae9eb64ad5067eac75a07f7.npy +03624134-4e031e214c34963161eb581103cb1fbd.npy +02958343-72b2c7b2a49d46ac2a9eb0f146e94477.npy +03991062-d7b4c88081a1e59b5117083e4484ae48.npy +04530566-b93e07e84bdfd620f4000b62f164055f.npy +04256520-1bfe2d5a13298b40eaf288f952624966.npy +03593526-fcaab68d0507e3255576bbe3889cc2ca.npy +04074963-c72ecbad07876e71ab0467582043bd43.npy +04256520-f1d1fdca528582dca6c4f2c64bf812b4.npy +03001627-b267d11790325e6cec7cbf3284585a40.npy +03001627-e9068bd3f1f5e59b3fa02fd212ba0e5f.npy +04256520-16a5920c004800ca76e9713f57a5fcb6.npy +03001627-b1ef4c02ac7a0b28632c9ddc45ef4651.npy +03467517-deb865bdb628babd1ea49e67c45d0098.npy +02946921-a7059f3bf782790654976319206e3c9c.npy +02808440-184db8d39477c64f1475ac52df31feb8.npy +03046257-3a1e36329722686c2c406efbeb1811b0.npy +03691459-fba117b56b6829d0cbd549969c6fba9f.npy +04379243-eed0984ed7a72e99cd1c64069cf52e3.npy +02747177-9afa30986badc1f956f6fc4b4ce1db04.npy +03624134-70b6b3ba6a27fd6f782db73f915dfbb8.npy +02958343-62128b128c9a54c6389cb55d070b61d3.npy +04379243-1adc25c3c29e98c454683b99ac4500e8.npy +02828884-fbed7adcac3217912056b4bd5d870b47.npy +03001627-7f1164e82e3a975fcc1908493f380315.npy +04379243-9c17ba009a1f68a5f31d4c4da1121d06.npy +02828884-3abf9811f26c9752a9b8d9d3b5cf54cc.npy +04004475-587fcd5e8024ef687a9cf77b454ff9b2.npy +03797390-df026976dc03197213ac44947b92716e.npy +03797390-586e67c53f181dc22adf8abaa25e0215.npy +02880940-77301246b265a4d3a538bf55f6b58cef.npy +03046257-6766bb45cfe7be90c9fa91c1b1e026fa.npy +04379243-df9a0a4a35c0a1482a610b86c623da3d.npy +04379243-2fd71db402f3939164a62403221fd59f.npy +04379243-335bbef681cee5b46b3f6cce098c8918.npy +02958343-885a8852bda6bad7774c883319711a53.npy +04468005-cf8db3c714acb984239fe5909143a17d.npy +04256520-13d0d8dcb20c0071effcc073d8ec38f6.npy +02876657-d44472ef7086538676bb31db0358e9c6.npy +04090263-7ad1c8369ecca95ffb5c1b0f759e2bc1.npy +04090263-8be6c2867bbd8d27143bcc14d754d44d.npy +03691459-4a4132b1bbc364f573c609379da5b9c2.npy +03001627-ce8e6c13899376e2f3c9c1464e55d580.npy +03001627-cd5007a237ffde592b5bf1f191733d75.npy +02691156-a8471560d4dd5a31ebc34aaab30ca460.npy +03467517-de630541c5d2a44e4bfcfdb26b8cb2c3.npy +03337140-18fc975ac7977ce64c3aee8e9d3a6ffa.npy +03211117-fdf3953c665c36fdeb47c06d7d8c2d65.npy +04256520-3140b8db45212ea0d9b53420a5458c53.npy +04468005-4a4e193b21105f90ceeb72b524f3e0ca.npy +04379243-d6e677600a93bc118ac5263758737a81.npy +04090263-28f2da42122d400d9d5d6d3d4bb65831.npy +02924116-5c718c46b33d804b417efb0412430786.npy +03001627-6c413dd8728bc004d22730b0728b2fc9.npy +04256520-13181141c0d32f2e593ebeeedbff73b.npy +03001627-b81b9e3fe60a49bc55182f299fe41fdc.npy +02924116-47fbe55b7f5f82287e7c9f487eee4fdb.npy +03467517-935eb2290503cc0a343b0b12983b9982.npy +03001627-a3acfe6f313ab881bb088904f7cb154.npy +04256520-d3db0f5bf70b9e32f7823f022ac104a2.npy +02773838-cd1e74f430acfaf0504721639e19f609.npy +04256520-267dcf5952e84873fad6a32f56e259a2.npy +03211117-46cb55835a88ca85eba70eb27950150e.npy +04004475-a945e3df688458ae8075fd3e4c0fdb7.npy +04530566-8bef56b64003be1789f903fb361de4ca.npy +03001627-f76d50f900b034af19fb4103277a6b93.npy +02747177-dfd96d49538de0008a606c63493ddb7c.npy +02958343-8058b048fcc7730ffaf9aa0fdafb5e7c.npy +02691156-e7e73007e0373933c4c280b3db0d6264.npy +04379243-1c2fb38795e6e3c858df8eeaf3dad1c.npy +04401088-1ac1e6fc09611ff049c647f92ae11714.npy +03636649-f79cd66d0a369bdb29a42a0444436860.npy +02958343-a387407d49e209fdeea60824a43a0b.npy +03211117-7c889c3c89dd0933ce2fdea99c5936e8.npy +03593526-aaec691558f7bdd05ca1f314f1afc186.npy +02773838-157fa29bcf6b890d76bb31db0358e9c6.npy +03001627-4bb5877100a76cf5bee7d080c8f1e1fd.npy +03001627-c51937167dd0db45f7628281ecb18112.npy +03593526-b4b7ae650665ff016daef73a0864abe1.npy +04330267-82f134ee4f0dc5ce74dfd914e703ac1f.npy +02958343-186646b16a670b7d69a949ac99a843c4.npy +04004475-e33f0d779f8f0f8127373c7dfd2344fc.npy +02933112-7a051550f229c9a75588a2543ef0b0b4.npy +04330267-a349baf8780207242d3c7a83a255982c.npy +03636649-50683065aa8bd6bec308dc58cdbda034.npy +04530566-78e347c044ac743de2d4c157e5bf1dde.npy +02924116-c20b42745b5b344ef2b99dcb65afc747.npy +02958343-eebc48c480032e45473f10e6caaeca56.npy +02871439-e8f6e0350d99de06be1a3993eff3fa1.npy +04379243-a5f3c1314c027654f12d7184a2ad3430.npy +03001627-44a2a3952ea2315ff51f77a6d7299806.npy +02691156-10eeb119fd5508e0d6d949577c389a84.npy +02958343-da5ee2c950a848f0af8a2e210ebd5168.npy +03593526-92fa811a0cc76fbefffe8e781bf3bc2.npy +04379243-ebc897217df591d73542091189dc62b5.npy +03636649-eb0d19ccdeb98cff88e7662971dc736f.npy +04379243-7147a78bce941b6e9784d1512b6b87bb.npy +04530566-fa8af8f2bedb0d461f29de30ec1bf6a3.npy +03325088-ffbce2bc2d46ad8c3c8d0fdfb1cc2535.npy +02958343-80bdcb908765eb9ec349f2dfac43a4cf.npy +04379243-dcab9aad5876cecd597ff152ef65c9c3.npy +04460130-d4dae64aeda5a50f4f87ba59623453fc.npy +02958343-2a554a704a27618ea37f3fc191551700.npy +04090263-926ced4104fb5d572f63bc22c4d8bf9.npy +04379243-f158c5c293106fb17af2ac6660aa6669.npy +04379243-aba115d7fd94b7cd4bd9e0690b0b191.npy +04004475-41c5dd936949a6a083da7f4ae241cd9.npy +03642806-b3c5bb4eb4c797ae6984b767317d33c4.npy +03001627-ed40add41826f68ab76e29c9c43bc7aa.npy +03001627-758bc4143fceac844224ee0743294f79.npy +03636649-26e6dc505f376ceee6597d391ab6fcc1.npy +02958343-ef8e257ca685d594473f10e6caaeca56.npy +04530566-fed3590199534e0f300dee22a3d8ed99.npy +03001627-51c858aec859bafad1e274d497440a3e.npy +04256520-b598d571630181e171e07968d18a8d52.npy +03001627-56b171b1f1521d27291d12adef12641b.npy +02747177-4c8e43db118f78c85db5515d1151e20c.npy +04379243-73ace155e7a4b1989d24dba534412246.npy +02691156-b65ac56abaecc35bedcd88be6151afb4.npy +03211117-61a81475b820a85aa73340dd35da57bc.npy +03001627-ce9cedc58c77aab4b5a19b1840ec7af.npy +04379243-a7c9de3c0808584ef827070eae09df.npy +02828884-e60121b8e4ef137bad5067eac75a07f7.npy +04468005-e344ca94076866f62e80200f954ca1fe.npy +02958343-e6ec389325de7ae5becf71e2e014ff6f.npy +03001627-522eef970fa6d87b7d9c441a2a657ea8.npy +04530566-6ec6d6a7124542c1973b07394b864922.npy +03636649-356224e2ce466b551218479e9cbf7bda.npy +04256520-a90cf2c399b7052cd4061e538ffc8def.npy +04379243-b37b72a898169c971ff2429be93a82ac.npy +04401088-bcbf0ce42d2b0f91abae9246594d3f7d.npy +02691156-220a911e2e303865f64801ad2940cdd5.npy +02828884-9787be3282d13a159a3528690d225ee1.npy +02691156-afd6b2789e486ad4663191fd557d3a61.npy +03001627-791c488a167bd73f91663a74ccd2338.npy +04090263-2391fdcf2158aebf9c27f9a5387b5fc.npy +02958343-8e308d28d463427f43f0e92e826556b8.npy +02691156-caa7e70beee4543f42c20743f866e1a6.npy +04530566-161d9d8a1550390ff4000b62f164055f.npy +04530566-696136ed6723971649f471d054f6b528.npy +04330267-b947b4dab047cc879d1589237baad02.npy +03624134-a33847e9c32c1afc93ac017b81605788.npy +02691156-a6b09752263b1de2296d88107d065f6.npy +02773838-4a175db3a8cad99b5dd5ceb34f6e33d9.npy +02924116-41b8698a72385b7c52470de2774d6099.npy +03691459-b43daefea1c1e5a5b8cf54556d95458.npy +03636649-7b005e23eae2768eb08c032bedc99529.npy +04379243-eb291380d399ddebafaac116abdd44e.npy +02691156-4982bea0a007c19593b2f224b3acb952.npy +04090263-e5e7552e8dd1b5e9653fe2b064cca38c.npy +04530566-c8f85606ab95f0bd75086ae01906f5ab.npy +02828884-d8a1d270154b70e2aa1bf88d515bc6b2.npy +02871439-ac0710b8484a44fe20dd2dd4d7d7656c.npy +03046257-603ff80e374621a69d4f807ccb693a14.npy +02933112-7ed5c429313f20e079bb09dc5605a57.npy +03513137-3e3e8a71c208d991226eabe1cca3e850.npy +03001627-e967ee5f0790d685286e59f068d9cd0e.npy +03790512-295de7567ed18e692692003428d9fde9.npy +03001627-7fb336186da77367962800be79c6e52.npy +04530566-8790881fbc0331a87cef2df31bcf9d93.npy +03467517-b36971c158d49c94d57700c05b1862d8.npy +04530566-7f8d800b3fce12a7874f0e42f84eb4f5.npy +04379243-8a545c071537d55014038d588fd1342f.npy +02924116-79bf4c4574bc9c4552470de2774d6099.npy +04379243-e653570cc6bcf8783f9f131076f84791.npy +03001627-ec25a41ca233ed096e5a467428553af2.npy +02933112-e0d37d661f26e9eb4b8710a3469971b1.npy +03001627-61fcffc9fa0995dcdeeecaed91450a4d.npy +04468005-119446fc9b593c594f57a4cae005e56a.npy +02958343-335b3ad6f7a96bf251a95aaa6caba1d3.npy +03211117-87f8c79413300052252cde31666379c.npy +03636649-aca8867b962deea91a8781c24b79ae57.npy +04379243-5e84a7deca3e153ce1c2d3f86b7aa002.npy +03636649-78f85448752ae2963873cf6e670bb8b6.npy +02828884-69259c43d80d4815cb2a965e75be701c.npy +02992529-b72ec892f88ab015433d4f1444243caf.npy +04379243-2bd90eb4b9aaff9af84b0be7f50940eb.npy +02691156-7b134f6573e7270fb0a79e28606cb167.npy +04379243-efe6257c1073e003c862eec8232fff1e.npy +04090263-900211102042c2d8fcfb3ae2df2f7efd.npy +04379243-54efc0d108cce07ee166717db5dd896a.npy +03691459-30e85c002b800f2771fd733ac7e95be9.npy +02691156-71a3c6e1c87c8b42233f6392bb87bbd4.npy +04379243-a088285efee5f0dbbc6a6acad56465f2.npy +03001627-b475d6f1cfb6eee21071105723d4cf63.npy +04379243-34bdbfbe94a760aba396ce8e67d44089.npy +03001627-2c40da664d4e736b972d35c68e1bdca3.npy +04379243-601fea1fbb6d791589ccdb4a5b6b972a.npy +03001627-802c4ba91b2d1dde9d03faeacb82516f.npy +02958343-43874d4b5154b6a0e3a6d6259addf247.npy +02828884-393bc2b638ed33fd201085e80edb26a.npy +03636649-83353863ea1349682ebeb1e6a8111f53.npy +04256520-eda8029bfa428c38f6ab3cbe0907fba9.npy +02808440-b3dec10ca40086343af30a3946d92feb.npy +02992529-79912d77eb2866af4e964633a1b1c39c.npy +04256520-e5d5c0cfeea2fdd11b17743c18fb63dc.npy +04379243-dd7e82f0ccddf0cdea3769fcd5f96f4.npy +03691459-ccd635e4cdca96e33b6e05aed261d1e8.npy +04401088-7483bc04eec05077b6d41c42f7ade8c8.npy +02958343-be7fe5cfda34ba052e877e82c90c24d.npy +02876657-6c56bd467b8e6b7912c4d7e462c15a1a.npy +02958343-6ee9f222a540a905e4b68d3b17c43658.npy +04379243-992c576d8efa6d5870c3ad1df4ebf5ca.npy +02818832-a7b24b5ba84a6bc6545580104c9b8ca0.npy +02691156-b848dca797986bd69d175f8055b49b9.npy +03467517-e50dfe2b13d51ea1adb66be7b8c12fbc.npy +04379243-24187332192704e4519259b5fe9bdf5d.npy +04379243-77a115a1ad9d7e687634fef39c2ce2c7.npy +03636649-41fce4197aad78f76fab5a5e55726ee7.npy +04379243-e70d9645a26a4e941832ad614f693f66.npy +03691459-576e85200907fec189d3b4ea8dc19f36.npy +03325088-2a7ffc2172f9a2ddb362845c6edb57fc.npy +03085013-9ae261771f20269a2cc2573cdc390405.npy +03001627-3dadf67ebe6c29a3d291861d5bc3e7c8.npy +03797390-1ae1ba5dfb2a085247df6165146d5bbd.npy +03467517-6565cb5e586aa68730f83c7e8a7d80c9.npy +04090263-8bc74fea7c5e6f05f95499016f29fbc4.npy +04090263-decdf532717c45767a9bdfb16682d944.npy +02924116-10f5a8abbf0caceb34c10c89302b9aba.npy +03001627-f4de0c72715e193deb1f243bab39fb29.npy +02818832-9f71047cd23dfc00d81aa8b56a36ec8.npy +04379243-ef4fa923a1c2a3215f25c76975ee64.npy +04379243-7d4ccf874d0f1060d59c95a5810fd5d7.npy +03991062-e23d3038f81e65f498c5858b88d0229e.npy +03211117-5cb4fac8452906f66ba14bfd91a75020.npy +02691156-35611fc0fecb7a795e02646e6b8fbe8e.npy +02828884-c63561b50109b27bd4d8765e3910f617.npy +03001627-741bf2e8b46b3082720f4a96fb7a3b3e.npy +03001627-519d19f3adebd20aba49014d9a3afe99.npy +04090263-37914b7cd5c02da8fef144202cb2b935.npy +04379243-2a295b1bbb386e2f3ffa3a50996ad39e.npy +04530566-d0afe316f1648d22b5d16f91270f7fa2.npy +03001627-752edd549ca958252b4875f731f71cd.npy +04256520-99ca3d9ee631247f36d8dd30a594b2af.npy +03691459-1f2a8562a2de13a2c29fde65e51f52cb.npy +04468005-ef1ec257503672bd44df2c169375db7d.npy +04468005-1c416135207d17ca3023a62310645ee8.npy +03593526-8f0c5b50ea07f88e59c1c78579056df.npy +04256520-431ed7bd770ecdcafebad4f49b26ec52.npy +03001627-67d296fd51dddfd4bda72093f9b5aa73.npy +03467517-7eaed9980af85df32ab677b65be9086c.npy +03325088-4bcbe4f02228788d50da8b99982a3057.npy +02958343-e2ceb9bf23b498dda7431386d9d22644.npy +02946921-bf974687b678c66e93fb5c975e8de2b7.npy +03325088-bd0a6045194ff62176c18e71fd49c4dc.npy +02747177-91465736fa174801ad5067eac75a07f7.npy +02992529-715a2661c9be051bf4ede441a9f9be4a.npy +04256520-6c8364730b3c64a43fddc4e3be2d83c8.npy +04379243-d1efb527d5cc9f98c1dea9c21912d169.npy +03691459-a4180d6214012dc7363d10d9d37a65e5.npy +04379243-bf899a2e47420008ef1759e0b43f0fd3.npy +03001627-44456e87be145a703c8d0fdfb1cc2535.npy +04090263-a6f0f0aab2ab2591341b8a806253912c.npy +04379243-ef72310b39244eca6aa35752fcfa44c0.npy +03001627-22f7d658bf2d65da2933f312813ce997.npy +02933112-9edead26059cae09e3f7a74e12a274ef.npy +03991062-ed1faa6575c8b1cb31096c6dfcac53b0.npy +02801938-663082bdb695ea9ccb2a965e75be701c.npy +04379243-8e3a92a1f9155845d810b14a81e12eca.npy +04530566-849f7c682fe9160d8c1a083ca347f005.npy +04256520-1bfb1f52f2200860c3eb4329189b69dd.npy +04256520-addd6a0ef4f55a66d810b14a81e12eca.npy +04379243-559582261b021b7e4f987dd564b75f17.npy +04379243-f01768b8b8ba025ee45ef4135c266a12.npy +03001627-74539775b5ff9bfdbd935a20ad27255f.npy +04256520-86c169593e5584233af1c639b9b2ebcf.npy +02773838-8bc53bae41a8105f5c7506815f553527.npy +04090263-9718f974dbf0c599f0e835155cdd677d.npy +04379243-c33d942c6f7d517d346ba1ca782be6d5.npy +04379243-93040a14fad5588ed889130b88839a0c.npy +04090263-63ab37430cb66270b5666ac9dae008e8.npy +04379243-90be5de0faef91ef3f7e27638e63d848.npy +03001627-28673322a55c9935183d5461e0e1f71.npy +02958343-51eb6c713070607db9cc180a886c1254.npy +02691156-59bb001a6f7301b0bb00d3d91443cc67.npy +02958343-d18817af1a2591d751a95aaa6caba1d3.npy +04401088-38afc0467599bd6bfa13d53e5e4a7d2a.npy +03691459-97e93552e141ae2432caa5592532fb76.npy +02958343-332ac5346c7d3c0f8e35db9103756ad5.npy +04379243-d95fe848b19c277a1fd3f440755dada6.npy +04379243-e537c592fdd7f7b7c3bd24f986301745.npy +04004475-f212a6246d96112d4a418e49f65931ae.npy +04090263-6bbfdbeba3b0273316b34c3751bc447d.npy +04379243-21136301f27dc9bf84633b41c8a09fa0.npy +02958343-b9786e1b059a1712ca92a4cdad802b45.npy +04379243-7d0c5e28089c2b7bd99e852ee772dfa4.npy +02691156-d777b1e4ba72cebac5353b0f3cdec54.npy +04090263-3977db3c5730fc7216cf8b1cd2155e02.npy +02828884-a76a3d33ac6c3c65d46c340938e2ff1c.npy +03642806-234155f4192ecf3da97e5dec8972a635.npy +03337140-a0a47668bb5a53769a5d5a8c4f511248.npy +02933112-b12af552392f92b476e9713f57a5fcb6.npy +02933112-aff3488d05343a89e42b7a6468e7283f.npy +03691459-6995acbcca6f9167f5e02330ef435fa.npy +03991062-63c783fe720dfeb06ba14bfd91a75020.npy +04379243-72edff728d75b0b8f994e2a430ba61bf.npy +02958343-ccca16b8302bc8bd13ded1857c15b5b6.npy +03593526-18b41cb029cf7f6c2b151d8b52c53b90.npy +03642806-9297e108b9780fe7da0ccb8671dd235b.npy +03691459-f046081ff90ebb6dce029fab54b6cfbd.npy +02880940-a2841256fc6fd90da518b93bb7233de6.npy +02828884-c3feda2ac776a972b8962f874d138696.npy +04379243-218f7d1742293b9b2f56d03f2a22adfb.npy +03691459-6bf052e16794f2a73e1b2d018c0512.npy +04379243-47c51069048eedfea9646a2bf24db0c5.npy +03636649-79b93ef5e8928141a54a0acb16609d15.npy +04090263-458578892b309b2080c9c53be28cd7ba.npy +02992529-1bb65c38e6b563d919bade123d9b1a21.npy +02876657-437678d4bc6be981c8724d5673a063a6.npy +02924116-46e634c8d00e9f89308dd10eb9e6032c.npy +04379243-c9221b4eef51600ad9deb3f829cc2475.npy +02691156-398ff83ba75191f050405f236096897d.npy +04256520-d13a2ccdbb7740ea83a0857b7b9398b1.npy +02691156-9b60b20ea5fe6f002a2fdfabfb4182ed.npy +02958343-6c1568ee8807fb73aa69dfdc5532bb13.npy +02808440-b1df1ec87212143781ed34698a1642b9.npy +02828884-b90a642198dfd67ba6cf6cbb9f4c2bb.npy +04379243-ed00de0ec65a54c823ed665630afd1ce.npy +03001627-f54c7cbbd49ec8eb429c1439cde9f6d2.npy +04379243-4489bf9e90a6918630bbd4cddd04c77b.npy +04379243-eb984a4ef0dba0eb445e85eb534460b0.npy +02818832-a0e83139d41e3765e2b4cc1c7993e4b8.npy +04379243-318f4fca1278ea7cab0467582043bd43.npy +03624134-a205f01fec2d4c78c1cc4ae0ecf50bf4.npy +03691459-a82329a937432afe8d28f674ed08c521.npy +02958343-468be6b80d1c7dd655ac255cda83e91.npy +04379243-fc31999571a8bf64ad5d470346bc4d15.npy +04379243-a35771ed1c74b778101accd22c701b9.npy +04379243-8334a19ba0063c7faac58be63ab4013b.npy +04530566-4f9d7b905bdd80792b786ce268ccf414.npy +04004475-2af74548033015f453227dcd0d547ba6.npy +03046257-1f7441e3dc465f1291e12c4c8cef305f.npy +02946921-fd40fa8939f5f832ae1aa888dd691e79.npy +04256520-753e1bb8f3164ded7b3ec0bc4f26f615.npy +04379243-6c46312d5a6b81a59e4965f0106e00d9.npy +02876657-b1d75ad18d986ec760005b40a079e2d3.npy +02691156-3db61220251b3c9de719b5362fe06bbb.npy +02958343-d4103822895075e1c6acd56dbe00811f.npy +02808440-2c62b19b80a63f443321831d2245cf06.npy +04379243-78f387d6eee94759db6f3ca49e992ad8.npy +03467517-80f8b25d8dd77add93a644dadab2d1d1.npy +02747177-ded74a76b1a4dc8ecb2a965e75be701c.npy +04379243-c8ba87c9581f9122f51f77a6d7299806.npy +03593526-fe5561103c4e12864725f67267e31c89.npy +02958343-7cd83953000adce622cd6c209adfc63b.npy +04401088-4475473d3a96860621844676433a0aca.npy +02958343-e97af5444370eaa95fae7711b4095f8.npy +04090263-c44f0aa417ed2a77e270f84701afcd4.npy +02691156-150fd58e55111034761c6d3861a25da2.npy +02958343-8c264b10c4ec3e91fdeea60824a43a0b.npy +04090263-ac57851b846a48529f433921788191f3.npy +02691156-a287dc5d0e28d3d3325212819caa597d.npy +02876657-452c562f86da1ca7bdcda0bf7e7b4744.npy +04330267-68bd9efe9fc3373f47622e8cc2e641a4.npy +02933112-b38a8896aa33692098605fee62c12dfb.npy +03790512-f93a67db59f4a29cb37378f3c85478b4.npy +04256520-b6384ee46eec7bd5df8d3317f6046bb8.npy +04379243-6d22194fe700af402b5fb024f65f6da.npy +03636649-2522a20be5c204afa5534ff9c862888b.npy +02933112-4acadee1dadac64e4b8710a3469971b1.npy +02992529-5286f018c374d3ec3f7fe3cbfc3d51a7.npy +02992529-180f36e0bdb9b33f53de6f45c4ae68a9.npy +02992529-c202335fd3dccf9d45e2a4e5729b970d.npy +03337140-81bfa2ff00f5726a336094a98bcf39d7.npy +03691459-f150315ffddd85353ad55e05c29c23ee.npy +03797390-99eaa69cf6fe8811dec712af445786fe.npy +04074963-29310c9b5bc234155eec6d8d24f1fde1.npy +03991062-b4610dd2047073ef1781e1106734ef2a.npy +02828884-a3f987a1f22abe81c01b94c5b8c30315.npy +02691156-87069f21b11c180799a771d197c7b487.npy +02992529-4f3c84ef24e1fe6f3b41ed175964f6ee.npy +03636649-c603039e59ac33a0ce1bab91cb13240.npy +04379243-91919e69d7aec2b740dc81e448174af5.npy +03001627-f347f2a3d85c9a823fa92d98173c06f.npy +04379243-c74f1c411bdf7f57d0efae8dc996b9e.npy +04225987-56c6e4dcf52c32fc1768eb6cdf70bfe.npy +03207941-4a4d00a00e723983df3a1b0d597ce76e.npy +04468005-8f7eca0b9483de30a814ca8f1d6af9ba.npy +03691459-3738550fa707533073312da09abb660e.npy +04256520-325fcce8c386f813e20babf15421d6de.npy +02828884-515716e2bf805c088430b7446f9e1252.npy +04379243-10f3c10837232428c3bd24f986301745.npy +03467517-43884c4afd9e97d123247d005da93d43.npy +03001627-b11640431506c15489452a0032ea575.npy +04468005-2cebb68aab385306f6fb0164eb28c4c2.npy +03001627-3eef51c1ba49a32ef73a9267136cfb76.npy +02828884-4d1d28d15b19f9101e0e41d96d3d0a78.npy +04530566-70d4ca23f31a5c4373c03aee5e8475d4.npy +03211117-8007344358703f62d26c7f75d64f049f.npy +04379243-15d8de2e2c672a445af983a27c524ad0.npy +02880940-bec41cc7f631e00b1bf40e92cbe8569f.npy +03790512-e63a6a3a0c9765433d6587690e56f61.npy +03001627-331bfb4cc56f09e201cbed672acdcde.npy +02933112-1624e80fb20e12741bf2b66b52bf6885.npy +04401088-ef16dd3bd944608821844676433a0aca.npy +03467517-7d81905ed85f66f40c20797381ee39f.npy +02691156-f4818cd7c0701fbe752556d244bfb42b.npy +03467517-3243edb05f5e8803ac61a2f8346a8f.npy +03325088-68a77b120dd7a73b362845c6edb57fc.npy +03001627-2fd314d0a19433c62c37553db37ec752.npy +02876657-61847ebb20b88ce2a62e98cb10d773b0.npy +04379243-c85fffa8b368d05663191fd557d3a61.npy +03467517-a600151f96c1f1ba2c3755be90ec8862.npy +02924116-5f36b7a19c0f8308576927b79fa8f91b.npy +03001627-508306f8ddf1b54c41cc9e8c39b4e399.npy +04379243-6235d7bbd30566e4c955e5ed03ef3a2f.npy +03001627-35c2de57ee36f652492d9da2668ec34c.npy +04379243-d8d504a5e90e5b48c3bd24f986301745.npy +03636649-21e25ed232808a5a6fdc47d9bd513767.npy +03211117-1dccc6eee1ab6f942d692d2ec5374fbb.npy +04256520-fba76a325f400c597178e3cb5f806466.npy +02828884-445230afd5a0eda8714b6900bef4d88b.npy +02958343-794fc3e07d3c5954514e3d96995c555d.npy +03467517-e0e7905f91530fcc633c3142a206ef4b.npy +03991062-25a43049dbe332ed30cd51d117004d92.npy +03691459-5faca1b9f9a94e379a1e7168a7eb421f.npy +03636649-8f2eec27fa65b6b7ef76898f881b76a.npy +02958343-ad41b5992798d44bc350327861730790.npy +02924116-b4911496c498eedfb0912560089ee415.npy +03325088-92112e7fe6e4c131b362845c6edb57fc.npy +04379243-fc1956b87d9cb195f5854716eabccda7.npy +04379243-40fab70cda2e2dc7beedb4c8fd29e2d1.npy +04256520-6897c646edcc98c149d579ea0e00a990.npy +03001627-b22405009444df73d27ba3fc43e70958.npy +04379243-ff127b5ab0e36faec3bec646284d5a6a.npy +03691459-da21a8c569ff0ac4a7c719349406e0b7.npy +04379243-a9206327ea5b37d75fb62d44a047792d.npy +02992529-35dc3f0f2f5fe8d667a434dda72a2c24.npy +04530566-4818277b913b682a3c3bd8d7abbd3fc8.npy +03691459-9821d2e9018233f665a0f3090522e03c.npy +03636649-94940283714fdff6244ba644cf33cb2e.npy +02747177-37f1daa11b023fdf81faebbdea6bd9be.npy +03001627-67fe832a22b91e6c54ddc93d2b7d3d65.npy +02924116-5c7d98a481c9fedb5024b77c58783478.npy +04379243-25bca46cd4b9c517d1bd956578bfe63e.npy +04090263-dce3a4c4ce2fa691e777176cf1197154.npy +02691156-25ae9c70ded5640ac2a9d7232db0ed61.npy +04379243-77b83ff0d0eeb34e6349f6b5431fb3d1.npy +04379243-62fd8ef531c663bf6fe2eb61cd6e74e5.npy +03001627-dac4af24e2facd7d3000ca4b04fcd6ac.npy +04090263-ab1bf0d24526c51db524fe86a5d055d2.npy +03593526-d6209472e79d0a2422b13c48c34706de.npy +02876657-77c9a8391c708ae5940806ade53ef2f.npy +04530566-15d805635f77420ef724cdbbd599557b.npy +04090263-2eb7e88f5355630962a5697e98a94be.npy +03325088-f2db780ff630c097eea9975640c4ae20.npy +03001627-4ebb653961d95dd075c67b3b1e763fcf.npy +04256520-81d5e6d8bef76a51ba6c2a353e21dbe8.npy +03636649-e1ecd3a4734b91fffcb8d8c6d4df8143.npy +03001627-57d4b5a07e67c24af77e1de7c7a7b6e7.npy +02691156-16689e54c884aa01639c7058eaf33ae.npy +03948459-c344176cc45786e35f08fcff2175b4c7.npy +04379243-d16b6d6daed62ead49936479d30607f4.npy +03691459-8c18ef2a9170a8144884161c20b458b0.npy +04379243-c5087fce38b009ae30bbd4cddd04c77b.npy +03991062-93c837235aa98a7ee685b534d1dbc410.npy +04379243-f7bb30d9c073c0be786dd1f2ad4d8c65.npy +04256520-b3cea4461eb14a3164d6551b52610c81.npy +04401088-bef91c1804ec226e5b1c02ea3a290822.npy +02958343-9f7b4a82becac9cd5568b8cbf53329df.npy +02828884-95ee6234a1638f892056b4bd5d870b47.npy +03593526-460055a94c92bc3ed680196133d8b70f.npy +02828884-d7293ad1c563e0ee318b348b36fba247.npy +02691156-31d1cf39b807c856efe0d4e1eba2e3af.npy +03001627-586984ccc3ea15676c441a62670bab86.npy +04379243-d51c7bcf851a368f90193fd5f5187893.npy +02992529-8873af9392bc7506f1cb19f636b1c2bd.npy +04401088-57daa58dd0715c58beafa80aadbc3232.npy +02958343-53895830484cd75d9a68e1b6bb3d1631.npy +04256520-62d40988172e8c685ff61a3a2a0e2484.npy +04401088-e6f4ceda4907fcc13c47272ccf8f316c.npy +03337140-fae333fdef97b004193e4b893d21eb4c.npy +04256520-5ad772a3c728b948d329896bbf26eda9.npy +02691156-947d6b9cd1966e2e719b5362fe06bbb.npy +03467517-a57ee03b7c376eb7b785a4ac4a0dbd73.npy +03001627-4bcf02d408a42fedc399b0e96597941f.npy +04379243-f5aecb6607876495e03eb69820d1aaf2.npy +02958343-aee2d4cae2954ffde51212f97a7d9486.npy +04379243-ad7ae42e620d2ce7e074517a246f1e65.npy +04330267-48b9c0c72db0859cc0fd596e40539.npy +03636649-7a9872f1e0cefafd7d8864caa856253b.npy +04379243-1c2aa66d76302e1f696f6d06eaf4948d.npy +03691459-88c9a7928bc35ab392b9c678bb1d631f.npy +03001627-c106cbd7794c6b6868661782af60b711.npy +03001627-f1fc7d26395549ba5ad8ce80f1a173ac.npy +03636649-b4f166440439171741657e31b569b105.npy +02818832-97f9d6942dfc12c08880edc6251fa529.npy +02933112-484f3660bf095e6f2b8a1a2aaa466160.npy +04090263-9f0b13efed3da628309c2ee598f7f2c8.npy +03797390-f42a9784d165ad2f5e723252788c3d6e.npy +04090263-1fe5ddf1ca0fde916b2c8bb96250e4a0.npy +03991062-ec2c1338e2faae58adbcc9ee28cee4cb.npy +02933112-bd2bcee265b1ee1c7c373e0e7470a338.npy +04379243-6ae63bfca4db6e42937c609387f975a5.npy +04530566-f73392abd103857666ab813654be63ca.npy +03691459-40cd27b2f685afe3ec7f40971ff466ac.npy +03211117-437d1c161da1b9fc57e4c0b864012bb5.npy +04379243-93f94ca2abb0e6aeda9c49a653a829eb.npy +02958343-f1d902e502f474313fdffa7a79289f65.npy +04256520-1bb31ffee286d9687597e1f94410131a.npy +04379243-c7cd5977b531acd76b41b8bcd0404ec.npy +04256520-f94cef3a1dabeefeb26131b3eacda7f2.npy +04379243-d826633e8f45cddbc22013ebab50762.npy +04004475-a553c7b317e25d17b1bc85a6b37e2272.npy +03636649-e7b719516449701362525a4d857f099d.npy +04379243-798a07e42d76013582695d8aaeacccc5.npy +02691156-d13d131a649c5df38b96ae1a0a8b84ec.npy +04090263-c82214579ed998e06bb9681d4604e123.npy +02942699-9726bf2b38d817eab169d2793795b997.npy +02871439-4f0ad9b5b38853f467aad4e7f685c416.npy +04379243-99d329e5aee0fd21c8c7b57a94dbb2e.npy +03001627-9ca1c0357c3033488cc413950b617e8f.npy +02933112-18d84c10a5068315fe5c8ffd0f5eba47.npy +04256520-ae36181b10bbc7c564810cc21086da42.npy +03211117-c0ed587c1ca5709b1c9fef7c3e095105.npy +03001627-462ef3bb97a88a753efde60c5bd5967e.npy +02924116-2d11b02cedb52eb1fc99d03c124615e4.npy +03001627-87de70c9f96dc7edf5fc96890ba7d316.npy +03001627-13d3462293023fe71f530727405d60cf.npy +02933112-3475657660a798a155590b0eedbb2f18.npy +04256520-df4ce626dc8b2a744b3c42e318f3affc.npy +03593526-f02b827d757fcff25692a9640d6947fc.npy +04379243-db94dde04aad570d2f8bc0d6e7c6775.npy +04256520-9d0dd1f2ebfcf0a4cbaaa37255ec05aa.npy +02992529-2a48a703451da580555dee99eadeb47b.npy +02808440-f7233d47ac57e17f125fa9990176f0d5.npy +04379243-c5f14fe692e70a5f668ae11a7db5e82a.npy +04379243-527445c0b9cf1cda27f5c3f15a1b92ff.npy +02691156-80796b736f1d6bc78e8131a047a07ce1.npy +02691156-22e4e0210f80fae813940713146922c1.npy +04256520-ccd0c5e06744ad9a5ca7e476d2d4a26e.npy +03001627-63f6bb7487f81a03bdfa5e0753fa3240.npy +03467517-22b29fbbf99e9cbde1c6f6ff6004a051.npy +03001627-808fa82fe9ad86d9f1cc184b6fa3e1f9.npy +02691156-3ad337dcef167024fe6302fece358e4a.npy +04256520-8d2339ab19665ee3e7c7920f6a65a54d.npy +03636649-286dc622e6f19929fdbe2bf897d8a820.npy +03991062-7aa43d03be94e322e44bad6fc9badfe7.npy +04379243-f831f836f6468b28bebbd6eb70ab85c0.npy +03001627-bb831481ea5166e318656877cdc36a54.npy +04401088-f1f794c3b6ed8951d07b37cd4d789f4d.npy +02876657-77699e08e3824eab47765668cf4023ed.npy +04256520-c8663904bd8af794d9b53420a5458c53.npy +02828884-bd56c556d9514db3500cffceffd2bd2b.npy +04256520-98cff1ad40ad54bcd05576067379976c.npy +03046257-987c21af1a3664b134a81acd9cfadf13.npy +03001627-cef79d398ec49cb3d25229379db8f59c.npy +04256520-682bc1622b438e58dd97e8e261a01f65.npy +03001627-3b2d9328ab28f70122c4f7f8c92935f0.npy +04530566-22bfa8eb9cdce735d90cecb09ba6f1b8.npy +02801938-3e64a7042776f19adc9938c9fceb2ffd.npy +02958343-fa234addf8fe4f7fbda733a39f84326d.npy +02808440-315a621e6159aea93321831d2245cf06.npy +04379243-ef873c6f267860cd43ac09133d4c1d60.npy +02992529-19208607cafce17dcb85f279c97d4c5c.npy +03001627-bb7755090f984ba85dd1bba5b1310523.npy +03593526-585c1079643d859db2236bb2a62ecfdf.npy +04379243-ccb96ea5f047c97f278d386bfa54545.npy +02828884-fe5711dd4a51b102ed98cca8f0ccd5f7.npy +03636649-4ac2d95bbb9c03d1e5fc53e1eb2fc4a7.npy +02880940-c1bad5cc2d9050e48aee29ee398d36ed.npy +02828884-87113624b71e8961e3e484fe1f0aa4c2.npy +04530566-12a01b67cb987d385859fb379730f7f7.npy +03691459-298e3b4149c28821b9001bf6cb0603cd.npy +02801938-5dbf477ba7765febb3a8888e78d004b3.npy +02933112-584b055cbd62b8572d7ead8d9eea29b1.npy +04256520-b55d24ed786a8279ad2d3ca7f660ddd.npy +04379243-828aef6559b4e1b8a9f015dc2ef2c415.npy +03467517-e1c0fb24b0f16a9d5eec6d8d24f1fde1.npy +04256520-9c1565c6bc50ba7668bdb5c1c01fdb25.npy +04401088-4f71662203c45d66cb2c0b430ff869c.npy +03691459-42fe49780429d25d1de55fee5ac2c5c2.npy +03001627-11a06e6f68b1d99c8687ff9b0b4e4ac.npy +03001627-ced5a7469c77e651fff16555386d173d.npy +02691156-f1a917846d46b61f71d03b466c72ce41.npy +03001627-aa5879b3f20ea90c36b0f2a1430e993a.npy +04379243-6c56052772cdc2b66289707fcc0ca1d.npy +04379243-120ac04ddb930aa9b2029d92310f4aeb.npy +02958343-62eda45907bcb75c320fa6e2cd857828.npy +02958343-66be76d60405c58ae02ca9d4b3cbc724.npy +02818832-2e149e4f08f7cbdfed4d676215f46734.npy +02933112-88fd3b8aa4280302c59350d819542ec7.npy +02691156-d3ecaf6bb9395131d563154e026c3490.npy +04099429-15474cf9caa757a528eba1f0b7744e9.npy +03691459-624046a3a0cba1b6c70985f30f25f8eb.npy +02958343-59ed9bf99fd1262fd77312c90516c805.npy +03001627-d343f06da03eccf34c7384dbb75cab0d.npy +04379243-64155ca51be435614c9ef68654bd2fe9.npy +04401088-e3ad9c85b958737ef7c1509e74f67ac7.npy +02691156-1021a0914a7207aff927ed529ad90a11.npy +03001627-3b0ec945e7290c3a6a0677e97a0ab6ed.npy +02958343-2b246a989e9e8be151db49e653372c20.npy +04379243-c73070837a2f9efe1b45df3fb820c9cc.npy +03636649-2419edff383179cbc53c4281a65fe22a.npy +02958343-2359486974efded33121f82ae456ac81.npy +04256520-317cd5686899922e19fb4103277a6b93.npy +04401088-7731182b7b8702bb357be8fc4a9ec12a.npy +03211117-a6a5497848d40c4a46738cc3b1934e6b.npy +03691459-1686fdd7258aa16383247f812f2eaa97.npy +03691459-47a0132d9a497e8ef398d0c5832df00e.npy +04379243-27b9211229e1bf011f3980612faf041b.npy +03261776-c7d59921f034165880403be969162a9b.npy +04379243-920842b21a3c471b597976c675750537.npy +04379243-ba49e13288189be6fcb704ced9323624.npy +02691156-440e5ba74ac8124e9751c7a6f15617f4.npy +04090263-61f01c585c581fdc8ae8d8f46e8d6c0.npy +04379243-b8fb0a7e5d59693780489003722bd0ee.npy +04379243-8d1a33ecdc93bafd727e9f790cd597.npy +04090263-b0ec853833d21d36859a7164d38b0d13.npy +02876657-225d046d8f798afacba9caf4d254cef0.npy +04379243-190645c1f458a934c862eec8232fff1e.npy +02958343-cf176e853cc739bbca92a4cdad802b45.npy +02808440-f4f6e4a355028a6dccd0340812259a39.npy +04379243-24eb7a5dc2b20ab8729c5ef452d153c3.npy +04090263-68c1bcd26d43d80572cad024c77ecfb1.npy +04379243-a05c04a3cad42012fc7ff8f848d1c6c9.npy +02946921-f755800334fcb49b450911b585bf4df8.npy +02828884-438f3246c29d69e73b67a26c84477b1a.npy +03001627-53eaa7cca72c84f6cacd67ce2c72c02e.npy +03211117-dee129ab8c2f74944c58a7782e1dd690.npy +03001627-53180e91cd6651ab76e29c9c43bc7aa.npy +04379243-a886d16c7fffeb874d6c356c3dcebb.npy +02924116-6d53ec3b3b8026d1e797b014c500fad.npy +04401088-c3e18e5d0f7a8709e41b17b375798648.npy +02828884-fec8bee05108531cf7ad31381468cb01.npy +04256520-e66f4bd6f5075d1755f9a00acc25f137.npy +04401088-5413423e80c9f264abe7f17e61fac246.npy +04379243-803fd62336eca9d58797727ac1d88278.npy +04379243-98356e87a3f5db06a0bde355e2e21370.npy +03001627-c73d63f9080e84a91b17743c18fb63dc.npy +04379243-c9b834aeda78274029edbf57bdd3b0af.npy +03642806-74bddbc79d758bcbda39f7cbbf0da6b.npy +04379243-c433bc2bac3eed219c0c9824ccd078be.npy +04099429-dc06f4a16cb9c38d92cea77f96988ae6.npy +04379243-aeb5975090a272b89f2349486c570dd4.npy +04379243-8fc6c8d02b4b0cab14038d588fd1342f.npy +04379243-1db2c973f2a3b154659277e23bf9b970.npy +04379243-3bde1338423d06b4c4fc66bd9d1f7f00.npy +02933112-9178722c21d03d3ca12fd542784d2033.npy +03001627-f04698af574cb9847edf3a3d7d1bacae.npy +04090263-5ba39bccc3073c11e0a54e072367f4f4.npy +03691459-5f3436d8bb1620f4617146ea341ca085.npy +04379243-79e3bca3008fbfcfe635ea97678c24b.npy +02958343-6f9aca876bb1f736ed3696d854eee1ec.npy +02958343-85cb3207e15a1bf8582e5e3e7771ea25.npy +03001627-a16c172406430b6af7628281ecb18112.npy +04090263-bf41504e86804d3d861bbf60d7f925f0.npy +02691156-b29c650e4d7582d11ae96ac7591d0dc5.npy +02992529-ac1e771d6392e912f594ca916b37180c.npy +02924116-d3d9e323a67cbaf9c98c13d6112727de.npy +04460130-e7a492bbc4838de285c7c66844cba238.npy +02828884-86980fcab93e60151f53db693ffe56c5.npy +04379243-4804f348d4028033134ee81f8ff0778d.npy +04256520-e481539e23b4665e20768660cf080d12.npy +04379243-b7cead95e18b570d2c97486f63c12d76.npy +02808440-25164b395b98da1ebe72274d9d6b1d8a.npy +02958343-d353bf0e0dfe3ac29cbc1c09129e1507.npy +03001627-e18ea9d7ff87c3f86a97ad5f72cdc5d6.npy +02933112-3cfebf4fdfa1384da5feafe6f1c8fc.npy +02828884-d1f9f40f8f58394c91cb0beedee33fd.npy +04379243-c365c85ae03b768667fd127a03ee9f72.npy +03991062-a9af3af6f64643cfebd761d74e9ece37.npy +02808440-13b3f78fcad66e2df6da603e92626bf9.npy +02747177-9b0f61fb80473442330afa9b9b51085f.npy +04379243-e0ea31b7fc2626ccab610b0c94236463.npy +04379243-9a01ec707c25dc606199d6fe090be061.npy +02828884-f3ce6a320a9f2791b1a00a31bfed97b.npy +02828884-4a19288db84ea192871543ab797c3d2d.npy +04256520-5148f79f518a42794fb315ce917a9ec2.npy +03046257-f1f87122fedf6e22230584014222e685.npy +03001627-517880899d26080471a782a4379556c7.npy +04256520-db1ca6cab18d4084191c3762b497eca9.npy +02828884-3b660f1b7f7f41be25ebd1cd0b422e32.npy +04379243-21ce3306dc9589dec7cb90e4399b486d.npy +03593526-cf78b551b5d698e5cacc861613759c4d.npy +03001627-4eed9ad9465482d543b9eef399a0841d.npy +02958343-2bcdaa6516a98b552abd245afcc79403.npy +03046257-8b9dac705a205cba1d2588fbbd278bb2.npy +03691459-1ccc688123d1d873ca93bc607b24577.npy +03211117-1bd2a09a9057cbaa2b518e07b1fccf95.npy +04401088-eaf85cce060622c88de42b14089e0e7c.npy +04256520-d1784efbc243913940ef1c8b63a628f9.npy +03691459-775f3b78e226f125b21450114b9ae3a.npy +02958343-792e31b0bc8415a13ded1857c15b5b6.npy +04379243-5d21564e87d0a1f3ea4b8033405be154.npy +03325088-103f0eb370d64fe532149015b3e64c.npy +04330267-5dd1c0efb1907528ff5687b000691cff.npy +04379243-b54d222311420195d9fad8aba2c312b7.npy +04379243-815ceec9c8f5dd754b8710a3469971b1.npy +04256520-e2916cab74b3703763ffebf86d8dd00.npy +03001627-46c7a2ad0abf4463bbc0e8a3b6521117.npy +03636649-23a4572a96dda133d624bbdc22e247c8.npy +03211117-134c9a46684ab57271f27bd49a6cd214.npy +04379243-69a3e5ea90d66d2efd72380f3800ba4b.npy +04379243-68f2795c385859e914038d588fd1342f.npy +03001627-be0b0a9b0a7108c6e4f106360437e8c0.npy +02992529-6449223cebdb2dc9c8c3ac9bcbcd9687.npy +02871439-1f6ba924c72ae8c46612c99aa973796b.npy +03691459-c029e58c26875322a9eb0f146e94477.npy +03001627-979d210217f798d4f4b6538438a0b930.npy +03467517-1e56954ca36bbfdd6b05157edf4233a3.npy +04379243-fd7a579772b195532de421c2ab5cfb52.npy +03001627-4b35795a0ba482cb4f3443b22038d340.npy +04379243-7370a18bebe67690664b3b9b23ddfcbc.npy +03642806-66e3b7c7f2e8e9297fd8853234f5e918.npy +03761084-88e2e2446a3cd2816694e76612a795a6.npy +02691156-e0df97dfc068e3664bf88973bd147a26.npy +02828884-b990e2ecb2650ba548e7a83cf3fe93c5.npy +03001627-fb42c4a8cf7b6d36ec89626a4213fd07.npy +03337140-e2763ac23ee84c6d91c352d02061b3f7.npy +02933112-152dd0a74ed08ef8c59350d819542ec7.npy +04004475-3453629407e6708d6f8a56ca1f74303e.npy +02808440-629f52ed43de72e6ccd0340812259a39.npy +02924116-c43be5262fdd584d1940a53cd312bfff.npy +02828884-957596b8dc4cba37ad5067eac75a07f7.npy +02876657-64faa2a6a6f844af851f4ba6aaedaaa8.npy +02958343-95ea282dbee00d45ffe141441005acc5.npy +03046257-2a979930dffe3d32897a37b9397f0b81.npy +02691156-4fd9c86e43a1dea17209009cfb89d4bd.npy +03001627-f3ece63fb46fb129eb71e9117b10dee6.npy +03636649-4c5a9be10106d239b0957d845ac33749.npy +03467517-10d2c216c70b788485b61f146daff2fb.npy +04401088-9090bc906ec8d80aca54a3214c333cc.npy +02691156-fe0eb72a9fb21dd62b600da24e0965.npy +02691156-325f0b5ace799075bc0909d98a1ff2b4.npy +02933112-79a8b5fdd40e1b1d20768660cf080d12.npy +02843684-2e1fd1d756563937c5c86021644af7b5.npy +03001627-3c4ed9c8f76c7a5ef51f77a6d7299806.npy +03991062-a4762aa34818d514148a76a78b10eb5d.npy +02958343-e915bd270032eb0cafb617f7e8ac7576.npy +02933112-1f822298caef0302143802691fd0e33f.npy +03691459-865356c79a595c3fd3c3c7b74c67a723.npy +04401088-57aa54c9db88e364502122ac3599bb74.npy +04379243-3b45bea7b1b2ab6a20f002682bf71108.npy +04379243-c7e03bba4ab333cfb20716e5484f7807.npy +03624134-13d183a44f143ca8c842482418ab083d.npy +04401088-7f643ee632aa0a3f51ad7743381c8a7d.npy +03001627-2a0e0b51d919f030ad484915511ccff6.npy +03046257-e03d93a19639a6f887a2d41672ab8a52.npy +04530566-e271e4ef2c327dda28d0def75843d7e0.npy +03001627-3a9de2db9d78546892979c651b40698c.npy +02958343-1523402e11400b75becf71e2e014ff6f.npy +04379243-28249c48cb603cb9668ae11a7db5e82a.npy +04379243-d9b264b94aa3aab652f6234a019827aa.npy +04530566-4dc17782858aab6e3308cf743f153e29.npy +03636649-99253484c463e9dd7688e67ac1793ffc.npy +02691156-83ed7c81a011d72a179137acc8d4437.npy +03001627-c7cbed6203120aabe9a3ed4e7aae9cca.npy +04554684-fa4162988208d07a1cc00550ccb8f129.npy +04379243-d382d9e34f365544278d386bfa54545.npy +03991062-c8620917c25de98bcb2a965e75be701c.npy +02691156-8cd5191c587341029aa2a8cabf259b68.npy +04379243-a16d7c49c0899cad8e43a810a63361f0.npy +04379243-f31398b4a1f8562f9297752c3edd590.npy +04256520-b53a3566842e12b290a9ce3e4b15521e.npy +02958343-b22aa9fcad2104a634fad4a395c51fe9.npy +03691459-2c5dde3b43f0b0fc5afcf0aaed5d73d0.npy +04460130-48d4e52fb735e6b6599d77531b1d13a9.npy +04379243-4cd743a60cfa17d6b0a3f25f5d8cb0f8.npy +03046257-d86f29654ad0040114038d588fd1342f.npy +02992529-1d53adf8f82d223db0a79e28606cb167.npy +04379243-2aecf3003735e8b34cbbac005f3700ba.npy +03001627-2bda2aa53c374ca665ba78ad9601cf1b.npy +02924116-7ad09b362de71bfaadcb6d6a1ff60276.npy +03642806-5a63c5f29f0bc0eb12d8efb2f101da03.npy +02828884-9de1b1608e6ffb9afde926512eb9d305.npy +02871439-37c2dc5d7a2c19ecb337d5f45e24e31.npy +02924116-26141fa25522a3b413d4ae6f75318cd3.npy +02808440-a26c4780b14a9d13d84d1b7b18d6e7c7.npy +03211117-d0e4da00e7f9db087bf393182f1ba834.npy +03691459-97bf4aac2d956c1d5d9e9a1d5cade7db.npy +03636649-79815be2cb9b004b1be03639838c9758.npy +02958343-94a78fc51f84fa839ea5c205086e2a63.npy +02828884-26325f047537acd3f155d75bbf62b80.npy +04379243-7216c7ef1edfed4e593ebeeedbff73b.npy +04530566-fbca0e2a510f2b3594daa4565dd30535.npy +02942699-1967344f80da29618d342172201b8d8c.npy +02992529-31a6790b3175d191dca475581a23e66b.npy +04379243-949c26cd898da9855c5e8df5dc8d3d85.npy +04379243-62c6addae5defe8bc62ff677c806df30.npy +02691156-9aa371acc735844efdd77aff53f4b7ba.npy +04530566-9e6d54edea8f2adb41556f795d265590.npy +04256520-fbe08af112773184e6fe3612af521500.npy +04074963-a97a5e1c99e165c2327b86d5194a11a7.npy +03001627-e14803278dcc08c4af7c7ad2549a1b15.npy +03325088-e70d5905fe100117b362845c6edb57fc.npy +03467517-32fed3850b26c82b1c91d5bf986c0423.npy +03001627-3b1f1913f2bc0dc171dbe96559c7bcae.npy +03991062-4706b6fc43ee09358fe24cab2bc152da.npy +03467517-b05152856ba7ceee1e7516298c9158e1.npy +02933112-480a381b676003df4da5feafe6f1c8fc.npy +03325088-4efc45b85110c23276c18e71fd49c4dc.npy +03001627-7ea38c936513f5df3772b104757a4809.npy +03001627-f6f3c3f97b615a19fff16555386d173d.npy +03948459-df2e8011beb752dc44608b3255ca1886.npy +04090263-8d3cc57dc7d9c24ff6099a039722df68.npy +04379243-2147aa5c55a3913c240ea0cdca7b391a.npy +03467517-2be11b43e7a24b4a13dd57bbc3e006f9.npy +04379243-8c7bff49acf7fbc54850c7706670a44c.npy +04256520-4b1598dc0e623eaafd86c4a0427c047f.npy +02958343-e1c7c7fad8802d67fd6539c5080c830b.npy +04379243-9d1485d7d82df9aef4ab13f4b49ac318.npy +02871439-b8166cce2dc8ea4f8c58bec49e6e6862.npy +02691156-697002e0242f331eca8607f540cc62ba.npy +04256520-144cee9408bcdc3ad062f9c4aeccfad2.npy +03085013-5c30c30f543afcec9f695af5ccc7d06f.npy +02691156-715623df7ed5a6fc2296d88107d065f6.npy +03046257-ade988dac6b48a6cf133407de2f7837a.npy +03593526-5543edf23df6527530612f5c0ef21eb8.npy +02958343-fa1b3bcdbda309a439cc19d48e3f4f5.npy +02933112-5d0c82af3d799573eff860318f968925.npy +02880940-3a7737c7bb4a6194f60bf3def77dca62.npy +03636649-994f375a5f371743b5fd9907631a04b7.npy +04090263-c36fa9da71beb581eab5ee569c9de1b1.npy +04379243-7fc2174b2016f76abffa9cc541347f97.npy +03467517-288ac0b24f3ba1a940c20797381ee39f.npy +04090263-c0d928c692fd95b547f0c66d8dcbd422.npy +02958343-4fea9b67188b830f6a2345809e2bb169.npy +04256520-a2d798bef501195c1ecf441429b11ade.npy +04379243-8aa658fb92830e0e62a510b8f97c658e.npy +02808440-63b259b0b462f6f9e59685727bdd9ae9.npy +03691459-36b61e14fedd020a838f7ecc5ce13037.npy +04379243-dd543a069376134aba5342d638d0c267.npy +02958343-5343e944a7753108aa69dfdc5532bb13.npy +04530566-955507bbb3aa0b97b1bb46d2556ba67d.npy +04530566-f2bf8fdce1a33c66a60ce6f0a0028c13.npy +04379243-ecf301eedfbb508dbeedb4c8fd29e2d1.npy +02871439-9b636b7a085ff78a8cbb8bac2032149c.npy +04530566-b2b616535ffca936c9189a1f098bd081.npy +02880940-708fce7ba7d911f3d5b5e7c77f0efc2.npy +04379243-12df0535bb43633abdd9b7a602ec35ec.npy +04401088-31a6790b3175d191dca475581a23e66b.npy +02924116-b7ae96e9df358c315195dd5f75892d01.npy +02818832-218a4d46550ea6fd5a9dc003587438be.npy +02924116-78ae6f2a8b4add0fd110be36252474cf.npy +03001627-b779b6773ef480e8c3cf9ae716575390.npy +03211117-f82e94964e06f23fd6d49cce41472b6e.npy +03691459-767b076382b239a72d563c85edb49108.npy +03046257-a9e4fa90c4e6349ae71cd3b669370f85.npy +03337140-aef1a6861a9b811c7d959b891d79004d.npy +04379243-a54de0e6573dabc0ac42b9d8db52fc14.npy +02958343-219a0021526791d18bb5c0bf5eec83fc.npy +04379243-f60960ae4dc8e293c8ce22a41ea48e48.npy +02808440-5f1145774cb48e7854d7082b34825ef0.npy +04256520-21b8e95a91fe7f044fa89de6e82c448.npy +03001627-70cfdbf8d22c8176f51f77a6d7299806.npy +02876657-cc399bb619ddddf7c13f8623d10d3404.npy +03001627-6b64af50e21c0006f91663a74ccd2338.npy +02933112-4fca24001a151a43d7bd133fd14c164d.npy +02933112-af99a90272d8f5d7776cc3eef7148ace.npy +03001627-dcdb75ba399230bf98f5bccb3529a48d.npy +03593526-4b574003434d2ba041034a9ebee74b0c.npy +04256520-241bf145fb2d14e67ec0186a79b9da3b.npy +04090263-577e1473bbc1e2654fd8f930cee8e385.npy +03211117-b163a1a49784d1b890da575a4a08834.npy +02828884-fa259d97f0514af1814acb3be75bdbcf.npy +03691459-d3817d6003473f1c3971c6f4f1d0a4a0.npy +03001627-46789c1fb150dfaf51f77a6d7299806.npy +04379243-4003c20ffb525c7ee3def9c422df2282.npy +03001627-a54a6ee9263bc1eaf4b6538438a0b930.npy +03691459-bc7a4151d2098374513ea32c8c934a8e.npy +04256520-10e0543e6e316dca30b07c64830a47f3.npy +02958343-de58645e0e00e6be73905da0c7336cf4.npy +03624134-8fbd38aeb89147271edd0225dcc55a58.npy +02691156-b8ed32beb17c3cacafd477f714c68df9.npy +04379243-e3cc0b06be2c972cab610b0c94236463.npy +03636649-8df4dd50d01bb801e9bc18ec03716e83.npy +03001627-68a1f95fed336299f51f77a6d7299806.npy +04090263-7b74f5d8a2ad8aec6ba53cbcffbd8494.npy +04530566-12e012fc28fc8d784de203ef6842ee61.npy +03001627-3dd04235c696c117db6d2ff65cc5b310.npy +03001627-64f885f39752807c6c63b8b48495261a.npy +04256520-14bf301e9548eb788430c9c8b2cd5ae6.npy +02691156-67e8571eceec1ea44c3a35cee92bb95b.npy +03001627-236f75a784ed58d62b3e9b6eb52d35df.npy +02691156-a5d68126acbd43395e9e2656aff7dd5b.npy +02801938-34fd44c46f40044339da77d05979b2.npy +02958343-43319fbb378083669d5b1db3ffcc1210.npy +03928116-6161ea30b60fe86e16a0adac6af4232a.npy +04256520-effe967a116f8098cc2af5791bd669b8.npy +02958343-61abf78387c84ab67bc163a1196fba48.npy +03211117-bfd57bdfa26cea8b5db5515d1151e20c.npy +04330267-9399d12f4ad210cd7c3206b8af68d4f9.npy +02691156-39ce355324ab4bc8b96ae1a0a8b84ec.npy +03001627-808cd961edfc236c11794406b17d66b.npy +03467517-2a3cbbb4242103a9d57700c05b1862d8.npy +04256520-6e0e701ad50f5f8c63a3732f072a64ec.npy +02691156-947a78a898b6aa81f19a675dcc5ca632.npy +03001627-70207d8482c135f8410594e2fa0c101.npy +02691156-8c6ec24418f0af1950e187c1fbdbf3ba.npy +04530566-abbef6c2f909b9719ef9dcee729574d5.npy +04379243-5de144376ad2826329909e9b8d8324a.npy +02958343-4b339f645507508aa83aa2c84a424148.npy +04256520-398ffbc5870c12e1b5c63839abd9baad.npy +03636649-a072cd9c2593414031ae8c8ff1eb3d45.npy +02958343-f2f62db1a9e5823a7aaf6e2fd8453e07.npy +02876657-1e5abf0465d97d826118a17db9de8c0.npy +04530566-83ecbc5daab43647ff790997f2048517.npy +02876657-917fd3e68de79bf69ece21a0b0786a69.npy +04379243-3edf1ef61a9802e6492d9da2668ec34c.npy +02828884-36e1592e13b4f5ed569c11df1aea8ca4.npy +02818832-e91c2df09de0d4b1ed4d676215f46734.npy +02958343-7ee2193b072afa652935bed12a852dcf.npy +03001627-2dc5055b8d900ec7db4b0ee93cf61ed1.npy +02828884-13b28cea086fbf59585a7824ddda249a.npy +02828884-f2a3ac936fcabeb8d1ccbd5d84e5bc86.npy +02924116-9f70c6bc076c1ee09f8b56cd3edf0bc6.npy +04379243-5d46bcc77b2815fca71c812e027f94d9.npy +03691459-8629dacee484080c7ad11885dccb6f43.npy +03001627-881e7a45e9f149d8283b00891f680579.npy +02828884-d2cd3e3cb4ed6ee4e7fbee941d13bb9f.npy +04530566-4bef06fbd04377d4d6e2030b844bcb2.npy +04379243-b10228c0b83a6d436b8cc29ba15869e8.npy +04090263-91729b92eeab3fdb3a653cb492d78488.npy +04379243-ac4761dada79926919bebd2312571a3.npy +03991062-3023f9aa8405195f37ab51e1f8240a33.npy +04379243-4b95230707396e18916c024499b21ce6.npy +04256520-9e63faa55910e20714038d588fd1342f.npy +02958343-56c056544a2fba1614d5081e13f5a1db.npy +04256520-cf4db3515ce7c603cda053036bd1b63f.npy +04379243-2bbafd62a8c5a2d1520ac90ee81efb48.npy +04379243-2cfd6534a6a57548d20545a75c46659d.npy +02924116-3161de3a7b4064ce7d805ac05a89f972.npy +04530566-1117e714368f61ee1fba2cab1ada6bf6.npy +02876657-8309e710832c07f91082f2ea630bf69e.npy +02818832-ac06e06d1d533932d8ab9ec32b20d37a.npy +02933112-72105548b0e01be8659e37b49210f361.npy +04256520-6f98760567bd7f69bd16d4490a10a752.npy +02933112-4fd61ff0aa949a4486d53ab0fe94e911.npy +04530566-2067c22906b79faff877f04737ced5b5.npy +02958343-f2e1db1997b5e2568926f812d9083f89.npy +04530566-8f3d3eb663508afb1143e3955ded9f0a.npy +03001627-7bdc0aaca74cca86593ebeeedbff73b.npy +03337140-bed9025513a46a09bb1a97f41fc4e5e0.npy +04379243-bc9650bb551fc22e1f6014485d7eefc9.npy +02691156-eed299b690be51ffbd931fcaa69140.npy +02818832-fcf45c518cc630c6af372cbaa79ddbc5.npy +02828884-35e62b9c23928bc57f5df2bc47846a54.npy +04256520-642883f79c9131d842c47c8032438a1.npy +04379243-546f5dbed1636d097ee0de88f23eac1d.npy +04379243-ffe2bf44f5d9760b9a8ef44e1d2c5b75.npy +02958343-d4f910cd784c38dc90b4e3bfacd1b5e3.npy +04379243-db32d69c5b2c77ba51b5726fdf67f095.npy +02958343-4f0147c8a158087a4c19dab9f2c7c52d.npy +02924116-699cd83b28bd248d30f646576d932e1a.npy +04256520-d8751c7d4156c98ef09df371fae9d63d.npy +02958343-dc8aef6a8c88997a582e5e3e7771ea25.npy +03001627-9faefdf6814aaa975510d59f3ab1ed64.npy +03691459-2d1302ed4d4f43ca73e1b2d018c0512.npy +03636649-6bb8020fa82b27dde11a3e838aa2c287.npy +03467517-65c02d42310072893ad5c8c907218ae5.npy +02958343-d255a6f670c3ec18d12568d09c2fba02.npy +04530566-fa2580f6b9a29f5454f886603823eb9.npy +02691156-e5c6ba3e7d4f2fde40acb87a6be88b3.npy +03797390-c82b9f1b98f044fc15cf6e5ad80f2da.npy +02871439-850c4cde0bedbe9bba5342d638d0c267.npy +03624134-5391a808f36b46971638241f3ad71c10.npy +02808440-c6dd3b539e5effd61c17aef130ed6213.npy +02828884-d1d433ab6a289a568e95e8a3bb5a538a.npy +02924116-57062cefa79cad6bc6bf3b18b8ca71a.npy +04004475-e7151d72238ef13c2807a549203236ea.npy +03642806-2fbc09c414c80a2d50577cf04f3bf74a.npy +03046257-3bba665dff8dfd6141c01a2987577d0c.npy +02958343-a61488f91b2837f8473f10e6caaeca56.npy +04379243-33bcda05749d01bc4b3c42e318f3affc.npy +02933112-1a9a91aa5e3306ec5938fc2058ab2dbe.npy +02691156-ec4a2a47f601397ea01e5c9f53f20fd4.npy +04379243-8a6e06fbf74e811667d24b304b35bdf4.npy +04379243-29def96b77d4cfe372f9a9353d57f9ef.npy +04379243-f9d5c41dd092dd8e78c10c978f26802f.npy +03691459-6cd4d9c6b51d785bebc9199df8e5ab6.npy +03001627-5e907bb5204ec4a9a16baf954c1d99bc.npy +04256520-9b3c9023e8c570d5b307b2a73ae3e74b.npy +03991062-71082c00e772bc54b79ee87044437bbc.npy +04379243-b6b8ede77085c0a95bea7c29e873d16.npy +04379243-5de75da0a8142dfb17b431cae0dd70ed.npy +02933112-b9967857b0419d44e7312e7851dc468c.npy +03001627-383bac847e38daa0e8dd9b2c07157c63.npy +03636649-90e4219f897af979cbde89e0c48a01bf.npy +02828884-f3a44bf9a27f1446ae23680cee12f145.npy +02958343-844a5b7af9b67510b1bb46d2556ba67d.npy +04256520-3aeae4150fce9f79ed3b18fbf7db0d.npy +03001627-619d9f32db0780187c34f3963ae12156.npy +04090263-b12faa395027a377f7bd077790d66b82.npy +02828884-442283366e5b20c7a136444fdcc3f2b1.npy +03691459-1605c2ea5ce774811e4a701e01e712d1.npy +04401088-77f5498dd2277aacfd71ce99fb45ba0c.npy +04530566-ab9359cafda4fd98a726cf6fcecd0742.npy +04256520-35c611ddda81b9941206ff076758ec85.npy +04401088-1049bf1611874c9cf0c2cf8583536651.npy +04530566-6edd37977522996a9b8e79aa9da22fd7.npy +03691459-a2dc5748b523db72bbbcb091dd094e5f.npy +04090263-e19e9ab7d858842139336f03eb955d2.npy +03636649-6b8790947a71e9a9bc5996932c1238cd.npy +03790512-f8f73c4ee5da94b076ee2dc2a279fa5e.npy +04379243-24a95d1ffe9b8853468a0257ee459475.npy +04379243-f708d5284928431355ce350c1c834503.npy +03001627-2948af0b6a12f1c7ad484915511ccff6.npy +04530566-e12095f9d33eeeb6711722c32e47b894.npy +03761084-42753fd8af1477e019d629b015d21083.npy +03593526-bcf95c3997bf686b4beac2065c0d9cb7.npy +04256520-77f5e753014c5b69b4b4d657a4935834.npy +03593526-f9ae4485b706ab1893fa5ed2239f9b08.npy +04379243-83c24aad3914e61a73376642dd664bfd.npy +03001627-e82fbdd4857adbd7bc0482e18ec51d0e.npy +03001627-2afcb7db7697d552f51f77a6d7299806.npy +04530566-128ab8b74fa037597fe03c0a35dc1886.npy +02958343-47a0e5448c4a3bcbb1bb46d2556ba67d.npy +03001627-79ed181ca18bf71dc8881577d38510.npy +03001627-ce3b2722cdecb0f0b3272b4a93a044ba.npy +04379243-850564e1e8587f35617092ec6e36103f.npy +02876657-a1275bd03ab15100f6dbe3dc17d6cdf7.npy +02958343-bbc4f08aacdff9c7a8ed0bb390c8ebb7.npy +03085013-485b2b3315e2de0698b3a9547b8c6f56.npy +03797390-e71102b6da1d63f3a363b55cbd344baa.npy +02946921-bea7315d4410d0ce83b1cdcee646c9a4.npy +02828884-98971eb747738a6880360680c1602c7d.npy +02691156-78a7cdbbb27dfb21bbf3143b1cb6076a.npy +03691459-431892f5456a2b9ab96497d8dce09d96.npy +03337140-ce57b6b84feef58b4c3aee8e9d3a6ffa.npy +03001627-8d3ea5a8630be8c0f51f77a6d7299806.npy +02958343-fcd90d547fdeb629f200a72c9245aee7.npy +03691459-fae47d104b9111aafd949ebbd292d47.npy +03790512-559b67efe09f141052fa4ad29a1236d7.npy +02691156-e1225308d6c26c862b600da24e0965.npy +03001627-1f0bfd529b33c045b84e887edbdca251.npy +03001627-2b0f0f530011353d15eb60d655e596e9.npy +04530566-df15e931e12c32c38a5d92735846f6c.npy +02958343-5edaef36af2826762bf75f4335c3829b.npy +02828884-1be0e167a93a1069acb4ead41419080a.npy +03325088-42c5ef82f8d7e3b050da8b99982a3057.npy +04090263-84fee75d9736808afa29682ba98e856d.npy +02691156-63f3edb47c67caa29a6e43b878d5b335.npy +02933112-248ff0771f1eb286f51f77a6d7299806.npy +03001627-7a755f08cba6e387ea8f932ecf29385f.npy +03761084-112624e40e96e5654a44340bf227e40.npy +02958343-67e2e5470d27e605d3c820a40c219fa9.npy +04379243-5788395c87b524db79157224cf10b26.npy +04530566-aa83008f44e009177795dd28016933fc.npy +02828884-95b375118d800de7ad5067eac75a07f7.npy +04379243-bfa94cc8557253982efa4e574711a177.npy +03001627-1d37a7fbe0810f963e83b2d32ed5f665.npy +02958343-21b8d0946135481a8772afa45900d07f.npy +02958343-5a56285761f2d6cf261c731730128248.npy +03467517-cc37ee1b4b007f0693f0194265a9746c.npy +04379243-dddacb5f14641b49766aeccb5d872ce4.npy +02958343-cea62d812396c31a88ed7b6315c3b4a.npy +03325088-3f6ac7c3927f9e61f38c4a12750d961b.npy +03001627-5ce323f8499cf60ce51e3cd2b72fbf02.npy +02691156-b3950d8c2c1da884e52afb4158d0847e.npy +04379243-7aaad1c5c2be8c24a9ed7bb5b55809f8.npy +03636649-73378b714c5bfed2b922d818b19db1e.npy +02691156-ee562cc82d73ab212135f3a0e614f115.npy +02818832-6690d593663cd3db81668ccf07209203.npy +04401088-26175bc1827c3569c4b311ecb3af9fe6.npy +03211117-8dd161fa61bb651eaa95bf474e195f02.npy +02808440-ceaf2e69f2c5402ac76194fc117cdc00.npy +02828884-fa2f82cf9275c2078ccde000e771fc1a.npy +04468005-28a465e9c73c5e11e308292e90ed0752.npy +03337140-3711f7ae4f528f7963f393abca61510.npy +04379243-a296a3504163b053e6fe3612af521500.npy +04256520-b403f11f5ea4a6a9d8c9ac981f1e537a.npy +02924116-a9b7fbe4a8dd4d0c44f19502064e0a74.npy +02958343-97128412dfd802be2a9eb0f146e94477.npy +03691459-91a98a5ab36cd751cf99e87135c925d6.npy +04379243-794395f3e5e2d4f617b431cae0dd70ed.npy +02954340-c1436c38beba0005284432ce2f42f498.npy +04379243-5fa362fd2bd9e4b5febad4f49b26ec52.npy +02958343-77e3ac704a2933d0921cb81cb1632a5e.npy +04256520-ee5cfabb3bbf211f4f46734d27ff5aef.npy +03991062-94dc988b968844c944c183864792bc2b.npy +04004475-c3a4c0139cbe53507810fb143767556.npy +04256520-87640cfc9e38bbb3ec563cfb0e79cc4c.npy +04379243-e8bf7ba06998867d653227f952929af5.npy +03636649-a7f071ed220b495d786810c22b062a88.npy +03001627-5eaa2730f10054d0f6cabe1df6f4c9d9.npy +02691156-79d82d0db21dff48aedf20f7099e25c5.npy +03593526-e70b94a9058952643f88f523fa8b6921.npy +04379243-4beaa698e6a7721279a2553310841ae9.npy +03691459-424e95fed6e7fd5c14fdbb071f44a8f.npy +02958343-5a5f53455c2b400579206bf213559607.npy +02958343-6cc0924f1ad64faf8c2e7159929c406f.npy +04530566-78fe059e63f817a296f6c44da3269880.npy +02958343-868af17aaa07b069bda72093f9b5aa73.npy +03691459-c533b4ce486919121cd3f324e5fa80.npy +04379243-85bbafe7db85e0d44c4373a4939914cc.npy +03001627-da918b121ca55feb9b9f2eb77f5e247e.npy +04379243-28e1ba582708bb21b4c161851ed2b4e4.npy +04379243-f597ff7f743d99a3550660cda66234fd.npy +02691156-89bc3fa2ecf1425f6c32d954b1c7f41e.npy +04530566-3e900d7ea70fccaae6100699d3d743a7.npy +02958343-78f9e32385dd7db27996cb12b5662363.npy +04256520-d09b21e5a16c2a0ea29038f04db9492a.npy +03001627-8951c681ee693af213493f4cb10e07b0.npy +02691156-5213a6520cc225a0fb5c1b0f759e2bc1.npy +02958343-a7065cc33270e551a3049d0dcf503cdf.npy +03211117-782655d93313d14726ee873dae10ece7.npy +02958343-1089cbe82dc0e72133d7c9e122eec9b6.npy +03467517-c8b76f91f783d765dae24eae11385498.npy +04379243-7f827b92453712f3504af6e1321617aa.npy +02924116-89a290078b4d987f6f525e79a05bbcb3.npy +02992529-33db5943a8942fdfd998bbb6a9d203d8.npy +02933112-6adbd040ec2f9fb53f07ca1042ba5dfc.npy +03001627-2a39dbeb52262b975babe43b460dfe6e.npy +04379243-249de04d8d7e4061cb9cf5f7d536cddb.npy +03513137-9668f0abd848e943b20f6e48f6a30cbf.npy +04530566-e8b93c451e4278277220891f188bc420.npy +02924116-85fac8cd5ec481ff2b99dcb65afc747.npy +03636649-c226b3469c086c75a1b5ceeca96f6fbc.npy +03001627-43bc4a978115d3f82ff27b24dc18a6e8.npy +03325088-4c1ebf8c47731b573321831d2245cf06.npy +02871439-3cee003b8928f425d810b14a81e12eca.npy +02691156-29374d5ffdb23451e1f2a1daf140ac9f.npy +04379243-731b983cb313634fd018082a1777a5f8.npy +02933112-654c0a2db749c63a56b67b833e192171.npy +04256520-5649e603e8a9b2c295c539fc7d92aba.npy +04530566-bbad61a484ffb3ecf0e4a921fd6a03e7.npy +02933112-cdf33719d80e3f1dadecb2bfe4fe7f60.npy +03467517-2adbf6c3f8f2d9ca7fe36b1f0a632ed8.npy +04530566-58c05eceed8e0a48f3e39f2e17005efc.npy +02958343-476a54545e873ddf6cfecb6c9c824fc6.npy +04401088-25eff75e43287223f1cb19f636b1c2bd.npy +04256520-eeb9c7f343677bc7167c63de52dd6bbd.npy +03001627-3466b6ecd040e252c215f685ba622927.npy +04379243-c0882eb8eb6fba2d8705931e60ead6a0.npy +03636649-cf280956401024fe92225eae846f578f.npy +04530566-1522b8c3c28a9d57ace571be2585c620.npy +03325088-5522e7712d022366c02a95ee51755450.npy +02691156-f34a66147493f0633d5158710d6fb8.npy +03636649-8eee3b5fd2f3abd4bcde6f92ef1f7ee7.npy +04090263-8c769f47d8d5b0c84b681a5f8ea211b6.npy +04530566-a2f46716962afe72b106d5ef46e12c19.npy +04256520-262e433c526d8b4ad84b8ba651dfb8ac.npy +02828884-89d15e96bdf725bfc955e5ed03ef3a2f.npy +04379243-9207224582ee8aebf57b7c8ba41c730e.npy +04379243-375aae9fcedc76438b9b51ae4415d5aa.npy +02992529-18dc34a116734b43bfd324d8acaeb3f2.npy +03467517-9c2dd87f9fa0614466c0cc72d086c581.npy +03636649-dca5ccbc65594b4fcb8d8c6d4df8143.npy +04379243-4702c7f73c64fa81cc19d3672693a8a0.npy +02691156-6a7bcaa4c62779e45e6724a7c6e30991.npy +02871439-efb65556126571c6db6ba5a23e03f3c0.npy +02691156-76811819fc2bf7fbdbe9ce60b93b8bd5.npy +04256520-7d8e6b132c64d909b161f36d4e309050.npy +02691156-54e926e12382808b66cf1b4a8fc3914e.npy +02828884-d27d7e667c5ccd70cb2a965e75be701c.npy +03001627-41fead15a9ade0f090492b0341436fe0.npy +02933112-941289c22ad19099a87002a4eeaf610.npy +03001627-25c61fb5c237767919fb4103277a6b93.npy +04379243-d599b1176343728c6705ae120c2282cf.npy +03001627-9144c2c7b7d9f733ad484915511ccff6.npy +02747177-6d63c096e32feca4f4fb4dee5181bee.npy +02958343-7d33cb52d556c1fe618e9d35559b7aa.npy +02958343-a86ab6f8af60c6afe1d4530f4c6e24.npy +02691156-6cd3028fe03d04fec6f6da58b133bae0.npy +04379243-bae92d56010d241157aaa9693588d48c.npy +04090263-3be7b34984a3e34fde9c2fd0f82cd3a7.npy +04530566-a473fe0a7f11c7ae9041531b90641b86.npy +04256520-cff485b2c98410135dda488a4bbb1e1.npy +03691459-f2e521a8d08e2a2f20363e2561dd589a.npy +03636649-9f2993a2f6cea208d3e2561755f455b9.npy +04401088-142e9e68380daef34eb88be3370bffe7.npy +02691156-e3e6cbc295806a47cf0420e0d05f48de.npy +04379243-548c2b0a10a3f8c798b664231032816.npy +03001627-ebc5bd5566558b64af7c7ad2549a1b15.npy +03211117-50934056d4c1735dc9d02d4e580c2722.npy +02924116-c7139efd6cc730d177b8f563bc1e52ac.npy +03928116-c955fbf41e870dfaf0591fbec6fb99b.npy +03085013-744c65c1a90c7db44f43b0e03c0602c.npy +02933112-25cd31f334358e0260bec33edd014356.npy +04090263-5b1dd450a929e2823b2b25ffabe35ca6.npy +04530566-fdddf0bea9cc33ae81d9d9b1473043a2.npy +02691156-8af730a8f082af9167b9bb226efd81df.npy +04379243-3e30deadc87180b6c3bd24f986301745.npy +04090263-7392b5a3e2ff001f13e4e654fcd57d3a.npy +04379243-268e68f1819a225c1b4b790955c17432.npy +04468005-ba37b06984355766dc14ba0818ee5cec.npy +04379243-c24bc140335164ba815b2b467e8e2eac.npy +03691459-cf85a8c74cb76caf1574d21c0c95092f.npy +03691459-c8e0a46d8a6352c58df4edffcbea21d6.npy +03691459-ab84f70571827b76dfdc04b8b8434e84.npy +02958343-381bf84829066031a134736201a79843.npy +03001627-d915d2f1664bf76e71a70be9f12ce8b0.npy +03001627-2c548222017955df4530ae9f1281950f.npy +02828884-a047cb14c22517e6f33e284fed03c3fc.npy +02933112-aac417d5df45cfd7605de7eae9f0b0f4.npy +04256520-412b9f3244a5cc56b667ca2c169528e2.npy +04379243-ae099c7bf362b3e5c3bd24f986301745.npy +04379243-56ea26c10c478555a31cc7b61ec6561.npy +02958343-d4e611a541a5b01473f10e6caaeca56.npy +03761084-dc5c91c8c01b1c8c506c648223cdabe9.npy +02933112-a9ade7de80ee8cc8ae25f6fe802a8997.npy +03001627-52f6fbe3a36a4d1f19fb4103277a6b93.npy +04090263-95e3e6cb5f3c8cd39eff3cfd975ea4b3.npy +04379243-343b9ae8ea03e45070f79ce36975718f.npy +03001627-b919250f54644e1e326e6d76fa066efd.npy +02958343-5042d8f781a58c4c9be457a8c6fa099b.npy +04379243-45320414e630ca38b96f0049223adf04.npy +04330267-4346f26dfcfd5b9c869bb2e9e5b3d44.npy +03759954-322615cc1d6cedec494399fa6924e986.npy +04256520-6f271a6c941038a6efc579970fcfc006.npy +04379243-e7b76d66231ad077cf004563556ddb36.npy +03046257-f0f2102800fa6493f130e9cdbbb1cf40.npy +04256520-7cb3f49789714865a494798fa117187b.npy +02818832-c7f039115a83939ebbc004a1c4eccc8.npy +02691156-ab0ab979406ed687a8e091cb544689d5.npy +03642806-f14056ee8bbebeecc1b05209f08e5ec6.npy +04256520-837ba605a4ab4a4f19fb4103277a6b93.npy +04379243-b9c756b2ff5d66ddfebad4f49b26ec52.npy +02933112-40470660e2b7a9ad6fa0ab61d9f9d96d.npy +03211117-478dded38f3f8d52934a98c0476fcf4b.npy +03001627-a38cfc9d2003117e19fb4103277a6b93.npy +04530566-e9da320a14afc7098031a892cba81629.npy +02876657-3b0e35ff08f09a85f0d11ae402ef940e.npy +02691156-9baf5b31d70e0d05e98d814cc4d9c5e3.npy +03001627-bd5eb0bfad19c8d9cd431573238602d.npy +04401088-dd996020281c929f73caa5ba625b1f4.npy +03938244-ac2477b9b5d3e6e6c7c8ce3bef5c2aa9.npy +04256520-a7e4616a2a315dfac5ddc26ef5560e77.npy +04379243-7bfd75013a4d7aeb5ba41eea807f5d3c.npy +04401088-8e3e1213e47661506457f8736d1c9e5d.npy +03001627-9027cd82cdc7da4d2541c4d6fdd1e35f.npy +04004475-75e53b4107a95368a3c3591ebf6e2911.npy +04379243-f7c7e05da64f6e4f2aa0f30a1572c50.npy +03001627-6b74546be8d42c76b035d20a1a3ca345.npy +02924116-5beb6cffe93635bd973f659238edf3c3.npy +03642806-464edfe14e9fa45c3394926146371698.npy +02958343-58a0216bf4c8c91d3d2b2fcaf6a55d04.npy +02691156-fbee89bee5338798d4837a4534bf020b.npy +03624134-eaffd07694c11b20afc61ad0921c25e.npy +02958343-82a783a1ea4e34b8d7755e7baabe8a6f.npy +03001627-77c4867b42d73d9bf24f05137699edbe.npy +03001627-ea3723766e96331ff91663a74ccd2338.npy +03325088-a8d7a9795934772d3321831d2245cf06.npy +03991062-12282e4fb29632286bd4d8addc5eb335.npy +03790512-733b75e867591d0fb37378f3c85478b4.npy +03325088-ac026fa4c69669a25b036534f28c2db.npy +04401088-33cd4232a87e1f416a1f7081746396ba.npy +02828884-8d218bceb517f272f155d75bbf62b80.npy +04090263-61008422050513d987bbc659fe543122.npy +02958343-cf32af5869fee4d34eb766e5a46fceab.npy +04530566-33e3b187089a68d3f983f6a1267b9260.npy +03642806-1c035fa183863780e605719767a1e7c1.npy +02876657-5277b4491396a522333769b054e66b40.npy +04379243-c8aaf90c4e66e235b9c440034ab48a1e.npy +03642806-dbcd5a88a9d4f1d7579cfe4420588034.npy +02871439-31368c56e8779b7951c1fffab4f5807.npy +03001627-25871aa50531fbfc741e88434245c899.npy +02992529-1984fb95afb6dae5804722305621f918.npy +04379243-169a72252808f9d12a7ec74a9a907cb3.npy +04530566-40d4cf2e4c0042b81f6b8c144863b7d.npy +03636649-e93f10a58e0da99bb2920cf5c60c4da3.npy +03001627-3171bae36693716126e4d5b5a8cad4da.npy +02958343-3804a264b503d5812e40b8f7ac380eb5.npy +02958343-f296f3a83e09de75afe1d4530f4c6e24.npy +03467517-b620027321650495b266a77a6097101f.npy +03636649-1682d4404196cf127588e2ca59b15f8.npy +03691459-b3f5d033d3fed8e9d207241113bee327.npy +04090263-c578ba526b8ef653e28e3d2f13cad462.npy +03001627-1820138eca42749262e4024c69de065d.npy +03467517-d82fc6db200cdf6ea24eeca91f583600.npy +02933112-7b927d55b634c4aa178e7d331e641179.npy +03636649-44d1dac026839e25f690049a092c5efc.npy +02933112-b28d1c49cfe93a3f79368d1198f406e7.npy +04074963-468a110ac6ede4507d11f9fcb943bcf5.npy +03001627-37475326277845dc1fefdc190019db13.npy +04379243-88670667d9fcd992eadc9f074ecd1df1.npy +04379243-8ac67043fbc976138705931e60ead6a0.npy +03636649-e78c5337a56dca56bd6e55f88e701c4.npy +04379243-b4e356d1702c4ca2febad4f49b26ec52.npy +02933112-4417497ef6af4cad74555f58f0503de3.npy +03337140-43e8231e5f75409e2a78b8689a653105.npy +02871439-d9e0fd4ed360b3abd67579ede6e465d2.npy +04256520-59056471bc89a215b3fdb1a7c9a60207.npy +02933112-198cbe57b01bad9dc59350d819542ec7.npy +04256520-592ad41d80d018a2d614b159c22611b5.npy +04530566-ae1a4397815849a682b5804533e545b1.npy +03001627-3936ef166d22e60ff7628281ecb18112.npy +03001627-5e2d7d43431eea85364b7ec2e28b3bd.npy +04379243-17e171f6714e330d869e5ec10662e58e.npy +03636649-3ac0f4d87162625dfcb8d8c6d4df8143.npy +04379243-16fa03bfc61770652c5d34a902e568f9.npy +03001627-9ce2ea550b049beee64d5cb52244df5.npy +02691156-20bf5bba045e5a53fdd77aff53f4b7ba.npy +04530566-8e0e3c0c19d38ea1696cc0dd628edec7.npy +02828884-6e683e60075bff408f98ac7ca14e08ed.npy +04379243-4b3d009920bd7ff51f5bdd219902caa1.npy +03691459-b0f6ee90a22dda571711eb7e23a7e2b.npy +02958343-a720d17573022d9ac00fd1150223027.npy +04256520-ff143cdc22f23608cbde89e0c48a01bf.npy +03691459-703dbbf27ae78991a21971bc32fb0326.npy +04530566-83122dd93e3f42c08099d0cb75c1d1e1.npy +02942699-90198c0aaf0156ce764e2db342c0e628.npy +03513137-608f7c4d52bbfeec9f00d9b3defbf21d.npy +04256520-58663919dae316f31ea2c93416c12215.npy +04379243-927bf59af25793ab76e29c9c43bc7aa.npy +03636649-526251a7530426a4b3c42e318f3affc.npy +03001627-dfe0e22865575c43cda85f6a3e19b0a1.npy +03761084-19362facbca806df178e7d331e641179.npy +04379243-5f8baa8b2f5c37f3124c962aae03701.npy +04530566-4af786ed4226705279863338881ed398.npy +03211117-4116b08cd0e4e19ff799a4672edb216b.npy +04530566-223d2316bb8b74a979170a5f8beda902.npy +03467517-5c7b3940e988e7e33af041adca0b9ca3.npy +03636649-435600f37bac6ed9a28fe47978e866bb.npy +03593526-7e4eb671672af422276206fae5d3c473.npy +04401088-c771a9b2dc439adac38a7eff5af707a2.npy +02691156-2c77ff96a9b46996b963df94d2f21069.npy +03001627-bee929929700e99fad8a0ee9b106700e.npy +02691156-52185f504ffa9b32ca8607f540cc62ba.npy +02958343-c7ce82b4b1e795b0cfd826dd468a5497.npy +02691156-b0fb094d1f0fc2a6766c6046535346e7.npy +03691459-cb3bc7b6610acb7d7f38a9bfed62447a.npy +04379243-2368a815da89faf940b559ef47048b86.npy +04379243-d58af24ca497ba8c4b3c42e318f3affc.npy +02924116-62e11d7b19c4c15aefe4e52d7a765fe5.npy +03001627-b091984264b4600f3ba7aee980c3a0ca.npy +04379243-9cdb0315eda9e8cf9f2c21e46768be21.npy +04379243-be00704e7366ec2ceb1488c2b7631b3e.npy +04256520-a5274620fb2ba9a23862dad076579451.npy +02880940-1b4d7803a3298f8477bdcb8816a3fac9.npy +03001627-893c689b192bbe33ebadcdfba7971b71.npy +02691156-ac06ebedebe86a7b4c3a35cee92bb95b.npy +03797390-ea95f7b57ff1573b9469314c979caef4.npy +02808440-67855525b642d59344221bef0fa3c36b.npy +02691156-6dccca8485094190be13ce34aa7c0c1c.npy +02691156-1c4b8662938adf41da2b0f839aba40f9.npy +04401088-98b929df60f9ffab49f9ea699d984c9f.npy +04530566-8f2eb4f44b95da78639e286420a03c3f.npy +04090263-a982e9bcf097e0e595ff232cd38210b4.npy +03467517-fca53c92b6e4b3a1107cf6d75b4a137d.npy +04256520-2f0f7c2f9e3b04a8f251828d7c328331.npy +03948459-592017db407391c68e7e947594effe19.npy +03001627-67713c9a313ece7226f51cb1aef0ea9c.npy +04379243-dba5223072bb092f76ff40a3c0e00e06.npy +03691459-b6f154678c06f537db24fbbf172c2159.npy +02924116-953520d61781e569d26ea7e8aaac5b9a.npy +02958343-9650fa63c6ec14fd80700cbc107b6f7d.npy +03001627-fb0c9739b5bd880ec15f2f972dbc5c17.npy +04379243-ccb8c52ff9e7a01819fb4103277a6b93.npy +04256520-fe3d9267a166c57fee7d178666aae23d.npy +02828884-b20fb19d75c00c9aad5067eac75a07f7.npy +03001627-6ddc64415a10f4b7debe318339eaf996.npy +04379243-195a2ed4931241d3c3bd24f986301745.npy +04379243-9cce8b636c333950eb98f4ac131ee005.npy +04530566-e86aed19f3272118e8340a4561cb4030.npy +03001627-3a0e392db610f1a1504d5af97121b5f.npy +02958343-fd50bc89fc1c1cfb7041f1c5e7744b16.npy +04379243-519ff6f082f8c41692f109aef7d7d6fa.npy +04379243-7c7c705c9f3b0ced3002761e7a3ba3bd.npy +03001627-74ae50b70108ca1118775c05a821f9ab.npy +02933112-8fd43ffcc981f6eb14038d588fd1342f.npy +03085013-3bd591ccdf575c261a6765dcfddfd63.npy +04379243-5431993203dfcf797ec12e029bc725db.npy +02828884-23ce36288382e8285710c881d369ccb3.npy +03642806-93fcc135217fdaf5c9614070d3269898.npy +04256520-36d43bd7a4f90e69e2ca61e91f2755b7.npy +04256520-d0dd5aeb1384125bd0cd98de57e6803.npy +02958343-5f32aca282eb9167ff1370452e3a0154.npy +03001627-512905c0211b947edc6f96c9bb9e3ae6.npy +04379243-e490518bf6d40e138288267d39a90f5.npy +02942699-cd5fd9a2bd6792ad318e2f26ee2da02c.npy +02933112-5523a90c230a1d0699bf8547ee35d38a.npy +04379243-58b58d56e5bb2faa16fafea97f025a07.npy +02933112-6ba512e07979da6ba3f4b1457e62c2b2.npy +03001627-30cd71fcd7616421177b96a1e00762c3.npy +03636649-e86bed66672425464492223278b0e937.npy +02808440-fca2b158f36e31559ce9562d3c10079.npy +03001627-89018ce4961c76cd5a8ae8f7c307d01c.npy +04530566-1b2e790b7c57fc5d2a08194fd3f4120d.npy +04256520-beb7e6c36552f509de008fce66fdc56a.npy +02958343-e4b1de221f2d66352638397725e10cf9.npy +02924116-48709357d52fb59bceeb72b524f3e0ca.npy +02958343-ae1c1141ce4bfde9d66a73de5847ea37.npy +02933112-9e6434ba1ad59fa611fc2b865c2a185b.npy +04554684-8ba3bb4e5f54bc15eb2160f94b208571.npy +04379243-a6c888f2d78e83075936c7265c890fef.npy +04379243-5f66c21e40105601958cd9a7e5831839.npy +02691156-7c6a2879e359f505467f6b8c6b1d352f.npy +04401088-7757585cdde7953d86ecff2582325794.npy +03593526-1168c9e9db2c1c5066639e628d6519b6.npy +02691156-84a167f743ec4f4de6f558e7f4a68d3.npy +03636649-80ced01703281d8e87de7314a5215f9d.npy +02958343-f48dcef252683ce552aa494042b7c9db.npy +02933112-8094a6efa5efa16776d812857a5be1ce.npy +04379243-187f32df6f393d18490ad276cd2af3a4.npy +03001627-6d27c80c3da530d69b11da89c22111dd.npy +02958343-a421aeec78440e40d3a3ff116860ca63.npy +02871439-ee23cf56cd1dfb7ab74a28862e11b00b.npy +04379243-5fbb7a5f01f646ca5830980abc1c717a.npy +02958343-5621ebf65ffd38468772afa45900d07f.npy +03001627-4fd20c1142b642221403e6cccbe91852.npy +04256520-79df431936df0a0719fb4103277a6b93.npy +02946921-9b1f0ddd23357e01a81ec39fd9664e9b.npy +03948459-621502aa0a01864d20ded1536778b0f.npy +02924116-aed84b7e25d3de71d7cd73ccf58d1f8.npy +03001627-40ab45735f526717e25492f5f62d416f.npy +02933112-818043d8e0cc040cc59350d819542ec7.npy +03691459-22fdef9bef225163d747b49524a1246e.npy +03001627-db86d16a95437f3898cfd47a860803c5.npy +03211117-99c0bf1f81b835129857176349e96f9a.npy +03928116-8a6429797237165e63920080bd2c2ed3.npy +02808440-13cd234acf0a6b4db362845c6edb57fc.npy +04256520-875c7185cce6b8b0813204830fbed813.npy +04090263-3fccb4301ce84fbc276c3d558130f8b4.npy +02691156-6c931227c1735c329df8dd4a2554378c.npy +03211117-4476577ff4776f5fa3ca88ef9e9610f4.npy +02924116-f44b45c031a02818464bb8192aeeef4d.npy +03001627-592cf5363737550cedee0bb2b729f22b.npy +03001627-3774a2b8c71e70b9f18a36d57b7cced0.npy +02691156-6dedeb5b87ee318b2154ead1f7ab03aa.npy +03636649-c1b939cc403a0662664b3b9b23ddfcbc.npy +04401088-b4c1d8191707ead52e10692b3b33e38.npy +04090263-94a58b162f17f908ecbf498fbf7a2384.npy +03001627-e7be08b34dacaafc405e3e2b789a211c.npy +03991062-cf184ee375cf827eeee0d5e82f0b9cab.npy +04379243-fb0459ca3947e2fecf5d00de99803a2b.npy +03928116-b0e9391ecbf7334c4383822c87ad59db.npy +03991062-141de0993dd1f2f24efc7e7114f1b9c5.npy +02691156-28add8a00a7bcb7318d508b491dafd46.npy +02946921-17ef524ca4e382dd9d2ad28276314523.npy +03325088-941633c3da8099dc76c18e71fd49c4dc.npy +02876657-8099b9d546231dd27b9c6deef486a7d8.npy +04379243-4d484d20a59a18d3fa6df2d54fa43ce.npy +04379243-29207ae4e01c415894fc399eb2c2f348.npy +04004475-f5aee7d7732eab9bd477567e8c8a6c59.npy +03325088-b7bbe0ef4893621414b35a7d7cea7130.npy +02958343-58773b5aebc3361793680c5a9a367b4a.npy +02992529-1b1aaa9a95ae964746becd46a4907f38.npy +03636649-70bf2aaedbf9499ec889c00efdaf9928.npy +03211117-f240248beae8d20661049a5d9182333f.npy +04379243-55aea0b2f76b3f7819592f8d1b2d193.npy +04401088-96700b47eb9bf33889a1b8cd5b44ae5e.npy +04468005-91bb88fbda95ab44e8784f880dac0f61.npy +03085013-8bbe84f243cad940f0ce652372f56eef.npy +04379243-8222dcc1680112635cc877f4f71ba410.npy +03001627-305589c1e37f32b821bdbc0445d9f748.npy +02691156-a50b4b0ac82a67d0bbb9a486df472172.npy +04090263-6536ba618390e1688e4cfca4542c1342.npy +04379243-6e0fed54fcae8a62edccc47bf0dcf5d3.npy +02946921-5c326273d61272ad4b6e06cda31f9bc6.npy +02933112-4cbb978cef36a5b9c60fe2650bbe2bf8.npy +04379243-8d0d7787f4babee7e66285d36ebb986.npy +03337140-2b2b84efa6e6b42ace5d6e9371bb5c33.npy +04530566-72f4c3c433492d585001cb19c4a0eee4.npy +04530566-476bc79bd6fec6b088f5c2d4f2395a95.npy +03691459-80109bf3b6904d577edd21390c628646.npy +03636649-1562318ff0c62163a488756a9c41f7e.npy +04379243-8383a9cf1380405dd9006da2b93c0a4.npy +03211117-df624231ef05b83d54c7ab6aa5674ccc.npy +03046257-f1ee996e8efb941ad8912880b776dcf.npy +03001627-88382b877be91b2a572f8e1c1caad99e.npy +04256520-a6ee2e98e8ae755f37af16b2893f1d4.npy +04379243-c45fe6d9f2c516997062f2d72cde5c95.npy +02876657-204c2b0a5e0a0ac3efd4121045846f28.npy +03691459-fe4ed2d72cc79c74b59e9758ae7f41a7.npy +03001627-5fa5f75741e94598e6fe3612af521500.npy +03593526-b0f75a497a309499816c17dd8398ee0f.npy +03691459-87e2d9c72eeb8c49f398d0c5832df00e.npy +03636649-1d2c2f3f398fe0ede6597d391ab6fcc1.npy +04379243-5275e0ee91ab4e755d009c98a5b96836.npy +02808440-10caa8d340fa0fddfcd4910413c446d9.npy +02924116-9986dd19b2c459152470de2774d6099.npy +03001627-3c3b33293af7459f2677042d71d00b91.npy +02876657-3ba7dd61736e7a96270c0e719fe4ed97.npy +02828884-90a8b80aa2fa209ca936e2693dce34b6.npy +04530566-98da594a65640370c8333f6c4d99e2c8.npy +04090263-efd09f6901b098e4eab5ee569c9de1b1.npy +03325088-bc30d9336c644592ff2c92c2a4f65876.npy +04256520-9e0feaee4da30fe7fa038765e58dd68.npy +02958343-e24f388736f4e6fd2cdd250493632937.npy +02808440-148ec8030e52671d44221bef0fa3c36b.npy +02924116-c5f11b1e82bf6b1d9aff919557ab16d.npy +02828884-78243d42e55bf254d47bd31d526e1987.npy +02958343-6eba2ec65e8e44ed5545896d1a9ff5d3.npy +02691156-b509fbbe99df854f0478431b5ad57db.npy +03797390-89bd0dff1b386ebed6b30d74fff98ffd.npy +02933112-34bc619e8ab3c0d2a93db6e4c0c75191.npy +03001627-59c89dc89cf0d34e597976c675750537.npy +03636649-b6f69dd63be9146d14f1e0019ad6a8a8.npy +02933112-c2ac91973d449b18738e43095496b061.npy +03001627-e0badcef3c110ec6c4963b39d8846214.npy +02958343-6c339c89246fe6a651db49e653372c20.npy +03001627-3020942d1547cf562056b4bd5d870b47.npy +03001627-4030ea84b560b857febad4f49b26ec52.npy +04090263-b69973526e91e3bd68407c8bfa49d3c7.npy +03001627-f215c608fe63e97d4aada2bcdc05aa43.npy +03948459-1e93ef2704131b52e111721a37269b0f.npy +02933112-3c6b1e5888e5fabd9463d0e381798ed8.npy +03790512-8b2e7ae8b0f0d451d97964d17de80d2c.npy +03046257-48ed307c035fe99e49c212147ab9c105.npy +02691156-94351a82955a6136c3f40f6a57084ffb.npy +03001627-3684490885c259e688235335f9e630b0.npy +02933112-3483076cc008fff0d9826d0ff198257e.npy +04379243-8ec96360a8674db5b000f20a5153622c.npy +04256520-3425e406f20e69efddfee72cbd7395cd.npy +03467517-3a520944e6265920aff103adc6dea0b0.npy +03691459-7628ba96cc90fb4df256a8c3e3396495.npy +04090263-74b95139078ce0dfacc2abd6f796df4d.npy +03001627-661fcd8f87d948f2fff16555386d173d.npy +02828884-9fd13f28f9260e65ad5067eac75a07f7.npy +03001627-209994649e7fdf052ff84f70e18e9c53.npy +03593526-c5beb87c12986f859f3323e6dbd51308.npy +03001627-5bd3e7c9695af73cc8687ff9b0b4e4ac.npy +04256520-5660a383172900a6593ebeeedbff73b.npy +04090263-73cfed37f9da046de2bb19fbad3e4596.npy +03001627-50e3f09b7dc9fcb63fde2470c949bc26.npy +03513137-adf9b0eaf3a1980187710597b0363fe6.npy +03001627-4f7523a3d276bfae4b3c42e318f3affc.npy +04530566-bc09ba292bd9e684610faa04834ad4e6.npy +02808440-b14791a6df68c09fde250725ad622108.npy +03001627-22bee1d9c6357b295493ccf8f26ab2c.npy +02992529-ce62e8c8a75a501535c433f6b651ec89.npy +04090263-64021a29f7245e0fefdff89bf9a96890.npy +04256520-50c1477484688492bbc7a6acbd8f058b.npy +04379243-575a8eca414c69f67bcb070cc655f13a.npy +02924116-b0780e992d557b7a3a142219f8bbebaa.npy +04090263-f172b2748cdd7027d234b3cff759c4bf.npy +02958343-35d8d94bdd379556a37f3fc191551700.npy +04256520-57f5a7660b1f186e14038d588fd1342f.npy +03001627-e19214cabca496a3f7b54e04c7238d7.npy +03325088-22d924ecfa024cc9c36fb70296e45483.npy +04090263-294c7c64f92d3b5537c107a0a05e0226.npy +03046257-15a5bb8c387dc7ac87ad02d88bbf4aae.npy +03001627-31dacef35c2d68cd7d5059679be663cd.npy +04090263-1196978aaae2ab55537a44a51980defe.npy +02691156-14d9c576d06622198f52dc705c3109b9.npy +03691459-9a859f2668f727abf6da3fc8db3c804.npy +03325088-5d7475a12087aba3176bf371ba7a6ff.npy +02691156-47a4ed133dd37264521546825315c695.npy +04468005-3c291cef4c82a608cea8d0e97d819254.npy +03001627-3c3f70971f203c4d6ba836372832f055.npy +03593526-ac3fa82107f01502cba92cca5bb025de.npy +03624134-3dc5a6d79ed591bda709dec9a148b2fe.npy +03001627-972355f42223e6199cd431573238602d.npy +02828884-26b3257b2e094083af9ff91a3a02b5aa.npy +02958343-ffbf897d9867fadff9a62a8acc9e8cfe.npy +03642806-1be64c0aded473d38ca8637757ac3f67.npy +04379243-812dd06fc99f174e9f2349486c570dd4.npy +03211117-9c8a2e3431b0b2dda2cc48a1579329e.npy +04256520-ace4472862ff3f6d917b96045c9b6dea.npy +03001627-c236deaff8c6fb0d29c9a7a92b0a566d.npy +04379243-affb5a80f11b383e1c25d54737ed5c8e.npy +02958343-a72134cd499fd1c4f79e091fa09130a.npy +03001627-1bf710535121b17cf453cc5da9731a22.npy +02808440-a9827a6ad29326ea14c8ee9aa2f8e72d.npy +03467517-1abe78447898821e93f0194265a9746c.npy +03991062-d8feb207fb33eadbfcd4910413c446d9.npy +02691156-e954dc13308e6756308fc4195afc19d3.npy +03691459-ea1b716cdf033bc4bb844bb01fa51c1f.npy +02828884-a001663b61ea6accf4fb4dee5181bee.npy +02691156-b7b8ffe2f07e4eff95dfd5eb5f06d19.npy +02958343-f882454f6fe1c5bcc0e3666c7d0ec7d0.npy +02828884-d5ef0f9bb990ffb3b2725423c902ba5d.npy +03691459-b2ae90026d7979d8267014f0fe84b7ec.npy +02954340-14df58bdedfbb41141edb96d309c9a23.npy +02828884-51d51b67faf16d3d2ea98d69e91ba870.npy +02828884-3feb79684658db043efeb398bf800e80.npy +03211117-46609dafc47fdf2b74b687cfa539ab78.npy +02871439-82b55e511522a942aed93548190eee8.npy +04530566-50c0bd9933f7259fe59358c5e6239c84.npy +02828884-e5af69132cc95133f155d75bbf62b80.npy +04379243-707b9fa6a564ba0e425fe98d8cc1c2c.npy +03797390-a0c78f254b037f88933dc172307a6bb9.npy +02876657-640835881dd33a2d30354e87bd14ec69.npy +04256520-954efb8e36610d1bab610b0c94236463.npy +04379243-28de11ca3a3bfc00acbc34d1ed23b6a.npy +03001627-faef9e4cff5fa61987be36ce60737655.npy +02808440-bf8e5bbe0e0938d98afd316e82119b42.npy +04401088-2caa10c91355efe6ae2545602370c249.npy +02808440-6328094d59f1221d7b57eb4fc830f67b.npy +04379243-482a76d14781e55e25374da32e705c.npy +02828884-ab1c843def8b843bed98cca8f0ccd5f7.npy +04256520-bade4726190d638498614b18e654375c.npy +04379243-c57e4f64b18e9b9aa320e34dad7c78bd.npy +03691459-7b8aedba3024ed389e87d2bdcb41f548.npy +04090263-8fc390879ead5efea0834a5219dec81f.npy +04256520-c6f1601208aa5e72cde6b082a301e49c.npy +03001627-ff14d078e2f0f8c65242f8291aafac22.npy +03636649-ba05811f301cdd791735ea0e092a805a.npy +02691156-bd066f14adf6c0a9f6639976815d96b.npy +02828884-fa4d4e697d21ec65512d71be7dbf2d60.npy +04401088-4b97582ec707108c6ace02f573c40387.npy +02828884-41120a43b6b7c93210399d5a44e67cb5.npy +02958343-66828747e0e7671021c7b87f47c77e12.npy +04379243-ece476ee957a099f5c5fd2c2f381b61.npy +02747177-90ad7e8c047b2dbe4c86b1fdc94892eb.npy +02958343-5b1c430ced749ac3897e805df74453bf.npy +03001627-97bbc8970b05c4a3fcde6bcb709edd9a.npy +03001627-908de4d82bfb422ec43a4855019be9b5.npy +04379243-faeebcbc4798714188b4ba3feb03ba8c.npy +02691156-dad83c903379cb9cfa585c96250561a9.npy +04256520-51f11001548cc8c0febad4f49b26ec52.npy +03211117-7f489cfe5174ea20c29a46091cf24cad.npy +02924116-886e97687dacbfef4fb1d9a9b8854179.npy +03513137-5f0fab98fec5f53bfac6099f3d4830fe.npy +02924116-9482cb79520f1f0dd75a864e79808b6d.npy +04225987-39c8a4798087be3e20d56eaf7c8da531.npy +04530566-edb4574369f95b50689cbb453f479f9f.npy +04090263-3efa6bed63249f928bd9de6b28931bb0.npy +03001627-68f1d9f63eae2b5123c1b1df1d480bd3.npy +03001627-107ed94869ed6f1be13496cd332ce78f.npy +02880940-ee3b4a98683feab4633d74df68189e22.npy +02958343-4e384de22a760ef72e877e82c90c24d.npy +02818832-66eff63edb4f5b4caf5b95a62b058b0.npy +02933112-1676f8b995b976e5824662341ce2b233.npy +04330267-de4301a3ac6e17e9843f813f752a5e35.npy +03467517-d4b021a085d836dd2b996d5d44e09408.npy +02691156-bb7c6c397143f72fe0cfe7507a46f0c.npy +04468005-d8a75faede3de91de75a0b04a57744.npy +03001627-55d147c5125f5043e1ddfae8bbce5fe6.npy +03001627-219c603c479be977d5e0096fb2d3266a.npy +04090263-cb5e01162787772ff7bd077790d66b82.npy +04554684-b0b77a2d6816230c99bb3947ecdf7d2b.npy +03001627-4a45de600363af6bd5cba62773b8025b.npy +04379243-375972fee9a2a6e28d2d730aebe7865d.npy +02933112-4205bc230382f663c59350d819542ec7.npy +02958343-26bc52b1307fca053e5ddfb0ef6345db.npy +02958343-d10226fc9aee707972a38ac2b8f5cd48.npy +02818832-fda18f335dde3c6898ee36f046181d28.npy +03325088-f6666b97498b17853321831d2245cf06.npy +02958343-a7f8cb46717528edace5721ccacba16.npy +03691459-fa6e17f7f928e8a44b2f94f4017fbbbb.npy +04379243-634fece55dc20d232a978d3a5b04bbfd.npy +04379243-2bac94c17bb341d84ab0e621f58e2d20.npy +03001627-a50b78207ec2256168d1b9a1d97e2846.npy +02958343-1b5b5a43e0281030b96212c8f6cd06e.npy +03001627-8f217a409c5407ade6fe3612af521500.npy +04379243-bd2949103a92dd56d3dad974dc098fa1.npy +02691156-9f9cc77c5e32664e6a8a5e39588ebf68.npy +03790512-89c948e75d1c5cde27e168bcc3c092cb.npy +04256520-43507f90235fd3214038d588fd1342f.npy +02924116-1bc9264f1c92b69752470de2774d6099.npy +03001627-b233a919f5d2f6ac2ad490d4d7fae486.npy +03467517-2ad699d80ae93ae793f0194265a9746c.npy +02808440-86880c061d80ebab3956bf2322987dd4.npy +03001627-fa041b0276dcaaaf98e0d1738edd4f19.npy +03691459-52ffd6fe29e51364b21928f7573b58cb.npy +03948459-ac88c6856c21ab422a79dd7a0c99f28d.npy +04530566-a6571d7e2c8f6113b05dfc874f00d5f3.npy +02828884-a857f9d4838b885f2056b4bd5d870b47.npy +02933112-a09130501c18c324404449202e2d8881.npy +04379243-504d908a55f3e0c764810cc21086da42.npy +03001627-2bd6800d64c01d677721fafb59ea099.npy +02828884-5b5d3f675f8d0bfdd2b12aa6a0f050b3.npy +04379243-3372c6b94fc719b9a75d03186a0409e2.npy +02958343-99cc91ea3f0b646be79303516c6edeef.npy +03001627-a89450b61d786e4d115013480320769f.npy +02958343-a495bebb2ebd72f3dd7cb6e3ad90d3ea.npy +03001627-78cf0ebb875de8dfba18ade30e563d37.npy +02691156-f5a667f5796b9a0b9a6e43b878d5b335.npy +03211117-f5b05e9eedcbaf9cf4d1910799b338b7.npy +03001627-8999368504d4374ce4e346ee2650d150.npy +04090263-5d2c6ca737f9accf683e3750b53385d5.npy +02691156-3fa5f65a92a5e521d87c63d8b3018b58.npy +03001627-13076ebf8b5cc457b8d6f69a14683de3.npy +02933112-9ffdd44e709142551b4e9ccf27cd840d.npy +03001627-5019265bd6215c9ed54fd46ccb781717.npy +04256520-1ee15a07c2845ab1b9f43426f477bd71.npy +03046257-223a78dd9e6999e67c0ca8d7a07be3be.npy +03001627-3895b96949fd81c5f07fee5fc5c45ee2.npy +04256520-57094371244c13fbe4ee93147efa8cb1.npy +03636649-b6953f683e8b3feb9571d807bcd25673.npy +03636649-9a244723bfef786294cdfc338037bd95.npy +03513137-ddc07c47962fe10f61f42fcc6613af2d.npy +02691156-cf0cdaa94220ee3f4c3a35cee92bb95b.npy +02871439-e3ae56f176b77359aa1bd50387389420.npy +03636649-eb311e6232cb7011bb5bd941c6665c21.npy +04530566-2d136ffca92d9c4e3639e751e7f78cf0.npy +02924116-60a6ad222bb446721bdb28bea09e3a92.npy +03001627-904ddb7762488b1b5dc3653f8341633a.npy +02691156-e110c699f2ed6511b53a02c8ab03ad65.npy +03001627-e9ccf4cc84c085f8c785f06f424b9d06.npy +03642806-a7f983f1d0642745135a402b573354e4.npy +03001627-c20a354161c28f6ed4da89766e80607a.npy +03046257-a14d909e62adb668661782af60b711.npy +04090263-5fde8eee79ab6885f0c705d37665dc32.npy +02958343-42ca4f6a7d7a39712a9eb0f146e94477.npy +04379243-2575d3108a55adfaba0351028b825931.npy +03948459-8fa02aab7237289667fdfbdf64f19325.npy +03636649-4cda1ff0899a6fd5f58da08b07a975ff.npy +03790512-a54e8fb64e5879161253ed5a61502f52.npy +04256520-93676b6ecba89ebb38449598167b268b.npy +03001627-ed108ed496777cf6490ad276cd2af3a4.npy +04256520-dc62af0b1d8af2c676e9713f57a5fcb6.npy +02933112-5893f6c94b15ba204f3443b22038d340.npy +04379243-83cf3765597a631e4ef113421a70a46.npy +03046257-44a961d1870b2279626620faac40b883.npy +03636649-aa765d04e997e36a1742918a871fc8cf.npy +04379243-b14270faa0beb387f36ea1eb6542fe7e.npy +04401088-cc6c216e25469966bf14f57b214697e5.npy +02871439-3bff6c7c4ab1e47e2a9a1691b6f98331.npy +03467517-e59ccf98ad868a758b1a3513f58ebc5c.npy +04379243-53b1f1781eb6339f5f4be3ad507aab92.npy +04401088-3035c3d7d7eef1fc952c851f81463faa.npy +02691156-7addd02b1c255edcc863ab010b80d9ed.npy +02871439-c3f572493adf0af810b7af17eb4b15c9.npy +04256520-511d9b4ffb8ad21485b479b317175b55.npy +03636649-627ed898c49543594c64af119029e57c.npy +04401088-1c87049d11292c5d21e2fbffea258ad5.npy +03261776-ca1c1c9aba8f4491a656de49935d2359.npy +03001627-92c068abecb15e1adcfd6ca2b952d624.npy +03691459-782655d93313d14726ee873dae10ece7.npy +04090263-164fc79c2ecf843bc8e292146f3d4d52.npy +02880940-45603bffc6a2866b5d1ac0d5489f7d84.npy +03467517-7946e354e342f560c5a468097fc791e4.npy +03211117-5bccf9711e1cfcc914e970d26b98a862.npy +02924116-57b3c60a91e930b42cc89196d0104054.npy +03001627-2ad02c9ed22b03727f141968548cdc00.npy +02958343-b16a147485ec40b25a70c4e5328e0b9f.npy +03593526-a18343c4b0a8026faca4186c3b7dd23d.npy +02876657-2cc108080535bc51e7a14f6d159dcd47.npy +03001627-a8756f91fe03b962492d9da2668ec34c.npy +04379243-345c1bb95b12ff8c013a7bed5288654.npy +04379243-3a69ef9c6512041768c981036afdae64.npy +04090263-50b8d57468b748c9f471ee8186a0fef3.npy +02843684-7a2642b37028b462d39f9e7f9f528702.npy +02958343-7db6c18d976e52e451553ea674d2701f.npy +04256520-27ff0317be31b5932c4e6cb98409dcac.npy +03001627-e50a97aa15d7cbc5972e15b580d9a5b3.npy +03001627-bb4f5cd713a817727d4f8900c5174db0.npy +02924116-3f20a5b51a68667941cefd10ce5d6cc0.npy +04379243-13f2a907f3ac7dfc9b8e42d3eb7abddb.npy +03636649-b6200d3340e31bf4da2dc0e73fb5c1f7.npy +04379243-ddb760d364ee3c5aa7257db74b7b377.npy +04004475-951ea8eeb141a54f9f4a2836426bf029.npy +03001627-e6f37dff25ec4ca4f815ebdb2df45512.npy +04004475-27c2d447b0597c177d9df21a696a9ee3.npy +02924116-2a594ade8abd8f816a7e70b9f461caeb.npy +03948459-fa12f9633aa3c6c9150e6b54e0dc098c.npy +03001627-1b05971a4373c7d2463600025db2266.npy +03624134-c19088b4c32c0f1d22b38218e60be05.npy +03991062-ecac13674a7d2d5be44bad6fc9badfe7.npy +04379243-9081c28e6a90fab1698da6fabf8a99e2.npy +03001627-de9e40c346ad2779f8c3d2002c77ddb.npy +04379243-a516711827a396085528d560ddea455.npy +02946921-f6316c6702c49126193d9e76bb15876.npy +02924116-dca406daf4b48e6760a4e5b4a0135038.npy +03691459-65b461241dd4a4698152e0baa78ddca4.npy +04530566-1e127a7ca9bfcba86df38a7dd1b448e6.npy +04256520-872e3d94c4a37f00d9b53420a5458c53.npy +04379243-f3a44bf9a27f1446ae23680cee12f145.npy +04379243-d7f9651b64c82c799e7c6a73ef46f40c.npy +03642806-a66e02f0effed39f4145b5f47fac09a5.npy +02958343-12d463649ed6c176ab98a7077c964a60.npy +02691156-6e7bc6995080fe6542ca265836030911.npy +03001627-b9e93c2036f24661ae890f02c6b951ff.npy +02958343-385f12fba67e43ada9fe1734a6086750.npy +04379243-95c2e462b2c3e5e529d8eecf3827c486.npy +03001627-b7316f361054c8501962281db2f162a0.npy +04256520-790e42476f871e29e0a954c49a0c328b.npy +04379243-594ca5d155b0bdc2c3bd24f986301745.npy +03001627-7049a1875e1b82d71f8d8332ee17945a.npy +03759954-db4ae89650e2d483d0c3082093ab9709.npy +04401088-113303df7880cd71226bc3b9ce9ff2a1.npy +04379243-b95b9f2d28ab42e49bdca9b7303475c3.npy +04256520-5a2da4b824000054d8390ec1728b1e3e.npy +04090263-9a8ce31de8d6f549a5aad165050e534c.npy +03001627-b117b01ab380362db8134b0fbf68257d.npy +03467517-c96d3c76605bb8ce552ddced979ec9be.npy +02958343-d9cfad911b26b2ae5690f18c88ad5b9e.npy +04090263-b4ad3d030491a7768aa7cb0651220ba4.npy +03325088-83c02a3da44759c73321831d2245cf06.npy +02924116-84b548a6c1b3d7e6c8af801085947b1c.npy +04401088-dd8b9ca9abc834feb5784fac792d6797.npy +02924116-b88c90b6cd62087bb1626da45836ca54.npy +04379243-317c099a20806d10b5c1550bc8448972.npy +02691156-42dcf7058ed936fd22362be7f5226e91.npy +03001627-71dfc2ea8bd6cfaca8e4e5c9426fb9cb.npy +03001627-6fa2db75b28cc1375c728bbce49718a0.npy +02933112-4bbac921678eb957614319d7d997614c.npy +02933112-37b9ca6c1be7e6e7cddef51ecbec6f95.npy +03325088-1f713f9a9ba4eca2b362845c6edb57fc.npy +03467517-7b93f4df48c5e3c4d22ed761db9f24fa.npy +03636649-1efd03d9264973c9f2098a9f7fc86999.npy +02828884-1be83cdaf803fa3b827358da75ee7655.npy +03325088-1f223cac61e3679ef235ab3c41aeb5b6.npy +02828884-f8137efb3a8bf9c3d2b12aa6a0f050b3.npy +03991062-fa392260102667eb612edac3a429aa9a.npy +04074963-e76784a475f7aeb57e1c85c5c15da7fb.npy +03691459-51bdaff7782cab384bde7bbe88086aa1.npy +02958343-f8c4bfc065e35555aa44bfa127abe4bb.npy +04256520-a76a2d34a1aca99611e76965808086c8.npy +03001627-7217176942b8fb42fa7b9a6c80e4e324.npy +04530566-75d41ee15fc8fa4cca581939cd410ca.npy +02880940-98d3408054ab409fd261c3d31246fed3.npy +02691156-dfa5d6ed898152d34210bb5f1b1324bb.npy +02828884-b788370bde4ecd578a333b44b8649ff.npy +04090263-e444044f8872e3b9e1f2a1daf140ac9f.npy +04090263-607b9d1474c640fb3d7c323cf1653143.npy +02691156-bfa8e832618454c0a179137acc8d4437.npy +04090263-27257aee4b0f91b1a16c70da5e24216f.npy +03636649-a4f6213e0b627da55637847f2942f876.npy +04379243-763fe8469c9d204931a818ce55e517b8.npy +04090263-ff5319e43471e9294b49cd65dfcc3a9a.npy +02992529-401d5604ebfb4b43a7d4c094203303b1.npy +04530566-7eefcf457d32b9b03146aa85e47ab8e1.npy +03001627-fc723b936f8d8443492d9da2668ec34c.npy +04530566-81c9e9d3f461c4da9917c7f0cf5ea813.npy +02691156-171f4e9ffda674f44f4fd7b0550f5bef.npy +04330267-826cea6d1387d794e793cc5433bece89.npy +03928116-d31d78811a2028e7d0683b3f1eb1a170.npy +02992529-ff1e484e02e001bdf8a0d9b8943b4050.npy +02958343-72d1eb25d911b6d8913eef1194316fef.npy +03593526-43816943fe7907124e806038192890dd.npy +03337140-d2fa80249a7d959091c352d02061b3f7.npy +04379243-729ff2cedd68a1ad489b0e2838fd952f.npy +02691156-33b8b6af08696fdea616caf97d73fa02.npy +02828884-36d1f0331d7f4ad2cf695c8970a97c29.npy +02691156-831171fab182f62eb115cf6cc3371017.npy +02992529-144d8038c1688e37ab3dd76bf33b0f5e.npy +04379243-96cd9d2f9dc5e102a8529d50958b092.npy +02691156-a5be00166e57ce5dd92de1e594e3dc28.npy +03636649-978df83c1cee012729a60d6ab40898d.npy +03001627-b8b5e172ee58899df2d9e72ba502035.npy +02958343-93357732c6306cb51673e1c313348a01.npy +02933112-2de782c81c89f704c2b64c0adffbe398.npy +04330267-108f01e1b4fbab56557991c690a01e0.npy +04401088-d98df8313cf5e0a7814fa32b2a1183d4.npy +02958343-3ca3c91dae8d2cbdf56f8ea3d9016e55.npy +03642806-7ebe5cc71bdeebd9dd70b866e1cfbf35.npy +03001627-c0b10448880dec62056b4bd5d870b47.npy +02958343-8ed0533fb22f972cd76439fb95cdd2ed.npy +02958343-20ece5093ff8da0bbda72093f9b5aa73.npy +03938244-98159cb7eb8bad07c45c0f305d0b6e87.npy +03636649-e94644a89151a426876b50fc31ccedf9.npy +03001627-297a74e1a658e231f51f77a6d7299806.npy +02958343-79d9cd9a0cc2184ffcc96966174e5650.npy +02992529-325ecc3acd232a5e981b9cd34407d026.npy +02691156-6c432109eee42aed3b053f623496d8f5.npy +03636649-86ae11f8d3079f0869e321f074c1ab85.npy +03991062-f4cae0649c1d4c6034c8ebd75c7d8f3.npy +03211117-c47998c0a317c60611ea7f12f22c0e84.npy +03001627-90dddd5e4aa586bf14513156cf2b8d0d.npy +04379243-710f2f56520b0bdd9b11da89c22111dd.npy +02958343-5f742b43bd5884c6a352068a7fd7afee.npy +02691156-e8c1e738997275799de8e648621673e1.npy +02691156-3a756cbf87c9a6c64d210d9468aedaf2.npy +04379243-35e1541babf368d83328d823e2d2a6d.npy +03593526-420254a2489912c13f8d8f0f2ad2ee2.npy +03001627-2c03bcb2a133ce28bb6caad47eee6580.npy +03790512-b3582e7abddb916c3722d6e4d79b71be.npy +04401088-53cd656555da181db6d41c42f7ade8c8.npy +04530566-6847480bd905f05b544654c1c7449887.npy +02828884-366db933a2c99444f4fb4dee5181bee.npy +03991062-41415d201e1e6b6c78caa162a41a851e.npy +04090263-c9e3dcd6cb94418bfbe54b5d01550.npy +02924116-b31ae15dca8bfe3028c832d54092e2c4.npy +04379243-e80016d5886fced69f8f9f2bcc40c84c.npy +03001627-5b2cfa084b8cfe389753496ba23f2183.npy +02933112-221c831217721399ac043ebb2140dae.npy +03001627-8914307dbc15a20387f0bafef1e13471.npy +03001627-bc61ea1b9348f456492d9da2668ec34c.npy +04256520-81180dfb3874d4c76dc992d5c5e6b2e0.npy +04379243-4d43e9b908d77ddd2d19175e7d19b7cb.npy +04530566-5c9d5cedcb75cd2bad7daee13cc76c38.npy +02958343-167df2c10c116eb5d61b6a34f3fd808c.npy +03325088-b6a6a851039907c433a676b484a36f68.npy +02958343-3b1ad5c98cd92726b60a292fcb118b54.npy +02828884-7b7b25e8ab725feae76bc197b3a3ffc0.npy +02876657-4ec31503deb053636c19a70b7478f722.npy +04379243-eef44075cd1781f1b0a6e87d5d5521b6.npy +04379243-2b1747c389f4d4f1ebadcdfba7971b71.npy +04090263-f2e592962a9df3de1d27f57617a4976d.npy +02828884-b2a585ba5f0b4a25e76bc197b3a3ffc0.npy +04379243-fa5d7f9c54f5bb2010b97bd228fca721.npy +03593526-9215bfacbcac3cb67697d9c3588bbfc5.npy +02691156-f73a8fa9c2859211f2b0736dd4d8afe0.npy +02828884-7df3c8885b22900ec88ad71674956292.npy +02958343-8decf42b145f98d148d2ba4615e03b21.npy +04468005-108baba96ac2f9be5f73a346378dad81.npy +02691156-22c11b2bab2cf93fc1ccec171a275967.npy +04379243-725fbbe72a41e6feafc1aae4dd82ec1f.npy +04379243-884f8604518cdc98c3bd24f986301745.npy +03001627-3896caf2057eed81589929e81650825e.npy +02958343-a39ed639d1da66876d57cf36a7addb49.npy +02828884-3b2f0fa67b29b6cd389a52d0b0203298.npy +03636649-266b5e8e78e4c0dfb82cf928f6ed5338.npy +03691459-12ddcbc94fa909502533128de72c17f.npy +03001627-ffd258571807e6425b1205fcf56bb774.npy +02876657-9dd18bbd88df283a6b36e3e6a5b248ba.npy +03001627-ff2333f528efd790fc93ece3545739c4.npy +02691156-d24f2a1da14a00ce16b34c3751bc447d.npy +03001627-79fb74d29b9b772c36b0f2a1430e993a.npy +03001627-a07f62023d3784839aab0d90d6455f4a.npy +02958343-fad616172dbd52649f06afd991af5139.npy +02691156-a20490d0ffcd3be6e0d6812cdcf8799b.npy +03001627-b192cda468f9390aa3f22b4b00de6dfb.npy +04256520-4ae401feb8499f5c9f2349486c570dd4.npy +03624134-612870fbbbbce57ffcace4d823343363.npy +02958343-40b272e537fae1418277d1ad96e14e9a.npy +04379243-516928532093f765bababe11fcea8796.npy +03001627-508450cc9ab2a5fa98cfd47a860803c5.npy +03325088-bcf485906e70fb0e50da8b99982a3057.npy +04530566-fad2e708e354b0315e585de41f56d4fd.npy +04256520-9eef66b5d0444f8398cfd47a860803c5.npy +04090263-36299a0fd2aebb5b1cb4c4614a9a037e.npy +02933112-83412e29d5978b101f6dfedaba98d5f9.npy +03001627-2a56e3e2a6505ec492d9da2668ec34c.npy +03636649-312d6dc78d666dc88a74e38e7d86eecb.npy +02691156-b9ba988dd9a6cf426e8b6dd39a855b69.npy +04256520-ffa7680b18ede5cfedeed2a7fa983956.npy +03759954-bfca931e3aa57d06ef026123226f5519.npy +02691156-421f45774389984bea6586b61968eac.npy +03642806-8489cb783d249651b674654e7bbe623d.npy +04379243-467e71e8e546721e1aa023603cb7e1bd.npy +04090263-5b7e127c67c72e72f6ebd7f0952711c3.npy +04379243-7b2af227264af938d42b9650f19dd425.npy +04256520-d510edfd51ee8a942dd4967de4160123.npy +03636649-5428e217da1af02822a33e080d0e71c.npy +02828884-8f25e1c5977cf1350f0339a8f91fdfe.npy +02924116-150004fead49c0b2193d7855ecfc1bd3.npy +03207941-a5084a48c41d1c454fa5742b9f971b9f.npy +02691156-757c47e20a37647431e38f024b7ad042.npy +03325088-74d1b8b026ed9dea3321831d2245cf06.npy +03325088-f5768e78c91ac91dd5fb864340bb146.npy +03991062-a002b46a27eedc46abd0967c9a744f48.npy +04256520-bf30f90b1c864bc2d5cb6d178687b980.npy +03001627-e039a013f1877fbf42bd71dd667c95ad.npy +02691156-8d148580eda6994c2a8810071030bd25.npy +03001627-40d4acc240c458a970aa4d5182ecf167.npy +04090263-d3a7c0fd2e4418861fe7d5784ec6d0eb.npy +02691156-b51c1bb30371852fa325f626d0051e24.npy +04401088-5ae839d512364bd4da0f54fde38627c3.npy +03046257-9b66a37c0e1a1da2d4096e81fa01e27.npy +02691156-77a70f61dc0c6260e70eaaf99089d5f7.npy +03636649-7be01530bf43f2ed8a83637b92bdc7.npy +04530566-5b86640d3bc2e43decac3f40526a2cc2.npy +02924116-c08377fec8061e8ab1626da45836ca54.npy +04530566-787e381b4a968a55af5574caf3b1433d.npy +02828884-371e22e18f8e2fccad5067eac75a07f7.npy +02691156-dd9a7dd5e2ea3389938204d34a891739.npy +04530566-8eeb2bec8499fc6ba60ce6f0a0028c13.npy +03948459-9b6c6048719e7e024cb47a45be6e6ae3.npy +03001627-c520bc9dde7c0a19d2afe8d5254a0d04.npy +02992529-c2884eed47300891697f9662a764c78.npy +04379243-757ad2516284e2728d3e4a6c55f660b8.npy +04256520-13b9cc6c187edb98afd316e82119b42.npy +02747177-16521a9446e3de14a6f567d4d1e09ecb.npy +03636649-31dee666120727b0be78c8b300d2a963.npy +04379243-ee5f0411fcff59951105a3fc18779f13.npy +04256520-8760843dbfc059d6c242632b2a8c3129.npy +04090263-6655be7932b8b984c04419d9f4e18d0d.npy +04090263-280cbd90ba9cfd24fc105e275e6ac8f1.npy +04468005-e5d292b873af06b24c7ef5f59a6ea23a.npy +03211117-15f23ffcc92b751af7502a3b84f78df0.npy +02691156-776c423005dbb55d354aed6327ff24db.npy +03001627-76ab50cc6491e518782f27684f3b650c.npy +04090263-22d742f999dd7823bd2cd7f810561bda.npy +04379243-49e5f7af3e3c0ceb87e54aa3a663dbe.npy +04379243-e3457599e244cb83ef9a8aedf51bb497.npy +02691156-ab8eadee08cba8d8303d346f4be7d4f.npy +03691459-acdf7e6e551eaad3423723bc261e3897.npy +04379243-1a43bd2e53364313f51f77a6d7299806.npy +02880940-ad8a50aa5894bc40c762eb31f1f0c676.npy +04379243-f4b83b7fde9a4f0cdc3d55ecee5c17b3.npy +02691156-947ac452f850e284082bf69673a94f.npy +02691156-80da27a121142718e15a23e1c3d8f46d.npy +04401088-4a48ce1a067f686dfb63369d5dd85d25.npy +04530566-9c92c9e16d1d214b81eadf50fbd8addb.npy +03001627-20e1bdd54d4082097962800be79c6e52.npy +04256520-c7f31b9900a1a7644785ad2feb797e.npy +03001627-59bd57fe0389e7831f7c97814eaf956d.npy +03636649-5d69edfdd6f7f62ff88ace17ca85e37c.npy +02933112-19a0a48b2b908dafc59350d819542ec7.npy +03991062-1c4257c50d27388525ebd1cd0b422e32.npy +03001627-589e717feb809e7c1c5a16cc04345597.npy +04379243-892127d87f684bd14b91ba28fa583347.npy +03991062-72bea517f9d243808b80480f1020d2fe.npy +03001627-d851b8a016cf114c742f75bc7df727ae.npy +02958343-56d5921f58898cbc56e8a11c9bc9a7f.npy +04090263-34eb31e5ac8802246f2614b47f532d63.npy +03211117-afcacbd7078a3b4b70bb6bcb670ecdf5.npy +03001627-4f136e2a90fc8ff63ac4c571779c5fb1.npy +03001627-50016cf5a426bd63f9d384ecdcc090b1.npy +03325088-c69047a5a9a995b1c36fb70296e45483.npy +04256520-139b1622071f1864f7d7105e737c7740.npy +03001627-813f84c21a081253c02e349cb722a77a.npy +02933112-548996207fe62d4a89ecd28750d46ac.npy +02958343-db91e70ebe09d5edf446f92b52bbd82a.npy +03691459-98b920157670bcdd716d882f857922cf.npy +02958343-af94283a61eafc7183a0f773f3852fbf.npy +02828884-f133d3165d54e5b227d635628fe95db0.npy +04090263-121ef8a289b232a73c5eae1befdca7aa.npy +03691459-b7c5eae318e4e796d4e62d99c536bbaf.npy +02958343-834c7e46dfe757b4d229396ef51d2d02.npy +03642806-59bf155f2c4d655894c7c2dce500aa02.npy +02871439-6dc2a415f75f0500cbf7082b5354e908.npy +03001627-1c173d970e21e9a8be95ff480950e9ef.npy +03790512-5a1e4b1b6dfe231a362d3a933f999b0.npy +03636649-4f16fffbe480b835276206fae5d3c473.npy +03636649-2d9224be8cc6fdaa1050b055aafa6fb8.npy +03991062-6957f3429308af2781faebbdea6bd9be.npy +02958343-bf506399c934c6b3c3eedd6d54e2a52.npy +04379243-3d4399c54a60ac26febad4f49b26ec52.npy +04379243-68142013a4f5e7c2febad4f49b26ec52.npy +02828884-15fd978b59889cdc30bbd4cddd04c77b.npy +03001627-8114bc9ee0a7a093a094848ea4d06501.npy +03691459-bcada2acf7cdd8c29a08db804545b684.npy +04379243-fc51355d4d03ff4ae6c5cd45aa112726.npy +04379243-a4e5a85d21a6b36ba60a29091f2ab01f.npy +02933112-6c45346990283b7fa2e244117f013369.npy +04256520-1a525427776b39259c89c86daa5af59d.npy +04379243-c85ba9a3e1896eb254adaad15f0d584e.npy +04256520-18a45593c2ac4ffb6deee1099ca09a28.npy +04401088-f760cdb0f8cbc6fa3c28e819722231b4.npy +03467517-ca9720d793355dd693f0194265a9746c.npy +03001627-6df1ecffaa0abdbf327289c00b6dc9ca.npy +04256520-4ea78c36488dd185f3598efd14e493d5.npy +03642806-e083105e9c2a28bb0c3a03d0a1f182f.npy +04090263-553b06cd4354c8ab1c15dec0da4e4dfa.npy +04468005-25d7d7fd82d761b5b80968527b758d3d.npy +03790512-54f016b47a5864cd5dde04c96fd8146.npy +04379243-62cb358e8c73add6b71af98eaf823ae8.npy +02808440-20fb36fea4f6ce91901fed29c825c894.npy +04379243-d828c9f6c3e9f67367d177b869ee03bf.npy +03001627-87a3ee7e68f360351db0d76a41d718a1.npy +03636649-ad01773f3f53bca3a8ffa3a6526018ac.npy +03001627-51d151853d8d05db639e286420a03c3f.npy +04554684-30468019d1d90687b361c88e264d57a6.npy +03761084-2a791816d868a81875782a1c52f768a9.npy +03467517-369fc7f8d880e1b793f0194265a9746c.npy +03325088-7f45c771a4cd5ca614b35a7d7cea7130.npy +02924116-2a5d0c039562dfe8481aa8b5531c68a9.npy +04401088-74e5759913a2ac208b0d3d4e51815944.npy +02958343-a9aea98c1e79a2e6e99225f2edcc7982.npy +03691459-789c800c7f6d9e00b5f0ecf6cb865832.npy +03211117-9b764d286359e0f9cb84789183638105.npy +03001627-3f23ed37910bbb589eb12cef6be5d578.npy +02828884-decfee8dff04ef84990a10a82d99ca57.npy +02801938-951c5192ed4b3759fb0f1b7266d79466.npy +03001627-9058e82b6cd496891e481c46590219a6.npy +02958343-6be5a91bdd709a42634d30cd3ecea7e5.npy +04090263-98375ee901fa6ae4e2e7039a6accd4c0.npy +04379243-f7f5cb907c50a8791f66341aa9abe5e0.npy +04379243-63c4c59906d69b0ffe15c1377dcce2f7.npy +03001627-187222bc1f81d57b781d9dcb8ecbccc.npy +04090263-87652d99be1b6e386d639befe132b2e1.npy +04090263-2385f3cc7fe8490bd3932d50c4a63aef.npy +03636649-8ce777fa2b40476cfcb8d8c6d4df8143.npy +03636649-cc3eb92ef1319ba38a3c32fbf0f86f95.npy +02946921-669033f9b748c292d18ceeb5427760e8.npy +04379243-675ac6cac5a81bd3811cdd52f3d07553.npy +04401088-6a073661711d8b9f1a5b805dbbf26206.npy +02958343-9171272d0e357c40435b5ce06ecf3e86.npy +03001627-8ddaa112e6ba36b5b1e23c7675c49239.npy +03636649-217bf5bf88842058b8a06a6203bc49a9.npy +04379243-5ca0a56bcc0d469535836c728d324152.npy +03593526-770df0065c50c19dd884646143528886.npy +03636649-f5c61ca4acfb7f5435836c728d324152.npy +02691156-7dfaa526d4b432e867c54439d6177032.npy +03325088-c72b179913088d6d76c18e71fd49c4dc.npy +04379243-23486b58246302de979ace30a051374c.npy +04379243-c20a339e2983a462406281a1e760ea19.npy +03001627-c5e3ef17d1fc834b3c84e7f4f4c3d556.npy +04379243-6c8bea32e31192a5f1dc60fdf1e64165.npy +03691459-79cbb3c5f6bad447abc635d6ed355bef.npy +04401088-67743ab1b28ab5cab3fcf86503541b68.npy +02828884-6eb04c416f0e40565a3c5e32936a202c.npy +04256520-49e39486a1df116be3923f7359326ebf.npy +03001627-c93113c742415c76cffd61677456447e.npy +03691459-36b29f93deaf22f66b1cc4d44837f930.npy +03938244-7b2bc135a01a7ff59be1712545749b62.npy +03001627-56fc424a89bb137bf2197da8dec8488d.npy +03636649-a37f1bd2732ce11981d841466b314f95.npy +03790512-fea42d4f08c271dcd5dde04c96fd8146.npy +04530566-77aacd8997c67145cf10e9e4657f415e.npy +03691459-87f10613128f3e6198e0c75f11f82c6.npy +04379243-ad38f4e8026d7858c3bd24f986301745.npy +03001627-9a28bffd582333ae2af4036e9c51cbc4.npy +02958343-c2283d62367d637249b991141ee51d9a.npy +03790512-33aa1eadcd21734148272812609617e2.npy +03001627-10709332176024ce9e47e7a22e24daa3.npy +02958343-5135ad38043cfe64eb766e5a46fceab.npy +02691156-d9a92927192e9755702736225b32125.npy +02691156-8fa9e2e8dbed43911f32208e53f871eb.npy +04256520-db8c451f7b01ae88f91663a74ccd2338.npy +02828884-9f0a6e7c525c3c53d4d8765e3910f617.npy +02691156-9873e280d91107fe9a55c6af6f4b2bb3.npy +03691459-d8ce373c4ad4e6913caae5373ff4181f.npy +03211117-f0582a84c9f7f353ba24f8032b14b71c.npy +04530566-d0d2753d2d3e6d3d2752699ac7aab1.npy +03467517-ab6843f87773c77e63e6b27c89da971e.npy +02691156-c777a5b86424892c644d8182e9bdf4a3.npy +03211117-f464a98b2d4f598be8581b38259c3721.npy +03001627-78d3258e4664daa9e8f8c11a24c52ebb.npy +03001627-a565a80b093f12005481bf9052f50100.npy +04530566-33f4d31a559bc07fc1ccec171a275967.npy +02946921-70172e6afe6aff7847f90c1ac631b97f.npy +02958343-5e87b04efd58cc8922412d2a728de1d5.npy +03001627-e2a7604ce1b5e6c4c3c6a889ee0bd115.npy +02691156-33c6568fd4de5aaf1e623da3c4e40c05.npy +02933112-429638b99d096c89c59350d819542ec7.npy +04256520-8180afee86f2075519fb4103277a6b93.npy +03624134-7be45dc5c51ad883c56c4418b190e03.npy +03001627-d0215a0b82661b82496d6322c763591.npy +04090263-5162b8d6add4dcd7f0fea2ee98610322.npy +02773838-e450a063965ce182372d50f0ef237781.npy +04530566-956c3b989bdd0603158a3417d0510bc.npy +04256520-ecf29f5698798a74104d78b9947ee8.npy +03948459-86886a49bb69dce3fb5c1b0f759e2bc1.npy +04090263-fa4cc6689173c57a25975e984b0e050b.npy +04379243-cf2351b8172fa011a6f925961cc8367b.npy +02958343-5876e90c8f0b15e112ed57dd1bc82aa3.npy +04379243-5b62582a39681d809699d7bc7fedec1c.npy +03001627-a9b75041c8ef8654f2b838d6025155d8.npy +03636649-b4aee889d5e2a826f6747912091f1965.npy +04379243-6aae2a0daba548f082ec48ff3a4fe07c.npy +04468005-3b52c5d66de4247952470de2774d6099.npy +02958343-38326e6ede45e5ab7b1fe308bc94d4e0.npy +04379243-32eceb8ea5b43926de4d0883c61d7e14.npy +04379243-76206b183e39910a1c6b880f91673ae8.npy +03790512-f160284c3ddbc5df573365aa54129c1b.npy +02958343-b2f412545dce6e8266ff862bad2bb0ba.npy +04379243-b24d5f0395eb987e185574a5e2255bb6.npy +03001627-e8c3582f0413179b47edf0d5b6459616.npy +03001627-570527a5388977c878ba201e6a414b21.npy +02958343-3fefe1e60f5683db247a5be450795511.npy +04468005-ff63d2ad2181fd002e730f8b5eb2a879.npy +03593526-5bbc259497af2fa15db77ed1f5c8b93.npy +04530566-fc71778c7daf92e49786591d9b03a096.npy +03991062-4cd5c535b26e905aa2c59a4d90e63212.npy +04379243-5fc81c6ef8ae997a6ba09c1bcc052706.npy +02876657-2c5fd15998b6f8b996716aabcb2fff20.npy +03797390-c7f8d39c406fee941050b055aafa6fb8.npy +04379243-50f1ace689c05bed30bbd4cddd04c77b.npy +02691156-3209a02075cb9f0168023bcf4ba60aff.npy +02992529-a0a41f9444733969c3d30d5f04be159e.npy +02828884-f9e7dcaf9b7a9eb3c9befbd10d7e29b.npy +03001627-b83c9e0fefbbd843e88e73357a673e34.npy +04256520-5149af0adc1f4a6aa45aa09d68b87656.npy +02828884-cedbe77bb857a16d3104206d774d39d1.npy +04379243-9b3433ca11cd09bae7c7920f6a65a54d.npy +02924116-386ba34d362af65e699f58a238068686.npy +02992529-8961485f45d94383af4ba3ad8461249b.npy +04379243-4a3fe6b653bd51d03d5f95f9058dd0d4.npy +03691459-fa98563736440326ce1db673cf70420f.npy +02958343-ad00611d36e535f266d77f2d6fcbca33.npy +02933112-297684bcd05347cd86d53ab0fe94e911.npy +02876657-4c5329ae5fc25ff5b7903bac4a497954.npy +03624134-2f74196bd5cb462727c767f081f1365a.npy +04379243-e241cba189154397718664fe76a3c7a0.npy +04256520-eac135eb1aa4665c4b3c42e318f3affc.npy +04379243-42c35105a94ae6e68ec80f11cb8c2f41.npy +03636649-2d3c98d5d85f22a127babbd370e736b.npy +03691459-3fc0513ac3bf11c873d25f4e2e3775f1.npy +04090263-3b4fcf1d294f11bc5db864c34fc9b1b3.npy +02933112-88a30428b822f8ad630e9aba042fe4f.npy +03691459-1bf06b16e59e482c238ad1274d829e68.npy +03691459-f187f9369aa0a93200d439345883b61.npy +03001627-fcfb7012968416679c0b027ae5b223d6.npy +04379243-7f284e0ae4c1430fc5beea20858a99d5.npy +02933112-696c0051a5d5db993bd5bed2701d5593.npy +04401088-ba21b515df2f8a8f19db431d2a67219.npy +03001627-a06c400e070343cfd8a56a98f4d239c3.npy +04460130-283c8fd32d9b9a95c2c6f10e262c6c44.npy +03001627-3d5053323021b1babbaf011bdbf27c0e.npy +03691459-bc11fa1bae19a90ad74a70b98d3225c0.npy +03001627-b41aaea5754adae0444b41d6d7f557fa.npy +02808440-77e9758d3d2256ddccd0340812259a39.npy +03211117-7ad85d1478f03d4f4532b058befb6326.npy +02876657-d2c9c369376827adf8f0533aaf004c87.npy +03642806-6d2681893925b93133817c25ef5f879b.npy +03948459-2d582f697e4522e6e1f2a1daf140ac9f.npy +04379243-5ca1a1574679afed68661782af60b711.npy +03001627-90a7820e2391509835836c728d324152.npy +04530566-b472526267976d94e145e5e8ca0d926.npy +02828884-1093ca7b44ac90cd902e30b4d3d9167d.npy +02933112-13bae5728bec802034ea40f5d8767c57.npy +03691459-2a38fb6acef92461ed2aedc3715ac201.npy +04530566-e5bb455414be46bbe62f291403035429.npy +02691156-e115f4f824e28246becc132ee053f2fa.npy +04468005-a9c20f1f97afab8485c84583a15d0973.npy +04256520-6043fcf2ea4aba3a8888e7425bc4b85.npy +02958343-66edab2d079680f876ad064d1c5fdd7c.npy +04256520-41aa5dba48b7a3f683257865d0a50551.npy +03948459-9b19164c5b17f3016da79efb34b8c0b4.npy +03636649-39439a41656f7d50d42b9650f19dd425.npy +04330267-52d465df8deb8d51908e9df84c8bf032.npy +03211117-78e7b27f68570f3c47dcca01880c200f.npy +02933112-d4c4d991f9fdf0b654affd783a718eb.npy +03467517-f1fb45c857f52083a24eeca91f583600.npy +03001627-11fa9b044482814ef91663a74ccd2338.npy +04379243-987b7b49a1435a4b1b17743c18fb63dc.npy +04530566-991dab2b2339600a27da61c271c9c6a1.npy +02958343-c6709eb00a557c9785af3668c1cb30b.npy +03593526-b99191dfcaa751ad50e02ef26f47fe02.npy +02691156-1a32f10b20170883663e90eaf6b4ca52.npy +04379243-bd39b7924b0f69359d0d74633db4834d.npy +04379243-6ec12aacb68a918a311268c007111527.npy +02691156-fe3aa0ec747c12c0ca8607f540cc62ba.npy +03636649-45a2e2773a905744d5c91bd67a7ae42a.npy +02876657-bd28b6cd2fdb691b8d8eca78e5e16d9d.npy +04379243-e563bbcb07d70dcc3321831d2245cf06.npy +03001627-64139338cf8835515d6c0eb60be969cc.npy +03211117-ecd1641932584115fcea08a6f6e1c30a.npy +03636649-c905941a8db6575fd5141de389ccb29.npy +02933112-3a910cc1f575b08339d3717288022c20.npy +02691156-8fe1c92c1c9ff33fbc0909d98a1ff2b4.npy +04256520-95d394154dc98f0ddbe9c90af547c85d.npy +02691156-4a7b3bb0f7e4e13af7f031a34b185310.npy +04256520-512434114e17c17d4a79bd7fa08bf04f.npy +03001627-9542f23e526bd7aa24adc0b4355a9827.npy +02828884-bb07fac582a687f0828583ad97f853c7.npy +02828884-b4ae95fbb879bed0ee38cd6552dcaadc.npy +04460130-37d62783bdefc54a1ffedce3943a1ba2.npy +03593526-f232cafa6b5d570ac5beea20858a99d5.npy +03642806-e9bb4175bc73a2eeb60886b233d6cbd8.npy +02958343-8cc9aaf75a2fb056dcff2899f073ea9d.npy +02691156-5b048655453b37467584cbfee85fb982.npy +02871439-4a380e2801664a015c3654528317cdb2.npy +03948459-7418810de4b13e8430b6ca3ac82edfa3.npy +04530566-a3f6f17c5febd688cb5e9b11b96f53b9.npy +04401088-3aa2fd5054465056e25336bb76be9963.npy +04379243-ec8efc59f0e8c0fa97b2fb14fbcb9c20.npy +02871439-1ab8202a944a6ff1de650492e45fb14f.npy +03636649-bb53a3c6ac9cbd386fa63795f94c4d8c.npy +02933112-5f55127e04171d6435836c728d324152.npy +02691156-3764de22af04fd32a993db466b6d73d3.npy +02691156-3af52163a2d0551d91637951367b1518.npy +02828884-38d0cc28d4ff1ad0b604d999bdb46442.npy +02691156-17bc7631cbdaaa0c932e2c9d273ab571.npy +02933112-875437f9f2bfdc3feadc9f074ecd1df1.npy +03691459-39554167163a7cc3f881bbcfcc456ec.npy +03797390-3143a4accdc23349cac584186c95ce9b.npy +02828884-578b801e35fd2defd4d8765e3910f617.npy +04379243-114a39da3b4bf118d42ec7e303174a87.npy +04401088-308cce8808b076bff49084215d845d01.npy +02958343-2dd174957a2053345fcb05674109534a.npy +04530566-74470719a1b44c9a45aff212946058fc.npy +04379243-fbcdfe3edfc9a679ad5067eac75a07f7.npy +04379243-3c6ced93a3103cf34b28edba8d17a601.npy +03467517-4976872c92b0c10ea070d261aeb7d2bc.npy +04379243-27805445a3c587c1db039d8689a74349.npy +03211117-3817ccc2d7a247cbd821b4c6abf4a2ac.npy +03467517-807435998a164b5ad57700c05b1862d8.npy +02808440-78c992bac95191673321831d2245cf06.npy +04379243-d9b82ebcd756397c371fff21f277e702.npy +03691459-e1bcea986fcbb7fab359198a2f47cf13.npy +04530566-ceaacadde93c2be6ee138bcc5a7d5853.npy +03001627-8fd87d4aac0153a26b28a4cbbb97a012.npy +04530566-cdb70178e2562e7a80ac63732535bbcc.npy +04090263-b012c9d123aa8064ace721126020c1a3.npy +04379243-33e4866b6db3f49e6fe3612af521500.npy +02691156-a657a0dec941d40772fe60ad306aa5.npy +04530566-cd65ea1bb0e091d5a1ea2dd0a4cf317e.npy +04379243-74444148ff8d13d0febad4f49b26ec52.npy +02828884-1c310698c57a3d378fd6b27be619556b.npy +02747177-86194a4645da1f19e14ca01ae177e9d.npy +04379243-2afbff3cd25cdd426392a5b643ed5e3.npy +04256520-d8a8701f3fb8855d4d0a79ea230a0577.npy +02933112-528ab24c6afd91c38aaae3d020f5ddf8.npy +04379243-c36d04d3a10fba869e87d2bdcb41f548.npy +03691459-6577288320db747cea37255d6341d07d.npy +02691156-f350f4836dcd13541b1cc145b0144991.npy +03001627-5ce845f80b1d407282dde982679cd879.npy +03001627-9012e4fff3cb71b57773c2e28f019f8a.npy +04401088-c43c9123ed893de5a0eb5a85db887292.npy +02958343-e7b9a6485b15921d51a95aaa6caba1d3.npy +03636649-8232dc35ac9ccfb016a2b5862518c93.npy +02808440-594c15031388ed1588cafac7d7e6b54.npy +03001627-97c343e28e2b9ea4bf4414e655b3a4c.npy +02828884-7ba9140b8e416d79601104cd2d998272.npy +02691156-3ae96a1e1bb488942296d88107d065f6.npy +02808440-88d183f319cddb7344221bef0fa3c36b.npy +04379243-e94dcd39a8e438851b17743c18fb63dc.npy +03001627-4841eb9b6b15d037dfd20491defa4a70.npy +02828884-14abcb14222adcd499b68520b875243.npy +02958343-dca1e82e7d39edcbc2c2c81e2232aa95.npy +04379243-db0c430a51ac45c19d2be74cfb51ade1.npy +03001627-426f02971983126daae8d1cc50964a7d.npy +03001627-47aca56ff3a7b8a71a782a4379556c7.npy +02933112-b7a9d8b469cb06037824b732b006daaa.npy +02773838-1342fc4f613687f92569b963af585e33.npy +03593526-26b9ede17422ff5b84cd259bd328e92a.npy +03001627-8e77d0965bd1ebc598e0d1738edd4f19.npy +03211117-dc4b21d338c4b4d1bef7854be4daf5ad.npy +02691156-25f08a106a0eb00eca8607f540cc62ba.npy +02691156-6bfee98d2078c3c4ca8607f540cc62ba.npy +02958343-f87f654f056b3679f4103381793c29f7.npy +02924116-583a67819f58209b2f3f67dd919744dd.npy +03593526-7a9c65728f8baa6da706b53616da968b.npy +04379243-7c24e4f8778e224799a5e8f6c5baa224.npy +02992529-7dc461c63f3aa4a3a2c7c5886f4bbc93.npy +02942699-51176ec8f251800165a1ced01089a2d6.npy +04379243-2e92e1ec1038ab0914513156cf2b8d0d.npy +02691156-7b9bb6e42aa2191b58a458f7911d7423.npy +04379243-2ab79a94145330a95ca21a5844017a0f.npy +03001627-11355c7f7ffa3c09737d107bffc3cd98.npy +03636649-64d0f2752aea0f40a99e0f0bf1de3bbf.npy +04256520-f1ce06c5259f771dc24182d0db4c6889.npy +04090263-76e10c1cb25e814fe7d6f3ee02d4059f.npy +03691459-831f70cfa81a12ba7b440c5df8efc309.npy +02828884-19f24754ceb9bc948598ced6ad25b3e2.npy +02691156-20865546e07ab8067c597cd12d99981b.npy +02958343-44c278891ddcab2dc0e3666c7d0ec7d0.npy +04379243-571c9ffa865fa70d2dff41777eb31a7.npy +04379243-366645cdaab60c793e5eb583c9d92b57.npy +03001627-c56dcaf6b862a6329158e0f216b27548.npy +04256520-74369d5fdfa2356a066c1f884f0378.npy +03001627-fc818d6fe03f098fd6f4cef762589739.npy +02691156-7b4b249f1d3400e488be2a30dd556a09.npy +02958343-1ae9732840a315afab2c2809513f396e.npy +02818832-8df7e58200ac5e6ab91b871e750ca615.npy +04379243-13782b95eeefcedacf004563556ddb36.npy +03046257-6efd372c631a9ea13b48a711df82173e.npy +03467517-8c3d3e69d03d3443e84e459fb01822f.npy +04379243-43daa5027409cbbd4b3c42e318f3affc.npy +02808440-89343976cb18545d4bce3147c41ec725.npy +02691156-a6cbada42d1a30d0f5c7319b71bdce6e.npy +03691459-62e30deaa5aeac183ef7ad0f5cedb0e3.npy +02691156-3aba99921e9e1c93ef40e4c1c2686cd3.npy +04379243-6a5c816eca38f130c6536c7253813c8f.npy +04256520-438c3671222b3e6c800d7b7d07715065.npy +03797390-5310945bb21d74a41fabf3cbd0fc77bc.npy +02691156-2d4c147d4d1cc40c582bf3113c3974ef.npy +02747177-f97df3db44133969fe42c1e9e335e7fc.npy +03948459-a4c228e14915863eb8efd193bc3eb26e.npy +03001627-8ad35dbc44f40be1492d9da2668ec34c.npy +02992529-893ed9fc527a8329d3fdfcd95fe3518a.npy +04530566-32dc0308ca44f256ae9e3df35a893c9.npy +04379243-2fa04d6a788be63f32db3066d0100ee4.npy +03991062-17a9ed841655bff02f4c86eeb341b7fa.npy +03001627-ce10e4e0d04c33e7322ed2ef5fc90e25.npy +04256520-8043ff469c9bed4d48c575435d16be7c.npy +02818832-75e308dc83c1c1f0bf20c89392e58bb0.npy +02992529-5fe99904fa4b22d4ff1911c2640f2e42.npy +04379243-e367cc737c304024297936c81e7f6629.npy +03467517-f37376f5089ad242561dce3fe08634b7.npy +02958343-fc620f7906f444f1ec403de85b47bd60.npy +02808440-32c2dbf3246c8b2366bf2fda6157c15b.npy +03001627-609746ebe63abc2c2f38c0d2792fb5e.npy +02924116-69038ea9a392fbb924254bfe0c86460.npy +04256520-d580b1bcffceaff39f2fd5a6f642de3d.npy +04379243-86b942f68417df36cbde89e0c48a01bf.npy +02828884-ce663a6430eb9523cb2a965e75be701c.npy +04256520-7cfccaf7557934911ee8243f54292d6.npy +02933112-1258a7bae01e349fa320e34dad7c78bd.npy +04090263-230851bc45f916297c9aa6759ab09b15.npy +02958343-dd0817b9757b74c75d3a87a5c4dd9ce4.npy +03467517-3b7928afa5667e9112a47018402419a2.npy +04379243-34ea33172f39665022d09160e03f114b.npy +03790512-8f032c42d53b5c79aca88bdc785b0d2f.npy +04256520-4756416d882c569b7acade7eda5e06dd.npy +03636649-871e950f1d453b32597976c675750537.npy +03636649-a29aa1d787d4d3252cd2160e449d45ae.npy +02691156-5bc41589eba11a4e15477d594f1fbd99.npy +02958343-9b0d7aac4500546911718baa6d4afc0b.npy +04256520-b0fdc43b0b4e990719abd93be2967664.npy +04379243-cae4f0f8b87db72dbbdc99ec57ef9c40.npy +02691156-92497dcdab4d0a8de1e82eac4119b0b3.npy +03001627-b510aa817f9aa6795906036a9b83f8d5.npy +04379243-185e4e4fe22d65842095a33119f8ea7.npy +03001627-5c427d9fe3c76b356c07fcbf2661d108.npy +04330267-1d089370d1329dbaa2d703b56896de1b.npy +04530566-9625f56fdbada3377220891f188bc420.npy +04379243-c6575b4c39a341c698d5fc0473d00a1c.npy +02808440-f6f4dc302b85c7f96fe347138aa3101c.npy +02828884-f6219339c25b42fe81faebbdea6bd9be.npy +02691156-d43b80dd95a2233a5ae839ffe09b9d31.npy +02992529-a1e51e185a9f24354b8478bdb97333d3.npy +04530566-724ca82e43f5e4816811fda0ba2e1809.npy +02828884-43d40b726c369eaaed98cca8f0ccd5f7.npy +03001627-480d483b508469d1a42913f1450ecdb8.npy +03710193-4816fcb4595a45e2781e7efd407c71fc.npy +03593526-330880146fd858e2cb6782d0f0acad78.npy +03691459-153c468a60e1116b2eafea928e361a58.npy +03467517-d3972d599036251369da8e7f9a803d12.npy +02747177-5a0590dae471241ad5067eac75a07f7.npy +04379243-c57c4616b4a9c14ca93412f1b60e6fba.npy +04379243-166ca6382eb80ee830bbd4cddd04c77b.npy +04379243-a0e7dc01e9bb5de1858699aaad4acee4.npy +03636649-45f11cb4099c9c87bbc7a6acbd8f058b.npy +02808440-77ec56a21b4ae4b8b84959963148f2a2.npy +04530566-58a768c309c01b2cd6dc46f6baef3245.npy +04379243-daf4f3295db84cd39420b255bb5956f0.npy +03636649-4febafd730ab294afcb8d8c6d4df8143.npy +04256520-afcb115706de531f909c248d0d9da9f5.npy +04379243-7ccb70ddb69bf162298a458038c49d73.npy +03467517-16916a50a064304bf6ed0b697979412e.npy +04379243-317a934556406ef84b3c42e318f3affc.npy +02992529-62314ec7373898059f7477e2986c440f.npy +02933112-1af4a1dfa4f94cd44da5feafe6f1c8fc.npy +04379243-b320afa9ad7573401bb64c55dcda87d4.npy +02747177-50978d3850fcf4e371a126804ae24042.npy +02747177-7c90fba6cd7f73871c1ef519b9196b63.npy +03211117-8826871281dc12951072594c80fb7e4e.npy +04256520-30cc7577792d4dfa4b3c42e318f3affc.npy +03691459-105d0802d1ee0430bba5c9b6de65a038.npy +03001627-4603969ca86e226affb3dd5191e9a4.npy +02958343-6615a61a799c144e84306f3bf0a1f2d7.npy +04379243-e35d752ecf4e205ab40f0ac0fb9a650d.npy +04256520-117f6ac4bcd75d8b4ad65adb06bbae49.npy +02691156-4e67529b0ca7bd4fb3f2b01de37c0b29.npy +04379243-7e154e1cd9f231dab8afe053c66e5d4a.npy +02958343-83c21f0f383524e9bdd7ac383509f04c.npy +03001627-df51cb83f0e55b81d85934de5898f0b.npy +04401088-800ef55c1401c26ef5d4e1af18c85258.npy +03211117-94001a0000497e8ae4b68d3b17c43658.npy +04379243-ec81c49ee12e8a70fd06de9ba37d44bd.npy +04256520-ff1bf2df4bc49e1f79add0ba9a2ff19e.npy +03636649-baddae470b28db0482e23b5f9fd46e1e.npy +04401088-e30f2d19e9f44f6ab0cb879d4613195c.npy +04468005-559a4e0316bb0fea6aab81f7f1d40525.npy +04530566-2114fe40b577ced9c7640fef6931a907.npy +03001627-52cfbd8c8650402ba72559fc4f86f700.npy +03948459-5f46578efd2c65e5d4ac2f5fcaa742ac.npy +03001627-6a3d2feff3783804387379bbd607d69e.npy +04554684-14bb2e591332db56b0be6ed024602be5.npy +03636649-53d1324d1e85fd37c35131da26f8061a.npy +02691156-9407c551466b346450e5128bacca96b5.npy +04530566-98a61aa6d78f6f49de91bdb310db8e7e.npy +04225987-a19d80304e26099e7394c987e5e211f0.npy +04256520-8a01d1d686c4b0d3593ebeeedbff73b.npy +02691156-6110cd7e771f0ab3a847e990b54bf80c.npy +04379243-c0ac5dea15f961c9e76bc197b3a3ffc0.npy +04401088-b7741503cf1fe40378bfad8b5ed8c4ef.npy +03325088-9c4876c03981833fb362845c6edb57fc.npy +02828884-3f2d311ddc3b6c19d4d8765e3910f617.npy +02691156-3b529633bdd49dc1e5dbe91fa3801c4c.npy +04256520-955d633562dff06f843e991acd39f432.npy +02924116-e92f10218f66fcd64931a7929d89a2d3.npy +02773838-e73d23dbd069877f4da5feafe6f1c8fc.npy +03691459-27dfcf48220c9ce1c3554591513b53b7.npy +03691459-14a21eb927d89df31ef58b31c4ba0d15.npy +02691156-6adda4af6b2b7bf9f315217de00e37bb.npy +02933112-4e62d6e735b8bf2b90071898148dca0e.npy +03001627-9303d374253d8e7f377b9297f3055210.npy +02871439-9b958222d9673b664b3b9b23ddfcbc.npy +02958343-17457b1f42019702618e9d35559b7aa.npy +04468005-1738b29e7344f8447c44435d252fe26d.npy +04379243-11c192ef34f5dea0a1bc88a716ad63b2.npy +02828884-797d99a5ca291a2085fcf80cfce883fd.npy +03991062-40115670f786ed1a6d93e521f7fd48fb.npy +03001627-47f0e1452ea20e4856c07129c79effea.npy +04090263-bf22abe4fbab4acd91d13947d0d17396.npy +04256520-29bfdc7d14677c6b3d6d3c2fb78160fd.npy +03710193-24807a8b5a4d1f942e9bce9ba08f12e1.npy +03325088-75d1c36ff0af66eb76c18e71fd49c4dc.npy +03642806-76d74a604c1ddacd6093b210438ee0f7.npy +02992529-b69603be92146a161ad8041551e9d3c2.npy +03636649-cef0caa638ab9be03b1e8527d043af60.npy +04379243-270430ab9efb9d85c0f947750540fb22.npy +03761084-c5d13a109a61060c178e7d331e641179.npy +04379243-3f058be47b5d4cf353c1d159a8a8422.npy +04379243-c0b4b99b37cfed365143f38859a6efa4.npy +03001627-dcc892f77239ace06b2befe83a0efe39.npy +03001627-1b8c83552010440d490ad276cd2af3a4.npy +02958343-1eb3cb637ccffd14597505fd7d99b613.npy +04379243-2c06e66c7a66878c3bd24f986301745.npy +02958343-3a3d23c4d325252aaaafd94b9f216ef6.npy +02992529-5bb9020da1d3bdc260a9d7568d474ade.npy +02828884-3880be8744dc0ebaadab4c26397edfab.npy +04330267-f195aba51aa86b934e88996f84b82fe1.npy +04099429-24d392e5178630079f3b7552aff14b6f.npy +04379243-de9b2870157cdba6f83df7938e45b43c.npy +02691156-54f0d46b866c1f714d4cb1c2a5e48b7a.npy +04379243-bc351c5cb264d29e278d386bfa54545.npy +03325088-384ac965e52b16c5b0957d845ac33749.npy +04401088-4a7c0d263fa0cc119553267f4c8c48a8.npy +04379243-fe2f2b120d84ed909b896cf832106977.npy +04090263-eeb8c212c7fbf6871fe7d5784ec6d0eb.npy +04256520-e51d445efd61b1e4e1296b473bec7902.npy +03325088-de4c1e3e21d5202da7c60f6678573a4.npy +04379243-2b00c0cd6353e2fc52ed0af58ae88731.npy +03211117-79f3ccc203ed18cc2b09e302847180f5.npy +04090263-76dd6c8a2cf09887bbb7f70943d3cb52.npy +02691156-9cda097e69ef82beace5721ccacba16.npy +03001627-d5b909ad5d7c793aa16baf954c1d99bc.npy +04090263-ac13748ced7f9fca86b2bcefc261a7ea.npy +03467517-5dd9e0c35898183bfbeef84a1ff2df7f.npy +03261776-6ab05701a8124ac25ff75fdb62ec3433.npy +02958343-2401f097228fdc1348b30181b0729b3.npy +03001627-837ba605a4ab4a4f19fb4103277a6b93.npy +04379243-3ada04a73dd3fe98c520ac3fa0a4f674.npy +03991062-aa7d667a7b5c67642b151d8b52c53b90.npy +02691156-2066f1830765183544bb6b89d63deb6f.npy +04256520-d9d465cf1be1142a86114f7b6efc777a.npy +03001627-58ebbe670d03fb65cf19858fd1963d10.npy +03991062-2558fb8bedc4edcb1b78de62f6c48608.npy +03001627-8a845bb67ee8486d6199d6fe090be061.npy +04379243-517a4c16b7c5960bac2b62da1791c2b6.npy +03337140-a44d92a6431afe516d907bf61e189d9d.npy +04330267-2cb7486cd0d713894c324889334fe6fb.npy +02691156-5b3e534b2d022a9528be5258a76a8dcf.npy +03211117-cbf33a6fa0f21270fc88f15aa2f9c9d3.npy +04256520-1230d31e3a6cbf309cd431573238602d.npy +03001627-a1a34c1d45d47c371519c64630268dcd.npy +03001627-458356b9c5a8d7bd7cc86734cb2f5062.npy +04256520-719eb32ac85c77ac4e7bb85618505650.npy +02691156-94c4ade39534d1902c13e5b9ca0fc656.npy +03636649-8be191f7e61673b13e3ed2a572e608c1.npy +03046257-751c6f35fc0194785445e46058840642.npy +03001627-b1b11a70a19492fa5242f8291aafac22.npy +02958343-7492ced6cb6289c556de8db8652eec4e.npy +04256520-e78b5c9191f3007cd36a803949e62cea.npy +03593526-7c8fcf46c9d543be3087f84b199fd297.npy +04379243-f27a46a8dce3b811707cdefe012d0353.npy +02691156-ec8ba88cdead53f336dafa9b6763ef3f.npy +02876657-bd5f6815e92e5fd72389a54fb53b0765.npy +04379243-20cba21d7122fec4784a45ea6efa1d77.npy +02933112-8317fd220232e3be11fc2b865c2a185b.npy +04379243-f5529ea819c6e97decdeb21614063c36.npy +03001627-c9b0828029f0405c473f10e6caaeca56.npy +04256520-3550a44cffb1fe001acfe75c509b3399.npy +04330267-dbba6cbf758062ba89f60a4ba2e4e417.npy +04379243-7093c8218c88118b3c5f24f851caaab7.npy +03467517-bb3417d78a84a9ac579eb377e469ec49.npy +04379243-4786e3a9fc33024dfeec1f13d2353f3.npy +03001627-da443e90e376b024b0f7e9a1c9f6c90f.npy +03691459-ff9590ccc2613d6c332d76467c18dfde.npy +02691156-dc6a2bdc4c3e630a43bc71474ad05fbf.npy +04090263-858975ab8258845f230a4d129580843a.npy +03001627-fb00ea443c74c00617c72672c86a49.npy +02933112-21185c06b8eafd1229426a0f57e4d15e.npy +03624134-3dbda789bc59a5f99246ea0301684d80.npy +03642806-490245e63baf78fb1bf5877a865437f7.npy +02691156-4c880eae29fd97c1f9575f483c69ee5.npy +04379243-a6f19d6f3a6b3cce35c6c07cec6934c5.npy +02958343-43e48813760ad55875c67b3b1e763fcf.npy +04401088-4e8cb66f915fb5ac5fdc2445fe061736.npy +02808440-e4f9cc6d4b3e4bcaa26ee71c5a5a672.npy +04379243-5441f511736c03f9738e43095496b061.npy +03001627-6c36a5b107e83d331191025061735ea3.npy +02828884-9c7527d5d1fe9047f155d75bbf62b80.npy +03691459-c2007f762f6c3d9f51dabd6f23097818.npy +03001627-7db1b46aa2a337adf51f77a6d7299806.npy +02691156-61330ac001ced49f64801ad2940cdd5.npy +04379243-439ea10da7a148bb2f210d96281fe860.npy +02880940-b69e25e7ab9b829215b14098c484b7c1.npy +03001627-6c72077d968519bc13e020d985215e3.npy +03001627-47a45ce9fb219083411e8b42940aba04.npy +03593526-7de119e0eb48a11e3c8d0fdfb1cc2535.npy +04090263-45030c1a84e0c23d7ec95138ef83ef2f.npy +02992529-43b59b01866f23e6f8d380ef6d10e2a7.npy +02958343-ead6f85d2eaafab32aa8b7caea8a1807.npy +02747177-c77e8499be0ce1e04f3443b22038d340.npy +04379243-2a5f29019fea4513dc0970d34db41136.npy +03001627-32a9329c11b5c35d4b3c42e318f3affc.npy +02691156-9de5723b085c9dd8f4fb6842b3610149.npy +03636649-fc03629860dfd3608ecdcdc5181b3655.npy +04530566-377497ba926616fbfd7a80a80a3ebd45.npy +02691156-c1b5fd196374203d772a4b403daac29b.npy +04379243-866a07295aa3a8ea5804b7e86be64166.npy +03046257-cf0208d1c19e8313cc63543a91bdd558.npy +02924116-1b572b3e4503dcc2a71edfed1705a549.npy +02691156-c1262e16d330f7a0231e16e03ac422a0.npy +02871439-333a32cad481ef84ce438ccfc4d79b5.npy +03001627-ea91d70feb603421f74aae127b28c047.npy +02933112-636c4d449f17b6a8b47cc2471d9dd7e6.npy +03001627-a1e414f0380b7b9e1fc1bfd241d8d6a.npy +02691156-19f211f1dec98bbb82ea21d84574e1ef.npy +04330267-601c1c3d98596cc34a60c1a189046dd1.npy +02958343-691bf14434c590f212a6200f1680863.npy +03001627-69261d58214053d1e6c5cd45aa112726.npy +04090263-cf51da336a5414031b8fee1b14934c0e.npy +03325088-c9716fcd783c1cc178d17489f52f679.npy +03211117-529cf5ad63bd49c8ccbd9a558eb91a2f.npy +04379243-faf951210266013cbe9d845bb7506ca4.npy +02691156-2e235eafe787ad029a6e43b878d5b335.npy +03467517-abf0a261cd0d01512c6fb4acc0f83de6.npy +02958343-232a1bf61d6d80ffab0e638d7c0cfd7b.npy +02828884-3c7a0029ec98c965601104cd2d998272.npy +04379243-60014b37baab2a2fdcc3461f14d611f.npy +03001627-40bfad5f86a730b29f2349486c570dd4.npy +03001627-9b4d530487df4aa94b3c42e318f3affc.npy +04090263-1af21b8dcda98fa6f3817c125fa377ee.npy +03001627-ffd9387a533fe59e251990397636975f.npy +04090263-14a07147c6b74e9d914c738e92faad58.npy +02691156-bc8c26902e912b851a53b454324fd345.npy +04530566-b9bf493040c8b434f3e39f2e17005efc.npy +02958343-b4ea44416a06834af200a72c9245aee7.npy +04379243-1b7dd5d16aa6fdc1f716cef24b13c00.npy +02747177-819795e285ea031625ebd1cd0b422e32.npy +02933112-1919dec93dff59e0ed3ffec8035a48e8.npy +02828884-916a6ff06a128851ed98cca8f0ccd5f7.npy +03211117-559bdf7d41b538f6290d1211e69c442c.npy +02933112-60d8c707c5f8278e3c8d0fdfb1cc2535.npy +02924116-eebb08eb1a4918b75d71b28e8a5230b9.npy +03991062-7335b7a1eb1bb091bf949868a8099949.npy +02958343-e4d396067b97f3676dd84bc138e22252.npy +03001627-8f4d7de6fef55f99232ca089ddf0305.npy +04256520-7e832bc481a3335614038d588fd1342f.npy +03001627-3427a6029f253860450621b513a975bb.npy +03636649-50dec764276863a77933e36129e75649.npy +04379243-419412b927d11c7d8312881285c04cb3.npy +04379243-e0be4621b0ea9893593ebeeedbff73b.npy +04379243-f2b641d16cd8a3ed33473d0d0e8c464e.npy +02933112-1e694a1848b810ebc59350d819542ec7.npy +03001627-45214e3010f8c3ddafa9c337f30be0ab.npy +02924116-75720a82a5ee59c7f72d0267172e294a.npy +04401088-e8db0c85b07ac581d409d3400adf2d96.npy +03046257-fcdc11d9d040e18ae65235d5580cc3e0.npy +04379243-96de9fda13fa986d9cd431573238602d.npy +04379243-c0a143c5fd0048bbcd01aef15a146d7a.npy +02958343-2c3a3033d248d05851a95aaa6caba1d3.npy +02958343-db392da8d05ec4d4f6d01abc93dc7d8d.npy +03046257-6970ca7ec4463ff4224ee0743294f79.npy +04379243-50d8dde1973aa467427adc6587850b2e.npy +02958343-7e3349b2d3e833b0364d334d86d85d.npy +04530566-be8efba4b5c1cbfb94daa4565dd30535.npy +04530566-66fc4d3e245a643c4f7b88e5a2748214.npy +03467517-216b9ada62f817d3e407add7ece1b405.npy +04090263-b7ebbb8db6add885e5fd7320f47a8553.npy +02691156-25805c9f5b2812b6b7bd17e458d0dcb.npy +03691459-2686bb573a9bae79d34aabb2f31dae9e.npy +03467517-9262812345d784f846ce38f148ceb1a.npy +04379243-5334d237bafced4c3719086e0b4ab8be.npy +04379243-31a85a1a9bb22c3bf1e23636310b7e7a.npy +03211117-2967a5504d5aef38bb3914fb474ebce4.npy +04256520-b16913335a26e380d1a4117555fc7e56.npy +03467517-2358df8a325993942b996d5d44e09408.npy +03001627-b92bfb13727f6659e45ef4135c266a12.npy +04090263-9e6d1d06ae82ac106f21883e4b04581e.npy +03691459-d087ad474122e24d887e8faf8f33b0c5.npy +04530566-3b60a8a4d71e3f192063cebb14246130.npy +02691156-985e020b26adf663acd7e882b88d2b.npy +04401088-c33bc3be82441ea66934b554e5b8d4a4.npy +03001627-b0b75045d06201f9329df33f4ef71f97.npy +02933112-962d112db5d7c687e82effbd6750a761.npy +02828884-9b37a6d7c9f1800952dac0add839bf80.npy +03797390-6c04c2eac973936523c841f9d5051936.npy +03001627-c1841ecc1302f45be798c4323a137f09.npy +02747177-4d6b6d392ec6b5b4c69692992c7aeb.npy +03624134-9571186710287c09fdc15a59a3f1c1.npy +04256520-d7aa6e5b0c686fdee039576a17a0737d.npy +02876657-fda8d8820e4d166bd7134844380eaeb0.npy +03691459-ef71576ad5262c4ef398d0c5832df00e.npy +03001627-3d800711f41284b519fb4103277a6b93.npy +02691156-72aedca98ea4429c8ed4db287040dac1.npy +04256520-8fb75426dae65b66a12caf23554642ba.npy +03761084-da44863f40e720ea8a94168388287ad5.npy +04379243-c7feff682976809482db9fca4b68095.npy +04379243-e6da3e780a427429791f2019e8710746.npy +02691156-3255eb4c8ad868b3b378822897b79a81.npy +03593526-fc17a3cffc86bdcae37f5a622d383617.npy +04090263-e5de6a3be440fd1866a9b092716ff368.npy +03593526-6519a8929afa98739de171e0db680498.npy +03046257-b263bde194a2a0be8cc14b65ef8ab235.npy +02828884-ced678ceab87f6b6f4fb4dee5181bee.npy +04379243-327fcae0643a70d916768ffb6be40591.npy +03636649-6de220e49cf87c6bb15194162f658e87.npy +03325088-9d5eb12ed318891d2ccf9daeb92717bc.npy +03001627-b6305089d351329681dff5c2e57ad46e.npy +03928116-ffa3b87986a640b11c30b93bc2bc2c6e.npy +02958343-dd06b4149a6f876341ca08f10af9385b.npy +04004475-128c57ad8f366a09f16da3ba7941918d.npy +03593526-48c94c6283fa5566a4136492f17b9a59.npy +03211117-4e49873292196f02574b5684eaec43e9.npy +03691459-ea4215e0c4455737dd3b7710c385b572.npy +02691156-c022461863cacb39a2872fda285c0d5f.npy +03991062-b82574f7d98d653444c183864792bc2b.npy +02958343-618e8b78bfa803dab1bb46d2556ba67d.npy +03636649-55de711b4c86b86188e7662971dc736f.npy +04379243-2d38fa0a1b4f94981faebbdea6bd9be.npy +03513137-2aaea503ebc42ddfdfc54a7d3e3d4e77.npy +04090263-1eb186e0fc2dd979901b177556cd6c33.npy +04379243-7d5e1184ee0db5cebda5f96847fc5070.npy +03001627-5627a479e2e7373b11800282ad2afb09.npy +04090263-e3a673dd3db3fd2c282dd3b430ec2654.npy +02924116-4427bfc7a4223b8552470de2774d6099.npy +04379243-3d83fa746851500cba85f67361bdb32.npy +02828884-a2a83603f38cffbbd2b12aa6a0f050b3.npy +02933112-ad86354fb5faf1c98a4820926b2a786.npy +04379243-1bba52fa91ad1f9d7ff6ace05b36a5.npy +03991062-da8a38e1d0b6f4aedd3adf3090c701f7.npy +03207941-7d19e1db73ebfee26f893b5bc716a3fa.npy +03691459-913eb13149ceb59a75a3010d3ada28ba.npy +03211117-48b8290cb0dc0a6cc785f06f424b9d06.npy +03337140-4d993b6fe254ce2d4c3aee8e9d3a6ffa.npy +03001627-b63fb0d22a44ff698cbb8bac2032149c.npy +03691459-95db5c34357e2a81bbb94390080b5b78.npy +02828884-9b5dfec7d45eeca94c8c340ea700916e.npy +02958343-8e8da02ac0168a47ec5e3fe5c33367cf.npy +02933112-c184edddd3530a8161e1dc6d433ab6c3.npy +04379243-7269b683b73eb9a1aee34134dce9c534.npy +04379243-159964114c1991b37618b16b281bdf56.npy +02871439-795f3f8a01db10a6b6aae9c441c6e291.npy +04530566-8b92073eb06f0365e18960ef54b079a3.npy +03691459-f5c62c89e8fbb245ce6c2bd14b4c7ba4.npy +03046257-d6659d1e40745561b0a18b9f4533c663.npy +03991062-98a107d314d1b149148a76a78b10eb5d.npy +04379243-7dc6c6f96b77b7d3febad4f49b26ec52.npy +04401088-74aab120cfb4d88257de0221db0b9d32.npy +02880940-429a622eac559887bbe43d356df0e955.npy +02691156-ede14aa589c68280216b327569dd806e.npy +02958343-9a0365ab56ae57ffdf6ad3edb04a4bc5.npy +03001627-b5254b56addb692eb516c05d046e8e45.npy +03001627-bcea72fa334f593bb41b7625e8c42dfa.npy +03593526-8a970ddede52c604eec3bf885b5e46e.npy +04256520-7bfad524f6a550f6a6fee8e2140acec9.npy +04530566-60a1ffde62956a96e4723800c586d63.npy +03593526-a886fcd1a2b625208d1dabf86742ec3c.npy +02946921-38dd2a8d2c984e2b6c1cd53dbc9f7b8e.npy +02924116-1e161833a2e30e114b53951575fe6979.npy +02691156-d75a4d4d25863f5062747c704d78d4f8.npy +03624134-261ce6a51cdfa35e1021cd55d164c0ed.npy +02958343-3dddc113e114b64a63b716db3275cef8.npy +04256520-db851fe630734a8aee7d178666aae23d.npy +04379243-335858ca88e800c34897c77cbc788880.npy +04379243-4fe7555a7457c763db352b8394e172c8.npy +03513137-aba5ab07cb21bf4454631ce860fd196c.npy +02808440-805bb0974d261c98e98372688b8dcb7e.npy +02933112-3763bd1d86776ac397022448220c7d6a.npy +03691459-8171c9bdb75a10d9abdb18c1e87978be.npy +03797390-8b780e521c906eaf95a4f7ae0be930ac.npy +03325088-476aa340d2ac9973c36fb70296e45483.npy +04379243-f90bf59515aa8368e42c56c78fb88524.npy +03642806-9cd223dd78199526628b49aa3b6c49c1.npy +04379243-50b8f401a5e2f2f431358207d42bcb21.npy +04090263-b76c7921d0fba930dcfd889babf6a0d4.npy +03001627-3a141cf2f22fed0ffebad4f49b26ec52.npy +03001627-a94eb852d2137621b38821f893bc10f9.npy +03211117-e817263a3acf985ff6c7cc6dd504006d.npy +04379243-4f5719eaa2e58c9cedb0cb3987e137d0.npy +02808440-7b0f2735068568ef3af30a3946d92feb.npy +03797390-5c48d471200d2bf16e8a121e6886e18d.npy +04256520-2a07656f030d682536c2acd70c777ff0.npy +04530566-425ff664205d2a7f5c0be177939e290.npy +03001627-c3fabb74405368a8c5f0b5eeb41fa897.npy +04460130-d24729b45b9192b8f1390d726a8b3e99.npy +03001627-6a0bd5d9ec4567d9d42216b5daf41a39.npy +03761084-33aeb6c217d9cf7e178e7d331e641179.npy +03001627-566df2b6ad0abb3198d5fc0473d00a1c.npy +02828884-1acf34aa0cb8f06a19fb4103277a6b93.npy +02933112-484aac3c3f3ee4aadfcedefd655bc18c.npy +04225987-1510427efa80c92b11c7049de48f3618.npy +03636649-8522fb13bfa443d33cabd62faf4bd0f0.npy +03710193-edc6601caff93c375cdc413cece6d555.npy +04074963-f677657b2cd55f930d48ff455dd1223.npy +02958343-cf9e82b3235f62c949956811ccd3041.npy +04090263-5a2ce6338b4e399f0fea2ee98610322.npy +02691156-3f6c0034bb278de4f446f92b52bbd82a.npy +02828884-8ff9b4b57eb5a60daed1fc72009b42ac.npy +03624134-bbfd2df3edce576e1e652fa812161367.npy +02958343-425db95a3377f4d6e62a01eefce42a80.npy +03636649-3c39bff6acbb6060899bad344dc01f2f.npy +04379243-e7f1a77130bceb8d8ec45320afaa5d0a.npy +02691156-dba3ab64bab4ed3ed13ef00338ba8c52.npy +04379243-2519505d0cee2edff08984f51debc075.npy +04090263-6c7dec6bbd8ede62f0e1c0df18936d05.npy +03691459-8453a71333241062f1b584cbe791b374.npy +04256520-427c7655012b6cc5593ebeeedbff73b.npy +03636649-7c0e5f39eeaa5d6cef9b6f306f98b0e9.npy +03046257-6c010bbc4ec34296291d2d0d560233f4.npy +04256520-39ba41744345959256a9d1ce1d40376c.npy +03001627-77f5b356fa515f1f396bfe08dd5ca134.npy +02933112-98a1211469f6c6a7c7ac935603e09651.npy +04090263-41da6bb82abdc626a5aad165050e534c.npy +02691156-4ee48907120e261c3df16180af9974ee.npy +03001627-8a67fd47001e52414c350d7ea5fe2a3a.npy +04379243-e03cdcb83404b3c3951c1fffab4f5807.npy +03691459-61a4c1b213e7eb2b2633ff66beb9cf31.npy +03001627-c46eb7460be602b6bf80985a99195eb8.npy +02828884-e929c571972b954981faebbdea6bd9be.npy +03928116-c167f20548e40314468f5d32b3766d7a.npy +03001627-d0c287f11c6cc95012d6d1e9f6b5e761.npy +03636649-e9f5e9f6f8d54caae455de02837313a6.npy +03001627-3a74e3d5172ee94fdef1c01cbd4ae0c.npy +03001627-655102add1989c1064fad3c7b88e6060.npy +02992529-831d6d9118e1a2fb71f2e8f64dc1f509.npy +04379243-41d18d4668939ced3a8e4d3441f2dd18.npy +04530566-ec3e0694850f1a923b7cda02ebfc1f62.npy +04401088-7772938405ac56c1b6d41c42f7ade8c8.npy +03593526-9c06b546a29ccb2f2c27670a86683659.npy +03001627-58b7e2dd5eb73b70dc742bd7c6fd1b27.npy +03001627-ecbb4e4665c7fbb45613f5c2df1029a.npy +04460130-f01c3ee2b1210cafdb3180683be7ca4f.npy +04379243-5e52ffe27434ff446875e2781cdd26.npy +03001627-3d3b7f63f5525b1ae37f5a622d383617.npy +04379243-c8520226f277a6af77cb37b8e3bb5ba2.npy +03001627-a0421aff56cad16790a9ce3e4b15521e.npy +02691156-dc8d9003cde43b66c8727b27ee96a4b7.npy +04256520-ac36eabbb3b405d3473f10e6caaeca56.npy +03001627-24c0fc01144790be305e886266e302e1.npy +04090263-af0bf9c4b6397877cb88c9db6e396994.npy +04379243-15c833aeea88fb19f428c5b66db689e3.npy +02992529-f66d8ca1f6b259de2a9eb0f146e94477.npy +04379243-201e927f4979bed6febad4f49b26ec52.npy +04401088-1bb65c38e6b563d919bade123d9b1a21.npy +02876657-81bf26a14c2dda38c19359cf6b65431e.npy +02933112-d6242003931d0a27824662341ce2b233.npy +03467517-265009e163bf5c6f69da8e7f9a803d12.npy +04379243-cf3270a5af169626efa153ac02df4ca3.npy +02933112-23637357c4e5efb653c80c0a3ef7382.npy +03948459-be4eb62282269fa3d65e0fc33127a486.npy +04090263-13dd392ca784cab79adbbc95db428a81.npy +02933112-474fb0ff79e036b0820018801b237b3d.npy +02691156-96291ea39a5c6eda203936772104a82d.npy +04379243-613c706879ee39c9132c018af3949fe.npy +04379243-f1858f78989891172027cee422df2aa3.npy +03467517-bccc58865720ad5082b2bb742a29db8.npy +04379243-2cec40de07b468661aa47689117a61e1.npy +03467517-e0a4691bb3d3cb47e33462de7b4c569b.npy +02876657-3c6d6ff143483efaebb19cf38af396e6.npy +04379243-c9cda6b019153ded8cbb8bac2032149c.npy +03636649-8935987356200f8d84f9e9db2fdf33bb.npy +04379243-ce2d3e0b58bb1244700ade95b2f08044.npy +04379243-8aac86cf8c72a375dcc7ddfa72357b1.npy +02691156-bb26678e5faaed16300ca77569ad3884.npy +03001627-300d6a7505f24959492d9da2668ec34c.npy +04530566-9a8c57edf56dff168a76a2dc0f9ed02b.npy +03710193-63556b1cf7309010c10acf2ba78060f3.npy +03001627-be745a383ceccfe453fa79783efbc3bf.npy +02958343-61348ed95aac6b3799cbdd78ced2546.npy +04379243-75b308ba45762ad499e8bf807e902261.npy +03337140-1b400773151aa9d64c3aee8e9d3a6ffa.npy +03991062-6e8d1c49e9d239651e70ffb3c83b7281.npy +03691459-cb25ea4938c1d31a1a5a6c4a1d8120d4.npy +02992529-69e45e401c1d05b767d8789d3a6519d0.npy +03642806-fc9dc2b33ac96e41e2dc67b821479cc4.npy +03467517-b234a7ad4a2fd1f2352e5d4d2615db5b.npy +02691156-18f5265d553d72fb6b7bd17e458d0dcb.npy +02958343-368c8d09c88404999be54f79e28fa49d.npy +03001627-63e184952df0f3698f5bccb3529a48d.npy +04256520-2814c27c1ac5370a30eeafee78afcff2.npy +02691156-f9fc7fc23e62986fef6c510e24348d3b.npy +03691459-a0f84cab1fa73358078e785d09667d5.npy +02958343-9472d19187081c62fce798408476568b.npy +03211117-b7315a68691210ebb25884c97d065d99.npy +04379243-6bdc37f729eef70d18706cd9c51d6358.npy +03948459-f249fdbb14d6c86087302680c759eef4.npy +03467517-1a680e3308f2aac544b2fa2cac0778f5.npy +04379243-d1950f4d38df72f59d297e74104d3ac3.npy +03325088-19e85eac24c2bac9c36fb70296e45483.npy +03691459-43f49627bbea5c39a052db10ff2f17aa.npy +02933112-2018d0713d4c22df480fa521a9c7198a.npy +04256520-f42ca56e450c3258b4602b4f31d3d1c0.npy +04256520-28cc5741095e9754cc9651014a82e2b9.npy +04090263-8ba99099a99012c77ec95138ef83ef2f.npy +04379243-62d18b3f3c520ddb37251258858a7a58.npy +03001627-63d92bf1f175a75a25ffbad401072b4d.npy +04074963-cc846e66cbfe697bffb5024c146ec04e.npy +04530566-73343fd92c286e80c570a3d482a3f588.npy +03001627-f3f31db17715ee0c327289c00b6dc9ca.npy +04379243-38310f3d796ac0b56bdcd672c2b17215.npy +04256520-abd8b30650ebda9c14038d588fd1342f.npy +02828884-6b894c1c57ba921c98d10ca8df5ecbe7.npy +02691156-209e9845a482333c77c06b43df2749d.npy +03001627-f645f79d47e2df0f7dca29e186afcbcf.npy +03325088-415b9606f972c2a876c18e71fd49c4dc.npy +03467517-6837886c1c4553ad93f0194265a9746c.npy +04256520-eb568f8bbfee977c6b4fe272da0db543.npy +04379243-a0aeb5a735e15171f15e29f2d0bc457.npy +03991062-6ebaa1c6357a05b33cc55b40df64ab9f.npy +04379243-3a466eacf622b3a13a5badb049bb270.npy +04379243-343b2351e2605a075445e46058840642.npy +02958343-f21188e5f1a6468050bb0437668bebb7.npy +04256520-2fb350e338cc61521b17743c18fb63dc.npy +03325088-4fbb6add41adf7eb843f813f752a5e35.npy +03001627-fb71fc8021c89cf342d8a8c5af8997e8.npy +03211117-bb2639fdd7ee85202f58405e4baaa2ed.npy +03001627-f4c6c927df8edb62c7623e33dc7256f2.npy +02691156-a1b95d2e1264f6bd66ccbd11a6ef0f68.npy +02942699-fe669947912103aede650492e45fb14f.npy +03624134-e98bc872371c852e15b040d25222e627.npy +02691156-d6db0815d8fbaad621967ef97204d18.npy +03001627-f0ca6f9383ee9aae517376ab44a447e5.npy +03636649-955143d7f0b5c70fef76898f881b76a.npy +03642806-9e901676eeb65f352b1c9d869bc37167.npy +02924116-a8dde04ca72c5bdd6ca2b6e5474aad11.npy +03001627-284463280e6a4d003719086e0b4ab8be.npy +04379243-b26f4075b45a3a473c75ff89cc8b70a1.npy +04379243-9a3194d78a592039a95110eea24f99c6.npy +04256520-f693bb3178c80d7f1783a44a88d6274.npy +04401088-c202335fd3dccf9d45e2a4e5729b970d.npy +03642806-6b4b8ff6b859b262169650f5be5e669b.npy +02747177-10839d0dc35c94fcf4fb4dee5181bee.npy +03001627-bfe64c93bf5c3858c4f202fffc87396.npy +03211117-ab8af4bf679eb599ffb8194c06b9bc3c.npy +04379243-8ed0ac779ec4bbc9beedb4c8fd29e2d1.npy +04530566-80c6a14accb189a9c2c2c81e2232aa95.npy +03001627-d9bf326d8ae7a430a5a7dec3df261ad1.npy +02933112-f3bc5eb543bd852bb7ea82317702e856.npy +03001627-8c91c7c19c20bc4cf130e9cdbbb1cf40.npy +04379243-b7c36f0afe9f16655b1ab0bf4891d200.npy +02992529-6ff995a8e9faa6e83e43be0b542efff8.npy +04530566-1d2aa0bcc9ade276a70cfb3232f40c6.npy +02876657-c46bfae78beaa4a7988abef1fd117e7.npy +04090263-605cfb5fcdef75539e6170029f747a35.npy +04090263-fbc88753c7697b825e4f1f524019c.npy +03636649-451fe793f6e8fc29276206fae5d3c473.npy +04379243-d7792a9c16aaf16d98e0d1738edd4f19.npy +03001627-27ef7dafe404bf424e83b37723b7fdca.npy +03001627-6cfc437d8ec6ce7413d48601aed73697.npy +03211117-2b2204a683efead6dfb0e2d6f3832f45.npy +04530566-1fb07d5bf3421a46e2b83b21c9537e1b.npy +03001627-ce159c7d983d74136ba14bfd91a75020.npy +03001627-eb32fa1ae8069d0998e0d1738edd4f19.npy +02691156-dbc521b1d4c2d308303d346f4be7d4f.npy +04379243-2bd915e46c4b08e3f2cd47be0243fcd2.npy +04004475-9504267500abe76c510a6e7bd9c355b3.npy +02958343-f1b928427f5a3a7fc6d5ebddbbbc39f.npy +04379243-c33f90746a3573878b39b912ed4a7b59.npy +04256520-3561da3d136b4deba023804ba421cf6b.npy +04256520-5b3b26c9ec974a1cdef028ff6a07adf4.npy +03691459-161de75c52763afade3a1fb6044fe536.npy +02933112-641e64902bb9f6a4aaca4b071fcc002c.npy +02691156-5a3344eee5b27e670da4e1131665650.npy +03001627-44f6f1cadf8e788f90a9ce3e4b15521e.npy +04256520-8b82330caa9b1a514038d588fd1342f.npy +02924116-b434422365ab5b9df54effbbed1a418b.npy +03624134-2b4aa9edf0e15a6b1e00d60b0f9cc70.npy +04379243-24d1d32aa33c38716a97150bb2a72733.npy +03001627-2e0beb3b6927a2b7e45ef4135c266a12.npy +03001627-3f194ed2680ac0f4f875094dbf5fec47.npy +02828884-2ae355c406b7204e8c5da39cd0403824.npy +02933112-7650fd61f3a162397ee0cb5488055ac.npy +03001627-6684ddb2b7acc11e975d41ba8f947ac.npy +04379243-4c49252bedda66402c2d6a2f47ceb5ce.npy +04530566-61053086346058bd2b477561b6a06f5c.npy +02828884-4aa87768e4e9c7639f7aad887e9e880f.npy +03001627-f0b50b64918ef41b990561fc34164364.npy +03991062-f61a766cd84d46a5e88c1d6fc3580355.npy +02924116-a10b42b69a8caa5b616d27151166e25f.npy +03991062-a1d2ddc8fdcc9f63adbcc9ee28cee4cb.npy +02933112-4f9b95af6720c7fc11fc2b865c2a185b.npy +04090263-3f9522f1af5597cbf0fea2ee98610322.npy +02691156-eefb4a1fcc2ca4d8894e22af7ae821f8.npy +03001627-11d9817e65d7ead6b87028a4b477349f.npy +04090263-fbda020053554eeceab5ee569c9de1b1.npy +04379243-c7778ca8dabfc6809856fa70a578baeb.npy +02992529-a3193340929f4bdd146def56c5fc9b3a.npy +04401088-fa3f5a6c21c56ef7e85fd905d1f6c116.npy +02958343-4471c286051d2bb94da8bffed051ff6a.npy +03467517-c7f501f73e11ee3352e5d4d2615db5b.npy +04090263-dbdf82759d3a0011df6f54267ea02d3c.npy +04530566-5295994daf6e427dbec3353c29751fdf.npy +03691459-6d75b6211f3bf8dca999ad3d6fc50304.npy +04401088-338c3f116cd39022a40276c99b77cde3.npy +03001627-308f0ebcbcdad58119fb4103277a6b93.npy +03001627-d5e9eb9dbf9d30073321831d2245cf06.npy +03001627-181b65afaeca2ee1a6536c847a708e24.npy +02808440-5a79d517ab366c52ccd0340812259a39.npy +03928116-b6272c4596bb32dd732e279d31bf9790.npy +04379243-9df064dd2a0f58a1d0176f9a144100cd.npy +02808440-b671a193d0397ad554d7082b34825ef0.npy +04379243-3c5048910fe8919ed810b14a81e12eca.npy +03325088-faec75b6043eb5ee4e09ebaf49b0cb2f.npy +03001627-f53cba4a288db2d58e1400f6db70a939.npy +02808440-b43b17f0378ed699ff1dc6e98c2e01fa.npy +02958343-94cfcfb74e246f938acb0ff76f4aec7d.npy +03636649-748983e71880720852ac619cbeedfc0.npy +03001627-10d174a00639990492d9da2668ec34c.npy +03001627-341e24df542e0676d42b9650f19dd425.npy +03001627-6190eb8be0f39ad782e3bf439621ac4d.npy +02808440-74de09e85976da12a13787f910fef0e3.npy +02828884-b9fb64100372235adbbc9440457e303e.npy +02828884-12b3daecfb0eb7d2056b4bd5d870b47.npy +03991062-fa894d811206c54dfc5eb16dbbadf7b0.npy +03790512-53d6f04450a85fe9ca547803ba354ce.npy +03467517-493df075787dc0f63ac61a2f8346a8f.npy +04256520-5f93127875373b8657f15fc9385a8a01.npy +03001627-c9dc5d85ea3bf4d8a1088e4f586b1246.npy +03001627-e6408c4be8e6502837a346dba83c013b.npy +02958343-3a46c9b9e8b18d6a61c6c61410fc904b.npy +03636649-77a5a12147a6624d786810c22b062a88.npy +03691459-5222c43f267d9f313129bd51bf061fac.npy +03593526-447730fef97d1f5a89035c25f0dfeb63.npy +04090263-8571fdae210bfd6612b38b1d99376c0b.npy +04379243-4e784e440912c48819fb4103277a6b93.npy +02958343-84394f62a86ddab875c67b3b1e763fcf.npy +04090263-951b61886488dd94d0b636a2d5e450e4.npy +02691156-bf124ddeb1189a3cb312af71146176c8.npy +03467517-6d546f8dd90259d62d4ead5a1be351b7.npy +03593526-ac95989d0e196b4a98d5fc0473d00a1c.npy +04530566-82ff35912d0a143a4e2501f4797d0851.npy +03636649-4610f7cdf3923b05cea97147b08cd8b.npy +03642806-d3606fa80e46f834562d7644f5df59b3.npy +04379243-b7621e8afb9e7b18890992ddacc04113.npy +04401088-b307961888415ab88ec5d235d7e81cc6.npy +02958343-26569f96aa6c4ed880af23b535873bb9.npy +02992529-3d1d0255e2163917f4ad1770263e7f39.npy +03001627-49c955a80749d2e1a5ffdf44ff86b795.npy +02691156-b27de883a83409a86bd2a0f0614d73d.npy +03001627-b5833d19f6fbd9a78c67f98c135b5710.npy +03325088-b3271d0ad091e15ec36fb70296e45483.npy +03636649-faa4b839db01b86fcb8d8c6d4df8143.npy +04256520-66d4f7c3c9018c9c4d3ac4ef5709159c.npy +04401088-bc27ec84fdfa912437ab6ee77f8c5e9e.npy +02933112-ba6599d00e879e11c59350d819542ec7.npy +04379243-795d4213e1dac276f9814818e8ac1c35.npy +03636649-d7760d5f9e1e6a622cd2160e449d45ae.npy +02924116-19242c27a28f09f141cefd10ce5d6cc0.npy +02958343-996354bbe7baa2b2f24437126510c3c7.npy +03046257-a67b32ac05ac3c965ef99326865249b8.npy +04379243-a886752590af36549e726e922f49b373.npy +03624134-5152ec5d2de585ec77b7d0d4764c121d.npy +03325088-a24f6e1d173f61885646c94351c07f35.npy +02691156-37b1f7f02c4b87dbca8607f540cc62ba.npy +04256520-e80bb04a59bd72691b17743c18fb63dc.npy +02691156-7805239ad1e40e07c69d7040c52664c5.npy +02691156-900771de03746670ca8607f540cc62ba.npy +02691156-f16381a160f20bc4a3b534252984039.npy +03001627-fdf0fd3b18066cd7e8b2b8dc0c816caf.npy +04379243-d77f7643e6e34ac91933ffef19678834.npy +02958343-472f62cb87c3f1606e04fb225ca92772.npy +03642806-9d48ab8c41174e60888cad7f6c0e6001.npy +04090263-70db17ecfddd51183554ccf8c30febe7.npy +03467517-15847850d132460f1fb05d58f51ec4fa.npy +03636649-a5b394e2c98f6233636c7e486232cac1.npy +03636649-c9eca1a946d5c74930259ca79b88bb0.npy +03211117-481a1dfe44babb3892b08e504d6ff5ca.npy +02828884-6c5b4a90068a6b511fcbd85b6ac8926a.npy +04330267-fd4201033847644d74c60db5b05c353c.npy +04379243-b5bc21c92dc997cb7209833c7512d6a2.npy +03001627-aa154024474ad7d138a720835dbeef20.npy +03948459-e017cf5dac1e39b013d74211a209ce.npy +03001627-a4b32d26e0962bf74a4ab00b9639232.npy +03001627-3190b19c1ae0aff9c5ff3a5f34406751.npy +04379243-ac440171fe3edf2a5284eac239212f2d.npy +02691156-81e6b629264dad5daf2c6c19cc41708a.npy +03046257-5aab22188aff5a9ecd124d563222b065.npy +02828884-b2fa26eb323ee7e3697079d6fa35f34.npy +02691156-54d49185bcda732a91e8833d3c500d73.npy +02876657-ca210c6696357f98e8ec08b84f068b50.npy +04256520-8892a081230c9e0557b8f616df7adf9a.npy +04468005-f46601730530a00e96cd7d9555234e5.npy +04090263-97e6439ba7e703dcd7d3985b6fde9645.npy +03001627-6aeaf646d526b41025a1c5ed6eeac95c.npy +03991062-3487ce3dc7f16ab15eeb207be0544bf9.npy +04401088-f928f74ed34e46c4b5ce02cb8ffbdc86.npy +02828884-a58e45ec5204f09559cbde03ded257fd.npy +02871439-750ba8feafceba921933ffef19678834.npy +02992529-3488722618d61cacd5b6fb666fe071d7.npy +03001627-597f2b2153af0c544aabcf2a7cb640f9.npy +04090263-da478adc6169bf2b34cef5923891e520.npy +02691156-dd5310819d4f16d7b9fc567905a4b292.npy +02958343-9de10b4469cdc435afe1d4530f4c6e24.npy +04401088-ca2e71c5e101797fa524f6bfc21eae12.npy +02958343-eface8341d001e9ceb01ae4a4788bd4f.npy +04256520-4f17918826b64fc8d5cba62773b8025b.npy +02958343-fd98badd65df71f5abfee5fef2dd81c8.npy +02691156-c18b1ed6e935b11bca8607f540cc62ba.npy +03790512-2610c94869f2456c3630e1f3568e4cec.npy +02691156-5c7729a3c482d77542c20743f866e1a6.npy +04256520-2780834da1be89d1f51f77a6d7299806.npy +02958343-1137cd58d6a45c6659a47b1880958de9.npy +02691156-92ffaa5ebef3c4025d85b5c95b248fc3.npy +04379243-82a1545cc0b3227ede650492e45fb14f.npy +03001627-36d314f3b118caa9bb557fc9202b7772.npy +03642806-9bfb4fcfe4fc903ca1fa797bebd1cbce.npy +03636649-baffbaa9a9338f331735ea0e092a805a.npy +04530566-6cf0d9cb4e2d607856f77b6bc6731cda.npy +02747177-94901779bc2359adcb2a965e75be701c.npy +03948459-9a90f323edc8c30f54e702cd89ce6f04.npy +03467517-23e9190aa371509820f1bd6cc69c7b.npy +03001627-276a4e184b9d71c4d838ae16242881dc.npy +04554684-bcf112d7f50c222685842deebe63f964.npy +04379243-21ca4d36a0f6fa69b937d98d58545fa.npy +04256520-4d5efa4209fc3c126c92f284160734ae.npy +03001627-20b8c6959784f2da83b763ebf4ad2b38.npy +02880940-879a5c740b25ef5c7a88a2ad67bfd073.npy +04401088-d659d98d384e2c37e405d2e0f546cab.npy +03636649-d00391a3bec2a9456a44fdd49dec8069.npy +04256520-5b702274926a8c433be1d0c32f5added.npy +03001627-5a94a4638e8d548cf7628281ecb18112.npy +04256520-221153f680f3ef015761a0b53ed37cec.npy +03636649-8a9ef07176e60ceffcb8d8c6d4df8143.npy +02828884-9c8aba47e37b1eff155d75bbf62b80.npy +02843684-cfa3e202c9b73e63a08977deec57f060.npy +03001627-469597794b28bb2bae5a95f4529b204a.npy +02691156-a18f4e4c291761fa7cebb3dd777c66be.npy +03001627-6f7a337878543c07c3bd24f986301745.npy +03636649-447a8ab0523dde411936a2870d820ad3.npy +04379243-3e4434c7714ebf307ac0fae7c37e01a7.npy +03991062-e7571eb148c46f16cb2a965e75be701c.npy +02691156-8f9fe8d7df1af4e057240bc6888ed016.npy +04090263-38fa7b145b3be7fdb4cdad9a5bf52dd5.npy +04090263-5e4bd1ed44830fb147e5d4c250a3c98.npy +03467517-58264c7b174a7cfdd57700c05b1862d8.npy +04256520-b7b15c6728478971bafac5c6f2fdd4fd.npy +03991062-6bf575f4fb9dabe278634ef2c5fdc560.npy +02691156-213004db08a787a466cf1b4a8fc3914e.npy +03636649-f4e1a4032b1686cec35131da26f8061a.npy +03636649-eb8da4f4245496c57f1cdfc0a8f38f2e.npy +03211117-dca7417eaa143de13ccf3d40fbcf475f.npy +02958343-2ecbacde09270d49cbf57aaa2ef6598c.npy +04379243-a814fbd363007fcfd93cf5f5bfd78ab4.npy +04530566-dbe05209a14fca8fdf72e713dd4f492a.npy +04090263-5eed8cd506081459ed6071560148e6eb.npy +02747177-28d07148048431d4ad5067eac75a07f7.npy +02828884-3b412429257bc1c34e437e844fb32a1e.npy +04379243-8c3e8ef43fdacf68230ea05136ea3925.npy +02691156-d70d648947c65b1eca8607f540cc62ba.npy +03001627-4179c276ee8dacfc8cbd400aa99bee96.npy +02747177-66d96d2428184442ba6cf6cbb9f4c2bb.npy +03001627-123b44b99e48eccb6960dc525de2f934.npy +02691156-f0fb27f3a597838feb1a0518c224975f.npy +03991062-b0bac7f86d4a184bffab4d6f10fa1d97.npy +03001627-35d2e2a050336b78dbca69f936e89647.npy +03001627-5bfee410a492af4f65ba78ad9601cf1b.npy +03710193-4b41dbd95a68067b71c1364ca3ac2195.npy +04256520-6ff38c09b9ab4dfd712f5f94eaf97217.npy +03636649-cb614975be6370dcb6b7592323488fab.npy +03001627-2bc587e0b4c0a0aa5a99858ad1805187.npy +02691156-fad346b02d91348bbbf3143b1cb6076a.npy +03467517-272d3447422afbc05389be63fb12cc36.npy +04379243-ee7e37046c26168dc2fd07f66cbad0f7.npy +04530566-d3043fff20dad5c41dc762869682f4f.npy +04256520-6afbcbdc7ab9357270db6230313d3ce.npy +02747177-e2276eb0322d1885cb2a965e75be701c.npy +03948459-345179cdbb6ac9da4dd752ddde80fb1.npy +03467517-671cdf7d555433fe94c23358bbce964a.npy +02828884-ea96a04c68b969c5c35f34f09f11667.npy +04379243-e7045bfa00de20a39a0d3e7e907e5b53.npy +03790512-5e43289edf360d01e937abf44800029d.npy +04256520-1ce97f222c9caeac14038d588fd1342f.npy +02992529-aabbfc7463d49368419fdfebc874eb8f.npy +02958343-a83c45069b2925efa7e7e5ea49ad8e45.npy +03211117-a03ff904fbcf341ce333e1b65ebab960.npy +04379243-53b815fbd98e6ed237be8761f2d10359.npy +04379243-2cef3d2d545f4a22b305a938e0ed1b48.npy +02924116-80cb1106b1f553669ccc82ba1c8f035f.npy +02958343-6a348343b90f8f06a78cb4f1b66f009e.npy +03001627-a8d357344e421ff21e12bb4aebfe8421.npy +04330267-4bad13c2b787299241965be83b7745a.npy +02992529-5fefcb474b6dca4b23b380c931ece1e8.npy +02691156-5fcc974627fb15fbd1491f61ed5cc034.npy +04530566-65c55828d88fd02da08632bc2f6881eb.npy +03991062-ed220bdfa852f00ba2c59a4d90e63212.npy +03001627-92b332233da033e71d022067655f6c16.npy +04379243-ad09eb0cb78bc62238279ad3a29524b2.npy +02747177-39733528663b8ffbad5067eac75a07f7.npy +02958343-911d8dad65dd79948e35db9103756ad5.npy +03691459-5dd29010575d36ea73e1b2d018c0512.npy +04530566-48a02e067f83c803473f10e6caaeca56.npy +04379243-62a0d0647476f5e5f8ece882ca124c40.npy +03001627-3de9797fbf88fc35d97fd0ea4791ae93.npy +02691156-c85e3f6c572581de7d3b11085e75c7ad.npy +03001627-cf1e9c2ae3309c65d7bb55f118ea0541.npy +04090263-dea853cf0b776f7dbc6e84bc30e573cd.npy +04379243-8e6254609ffacf233e5f17778b45d37e.npy +03001627-587d174c5f2b19c1d7e48afa5cc5db41.npy +04379243-1d8536c4e1b1b8eec5ae767f471fad27.npy +04530566-ee0e9bd4c375f1e76c07231ab3c62b82.npy +04090263-8fedf1a088427ea8ca3e540900266737.npy +04460130-3f95f49a3c400e9eebde864f704d194b.npy +04379243-d6064ca673a721ee44175b4dddf5be08.npy +02876657-726a6ce68bcb4b2d14513156cf2b8d0d.npy +03001627-f1a5a9aec0b63b91f487e71bd57b6e0c.npy +04379243-b20105f74c7a469647839bae1bc65257.npy +02933112-114b810af4a847ca99dd23ec22c4943b.npy +02828884-5e1ef1b63216952dd2b12aa6a0f050b3.npy +03001627-6b385a32489bab4abbc7a6acbd8f058b.npy +03636649-f9259d31df38bd5decd204cd7180226d.npy +02691156-95d0f4440a694e4a203936772104a82d.npy +04379243-bdf7606e8d493149664b3b9b23ddfcbc.npy +03691459-1ca17d2cadd47286c066b9622c005c53.npy +03001627-eeebe3fe14ee4d3aebefe6b1d594ad2e.npy +02958343-a2d50ee31621c3e059139efcde1fedcb.npy +03001627-8e4269ac16e13433d701c68e1045b606.npy +04530566-63c241d90e86ddb5a70cfb3232f40c6.npy +04379243-18d29165fc26330467903707764646db.npy +02933112-aa722d165b5ede74f8832716537767a4.npy +03948459-b3ea2d0331ec9ec650544cd7fa263944.npy +04256520-d58a2c86b9b71f6bef4e42d70375aed8.npy +04379243-f46f68598988b922eede8c01bbe6592b.npy +03467517-86bb8f9fbcf5fc20bc4ac3caf16ef65.npy +02691156-1c87b854cceb778615aa5b227c027ee0.npy +02828884-9683f5ef9e032a8aad5067eac75a07f7.npy +03636649-3cd21b83cf709f1829a42a0444436860.npy +03046257-5147d0b10721d430f51f77a6d7299806.npy +03691459-475853b0ac6bec73eb752889d5199f9f.npy +02691156-18666bda4244d22ca7aff2c3136e8e59.npy +03211117-2e5b9f616a0805dc3704a45f4027ebcb.npy +03593526-1a619680edc5c461a95e4741ba1b4acf.npy +02691156-77dfe229aa38e70b3fdf1b3b0fe86dff.npy +04379243-d2a3193796284084e8775b281dde57f.npy +04099429-863f387309a7c684bf88e92fc4e43a8d.npy +03636649-437482f4d187d43893202bf99dddc268.npy +02691156-ba37c8ef604b675be1873a3963e0d14.npy +04379243-c8cd7f01dd79bff03b92b6b9488ceadd.npy +03691459-e1b3bb54b9855f12d88a3e0e92891ad5.npy +04379243-1f24b9a75606239466e24bbfdb446f55.npy +02747177-2343794f942a698cb6c43a5634bf2724.npy +04090263-4a56ba0b85af56703bbe4035b770f62b.npy +04379243-7e1c4bdfbf19aa22d3cf0d40743efc0b.npy +03325088-a3999e8953b3274ab362845c6edb57fc.npy +02871439-27dd0e22a3151fbbd8d04e687db9eb6b.npy +02828884-4651f5b75533042283bc207d8a5912e3.npy +03001627-f1cb7ac166e7f23fd9d3572bbd9cf789.npy +02828884-ef1a728572967942ad5067eac75a07f7.npy +04256520-cf651c9562d9267032a526e2e9a7e9ae.npy +04256520-3b15020aeaf67cd5b085db76290ca220.npy +04379243-efbf0d75648b7c7d5792b99b8245d225.npy +02933112-b12c3a046c326ca1d9b228d02c3319a3.npy +04379243-f0a7dba4e3c7c1e4ffa178ce1c2c6b13.npy +03211117-115cf7354bf5926331067bcb59115bdc.npy +03001627-8d4efa9893f7e49b3a85b56ecd01e269.npy +03001627-b7af84a7e76dfb59b04cb542e2c50eb4.npy +03636649-58c49450594bef2afcb8d8c6d4df8143.npy +02691156-ba1358d41ef026fbb87697d3904b168b.npy +03046257-67e0ff4c52bea7ce61cfc645a8f27696.npy +02924116-3a46aeed35093d3d2ab2c6d327d62fed.npy +02691156-68537bfb054ee3802ffb52751fee2c0d.npy +04090263-c36992c1accaeba6803b54e9738b20a6.npy +03001627-4ae645f3b724a7dcb83ea6cf8ac00397.npy +04090263-a7de37ac9f6fd8c4d6e401b0db4905ed.npy +04256520-adfda3aefb86478319fb4103277a6b93.npy +03001627-3ef60b4e28c22b3bc7dd78af359f0fc6.npy +02992529-3d5487efc1d3442ce81f45a785365b0f.npy +04379243-5d3d902051858e56ed1397afd2317e5b.npy +02924116-b01aab6f2de05d1e52470de2774d6099.npy +04256520-5161e139d0a58822a773e2c829d72a13.npy +04379243-5826f35dcc58f9206025dd3b37729bd3.npy +04530566-28db3989d5ef36e9c3691cf0253958f4.npy +03001627-bd0cdf88217ac15af9e0f15cc1c070db.npy +03325088-a447d1bd3dea48ae54d7082b34825ef0.npy +03001627-a7d178cd0dc051f25fceaa39a8353bde.npy +04401088-8ede5d8c00e10a2ff35554ebed2bf2.npy +02828884-b53a4b74b0c898ab615925cde06141be.npy +02691156-754d9b0f12e6c6104af5b53e1d2ec5b6.npy +04530566-91c1e885c5cb2ace3c01fd24534f394d.npy +04256520-d8c748ced5e5f2cc7e3820d17093b7c2.npy +03001627-2972fd770304663cb3d180f4523082e1.npy +03211117-5282a5a7482b317ae81a51f0a8c4cae1.npy +02691156-8a674703723db7a390baeef8ba5b93e5.npy +03001627-3f0b0feb58008a663ec7ad443e0ae81e.npy +04379243-d9addbc9e91eb0efb1b6b0c5ddacb607.npy +03001627-62fb28b9a362fa0adf8d3197c3f0b3a6.npy +03790512-45009f5fa4cb295e52ee90e577613070.npy +03691459-4e3669ef40de1b3b465b32805167c435.npy +03467517-173e4f1824f7b9fa93f0194265a9746c.npy +02958343-a13fa4cf0dfdd5b58f7f0d2c9c57704b.npy +04379243-93d4c1821a6eccea462118aaf3f93639.npy +02871439-e6b90d7b634f03e0f65dfeec70ceaaec.npy +03636649-fdcee8d924f3a8404d01f72347a40cbf.npy +04379243-24b997004163af21851a116903680096.npy +03337140-e20a4db61eb83e2cac27179ae57fd682.npy +02958343-afa0436d9cb1b19ec8c241cb24f7e0ac.npy +03636649-ae5a1b5c8b93cdf4899bad344dc01f2f.npy +03797390-c2eacc521dd65bf7a1c742bb4ffef210.npy +02933112-5584ec27aa657c65ad329b1997e89fc7.npy +02958343-3163c8037d5782365688db6590f826c8.npy +04379243-4d85392c3233b2b8d3299846d5c00f08.npy +02691156-9196f5a53aa7756687bac2e90bbe10e8.npy +02828884-49704546a313b40781e404e60978a1dc.npy +03001627-1cad298ed14e60f866e6ad37fee011e.npy +03001627-2a1124c7deb11176af42602f1636bd9.npy +03624134-8fa93b48c0c8e9abca9a013036a28780.npy +04379243-cddbf3a55a623e423002761e7a3ba3bd.npy +02691156-8b594934c14ac5db66cf1b4a8fc3914e.npy +04256520-c5ded02dd51a5482e0c5923879d79f21.npy +03001627-7d3b7916dc5325a9c862eec8232fff1e.npy +03928116-d190952a74fdd232540cc0119178eda2.npy +03001627-2bfa0be90c15bfa0b82cf928f6ed5338.npy +02958343-14ab7a48f51bfe69597505fd7d99b613.npy +04379243-5c7dde9febf82c72e4d8d44a2bc9dd4d.npy +04530566-1b1cf4f2cc24a2a2a5895e3729304f68.npy +02828884-6d4fad5487a044249dc30bab479ad5d4.npy +02958343-b0fa729f031a97d2c3c561b608f78503.npy +02958343-8e1e365bb6202682f43c51e53897fea.npy +03211117-b9ef07b9ea14f4fb1dc17d595f9add09.npy +02958343-8e764c26b9d6fe15cc2825da82c7ac3b.npy +03467517-7b498b66d9426ca844629dda8178547d.npy +03001627-93001617daca67ebc8687ff9b0b4e4ac.npy +03636649-a1bdde7b604dd3a89b1c4543cc5963cc.npy +03211117-cd71c33773db5570be7e507ed67c0331.npy +02691156-6ad619600049376a4aa57d4816c68a3.npy +04401088-9878b77e157e4b0dffc2eedcd24a87fb.npy +04379243-2538c4fb2a271b06e74bf18c5b9ed60a.npy +02691156-422105cd23178ebf333c61abffc4e1c4.npy +02958343-69126951b42485ff88cf40718544e7cc.npy +02933112-1f0b5514d93f39ebd189eb81471216ad.npy +02958343-a37a9d8847ca3b90e6052439e5a76d12.npy +04379243-ffc75a8bdb88c751b7fbcb21c074906c.npy +02747177-5a2d3cfcbcd3779f44a292ef014253.npy +04530566-94e216dc57731577c14e2939682bc455.npy +04554684-add75c4fa0707efa226eabe1cca3e850.npy +03001627-3126c6e9277b775b245ac1812a4e4d0c.npy +03337140-6c07ed789e414305ac477d524b05932c.npy +03513137-bb3a039ef88a9fbc480514d7f2edc0a3.npy +04090263-dc4b75223b732847384cbf852f305630.npy +04379243-3959856509e65a18a36258eabc2b9c.npy +03325088-ac2cca058aadcea43321831d2245cf06.npy +03001627-ed5b718c4efc65f148ff063e62e02115.npy +03001627-dbf5ea40382c5efed30107faf024a18b.npy +04468005-d0465d61dc9f9df9db4b3acbf6e65df0.npy +04090263-7787bf25c9417c4c31f639996cb3d35d.npy +04225987-ac2b6924a60a7a87aa4f69d519551495.npy +04379243-34b36de23e2e64852e3db45253b87bcb.npy +02691156-5afdfdbb4161ce0a7456183f198fd1e9.npy +04379243-fb32e9a7a8c2dfad74eb542502c2205f.npy +04379243-2fa78f97515a4d5624760bcb862cdd1b.npy +03636649-1baf036acc927ae27b79156a61ad4c01.npy +02880940-1a0a2715462499fbf9029695a3277412.npy +02933112-97cfa011875acc33532e8683617554c4.npy +04379243-71581e6511d7782282e6c3a4e742651d.npy +02828884-1cbbb30e8e06e932ed98cca8f0ccd5f7.npy +02828884-9fd5b67a2b20b5d1b19874039c8f3e05.npy +02933112-721f7a03a70b1107c0b2397831029b54.npy +04379243-7f53246b6aa7fd551a44da2424b9c700.npy +04468005-dd17c94e4b9b250ce982c7c6a3539d1c.npy +04379243-c9f3ac109419150246ef4343e2399480.npy +03991062-8d0d51aca855152f8c5f8653702e8d09.npy +02801938-fe06ff4915b6665ae25f6fe802a8997.npy +04379243-eb6ded7c35e0a3f69856fa70a578baeb.npy +03928116-4c68319a9f02d3909807fae46dcfc049.npy +02691156-ad6e93a1db3e1da5977e4bb19a62128e.npy +02828884-6e166423582d68bfd5b24cafb84903c7.npy +04256520-aeff4f4375c08e8ab9c8adebb50c258c.npy +02933112-636ca387c40fa8adc59350d819542ec7.npy +04256520-4760c46c66461a79dd3adf3090c701f7.npy +03467517-c0e00a9f55c9562a1f41064618762936.npy +03624134-a98bff7180fa174742a9381145738f08.npy +03337140-b1d02b692be88b6e4c3aee8e9d3a6ffa.npy +03928116-48e315ed7ae006f7a0c70bf6db5526f4.npy +03001627-689f7ad63ed9a7baa75d03186a0409e2.npy +02691156-87cf8f265536d4369a6e43b878d5b335.npy +03001627-4c513ea0804fc008c8687ff9b0b4e4ac.npy +03691459-6ef86253eb81e4d418200338a176d705.npy +02992529-768648ae74e9d84e6d445fdc5fd8bfe7.npy +03636649-6595ee36783d261ed3281970e2c44dbe.npy +03691459-b78e6c1ed34b29e7fdd1073b17e9e51e.npy +03636649-ca65934efe289843df446319d65b9318.npy +03001627-68dc135cd4671aeaff74317afae0a323.npy +02924116-6bfa535418e49888ba23f12214cb6df3.npy +03001627-6ed95ed3e89e09ac191c3762b497eca9.npy +03467517-ea557b9733435d95e9317ebb79eeaf1a.npy +03636649-e7da3cd73ebd81146251354a8b1397eb.npy +03001627-7c467486ccea38ed9c3a7877712317b8.npy +04256520-d8de84e7c0f8cbb19473aab1da686220.npy +03001627-534b0e6e2c53a8e1a7cdfd3874ed3723.npy +03001627-43290694390ad1adfc735c9ceab0161a.npy +02933112-6a910ffe32ae2e575588a2543ef0b0b4.npy +02933112-7f6d01dfa00872a26cf87f8460db3ae0.npy +03938244-24dfe6ef933ae9692257a9702919f3a.npy +03211117-a98035c0230649c79b95c928a1983150.npy +02691156-c93d0663035962b01b1cc145b0144991.npy +02691156-4bca81eedcc3da52b8013668e30e23b0.npy +04090263-1ad3a8c8c369448c22274f18b3096ea6.npy +02691156-72d96bac651bc74c7af159eaf7625abf.npy +04379243-85fd80db82120aa719fb4103277a6b93.npy +04379243-e0f6e43ec7c44cf0f60d4dd27a88e505.npy +03691459-acdb8a7d906b126e20363e2561dd589a.npy +03636649-e13a855926f25ffc5285aeabe3f6e218.npy +02828884-3a1915451880215e9bfbe8b02639d1e9.npy +04379243-e7dd71eaab0f209dad5067eac75a07f7.npy +02828884-6b70f11a9baa59ade43f70c0a99fd544.npy +03001627-34117792b1a8c180796c584ff1fcf56d.npy +04379243-2777463657ece1a3299457639cc3cfe3.npy +03691459-57374f933930a1453f92eb5e681ffef9.npy +03636649-1bb465b8f22315d1116f219d90a571c2.npy +02958343-a2dbc7c6487ed68f1b448c2bdeb22379.npy +03467517-4a704919068627caeae5cab1248d1ec6.npy +02992529-5298e9c7eeca74f8ff2988f561e515f2.npy +04256520-2c86b652e14005a09c39abaf208a73e5.npy +04379243-5de212ea4d57b20b526934092c2c4777.npy +02818832-8a3240bc541767544b44261aa73cb2d9.npy +03337140-6f392c57518e225e7c54607407af3ab6.npy +04401088-180ef1cc23b96050bc8c03f74d3af56.npy +02828884-cb30a5a8df3007f6f4fb4dee5181bee.npy +04256520-1372c28325f2794046dd596893434005.npy +03001627-c3da3ae20c1f92650640e24a5497a2b.npy +02691156-c7fe2215d41c2db3a45193285587808f.npy +04379243-4f3e1e670753c96ac955e5ed03ef3a2f.npy +04379243-e566fd9bbc3d51d377b9297f3055210.npy +02828884-3363d17303f69d7fad5067eac75a07f7.npy +02933112-a21e3a21401f889defacb264ebf1ec75.npy +04379243-cc182c3aa204614540f68c5e459bb389.npy +03624134-68c2ea6a1c8c147e30f57e42c77d3894.npy +04379243-d819fc4d86af592f7394c9d8807c7bdd.npy +03642806-f0fb8d7162a100481492bb7d502a53a8.npy +03513137-b4c223db8b1a30016cf94eaa382e4d1.npy +04379243-5a61158cfba0bb6a80360680c1602c7d.npy +03325088-f5e2551d23370d93c36fb70296e45483.npy +03211117-f8a23c22e76666a3d4ab0eed66631cfe.npy +02876657-d8b6c270d29c58c55627157b31e16dc2.npy +03593526-6bc426e7226f6f22362d7fcfd32ff15d.npy +02691156-645cccbc057c79cdcc57882dfaef8a57.npy +02691156-d81042a53dd1cc5bd90bfc986bc4c94d.npy +04379243-e6684a7ab98d2809856053d38b62525e.npy +04379243-fda71e511d095837acbf0573260a18d4.npy +03636649-58484d1c37df459e32acbbe2387ce75b.npy +02958343-5bb0076c269d5cb1ad19b94b8069bb8b.npy +02828884-beae527c550f5ce8e4ed7bd95fe664b.npy +03001627-e052eaa1d5bbe795ded10515704c9720.npy +04530566-ae8ccc2a90c7d57ff107f18bfa25e296.npy +03948459-63e7e84894e95a8015595517be070250.npy +02691156-f6ea6663b48bf78261f1ef59130c405d.npy +04379243-d7cde91c536c6502d7a1dc9bb68fc381.npy +04379243-7588da8ef1e427d1177f2a3a0c71fbcd.npy +02958343-7483c242d7feb3a5b9da62c54efcb32b.npy +03001627-30f68a6304d6906c9bdca9b7303475c3.npy +03001627-395868f297f01d2d492d9da2668ec34c.npy +02808440-722a8934497d70d18fcae10bdcf407e9.npy +02808440-ffa8c8fe242f0df054d7082b34825ef0.npy +03624134-9d424831d05d363d870906b5178d97bd.npy +03467517-fc7231fd95d1e4687a57dd3c9d98d88.npy +02933112-14a093126f5764bcf2792e4b1535c6c3.npy +04379243-5f4c30f80956bbd25fc5e56a56e86bdf.npy +03001627-d36ecfec3f3c18a9a28fdea8831e592e.npy +04379243-8840824c8e5cfafff2b7361116ad2337.npy +04074963-33a7613166c65aa0c7c51d4ea74651a7.npy +04379243-f977ba3ec46bf1c064a940596f3d867b.npy +04379243-e19080d150b1932ab20aa91e9e90c311.npy +02958343-a1c337c71f246f0b1d1a964dea8a7aab.npy +02691156-f9c93ddc9b921d88a72ae0d8b7f98590.npy +04090263-ddca06d91af2db70d735fa1ab17311ec.npy +04379243-a2730a66ac07818cd3299846d5c00f08.npy +04379243-396a32fab409303c811237b87ea8b154.npy +04379243-43c9aa5ba91b803edcfcef693e7ec696.npy +04256520-dd572d69cfa263bfdb10cbf40397412f.npy +04379243-e8aed77e92a8c4daac3edc5d86dabc91.npy +04379243-30b3454ab0aedff9fc30525e763ef5eb.npy +03761084-3472585bf8e2cf3ddf3a1b0d597ce76e.npy +04530566-d830527d616f47c811b9a587ace886f7.npy +04379243-385e55a7d0e528d312fbf3eb7146682b.npy +04090263-55b86089f042d17f81d2fc3f6a98fa93.npy +04379243-81e223168807d7be74971c311d25a3b4.npy +04256520-a2bdc3a6cb13bf197a969536c4ba7f8.npy +02691156-3a3827f1a76c5230e24527abcb488f31.npy +02808440-ee70154fce37a50fb362845c6edb57fc.npy +02691156-17874281e56ff0fbfca1f1143bb6bc17.npy +04379243-ba2f81e15029a37baf7caa8fd318856.npy +04090263-67335d8a40daad7a7e60e1bca0143d66.npy +04530566-f6762e2b8bef4ffa476a01ad767951be.npy +02958343-eb1bd7389854311c14f284ebe538e531.npy +04379243-e4f6069dee09b0df237af722b64576c2.npy +04379243-274e9bcb57548a02dab956ed03b0f26c.npy +03790512-83d3483c6c9edc39949b12cf3977a48b.npy +04090263-a20f4c1ff94b9d35127e0873cfaa7b8.npy +03642806-33b9567a9f534747cdd9e16bfb7eee3d.npy +03001627-c487441af8ac37a733718c332b0d7bfd.npy +03001627-740cc6d4d1c6901eadb91c074e672e22.npy +02691156-d06035fb4ba89c91f119374ee5d5f944.npy +04090263-73ce9a5617acc6dbf1e0fcef68407ae5.npy +03467517-7eee3b79e053759143891ae68a82472e.npy +03797390-604fcae9d93201d9d7f470ee20dce9e0.npy +03001627-c93860b7f38bf628bda72093f9b5aa73.npy +02691156-c31f5303997022c842c20743f866e1a6.npy +02691156-bce1b10c92fb9fc81b7a4091d85f2e8d.npy +03001627-95792c6761663652aece045e8bdac80f.npy +03636649-9023acca19d27f3fd49b2e04785f8492.npy +02871439-2567c4d8f4da409e1362d127df6d94eb.npy +04090263-c51600abc4b5736ece58fb8fdf218569.npy +02691156-997539bb0a0d8cf852c3271e911ffe19.npy +02958343-a16ff37768fe676473d32960f279a9cb.npy +04225987-d9b0de3b3aecfffb1fabf3cbd0fc77bc.npy +03001627-873c017f35957717b56a13a4b2372aa4.npy +04379243-719d38e7ec228bc9ad329b1997e89fc7.npy +03001627-e102ff4df6f28b6cdb400c09abe26220.npy +03642806-b211cfb105e9f97e6436916a86a90ed7.npy +02958343-58569e7feac27d3e5da8146fec888d45.npy +03001627-ad023095f1868d3019fb4103277a6b93.npy +02691156-88883a7ad39baf47bd46d022fd7d80aa.npy +02933112-6de399f706f2972970365ad078f710ff.npy +03001627-311c07b96ce39f82c70d3fe6f2ca143f.npy +04530566-667c662b55519e4650cff0d5bea1684.npy +04379243-b78d5b0748c83f3f855931d119219022.npy +02691156-6da4668de7ccdd0d4d10a13d437fced6.npy +02958343-6b0238b41337365a3330c5ee7577e4de.npy +02933112-a2dc947048077f4bd0b36851d61b6fca.npy +04256520-84a119d032947cdf1da03d263d0d0387.npy +04379243-7bc93a4cc26fab5c8c12b667670a35f2.npy +03991062-312314e1dfd5173a9f71dc1b1525f6a1.npy +03001627-82ac145a471e406f35836c728d324152.npy +03001627-6844180c300bbf852edea1c2bfa3bc56.npy +02992529-864b69db6dfc4bd0d4b4ae2ff4c58b57.npy +04379243-3c1b4a85f3a287fe47d51fb55a1c2980.npy +04379243-63a2d10d7c77424ad214ef3f65f73d74.npy +04330267-32fef525b8b75d2bdd833638fb82f742.npy +03001627-8180afee86f2075519fb4103277a6b93.npy +02958343-99f49d11dad8ee25e517b5f5894c76d9.npy +04379243-7bebd474258ec29e3c594bb716fb0dca.npy +04379243-8673b121b420cc0ca23949c21eddef76.npy +03593526-f2599921c8e0a76ea4e7499e379fa4fc.npy +04379243-ec98b08c2093d435f51f77a6d7299806.npy +04379243-e8b3da6a6d938b475966c5a46a5a6ec8.npy +03001627-9d151e778dd4a3f7f91663a74ccd2338.npy +04379243-7da19b39d092fc8e33b12e4baae47737.npy +02691156-863742f8e07f52ba4c3a35cee92bb95b.npy +04379243-c0d8f876e068f17adebc282c830998c6.npy +02828884-b77813d8b4fb7c606919f8efc25fe2eb.npy +03467517-cb9bf7f11fc58db41afedc87fe387fe.npy +03928116-ef668f117f843e0a8be892244b73e9f4.npy +04379243-87ab01946ad4a2f6e56bc109beb9eb57.npy +03991062-3547134cc7eb68e2ffc6e457221b9271.npy +04530566-81d9e9f072f73e42c71a2f2273897a58.npy +03001627-c585ee093bfd52af6512b7b24f3d84.npy +04379243-4d959d3b7b3721d448ee6d5fb14cf83d.npy +04379243-29de23533f0a9c31b79de6fdd84b2221.npy +04256520-6c9beda59f24f107b001e9ae2ac46c17.npy +03001627-90b181de9005fbd04cd0eccf52b625bc.npy +03928116-a27dc2aecb6fa9f69cd438906b0d02a4.npy +02958343-57ad55aefd13445c94a5ecac47d28f09.npy +04379243-a93d61d10d489c8eb2c2cd006d206129.npy +03991062-e5fd89e60fb6f668228d0d8aa4a41f21.npy +02958343-2fcec17ab09a42782a9eb0f146e94477.npy +03691459-68393fdf9730d1c86e95461e6c2993ce.npy +03001627-4ad85a7d1ebf49e3490ad276cd2af3a4.npy +03928116-d1fe87277b6002405aa0446e42ad65.npy +02828884-6ba411c181323fecea2b566ddae9e6f6.npy +03001627-d2992fd5e6715bad3bbf93f83cbaf271.npy +02691156-320e542b0b2f8afa248b612e49a6e572.npy +04554684-4713da50446a7595df3a1b0d597ce76e.npy +03325088-bcf2c837460a391954d7082b34825ef0.npy +03207941-6e85f6897e07e0b1df3a1b0d597ce76e.npy +02958343-9fe68c848c1385a2a9733fa2ac6b95bc.npy +03001627-9c8d3c5779871705d22218517e73100.npy +04379243-45b6c77fd17726713002761e7a3ba3bd.npy +03325088-75f3d28ed37de79c3ca0c4be71e7b721.npy +02691156-d7454b0e80d3236ff268234accd8cf4e.npy +03046257-f6964ba8472cd2bc7adeea6eb984f491.npy +02958343-ac482136fc30fd5ad8f405c5ec4e8cb0.npy +03636649-ea5893e12134c6272f798bd8a3edd4de.npy +03467517-a576b89276b4afd4dfddf59b80ae0f2e.npy +04090263-92fe43536b3f6dc1593fee7ac9114e04.npy +04379243-d0c369ef812dc0cb1839c27e793b8c3c.npy +03467517-910e903e228fc0ca8c8de43217db4540.npy +03691459-afd431c30a98f782d52af5b75b4cbd2d.npy +03636649-68a94becfec1965e21d6b7a56ef55b4.npy +03691459-b2af20dc171d40e4d4e62d99c536bbaf.npy +04530566-4944328c0ea895c53f464857aba8c0eb.npy +04256520-487635f7daf9ff48b3bd1e430b6587.npy +02933112-b278c93f18480b362ea98d69e91ba870.npy +03325088-69fd9452cf1cbeabb362845c6edb57fc.npy +04379243-20b5a668a57dcdb3402fc9e845187711.npy +02958343-747c49bca6d4ae9d7c84d27684eb86f7.npy +02828884-9b1ed4bd84562d3f406f2f420f742d6.npy +03001627-92c176547858fd2cf91663a74ccd2338.npy +02691156-1e827425b289432e8b96ae1a0a8b84ec.npy +03691459-16bf19a982c7cd71dd6a08110bca7bd5.npy +03948459-378c3f18cf130bace1f2a1daf140ac9f.npy +02924116-4cc81551037031571d008b909e781f21.npy +02924116-9cc4191d5af880a131a492bf3af5da7d.npy +04330267-e3650521e9c1979ea3cde9bbf4c69d5a.npy +02958343-4ebf1a8cbbd4a05228044fe9244db50a.npy +03001627-a99285df8c6d4578b980c976a65c0d7f.npy +02691156-2a3d485b0214d6a182389daa2190d234.npy +03211117-3863575f24e6bbe3fe5c8ffd0f5eba47.npy +02924116-2d44416a2f00fff08fd1fd158db1677c.npy +04256520-d9ae4cecb8203838f652f706160dc96d.npy +03691459-b3009e2384620945a35bbc252ec176f3.npy +03001627-103a0a413d4c3353a723872ad91e4ed1.npy +04256520-32198f8e02253fc0d1fbf79741fcd6d6.npy +04379243-87ebd707ca90700d8b424343280aeccb.npy +04379243-7fdb1575e7f15c199d9fad88e2f4c8ff.npy +04004475-c7dc190e3b4d9875e6d38cae12e77b1f.npy +02933112-740eb7316c76854ace5d6e9371bb5c33.npy +02876657-c61edfb672986ee48a9393b5e735dbde.npy +03001627-a20df07368113438ac59dcddec3b075.npy +02933112-71d240b4e2e79be96a001de88d8cd8d9.npy +02958343-90f2e2d8f9b89074425b2c354eccabaf.npy +03759954-18ff360b39e5306272c797c96ca37495.npy +03211117-94525af6a244a33c21d7ca6ede0e9373.npy +03001627-86d77a9e22be4d5773fdbe4b39ff4036.npy +02691156-c85a76404b85d94e62b600da24e0965.npy +02958343-c30bf6d1ae428497c7f3070d3c7b9f30.npy +04379243-ca13d22c81c74698d97cb887517a1526.npy +03467517-b5fb2a19bcd09e0ef1a49eb32e519d69.npy +02933112-3fc6e2baf40f4377f5afb395b99ae069.npy +03691459-a25819c97470bcb09dd0351f01396cda.npy +03211117-2198dccbee4d38e11a23ce2d1a5d3925.npy +02691156-20150c9c3038d08419bf31399c6e39e0.npy +02691156-cbc73e8bc866ecacf7f795409cb230c2.npy +02691156-9b1fc3881a5335cb44012f72ba1e15a8.npy +02747177-8bdea15ae5d929d0a2eb129d649f68cf.npy +02958343-1e12573f2d8ffca667789dfcc3262f70.npy +04090263-83859013886286905dca6305fb9f97ca.npy +03790512-a2af2d47ac7bd232c3b8d605d6b133fb.npy +02942699-9533618250e35304514fae39ba03db5.npy +04379243-4da91eb1adb9e960ad5067eac75a07f7.npy +03513137-a6d6d755b17fdbbc3e8b63b9578c7894.npy +02924116-8b68f086176443b8128fe65339f3ddb2.npy +04379243-db8678030bede8ba88853ff6bbbb4a9d.npy +04379243-9ef38dea16d4d335a71c812e027f94d9.npy +03593526-6596b4cadc29d0448de42fc1392c2139.npy +04379243-6c50ffea3a4ec86655f46d55537192b6.npy +02828884-2d1e5eeb255e79dcab53bf7fa22f3636.npy +04379243-f02907c5c42e1e766f1e07a56c129dfc.npy +02691156-9c41b0040048581c32387cdb9b2a84d5.npy +04379243-80acb994a8dd6d636831079c2c481dd3.npy +04256520-2097fba74518dc6e4a949e376cab703f.npy +04090263-8933f22af2576e5b9f433921788191f3.npy +03001627-7f271ecbdeb7610d637adadafee6f182.npy +04554684-60f7d79d10e19134a3e7878f2bb5f0ca.npy +03991062-7773a6283bd25740ffc6e457221b9271.npy +04090263-d5ee8eeeed055401a3a714c763a6fafd.npy +03691459-ac951c58cd826af6a89585af9e32f3d7.npy +02876657-75bf30ec68b8477e7099d25c8e75cf58.npy +02992529-453c590f0a1b37c1e0c2427da07ca8c6.npy +04379243-5ea758a6391a2f814b7c5e48b51e5c7c.npy +04256520-b4c5addeacfce8242165c54dcecaacb4.npy +02691156-57f1dfb095bbe82cafc7bdb2f8d1ea84.npy +04379243-e57509d06a49646c490ad276cd2af3a4.npy +03001627-6ea2aabe267b519537b2bb75885cfc44.npy +02933112-c6abd725ec744274b8710a3469971b1.npy +03691459-7e359607ecf460f399372ee1e6dff278.npy +03593526-ace45c3e1de6058ee694be5819d751ba.npy +03001627-4e5e8af0880b0d98febad4f49b26ec52.npy +04379243-f69b664bb78a4c2f7537eb150af3dadf.npy +02691156-6d432caaa8eba4fb44b2fa2cac0778f5.npy +03691459-8df018bf733ff01cf00aae52edb0b7b.npy +02691156-2494cb5facfe7b1f85e0a2007a11e92f.npy +04256520-191c92adeef9964c14038d588fd1342f.npy +02876657-1071fa4cddb2da2fc8724d5673a063a6.npy +02691156-a4f5ce5926123e472e78e1154b9a2647.npy +03691459-6341662056860c3e225f3f0d46b4fca3.npy +03001627-aeb86d8354eaafa232acff7796d8c3b3.npy +03691459-38f418f2d64692df63ee8a34069b7c5.npy +04256520-2f458ca5f25954ea9f2349486c570dd4.npy +03001627-d4f5c3e3eab52d0a3334fb6668ccd834.npy +04379243-ff3f1004c4126b966d75aa5db61c1fe9.npy +03636649-b6efb78876150d45c94b622f1207af2.npy +03211117-dec6a8c1c01e148d20685b5a7e34b501.npy +04256520-8641e421ade0f7cae136ac3990ab77b2.npy +03938244-2b627f36c6777472f51f77a6d7299806.npy +04256520-1a389652d23b9cc06bfa0701d875ff10.npy +04330267-8ff18f81de484792f0b94599b4efe81.npy +04090263-65d6c3cd8c1edfea719b648239c8e160.npy +03001627-60c0c32187f4e2ddf51f77a6d7299806.npy +02828884-b218e59af74f0be4ee9005feeed08b86.npy +04256520-26b0765b08c86fed52db1d2b4104f173.npy +04379243-51205a57beb69476fa4763675e844f9c.npy +03948459-446e4145b475eb245751d640a4e334.npy +02691156-ba784e6de35a5c6b4f8a08a5e6b028e7.npy +03001627-19d7db03d81663394733824eae5cd9ae.npy +03211117-581df3d934bbb7d3206de7995cd4a74d.npy +04004475-73a7d3d05b9dd459ffe3432ba4f2e6d3.npy +04379243-f41198b81216f36ff155d75bbf62b80.npy +02933112-b5a6edf04474c327ded35d98d26f9668.npy +02691156-674115a86dd196c142c20743f866e1a6.npy +02691156-71ad36bd32ad44a0c503a3776fc280fe.npy +03691459-119fc0c18388a2a2e338ca8c90019f12.npy +02924116-f8977b22fa73c57910c9f5a2e580dd66.npy +04379243-929cefd882de6f9b5048ab7650c7a7c.npy +02958343-9375ded98380ccc77bbf13cb42ad9d73.npy +02992529-7ea27ed05044031a6fe19ebe291582.npy +03325088-d799034e7a417a97b362845c6edb57fc.npy +03636649-6f4f8f3788da22817217386867d08cc.npy +04401088-7d93b8dae79d5bbe7015d3b6f402d5a4.npy +02691156-829108f586f9d0ac7f5c403400264eea.npy +03001627-c6898b62e82e61a8930422448288ea.npy +04460130-de08da18d316f927a72fcffccc240663.npy +04379243-ccad4d1ffac1b5e978ebd8af2a314e49.npy +03991062-d6342010f3e2502fa4b84ca629203b44.npy +02691156-2228845a400dbad30fb60bd5470eb25.npy +02933112-c59d2a61caf94a97c59350d819542ec7.npy +02958343-f2b350b6c36eb73d1fac59b924f395d9.npy +02691156-2f4f38d774e0e941dcc75fd1795fa3a5.npy +04468005-84de1dc7422b00c627c514aa9d8cc75.npy +04401088-1b1969121f2d099b27192dc5dc6ab252.npy +02691156-d5a94c9f09d238c4c3a35cee92bb95b.npy +04379243-6a35640c7f10aa71850622797c13f562.npy +02954340-7cf439aa8382299047765668cf4023ed.npy +02691156-d3d788c1fb35227619ba010ddb4974fe.npy +04379243-e534dbb5eacd708c18885412f2b0a4f7.npy +03001627-f913501826c588e89753496ba23f2183.npy +04554684-434fc8832f3ade492d5c22cc9b713d25.npy +02828884-dc286270b2256b94d2b12aa6a0f050b3.npy +02924116-1b6f9f69c1bf86ef41556f795d265590.npy +02992529-1cd8004a1e0dd825c33f370fa5b41cf7.npy +02954340-dc3e5c0457defe87a52821bf1aa3b19a.npy +02958343-24d7494c6b92c6e7c1bbb501b1d87871.npy +04256520-c4af170f18f0d6edaaf0ad030fc37d94.npy +04379243-7bbdfac048aefc9a5634c21965ee6bab.npy +03207941-466e441dffbdf9fc14b35a7d7cea7130.npy +02691156-e4ac77fdf28116232fa725d7a62a02a.npy +02933112-832fa486c60335f66ca64288cf1b7ee0.npy +03001627-64a585a441f2ffa336c8b9bf2576aca2.npy +03001627-935093c683edbf2087946594df4e196c.npy +03046257-df5b2ba70ceaa05923500a5b036df62e.npy +04379243-5a9a9b14c1830de641cf86c757faf4f9.npy +03636649-8913c3dff1651a316a3d00506cb9ed19.npy +02801938-5eea24527c8b3124cb2a965e75be701c.npy +02933112-131992dab1550a7aec24cae3e129c189.npy +03001627-f2b2448978785cf5fb63369d5dd85d25.npy +03001627-341fcdd8a40a2612456cbf78e1e89022.npy +04401088-68ffa3cd161114cf55f5bce8dd67399d.npy +04379243-cc82b660e39ee47df287722009141c0e.npy +04090263-b4f358642d91251d26acd17789ec9c7b.npy +03211117-aa92ecd31491bca87a88a2ad67bfd073.npy +03001627-708fabd1e1a39a77aa6bb5920f533ce3.npy +04090263-2e0fd9303c251ccef02ee453ff283e26.npy +04379243-6ba6309d74f4a131272505863dd1b8dc.npy +03001627-b7073426bf9332187c564a6b9ce2156f.npy +02691156-2ef20ad4c579812571d03b466c72ce41.npy +04379243-d0346744d67b08b099e8bf807e902261.npy +03001627-20c6158bbeb2735ed1dcc55e36186e4e.npy +04090263-30fcbf2fed0eb241d8569d1a6c25406f.npy +03636649-eaca02e8f065925dbaf5b49ad7809302.npy +03593526-ce6f30234bb3797fa2ee63b46530621c.npy +02958343-58da19fef63348a56b6ef877dc525506.npy +02933112-6f113f2baf10463635836c728d324152.npy +03001627-81b27636162e148bb3fb065fa3089331.npy +02958343-8202d2165aaff4c05fb2da48d9c8120d.npy +04379243-4561b621e5b7c1ae8cb5d9909aeb1309.npy +03001627-ea1bfe81b88395fcaa29e9f0529e8ef7.npy +04460130-90143acb141fb1cb4292de5cdfae65e2.npy +03759954-1c2267e8b8a099a47457e76661a399e9.npy +02691156-e1324a093b45645c5a5672eede2b271f.npy +04379243-b12ccf1813b424864a62dd9e5e4067d1.npy +02691156-6db6f79bff14b883a0ff12a4a79c7c7b.npy +02992529-b73398902d1c267b5eed8c8b1cd54386.npy +02691156-7b485e11f80e0577bc0909d98a1ff2b4.npy +03691459-72c5cab12c0ddb22a0fd8d18f37cdbfc.npy +02691156-c9764fd84080da3f4fb6842b3610149.npy +04379243-a6e066da6311c2c7f4d017dd03935e6c.npy +04379243-366a7129cdbaa0b8fb94cf898f4fa24c.npy +04379243-54e85b248576c4eb57cd80d4b17e7e11.npy +04090263-5b5acb01373af13180c2e60c312b0f09.npy +02958343-c1186d49101dcd513a0daf3e5400b95c.npy +04379243-ce96139ae5a4dbfa55f46d55537192b6.npy +02924116-845599a0f9d7951acbdda2562495e10b.npy +04379243-90a2174624d8b62da53326e496617646.npy +04090263-76377dc3d6b1dad2c0aaedf10d776af7.npy +02958343-9f08e434ad95c4bbbc37558785e0529e.npy +04379243-9d2c5a0dbfc811b3f9ae74fa595a8a63.npy +03636649-d939b56b53aa7e7c42f80363988bcb92.npy +04090263-3e3ee43e001e800a8f06d4785681c4e.npy +04379243-f772e5b89475fd2e4719088c8e42c6ab.npy +04401088-36b3329dc0bbd86989704dab2d2a8ab9.npy +03467517-3527ff33cb9afa1aae4662a5bb3d78e9.npy +03636649-6918fb9f51d1dc3dba9ea396e14c59f2.npy +02691156-a702da03d770f5096e2738fc9da60e6f.npy +03624134-31b39f0851060f87913cad523820e930.npy +02828884-ac78c8b91417aa5bd2f4120f473fc3e4.npy +02958343-2cc413c3ea9800b3cf1e58caa15acb49.npy +03001627-d28423569bfd84708336a02debb9923b.npy +04379243-407276907088c8c9f51f77a6d7299806.npy +03211117-3aee103b0bde9cd7c16bf14ed6ef2f6.npy +02958343-9748063440a449ab3db642d8dff7fbe6.npy +03046257-37a995cd9a8a125743dbb6421d614c0d.npy +04401088-ab2cdd82bc69255f1fc489fbdec3fa1.npy +03261776-64c7ed011cb25eb5f9df692fb910a2fa.npy +02958343-63428e5fb6fb627aea5698f3cf7b2f4b.npy +04379243-e25fdb977fb867fdc3bd24f986301745.npy +03761084-c1851c910969d154df78375e5c76ea3d.npy +04379243-4f06f4d04d239448bfa17a32b3866b83.npy +04379243-aa96704dbd5e852cd9fad8aba2c312b7.npy +04379243-cd4e8748514e028642d23b95defe1ce5.npy +03691459-16ad8ba41b4caaf66a0a07a21e1bacf4.npy +03593526-852e1bca3ec5fdeb5dc9e54641a3f5bb.npy +04256520-78fa28a031f1042f3bd16075d47dda52.npy +04256520-507d740bec19238d18f52c8a4cfcbe33.npy +04379243-a4b2870ce7a54b8eec11c6b035aac769.npy +04401088-f420bf37baaeee5621844676433a0aca.npy +04530566-a3e0b522698e11a87e43a7221507fad.npy +04256520-f563b39b846922f22ea98d69e91ba870.npy +03636649-22ca1d5fbd8e6eac7b79156a61ad4c01.npy +03691459-54e61267b88174967bc8772c5c1a0c19.npy +04379243-651706776926937314b86d5282eb8301.npy +04256520-cd74a153b605c6a3cabc196a7f35f1aa.npy +04379243-397c56f15e547fad1bb088904f7cb154.npy +03211117-cadc40a7bb182a40cc229b563d900f4b.npy +04379243-f4d0e1be9884f45cd2fc64a9331b7788.npy +03691459-5948bd85a58330628de9f116e0231954.npy +02933112-2cd6ee7e592939a9824662341ce2b233.npy +02808440-36a554e2ef628266b0d51feef5761dce.npy +02992529-addf767a669d9732691c3af43bf5f97e.npy +04256520-fd4dd071f73ca07355eab99951962891.npy +02691156-b153004c293d4b151f32208e53f871eb.npy +03001627-6a227aa2e1fb8ecf51f77a6d7299806.npy +04090263-a0025e80ada9cf91ae9e1c81f7e5b0b6.npy +03001627-47bfa972100a782519fb4103277a6b93.npy +03325088-8c853348df36663321831d2245cf06.npy +03325088-4492ee234374c85914b35a7d7cea7130.npy +03691459-8a3edcc398f34fe534b2581df0f941a1.npy +03001627-90cae938e34b11a429823c412ca4576c.npy +03691459-453c959963a529322633ff66beb9cf31.npy +03001627-c2430d27be01948ab8e1b99345a5afd4.npy +02828884-52c13c1c0812699120f85be7e9edc22b.npy +03636649-4c3a0886647ae06a6ecf9e4734c75a01.npy +02958343-ed6bf649ad5b3d82b1bb46d2556ba67d.npy +04379243-79eb4b57cbd73e117e2e50070ddfd27c.npy +02933112-c6e91d50e1bb3351a8851b4eb6161973.npy +03001627-50a4aa069dcd171937b2bb75885cfc44.npy +03001627-87afe5137d675efb73418f9a8c25ad1a.npy +04401088-67c6c3db87a1d72b7b8e0bea6a77fb50.npy +04530566-c79c87dcf17a40f698501ff072a5cd78.npy +04090263-fe2e9f0363866aba8868d0641feb1888.npy +04379243-fafd354b0713882e4532856089dfcdf5.npy +03046257-883d4ed6c9441e8e707e09f70814b7ed.npy +02808440-3858ea48966b8e5654d7082b34825ef0.npy +04468005-b6d765b5c2e547d64878adf45135c9ff.npy +04090263-8b0710069d95b4563a411ca33a218449.npy +03797390-79e673336e836d1333becb3a9550cbb1.npy +03467517-1758c5cbffc7f6634236d3c4918b91c6.npy +04090263-c0a8c6eca464a1ab9f433921788191f3.npy +03001627-bb13760fd1e2dc182d19175e7d19b7cb.npy +03691459-ca545c7c3bf38891af3caf4aab91511c.npy +02958343-50840e502ec2a45aafe1d4530f4c6e24.npy +04256520-84ab3d4610acab1adb352b8394e172c8.npy +04256520-afb937bd74261f5110004612ff5e29b7.npy +04379243-eb54a7a886da95f69223fc014b68160f.npy +02747177-8acbba54310b76cb6c43a5634bf2724.npy +02924116-1e4909dbe765a9dc18db89a808b64af.npy +02924116-917de64538fb9f3afe1d4530f4c6e24.npy +03991062-9fa3f163821a388d96d49c3c538e4bfa.npy +02691156-48836d07312f930223e2b52fb0c019e0.npy +04379243-3712e31c61ea51a354b250a5bdfb0136.npy +02876657-eded10bf44a2571a911cff0cb398f845.npy +02958343-6165a435160e69bef997a8fb55b67177.npy +03636649-395701deeb1b2bfd48657c771cfae685.npy +04401088-3ef3e3008fd2696ca1033de17902ec9b.npy +04401088-cfc5fce3c76610e3634fff5505144a5.npy +04379243-2a5cd32bacd3ce601ba08c4ff5d0476f.npy +04090263-c8889a93245d305518c3adaf57b2e1d8.npy +04401088-35d370a1531826adbe5693b333a3dd92.npy +02958343-1548f5fb0684d08c63155b8ebc275bd1.npy +02924116-1c39805d5ae78d319797a4124a9f002f.npy +02958343-3980afb8f986988daf285e0d3f56d074.npy +04256520-927967e761c52c11eaf288f952624966.npy +04379243-c36b95723ccd6f6da99d925f789b1cf1.npy +02958343-999007a25b5f3db3d92073757fe1175e.npy +03001627-da49d0ed41204ff65c0da4cac04adaed.npy +02747177-eddce90cae7f1468f155d75bbf62b80.npy +03710193-62536cdfffbec7902e869c74025e32a8.npy +04379243-32f8195c437b5aef51f77a6d7299806.npy +04379243-36821105af341539d810b14a81e12eca.npy +03691459-3256546f0f70af9c39c80a095f51c7bd.npy +02924116-c2441f4ed9ee23984d44f5db04bf14b8.npy +02691156-be080a797406422843afdb9c81ff2967.npy +04530566-b1bc73627283a4076b861850ae66c9d1.npy +03046257-c0eaa0bcd85626c7847d4e46a1f9f05.npy +04256520-6b6509e3589bc296c10c5f14d140478c.npy +04379243-33e0b076b1dfd411654495ddff111d98.npy +02876657-95e6a3a1232f97e3d333084c1357713e.npy +03001627-490797c10b8cdfcdf4b6538438a0b930.npy +02958343-9f4bbcf9f51fe1e42957c02bdefc95c8.npy +04530566-e1a43edb6152a3726e23bf72aec61fd1.npy +02933112-a8a4fbca233fbadb7ef0119f8dd1f40b.npy +02691156-54c0f5b611d3c7e683651cbc8e49e4f.npy +02933112-868509e96bb859bbfd5b2dc3df6521d5.npy +02691156-655ea8d8c710cf98f3a69a6853df2d7b.npy +03046257-1e61fd6a1b436ce6153d4c0fe024d18d.npy +03593526-7b6d5a7a902ca441529e78b4656a338.npy +02876657-810e90684c0d4ce5636e3a589cf8c61c.npy +02958343-4b1227b5dbf1cad92e877e82c90c24d.npy +03001627-5c83457abb14f95768c2f5eb1dd4dfaa.npy +04090263-8b00e0ea294fdedf8af39b443dc477ce.npy +03593526-c1be3d580b4088bf4cc80585c0d3d970.npy +02958343-5b4243556369155858c383066ceeaaec.npy +04256520-75418c9587b8eb0edd7fb8bdab16e83.npy +03991062-4e1845df2a98ffb858c88d30f502a452.npy +03261776-53433f3e15014d831220240e825d0985.npy +03691459-5d11e7821ec86797b646fca2237eb6.npy +02828884-a8ea7dc227b632edb88a2574e8fbb52.npy +04256520-150c9d9b92f7559f593ebeeedbff73b.npy +04530566-a3459aeef2676d7653b838b6058a8d95.npy +02958343-e169584b7e66ef074051b6e037481c7.npy +03636649-c5d999b26cc9ba381735ea0e092a805a.npy +04256520-47bfa972100a782519fb4103277a6b93.npy +02958343-f9fb47305ee7156d59139efcde1fedcb.npy +03759954-78d91f0919fc1e9c799b5809965371e5.npy +04379243-10bb44a54a12a74e4719088c8e42c6ab.npy +03001627-348528e8d474a003cb481b0b11df1849.npy +02924116-1c9568bc37d53a61c98c13d6112727de.npy +03593526-97199437c2b3acb664cc17fe2c6413a.npy +03001627-268304221a5717124a05fa063da00291.npy +03001627-bfca24444b46e75e492d9da2668ec34c.npy +03948459-f80c465c9e401dab44608b3255ca1886.npy +02924116-c9dd192e42466ce852470de2774d6099.npy +04256520-979ca0cbd4bffe37c7b11e86284a2e.npy +02924116-2baa252ceda0b508cccea738142ac97b.npy +03001627-b65c3e0800f1c67cf70828d0af10edf3.npy +02691156-b71bd3c61315abf9ad8a06dbee1d115.npy +03001627-95039795fd8db944608244cbb9b86bf5.npy +02958343-ac813039f9a4468ccc777d23edf2f8d8.npy +04256520-e3610bdf0eb38f6b4b8710a3469971b1.npy +04379243-1bd801dd5da88655d989c9f989a09ff.npy +02808440-b03cb02cab23307b71f6c2d1271354cb.npy +04530566-5b0e4acffe94b6ebd283df6ee191ad24.npy +02747177-18be3d380d248fe081faebbdea6bd9be.npy +02691156-fd528602cbde6f11bbf3143b1cb6076a.npy +03211117-416674f64be11975bc4f8438441dcb1d.npy +02876657-defc45107217afb846564a8a219239b.npy +03001627-26d98eed64a7f76318a93a45bf780820.npy +04256520-139b38251b5bab5214038d588fd1342f.npy +02992529-7eb1bb8e7f83313b5bfaa3ead015ed29.npy +04379243-2ec33e8b457ac0fa278d386bfa54545.npy +02958343-12b5e4f52c22b348d8499d8846cb4c3b.npy +02933112-31c94abeda52273286d53ab0fe94e911.npy +04379243-75024d18227e53b565f968dab29b0192.npy +03001627-c5c4e6110fbbf5d3d83578ca09f86027.npy +04004475-8f827c87f5f7c053f105ef303e18c873.npy +04379243-f85a362c7607921a7aeca7115f6949c7.npy +03636649-c5946f7781bf5167aa6c5592e5d8022c.npy +04256520-ab1435d685c06277409421506a05b6e1.npy +04256520-3dee5f41a11a1fdbdc83753cd31caa42.npy +03001627-41ab50680dfef43aba5342d638d0c267.npy +02691156-48e477d5904bb7bb1ad94eee1d03defc.npy +02958343-fe9c6862f758ee056ce6bb1d0811960f.npy +04530566-7e7ec66ebdd4df7ed1745f739fc0fa03.npy +04530566-c993c40ab88b161e3cedf90fdd80720e.npy +04090263-e6fecb2700247e1dd87c63d8b3018b58.npy +04256520-d835768fc0cc3300ccda8d28b44378b7.npy +03001627-71dbb37c026cc338eff2e9bdfc79fa2.npy +02992529-8ce0fff87979560bed1f9cd2184d7b73.npy +04379243-c0546f05e8a4542f1cf1ba58f558540c.npy +03001627-b29f5c7c73908424685a4d2d2b5da82a.npy +02691156-7f4ceb12e48be00ea4642ec4b6f68a.npy +04379243-ce1bfb999b211d423825a5bc524f67c9.npy +04530566-f2d7625709d7bdaea6dae8586082d789.npy +03211117-31ea284fd46d2d6013d823b13369c182.npy +04379243-94d6518cf1e00eaac013a7bed5288654.npy +03691459-336ae67af51a13309e87d2bdcb41f548.npy +03001627-d58df0968070bf3b4b3c42e318f3affc.npy +04256520-d9acd27e2a9b12d3ae685ca100c909e8.npy +04379243-4ce90fe70faf4c3e255bc16374754e69.npy +02958343-613bf2e7f987553220d9307ef0bda318.npy +02828884-9ebca72c02d26886a6e82f4002a10be2.npy +04256520-6bfe4dac77d317de1181122615f0a10.npy +04090263-6d7b8924dd47dc6e7330912d1744819c.npy +03001627-13cdc9e018a811a3ad484915511ccff6.npy +03001627-f85f33b3f6cac48a512d71be7dbf2d60.npy +04379243-7988c8f23dc634678de5f815e8387cfc.npy +03211117-301148e373839ecc37ab55b97a5e9f9.npy +03001627-2e5e60f57621c1e7480c54eaada840a1.npy +03624134-efbe696985dcb81ae3912d46f2dbb69d.npy +03001627-a3e990cd563b7a57ea411f5a15742da6.npy +04379243-e9c3a3aa2278608bec15b38012222fa8.npy +04090263-9301e31bfb2f8f8d88be2a30dd556a09.npy +04256520-11f31367f34bfea04b3c42e318f3affc.npy +04225987-7a00dee660ee94f5dfa6594bd6ded322.npy +04530566-42a8428a3d909fd64de203ef6842ee61.npy +02808440-857adf3f4e2845b044221bef0fa3c36b.npy +03001627-7eedcb6d76b8c23a9cdb421f6af95e5f.npy +04090263-681e871906643ac4f9a24531fe7127c2.npy +03001627-c7ae4cc12a7bc2581fa16f9a5527bb27.npy +02691156-117861b9ebca4f17c69cb28fb4b4d257.npy +03001627-75d0664363f418efe461a9a9741d9415.npy +03636649-9af818e49ae8a9357bbff3af6bac359e.npy +02691156-649a8f44ccc86f4843513dd632697ccb.npy +04256520-859e3eab73311f38ce59ea70152320fa.npy +02876657-8a0320b2be22e234d0d131ea6d955bf0.npy +03001627-30074024ad3c581a19fb4103277a6b93.npy +02691156-97bc5fffde64178f43afdb9c81ff2967.npy +03636649-155c83f40406bd0c48d945252c13120a.npy +04090263-2ad41c44eab88406924d7b1c81f7a0b1.npy +02958343-985082c9239527ed728fa2df514c65d4.npy +03001627-6163793e4e973450a9b8d9d3b5cf54cc.npy +04090263-78c7c7037e2ac7a7e0490a4a721b5273.npy +04530566-c0eb62cb64ee1a31f29de30ec1bf6a3.npy +03001627-81ba38f4d3b7eac1f82a35e8b19afa86.npy +02691156-dae59259ed2a2951d13ef00338ba8c52.npy +03046257-d11f6cf17b7c9e7a741f8bafb2e2f5ae.npy +03001627-e5b6a3cf96b36a1613660685f1489e72.npy +02691156-898b4899114d9bb890baeef8ba5b93e5.npy +02933112-8dc8d2e0bdf870ec95d0ca3fdb30532a.npy +04379243-b1d643bee9cc33d9668ae11a7db5e82a.npy +03001627-c50976d44eac9f3cd7aac2535b43ae4e.npy +04090263-ae53ea0e6011cdbde2bb19fbad3e4596.npy +02958343-84f258f2969c02de6f94a44ce504367.npy +02992529-9fac50c7b7c72dc694f8f49303e93f14.npy +03001627-b10dd8cb211b26ba98d5fc0473d00a1c.npy +04379243-2766a883126503cac3bd24f986301745.npy +03001627-3ee094648665bc3fca15770f07fe3544.npy +04530566-8b2e1eabf620d76840633dde0a3c28c8.npy +04379243-c627f3639caaf614a6589c01f678d8ea.npy +02958343-341b474e01e039af59139efcde1fedcb.npy +03790512-e65c320aa245854e39e5b34b546caf02.npy +04256520-8673ce2da94bfe4ff42b5131862a2dd9.npy +04530566-786f18c5f99f7006b1d1509c24a9f631.npy +04530566-8b25d01f3fd3d5a373e9b20a29bc1d50.npy +04379243-b1bf0b775e6fc085391e4d6c585a697a.npy +04225987-48f26ddc704fec2f379c6a1d59ef7283.npy +03991062-4d637018815139ab97d540195229f372.npy +02958343-30456a19dc588d9461c6c61410fc904b.npy +02942699-550aea46c75351a387cfe978d99ba05d.npy +04379243-428279529d61b45260ddf36bc44130c3.npy +02691156-46d334b92644b9c8445d150719ce97db.npy +03325088-6f2fcfb9f844979f87dd60af81c93a3c.npy +04379243-15a95cddbc40994beefc4457af135dc1.npy +03636649-68abd2755ff4588b545bbb1b2e749fb8.npy +04256520-b3c7b4435c3d05164dc11e421397c795.npy +03211117-8b5a96b72767f7354fac5eaf08c4d9ce.npy +02691156-da6faddc7079ce8ab6befd5df74fffa2.npy +02691156-b2e86c7880a56b6f71c382fe82cf6e04.npy +03001627-fac321238dc8637eaa7cb30470f3273c.npy +02992529-3aa3d13575540a99167196b0ec8ce495.npy +02808440-474a0aefc64043da54d7082b34825ef0.npy +04530566-f36e77f80e2944ae73fb6350806be955.npy +04379243-5437d8fcd8dcb47a4733824eae5cd9ae.npy +04090263-efd891428cb699e78dd4952817969d63.npy +03691459-b754df4013a71f6873e1b2d018c0512.npy +02691156-201e40e86acd7d34f4c1adce71073351.npy +03207941-717ea298a9a70ae7e5bf1ab8e7d0b.npy +02958343-5a2d4ea15ef5c18abab6b34711b43bed.npy +02871439-6db2136ad0de3cded810b14a81e12eca.npy +04090263-97a7a1f3c53b3c5ff9489a342636086b.npy +02871439-336fa11d8fe3dd2815dd7d7985e749c1.npy +02691156-d0456644386d9149ce593c35f70d3f.npy +04379243-573e85e0e02dec63c5a208307819a3a1.npy +04379243-56e46d8bbb70b17491829b477862aff6.npy +03593526-72cd871f8335f911fe9e40361c13f085.npy +03636649-1112f253e122dc8273111597f45b8227.npy +02992529-393ae1877a5e20478139dd63d55edc44.npy +03636649-8f2e03f91a970464ef3a2c64cef919d0.npy +02871439-c40828710c91001546c4f23965b7dd40.npy +03211117-af2f3c9c8fe90380c75516c7217fb218.npy +04379243-676d6d79d32de9cec3bd24f986301745.npy +03636649-7932b195e0e8ab00726dbbf7bc5e4df3.npy +03001627-f351b1725b288d8847df6165146d5bbd.npy +03001627-f551bf7431e0fd7cf937a9747c26991f.npy +02691156-7bad9d15c0f0d3c03554ccf8c30febe7.npy +03991062-a36d457e57b67ab4a2c59a4d90e63212.npy +02876657-2a3e0c1cd0e9076cddf5870150a75bc.npy +04530566-b04e4650e547e0509803291b0f4bf532.npy +04256520-9fada8462006e138efc579970fcfc006.npy +03636649-a1d09074c83bbe418ca4aeb5e3b33af7.npy +04256520-d0e419a11fd8f4bce589b08489d157d.npy +03636649-ec2d7e5e968c3ace7ddffb7902a68a13.npy +03636649-a6413f422f4ef630fecfeea7038369e1.npy +03797390-639a1f7d09d23ea37d70172a29ade99a.npy +03991062-3d3c8f95006cc061a2c59a4d90e63212.npy +04379243-12b7462856335e3d2404817055fb55cc.npy +03001627-ce33bf3ec6438e5bef662d1962a11f02.npy +03001627-3cc6485ab499244360b0434449421de1.npy +02808440-47e7884cf9d5331c1a448a935e94526d.npy +04379243-2091efe147f9ba11e3069fe10dd75c3c.npy +04090263-6f86a5fd7d3a52dad735fa1ab17311ec.npy +04379243-17d3e93e5f3bf2044671d97b0fd17f51.npy +03991062-e0725fd7859fa238ff67c12005f72d2.npy +02871439-34128cd8b8ddbbedd92903da5c4b5ef6.npy +02691156-28d719b73b1fcd2f5de04aad18bd94c3.npy +02828884-6e27b6fc7769089f4fb4dee5181bee.npy +03642806-dd3642b10fdf3550615ca789e669df24.npy +03001627-2ed17abd0ff67d4f71a782a4379556c7.npy +03211117-eab36391bd7fb745585e5281d7025178.npy +03001627-bd500b346c427b31f7628281ecb18112.npy +02747177-81a04a676ff96a94b93fc2b66c6b86b6.npy +02808440-1ea8a2646a0e33afcd2957531fcac5d6.npy +04379243-e98f06e93bcc237afebad4f49b26ec52.npy +04256520-1896f141f12a0df135836c728d324152.npy +03001627-a910a4447648af1a35133ba9028a8318.npy +02871439-303a84aa514f566883679e873099585.npy +04379243-ac9fae8af57729945eee45c00c4de9d3.npy +02808440-663963fc3b16a4fcfc9a8c335b5abeeb.npy +02958343-3c103561d9a29ae7ddacb20b6a591772.npy +04379243-66b56ba61af420e654a2b6b20aeaf693.npy +04379243-2da6752496e0c37961c55d3f6d7eeb14.npy +03001627-7144c29cc7038186d67fae5fccab266.npy +04379243-f86ad1699aa2da6dc955e5ed03ef3a2f.npy +03593526-e0855a7115eda487186588b1d2fb9823.npy +03593526-7def3eec9ddc24d7a1c637e821f12a67.npy +02876657-89b12196a1db5a74bb8058680b6b9460.npy +04379243-e751c765bfb096da43f06ece0b2b5196.npy +02691156-2e961e38a039f1bc67711f7c205c5b63.npy +03001627-2c4e9d34472b4bccc16f7010a3b8fdee.npy +03001627-7004f4eb1a5b4a41a5e3e028709e0474.npy +04530566-47c35e001ddd44bf1f2cd7f4ede43a74.npy +04090263-ac6d4b9549853b509a2ee232a197081e.npy +03325088-cf29a33f72258731b7a867e9b35a1295.npy +04256520-44854046021846f219fb4103277a6b93.npy +04090263-39b95d373f0ca2de80c2e60c312b0f09.npy +03636649-6ba931adfa36c7965208aab875b932bc.npy +02773838-766fe076d4cdef8cf0117851f0671fde.npy +03642806-34715b469341fd4ce4b68d3b17c43658.npy +03624134-8facbe9d9f4da233d15a5887ec2183c9.npy +03001627-4521ce028e5009811866a0bc19f46a1d.npy +03325088-14269c9440e416d6b7a867e9b35a1295.npy +03001627-65c7a3d8fb95311c492d9da2668ec34c.npy +04090263-c383dcc4c30c70b41a3b39b07e4b3d0f.npy +04090263-c224535cfe42b795a39dc4a567ce225f.npy +04379243-13c51c08c3695a09eda47978b73f5994.npy +02691156-351e24a503c49840cc0472b5df09bf08.npy +02871439-c41a98460321abd5968731dfb1dc1f13.npy +03642806-6f6c8762f55f94e24145b5f47fac09a5.npy +04379243-83f1ff21744e71ad2690c0a5b39562ad.npy +04530566-ead18d83024fab8deb2c303a0e0d287b.npy +02747177-c27682e5292ce95b7eee615e75bc3b77.npy +04090263-2300f57a06457c092235a9282623d937.npy +03001627-c983108db7fcfa3619fb4103277a6b93.npy +02924116-a8d7f2228ca5e0d944bbf36763afdb18.npy +02691156-fdb87fe46a2dd5ae148cecac5cfe1090.npy +03001627-7297ec6faebb50aa1f285be552b78f9a.npy +04090263-5870c596f2359677d3360026d8a2282d.npy +02958343-9a58eccb0ab51d2fa790ab932daff416.npy +03991062-1a85e0a1a4991a92a2c59a4d90e63212.npy +04379243-9fc9605f6ed5762553cc33364504d5.npy +03001627-5f5a3d412807984a27f9863535eba56c.npy +04379243-4c977a08c3969494d5883ca9b41ac387.npy +02958343-26eb9c499fe0ff9edc10f9c1726304b1.npy +04379243-6965b32c6732f5c0668ae11a7db5e82a.npy +03207941-b132e38eab307f2649ad049dc6857ad1.npy +04379243-a06c61dbd3a5f3a5b903ba10d2ec446.npy +03467517-15222c5926c7058cc6df7dab8e567ef6.npy +02828884-af5bec1a8ce2348663b2acb037dfbcde.npy +03636649-cb4f1fc93f5047e1ecd8a55986a51a84.npy +02871439-b1b511bda428926c180cff5124af98b1.npy +02691156-98b163efbbdf20c898dc7d57268f30d4.npy +04379243-338c59dd95a2e93362e5325f0ce7656f.npy +04379243-394e24e46063786ef7632814cbc80bf2.npy +03001627-cfbd835002da52be8f8c11a24c52ebb.npy +04379243-ac343084fcd0677bf78817f740055424.npy +04530566-2362039302d80f99f2c9de96bdb467eb.npy +04225987-e38a4e6fb32b51a1bebb1fbb949ea955.npy +02958343-eb5e956c2dbd44248bb11dbc05ffaa74.npy +02828884-19d52509d16a9c2c81faebbdea6bd9be.npy +04379243-e75138a7ea380470191dd4460a0b4ef0.npy +02924116-c198f659a9e0694890e260bfe14d0e5.npy +03691459-40169512586f3b6f77964cc933a9a0ba.npy +02691156-47bb2e8a53331a2f3554ccf8c30febe7.npy +02933112-4eb789e7b91d1c7374fd54817454ba03.npy +02691156-4008286f2fe8b6a97c44cd1ce3d402d0.npy +04256520-455fad12d4170e398d36ea78699efab5.npy +04379243-747dd84010a0c34d78c3eead10f81a63.npy +03467517-a0561f911b532556aeafd07a67347f0e.npy +04530566-a28a7d34ad5f006f959df312c935a698.npy +03001627-878eee28ccc28b2e4c7384dbb75cab0d.npy +03928116-6fd1d36339cd6ecebd90a01d51d28fe1.npy +03001627-eacc4fa00a65e56e374f33ec97ba7ca2.npy +03636649-42e6823a1ad23819182816640e3b1915.npy +02808440-353c2a6611d4f72d3321831d2245cf06.npy +03001627-f4e355f3c1acc9f01ec783b810d76c4a.npy +04379243-c359be2db828da29cfcb2cdfd88e07cb.npy +02880940-a29f53390194166665c638ab0bc6bc66.npy +02801938-87d80e10b71ebc1f7846915cc11caff4.npy +02880940-5563324c9902f243a2c59a4d90e63212.npy +04379243-9e3f1901ea14aca753315facdf531a34.npy +03636649-3781aa0aaed95b8049244b68aadec703.npy +02691156-eb2ac022b65f827e5e0925f0d15a8f74.npy +03636649-5f1dec078cee0f78c580fdeb5460f6d6.npy +02691156-79f0a9d3d78764ec19ef6dae2862f036.npy +02828884-5bccce74947b32e38a92622cf31f5cb9.npy +02933112-5e61fc6946ed74c3532e8683617554c4.npy +03001627-6d63b89b904264a15fc64c97c5117aac.npy +02747177-95c5a762fc8624859d7f638b2b2e0564.npy +04379243-74c14e9a4ac91242388406859b1b0545.npy +04256520-a7b07dd40ee6af36747bd07ee1e3f697.npy +04256520-6f48fa0ce33292249ac506757b31ba4.npy +03085013-d0885b3f14be8fbe2070d983a046060.npy +02691156-ddd6c2a51c25036c8a43cd65b179a1ff.npy +04379243-ba212f7bfeb2faa75e05d85b12fbe60c.npy +03948459-9cf4051dae7a46ed77b7d0d4764c121d.npy +02808440-d4d61ab0356aa6d0b362845c6edb57fc.npy +02691156-a2c2ad021c80f08c973e06016b069172.npy +03467517-6cdeed314f07b7a8244cb06b21c0ad9a.npy +04256520-6bb62bdd954cfa07e30cb284f2e8e5bf.npy +04379243-91b12d3af7bc52c5550384fc1c3c3d02.npy +02691156-b34526d94a00ab55f5a25dd70eb863e0.npy +04379243-90494fe31b3db5f927eacc88b2b78746.npy +02924116-64998426e6d48ae358dbdf2b5c6acfca.npy +04530566-b8905c60432aadddb4a8f569bbe9f7c5.npy +02828884-e0ecbe3b106f94dbd2b12aa6a0f050b3.npy +02747177-663082bdb695ea9ccb2a965e75be701c.npy +04090263-56737c6d611f2a8465a6407cecfc902e.npy +03001627-4372b33dfc84c2f56a9ab6fc87e1604e.npy +04379243-6e81c795bb5f2fdaadb72b90b2eeacbb.npy +02958343-9e1e61f67c4a41e09783918b4b55c30a.npy +03636649-2768a3ebfde6410dcdfc3ede082b8a07.npy +02992529-db4c6fcc45cdee08d8dc338f42ea38e9.npy +03325088-d3c3cf0cb64bb51a208dc8b344513a31.npy +03991062-24eb0442669efd9b64558a1c6a2a9f11.npy +04468005-1c05fbffc0d5e60734813c288b6689c7.npy +03467517-919859cf5b204b917ccaebc549d343e1.npy +02958343-d894c407d7fcca0d36294458115cf41c.npy +02828884-894f41b8e4e3231601104cd2d998272.npy +03001627-2fa2acd39067ee788f6e9f07be105c48.npy +02924116-9193a78ba7f6d4108d4003a408ee4006.npy +03790512-2d50553277d64ebda513de4eb79b310d.npy +03467517-ac8b94c2d527dbc47f9cbe01d169e4c.npy +04379243-84f0b08cc2d6747b593ebeeedbff73b.npy +04379243-ed50f2409be0ad022b6168eeac2194de.npy +02946921-fac6341f9e5bfddaf5aaab5ed17143d6.npy +02933112-70ef5ad531624a24cb87a43f8f346ada.npy +02933112-6754e64c37f7318c824662341ce2b233.npy +03325088-f1599feb586c4998321d8e522c85e4ef.npy +04256520-d7bd0812487f786b19c5fea91449201.npy +02691156-f12b45a38f012a78ac4f72bf08dc79a6.npy +04379243-388ea3f8ba27da8b777b6246417c94ff.npy +04090263-f74ef838b3d8388b03509f6d3647539.npy +04256520-54cdb325265e343619fb4103277a6b93.npy +04379243-ea5e7b13d0eda809663191fd557d3a61.npy +02876657-5ad47181a9026fc728cc22dce7529b69.npy +02924116-8c71abeb4ecd7db5e78f6c4122b203e7.npy +02747177-755d669a95bc00c3ad5067eac75a07f7.npy +03001627-6169073a194742c5a7de7deb16b90a60.npy +04379243-e20c8cc35a498acc2ba308912365bc23.npy +02958343-18d2959d79af059e476502dcb0dc5465.npy +02828884-f1102a11687f3451f4fb4dee5181bee.npy +03337140-720fc26810e5755b2846fa729d90e125.npy +03636649-d217e8ab61670bbb433009863c91a425.npy +02691156-764894168678b36efc1619e612ccfb0b.npy +04090263-45e88d85974b540732624d0392494ea2.npy +02828884-5d463e4412600a3213afadfff198a630.npy +03046257-d545c16fd540a91127a97d6c875f5b81.npy +02828884-4a3feda042d94e85319eead4390b3fcf.npy +02808440-c6bdaf60ca0529cdf06b5a8163839b92.npy +04256520-f57c0d39936a324371a782a4379556c7.npy +03001627-20ead42180f1ba43ec7d59bee49bd15.npy +04379243-ba2ed19060724207508ab97c29985b12.npy +03001627-4b9ccf80a846432095bea7c29e873d16.npy +04256520-b6305089d351329681dff5c2e57ad46e.npy +03261776-4beb536ea2909f40713decb1a0563b12.npy +03636649-fe4ca0ab385784d8df6cfab91d65bb91.npy +02691156-17c2d3e052dfe73f9cc1fc25372199f.npy +04468005-f17a4c908714b29dd85b408a8edc983b.npy +02958343-e27019b4147f868dbda733a39f84326d.npy +04379243-2a796094f95904e9c6193dcce7cff00c.npy +02691156-b2235fbc13fc2ae0bbf3143b1cb6076a.npy +03624134-3abac859bebd4d8c63a4dab86bd84521.npy +03325088-140f3e225b12062f3321831d2245cf06.npy +03467517-39eaab6f38e942df5217e44802ac5173.npy +03001627-e57aa2d477a818ed2af6ec758865822.npy +02933112-d7e4b6d1d9ae4336ef4e42d70375aed8.npy +03001627-fff29a99be0df71455a52e01ade8eb6a.npy +02691156-98dd57d068c8de064c3a35cee92bb95b.npy +04090263-9f42f31d3b81ef232d07d103eb3a7540.npy +03325088-aee1330150624d22ef4cb84a0218bebe.npy +04379243-9fc50a184e6d86a9b3fdb1a7c9a60207.npy +04379243-fc472163ea149f8e19fb4103277a6b93.npy +02691156-d47207e14e61db3f1436d436f198567c.npy +04379243-16febbf5498604acfb666b203f8cdb86.npy +02691156-7274be512ba47d837678474be485ca.npy +04530566-7a4fb637dc511c19b1bb46d2556ba67d.npy +02933112-1222c37fc0c37124824662341ce2b233.npy +03642806-53bdcb3c0b28a51b580ee4476b0b0ff.npy +04379243-b40b97894f2c750bdbf8817a0e330a74.npy +02958343-1dbb24dedcb23beab1bb46d2556ba67d.npy +03211117-4d11b3c781f36fb3675041302508f0e1.npy +03636649-5128cdc2e7001b0fd8740cddcdf4464c.npy +03046257-c07b92d1d7930faab594bbf2c494ab81.npy +02828884-e0cefe05e1244097b51974a280a6461.npy +02691156-600f970e5d1032dda4642ec4b6f68a.npy +04379243-ed6dcbd0d670784537a0eda928b574d2.npy +04256520-d8a60e70bde76669e484a3178a372c3.npy +02992529-fa3f5a6c21c56ef7e85fd905d1f6c116.npy +03211117-db13ba7f1da5dace4ad2635b7d12d09e.npy +02933112-2c177b47d18940c735b355b56bb31701.npy +02933112-1d442f753e2d7d3cb90e13b20a8dfddb.npy +04379243-8a09f540491889f519fb4103277a6b93.npy +04468005-5f83375dc5b07b4852470de2774d6099.npy +02691156-443be81bfa6e5b5ef6babb7d9ead7011.npy +02808440-cb6e3dea697f87e55f0ba4cbc0133dcb.npy +03001627-9adb6a665f99addc8a4fd70ea4c8b4d9.npy +03001627-bbd6bde216a2c18479368d1198f406e7.npy +03001627-3b88922c44e2311519fb4103277a6b93.npy +04379243-519d1f0e03a9fbefaf794c3011d17461.npy +02818832-845942aee9bee62b9f2349486c570dd4.npy +02958343-82ede85c805bd5a85af609a73d2c2947.npy +04090263-ccf8ce0be2e03076a49c146495d6b4d5.npy +02924116-25387eb43f6f58774e08fc4ea39c13e7.npy +02924116-e2c4d25593f1173cfa13d53e5e4a7d2a.npy +02933112-18f41e91af76c77de25f00a04866d020.npy +02691156-cef4d41c07613b658168857903a9552b.npy +04379243-114d59f2e865eee630bbd4cddd04c77b.npy +03636649-1f115309bcbcbc5326010ae5c9a5e78f.npy +03691459-cf0da3cd69392999da2140846c49e200.npy +04379243-7dd881a26eea656d193afeeca14e3baa.npy +02808440-19da369ff1db9ecd670204dee97dc037.npy +02933112-2cd30f8ab084d274391fb969ff1ec5ce.npy +04379243-12df5c215f4364b7fe388cf6c4c3705d.npy +04379243-ae4507fa0f4c936a31055213877993a3.npy +03938244-fce7f95d023ac364402d272d6d981f21.npy +04401088-4f3c487c54ca29f2439292e4b8fd557e.npy +02958343-ffe0a5b165461eb66a2345809e2bb169.npy +03001627-baf3304f1352fae41c6aa36e5af1449.npy +02924116-896df439c9dd99914afbd069dad74ced.npy +02691156-d6bf9fb6149faabe36f3a2343a8221f2.npy +03593526-d56098d4d83f5976a2c59a4d90e63212.npy +02958343-a63ae43440751ef444221994b043fd86.npy +03636649-181d2b693d7ab89457a48b78ff77644d.npy +04379243-20bf71868949fba4b445ec1f6a39e0b8.npy +04530566-110acfe04edbd526969f70ba15f2ef4f.npy +04379243-95656a46c15d75592d1c552a8c88e58c.npy +04379243-b1dcc70ae478e417664b3b9b23ddfcbc.npy +03948459-e3f45b75b688bf33794921644e32aee6.npy +02747177-b1625cc91f9355fead5067eac75a07f7.npy +03636649-fb4043f7fb8257d8578d107c71db28ac.npy +02992529-c3c5fd4ce226ab0c4694b8455e89054.npy +04468005-f1497874764c9d964f57a4cae005e56a.npy +04379243-7683778558cc36163fb0920a55a7e805.npy +03325088-dfbd28a1b03b488950da8b99982a3057.npy +03691459-dd2a4c416625f29c4f57a7ededfb3bde.npy +03593526-3b5397782a5a1145fdbe2bf897d8a820.npy +02691156-7a3da3c75d98e44d7d64cad20089f027.npy +03001627-b5a741e11438fb83d155b73c25b81001.npy +03467517-51abcb617b2faf3a24eeca91f583600.npy +03797390-f1e439307b834015770a0ff1161fa15a.npy +04379243-a0745770bc3d12477b11ae648ea92233.npy +03001627-4217f2ce7ecc286689c81af3a850d0ca.npy +02933112-906d4fb94d86c4f0f0c255b2dfb0a92a.npy +02992529-6456bafbb5a656fc487f00a15f77c99.npy +02933112-2988d5b3d61d80c276555d27f71ae823.npy +04401088-7bd9b1b1297013ed65f78a217bb320fd.npy +02958343-65d6433043c40046b82c0841410a924f.npy +04379243-9bb646155fe7afd84e55f99914fbe961.npy +03928116-d26149f3d01ffb4d9ff9560d055ab12.npy +02828884-c32504d950d54881c3331c70c9cf7624.npy +04379243-44ee5a33ebe173c4d28a525d8260e58.npy +02958343-706083fa2a8c2b50bc97decb713a2619.npy +04256520-7d756e083f671c091b17743c18fb63dc.npy +03761084-16a1355b8749dcda33f93820d08ac745.npy +04379243-ab76021d53504f38f51f77a6d7299806.npy +03467517-6c3cabefe5c12e5a972e15b580d9a5b3.npy +02992529-ef2472e661320b03e324fbf60278e45a.npy +02958343-5da4c0cd066b7d0889d347432ecb438c.npy +04379243-7c42d9809322b3993002761e7a3ba3bd.npy +02958343-5d6160c6e87be84631d01cb0ca6cb2e2.npy +04379243-25b6b28e3b70be1c5a6be9e325f087ce.npy +03467517-5cfe03b0754039625afc17996a7c83c5.npy +02958343-43553b5efc2674cee4b68d3b17c43658.npy +04256520-c8caf9f60c19157414038d588fd1342f.npy +02691156-9d06f4ff9f1e7932941d71475449eb25.npy +04256520-7e9f11492f1db0e5e81fe3f8835bb5ff.npy +04379243-4d393b562df7cfad9a16b095d67f7209.npy +03001627-3b3a9f4e3aa9f2f4d39a194653571dfc.npy +02933112-973023bbf9c6a603c59350d819542ec7.npy +03211117-31f688edc350505191cb6690cc7eb18e.npy +04379243-93e81005c19a74b8664b3b9b23ddfcbc.npy +02808440-d970177e3a932dc344221bef0fa3c36b.npy +02818832-cea6fe3942aad10f529a225c2959bf7d.npy +02958343-c00e0066715c2226921cb81cb1632a5e.npy +04090263-fffbe09e4890f8f36314c3b6a3a65519.npy +04379243-e7e0942dddd1e709cc963bba1556032a.npy +02818832-9f7809b9eb2745895b142bfdf8ccf55d.npy +04379243-4fe648810cf1b4b5f4ae8c93f4db5e6.npy +02691156-69f1d9c3987d429e5e9e2656aff7dd5b.npy +02828884-8fe23a363bf80c48f155d75bbf62b80.npy +04379243-8b07d458499d63f36d96c6cb347d6a90.npy +03467517-7cf22bda34c2419de943333e8b45c296.npy +03001627-38141adb391a039ff3c330baa382ded9.npy +02828884-2b6ac3eb1232e99b3cf1509e0eed7683.npy +03001627-6cf3b41688dfc4b4707cdefe012d0353.npy +04379243-2c7817c16702e57188e7efbf7ff736b7.npy +02808440-b906bf01b0f9949044221bef0fa3c36b.npy +04379243-39f03b3ec91103af33367a1c9ac6c143.npy +02954340-e7e61ccc69e18440a52821bf1aa3b19a.npy +02992529-f4eda7905f55d1b382476058422e4a4d.npy +02992529-ab3ebae8a44e1ae8ca47cd18decbac61.npy +02828884-7d67ed4517c1d702ed98cca8f0ccd5f7.npy +03636649-aad04909cf72df68bd038489dd82490c.npy +03001627-963452f2fc2a74f62a3f8f484e6c5c4f.npy +04379243-3bbaad82416c897d82d19a07de9030f1.npy +04379243-da90bb35949fb45ac3bd24f986301745.npy +04090263-902ca61bd1f216f32511f68da65f4c4.npy +03211117-817aa43250590b38b3425db9d50d5dff.npy +03624134-895a4c3fd403f9c63edea20a1d0ddb66.npy +04256520-3abafff866f9319d19763227d95ac592.npy +03001627-a339a318c8a40fd4eebb133aa4be217e.npy +03001627-310c65506936cc5bbe5e5822eaa1366c.npy +03001627-64eb6d8212acb69fa094848ea4d06501.npy +02924116-e3d35f5a569095e182dd3c4188947bc.npy +04379243-bc1ff7fc750617d690f7bef12e52ac08.npy +04256520-fd2596a60338b08b318694f1cc6fb1f8.npy +03046257-9bd39bf4d0072abacda14cd39ae8c7f.npy +04256520-7d019d0342f8a70f3bec56bff764ba78.npy +02828884-84d8530355cafc8fd838ae16242881dc.npy +04379243-c43868d3e8ed646f4510596cb4be6a33.npy +03001627-dff768695c3013aaee3907b60a74e8f8.npy +02992529-638695025ca04d351d57a73214dd2a04.npy +02828884-218b98805019ba7df11e0e33e4b1b85c.npy +02773838-71ead7f072106c63ed13f430b2941481.npy +02691156-a99ffd1b1fd121bcf2b0736dd4d8afe0.npy +02828884-d8fe288f137ccddc1c57d18f89ad9dc3.npy +02958343-517dd2b0fc2aa4ea8f01fef4e6f571a0.npy +04256520-4a463efb8baf30e42d19175e7d19b7cb.npy +04256520-735122a1019fd6529dac46bde4c69ef2.npy +03948459-e1c06a263876db5528881fe8c24c5c4b.npy +04379243-f41ead4917ec05a149524cfd5973a145.npy +04460130-1f1f62c52fe4d27946fb3db517d0dfc0.npy +02808440-40b85440de55df08b05d6ed777b5533.npy +04379243-452d4d4dd64dbd32d12d3a3073d6ef09.npy +03691459-83dea2f2561fc2fbe9364d19fabb5f00.npy +02691156-18e6f319062ccb49ca8607f540cc62ba.npy +04379243-da745fe2b26f5d9b9ccce4c6d5bb195f.npy +03991062-6dbdd4270e16cb9425ebd1cd0b422e32.npy +02691156-89e0a038b52184e04f856435f28995af.npy +03001627-6cfe2f5ab1bb89022edea1c2bfa3bc56.npy +02691156-ca8c65b83038dddb17486544d154bb2.npy +03001627-ce387113cca9c0754d33a7fd9c37a7d2.npy +02828884-2eea9c22b37967006e40121acd58a004.npy +04256520-91cace4fc498690119f778c7a8b12264.npy +03593526-afce514f25812205c9f016d57db96408.npy +04256520-e42f4a13086f847be55735bbf02fe10b.npy +04379243-a53650752c2d73ce83eca490ad2084.npy +03001627-1007e20d5e811b308351982a6e40cf41.npy +02958343-732606e13ef11f465acf55f30acc008d.npy +03001627-88e514e71b48738bb022c94235bc8601.npy +04004475-2e42dc81abb41b06d483b3bba3d3c62.npy +02828884-f5e4f9657ecc18efc862eec8232fff1e.npy +02828884-784e9add253365c15a7771962bfe7829.npy +04530566-fcb10d77160ccc67dfaef96860d73193.npy +03001627-8f1e882bdc10f54955f46d55537192b6.npy +02691156-aad1733e7bc7152bcc14f1e6f4f4f49b.npy +03691459-b49306bfdc0d238076247c6336e7c242.npy +04379243-121ae3ce921a1e43ef40aa033482abea.npy +03642806-9785a579ea791039c639c533e8b5aec1.npy +03593526-54ae704d4eee561bd93768e7b9b1eabf.npy +03001627-ef1824754ae554af83b6e0255ae357be.npy +03948459-1171db047e43948b40aa5b072f9ee3d1.npy +04468005-6a26d2eaaf63d2a7b2faf16541f353f5.npy +02924116-58a477292dbfae96f2b46e2da97eabda.npy +04225987-e421c23a2c02cac61082f2ea630bf69e.npy +03211117-d89d1059b23e8c60edd8d267b4d8ab38.npy +02924116-8b44e35b773cd888bc7f39bf011e847f.npy +04468005-7f31a5c189a4c95d93cdde2be60b3ee4.npy +04530566-ba3eaddcf1a2e829fb64f9487ce62dd2.npy +04379243-8acbca7ddfd03dc85d009c98a5b96836.npy +03046257-e905eb10294464464b3c42e318f3affc.npy +02958343-37f9b2735bc9e80eeebdc06b146e1752.npy +02691156-83dd9dd45724d5fbbeb310a83b693887.npy +04090263-60c856b141ec1e75a5bed5eda256483c.npy +02828884-b7fd9faa8c78806da9bd18a6c1eb0c1f.npy +02747177-544bb6c9c8ff5ebd6c63a10c02702cfc.npy +03001627-30378faa6bf5b245fdef1c01cbd4ae0c.npy +03636649-b8c87ad9d4930983a8d82fc8a3e54728.npy +02828884-8f64075972a1f7f3dc18af6f6bfce3ef.npy +04530566-14b8bed0391dfe1dfa808b0b90ff6379.npy +03636649-f10af3d00a4c3e89f51f77a6d7299806.npy +02691156-723c87de224355b69878ac4a791083c5.npy +04530566-df63e149e706e3741556f795d265590.npy +02958343-ccdd144f89a78f5c554ecfc23d9fc570.npy +02828884-6bc471eb8f212c9317b431cae0dd70ed.npy +02818832-d2e248e53274bcd5ec223fd6ddc5969b.npy +02691156-3fe8243b660d5e8fbc0909d98a1ff2b4.npy +04379243-9140c6a8599f28fbf27a87e2aac4fd31.npy +04379243-9ae7f60bc9e20008533841f5cdbf3b2.npy +03948459-2987ca2166327746fcfb3ae2df2f7efd.npy +04379243-c65ab1fc77cfeb37f7c07d2e56f26a5a.npy +03642806-d122ecd3c34e87eaf76120a09d6a0db.npy +03467517-ef87e50f18f1407693f0194265a9746c.npy +03928116-6142342e876a0f6f4b695ac31691771f.npy +04460130-9e72b97a5af45ded7c272b953086dacf.npy +04090263-4f4cc3462f0e9dccf13eed41b64dddca.npy +04256520-7162718ec5f39640701dd519cbbba0c4.npy +04379243-53e06d7506fa12f93fc9a2b2d10317e7.npy +03001627-5822ae77b06bea3091da37ff8bdd2524.npy +03001627-41aa5dba48b7a3f683257865d0a50551.npy +04530566-a13e0728cbc8a41594ebaf95f022dfde.npy +04401088-f400eb5421283e8a102f4912aece242b.npy +02828884-10bb5f29a8654f22ad5067eac75a07f7.npy +02691156-43c5f85e9a10071cb1bb46d2556ba67d.npy +03636649-5859f1dcc6e47322e7c7920f6a65a54d.npy +02818832-f7d2cf0ebbf5453531cd8798c40e5949.npy +03001627-b631b78c2dcc748cba5342d638d0c267.npy +03001627-562b11f6f1fe56ce586a8827cb5b82bf.npy +03001627-29876b641047897f9bbef973cc1034f9.npy +02828884-e70d19625546502bed98cca8f0ccd5f7.npy +02828884-38e54a16698453baad5067eac75a07f7.npy +03001627-e8829b6a1601c109bebd676e3a69dcf6.npy +03001627-96bccddaf0034be04e5cf15b26e670ad.npy +03001627-eb29a065b495dffc85528d560ddea455.npy +04460130-de24d2498ff052c3fe10598e9bcc69e4.npy +04379243-dc0e4a9d3bb0397d5e994da5ba753c34.npy +04379243-bdf99b327d1079fb35836c728d324152.npy +04379243-204d9ecc196990ebe8479ad2eabcbab4.npy +03691459-d7233f2190432638d747b49524a1246e.npy +03211117-397644e58faef380e441f5bb6f88ca61.npy +03636649-eb37d11948d7b4ffe030fd2fa0608452.npy +04099429-2407c2684ee757e89c4176ab56cb612.npy +03467517-1f08ecadd3cb407dcf45555a18e7351a.npy +02691156-fd95b99d4699430a7395d58407f193ba.npy +02828884-7e029f73e9cd98d2f155d75bbf62b80.npy +02691156-caf92880cf63690188a7f6dddc29eab.npy +03691459-7b08e64e66cfe5d473c609379da5b9c2.npy +03046257-c34e4038969908b6daaccab222ac90bc.npy +02924116-e24cde6d0dd917c8a49d11719fd4710a.npy +03001627-d73e46e07bdb3fe75fe4ecea39e8bd40.npy +02871439-e6f306e6f391ace7b035d20a1a3ca345.npy +04379243-c0fb01629cdba5ade6c5cd45aa112726.npy +02958343-5410d4faab53ce49e9d8921ebe6d5b8e.npy +03991062-fa9e6aa9d67d5329e5c3c7284848bbfe.npy +04090263-d8e7f4c92af18cf2892fde398a8eab7b.npy +03001627-cc03a89a98cd2660c423490470c47d79.npy +04401088-d7c350e5d29074c9b4c216fa1de7d5a1.npy +03948459-d81bac8b449807bab7b81b671e901c39.npy +02691156-1d663e36e305fa8e2178120752ee7a07.npy +02958343-3ed25ebb78e48a84ca92a4cdad802b45.npy +02691156-16ef481509c64f845dcf422dd1ee66d9.npy +02691156-6cf339eb8c950ac5d556fc099c90ab45.npy +02691156-d581b2e10f8bc6aecc1d733a19631a1.npy +02992529-987662da7f345b272b1c9d869bc37167.npy +04379243-a0a17ed0d2367f433c40408002fc3026.npy +02924116-1984914daabaaa44afb5b09d8f4dd829.npy +04379243-25b9dbd6cab8f22c37a346dba83c013b.npy +04256520-7b5b2e699dbab90d1ead5d83d8c2f7da.npy +02933112-768564ef92377d886549bee1ee0ae3d0.npy +02958343-2180046932174984a10cf495b6dc4ef.npy +04379243-e731318d8d28bd585913832d290e62af.npy +02691156-995d06b3afb755eef446f92b52bbd82a.npy +04256520-6923a7384068b631d8e0f7676099972b.npy +02992529-7bf76e92b684d32671ab0d8014490a7d.npy +04256520-9156988a1a8645e727eb00c151c6f711.npy +03001627-8c2e0684a98bd4f82553cc33364504d5.npy +04379243-a5475eec7a98a02671a70be9f12ce8b0.npy +02933112-78d36740730c94a4490ad276cd2af3a4.npy +02958343-5822af4cda46d8c2f952aa5aa5267659.npy +03642806-129237ff9e4f5d5c95b5eddcdeed8f43.npy +04401088-eed72e5bc3dc4e85150c05906b260c9e.npy +04330267-5609319914f7d84a14ea9baefd0742a5.npy +04256520-30ed3ecec491408f7ea607586f414f8a.npy +03001627-58ad100d70e436bece93f2bb0b6d036.npy +03337140-94507a5e4ec17da4c3aee8e9d3a6ffa.npy +03001627-32e6139951627142a087337e55e3e2e.npy +02828884-79f02eae8c5b417d756b36dbe53a2798.npy +03211117-d58e51e184fcc1a2fc30525e763ef5eb.npy +03636649-eca8e4d9645271fa37b2bb75885cfc44.npy +04256520-3fdf33059301e1d248fda83c10428379.npy +03691459-9376e8048ae8b34ea35fdda2e8d5933f.npy +04090263-f5a9d847f69449626f07a69f0bbe0f4.npy +02828884-c2b18cadd355a5f18aaae3d020f5ddf8.npy +03636649-2b79c0ed9fc840e7e64208ea01814e71.npy +04379243-5b5fe86aa8e93f91c3bd24f986301745.npy +04530566-2e6a74a610868d5be1e91cfa8fea7dba.npy +02924116-437de36c15c08707294f9f1b885d961a.npy +02691156-1286826ff37699a1a0d713eb26379316.npy +02691156-2628b6cfcf1a53465569af4484881d20.npy +04379243-598e49637250f85d58df8eeaf3dad1c.npy +02691156-17e66cd463ff0de126360e1e29a956c7.npy +04379243-1d53223952ac93dc3bd24f986301745.npy +03325088-37f385f455809ae4b3ab5a380856c75c.npy +04256520-8a1a39223639f16e833c6c72c4b62a4d.npy +03691459-b56efe51e12dfcd72c730e00f4721fb5.npy +03211117-f4955005fc3fa1bb64b3cbf502645c74.npy +03001627-41ce60d5443c203eb31c248b8665b2e7.npy +03691459-28c30025290a56a689296e9c8a412e3b.npy +04379243-5ca423c2f3d176f94c5c5c89015f1980.npy +04530566-f72222b43e40e7e84cd259bd328e92a.npy +04379243-c5e37e895124731176e9713f57a5fcb6.npy +04379243-adfef21c37071016b4c161851ed2b4e4.npy +02992529-205b1494d7d3448e21844676433a0aca.npy +03467517-2eba922263fc1580cc010a80df5d3c87.npy +02808440-4e77f04af9f378fd6bae7522bd91c859.npy +02691156-8d5c3d38de9c3685f2e77d54f4da142.npy +03710193-242bb92902054a0142b99c0f2f4f9b4b.npy +04379243-245a4070c930aaae71e2498adb56e791.npy +03759954-c0aaca906293380f1242824b4827fe77.npy +02828884-87c34f2d5d53a51768679c90b064f491.npy +04379243-eba66ca2e46521ecb16ea05e48de73ee.npy +04379243-74a73d264fb01b188ad2a89943bab6f3.npy +02958343-f4532b1f55191eb7b9ad5039d820c924.npy +02691156-5fb64e3fc0abe449ca8607f540cc62ba.npy +04379243-5b349df34184e7fc2ad490d4d7fae486.npy +04530566-a5a16ec8ebc811f1aff407511d7dfc96.npy +02691156-f214cf57d5d5634960e1e93111ad3e76.npy +03001627-99848304f52de660a26aea0642029fc.npy +04554684-2e9e2ff2b757fcbc23a5a908e4c7c27c.npy +03337140-efee783f896e804791c352d02061b3f7.npy +04256520-c46a4ee98bad8264925bc492489de9c.npy +02958343-18da5e80080352be294d52e32dbd135b.npy +03001627-b83bebb013e4ddcabd1aeba6ff85928a.npy +03691459-fb2755146e61262fd50505ee01b106d8.npy +03001627-781677297ef4db1ab0b54dd2cf2a35d4.npy +03001627-a12d6ad9561fd39bca2bec46a3b47519.npy +04379243-3ec4be6e96bfc2512b5fb024f65f6da.npy +03001627-e1ca70ecc629eb46ca17c984d94453b4.npy +03991062-aa2c5cf4461fc4f8ee66deb6ff51e301.npy +03001627-71539c627eda703490ad276cd2af3a4.npy +03467517-ba597e1578fdd381bdb7b8a99c2de3d8.npy +04379243-f22cffb7f3ca2ea1d719cc16de395dac.npy +03001627-ffed7e95160f8edcdea0b1aceafe4876.npy +03001627-371ebb9ac02ecfd09710e093c764abec.npy +02876657-20c5dff3b09282035b76194468418a0e.npy +03001627-928678562a6a57db698a862d11861eaa.npy +02958343-835d8e35119c714bfdb3ae79bdfd4e2b.npy +02958343-4d39e6f28ce8970530515cb6d98a6c44.npy +02876657-3d8444d8717cc0b7c18cdaa4851a3c95.npy +04379243-46dababb078a797011ea7f12f22c0e84.npy +03642806-72fb4ce0b33310b4d852aca19c37edcb.npy +04090263-c391adc028f6a3df9a6e43b878d5b335.npy +04468005-409108700a3135159854ff9122ad4a0b.npy +04256520-81bb52e7a83d1b3e9c75eb4326997fae.npy +02843684-be167ea4f0718058b4501871f1444d0b.npy +04379243-198ff59a42a147eb8ac5948d70801389.npy +03991062-2392637006a99646d93e521f7fd48fb.npy +02876657-621e786d6343d3aa2c96718b14a4add9.npy +03691459-b638ef590025961f5adfd0d9df77c16d.npy +03691459-21e46ca2f8bbd4df71187cb9cc8e1a.npy +03001627-b467cd6baaaf5bf282db9fca4b68095.npy +02958343-301d1c48d321d29f5d2921c9c16f3c69.npy +04401088-df768d07fc99eb30142bee3d28727203.npy +02828884-b8407ab7eeda1d261be4769a83930a08.npy +02933112-50c7e5dace1d5dffc6256085755e32ef.npy +04379243-7df8028783ecc6ba6d5fdff4a5ada0ca.npy +03001627-f3a24b3131da1ce619fb4103277a6b93.npy +03001627-7824e41c86f9be776383f517a315e69e.npy +04468005-2349848a40065e9f47367565b9fdaec5.npy +03001627-934d183065b149d784e40fd1beec9c4.npy +02958343-8e9f7699e30cdd8c247a5be450795511.npy +03691459-f1d170b03b23a3139cdd3031da0f98f5.npy +04530566-f2db3a2fa09b459a91001ec6a6afb362.npy +03636649-475a3d88004052918a6353ea60f11b6.npy +04401088-3488722618d61cacd5b6fb666fe071d7.npy +04004475-c7a99991ddc26427c22cdcb8852569c6.npy +03001627-51c276e96ac4c04ebe67d9b32c3ddf8.npy +02691156-5c10e37453733ddb46d83d16be057f3e.npy +02876657-5470f2c11fd647a7c5af224a021be7c5.npy +04379243-105b9a03ddfaf5c5e7828dbf1991f6a4.npy +04379243-8e28f1259c6572b86cdcd27a8d5231b7.npy +04379243-e4b2faf6b123b90286603115d2739530.npy +03001627-d7c9ad0bb877b0796c9d2c8251e6074b.npy +03337140-879c6614916fb6907812c3baf25c5bb.npy +02808440-77e0932f0886aede3321831d2245cf06.npy +03467517-d0f1b3ecae66a027b45664be560bdedc.npy +04379243-6c0bc03812d3209fcffd61677456447e.npy +04379243-e1e7caa05e80e973308c1120d480c5b8.npy +02876657-f83c3b75f637241aebe67d9b32c3ddf8.npy +02958343-d6f754f7ccb42b194fc7cbcbd24e4ddd.npy +03636649-5c79a2bc3d2ca6b1df8d3317f6046bb8.npy +02876657-991d9df5bf2a33a1c9292f26f73f6538.npy +03642806-de9a39e8ef9c313bbba0ffaa383992dc.npy +02828884-f13e44c93bca57d092f4c88fd91c6b1b.npy +04379243-69c536d9e450cb79436e6787c76ef3f0.npy +04401088-8aa05d2bb435ab441ac3fdfdb76cf4dc.npy +03624134-4611d319dfdd29b52ee0f9a97b71d505.npy +03467517-5ed038fc12ed2fdc34003ec0e4a84348.npy +02691156-886942791e830bf1d32b1717fde97410.npy +04379243-f6ef4614e853eea9de712e1694f0a344.npy +02691156-89836a37ce10a26c8699933784576e73.npy +03636649-66111d2c7a23b0feb404555b84577afb.npy +04379243-f9ac7801460434b271140e10b6211a6a.npy +03001627-26f798f908ef2908c7660a81296c2300.npy +03001627-1093d35c2ac73bb74ca84d60642ec7e8.npy +03636649-896abd405c79547086485c798787f66b.npy +03001627-5c52a6b471eb82b64ccf4672ec1e7efc.npy +03001627-f9b462997cb333dc7fbc060fd555478.npy +02992529-9b608bcc7e62c3e2dbe1e810cdc7471d.npy +02992529-e4a8822c5faa386fa9976d676758bbee.npy +02880940-8bb057d18e2fcc4779368d1198f406e7.npy +03046257-10a200395145c61aea2f5d52559debc.npy +03085013-4ed5011d30d0bad8654d740782c268f3.npy +03001627-cf09618aedde38febda72093f9b5aa73.npy +04090263-20ba04acfb3a2df63fa974f1d1a1ac62.npy +04090263-5b466dcb5113a0704aef47a2c7bc343b.npy +02958343-ba89184f58f21ff63343f5fadc4a2136.npy +02871439-908c0b3c235a81c08998b3b64a143d42.npy +03991062-f8e09cb026b47fddd7f470ee20dce9e0.npy +03001627-8fbf9ce2c9cb77bd9cb48411c757aef6.npy +02691156-e5610bbacaf098508b96ae1a0a8b84ec.npy +02691156-7c67e8cce3f3eb3c89ba278a735b3c5a.npy +03642806-afa49e97861c45e5e738f481f8560d58.npy +02958343-86ab1c2ea989fda9ab15905beabd3f20.npy +02691156-b522108c4c08430a71d03b466c72ce41.npy +03636649-8d61e7c8fc9d989d1f30b807ae39b61d.npy +04379243-cd762ebd8c8ab61361a38c5058945a3a.npy +02958343-872e01a1c34494b737fd267fe4b3a5ee.npy +02958343-18c06b8c38623c0b4046e8fe9dfc34b5.npy +02691156-f0065f4f9e20d604521546825315c695.npy +03691459-548f94cd0c5fba501148996e35417db6.npy +04256520-7fd704652332a45b2ce025aebfea84a4.npy +03001627-383b4dbf090a73dd597eda2e51f31317.npy +04379243-d8f851bbc98dccc23fa92d98173c06f.npy +04379243-6aaa78b81528f4846674ff79eed6185a.npy +02691156-c156719444d78942db73445864b72015.npy +02808440-8fe4014c96a06f2a57ed847bfc43a483.npy +02924116-a67672775a7fb69a973f659238edf3c3.npy +04401088-9b74db2ebc90ae4789905122ac8b41f3.npy +04530566-9c3810b8bc98c59426fa791c6af15500.npy +04379243-5bcb0976657fe6df37b2bb75885cfc44.npy +04256520-2b5d99fd8dbdb44141cf86c757faf4f9.npy +04256520-4a910d2734c9cffb44949d7685cb63ea.npy +02958343-74f396cff021c1d2651e8da9cf70afea.npy +02933112-321eb85037156544799b0b9a0d4a12cf.npy +04090263-58c5409f614e42bbfd88a8f742d6b88f.npy +04401088-2acb9ffbc050ac2e48bb2194a2a904f7.npy +04460130-7c78b826f0f46ef3b6b5161efde62bf9.npy +04256520-5ca1ef55ff5f68501921e7a85cf9da35.npy +02958343-6cd6f11fe76058089ed785be4fd72d3.npy +03211117-ab729d209e3ebe2fb3cfe9e599b99e13.npy +02818832-7121c556308b16bf158482250c99c0b3.npy +03046257-3746592c1dfa698d49493d905c02fa86.npy +03001627-1f438263a82a1b8919fb4103277a6b93.npy +04379243-dc589e1223aaa5e65cf2470a6eb9a24d.npy +02958343-abc42e7c5ffaa41d1466737d5c4b4246.npy +04379243-dec59b04dd663d5965bc5e8933ad03bf.npy +03636649-16efeb266e249dd63a52a79d6f5aab84.npy +03001627-17d4c0f1b707e6dd19fb4103277a6b93.npy +03636649-608b5df0d5946c68400789f7122dfdab.npy +02691156-f26ea1a00455f44fb88e2a19106395c2.npy +04090263-d8478e58902d241ae1ca70d5205a82b.npy +02691156-172764bea108bbcceae5a783c313eb36.npy +03001627-263f629d385be2b1601104cd2d998272.npy +02958343-3dd52c850785a6ebbaf1745483a8b34a.npy +02828884-2355964634eba1da35eb9316401353ce.npy +03642806-a520b985d944cd3bb74e0ee1cfdd5ad0.npy +03624134-b93b611092db370248b901354fcecf30.npy +04379243-ac6f632b60ec643650fa82c2f036109a.npy +04256520-5eb193a332576b775e333fe3dd3959a5.npy +03691459-291b3dc6e6f0d5a7b249ecc7669d184f.npy +04401088-a19763322fe669cc7e51366b0cf7747.npy +04004475-c2951ff7d0b04515748e58db1ff83cee.npy +02933112-8914b82447db43a8c59350d819542ec7.npy +04256520-1f741437c1dcadc82d19175e7d19b7cb.npy +04379243-21b8b1e51237f4aee76bc197b3a3ffc0.npy +03001627-b7c8be9dbe5ff1d540332412c5d013fb.npy +04090263-50e559a32e81e8a9cc57882dfaef8a57.npy +02933112-2620701a50216dbed0b36851d61b6fca.npy +03948459-2bde85cb58bbee99f307c8df193268ee.npy +02691156-53c27d3031f6f97e402be9c8dff728f8.npy +04379243-e3f583837f5bb80a5526f91aecc0c37.npy +03001627-52c4af69336f4d6de9deec47d8412ee.npy +04379243-f7ff2f9bb62a9f5c96de5fa2ca080bfe.npy +04256520-aa26a6735be82e5da7de3fd12bcc8851.npy +02876657-831918158307c1eef4757ae525403621.npy +02828884-6afb907e76102e222056b4bd5d870b47.npy +03001627-75f32479a35f39e9f43d965e3ff9c5b6.npy +02958343-ad6572f7ac90b9bf2949d5274e5ab643.npy +02933112-5a60822959b28856920de219c00d1c3b.npy +03691459-5a66a86082033c79a3acdfe62acaaf8d.npy +02958343-4dca2e572dc278d563f2c3a55558a78f.npy +02828884-ab3260f85c28adc82056b4bd5d870b47.npy +02954340-be6604a272cf945bf691615c36cac509.npy +03991062-d0dfc32cbcfd0ce753f884bab27d0f61.npy +04090263-313b61a27e01ebff0fea2ee98610322.npy +04379243-70c02e8ff7d19554e6fe3612af521500.npy +04379243-d11363fff4e2dc6589cc5332e945f058.npy +04468005-7addc3adeb16b62052470de2774d6099.npy +02691156-4ae3b41081645ca3e70b97b9b33fd6d6.npy +02924116-ad3c65e1f488f5af37277701a400254a.npy +04090263-a99df9868677ced6ffe50f88045d4553.npy +04379243-6718e0bfb822e591738e43095496b061.npy +03797390-24651c3767aa5089e19f4cee87249aca.npy +03001627-c04660caf4670baed40fb6f8053555de.npy +04379243-f88dca28140a1685490ad276cd2af3a4.npy +02958343-c1ac2aee4851937c8e30bdcd3135786b.npy +02691156-1974f6955c36c2aece2cec85ea6ae00d.npy +04379243-6187d4be01231460a341228b21d337a9.npy +04256520-717e503b3846d60ee8f8c11a24c52ebb.npy +04401088-623bc1157836ddeff8a51dbffe0021e4.npy +02876657-81bbf3134d1ca27a58449bd132e3a3fe.npy +03636649-a18b996f56dbc5cf37b2bb75885cfc44.npy +02958343-2cbd461545e71ffcd3b83549e73dc79d.npy +04379243-5dca7ed62a72a5fe81a172d69c52a28a.npy +04090263-69237e82dd3f7d3f8a5e49d8f4867e8f.npy +02691156-60f99c0946c095e833b2a295000cb6fe.npy +03046257-b31efa25b43918d59fceff51518181d.npy +04530566-751aeec5f1d50668332d76467c18dfde.npy +03691459-b521957294cbb170c7c1bdfb41b9d2d.npy +04256520-e352b0882699b66a44db04bfb021976e.npy +02933112-6ec7c811025a30a2e3a031805ace4a99.npy +04379243-95112920a9ab9c24f8555ec936cd4b63.npy +04401088-ee7d2d986f2c989ac66dc18b3cf1700.npy +04099429-b5351d041405a64421669bcdba443569.npy +03001627-e39df7339552595febad4f49b26ec52.npy +02691156-3844797c89c5e2e821b85e5214b0d6a7.npy +02691156-20b91c5ceb005cc44947b319a9e09fd.npy +03691459-d6cd608c3c75afd01ad88f716ea80910.npy +04090263-f06f841de5e202e5a50ef3fc203c6ba0.npy +04379243-5ec6da31cbe72c7f492d9da2668ec34c.npy +02924116-f61fe8b152f5888a54f791e4a421252.npy +03691459-17c472a6899c92efcf39ad4726172e1d.npy +04468005-ca7432069416afb23f990b83d396f8f4.npy +04379243-497d75f6a5b0c25077cf3bb06f394ad.npy +03001627-8e21f7a88cecf4ab5ef2246d39b30aec.npy +02828884-8aabc6c97aeacae7ad5067eac75a07f7.npy +04530566-76dab7acad83682765aae3dfe86a49ae.npy +03636649-d3ca8a5d2e8c8ba4a320e34dad7c78bd.npy +03046257-9c3e6695a5f258a7f51f77a6d7299806.npy +04379243-4d6a3cb51ac2144dd47d15ec8813fdaa.npy +04468005-91ceb1625c27cb275ef7a7d3024ae8f8.npy +04090263-e91264640374a2716a0207b46ab78ca6.npy +02958343-f49155170c175dff176be984cf2a7f4e.npy +03624134-912ddeb6b325df6aad1d0cc319eac33d.npy +04379243-49ce1344c3c8a652f9883d2fd957d60f.npy +03001627-2db8006b905b54abf88a016bc446405e.npy +04256520-35e15a666990625a1aa34bfa6235956d.npy +03636649-f7093dd024fd09fc7219d6d5c4afbaff.npy +04530566-b2f200bd0861e1daeb78d3e0a9401d4b.npy +02808440-6989e5532cbdbbf344221bef0fa3c36b.npy +02992529-85841bf9d27c85a26062f54263899d21.npy +04530566-50f0d14029f7f7be450c3626dae37aec.npy +02871439-dfdc22f3fecbb57c5050d6a2f5d42f74.npy +02992529-a635a6b98eda6c1fa436566ba711d6a7.npy +02691156-3572e3fa25911295922e63c830b776de.npy +02691156-a7751857e571d6bd3c326782eb2d380e.npy +02958343-731efc7a52841a5a59139efcde1fedcb.npy +02747177-d756ab06172e422fa1228be00ccc1d69.npy +02933112-8316451b3959184963be0260dd648a5e.npy +03001627-663b17baebd39695398b2b77aa0c22b.npy +02691156-14cd2f1de7f68bf3ab550998f901c8e1.npy +03001627-20fbab2b8770a1cbf51f77a6d7299806.npy +03991062-bb5f7de6d079f8e2c054c46f3dc261f.npy +02992529-abcda75b9f826fce8dd7bd77b545a577.npy +02924116-1b9c827d2109f4b2c98c13d6112727de.npy +02876657-1d4480abe9aa45ce51a99c0e19a8a54.npy +04379243-6c8d4952f67d47f56bf829b05be0ce22.npy +02691156-50040de261741893fb5c1b0f759e2bc1.npy +04530566-c554a1d4895b67b457f5c96598c7eb45.npy +03001627-3c9747ff49d0da71f91663a74ccd2338.npy +03691459-88928666d9c3939dac55321e2e1cf09.npy +02946921-1beb16ca4f1fd6e42150a45ec52bcbd7.npy +03337140-d75c5f5cedcacf1a91c352d02061b3f7.npy +03636649-39583310660349282b6168eeac2194de.npy +03001627-bb660ca2ed9e0155f51763a096bdff1e.npy +04554684-22041d5c50a6a0fb91219aad82abc053.npy +02933112-dfb5415f3bb999a4c59350d819542ec7.npy +03001627-70bf905fc0d62ebcb1ab5f3e2ac4cb05.npy +03636649-646956f902b2a134450e3da30d6676cd.npy +02871439-14f0caee76872a89571be7eae57ba8b5.npy +04256520-d863bd46db86b9dc2906e6acfda251cd.npy +03001627-9dfaa9b599fced446f1e07a56c129dfc.npy +04090263-e502392ba0ba05ac683e3750b53385d5.npy +04090263-7a1e38f9d85548e256c58b78d29fd8a9.npy +04379243-eecec73da85e87ccf008d8a3590fb522.npy +04379243-6fb52c296531dc17beedb4c8fd29e2d1.npy +04090263-daaed98e5444c849a50b91ed3855d17b.npy +03691459-a3d5207350bdc01e87d57ccb715c57f5.npy +02924116-b030d739e1e077ac7d42408e08c78f83.npy +03691459-ad2e92448857e1cc6ad08aa387990063.npy +02691156-795e0051d9ce7dfe384d4ad42dbd0045.npy +02871439-34e73c7fb43d489cd810b14a81e12eca.npy +04401088-8b4d28e4df5ac6e8656557acf97c5e2a.npy +04090263-97291a29f435517db6a44e5c103915e3.npy +02958343-75b8fc64f98a71969d69712f9d08c005.npy +03325088-bc42f9907e3478553321831d2245cf06.npy +03001627-6e3435d56d8f8465daeb838d0771f3b5.npy +04379243-610f10d57a44e0d1ba18ade30e563d37.npy +04379243-a465210c23b0136d7afee304cce81d6f.npy +04256520-2b8d1c67d17d3911d9cff7df5347abca.npy +02691156-5cf29113582e718171d03b466c72ce41.npy +04090263-739971469c9903eeb6dc6c452bb50aac.npy +03691459-257e47c2c327ac0f86690e0779a3135e.npy +04379243-f9add10d9e9f13f413ee1dc69b2c2bdc.npy +03636649-3e21ab6c6d82ec4e1509d7278de350d1.npy +03790512-e036a72a92033782b9ba8289eb4d47d.npy +02958343-5e93dfb8e4d59a0630714334794526d4.npy +04379243-65dbf1f9230a2913855931d119219022.npy +02933112-ca6712dace1e32a548d8ff57878739ca.npy +03001627-808ba77745a0934586abe5555a3b447d.npy +03001627-595379651cc8199abf3c0fb77f1e5110.npy +03642806-3ba00d343b8ee1357b9c6deef486a7d8.npy +03624134-702d6f4583b41f911c81652b127a0ec9.npy +03001627-a7200578bd7bea065dc3653f8341633a.npy +04256520-61e1edb3150c71a1f2165a0df94fc0a0.npy +02958343-c850fc6ea372c568a7fd25564c2e888e.npy +04530566-44b4972b96604e08a2fe1981a00251e0.npy +02958343-b963de806d271377935310097e7751.npy +02828884-20ac7b1b285151789dce72832d2a77e5.npy +03691459-9d2f1644bbce8260ff26ed0bd5d4b63f.npy +03325088-e55b1f59cd50df54b362845c6edb57fc.npy +02828884-be9a174af2b3a463f4fb4dee5181bee.npy +02691156-5f7f0545eba4034965e692ae5160ef.npy +04379243-de551ddcab968586a90dd8e076a5a7f9.npy +02691156-e0aec5757f7a907d647cd52f13caf24b.npy +03467517-60a67f8aaac90a5543e09a26d3027978.npy +02828884-da39ee814b8e3c0387d7792ff13e9cd8.npy +04090263-b76f3783324a5f7b3018d2d3c13a7462.npy +02691156-a2041f74f316e7b9585e3fa372e910b7.npy +03001627-97da84d5d78d84cc2360e5e238139587.npy +02691156-8ac48eb3349098b535fc197bbabcd5bd.npy +02691156-8325baeca433510f4e8c959f70e2c0d8.npy +02958343-ed2e4dafc745bdd661fd7e090d4d0d45.npy +03211117-e912fab93eb63fef6b4897a481d7d16a.npy +02691156-f9db62e6a88f0d7129343faf3bbffb15.npy +03691459-6f1913cf723bdfbec5e5fd334d8e3b16.npy +04256520-683384e0e6eb5d4e81f667e2a25e0619.npy +04256520-72b7ad431f8c4aa2f5520a8b6a5d82e0.npy +03691459-918ae70cc8ff08c27f83e87789efc1c8.npy +02818832-ae34003be790938fa3f600c356573d21.npy +03642806-c3eac3a391b81bc8387188c556ebf654.npy +02876657-114509277e76e413c8724d5673a063a6.npy +02958343-a8d3020b33543bdce64131b695068ec5.npy +03001627-2aa122c56910bad8fb0eb7e753c06942.npy +03790512-5bb3597d49c58017b37378f3c85478b4.npy +04090263-8c0827d07d79165ad87c63d8b3018b58.npy +03325088-728e58be6bf87b89c36fb70296e45483.npy +04530566-b4d3624a4e2651ac6bfc202176cd1f2c.npy +04379243-c4a43d8473ddd9b4554be8f12e385710.npy +03001627-67e6503e7ab7e666e45ef4135c266a12.npy +04256520-20eee9b40b2f6f36e4947ad76f8ce42d.npy +03085013-d05abcd34629ca136d07c55cf995503e.npy +02691156-d30689ca6cdf2601f551b6c3f174499e.npy +04379243-5b6bba613d5dccdb21b55dcb76ec1538.npy +03211117-e6304d3bec856684d9c9f98900faca52.npy +02933112-ab9e20f3f9d2f1d1d77c088a902d8fa1.npy +04379243-e7b41a39388925c364f6d058992c3399.npy +04379243-10e5ffa28c252aceea46bea76c64cc3d.npy +02808440-b8cd34d7b1e0e9ae84e6e639680867d1.npy +02828884-5d9dd008caf920b8c29a08a3db9fbe1.npy +03636649-86a5fae37549690cfcb8d8c6d4df8143.npy +04530566-176c629c93b5a1f73cf0b8b75857cc24.npy +02958343-add26d8f4f91ba04c84b95bddf75b22d.npy +03636649-1c9283c95c8bddd5efacb264ebf1ec75.npy +04530566-1b89cb2463ccaf15e1e2fc42e32162ff.npy +02958343-49930a07ed003273fbeda5389ab05f5f.npy +03001627-283e59109ef763ba2168ec2d80dee966.npy +02808440-e41cc68c7809ec9a412deb0d2b0f3dcd.npy +03467517-1e019147e99ddf90d6e28d388c951ca4.npy +03001627-697fc3fa4c36fe9b128d966a6d72dfea.npy +02691156-adeb5d68e8d65cc419ba010ddb4974fe.npy +03001627-5b5d0af8426e604df1783a44a88d6274.npy +02958343-9676e8250cdd90307d5394224a6aa067.npy +03001627-6b95ac6189a395d3fa8cf35dd917fad6.npy +02808440-4119421c85d867c4fb5a74b09b9b3506.npy +03261776-a959980585058ee42764cfba57a5de73.npy +03001627-71656875081adda78b17d6d1965c2fb6.npy +02958343-cd8956854d515c47374462542bf2aa29.npy +02691156-bdf120e29b19f77b352526271bef32d2.npy +03991062-f892893037aaa2028cbd3996b1c0adf8.npy +04256520-244499318ac9251c3bec56bff764ba78.npy +04379243-287d78d72d12b03c3bd24f986301745.npy +03001627-ecad3bef91aa032b6c1d9538813ca7b2.npy +03001627-c2180f4b2d79f55cee30e9904f2fffb0.npy +03636649-f9b41c5ee5ce8b6fcb8d8c6d4df8143.npy +03001627-e6e65bbad248c82c4c59782c74cbf5c7.npy +02924116-6929f0a74db347dcc69634f1103db34e.npy +04530566-2a020ea3cd5e4fba37363131ac7e8139.npy +02933112-3d21c18153474a0acf004563556ddb36.npy +03991062-83ecec98acd12e53ab1be941467a2a97.npy +03938244-a3efd34601ea92facd6e752154c5afc0.npy +04468005-bc9469b0686383a0520ca1141749248.npy +04379243-da7daaa940ae6700286de2124bf64f07.npy +03636649-60500e6bc230e3f3bbe00b56d7315d73.npy +04090263-51b6fab73fc9ea886a34aa94ca8a3355.npy +04379243-8a3fe76dcc0c54cb502ac2eb9128f9a.npy +02942699-60923e8a6c785a8755a834a7aafb0236.npy +04530566-c29e6490308ad33320d713ce6286f99c.npy +03325088-13cdb5df9a944fcbb7a867e9b35a1295.npy +03325088-3bd7088a61b81842c129b46efdbc7885.npy +03046257-6a4547d6f396b3212871cc0b3cc1a485.npy +03001627-b53373122c7964c531a0ecc0d5a7b3d5.npy +02958343-7323fab0a83b9598f11a194d0ae1bf8.npy +03991062-b8bfd969eaa20d4c7c88564709ab8d9.npy +02958343-9a92ea1009f6b5127b5d9dbd93af5e1a.npy +04090263-a11fda24d699c02f75e83577a23faa92.npy +03636649-5580b95ab8e7806c6c5b8009db95f66f.npy +04401088-d565df5aa65604c86b69fa5331093439.npy +03001627-fe224defdf08a99a3002761e7a3ba3bd.npy +04401088-556b1ebe82977992c51777c7f8bdea09.npy +04401088-57004d88e4deebcabec15cbb63c9ab60.npy +02747177-1e1015a06e43c0a5a44b6af22454453b.npy +04256520-31b5cb5dfaa253b3df85db41e3677c28.npy +04090263-a4f94ba638d2bde76227cba038bf7c95.npy +04379243-e0eb9f5421ef2c4584904c716bc3b619.npy +03211117-65988a39887ffed8edba57559632880a.npy +02691156-e8b4bac72559c097e8f5e45871fbc77c.npy +03001627-925c06a5aea45ffbaf7c7ad2549a1b15.npy +03001627-c666bd15aaebd5b02de0bc4fc4d02dd6.npy +02871439-88d2609fe01abd4a6b8fdc9bc8edc250.npy +04090263-9a2d5bc2029c82cc1b7837f7a64e3031.npy +03325088-b039d06d4776f9f9fd24893a94b85cfe.npy +02828884-d63302230b1e358f24e2eef7547426c4.npy +04090263-bf2bf9b61e8eafab30d6a7e7f84a00b3.npy +04401088-1f93dbc9622d83de7a9f0bb7b1eb35a4.npy +03001627-3318f55fdfb9a132f83ac1589b0e94a6.npy +04379243-8862cddf90fddb3119fb4103277a6b93.npy +02958343-59e01fab310fa8c49c9f1f5abaab90a7.npy +02924116-5d55097e65e6495f8b0ca2812178f3fa.npy +03001627-b8c678c49e40ee5307776da88d1350f.npy +04256520-26891b80550301721a648655355dc699.npy +03790512-837330924dba611df6572e2c76e2d78e.npy +03636649-de063371e5ef119cfcb8d8c6d4df8143.npy +03001627-5f34521c634a4045c68e0b8b9ee8a0c6.npy +04379243-bea8659e45a1094f625ac64d4da8b7e4.npy +03467517-eaf405d9ecd6a9df747506aa863f10e4.npy +03001627-637606c1ca1ecd81b502160362bf1664.npy +02924116-d4ac8fcfe5b445d552470de2774d6099.npy +03642806-54dd364a4ea326ca21844676433a0aca.npy +04090263-beb75684ec2f965412b38b1d99376c0b.npy +03001627-11d3fc4092e616a7a6fee8e2140acec9.npy +03691459-39c15f4b2ccd699bf0a8b62260a2a216.npy +02691156-44ae568461e04dc2fb3831486f8b425d.npy +04401088-f3aac8f54f5f2a2f983ec12a2b33f18b.npy +04379243-bc4ba0bd86545f3fcc749dbc8c455b3f.npy +04379243-3f9c84917d92506f3bfb18d76f33685f.npy +03624134-ceeb38ab7929361e76ec14627bf6bbcb.npy +02828884-d3eea79405a0c784f155d75bbf62b80.npy +04379243-90446c710f3495f4e90047543e308ba1.npy +02691156-73bef2b9747edffb8b96ae1a0a8b84ec.npy +04401088-abcda75b9f826fce8dd7bd77b545a577.npy +04530566-2080308141b05e9e584c6557cf979aa5.npy +03624134-ff949d2335a226fde1c0dc67e69df88e.npy +02828884-f213ccec1e4c9dddcb2a965e75be701c.npy +03337140-f889fdcf54cd73d47be728bffb08bde.npy +04090263-4ba87457899d8385d735fa1ab17311ec.npy +03467517-1c9b41481f09f9d33aa393830f0be88c.npy +04090263-c7b9e0958bc8f2ae320f9466abaabfe2.npy +02958343-664473a5493912f4650bba674124a73b.npy +02933112-d9e69e6cd318d34380d6227ff9b21190.npy +04256520-8731945435676805aa29e9f0529e8ef7.npy +04379243-3fb5033b5ddaaf365f7afad12924b3b5.npy +03001627-cff9e23014880e20b2e8bfcc2dfe93cd.npy +04379243-3b8d176f94c0617867dc358060e3c47b.npy +03636649-922902d623e5e5dee527210494d6783c.npy +04379243-c5283929da8665cdcb9cf5f7d536cddb.npy +03790512-7b6d89ff70831e71594057aa2102e240.npy +03001627-23acbdfee13b407ce42d6c2ea750090e.npy +04554684-eca8612dc1cc153c4df5aaa9df719285.npy +02958343-d41c66c7b1ff1f57979ef391885ee5d2.npy +02691156-c814a53c1538cdca4f7e1991902e92f7.npy +02958343-3a5ce33bac316d8f6379c5e421c1d27.npy +04256520-ce378b91236095622155ef587b4a7084.npy +04379243-28f702b5c6ccffe7fcf9154182ccb5a4.npy +03991062-1cd99461021c535b3d2ad39bada7a0a.npy +04256520-fbb0d2c65c3a26a6490ad276cd2af3a4.npy +04379243-1c3310f4c05ce1f6a192483aa282f8e5.npy +04256520-b8909a5d6702f6f31680549bb1d1b739.npy +02958343-a3d0bbca6bf8a565dc90bfc1d450ece8.npy +02691156-e4b0599a9d06f7ae39cb1b92881e8e76.npy +03790512-455485399ab75f93429f1c522640e6f0.npy +04379243-8219a48422582b01c345108a8f6e3cb.npy +04379243-7772fe52eeb64fe8318694f1cc6fb1f8.npy +03991062-c5c04e396d6aecd344c183864792bc2b.npy +03636649-d54b55ff9b0923c12cd2160e449d45ae.npy +02691156-24bdf389877fb7f21b1f694e36340ebb.npy +04401088-4303a97b71a1bb894208dfa1c5fa1065.npy +03001627-6c16024ad8f16d6c83c7ca617c7f7461.npy +02992529-ff8ba237ee9164c8ff86292618094648.npy +04401088-715a2661c9be051bf4ede441a9f9be4a.npy +04379243-5463f71800fcf2e5e89951e6ee90b3d8.npy +04225987-11abd8b2227a9031e65449686a784d77.npy +02992529-b21610e986fa4c9c7cef36fa43392c52.npy +02958343-70d31e0100cab3fd77954285e7764e1b.npy +04530566-6a0da87e5858b4373e45dd2f173cbf9b.npy +02691156-f405858991b190173af8c56bd4352c9.npy +03085013-6445c051acf63ce01aea59cd55c902b0.npy +02933112-4669d272f690a18dc016d21df34cd8ce.npy +02933112-5fec62a43a64ecb6f51f77a6d7299806.npy +02880940-a1d26a16a0caa78243f1c519d66bb167.npy +03001627-efb0e98337c0554960257b24d454e22f.npy +03991062-8fff3a4ba8db098bd2b12aa6a0f050b3.npy +03001627-2cb0ac27f1cdb3f0b2db0181fdb9f615.npy +04090263-ba405d9633ec030ef27eb335b754fdaa.npy +02958343-e703fadeba32d912452ffe4552686849.npy +02933112-90dd9ad1a74e25d53fe047712e43e185.npy +04379243-5f8bb62eec8f6f49616fb9ab42452112.npy +04530566-393f1f8b2c656484a7ace102781bfe8b.npy +04379243-96ccbfacf833d023c3bd24f986301745.npy +03001627-fa6636dfa85cd625f63376552552931f.npy +04256520-d72e78905c4d975f4f650cd6cdc94858.npy +02828884-d3b644f9eb32ec9cbe1fb1bc0addfcca.npy +03001627-a1296954d5190272327289c00b6dc9ca.npy +03636649-94f1ca2ad33eac601ae26e820e4d9a45.npy +04090263-dbe471b64f9d8647e35dc3ced109600e.npy +02933112-3c855f2a52d5e3f63c8d0fdfb1cc2535.npy +04401088-3c0801c11fc7e4c5f31b75c4a94a8879.npy +04379243-ac9f82fd26fba6aac45e8c8bb42d23a.npy +04379243-b7a0dda52974fa642250bf58700b4d8f.npy +02958343-781b45d3eb625148248a78e10a40d8eb.npy +04379243-9b77e481163e91214038d588fd1342f.npy +02924116-17c0d859278b203df88b61e9125676b2.npy +03759954-35f36e337df50fcb92b3c4741299c1af.npy +04256520-6d41a09cc94d2505a82acb2f2fa57398.npy +03797390-f626192a5930d6c712f0124e8fa3930b.npy +04256520-9dcede4115b4379e2af4036e9c51cbc4.npy +04256520-bfc0c2ab5bcaa2df9442d81743a735a1.npy +03211117-d10085421b3cd3a27504aecf4baaa1e.npy +03001627-b773f81e938f95ed65ba78ad9601cf1b.npy +02933112-8057ca7c19a1457ee3f7a74e12a274ef.npy +04379243-28365bca55784894e99f3a1de720cdd.npy +02933112-8504af8851175efd253d6f91951c4f58.npy +02992529-29c5585362cf4aa5b4f6326696174df2.npy +03513137-802b08904ed6bb57b20f6e48f6a30cbf.npy +03001627-ed47d02d4518fb5d9cc2d4308810279e.npy +02828884-241f99f97083f685beedb4c8fd29e2d1.npy +02958343-bfa0a0a7862c2cf3c2179f10f381de6d.npy +02942699-4f2a9bf0d8eb00e0a570c6c691c987a8.npy +02691156-89a5679cb03f30caf5c7319b71bdce6e.npy +04401088-87f8a738b3f0ae0194feb18ebe41aa84.npy +02958343-508b9f9da70d70dc809a9c98ca4d300a.npy +03001627-6e1e605da1c3d680f9b9977a2406713a.npy +04401088-611afaaa1671ac8cc56f78d9daf213b.npy +02691156-813927b25c3a0c6dff227f13dbef5a8d.npy +02691156-7cabdedabd1d65bdfb86dddee1d6ac3.npy +02828884-d7731559d5f485bcd2b12aa6a0f050b3.npy +02958343-527d52b26bc5b397d8f9dd7647048a0c.npy +03001627-a64bc6079afa241f762ec387b772e9e1.npy +02933112-2036aaa68d164c373fe047712e43e185.npy +02691156-a00c0bdf007689619ebe905ef4009f84.npy +02958343-641a0da53609ee3028920f0e0293b366.npy +04379243-92016e48e44e8b8bbc16013e096d0c1f.npy +02691156-fcbdaf6100aad67d5abb92fce0f1ced2.npy +04256520-9df8e759e084a988fb1eb57de0e2e513.npy +03325088-e08ed186843c83bfb7a867e9b35a1295.npy +04379243-63b53646b3562677d395837145ded71.npy +02992529-a857d9e7cd90163e10bc2436075f6a52.npy +04379243-a8c7402b6bb693219786ace2aaa77b00.npy +04379243-92dcd20f1b208af9f51f77a6d7299806.npy +04256520-875aeeeda0a93481f51fa0238791f5dc.npy +02958343-18a9275b78be4b9ec6d3267fc5334296.npy +04256520-f55a514cc8f2d255f51f77a6d7299806.npy +03001627-bb3516732bcd45f2490ad276cd2af3a4.npy +02691156-f9e80ce23d9536623fddedb0bf24c68a.npy +04379243-88e6afb8c56788899470764d5e97d4ad.npy +04090263-360f8314b77730336edbaba04282b1e3.npy +02691156-b7b657d7db3c3b8cd13ef00338ba8c52.npy +02828884-c19a1aeba4d90b4aad5067eac75a07f7.npy +04090263-9548b43e0f416e3a4a4f87aa9a31cd70.npy +02691156-fb5e00c769fa06e7c277130bc8102991.npy +04379243-6eac64eb398b9d7145d4f35fd8d64cf3.npy +03001627-e8f20141696f143cdb77753d44aa25f6.npy +03001627-632a5ea290b0730c6ad8177a9d42d3c9.npy +03761084-401d1543b0617914de2a9aaff52ac7.npy +04256520-9e6ba78f80fbbfde5369e32fb818f337.npy +03642806-41e263d2af5c667f988abef1fd117e7.npy +04090263-b3a41cbb4ddaea6786225a62b2bc2d97.npy +03001627-6ac7b2ef38226e3d26c2e61baa2a8130.npy +03325088-5f46e75b9faf77c876c18e71fd49c4dc.npy +03513137-12a5eb233ecf486e3e01acc90dd935ff.npy +02958343-a2179820a01ca67f1a144f5cf9567bf5.npy +04379243-193aa6ce8777814b90e2ed261620fef5.npy +04256520-dce866778584da8219eb0cf70882af88.npy +03001627-49d4f5dc155b7b8a55f46d55537192b6.npy +03001627-bd0ee3dbadfa724f6ff454af1e8947f3.npy +03001627-668b9f6517f2bf501e54ac67f0143e13.npy +03636649-21ba9de4d311ff31cdb282e42e89414c.npy +03790512-61b17f12bec91d057395d58407f193ba.npy +02691156-999539f6290b7072ca2bd098b9203af.npy +02691156-9e524a14078824b5cfe15db7c5db913.npy +04256520-a37d0d0598d73b07165fd9581927b6ad.npy +03001627-a31b0ccff3aba978c3bd24f986301745.npy +02691156-8b61ba80d9e487deca8607f540cc62ba.npy +03636649-7fa4f80f92b8e779eef2192b7bb521a4.npy +03001627-52621a97e5036dabba18ade30e563d37.npy +04379243-6b62c85b16e300557005dacb6907e37d.npy +04379243-9c390832c0d1569b664b3b9b23ddfcbc.npy +02773838-c3426d26e0408be4285e5a1f74237618.npy +03001627-bd0918d75e22cbf9febad4f49b26ec52.npy +03991062-a2cee19f1c118a73fcf9154182ccb5a4.npy +02958343-c975716963b72b72236804c5ee26a2ab.npy +02691156-552d76fdb54e5d57cf7cf1e30e2f5267.npy +03337140-3d95c4ebb88f94b3d2f054448bd437d6.npy +03001627-3e28e0f5ca5e03df73227452e5016b6f.npy +04090263-9cf37ec1667dcd3b4d4925687e893b3a.npy +04530566-f2ad53e569f8ea255b9ed5fa79e9ec30.npy +03001627-8b016c4df0e139b660065f613e3a3cf.npy +04379243-dd197fdad7f339cbe8b31d97326b3fa0.npy +02691156-a94057f15ca19a33fd98271adcb6e31a.npy +03001627-62d87dab8cb3fd16c050719ed29b64cf.npy +02691156-e3f562bd552fbb14496e2f80fb255499.npy +04379243-400369fdca7608a531292d1fc01277d8.npy +02808440-198abf39ad554388b362845c6edb57fc.npy +02691156-93314e5d740a48049a6e43b878d5b335.npy +02691156-8adc6a0f45a1ef2e71d03b466c72ce41.npy +04090263-cc362ac31993fcb4fa0d7d9af888ead.npy +03001627-3c786ff99885e95c685d4893e4ba8951.npy +03797390-ef24c302911bcde6ea6ff2182dd34668.npy +03624134-17c4163247e9237d4b7644126b1d71e0.npy +02828884-a11db718438648a0ad5067eac75a07f7.npy +04090263-93bdf3bb2fe22dff7ec95138ef83ef2f.npy +04379243-369c19c0971221f3664b3b9b23ddfcbc.npy +02828884-b2acbc0822c163fb491436340b3b4d18.npy +03642806-2d5d4d79cd464298566636e42679cc7f.npy +03761084-3ba680a213e736bc23553854725256c2.npy +03991062-aab73b8b48bec09b36b0f2a1430e993a.npy +03691459-60765697073cc44cec7e019402cb7bad.npy +03928116-9abbf6edaf6148d25803dd89b71b9b2.npy +02958343-3044f0bf0ab7fd8d476502dcb0dc5465.npy +03325088-d20f44a49586d3d3e61ee99f7b43d0a0.npy +02691156-93a635370616538abc0909d98a1ff2b4.npy +03001627-ea87765cf9dbe2fe55f46d55537192b6.npy +02691156-2dcc844fe9c4d4d99b0fce6a4905cf2b.npy +03211117-ae8e106b972648d5bab4cb27e92377c4.npy +02958343-238c6d6da1c8ce2970097c1b40e1ea6.npy +02691156-5face359ff1d4b4f8e8131a047a07ce1.npy +02691156-65654b5c4e488e0c961fa14fc879444e.npy +03001627-28cace7066ffa9c2f4b6538438a0b930.npy +02691156-d0001af4b3c1fe3d6f675e9f2e677792.npy +04090263-a5b31577127d77d28653d927a24ffc75.npy +02933112-ab7b9934fa7d4768c0f947750540fb22.npy +02958343-1a7125aefa9af6b6597505fd7d99b613.npy +02691156-427030abcc0f11a8947bbeb9022263b8.npy +02933112-3735e7c2bdcdcd7eebf9241bfabf12f1.npy +03691459-cf45708ed1ed436970f2559ee6f59e37.npy +04256520-ddf7a59004522f04c366b8589aac6975.npy +03001627-ccabe6ab0816614dde03ab2a27ba7531.npy +03467517-3621933462e7962af4493a5b80949ad1.npy +03211117-bdb7abf15b1a3f437483e5069dd82374.npy +02958343-a111cef175177b3cd89cde5d5f759ea7.npy +02691156-e5abd988cb34ed9cdc82b8fee1057b30.npy +04256520-72421bcdcb3212f1bc2ef6ddd5c1612.npy +04379243-197f31b2a8fb2e1aba5342d638d0c267.npy +04090263-22fd2b354b1d26eb306b3e8b438992c.npy +03467517-b79e39da98c26625bb6216c38da5db0a.npy +03593526-770f2adb9756b792c9f016d57db96408.npy +04468005-faaf4bcd6d23ae08dc14ba0818ee5cec.npy +03928116-bfe3fe6dcf01eefeb9492d4f3d8bee7c.npy +03991062-462b8122f7439283610c2a68437007d6.npy +02958343-c7c3736ad5f3b252e56947f054952694.npy +02871439-55692507997f7884edd435e02f1ecb.npy +02933112-50492ac55ad27122e8990fccb12f2c29.npy +03001627-4bbd110ccfc81dd336b0f2a1430e993a.npy +04090263-1d4fbefad4abb85790acff7491720d9a.npy +02958343-8e2f0f7f5ca505b56227cba038bf7c95.npy +04379243-b1ba4d962206bad5dfda4f5adaef3a7f.npy +02992529-2278cc8b5a50421613fcb9cbc590fba.npy +03991062-5445f01471e4df5da2c59a4d90e63212.npy +04330267-23ea5db3e8c4eb2a99762eab905e5e24.npy +03001627-e9371c17042131d93506b420c6bcd44.npy +03001627-c6c7820d5e2f0011c2bf2dcc31ba1713.npy +02828884-a973a401412f5561cb2a965e75be701c.npy +03636649-b2bdd202470b4166f3a29b1591515940.npy +04379243-ce4e54dbb99b5bce98a96123d0d6b0d8.npy +03928116-f67a6db9393d99c85f3d43a486973313.npy +03467517-b1af1d78597d178ae7ef9fff09638f8e.npy +04379243-aadf84936183c2d7414701ac79f88733.npy +02691156-4937396b74bc16eaf781741e31f0df4.npy +02828884-f0c2b4f3e73873998cbb8bac2032149c.npy +04256520-a308db2269dbf79914038d588fd1342f.npy +03001627-9d0043b17b97ac694925bc492489de9c.npy +04379243-2e25c45a4456df3f36270e8efbeb40ec.npy +02691156-8d84a34d5aac3bffc6f6da58b133bae0.npy +04379243-ee077280e4f7c4a5ca554b08dbb3ef2.npy +02691156-556d2b99469e62e623a346a784afd6ba.npy +04256520-25c859754525fdf713dd6eafe1477be1.npy +02924116-bebd29ff5a8e475d20dd2f4d517f8804.npy +03001627-4428b7dc4b6696812905b6e26038a78.npy +03001627-2af09bd8df40506c9e646678ef50aa3d.npy +03991062-8e764233b0bf4cde4c5c5c89015f1980.npy +03636649-5de6d462706587e9f0f9e9e64b6b41ce.npy +02958343-8bd0d26352ea9de9becf71e2e014ff6f.npy +04379243-c3a9dc47c5bf10aac3bd24f986301745.npy +02958343-9e3a2cfb3c8a25909b2ccdf5f1fe9097.npy +02747177-112120e83ef41de3571c83071e95ca03.npy +02691156-6a8b9f82f1de022a9ea7c189c9a53081.npy +03691459-ac8fb298f7795ba47f1358f741bb7fa6.npy +02958343-e17065d11b36ab37f9d73bbb584eaa42.npy +02828884-7b21980987b63b953e329950ec40f6dd.npy +03759954-6d9ab595a7bd890128ee3839fe659fc8.npy +03636649-81894e0739e3fea9d49b2e04785f8492.npy +03001627-d3bf9df2360f0a56731dc97277e95217.npy +04530566-9bedc0d32c657b5a95003e7aecc71b93.npy +04379243-b8ec9bd6096a14488de42fc1392c2139.npy +03636649-a60c6cf7d4893f2ba26bf7a8fd4719ad.npy +04379243-7311255cee3e412771a782a4379556c7.npy +03001627-7b405c1d6d2dbea9f91663a74ccd2338.npy +03211117-7c5b291091dd0a166acb8fbfb472b3a6.npy +04090263-584cc870ac0550e87a268987b1e73ce0.npy +04090263-2eaed43aa5e4ec8cc24d00518a3dd6ec.npy +02924116-11aa2ebb5db8b9f36922bf4a94dea1c5.npy +03636649-5a4248187b0cce798aaae3d020f5ddf8.npy +03001627-2e0b6f6d19078424c3bd24f986301745.npy +03001627-32d9f69ef8ebb1778a514cac7cb18507.npy +03593526-7a971531ff72a48d5706d1c54190f27a.npy +03991062-263e56f24d3973216fe9ca24e0c157f.npy +04330267-5b0e09f6f3579f45efb11e763be8310.npy +02933112-f07668a627a039b87b79156a61ad4c01.npy +02958343-faeda504709a7af489d347432ecb438c.npy +02958343-35de0d0cc71179dc1a98dff5b6c5dec6.npy +03211117-e8428a7732155fc1134821a4f2837ea4.npy +02958343-81bb9f249771d31ac675ce607c2b4b5f.npy +04379243-6b5f3b7fab02f9e358220b7cab409d3e.npy +04090263-56b2a58cd5c679b35da6a29f026db97c.npy +02924116-da1c8417f95440739afb67dd284d342.npy +02958343-f2422eb6b55e8fb0ef3ecc8551d2c1fa.npy +03001627-ba45d6c491637dc5820018801b237b3d.npy +02691156-e9bae38bc2083d0bb4d73e4449062b04.npy +04379243-788af6bc08bbe51fd9a828fb989f49a0.npy +03325088-c63ab53b4ec1bfa83321831d2245cf06.npy +04554684-5fc3cef0cf926f5b9303a353ee6dfc42.npy +03761084-4f956e259344d4a3599fb6902c958d23.npy +04379243-b661b93b67d0ca908cc8e5a741a7e8bd.npy +04379243-5e4351c4525fae6d6fa63795f94c4d8c.npy +03001627-9db73a6184c82d33f28699debac30ad6.npy +04379243-459f1e82f058fbd0ca42ad68b92de4c8.npy +03001627-a6e3c2cecd4b6b6203c870f1209d6b9.npy +03642806-5430ba1b4995af02717dccfa4b0eec5a.npy +04256520-4b3f84ca13baf80be0c381fdfcdec36d.npy +04379243-3a7d5468084399cd11ddc5a6b5ad5cd3.npy +02933112-7fbd264b7031c399d37a1bae74ee50a2.npy +04090263-ed9b7dbc375d3543d0a6af9bfb470a20.npy +04090263-d82fecbd0fa3fe757e183a626c555090.npy +04379243-b61dec9a8ce09e4b80360680c1602c7d.npy +02992529-fd3c1ac6cd1f94bd3982f71b09380baa.npy +02747177-9307ad32b595cd82cb2a965e75be701c.npy +03001627-a147244346d84fe398e0d1738edd4f19.npy +02958343-87a7ebcb0dc2285d77471d13a466f5f7.npy +04256520-35bbb0da45fbb2d93eec26c23f5bc80b.npy +04379243-add1279c481f88a1955e0ab55bea4388.npy +02691156-68ff153952368948b4eba5f9f157d8c8.npy +03636649-dbe5479ef7f6c752eb1f13e2de7cd7d8.npy +04379243-9634e0b7d04586865fca6ef890703085.npy +04256520-212a8cab17af2454f8b0f8060696d1e7.npy +03001627-3d0b161ef3c026a28a514cac7cb18507.npy +02958343-a54ce961d973443a0daf3e5400b95c.npy +02992529-5deb3e8911dbef1adce6ba04fb42df.npy +03797390-5b0c679eb8a2156c4314179664d18101.npy +04379243-87504deae620d0dbf4b6538438a0b930.npy +02924116-9427168b4111ec2fc7a1e45e54191e0.npy +02691156-2e9c1c3d866c4b6ce2c6d8aa34a5d35b.npy +03001627-66654548053c709ac3bd24f986301745.npy +02691156-559f9a545b9b98a1d433b2698458193.npy +04379243-da1e75a8647bfd919778416969ddad32.npy +04379243-4805127beacfba4a7e7e510dabdd3cc0.npy +02828884-82b06455e41204e110df635c029b4e63.npy +03691459-9076b1b9e23c7446d747b49524a1246e.npy +04379243-b7821e69687d767aab610b0c94236463.npy +02924116-96d2cd5298733a7b54d963fd62c89fef.npy +03001627-8a455c7acaef577824f0493013a8318f.npy +03636649-a3a13218d61daab550903fb6fac1fa18.npy +03337140-4427e5eac495c14e40a7c7e360f68f9b.npy +03691459-1b24c1c65645c5f155b62c3398327a83.npy +02871439-3d554cb7c74d1fa0820018801b237b3d.npy +02992529-1101db09207b39c244f01fc4278d10c1.npy +02876657-194f4eb1707aaf674c8b72e8da0e65c5.npy +02992529-68376369681e50847e814a763437cd9.npy +04256520-e32a5fdbb75ed879568af879e5634175.npy +02933112-df0f03ac21921f02c868162258053ece.npy +03261776-4de2413a28db0137100e9bd5c4b0af54.npy +03624134-eef74fec4fd6537f89145655be527428.npy +03467517-a3c93f4327a923b3dbea3103e4ab595f.npy +04256520-1de06749f136ec8da066c1f884f0378.npy +02958343-d2ec7caaf8cc7a9fbda72093f9b5aa73.npy +03001627-bd6fcae754203396e34dfbaf829eddf7.npy +03761084-6216efeb4d5836d1efa585e146d1a8c9.npy +03001627-44fbc34ea7869e38e13a527279e951a2.npy +04090263-d8f1721d811dabbffe085ac6ce469d2a.npy +04530566-5bc8a432a5911a4c14621506c22882a0.npy +04256520-e389a5eaaa448a00d6bd2821a9079b28.npy +03710193-bfc242ae3d98762ece876412f61273f0.npy +03001627-b518d19f55a1e15f5d714c9d7df1c4ed.npy +03211117-77fee7e689d94e0f3637439a589fcdc5.npy +02958343-d45b86de9175d1c8becf71e2e014ff6f.npy +03636649-3f968096c74ee3a3b04a2e6a78ff6c49.npy +02876657-d44618b5aefe9ecd467ca2ad6571afff.npy +04256520-99ec7e5d04f32409d45611d32fd7733d.npy +02933112-94f4f2342f6335c5875c4d98e634f167.npy +03001627-551be68d484c8910f91663a74ccd2338.npy +03691459-6803540650949be89c4081063e213a15.npy +03636649-5d693f7115e5ae984e9836419f09cc52.npy +02933112-2a3023853ebfeff5eb0fe7d6b5545a1a.npy +03636649-f0414c5a1d22911555683d8c4a0488e1.npy +02992529-54de8ee661787c1d16d46ee44c40524.npy +04379243-decb34ff7d69d024e6c5cd45aa112726.npy +04530566-aafc192d33956391b82d6a0b1fbc7c80.npy +03001627-2b52cd0ffce12156ccbcb819724fb563.npy +03001627-7e7e130acfcdf64b1dec8546fd5980a9.npy +04379243-2df0d24befaef397549f05ce44760eca.npy +04530566-df307c1941ca4bbd8f6810e1a2b6aa04.npy +02876657-883ace957dbb32e7846564a8a219239b.npy +04256520-1fd45c57ab27cb6cea65c47b660136e7.npy +03948459-6dddfe264ab324a5e39bc2c6d1318094.npy +04379243-d29dedf88bac00a21c19e7863a1c200b.npy +04379243-1a6aca00bbc88c7d30bbd4cddd04c77b.npy +02876657-44dcea00fb1923051a4cb1c0c7bb0654.npy +04256520-23780fffcd205ae9f1ce854e012143bd.npy +02942699-a600991b042b2d5492348cc032adf089.npy +03467517-bcfac61cd0459d5437f945ae4b0d3b56.npy +03001627-fdef0425d385c1cadef295ef48e5307c.npy +03001627-a49fc9bab5834df95b1f17dc9a05edeb.npy +03636649-2e06c6e29aa90245532e8683617554c4.npy +03325088-1d5be60c3915be4b362845c6edb57fc.npy +03691459-9a989485d607844c786b126bff0b0351.npy +03467517-f0ea12f645a1c541ce1a36e7d9d3bee.npy +03001627-d04c2161f32a6499a6fee8e2140acec9.npy +03636649-d34a10201a5448a253cf897b7fc1d12.npy +04379243-5276058cfc1e139326392a5b643ed5e3.npy +03211117-e2787b2f0dd35fccf42a90fe4baf4591.npy +03948459-a7072394bb9d23f54b49cd65dfcc3a9a.npy +02808440-397908e45ef98af8aa8891d8ac9b291.npy +04090263-4d4fdcb113d7ed643a6842b1f893c19.npy +02818832-5ba5c9836e19ac7640b4c5428883e585.npy +04379243-8b7f2caf571342398b8e4fade0702996.npy +03001627-42abcded68db4356352fc7e973ba7787.npy +03790512-53062381d490e3d1e203ed9c6e5dca08.npy +04256520-cedd4ec33ee3b2de7252a102efb37f50.npy +04379243-8d1d04d72b7a240d4c61a7cce317bfb7.npy +04379243-472796909612bf1f1353dc45068d6f44.npy +03001627-50b4851d6e067f9bdfcd57c2094a665f.npy +02808440-5e83e7b924759c8ac2b1819e686b1fc9.npy +04379243-d70bd276cd9f66f0a909821b8b014ef2.npy +02876657-cf6eff1143f9826ab5c14191b5dd293b.npy +03513137-96366015f183b237f1ea818b22320c8b.npy +03001627-2268d24a64c2b20b16222ba719ed2541.npy +02691156-d9dd8dd2c422dadaad70e50d5d7d02a5.npy +04256520-bf335aa14157162b6f8304908c816659.npy +04379243-77986a9d5546899819fb4103277a6b93.npy +04379243-81a84fcb2b247a3348eaa510713cb074.npy +04256520-d4ea100ff8f94edadb1109c64edb2c4c.npy +04379243-52f2c6960d67445f896f73ae4af4fc8d.npy +02691156-c237b4636625f1b0af8d9a7eb0a2bedf.npy +04379243-d8ef132f3ae98f688231f48f0f8de6d4.npy +03001627-484a7d924c952e51af7c7ad2549a1b15.npy +03636649-680e5d7185a51e26a50ffe9b7408540a.npy +03325088-873b6c2543798e437d6fb76678b5a248.npy +03642806-b436271050d647052f8d6d501b18a4b5.npy +02808440-7ab27b5a8e1b0ed2fe52ffd0e748a1ab.npy +03001627-8979c1aaa6675009bf80985a99195eb8.npy +02958343-6ee7fc93288d678e3ab3dfa44f5fab01.npy +02691156-ce4b8076f8f9a5a05be07e24c1d3227d.npy +04401088-b1085da37756ddd1d3f1ccf368ff60f9.npy +02958343-e01a56af0788551e7aa225b44626f301.npy +04379243-eae2c096070f0a57beedb4c8fd29e2d1.npy +02691156-eff5216d782684aa3c7aa3e4b8926c27.npy +02958343-2205a3f2c102f180a134736201a79843.npy +03001627-23e80d93926a45f7f7628281ecb18112.npy +04256520-2056de97c97b2c85b759217db94d2883.npy +03001627-a8827a6013e06261e27790b0ec8671f7.npy +03636649-a06089b2d68c974c6273cbd9c7cef4c.npy +04530566-6556015faea5ba45e0f0f0669675011.npy +02691156-96ed9dcc355f3d34585be1dcf6e59170.npy +04530566-ebff6d8111c67fbdb52763715f7a6959.npy +04256520-8a66b03841197e23d93b543e2efc700b.npy +03001627-5c9b1a32f54b12cf81f667e2a25e0619.npy +04379243-2c118800181f296a855931d119219022.npy +03001627-a77b1abaa28588bb926350348c58b8b2.npy +03691459-b28c7b84869ba2aa87d72888c0a9277c.npy +03001627-cd5cc7a5e50478e82b520984c067934c.npy +02958343-bf7efe509caf42cb7481cee66aa2b2f4.npy +04256520-cacb9133bc0ef01f7628281ecb18112.npy +03642806-79ed190f0e35ccdf98ce68842a487b19.npy +03691459-58e73b03f3ecd4a45a31d91ec836a511.npy +03710193-c3b4b8b8e92f77428dd9cfff54e44f7.npy +04090263-10a2ef896a45a682ab379c9b5bf12bf8.npy +03211117-8c4cb4ea7cbd0ff5ad3833a4ccccd8ee.npy +03001627-a8641cd287bcaa2011fd5138fde4c9dd.npy +02933112-d998e75348902a511dff03f33a13aa77.npy +04530566-366c8a02305d2a0f4c9b81664e789bca.npy +04379243-c98eb7f9b2b99702f51f77a6d7299806.npy +04530566-ac2e609dec5745b9e00ca2cd74ddfc7a.npy +03636649-cdb065e1726769ca8cd36201f5f879e6.npy +03001627-4a9ac9e0b3a804bc8fb952c92850e1dc.npy +02958343-8269284992bbd0c886dad8a79e570561.npy +04379243-b59743992b870052255fc74f0e7640d5.npy +03261776-26e186ab10abad8ee6873d49607c1f87.npy +03001627-800dd8ed32104151a37f3fc191551700.npy +03046257-53b0f32afc6cac64f5d4e1af18c85258.npy +04379243-3dc68207126e2e3dd038992c6975ea76.npy +03761084-7cf2f3a1a3de48fda23949c21eddef76.npy +03001627-40cee2893781b47f50f9fc0e2c94dd76.npy +04401088-93556001d266860513ddb059403c66d.npy +03710193-a06df01467d298caac51268fdb437a9e.npy +04090263-ed5cba88deccbeb5a0431d1f46615221.npy +03624134-1640911b9dc0ef0da95c6095f89cd899.npy +04256520-5b5bd4ca75b788c6ece5b3f5f7505a42.npy +02958343-18d9ac72442260e0e97c6bb243ef67d.npy +03593526-789d336e4456d8854dff7c27c1f6df72.npy +04379243-e290e905c015ea0cc58b5b892c704fe5.npy +03001627-a1133464132d65fcfce0ccdae30f97db.npy +04468005-876fb32c52f3753d1cbdffbc1226f0b8.npy +04379243-4a0db050c8703a8d6e3c8a33c4ddf2ef.npy +04090263-d9a07758e979ecca44bebf183fb16c3.npy +04530566-fe09fbe9e43aa889a08db804545b684.npy +02773838-a1822be832091e036afa58a86636d6be.npy +04530566-3fd6e59f9c95a24d88b3e1662276b5b.npy +04379243-21aaa0dad37443f3720c3a14515ab23.npy +02691156-39d7e8e001e0234e8f721bc8b8155d7.npy +03001627-e77d7eb8a4e8f1816f1e07a56c129dfc.npy +02924116-ddd7c100f2c2829b129901f80d24b7b.npy +02691156-30c0995dcb7c10039a6e43b878d5b335.npy +03467517-34c8cf6bc747145c80a2d5cc9f4bea6.npy +03325088-5ba6bb8365b474f773ecd661ad15c4dd.npy +02958343-3645fce32715e0a4bda72093f9b5aa73.npy +04530566-c46b2f2069ce543c4bbcee86e282d431.npy +03001627-6b32d3a9198f8b03d1dcc55e36186e4e.npy +02828884-2cd4fb6323fa2462edccc47bf0dcf5d3.npy +02691156-875c4b43e35b6803a85b9ef94e886600.npy +04256520-45d3384ab8d5b6295637fc0f4b98e88b.npy +03001627-fe307b67739d9620d874a9fab241259d.npy +02808440-e7629f9e27ee058bea7b0e6d0dd8daa.npy +02691156-1bea1445065705eb37abdc1aa610476c.npy +02924116-80b1ea852c8ff6bbbd0a0ca33bfa9c26.npy +03636649-914a91528ef40e7bf7248d9dbed7a7b8.npy +04379243-27ee20b7a7e2467980dbca6e7b64a4bc.npy +04379243-97001433dad08b48e471c0726d35978f.npy +02747177-8ab06d642437f3a77d8663c09e4f524d.npy +04379243-5adf5a7173e588ad76e9713f57a5fcb6.npy +03001627-38bba5755f7d97ee70205dfbbf1e6bb6.npy +02808440-dd6db8928546fa02461827fe9825f696.npy +02924116-59e93330f9fa08344f95630cc18536e0.npy +02808440-3778a4349297e60b44221bef0fa3c36b.npy +03948459-3f5f657bec9a21814ce6ac98dc4781fe.npy +03001627-d32f32d76d7f53bf6996454765a52e50.npy +03636649-792c3698dc7d200144175b4dddf5be08.npy +03938244-b8e55509c5223c09f51f77a6d7299806.npy +02828884-99375af4e13f0b2f50f9fc0e2c94dd76.npy +04379243-eb363770ee36b0309a79b01b89f55c86.npy +03691459-2ae8239afdabc2baaf365ec12406f363.npy +03001627-1f576eefb36c3e189a6ba4499518ef95.npy +02924116-a1b73422396977a841cefd10ce5d6cc0.npy +03211117-6a1e4ab7debcb3f429426a0f57e4d15e.npy +04379243-8cb18fd9c7a54ceb715f13aeb6bde9cb.npy +02691156-85fd79b9fe5948ff62b600da24e0965.npy +03337140-661f24ca8ef19f864c3aee8e9d3a6ffa.npy +03001627-e922bbf8088552badd7092ed47061a36.npy +04379243-77e4ad83f78eb8c3fc8b5999cff24f2c.npy +04090263-6d66b80890d7e5c310a7d517f2e735d8.npy +02691156-9b5a1706223b150613f6b7168403d0e9.npy +03513137-3a12b9c4f7f08b8efac6099f3d4830fe.npy +04379243-f2b3a2f7c9a4ec19436e6787c76ef3f0.npy +04379243-390e0db80fe12ef65fa6da97b9eb4a2f.npy +04530566-325d6d879e306fec3547bc1786bc3b6.npy +03046257-7e2751a46aa8c454e0a659fb66c2add9.npy +03001627-3f4f1d18c61a07f134b707eb14b2a4a5.npy +03624134-7254ae071375f93ee7bd6ca49cbfa087.npy +03001627-878c70bddd336f6019fb4103277a6b93.npy +02958343-868a5166e31428b16d8aac72cf093e59.npy +04379243-435da96586eb1325cc719373d4fe991c.npy +03001627-d48dac046436a29ec3bd24f986301745.npy +03211117-f4d398256e6ec0b4f910da6a487551c.npy +03001627-6eebd118abb1b4146d60aef5fe7e2185.npy +02933112-df74daf1f96515bf9b849da658b46825.npy +02924116-3216f26ef6b3eb7bd01a0e62652f36f.npy +04379243-17c5c22c9ab97788db67d56f11b1bed6.npy +03001627-6f36520144753550f91663a74ccd2338.npy +02958343-d94f5345be1d81a751a95aaa6caba1d3.npy +02958343-1a48d03a977a6f0aeda0253452893d75.npy +04256520-b2ce2532f540cbde67b426838fce979f.npy +02958343-411d95c06a7e9456b3b0f00a15b90e0a.npy +03001627-d5200a27ca0d4a3ea4d56f1fc38d34cb.npy +04401088-5f4937b6e428e4ee122db064a7596ea.npy +04256520-ab1e7ae9a7e9a14a3ddab7e2e0338094.npy +04256520-c2aacd7edbf9b9f98f83f8853be14620.npy +03001627-4353aa4950c32e12f1783a44a88d6274.npy +03691459-3b01bd24d47245289159eab9ccaa73ce.npy +02691156-a93a20767d70220cd3b936925082270f.npy +04379243-8d4fe49d942ec85ff4b6538438a0b930.npy +02876657-59d7b4e7bc3c5d9d99fbba385cc0d41d.npy +04379243-20cdd491a443bc30d9651cd1d591d64d.npy +02924116-dc9c640221f58021c08550bf6ec9e732.npy +04379243-72f501d4168713b9445e85eb534460b0.npy +03636649-f38370fc4c112017a6e7138fdd58748.npy +03691459-b03efb93acd16a49699abba79f165934.npy +03691459-6309ba4b45aa1a648bf9fe7c1fcb7ccc.npy +02958343-ced4053b0616098b7c697c8c1c6e09e0.npy +03001627-209a904959643d0eba7afe602821e0d0.npy +03001627-372118e3595c328c713decb1a0563b12.npy +02958343-8b177994dc29a707e363d824c14767b2.npy +04379243-2a64bd38a4e42f33dc43fde5155b3946.npy +02924116-5aa136c67d0a2a2852470de2774d6099.npy +02828884-33a40eba7b3382f5653e42b6d3d77b73.npy +03211117-60bde4ebc37f9b31473f10e6caaeca56.npy +04379243-962bea9f435909bf3c6e55b962f380e9.npy +02828884-b29e0a7af1f8d51b5c50390adfa8881.npy +03467517-adcb312236c71cdb63e6b27c89da971e.npy +02958343-42e6ce03b361102ab86e0633bb69faea.npy +04379243-8befcc7798ae971bef5d2a19d1cee3f1.npy +04530566-77cf1b9003d904df96bb95f1b1976a40.npy +04379243-2927b65bc7b9561bf51f77a6d7299806.npy +02691156-d6c655a7c97cab8e9f5f802084bd1d73.npy +04256520-8c1eff1f448e33f4d56c79d3df7792df.npy +03467517-73f004a0f2c5e09b1f20024850a8a0.npy +04090263-6d5027e3411b23459a2ee232a197081e.npy +04379243-516c46ceaf6619d07ff6ace05b36a5.npy +04379243-cd2ad198854d47c6e5e7067ae780b222.npy +04379243-40dac9b7b00849366bd83cbbbf17afb6.npy +04379243-18634e783faca47d668ae11a7db5e82a.npy +02876657-32bb26b4d2cd5ee0b3b14ef623ad866a.npy +04379243-24929a5fbdc7682d7fbc060fd555478.npy +03759954-c38c1a3036e7135df50956e9de496e43.npy +02828884-208b5f58f4f45d63ad5067eac75a07f7.npy +03467517-dcb51f940894768f4fc7398f5eb0c5e1.npy +03691459-336fcd767dadec9fb611871e114769d9.npy +02933112-1ec5e12f2b5684a24da5feafe6f1c8fc.npy +04379243-d8a73e0d8fae54c23002761e7a3ba3bd.npy +02871439-4eda0d3b5aedcf8a200ad3f421b6c3d0.npy +03001627-19d3ba04e165e67dcb4387db711dc078.npy +03991062-93acaa40a2d53c726b7154919b02cbec.npy +04090263-1690354ea489c58e493055786e8f9359.npy +02691156-420efeb902ba9c9f47f9199352b2dddb.npy +04379243-cab027dd0162c5b7f1426260885dd0ef.npy +03691459-981abfda92e702e33b9f0ef1fda503b.npy +03467517-eec9877379771abef4493a5b80949ad1.npy +02828884-98d2e8dc90f050d52ef1844825af63f2.npy +02828884-36ac567cae9ab205d4cf0f8e55d6cb79.npy +03636649-c9a464649fb52e99d5cb6d178687b980.npy +04379243-7e5b7032a9faef913c5e1addd9922bf2.npy +04074963-2053bdd83749adcc1e5c09d9fe5c0c76.npy +02992529-267a2d6fbf29c04cbc17518d87dd1f7a.npy +02691156-d6c1cb09e27c3fbce8b8a0b16211ba77.npy +04090263-667772e778d69333e2365746e867db8b.npy +04090263-cbbeaec355a86ba9870906b5178d97bd.npy +04379243-cfb97383aaabd98ead67befd78c3a0db.npy +04379243-d3a55d20bb9c93985a7746683ad193f0.npy +03991062-50498cc86e5eb62acb2a965e75be701c.npy +04379243-6bb09b26c75b70b01c6ed23568095b6b.npy +03001627-b66ef4dd7cd2674f91663a74ccd2338.npy +02958343-9cea9b79ea255dde56ffccfd33efbc84.npy +04090263-72033b782c4f440ffb5c1b0f759e2bc1.npy +04225987-c171d90db4c4ba56cdb1768065dafd0c.npy +04256520-12a0c645e0bb6601ad75d368738e0b47.npy +03636649-f29758075925a871d706ecb3379aa341.npy +02933112-aa0280a7d959a18930bbd4cddd04c77b.npy +02773838-65680f336a50db976afa58a86636d6be.npy +03337140-bbc16b3bd570818be95cd0dc8c2f0e83.npy +03325088-f8ff61c5374aef8672101dcac4ed75d3.npy +04099429-94a4ecdcaf34f9ade07c6fee8d4d96ce.npy +04379243-545c6c30ead2d411e6c5cd45aa112726.npy +04256520-2658567ef94749293784599b9f219d55.npy +02958343-4e009085e3905f2159139efcde1fedcb.npy +04090263-6b06ff0184e3108a4bcc18d4b892312c.npy +03211117-fe314324a1e7e5c967a964feaf6ebeb.npy +04379243-e7c6731436bc2301bf94502f7765c22.npy +02958343-65c067fcae3292d0e7540f431cab4686.npy +02691156-38efd4e4060d8b4ec231d70e1e0cc567.npy +03046257-a29a303f3da335bea64e5c46abb30c70.npy +04256520-3ad0d0becf611ddec6fd9dc5af8f81a4.npy +04256520-711c7f25142a3e2a57253dccd1b3fd5.npy +03467517-95d08e17b620ecdc266e8ccca523895f.npy +03636649-8b6338fa5916b40e7a5d3427f09d950a.npy +02747177-dc7ce614dc719649b394cfa64dfabe8e.npy +03001627-fa172f7f09f785bb492d9da2668ec34c.npy +02958343-c48a804986a819b4bda733a39f84326d.npy +02958343-ec994111db1da0d6927e12317acf49e7.npy +03001627-45039c59b957063e742728b30848ed03.npy +03467517-d71c17b4d1ffa131f10a27cbb87f3a5.npy +03001627-be7ee770ad59ed0eb07bc9fe525caedf.npy +02828884-d74a990634bb4b98ad5067eac75a07f7.npy +03001627-56f9ae090d2fe856ad5067eac75a07f7.npy +02876657-331601288075868e342fe691e18bb5fd.npy +04468005-5120379d6ec5d7e1326fcaeb388e38ae.npy +02691156-b1f40266ad9da400d90bfc986bc4c94d.npy +02691156-85c9fba37bb685d7ca8607f540cc62ba.npy +04530566-cde9d2f6302fda60cd8d9984f3ad2fd7.npy +03636649-4c266f2b866c59e761fef32872c6fa53.npy +04099429-56c13d294f8afb1ffb88d148e845f82e.npy +04530566-283dc6c755398547657a96a9bceb8713.npy +03211117-efae87e53a1fbdf05dc3653f8341633a.npy +02828884-c3f3565f0754f1c910917cc30262fb08.npy +02958343-8bf8a7694267756e3ab3dfa44f5fab01.npy +02691156-b092d523bdd320e4ca8607f540cc62ba.npy +04379243-4fe5fa039fceaa1823eb3ad3d378722a.npy +02871439-f99da003d6daf8743806c49633f7853a.npy +04379243-2fced9721464b4d9c955e5ed03ef3a2f.npy +02933112-6d448fdac1dc71f9c59350d819542ec7.npy +04379243-8480f767da5d68ca9de7cc399bc9b2b3.npy +02924116-c33fa5a2611c9142a680e164a8237975.npy +02871439-722624d2cd4b72018ac5263758737a81.npy +03046257-1251971bcfcfad61624cf22ecb5162b7.npy +04256520-f7c79c7a8fb79212ddf7c7c2aa2325be.npy +04379243-251160ca48f91de7ad5067eac75a07f7.npy +04256520-9571cf49ac1752984ee1dfc331dd3e94.npy +03467517-9c399ebc617349dcd016bd20f13ab302.npy +02691156-d172705764e25e20884a857d19f7439f.npy +04379243-dba86ecb3a5a4d234b3c42e318f3affc.npy +03636649-2cdb96501ab2ccbf35836c728d324152.npy +04379243-4369d61d4409bac0413500ea4648b88.npy +04401088-8961485f45d94383af4ba3ad8461249b.npy +04090263-2acb7ad7112de6c2394e22ae6de2db18.npy +02808440-6751ed8cb63cc76e3321831d2245cf06.npy +03001627-308a3c347dd24ee4fa2713776d82bf59.npy +02691156-9c0431249dd5a50dfaf7f0ef9aa8fd9e.npy +03001627-421746966acf9b175ecd29875b6f0d44.npy +03691459-1788d15f49a57570a0402637f097180.npy +04530566-850d6a53ae03a9aab2640ff8dd6f4f82.npy +02933112-1aa76e87d7bcf5c0c59350d819542ec7.npy +03001627-67d86ed49b1bd1e7af802a9d0ab09410.npy +03001627-b42953e6e55ba5d4d2bc32977ed52527.npy +03691459-267dd5dea4dfa74bd4e62d99c536bbaf.npy +04379243-93fcd3809bc2b9e955f46d55537192b6.npy +04379243-d760cfad1855ef2d35f7fdc3c0cd22fe.npy +02958343-3cdb021c923034c68bb386c7dede359e.npy +04256520-8769b3281dd41c771b17743c18fb63dc.npy +02828884-c8a2ce0e65da4b817b11ae648ea92233.npy +03211117-5097aadb04ed3518f91a08212ded5334.npy +04530566-2e54c2bad5d117994daa4565dd30535.npy +03467517-c4d76ad65741ed1cdf16e78e07c53dc6.npy +02958343-5ebe8c53a7b1f554f445715e3bbcd7d0.npy +03001627-a91b2c89e543a4b3aa3d970c5602cd4a.npy +02958343-1ae184691a39e3d3e0e8bce75d28b114.npy +03001627-e6b2017501b20ce1eff1a662025674bf.npy +04379243-61d9def9b2df3e40dc6f96c9bb9e3ae6.npy +02871439-3fa60816f15b58c4607974568e26586f.npy +04256520-d562328792a3314519fb4103277a6b93.npy +03797390-c39fb75015184c2a0c7f097b1a1f7a5.npy +04468005-6d8ed6218777b1fcda43f9c7d6be09a5.npy +04379243-bac09b6764c6c6b9f4144767ba2e06d7.npy +02958343-ca44101f11f4346a34e8e5a47ae999.npy +02933112-cb6ca53673e681797292641f4348a707.npy +03001627-6214c8ab2dbae2517eaeab1f0c9120b7.npy +02933112-46304273699efb534b8710a3469971b1.npy +03593526-6bce9e16470b57d0c5beea20858a99d5.npy +02828884-5a0468d7c5ce7af6948dd2bc2d391e57.npy +02958343-8f715205d2e70c1ebda733a39f84326d.npy +04379243-3b874fc5f84eff21492d9da2668ec34c.npy +04379243-8024f88aa0136725804722305621f918.npy +04090263-99a3238af6d1b857178b53c3b6bafa41.npy +03001627-731a357bca179804951c1fffab4f5807.npy +02992529-e3c02395e83fefaa42dbe6bfe3cdb29d.npy +03211117-b90e7ec58327059e20327f464fa1f012.npy +03636649-551f8026ff0917c781a172d69c52a28a.npy +04256520-d4c6f2749bd85e9a6a9633583f89b17f.npy +04379243-bf0b9b88be76628440126a5bcf48fc87.npy +04468005-7fd1b974ea23815ba0338a523d3365ec.npy +02958343-3b2e74068fee2458dd1e15301c83686f.npy +02808440-dbbc5c9f97b42166c45c4181842feaed.npy +02933112-a4a939a0bd8f8cd9492d9da2668ec34c.npy +02876657-5c1253ae61a16e306871591246ec74dc.npy +03001627-694d9c2e9e769ffe83221ad0d21775.npy +03001627-708e7253604979d06d83c04495f2aa08.npy +03325088-ecc6eab80e50ea2014b35a7d7cea7130.npy +03001627-58a1e9909542abbae48dacf1789d97b.npy +03593526-7f355d9510fbe2b02af07f81a2ca6736.npy +03691459-16eec6c601ae44c06299da17267bf77.npy +04379243-2cd211982e3293a7492d9da2668ec34c.npy +03001627-9dc1371b6989479c9c0ca344f487323e.npy +04256520-388b70afc2bff624fe7ce990d81a91ec.npy +03636649-c695408a86062c4d242ea50288b3f64.npy +02924116-e868f6184d38be0be8784f880dac0f61.npy +02924116-1b137084c6f7facb41cefd10ce5d6cc0.npy +04379243-82b69c9b72a5159ce76bc197b3a3ffc0.npy +03467517-dceb9450f6d9f0bc171b7dfa253c9cf2.npy +04530566-6bbd0b0e09dd43017ddd35a83509257f.npy +02828884-7ef967a69c03c63dd3a0736b56eaf4aa.npy +04256520-640aadadf4fcba8355f9a00acc25f137.npy +02818832-bb1f8f4efd67582aa4aa57d4816c68a3.npy +04379243-212f9ea1cd96196992f4c88fd91c6b1b.npy +04330267-fdaa15a58a2a6e0d18b188ddf020af53.npy +03325088-21d413dde8e653fc14b35a7d7cea7130.npy +03467517-d50c76c0adf8b657f6ca74c754479291.npy +04256520-52687262fd77ba7e4de2cf65d389c763.npy +02828884-991803aca7fca258b40f0ac0fb9a650d.npy +04530566-e64611b8f590d12d2ae6c39a82bec2c9.npy +03691459-d922dd8309247d10ef94793a67b4c5c0.npy +04090263-f9ee6c612895cfeaf4b4b1b903442d1d.npy +04379243-4f4ea0588e9444be30bbd4cddd04c77b.npy +03211117-8fde0d7ae62ae2c802b4057d350ec8.npy +02691156-8504e370736b26604d210d9468aedaf2.npy +04379243-19708555411f795459a339f8ff4d3160.npy +02880940-c0f57c7f98d2581c744a455c7eef0ae5.npy +04379243-86ad91ef08c53dd77189b31b3e8c8ef3.npy +02871439-cd0563a71a03b69688dcbe86402c7c15.npy +03938244-ec4b9c23be44b35992cd8215a5562ce.npy +03211117-93b702bd7ae98bd16942161d780bcaa0.npy +02691156-13ea0a2ac279dbaa5e9e2656aff7dd5b.npy +03642806-7941f26b5f18d9554ab5d84c066f37.npy +03211117-2b0b8c07582c83d426bb7052f66b6d5b.npy +03211117-5e7034ba47012cf088c7562a134f5ac2.npy +02691156-1bdeb4aaa0aaea4b4f95630cc18536e0.npy +02933112-152a850e5016fdd6e0771d4c079a0ec2.npy +03211117-f0482a9b7084c6f8c83b51ded97d6038.npy +03636649-21f7bf15d2f6a765bcde6f92ef1f7ee7.npy +03001627-ff8efdd26382bb863769fe68c3ec842.npy +03636649-38c6b87674e80ee8515596bfc4f5c627.npy +04090263-e3a1e9f4699dd059d9fa04bac43c622e.npy +02958343-63dceacb54c3c170fc7fcf88dfdc47f1.npy +04256520-3ea28d2184d19410c823a47daff020c5.npy +03636649-f41b9c3cb9243780dce4754e673446ce.npy +02818832-5931f3a3ff29d1a36e07666ce67ff5a.npy +04090263-98ea642f1f50b9686b9603fc5970ab91.npy +02958343-ccc6b5ace9f5164d26068f53fe0ecf07.npy +02958343-7f6031f1738d52546436916a86a90ed7.npy +04530566-677fb8c312d9c5642712ffd807ced208.npy +03001627-4a19f4e47476ee654b3c42e318f3affc.npy +02933112-bd0388dc8384961ccf004563556ddb36.npy +04530566-fa656e5b70f12edcbe7ca2216dc1576a.npy +03325088-a7a2ddaa46155a723970a6f5d8822d49.npy +04468005-99c1749b8ffd4c9d52470de2774d6099.npy +02691156-1d1244abfefc781f35fc197bbabcd5bd.npy +04379243-61128b7cb47e0e6bd6e704b04fd0cd56.npy +04090263-e8931ae7d89ebf11d1c304326f7509b.npy +04379243-d60a5ae4802e7338951c1fffab4f5807.npy +04379243-7dea64a734cc77e6fc5030c2f25772b.npy +04379243-4079aaabaa6451a2765ca89770f206ec.npy +04090263-c3065c23eea6a998547046f04c724fd3.npy +02691156-9ff7d7d71bcf50ff4fb6842b3610149.npy +04530566-64bf2e0712889fb77c1c262c715c9a86.npy +04379243-d37b0328d4b5a9454d9e7559651bb818.npy +02691156-b7b743834a6d78c2225a23c790f08fdd.npy +04379243-9271bb0cab9365d44b3c42e318f3affc.npy +03624134-e6b32b3c927a7fbeae29387f6eb32067.npy +03948459-7681e8a8ba049dcec16b50401ee47ac.npy +03593526-12d643221a3edaa4ab361b6be63163da.npy +03001627-357275196334dc4feaf288f952624966.npy +04530566-91e0e1a6dbf302c3d55da98ad008849b.npy +03001627-42635d55c5905a682672e8af102e0b3c.npy +02691156-dbd589812bda0b1ebab624e35355496d.npy +03001627-1049953406c81b237eaeab1f0c9120b7.npy +04256520-3d95d6237ea6db97afa2904116693357.npy +02958343-f3760c5e8b97149163b803b494079757.npy +03001627-9245c7a6d33320da7b707c797539b200.npy +02691156-cff4a52406b84da7aaeb49542c2cc445.npy +04379243-fca884f9aaea06cc9c1e87e8cf2e52d8.npy +02871439-8e47f2e5ebdd38d8d810b14a81e12eca.npy +03636649-bfeda9055368d2dce76bc197b3a3ffc0.npy +04379243-74f985d5bde29b01dec11b4972c4b3e6.npy +03467517-37e72e4a18a4d0ede2e4961161b75547.npy +02958343-3844e637bc560e6298a55e96872d31f.npy +04256520-5105549b9de890319fb4103277a6b93.npy +02958343-ee0232b37ee6265bda72093f9b5aa73.npy +04401088-271421566061988a93d9d97ff82834ba.npy +02933112-4539b185db32eb4a533276a8c0b1c862.npy +04379243-a1480d2276574cfee6c5cd45aa112726.npy +02958343-d0cf2f187acda5736be7348aa770e4ca.npy +02808440-f9215f88025cf2474258477db4e0c1b.npy +02747177-e48d8446159614caad5067eac75a07f7.npy +03790512-82c8d89f0d15429a17bf584c2afe53e1.npy +03001627-e1623d4ae16bb17989e686021e3387cd.npy +03593526-83e749b6b8a6db9af67a276d485e951.npy +03636649-51b4f0fd600a7cdc580a266ffa083ba4.npy +02828884-b6ab037942cf91c0601104cd2d998272.npy +03001627-ce2acc9d7aea91a0988fec2229ccf13f.npy +02933112-932ae6a9eaca65a03f4b30b8df1dd26b.npy +02958343-151bebc457224c2733d7c9e122eec9b6.npy +04379243-55221b101eec29dc656a19d1d18fdbac.npy +04379243-d1b44c2dc663cca6b8baed360b6cc5ee.npy +03001627-6dc5a07a13fb7dc32ff27b24dc18a6e8.npy +03636649-69ae5e9ce88c9262dd0bffa2f83687b2.npy +02958343-b0a7789537663f7ba1ff2929b2f5cf19.npy +02691156-1e0a24e1135e75a831518807a840c4f4.npy +03991062-23448fc0b511d7b61e66636678929092.npy +04379243-c92ea3f511378ab1e21111e385a0661f.npy +03001627-3010d6ca1b1e8ce3bf54ca9b2f215141.npy +02958343-a74c1aa71334c6af20363e2561dd589a.npy +04401088-2725909a09e1a7961df58f4da76e254b.npy +03211117-cf7294db3c65ca5c945ef919ad31a7a6.npy +03513137-7e4e3a4a38a589232f20449572a3a77c.npy +02933112-9a0013f4e6a0521b5670497a6e548500.npy +03211117-d3bc26796e7fcc6b3956af37bf042355.npy +02691156-34c669182c8c9a2623fc69eefd95e6d3.npy +04256520-f2e7ed2b973570f1a54b9afa882a89ed.npy +02958343-b47d993a5e2dd15e3a3aa1d2d3319a4.npy +04379243-79eeee790ed5a5aac242632b2a8c3129.npy +02958343-63e0df089d6c1442f3aed64053e21b3c.npy +02933112-b1bb6113dcdc8a65ffa51bfffbc09ebb.npy +03691459-e97a846820b094b8f439510dd98d9326.npy +03046257-4f6b01b011b8b21354cd2a0ea6cb618b.npy +03001627-dfeb8d914d8b28ab5bb58f1e92d30bf7.npy +03337140-2a853c2492bc9615ce5d6e9371bb5c33.npy +03001627-f34fea2c05dc63d090984ccce1017e45.npy +02992529-b514d253eefdbfdbddfa02c62bdf0f8f.npy +04256520-b435dc75dfcee77c4b3c42e318f3affc.npy +04379243-d6daf5eca30ca0965722577712723fd1.npy +02818832-90d5d27ab2a94109a043a79379c5661d.npy +02933112-a9bfa9259f31ef9fde650492e45fb14f.npy +03642806-4348768ff9802fc5ce1decf313ece97f.npy +04530566-5702b12bfba4b9eb9223657c918f0a45.npy +04379243-7956ac7aba6295d1c2fd07f66cbad0f7.npy +04379243-3379b29c3a6221d79996b1334107828f.npy +03467517-fdb74c27462dfd837c481698bd5233b4.npy +03636649-3a0719c32c45c16f96791035e86a30f4.npy +03001627-74e14880b5aab8e3490ad276cd2af3a4.npy +02691156-b87185699318f4b635fc197bbabcd5bd.npy +04256520-aa2e8a77de22165ffe369f4f96683f52.npy +02958343-1ed012d3232de232473f10e6caaeca56.npy +04379243-414f3eb4c4de757cdc97baf002c8189d.npy +04256520-784b4379cc7e74e14fb315ce917a9ec2.npy +03624134-daf2098f026e292c152b5e07600b5ea7.npy +03001627-68af43642fa145115029039df67c2549.npy +04256520-9aa38ab7fabbd6becb6924eecbe974f.npy +03325088-7837cd8d1e5e69d4b362845c6edb57fc.npy +02747177-22f7580ee1819eb7fc435963bd99e667.npy +03991062-90dfa95b34f3a84b6777543134f0db6.npy +04256520-1442fc6ef6b82c8ae1da81584e31b667.npy +03001627-67ce9e1ac8e41027bd16d4490a10a752.npy +04379243-7aadbba28333e40a77e6105b101d7310.npy +03325088-13e1e13465fa1a67b362845c6edb57fc.npy +02933112-8b188db0cd8ecb909f076a53721d9427.npy +03636649-ca09dc8016291c171735ea0e092a805a.npy +02933112-1459b403c084a33e7694593a26340e.npy +03001627-355fa0f35b61fdd7aa74a6b5ee13e775.npy +03337140-1ba863365511363a91c352d02061b3f7.npy +04379243-a257171096faa6252ea98d69e91ba870.npy +04256520-147a9f656054d718e10a48f2bbb9bef4.npy +02691156-78c3a29d1153e68e5fa2a5df3ce5bc40.npy +04379243-cd5f235344ff4c10d5b24cafb84903c7.npy +03790512-de1f30fbebaa2cd675e2c647bf7937f3.npy +02828884-48c9e1679ada2949fd8f87bd7d4c2514.npy +03001627-3ac2da28e9a2f547ce4f274577283b16.npy +02808440-bebbe478c5c2d44e44221bef0fa3c36b.npy +03636649-9f8c2c2c3b9796654b3d6a0fb5682cc4.npy +02691156-43beab0c1cc46ae641b5a73cd6c05ccd.npy +02933112-d0af907a612856e964b62a9cc93b56f5.npy +04554684-622d6f378276a09b8fac6a8030e15671.npy +04379243-e27d9fece990d39a0f23466c3c25e2e.npy +03001627-438e57bab04de55e8544f4ec4dad7a5a.npy +04379243-810c87b90f7dc301da9bd441f1db1dfb.npy +03759954-91db799921bc0241c040d6dbf5370e2f.npy +02992529-f420bf37baaeee5621844676433a0aca.npy +02958343-92cc3ad1d3da26955fcb05674109534a.npy +04379243-ed9dc0937009dc031311158f08f2982a.npy +04379243-61b6b273190637e5788a7b7b4713dbc6.npy +02691156-80af162c0c01f27c4f8a08a5e6b028e7.npy +03325088-b68106b79d8b98b95268c5e200a25358.npy +04530566-7b00ce37add93f06ffbdd9e9972332a7.npy +03691459-7e105d770e297ee43dd0d6160c4dfd18.npy +03001627-7effccaa74122b5f2beec56b24479ed1.npy +04530566-5c6c725a75645a305de2c7f7608a946f.npy +04256520-3d498fd733de605a929a5204e472930b.npy +04379243-88e73c92d8d5195fb8b431083b6191e2.npy +02808440-93b1dc8aa040da641f6566a4d01370e6.npy +02958343-1cc85c2c1580088aad48f475ce080a1f.npy +02958343-728f6f29382b70053ce4e6f97016bd5a.npy +04256520-1b25f96d97a94b05125abe33bf4f0061.npy +03001627-5857dfefaa1b6d071d9fd76961a98198.npy +02924116-c7bf88ef123ed4221694f51f0d69b70d.npy +03001627-895099e136437cb799860e9353bb52a1.npy +04401088-21a7e90867b64433316979ee2b237f2b.npy +03001627-ce95fa90122dd67e5935ba184b9bc177.npy +04090263-61c0df4a0db0a32fe73c917c8db80e59.npy +02691156-48df2496242053da4ee0fb6a51564c3.npy +03593526-166c3012a4b35768f51f77a6d7299806.npy +03636649-c211f82e84eb62bb776f01d35517da23.npy +04090263-e3230062ee3def46aca1893e093d31f3.npy +02958343-18cd6293d7b17a698ce68842a487b19.npy +03001627-8a85b0675605ed8219fb4103277a6b93.npy +04090263-e0b23c80cbe3a2d8fd8c7a1bf5db0aeb.npy +03211117-51fcf8537a132b789058e0e56fa89a94.npy +02828884-7f418f4737d4a7339702fe80e90cab1c.npy +02808440-33d2b4361e3fcecfb340943d9bddb446.npy +04256520-36f4fa1689803b442d19175e7d19b7cb.npy +03001627-4a783b2ae8fba8b29dcf2183c858e6e5.npy +04379243-1307c27c3f1d1f7a895e947287fb0c95.npy +04530566-c991fc4636615e64ed01ae0c90548352.npy +04379243-794dc333392caee153041c49040be3d5.npy +02871439-b26b03578ceefc20f9c0f9cbb10e38a2.npy +03001627-1b83311557e48d6328145ddc1e2c18e1.npy +02992529-1bff7e425c06b65af431996b7f8b435b.npy +03211117-edfc3a8ecc5b07e9feb0fb1dff94c98a.npy +04090263-ffba44e241dfb481efb47d8e2c9f3b57.npy +02691156-22831bc32bd744d3f06dea205edf9704.npy +04090263-2bdd7783684aeff0f3ece95ce0e0247d.npy +04256520-50766e42adb211675e0d6e917505f52f.npy +04379243-aa8f7d94b5aa9cc1f9ef5ec0bb70f1c.npy +03337140-a0cdb98dabb459f7b8183a4a81361b94.npy +03211117-41f428dfe76c1788957b752c832ca929.npy +02818832-f10984c7255bc5b25519d54a714fac86.npy +04090263-6d026044f6c68821de698295f9180ced.npy +03001627-b8f2712e8330ba6b3c9fe3a963c6d73b.npy +03691459-de41e90d949a21d6a41c66e27a37f014.npy +02958343-1cd50bde9a3e711637b0898eccd7168.npy +04256520-da77fefef637adc26eb9b08c8a74d159.npy +03001627-dfae4f9155877a1ef57b53e86a4ec824.npy +04256520-854ded41212e767c12132bd78ab15cd5.npy +02992529-c864337d009c823290a9c3b0b32f8569.npy +03467517-a39dcefa599a76dd93f0194265a9746c.npy +04379243-4442b044230ac5c043dbb6421d614c0d.npy +04379243-edb69ee3e3e66e9bc242632b2a8c3129.npy +03211117-f1a3e41b45de104a810988cb5fefedde.npy +03001627-7ebbce44a6001e71268677b0fbb8a262.npy +02871439-e9b41b47c97866b7e76bc197b3a3ffc0.npy +03001627-a232eec747955695609e2d916fa0da27.npy +04379243-9b365e622638616d58df8eeaf3dad1c.npy +04090263-9e43b09d2c4115276f21883e4b04581e.npy +02871439-e3738af2b535ea36ecf5e8796652a83c.npy +03467517-a60209a0df7a3c87282aa382fb875f4c.npy +03691459-f663176a43096b35a43ada367b02a4fb.npy +04401088-235cca962513b7a7629cefcc54d102ca.npy +04401088-2ef0e93ce68dfa74bd1f358005ee8ea2.npy +03001627-9d81bc691486a3c725bc9a8086ca05b8.npy +02818832-74d5ab41106d27a8bf6d866879baaa7f.npy +02924116-43c425087cf9d73352470de2774d6099.npy +02691156-6296558889cbcba8faa7ec7d870d2e09.npy +03046257-f82e90f8a6d49827e8784f880dac0f61.npy +04090263-9b19164c5b17f3016da79efb34b8c0b4.npy +04379243-ef9f3af9b8453613febad4f49b26ec52.npy +02808440-fffe3ce4db102b3254d7082b34825ef0.npy +04090263-1e62da4891f2021d950daf47e5ba3cf.npy +03001627-6bb6b27aa687d422d612b1f62c413c3.npy +02958343-42147d774e08199564c7d8ebbbb68f5.npy +04379243-a2cf3d4375a5c6a65dea31ce253437e6.npy +02843684-524610c549c74ff64197bf8bf6f07b46.npy +04379243-3f5497bf65ff9b91c48d90eef8384210.npy +04401088-83f766eff3c5c12c781fb7da315db2c1.npy +02933112-851274c7a38bedb5f55057dede601621.npy +02958343-d05aa55f9e5b4d10afe1d4530f4c6e24.npy +02924116-e299444f1a4c7457fa9ee9b3a7eba069.npy +03001627-eb9851403aca75937d395837145ded71.npy +04379243-a4cd409ceb0aa148d93cf5f5bfd78ab4.npy +02958343-294331fc6c86a51ec805dfe4ca9f2fdb.npy +04379243-7cfa4ac4e24cd680c3bd24f986301745.npy +03636649-199273d17414e77ca553fc23769e6051.npy +03001627-52c32b187590e8f3bba5aaac798c64af.npy +03636649-6f6a74a5528a7b5d88e7662971dc736f.npy +04379243-afa90f39238804b35778775dfd5ca46a.npy +03593526-82806d655bf46d8793b839ea777587eb.npy +03046257-3a5351666689a7b2b788559e93c74a0f.npy +03001627-4fad9d9b2c73cccccf0517eac2f2d331.npy +03001627-c8166f63964058199947cf98084faa8.npy +03211117-d911b390503a11f96436916a86a90ed7.npy +03691459-34fec404bf5a83dc8fe1b374a74b9d43.npy +04379243-9c162d575505f102ad16260d4d73b56.npy +03928116-47aa44d818a406d822d6b12a61cbb9ae.npy +03211117-2be8c8104d0025ba74dedaf762719321.npy +03636649-1845801e19ac5c22683869a26110a529.npy +03001627-b960544cfd0ff09f26b2c6e6d8c1e1ab.npy +02691156-deb9d02cd1eda25270c4138179d9ed97.npy +04530566-d6cf4f71059b98a13d9a3c3392922df1.npy +04401088-987662da7f345b272b1c9d869bc37167.npy +02958343-c299ad24d291a4b6756936223b42a971.npy +02958343-7e65e7db2b227946631a8860374e7eed.npy +04379243-fcc0737ae08a9cfb63eca8f941f00cca.npy +02691156-d84bb293898861ed9b2acbfd8323f804.npy +04379243-80f8961877a467b23002761e7a3ba3bd.npy +04004475-361e69779293348c7cc896d3ea5ca772.npy +02876657-f853ac62bc288e48e56a63d21fb60ae9.npy +04090263-27326efa9e84ca6aaf365ec12406f363.npy +03691459-c1cc6f59c8c6406df64115eb33ec13b.npy +02958343-e899ede8bbc146278746a6bea8ba48d.npy +02808440-d171a949c9583599ca972daa503b3095.npy +03001627-840b73e5066afa12941584a3d730ae7c.npy +03001627-2c351621045e25351385913bc50a0210.npy +04256520-3535ee6f6b070f07a1989a802607e7f3.npy +03001627-f1563f3906ae14dd32b8e0971fc6a65a.npy +03046257-64f72d2cc5449a28e2334ed17f235e6c.npy +02828884-e2e528622ff47c32cb2a965e75be701c.npy +03337140-6633b658534938ded02b906026bee536.npy +02958343-5ec3322293a39816ad7e7cea4034d226.npy +03642806-76ce3dd6212251d34145b5f47fac09a5.npy +03636649-ecf9ea749680ae432d9c07d3b9171829.npy +03046257-53aff981d28b365ec5996c1602569cba.npy +03001627-e6328c1bb6b194f262e682c9809bff14.npy +03046257-412bf74d9811f27dd06c8fdd4cec77fd.npy +04256520-dfda3c467eb6066fe6fe3612af521500.npy +02958343-ba494b33be3a3e0dc1bbb501b1d87871.npy +03001627-61d29e8133da0b58d1fd43e2bf80195.npy +03991062-5af2910a3b96af5cd2b12aa6a0f050b3.npy +04530566-7a3ad44b854faf361f377e6c4dfe0096.npy +03001627-bd3941eb3bcca6ad9055f83d11955109.npy +04256520-592e8295672e1419e82c020151d41155.npy +03001627-7f6858bd9d4af9df97316612e1a4343a.npy +04090263-411de9a0a7a8e3e9a0d6b294e290074d.npy +04225987-619b49bae27807fb1082f2ea630bf69e.npy +03001627-ca2294ffc664a55afab1bffbdecd7709.npy +02992529-2f468e01f4fdcb54d81a607e3ac2f927.npy +02691156-b2dd8a3e977d8e5f23c640e813cbc041.npy +02691156-f97a48680d63a78a9751e413d5325f7d.npy +03085013-80512f14251fb8c94f0dfda6a4916221.npy +04379243-bad7911965fdf1786487ede8a6f074c3.npy +04379243-24732a80e4b1a44282db9fca4b68095.npy +04090263-26bf4f71d7c24af87ec95138ef83ef2f.npy +04379243-3a069fc75bde2735aaa6ab0dcef7c556.npy +02691156-926749549b15941e6455d739a5cbd8d7.npy +04090263-3151db7f965943ef9bba8f87a19ff3bd.npy +03001627-e9a8c9067bc733ed95bea7c29e873d16.npy +03001627-e5ea39e2b4c28ea2a8df8437731d97b4.npy +04256520-fe154cb3a5dfdffc5ae252905262c0ed.npy +03001627-c571ff6f3231fe861e1a7bd9d68b88a6.npy +03001627-27923c3fde05f14b5ea23a116671b38c.npy +04379243-ea6b9474514df497febad4f49b26ec52.npy +04256520-4ed802a4aa4b8a86b161f36d4e309050.npy +04379243-a5815741cc777e643002761e7a3ba3bd.npy +02828884-be125cab2902e0e163b2acb037dfbcde.npy +04468005-87b7d76dfdc7433552470de2774d6099.npy +04379243-3d791e306d7ae620b3b8d66c43b5b940.npy +02924116-f9cf9ccaf5491830ca857150e7faab.npy +03790512-56f5e30ad65f01561c6c61410fc904b.npy +02933112-33ec57af7f648994da5feafe6f1c8fc.npy +03928116-88f854b66978d1c45caaf941a8fac2d7.npy +02958343-84ffded0ab4b499588ed7b6315c3b4a.npy +03991062-3dec5904337999561710801cae5dc529.npy +02691156-5cd19fcc882cc769e8b0cab853748d53.npy +04379243-743d8382aa44117e593ebeeedbff73b.npy +04468005-f26e122bb890e6ee810c01b1498aa2b.npy +02828884-2974b7f87eb2297ffebad4f49b26ec52.npy +04379243-fbf9ef8784c0cb8485c1a9fb01e08349.npy +04256520-fa71486d68dbe48bf27b78f69ac93684.npy +04379243-8cebe5dcfa2b907f47c638c0eee4a2b3.npy +04468005-2c1478b556f8cca752470de2774d6099.npy +02933112-12de47490769694e490ad276cd2af3a4.npy +03211117-6e3fafd33a4683d1fb0a4dd466ef3d66.npy +03001627-b8666dca76b418e04c9bf8fa5a14f3be.npy +04379243-738e5983a229c432db984b8f0550fcd4.npy +03211117-2c4f9415edb358adb71a0e5ffd778fe.npy +03691459-2750caf7565977341ef58b31c4ba0d15.npy +03325088-9f4ab72b17226d3d843f813f752a5e35.npy +04530566-54da496566d05afb568b456e2715b08f.npy +04530566-fd488ccadbc89bc7ece8bb633fd3452d.npy +02828884-d6580bbf1220d39ede270fc3c23d78b.npy +03636649-ed54691cf655a8a3b3a8888e78d004b3.npy +02871439-3c5225f973732610664b3b9b23ddfcbc.npy +03991062-54fdf8d25110bb95993afecc2c675915.npy +03761084-fa70f7c905cd59294d895026cd5c31a3.npy +03691459-ee6445b3657504053839b8b68c69081c.npy +03790512-86a247b7f3be38957395d58407f193ba.npy +02808440-5f2cd0c8c02d7557bff8b2d517ae4561.npy +04379243-6e23179a3559775a65eacc25f128a1c5.npy +03948459-5b2c7491683bc482fdd247fb557dd75a.npy +02828884-a5a9a0be36997bd82f549c6b85154162.npy +02828884-1b80cd42474a990ccd8655d05e2f9e02.npy +04256520-41f47dbde823f29640d304b02c5868ea.npy +02924116-d5a6bbe13a5781761afedc87fe387fe.npy +02958343-63069a0c741a4d228b7c308bd543da59.npy +03001627-13fdf00cde077f562f6f52615fb75fca.npy +02808440-e9c2323050d30491b362845c6edb57fc.npy +04256520-cfa5feb7486f88ee1b8fe07f15de05f7.npy +04090263-69240d39dfbc47a0d15a5887ec2183c9.npy +03001627-43849351a4da550b33d93f57729688db.npy +04379243-656aefa835e5f6624b3c42e318f3affc.npy +04379243-6ae5a011c8724eb5c3bd24f986301745.npy +02992529-95e61ab6f817d7ffdf3f86c9fe70c0ad.npy +04379243-33857c2548cc653ba53276bbe109327a.npy +04468005-840a2e6a291049ad85b408a8edc983b.npy +04256520-126ed5982cdd56243b02598625ec1bf7.npy +04379243-f12210d97248ee00e3db80a3cacc6e3.npy +02828884-c57b336bd865c0907b20cb946bceb58f.npy +03001627-9f9c83f3014f19c79e4965f0106e00d9.npy +02691156-10cfc2090a2ade124c3a35cee92bb95b.npy +04090263-3a3c0edd93ed40d35a39b667673bce58.npy +04379243-a253b171a28f3ecdb781d9dcb8ecbccc.npy +02818832-24abc08487b7d111259864675d182396.npy +03001627-e9c344a392e311195b903ba10d2ec446.npy +04401088-9dcc24af7e0df254525b3f0594400a46.npy +04379243-e8afe4f07f221087620018391309f97.npy +02924116-29c4c3d205d4d1dad4ea1a05271e100f.npy +04379243-27008d8569ba4426f577ff4de1ac394c.npy +03001627-688af6f43377f16bc3bd24f986301745.npy +02691156-23f911351a5801aa46555ee25941a22e.npy +02801938-814bba8e48083abfdce1af5c27e3da18.npy +03001627-436ed3a8e05baa0d492d9da2668ec34c.npy +02958343-b3f1ad55fa401c35e8c505ac322336cc.npy +04379243-2517066dc728ebb955dbece39a4b7905.npy +03467517-6f52e760ce1d8b95fe2455ba3d942ef3.npy +02933112-63397b0df482d51ad7838dc22b16368e.npy +02828884-ecd56b7b86c4d94ad1f278e1513f3b7.npy +02747177-ae3257e7e0dca9a4fc8569054682bff9.npy +03636649-be02ef97e47b86c34e3474b03483338.npy +02828884-bc1261eb081cce07467f6a563eb9f7b2.npy +04074963-1941c37c6db30e481ef53acb6e05e27a.npy +02958343-50f4fff3a26ea3518b3ab49d2e0e41ab.npy +02958343-477ffb061f40e10e148f8c864a546424.npy +02933112-8f55954a0b07a4b2bf64ff63662d244b.npy +03948459-f4cf735786b69d7a5d0dded52efeb4fd.npy +04379243-a24af284041888bd5f05ba8053abf6cf.npy +03691459-c280153b72c8e8ff571d223b2b8e4a24.npy +03467517-9e6221cb3421a1a1082f2ea630bf69e.npy +04379243-8483abf40b0b4a65d009c98a5b96836.npy +04379243-807c73aa0a556bd496a3517f50eeb9f4.npy +03001627-7c7b4bdc2fc34ffdb398ef956214258e.npy +04090263-30c4a2e9a403c9d9d7cad6f9e585deac.npy +02828884-c930760585e923cbdeee898eeed8aea9.npy +03636649-9c3646d9db630e1d6bab719bf4ec73ef.npy +04530566-8497e02fa1662113776d8bc79b9caa2c.npy +03001627-54b7d484dbad29cdffc6e457221b9271.npy +04379243-c5480855c540290ecb922bcc33df0268.npy +02958343-89026c748b9cf721bda72093f9b5aa73.npy +02876657-fa44223c6f785c60e71da2487cb2ee5b.npy +03046257-75b2120c563d66edbdfa5e0753fa3240.npy +04379243-4a11c4ed20638d74c3bd24f986301745.npy +02808440-401637cb32f0eebb2b8489ea79093b09.npy +04530566-ddd02c6fb780d4f6c683d3e7114aaa37.npy +02933112-2b376f6dfed75d53684b7bc3f8a9aa55.npy +03001627-46d7e85d80411f50a094848ea4d06501.npy +04256520-e5f51c7ccf8ec35d2f134420f7b0d7e6.npy +02691156-934dd5529c22cd05bc0909d98a1ff2b4.npy +04530566-cab7f319f0b3cf8e57e59e0ad2d11e74.npy +04379243-68680849282fb0be21ec2f83d790ab97.npy +03790512-fbe400bd5e06d541617798af67b81f2f.npy +04256520-e17c6810519ba81a559916e9a5177b0e.npy +02942699-6c14c6f6cca53a6710d0920f7087353b.npy +03001627-c42b305fdffad7c9cdc9f3b79a373ad4.npy +03636649-9c11cbb88d574584c4f1f36666bc4b4a.npy +02958343-6f3887b3b8253284de541e973ae662b5.npy +02958343-7da7ba42dbd0a0f9be40bb45ea25a041.npy +02691156-2636cc55f0bee49671d03b466c72ce41.npy +04379243-fed49ae8578b251d9e5f3db95fcbc5c7.npy +03636649-98f1dd4a250a906fb5fd9907631a04b7.npy +03467517-b2861185931876e1e1f2a1daf140ac9f.npy +02691156-5c4095795aad447f7301f2b895d332ac.npy +03790512-973d75ed9c12836f3d033e6cf82ec72c.npy +04530566-da73f51f17f0a8bfb0d00cfc385a039b.npy +04379243-59027dc9bd7a066ec031b2e122ae5028.npy +04379243-687c7be604090bf89cd431573238602d.npy +03001627-588dc044970bc56f3a4a5c95fa1b0032.npy +04379243-9a71b92445cd3f023a9bc242c86fb7a0.npy +04379243-bd27680b9f09262bbdb2cbbdf53d8900.npy +03001627-74e6ecf3201874777954eb05bbab463f.npy +02876657-bf73707d87715aa8ad5067eac75a07f7.npy +03001627-7e5dada1bee3e6dfca76c527f185435c.npy +03948459-d1ba405fef56efa0fa29682ba98e856d.npy +03001627-77e84b5e6526be75490ad276cd2af3a4.npy +02933112-aee149ff795d5a7ac59350d819542ec7.npy +03001627-436be9df788b706fb40f0ac0fb9a650d.npy +04379243-142060f848466cad97ef9a13efb5e3f7.npy +03001627-b07c1560f5c3bf20525319ccc5eeb31d.npy +03624134-a782251f2c38b909bb4cc32522c2ea6c.npy +02691156-67979ab8dc522028788e57551eae0744.npy +04379243-3604b060233bfd79bd08524bcb66a009.npy +02691156-34da5dbfb4bead034c3a35cee92bb95b.npy +02933112-aa28deb4dd304d12f51f77a6d7299806.npy +04530566-f9cb8429f822b8469ae563bb6367e47c.npy +03001627-6b7a74a6a77b0699c3bd24f986301745.npy +03624134-3cbec0d04a115d9c239ffdb3f2fb535d.npy +02691156-a51d836a9349b2a1f42bc0eea174f82b.npy +03211117-c62af9a75f8779b82b8499d50978754f.npy +03001627-36ee2823173fecc8d22730b0728b2fc9.npy +02992529-61424998613d67b75ef3453134070b3.npy +02818832-7c078d8ceed96b2a115a312301bdd286.npy +04379243-27f9965a337bf46d85924458b86f34.npy +03001627-7715c9c229d80afaf487e71bd57b6e0c.npy +02691156-97066012fbca5983c74417871493eae8.npy +02933112-216096d5038c86a74c62bee40dcdc539.npy +04090263-b6b6d7cbe981d57276c3d558130f8b4.npy +03593526-76ffe67d67948975464e3094da7d844a.npy +04090263-705d24724cf1b7fe4fb30f5124687748.npy +04379243-69a96a236eb59dbb4594f83fd12bcf18.npy +02958343-61b40cc1d7e054cfaeea7738551d104.npy +03337140-2d418ca5fe05f2534c3aee8e9d3a6ffa.npy +04530566-4ecbd1471e916cd6c1ae34bcb12af75b.npy +04379243-58160ac529c37aef1f0f01a76c5ff040.npy +04379243-2ae89daf7433f4d14b3c42e318f3affc.npy +03261776-f5d210ff14ca9d29b6d9c2cee7f2f72b.npy +04530566-f2192f3c34a877f1d01eaac447e2e9b.npy +03001627-e60f50cdb48c2626d61bb0c6c287d278.npy +02828884-1ffcb829779ad5942056b4bd5d870b47.npy +02828884-dd4d12077d16512d8ab9e8dd82b356fd.npy +02992529-a6b2c1427dec317525bf2427892579c7.npy +03001627-c00d5c9b043b600019fb4103277a6b93.npy +03636649-3fef4c8dca9dd0e0dd4763fce8a9da20.npy +03636649-48cde19fa1d6af1653b336293441aa49.npy +04090263-12b346d7a60328ba9be47ac7c7e37815.npy +04468005-17407a1c24d6a2a58d95cdb16ecced85.npy +02691156-752a0bb6676c05bbe55e3ad998a1ecb4.npy +03046257-978541d6924dd42d7b0f449c7fb27872.npy +02942699-8b4f63046ee3bf99373b92b376321e13.npy +02691156-99656ff9d5a8a0fcbc0909d98a1ff2b4.npy +03636649-72ba0dc1fd49c2b5eef5d83b671bb264.npy +02933112-4d3df5ede83cd26e661673811de66400.npy +03636649-db447b84e1a8d8d6ba5342d638d0c267.npy +03211117-7fac92e1ac6e11945f6762b47fc0ecae.npy +03797390-187859d3c3a2fd23f54e1b6f41fdd78a.npy +03928116-8d84337557ed610533cada922154549a.npy +02992529-6b9cd9c72e69fb81d8630b8390e34e0d.npy +03991062-6e7a46fa4a22f5cbf2b931201029bc76.npy +04379243-da0def87fd8cd658da094b3bbad5f5e4.npy +04256520-c69ce34e38f6218b2f809039658ca52.npy +03642806-7312c9dc3c2802e926db2cd5ecb2df2b.npy +03991062-630aea241cb0ec8f24cedf205b903c2a.npy +04379243-f9c98f76522d375d20bac10b01e55c85.npy +04379243-2d52675c865f669047bc3701b998a7d5.npy +04379243-5b100f548ae5b162f51fa0238791f5dc.npy +02828884-43e72408630a790181faebbdea6bd9be.npy +02828884-8b9d37a08dc542f86f4e61e20a3631d1.npy +02691156-641af2da275049936cc53f9d72e7fec3.npy +03001627-6272c21e439e0205c8687ff9b0b4e4ac.npy +03636649-be61621254d82a6ebb40b038e5e0b7f0.npy +03636649-9a9aa982c0667012ce11183544874734.npy +04090263-61403e9bbd37636385076c97ccb96169.npy +03046257-47aacfbeb77a977b6463df620b7b4cbc.npy +02691156-723921d0060203a344d33ea02fa0f619.npy +03001627-b67232c18d00fca7593ebeeedbff73b.npy +04090263-727b9b62c52fd7d6bf36cf6ce284411c.npy +03001627-8d3817ad88a809524b9112ce9ce98204.npy +03001627-a004ad56474501f67eaeab1f0c9120b7.npy +04379243-f27a1f3db59556cba0ab1d82ef09f78f.npy +04256520-d906d689ec1edccffebad4f49b26ec52.npy +04468005-e55bf524949fe29052470de2774d6099.npy +03636649-e37796d40348fa5fd8013bb984303089.npy +02691156-b94b4edc5e4701093ba0eea71939b1f2.npy +04468005-d7ac71c003622f4d9954eae9164faecb.npy +03797390-9c930a8a3411f069e7f67f334aa9295c.npy +04379243-ab1d67b6f09b35424ea2d70ab68cd1d2.npy +04379243-a3e030b5fd13158d7a2166c62eb7eb3.npy +03636649-9534d5751fd1ed574cc30865d6337b9c.npy +02691156-d16405b7a4300014ef5bed0139d3780c.npy +02691156-3badd7765618bd66a532a2f6f060af39.npy +04256520-b3d686456bd951d42ea98d69e91ba870.npy +03636649-65f11c0c8a86a8ea9813dd6c977cb17e.npy +04379243-cda92b4188af3a17c03a563a9407c5ea.npy +03001627-b93d170448493717c2b64c0adffbe398.npy +04256520-c05c058169a31a19b149830119040db5.npy +04090263-dd9586cd8cc762dbe43969badba53c7b.npy +03691459-799a7910c5084f1a799c6c3b2fff049.npy +02747177-942887c8d668501681faebbdea6bd9be.npy +02808440-2b535c15e1baec23ee2de8169f41c6e9.npy +02828884-fc7785be580a926a3409d1e6da3f019.npy +03211117-d3193b07bd166c0611e348ae03a757ef.npy +03642806-6da67be7e83afd3be3b927dfeefbac4e.npy +03790512-2ff252507b18ce60cd4bec905df51d1d.npy +03691459-b7acad8df6aef539a35fdda2e8d5933f.npy +04379243-bc23348d2f16d4237155483601ac0c56.npy +02958343-d83fd4f79f16a1313c9d2d3d4dc0edb0.npy +04401088-c864337d009c823290a9c3b0b32f8569.npy +04256520-9805e011defa15f37fbc060fd555478.npy +02691156-8eda6d2dcf9302d2d041917556492646.npy +03001627-3f5f14f6156261473b194e6e71487571.npy +02691156-5cfdb557f5fedd51adb50624aa91e8c9.npy +02747177-e3f87ceed5c45b39eb0ce5843fe6b264.npy +02747177-3b4bc00820afb447ad5067eac75a07f7.npy +04074963-3039044a24972ae37bdb91f66fe1a363.npy +04379243-4822e02112a450f593ebeeedbff73b.npy +02876657-9cec36de93bb49d3f07ead639233915e.npy +02828884-7769891a8af54054bfde7937440ef438.npy +03467517-3824a2336972d144a24eeca91f583600.npy +02958343-a5c969e3401228d2c92e66330b5ca173.npy +04090263-dcc4bb465d403801e1f2a1daf140ac9f.npy +04256520-55bae67315330e0f131878391e12e811.npy +04225987-ccc91585d5d614a3ad3e04762b7c31c.npy +03691459-622a9789d1eaf6e3cf56355417e88d12.npy +03001627-74615c2f7098738ca9764f2d2db668a.npy +04090263-8cd9afeb654c89b8fb5c1b0f759e2bc1.npy +04401088-db058088ec098d9bdfbc59eb47b047b3.npy +03636649-5270f973e56a05f12cd2160e449d45ae.npy +04379243-1cc337d9f3f6d8f47f45370489ca3156.npy +03691459-993d30ee5f04eb7bc41d2caaa616b8ad.npy +04379243-953ffe955229423213d2510999d0f1d2.npy +04379243-2c9756c06606c05bfa85bd040b2a2468.npy +03001627-473a9ac8376e5a15ae0b06ef692d1ec7.npy +03636649-a5a31ea56d8fbe0a72ad95ccf7316565.npy +04379243-48a944dc8751ca7531370540942e6ad.npy +04256520-fbcaa3c4d17b8b7c9b0790357cd0493.npy +03001627-55e1cde05a99f6c7d1d34366ca81fb3b.npy +02691156-8f40518bd30467151e5ae32cb9e3711f.npy +03001627-e0a473eb557c424320768660cf080d12.npy +02808440-d0c3bf270f9e04eb362845c6edb57fc.npy +04379243-1d9b72020d680630bbd4cddd04c77b.npy +02933112-9304e9ad9853d1caf760390d600fe7fa.npy +02924116-4253a9aac998848f664839bbd828e448.npy +04379243-4e46ec6d0826e4525228d12f1858463.npy +03001627-cb87604cf146b4eee897810eac8c21be.npy +04256520-cd1086902b5eb749f51f77a6d7299806.npy +04379243-43b3d26626b7ac54b35c92fbf601983.npy +03325088-981c79da1f3dfc3bc36fb70296e45483.npy +03691459-1a1ff0c5f28f10d642e265df80f79372.npy +02828884-e27ffabfdcd52e7dfa11d00fb25084c8.npy +04379243-9d873d1e7403e2c825971c9167623d21.npy +03211117-cc3adfb500c1d443b441e189e5a85c02.npy +03636649-94af43cc530f8c4649244b68aadec703.npy +04379243-acf4b272c86a011fa0ab1d82ef09f78f.npy +02933112-44d195279a116e347eee615e75bc3b77.npy +03001627-7fe64a3a70f8f6b28cd4e3ad2fcaf039.npy +04401088-c6f62eb51d1750497dbf89b54afcec5d.npy +04090263-874cc0d822e74148b88eabc621107e4c.npy +03467517-8d35e1d412f3715469da8e7f9a803d12.npy +02691156-6a868213168421c6f0985368fed75674.npy +03325088-aeb9d0a78ee06f6e2b3e9b6eb52d35df.npy +04379243-c5fc6c1e0d446d37acce1c6e70b58979.npy +02871439-af326bfd00ac8edda9d79518470babf0.npy +03636649-3766b272cd3836cf28699debac30ad6.npy +03624134-5d3549571f699f8dcbac9c2913bca39.npy +02933112-5f7b88ac9256976cc59350d819542ec7.npy +02871439-a98efeb82eabc760defc4117d86acef0.npy +02924116-56767c32a4f01e2c83b8b9c448a35518.npy +02933112-3649b02bd61a337321730ef9c9d28bd1.npy +04379243-cafca523ae3653502454f22008de5a3e.npy +02958343-dbe713c83afe559316abce8cb03e7794.npy +03467517-9142906d08f5608e8f5758ba0b9a4200.npy +03624134-ca5e9779bed60ea8c6c26a6a38f12bff.npy +04379243-86a955d448e4dc0c3ba9e53316119012.npy +03001627-f859a1ed07d088be920de219c00d1c3b.npy +02958343-596bbe4864580ded5833b7f8c91b5b48.npy +03624134-7238d0009faeacb5fd770de1635caa0.npy +03991062-c313946af426bcc7368b14e48c164a6e.npy +04256520-611f5a21a6f9ad3d7635d2483a62c61e.npy +03001627-1ab4c6ef68073113cf004563556ddb36.npy +03001627-c747e6ceb1a6faaa3074f48b99186254.npy +02924116-9db400a7d654016f52470de2774d6099.npy +02958343-af814b4b43fd826a3a0daf3e5400b95c.npy +02958343-f9e91a22776f3d8be9415adaaf77fdbf.npy +03337140-97149625367ac1444c3aee8e9d3a6ffa.npy +04468005-ac3d0b9db6e5c9c29954eae9164faecb.npy +03001627-22ae801d650a1e3d492d9da2668ec34c.npy +03001627-b56829d48d66fd0bf368f5bd754a08c3.npy +03001627-f23ecf3348299cf743e99e0cae970928.npy +03001627-efafddc93951b8fdc975d461b3f97726.npy +04256520-a9bfb70669bd7f37757a6361b10ec08.npy +04379243-e97156fd53e88e27be2d01aee0780473.npy +02808440-782e16fb84e867632a3ca6620448176.npy +03467517-efa4ceed4d7b25fbce1c7d24654787eb.npy +02958343-47638c9573ee7ba3d8a1849b0098a5e7.npy +02828884-838c48b41d513a2dd0992406ba4944f5.npy +02691156-545cadae487b55bbc46ba5100bcdc520.npy +03001627-7a2d21eddb89c8242058afcc28d23393.npy +04379243-e679dae35e8ccd9acd2220e987e57553.npy +02958343-7c44aa72f314ee8e634b31c394824611.npy +04090263-7edd1e50920e559e0befc0b4697d414.npy +04090263-72e4958882980380e1f2a1daf140ac9f.npy +04379243-9ad91992184e2b3e283b00891f680579.npy +02691156-6bc51a88f3c58469b00421d9df4746fa.npy +04379243-f8c0c4f713f0c136e9048ab4301b0c63.npy +03636649-23eaba9bdd51a5b0dfe9cab879fd37e8.npy +02933112-50f0ea68b77810121fbac718728a36d.npy +03085013-44ed926c35d42e38b20f6e48f6a30cbf.npy +03001627-be1ac2a0b4c75bb9940806ade53ef2f.npy +03001627-bb296502226ae23475becd8a4c3f1866.npy +02828884-a28d0dbb90413692d42b9650f19dd425.npy +03691459-4cd3259a06b904a36a6d1e86c6266511.npy +03761084-f26c8ade290b82c7843e991acd39f432.npy +02958343-17c32e15723ed6e0cd0bf4a0e76b8df5.npy +03691459-16e3c79113685e52203eacdbee49fa8e.npy +03001627-37ba94e29b7d21ee41fbc1e2da054acb.npy +02958343-4dbf4e0654d0c234e811106a82796d20.npy +02958343-11b09de6631b3b3ad997cda1a938a10d.npy +02691156-3f69370401d4dc9a275386e1d3ac388e.npy +02958343-1c6591c3fc686bf24132f89b3e69f40f.npy +03691459-4d698b1e935897905e97b1b6281b6b04.npy +02808440-1f026dc37ca7c7b26b448b8aaebb705c.npy +02691156-bff6cee515cdefa8a5effc03faf54012.npy +02958343-e3d7957c7a9b95382e877e82c90c24d.npy +02691156-50e793fe39e527b245f31985fc702c6e.npy +03691459-f14ddd757b128a96b2b304a0ae97620c.npy +04379243-7c59421abd239c358b069fa6e7378ac2.npy +03691459-c75c5ae81c1fd498c066b9622c005c53.npy +04379243-1a153612bcdab3e23cc149415a408229.npy +03691459-88eefee684586cd3fd56d9106430c3fe.npy +04379243-306f10749606ec9355f46d55537192b6.npy +03001627-397a5fd0a95a17e4dd2be59fe725394a.npy +04256520-1af8bfa4eda36bd697c597ba4db02ec7.npy +02958343-8f8bd59f17f122a163739f01ec1d22b0.npy +03325088-11cae04ea5d825693321831d2245cf06.npy +03691459-ab478f6a1f38a5d18a0181490cb73cbc.npy +03593526-c7e207bcb48a699fd0a0c43e4971be14.npy +02958343-2076be423fa5bb9f9e908ecb03b3d6fb.npy +04090263-2f4d62df133d15ca5874d5106201fb13.npy +04379243-f39401db6cc45a3ae3e15116d1de599a.npy +04256520-e708bde6a2ffa4cd1ed1d681aa8388f6.npy +04379243-b8261a2db6b6525f490ad276cd2af3a4.npy +03001627-2bf69f0fa5be4c3f6ecea8cff53afe1a.npy +03211117-800ca9956f66a22a23d94393165a64e3.npy +02691156-7488f87b1e08bbabd00d52e62bf14ee9.npy +03636649-d460bf2dd59883f44e1a714ee619465a.npy +03636649-2a762ba822eef5fe5c7e2f94d3f5eaa7.npy +04379243-f220f4b4c7b79d7ab54f2a7bd7b06a98.npy +04379243-1b739cf713702b2146f41dc2aaef556b.npy +04379243-3cad8d726389e5dca5e91f4d594e20e6.npy +04256520-36cf45005b263014917b96045c9b6dea.npy +04379243-1652817da2b9193bc3bd24f986301745.npy +02958343-9dee0ea5da388102e6d91d458fe44a15.npy +03001627-ecd46956b35523fd492d9da2668ec34c.npy +02992529-98eb601db13d2a99611f4167fca99b42.npy +04530566-3176313945e3739e10508e1f7e97aa01.npy +02828884-be7408f8b03d491145004a22a9d35958.npy +04379243-e157aa6411d02cb16f1e631ee7d027b9.npy +03001627-3d5c94f748861bcf6038f78d0f44e587.npy +04530566-c00cee4431f3c2db89d39b85991ba25a.npy +02818832-19de1e83fbe292f55a2aa419fded589d.npy +02992529-f2db6829e0c0298140d50eb4da376b1d.npy +02933112-69932a9f53ce20bbe4e346ee2650d150.npy +04530566-f531f4b2ca36d626e18dd06c1afbc426.npy +04090263-27fc4679ae16edc887ecee1779f8c08.npy +04401088-df23ff3151aa1f0a3cb2f20e21cb06ff.npy +03593526-763474ce228585bf687ad2cd85bde80a.npy +03636649-e926dd7cf6831f9afcb8d8c6d4df8143.npy +03207941-a377f5af14ac6710a168e247bb97e471.npy +02691156-c3bd5ab4d3ac6a5a5c351e299b24e355.npy +03001627-caa330f85a6d6db7a17ae19fa77775ff.npy +04530566-5fd55e301007884c742bc8027e4951ae.npy +03001627-b6985891e45b998e7181375a1be1d1c9.npy +03001627-6d7a7f4660e49fd130cbbda41991e4d0.npy +03001627-c6e46dc0afd8b9fdd722b8781cb9911.npy +03001627-404bfa75a054791920e791c9b6d759b2.npy +02691156-bd698089021a4a58e23abb9b807b4cb1.npy +03636649-9627da26edc003e7d49b2e04785f8492.npy +02933112-576170f154143ff2de421c2ab5cfb52.npy +04379243-10ed64b4c7eb6d9311ee7ca4f000feba.npy +02933112-10b54fe832a00c3ec59350d819542ec7.npy +03636649-947c6753d77d8082290e2f84c414e6be.npy +03325088-1501500852a5295db229726a165222c0.npy +04090263-b9b9eb89bea6ce2fbeef84a1ff2df7f.npy +03636649-fe200902555dd8c89f2349486c570dd4.npy +03467517-4064b0ee5430ec6baef45fef9b6cadb4.npy +03467517-ea201ccc779eb93843a90475d48649b3.npy +04379243-ab5dbe7338e842e36f7826c82fdc3f35.npy +03691459-8e25a8e0de9ff545bf1411bc6f3b308.npy +03691459-2e0fc1bc430c5c1bdfdc04b8b8434e84.npy +02958343-c16bafa65123cddfce29c905218d4398.npy +04379243-ba44082e55ea58f431475fd256bf1b7a.npy +03948459-c16e5ae5e9f4af295c288fb30cd9ee47.npy +02933112-b8880afd2b1038c8ea7cdfccad65e7e9.npy +04379243-ea60054e04139d95b90b5e5b769a3ec0.npy +04379243-67b9c88c4f75cd1e886a7d82f0a2cb9.npy +04530566-722b68d90bc3955d2e5eb68672f87e15.npy +02828884-9bb6f0077f91c613f155d75bbf62b80.npy +04090263-e53f8481983564828ef0c1f0d9cc8b8.npy +02808440-81aab72890c8cc3a64c8c924c4738650.npy +04379243-9792d6d50c07e27627992812a922e94a.npy +02828884-27267209ed320cd271cf429728b349ba.npy +02691156-a85dbb5bb889881419bf80b167cee3a3.npy +03797390-48e260a614c0fd4434a8988fdcee4fde.npy +02958343-385d82108ff7ee1be2720e351c87b6fe.npy +04330267-3aa97b75ff79a0594d1cd794fadc7ced.npy +03790512-766002ed9dc8556d390c1a9993716e73.npy +04379243-1e57738f60665b1a908caac6d5f8ca97.npy +04379243-9dd80e356880c9deaf268f6180933aa3.npy +03211117-62ac1e4559205e24f9702e673573a443.npy +02924116-393575fc4533b0e8fd116a83fba6ae75.npy +04379243-575beb82bd20f61fad5067eac75a07f7.npy +02958343-beedf39c8f5709bea9fe1734a6086750.npy +03001627-c2076591d588586719fb4103277a6b93.npy +02691156-be5d2c935a36894c92cea77f96988ae6.npy +04090263-4a0f1b426cea6f13fb41747dcf822261.npy +04256520-83410e32b49b4f9957aa81cfc66d7b2f.npy +02691156-130d3f27fb083eebc0909d98a1ff2b4.npy +02691156-d4aec2680be68c813a116bc3efac4e3b.npy +04379243-b1117a83ebf5a4c9c337a931444a5063.npy +03636649-7a892d6b3951124cf004563556ddb36.npy +02691156-46dcd7b89d67cc41a1398b9e7da33687.npy +02933112-ac8cdb6289d3d446c59350d819542ec7.npy +04090263-be70ada7701ea798a8d379aabc8e63ca.npy +04379243-3bf8b96b10519a984afda4ff857119a2.npy +04401088-cd74be6a1d8a6cc721844676433a0aca.npy +03001627-eafec1b145972dcd815b2b467e8e2eac.npy +02876657-47ede0c10e36fe309029fc9335eeb05c.npy +02828884-f8aa82e7e4c58ce29d31c5ce17cce95d.npy +03001627-d221f07c0921e4d2b9576c1fc1b047de.npy +04401088-58ece48e59781da1fd0a2086d631b6a0.npy +04090263-e8bce069e560a97f310bbd45bf9024da.npy +04090263-f5472d552004345b51cfdb4c9f126c12.npy +02958343-20a967d68b6d291512da0dbf3c68e847.npy +04401088-922380f231a342cf388f6c7a9d3e1552.npy +04379243-718679874bec63183c9bc0d98cd0376e.npy +04379243-a91ee72daa437343d1f4e3beb8257c5a.npy +04379243-1248597ca22fa1e71332a40d0134407.npy +04379243-3ca6199c8adacd4d30bbd4cddd04c77b.npy +03593526-37b06eeb82c1a486835e59296200e86.npy +02958343-99dd952f49606ba01669695e4df59de.npy +04256520-5f50ec09722ee31fbcd054bcf140e51.npy +03001627-e39308cd84103a47f4b6538438a0b930.npy +04379243-b598794290077d8cfbbc7c456d85ce59.npy +02747177-7d47e79aaef3b1482056b4bd5d870b47.npy +02808440-8e1de9c946615fbc6f893b5bc716a3fa.npy +03636649-6e43d4b4829b66d06fa63795f94c4d8c.npy +03593526-281530bc7fbb122f30612f5c0ef21eb8.npy +02871439-e9c50ead4efa013bd42b9650f19dd425.npy +02958343-637a26dc6b1a3f47e7540f431cab4686.npy +02958343-eaeabed4e984364868ebd0cfefbb61e9.npy +03467517-78a978e7e34a751c69b43b9b42712589.npy +03001627-2ac24756c1adbd62c1a25f36f85c3fd6.npy +03513137-956fc471237a3e55613792009f64ab4d.npy +02933112-61d42e7c7c16b2d53334fb6668ccd834.npy +03636649-7bc1b202ebf000625949e084b65603cf.npy +03691459-ddfa1daa59d5bf2676c2a9de5c96f76.npy +03001627-a007a3cd5b8ca7fb19fb4103277a6b93.npy +02876657-bf7ecd80f7c419feca972daa503b3095.npy +03624134-dac1fc01fb44b2b9cb7078d644842b01.npy +02828884-dd9d0cfda54dfc30eda82e072f128485.npy +04379243-4f2eab1aa639ecdc6b17bdafaf39f370.npy +03001627-8eceb15a3c79b1b8719d8721fec72f0c.npy +03636649-26f0f37f0f2623c4a3fa46ae73c48b4.npy +04256520-ab350e81ff71034434895070e6a9b93.npy +04401088-98eb601db13d2a99611f4167fca99b42.npy +03759954-da951dbb3c6ffb3a6c22bf2209f4782.npy +03691459-fd4b2e3a6caf4706a817854e3b5b5439.npy +03001627-7ab99231f6a6cc282ca32e2623a35d99.npy +03691459-32cf86c686fe9b1974828baacbf242e3.npy +04256520-aa21824de23b516995c7d6b48c371712.npy +03337140-2e2704de75c84d3d6f1e07a56c129dfc.npy +04090263-b095a80476a8e002bb9224760a70fece.npy +04530566-9ea44b515bef76f3faeafe37c2ce4f6.npy +02818832-47f5f16fe3f346aa67a76d084b67db2.npy +02958343-6aef84dbaa69dfd8becf71e2e014ff6f.npy +04256520-4353b992d238cff0cda85f6a3e19b0a1.npy +03624134-d04de9ffdb1f36c1deef0cfd16bc41f6.npy +02958343-a52f704da0d3c947ca92a4cdad802b45.npy +04256520-874bfe0bc817ac827571d17c374fac42.npy +03001627-3a40eb7b9122bbfe2f066782346a992.npy +03001627-a86c5179fc3f7ae114038d588fd1342f.npy +04554684-36594769b62b24d63b1e413ac12356ae.npy +02958343-93f298a78be6883916abce8cb03e7794.npy +02691156-a224182f76e4a44fe1a65cde8802138c.npy +03001627-cc30a723aeba69a139e0f39f5249b0ba.npy +02958343-4dca3760ae9748b6b0aa56928723eca5.npy +03001627-d581539aa6d5c2ec7709fbdff3d15bf9.npy +03636649-6f422c48a60cda58472cd9d4266add0f.npy +04379243-a275f4b42b430eaf320f10afdfbaa18.npy +04379243-e699d5904e00a6ab748c0b14b00bc019.npy +02691156-85cf5445f44a49f5cf35fd096a07bc43.npy +04225987-2085eac3fc071dd47292d1029e5a9853.npy +03636649-3101d2b22e21297ccff8db9efabb6c62.npy +03001627-7e8b24aab1f2681e595557081060d0b.npy +04090263-36d3338314e3db7cf6099a039722df68.npy +04379243-4c20048e9066d768b7490c34ba5d2779.npy +02933112-2af2279b9331aa9916c6f599d5622764.npy +04090263-c7b8d834209413393110fbb3943dde1e.npy +03046257-425e82131e7a8db3bde2b05b8fa4f117.npy +04379243-1797eec0a23dcb1dff29be004a6f7c0a.npy +03001627-c15a1da769c1ffc5be1649add3e36e21.npy +02876657-776502db6e2e680e5e4f0d37557f3953.npy +03636649-270ec239221938991735ea0e092a805a.npy +03001627-3a16d7535d87d441d772e458a8f80cd2.npy +03790512-8032295bd3851d75468bac13e007a6e9.npy +04090263-e325afe389a39f49e641d7676ac20451.npy +03636649-f111f0e0c6c3434f30f6e0ede20c4525.npy +03948459-5e7afb318ff701583018d2d3c13a7462.npy +02958343-2999f005f1eba724bda733a39f84326d.npy +04379243-7cd4844def36a9f5bc7589eefbdbc3c5.npy +02828884-54f33a7cb3621d5ced98cca8f0ccd5f7.npy +03001627-ece1a921c1bfd44947f5e245ee376525.npy +03001627-594d1220c2c6df41b04bab4867aadedc.npy +02946921-b1980d6743b7a98c12a47018402419a2.npy +03001627-1ff1912cc74a76c3b2152dcc3ff6a477.npy +03636649-802c287eacfbcba9564b8e0b814c602e.npy +04256520-c136abd9c245ed8819c798cfc4624378.npy +02958343-f9eaaf5abb238c22851f021b9ed69c58.npy +03636649-57b95c1122beac7c3fef86d7b5969363.npy +03046257-c65500930362e3b925bae8352085782c.npy +04090263-8894650164a2222b1a857c47fd0ecdc3.npy +03691459-53d6d8e3e4731b3bc0b5947ffe18a468.npy +04256520-d4704c12862c808b593ebeeedbff73b.npy +03001627-b1d9c55bd4e8ded1c76575d5e6d323f2.npy +03513137-a1357ff99c759de448d4a59eba9f268c.npy +04379243-fb097cffc3cdd8512027cee422df2aa3.npy +04225987-d7045c95ab319b711082f2ea630bf69e.npy +04090263-179764bc36fa4246fbf44f447f38c175.npy +03636649-a0e1732661667683664b3b9b23ddfcbc.npy +03636649-c7aadb7ac29ac778aaae3d020f5ddf8.npy +02992529-44ce10ddb982c8ff72152988eac576ab.npy +02691156-2f379576475cfba24c3a35cee92bb95b.npy +02924116-7cbd178243b93689be4604cdb22fb3e0.npy +02933112-975426b49f98bc1b4c62bee40dcdc539.npy +02946921-4a6ba57aa2b47dfade1831cbcbd278d4.npy +03467517-3cc9bf3137c4776957e2b466f0c765d7.npy +02691156-8b59ed9a391c86cdb4910ab5b756f3ae.npy +04379243-aaf3aeda0f848344b87028a4b477349f.npy +03467517-ebf7994fd17b6331c64d0082475b0472.npy +02691156-eb110db9bdd0463e5b7003ff580606fa.npy +03001627-909244db9219fb7c5bb4f4519002140.npy +02958343-30045ee0751d6ee88b3ab49d2e0e41ab.npy +04379243-2fc468b98c0cd227c8830fa1ef6e3e71.npy +02992529-8270c952b147d263b9746cb9e2b9d08.npy +02828884-873ce9c208428fd5ed98cca8f0ccd5f7.npy +02958343-b098f1db2f190a71d61b6a34f3fd808c.npy +03636649-1e9b2d5d65a8b7c29fe8663d47f73813.npy +04330267-f73ae0a40649c7b950c862b58109065.npy +03761084-c3bb5f3c842a6c2d178e7d331e641179.npy +03691459-3aa8876d86cf481d3fd2d4d929afab9.npy +04256520-6ed6b121918d8f3531ae8c8ff1eb3d45.npy +04379243-b905d2f688f56afff4b6538438a0b930.npy +04530566-8687ac78ffaa38584de203ef6842ee61.npy +02828884-59b1ca3d780ed0381560641bf48464ff.npy +02933112-b4da5084ae0237fca4ab444e58fa9bdc.npy +03991062-1c12e50abd02d26d25ebd1cd0b422e32.npy +02958343-840f98dcf50b48f9a7fd25564c2e888e.npy +02808440-c075ed9936aefd1151f7fdc9a9600159.npy +02691156-452c18f8997c53741adbb4c4e06ad649.npy +03636649-6cb3a2872d2c2646fcb8d8c6d4df8143.npy +02828884-92f20bc7a09dfc1d19420b7669e7265.npy +03001627-379f2db4f028cd7925e847faed0661b.npy +02992529-c70daedaade33fd0fb24e6a63c26ad2d.npy +03001627-665511c6bccac090492d9da2668ec34c.npy +04379243-cb214fef007a2a46bed1bd9593e318c.npy +03001627-6bd633162adccd29c3bd24f986301745.npy +03001627-ea77c800bba6566aaf7c7ad2549a1b15.npy +02992529-22fc328d136756361e5d846d206adf3d.npy +02958343-16ba461c0d7c8435dd141480e2c154d3.npy +03691459-199ce49a7db017107a964f742d0e5820.npy +02691156-2b20176a59621b35497add46ccd9d60.npy +04379243-176e3b32d749ac94d79f2fc0b8d8ffad.npy +03211117-95d82c761a54684db3690a118770a184.npy +04530566-f678356e3e61872a28730ed49126392b.npy +04379243-5668d49d776c954c5963245f0923337f.npy +02958343-79b99595059c53108540dd23f35aa602.npy +03001627-1f571e244384bca736b0f2a1430e993a.npy +04256520-fe63ff3ee440cbe2cbc66df5fc1969c2.npy +02992529-1d390d2560fc259336eb9fe355d50fdf.npy +02958343-4eb5ec5502561124875fb780d36841f.npy +02933112-9b2759851023fad7dedad3eee47fd556.npy +04530566-67e41dd24b6902da49f471d054f6b528.npy +04379243-ab529bd91a158a53851911ab8e53bed.npy +02828884-84aa911799cd87b4ad5067eac75a07f7.npy +04256520-5af36cc3a98642019fb4103277a6b93.npy +04379243-889f48aa85accd2ee73947fdf756a329.npy +04379243-51f0461221d5a86370d2e38b8c410c62.npy +03337140-b6e067ad1812af03492d9da2668ec34c.npy +02843684-bf698ee440b6de7ca7667c99d0d11d68.npy +04256520-a89e0f5b5a8157afb0aea9d5db2857a9.npy +02828884-8b682ef98315c3be21349c674433e602.npy +03467517-ecb17b6917ba033bc39f53b4a75f9475.npy +03991062-7a70cb897ca6c3e1436455e65b78c0e3.npy +04530566-5e1c4ca986d216866554a94f24190b8a.npy +02828884-2a9ad7f4e7ab564a5be2d177e843be47.npy +02876657-8cd9b10f611ac28e866a1445c8fba9da.npy +02691156-105f7f51e4140ee4b6b87e72ead132ed.npy +02924116-920a7d45cf2455f0616d27151166e25f.npy +03593526-9195960e68825d41156d1d06c447a736.npy +02992529-9cedde0b189fc03824ec4b72ec33390e.npy +04379243-cd91028b64fbfac2733464f54a85f798.npy +04379243-39a71631941673b1c287a33ab134ac42.npy +04379243-47cb4740e2e0cb8d11bf24e88933ed8f.npy +03001627-fd726084724adeea492d9da2668ec34c.npy +03691459-3a4950ac89429ff5b396c6d231dec74d.npy +02691156-1b626fd06226b600adcbeb54f3d014e9.npy +03325088-427cdfd5eba597ba14b35a7d7cea7130.npy +04090263-a5b6e717194781776559a92f80e3672e.npy +03642806-decbfc069b08016d6ac2773342338507.npy +04330267-3139001aa8148559bc3e724ff85e2d1b.npy +02691156-646b93aecb7b7011a9b2becd26dc2fc1.npy +03513137-a8e04b323931f2b9f2c6c460ab16f409.npy +02808440-b0cf9853f86d85c062c5411db2c28360.npy +03001627-9ee1b4fd18b040bb5445e46058840642.npy +02691156-53c7a6b56afb63807222da102ac36d2b.npy +03001627-965f9b75de94d03aff74317afae0a323.npy +02691156-8d5ecf095e56cf8cca8607f540cc62ba.npy +03636649-f392dbd90200bd7dc77f357adbe5c980.npy +04256520-125ace480d9f2fd5369e32fb818f337.npy +02924116-1821df0ce1bf2cea52470de2774d6099.npy +04379243-f116ba8983e6728eb1f243bab39fb29.npy +04090263-a7cf230b5a2967125f5038a2cf78b1e4.npy +02933112-743366dfb72897be1ba9fd11dc8bf457.npy +02933112-7d95374a9110157c7d8c689e1315827b.npy +02871439-1170df5b9512c1d92f6bce2b7e6c12b7.npy +03046257-58945eca103891f4887f087750df94d2.npy +03624134-d23341ca5eb721abefafd451049df010.npy +02691156-5bdef9dfed852e26195688f8ce8acdb7.npy +04379243-a9d890e4b6b426dd358ffaf8d4d252a.npy +02691156-e805624480f632ebcc14f1e6f4f4f49b.npy +02992529-b140bdd32b0287a64a21fc95f845c2fa.npy +02992529-27b4f430b881e16ad6339cac3214b6bf.npy +02691156-99e1961a72bb8ac46177b6d1ecbf989.npy +03001627-7720c68121497e555a28000e191ea2c9.npy +02992529-36760a27d679f058c4a0b6f738c144f4.npy +03624134-77c55aef23f91604a4a0a1e78d057db4.npy +04379243-d22e15286d0d99ec52d2de7b04447df3.npy +03624134-c116fc1447fa496ac1cc4ae0ecf50bf4.npy +04379243-9d73e1a51a56683bb65b71636c46ae49.npy +04256520-5a8adf52078b5008490ad276cd2af3a4.npy +02691156-bd298d2907400418df8fc3a07f996293.npy +03761084-6dad0112ef18439cb7add4de9f6e92e1.npy +04468005-f646c4c40c7f16ae4afcfe0b72eeffb5.npy +02958343-7fb5dcec8e6745554ddfff13f461e46e.npy +04256520-7461a53eae4126a79fcf47c4eee9d700.npy +03001627-5b51df75df88c639f51f77a6d7299806.npy +04379243-90343e416528b576f41d9ea5f63b1b05.npy +04530566-498773c5047c01b35fa1a6e8897313f4.npy +02958343-f10e32c6daaf237f13ded1857c15b5b6.npy +03001627-d868b5e696c362b9ae23680cee12f145.npy +02876657-81b2ce7d719326c8fd54367fe37b16.npy +03001627-bfe54fe90c7d99637fffc92abe94e907.npy +02876657-1d4093ad2dfad9df24be2e4f911ee4af.npy +04379243-33ef80eb8ebf4207fe7e23d061690240.npy +03046257-772008d5e703c4564b3c42e318f3affc.npy +02808440-7b440b188067638a44221bef0fa3c36b.npy +04468005-4682b77b2f9de0b942a772abcd2e8eed.npy +04379243-38ec61e847b8ec152864bfffd12f80b5.npy +04379243-63de5ec054b2d310dddd8ce1cda8c6d9.npy +03001627-a93853bdb9b378dd50c2ec40da48fd9d.npy +03593526-9b93492086316fdc61c8cbc38c089792.npy +02828884-7c49749ab1fa402a2056b4bd5d870b47.npy +04379243-e8288b5f567569f19fb4103277a6b93.npy +02691156-337658edebb67c301ce9f50324082ee4.npy +02691156-fbc7afa847c30a4c183bb3a05fac486f.npy +03624134-2743e37a65e198d51592d7a04a86fa53.npy +04379243-a4af8f822fa8d95456c08464b83f209e.npy +03001627-9841030f427150567dbe6b236c44c533.npy +02691156-77f5111d348bf051368d7e7849f8df62.npy +04530566-6cea89128bc0b5e83b9f2b6367bac7ce.npy +03636649-dac278ab197b5efefaa6996ece0d86f4.npy +03001627-268e15d6c73f3495f2c6f9bb81f9e3f6.npy +03001627-f23d3a85baabd7ae32d9baba75737e72.npy +02691156-f277fd1032f615ec2268dda5c324173f.npy +03001627-4afe3d1ef68515bdd6a6b5838ef6b356.npy +03636649-292ba732e002629e68c2f5eb1dd4dfaa.npy +03325088-6e1051dae8109411b362845c6edb57fc.npy +03001627-c6811f115d89758f46fb9c38320df24e.npy +02933112-819a1fd8c7bea7f3984cd513e00e13ae.npy +04379243-2f58b1ca8634a6b48b9b51ae4415d5aa.npy +02691156-ed57671fc0252e15b95e9a91dc6bad16.npy +02828884-459f90aa2162b1f1d46c340938e2ff1c.npy +03325088-b58fbcabbdf942515e861292bc046f7f.npy +03691459-cefb560ac4ca8b38a046bbac53886364.npy +04256520-189e64b308b4345d291d421ca3746ae2.npy +03790512-a3dfeae5bced3533b37378f3c85478b4.npy +03467517-c084022f2ddbf95493f0194265a9746c.npy +04004475-bad6374187a626722d24866ea0018e08.npy +02958343-34b507c24d9eab7f7eaeab1f0c9120b7.npy +02958343-c907a6cb1b178999c805dfe4ca9f2fdb.npy +04379243-5771840ae9ab5a334a3ececf7e04ebcc.npy +03624134-a73a2d9584b2cbc81395331ebe4786cd.npy +03001627-c6bdf057e1a5e900548360e92af6377.npy +04460130-70ea9d97de7de827221d54273fff89cf.npy +03001627-e54417646ad16604738a251b334366e.npy +03467517-c980271f356c3e9b605c81d3188a5b83.npy +03001627-c89a9a38e300cb502c10b2c975aee2eb.npy +03636649-3638d46a41870173713decb1a0563b12.npy +03001627-77f1880f07fc9805ce5f623508bcaa7e.npy +02933112-1e95c521f70972a2f5758e5628273c4e.npy +04256520-21addfde981f0e3445c6cb69e0968783.npy +04379243-52037005fbff92d08fa35606145b47dc.npy +02828884-5f21d3b66aa9b62d63b2acb037dfbcde.npy +03991062-5d2e2e8f2cd99c4b2d7a27ffaafaaddb.npy +04379243-e9871fd4c45b34148737eef0436997.npy +03691459-b44a0f8900edef4c957a55139a8e936e.npy +02691156-4561def0c651631122309ea5a3ab0f04.npy +02828884-2f34980683df2b47ad5067eac75a07f7.npy +04379243-c2c4846106b3597ce76bc197b3a3ffc0.npy +02933112-d4a7b45abac7a39c59350d819542ec7.npy +02691156-728d58b27cd53a16c93b40751084c22.npy +03759954-51f167b8049ae3362735b4cb5e9f26a4.npy +04256520-5a94cc0c277f391df9aec59741c69cf7.npy +04379243-6e16dc2baf237aeb5b87cb2d9a815c73.npy +02876657-d655a217ad7d8974ce60bdf271ddc452.npy +04530566-8fe646e75e9b99bbb58435942a1b4dac.npy +02691156-b2ae4acd6774f410833bb0b457d51a52.npy +03001627-a543f7e8114b19cd5397d07b571cbcb.npy +02958343-3ff887eaebf0bc7e9d2b99af43da16b3.npy +04256520-fbf0c4f6a483bc15ab7a3d3a1341aba.npy +04379243-5b719bcb32b8f291f16681d085170878.npy +04225987-c0280aaad5473e8398c63cb68f11df34.npy +04379243-c0401853da58a1b7beedb4c8fd29e2d1.npy +04379243-42fad469afab19939724db0ba5853d76.npy +04379243-760b1ea228d6c2f6e785b88cc9024b2a.npy +03001627-8c8efbe62a1547942b90a0fb76278f6f.npy +02691156-1df217928b39b927a8cba409c4409ba9.npy +04256520-40956fd98a04f34914038d588fd1342f.npy +04401088-64b6ddb847da082d761eb63018291094.npy +03467517-763905ae00b39589c445f4f26253ff9b.npy +02808440-dd60bfd98b869d96b5e423033398ff30.npy +03001627-a6420c4ed13cf628945a77b945b7b70f.npy +03325088-45fd2fd02e27bbb53321831d2245cf06.npy +04379243-6afec996cdd847031638d1ffbbaa0c53.npy +03593526-58c9d6575d62fbaf12bc68f36f3bdd45.npy +02808440-2f6da348147cad9c3321831d2245cf06.npy +02958343-60458c0d233ccf9daa69dfdc5532bb13.npy +02691156-9e75560008080a8529348d14ca881f7d.npy +03691459-5394ceacb131b5e79d7aee0f8e107545.npy +04379243-199881390e6ac3a89ccce4c6d5bb195f.npy +04379243-855c6cc99578afda6a5ef4b501708f3.npy +02828884-213e68b2abe5cf24bffe63c069324d61.npy +02801938-35bc440973661b91259e0fe12d9ec13d.npy +04460130-7635df079a9d126ff9c0f9cbb10e38a2.npy +03991062-12b90995b3054ea3a2c59a4d90e63212.npy +04256520-80d13b57aa31f79cef188758bf2e3a30.npy +04401088-8a62ea56cad1ea25430f38f25519fb5.npy +03001627-52e2b4be107a9d6495bea7c29e873d16.npy +04379243-e96bc1b7f02caf77eaf288f952624966.npy +03211117-a56c13025ec97af31ac04cb85e251041.npy +03325088-e08f50bf9a0b4776b362845c6edb57fc.npy +02958343-d79f66a4566ff981424db5a60837de26.npy +03001627-d987dc40c90907276bc601efa799c927.npy +03636649-409ff705d837b30ec3c3e425b20b4636.npy +04379243-3db6ff15d7ee52482db431502a680805.npy +02958343-d652c35de82c3f3141fd6622cb2ed89d.npy +02828884-9aafd6c69c331aef535e3a87e2212e35.npy +02828884-cdb6ceae0102632fffc6e457221b9271.npy +04401088-54bb14aad2406a124ce28f0f1b509eda.npy +03001627-f3249612d067e120384f43a3132c17b6.npy +04379243-9ffd670b6eb68ae8840e9c8d11bc8e80.npy +04379243-9b86da62c360aa0d824080f516909671.npy +04379243-2583fa4932ddfe741ec48bc3c478566d.npy +04379243-f4e0c7b0e402ac86e5a953fde71681c.npy +02747177-22fe449cf2cfd7981faebbdea6bd9be.npy +04256520-5e9a36c61649952f555740dfce3e4a45.npy +02691156-a7d29332d98b7b8340a4a448803b06f7.npy +04379243-c02d673e9b7658d52b70eac6546e93fd.npy +04090263-65b8974ca9c4d73e34c4a8f12da88608.npy +03001627-406561a447d3f7787f4096327f1fb3a7.npy +04379243-7a0b6685a30298fb8ae8d7de284e7d2.npy +04090263-add8dbf5ef758141e63959b7baa1103e.npy +02933112-71c2c44dd20ae153353a90f87b8ecab5.npy +02691156-27317e8e93190374780ee0648cf79a36.npy +03337140-aafd560ec2d1d4814c3aee8e9d3a6ffa.npy +04379243-ed8dd7ac0d865ac686f1a0f58f951001.npy +02876657-f49d6c4b75f695c44d34bdc365023cf4.npy +03991062-d7e77f60893f20c4a2c59a4d90e63212.npy +02933112-370608d5fd4f39745e7493df1bf8fac5.npy +03211117-31ef46873b20e53274e7ea1d002bf071.npy +04256520-cb311c253401e27165eff2c7075317a4.npy +02933112-5ec805e8599196746be771595eade0e3.npy +03642806-7b944e090c10969666aa414faa9189f1.npy +02828884-3a4ab482c4d344eb2fed5f7b90bc9e3c.npy +03211117-4812245f2f9fa2c953ed9ce120377769.npy +03211117-bafe343788f824bd372d432893cb48f8.npy +04256520-8fce754ab94cf3c0e07a1c4b84dfd325.npy +03261776-b5c4585baef4a036dae5edc5d34da94f.npy +02958343-7e7e5752ce2aebd46034a921cc85e098.npy +02691156-7b553eabcfe3709f3d2b6eee5a74cb08.npy +04090263-2a1f207a0273683c9f433921788191f3.npy +02808440-ab3e7307f7e3a435863bb5f5739560b1.npy +04379243-722bd78d5f625018d27b31bdeb5f5c79.npy +04379243-e8ac113e9db33ac8cfdf2d08e1ba2a48.npy +02880940-34875f8448f98813a2c59a4d90e63212.npy +04401088-db059495c20c0e2e514ce6dee24d82db.npy +04401088-1b41282fb44f9bb28f6823689e03ea4.npy +03001627-a14880ecec87a82bf9b9977a2406713a.npy +04090263-9104e081cb7d92f0fb41747dcf822261.npy +04379243-e702f89ce87a0b6579368d1198f406e7.npy +04090263-b3bc8adb8349c958de423072102e0bc5.npy +04379243-5b0ca203bc4021a2cf9ca735ff10053c.npy +02691156-afa83b431ffe73a454eefcdc602d4520.npy +04530566-11766a7b1f86adf36bfc202176cd1f2c.npy +04256520-2c1c9fb6e940c636b1467c71658cc329.npy +04401088-eb1fa4d2a399d4c38334e57fff4eb77b.npy +03001627-665fc6411855306530221b1717636e3c.npy +04379243-7eabef19cb02a9e6aa29e9f0529e8ef7.npy +02691156-d83300deab42c100eb9db4e832a6dd82.npy +04379243-ed289e72b00480521fac473c90dd4a.npy +04530566-cc97fdf906ef08afc5646791c1cc7f13.npy +02958343-55785c5e30e293e03146b856dc99bd62.npy +03001627-81276e5b6c8871634af957103f4767ac.npy +03001627-89d62702b266b20a58a2d0ecf7ace1c2.npy +04256520-2f426679ff0345326e467bd7dd946c3c.npy +02808440-c37f254715a78571ae8be095e1557726.npy +04468005-f04e5f2911de028219508c299c767a7b.npy +03691459-607096f600b6b75620363e2561dd589a.npy +03691459-5533322e8dfb7d69efb0fe88d2924d2d.npy +02992529-c5188dbebddbad3597cfb99c9c9efbb5.npy +02992529-39359aaddcc4b761b0a79e28606cb167.npy +03001627-bb878313da4b02e3dbbc9440457e303e.npy +04256520-277231dcb7261ae4a9fe1734a6086750.npy +04379243-1c8d1cb23d037f2a9e4965f0106e00d9.npy +03001627-b58909919d9feea6976cd10355a74f40.npy +02828884-ddaa540f004e7889d2b12aa6a0f050b3.npy +02828884-abddca275435a7b987b6d520ce557b3f.npy +03001627-75716acbe4ace649854cb2d2b60c3da8.npy +04530566-5da69ec4bee76b21f3e39f2e17005efc.npy +04530566-9c92fb3f3a4fbe8cac932f3ba44b77b.npy +03325088-289c4f1b23b09836b362845c6edb57fc.npy +02933112-2f0fd2a5e181b82a4267f85fb94fa2e7.npy +04379243-efc01209cfa158eadbbc9440457e303e.npy +03593526-5b8b46006f36e9a741711e9e73e5d4ca.npy +03691459-d23b86065834982bdc99793862c889e0.npy +04256520-d71b806ed0d2108dc149927e19d9b07.npy +04379243-f49c7d43808b1033f91663a74ccd2338.npy +04256520-98e474a6bbaef456febad4f49b26ec52.npy +03624134-c1a44efab8a2616c44a16a1c9776e2ce.npy +02808440-20192aa7850b2ba35821ec2db55477c7.npy +02933112-23aeb8fdc0d1ed4c4da5feafe6f1c8fc.npy +03593526-9cf099a555d04ea1417700afcf470f3.npy +04379243-f7d17f8d80fd2eaaa62ee5d388bdaf2f.npy +04379243-777365e9179ef98cea4f74d1efed63c3.npy +04379243-58a0638f8bf4f0fb79414e04132a8bef.npy +03948459-d83cb380b72c7724d6794b7eeefabea.npy +02933112-87c85956b41a7fc541d86c17c15247b0.npy +03001627-48f0c9b02587b5a8ea0588dd0d874b1e.npy +03636649-bc5f2f93922aeb65fcb8d8c6d4df8143.npy +02808440-5132921c7ed221103af30a3946d92feb.npy +03001627-400a5dbd31db947b35836c728d324152.npy +03991062-186cd7542e540fc82b2a077db1b64e23.npy +04379243-74b8222078ba776c661673811de66400.npy +02691156-f337580024e8c36da5cec7cc83604181.npy +03991062-5f3a050002015f5bc323742ccd065ef4.npy +02958343-831a3689b2f48664473f10e6caaeca56.npy +02876657-57b186ba25a680584289430f919c490c.npy +04099429-b967f61b749b3d0578268642d8df40d1.npy +04379243-6b5f5a51340e371ea753e2e06c37201.npy +03001627-a54ac4580f151f89278d386bfa54545.npy +04401088-5a28460645d4a28c7fa29a3ea424473.npy +02958343-ca0f99974520bde12776450c3e3bf20a.npy +04530566-9b91a683da8c4781f990230c33049243.npy +02876657-43ad6585f6b9a64675e1008a71b1c5e9.npy +03636649-ea71ba1d8d8c8e5888a1de3dc61bfeef.npy +04379243-2d7c48df632589a7ad5067eac75a07f7.npy +03593526-b7f03dab9501bad647be29e6263b8b5e.npy +03001627-59ca6d57ddd091c26eda1c7568601317.npy +04530566-c15004cb38217b33af018ffb2ed4ff85.npy +02691156-911e9f0246b26b309f789b924eaffb62.npy +02924116-c099c763ee6e485052470de2774d6099.npy +04090263-f06a233c12b64a0ffa9286f039319ff7.npy +03513137-f2513143d0467e357af69fbb2f9a628a.npy +02958343-20b03fde0d55a99fbecf71e2e014ff6f.npy +02871439-d36a9b7716b47b90492d9da2668ec34c.npy +03636649-d36d4552fe1290ee90c2e24416edfe5b.npy +03001627-bb8fbbbb9925a376d1dcc55e36186e4e.npy +03001627-7fb75b03d3ccd58c4710269d4bc18736.npy +03001627-1e53d84e48bb7d25febad4f49b26ec52.npy +03467517-131f827521abed2548627a76b6268107.npy +04401088-d0b5b899929975558ee99126b119afe5.npy +04256520-f27962a9ea7a87a87140e995552e7616.npy +04379243-6913ad01e9b00c4ca6c03a53cf0a14c9.npy +02691156-77a1744ee3c37f9b6aa3bf023a2b42a5.npy +02691156-7ee2912263fa4bb36f14b7a660f4c864.npy +04379243-564474f25a4400c5dc20930e6fc85682.npy +03593526-f9346339a3b24bfc500158c23c4c5a8e.npy +04379243-fa89bec3cccc137b10eb3ebb0bbddbb0.npy +04379243-bd28567361a3541d97fb366fa4051f4b.npy +02691156-d6d84d05892a4f492e7c68eb5d1b9123.npy +02691156-f98964dc88c44a2c863ab010b80d9ed.npy +04401088-34d8c06ade78bee87e273378b31b6ba6.npy +04379243-6110ca3d6213d128c96f5ad2252495c6.npy +03001627-8763bc46c26ab19957b7bfa2b0e9620b.npy +02958343-f6906412622f5853413113c385698bb2.npy +03691459-9471b1f88cca01134c40f34de8f3bdb8.npy +04379243-6acba1cf4d21321a9ac279f421086f50.npy +04379243-25695002a51a61c38596fa5b590d746a.npy +02933112-5c306efe5d4409c31190e285a2cbc9c.npy +02691156-7790715d4bc226f8b569b36137d81c9b.npy +04090263-9a1bd54ed9acf1ae73ede6cad0df9fb6.npy +02933112-1175801334a9e410df3a1b0d597ce76e.npy +02691156-5cd14216765393f18b96ae1a0a8b84ec.npy +02958343-3e36e7b04fbd55a0f691b4bfa2a7ff4e.npy +04379243-622d66d9e598b7788e0faa4ef4033cfd.npy +04379243-a19e6780182c72cf9bf8bea04806ba15.npy +02933112-8c1cd3c09ffef7efc59350d819542ec7.npy +02958343-641e43fc49e754edbcfa8eb5a2d224d7.npy +02954340-373d717709b3e181bbda4bd2b976d8f7.npy +03211117-b68da827b6c8852ecd0f781bc45707bd.npy +04256520-21e930917f2cab28dd711af5650bdcf.npy +03001627-aa3e5b5828912c0b5d11e7d6920a72ce.npy +02871439-7f40e1a4fd8344228ab882e168bd8706.npy +03467517-1817e920fd92124fcc1908493f380315.npy +02924116-1aae0b0836cd03ab90b756c60eaa9646.npy +03001627-858e512945d4544644175b4dddf5be08.npy +02958343-4026bb045c2cfc669f4536d76626fb35.npy +04256520-469a61462432d5521625c754b61476d2.npy +03691459-65e35b8378bb62a3801d0b1c6eb274a4.npy +03710193-551fcbbeb0e75c3dc2c30a1e5c9027fe.npy +03636649-cd7bda99f9797d8b1878e92fa20d38a6.npy +04530566-4c8fa5d0d4b2c54644dbf20ba8545fd.npy +04468005-6ef9b372b0a3ddb7cb01c89ef4a63ff6.npy +04256520-b76e0d43ac0800366a035d0ca8a43948.npy +02958343-a08b151ac5254df184bf231ea6363fab.npy +02691156-f613ace665da5e3e8b96ae1a0a8b84ec.npy +03001627-a3ce9ba74ab50352e6fe3612af521500.npy +04379243-3e08106901d3c9157145387788e4fc89.npy +04256520-b95f97ba63ab989cacbf0573260a18d4.npy +04379243-234a106ec36821d8c9f016d57db96408.npy +03636649-48f878a6176591190c2e24416edfe5b.npy +03001627-e199b1f6a70c9f56df44d20a516c07b3.npy +03001627-c55077d0b8fd893fdc4d371eb87a65ca.npy +04379243-1ba43964b343f6b6ddad726b9e01fa69.npy +02992529-6cc44d39e099bb6b9ef9eb3ddb0818a.npy +03001627-511e6440fad9bfa81fc8b86678ea0c8b.npy +04401088-e55c20e95bf299b5fc4d1dd4278b31a5.npy +04330267-15e020e34e3d2bba60ddc468fe733ed1.npy +02958343-bbf01f037b55306f8c2fb4d10f176f65.npy +03636649-8edb515a3e77afc4a8737fcf23389014.npy +04256520-fadd7d8c94893136e4b1c2efb094888b.npy +04530566-4c6e4bc79308e23e480060a68009533d.npy +03001627-975ea4be01c7488611bc8e8361bc5303.npy +03001627-ub5d972a1-de16-4d0a-aa40-85cd3a69aa8a.npy +04530566-72f3510fb835c3557c0ab7347b9e831a.npy +03761084-31548a2ffbdeb4037b6fd5468f603b31.npy +03001627-2191f89e65241e7be04d00482f14a156.npy +03001627-561d50862a2cb4aabc19762eaa7ba40f.npy +04090263-9ebdd77ce251d68626243ac6fb5d9ad9.npy +03513137-20ef9affd966bb53727b087f26084eb.npy +02691156-48706d323b9041d5438a95791ca4064d.npy +02958343-13d0f68f32a86bdfe3857ce739e6606f.npy +04468005-59b884e12684b48b1b2cfb60d91b4238.npy +03001627-1da29597f89c2b004b3c42e318f3affc.npy +03691459-1b31f250deb7e124fae32a4a57dfb78.npy +03001627-7df2443e976658b7cdfc3ede082b8a07.npy +02958343-cdfe4dc408f4ca84aaafd94b9f216ef6.npy +03001627-17ab0917e215e4fcfd300048280f015a.npy +02828884-ae1adc589a37317b2056b4bd5d870b47.npy +02924116-131a94e966b7dd5dfb89738614af8f1a.npy +03928116-8c2565c3adfa691985d624cfcd9a37a7.npy +02808440-2a5d4962869b1c34c62bee40dcdc539.npy +04256520-916abea85193002adae12f3947d07dec.npy +04401088-75dce3b2e5152c01ead1b13838d77bb3.npy +02958343-e09c2528f56f04d03e241901f2025878.npy +03046257-64bb924549024c7cac26591069295f15.npy +03467517-1821a6d30c529af493b667ec2f48a310.npy +02958343-39cb477c0a03aa1c3ab1417a5ca1ff4.npy +04379243-6b43398bac2b6979438d8caa9ae106fa.npy +03790512-d3e1ee410274fe4036abd307db1ff816.npy +03001627-68c7f82dd1e1634d9338458f802f5ad7.npy +03001627-b1adda06d8846afcb96f0049223adf04.npy +04256520-a8f10f404b317af4946789884353d9f6.npy +03046257-8627319b3c0a9f4c90ce699a92b3fef9.npy +04379243-88c833a60e220f2320ccbe1c34ca182d.npy +03467517-22129fab1497437cc3f912172873d52f.npy +03636649-cc643d2e5b7a46f5809222e4341a7d65.npy +04256520-b2061e554db928f233442b36ae29e50f.npy +02958343-f15ba529063317d241b8aedea2034739.npy +03001627-bbe566c26d28ccfb504721639e19f609.npy +04256520-7f0d93163b0db7a71ebf17f9e9667427.npy +04256520-85293b59b0f9cc1e593ebeeedbff73b.npy +04379243-6949e65a18ca505298d5fc0473d00a1c.npy +04256520-fcdc852692f43041fdac1e69603928f.npy +03593526-a0569f8e769d087467964ba700cd97f5.npy +03691459-abbca9c2aa1ab018ad65e8e6cc8ad9b8.npy +02691156-6481eb70eb9a58cfb2bb87688c5d2f58.npy +03691459-2454758b9629441cf322c3e7acea58f1.npy +04379243-d5e003575739a8ce1bb088904f7cb154.npy +04401088-11f7613cae7d973fd7e59c29eb25f02f.npy +04379243-24c854eb3f4bdba21b17743c18fb63dc.npy +04379243-b16567c16d0aca41532e8683617554c4.npy +02808440-c9dfb7c152684e3f3321831d2245cf06.npy +02691156-253a1aead30731904c3a35cee92bb95b.npy +03001627-86e2424968b01e241b94efa300287e71.npy +02924116-dcfe09e01660f263dd49dbd3b1c588a7.npy +04090263-457cbd3f2a9a710c11f7dcbb4a32aee5.npy +04379243-f17e630571a76d4f4b8710a3469971b1.npy +04256520-1739665585ec210fb04cb542e2c50eb4.npy +04379243-8fd9d529453e8d56c09af5354c5cbf4e.npy +04090263-b151820ba72ad964fa9286f039319ff7.npy +04379243-6f03a6f024145fc9febad4f49b26ec52.npy +03636649-f449dd0eb25773925077539b37310c29.npy +03001627-e0efbc4e240b9cc235836c728d324152.npy +04401088-856d33d16a97605bc9164fb9f03dc1ac.npy +03337140-eb0913a3e196f517ce5d6e9371bb5c33.npy +02691156-7a1954799b5fbb438fc2d09ac4aa4e78.npy +02691156-edd9583988b62c90328f15e6c60d0e90.npy +02992529-1ecbb2ddeca087b5fd71b7a0b881ae82.npy +04554684-abaca4a16b203ccadf3a1b0d597ce76e.npy +03636649-9dd9e38efea22f529a60d6ab40898d.npy +02808440-a4b457c41180e0b9fe52ffd0e748a1ab.npy +03211117-8440ff1637f2c6d7ebe17c8dfb911d2c.npy +03325088-59f6a76767eb5fc72f8c68dc62edc38.npy +02691156-e033b6ad34586a86cc1c9e8218bfe7fc.npy +02691156-d221f607d5b5c553faac198e88c3dbb7.npy +02691156-265f5348ab2320b2148672750a1a335.npy +04379243-cde67434193a2a6f19fb4103277a6b93.npy +03991062-9f4e8476917af3a12271466eed05a4d3.npy +02958343-30f4617775480bcce27281f3b76d1f5.npy +04090263-b6feb20b14f9519ef933a612bb11b1b8.npy +02691156-a56143efe74ee89ebbf3143b1cb6076a.npy +02876657-3a6fae97b5fa5cbb3db8babb13da5441.npy +02933112-46e31ba5963a89fac59350d819542ec7.npy +02933112-dc4affd586bafbc8d45f502ecff9e44f.npy +03001627-94ef9a352eefe9455ac8254dd793f590.npy +02691156-4d50ff789e84e70e54eefcdc602d4520.npy +02924116-ab0921f71fda6e1bf446f92b52bbd82a.npy +04004475-d9a7f7d8d6358ab268e3172ee2027144.npy +03759954-f482692b2086e54e7ec3f7c14c03a92c.npy +02933112-4caef9af7bd31f195588a2543ef0b0b4.npy +03001627-64f03da6f61e5b99d858721c5f89c1b8.npy +02808440-90b6e958b359c1592ad490d4d7fae486.npy +03001627-c18fd0dd722d164f41bb00bd5475793.npy +04530566-ba05637e557909b19527abfa7ff95c0f.npy +03624134-acd9570aab1c4fd47e25b10df54e79de.npy +04379243-45d5801abb4affea5b411468d0e36e1e.npy +03593526-d68da52ed2de0e7bc5beea20858a99d5.npy +02958343-4493638824352150940e51eee9dd2409.npy +03759954-d823eac75f84b3bbf76111a8c1b3eccd.npy +03636649-89f8c456a55c3386157d629c9921fc15.npy +03001627-fdac1f9c0b030841c8687ff9b0b4e4ac.npy +03636649-9c6084d24011c791c8107db508bde472.npy +02828884-e14c754dab919df2ed647189c2f43b5f.npy +03636649-3ab9e4300cee0259f72e8839e840c146.npy +02808440-2f3d0058b843186180a744f96587254b.npy +02691156-3d5354863690ac7eca27bba175814d1.npy +04379243-d1fba8006e7f72bd7228984b9aa31321.npy +02933112-a07f3b931238a5c3fe618e12c7f65698.npy +02958343-600ab6a1f116a5ac994a3466f8481f8a.npy +03001627-19666f52289092a3394a3bbfc81460.npy +02871439-b276b63c40e9ef46534d1a2a7289d9a8.npy +02958343-94b52d2fb55004d5ab2c2809513f396e.npy +02773838-abba6df6294f20c569ea850160c0b35.npy +04530566-c55868566d2cd547d8d2db57c9e192a.npy +03001627-902a46f5caf6b1f7e38c7f0de498b8e5.npy +04530566-40752c807c2be827c924fc2f78f9cea0.npy +02958343-202fbaeffaf49f4b61c6c61410fc904b.npy +02691156-e00b89bc338348caa42c49797afd1f5c.npy +02691156-47d958a8a781144b132a08135eefe76d.npy +02924116-eebc54c82c116bdca8b9756f00ab956c.npy +03001627-38436cce91dfe9a340b2974a4bd47901.npy +04379243-3f2e9c14ab1d26a0ebead06af665220.npy +03593526-a95db9f4cb692657a09c6a60c6dc420.npy +02691156-ef6db5bcb6bb96ddd2f0cc036969ee4f.npy +04256520-b6049bcbc56eb65e2553cc33364504d5.npy +02958343-9e4380de95fea34a11718baa6d4afc0b.npy +02828884-a3e6d02075732ca850f9fc0e2c94dd76.npy +03001627-3c4a33481f45cebb81f5ac91b0c9e99b.npy +02933112-192caea21a57389265dbe89d2f371f01.npy +04256520-ea06841d7501d07436b31862e09495f2.npy +02958343-a17bdad065a0e008a2e48b029cec5d4b.npy +04090263-d601235af9b5e93e49f0e3dd7767881.npy +02691156-fd0262e95283727d7b02bf6205401969.npy +02958343-25de320e58cb3898f43db49cede9f847.npy +02958343-1bace29924c0ae42226fc3902f16303f.npy +03691459-ef793b2369c5dcd9bb63f7ad325b6424.npy +03636649-23c41f1c519c82202dccb0b1a2845fc.npy +03001627-3e8ad99691e8ea4c504721639e19f609.npy +04256520-d0b33818a29689a8ab5d9b3550c46460.npy +04379243-2db1f557e247ded7e907b6d9dc1d71b7.npy +04330267-df6e6a6405d121abf39d7554d3e63ae4.npy +03001627-e779cf261cf04a77acd8c40fddcf9ca.npy +02828884-6466c201a664851de7b89654b68b9e5b.npy +04379243-ad9adf7c2c45842ae7354dcb6082ee59.npy +04530566-5c116a0ca9477e44318f6eb5e296bb88.npy +02828884-52867aee1e2e137912a905e721b748f5.npy +04530566-3807ccfaad3716ec59d8a2cd36b3278.npy +02958343-570a9903fc7fa557d0a4f72b67c7f064.npy +04530566-6e1781a84b5dbda6fb3e64e796c0391a.npy +02958343-6482e3afc2664e32d30f2d8d219e111c.npy +04530566-5168b7d5df698bb2852d4401c7cd1fee.npy +03001627-3ec25d235438258d815b20ced9d3b22a.npy +03001627-320b6f3ae2893d3c9f5d3fd8c90b27d2.npy +03046257-569f15f5c49a880c5c9c63683b16d1e1.npy +04379243-965abcd187b93da3f1783a44a88d6274.npy +03001627-3fc6ab5d3c52c128d810b14a81e12eca.npy +02691156-1203825bf97bc3524722e1824a086fad.npy +03636649-8a6944062cbf8b25ef0a7c6e0ed55209.npy +04379243-408c3db9b4ee6be2e9f3e9c758fef992.npy +02828884-a219234ac9ffe2e012f133bc7efb2111.npy +02958343-d4abda76f4db60086d07c55cf995503e.npy +04379243-319e08128a169440c3bd24f986301745.npy +02958343-b6755cab505f437375cad724c63e222e.npy +04256520-8d87711b1fc30783f06800d5696e457f.npy +04379243-d1c6ed48a115eed0659dda512294c744.npy +03636649-b8c6a482bc4d5da6fcb8d8c6d4df8143.npy +02958343-e69a5ad60aad3da2292296f0c84d7087.npy +02818832-f7edc3cc11e8bc43869a5f86d182e67f.npy +02828884-593251f67107e6b4db03e4f5c01cf109.npy +03001627-b1da0d9aab6d2308608505d960f2a393.npy +04379243-38fb3322efc35807486150a9b7f2cf18.npy +02876657-3861b002979703fbed4f86beca49f32.npy +02924116-2136de514b7c5e994764eeaa5c6e1a63.npy +04379243-124cc3b92266c2767156f312cf4e035e.npy +03636649-8b2b8b1048a707203c752b66cc923fdb.npy +03001627-9fd0c95e0112f6f8dcbca12e02e87571.npy +02992529-add38cbd2fd27d62cc98c9802550400.npy +02828884-2b90bed7e9960ba11e672888e1de63dc.npy +04379243-a5029c18a50d0e4be7c7920f6a65a54d.npy +03325088-d8f173b9cf9b84c728486e67fcce75da.npy +04256520-602e0f167c5edf327289c00b6dc9ca.npy +03001627-ec78623a598fb6d67fa68300c57bff0a.npy +02818832-9995e8f977861716e3ebe8b18779c486.npy +03001627-c4912ddaf24ee0fe7ea88ba060407992.npy +02992529-db89fa13b1c3c53afff0e9d5e9e3da5b.npy +04379243-60052d2cbcb9f8e725c578fb351f3549.npy +02958343-7f701224ca471b2ab8013668e30e23b0.npy +04379243-3365fa395d93bfd8f181ff4e3cb0a33c.npy +04379243-415e3d53c7a93ef88b90ca5a8d93018c.npy +03001627-e9821fb7af7db92b26f6c8b5b75f0ee9.npy +03513137-c54fc7db01647d02823590ed8a67d74b.npy +02828884-3fbbb64cce9b5fb681faebbdea6bd9be.npy +03001627-b8db5d63c7042d447cbf7cf495477037.npy +04379243-726c677962874743002761e7a3ba3bd.npy +02933112-2ce5e1eb83f4510319f778c7a8b12264.npy +04256520-87bdac1e34f3e6146db2ac45db35c175.npy +03636649-88d29e1350eda810c066b9622c005c53.npy +02691156-43d8125d940bb2ae850f318836ee7512.npy +02691156-a312cb2c9bb4665bd44389c0c0e68465.npy +03001627-5008eca8deba6555ee229bc98ff4457e.npy +02958343-420519a0f7390564f500cc506a763c18.npy +04530566-372ff5cab89350d23217bd20648fc12d.npy +03001627-640aadadf4fcba8355f9a00acc25f137.npy +02691156-49611834b200ece04c3a35cee92bb95b.npy +03691459-c198d2df79e4a40fde3a1fb6044fe536.npy +04379243-4b35aeb6ad7a0370f51945de050323d3.npy +02828884-248e0773a2a8d90879ba0a8466ed4e3b.npy +03001627-e5a8500223786886995e7ab497adca70.npy +03642806-6ae14173f5bface824a85bcf396c330.npy +03691459-eb9de225b5d502c1278fe505f40d50be.npy +03691459-fa6fab7bc0823f6e54feda409512bbb5.npy +04379243-eb9b9b8d186a974a7afee304cce81d6f.npy +02691156-2c5bdd9a08122f9e2023ec956848b741.npy +04379243-7e2c280b5839d502eee2d67fbfa67a7f.npy +02808440-556213319f5a21dbccd0340812259a39.npy +03001627-2dbe453ba389adf5f91663a74ccd2338.npy +04379243-9ffffefc4b5a04ec49ed2275c90a1298.npy +03691459-99f296d0bbae5585414ff38ecabd5968.npy +03001627-5ae7ef4cfaa6bd85b04cb542e2c50eb4.npy +04379243-24f753c88ee4376f19fb4103277a6b93.npy +03001627-4f58ebeb561bb94bb9e8bdc9c4a49aa2.npy +03928116-5a3017574c3ab9d61d4127b3f0e05b90.npy +03001627-a95b5ea73cf0c9bc8e72c17826417b99.npy +03691459-ef509cfed1b359a7dc1ad15ea0771770.npy +03001627-fe31beab802cfc56c2bcda262700befe.npy +02958343-fee1c13922c07e8711b978ff9450f61b.npy +04330267-d07660fd1f3ca85f4d1cd794fadc7ced.npy +02828884-adaf1ba4acf51baa601104cd2d998272.npy +04379243-cc445d016f3a487d84cc5b3c1e5e75d5.npy +02691156-17ac3afd54143b797172a40a4ca640fe.npy +04379243-5dbdb35766fd2d4c9f4b4145f6688869.npy +02958343-11e5b7d67058e1d75f67208653687b70.npy +04468005-f5cfce14d01f0c08157566c5ec7088ba.npy +04530566-3c5d0c6c971d39aa70cfb3232f40c6.npy +03691459-3655d8078087f1c62d563c85edb49108.npy +04256520-7140d5cf3fb0c528b43753a53e4593db.npy +03001627-8d5866194748bb3492d9da2668ec34c.npy +04379243-6dffe86c24e3870cbeedb4c8fd29e2d1.npy +04379243-bc5fdc598162f85076c7054c38bb1311.npy +02958343-fa9897315ee8b6ba67789dfcc3262f70.npy +02958343-f18093ac0242d439f500cc506a763c18.npy +04004475-d825fea4d6efcf11c4c8b2717842f75e.npy +03593526-c17615e76d2988802f841233486fac2b.npy +02808440-ea7913efbe22abed412deb0d2b0f3dcd.npy +04256520-ab38a559643b01908b424343280aeccb.npy +02876657-c3bc0cd2648e76b9187964c89b3399f1.npy +04379243-59366e331014e2248738e7290b6f3237.npy +04256520-785505b155a724cb6e92e37d6e2c659.npy +03691459-e5deab6728f237a6fc7703ebafc3f082.npy +02958343-f6e0b8a0746d36d74eb766e5a46fceab.npy +04530566-ce15225b24bb4ed2742fb0ba5ae222f2.npy +04379243-53fe29e7363eaa70ce898a7d76534f1f.npy +03636649-e02e79e028662e9ffcb8d8c6d4df8143.npy +02958343-911029433b8ff0f1afe1d4530f4c6e24.npy +04256520-695b90883d398e5b15cdaecfa8164583.npy +02958343-c896260b935971fc65d21723f535417.npy +04379243-55589c71a2abfe97f09df371fae9d63d.npy +02808440-18100df055914701d79a5415e88748c0.npy +03001627-b8e5ce05c382b9a3f51f77a6d7299806.npy +03001627-7f79aba01e8c572b68d1b9a1d97e2846.npy +03325088-b9816227a0b977c9b362845c6edb57fc.npy +04330267-a6912050e1bb1c13c7fb1a0a584939a5.npy +03325088-2d47bde73180097d76d20e73c57c9a03.npy +03325088-346a94616fa138bb85d4c34ee84c24a9.npy +03001627-6fde09bdd613f6e6492d9da2668ec34c.npy +03001627-fc4d15c15c56aa7baab4888e25356418.npy +03001627-2fa970b5c40fbfb95117ae083a7e54ea.npy +03325088-7d98283d7e6fa67a76c18e71fd49c4dc.npy +02691156-f57caba2eed21f2998459325335edae9.npy +02808440-1302d8860c7bd1e17f53f1372963d362.npy +04090263-82c04946433c4a8f63413b0440eeb6fc.npy +04379243-6a2c94b2c34c6134490ad276cd2af3a4.npy +02992529-cd1739ec8797049072f1ebe52d9b9daa.npy +03001627-e078876957aa6efbb0b0d46323bc2ae0.npy +03325088-eceb070402c34d37f38c4a12750d961b.npy +03046257-d8bb7dc20a30afe1f0aeabfdcb4e1dd9.npy +03211117-2e6204b4aa7ba83fbd28395acf9af65e.npy +04379243-f9beeefdebf70350f4b6538438a0b930.npy +02876657-64ad00b1757205a3f388b3201b32e1d0.npy +03325088-736123b57129c3bc14de2a9aaff52ac7.npy +02818832-c496214ce548416f4af8975fbcc96231.npy +02691156-1e6a71e0cb436a88a3a1394d6e3d2c63.npy +02880940-aad3cd6a40a15cb8664b3b9b23ddfcbc.npy +04256520-f9f7fe005455dbec215b8895763d1ff.npy +04256520-35b4c449b5ae845013aebd62ca4dcb58.npy +03001627-bda113bd71ea0352654ea6737b0d3597.npy +03001627-682bbcd00c5287a39d365481aaba80e.npy +04379243-268116c288b215c43dbb6421d614c0d.npy +03001627-1878633a36518ffc19fb4103277a6b93.npy +02942699-3d18881b51009a7a8ff43d2d38ae15e1.npy +02773838-758dd5af7f18ed9acd99ccc7ff441abf.npy +03991062-9b56496d8e6be657ff67c12005f72d2.npy +03001627-a7d75c84027af5e7321f25048c6142.npy +03642806-8a0edfd20cdfc27d8ca8637757ac3f67.npy +04256520-cceaeed0d8cf5bdbca68d7e2f215cb19.npy +03636649-4f62263f7bb10280a5f600ed2cf472ac.npy +04090263-2fe46eacc06b51bfeb8dcf90fc26e10c.npy +04379243-acc0b552910e603955f46d55537192b6.npy +04090263-cb52cb876bb3ec76aca1893e093d31f3.npy +04379243-bee1f4fa0730c6c5735aedaf68f44c57.npy +03636649-9bbe778f05a04009fcb8d8c6d4df8143.npy +02958343-8109ca22dd6b5772bb54d0b0194b4764.npy +02691156-78551e5fc01df70f77fd7318510b8627.npy +02958343-2830f11dbd7172222214ff09b39580e9.npy +04256520-2e5d49e60a1f3abae9deec47d8412ee.npy +04256520-4a264b02e0d8fc214b3c42e318f3affc.npy +04256520-dcfdd81e4410dab49f2349486c570dd4.npy +04379243-4b6d73d06b7359f26cca17c12e67a536.npy +03467517-b68c1576d19b5f1b93b667ec2f48a310.npy +04460130-c85bd50e2ac803aedfca80608ef618ad.npy +03001627-d657236c764dabdf5de9b4b5ce85d50a.npy +02933112-a32e351352e1053ad124fd2a448c2915.npy +02828884-2b25e49c58ae0e292056b4bd5d870b47.npy +04256520-2b7e704b07fd21febe65001d50394fd9.npy +02933112-623c347d2d5cd6b4a66c900acb409285.npy +02876657-957f897018c8c387b79156a61ad4c01.npy +04530566-d9e044a3cdd4359110f59460c26e963e.npy +03001627-a2441f03fed7c13def31f91fe6afc8fa.npy +03001627-75d3fc4649a63ac13efeda73d60343e4.npy +02747177-acfe521c412fcd04564c0afd61663476.npy +03691459-f0b4735b45d1a6b51aadbcf355bd688f.npy +04401088-22fc328d136756361e5d846d206adf3d.npy +02958343-69aaf42f0b8d0e2da37127a27e431e39.npy +02924116-e4cbd9d5a9c5b7d241cefd10ce5d6cc0.npy +02992529-76a4a3e8370bdc24bd2d4107e8dc02b8.npy +04090263-9f4c4c60efdb3076d02276f7769397e6.npy +04379243-8ee19157170f16dec12312ed5983ff64.npy +03001627-122a480cfcdd742650c626aa72455dae.npy +02958343-b1ad30609c2fa8a2d63b3823877bfa70.npy +04256520-3a27e270712fe178ce59ea70152320fa.npy +03928116-413f8963de404dd6c3c1160502619061.npy +03001627-f2af2483f9fb980cb237f85c0ae7ac77.npy +04379243-ee16bda18e585ce3445e85eb534460b0.npy +03790512-3156fd3e3101da329b0e27507dc1a100.npy +02843684-514e3ac98b1d18565ae27b5e83f8a47a.npy +03325088-fef67b0b5fee52a1843f813f752a5e35.npy +04530566-b1991078d16797eb221fc8bb1161b418.npy +02933112-88a1a68c64ef85394da5feafe6f1c8fc.npy +03001627-341c9b0583d31770492d9da2668ec34c.npy +03691459-bd1ffe5dcd7239d8299f55a072267eac.npy +02958343-f66180e68fb1c98469f2880702ff1c7d.npy +04090263-630818ee20900d67fe0b9f6d3db7b59f.npy +02958343-ffb4d9920493f1e5c29076ad43b687b5.npy +02828884-f3ec1b92140e1d80cb2a965e75be701c.npy +03001627-11e55ca087c74082feec1f13d2353f3.npy +02924116-84d8f737e423d441bb81ac54404de04d.npy +03001627-61b984febe54b752d61420a53a0cb96d.npy +03642806-11448f34681c545439f3410d5f76299b.npy +03691459-6b13ee07cfc1eaf7967b9b287e3372bd.npy +04379243-62eff79cf2e75bc2765ee729adbdf968.npy +03001627-b274fcf203b9ba7612c19a9a8d2be7d4.npy +02691156-d38922599bc74f6da30fd8ce49679098.npy +04090263-1037acddbd363ef5782611375da5ea9a.npy +03001627-b5ae5354fe7c166319cb07ecb5b4102.npy +03001627-7d7b3b8a1734154b3b8d5c0ebdd194c8.npy +03691459-e6b83a9d10349930b611871e114769d9.npy +04090263-bc8ffdeb04d8526e1f2a1daf140ac9f.npy +02958343-1c490bf1c6b32ef6ff213501a803f212.npy +03624134-76d4739797f4cec15d3426ee101e9f8e.npy +03001627-8fbe7ef85a9c57db784a45ea6efa1d77.npy +04379243-e42f2707bec24e028bfc6c6704f4dffd.npy +03001627-768acb4029f2d682bfad749b583f6a07.npy +03001627-892529626a1710cf17ef8b7bd64bd7f2.npy +03636649-c9c2e5fc4d00db3acd99cc18cb18bf34.npy +02691156-ec4f0bfd77978a1cca8607f540cc62ba.npy +02828884-fa1ab735efa7255c81553c4a57179bef.npy +04379243-f0b827eed9f044bdcdcd8e1ae308f03a.npy +03593526-d214b7c1d3b40f935e7cfd06717825f5.npy +02828884-7d1e56ea7f32d634cb2a965e75be701c.npy +04468005-2c25a659d3f1b5d5543c83125736ede7.npy +03636649-42129d6b04cb9038b2f7093e7efce142.npy +03001627-91dbbc203e8562e6238f27554ec73a59.npy +02958343-5ad4cc3f8e191c61d31d4c555d4c5a0.npy +02871439-a82d418331301d2c664b3b9b23ddfcbc.npy +04090263-439fd95bcbf861f572cad024c77ecfb1.npy +02691156-77c9fd0f0c6b0e9fca8607f540cc62ba.npy +03001627-f230308627e5edaa9d796919a8d71368.npy +02871439-3ff6c9fb0941dab184df0a86512fde14.npy +03467517-b6f78c76441e30fbb60d315a520dce5d.npy +04379243-54f33905a3c8973a4b3c42e318f3affc.npy +03001627-27e757d4ed3c929b75c39dc45570367.npy +02924116-7f2de63b2c90a0633b1a772db543a132.npy +04379243-889a50c35328c8ddfd91359c9f546b9a.npy +04256520-18a6381f8a0dffc876828214888cb11e.npy +02828884-5f355af51670666cfbf62ed378434fd1.npy +03991062-e0ba02e9ab9e9ecfdae1b60026a5409.npy +04379243-ca22c129ee2ad8a1f0ca692121a428c5.npy +04256520-251fc26346ac1897febad4f49b26ec52.npy +04379243-6d4fad5487a044249dc30bab479ad5d4.npy +04379243-de1d044910991a072d184f71ff3205f5.npy +03001627-b7fd3cf7f37e22e6713decb1a0563b12.npy +04379243-faa5d5ba2a002922511e5b9dc733c75c.npy +04090263-f4775027ca39270897ddede15c51e64e.npy +04379243-c9f85a671d551086d61f9b2773e1d72a.npy +02876657-ea200708a0779090eab2bd7322386ffd.npy +02958343-99efa2111f3be22d5fcb05674109534a.npy +02992529-5ccde0c95cc0538ef39072555215f568.npy +03467517-8accc9161ad74bd4d13ea145d0a10775.npy +04379243-31ecf1e704642491ce372179a495fcb.npy +03636649-ddeb5d944c128f78b0957d845ac33749.npy +03636649-50a3d09ac90370ec9c48f338871146f5.npy +04256520-be2d759412b18995946789884353d9f6.npy +03467517-ad63f2323dae4b154b938e339e865d2d.npy +03211117-f3d6470b3f4f5ad71c7075c2bc313334.npy +03636649-76eb7436c40e083384d184bdc625781a.npy +02828884-7ac9bc04a2f8e59c7a19c607757a04b2.npy +04530566-d0652ef190720c84f4e9dade6d46323d.npy +04530566-68925483ebc30618698ab31ac670e62f.npy +02691156-f8fb835bdc55ffffdc82b8fee1057b30.npy +03001627-6ec02d7a508434f1b0957d845ac33749.npy +02958343-9f703e578b4b36295b74572d48ff6382.npy +03001627-ef10235a28cdf7cda16af3198c99de08.npy +04401088-8b4c89b8f756cc6e78fe949fc1419876.npy +03046257-8fba28ff0d6dd6bb80d26506b9358671.npy +04090263-db97f4931d2da6e53e1271d7bd927006.npy +02958343-dd184b3f41891cd317c40808ff7018fc.npy +04379243-dbf2123ee206a81b8b00eeaf68a1358.npy +03001627-3c8864b07a5c0718861df5a407858f2.npy +02880940-4bf56e6a081c2a85a11f6bacf5c7662d.npy +02691156-c2d5bd1215248f9c8b6c29bda2bc905a.npy +02691156-a00f6bbbba234739b92527b70e93ee2c.npy +04379243-c15aaf668a80aad9ee5912a5f7e89744.npy +02773838-2022610a5d1a8455abc49cae1a831a9e.npy +04004475-2f0086118aef1549f616f642bcfb80d3.npy +02933112-ac499f75479d2e372ad490d4d7fae486.npy +03211117-6272280e5ee3637d4f8f787d72a46973.npy +02958343-350be6825c19fb14e0675251723e1e08.npy +04090263-b90a8fd2c92f5d26ac0fcae21e22e3fc.npy +03325088-7063aee9b0cac797b362845c6edb57fc.npy +02924116-a701862b4a209173c98c13d6112727de.npy +02992529-436d7a114f72dc03d4713685ae50fa13.npy +03211117-54ec97f055d68a78ea0068b966c5177.npy +03636649-2af78c0b040634e5881cd5e2fd8f0f3b.npy +03261776-c81c908ddf6c48744310636931b68fdb.npy +03593526-cb451e92ce5a422c9095fe1213108032.npy +02691156-c5d0dd7a7b44b079a76ffc04f04676cb.npy +02933112-6c01e409fb522789b664d1885442ba70.npy +02946921-d052c17866cf5cf8387e8ce4aad01a52.npy +03325088-4477714b35747609f34d244dc02df229.npy +03691459-b8417869805cc9913ef7ad0f5cedb0e3.npy +02992529-d5561b05a6b84a5489905122ac8b41f3.npy +03001627-22f030ce09693f4c65c99f3aded15b93.npy +03636649-fcd263dc05862ad1bec3353c29751fdf.npy +02880940-9a52843cc89cd208362be90aaa182ec6.npy +03211117-ab64dabcbaf1086f14d199c00aad9da1.npy +04090263-e479b8f33a323147f0eab8a2ebef8e89.npy +02828884-794573d3e6a2c4ddd845dc43591f551.npy +03001627-30526709beea1350c862eec8232fff1e.npy +04401088-a0a41f9444733969c3d30d5f04be159e.npy +03467517-f440f59916c2ed897b076baeaedfec9b.npy +04256520-cd06c0f38b4db9b4c397356311cbeea4.npy +02958343-7ed6fdece737f0118bb11dbc05ffaa74.npy +04256520-ce3055223e53a46e67d4ef1ee6cc8170.npy +03636649-e0e365a2927a7a73bafad60030e6ab60.npy +02691156-865f434c71d41326c9d5795160525060.npy +03636649-3879234efb8e60219f6b6d8f19761cb8.npy +04090263-5dbe96b00f0d7b201b8fee1b14934c0e.npy +04468005-e40a2d72efd3e67ed85b408a8edc983b.npy +04379243-33bf7aa0aa429a98bbfa993b02d27a30.npy +02808440-40f0604892e7b4268a7ab8a2c534e9e7.npy +02933112-43ed2ac5e1836f5ef51f77a6d7299806.npy +03642806-6b4698eadedd956cd2079b28d473791b.npy +04468005-cefa8b1b55922f419e5c987c836cf01f.npy +04330267-563f955f46e4368d8ae69567bc5a3efb.npy +03636649-121286f843ab37f71735ea0e092a805a.npy +04379243-572abcadc95a8ed14b3c42e318f3affc.npy +03001627-28d27f1204c1b3de6512b7b24f3d84.npy +04379243-ab7405d5b3ae15565e7087f2d9a278a9.npy +03001627-1f1b07bf637b3a1582db9fca4b68095.npy +02691156-3ecea45bfa541b8e4a4dd08ffc16eb81.npy +03046257-4b1283cead37c519e49675db0062ac74.npy +02691156-a82400edb160c18fc8727b27ee96a4b7.npy +02958343-1c14ef4c48b7d95d61c6c61410fc904b.npy +04379243-1613e86311fd7601c103f0a69924253f.npy +03636649-68491d576b5d35aade8e7376ce4e111f.npy +04090263-5ce2da67625a1415ae42d8f433c1cdc1.npy +02818832-3a3a4982fd12d3d7fcc95bb239c4c353.npy +04379243-3e0b229e646595261a719e2a845bdada.npy +03467517-c9b60abdc17708fb78ad94b294a9faa6.npy +03001627-87baf0c4bd11ebe7f771b7c5ceefa9be.npy +03636649-4da9ae6448c860243dfad56d2a4eefcd.npy +03001627-4bc5a889b3ef967b9de7cc399bc9b2b3.npy +03636649-d8a5c77da4c92921f7258dec1a592c96.npy +02958343-ba1b8956b1d84856369912a1ddf80ef7.npy +02924116-7fea6a3b4f76cf6d1b78de62f6c48608.npy +04379243-356e173817daabb0f44dc88afcdcd380.npy +02933112-56f7c9a029b6b40d12de5317fe5b354f.npy +03337140-992b47933eb0f924c3aee8e9d3a6ffa.npy +03211117-5a66f2589c7df206e1f2a1daf140ac9f.npy +03593526-c6ffb2891c1ea743ad8827e8f4f151e6.npy +04256520-9b08d6288f208362dac562275d66ec29.npy +04379243-c4998912c5b40b8de1590f407a430d33.npy +04090263-e85f80f7fe4c8f3266597c7d470782b4.npy +04256520-45e5b5efe95ae98ff2be27e9cc5f92fd.npy +02876657-f6ffca90c543edf9d6438d5cb8c578c6.npy +04379243-6ea2512df0b4f49244175b4dddf5be08.npy +04379243-f247cb60019ea321dffe3352803d6df5.npy +03636649-7972fd0fe5755b4ad42b9650f19dd425.npy +04090263-2509d876e7521634ad26d867b17d1a48.npy +03790512-170cfc531a4fd09fe6905ba5363784c3.npy +02876657-a95db9f4cb692657a09c6a60c6dc420.npy +04256520-918ae8afec3dc70af7628281ecb18112.npy +04256520-c9fb9cb259692ec0f7248d9dbed7a7b8.npy +02691156-2c3ba3f35c5d2b0ce77e43d0a92bdc06.npy +04530566-8b3cf3842a88136c67c16c85d5f8c7d7.npy +04530566-16f53391dba14c9829ebc23acefb248a.npy +02958343-6291f064e64c6eb9d18a5bd35f0d115b.npy +02828884-9596592f31910b9684a9223b0abc0b3.npy +03001627-dcbb15dad2001a0b8a4c763d71484708.npy +02924116-1134df3dbee4c3dc221d7b13f13a827e.npy +02880940-960c5c5bff2d3a4bbced73c51e99f8b2.npy +04379243-ddbbe3651f274503c7f9b652b66aa35c.npy +02747177-60b743e913182e9ad5067eac75a07f7.npy +04379243-6e1dc5da243fc523c5f48f9175316bec.npy +04530566-bfa34aeefb04b4c2356c09782a9de7a4.npy +04256520-bed924f1f1208f37f0bb193323cf7c6b.npy +03797390-6500ccc65e210b14d829190312080ea3.npy +02828884-d5bd619acad1bed3d2b12aa6a0f050b3.npy +02958343-97831a753d80d66dfd24692312e9de8c.npy +04379243-8f8954e310eb265bd42b9650f19dd425.npy +04379243-49374090de654a54fcd4910413c446d9.npy +04379243-283844acddc9df141191025061735ea3.npy +03593526-6a13375f8fce3142e6597d391ab6fcc1.npy +04379243-21009983c23be33dde39a695c03bae3a.npy +03325088-df3f006c8a8a59547bae653f822044a6.npy +02691156-5413e0eca808b2601f17e8416b3322a8.npy +04379243-549bfb6738e5c5a019fb4103277a6b93.npy +02828884-a64965f10047f31db3ee3d0077feb1bd.npy +02691156-44c0cb6571f6f000ca8607f540cc62ba.npy +04090263-b06d8b805dcfd1ebe212dc904164c2e0.npy +03642806-74eeef3fb670363550d5454e56d54b19.npy +03001627-68dc37f167347d73ea46bea76c64cc3d.npy +04090263-736af7558693f029774a2bc3e125b7e.npy +03001627-d4c3dd37d27afa8e7c5910dd17778965.npy +04256520-6931000a5a1932b6a494798fa117187b.npy +04256520-26fe44345859362569e2e0d2caa039.npy +03325088-2031479400b516043792c04fd8184496.npy +04256520-d0fcb2993379cf9ed72ff9ec64cb596d.npy +02958343-d8c7f76320624fef02d716c401defb1.npy +02958343-5881807902ace2dc7d26edf2a8ffb68.npy +03325088-8a1de547037ee5a4b362845c6edb57fc.npy +04379243-f7ce798a5ea0850c4b3c42e318f3affc.npy +03636649-30fd90087f12d6ddb3a010e5a9dcf3a8.npy +03691459-c3fbe6332f413bd2bddb05cb83a4378c.npy +03211117-b0c1b6c373c4ef3a83f09c7d0a6695f0.npy +04401088-13dfb842c1944c64de3b109acc7ed8a.npy +03636649-6b9f509d91eeef913efeda73d60343e4.npy +02933112-36bfa6f0a5897be786d53ab0fe94e911.npy +02992529-dd996020281c929f73caa5ba625b1f4.npy +02808440-30247fa574c0f87b35e6699e9332d49d.npy +04530566-3cbb8096ac9bef3533ffceb8a4acbfe1.npy +04256520-9adffacedef7ae4219fb4103277a6b93.npy +04379243-39b851143b4f68ba21d25a6a55757584.npy +02828884-77fac848d4c863b2cb2a965e75be701c.npy +04090263-13bfc7f0f9fd39f73a6842b1f893c19.npy +03001627-25b55c1686d6114de0f3ac5d28aef4d9.npy +04256520-60fc7123d6360e6d620ef1b4a95dca08.npy +03001627-3187a69dae9fd8dced403132b02528bd.npy +04379243-8215382c95d5dc0a5c6a44a505804654.npy +02691156-b9f486be9d0160349a6e43b878d5b335.npy +02691156-7006c5afe5175d76e69ef11112d71da4.npy +03691459-982f52d3117411a37ec3f7c14c03a92c.npy +04401088-479e2ed536698d478f257ecba9a6ef8.npy +02691156-fbe788465e564e46bc0909d98a1ff2b4.npy +04401088-a82fbd031a79f88eb6d41c42f7ade8c8.npy +02958343-c08d4483e70f02e5322b377b3e7c8ad8.npy +03325088-a76a5fef802be0b5b362845c6edb57fc.npy +04090263-2288e5e13ae8aa7192cea77f96988ae6.npy +03001627-78fbcca91324c141ad2e2a7cbbc076b8.npy +03337140-381cf26b050bf515820018801b237b3d.npy +03001627-44b317a5dc651210e76bc197b3a3ffc0.npy +03211117-ae33f2b2031069e0dc67390c888f2eca.npy +04530566-39c41184f49edccbc381729395a38d7b.npy +02933112-8f8a2633debaeb96c2b64c0adffbe398.npy +02992529-be66886215eafadd56b70d2dbf032aa1.npy +03001627-d274fc14092387c1e17e1cb731e2fa4f.npy +04090263-ce8a04e433d06b03a0ba30bb56da40fe.npy +02691156-f8d7d8331fe29f247209009cfb89d4bd.npy +04379243-cda2b04eb27a6b429ccce4c6d5bb195f.npy +04379243-7ad475266c37d4d3588d78fa7ad8e5a3.npy +04256520-b28f66155cb67bbbf182e66e17d08d5a.npy +03636649-6baa8b21a080da186fa63795f94c4d8c.npy +04256520-b4043ab6723a39f1406316a80ad8bed9.npy +04090263-fd0e1e7c62efab3cbde9b246866ffe11.npy +03001627-41896e1532fe1e63bda72093f9b5aa73.npy +02871439-a9c2bcc286b68ee217a3b9ca1765e2a4.npy +04379243-552692f06e4fb0c9ec5b06c6d7d7648.npy +04379243-fc42d63af681a927e14dcb97ba059872.npy +03001627-71372a09d0dec4f2e3837ef7356e7613.npy +03636649-ba397aa90c4af6ec98d5fc0473d00a1c.npy +03691459-c0add53ae9928d73b184474322bd24ab.npy +03991062-c85033738a03ae6a3b77ef2474e90dcf.npy +04379243-64630e265ab5e1604b3c42e318f3affc.npy +03691459-e6e7c3e1b887d2a1751b29c8fc6f20c.npy +03001627-bed17aaa6ce899bed810b14a81e12eca.npy +02828884-9795c0ce0679cacdd201085e80edb26a.npy +02958343-b6345c309ba64f97e97c6bb243ef67d.npy +04379243-47e24c3995150688d810b14a81e12eca.npy +03001627-80544a1e0e443c7d5438b83aba42ca46.npy +02828884-af264c02f69566cdf4fb4dee5181bee.npy +04090263-78e2a75ff1d93138e8914057d776d90b.npy +03761084-18234c941d0421729e8ab085b6e4d874.npy +03636649-e4d3e153ce7f9904e76bc197b3a3ffc0.npy +04379243-2b4cee8331e825806bd0aad3d992cb54.npy +03691459-63f13073406d8a2b4092d3b515916436.npy +04530566-5adf37321156a7bcbfe1cbc47170312.npy +03636649-dbfa4bf005acf00d351d9ca36f76b95.npy +02691156-9c9d6469ecdfc54fc2a9d7232db0ed61.npy +03001627-4499729e53c858ae71a782a4379556c7.npy +03938244-51f5522d1b9088e2d7465eca206fda6f.npy +04379243-f1fa3fac81269971820018801b237b3d.npy +02871439-48d58a4f43125e7f34282af0231ccf9c.npy +02808440-ef9318f2fb898812610c2a68437007d6.npy +03790512-fd53bf3eb05d8ef4312a95c7d4d74309.npy +03325088-3f99e84747ae5e0216f1e46eb2815c0b.npy +02958343-65332c9a15126b924b3ff698267962d8.npy +03046257-242d1fdad67de9d6f2543b208c9ee8e2.npy +04090263-595fcd065407f54ca97e1deede586e49.npy +03001627-3503fedf43c99f0afb63ac4eaa5569d8.npy +02828884-55619caff40ba259601104cd2d998272.npy +02958343-d43dc96daed9ba0f91bfeeca48a08b93.npy +04090263-8a071ea65e9057a1c7c8ce3bef5c2aa9.npy +04099429-d15f389919446c40d4a6ba4a33475f32.npy +04379243-de4fb391ab81be927ff6ace05b36a5.npy +04379243-57ee5654191b4265890992ddacc04113.npy +04090263-7f5f905397b76cd2304a8d13750ddfa.npy +04379243-95af60aa8cb9be066a76e23e6f966dea.npy +04530566-736e45984ce6645cda5505f71d8f8d5b.npy +04468005-f49f6eac711e7e97413710d5de208fe8.npy +03001627-61dfc04e60e3df4b4c350d7ea5fe2a3a.npy +04379243-fc7a8af42911dc77b4169e4cad9bb63a.npy +03337140-ad6624317d8af2d44c3aee8e9d3a6ffa.npy +02933112-68f25e77ac6bdea7de650492e45fb14f.npy +04256520-d4aabbe3527c84f670793cd603073927.npy +03001627-94bac9505cc503567085b4353236aad.npy +02942699-1ab3abb5c090d9b68e940c4e64a94e1e.npy +03001627-bc6499abd6192f128c605f8788f64de4.npy +02933112-2537e62a6495a46bc47fc2b7741fa.npy +04379243-8345588ba41cd2a87e4bbc5bb7fd2afa.npy +02933112-14c527e2b76f8942c59350d819542ec7.npy +03046257-b086cfa7419c820df69d21260b05e361.npy +02828884-219c0e465d55e89cad5067eac75a07f7.npy +04379243-459304c1c27aa82aa14bb1d7e401bf06.npy +04530566-5b1ef304e7a8cebde255aabfeb1b2b82.npy +03325088-240b8336c85be71750da8b99982a3057.npy +02924116-f0fb07c3592f55b2c2ae5d9462fe97f3.npy +02691156-9a0f4dd21a4ca19bf1cb19f636b1c2bd.npy +03691459-d76360da1411848ace1db673cf70420f.npy +02958343-355e7ad1d5664421898b91227342b00c.npy +04256520-569c7293b52b633814038d588fd1342f.npy +04256520-56df8103181fd18b27787a85c3bfabc6.npy +04256520-f9429d6bef2df25e4dbf8d635749f669.npy +02691156-92b7d0035cefb816d13ef00338ba8c52.npy +02843684-9ea188aa06a7a240290d6bb85a775cf0.npy +04401088-864e5512dd35164b2d477e233bc97afe.npy +02992529-e513675ffb2da709a060e584e7409aab.npy +04090263-d91e08ed981156717a362e61d329c7ed.npy +04256520-ef185107fb8d70ced06d60299de4d22.npy +02933112-19a0d9e5e036290bfe9e4fbec1f7cb98.npy +02828884-e6063d88a2b192ab56f6fc4b4ce1db04.npy +04379243-8a37a87d367ec0fa276b6f6d90ee3a83.npy +03691459-591613a69c2e212f78c0a4707b40a908.npy +04379243-71752a166bbbb06592bf3ce6b900c3ae.npy +03467517-8c9cf16672bdc795f94083089dddc4d3.npy +03691459-e08b3ac3bbae3dfe5580bd812eb6e71.npy +03593526-a88577a2ecffa8e858323e30458acc42.npy +04379243-994f6d12ab22d187c03d8b4214ec06e9.npy +04379243-3e0b8992e00a327bcb2a965e75be701c.npy +02958343-9d82d5874349f623d834dead2eb68d68.npy +02828884-9b15c79ea9ddff8d5065e2a2857d7fb3.npy +02818832-1ef20a206e940a4bd79d7db7b8ed51c8.npy +03001627-30363681727c804095937f6e581cbd41.npy +03337140-ccbe4636d7a55cbd7a50afc9c93f8a50.npy +04401088-e8e9617b4f7247fa3578fcb734a22822.npy +02933112-2862558059dd584c59350d819542ec7.npy +04225987-303555f1c5f4cb0a1082f2ea630bf69e.npy +02924116-d92a10c4db3974e14e88eef43f41dc4.npy +03790512-d6bef9011ee021c677b7d0d4764c121d.npy +02933112-283fed24177526de7eee615e75bc3b77.npy +03001627-91f867d862e6c96c3ea242d1c18c3489.npy +04090263-f5ab909cc5813c7ebe8eb764bcb3c31e.npy +04401088-e6838870d0138aa43b995d74ae757c1f.npy +04379243-9f732b16a7faf3fbf4052eb4c07f564.npy +02924116-b6451e8ac7d3af0ce7132c57a8d37e4.npy +04379243-50fdd5311091e5d742d09291b1705b96.npy +03046257-f1e9b69dbcaa8ca84b3c42e318f3affc.npy +03001627-63b84cdf260ab81b14b86d5282eb8301.npy +03593526-4ed93b27b2b1ae4a17d01689ded74b74.npy +03211117-d0959256c79f60872a9c9a7e9520eea.npy +02992529-8ec44fb44e4a3224795284068bb430b2.npy +04256520-669568cff92228b4e6fe3612af521500.npy +02691156-92e2aee5e86c0fc870d98a97e17b4da3.npy +02691156-d78a16856adad344670aaa01f77ae41a.npy +03991062-dbd112b601a9d91ce651568bc8a2644d.npy +04379243-e8d505c5e89f313dd42ec7e303174a87.npy +02828884-567779d7087c75eead5067eac75a07f7.npy +02992529-d9ce2d0be1f3952aa36bec4fa7cd58c9.npy +04379243-77a683709892e56fc535a1d76df92ef3.npy +02924116-7c2a4413154a1725c95c7a8a79dc0c72.npy +02946921-4961c651fdb6b45fa57e04ecfc2d7abd.npy +04530566-5b00c251f971aaa437a692cc86ebcb7c.npy +02933112-77ead277434621b5343087e1efdee691.npy +04379243-a9fcd41e05a12a0d7e1dc03b595bd36c.npy +03001627-5ab321d70991c94d780bc2708a85ba9a.npy +04225987-58ae991bd0350810b9ac379f661f5c75.npy +04090263-f53a4093fb00a490683e3750b53385d5.npy +03001627-2e291f35746e94fa62762c7262e78952.npy +02818832-b765b2c997c459fa83fb3a64ac774b17.npy +02828884-72dfdf42a06d55f61985df8e5a34361.npy +04379243-3b72f2c31c5aac6ab3421b3649fb16c1.npy +04090263-282f9e161a0bbf58fe00453e7ccbcad3.npy +04379243-70995336d06fc07ae9f3e9c758fef992.npy +02818832-fd1f49ec5a690d53c3bd24f986301745.npy +04379243-3d08a0ed3ba94fca6652506d959dc71d.npy +03211117-f1b1a1badc8ed7e739d3eeb007af69a3.npy +03001627-4a0f1aa6a24c889dc2f927df125f5ce4.npy +04090263-255b002258e74085d735fa1ab17311ec.npy +02828884-e03e7aab2967929d3fdfe80ff0b57538.npy +02958343-5fe3753b18cb01ae1b581e1887fa67b.npy +04379243-8374ea1c4c032ec8488ef35e8e3ee601.npy +03001627-40168f46019eb867be7e1d42d63ca9f0.npy +04379243-ec565aa9b442ac36ae6afb0c7fa710a4.npy +03211117-b13c22f9eda41f328c504ffda4ce2aaa.npy +03046257-955b66d63d6a92f5132fd0b3f17b0d6c.npy +03001627-98d20227789f5c9a5af29473330f42b1.npy +03001627-7bebd3cd1be32a0646f7430ae2c8ca51.npy +04379243-481e479cb50f251a7cc7de242a4585fd.npy +04090263-faa1fb485ddd6c9c8bfbe54b5d01550.npy +04530566-e3fe6f0e74fa641c2247d987054751d2.npy +04379243-9477f34f16c650f7cac9ba4482ce0612.npy +03691459-88bafe4a96ff3348dd1080d43103149.npy +02691156-e87902d01d40c71521b1ceea9c93aa79.npy +04401088-5c8d554075a904bfa7ca3fec59d82214.npy +02958343-2d8b8d98d4e3c76e3000d241e527f650.npy +02958343-5c542cd5371a631d6436916a86a90ed7.npy +02933112-55d1668a7d33f8ebc0b2397831029b54.npy +03636649-d466b21fb042a2ac605afa80919f9592.npy +02958343-4c60f32b6efdc7217dfb1ee6a4b12bf8.npy +04379243-411811d0fac7dea18705931e60ead6a0.npy +03001627-32b7f9324c56d6131b02cde7e81f0fc3.npy +04379243-e5eb64f97f6161ebf51f77a6d7299806.npy +03325088-b405f1da8275fd1214b35a7d7cea7130.npy +04379243-14d0926471af661e3087f84b199fd297.npy +03001627-7252a2c022a1a3b21f285be552b78f9a.npy +04530566-fbc2e96b16209642fc86577bf738024a.npy +03691459-eadad629c581c28c6b424c689f1d711a.npy +03211117-85395b5f99177f864311b8458795b94b.npy +02958343-3e37a76f38d057cd3f823401cb5b3c88.npy +02691156-de65da5cdc92b4aebc0909d98a1ff2b4.npy +02828884-42ffe8d78c2e8da9d40c07d3c15cc681.npy +02958343-30feb9f00597aa2a3781057335c8a2e8.npy +02924116-41fa4235493cf5d9acef723912f2fb61.npy +02992529-ac8d3abc6a6f7a939260029564d4cf0.npy +03046257-788ec08ac9682254f504bfef7c734006.npy +02924116-a18fd5cb2a9d01c4158fe40320a23c2.npy +02691156-eae845d4a7945ecaf2e466e56cb8c63f.npy +02924116-a4617051ca47db2cc29b99b0b80dbb7f.npy +02828884-3e0694b77418eb25d2b12aa6a0f050b3.npy +03001627-2b55385a63cf62f6bababe11fcea8796.npy +04090263-aca833639091b256922309b37ed10e7a.npy +04379243-34208e6a1f53551366d6af16d45fa132.npy +03001627-485831d92925bf03f3d7c13662c10792.npy +04379243-7a7188e439a39ffd9a2cc6d7b7b4954e.npy +04090263-c45c9f4ede3246e6a54581b3915c3bcf.npy +03001627-b88d8b5e5fbee4fa8336a02debb9923b.npy +03001627-ae6770f159b2f7c868c51305d76b1f8.npy +03001627-c58f6a35f86a1802e8f8c11a24c52ebb.npy +02924116-398bbd8bfc14e9d8df98386e2670b45a.npy +04256520-70ed97376be1d0a84301558fdb0b2522.npy +03211117-90d97637c01fd05e59122da3e1ccb92c.npy +04090263-72b28bc54158f0d512b38b1d99376c0b.npy +02933112-a2dcea3f88c397f487d0ef3f1f8b9c07.npy +03325088-bafb5f206f100bffabd7f138f3335c2b.npy +02933112-57041ab17b34eba1f49237e570f62c8f.npy +02691156-acd8f367c36a3d84fc7a6d75b3d807ff.npy +04530566-1356fcf0ea4a95bcbe7ca2216dc1576a.npy +02933112-56625ccb6e7dc3fdc59350d819542ec7.npy +02958343-f24129eb2169197c203f35d9b3b48203.npy +04379243-f2c4fbc0c7c9b87d961b3f02493c4f73.npy +03759954-506f9ea22fc92da4161e123a102b12b.npy +02828884-7139a01aa4fd148b7435838026088e5f.npy +02808440-b16eae893bd12a87b8724a732b3d4cc1.npy +02808440-5e07cb24ec93904bcc6434361376a7a4.npy +03691459-d3e279ab7bb0dcbb85d9d97241397921.npy +04379243-d704a2ea75d8a2b3507969980fe06783.npy +04256520-1210afeba868a87bf91f8f6988914003.npy +04379243-eb6f0eab4203ca0e1c19e7863a1c200b.npy +03467517-7e6d283b6c6728ab343b0b12983b9982.npy +04530566-e19c3bb778bc8e9ed372f295778d1591.npy +02808440-3b222c644a783ebbfcd4910413c446d9.npy +03001627-713d651528ade2516bbe7b731c00d0e5.npy +03991062-28938abdb2114e53bbc7a6acbd8f058b.npy +04379243-f1a6dd0d5d9bccf3825a5bc524f67c9.npy +02992529-ed004bce9e457ab037c7c775913296f5.npy +02958343-b3be6c7fdc27043ad63a36acd73ebb29.npy +02691156-483207a72a39129771d03b466c72ce41.npy +02691156-3547cdf24eeabdc925194e2abdb4c403.npy +03691459-324c0e25576498485373b650bcccdac6.npy +04530566-f90a485c72b6047b102edba1bfa321c4.npy +04090263-c0b2ff6229e1175aae9e1c81f7e5b0b6.npy +02691156-1354e0acd354a3ddb6670e1d7042072b.npy +03790512-532e6f88a9975a27b37378f3c85478b4.npy +03001627-e8c8534a16d600ba20685b5a7e34b501.npy +03636649-9896b288bc97e6556bcc48b8d936ddf4.npy +02691156-e521828113e1e0c45e28caa3b26a73fd.npy +03001627-u1e22cc04-7c4d-4ed5-bda3-8ff8067f22ee.npy +04379243-4c51b04b1b32ddcc4ef96d1bb8be503c.npy +03467517-4275faf3b0234007f03058f020a47ca5.npy +02958343-ee63549013035c385e28caa3b26a73fd.npy +04090263-d400c42c4c4b3ec1589c07868201b17e.npy +04090263-175ac778b726ef5d48cb5e52f6edec2b.npy +02933112-8b23fc57517a57d0523cc82298d77b36.npy +02958343-7e3237619d96b6e551a95aaa6caba1d3.npy +04256520-867d1e4a9f7cc110b8df7b9b18a5c81f.npy +04379243-2568994ff8112b6d65daa37b7e13aee8.npy +03948459-79c0cac016998c7cf7ba4a82f8032357.npy +02828884-1f4ab55de315d6aa7d77abe0f9632d4.npy +04530566-fa63720ea3f8bd379a6e43b878d5b335.npy +03790512-59c019516149fe33d5dde04c96fd8146.npy +03001627-80ca57536dfe8de971a782a4379556c7.npy +03001627-758b4dd493ebb4b34ec0aa53d814a8cb.npy +03001627-96b2bf512fcb51b2af7a8f97983e7906.npy +04090263-bc187370b495d54b4c82ce83dca284f9.npy +02818832-ba690c29eb60a5601112a9ee83a73f73.npy +02933112-a992c3b41cc3027a9e1c34656195f3c2.npy +03001627-cea21726757b5253c3648f83bb1262ce.npy +02871439-aefad6690d1382d675f9535c96844dc6.npy +04379243-66dfbdb8c35a6db779bd5cf8fc22cc7d.npy +03691459-5aad6776bda34de6831627e12e4fbb8.npy +03691459-a423a97b5758a266d747b49524a1246e.npy +04379243-389aab2eb6debceea5a5170d48a648c.npy +03001627-5afc95ed2a26ce548644074928ab3f32.npy +02992529-74aab120cfb4d88257de0221db0b9d32.npy +03001627-a18156a0e60e50391f4c17ff3c45b28e.npy +03624134-bcc178786ae893835f7f383d5cbb672d.npy +03325088-b9aa61770fa227bc6d0157e3e7a8917c.npy +04379243-1bd555bd6f08c5f4f90f8519e58d5382.npy +03001627-90c6d1df1f83329fe1181b0e584cdf9b.npy +02691156-5dbe5dd200fc214951971f8370d9050.npy +02946921-990a058fbb51c655d773a8448a79e14c.npy +04090263-938be7a1544953152c3271e911ffe19.npy +03001627-b490ed3bdc9debe6cad73d9df5957ce.npy +04379243-f11b09dd3782f084f78bdf37d618e97e.npy +03001627-9b52e73f96d181969cd431573238602d.npy +02691156-efc9cda06afcd8c2354ab1decf4fe605.npy +04401088-3dd3ed204c56943389e13811ad04f53f.npy +03928116-4d626fb144471575dd54cb5398e1f0b5.npy +03046257-c50629ffd5def0793b407f4857c15d98.npy +04379243-625c161306cf958eb000f20a5153622c.npy +02958343-7dbf6379da9fc6c3a4ee0fb6a51564c3.npy +02958343-7a228c811e7e18ad18e1879dc4ad8784.npy +04379243-3fbeeb56c557e9d6aca1a38908852eab.npy +03001627-280553e975d6b79fd2b12aa6a0f050b3.npy +02691156-bea43bda17ea2ec792e07599d5caede.npy +04256520-bb529f670d4cb04160d8f573d6badb2c.npy +04530566-99b9eb5e1a7dd3b9e4614310319ea50.npy +03797390-35ce7ede92198be2b759f7fb0032e59.npy +02958343-82c224e707f63304acb3c21764457201.npy +03467517-bac2a7eae4f7d1a8dac47853b7da5949.npy +02691156-a1848a4a69b14704ca8607f540cc62ba.npy +04379243-c35990badac37b256c09970ea0def16f.npy +04530566-cb497aa6439c5a058c8c82196ef75032.npy +02691156-914c308ac4a9156842c20743f866e1a6.npy +02958343-49e4cffd7736c34362b21e1bf23b9ba8.npy +03593526-198a821d967679684b3c42e318f3affc.npy +04530566-50848665c2b2d6f491347c63d1dae43c.npy +03513137-dde4e367492ca88bce01c07526cf2aa4.npy +04379243-61a898c20ddb028dfebad4f49b26ec52.npy +02828884-46bae1672b4d146993a6b3a551dcb739.npy +03001627-482afdc2ddc5546f764d42eddc669b23.npy +03691459-c4733a08e1fc82373f48f08f97da0e7c.npy +04256520-46c6d2fb8c92cba419fb4103277a6b93.npy +02691156-ed4aaf81dc577bedac4f72bf08dc79a6.npy +04379243-db969c98e24511cc98cfd47a860803c5.npy +03761084-aeaa5b0ad8e5c786a805114916841d69.npy +03691459-da23f8427db17c3c627a66821130f814.npy +02992529-1b41282fb44f9bb28f6823689e03ea4.npy +02958343-71a1122469df0bb8cc8ad0deed05da5c.npy +03467517-862247de086eae853f0e01549eab8c2c.npy +03642806-9eb06745445806576e14170ade57410.npy +03001627-e66ee381e20dec3a44f23566597ec464.npy +04090263-a45b989db049e503a04e41b7ea7de8d.npy +04379243-98578539ae351bc3876b50fc31ccedf9.npy +04379243-fe5f543fd0c6b34edbbc9440457e303e.npy +02933112-9623560560cb59a3d37a1bae74ee50a2.npy +02801938-a642201d64f3a2adf345c3e267c3bfb3.npy +03001627-ba673ea75085e46cbfd72d7396bc040a.npy +04379243-bc3c03577d04c17a8dc9009357301fae.npy +03636649-70c523d337585b9743dbb6421d614c0d.npy +02691156-c4ed630f9c0f728090b1d6deb98feec6.npy +02828884-94a2f3859ed66873d2b12aa6a0f050b3.npy +04379243-afd9337f23ea759b54cd2a0ea6cb618b.npy +02958343-8d6de65bee9c269bf222d93492cfe0b9.npy +04379243-df7b982169a2d36fa8d8da6771a88b8f.npy +02958343-793a8675d7a5fecd653effc8a32f84f1.npy +02843684-8fdcf46df1b30e1179f82e70cc0e3b57.npy +04379243-c572c44eb47c2a15c43d2b61614d0d0.npy +04379243-a3a4cda9949c347ddb039d8689a74349.npy +02818832-8ef4ac16aaf7daa9a95095163012e0b6.npy +04530566-d188656d279f4d8b94daa4565dd30535.npy +04256520-6900b73a93136591bbc7a6acbd8f058b.npy +03001627-4d6f35e7eebab44e2c8a86aeeb3b996e.npy +02992529-71899992cbb987ed5baadcb81f14fd84.npy +02958343-372ceb40210589f8f500cc506a763c18.npy +03207941-b904af827973a59977e1c4f3e3547f0c.npy +03691459-5944386805308443cdb1aa1514be92ab.npy +03001627-49e8ef75b5ca2a7c699012d4a63c792f.npy +04256520-c446a77a01eb3e59a6380f3fc7269ff.npy +04090263-d5734bfe7c57d3bda1bdbe5c0cfcf6e8.npy +04468005-c4fa99df3452e4321de75a0b04a57744.npy +04401088-5814df537b8f1bcde95cd0dc8c2f0e83.npy +04379243-5ac1ba406888f05e855931d119219022.npy +04379243-664dd0e93a0f941a47fe752318e646fc.npy +03624134-7f1cf4175b9e3b0dcc34b900bb2492e.npy +04379243-2afcecd6a801171dbe25fbd47cafc694.npy +03991062-c623808300139bc3beedb4c8fd29e2d1.npy +03001627-54b6c08ddcd0762adbbc9440457e303e.npy +04379243-2fae93478f8bb6c423a62335a5f0e6d2.npy +02691156-2117484d4ad547ae719b5362fe06bbb.npy +02876657-74d0244fed5504cdb1d85e3f9755b881.npy +03636649-c2aa9948afc6d4ed39b3360f500ac52a.npy +04530566-2458e4e41633c95642f9e27aaf0c47a.npy +02691156-6c2c84db10ba167e48464d2edba1bcf0.npy +02958343-690609438d922525ff1370452e3a0154.npy +04468005-71df29935222b917aba3295c9fb9b32f.npy +02958343-7219c2a7e7e04850374462542bf2aa29.npy +02828884-4bc92bee14e81db06c262ba0bee45d20.npy +03001627-2343e2c4fa69f33a2ff834514c92e8fd.npy +02933112-5b04efb9a9e392f7f51f77a6d7299806.npy +04379243-de077e0bd6932baef12d7184a2ad3430.npy +04379243-fd958ba5f3116085492d9da2668ec34c.npy +03001627-2ef1e7da7f2a124215d65204573ec4.npy +04379243-4c5bc4f3d5a37c6dca9d5f70cc5f6d22.npy +04256520-dfcc3ebaa7e5ff1720768660cf080d12.npy +04379243-3185d26189034bfa48db03d58a820cad.npy +03467517-dc65ca08817cd673d0b89b8c97d1428.npy +03001627-da292ce4ccdcfb2c842c47c8032438a1.npy +03593526-9eb7d0643394a33df633d7643fec578c.npy +03467517-cc9e9ef3e1326c5363e148e250c0340d.npy +02958343-ee1f5ba95a6bed7bbda733a39f84326d.npy +04256520-1824d5cfb7472fcf9d5cfc3a8d7af21d.npy +02691156-7af320cedd724bc89437816457a69b.npy +04090263-582ff2c7307daccbfae4699de9cb91a.npy +03046257-71bc557e3b154c037a24ef313a983026.npy +04379243-ff60e4b29c5cc38fceda3ac62a593e9c.npy +04468005-b2a72df72812b0edc50a037462bade42.npy +04530566-395471e88200756d88d5590328ce0ddf.npy +03001627-90e67facc9af413abc19762eaa7ba40f.npy +04256520-1a04dcce7027357ab540cc4083acfa57.npy +02958343-cf88ac755b07beb2becf71e2e014ff6f.npy +04460130-9151fdcecbac4d2fbfde35fcbc037c53.npy +03790512-8a9586b8eff9f3a6932abeb6e2fd4072.npy +03636649-e5fa327c14553b11e589b08489d157d.npy +04330267-e7bf4ad72b1ad9b69c436f89fdc07cfa.npy +03001627-521f0ff0b1d7828337b2bb75885cfc44.npy +03046257-d0ca6059273922d25daff59553183e5a.npy +04530566-d152611e5b14420460e26fdb6baad14d.npy +04379243-9f1fcee83cacf964f4b6538438a0b930.npy +02691156-464a8718f0e81ffd9a6e43b878d5b335.npy +02924116-884764173de226d8bbfc16c72fd24829.npy +04256520-791f224b44cc67b084a05e54516915de.npy +02958343-492a339ce5da3fe8e4b68d3b17c43658.npy +03593526-e7c29b8c7709187d42526f5fcee84e09.npy +02691156-9a04c7aa6e1655fc90baeef8ba5b93e5.npy +03636649-d21f149ace9ed2ffa3714990138052c2.npy +03991062-e2a90a8a9c24e8fb6f30d3298af6449b.npy +02828884-44facd26b66e6ec8cf0c8ab22c613984.npy +03624134-d179811d0522500f881796c365ec5f7e.npy +02924116-97db0ea84d0fe5fbe14cb463f23a6803.npy +03761084-479af1fbc8399fe47608168119193cbf.npy +03938244-a136a79481238e046d3e11439c6c22c8.npy +04256520-4da74e02ba23a7e98ec703e791db2af5.npy +04379243-12dfe5b5c7acf776beedb4c8fd29e2d1.npy +04256520-d7280c7d6dbb6f20ff12919fb1541da6.npy +04379243-4cac98acfd5c43e1f51f77a6d7299806.npy +03001627-9e6b834449ed2db86199d6fe090be061.npy +04379243-d485cc87ba99e2caffc6e457221b9271.npy +03001627-3928ff39e32dbddbf91663a74ccd2338.npy +03636649-edd398530cff676282bfcd34215ccfc7.npy +02933112-5abaee58835d67975f9f6f4c95ed18d0.npy +02933112-4c44e4124118a2521e4b67452ae5160.npy +03001627-e491dc151c8e801186abe5555a3b447d.npy +04379243-63c93cb827f004c9c738b9c67433b6a8.npy +03001627-993dfc1874d17acd08b731e9ce099e7.npy +03691459-b1fa05d508d9ed81753a010738a20397.npy +04256520-c0d3ed00259b4d9da326264e704c832e.npy +03636649-352d68b2a816640099e8bf807e902261.npy +03790512-8cc21006e2d9f38fb4f2746c8140d6d6.npy +04379243-980ef88f896e4ebbe6cbbd79676d8c68.npy +02958343-8976e05f72b43a742a9eb0f146e94477.npy +02691156-d9d39f688eb9ba58b3f2b01de37c0b29.npy +03513137-f04ce9786ba0364b6e686498ed562f91.npy +03046257-7dc182e052ddc140bd332b3f93481432.npy +02958343-20649c88556a7e7a113ef105f1affa3f.npy +02691156-3265b621ca222d29d00d52e62bf14ee9.npy +04379243-cc3f1a06508f2ebd1aed2875db0a8711.npy +04379243-9551ceb9c3d5013284c687cefb7c213a.npy +03261776-4f9e3eac5026bdfc50b69fcb22e78050.npy +04379243-98fe480bea8f8f0486abe5555a3b447d.npy +03991062-8111c4fa78c69d7925ebd1cd0b422e32.npy +02958343-12941cb870df79b9815337ac44abb964.npy +04090263-68333b503766aeab6171d14862875338.npy +04530566-7c4b6e4ef996f109a2b4e6eee41ad14a.npy +03691459-b47ec1326b29546bce6c3ccb8279bd8e.npy +02880940-e3095ecacc36080cb398a1cfd1079875.npy +04379243-1eb459fa4f1039ef8245b0d36e16cba8.npy +03001627-71a0fe77f0bc1cf94187eeeb0dea4986.npy +02691156-783f3f72d5639597ba0d990ae229b477.npy +04379243-79c5df613523a462d42b9650f19dd425.npy +02876657-f1c0e107dc158727a8360f05ea0a1d2d.npy +02808440-beeae670a6ed2a4cae5f116398936abf.npy +04379243-f9a9c8e70b6a2b31b20aa91e9e90c311.npy +03636649-c5a69f02323e087181d0740b20dd8fd0.npy +04090263-2d81e10114fa77742c242e8cf15917cd.npy +04530566-1baadd62642d9f03a134736201a79843.npy +04379243-4175d6f2d66c2e1353c1d159a8a8422.npy +04401088-c70daedaade33fd0fb24e6a63c26ad2d.npy +04090263-9586fcb3437ab068e1abf5082bc04e75.npy +04256520-eafc1a44c43b48b24b3c42e318f3affc.npy +04256520-234ba0e3cdec0c306512b7b24f3d84.npy +03207941-e700df968d805f9722c3257bdf875d06.npy +02880940-ae5c7d8a453d3ef736b0f2a1430e993a.npy +02958343-86736cf3dc841eafde5db5d0d11befd1.npy +03624134-aba3ccc2f015ab2cb824d0a927927209.npy +03211117-96c87c372083e06e9ce9562d3c10079.npy +02691156-3fba2f3ea21abb4f8c1b0ccac3d04f1.npy +03467517-482b8b9a225b6ca1d57700c05b1862d8.npy +03001627-88c39cf1485b497bfbb8cbddab1c2002.npy +04256520-423d4e5cadc6dbdaeaf288f952624966.npy +04256520-a6054a189eb45e30672e57a20276f6e9.npy +03325088-591f34168e565c1f1f195495a075a72c.npy +02691156-7a794db8180858fe90916c8815b5c43.npy +03624134-e2a838d9c35af903e332fb3cb6ebe50.npy +02946921-60f4012b5336902b30612f5c0ef21eb8.npy +02773838-30bf69aa24dbb3fc9de193e488fc4dce.npy +03337140-fe998d14e236584ec123147a914238ea.npy +04530566-9119eaa9b5996cd3b1bb46d2556ba67d.npy +02992529-f8d97bebf67cad12a0eb5a85db887292.npy +04379243-69c655d9411692a319fb4103277a6b93.npy +03467517-87650e8ff3d85672381b7fbf79296afb.npy +03636649-ca5d8536386d31d0dd90cd03407bb536.npy +03001627-eae58f128191381de9efec56e07965d4.npy +02933112-5ab3129036e7b69e278d386bfa54545.npy +04379243-1a9ea91307d15d91f51f77a6d7299806.npy +03710193-39728a7708d1b4bef7c06f0b26f28b7e.npy +02876657-d30623112e58b893eee7d6dab02eb061.npy +03691459-2325005b09d12b2585d624cfcd9a37a7.npy +03710193-e2e38e29cc30fd208ae1c1abea367249.npy +02871439-3b2fa4cd0b774d13d3b55643c9c176f2.npy +04379243-b5a2a53b9b7e16e6b85cd7b6d43e8edd.npy +04379243-6b58fd8948d4d34851581925776a606b.npy +03001627-799de8b0527ea329c725388bb41d64e3.npy +02958343-ecf4e8f49102db90a27a0cbcc84ba703.npy +04256520-cba1446e98640f603ffc853fc4b95a17.npy +02691156-b9794f4722f565e319ba010ddb4974fe.npy +02992529-6aa3eee6391336c821844676433a0aca.npy +04256520-38fed916a35dd43d7c8c503b4b873379.npy +03001627-3358536e8e7c416ea9ef8e11754eeede.npy +03325088-94cf19d3af4620d176c18e71fd49c4dc.npy +03691459-5efa892adca22d37cd8f3fe9ca2145e1.npy +03691459-d14285fb64811217e50f6aaad9a07bc.npy +04379243-f3d5911a52b16bf78bf1cb9ea68ce0cb.npy +02958343-f48659c519f422132d54e7222448a731.npy +03001627-351705e42490c3506764a784715fb668.npy +04379243-7580dc6788ab60123fe64ec32ae84891.npy +04090263-be0024e025b5d75024c5c134cb8fdbe1.npy +04256520-978ab0578d8691ceeaf7fa9cda77a592.npy +03636649-e8927203fbdbe320c02170c33e00ea64.npy +04468005-52dacb5f2a7118d2aa28dc6884266713.npy +02871439-364a2a1172dc0a827c6de7e52b00ebab.npy +04379243-f94b4fa5703a0d96983ba8b03ccecdb9.npy +04379243-34303ee69f402e0f2b931201029bc76.npy +03001627-71b3089481026a9e677db18592980bcc.npy +04256520-fa279ffe1c3d480e4b48bc115078129b.npy +03642806-58c9c43b8f4c39b25a9aadea699fb864.npy +03636649-dadeb9844d9f0c00f6da603e92626bf9.npy +04379243-5e409a2627f7cd7d63ecd64ef0e6814c.npy +03001627-72ba6d6bdc6aeb7d330a170e9ceed373.npy +03325088-45418a76d770945552bf76ac5fcbf05a.npy +03001627-9da67fff6ae787b2eb0f0bdaf192ff28.npy +03710193-95a442b63317a572148741ff87dd06fd.npy +02691156-639d85cb4487bb0e3c326782eb2d380e.npy +03691459-58457267e0a8e3eccd4a817c9d7b9f3.npy +03001627-69aeeebc9a686862cbacd8aaf9fd8072.npy +03046257-670df65cc7db261f1f6dfedaba98d5f9.npy +04379243-642fa34b5b7c5e5414c0d1332b864458.npy +03691459-d05deb21bcfffb07fac7130d270bddce.npy +04379243-651560f344dd987fda6f0c2ce3101382.npy +03636649-3ccfbe8b56a3b181276206fae5d3c473.npy +02691156-e60b86c7a4015490e5a760ec65004efd.npy +03001627-29f890e465741b7ef8cb9d3fa2bcdc0.npy +02747177-7e1b27b8df1f9ae8ae868ec20dc7b43.npy +03467517-538a397c8bb811f776d05024fabfa1e5.npy +02958343-6df1aadb0dbc696cf568f785e33a81d8.npy +02958343-6d3d67957e1ca228ca92a4cdad802b45.npy +04379243-58611e7338c17f2bde909714df3390c0.npy +03001627-650d540bac31f56ffebad4f49b26ec52.npy +02876657-cbe88d4a56535ba64e23e9314af9ae57.npy +03001627-20a128166fc9ac939240a35c2a5f105d.npy +04379243-c503356361873b89730cb37c9a5f63b.npy +04379243-215dd9e926305bb7f8e7f2c38fe37243.npy +04379243-e3cf80e575ddbc03d706ecb3379aa341.npy +04379243-74239bc42f23639f3ea6912ae089646c.npy +04379243-82a9838fc655d7f62e6da3d97725a350.npy +03467517-a132eccaddb5decab7a841fa7c24140c.npy +04379243-67ac830369ffe09b664b3b9b23ddfcbc.npy +02828884-323ff904411c3d427c64e9314d548016.npy +03001627-1efb3d9f1cd2499c5339eb67f6086a2b.npy +04554684-ed34c7ded72ba0a346cde67a6a1ea328.npy +02828884-d0c64a8b3fed1ba113736977841a6b9b.npy +02828884-ea577ade393dcaaacb2a965e75be701c.npy +04530566-8faf5fbe39f67f3dfa2eb3102eea4e72.npy +02691156-5aec07305ba4bd3d66cf1b4a8fc3914e.npy +03636649-5c9595253f292e154ce3bd4e27d8e100.npy +04330267-47c68395a5775e10d9deb3f829cc2475.npy +04256520-79fba03fadd8c00ef10b04ee8b1c6914.npy +04090263-79008976055024fa93cea328065cbce9.npy +04256520-294dbaa0e9afde3a35836c728d324152.npy +03948459-75363128f211014a42426cd19697880d.npy +04530566-7aba61c9096ce60b7002bddf0942f8e.npy +02924116-101fe6e34502a89952470de2774d6099.npy +04090263-197f8aac538b6f7327b14e46288c9d26.npy +03691459-96778a7607802a72ce1db673cf70420f.npy +02808440-d7d404ced8414f01a64e5c46abb30c70.npy +02933112-9c802e8971c1b25f480fa521a9c7198a.npy +02924116-3d6c2c05de399202cb2ecbd32dc2119e.npy +04379243-2ad18975be0934bfa93e942a054d60b5.npy +02933112-75c4595a4d1c3bf9fd2b139960f72a73.npy +04379243-e2869255db01d51df577ff4de1ac394c.npy +04090263-fcbfd6863b56c882dda5b2729f8f3c68.npy +04379243-ed963e8e0589eaa5490ad276cd2af3a4.npy +03991062-5e914dd726313181b1b4b514128408b0.npy +03001627-4f1e026bc520de13d66f9962327b4367.npy +04090263-b40a96b48a27dbed8f38658d7fd17ab4.npy +02992529-5828a8259ba570bbd24e3068806a8c67.npy +04099429-b7e7c5a838c33f19be4274edc10c1c8e.npy +04256520-ae9d32ee01af191a32dc1e76c3474bc.npy +02924116-c3c8e100b3c10f80ceeb72b524f3e0ca.npy +03337140-dbf34becc9a4e4c34c3aee8e9d3a6ffa.npy +04554684-2d856dae6ae9373add5cf959690bb73f.npy +04379243-4ef54a72580df356d5617443b3fe2227.npy +03325088-516eed82a6a512d6b362845c6edb57fc.npy +03636649-e001d10c9aed09d9947a4fb398a91722.npy +03691459-e82622f52b46e31df4e3932877a139f0.npy +02691156-1f3fd9b2ce99e4ed164ee3a88aef3755.npy +04256520-605fd6f6541ca57de56133f0e7d362b6.npy +04256520-b765b2c997c459fa83fb3a64ac774b17.npy +02958343-2b18b149cfccacec1d4fdb0e0fa715b.npy +04090263-7fe56b2c6ee7d118994714b2bc8b41cf.npy +03938244-a0903daa3dfa996837b2bb75885cfc44.npy +02958343-20a3df3de67f309d8e35db9103756ad5.npy +03001627-a27b9f94d052176af27383fc5a5a711c.npy +02933112-6a49166d5852d23044221bef0fa3c36b.npy +02818832-d776c6eacad7ab019c57c7eb44b963e.npy +03761084-49670b80947d34aca7f79a2a8b5d6e7f.npy +03948459-10f7179292b04787cf335697521a6511.npy +02808440-98f774d812a2ff0022f427296d72cac2.npy +04256520-fe79eb9d45cfa9c5ca7ed590d69b9804.npy +03691459-f452418d7be7e78eeb752889d5199f9f.npy +03001627-36bfb3be47fd957e543087eec55f714.npy +03211117-691ed09923a0feb95adfd0d9df77c16d.npy +03642806-6123321e3af0b6328204b359ccd3949e.npy +04530566-efdfd88f3fcbc162b4c316c21a905ad4.npy +02876657-f9f67fe61dcf46d7e19818797f240d91.npy +02871439-ad6ba923084a6eccbd3049064a592667.npy +04530566-9d737c1e2872b322d2ff3af4b7716b6.npy +04379243-862cf2d35bd106c55230ba3c88b645e3.npy +03624134-cb95eb6a8a62cb46127075892a2f27e9.npy +03636649-864ecd5e816326dc2da4b3ec05850371.npy +04090263-5de0665cd8e490f47de08b76f60612dd.npy +04530566-d7b1c89328c8f0099c42421cfc900873.npy +02691156-de5807cb73bcbbf18587e940b916a22f.npy +04090263-82267e9766dabdd653fd2f31e6ee4fc0.npy +03325088-4a77b3d8bca397c5f6c00faf69d13ed1.npy +02958343-ce8dae15de55bc57ec96068985a57399.npy +04379243-357d9c5b669d6aa37ec818a4524845f.npy +04379243-72da00b4d8ab22bda571da3abf5b1931.npy +02958343-876d92ce6a0e4bf399588eee976baae.npy +03337140-a71d07ab8246c80391c352d02061b3f7.npy +04379243-65cceb90a30f7b15bf6d866879baaa7f.npy +03991062-9c06b546a29ccb2f2c27670a86683659.npy +03991062-844323768c81e72794b3ff00a3f2269a.npy +04090263-a4d1ad2fe0d98814e6cbbd79676d8c68.npy +04004475-af7b8202bf769382ce4ad3e55837155a.npy +04379243-d416139067bf7db337b2bb75885cfc44.npy +04090263-7eeeec55dc10e1bcfa9286f039319ff7.npy +02691156-e27229a5f83b0ac96ece6611a5309fa2.npy +03261776-ea885955cb82b3cee074faa875b76f82.npy +02691156-6a59f581ea7f33a5700feb5468ed9746.npy +04379243-4707256a1f8fb862a8bcbe9721909844.npy +03001627-40e2ccbc74d0aae3b398a1cfd1079875.npy +03636649-bea6350707d0813c85f486468112b4ec.npy +03642806-949388e7bddc1b02c60ea5009df4047d.npy +03636649-dbd8677c25a60799a10831b4711b98b9.npy +02992529-975de17c0b5d96cda38e5bd2fdb10d11.npy +04379243-fd1573fb1fc4a99b4c161851ed2b4e4.npy +04379243-ecf9321f6fd98688f88f925b568f2dfa.npy +03991062-b8f273f071041f694c6c80caaf15808d.npy +04090263-f02cf5cf3a6c61c7d735fa1ab17311ec.npy +03593526-baa918c56da0512da2c59a4d90e63212.npy +04468005-903584d52613647290df764ad314c67f.npy +03759954-47c434d0a4a571f64fdb7f619836e43d.npy +03642806-40935d32976b7dd3c8ed5bb8c3ee3317.npy +04004475-775d7562a64bf1c58b466382c9d6d096.npy +03001627-545e984b290a7398e8b2b8dc0c816caf.npy +02691156-df9d8ab5ab6f50ed4d4cb1c2a5e48b7a.npy +02828884-2b529b43c73da6e92056b4bd5d870b47.npy +03593526-56f7b662be65b7824725f67267e31c89.npy +02933112-a80ad4eafdb304edb6b975d10a10702.npy +02691156-804821516ddb3203c6747f7c9ffe9e32.npy +02876657-f6fa8cc6b08aaabb2aafb83519a0c8dc.npy +04379243-2e096785b8d98d4430bbd4cddd04c77b.npy +03691459-7f382d870d2816c78ff420534f79208a.npy +04530566-eb891509436863da874f0e42f84eb4f5.npy +04379243-70a2420bdd77d414820ad1ca4d3c95d5.npy +04379243-ea7dcf537a18150cd3dad974dc098fa1.npy +04256520-7598b1e15de58e67b18627bb8f2c00d9.npy +03691459-b747b1fe2a8e76bfefc97c4bab792c9b.npy +02691156-3391b6520218cacbf27ebdfa602af873.npy +02958343-38f323fd119d14ed2a9eb0f146e94477.npy +03759954-a15b163ce08749f84fdb7f619836e43d.npy +03325088-c01e1d2a113e9f65d93da2c1c55e2c1a.npy +02992529-d740b0679a9996ae56acd5d5597a72c4.npy +02691156-6b69e4c1cceb6e0681fa1ee3c368532e.npy +03691459-2afbdce92417c3bdd9349058f7c3888e.npy +02876657-7280a6655ec867d67b79156a61ad4c01.npy +03991062-62890e8b684d82c936b0f2a1430e993a.npy +03593526-a99b8679b072b0cf9b6e5e087210d348.npy +04401088-be66886215eafadd56b70d2dbf032aa1.npy +04090263-5c64271eb8c09c3a6af1f39296f6a397.npy +02933112-e2716932c4739645e0958c0e3fc3eaab.npy +04379243-7d95cbca44393d12ca39a5500b69b164.npy +03001627-77a56bf8ea88336019fb4103277a6b93.npy +02958343-2228a428bfa91e4f771592b49641a847.npy +04530566-6911bfee295138ccae6afdd0fd1549e.npy +04530566-2e447f96f152a33a7428866500a95dd8.npy +03636649-12d44fd814bc9b40ec2a7a1f5fe7365d.npy +03991062-7962092866f8088ea2c59a4d90e63212.npy +03001627-2b454a3d18d5efba615debb484b4c30.npy +04379243-d939c9aff66ee720c47a35332c17cce2.npy +02876657-328ba04ff5119c74763cd81c1b401a16.npy +04530566-6dd917d73699da0d255465ee23ab5b12.npy +02924116-a3e4fc3d00a38746f9c0f9cbb10e38a2.npy +03001627-26ab589f6838edc99ae676623bdd3284.npy +02801938-33927052606fc67a70048d788a6ab3c0.npy +03797390-1f035aa5fc6da0983ecac81e09b15ea9.npy +04379243-16bb609914396bd0fa7b9a6c80e4e324.npy +04379243-8f7ffcbcc7e8e5a4263a16a1017ab2fb.npy +03642806-6ba2cdd89db562a08329485eab7078c4.npy +03636649-74799fccd1636ce4df6cfab91d65bb91.npy +03636649-39262f1d1eb0678f71428d548481a9cc.npy +03001627-886c8d7538d9d7bde2d5f8333c552e26.npy +04379243-b68a370aadfe0b4d4f3443b22038d340.npy +02958343-f478cd5a04d2220a25af19d380ae3a.npy +02958343-bc36588d4095dc0975c67b3b1e763fcf.npy +03001627-9515e377c1ec86529b9f2eb77f5e247e.npy +03001627-a88cdbcd4fe502c743f32dd9b833c1da.npy +04090263-45a794d26abda59e49c13db2bb1e6735.npy +03691459-58db9d793ce3c2ceb0109464688ee1f9.npy +02828884-c1b8d982d97e337f19fb4103277a6b93.npy +03467517-fc76f63343050ee1d57700c05b1862d8.npy +04379243-78c577ff52f4d79ae0a0b410fb7d15f4.npy +03467517-5cbccb74c904efe49d99f2f186e46f1c.npy +03001627-e94befd51c02533b17b431cae0dd70ed.npy +04401088-7a4619d2240ac470620d74c38ad3f68f.npy +03001627-2aacbdaf7dfbc5adb1a98fe8994d06b6.npy +02691156-e74b8862468d887c6d9b5a419d9131.npy +04256520-7577bddda1f3b6de73a5c8eabcf6c479.npy +04530566-c9b7da24378152d082e68e57491bae0e.npy +04379243-7a3326ec918a44846e3c8a33c4ddf2ef.npy +04379243-86b48365b2bd587e61830bc1b4d6c5ea.npy +04379243-31b4349e405e9157f927eef536ae57f1.npy +04379243-cd224ca2a8aa04b11362d127df6d94eb.npy +04256520-58d87762038f551bf2977dcfb5a9b56a.npy +04256520-fb2bad5e3ba66eaccbc66df5fc1969c2.npy +03325088-500a24738427fcb0b362845c6edb57fc.npy +02992529-7d5180e005f1601ca36bec4fa7cd58c9.npy +04379243-4264ba880cb763d37342f7d672371a5e.npy +02691156-2af24e1c7067533d50a05a17b2f9bc.npy +04256520-2bc74fa3617de19fd5bfda5cabec2102.npy +02691156-9595693b6c0f5157651e8da9cf70afea.npy +04401088-d8071a38bb3dd8f097c8d78b9aede742.npy +02828884-7cc7a6e8e2aad387a6a7b6e78d8d5bcb.npy +04379243-58479ad882dcbbfd9d297e74104d3ac3.npy +03001627-5bb8457da2bbc722d810b14a81e12eca.npy +04379243-51c7851a252ed0ff8211891ea560a7f0.npy +02876657-91235f7d65aec958ca972daa503b3095.npy +02871439-8f0baf74e4d91b0d7b39f9a454e866f6.npy +02691156-9bf3c126d5918c41f5c7319b71bdce6e.npy +03325088-34d310b4964578f876c18e71fd49c4dc.npy +04256520-66df0b92b5712c0c917b96045c9b6dea.npy +04256520-69f6a6087f0da861af8fee88d245152b.npy +02958343-9f69ac0aaab969682a9eb0f146e94477.npy +02691156-bcaf04bfae3afc1f4d48ad32fb72c8ce.npy +03636649-d9adf06b7288f3cbac520a24f902dbdd.npy +03001627-f4e24cf8c5d0c5c31dbb0393636b3531.npy +02871439-9181c8bc52315206d810b14a81e12eca.npy +03593526-d090b33ac316a4b8bc7f58784fda27b5.npy +04090263-2eedf3a4c4eeee20af56497f051566ab.npy +02871439-a5f5552f1691e13ba5b8ca7c7b46f1d4.npy +02924116-63f691c1b2bfe5846ca2b6e5474aad11.npy +04256520-f13ce2c21e2ebba4b40f0ac0fb9a650d.npy +04090263-d33c5c2a6d3c4c64d730d5e13144e77a.npy +04379243-73bfba756e6e8511c3bd24f986301745.npy +02747177-ea90a3c6378d6f6d56f6fc4b4ce1db04.npy +03001627-b6689fb8b784c570cc514b26ccc20774.npy +04379243-8fbcd8920abcdcc519fb4103277a6b93.npy +02691156-58fcba9ef405277cfc8d2548f6ad75e.npy +04401088-bdcef95e8efb2665408f0e810863705a.npy +04530566-c521d7e4482fc7f7a716de2121565fe.npy +02992529-ae7b93f3ea4238712f20ec3aefa0fb91.npy +02691156-62aecdd1266b27935fc197bbabcd5bd.npy +02691156-3ad6bdeed351f5a84e61a0c2eaaabe87.npy +03790512-a0a40a9d5aabd6a7d5dde04c96fd8146.npy +04379243-3da823da4b6acf395b903ba10d2ec446.npy +04379243-9437fea69f0b44e8f97ef3b999ddb957.npy +04330267-139478e7e85aabf27274021d5552b63f.npy +03691459-276363a6e7991caa85dbc6e74635dd32.npy +04530566-a35aea08a3cb9391fc1bbbe626c79a7d.npy +03211117-b9b01abf4d7c9458ed756341424d6b8e.npy +03636649-a1d2f39cb17540e8988abef1fd117e7.npy +02828884-cb1ce3240eec3fffd417c7a2ac331601.npy +03691459-1e52b6d474a08635c10555abb2efb430.npy +02876657-11fc9827d6b467467d3aa3bae1f7b494.npy +04401088-c7fef6ae7f7f91814a0be3d856af9ad.npy +02958343-24c0a08cf0f7421d979ef391885ee5d2.npy +04530566-cb9ff07ef4769dba1d055b8893d6182.npy +04256520-2fb74a2f2b2b23a8a8cba409c4409ba9.npy +02933112-49485d1e98629d0c1c76f329bc4666d1.npy +02828884-84caee0c9f3b03571c56cd199c0bfbf8.npy +04379243-5bfbd0f0fb965cca9df2c4ae01002f5c.npy +04379243-f0305c34a57664ba32388c13cc4a0ba3.npy +03085013-dd369d106a5180ddcc47da24d018e46.npy +02958343-45673b0840de7daefe5083d20d7b5c42.npy +03636649-e37de82cff38f88d1735ea0e092a805a.npy +04379243-a40281aa13c75ca2ec4a754398bdb370.npy +02924116-f4d2b141c7956794378953424bcbb407.npy +03001627-88a7740602eb0d59cd431573238602d.npy +02942699-d9bb9c5a48c3afbfb84553e864d84802.npy +02958343-5d851496c2acbd8cd03e665be0237104.npy +04379243-5f226992dc83d5ead42b9650f19dd425.npy +03691459-5b22a13742fc7224079257326eb1699.npy +02691156-b04ec55f4960b3b984b7ea000aa0a2b.npy +02942699-97690c4db20227d248e23e2c398d8046.npy +03001627-39fee081ec01fbae4b3c42e318f3affc.npy +03001627-6fd5a9839c5caa52e8f8c11a24c52ebb.npy +04401088-9efabcf2ff8a4be9a59562d67b11f3d.npy +03001627-386b2caac16694edbab0cb5a4ccf2fb2.npy +04379243-8a07b5fc233b5ad2f51f77a6d7299806.npy +04379243-23ce23d83f097dfe30e9c0571435b6e3.npy +03001627-24d3d4259b35fb93490ad276cd2af3a4.npy +03636649-82c10d98a1aa65e89730cb37c9a5f63b.npy +03001627-3427d2276fb713e5864c004309dc898d.npy +02933112-e0c8d4f4c31b26f6d295b24579cf55b8.npy +03636649-83c0ad378b5802b73d39d8012919dd25.npy +03001627-a3e985835e89c8b1498f847f9f26fae3.npy +04379243-4be9eedfb4071f919f9a4711823598a.npy +02924116-9fb19dac527431c77d5938f6fe09fcd7.npy +04530566-2e4aeae716401155bf9913347b9df76.npy +03001627-96e83c79e8d76d4519fb4103277a6b93.npy +04379243-26642892c5579f25998886098b83a99e.npy +04256520-cade7495591007c2ec53fa9e4378e66.npy +03001627-6a02133392afc96b40ef1c8b63a628f9.npy +03001627-f2d03c1b46ff3c387bb504f750cf6e27.npy +02808440-adf9df7ae15500f88e30f00c0774a63b.npy +04379243-d94795f08cc91051a7bc6296cc70fa9f.npy +04379243-25c0559c051e57cc7fe20aad99c84084.npy +02818832-2f44a88e17474295e66f707221b74f43.npy +04256520-194ca5fd43b1c04be9ada1586a8c9364.npy +03467517-3ca24964106a34e2f8b3e7c2833060bc.npy +02828884-be0b1cfa18356b5bcb8b82ec2ef44379.npy +03001627-197ae965385b8187ae663e348bd216d3.npy +04256520-7dfdfe28e3d25a0d19fb4103277a6b93.npy +03691459-5edee1135040e2a9aa2b654345545ea.npy +04090263-82c56ec37b153eaf97ad4936ef9fbcdc.npy +04074963-404b2de4bc8bef211eba86b475bafe7.npy +04256520-3a99bf8e2a3e5e294b3c42e318f3affc.npy +03797390-7374ea7fee07f94c86032c4825f3450.npy +02958343-52ee842db08cd881979ef391885ee5d2.npy +03636649-2a9cc4404bf738302a278ff7f085c260.npy +03325088-86c6af80c470a805eb69804478f9c547.npy +04379243-918e7e6a01c7645bcb8248441df6c2f5.npy +02828884-7a910c3d6878068ba653610be84c6d81.npy +03001627-328df096e089c4eafebad4f49b26ec52.npy +04401088-7dd788cca7df768495b1245be456cdf5.npy +04460130-35824a59a19511c538cd8eb23853c009.npy +04379243-f52b167d756420c83e5f17778b45d37e.npy +04090263-556f1e3652f8c8984a2ac5bbe9a7c771.npy +02818832-a8cfed0a1b9451c9d213467246722099.npy +04090263-385439035e040c1e9a2ee232a197081e.npy +03001627-8cedc8e684d60ff42a06d8c81262ef96.npy +02933112-5135a234fe18481235836c728d324152.npy +04379243-c7f673b7b956508cf51f77a6d7299806.npy +03636649-fc5aa16de2be4b2b93411b5b3583c4d6.npy +02747177-4a14e1ffc27ba762ad5067eac75a07f7.npy +03991062-e070cedac4d9d52ff9aec59741c69cf7.npy +02958343-b18899d2b002ce0f80360680c1602c7d.npy +04530566-dded8a613927539cd72535fe84d882f0.npy +02808440-d422fa89aec6c1bb50d0c6a0c254040.npy +03691459-d06487d7634bdfddc1b62a5dd6fee95.npy +02691156-23d5975dd63000eb4e901b3386f76d65.npy +02691156-934d7c130fd419cdacffbc7889712a99.npy +03001627-a92a13b4968d7780472349060cd3c236.npy +03636649-b69c3a0a46b932e3d3c1fbbc2200e255.npy +03211117-f480ab303b2b595eb9f9e1b0ade9a295.npy +03948459-7af9e52ccd99125c67b9bb226efd81df.npy +02933112-64f02390a1487f791e4b67452ae5160.npy +03636649-4524946bc53f31a92d5c7a0e60b0c525.npy +02958343-a838af854310e283e8d78fb938bac492.npy +04379243-c450bd1ef8e17865557ab4b593540354.npy +03001627-59907bb6aaa7afeec283ca2c9df7372d.npy +02808440-9f55d5b55085bd9a5e7c3700a257e43e.npy +02871439-95a56e0b1817ba0991857224647f3835.npy +04004475-da1ab3860b75dbe837f7fabf76ffe0b0.npy +04256520-5a71471acef6f8153d4d11ac89066d36.npy +04379243-d0a4d46fd42a0c3df6cfab91d65bb91.npy +03636649-79041f47579a9e3f3c8d0fdfb1cc2535.npy +04379243-564c9bc401397abc7d9b8c8596b4309a.npy +03207941-7c03487eaa8d9cd9a26e3d8de97aed3f.npy +04379243-56eeebd64c7821dd641aac62064f7645.npy +04256520-995a4ed2a96d7c60140c975cafb9782e.npy +04379243-a8130d38d538b6306f3d2b1b15fba494.npy +03928116-8cd2b891b455539433ae329611c23135.npy +04530566-3b726a3562a1bc6e9d2b0f4ee2fe01a0.npy +02691156-cd6a3584c3da1db4abcfca680e6d54ff.npy +04379243-26fa34f25c673a7f4f41773fb12c1cbd.npy +03790512-a1553e0bb7897a7ace0bf41e5f45753d.npy +03710193-9d0ab19d54bb1f90ac51268fdb437a9e.npy +04379243-fb59360b5cfb54ac6f74453f2a3da519.npy +02933112-dd6ebb99b2346757da8c66dd9a203cf0.npy +04225987-ff04077cb675226a1082f2ea630bf69e.npy +03001627-d71d9d23d786cc8dfebad4f49b26ec52.npy +02818832-5ab88816fbf1cf9ba0ee062ac3106390.npy +03001627-21bc90d659dbe28a71aa44dea7a6d383.npy +03001627-2207db2fa2e4cc4579b3e1be3524f72f.npy +04379243-e21f715035a4471ae7fda7f082299746.npy +03691459-99c7341e243c7a2ddffb6acd1a5cf214.npy +04530566-72a68c898941cb3541556f795d265590.npy +03001627-9dac39c51680daa2f71e06115e9c3b3e.npy +02933112-ca89804bd77f770c4c62bee40dcdc539.npy +04530566-20d1090d07a49fe927ac692756be9e24.npy +04090263-f42647b43072abc9c48ca2220df3a9b9.npy +03636649-a415a0bc88904b24ed56e40d2df47c3.npy +03046257-648801b3c9b7d66b9ba80f08c401fbed.npy +02691156-19b6112991fb8e33f3f2af1b43965204.npy +04379243-162e665f12c4340f963aff3ec12fdcb.npy +04004475-263aa26d579b6def14c06184923f6962.npy +03636649-1cf44cb081b1a2b2fcb8d8c6d4df8143.npy +04379243-1eb732041cb7f2d649dd82184c01c565.npy +03001627-f199965dc6746de38b01ef724ff374fa.npy +03636649-ec0979097f7c811922a520e8315099fb.npy +04379243-9ada332060a35a9ea8a8d4103b2a0b3f.npy +04256520-90ccc3b3b344b3ea2250bf58700b4d8f.npy +04379243-8c9782f2dcd99d5255f46d55537192b6.npy +03001627-533af4a6fa955f2e78cc773ba5d9e52.npy +02958343-1a4ef4a2a639f172f13d1237e1429e9e.npy +02691156-a60cd34f71c3c0549288437ebbe47284.npy +04256520-82b6391291239d90febad4f49b26ec52.npy +04379243-fff7f07d1c4042f8a946c24c4f9fb58e.npy +02843684-26334c57fc4b83b543e68d98c50c8932.npy +02691156-5d925e4748bb4ad155050237670e0ad2.npy +03001627-e118a2870622acaf65ba78ad9601cf1b.npy +04379243-2e20f537a7b64de177981b941eb4f5d1.npy +02958343-15e52e44cdcc80ed13ded1857c15b5b6.npy +03593526-12ec19e85b31e274725f67267e31c89.npy +02958343-f6bbb767b1b75ab0c9d22fcb1abe82ed.npy +03337140-9ce1c0b588ad6ef84c3aee8e9d3a6ffa.npy +04256520-7961d0f612add0cee08bb071746122b9.npy +02828884-9705540347025dec9c2dcf27153363c7.npy +02828884-27c3e5b2656c50f7cb2a965e75be701c.npy +02958343-e9573675928b6f1c2a9eb0f146e94477.npy +04379243-855b1a33bfaf996ea1fdf150cebcb587.npy +03001627-bfbb19b74bb5973e14de2a9aaff52ac7.npy +02958343-d691906c87bb2850a9733fa2ac6b95bc.npy +02958343-6c08a180a3437f316dea32b07f945478.npy +04090263-3cd7545839d7c7affc4536f2bcb40d3.npy +02876657-ff13595434879bba557ef92e2fa0ccb2.npy +03211117-dbff3b6424b743f6ec7770a2628afd7b.npy +03467517-5ed99a0b793e1f5ee52744498b9b3051.npy +04530566-1b19bc5a09198bc85fa2a5df3ce5bc40.npy +02808440-550fd88ceb559b49ccd0340812259a39.npy +02924116-e945160734280e1927a32abbd63df691.npy +03467517-797bb7bbc5af3c6567a66e84fcbfe789.npy +03001627-feab80af7f3e459120523e15ec10a342.npy +04256520-8078da16e565846181ae47ffdeb90d54.npy +03636649-ccd12ea2362ef81d8bb3deb7fab7c9b7.npy +04401088-d299bcdfee69c57d419fdfebc874eb8f.npy +03948459-fffbe09e4890f8f36314c3b6a3a65519.npy +04379243-d2578e2ab0be1ea3332e588d1e0957a7.npy +03761084-835ca5f3809182e86d1ffe1a45470ad7.npy +03337140-a6e10b71fbb9feb74c3aee8e9d3a6ffa.npy +03001627-f6d1ecef43ed4eeb907f4a296134a0cc.npy +03467517-ebb111e59d33f36f792f3038a6b53389.npy +04090263-ac25513a060b0ca3cc20f30a7355a75c.npy +02958343-7f4dbefeaeda54628ccbb4eb8965b05.npy +04256520-361b60c0143d91c3593ebeeedbff73b.npy +04468005-7261bd067778a9a2299a59bfd8e7d284.npy +02691156-50342e9cb1a7e00e59c11002fedd14ce.npy +03467517-9bee64cbbb1061678aeceec6397860fa.npy +04379243-6dc6bb97c387b2f3af4e8812cf1b9e1.npy +02958343-60963ce07aa742382a9eb0f146e94477.npy +04256520-8728e0df5b94173c9b709c9b379c59d9.npy +03211117-813b3e438a8fcb189d9f3b4d1ec94c69.npy +02958343-7c35cd27ae8d673bb1bb46d2556ba67d.npy +04379243-1ce2de1e1077d66c1d5fca03776c86.npy +02691156-304c2daaf96c79138cdbee8c4dbbdd7c.npy +03467517-5f24e8a1b07665a7e546539ff7b98351.npy +04256520-4a1b7de779cde76487311f65d7a3e3e6.npy +02691156-10aa040f470500c6a66ef8df4909ded9.npy +03691459-eb0c85cc627406b5d33b16aac56dbe59.npy +02691156-3aa2ba8ca2aede556d96f75c7a1666e5.npy +04256520-6e7f0557400601322112c05ea370d321.npy +04554684-81ecf0670ab97ff5fb23f72ec839c310.npy +04379243-d43664b8f4df83341ee9d48493ad639.npy +02933112-b1bdcc7bcb3148aaa23949c21eddef76.npy +04379243-dca260c356a236053f2fc07aab1b396c.npy +03001627-f2ef238e2e4615e92cf8e80367b40c9a.npy +03001627-7530bff8f0c2b45719fb4103277a6b93.npy +02992529-3ff176780a009cd93b61739f3c4d4342.npy +03642806-3e9af28eb2d6e216a4e3429ccb8eaf16.npy +03001627-8bd75ffee48bb4b845fa198471a5a8a5.npy +03046257-9a3e3e241da6de9d93f86a8fb60496b7.npy +02958343-a4548c56bea7f927ad02214e86fd5091.npy +02691156-37700819bf2af266f64801ad2940cdd5.npy +02958343-c38cba0ec9d1a74f38f3979791e64082.npy +02992529-8ea128f9035474394cb30fc798a4d976.npy +04379243-29ae41cd05f7bb1e377940ad91815d8c.npy +03636649-b78bef16d4f44844931e98da3a93e73e.npy +03467517-663dc9c3e5f11e44d57700c05b1862d8.npy +02933112-9e1fb93dc979f8fb5f9734700aefae4e.npy +03325088-6f3d84d580aa77f0c36fb70296e45483.npy +02691156-730edec9009f8cea615ba7bf3620290d.npy +03790512-365c1f92a54c8cb52a45a87054fa7272.npy +02871439-3edc5b95b8d629931a75b4e96d345a5a.npy +03001627-de351bfde19253af54a7a6750196c608.npy +03513137-68106146958b708540b769487f41c4b.npy +02933112-84a374fd72bab291ccff75c3d7aff973.npy +03790512-cfb2cd4ed1ee0de56dacd34e70282fc3.npy +04379243-f7477e845dad9568b0aa15078ea6f391.npy +03325088-850f04c8e1d8039676c18e71fd49c4dc.npy +04090263-35af9072a2ac0c485ab5fe67efb19452.npy +02691156-91f8e08144218e2d23fc69eefd95e6d3.npy +02924116-36d710fdcc160180452b9ebce7999790.npy +04530566-55cf3c1207e421a29e3e34eaf1f39535.npy +03001627-98f2d21c4dcac477f7628281ecb18112.npy +03001627-939d97b226f11272217ffa735084910f.npy +02958343-a5476137d0f2f930425b2c354eccabaf.npy +04256520-1575354ba1faad67490ad276cd2af3a4.npy +02691156-cc40acee83422fe892b90699bc4724f9.npy +04090263-23a5887211380b2f663e90eaf6b4ca52.npy +02691156-60232dad38a6ec709a6e43b878d5b335.npy +04379243-4f06092100d0164013d2510999d0f1d2.npy +04379243-9976f7053b1b7bf2318694f1cc6fb1f8.npy +04554684-5aa97c0e9c11bcd1677ce0c660f811e0.npy +02691156-791af615e17374d38eeaefe98ae26867.npy +04379243-5348f1ce4dac7dbd5dcc7ddfa72357b1.npy +02808440-1a74ca07a11f507554d7082b34825ef0.npy +02992529-427d255534038d47e5eda863cef11226.npy +02808440-da59b45d5f06d4a844221bef0fa3c36b.npy +03001627-4adde89dd6db1c4845e13b6ba9ac0cd3.npy +04379243-5c593d79b5f9c918b398a1cfd1079875.npy +03046257-550ecca35381f8cb75b642c872f5c552.npy +02933112-da57e1d30424771a14c06184923f6962.npy +03593526-9fe7e6a7bf8ca964efad53eb3f0b36fa.npy +03337140-d98bff9e813a9fc64c3aee8e9d3a6ffa.npy +03211117-ddd82fb23a12e2eb2c8bd51dc6fc05b.npy +03001627-23b52ffd037c95223704253c4a874401.npy +02818832-958f2d4bb17eb247c9dd845c88786daa.npy +03001627-f1b1c92f91d0e52bc68ff00665267e32.npy +04379243-92d64294a4c9af5cf8609c6280e52413.npy +04379243-5533c35223061f231ff2429be93a82ac.npy +04256520-48228cf2207c7af5892eaa162d1e35d.npy +03513137-22ff6fc2c81a3674823590ed8a67d74b.npy +02818832-8154ea19d8f7f02e6a041dc074c34106.npy +03624134-877875fdfa0bd32c8272e0c587033b7.npy +03001627-69709cb300ae3784ee72e5c46412e9a7.npy +02946921-5505ddb926a77c0f171374ea58140325.npy +04090263-72aaf4a05a6d988412b52a369561019.npy +03001627-64d07a909361ccdd1a8a283df3396be6.npy +03636649-c802fa4c82498450af6016f34c89d087.npy +03001627-e352bba8524fdbd98f62bdf4e9082924.npy +04090263-a573925ea3002ef5878dfef973fade71.npy +03636649-1d3259fe9377ca5f899bad344dc01f2f.npy +02958343-81af904b941c47abccf0883afcbd4b76.npy +02828884-ba8ca7cb2d3c265bdf535ea8b5cca766.npy +02691156-460cf3a75d8467d1bb579d1d8d989550.npy +02958343-44559a87bc7a0bb3121f82ae456ac81.npy +03636649-d2ad6adbad3ac49752d7b587347d0cf4.npy +04379243-8ae2ae3b341fe20bf80985a99195eb8.npy +04379243-88ebe411acb90592e8952e902d0fccc8.npy +04401088-6aa3eee6391336c821844676433a0aca.npy +03467517-58a5d088e1b9aa0263e6b27c89da971e.npy +03761084-7bce489081dd3a03379f47575c295bee.npy +03001627-1196ffab55e431e11b17743c18fb63dc.npy +02871439-bae1a98fac9dda6a7dc4aa29087c6236.npy +03001627-b96452f41194937691a3aa674c7ec1a3.npy +02773838-c3a5009c4867f7293c8d0fdfb1cc2535.npy +02818832-2cc7c1f0c903278bc3bd24f986301745.npy +04468005-9e9b16fb7f239b2183d23296e7ba4847.npy +03624134-f19fe19693937db1cb03b57fca000b1f.npy +03761084-8d94838d6ad21411df3a1b0d597ce76e.npy +03001627-184007a6dee70847c2a9692bf3ba76d3.npy +03046257-2b326c82b14dcdcfaf0affed7cfb91de.npy +04256520-c144f9c06cae44492fdae21c212bf119.npy +02691156-89b42bde2332e5c067c5e3041553656b.npy +04379243-a4d907884de88227febad4f49b26ec52.npy +03001627-33990ef5ffde80fa83bc207d8a5912e3.npy +03001627-e127ed243617eaf04904d89e9169817b.npy +04379243-57213d6dd723e767cbde89e0c48a01bf.npy +03337140-4ef6afcc8c732bdb91c352d02061b3f7.npy +04379243-f073fc78c930ca06f777b6b1bae343f6.npy +04256520-a409f5a41d2acd344b3c42e318f3affc.npy +02933112-44e48c541b5466342f38c0d2792fb5e.npy +04379243-21a807616afa7c6030bbd4cddd04c77b.npy +03467517-2cdbb215d7816019f22d46d16026da2b.npy +03467517-b0f553ef37dc1248a97512d711172fa6.npy +03467517-bddbb876fb62fe7fa2633106d043f491.npy +04379243-2d3cb79ce06eba3c7550d396f1a3a8e1.npy +03001627-4efde5d7dfad17354f13c1c9631f2b03.npy +02958343-7f09e6522f212f94512af8eced68fa8.npy +03001627-6233ebe950c7d44df51f77a6d7299806.npy +02958343-b216e194c572e9ff99ef493efb31e54.npy +02958343-c6eebcd03aaa9060e7a6de039856f1eb.npy +04090263-a90a070a0603a4fc663e90eaf6b4ca52.npy +03928116-eb99228ff23aa9f9c6543c981120ca48.npy +02808440-f1c38a8f87ca506f1884c7a487bba311.npy +04530566-af964792bea4edac541ae04c251c7da.npy +04401088-39cd15c429c6007e2826f529d0b74d3a.npy +04379243-f910c50ed20073928be66dc0939fd23.npy +02876657-3f91158956ad7db0322747720d7d37e8.npy +02958343-7b00e029725c0c96473f10e6caaeca56.npy +04379243-b6e4f287aad69f285aefe1fcbc7169cd.npy +04090263-1ae9c8f100db37692d356a2793fb4d69.npy +02924116-81b9a5cbd961da85bc868bcd254a4e45.npy +02691156-d20e3ed9b3430672bbf3143b1cb6076a.npy +04379243-768e965bfe1f6141473f10e6caaeca56.npy +04099429-53009165a8a4d43995698f277be16510.npy +02958343-965e73db41af495941aeea95b863b1b3.npy +02818832-644f11d3687ab3ba2ade7345ab5b0cf6.npy +04379243-edba7eb533ae3578ece232edf44331c7.npy +02691156-110f6dbf0e6216e9f9a63e9a8c332e52.npy +04379243-7c278d5d7fec83ba7d0628daab3fd779.npy +03691459-1e83ac6d9ce1541329965f7e898eb4fb.npy +03337140-6d63f6894c2a8cfe4c3aee8e9d3a6ffa.npy +02958343-5523a6798194043146810e868f84ab51.npy +02992529-1d9169471bf9223423e378ba27e11ea6.npy +03001627-5330a65bc54912ce35836c728d324152.npy +03261776-703dced3f9479f348a731b44a5fe7a8e.npy +03636649-8e025c4aa0b0201a81a172d69c52a28a.npy +04379243-fa1dc9a58da9ddb6235820b1d1961ea7.npy +04379243-6862bebc1f59a5caac7bed72580dc30f.npy +02933112-95ca7e79cf9b51cbb9a0f5d18f1ce54c.npy +04530566-b03e831a78f2f16a5b04bf7f324b7e5e.npy +03211117-b3ed6cea7ecd3f56e481cbc0aafd242a.npy +04090263-2254c238167dd6a5672ed1a3426b68fa.npy +04530566-97dd02cb0afa088d485fd5204f716152.npy +03325088-81b5af68af1b0a4ce25194f3c5a4f307.npy +04090263-366db4aa9243cbee4d0af51460733e47.npy +04379243-459a13812561557e26217a9a857cd404.npy +02828884-1d9fd401e86ab773d2b12aa6a0f050b3.npy +04379243-56597cf3ace4916743ac09133d4c1d60.npy +02992529-6a0c0c55f355cc23a0eb5a85db887292.npy +02924116-ca27d87d42a074f0df98386e2670b45a.npy +02801938-bf4e9a91ced79f63d2ad39bada7a0a.npy +03001627-4f4d7ae825908e303a8be023e0f2e100.npy +04379243-a90014ce65aef22135836c728d324152.npy +02871439-a58e567af32c9f58eca22c501ad0a77a.npy +03001627-4b9278e9f2f4056d1f47fd90378714ec.npy +03325088-702319c82154da5850da8b99982a3057.npy +03001627-429319c0c5bddfccd26c2593d1870bdb.npy +02691156-d2e99eeecebf0c77bd46d022fd7d80aa.npy +04460130-607a0e44587e043a3e974a0808687b8c.npy +04379243-38c395f4655e0e70fabe21cb4fa2fa68.npy +02818832-f52493e81565c11a15dfb09c4607d131.npy +02828884-2c81dd5038d43eb7b11ae648ea92233.npy +03001627-685f2f19452cb973e98f4318c324e998.npy +03001627-b37f1363aa93688619fb4103277a6b93.npy +03001627-8661c4d0ab5e3636490ad276cd2af3a4.npy +03211117-e5dd90d78168e53741e88434245c899.npy +04379243-bd7c71ca15b0d4e56c252f74b6220e29.npy +03001627-1e15f238da6b4bc546b9f3b6ee20ff4b.npy +03624134-c9a3eab86e5e134f6402b8f491cd92c7.npy +04379243-d37560b9ea27af4efe354164024016d6.npy +02933112-fc3bb2eda6e061e9b50d0c6a0c254040.npy +04468005-9c6fc1db4373c6ec37b0cf2f5378601c.npy +03001627-63e2d9ab50536799b2b9c1746713a87e.npy +03593526-7a5aeda354f43cd5baf4ef477c70e0df.npy +02942699-4cd861035c740db5a33f3afcb8763f26.npy +03636649-8064580d3a225366ecbab50f1720e223.npy +03691459-1733111366ac40b76eb0973c46aae0d4.npy +02828884-fd2d7b385db7d186f9e8cd846ef13776.npy +04530566-ff404dc428ac3cb7102f71c17954fcf0.npy +02691156-720d70482d13696277fd7318510b8627.npy +04379243-d45cb36eb4c38786b9a7614f2da8d7ae.npy +03001627-57263b7b778ac3a87c076cdc1de5871a.npy +04379243-eb8a34ab2eb9a26fe93eff560d16430.npy +04256520-9ea47bf98413280bfebad4f49b26ec52.npy +04379243-55d5fce641343449d42b9650f19dd425.npy +04379243-72a4fae0f304519dd8e0cfcf62e3e594.npy +03211117-233a7970efc2594b26735a5c7bb362c0.npy +04256520-4385e447533cac72d1c72b9dec4baa1.npy +04256520-7dedfb51ff65c27f67bb14b25f99796e.npy +02992529-c95b7121b6408df49fda13f2ab6d2b41.npy +03691459-7fb191e5d0d7464b538cf6df9faa9b65.npy +04401088-7bd964021c9c26e0e4b68d3b17c43658.npy +04379243-e7b9c7a47208cb067b14a4ce87ce734f.npy +04401088-9a94067c6ae50d59227a8035cf3430d9.npy +04256520-440e3ad55b603cb1b071d266df0a3bf5.npy +02933112-9ebf23f2bcb8f334246300e1c662ce6d.npy +02933112-108295ef2f00c9aa9d886ab2fa5ee681.npy +02828884-dfb1e5e85b5892adf155d75bbf62b80.npy +04379243-57399be7d3352241b8812f80908a0273.npy +02773838-f297885d4918000ec8724d5673a063a6.npy +03467517-e709e622fb4f54546d9376f644442e99.npy +02828884-ade8119d5a30ba4bf1547b1668422ce3.npy +04090263-ff042c9b61e609a78e4ed0a212e54db7.npy +02691156-4d0994838c31434cef5f09964a6a1f97.npy +04330267-86a46629a011d6adac7bed72580dc30f.npy +04401088-f8d97bebf67cad12a0eb5a85db887292.npy +03001627-215e557db4c4bb5d837b757304479228.npy +03001627-b203918276818529febad4f49b26ec52.npy +02843684-a25a621347c07e49d89388918d47c02.npy +04530566-1b86008df6322c5d438d829603922fbc.npy +03636649-b3530cffd4a04deab641e19ecbf0e871.npy +03691459-711b146200447f4183247f812f2eaa97.npy +04379243-4dfa73e922842c02a7e7cb173e141227.npy +03513137-d76f5069b5f42903b20f6e48f6a30cbf.npy +03001627-8d9061d863268349db224de2961e777c.npy +04530566-f8cf09473d99d5ebfb7214357e073eb7.npy +04379243-33ceeac71f2031577cc56a6af4771185.npy +03513137-32396b24a2106049a8963fe61f2bc75f.npy +04379243-4b2119939de4f6e892cc1f9d231c0f76.npy +04379243-bce46214d9982829f51f77a6d7299806.npy +02691156-91bd6e91455f85fddcf9f917545742df.npy +03001627-fd2fbaa023b5e3a81718a174f9ac28ba.npy +04225987-fff0431e712a1887ac7a821ba28adc14.npy +02958343-31389308f2b032ddf09fb258eb4b1e60.npy +03636649-b1edea6e2974e1b35c935b78db2f5ec3.npy +04468005-b98188592c6cbd55990561fc34164364.npy +03001627-8ac35c25faa261ef4f3443b22038d340.npy +03636649-5dbb2120f2f828d28aaae3d020f5ddf8.npy +02691156-da3ed25d281fc4c065fc5f76098aceb0.npy +02958343-f06af3b73004c92ec7193c87bbfa9088.npy +03636649-7dcbac101ada832568d026fbc8fe70cb.npy +03636649-4865be9773c699bd2fadb0a8dd9104b7.npy +02992529-c33bc3be82441ea66934b554e5b8d4a4.npy +04379243-4d3a4749310a3d242bf2627b2d231d97.npy +03325088-465ec9636301436b7a867e9b35a1295.npy +03001627-367dc1e6752cabbcc34bba142e6e15e6.npy +03636649-78a11c0b8e964c9b41657e31b569b105.npy +02958343-1213742aa7815fd0e23d60a1b706b44f.npy +04090263-c6d573383e36ec052e38f6d9568202c7.npy +04379243-464a6067af815ccd843ead12644a79bb.npy +04401088-c87bd717c3640f0f741e88434245c899.npy +04379243-ccc1fcdb8b104c97700e86b51ee00536.npy +03001627-9c1ee97e493fa79ce83221ad0d21775.npy +04256520-ba8afc95c19a3d369753496ba23f2183.npy +03467517-407b7a6118e1cdd240c20797381ee39f.npy +03593526-2293b6aa5ed35db3b1a98fe8994d06b6.npy +02992529-7617e95211fc3ba0e02ee35b95994e2a.npy +03710193-1f62225a411c998d983ec12a2b33f18b.npy +03001627-946f16a9bcc3c2be75aa7f24a9b6003a.npy +02818832-e480a15c22ee438753388b7ae6bc11aa.npy +03001627-a1a173788669c84befb94709f30ce0d2.npy +04379243-8d10d8d72f135011febad4f49b26ec52.npy +03337140-c5a97a3868a2c9054c3aee8e9d3a6ffa.npy +02828884-7f4f6fc801f4f957263e68b45fad1e64.npy +02958343-ddc63b22552ef13b734650590bacf709.npy +02691156-52b2c8f99319167c71d03b466c72ce41.npy +04256520-241a341105cf3dfe593ebeeedbff73b.npy +04530566-c23960425c8cb654c6cb0dfa2f14f9d4.npy +03467517-5f3726ea13c5bf7f8f4da12eef05ed4.npy +03001627-d4e0707b680e61e0593ebeeedbff73b.npy +02828884-c71738e3b314a72411afa9f5eb84a7ae.npy +03636649-5be8cdad3b218e373d39d8012919dd25.npy +03001627-eab859ac65d47f4e6412cccabcef91eb.npy +03691459-4468a5e60a6fedc086bb0379a61a0978.npy +04090263-92ed31e84e85000beeb5508ef773ccb1.npy +04379243-ba6909f6263ff92f72b785f16db8dbf3.npy +04379243-4368d1fa80c34433f88bdcce05b1a623.npy +02747177-69773dc176d1fa3fe88c1d6fc3580355.npy +02958343-5d353140bc7569a48772afa45900d07f.npy +02992529-f6b4f01d4c9c09e6af1fe3c052ed3a8c.npy +03636649-112058b3f8c94177d2dba55bc7acf0bc.npy +04379243-2abe61af67cbd99aaa1d46a2befc5e09.npy +04379243-78420814bee5ad17f2cf6a9bef44d625.npy +03211117-849b58834fec864c34794e47f2eafa39.npy +03001627-23951f57f090116141bac0aa0782f561.npy +02691156-32b6448c0864812729348d14ca881f7d.npy +03211117-4302bce2d7e6594cab610b0c94236463.npy +04468005-79e1589916d42685dc14ba0818ee5cec.npy +03337140-c68fef3fd87998974eb412130b6b0cb0.npy +02933112-7c12c2a7a1957abc8bf788ad2aab0947.npy +03691459-6503d74fb534ca43d4e62d99c536bbaf.npy +03325088-4bc18e1398c1b56173ec0850b5880d3f.npy +04379243-f10936939b1c9277d6134c153bee8ea0.npy +02691156-31fd02481a07471e4e8b48a4c01e36f8.npy +04379243-edb5fe83efeaf086fb0eb7e753c06942.npy +02691156-130934b3dd2fddfaaf4f36f817f09501.npy +02924116-c975efbd8c9b23ef94a1965cc6affaa3.npy +02958343-72122bdcd4ddcb96a0c0a4b1a1c1a4ad.npy +03001627-b559688f7af76ff5466127bf535bd761.npy +02924116-730fb62cfb278e0c2ac826a3c82da491.npy +03046257-5c851029d69c6252c834958aed613724.npy +04256520-6bdcfd4b681a6254c45c0f305d0b6e87.npy +02958343-3dab4ef100f906c2bda733a39f84326d.npy +03001627-5a96894b5cde0551c8687ff9b0b4e4ac.npy +02958343-d13d0612c64c1c872457c273ba02ebf.npy +04090263-c9ee75f15d7f6bd13623b64770edb4be.npy +04379243-c82910190bf76ef216efc8582f9e6d60.npy +02958343-34412b56217de1112b12ea83455b0f44.npy +04090263-92109df597fb12692511f68da65f4c4.npy +03790512-42857ece33bd9119617798af67b81f2f.npy +04379243-30655ef8f2511b4ad8f2ca82d6e1c314.npy +03991062-44aea02b6852ce98910e50f05b8001.npy +04256520-3247d4bf8bbcbeb6840bf649c20f40cb.npy +03211117-3d4079a37c8fb40e808951ff5fb582ac.npy +02828884-4e43690694133a65e5ef38e098c46afd.npy +02691156-3d23703a618ce7df1e569ed4e4cfe84.npy +03991062-1af2b0b5ca59c8d8a4136492f17b9a59.npy +02691156-6e65a6f2b81fdea2282e76ed8cc73a69.npy +03948459-2a8f236c10ec9b98ba9409808fba922a.npy +03624134-fca703c2489237d51b44a9962207f944.npy +04256520-5f67ee55d76bf582c41aee3d4c9d0c9d.npy +04379243-20bb1a34891588c1cce90f0d61ed7a70.npy +02933112-26a2132b719d226a86d53ab0fe94e911.npy +04256520-949054060a3db173d9d07e89322d9cab.npy +02691156-ca4ec545363b3b8e8c2814a4ead9cb90.npy +02992529-97e214d6b93e012f6337fbfda5096043.npy +03001627-54263fcf9d6380d343638dabe1eb5336.npy +03636649-dc8b9cc431acdda473f5a6f6800a3e79.npy +02958343-fc2b81391e185db9f1335b4fef92b83f.npy +04256520-2082b15a24a55e52cc9651014a82e2b9.npy +03211117-a87214036fbca69e84a172a28c2dc.npy +04379243-52c379f93a8ae9de276f41435671c8b8.npy +02958343-5357fd81d212951a1c64dffb0265c4d6.npy +03001627-1d2745e280ea2d513c8d0fdfb1cc2535.npy +03636649-ead77648c9c7dbf8d42b9650f19dd425.npy +04401088-ac6f6437f9e63981b6d41c42f7ade8c8.npy +02691156-fd3a9743e16d35e51fc210a07910eb2.npy +03636649-1e83293107d6c3a92cd2160e449d45ae.npy +02691156-47d677bf1dec3dca82cea33798fcd6b6.npy +04256520-4b7f63ec83da1c25c59508b4e3a82241.npy +04379243-e92bd321064e981e5208aab875b932bc.npy +03691459-f37f4ef72fd0204d839a84b4ae4862d3.npy +04256520-20222a2bd14ea9609e489c1cf724666f.npy +04379243-88ba062b171b4797e30dbde92844e593.npy +03325088-4a44ef4b181f1101b362845c6edb57fc.npy +02691156-bed589371c324e896aa3bf023a2b42a5.npy +02992529-db96e9b2c96c273de7d92dda5756fcfd.npy +04074963-4fae99783aa8706c548eb4d45dc63633.npy +03001627-6870fbd4a7b733b0674f1c30a8cad95a.npy +02992529-320d0f9256ab9cc3a046bbac53886364.npy +02958343-eb56379e243b0e2090da6b3e2ed8b49d.npy +02691156-4ee6a3030995dcd4bc0909d98a1ff2b4.npy +02691156-1e8adc1e176bc68571d03b466c72ce41.npy +02808440-5125de61a2cf9dd2b362845c6edb57fc.npy +03001627-89f5cda510eea57a9917ad57402f53f1.npy +04460130-614ba760fb825f93ad5067eac75a07f7.npy +03001627-27c00ec2b6ec279958e80128fd34c2b1.npy +03211117-111f2a331b626935d82b15a1af434a9f.npy +03001627-ef1152b1660592d413f0924ccc9628e5.npy +04554684-60b8c29d75c28ce214b35a7d7cea7130.npy +04379243-c2e2206394f6de78a78a19ca5a5a5ca3.npy +02871439-98c20af27765a11e3178ebc750d175.npy +02933112-587315cfb22617a1d37a1bae74ee50a2.npy +02924116-e5eef3183d03c4ab4fb90f1c75bb6c3.npy +03624134-f639cff54b955a9b39c78a1e40e247f3.npy +04090263-fbff23bb1043116a92cea77f96988ae6.npy +04256520-6dc235ab4a2c7c6810edd100dffd8d85.npy +02876657-af3dda1cfe61d0fc9403b0d0536a04af.npy +04090263-b642c89b7359f0cb66ab132932374f46.npy +03001627-c69d5899d85eab9c173b9f28a2caa84d.npy +02958343-abda34ccba30a7dd80360680c1602c7d.npy +04379243-63790a73bd92ec04a55e6ad8c321a190.npy +03001627-768ea32d8303095bfe6f9308e75765b1.npy +03636649-eecf97919cea666e67903707764646db.npy +04379243-1539b9a05dd82a3b23adfb9fc6ab1f7a.npy +02942699-45b01c604426a0a9c5c10e0ebb47766c.npy +03001627-659a60740eb6bfa930bbd4cddd04c77b.npy +04090263-6a9fac86136c7ba0f3dbacbbb2e7e80c.npy +02924116-419cb0a5742d8f1ce68a7b2541c35558.npy +02828884-9a87c9d904851205bfcc4c7214610fe3.npy +02958343-39b307361b650db073a425eed3ac7a0b.npy +03001627-8dee8193a06525f51de495b75c95e5ad.npy +02691156-5a5e4590c54a70c6322c168d7a7c32f4.npy +03001627-59cc459b0e75c2ec1142c13b71507bca.npy +04090263-d326ce10d768da152c3271e911ffe19.npy +04468005-1ac8292d6ce89f7452470de2774d6099.npy +02876657-21dbbd17ae4c3fce6a90f735365ac29e.npy +03001627-ba2f3a0d2e90025bb3234e0da44b11e4.npy +04530566-b7d831d7b1dcad77a8596b6b008107ab.npy +04256520-d3c677deb7e829f05728afe1a12978b.npy +02808440-5ab70805cc7ca4be73fd10002dacf954.npy +03001627-923447d348ddd1ff3002761e7a3ba3bd.npy +04554684-5e411987081d3f3af44ef865a534c948.npy +02691156-94dffe91af2c8834fca1f1143bb6bc17.npy +03636649-3c3286722b31c8e2f678c9833bd643c0.npy +03001627-80bad2242183a77df69c1bc654d8fbbd.npy +03691459-4eceec9a386a21ef77818a0572bf1777.npy +02958343-66d89101c69cd1fc1e4f5422b970bb55.npy +02808440-4f14ed9498cd69c6392f36bc2fbdcf8c.npy +04379243-497175f56357e331b4b7c06325f7a2a5.npy +04379243-c6cc25ee47d08674842c47c8032438a1.npy +04530566-ad62a23a7de3965f94daa4565dd30535.npy +04530566-d74ea3567f8861dc182929c56117755a.npy +04256520-ca2204f36a01e3515b943c35c765be0.npy +02992529-e5b629f4a5e7467066ccbd11a6ef0f68.npy +03001627-751d61e1d2cbbeaebdcc459b19e43a6.npy +04256520-218233bd68f5261dff318cdb0cb45ca.npy +03790512-f04281f2440a6821aa213948f4ab1d15.npy +03001627-eeafc14e4e0db2ca3b481215325f1515.npy +02828884-891b8a01ad71af2db7e843606969432b.npy +02691156-3a6f0d1cff0aa524567ab83a85d8a5a0.npy +02992529-e156db6fe3b9286c87cb3c64e47598b4.npy +04530566-f5a0bce67dca5ccbe3de75b155d3b403.npy +04379243-ddb20a7778038d87f51f77a6d7299806.npy +02691156-e899c19c87245ac94c3a35cee92bb95b.npy +04256520-d5a2b159a5fbbc4c510e2ce46c1af6e.npy +02828884-cc7ab68e97b381eead5067eac75a07f7.npy +03211117-cde799eeb40e6e8524d1772907b17f1.npy +03001627-c46ed3a68dcef72039b07b3056a2842b.npy +03467517-849c080c585387e61082f2ea630bf69e.npy +03046257-90fe7c32c11b9a371bdc62787da74594.npy +03467517-364f85832427992343820c03f9f59458.npy +04090263-1a68ec72239a781627f279690428499f.npy +02691156-1a54a2319e87bd4071d03b466c72ce41.npy +03001627-fcc996c2c8ff394194887ea54f3cfb87.npy +04090263-10639ade9179e38d624a9463cbe27c6a.npy +04256520-4e8087f3851d85cdeedfca8b846d3b01.npy +03001627-c5203dae464c264f4e41620d80d9e89c.npy +04379243-3092a18a275497f54b3c42e318f3affc.npy +02992529-c3a90bcecce7f4817b6fd5468f603b31.npy +03001627-fa33e83563fc2765e238f87ef5154562.npy +04379243-a87c9d907feba5e944187aa25305d7b7.npy +02933112-557cf522ec6be06ffc5195fbc9cb6806.npy +02933112-7177dc5922252f1311fc2b865c2a185b.npy +02691156-3cb63efff711cfc035fc197bbabcd5bd.npy +04090263-7e0e797780f6945fc75e2dd4efaea578.npy +02958343-4f31142fb24b4814ff1370452e3a0154.npy +02958343-df5a4ebff89f02cc25508ed649b952cb.npy +02992529-35d370a1531826adbe5693b333a3dd92.npy +03928116-3e2a452e802b178eb72f1eb118b6fbc3.npy +04090263-313b30e96bdbc29cb1d04c72ba966611.npy +04379243-5fc39e0ecc8e50f0902a571380e15334.npy +03691459-7488e7b4b7174ca73b2680579dc5dcf5.npy +04379243-a06fa6a604ddc974ccd77b10347fd7d3.npy +02691156-8eab40ab482a46f04369ac253fd9f7b2.npy +04379243-3b384a4919d180a666ef9dd2f3ef27d3.npy +02933112-d7ec3740a0c67d89f8c3d2002c77ddb.npy +03467517-aabe3066d17c90c163e148e250c0340d.npy +02691156-b1f056090f81f992301e72365eacb45b.npy +03636649-8c4539bca010eae1cd74bafe512884c.npy +03207941-e4d1d33b9aaf1407be92f74d81ff60bf.npy +03001627-ce35ada9c4a8de2fffc6e457221b9271.npy +04090263-4a20928c1570034d77c52b6e87288e66.npy +04379243-87d5a94d81a299401877c7666e1dab40.npy +04379243-9f6388c27485b03adfd21203bf8b4b46.npy +04379243-d41ba8cd6a5b1071c1237601d86c1b5b.npy +02933112-9702a1fa518b960784db07849359372d.npy +02691156-6feb039c710277aabd10f71f04d299c.npy +04379243-90908595d267ed89d970a88713e6172a.npy +04379243-a5abb8bcc70e8099ff39d54f280fc5d8.npy +04330267-4a82d3e205075abdc5f3208c32f3ec87.npy +04379243-9f62189d260cbad33c11c3dc5dc42217.npy +03001627-a896856650a288c0c05575120a46cd3b.npy +04379243-b57f0907adb6a60b391e4d6c585a697a.npy +03467517-7aa29002be26087ebc2f9fd0bfca25cb.npy +03790512-c43742bc6e7dd467e8e23c8de25a6ff4.npy +03636649-12aa829de18f4e6ad5cb6d178687b980.npy +02691156-45801aa10db0636d4694b8455e89054.npy +02933112-1819a4e03dd67e6c59350d819542ec7.npy +03001627-d020eee9e094050ad776c08b6a3d0a38.npy +04256520-dfc8656b5e7e6104feec1f13d2353f3.npy +03001627-c149718d89776eb5f71db1fd522c9a79.npy +02691156-4d84619c0da53326e90916c8815b5c43.npy +02691156-eaccb2ca303223afc503a3776fc280fe.npy +04379243-df1b280b7763abde3002761e7a3ba3bd.npy +02958343-6d79f2cde0340b5fbecf71e2e014ff6f.npy +04379243-3b112cbb833b57ce7774eacf69d476db.npy +02933112-83bb0c92d3ede1e8c59350d819542ec7.npy +02828884-34a1d09b3ec2f05b2056b4bd5d870b47.npy +02924116-3e2a8aab3ad459e5f446f92b52bbd82a.npy +02691156-393cfa7e090b972dce2cec85ea6ae00d.npy +03001627-c8860d4563be0f34f2b7580a739cd4d5.npy +04256520-776c31753fadd5593a1c86745128d0e2.npy +04468005-e92e28a1ec1c9b2dd85b408a8edc983b.npy +03636649-a4b3971680744f7f1742918a871fc8cf.npy +03636649-e6d62a37e187bde599284d844aba7576.npy +03325088-d1a20d867c2b8f459cd6e2005048d293.npy +03636649-60fe504827e96df11fcc6cd2b8a40871.npy +02933112-6e6801ca4a03a1adc672720c52b0e374.npy +02691156-9ac292686a2fcebbe719b5362fe06bbb.npy +03761084-35cdd3a824ada16042725722166b0554.npy +02843684-92f6d4d1dc94f4db973037aa80f5ba45.npy +02808440-a1d69eef3e42da23321831d2245cf06.npy +02691156-8d62d327fb15c9b42ff26728ed9d7bc3.npy +02942699-eb86c8c2a20066d0fb1468f5fc754e02.npy +02747177-f7470d69ce11121a95f577622f465c85.npy +02992529-500fbdefb58e261af2cdad303f49c9f9.npy +04379243-114a55b4647938cee3dff0d5ebb43915.npy +04256520-44a17a70369e803cc7623e33dc7256f2.npy +04379243-fb5d7176752898cc5fceaa39a8353bde.npy +03759954-62854e501570e57f1781e1106734ef2a.npy +04530566-24ab70fe2e704df45b76db9a8a523dba.npy +03467517-2c491c5718322fc4849457db85ec22c6.npy +03691459-1ab52761b829fcb375a3010d3ada28ba.npy +03467517-ca6740aebb04e18bcf414637ee646214.npy +03001627-bccedf688d8e5536eaf288f952624966.npy +03001627-51d67f7174881679f256a8c3e3396495.npy +03691459-47072a1458f35a8e1574d21c0c95092f.npy +02808440-e5f025768acc620dccd0340812259a39.npy +02808440-44094937bf0f806c49cad307d3d06994.npy +02691156-dd48aa92170bdde04c3a35cee92bb95b.npy +02747177-c6ef918f335bb21c5896bab37ddebe7.npy +03001627-d9aa42439dc6f1b1c63608961819b578.npy +02691156-e127b1f5ead603f9a5a118bd15e6e34f.npy +03991062-34875f8448f98813a2c59a4d90e63212.npy +04530566-1f20ff37655c5dd61aa01ae491663d9.npy +03325088-db54ca4101f454a055ced94b11ca829d.npy +04401088-b77f57d319fd864fda5309001d158b32.npy +04379243-bedbd91db5d280ccfebad4f49b26ec52.npy +04256520-cb680d8c4891670d559916e9a5177b0e.npy +04256520-a207c52399b289be9657063f91d78d19.npy +02808440-453faae27faa3cb454d7082b34825ef0.npy +03001627-802c46001be93276283b00891f680579.npy +04530566-c28ec663f25bc97de8bdcdb326f0e57b.npy +04530566-daf5575e801967cdcefe7473eb81422f.npy +04090263-e0e0041f541a646689ea614fce832f5.npy +02828884-a3e3c1bd2a644e2df4fb4dee5181bee.npy +04530566-4bb41171f7e6505bc32f927674bfca67.npy +02828884-8b4314a159d964fdcb2a965e75be701c.npy +02691156-58fadbeceb7e239724f575085333a65b.npy +03948459-9ab3478772766eec803b54e9738b20a6.npy +03636649-bfdfe22081bd54f7581fd19c35a5c8c.npy +04004475-bd6207b442ca86eb5c4cedf67999f333.npy +04090263-394a97c4ca0132132bf26da672b84220.npy +03642806-e6329b09d7920f006f729e50d852de2e.npy +03085013-fa61675a0f92a2ed3aeab48ed64c0fa4.npy +03691459-6ca4143e8b989ddf8dfd947f5413afaa.npy +04530566-486e953ff691d414d8190076748f5b20.npy +04401088-1edc7aa574624ca0200a0406803801e9.npy +03001627-f0cbf508a2f27a16504721639e19f609.npy +04379243-4d7035ed932406819223fc014b68160f.npy +04256520-dbf6c49376ac9591c8e7e2daa5cdb0c4.npy +04379243-fbd83a2ac7a5dc52e915f7ff1872d16a.npy +04554684-d49400b5298fb56adf3a1b0d597ce76e.npy +02691156-a839663396fe378a896facc4c7b99761.npy +03790512-3339fcde0648dadd11d830afc8c91af.npy +04379243-bcb349231b83952a3da27ece6ae88fff.npy +03001627-1a8bbf2994788e2743e99e0cae970928.npy +02924116-ed4554f4c9ad4f1a3bd565c86a477bf0.npy +02924116-494c24cc1ec8256944f9d2f9464b48c8.npy +03001627-9fd6bb18dc21c70766ef9dd2f3ef27d3.npy +04379243-2145e510632056161afe34ec6aa383f.npy +02958343-12cd99c20b1a5a932e877e82c90c24d.npy +04256520-398fb143825e597b960f73850432c28a.npy +03001627-75ea5a697313a8c214c2f69de20984ee.npy +02691156-ce6aef9846db6aa5c1a897657d9a1924.npy +04401088-53ce93c96d480cc4da0f54fde38627c3.npy +04379243-94f9034f0a3e85d3ee881d4feac7f213.npy +02958343-85e54cec1c6808009bc0c5b67eaafbc.npy +02871439-863be573b1c9420cd810b14a81e12eca.npy +02933112-bae2eb7c426570752c91206be77753e3.npy +03211117-ff7333934e9ecd5f681c36c9abb1a31b.npy +02958343-1424d894bfd59cdc65e9f24f8c34a52.npy +02691156-cf4c2d7d836c781e5a59e179e114b9a7.npy +04379243-3997cdee934a9b238eb3bc6c6d15f9bf.npy +04379243-ed36c49874dc325698fc83ea562f5c95.npy +03001627-2e37697d32d085415634c21965ee6bab.npy +03001627-e65d2f0ed75a786a37b2bb75885cfc44.npy +02828884-90d6cf58f5e9ba30c175dd3be8577953.npy +04090263-fae9667f8fb1217d124c90ae3e698e4f.npy +03636649-1edec15a9740c25edf85db41e3677c28.npy +03337140-cfacfc7c4c6a49d5195ae0b4bee7180e.npy +02828884-9e4e83e67a901168febad4f49b26ec52.npy +03001627-ba56f02dee485974c242632b2a8c3129.npy +02992529-c556efeb2bb3df4621844676433a0aca.npy +02958343-ddd5e2bb26c82862b41ac95a0a9b3aa0.npy +04530566-147fd27a40793d7e9bbe4f1047e9e5fd.npy +04256520-ee3d0be16a4499b7d8ce2b7ddb5bbcea.npy +04256520-5d3a1feb79ab7987bcedcb5f4c7257b9.npy +03001627-d661b52c3763eec020768660cf080d12.npy +03001627-e476879972230ca719d8721fec72f0c.npy +03691459-435ab5f43b24f739bc0c56c4d4a1fd3b.npy +02691156-3adbafd59a34d393eccd82bb51193a7f.npy +04379243-3fedf94dd96ccf8db595eebc49c98d3.npy +03636649-796d944631745f69275286bf1f79c201.npy +04379243-190ac74c619a233470412e9b69c8933.npy +04256520-a4ce7b3e633a6c802c5d34a902e568f9.npy +03325088-cef466a7a055ea8a15aea01a869de65.npy +04379243-8f380fecd7c5b0e4cb95bbaeca3ed4f1.npy +02691156-f1b9ff223b5a13719a6e43b878d5b335.npy +04379243-d443a71b6cd1b4b0d0e90ab6c6492cb4.npy +02958343-1c66dbe15a6be89a7bfe055aeab68431.npy +04256520-2fc2409aa962c5553ca57f5648ff1b0d.npy +04401088-3621cec4df1ddf421844676433a0aca.npy +03261776-8f000f5a05ebffc5275a90d0cd7aaf64.npy +02958343-272791fdabf46b2d5921daf0138cfe67.npy +04090263-36392e6edec3c8b59aa300fabdebe6be.npy +03001627-4ab439279e665e08410fc47639efb60.npy +02924116-45223e07115146db5b81bbc42b23c7b6.npy +03642806-69ca190b89d622d6def5bf46a0f0ff11.npy +04530566-e5a3728a3b5a7ecd1d2d2f3b717d35d5.npy +04256520-461772d07ff458d7470846ec41d04ed8.npy +03948459-12b346d7a60328ba9be47ac7c7e37815.npy +04379243-19eef9f0da098279c8bd09537246ca3a.npy +03636649-41e0a38cafd737a87088591b1a3e2750.npy +03001627-52cc5e280c23ea9d490ad276cd2af3a4.npy +04379243-c40a88d13709eba91f30b807ae39b61d.npy +03211117-3324b4a3f1440d7b4161e123a102b12b.npy +03001627-6b4622c4e15b5cc9f91663a74ccd2338.npy +02828884-d55207728b14e543ad5067eac75a07f7.npy +03001627-1bdf0a0bb9db1db68998b3b64a143d42.npy +03636649-c93f10431b324061581fd19c35a5c8c.npy +02691156-6311138687290f8a505ae8d422ba349d.npy +04379243-8669bdebc11a4646618b7927ac6e11ea.npy +03001627-49e265cf00ecff0f59d9b12c05c8f809.npy +02933112-282f296a666fb63dc59350d819542ec7.npy +02871439-7c1982d2d4a240de3848bf8bbe386d81.npy +04090263-425f45023b30fa6ecb88c9db6e396994.npy +03001627-1f5a2c231265aa9380b3cfbeccfb24d2.npy +04379243-a25f904dfbc0fb0331b9e762848db625.npy +04090263-b3ea2d0331ec9ec650544cd7fa263944.npy +02876657-63d98b2654d8d2a2f9411c52486c6e63.npy +02808440-ead316f148fa1b699fd7df127276ed69.npy +03046257-752bc71803170b3514038d588fd1342f.npy +03624134-c0ddcd295d84beb696196068f29f233.npy +04379243-521e51c43fe3def573ae93d3b4dd6712.npy +03001627-a65534c7545a4b3a19fb4103277a6b93.npy +02691156-1ac29674746a0fc6b87697d3904b168b.npy +04090263-9773bf30a8dea97145f791e063652f65.npy +03797390-b811555ccf5ef6c4948fa2daa427fe1f.npy +04379243-c8fff605d821d607ff28aa687ec5e78a.npy +02958343-3efdb762f2663a014c9dc258dd1682ab.npy +02933112-2ba392a70c40dac7c59350d819542ec7.npy +02691156-1d4fbbf681ba892ddeddb5c33cb2f8f3.npy +02958343-e5da1a1fa675c704a2edbcbb0bd69bcb.npy +03337140-ae4c4273468905586ae3841175e518b2.npy +04379243-8ce538a671c6e684d93768e7b9b1eabf.npy +03001627-65f065a51800eaa5cd476b195edd95d6.npy +03642806-ee31f8d77002d8869b07343517e0f88e.npy +04379243-451e66939d40c5be61bfbba8a5defb02.npy +04401088-73d6b5dfb0f2bd8f5c351e299b24e355.npy +04090263-22bf66e440bdb80c3d7c323cf1653143.npy +04256520-a9698105867e9818f91663a74ccd2338.npy +04468005-22de7219d157d442af02dc8e9b049407.npy +03325088-790d92e4614f2f13321831d2245cf06.npy +04379243-fd1cb59eda441efc3a6294a7f35b35be.npy +02773838-2970e5486815e72ccd99ccc7ff441abf.npy +02828884-6ba417deb22dec19ff8d96709474c16b.npy +03593526-f0612de90c1fe7d430612f5c0ef21eb8.npy +04379243-84611112c9300d6b19fb4103277a6b93.npy +02828884-45d52d8c9b100eb54ebf9d56b42b3033.npy +02992529-8aa05d2bb435ab441ac3fdfdb76cf4dc.npy +02958343-f578a26ffc6771b21767453ad70570c6.npy +02924116-8780fcb7aeb4dbe1e2f5e842488b65f7.npy +02992529-78b4f3aa956b52139531a714ad5bf7d5.npy +02691156-8a050edf3d971a617b17a3f88bbfbb61.npy +02808440-763aa4a2281d5a2cb1e4f0ffdb30250.npy +02958343-67c229c70e64a25e69c2e0a91b39f742.npy +03001627-b90720eca9bff16c45c481d507018ba.npy +03636649-c778a6ac6cf0c81d4904d89e9169817b.npy +04379243-cc8217e65e253ffcf51f77a6d7299806.npy +02801938-27f58201df188ce0c76e1e2d1feb4ae.npy +02808440-81a7ebba1f545a4b57b6140a0b345e1d.npy +04256520-3a69f7f6729d8d48f51f77a6d7299806.npy +03001627-9ea7facf01e448f328a1548e344f0e2e.npy +03001627-48d2769e59e4c2b9febad4f49b26ec52.npy +03211117-70c43793136021289261ff87472ba275.npy +03001627-43d38ad2f5d103adf9b9977a2406713a.npy +04090263-8532101879b57af2fa9286f039319ff7.npy +02871439-e382838534662ffaac6f189ba32d2a38.npy +04379243-1b48826b38c2dc0630d4c74109f9e072.npy +02691156-d63bd140efa537dcf73e5bc170b7e2be.npy +03691459-20ac1211f88a8a1878396b03f57f644c.npy +04379243-46e88f122a869874d989c9f989a09ff.npy +04530566-a646c8780e79d091cd079e2d482994e.npy +02691156-b943b632fd36f75ac1ccec171a275967.npy +02691156-6abe0099d2a6efc882401bb74114a99.npy +03001627-ccc4b5366a6dc7c4cffab2c8f8bf5951.npy +02958343-70cf106dd369bf3ac427f8508e3d634b.npy +02828884-7262d96c5817ab55ad5067eac75a07f7.npy +04090263-1fe9e8fbcee0dcc8683e3750b53385d5.npy +03337140-56dc186e01c7056e91c352d02061b3f7.npy +03467517-b004331ee5cc39caa24eeca91f583600.npy +04379243-65b353144d52d75e98d5fc0473d00a1c.npy +02691156-35c8abfbabb0d8ea66b0983c7366318e.npy +02933112-bde4addb689c2ba55841240ed5c62c36.npy +04256520-c8962afab63de682a9ed6dce8b2a37bc.npy +03001627-df8c98028d8ff2435dc3653f8341633a.npy +02828884-39d8fdb56b0e160dbcceec49967c0de7.npy +02747177-9d579fa393e18a0570442b4b3eac5c43.npy +03211117-3c4c7ec7ffdfec50f39105e1e4d2e270.npy +04090263-22e4139b7fd37bda2538e024d06c30fd.npy +02876657-ab3795042c759b6798646029ad91cbbd.npy +04530566-eb1d9a98d4024b2e89d2f742ca991829.npy +04256520-d0ce2d65a1f3f7f0942fb082e747f0bc.npy +04401088-7392ea79052281e6bfbac23a8087e8f4.npy +03761084-337b1db9d85de33b4a73e364671ba824.npy +02691156-7054f98cc8af397f9a6e43b878d5b335.npy +04468005-af418bcf5fa6b22642ca7cc070f21ed3.npy +04379243-bda00a13a1dcbbee908afb10f96957b6.npy +03467517-e25b244880bb40b9cc34b900bb2492e.npy +03938244-f06843cc11cfe791cbcb2c721c3564d4.npy +04530566-ac8a42622eed9830ae433bf4d273c8e2.npy +04090263-b5f4600ef0e9a5a8dd0a2071dde26395.npy +03790512-66fb059b0102f4275a03ed6c9088ec08.npy +02876657-2a9817a43c5b3983bb13793251b29587.npy +02958343-afc23aacd3e166d9f513bf8e198d377a.npy +04090263-4223e38ce99c160724270d533c13dba3.npy +04256520-61177f1b2f1dc0b394fadb3555028734.npy +03991062-43e335f8f080f6df56ffb3d9eeba35bd.npy +03691459-bae089bd1855bcdcfa9922db9b6aab31.npy +03790512-e5747516a94cc4c9e8d78fb938bac492.npy +04530566-133c9fa2562498d28ae10bd53dffee76.npy +04256520-28a77ea1fc6b43f936460820a7040825.npy +02924116-662fc1d9049603e61759ca9eefe0e251.npy +03642806-466ea85bb4653ba3a715ae636b111d77.npy +02958343-54b10fd57a55e249ad07230f53fe98be.npy +04090263-f9564e57bef8a7446c16036d807ca393.npy +04401088-be254a4f3097143fe0e25464307430b.npy +02992529-8b4c89b8f756cc6e78fe949fc1419876.npy +04379243-d309951e04fd344c7b56d76bb19dcf39.npy +03001627-fdd7090f3ca12395a7ae19ac44244eae.npy +04379243-f3cbca2c7a6b2821f4b6538438a0b930.npy +03085013-9acaa3cd9bf7ab64e1b43120579d856a.npy +04379243-3838913e27df8fe5287005440c82669a.npy +03636649-f021d7374cb40f0da2ee802ea6ed091.npy +04256520-9e35945e9d768135d028c2e338a88f09.npy +02691156-bdfbf1c555dacd9d325212819caa597d.npy +02747177-27ed54b7f9c371b72056b4bd5d870b47.npy +03593526-701cb938a050ced01071d664364e92d8.npy +03211117-d83dcf0d435bbb87b6d41c42f7ade8c8.npy +03001627-6dc02b1884fb578492d9da2668ec34c.npy +02691156-87b4476ce2df563972459a40bb821ba6.npy +04379243-3c475d9f0433a7eaad2650d014e970a5.npy +04530566-e3f81331fa00c5f893375feb9c1d5577.npy +02871439-bb6b74ceb3fae8b5de98e4da245e0b83.npy +04379243-2e4715cfffeb76f6e074517a246f1e65.npy +02958343-8b2f030e604925c92a9eb0f146e94477.npy +02958343-a115d534edec6f89afe1d4530f4c6e24.npy +02924116-d23dfcd55f78a48041cefd10ce5d6cc0.npy +02691156-f390b1b28b6dda03dc57b3e43c28d486.npy +04090263-8a669ef9b92912112b38b1d99376c0b.npy +02992529-44cb63b74117f9a77877a964f5722626.npy +04256520-fa0218bd49f8cc6d593ebeeedbff73b.npy +04099429-9dd060ee900f4e81928f48325a5eb64.npy +03211117-e2cc0d50d6953e760a25ec0f32e89e3.npy +02691156-4fe076aa34c706b83d7edb3bb2d24b58.npy +03001627-a97a00bee5585e49f05defab1869a09.npy +04225987-58ab8327f188e0a063381d3d7e871939.npy +03001627-ee20e46c542e2268f51f77a6d7299806.npy +03636649-13b365ef4887f5d388a942de43574033.npy +03001627-f1167a0c4bfc1f3fcf004563556ddb36.npy +03001627-7b86f52727b40120e3f7a74e12a274ef.npy +02828884-8d074f177479ac42628516f95b4691f.npy +04379243-cbb90091d43fabcbd5cb6d178687b980.npy +03001627-70f1f85d47c970bb78dd615a59de5f05.npy +02808440-8a55c7f9d5fc9dac33da1d126caef9c6.npy +03636649-5ec6c52d6d5dbbddded4c23d05709216.npy +02691156-9be01448f3b2b932828204947d78b9af.npy +03001627-40747ff0ea92f134c409eaceb0331214.npy +04401088-8f3dfdb531d1b5dcb4ca066f17bc06cf.npy +04401088-70fe91a7bc072c39cf81faac56233ce6.npy +04401088-f48acd0450cf96cde6b9b562e2cde99e.npy +04379243-d1cf31acd02985bb50efffb055ed6bd1.npy +04379243-1ee0509358dc8bcae19134c8fbb91f2.npy +03001627-5a52b62f564eb7e117b431cae0dd70ed.npy +02992529-3ed359e502a24e5a79510444cc61f839.npy +03001627-1825f6f71e68da9da36af77e45b32071.npy +04530566-f1d39ce0d8c25403b4caa017b521f7.npy +04256520-978c47d21e5c66c6f519adc9991b5f11.npy +04379243-8010b1ce4e4b1a472a82acb89c31cb53.npy +02828884-ab1614b56ea09479d4d8765e3910f617.npy +04530566-77e304ed79aded1e454ff46d89fe2a0a.npy +04401088-6e30906a4d0854e9f31b75c4a94a8879.npy +03636649-9e49915157b79d911735ea0e092a805a.npy +03001627-a4684772b9356ba28fa2f6eb9fb1de7c.npy +04379243-399680cabe38c8e27b3d8399a9d05045.npy +03991062-2e1b664ff0cf2589577bb053711067f.npy +04379243-92d806ba93c283f73379bf463ad73282.npy +02828884-716fa6d69c22db83bc6fbe160acb5d0e.npy +03001627-dd0eecbd7ad89b2563e7eea06f1f07c8.npy +02958343-4510559f5587f601147d1b898220921a.npy +03467517-6c9f5cce840dd728d74aae0eb2ddb027.npy +03636649-89ec7ebc49a312184205db2677c7526e.npy +04090263-760165682193d0d235d753857de68a9a.npy +04530566-bbf1507f7126733665224ccd01ad35d4.npy +02828884-b2dc3053a4643c876ae68b11b0aa337e.npy +02958343-e2349120e4c089ef2fb4628a7a8b337f.npy +02691156-602a71a251857294959a8a7d5a8a5077.npy +02933112-5f7e3d694d47fe6cde650492e45fb14f.npy +02933112-7470935c77e340f31781dae1261f1d28.npy +04379243-afea61dd761b70a3fc0035da39bd5e1.npy +02924116-eecc5e70c70de25f41d068e6df669f0d.npy +03211117-b3f23358467f8c75dc974f7ff5ddbdee.npy +04090263-98fe43e81b9e1b5ed8569d1a6c25406f.npy +03636649-99688a2668fe1fa3cf004563556ddb36.npy +03046257-58507d92c9c0a4f07b79156a61ad4c01.npy +04379243-d01a6b35a54c8f77dd986a55e273fa14.npy +03001627-99fcb202acf5d60950cf3715818ccfe8.npy +03467517-4f401d78068a9d348ee96618ee16ca27.npy +04256520-a8abbef69d380399429c5e5ac1d52cde.npy +02691156-144649df5a5f9c8b5e4cd38353d7ef05.npy +04530566-abee560e2dd721eeb129901f80d24b7b.npy +04090263-d2aef97be32d8118433d7c8e9cebd7c2.npy +02828884-ec4317837dd247dcd2b12aa6a0f050b3.npy +04530566-3970dff155f0a8731aa129fffe673b3e.npy +04379243-d30873e4da202806d42b9650f19dd425.npy +03261776-54bbfb95b752b658c0aaedf10d776af7.npy +04379243-b87594dec9d851c035836c728d324152.npy +02992529-ffd186dcf855e13e26479a182158bae5.npy +03046257-50ad0cdc651ab6fbc6cb0dfa2f14f9d4.npy +02691156-71dcfd1e5d1e261179febb7e11d3625.npy +02691156-bfcc89117315f3da90b1d6deb98feec6.npy +03636649-64eaa45bd2e01db8991ff09eca5b27a8.npy +03046257-ee017bf2df50cf7d5ae4454b5be72736.npy +03001627-2b01a7501dd9780075e0fac069101b51.npy +04401088-2c8699277b2717be66289707fcc0ca1d.npy +03001627-eb7c48d1729fc4ceb04cb542e2c50eb4.npy +03636649-a4c06cd5032733af543df75232f6ff2b.npy +03001627-c6856ffc6e9afdaf680876614ed35a7f.npy +03325088-c4d3c1f18cd11fbb7fed642e5f1ac4c8.npy +03642806-454a88f4b2fe4472f9cacf0b2853f40.npy +04256520-1aafe6bb91e66b1a22e6294dfcaabbc8.npy +04379243-28411ec68714ab87b9ea118461aa8a00.npy +03001627-7fe08cd7a9b76c1dcbde89e0c48a01bf.npy +03325088-5c93abb4d8158919c36fb70296e45483.npy +04379243-a1d7eacfc3e946cbed4671e7b5b34212.npy +02958343-2a844013c66dd19d32e3a970ba4fb82b.npy +04379243-ddcaa720a7b878a4beedb4c8fd29e2d1.npy +03001627-99f02614707ce072e8f8c11a24c52ebb.npy +04530566-d7c58ed725b2449dc570a3d482a3f588.npy +04379243-3249c3ad90085a9e98d5fc0473d00a1c.npy +03001627-106c7f10c5bf5bd5f51f77a6d7299806.npy +04379243-7473f09709d14a2a8d1dabf86742ec3c.npy +03001627-cbb3ece285d9c48ee7e684d25d4dcaf0.npy +02933112-2b3f95e3a1ae1e3f824662341ce2b233.npy +04379243-5aadc1a9220fdbb8349f14616fb49d0a.npy +02808440-a3701a7cf32da91c52b20f433bf30081.npy +03691459-5c4964d7c42cf84bdd9ef3991bf7600e.npy +04401088-fa14355e4b5455d870f7cd075189ddd8.npy +04530566-fc252e6ab475cfd6882046e7e9998f89.npy +02933112-a874dcff3bcf8a802aca02f099166182.npy +02924116-d1f70630a6dd39ab5c3e3ca6678c6811.npy +04468005-91abdd972aa6223484e6ee03d2dfc5f7.npy +04379243-764c1145134d658275e36e88b6617f01.npy +04468005-76a0286bd59daf33ce5aed93ba1467da.npy +03001627-c67a255a26e30abb6b9f3980da0b1dff.npy +02992529-2bb42eb0676116d41580700c4211a379.npy +02871439-f265bb0c3d006754c397356311cbeea4.npy +03467517-58bb21c325f021088f01c8e793a6e062.npy +04090263-5c960809f4f0424d217fc13ba9e6b2fc.npy +03467517-23d3e315f1364475be98a7e88127164e.npy +03001627-53653524f2ec502e8b2b8dc0c816caf.npy +04256520-7402b0be6d04b45da5f9d52c12457194.npy +04379243-244955211c2f3b94b821b834431f4e0e.npy +04090263-67c285f5c701d6cd8ea092ebe8f64ae8.npy +04379243-4f3b404cc30d2306b96ac7572d4197cf.npy +04530566-3583b3e2b8dab3f29d8ea13dd61813ef.npy +04379243-741b91f2187d54792d4fd2b0f2040d45.npy +04225987-e7a5dd6f6ac650977cbfdb97d3d9f05.npy +02828884-3c90d2eda6fdae1fbe1638d01f5577d9.npy +03001627-994dccd2cb784510a6fee8e2140acec9.npy +02876657-3999ca6a50ae47c876b38b4cbe0c74b7.npy +04379243-a63f58a27c22886a721de3dd14942a.npy +04090263-88b978e04c343d25c11d80527540607.npy +03938244-81f8252de176a440f37af16b2893f1d4.npy +04379243-3d5f5cf765767b0fe8e2c411e1e93d03.npy +04379243-b360448cc4b230c672745a2d9975c702.npy +04379243-9e2318099f77d3df3527ecfeb345775f.npy +04090263-30195a2d2fe56a1f6887cd98a5557c7b.npy +02691156-12f3fb99c95c6a7357891d676f728bc0.npy +03001627-7729a6ad96985f4ed1ccbd5d84e5bc86.npy +02992529-8b17963baf2e54f87a0b781a26650bed.npy +02691156-4f2830d3d566220be5dd38f670a033a8.npy +04379243-5cbd726c3ffd8fc49b458816be7a3962.npy +03593526-cec74e921815d1323785c1af944402a3.npy +03636649-5cca570916f420e64b3c42e318f3affc.npy +03001627-fef17c8f92673dd477b7d69aa83ab6dc.npy +02691156-73bcbc2d147291451e7b1f533ce75.npy +04090263-7f41235f55f396118aa27cedfe9e8bf6.npy +04379243-e897ac13dcc0adfe456cbf78e1e89022.npy +04468005-96aac69e5f77277fa0e49cc1ab2aa478.npy +02992529-3a8b1287aed892ba5661e3450b04a6b4.npy +02691156-9e998a06601e9f944b2bd73664dd1844.npy +04090263-3ff0d95df1076951385d661539b5c1fc.npy +02924116-969b8fb8646a799d9a6127d91a931eb1.npy +04379243-8d45802ef679d08a1a3b40747093a35e.npy +02958343-ad4b1cd62d72089e200c039929e0446f.npy +04004475-6bbb7abe06ab037784d5f12fa5114b4e.npy +02691156-464879f87b67827af268234accd8cf4e.npy +02958343-bb7ca919b59a3a2e6b418c7d9fedcaa9.npy +03691459-2c44213112c85413f0c1015881a0926c.npy +04460130-28685f1adb96fb1eb6eefc259009d337.npy +02924116-339007af4ac0e349b1bb46d2556ba67d.npy +04379243-541087bc5ff0e0bb349c13532142fc61.npy +02691156-95240a3e33d607bd88803e631d9fa455.npy +02691156-1678946724380812de689e373096b0e3.npy +03991062-2dcd625ed44bbf1625ebd1cd0b422e32.npy +02828884-44d2f4786d18667a86d0ad6addf83b07.npy +04379243-b9a0e6854bfab1682db9fca4b68095.npy +04530566-9e3c0b7fb69ec3997cd1f8dd6fbce8fb.npy +02691156-aca6b424287392cf3438e17bc657daf1.npy +02691156-c1e6d2235406d250e9ca68dea406967d.npy +03691459-4cee7bc85dae3a58d6a78c624f639b3a.npy +04379243-cf97b60fbf85b0656f236f75bfa0f434.npy +04256520-c7e3aa97aa279582febad4f49b26ec52.npy +04379243-e53057e1a9f6f135b97ad864945165a1.npy +03001627-1dc63eb0c6b1102f5369e32fb818f337.npy +04256520-24deb13c2dd93649d329896bbf26eda9.npy +03001627-1bbe463ba96415aff1783a44a88d6274.npy +04379243-adb934d3f4ed9dce22cec5ca16c50ce.npy +03001627-11740d372308f12185047f9f654ddc2e.npy +03624134-57a636a6a66cd955f16c469ffeb982e.npy +02958343-eda96319f9f01f998496c87dd2a4075e.npy +02828884-473655a56670e13dcb2a965e75be701c.npy +03001627-f23c1bb951fa8909bc01640b1b5116e7.npy +04090263-aad0d20fb05f8fb0cdbadd1af48b5cd6.npy +03337140-7176a2f2662a410558df8eeaf3dad1c.npy +02691156-53789eb9419da78c19bf80b167cee3a3.npy +04090263-83dafc89711bbdd68cb93ad688d1ab8.npy +04379243-20b8c6959784f2da83b763ebf4ad2b38.npy +04256520-89622aab3cd599787088864e604378e7.npy +02958343-5c3fe4057ef12b6886ac29addefc0f11.npy +02958343-9e4a79d30930cc2fcefa74f1d0bc6e6.npy +04530566-8d7af39621a060ef6483ed11b9134e43.npy +02924116-80437e427d0e38d6ffa4d8d9b47d3a6.npy +04379243-813599653f44dcbf245495d3641f83a4.npy +03001627-81e60b07ea1090bf58e4244f8066a2ba.npy +04256520-bf16681e4b86db58ea07fbd08eb87bf2.npy +03636649-3784e4624e880e3d1735ea0e092a805a.npy +02691156-aeb10a6725afb1abc79f92df566f8c6b.npy +02691156-f998bb1b62da4d06d3a1a47fb9b678.npy +04225987-c7482cb7a8db514921cafafd7e7949c7.npy +03636649-80436dff2a30721849655ac7c771b113.npy +02933112-bc7973150ac25b1ce08dea88cca8641e.npy +02958343-45d94dee6634efd516abce8cb03e7794.npy +02808440-90abc75db76e80e244221bef0fa3c36b.npy +03001627-323fc7b1d2b44cb7ff2b8acf844d34d2.npy +04090263-268b57eb7dfa94a55eec6d8d24f1fde1.npy +03691459-aa293b3c1b4f1509e3bf55e5ac6083ca.npy +03642806-66d47a84a3d522dc9311bf79d4774e73.npy +02691156-5b985bc192961c595de04aad18bd94c3.npy +02871439-3c8722f2c0cba2f1788f926f4d51e733.npy +04379243-d58ea40d8a5c8c0c362f4098f2ea31b0.npy +02924116-c279df97ad444bf8cb2ecbd32dc2119e.npy +02691156-870dc1667e957672c66e7238ddb322f4.npy +02828884-807f68d665cf7b0cf4fb4dee5181bee.npy +03001627-250ffcc789426a255f46d55537192b6.npy +03001627-8c76176c82e3e42d283b00891f680579.npy +04379243-f96aeb7884a318bee76bc197b3a3ffc0.npy +03636649-63ca3763b86aaa4daa29ca6a13991ec5.npy +03211117-901170b0a4cf30e746407779dbd69b2d.npy +04379243-654d6b82543a863c3bd24f986301745.npy +03636649-7bc039fffc79dec9e680aea9bdb841f9.npy +04090263-7ca6a11f827014b4643ae903098a314.npy +03001627-b54ae988f5bb6c6b3efeda73d60343e4.npy +03467517-1508f193f91760f4ff04617a8348dcb6.npy +02691156-55cdb0891d7a05fb2217d56276f279c.npy +03325088-70b9b63ce547031276d20e73c57c9a03.npy +02691156-769efbce0af867807456183f198fd1e9.npy +04225987-fb1ad690d8befb5a74bfd4c8606b795.npy +04379243-d08ea9c1e5b9c2687bcae7a654cc37.npy +02691156-8f4c92227704fdf11c568754310e5f73.npy +03790512-af2648ef08812a0aa747c19778aa6cc0.npy +04379243-40343df799bfbc12c506ad4a52a913c4.npy +03211117-34808bb66b2bfa07ab7f9d2da6fc61cf.npy +02691156-48a0d4cb43c961165de04aad18bd94c3.npy +04256520-7c31c4d88c67d094b3c42e318f3affc.npy +02992529-e70ce62b41a598dba48aee3bc134fbf8.npy +02691156-ca11efc8928c10908b96ae1a0a8b84ec.npy +04379243-c302d8053ed38c06b589fc18f8d1e43a.npy +03636649-7124fa42397a447c34db027e489e649e.npy +04379243-a7197c1bd1bd1e47f9715dc5d7dc0802.npy +03759954-b5f84612f4afab9127454bdf69cf23f.npy +03001627-e9651bd689ba5c14713decb1a0563b12.npy +03001627-e64630913e8b723c23ff850238a15b07.npy +02808440-712d9397ec53765f9e25afd4f06934a3.npy +03624134-d63521a0dfac9c1f342494fa6f09f376.npy +03636649-cce6476ac521a1d130f6e0ede20c4525.npy +04090263-144551f27b55f6d69127cdd763fc899a.npy +02958343-ea6d538fb5cf3c0bacdcbcbaae0ea58b.npy +04379243-ac6b9f1d494c9a007ff6ace05b36a5.npy +02691156-c1e081e8b97b3fc7ca8607f540cc62ba.npy +02924116-d5c8e754e1575799e787217f33881228.npy +02747177-de2d9b57b6bd695c6ef50a3361f29610.npy +04401088-f63a0d0c33f7a0c69a83e6b4ae8b154f.npy +04530566-13b7b299d346020a4de203ef6842ee61.npy +03001627-453a678dec4e9d40f36ea1eb6542fe7e.npy +03691459-2c32c107198ac36d37bf4b78d36088c4.npy +04225987-af4343c5b78b70b11082f2ea630bf69e.npy +04530566-f39ff9453d6247fd5ad805579cc24068.npy +02871439-f7e50a524e4c0120f5e4af71271bcb89.npy +03593526-9bbc7da5313433c4af93a86670701266.npy +02801938-2294583b27469851da06470a491566ee.npy +03211117-95832db2feb0cc7ce441f5bb6f88ca61.npy +03211117-862ac718bed40aef2715de3ea7b582d7.npy +03636649-771d4def2e44bc169eb34048e600e1ea.npy +04401088-3d5487efc1d3442ce81f45a785365b0f.npy +02933112-53b396d2ff7af087d01673c7c57450c9.npy +04379243-9afa121e3aec8bd7c387f328a37d8ece.npy +04379243-cc53e7b618721da04b0c98bb5e7fbdd9.npy +04379243-f29863d2fe8863d4195b8ea6a366e14d.npy +04530566-c06ec9a0e32cfd11abdc408c54a4b577.npy +02808440-a807c9e7d931552198e5dcc53f48a2f5.npy +03337140-f2a535d237557ec26795ef8bd10c984d.npy +04379243-c245772cbf233578164e1349afbd1b70.npy +04090263-38cbe2bd51cfb1e47751f287348e54d3.npy +02924116-5376e60ac978731b3e0663c649d74521.npy +04090263-4696d7e82c49aa2a7b6175b1be6bcf01.npy +04256520-47c991f72eaa53c6a8737fcf23389014.npy +02958343-44bd1920adb5fdbb473f10e6caaeca56.npy +03790512-c2f26a9646369c6d373c34785838ee4.npy +02958343-29793366c4b45bf6f43c51e53897fea.npy +03001627-8ec16015c0956f847acc6457762e6ee6.npy +03001627-d46e16509b1c91b3933dc172307a6bb9.npy +02871439-51afa4e0aa973f8e8798cb61bc1bf943.npy +02924116-6198a0042a1fbd8e096abd9da1e14da.npy +03467517-9019d3332cc8fa89a40020a6eb12ffd2.npy +02691156-aff5f5ac9dbabebee5d07633dda45110.npy +03001627-e34658debcd1644dc8687ff9b0b4e4ac.npy +04379243-dc68436ab1a576f6573d2c9ac4b23fdf.npy +02691156-96ee3ab4413dca5a48d2ba4615e03b21.npy +02691156-2b8bcb6e208a69b16a3383b58c4a9330.npy +03467517-a24d5a44843f54ee26587cb13c78fb9b.npy +04330267-74b1c02e8862abdf1d1f7b2cee80fcdc.npy +03642806-4b4dee079f46cb516b99fe64076e852d.npy +04379243-bce971ee4e980b77e3f7a74e12a274ef.npy +03928116-81412f3a04fb62c39a595400278b1b6d.npy +03761084-c57ce5ac1f4f5e127bae653f822044a6.npy +03624134-cae0a0c69888bde2daf44b37a13dc4d9.npy +02691156-bf78d2e27a671fce4d4cb1c2a5e48b7a.npy +03636649-69222648c3e3ed986c348bc129690193.npy +02933112-737fc2d91572a9032ea98d69e91ba870.npy +03593526-70367e4fd1ad753427eb00c151c6f711.npy +03001627-2ce61518f138b7f75d009c98a5b96836.npy +04256520-4975537eb678cd54ee8a0a0ef14611b2.npy +03636649-fb2de79ee3a257eaf8f5708c6c7585cb.npy +03636649-a3b93f34b7e36cc52460e48c67c108d4.npy +02691156-df1c68e94259c6cf5c7319b71bdce6e.npy +03211117-78f69254fdbe4cb4ded49d32c1b10de3.npy +03001627-adc76ddfb1d619a25dc3653f8341633a.npy +02828884-e5b1626359c609a59d297e74104d3ac3.npy +02691156-1482d7a9e529dde7340461a254c1a95.npy +04379243-6281381ce38aa988de98d10ab5975b59.npy +04379243-45363f30a1e16c215963245f0923337f.npy +03001627-5952c6c49ace76c5beea20858a99d5.npy +04468005-fc3f81e5a2bfc2a08be7c8c5fdb9bd6d.npy +03001627-20eebdb573142c4eb0a9829865a5e240.npy +03593526-ee490d76aac9cf342f2318fdd66be40a.npy +02924116-ed107e8a27dbb9e1e7aa75a25fcc93d2.npy +02691156-e41c5719ad09055f1b880c747ee1f83.npy +03001627-5482bda23163df4f30e916fac260c672.npy +03691459-9f242e37099ac424c3bf2ffa047e96ea.npy +02818832-5b584c8178fff5bb77fe1aa9b41a89c5.npy +03211117-1dd8b03b590dc0ff9470c43f253f33ee.npy +03691459-40b492e1a0fb0860e2f05bd11e1d1c68.npy +02958343-41b4832983f44aa3a7fd25564c2e888e.npy +03001627-df6ca774d390755cbd18e74cb7446915.npy +04530566-bdd8d8f6e6536c0d4d16452ef1302b59.npy +04530566-6a7da232456b16e852f03e17d84c12b.npy +04379243-677f0b4f9c5398caa3e1d5a29d2bb5b9.npy +02691156-3a3403fb14bdb46823e79e99b949a341.npy +04225987-c8aed131dd905c6e1082f2ea630bf69e.npy +02924116-6312773514521960f5770725611ee0cb.npy +04379243-1e90d86b5649720047f453c4a13e89b9.npy +02691156-e4e1b542f8732ae1c6768d9a3f27965.npy +04379243-61aea77ab9adadfb3eeddbccbf885e99.npy +03001627-d481cc9e7d6d7d64baf5b49ad7809302.npy +03211117-6c49b516b04e89a15817e30de1dabac4.npy +04379243-feda1b3bf39743d8f16ec553491baad7.npy +03261776-51245ad5a0571188992fd3dac901d508.npy +03636649-6d15af6141ea7c918bb3deb7fab7c9b7.npy +02691156-3576bf753aea3dcf661f0ad700067cc.npy +02828884-dd97603ce7538c15be5bbc844e6db7e.npy +02924116-8042307e75e578ec80b4025fb2dd9473.npy +03593526-aea1a8fee02c011db8183a4a81361b94.npy +04256520-c365bb7af1fd9fd490ad276cd2af3a4.npy +04379243-a01e8ade2a92a0eb35836c728d324152.npy +03001627-72cd991e81a34504d838ae16242881dc.npy +02958343-72ba2195087f80d8b7e8c57d131d2ca7.npy +02691156-d59cd5f2012a1ca1aae46a5cc955c766.npy +04004475-e5b8c6300b1338c95cc4187bd88e76e1.npy +03001627-9849c890f3bc80723a4642fe4c259750.npy +03001627-d311e10015f19bb7482d5f087974fa09.npy +04090263-4bf3fd740498b489a7d276ed256acd94.npy +02871439-c758f0524891b18110b7af17eb4b15c9.npy +02958343-ec9f938ad52f98abbda72093f9b5aa73.npy +04379243-37e1a5d6689a83d3b03169de4ffd172b.npy +02958343-5a9cb2d24a3591aa27fda8a7465c0e0b.npy +03001627-1c3f1a9cea91359c4c3e19c2c67c262f.npy +04530566-ea940968d0ba131e7b66b8fe985fb060.npy +03211117-5e64913f2c74cb4825680a002b1d7d67.npy +04379243-7b92f6facc2a27bc84cc0348a73b80c3.npy +04379243-618469f067751604b0b9d11504ae34f.npy +02828884-5a86b8c93baf8ad0a9030dd33d75b731.npy +02828884-49908190a4206224f28732697aa0af57.npy +04256520-e8d6ed94c67d6f43708fed31e484f9c0.npy +04379243-5d38978fa7591a3465a50d0cd9008f5.npy +03001627-8c0a0360a7353ec26dd3cca80cedd415.npy +04379243-308a43b7ad3f8c2bdf8a6816927a07f4.npy +04256520-2bd1439924492a3fcea6c8d9a419e8e0.npy +02958343-d20990638711f55967bf54a1f364120.npy +03759954-2b717a6fb2aadcf9a22dab393015702f.npy +02924116-bc1c76c847e4dd6a28c978a3d9ad6d7.npy +02691156-e0a8ae255ed47518a847e990b54bf80c.npy +03691459-368d30ee72c63a9512da48a027621f2b.npy +02933112-d8cd6611c5f407cdbe81a9109a782712.npy +03001627-7eaf212097293229fd3456bfc7553c94.npy +04379243-32761afb4b1eaf31810493eb9cc85e00.npy +04379243-6c026a5f412f0b93002761e7a3ba3bd.npy +02828884-812665596d6c13b1adeb1694faeea26.npy +02828884-29fafe9d3b95e324535e3a87e2212e35.npy +04401088-ab4ddf9e4130d6b560cc5a290ea3b31.npy +03001627-790d554d7f9b040299513f98ce033426.npy +02691156-48b99ae8fbe0762a8ed04761eced33c6.npy +02958343-89eb1c5370b80567473f10e6caaeca56.npy +04379243-6d4128ab108730f1ab610b0c94236463.npy +04530566-aa0e4a79926c68f9bba1d36dfe35a060.npy +03001627-752102fb466042576a63d6c64bf6b56.npy +03085013-980ea79e2dab7a595f4027209dc8065d.npy +03761084-b546876ab51eb402203eb08a0c3b4355.npy +04379243-8eb9536af97f1aa05608802d2be44a9.npy +03001627-a643edc1849558eba81634d14a6ca786.npy +02691156-7f1eaf37fb4e24de82cea33798fcd6b6.npy +03636649-17b083510f14982b7eaeab1f0c9120b7.npy +02924116-303ae4f0f8aa96472889da66a4dd79e2.npy +04379243-c399ed276ed35cb9a6ce08f0d82ba063.npy +03001627-6d866b3d22082b89191c3762b497eca9.npy +04256520-f3e10fe9995b4f864b3c42e318f3affc.npy +04379243-ab5faf4dc8b23517ded06cbcf08b2fff.npy +04256520-14b9fdab8d264fc214038d588fd1342f.npy +03513137-190364ca5d1009a324a420043b69c13e.npy +03325088-e45586f848a038243321831d2245cf06.npy +03691459-17c5950c89528703225f3f0d46b4fca3.npy +02828884-667305123da07968d2b12aa6a0f050b3.npy +03001627-ec454747a071b83291a302a171d24a87.npy +03001627-431ca0621cab1313b0204d9cc6bc8619.npy +02992529-180ef1cc23b96050bc8c03f74d3af56.npy +03337140-d1155a28ca74dac83c4f66791e25960f.npy +04379243-7b89037bf1695628eb03e749ccd7a541.npy +02933112-da3a71168ea830dcc82d9accadcc9c9e.npy +03691459-ee2d8d72b555df84ad5d27efc990ebb2.npy +04379243-b2cee79b97104212aab142a21aede3bf.npy +04379243-9bd1c242bd66d2fbb63c01786992bd2f.npy +03467517-d157227240617cac755f5f999c69a058.npy +03337140-d0b6fb93a69beffc4c3aee8e9d3a6ffa.npy +02828884-49d0d178976c81f52056b4bd5d870b47.npy +03636649-75ae2c70aaf3c818d9c283deb7cdce0f.npy +04401088-2a48a703451da580555dee99eadeb47b.npy +03797390-85d5e7be548357baee0fa456543b8166.npy +02828884-9e5a16d68611c57cb2a965e75be701c.npy +02958343-7b2c86b542f822b1b8cf782e8c539948.npy +02818832-af2e51ff34f1084564dabb9b8161e0a7.npy +02691156-79a62c385180cc51da67790f4274f014.npy +03001627-8fed5abf598c5d113379c738ca193530.npy +04256520-8e4999f0e6bbb791f51f77a6d7299806.npy +03636649-5f901ee60f9c0d2c6297030373bd4c3f.npy +03636649-64c393bec510aa63c83f06951aa9795.npy +03207941-a4576a087360458a5194936fd57ca90f.npy +04379243-94aef6e5634907b16ed6e9e08c602c83.npy +03001627-499c4b519c708ae84cd08aa7c510fb85.npy +02958343-53125271f866288dc8b3f3d7aa7cc0c7.npy +04256520-6cbcf4636ee5593f75a82b88fe6e733f.npy +02880940-fa61e604661d4aa66658ecd96794a1cd.npy +03636649-d7ceec3ad0cad8093164c8a6f66d85d8.npy +02691156-73934196c92ce472f4a5531fe6556d72.npy +02933112-3724c3633a0db0c260a7085510f65cd6.npy +03001627-ec91b1b29b6bccd37eaeab1f0c9120b7.npy +04090263-e0b38e1386eec67624c5b9ac3d3770de.npy +02958343-4145debb6cf68ec0afe1d4530f4c6e24.npy +04379243-75e24952ed996c1072dc9d42e683347.npy +03001627-432ec0e5f2a07ab8795bf1abcc63e867.npy +04256520-75850c6e67073a2a593ebeeedbff73b.npy +03001627-d9943f96dfbdf331b17743c18fb63dc.npy +04379243-8af24cacd38e9c0aba5342d638d0c267.npy +03636649-eeffd79536a7ab3e597ff152ef65c9c3.npy +03001627-2ca371de1093a3867c9386abeb61de4d.npy +02958343-98d4f1e36d400acf5fd7e9b026930cd3.npy +04090263-b72ed7c7239e7bfd8e62f59b444d701a.npy +02958343-f9c2bc7b4ef896e7146ff63b4c7525d9.npy +02871439-72b84b9b53fee78c664b3b9b23ddfcbc.npy +02958343-9fbcae2f132db088b09b4c3b88665c4c.npy +04074963-98f33f33eaf6ccd3b09914703fdadd6.npy +04256520-53c1b173913bbc2b63d467b618e97922.npy +04379243-2bb137095c73ef6fe45ef4135c266a12.npy +02828884-28353d39cde416d0ed49e2c2d58fcee1.npy +02691156-a074750e28ed3818203936772104a82d.npy +02691156-d1a8e79eebf4a0b1579c3d4943e463ef.npy +04468005-95cba66f344cca89bf3ccb21f1908cc.npy +04379243-983cd9caf65adf1ddf6cfab91d65bb91.npy +04401088-8f049b65309d8390f5304dc8cfbb76e1.npy +02958343-7bf95b4dad8c1244d928f30a3aa85f67.npy +03642806-61972112749c9beeb95c80bb1ee18b0e.npy +04401088-5286f018c374d3ec3f7fe3cbfc3d51a7.npy +02828884-f60378083ea9b7fa5e14e00a99d44acb.npy +04379243-7fc3bc8542f4c17ce4511d9a59e40339.npy +03467517-9358f81d204434db1cd605219498ddaf.npy +02958343-39d161909e94d99e61b9ff60b1be412.npy +03991062-1ab5af367e30508d9ec500769fff320.npy +02691156-7855e8ac604ae162bbf3143b1cb6076a.npy +03790512-a70eb1b6321022e260e00ef7af003fee.npy +03991062-16e6fbacfbbc4bcf9aec59741c69cf7.npy +03001627-4447ee47cd2333f6349bb1cbbf9a4206.npy +04379243-9ae98c4b9fc07bc1beedb4c8fd29e2d1.npy +04099429-eff3a27a085e02e5146be45f8a3c1ff8.npy +04379243-6d00c1008f41a099eaf288f952624966.npy +02924116-eea7be530ab0f33e41cefd10ce5d6cc0.npy +04379243-114377fc17eceaae3e12d7ebda60f8f.npy +03325088-dd4f5eff165c85d8200a3881cd915629.npy +04379243-692e96270191113358df8eeaf3dad1c.npy +03211117-65582f49b9191ea805062aaa3bb7665.npy +03467517-6d89c3abfbc99a29ca3b1d47ae5d14fd.npy +04379243-27ef271434e2ab43f07fee5fc5c45ee2.npy +03642806-75936cfb6c3ee142205444155ae5c84d.npy +04379243-61527f3ea1741800c3bd24f986301745.npy +04256520-bd199c38c0fd7602c9f722bbac7c6194.npy +03642806-5d544ee4b094c6606436916a86a90ed7.npy +03928116-4f3300cd29c8b45eb1a6bf6b45cbdcde.npy +04530566-a0372d1c35e531e7130b54be1fe602e.npy +03337140-9c36412009d5311e64d8b0368afacc65.npy +03001627-a56e201584ad5afb61ad1cb92b23bf5.npy +02828884-486535f610428612cf078dc7b29022e6.npy +02933112-b5a0f4e52687b87ea5cbb6810d19a105.npy +02691156-64cb683afd5e9e559db1d21b460eacef.npy +02691156-da12fdb456d5fb588b96ae1a0a8b84ec.npy +03761084-495543ebd719a29ceeb8d422649e5f2b.npy +03001627-37c5d67f97a2231cf51f77a6d7299806.npy +03001627-4e1dae6ca4f220048ee0cd746086d989.npy +04379243-d477a17223129fec53227dcd0d547ba6.npy +02808440-2aadee812a70aa79fb3819b3d3d9c448.npy +04090263-190ce4466c6f4c04fa9286f039319ff7.npy +02958343-b87ae16029527cf3fa87597d91a3e9a2.npy +02691156-a6a27c5acbf70ebd3df325aac2f73830.npy +04090263-cac1edcba53ae3d16b2c8bb96250e4a0.npy +02828884-d27d44b023a8ac1a54457eecf7344025.npy +04379243-bf293b370275cac173eb02f1d995d891.npy +04379243-80ad1f839582d183fbf6f493308acc40.npy +02924116-3ad9c664f9173bd33746b762571ee4e8.npy +04090263-57972c646e88289b7f9e2c1c83736d47.npy +04530566-3ff7e02233affcc350eb615eb69452b.npy +04401088-fe9d97823a25e56d95e43220ee0eb824.npy +02773838-22b7d6fa819d62aefc69b7db9c6d5ad9.npy +02828884-fb2627957d4cda1bda31ead4cf13511a.npy +02958343-f1eb3f6c5a5313564c7d8ebbbb68f5.npy +04090263-c4f95f531b5ab758b91a90edeb58ed0b.npy +03001627-6ac89c723fcd7a55467971b4d8320221.npy +04379243-89a7bd3d0af7be05104a4ca1203542b6.npy +02828884-c33adaafb71b0080582f9c2e887b930c.npy +04090263-c518e4b872a0841e0652a919e7ad7e6.npy +04379243-954ae626fe09e5ccd5cb6d178687b980.npy +03001627-4011b7d293cbeae11890f3b4ec900fa.npy +02992529-d932fb5d06d5e4f8da8c8a88ff86c5a7.npy +02808440-b46801f946f4dd403af30a3946d92feb.npy +03001627-b8fe0dd70bae3a9dba7a8c9ac8add14.npy +03001627-1e6cfd4bfc6270f822b5697e1c26fdf8.npy +04379243-59f4f7f1f7cfd0f3831ae64559c8e0b3.npy +04256520-9faefdf6814aaa975510d59f3ab1ed64.npy +04379243-11a559d19457ea3950cf3715818ccfe8.npy +04530566-183054ec6b2665a38b2b48d71cfe16ab.npy +03636649-40c778a9ff366c2bf36ea1eb6542fe7e.npy +02933112-b34ed11766d80175f40dbe27bdacff57.npy +03001627-f55a514cc8f2d255f51f77a6d7299806.npy +04256520-85644a68a1d5f4cbab610b0c94236463.npy +03337140-3c68117a5d4e9d5814d271edcaaee8b3.npy +03636649-4f1199474ab8c9b240cd51e913c7ba8a.npy +02924116-8beee0018157032415b08060dfa6a939.npy +02828884-86059f6fa56a8c5e44175b4dddf5be08.npy +02958343-2c8e9ae34ce33a40ab2c2809513f396e.npy +03001627-2c149e5ab744616f60ac8f16dfbc3b59.npy +03001627-e76457b55a3c041cfe49db72b6ffb2c9.npy +03001627-953a46766108d4e01f60a203be892cf2.npy +04090263-4539958ad62e662ed197ecac88773a00.npy +04401088-fa98d507d82d325c80202e5aaf48e957.npy +02801938-2bcc1b8bf5ac9ddc97e30bfe57d923fb.npy +04379243-84a354fd068a410d40719bb3f7e29ad5.npy +03991062-a09c1936162854e6f66cfd1e680c17b6.npy +04330267-acef3518b152a08e5645f04397aca2cd.npy +04379243-e56196f67d724cb892f4c88fd91c6b1b.npy +02691156-f533dc37778c6f004c949161e83c47b5.npy +03001627-691b10e17ba828e2b161f36d4e309050.npy +03991062-bde637cdefab785d51fe629e42afb50.npy +04401088-54de8ee661787c1d16d46ee44c40524.npy +03001627-8d14cc01f39f2679a857215a199c2ecb.npy +03001627-8e9247a97fea8e0caab901f164e48538.npy +02876657-e7714b3280fa7f925b2cc658332a8e03.npy +04379243-5c0810caed3ca0f83bec56bff764ba78.npy +03001627-6a6f0168ce551ebf40d341bbe0ce6dc3.npy +03593526-4fbe0133d0df10ef5636a727f8e7b7a.npy +03211117-30fc571d408b84cd6315023d0bef39b6.npy +04379243-55104b3d3c3f853992bd9b46d18a6c1b.npy +04379243-d03256544371f1eafa6e1fd63f4a1c35.npy +02691156-c049dcd36058a87e75b7e61db54ffec7.npy +03001627-389db7fba32b71182165c54dcecaacb4.npy +04379243-d8be4b45afb21cf1616fb9ab42452112.npy +03001627-ce23daa630833de7d9fad8aba2c312b7.npy +02828884-c005e1da092925e5aa3e4791e7582e61.npy +02958343-1da433472693082a3b03cab05e253d9.npy +03624134-f4dc11f89dd2d21eccd82bb51193a7f.npy +02924116-c5d30dc6bcabbb56ceeb72b524f3e0ca.npy +02958343-709d6b2cf528e10296d1882ee61d6c58.npy +04530566-a8f5ce05ab3aac91cbd32f07d6724eb4.npy +03211117-be2f04d1204c86d4db70fa8937c64733.npy +04090263-e57dab2d63693b0280c2e60c312b0f09.npy +04379243-19354bd08463173480f6183c41836dab.npy +04379243-2e13d82c2dd5d0714251f7ff551cfb5e.npy +03001627-5c027016e14cac15ffff2fb60b0d6e6.npy +02924116-92d0fa7147696cf5ba531e418cb6cd7d.npy +03691459-9a9e5e5e3e034e74fedde756c9eb0eaf.npy +04379243-426fbc6c365147fb6430c2c15987e4cd.npy +02933112-a82276d1ca28e11a4d87481e09b681b3.npy +03211117-80976fe087ec183f3de42699b619b796.npy +04379243-da8ec638b64227066d767b6d0313d349.npy +02992529-58c6118bd15ca3b48dd025faf4cea27d.npy +02958343-a2b3346bf52d4d5acee5b7ceecf56d71.npy +02924116-54ca4c3ae9913db82e255cf9f3f0b410.npy +02818832-560854f624e60b6cadab4c26397edfab.npy +04379243-e9383126d043156fc1302d82d108316.npy +03593526-4784aeb9d867aa83f685327911e7e258.npy +03467517-e5c64af35ff60ce069da8e7f9a803d12.npy +03636649-600b2f00113ad714e2367b9e27f16a71.npy +03636649-9e7ae4e322a056b954cd2a0ea6cb618b.npy +02880940-a1393437aac09108d627bfab5d10d45d.npy +03211117-cd9d0c82b16aed01e4db95aedeacfd37.npy +02691156-74ebf601d9c872a7828204947d78b9af.npy +04090263-a7072394bb9d23f54b49cd65dfcc3a9a.npy +02992529-7114283643761bb4a5545c1d5c84020a.npy +03001627-89a13017c0d517319fb4103277a6b93.npy +03691459-b04281aa2c134623cb3c1170309e6b12.npy +04554684-1b77c0248add1d5540b559ef47048b86.npy +04379243-ed73c41dcfe9170119cc3eaf35cd388f.npy +03636649-17349d6d35aac0685ed28d6c8a1bdfe5.npy +04256520-8b8152865839a79719fb4103277a6b93.npy +02691156-92cf58c641a4e5af56a793e48de27b07.npy +03467517-821316d050fb993b1dcb4e3497cb68d4.npy +03691459-8877b9b8e68fcda696d7d56afa10bb68.npy +04256520-a5bec86d283a19aef296d2773652c8e4.npy +02691156-ec9bfc810a015c3a446cb1ee5d43f75f.npy +03001627-6abacfbb354818b1adda578d985c7034.npy +02933112-61f79a63ee5315693fb45d07cfab7906.npy +02946921-fe6be0860c63aa1d8b2bf9f4ef8234.npy +03001627-7af9eb2ebacde5422a373b90044f1dbe.npy +04090263-b7e25fa0ff4920f28f5b599a9e7928c1.npy +04379243-9c4dfafdbd7f9b76c955e5ed03ef3a2f.npy +02808440-1b6bbfbba694e33476c18e71fd49c4dc.npy +02933112-225905a8841620d7f6fe1e625c287cfa.npy +03710193-e939b756e10ceb73f83d66144c2cbfe6.npy +04379243-c2fe8c88c2b42564415434d4384bb66e.npy +04530566-cfd92436ff0d0779b011f864ecc25526.npy +03001627-c8daa8e9496580667b9c6deef486a7d8.npy +04530566-eb214ca65059e8d8fb8de648691848ea.npy +03001627-7667d0da445e324bba600d75deaf8d3a.npy +04379243-b789ef3e2e28aa0c3b08200028f31a6a.npy +02691156-32da9294ff0c3d8c7a40e1005054fac1.npy +02808440-aa1200913fdb9f1679d57ee14f8ee702.npy +02958343-dd1bc8c4063a6521456a647a9e7d914e.npy +03337140-86fbcd62054c7dbf4c3aee8e9d3a6ffa.npy +03991062-fa8538255c27636753c42d8148a60bba.npy +03636649-aa0c8d5c38e8c87f805e3a6c310c990.npy +02828884-b3974f214dd4af93601104cd2d998272.npy +03624134-7422adf7859315961000fcf84b12c2d3.npy +02691156-a12179d6f8b753a934a446df7eff04e9.npy +03001627-4f188d1f92b859fc283b00891f680579.npy +04379243-40eb3b0b1b43f8cdd0a96520c31993ad.npy +04379243-a1efc57eedf9a2e93c8311d2f6bcff87.npy +04004475-5971d36336f3cea81baa19f2d6f07ecb.npy +02747177-fbf7021503a2a11fce41b639931f9ca1.npy +04379243-6ef4f1f0b3f8aad48cbb8bac2032149c.npy +04256520-40da067ec8d56e2242a61f5042a573f9.npy +04530566-ad0879d8dc9312b5c6cb0dfa2f14f9d4.npy +04530566-772835e02fec3a93629f9e3e495fed76.npy +04379243-d9daa0e33f695897136d9cfd13835101.npy +04379243-adc763e089e2535fdd155b45c76af694.npy +03001627-f2129c67cb55c6868779f85a8bc31fb.npy +03001627-779e4f9f044c71612f95e2a1e9997b85.npy +03001627-1762c260d358a1751b17743c18fb63dc.npy +03636649-f18a519effa019d819cb07ecb5b4102.npy +03001627-c7f0d32287191563bf22a5ca4fa4678e.npy +02958343-c6441f127d51e478f0fb72d24c42a39.npy +03001627-d0d18af5959e613ed3040d716596ad68.npy +02828884-5dda4ef4ab9add9411ee8243f54292d6.npy +02880940-a08af31cb43f1f662d88c45db31bc366.npy +04530566-118d43609d6de540fdd92f489e57a4cc.npy +02958343-bb39689b3e6568e85ea174ca141ad66c.npy +03325088-8b5fb07c0ca26bf4b362845c6edb57fc.npy +02924116-2c922ea4c2fdd84b270b857a2cb41e7c.npy +03001627-46c6dec63dd7c45854ca97f654da3901.npy +04379243-8f8f98df7a9caa18febad4f49b26ec52.npy +04379243-8f02a9ff58479e59ac51268fdb437a9e.npy +02958343-148ba646cf954b9249352dd33f95cb9e.npy +04379243-73e9e162c2d4f90a6c4acae4ea0d5870.npy +02691156-604392af2cbb7d1fe30ec10233e7931a.npy +02992529-496270f12655bb84e38ab39b0490e043.npy +02933112-63f3ea0c41eedd19f51f77a6d7299806.npy +02801938-9969392f6425a85750da8b99982a3057.npy +04090263-7823da328516db23394e22ae6de2db18.npy +04379243-383fed2f8f81108c6fa63795f94c4d8c.npy +03001627-5c233981556ff20fcaf36640a0c92faf.npy +02933112-1f674f735abb7b1d75869f989849123f.npy +02958343-e9233510c6e0f2672a9eb0f146e94477.npy +04379243-8657197d00d103ad4ac2955bec7764a6.npy +04256520-fe29b89c392e1bb39a2d92ec05f8de08.npy +04530566-2bf9436a79954087bc585c195913193c.npy +03001627-dfc85456795d943bbadc820495ddb59.npy +04256520-ef05b57542cbf151e7e684d25d4dcaf0.npy +02924116-6d3f6953945f4f38193d7855ecfc1bd3.npy +02871439-d8b0928ddac7b02d664b3b9b23ddfcbc.npy +02828884-38e367e4421ec3cbba70cedf91706353.npy +04379243-45122ce45ad6bbc0668ae11a7db5e82a.npy +04379243-cd106955d3bdf8e751c4deb11af7079e.npy +03991062-cb2dfb2ab016e50a2c59a4d90e63212.npy +04379243-253b7cf1ca03674bf4b6538438a0b930.npy +04379243-a7e343ab31f1e113beedb4c8fd29e2d1.npy +04379243-6726c2d72f835554781ba0fdb47276df.npy +02691156-db758090dd739ee9ca68a659ecae961c.npy +04379243-74246960cafebda4ded4c23d05709216.npy +03001627-2842701d388dcd3d534fa06200d07790.npy +04090263-3728ea8fca746a8d52499cf3d29e4e95.npy +02828884-eb9938d81ec9005882db9fca4b68095.npy +03001627-7212bdfab35f72b23002761e7a3ba3bd.npy +03691459-fd11b075bb1df4b01f1c09aefb59ebea.npy +04530566-6ba7c592495e203f49006426f75e891e.npy +02691156-8a6ab7486ecbecdb203936772104a82d.npy +02691156-84b84d39581a6766925c10fa44a32fd7.npy +03001627-8f3c91049838cdf2b04cb542e2c50eb4.npy +02933112-74104e62e8fbcbeed0b36851d61b6fca.npy +04090263-e5beb08af46a6b8f6fa28a58edcb926.npy +02924116-efdec3c35b0e36128449e0b8dd14796b.npy +03211117-a52e505fb03e2d8568292529fb38e524.npy +02691156-8def338aaf898d6c26479a182158bae5.npy +02691156-9a84164528544d5690baeef8ba5b93e5.npy +02958343-c9d53c90471eeb06ed3696d854eee1ec.npy +03046257-4ea7645a8421c2cb9c2b8a7ac19b29f5.npy +04256520-dd4a6a955c925d7762fd9a1e220aec64.npy +03710193-2912f56d135e2f97b20cb946bceb58f.npy +04256520-bcd6db8d23cbb9a9cf19858fd1963d10.npy +04256520-c2d26d8c8d5917d443ba2b548bab2839.npy +03636649-1d198eb08540837be9bd6b804c8484dd.npy +03046257-b4ba086ae065fbe3664fd9ccc8bafb2.npy +03001627-76389d102e3fb729f51f77a6d7299806.npy +03691459-8a8f13245888b8a1411171a7db2d5342.npy +02933112-4aedc26af43f08d08f7d9678498f2295.npy +04379243-cdc9ea006d761feb8c56c26d10173bf7.npy +02801938-d224635923b9ec4637dc91749a7c4915.npy +04401088-62a6de09ff956e997b239f1b8ec0d46d.npy +04090263-36d4635979ae79256314c3b6a3a65519.npy +02958343-35d473527fa9bd8cbdb24a67dc08c308.npy +04401088-38881e9944ea86dca374e5b9b6427c16.npy +02958343-b10794a03c59e42d32a4e3dd3a89488f.npy +04401088-d4a038b20b1250d7241d076ab53023c1.npy +03001627-4a1510e398260ba36b31862e09495f2.npy +03001627-be4c88a130e622a21961e650f3cfa396.npy +02958343-dee6c7e696048330ccd4ba9035439a85.npy +03991062-63787d5ff22ef52a2eb33053525e23a0.npy +04225987-d4c492d7076b1e6160eeb9e113ae7397.npy +04401088-609321c1351a955c1e1f8455cdf1c0bb.npy +04256520-32859e7af79f494a14038d588fd1342f.npy +04225987-a1d36f02d20d18db6a2979228046d9f9.npy +02958343-432efbe7784cba3ba65b1575070b0b4a.npy +03325088-4ed3d9c8a8ff37ebb7a867e9b35a1295.npy +03636649-94fdbb748526dae4ea2d70ab68cd1d2.npy +04256520-8a484fb8faf9dea01495d00ce1193982.npy +03325088-c956fdc19b02782bb7a867e9b35a1295.npy +04256520-a66befdc2b049fa3eec26c23f5bc80b.npy +02933112-860929843ad9e7e16ff961d84ac7046a.npy +04379243-df2244d33847f7cc4802d94e40825ea.npy +03691459-23efeac8bd7132ffb06d0ef27244d1aa.npy +04401088-1b43d9193794748e31811399a4ff3aa0.npy +04256520-145bd097a4b1cb8a44db04bfb021976e.npy +02691156-7af2dfbf11201feac3ab86afd1c689.npy +02958343-4ef6af15bcc78650bedced414fad522f.npy +03691459-f1175bec19adeadde188dff443a0c2ac.npy +03001627-37044d4f5fbcbe9bae536f42ef59cec5.npy +03691459-e8ffa936875c7b3a7ffffd2e0fcbbf0a.npy +02880940-faa200741fa93abb47ec7417da5d353d.npy +03001627-fd1a87a399c1c82d492d9da2668ec34c.npy +04379243-3b64bf8731a6a2a63c5e1addd9922bf2.npy +03001627-bfa435c63b1e96d3492d9da2668ec34c.npy +02871439-ff62d6b0cde34b7f6f1e631ee7d027b9.npy +04256520-c839f879381df0f0f42a90fe4baf4591.npy +03948459-afa2048d3da423ed3f5d17ee01b81759.npy +03948459-445a386fa38254aa6aae23d08e2851e9.npy +04225987-ffea27596947c29cc983a1dbe02fac40.npy +02747177-1eb3abf47be2022381faebbdea6bd9be.npy +04530566-d3ba52601a902f407f436bc8bb8973a3.npy +02958343-4a1b48e1b53cb6547a3295b198e908bf.npy +04530566-33a9a04e7d8ab8ce861ba49603151327.npy +04379243-602526e4a9de3f2c822a33e080d0e71c.npy +02691156-f6f2905883c49d179e0d0faf84afc607.npy +03046257-395c82f7a56b5cb0ef6c510e24348d3b.npy +02958343-6976cc9f5982474e9aae70753d127b0b.npy +04379243-aa6b5cad531b9ef982db9fca4b68095.npy +04379243-40cb833fe986db191ce7600faa926b91.npy +03467517-a2a57079224183faffb3fd15b3de82ca.npy +04530566-e00d3546401b6759710b5d09f274df.npy +02876657-8be0066e544e11da664b3b9b23ddfcbc.npy +02808440-1866a0bcda2564053321831d2245cf06.npy +04401088-e1fb2b5e5a306e6621ecd2b49af349a.npy +03001627-3515073c473f4ec94b3c42e318f3affc.npy +03467517-3ebceeb3562ed5c751b42caefc789eac.npy +02691156-52cd5876945106d154eefcdc602d4520.npy +04460130-1683c5bc839969f438cd8eb23853c009.npy +03001627-e9e8f839c77a03498307335ef66226a6.npy +04379243-c91c78e14fccbab316a2b5862518c93.npy +04379243-b82c6769c98e877d24d29f1dedd03a57.npy +04530566-dae38d7110c4bf252f84cb7932f866fd.npy +02828884-1bb14f4633ad52e3ae944a46a2846086.npy +03211117-f35e818eba233a7734bb689093b9bebf.npy +04256520-d4dddfd40635a72f1cda25fa42fa5ece.npy +04379243-75f9ad7ded87bffe1bb088904f7cb154.npy +04379243-9482c5f0a38a73c0fa16d3c3138134ae.npy +04090263-4c9c33529e9a555458e51bbf75d8cac6.npy +03691459-88bddaa41de4fc386f936ccdbda50e38.npy +04379243-1810b6accc77d7893918f23e2305ede2.npy +03001627-804cc836409c921ea666d560e4dc80d2.npy +02691156-bfa52c24ed71614f48a7b7802dc31138.npy +04379243-67bee18dec77f305e4af5827e8177766.npy +03790512-89aa8433ae3b9a197395d58407f193ba.npy +04090263-1655608678a4f9ffbc7bb5239e53ea6f.npy +04099429-add291bbd2c208f249d91b0fd3240957.npy +03046257-7bb10722ce68c6d2afbeec40033bd27b.npy +02958343-d1bf2bf3302c0ec0e21186de41a0101.npy +04379243-3842243b1f246b3dc4e62ff7caeb0b29.npy +04379243-11cd9cbf28d3918f1b17743c18fb63dc.npy +02958343-1b1a7af332f8f154487edd538b3d83f6.npy +02808440-3290b970bbb388fa3c8d0fdfb1cc2535.npy +04379243-8768002c872788b8e513931a191fd77c.npy +04379243-90cd1d5e2f33888ebe9fa30bb5c5d8b5.npy +02933112-513cc5132f0543d0b47cc2471d9dd7e6.npy +02808440-52da987951645a4b3c8d0fdfb1cc2535.npy +03636649-6b9e4403230a162b54fb5025c749b481.npy +04530566-60cc5839008caf13cea6e9826e81ed40.npy +02828884-1541e36e8dc2d84caed2201239784a35.npy +03211117-742705ebaa879604f2e5d34c7b677bc4.npy +03928116-17c154783360a7126f2cdf5afa9a3cb0.npy +03790512-4878886fb154d54366c6576de41cd6b9.npy +04379243-32b63d54261678e266a713431ac35e37.npy +03636649-dda91a2215130be16035905876bb696.npy +04379243-c1a04d0c233263aaaa199671f55e5379.npy +02828884-9c9aed95c76b4ecd80360680c1602c7d.npy +04530566-a980a2cc1ece321968165c64a4129512.npy +02691156-1597cbeb8266af206aa3bf023a2b42a5.npy +02933112-20d00eeac9377d1212de5317fe5b354f.npy +02933112-9d7338e6d5da1acd353a90f87b8ecab5.npy +04256520-580e58ca5b0f8dcf490ad276cd2af3a4.npy +03790512-67bff6cc82b6565dfaa866ab8ff6f59.npy +02691156-4f5fc434ebc03254fc7b1255b2e02e3f.npy +02691156-2c932237239e4d22181acc12f598af7.npy +02958343-36d0591781587d9fb1bb46d2556ba67d.npy +04379243-31f1b54fb7c9e5a3cfb87ab5efe3dc31.npy +03513137-6429cf540f58c246226eabe1cca3e850.npy +03593526-e08d96216c6360155e7fae0bb48967f7.npy +02808440-19605cf5174935043321831d2245cf06.npy +04379243-2c5d6e88359ccffc3396b0dbcf4d4bc7.npy +03636649-5360bb53166e73958b424343280aeccb.npy +04401088-b8a2c7c7df404ab8e7ef9fff09638f8e.npy +02933112-4edcf59d45bfff5a5b903ba10d2ec446.npy +02933112-580a7733e55e08be3c8d0fdfb1cc2535.npy +02691156-f88be1c8e93fbfecba0d990ae229b477.npy +04379243-a8a68d6e43cc0e094fde46457697d80.npy +03001627-8a948db5f12d02af492d9da2668ec34c.npy +03636649-1f80e265e6a038ad9c5c74ff620f967b.npy +04256520-48b67f0f05994da092a31ec18c4e190a.npy +04401088-af3c1e4367942543264e721f309fb873.npy +04379243-2b1f1929a6a5a6517b431cae0dd70ed.npy +04379243-31451828a0b452174705d3a68027b503.npy +02818832-b4fe88b1c71ec07817c98cc13ef6018d.npy +03691459-92e409aa16d2d673b5203226c26c59ad.npy +02992529-9d021614c39c53dabee972a203aaf80.npy +02808440-68421e740dd77fa7c664c3d4e2d59341.npy +04225987-8b93703a2046ddf5519438329ccc67e5.npy +03636649-d8b33b356591441f23d2ff62625c9fe7.npy +04530566-340bed24d1dbd33ba9142e7277ee08f1.npy +04530566-176d386905bf227da56b564158d089de.npy +03642806-5085268208bb23ba7b037ded105df073.npy +02958343-c951be855f20a1bfb2a29f45da811562.npy +04554684-aba19f953a07b5d3f589dfa369e10caa.npy +02691156-34a89777594d3a61b2440702f5566974.npy +04256520-946ab73b9f05a85ad5b24cafb84903c7.npy +04379243-e2dac2205ed98fad5067eac75a07f7.npy +02958343-9e0eb55ae7af7f8a61fbb658aa965606.npy +02933112-cc843a4c31c60dec64cb4ed80bd76aed.npy +04379243-ea45801f26b84935d0ebb3b81115ac90.npy +04401088-4a60039ed657d838fe5c7c47101442e0.npy +03337140-4be2322747a8c2604c3aee8e9d3a6ffa.npy +03467517-a276d9eee2bb79f2691c0d594e383a87.npy +02924116-337bab6b54d858ad15a9da89784be865.npy +02933112-7261f3eee6d5cac0e7ae87d20a4fdaa5.npy +03001627-91283b7062407b7381806e3880250dff.npy +04379243-890940359fdfa036569c11df1aea8ca4.npy +03636649-37b0f61c553e0499be27e423fd45ffe7.npy +02691156-e52f08852429e6117dc01d89d8a05b74.npy +03636649-aa9e96ac6c121cc54cccbece4754c7cf.npy +04468005-8d56ae45f65330beff6d47091cf62142.npy +04468005-c8645284ecefc0caa5e12deb37e3ef08.npy +02933112-1411cbedcc428f73b76e29c9c43bc7aa.npy +04379243-6ed74f11887c521f25f6f84717a88f8f.npy +03001627-4360c9c8a22facffaac6edb721277502.npy +02992529-a8d72bc949bbf361d8dc338f42ea38e9.npy +03001627-21e5fb7e2de735f490ad276cd2af3a4.npy +02992529-52d1db0a460723949582767760266e88.npy +02828884-230a85ab57a15b90e074517a246f1e65.npy +03991062-3862f8610e0329e2d4e6b2984840098.npy +03001627-6a5be179ac61ab24b07017f7091028ed.npy +03710193-3ea1339c113555f231c93b4eed4b11.npy +03001627-1bb81d54471d7c1df51f77a6d7299806.npy +03001627-c1b8c2f0c4f3cc43aff7c08b060f5ed6.npy +03467517-8ad0bde65846fd724133bbb00b8e2c6e.npy +02958343-a57e65f0c8f21ebc31780fdd33037c9d.npy +04256520-f611f7d72fccaa4c8bfdb54347dbe48d.npy +02828884-97d009dc14e25080d83393768c99f441.npy +04379243-401cd99ace3b92fadf6cfab91d65bb91.npy +02691156-b42620c214ca7cfc44deee06752bbfaa.npy +04225987-8ae2871e13786052f42b80606c2f3752.npy +02747177-ec95231a746d67a0775917454d940127.npy +04090263-d7d7d990d385ee8a67eb21515c2e5ee3.npy +02924116-f59d8d1976ec3256f07d0074fbd4a555.npy +04256520-8331de0bbd3b0e19db8fa1712f9ee93.npy +02876657-a86d587f38569fdf394a7890920ef7fd.npy +04256520-3600642b1b3a91422d83e0e365c4ccb4.npy +02691156-560b4af718f67902ac4f72bf08dc79a6.npy +02828884-6a9fb118c1501215f6459198cd03dd78.npy +02958343-dd240a8334032434bda733a39f84326d.npy +02691156-77c52530ef9983c94c3a35cee92bb95b.npy +04401088-43d96f5a6a619c06bc663b874223ed74.npy +04090263-64abde6390fa65fe26ffa6f51f050119.npy +03046257-6e5262c1b52858c5191c3762b497eca9.npy +04379243-6f53e944fcac6e49795407f097f1ca4.npy +04090263-2e9dad6c61b3269b1ea15a3c13db250a.npy +02992529-3aa2fd5054465056e25336bb76be9963.npy +03001627-27559a7e2b0b839d75bd952b0c911144.npy +03636649-252152593d97aabfd5f1d0bcb81c89ec.npy +02871439-d3497a61bdbac9bce407066405497871.npy +03691459-5e9cb0d76e74b0a9339c90d74e7a6543.npy +03790512-8da04b6c03068e6ae21ad659cc6e09ee.npy +04379243-9e5c21e11110fc9ec60dad40a0c0e85b.npy +02818832-a3baf2c091f1d89276a8f34f63bf4ef6.npy +03211117-eedbd3126dad6abe5de04aad18bd94c3.npy +02933112-a7e9a54cfae053aa20768660cf080d12.npy +03001627-46cb1e740cf6e9ec7ea88ba060407992.npy +04401088-a4c32dbcb71076d5825732a29ddd146e.npy +03642806-c912c50b812268e8fc9e3f0d993c8121.npy +02924116-80babfe320be84aa5cc49a2de2817ad2.npy +04090263-3594567f8d54fc9475e036b82df78473.npy +04379243-992899a16779bdc99f8c3d2002c77ddb.npy +04256520-8190efdd2054a0d9f51945de050323d3.npy +04379243-2ab14a50afa530d5253e170a96a633c1.npy +03691459-716d1d38cc0bcdc8c9d5b08933b9e0c1.npy +04379243-63aa4cdf9276e6bc19cdd91652400369.npy +03001627-bafa7e4e50e0b2bec8687ff9b0b4e4ac.npy +03593526-63447253a06727004725f67267e31c89.npy +02691156-d9f90f110ce30fbbadecb6fc00604132.npy +03467517-6b1648834de5c0c910a26d9d3646f933.npy +04468005-1a83e2d92fddd64452470de2774d6099.npy +02828884-cca18c7f8636606f51f77a6d7299806.npy +04256520-63b0904e68e5d1c6f51f77a6d7299806.npy +04379243-4de9fa90bcbd6beec3bd24f986301745.npy +03710193-ab94303f7fad5b453b02598625ec1bf7.npy +02933112-33c47c4c9afeea5a4c62bee40dcdc539.npy +03593526-6bb307429e516e2f129f1cb6c6fa9dd5.npy +02828884-c3da9fd354b31502d6eefa796d2f261c.npy +02933112-59d2e972374292c19dadd90fffe49008.npy +03001627-ffd616229a97642c7ea8c9f2db0a45da.npy +04530566-dffd4f1a6a4d3647568f91064f82e7ec.npy +04090263-8f81c50e0b90f961b40a1b2ef5e0c995.npy +02828884-e3fddd1e0ce63b65ad5067eac75a07f7.npy +02933112-23108a41e40a49f6389b013bdebd5e94.npy +04256520-82dffa2751f8e77643c18769338212d9.npy +03691459-36526654949a904b2bf4f773fe0e622.npy +03636649-72d5a2931dc1c913edb30e9b97600303.npy +04379243-41b0491fdb14d41bd25ca1a27cf9bdec.npy +03001627-709a5038988a70f58e6803fc947043b9.npy +03636649-52e15c498d33748d53227dcd0d547ba6.npy +02691156-c798fdb5baef6b8be36e92960e9f090a.npy +02691156-881e02b2d5a2c306f7fe0727acb55c39.npy +03636649-5f22096b25995531fcb8d8c6d4df8143.npy +03211117-f3bfeab806cc976072052f2ed83934f0.npy +02933112-adece72df027acd6658fc1ad354006c7.npy +02691156-7e1646c0a04dc68f6ea66e6959004764.npy +02992529-78855e0d8d27f00b42e82e1724e35ca.npy +02691156-deb196087108dfbdbe4df22b15a36e0b.npy +04256520-413e31ca041f65ee5b40246fea20c2e7.npy +03001627-9aa80e9e5adc8084792de12ccdce67a.npy +02924116-280046943bd65148669bde2c0a4bfb2.npy +04256520-23c65f2ca9165072490ad276cd2af3a4.npy +04530566-767cd95abc076d3af9d742d7f0246fb0.npy +03636649-b5a223ea93f39c2c961b70a6f96df2a4.npy +04530566-873b7ab23a5c85e365a308491a8f2afe.npy +04256520-8a207daaf453777de79c8740b4fafe4.npy +04379243-98d93b260a69366c490ad276cd2af3a4.npy +04090263-b75dc97eb33f6f5f98469ce4eac5b4d0.npy +04379243-5370b493b077fdd39ccda3ab71692a66.npy +02828884-dacfcd3de6bb08e4d2b12aa6a0f050b3.npy +02828884-5ce636f716f8f11e601104cd2d998272.npy +03593526-60abc8a27bb77020535deb3b0c692a2a.npy +04379243-6e029f7d5901aa2e2e4e89f168578552.npy +03636649-2c806132ebd0fa0eccc87962551b3d9d.npy +03211117-f3f21d06ff78f426aa444c25b73bbf6.npy +03001627-30488c6d05b4848388df69d6c56c6047.npy +04379243-db665d85f1d9b1ea5c6a44a505804654.npy +04256520-53c81bd4b93b14491e6d59363e6e833.npy +03085013-57a57e95d06b60458ee125fbff9e483f.npy +02958343-dc2c49d8617d400daa44bfa127abe4bb.npy +04401088-99fcfdd6edb3898a1117cb504804bf09.npy +03001627-233cf8ec4019005ceaf288f952624966.npy +02828884-978e21e3ac24a83c17b431cae0dd70ed.npy +03001627-212ad23c8afe1f9a9d297e74104d3ac3.npy +04379243-1fdc88f78be6ba4e14b86d5282eb8301.npy +04090263-d79182f4d76d63e9f13eed41b64dddca.npy +04379243-38ea17d177c4e872fd07832c54eb7e78.npy +02933112-20d92bdc128be29c59350d819542ec7.npy +02958343-d84c7484b751357faa70852df8af7bdb.npy +03001627-c9cc8df04240b27890907a4c1a185a7.npy +02871439-9bebf2913d515b5c66bc0e25cf103e1a.npy +03636649-9841e6ef0d244f3d42b9650f19dd425.npy +03624134-61c24b66ee29c936813a3b78020f767c.npy +04379243-b24092dde9ca927758aaf363794b1631.npy +04468005-b21af8271ab47f79c82ee199db6586b1.npy +02876657-bd50af3416f45348679a03fdc41e0266.npy +04256520-20ff83acfd590101be65001d50394fd9.npy +02691156-ce5310bbab4bc178d7a85b8b6dea0a54.npy +03001627-7a5e63ee142a424c5f6d0af6de791c3.npy +04379243-c679e4eab49f91fcb4392c1299b1bbaf.npy +02958343-32f458e413dfce699cf7b84b43bdd8f.npy +02958343-eb144af0fef08314f00cd8c386c592fe.npy +03948459-5f540dfb9dd0f21c9f433921788191f3.npy +03636649-1ce6fb24e634d5962a510b8f97c658e.npy +02828884-779907753183ea36601bea3dca268229.npy +02958343-90a59a473e9d110ae13bf7a39e9b5432.npy +02691156-d583d6f23c590f3ec672ad25c77a396.npy +02801938-eb0ad0de58fbfd32ca972daa503b3095.npy +02924116-adfac6d3b3f4f41c91a491e8257bd6fe.npy +03001627-553c6c2a186db82597976c675750537.npy +02747177-df3772b1bac3003c464e1d2ff524a75b.npy +04256520-61f828a545649e98f1d7342136779c0.npy +04379243-63df9bf9884c5b485e7087f2d9a278a9.npy +02691156-cf13bbe558f37bab4c3a35cee92bb95b.npy +02958343-932363431a35b189898b91227342b00c.npy +04256520-2fa5cce72c52f5ea95696f73b672b1e8.npy +04379243-32160b2dd0d1c8ab507243968c1db8f3.npy +03467517-97d91c9c16a2c6b5df7372ed5754c18c.npy +04379243-19b849328f1a8e522ee60509601408f5.npy +04090263-56026588e19ac1ce5109391625c31397.npy +04530566-9951a6732eb8438a79662f01dd94fba1.npy +04256520-3b7c1e67ee312cfe1bb088904f7cb154.npy +02808440-8ba04a13e0b5a33f774f018e2c69edb0.npy +04379243-68247c737f565de8615b3e12f53b391d.npy +03211117-3b188ac95d09cc149d74e2a2b8c0c58b.npy +03691459-323f51a8d5029453d603e2778861154f.npy +02946921-b36902ae19ac77f2a89caedb1243a99.npy +04468005-5588d3f63481259673ad6d3c817cbe81.npy +04379243-53433c9845f6b53955034479f8a160c7.npy +04554684-91e432daef378b24553e9c84d5d40de4.npy +03636649-c83f19fefc2c06593e22d791db24e31c.npy +04460130-b8a35075f420cc7066ea44c6d828197f.npy +03928116-9578f81207bacd5ddd7dc0810367760d.npy +02924116-29e7da770fc347b87ea4a7d096d4ae73.npy +02691156-5f9b4ffc555c9915a3451bc89763f63c.npy +04468005-bea62459ad724a7a3b371d842587b0d2.npy +02808440-fefaeb0bbd82f411412deb0d2b0f3dcd.npy +03046257-caab4218b7855fc5de9107ce13dea90f.npy +02828884-de305de253b7040aa4e9452025f4f1c1.npy +04401088-2009fed0ea8d1fc3e2dbe704eec7e8d9.npy +02958343-368583768dbe789980360680c1602c7d.npy +03046257-e3a00627dcef6b854b3c42e318f3affc.npy +04379243-ce1c3321de30433b16ec4c6284dcbcbe.npy +04401088-44d7b5d87c26896944608b3255ca1886.npy +04256520-9f4447e8dd345d33d68f196c7607adb9.npy +03001627-ue639c33f-d415-458c-8ff8-2ef68135af15.npy +04090263-891731397db0b6d36669f41869e0668.npy +02958343-2dbbd2bec94e4a7440eaf79934ff53b6.npy +04379243-9d5941cd2ae236db2a63bbf40292a37e.npy +04379243-10b246b375c15ab59fa24672a35ae8bb.npy +04379243-6e6f8f0ea7008fee620851befcf2047a.npy +04090263-2c10978bbf84a263b2b9ca36f6b76586.npy +03001627-8e87911087743bdb2314deb821327685.npy +02958343-3ab98667cabf774e3343f5fadc4a2136.npy +02691156-a1bb5d1a075bf7fc37d1c8fcb5a639e2.npy +04379243-15ba6dd7a9ad8b12efe5f291bc2f5fd0.npy +03001627-eb1d92be1e6bd84c4d9a43d557cf49de.npy +03513137-9cbcaecc65c3a511eeb5508ef773ccb1.npy +03593526-cc432b9eeeb02485a6a06826583046ba.npy +03001627-d8892d8a902616b1669e5c8c05e138e9.npy +02958343-53328de5c7e18b752350d856e276adb8.npy +02992529-e870d160aab8a55f1a696e9ae9fac3ba.npy +04379243-fe3351c94fbab8ce3002761e7a3ba3bd.npy +04401088-e96198cfb23a8b9d1d7ccb77d69f693e.npy +03001627-93e183f827d9361cd7c558b0724ffc9e.npy +03001627-374e87fdee7711491e046801e2748f1a.npy +03790512-fede9c1de88d225c7395d58407f193ba.npy +03691459-f2bec55383f72f04f6eb098afb876d6d.npy +02828884-74d4dfa4709ef0b056f6fc4b4ce1db04.npy +03797390-a637500654ca8d16c97cfc3e8a6b1d16.npy +03001627-96929c12a4a6b15a492d9da2668ec34c.npy +04401088-40dbb04ab8f780d6cc571cd3cf8f17a1.npy +04256520-75fa63a7576e2f509ae676623bdd3284.npy +03046257-64a32db4416941acaa2b654345545ea.npy +02691156-b501466a5a77f1173d2cc3e9d55f7579.npy +04090263-e5221bee9996da87d6964d5ad6a822d.npy +02818832-19ecbf9af52ad3fdc3bd24f986301745.npy +04379243-3b0c62bde7b24de85ce578b5b4bfae3c.npy +02691156-b3bfc198214215397b5fa2b5a4fdb00c.npy +03593526-146f6702601f9c5d8bb41b82b15c6ac.npy +03001627-637b36b2e5db7f513f7e27638e63d848.npy +04090263-698623ed6f1fb3076b2c8bb96250e4a0.npy +04090263-96013016f3e33bf3e1f2a1daf140ac9f.npy +03001627-f8bf45e20bec7cbc9cf3f05539f5c4e3.npy +02871439-8f94fb5a0fd17a0b68d1b9a1d97e2846.npy +04256520-2e474051a376ecace543d6ca26cbd98.npy +03001627-e431c68fbfdf826d561dbc0c83a98a32.npy +03001627-2ede0b0117e75a4315d50c1c4b796b2b.npy +02924116-df6917b20b0e16f8fd12abdf466ae8f.npy +04468005-3528e0d7239a47e41f3b9c5c62b1e7.npy +03001627-37cea3ba8e5a146da6fee8e2140acec9.npy +02958343-1ae530f49a914595b491214a0cc2380.npy +03001627-4460e0885d82b7b5d9987a7cd00eb98d.npy +03001627-59fd3d1409c0ee2e47bc3701b998a7d5.npy +04090263-e6887514f6d28e446314c3b6a3a65519.npy +04379243-cf5e67d5e6d7cf03f26f8ea67fbd8269.npy +02880940-a593e8863200fdb0664b3b9b23ddfcbc.npy +03691459-776b1ceb53c8ca881ef58b31c4ba0d15.npy +04530566-23c31b1c25689d2a7ba04de7d6d93ce8.npy +03790512-41cc9674e700c3fdb37378f3c85478b4.npy +04256520-a47681de164dccc6ad04591c9486ec0.npy +03636649-65c87436f6d6c695cf004563556ddb36.npy +03636649-9c5a4f568399539b47afb7a57d27bf15.npy +03001627-2df489b6a14404b3febad4f49b26ec52.npy +02808440-b3e22df8581158c66f893b5bc716a3fa.npy +02691156-1c26ecb4cd01759dc1006ed55bc1a3fc.npy +03337140-1880ed173d662f92c78621ab7e0ef193.npy +02808440-326e05c24641bf43b362845c6edb57fc.npy +03691459-f9250e29e640eff9a5f99ba0b2469cd9.npy +02958343-cc0c058e2eca523051fb05589f6b0d0e.npy +03991062-5cc4660eebade12d25ebd1cd0b422e32.npy +02954340-f40b47fcbf83b962f0d11ae402ef940e.npy +02828884-205b404cdee5d81cc624b11e153a6d87.npy +02880940-d78860e8318fb75a12a72bbc636a1f9d.npy +04379243-49bf25ff4401946524c10ba1eb690638.npy +04256520-3f79bfdf49c2b654c397356311cbeea4.npy +04379243-50d253ed67d73392140251e5a7586890.npy +03761084-391c1645b46367067621f3e966f56f52.npy +04379243-3a1f1de9d4693576938da3ea2c9e0e4f.npy +03636649-37be7d2937f7fd88fcb8d8c6d4df8143.npy +03593526-e8a0fca9bfb4422cff3ef8f363b2cc43.npy +04256520-75d76c87ee1066ae7ca0c2077c3e38e0.npy +03991062-8281f586fc85d6a377b9297f3055210.npy +02843684-1025dd84537d737febed407fccfaf6d8.npy +04379243-3564c6480a95a60323fe3501bb9e7193.npy +02958343-555303045808ca7530e7b962d97a840e.npy +04379243-6086c6195df8e051cce17d79b4472d62.npy +03636649-63538ead3a81058f1c1ef519b9196b63.npy +02828884-94420ab399ce8a1561e51a63d5bc6e46.npy +03636649-370623095c9773e42ce7d46577f8a9bd.npy +03636649-3e2d51c40b37c9c086052e834fbd2c4a.npy +04379243-72659c0df8a3d5f77ee217c21e683487.npy +04379243-603e2237e14611f9d4091fbf7990ddf0.npy +02992529-e0b1cb72aba261731fa8e666182e8619.npy +04379243-505dca88c2a9f7bba75d03186a0409e2.npy +03928116-8cb0a98e336a767421eda8d3e50ed928.npy +03691459-1eac013c89689e58d421ffb972735edc.npy +04225987-90210ee9fd29275dcadc0bfc31415370.npy +03636649-fa3b05deceeddc26fcb8d8c6d4df8143.npy +04379243-7ad02b2b54c9456335ce7cf30c872281.npy +02958343-10555502fa7b3027283ffcfc40c29975.npy +04379243-679f9dd2f3d8c52e2de61958ac6aebbc.npy +02691156-dd9c0622e873de43c752b66cc923fdb.npy +04379243-1f34ff8c2ecab3b0a4ee05a5737b7178.npy +04379243-c26913f8e139a80baa2b654345545ea.npy +02808440-2ad3ff96fe7f5d46a9420f0961aa2e8f.npy +02933112-aae9df5536cce166d5532c7891a349ad.npy +04379243-b6d644abd3a2a54c904f770b8a17d30a.npy +03691459-b8a5307c51164dac78128d32fc0f2897.npy +02691156-5c9e30bf0691c04d4c3a35cee92bb95b.npy +03593526-777bbb60f4596a5155f46d55537192b6.npy +03211117-e9466e872848075d3aeab48ed64c0fa4.npy +02691156-bbc645e0c0449532b3c7301213dfb7.npy +03001627-bf9f2ecb581640bdf91663a74ccd2338.npy +02958343-1198255e3d20d2f323f3ca54768fe2ee.npy +03001627-892d8090f05c136dd93768e7b9b1eabf.npy +04256520-f990194a8401d8de68c2f5eb1dd4dfaa.npy +03467517-d790ac3aecbdfdfdd4f4a255f121abfb.npy +02691156-25668f59015af0de56a7f2952cdf4b81.npy +02876657-a1c63c463ad7fc1fb549927fbd0d12d.npy +04256520-c3e86ca4f6ca077459d0a47cd36512.npy +02933112-504949a3b05dd13e3f7a74e12a274ef.npy +04379243-bba7bc453203fbc6e39344961f657bcc.npy +03001627-210115ebbbd9eefe5fdc736bcab9da58.npy +04256520-6f202d8517db172a5b2e09b1c446ae22.npy +04401088-9cedde0b189fc03824ec4b72ec33390e.npy +02958343-82c6851526bf7350b5554d042286b030.npy +04256520-13f398918a8ae11b17743c18fb63dc.npy +02933112-467b66a6ed7b3cd24da5feafe6f1c8fc.npy +04379243-e5437217b4f28c976c45c685905d0ecb.npy +02828884-75ba60267a6c36af4b0780126e986ee.npy +02958343-3d681ed2a7eef0df28f46021c78a3723.npy +04090263-6c95a697b85c6a52683e3750b53385d5.npy +04256520-ecb362a469c76e76febad4f49b26ec52.npy +03337140-976af9491aa692b94c3aee8e9d3a6ffa.npy +03001627-17dee0cfe9a370b134bce1184e175df4.npy +03636649-caeabb766b3b9c67d3c1dc91e223304c.npy +03211117-2190a888d3f7ba6bd3ffd38a8449bde8.npy +02828884-8256252192c60158c5449cfd4c0f0a4a.npy +02691156-5e7952b2d1a495f24c3a35cee92bb95b.npy +04379243-57e3a5f82b410e24febad4f49b26ec52.npy +03691459-9cb881bfcd65686176d485609557b1d2.npy +03691459-e8885d12901ed5aaa7d0cc9b15400f65.npy +04379243-b893c20bfb5d718371a782a4379556c7.npy +04401088-e1b7a28e8f8ddf15a4ecfe858e518c15.npy +02691156-2d3ecfb6d7ef2c45e08b03c50fd87acb.npy +02958343-68e733f38f957332afe1d4530f4c6e24.npy +04379243-2ab09f4db5f5e842bf595b60a303303.npy +04379243-36f53cf8a68d1ea73ca57f5648ff1b0d.npy +03624134-27f3ffbdbddf545d179125d1d357cdf5.npy +02828884-2cdf972377f30d9485718c281d7fdf61.npy +02691156-62ea17b5f0d46e2288a89a28f04ce622.npy +04401088-efed528241cd773fa2c7c5886f4bbc93.npy +03624134-3464db7fada86430c0e19881d8a9def3.npy +03046257-f9bd4d79a34592ce6695909af0a27770.npy +04530566-b10850ed8a61d4dd148bc340784a8c1.npy +02691156-19b219dbd2e4467828d4f2ffc8f17f3a.npy +04379243-696beb1883be838cc955e5ed03ef3a2f.npy +03761084-406dad41dfaeb674477dbb9bdedfcc.npy +03046257-57723d2d30d532c7adc5f5aafedb1c38.npy +04401088-fef0bba982a4ad5296913ea8ca1ac015.npy +04090263-debc38fe094476bf2dbf1aa086ad30ea.npy +03001627-a3e4639ff201f69b22a3043dcd383f68.npy +04379243-3dd0f8b4dd8a688aba893aa9f42bc953.npy +04256520-2c16efe54c1368b297f437b37a859ff5.npy +03691459-2a7c52141a3a32dfdd14180aafd9db4.npy +04256520-accb504861a4091b894b04fea82e6039.npy +04530566-a3be3018a002bbecacd548a9de859b7d.npy +04379243-3e32e9de344b723435c5f7d532a05db4.npy +03593526-6dfb59f33c88a4e0263c42ff6d6b9672.npy +02808440-733dd5a046be8d4029a0731d6489a64f.npy +02691156-d1e78f6226a9ac76fb2fba771d8219ff.npy +03636649-be00be72836114159568832390d67ef.npy +04379243-91c380f2d26f1a9ff128012535a24244.npy +04379243-eef0387bc4e72a1efebad4f49b26ec52.npy +04379243-5a720d961df190d459a6208793b9dfca.npy +03642806-f53ea19f871a80d420685b5a7e34b501.npy +04379243-c5195b46ac75dc8c20c6f761e8cbbf.npy +04530566-aee93c0ff8dcf746ece2f98c4b805551.npy +04330267-7bddc990442a3c6ea8ab8175d04e5764.npy +04530566-e0fc9177fe0aab2fb50d0c6a0c254040.npy +02992529-428ac05b36bb576d2a9eb0f146e94477.npy +03797390-962883677a586bd84a60c1a189046dd1.npy +03691459-1a511622eba730c79ee3c69ee7ee1fad.npy +04379243-82e1c0b874b0a9e035cd53a06b1d2317.npy +03797390-91f90c3a50410c0dc27effd6fd6b7eb0.npy +04468005-4f7dcdaa6bb963354aa78dbead0d8a01.npy +04379243-b4855f52572ce2b0febad4f49b26ec52.npy +04256520-33ab106bfcc881b14b2bf798c0452b7e.npy +03001627-77727bbfb22c57de492d9da2668ec34c.npy +03991062-e828ac0a8a9a1e96ba14bfd91a75020.npy +02828884-b1ac6f2ba106e8ec2250bf58700b4d8f.npy +03636649-5d94d971dd819985713decb1a0563b12.npy +02958343-c43b1ebad0ba016a7fd25564c2e888e.npy +04379243-e22b23cbdaa1e259e8a94a8468340ce7.npy +02876657-13544f09512952bbc9273c10871e1c3d.npy +04401088-f2158f4f4141e07825a703f74bf22d93.npy +04379243-2fe8de498d0f00f51f77a6d7299806.npy +04379243-49c3ad60b7d5234dfbe06dd91adeaedb.npy +04090263-b754214217c4405dda6cae4e030ce341.npy +03046257-f453f21d54c766d94edcf3b74eb57b13.npy +04090263-b589b1af4eec862beae3ab415b6ca18.npy +04090263-cb9b99a239fa07bb139336f03eb955d2.npy +04379243-65acf2f512016cdf553c860eacad5e53.npy +04379243-ea6571f7ef98f562fca88347d0eb86ef.npy +03642806-6146d9fd9460370c578b3fc82443ab96.npy +03001627-a439465d2bd623a14cb9f394cda169eb.npy +02808440-7d41c1e628b1312977da90a8fc1a6429.npy +02992529-e9352850a60bbee4975308da62ab2e39.npy +04379243-d3b7021f03ecd58d2585ba435c7d1fcc.npy +02691156-46c52edc6107d1a3505ae8d422ba349d.npy +03636649-87107afb7ad115414b3c42e318f3affc.npy +02691156-e559a626d0ef8b4f982014dd9aabdeeb.npy +02747177-e05add2e5e4574997c6269fe8093902c.npy +04379243-7f9c12456dea1c2531c7871fa99a9d36.npy +04379243-2d5b8274376a7095955824885d6e7dc0.npy +04379243-e53f5f3d4b20df8176331cff7db8f268.npy +02933112-9c245f01f94ae038413b3ddc4f2d9a06.npy +02958343-c487e9850891e1ec2d15396b7bcc6366.npy +04530566-67da87349baf66e3c1ccec171a275967.npy +03797390-4d9764afa3fbeb1b6c69dceb67157a66.npy +03001627-d86158642391ea7a150a331b054ed006.npy +03337140-68446c00eeed26264c3aee8e9d3a6ffa.npy +03948459-b3a66094d5ee833bf4de29b99f103946.npy +02691156-94056866a14b015a50c626aa72455dae.npy +04256520-b48603e4595bb61ab6f5fb02f36f9480.npy +03636649-979867c99d8e0b7a4601feca428b2996.npy +04379243-102f0532f9f8bbcdcb503f63ed915ed2.npy +03001627-9cabf21d12d271c5d295b24579cf55b8.npy +04256520-f1c533e2cba193631b02cde7e81f0fc3.npy +02876657-f68e99b57596b33d197a35146ee825cd.npy +03928116-f1e27303883d1c444e09ebaf49b0cb2f.npy +04379243-1faef163785bbc427b11ae648ea92233.npy +02871439-9ca929d28c1838d5e41994ffd448fd07.npy +03001627-d11ee4294daf6ebe492d9da2668ec34c.npy +03337140-137369963be020cece5d6e9371bb5c33.npy +04256520-4521ce028e5009811866a0bc19f46a1d.npy +04530566-c2d6eb0899e5d10dff531859cd52e4b5.npy +03991062-2bc8254cb4d6ed7b5c27243205718de9.npy +02808440-72b2ecba8ab54af8b362845c6edb57fc.npy +02691156-5b5c4dc4bd29dc8166cf1b4a8fc3914e.npy +03325088-4baadfa07397fff83321831d2245cf06.npy +04468005-2d05eeac352398006bd10bf92325d933.npy +02828884-18926a71dd7f17eaac40ad047084c6e6.npy +02958343-c3d23ea4f3d1e18180360680c1602c7d.npy +02828884-ce2112fa16725a7aad5067eac75a07f7.npy +04530566-79284d5d39e4738394749f185cc702f2.npy +03593526-2d69fad249c53ca0c6e02b40b50fb3e7.npy +03636649-4003077668e23d6c9998b4eb812699dd.npy +04460130-6d839fc8ad123620f20d6153247513c5.npy +02880940-aeec00d8dd6e196451a2ad3de1977657.npy +02933112-11798e50090b6dcd0b36851d61b6fca.npy +02828884-94df387a0b97302ad201085e80edb26a.npy +02691156-c359e067e75cfa8693d4024985440d4c.npy +03467517-4ae5a491c3ffb473462c6cdd250c26bb.npy +04379243-7b356141695f75e271a782a4379556c7.npy +03046257-4f62af2d14df6cb6eddb8fb8ef75e718.npy +04379243-22e1bbacd4ae7812a23d33d54fbb4b2b.npy +04379243-801616c42a468c298fb2b3b07693a96e.npy +02828884-7a7c5ca50411d85f4fb4dee5181bee.npy +04379243-1be0ad8c6375f5d47edd45e036b3c8b1.npy +04379243-ae0ed75bbd4c5a74b7c9606efbb8bb3d.npy +02808440-8b1b57f4b4f2477b362845c6edb57fc.npy +02958343-ebbbc8673928ad37308fb27494afe372.npy +03337140-47278fe8f8be0e3c4c3aee8e9d3a6ffa.npy +04530566-a3905dbb972cbb3db57379b548da98a0.npy +03691459-75c408e3ce113c84d084cd4069686980.npy +04256520-8ea11732a1198be1dae12f3947d07dec.npy +02871439-ac9f6f5ed922f0a5ca3d3aba150597ee.npy +02958343-52f592a68c828a1e190cf42afcf85660.npy +04379243-15cb1696b45ef647dcad484e89744ca.npy +02942699-a230560372fd55a410ec06105f027b7d.npy +04256520-f2a96143ed0936265d2b890291504877.npy +02992529-8f049b65309d8390f5304dc8cfbb76e1.npy +03636649-f5a121812ce16ed2578f5640449b6f5.npy +03001627-c9fa3d209a43e7fd38b39a90ee80e328.npy +03001627-6dd44ada2f481c776dddf6f75fbd4a4c.npy +04379243-2e8a4184f4067657f2cf6a9bef44d625.npy +04379243-8bdb57e97f726a8133a39277b6bd460a.npy +02691156-e1e5cfcabcbe26a03087f84b199fd297.npy +02924116-571b77397f1b958fc98c13d6112727de.npy +02958343-3ea68e00dff2847f1f0fdc8ac183f8b.npy +04530566-ac479ce45b04972891bdbed880f31c72.npy +02924116-165b1865ba7eb0efffef2f04639c404e.npy +04256520-f444000ead89fbf2558ba0061239252f.npy +02958343-651497ec47e9d1182e877e82c90c24d.npy +03001627-568050037ad958625ea33df4b8846880.npy +02843684-ece71b326dcb50bdfcfdb70b6c560685.npy +04401088-fbe18b762a1328916b7f36a4c89ad37.npy +03467517-2f1ef453d18cc88d74f1a026675e6353.npy +03624134-ea2a14aa25e34566ed60d0c28bcebc7c.npy +02691156-4a6961377146f08cb45fd154bd3b6957.npy +02691156-875d75a0aef86850b6b87e72ead132ed.npy +03691459-70ee226bddd4005836f19668fecae7e8.npy +04090263-7b1b02b8f71226e4bb9224760a70fece.npy +04379243-8821c22c61ed87e3a585c7706fdbbe10.npy +03636649-908bfd876def9e43714531f0291497fd.npy +04379243-72458d4233742f29fa24672a35ae8bb.npy +02958343-6c5a34971e2bd518d571d7357468d0a2.npy +04090263-37aaff9b0f567ca378d7c0e1adfe122c.npy +02828884-eb245de64157afe8ad5067eac75a07f7.npy +04379243-364b9c00797efba693ab1bc955ac34ff.npy +02828884-1b8e304a9c23fd4563b2acb037dfbcde.npy +03636649-6a977967aedbb60048b9747b6b395fc5.npy +03593526-915ca876e784d965c5b724995774ac86.npy +02958343-3759a08d740859cdafe1d4530f4c6e24.npy +03636649-aa78d1c91a8949313c8d0fdfb1cc2535.npy +03001627-36ced137933c36a3ff085529822a7226.npy +04530566-e6a9f9135e36b6c17c0ab7347b9e831a.npy +03948459-418cb9c89655274822d79ac75435d5fd.npy +04379243-119a538325398df617b2b37d6988a89b.npy +03001627-7035d480f6bda22938b39a90ee80e328.npy +02808440-367f0d3a99b5f9f834f7f29b38d9290a.npy +02747177-8fff3a4ba8db098bd2b12aa6a0f050b3.npy +02958343-90573f5d0156d6e23ffe0e5069bf1eb5.npy +03001627-4c1777173111f2e380a88936375f2ef4.npy +02958343-f1c277f7fc421492fbe59dad8284dc0.npy +04379243-eff1bc2f644be748490ad276cd2af3a4.npy +02958343-6333b9c777384ad14362be10a3fc8255.npy +04379243-1be435a3027d58824461bb4901a4cb6a.npy +04379243-2d5f99d5c2f3463d477551ed4bff707c.npy +04379243-2dcbd662fa03dc88956c2c3ee7a48cc0.npy +02691156-16715d886ecf0a97ce2cec85ea6ae00d.npy +02924116-6d619fcbceaa0327104b57ee967e352c.npy +03001627-cbfa51dd6b795262774ba10f0bcc178a.npy +04468005-a2a67baf798eaa72dd8e272fd230200.npy +04530566-2005e1613f1a46b5c083d5272d526845.npy +04379243-686a09b1584249ecac3c355a33b4399.npy +03593526-5eab5b7ed4d29ce5664b3b9b23ddfcbc.npy +02828884-52d8b9703dfcf31f2056b4bd5d870b47.npy +03001627-3fc616c2b603b333f3369bb203286e75.npy +03938244-1332172ba896e1c2a40f4c396e0c7dce.npy +03691459-4e957072c3c876e02fc6b53066be64d1.npy +02818832-ade1791b73a3b528bf78ecfda71e346a.npy +03691459-5260d7e4d379219df2e5d34c7b677bc4.npy +02958343-4415ef6ca1d9a6a3ed734d5df4ac741.npy +02871439-693836c29e5fa6179a2988e955b5ae43.npy +04554684-aaf971855cff72731a1a2dbbd3d54d53.npy +03928116-bba9c90254fb970b8dfaa3491bc0f718.npy +04379243-c348d279fd22730a9741b7ee128375de.npy +02924116-a645fad8ed4a2ecec13ce7c1406181da.npy +02958343-1ec1c4aa9190e767da5421a736792418.npy +02691156-34ffc5e29472358cae81a3776126c079.npy +03001627-74346aabf555ee0295122b1ef21ee4c7.npy +02828884-9c8a96bb95a62a6ae6e54a934c4318f1.npy +03938244-3ee02ff403e6e5bc2c6c98851414a9d8.npy +02924116-7e5dbe69598c6439ab80ed476c7fb6b1.npy +04379243-635005efb9077ca282c22b790c082c19.npy +02691156-50755e616df58fe566cf1b4a8fc3914e.npy +04401088-bf0f0ba650108d03cf144715a1bb5595.npy +03691459-388ae2b6420bfae26cde9ab9486e09f0.npy +04401088-71121add7e94b024fb88c3d40924fb73.npy +03211117-aba93b2b9b45a30dab0b172d4dea80cd.npy +02933112-b0f329dc43af0fbd4da5feafe6f1c8fc.npy +04379243-b658e507c84d6202610c2a68437007d6.npy +02808440-e456b80ce2d41953ccd0340812259a39.npy +04379243-e935cf0b43767dc9c3bec646284d5a6a.npy +04379243-20cd5280f106b36fff90854b4e00880b.npy +02691156-1580c09f49bb438a7209009cfb89d4bd.npy +03046257-260be91d90d4aff1f51f77a6d7299806.npy +02691156-e161df613fc808b0d7ec54df5db5828c.npy +04090263-80915054aeb243259747e122424ea8b7.npy +04530566-263eeac4bcfca21285f7a3de54751f1b.npy +04530566-447a43ec44a3e672e7cbc4e41c1d1020.npy +02801938-dafcdefea7e1445edce1af5c27e3da18.npy +03636649-9c2699c78add2e5847ecd534f9237f9.npy +02691156-9b687f9cff46d43d89c2da356f872ebc.npy +03325088-34764b40046d5c9f72101dcac4ed75d3.npy +02828884-6f0723826537010c870f22c94729669b.npy +02876657-9dff3d09b297cdd930612f5c0ef21eb8.npy +02871439-824246a3f4b7075182750018fd60ef30.npy +03636649-670525c759c07ac71560641bf48464ff.npy +02691156-2d41a07991b546751702b97fc9845e5e.npy +04401088-61e83782d92bf80b7548281e465c9303.npy +03001627-bd98d493766949a8c05575120a46cd3b.npy +03001627-f9da1bdadc982c7f78ee935ba846606a.npy +04379243-a3a701905091355e96aaf875e27b02c9.npy +04379243-3e09b5c70cc4117d9969f8371ba19c2a.npy +03624134-4389fa45cc843df7e430a24be6d784db.npy +03001627-4a54684f8ab00cf5a4e0cb207f311458.npy +03001627-d80133e363b9d2c2b5d06744a21b81d8.npy +04530566-8bc922537410e1ce847c4e55bb965ab0.npy +04090263-5a148f5250c5d987918977c639d98325.npy +04256520-369dc8240dd358bbfebad4f49b26ec52.npy +02958343-28b5cb11ead4c878fd988235de2147e.npy +04379243-4020a2b829f148a18d8c7827464490b9.npy +04256520-ae7af4ea5c63938878585c45c8af09b2.npy +04256520-e8f21fec8246fd5a8bbe798b99a6a988.npy +03001627-2828b98d980480cec3bd24f986301745.npy +02958343-ae6827651ce624f6f5a0534aa77bf2.npy +02933112-475907f4b97bc1da25ae8e5e777da782.npy +03001627-2d808b6451253b7e7c7920f6a65a54d.npy +04379243-92e742c940c11e60812e3ecbeaae3980.npy +04090263-686be742e65eab7816cf8b1cd2155e02.npy +03636649-70b3279caee3ed985c6e7b50a2f671d3.npy +02691156-52ca6970fb09b561f9f7510373841dd9.npy +04256520-96aa85a45fed687dbbc7a6acbd8f058b.npy +04379243-d753e5da9b064152ef2438b4b778b7f8.npy +04379243-c1d808c75cc5e7ab4da5bb83ec125010.npy +04090263-92431d034edd34c760c81723f0d4ce20.npy +04379243-a98d6ce7eca8cf272d7d7823aa90da0f.npy +02992529-e33124aa016bd1f19c1db271ad9472a7.npy +02691156-d8a8e238987fed8dbc0909d98a1ff2b4.npy +02808440-589c1f69b5a29cb7b362845c6edb57fc.npy +02924116-ebf386fc1ba825d180288501d9901d7b.npy +02747177-2f06f66740e65248ba6cf6cbb9f4c2bb.npy +02958343-372b1a139379f5198e42313717d27982.npy +02828884-f56c78ba29d9f73e9bc72297235ac73c.npy +03325088-30597a40e0756ea650da8b99982a3057.npy +02958343-2d730665526ee755a134736201a79843.npy +04379243-4e5fc1f56057d5f439b1b7041443703a.npy +03636649-20c9d1713fbc0925c35131da26f8061a.npy +03593526-4bc38481b09e397689035c25f0dfeb63.npy +02808440-cd42ce92bf94eaf35e690296776c7bfe.npy +03790512-ba0f7f4b5756e8795ae200efe59d16d0.npy +04090263-c54be9902d947a1ef6fb0164eb28c4c2.npy +03636649-398c948f08b778a1fcb8d8c6d4df8143.npy +02828884-1bace34d2c1dc49b3b5ee89f1f802f5a.npy +02933112-267aa08f20a000a3b15194162f658e87.npy +03001627-e0a0d5c2ba6fdca215b55266697a17be.npy +02828884-8e260916773769032b7072d8dd8cf43d.npy +03467517-7175e8671bc22afea937a742b4b0dc33.npy +03948459-49429e1d1e90c1ca202be79d8b285c1e.npy +04256520-577625945f1b83d16296847c9d695b0b.npy +04379243-e2a940682bf386d166e77edacd2d5e3a.npy +03636649-c05273997fd65e7b88e7662971dc736f.npy +04379243-b515a107aa3a3fd0e3dff0d5ebb43915.npy +04379243-9e229ffbaf9b7395efb9eda839fc42fc.npy +02958343-7d343bbf3265164fb2d2900ee0ae7e0.npy +04379243-48c61eb9c9453db75828f54ccfceb8a8.npy +04090263-e63cd617410ceddfc9ae1c09f478779.npy +03325088-cc79822a10e3cc9eb362845c6edb57fc.npy +02691156-9a58779da170911a7a571401e6605fc2.npy +03636649-545ce32e4a72ac04352681850fbc4af9.npy +04256520-d66ab7a970a3344e34e89adf02e34b7a.npy +04379243-cbf56579ffce57d84cbbac005f3700ba.npy +02828884-8bf63e9b3df32ff1e1aaa7ea27fc24bf.npy +02808440-88ba375e0d96eea94989fccd91bef01.npy +04379243-b2582dd22be909767ff6ace05b36a5.npy +02828884-f95f1121136052bcd4d8765e3910f617.npy +03001627-2ed972dad69431ab89f8949830ad07fd.npy +04379243-9f78ea7856f21a4ac8e00bb0b2c9ef1f.npy +04379243-3c4e1361b066ea3b8ca998f0f87d0c84.npy +04090263-21b7114455da0bf033e73845251cbf4e.npy +03001627-a27a04ccbe8d5c90b91fe758ff985f40.npy +04256520-621dab02dc0ac842e7891ff53b0e70d.npy +03691459-d027e01fdb3830687ffb47acd56f396b.npy +02828884-607414f33022aff2d2b12aa6a0f050b3.npy +03046257-d220a3a4e31ea77a1550babf1ec984b8.npy +04379243-22daa2fdacd34e086c701087a194026.npy +03991062-dec779d32766f97adbb1480d02e6cccd.npy +04379243-3c34a433ab1dd3e2f657e3152307ea2a.npy +04090263-146529b22d3c510ddf14c6e3e40331e9.npy +03001627-2e8748c612c5d3519fb4103277a6b93.npy +04379243-4cab7b493f8f404694ed13cc64e8d835.npy +02691156-2c83e01a7a4423c74d4cb1c2a5e48b7a.npy +02958343-24c0c6d558d4d01d8772618b7452025.npy +02958343-f8857237df1717e3aa562f24645e326.npy +04468005-e7223dd1d94ebc5d52470de2774d6099.npy +02691156-69a46dafabb616191f9b3085a256a338.npy +03001627-2b9fa5950d81d925cf004563556ddb36.npy +03636649-9fbe081afc5868ca5c9ed170ce1aefed.npy +04256520-5b70eb12242d4a03fb6ca00006f2c76c.npy +02924116-60229aae7778899d248376edfe1878a.npy +04401088-7af2a3d126ac5e44fdda95e9849ffbd2.npy +03593526-1ae4ba2e963a82777cba7aa754e5342.npy +03761084-cfd21967d9621f664e09ebaf49b0cb2f.npy +04379243-19d5525d3d65063bb664d1885442ba70.npy +04379243-4309b8cf22f0382917271868b642acd3.npy +04379243-889f05b7771f6b9fe76bc197b3a3ffc0.npy +03001627-c69069021b390de513232b7b9d3f985.npy +04530566-3c835bfc9201041a34f2450730697f14.npy +02958343-6c6254a92c485787f1ca7626ddabf47.npy +04379243-c5a4cea5107d72f54b3c42e318f3affc.npy +02958343-3b3a3b0d9082236cba77eb053523da42.npy +04379243-a387e9c10bce09c85828f54ccfceb8a8.npy +04401088-612466085d24ce50b260ba4e94db1a27.npy +03211117-ed00d5a47a7ddbd5e464ff83d36486e8.npy +02958343-5b74aff38b82c58f453226473c9b5a05.npy +02876657-10f709cecfbb8d59c2536abb1e8e5eab.npy +04530566-3e874274afe2d37c70640aa5d7fd3004.npy +03001627-b5699ce2511433f3b28ede0f9f5a31e9.npy +03001627-7ed9395ec6fa732248db5ebe0dbfb1d5.npy +04256520-5eae999a81861da03bec56bff764ba78.npy +03636649-36d90198790ed82386052e834fbd2c4a.npy +02691156-617993bd3425d570ca2bd098b9203af.npy +02691156-76e66ae36d942c494c3a35cee92bb95b.npy +02958343-88fc7d197310ea4b961b666ad9ed1438.npy +04379243-42fc350dd15b5ee07bcb070cc655f13a.npy +04468005-abf12741cb25bd593ae1361afc45ac52.npy +02924116-15e2d1fe9a4b28e68fb8c03013603b0c.npy +02933112-d4f4b5bf712a96b13679ccb6aaef8b00.npy +03642806-7d2ed394b410e9646f6e459e863eaab.npy +02933112-f0ebc33311b55d6b4e7d60def15dcb8b.npy +04256520-ad023095f1868d3019fb4103277a6b93.npy +02871439-8198c793defb5c1d55f9913e822d5318.npy +03691459-b53eaf891eccce82a4df8e9a50b4aeaf.npy +04379243-7f9d2da43d6aba67afb6676a5cd782b6.npy +02924116-d72902a7e8401366f31ad0ce8af976ac.npy +02828884-1ef8c3cabd16f7cbf155d75bbf62b80.npy +02958343-beec9297d087a1677e19c609c6e24294.npy +04379243-89251f322490e7047e38640a31d0bc3.npy +03001627-b625936e3db6af6318df1fa50d2b64c.npy +02958343-1e987cad6ca8a97a7a24dbc42a104ca8.npy +03948459-e3619c5b8d8ad37cf4de29b99f103946.npy +04379243-64c8873572f3eae175c80d0dd670fabd.npy +04379243-1c97870c90ff3a4f23fe3501bb9e7193.npy +02933112-721c788bb55b083ae8a9bc001231a118.npy +02876657-29cad22b0fc6c9985f16c469ffeb982e.npy +03928116-598de9e74adfaaae2db285a7fcff0623.npy +02691156-d199612c22fe9313f4fb6842b3610149.npy +03211117-76e8b00a0f6f78de1f82a1eb98f84dee.npy +04256520-89f4bb22cb53fecaa0fded058fdc8ec2.npy +03991062-3fd59dd13de9ccfd703ecb6aac9c5d3c.npy +03691459-60858213ecdb37dcb7a0c56c5d82c3cd.npy +02958343-e297de736f8f0b3f67738c2420579616.npy +03325088-74239af5ddd1f9676c18e71fd49c4dc.npy +03085013-4daa8d27a660895142ce30c291f8ca44.npy +03636649-370a49ad568a764febb6b411cf15c31.npy +04256520-330caf403f42c12ace8417aef1b7a422.npy +02880940-7ed1eb89d5463580a2c59a4d90e63212.npy +02691156-17c86b46990b54b65578b8865797aa0.npy +02691156-2aec6e6096e640add00d52e62bf14ee9.npy +04530566-74093f3d2583f3be7b0299baad14624c.npy +03001627-3f4f6f64f5ae57a14038d588fd1342f.npy +03001627-457aed734b0a8619ff6d40d828e0167c.npy +03636649-94ca5c31d2ba70f42cd2160e449d45ae.npy +02992529-427e06d425b901be5c0be177939e290.npy +03001627-594d5b7f3e705a1ab3234e0da44b11e4.npy +04379243-c3e43144fd61c56f19fb4103277a6b93.npy +03636649-edcadf508090e17bfcb8d8c6d4df8143.npy +03001627-9905ba0488b0471dbfb0f09ba9f2d99.npy +03001627-2b9ca6deb278a10cffc21cb5f21201cc.npy +03624134-262a62f3e36262e313195356ebccbadc.npy +03001627-17e916fc863540ee3def89b32cef8e45.npy +02958343-12498dd65e8d65ac3b6f5204eb590354.npy +04379243-190028e65867076ee12186cc8c5022c7.npy +03467517-61f90a151236d28640c20797381ee39f.npy +04256520-398bc907b92b0260285dd489701ccbff.npy +03001627-44854046021846f219fb4103277a6b93.npy +04379243-d36f8b6fbc03cb3630aec64313e58bdc.npy +03691459-29a7fe8fab62a9e134cf66ffc496802b.npy +02691156-e3bdca8304aa6593c503a3776fc280fe.npy +02691156-4843a702815e8ab442ffb0c016ee58f9.npy +02958343-e8a8d47957d15bbf8079d5a13e411210.npy +02958343-9757fd5be93ee0fc82b157e7120744ea.npy +02691156-fc9f6bc1ba1cb7c1c3fe7930fce05ded.npy +03636649-d5815f747626cadef912acc8c54e7fc1.npy +02691156-b644db95fe32d115d8d90babf3c5509a.npy +04530566-88b27dd110461b38b193f1c482b98a75.npy +02992529-f9ecc6749a251c0249852b2ef384d236.npy +03948459-1a640c8dffc5d01b8fd30d65663cfd42.npy +03001627-36c4421ff44218775510d59f3ab1ed64.npy +03211117-1405ccaff7fa9dbd51b711a0825fda5b.npy +03001627-27ea798c55699b6d2c528d33bca1ac2.npy +03001627-5a460cb21fb55f639f73340130af944.npy +03636649-eeefddb3f2ee93dd49b2e04785f8492.npy +03636649-f092117adb1e9254d1cbf3e52b9b6237.npy +03636649-8338a18d589c26d21c648623457982d0.npy +02691156-343a607d1604335fb4f192eea1889928.npy +03636649-a186c58be79925634cc30865d6337b9c.npy +04379243-b62908961c47a373b097f065a7be019c.npy +03001627-60cbc688b57f8b5446407779dbd69b2d.npy +03046257-22d22a2578f0a3574b3c42e318f3affc.npy +04379243-1674e0a5bde2dd67f12d7184a2ad3430.npy +02691156-19e531e6d0bd5ddd67c54439d6177032.npy +02747177-3ce42bc74819f5dd56f6fc4b4ce1db04.npy +03085013-4cade5a7ad1f473870d89967fcf73679.npy +03624134-75e32ddfd15d3ef1fd92188644609a39.npy +04530566-23be001cceb4c31af6f70779d83413f3.npy +04379243-506e4e67efe1794c1dacbc3d67b5a11a.npy +03691459-5b931476c24abb5535b5e203791a802f.npy +04090263-7f9e93c855aec4995e22590d7220b895.npy +04530566-72c942c6ed4dbf4e8e5cf2440102d1ce.npy +03001627-a873a489386dc825ed843e67f2e2e9d.npy +02933112-d08027b0f50619ef5c2f6ec7d4720d0b.npy +04401088-1101db09207b39c244f01fc4278d10c1.npy +04090263-e9ee67ab2cccdba5771dea817d9f8136.npy +04090263-e07fbeeec2a12fe313b315bf7aba3803.npy +03636649-36c6a6f0e206c79890fd203f931c9af5.npy +02933112-b6392ba0cc9448b353a5b360543fbe7.npy +04090263-911535f04299f4a53f732a8d4ec0bf11.npy +02958343-83db7e16a49191e5ed3696d854eee1ec.npy +04379243-63669ae28cf69b767f51cfad32a5bc58.npy +04530566-c189e1768a4f291d4de203ef6842ee61.npy +02876657-72d49a11c34a3b6880dd154b5d9c087.npy +03948459-fbda020053554eeceab5ee569c9de1b1.npy +02933112-9b885f40e2d36819e4e346ee2650d150.npy +02691156-dac25e0fbef7dabaf1692146d36a4a3d.npy +02871439-be99f079debaeed9a0fa21f3ff15b515.npy +03624134-e03a2ab2b6506ca0ef1f81f15fbe736c.npy +02808440-23288026c3ce8e5dc197f3661a4ec752.npy +04379243-a211f3080f4659131622a21d32ed9c9.npy +03001627-7ab86358957e386d76de5cade2fd5247.npy +02924116-d8226fb72a137597be2e23e91e24717d.npy +04379243-c2ad4e19213d839873baa2510487646b.npy +03593526-d9a35f5bcc527fb3a982675e6ec522a0.npy +03001627-efd0411eaf2396c4de7ed732f5aeea4.npy +03001627-e74035d3001deb876fb1d532bc5b4021.npy +04401088-7176e9baddd8a2ea33ac431572f43a21.npy +04401088-5148da752bcd11884ce243cdbc967ce2.npy +02924116-f90bafa70be9bf1bd4713685ae50fa13.npy +03001627-7ef4b16e0c38fe09b04cb542e2c50eb4.npy +02992529-3ca1d72d2416bee6f4e9c7b80248eec1.npy +02933112-15d7f54338bcca35e82e35fa57516a45.npy +04379243-17b444c072a6a3ec76e9713f57a5fcb6.npy +03211117-85240d0fdd8bc669ccf3727bc3da6c48.npy +02691156-3b3eb57af5f995c268aa0dbe2db661e2.npy +04379243-7bf29d83522f630190ff2a7142510fc1.npy +02691156-fc7fda7232bedd84bbf3143b1cb6076a.npy +04530566-2467cd9f4ae70875e26aef76db45b56.npy +04256520-a105701680f658b8f92f3e7bff4c4ab0.npy +03593526-d74e6a54e500b5744f9bdb71bf603cdc.npy +04401088-1105c21040f11b4aec5c418afd946fad.npy +03691459-b6ac65861f2b7a726bd362b3eb022b32.npy +03691459-a8277672da45a94e9d151674c6eace6c.npy +03001627-3f4e88498f4e54993f7e27638e63d848.npy +03211117-c61bc4cd473fe3326bd865f153842b49.npy +02828884-961d59d3ba6c7e1bf174129a51bed83.npy +04256520-a2b93b7632e98eb944949d7685cb63ea.npy +03046257-806f319a7465817814038d588fd1342f.npy +03691459-1334b56706bddaf4451f278fffaaebae.npy +02958343-8df83b28d786ccfc10f2ef3071342a2e.npy +04379243-462afff41381a622ffcc22765a7dddc5.npy +02871439-b0c1a8d1988b72e92987a7b722c00b7d.npy +04379243-b896a4afaa13fec7e90f16feb54700fa.npy +03790512-179998dd1743facfd5dde04c96fd8146.npy +04256520-bdbb64bc1fac0cded0176f9a144100cd.npy +03325088-9d2aaf99df5b83524ef883cf529ce415.npy +02691156-1856da25a85402ce63e266a803d9270.npy +03691459-aff81ceb0788c2c2d77f9c6ccbaf6fcc.npy +04530566-efc2b7a0ab3828761194cbd9c0740031.npy +02924116-c31a4569c45b13c9d1c83bc8b134e4d8.npy +02691156-8b851217c2ef15b8eeb11afd6f15c99e.npy +03001627-ff793ca32407b2022a54a8462d1ffe9d.npy +02691156-d3f2dcf27000283799d9d900afe054b8.npy +02871439-fb25e1f798321c354a134d5eddec03d4.npy +04090263-aded0c6beed6938ba39dc4a567ce225f.npy +02954340-d18c3ce1f186c16976bb31db0358e9c6.npy +02992529-b159743a482e73baa56eeaf8467b96e.npy +02924116-a89483619f413f91e9bc5a3190ed0a27.npy +04379243-7e871b4bbc5e3d175cfc8af3b7d60a4b.npy +03691459-b4e7253cb9ef78852b75817a0faaa5a0.npy +04090263-a4888af5b6c4c631cb239ba7670e0fec.npy +04379243-30ef2e867e365b735445e46058840642.npy +04090263-a0e251b5b4305d49893bac51482eaead.npy +03624134-df7a65224f295122ed9c5b25fef60d04.npy +03001627-79850e4ff6e43e6b3dfa4373373135f6.npy +03624134-2c23a56cbc058d5356c5c8316540f708.npy +03624134-66955a3156556f0d1395331ebe4786cd.npy +03636649-387429f609793f9dba5342d638d0c267.npy +04090263-ddb85b40a6e44c387a9af63cfe0c0758.npy +04256520-bfd15618fcd88e104017642dab433250.npy +03593526-aaa87a2a3a5b8ab4a156590b19c3013b.npy +03636649-fad0ae547e1facc09f97ca916781e800.npy +02992529-d2bce5fd1fd04beeb3db4664acec42ef.npy +03636649-ada0e305757901e589daba250d5b5a5c.npy +02924116-3221d0114c010afd613873e456db29aa.npy +02880940-e4c871d1d5e3c49844b2fa2cac0778f5.npy +04379243-ffb7b155cea1159a3a8e4d3441f2dd18.npy +03938244-590fca6c280bb31c943b92d8dfab705a.npy +02924116-567d3b42ab9b89195135b59750002c2a.npy +03790512-cdd1e5890e5a766a65397d05162306e.npy +04379243-839334dd754c09e5b7ea82317702e856.npy +03001627-879ffa2150c4537d6afcce3b00733da.npy +02933112-ccf5eb1023d22445762406157deca112.npy +02992529-4534e6754bcc38f78bc584bb94b0b13b.npy +02958343-10f158d2f43926ac80360680c1602c7d.npy +04090263-4fd2d1fd9aa1f2e4d3756a4e297a88d0.npy +03691459-60575cff5db034c621e6f308016fab7.npy +04256520-5cf46a99a9dfdc07411e8b42940aba04.npy +04379243-468955eaf3b3a4c6df8b5f0b7511efe5.npy +02808440-85c3bd8f53a7329ed83a3378d32b3048.npy +02808440-beafc45419f70db3252e0775cff1c394.npy +02691156-350d12f5290908c7f446f92b52bbd82a.npy +02691156-884adbb15fcb934051279f7b42f4d889.npy +04379243-995e0edbe7bbfbe0659dda512294c744.npy +04256520-b2cfba8ee63abd118fac6a8030e15671.npy +03928116-c5b7d166231c04328413778731d6cd28.npy +03636649-5a9e0dd068e2436bd7ebac63aa51083.npy +03761084-5a98c841d578715e4a44340bf227e40.npy +04090263-5f8a81e3c0711e087d81debe03396504.npy +02958343-227ab69792241382acfaf62fe6ca656.npy +03797390-128ecbc10df5b05d96eaf1340564a4de.npy +03211117-9ea0bddee8c8654d6b56d21c51d762b9.npy +02933112-68582049d02c7c979ebcda765f4eafa1.npy +02958343-36c2770d00fdd0bdf1ee968c9039cc3.npy +04379243-ff212e47775ea7fe6a3056c8cad72d81.npy +03636649-cd80cc92cf732e8d8a17805dbfb751e2.npy +02992529-cd7e6ab98a2d090099b101e0ce243aa5.npy +04379243-dea755ad1156374f55f46d55537192b6.npy +03593526-bcacdde81063a5df30612f5c0ef21eb8.npy +02691156-e160529ef50ae4dbb819cac660ba383c.npy +04379243-dec1d2cf8a4563d36cb02543e4df83bf.npy +04530566-b942192d17d2e267b7cc248da6c5c5b6.npy +04554684-e994852d9f4502674a16879fb3ac81f.npy +02933112-29faa40d5c0a65a576e9713f57a5fcb6.npy +02876657-b033d2a7efef6d881bd37ceeddc6ee3.npy +04530566-30e536833dee7cd8a9d21767a2141a63.npy +03991062-9ea66797afeb86196ea1c514a0de6d2d.npy +04379243-975b724129620c9af4b6538438a0b930.npy +02808440-75ab1d00c330fbb36f893b5bc716a3fa.npy +02958343-dd768e1b90b4537cd9eb65becee97781.npy +03001627-a5dc036f882fcbaaeb655fc642cef479.npy +02828884-88fa7d07abfcf9f03cbbdb20d4d80207.npy +03761084-6d8a8628eeb8ae92de6fb7d70c413eb.npy +03046257-d7942f024d24b8ac731e5d7a1aea3c4f.npy +02958343-3f702ea027037a5c4d18baf048fb19eb.npy +03325088-ee9f4810517891d6c36fb70296e45483.npy +02828884-ea518b89b8511916ac51268fdb437a9e.npy +04379243-621ae6c715e1af8087694c57464ff1e3.npy +02808440-8ebeac47d29d649acb6267f1b348aaaa.npy +04090263-44f2f626a4c73b216314c3b6a3a65519.npy +03001627-a5eea0cf3865da9749fb53621b8edde7.npy +04530566-d939109a33e6e2d175517226b23c384c.npy +04379243-32ea6609eb659a2cec3367bccf60e518.npy +02747177-33e36da1afca5e57f155d75bbf62b80.npy +03001627-5a61caff5d5b3e22424f8f8e828c9ab9.npy +03325088-21c4d5612e5b0437b362845c6edb57fc.npy +03636649-31a15957bd4f32f87eedf2c7d21f7cfa.npy +02958343-7bd15f738bf2a402d4fdf31cc2d78fd0.npy +03046257-60bc27587a400433b885fc9e74ed3e30.npy +02992529-71fb433e386a5547f63375fea17cbfe4.npy +02691156-79c10c1d217b4e96ee2723567c7709e6.npy +04379243-24b208dd138d8af36210db75a4cd581b.npy +02691156-55ed35a03b08a8f44f95630cc18536e0.npy +03467517-b427af4fcda02cf61a2c693bb85517c2.npy +04379243-1f5ee5ebb9ba55f454d30af857cfae06.npy +04530566-7fa94092d77b9f7877c1e07fcf5968a5.npy +04379243-5e0ef66271f36ba862feaf6b02ccee1c.npy +04379243-3a17eae5843c2c7660a62758a708c922.npy +03636649-2d4c4ceacdd41cf1f8c0f5916f81d758.npy +02828884-ad3c4c72cda4dcbd620ea05889322bef.npy +04379243-4a944441380ba0a45990f2c81f286aec.npy +04256520-824953234ed5ce864d52ab02d0953f29.npy +02924116-b4360cf115a6678ca71edfed1705a549.npy +03001627-92450ce64f51c778f235ab3c41aeb5b6.npy +03001627-621c62aa667c4d3cfe2fba8e5d6db330.npy +02828884-b628ddfe4d99a46021c74c368d3910fb.npy +02958343-fa563c2b77839dafc0e3666c7d0ec7d0.npy +03636649-3c3e36d1faa6c53c1f886eb96ca2682f.npy +03211117-b38d6f1025399725815b2b467e8e2eac.npy +04090263-bad9e6cf69ec4553db181f2efd806577.npy +02933112-66c38b5e6d9ad852307776da88d1350f.npy +03710193-c6d910f8cd92a59fdc83753cd31caa42.npy +02958343-64ee682c9dd2ee467cfc46ae22f84c92.npy +02958343-d922b4f3ba23cf43780575af49bfeda6.npy +04090263-da5d74a592c747e9ef7cbef6334698fc.npy +03211117-3c7ff78e8036b217d3923426933f698d.npy +04379243-47b6fc814d22a030db6175ef18ad3f80.npy +02933112-3e080e2b2556add4eabad247a05ad956.npy +02808440-c9e4c04d662d401afe52ffd0e748a1ab.npy +02828884-7a2ad24394c5d139d46c340938e2ff1c.npy +02924116-8b976988a516590c4096404077ea89f9.npy +04379243-667b59df5e098355c82f50464edece2d.npy +04379243-6afba6bbc7ca32bd339797c21e8801b1.npy +04379243-7556cf66da8b4498e12186cc8c5022c7.npy +03001627-f2a4d96e77d1c92a3d6cc735e3493c99.npy +03636649-caa8985efa72ea528d6a77b750ad3e43.npy +03001627-33ce7f85e65320ba9a404da609e2789f.npy +02933112-3931068c10d0a606ef37b256c10c21e4.npy +03001627-aba6ab10f7ccd59f9f8c3d2002c77ddb.npy +04379243-1a614377adee252e0445fc6d980dd5c.npy +02691156-65f77283a392890aa8cba409c4409ba9.npy +04379243-cd82d526e58e3e7f4fb85ea6fd426098.npy +04379243-7c15998c0d653821ab610b0c94236463.npy +02828884-91c949736e4887002ea98d69e91ba870.npy +04090263-1690a5959e2659d165b14b263bdb456e.npy +03691459-fad354295b4c0fdb55266ce6303fe1e0.npy +04379243-f94bd6bbed8fd60614038d588fd1342f.npy +02871439-2b9bb02f657a0e582ade7345ab5b0cf6.npy +04379243-dcf1095b329396b3a193550461f84122.npy +04256520-308a144f77a7aa2dda625e752fc62bb7.npy +03001627-6bcba04c2e45150779368d1198f406e7.npy +02924116-9e3197f8c8e3d6effa3f6d7e682927b4.npy +03001627-95db11e86efa7c3e8c6222d771a6c85a.npy +03001627-9a91fe80c2cd2f37f51fa0238791f5dc.npy +04554684-81c849960bdf3f1e91219aad82abc053.npy +04256520-9ab89ecff5672c38aff5bf458c586262.npy +02691156-da58b3e055132c9f6afab9f956f15ea.npy +02691156-c9aeb20d7cd1b3b45e9e2656aff7dd5b.npy +03001627-5f2d4c625595dc2499b025797420aa58.npy +04379243-7980d0e22c197dfa5e7e52a559b573fd.npy +02958343-1bef8891f35535ac2e877e82c90c24d.npy +03001627-2f249cbcbb122b85845e78b431e4d529.npy +03593526-7ac1b3847038de0e4b3c42e318f3affc.npy +04379243-e3287950481e9811cf48ae153052b71a.npy +03636649-c25cc72cd06852e75bbea6ee257e41cc.npy +04090263-b79cabe03c878d2980c2e60c312b0f09.npy +04379243-ee5f85db427865e63e5399147a5b4763.npy +02691156-3dc5331ce579b2d0d8ff6111270336a9.npy +04468005-c4053005ec79262c9954eae9164faecb.npy +02691156-5ad5fbe84d7d8ef790b1d6deb98feec6.npy +04401088-6167bf752533508dfd6e968ab91bff17.npy +02828884-632fbec93961015ccb2a965e75be701c.npy +02691156-653665e9c401e7ce6b310cbbfd03b8ce.npy +02691156-15898fef6fec88c53ada73811bb576de.npy +02691156-e17a696c47d4292393db03f6b4e68f17.npy +03636649-e89a02d4a6cc95f3fcb8d8c6d4df8143.npy +03001627-e158f7ba6828db5c654ea6737b0d3597.npy +02691156-2421f54274a5c237e8cef78f8179925b.npy +02933112-139aeafbfbdd6bb64da5feafe6f1c8fc.npy +04256520-9a7f267890144d4a7afe2ae8eef63a8c.npy +04379243-5aef22f5441b495d19fb4103277a6b93.npy +03593526-489317571832ea4c15d3518b43b3bc22.npy +02876657-1f1e747bfce16fe0589ac2c115a083f1.npy +03636649-cfebf5d2a0382ee3fcb8d8c6d4df8143.npy +04379243-71d50d287357e7e719fb4103277a6b93.npy +03001627-8e678a54f2ee4e5e492d9da2668ec34c.npy +02876657-e119bf2041459392601bea3dca268229.npy +02691156-64211a5d22e8ffad7209009cfb89d4bd.npy +04379243-6712647c8e0c6af29b6e5e087210d348.npy +03691459-292353a763d0870432af7736a533c197.npy +03001627-ab4fd3bdd8c1dede578d107c71db28ac.npy +03001627-8ea007bffdc9a27831aee04639d1b4e0.npy +04379243-cdf9659a23c89e80a23949c21eddef76.npy +02808440-1cc2487bfbc0209e3321831d2245cf06.npy +02880940-baeaa576ba746179e8d7df9e0b95a9b2.npy +03001627-eb2fabae15f77882139d2c86c9e03ddb.npy +02691156-c3733e626c07b9ff26360e1e29a956c7.npy +02942699-9cdaf68ed1e1daba9c21adf7cd249be9.npy +04401088-ac0a78736d78a5a5dd8524baa80cc603.npy +04379243-fa72e9cf7308066b1c072ac0b83fe07a.npy +04379243-92ee07567c94fd6d9a53d72e083de39.npy +04379243-4e15b52579903323f51f77a6d7299806.npy +03325088-ce9fb0a7128d11de76d20e73c57c9a03.npy +02808440-547a161a58187d52d4ba28a7ac06cf0d.npy +04090263-f6f468a51ccb62669729231d295371f.npy +03642806-25bc168b214b54799e28e9cf32e5157.npy +04090263-642e457eeebe04758480c9cd0a5e2175.npy +02958343-647faf34f7fdb50c16abce8cb03e7794.npy +04379243-6d9d5501c0a3d8f1615fc479d27ea86c.npy +03001627-336e92c7c570250251c4deb11af7079e.npy +02958343-468780ef4ace9a422e877e82c90c24d.npy +02691156-22dd4b6a60e20112185b376619557c95.npy +04256520-a7f45bd27efe50af4dbf8d635749f669.npy +03636649-b4e7c74a6e6685d2339c933a8cb966c.npy +03001627-f7e1a17728ea76dbc6bcadaedba80eee.npy +03001627-7fc8b858cad8f5849df6f10c48eb6cee.npy +02691156-97d662e5e6345b46bd46d022fd7d80aa.npy +02828884-1e039c5d86b061a593ebeeedbff73b.npy +04090263-48d29b4a2d749776e2e5bc9806debc17.npy +02691156-d06105ee2a2ae27c51008e496c6cfd2e.npy +02958343-7611c8605cb47d74b11647ffa4306609.npy +04401088-2a6d70bc7ac6db391d4136675e1527dd.npy +02876657-3b26c9021d9e31a7ad8912880b776dcf.npy +04090263-5707b3eb79f78b5fb9dd291f5235c28e.npy +03001627-2d44744a7ea0bf724b3c42e318f3affc.npy +04530566-9114091d7dce55242e5cac9166d7a1f5.npy +02992529-7dd788cca7df768495b1245be456cdf5.npy +04379243-c966a18da154da2c467289cae69b100f.npy +04256520-645aa5c32b9fe34014038d588fd1342f.npy +02924116-3caed8944366a746c8f372fe11149a91.npy +04090263-9397ae7d40c327044da9f09deacee7d4.npy +02933112-98003a902555e73adc6a693174c70feb.npy +03938244-950f71d6c271cbf47676dfce60793e46.npy +02691156-cd9f07bc1e5087b7f33a09c02bab9cc.npy +02933112-a6abf531780014f890a1391b3fdfda26.npy +04379243-beebc267ea0c16a5c7f6a57f6f73d8a6.npy +04256520-c722e02b37ec324463d444e16188727b.npy +03207941-3ca503ae899826e88bb4434d620302e3.npy +03001627-3ab2563609476e089868adf0764f7fd9.npy +03001627-4f5639e943b60edc600515ec9ccc96a4.npy +03001627-d1b03eeb33fd441d8189e5e3786f2290.npy +04225987-4473c1e89500747b5cc36f190f62c41.npy +04379243-67ec09f7e7cd6f059f2349486c570dd4.npy +03001627-17b558e72a4d76ef8517036a5ca6b1c7.npy +04256520-fd2449fd2aa8b142febad4f49b26ec52.npy +04530566-e0ddb444604f573d48260190ec06324e.npy +03337140-640b94d5aa88d61e4c3aee8e9d3a6ffa.npy +04530566-dace99ad1144747eaec7ac3c7340a2f9.npy +03636649-1499133658ea746d713f2e93cbeac35d.npy +02773838-4a1f62dbe8b091eabc49cae1a831a9e.npy +03001627-3024deb09ba519c517089ab023f65eee.npy +04379243-12a73c63681d65587a0f32fa630f6a0e.npy +04256520-105849baff12c6fc2bf2dcc31ba1713.npy +02828884-7def648b4fd4d1e419eeae21e79bb898.npy +02958343-c6762641f741acc2a19bced881c9e641.npy +03046257-217b47212a5a521ec6870dc41f78676b.npy +04379243-61fafe333f8c79c78716341f2dff4249.npy +02691156-4bf0b3df529d5093551df482db927edc.npy +02691156-29192f8c96264e3435fc197bbabcd5bd.npy +04256520-16cc2e83a7ed73b7789a00cfce0c4a8b.npy +03797390-336122c3105440d193e42e2720468bf0.npy +02691156-551635d89144da64299a59bfd8e7d284.npy +02828884-f200a8b5882be096d104df3d337858a6.npy +02691156-296d0aa10bd7ddd87965b154b2af39d4.npy +02876657-518f6867e5d38301fd3bf7a5792372cb.npy +03642806-6f1d1ad1d8238e84957b6a4f3924d982.npy +02933112-97c6b3099a406960d3dad974dc098fa1.npy +04379243-c5ded58bf0e362eaef9f898cda0ff409.npy +04379243-a251543112f3a452fc5718d28351c534.npy +03593526-a722038146f27d9550e02ef26f47fe02.npy +02691156-ba7d272a0ef0f06cd165fddf32a925f6.npy +03001627-ff167d9f25fb6ede2419ec0765e66c90.npy +04379243-d20562f6f18add5c7dcd20e7ddd78bc8.npy +04256520-9ba5f57133b048f771e087d4163df51e.npy +04090263-487330fd2ba7d55f97020a1f4453e3a4.npy +03325088-14dfa201e54c7aa0b362845c6edb57fc.npy +04379243-ad0082e4bc0b5ecd2058afcc28d23393.npy +04379243-6739b7952f7e53a7ee462e7a3aa014c7.npy +03211117-cfdd661f4521ae0e331bde3212dc4d8.npy +03636649-6a044fab6905fb1a145fa6babc33219e.npy +02691156-efbb9337b9bd3cab56ed1d365b05390d.npy +03001627-ed3e73a2609bf304377b9297f3055210.npy +04379243-b87c155d6c95c768668ae11a7db5e82a.npy +03636649-bd234f132e160fad8f045e3f1e9c8518.npy +04090263-c7e84421af16e48eadfdd35441a4b4ea.npy +03001627-ae9e1ff1ae0b0a8f6ee473575a9f31bd.npy +03948459-5a2bb05af1dedd91e641b9ab504917bf.npy +04379243-2f9c9357bfb89ac1d38913e96bbf2a5d.npy +03046257-56303474bcea6fea3b48a711df82173e.npy +04401088-a857d9e7cd90163e10bc2436075f6a52.npy +04379243-d3030c8698bc2f874c4c693a60456ebf.npy +02691156-62a72a5afc84ed54faa7ec7d870d2e09.npy +02828884-6150a9e7c5534dec50cdeffe12411e9e.npy +03636649-78b7adf1f72ad31a841a2fa612410176.npy +04401088-dc2c4f42a5715d0a6d1ffe1a45470ad7.npy +02924116-4e4402d72896357d1cd228cf70713a1.npy +04256520-953707e41b518f631125768e50c51e2a.npy +03593526-de948c52437de4d2a57b3bec78e5d1b3.npy +03001627-1e92f53f3a191323d42b9650f19dd425.npy +03636649-da4fe1c3d5b1eb6ab2b4f8bf5db83688.npy +02933112-12b0773858754105c59350d819542ec7.npy +04379243-16802a946bd714e819fb4103277a6b93.npy +03001627-d9346fab44b6308f40ef1c8b63a628f9.npy +03001627-79f86911bc86222a4e5aa1f8c960ae63.npy +03001627-aa6f5bed94640d81c20bf61cb7d8cc34.npy +02747177-11d2b7d8c377632bd4d8765e3910f617.npy +03085013-f24f90cb00b51c2ec8c3ac9bcbcd9687.npy +03337140-53a2e3a87300241c195ae0b4bee7180e.npy +02992529-693fba444859fb7d54c65e829609f393.npy +04401088-9f56c8a7cb64f4c36c87ee6c360661c8.npy +04379243-589599503c7b88129a87002a4eeaf610.npy +03691459-a6cd2be54bb9297d53c8f7a04cc7057b.npy +03636649-13ba3fbe8fbc53f3ef3a2c64cef919d0.npy +03928116-e92073bfdd7d3004f8ce064c0d1d8055.npy +04256520-e921afccfbc7137c5a95bb8b37106cdd.npy +03001627-8d40dbf5ada2f6f662e4024c69de065d.npy +04379243-c4202200cd2ff878489ea1c28ddd58f0.npy +03325088-1bec5441a4a0fc3d6af014d294c0e7c5.npy +04256520-ee5631d8abed7e69b06dae6f40c44a8.npy +04379243-304ff1fce32b5bdfadccd0ac21fd007a.npy +04256520-9f47842c7fbca0be593ebeeedbff73b.npy +02828884-81d5dd006f418712f4fb4dee5181bee.npy +04379243-ce88f6aa0e43bf8811099baf02792d0b.npy +03624134-a496cafc5238575291687e259c21528d.npy +03467517-c8acdfaec5008118343b0b12983b9982.npy +04090263-fb686ac45c8e545c8d1265a14954deda.npy +04090263-b2f4f17f6d59c6a53e1cebf83f3f1bdb.npy +04379243-b14cec4ece246fb75b937c87a8810c08.npy +03928116-59da3017ec277bb92cf5a6ed6299d488.npy +04379243-127d935d17cb36c8b0a3f25f5d8cb0f8.npy +02933112-3bb80aa0267a12bed00bff798ed59ff5.npy +02747177-b729214e49af571bf155d75bbf62b80.npy +03001627-ea281c9e968757dc351f7b956f3bf26a.npy +02958343-3d0308da43d52e3ef56f8ea3d9016e55.npy +02828884-6a2c354ed5212c77d2b12aa6a0f050b3.npy +02958343-a8f2c3adc0671c15c64e95fc6a597455.npy +03636649-ab8afd0f2f10be4f3443b22038d340.npy +04256520-b1b9c6c7b55d5bf845ed290334fca9ad.npy +02828884-18a3d4fa8abccfa7ff8d4c5a7727a428.npy +03001627-584ce0f244158b37de2b9bba503c21f.npy +03691459-a47b1e6d492bb68e8dcbd53cc631ab.npy +03467517-eadc5e7826fa778939257bd6adf678.npy +03001627-cf0d80feb2f6f71d9df508b37e4a3518.npy +02828884-4504e203b67dd8e473f10e6caaeca56.npy +04460130-17e229dbb42786e6b164f257e05e5435.npy +02933112-d6a58b80b6f1a4f9a14bb1d7e401bf06.npy +03001627-55192bc667582ebb83d21872be197422.npy +04379243-fc3d26aebbd75ed01e112f5fb42394ff.npy +04379243-cde57c6c75d1453a372bb05ca908b13.npy +04379243-a075004f2659de5a797e3338b16ee6ad.npy +03948459-115aa37af1a07d24a5a88312547ed863.npy +02958343-247de29743ed24c5e61b9ff60b1be412.npy +03046257-fb0dbe220131e28f6402b8f491cd92c7.npy +03001627-645022ea9ce898648b442b160bcfb7fd.npy +03593526-807620fed80ead9672160feea2b67fe8.npy +02691156-396312e9bec88c2590b1d6deb98feec6.npy +02958343-d4d7d596cf08754e2dfac2620a0cf07b.npy +03325088-6975759bc0f32b912f9e27b3b2a34f3b.npy +03001627-9e39c4ea1d69b2f19b1e9677d6cddea0.npy +04379243-ab8644ffc94a2f2dc746cacb18b4d81a.npy +03642806-8e13c7ff206a424fd52bc338a86e79b1.npy +03211117-d7ab9503d7f6dac6b4382097c3e8bcf7.npy +02992529-9f56c8a7cb64f4c36c87ee6c360661c8.npy +02808440-a4c022ea469ffc054416e513daf6e560.npy +03928116-7d4429c2b65ab0dcc05cc8f408623292.npy +03636649-9fdaafde365beafc37f7ce56c66316ea.npy +03691459-60a7df9bf00844735e7cf7bd2b19c869.npy +02933112-8fcaa6e3a07bcf5038169f16cecf9bd.npy +04530566-55da76d97620d111e3ecd2d9271dad4c.npy +04379243-9a066882ba79738fe3767a60a4ba1ba5.npy +03001627-1eed5ebb2af372cb5438b83aba42ca46.npy +04379243-924ea50a921ac1e032fe69ab8bb2a7c3.npy +02691156-228478022f30a2bef1f87579d4dedbb4.npy +04530566-eba55caf770565989c063286c702ba92.npy +03691459-4a124e8015bc6122778ed5a91adef178.npy +04256520-836d2a7bc26d1b75ec195f2cc52f3287.npy +04379243-25bc205f6de491f4ccde40b1205ec7ff.npy +02958343-e39215e03ab8e65e68428aabd2c41ee8.npy +04379243-bc6aee7279114dff428a5246ba7de3fc.npy +04004475-43ce5d7525f1e7cabd349f2c5e600fd6.npy +03636649-7eadde33d9f9d8b272e526c4f21dfca4.npy +04379243-4e9a4060a7fb0dd230bbd4cddd04c77b.npy +03001627-be7897b96b04a5d12aca5d156344f8d3.npy +03467517-a3aa87664655c03b276c3d558130f8b4.npy +02933112-ab870b99f869186fd523772c66ed5bc5.npy +03001627-a5d21835219c8fed19fb4103277a6b93.npy +02958343-75221b7668e145b549415f1fb7067088.npy +02691156-973df01cea43c7f690b1d6deb98feec6.npy +02828884-4d24a0d4ed77db9f4b3c42e318f3affc.npy +04090263-d88c106c00384130fb5c1b0f759e2bc1.npy +03001627-1b7ba5484399d36bc5e50b867ca2d0b9.npy +02691156-8ce12b6b3b451b8ad0671652a4c42f7b.npy +02958343-a5b7cc1a5ab2828b28b0b7b876595fb8.npy +04530566-fc15175b34b5e47ec57b4b6e80796be3.npy +02691156-e4d902abdf9481558caa71b1fbf7fb98.npy +04090263-39ad36394c9b7267e2043871148f79a.npy +03593526-abf5f73c5440f78c20d37e3fe8c3f09.npy +02992529-9911b2ee8470d6dab2098fa3046754f.npy +03325088-59d8bc2a9d837719b362845c6edb57fc.npy +04401088-1bff7e425c06b65af431996b7f8b435b.npy +03001627-50c446295496eca73542594e05cedc89.npy +03636649-78b95abd1d1158ffef3a2c64cef919d0.npy +04379243-2181ecc9b382a7a873fdbe4b39ff4036.npy +02933112-76fa5df01e82242c684b7bc3f8a9aa55.npy +03001627-df84087fe057385019e48122ff512ea5.npy +04530566-90e6c6083fcd47833e45dd2f173cbf9b.npy +02992529-d7ed913a3888696d289b03e5721252f3.npy +04379243-6606f65226a75c2e34fe19fa8681ba9e.npy +02691156-fc5ca618ae253663d13ef00338ba8c52.npy +02958343-642b4f6a2ce0e388284432ce2f42f498.npy +03790512-45b69ab448b01056267aabe46d1527a0.npy +04379243-636fb360173b08e788dcbe86402c7c15.npy +03001627-3270016f24001d9f3149bb9ed65c73b1.npy +02691156-6aa1ef13aebb1935ebdda919ac927e5e.npy +04379243-8a12ba383cbda72b91829b477862aff6.npy +02933112-850bd3a9b96e3ac67d3aa3bae1f7b494.npy +04379243-6daed91ae491c9cbe22ea6d770699e4b.npy +02924116-8d52b124e1c9ca6720d6874a38819f38.npy +02958343-c683e8e57b20ceeab927782fc69a1fbb.npy +02691156-a777672f17d3641f1aa9d8d95b6740cc.npy +04256520-157ed8452a7edab161412053ff521f64.npy +04401088-8ec3b148b8c608a0562c671ec5000f23.npy +03790512-8cf5bd117e04da6d6a3456c0ab5674a9.npy +04090263-f6d74e48206fca39a6e43b878d5b335.npy +03790512-97bb8c467f0efadaf2b5d20b1742ee75.npy +03790512-6ce7a58297a6fa5c8249f134aca4c817.npy +04090263-98ed5fe737e80b11eab5ee569c9de1b1.npy +04530566-6abd7ebbc9020871bfbc6e788697e036.npy +03948459-8a071ea65e9057a1c7c8ce3bef5c2aa9.npy +03636649-55b002ebe262df5cba0a7d54f5c0d947.npy +02958343-365af82203c96fbca92a4cdad802b45.npy +03991062-d246fc3587cda5787c6842d93e448798.npy +03325088-994f4a915885dcadc36fb70296e45483.npy +02958343-d6f8cfdb1659142814fccfc8a25361e.npy +02808440-9177eb193eac94dbbdcdba9491bb75f8.npy +03642806-9cb17f33ba3c057255d5baa5be4ca05.npy +04379243-7a0280b9d2fbc2244cbbac005f3700ba.npy +04074963-c99bbef1b2c514a81b22d29e47ec3f2.npy +03001627-108238b535eb293cd79b19c7c4f0e293.npy +04379243-2ef899e67eecef65190a91fd9a6f7d55.npy +03325088-4d8b953c08a287c26eb5b970490a0d07.npy +04530566-a8f225774d1bc8d0b7002bddf0942f8e.npy +02747177-a2e813b6032aa494a1b95b258b5f7139.npy +03001627-815f436a40c28da51f56aa11cd5e0c3e.npy +04379243-ec0d4fc8d4c29e7a7ff6ace05b36a5.npy +03797390-387b695db51190d3be276203d0b1a33f.npy +02876657-5e896bc124bc0af9fd590443d27a974e.npy +03691459-16a8c851009d6786887e8faf8f33b0c5.npy +03636649-3397952c22be7309796c584ff1fcf56d.npy +04256520-ee63182f95899a7419fb4103277a6b93.npy +02958343-dce6f59b6ab987d4bc863bdef4e7bdac.npy +02933112-5b112266c93a711b824662341ce2b233.npy +03001627-61f71cc002f6da561c81652b127a0ec9.npy +03001627-9c700bfbe8730e6db8f4af915220b65b.npy +04256520-34fe095ab6fbf3a09c0b027ae5b223d6.npy +03001627-79ef569979791f136f10b4c199f4a16d.npy +04379243-82b5a7823990ff0f48964aae007fabd0.npy +03325088-f6b1ca2df0be11bdb362845c6edb57fc.npy +03593526-b362273df5596c7e7f095f36ba0999f4.npy +04256520-32b6c232154f2f35550644042dd119da.npy +03790512-a9399a50fcb25209429f1c522640e6f0.npy +03001627-41fd861b4f4b8baf3adc3470b30138f3.npy +03001627-9a35f15e924e19db637adadafee6f182.npy +02933112-18d94e539b0ed30d105e720ebc569399.npy +04530566-1d8b27e78b2f326480d90033321f5c09.npy +02691156-6db040a8d5c1d5c14d210d9468aedaf2.npy +04256520-fd4285c2c5050ff7e8bb25231731c25d.npy +03761084-4b896032652578d8b5d95a89c22ce403.npy +04379243-8db7935008158509b55b46d261fe0021.npy +04090263-a8eae38e77cabdbd873aebd175ac6f11.npy +03001627-326a0c5116e410cfe6c1a071a4e8216c.npy +02958343-188621bbfc7d9477ce27281f3b76d1f5.npy +04379243-81271aca364735e4e6c5cd45aa112726.npy +03636649-b11c3bda15930ee7bba5aaac798c64af.npy +03467517-93519f396ef3cb23a00521ba9447845b.npy +04090263-eb6e7e6241c20448a3fb48700889ab3a.npy +04379243-6e8d22c6e069b71965b77a565916c7f.npy +04379243-86745eb914ded54c4ddda47ee90d6a21.npy +04530566-c2d6e8710215b74c82689dfa8a7d7e7f.npy +03001627-8cfc69d79fca89223a4a5c95fa1b0032.npy +03636649-893d9bdf1d7efe71bb5bd941c6665c21.npy +04530566-698f399e6c578386b64d3e1832079349.npy +04379243-aca97b802b08e220ee36f204dec02883.npy +04379243-575ac593154b95b6dae7645f889ddcf0.npy +03797390-a3cd44bbd3ba5b019a4cbf5d3b79df06.npy +04530566-29bff2fc529f82d676051c4eae3f0a9.npy +03001627-b2c838917b9f0fb68a40e1421d6a3cbf.npy +03001627-af28dbdce6ed8cea19fb4103277a6b93.npy +04379243-608af07bd357d605f155d75bbf62b80.npy +03513137-13f607a462bd1ea83b13741399690655.npy +04379243-e8689b8b1610bf2841bb8a7ba579a58.npy +04379243-a5d6b025b4c7239df1c7a32d97b27a4f.npy +04256520-aec403bcd87487b5b3aef1eb2166205f.npy +04379243-62d51d3d505aec1e5ca3dca3292dd1f.npy +02924116-35b752db6bccf0be5f0b5ee0fb357b4c.npy +03797390-fd1f9e8add1fcbd123c841f9d5051936.npy +03261776-a5a29c03bca0ff22908c261630fec33.npy +04379243-96b17bfa556f57e29d2be74cfb51ade1.npy +03001627-d487d3b9579762cb5dd170fd3a296ebf.npy +04379243-8dd8370dcaa8d770ea5682a3b818969a.npy +04379243-44bc2b9ceba25f8555f46d55537192b6.npy +04225987-97a1800db9a625bc28044fe9244db50a.npy +02933112-283bf988df376b9786ac7f2dceaa530.npy +03001627-4527cc19d2f09853a718067b9ac932e1.npy +04256520-9b73921863beef532d1fcd5297483645.npy +04256520-7d6453e00288991c61bf0ba277ea473b.npy +03001627-a564c8a43f6a7ba5199f2eca998ded6d.npy +04379243-3e6e16cc5a4f26da30bbd4cddd04c77b.npy +02946921-baaa4b9538caa7f06e20028ed3cb196e.npy +02924116-e0b2e30ffdabf5d4473f10e6caaeca56.npy +03001627-5c2b9c31cf63b0b93724abdc4106b950.npy +03046257-4e5b4341af6bd97368baccb6cef7077.npy +03467517-a42d7ee49607640176d05024fabfa1e5.npy +02691156-320e639572e8b9ceca504cdc40c452de.npy +03636649-a9d554c5d9d09405fcb8d8c6d4df8143.npy +03001627-81628a0b5f7f9ad7ba94feecf6f7a200.npy +03001627-efa83c67ce47bfca304edcf7c4314468.npy +04256520-224ccf9ba2b786d953353c404519f02f.npy +04379243-283e6da77ada4d65d42225b7548c8765.npy +04530566-89f52a2a136ce55728ba119bc0e1c878.npy +03636649-611f9690f6eb4da79a6a8a8f3fa61f11.npy +03636649-3ab3e07e432b0afb6b1c0c9b30aea3d.npy +02924116-ee8d5ded331cfb76c0100ca2e1097f90.npy +02828884-7ecd49fc95f8eafaf4fb4dee5181bee.npy +02691156-ad546b049b2246bd609e2d916fa0da27.npy +03001627-58620941b03e46b6e718b2093cc8d7b1.npy +03211117-8ce9fa1075039c8c63f4b01b3d592bed.npy +04379243-eed2fa156d662c79b26e384cea2f274e.npy +04530566-a8976b06101853deb4d272023dce0149.npy +02958343-e624da8cd22f6d289bc0c5b67eaafbc.npy +04530566-ec779915957e5361ce000b0a5d25ebdd.npy +03636649-53af1ea051d78e799904d527fb5485ad.npy +02924116-152d5e60eb9c72abbab671af2c92e476.npy +03325088-77c6367c2d0b0c9e29d75ea275a1cb4e.npy +04530566-65f78142a6c33a89ea7dce1646d86149.npy +04379243-9e42bbdbfe36680391e4d6c585a697a.npy +04530566-5aaec5938224841f36cf5f476d32636f.npy +03001627-8b0174afa05ed3c2dcadbd99efe6967.npy +04379243-5237a2e80c68f90abf7421909bb3502.npy +03636649-3b64d5033c580d2ef76898f881b76a.npy +02828884-ca04a1b1ff6701f8ad5067eac75a07f7.npy +04090263-e27f87039008855a341b8a806253912c.npy +02691156-af73d05ac86369bf4ce863ea27e2b897.npy +02691156-68c61d42222863682296d88107d065f6.npy +02958343-7015c7c8ee74f69313ded1857c15b5b6.npy +02691156-e0385af10bddc6a0ca8607f540cc62ba.npy +03636649-d52bcf6a2c75ced5fcb8d8c6d4df8143.npy +02808440-5c06133aac3e8fab3321831d2245cf06.npy +03085013-72d5aad0fbca8996ef04aec0d9ffcd31.npy +03624134-b5090018439903e0202be79d8b285c1e.npy +03691459-ea7d44b28bd22258f5ec01c1dd7b80e.npy +02933112-4dc45b86bdce7d96d37a1bae74ee50a2.npy +03001627-78bb9f39d4251624a502e035aafd3af8.npy +03261776-5acf58974a81ba7ea7b482715d4b6103.npy +04401088-996fd7ccc0567c3c6b2ba76eab0d2b1c.npy +03001627-7d1a9d6a3297ab853e02e5116c35dcd3.npy +03467517-853a5832f15461c9e8f705eb96ba3376.npy +03001627-c47bcffe3e74391af3c9c1464e55d580.npy +02808440-200c5297948bf57f6b448b8aaebb705c.npy +04379243-b8425a23b0525ccf004563556ddb36.npy +02871439-84fcc00a222163cd2f353d2ea8863d32.npy +02691156-bd8c9f9442124cab5e64c90e34fc13b8.npy +03001627-7f73cc6c1c9121a9b9f2eb77f5e247e.npy +02818832-970fff8bef63e40bb138abea28057850.npy +04530566-3a4c31888d291859f8e1db0ba8b72d09.npy +03001627-2c4719f6aa7b2c8a5a9f35e635b7e48b.npy +02954340-a0fc32a763b57b85f0d11ae402ef940e.npy +03991062-f2aa612d6ab76bc1a2c59a4d90e63212.npy +03636649-5f9edd0b9cdc77ded49b2e04785f8492.npy +04256520-4180d98246089cf014038d588fd1342f.npy +03938244-4c617e5be0596ee2685998681d42efb8.npy +02691156-1659db64bbf46bcdc1955ee4b5680e91.npy +04379243-aa41c42a9a79070de4a490bdf2c3ee62.npy +03691459-f4290921bda21901caf9cf929ed6f71c.npy +03001627-d0c6af0d44cc068523c1b1df1d480bd3.npy +03001627-7309610420ae20c930ddb6ead95f49cc.npy +02691156-cabce3320f119855a5131d38588a62b.npy +04530566-daa1781b81a74852bddd6eea3463dff0.npy +03790512-2c6e2d1e743b93b67f44d6925c8a069.npy +02691156-9c7268dd8ec3a3bb590874dcd9dc8481.npy +04379243-66378f0a068a111e57211f5bbbd90b35.npy +02958343-3134927c492c39e241d7734b73edc062.npy +04379243-e1d7b48449559549303c85804d402599.npy +03046257-3699e4ac78eb732866a92e3fe9fdc71d.npy +02924116-ea80f7a2a3b97d2e8f3f2979f302c57.npy +03001627-8eb33e21e03b8f84db039d8689a74349.npy +03046257-15cccdfb473dae1799f30106e678cab1.npy +04379243-6c2e919b70c335f240ef1c8b63a628f9.npy +03636649-c961e64a930680bb900a91cbf836390b.npy +03593526-244399287185e74d8ca4aeb5e3b33af7.npy +03337140-94453745e0faafe2fd938442e7c3fbc3.npy +03636649-748e643d7982fab3fbdebca9f6788597.npy +04530566-522614512d74a2f8c5f391634c2a5ade.npy +03325088-990ca49fe2a40eee5c19b45944d27e3b.npy +04530566-64ceb6b8d122c2b3c9b5311300e82c12.npy +02691156-e0df54a0990000035dde10d3d9d6a06.npy +04225987-563569e15313d7eb89e13811ad04f53f.npy +03691459-f57c5e8f460e659f395ea88528a634f.npy +02691156-2d01483c696c0a1688be2a30dd556a09.npy +04090263-37cc0262192286c2e4235a2d12e58a2.npy +03211117-87b093f1fa5495968cb623bbd4140197.npy +03636649-b36bfbbc98cb45431735ea0e092a805a.npy +04379243-f1323a66816293be29ae2bc03882456f.npy +02958343-109567d7d55b8fe515a520abec2f04dd.npy +02691156-d1119217281b8475fe755e3418b63110.npy +02818832-a224f207c639eeaf8d704b7b9cbe87.npy +04090263-58613784e5ff705aa74a2c673ce55a44.npy +02958343-d2776550e240c0d642fb51f57882f419.npy +04379243-af71e4dcd477656f9cd431573238602d.npy +04379243-aa615f385b320782eb57f2e4f0583f2c.npy +04379243-8abb8d75987c92144417a5312cf9d851.npy +02958343-90917495a9603208c368040825ed335.npy +03593526-c7bb8b9685f0378307f509cdf07ef62.npy +03207941-6e5bf008a9259e95fa80fb391ee7ccee.npy +04090263-734c46fe71b6021416b34c3751bc447d.npy +03636649-72bc0272ab1ce5a3f8d6a4359d6a181b.npy +04379243-706dbdfc48b19b0f423f1f7d60608f89.npy +04256520-8d69121ec9f174cb4db79ead79f57b22.npy +03001627-2db6c88145049555e6c5cd45aa112726.npy +04530566-da4003977c998e81f74f6fb7142d37cb.npy +04379243-2e5ac0552fa296c43bbab77a66bc3671.npy +03211117-f1d77e0f4a2adc2bb305a938e0ed1b48.npy +02691156-800ce26e517769dcb87697d3904b168b.npy +04379243-9ee005b0d0cf88a0e7e684d25d4dcaf0.npy +03636649-379b2a19deff9954f51f77a6d7299806.npy +04379243-fd09a960ef86fecfc515407725a6e525.npy +02958343-a89dd60aadccd84be04e0c24d5a9d818.npy +02818832-ba1eaf2862426015b345c23c11c95b7a.npy +04460130-149f13db5c358ecfde1c31612629d3dc.npy +04256520-2e1563209d3318b2d544b90b3a170602.npy +02958343-841d9f6bbe50ec6f122568beab222093.npy +02958343-9752827fb7788c2d5c893a899536502e.npy +03636649-f3a9cc3060fd6b0e6e4f8fc909e0d34e.npy +04379243-2486659a274a6400ff07dc9cc50c993b.npy +02933112-5f2f90d83db6bcafe7e684d25d4dcaf0.npy +02933112-3d2870c83ad35dfe86d53ab0fe94e911.npy +02691156-3029b9f2174da4b0bbf3143b1cb6076a.npy +03624134-e2cd287563f26e3eef1f81f15fbe736c.npy +03797390-f99e19b8c4a729353deb88581ea8417a.npy +04530566-6b2fb8cbc5365f5c8cfe472915a175bb.npy +02992529-3dd3ed204c56943389e13811ad04f53f.npy +03467517-22760e2b45e67d724d88968940783b69.npy +04090263-47d871d9a3b5553cff790997f2048517.npy +02924116-800d1ff96ae2af8059a2046f98794106.npy +03046257-3b19d7b7f975a08abffc4b354a59e33a.npy +03001627-ff034050f7ca727ea64c9c407ff9dbfa.npy +03593526-e15fc6c148793ebca6508ea9c3850f4c.npy +02691156-fe82a9934a38997866cf1b4a8fc3914e.npy +02691156-d8a037897d5d5b108130971b27e95927.npy +02958343-77d884ef56bc97a8b7ddd670a53fb311.npy +03636649-405e760fb406d96c2cd3f16bd931920d.npy +03467517-7701180906a0aa156a7ae841f1f88f87.npy +03001627-4e3cc3f6d2c25b904addf6a5f8726274.npy +02958343-e9bdc6c0a9e4675bbecf71e2e014ff6f.npy +03467517-9943ae38cd844c91082f2ea630bf69e.npy +03001627-bace9433ae54fcb3290d57214c8512a4.npy +04379243-fad834ac9ebf8d5595b7b91db37ae400.npy +04256520-bd98ff55306cdd592c509b30860f3d1f.npy +03593526-7037b6266188af53197a35146ee825cd.npy +04379243-55547d2fae0e3dc21705bfd3afcd10e.npy +03211117-252640ae350a1e53f119712971a6882c.npy +04379243-ed6e26db873ded9573e85324169605dc.npy +03211117-25a09a149d018bdcaa95bf474e195f02.npy +04379243-1011e1c9812b84d2a9ed7bb5b55809f8.npy +02691156-688930b9d0e06ead9a6e43b878d5b335.npy +04379243-29b57f226644c696e921ee447a9e7b42.npy +02958343-6fcd4ab4d968a975715e04edb8af9c53.npy +02808440-cf9814ecd52f9dcafe52ffd0e748a1ab.npy +03636649-a0858fbc08ec5e34e7e684d25d4dcaf0.npy +02691156-c6d39a3c52f8beaf7f6c3adc89eef8e6.npy +03642806-10f18b49ae496b0109eaabd919821b8.npy +03636649-b2f18bebf6566bcc97554b6bd947feea.npy +02691156-a8773829298f492cbcb9a99298d16322.npy +03467517-a7ddf2e5b9dc278293f0194265a9746c.npy +04401088-9d021614c39c53dabee972a203aaf80.npy +04090263-14fa15f31d713b7153b838b6058a8d95.npy +02808440-28f7f68307ad843944221bef0fa3c36b.npy +02828884-107eb4f1731b2466780bc2708a85ba9a.npy +04379243-a83bee7cfe190a1dc26fa198e521610a.npy +03001627-7710ecf956701938b40f0ac0fb9a650d.npy +04530566-812c1a3dacdce93ab4b5d7d0cd89b504.npy +04379243-9c1b0058dfe027cbf519adc9991b5f11.npy +02808440-fbbe1f77590ae6771a3b39b07e4b3d0f.npy +03001627-a1dbdff3da83425f3eec26c23f5bc80b.npy +03001627-72bc27a22e5f516e8aee1b6cfa0c3234.npy +04090263-a3c96f18e2aaf2efcdd76170a7089b09.npy +03046257-9f51f591d698445a5fa2d7ce8c99e4e6.npy +04004475-f8bc97b503ea024c4fb4be49c5910c7.npy +03642806-bb33d26f324d19d94845e0946708405d.npy +04256520-26caab5f69ebc9693eec26c23f5bc80b.npy +02954340-3dec0d851cba045fbf444790f25ea3db.npy +03636649-86d556273aa5075aaa660c42e675c161.npy +02808440-a3fb3caf38b63d06ccd0340812259a39.npy +02691156-1f672d2fd5e3f4e78026abe712c1ab05.npy +04379243-fc7d921df59e86e6beedb4c8fd29e2d1.npy +03513137-30c9fc79edc88adf438fdee28ab485d3.npy +03710193-580f93299ad002c2949ea1574c63d947.npy +04090263-52102b24df4b0e09fe75cc28d6fccb4e.npy +02691156-d7f3d0503ee4ee1cc34b900bb2492e.npy +04379243-8d5dafee7c2e89aa4cbf9a02e3342127.npy +02958343-2cc4573bb9441493d12568d09c2fba02.npy +03001627-e0154380de563d2cd81aa8b56a36ec8.npy +02933112-1b6e680e76d452a097144612c70a9099.npy +03001627-f5fdaff0ac02f106e8f8c11a24c52ebb.npy +02880940-e16e27d3670853b12d4e6b2984840098.npy +02691156-f71028dac9b396fe80288501d9901d7b.npy +03467517-4110ce992cd45b83d3270fc46b08e35e.npy +04256520-c9276f00529396bb35836c728d324152.npy +04225987-7a8b7d5d288742546fee3d712d650ac2.npy +02808440-e5a1ff704398c55ede9471c962dd6ba.npy +03691459-4e06e2b59a83bb6229cd1f0bcc30f82c.npy +04401088-6a0c0c55f355cc23a0eb5a85db887292.npy +02880940-1fbb9f70d081630e638b4be15b07b442.npy +04379243-a86969194537bd5a3a602af85160c9b5.npy +03211117-c356866299f4451cd3563af8dc07cd64.npy +03691459-192fd6e662d89b62dbf53b03c847b004.npy +03928116-bd586b69c27f05c8fcb3c6c0ffedec6.npy +03001627-9b8c50f5b9e67dec35836c728d324152.npy +04401088-81ad8af206d6b21b89b367279b017ccc.npy +04379243-1482036d8ce3b51ffc0035da39bd5e1.npy +02691156-14161a05a21cbd6f62b600da24e0965.npy +02871439-777785bf709e10ccffba1ef7a9b50ff2.npy +04379243-db2d4f781756e687d8864caa856253b.npy +04090263-ed9e0161c72f98d5def607f4d4140edc.npy +02992529-cfc5fce3c76610e3634fff5505144a5.npy +02691156-2a06adfb446c85c9f9d3f977c7090b2a.npy +03691459-e66e2202b11cb7122d563c85edb49108.npy +02958343-d28d00d6488ad1a78079d5a13e411210.npy +04530566-2fe634902b6ba945b4e4ece897f04daa.npy +03593526-41391118c374e765ff3ef8f363b2cc43.npy +03001627-5510d5af1ab5714b3c42e318f3affc.npy +02958343-dda0d7e01642f399d4118745f38eac76.npy +03691459-d8f6aaa777f0cd4f5a31d91ec836a511.npy +03001627-88cb38c612cf60dfab50b8ae6c38666.npy +04090263-d254cbd6f2e319ced348fc2382f06377.npy +03211117-64f6ac23636c5c2c8a17805dbfb751e2.npy +03636649-6c4c45af95f811e479414e04132a8bef.npy +02958343-b790d70257a8191a29984c4afd2e98a4.npy +03642806-5eefc8f2d755c843614c1d5b48350fb.npy +04256520-1476ee6116538beb1d0e6f3a33226a84.npy +04530566-80439bf303734b76ff37346ffc41ec74.npy +03636649-7f5bc32085dfbbb88e7662971dc736f.npy +03337140-16345185248d057d2b352e2703063a3.npy +04379243-8497e2cce58a0ab46827eb366939da8b.npy +04090263-f5a561a38af6b829b3066d9a2ba0c7c3.npy +02876657-8cf1cc180de4ecd0a826d25a0acb0476.npy +02958343-da92c8d35fabe4093a67185d75524e9c.npy +04379243-a1c04a11d0e20691fa3982b18d6e7664.npy +04379243-f58e58ad9952e174d058858de40fec33.npy +04379243-7f2d4ff98dec893094210977e5394f26.npy +02933112-a6565be9e3fb8e1095bea7c29e873d16.npy +04256520-4106b3d95b6dc95caacb7aee27fab780.npy +02691156-65278860c7d0f3704f59c2a67aa8473b.npy +03001627-1e276a016b664e424d678187b8261d95.npy +02942699-15e72ce7a8a328d1fd9cfa6c7f5305bc.npy +03325088-f403e37ca7831479b362845c6edb57fc.npy +04379243-1c38f1631efaf9fbaccd05bb6a369505.npy +02818832-1619aa637cbb6e131ba2f806cba87b47.npy +04256520-9500ae0f745fc9efe5b815c86e529aab.npy +04530566-ecbfa1faba336185bc33bb3e21836dd7.npy +03001627-e425c1db44d1ec8ac73ddf48fc777dc.npy +04468005-bd06d7b322a2c65147367565b9fdaec5.npy +04256520-38fd2710b8fd5eceeffcc073d8ec38f6.npy +04379243-a65dd1088e44917b93edb2fe34609efb.npy +03636649-c99eaaeb9b941af62ebeb1e6a8111f53.npy +04379243-2889aae96f0b236e27790b0ec8671f7.npy +03211117-decec5d8e1f9f54e1a5295d0078b5d60.npy +02992529-953a952a18e389e4eb386a4e845c05f5.npy +03001627-a5a5d118118eb760fee31d33418a3c16.npy +03001627-c1e03281b9f179c7620365f6656fe3.npy +02876657-542223f09a872e973858be97087c26ec.npy +02808440-b3af478264146f6ad9b53420a5458c53.npy +02691156-cc6041868bf2913312b981fe5abe4a07.npy +04379243-11ff78cc42de92ca597976c675750537.npy +03593526-3a6e1c3f0755d58d774ba10f0bcc178a.npy +02958343-f2b28cd6e6eaa9679393793f9cf3dbea.npy +02933112-7aac04fa0361f0da2f8bc0d6e7c6775.npy +02958343-5057c9dbf72e0352728fa2df514c65d4.npy +02691156-43ddfbedbd6721fa828204947d78b9af.npy +03636649-bfd36d77ecdb0c9de76bc197b3a3ffc0.npy +03691459-88842eadd96e5cab570b6bda9783c8ba.npy +04256520-81018f492277b7649f13e3294f6a3574.npy +03001627-b3e4c494a862986b9226550f5173ae53.npy +03467517-f3500593f65d37e5817f6c88302b2a8d.npy +04225987-98222a1e5f59f2098745e78dbc45802e.npy +02958343-8aa9a549372e44143765ee7ffdfef49f.npy +02958343-687253f72301b508c9c0a46cc4ca6589.npy +03001627-46c6d2fb8c92cba419fb4103277a6b93.npy +04379243-be06e77602ee4d089c0ca344f487323e.npy +02958343-4e9a489d830e285b59139efcde1fedcb.npy +03928116-7ab2295c441170a967aad4e7f685c416.npy +03790512-88950eedce83a11ad4fea43a014cf734.npy +04090263-65aab903355c7abeb4cdad9a5bf52dd5.npy +04090263-54b68b9a4c40e86b3da3f9c40ebeed54.npy +04256520-899a328f7c0292c5998b2b87439f61bf.npy +02933112-1b212b67e5eb90f4da5feafe6f1c8fc.npy +04530566-7a9ad733a68b93bbb1bb46d2556ba67d.npy +03001627-44c25bfcff4a4a4e4dea158f05aae320.npy +03593526-569b55cfce8c4d15b136b011ae1ece0c.npy +04090263-191f8debadb867fbc24d00518a3dd6ec.npy +04401088-e11ff7bea65e8545c3f912172873d52f.npy +03001627-a7aafe44f64dd04dfc6afbc561d74a4e.npy +04401088-c5188dbebddbad3597cfb99c9c9efbb5.npy +02691156-5e124107cb94b90218ad244e2cb2c6cb.npy +04379243-c7d36b8a4b79f89dc963b248f3fa9d25.npy +04530566-bffc229892a3d301c8bb4876165f947c.npy +03928116-479f9b6c9cbdea649a957a60b2bcc479.npy +02828884-b9eb4b3d3ed564142427332fd13e1534.npy +03642806-d8ef2a8a3ccff3fa5cad2ceae48f2da5.npy +03948459-800cf19b2f7ce07e1ee14c0944aebb52.npy +03001627-cd9812c163ddfb3e83bcab979449e28e.npy +04401088-4dfc1e4efd7fbf083cdba96133f0c38f.npy +03001627-f4a36a5ae5a596942d19175e7d19b7cb.npy +04379243-89142ab0273740f221bdbc0445d9f748.npy +03467517-ee7d5c8cd074b18992eedbdd14b936d.npy +03691459-c2024c0fa0906fc724abfaa350249967.npy +02691156-ade0163327c8c7f5847335355bf4459e.npy +04256520-7e550e32d80421aa19fb4103277a6b93.npy +04256520-1e678fabd0622a1119fb4103277a6b93.npy +03001627-d7ba3ad07551c886a2c9d2062eb4aba4.npy +02992529-759c984fa6831ad7bf0defeaa770e93b.npy +02880940-f44387d8cb8d2e4ebaedc225f2279ecf.npy +02958343-5130947e5f18e73a8321b7d65a99d2a.npy +02801938-7b407dedd933e3812f59b845f0db2ab3.npy +02958343-f374adc8c35b9a0b3eb5f91920765edb.npy +02992529-9dc1088c4f5de29ac78df40cf2e9097a.npy +02808440-40d7753fce9bec3c3321831d2245cf06.npy +04004475-83b080e6ea2a46242974cfd5336a9b09.npy +02876657-8707d78855e8cce1ed51290fb4dc2857.npy +03624134-5aaec976445f88662b994aa4e028ede1.npy +03642806-24721e62300a3c4f98be7382d7a678c3.npy +02808440-3e2b33cffce8fc632dda19453ee07c6b.npy +04256520-8258954eb7929aa13542091189dc62b5.npy +03211117-c0c1c344c3bcea10c0a5099af057718f.npy +02924116-2f77c7fc777f8b11665c5daec82c51b2.npy +04090263-60efcea872fa7e52341b8a806253912c.npy +04379243-5aa1db3eb76c53aeb660da28fa2f03da.npy +04530566-3e5147f0fcca2ed7c2920de4c5efc2ee.npy +04256520-de91f9457052646eb658faecaae06eb0.npy +04379243-307bdd2a06137694a10ff7fd5e43a633.npy +02691156-d2815b419e61dbb0b87697d3904b168b.npy +04256520-526b961864b9cb0ca81116f5456ee312.npy +02691156-5cd68dfe309e1f8317e5bbee411fa5d0.npy +02924116-7031bbf89b4c551b66cdb417aa9cef4a.npy +02958343-67a3dfa9fb2d1f2bbda733a39f84326d.npy +02691156-ab399dca637174fb9a4a28ef635593ce.npy +03636649-18ed152bad2c123b4b3c42e318f3affc.npy +02958343-1399eab8ad7262eb7f3efc94c2d31dc5.npy +03636649-65f23d07991128e3fbb8cbddab1c2002.npy +04468005-f12ab466f3c74189b1112c737944f1b6.npy +03467517-e45f323ce7ecab8393f0194265a9746c.npy +04379243-3fa4ca95ea2c3d4649a734174fea032e.npy +03001627-75b1bcb68c8344261a648655355dc699.npy +03593526-d5ffa68a7be137ab157d60b585b8fb6e.npy +03211117-52387a90d9aa2fb019945cdf27c7de1b.npy +04256520-4fbadccbdd689b18b8708912bd92e115.npy +04379243-e8632c8830944cfe422be95e44ce930.npy +02691156-3a7e89dc355faac111f5789deac2dcac.npy +04379243-8e66fc32d49732c4eff311703ed2e9b.npy +03636649-2cba43cc26f174a8f9a65dcd8ee605f.npy +02808440-42d7c051c1e771ba3956bf2322987dd4.npy +04099429-beec19e75ba3999a46f4fa69a8f7f711.npy +03001627-c31a206ddb92909e84f0c4075db76b7c.npy +02992529-504c453471faee3ee304974abc9afad9.npy +02958343-45186c083231f2207b5338996083748c.npy +03636649-27910c314eadb1109998b4eb812699dd.npy +02992529-937b3450c8976f3393078ad6013586e7.npy +04379243-1e3871159daf135370bc652a18e29c3d.npy +02808440-8634d5d3fbd559c8c49077a31b9f504a.npy +03636649-4242398ccded25abd3ba76930e17ffc8.npy +02691156-82a472004d00b288b4d569aa61960548.npy +02924116-5b04b836924fe955dab8f5f5224d1d8a.npy +03636649-1e0bf9701623f02014038d588fd1342f.npy +04401088-b87251d1d4f4b7ab2c216c5e0f221195.npy +02954340-6c607b6b3d6fc1cdf0d11ae402ef940e.npy +03325088-270123ec327ec824c36fb70296e45483.npy +02958343-7f2b01a53684e72154b49557f8ea8b42.npy +04256520-9c0c2110a58e15febc48810968735439.npy +04530566-fcb92e30085a580d9c6645849b3b7d65.npy +02828884-7c335945340c674cefacb264ebf1ec75.npy +03636649-f46d1e234c05fa4e62635f8519c19a80.npy +03593526-e51ccd45d54c9f4225e65d4b5f3b6456.npy +04530566-397f37249263000990960087ed86644.npy +02691156-c14ffb40a37074ed26360e1e29a956c7.npy +02958343-e2d98e5fa33b5b0daf8a2e210ebd5168.npy +02808440-686dd1bdc574ebd152b20f433bf30081.npy +02691156-7feab568d879270dd8d90babf3c5509a.npy +02808440-ceba3a37ceb3f3cf798df87163b1956c.npy +04401088-b8555009f82af5da8c3645155d02fccc.npy +03001627-6015aaa9ef170d9bfdef1c01cbd4ae0c.npy +03797390-daee5cf285b8d210eeb8d422649e5f2b.npy +02691156-e08574959d2cb7c8f6cabb305f7d6d18.npy +03001627-c0c823f094d972c94b3c42e318f3affc.npy +03948459-d76b953813ea5024dd3adf3090c701f7.npy +03636649-24927157e3a53c1f91cb6b6c47a03f13.npy +03001627-1e7bc7fd20c61944f51f77a6d7299806.npy +02933112-70eddd0ddf5c9ba21c1b3b2ed8d13bf8.npy +03001627-a81795209ce65006ee0f4a6e5ea1d8c.npy +04379243-901eb5d8bab4bbe48fe31aea3727611.npy +02958343-572edac8bce600c56f2b832ee4c8c232.npy +04256520-b5b77de7a8a05ab4f09df371fae9d63d.npy +04379243-28fb3bc8ab9f518035836c728d324152.npy +04379243-51d196f6b12a84ddac594abb03ff6297.npy +02958343-abbd90920a240df2ed3696d854eee1ec.npy +03790512-acd49452b452cf2f3ab3dfa44f5fab01.npy +03593526-595e22f425839eac2d4b0854f7611ed6.npy +04379243-e9a38d17361a5f20af268f6180933aa3.npy +04090263-e42d10c193cce254719aed4531d5366b.npy +03467517-b6d2d35747549a5b93f0194265a9746c.npy +03001627-475cf49d3764f04ecc8bd7a04c9659f1.npy +04256520-b1db7a545796dfedce59ea70152320fa.npy +04256520-2358a67773472af0826fc8d57346a2e4.npy +03691459-3187862d922b0ce96583871b5c274818.npy +04256520-c40adbdd817cdb7a14038d588fd1342f.npy +02691156-e5c98b67c146cd61e816c75152573ee0.npy +03691459-945805d18c0de73ae3e30e20ce3a5bf5.npy +02691156-a80a6ec94928f7dfe87d0cb113e517d2.npy +02828884-6b47fc9f533618719c8ccc4e539799af.npy +02958343-2696ef55dc264b8cbba9b483d5f3874e.npy +03991062-1b10d9cfe0211e8dd31520fd3c5602c7.npy +02691156-645b2bf682e865ab9a6e43b878d5b335.npy +03211117-ff2664a07ecb6edceacb155f400b9076.npy +02828884-46b3e857b7faab0117f92404d4be5d8.npy +02958343-21205bdb7ca9be1d977e464a4b82757d.npy +04379243-ee43ed656acaf774f4b6538438a0b930.npy +04379243-7ef03c6cfa3621f8ae46e333ff78e5b2.npy +02933112-21ffe8bb21951feb5c8adc541f88498.npy +04530566-a49537b465965537fe3128d27fad4d2.npy +04530566-3750fdd9ef7f941d2173755309fd0db7.npy +02691156-2b0a2bb1556c96b94f762cd8ae1b1c4b.npy +04379243-121a3040c28295829e4b5aa807bb4e7.npy +02933112-25d7aeb2970030371733347bc72de5f9.npy +02933112-4d690cd9d3b41f46ce5d6e9371bb5c33.npy +03001627-26908ca3183b5a4223500a5b036df62e.npy +03211117-31512a50c12258726ca2b6e5474aad11.npy +02933112-169d64acd930adb12871cc0b3cc1a485.npy +02958343-ae9b244f9bee122ba35db63c2ad6fc71.npy +04379243-3a85ef469535f0542cc8fcd230a7f687.npy +03001627-2d8f0977b9c6592ffebad4f49b26ec52.npy +02871439-4b9c35238db89e93464280042b597d.npy +02691156-45a4ec99ed13ed773c2498c4c2f13ca.npy +04256520-f8ccc92a6a5d20875eea3e3d89293379.npy +04530566-31a41e6a73c5d019efffdb45d12d0585.npy +02818832-642a38b553a520c03f7f3ed2c3c690fe.npy +03001627-2b70fe0b5669985c100bd20b85b3554.npy +04530566-65b75158bb049f5af647317afa6ffdd4.npy +04090263-fd2435673c53179dd1a62290a53cce98.npy +02933112-5edc6766196953a28f62bdf4e9082924.npy +04530566-f91e712b124915514b6c44ccda750d2e.npy +02691156-a39880327ac8815e62b600da24e0965.npy +04090263-465746159129abc7c0d38eeb2893c7a.npy +02924116-317907b3d4830c6db7e4d3ed6e9e6394.npy +02828884-84e0619bd80f5455880e561fa6db53d8.npy +03001627-46743849f0b01b1ca72559fc4f86f700.npy +02992529-128bb46234d7250721844676433a0aca.npy +03001627-c04c5b7d68b4e6481a68dda91fe5259.npy +04379243-bbdc08f4f00c484f310af74324aae27f.npy +03001627-95d082c78ea0b1befe52ffd0e748a1ab.npy +03325088-7832af11012adbe7b229726a165222c0.npy +02992529-313e9b124e421a4efa9922db9b6aab31.npy +04090263-7bb85cdfb1794a5712b38b1d99376c0b.npy +02828884-1f239e55de52bb63eefaf3e79e3e3454.npy +03991062-67bc9bec05f78850f9e08161aea27d2f.npy +02691156-e1be99a614c85c3e2016648502c798bf.npy +03001627-e9c99b6af129c22cf91663a74ccd2338.npy +02808440-f8d0cc0680f502e98eb3bc6c6d15f9bf.npy +04379243-b878329d1c965d195f9efc5cadcb44d7.npy +04530566-7ee49cd8ad72bfd2c620cf302459a7d3.npy +04256520-eaff5688bb49f845ba41eea807f5d3c.npy +04379243-c3135e3b21b42e132449009b96f8a6ed.npy +04256520-e5b0d8cabce54f524b3c42e318f3affc.npy +02942699-6d036fd1c70e5a5849493d905c02fa86.npy +02958343-3bd66fc2782bd2019766e05e7d6c9088.npy +02958343-e128a506f2e29a6796cceb824e3c56b0.npy +02958343-ef77d2e622786026d32bfc7a837f790.npy +03001627-8becb5888c900f3a610c2a68437007d6.npy +04256520-a3604a6631bdd53b593ebeeedbff73b.npy +03991062-3de068a04b96e3a3bc5996932c1238cd.npy +04379243-6d31e827bea8e970f198b94f669bca91.npy +02808440-7e8cc52fa74c26b4eb1f243bab39fb29.npy +04379243-6a613281bac861a49dbf2f762a644724.npy +03325088-1bc3c767ecc9323c3321831d2245cf06.npy +03001627-fc99c80f588bc88d5a6be9e325f087ce.npy +04379243-c76d9d9756b8bbf2a86b2405ab6de30d.npy +03001627-5a80c5a35dc1634db87028a4b477349f.npy +02808440-d51e086b0af8815d412deb0d2b0f3dcd.npy +04379243-4c7faca525777be32f7524c98ee0fc42.npy +03691459-23907d5a2bec2ba6ce029fab54b6cfbd.npy +04379243-9c4afb731e910d3723500a5b036df62e.npy +03636649-e7287ee25156053773ab7b7128d466a2.npy +04379243-28ce06aa6f25b39f2d19175e7d19b7cb.npy +04530566-1d6bcf04874000a9ea96bfd37cd8bdfb.npy +03001627-9225e57e34334ee019cb07ecb5b4102.npy +04256520-f20e7a860fca9179d57c8a5f8e280cfb.npy +03001627-e325f573905ff945b8183a4a81361b94.npy +02942699-e85debbd554525d198494085d68ad6a0.npy +03948459-d84c25bf4f0cb029537e3f6cd50ed63c.npy +04379243-accdf18e9eea0dc31191025061735ea3.npy +02958343-8c346443d2feeaf916abce8cb03e7794.npy +03636649-ddb951343304bf1f351d9ca36f76b95.npy +03001627-c8f5189b54fb3fcc6c518c577d808035.npy +04379243-7543553927036b0352b7768d51b257d9.npy +03001627-7d0e6a5c10d2f97c62e682c9809bff14.npy +04004475-a8c41f725d1dcb8ec8bb35fae3b41809.npy +03001627-4a9d3ce54c09a2da696b74614952b2d0.npy +04379243-d5402158d5fb9fa8c283ca2c9df7372d.npy +04379243-ef62dad7755794a47558b47f7ba0b0c.npy +03211117-f3004c5b38bbc0e445804144dab4dd66.npy +04530566-5a2bdc97e9d6683077f1d7a36adeef7b.npy +03325088-5068487242356027b362845c6edb57fc.npy +04379243-89975eeeb0a1313e4b3c42e318f3affc.npy +03001627-90d35ca55b35d56dd5883ca9b41ac387.npy +02992529-b1d1d6a5f46a30894884e1105772427c.npy +03001627-1c9d7e56ae8c90c87ac6ce513ae497d3.npy +03636649-e1c49baf0a79732a7eeca6709b6a824e.npy +03691459-11c1c970e9cae04183ef95920b2c145d.npy +04379243-978a4869d7fafca74b3c42e318f3affc.npy +03207941-687c09af50c2e5f5db2f7e7d8b44c8fa.npy +04379243-8af35280574ac141bf7ea2059cd7e422.npy +04379243-8f7d16c0303d8cf4593ebeeedbff73b.npy +02828884-5bb40ee2f4893358d4d8765e3910f617.npy +03636649-527212b174a5313fdd5616230e7f3c5c.npy +03642806-6b61ef17b4f45050b598e8984f11eb0c.npy +04379243-fe22668b577f0cbe88e99eda7bb1ee8e.npy +02958343-f2e433cab0ddc755ca3ba83abff10be.npy +03001627-d66fe5dc263064a2bc38fb3cb9934c71.npy +04379243-e3b585b15506fa7113f96345312df593.npy +02933112-36853ef4167300c86e5b9257c4084ca2.npy +02992529-4157af4a11fda8ebdd3d821abaa89276.npy +04379243-4e8d9f4bebd6a97670553da2430bcd98.npy +03642806-1ce688d90a2010a69718283200011d2a.npy +04379243-12c8ea55000707be8ea4cedb988ff461.npy +03691459-f88ff1c46ccace6d5392678120123c42.npy +02954340-dd2d95b294a7a8b4fa5b6212657ae4a4.npy +02828884-c97683ce5dcea25ad1d789f3b2120d0.npy +02933112-31de44d559904485f51f77a6d7299806.npy +04379243-f5d6579b3a1f5a879d2be74cfb51ade1.npy +04379243-79d5aff74dbfa0c2307557ffe40d48d7.npy +04090263-9c8e406a5e198529282dd3b430ec2654.npy +02691156-86c8e75179f00b725b7d3d0361fc611b.npy +02871439-bf961e64ff78bc7e664b3b9b23ddfcbc.npy +03928116-e963ffa0699ae9e45e244aa0433fda37.npy +04379243-92dccb2a3e6445d5c790d7efcdfb5239.npy +02992529-bd7b84ae3b88bd5cd2dd279a9538db3c.npy +04379243-586edb4eba5c3c7557ab4b593540354.npy +04379243-c827c0d4ef212f2b30cb1fe6fdc7d605.npy +02958343-355e2c8d8d10e8227541c0a826e78e18.npy +02924116-bb292224e499052641cefd10ce5d6cc0.npy +02691156-10af5de930178a161596c26b5af806fe.npy +04090263-5bb02bd49d2ce6e590b94f57d8818348.npy +03593526-1dde51480f0c5474a38859fd71bee28c.npy +04256520-48acfed2c1f2d42cbd16d4490a10a752.npy +02924116-a2859adca84473da892e7ae844e0da5.npy +03001627-19319101e064eb1019fb4103277a6b93.npy +03691459-c1ad8720fcc7246a1fb294203c64a4b3.npy +02691156-a726f95306ce6e1071616ead796bdece.npy +02942699-b22e56fdf18e2eb8968b65a7871de463.npy +03001627-ba9ce924d452795f519259b5fe9bdf5d.npy +03211117-7b0327ed7286487623ab4519e0263310.npy +04379243-87af702a9a5370aceea6a5a0ebf81e97.npy +02691156-75fd28838e0fc8cf5b1edf5d4f643136.npy +02828884-85ab526dead09ffd398e68bb81784a80.npy +03001627-8757370fa33bc4e9419786e9c37fabbe.npy +04379243-50c9d436169103249cd431573238602d.npy +04379243-74c3d551e32a1cca664b3b9b23ddfcbc.npy +02691156-5aca1a2ca9143638b129901f80d24b7b.npy +02691156-d353b227b279804190b1d6deb98feec6.npy +02691156-af6cf1d2b6c00b1233de69c9cd670995.npy +04256520-1bb6224360321002b8bd10c3418cc648.npy +04530566-5f7c0e4368784e795dbfbfcedb83d61.npy +02691156-521eab9363fdc2a07209009cfb89d4bd.npy +02958343-e5aae7748aac94086228d448ae07dd2b.npy +04090263-206b4a7aff5ae78ecf61781659594ce4.npy +02924116-dabf9de698fe00716464444786faa32c.npy +04379243-dc3a90ee32e36cad43dbb6421d614c0d.npy +02933112-4cede87a6ca6bb876a485daf2a997e28.npy +02924116-193572f57626a97c65e6a15e0a997e5c.npy +03001627-ef45086ec881cb657288e3849fb636ff.npy +04379243-45c5ee611c73b90a509330ce00eb0b20.npy +03938244-c13de90da6f6744736902d83e4cc385.npy +04256520-19b9fb3d3763cd1e4c4a4dca0a101f1c.npy +02691156-7fedb48b457ee9f31629b98cc1b1b992.npy +04090263-70871551850d47c2823acdd521e722d.npy +03001627-e9effe5159dc66673b93a3cd851adcaa.npy +04256520-2715a63f41552d6c19fb4103277a6b93.npy +03001627-ff8921eb06e95b9cfebad4f49b26ec52.npy +02958343-346917af7c9659e3814085552234c955.npy +02876657-f47cbefc9aa5b6a918431871c8e05789.npy +03001627-4c3f655507cc6aecdbe9c90af547c85d.npy +02828884-1b0463c11f3cc1b3601104cd2d998272.npy +02691156-8e2846178e2976fab96212c8f6cd06e.npy +03467517-81bd0c7a35a147988cc3ae4061da3bb0.npy +04379243-9d9d1a2c33b32c2078aeec4d01b034df.npy +02747177-64393896dc4403c0e88c1d6fc3580355.npy +02958343-64f940ade3f61f976a106c3e1a10b659.npy +02691156-e9ddadf335adac52e025e00c738da634.npy +03001627-c9dd1e508be23628d0176f9a144100cd.npy +02801938-6d21c75bbe308322513c73fd461b230a.npy +04379243-5fc0812f8673249aa6a7b6e78d8d5bcb.npy +03467517-73368b2f443e51661082f2ea630bf69e.npy +04401088-ec39e26f8c0829b3413ef77469a0f9cf.npy +03710193-2008a48636a98f0d4f25f5ffbc4463cd.npy +02808440-519390da89f5cdc83321831d2245cf06.npy +03761084-d5739ed3034fd2551d5c138748955e00.npy +04256520-c4a70ab37043efeb14038d588fd1342f.npy +04379243-47164255adb1efd5fc54b7f07479f415.npy +04379243-12a2733fc5f6b31ef8574543281e850f.npy +04401088-54539e30a59cce413864ee650d9e9c5c.npy +03691459-5787e7156ddf7a2adfa0db1c1e10ab1a.npy +03761084-bf6914cf309077cc575f4e5007488531.npy +02958343-c8ab7f11ecdbf873921cb81cb1632a5e.npy +03593526-7b97f7b6ba604173fec8ec00010848b3.npy +04530566-927c8ab9d2603aec2d4fe9f5177af0.npy +03691459-4c43241d7b30eee379e6d136097a1329.npy +04090263-2ec617c22f8a1c7d96f12bf103d650c8.npy +02933112-6723be3b8435e27bb6146c7a77e1b943.npy +03001627-5e94fe6e318670d310da6117f2797a4c.npy +04256520-716eba8ec4825ecb19fb4103277a6b93.npy +02828884-9ddf92e8ab113b77a98ec10fab84d714.npy +04468005-5ceb4a6a1e9c2378fef210d199fabae3.npy +03001627-39ba09c13d784741dcfbbf65ff959eb1.npy +03636649-cf280bbec8017c26655715f3c8480da5.npy +02808440-5d403d56f762fab7b362845c6edb57fc.npy +02691156-7ce6c64ab3a45504dcc75fd1795fa3a5.npy +02992529-3a3fb2919b1bd92658c2dcb60645f75c.npy +03624134-de69d6441bbf8d39230a4d129580843a.npy +02958343-ba817f535c2668081f757787330d376f.npy +02871439-bbddf00c2dda43a2f21cf17406f1f25.npy +03001627-b58b8a4646d14b7c202339ec5396045d.npy +03467517-a591dc6d2760a4654177e158c403ccd5.npy +04379243-5f32ce6996fadc96b3f49378110b01ba.npy +03001627-4bc064672eb85023d84a8130bee3aae8.npy +03636649-19171a11ad8bd9d5411a00390d1cd315.npy +03624134-8592840d350b7cd4b9282c90175ec706.npy +03636649-13c127aad3fc8e6af51fa0238791f5dc.npy +03001627-2463439444134401815b2b467e8e2eac.npy +04379243-8381dcc6adaa7752b7d9d23574a480ae.npy +02954340-3957332e2d23ff61ce2704286124606b.npy +03001627-e2c16ac7606317b3e85a21e38833ddcd.npy +03046257-8c274f1ac64c21afd820bb9763a8af96.npy +02958343-3ef0d561be7aeb3080275d4a88484513.npy +04090263-383bd13aeb390df0f8edafa0d47e47db.npy +04379243-cf24f0128755080569080f7eaa8f3e1d.npy +04379243-ca56e6241a3c762a391c070c9832629.npy +02828884-76958ab9aa25d309c9eed7651b77d0f.npy +02924116-d2be14011f8c99231e06124bec25a766.npy +03513137-59c1f0cc533e57a7d44412b02a9868.npy +02942699-147183af1ba4e97b8a94168388287ad5.npy +04530566-a492984be2c03294213a43a25cd73264.npy +04379243-f444ea9df9132a3616a2b5862518c93.npy +02828884-b272113ac712ca012055e892b9798352.npy +04256520-c22b660349b21edb246c4171f2c393b.npy +02924116-d6779395045f32b5822461519ed909c.npy +03001627-9d961de6d462a7619fb4103277a6b93.npy +02924116-5862a13f9639f1ba44f19502064e0a74.npy +04379243-fa0ee25a0c8109639f5f9b9f432d1ba0.npy +04468005-42e786d44eae54dd52470de2774d6099.npy +04401088-b575152bd96a4dc4adf82b2748b1cb62.npy +02691156-e06d3e6c1fb4b208cb7c15fd62c3982e.npy +04256520-9dc28627bd03a2201e606a18cee01990.npy +03948459-cc84594ad18e16bf154ac598883c344a.npy +02691156-9d65814e1b252fb01636caafca838500.npy +04379243-94f83fc24106e39f782f27684f3b650c.npy +02691156-bf57639c6735626282b3aeca5b3e7150.npy +02691156-b5130ad12f6db8d0c83b9fdce4d2e0e7.npy +03001627-f4427ee23d4d51fabbf98dcec5f11066.npy +03636649-2a52bd01472ec7e1589ec67c01f5c1a7.npy +02828884-8ec231441abe44a05e276f6574cfbdbd.npy +03691459-67b63929a6fc3804dc7d80effd6f43c0.npy +02992529-e13a5d5b3f7581cbecf207e73a787c06.npy +04530566-e3e2bf1879ec9298c711893477336d39.npy +04379243-5d819ba4e21208ac2b5fb024f65f6da.npy +04379243-fe130356df1977499c2a886f3b75f1ff.npy +04379243-f5ad10e6a938aa80e85c7a030ebdf69a.npy +04379243-c71fa66202239b58d6de1645a30c4052.npy +02880940-4967063fc3673caa47fe6b02985fbd0.npy +02828884-41e1774c1ad94df4ad5067eac75a07f7.npy +04256520-337f25da3cdae83bc7660a81296c2300.npy +03691459-81a096b49d138bca1125e131b6efeea1.npy +02871439-a79a38419ae817fb3d2900ab7b1f5d81.npy +04256520-a15be5686c875d703201317d7803c43e.npy +04379243-26ab5349a902d570d42b9650f19dd425.npy +04379243-e49636394d4b0189523e5ffab409f73.npy +02958343-8c1b20c4c37dc679301fa882a9655049.npy +03325088-a695ea6dcd5e85b03321831d2245cf06.npy +04225987-99aef9f6486d3d90b267718342f3f316.npy +04379243-d20dbb223dc5e26e6e4d44229ea605db.npy +03211117-f84f6c14852ddad1d06e6be4f8954ac.npy +04256520-6a5f98654b75a18c593ebeeedbff73b.npy +02691156-6420a3ff5e526d59e16519c843f95ce0.npy +02843684-76ea6ce7dd6c1298805346b85ff6b7a.npy +04090263-cbe8debb3fa41f716e96d446ae30c673.npy +02933112-3b307c9b473270a1c59350d819542ec7.npy +02691156-5f9707e5f6b820275823df672991ed66.npy +04256520-8ead2b6ac2726710707cdefe012d0353.npy +04256520-fd181390f71ec72478ae896933c670d1.npy +04401088-722acb5e8ccd39391e5d846d206adf3d.npy +03691459-dfc0bd9721814628a4eccbbe9e05e638.npy +04379243-3b0625a3d623a7decfbec6fc6446a041.npy +04401088-4b96f974453ef59ea2c7c5886f4bbc93.npy +02933112-f6d2550b82c208b012de5317fe5b354f.npy +03325088-1a5586fc147de3214b35a7d7cea7130.npy +03001627-3dc252fd90d82b18c9be65dfbd21428b.npy +03691459-c3233311a94b7b968a0181490cb73cbc.npy +03001627-bdd57499bf64fab6bf80985a99195eb8.npy +04379243-6a436b27484166629f9a7ffc9bd1e3fe.npy +03928116-23cb522f8c3dc4b15375aed1ce49c448.npy +04379243-12e2dcbdc199f0ef8fbd401ebc04b5b4.npy +02924116-741f329be4ac607c63c2b7a67ee8957c.npy +03001627-6beb16fbb2337f65936c7265c890fef.npy +03790512-5de5e9abd5f49ad7468bac13e007a6e9.npy +02958343-7203130a35ab20a4b1bb46d2556ba67d.npy +04379243-f2743fb608c502abfffc97a61124b1a9.npy +02958343-4cce557de0c31a0e70a43c2d978e502e.npy +04379243-b31a613e7f289c8bf5f6997e99549136.npy +04090263-2229f60c2819cccda50ef3fc203c6ba0.npy +02958343-471673f3f062abd473f10e6caaeca56.npy +04379243-5d93e285b2006520ab610b0c94236463.npy +04256520-40a6ac0c94ae686e8dd711af5650bdcf.npy +02946921-e532d6bd597d4e91e3e4737f6033f0f8.npy +04379243-4cfe758f926fbdf2f51fa0238791f5dc.npy +03001627-2f20894566c681e5922309b37ed10e7a.npy +04379243-60c931dcc6d0982944bda2555d37e46.npy +04379243-85d5a731ea4865c1e258f9dd9d42f6c9.npy +03211117-bdf3dbf43ef2637f578d107c71db28ac.npy +04379243-8b612b06a3d668eb67dc575d3328bcb2.npy +04530566-1e3400a7a099823371feee345701e9eb.npy +02871439-e48a1bc3ed228765664b3b9b23ddfcbc.npy +02691156-c581942f40cbb60819ba010ddb4974fe.npy +04530566-65e21949247e36a541db137505613210.npy +02691156-e94ad5f8e53a255a8fc2d09ac4aa4e78.npy +02958343-1ad321f067ffbe7e51a95aaa6caba1d3.npy +04256520-3946ab8df54210ef1789afaa92d90146.npy +02958343-7b2dcc7c4c879e9116f7ad0d1093bd39.npy +03211117-3fcd048b1daedbdeac22ae9309c09ec.npy +02933112-9f88eb11fd20541b4f759a9b042055cc.npy +03991062-aee91e867dd2be3ea2c59a4d90e63212.npy +04379243-3ebb9bfa2afb2f8c9db5a91069a42c6a.npy +03001627-19c8189116dd7cd3e95c611687989498.npy +03691459-d46c71be46696b1d41ba258440d3e234.npy +03991062-1163604f205da98d7df9613e629232fc.npy +02958343-5721c147ce05684d613dc416ee51531e.npy +04379243-c05033de978da9dd5de04aad18bd94c3.npy +04256520-a8db9db73bb5a4dbf51f77a6d7299806.npy +03467517-cb5b2e3f499e4fdecc571cd3cf8f17a1.npy +04530566-2b58ca08b8f93769c5408f4f799fe72.npy +02828884-59cb1f3c7476a5712056b4bd5d870b47.npy +02958343-de1564379b1315a3efadfa67efa023c.npy +02992529-d406eebe0342fa8373acc74b15c67e07.npy +04379243-eece94f60e91c3d819fb4103277a6b93.npy +02808440-89eec42ca751ce883321831d2245cf06.npy +02691156-6a9b8fd1f4ddd87f152be1f5910e33df.npy +04379243-84a3c87bba5a472af51f77a6d7299806.npy +04401088-52494d36a6d136f6b34ae4286be3d813.npy +04256520-7ab84ec80e11d03fe8daab4fe9011efe.npy +03790512-e9c34796e3c9e46939e8ef80333dae6.npy +03691459-f6d6ab4f49238452b45df535caecae62.npy +03001627-e6b77b99ea085896c862eec8232fff1e.npy +04530566-bca8b526924310bae8d6be23f236225a.npy +03624134-db7be6ac02bf5e48e2bb19fbad3e4596.npy +02946921-10c9a321485711a88051229d056d81db.npy +02808440-7d4c5f150ed81e3054d7082b34825ef0.npy +02933112-c00edc704ff4b133da27ece6ae88fff.npy +02958343-5efb2b4cda03da10e047028ded406033.npy +03691459-11f5f6311449da7ebb01628f533af3ce.npy +04530566-358bac5415f0773941d6cd38228b9631.npy +03001627-92d87019793c97c636c8b9bf2576aca2.npy +02808440-b08eb2a2c20e681af51a9050d9136192.npy +04379243-227308a94bc7b231e5490ac94fb8e485.npy +03991062-ad58ba1e4c6dec3b5d8d4d8a3cf8b294.npy +04090263-62fea07f4f7a6bfc673a614c45f3afe4.npy +03001627-24b5d56b254cb1958b424343280aeccb.npy +03691459-d17192339d28af3234140f5d5f70bb2c.npy +02933112-74126116f42f09e2e6e130a30b5ed875.npy +02992529-c6ad139da5e0799c712cb59213324f9d.npy +03001627-fd9c60e969f83e6086debb0a33c851f8.npy +04379243-1a442af63ca5159d86478bfcc70b1bc5.npy +04530566-83d2a7a4cd616008e19ccaf2c9aa161d.npy +02691156-e005d8b297850d483a99ba0078ef7bd1.npy +03001627-ea8ace071a8ffc2a50a1e454933067.npy +03624134-4a0ef45e02210e47914c738e92faad58.npy +03928116-b7b54152e58fdee6bb4d99f9abe880cc.npy +02992529-237b8445c70b1749ce2eca356a0e3474.npy +04379243-375652536313a1c2278f90ef85162deb.npy +02958343-9aec898631a69b6b5da1f915cad9a74.npy +04379243-aeba3a81cac0687abf3f8e8aa5b07c2a.npy +02958343-fe61764c0552c837d76439fb95cdd2ed.npy +02876657-e56e77c6eb21d9bdf577ff4de1ac394c.npy +03001627-a631fb1b054697dcfd8aaf214a1df4be.npy +03211117-79f26b0be635b891631d57ce83092826.npy +03001627-eaa4ea82bc814005e6fe3612af521500.npy +02691156-dea43c46fdbe84511adbb4c4e06ad649.npy +02691156-ce1d767436d9b289e8ac6b4e1f12f978.npy +04468005-734a3e7a655fe3afeb34db531a289b8e.npy +02828884-71ab9fd8db7ee09a59cbde03ded257fd.npy +03691459-4a1ffed169f04f5fd084cd4069686980.npy +04379243-9e068a0ec94cb7dbf51f77a6d7299806.npy +02933112-11f59587596e3bf1a9958063063ce065.npy +04379243-9f3d4541c2754cc2a516ad65be981ae.npy +02958343-b3047118a9b0d7b7e858db1dc3499392.npy +03001627-78386cc102c6dbb03430d3d86b335afc.npy +03636649-b401155fbc54313330f6e0ede20c4525.npy +03001627-711d131beebd279cf0102d4d10f82457.npy +03001627-86b6e539e72be6d46fa0ab61d9f9d96d.npy +02933112-90c2b07e831f5e7fc75178c2e93f5b68.npy +04379243-a4eb161a000b159e2ddaf02885ddf74b.npy +04530566-ba1b46458170afa57ae1c9ca63d5fd92.npy +03624134-7b492f2baa1dc710cc34b900bb2492e.npy +03001627-37cbc18323826bfb19fb4103277a6b93.npy +02691156-b19927db257219bb26360e1e29a956c7.npy +03790512-543ccc442390ac8ad3e27012e0feb9f.npy +03001627-bf3c02f71de0260a8dfc31d0ab372d9c.npy +02924116-6f92698b7e495df56b61c956066f9ade.npy +03636649-2df234af39ae991afbd43c84cd4013f4.npy +03991062-cf1dabebeaf02912a2c59a4d90e63212.npy +03467517-c40f68a092baacd133d89feae811d3a1.npy +02828884-84d3224312b9630465826cf0dd1f6a6c.npy +02992529-6bd7f7a17a7bbd2d68acf22a03600648.npy +03001627-b197d9b353a923cfdbbc9440457e303e.npy +03991062-dc39b65c9ed54544debefefb2e8c0245.npy +02691156-3e8fc3155bbc4225c1ccec171a275967.npy +04379243-cd4357aae286fb57c5f48f9175316bec.npy +04379243-9e58589d9f3dc4f24b3c42e318f3affc.npy +02958343-efd9059d23b9c01f46f8ee02bd8f9824.npy +03467517-464c2b11e7c9ae87241535bd4c40391e.npy +03691459-508e66670fb3830c2cd6a352b52d97b9.npy +02958343-d80658a2f50c753cf1335b4fef92b83f.npy +04090263-7da59289cc7eddf7c92cdb7e63a33179.npy +02958343-8402d2237afac94a1cf6f8e565096a1e.npy +03001627-1028b32dc1873c2afe26a3ac360dbd4.npy +03790512-6e1397773a4d15db429f1c522640e6f0.npy +04554684-8103431c1feeedcd42163310d48ef535.npy +04379243-7421abad75caa60a299938728adfdc7a.npy +02773838-10a885f5971d9d4ce858db1dc3499392.npy +04401088-e55ef720305bfcac284432ce2f42f498.npy +04401088-79912d77eb2866af4e964633a1b1c39c.npy +02818832-73d8ed364821a2701a6208c41cfe5c77.npy +04530566-4cff5eb82cac0f56b7b1411b0ad3bd0d.npy +04401088-b73398902d1c267b5eed8c8b1cd54386.npy +02808440-5015f03078bd60f8e219859c1bc1bea1.npy +03636649-8c8ab9d274bf85bd7054f829b1ba8eb5.npy +03001627-956063d67b939431f56aa11cd5e0c3e.npy +03001627-6bcabd23a81dd790e386ecf78eadd61c.npy +04379243-63e37e8a29ee34bab277610811e28cd.npy +03001627-3a1b54325b3565e72ca4b544d68c52.npy +04401088-41f5caf37dafdecc5dcb6feb4bf8ce13.npy +03642806-d91a3191d427bf0467710679e532af1.npy +03325088-67525c6f3d27609f4091462be8a295b5.npy +02818832-dc5a7937cf3d5ce2d6547ce8d3c3ea11.npy +04379243-6f835f3532151c25c2a21be00e77ae82.npy +03001627-408631c881e3b33cefb90719a33cc920.npy +02808440-882ea3f99bb9e7703321831d2245cf06.npy +04379243-f8e3ed6b09b50d1d7f890f73fae19325.npy +04379243-b606da9c4be6e6106cbce046ef0f1d8f.npy +02933112-1700d057c9e0c88cc59350d819542ec7.npy +04379243-299ff1bf2618a4b584b039efed4b32d7.npy +03337140-7969fbbc3d46b46e4c3aee8e9d3a6ffa.npy +03636649-374ee0d01fb25ecc9bad7d7f6ef7bb21.npy +04256520-bf01483d8b58f0819767624530e7fce3.npy +03624134-8bd5c4f395695ebdf40d02cc9d84a93a.npy +04379243-9a6ab25d91c92a5a35acfdef2ece21c0.npy +03001627-3f36e261cc87648ac3bd24f986301745.npy +04530566-ab52de94b627af794c0b957b7129452a.npy +04225987-36aaae334d636ec28043db94fbc8c982.npy +04379243-575b467b6ebb2f234eaa3180e8182d9e.npy +02933112-cc9194f94951cd934da5feafe6f1c8fc.npy +03991062-f15c66948002dec0d7f470ee20dce9e0.npy +03001627-6601d179e754149e2f710dc8afceb40e.npy +03001627-a07b5b7014264e0330e06a011e63236a.npy +02992529-c7fef6ae7f7f91814a0be3d856af9ad.npy +03691459-6a864ca4b19aca77645b6a2a45925e6.npy +04379243-5555cf0638339605f0fb3e3d2a0d34c9.npy +03001627-1ef99f4e735ceabad97996b11dc03f35.npy +02747177-c18e807ff9858a51fb016d9401ff3e29.npy +04530566-294283d06ca9a9abfe755e3418b63110.npy +03001627-3c02356c918f7365b82b2bbc752d3ebb.npy +03790512-48bd19f7d6a20c5c52ee90e577613070.npy +04379243-7f531dece49aceeb4d1bf4af7e44abf.npy +03211117-350da53c8b5dddcde2313f5ca29127ab.npy +03001627-732ee6a49bd6db06aed393947b9cb125.npy +04530566-3e03e3d547d6fd9e4ca65624f18b38a2.npy +03691459-b6d83532d5479753bdcc14b36549ecc3.npy +04468005-2733ac1f2b34bf4b0b2e6e63122009.npy +03636649-6c96c1bcd2579c259b12350e98805eb9.npy +04379243-1e4a2ed85bc9608d99138ce6d9b8fa3a.npy +03001627-4a636d555b4f9492e27790b0ec8671f7.npy +02958343-d4512a374073ae95199f3841b86452c3.npy +04256520-b2c62e5b20b34fad5844a4d0ab925627.npy +03211117-74a99b32b562fcea7fa29a3ea424473.npy +03636649-e94273de8e52f9f896a3517f50eeb9f4.npy +03211117-2f1975216fc24c5e572bfae97b5793b0.npy +03636649-72099a83e9a058ace715cd506e17332.npy +04256520-2abe8d5b5d29ff52f7628281ecb18112.npy +03325088-3beb681d384c32a076d20e73c57c9a03.npy +04530566-8e4fbd72746ed71c20d966555ebf57d2.npy +03001627-79fd9633635ab7f6490ad276cd2af3a4.npy +03001627-efe76021aa616a41f51fa0238791f5dc.npy +03467517-798c7b38b096e7cbeccd82bb51193a7f.npy +03325088-f48e5d5d88b9ece98a1a0260fe4e4cb9.npy +03001627-baa8760ca5fbbc4840b559ef47048b86.npy +02808440-b0d95b98cc9ced8bf82d285b0703fe12.npy +04530566-5a8c1f3f0ff3e5a87bb222726cf5a84c.npy +02958343-719487aa97fd9af513345bcbe0ee623d.npy +04379243-3b334febd0aa9ba7b20aa91e9e90c311.npy +03001627-fee248777c9c4807f8bc1f8036e08e44.npy +03710193-f8ebd72bdd49a43b8ad4a36593b38a9e.npy +03001627-8cca53295cb61e878d3e8783b997c75.npy +04379243-3ee0a3bc5e7af23d1bb088904f7cb154.npy +02958343-f55e967e8617484fe565b03326f48ebc.npy +03467517-38eb9bf1f02d192259b584008b480e22.npy +03001627-f14a2e78a93c559b253b862f13dd465.npy +03001627-4e0beb356493c9cbc862eec8232fff1e.npy +02958343-ebe05fb264a56628d7ef29ade0716b6c.npy +02992529-2eafc16c78c43b35d9f7ce5b19e46227.npy +03624134-1a1a5facf2b73e534e23e9314af9ae57.npy +03001627-64d5bd4a6af3da16327289c00b6dc9ca.npy +04379243-e8ba9621aef9395a3019620286259e2c.npy +03790512-b179e7e416edc37086b7427eea4d0f22.npy +02691156-7826147390af0f9d1fbc781ac25c5c7a.npy +03325088-a515d60008ac9cd5175c399a4380a866.npy +03513137-a452a0857cb46b5226eabe1cca3e850.npy +03636649-91c55497aeec1fc55e29ce2c9d37b952.npy +02958343-13d090612aec3d80ca92a4cdad802b45.npy +03624134-79505790e5d8365f4948b6ede15604a1.npy +02933112-663cf5c8c88a187b6fa3ef67a69ab460.npy +02691156-a1c3287d5e847f866b7bd17e458d0dcb.npy +02958343-5bb7b111a3835592531e940de4b7770d.npy +02924116-f490a8ccde2449b4e0361fcb3204da3b.npy +04379243-8a1f9d4a36baf4fdc563fcc2752ece39.npy +03211117-a4dd6c69ac130db6795284068bb430b2.npy +03991062-10de406de3078873a2c59a4d90e63212.npy +02691156-1f9b49f320eeb2f5d0226d12d397045.npy +04379243-4ffb8579bf17a5a7df253edc1fde0322.npy +02773838-d3bd250ca3cb8e29976855a35549333.npy +03691459-3a0747975c07896f1ad88f716ea80910.npy +04379243-1e202e618d6375052945e400e1430726.npy +03001627-1b5ae67e2ffb387341fbc1e2da054acb.npy +02933112-4b6c7f81adcc5f7e4b8710a3469971b1.npy +02958343-344eb3613a1100634591011e8f7af9ba.npy +02828884-3ecf8f8f3b24350bbd17a7d75b77705d.npy +03046257-d76b2c36bcbf8fd7ef76898f881b76a.npy +02691156-d281db2c631c0170991ade27bbcf967d.npy +03790512-d8ee11cff3188479e7299bc85dbe3a65.npy +04379243-fe82d64b0268ba75febad4f49b26ec52.npy +04379243-4292e4bc1f783b399c409b26b1e9e946.npy +04379243-7dee34ea0b8cefe8668ae11a7db5e82a.npy +04379243-4eb3c0cffaf389fac3bd24f986301745.npy +04256520-c6956d32c9748c746c7c6307622a722f.npy +03001627-200324d0bafb1c2e19fb4103277a6b93.npy +04379243-f77643cf323921d7c6542d86974f9497.npy +04379243-dd8693cd2fbb5a0c7d0efae8dc996b9e.npy +04379243-212476fd8bf012b1e3ecbdfbb6709c74.npy +04090263-908d00034bfb9a8d5d30f6c8adea5674.npy +04256520-a627a11941892ada3707a503164f0d91.npy +03691459-ec9938becbd706dc8dcc38f589890f0.npy +04401088-5fea05a3cdcc05756dba92a4e2177102.npy +02933112-147e9d3591cb190829a50a2b3c5e5b6.npy +03325088-4befbb7f5548a835fe1bdd3c0c9e9c3c.npy +03325088-f988ec7ece669319b362845c6edb57fc.npy +03636649-5f0c4dd6cfa0def2e59f529cd1b6faa8.npy +04379243-9d4b8c8d26c3be06d269116c7276660.npy +03636649-f40c7b19234b07c2c8687ff9b0b4e4ac.npy +04256520-7b5e46d1cbe7c2de7d92b0739e572d9.npy +02958343-ade5514c578e4bc27dc9e02a5c320eb.npy +04379243-39f30c279e085ae41683a1f2bb7ab319.npy +02808440-304346a133b9153379d57ee14f8ee702.npy +04256520-7eeb7a4c2f3f1a0505babec7f39a63c.npy +02924116-646785d05ef7921d75dadc997718614d.npy +03001627-b971b6c16dded4fd44db5bc086b2ea47.npy +03001627-b021f7d705c4113ac7bed72580dc30f.npy +03211117-c9a56fbe2d5d735f9daa2bf0c68f794f.npy +02958343-1a1de15e572e039df085b75b20c2db33.npy +04256520-4aba95b774b2cc2233ea3991d83e660a.npy +02958343-363ddd7ab72bd485be40bb45ea25a041.npy +03624134-3837fb44d414845630dd2b88f7efae34.npy +04256520-f653f39d443ac6af15c0ed29be4328d5.npy +02691156-971ef250f2d0cb389a6e43b878d5b335.npy +02691156-d8452d4fe51f2bab3554ccf8c30febe7.npy +02924116-f1d9503cdec875fa876becae6fda7069.npy +02818832-8dc13611a04e2be9deeb06780e8a81ea.npy +02691156-c6c525a71215dd5a459f73e379ceb540.npy +04379243-bf77a1c8a520eb6deb0fe7d6b5545a1a.npy +04379243-bf886e6f28740776f1783a44a88d6274.npy +03001627-98a1d709dc51ba87870894bef54d428.npy +04379243-19c8ff25264b77666716685cf333d2c1.npy +03001627-41b90d1977ef7672b9b8f177284f45fc.npy +03211117-dd6c708c87d7160fac6198958b06e897.npy +04256520-1579af0fd3cb306154b2f0044ac86c5f.npy +03001627-18005751014e6ee9747c474f2e537e26.npy +03001627-d5e1c6d3e6ce16ca8f5bf896c08c419f.npy +02691156-2e468cc6afe2da70bc0909d98a1ff2b4.npy +03636649-5830c288acd8dbc5f71f6713526f9507.npy +02691156-f8647af0b1ad01445de04aad18bd94c3.npy +03001627-5ab7fb2f11d26c1c291743ae4bc47673.npy +04379243-74ca743e2ba959f56623a58a6d7bc060.npy +04256520-33db94c3b6edf1efc3bd24f986301745.npy +02992529-68ffa3cd161114cf55f5bce8dd67399d.npy +04256520-fc3350236b25f198f2b841e334abcf20.npy +02958343-fb97ee1707f495bbdcff2899f073ea9d.npy +02933112-2950d1baed4dbd78c59350d819542ec7.npy +03001627-79397634d362eaded96cac5d008c9fc3.npy +04379243-6661ae18418d7cb28965f16c5573871b.npy +03211117-87d4b97120598dc54e6185a07ec22996.npy +03001627-4a2766bf63caa24a4abd5da3f5ea2512.npy +02958343-27d42437168ccd7ddd75f724c0ccbe00.npy +03001627-45828c176099f3c3d2f92ecc75b4cb66.npy +03211117-8a4cbeb489904fe3083b551ec2a5aa3.npy +02801938-547b9fbe28ffae9d5f9a06467b1259de.npy +04468005-51ea5a8f915a9dab8050d454347bac2a.npy +04554684-9b50ed5a7b980dea4572fbc715b752ca.npy +04379243-8256e81768151f74d931803ebb8c8c44.npy +04401088-d7ed512f7a7daf63772afc88105fa679.npy +03001627-8c1c53ff86f59a97d2f33aaf794b5932.npy +02958343-dadcc1200b43a12be8b7f81712644c1e.npy +03790512-b91b7ff8ff1b59c6a88e8cb97b773125.npy +03636649-17fb3b85fb6bf1d74888a07f79e95b66.npy +03001627-ecb53ab8eeeb43d31246538126da07a8.npy +03691459-5e9e7b6cd01eb0edbdeac9f0a8ab72fc.npy +04090263-206d81abdbdbbb5c63d83c622f45f33.npy +04379243-3b7fcc7c030ecd496062e86c1d0c60f8.npy +02828884-89e2eaeb437cd42f85e40cb3507a0145.npy +03691459-e5a6dfbc6e89ba42bbdf3c5f28fe5d98.npy +04379243-812665596d6c13b1adeb1694faeea26.npy +02924116-bf187619d212dd102d42c1e28ea24b6e.npy +02691156-444a58c4c6bfcd6c7a571401e6605fc2.npy +03624134-427139e42c842b4fe931b9a85fdc07c.npy +03207941-36b0dc42fe805430991a1c802df98c78.npy +04530566-a74f3cc7adbdaad2a072c5ad67cebc91.npy +02828884-c03e7f08edefc17a5b28ac1273e4dac5.npy +03211117-717d3ef4c7000c5917a27c3fa1d3566d.npy +02933112-b4e35d962847fb8e86d53ab0fe94e911.npy +04379243-bf9674274a0581bb11632b225817c709.npy +04379243-2633f011b236a8979070b65ce7b4b532.npy +04379243-fb3816ce98c668157e22078abbbc121d.npy +02933112-9a24860d7ea8d54f109097154427f779.npy +04090263-2a70089aa6561ce216cf8b1cd2155e02.npy +03636649-7324c25be8ff5cd74725f67267e31c89.npy +03636649-44bcb1ec762af23b8880edc6251fa529.npy +04379243-40a7ed7ce8ba70fa4ddda47ee90d6a21.npy +03001627-2fa4a8a5848f9223a10fbdfc2fa57509.npy +02958343-dd5eceae670f164ca134736201a79843.npy +04256520-68ae06512cfbf4f95fc186cfb5f359d1.npy +04530566-5a6439bde2204588fc3f5f3afbd6c5df.npy +04530566-aa05992294efaa26a47eca0fafc43370.npy +03001627-f4e5698718f3d4494311a07b696e63e3.npy +04379243-e41da371550711697062f2d72cde5c95.npy +03636649-2967944ae64112c11952fef39dab6347.npy +03001627-39de90c34ab1dd3f327289c00b6dc9ca.npy +03001627-75ceda9606ede8d2ea98d69e91ba870.npy +03467517-4bd2492d56d6b8c537b5646da91e9ed0.npy +03636649-a3c6ef6078045515ea9f23f235ccc6.npy +03001627-a8b5f5b6bf0cb2d6876b399a99a15c0f.npy +03467517-6d60470e9e402861f18228781f85571d.npy +04379243-e758e1b760f185e2593ebeeedbff73b.npy +04530566-7fb484e04409f7323f3cc56bc9bfcde3.npy +03325088-b7c6df3b5836ea6a76d20e73c57c9a03.npy +03691459-6751b5616193e6908219b633b364ca6a.npy +03001627-374bec02e71fe06528b4c5ec471dc963.npy +04379243-e87136a7996cc5c82d6b4fb79c7b302b.npy +04379243-56a57ef7c3385c9f2f38c0d2792fb5e.npy +03948459-e318098b6a42cba14968c6db52a4c95d.npy +02933112-544fbd4d4c1d445498a4820926b2a786.npy +04256520-cf571875efbd60fd3d2617f9171b5ccb.npy +02958343-e4cd5b3cbe9082f536699018d15f07da.npy +02992529-fd1dd7c841cd9cf51f05b3da5aad55f7.npy +03636649-92c8a795e0dbe340145fa6babc33219e.npy +04090263-8f5da7a2501f1018ae1a1b4c30d8ff9b.npy +04530566-f8ec76f3861f7c68b76982957f05710f.npy +03001627-2dd729a07206d1f5746cec00e236149d.npy +04530566-2722150ea003017d7fa575e221973fef.npy +04090263-8d1cddda904b6f363a842af7a220e7d.npy +04379243-2edf007c0f4542554fa8d6439169bda4.npy +02933112-8b63c8e0d3959c961e1dc6d433ab6c3.npy +04379243-b34afa23c47c80db7422d2e1b1d40882.npy +02801938-29880fedb8770d6ce51e3cd2b72fbf02.npy +04090263-f7cf0e4395996803ed901abec3fdcc06.npy +04256520-160887408a65f88f67903707764646db.npy +03636649-86d7a728dc35d634f800b597bc1c1eb5.npy +02691156-5763ed16cc79ce63dc0a4f5bab755bb6.npy +04379243-34c0ef1a944d5443e2f1733877da1c63.npy +04554684-3f60bb32239ffa303bf7bae2651d2cf.npy +02747177-2ee841537921cf87ad5067eac75a07f7.npy +03001627-51ee5a84b4afc40be45ef4135c266a12.npy +04256520-dd9a138fd557c44f4a6b6d001599a1e5.npy +04379243-4960515bed0e76c403c7d0cd70738a3.npy +03691459-5a115cf7e21d34d249d7025d277c28a1.npy +03046257-a939cbfae7bb05effeb1e532f4bae7f6.npy +03636649-d47f0a026f66e2f24b3c42e318f3affc.npy +03001627-d1852e622204dbb0f4b6538438a0b930.npy +02958343-7478c015f1814c0728ccbb4eb8965b05.npy +03991062-f04a8c4946e7941ad0d7efee165f0a98.npy +02691156-fb402a36e91ab1b44e7761521d3c6953.npy +02958343-8b74a58c28cac774753d1d86ac1bdfce.npy +02958343-721dfe60b48849ec7ac8cd969c3298ce.npy +02691156-a73be4c48272735df64801ad2940cdd5.npy +04379243-10cd74fb0af8021fbf7cf6012a0af9fc.npy +02691156-751b1e75fcd7f1deffb814dfce3ab22e.npy +04379243-e62c51fc96e9394a647d4fd8d921152a.npy +04379243-e17121f04e884edde480eba094ece03b.npy +04090263-c5874d1a3b616a641703868bb196594b.npy +03636649-da64c56e36024add5b903ba10d2ec446.npy +02691156-4ba7b11cd496e3be69176f0174b7620c.npy +02880940-6118da3aa071921b664b3b9b23ddfcbc.npy +04530566-e93a47089f5c03fb7220891f188bc420.npy +02828884-60287e7894707cf9fd074351be80913b.npy +03636649-e333f7f89b74575e9a5046bc3786ad19.npy +03761084-67e4d0cf70b87600ddf024f7de40d58f.npy +02828884-7dd37767a253f98d56f6fc4b4ce1db04.npy +02958343-5ec7fa8170eee943713e820becfd99b.npy +02691156-b8ce3803485b620b2c674305897e1782.npy +03337140-5dd48360dcb573d291c352d02061b3f7.npy +02958343-d8f813278a49463db203f960004c7382.npy +04530566-64ccd647293ba2a75e73d168e741c7c8.npy +03001627-4b01dfb6fa24eb4c4b3c42e318f3affc.npy +03938244-c898517ee2fab5ace3f7a74e12a274ef.npy +02691156-23cb6abc0705de4ba5a118bd15e6e34f.npy +03797390-71ca4fc9c8c29fa8d5abaf84513415a2.npy +02747177-91d6f4726d1a169d924bf081da6f024c.npy +03001627-411291d56a967d9fe8b2b8dc0c816caf.npy +03001627-56e194146b9e584b3321831d2245cf06.npy +03691459-8f920f26ead4d592cf66d96a8426fc6.npy +03001627-4ad06cdc2f8929f44733824eae5cd9ae.npy +02871439-b7474ed0e4ac46cc3599bb3238bd1beb.npy +04256520-8d15fdb921ba675af592707fed2e148d.npy +03001627-a50cf70c56091637e6fe3612af521500.npy +02691156-a0bca89b37e69d349f66d5781c13189.npy +02691156-519f1ddcbf942a76a71b0c9b506dc672.npy +04256520-785ba264dfcf722bf284a86ef67b13e6.npy +02828884-1bdfb8796887adf92056b4bd5d870b47.npy +03691459-8080831f18e0cbe1b22b2ae1c9a24291.npy +03467517-c951a1ad8a90e3c344cbf4f97fe3744b.npy +03001627-fc7e2126419f5a4cb84959963148f2a2.npy +04530566-9c4ae8501ef74e82cffae3eeba6126e6.npy +02691156-76b492b77a03882d431e5b4ad135fb8.npy +04379243-1bba8d173012111f5fceaa39a8353bde.npy +02880940-9dcfab1fab6232003bec56bff764ba78.npy +02992529-7ab7f36fa3523a1a33c7b6ed91d531bc.npy +04256520-9e4cbc2bb68878b57984fb9ec7e40829.npy +03593526-5d636123af31f735e76bc197b3a3ffc0.npy +02933112-aac3c6db20d3248579cea75b38cb7ce.npy +04379243-d5a7ae84e93368c28b015826dff11d35.npy +02958343-b2e36774150b580e21f6e2b0f75cf9c4.npy +03001627-91b8fe4616208bd4cf752e9bed38184f.npy +04468005-4a5c80895fecf3b3c51d8e07a45cfa0e.npy +03636649-a2f760540b18eac2dbde8847d3101230.npy +03636649-9f07035e2ff0e5946ef2faffa907bc32.npy +02691156-cb744ec78dd320efd2c2bfa672ed621f.npy +02933112-9029a5f19440d04e6b19a27bc4c01b1d.npy +02691156-7db10020f24a3232abf03860b8d62488.npy +03001627-30e8b5402898334ef4b6538438a0b930.npy +02691156-676e568ab8e286ad67c54439d6177032.npy +02808440-575c40e0d9d3f2d75ac2d26bd5b040e2.npy +02828884-92e7ed09c8d265e5cb2a965e75be701c.npy +03001627-632a722f9edbaf607b11ae648ea92233.npy +03624134-2071c9e5fe60e5886ba5f56f5d8b6131.npy +02691156-62ebe2dd7bceccd097f28f82dd9c77a2.npy +04379243-9826f7752703d7bd58cf2448c6d2934c.npy +03790512-d94a099c6a1ca8def4cddc55888e6926.npy +04099429-b333cc1b0f35943228eba1f0b7744e9.npy +02691156-1ea8a685cdc71effb8494b55ada518dc.npy +03046257-160f24d660e3183235836c728d324152.npy +03211117-d1ff5895420a205dba1a3bdff265e174.npy +03991062-3d377597d4ae8f38a3b06ba374e12b77.npy +04256520-2b1f1929a6a5a6517b431cae0dd70ed.npy +03001627-a16b8de490656d03713decb1a0563b12.npy +02691156-a1ca5014ee1048081e06124bec25a766.npy +04256520-e1e2ab3bc1d604752b4aa1e18549d620.npy +03636649-b5b728ebd7c0833530f6e0ede20c4525.npy +04256520-f0e243acfc5605bdcadbe66b40c67b2a.npy +04256520-cbd547bfb6b7d8e54b50faf1a96496ef.npy +04379243-4b548d4f399066e1c2f0a1a44c64aad4.npy +03001627-91be45a6b74f2fa283b00891f680579.npy +03991062-f012c87f43047ac015d2b72e86737c92.npy +04379243-696482ce58cced1044b0115560181a7a.npy +04379243-dd468c350fc655eafebad4f49b26ec52.npy +04379243-a8d59c4b6577b9eb37a0eda928b574d2.npy +04379243-a25141a07c77c25467de2aaf749e5256.npy +04379243-6c27a2a85e8d512ce6c5cd45aa112726.npy +04530566-3283111173c12947622984b5941cfb8.npy +02946921-eac30c41aad2ff27c0ca8d7a07be3be.npy +02691156-d2f8a99bbdc387c8c5552bebbfa48bd7.npy +04256520-b251364a878eb5fca192483aa282f8e5.npy +03001627-5faa205b9355a66579ae41e1ea899b06.npy +02691156-47821cd2309d5a3990b1d6deb98feec6.npy +04379243-14d8555f9a21f341edf3b24dfcb75e6c.npy +04379243-6a4bbd1a2d533741849f98fb0b88a16a.npy +02691156-7279a912e89a6f00adcbeb54f3d014e9.npy +04530566-f7b13135feabfbbd91347c63d1dae43c.npy +03325088-458b641a644595ecb362845c6edb57fc.npy +03001627-e4b0814cb9a34107efb405803527fdbb.npy +04256520-a930d381392ff51140b559ef47048b86.npy +03001627-98ec1c46805977c33b48a711df82173e.npy +03790512-f4da1640ad370ce2468bac13e007a6e9.npy +04256520-45fb33cc152121a97b8f528a5a7a471d.npy +02933112-6c6e14968b5e951de7e684d25d4dcaf0.npy +02691156-7eff60e0d72800b8ca8607f540cc62ba.npy +03636649-31d93627f2fbf86dfcb8d8c6d4df8143.npy +04379243-b34982af1d6e18736b4393ff6e4e0f88.npy +04401088-198557f515ecfe73f3c5246a46375579.npy +04256520-70be13428e2a6eb1a789fd2e20dfbbd.npy +04090263-8a0a85f55ffa4a13269c192b79bdefe.npy +02992529-bcbf0ce42d2b0f91abae9246594d3f7d.npy +02958343-90c4864afa329be1fac5c51be36c9fa6.npy +02958343-75c4085b3315688aca92a4cdad802b45.npy +02808440-202920053729ecd1ccd0340812259a39.npy +02933112-cae4ad6aa7d0e49df160c00ab31497df.npy +04256520-a2bd385c411aa690c795085b4d203932.npy +04256520-222ee8debd39d5fedebd258f4352e626.npy +03001627-67c866143e633daaa6fee8e2140acec9.npy +02992529-8ef2182a6f91e71e7877a964f5722626.npy +04379243-3c079f540fafa7e13b3db95ce254f64d.npy +02691156-61159c0458d41ac8e341b5704aa568bd.npy +03001627-861251082f0935c6990561fc34164364.npy +02828884-82071d0daa90cc15ed98cca8f0ccd5f7.npy +02691156-57937c7ab42260ebf119374ee5d5f944.npy +02871439-d4d6afa83861d9c9201432a6a5e88038.npy +03001627-a8f21e581e687c0fa329355bc8cbc0b5.npy +04379243-b7bb5f021d40ae59f7b4b759a0c02e4a.npy +03467517-653405d4777d063351c29c30f86deb78.npy +03001627-2a8554af80cfa5e719fb4103277a6b93.npy +03691459-8d5064233fdf0624b6d9c2cee7f2f72b.npy +02691156-26210ec84a9c1c6eb1bb46d2556ba67d.npy +03001627-72d0cbe861a7de2de4f382dec07f365b.npy +04554684-5e04ab0e24e0882272a5adfd0bef5d10.npy +02808440-e3da3660529c4986ccd0340812259a39.npy +04379243-b9cdd373211c1d406349f6b5431fb3d1.npy +03001627-86c4bc3f46e1bf7bad179769eda42205.npy +04379243-3bfc7947fb8abec5d925b06c8689bfe2.npy +02876657-ac79fd7f10f274aba2c59a4d90e63212.npy +04090263-209b87f6aa188df0bce41980429512ac.npy +02747177-84ade133b55dbde550da8b99982a3057.npy +04379243-dfe0eb3f446059d0500cffceffd2bd2b.npy +03046257-896f36a9b765fabb504721639e19f609.npy +02691156-a60569e3e80d24939bff604afc480b65.npy +03467517-f182545f81b6273f92d73a7cb82eabc7.npy +04090263-9b2cead73808a61a508db6f63303da32.npy +02958343-c6dbb4874805a2c6c2998c73c3c35adb.npy +04468005-b1ab911647c2e39d510791503ab90b79.npy +03467517-d63a56ed4f0bb9aedb43638841a7895e.npy +02691156-c8a7eab796be432d5de04aad18bd94c3.npy +04530566-51b25c88fd90ae2b57c58fd0f9b1d74.npy +02828884-c65b1fe1cb4ec230262cc3347c0f3889.npy +04460130-8ceb7f6e170f793f38cd8eb23853c009.npy +04530566-de010f7468ceefc6fcfb3ae2df2f7efd.npy +04379243-f9f9d2fda27c310b266b42a2f1bdd7cf.npy +03001627-9a5b54e835c762e4f51f77a6d7299806.npy +02958343-605be4facdcdfb194dcb1867559ba976.npy +02933112-a65df9374a1492d7fff2ea4466fc1c5e.npy +02818832-5e930124cbecf7091da03d263d0d0387.npy +04090263-afab3cfa9a8ad5f55dec35fda9dd6781.npy +03991062-ae33867e3c5e1703f155d75bbf62b80.npy +02691156-5d1594f792f3641583a1f09b027e5462.npy +03001627-fc7d038dc7fe2911a75d03186a0409e2.npy +02818832-b8d3510487f019a76bdcd672c2b17215.npy +02958343-f66a6fe34a80b0fbe7540f431cab4686.npy +03211117-97870c19256a95acf5f79806bd65844f.npy +04256520-c1b8d982d97e337f19fb4103277a6b93.npy +04256520-7c92e64a328f1b968f6cc6fefa15515a.npy +03001627-8ecb9191ec41785b351d9ca36f76b95.npy +02828884-7836a7015159442980360680c1602c7d.npy +02958343-3bf15c48eb9110d16abce8cb03e7794.npy +02828884-5cbffd78e4cefc3038330212e10bdbc0.npy +03636649-3deedc86a83bbf23f647dc544bb0ab61.npy +04379243-438f44f223f116e3c2a9901441a2941b.npy +04090263-7da8e9ece43c210e44b4519fba3aa36.npy +02924116-41a74616fe8dab5f88b61e9125676b2.npy +04530566-1994120ab63fd4fa3df8f4ac45647158.npy +03593526-2fc5fff977ac930050b92125e5fcb8ac.npy +03001627-94e289c89059106bd8f74b0004a598cd.npy +03211117-602570deed9cebea66ae7844c5fcdd1f.npy +02958343-a077e24f8983d3d3476c231adfa21265.npy +02933112-92c111f0456557c14da5feafe6f1c8fc.npy +04379243-febbc5702f304c16f51fa0238791f5dc.npy +02871439-a372136702c46b0250a059086f5706fb.npy +04530566-ecdd85e25c18ea404d73ca91c97c0cb3.npy +04530566-b1ed34ab6779919510f652915f26dbdd.npy +02924116-498d3ec19a132718bda733a39f84326d.npy +03211117-afda884544124320642ac1f4cab4f5b.npy +04379243-b8ffc016a4e080a6d2e5fdcf2bc010e2.npy +02958343-6b79cfceb6f614527e7afb83f93db294.npy +03636649-fbcd17479bc96e0a899bad344dc01f2f.npy +02828884-ec4733130fe285d03d23022ce06f940d.npy +03001627-7263fe53bb4601efa37f3fc191551700.npy +04090263-1345ba2c3b27ba786bb9681d4604e123.npy +04379243-7f7d80803ccc727137b816e68e48019c.npy +04090263-75368dfd449ea1d729712ea5520175b6.npy +02871439-f7eaf1291613f3932ade7345ab5b0cf6.npy +03636649-ebd783f677be6825b5495e8609a528b6.npy +02691156-56c79a936f57ef3f7b164268a44f7712.npy +03691459-f6954ca2e4c2b03c67b2ae8c967fcba0.npy +02958343-714d3c11eaa39f106e28ffc6e1f368fe.npy +03001627-3e5e00868a2dfffa7a31dd5af93fdb5c.npy +04090263-18598beeeedb20729a6e43b878d5b335.npy +02691156-a3a3a3d2ccc590eeaef99de91a3e555.npy +04090263-69e884912b10faa880c2e60c312b0f09.npy +02924116-3080d86e8424187d4d44f5db04bf14b8.npy +04256520-9d54e00d9428c07e76e9713f57a5fcb6.npy +04379243-69689176b53be82df51f77a6d7299806.npy +02924116-6ad564360b6d18e814d1291d9f969ff8.npy +04256520-3d0aea03fdbcbcc1dad4c6b86f1850a6.npy +04401088-e8d826158072a6bf1455397a420729a1.npy +04379243-a072caf10178224ad038992c6975ea76.npy +02958343-aa41aa1837c809e1e12eceaa46673a5d.npy +03636649-16258409337ee2914a200f5f1797d729.npy +02933112-4427e5eac495c14e40a7c7e360f68f9b.npy +03001627-7380789e95676518e7c7920f6a65a54d.npy +02958343-6471b4eccdbba210ba9a2870774c1424.npy +04256520-117c47d75798788a5506ead0b132904c.npy +02933112-a64be5342dd3c9f782ef94da039e491f.npy +03325088-908bae8a91cc3af72a38aae7db90ad57.npy +03211117-8f032c701a2d1de772167aadb6db5f77.npy +04530566-4a523f749fd08ffa698137c717c4ad11.npy +04379243-1b0dadf0e60a563b3671949e4f99cc76.npy +03001627-b5b77de7a8a05ab4f09df371fae9d63d.npy +04379243-6e29841d23d6a8a06cee93ad801259bf.npy +04379243-9f286ec40676d24e3dfc74c6ca03fa25.npy +03636649-d2c124b8c6a888fedc7a10bd316015b2.npy +04090263-e66332d7d5d35ad1871adec4b4ff0fcb.npy +03636649-635a3e20af086ce8c0a31f7b214b7805.npy +03991062-d30095f634231fda2c59a4d90e63212.npy +04379243-fd7a4cdd680495c7dbe9c90af547c85d.npy +02691156-7aac10eb5b285098774a720fca15e35b.npy +02958343-5c29bf38845b4ecbea0f3fb9c87b9c6a.npy +02691156-bc2deb55a1c952beca9f0727e23831d9.npy +03691459-54047a2d59ac5eae3ef7ad0f5cedb0e3.npy +03636649-9fde9f07e6217b7490c2e24416edfe5b.npy +04379243-e6b3255eb51908a53c99073e1068144.npy +03001627-5d6a45296fa6c1ff7c21c7b1e8b3e343.npy +03001627-7fcde5fc8e023dd2a6fee8e2140acec9.npy +03948459-76e10c1cb25e814fe7d6f3ee02d4059f.npy +03046257-e78af014ac35bc68f546596ce7364503.npy +03948459-1660ef4b3f20b1e2a94b922b533051b7.npy +04379243-34105c5e1e64f66b23eb3ad3d378722a.npy +03001627-bc523df998d94c7223ac0bd64c9cb255.npy +03001627-66de742ac6ee931390a9ce3e4b15521e.npy +02958343-110ab054cfc351f46a2345809e2bb169.npy +02691156-177fadcfa6b4a8346aa3bf023a2b42a5.npy +04379243-52c2b3f2ee5b3519febad4f49b26ec52.npy +03691459-ed981b60651d5ad8265d1076b4b6c5c.npy +02958343-79febc9d103c4d1c247a5be450795511.npy +02828884-aef0765eabe46794d2b12aa6a0f050b3.npy +04379243-41eda879e1b7eee2dec2e3fb3c73544.npy +04225987-ae28ad55a38200ff1c5f9eddd7cde6be.npy +02691156-a20db17555286e06f5e83e93ffcfd3f0.npy +02958343-d569a1b7066ce775b738b317b28286f9.npy +03001627-3a885865c614a5a35510d59f3ab1ed64.npy +02818832-f388c768c0511cdff72f7a2cfcd9c0f3.npy +04379243-23d4170c7a0a2a014b3c42e318f3affc.npy +03928116-7aa18769bd5d996934d6aa31914c287d.npy +03636649-e97ef0ba839e1e915412c66cb6f267da.npy +03001627-beae73bea87f36a8f797b840852566c8.npy +03325088-60a6cd1194397b4bd3acd54d47e688e9.npy +04379243-2a0676c50108be8842d09291b1705b96.npy +02958343-1cf17a1e1841d10c9e6a3356df3f3d9a.npy +04090263-df2cec0219c10e0ddae3730658b53fef.npy +04379243-a9504a750945231f91bed99343331f7c.npy +04256520-96e21b275c9bd83bec7cbf3284585a40.npy +03001627-80dabf9ddbdc92f681806e3880250dff.npy +02828884-84bb6a30b1c5a87be008ebe8273a693f.npy +03001627-98ef942e35e90be3de8d5f2cba401802.npy +04379243-c6591f825c72dc6553a2cae48abaea7d.npy +04090263-8caf6dcbdebba2221326f2506129299b.npy +04530566-bd04c982ef479f160014fe834c82238.npy +03691459-ab79e12684746d0273e1b2d018c0512.npy +03467517-5238adec0790595930c206f77b5cb4d0.npy +03001627-33c4f94e97c3fefd19fb4103277a6b93.npy +04379243-1e60953829fa7e0530bbd4cddd04c77b.npy +03325088-21c83317b5617925b48d1e811c2d60b8.npy +02933112-9524af09747661fbe0f91080da8431d7.npy +02958343-cb0bffd770644cebcfd826dd468a5497.npy +03797390-1c9f9e25c654cbca3c71bf3f4dd78475.npy +03593526-546025d656c166562887a88b1b446ef8.npy +04256520-13b60f5be9af777cc3bd24f986301745.npy +04090263-35f61b951ad15590d2a0074bc2b80d37.npy +03207941-6f006ce5ec9c41029a8ef44e1d2c5b75.npy +04379243-775b3e38da839158ecab93c7630e9242.npy +02933112-caa4f65053f07a64548804f91c2c5c3d.npy +03991062-19042f85f93a8b239f7e329438453d00.npy +03211117-93e260150e7788ab574b5684eaec43e9.npy +04379243-aec823460d983866d23df9ad1134a651.npy +02808440-fda9e9a38854dcb72101dcac4ed75d3.npy +02871439-97bd21b29826854a23500a5b036df62e.npy +04379243-cb7114df1c8ad743af04c22d77ac98f.npy +04379243-41d9b3064aca3c74e7d71bdc5700ff8b.npy +04401088-c1c23c7a80e4bf388c34a8518a7b6811.npy +03211117-dbfc22d7d096f66d5f1b26547b9ff327.npy +03001627-46363a10e242999c69d8d5b35c38db0d.npy +04379243-50323d86b68db6fbc35131da26f8061a.npy +03593526-e6a47ba0a8cca8a14725f67267e31c89.npy +02691156-2269715ca42c218fe3921ab5df3d2707.npy +04379243-6b6ea2e841e2f00b60eb699207aa149d.npy +04379243-5b51e63726f21bb6a75d03186a0409e2.npy +04379243-1fcc1a3a879b2a037d43e094da89ace.npy +03636649-8464de18cd5d14e138435fc2a8dffe1b.npy +04379243-5aa08289fc85d4d2ee51e40b76ccdf20.npy +04256520-c943da3efba4955d3ed66fc182459935.npy +03001627-937bea562c1db4fe5ba41eea807f5d3c.npy +04379243-7bbd4240f837e20a6716685cf333d2c1.npy +03636649-23a8eaabd1343badfcb8d8c6d4df8143.npy +04401088-f973c91a4c239da9dd14866f469b6370.npy +03001627-374fe2584abb594da094848ea4d06501.npy +03001627-9ab690ed709e7131b1b2ecd73d1717a3.npy +04379243-43a7d89c62a2fa86a5aee46eeae32d13.npy +04090263-f2b4650a52cca500b4cdad9a5bf52dd5.npy +02958343-4d52395f788af7e5a413908c0e169330.npy +04379243-4fad9f5ab1d22ea95445fd9f27a38098.npy +03691459-ba56fb3205a34768d4b4ae2ff4c58b57.npy +04468005-5eac87cfbf9188cc1aa15c8505e5645.npy +03642806-6008f256f3beafd9988abef1fd117e7.npy +02801938-2056cbd13e92764a61b3b6f2928a81b2.npy +03636649-c81470e576e437a495f1c4bba38e85d.npy +04530566-b91c482da95cf3055f41c9ba4474959f.npy +04379243-c011010ac01b73c78e43a810a63361f0.npy +03001627-8b39b501c9fa4d349b9f2eb77f5e247e.npy +03211117-882619bc31c4e4c88091986dc5b9a01e.npy +04090263-390d25757d6532d5dd8e6e2fb6475d03.npy +02958343-a5d32daf96820ca5f63ee8a34069b7c5.npy +03001627-1da9942b2ab7082b2ba1fdc12ecb5c9e.npy +02808440-84c48592fa2c0d82b73e9e930f636032.npy +04530566-767e561fa1214fb83651bb31f42d2f80.npy +03001627-f10263256eeb840b732c9e6120e90cf8.npy +02691156-bc33901245943313d6d949577c389a84.npy +04401088-fcd923f9bcf1e859e2a1e51fbada37b3.npy +03001627-34722e50142652e53a5e6305a3a7adee.npy +02828884-f80f3251391f3cfccbfa849e0f7f0b10.npy +02876657-fd0ccd09330865277602de57eab5e08f.npy +03636649-787bd789cf2aab676e0185e256a599cc.npy +02958343-3339caa48a18e4c358db0ef36af1d3c5.npy +04379243-68a6c680b48dbed292a0bc4ecc8b2ed9.npy +04090263-a2570eec88282cb3d8569d1a6c25406f.npy +03691459-2f41de1a2faf854d860e5e56395d4d1b.npy +03636649-29985e44b73051d923500a5b036df62e.npy +04256520-61ce96ea92a12f402e0ec510458499fa.npy +04379243-2a6010074025d1d85dc3653f8341633a.npy +02876657-b1271f402910cf05cfdfe3f21f42a111.npy +02958343-792a93f2b8dcfe7116abce8cb03e7794.npy +03001627-336ec0b3142fec15aaf0ad030fc37d94.npy +02958343-1acfbda4ce0ec524bedced414fad522f.npy +04401088-85a94f368a791343985b19765176f4ab.npy +02992529-c56262f4a6a7fbe5fcae16e8230396f7.npy +02992529-39cd15c429c6007e2826f529d0b74d3a.npy +04090263-365589510c76c7cee603a5ccfc8229e4.npy +04379243-f9bac9ba3b878cf23a6e0d0a575f76a3.npy +02801938-2ae75c0f4bf43142e76bc197b3a3ffc0.npy +02691156-f1295a30fd857249224c86fc0bbbbedc.npy +03001627-47dcabdd8618e5c4b3c9a4ebefe3bae0.npy +04379243-63fedc0334f5552dbec3a71604e140e3.npy +03001627-b46ad21b7126049842ca7cc070f21ed3.npy +03691459-90120bf8e84315de6873d49607c1f87.npy +03642806-ac3ca8ae5e3203117f2411014f221968.npy +04530566-4be2461bad10aa82a875c848d0fb1664.npy +02691156-72fcc9dfb927311935fc197bbabcd5bd.npy +04379243-bc842e548e68a3cbb48513409ae7c51d.npy +03467517-d50d06b159363b1693f0194265a9746c.npy +04530566-e687e0074b0dc5bc470938161c06eb7d.npy +04401088-58c6118bd15ca3b48dd025faf4cea27d.npy +04379243-21c58ff6f87b750cb9a0f5d18f1ce54c.npy +03710193-e79cc4e58f69eadc5bee258e658f9767.npy +03991062-87d72b1c98c0f8548c159f8d5e761b17.npy +03001627-308ba1f8c1eed4fbbf80985a99195eb8.npy +04090263-aa47591498e4eb615dd9d441afd49974.npy +02992529-82aeb34ab6fa282766148e8aa85ea356.npy +04530566-988e1d7106b705d692336765b86c93d9.npy +02958343-8c0fd2f204d6008da1b543d55837199.npy +04256520-76e0b10288997462c51b240dc7b068a0.npy +03325088-28568aa9e333a421c36fb70296e45483.npy +03636649-185b2436cc0404096ef2faffa907bc32.npy +04379243-e94b1ab02a3264c89eaa55bb236fb6e1.npy +03593526-ea4b33d425d8535047efcaa87d68903f.npy +03211117-a151ea6f6bf27e2c9a7c2b8fd801b3e8.npy +04379243-7478ed7307756ccba10ff7fd5e43a633.npy +03211117-751f46191d0baf99f541411dc07303c.npy +03001627-ffd3064cff5757695ecd29875b6f0d44.npy +02747177-46e777a46aa76681f4fb4dee5181bee.npy +03001627-32284e0d1700dc55e7c7920f6a65a54d.npy +04074963-25182f6e03375c9e7b6fd5468f603b31.npy +02691156-3ee352a759364cdfbd46d022fd7d80aa.npy +03001627-e0df9f745fe38b389bac1502ed0eb150.npy +03593526-86fc09510df14f9d9f53fb212867331e.npy +03001627-e5f405ad8aeca327d9b53420a5458c53.npy +04401088-8ce0fff87979560bed1f9cd2184d7b73.npy +02958343-6dbb3c5d7ce105243afcf7df86a03c60.npy +02924116-a0e5a36bcb4e2298e1da81584e31b667.npy +02933112-cafb0ae07b0e2fb055f46d55537192b6.npy +03691459-4a10811da56f40a989542bab68e6843.npy +03046257-1ca3587bf68d70d571810a8e7ede71b3.npy +04379243-75e3cbf4b1ef0df971a782a4379556c7.npy +04256520-ac5a9b215a7d5be123448769dbb64afa.npy +04256520-d47eb4149fbcd0c7907a5a34fd8df2f1.npy +02691156-e413c15ded9ba57a23fc69eefd95e6d3.npy +04256520-2a310d5bb9e5b1ec162227055a96104e.npy +04256520-b922bbdf49b4100659f8e31ca87c470e.npy +04530566-fe7362e8a02d00072e4aadf908a27d12.npy +04379243-79b7bd0c910e833ba5dde908aa701435.npy +02828884-367e5ca5d5791739d4d8765e3910f617.npy +03938244-68316f18573e3449622179425ac4ebe9.npy +03001627-29cd7fbcf6c7c33df51f77a6d7299806.npy +04379243-b4cc6b735f911fefcfff181817262617.npy +02808440-9c1664de95b39e30ccd0340812259a39.npy +04379243-c6fc2ce48ae9867d688ad7d3969cd02a.npy +04379243-fc2ae302325d2c796820bd77cbfc18d6.npy +02992529-b442b550e827cbcc8ea897fbf75dc392.npy +02808440-3b4a28f7e078ac063321831d2245cf06.npy +02958343-30d360f644e8cd472eff38f357a7b528.npy +02691156-39fce052e13f97a57a10aa3eec436422.npy +02958343-1feeeaeb8b56e46d2dfaf88f42097063.npy +02691156-b738666a0403a7fa6818e4a1f2613507.npy +02958343-139718b631cbca546a36136419d55d5c.npy +03593526-8c45ab7f96998dc0feb02b0cb8b196e3.npy +02924116-2852577a7f4a67216f03051f81ab06b7.npy +03211117-118083b82350b53cb23e7e4bd2944793.npy +02818832-698ef3d1a8c0c829c580fdeb5460f6d6.npy +04530566-9f34d1dbf06b4d989330265a9fff38de.npy +03001627-ccd5e24c9b96febd5208aab875b932bc.npy +03001627-4a329240c6a9d2547b11ae648ea92233.npy +04090263-bd7b5781568afa0f46177b6d1ecbf989.npy +04530566-1039c49d2976eb87d5faf4905977884.npy +03467517-83b2ecf5caced214e313875ff213ee10.npy +04379243-30ddc80e5fd46bbef51fa0238791f5dc.npy +03467517-8465e902e1aa1686e52028751701a83.npy +03001627-d0d786244fc2d7a9ecf03af5e7a1277b.npy +02691156-228fcd24cea34febc0909d98a1ff2b4.npy +03467517-f146c58eaa06f5e4d57700c05b1862d8.npy +03691459-e6ac4bf60e270a6512da48a027621f2b.npy +03001627-e1ab1f421891fb01f302352a74d4e413.npy +04401088-5d1652fdd7cd46d0dbb1de10c9529bf7.npy +04379243-40f8588bf78172a129e4b5aa807bb4e7.npy +03001627-d64c618e8b0c7db73ded7580b6cd3bad.npy +03001627-f1dac1909107c0eef51f77a6d7299806.npy +04401088-a3193340929f4bdd146def56c5fc9b3a.npy +02871439-32c3e3a86698a175a7942170a4965f4.npy +04379243-97d1c4b5a82891e33002761e7a3ba3bd.npy +03593526-7c1303d3a19a1cef51f77a6d7299806.npy +02828884-a762de549efd8f2899d9a264095450d7.npy +02924116-350d4061f4cd94b9a855be96518ce9f0.npy +03001627-5bba0c3a964662a6881e525dd6501111.npy +03636649-7527ef1898765c09fcb8d8c6d4df8143.npy +04379243-34c00f5a77147ac6b041f249f731e3da.npy +04256520-64ee5d22281ef431de03ab2a27ba7531.npy +02958343-6c22203e5ed35df9ca4aeb694e04f8df.npy +03001627-f9dcf630e370f7d5a320e34dad7c78bd.npy +02992529-a698b67778c02fcb5a0a15c8380e928f.npy +02933112-227d258c1045acbe9e4965f0106e00d9.npy +02691156-5f46f3c62e353c7bb4f5fdc59ce06e88.npy +04530566-a7f5b96f138649c6bc30e923e47d8bd4.npy +04090263-c4d201c44ab9b1f3e1f2a1daf140ac9f.npy +04256520-33eaa3a6a05575ab14038d588fd1342f.npy +02691156-6193ca8f5b4419bfd86ebdaa02a63c4b.npy +02828884-57afec727772346f30bbd4cddd04c77b.npy +03001627-8b4b176d9393676d5e1f306d831137e1.npy +04379243-3838d78a4b4a76282027cee422df2aa3.npy +03001627-fca55be264355b1ac30ba10ebbf8ea21.npy +04530566-ccf527bf6ea742f0afe1d4530f4c6e24.npy +02876657-e8b48d395d3d8744e53e6e0633163da8.npy +04401088-e4a8822c5faa386fa9976d676758bbee.npy +02808440-6e4a0d8f65be087458da1271ffd33120.npy +03636649-e0aa085dfdb0ac03ef3a2c64cef919d0.npy +02747177-2c09ad6e78554a6ead5067eac75a07f7.npy +02933112-29c7cd661bce3e50c59350d819542ec7.npy +02691156-ef26ad836cd29010f2acf00738ce9d0d.npy +03001627-a750f7309fcc4b0473672ae855b8c82f.npy +04256520-628f7a321ce4f90fcf01bc59d215f0.npy +04379243-27a0e85f8fd0c7a819fb4103277a6b93.npy +03691459-3fd4d9909c72fe47dc4f6934317af74.npy +04401088-8b11b38e035143ddb007a3ad40c5add6.npy +03001627-f36e83dff72cba53ba9ae5e8f97b3d4.npy +03928116-4e370af4ed086e088b3c4b6eb338e363.npy +04090263-80432cdae538023ef13eed41b64dddca.npy +02691156-33faf711ed54a4d3db22b838c125a50b.npy +02933112-2df3eafe6c699c1a6baba085b51d97.npy +02958343-b659b096b9cd0de093532d4a06abe81.npy +03001627-d4f38e40aedc67f779368d1198f406e7.npy +04379243-3eef676eb5cb9db4e56bf1253ce74bd.npy +04379243-f835366205ba8afd9b678eaf6920cd86.npy +02691156-7117ac29aef4f1c4951971f8370d9050.npy +02958343-ab7b5025c9e9c1921cb81cb1632a5e.npy +02808440-2426e758dc1d2681ccd0340812259a39.npy +04256520-d3425554004d834f6dbc9d74bad392c.npy +04379243-c9ab6dcc7e4606adf00f0216ab99ff30.npy +03046257-a39bd192df9ec7475e6e4a5422e31446.npy +04256520-9aef63feacf65dd9cc3e9831f31c9164.npy +03593526-9c60d16fa781095fb866188bf6825255.npy +03211117-4d74d8c3df7a85051d225d751745cd28.npy +02691156-a9dff753cf97f9c5354ab1decf4fe605.npy +03325088-804cdf67685d7e592efffaf8e146c9c.npy +02747177-59aba635f6d79bd72bcd3c046a99811e.npy +03593526-4a53c4af240c562537048583edf8ef2c.npy +03691459-b648f6cd54d07a1023e70120ea31089.npy +02876657-32074e5642bad0e12c16495e79df12c1.npy +02958343-fe16b8e790f23ab8c6fcb4b4f04936c2.npy +04090263-ae1a6e01d2ea5d2cc75e2dd4efaea578.npy +04530566-6fd0071445c70e9297e6e890ac2fb198.npy +04379243-4e76319c1489ee71f4a4c7b91852bb65.npy +04090263-f50efdafb9e486f4519f927f2bf92da9.npy +02992529-2098a0f7cef1e593f6c5597dd1efe723.npy +04090263-6e23faad8bff1e12f7bd077790d66b82.npy +02876657-4301fe10764677dcdf0266d76aa42ba.npy +03046257-dcd8f3705e7ebf7fb2f671e673cf292b.npy +04401088-1d9169471bf9223423e378ba27e11ea6.npy +04256520-98e6845fd0c59edef1a8499ee563cb43.npy +03938244-86bcb4eb29d5effe157f5033576317e1.npy +04090263-70928b07af4272df2d07d103eb3a7540.npy +04530566-14fff3ebab1e144d6b77971fd22cc80d.npy +02828884-25f916e08a803ad5067eac75a07f7.npy +03046257-845f1b53ad2e0d53b87e0c7ed53711c.npy +03337140-38c55928e088fe1b47f6dcad69d89980.npy +02958343-854bb96a96a4d1b338acbabdc1252e2f.npy +03593526-be4e86198d0b8d438edb5be732846826.npy +02924116-f4f5bc6fc08ca19962ea3c59193a008.npy +03001627-e3eb5422bda98fa12764cfba57a5de73.npy +03636649-4deef34d95367b58c0d95250e682f6ee.npy +02691156-e6d6e9544e353f9f75e49fe23848bbe5.npy +04090263-c4d31507a1c0f7b7c3972dbee3e8d0f9.npy +04379243-e1b3412d67d2c18c59f8e31ca87c470e.npy +03325088-1d584bae2bb2ff963ca0c4be71e7b721.npy +04256520-5c9b1a32f54b12cf81f667e2a25e0619.npy +04530566-4f513b39cfce2d269eddf484109e2999.npy +03001627-5609756359a6dd2c1933ffef19678834.npy +04379243-5ec15b09dedf4dfe961b3f02493c4f73.npy +02691156-8d54e30dea0e2508bbf3143b1cb6076a.npy +02992529-5d1652fdd7cd46d0dbb1de10c9529bf7.npy +02958343-72ad8ebcd7dfbc87368990af61c704f7.npy +03337140-3c519e2bb9f20e284c3aee8e9d3a6ffa.npy +03691459-3b55f9d0fecbc561de9a8c37f2997f.npy +02828884-c83b3192c338527a2056b4bd5d870b47.npy +04090263-639b18f1cbf26228e666ec68139b7ff7.npy +04090263-a4051a1e8a1b78003940cfb719120315.npy +02828884-c3d4204f6f0613b1959f51f2c68b3ef.npy +02818832-b928b7904901c8849abd6ac8761170b2.npy +04379243-4d43a00b356701d914f14c67f445762b.npy +02933112-b4d82c9706931d29d1d193a59606317a.npy +02691156-c47a2cb459ab849c493ab0b98cb45d3.npy +02876657-3a9516eb02206108e0c8359faeb78bbe.npy +02828884-3db1d3904f058b574a9ca2c84bced0dd.npy +03001627-111720e8cd4c613492d9da2668ec34c.npy +03790512-6819949f5625ca12d0f568c31c1cd62a.npy +04379243-845c77d01efe2f2e425fe98d8cc1c2c.npy +03001627-64871dc28a21843ad504e40666187f4e.npy +02933112-14dff09acf069b63c59350d819542ec7.npy +03001627-ebed17a73a2e9e981882515d09f3979e.npy +02958343-985763be7e2b18ec16abce8cb03e7794.npy +02958343-b9c0f9dbfb5a1c0f99684c8184952917.npy +04379243-a4e595d77097b224e2b372d25f6c9482.npy +03001627-8da6959dc59296c9f2f43e6f841bd32b.npy +02958343-e1a694f11100ace082d20fd7268a10a.npy +02924116-607d400470141f8d8f8940e918ad4591.npy +04379243-a55454529b463a1eec56aed2da084563.npy +03636649-907fd296708ae71dd5fab5deb286066.npy +02808440-cdc30ab10100ed23fc4743bde9e89079.npy +03001627-90129d2f4a5cb57799982a4d6320875e.npy +03593526-cf184ee375cf827eeee0d5e82f0b9cab.npy +04379243-e6cb56c84042891b201e82f29479384c.npy +03991062-c1abad416a011faa2c59a4d90e63212.npy +04379243-20647984dbeb990ea6c03a53cf0a14c9.npy +02691156-29120728132e5dce42a2048a31b7df8c.npy +03710193-85935473b4685e24769119a7d27b495b.npy +02691156-2d9a7863dcfb5663d208f79049825a82.npy +03211117-3209637ef61547c040feea836646b66e.npy +04090263-c4f73b23f4fa46364785ea41f043d735.npy +02924116-58017ca7c738b89dbd69e36f5d4705c8.npy +03001627-92bad575037b0552d7bf6fb68df7f786.npy +04099429-651f56b608143df0cfb3f4d4e98ee41e.npy +02691156-e02485f093835f45c1b64d86df61366a.npy +04256520-8f5c8cdc0fc4d84aaa4296a266fbc9c0.npy +03790512-c8d62fbab07d49a7e398c671c3b93e96.npy +03001627-d7dfcd99197d6ae7b6dbfb7eb145012e.npy +04379243-9b42cb91ccead6d42f6d10c5d1d56320.npy +04090263-2b997d20df6ec1b7e290ca81b042ebb4.npy +02933112-3a2afbdc240a7f073fe047712e43e185.npy +03001627-360b02dcfeabe768492d9da2668ec34c.npy +03001627-8e2b44ec14701d057c2b071b8bda1b69.npy +03593526-1c47c52b9f57f348e44d45504b29e834.npy +03636649-9459660f359235abd9010e2a1af5e34e.npy +03001627-450d40600ed92c7de9ad5e44c87685c0.npy +02933112-5a5e9a046d79bcc7859a7164d38b0d13.npy +04379243-f64138f5515e5031f785f45147f3e474.npy +04530566-583ef94812afcd26e025e00c738da634.npy +02691156-e6ed2c677e158daa1059f490634fcf62.npy +04379243-72010b2aabc328ba2d1beed6f591ab11.npy +04379243-fcc3a9a4e880b5f35966c5a46a5a6ec8.npy +03001627-9b42dd8043ba84f7492d9da2668ec34c.npy +02958343-12796524ffbadb755400f0dc3171dfcd.npy +03001627-b4371c352f96c4d5a6fee8e2140acec9.npy +03207941-e5aea3a902e5cb8e2116f4e646b32073.npy +02933112-2726971c1ed929eaa733727fd41bdb33.npy +02691156-d3198154076f49a86f0778e65d2e88ad.npy +02691156-341f5b3c74970a618d0dbc7502fb16f2.npy +04379243-a6a7ea033ff20abac133e11c42c6f6f4.npy +04379243-fd7ed06e2ceb26d766c55b7c01b230bc.npy +04379243-4a47ff44cd2f024635cf289fa8ad7115.npy +03761084-eb7dd094761f3647fcfa1e01912deb2c.npy +03001627-e71d05f223d527a5f91663a74ccd2338.npy +04090263-7713f61fc0b829f3e196b48bc93a41a.npy +03001627-8117c55b8bbdbbc54c5c5c89015f1980.npy +02691156-1a6ad7a24bb89733f412783097373bdc.npy +04090263-7ffa338b2693aef651cfdb4c9f126c12.npy +04379243-57fbb082f660c4f7716b680dedf77108.npy +04379243-98412ad8301f965210c709fd84118ff1.npy +03991062-386b99b2357ba64aa2c59a4d90e63212.npy +04401088-1a0fab14a11b39d1a5295d0078b5d60.npy +04379243-37d500b1bf8b3a5beedb4c8fd29e2d1.npy +03001627-e31d71ed32273fede42ac999db581f5e.npy +03593526-fa9e6aa9d67d5329e5c3c7284848bbfe.npy +03001627-373089aa7a44565b7215a1e3ffbff428.npy +02871439-46df0d838e68cedbd42b9650f19dd425.npy +02871439-a74ce03cd895bf07316bfcab702f4c34.npy +02747177-8026b11c2f66d77ed5a4ff0c97164231.npy +02691156-d2bf5f39131584c0a8cba409c4409ba9.npy +03691459-46ec6741dbbe69bdbc052c28a9e28ccd.npy +02958343-d2592adba4e8e62648368c1a2f71c5f3.npy +03211117-2d828dc0e75a47ab760433abc0037bf6.npy +03636649-28793511c46b4fa030f6e0ede20c4525.npy +02958343-c4ee4b9fc4501a9380c4d64ac66d8b56.npy +04379243-6e3a2f1de25bcde5ed6c51d5b9c713e3.npy +04379243-c527f1e7ae2c7b8a4f7482420c2e91df.npy +04379243-6b678921222e3375f9395f1ee40f845e.npy +03001627-622552cb1f5670a614038d588fd1342f.npy +02958343-c12424d1cb48ce0fd0a4f72b67c7f064.npy +03001627-1953d62a63721f17df6cfab91d65bb91.npy +04379243-6159304c015c2d54bd7b3ab3cb320beb.npy +02933112-63c195f60442eb5a32cdc35a3ef7141.npy +04090263-d2f505aca92ee65fbdb8512730b99253.npy +03001627-6621723f7af35f2dcd344c2b2cefcda6.npy +02808440-cdf47d95ba14768d48ad5e70a514c4da.npy +04379243-f62766dc071eb88472f944a50941537.npy +02958343-98a1a92a94a025aed28935fb3c99dc7e.npy +02828884-6c8d7faebd2ca60ef3b7873c9ffd02fd.npy +03211117-8bf89a26f5e7824a8eb91f418e60b82e.npy +04379243-94be8cf5e1538257f51fa0238791f5dc.npy +04379243-81ece5ee42a4f814d384177e3e0b693c.npy +02992529-d2636f3af00fb3e2538f655e65b0b57.npy +02958343-fdd3f02c294518341944f01d3ab2091b.npy +03691459-f07c69a33e0a1f54b6c84941dc90c1d2.npy +02992529-44d7b5d87c26896944608b3255ca1886.npy +03636649-a801be11157a7f243d39d8012919dd25.npy +04256520-df19f437c753b93a72814c9aa90ee14e.npy +04401088-ef2b505068cf120efe48f52a0ccc160d.npy +02691156-2f3bef6d679273d062b600da24e0965.npy +02691156-74a5f937c22aa08a3e70653c1b3170b5.npy +02933112-6f03b6ab474c04a243e5ff23b077c03a.npy +03797390-6faf1f04bde838e477f883dde7397db2.npy +04468005-2a56202ffe3cedde53a3d395d3382ee.npy +02828884-1d6150ae91a07cf6f4fb4dee5181bee.npy +02808440-cc98d2d5157aab693321831d2245cf06.npy +04379243-fcf216336b414bfd2ea86336b05b146a.npy +03001627-600f028f0bd5e7c2c8e0227722a7d821.npy +03467517-375ef808d47a832684097c4f3f6953fd.npy +03636649-9a98a0088ac6d37a2c5b2f528cea9dd6.npy +03001627-d3f4ce51467fb777525211e12d56c55f.npy +04468005-eecbec1d6360c2c77b4c98ce79dd9c8f.npy +04090263-3722e5b8425d025895f22290198b089.npy +03636649-7c8d71334a6bbe8eb3d57d6094a92e4e.npy +04090263-42b231fa5ac25f7dbac3a27910198725.npy +04530566-217966c23fe43ab83bde759c61eecdb6.npy +04090263-ce38b5d04d546346f27eb335b754fdaa.npy +03948459-12eedf28d9a948556c1cd53dbc9f7b8e.npy +02933112-4116f2d56897d9ec1bc4df4f6291380a.npy +02958343-150f2cf6e9c54d08c24a350006d347c.npy +03001627-c4c598c29a542a5f150539b40d03634f.npy +03337140-ef16caeae076c1a530bbd4cddd04c77b.npy +04090263-259edfd9a26c68104c16ba0acd861632.npy +02880940-3152c7a0e8ee4356314eed4e88b74a21.npy +04379243-d497f192ea400165da22561748cba914.npy +04379243-73ce68f6021be015122dab9909481e14.npy +04256520-42f33746d7f0a8a24d3485a4d7c3a3ee.npy +03691459-93900698e7d9ff4d104831d5b063e54b.npy +04401088-5e6ee0c5d155d2298b13932a0c28e98b.npy +02808440-800da11834a991da3321831d2245cf06.npy +02773838-5afe31025e8574ea8d6e12c39b2d5023.npy +04256520-33ee49115aa7125ddc37657f7fe19edb.npy +03001627-9d36bf414dde2f1a93a28cbb4bfc693b.npy +02942699-4700873107186c6e2203f435e9e6785.npy +03001627-4719c75b8ce30de84b3c42e318f3affc.npy +04530566-2fb7d918e4a738fd97556ba76bc2663.npy +04379243-553c416f33c5e5e18b9b51ae4415d5aa.npy +03691459-943e9abfee56144fc194eaff7ea54233.npy +02958343-283d78cf3eebff5e9aae70753d127b0b.npy +03001627-2787a03f47ffb80360cc99f89622808e.npy +03636649-5488a4df2e78fa1eb184155425111e9f.npy +04090263-c146b0aa5541bc1fc0f919a9a9f1e7fc.npy +02691156-3794aa3159c10929da116749c2415b0f.npy +04379243-6db3d1818431bf97e785ff1b79dea9cb.npy +04468005-296497a4bd7466f3bf5d6261979dd437.npy +02958343-41f087af6d5af9e1c05a03162270a7ea.npy +02992529-4a60039ed657d838fe5c7c47101442e0.npy +04256520-7e2d1762fba4c38112ad7c55c944504a.npy +04530566-6c00d47d1c8b81fb90142192ec795d.npy +03211117-21ad9636dfcc9578c78df40cf2e9097a.npy +02828884-17a7a1a4761e9aa1d4bf2d5f775ffe5e.npy +03691459-1a14b00578f19b1f5c38e15d823f1476.npy +04530566-d9e771ae62f0bebd28642b2f4910862d.npy +02958343-a56dca5eab44489ca7fd25564c2e888e.npy +03938244-68131b4f51579263f7b57f419ab26207.npy +03325088-944985ecba6082483792c04fd8184496.npy +03636649-11194326770b1225d49b2e04785f8492.npy +04379243-b66ea953531a8d78f0c92c2dfba3cdce.npy +04379243-9323cd461b771e8ecb503f63ed915ed2.npy +04379243-229b99c5f07fc657798b7aa9a1ef8938.npy +03001627-5fe6b94dce63fc59d4589db494f55afa.npy +03467517-4d10edebb598202263e148e250c0340d.npy +03001627-4c668aab2c49f9ac9bf4d6e8e41d9e5b.npy +04530566-f8d3af1d1a20123c249ba97ee36ba54.npy +04256520-82460a80f6e9cd8bb0851ce87f32a267.npy +04379243-bcac0b4a07a61efed498ea2919be2102.npy +03691459-e12178cbc10606bbb48374d47d81a219.npy +04530566-203d75b8112369d66a4afad911312b2b.npy +04379243-4f9bfdae2b76536b3212177d8262e8ae.npy +04379243-10ff43e8fb49af1719fb4103277a6b93.npy +03001627-af30cef615a3338599426e1733531ba.npy +04379243-8ad1486390608fb936da5f8a6c22b2dd.npy +02992529-a86eec9735db06a8226bc3b9ce9ff2a1.npy +04530566-f61eeef9235a776073fab9f1733a68f6.npy +02871439-3285b8271f126ea84767450bcb30e5f2.npy +03636649-b0871c4ac8505d9c3d39d8012919dd25.npy +03001627-8a232028c2b2cfad43649af30eba8304.npy +02924116-6f50c339a2fb88cdf0ef31d4eb6dabb7.npy +04379243-52bc4d1cdb3789407ff6ace05b36a5.npy +04379243-6351840a6f3b29d0a15e691028c09e34.npy +04379243-6146dea482c1e5eaf713a1a6bbd3da86.npy +04256520-e8840d7ef11fc9d4a54b9afa882a89ed.npy +02876657-2f4ec01bad6cd5ac488017d48a7f7eb4.npy +04554684-6bb98df3d7f7d3e1e5bd38daa40d76f8.npy +04090263-418439dbd9a2e674a81ccece899902be.npy +03046257-6da867f9fd8aefebc26e81144f3196d5.npy +03642806-662bff93f075e8f29a4b8c8271f09050.npy +02924116-6082930ceabb5ccee0b240915f388193.npy +03211117-bdea41fb7dc360b57639b23a4f342494.npy +04379243-16570d98a47c9907bd1aeba6ff85928a.npy +02924116-8ad16d5986708c0ec98c13d6112727de.npy +03001627-94b39e206f1bd77c69e31bb722067900.npy +02958343-74cf231265731c2f8a1aed4fb5fe5280.npy +04379243-ec59bd4b5288991e9bb952e15a37e248.npy +02828884-9bf1e702777f4f5292694c864c93195e.npy +03001627-c44413bb705968bb71a782a4379556c7.npy +03790512-bc1a3e925e6da7a97bf525c97f9f490c.npy +03467517-5c569af400d756335e98dae1ae7ba143.npy +03691459-eda3d466ae38e9112a40b4a3ef70af61.npy +02828884-86ab9c42f10767d8eddca7e2450ee088.npy +03001627-dab5b7b9df65d2e2cf0bcb121cf32b53.npy +02828884-6d23e04807a5c840307005544420ecd4.npy +04530566-4c433697f371db56459e601c4b110252.npy +03593526-84a8a8a36901d3c4500158c23c4c5a8e.npy +04090263-57dab7fa939cb30d9f703ae3d7bd0308.npy +02808440-abb5f87e6c6705e1d43b13ed5ceb051e.npy +04379243-75ddfe6d71b14184134155606601dcb2.npy +03207941-9112f0ee6b1cdf5082ec48ff3a4fe07c.npy +03624134-d5167211e757e79f012465c621a63e3.npy +03928116-f4849c546734104a5fcfbea90545e502.npy +03211117-93d0756b41670e89ce2fdea99c5936e8.npy +03001627-98f42a66467c264377fe1aa9b41a89c5.npy +02691156-7078ad51c3c30972b310347ab50a9dea.npy +04379243-82e5309809e455d5f15fed2243deb166.npy +03636649-f7c52d5d91e5ffbfbf82a0d508a096d3.npy +02992529-e14de927fca30e267a351c9c1f605db0.npy +03991062-380af31bb5f03b12a2c59a4d90e63212.npy +03001627-c993ac723dbaf479a4929a32e32d23f3.npy +03691459-b68e0b294c799771ebc9199df8e5ab6.npy +03467517-e2dd8689a41a4eb7a62113f6bf783f69.npy +04530566-46fefa9e95b353f4b1bb46d2556ba67d.npy +04554684-cb6febe6334cbf7791219aad82abc053.npy +03001627-5c61d56d4147e55d5213cec267286d18.npy +02808440-25d3c9f5d30682ec1562059f17dc3c45.npy +03001627-f3573756e64259f2b29d280b4e59c527.npy +03991062-c20d0e4ebd8d85fb97b54645ed3317a2.npy +04256520-60ad8be4124fda92408442c6701ebe92.npy +04256520-6b036756d21b6d8548eb521885c87e13.npy +03938244-343e3dedabdb067193e60794f9200b7.npy +03636649-df31746077d19233448e1c9934d83117.npy +03001627-7824cba870f915ba2922dc9c4df31134.npy +03593526-718d999b71ac3d28c33cda78d407d98a.npy +04256520-9e2a48a4263b77a06f37a8be59c15bbb.npy +04379243-56c627c74e9c78c65ed9439580e8c076.npy +03790512-269bfe1b994ac28617798af67b81f2f.npy +02958343-6c39e401487c95e9ee897525d11b0599.npy +03325088-9406afb358319bdf1aac9a952ec41bdd.npy +04379243-aec39c7f691c2ad15a824ea0c4d9b625.npy +03001627-6678f63c9b584a549d9e5580ae9f8738.npy +03624134-7048d3ea565fad8da737721d7c8987b.npy +04090263-f5b35e6452c2138de1f2a1daf140ac9f.npy +04090263-9168d4697d83cb9215bec5c0df04f3.npy +03207941-a62b6a19d2093bc91cbd656f2f1bc2ff.npy +04379243-904141878e75b065f48f3ef41449c816.npy +04401088-ff8676e76a0fd471fc115be4ff5cfb9e.npy +04256520-d53620b3769bcbd664518692a46d31bd.npy +04554684-6b056e83f0ae99f3792911e05e8927e7.npy +03211117-286a7629b62426b5427c20e7fc0367ac.npy +02691156-c5e04f903e3472c31883411175051361.npy +02924116-3e1860cc19efb87df6cf361e85e34a53.npy +03636649-ced76fc046191db3fe5c8ffd0f5eba47.npy +03001627-5ffc415d0cd8bf1d86db7993cf8d36e1.npy +02958343-6edcd628ecd0142b4f2f12fbdc4e6f1.npy +04379243-68ae56275d366ed6cea003eff0268278.npy +02691156-8e47730a471abb7f43afdb9c81ff2967.npy +02691156-37d2da0de056f5045bb2b764fed1d166.npy +02933112-cb70b087e5bc5e9522e46d8e163c0f81.npy +04256520-921a1610397b62a7db03e4f5c01cf109.npy +03761084-c35fb15786c7622cdf3a1b0d597ce76e.npy +03325088-2712bb3da10799b150da8b99982a3057.npy +04379243-a334f2d3eeebaccab40f0ac0fb9a650d.npy +02691156-29c81ffc84f2f7ba1adbb4c4e06ad649.npy +04379243-b04e9713af0d7048ce87696fce7b6aee.npy +02992529-cfdd44745ba101bc714ce1441b585593.npy +04256520-80ae351dff2476fd1fa9db366c777d84.npy +04530566-11e101e938688081d3b936925082270f.npy +02933112-bd0a87c4356e53d4630bc2b026b477b8.npy +02933112-1fe25f0be8d71d6ce2e1a0e8b25f573f.npy +04225987-484a49065ab1430624256fd51423318f.npy +03001627-c61e3ca5004f3e8667816b64852d28f.npy +03001627-271012d5de261d08101accd22c701b9.npy +03636649-26d761549dcc3c61a1b5ceeca96f6fbc.npy +04530566-7edda9af5147eeb25fc186cfb5f359d1.npy +04379243-b0ee655c0c84e70be03211c8d614b25a.npy +04379243-54a0067eb07dad5ad1a59a9e9888beb8.npy +04401088-7dc461c63f3aa4a3a2c7c5886f4bbc93.npy +02924116-3a3904d55b7a6c9bd8636d0a91468281.npy +04256520-e0f30a6af7bb75b8265d1076b4b6c5c.npy +04256520-48e31e3a3e2aa5c0cabc196a7f35f1aa.npy +03001627-6498a5053d12addb91a2a5174703986b.npy +03001627-5987ae6521cfcc53877929062720130b.npy +03325088-580ee100add1c4d854d7082b34825ef0.npy +02933112-71aaeb4dc7a7d41ef51f77a6d7299806.npy +04256520-f87682301c61288c25a12159dbc477b5.npy +04379243-96ede227209cde474042244fe2d8ace9.npy +02691156-76eaa5ea5f272c2f5986032c1ed37f74.npy +02992529-3bdd569911660da81229c79e4cce736a.npy +03928116-8775d936d5f3f38176145360ae4439bd.npy +02691156-70d9304de59792a9515d73fcb34092fc.npy +03001627-6714df9bb34178e4f51f77a6d7299806.npy +03928116-6a96d703d058790fa6491c91cd8d7770.npy +02828884-7ec901eb9f5204739a6c869309041adb.npy +03991062-efee3fed1b8bdda0d95c2d5388ec1aa8.npy +02871439-20e2da108eb42b52c16a7f7cb5642902.npy +04530566-954c459bc6762abc24f2ecb72410a6d9.npy +03624134-3d2cb9d291ec39dc58a42593b26221da.npy +03211117-44f363137d006f3cf7fe2bde3ab894f.npy +04379243-54317236f4b56413002761e7a3ba3bd.npy +03001627-b1add8182311f2a9f71e06115e9c3b3e.npy +03948459-bb71588fb21e67f67ed475464ab76870.npy +02958343-a990f6d75c669f4351a95aaa6caba1d3.npy +04379243-8141866ff4665b814038d588fd1342f.npy +03001627-ce935c8e977b8c58aa53a70b14c57bcb.npy +03325088-22f10b1903b8f285b362845c6edb57fc.npy +04256520-150da8f39b055ad0b827fae7748988f.npy +02691156-94d3a666d2dbc4385ff3feb917a6004b.npy +02691156-6b84749eaca0e657f37f38dedb2f1219.npy +04530566-8fb16643e061a3bd82b5804533e545b1.npy +04090263-30d2c5e8e703abe3f6503cf22f39c9c4.npy +02933112-61905b24b17eee756aea2f18ee404fd5.npy +03001627-b0f35e0dbfd5d75620fc2acf581b444e.npy +02933112-b45bae45ccfdd7b9824080f516909671.npy +03001627-9635dbdc4e34b7efffcd08faf4fccd0f.npy +03211117-462ba756d3337b475f16c469ffeb982e.npy +03046257-7504532221badbe449c9c494c2fb14ce.npy +02691156-f110a2ce31dee1b3c16ef5c633c71b56.npy +04090263-1939215162425a252bf06c32262648ff.npy +04090263-a95a7781d89f271a6ecdf20adf3e54ce.npy +04090263-e62ccd699b99b48a58dc97820d1d9537.npy +02880940-446583d7bf857dced5cb6d178687b980.npy +02828884-76976adc8a170036ae23680cee12f145.npy +04530566-8185d9e558f822c177cb090a86675a1a.npy +04379243-57a50a7bca63cd91e03b4418ed1a4f3.npy +04554684-ea961e30236b2b76a0ea52c7b90036b2.npy +04379243-2c9f91ed0b0584e196a3517f50eeb9f4.npy +04256520-39b0b5513ce0af42cb25d116843b43a4.npy +04379243-89478118c3618b353e615cf0ba033d62.npy +02958343-cdef1867e841d4bfafdee870abc9eca.npy +02691156-4dfe2199fdd333d09837a3d08a6a1966.npy +03001627-6ad86f428cd45b5b258d4ef9a9977ede.npy +04256520-6a6228e06f53e31b63c49003cfba744b.npy +04379243-8416d97c1e7b4ab323eb3ad3d378722a.npy +03691459-2af99551fe3644504798316286c07255.npy +03991062-7ce5fa012d569b576ea1c514a0de6d2d.npy +03636649-d190d56a1e6213e420ebca9c2a65e97d.npy +04090263-a5f7776b13c11e3194deaa9fff391d41.npy +03691459-4fef29cfa7ff1498442ed26ceeb35a60.npy +03046257-89b1770087ea083cc082c344e4f1192c.npy +03797390-e9499e4a9f632725d6e865157050a80e.npy +02933112-3084dcbd0a28399170ad2e9733c71638.npy +03337140-5bf29b17ff338ef4c3aee8e9d3a6ffa.npy +03790512-c90d74aa63043e5ad0f568c31c1cd62a.npy +02808440-ec906d77906e85d53af30a3946d92feb.npy +02992529-d41b332b9e6efddaa0eb5a85db887292.npy +02958343-a5464210795a915f9aa6f213afdff14d.npy +03001627-69a6407f21509325a04c9785f6d4e317.npy +04225987-380433d04091e04d3270ed754ff7ec06.npy +04379243-34121f5cc12135148c1cf3f7d7f0373.npy +02818832-f49119184f72bbb0b868f531409e0fc4.npy +04379243-992c967b4b1535f5f5346848b67e4cad.npy +03642806-bfd92b43d97b6d27f2b46e2da97eabda.npy +03001627-1e1b70bdfafb9d22df2fa7eaa812363c.npy +03001627-7786f1205337093d6051d49e4b21b83c.npy +03001627-9bbccaed652a88d0ad4feb1e0e9b77d9.npy +02992529-556b1ebe82977992c51777c7f8bdea09.npy +04090263-dda8e93517cb8c0ac9e18dbb8de06b45.npy +03325088-c20df659d0b79497f235ab3c41aeb5b6.npy +02933112-45342795c9bf86d94b8710a3469971b1.npy +04379243-59f04ddbd896f4f5430644dfe647c381.npy +04379243-476e60bceae151e768f8796d69d0c486.npy +04090263-2616ad4d3e8f3ab88af39b443dc477ce.npy +02828884-2d238b5250ab9eb3c55f85313e3bbc89.npy +04530566-c386c703e0f06a9b3a980283f1a7085f.npy +02691156-5958285db82a82cbc0909d98a1ff2b4.npy +04090263-47a5a10a047f2c2582950cbf0fcd4d4f.npy +04379243-a34afa94c100e8e2a45e8d2f28a9ea98.npy +02958343-bbca0e2391217de71e95a82bd2f5907a.npy +04379243-6f87ef47500b9d20768660cf080d12.npy +03001627-c7c7079b7555bf075e994da5ba753c34.npy +04225987-d4abd88611997d2cc4647061c0a60dc9.npy +02933112-181cfc93cd44af805a0e5699b3040a35.npy +04379243-6a4a9790706a558c2f84a7804aae667f.npy +03001627-58919c88a1b5b0b65cc7bfbb0ffaa52.npy +03691459-e031b24fd58c84c12633ff66beb9cf31.npy +03001627-a99be8e57aea8592a38859fd71bee28c.npy +03001627-c045514b5d4e4407b0ea0348afc5cb87.npy +04090263-efa6700a7609d9a59c4feb3f1af9fe7a.npy +02828884-2220c6ade811851cc13e020d985215e3.npy +02958343-d4e7286d53a7236374b5e1a654a4b1fc.npy +04256520-51142db12ba0b421997d55757516b24b.npy +04090263-9db0f94cbc2ada72847c4fc4f8c08820.npy +03593526-ee3b373aee74624ef228e31b813ebbce.npy +03001627-288143f68d5b9f7462acff507939719.npy +03636649-35e76406291b06dd66c1e3622e549d2f.npy +02691156-240fd3c1fd804ec1b8cf782e8c539948.npy +04401088-a2b921dea6df33765282621e4b0cea7.npy +03325088-3a30f6f46c4f1774e4e346ee2650d150.npy +04090263-57d7f154da3864e951dc50bfb39cd6f5.npy +03636649-ec639d4850ba9aa6fcb8d8c6d4df8143.npy +03691459-f982748287ef2c7ace029fab54b6cfbd.npy +04401088-4534e6754bcc38f78bc584bb94b0b13b.npy +03211117-79c623657fc683a54112e839a470cf05.npy +03001627-2a9cac5daa8e99cbd9b53420a5458c53.npy +02828884-d7d7a6bada0ba7705fceaa39a8353bde.npy +04379243-b99ad68ca697301a88386fe1512ed26f.npy +03948459-aa858f23b682f5616314c3b6a3a65519.npy +03636649-55f607d043cb587d5c10b08ea69398c3.npy +03325088-61df07c03d2b6836b362845c6edb57fc.npy +04090263-26516d0ce97296dd49352dd33f95cb9e.npy +03001627-ed72205562ef8407d7f7a4c4609b0913.npy +02871439-b8eb9918623a90fe14b86d5282eb8301.npy +03337140-3b8c6261122fbbeebe35466fcaf1ce30.npy +04256520-1ea101b73352ccd9822a33e080d0e71c.npy +03046257-9e059e591d0daaba3ad3591a780fa12b.npy +04379243-9611888ee0db1ecaf7d4d3ced798ad90.npy +03928116-204c770e23ba19adf42eaa666c73e416.npy +04256520-92447fe6aa69f89fd25437aef1f56568.npy +04379243-431340a089f0b3f5f320b5d9bf24e8e9.npy +03211117-9994c527e9c39bc5b50d0c6a0c254040.npy +03001627-5a643c0c638fc2c3ff3a3ae710d23d1e.npy +02691156-266ba93989037e6d48e8405d6c51a908.npy +03001627-d298e7f6e0e335a0e4197c3ebc03326f.npy +04401088-d56bca3888d3a595e93f5e23021ef900.npy +02691156-7af9fcb4a2c4079b873ec74c119307b9.npy +03325088-6ff015e04892ffee7adc0d0db36f4fc8.npy +02958343-65ea0311528b1e5f16abce8cb03e7794.npy +04256520-1aaee46102b4bab3998b2b87439f61bf.npy +03337140-92d05d86fa641a91820018801b237b3d.npy +03046257-7af418de6847137d2ea98d69e91ba870.npy +04379243-58f6e2538ba750008223f9660fdfaf1.npy +04530566-5fa144c3a8cb5234379339ae6512a12.npy +04004475-bd95856a16347f45242f8291aafac22.npy +03001627-b360f2264526521f1dee989d1177ef4e.npy +03636649-4604090264ab99ba6c1400a7733f9e62.npy +04256520-4f2fc9895ecc6a858032f428909bd170.npy +04530566-429dea3aadb0c3bdc753f4f2b4288d6.npy +03325088-9b827d4c19232237b7a867e9b35a1295.npy +03001627-47caca00f993bc4e4b3c42e318f3affc.npy +04530566-1a9bc7dd64da10f344ebbc705ad8c07.npy +04379243-cca18c7f8636606f51f77a6d7299806.npy +04256520-7a82cfb4878d1162986fdea3c9eacb1.npy +03207941-195c883e2d5e63c76621db2c3226f08.npy +02828884-57ded7ea16600342639efb65b33fee62.npy +04379243-ea093e60ddd1c7467afee304cce81d6f.npy +02958343-83fb99fe62dab5308b55a52bfd1cce7a.npy +04401088-d809653bf5a21f10e5b8860dcdb97aaa.npy +04256520-2e04a6dedc7cc5334b3c42e318f3affc.npy +04530566-5810aaf1a0818553b05dfc874f00d5f3.npy +02691156-f771c5a1b9bbac21f4fb6842b3610149.npy +02933112-c0d2f9960e0db8957ed335507280450f.npy +04379243-56ffb40d5f85f46f1a72c98fc69f22ac.npy +04256520-857c44dca7247e5757baa11b83badc8f.npy +04530566-30f5a0395aa8ce14d152039c9a3ad601.npy +03467517-d84d2877bd385d9c69da8e7f9a803d12.npy +04379243-9aff0e9f8722f063c0169cd3bf2650a0.npy +03001627-a59a49a0f9e8f4cda249f8489bc060dd.npy +03691459-c90cbb0458648665da49a3feeb6532eb.npy +02958343-bf8c14637ee36251ae3e053f6a533410.npy +03325088-f1be1113f7ac9625b362845c6edb57fc.npy +02828884-dbb5cc73da4780feed98cca8f0ccd5f7.npy +02691156-1a74b169a76e651ebc0909d98a1ff2b4.npy +04090263-ed1e56bac79b13df0e1c0df18936d05.npy +04090263-c6cd0f7ad931ca7c997b5c86bd7c8962.npy +02958343-3a7e096d05d688548413778731d6cd28.npy +04225987-a6d560508fb2fe2858dda0079c7c30f2.npy +03636649-417039be1c492fd4212785a561e3d296.npy +04379243-b4e22060a8aa48c9b1b2ecd73d1717a3.npy +04379243-42c231c89dcc0f115213cec267286d18.npy +02801938-52ef27eb43134d5150da8b99982a3057.npy +02942699-a9408583f2c4d6acad8a06dbee1d115.npy +03001627-d06c9ea39c0dade1d6b5d21cd4e3fbc.npy +03001627-3dc79f23cd284bd8ece416489129c313.npy +03593526-e9462bac4a8f334369df8a5173959bca.npy +04379243-c793946b036d1a9caa53a70b14c57bcb.npy +03001627-288837a47f55c0e9d8d964adc0b6502a.npy +02808440-fb269f5b1fec0b94d2285085273a3475.npy +03636649-713fa0e1076c99c1763bbfff01efee31.npy +03211117-1a98ee5b62f49c95f64616b54f9ba882.npy +03636649-43fce04e5e4e22bbba9ea396e14c59f2.npy +04530566-78c2790d999b0f9c1403af6fa4ab17f0.npy +03691459-b6ff46015b57bde9abacd1c615a34b0.npy +04379243-499be58242407271391e4d6c585a697a.npy +02992529-ca2e71c5e101797fa524f6bfc21eae12.npy +02871439-32da870ada4f6ef3aa2b654345545ea.npy +04379243-747f4ccdbbe2e4452099d3739c2967d6.npy +03001627-88ef1cc314d8dc0423500a5b036df62e.npy +03636649-b46eea8a6ed035279c92366a6d55d37.npy +03938244-359576c82de003cf96907985b34a7ba3.npy +04004475-9718d7c7af5d3a377eb1cef1676cbcb7.npy +03636649-544f2afb57934bbeffb8dd272bf2a810.npy +04256520-107bce22d72f322eedf1bb0b62653056.npy +04530566-cfa697be9ee40b5357018179649e2bb7.npy +02691156-ffd13ca14b85fec66cf1b4a8fc3914e.npy +04256520-e68758f3775f700df1783a44a88d6274.npy +03691459-8956eaafa0afdc142633ff66beb9cf31.npy +03046257-bdc3be534ccf65e09ce47e8a833eec11.npy +04401088-b7049148a4ffa22fdfe197f9f37aa72d.npy +04090263-94510c7e5c40166d1fabf3cbd0fc77bc.npy +03691459-faeb2f5501c8618ae47833b310955a9f.npy +03211117-6afc906811e9b40421d7ca6ede0e9373.npy +02828884-31375f94c8739fdbb043c7d18f748c2e.npy +04530566-cd4240b8246555df54102e7ecaeb1c5.npy +03691459-b544aafb047ec5014c40f34de8f3bdb8.npy +04256520-543eaf7f7a9885d57cbbb0dbdf037373.npy +04379243-e34d1be103e9d88145a1bc3ecd3d162f.npy +04090263-455a8f48d4b305bdc70a7659d08b7b72.npy +03046257-14556ed62cba8483365bd0790b72f2a1.npy +02828884-665eb42db0c44bdc81faebbdea6bd9be.npy +02992529-af3c1e4367942543264e721f309fb873.npy +02958343-dbe0b25edb8508babcf922304761e55e.npy +02958343-870086475e8af25bae57d337a2e5e53.npy +04256520-986f6fb4a7e513614e4975e87c20ce53.npy +04379243-2b564ff0989caf58ab610b0c94236463.npy +04379243-4282180ccf703ca59ccce4c6d5bb195f.npy +04379243-8cabaa720e1fe52723eb3ad3d378722a.npy +03207941-3f1e8fffc2e33a4b66e9ca8568fd3989.npy +04379243-b41f2b0ec15892e3153afb488ead2325.npy +02958343-4fc276424133528cf04f0bf74eec9639.npy +04256520-ff02fa8cfce2d39113dd6eafe1477be1.npy +02924116-9803debfea832718a3ae38981e422be7.npy +04090263-d35379324caf0e7380c2e60c312b0f09.npy +04090263-418f388062cce47ab2b92fdc09121c9.npy +03325088-71fa90c64528cd58b362845c6edb57fc.npy +03691459-3b1a3eee64e3412b6aa8ee471986facb.npy +04090263-64559ac87f100d517246c79258663695.npy +03046257-5b85d1cd4b278549a506c8b68491bf64.npy +03001627-239bb149aa17d0ddc1c43efc967e5428.npy +02871439-93ea6a4c9068dd65ba5b64592e406eca.npy +03211117-e7b9c172059d23a6f12f3a2695789ca4.npy +04090263-5d667fb09f0ad799c2e0257dfc41d300.npy +04090263-c8b20ee08253136b77b7d0d4764c121d.npy +03001627-6409f917fdae612f492d9da2668ec34c.npy +03001627-e6b80e51ceb5c2771a782a4379556c7.npy +04401088-e33124aa016bd1f19c1db271ad9472a7.npy +02933112-24c781a3aa6310a44da5feafe6f1c8fc.npy +03991062-433fedbf96f140fb25ebd1cd0b422e32.npy +02880940-6494761a8a0461777cba8364368aa1d.npy +03001627-716eba8ec4825ecb19fb4103277a6b93.npy +04379243-e3d7cdd0224a4fedd810b14a81e12eca.npy +04379243-bb201d4811ab271ecf5469d07a8db811.npy +04379243-17ceee4f264733871dfa540c3e10c55d.npy +02933112-493593c78a647030cbb5746221d658f3.npy +02958343-c72e9ce6c6f16bb83b8642d7bb5bef13.npy +04090263-29c57a599a25868f57c012eda7b00ebc.npy +02958343-db45ce3926c3ac69e8d8ad3bdef6aca2.npy +03001627-cd06d0034224a701fb7c76304cb719f8.npy +02933112-fe8c34a5275804d451f8aaa850306632.npy +03691459-b4d4338a36711ccdb113389b677f57ff.npy +03797390-5582a89be131867846ebf4f1147c3f0f.npy +02958343-9d400df8825de9a62514ed2901e978de.npy +02958343-707dd25fa8ebe7b73a6cc070f17a46d7.npy +04090263-e0824487f2bc4502e9acddb06da3928e.npy +04379243-8acbc1b934489d6fefe244bf6a6a9769.npy +03337140-373fa1f12ba203de4bf3cfb743192941.npy +04530566-3e408017d8b03ec5a5e52d43f595c657.npy +03001627-ce60636e30770f9d8193714e438a24d5.npy +02691156-2590dff7d8f19797bd46d022fd7d80aa.npy +02958343-8aeeed96e4597ca6853c6f214c15e60f.npy +04090263-d2b09323f863db7a71ed4e55cca1417d.npy +04379243-29b55c6cc05c37606e066e11deddab75.npy +03624134-c141abaec55e87e691687e259c21528d.npy +03636649-dba95c4ca95048982d9c07d3b9171829.npy +03211117-de66399eb8aaaad44913c6e8e05bb2fb.npy +03636649-5077728a780b5873f8d6a4359d6a181b.npy +04379243-71a782bd942c4b0147d5777b892afbf7.npy +04099429-b094ce5268143b1f28eba1f0b7744e9.npy +03636649-71c61e41a85671c91b82f1530fe53352.npy +02992529-aa833540c3f2d77e2915acf4d1de24fe.npy +04401088-3ef278f78ddb1db52a39b1d7ef8834b0.npy +03467517-a0b6f040538d26e3ac61a2f8346a8f.npy +03001627-43f222e3b4b0952c1a4cdca72ed38d39.npy +03691459-20b0ddd49c8cda71eef785963bb59c49.npy +02691156-eae54f8d47cf07c0aeec93871310e650.npy +02747177-e7de8a24dfc385d92715de3ea7b582d7.npy +02958343-189cffefcdd5cb071a126804ae24042.npy +04256520-dd7dc4e40e7d015c19fb4103277a6b93.npy +04530566-6436ddeaa11efffdcdd34f38f87d26cf.npy +04256520-8920c0e0737409e29f2349486c570dd4.npy +02828884-8a6f07f3d357fbfd2b12aa6a0f050b3.npy +04225987-39edba395f3d860c5a96bae7b017a6d9.npy +03001627-e4274fc2b9e4a5511882515d09f3979e.npy +02992529-70fe91a7bc072c39cf81faac56233ce6.npy +02992529-9028fceed53a144e10bc2436075f6a52.npy +04256520-94699d5b8a8682067ff6ace05b36a5.npy +03001627-e5a65fb8c660ef96dbbc9440457e303e.npy +04256520-bda4b8e6a69e1fc63f07ca1042ba5dfc.npy +03001627-55e6d1251fc63e1f71a782a4379556c7.npy +02691156-4bf2c942aafb4a2cbd46d022fd7d80aa.npy +03001627-85d0d147adcb6318b8e1b99345a5afd4.npy +02747177-b689aed9b7017c49f155d75bbf62b80.npy +03624134-444e269649312fa20005c20ac894a3b.npy +03001627-d045654d572bc46f19fb4103277a6b93.npy +04379243-9dfe5cbbb78cd26c9ccce4c6d5bb195f.npy +04530566-9b87bdd824e68950f4a06efdbafdd7ea.npy +04401088-b1537f1eabb7f5009f7477e2986c440f.npy +04379243-6bfb122ded9082de7ff6ace05b36a5.npy +02828884-bbf019371f76366b8fb2c146d92deb96.npy +04379243-1c431bd426e880e24719088c8e42c6ab.npy +03948459-d68f31ea513d3a5d6a816b111e5f1b47.npy +02691156-8682729ee0259ceaca8607f540cc62ba.npy +03467517-d0fee35bc3efa83367a66e84fcbfe789.npy +04090263-19035d7059eaa5b1a27aa199c0989017.npy +03991062-f1f7ec7a146470a272652f4081ec5a77.npy +03046257-a41444ea20bb2ea6e105ed0a3d82ba.npy +02958343-2d4ccc24a821360f8acb0ff76f4aec7d.npy +04379243-a15a936f2949d518a6fee8e2140acec9.npy +02933112-6352c69907b70c0480fa521a9c7198a.npy +04090263-3d8bab78941943f7cfe6670bda9305bc.npy +02691156-84b396dde837c81994445a3e8b9de59d.npy +02958343-c5bdc334a3df466e8e1630a4c009bdc0.npy +02933112-7aee2d4c1e70d27c921dd903dd0b8b17.npy +02801938-bcc429595319716b726dbbf7bc5e4df3.npy +04379243-f6e14672ef1ca30130aad3a2f98e3b63.npy +02880940-dd15ee7374954827c5be64abd4416cc9.npy +02828884-9c95f498f2726883bdc8e7e780fbaa21.npy +02924116-83cb38ac1fdc5f97a8aca93a0ba06ca2.npy +04379243-f9f122b492c3f1273084c5a9cbef5cd.npy +04379243-19c9beb4e4a5ea352c79b4f0fac9a79d.npy +04530566-ce5db5f4082b56b2eb2c303a0e0d287b.npy +04530566-1378b7d4dc05adba9069b3c9aa123329.npy +03001627-d6e5a8e9e0d5dfedb0957d845ac33749.npy +02747177-9f4bf5a25f85d12ead5067eac75a07f7.npy +04401088-f649a5368586aa77eecb4e0df212ad9.npy +02958343-8361aa7ae1f7dcb582ea71649733f2a6.npy +02924116-2f5f986070ea126996db382b382d7132.npy +02691156-c9063c31d7b42fa564ed556128c71bda.npy +03211117-854a48e0d902d97f9ba2cfdf95405270.npy +03001627-af7331f7b96ebed663b2acb037dfbcde.npy +03691459-168150439eb31ea1ab5fa92a7378b5c0.npy +04256520-6226851e0bf7fca877b7247857f4c82f.npy +02691156-84b07419645a3418bbf3143b1cb6076a.npy +02691156-b9e1ba3782922bab6ad6a28101cd3ecd.npy +02933112-5a639987ce024c8223dd83e725809894.npy +02828884-21e7b25522c63209cb2a965e75be701c.npy +02828884-60757e398b7d51c5c143e86eb74c3988.npy +03636649-a885ba00108cbb63e49675db0062ac74.npy +02808440-537205d65f040f701b9d8cf5b1327a12.npy +04256520-a995c3e90cc656e0c81bdfff91c7f69.npy +04379243-83120585ebf07ee93002761e7a3ba3bd.npy +03467517-fd277b425390a46ba059f9af4d1abb14.npy +02828884-272a4cf3cfff3eb1e173cee47fbaa88.npy +03001627-280d49c0833e2dcecbdbd70308cc5247.npy +04379243-f28a91c02b1f32c7126e8f891cf24099.npy +02933112-d599d283cc1d2615a7547743355554a7.npy +03325088-eea4dfd9dc2a08c3979c556124bee033.npy +02691156-b3fbc7a0b0e3a821fd279055f27928f7.npy +03691459-b4bc7d540893226c507038fac66e20d6.npy +02691156-4d6ec762d1583ded46555ee25941a22e.npy +04401088-15bc36a3ce59163bce8584f8b28da0ba.npy +03991062-6998db7278a59310beedb4c8fd29e2d1.npy +03046257-b43d328f4acf10464b3c42e318f3affc.npy +04379243-657aad273d665f5dd9823f45c4411583.npy +03211117-f7a5ed426a6195d97c8d48014e04ccd1.npy +03593526-e0bf4bf06f17f07a8f5635ac8b18fdb9.npy +04379243-6d1416c57e8a875b214a15a5a42c49c0.npy +04379243-37f8726074a5bbf42979546ca769ba4d.npy +02691156-654a5b26c59c12e5d2c4ce8118ff5045.npy +04379243-81808dc89c4461bd9a3d6682397a3947.npy +04379243-952da8ad85350267b9b072e1f62798f5.npy +03001627-a08870dc5fc0c8aca19799a9cde9e06f.npy +02933112-676bf8a039a5937eeab2bd7322386ffd.npy +03642806-b28638f8c153b9333639bdeac6c4cb9a.npy +02871439-8951258ea1dcbb6eb66213207f46bee7.npy +03991062-eb8d2e7e18906c7f25ebd1cd0b422e32.npy +04379243-83fa3b7b8c9d388144f6e9c2368992d3.npy +03001627-3799a4d787d31c0bc580fdeb5460f6d6.npy +04530566-88ba72c3f33343ae9e6f7dedb7e5f584.npy +02958343-2f1001870f90e06bc48492b454f1615a.npy +02933112-433082675f5505c3c59350d819542ec7.npy +04379243-e630732939f6188957f5e6dcbb0b7930.npy +04379243-93d6b4ad8a164927febad4f49b26ec52.npy +02808440-bc98f11895cecfeb3321831d2245cf06.npy +04530566-693272dde72519813cee85b510079413.npy +02958343-96ca20dd7caff0bb851f021b9ed69c58.npy +03001627-85ce56c719ed2a1df30b232143ef026b.npy +03636649-176c8eee2d45e5d0535a7b6b7a43b6cd.npy +04090263-989b655cb51914dde423072102e0bc5.npy +04379243-88dbdfd6e8cccf1ca9f547acc5e1dd79.npy +04379243-1f05e080ea6e8b64ffcd08faf4fccd0f.npy +02828884-3dec9b1439c42797815b2b467e8e2eac.npy +03928116-93a3f5462dbad13b678c55004ea7d7ee.npy +02880940-32f9c710e264388e2150a45ec52bcbd7.npy +03928116-eb4787175e2f4b2bb55155963a8c9e1c.npy +02691156-952c5b41a44f6f3166cf1b4a8fc3914e.npy +02828884-59c914e55665b02cf24b3c783ba45ac1.npy +03636649-4d61bb37c5edb2903f7bd0762436c545.npy +03636649-935a5b22007014838047317417e6f5d7.npy +03001627-d1af84d4d2af1181c442c1fbb1afe9c5.npy +03001627-eac5ffc4c4a7da80b13f3ad708be4bf6.npy +04379243-f6df49d754e3adfa29e4b5aa807bb4e7.npy +04256520-996265f3d98601ea3bec56bff764ba78.npy +03691459-560a626f93c664ff9069c2d361390698.npy +04379243-6f530fe373def431a6fd617b2ff5d2d.npy +02876657-ab5ca2f648a9daa1b5ad628041310f96.npy +02691156-b785b39d10c33b5de9f07d25f575b2d4.npy +03593526-9e03b1cd20644a638c37cfe791015e2f.npy +03001627-d1c2afb3c53dc7c8c563fcc2752ece39.npy +04256520-c8e37189356e5d1249655ac7c771b113.npy +04530566-2212bb44240a9f0b57cf4c4836e6df44.npy +03691459-f1fbb16afaac70231ad88f716ea80910.npy +03001627-2f6b0ddf12d1311795bea7c29e873d16.npy +02691156-f31be358cb57dffffe198fc7b510f52f.npy +02747177-b537facfbab18da781faebbdea6bd9be.npy +03001627-536dcddf1ca6cd76d7f81f50826c13f0.npy +02958343-2468ceab72b4be041d9cc9d194c8533.npy +03710193-be7157be54725e76cf105027cea05a42.npy +02933112-9e53d5b34c4b403841b765d3dbd065f7.npy +04004475-422e02def4efcfd7175eaa02afd87c2f.npy +02691156-a1d2c8b24476c8ee70d98a97e17b4da3.npy +02828884-3d92cb6fe0abdf9c4ab121f03cb11a77.npy +03790512-ff1fb5a9dd255b059036436a751dc6c2.npy +02933112-ac2f35da065a451c72ddb537ecda2719.npy +03001627-a10370a1cf036ef82d4725b469da72d.npy +02801938-a8943da1522d056650da8b99982a3057.npy +04379243-e9038664b7d35e6b436e6787c76ef3f0.npy +03642806-b210db4bca21536ed6daca3908cc94ab.npy +02958343-e885df5686133eeef43db49cede9f847.npy +02747177-30a637a211d5c2f66e181e3da8402358.npy +04090263-c740e2cadab236e56423adc2e6f1b28d.npy +02828884-427df0fbd51ba54560f140e76bfa752a.npy +04530566-94a0345790869eace074faa875b76f82.npy +02691156-7a57a9b261f60dcb2296d88107d065f6.npy +04530566-b1c2fda8665fa9b19a6e43b878d5b335.npy +04256520-5171a910435f4c949a502993c14408e4.npy +04379243-520fad3fdb9cba4f1f335cc23d448de8.npy +02876657-dc2c07ff617d1da0197a35146ee825cd.npy +02828884-f39401db6cc45a3ae3e15116d1de599a.npy +03001627-56cb679a49a3568998d5fc0473d00a1c.npy +02992529-67c6c3db87a1d72b7b8e0bea6a77fb50.npy +02958343-bd188c1db4c52a2ac35f22936e5aea5c.npy +03001627-cb6ddcf169bb7a0aa9bdc22a1e02e82.npy +02933112-760d765845cfb99b770ba9dfcb1fabed.npy +02992529-ba21b515df2f8a8f19db431d2a67219.npy +03636649-4aba50849f4d24d7581fd19c35a5c8c.npy +04530566-e16e0925ab21f2d3a45eddb1d745bdff.npy +04379243-7d3fc73ccd968863e40d907aaaf9adfd.npy +03991062-28d39c9673775f601a3b47d6d0918049.npy +02933112-1f610516a159e0ce8916d0991ded06e.npy +02691156-383d7574448bf7f235fc197bbabcd5bd.npy +04379243-8662bfcaec06798ac46037df6c915494.npy +02958343-523673c5b3c12ffcf2c89d2df097ef4.npy +02691156-9f5dda6f01bbe29bf810506e9ae2dcc2.npy +04379243-afa91ef326c0309768966ba896bb15dd.npy +02871439-ad4ca1e6d178dedfbdc5348d65406054.npy +02691156-cc630f80fc235ab360c9b6e4c75a092a.npy +03001627-de3e16703bf6581df050758b903e6054.npy +04401088-fabcaa4858df16e35817e30de1dabac4.npy +03001627-9c7b2ed3770d1a6ea6fee8e2140acec9.npy +03046257-9f47c0e99e0edbc8868fb986bc092533.npy +03636649-4c62e3c4f9e46d015da963e90d88cb74.npy +04530566-1d451877c6270d97fe755e3418b63110.npy +03046257-93b1f050ac34adaa7dfe817feb27b203.npy +03046257-8d59e5ca3852b37e4b3c42e318f3affc.npy +03001627-ae1650cc10002a69d65a961d7336a090.npy +03001627-9040047cab148e55e8f8c11a24c52ebb.npy +02691156-b4f41b2faeb528fbf37f38dedb2f1219.npy +04401088-6449223cebdb2dc9c8c3ac9bcbcd9687.npy +02876657-97179a870ed9f12da452d8ffbbc0126.npy +04090263-6454206429467056cfe6670bda9305bc.npy +04090263-78eef5df96ad0496e7c0ece95532142d.npy +03636649-21bca6a33809c7f26f2deb6dd348d3c7.npy +03636649-ff08713d837d87edf2098a9f7fc86999.npy +02876657-f35f3a1ce31850e8b9ca8a85614dd727.npy +04530566-48a037d4699261d3b274bf54d5e89093.npy +03001627-2f4fe1db48f0cac1db573653825dd010.npy +04379243-f856245a7a9485deeb2d738c3fe5867f.npy +03001627-720fd0a6c8cf65e772ee08e78374a212.npy +03001627-e488826128fe3854b300c4ca2f51c01b.npy +04379243-8709ac2f3822955de650492e45fb14f.npy +02954340-a1494210f6774b87b3e0e60b857dde8f.npy +04379243-cca695e66b222f6214038d588fd1342f.npy +03467517-a02ea7bcabae6de39b54ba41102517c4.npy +02691156-b2509e9f52a19466c1006ed55bc1a3fc.npy +04379243-1eab315da8b2588d285aa2b556211c86.npy +04256520-a49f6cfce3d854c7dbbc9440457e303e.npy +04379243-74f407ed9d20d799df0d738d0f301367.npy +03001627-675e25ef07ef717cc8bd7a04c9659f1.npy +03001627-9d7a3b2b7dad91fd611b2c263b5df599.npy +04256520-f125875fefd6a02af487e71bd57b6e0c.npy +04401088-9b91faa0835a0287db45a112fe2d5592.npy +03467517-148ac4fc49e8d965b48e9ff3519bfb40.npy +04554684-38ff66fecee0d18f4f782ac57aea97b.npy +03001627-6b94ccd432d37555fc1390934d948e09.npy +02747177-afe2cc6a31c13eff2b8e1e034cf1c1a9.npy +03001627-5ad4512976afc746564eaedaeaa04f28.npy +03001627-13b6648bdc843b767b5f4d129cc2873d.npy +03001627-b36ec4a65d474384629bdb3bad305eb4.npy +02933112-718f8fe82bc186a086d53ab0fe94e911.npy +03691459-4f53602d946e024af7617b7ba3f8e259.npy +03691459-95268fb7d50ddf77f398d0c5832df00e.npy +04256520-8d61836ca7137a07291d22c7a0bd7119.npy +02691156-73f6ccf1468de18d381fd507da445af6.npy +02691156-89a697d339c01c19452b96e716decae1.npy +02828884-31615e201e29cc11c7f46e918e672933.npy +03001627-fdd8b499294575175f1548797747d63.npy +03211117-55ee60e04ea3816e94accef64b26a3ff.npy +02958343-85f0d4c31c765f33ab91fe0bf146bca2.npy +03467517-c0dc0328e787d4795c0be177939e290.npy +04256520-4bdfbfa1871f2ca114038d588fd1342f.npy +04379243-bd10eeed8d8190ccb041f249f731e3da.npy +02691156-74334440119b4225951971f8370d9050.npy +03593526-e750ae0bc277c1d8afbf399e6f6c09e3.npy +02828884-6ee844357bbc5bddd4d8765e3910f617.npy +04379243-ac7280f9774cd16432bb5d496e1304f7.npy +03001627-8c90c2739c56c5f0327289c00b6dc9ca.npy +03636649-87254ebbd9e57bb84dd6c3274cd9823.npy +04530566-a99574a44a78208981f422b7e55b97ef.npy +03001627-bced50190a0b63cf19fb4103277a6b93.npy +02691156-3baa3ca477d17e1a61f1ef59130c405d.npy +04379243-b2da5c4c116c40a241b160b9adc112fd.npy +02808440-45dbfd115089e0665d107d8487108589.npy +03691459-4b29063d6237b062eabe53d90550c4a6.npy +04379243-242055fadd675e626bf0788e630e3deb.npy +04256520-58d4563bd1114e6a76e9713f57a5fcb6.npy +04256520-656ebb911f3963a81a291b1dd4baf49.npy +04379243-f9d9ef770e04c5772b3242897b354191.npy +03790512-744ab910c5fa999fa036c9ce469c98ce.npy +03691459-84cabb92bca7c3fdf2198539cbd3b69c.npy +02992529-ed52bccead5926dfa9fe1734a6086750.npy +02828884-d0c8a593361ab77d5c3d5e3801c5ac29.npy +02828884-b6ed4377ece0567c78cf4e63fa47661.npy +03691459-eb2545337b85fb987695b38431695f3.npy +03325088-76824ba9aa51eca28ca4aeb5e3b33af7.npy +02808440-56e2c0a605db987e28baeef8b0265e92.npy +02992529-2c1cf34eb46756c1aa8ee930afa0ad31.npy +02691156-f894972de285088da0896c4491cb3db6.npy +02924116-8843d862a7545d0d96db382b382d7132.npy +02992529-610a9f79a2f2faacc43c9f60fcc79b4c.npy +03691459-71c5756cce7bdf8cd6317d54cfc1018f.npy +02958343-35155f8cacf6d72471fc7d1bbf34b979.npy +03593526-6db6c54e6967dfea3481efcd727db3ad.npy +03948459-1c5d487fd6ab7ee88be2a30dd556a09.npy +04256520-16632d002fc0eec9917b96045c9b6dea.npy +04530566-2b7ce6a0492cb7818c0e3fdb2a94c91d.npy +02946921-d3e24e7712e1e82dece466fd8a3f2b40.npy +02958343-37a049a9e32c17b2afe1d4530f4c6e24.npy +02958343-6782126a676ca77d7a04ba129c539b64.npy +03593526-32dc55c3e945384dbc5e533ab711fd24.npy +03797390-1305b9266d38eb4d9f818dd0aa1a251.npy +02876657-f1ae9b2eb551ba466dc523ea4bf73f1c.npy +04090263-57cd6329f163043a551f49d4582a8d17.npy +04379243-487bdb1274b8942ab8e1b99345a5afd4.npy +02958343-eea7f5d02088d49dfdb3c05088c091ae.npy +04256520-932be91adcd83bcf1336f52415aa0825.npy +04530566-3bf976118908886611b5f34c8a675124.npy +02933112-622dadb90004f49fb84959963148f2a2.npy +03001627-701300d51960efc8932a5c2746cd09a4.npy +02924116-6ecb28d595b0afdfd6bb28faf86cc36f.npy +04379243-ab7b56ba63f481af9cd431573238602d.npy +03691459-92658be9ec3307545f7109466a688ac.npy +03636649-d91cf049fa961ccb59f8e31ca87c470e.npy +04379243-e86e665af1e1cae8c2f0a1a44c64aad4.npy +03636649-ce3b5fdadd2b73216aea2f18ee404fd5.npy +04379243-5b5f613742a2d960aec74bea859ea8a3.npy +04256520-1faa4c299b93a3e5593ebeeedbff73b.npy +04256520-388aebe52bbe88757143b902ce4e435d.npy +04379243-817b41f37bc9f022812e3ecbeaae3980.npy +03211117-909bd886fceb080a6facfc0053fedfbe.npy +04256520-d97b919139287ace7842a9c47d0b96c6.npy +02828884-eb7cc5c0c5f8a289d2b12aa6a0f050b3.npy +02924116-43754b18fa7421c57b4161cc118e61c0.npy +02958343-3db034e1e5651f6e6a2345809e2bb169.npy +04379243-5fed2b96d705323b8bec49a2a30e37ed.npy +03691459-b2705ec086216be91a68031139d740d.npy +04554684-62e22f4d1846d8c1fdc6c1669e5c540.npy +04379243-d6410c33772aa719dcafa176d8811639.npy +04256520-6c4e0987896fc5df30c7f4adc2c33ad6.npy +03642806-6ab94ae2ac08a1ff100b1bd8b508fdbe.npy +02808440-569401dd38ba970a45bb0997ddc5cc23.npy +04090263-c80a831394e5fd78f0fea2ee98610322.npy +04530566-a2e82524f7920e12d3ded2945a65f23f.npy +03467517-80f912aac9b3be34e1f2a1daf140ac9f.npy +02691156-df6aae66a8c378ae9029a69fa5fc9ad.npy +03001627-cd939609247df917d9d3572bbd9cf789.npy +03636649-1a3127ade9d7eca4fde8830b9596d8b9.npy +02924116-e4a59aeca9c4b2cbd214cfa3887b8972.npy +02958343-15cc37ac9b3b756acfd826dd468a5497.npy +04379243-831c0e0316d51292df562efe672dd5.npy +04530566-30dcb4eb8ae2163792e235fb0f1931f3.npy +04379243-15985d08df01b47bf0bb193323cf7c6b.npy +03211117-63d4e03c4effa06d6845a0762dd07baf.npy +03001627-8d18fba375d0545edbbc9440457e303e.npy +02942699-a8961c59576972cb57682b709eb0ab19.npy +02924116-ab4c69b08f7fde0d24ac9431afe675b9.npy +04379243-56210576a4afb9cf88d13d4705fa91f.npy +03928116-b3b6d2d1a9ac4032403974271f1920d3.npy +02828884-7c1cf879c84904a4e82028a475156419.npy +03001627-cd9702520ad57689bbc7a6acbd8f058b.npy +03001627-a9422478728741108e21d20fbef78328.npy +02871439-644db4b15b8d63ee62e6dfe993b22a3c.npy +03593526-8da5db60ba2c5f9318694f1cc6fb1f8.npy +04379243-dd0377d3a40b57c360885f79b3a5579a.npy +02958343-616279642d73621812f039db97ce1ef.npy +04379243-5362db12d934a50719fb4103277a6b93.npy +04379243-d5978095ef90e63375dc74e2f2f50364.npy +03691459-a50af511d8cbc8df520f563b6d5bc71a.npy +03991062-31d6283d08bbee76c8a7d034483a2972.npy +02958343-6b896508bdd231887c3c6f82a395b347.npy +02933112-3eddbe968ac08030c59350d819542ec7.npy +04256520-8d98a04f7217d91ad85fd2587ec5bc19.npy +04379243-c621493100ff715f80d6227ff9b21190.npy +04554684-d0960395317be024543213f6b2e6b4ac.npy +03636649-703b4edd4d407a10f8ddacb75f806b29.npy +03001627-18052e6175456b9e7984fb9ec7e40829.npy +03636649-6e2ccf5c1b61a09b6e56ccb2c92c79c.npy +04090263-efb99da78fea81e3534b1adc2aa1709.npy +04379243-98079c9fb39bc736f287ec53a469521.npy +02958343-4024c9fccd9fce80bda733a39f84326d.npy +03046257-374814b7c9a221d6c5f11660af3a01a8.npy +02958343-4fd5c18c1536d65be129fc90649e41d3.npy +04090263-cd60840ecdb0138e4b787ba27f895fbc.npy +04530566-54b6788d413eb45bf6b4f9d652536b82.npy +02691156-ddfbeb997ef83cab884a857d19f7439f.npy +02933112-2a5535f9e24338c7107bd4405fb99a1b.npy +03001627-eee08ec7de613898567232766992241d.npy +02876657-7446fa250adf49c5e7ef9fff09638f8e.npy +04225987-4f409f31b182075511b6d7dda2bf041e.npy +02933112-36bd3f2daa4ed31a921dd903dd0b8b17.npy +04401088-34e36249166b8c6bc3f912172873d52f.npy +04379243-938c5e8ec8703d5f7ff6ace05b36a5.npy +04090263-b8137473d975e1a23111ffeb58c3d257.npy +04379243-c5fc106c1c426fd1db63c1c69fa4f81f.npy +03691459-1e82e94cf9f6bda8fe893ed5dfb6041d.npy +04379243-e7169243daef074dc82dc2efb3363de1.npy +04379243-b96a360ca5a86bcbc48d90eef8384210.npy +04379243-63b6ffe53e027e83aa49ce7283f547d9.npy +03325088-6a8665f6cac2eaf73321831d2245cf06.npy +02933112-1715965e2e1e33e1c59350d819542ec7.npy +02691156-b19771099e1d3cd4d86ebdaa02a63c4b.npy +04379243-9d7a8d4c013bdc8321cf7471b191cb89.npy +03001627-6a254cc3d81881c91a3b39b07e4b3d0f.npy +04256520-a3ec914d44cd2bd8498bd5a555c21b1c.npy +02828884-c0976144b3ec94381076bdfcbbc20a9d.npy +04379243-fefd88656d9d0d2d82e6c3a4e742651d.npy +03691459-63c4583afc2b82237f299e32f8ffced9.npy +03928116-417deddb98e00babb1c932b2548fb93a.npy +02958343-164c8597d8eae2f6f21c3b61f0b564c4.npy +03001627-33334eb57a9d7bbba19d006f28e25379.npy +03211117-e85041124d09cb07318461dc09ee739c.npy +04379243-f4f168b88686872f785f45147f3e474.npy +03001627-2b7335c083d04862ca9c7c1ff5a28926.npy +04379243-77f6685f2df21522bc31aa2bac13542b.npy +02691156-513c955bb46d739683651cbc8e49e4f.npy +03691459-da2fdf0220908ca42744bf8869518694.npy +03001627-2f7a68f4a75dabd41c8c7b57a94dbb2e.npy +03001627-55eeb952519ceb87c3bd24f986301745.npy +04379243-9768599990ec4b54575fb26548334725.npy +04379243-a44a0a014b0c1d60609fb05dbd8681bd.npy +03001627-6534f04a1c349a3c8c6540fe6bc16d6f.npy +02933112-86838c0e4486ee7a8369c37b40e82efa.npy +03001627-65122866840aaccce3d8061f5c8a6fca.npy +04379243-3822df9afd06c2d875a82b88fe6e733f.npy +02691156-8c344cf05ad1bcb7709f5d258bc9a906.npy +02946921-637006720b7886e0c7a50f701fe65efe.npy +04401088-3dac1f92b3e13977d19f91734fdc72ea.npy +04379243-fd5c4da3a081cf115ec69be1b6d2571.npy +04379243-62be982d61ccf61d92e675672199574.npy +02828884-e9a9c499e74c2989d4d8765e3910f617.npy +04379243-d5deca423faade89bb814dc1a3fcda86.npy +03467517-2295ad16efd16ef5fd5758ca36056ece.npy +03593526-c8d8974642d4e88e906c240b881af04f.npy +03001627-e6a8f28b36533f8239b3360f500ac52a.npy +04379243-8504c3823e5485f8951c1fffab4f5807.npy +04379243-88e9d1f8c3f988e62f21cf17406f1f25.npy +03001627-8754831d577cca437c23ad67f25bcfd0.npy +04530566-bf0084fbcc74d5632754043d4b10740c.npy +03001627-d8f3c4bf9266150a579147ba03140821.npy +03001627-8b3619396de4df10db8860d0872e9c55.npy +04379243-2b7fd6106236d935b516de42b9c9697a.npy +02828884-b5b52ba71f6c3c67ad5067eac75a07f7.npy +03001627-401e07ff01b1bfe64d85e9aeb23ad69a.npy +04379243-ed2d5ed8ad10f323593ebeeedbff73b.npy +03691459-115354ddf0cea683c9603934b9e8f5dc.npy +02691156-1ce5b9a79420e946bff7790df3158906.npy +02691156-b3d034788411421019ba010ddb4974fe.npy +03797390-414772162ef70ec29109ad7f9c200d62.npy +03624134-13bf5728b1f3b6cfadd1691b2083e9e7.npy +02828884-6b262d977ea93d23ba6cf6cbb9f4c2bb.npy +03593526-af4c5fab6584a6ead5cc6270d226b60d.npy +03636649-5115f9a3af3470ddfcb8d8c6d4df8143.npy +02958343-ca85286b0ff3b33b16abce8cb03e7794.npy +03001627-38e672f611588c0546863a778f871cc.npy +03642806-22367d72d95e021aa458f8df8b43cd95.npy +03691459-85bbc49aa67149c531baa3c9ee4148cd.npy +04379243-2fd962562b9f0370339797c21e8801b1.npy +04090263-65cc9c9436e0b2c8a50ef3fc203c6ba0.npy +02828884-a31ae6a0f58526af2056b4bd5d870b47.npy +04090263-6acc9c34a79f98d0ff790997f2048517.npy +03001627-3d697c411b8bf8a0df6cfab91d65bb91.npy +02818832-734d564442cc75472b0c00d36a59e875.npy +03691459-da706fc7141b22ece029fab54b6cfbd.npy +03046257-5586a1f6745126e25e0d2ab0e6ad9dae.npy +03928116-3e7cc9b8333865239ff9560d055ab12.npy +03001627-db812fdfacf4db8df51f77a6d7299806.npy +02880940-538db91266f2829bc0f7e0e05bae6131.npy +02828884-9c1a78d3846b8137d839166e2dcdb427.npy +04090263-bc82cf27b55cdf2ed735fa1ab17311ec.npy +04256520-5ec9b56623d25cf1e7d9f0fed41b005f.npy +04379243-d722d42dd739e2a35e0bc0e32d71e297.npy +03710193-e4300f07c82ba3e9d5cb6d178687b980.npy +04379243-d6b61af7935d36a6f0aeabfdcb4e1dd9.npy +04530566-9a6b9049576b97649bbc565383eee97c.npy +02933112-3761d6523fb9d7a73f7e27638e63d848.npy +02691156-1998ee1bf3806b05818b286e41cc1a3f.npy +04401088-177a44b5e36fe9856e10bfa9f3e32b96.npy +03691459-556eebe71c16acc9e17b9e33c097dbff.npy +04090263-8c0e6b3a8ff3e1e75427d4172e3eb61f.npy +04379243-b11f985f0b3aa23379368d1198f406e7.npy +02954340-89717260f663fe13a9d8b37b5c73935c.npy +03211117-6dab3e32b5cb52f1d67173c00f9e1676.npy +04379243-2afb64e4868b6dcb8775a2d8ffff3881.npy +02933112-401960cb8526894f4b8710a3469971b1.npy +04401088-63e84b82309bae535b6795b7faa3170f.npy +03636649-b3ee8dcfd2d814253e793fd9530521a8.npy +02924116-7143a7cb46facddbe550942ea36e5443.npy +03928116-ad905de0c46408bd6e4af8307559a06.npy +03001627-e6daa4f9485362aa37ecff2686b754f4.npy +04401088-b140bdd32b0287a64a21fc95f845c2fa.npy +04256520-d7220a39bcedbb89a14c5748cc240cc2.npy +04401088-521fa79c95f4d3e26d9f55fbf45cc0c.npy +03001627-f68b7c3a1ed7506bedd9ab1253e1a9c4.npy +03642806-5be7aff08cd8dc37253cd18ba2e1c61e.npy +03642806-1d1947a3104bdbf4752cca7e96f0bf86.npy +02871439-702b30de33018393e3c9c743e6bdf782.npy +02958343-4836466e85175a462c4cef95ae3d6c50.npy +02691156-1c798f3e8bcaaed6f34c3a85e57ba71c.npy +03001627-99c8513bc738a21d440d6814caa3115e.npy +03211117-1f6cf74de609bae7f5542066243014cb.npy +03001627-de2bb45b7e200d6916d102513d0383c0.npy +03046257-6e67cbc95bade487603bf63caa67eee0.npy +02924116-b9e51da09e8bac24fd9cfa6c7f5305bc.npy +03001627-4c86a55673764f05597976c675750537.npy +03001627-eeef39917dd113e053624ac0db0f7e5b.npy +04379243-57c935da692d6e4c27c29012942420f.npy +04256520-81afa90f6229e7b456cbf78e1e89022.npy +04401088-136ef91c95ca5c2d4b9a4e1a888c5f59.npy +04256520-9abd7abc15a5f7893eb520ff7cd241f0.npy +04379243-5ad5b050fdf84825ec7962e39e3d3af9.npy +02828884-f48b666e87f0c31f43cda5120584006e.npy +04379243-a42a58b3fae9ce5054f5039bed03ee12.npy +03046257-d8e27d8d60a9a0c091aca0a9b5efd2ce.npy +04530566-df73ce22935c8081b04c44c0f84a941e.npy +03001627-77d71ae4116844e02025d98fb9de28cb.npy +04256520-e3d3c8dfcb19d920cc3e9831f31c9164.npy +04090263-49a566dd82ea542af026df30a0cc38a9.npy +03636649-df908dc58159c82b1b3ffe2c05ec7aca.npy +02958343-6a758f23f6dbf27923978edad4629e6d.npy +04256520-a126dacc76977e063755f577b497208.npy +04256520-543e257122d8fcfacdea6af8dfcc2b18.npy +03642806-78f6f380548e0f7d3fd8284eaee3b0fd.npy +02818832-d61eeba48577fcd511891d07929500ae.npy +03636649-221e2caf85f9bc5a2f9aa70de681f2c4.npy +02828884-22c5aed5cfd1ef997666aea996e0bd15.npy +02828884-abcb5dc91337f47682db9fca4b68095.npy +03001627-681b792d7bc9fdf8305e886266e302e1.npy +02828884-683ddfb4cf9c8f2883f21c04f5e0acd2.npy +02828884-a2678cebeac0a8c9cb2a965e75be701c.npy +02691156-2a966a7e0b07a5239a6e43b878d5b335.npy +02747177-5f2cdda3d519b5a25e96e67cce8b41a9.npy +04530566-73e6d10ad309d831ddb86907b4b5f05d.npy +03001627-9e15b5ae461fe0318fcdb0fca07ec8af.npy +03046257-354a0b83e35282843aab6d48f7ec1b67.npy +04256520-f100212c5848f7d3898b4cd86bfa936c.npy +02958343-8aa1b368270797bdca92a4cdad802b45.npy +02958343-654bf6800566c8ed95b02c654da6c998.npy +02828884-b3b8b909ff02f03ead5067eac75a07f7.npy +04379243-eddd80bdb6f6c8b48bfc6c6704f4dffd.npy +04256520-852abac2613701ed7de67b59dfb031b.npy +02933112-5feaee9848b44d44824662341ce2b233.npy +04256520-e74d866f44f857e77b5d58e18a4bdcae.npy +03790512-a2ee365a26f7ec623228b702032404a6.npy +02691156-72985b83dd9c31955dcafa83e2819ac7.npy +04554684-91cec7275a9b3266a6eaed098287ffd3.npy +03001627-690f208bc221e05d6c891822a43c9279.npy +02691156-cdd4dc06cea48b5faae529ab4a75c4af.npy +04256520-c708f4b2649d5b2c3070413801574f.npy +03624134-3851471620390fd4f43b696124fb3bf.npy +04379243-c0de139953efa6ea2b151d8b52c53b90.npy +03001627-2d4efb02b4369af2473f10e6caaeca56.npy +02933112-aa249df1e594036f730fe631274bee9c.npy +04379243-db09ccbc677e2afc9f60147421585c0d.npy +04379243-a656b27fafb027dbaab26ebe15e9175a.npy +03046257-471eff2ad3d20a6f329dc8ba1de916ab.npy +02871439-e517dc5a967361c3a570c6c691c987a8.npy +02691156-4bd5f77521e76e6a2e690fa6dfd5d610.npy +04530566-25f20d56a125b4028d8e8d98cb30b332.npy +04379243-b48d333e39b8aa1c663191fd557d3a61.npy +03211117-7185d52bc9a5425e2f84cb7932f866fd.npy +02958343-3f18c23d7628966848368c1a2f71c5f3.npy +04379243-18635aca8099ec5a3eec26c23f5bc80b.npy +03001627-6d3081bce72521e088e9c1fdc7b9075c.npy +02946921-a087f6b5ea424ccc785f06f424b9d06.npy +02691156-fe0c4db38fb6399990b1d6deb98feec6.npy +02924116-88520c248bb0d53841cefd10ce5d6cc0.npy +02828884-f264c4d430891732d97248c4337f8439.npy +03991062-c16542905741bce9a2c59a4d90e63212.npy +04379243-17e773bf0007544ce76bc197b3a3ffc0.npy +03467517-93744e9777361d001082f2ea630bf69e.npy +04401088-f75cac5b112f14002c32dcd0becbedb7.npy +04379243-7fa4f9f5b204af31e95cd0dc8c2f0e83.npy +04256520-b69fd1046deab785b3a010e5a9dcf3a8.npy +04256520-59c32d74e6de63643d41bddf307a46a8.npy +04379243-f73cc62cf8ca9d954c7384dbb75cab0d.npy +02801938-6dc3773e131f8001e76bc197b3a3ffc0.npy +03624134-d3ba7967cea5550405f236096897d.npy +02958343-718c595ae03a78208b58723318e7adc2.npy +03636649-4c757abf44253f8360ad823977adaa23.npy +03636649-16ae2568c9e62681f8b8d4a282992be4.npy +03325088-51c0b5604dfebf537fededae3a8b5db1.npy +04401088-7f5b9c8fdb46cf7c562c8e1ac545ef78.npy +04090263-d3fa347a5df7d6207969ab08647690bc.npy +03001627-8538245c2d93c60864c85287e21825c4.npy +02924116-6bba759a037998851bc2b9eaeed055b5.npy +04090263-9b8eb0dfb6dee992572dba079470b351.npy +02828884-1da4abf560002490391b7a189305050.npy +03991062-57202d9819dc44c67d8ecc181daf1385.npy +04090263-173476ce3541392d735fa1ab17311ec.npy +03001627-6c25ec1178e9bab6e545858398955dd1.npy +03624134-be91489dcbb0ce3f1acb5c3b0f893db.npy +02958343-c5758de60af178a11922758510ef0672.npy +04090263-d0eac7ba7e964d72cc34b900bb2492e.npy +03636649-64fe64c30ac05282443f70ad172f4dd5.npy +03337140-ec6fefa43577c689670bb97cf787128f.npy +03636649-13badfc11837c16cc01e0156f398b4d2.npy +02876657-2d912be96504cb8cd5473a45f1da0225.npy +03046257-e5b583b0cf478984d781754d41e2576e.npy +03624134-2fc5036e98cbdf4953cea6a99b7d6232.npy +03636649-efedd8c990f9926c48d945252c13120a.npy +02933112-568a719ffacc4e12f648065fbcc749bc.npy +03636649-69429d8ffb5009a82060e7309fc3fc6.npy +02747177-1d3a7ed6ff0dfc9e63b2acb037dfbcde.npy +03948459-3a8478c9f2c1c043eb81825856d1297f.npy +03636649-923c324c530e9fc412060d1ff2024b3.npy +03948459-a7a340a901d63486260a770f90456bf7.npy +02958343-633dd9755319ce369dfd5136ef0f2af.npy +03001627-e32ee21232d2d5604747ada1cb39a749.npy +03636649-377df6e7a3d84edfa123ce0dff5bf4e6.npy +04401088-eb58b011745519194fde46457697d80.npy +03001627-7905bbf9abc0c264f3443b22038d340.npy +02958343-6026684ab31d567328044fe9244db50a.npy +02958343-b40436b4639e80b8d61b6a34f3fd808c.npy +03001627-ac03fd26e5c499eafbe6ed8d24e16d28.npy +03948459-ed29dd43ad28f042d1987c07c912c6e1.npy +04379243-9d1f337286e7a4d39aabd1d2b22d025.npy +04379243-2e2894138df855b26f88aa1b7f7cc6c6.npy +04090263-8b5cb45c763602a73a70335e147b440b.npy +02958343-453164c9199ebec7e80b7eb39c475065.npy +03001627-4fa8eaacaaad472819fb4103277a6b93.npy +02933112-2d13507d53d201cfc59350d819542ec7.npy +03467517-648a820e550bdfd093f0194265a9746c.npy +04379243-5d59c0f64642450911794406b17d66b.npy +03001627-606bd97f7337bf39b40f0ac0fb9a650d.npy +04379243-7b356bbece2dd658278d386bfa54545.npy +02958343-4a536a6a685e08ea678026e3eac5bb0a.npy +03790512-9f9de88a95b56660b37378f3c85478b4.npy +04379243-1cf7bee4c0dad464c3bd24f986301745.npy +03001627-b10798977605fd017a4de8972b988aa.npy +02828884-ff8f8d280de66226d2b12aa6a0f050b3.npy +03691459-b4cd1e4296c3e9b55ed2ad7d2e018058.npy +02924116-4233caa4bda5d30f481aa8b5531c68a9.npy +04379243-8cb6a2e9ba365c94593ebeeedbff73b.npy +03001627-797b37d3462592b9c8687ff9b0b4e4ac.npy +03001627-5a5b11daa1b5344fb516c05d046e8e45.npy +03001627-2433f576edbb538aae8c9d3b8c4b9bc3.npy +02958343-b09376c77d8fe18eeaa60d48e24f18e0.npy +03001627-3925bf96c05c49d362e682c9809bff14.npy +04379243-50b6c4c7681aa3fcbaf2e78ed413860a.npy +03001627-3c8362c1e57c30d7e6c5cd45aa112726.npy +04401088-d72b00ba0cbe10a1157f4a560c24391b.npy +03636649-ee9cb649ef64105b62095c48c7bd5960.npy +04379243-aee3dc454d9b5af0dccf03d91dc58d38.npy +02828884-e01f988796268414ad5067eac75a07f7.npy +03001627-66c9a5aa7b4e528a290d57214c8512a4.npy +03467517-5b7fcd85ce6fd1931377689fa4e4b2d6.npy +04379243-725f69c0f29b712e8c6540fe6bc16d6f.npy +04256520-fd124209f0bc1222f34e56d1d9ad8c65.npy +03001627-fa89a0401873e5a6bbc7a6acbd8f058b.npy +04256520-a513bc9521717f2593ebeeedbff73b.npy +03642806-5508b5ce2820e4c36efcef06c0770d26.npy +04379243-af53fe05e692a7ea2e09703471e30fff.npy +04379243-87ca3e8e37367054dcabaa2ad147fa73.npy +04379243-400393a56fc243c442c39a4fb8d01418.npy +03001627-43c99f65e19e5c657746f1e767f87dbb.npy +03691459-c58d1c25553a224ad9d271f9da38313c.npy +04256520-7d532887fcd3aef82ddd352288e7672d.npy +02691156-9e57a7d6a7f488dfbd46d022fd7d80aa.npy +02828884-1d9270d0708fb8a1262707c3863d044.npy +03948459-52a1ca1d9bd900ba3ffeeaac0d1e84d4.npy +04090263-5a86afb38048ecc6b2c8bb96250e4a0.npy +03691459-72da46839789175eb6ba1e8b5cf30e.npy +02691156-a5639c976e677ce6e719b5362fe06bbb.npy +02933112-54cbe81983534dc153b10fab8d9d7b30.npy +04379243-2d96d4929d945740b1e23c7675c49239.npy +04379243-ddbcb5a22a0c3aab35de8f8daf95ff3e.npy +03001627-8f668f18d84a6960b27c368aa9b96968.npy +03001627-48f2c6ee2c8ea7538cb22acd3160c793.npy +02691156-c9ad8451915ebe6bbd46d022fd7d80aa.npy +04401088-7bf76e92b684d32671ab0d8014490a7d.npy +02747177-60b4017e16fd9c4f2056b4bd5d870b47.npy +03928116-35732cb2a41f413f645da737acb3ce13.npy +04401088-a9d358ce2d54d95e54c7ab6aa5674ccc.npy +03325088-efac508cef643820979c556124bee033.npy +03001627-55b00797abf243c3cce5160f0c502ac3.npy +03636649-53bac55dfe78177282889f551cb32a81.npy +02828884-27eb79ddf26fd7ac7898580cb9d16864.npy +03001627-893bc32a68f387b0b675b353faa5a26.npy +03211117-1df7bf502e4b0e8647dd811b692e315a.npy +02828884-8bb2354519a2ca276d9eb2ed02ef01ed.npy +02933112-19492e2263ea82e4da5feafe6f1c8fc.npy +04379243-1eece111c9bc0a126172e4028919692e.npy +04379243-31551fca6e4c5d8e80ab58c152cb7c44.npy +03636649-b6d6a772087d456a3dfad56d2a4eefcd.npy +04379243-b36ee7cbb41ad82c9b11da89c22111dd.npy +03001627-8cebf6dde257cfc591a2a5174703986b.npy +04379243-2c6dcfd1c08950554b3c42e318f3affc.npy +02691156-337e7f2c3745e07789d7e2c40a194e8.npy +02876657-d4a8a5243b976630e3eacec6011567b3.npy +03085013-6cbd981e310a0f09a8107a4c74d58321.npy +03790512-40d84e407c46e8d8b31e74d456742c7.npy +04379243-b117aac2e13630bb5d23c9bbb429abf9.npy +03001627-cbf18927a23084bd4a62dd9e5e4067d1.npy +02691156-95e589163afd0a7a609e2d916fa0da27.npy +03001627-bcc73b8ff332b4df3d25ee35360a1f4d.npy +03001627-cace287f0d784f1be6fe3612af521500.npy +04379243-58595b39bcad6b2fad5067eac75a07f7.npy +03001627-ee5ee3f6759aabacf2f43e6f841bd32b.npy +02933112-3b5d7b7fb89b178d50711e66b0db6ed.npy +02933112-b235be00006f3c03e6513d84422cefc4.npy +03001627-fb22d2e3174ed0519fb4103277a6b93.npy +04379243-6c413dd8728bc004d22730b0728b2fc9.npy +02691156-945b33ed9d6844591596c26b5af806fe.npy +04379243-26d174935d283cfd4ea7ef03cbe21992.npy +04379243-130d574de3f9d7e4c3bd24f986301745.npy +03001627-ae02a5d77184ae2638449598167b268b.npy +02958343-34211d29d94cbd52b7c4f0665aafbacd.npy +02933112-95bda55d633ca1824da5feafe6f1c8fc.npy +02691156-dfed744828fceb4d28cd0e56fe42c08.npy +03636649-2a39d5ec8856dba0fcb8d8c6d4df8143.npy +03691459-5bd42cdbb91db055f7e08add4085d009.npy +02691156-194098fb0aefc4a0666bd6da67d3abc2.npy +04379243-7f1edef2e2fe5aee33ed950c745c5ef8.npy +02946921-19fa6044dd31aa8e9487fa707cec1558.npy +04401088-a2dedd1d1369d4ae25bdb70a4d3731d4.npy +02691156-4e66465abe540ee326ccedfb0470de8f.npy +02946921-ac66fb0ff0d50368ced499bff9a86355.npy +03001627-63687e533c0b16b6868fb986bc092533.npy +04401088-7c134eee62290ae7fd130953acb6f543.npy +03001627-1b5e876f3559c231532a8e162f399205.npy +02958343-edbace6013d1c12ae9e1016860f17753.npy +02691156-4cb164f1fce7849762b600da24e0965.npy +04379243-40ff8ae39ad13d014a873bbe35452b88.npy +02691156-46c259e87609c54fafc0cc47720c0ef4.npy +03691459-40efb91680a2a39476ec75ad1a6d21e9.npy +03928116-45166dc50bbf0315ed1c1c47436c7974.npy +04090263-fb38cf43741e1189396ce275998d65f5.npy +04379243-b94ea1b7a715f5052b151d8b52c53b90.npy +03001627-b78fb2778adeba267c26dd76207404f5.npy +03001627-8cbf3d97df981d511fc6bd4aed49cc41.npy +03691459-c8018ed73c5f4087eb927391bdd6c8e8.npy +03046257-636e572331f872e3e7c7920f6a65a54d.npy +04379243-cd6f5c39cdf1b57a93bf4c26a8803fd4.npy +03046257-dcfc273d2a1fd128890f8f44c05e7d8b.npy +02958343-dfa6e60e478d5053705278f93079331.npy +04090263-b266dfc3d3d3606dd281b302c458427.npy +04379243-85a20e4f7fc9256eba9cbc5d66bac4b8.npy +04379243-b3cf5b09372826af658d908a2254f194.npy +03046257-a157e9b6449d763bab2f5d1a742ca172.npy +03001627-b8e4dfe08a43badabaed5cf8a752d243.npy +03325088-1f833904413559adc837473125b7231e.npy +04379243-da3e68c20b832c47a3b06ba374e12b77.npy +03948459-c693ffa50f62a2825fca1d021553f9e4.npy +03624134-d6e9e4e07bafca0fa37f3fc191551700.npy +02828884-c273ce2890d74ae18cca710901c2e97b.npy +04379243-9c44b336e78684647523c0c037b61ec6.npy +02691156-a828cbaf4b3bd253e163b5a191403a0f.npy +02828884-9fc5473602fe0f595896bab37ddebe7.npy +02828884-c2b940127ae286832d07d128adae16ff.npy +03001627-671a43756d51eb613d4c64859ad102f7.npy +04256520-a3970706133f033861b5428f30b376d.npy +04379243-5d63f11757a433b914038d588fd1342f.npy +02691156-66493aa4ae7dbe40b6b87e72ead132ed.npy +02958343-324434f8eea2839bf63ee8a34069b7c5.npy +04256520-c43bb99091f5a02cfd60059ad8523f1a.npy +02691156-30acfedb688a62e72ce638efd383ace8.npy +03001627-bbef7baa438869dd52bee19dc0453f5e.npy +03790512-329e47988e39df1b8c1912cd8631ab82.npy +02933112-275b26f0555e85acf858430284b28022.npy +02958343-7fd2f1d8342aa0acf3aaed7e86215c7b.npy +04090263-73e0ab2e1d0ea752bc6e84bc30e573cd.npy +02828884-616833ef9cfdacba583f5c4be082f8f6.npy +04379243-3e0ae5d25ad60ea285d624cfcd9a37a7.npy +04379243-10c0eecb17d1bac64b3c42e318f3affc.npy +03211117-99ab7f145618ec841a1272c8e47f5670.npy +02691156-4b0f44a76ef66ec9491bc6c980bcf9e4.npy +02691156-8f4416cb67c3807bcf155ddc002a8f77.npy +02958343-eb1d1ac801d6bafbf949c235bf4afe6e.npy +04379243-b11e0feb428f61edf008d8a3590fb522.npy +04379243-83dcf79646ad3f0cf4b6538438a0b930.npy +02924116-a23ee9c160122941193d7855ecfc1bd3.npy +04090263-2bab6ea5f35db3a4aca4b8a57632be04.npy +03001627-2e079c4e7bb26dce9d1cedd9b694fb2.npy +04379243-e52f7c8abd860fb923fe3501bb9e7193.npy +03001627-20ae4b27e86521a32efc7fb40a53aaac.npy +04379243-44295d4ec0d1e1ae4eb7315d59c5142c.npy +02828884-ee50d76492226837926fe0a4cdbf03.npy +04090263-3919b70a16c630f9d735fa1ab17311ec.npy +03001627-4c9b6e0823be25ae52bee19dc0453f5e.npy +03001627-4c6c3346b5d0f071f4b6538438a0b930.npy +04074963-58156300ed442f981047874d2f3335a.npy +03001627-5aa2a53207ff556d473f10e6caaeca56.npy +03636649-292f1f97a543d735dedf3c967c85981a.npy +02958343-487ccd6e9af920e7a7fd25564c2e888e.npy +04379243-11103f4da22fe6604b3c42e318f3affc.npy +03642806-8a4c725dc347e1106ec6e4721582ad38.npy +03001627-b68180bfde45f5a7e450a02d8032dbb0.npy +04379243-8502520f19688aaee12186cc8c5022c7.npy +04401088-2d5f1105a92045c8af0fa49592cf7bc7.npy +04379243-89552ce12717e70d40ef1c8b63a628f9.npy +02924116-a4ea8e5a6c096784b129901f80d24b7b.npy +03001627-6e46e4cce527abc114d449899f34bd9d.npy +04401088-638695025ca04d351d57a73214dd2a04.npy +04379243-72e0f3f2f8f8fcf12f788f981151c5d5.npy +03691459-83f72a05685b80bdc7c51d4ea74651a7.npy +04379243-dbb5de72508efbbbcad4c3cef7575bef.npy +04256520-4c1ac8bd57beb2a9ce59ea70152320fa.npy +04256520-ed6704f132eebc3ef13ce777d031b4b2.npy +04379243-437d7550e95cdf39c0ca344f487323e.npy +04256520-47da08d9c7cd7e104b3c42e318f3affc.npy +02946921-d801d5b05f7d872341d8650f1ad40eb1.npy +02958343-61251733434b9b0c15a23f2b45e10de5.npy +03001627-72da26fc9b49ecd3c3bd24f986301745.npy +03001627-b98b73f29673d7fb6da16f7df2c9a5b0.npy +03001627-914c92a6b9d8e7956160139444912022.npy +03928116-6c084236171a186dcf9cbd6252de4730.npy +04379243-d45385e0a60f71e1427fcd6e404d0cf5.npy +04256520-d5931526b56b157cab610b0c94236463.npy +03636649-efc262f7c8bc9fe66b1291e0cfc0c93d.npy +02958343-b47070a91102db1abe40bb45ea25a041.npy +04256520-8b3b675ddd2305b98eca6e74f79ccd04.npy +02691156-a2712db5540766cdf6a602e459585636.npy +02747177-6f77d79dd74a31fa56f6fc4b4ce1db04.npy +03001627-cd9e22cfd389e5d9d330ae3d046a415c.npy +03001627-5ef4db0419932fe12e5ebb32d8476df8.npy +04379243-f563e9cd92a0dbe5a07b1c1d0ca9cf45.npy +03691459-22e37482f8499fa53a081cb8ab2c8e61.npy +03001627-6d5c6eee9e25b314b3c42e318f3affc.npy +04379243-9ebaa0f7c3a7229be1fb37eefa671b59.npy +03001627-4a5332f5aaa3144836b0f2a1430e993a.npy +03046257-ac4a052a9d8f0985276206fae5d3c473.npy +02933112-2d7bad601f84c83686d53ab0fe94e911.npy +03211117-9b1362da6b7eef2b290d7f93e1252a27.npy +03691459-b5a2b8202014ae157a3d98bc650d077e.npy +04379243-c8cf1c77bbb79d214719088c8e42c6ab.npy +04256520-6b25476464cb4934e039576a17a0737d.npy +02691156-e037cb87e6cdcd76df39601c41fbe0ba.npy +03001627-8590bac753fbcccb203a669367e5b2a.npy +02691156-2026699e25ba56c5fd6b49391fda17.npy +03337140-89595cf7ef0acc6d57f3bb43ed044708.npy +02958343-e00fde4225d166b1ce929ad7e848003e.npy +03797390-d46b98f63a017578ea456f4bbbc96af9.npy +04379243-dbe17b86d79a24f1ae96150e4aa362f9.npy +04090263-8c7f0954c7bde4edc8a5aac636aa172.npy +04090263-5a420b1aff4cbaddeeda694c82280de.npy +02958343-a750b467d629df3e2268f50ab9844c64.npy +03691459-460d5cc9d09ec59eb34ed614d2670aca.npy +03001627-8363376d07da8aebb76e29c9c43bc7aa.npy +02924116-728bbdd6880278e51894d116f1c652.npy +04379243-221812e480905c5464810cc21086da42.npy +03001627-858e98a193f0d82f1a5838237ecfb290.npy +03001627-28fad854838ac444e9920dbaf13176cb.npy +02958343-f655d1adac9c96d53b05c2ad25b4380f.npy +02801938-d5ec4fb3e3a5ff31dd84b16d3edceb0b.npy +02958343-202648a87dd6ad2573e10a7135e947fe.npy +03001627-590d04438aeffbb58f447453fccbd9d3.npy +04090263-608d83aab75edf3c48a76f6e8e0499a6.npy +03001627-bc184c3cbe3349b19fb4103277a6b93.npy +02924116-2060f00f9a4f3d7437277701a400254a.npy +03691459-d97a4771b9d796a22d1a40e420084a6.npy +02691156-572d374ddb49e77a828204947d78b9af.npy +04090263-1c2fb199540516e2b30eb7cfb209da0e.npy +02828884-3b2ef85bafb7669d35382c4d59d1fdb6.npy +03636649-58483a0c6c6dc7056b1291e0cfc0c93d.npy +04379243-51a2b4db530f383339797c21e8801b1.npy +03001627-30f4c4d94f4fcffaf51f77a6d7299806.npy +04379243-ecdcc12d56c119c5a67f11eba80d4fdd.npy +04379243-b9089b8cf70c95e1f4b6538438a0b930.npy +03001627-554f63beeeaa1ca81acd2074f8939f43.npy +03948459-57b571c990cea8a8e1f2a1daf140ac9f.npy +02691156-2c9331f57865a9d2bd34bbc5253f83f8.npy +02828884-7a9a3abadf052b3bbc2f63672224bac8.npy +03001627-8b45782142fe42b02314deb821327685.npy +03001627-364a43c9f94f315496db593b49da23e5.npy +03001627-a5a2d09e5384237869513d0907f19c8f.npy +04256520-fa563ce2209de1961f98c0761af40e04.npy +03001627-b6e744f896a202c119fb4103277a6b93.npy +03636649-6a6fac314f0f295047a478fc5fc970de.npy +02691156-4f8952ff04d33784f64801ad2940cdd5.npy +04379243-2823fa4b1076324dbe0367f0d905ee09.npy +03948459-2625d5e4ee0a349844608b3255ca1886.npy +02691156-d8719b491412ea0bb1cb87d703a74b6f.npy +03991062-2ac7173684edbb4a6d33c50a0ba3f8df.npy +03001627-d9dc32f36e03d9f5ea65a95e759e03d9.npy +02691156-c2f3e3a227aee9ecca8607f540cc62ba.npy +02828884-afaaadcde1146dc2ad5067eac75a07f7.npy +04379243-4380ce2f9c06f92744175b4dddf5be08.npy +03691459-be5e0dbd5a8a589ca04f967bd94443cb.npy +02828884-646caeea9d317c9581faebbdea6bd9be.npy +02828884-abc01ead2541d73f97485073216729ca.npy +04379243-e39bfe8848fbf76540a98a90bd0efcca.npy +04256520-c67a9bc21455b0d9c018b720578a03bd.npy +04256520-ff99fb65f116dc1b24e1cdbdc9a22905.npy +03001627-d8edf163d5f87b055369e32fb818f337.npy +03001627-24fdf6e5090bc3442370db05a58bf9c6.npy +02958343-40e7559b88089f4ba7fd25564c2e888e.npy +03001627-dae6ba7440a71e5152470de2774d6099.npy +03991062-4a53c4af240c562537048583edf8ef2c.npy +02691156-7196ea15821ad2fdd8ff6111270336a9.npy +03211117-6a5ff378aeb44691a3fc5ccb0f902d07.npy +04256520-e7eb561c782fd92163d467b618e97922.npy +03001627-8f248770aa0b4d41e6fe3612af521500.npy +02691156-e3aff5ae3e8f2a7c4c2c88971423d0be.npy +04379243-69adc52c58477affe074517a246f1e65.npy +04090263-ffe08785458e09666314c3b6a3a65519.npy +03001627-8af802214afcb014bd15bdbf03199e85.npy +02691156-b58058567bfe6976b30e3fbc7205ab54.npy +02691156-c2352a98200942e5b39b85af85a55aef.npy +04090263-8d5354101880490994deaa9fff391d41.npy +03001627-7af12c69626b5c1814038d588fd1342f.npy +03691459-93c5159d17de18f02899849b3f61c3c5.npy +04256520-2b49c5bb1f8f8e50febad4f49b26ec52.npy +04379243-96c2ac95683fa21d80a13a8344996270.npy +04379243-70f90f5959de7752c0f947750540fb22.npy +03001627-5e44499940fc3dbe57a847db7547c1f3.npy +03991062-81591729f0bac11821fbc1a8044f930b.npy +04379243-54af9e8e80a0030c42c28aee4f9d8a89.npy +03001627-6f764c190cdf1629307776da88d1350f.npy +04256520-c805dab667ee341ca3ee83e6cad78356.npy +03001627-f294980dc63731dcd0ad32b8d8cec005.npy +03001627-74b3e4fa65510952e6fe3612af521500.npy +03948459-6119e9b1c0566e749f433921788191f3.npy +03001627-798fc5fd5faf3a0580067e3fdc6db24c.npy +02691156-ebb5a048015c13cd35fc197bbabcd5bd.npy +03001627-31dbef39a3c46b07bb8e07e9ebf0b9cb.npy +03211117-2ddb8a9c6a81f7c1be7e1d42d63ca9f0.npy +02876657-d8021dc9fc9109b130612f5c0ef21eb8.npy +03001627-37b6df64a97a5c29369151623ac3890b.npy +03636649-699a8b91af86f5a782db9fca4b68095.npy +02933112-1a9fa73ca819aa994da5feafe6f1c8fc.npy +04256520-9e18b198e803af3513f0322d0d7e53c7.npy +04256520-3415f252bd71495649920492438878e5.npy +04379243-739a2551d3826d5ad25ca1a27cf9bdec.npy +02876657-109d55a137c042f5760315ac3bf2c13e.npy +03991062-df754d2e9170be3581faebbdea6bd9be.npy +02691156-2ba980d080f89581ab2a0ebad7754fba.npy +04090263-a718521e2963077fc24d00518a3dd6ec.npy +03624134-ec1eb959cc203f1de5a365227cfe63ec.npy +02691156-4ce24828099fdb5e744ca709c13b7abe.npy +02773838-774fcae246e7ad25c8724d5673a063a6.npy +03001627-96419956c44757fe71a782a4379556c7.npy +03001627-53316b8bdd729c87a516ad65be981ae.npy +02691156-2ce02b8bb91ecd05c503a3776fc280fe.npy +03325088-64b7cc23f9fe4196b7a867e9b35a1295.npy +02691156-f4453381943f6039eba96cf317eae721.npy +02828884-7de0323af143c38bd4d8765e3910f617.npy +03046257-c527589d3b5780d11217e9f9630541c3.npy +02691156-795894b9a1105df34d210d9468aedaf2.npy +04379243-c017ca698294d3143d27d1af90f27023.npy +02958343-4856ef1e80d356d111f983eb293b51a.npy +02691156-67b7039f53759e92f4fb6842b3610149.npy +04379243-277e13392e16006557183d3afb0a522.npy +04090263-47db3b9c4b94ed61223d66e29bde9a55.npy +04379243-1a42167b30554eb8f5a6c82f073f291b.npy +02691156-caf80ecbad22a7384e1799d9d4d697c3.npy +03001627-6d6a92847f46d8e27b57eb4fc830f67b.npy +02958343-7f42d57ca7041f2df43d27ed950b5659.npy +04379243-32760b2e81bd4deac67fbc2559fd3fde.npy +02958343-b866d7e1b0336aff7c719d2d87c850d8.npy +04379243-4ccb70092f002d124212ff51b27f0221.npy +04090263-da6ec2d5f4d750303d7c323cf1653143.npy +04379243-720024ff80f13fd16fcd22503aabbe.npy +03211117-d0792c5556bdca56d1f6a4fe2f47b311.npy +03691459-c51823c76ebc7f6e464e6423c0222f3b.npy +02828884-3dd362593be47490ad5067eac75a07f7.npy +03001627-8affc6302970a589febad4f49b26ec52.npy +04379243-35f6b25bc7e016228cbb8bac2032149c.npy +03001627-591e310f3cea35a6d6134c153bee8ea0.npy +04379243-f3f6e3dc8c3b0eaf97b6421ec010dd0d.npy +04379243-bda99c11fd261f1ffc980c1b685e9930.npy +04256520-4faad33041ab0f80dd8479d78721b157.npy +04379243-171a3677999c79b32c8109e73b98d509.npy +02691156-a1f740e10229b43a82401bb74114a99.npy +02958343-9698778dc63d5874eee70745894f83bc.npy +04256520-356ee11c9803f1d2fa6df2d54fa43ce.npy +04379243-c4388c59f863de596edd3f7982f0bf26.npy +04379243-ce6e4aa17c710b3cd6d67789347621.npy +02691156-cb5fe2eaa25b2518afd477f714c68df9.npy +03001627-51439579ad42e9cdb52d092517b6bea6.npy +02691156-a271ac76b0e6bbbbb87697d3904b168b.npy +02958343-52f2a2472411fe2e6b418c7d9fedcaa9.npy +03211117-73c5898bf63748ff110eeb6ed2bcbbc.npy +03001627-307b8798217c08579e392c6acd0dd9b0.npy +03691459-79c3e029d9ffbccbe58eb6a4fe5a2344.npy +03046257-2124dd3d1d47f3873f6e4e0af3a53c1b.npy +03211117-1a4216ac5ffbf1e89c7ce4b816b39bd0.npy +04379243-f73fe719094a76ef62e5325f0ce7656f.npy +03046257-69d16120042e134f6cff9b44fdf0517e.npy +03211117-98a4d71b85b581fec92f2f0063445de9.npy +04379243-afbb16b9771a020d123691872d565e10.npy +04090263-347c9ad6b867bf885d0dded52efeb4fd.npy +02691156-45145c5e7924dca8e991cc67fb9c11f.npy +02946921-7e9ea6ccb5a1689a3299d37e620d2f2.npy +03691459-ca5fe10073293be01de55fee5ac2c5c2.npy +02691156-f9cd8293c30f1aaab87697d3904b168b.npy +04379243-132bfde1fabe9ab771a782a4379556c7.npy +02958343-35e4f3bca48aad294361eef216dfeaa6.npy +03046257-60fce7b1ddafa0c0435b6c388b558e5e.npy +04256520-33bd97e462ad2a851b17743c18fb63dc.npy +04256520-3946d23c7716c30d91857b3d2399f830.npy +03691459-375b903579b795abe3917427ea7a0e20.npy +04379243-91c2adae3b942b60d1f4836ba5ad2863.npy +04090263-cd157c59d1caa30b1d9b004d9d8d2781.npy +02958343-38ddc240001c3bd147a34c33abd32f7e.npy +02942699-a59cbd50ecf38a1be2dc67b821479cc4.npy +04090263-a5335cd2243b2d8312b38b1d99376c0b.npy +03046257-e80493545791aa9215bef14ca5ac3fd1.npy +04379243-5fcf8f8ae6c226b03002761e7a3ba3bd.npy +04379243-e2cc21f9d13d06e6a0ab1d82ef09f78f.npy +03001627-41396db6d7b550a411f7226d5cab1e9.npy +04379243-7c71421a06cee4eb85718c281d7fdf61.npy +02691156-e28e5714139535e7a9b2becd26dc2fc1.npy +04256520-f37c09d7ebf82cd642ac3369eef7a7b2.npy +04379243-5b5095b6d5612d298877c667ba5c2021.npy +02958343-d3f0b077f7134654e20af544ce47dd47.npy +03636649-80d86a40527fd0a7edd4171cd40b3feb.npy +04090263-7231363d3ec4da1c9a6e43b878d5b335.npy +02958343-6f7ba033fc5c0784468bac13e007a6e9.npy +03001627-8cc5a1e56c814d86c3cbab763f583b3.npy +04379243-c7f57e76cc1ac45d1ee2805756841071.npy +04379243-34b7b563f09f3e937848af3cb674ead1.npy +02691156-4ff50b9f815c58acca8607f540cc62ba.npy +02958343-8cbc8e27e885eb763ffe0e5069bf1eb5.npy +02958343-5a5b0e1cbb38bdb12d08a76380360b3b.npy +03001627-597cb92a5bfb580eed98cca8f0ccd5f7.npy +03325088-d9e07672c0ee46cc3321831d2245cf06.npy +03001627-41d9bd662687cf503ca22f17e86bab24.npy +04379243-7a488c92c601f83c821340ef6a9a830d.npy +02942699-82819e1201d2dc583a3e53900c6cbba.npy +03691459-52e827d2f969a2b61f2b6130e0fe93a6.npy +04379243-2437cb5665522ae3e329950ec40f6dd.npy +04379243-ba48c686c1070c63f37af16b2893f1d4.npy +03085013-b4795b53530c26c58b13932a0c28e98b.npy +03001627-9531ea3018e8bc70f81c330016997d42.npy +04256520-2fc5cf498b0fa6de1525e8c8552c3a9c.npy +02876657-dc0926ce09d6ce78eb8e919b102c6c08.npy +02773838-151d033af5381fd4c1e1e64c8ea306ea.npy +03211117-2d0b890161ac04b4a4d9f38918617d27.npy +04256520-6d25000aa000a97919fb4103277a6b93.npy +02747177-6a79fcbbe8eb1ec0162da3dc7be329d5.npy +04090263-dffd6f18fbc4f7ec4bd9916dfc5dd6c7.npy +04256520-da07e1f3d336532c2346f81928a3e5eb.npy +02801938-b37a77cec9643bae5257c4bca2a1f0.npy +02828884-943dde2754ddc7822e8ff3556a90169.npy +03948459-282153d65f0f1d3ff913329f55a53c5.npy +04379243-f7d4a0beda480047448174f83c9a5f1f.npy +04256520-a5d1e07789845c85a5aa2898f4de80a0.npy +03001627-5f7615668d2a7b313b8d5c0ebdd194c8.npy +03001627-8c4dd9891dc997b75a627be422951096.npy +03001627-ffa1e25f499e586694e98ee4fdfd7464.npy +03001627-917707ebea9dc26d7ee217c21e683487.npy +02828884-d9de3b770e53a41d5b7bc62e486d578c.npy +04256520-b56d901b6dd62332813204830fbed813.npy +04379243-691b01b959200d20e44c4b5687d5d5c8.npy +04256520-21bf3888008b7aced6d2e576c4ef3bde.npy +04379243-4c804ebc195b99d3f0b45b4b4c7e33b7.npy +03001627-1937193cf5079b623eec26c23f5bc80b.npy +02691156-f067fb1b12badf2b732bda87f2718525.npy +02691156-56c7e0b6f27cc498f3ad4b0977199f23.npy +04256520-fd7aa76019f0149b6626d14151ce40bf.npy +04379243-28f3a48bdca643e22b151d8b52c53b90.npy +04379243-8885e21ea12d6fc2b41f1e9ce6f64e36.npy +04256520-e62ed35d1643a56dc9f016d57db96408.npy +04379243-273f79cbdf5d793c6d5053bb66ea65ce.npy +03001627-294f11afc4b60827d3ddd69b7fa8d158.npy +03948459-70459a553f42c300f85b811e02bb4272.npy +04379243-4da850645da27913a82a6374374c9dbf.npy +02880940-1f910faf81555f8e664b3b9b23ddfcbc.npy +04379243-e0aec1747c4d7c11f24f0645d0949356.npy +03691459-481705a12fb7d10a20363e2561dd589a.npy +03636649-20118bc320eac59890c2e24416edfe5b.npy +02958343-9ec59185338edfde4cb9bf7caeb24dd3.npy +03928116-7bab2683b90d3f5a28f880349b6f36d.npy +03001627-e287403fb2f4234560b08e5f4e1f1a8f.npy +04379243-711d3e719d7655adb8183a4a81361b94.npy +04379243-a70f937b5c1a26e68962005ce0e986db.npy +02828884-f100d0524db0b12c2c031fa3f6d7bfc7.npy +03001627-40f1e0c4aa317c4d492d9da2668ec34c.npy +02958343-85abcf26aa761e9b21e570d3da54bf9d.npy +02691156-c9a6dcf87d1f15bca8607f540cc62ba.npy +04379243-9c21b194e13b84bff51f77a6d7299806.npy +02828884-2c8435941798069d35580c572d992e6.npy +04379243-a6cadf8f6d6e5d26f12d7184a2ad3430.npy +04256520-daf0e2193c5d1096540b442e651b7ad2.npy +04379243-a069fa41fb01fd06ac88fc1a919bbb85.npy +04379243-95e2a1ebabfa741cead99961c8c0ca99.npy +04256520-4c395a8a8fb634d5febad4f49b26ec52.npy +04256520-49a60133d6b05b8d19fb4103277a6b93.npy +02691156-e2116e0b34db656dfca1f1143bb6bc17.npy +03001627-f609378d4f5c755c9df2fbafa78e52d9.npy +02691156-1adb40469ec3636c3d64e724106730cf.npy +03636649-2e18c1bd23e4d89dbb6d3a4b6666d91.npy +04379243-f21154a95d49ca29e6c5cd45aa112726.npy +04379243-c0470c413b0a260979368d1198f406e7.npy +04090263-8e36f1a160e0b98c93cea328065cbce9.npy +04090263-7bd5d9982d9bde427b34e94db5d1bebb.npy +02876657-5f369e223697e7d11901008155be15ef.npy +04090263-3360456861b9f22020a8bc477aad122c.npy +04256520-9f5fd43df32187739f2349486c570dd4.npy +02828884-e9bf24b026df9624ef9a8aedf51bb497.npy +02880940-4cf18594e8851a3d3a5e6305a3a7adee.npy +03691459-fff40d102ca88fdb52648dc23b25b1d.npy +04379243-aff5771db62fa63d2406c215cad9df09.npy +04379243-a0f2dfdf0d8be7ae8a543abce4efe920.npy +03001627-9d9a0d778da758b043e03cfc9885bfb3.npy +02691156-c48af98d47f76002deed0e4a55ad5dd6.npy +03001627-28e147166eb68b2763ed57e35c972b4b.npy +02876657-9eccbc942fc8c0011ee059e8e1a2ee9.npy +02691156-a63e9d5df0c56b3f099bfb561edad43.npy +02958343-af0a12fa33b063ee38ceb1581969287d.npy +04256520-cc32fde4ca022cdf965e01bcaa1587c5.npy +04256520-b0a46e739da332985beab21ea89ae12d.npy +02818832-e354524c42b86792b4c1312ce8c8f69e.npy +02691156-ac3336c2f47b17d5acf77e718d93f3e1.npy +03001627-9f6a7ac15495575f6672e04a03e08d1.npy +04090263-6a7ee4fa2412e0c48c4d70537b8cc0a9.npy +04379243-b22bf7aa80627ee61ded04ad3995fc44.npy +03211117-3dd60d646dc8a3da988b29896df44cd8.npy +04379243-a75a5570ba1571447e1dc03b595bd36c.npy +03001627-86199aed92fa1f68fd60059ad8523f1a.npy +02691156-5b76fbabde77889c99399ee63318a21b.npy +03211117-fb1ca7e50ec3013b493a838ac2ced544.npy +03691459-afa628c3dd7558be89367e7bd925ea7c.npy +02828884-f713433b5702975aad5067eac75a07f7.npy +03001627-110ad013a9ae7a1ab0f4eaf0533e82bb.npy +03211117-9297e108b9780fe7da0ccb8671dd235b.npy +04379243-5d90d0c150935fe6a564497a1c91b4a.npy +02958343-8e39ba11949027ce14914b7641b2fd67.npy +03211117-4a21927379f965a9e4b68d3b17c43658.npy +02818832-b7a13b04910ac53415dd7d7985e749c1.npy +03001627-b058cc77e628ac01c433ba3e0e025e8c.npy +02691156-d99ddce71988c822475045ea78b20eb7.npy +03636649-b5012f398c4e62a330f6e0ede20c4525.npy +03001627-934ad9821e964219c3cf9ae716575390.npy +03790512-5bd41c7d3e158ac93ff4d2f5a7608a24.npy +03636649-732a2b4f7626ca61d197f67767b32741.npy +03636649-ea9721231b1369c93ffd072b23bde58.npy +04256520-e70e0e198e8de08dd23e51328875746a.npy +02691156-b17142a2f2fee3d4e2c19eec35e842ff.npy +03001627-c9817f6e253b7a93a5ac563ee2a0cd75.npy +03001627-bb8d64bab582c3f324e55bc028ee0805.npy +03211117-d96ab618ee698f008eaad608e74402f5.npy +03001627-33442081ed6e32c4504af6e1321617aa.npy +04379243-de96be0a27fe1610d40c07d3c15cc681.npy +04379243-ce7a0aaab23c9317a71c812e027f94d9.npy +02691156-204f4e737fa14aef33ba31f6ad43c835.npy +03325088-d7616893b24c10a2f6f4bab4c9f7b677.npy +03001627-b39ebd5957397e6a5dca6305fb9f97ca.npy +04090263-8145a8a2b974f4df8ae8d8f46e8d6c0.npy +04379243-7b023a0954a15f6b37b9035bdec8f884.npy +03001627-29827b7059783559febad4f49b26ec52.npy +03325088-e179aecff91323b8f538e468c975fa84.npy +02958343-28093822cc7fe487ed3696d854eee1ec.npy +02876657-be16ada66829940a451786f3cbfd6769.npy +03636649-236e0f8f6e74578ccbc9e602dbf6a4a.npy +02958343-924e1a54fad65f4de74f89cd7bde93ef.npy +03691459-5015233bfd8fee3f3e066187e0f408fb.npy +02828884-c70b020a21a7b2de67f2cdc0901bfcfe.npy +04379243-2c6d08c15a19891079dea5ba5d13aa5e.npy +02876657-35ad544a3a4b25b122de9a89c84a71b7.npy +04379243-bd7b7927d8e36c38c563fcc2752ece39.npy +04256520-e9821fb7af7db92b26f6c8b5b75f0ee9.npy +04379243-2199d0e64187366629d8eecf3827c486.npy +02691156-fc7387d630c84bb9c863ab010b80d9ed.npy +03001627-b2bfe0be6956fe34f51f77a6d7299806.npy +04090263-8f520b668fe5212e9f433921788191f3.npy +03797390-9880097f723c98a9bd8c6965c4665b41.npy +02691156-166c9abfb0f5256bbf46baa68c6e37d4.npy +03001627-ee1c0e545ab8dce862b3a719b353f115.npy +03636649-aa34fbd699f88094e5c7ea227b17d897.npy +03001627-41852b57b492559eb36178084a593098.npy +03948459-f377665c5b17d0ce61b636d79e46a7e9.npy +02958343-d9034b15c7f295551a46c391b387480b.npy +03001627-4fdcd44fd622400a97fe55e7ac43b9fd.npy +04090263-2eb8897f028d20bda27aa199c0989017.npy +04256520-2a56ff0143d4e69fe6fe3612af521500.npy +02691156-794fe891e20800d37bbc9fbc6d1fd31d.npy +02691156-117830993cc5887726587cb13c78fb9b.npy +03001627-7ae007a84e6e616d5781796ac0b9d597.npy +04379243-6122a22d4275acc796fcae44a3024b7b.npy +04256520-a11d94a5675bc703265c64fa53bf2c02.npy +02828884-7462c18d6934c5a3a83826e22c7812a6.npy +02958343-25bd9f423333c691f606d4ef0b8dbe5b.npy +02958343-47716b1acaae5b8083653a771e25099b.npy +03691459-c1fd0e8de18620ba27e7754e513f7fef.npy +02958343-c76c5d215cfd21cdee10575a68c30871.npy +03211117-4230f614a9d9a13625acf8f19a51a492.npy +03001627-9a41550ba7dd31e3bf80985a99195eb8.npy +04090263-38d7ad99e308ddc334c4a8f12da88608.npy +02958343-1eae4fcec701c176e742b0b5e87bec54.npy +04256520-33d6c09be1a1a88a48fda83c10428379.npy +02958343-e19292592dd67f1f5400f0dc3171dfcd.npy +02958343-aebaeaf0dfeb9fbe13ded1857c15b5b6.npy +03636649-d582dce8cd58bc57899bad344dc01f2f.npy +02880940-f2ef5e5b49f2bb8340dfb1e6c8f5a333.npy +02958343-96e3179460185d889130d420a26edb84.npy +04379243-cb4cd38679773e6aa1fdf150cebcb587.npy +03790512-b649be9c09e2b332429f1c522640e6f0.npy +04379243-1b82432d7a959b8dfebad4f49b26ec52.npy +04256520-e9e5da988215f06513292732a7b1ed9a.npy +04379243-5a7039feb89ab32f5e6d4b8e7c0423c1.npy +02691156-2da62d609cc59f9a10b920f84a47c477.npy +02876657-940b9e91a4a32a4130612f5c0ef21eb8.npy +04090263-82ed6ca9d8f6e80ba46487e924d32c5c.npy +03790512-94a021f2078cab18da3e5772fc0cd087.npy +03991062-10e72272bc46378a2c59a4d90e63212.npy +03691459-eb7b66a6557a05a4ab7f9d2da6fc61cf.npy +03991062-3167747de7918463ea0d2b3f25b232bb.npy +03636649-f8ca4809b68d1ad6157d629c9921fc15.npy +04379243-3f63afde3842a73affccbd0b169a39.npy +04090263-b6799bf6047f717e7f3efc94c2d31dc5.npy +03046257-c867f47e2bae884fc86d37abb4719793.npy +02691156-cbe8994d1dea1bcb4c3a35cee92bb95b.npy +04379243-6d9d1411a046934418b5d5fe1f3ec412.npy +02691156-a0fd595fdbd3a85113a96c178eda1cb8.npy +02801938-4fcb0ea751f75df936b0f2a1430e993a.npy +02958343-3469d3ab2d353da43a3afd30f2e86bd7.npy +02691156-cc80380c511ec8e2c91a9d486db717.npy +03928116-72f4c5af69cbae5df4e0e15368c84346.npy +04379243-8616d1bc989f83ef2df099df387d2211.npy +03624134-a9a091c148dcd07a156edd8a0a2b1378.npy +04379243-1377448893b499a5a8e4e5c9426fb9cb.npy +02691156-236932c4f4b2f557f5c7319b71bdce6e.npy +04379243-f61d6422de7447bc4c772d26a83f790c.npy +03211117-f4a259b4778a77b37b2bb75885cfc44.npy +02958343-3397f15757f51279e55e3ad998a1ecb4.npy +03001627-17352867f5661212c8687ff9b0b4e4ac.npy +04379243-155a08c8e150e7008c4f202fffc87396.npy +04090263-1b7f1ca21e6ab9cecc34b900bb2492e.npy +04256520-608d9d8434e52a71eaf14273fa406ffc.npy +02958343-ac6977ed53e041392b03387fa8b1d3d5.npy +03636649-5dd2f4d3b253058dd554ab0a45f30de7.npy +02876657-592f62e338fcac1eb0be98650cd7fb6f.npy +03001627-2de1c5525d24c1c988dcbe86402c7c15.npy +03325088-8bff3a6cc3208b86b7a867e9b35a1295.npy +03991062-43890c1681acdb96192cb9598e6d5392.npy +03001627-64ac9e029c4c9eb1671565dae7014737.npy +04256520-e0fd6cc8f2e62ed6d1151897037aebc.npy +04090263-604f91e5b306393fa884e15a61a5f4a2.npy +04256520-1e6d5797be45c5a4443764597a072223.npy +04379243-811a7be3be14bd2b62103e4bff47b4cd.npy +03001627-40e73a326cf95d0361c93c4994c91bd1.npy +03001627-3968956c7bccc24c203eb08a0c3b4355.npy +03691459-e3a37b904381c61a46407779dbd69b2d.npy +03636649-a34db84654a9685f54386f3e4b944407.npy +03624134-ae66cb2b08eb34c0e887497dd1ca4081.npy +03790512-c62066c1ff268bcb9624f6cadda65407.npy +02958343-354274e1c27653a318d9ca1acf6633f6.npy +03001627-89d510c94145f0e0f7628281ecb18112.npy +02958343-bd29875d6aa7be1b2a80b185a779af6c.npy +03797390-c34718bd10e378186c6c61abcbd83e5a.npy +02691156-a95734cb8f7511cb46ed10e8f7fe336e.npy +02958343-27495a8836ead3d55c5dd9508493909b.npy +03001627-a8dd9990ecd74c45435897641a7ee684.npy +03001627-bbe71bb58b7f8f74f51f77a6d7299806.npy +04379243-77daa3ded63dc634d83e8d4109d37961.npy +04090263-108c7545e089109c9838402e8211bd73.npy +04090263-78a0c4ff75258ecf16b34c3751bc447d.npy +03001627-c763d59c0b5c73394925bc492489de9c.npy +03001627-6033c5fa61cb7b79b50d0c6a0c254040.npy +04256520-bc5a26c2915a592091a3aa674c7ec1a3.npy +04379243-25eefc5a3c7b30e1f103d473de33521a.npy +03001627-c3c159a5a56614aad7b20fded0142d7a.npy +03991062-e3fcf5ec83e5fdc54b3c42e318f3affc.npy +04379243-6f052c8606dd3ac3de03ab2a27ba7531.npy +04379243-9b10ca8fefd82fad5c10b08ea69398c3.npy +02801938-cebf28243694a6136aea2f18ee404fd5.npy +04090263-85d730adf18e0c43a06a81572261e82e.npy +02691156-bc7ead8b45952ab8822054a0a020bf4a.npy +04379243-e0194110e31c999aa91c75874136f43d.npy +04256520-4b86c8d86e181ed8f51f77a6d7299806.npy +03001627-5e191b9696ff301e821a29f3de4d7cce.npy +02691156-f6f5efa1554038ce2154ead1f7ab03aa.npy +03001627-445d6cef46b853ee713decb1a0563b12.npy +04090263-166508e16d31488a6a34aa94ca8a3355.npy +02801938-b852202f803c3dfe90c794d3b20112e6.npy +03636649-c5b6259812704f11e3ebe8b18779c486.npy +04379243-8c8690ed4cd0a297e4bbc5bb7fd2afa.npy +03948459-8c9e592c95f95e7c9a6e43b878d5b335.npy +03991062-fe897824c2edaf4fffc6e457221b9271.npy +03046257-6c436e74fedfb0d54fa6e466c3dafd05.npy +04379243-dd528cd176c8d99686de8d6734d81fc9.npy +02691156-d60ec60e091e9d7ade125dc914c4bb9c.npy +03624134-1483e2654c791dbe9f647b36386f24ae.npy +04256520-218a7b0cfc87312925a3aaf903a41c90.npy +04379243-ab08125b4f53c1779595137b79304890.npy +03624134-e31978ce34a288461b22d29e47ec3f2.npy +03928116-fd6034ddb67af9615b39a37797d4a0c4.npy +03636649-5d97be0e2414bfe0a8930422448288ea.npy +04379243-d40ba4b29c5ae69dae14646a8c8ddd34.npy +03001627-30d2d3c887f9592551ae1a6e89264401.npy +04256520-54f81ca969051442e9362c2e21d265df.npy +02691156-4a3950ebb6fe6aca8afca43ae0909988.npy +03001627-cee98619dbdb0e34c5fc2b846c38d941.npy +03991062-93aa00349b151dd37df4feb40f08ca17.npy +04256520-f1e174f8ac0f5254490ad276cd2af3a4.npy +04090263-a7b088a849fdd41c25975e984b0e050b.npy +04090263-e57483ce26ca69b08f70fa6e7b12c70.npy +04379243-6a3ee73d42228f8581654cb17c02fd.npy +02958343-42f45d024ab3309eff673973a435017f.npy +02828884-22da6d7559e28ac9d2b12aa6a0f050b3.npy +03636649-85f0a7c268fd095cfcb8d8c6d4df8143.npy +04090263-eca245f9c180e7c71d9b004d9d8d2781.npy +02958343-1e54527efa629c37a047cd0a07d473f1.npy +02828884-49989a15860936d6601104cd2d998272.npy +04379243-180c5218bb39d31f5510d59f3ab1ed64.npy +03001627-756487465c12a5332165c54dcecaacb4.npy +04379243-14e9f568cd3309dd75becd8a4c3f1866.npy +04379243-b5fe80b6cbb9f5d1a6c03a53cf0a14c9.npy +04379243-a48e4c2930d39f289d297e74104d3ac3.npy +03046257-fdb5537f0899ced0744fc85fe0d3e26e.npy +02958343-b38361e0d9eace2fcf2b292150d31034.npy +04256520-4f5611a5b8b1362e73800789ccff9705.npy +04090263-796816a563f04373c24d00518a3dd6ec.npy +02828884-2e5b449d584725dead5067eac75a07f7.npy +04090263-24ba1a3b18e25e46a3a714c763a6fafd.npy +04256520-ff35b2519455b6577b76a7024ccebf5.npy +03001627-5ca5e3357e5a6d9b45c6cb69e0968783.npy +04090263-a02f13c708f259f97ed475464ab76870.npy +03636649-255dd61372b3509a41657e31b569b105.npy +03325088-3805c03602ebf679c36fb70296e45483.npy +02691156-49e21b81565a51e6493c5f51f14398c7.npy +03691459-bc7938b4fc00ff71984102bc982dc4a5.npy +03691459-28b5a90b428358e173e1b2d018c0512.npy +02691156-b224e74c6de1185a6f498c6206a06582.npy +04379243-3fc5f57053b75b5a91cd5c82dce55c17.npy +03001627-d67d52783e2ef9b76179a6634d17b74.npy +02691156-3b95867a47a8afafe593bc205a118b49.npy +04090263-22063ea2a9d53b569628553cade61af2.npy +03636649-a721beef2162858ca2331382fbc36f94.npy +03001627-5874e2ea2c2b71471b356ab8b24c147.npy +03691459-231104a34a7b7a52c67a971de046381d.npy +03636649-d4bbd93c0d85e77d7934a0d24a61231.npy +02828884-dd56a9259a0eb458f155d75bbf62b80.npy +03790512-2f32164c5a422fe8b44d82a74ebc14c0.npy +04090263-20cbbde170e264f320152153c3a56171.npy +02958343-3cad25b218e0cd506436916a86a90ed7.npy +03001627-ea628b4568d4eb527085b4353236aad.npy +02691156-59043812c2139ea8bbf3143b1cb6076a.npy +02876657-e23f62bb4794ee6a7fdd0518ed16e820.npy +03001627-6534de9a07438b52ee3907b60a74e8f8.npy +03001627-f1f40596ca140cc89cfc48dba5c0e481.npy +02828884-8ff44d4849eeb577ad5067eac75a07f7.npy +03001627-f52c7425a47ff55f79c8c47a54f30eb.npy +02691156-7201e35e5062683571d03b466c72ce41.npy +03001627-6b70334926f7dac3f91663a74ccd2338.npy +03001627-8aa597e8f5498bb0165de6c381540e39.npy +03691459-d414b33288a735c955b62c3398327a83.npy +02958343-30e84a2b779b0e89473f10e6caaeca56.npy +03691459-3fa75b15090b5139ec507a9b4c133ee1.npy +03001627-79c5542f068830463002bb98777d6df5.npy +02958343-62b14fc115d98999f0776ca5816850f0.npy +03948459-f2ab639004ccdb749a6e43b878d5b335.npy +04074963-e739278e9039922dff7f69173a1ae6d4.npy +03636649-3343296bb39a9e679410a04d09c14d1a.npy +02691156-6f8e17cf5180fa96a911ef3962f7cae2.npy +03001627-cb68461343aa852772dadd9292b51ceb.npy +04090263-d805bfbfee78282e6b2c8bb96250e4a0.npy +03001627-609cfbe0dd76c64042e1bb4fe264125f.npy +04090263-3d76e67762cacc714b49cd65dfcc3a9a.npy +03636649-ba3f51c0e1e0adef4cc30865d6337b9c.npy +03325088-dda2fa1732a011278b63cb6175467ac9.npy +03691459-1d4bb07ac73996182339c28050e32573.npy +03636649-213d911cc489c352b5db3f95d706a0c9.npy +03624134-3ef87a241213eb129f30f02514717f00.npy +03691459-29c140fb4eba078c7909eb62c64c0070.npy +04225987-55f0e38a64ba2c2d813b65629a36678.npy +03325088-c4b98fbd29336c5276c18e71fd49c4dc.npy +03624134-b0079bce8ea7d247d647ce6a3f0800a0.npy +02828884-7bbd4d3fed3c4255626d7e3d07da8352.npy +02828884-9ff0e30c911ef3a3cb2a965e75be701c.npy +02691156-32e7224d196e5866bd564bd76cf3cbec.npy +02828884-7540e6df58bf00ff13eaf3e3f6d466d9.npy +03001627-a1e6226c3a23ec808a653a9f65a410f6.npy +03001627-93e72cd3140b32513b5ed5cb2d36de1e.npy +02942699-ff74c4d2e710df3401a67448bf8fe08.npy +03691459-519b0f5581c72a25db30e42459dcb06f.npy +02691156-1eb3af39d93c8bf2ddea2f4a0e0f0d2e.npy +03691459-1db62b6137f51cee8ae98a75d7488e57.npy +03001627-7e433512ef8beb51b17743c18fb63dc.npy +03991062-127b3453b1f73505a2c59a4d90e63212.npy +03691459-370ab315439047cba2fc84df67c2df42.npy +03001627-38f87e02e850d3bd1d5ccc40b510e4bd.npy +03948459-686be742e65eab7816cf8b1cd2155e02.npy +02958343-3f16d6ac013aa946977e464a4b82757d.npy +02691156-f66bf1a9b6d2d109a34fb3db6a11a22d.npy +03001627-198bd40d94930950df6cfab91d65bb91.npy +03991062-4eedf4a65907a4c7a2c59a4d90e63212.npy +03001627-96885d760de5c5e174335c2737ecf4d.npy +03691459-132257fddbebc02ff14235268cca03a3.npy +02691156-66c37aeffd6e73f284306f3bf0a1f2d7.npy +03624134-ca430e94c7e2e3ad8e40258f05c88f27.npy +04090263-4a4387ccf5b0b4a6589c07868201b17e.npy +02691156-a805c30d4b09f11f62347b4731688b0f.npy +02691156-fb2e4eb19ba19bde5fe6cff21a9e8496.npy +03211117-9972709345d24fd31ee6305032661052.npy +02958343-80cae0cc66dcb8a88acb0ff76f4aec7d.npy +02958343-e213d976734431773a3afd30f2e86bd7.npy +02958343-3df6230b2382ec12473f10e6caaeca56.npy +03001627-9c8685c65403dfba2f134420f7b0d7e6.npy +04090263-f8af5b4ded94bfcb9905a3939c890ad2.npy +02958343-30964e51b5218487577fbd27130e143.npy +04090263-bf6268d9d4bd22d89cd99d3d15a8756e.npy +03001627-a23e9e5ace917aa350ff3fe5a0fcba13.npy +03001627-c1d4fcbf5bb6ad11c5beea20858a99d5.npy +04099429-c3f7e3b188f6fe139a6e43b878d5b335.npy +02691156-975c00ab85218a05430355e13bc86b4e.npy +02958343-31055873d40dc262c7477eb29831a699.npy +02691156-de519752147a225032387cdb9b2a84d5.npy +02880940-754634abeb7bffc32977b68653eb2e1e.npy +02691156-4c07126c6ecf5436b7bd17e458d0dcb.npy +03691459-64ba67a67d83811c2b688d771932c023.npy +02691156-707cc578bfec0f671aa9d8d95b6740cc.npy +03211117-bb870360cda15433e441f5bb6f88ca61.npy +02691156-3f387e8586f92b6b7d3b11085e75c7ad.npy +03325088-61c12f5b031b80beb362845c6edb57fc.npy +02691156-e2a6bed8b8920586c7a2c209f9742f15.npy +03636649-6650c1c61c8aefc782db9fca4b68095.npy +03001627-e2809feb8c0b535686c701087a194026.npy +02876657-738d7eb5c8800842f8060bac8721179.npy +02691156-62bc07e9813d75ead46f37bdc1dd4b45.npy +02958343-6ee6fa5c8d664f1349314ffcec1f2f7f.npy +04090263-ad209c1cf7e2cd6249352dd33f95cb9e.npy +02958343-1be075751d7cfbf9ee8e9bd690a19ec1.npy +03636649-402f7ce2b87e7d1ac066b9622c005c53.npy +04090263-ade16e09e79526d487ec12cf5e4563a4.npy +03991062-5dbe8e5eef057cdf17395ba6d552088a.npy +03691459-5b6ffc53d44363b57f2a00f370c25e25.npy +03001627-da264a41dd8fdd655357c338ec9641.npy +04090263-59aee3729d8ae9a6a8304814541fbf2c.npy +03636649-9f5c3ea9f8254b8bd42b9650f19dd425.npy +02958343-b370e4c0d05df8eaf48062edccab3fbd.npy +03624134-3ffc61a3380f4104823590ed8a67d74b.npy +02958343-61645b21c344e22a65dc1e664bdf2e6b.npy +03948459-dd549fdfd38ce511fc43d5b32fa230f.npy +03636649-7eaa7d0cadf48bbfa9bdc22a1e02e82.npy +02958343-222cfde10e0f62e04b00d8f4cd3fae63.npy +02880940-bb7586ebee0dc2be4e346ee2650d150.npy +02958343-b2e13c37cfaba983321ad52c1815971d.npy +03636649-4b6ba211c9731d334c614ad0ec154eb5.npy +02958343-2f839e1e2072a11be55e3ad998a1ecb4.npy +04090263-4407c14eb6e7ba83160ce3b5a19029bc.npy +02691156-d4a8134b2463a8bca8607f540cc62ba.npy +03991062-c045cdd855fdec2b7b6fd5468f603b31.npy +02843684-ef5c972369cdd9bef953ec7f4b3cdf4b.npy +02691156-2efa2cfc42f2ff481b27cd1681a3d0e7.npy +03636649-87d8b99b8a43e2f930f6e0ede20c4525.npy +02691156-845d7718879d26f9a45fa73059b12336.npy +03636649-8581a3ae1f77319ac066b9622c005c53.npy +04090263-193520be26b57b77a5f9d279e263a051.npy +03991062-fab65459e5a9e94ad4d8765e3910f617.npy +04090263-2f86138fadf4e2f5af56497f051566ab.npy +02828884-b023f42464e9591867c8e42cd3ac65ef.npy +02828884-77c2f1b7a7c0a4d15ca1f314f1afc186.npy +03207941-4a4f0713fbabb6e514b35a7d7cea7130.npy +02876657-2976131e4621231655bf395569b6fd5.npy +02691156-dc344ae06e26aa55615ba7bf3620290d.npy +02958343-36cf21268838ce6011718baa6d4afc0b.npy +02828884-778ad8517a34927d2056b4bd5d870b47.npy +02828884-359c7abaf431a05181faebbdea6bd9be.npy +02958343-57ce5193c3ecd067c05c2f3d0d461abf.npy +02691156-5a399ad6696d587d5e37076261ed63.npy +03337140-d879a859aa635c4b91c352d02061b3f7.npy +04090263-fc6bb157d603772d81eae2a60736179d.npy +04090263-e1fd9153928081d93b80701afa3beec5.npy +03991062-7d45da94216b4056a05876905ab3aec3.npy +02828884-44085381e0708de48ee8b7b79b7a0cdc.npy +03624134-e355bd01c8bacaa53630ed68aee4bf94.npy +03207941-37fde5302327d2594a44340bf227e40.npy +03991062-5562563aa6a2f57ec8995c27271d380.npy +02958343-1f5e1b0661b340fc81dcc09cafd93d2e.npy +03337140-b29dbf1f80164b31ebf17edfda20712b.npy +03325088-9599bd738a7a178d76c18e71fd49c4dc.npy +03337140-40129bba38f40b4c4c3aee8e9d3a6ffa.npy +03325088-c7480d5acf4527c5979c556124bee033.npy +02958343-85bb9748c3836e566f81b21e2305c824.npy +03624134-5e515b18ed17a418b056c98b2e5e5e4e.npy +02828884-73a6a42f5e45b3e7a3879b7d5fe7c612.npy +03948459-db78bea32b311c1f873aebd175ac6f11.npy +02958343-b990ae1858bb82c133f84f942f9a2bf5.npy +02691156-8615ac14d65e76efbde09007ce74853c.npy +02828884-ba363a93cf76f9a12056b4bd5d870b47.npy +04090263-cca52c1d48b777b227be842e82df28b3.npy +02828884-b60b9fe791be0f4b1191025061735ea3.npy +04090263-b7e7192d2b8686fb418bdc8c2bd0fb7c.npy +02828884-51197dd964f598fdcb2a965e75be701c.npy +03207941-aa4ad2f41efb815cb022c94235bc8601.npy +03948459-49e379dd689f01258dc97820d1d9537.npy +03325088-bc25edce4945567776c18e71fd49c4dc.npy +02801938-d9f0f7cff584b60d826faebfb5cddf3c.npy +02801938-33a623a68ac3a6541c8c7b57a94dbb2e.npy +02880940-519f07b4ecb0b82ed82a7d8f544ae151.npy +04090263-3b3839d2a22ffe94c5a12959f98a115.npy +02828884-4f9e40b167665d793a0ed7b4771fe31.npy +02828884-e82eace9941d82f34ff3e3166b80bde9.npy +03325088-6412b168fb8b4a66c36fb70296e45483.npy +02828884-2d1dda55020a0c4bad5067eac75a07f7.npy +03991062-64de833b09fd52c3a324047aa5b1f068.npy +03710193-c0a7a35c64ca731aff8240d22dfd73.npy +03325088-677080f1736892d7de9f0235251bc840.npy +04090263-469fe5d0ea2bba70650d38f01656985e.npy +03211117-c4a41bdc2246d79743b1666db9daca7c.npy +03207941-ff421b871c104dabf37a318b55c6a3c.npy +04090263-d11b1767a70922edb99f5bb707709184.npy +03790512-6a9db96b3ed76f956dc3fd80522499a5.npy +03710193-13867ae4ccb3bd627369dcfc2ed54ea4.npy +03928116-804adfb0fa907adc238ec815c61acb8.npy +02828884-7f218ef91e835a90b515d1675be6b5d3.npy +03991062-152ecc698f56f89de499b3a7593b4ee7.npy +02801938-b3b341fb9a2e406e36b0f2a1430e993a.npy +03991062-785bc2c44f44cb1cad250fed8c7992ab.npy +03325088-110a839cc3fbc8013321831d2245cf06.npy +03211117-24f34f582f9072eedc3e7f8ad872247f.npy +03211117-14c9e39b05dd2cf2a07f2e5419bb2c4.npy +04090263-de5438deca7f9f0712b38b1d99376c0b.npy +03211117-58426d216f393034d24e3068806a8c67.npy +03325088-32d86098142a1662842514f9336b4377.npy +02843684-5af661f12389edb3ed772ffb17600448.npy +03325088-1a3a4611409e306c1a832e2972cd1e0d.npy +03211117-dce03c1f0b8365c335f8aa71d1d146bc.npy +03211117-7706cc4ddbc96d4975d665dad1b6a18e.npy +03948459-e6017a1e15095b4e6314c3b6a3a65519.npy +03337140-f44029207e03c4be4c3aee8e9d3a6ffa.npy +04090263-84f068d182437e65b7266db39263f546.npy +03928116-156c4207af6d2c8f1fdc97905708b8ea.npy +04090263-48620fb309184d4bc5e86946f2168706.npy +04090263-48cd9104129535283623b64770edb4be.npy +03207941-3bee2133518d4a2c1f3168043fdd9df6.npy +02876657-134c723696216addedee8d59893c8633.npy +03337140-3faf894d55e26f434c3aee8e9d3a6ffa.npy +03624134-a6efcf0b80f3bc836da16f7df2c9a5b0.npy +03211117-cc5e011d644edf395eae7316b4dfcbbe.npy +03624134-2676cb39be54c6e1bafba8433f5e7ea2.npy +03211117-a20887f46f9974d9a23949c21eddef76.npy +03337140-1d77e77d4324fbd3ce5d6e9371bb5c33.npy +03624134-6f8b660661269406504c6b6d62466c67.npy +03325088-b7758e9c5ce71e1b488d970db5b03bc1.npy +03085013-277e8f771b0aa88a6c71abf53b20bc9c.npy +03928116-a5aa3c091202411a7af9c4121d4bb913.npy +03991062-7bbbae0f1cc9778968423e46bb192f69.npy +03948459-ed051e6c8ac281facb14d3281c3904f0.npy +03211117-2bbf7f77d43b74338a331b18e58c6914.npy +03624134-e79481b2fde3a3ab340fbf70397ab69a.npy +03337140-c3881ea3a2cc38af4c3aee8e9d3a6ffa.npy +03337140-885b945da192390c4bf3cfb743192941.npy +03710193-e7c766dcfb8ed0164b0fc5c705797d05.npy +03710193-985e3c90320c7088d4f2f5e5cacbfd3c.npy +03337140-7ea3fc2b73ab02a91c352d02061b3f7.npy +03948459-263afcd618780865bbace5122b1001f5.npy +03337140-7ae9a738d4a6976991c352d02061b3f7.npy +03325088-4f9b778e5bc6e251a8f6851a5d3f13b6.npy +03325088-dd98f4c4066ad773792c04fd8184496.npy +03325088-5ded149f15be08af526fd4dfffaede08.npy +03991062-c2e11c90827c10a559f9892433e1b1f4.npy +03790512-6b6cf38ed305dc11ab13c10f92a32fc1.npy +03325088-d49e9fdb4246026ed93768e7b9b1eabf.npy +03337140-1a0995936b34c17367aa983983f9bf36.npy +03325088-be5925e681268f3b3321831d2245cf06.npy +03325088-4a9a49b9d5b267d4b7a867e9b35a1295.npy +03325088-c94828ee293222faf38c4a12750d961b.npy +03991062-aa391239edea23a16ba14bfd91a75020.npy +03207941-cbc2eab86b38a9f0275d003e423c59ba.npy +02801938-f0c2ecb032e4230c50da8b99982a3057.npy +03991062-932b6e28eac69cf8ffc6e457221b9271.npy +03991062-abad49fcabe9a8ddec6aad92a03b8466.npy +03991062-ca5fafe57c8c28f8f7a5ccfc89bfeff1.npy +03928116-42911b5824d49af774cbf1cd482c6ca0.npy +03991062-a16d89d5ca6c73aae88c1d6fc3580355.npy +03948459-8fa0dd437e6b8a819f433921788191f3.npy +03624134-9746101f20473d346bbd83c2bc4c3b2e.npy +03991062-415acc982c4a05179d4753b107dff904.npy +03948459-7e868c7ec96377df86ac88920b2701aa.npy +03337140-8aa227e32612e2137f45370489ca3156.npy +03337140-aab0358ff3aaa39691c352d02061b3f7.npy +03624134-df1d7bc513c304c3196b7bf084026530.npy +03624134-db13421379091e50e0b68f51ad1c0011.npy +03991062-55d7d4f52d9eeb2a6727079394e24d70.npy +03624134-3fb80a70e65eff5dd65ee87f16099336.npy +03991062-1732f2d2119b9adc72652f4081ec5a77.npy +04074963-b1a97d944c1b3fa2357f57aad9e1b3cc.npy +03085013-477b37c996a9ae6b61b37d2f08c1bc03.npy +03948459-f5462fcbf5366bd03571d7763ba5a413.npy +03337140-c387da71c07332b13542091189dc62b5.npy +03624134-cf8fe702232541376e5c3f959847ffe.npy +03991062-937e900f03934af4d24a2477b5d154a7.npy +03207941-4bca315fd61741797fb96900a295055a.npy +03991062-44aca0de3323a7adfb0f1b7266d79466.npy +03337140-db11905ab6f06469412dfc90452742c7.npy +03948459-f2e592962a9df3de1d27f57617a4976d.npy +03207941-fb15942e4096d8f0263a7f81856f9708.npy +03991062-dc5f68b4e89c7af3cdca8f9aeee8cb4e.npy +03991062-a66d993b9ced28d843e5f2a8f5f1723a.npy +03991062-e81a175e6b8fb1e1eee538eef7a50e4d.npy +03624134-5da842254c99b0379d40dc50674e6347.npy +03991062-6c9a25f120cdcacc25ebd1cd0b422e32.npy +03991062-3ac8ac4f319e5c0c785f06f424b9d06.npy +03991062-819795e285ea031625ebd1cd0b422e32.npy +03624134-3ca548ca4f557a4cda3cc9549ae4a7d3.npy +02843684-c9a3538b8408c66a33f19716eab42752.npy +04074963-b2c79f7add7cb56ac03df0bb156692e3.npy +03624134-7568cd60cd4d4f143f4deb9ad19fc17.npy +03991062-4f45d2e31a724df4f8d5100b5d851ce4.npy +04074963-259539bd48513e3410d32c800df6e3dd.npy +04074963-6411d7e5e038534c13b3690b5eeccc36.npy +03207941-38a5c62d5c03ae0992270dc2e45328b.npy +03085013-c680be5b4715de9cde3e0c162cb2b41b.npy +03085013-bde7724c6a2c984d4c7427583b874cf1.npy diff --git a/zoo/PointBERT/data/shapenet_synset_dict.json b/zoo/PointBERT/data/shapenet_synset_dict.json new file mode 100644 index 0000000..712903d --- /dev/null +++ b/zoo/PointBERT/data/shapenet_synset_dict.json @@ -0,0 +1 @@ +{"02691156": "airplane", "02747177": "trash bin", "02773838": "bag", "02801938": "basket", "02808440": "bathtub", "02818832": "bed", "02828884": "bench", "02843684": "birdhouse", "02871439": "bookshelf", "02876657": "bottle", "02880940": "bowl", "02924116": "bus", "02933112": "cabinet", "02942699": "camera", "02946921": "can", "02954340": "cap", "02958343": "car", "02992529": "cellphone", "03001627": "chair", "03046257": "clock", "03085013": "keyboard", "03207941": "dishwasher", "03211117": "display", "03261776": "earphone", "03325088": "faucet", "03337140": "file cabinet", "03467517": "guitar", "03513137": "helmet", "03593526": "jar", "03624134": "knife", "03636649": "lamp", "03642806": "laptop", "03691459": "loudspeaker", "03710193": "mailbox", "03759954": "microphone", "03761084": "microwaves", "03790512": "motorbike", "03797390": "mug", "03928116": "piano", "03938244": "pillow", "03948459": "pistol", "03991062": "flowerpot", "04004475": "printer", "04074963": "remote", "04090263": "rifle", "04099429": "rocket", "04225987": "skateboard", "04256520": "sofa", "04330267": "stove", "04379243": "table", "04401088": "telephone", "04460130": "tower", "04468005": "train", "04530566": "watercraft", "04554684": "washer"} \ No newline at end of file diff --git a/zoo/PointBERT/datasets/ModelNetDataset.py b/zoo/PointBERT/datasets/ModelNetDataset.py new file mode 100644 index 0000000..5b14c4d --- /dev/null +++ b/zoo/PointBERT/datasets/ModelNetDataset.py @@ -0,0 +1,149 @@ +''' +@author: Xu Yan +@file: ModelNet.py +@time: 2021/3/19 15:51 +''' +import os +import numpy as np +import warnings +import pickle + +from tqdm import tqdm +from torch.utils.data import Dataset +from .build import DATASETS +from utils.logger import * +import torch + +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + + + +def farthest_point_sample(point, npoint): + """ + Input: + xyz: pointcloud data, [N, D] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [npoint, D] + """ + N, D = point.shape + xyz = point[:,:3] + centroids = np.zeros((npoint,)) + distance = np.ones((N,)) * 1e10 + farthest = np.random.randint(0, N) + for i in range(npoint): + centroids[i] = farthest + centroid = xyz[farthest, :] + dist = np.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = np.argmax(distance, -1) + point = point[centroids.astype(np.int32)] + return point + +@DATASETS.register_module() +class ModelNet(Dataset): + def __init__(self, config): + self.root = config.DATA_PATH + self.npoints = config.N_POINTS + self.use_normals = config.USE_NORMALS + self.num_category = config.NUM_CATEGORY + self.process_data = True + self.uniform = True + split = config.subset + self.subset = config.subset + + if self.num_category == 10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + + shape_ids = {} + if self.num_category == 10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + + assert (split == 'train' or split == 'test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i]) + '.txt') for i + in range(len(shape_ids[split]))] + print_log('The size of %s data is %d' % (split, len(self.datapath)), logger = 'ModelNet') + + if self.uniform: + self.save_path = os.path.join(self.root, 'modelnet%d_%s_%dpts_fps.dat' % (self.num_category, split, self.npoints)) + else: + self.save_path = os.path.join(self.root, 'modelnet%d_%s_%dpts.dat' % (self.num_category, split, self.npoints)) + + if self.process_data: + if not os.path.exists(self.save_path): + print_log('Processing data %s (only running in the first time)...' % self.save_path, logger = 'ModelNet') + self.list_of_points = [None] * len(self.datapath) + self.list_of_labels = [None] * len(self.datapath) + + for index in tqdm(range(len(self.datapath)), total=len(self.datapath)): + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints, :] + + self.list_of_points[index] = point_set + self.list_of_labels[index] = cls + + with open(self.save_path, 'wb') as f: + pickle.dump([self.list_of_points, self.list_of_labels], f) + else: + print_log('Load processed data from %s...' % self.save_path, logger = 'ModelNet') + with open(self.save_path, 'rb') as f: + self.list_of_points, self.list_of_labels = pickle.load(f) + + def __len__(self): + return len(self.datapath) + + def _get_item(self, index): + if self.process_data: + point_set, label = self.list_of_points[index], self.list_of_labels[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + label = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints, :] + + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + if not self.use_normals: + point_set = point_set[:, 0:3] + + return point_set, label[0] + + + def __getitem__(self, index): + points, label = self._get_item(index) + pt_idxs = np.arange(0, points.shape[0]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + current_points = points[pt_idxs].copy() + current_points = torch.from_numpy(current_points).float() + return 'ModelNet', 'sample', (current_points, label) diff --git a/zoo/PointBERT/datasets/ModelNetDatasetFewShot.py b/zoo/PointBERT/datasets/ModelNetDatasetFewShot.py new file mode 100644 index 0000000..8b55880 --- /dev/null +++ b/zoo/PointBERT/datasets/ModelNetDatasetFewShot.py @@ -0,0 +1,71 @@ +''' +@author: Xu Yan +@file: ModelNet.py +@time: 2021/3/19 15:51 +''' +import os +import numpy as np +import warnings +import pickle + +from tqdm import tqdm +from torch.utils.data import Dataset +from .build import DATASETS +from utils.logger import * +import torch +import random + +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +@DATASETS.register_module() +class ModelNetFewShot(Dataset): + def __init__(self, config): + self.root = config.DATA_PATH + self.npoints = config.N_POINTS + self.use_normals = config.USE_NORMALS + self.num_category = config.NUM_CATEGORY + self.process_data = True + self.uniform = True + split = config.subset + self.subset = config.subset + + self.way = config.way + self.shot = config.shot + self.fold = config.fold + if self.way == -1 or self.shot == -1 or self.fold == -1: + raise RuntimeError() + + self.pickle_path = os.path.join(self.root, f'{self.way}way_{self.shot}shot', f'{self.fold}.pkl') + + + print_log('Load processed data from %s...' % self.pickle_path, logger = 'ModelNetFewShot') + + with open(self.pickle_path, 'rb') as f: + self.dataset = pickle.load(f)[self.subset] + + print_log('The size of %s data is %d' % (split, len(self.dataset)), logger = 'ModelNetFewShot') + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, index): + points, label, _ = self.dataset[index] + + points[:, 0:3] = pc_normalize(points[:, 0:3]) + if not self.use_normals: + points = points[:, 0:3] + + pt_idxs = np.arange(0, points.shape[0]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + current_points = points[pt_idxs].copy() + current_points = torch.from_numpy(current_points).float() + return 'ModelNet', 'sample', (current_points, label) \ No newline at end of file diff --git a/zoo/PointBERT/datasets/ScanObjectNNDataset.py b/zoo/PointBERT/datasets/ScanObjectNNDataset.py new file mode 100644 index 0000000..36e1efd --- /dev/null +++ b/zoo/PointBERT/datasets/ScanObjectNNDataset.py @@ -0,0 +1,87 @@ +import numpy as np +import os, sys, h5py +from torch.utils.data import Dataset +import torch +from .build import DATASETS +from utils.logger import * + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +@DATASETS.register_module() +class ScanObjectNN(Dataset): + def __init__(self, config, **kwargs): + super().__init__() + self.subset = config.subset + self.root = config.ROOT + + if self.subset == 'train': + h5 = h5py.File(os.path.join(self.root, 'training_objectdataset.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + elif self.subset == 'test': + h5 = h5py.File(os.path.join(self.root, 'test_objectdataset.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + else: + raise NotImplementedError() + + print(f'Successfully load ScanObjectNN shape of {self.points.shape}') + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.points.shape[1]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + + current_points = self.points[idx, pt_idxs].copy() + + + current_points = torch.from_numpy(current_points).float() + label = self.labels[idx] + + return 'ScanObjectNN', 'sample', (current_points, label) + + def __len__(self): + return self.points.shape[0] + + + +@DATASETS.register_module() +class ScanObjectNN_hardest(Dataset): + def __init__(self, config, **kwargs): + super().__init__() + self.subset = config.subset + self.root = config.ROOT + + if self.subset == 'train': + h5 = h5py.File(os.path.join(self.root, 'training_objectdataset_augmentedrot_scale75.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + elif self.subset == 'test': + h5 = h5py.File(os.path.join(self.root, 'test_objectdataset_augmentedrot_scale75.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + else: + raise NotImplementedError() + + print(f'Successfully load ScanObjectNN shape of {self.points.shape}') + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.points.shape[1]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + + current_points = self.points[idx, pt_idxs].copy() + + + current_points = torch.from_numpy(current_points).float() + label = self.labels[idx] + + return 'ScanObjectNN', 'sample', (current_points, label) + + def __len__(self): + return self.points.shape[0] \ No newline at end of file diff --git a/zoo/PointBERT/datasets/ShapeNet55Dataset.py b/zoo/PointBERT/datasets/ShapeNet55Dataset.py new file mode 100644 index 0000000..4ee1f3c --- /dev/null +++ b/zoo/PointBERT/datasets/ShapeNet55Dataset.py @@ -0,0 +1,70 @@ +import os +import torch +import numpy as np +import torch.utils.data as data +from .io import IO +from .build import DATASETS +from utils.logger import * + +@DATASETS.register_module() +class ShapeNet(data.Dataset): + def __init__(self, config): + self.data_root = config.DATA_PATH + self.pc_path = config.PC_PATH + self.subset = config.subset + self.npoints = config.N_POINTS + + self.data_list_file = os.path.join(self.data_root, f'{self.subset}.txt') + test_data_list_file = os.path.join(self.data_root, 'test.txt') + + self.sample_points_num = config.npoints + self.whole = config.get('whole') + + print_log(f'[DATASET] sample out {self.sample_points_num} points', logger = 'ShapeNet-55') + print_log(f'[DATASET] Open file {self.data_list_file}', logger = 'ShapeNet-55') + with open(self.data_list_file, 'r') as f: + lines = f.readlines() + if self.whole: + with open(test_data_list_file, 'r') as f: + test_lines = f.readlines() + print_log(f'[DATASET] Open file {test_data_list_file}', logger = 'ShapeNet-55') + lines = test_lines + lines + self.file_list = [] + for line in lines: + line = line.strip() + taxonomy_id = line.split('-')[0] + model_id = line.split('-')[1].split('.')[0] + self.file_list.append({ + 'taxonomy_id': taxonomy_id, + 'model_id': model_id, + 'file_path': line + }) + print_log(f'[DATASET] {len(self.file_list)} instances were loaded', logger = 'ShapeNet-55') + + self.permutation = np.arange(self.npoints) + def pc_norm(self, pc): + """ pc: NxC, return NxC """ + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + + + def random_sample(self, pc, num): + np.random.shuffle(self.permutation) + pc = pc[self.permutation[:num]] + return pc + + def __getitem__(self, idx): + sample = self.file_list[idx] + + data = IO.get(os.path.join(self.pc_path, sample['file_path'])).astype(np.float32) + + data = self.random_sample(data, self.sample_points_num) + data = self.pc_norm(data) + data = torch.from_numpy(data).float() + return sample['taxonomy_id'], sample['model_id'], data + + def __len__(self): + return len(self.file_list) \ No newline at end of file diff --git a/zoo/PointBERT/datasets/__init__.py b/zoo/PointBERT/datasets/__init__.py new file mode 100644 index 0000000..5a37c28 --- /dev/null +++ b/zoo/PointBERT/datasets/__init__.py @@ -0,0 +1,5 @@ +from .build import build_dataset_from_cfg +import datasets.ShapeNet55Dataset +import datasets.ModelNetDataset +import datasets.ModelNetDatasetFewShot +import datasets.ScanObjectNNDataset \ No newline at end of file diff --git a/zoo/PointBERT/datasets/build.py b/zoo/PointBERT/datasets/build.py new file mode 100644 index 0000000..db9c4be --- /dev/null +++ b/zoo/PointBERT/datasets/build.py @@ -0,0 +1,17 @@ +from utils import registry + + +DATASETS = registry.Registry('dataset') + + +def build_dataset_from_cfg(cfg, default_args = None): + """ + Build a dataset, defined by `dataset_name`. + Args: + cfg (eDICT): + Returns: + Dataset: a constructed dataset specified by dataset_name. + """ + return DATASETS.build(cfg, default_args = default_args) + + diff --git a/zoo/PointBERT/datasets/data_transforms.py b/zoo/PointBERT/datasets/data_transforms.py new file mode 100644 index 0000000..233fcf9 --- /dev/null +++ b/zoo/PointBERT/datasets/data_transforms.py @@ -0,0 +1,100 @@ +import numpy as np +import torch + +class PointcloudScale(object): + def __init__(self, lo=0.8, hi=1.25): + self.lo, self.hi = lo, hi + + def __call__(self, points): + scaler = np.random.uniform(self.lo, self.hi) + points[:, 0:3] *= scaler + return points + +class PointcloudRotate(object): + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + R = torch.from_numpy(rotation_matrix.astype(np.float32)).to(pc.device) + pc[i, :, :] = torch.matmul(pc[i], R) + return pc + +class PointcloudScaleAndTranslate(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2., translate_range=0.2): + self.scale_low = scale_low + self.scale_high = scale_high + self.translate_range = translate_range + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + torch.from_numpy(xyz2).float().cuda() + + return pc + +class PointcloudJitter(object): + def __init__(self, std=0.01, clip=0.05): + self.std, self.clip = std, clip + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + jittered_data = pc.new(pc.size(1), 3).normal_( + mean=0.0, std=self.std + ).clamp_(-self.clip, self.clip) + pc[i, :, 0:3] += jittered_data + + return pc + +class PointcloudScale(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2.): + self.scale_low = scale_low + self.scale_high = scale_high + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + + return pc + +class PointcloudTranslate(object): + def __init__(self, translate_range=0.2): + self.translate_range = translate_range + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + + pc[i, :, 0:3] = pc[i, :, 0:3] + torch.from_numpy(xyz2).float().cuda() + + return pc + + +class PointcloudRandomInputDropout(object): + def __init__(self, max_dropout_ratio=0.875): + assert max_dropout_ratio >= 0 and max_dropout_ratio < 1 + self.max_dropout_ratio = max_dropout_ratio + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + dropout_ratio = np.random.random() * self.max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((pc.size()[1])) <= dropout_ratio)[0] + if len(drop_idx) > 0: + cur_pc = pc[i, :, :] + cur_pc[drop_idx.tolist(), 0:3] = cur_pc[0, 0:3].repeat(len(drop_idx), 1) # set to the first point + pc[i, :, :] = cur_pc + + return pc diff --git a/zoo/PointBERT/datasets/generate_few_shot_data.py b/zoo/PointBERT/datasets/generate_few_shot_data.py new file mode 100644 index 0000000..ad15664 --- /dev/null +++ b/zoo/PointBERT/datasets/generate_few_shot_data.py @@ -0,0 +1,76 @@ +import pickle +import numpy as np +import random +import os + +root = '../data/ModelNet/modelnet40_normal_resampled' +target = '../data/ModelNetFewshot' + +train_data_path = os.path.join(root, 'modelnet40_train_8192pts_fps.dat') +test_data_path = os.path.join(root, 'modelnet40_test_8192pts_fps.dat') +# train +with open(train_data_path, 'rb') as f: + train_list_of_points, train_list_of_labels = pickle.load(f) +with open(test_data_path, 'rb') as f: + test_list_of_points, test_list_of_labels = pickle.load(f) + +# list_of_points = train_list_of_points + test_list_of_points +# list_of_labels = train_list_of_labels + test_list_of_labels + +def generate_fewshot_data(way, shot, prefix_ind, eval_sample=20): + train_cls_dataset = {} + test_cls_dataset = {} + train_dataset = [] + test_dataset = [] + # build a dict containing different class + for point, label in zip(train_list_of_points, train_list_of_labels): + label = label[0] + if train_cls_dataset.get(label) is None: + train_cls_dataset[label] = [] + train_cls_dataset[label].append(point) + # build a dict containing different class + for point, label in zip(test_list_of_points, test_list_of_labels): + label = label[0] + if test_cls_dataset.get(label) is None: + test_cls_dataset[label] = [] + test_cls_dataset[label].append(point) + print(sum([train_cls_dataset[i].__len__() for i in range(40)])) + print(sum([test_cls_dataset[i].__len__() for i in range(40)])) + # import pdb; pdb.set_trace() + keys = list(train_cls_dataset.keys()) + random.shuffle(keys) + + for i, key in enumerate(keys[:way]): + train_data_list = train_cls_dataset[key] + random.shuffle(train_data_list) + assert len(train_data_list) > shot + for data in train_data_list[:shot]: + train_dataset.append((data, i, key)) + + test_data_list = test_cls_dataset[key] + random.shuffle(test_data_list) + # import pdb; pdb.set_trace() + assert len(test_data_list) >= eval_sample + for data in test_data_list[:eval_sample]: + test_dataset.append((data, i, key)) + + random.shuffle(train_dataset) + random.shuffle(test_dataset) + dataset = { + 'train': train_dataset, + 'test' : test_dataset + } + save_path = os.path.join(target, f'{way}way_{shot}shot') + if not os.path.exists(save_path): + os.makedirs(save_path) + with open(os.path.join(save_path, f'{prefix_ind}.pkl'), 'wb') as f: + pickle.dump(dataset, f) + + +if __name__ == '__main__': + ways = [5, 10] + shots = [10, 20] + for way in ways: + for shot in shots: + for i in range(10): + generate_fewshot_data(way = way, shot = shot, prefix_ind = i) \ No newline at end of file diff --git a/zoo/PointBERT/datasets/io.py b/zoo/PointBERT/datasets/io.py new file mode 100644 index 0000000..d0edd1d --- /dev/null +++ b/zoo/PointBERT/datasets/io.py @@ -0,0 +1,42 @@ +import h5py +import numpy as np +import open3d +import os + +class IO: + @classmethod + def get(cls, file_path): + _, file_extension = os.path.splitext(file_path) + + if file_extension in ['.npy']: + return cls._read_npy(file_path) + elif file_extension in ['.pcd']: + return cls._read_pcd(file_path) + elif file_extension in ['.h5']: + return cls._read_h5(file_path) + elif file_extension in ['.txt']: + return cls._read_txt(file_path) + else: + raise Exception('Unsupported file extension: %s' % file_extension) + + # References: https://github.com/numpy/numpy/blob/master/numpy/lib/format.py + @classmethod + def _read_npy(cls, file_path): + return np.load(file_path) + + # References: https://github.com/dimatura/pypcd/blob/master/pypcd/pypcd.py#L275 + # Support PCD files without compression ONLY! + @classmethod + def _read_pcd(cls, file_path): + pc = open3d.io.read_point_cloud(file_path) + ptcloud = np.array(pc.points) + return ptcloud + + @classmethod + def _read_txt(cls, file_path): + return np.loadtxt(file_path) + + @classmethod + def _read_h5(cls, file_path): + f = h5py.File(file_path, 'r') + return f['data'][()] \ No newline at end of file diff --git a/zoo/PointBERT/extensions/chamfer_dist/__init__.py b/zoo/PointBERT/extensions/chamfer_dist/__init__.py new file mode 100644 index 0000000..8b4f53c --- /dev/null +++ b/zoo/PointBERT/extensions/chamfer_dist/__init__.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# @Author: Thibault GROUEIX +# @Date: 2019-08-07 20:54:24 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2019-12-18 15:06:25 +# @Email: cshzxie@gmail.com + +import torch + +import chamfer + + +class ChamferFunction(torch.autograd.Function): + @staticmethod + def forward(ctx, xyz1, xyz2): + dist1, dist2, idx1, idx2 = chamfer.forward(xyz1, xyz2) + ctx.save_for_backward(xyz1, xyz2, idx1, idx2) + + return dist1, dist2 + + @staticmethod + def backward(ctx, grad_dist1, grad_dist2): + xyz1, xyz2, idx1, idx2 = ctx.saved_tensors + grad_xyz1, grad_xyz2 = chamfer.backward(xyz1, xyz2, idx1, idx2, grad_dist1, grad_dist2) + return grad_xyz1, grad_xyz2 + + +class ChamferDistanceL2(torch.nn.Module): + f''' Chamder Distance L2 + ''' + def __init__(self, ignore_zeros=False): + super().__init__() + self.ignore_zeros = ignore_zeros + + def forward(self, xyz1, xyz2): + batch_size = xyz1.size(0) + if batch_size == 1 and self.ignore_zeros: + non_zeros1 = torch.sum(xyz1, dim=2).ne(0) + non_zeros2 = torch.sum(xyz2, dim=2).ne(0) + xyz1 = xyz1[non_zeros1].unsqueeze(dim=0) + xyz2 = xyz2[non_zeros2].unsqueeze(dim=0) + + dist1, dist2 = ChamferFunction.apply(xyz1, xyz2) + return torch.mean(dist1) + torch.mean(dist2) + +class ChamferDistanceL2_split(torch.nn.Module): + f''' Chamder Distance L2 + ''' + def __init__(self, ignore_zeros=False): + super().__init__() + self.ignore_zeros = ignore_zeros + + def forward(self, xyz1, xyz2): + batch_size = xyz1.size(0) + if batch_size == 1 and self.ignore_zeros: + non_zeros1 = torch.sum(xyz1, dim=2).ne(0) + non_zeros2 = torch.sum(xyz2, dim=2).ne(0) + xyz1 = xyz1[non_zeros1].unsqueeze(dim=0) + xyz2 = xyz2[non_zeros2].unsqueeze(dim=0) + + dist1, dist2 = ChamferFunction.apply(xyz1, xyz2) + return torch.mean(dist1), torch.mean(dist2) + +class ChamferDistanceL1(torch.nn.Module): + f''' Chamder Distance L1 + ''' + def __init__(self, ignore_zeros=False): + super().__init__() + self.ignore_zeros = ignore_zeros + + def forward(self, xyz1, xyz2): + batch_size = xyz1.size(0) + if batch_size == 1 and self.ignore_zeros: + non_zeros1 = torch.sum(xyz1, dim=2).ne(0) + non_zeros2 = torch.sum(xyz2, dim=2).ne(0) + xyz1 = xyz1[non_zeros1].unsqueeze(dim=0) + xyz2 = xyz2[non_zeros2].unsqueeze(dim=0) + + dist1, dist2 = ChamferFunction.apply(xyz1, xyz2) + # import pdb + # pdb.set_trace() + dist1 = torch.sqrt(dist1) + dist2 = torch.sqrt(dist2) + return (torch.mean(dist1) + torch.mean(dist2))/2 + diff --git a/zoo/PointBERT/extensions/chamfer_dist/chamfer.cu b/zoo/PointBERT/extensions/chamfer_dist/chamfer.cu new file mode 100644 index 0000000..4bde058 --- /dev/null +++ b/zoo/PointBERT/extensions/chamfer_dist/chamfer.cu @@ -0,0 +1,229 @@ +/* + * @Author: Haozhe Xie + * @Date: 2019-08-07 20:54:24 + * @Last Modified by: Haozhe Xie + * @Last Modified time: 2020-06-17 14:58:55 + * @Email: cshzxie@gmail.com + */ + +#include +#include +#include + +#include + +__global__ void chamfer_dist_kernel(int batch_size, + int n, + const float* xyz1, + int m, + const float* xyz2, + float* dist, + int* indexes) { + const int batch = 512; + __shared__ float buf[batch * 3]; + for (int i = blockIdx.x; i < batch_size; i += gridDim.x) { + for (int k2 = 0; k2 < m; k2 += batch) { + int end_k = min(m, k2 + batch) - k2; + for (int j = threadIdx.x; j < end_k * 3; j += blockDim.x) { + buf[j] = xyz2[(i * m + k2) * 3 + j]; + } + __syncthreads(); + for (int j = threadIdx.x + blockIdx.y * blockDim.x; j < n; + j += blockDim.x * gridDim.y) { + float x1 = xyz1[(i * n + j) * 3 + 0]; + float y1 = xyz1[(i * n + j) * 3 + 1]; + float z1 = xyz1[(i * n + j) * 3 + 2]; + float best_dist = 0; + int best_dist_index = 0; + int end_ka = end_k - (end_k & 3); + if (end_ka == batch) { + for (int k = 0; k < batch; k += 4) { + { + float x2 = buf[k * 3 + 0] - x1; + float y2 = buf[k * 3 + 1] - y1; + float z2 = buf[k * 3 + 2] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + + if (k == 0 || dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2; + } + } + { + float x2 = buf[k * 3 + 3] - x1; + float y2 = buf[k * 3 + 4] - y1; + float z2 = buf[k * 3 + 5] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 1; + } + } + { + float x2 = buf[k * 3 + 6] - x1; + float y2 = buf[k * 3 + 7] - y1; + float z2 = buf[k * 3 + 8] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 2; + } + } + { + float x2 = buf[k * 3 + 9] - x1; + float y2 = buf[k * 3 + 10] - y1; + float z2 = buf[k * 3 + 11] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 3; + } + } + } + } else { + for (int k = 0; k < end_ka; k += 4) { + { + float x2 = buf[k * 3 + 0] - x1; + float y2 = buf[k * 3 + 1] - y1; + float z2 = buf[k * 3 + 2] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (k == 0 || dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2; + } + } + { + float x2 = buf[k * 3 + 3] - x1; + float y2 = buf[k * 3 + 4] - y1; + float z2 = buf[k * 3 + 5] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 1; + } + } + { + float x2 = buf[k * 3 + 6] - x1; + float y2 = buf[k * 3 + 7] - y1; + float z2 = buf[k * 3 + 8] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 2; + } + } + { + float x2 = buf[k * 3 + 9] - x1; + float y2 = buf[k * 3 + 10] - y1; + float z2 = buf[k * 3 + 11] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 3; + } + } + } + } + for (int k = end_ka; k < end_k; k++) { + float x2 = buf[k * 3 + 0] - x1; + float y2 = buf[k * 3 + 1] - y1; + float z2 = buf[k * 3 + 2] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (k == 0 || dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2; + } + } + if (k2 == 0 || dist[(i * n + j)] > best_dist) { + dist[(i * n + j)] = best_dist; + indexes[(i * n + j)] = best_dist_index; + } + } + __syncthreads(); + } + } +} + +std::vector chamfer_cuda_forward(torch::Tensor xyz1, + torch::Tensor xyz2) { + const int batch_size = xyz1.size(0); + const int n = xyz1.size(1); // num_points point cloud A + const int m = xyz2.size(1); // num_points point cloud B + torch::Tensor dist1 = + torch::zeros({batch_size, n}, torch::CUDA(torch::kFloat)); + torch::Tensor dist2 = + torch::zeros({batch_size, m}, torch::CUDA(torch::kFloat)); + torch::Tensor idx1 = torch::zeros({batch_size, n}, torch::CUDA(torch::kInt)); + torch::Tensor idx2 = torch::zeros({batch_size, m}, torch::CUDA(torch::kInt)); + + chamfer_dist_kernel<<>>( + batch_size, n, xyz1.data_ptr(), m, xyz2.data_ptr(), + dist1.data_ptr(), idx1.data_ptr()); + chamfer_dist_kernel<<>>( + batch_size, m, xyz2.data_ptr(), n, xyz1.data_ptr(), + dist2.data_ptr(), idx2.data_ptr()); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("Error in chamfer_cuda_forward: %s\n", cudaGetErrorString(err)); + } + return {dist1, dist2, idx1, idx2}; +} + +__global__ void chamfer_dist_grad_kernel(int b, + int n, + const float* xyz1, + int m, + const float* xyz2, + const float* grad_dist1, + const int* idx1, + float* grad_xyz1, + float* grad_xyz2) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int j = threadIdx.x + blockIdx.y * blockDim.x; j < n; + j += blockDim.x * gridDim.y) { + float x1 = xyz1[(i * n + j) * 3 + 0]; + float y1 = xyz1[(i * n + j) * 3 + 1]; + float z1 = xyz1[(i * n + j) * 3 + 2]; + int j2 = idx1[i * n + j]; + float x2 = xyz2[(i * m + j2) * 3 + 0]; + float y2 = xyz2[(i * m + j2) * 3 + 1]; + float z2 = xyz2[(i * m + j2) * 3 + 2]; + float g = grad_dist1[i * n + j] * 2; + atomicAdd(&(grad_xyz1[(i * n + j) * 3 + 0]), g * (x1 - x2)); + atomicAdd(&(grad_xyz1[(i * n + j) * 3 + 1]), g * (y1 - y2)); + atomicAdd(&(grad_xyz1[(i * n + j) * 3 + 2]), g * (z1 - z2)); + atomicAdd(&(grad_xyz2[(i * m + j2) * 3 + 0]), -(g * (x1 - x2))); + atomicAdd(&(grad_xyz2[(i * m + j2) * 3 + 1]), -(g * (y1 - y2))); + atomicAdd(&(grad_xyz2[(i * m + j2) * 3 + 2]), -(g * (z1 - z2))); + } + } +} + +std::vector chamfer_cuda_backward(torch::Tensor xyz1, + torch::Tensor xyz2, + torch::Tensor idx1, + torch::Tensor idx2, + torch::Tensor grad_dist1, + torch::Tensor grad_dist2) { + const int batch_size = xyz1.size(0); + const int n = xyz1.size(1); // num_points point cloud A + const int m = xyz2.size(1); // num_points point cloud B + torch::Tensor grad_xyz1 = torch::zeros_like(xyz1, torch::CUDA(torch::kFloat)); + torch::Tensor grad_xyz2 = torch::zeros_like(xyz2, torch::CUDA(torch::kFloat)); + + chamfer_dist_grad_kernel<<>>( + batch_size, n, xyz1.data_ptr(), m, xyz2.data_ptr(), + grad_dist1.data_ptr(), idx1.data_ptr(), + grad_xyz1.data_ptr(), grad_xyz2.data_ptr()); + chamfer_dist_grad_kernel<<>>( + batch_size, m, xyz2.data_ptr(), n, xyz1.data_ptr(), + grad_dist2.data_ptr(), idx2.data_ptr(), + grad_xyz2.data_ptr(), grad_xyz1.data_ptr()); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("Error in chamfer_cuda_backward: %s\n", cudaGetErrorString(err)); + } + return {grad_xyz1, grad_xyz2}; +} diff --git a/zoo/PointBERT/extensions/chamfer_dist/chamfer_cuda.cpp b/zoo/PointBERT/extensions/chamfer_dist/chamfer_cuda.cpp new file mode 100644 index 0000000..9fca161 --- /dev/null +++ b/zoo/PointBERT/extensions/chamfer_dist/chamfer_cuda.cpp @@ -0,0 +1,39 @@ +/* + * @Author: Haozhe Xie + * @Date: 2019-08-07 20:54:24 + * @Last Modified by: Haozhe Xie + * @Last Modified time: 2019-12-10 10:33:50 + * @Email: cshzxie@gmail.com + */ + +#include +#include + +std::vector chamfer_cuda_forward(torch::Tensor xyz1, + torch::Tensor xyz2); + +std::vector chamfer_cuda_backward(torch::Tensor xyz1, + torch::Tensor xyz2, + torch::Tensor idx1, + torch::Tensor idx2, + torch::Tensor grad_dist1, + torch::Tensor grad_dist2); + +std::vector chamfer_forward(torch::Tensor xyz1, + torch::Tensor xyz2) { + return chamfer_cuda_forward(xyz1, xyz2); +} + +std::vector chamfer_backward(torch::Tensor xyz1, + torch::Tensor xyz2, + torch::Tensor idx1, + torch::Tensor idx2, + torch::Tensor grad_dist1, + torch::Tensor grad_dist2) { + return chamfer_cuda_backward(xyz1, xyz2, idx1, idx2, grad_dist1, grad_dist2); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &chamfer_forward, "Chamfer forward (CUDA)"); + m.def("backward", &chamfer_backward, "Chamfer backward (CUDA)"); +} diff --git a/zoo/PointBERT/extensions/chamfer_dist/setup.py b/zoo/PointBERT/extensions/chamfer_dist/setup.py new file mode 100644 index 0000000..04c6589 --- /dev/null +++ b/zoo/PointBERT/extensions/chamfer_dist/setup.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# @Author: Haozhe Xie +# @Date: 2019-08-07 20:54:24 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2019-12-10 10:04:25 +# @Email: cshzxie@gmail.com + +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + +setup(name='chamfer', + version='2.0.0', + ext_modules=[ + CUDAExtension('chamfer', [ + 'chamfer_cuda.cpp', + 'chamfer.cu', + ]), + ], + cmdclass={'build_ext': BuildExtension}) diff --git a/zoo/PointBERT/extensions/chamfer_dist/test.py b/zoo/PointBERT/extensions/chamfer_dist/test.py new file mode 100644 index 0000000..0ece5d2 --- /dev/null +++ b/zoo/PointBERT/extensions/chamfer_dist/test.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# @Author: Haozhe Xie +# @Date: 2019-12-10 10:38:01 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2019-12-26 14:21:36 +# @Email: cshzxie@gmail.com +# +# Note: +# - Replace float -> double, kFloat -> kDouble in chamfer.cu + +import os +import sys +import torch +import unittest + + +from torch.autograd import gradcheck + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))) +from extensions.chamfer_dist import ChamferFunction + + +class ChamferDistanceTestCase(unittest.TestCase): + def test_chamfer_dist(self): + x = torch.rand(4, 64, 3).double() + y = torch.rand(4, 128, 3).double() + x.requires_grad = True + y.requires_grad = True + print(gradcheck(ChamferFunction.apply, [x.cuda(), y.cuda()])) + + + +if __name__ == '__main__': + # unittest.main() + import pdb + x = torch.rand(32,128,3) + y = torch.rand(32,128,3) + pdb.set_trace() diff --git a/zoo/PointBERT/extensions/emd/.gitignore b/zoo/PointBERT/extensions/emd/.gitignore new file mode 100644 index 0000000..8400d00 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +build +dist +emd_ext.egg-info +*.so diff --git a/zoo/PointBERT/extensions/emd/README.md b/zoo/PointBERT/extensions/emd/README.md new file mode 100644 index 0000000..8165a45 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/README.md @@ -0,0 +1,31 @@ +# PyTorch Wrapper for Point-cloud Earth-Mover-Distance (EMD) + +## Dependency + +The code has been tested on Ubuntu 16.04, PyTorch 1.1.0, CUDA 9.0. + +## Usage + +First compile using + + python setup.py install + +Then, copy the lib file out to the main directory, + + cp build/lib.linux-x86_64-3.6/emd_cuda.cpython-36m-x86_64-linux-gnu.so . + +Then, you can use it by simply + + from emd import earth_mover_distance + d = earth_mover_distance(p1, p2, transpose=False) # p1: B x N1 x 3, p2: B x N2 x 3 + +Check `test_emd_loss.py` for example. + +## Author + +The cuda code is originally written by Haoqiang Fan. The PyTorch wrapper is written by Kaichun Mo. Also, Jiayuan Gu provided helps. + +## License + +MIT + diff --git a/zoo/PointBERT/extensions/emd/__init__.py b/zoo/PointBERT/extensions/emd/__init__.py new file mode 100644 index 0000000..430da75 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/__init__.py @@ -0,0 +1,3 @@ +from .emd import earth_mover_distance as emd + +__all__ = ['emd'] \ No newline at end of file diff --git a/zoo/PointBERT/extensions/emd/cuda/emd.cpp b/zoo/PointBERT/extensions/emd/cuda/emd.cpp new file mode 100644 index 0000000..b94db14 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/cuda/emd.cpp @@ -0,0 +1,29 @@ +#ifndef _EMD +#define _EMD + +#include +#include + +//CUDA declarations +at::Tensor ApproxMatchForward( + const at::Tensor xyz1, + const at::Tensor xyz2); + +at::Tensor MatchCostForward( + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match); + +std::vector MatchCostBackward( + const at::Tensor grad_cost, + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match); + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("approxmatch_forward", &ApproxMatchForward,"ApproxMatch forward (CUDA)"); + m.def("matchcost_forward", &MatchCostForward,"MatchCost forward (CUDA)"); + m.def("matchcost_backward", &MatchCostBackward,"MatchCost backward (CUDA)"); +} + +#endif diff --git a/zoo/PointBERT/extensions/emd/cuda/emd_kernel.cu b/zoo/PointBERT/extensions/emd/cuda/emd_kernel.cu new file mode 100644 index 0000000..4744a81 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/cuda/emd_kernel.cu @@ -0,0 +1,400 @@ +/********************************** + * Original Author: Haoqiang Fan + * Modified by: Kaichun Mo + *********************************/ + +#ifndef _EMD_KERNEL +#define _EMD_KERNEL + +#include +#include + +#include +#include // at::cuda::getApplyGrid +#include + +#define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous") +#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) + + +/******************************** +* Forward kernel for approxmatch +*********************************/ + +template +__global__ void approxmatch(int b,int n,int m,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,scalar_t * __restrict__ match,scalar_t * temp){ + scalar_t * remainL=temp+blockIdx.x*(n+m)*2, * remainR=temp+blockIdx.x*(n+m)*2+n,*ratioL=temp+blockIdx.x*(n+m)*2+n+m,*ratioR=temp+blockIdx.x*(n+m)*2+n+m+n; + scalar_t multiL,multiR; + if (n>=m){ + multiL=1; + multiR=n/m; + }else{ + multiL=m/n; + multiR=1; + } + const int Block=1024; + __shared__ scalar_t buf[Block*4]; + for (int i=blockIdx.x;i=-2;j--){ + scalar_t level=-powf(4.0f,j); + if (j==-2){ + level=0; + } + for (int k0=0;k0>>(b,n,m,xyz1,xyz2,match,temp); +//} + +/* ApproxMatch forward interface +Input: + xyz1: (B, N1, 3) # dataset_points + xyz2: (B, N2, 3) # query_points +Output: + match: (B, N2, N1) +*/ +at::Tensor ApproxMatchForward( + const at::Tensor xyz1, + const at::Tensor xyz2){ + const auto b = xyz1.size(0); + const auto n = xyz1.size(1); + const auto m = xyz2.size(1); + + CHECK_EQ(xyz2.size(0), b); + CHECK_EQ(xyz1.size(2), 3); + CHECK_EQ(xyz2.size(2), 3); + CHECK_INPUT(xyz1); + CHECK_INPUT(xyz2); + + auto match = at::zeros({b, m, n}, xyz1.type()); + auto temp = at::zeros({b, (n+m)*2}, xyz1.type()); + + AT_DISPATCH_FLOATING_TYPES(xyz1.scalar_type(), "ApproxMatchForward", ([&] { + approxmatch<<<32,512>>>(b, n, m, xyz1.data(), xyz2.data(), match.data(), temp.data()); + })); + THCudaCheck(cudaGetLastError()); + + return match; +} + + +/******************************** +* Forward kernel for matchcost +*********************************/ + +template +__global__ void matchcost(int b,int n,int m,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,const scalar_t * __restrict__ match,scalar_t * __restrict__ out){ + __shared__ scalar_t allsum[512]; + const int Block=1024; + __shared__ scalar_t buf[Block*3]; + for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,out); +//} + +/* MatchCost forward interface +Input: + xyz1: (B, N1, 3) # dataset_points + xyz2: (B, N2, 3) # query_points + match: (B, N2, N1) +Output: + cost: (B) +*/ +at::Tensor MatchCostForward( + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match){ + const auto b = xyz1.size(0); + const auto n = xyz1.size(1); + const auto m = xyz2.size(1); + + CHECK_EQ(xyz2.size(0), b); + CHECK_EQ(xyz1.size(2), 3); + CHECK_EQ(xyz2.size(2), 3); + CHECK_INPUT(xyz1); + CHECK_INPUT(xyz2); + + auto cost = at::zeros({b}, xyz1.type()); + + AT_DISPATCH_FLOATING_TYPES(xyz1.scalar_type(), "MatchCostForward", ([&] { + matchcost<<<32,512>>>(b, n, m, xyz1.data(), xyz2.data(), match.data(), cost.data()); + })); + THCudaCheck(cudaGetLastError()); + + return cost; +} + + +/******************************** +* matchcostgrad2 kernel +*********************************/ + +template +__global__ void matchcostgrad2(int b,int n,int m,const scalar_t * __restrict__ grad_cost,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,const scalar_t * __restrict__ match,scalar_t * __restrict__ grad2){ + __shared__ scalar_t sum_grad[256*3]; + for (int i=blockIdx.x;i +__global__ void matchcostgrad1(int b,int n,int m,const scalar_t * __restrict__ grad_cost,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,const scalar_t * __restrict__ match,scalar_t * __restrict__ grad1){ + for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,grad1); +// matchcostgrad2<<>>(b,n,m,xyz1,xyz2,match,grad2); +//} + + +/* MatchCost backward interface +Input: + grad_cost: (B) # gradients on cost + xyz1: (B, N1, 3) # dataset_points + xyz2: (B, N2, 3) # query_points + match: (B, N2, N1) +Output: + grad1: (B, N1, 3) + grad2: (B, N2, 3) +*/ +std::vector MatchCostBackward( + const at::Tensor grad_cost, + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match){ + const auto b = xyz1.size(0); + const auto n = xyz1.size(1); + const auto m = xyz2.size(1); + + CHECK_EQ(xyz2.size(0), b); + CHECK_EQ(xyz1.size(2), 3); + CHECK_EQ(xyz2.size(2), 3); + CHECK_INPUT(xyz1); + CHECK_INPUT(xyz2); + + auto grad1 = at::zeros({b, n, 3}, xyz1.type()); + auto grad2 = at::zeros({b, m, 3}, xyz1.type()); + + AT_DISPATCH_FLOATING_TYPES(xyz1.scalar_type(), "MatchCostBackward", ([&] { + matchcostgrad1<<<32,512>>>(b, n, m, grad_cost.data(), xyz1.data(), xyz2.data(), match.data(), grad1.data()); + matchcostgrad2<<>>(b, n, m, grad_cost.data(), xyz1.data(), xyz2.data(), match.data(), grad2.data()); + })); + THCudaCheck(cudaGetLastError()); + + return std::vector({grad1, grad2}); +} + +#endif diff --git a/zoo/PointBERT/extensions/emd/emd.py b/zoo/PointBERT/extensions/emd/emd.py new file mode 100644 index 0000000..1776306 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/emd.py @@ -0,0 +1,72 @@ +import torch +import emd_cuda + + +class EarthMoverDistanceFunction(torch.autograd.Function): + @staticmethod + def forward(ctx, xyz1, xyz2): + xyz1 = xyz1.contiguous() + xyz2 = xyz2.contiguous() + assert xyz1.is_cuda and xyz2.is_cuda, "Only support cuda currently." + match = emd_cuda.approxmatch_forward(xyz1, xyz2) + cost = emd_cuda.matchcost_forward(xyz1, xyz2, match) + ctx.save_for_backward(xyz1, xyz2, match) + return cost + + @staticmethod + def backward(ctx, grad_cost): + xyz1, xyz2, match = ctx.saved_tensors + grad_cost = grad_cost.contiguous() + grad_xyz1, grad_xyz2 = emd_cuda.matchcost_backward(grad_cost, xyz1, xyz2, match) + return grad_xyz1, grad_xyz2 + + + + +class earth_mover_distance(torch.nn.Module): + f''' emd + ''' + def __init__(self): + super().__init__() + + def forward(self, xyz1, xyz2, transpose=False): + """Earth Mover Distance (Approx) + + Args: + xyz1 (torch.Tensor): (b, n1, 3) + xyz2 (torch.Tensor): (b, n2, 3) + transpose (bool): whether to transpose inputs as it might be BCN format. + Extensions only support BNC format. + + Returns: + cost (torch.Tensor): (b) + + """ + + cost = EarthMoverDistanceFunction.apply(xyz1, xyz2) + cost = cost / xyz1.size(1) + + return cost.mean() +# def earth_mover_distance(xyz1, xyz2, transpose=True): +# """Earth Mover Distance (Approx) + +# Args: +# xyz1 (torch.Tensor): (b, 3, n1) +# xyz2 (torch.Tensor): (b, 3, n1) +# transpose (bool): whether to transpose inputs as it might be BCN format. +# Extensions only support BNC format. + +# Returns: +# cost (torch.Tensor): (b) + +# """ +# if xyz1.dim() == 2: +# xyz1 = xyz1.unsqueeze(0) +# if xyz2.dim() == 2: +# xyz2 = xyz2.unsqueeze(0) +# if transpose: +# xyz1 = xyz1.transpose(1, 2) +# xyz2 = xyz2.transpose(1, 2) +# cost = EarthMoverDistanceFunction.apply(xyz1, xyz2) +# return cost + diff --git a/zoo/PointBERT/extensions/emd/setup.py b/zoo/PointBERT/extensions/emd/setup.py new file mode 100644 index 0000000..f648c3e --- /dev/null +++ b/zoo/PointBERT/extensions/emd/setup.py @@ -0,0 +1,27 @@ +"""Setup extension + +Notes: + If extra_compile_args is provided, you need to provide different instances for different extensions. + Refer to https://github.com/pytorch/pytorch/issues/20169 + +""" + +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + + +setup( + name='emd_ext', + ext_modules=[ + CUDAExtension( + name='emd_cuda', + sources=[ + 'cuda/emd.cpp', + 'cuda/emd_kernel.cu', + ], + extra_compile_args={'cxx': ['-g'], 'nvcc': ['-O2']} + ), + ], + cmdclass={ + 'build_ext': BuildExtension + }) diff --git a/zoo/PointBERT/extensions/emd/test_emd_loss.py b/zoo/PointBERT/extensions/emd/test_emd_loss.py new file mode 100644 index 0000000..20dfa02 --- /dev/null +++ b/zoo/PointBERT/extensions/emd/test_emd_loss.py @@ -0,0 +1,45 @@ +import torch +import numpy as np +import time +from emd import earth_mover_distance + +# gt +p1 = torch.from_numpy(np.array([[[1.7, -0.1, 0.1], [0.1, 1.2, 0.3]]], dtype=np.float32)).cuda() +p1 = p1.repeat(3, 1, 1) +p2 = torch.from_numpy(np.array([[[0.3, 1.8, 0.2], [1.2, -0.2, 0.3]]], dtype=np.float32)).cuda() +p2 = p2.repeat(3, 1, 1) +print(p1) +print(p2) +print(p1.shape) +p1.requires_grad = True +p2.requires_grad = True + +gt_dist = (((p1[0, 0] - p2[0, 1])**2).sum() + ((p1[0, 1] - p2[0, 0])**2).sum()) / 2 + \ + (((p1[1, 0] - p2[1, 1])**2).sum() + ((p1[1, 1] - p2[1, 0])**2).sum()) * 2 + \ + (((p1[2, 0] - p2[2, 1])**2).sum() + ((p1[2, 1] - p2[2, 0])**2).sum()) / 3 +print('gt_dist: ', gt_dist) + +gt_dist.backward() +print(p1.grad) +print(p2.grad) + +# emd +p1 = torch.from_numpy(np.array([[[1.7, -0.1, 0.1], [0.1, 1.2, 0.3]]], dtype=np.float32)).cuda() +p1 = p1.repeat(3, 1, 1) +p2 = torch.from_numpy(np.array([[[0.3, 1.8, 0.2], [1.2, -0.2, 0.3]]], dtype=np.float32)).cuda() +p2 = p2.repeat(3, 1, 1) +print(p1) +print(p2) +p1.requires_grad = True +p2.requires_grad = True + +d = earth_mover_distance(p1, p2, transpose=False) +print(d) + +loss = d[0] / 2 + d[1] * 2 + d[2] / 3 +print(loss) + +loss.backward() +print(p1.grad) +print(p2.grad) + diff --git a/zoo/PointBERT/fig/pointbert.png b/zoo/PointBERT/fig/pointbert.png new file mode 100644 index 0000000..aedd1c6 Binary files /dev/null and b/zoo/PointBERT/fig/pointbert.png differ diff --git a/zoo/PointBERT/fig/recon.png b/zoo/PointBERT/fig/recon.png new file mode 100644 index 0000000..e9a6a75 Binary files /dev/null and b/zoo/PointBERT/fig/recon.png differ diff --git a/zoo/PointBERT/install.sh b/zoo/PointBERT/install.sh new file mode 100644 index 0000000..b954808 --- /dev/null +++ b/zoo/PointBERT/install.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh +HOME=`pwd` + +# Chamfer Distance +cd $HOME/extensions/chamfer_dist +python setup.py install --user + +# EMD +cd $HOME/extensions/emd +python setup.py install --user diff --git a/zoo/PointBERT/main.py b/zoo/PointBERT/main.py new file mode 100644 index 0000000..9cd0bf5 --- /dev/null +++ b/zoo/PointBERT/main.py @@ -0,0 +1,72 @@ +from tools import run_net +from tools import test_net +from utils import parser, dist_utils, misc +from utils.logger import * +from utils.config import * +import time +import os +import torch +from tensorboardX import SummaryWriter + +def main(): + # args + args = parser.get_args() + # CUDA + args.use_gpu = torch.cuda.is_available() + if args.use_gpu: + torch.backends.cudnn.benchmark = True + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + args.distributed = False + else: + args.distributed = True + dist_utils.init_dist(args.launcher) + # re-set gpu_ids with distributed training mode + _, world_size = dist_utils.get_dist_info() + args.world_size = world_size + # logger + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = os.path.join(args.experiment_path, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, name=args.log_name) + # define the tensorboard writer + if not args.test: + if args.local_rank == 0: + train_writer = SummaryWriter(os.path.join(args.tfboard_path, 'train')) + val_writer = SummaryWriter(os.path.join(args.tfboard_path, 'test')) + else: + train_writer = None + val_writer = None + # config + config = get_config(args, logger = logger) + # batch size + if args.distributed: + assert config.total_bs % world_size == 0 + config.dataset.train.others.bs = config.total_bs // world_size + config.dataset.val.others.bs = 1 + config.dataset.test.others.bs = 1 + else: + config.dataset.train.others.bs = config.total_bs + config.dataset.val.others.bs = 1 + config.dataset.test.others.bs = 1 + # log + log_args_to_file(args, 'args', logger = logger) + log_config_to_file(config, 'config', logger = logger) + # exit() + logger.info(f'Distributed training: {args.distributed}') + # set random seeds + if args.seed is not None: + logger.info(f'Set random seed to {args.seed}, ' + f'deterministic: {args.deterministic}') + misc.set_random_seed(args.seed + args.local_rank, deterministic=args.deterministic) # seed + rank, for augmentation + if args.distributed: + assert args.local_rank == torch.distributed.get_rank() + + # run + if args.test: + test_net(args, config) + else: + run_net(args, config, train_writer, val_writer) + + +if __name__ == '__main__': + main() diff --git a/zoo/PointBERT/main_BERT.py b/zoo/PointBERT/main_BERT.py new file mode 100644 index 0000000..0951050 --- /dev/null +++ b/zoo/PointBERT/main_BERT.py @@ -0,0 +1,90 @@ +from tools import BERT_pretrain_run_net as pretrain +from tools import BERT_finetune_run_net as finetune +from tools import BERT_test_run_net as test_net +from utils import parser, dist_utils, misc +from utils.logger import * +from utils.config import * +import time +import os +import torch +from tensorboardX import SummaryWriter + +def main(): + # args + args = parser.get_args() + # CUDA + args.use_gpu = torch.cuda.is_available() + if args.use_gpu: + torch.backends.cudnn.benchmark = True + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + args.distributed = False + else: + args.distributed = True + dist_utils.init_dist(args.launcher) + # re-set gpu_ids with distributed training mode + _, world_size = dist_utils.get_dist_info() + args.world_size = world_size + # logger + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = os.path.join(args.experiment_path, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, name=args.log_name) + # define the tensorboard writer + if not args.test: + if args.local_rank == 0: + train_writer = SummaryWriter(os.path.join(args.tfboard_path, 'train')) + val_writer = SummaryWriter(os.path.join(args.tfboard_path, 'test')) + else: + train_writer = None + val_writer = None + # config + config = get_config(args, logger = logger) + # batch size + if args.distributed: + assert config.total_bs % world_size == 0 + config.dataset.train.others.bs = config.total_bs // world_size + if config.dataset.get('extra_train'): + config.dataset.extra_train.others.bs = config.total_bs // world_size * 2 + config.dataset.val.others.bs = config.total_bs // world_size * 2 + if config.dataset.get('test'): + config.dataset.test.others.bs = config.total_bs // world_size + else: + config.dataset.train.others.bs = config.total_bs + if config.dataset.get('extra_train'): + config.dataset.extra_train.others.bs = config.total_bs * 2 + config.dataset.val.others.bs = config.total_bs * 2 + if config.dataset.get('test'): + config.dataset.test.others.bs = config.total_bs + # log + log_args_to_file(args, 'args', logger = logger) + log_config_to_file(config, 'config', logger = logger) + # exit() + logger.info(f'Distributed training: {args.distributed}') + # set random seeds + if args.seed is not None: + logger.info(f'Set random seed to {args.seed}, ' + f'deterministic: {args.deterministic}') + misc.set_random_seed(args.seed + args.local_rank, deterministic=args.deterministic) # seed + rank, for augmentation + if args.distributed: + assert args.local_rank == torch.distributed.get_rank() + + if args.shot != -1: + config.dataset.train.others.shot = args.shot + config.dataset.train.others.way = args.way + config.dataset.train.others.fold = args.fold + config.dataset.val.others.shot = args.shot + config.dataset.val.others.way = args.way + config.dataset.val.others.fold = args.fold + + # run + if args.test: + test_net(args, config) + else: + if args.finetune_model or args.scratch_model: + finetune(args, config, train_writer, val_writer) + else: + pretrain(args, config, train_writer, val_writer) + + +if __name__ == '__main__': + main() diff --git a/zoo/PointBERT/models/Point_BERT.py b/zoo/PointBERT/models/Point_BERT.py new file mode 100644 index 0000000..14ddf0c --- /dev/null +++ b/zoo/PointBERT/models/Point_BERT.py @@ -0,0 +1,604 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import timm +from timm.models.layers import DropPath, trunc_normal_ +from .dvae import Group +from .dvae import DiscreteVAE, Encoder + +from .build import MODELS +from utils import misc +from utils.checkpoint import get_missing_parameters_message, get_unexpected_parameters_message +from utils.logger import * +import random + + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + 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] # make torchscript happy (cannot use tensor as tuple) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + 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 + +class Block(nn.Module): + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + +class TransformerEncoder(nn.Module): + """ Transformer Encoder without hierarchical structure + """ + def __init__(self, embed_dim=768, depth=4, num_heads=12, mlp_ratio=4., qkv_bias=False, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.): + super().__init__() + + self.blocks = nn.ModuleList([ + Block( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path = drop_path_rate[i] if isinstance(drop_path_rate, list) else drop_path_rate + ) + for i in range(depth)]) + + def forward(self, x, pos): + for _, block in enumerate(self.blocks): + x = block(x + pos) + return x + +@MODELS.register_module() +class PointTransformer(nn.Module): + def __init__(self, config, **kwargs): + super().__init__() + self.config = config + + self.trans_dim = config.trans_dim + self.depth = config.depth + self.drop_path_rate = config.drop_path_rate + self.cls_dim = config.cls_dim + self.num_heads = config.num_heads + + self.group_size = config.group_size + self.num_group = config.num_group + # grouper + self.group_divider = Group(num_group = self.num_group, group_size = self.group_size) + # define the encoder + self.encoder_dims = config.encoder_dims + self.encoder = Encoder(encoder_channel = self.encoder_dims) + # bridge encoder and transformer + self.reduce_dim = nn.Linear(self.encoder_dims, self.trans_dim) + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.trans_dim)) + self.cls_pos = nn.Parameter(torch.randn(1, 1, self.trans_dim)) + + self.pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim) + ) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] + self.blocks = TransformerEncoder( + embed_dim = self.trans_dim, + depth = self.depth, + drop_path_rate = dpr, + num_heads = self.num_heads + ) + + self.norm = nn.LayerNorm(self.trans_dim) + + self.cls_head_finetune = nn.Sequential( + nn.Linear(self.trans_dim * 2, 256), + nn.ReLU(inplace=True), + nn.Dropout(0.5), + nn.Linear(256, self.cls_dim) + ) + + self.build_loss_func() + + def build_loss_func(self): + self.loss_ce = nn.CrossEntropyLoss() + + def get_loss_acc(self, pred, gt, smoothing=True): + # import pdb; pdb.set_trace() + gt = gt.contiguous().view(-1).long() + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gt.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = self.loss_ce(pred, gt.long()) + + pred = pred.argmax(-1) + acc = (pred == gt).sum() / float(gt.size(0)) + + return loss, acc * 100 + + + def load_model_from_ckpt(self, bert_ckpt_path): + ckpt = torch.load(bert_ckpt_path) + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + for k in list(base_ckpt.keys()): + if k.startswith('transformer_q') and not k.startswith('transformer_q.cls_head'): + base_ckpt[k[len('transformer_q.'):]] = base_ckpt[k] + elif k.startswith('base_model'): + base_ckpt[k[len('base_model.'):]] = base_ckpt[k] + del base_ckpt[k] + + + incompatible = self.load_state_dict(base_ckpt, strict=False) + + if incompatible.missing_keys: + print_log('missing_keys', logger = 'Transformer') + print_log( + get_missing_parameters_message(incompatible.missing_keys), + logger = 'Transformer' + ) + if incompatible.unexpected_keys: + print_log('unexpected_keys', logger = 'Transformer') + print_log( + get_unexpected_parameters_message(incompatible.unexpected_keys), + logger = 'Transformer' + ) + + print_log(f'[Transformer] Successful Loading the ckpt from {bert_ckpt_path}', logger = 'Transformer') + + + def forward(self, pts): + # divide the point clo ud in the same form. This is important + neighborhood, center = self.group_divider(pts) + # encoder the input cloud blocks + group_input_tokens = self.encoder(neighborhood) # B G N + group_input_tokens = self.reduce_dim(group_input_tokens) + # prepare cls + cls_tokens = self.cls_token.expand(group_input_tokens.size(0), -1, -1) + cls_pos = self.cls_pos.expand(group_input_tokens.size(0), -1, -1) + # add pos embedding + pos = self.pos_embed(center) + # final input + x = torch.cat((cls_tokens, group_input_tokens), dim=1) + pos = torch.cat((cls_pos, pos), dim=1) + # transformer + x = self.blocks(x, pos) + x = self.norm(x) + concat_f = torch.cat([x[:,0], x[:, 1:].max(1)[0]], dim = -1) + ret = self.cls_head_finetune(concat_f) + return ret + +class MaskTransformer(nn.Module): + def __init__(self, config, **kwargs): + super().__init__() + self.config = config + # define the transformer argparse + self.mask_ratio = config.transformer_config.mask_ratio + self.trans_dim = config.transformer_config.trans_dim + self.depth = config.transformer_config.depth + self.drop_path_rate = config.transformer_config.drop_path_rate + self.cls_dim = config.transformer_config.cls_dim + self.replace_pob = config.transformer_config.replace_pob + self.num_heads = config.transformer_config.num_heads + print_log(f'[Transformer args] {config.transformer_config}', logger = 'dVAE BERT') + # define the encoder + self.encoder_dims = config.dvae_config.encoder_dims + self.encoder = Encoder(encoder_channel = self.encoder_dims) + # bridge encoder and transformer + self.reduce_dim = nn.Linear(self.encoder_dims, self.trans_dim) + try: + self.mask_rand = config.mask_rand + except: + self.mask_rand = False + + # define the learnable tokens + self.cls_token = nn.Parameter(torch.randn(1, 1, self.trans_dim)) + self.mask_token = nn.Parameter(torch.randn(1, 1, self.trans_dim)) + self.cls_pos = nn.Parameter(torch.randn(1, 1, self.trans_dim)) + + # pos embedding for each patch + self.pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim) + ) + + # define the transformer blocks + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] + self.blocks = TransformerEncoder( + embed_dim = self.trans_dim, + depth = self.depth, + drop_path_rate = dpr, + num_heads = self.num_heads + ) + # layer norm + self.norm = nn.LayerNorm(self.trans_dim) + # head for token classification + self.num_tokens = config.dvae_config.num_tokens + self.lm_head = nn.Linear(self.trans_dim, self.num_tokens) + # head for cls contrast + self.cls_head = nn.Sequential( + nn.Linear(self.trans_dim, self.cls_dim), + nn.GELU(), + nn.Linear(self.cls_dim, self.cls_dim) + ) + # initialize the learnable tokens + trunc_normal_(self.cls_token, std=.02) + trunc_normal_(self.cls_pos, std=.02) + trunc_normal_(self.mask_token, std=.02) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv1d): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + def _prepare_encoder(self, dvae_ckpt): + ckpt = torch.load(dvae_ckpt, map_location='cpu') + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + encoder_ckpt = {k.replace("encoder.", ""): v for k, v in base_ckpt.items() if 'encoder' in k} + + self.encoder.load_state_dict(encoder_ckpt, strict=True) + print_log(f'[Encoder] Successful Loading the ckpt for encoder from {dvae_ckpt}', logger = 'dVAE BERT') + + + def _mask_center(self, center, noaug = False): + ''' + center : B G 3 + -------------- + mask : B G (bool) + ''' + # skip the mask + if noaug or self.mask_ratio[1] == 0: + return torch.zeros(center.shape[:2]).bool() + # mask a continuous part + mask_idx = [] + for points in center: + # G 3 + points = points.unsqueeze(0) # 1 G 3 + index = random.randint(0, points.size(1) - 1) + distance_matrix = torch.norm(points[:, index].reshape(1, 1, 3) - points, p =2 ,dim = -1) # 1 1 3 - 1 G 3 -> 1 G + + idx = torch.argsort(distance_matrix, dim=-1, descending=False)[0] # G + ratio = random.uniform(self.mask_ratio[0], self.mask_ratio[1]) + mask_num = int(ratio * len(idx)) + + mask = torch.zeros(len(idx)) + mask[idx[:mask_num]] = 1 + mask_idx.append(mask.bool()) + + bool_masked_pos = torch.stack(mask_idx).to(center.device) # B G + + return bool_masked_pos + + def _mask_center_rand(self, center, noaug = False): + ''' + center : B G 3 + -------------- + mask : B G (bool) + ''' + # skip the mask + if noaug or self.mask_ratio[1] == 0: + return torch.zeros(center.shape[:2]).bool() + + ratio = random.random() * (self.mask_ratio[1] - self.mask_ratio[0]) + self.mask_ratio[0] + bool_masked_pos = (torch.rand(center.shape[:2]) < ratio).bool().to(center.device) + + return bool_masked_pos + + + def _random_replace(self, group_input_tokens, bool_masked_pos, noaug = False): + ''' + group_input_tokens : B G C + bool_masked_pos : B G + ----------------- + replaced_group_input_tokens: B G C + ''' + # skip replace + if noaug or self.replace_pob == 0: + return group_input_tokens, bool_masked_pos + + replace_mask = (torch.rand(group_input_tokens.shape[:2]) < self.replace_pob).to(bool_masked_pos.device).bool() + replace_mask = (replace_mask & ~bool_masked_pos) # do not replace the mask pos + + overall_mask = (replace_mask + bool_masked_pos).bool().to(bool_masked_pos.device) # True for flake input + + detached_group_input_tokens = group_input_tokens.detach() + flatten_group_input_tokens = detached_group_input_tokens.reshape(detached_group_input_tokens.size(0) * detached_group_input_tokens.size(1), detached_group_input_tokens.size(2)) + idx = torch.randperm(flatten_group_input_tokens.shape[0]) + shuffled_group_input_tokens = flatten_group_input_tokens[idx].reshape(detached_group_input_tokens.size(0), detached_group_input_tokens.size(1), detached_group_input_tokens.size(2)) + + replace_mask = replace_mask.unsqueeze(-1).type_as(detached_group_input_tokens) + replaced_group_input_tokens = group_input_tokens * (1 - replace_mask) + shuffled_group_input_tokens * replace_mask + return replaced_group_input_tokens, overall_mask + + def forward(self, neighborhood, center, return_all_tokens = False, only_cls_tokens = False, noaug = False): + # generate mask + if self.mask_rand: + bool_masked_pos = self._mask_center_rand(center, noaug = noaug) # B G + else: + bool_masked_pos = self._mask_center(center, noaug = noaug) # B G + # encoder the input cloud blocks + group_input_tokens = self.encoder(neighborhood) # B G N + group_input_tokens = self.reduce_dim(group_input_tokens) + # replace the point + replaced_group_input_tokens, overall_mask = self._random_replace(group_input_tokens, bool_masked_pos.clone(), noaug = noaug) + batch_size, seq_len, _ = replaced_group_input_tokens.size() + # prepare cls and mask + cls_tokens = self.cls_token.expand(batch_size, -1, -1) + cls_pos = self.cls_pos.expand(batch_size, -1, -1) + mask_token = self.mask_token.expand(batch_size, seq_len, -1) + # mask the input tokens + w = bool_masked_pos.unsqueeze(-1).type_as(mask_token) + maksed_group_input_tokens = replaced_group_input_tokens * (1 - w) + mask_token * w + # add pos embedding + pos = self.pos_embed(center) + # final input + x = torch.cat((cls_tokens, maksed_group_input_tokens), dim=1) + pos = torch.cat((cls_pos, pos), dim=1) + # transformer + x = self.blocks(x, pos) + x = self.norm(x) + # only return the cls feature, for moco contrast + if only_cls_tokens: + return self.cls_head(x[:, 0]) + logits = self.lm_head(x[:, 1:]) + if return_all_tokens: + return self.cls_head(x[:, 0]), logits + else: + # return the flake logits + return self.cls_head(x[:, 0]), logits[~overall_mask], logits[overall_mask], overall_mask # reduce the Batch dim + +@MODELS.register_module() +class Point_BERT(nn.Module): + def __init__(self, config): + super().__init__() + print_log(f'[Point_BERT] build dVAE_BERT ...', logger ='Point_BERT') + self.config = config + self.m = config.m + self.T = config.T + self.K = config.K + + self.moco_loss = config.transformer_config.moco_loss + self.dvae_loss = config.transformer_config.dvae_loss + self.cutmix_loss = config.transformer_config.cutmix_loss + + self.return_all_tokens = config.transformer_config.return_all_tokens + if self.return_all_tokens: + print_log(f'[Point_BERT] Point_BERT calc the loss for all token ...', logger ='Point_BERT') + else: + print_log(f'[Point_BERT] Point_BERT [NOT] calc the loss for all token ...', logger ='Point_BERT') + + self.transformer_q = MaskTransformer(config) + self.transformer_q._prepare_encoder(self.config.dvae_config.ckpt) + + self.transformer_k = MaskTransformer(config) + for param_q, param_k in zip(self.transformer_q.parameters(), self.transformer_k.parameters()): + param_k.data.copy_(param_q.data) # initialize + param_k.requires_grad = False # not update by gradient + + self.dvae = DiscreteVAE(config.dvae_config) + self._prepare_dvae() + + for param in self.dvae.parameters(): + param.requires_grad = False + + self.group_size = config.dvae_config.group_size + self.num_group = config.dvae_config.num_group + + print_log(f'[Point_BERT Group] cutmix_BERT divide point cloud into G{self.num_group} x S{self.group_size} points ...', logger ='Point_BERT') + self.group_divider = Group(num_group = self.num_group, group_size = self.group_size) + + # create the queue + self.register_buffer("queue", torch.randn(self.transformer_q.cls_dim, self.K)) + self.queue = nn.functional.normalize(self.queue, dim=0) + self.register_buffer("queue_ptr", torch.zeros(1, dtype=torch.long)) + + # loss + self.build_loss_func() + + def _prepare_dvae(self): + dvae_ckpt = self.config.dvae_config.ckpt + ckpt = torch.load(dvae_ckpt, map_location='cpu') + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + self.dvae.load_state_dict(base_ckpt, strict=True) + print_log(f'[dVAE] Successful Loading the ckpt for dvae from {dvae_ckpt}', logger ='Point_BERT') + + + @torch.no_grad() + def _momentum_update_key_encoder(self): + """ + Momentum update of the key encoder + """ + for param_q, param_k in zip(self.transformer_q.parameters(), self.transformer_k.parameters()): + param_k.data = param_k.data * self.m + param_q.data * (1. - self.m) + + @torch.no_grad() + def _dequeue_and_enqueue(self, keys): + # gather keys before updating queue + keys = concat_all_gather(keys) + + batch_size = keys.shape[0] + + ptr = int(self.queue_ptr) + assert self.K % batch_size == 0 # for simplicity + + # replace the keys at ptr (dequeue and enqueue) + self.queue[:, ptr:ptr + batch_size] = keys.T + ptr = (ptr + batch_size) % self.K # move pointer + + self.queue_ptr[0] = ptr + + def build_loss_func(self): + self.loss_ce = nn.CrossEntropyLoss() + self.loss_ce_batch = nn.CrossEntropyLoss(reduction='none') + + def forward_eval(self, pts): + with torch.no_grad(): + neighborhood, center = self.group_divider(pts) + cls_feature = self.transformer_q(neighborhood, center, only_cls_tokens = True, noaug = True) + return cls_feature + + def _mixup_pc(self, neighborhood, center, dvae_label): + ''' + neighborhood : B G M 3 + center: B G 3 + dvae_label: B G + ---------------------- + mixup_ratio: /alpha: + mixup_label = alpha * origin + (1 - alpha) * flip + + ''' + mixup_ratio = torch.rand(neighborhood.size(0)) + mixup_mask = torch.rand(neighborhood.shape[:2]) < mixup_ratio.unsqueeze(-1) + mixup_mask = mixup_mask.type_as(neighborhood) + mixup_neighborhood = neighborhood * mixup_mask.unsqueeze(-1).unsqueeze(-1) + neighborhood.flip(0) * (1 - mixup_mask.unsqueeze(-1).unsqueeze(-1)) + mixup_center = center * mixup_mask.unsqueeze(-1) + center.flip(0) * (1 - mixup_mask.unsqueeze(-1)) + mixup_dvae_label = dvae_label * mixup_mask + dvae_label.flip(0) * (1 - mixup_mask) + + return mixup_ratio.to(neighborhood.device), mixup_neighborhood, mixup_center, mixup_dvae_label.long() + + + def forward(self, pts, noaug = False, **kwargs): + if noaug: + return self.forward_eval(pts) + else: + # divide the point cloud in the same form. This is important + neighborhood, center = self.group_divider(pts) + # produce the gt point tokens + with torch.no_grad(): + gt_logits = self.dvae.encoder(neighborhood) + gt_logits = self.dvae.dgcnn_1(gt_logits, center) # B G N + dvae_label = gt_logits.argmax(-1).long() # B G + # forward the query model in mask style 1. + if self.return_all_tokens: + q_cls_feature, logits = self.transformer_q(neighborhood, center, return_all_tokens = self.return_all_tokens) # logits : N G C + else: + q_cls_feature, real_logits, flake_logits, mask = self.transformer_q(neighborhood, center, return_all_tokens = self.return_all_tokens) # logits : N' C where N' is the mask.sum() + q_cls_feature = nn.functional.normalize(q_cls_feature, dim=1) + + mixup_ratio, mixup_neighborhood, mixup_center, mix_dvae_label = self._mixup_pc(neighborhood, center, dvae_label) + if self.return_all_tokens: + mixup_cls_feature, mixup_logits = self.transformer_q(mixup_neighborhood, mixup_center, return_all_tokens = self.return_all_tokens) + else: + mixup_cls_feature, mixup_real_logits, mixup_flake_logits, mixup_mask = self.transformer_q(mixup_neighborhood, mixup_center, return_all_tokens = self.return_all_tokens) + mixup_cls_feature = nn.functional.normalize(mixup_cls_feature, dim=1) + + # compute key features + with torch.no_grad(): # no gradient to keys + self._momentum_update_key_encoder() # update the key encoder + k_cls_feature = self.transformer_k(neighborhood, center, only_cls_tokens = True) # keys: NxC + k_cls_feature = nn.functional.normalize(k_cls_feature, dim=1) + + if self.moco_loss: + # ce loss with moco contrast + l_pos = torch.einsum('nc, nc->n', [q_cls_feature, k_cls_feature]).unsqueeze(-1) # n 1 + l_neg = torch.einsum('nc, ck->nk', [q_cls_feature, self.queue.clone().detach()]) # n k + ce_logits = torch.cat([l_pos, l_neg], dim=1) + ce_logits /= self.T + labels = torch.zeros(l_pos.shape[0], dtype=torch.long).to(pts.device) + moco_loss = self.loss_ce(ce_logits, labels) + else: + moco_loss = torch.tensor(0.).to(pts.device) + + if self.dvae_loss: + if self.return_all_tokens: + dvae_loss = self.loss_ce(logits.reshape(-1, logits.size(-1)), dvae_label.reshape(-1,)) + \ + self.loss_ce(mixup_logits.reshape(-1, mixup_logits.size(-1)), mix_dvae_label.reshape(-1,)) + else: + dvae_loss = self.loss_ce(flake_logits, dvae_label[mask]) + \ + self.loss_ce(mixup_flake_logits, mix_dvae_label[mixup_mask]) + else: + dvae_loss = torch.tensor(0.).to(pts.device) + + if self.cutmix_loss: + l_pos = torch.einsum('nc, mc->nm', [mixup_cls_feature, k_cls_feature]) # n n + l_neg = torch.einsum('nc, ck->nk', [mixup_cls_feature, self.queue.clone().detach()]) # n k + ce_logits = torch.cat([l_pos, l_neg], dim=1) + ce_logits /= self.T + labels = torch.arange(l_pos.shape[0], dtype=torch.long).to(pts.device) + cutmix_loss = (mixup_ratio * self.loss_ce_batch(ce_logits, labels) + (1 - mixup_ratio) * self.loss_ce_batch(ce_logits, labels.flip(0))).mean() + else: + cutmix_loss = torch.tensor(0.).to(pts.device) + self._dequeue_and_enqueue(k_cls_feature) + return moco_loss + dvae_loss, cutmix_loss + + +# utils +@torch.no_grad() +def concat_all_gather(tensor): + """ + Performs all_gather operation on the provided tensors. + *** Warning ***: torch.distributed.all_gather has no gradient. + """ + tensors_gather = [torch.ones_like(tensor) + for _ in range(torch.distributed.get_world_size())] + torch.distributed.all_gather(tensors_gather, tensor, async_op=False) + + output = torch.cat(tensors_gather, dim=0) + return output \ No newline at end of file diff --git a/zoo/PointBERT/models/__init__.py b/zoo/PointBERT/models/__init__.py new file mode 100644 index 0000000..81da8e7 --- /dev/null +++ b/zoo/PointBERT/models/__init__.py @@ -0,0 +1,3 @@ +from .build import build_model_from_cfg +import models.dvae +import models.Point_BERT \ No newline at end of file diff --git a/zoo/PointBERT/models/build.py b/zoo/PointBERT/models/build.py new file mode 100644 index 0000000..d0c8f59 --- /dev/null +++ b/zoo/PointBERT/models/build.py @@ -0,0 +1,17 @@ +from utils import registry + + +MODELS = registry.Registry('models') + + +def build_model_from_cfg(cfg, **kwargs): + """ + Build a dataset, defined by `dataset_name`. + Args: + cfg (eDICT): + Returns: + Dataset: a constructed dataset specified by dataset_name. + """ + return MODELS.build(cfg, **kwargs) + + diff --git a/zoo/PointBERT/models/dvae.py b/zoo/PointBERT/models/dvae.py new file mode 100644 index 0000000..1c1d96f --- /dev/null +++ b/zoo/PointBERT/models/dvae.py @@ -0,0 +1,349 @@ +import torch.nn as nn +import torch +import torch.nn.functional as F +from knn_cuda import KNN +from pointnet2_ops import pointnet2_utils +from .build import MODELS +from utils import misc +from extensions.chamfer_dist import ChamferDistanceL1, ChamferDistanceL2 +from extensions.emd import emd +from utils.checkpoint import get_missing_parameters_message, get_unexpected_parameters_message +from utils.logger import * + + + +from knn_cuda import KNN +knn = KNN(k=4, transpose_mode=False) + + +class DGCNN(nn.Module): + def __init__(self, encoder_channel, output_channel): + super().__init__() + ''' + K has to be 16 + ''' + self.input_trans = nn.Conv1d(encoder_channel, 128, 1) + + self.layer1 = nn.Sequential(nn.Conv2d(256, 256, kernel_size=1, bias=False), + nn.GroupNorm(4, 256), + nn.LeakyReLU(negative_slope=0.2) + ) + + self.layer2 = nn.Sequential(nn.Conv2d(512, 512, kernel_size=1, bias=False), + nn.GroupNorm(4, 512), + nn.LeakyReLU(negative_slope=0.2) + ) + + self.layer3 = nn.Sequential(nn.Conv2d(1024, 512, kernel_size=1, bias=False), + nn.GroupNorm(4, 512), + nn.LeakyReLU(negative_slope=0.2) + ) + + self.layer4 = nn.Sequential(nn.Conv2d(1024, 1024, kernel_size=1, bias=False), + nn.GroupNorm(4, 1024), + nn.LeakyReLU(negative_slope=0.2) + ) + + self.layer5 = nn.Sequential(nn.Conv1d(2304, output_channel, kernel_size=1, bias=False), + nn.GroupNorm(4, output_channel), + nn.LeakyReLU(negative_slope=0.2) + ) + + @staticmethod + def get_graph_feature(coor_q, x_q, coor_k, x_k): + + # coor: bs, 3, np, x: bs, c, np + + k = 4 + batch_size = x_k.size(0) + num_points_k = x_k.size(2) + num_points_q = x_q.size(2) + + with torch.no_grad(): + _, idx = knn(coor_k, coor_q) # bs k np + assert idx.shape[1] == k + idx_base = torch.arange(0, batch_size, device=x_q.device).view(-1, 1, 1) * num_points_k + idx = idx + idx_base + idx = idx.view(-1) + num_dims = x_k.size(1) + x_k = x_k.transpose(2, 1).contiguous() + feature = x_k.view(batch_size * num_points_k, -1)[idx, :] + feature = feature.view(batch_size, k, num_points_q, num_dims).permute(0, 3, 2, 1).contiguous() + x_q = x_q.view(batch_size, num_dims, num_points_q, 1).expand(-1, -1, -1, k) + feature = torch.cat((feature - x_q, x_q), dim=1) + return feature + + def forward(self, f, coor): + # f: B G C + # coor: B G 3 + + # bs 3 N bs C N + feature_list = [] + coor = coor.transpose(1, 2).contiguous() # B 3 N + f = f.transpose(1, 2).contiguous() # B C N + f = self.input_trans(f) # B 128 N + + f = self.get_graph_feature(coor, f, coor, f) # B 256 N k + f = self.layer1(f) # B 256 N k + f = f.max(dim=-1, keepdim=False)[0] # B 256 N + feature_list.append(f) + + f = self.get_graph_feature(coor, f, coor, f) # B 512 N k + f = self.layer2(f) # B 512 N k + f = f.max(dim=-1, keepdim=False)[0] # B 512 N + feature_list.append(f) + + f = self.get_graph_feature(coor, f, coor, f) # B 1024 N k + f = self.layer3(f) # B 512 N k + f = f.max(dim=-1, keepdim=False)[0] # B 512 N + feature_list.append(f) + + f = self.get_graph_feature(coor, f, coor, f) # B 1024 N k + f = self.layer4(f) # B 1024 N k + f = f.max(dim=-1, keepdim=False)[0] # B 1024 N + feature_list.append(f) + + f = torch.cat(feature_list, dim = 1) # B 2304 N + + f = self.layer5(f) # B C' N + + f = f.transpose(-1, -2) + + return f + +### ref https://github.com/Strawberry-Eat-Mango/PCT_Pytorch/blob/main/util.py ### +def knn_point(nsample, xyz, new_xyz): + """ + Input: + nsample: max sample number in local region + xyz: all points, [B, N, C] + new_xyz: query points, [B, S, C] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + sqrdists = square_distance(new_xyz, xyz) + _, group_idx = torch.topk(sqrdists, nsample, dim = -1, largest=False, sorted=False) + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + dist += torch.sum(src ** 2, -1).view(B, N, 1) + dist += torch.sum(dst ** 2, -1).view(B, 1, M) + return dist + +class Group(nn.Module): + def __init__(self, num_group, group_size): + super().__init__() + self.num_group = num_group + self.group_size = group_size + # self.knn = KNN(k=self.group_size, transpose_mode=True) + + def forward(self, xyz): + ''' + input: B N 3 + --------------------------- + output: B G M 3 + center : B G 3 + ''' + batch_size, num_points, _ = xyz.shape + # fps the centers out + center = misc.fps(xyz, self.num_group) # B G 3 + # knn to get the neighborhood + # _, idx = self.knn(xyz, center) # B G M + idx = knn_point(self.group_size, xyz, center) # B G M + assert idx.size(1) == self.num_group + assert idx.size(2) == self.group_size + idx_base = torch.arange(0, batch_size, device=xyz.device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.view(-1) + neighborhood = xyz.view(batch_size * num_points, -1)[idx, :] + neighborhood = neighborhood.view(batch_size, self.num_group, self.group_size, 3).contiguous() + # normalize + neighborhood = neighborhood - center.unsqueeze(2) + return neighborhood, center + +class Encoder(nn.Module): + def __init__(self, encoder_channel): + super().__init__() + self.encoder_channel = encoder_channel + self.first_conv = nn.Sequential( + nn.Conv1d(3, 128, 1), + nn.BatchNorm1d(128), + nn.ReLU(inplace=True), + nn.Conv1d(128, 256, 1) + ) + self.second_conv = nn.Sequential( + nn.Conv1d(512, 512, 1), + nn.BatchNorm1d(512), + nn.ReLU(inplace=True), + nn.Conv1d(512, self.encoder_channel, 1) + ) + def forward(self, point_groups): + ''' + point_groups : B G N 3 + ----------------- + feature_global : B G C + ''' + bs, g, n , _ = point_groups.shape + point_groups = point_groups.reshape(bs * g, n, 3) + # encoder + feature = self.first_conv(point_groups.transpose(2,1)) # BG 256 n + feature_global = torch.max(feature,dim=2,keepdim=True)[0] # BG 256 1 + feature = torch.cat([feature_global.expand(-1,-1,n), feature], dim=1)# BG 512 n + feature = self.second_conv(feature) # BG 1024 n + feature_global = torch.max(feature, dim=2, keepdim=False)[0] # BG 1024 + return feature_global.reshape(bs, g, self.encoder_channel) + +class Decoder(nn.Module): + def __init__(self, encoder_channel, num_fine): + super().__init__() + self.num_fine = num_fine + self.grid_size = 2 + self.num_coarse = self.num_fine // 4 + assert num_fine % 4 == 0 + + self.mlp = nn.Sequential( + nn.Linear(encoder_channel, 1024), + nn.ReLU(inplace=True), + nn.Linear(1024, 1024), + nn.ReLU(inplace=True), + nn.Linear(1024, 3 * self.num_coarse) + ) + self.final_conv = nn.Sequential( + nn.Conv1d(encoder_channel + 3 + 2, 512, 1), + nn.BatchNorm1d(512), + nn.ReLU(inplace=True), + nn.Conv1d(512, 512, 1), + nn.BatchNorm1d(512), + nn.ReLU(inplace=True), + nn.Conv1d(512, 3, 1) + ) + a = torch.linspace(-0.05, 0.05, steps=self.grid_size, dtype=torch.float).view(1, self.grid_size).expand(self.grid_size, self.grid_size).reshape(1, -1) + b = torch.linspace(-0.05, 0.05, steps=self.grid_size, dtype=torch.float).view(self.grid_size, 1).expand(self.grid_size, self.grid_size).reshape(1, -1) + self.folding_seed = torch.cat([a, b], dim=0).view(1, 2, self.grid_size ** 2) # 1 2 S + + + def forward(self, feature_global): + ''' + feature_global : B G C + ------- + coarse : B G M 3 + fine : B G N 3 + + ''' + bs, g, c = feature_global.shape + feature_global = feature_global.reshape(bs * g, c) + + coarse = self.mlp(feature_global).reshape(bs * g, self.num_coarse, 3) # BG M 3 + + point_feat = coarse.unsqueeze(2).expand(-1, -1, self.grid_size**2, -1) # BG (M) S 3 + point_feat = point_feat.reshape(bs * g, self.num_fine, 3).transpose(2, 1) # BG 3 N + + seed = self.folding_seed.unsqueeze(2).expand(bs * g, -1, self.num_coarse, -1) # BG 2 M (S) + seed = seed.reshape(bs * g, -1, self.num_fine).to(feature_global.device) # BG 2 N + + feature_global = feature_global.unsqueeze(2).expand(-1, -1, self.num_fine) # BG 1024 N + feat = torch.cat([feature_global, seed, point_feat], dim=1) # BG C N + + center = coarse.unsqueeze(2).expand(-1, -1, self.grid_size**2, -1) # BG (M) S 3 + center = center.reshape(bs * g, self.num_fine, 3).transpose(2, 1) # BG 3 N + + fine = self.final_conv(feat) + center # BG 3 N + fine = fine.reshape(bs, g, 3, self.num_fine).transpose(-1, -2) + coarse = coarse.reshape(bs, g, self.num_coarse, 3) + return coarse, fine + + +@MODELS.register_module() +class DiscreteVAE(nn.Module): + def __init__(self, config, **kwargs): + super().__init__() + self.group_size = config.group_size + self.num_group = config.num_group + self.encoder_dims = config.encoder_dims + self.tokens_dims = config.tokens_dims + + self.decoder_dims = config.decoder_dims + self.num_tokens = config.num_tokens + + + self.group_divider = Group(num_group = self.num_group, group_size = self.group_size) + self.encoder = Encoder(encoder_channel = self.encoder_dims) + self.dgcnn_1 = DGCNN(encoder_channel = self.encoder_dims, output_channel = self.num_tokens) + self.codebook = nn.Parameter(torch.randn(self.num_tokens, self.tokens_dims)) + + self.dgcnn_2 = DGCNN(encoder_channel = self.tokens_dims, output_channel = self.decoder_dims) + self.decoder = Decoder(encoder_channel = self.decoder_dims, num_fine = self.group_size) + self.build_loss_func() + + + + def build_loss_func(self): + self.loss_func_cdl1 = ChamferDistanceL1().cuda() + self.loss_func_cdl2 = ChamferDistanceL2().cuda() + self.loss_func_emd = emd().cuda() + + def recon_loss(self, ret, gt): + whole_coarse, whole_fine, coarse, fine, group_gt, _ = ret + + bs, g, _, _ = coarse.shape + + coarse = coarse.reshape(bs*g, -1, 3).contiguous() + fine = fine.reshape(bs*g, -1, 3).contiguous() + group_gt = group_gt.reshape(bs*g, -1, 3).contiguous() + + loss_coarse_block = self.loss_func_cdl1(coarse, group_gt) + loss_fine_block = self.loss_func_cdl1(fine, group_gt) + + loss_recon = loss_coarse_block + loss_fine_block + + return loss_recon + + def get_loss(self, ret, gt): + + # reconstruction loss + loss_recon = self.recon_loss(ret, gt) + # kl divergence + logits = ret[-1] # B G N + softmax = F.softmax(logits, dim=-1) + mean_softmax = softmax.mean(dim=1) + log_qy = torch.log(mean_softmax) + log_uniform = torch.log(torch.tensor([1. / self.num_tokens], device = gt.device)) + loss_klv = F.kl_div(log_qy, log_uniform.expand(log_qy.size(0), log_qy.size(1)), None, None, 'batchmean', log_target = True) + + return loss_recon, loss_klv + + + def forward(self, inp, temperature = 1., hard = False, **kwargs): + neighborhood, center = self.group_divider(inp) + logits = self.encoder(neighborhood) # B G C + logits = self.dgcnn_1(logits, center) # B G N + soft_one_hot = F.gumbel_softmax(logits, tau = temperature, dim = 2, hard = hard) # B G N + sampled = torch.einsum('b g n, n c -> b g c', soft_one_hot, self.codebook) # B G C + feature = self.dgcnn_2(sampled, center) + coarse, fine = self.decoder(feature) + + + with torch.no_grad(): + whole_fine = (fine + center.unsqueeze(2)).reshape(inp.size(0), -1, 3) + whole_coarse = (coarse + center.unsqueeze(2)).reshape(inp.size(0), -1, 3) + + assert fine.size(2) == self.group_size + ret = (whole_coarse, whole_fine, coarse, fine, neighborhood, logits) + return ret + diff --git a/zoo/PointBERT/requirements.txt b/zoo/PointBERT/requirements.txt new file mode 100644 index 0000000..2caec9e --- /dev/null +++ b/zoo/PointBERT/requirements.txt @@ -0,0 +1,14 @@ +argparse +easydict +h5py +matplotlib +numpy +open3d==0.9 +opencv-python +pyyaml +scipy +tensorboardX +timm==0.4.5 +tqdm +transforms3d +termcolor \ No newline at end of file diff --git a/zoo/PointBERT/scripts/dist_train_BERT.sh b/zoo/PointBERT/scripts/dist_train_BERT.sh new file mode 100644 index 0000000..3e37270 --- /dev/null +++ b/zoo/PointBERT/scripts/dist_train_BERT.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -x +NGPUS=$1 +PORT=$2 +PY_ARGS=${@:3} + +python -m torch.distributed.launch --master_port=${PORT} --nproc_per_node=${NGPUS} main_BERT.py --launcher pytorch --sync_bn ${PY_ARGS} diff --git a/zoo/PointBERT/scripts/test.sh b/zoo/PointBERT/scripts/test.sh new file mode 100644 index 0000000..ff6db9e --- /dev/null +++ b/zoo/PointBERT/scripts/test.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -x +GPUS=$1 +PY_ARGS=${@:2} + +CUDA_VISIBLE_DEVICES=${GPUS} python main.py --test ${PY_ARGS} \ No newline at end of file diff --git a/zoo/PointBERT/scripts/test_BERT.sh b/zoo/PointBERT/scripts/test_BERT.sh new file mode 100644 index 0000000..a939a49 --- /dev/null +++ b/zoo/PointBERT/scripts/test_BERT.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -x +GPUS=$1 + +PY_ARGS=${@:2} + +CUDA_VISIBLE_DEVICES=${GPUS} python main_BERT.py --test --deterministic ${PY_ARGS} \ No newline at end of file diff --git a/zoo/PointBERT/scripts/train.sh b/zoo/PointBERT/scripts/train.sh new file mode 100644 index 0000000..bcac799 --- /dev/null +++ b/zoo/PointBERT/scripts/train.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -x +GPUS=$1 + +PY_ARGS=${@:2} + +CUDA_VISIBLE_DEVICES=${GPUS} python main.py ${PY_ARGS} diff --git a/zoo/PointBERT/scripts/train_BERT.sh b/zoo/PointBERT/scripts/train_BERT.sh new file mode 100644 index 0000000..c4501f4 --- /dev/null +++ b/zoo/PointBERT/scripts/train_BERT.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -x +GPUS=$1 + +PY_ARGS=${@:2} + +CUDA_VISIBLE_DEVICES=${GPUS} python main_BERT.py ${PY_ARGS} diff --git a/zoo/PointBERT/segmentation/__pycache__/provider.cpython-37.pyc b/zoo/PointBERT/segmentation/__pycache__/provider.cpython-37.pyc new file mode 100644 index 0000000..441a7e7 Binary files /dev/null and b/zoo/PointBERT/segmentation/__pycache__/provider.cpython-37.pyc differ diff --git a/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_shape_names.txt b/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_shape_names.txt new file mode 100644 index 0000000..1b2a397 --- /dev/null +++ b/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_shape_names.txt @@ -0,0 +1,40 @@ +airplane +bathtub +bed +bench +bookshelf +bottle +bowl +car +chair +cone +cup +curtain +desk +door +dresser +flower_pot +glass_box +guitar +keyboard +lamp +laptop +mantel +monitor +night_stand +person +piano +plant +radio +range_hood +sink +sofa +stairs +stool +table +tent +toilet +tv_stand +vase +wardrobe +xbox diff --git a/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_test.txt b/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_test.txt new file mode 100644 index 0000000..b0bc483 --- /dev/null +++ b/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_test.txt @@ -0,0 +1,2468 @@ +airplane_0627 +airplane_0628 +airplane_0629 +airplane_0630 +airplane_0631 +airplane_0632 +airplane_0633 +airplane_0634 +airplane_0635 +airplane_0636 +airplane_0637 +airplane_0638 +airplane_0639 +airplane_0640 +airplane_0641 +airplane_0642 +airplane_0643 +airplane_0644 +airplane_0645 +airplane_0646 +airplane_0647 +airplane_0648 +airplane_0649 +airplane_0650 +airplane_0651 +airplane_0652 +airplane_0653 +airplane_0654 +airplane_0655 +airplane_0656 +airplane_0657 +airplane_0658 +airplane_0659 +airplane_0660 +airplane_0661 +airplane_0662 +airplane_0663 +airplane_0664 +airplane_0665 +airplane_0666 +airplane_0667 +airplane_0668 +airplane_0669 +airplane_0670 +airplane_0671 +airplane_0672 +airplane_0673 +airplane_0674 +airplane_0675 +airplane_0676 +airplane_0677 +airplane_0678 +airplane_0679 +airplane_0680 +airplane_0681 +airplane_0682 +airplane_0683 +airplane_0684 +airplane_0685 +airplane_0686 +airplane_0687 +airplane_0688 +airplane_0689 +airplane_0690 +airplane_0691 +airplane_0692 +airplane_0693 +airplane_0694 +airplane_0695 +airplane_0696 +airplane_0697 +airplane_0698 +airplane_0699 +airplane_0700 +airplane_0701 +airplane_0702 +airplane_0703 +airplane_0704 +airplane_0705 +airplane_0706 +airplane_0707 +airplane_0708 +airplane_0709 +airplane_0710 +airplane_0711 +airplane_0712 +airplane_0713 +airplane_0714 +airplane_0715 +airplane_0716 +airplane_0717 +airplane_0718 +airplane_0719 +airplane_0720 +airplane_0721 +airplane_0722 +airplane_0723 +airplane_0724 +airplane_0725 +airplane_0726 +bathtub_0107 +bathtub_0108 +bathtub_0109 +bathtub_0110 +bathtub_0111 +bathtub_0112 +bathtub_0113 +bathtub_0114 +bathtub_0115 +bathtub_0116 +bathtub_0117 +bathtub_0118 +bathtub_0119 +bathtub_0120 +bathtub_0121 +bathtub_0122 +bathtub_0123 +bathtub_0124 +bathtub_0125 +bathtub_0126 +bathtub_0127 +bathtub_0128 +bathtub_0129 +bathtub_0130 +bathtub_0131 +bathtub_0132 +bathtub_0133 +bathtub_0134 +bathtub_0135 +bathtub_0136 +bathtub_0137 +bathtub_0138 +bathtub_0139 +bathtub_0140 +bathtub_0141 +bathtub_0142 +bathtub_0143 +bathtub_0144 +bathtub_0145 +bathtub_0146 +bathtub_0147 +bathtub_0148 +bathtub_0149 +bathtub_0150 +bathtub_0151 +bathtub_0152 +bathtub_0153 +bathtub_0154 +bathtub_0155 +bathtub_0156 +bed_0516 +bed_0517 +bed_0518 +bed_0519 +bed_0520 +bed_0521 +bed_0522 +bed_0523 +bed_0524 +bed_0525 +bed_0526 +bed_0527 +bed_0528 +bed_0529 +bed_0530 +bed_0531 +bed_0532 +bed_0533 +bed_0534 +bed_0535 +bed_0536 +bed_0537 +bed_0538 +bed_0539 +bed_0540 +bed_0541 +bed_0542 +bed_0543 +bed_0544 +bed_0545 +bed_0546 +bed_0547 +bed_0548 +bed_0549 +bed_0550 +bed_0551 +bed_0552 +bed_0553 +bed_0554 +bed_0555 +bed_0556 +bed_0557 +bed_0558 +bed_0559 +bed_0560 +bed_0561 +bed_0562 +bed_0563 +bed_0564 +bed_0565 +bed_0566 +bed_0567 +bed_0568 +bed_0569 +bed_0570 +bed_0571 +bed_0572 +bed_0573 +bed_0574 +bed_0575 +bed_0576 +bed_0577 +bed_0578 +bed_0579 +bed_0580 +bed_0581 +bed_0582 +bed_0583 +bed_0584 +bed_0585 +bed_0586 +bed_0587 +bed_0588 +bed_0589 +bed_0590 +bed_0591 +bed_0592 +bed_0593 +bed_0594 +bed_0595 +bed_0596 +bed_0597 +bed_0598 +bed_0599 +bed_0600 +bed_0601 +bed_0602 +bed_0603 +bed_0604 +bed_0605 +bed_0606 +bed_0607 +bed_0608 +bed_0609 +bed_0610 +bed_0611 +bed_0612 +bed_0613 +bed_0614 +bed_0615 +bench_0174 +bench_0175 +bench_0176 +bench_0177 +bench_0178 +bench_0179 +bench_0180 +bench_0181 +bench_0182 +bench_0183 +bench_0184 +bench_0185 +bench_0186 +bench_0187 +bench_0188 +bench_0189 +bench_0190 +bench_0191 +bench_0192 +bench_0193 +bookshelf_0573 +bookshelf_0574 +bookshelf_0575 +bookshelf_0576 +bookshelf_0577 +bookshelf_0578 +bookshelf_0579 +bookshelf_0580 +bookshelf_0581 +bookshelf_0582 +bookshelf_0583 +bookshelf_0584 +bookshelf_0585 +bookshelf_0586 +bookshelf_0587 +bookshelf_0588 +bookshelf_0589 +bookshelf_0590 +bookshelf_0591 +bookshelf_0592 +bookshelf_0593 +bookshelf_0594 +bookshelf_0595 +bookshelf_0596 +bookshelf_0597 +bookshelf_0598 +bookshelf_0599 +bookshelf_0600 +bookshelf_0601 +bookshelf_0602 +bookshelf_0603 +bookshelf_0604 +bookshelf_0605 +bookshelf_0606 +bookshelf_0607 +bookshelf_0608 +bookshelf_0609 +bookshelf_0610 +bookshelf_0611 +bookshelf_0612 +bookshelf_0613 +bookshelf_0614 +bookshelf_0615 +bookshelf_0616 +bookshelf_0617 +bookshelf_0618 +bookshelf_0619 +bookshelf_0620 +bookshelf_0621 +bookshelf_0622 +bookshelf_0623 +bookshelf_0624 +bookshelf_0625 +bookshelf_0626 +bookshelf_0627 +bookshelf_0628 +bookshelf_0629 +bookshelf_0630 +bookshelf_0631 +bookshelf_0632 +bookshelf_0633 +bookshelf_0634 +bookshelf_0635 +bookshelf_0636 +bookshelf_0637 +bookshelf_0638 +bookshelf_0639 +bookshelf_0640 +bookshelf_0641 +bookshelf_0642 +bookshelf_0643 +bookshelf_0644 +bookshelf_0645 +bookshelf_0646 +bookshelf_0647 +bookshelf_0648 +bookshelf_0649 +bookshelf_0650 +bookshelf_0651 +bookshelf_0652 +bookshelf_0653 +bookshelf_0654 +bookshelf_0655 +bookshelf_0656 +bookshelf_0657 +bookshelf_0658 +bookshelf_0659 +bookshelf_0660 +bookshelf_0661 +bookshelf_0662 +bookshelf_0663 +bookshelf_0664 +bookshelf_0665 +bookshelf_0666 +bookshelf_0667 +bookshelf_0668 +bookshelf_0669 +bookshelf_0670 +bookshelf_0671 +bookshelf_0672 +bottle_0336 +bottle_0337 +bottle_0338 +bottle_0339 +bottle_0340 +bottle_0341 +bottle_0342 +bottle_0343 +bottle_0344 +bottle_0345 +bottle_0346 +bottle_0347 +bottle_0348 +bottle_0349 +bottle_0350 +bottle_0351 +bottle_0352 +bottle_0353 +bottle_0354 +bottle_0355 +bottle_0356 +bottle_0357 +bottle_0358 +bottle_0359 +bottle_0360 +bottle_0361 +bottle_0362 +bottle_0363 +bottle_0364 +bottle_0365 +bottle_0366 +bottle_0367 +bottle_0368 +bottle_0369 +bottle_0370 +bottle_0371 +bottle_0372 +bottle_0373 +bottle_0374 +bottle_0375 +bottle_0376 +bottle_0377 +bottle_0378 +bottle_0379 +bottle_0380 +bottle_0381 +bottle_0382 +bottle_0383 +bottle_0384 +bottle_0385 +bottle_0386 +bottle_0387 +bottle_0388 +bottle_0389 +bottle_0390 +bottle_0391 +bottle_0392 +bottle_0393 +bottle_0394 +bottle_0395 +bottle_0396 +bottle_0397 +bottle_0398 +bottle_0399 +bottle_0400 +bottle_0401 +bottle_0402 +bottle_0403 +bottle_0404 +bottle_0405 +bottle_0406 +bottle_0407 +bottle_0408 +bottle_0409 +bottle_0410 +bottle_0411 +bottle_0412 +bottle_0413 +bottle_0414 +bottle_0415 +bottle_0416 +bottle_0417 +bottle_0418 +bottle_0419 +bottle_0420 +bottle_0421 +bottle_0422 +bottle_0423 +bottle_0424 +bottle_0425 +bottle_0426 +bottle_0427 +bottle_0428 +bottle_0429 +bottle_0430 +bottle_0431 +bottle_0432 +bottle_0433 +bottle_0434 +bottle_0435 +bowl_0065 +bowl_0066 +bowl_0067 +bowl_0068 +bowl_0069 +bowl_0070 +bowl_0071 +bowl_0072 +bowl_0073 +bowl_0074 +bowl_0075 +bowl_0076 +bowl_0077 +bowl_0078 +bowl_0079 +bowl_0080 +bowl_0081 +bowl_0082 +bowl_0083 +bowl_0084 +car_0198 +car_0199 +car_0200 +car_0201 +car_0202 +car_0203 +car_0204 +car_0205 +car_0206 +car_0207 +car_0208 +car_0209 +car_0210 +car_0211 +car_0212 +car_0213 +car_0214 +car_0215 +car_0216 +car_0217 +car_0218 +car_0219 +car_0220 +car_0221 +car_0222 +car_0223 +car_0224 +car_0225 +car_0226 +car_0227 +car_0228 +car_0229 +car_0230 +car_0231 +car_0232 +car_0233 +car_0234 +car_0235 +car_0236 +car_0237 +car_0238 +car_0239 +car_0240 +car_0241 +car_0242 +car_0243 +car_0244 +car_0245 +car_0246 +car_0247 +car_0248 +car_0249 +car_0250 +car_0251 +car_0252 +car_0253 +car_0254 +car_0255 +car_0256 +car_0257 +car_0258 +car_0259 +car_0260 +car_0261 +car_0262 +car_0263 +car_0264 +car_0265 +car_0266 +car_0267 +car_0268 +car_0269 +car_0270 +car_0271 +car_0272 +car_0273 +car_0274 +car_0275 +car_0276 +car_0277 +car_0278 +car_0279 +car_0280 +car_0281 +car_0282 +car_0283 +car_0284 +car_0285 +car_0286 +car_0287 +car_0288 +car_0289 +car_0290 +car_0291 +car_0292 +car_0293 +car_0294 +car_0295 +car_0296 +car_0297 +chair_0890 +chair_0891 +chair_0892 +chair_0893 +chair_0894 +chair_0895 +chair_0896 +chair_0897 +chair_0898 +chair_0899 +chair_0900 +chair_0901 +chair_0902 +chair_0903 +chair_0904 +chair_0905 +chair_0906 +chair_0907 +chair_0908 +chair_0909 +chair_0910 +chair_0911 +chair_0912 +chair_0913 +chair_0914 +chair_0915 +chair_0916 +chair_0917 +chair_0918 +chair_0919 +chair_0920 +chair_0921 +chair_0922 +chair_0923 +chair_0924 +chair_0925 +chair_0926 +chair_0927 +chair_0928 +chair_0929 +chair_0930 +chair_0931 +chair_0932 +chair_0933 +chair_0934 +chair_0935 +chair_0936 +chair_0937 +chair_0938 +chair_0939 +chair_0940 +chair_0941 +chair_0942 +chair_0943 +chair_0944 +chair_0945 +chair_0946 +chair_0947 +chair_0948 +chair_0949 +chair_0950 +chair_0951 +chair_0952 +chair_0953 +chair_0954 +chair_0955 +chair_0956 +chair_0957 +chair_0958 +chair_0959 +chair_0960 +chair_0961 +chair_0962 +chair_0963 +chair_0964 +chair_0965 +chair_0966 +chair_0967 +chair_0968 +chair_0969 +chair_0970 +chair_0971 +chair_0972 +chair_0973 +chair_0974 +chair_0975 +chair_0976 +chair_0977 +chair_0978 +chair_0979 +chair_0980 +chair_0981 +chair_0982 +chair_0983 +chair_0984 +chair_0985 +chair_0986 +chair_0987 +chair_0988 +chair_0989 +cone_0168 +cone_0169 +cone_0170 +cone_0171 +cone_0172 +cone_0173 +cone_0174 +cone_0175 +cone_0176 +cone_0177 +cone_0178 +cone_0179 +cone_0180 +cone_0181 +cone_0182 +cone_0183 +cone_0184 +cone_0185 +cone_0186 +cone_0187 +cup_0080 +cup_0081 +cup_0082 +cup_0083 +cup_0084 +cup_0085 +cup_0086 +cup_0087 +cup_0088 +cup_0089 +cup_0090 +cup_0091 +cup_0092 +cup_0093 +cup_0094 +cup_0095 +cup_0096 +cup_0097 +cup_0098 +cup_0099 +curtain_0139 +curtain_0140 +curtain_0141 +curtain_0142 +curtain_0143 +curtain_0144 +curtain_0145 +curtain_0146 +curtain_0147 +curtain_0148 +curtain_0149 +curtain_0150 +curtain_0151 +curtain_0152 +curtain_0153 +curtain_0154 +curtain_0155 +curtain_0156 +curtain_0157 +curtain_0158 +desk_0201 +desk_0202 +desk_0203 +desk_0204 +desk_0205 +desk_0206 +desk_0207 +desk_0208 +desk_0209 +desk_0210 +desk_0211 +desk_0212 +desk_0213 +desk_0214 +desk_0215 +desk_0216 +desk_0217 +desk_0218 +desk_0219 +desk_0220 +desk_0221 +desk_0222 +desk_0223 +desk_0224 +desk_0225 +desk_0226 +desk_0227 +desk_0228 +desk_0229 +desk_0230 +desk_0231 +desk_0232 +desk_0233 +desk_0234 +desk_0235 +desk_0236 +desk_0237 +desk_0238 +desk_0239 +desk_0240 +desk_0241 +desk_0242 +desk_0243 +desk_0244 +desk_0245 +desk_0246 +desk_0247 +desk_0248 +desk_0249 +desk_0250 +desk_0251 +desk_0252 +desk_0253 +desk_0254 +desk_0255 +desk_0256 +desk_0257 +desk_0258 +desk_0259 +desk_0260 +desk_0261 +desk_0262 +desk_0263 +desk_0264 +desk_0265 +desk_0266 +desk_0267 +desk_0268 +desk_0269 +desk_0270 +desk_0271 +desk_0272 +desk_0273 +desk_0274 +desk_0275 +desk_0276 +desk_0277 +desk_0278 +desk_0279 +desk_0280 +desk_0281 +desk_0282 +desk_0283 +desk_0284 +desk_0285 +desk_0286 +door_0110 +door_0111 +door_0112 +door_0113 +door_0114 +door_0115 +door_0116 +door_0117 +door_0118 +door_0119 +door_0120 +door_0121 +door_0122 +door_0123 +door_0124 +door_0125 +door_0126 +door_0127 +door_0128 +door_0129 +dresser_0201 +dresser_0202 +dresser_0203 +dresser_0204 +dresser_0205 +dresser_0206 +dresser_0207 +dresser_0208 +dresser_0209 +dresser_0210 +dresser_0211 +dresser_0212 +dresser_0213 +dresser_0214 +dresser_0215 +dresser_0216 +dresser_0217 +dresser_0218 +dresser_0219 +dresser_0220 +dresser_0221 +dresser_0222 +dresser_0223 +dresser_0224 +dresser_0225 +dresser_0226 +dresser_0227 +dresser_0228 +dresser_0229 +dresser_0230 +dresser_0231 +dresser_0232 +dresser_0233 +dresser_0234 +dresser_0235 +dresser_0236 +dresser_0237 +dresser_0238 +dresser_0239 +dresser_0240 +dresser_0241 +dresser_0242 +dresser_0243 +dresser_0244 +dresser_0245 +dresser_0246 +dresser_0247 +dresser_0248 +dresser_0249 +dresser_0250 +dresser_0251 +dresser_0252 +dresser_0253 +dresser_0254 +dresser_0255 +dresser_0256 +dresser_0257 +dresser_0258 +dresser_0259 +dresser_0260 +dresser_0261 +dresser_0262 +dresser_0263 +dresser_0264 +dresser_0265 +dresser_0266 +dresser_0267 +dresser_0268 +dresser_0269 +dresser_0270 +dresser_0271 +dresser_0272 +dresser_0273 +dresser_0274 +dresser_0275 +dresser_0276 +dresser_0277 +dresser_0278 +dresser_0279 +dresser_0280 +dresser_0281 +dresser_0282 +dresser_0283 +dresser_0284 +dresser_0285 +dresser_0286 +flower_pot_0150 +flower_pot_0151 +flower_pot_0152 +flower_pot_0153 +flower_pot_0154 +flower_pot_0155 +flower_pot_0156 +flower_pot_0157 +flower_pot_0158 +flower_pot_0159 +flower_pot_0160 +flower_pot_0161 +flower_pot_0162 +flower_pot_0163 +flower_pot_0164 +flower_pot_0165 +flower_pot_0166 +flower_pot_0167 +flower_pot_0168 +flower_pot_0169 +glass_box_0172 +glass_box_0173 +glass_box_0174 +glass_box_0175 +glass_box_0176 +glass_box_0177 +glass_box_0178 +glass_box_0179 +glass_box_0180 +glass_box_0181 +glass_box_0182 +glass_box_0183 +glass_box_0184 +glass_box_0185 +glass_box_0186 +glass_box_0187 +glass_box_0188 +glass_box_0189 +glass_box_0190 +glass_box_0191 +glass_box_0192 +glass_box_0193 +glass_box_0194 +glass_box_0195 +glass_box_0196 +glass_box_0197 +glass_box_0198 +glass_box_0199 +glass_box_0200 +glass_box_0201 +glass_box_0202 +glass_box_0203 +glass_box_0204 +glass_box_0205 +glass_box_0206 +glass_box_0207 +glass_box_0208 +glass_box_0209 +glass_box_0210 +glass_box_0211 +glass_box_0212 +glass_box_0213 +glass_box_0214 +glass_box_0215 +glass_box_0216 +glass_box_0217 +glass_box_0218 +glass_box_0219 +glass_box_0220 +glass_box_0221 +glass_box_0222 +glass_box_0223 +glass_box_0224 +glass_box_0225 +glass_box_0226 +glass_box_0227 +glass_box_0228 +glass_box_0229 +glass_box_0230 +glass_box_0231 +glass_box_0232 +glass_box_0233 +glass_box_0234 +glass_box_0235 +glass_box_0236 +glass_box_0237 +glass_box_0238 +glass_box_0239 +glass_box_0240 +glass_box_0241 +glass_box_0242 +glass_box_0243 +glass_box_0244 +glass_box_0245 +glass_box_0246 +glass_box_0247 +glass_box_0248 +glass_box_0249 +glass_box_0250 +glass_box_0251 +glass_box_0252 +glass_box_0253 +glass_box_0254 +glass_box_0255 +glass_box_0256 +glass_box_0257 +glass_box_0258 +glass_box_0259 +glass_box_0260 +glass_box_0261 +glass_box_0262 +glass_box_0263 +glass_box_0264 +glass_box_0265 +glass_box_0266 +glass_box_0267 +glass_box_0268 +glass_box_0269 +glass_box_0270 +glass_box_0271 +guitar_0156 +guitar_0157 +guitar_0158 +guitar_0159 +guitar_0160 +guitar_0161 +guitar_0162 +guitar_0163 +guitar_0164 +guitar_0165 +guitar_0166 +guitar_0167 +guitar_0168 +guitar_0169 +guitar_0170 +guitar_0171 +guitar_0172 +guitar_0173 +guitar_0174 +guitar_0175 +guitar_0176 +guitar_0177 +guitar_0178 +guitar_0179 +guitar_0180 +guitar_0181 +guitar_0182 +guitar_0183 +guitar_0184 +guitar_0185 +guitar_0186 +guitar_0187 +guitar_0188 +guitar_0189 +guitar_0190 +guitar_0191 +guitar_0192 +guitar_0193 +guitar_0194 +guitar_0195 +guitar_0196 +guitar_0197 +guitar_0198 +guitar_0199 +guitar_0200 +guitar_0201 +guitar_0202 +guitar_0203 +guitar_0204 +guitar_0205 +guitar_0206 +guitar_0207 +guitar_0208 +guitar_0209 +guitar_0210 +guitar_0211 +guitar_0212 +guitar_0213 +guitar_0214 +guitar_0215 +guitar_0216 +guitar_0217 +guitar_0218 +guitar_0219 +guitar_0220 +guitar_0221 +guitar_0222 +guitar_0223 +guitar_0224 +guitar_0225 +guitar_0226 +guitar_0227 +guitar_0228 +guitar_0229 +guitar_0230 +guitar_0231 +guitar_0232 +guitar_0233 +guitar_0234 +guitar_0235 +guitar_0236 +guitar_0237 +guitar_0238 +guitar_0239 +guitar_0240 +guitar_0241 +guitar_0242 +guitar_0243 +guitar_0244 +guitar_0245 +guitar_0246 +guitar_0247 +guitar_0248 +guitar_0249 +guitar_0250 +guitar_0251 +guitar_0252 +guitar_0253 +guitar_0254 +guitar_0255 +keyboard_0146 +keyboard_0147 +keyboard_0148 +keyboard_0149 +keyboard_0150 +keyboard_0151 +keyboard_0152 +keyboard_0153 +keyboard_0154 +keyboard_0155 +keyboard_0156 +keyboard_0157 +keyboard_0158 +keyboard_0159 +keyboard_0160 +keyboard_0161 +keyboard_0162 +keyboard_0163 +keyboard_0164 +keyboard_0165 +lamp_0125 +lamp_0126 +lamp_0127 +lamp_0128 +lamp_0129 +lamp_0130 +lamp_0131 +lamp_0132 +lamp_0133 +lamp_0134 +lamp_0135 +lamp_0136 +lamp_0137 +lamp_0138 +lamp_0139 +lamp_0140 +lamp_0141 +lamp_0142 +lamp_0143 +lamp_0144 +laptop_0150 +laptop_0151 +laptop_0152 +laptop_0153 +laptop_0154 +laptop_0155 +laptop_0156 +laptop_0157 +laptop_0158 +laptop_0159 +laptop_0160 +laptop_0161 +laptop_0162 +laptop_0163 +laptop_0164 +laptop_0165 +laptop_0166 +laptop_0167 +laptop_0168 +laptop_0169 +mantel_0285 +mantel_0286 +mantel_0287 +mantel_0288 +mantel_0289 +mantel_0290 +mantel_0291 +mantel_0292 +mantel_0293 +mantel_0294 +mantel_0295 +mantel_0296 +mantel_0297 +mantel_0298 +mantel_0299 +mantel_0300 +mantel_0301 +mantel_0302 +mantel_0303 +mantel_0304 +mantel_0305 +mantel_0306 +mantel_0307 +mantel_0308 +mantel_0309 +mantel_0310 +mantel_0311 +mantel_0312 +mantel_0313 +mantel_0314 +mantel_0315 +mantel_0316 +mantel_0317 +mantel_0318 +mantel_0319 +mantel_0320 +mantel_0321 +mantel_0322 +mantel_0323 +mantel_0324 +mantel_0325 +mantel_0326 +mantel_0327 +mantel_0328 +mantel_0329 +mantel_0330 +mantel_0331 +mantel_0332 +mantel_0333 +mantel_0334 +mantel_0335 +mantel_0336 +mantel_0337 +mantel_0338 +mantel_0339 +mantel_0340 +mantel_0341 +mantel_0342 +mantel_0343 +mantel_0344 +mantel_0345 +mantel_0346 +mantel_0347 +mantel_0348 +mantel_0349 +mantel_0350 +mantel_0351 +mantel_0352 +mantel_0353 +mantel_0354 +mantel_0355 +mantel_0356 +mantel_0357 +mantel_0358 +mantel_0359 +mantel_0360 +mantel_0361 +mantel_0362 +mantel_0363 +mantel_0364 +mantel_0365 +mantel_0366 +mantel_0367 +mantel_0368 +mantel_0369 +mantel_0370 +mantel_0371 +mantel_0372 +mantel_0373 +mantel_0374 +mantel_0375 +mantel_0376 +mantel_0377 +mantel_0378 +mantel_0379 +mantel_0380 +mantel_0381 +mantel_0382 +mantel_0383 +mantel_0384 +monitor_0466 +monitor_0467 +monitor_0468 +monitor_0469 +monitor_0470 +monitor_0471 +monitor_0472 +monitor_0473 +monitor_0474 +monitor_0475 +monitor_0476 +monitor_0477 +monitor_0478 +monitor_0479 +monitor_0480 +monitor_0481 +monitor_0482 +monitor_0483 +monitor_0484 +monitor_0485 +monitor_0486 +monitor_0487 +monitor_0488 +monitor_0489 +monitor_0490 +monitor_0491 +monitor_0492 +monitor_0493 +monitor_0494 +monitor_0495 +monitor_0496 +monitor_0497 +monitor_0498 +monitor_0499 +monitor_0500 +monitor_0501 +monitor_0502 +monitor_0503 +monitor_0504 +monitor_0505 +monitor_0506 +monitor_0507 +monitor_0508 +monitor_0509 +monitor_0510 +monitor_0511 +monitor_0512 +monitor_0513 +monitor_0514 +monitor_0515 +monitor_0516 +monitor_0517 +monitor_0518 +monitor_0519 +monitor_0520 +monitor_0521 +monitor_0522 +monitor_0523 +monitor_0524 +monitor_0525 +monitor_0526 +monitor_0527 +monitor_0528 +monitor_0529 +monitor_0530 +monitor_0531 +monitor_0532 +monitor_0533 +monitor_0534 +monitor_0535 +monitor_0536 +monitor_0537 +monitor_0538 +monitor_0539 +monitor_0540 +monitor_0541 +monitor_0542 +monitor_0543 +monitor_0544 +monitor_0545 +monitor_0546 +monitor_0547 +monitor_0548 +monitor_0549 +monitor_0550 +monitor_0551 +monitor_0552 +monitor_0553 +monitor_0554 +monitor_0555 +monitor_0556 +monitor_0557 +monitor_0558 +monitor_0559 +monitor_0560 +monitor_0561 +monitor_0562 +monitor_0563 +monitor_0564 +monitor_0565 +night_stand_0201 +night_stand_0202 +night_stand_0203 +night_stand_0204 +night_stand_0205 +night_stand_0206 +night_stand_0207 +night_stand_0208 +night_stand_0209 +night_stand_0210 +night_stand_0211 +night_stand_0212 +night_stand_0213 +night_stand_0214 +night_stand_0215 +night_stand_0216 +night_stand_0217 +night_stand_0218 +night_stand_0219 +night_stand_0220 +night_stand_0221 +night_stand_0222 +night_stand_0223 +night_stand_0224 +night_stand_0225 +night_stand_0226 +night_stand_0227 +night_stand_0228 +night_stand_0229 +night_stand_0230 +night_stand_0231 +night_stand_0232 +night_stand_0233 +night_stand_0234 +night_stand_0235 +night_stand_0236 +night_stand_0237 +night_stand_0238 +night_stand_0239 +night_stand_0240 +night_stand_0241 +night_stand_0242 +night_stand_0243 +night_stand_0244 +night_stand_0245 +night_stand_0246 +night_stand_0247 +night_stand_0248 +night_stand_0249 +night_stand_0250 +night_stand_0251 +night_stand_0252 +night_stand_0253 +night_stand_0254 +night_stand_0255 +night_stand_0256 +night_stand_0257 +night_stand_0258 +night_stand_0259 +night_stand_0260 +night_stand_0261 +night_stand_0262 +night_stand_0263 +night_stand_0264 +night_stand_0265 +night_stand_0266 +night_stand_0267 +night_stand_0268 +night_stand_0269 +night_stand_0270 +night_stand_0271 +night_stand_0272 +night_stand_0273 +night_stand_0274 +night_stand_0275 +night_stand_0276 +night_stand_0277 +night_stand_0278 +night_stand_0279 +night_stand_0280 +night_stand_0281 +night_stand_0282 +night_stand_0283 +night_stand_0284 +night_stand_0285 +night_stand_0286 +person_0089 +person_0090 +person_0091 +person_0092 +person_0093 +person_0094 +person_0095 +person_0096 +person_0097 +person_0098 +person_0099 +person_0100 +person_0101 +person_0102 +person_0103 +person_0104 +person_0105 +person_0106 +person_0107 +person_0108 +piano_0232 +piano_0233 +piano_0234 +piano_0235 +piano_0236 +piano_0237 +piano_0238 +piano_0239 +piano_0240 +piano_0241 +piano_0242 +piano_0243 +piano_0244 +piano_0245 +piano_0246 +piano_0247 +piano_0248 +piano_0249 +piano_0250 +piano_0251 +piano_0252 +piano_0253 +piano_0254 +piano_0255 +piano_0256 +piano_0257 +piano_0258 +piano_0259 +piano_0260 +piano_0261 +piano_0262 +piano_0263 +piano_0264 +piano_0265 +piano_0266 +piano_0267 +piano_0268 +piano_0269 +piano_0270 +piano_0271 +piano_0272 +piano_0273 +piano_0274 +piano_0275 +piano_0276 +piano_0277 +piano_0278 +piano_0279 +piano_0280 +piano_0281 +piano_0282 +piano_0283 +piano_0284 +piano_0285 +piano_0286 +piano_0287 +piano_0288 +piano_0289 +piano_0290 +piano_0291 +piano_0292 +piano_0293 +piano_0294 +piano_0295 +piano_0296 +piano_0297 +piano_0298 +piano_0299 +piano_0300 +piano_0301 +piano_0302 +piano_0303 +piano_0304 +piano_0305 +piano_0306 +piano_0307 +piano_0308 +piano_0309 +piano_0310 +piano_0311 +piano_0312 +piano_0313 +piano_0314 +piano_0315 +piano_0316 +piano_0317 +piano_0318 +piano_0319 +piano_0320 +piano_0321 +piano_0322 +piano_0323 +piano_0324 +piano_0325 +piano_0326 +piano_0327 +piano_0328 +piano_0329 +piano_0330 +piano_0331 +plant_0241 +plant_0242 +plant_0243 +plant_0244 +plant_0245 +plant_0246 +plant_0247 +plant_0248 +plant_0249 +plant_0250 +plant_0251 +plant_0252 +plant_0253 +plant_0254 +plant_0255 +plant_0256 +plant_0257 +plant_0258 +plant_0259 +plant_0260 +plant_0261 +plant_0262 +plant_0263 +plant_0264 +plant_0265 +plant_0266 +plant_0267 +plant_0268 +plant_0269 +plant_0270 +plant_0271 +plant_0272 +plant_0273 +plant_0274 +plant_0275 +plant_0276 +plant_0277 +plant_0278 +plant_0279 +plant_0280 +plant_0281 +plant_0282 +plant_0283 +plant_0284 +plant_0285 +plant_0286 +plant_0287 +plant_0288 +plant_0289 +plant_0290 +plant_0291 +plant_0292 +plant_0293 +plant_0294 +plant_0295 +plant_0296 +plant_0297 +plant_0298 +plant_0299 +plant_0300 +plant_0301 +plant_0302 +plant_0303 +plant_0304 +plant_0305 +plant_0306 +plant_0307 +plant_0308 +plant_0309 +plant_0310 +plant_0311 +plant_0312 +plant_0313 +plant_0314 +plant_0315 +plant_0316 +plant_0317 +plant_0318 +plant_0319 +plant_0320 +plant_0321 +plant_0322 +plant_0323 +plant_0324 +plant_0325 +plant_0326 +plant_0327 +plant_0328 +plant_0329 +plant_0330 +plant_0331 +plant_0332 +plant_0333 +plant_0334 +plant_0335 +plant_0336 +plant_0337 +plant_0338 +plant_0339 +plant_0340 +radio_0105 +radio_0106 +radio_0107 +radio_0108 +radio_0109 +radio_0110 +radio_0111 +radio_0112 +radio_0113 +radio_0114 +radio_0115 +radio_0116 +radio_0117 +radio_0118 +radio_0119 +radio_0120 +radio_0121 +radio_0122 +radio_0123 +radio_0124 +range_hood_0116 +range_hood_0117 +range_hood_0118 +range_hood_0119 +range_hood_0120 +range_hood_0121 +range_hood_0122 +range_hood_0123 +range_hood_0124 +range_hood_0125 +range_hood_0126 +range_hood_0127 +range_hood_0128 +range_hood_0129 +range_hood_0130 +range_hood_0131 +range_hood_0132 +range_hood_0133 +range_hood_0134 +range_hood_0135 +range_hood_0136 +range_hood_0137 +range_hood_0138 +range_hood_0139 +range_hood_0140 +range_hood_0141 +range_hood_0142 +range_hood_0143 +range_hood_0144 +range_hood_0145 +range_hood_0146 +range_hood_0147 +range_hood_0148 +range_hood_0149 +range_hood_0150 +range_hood_0151 +range_hood_0152 +range_hood_0153 +range_hood_0154 +range_hood_0155 +range_hood_0156 +range_hood_0157 +range_hood_0158 +range_hood_0159 +range_hood_0160 +range_hood_0161 +range_hood_0162 +range_hood_0163 +range_hood_0164 +range_hood_0165 +range_hood_0166 +range_hood_0167 +range_hood_0168 +range_hood_0169 +range_hood_0170 +range_hood_0171 +range_hood_0172 +range_hood_0173 +range_hood_0174 +range_hood_0175 +range_hood_0176 +range_hood_0177 +range_hood_0178 +range_hood_0179 +range_hood_0180 +range_hood_0181 +range_hood_0182 +range_hood_0183 +range_hood_0184 +range_hood_0185 +range_hood_0186 +range_hood_0187 +range_hood_0188 +range_hood_0189 +range_hood_0190 +range_hood_0191 +range_hood_0192 +range_hood_0193 +range_hood_0194 +range_hood_0195 +range_hood_0196 +range_hood_0197 +range_hood_0198 +range_hood_0199 +range_hood_0200 +range_hood_0201 +range_hood_0202 +range_hood_0203 +range_hood_0204 +range_hood_0205 +range_hood_0206 +range_hood_0207 +range_hood_0208 +range_hood_0209 +range_hood_0210 +range_hood_0211 +range_hood_0212 +range_hood_0213 +range_hood_0214 +range_hood_0215 +sink_0129 +sink_0130 +sink_0131 +sink_0132 +sink_0133 +sink_0134 +sink_0135 +sink_0136 +sink_0137 +sink_0138 +sink_0139 +sink_0140 +sink_0141 +sink_0142 +sink_0143 +sink_0144 +sink_0145 +sink_0146 +sink_0147 +sink_0148 +sofa_0681 +sofa_0682 +sofa_0683 +sofa_0684 +sofa_0685 +sofa_0686 +sofa_0687 +sofa_0688 +sofa_0689 +sofa_0690 +sofa_0691 +sofa_0692 +sofa_0693 +sofa_0694 +sofa_0695 +sofa_0696 +sofa_0697 +sofa_0698 +sofa_0699 +sofa_0700 +sofa_0701 +sofa_0702 +sofa_0703 +sofa_0704 +sofa_0705 +sofa_0706 +sofa_0707 +sofa_0708 +sofa_0709 +sofa_0710 +sofa_0711 +sofa_0712 +sofa_0713 +sofa_0714 +sofa_0715 +sofa_0716 +sofa_0717 +sofa_0718 +sofa_0719 +sofa_0720 +sofa_0721 +sofa_0722 +sofa_0723 +sofa_0724 +sofa_0725 +sofa_0726 +sofa_0727 +sofa_0728 +sofa_0729 +sofa_0730 +sofa_0731 +sofa_0732 +sofa_0733 +sofa_0734 +sofa_0735 +sofa_0736 +sofa_0737 +sofa_0738 +sofa_0739 +sofa_0740 +sofa_0741 +sofa_0742 +sofa_0743 +sofa_0744 +sofa_0745 +sofa_0746 +sofa_0747 +sofa_0748 +sofa_0749 +sofa_0750 +sofa_0751 +sofa_0752 +sofa_0753 +sofa_0754 +sofa_0755 +sofa_0756 +sofa_0757 +sofa_0758 +sofa_0759 +sofa_0760 +sofa_0761 +sofa_0762 +sofa_0763 +sofa_0764 +sofa_0765 +sofa_0766 +sofa_0767 +sofa_0768 +sofa_0769 +sofa_0770 +sofa_0771 +sofa_0772 +sofa_0773 +sofa_0774 +sofa_0775 +sofa_0776 +sofa_0777 +sofa_0778 +sofa_0779 +sofa_0780 +stairs_0125 +stairs_0126 +stairs_0127 +stairs_0128 +stairs_0129 +stairs_0130 +stairs_0131 +stairs_0132 +stairs_0133 +stairs_0134 +stairs_0135 +stairs_0136 +stairs_0137 +stairs_0138 +stairs_0139 +stairs_0140 +stairs_0141 +stairs_0142 +stairs_0143 +stairs_0144 +stool_0091 +stool_0092 +stool_0093 +stool_0094 +stool_0095 +stool_0096 +stool_0097 +stool_0098 +stool_0099 +stool_0100 +stool_0101 +stool_0102 +stool_0103 +stool_0104 +stool_0105 +stool_0106 +stool_0107 +stool_0108 +stool_0109 +stool_0110 +table_0393 +table_0394 +table_0395 +table_0396 +table_0397 +table_0398 +table_0399 +table_0400 +table_0401 +table_0402 +table_0403 +table_0404 +table_0405 +table_0406 +table_0407 +table_0408 +table_0409 +table_0410 +table_0411 +table_0412 +table_0413 +table_0414 +table_0415 +table_0416 +table_0417 +table_0418 +table_0419 +table_0420 +table_0421 +table_0422 +table_0423 +table_0424 +table_0425 +table_0426 +table_0427 +table_0428 +table_0429 +table_0430 +table_0431 +table_0432 +table_0433 +table_0434 +table_0435 +table_0436 +table_0437 +table_0438 +table_0439 +table_0440 +table_0441 +table_0442 +table_0443 +table_0444 +table_0445 +table_0446 +table_0447 +table_0448 +table_0449 +table_0450 +table_0451 +table_0452 +table_0453 +table_0454 +table_0455 +table_0456 +table_0457 +table_0458 +table_0459 +table_0460 +table_0461 +table_0462 +table_0463 +table_0464 +table_0465 +table_0466 +table_0467 +table_0468 +table_0469 +table_0470 +table_0471 +table_0472 +table_0473 +table_0474 +table_0475 +table_0476 +table_0477 +table_0478 +table_0479 +table_0480 +table_0481 +table_0482 +table_0483 +table_0484 +table_0485 +table_0486 +table_0487 +table_0488 +table_0489 +table_0490 +table_0491 +table_0492 +tent_0164 +tent_0165 +tent_0166 +tent_0167 +tent_0168 +tent_0169 +tent_0170 +tent_0171 +tent_0172 +tent_0173 +tent_0174 +tent_0175 +tent_0176 +tent_0177 +tent_0178 +tent_0179 +tent_0180 +tent_0181 +tent_0182 +tent_0183 +toilet_0345 +toilet_0346 +toilet_0347 +toilet_0348 +toilet_0349 +toilet_0350 +toilet_0351 +toilet_0352 +toilet_0353 +toilet_0354 +toilet_0355 +toilet_0356 +toilet_0357 +toilet_0358 +toilet_0359 +toilet_0360 +toilet_0361 +toilet_0362 +toilet_0363 +toilet_0364 +toilet_0365 +toilet_0366 +toilet_0367 +toilet_0368 +toilet_0369 +toilet_0370 +toilet_0371 +toilet_0372 +toilet_0373 +toilet_0374 +toilet_0375 +toilet_0376 +toilet_0377 +toilet_0378 +toilet_0379 +toilet_0380 +toilet_0381 +toilet_0382 +toilet_0383 +toilet_0384 +toilet_0385 +toilet_0386 +toilet_0387 +toilet_0388 +toilet_0389 +toilet_0390 +toilet_0391 +toilet_0392 +toilet_0393 +toilet_0394 +toilet_0395 +toilet_0396 +toilet_0397 +toilet_0398 +toilet_0399 +toilet_0400 +toilet_0401 +toilet_0402 +toilet_0403 +toilet_0404 +toilet_0405 +toilet_0406 +toilet_0407 +toilet_0408 +toilet_0409 +toilet_0410 +toilet_0411 +toilet_0412 +toilet_0413 +toilet_0414 +toilet_0415 +toilet_0416 +toilet_0417 +toilet_0418 +toilet_0419 +toilet_0420 +toilet_0421 +toilet_0422 +toilet_0423 +toilet_0424 +toilet_0425 +toilet_0426 +toilet_0427 +toilet_0428 +toilet_0429 +toilet_0430 +toilet_0431 +toilet_0432 +toilet_0433 +toilet_0434 +toilet_0435 +toilet_0436 +toilet_0437 +toilet_0438 +toilet_0439 +toilet_0440 +toilet_0441 +toilet_0442 +toilet_0443 +toilet_0444 +tv_stand_0268 +tv_stand_0269 +tv_stand_0270 +tv_stand_0271 +tv_stand_0272 +tv_stand_0273 +tv_stand_0274 +tv_stand_0275 +tv_stand_0276 +tv_stand_0277 +tv_stand_0278 +tv_stand_0279 +tv_stand_0280 +tv_stand_0281 +tv_stand_0282 +tv_stand_0283 +tv_stand_0284 +tv_stand_0285 +tv_stand_0286 +tv_stand_0287 +tv_stand_0288 +tv_stand_0289 +tv_stand_0290 +tv_stand_0291 +tv_stand_0292 +tv_stand_0293 +tv_stand_0294 +tv_stand_0295 +tv_stand_0296 +tv_stand_0297 +tv_stand_0298 +tv_stand_0299 +tv_stand_0300 +tv_stand_0301 +tv_stand_0302 +tv_stand_0303 +tv_stand_0304 +tv_stand_0305 +tv_stand_0306 +tv_stand_0307 +tv_stand_0308 +tv_stand_0309 +tv_stand_0310 +tv_stand_0311 +tv_stand_0312 +tv_stand_0313 +tv_stand_0314 +tv_stand_0315 +tv_stand_0316 +tv_stand_0317 +tv_stand_0318 +tv_stand_0319 +tv_stand_0320 +tv_stand_0321 +tv_stand_0322 +tv_stand_0323 +tv_stand_0324 +tv_stand_0325 +tv_stand_0326 +tv_stand_0327 +tv_stand_0328 +tv_stand_0329 +tv_stand_0330 +tv_stand_0331 +tv_stand_0332 +tv_stand_0333 +tv_stand_0334 +tv_stand_0335 +tv_stand_0336 +tv_stand_0337 +tv_stand_0338 +tv_stand_0339 +tv_stand_0340 +tv_stand_0341 +tv_stand_0342 +tv_stand_0343 +tv_stand_0344 +tv_stand_0345 +tv_stand_0346 +tv_stand_0347 +tv_stand_0348 +tv_stand_0349 +tv_stand_0350 +tv_stand_0351 +tv_stand_0352 +tv_stand_0353 +tv_stand_0354 +tv_stand_0355 +tv_stand_0356 +tv_stand_0357 +tv_stand_0358 +tv_stand_0359 +tv_stand_0360 +tv_stand_0361 +tv_stand_0362 +tv_stand_0363 +tv_stand_0364 +tv_stand_0365 +tv_stand_0366 +tv_stand_0367 +vase_0476 +vase_0477 +vase_0478 +vase_0479 +vase_0480 +vase_0481 +vase_0482 +vase_0483 +vase_0484 +vase_0485 +vase_0486 +vase_0487 +vase_0488 +vase_0489 +vase_0490 +vase_0491 +vase_0492 +vase_0493 +vase_0494 +vase_0495 +vase_0496 +vase_0497 +vase_0498 +vase_0499 +vase_0500 +vase_0501 +vase_0502 +vase_0503 +vase_0504 +vase_0505 +vase_0506 +vase_0507 +vase_0508 +vase_0509 +vase_0510 +vase_0511 +vase_0512 +vase_0513 +vase_0514 +vase_0515 +vase_0516 +vase_0517 +vase_0518 +vase_0519 +vase_0520 +vase_0521 +vase_0522 +vase_0523 +vase_0524 +vase_0525 +vase_0526 +vase_0527 +vase_0528 +vase_0529 +vase_0530 +vase_0531 +vase_0532 +vase_0533 +vase_0534 +vase_0535 +vase_0536 +vase_0537 +vase_0538 +vase_0539 +vase_0540 +vase_0541 +vase_0542 +vase_0543 +vase_0544 +vase_0545 +vase_0546 +vase_0547 +vase_0548 +vase_0549 +vase_0550 +vase_0551 +vase_0552 +vase_0553 +vase_0554 +vase_0555 +vase_0556 +vase_0557 +vase_0558 +vase_0559 +vase_0560 +vase_0561 +vase_0562 +vase_0563 +vase_0564 +vase_0565 +vase_0566 +vase_0567 +vase_0568 +vase_0569 +vase_0570 +vase_0571 +vase_0572 +vase_0573 +vase_0574 +vase_0575 +wardrobe_0088 +wardrobe_0089 +wardrobe_0090 +wardrobe_0091 +wardrobe_0092 +wardrobe_0093 +wardrobe_0094 +wardrobe_0095 +wardrobe_0096 +wardrobe_0097 +wardrobe_0098 +wardrobe_0099 +wardrobe_0100 +wardrobe_0101 +wardrobe_0102 +wardrobe_0103 +wardrobe_0104 +wardrobe_0105 +wardrobe_0106 +wardrobe_0107 +xbox_0104 +xbox_0105 +xbox_0106 +xbox_0107 +xbox_0108 +xbox_0109 +xbox_0110 +xbox_0111 +xbox_0112 +xbox_0113 +xbox_0114 +xbox_0115 +xbox_0116 +xbox_0117 +xbox_0118 +xbox_0119 +xbox_0120 +xbox_0121 +xbox_0122 +xbox_0123 diff --git a/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_train.txt b/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_train.txt new file mode 100644 index 0000000..3a50c70 --- /dev/null +++ b/zoo/PointBERT/segmentation/data/ModelNet/modelnet40_normal_resampled/modelnet40_train.txt @@ -0,0 +1,9843 @@ +airplane_0001 +airplane_0002 +airplane_0003 +airplane_0004 +airplane_0005 +airplane_0006 +airplane_0007 +airplane_0008 +airplane_0009 +airplane_0010 +airplane_0011 +airplane_0012 +airplane_0013 +airplane_0014 +airplane_0015 +airplane_0016 +airplane_0017 +airplane_0018 +airplane_0019 +airplane_0020 +airplane_0021 +airplane_0022 +airplane_0023 +airplane_0024 +airplane_0025 +airplane_0026 +airplane_0027 +airplane_0028 +airplane_0029 +airplane_0030 +airplane_0031 +airplane_0032 +airplane_0033 +airplane_0034 +airplane_0035 +airplane_0036 +airplane_0037 +airplane_0038 +airplane_0039 +airplane_0040 +airplane_0041 +airplane_0042 +airplane_0043 +airplane_0044 +airplane_0045 +airplane_0046 +airplane_0047 +airplane_0048 +airplane_0049 +airplane_0050 +airplane_0051 +airplane_0052 +airplane_0053 +airplane_0054 +airplane_0055 +airplane_0056 +airplane_0057 +airplane_0058 +airplane_0059 +airplane_0060 +airplane_0061 +airplane_0062 +airplane_0063 +airplane_0064 +airplane_0065 +airplane_0066 +airplane_0067 +airplane_0068 +airplane_0069 +airplane_0070 +airplane_0071 +airplane_0072 +airplane_0073 +airplane_0074 +airplane_0075 +airplane_0076 +airplane_0077 +airplane_0078 +airplane_0079 +airplane_0080 +airplane_0081 +airplane_0082 +airplane_0083 +airplane_0084 +airplane_0085 +airplane_0086 +airplane_0087 +airplane_0088 +airplane_0089 +airplane_0090 +airplane_0091 +airplane_0092 +airplane_0093 +airplane_0094 +airplane_0095 +airplane_0096 +airplane_0097 +airplane_0098 +airplane_0099 +airplane_0100 +airplane_0101 +airplane_0102 +airplane_0103 +airplane_0104 +airplane_0105 +airplane_0106 +airplane_0107 +airplane_0108 +airplane_0109 +airplane_0110 +airplane_0111 +airplane_0112 +airplane_0113 +airplane_0114 +airplane_0115 +airplane_0116 +airplane_0117 +airplane_0118 +airplane_0119 +airplane_0120 +airplane_0121 +airplane_0122 +airplane_0123 +airplane_0124 +airplane_0125 +airplane_0126 +airplane_0127 +airplane_0128 +airplane_0129 +airplane_0130 +airplane_0131 +airplane_0132 +airplane_0133 +airplane_0134 +airplane_0135 +airplane_0136 +airplane_0137 +airplane_0138 +airplane_0139 +airplane_0140 +airplane_0141 +airplane_0142 +airplane_0143 +airplane_0144 +airplane_0145 +airplane_0146 +airplane_0147 +airplane_0148 +airplane_0149 +airplane_0150 +airplane_0151 +airplane_0152 +airplane_0153 +airplane_0154 +airplane_0155 +airplane_0156 +airplane_0157 +airplane_0158 +airplane_0159 +airplane_0160 +airplane_0161 +airplane_0162 +airplane_0163 +airplane_0164 +airplane_0165 +airplane_0166 +airplane_0167 +airplane_0168 +airplane_0169 +airplane_0170 +airplane_0171 +airplane_0172 +airplane_0173 +airplane_0174 +airplane_0175 +airplane_0176 +airplane_0177 +airplane_0178 +airplane_0179 +airplane_0180 +airplane_0181 +airplane_0182 +airplane_0183 +airplane_0184 +airplane_0185 +airplane_0186 +airplane_0187 +airplane_0188 +airplane_0189 +airplane_0190 +airplane_0191 +airplane_0192 +airplane_0193 +airplane_0194 +airplane_0195 +airplane_0196 +airplane_0197 +airplane_0198 +airplane_0199 +airplane_0200 +airplane_0201 +airplane_0202 +airplane_0203 +airplane_0204 +airplane_0205 +airplane_0206 +airplane_0207 +airplane_0208 +airplane_0209 +airplane_0210 +airplane_0211 +airplane_0212 +airplane_0213 +airplane_0214 +airplane_0215 +airplane_0216 +airplane_0217 +airplane_0218 +airplane_0219 +airplane_0220 +airplane_0221 +airplane_0222 +airplane_0223 +airplane_0224 +airplane_0225 +airplane_0226 +airplane_0227 +airplane_0228 +airplane_0229 +airplane_0230 +airplane_0231 +airplane_0232 +airplane_0233 +airplane_0234 +airplane_0235 +airplane_0236 +airplane_0237 +airplane_0238 +airplane_0239 +airplane_0240 +airplane_0241 +airplane_0242 +airplane_0243 +airplane_0244 +airplane_0245 +airplane_0246 +airplane_0247 +airplane_0248 +airplane_0249 +airplane_0250 +airplane_0251 +airplane_0252 +airplane_0253 +airplane_0254 +airplane_0255 +airplane_0256 +airplane_0257 +airplane_0258 +airplane_0259 +airplane_0260 +airplane_0261 +airplane_0262 +airplane_0263 +airplane_0264 +airplane_0265 +airplane_0266 +airplane_0267 +airplane_0268 +airplane_0269 +airplane_0270 +airplane_0271 +airplane_0272 +airplane_0273 +airplane_0274 +airplane_0275 +airplane_0276 +airplane_0277 +airplane_0278 +airplane_0279 +airplane_0280 +airplane_0281 +airplane_0282 +airplane_0283 +airplane_0284 +airplane_0285 +airplane_0286 +airplane_0287 +airplane_0288 +airplane_0289 +airplane_0290 +airplane_0291 +airplane_0292 +airplane_0293 +airplane_0294 +airplane_0295 +airplane_0296 +airplane_0297 +airplane_0298 +airplane_0299 +airplane_0300 +airplane_0301 +airplane_0302 +airplane_0303 +airplane_0304 +airplane_0305 +airplane_0306 +airplane_0307 +airplane_0308 +airplane_0309 +airplane_0310 +airplane_0311 +airplane_0312 +airplane_0313 +airplane_0314 +airplane_0315 +airplane_0316 +airplane_0317 +airplane_0318 +airplane_0319 +airplane_0320 +airplane_0321 +airplane_0322 +airplane_0323 +airplane_0324 +airplane_0325 +airplane_0326 +airplane_0327 +airplane_0328 +airplane_0329 +airplane_0330 +airplane_0331 +airplane_0332 +airplane_0333 +airplane_0334 +airplane_0335 +airplane_0336 +airplane_0337 +airplane_0338 +airplane_0339 +airplane_0340 +airplane_0341 +airplane_0342 +airplane_0343 +airplane_0344 +airplane_0345 +airplane_0346 +airplane_0347 +airplane_0348 +airplane_0349 +airplane_0350 +airplane_0351 +airplane_0352 +airplane_0353 +airplane_0354 +airplane_0355 +airplane_0356 +airplane_0357 +airplane_0358 +airplane_0359 +airplane_0360 +airplane_0361 +airplane_0362 +airplane_0363 +airplane_0364 +airplane_0365 +airplane_0366 +airplane_0367 +airplane_0368 +airplane_0369 +airplane_0370 +airplane_0371 +airplane_0372 +airplane_0373 +airplane_0374 +airplane_0375 +airplane_0376 +airplane_0377 +airplane_0378 +airplane_0379 +airplane_0380 +airplane_0381 +airplane_0382 +airplane_0383 +airplane_0384 +airplane_0385 +airplane_0386 +airplane_0387 +airplane_0388 +airplane_0389 +airplane_0390 +airplane_0391 +airplane_0392 +airplane_0393 +airplane_0394 +airplane_0395 +airplane_0396 +airplane_0397 +airplane_0398 +airplane_0399 +airplane_0400 +airplane_0401 +airplane_0402 +airplane_0403 +airplane_0404 +airplane_0405 +airplane_0406 +airplane_0407 +airplane_0408 +airplane_0409 +airplane_0410 +airplane_0411 +airplane_0412 +airplane_0413 +airplane_0414 +airplane_0415 +airplane_0416 +airplane_0417 +airplane_0418 +airplane_0419 +airplane_0420 +airplane_0421 +airplane_0422 +airplane_0423 +airplane_0424 +airplane_0425 +airplane_0426 +airplane_0427 +airplane_0428 +airplane_0429 +airplane_0430 +airplane_0431 +airplane_0432 +airplane_0433 +airplane_0434 +airplane_0435 +airplane_0436 +airplane_0437 +airplane_0438 +airplane_0439 +airplane_0440 +airplane_0441 +airplane_0442 +airplane_0443 +airplane_0444 +airplane_0445 +airplane_0446 +airplane_0447 +airplane_0448 +airplane_0449 +airplane_0450 +airplane_0451 +airplane_0452 +airplane_0453 +airplane_0454 +airplane_0455 +airplane_0456 +airplane_0457 +airplane_0458 +airplane_0459 +airplane_0460 +airplane_0461 +airplane_0462 +airplane_0463 +airplane_0464 +airplane_0465 +airplane_0466 +airplane_0467 +airplane_0468 +airplane_0469 +airplane_0470 +airplane_0471 +airplane_0472 +airplane_0473 +airplane_0474 +airplane_0475 +airplane_0476 +airplane_0477 +airplane_0478 +airplane_0479 +airplane_0480 +airplane_0481 +airplane_0482 +airplane_0483 +airplane_0484 +airplane_0485 +airplane_0486 +airplane_0487 +airplane_0488 +airplane_0489 +airplane_0490 +airplane_0491 +airplane_0492 +airplane_0493 +airplane_0494 +airplane_0495 +airplane_0496 +airplane_0497 +airplane_0498 +airplane_0499 +airplane_0500 +airplane_0501 +airplane_0502 +airplane_0503 +airplane_0504 +airplane_0505 +airplane_0506 +airplane_0507 +airplane_0508 +airplane_0509 +airplane_0510 +airplane_0511 +airplane_0512 +airplane_0513 +airplane_0514 +airplane_0515 +airplane_0516 +airplane_0517 +airplane_0518 +airplane_0519 +airplane_0520 +airplane_0521 +airplane_0522 +airplane_0523 +airplane_0524 +airplane_0525 +airplane_0526 +airplane_0527 +airplane_0528 +airplane_0529 +airplane_0530 +airplane_0531 +airplane_0532 +airplane_0533 +airplane_0534 +airplane_0535 +airplane_0536 +airplane_0537 +airplane_0538 +airplane_0539 +airplane_0540 +airplane_0541 +airplane_0542 +airplane_0543 +airplane_0544 +airplane_0545 +airplane_0546 +airplane_0547 +airplane_0548 +airplane_0549 +airplane_0550 +airplane_0551 +airplane_0552 +airplane_0553 +airplane_0554 +airplane_0555 +airplane_0556 +airplane_0557 +airplane_0558 +airplane_0559 +airplane_0560 +airplane_0561 +airplane_0562 +airplane_0563 +airplane_0564 +airplane_0565 +airplane_0566 +airplane_0567 +airplane_0568 +airplane_0569 +airplane_0570 +airplane_0571 +airplane_0572 +airplane_0573 +airplane_0574 +airplane_0575 +airplane_0576 +airplane_0577 +airplane_0578 +airplane_0579 +airplane_0580 +airplane_0581 +airplane_0582 +airplane_0583 +airplane_0584 +airplane_0585 +airplane_0586 +airplane_0587 +airplane_0588 +airplane_0589 +airplane_0590 +airplane_0591 +airplane_0592 +airplane_0593 +airplane_0594 +airplane_0595 +airplane_0596 +airplane_0597 +airplane_0598 +airplane_0599 +airplane_0600 +airplane_0601 +airplane_0602 +airplane_0603 +airplane_0604 +airplane_0605 +airplane_0606 +airplane_0607 +airplane_0608 +airplane_0609 +airplane_0610 +airplane_0611 +airplane_0612 +airplane_0613 +airplane_0614 +airplane_0615 +airplane_0616 +airplane_0617 +airplane_0618 +airplane_0619 +airplane_0620 +airplane_0621 +airplane_0622 +airplane_0623 +airplane_0624 +airplane_0625 +airplane_0626 +bathtub_0001 +bathtub_0002 +bathtub_0003 +bathtub_0004 +bathtub_0005 +bathtub_0006 +bathtub_0007 +bathtub_0008 +bathtub_0009 +bathtub_0010 +bathtub_0011 +bathtub_0012 +bathtub_0013 +bathtub_0014 +bathtub_0015 +bathtub_0016 +bathtub_0017 +bathtub_0018 +bathtub_0019 +bathtub_0020 +bathtub_0021 +bathtub_0022 +bathtub_0023 +bathtub_0024 +bathtub_0025 +bathtub_0026 +bathtub_0027 +bathtub_0028 +bathtub_0029 +bathtub_0030 +bathtub_0031 +bathtub_0032 +bathtub_0033 +bathtub_0034 +bathtub_0035 +bathtub_0036 +bathtub_0037 +bathtub_0038 +bathtub_0039 +bathtub_0040 +bathtub_0041 +bathtub_0042 +bathtub_0043 +bathtub_0044 +bathtub_0045 +bathtub_0046 +bathtub_0047 +bathtub_0048 +bathtub_0049 +bathtub_0050 +bathtub_0051 +bathtub_0052 +bathtub_0053 +bathtub_0054 +bathtub_0055 +bathtub_0056 +bathtub_0057 +bathtub_0058 +bathtub_0059 +bathtub_0060 +bathtub_0061 +bathtub_0062 +bathtub_0063 +bathtub_0064 +bathtub_0065 +bathtub_0066 +bathtub_0067 +bathtub_0068 +bathtub_0069 +bathtub_0070 +bathtub_0071 +bathtub_0072 +bathtub_0073 +bathtub_0074 +bathtub_0075 +bathtub_0076 +bathtub_0077 +bathtub_0078 +bathtub_0079 +bathtub_0080 +bathtub_0081 +bathtub_0082 +bathtub_0083 +bathtub_0084 +bathtub_0085 +bathtub_0086 +bathtub_0087 +bathtub_0088 +bathtub_0089 +bathtub_0090 +bathtub_0091 +bathtub_0092 +bathtub_0093 +bathtub_0094 +bathtub_0095 +bathtub_0096 +bathtub_0097 +bathtub_0098 +bathtub_0099 +bathtub_0100 +bathtub_0101 +bathtub_0102 +bathtub_0103 +bathtub_0104 +bathtub_0105 +bathtub_0106 +bed_0001 +bed_0002 +bed_0003 +bed_0004 +bed_0005 +bed_0006 +bed_0007 +bed_0008 +bed_0009 +bed_0010 +bed_0011 +bed_0012 +bed_0013 +bed_0014 +bed_0015 +bed_0016 +bed_0017 +bed_0018 +bed_0019 +bed_0020 +bed_0021 +bed_0022 +bed_0023 +bed_0024 +bed_0025 +bed_0026 +bed_0027 +bed_0028 +bed_0029 +bed_0030 +bed_0031 +bed_0032 +bed_0033 +bed_0034 +bed_0035 +bed_0036 +bed_0037 +bed_0038 +bed_0039 +bed_0040 +bed_0041 +bed_0042 +bed_0043 +bed_0044 +bed_0045 +bed_0046 +bed_0047 +bed_0048 +bed_0049 +bed_0050 +bed_0051 +bed_0052 +bed_0053 +bed_0054 +bed_0055 +bed_0056 +bed_0057 +bed_0058 +bed_0059 +bed_0060 +bed_0061 +bed_0062 +bed_0063 +bed_0064 +bed_0065 +bed_0066 +bed_0067 +bed_0068 +bed_0069 +bed_0070 +bed_0071 +bed_0072 +bed_0073 +bed_0074 +bed_0075 +bed_0076 +bed_0077 +bed_0078 +bed_0079 +bed_0080 +bed_0081 +bed_0082 +bed_0083 +bed_0084 +bed_0085 +bed_0086 +bed_0087 +bed_0088 +bed_0089 +bed_0090 +bed_0091 +bed_0092 +bed_0093 +bed_0094 +bed_0095 +bed_0096 +bed_0097 +bed_0098 +bed_0099 +bed_0100 +bed_0101 +bed_0102 +bed_0103 +bed_0104 +bed_0105 +bed_0106 +bed_0107 +bed_0108 +bed_0109 +bed_0110 +bed_0111 +bed_0112 +bed_0113 +bed_0114 +bed_0115 +bed_0116 +bed_0117 +bed_0118 +bed_0119 +bed_0120 +bed_0121 +bed_0122 +bed_0123 +bed_0124 +bed_0125 +bed_0126 +bed_0127 +bed_0128 +bed_0129 +bed_0130 +bed_0131 +bed_0132 +bed_0133 +bed_0134 +bed_0135 +bed_0136 +bed_0137 +bed_0138 +bed_0139 +bed_0140 +bed_0141 +bed_0142 +bed_0143 +bed_0144 +bed_0145 +bed_0146 +bed_0147 +bed_0148 +bed_0149 +bed_0150 +bed_0151 +bed_0152 +bed_0153 +bed_0154 +bed_0155 +bed_0156 +bed_0157 +bed_0158 +bed_0159 +bed_0160 +bed_0161 +bed_0162 +bed_0163 +bed_0164 +bed_0165 +bed_0166 +bed_0167 +bed_0168 +bed_0169 +bed_0170 +bed_0171 +bed_0172 +bed_0173 +bed_0174 +bed_0175 +bed_0176 +bed_0177 +bed_0178 +bed_0179 +bed_0180 +bed_0181 +bed_0182 +bed_0183 +bed_0184 +bed_0185 +bed_0186 +bed_0187 +bed_0188 +bed_0189 +bed_0190 +bed_0191 +bed_0192 +bed_0193 +bed_0194 +bed_0195 +bed_0196 +bed_0197 +bed_0198 +bed_0199 +bed_0200 +bed_0201 +bed_0202 +bed_0203 +bed_0204 +bed_0205 +bed_0206 +bed_0207 +bed_0208 +bed_0209 +bed_0210 +bed_0211 +bed_0212 +bed_0213 +bed_0214 +bed_0215 +bed_0216 +bed_0217 +bed_0218 +bed_0219 +bed_0220 +bed_0221 +bed_0222 +bed_0223 +bed_0224 +bed_0225 +bed_0226 +bed_0227 +bed_0228 +bed_0229 +bed_0230 +bed_0231 +bed_0232 +bed_0233 +bed_0234 +bed_0235 +bed_0236 +bed_0237 +bed_0238 +bed_0239 +bed_0240 +bed_0241 +bed_0242 +bed_0243 +bed_0244 +bed_0245 +bed_0246 +bed_0247 +bed_0248 +bed_0249 +bed_0250 +bed_0251 +bed_0252 +bed_0253 +bed_0254 +bed_0255 +bed_0256 +bed_0257 +bed_0258 +bed_0259 +bed_0260 +bed_0261 +bed_0262 +bed_0263 +bed_0264 +bed_0265 +bed_0266 +bed_0267 +bed_0268 +bed_0269 +bed_0270 +bed_0271 +bed_0272 +bed_0273 +bed_0274 +bed_0275 +bed_0276 +bed_0277 +bed_0278 +bed_0279 +bed_0280 +bed_0281 +bed_0282 +bed_0283 +bed_0284 +bed_0285 +bed_0286 +bed_0287 +bed_0288 +bed_0289 +bed_0290 +bed_0291 +bed_0292 +bed_0293 +bed_0294 +bed_0295 +bed_0296 +bed_0297 +bed_0298 +bed_0299 +bed_0300 +bed_0301 +bed_0302 +bed_0303 +bed_0304 +bed_0305 +bed_0306 +bed_0307 +bed_0308 +bed_0309 +bed_0310 +bed_0311 +bed_0312 +bed_0313 +bed_0314 +bed_0315 +bed_0316 +bed_0317 +bed_0318 +bed_0319 +bed_0320 +bed_0321 +bed_0322 +bed_0323 +bed_0324 +bed_0325 +bed_0326 +bed_0327 +bed_0328 +bed_0329 +bed_0330 +bed_0331 +bed_0332 +bed_0333 +bed_0334 +bed_0335 +bed_0336 +bed_0337 +bed_0338 +bed_0339 +bed_0340 +bed_0341 +bed_0342 +bed_0343 +bed_0344 +bed_0345 +bed_0346 +bed_0347 +bed_0348 +bed_0349 +bed_0350 +bed_0351 +bed_0352 +bed_0353 +bed_0354 +bed_0355 +bed_0356 +bed_0357 +bed_0358 +bed_0359 +bed_0360 +bed_0361 +bed_0362 +bed_0363 +bed_0364 +bed_0365 +bed_0366 +bed_0367 +bed_0368 +bed_0369 +bed_0370 +bed_0371 +bed_0372 +bed_0373 +bed_0374 +bed_0375 +bed_0376 +bed_0377 +bed_0378 +bed_0379 +bed_0380 +bed_0381 +bed_0382 +bed_0383 +bed_0384 +bed_0385 +bed_0386 +bed_0387 +bed_0388 +bed_0389 +bed_0390 +bed_0391 +bed_0392 +bed_0393 +bed_0394 +bed_0395 +bed_0396 +bed_0397 +bed_0398 +bed_0399 +bed_0400 +bed_0401 +bed_0402 +bed_0403 +bed_0404 +bed_0405 +bed_0406 +bed_0407 +bed_0408 +bed_0409 +bed_0410 +bed_0411 +bed_0412 +bed_0413 +bed_0414 +bed_0415 +bed_0416 +bed_0417 +bed_0418 +bed_0419 +bed_0420 +bed_0421 +bed_0422 +bed_0423 +bed_0424 +bed_0425 +bed_0426 +bed_0427 +bed_0428 +bed_0429 +bed_0430 +bed_0431 +bed_0432 +bed_0433 +bed_0434 +bed_0435 +bed_0436 +bed_0437 +bed_0438 +bed_0439 +bed_0440 +bed_0441 +bed_0442 +bed_0443 +bed_0444 +bed_0445 +bed_0446 +bed_0447 +bed_0448 +bed_0449 +bed_0450 +bed_0451 +bed_0452 +bed_0453 +bed_0454 +bed_0455 +bed_0456 +bed_0457 +bed_0458 +bed_0459 +bed_0460 +bed_0461 +bed_0462 +bed_0463 +bed_0464 +bed_0465 +bed_0466 +bed_0467 +bed_0468 +bed_0469 +bed_0470 +bed_0471 +bed_0472 +bed_0473 +bed_0474 +bed_0475 +bed_0476 +bed_0477 +bed_0478 +bed_0479 +bed_0480 +bed_0481 +bed_0482 +bed_0483 +bed_0484 +bed_0485 +bed_0486 +bed_0487 +bed_0488 +bed_0489 +bed_0490 +bed_0491 +bed_0492 +bed_0493 +bed_0494 +bed_0495 +bed_0496 +bed_0497 +bed_0498 +bed_0499 +bed_0500 +bed_0501 +bed_0502 +bed_0503 +bed_0504 +bed_0505 +bed_0506 +bed_0507 +bed_0508 +bed_0509 +bed_0510 +bed_0511 +bed_0512 +bed_0513 +bed_0514 +bed_0515 +bench_0001 +bench_0002 +bench_0003 +bench_0004 +bench_0005 +bench_0006 +bench_0007 +bench_0008 +bench_0009 +bench_0010 +bench_0011 +bench_0012 +bench_0013 +bench_0014 +bench_0015 +bench_0016 +bench_0017 +bench_0018 +bench_0019 +bench_0020 +bench_0021 +bench_0022 +bench_0023 +bench_0024 +bench_0025 +bench_0026 +bench_0027 +bench_0028 +bench_0029 +bench_0030 +bench_0031 +bench_0032 +bench_0033 +bench_0034 +bench_0035 +bench_0036 +bench_0037 +bench_0038 +bench_0039 +bench_0040 +bench_0041 +bench_0042 +bench_0043 +bench_0044 +bench_0045 +bench_0046 +bench_0047 +bench_0048 +bench_0049 +bench_0050 +bench_0051 +bench_0052 +bench_0053 +bench_0054 +bench_0055 +bench_0056 +bench_0057 +bench_0058 +bench_0059 +bench_0060 +bench_0061 +bench_0062 +bench_0063 +bench_0064 +bench_0065 +bench_0066 +bench_0067 +bench_0068 +bench_0069 +bench_0070 +bench_0071 +bench_0072 +bench_0073 +bench_0074 +bench_0075 +bench_0076 +bench_0077 +bench_0078 +bench_0079 +bench_0080 +bench_0081 +bench_0082 +bench_0083 +bench_0084 +bench_0085 +bench_0086 +bench_0087 +bench_0088 +bench_0089 +bench_0090 +bench_0091 +bench_0092 +bench_0093 +bench_0094 +bench_0095 +bench_0096 +bench_0097 +bench_0098 +bench_0099 +bench_0100 +bench_0101 +bench_0102 +bench_0103 +bench_0104 +bench_0105 +bench_0106 +bench_0107 +bench_0108 +bench_0109 +bench_0110 +bench_0111 +bench_0112 +bench_0113 +bench_0114 +bench_0115 +bench_0116 +bench_0117 +bench_0118 +bench_0119 +bench_0120 +bench_0121 +bench_0122 +bench_0123 +bench_0124 +bench_0125 +bench_0126 +bench_0127 +bench_0128 +bench_0129 +bench_0130 +bench_0131 +bench_0132 +bench_0133 +bench_0134 +bench_0135 +bench_0136 +bench_0137 +bench_0138 +bench_0139 +bench_0140 +bench_0141 +bench_0142 +bench_0143 +bench_0144 +bench_0145 +bench_0146 +bench_0147 +bench_0148 +bench_0149 +bench_0150 +bench_0151 +bench_0152 +bench_0153 +bench_0154 +bench_0155 +bench_0156 +bench_0157 +bench_0158 +bench_0159 +bench_0160 +bench_0161 +bench_0162 +bench_0163 +bench_0164 +bench_0165 +bench_0166 +bench_0167 +bench_0168 +bench_0169 +bench_0170 +bench_0171 +bench_0172 +bench_0173 +bookshelf_0001 +bookshelf_0002 +bookshelf_0003 +bookshelf_0004 +bookshelf_0005 +bookshelf_0006 +bookshelf_0007 +bookshelf_0008 +bookshelf_0009 +bookshelf_0010 +bookshelf_0011 +bookshelf_0012 +bookshelf_0013 +bookshelf_0014 +bookshelf_0015 +bookshelf_0016 +bookshelf_0017 +bookshelf_0018 +bookshelf_0019 +bookshelf_0020 +bookshelf_0021 +bookshelf_0022 +bookshelf_0023 +bookshelf_0024 +bookshelf_0025 +bookshelf_0026 +bookshelf_0027 +bookshelf_0028 +bookshelf_0029 +bookshelf_0030 +bookshelf_0031 +bookshelf_0032 +bookshelf_0033 +bookshelf_0034 +bookshelf_0035 +bookshelf_0036 +bookshelf_0037 +bookshelf_0038 +bookshelf_0039 +bookshelf_0040 +bookshelf_0041 +bookshelf_0042 +bookshelf_0043 +bookshelf_0044 +bookshelf_0045 +bookshelf_0046 +bookshelf_0047 +bookshelf_0048 +bookshelf_0049 +bookshelf_0050 +bookshelf_0051 +bookshelf_0052 +bookshelf_0053 +bookshelf_0054 +bookshelf_0055 +bookshelf_0056 +bookshelf_0057 +bookshelf_0058 +bookshelf_0059 +bookshelf_0060 +bookshelf_0061 +bookshelf_0062 +bookshelf_0063 +bookshelf_0064 +bookshelf_0065 +bookshelf_0066 +bookshelf_0067 +bookshelf_0068 +bookshelf_0069 +bookshelf_0070 +bookshelf_0071 +bookshelf_0072 +bookshelf_0073 +bookshelf_0074 +bookshelf_0075 +bookshelf_0076 +bookshelf_0077 +bookshelf_0078 +bookshelf_0079 +bookshelf_0080 +bookshelf_0081 +bookshelf_0082 +bookshelf_0083 +bookshelf_0084 +bookshelf_0085 +bookshelf_0086 +bookshelf_0087 +bookshelf_0088 +bookshelf_0089 +bookshelf_0090 +bookshelf_0091 +bookshelf_0092 +bookshelf_0093 +bookshelf_0094 +bookshelf_0095 +bookshelf_0096 +bookshelf_0097 +bookshelf_0098 +bookshelf_0099 +bookshelf_0100 +bookshelf_0101 +bookshelf_0102 +bookshelf_0103 +bookshelf_0104 +bookshelf_0105 +bookshelf_0106 +bookshelf_0107 +bookshelf_0108 +bookshelf_0109 +bookshelf_0110 +bookshelf_0111 +bookshelf_0112 +bookshelf_0113 +bookshelf_0114 +bookshelf_0115 +bookshelf_0116 +bookshelf_0117 +bookshelf_0118 +bookshelf_0119 +bookshelf_0120 +bookshelf_0121 +bookshelf_0122 +bookshelf_0123 +bookshelf_0124 +bookshelf_0125 +bookshelf_0126 +bookshelf_0127 +bookshelf_0128 +bookshelf_0129 +bookshelf_0130 +bookshelf_0131 +bookshelf_0132 +bookshelf_0133 +bookshelf_0134 +bookshelf_0135 +bookshelf_0136 +bookshelf_0137 +bookshelf_0138 +bookshelf_0139 +bookshelf_0140 +bookshelf_0141 +bookshelf_0142 +bookshelf_0143 +bookshelf_0144 +bookshelf_0145 +bookshelf_0146 +bookshelf_0147 +bookshelf_0148 +bookshelf_0149 +bookshelf_0150 +bookshelf_0151 +bookshelf_0152 +bookshelf_0153 +bookshelf_0154 +bookshelf_0155 +bookshelf_0156 +bookshelf_0157 +bookshelf_0158 +bookshelf_0159 +bookshelf_0160 +bookshelf_0161 +bookshelf_0162 +bookshelf_0163 +bookshelf_0164 +bookshelf_0165 +bookshelf_0166 +bookshelf_0167 +bookshelf_0168 +bookshelf_0169 +bookshelf_0170 +bookshelf_0171 +bookshelf_0172 +bookshelf_0173 +bookshelf_0174 +bookshelf_0175 +bookshelf_0176 +bookshelf_0177 +bookshelf_0178 +bookshelf_0179 +bookshelf_0180 +bookshelf_0181 +bookshelf_0182 +bookshelf_0183 +bookshelf_0184 +bookshelf_0185 +bookshelf_0186 +bookshelf_0187 +bookshelf_0188 +bookshelf_0189 +bookshelf_0190 +bookshelf_0191 +bookshelf_0192 +bookshelf_0193 +bookshelf_0194 +bookshelf_0195 +bookshelf_0196 +bookshelf_0197 +bookshelf_0198 +bookshelf_0199 +bookshelf_0200 +bookshelf_0201 +bookshelf_0202 +bookshelf_0203 +bookshelf_0204 +bookshelf_0205 +bookshelf_0206 +bookshelf_0207 +bookshelf_0208 +bookshelf_0209 +bookshelf_0210 +bookshelf_0211 +bookshelf_0212 +bookshelf_0213 +bookshelf_0214 +bookshelf_0215 +bookshelf_0216 +bookshelf_0217 +bookshelf_0218 +bookshelf_0219 +bookshelf_0220 +bookshelf_0221 +bookshelf_0222 +bookshelf_0223 +bookshelf_0224 +bookshelf_0225 +bookshelf_0226 +bookshelf_0227 +bookshelf_0228 +bookshelf_0229 +bookshelf_0230 +bookshelf_0231 +bookshelf_0232 +bookshelf_0233 +bookshelf_0234 +bookshelf_0235 +bookshelf_0236 +bookshelf_0237 +bookshelf_0238 +bookshelf_0239 +bookshelf_0240 +bookshelf_0241 +bookshelf_0242 +bookshelf_0243 +bookshelf_0244 +bookshelf_0245 +bookshelf_0246 +bookshelf_0247 +bookshelf_0248 +bookshelf_0249 +bookshelf_0250 +bookshelf_0251 +bookshelf_0252 +bookshelf_0253 +bookshelf_0254 +bookshelf_0255 +bookshelf_0256 +bookshelf_0257 +bookshelf_0258 +bookshelf_0259 +bookshelf_0260 +bookshelf_0261 +bookshelf_0262 +bookshelf_0263 +bookshelf_0264 +bookshelf_0265 +bookshelf_0266 +bookshelf_0267 +bookshelf_0268 +bookshelf_0269 +bookshelf_0270 +bookshelf_0271 +bookshelf_0272 +bookshelf_0273 +bookshelf_0274 +bookshelf_0275 +bookshelf_0276 +bookshelf_0277 +bookshelf_0278 +bookshelf_0279 +bookshelf_0280 +bookshelf_0281 +bookshelf_0282 +bookshelf_0283 +bookshelf_0284 +bookshelf_0285 +bookshelf_0286 +bookshelf_0287 +bookshelf_0288 +bookshelf_0289 +bookshelf_0290 +bookshelf_0291 +bookshelf_0292 +bookshelf_0293 +bookshelf_0294 +bookshelf_0295 +bookshelf_0296 +bookshelf_0297 +bookshelf_0298 +bookshelf_0299 +bookshelf_0300 +bookshelf_0301 +bookshelf_0302 +bookshelf_0303 +bookshelf_0304 +bookshelf_0305 +bookshelf_0306 +bookshelf_0307 +bookshelf_0308 +bookshelf_0309 +bookshelf_0310 +bookshelf_0311 +bookshelf_0312 +bookshelf_0313 +bookshelf_0314 +bookshelf_0315 +bookshelf_0316 +bookshelf_0317 +bookshelf_0318 +bookshelf_0319 +bookshelf_0320 +bookshelf_0321 +bookshelf_0322 +bookshelf_0323 +bookshelf_0324 +bookshelf_0325 +bookshelf_0326 +bookshelf_0327 +bookshelf_0328 +bookshelf_0329 +bookshelf_0330 +bookshelf_0331 +bookshelf_0332 +bookshelf_0333 +bookshelf_0334 +bookshelf_0335 +bookshelf_0336 +bookshelf_0337 +bookshelf_0338 +bookshelf_0339 +bookshelf_0340 +bookshelf_0341 +bookshelf_0342 +bookshelf_0343 +bookshelf_0344 +bookshelf_0345 +bookshelf_0346 +bookshelf_0347 +bookshelf_0348 +bookshelf_0349 +bookshelf_0350 +bookshelf_0351 +bookshelf_0352 +bookshelf_0353 +bookshelf_0354 +bookshelf_0355 +bookshelf_0356 +bookshelf_0357 +bookshelf_0358 +bookshelf_0359 +bookshelf_0360 +bookshelf_0361 +bookshelf_0362 +bookshelf_0363 +bookshelf_0364 +bookshelf_0365 +bookshelf_0366 +bookshelf_0367 +bookshelf_0368 +bookshelf_0369 +bookshelf_0370 +bookshelf_0371 +bookshelf_0372 +bookshelf_0373 +bookshelf_0374 +bookshelf_0375 +bookshelf_0376 +bookshelf_0377 +bookshelf_0378 +bookshelf_0379 +bookshelf_0380 +bookshelf_0381 +bookshelf_0382 +bookshelf_0383 +bookshelf_0384 +bookshelf_0385 +bookshelf_0386 +bookshelf_0387 +bookshelf_0388 +bookshelf_0389 +bookshelf_0390 +bookshelf_0391 +bookshelf_0392 +bookshelf_0393 +bookshelf_0394 +bookshelf_0395 +bookshelf_0396 +bookshelf_0397 +bookshelf_0398 +bookshelf_0399 +bookshelf_0400 +bookshelf_0401 +bookshelf_0402 +bookshelf_0403 +bookshelf_0404 +bookshelf_0405 +bookshelf_0406 +bookshelf_0407 +bookshelf_0408 +bookshelf_0409 +bookshelf_0410 +bookshelf_0411 +bookshelf_0412 +bookshelf_0413 +bookshelf_0414 +bookshelf_0415 +bookshelf_0416 +bookshelf_0417 +bookshelf_0418 +bookshelf_0419 +bookshelf_0420 +bookshelf_0421 +bookshelf_0422 +bookshelf_0423 +bookshelf_0424 +bookshelf_0425 +bookshelf_0426 +bookshelf_0427 +bookshelf_0428 +bookshelf_0429 +bookshelf_0430 +bookshelf_0431 +bookshelf_0432 +bookshelf_0433 +bookshelf_0434 +bookshelf_0435 +bookshelf_0436 +bookshelf_0437 +bookshelf_0438 +bookshelf_0439 +bookshelf_0440 +bookshelf_0441 +bookshelf_0442 +bookshelf_0443 +bookshelf_0444 +bookshelf_0445 +bookshelf_0446 +bookshelf_0447 +bookshelf_0448 +bookshelf_0449 +bookshelf_0450 +bookshelf_0451 +bookshelf_0452 +bookshelf_0453 +bookshelf_0454 +bookshelf_0455 +bookshelf_0456 +bookshelf_0457 +bookshelf_0458 +bookshelf_0459 +bookshelf_0460 +bookshelf_0461 +bookshelf_0462 +bookshelf_0463 +bookshelf_0464 +bookshelf_0465 +bookshelf_0466 +bookshelf_0467 +bookshelf_0468 +bookshelf_0469 +bookshelf_0470 +bookshelf_0471 +bookshelf_0472 +bookshelf_0473 +bookshelf_0474 +bookshelf_0475 +bookshelf_0476 +bookshelf_0477 +bookshelf_0478 +bookshelf_0479 +bookshelf_0480 +bookshelf_0481 +bookshelf_0482 +bookshelf_0483 +bookshelf_0484 +bookshelf_0485 +bookshelf_0486 +bookshelf_0487 +bookshelf_0488 +bookshelf_0489 +bookshelf_0490 +bookshelf_0491 +bookshelf_0492 +bookshelf_0493 +bookshelf_0494 +bookshelf_0495 +bookshelf_0496 +bookshelf_0497 +bookshelf_0498 +bookshelf_0499 +bookshelf_0500 +bookshelf_0501 +bookshelf_0502 +bookshelf_0503 +bookshelf_0504 +bookshelf_0505 +bookshelf_0506 +bookshelf_0507 +bookshelf_0508 +bookshelf_0509 +bookshelf_0510 +bookshelf_0511 +bookshelf_0512 +bookshelf_0513 +bookshelf_0514 +bookshelf_0515 +bookshelf_0516 +bookshelf_0517 +bookshelf_0518 +bookshelf_0519 +bookshelf_0520 +bookshelf_0521 +bookshelf_0522 +bookshelf_0523 +bookshelf_0524 +bookshelf_0525 +bookshelf_0526 +bookshelf_0527 +bookshelf_0528 +bookshelf_0529 +bookshelf_0530 +bookshelf_0531 +bookshelf_0532 +bookshelf_0533 +bookshelf_0534 +bookshelf_0535 +bookshelf_0536 +bookshelf_0537 +bookshelf_0538 +bookshelf_0539 +bookshelf_0540 +bookshelf_0541 +bookshelf_0542 +bookshelf_0543 +bookshelf_0544 +bookshelf_0545 +bookshelf_0546 +bookshelf_0547 +bookshelf_0548 +bookshelf_0549 +bookshelf_0550 +bookshelf_0551 +bookshelf_0552 +bookshelf_0553 +bookshelf_0554 +bookshelf_0555 +bookshelf_0556 +bookshelf_0557 +bookshelf_0558 +bookshelf_0559 +bookshelf_0560 +bookshelf_0561 +bookshelf_0562 +bookshelf_0563 +bookshelf_0564 +bookshelf_0565 +bookshelf_0566 +bookshelf_0567 +bookshelf_0568 +bookshelf_0569 +bookshelf_0570 +bookshelf_0571 +bookshelf_0572 +bottle_0001 +bottle_0002 +bottle_0003 +bottle_0004 +bottle_0005 +bottle_0006 +bottle_0007 +bottle_0008 +bottle_0009 +bottle_0010 +bottle_0011 +bottle_0012 +bottle_0013 +bottle_0014 +bottle_0015 +bottle_0016 +bottle_0017 +bottle_0018 +bottle_0019 +bottle_0020 +bottle_0021 +bottle_0022 +bottle_0023 +bottle_0024 +bottle_0025 +bottle_0026 +bottle_0027 +bottle_0028 +bottle_0029 +bottle_0030 +bottle_0031 +bottle_0032 +bottle_0033 +bottle_0034 +bottle_0035 +bottle_0036 +bottle_0037 +bottle_0038 +bottle_0039 +bottle_0040 +bottle_0041 +bottle_0042 +bottle_0043 +bottle_0044 +bottle_0045 +bottle_0046 +bottle_0047 +bottle_0048 +bottle_0049 +bottle_0050 +bottle_0051 +bottle_0052 +bottle_0053 +bottle_0054 +bottle_0055 +bottle_0056 +bottle_0057 +bottle_0058 +bottle_0059 +bottle_0060 +bottle_0061 +bottle_0062 +bottle_0063 +bottle_0064 +bottle_0065 +bottle_0066 +bottle_0067 +bottle_0068 +bottle_0069 +bottle_0070 +bottle_0071 +bottle_0072 +bottle_0073 +bottle_0074 +bottle_0075 +bottle_0076 +bottle_0077 +bottle_0078 +bottle_0079 +bottle_0080 +bottle_0081 +bottle_0082 +bottle_0083 +bottle_0084 +bottle_0085 +bottle_0086 +bottle_0087 +bottle_0088 +bottle_0089 +bottle_0090 +bottle_0091 +bottle_0092 +bottle_0093 +bottle_0094 +bottle_0095 +bottle_0096 +bottle_0097 +bottle_0098 +bottle_0099 +bottle_0100 +bottle_0101 +bottle_0102 +bottle_0103 +bottle_0104 +bottle_0105 +bottle_0106 +bottle_0107 +bottle_0108 +bottle_0109 +bottle_0110 +bottle_0111 +bottle_0112 +bottle_0113 +bottle_0114 +bottle_0115 +bottle_0116 +bottle_0117 +bottle_0118 +bottle_0119 +bottle_0120 +bottle_0121 +bottle_0122 +bottle_0123 +bottle_0124 +bottle_0125 +bottle_0126 +bottle_0127 +bottle_0128 +bottle_0129 +bottle_0130 +bottle_0131 +bottle_0132 +bottle_0133 +bottle_0134 +bottle_0135 +bottle_0136 +bottle_0137 +bottle_0138 +bottle_0139 +bottle_0140 +bottle_0141 +bottle_0142 +bottle_0143 +bottle_0144 +bottle_0145 +bottle_0146 +bottle_0147 +bottle_0148 +bottle_0149 +bottle_0150 +bottle_0151 +bottle_0152 +bottle_0153 +bottle_0154 +bottle_0155 +bottle_0156 +bottle_0157 +bottle_0158 +bottle_0159 +bottle_0160 +bottle_0161 +bottle_0162 +bottle_0163 +bottle_0164 +bottle_0165 +bottle_0166 +bottle_0167 +bottle_0168 +bottle_0169 +bottle_0170 +bottle_0171 +bottle_0172 +bottle_0173 +bottle_0174 +bottle_0175 +bottle_0176 +bottle_0177 +bottle_0178 +bottle_0179 +bottle_0180 +bottle_0181 +bottle_0182 +bottle_0183 +bottle_0184 +bottle_0185 +bottle_0186 +bottle_0187 +bottle_0188 +bottle_0189 +bottle_0190 +bottle_0191 +bottle_0192 +bottle_0193 +bottle_0194 +bottle_0195 +bottle_0196 +bottle_0197 +bottle_0198 +bottle_0199 +bottle_0200 +bottle_0201 +bottle_0202 +bottle_0203 +bottle_0204 +bottle_0205 +bottle_0206 +bottle_0207 +bottle_0208 +bottle_0209 +bottle_0210 +bottle_0211 +bottle_0212 +bottle_0213 +bottle_0214 +bottle_0215 +bottle_0216 +bottle_0217 +bottle_0218 +bottle_0219 +bottle_0220 +bottle_0221 +bottle_0222 +bottle_0223 +bottle_0224 +bottle_0225 +bottle_0226 +bottle_0227 +bottle_0228 +bottle_0229 +bottle_0230 +bottle_0231 +bottle_0232 +bottle_0233 +bottle_0234 +bottle_0235 +bottle_0236 +bottle_0237 +bottle_0238 +bottle_0239 +bottle_0240 +bottle_0241 +bottle_0242 +bottle_0243 +bottle_0244 +bottle_0245 +bottle_0246 +bottle_0247 +bottle_0248 +bottle_0249 +bottle_0250 +bottle_0251 +bottle_0252 +bottle_0253 +bottle_0254 +bottle_0255 +bottle_0256 +bottle_0257 +bottle_0258 +bottle_0259 +bottle_0260 +bottle_0261 +bottle_0262 +bottle_0263 +bottle_0264 +bottle_0265 +bottle_0266 +bottle_0267 +bottle_0268 +bottle_0269 +bottle_0270 +bottle_0271 +bottle_0272 +bottle_0273 +bottle_0274 +bottle_0275 +bottle_0276 +bottle_0277 +bottle_0278 +bottle_0279 +bottle_0280 +bottle_0281 +bottle_0282 +bottle_0283 +bottle_0284 +bottle_0285 +bottle_0286 +bottle_0287 +bottle_0288 +bottle_0289 +bottle_0290 +bottle_0291 +bottle_0292 +bottle_0293 +bottle_0294 +bottle_0295 +bottle_0296 +bottle_0297 +bottle_0298 +bottle_0299 +bottle_0300 +bottle_0301 +bottle_0302 +bottle_0303 +bottle_0304 +bottle_0305 +bottle_0306 +bottle_0307 +bottle_0308 +bottle_0309 +bottle_0310 +bottle_0311 +bottle_0312 +bottle_0313 +bottle_0314 +bottle_0315 +bottle_0316 +bottle_0317 +bottle_0318 +bottle_0319 +bottle_0320 +bottle_0321 +bottle_0322 +bottle_0323 +bottle_0324 +bottle_0325 +bottle_0326 +bottle_0327 +bottle_0328 +bottle_0329 +bottle_0330 +bottle_0331 +bottle_0332 +bottle_0333 +bottle_0334 +bottle_0335 +bowl_0001 +bowl_0002 +bowl_0003 +bowl_0004 +bowl_0005 +bowl_0006 +bowl_0007 +bowl_0008 +bowl_0009 +bowl_0010 +bowl_0011 +bowl_0012 +bowl_0013 +bowl_0014 +bowl_0015 +bowl_0016 +bowl_0017 +bowl_0018 +bowl_0019 +bowl_0020 +bowl_0021 +bowl_0022 +bowl_0023 +bowl_0024 +bowl_0025 +bowl_0026 +bowl_0027 +bowl_0028 +bowl_0029 +bowl_0030 +bowl_0031 +bowl_0032 +bowl_0033 +bowl_0034 +bowl_0035 +bowl_0036 +bowl_0037 +bowl_0038 +bowl_0039 +bowl_0040 +bowl_0041 +bowl_0042 +bowl_0043 +bowl_0044 +bowl_0045 +bowl_0046 +bowl_0047 +bowl_0048 +bowl_0049 +bowl_0050 +bowl_0051 +bowl_0052 +bowl_0053 +bowl_0054 +bowl_0055 +bowl_0056 +bowl_0057 +bowl_0058 +bowl_0059 +bowl_0060 +bowl_0061 +bowl_0062 +bowl_0063 +bowl_0064 +car_0001 +car_0002 +car_0003 +car_0004 +car_0005 +car_0006 +car_0007 +car_0008 +car_0009 +car_0010 +car_0011 +car_0012 +car_0013 +car_0014 +car_0015 +car_0016 +car_0017 +car_0018 +car_0019 +car_0020 +car_0021 +car_0022 +car_0023 +car_0024 +car_0025 +car_0026 +car_0027 +car_0028 +car_0029 +car_0030 +car_0031 +car_0032 +car_0033 +car_0034 +car_0035 +car_0036 +car_0037 +car_0038 +car_0039 +car_0040 +car_0041 +car_0042 +car_0043 +car_0044 +car_0045 +car_0046 +car_0047 +car_0048 +car_0049 +car_0050 +car_0051 +car_0052 +car_0053 +car_0054 +car_0055 +car_0056 +car_0057 +car_0058 +car_0059 +car_0060 +car_0061 +car_0062 +car_0063 +car_0064 +car_0065 +car_0066 +car_0067 +car_0068 +car_0069 +car_0070 +car_0071 +car_0072 +car_0073 +car_0074 +car_0075 +car_0076 +car_0077 +car_0078 +car_0079 +car_0080 +car_0081 +car_0082 +car_0083 +car_0084 +car_0085 +car_0086 +car_0087 +car_0088 +car_0089 +car_0090 +car_0091 +car_0092 +car_0093 +car_0094 +car_0095 +car_0096 +car_0097 +car_0098 +car_0099 +car_0100 +car_0101 +car_0102 +car_0103 +car_0104 +car_0105 +car_0106 +car_0107 +car_0108 +car_0109 +car_0110 +car_0111 +car_0112 +car_0113 +car_0114 +car_0115 +car_0116 +car_0117 +car_0118 +car_0119 +car_0120 +car_0121 +car_0122 +car_0123 +car_0124 +car_0125 +car_0126 +car_0127 +car_0128 +car_0129 +car_0130 +car_0131 +car_0132 +car_0133 +car_0134 +car_0135 +car_0136 +car_0137 +car_0138 +car_0139 +car_0140 +car_0141 +car_0142 +car_0143 +car_0144 +car_0145 +car_0146 +car_0147 +car_0148 +car_0149 +car_0150 +car_0151 +car_0152 +car_0153 +car_0154 +car_0155 +car_0156 +car_0157 +car_0158 +car_0159 +car_0160 +car_0161 +car_0162 +car_0163 +car_0164 +car_0165 +car_0166 +car_0167 +car_0168 +car_0169 +car_0170 +car_0171 +car_0172 +car_0173 +car_0174 +car_0175 +car_0176 +car_0177 +car_0178 +car_0179 +car_0180 +car_0181 +car_0182 +car_0183 +car_0184 +car_0185 +car_0186 +car_0187 +car_0188 +car_0189 +car_0190 +car_0191 +car_0192 +car_0193 +car_0194 +car_0195 +car_0196 +car_0197 +chair_0001 +chair_0002 +chair_0003 +chair_0004 +chair_0005 +chair_0006 +chair_0007 +chair_0008 +chair_0009 +chair_0010 +chair_0011 +chair_0012 +chair_0013 +chair_0014 +chair_0015 +chair_0016 +chair_0017 +chair_0018 +chair_0019 +chair_0020 +chair_0021 +chair_0022 +chair_0023 +chair_0024 +chair_0025 +chair_0026 +chair_0027 +chair_0028 +chair_0029 +chair_0030 +chair_0031 +chair_0032 +chair_0033 +chair_0034 +chair_0035 +chair_0036 +chair_0037 +chair_0038 +chair_0039 +chair_0040 +chair_0041 +chair_0042 +chair_0043 +chair_0044 +chair_0045 +chair_0046 +chair_0047 +chair_0048 +chair_0049 +chair_0050 +chair_0051 +chair_0052 +chair_0053 +chair_0054 +chair_0055 +chair_0056 +chair_0057 +chair_0058 +chair_0059 +chair_0060 +chair_0061 +chair_0062 +chair_0063 +chair_0064 +chair_0065 +chair_0066 +chair_0067 +chair_0068 +chair_0069 +chair_0070 +chair_0071 +chair_0072 +chair_0073 +chair_0074 +chair_0075 +chair_0076 +chair_0077 +chair_0078 +chair_0079 +chair_0080 +chair_0081 +chair_0082 +chair_0083 +chair_0084 +chair_0085 +chair_0086 +chair_0087 +chair_0088 +chair_0089 +chair_0090 +chair_0091 +chair_0092 +chair_0093 +chair_0094 +chair_0095 +chair_0096 +chair_0097 +chair_0098 +chair_0099 +chair_0100 +chair_0101 +chair_0102 +chair_0103 +chair_0104 +chair_0105 +chair_0106 +chair_0107 +chair_0108 +chair_0109 +chair_0110 +chair_0111 +chair_0112 +chair_0113 +chair_0114 +chair_0115 +chair_0116 +chair_0117 +chair_0118 +chair_0119 +chair_0120 +chair_0121 +chair_0122 +chair_0123 +chair_0124 +chair_0125 +chair_0126 +chair_0127 +chair_0128 +chair_0129 +chair_0130 +chair_0131 +chair_0132 +chair_0133 +chair_0134 +chair_0135 +chair_0136 +chair_0137 +chair_0138 +chair_0139 +chair_0140 +chair_0141 +chair_0142 +chair_0143 +chair_0144 +chair_0145 +chair_0146 +chair_0147 +chair_0148 +chair_0149 +chair_0150 +chair_0151 +chair_0152 +chair_0153 +chair_0154 +chair_0155 +chair_0156 +chair_0157 +chair_0158 +chair_0159 +chair_0160 +chair_0161 +chair_0162 +chair_0163 +chair_0164 +chair_0165 +chair_0166 +chair_0167 +chair_0168 +chair_0169 +chair_0170 +chair_0171 +chair_0172 +chair_0173 +chair_0174 +chair_0175 +chair_0176 +chair_0177 +chair_0178 +chair_0179 +chair_0180 +chair_0181 +chair_0182 +chair_0183 +chair_0184 +chair_0185 +chair_0186 +chair_0187 +chair_0188 +chair_0189 +chair_0190 +chair_0191 +chair_0192 +chair_0193 +chair_0194 +chair_0195 +chair_0196 +chair_0197 +chair_0198 +chair_0199 +chair_0200 +chair_0201 +chair_0202 +chair_0203 +chair_0204 +chair_0205 +chair_0206 +chair_0207 +chair_0208 +chair_0209 +chair_0210 +chair_0211 +chair_0212 +chair_0213 +chair_0214 +chair_0215 +chair_0216 +chair_0217 +chair_0218 +chair_0219 +chair_0220 +chair_0221 +chair_0222 +chair_0223 +chair_0224 +chair_0225 +chair_0226 +chair_0227 +chair_0228 +chair_0229 +chair_0230 +chair_0231 +chair_0232 +chair_0233 +chair_0234 +chair_0235 +chair_0236 +chair_0237 +chair_0238 +chair_0239 +chair_0240 +chair_0241 +chair_0242 +chair_0243 +chair_0244 +chair_0245 +chair_0246 +chair_0247 +chair_0248 +chair_0249 +chair_0250 +chair_0251 +chair_0252 +chair_0253 +chair_0254 +chair_0255 +chair_0256 +chair_0257 +chair_0258 +chair_0259 +chair_0260 +chair_0261 +chair_0262 +chair_0263 +chair_0264 +chair_0265 +chair_0266 +chair_0267 +chair_0268 +chair_0269 +chair_0270 +chair_0271 +chair_0272 +chair_0273 +chair_0274 +chair_0275 +chair_0276 +chair_0277 +chair_0278 +chair_0279 +chair_0280 +chair_0281 +chair_0282 +chair_0283 +chair_0284 +chair_0285 +chair_0286 +chair_0287 +chair_0288 +chair_0289 +chair_0290 +chair_0291 +chair_0292 +chair_0293 +chair_0294 +chair_0295 +chair_0296 +chair_0297 +chair_0298 +chair_0299 +chair_0300 +chair_0301 +chair_0302 +chair_0303 +chair_0304 +chair_0305 +chair_0306 +chair_0307 +chair_0308 +chair_0309 +chair_0310 +chair_0311 +chair_0312 +chair_0313 +chair_0314 +chair_0315 +chair_0316 +chair_0317 +chair_0318 +chair_0319 +chair_0320 +chair_0321 +chair_0322 +chair_0323 +chair_0324 +chair_0325 +chair_0326 +chair_0327 +chair_0328 +chair_0329 +chair_0330 +chair_0331 +chair_0332 +chair_0333 +chair_0334 +chair_0335 +chair_0336 +chair_0337 +chair_0338 +chair_0339 +chair_0340 +chair_0341 +chair_0342 +chair_0343 +chair_0344 +chair_0345 +chair_0346 +chair_0347 +chair_0348 +chair_0349 +chair_0350 +chair_0351 +chair_0352 +chair_0353 +chair_0354 +chair_0355 +chair_0356 +chair_0357 +chair_0358 +chair_0359 +chair_0360 +chair_0361 +chair_0362 +chair_0363 +chair_0364 +chair_0365 +chair_0366 +chair_0367 +chair_0368 +chair_0369 +chair_0370 +chair_0371 +chair_0372 +chair_0373 +chair_0374 +chair_0375 +chair_0376 +chair_0377 +chair_0378 +chair_0379 +chair_0380 +chair_0381 +chair_0382 +chair_0383 +chair_0384 +chair_0385 +chair_0386 +chair_0387 +chair_0388 +chair_0389 +chair_0390 +chair_0391 +chair_0392 +chair_0393 +chair_0394 +chair_0395 +chair_0396 +chair_0397 +chair_0398 +chair_0399 +chair_0400 +chair_0401 +chair_0402 +chair_0403 +chair_0404 +chair_0405 +chair_0406 +chair_0407 +chair_0408 +chair_0409 +chair_0410 +chair_0411 +chair_0412 +chair_0413 +chair_0414 +chair_0415 +chair_0416 +chair_0417 +chair_0418 +chair_0419 +chair_0420 +chair_0421 +chair_0422 +chair_0423 +chair_0424 +chair_0425 +chair_0426 +chair_0427 +chair_0428 +chair_0429 +chair_0430 +chair_0431 +chair_0432 +chair_0433 +chair_0434 +chair_0435 +chair_0436 +chair_0437 +chair_0438 +chair_0439 +chair_0440 +chair_0441 +chair_0442 +chair_0443 +chair_0444 +chair_0445 +chair_0446 +chair_0447 +chair_0448 +chair_0449 +chair_0450 +chair_0451 +chair_0452 +chair_0453 +chair_0454 +chair_0455 +chair_0456 +chair_0457 +chair_0458 +chair_0459 +chair_0460 +chair_0461 +chair_0462 +chair_0463 +chair_0464 +chair_0465 +chair_0466 +chair_0467 +chair_0468 +chair_0469 +chair_0470 +chair_0471 +chair_0472 +chair_0473 +chair_0474 +chair_0475 +chair_0476 +chair_0477 +chair_0478 +chair_0479 +chair_0480 +chair_0481 +chair_0482 +chair_0483 +chair_0484 +chair_0485 +chair_0486 +chair_0487 +chair_0488 +chair_0489 +chair_0490 +chair_0491 +chair_0492 +chair_0493 +chair_0494 +chair_0495 +chair_0496 +chair_0497 +chair_0498 +chair_0499 +chair_0500 +chair_0501 +chair_0502 +chair_0503 +chair_0504 +chair_0505 +chair_0506 +chair_0507 +chair_0508 +chair_0509 +chair_0510 +chair_0511 +chair_0512 +chair_0513 +chair_0514 +chair_0515 +chair_0516 +chair_0517 +chair_0518 +chair_0519 +chair_0520 +chair_0521 +chair_0522 +chair_0523 +chair_0524 +chair_0525 +chair_0526 +chair_0527 +chair_0528 +chair_0529 +chair_0530 +chair_0531 +chair_0532 +chair_0533 +chair_0534 +chair_0535 +chair_0536 +chair_0537 +chair_0538 +chair_0539 +chair_0540 +chair_0541 +chair_0542 +chair_0543 +chair_0544 +chair_0545 +chair_0546 +chair_0547 +chair_0548 +chair_0549 +chair_0550 +chair_0551 +chair_0552 +chair_0553 +chair_0554 +chair_0555 +chair_0556 +chair_0557 +chair_0558 +chair_0559 +chair_0560 +chair_0561 +chair_0562 +chair_0563 +chair_0564 +chair_0565 +chair_0566 +chair_0567 +chair_0568 +chair_0569 +chair_0570 +chair_0571 +chair_0572 +chair_0573 +chair_0574 +chair_0575 +chair_0576 +chair_0577 +chair_0578 +chair_0579 +chair_0580 +chair_0581 +chair_0582 +chair_0583 +chair_0584 +chair_0585 +chair_0586 +chair_0587 +chair_0588 +chair_0589 +chair_0590 +chair_0591 +chair_0592 +chair_0593 +chair_0594 +chair_0595 +chair_0596 +chair_0597 +chair_0598 +chair_0599 +chair_0600 +chair_0601 +chair_0602 +chair_0603 +chair_0604 +chair_0605 +chair_0606 +chair_0607 +chair_0608 +chair_0609 +chair_0610 +chair_0611 +chair_0612 +chair_0613 +chair_0614 +chair_0615 +chair_0616 +chair_0617 +chair_0618 +chair_0619 +chair_0620 +chair_0621 +chair_0622 +chair_0623 +chair_0624 +chair_0625 +chair_0626 +chair_0627 +chair_0628 +chair_0629 +chair_0630 +chair_0631 +chair_0632 +chair_0633 +chair_0634 +chair_0635 +chair_0636 +chair_0637 +chair_0638 +chair_0639 +chair_0640 +chair_0641 +chair_0642 +chair_0643 +chair_0644 +chair_0645 +chair_0646 +chair_0647 +chair_0648 +chair_0649 +chair_0650 +chair_0651 +chair_0652 +chair_0653 +chair_0654 +chair_0655 +chair_0656 +chair_0657 +chair_0658 +chair_0659 +chair_0660 +chair_0661 +chair_0662 +chair_0663 +chair_0664 +chair_0665 +chair_0666 +chair_0667 +chair_0668 +chair_0669 +chair_0670 +chair_0671 +chair_0672 +chair_0673 +chair_0674 +chair_0675 +chair_0676 +chair_0677 +chair_0678 +chair_0679 +chair_0680 +chair_0681 +chair_0682 +chair_0683 +chair_0684 +chair_0685 +chair_0686 +chair_0687 +chair_0688 +chair_0689 +chair_0690 +chair_0691 +chair_0692 +chair_0693 +chair_0694 +chair_0695 +chair_0696 +chair_0697 +chair_0698 +chair_0699 +chair_0700 +chair_0701 +chair_0702 +chair_0703 +chair_0704 +chair_0705 +chair_0706 +chair_0707 +chair_0708 +chair_0709 +chair_0710 +chair_0711 +chair_0712 +chair_0713 +chair_0714 +chair_0715 +chair_0716 +chair_0717 +chair_0718 +chair_0719 +chair_0720 +chair_0721 +chair_0722 +chair_0723 +chair_0724 +chair_0725 +chair_0726 +chair_0727 +chair_0728 +chair_0729 +chair_0730 +chair_0731 +chair_0732 +chair_0733 +chair_0734 +chair_0735 +chair_0736 +chair_0737 +chair_0738 +chair_0739 +chair_0740 +chair_0741 +chair_0742 +chair_0743 +chair_0744 +chair_0745 +chair_0746 +chair_0747 +chair_0748 +chair_0749 +chair_0750 +chair_0751 +chair_0752 +chair_0753 +chair_0754 +chair_0755 +chair_0756 +chair_0757 +chair_0758 +chair_0759 +chair_0760 +chair_0761 +chair_0762 +chair_0763 +chair_0764 +chair_0765 +chair_0766 +chair_0767 +chair_0768 +chair_0769 +chair_0770 +chair_0771 +chair_0772 +chair_0773 +chair_0774 +chair_0775 +chair_0776 +chair_0777 +chair_0778 +chair_0779 +chair_0780 +chair_0781 +chair_0782 +chair_0783 +chair_0784 +chair_0785 +chair_0786 +chair_0787 +chair_0788 +chair_0789 +chair_0790 +chair_0791 +chair_0792 +chair_0793 +chair_0794 +chair_0795 +chair_0796 +chair_0797 +chair_0798 +chair_0799 +chair_0800 +chair_0801 +chair_0802 +chair_0803 +chair_0804 +chair_0805 +chair_0806 +chair_0807 +chair_0808 +chair_0809 +chair_0810 +chair_0811 +chair_0812 +chair_0813 +chair_0814 +chair_0815 +chair_0816 +chair_0817 +chair_0818 +chair_0819 +chair_0820 +chair_0821 +chair_0822 +chair_0823 +chair_0824 +chair_0825 +chair_0826 +chair_0827 +chair_0828 +chair_0829 +chair_0830 +chair_0831 +chair_0832 +chair_0833 +chair_0834 +chair_0835 +chair_0836 +chair_0837 +chair_0838 +chair_0839 +chair_0840 +chair_0841 +chair_0842 +chair_0843 +chair_0844 +chair_0845 +chair_0846 +chair_0847 +chair_0848 +chair_0849 +chair_0850 +chair_0851 +chair_0852 +chair_0853 +chair_0854 +chair_0855 +chair_0856 +chair_0857 +chair_0858 +chair_0859 +chair_0860 +chair_0861 +chair_0862 +chair_0863 +chair_0864 +chair_0865 +chair_0866 +chair_0867 +chair_0868 +chair_0869 +chair_0870 +chair_0871 +chair_0872 +chair_0873 +chair_0874 +chair_0875 +chair_0876 +chair_0877 +chair_0878 +chair_0879 +chair_0880 +chair_0881 +chair_0882 +chair_0883 +chair_0884 +chair_0885 +chair_0886 +chair_0887 +chair_0888 +chair_0889 +cone_0001 +cone_0002 +cone_0003 +cone_0004 +cone_0005 +cone_0006 +cone_0007 +cone_0008 +cone_0009 +cone_0010 +cone_0011 +cone_0012 +cone_0013 +cone_0014 +cone_0015 +cone_0016 +cone_0017 +cone_0018 +cone_0019 +cone_0020 +cone_0021 +cone_0022 +cone_0023 +cone_0024 +cone_0025 +cone_0026 +cone_0027 +cone_0028 +cone_0029 +cone_0030 +cone_0031 +cone_0032 +cone_0033 +cone_0034 +cone_0035 +cone_0036 +cone_0037 +cone_0038 +cone_0039 +cone_0040 +cone_0041 +cone_0042 +cone_0043 +cone_0044 +cone_0045 +cone_0046 +cone_0047 +cone_0048 +cone_0049 +cone_0050 +cone_0051 +cone_0052 +cone_0053 +cone_0054 +cone_0055 +cone_0056 +cone_0057 +cone_0058 +cone_0059 +cone_0060 +cone_0061 +cone_0062 +cone_0063 +cone_0064 +cone_0065 +cone_0066 +cone_0067 +cone_0068 +cone_0069 +cone_0070 +cone_0071 +cone_0072 +cone_0073 +cone_0074 +cone_0075 +cone_0076 +cone_0077 +cone_0078 +cone_0079 +cone_0080 +cone_0081 +cone_0082 +cone_0083 +cone_0084 +cone_0085 +cone_0086 +cone_0087 +cone_0088 +cone_0089 +cone_0090 +cone_0091 +cone_0092 +cone_0093 +cone_0094 +cone_0095 +cone_0096 +cone_0097 +cone_0098 +cone_0099 +cone_0100 +cone_0101 +cone_0102 +cone_0103 +cone_0104 +cone_0105 +cone_0106 +cone_0107 +cone_0108 +cone_0109 +cone_0110 +cone_0111 +cone_0112 +cone_0113 +cone_0114 +cone_0115 +cone_0116 +cone_0117 +cone_0118 +cone_0119 +cone_0120 +cone_0121 +cone_0122 +cone_0123 +cone_0124 +cone_0125 +cone_0126 +cone_0127 +cone_0128 +cone_0129 +cone_0130 +cone_0131 +cone_0132 +cone_0133 +cone_0134 +cone_0135 +cone_0136 +cone_0137 +cone_0138 +cone_0139 +cone_0140 +cone_0141 +cone_0142 +cone_0143 +cone_0144 +cone_0145 +cone_0146 +cone_0147 +cone_0148 +cone_0149 +cone_0150 +cone_0151 +cone_0152 +cone_0153 +cone_0154 +cone_0155 +cone_0156 +cone_0157 +cone_0158 +cone_0159 +cone_0160 +cone_0161 +cone_0162 +cone_0163 +cone_0164 +cone_0165 +cone_0166 +cone_0167 +cup_0001 +cup_0002 +cup_0003 +cup_0004 +cup_0005 +cup_0006 +cup_0007 +cup_0008 +cup_0009 +cup_0010 +cup_0011 +cup_0012 +cup_0013 +cup_0014 +cup_0015 +cup_0016 +cup_0017 +cup_0018 +cup_0019 +cup_0020 +cup_0021 +cup_0022 +cup_0023 +cup_0024 +cup_0025 +cup_0026 +cup_0027 +cup_0028 +cup_0029 +cup_0030 +cup_0031 +cup_0032 +cup_0033 +cup_0034 +cup_0035 +cup_0036 +cup_0037 +cup_0038 +cup_0039 +cup_0040 +cup_0041 +cup_0042 +cup_0043 +cup_0044 +cup_0045 +cup_0046 +cup_0047 +cup_0048 +cup_0049 +cup_0050 +cup_0051 +cup_0052 +cup_0053 +cup_0054 +cup_0055 +cup_0056 +cup_0057 +cup_0058 +cup_0059 +cup_0060 +cup_0061 +cup_0062 +cup_0063 +cup_0064 +cup_0065 +cup_0066 +cup_0067 +cup_0068 +cup_0069 +cup_0070 +cup_0071 +cup_0072 +cup_0073 +cup_0074 +cup_0075 +cup_0076 +cup_0077 +cup_0078 +cup_0079 +curtain_0001 +curtain_0002 +curtain_0003 +curtain_0004 +curtain_0005 +curtain_0006 +curtain_0007 +curtain_0008 +curtain_0009 +curtain_0010 +curtain_0011 +curtain_0012 +curtain_0013 +curtain_0014 +curtain_0015 +curtain_0016 +curtain_0017 +curtain_0018 +curtain_0019 +curtain_0020 +curtain_0021 +curtain_0022 +curtain_0023 +curtain_0024 +curtain_0025 +curtain_0026 +curtain_0027 +curtain_0028 +curtain_0029 +curtain_0030 +curtain_0031 +curtain_0032 +curtain_0033 +curtain_0034 +curtain_0035 +curtain_0036 +curtain_0037 +curtain_0038 +curtain_0039 +curtain_0040 +curtain_0041 +curtain_0042 +curtain_0043 +curtain_0044 +curtain_0045 +curtain_0046 +curtain_0047 +curtain_0048 +curtain_0049 +curtain_0050 +curtain_0051 +curtain_0052 +curtain_0053 +curtain_0054 +curtain_0055 +curtain_0056 +curtain_0057 +curtain_0058 +curtain_0059 +curtain_0060 +curtain_0061 +curtain_0062 +curtain_0063 +curtain_0064 +curtain_0065 +curtain_0066 +curtain_0067 +curtain_0068 +curtain_0069 +curtain_0070 +curtain_0071 +curtain_0072 +curtain_0073 +curtain_0074 +curtain_0075 +curtain_0076 +curtain_0077 +curtain_0078 +curtain_0079 +curtain_0080 +curtain_0081 +curtain_0082 +curtain_0083 +curtain_0084 +curtain_0085 +curtain_0086 +curtain_0087 +curtain_0088 +curtain_0089 +curtain_0090 +curtain_0091 +curtain_0092 +curtain_0093 +curtain_0094 +curtain_0095 +curtain_0096 +curtain_0097 +curtain_0098 +curtain_0099 +curtain_0100 +curtain_0101 +curtain_0102 +curtain_0103 +curtain_0104 +curtain_0105 +curtain_0106 +curtain_0107 +curtain_0108 +curtain_0109 +curtain_0110 +curtain_0111 +curtain_0112 +curtain_0113 +curtain_0114 +curtain_0115 +curtain_0116 +curtain_0117 +curtain_0118 +curtain_0119 +curtain_0120 +curtain_0121 +curtain_0122 +curtain_0123 +curtain_0124 +curtain_0125 +curtain_0126 +curtain_0127 +curtain_0128 +curtain_0129 +curtain_0130 +curtain_0131 +curtain_0132 +curtain_0133 +curtain_0134 +curtain_0135 +curtain_0136 +curtain_0137 +curtain_0138 +desk_0001 +desk_0002 +desk_0003 +desk_0004 +desk_0005 +desk_0006 +desk_0007 +desk_0008 +desk_0009 +desk_0010 +desk_0011 +desk_0012 +desk_0013 +desk_0014 +desk_0015 +desk_0016 +desk_0017 +desk_0018 +desk_0019 +desk_0020 +desk_0021 +desk_0022 +desk_0023 +desk_0024 +desk_0025 +desk_0026 +desk_0027 +desk_0028 +desk_0029 +desk_0030 +desk_0031 +desk_0032 +desk_0033 +desk_0034 +desk_0035 +desk_0036 +desk_0037 +desk_0038 +desk_0039 +desk_0040 +desk_0041 +desk_0042 +desk_0043 +desk_0044 +desk_0045 +desk_0046 +desk_0047 +desk_0048 +desk_0049 +desk_0050 +desk_0051 +desk_0052 +desk_0053 +desk_0054 +desk_0055 +desk_0056 +desk_0057 +desk_0058 +desk_0059 +desk_0060 +desk_0061 +desk_0062 +desk_0063 +desk_0064 +desk_0065 +desk_0066 +desk_0067 +desk_0068 +desk_0069 +desk_0070 +desk_0071 +desk_0072 +desk_0073 +desk_0074 +desk_0075 +desk_0076 +desk_0077 +desk_0078 +desk_0079 +desk_0080 +desk_0081 +desk_0082 +desk_0083 +desk_0084 +desk_0085 +desk_0086 +desk_0087 +desk_0088 +desk_0089 +desk_0090 +desk_0091 +desk_0092 +desk_0093 +desk_0094 +desk_0095 +desk_0096 +desk_0097 +desk_0098 +desk_0099 +desk_0100 +desk_0101 +desk_0102 +desk_0103 +desk_0104 +desk_0105 +desk_0106 +desk_0107 +desk_0108 +desk_0109 +desk_0110 +desk_0111 +desk_0112 +desk_0113 +desk_0114 +desk_0115 +desk_0116 +desk_0117 +desk_0118 +desk_0119 +desk_0120 +desk_0121 +desk_0122 +desk_0123 +desk_0124 +desk_0125 +desk_0126 +desk_0127 +desk_0128 +desk_0129 +desk_0130 +desk_0131 +desk_0132 +desk_0133 +desk_0134 +desk_0135 +desk_0136 +desk_0137 +desk_0138 +desk_0139 +desk_0140 +desk_0141 +desk_0142 +desk_0143 +desk_0144 +desk_0145 +desk_0146 +desk_0147 +desk_0148 +desk_0149 +desk_0150 +desk_0151 +desk_0152 +desk_0153 +desk_0154 +desk_0155 +desk_0156 +desk_0157 +desk_0158 +desk_0159 +desk_0160 +desk_0161 +desk_0162 +desk_0163 +desk_0164 +desk_0165 +desk_0166 +desk_0167 +desk_0168 +desk_0169 +desk_0170 +desk_0171 +desk_0172 +desk_0173 +desk_0174 +desk_0175 +desk_0176 +desk_0177 +desk_0178 +desk_0179 +desk_0180 +desk_0181 +desk_0182 +desk_0183 +desk_0184 +desk_0185 +desk_0186 +desk_0187 +desk_0188 +desk_0189 +desk_0190 +desk_0191 +desk_0192 +desk_0193 +desk_0194 +desk_0195 +desk_0196 +desk_0197 +desk_0198 +desk_0199 +desk_0200 +door_0001 +door_0002 +door_0003 +door_0004 +door_0005 +door_0006 +door_0007 +door_0008 +door_0009 +door_0010 +door_0011 +door_0012 +door_0013 +door_0014 +door_0015 +door_0016 +door_0017 +door_0018 +door_0019 +door_0020 +door_0021 +door_0022 +door_0023 +door_0024 +door_0025 +door_0026 +door_0027 +door_0028 +door_0029 +door_0030 +door_0031 +door_0032 +door_0033 +door_0034 +door_0035 +door_0036 +door_0037 +door_0038 +door_0039 +door_0040 +door_0041 +door_0042 +door_0043 +door_0044 +door_0045 +door_0046 +door_0047 +door_0048 +door_0049 +door_0050 +door_0051 +door_0052 +door_0053 +door_0054 +door_0055 +door_0056 +door_0057 +door_0058 +door_0059 +door_0060 +door_0061 +door_0062 +door_0063 +door_0064 +door_0065 +door_0066 +door_0067 +door_0068 +door_0069 +door_0070 +door_0071 +door_0072 +door_0073 +door_0074 +door_0075 +door_0076 +door_0077 +door_0078 +door_0079 +door_0080 +door_0081 +door_0082 +door_0083 +door_0084 +door_0085 +door_0086 +door_0087 +door_0088 +door_0089 +door_0090 +door_0091 +door_0092 +door_0093 +door_0094 +door_0095 +door_0096 +door_0097 +door_0098 +door_0099 +door_0100 +door_0101 +door_0102 +door_0103 +door_0104 +door_0105 +door_0106 +door_0107 +door_0108 +door_0109 +dresser_0001 +dresser_0002 +dresser_0003 +dresser_0004 +dresser_0005 +dresser_0006 +dresser_0007 +dresser_0008 +dresser_0009 +dresser_0010 +dresser_0011 +dresser_0012 +dresser_0013 +dresser_0014 +dresser_0015 +dresser_0016 +dresser_0017 +dresser_0018 +dresser_0019 +dresser_0020 +dresser_0021 +dresser_0022 +dresser_0023 +dresser_0024 +dresser_0025 +dresser_0026 +dresser_0027 +dresser_0028 +dresser_0029 +dresser_0030 +dresser_0031 +dresser_0032 +dresser_0033 +dresser_0034 +dresser_0035 +dresser_0036 +dresser_0037 +dresser_0038 +dresser_0039 +dresser_0040 +dresser_0041 +dresser_0042 +dresser_0043 +dresser_0044 +dresser_0045 +dresser_0046 +dresser_0047 +dresser_0048 +dresser_0049 +dresser_0050 +dresser_0051 +dresser_0052 +dresser_0053 +dresser_0054 +dresser_0055 +dresser_0056 +dresser_0057 +dresser_0058 +dresser_0059 +dresser_0060 +dresser_0061 +dresser_0062 +dresser_0063 +dresser_0064 +dresser_0065 +dresser_0066 +dresser_0067 +dresser_0068 +dresser_0069 +dresser_0070 +dresser_0071 +dresser_0072 +dresser_0073 +dresser_0074 +dresser_0075 +dresser_0076 +dresser_0077 +dresser_0078 +dresser_0079 +dresser_0080 +dresser_0081 +dresser_0082 +dresser_0083 +dresser_0084 +dresser_0085 +dresser_0086 +dresser_0087 +dresser_0088 +dresser_0089 +dresser_0090 +dresser_0091 +dresser_0092 +dresser_0093 +dresser_0094 +dresser_0095 +dresser_0096 +dresser_0097 +dresser_0098 +dresser_0099 +dresser_0100 +dresser_0101 +dresser_0102 +dresser_0103 +dresser_0104 +dresser_0105 +dresser_0106 +dresser_0107 +dresser_0108 +dresser_0109 +dresser_0110 +dresser_0111 +dresser_0112 +dresser_0113 +dresser_0114 +dresser_0115 +dresser_0116 +dresser_0117 +dresser_0118 +dresser_0119 +dresser_0120 +dresser_0121 +dresser_0122 +dresser_0123 +dresser_0124 +dresser_0125 +dresser_0126 +dresser_0127 +dresser_0128 +dresser_0129 +dresser_0130 +dresser_0131 +dresser_0132 +dresser_0133 +dresser_0134 +dresser_0135 +dresser_0136 +dresser_0137 +dresser_0138 +dresser_0139 +dresser_0140 +dresser_0141 +dresser_0142 +dresser_0143 +dresser_0144 +dresser_0145 +dresser_0146 +dresser_0147 +dresser_0148 +dresser_0149 +dresser_0150 +dresser_0151 +dresser_0152 +dresser_0153 +dresser_0154 +dresser_0155 +dresser_0156 +dresser_0157 +dresser_0158 +dresser_0159 +dresser_0160 +dresser_0161 +dresser_0162 +dresser_0163 +dresser_0164 +dresser_0165 +dresser_0166 +dresser_0167 +dresser_0168 +dresser_0169 +dresser_0170 +dresser_0171 +dresser_0172 +dresser_0173 +dresser_0174 +dresser_0175 +dresser_0176 +dresser_0177 +dresser_0178 +dresser_0179 +dresser_0180 +dresser_0181 +dresser_0182 +dresser_0183 +dresser_0184 +dresser_0185 +dresser_0186 +dresser_0187 +dresser_0188 +dresser_0189 +dresser_0190 +dresser_0191 +dresser_0192 +dresser_0193 +dresser_0194 +dresser_0195 +dresser_0196 +dresser_0197 +dresser_0198 +dresser_0199 +dresser_0200 +flower_pot_0001 +flower_pot_0002 +flower_pot_0003 +flower_pot_0004 +flower_pot_0005 +flower_pot_0006 +flower_pot_0007 +flower_pot_0008 +flower_pot_0009 +flower_pot_0010 +flower_pot_0011 +flower_pot_0012 +flower_pot_0013 +flower_pot_0014 +flower_pot_0015 +flower_pot_0016 +flower_pot_0017 +flower_pot_0018 +flower_pot_0019 +flower_pot_0020 +flower_pot_0021 +flower_pot_0022 +flower_pot_0023 +flower_pot_0024 +flower_pot_0025 +flower_pot_0026 +flower_pot_0027 +flower_pot_0028 +flower_pot_0029 +flower_pot_0030 +flower_pot_0031 +flower_pot_0032 +flower_pot_0033 +flower_pot_0034 +flower_pot_0035 +flower_pot_0036 +flower_pot_0037 +flower_pot_0038 +flower_pot_0039 +flower_pot_0040 +flower_pot_0041 +flower_pot_0042 +flower_pot_0043 +flower_pot_0044 +flower_pot_0045 +flower_pot_0046 +flower_pot_0047 +flower_pot_0048 +flower_pot_0049 +flower_pot_0050 +flower_pot_0051 +flower_pot_0052 +flower_pot_0053 +flower_pot_0054 +flower_pot_0055 +flower_pot_0056 +flower_pot_0057 +flower_pot_0058 +flower_pot_0059 +flower_pot_0060 +flower_pot_0061 +flower_pot_0062 +flower_pot_0063 +flower_pot_0064 +flower_pot_0065 +flower_pot_0066 +flower_pot_0067 +flower_pot_0068 +flower_pot_0069 +flower_pot_0070 +flower_pot_0071 +flower_pot_0072 +flower_pot_0073 +flower_pot_0074 +flower_pot_0075 +flower_pot_0076 +flower_pot_0077 +flower_pot_0078 +flower_pot_0079 +flower_pot_0080 +flower_pot_0081 +flower_pot_0082 +flower_pot_0083 +flower_pot_0084 +flower_pot_0085 +flower_pot_0086 +flower_pot_0087 +flower_pot_0088 +flower_pot_0089 +flower_pot_0090 +flower_pot_0091 +flower_pot_0092 +flower_pot_0093 +flower_pot_0094 +flower_pot_0095 +flower_pot_0096 +flower_pot_0097 +flower_pot_0098 +flower_pot_0099 +flower_pot_0100 +flower_pot_0101 +flower_pot_0102 +flower_pot_0103 +flower_pot_0104 +flower_pot_0105 +flower_pot_0106 +flower_pot_0107 +flower_pot_0108 +flower_pot_0109 +flower_pot_0110 +flower_pot_0111 +flower_pot_0112 +flower_pot_0113 +flower_pot_0114 +flower_pot_0115 +flower_pot_0116 +flower_pot_0117 +flower_pot_0118 +flower_pot_0119 +flower_pot_0120 +flower_pot_0121 +flower_pot_0122 +flower_pot_0123 +flower_pot_0124 +flower_pot_0125 +flower_pot_0126 +flower_pot_0127 +flower_pot_0128 +flower_pot_0129 +flower_pot_0130 +flower_pot_0131 +flower_pot_0132 +flower_pot_0133 +flower_pot_0134 +flower_pot_0135 +flower_pot_0136 +flower_pot_0137 +flower_pot_0138 +flower_pot_0139 +flower_pot_0140 +flower_pot_0141 +flower_pot_0142 +flower_pot_0143 +flower_pot_0144 +flower_pot_0145 +flower_pot_0146 +flower_pot_0147 +flower_pot_0148 +flower_pot_0149 +glass_box_0001 +glass_box_0002 +glass_box_0003 +glass_box_0004 +glass_box_0005 +glass_box_0006 +glass_box_0007 +glass_box_0008 +glass_box_0009 +glass_box_0010 +glass_box_0011 +glass_box_0012 +glass_box_0013 +glass_box_0014 +glass_box_0015 +glass_box_0016 +glass_box_0017 +glass_box_0018 +glass_box_0019 +glass_box_0020 +glass_box_0021 +glass_box_0022 +glass_box_0023 +glass_box_0024 +glass_box_0025 +glass_box_0026 +glass_box_0027 +glass_box_0028 +glass_box_0029 +glass_box_0030 +glass_box_0031 +glass_box_0032 +glass_box_0033 +glass_box_0034 +glass_box_0035 +glass_box_0036 +glass_box_0037 +glass_box_0038 +glass_box_0039 +glass_box_0040 +glass_box_0041 +glass_box_0042 +glass_box_0043 +glass_box_0044 +glass_box_0045 +glass_box_0046 +glass_box_0047 +glass_box_0048 +glass_box_0049 +glass_box_0050 +glass_box_0051 +glass_box_0052 +glass_box_0053 +glass_box_0054 +glass_box_0055 +glass_box_0056 +glass_box_0057 +glass_box_0058 +glass_box_0059 +glass_box_0060 +glass_box_0061 +glass_box_0062 +glass_box_0063 +glass_box_0064 +glass_box_0065 +glass_box_0066 +glass_box_0067 +glass_box_0068 +glass_box_0069 +glass_box_0070 +glass_box_0071 +glass_box_0072 +glass_box_0073 +glass_box_0074 +glass_box_0075 +glass_box_0076 +glass_box_0077 +glass_box_0078 +glass_box_0079 +glass_box_0080 +glass_box_0081 +glass_box_0082 +glass_box_0083 +glass_box_0084 +glass_box_0085 +glass_box_0086 +glass_box_0087 +glass_box_0088 +glass_box_0089 +glass_box_0090 +glass_box_0091 +glass_box_0092 +glass_box_0093 +glass_box_0094 +glass_box_0095 +glass_box_0096 +glass_box_0097 +glass_box_0098 +glass_box_0099 +glass_box_0100 +glass_box_0101 +glass_box_0102 +glass_box_0103 +glass_box_0104 +glass_box_0105 +glass_box_0106 +glass_box_0107 +glass_box_0108 +glass_box_0109 +glass_box_0110 +glass_box_0111 +glass_box_0112 +glass_box_0113 +glass_box_0114 +glass_box_0115 +glass_box_0116 +glass_box_0117 +glass_box_0118 +glass_box_0119 +glass_box_0120 +glass_box_0121 +glass_box_0122 +glass_box_0123 +glass_box_0124 +glass_box_0125 +glass_box_0126 +glass_box_0127 +glass_box_0128 +glass_box_0129 +glass_box_0130 +glass_box_0131 +glass_box_0132 +glass_box_0133 +glass_box_0134 +glass_box_0135 +glass_box_0136 +glass_box_0137 +glass_box_0138 +glass_box_0139 +glass_box_0140 +glass_box_0141 +glass_box_0142 +glass_box_0143 +glass_box_0144 +glass_box_0145 +glass_box_0146 +glass_box_0147 +glass_box_0148 +glass_box_0149 +glass_box_0150 +glass_box_0151 +glass_box_0152 +glass_box_0153 +glass_box_0154 +glass_box_0155 +glass_box_0156 +glass_box_0157 +glass_box_0158 +glass_box_0159 +glass_box_0160 +glass_box_0161 +glass_box_0162 +glass_box_0163 +glass_box_0164 +glass_box_0165 +glass_box_0166 +glass_box_0167 +glass_box_0168 +glass_box_0169 +glass_box_0170 +glass_box_0171 +guitar_0001 +guitar_0002 +guitar_0003 +guitar_0004 +guitar_0005 +guitar_0006 +guitar_0007 +guitar_0008 +guitar_0009 +guitar_0010 +guitar_0011 +guitar_0012 +guitar_0013 +guitar_0014 +guitar_0015 +guitar_0016 +guitar_0017 +guitar_0018 +guitar_0019 +guitar_0020 +guitar_0021 +guitar_0022 +guitar_0023 +guitar_0024 +guitar_0025 +guitar_0026 +guitar_0027 +guitar_0028 +guitar_0029 +guitar_0030 +guitar_0031 +guitar_0032 +guitar_0033 +guitar_0034 +guitar_0035 +guitar_0036 +guitar_0037 +guitar_0038 +guitar_0039 +guitar_0040 +guitar_0041 +guitar_0042 +guitar_0043 +guitar_0044 +guitar_0045 +guitar_0046 +guitar_0047 +guitar_0048 +guitar_0049 +guitar_0050 +guitar_0051 +guitar_0052 +guitar_0053 +guitar_0054 +guitar_0055 +guitar_0056 +guitar_0057 +guitar_0058 +guitar_0059 +guitar_0060 +guitar_0061 +guitar_0062 +guitar_0063 +guitar_0064 +guitar_0065 +guitar_0066 +guitar_0067 +guitar_0068 +guitar_0069 +guitar_0070 +guitar_0071 +guitar_0072 +guitar_0073 +guitar_0074 +guitar_0075 +guitar_0076 +guitar_0077 +guitar_0078 +guitar_0079 +guitar_0080 +guitar_0081 +guitar_0082 +guitar_0083 +guitar_0084 +guitar_0085 +guitar_0086 +guitar_0087 +guitar_0088 +guitar_0089 +guitar_0090 +guitar_0091 +guitar_0092 +guitar_0093 +guitar_0094 +guitar_0095 +guitar_0096 +guitar_0097 +guitar_0098 +guitar_0099 +guitar_0100 +guitar_0101 +guitar_0102 +guitar_0103 +guitar_0104 +guitar_0105 +guitar_0106 +guitar_0107 +guitar_0108 +guitar_0109 +guitar_0110 +guitar_0111 +guitar_0112 +guitar_0113 +guitar_0114 +guitar_0115 +guitar_0116 +guitar_0117 +guitar_0118 +guitar_0119 +guitar_0120 +guitar_0121 +guitar_0122 +guitar_0123 +guitar_0124 +guitar_0125 +guitar_0126 +guitar_0127 +guitar_0128 +guitar_0129 +guitar_0130 +guitar_0131 +guitar_0132 +guitar_0133 +guitar_0134 +guitar_0135 +guitar_0136 +guitar_0137 +guitar_0138 +guitar_0139 +guitar_0140 +guitar_0141 +guitar_0142 +guitar_0143 +guitar_0144 +guitar_0145 +guitar_0146 +guitar_0147 +guitar_0148 +guitar_0149 +guitar_0150 +guitar_0151 +guitar_0152 +guitar_0153 +guitar_0154 +guitar_0155 +keyboard_0001 +keyboard_0002 +keyboard_0003 +keyboard_0004 +keyboard_0005 +keyboard_0006 +keyboard_0007 +keyboard_0008 +keyboard_0009 +keyboard_0010 +keyboard_0011 +keyboard_0012 +keyboard_0013 +keyboard_0014 +keyboard_0015 +keyboard_0016 +keyboard_0017 +keyboard_0018 +keyboard_0019 +keyboard_0020 +keyboard_0021 +keyboard_0022 +keyboard_0023 +keyboard_0024 +keyboard_0025 +keyboard_0026 +keyboard_0027 +keyboard_0028 +keyboard_0029 +keyboard_0030 +keyboard_0031 +keyboard_0032 +keyboard_0033 +keyboard_0034 +keyboard_0035 +keyboard_0036 +keyboard_0037 +keyboard_0038 +keyboard_0039 +keyboard_0040 +keyboard_0041 +keyboard_0042 +keyboard_0043 +keyboard_0044 +keyboard_0045 +keyboard_0046 +keyboard_0047 +keyboard_0048 +keyboard_0049 +keyboard_0050 +keyboard_0051 +keyboard_0052 +keyboard_0053 +keyboard_0054 +keyboard_0055 +keyboard_0056 +keyboard_0057 +keyboard_0058 +keyboard_0059 +keyboard_0060 +keyboard_0061 +keyboard_0062 +keyboard_0063 +keyboard_0064 +keyboard_0065 +keyboard_0066 +keyboard_0067 +keyboard_0068 +keyboard_0069 +keyboard_0070 +keyboard_0071 +keyboard_0072 +keyboard_0073 +keyboard_0074 +keyboard_0075 +keyboard_0076 +keyboard_0077 +keyboard_0078 +keyboard_0079 +keyboard_0080 +keyboard_0081 +keyboard_0082 +keyboard_0083 +keyboard_0084 +keyboard_0085 +keyboard_0086 +keyboard_0087 +keyboard_0088 +keyboard_0089 +keyboard_0090 +keyboard_0091 +keyboard_0092 +keyboard_0093 +keyboard_0094 +keyboard_0095 +keyboard_0096 +keyboard_0097 +keyboard_0098 +keyboard_0099 +keyboard_0100 +keyboard_0101 +keyboard_0102 +keyboard_0103 +keyboard_0104 +keyboard_0105 +keyboard_0106 +keyboard_0107 +keyboard_0108 +keyboard_0109 +keyboard_0110 +keyboard_0111 +keyboard_0112 +keyboard_0113 +keyboard_0114 +keyboard_0115 +keyboard_0116 +keyboard_0117 +keyboard_0118 +keyboard_0119 +keyboard_0120 +keyboard_0121 +keyboard_0122 +keyboard_0123 +keyboard_0124 +keyboard_0125 +keyboard_0126 +keyboard_0127 +keyboard_0128 +keyboard_0129 +keyboard_0130 +keyboard_0131 +keyboard_0132 +keyboard_0133 +keyboard_0134 +keyboard_0135 +keyboard_0136 +keyboard_0137 +keyboard_0138 +keyboard_0139 +keyboard_0140 +keyboard_0141 +keyboard_0142 +keyboard_0143 +keyboard_0144 +keyboard_0145 +lamp_0001 +lamp_0002 +lamp_0003 +lamp_0004 +lamp_0005 +lamp_0006 +lamp_0007 +lamp_0008 +lamp_0009 +lamp_0010 +lamp_0011 +lamp_0012 +lamp_0013 +lamp_0014 +lamp_0015 +lamp_0016 +lamp_0017 +lamp_0018 +lamp_0019 +lamp_0020 +lamp_0021 +lamp_0022 +lamp_0023 +lamp_0024 +lamp_0025 +lamp_0026 +lamp_0027 +lamp_0028 +lamp_0029 +lamp_0030 +lamp_0031 +lamp_0032 +lamp_0033 +lamp_0034 +lamp_0035 +lamp_0036 +lamp_0037 +lamp_0038 +lamp_0039 +lamp_0040 +lamp_0041 +lamp_0042 +lamp_0043 +lamp_0044 +lamp_0045 +lamp_0046 +lamp_0047 +lamp_0048 +lamp_0049 +lamp_0050 +lamp_0051 +lamp_0052 +lamp_0053 +lamp_0054 +lamp_0055 +lamp_0056 +lamp_0057 +lamp_0058 +lamp_0059 +lamp_0060 +lamp_0061 +lamp_0062 +lamp_0063 +lamp_0064 +lamp_0065 +lamp_0066 +lamp_0067 +lamp_0068 +lamp_0069 +lamp_0070 +lamp_0071 +lamp_0072 +lamp_0073 +lamp_0074 +lamp_0075 +lamp_0076 +lamp_0077 +lamp_0078 +lamp_0079 +lamp_0080 +lamp_0081 +lamp_0082 +lamp_0083 +lamp_0084 +lamp_0085 +lamp_0086 +lamp_0087 +lamp_0088 +lamp_0089 +lamp_0090 +lamp_0091 +lamp_0092 +lamp_0093 +lamp_0094 +lamp_0095 +lamp_0096 +lamp_0097 +lamp_0098 +lamp_0099 +lamp_0100 +lamp_0101 +lamp_0102 +lamp_0103 +lamp_0104 +lamp_0105 +lamp_0106 +lamp_0107 +lamp_0108 +lamp_0109 +lamp_0110 +lamp_0111 +lamp_0112 +lamp_0113 +lamp_0114 +lamp_0115 +lamp_0116 +lamp_0117 +lamp_0118 +lamp_0119 +lamp_0120 +lamp_0121 +lamp_0122 +lamp_0123 +lamp_0124 +laptop_0001 +laptop_0002 +laptop_0003 +laptop_0004 +laptop_0005 +laptop_0006 +laptop_0007 +laptop_0008 +laptop_0009 +laptop_0010 +laptop_0011 +laptop_0012 +laptop_0013 +laptop_0014 +laptop_0015 +laptop_0016 +laptop_0017 +laptop_0018 +laptop_0019 +laptop_0020 +laptop_0021 +laptop_0022 +laptop_0023 +laptop_0024 +laptop_0025 +laptop_0026 +laptop_0027 +laptop_0028 +laptop_0029 +laptop_0030 +laptop_0031 +laptop_0032 +laptop_0033 +laptop_0034 +laptop_0035 +laptop_0036 +laptop_0037 +laptop_0038 +laptop_0039 +laptop_0040 +laptop_0041 +laptop_0042 +laptop_0043 +laptop_0044 +laptop_0045 +laptop_0046 +laptop_0047 +laptop_0048 +laptop_0049 +laptop_0050 +laptop_0051 +laptop_0052 +laptop_0053 +laptop_0054 +laptop_0055 +laptop_0056 +laptop_0057 +laptop_0058 +laptop_0059 +laptop_0060 +laptop_0061 +laptop_0062 +laptop_0063 +laptop_0064 +laptop_0065 +laptop_0066 +laptop_0067 +laptop_0068 +laptop_0069 +laptop_0070 +laptop_0071 +laptop_0072 +laptop_0073 +laptop_0074 +laptop_0075 +laptop_0076 +laptop_0077 +laptop_0078 +laptop_0079 +laptop_0080 +laptop_0081 +laptop_0082 +laptop_0083 +laptop_0084 +laptop_0085 +laptop_0086 +laptop_0087 +laptop_0088 +laptop_0089 +laptop_0090 +laptop_0091 +laptop_0092 +laptop_0093 +laptop_0094 +laptop_0095 +laptop_0096 +laptop_0097 +laptop_0098 +laptop_0099 +laptop_0100 +laptop_0101 +laptop_0102 +laptop_0103 +laptop_0104 +laptop_0105 +laptop_0106 +laptop_0107 +laptop_0108 +laptop_0109 +laptop_0110 +laptop_0111 +laptop_0112 +laptop_0113 +laptop_0114 +laptop_0115 +laptop_0116 +laptop_0117 +laptop_0118 +laptop_0119 +laptop_0120 +laptop_0121 +laptop_0122 +laptop_0123 +laptop_0124 +laptop_0125 +laptop_0126 +laptop_0127 +laptop_0128 +laptop_0129 +laptop_0130 +laptop_0131 +laptop_0132 +laptop_0133 +laptop_0134 +laptop_0135 +laptop_0136 +laptop_0137 +laptop_0138 +laptop_0139 +laptop_0140 +laptop_0141 +laptop_0142 +laptop_0143 +laptop_0144 +laptop_0145 +laptop_0146 +laptop_0147 +laptop_0148 +laptop_0149 +mantel_0001 +mantel_0002 +mantel_0003 +mantel_0004 +mantel_0005 +mantel_0006 +mantel_0007 +mantel_0008 +mantel_0009 +mantel_0010 +mantel_0011 +mantel_0012 +mantel_0013 +mantel_0014 +mantel_0015 +mantel_0016 +mantel_0017 +mantel_0018 +mantel_0019 +mantel_0020 +mantel_0021 +mantel_0022 +mantel_0023 +mantel_0024 +mantel_0025 +mantel_0026 +mantel_0027 +mantel_0028 +mantel_0029 +mantel_0030 +mantel_0031 +mantel_0032 +mantel_0033 +mantel_0034 +mantel_0035 +mantel_0036 +mantel_0037 +mantel_0038 +mantel_0039 +mantel_0040 +mantel_0041 +mantel_0042 +mantel_0043 +mantel_0044 +mantel_0045 +mantel_0046 +mantel_0047 +mantel_0048 +mantel_0049 +mantel_0050 +mantel_0051 +mantel_0052 +mantel_0053 +mantel_0054 +mantel_0055 +mantel_0056 +mantel_0057 +mantel_0058 +mantel_0059 +mantel_0060 +mantel_0061 +mantel_0062 +mantel_0063 +mantel_0064 +mantel_0065 +mantel_0066 +mantel_0067 +mantel_0068 +mantel_0069 +mantel_0070 +mantel_0071 +mantel_0072 +mantel_0073 +mantel_0074 +mantel_0075 +mantel_0076 +mantel_0077 +mantel_0078 +mantel_0079 +mantel_0080 +mantel_0081 +mantel_0082 +mantel_0083 +mantel_0084 +mantel_0085 +mantel_0086 +mantel_0087 +mantel_0088 +mantel_0089 +mantel_0090 +mantel_0091 +mantel_0092 +mantel_0093 +mantel_0094 +mantel_0095 +mantel_0096 +mantel_0097 +mantel_0098 +mantel_0099 +mantel_0100 +mantel_0101 +mantel_0102 +mantel_0103 +mantel_0104 +mantel_0105 +mantel_0106 +mantel_0107 +mantel_0108 +mantel_0109 +mantel_0110 +mantel_0111 +mantel_0112 +mantel_0113 +mantel_0114 +mantel_0115 +mantel_0116 +mantel_0117 +mantel_0118 +mantel_0119 +mantel_0120 +mantel_0121 +mantel_0122 +mantel_0123 +mantel_0124 +mantel_0125 +mantel_0126 +mantel_0127 +mantel_0128 +mantel_0129 +mantel_0130 +mantel_0131 +mantel_0132 +mantel_0133 +mantel_0134 +mantel_0135 +mantel_0136 +mantel_0137 +mantel_0138 +mantel_0139 +mantel_0140 +mantel_0141 +mantel_0142 +mantel_0143 +mantel_0144 +mantel_0145 +mantel_0146 +mantel_0147 +mantel_0148 +mantel_0149 +mantel_0150 +mantel_0151 +mantel_0152 +mantel_0153 +mantel_0154 +mantel_0155 +mantel_0156 +mantel_0157 +mantel_0158 +mantel_0159 +mantel_0160 +mantel_0161 +mantel_0162 +mantel_0163 +mantel_0164 +mantel_0165 +mantel_0166 +mantel_0167 +mantel_0168 +mantel_0169 +mantel_0170 +mantel_0171 +mantel_0172 +mantel_0173 +mantel_0174 +mantel_0175 +mantel_0176 +mantel_0177 +mantel_0178 +mantel_0179 +mantel_0180 +mantel_0181 +mantel_0182 +mantel_0183 +mantel_0184 +mantel_0185 +mantel_0186 +mantel_0187 +mantel_0188 +mantel_0189 +mantel_0190 +mantel_0191 +mantel_0192 +mantel_0193 +mantel_0194 +mantel_0195 +mantel_0196 +mantel_0197 +mantel_0198 +mantel_0199 +mantel_0200 +mantel_0201 +mantel_0202 +mantel_0203 +mantel_0204 +mantel_0205 +mantel_0206 +mantel_0207 +mantel_0208 +mantel_0209 +mantel_0210 +mantel_0211 +mantel_0212 +mantel_0213 +mantel_0214 +mantel_0215 +mantel_0216 +mantel_0217 +mantel_0218 +mantel_0219 +mantel_0220 +mantel_0221 +mantel_0222 +mantel_0223 +mantel_0224 +mantel_0225 +mantel_0226 +mantel_0227 +mantel_0228 +mantel_0229 +mantel_0230 +mantel_0231 +mantel_0232 +mantel_0233 +mantel_0234 +mantel_0235 +mantel_0236 +mantel_0237 +mantel_0238 +mantel_0239 +mantel_0240 +mantel_0241 +mantel_0242 +mantel_0243 +mantel_0244 +mantel_0245 +mantel_0246 +mantel_0247 +mantel_0248 +mantel_0249 +mantel_0250 +mantel_0251 +mantel_0252 +mantel_0253 +mantel_0254 +mantel_0255 +mantel_0256 +mantel_0257 +mantel_0258 +mantel_0259 +mantel_0260 +mantel_0261 +mantel_0262 +mantel_0263 +mantel_0264 +mantel_0265 +mantel_0266 +mantel_0267 +mantel_0268 +mantel_0269 +mantel_0270 +mantel_0271 +mantel_0272 +mantel_0273 +mantel_0274 +mantel_0275 +mantel_0276 +mantel_0277 +mantel_0278 +mantel_0279 +mantel_0280 +mantel_0281 +mantel_0282 +mantel_0283 +mantel_0284 +monitor_0001 +monitor_0002 +monitor_0003 +monitor_0004 +monitor_0005 +monitor_0006 +monitor_0007 +monitor_0008 +monitor_0009 +monitor_0010 +monitor_0011 +monitor_0012 +monitor_0013 +monitor_0014 +monitor_0015 +monitor_0016 +monitor_0017 +monitor_0018 +monitor_0019 +monitor_0020 +monitor_0021 +monitor_0022 +monitor_0023 +monitor_0024 +monitor_0025 +monitor_0026 +monitor_0027 +monitor_0028 +monitor_0029 +monitor_0030 +monitor_0031 +monitor_0032 +monitor_0033 +monitor_0034 +monitor_0035 +monitor_0036 +monitor_0037 +monitor_0038 +monitor_0039 +monitor_0040 +monitor_0041 +monitor_0042 +monitor_0043 +monitor_0044 +monitor_0045 +monitor_0046 +monitor_0047 +monitor_0048 +monitor_0049 +monitor_0050 +monitor_0051 +monitor_0052 +monitor_0053 +monitor_0054 +monitor_0055 +monitor_0056 +monitor_0057 +monitor_0058 +monitor_0059 +monitor_0060 +monitor_0061 +monitor_0062 +monitor_0063 +monitor_0064 +monitor_0065 +monitor_0066 +monitor_0067 +monitor_0068 +monitor_0069 +monitor_0070 +monitor_0071 +monitor_0072 +monitor_0073 +monitor_0074 +monitor_0075 +monitor_0076 +monitor_0077 +monitor_0078 +monitor_0079 +monitor_0080 +monitor_0081 +monitor_0082 +monitor_0083 +monitor_0084 +monitor_0085 +monitor_0086 +monitor_0087 +monitor_0088 +monitor_0089 +monitor_0090 +monitor_0091 +monitor_0092 +monitor_0093 +monitor_0094 +monitor_0095 +monitor_0096 +monitor_0097 +monitor_0098 +monitor_0099 +monitor_0100 +monitor_0101 +monitor_0102 +monitor_0103 +monitor_0104 +monitor_0105 +monitor_0106 +monitor_0107 +monitor_0108 +monitor_0109 +monitor_0110 +monitor_0111 +monitor_0112 +monitor_0113 +monitor_0114 +monitor_0115 +monitor_0116 +monitor_0117 +monitor_0118 +monitor_0119 +monitor_0120 +monitor_0121 +monitor_0122 +monitor_0123 +monitor_0124 +monitor_0125 +monitor_0126 +monitor_0127 +monitor_0128 +monitor_0129 +monitor_0130 +monitor_0131 +monitor_0132 +monitor_0133 +monitor_0134 +monitor_0135 +monitor_0136 +monitor_0137 +monitor_0138 +monitor_0139 +monitor_0140 +monitor_0141 +monitor_0142 +monitor_0143 +monitor_0144 +monitor_0145 +monitor_0146 +monitor_0147 +monitor_0148 +monitor_0149 +monitor_0150 +monitor_0151 +monitor_0152 +monitor_0153 +monitor_0154 +monitor_0155 +monitor_0156 +monitor_0157 +monitor_0158 +monitor_0159 +monitor_0160 +monitor_0161 +monitor_0162 +monitor_0163 +monitor_0164 +monitor_0165 +monitor_0166 +monitor_0167 +monitor_0168 +monitor_0169 +monitor_0170 +monitor_0171 +monitor_0172 +monitor_0173 +monitor_0174 +monitor_0175 +monitor_0176 +monitor_0177 +monitor_0178 +monitor_0179 +monitor_0180 +monitor_0181 +monitor_0182 +monitor_0183 +monitor_0184 +monitor_0185 +monitor_0186 +monitor_0187 +monitor_0188 +monitor_0189 +monitor_0190 +monitor_0191 +monitor_0192 +monitor_0193 +monitor_0194 +monitor_0195 +monitor_0196 +monitor_0197 +monitor_0198 +monitor_0199 +monitor_0200 +monitor_0201 +monitor_0202 +monitor_0203 +monitor_0204 +monitor_0205 +monitor_0206 +monitor_0207 +monitor_0208 +monitor_0209 +monitor_0210 +monitor_0211 +monitor_0212 +monitor_0213 +monitor_0214 +monitor_0215 +monitor_0216 +monitor_0217 +monitor_0218 +monitor_0219 +monitor_0220 +monitor_0221 +monitor_0222 +monitor_0223 +monitor_0224 +monitor_0225 +monitor_0226 +monitor_0227 +monitor_0228 +monitor_0229 +monitor_0230 +monitor_0231 +monitor_0232 +monitor_0233 +monitor_0234 +monitor_0235 +monitor_0236 +monitor_0237 +monitor_0238 +monitor_0239 +monitor_0240 +monitor_0241 +monitor_0242 +monitor_0243 +monitor_0244 +monitor_0245 +monitor_0246 +monitor_0247 +monitor_0248 +monitor_0249 +monitor_0250 +monitor_0251 +monitor_0252 +monitor_0253 +monitor_0254 +monitor_0255 +monitor_0256 +monitor_0257 +monitor_0258 +monitor_0259 +monitor_0260 +monitor_0261 +monitor_0262 +monitor_0263 +monitor_0264 +monitor_0265 +monitor_0266 +monitor_0267 +monitor_0268 +monitor_0269 +monitor_0270 +monitor_0271 +monitor_0272 +monitor_0273 +monitor_0274 +monitor_0275 +monitor_0276 +monitor_0277 +monitor_0278 +monitor_0279 +monitor_0280 +monitor_0281 +monitor_0282 +monitor_0283 +monitor_0284 +monitor_0285 +monitor_0286 +monitor_0287 +monitor_0288 +monitor_0289 +monitor_0290 +monitor_0291 +monitor_0292 +monitor_0293 +monitor_0294 +monitor_0295 +monitor_0296 +monitor_0297 +monitor_0298 +monitor_0299 +monitor_0300 +monitor_0301 +monitor_0302 +monitor_0303 +monitor_0304 +monitor_0305 +monitor_0306 +monitor_0307 +monitor_0308 +monitor_0309 +monitor_0310 +monitor_0311 +monitor_0312 +monitor_0313 +monitor_0314 +monitor_0315 +monitor_0316 +monitor_0317 +monitor_0318 +monitor_0319 +monitor_0320 +monitor_0321 +monitor_0322 +monitor_0323 +monitor_0324 +monitor_0325 +monitor_0326 +monitor_0327 +monitor_0328 +monitor_0329 +monitor_0330 +monitor_0331 +monitor_0332 +monitor_0333 +monitor_0334 +monitor_0335 +monitor_0336 +monitor_0337 +monitor_0338 +monitor_0339 +monitor_0340 +monitor_0341 +monitor_0342 +monitor_0343 +monitor_0344 +monitor_0345 +monitor_0346 +monitor_0347 +monitor_0348 +monitor_0349 +monitor_0350 +monitor_0351 +monitor_0352 +monitor_0353 +monitor_0354 +monitor_0355 +monitor_0356 +monitor_0357 +monitor_0358 +monitor_0359 +monitor_0360 +monitor_0361 +monitor_0362 +monitor_0363 +monitor_0364 +monitor_0365 +monitor_0366 +monitor_0367 +monitor_0368 +monitor_0369 +monitor_0370 +monitor_0371 +monitor_0372 +monitor_0373 +monitor_0374 +monitor_0375 +monitor_0376 +monitor_0377 +monitor_0378 +monitor_0379 +monitor_0380 +monitor_0381 +monitor_0382 +monitor_0383 +monitor_0384 +monitor_0385 +monitor_0386 +monitor_0387 +monitor_0388 +monitor_0389 +monitor_0390 +monitor_0391 +monitor_0392 +monitor_0393 +monitor_0394 +monitor_0395 +monitor_0396 +monitor_0397 +monitor_0398 +monitor_0399 +monitor_0400 +monitor_0401 +monitor_0402 +monitor_0403 +monitor_0404 +monitor_0405 +monitor_0406 +monitor_0407 +monitor_0408 +monitor_0409 +monitor_0410 +monitor_0411 +monitor_0412 +monitor_0413 +monitor_0414 +monitor_0415 +monitor_0416 +monitor_0417 +monitor_0418 +monitor_0419 +monitor_0420 +monitor_0421 +monitor_0422 +monitor_0423 +monitor_0424 +monitor_0425 +monitor_0426 +monitor_0427 +monitor_0428 +monitor_0429 +monitor_0430 +monitor_0431 +monitor_0432 +monitor_0433 +monitor_0434 +monitor_0435 +monitor_0436 +monitor_0437 +monitor_0438 +monitor_0439 +monitor_0440 +monitor_0441 +monitor_0442 +monitor_0443 +monitor_0444 +monitor_0445 +monitor_0446 +monitor_0447 +monitor_0448 +monitor_0449 +monitor_0450 +monitor_0451 +monitor_0452 +monitor_0453 +monitor_0454 +monitor_0455 +monitor_0456 +monitor_0457 +monitor_0458 +monitor_0459 +monitor_0460 +monitor_0461 +monitor_0462 +monitor_0463 +monitor_0464 +monitor_0465 +night_stand_0001 +night_stand_0002 +night_stand_0003 +night_stand_0004 +night_stand_0005 +night_stand_0006 +night_stand_0007 +night_stand_0008 +night_stand_0009 +night_stand_0010 +night_stand_0011 +night_stand_0012 +night_stand_0013 +night_stand_0014 +night_stand_0015 +night_stand_0016 +night_stand_0017 +night_stand_0018 +night_stand_0019 +night_stand_0020 +night_stand_0021 +night_stand_0022 +night_stand_0023 +night_stand_0024 +night_stand_0025 +night_stand_0026 +night_stand_0027 +night_stand_0028 +night_stand_0029 +night_stand_0030 +night_stand_0031 +night_stand_0032 +night_stand_0033 +night_stand_0034 +night_stand_0035 +night_stand_0036 +night_stand_0037 +night_stand_0038 +night_stand_0039 +night_stand_0040 +night_stand_0041 +night_stand_0042 +night_stand_0043 +night_stand_0044 +night_stand_0045 +night_stand_0046 +night_stand_0047 +night_stand_0048 +night_stand_0049 +night_stand_0050 +night_stand_0051 +night_stand_0052 +night_stand_0053 +night_stand_0054 +night_stand_0055 +night_stand_0056 +night_stand_0057 +night_stand_0058 +night_stand_0059 +night_stand_0060 +night_stand_0061 +night_stand_0062 +night_stand_0063 +night_stand_0064 +night_stand_0065 +night_stand_0066 +night_stand_0067 +night_stand_0068 +night_stand_0069 +night_stand_0070 +night_stand_0071 +night_stand_0072 +night_stand_0073 +night_stand_0074 +night_stand_0075 +night_stand_0076 +night_stand_0077 +night_stand_0078 +night_stand_0079 +night_stand_0080 +night_stand_0081 +night_stand_0082 +night_stand_0083 +night_stand_0084 +night_stand_0085 +night_stand_0086 +night_stand_0087 +night_stand_0088 +night_stand_0089 +night_stand_0090 +night_stand_0091 +night_stand_0092 +night_stand_0093 +night_stand_0094 +night_stand_0095 +night_stand_0096 +night_stand_0097 +night_stand_0098 +night_stand_0099 +night_stand_0100 +night_stand_0101 +night_stand_0102 +night_stand_0103 +night_stand_0104 +night_stand_0105 +night_stand_0106 +night_stand_0107 +night_stand_0108 +night_stand_0109 +night_stand_0110 +night_stand_0111 +night_stand_0112 +night_stand_0113 +night_stand_0114 +night_stand_0115 +night_stand_0116 +night_stand_0117 +night_stand_0118 +night_stand_0119 +night_stand_0120 +night_stand_0121 +night_stand_0122 +night_stand_0123 +night_stand_0124 +night_stand_0125 +night_stand_0126 +night_stand_0127 +night_stand_0128 +night_stand_0129 +night_stand_0130 +night_stand_0131 +night_stand_0132 +night_stand_0133 +night_stand_0134 +night_stand_0135 +night_stand_0136 +night_stand_0137 +night_stand_0138 +night_stand_0139 +night_stand_0140 +night_stand_0141 +night_stand_0142 +night_stand_0143 +night_stand_0144 +night_stand_0145 +night_stand_0146 +night_stand_0147 +night_stand_0148 +night_stand_0149 +night_stand_0150 +night_stand_0151 +night_stand_0152 +night_stand_0153 +night_stand_0154 +night_stand_0155 +night_stand_0156 +night_stand_0157 +night_stand_0158 +night_stand_0159 +night_stand_0160 +night_stand_0161 +night_stand_0162 +night_stand_0163 +night_stand_0164 +night_stand_0165 +night_stand_0166 +night_stand_0167 +night_stand_0168 +night_stand_0169 +night_stand_0170 +night_stand_0171 +night_stand_0172 +night_stand_0173 +night_stand_0174 +night_stand_0175 +night_stand_0176 +night_stand_0177 +night_stand_0178 +night_stand_0179 +night_stand_0180 +night_stand_0181 +night_stand_0182 +night_stand_0183 +night_stand_0184 +night_stand_0185 +night_stand_0186 +night_stand_0187 +night_stand_0188 +night_stand_0189 +night_stand_0190 +night_stand_0191 +night_stand_0192 +night_stand_0193 +night_stand_0194 +night_stand_0195 +night_stand_0196 +night_stand_0197 +night_stand_0198 +night_stand_0199 +night_stand_0200 +person_0001 +person_0002 +person_0003 +person_0004 +person_0005 +person_0006 +person_0007 +person_0008 +person_0009 +person_0010 +person_0011 +person_0012 +person_0013 +person_0014 +person_0015 +person_0016 +person_0017 +person_0018 +person_0019 +person_0020 +person_0021 +person_0022 +person_0023 +person_0024 +person_0025 +person_0026 +person_0027 +person_0028 +person_0029 +person_0030 +person_0031 +person_0032 +person_0033 +person_0034 +person_0035 +person_0036 +person_0037 +person_0038 +person_0039 +person_0040 +person_0041 +person_0042 +person_0043 +person_0044 +person_0045 +person_0046 +person_0047 +person_0048 +person_0049 +person_0050 +person_0051 +person_0052 +person_0053 +person_0054 +person_0055 +person_0056 +person_0057 +person_0058 +person_0059 +person_0060 +person_0061 +person_0062 +person_0063 +person_0064 +person_0065 +person_0066 +person_0067 +person_0068 +person_0069 +person_0070 +person_0071 +person_0072 +person_0073 +person_0074 +person_0075 +person_0076 +person_0077 +person_0078 +person_0079 +person_0080 +person_0081 +person_0082 +person_0083 +person_0084 +person_0085 +person_0086 +person_0087 +person_0088 +piano_0001 +piano_0002 +piano_0003 +piano_0004 +piano_0005 +piano_0006 +piano_0007 +piano_0008 +piano_0009 +piano_0010 +piano_0011 +piano_0012 +piano_0013 +piano_0014 +piano_0015 +piano_0016 +piano_0017 +piano_0018 +piano_0019 +piano_0020 +piano_0021 +piano_0022 +piano_0023 +piano_0024 +piano_0025 +piano_0026 +piano_0027 +piano_0028 +piano_0029 +piano_0030 +piano_0031 +piano_0032 +piano_0033 +piano_0034 +piano_0035 +piano_0036 +piano_0037 +piano_0038 +piano_0039 +piano_0040 +piano_0041 +piano_0042 +piano_0043 +piano_0044 +piano_0045 +piano_0046 +piano_0047 +piano_0048 +piano_0049 +piano_0050 +piano_0051 +piano_0052 +piano_0053 +piano_0054 +piano_0055 +piano_0056 +piano_0057 +piano_0058 +piano_0059 +piano_0060 +piano_0061 +piano_0062 +piano_0063 +piano_0064 +piano_0065 +piano_0066 +piano_0067 +piano_0068 +piano_0069 +piano_0070 +piano_0071 +piano_0072 +piano_0073 +piano_0074 +piano_0075 +piano_0076 +piano_0077 +piano_0078 +piano_0079 +piano_0080 +piano_0081 +piano_0082 +piano_0083 +piano_0084 +piano_0085 +piano_0086 +piano_0087 +piano_0088 +piano_0089 +piano_0090 +piano_0091 +piano_0092 +piano_0093 +piano_0094 +piano_0095 +piano_0096 +piano_0097 +piano_0098 +piano_0099 +piano_0100 +piano_0101 +piano_0102 +piano_0103 +piano_0104 +piano_0105 +piano_0106 +piano_0107 +piano_0108 +piano_0109 +piano_0110 +piano_0111 +piano_0112 +piano_0113 +piano_0114 +piano_0115 +piano_0116 +piano_0117 +piano_0118 +piano_0119 +piano_0120 +piano_0121 +piano_0122 +piano_0123 +piano_0124 +piano_0125 +piano_0126 +piano_0127 +piano_0128 +piano_0129 +piano_0130 +piano_0131 +piano_0132 +piano_0133 +piano_0134 +piano_0135 +piano_0136 +piano_0137 +piano_0138 +piano_0139 +piano_0140 +piano_0141 +piano_0142 +piano_0143 +piano_0144 +piano_0145 +piano_0146 +piano_0147 +piano_0148 +piano_0149 +piano_0150 +piano_0151 +piano_0152 +piano_0153 +piano_0154 +piano_0155 +piano_0156 +piano_0157 +piano_0158 +piano_0159 +piano_0160 +piano_0161 +piano_0162 +piano_0163 +piano_0164 +piano_0165 +piano_0166 +piano_0167 +piano_0168 +piano_0169 +piano_0170 +piano_0171 +piano_0172 +piano_0173 +piano_0174 +piano_0175 +piano_0176 +piano_0177 +piano_0178 +piano_0179 +piano_0180 +piano_0181 +piano_0182 +piano_0183 +piano_0184 +piano_0185 +piano_0186 +piano_0187 +piano_0188 +piano_0189 +piano_0190 +piano_0191 +piano_0192 +piano_0193 +piano_0194 +piano_0195 +piano_0196 +piano_0197 +piano_0198 +piano_0199 +piano_0200 +piano_0201 +piano_0202 +piano_0203 +piano_0204 +piano_0205 +piano_0206 +piano_0207 +piano_0208 +piano_0209 +piano_0210 +piano_0211 +piano_0212 +piano_0213 +piano_0214 +piano_0215 +piano_0216 +piano_0217 +piano_0218 +piano_0219 +piano_0220 +piano_0221 +piano_0222 +piano_0223 +piano_0224 +piano_0225 +piano_0226 +piano_0227 +piano_0228 +piano_0229 +piano_0230 +piano_0231 +plant_0001 +plant_0002 +plant_0003 +plant_0004 +plant_0005 +plant_0006 +plant_0007 +plant_0008 +plant_0009 +plant_0010 +plant_0011 +plant_0012 +plant_0013 +plant_0014 +plant_0015 +plant_0016 +plant_0017 +plant_0018 +plant_0019 +plant_0020 +plant_0021 +plant_0022 +plant_0023 +plant_0024 +plant_0025 +plant_0026 +plant_0027 +plant_0028 +plant_0029 +plant_0030 +plant_0031 +plant_0032 +plant_0033 +plant_0034 +plant_0035 +plant_0036 +plant_0037 +plant_0038 +plant_0039 +plant_0040 +plant_0041 +plant_0042 +plant_0043 +plant_0044 +plant_0045 +plant_0046 +plant_0047 +plant_0048 +plant_0049 +plant_0050 +plant_0051 +plant_0052 +plant_0053 +plant_0054 +plant_0055 +plant_0056 +plant_0057 +plant_0058 +plant_0059 +plant_0060 +plant_0061 +plant_0062 +plant_0063 +plant_0064 +plant_0065 +plant_0066 +plant_0067 +plant_0068 +plant_0069 +plant_0070 +plant_0071 +plant_0072 +plant_0073 +plant_0074 +plant_0075 +plant_0076 +plant_0077 +plant_0078 +plant_0079 +plant_0080 +plant_0081 +plant_0082 +plant_0083 +plant_0084 +plant_0085 +plant_0086 +plant_0087 +plant_0088 +plant_0089 +plant_0090 +plant_0091 +plant_0092 +plant_0093 +plant_0094 +plant_0095 +plant_0096 +plant_0097 +plant_0098 +plant_0099 +plant_0100 +plant_0101 +plant_0102 +plant_0103 +plant_0104 +plant_0105 +plant_0106 +plant_0107 +plant_0108 +plant_0109 +plant_0110 +plant_0111 +plant_0112 +plant_0113 +plant_0114 +plant_0115 +plant_0116 +plant_0117 +plant_0118 +plant_0119 +plant_0120 +plant_0121 +plant_0122 +plant_0123 +plant_0124 +plant_0125 +plant_0126 +plant_0127 +plant_0128 +plant_0129 +plant_0130 +plant_0131 +plant_0132 +plant_0133 +plant_0134 +plant_0135 +plant_0136 +plant_0137 +plant_0138 +plant_0139 +plant_0140 +plant_0141 +plant_0142 +plant_0143 +plant_0144 +plant_0145 +plant_0146 +plant_0147 +plant_0148 +plant_0149 +plant_0150 +plant_0151 +plant_0152 +plant_0153 +plant_0154 +plant_0155 +plant_0156 +plant_0157 +plant_0158 +plant_0159 +plant_0160 +plant_0161 +plant_0162 +plant_0163 +plant_0164 +plant_0165 +plant_0166 +plant_0167 +plant_0168 +plant_0169 +plant_0170 +plant_0171 +plant_0172 +plant_0173 +plant_0174 +plant_0175 +plant_0176 +plant_0177 +plant_0178 +plant_0179 +plant_0180 +plant_0181 +plant_0182 +plant_0183 +plant_0184 +plant_0185 +plant_0186 +plant_0187 +plant_0188 +plant_0189 +plant_0190 +plant_0191 +plant_0192 +plant_0193 +plant_0194 +plant_0195 +plant_0196 +plant_0197 +plant_0198 +plant_0199 +plant_0200 +plant_0201 +plant_0202 +plant_0203 +plant_0204 +plant_0205 +plant_0206 +plant_0207 +plant_0208 +plant_0209 +plant_0210 +plant_0211 +plant_0212 +plant_0213 +plant_0214 +plant_0215 +plant_0216 +plant_0217 +plant_0218 +plant_0219 +plant_0220 +plant_0221 +plant_0222 +plant_0223 +plant_0224 +plant_0225 +plant_0226 +plant_0227 +plant_0228 +plant_0229 +plant_0230 +plant_0231 +plant_0232 +plant_0233 +plant_0234 +plant_0235 +plant_0236 +plant_0237 +plant_0238 +plant_0239 +plant_0240 +radio_0001 +radio_0002 +radio_0003 +radio_0004 +radio_0005 +radio_0006 +radio_0007 +radio_0008 +radio_0009 +radio_0010 +radio_0011 +radio_0012 +radio_0013 +radio_0014 +radio_0015 +radio_0016 +radio_0017 +radio_0018 +radio_0019 +radio_0020 +radio_0021 +radio_0022 +radio_0023 +radio_0024 +radio_0025 +radio_0026 +radio_0027 +radio_0028 +radio_0029 +radio_0030 +radio_0031 +radio_0032 +radio_0033 +radio_0034 +radio_0035 +radio_0036 +radio_0037 +radio_0038 +radio_0039 +radio_0040 +radio_0041 +radio_0042 +radio_0043 +radio_0044 +radio_0045 +radio_0046 +radio_0047 +radio_0048 +radio_0049 +radio_0050 +radio_0051 +radio_0052 +radio_0053 +radio_0054 +radio_0055 +radio_0056 +radio_0057 +radio_0058 +radio_0059 +radio_0060 +radio_0061 +radio_0062 +radio_0063 +radio_0064 +radio_0065 +radio_0066 +radio_0067 +radio_0068 +radio_0069 +radio_0070 +radio_0071 +radio_0072 +radio_0073 +radio_0074 +radio_0075 +radio_0076 +radio_0077 +radio_0078 +radio_0079 +radio_0080 +radio_0081 +radio_0082 +radio_0083 +radio_0084 +radio_0085 +radio_0086 +radio_0087 +radio_0088 +radio_0089 +radio_0090 +radio_0091 +radio_0092 +radio_0093 +radio_0094 +radio_0095 +radio_0096 +radio_0097 +radio_0098 +radio_0099 +radio_0100 +radio_0101 +radio_0102 +radio_0103 +radio_0104 +range_hood_0001 +range_hood_0002 +range_hood_0003 +range_hood_0004 +range_hood_0005 +range_hood_0006 +range_hood_0007 +range_hood_0008 +range_hood_0009 +range_hood_0010 +range_hood_0011 +range_hood_0012 +range_hood_0013 +range_hood_0014 +range_hood_0015 +range_hood_0016 +range_hood_0017 +range_hood_0018 +range_hood_0019 +range_hood_0020 +range_hood_0021 +range_hood_0022 +range_hood_0023 +range_hood_0024 +range_hood_0025 +range_hood_0026 +range_hood_0027 +range_hood_0028 +range_hood_0029 +range_hood_0030 +range_hood_0031 +range_hood_0032 +range_hood_0033 +range_hood_0034 +range_hood_0035 +range_hood_0036 +range_hood_0037 +range_hood_0038 +range_hood_0039 +range_hood_0040 +range_hood_0041 +range_hood_0042 +range_hood_0043 +range_hood_0044 +range_hood_0045 +range_hood_0046 +range_hood_0047 +range_hood_0048 +range_hood_0049 +range_hood_0050 +range_hood_0051 +range_hood_0052 +range_hood_0053 +range_hood_0054 +range_hood_0055 +range_hood_0056 +range_hood_0057 +range_hood_0058 +range_hood_0059 +range_hood_0060 +range_hood_0061 +range_hood_0062 +range_hood_0063 +range_hood_0064 +range_hood_0065 +range_hood_0066 +range_hood_0067 +range_hood_0068 +range_hood_0069 +range_hood_0070 +range_hood_0071 +range_hood_0072 +range_hood_0073 +range_hood_0074 +range_hood_0075 +range_hood_0076 +range_hood_0077 +range_hood_0078 +range_hood_0079 +range_hood_0080 +range_hood_0081 +range_hood_0082 +range_hood_0083 +range_hood_0084 +range_hood_0085 +range_hood_0086 +range_hood_0087 +range_hood_0088 +range_hood_0089 +range_hood_0090 +range_hood_0091 +range_hood_0092 +range_hood_0093 +range_hood_0094 +range_hood_0095 +range_hood_0096 +range_hood_0097 +range_hood_0098 +range_hood_0099 +range_hood_0100 +range_hood_0101 +range_hood_0102 +range_hood_0103 +range_hood_0104 +range_hood_0105 +range_hood_0106 +range_hood_0107 +range_hood_0108 +range_hood_0109 +range_hood_0110 +range_hood_0111 +range_hood_0112 +range_hood_0113 +range_hood_0114 +range_hood_0115 +sink_0001 +sink_0002 +sink_0003 +sink_0004 +sink_0005 +sink_0006 +sink_0007 +sink_0008 +sink_0009 +sink_0010 +sink_0011 +sink_0012 +sink_0013 +sink_0014 +sink_0015 +sink_0016 +sink_0017 +sink_0018 +sink_0019 +sink_0020 +sink_0021 +sink_0022 +sink_0023 +sink_0024 +sink_0025 +sink_0026 +sink_0027 +sink_0028 +sink_0029 +sink_0030 +sink_0031 +sink_0032 +sink_0033 +sink_0034 +sink_0035 +sink_0036 +sink_0037 +sink_0038 +sink_0039 +sink_0040 +sink_0041 +sink_0042 +sink_0043 +sink_0044 +sink_0045 +sink_0046 +sink_0047 +sink_0048 +sink_0049 +sink_0050 +sink_0051 +sink_0052 +sink_0053 +sink_0054 +sink_0055 +sink_0056 +sink_0057 +sink_0058 +sink_0059 +sink_0060 +sink_0061 +sink_0062 +sink_0063 +sink_0064 +sink_0065 +sink_0066 +sink_0067 +sink_0068 +sink_0069 +sink_0070 +sink_0071 +sink_0072 +sink_0073 +sink_0074 +sink_0075 +sink_0076 +sink_0077 +sink_0078 +sink_0079 +sink_0080 +sink_0081 +sink_0082 +sink_0083 +sink_0084 +sink_0085 +sink_0086 +sink_0087 +sink_0088 +sink_0089 +sink_0090 +sink_0091 +sink_0092 +sink_0093 +sink_0094 +sink_0095 +sink_0096 +sink_0097 +sink_0098 +sink_0099 +sink_0100 +sink_0101 +sink_0102 +sink_0103 +sink_0104 +sink_0105 +sink_0106 +sink_0107 +sink_0108 +sink_0109 +sink_0110 +sink_0111 +sink_0112 +sink_0113 +sink_0114 +sink_0115 +sink_0116 +sink_0117 +sink_0118 +sink_0119 +sink_0120 +sink_0121 +sink_0122 +sink_0123 +sink_0124 +sink_0125 +sink_0126 +sink_0127 +sink_0128 +sofa_0001 +sofa_0002 +sofa_0003 +sofa_0004 +sofa_0005 +sofa_0006 +sofa_0007 +sofa_0008 +sofa_0009 +sofa_0010 +sofa_0011 +sofa_0012 +sofa_0013 +sofa_0014 +sofa_0015 +sofa_0016 +sofa_0017 +sofa_0018 +sofa_0019 +sofa_0020 +sofa_0021 +sofa_0022 +sofa_0023 +sofa_0024 +sofa_0025 +sofa_0026 +sofa_0027 +sofa_0028 +sofa_0029 +sofa_0030 +sofa_0031 +sofa_0032 +sofa_0033 +sofa_0034 +sofa_0035 +sofa_0036 +sofa_0037 +sofa_0038 +sofa_0039 +sofa_0040 +sofa_0041 +sofa_0042 +sofa_0043 +sofa_0044 +sofa_0045 +sofa_0046 +sofa_0047 +sofa_0048 +sofa_0049 +sofa_0050 +sofa_0051 +sofa_0052 +sofa_0053 +sofa_0054 +sofa_0055 +sofa_0056 +sofa_0057 +sofa_0058 +sofa_0059 +sofa_0060 +sofa_0061 +sofa_0062 +sofa_0063 +sofa_0064 +sofa_0065 +sofa_0066 +sofa_0067 +sofa_0068 +sofa_0069 +sofa_0070 +sofa_0071 +sofa_0072 +sofa_0073 +sofa_0074 +sofa_0075 +sofa_0076 +sofa_0077 +sofa_0078 +sofa_0079 +sofa_0080 +sofa_0081 +sofa_0082 +sofa_0083 +sofa_0084 +sofa_0085 +sofa_0086 +sofa_0087 +sofa_0088 +sofa_0089 +sofa_0090 +sofa_0091 +sofa_0092 +sofa_0093 +sofa_0094 +sofa_0095 +sofa_0096 +sofa_0097 +sofa_0098 +sofa_0099 +sofa_0100 +sofa_0101 +sofa_0102 +sofa_0103 +sofa_0104 +sofa_0105 +sofa_0106 +sofa_0107 +sofa_0108 +sofa_0109 +sofa_0110 +sofa_0111 +sofa_0112 +sofa_0113 +sofa_0114 +sofa_0115 +sofa_0116 +sofa_0117 +sofa_0118 +sofa_0119 +sofa_0120 +sofa_0121 +sofa_0122 +sofa_0123 +sofa_0124 +sofa_0125 +sofa_0126 +sofa_0127 +sofa_0128 +sofa_0129 +sofa_0130 +sofa_0131 +sofa_0132 +sofa_0133 +sofa_0134 +sofa_0135 +sofa_0136 +sofa_0137 +sofa_0138 +sofa_0139 +sofa_0140 +sofa_0141 +sofa_0142 +sofa_0143 +sofa_0144 +sofa_0145 +sofa_0146 +sofa_0147 +sofa_0148 +sofa_0149 +sofa_0150 +sofa_0151 +sofa_0152 +sofa_0153 +sofa_0154 +sofa_0155 +sofa_0156 +sofa_0157 +sofa_0158 +sofa_0159 +sofa_0160 +sofa_0161 +sofa_0162 +sofa_0163 +sofa_0164 +sofa_0165 +sofa_0166 +sofa_0167 +sofa_0168 +sofa_0169 +sofa_0170 +sofa_0171 +sofa_0172 +sofa_0173 +sofa_0174 +sofa_0175 +sofa_0176 +sofa_0177 +sofa_0178 +sofa_0179 +sofa_0180 +sofa_0181 +sofa_0182 +sofa_0183 +sofa_0184 +sofa_0185 +sofa_0186 +sofa_0187 +sofa_0188 +sofa_0189 +sofa_0190 +sofa_0191 +sofa_0192 +sofa_0193 +sofa_0194 +sofa_0195 +sofa_0196 +sofa_0197 +sofa_0198 +sofa_0199 +sofa_0200 +sofa_0201 +sofa_0202 +sofa_0203 +sofa_0204 +sofa_0205 +sofa_0206 +sofa_0207 +sofa_0208 +sofa_0209 +sofa_0210 +sofa_0211 +sofa_0212 +sofa_0213 +sofa_0214 +sofa_0215 +sofa_0216 +sofa_0217 +sofa_0218 +sofa_0219 +sofa_0220 +sofa_0221 +sofa_0222 +sofa_0223 +sofa_0224 +sofa_0225 +sofa_0226 +sofa_0227 +sofa_0228 +sofa_0229 +sofa_0230 +sofa_0231 +sofa_0232 +sofa_0233 +sofa_0234 +sofa_0235 +sofa_0236 +sofa_0237 +sofa_0238 +sofa_0239 +sofa_0240 +sofa_0241 +sofa_0242 +sofa_0243 +sofa_0244 +sofa_0245 +sofa_0246 +sofa_0247 +sofa_0248 +sofa_0249 +sofa_0250 +sofa_0251 +sofa_0252 +sofa_0253 +sofa_0254 +sofa_0255 +sofa_0256 +sofa_0257 +sofa_0258 +sofa_0259 +sofa_0260 +sofa_0261 +sofa_0262 +sofa_0263 +sofa_0264 +sofa_0265 +sofa_0266 +sofa_0267 +sofa_0268 +sofa_0269 +sofa_0270 +sofa_0271 +sofa_0272 +sofa_0273 +sofa_0274 +sofa_0275 +sofa_0276 +sofa_0277 +sofa_0278 +sofa_0279 +sofa_0280 +sofa_0281 +sofa_0282 +sofa_0283 +sofa_0284 +sofa_0285 +sofa_0286 +sofa_0287 +sofa_0288 +sofa_0289 +sofa_0290 +sofa_0291 +sofa_0292 +sofa_0293 +sofa_0294 +sofa_0295 +sofa_0296 +sofa_0297 +sofa_0298 +sofa_0299 +sofa_0300 +sofa_0301 +sofa_0302 +sofa_0303 +sofa_0304 +sofa_0305 +sofa_0306 +sofa_0307 +sofa_0308 +sofa_0309 +sofa_0310 +sofa_0311 +sofa_0312 +sofa_0313 +sofa_0314 +sofa_0315 +sofa_0316 +sofa_0317 +sofa_0318 +sofa_0319 +sofa_0320 +sofa_0321 +sofa_0322 +sofa_0323 +sofa_0324 +sofa_0325 +sofa_0326 +sofa_0327 +sofa_0328 +sofa_0329 +sofa_0330 +sofa_0331 +sofa_0332 +sofa_0333 +sofa_0334 +sofa_0335 +sofa_0336 +sofa_0337 +sofa_0338 +sofa_0339 +sofa_0340 +sofa_0341 +sofa_0342 +sofa_0343 +sofa_0344 +sofa_0345 +sofa_0346 +sofa_0347 +sofa_0348 +sofa_0349 +sofa_0350 +sofa_0351 +sofa_0352 +sofa_0353 +sofa_0354 +sofa_0355 +sofa_0356 +sofa_0357 +sofa_0358 +sofa_0359 +sofa_0360 +sofa_0361 +sofa_0362 +sofa_0363 +sofa_0364 +sofa_0365 +sofa_0366 +sofa_0367 +sofa_0368 +sofa_0369 +sofa_0370 +sofa_0371 +sofa_0372 +sofa_0373 +sofa_0374 +sofa_0375 +sofa_0376 +sofa_0377 +sofa_0378 +sofa_0379 +sofa_0380 +sofa_0381 +sofa_0382 +sofa_0383 +sofa_0384 +sofa_0385 +sofa_0386 +sofa_0387 +sofa_0388 +sofa_0389 +sofa_0390 +sofa_0391 +sofa_0392 +sofa_0393 +sofa_0394 +sofa_0395 +sofa_0396 +sofa_0397 +sofa_0398 +sofa_0399 +sofa_0400 +sofa_0401 +sofa_0402 +sofa_0403 +sofa_0404 +sofa_0405 +sofa_0406 +sofa_0407 +sofa_0408 +sofa_0409 +sofa_0410 +sofa_0411 +sofa_0412 +sofa_0413 +sofa_0414 +sofa_0415 +sofa_0416 +sofa_0417 +sofa_0418 +sofa_0419 +sofa_0420 +sofa_0421 +sofa_0422 +sofa_0423 +sofa_0424 +sofa_0425 +sofa_0426 +sofa_0427 +sofa_0428 +sofa_0429 +sofa_0430 +sofa_0431 +sofa_0432 +sofa_0433 +sofa_0434 +sofa_0435 +sofa_0436 +sofa_0437 +sofa_0438 +sofa_0439 +sofa_0440 +sofa_0441 +sofa_0442 +sofa_0443 +sofa_0444 +sofa_0445 +sofa_0446 +sofa_0447 +sofa_0448 +sofa_0449 +sofa_0450 +sofa_0451 +sofa_0452 +sofa_0453 +sofa_0454 +sofa_0455 +sofa_0456 +sofa_0457 +sofa_0458 +sofa_0459 +sofa_0460 +sofa_0461 +sofa_0462 +sofa_0463 +sofa_0464 +sofa_0465 +sofa_0466 +sofa_0467 +sofa_0468 +sofa_0469 +sofa_0470 +sofa_0471 +sofa_0472 +sofa_0473 +sofa_0474 +sofa_0475 +sofa_0476 +sofa_0477 +sofa_0478 +sofa_0479 +sofa_0480 +sofa_0481 +sofa_0482 +sofa_0483 +sofa_0484 +sofa_0485 +sofa_0486 +sofa_0487 +sofa_0488 +sofa_0489 +sofa_0490 +sofa_0491 +sofa_0492 +sofa_0493 +sofa_0494 +sofa_0495 +sofa_0496 +sofa_0497 +sofa_0498 +sofa_0499 +sofa_0500 +sofa_0501 +sofa_0502 +sofa_0503 +sofa_0504 +sofa_0505 +sofa_0506 +sofa_0507 +sofa_0508 +sofa_0509 +sofa_0510 +sofa_0511 +sofa_0512 +sofa_0513 +sofa_0514 +sofa_0515 +sofa_0516 +sofa_0517 +sofa_0518 +sofa_0519 +sofa_0520 +sofa_0521 +sofa_0522 +sofa_0523 +sofa_0524 +sofa_0525 +sofa_0526 +sofa_0527 +sofa_0528 +sofa_0529 +sofa_0530 +sofa_0531 +sofa_0532 +sofa_0533 +sofa_0534 +sofa_0535 +sofa_0536 +sofa_0537 +sofa_0538 +sofa_0539 +sofa_0540 +sofa_0541 +sofa_0542 +sofa_0543 +sofa_0544 +sofa_0545 +sofa_0546 +sofa_0547 +sofa_0548 +sofa_0549 +sofa_0550 +sofa_0551 +sofa_0552 +sofa_0553 +sofa_0554 +sofa_0555 +sofa_0556 +sofa_0557 +sofa_0558 +sofa_0559 +sofa_0560 +sofa_0561 +sofa_0562 +sofa_0563 +sofa_0564 +sofa_0565 +sofa_0566 +sofa_0567 +sofa_0568 +sofa_0569 +sofa_0570 +sofa_0571 +sofa_0572 +sofa_0573 +sofa_0574 +sofa_0575 +sofa_0576 +sofa_0577 +sofa_0578 +sofa_0579 +sofa_0580 +sofa_0581 +sofa_0582 +sofa_0583 +sofa_0584 +sofa_0585 +sofa_0586 +sofa_0587 +sofa_0588 +sofa_0589 +sofa_0590 +sofa_0591 +sofa_0592 +sofa_0593 +sofa_0594 +sofa_0595 +sofa_0596 +sofa_0597 +sofa_0598 +sofa_0599 +sofa_0600 +sofa_0601 +sofa_0602 +sofa_0603 +sofa_0604 +sofa_0605 +sofa_0606 +sofa_0607 +sofa_0608 +sofa_0609 +sofa_0610 +sofa_0611 +sofa_0612 +sofa_0613 +sofa_0614 +sofa_0615 +sofa_0616 +sofa_0617 +sofa_0618 +sofa_0619 +sofa_0620 +sofa_0621 +sofa_0622 +sofa_0623 +sofa_0624 +sofa_0625 +sofa_0626 +sofa_0627 +sofa_0628 +sofa_0629 +sofa_0630 +sofa_0631 +sofa_0632 +sofa_0633 +sofa_0634 +sofa_0635 +sofa_0636 +sofa_0637 +sofa_0638 +sofa_0639 +sofa_0640 +sofa_0641 +sofa_0642 +sofa_0643 +sofa_0644 +sofa_0645 +sofa_0646 +sofa_0647 +sofa_0648 +sofa_0649 +sofa_0650 +sofa_0651 +sofa_0652 +sofa_0653 +sofa_0654 +sofa_0655 +sofa_0656 +sofa_0657 +sofa_0658 +sofa_0659 +sofa_0660 +sofa_0661 +sofa_0662 +sofa_0663 +sofa_0664 +sofa_0665 +sofa_0666 +sofa_0667 +sofa_0668 +sofa_0669 +sofa_0670 +sofa_0671 +sofa_0672 +sofa_0673 +sofa_0674 +sofa_0675 +sofa_0676 +sofa_0677 +sofa_0678 +sofa_0679 +sofa_0680 +stairs_0001 +stairs_0002 +stairs_0003 +stairs_0004 +stairs_0005 +stairs_0006 +stairs_0007 +stairs_0008 +stairs_0009 +stairs_0010 +stairs_0011 +stairs_0012 +stairs_0013 +stairs_0014 +stairs_0015 +stairs_0016 +stairs_0017 +stairs_0018 +stairs_0019 +stairs_0020 +stairs_0021 +stairs_0022 +stairs_0023 +stairs_0024 +stairs_0025 +stairs_0026 +stairs_0027 +stairs_0028 +stairs_0029 +stairs_0030 +stairs_0031 +stairs_0032 +stairs_0033 +stairs_0034 +stairs_0035 +stairs_0036 +stairs_0037 +stairs_0038 +stairs_0039 +stairs_0040 +stairs_0041 +stairs_0042 +stairs_0043 +stairs_0044 +stairs_0045 +stairs_0046 +stairs_0047 +stairs_0048 +stairs_0049 +stairs_0050 +stairs_0051 +stairs_0052 +stairs_0053 +stairs_0054 +stairs_0055 +stairs_0056 +stairs_0057 +stairs_0058 +stairs_0059 +stairs_0060 +stairs_0061 +stairs_0062 +stairs_0063 +stairs_0064 +stairs_0065 +stairs_0066 +stairs_0067 +stairs_0068 +stairs_0069 +stairs_0070 +stairs_0071 +stairs_0072 +stairs_0073 +stairs_0074 +stairs_0075 +stairs_0076 +stairs_0077 +stairs_0078 +stairs_0079 +stairs_0080 +stairs_0081 +stairs_0082 +stairs_0083 +stairs_0084 +stairs_0085 +stairs_0086 +stairs_0087 +stairs_0088 +stairs_0089 +stairs_0090 +stairs_0091 +stairs_0092 +stairs_0093 +stairs_0094 +stairs_0095 +stairs_0096 +stairs_0097 +stairs_0098 +stairs_0099 +stairs_0100 +stairs_0101 +stairs_0102 +stairs_0103 +stairs_0104 +stairs_0105 +stairs_0106 +stairs_0107 +stairs_0108 +stairs_0109 +stairs_0110 +stairs_0111 +stairs_0112 +stairs_0113 +stairs_0114 +stairs_0115 +stairs_0116 +stairs_0117 +stairs_0118 +stairs_0119 +stairs_0120 +stairs_0121 +stairs_0122 +stairs_0123 +stairs_0124 +stool_0001 +stool_0002 +stool_0003 +stool_0004 +stool_0005 +stool_0006 +stool_0007 +stool_0008 +stool_0009 +stool_0010 +stool_0011 +stool_0012 +stool_0013 +stool_0014 +stool_0015 +stool_0016 +stool_0017 +stool_0018 +stool_0019 +stool_0020 +stool_0021 +stool_0022 +stool_0023 +stool_0024 +stool_0025 +stool_0026 +stool_0027 +stool_0028 +stool_0029 +stool_0030 +stool_0031 +stool_0032 +stool_0033 +stool_0034 +stool_0035 +stool_0036 +stool_0037 +stool_0038 +stool_0039 +stool_0040 +stool_0041 +stool_0042 +stool_0043 +stool_0044 +stool_0045 +stool_0046 +stool_0047 +stool_0048 +stool_0049 +stool_0050 +stool_0051 +stool_0052 +stool_0053 +stool_0054 +stool_0055 +stool_0056 +stool_0057 +stool_0058 +stool_0059 +stool_0060 +stool_0061 +stool_0062 +stool_0063 +stool_0064 +stool_0065 +stool_0066 +stool_0067 +stool_0068 +stool_0069 +stool_0070 +stool_0071 +stool_0072 +stool_0073 +stool_0074 +stool_0075 +stool_0076 +stool_0077 +stool_0078 +stool_0079 +stool_0080 +stool_0081 +stool_0082 +stool_0083 +stool_0084 +stool_0085 +stool_0086 +stool_0087 +stool_0088 +stool_0089 +stool_0090 +table_0001 +table_0002 +table_0003 +table_0004 +table_0005 +table_0006 +table_0007 +table_0008 +table_0009 +table_0010 +table_0011 +table_0012 +table_0013 +table_0014 +table_0015 +table_0016 +table_0017 +table_0018 +table_0019 +table_0020 +table_0021 +table_0022 +table_0023 +table_0024 +table_0025 +table_0026 +table_0027 +table_0028 +table_0029 +table_0030 +table_0031 +table_0032 +table_0033 +table_0034 +table_0035 +table_0036 +table_0037 +table_0038 +table_0039 +table_0040 +table_0041 +table_0042 +table_0043 +table_0044 +table_0045 +table_0046 +table_0047 +table_0048 +table_0049 +table_0050 +table_0051 +table_0052 +table_0053 +table_0054 +table_0055 +table_0056 +table_0057 +table_0058 +table_0059 +table_0060 +table_0061 +table_0062 +table_0063 +table_0064 +table_0065 +table_0066 +table_0067 +table_0068 +table_0069 +table_0070 +table_0071 +table_0072 +table_0073 +table_0074 +table_0075 +table_0076 +table_0077 +table_0078 +table_0079 +table_0080 +table_0081 +table_0082 +table_0083 +table_0084 +table_0085 +table_0086 +table_0087 +table_0088 +table_0089 +table_0090 +table_0091 +table_0092 +table_0093 +table_0094 +table_0095 +table_0096 +table_0097 +table_0098 +table_0099 +table_0100 +table_0101 +table_0102 +table_0103 +table_0104 +table_0105 +table_0106 +table_0107 +table_0108 +table_0109 +table_0110 +table_0111 +table_0112 +table_0113 +table_0114 +table_0115 +table_0116 +table_0117 +table_0118 +table_0119 +table_0120 +table_0121 +table_0122 +table_0123 +table_0124 +table_0125 +table_0126 +table_0127 +table_0128 +table_0129 +table_0130 +table_0131 +table_0132 +table_0133 +table_0134 +table_0135 +table_0136 +table_0137 +table_0138 +table_0139 +table_0140 +table_0141 +table_0142 +table_0143 +table_0144 +table_0145 +table_0146 +table_0147 +table_0148 +table_0149 +table_0150 +table_0151 +table_0152 +table_0153 +table_0154 +table_0155 +table_0156 +table_0157 +table_0158 +table_0159 +table_0160 +table_0161 +table_0162 +table_0163 +table_0164 +table_0165 +table_0166 +table_0167 +table_0168 +table_0169 +table_0170 +table_0171 +table_0172 +table_0173 +table_0174 +table_0175 +table_0176 +table_0177 +table_0178 +table_0179 +table_0180 +table_0181 +table_0182 +table_0183 +table_0184 +table_0185 +table_0186 +table_0187 +table_0188 +table_0189 +table_0190 +table_0191 +table_0192 +table_0193 +table_0194 +table_0195 +table_0196 +table_0197 +table_0198 +table_0199 +table_0200 +table_0201 +table_0202 +table_0203 +table_0204 +table_0205 +table_0206 +table_0207 +table_0208 +table_0209 +table_0210 +table_0211 +table_0212 +table_0213 +table_0214 +table_0215 +table_0216 +table_0217 +table_0218 +table_0219 +table_0220 +table_0221 +table_0222 +table_0223 +table_0224 +table_0225 +table_0226 +table_0227 +table_0228 +table_0229 +table_0230 +table_0231 +table_0232 +table_0233 +table_0234 +table_0235 +table_0236 +table_0237 +table_0238 +table_0239 +table_0240 +table_0241 +table_0242 +table_0243 +table_0244 +table_0245 +table_0246 +table_0247 +table_0248 +table_0249 +table_0250 +table_0251 +table_0252 +table_0253 +table_0254 +table_0255 +table_0256 +table_0257 +table_0258 +table_0259 +table_0260 +table_0261 +table_0262 +table_0263 +table_0264 +table_0265 +table_0266 +table_0267 +table_0268 +table_0269 +table_0270 +table_0271 +table_0272 +table_0273 +table_0274 +table_0275 +table_0276 +table_0277 +table_0278 +table_0279 +table_0280 +table_0281 +table_0282 +table_0283 +table_0284 +table_0285 +table_0286 +table_0287 +table_0288 +table_0289 +table_0290 +table_0291 +table_0292 +table_0293 +table_0294 +table_0295 +table_0296 +table_0297 +table_0298 +table_0299 +table_0300 +table_0301 +table_0302 +table_0303 +table_0304 +table_0305 +table_0306 +table_0307 +table_0308 +table_0309 +table_0310 +table_0311 +table_0312 +table_0313 +table_0314 +table_0315 +table_0316 +table_0317 +table_0318 +table_0319 +table_0320 +table_0321 +table_0322 +table_0323 +table_0324 +table_0325 +table_0326 +table_0327 +table_0328 +table_0329 +table_0330 +table_0331 +table_0332 +table_0333 +table_0334 +table_0335 +table_0336 +table_0337 +table_0338 +table_0339 +table_0340 +table_0341 +table_0342 +table_0343 +table_0344 +table_0345 +table_0346 +table_0347 +table_0348 +table_0349 +table_0350 +table_0351 +table_0352 +table_0353 +table_0354 +table_0355 +table_0356 +table_0357 +table_0358 +table_0359 +table_0360 +table_0361 +table_0362 +table_0363 +table_0364 +table_0365 +table_0366 +table_0367 +table_0368 +table_0369 +table_0370 +table_0371 +table_0372 +table_0373 +table_0374 +table_0375 +table_0376 +table_0377 +table_0378 +table_0379 +table_0380 +table_0381 +table_0382 +table_0383 +table_0384 +table_0385 +table_0386 +table_0387 +table_0388 +table_0389 +table_0390 +table_0391 +table_0392 +tent_0001 +tent_0002 +tent_0003 +tent_0004 +tent_0005 +tent_0006 +tent_0007 +tent_0008 +tent_0009 +tent_0010 +tent_0011 +tent_0012 +tent_0013 +tent_0014 +tent_0015 +tent_0016 +tent_0017 +tent_0018 +tent_0019 +tent_0020 +tent_0021 +tent_0022 +tent_0023 +tent_0024 +tent_0025 +tent_0026 +tent_0027 +tent_0028 +tent_0029 +tent_0030 +tent_0031 +tent_0032 +tent_0033 +tent_0034 +tent_0035 +tent_0036 +tent_0037 +tent_0038 +tent_0039 +tent_0040 +tent_0041 +tent_0042 +tent_0043 +tent_0044 +tent_0045 +tent_0046 +tent_0047 +tent_0048 +tent_0049 +tent_0050 +tent_0051 +tent_0052 +tent_0053 +tent_0054 +tent_0055 +tent_0056 +tent_0057 +tent_0058 +tent_0059 +tent_0060 +tent_0061 +tent_0062 +tent_0063 +tent_0064 +tent_0065 +tent_0066 +tent_0067 +tent_0068 +tent_0069 +tent_0070 +tent_0071 +tent_0072 +tent_0073 +tent_0074 +tent_0075 +tent_0076 +tent_0077 +tent_0078 +tent_0079 +tent_0080 +tent_0081 +tent_0082 +tent_0083 +tent_0084 +tent_0085 +tent_0086 +tent_0087 +tent_0088 +tent_0089 +tent_0090 +tent_0091 +tent_0092 +tent_0093 +tent_0094 +tent_0095 +tent_0096 +tent_0097 +tent_0098 +tent_0099 +tent_0100 +tent_0101 +tent_0102 +tent_0103 +tent_0104 +tent_0105 +tent_0106 +tent_0107 +tent_0108 +tent_0109 +tent_0110 +tent_0111 +tent_0112 +tent_0113 +tent_0114 +tent_0115 +tent_0116 +tent_0117 +tent_0118 +tent_0119 +tent_0120 +tent_0121 +tent_0122 +tent_0123 +tent_0124 +tent_0125 +tent_0126 +tent_0127 +tent_0128 +tent_0129 +tent_0130 +tent_0131 +tent_0132 +tent_0133 +tent_0134 +tent_0135 +tent_0136 +tent_0137 +tent_0138 +tent_0139 +tent_0140 +tent_0141 +tent_0142 +tent_0143 +tent_0144 +tent_0145 +tent_0146 +tent_0147 +tent_0148 +tent_0149 +tent_0150 +tent_0151 +tent_0152 +tent_0153 +tent_0154 +tent_0155 +tent_0156 +tent_0157 +tent_0158 +tent_0159 +tent_0160 +tent_0161 +tent_0162 +tent_0163 +toilet_0001 +toilet_0002 +toilet_0003 +toilet_0004 +toilet_0005 +toilet_0006 +toilet_0007 +toilet_0008 +toilet_0009 +toilet_0010 +toilet_0011 +toilet_0012 +toilet_0013 +toilet_0014 +toilet_0015 +toilet_0016 +toilet_0017 +toilet_0018 +toilet_0019 +toilet_0020 +toilet_0021 +toilet_0022 +toilet_0023 +toilet_0024 +toilet_0025 +toilet_0026 +toilet_0027 +toilet_0028 +toilet_0029 +toilet_0030 +toilet_0031 +toilet_0032 +toilet_0033 +toilet_0034 +toilet_0035 +toilet_0036 +toilet_0037 +toilet_0038 +toilet_0039 +toilet_0040 +toilet_0041 +toilet_0042 +toilet_0043 +toilet_0044 +toilet_0045 +toilet_0046 +toilet_0047 +toilet_0048 +toilet_0049 +toilet_0050 +toilet_0051 +toilet_0052 +toilet_0053 +toilet_0054 +toilet_0055 +toilet_0056 +toilet_0057 +toilet_0058 +toilet_0059 +toilet_0060 +toilet_0061 +toilet_0062 +toilet_0063 +toilet_0064 +toilet_0065 +toilet_0066 +toilet_0067 +toilet_0068 +toilet_0069 +toilet_0070 +toilet_0071 +toilet_0072 +toilet_0073 +toilet_0074 +toilet_0075 +toilet_0076 +toilet_0077 +toilet_0078 +toilet_0079 +toilet_0080 +toilet_0081 +toilet_0082 +toilet_0083 +toilet_0084 +toilet_0085 +toilet_0086 +toilet_0087 +toilet_0088 +toilet_0089 +toilet_0090 +toilet_0091 +toilet_0092 +toilet_0093 +toilet_0094 +toilet_0095 +toilet_0096 +toilet_0097 +toilet_0098 +toilet_0099 +toilet_0100 +toilet_0101 +toilet_0102 +toilet_0103 +toilet_0104 +toilet_0105 +toilet_0106 +toilet_0107 +toilet_0108 +toilet_0109 +toilet_0110 +toilet_0111 +toilet_0112 +toilet_0113 +toilet_0114 +toilet_0115 +toilet_0116 +toilet_0117 +toilet_0118 +toilet_0119 +toilet_0120 +toilet_0121 +toilet_0122 +toilet_0123 +toilet_0124 +toilet_0125 +toilet_0126 +toilet_0127 +toilet_0128 +toilet_0129 +toilet_0130 +toilet_0131 +toilet_0132 +toilet_0133 +toilet_0134 +toilet_0135 +toilet_0136 +toilet_0137 +toilet_0138 +toilet_0139 +toilet_0140 +toilet_0141 +toilet_0142 +toilet_0143 +toilet_0144 +toilet_0145 +toilet_0146 +toilet_0147 +toilet_0148 +toilet_0149 +toilet_0150 +toilet_0151 +toilet_0152 +toilet_0153 +toilet_0154 +toilet_0155 +toilet_0156 +toilet_0157 +toilet_0158 +toilet_0159 +toilet_0160 +toilet_0161 +toilet_0162 +toilet_0163 +toilet_0164 +toilet_0165 +toilet_0166 +toilet_0167 +toilet_0168 +toilet_0169 +toilet_0170 +toilet_0171 +toilet_0172 +toilet_0173 +toilet_0174 +toilet_0175 +toilet_0176 +toilet_0177 +toilet_0178 +toilet_0179 +toilet_0180 +toilet_0181 +toilet_0182 +toilet_0183 +toilet_0184 +toilet_0185 +toilet_0186 +toilet_0187 +toilet_0188 +toilet_0189 +toilet_0190 +toilet_0191 +toilet_0192 +toilet_0193 +toilet_0194 +toilet_0195 +toilet_0196 +toilet_0197 +toilet_0198 +toilet_0199 +toilet_0200 +toilet_0201 +toilet_0202 +toilet_0203 +toilet_0204 +toilet_0205 +toilet_0206 +toilet_0207 +toilet_0208 +toilet_0209 +toilet_0210 +toilet_0211 +toilet_0212 +toilet_0213 +toilet_0214 +toilet_0215 +toilet_0216 +toilet_0217 +toilet_0218 +toilet_0219 +toilet_0220 +toilet_0221 +toilet_0222 +toilet_0223 +toilet_0224 +toilet_0225 +toilet_0226 +toilet_0227 +toilet_0228 +toilet_0229 +toilet_0230 +toilet_0231 +toilet_0232 +toilet_0233 +toilet_0234 +toilet_0235 +toilet_0236 +toilet_0237 +toilet_0238 +toilet_0239 +toilet_0240 +toilet_0241 +toilet_0242 +toilet_0243 +toilet_0244 +toilet_0245 +toilet_0246 +toilet_0247 +toilet_0248 +toilet_0249 +toilet_0250 +toilet_0251 +toilet_0252 +toilet_0253 +toilet_0254 +toilet_0255 +toilet_0256 +toilet_0257 +toilet_0258 +toilet_0259 +toilet_0260 +toilet_0261 +toilet_0262 +toilet_0263 +toilet_0264 +toilet_0265 +toilet_0266 +toilet_0267 +toilet_0268 +toilet_0269 +toilet_0270 +toilet_0271 +toilet_0272 +toilet_0273 +toilet_0274 +toilet_0275 +toilet_0276 +toilet_0277 +toilet_0278 +toilet_0279 +toilet_0280 +toilet_0281 +toilet_0282 +toilet_0283 +toilet_0284 +toilet_0285 +toilet_0286 +toilet_0287 +toilet_0288 +toilet_0289 +toilet_0290 +toilet_0291 +toilet_0292 +toilet_0293 +toilet_0294 +toilet_0295 +toilet_0296 +toilet_0297 +toilet_0298 +toilet_0299 +toilet_0300 +toilet_0301 +toilet_0302 +toilet_0303 +toilet_0304 +toilet_0305 +toilet_0306 +toilet_0307 +toilet_0308 +toilet_0309 +toilet_0310 +toilet_0311 +toilet_0312 +toilet_0313 +toilet_0314 +toilet_0315 +toilet_0316 +toilet_0317 +toilet_0318 +toilet_0319 +toilet_0320 +toilet_0321 +toilet_0322 +toilet_0323 +toilet_0324 +toilet_0325 +toilet_0326 +toilet_0327 +toilet_0328 +toilet_0329 +toilet_0330 +toilet_0331 +toilet_0332 +toilet_0333 +toilet_0334 +toilet_0335 +toilet_0336 +toilet_0337 +toilet_0338 +toilet_0339 +toilet_0340 +toilet_0341 +toilet_0342 +toilet_0343 +toilet_0344 +tv_stand_0001 +tv_stand_0002 +tv_stand_0003 +tv_stand_0004 +tv_stand_0005 +tv_stand_0006 +tv_stand_0007 +tv_stand_0008 +tv_stand_0009 +tv_stand_0010 +tv_stand_0011 +tv_stand_0012 +tv_stand_0013 +tv_stand_0014 +tv_stand_0015 +tv_stand_0016 +tv_stand_0017 +tv_stand_0018 +tv_stand_0019 +tv_stand_0020 +tv_stand_0021 +tv_stand_0022 +tv_stand_0023 +tv_stand_0024 +tv_stand_0025 +tv_stand_0026 +tv_stand_0027 +tv_stand_0028 +tv_stand_0029 +tv_stand_0030 +tv_stand_0031 +tv_stand_0032 +tv_stand_0033 +tv_stand_0034 +tv_stand_0035 +tv_stand_0036 +tv_stand_0037 +tv_stand_0038 +tv_stand_0039 +tv_stand_0040 +tv_stand_0041 +tv_stand_0042 +tv_stand_0043 +tv_stand_0044 +tv_stand_0045 +tv_stand_0046 +tv_stand_0047 +tv_stand_0048 +tv_stand_0049 +tv_stand_0050 +tv_stand_0051 +tv_stand_0052 +tv_stand_0053 +tv_stand_0054 +tv_stand_0055 +tv_stand_0056 +tv_stand_0057 +tv_stand_0058 +tv_stand_0059 +tv_stand_0060 +tv_stand_0061 +tv_stand_0062 +tv_stand_0063 +tv_stand_0064 +tv_stand_0065 +tv_stand_0066 +tv_stand_0067 +tv_stand_0068 +tv_stand_0069 +tv_stand_0070 +tv_stand_0071 +tv_stand_0072 +tv_stand_0073 +tv_stand_0074 +tv_stand_0075 +tv_stand_0076 +tv_stand_0077 +tv_stand_0078 +tv_stand_0079 +tv_stand_0080 +tv_stand_0081 +tv_stand_0082 +tv_stand_0083 +tv_stand_0084 +tv_stand_0085 +tv_stand_0086 +tv_stand_0087 +tv_stand_0088 +tv_stand_0089 +tv_stand_0090 +tv_stand_0091 +tv_stand_0092 +tv_stand_0093 +tv_stand_0094 +tv_stand_0095 +tv_stand_0096 +tv_stand_0097 +tv_stand_0098 +tv_stand_0099 +tv_stand_0100 +tv_stand_0101 +tv_stand_0102 +tv_stand_0103 +tv_stand_0104 +tv_stand_0105 +tv_stand_0106 +tv_stand_0107 +tv_stand_0108 +tv_stand_0109 +tv_stand_0110 +tv_stand_0111 +tv_stand_0112 +tv_stand_0113 +tv_stand_0114 +tv_stand_0115 +tv_stand_0116 +tv_stand_0117 +tv_stand_0118 +tv_stand_0119 +tv_stand_0120 +tv_stand_0121 +tv_stand_0122 +tv_stand_0123 +tv_stand_0124 +tv_stand_0125 +tv_stand_0126 +tv_stand_0127 +tv_stand_0128 +tv_stand_0129 +tv_stand_0130 +tv_stand_0131 +tv_stand_0132 +tv_stand_0133 +tv_stand_0134 +tv_stand_0135 +tv_stand_0136 +tv_stand_0137 +tv_stand_0138 +tv_stand_0139 +tv_stand_0140 +tv_stand_0141 +tv_stand_0142 +tv_stand_0143 +tv_stand_0144 +tv_stand_0145 +tv_stand_0146 +tv_stand_0147 +tv_stand_0148 +tv_stand_0149 +tv_stand_0150 +tv_stand_0151 +tv_stand_0152 +tv_stand_0153 +tv_stand_0154 +tv_stand_0155 +tv_stand_0156 +tv_stand_0157 +tv_stand_0158 +tv_stand_0159 +tv_stand_0160 +tv_stand_0161 +tv_stand_0162 +tv_stand_0163 +tv_stand_0164 +tv_stand_0165 +tv_stand_0166 +tv_stand_0167 +tv_stand_0168 +tv_stand_0169 +tv_stand_0170 +tv_stand_0171 +tv_stand_0172 +tv_stand_0173 +tv_stand_0174 +tv_stand_0175 +tv_stand_0176 +tv_stand_0177 +tv_stand_0178 +tv_stand_0179 +tv_stand_0180 +tv_stand_0181 +tv_stand_0182 +tv_stand_0183 +tv_stand_0184 +tv_stand_0185 +tv_stand_0186 +tv_stand_0187 +tv_stand_0188 +tv_stand_0189 +tv_stand_0190 +tv_stand_0191 +tv_stand_0192 +tv_stand_0193 +tv_stand_0194 +tv_stand_0195 +tv_stand_0196 +tv_stand_0197 +tv_stand_0198 +tv_stand_0199 +tv_stand_0200 +tv_stand_0201 +tv_stand_0202 +tv_stand_0203 +tv_stand_0204 +tv_stand_0205 +tv_stand_0206 +tv_stand_0207 +tv_stand_0208 +tv_stand_0209 +tv_stand_0210 +tv_stand_0211 +tv_stand_0212 +tv_stand_0213 +tv_stand_0214 +tv_stand_0215 +tv_stand_0216 +tv_stand_0217 +tv_stand_0218 +tv_stand_0219 +tv_stand_0220 +tv_stand_0221 +tv_stand_0222 +tv_stand_0223 +tv_stand_0224 +tv_stand_0225 +tv_stand_0226 +tv_stand_0227 +tv_stand_0228 +tv_stand_0229 +tv_stand_0230 +tv_stand_0231 +tv_stand_0232 +tv_stand_0233 +tv_stand_0234 +tv_stand_0235 +tv_stand_0236 +tv_stand_0237 +tv_stand_0238 +tv_stand_0239 +tv_stand_0240 +tv_stand_0241 +tv_stand_0242 +tv_stand_0243 +tv_stand_0244 +tv_stand_0245 +tv_stand_0246 +tv_stand_0247 +tv_stand_0248 +tv_stand_0249 +tv_stand_0250 +tv_stand_0251 +tv_stand_0252 +tv_stand_0253 +tv_stand_0254 +tv_stand_0255 +tv_stand_0256 +tv_stand_0257 +tv_stand_0258 +tv_stand_0259 +tv_stand_0260 +tv_stand_0261 +tv_stand_0262 +tv_stand_0263 +tv_stand_0264 +tv_stand_0265 +tv_stand_0266 +tv_stand_0267 +vase_0001 +vase_0002 +vase_0003 +vase_0004 +vase_0005 +vase_0006 +vase_0007 +vase_0008 +vase_0009 +vase_0010 +vase_0011 +vase_0012 +vase_0013 +vase_0014 +vase_0015 +vase_0016 +vase_0017 +vase_0018 +vase_0019 +vase_0020 +vase_0021 +vase_0022 +vase_0023 +vase_0024 +vase_0025 +vase_0026 +vase_0027 +vase_0028 +vase_0029 +vase_0030 +vase_0031 +vase_0032 +vase_0033 +vase_0034 +vase_0035 +vase_0036 +vase_0037 +vase_0038 +vase_0039 +vase_0040 +vase_0041 +vase_0042 +vase_0043 +vase_0044 +vase_0045 +vase_0046 +vase_0047 +vase_0048 +vase_0049 +vase_0050 +vase_0051 +vase_0052 +vase_0053 +vase_0054 +vase_0055 +vase_0056 +vase_0057 +vase_0058 +vase_0059 +vase_0060 +vase_0061 +vase_0062 +vase_0063 +vase_0064 +vase_0065 +vase_0066 +vase_0067 +vase_0068 +vase_0069 +vase_0070 +vase_0071 +vase_0072 +vase_0073 +vase_0074 +vase_0075 +vase_0076 +vase_0077 +vase_0078 +vase_0079 +vase_0080 +vase_0081 +vase_0082 +vase_0083 +vase_0084 +vase_0085 +vase_0086 +vase_0087 +vase_0088 +vase_0089 +vase_0090 +vase_0091 +vase_0092 +vase_0093 +vase_0094 +vase_0095 +vase_0096 +vase_0097 +vase_0098 +vase_0099 +vase_0100 +vase_0101 +vase_0102 +vase_0103 +vase_0104 +vase_0105 +vase_0106 +vase_0107 +vase_0108 +vase_0109 +vase_0110 +vase_0111 +vase_0112 +vase_0113 +vase_0114 +vase_0115 +vase_0116 +vase_0117 +vase_0118 +vase_0119 +vase_0120 +vase_0121 +vase_0122 +vase_0123 +vase_0124 +vase_0125 +vase_0126 +vase_0127 +vase_0128 +vase_0129 +vase_0130 +vase_0131 +vase_0132 +vase_0133 +vase_0134 +vase_0135 +vase_0136 +vase_0137 +vase_0138 +vase_0139 +vase_0140 +vase_0141 +vase_0142 +vase_0143 +vase_0144 +vase_0145 +vase_0146 +vase_0147 +vase_0148 +vase_0149 +vase_0150 +vase_0151 +vase_0152 +vase_0153 +vase_0154 +vase_0155 +vase_0156 +vase_0157 +vase_0158 +vase_0159 +vase_0160 +vase_0161 +vase_0162 +vase_0163 +vase_0164 +vase_0165 +vase_0166 +vase_0167 +vase_0168 +vase_0169 +vase_0170 +vase_0171 +vase_0172 +vase_0173 +vase_0174 +vase_0175 +vase_0176 +vase_0177 +vase_0178 +vase_0179 +vase_0180 +vase_0181 +vase_0182 +vase_0183 +vase_0184 +vase_0185 +vase_0186 +vase_0187 +vase_0188 +vase_0189 +vase_0190 +vase_0191 +vase_0192 +vase_0193 +vase_0194 +vase_0195 +vase_0196 +vase_0197 +vase_0198 +vase_0199 +vase_0200 +vase_0201 +vase_0202 +vase_0203 +vase_0204 +vase_0205 +vase_0206 +vase_0207 +vase_0208 +vase_0209 +vase_0210 +vase_0211 +vase_0212 +vase_0213 +vase_0214 +vase_0215 +vase_0216 +vase_0217 +vase_0218 +vase_0219 +vase_0220 +vase_0221 +vase_0222 +vase_0223 +vase_0224 +vase_0225 +vase_0226 +vase_0227 +vase_0228 +vase_0229 +vase_0230 +vase_0231 +vase_0232 +vase_0233 +vase_0234 +vase_0235 +vase_0236 +vase_0237 +vase_0238 +vase_0239 +vase_0240 +vase_0241 +vase_0242 +vase_0243 +vase_0244 +vase_0245 +vase_0246 +vase_0247 +vase_0248 +vase_0249 +vase_0250 +vase_0251 +vase_0252 +vase_0253 +vase_0254 +vase_0255 +vase_0256 +vase_0257 +vase_0258 +vase_0259 +vase_0260 +vase_0261 +vase_0262 +vase_0263 +vase_0264 +vase_0265 +vase_0266 +vase_0267 +vase_0268 +vase_0269 +vase_0270 +vase_0271 +vase_0272 +vase_0273 +vase_0274 +vase_0275 +vase_0276 +vase_0277 +vase_0278 +vase_0279 +vase_0280 +vase_0281 +vase_0282 +vase_0283 +vase_0284 +vase_0285 +vase_0286 +vase_0287 +vase_0288 +vase_0289 +vase_0290 +vase_0291 +vase_0292 +vase_0293 +vase_0294 +vase_0295 +vase_0296 +vase_0297 +vase_0298 +vase_0299 +vase_0300 +vase_0301 +vase_0302 +vase_0303 +vase_0304 +vase_0305 +vase_0306 +vase_0307 +vase_0308 +vase_0309 +vase_0310 +vase_0311 +vase_0312 +vase_0313 +vase_0314 +vase_0315 +vase_0316 +vase_0317 +vase_0318 +vase_0319 +vase_0320 +vase_0321 +vase_0322 +vase_0323 +vase_0324 +vase_0325 +vase_0326 +vase_0327 +vase_0328 +vase_0329 +vase_0330 +vase_0331 +vase_0332 +vase_0333 +vase_0334 +vase_0335 +vase_0336 +vase_0337 +vase_0338 +vase_0339 +vase_0340 +vase_0341 +vase_0342 +vase_0343 +vase_0344 +vase_0345 +vase_0346 +vase_0347 +vase_0348 +vase_0349 +vase_0350 +vase_0351 +vase_0352 +vase_0353 +vase_0354 +vase_0355 +vase_0356 +vase_0357 +vase_0358 +vase_0359 +vase_0360 +vase_0361 +vase_0362 +vase_0363 +vase_0364 +vase_0365 +vase_0366 +vase_0367 +vase_0368 +vase_0369 +vase_0370 +vase_0371 +vase_0372 +vase_0373 +vase_0374 +vase_0375 +vase_0376 +vase_0377 +vase_0378 +vase_0379 +vase_0380 +vase_0381 +vase_0382 +vase_0383 +vase_0384 +vase_0385 +vase_0386 +vase_0387 +vase_0388 +vase_0389 +vase_0390 +vase_0391 +vase_0392 +vase_0393 +vase_0394 +vase_0395 +vase_0396 +vase_0397 +vase_0398 +vase_0399 +vase_0400 +vase_0401 +vase_0402 +vase_0403 +vase_0404 +vase_0405 +vase_0406 +vase_0407 +vase_0408 +vase_0409 +vase_0410 +vase_0411 +vase_0412 +vase_0413 +vase_0414 +vase_0415 +vase_0416 +vase_0417 +vase_0418 +vase_0419 +vase_0420 +vase_0421 +vase_0422 +vase_0423 +vase_0424 +vase_0425 +vase_0426 +vase_0427 +vase_0428 +vase_0429 +vase_0430 +vase_0431 +vase_0432 +vase_0433 +vase_0434 +vase_0435 +vase_0436 +vase_0437 +vase_0438 +vase_0439 +vase_0440 +vase_0441 +vase_0442 +vase_0443 +vase_0444 +vase_0445 +vase_0446 +vase_0447 +vase_0448 +vase_0449 +vase_0450 +vase_0451 +vase_0452 +vase_0453 +vase_0454 +vase_0455 +vase_0456 +vase_0457 +vase_0458 +vase_0459 +vase_0460 +vase_0461 +vase_0462 +vase_0463 +vase_0464 +vase_0465 +vase_0466 +vase_0467 +vase_0468 +vase_0469 +vase_0470 +vase_0471 +vase_0472 +vase_0473 +vase_0474 +vase_0475 +wardrobe_0001 +wardrobe_0002 +wardrobe_0003 +wardrobe_0004 +wardrobe_0005 +wardrobe_0006 +wardrobe_0007 +wardrobe_0008 +wardrobe_0009 +wardrobe_0010 +wardrobe_0011 +wardrobe_0012 +wardrobe_0013 +wardrobe_0014 +wardrobe_0015 +wardrobe_0016 +wardrobe_0017 +wardrobe_0018 +wardrobe_0019 +wardrobe_0020 +wardrobe_0021 +wardrobe_0022 +wardrobe_0023 +wardrobe_0024 +wardrobe_0025 +wardrobe_0026 +wardrobe_0027 +wardrobe_0028 +wardrobe_0029 +wardrobe_0030 +wardrobe_0031 +wardrobe_0032 +wardrobe_0033 +wardrobe_0034 +wardrobe_0035 +wardrobe_0036 +wardrobe_0037 +wardrobe_0038 +wardrobe_0039 +wardrobe_0040 +wardrobe_0041 +wardrobe_0042 +wardrobe_0043 +wardrobe_0044 +wardrobe_0045 +wardrobe_0046 +wardrobe_0047 +wardrobe_0048 +wardrobe_0049 +wardrobe_0050 +wardrobe_0051 +wardrobe_0052 +wardrobe_0053 +wardrobe_0054 +wardrobe_0055 +wardrobe_0056 +wardrobe_0057 +wardrobe_0058 +wardrobe_0059 +wardrobe_0060 +wardrobe_0061 +wardrobe_0062 +wardrobe_0063 +wardrobe_0064 +wardrobe_0065 +wardrobe_0066 +wardrobe_0067 +wardrobe_0068 +wardrobe_0069 +wardrobe_0070 +wardrobe_0071 +wardrobe_0072 +wardrobe_0073 +wardrobe_0074 +wardrobe_0075 +wardrobe_0076 +wardrobe_0077 +wardrobe_0078 +wardrobe_0079 +wardrobe_0080 +wardrobe_0081 +wardrobe_0082 +wardrobe_0083 +wardrobe_0084 +wardrobe_0085 +wardrobe_0086 +wardrobe_0087 +xbox_0001 +xbox_0002 +xbox_0003 +xbox_0004 +xbox_0005 +xbox_0006 +xbox_0007 +xbox_0008 +xbox_0009 +xbox_0010 +xbox_0011 +xbox_0012 +xbox_0013 +xbox_0014 +xbox_0015 +xbox_0016 +xbox_0017 +xbox_0018 +xbox_0019 +xbox_0020 +xbox_0021 +xbox_0022 +xbox_0023 +xbox_0024 +xbox_0025 +xbox_0026 +xbox_0027 +xbox_0028 +xbox_0029 +xbox_0030 +xbox_0031 +xbox_0032 +xbox_0033 +xbox_0034 +xbox_0035 +xbox_0036 +xbox_0037 +xbox_0038 +xbox_0039 +xbox_0040 +xbox_0041 +xbox_0042 +xbox_0043 +xbox_0044 +xbox_0045 +xbox_0046 +xbox_0047 +xbox_0048 +xbox_0049 +xbox_0050 +xbox_0051 +xbox_0052 +xbox_0053 +xbox_0054 +xbox_0055 +xbox_0056 +xbox_0057 +xbox_0058 +xbox_0059 +xbox_0060 +xbox_0061 +xbox_0062 +xbox_0063 +xbox_0064 +xbox_0065 +xbox_0066 +xbox_0067 +xbox_0068 +xbox_0069 +xbox_0070 +xbox_0071 +xbox_0072 +xbox_0073 +xbox_0074 +xbox_0075 +xbox_0076 +xbox_0077 +xbox_0078 +xbox_0079 +xbox_0080 +xbox_0081 +xbox_0082 +xbox_0083 +xbox_0084 +xbox_0085 +xbox_0086 +xbox_0087 +xbox_0088 +xbox_0089 +xbox_0090 +xbox_0091 +xbox_0092 +xbox_0093 +xbox_0094 +xbox_0095 +xbox_0096 +xbox_0097 +xbox_0098 +xbox_0099 +xbox_0100 +xbox_0101 +xbox_0102 +xbox_0103 diff --git a/zoo/PointBERT/segmentation/data/ScanObjectNN_shape_names.txt b/zoo/PointBERT/segmentation/data/ScanObjectNN_shape_names.txt new file mode 100644 index 0000000..1dbfdb7 --- /dev/null +++ b/zoo/PointBERT/segmentation/data/ScanObjectNN_shape_names.txt @@ -0,0 +1,15 @@ +bag +bin +box +cabinet +chair +desk +display +door +shelf +table +bed +pillow +sink +sofa +toilet \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/data/ShapeNet55-34/ShapeNet-55/test.txt b/zoo/PointBERT/segmentation/data/ShapeNet55-34/ShapeNet-55/test.txt new file mode 100644 index 0000000..48294e6 --- /dev/null +++ b/zoo/PointBERT/segmentation/data/ShapeNet55-34/ShapeNet-55/test.txt @@ -0,0 +1,10518 @@ +03759954-109f1779a6993782f6426d6e3b63c5ce.npy +03759954-b726f3df205d3b5911daf38720b2dbe4.npy +04330267-aa0f6ff9f592b327eadb8f8b5bc7d9a5.npy +04330267-966ea3afa71e3a574bba687d3dbe6227.npy +03759954-baca1996923c25f943a6722dac94523b.npy +04330267-bc2daa0406ad3324d724d9ce5af6d8e.npy +04330267-f56ea6d924207b5515c4fa96a52ac4ff.npy +03261776-64ab866236bd012a43ccf9e3e30b934d.npy +04330267-f5c26b7b35991739281d68269dab9234.npy +04330267-a95a8fc9fa81aadf40332412c5d013fb.npy +03261776-5bb7c6bcd79bd45e16262e5b395acc86.npy +04330267-821634b0caa5cdb57f0571f06b666f9f.npy +03513137-ba62b73074d51637b61d7759f8544b8a.npy +03759954-e491db83f21a5a6c4fdb7f619836e43d.npy +03513137-89815c92980efb27226eabe1cca3e850.npy +04330267-65eb72bf33da5b1511ff208156ce047.npy +04330267-d6bbaeb047b53c43e6b2f975f419eaae.npy +03261776-97940f715478c1c4ce76da9b42b3ec76.npy +04330267-24dfeb26cc47a046e6fbf2f5ae574e36.npy +03513137-45d6e3b0b91073af7359b134afde902.npy +03759954-ae85334cc3752412374e74ec21028517.npy +03261776-e17597ea42e1e18f3f1da4d22f591d97.npy +04460130-44e8212fe3d44b1ec8b200f28f6c5853.npy +04468005-c6486d5bb854e5758e966271baaa42c9.npy +03513137-a612b83619ce985f3de9dfa8d65133cb.npy +04468005-bc1c21333b5e22bf8145a50db7d52d60.npy +04468005-8e5519f10f0748695a7f2ba88db92d63.npy +04468005-3aafecb126c5e46d49906937a72a14ff.npy +04468005-565d7f01c9f8b6b53ae1361afc45ac52.npy +04330267-8c2491e5245804d1ffc6e457221b9271.npy +03513137-f778971235a67bba754cd8e5dd1ab945.npy +03761084-71221c380da96cbebe67d9b32c3ddf8.npy +03761084-b95c595576a3846aad0ab2bac067d6b1.npy +04468005-b7306885432f3bd5299a59bfd8e7d284.npy +04330267-1d5eb167825bacba688d3cf9b52f4662.npy +04004475-30a39487e93a01dc8eeae74a05480d07.npy +03938244-57992207eebe4009eb332cd2d2a300.npy +02992529-d5fd6679ddfc8ddc59f56ab706e2f74c.npy +04004475-266014617a73853f9a8c3855109c1ee0.npy +02808440-7e5857a4abbcbe9098dcd47b5c6dc2e5.npy +04468005-1f4f874957d140cbc834d88a99ade94d.npy +04468005-13aac1cbf34edd552470de2774d6099.npy +03759954-4bd87bb547f266f3133483af4507508a.npy +04460130-8cf718ed6a5fefd8fcaad7f5ff5ee65c.npy +03938244-e8a13e84cc6db127616f4ad120b6332a.npy +02992529-2eae0713342e1103397d790c3d0a8fb5.npy +03513137-2c9086096c0fe9889215d30ce83ed4dd.npy +04468005-84a3fd24d2cefcfcd781754d41e2576e.npy +02808440-25370f9a01166beaa13edbe825cc0113.npy +04460130-7696d47199f9055a79ea17c9c8a4feb0.npy +04530566-2c8725b9a09b6d0a44ebbc705ad8c07.npy +02871439-a27245122e4c284d67aad4e7f685c416.npy +04530566-f2e303d85466a0fd88d5590328ce0ddf.npy +02871439-ca56637ae250ff1259adebe36b392f27.npy +03593526-276bff32316ddd3eec0dc003f0209134.npy +02871439-a45d9c141a0ae4a627afb81497348633.npy +04530566-ad8c4e406743c29a5b84e0ded5ffcc87.npy +04530566-2a86437a50f1b51727ac692756be9e24.npy +04530566-d188b20659011142c8067f9682b92f0e.npy +04530566-12900e06f0f4ec9e49f471d054f6b528.npy +04530566-de7c3942e8a460ffa9bd9d33180e7ac0.npy +04530566-957ac9708448e111f0ef63bb932093ce.npy +04554684-b91045b62241ebd158c88d30f502a452.npy +03761084-6942c30f25bbcde7ced224a469840964.npy +04530566-d1e59a48852965fb036cb639ea80765.npy +03938244-efd9fffc04d235dab55fde51a411949f.npy +03467517-8402cf0cbb6dfc92b5b477b4ad381f9.npy +02992529-298ca71453baf6ee2a9eb0f146e94477.npy +02871439-6f65749bdf82cca8d810b14a81e12eca.npy +04530566-d703643f4a4f76a16c63b8b48495261a.npy +04530566-296f0b6a15012e33d87f29c9afcc633e.npy +02992529-89f17a3563941ba9f2fdbae39bae1eff.npy +03467517-f86c277a6e1f444293f0194265a9746c.npy +02992529-d2f3eb92a31649647c17b7a9bb17a24.npy +02992529-657fbd67af945c39d9e3837723c05057.npy +02871439-704e5237bfe45aed809222e4341a7d65.npy +04530566-f26d39cd431135cbc92e1912af872cc.npy +03467517-a19b20b4ec66e57d6ee1932063f20d95.npy +02871439-dbcee69eecd13b3b5196bf7c8aa10ef1.npy +02992529-1e52452aeb4bacbd83156841b8188cc7.npy +04330267-f4f9375024901a8e41965be83b7745a.npy +03467517-2331b83b682e6dcd1082f2ea630bf69e.npy +02808440-2b9228db2c77130d44221bef0fa3c36b.npy +02992529-e33e1483c4c22b1ae71852a7b0e4fcb6.npy +02808440-caccc22a1266150d3321831d2245cf06.npy +02992529-ac0967f9fe8f63f46b2ba76eab0d2b1c.npy +02992529-515b5a63ebb56aad7aeb5bbdd191fd4d.npy +02808440-8932abdd856b615756e28fa5d4761d89.npy +03467517-dad399bf54b6186a40c20797381ee39f.npy +02992529-5f600251394fabe6808ca88aece2e3dc.npy +02992529-6e18484e72c79bf6943bfa124ea09a0b.npy +04401088-bf7daa3ade10ee75bad093be69512dcd.npy +04530566-2a3e2ecc6c6d3be83b2c1416b6e149a5.npy +02992529-baafe1add38af23a5f0b5b54dbc4f35c.npy +04530566-c359eef375afa3b6dd42314e00caace4.npy +02954340-188702a3bb44f40c284432ce2f42f498.npy +03467517-bdc8060a937278f25b6b4dd555e889f9.npy +02871439-ffdc8c4c72d7ca59ccbf1ee2df182caa.npy +04530566-b3090ee38204289cb90142192ec795d.npy +04530566-d0e9f4c4bb582c3cfa0636f27a8b2a9c.npy +03513137-73359cd0e38579745c351e299b24e355.npy +04460130-4264b506533b1e2e473f10e6caaeca56.npy +04401088-fc1675526d043e81a2811061ff7e0824.npy +04530566-ca529b32d5bccdfe7d66e5fb8a76ea1f.npy +03467517-4c5288cc18896f8f352e5d4d2615db5b.npy +04460130-e3f5234bfe086a3438cd8eb23853c009.npy +02808440-41c2075df14356713321831d2245cf06.npy +04401088-d2636f3af00fb3e2538f655e65b0b57.npy +02992529-54d5d64e0d3b0f95952ef623ec48449b.npy +02933112-3d5ef34ce469b11c5af597c14b093f6.npy +02933112-b9fd0cb66675dcc87c9ecef5753df626.npy +03593526-4d53bcb8348292d4b4be5695ea899000.npy +03467517-2f9d51c98d517ed1b647271c21ec40.npy +03642806-593d32126cea601d5a952e55d06611ce.npy +02808440-b7d1bc59194e2c5672101dcac4ed75d3.npy +04554684-c709c8a6cb97c8e55c67382e5c978dae.npy +02933112-c52cc29136169ea014038d588fd1342f.npy +02992529-6fe550e061e70579a05d3424fd8d541a.npy +04401088-e06b902efc1576c62fd4061aba358325.npy +04401088-f9ecc6749a251c0249852b2ef384d236.npy +03467517-e66d799f51f1558a2214be36f33a634a.npy +03467517-59e7e8bc76d47722b48e9ff3519bfb40.npy +04330267-e69db4d377603b7d37b2bb75885cfc44.npy +03593526-7bb71bbabeacfe9f27936e29850f1fad.npy +04401088-6cc44d39e099bb6b9ef9eb3ddb0818a.npy +02933112-2a9acc146f7310b1492d9da2668ec34c.npy +04530566-59fefd79eba35dbb723877c00e9cdc03.npy +02933112-3e881be7e5289fcb77a8ecb4b9a890c5.npy +02871439-601b64e8e27159e157da56e4c9ff868d.npy +02924116-27b5ee7b86057ba0c95c7a8a79dc0c72.npy +04401088-73ab63e7ac7a404b545fb5ece69fbf4e.npy +04530566-4d8ae6327ab4ed301e66f1783a4812d7.npy +04460130-c6e94a8464305378cedded8270815eaf.npy +04401088-b69603be92146a161ad8041551e9d3c2.npy +03467517-10158b6f14c2700871e863c034067817.npy +03642806-87ffe7aaa7304b1b775a6b1e21d79260.npy +02924116-40a40bc3ed3934a5a500884f38f28607.npy +03467517-42f3172b8770d2fd2200c35bfa7099ee.npy +04468005-25c3710ca5f245b8c62b7ed19a553484.npy +02992529-b8415769dc1bc92821844676433a0aca.npy +04530566-2c7a0d5909d8dd46a3599da6d4b3696d.npy +02808440-6e586dee4b54e6556ada9e1e675a2b32.npy +03593526-8b56cc59b433b83d42266d3d768f0d70.npy +02871439-aba0fe4f9da44175a51af6b739ab25e8.npy +04004475-c73c7f57faa4c40de5ae40d496bdd7b3.npy +02924116-dcc301919ebf2423b129901f80d24b7b.npy +02992529-9c1286570bbc6fc78f257ecba9a6ef8.npy +03593526-ce641a7a7b0cfe1ad85aa63241192dd1.npy +03467517-bfe1ea2edf94e0b86ee1932063f20d95.npy +03513137-3b45ee42f62559c74e5e6ac3ef6bff73.npy +04530566-99ecd71c5103416e698137c717c4ad11.npy +02933112-7ef036a41e1b9e2aac00fd1150223027.npy +04530566-49861c22df11a02b910f44c20a5d1839.npy +02992529-d050f7389538de04ae0591d02e40f07b.npy +04401088-d61ddb57397143e38d03482ac0270137.npy +02992529-528e6424ccdcf2af21844676433a0aca.npy +02954340-1eccbbbf1503c888f691355a196da5f.npy +04401088-fd3c1ac6cd1f94bd3982f71b09380baa.npy +03467517-1b7aed896667193ed5006a9fa189ec8a.npy +02933112-8e1a1e2879cfa2d6fe395915d44df772.npy +03467517-8d24a89192c4d9a593a3cb7ad5bbfafa.npy +02992529-6bda193370e2c7e9a30edee0b4a86a6c.npy +02871439-1761cc50604f9faef759bc1c69ff20e0.npy +04530566-e51dc5bb6b97700747d2f4d1390fa93e.npy +03642806-164b84d13b3d4650e096f6db40afe7bf.npy +02992529-18cb51f36acfe30a487d18402ebe69d5.npy +03642806-e55ececde88255b93e73f3893a7337bb.npy +02946921-7883b684806946276f056d414894e46d.npy +03467517-d528407fe43b5df193f0194265a9746c.npy +04530566-9fd71a532f7c732fb036cb639ea80765.npy +02992529-b35c2da756f8df5aa0eb5a85db887292.npy +02933112-5172c96ea99b9f5fde533fa000314311.npy +02933112-962de4481f2844aeba3e7e48acd3a1c6.npy +02808440-d6a1c1c47190649a54d7082b34825ef0.npy +02808440-f2306272d14861367c8e9b5cdcd2f0ef.npy +04530566-e42655032562701e746ffcbc44510229.npy +04401088-e71c51adfe4d4f00341e76467b172f31.npy +02933112-a03797c4034be11ac59350d819542ec7.npy +02992529-c65f71b54023ee9897d7ccf55973b548.npy +04530566-e1e3c053f4b4f1405e45696ec6d1a105.npy +02924116-cd89b45698f631a6a0975a87469abb37.npy +04401088-ac1e771d6392e912f594ca916b37180c.npy +03467517-4c082a95145f866a8388889c8d3c7bea.npy +02933112-b539b0bdf5c760b1c0eeb4326d5ba9e6.npy +02933112-7fbb7a6e017d3bd1921dd903dd0b8b17.npy +02933112-a5f28af83eb1dfbc3ffd072b23bde58.npy +02992529-eb61306048b7848c327b5f10f339d9f8.npy +02933112-4a2848db82ae01f7490ad276cd2af3a4.npy +03467517-de424132b05e349793f0194265a9746c.npy +03467517-54eedf9608f598d5329909d772c2a884.npy +02871439-cc38bc7db90f43d214b86d5282eb8301.npy +03642806-5fb5b09b324dc153ed883f1f11a51185.npy +03761084-2c453abc6198b01d3f7f3ed2c3c690fe.npy +03761084-f0c0893a5aabe2412fbb75bd5fac4890.npy +02946921-d511899945a400b183b4ef314c5735aa.npy +02933112-b649e3084819c7847445d25f394949d0.npy +03467517-e1d55b9cdd791c937fe275cdb56536f5.npy +03642806-f7c26b8c94ba8214397c35f585745a82.npy +02808440-c4920feed5e6b7ebccd0340812259a39.npy +04530566-3bb6a5deec68ef77fee64ca302793912.npy +02808440-4a7e3ca704e59439b362845c6edb57fc.npy +02924116-7369744c0ff9a5ef552840b851f9a5f9.npy +02818832-28bf7b22618b3df750bfb13a96421ac0.npy +02933112-9166dfd18ac60504f0fb3e3d2a0d34c9.npy +02924116-b96580140823a3624b8804c563aa0fc4.npy +03593526-b5f802103edd92d38c6cecb99943f941.npy +04468005-10e0da9af8eca77948b299c18ea5d916.npy +04256520-147df78321f90f20a494798fa117187b.npy +03642806-63e5805f8bd216313bba289a9fdd2a7d.npy +02933112-40f90a159f03321cc59350d819542ec7.npy +04256520-d20c3649494f2aac14bac2ebb8f636e5.npy +04256520-bc6a3fa659dd7ec0c62ac18334863d36.npy +02946921-540cb2a72840ec1130612f5c0ef21eb8.npy +04256520-ead2f0ef7103c963fc1f58a995f231d1.npy +03642806-e374559441d5c5bd386658d2bd45d727.npy +04256520-dcd037ab067a0fbc14038d588fd1342f.npy +03467517-dc623742d6d1518e19959b248340fafd.npy +02992529-4546af9a8a67e7439c3dc4e242073921.npy +02933112-76ee9167548caf224983f386c1ce1710.npy +04530566-6a9764e3e4127744be2fa29f46d19511.npy +04530566-ffb0a1240833569b9041e5038dbb1ef6.npy +03642806-e466c2c86a439c1faebff3b001eb4a27.npy +02933112-84ef04bae77ca17d532e8683617554c4.npy +04401088-8ea08c4be8f2f96095f577622f465c85.npy +02924116-15da18825e00c7709797a4124a9f002f.npy +04379243-268a739200930797c862eec8232fff1e.npy +03593526-275cc21fad6aa1b6bfa78a7d067c469c.npy +02747177-2251883e24a2527df155d75bbf62b80.npy +04460130-19e66890128da2d629647c2672d3167a.npy +04379243-b73a89c916a0237e90faae3c2240cd5a.npy +02924116-3c63a033cf78bc0f1cc733c58de8f512.npy +02933112-8488c41b4c17d0a81a8dfe268f567c25.npy +04401088-692e5fc16bc6ebd23737433332467411.npy +04379243-d5ca71b9b9ca6e5041b73991ca70550f.npy +04379243-95bfb466d603b6baa45e8d2f28a9ea98.npy +04256520-d546b9afa6d0a22fcabc196a7f35f1aa.npy +03046257-158ba1d60c6418fe4b3c42e318f3affc.npy +04256520-8b5fb1851caf5b4c5b89c9fa863d4b06.npy +02933112-2cf4888579296377c59350d819542ec7.npy +04256520-33ab50198c84645ef91663a74ccd2338.npy +04379243-e28354127815445a83e5416284930195.npy +04530566-7c23b6218a5041f36a2173cf491934bd.npy +04379243-56bb7376dfa9cb5c8cf069d506f8b5ac.npy +04379243-9f5cd9e55f0b4c42ba128419b7cd4010.npy +04379243-87666a40c8a35641c7166d921771062.npy +04379243-e9ebf354db8fc0fb4faac606fa48b508.npy +04379243-90f2e686389b56b3bf262660cda9995d.npy +04379243-d76d897ff334065a82130856eb48454e.npy +04379243-ea21cba1d83526f6deab8d9bfbc24756.npy +04379243-b23405a8f15f3fdb44175b4dddf5be08.npy +04379243-76de9805c6e208e6b2644d7d4d7ea2c7.npy +04468005-3d4ead5985c72e2fdc14ba0818ee5cec.npy +03642806-6f20fd2e8d8d518da5f7b1c78f76e23e.npy +04256520-f8d7dc3e169cd91d593ebeeedbff73b.npy +04379243-727b33a75f10861423fe3501bb9e7193.npy +04379243-d9faa371af8e7f443fa7114f9b06aaa5.npy +02933112-7bbdaeb0633738e611fc2b865c2a185b.npy +02871439-2aa9c8be14fbd5ffb8723a5122beedfb.npy +02808440-a9e1f301ddd72647fe52ffd0e748a1ab.npy +04379243-541ba3fe085905e19ccce4c6d5bb195f.npy +03467517-ba6d3dcff42ea7bba32c4b8efb0131e.npy +03593526-c1ded06f2af01612a54fd40ef3a8dfd0.npy +04530566-6fbb26f9372ee87648192cebc0015590.npy +04225987-e06b51f45c1aa29a98c63cb68f11df34.npy +04379243-c6c412c771ab0ae015a34fa27bdf3d03.npy +04530566-6c1cfb2fe245b969c2e818a707fdb3e0.npy +03797390-599e604a8265cc0a98765d8aa3638e70.npy +04256520-2f6f16e5a1d36f3fefc579970fcfc006.npy +04256520-25e718b0164f54d5a9f35e635b7e48b.npy +04256520-3a3cc27878713c19676de9b6e111da8b.npy +04256520-2835a9015c20d891261770c74651d29a.npy +04379243-c912a8edbaaf0fc72e6a7aad8523e7e6.npy +04379243-150c9c514d3274b315e97d83801e911c.npy +04379243-39bb09201e0cd201c17e7f250c5222bd.npy +04401088-ff9e8c139527c8b85f16c469ffeb982e.npy +04379243-b5daa2d15dad58d24fa2457d6e4d0c91.npy +04379243-818723195f30327b445e85eb534460b0.npy +04379243-ead000700697a012310af74324aae27f.npy +02871439-b105d36dbf010903b022c94235bc8601.npy +04401088-bf8e0289ba786e97487d18402ebe69d5.npy +04256520-a6cd2326b2660ac9a4dc2316a7e66d36.npy +04256520-4bebf39e3fd794937177a91ecaf96588.npy +03046257-cd17490f806732d460d9b527752ac99f.npy +03642806-80c013931b7f7b49636ee1998fc5378.npy +04379243-da5d6d0da4ed0c1cea65c47b660136e7.npy +04379243-151c68b48a1359c58566c6c3bc94c70c.npy +02992529-3ef278f78ddb1db52a39b1d7ef8834b0.npy +04256520-a54fbc57992e90b9593ebeeedbff73b.npy +02924116-8900a49e1cdb3470c95c7a8a79dc0c72.npy +04379243-67a49674df5b8a44f51f77a6d7299806.npy +04379243-3c5148ac155d020763ed57e35c972b4b.npy +04379243-ced7aa76ea532e0a68e125404f814ba.npy +04379243-bb7672d1a987dc303fb0851e9bc87551.npy +04256520-a63bc3a5d43888a962e682c9809bff14.npy +03467517-82f1a0f72d800cbd93f0194265a9746c.npy +03001627-bf89775d876f6849f2b7580a739cd4d5.npy +03001627-f1c6c74053fe8888c5f49519e3caf51.npy +02933112-323c85aa6d1949abaec7b0e2cd000db4.npy +03001627-c4ebef05a72fc4f39d62eb3fdc2d3f8a.npy +03001627-ec0258c40ac29da083deefb07c367f12.npy +04401088-e156db6fe3b9286c87cb3c64e47598b4.npy +03001627-62f442aaa230eb34e7697d561711bd2b.npy +02933112-4d3308cc92ffdab432b72c6a3d82ffd6.npy +03938244-f921237171924e992d9c07d3b9171829.npy +04379243-a5c68fc026173a5671e2498adb56e791.npy +04256520-4d5adaaa9b5d9d42ef188758bf2e3a30.npy +02808440-a31af845a610a552d83e8d4109d37961.npy +03001627-e854aa6a9c97d829cde6b082a301e49c.npy +04256520-a078e45c64ef80954a4ccb8d69e8d887.npy +03691459-835e01af50296235aefda81565fede7.npy +03691459-2db3489b490b0d9e2268dda5c324173f.npy +04256520-542656b66458b918cfc64925a56d7ba.npy +04379243-7813f4e4c0a58118cbb8bac2032149c.npy +03001627-76710f51915396e0327289c00b6dc9ca.npy +04379243-524af53b7863f506e227c1bcfe5b1fc6.npy +04379243-32a6ef11cd29c6333002761e7a3ba3bd.npy +03001627-e896f38e6b62f25ce030e064f3b8af2b.npy +02933112-8e46f3a871f86befdb955a8e38fc7dc8.npy +04379243-ae62ecc28b56c7ad68e125404f814ba.npy +02808440-9458bf8670645df33321831d2245cf06.npy +03046257-253156f6fea2d869ff59f04994ef1f0c.npy +03001627-bdffe559220b8a561b01b8d225cb89ac.npy +02871439-692947c56ddba208b773535ea8cba6d.npy +04379243-86951b133a4c6e9bd989b7b3fc68c580.npy +02808440-958ab8793129ffb53321831d2245cf06.npy +03001627-7c2bd3b26bff1d7568c981036afdae64.npy +04379243-39f0da2d45ad3b6deb82e56bb4ec31e1.npy +03001627-cd989e48c5348bb530e06a011e63236a.npy +04379243-f1695a9ec05b757ec7cb90e4399b486d.npy +04379243-a91554caeaa6f9db399bb05f18e8188b.npy +04468005-4c4e55e6cf8e81adb2faf16541f353f5.npy +04379243-175a624623ad6fb037b2bb75885cfc44.npy +04379243-96122c5c0777cb85d3520bbaf4a08c12.npy +04530566-b7a3a8c9e2e1f0eeb569bc98d0a027c6.npy +02942699-3d81cebaa1226e9329fdbaf17f41d872.npy +03001627-404d58ff6722e4a34014f1a5fb376d1.npy +03593526-b89f48fd4a8921dffdbe2bf897d8a820.npy +04554684-f0a1e9e6ad4b47b60a634b9aafd6dbd.npy +04379243-2dc5edae3c234a5b5706d1c54190f27a.npy +03001627-6cc771aa1a807dea19fb4103277a6b93.npy +04530566-f8b80289dbba94bdb7002bddf0942f8e.npy +03001627-891f1cd440afa11517b431cae0dd70ed.npy +03001627-37235898ebd06b3b504721639e19f609.npy +03001627-59f1f818fce72660ac285e4454a089f0.npy +04379243-6d54019f7543e4eaad16260d4d73b56.npy +04379243-15a6e8fae3343178b4c161851ed2b4e4.npy +03636649-eefbd20231e62d535c10b08ea69398c3.npy +04530566-70dcc0d460cacce0e63ec060b551ac57.npy +04401088-d4407c240737b0c73455cac94a339dea.npy +02942699-c9c9ffd08af8b268b52759c2c2fc0d1e.npy +04379243-b91d82b0ef56c395a8005eb66c8d94ac.npy +04379243-6bea2e040e199020e0c5923879d79f21.npy +04379243-8cda30b88d9bfa27d810b14a81e12eca.npy +04379243-356fbc66c305dae355f46d55537192b6.npy +04379243-7e03f7b740e118abeae724160fcfe6b4.npy +04256520-ead777f4e8c5bc346ad8177a9d42d3c9.npy +03001627-e967c4817872b637de03ab2a27ba7531.npy +03001627-924f413e0a7a6ca8492d9da2668ec34c.npy +02933112-1ee6393153a3146ebc19762eaa7ba40f.npy +04379243-8be5c241cef6212fbd1f60c111786ed.npy +03467517-b10a04b6b2e6bc42948046fa63441a28.npy +04379243-cc42f5cd765780d5dbbc9440457e303e.npy +04379243-3f411154853b403921db4632488a2ae9.npy +03467517-1218fa3b8681bfa5d57700c05b1862d8.npy +03636649-1579c3aae8e26472db1afe6c464e7652.npy +03001627-aa93247a7fa69991e074517a246f1e65.npy +04379243-fd57354b70d416386086aaeef17e8c87.npy +03691459-37b5f7222e0eaaa78803395bce6d7b63.npy +03001627-8c76b1db0a08653ffebad4f49b26ec52.npy +02946921-295be2a01cb9f29b716714dd1fd945b7.npy +04379243-34434ee1d6b154f8252b40995a250bde.npy +04379243-d6728931be54e6924b3c42e318f3affc.npy +04256520-84c480a1a055bd0f7223d6cbd6200e8f.npy +02933112-c5116cb158a5b4e6a0f23466c3c25e2e.npy +02747177-7a931ec996edbfeacb2a965e75be701c.npy +02808440-b5de770d4158a9875ad109ec59db9fdc.npy +03938244-4ae37fde7b123dab5dc3653f8341633a.npy +04379243-f2e1735aa2cba97222fbb0d1d627b825.npy +03001627-8be8093e99b94bd9cf320c31965db5a1.npy +03001627-ea7be2b97e78d5b35a4480134e0cdd21.npy +04256520-3cf0d27803acc8cf1290417619264ca9.npy +02933112-1d61ca99924b13fc99dd23ec22c4943b.npy +02808440-88f7396c2dc207d3b362845c6edb57fc.npy +03001627-bf879252fc85aa936d838816bd35691f.npy +04379243-d821813cdad2ca93183128a5e9c4cbee.npy +03001627-f5ef49d354efe6741cda53280488fc3f.npy +02871439-f10c63b9b25d17144dc074799d15faa1.npy +03046257-8a206a72f673973a435b6c388b558e5e.npy +03001627-353707e135c889d2dbbc9440457e303e.npy +04379243-8551281fe6e37db43002761e7a3ba3bd.npy +04530566-a8dd1e23448a492aad67d63ac9e4b707.npy +04256520-12843b5b189bf39f7cf414b698427dbd.npy +02992529-7f756e697cd03ac821844676433a0aca.npy +03636649-684a9c789b62321092cf95a109e87d7d.npy +03691459-539d5ef3031544fb63c6a0e477a59b9f.npy +02933112-14ed803c2251dfc1ec451f73f474981c.npy +03001627-d2af105ee87bc66dae981a300c94a911.npy +04379243-b11ab64f79e13e1b714473735ef35ab.npy +02924116-6060e1abfb2c85da2eed4e833c76b59b.npy +03636649-90651b3febfc3afe15226aa76eb7c3e.npy +04530566-1f9315ee16e03c64450e0a3087ad6863.npy +03467517-5a5469a9912a03a0da5505f71d8f8d5b.npy +04256520-930d2bd446a43e0ee8058cf23f6382c1.npy +04401088-f5f1fbeca9af99c98efee9b82d757c0b.npy +04256520-31fb6cfde1fec63897f7290a893b9fc7.npy +04379243-8730e3ce4daf7e264f265f0c85da0b1b.npy +03636649-d9f6bd064c9fd456fcb8d8c6d4df8143.npy +04379243-da23d0bdcd1de093de909714df3390c0.npy +04379243-a2561614d015f2fdfebad4f49b26ec52.npy +03691459-c134c61a5b45dc281574d21c0c95092f.npy +04004475-cadd6125bf30f513e10a48f2bbb9bef4.npy +02747177-71c45644821a8961ad5067eac75a07f7.npy +03001627-86e6ff997adb2a192c90ae7b7282b9f.npy +03001627-d4edd167061dac5f52a3901fa1436b1a.npy +03001627-56cc047440e7c999a23949c21eddef76.npy +03636649-70652459696b25037e0f056bfb925424.npy +02808440-2b1d6ad1dbdc945bc3f6ab99a06dd7a.npy +04530566-8d8113b30710a6bb68d1fcae6985bcc8.npy +03691459-77514a7ccd32860dd9dfbc520b0d9752.npy +03001627-1f8eaa7aededc7e637b2bb75885cfc44.npy +03001627-ee445cf3710af7e21548fc89657a4fac.npy +02808440-37f0a39abf371409ec54a7cce22716f0.npy +04554684-46251e61b0c06c0771ee000eee74cabc.npy +02691156-6d0b546bb6256eb5e66cabd11ba41eae.npy +04379243-b16b0c22f89f43ca9b40e76e725878.npy +03001627-f7626a4eb581bcd7140769279b0e5e15.npy +03636649-5ed0d3a50d9d77dcf1dc60fdf1e64165.npy +04530566-3838f398264452a47c97d792b03a31cc.npy +02933112-626bba505f03233ef51f77a6d7299806.npy +03636649-14d3d2418165ec86bba785994a529f86.npy +03691459-5e40ffef9d25d0f031f3d76ec3df45bb.npy +04225987-48bf45bffab55d7cf14c37b285d25cdf.npy +03636649-4e54fc131882f2233c8d0fdfb1cc2535.npy +03636649-29a363fc242b282b45df535caecae62.npy +03636649-15606afd522923eb4e91947b208587c6.npy +04379243-e2f60503a4fabc4aed20ed9a17aa05a4.npy +04379243-8569fbd5e27a1845e7c7bcb951a9c987.npy +04256520-9b651dee9548be90ded526a7be77b30e.npy +02773838-54cd45b275f551b276bb31db0358e9c6.npy +03001627-a7caeaff5582f54f55f9913e822d5318.npy +02958343-1d234607fafd576b6dede2eec861f76.npy +03001627-a1213da0e7efffcafebad4f49b26ec52.npy +03001627-ccf29f02bfc1ba51a9ebe4a5a40bc728.npy +03046257-1782876c0f584452cf5a37a70014c623.npy +02958343-c1192c946a99ee529bdb511fb702b5ae.npy +03691459-916d2e621caefe3a1a4345b067aab43c.npy +04379243-a4047a8f57451762a0ab1d82ef09f78f.npy +02992529-7392ea79052281e6bfbac23a8087e8f4.npy +02958343-e999dfb757ddca4830e7f6cd6fb3f1b9.npy +04379243-ec9861c234daf6bc915f51b5f5e95ffa.npy +03001627-55e7251e672cd45e796c584ff1fcf56d.npy +03691459-cc9edcabf65e42d3febdb1f263373824.npy +04379243-6b521eb69b5af97dcddece8d514fc823.npy +03001627-47eff1e5c09cec7435836c728d324152.npy +03001627-6c5b15a19101456219cb07ecb5b4102.npy +04379243-c193add7ee3b4fbd63aebe2e86fe0041.npy +02958343-28bb7eaa8037a2e9afe1d4530f4c6e24.npy +04256520-77196cfcaabb6f750cf3715818ccfe8.npy +04379243-634bcd3197e337aafe4e4de1adda2150.npy +04379243-206a239d64ad2b31664b3b9b23ddfcbc.npy +03636649-cd0f2eaac6719a3ddb039d8689a74349.npy +02880940-64d7f5eb886cfa48ce6101c7990e61d4.npy +04256520-fee915afe193518dc036a40816608369.npy +04379243-6560de55043db06ab0783d9ebb200d10.npy +03593526-7213aae6cdadc227d680196133d8b70f.npy +02958343-2854a948ff81145d2d7d789814cae761.npy +04256520-924761d5171a0682e5c139899870edf3.npy +04379243-e96108e514142d13b3cf15c77de45986.npy +03001627-64a699cf5b2a43473f7e27638e63d848.npy +04530566-684d665be29eaa49a1e649e7e3e5f054.npy +03691459-5336a4698616726725a4212543dabaf9.npy +03001627-e25c7c2469135e3fdd3adf3090c701f7.npy +04099429-daf0f6c6a4bfe6843656f5a839c1bd14.npy +02933112-45bb41433302f3f5490ad276cd2af3a4.npy +04379243-887ae0ad66669f1b302fb2a9e79d3e7d.npy +04530566-7bfb0e8e74e1bd2bbe7ca2216dc1576a.npy +03001627-61de75e888e8727486debb0a33c851f8.npy +04379243-d2222dbbaaae806cacd0ab81dc64966c.npy +03001627-6e53d494768386ca8579483a049f2a91.npy +03691459-73c76faf92402a9183247f812f2eaa97.npy +03636649-964d3a853d6e5a642b1c313558664cae.npy +04530566-60c58f42072396986d4334e260ec617d.npy +03636649-ff22bf19e2ef19d12f7ffc95c59dca52.npy +03001627-8f268673d08240d34eb6dda9557ab0ce.npy +02933112-1de9b71f35b51b56c59350d819542ec7.npy +02933112-c86f009c4d1e1d2941e1a63759e8b225.npy +03691459-a05dda1538ddcb4cd747b49524a1246e.npy +02933112-8e2f81ceda8e42ee4b4e980f23aaee7.npy +02933112-298dcf7bd982cf0712de5317fe5b354f.npy +03001627-997853f8fa3678df5ac8254dd793f590.npy +04379243-20d23be3b5180ea9e51ca3f3e83d9132.npy +02691156-e501a0327ab3731d0f859db45b95a2d.npy +04379243-ba99a0f31b2ba6e51f087e2218f8d26.npy +03001627-fbddac94cfa74a7b5c0228148b88226c.npy +03001627-bf41b418250959d0a8699b6183baa203.npy +04379243-696425932b878a839335a4bbd2281da5.npy +02933112-575d4aa0c1b95b0836d8dd30a594b2af.npy +03467517-301e0388592cc17bee974d1eb57427bb.npy +03636649-51a0575368d16f4c99e8bf807e902261.npy +02691156-273c9c0bd43443c3b4f192eea1889928.npy +02691156-86590fb6310cf7361f1ef59130c405d.npy +04379243-a9e23932f14fe0cd323ff07d83f4248.npy +04379243-47317755c82114d5c3bd24f986301745.npy +03797390-bf2b5e941b43d030138af902bc222a59.npy +04530566-a48181b53d207f702ec88d3440bc2d77.npy +04256520-b8ab014839e2a28af62af8489541547b.npy +04379243-b7ff6501981195caf771fa2e8f483ca5.npy +04379243-23937a360c840bbd2b70eac6546e93fd.npy +03001627-104256e5bb73b0b719fb4103277a6b93.npy +03001627-4ed8015bdbd8c03d2f95e2a1e9997b85.npy +04401088-8959f06b36d90e6a7c4a9987d1ab61dd.npy +04379243-44360c91a7e91098d93768e7b9b1eabf.npy +04379243-dade0594e68e2250be6c545952e7fa4a.npy +04379243-daca80d92e046faaaf90989a4df930dd.npy +03001627-d54100efac3ab743626ced72908b525d.npy +02958343-597c9eee5a5ba96b313436e774fa02eb.npy +02958343-19d35f3e0c0b402125ddb89f02fe6cc0.npy +02958343-62a7e17ce83e2f9cc0ed6ec757ca50f5.npy +04256520-c97af2aa2f9f02be9ecd5a75a29f0715.npy +03001627-a9053230c8e02442c8687ff9b0b4e4ac.npy +02691156-10c7cdfdffe2243b88a89a28f04ce622.npy +03001627-9ce08b44810f03c963cf8719fe855f3e.npy +04530566-eadf347da5aa8877da97052ff1f36504.npy +02958343-46c504c9760fcf0e7540f431cab4686.npy +02691156-9617ea33f17993e76f0c490da56d34b.npy +04530566-39875815bdfdce2193b1b9ed21f1fb92.npy +02691156-189f045faacc1b5f9a8993cdad554625.npy +02958343-ac56c7527df057173c5d25c30835eee9.npy +03691459-9ec130a3ef44b7a1e47833b310955a9f.npy +04379243-c14fe6a74a071b73664b3b9b23ddfcbc.npy +02691156-d1b1c13fdec4d69ccfd264a25791a5e1.npy +03642806-1a46d6683450f2dd46c0b76a60ee4644.npy +04256520-48b2e88f7d199d43517a64eed9809d7a.npy +03642806-7d733a513d905a1a56fd4d28526341bf.npy +04379243-10e2e8385b5322144708f4c6142673f0.npy +04256520-2c12a9ba6d4d25df8af30108ea9ccb6c.npy +02958343-1d0a46cfc2799eefdeea60824a43a0b.npy +03001627-63c7b59dbb2876b4aa2ac8cb6992212b.npy +02958343-11d1fdaedf3ab83b8fb28f8a689c8ba3.npy +02871439-b6bed1d1abf2f8cdc2731798aec2f82f.npy +04468005-fa69b96acfc4ab67d6d91af432c7bb1b.npy +03001627-c70f8a49f26a012f876b399a99a15c0f.npy +04256520-23482a90a12a7052bd184e94aa5ce5e4.npy +03636649-445724eab48f591cd650d96de5aec623.npy +02691156-dd4da4309c12d47bc2c2c81e2232aa95.npy +03001627-4abbd2b632d3aeae4b3c42e318f3affc.npy +03001627-eadb3d38d02343ba4d2a756b9ed2c425.npy +03001627-cd547b0ff5cd668a86c701087a194026.npy +04379243-538cda9b8cfefa3f4854e924c443f593.npy +04379243-35b005d11a25b25581faebbdea6bd9be.npy +04530566-4869abf7743f09b71f29de30ec1bf6a3.npy +02828884-956be1b39e4bf1b963b2acb037dfbcde.npy +04256520-b02c25874494cd60f51f77a6d7299806.npy +02691156-12a1ac26d29ed1083554ccf8c30febe7.npy +02958343-6ddb807414fa23e0d9f8911ce020a037.npy +04379243-d5a374e8465fb8c2858699aaad4acee4.npy +03001627-321f8b85785f082685e443e0ea51d93.npy +04379243-d06b3f46fd5a901d4854921d37f7e048.npy +02871439-ae26bec5a79f51943da27ece6ae88fff.npy +04379243-8e7c894039ae2cfe99e8bf807e902261.npy +04530566-950ebca8ad7d94051fba2cab1ada6bf6.npy +03001627-33617cc89afcf169e6543556f230fe9c.npy +04379243-7b3b160dafe7e122d93768e7b9b1eabf.npy +04379243-27eea1054be1880a7eaeab1f0c9120b7.npy +02691156-f016679500a76fbd8badc4a9f1acc937.npy +03691459-f156e32edfe185b76ac6c4392c71284b.npy +03636649-ffc2479f27a1013afcec439ba0368db0.npy +04256520-5bd1a7825fd8c16c6eb9b08c8a74d159.npy +04256520-b2a9553d5d81060b36c9a52137c03278.npy +02933112-8d4833c24a4e983fcf004563556ddb36.npy +04379243-20812fc7f9dac9a51b3e6b75a323070.npy +04379243-1a53d35ef172a6febbaf0ab08a397b2.npy +04379243-9831a5ae9045c6f39155acfad44fdd03.npy +04379243-1cbd4d2be9cf0e3e84ef3d675a0511c0.npy +04379243-3eb80174aa72a62910126c0551113ce5.npy +04379243-7e651b7d860842deb612ac3ee32028ed.npy +04256520-8e2912b6699ea81c3db8e8b3ea723cce.npy +02958343-86aedfff061c5b96f500cc506a763c18.npy +04530566-1ce3bf4b1ee8c4b41542b16dedc43949.npy +02828884-ee8c43b1ffc8e8cd7389336cf5b6aec6.npy +03001627-51f4ea68be319fe8990e5087098e19c.npy +02691156-a98038807a61926abce962d6c4b37336.npy +03593526-e93934fc1da4635d5aa09a1176194412.npy +04256520-cde1943d3681d3dc4194871f9a6dae1d.npy +04468005-82d34870d2b5b59b5176b359c67b3356.npy +02691156-752d9a010346862551cfdb4c9f126c12.npy +02691156-7f3446564689ac918f69a600441c970.npy +03046257-37d5bae8c287486e93eb10cbaac91.npy +02808440-3efe1e2fc2ab4c0e4e58e1f374dbffd.npy +03001627-f68ecc9ec512915f36d8dd30a594b2af.npy +04379243-928ea87878a7bbe26cf876b69450cd4e.npy +03001627-53a1b68bb05d5b1bf51f77a6d7299806.npy +04379243-a80fd4790dfa2d226a4bc5d920331917.npy +04379243-dbf47e19a5f352e0f1b010366bb60ce8.npy +04554684-3e4b1aaca677501b91219aad82abc053.npy +02958343-d810d7f83632da71556235a31d374eb5.npy +03001627-978ab0578d8691ceeaf7fa9cda77a592.npy +04379243-f6c1a97812bd6ebd952c86497c2cd532.npy +02808440-10e41094453d1c6d4c62bee40dcdc539.npy +03001627-fae27953e0f0404ca99df2794ec76201.npy +02924116-5201d514f274012b52470de2774d6099.npy +04256520-cb7cee345d3e7f75593ebeeedbff73b.npy +04379243-60ef2830979fd08ec72d4ae978770752.npy +03691459-4e68ac6cecd91de23d91ae2b92426394.npy +04256520-9cff96bae9963ceab3c971099efd7fb9.npy +04379243-f026d1e8b71bd18e97f16d67bfc59c23.npy +04256520-2d1ebd7356968c0919fb4103277a6b93.npy +04530566-3f3bf820fa5d171bd45d4d5673b732bd.npy +03001627-4f0fc7761771d073fe2cac60a76c70a.npy +03636649-16db10b6ee500ef94b3c42e318f3affc.npy +04379243-7a702fc01ec83c36b93dc42f7dcef6a.npy +04256520-857c4d70af14d9d9e9b88e9734c4cd55.npy +02691156-afd02e6d4cf0a342c1ccec171a275967.npy +02828884-50184fbabd0ac41acb2a965e75be701c.npy +04530566-70b4666e2da7ca32cfea3d4fc15719ea.npy +03636649-41cc8b1669429bf92a7d46e74f08da70.npy +03046257-4e8d2c3317d397dfd1f82efe36dcc0.npy +04379243-4eaf30762a61db196cc318d65b897138.npy +03001627-9e14d77634cf619f174b6156db666192.npy +04379243-4e232b14eff92afb268cf362bf3a8d20.npy +04379243-5edf1990c995fcd7693e54627de491a9.npy +02958343-1a0bc9ab92c915167ae33d942430658c.npy +02808440-ab60eb30629849e96b448b8aaebb705c.npy +04379243-38bbdd91e895c0f92c0404a105e586.npy +04379243-d70877569d163235aece045e8bdac80f.npy +02992529-caa0cf3c7bf2cc4e50e8879f012090b1.npy +03001627-664eb477f8098678f1783a44a88d6274.npy +03636649-c2f6c7b7b39fb06fbd4bf7024dfa167d.npy +03046257-44316e91d4926a73fe9c9da4b1c78d03.npy +02933112-dd7e681525a458befbfd931924135513.npy +02691156-e4237061106f5df1dc82b8fee1057b30.npy +04256520-b55c43cbec762a54eaf14273fa406ffc.npy +04256520-ff5aa5eb5ed4041c1ef9727a7f361b49.npy +02933112-7f47c97fbda19b57490ad276cd2af3a4.npy +03761084-df5bd51614d2fbdef114be17e2e7c4b5.npy +04379243-5c63f336ce5ea7d621d1a69a8eeb6a01.npy +03467517-26e1801ea747f72f14fe0da28e4f8384.npy +02958343-6107486a14c40227665f0dfc9cc02b1.npy +04379243-758ab4ddc8fde77cb2b755acb296d925.npy +02958343-74b4d0c4ba72eba8473f10e6caaeca56.npy +04401088-eb61306048b7848c327b5f10f339d9f8.npy +04468005-713beb3434e30be68498191d94ca767a.npy +02691156-1f08b579e153b2de313f9af5275b7c70.npy +04379243-200e41f83af78ee240add2170313bb0.npy +04004475-83c3034992c6afbca0622b21d729afbc.npy +03691459-b00c5ddc2efe42eea64e5c46abb30c70.npy +04256520-7e4cb0c15959883242095a33119f8ea7.npy +02691156-a34a2fa46d7a0a6390b1d6deb98feec6.npy +02828884-15b3111c1611c2e5738e43095496b061.npy +03001627-a1ee33aadb4754a492d9da2668ec34c.npy +03001627-452d2a10ecc96b34129a4a365910676.npy +03001627-35d60ae4cb2e81979d9fad88e2f4c8ff.npy +02958343-c8d8089dade71547d2350421a9405ba.npy +04379243-5cb93ef515036277253e170a96a633c1.npy +02924116-899abc9a81424b5d73ba5c85a4ea149f.npy +02691156-384da5cd806c436b35039158de2eb4b1.npy +04090263-b34827c2da8ed1e32029d06c0cadaf74.npy +03636649-9b558be5e2b60e3eb09f0ca9c143fdfd.npy +03001627-e0a19f7c41d7489211fc2b865c2a185b.npy +02958343-431ca41fdf0897c628ccbb4eb8965b05.npy +03691459-6070b86ba88f51a52d48173107aeaaf8.npy +03001627-38bdba5f6455c5ff91663a74ccd2338.npy +04090263-fa35dafb0a24ed8b2511f68da65f4c4.npy +02992529-41d95e8979b8377d251f8cf5c284bd7e.npy +02691156-a7df65b30f1e6a3663d1bfc21cc05e4c.npy +04379243-66298b3f4d2dc69db6572d78be2f91d8.npy +02691156-329b62a63e882c7c71d03b466c72ce41.npy +02958343-7e7cc90bb7f265d2b3cf5236f651a8e6.npy +03642806-8b10449b4c25fb0939773ee5b5578e3.npy +04401088-87b696d3942f6845fe75c83a5776ab77.npy +02958343-9c06490e82e122093f599d94ae17ce2b.npy +03636649-9afc2aefd6b17db014038d588fd1342f.npy +04379243-3d6b55fe2deb2aa3a1c746794f191dc8.npy +03001627-2159af8011e13b81713decb1a0563b12.npy +03001627-e9592e2a4fc74bf0492d9da2668ec34c.npy +02818832-b1a03d41a681ed0220192a5319e3e2e4.npy +04379243-35cfc39065c4073f4b8710a3469971b1.npy +03001627-3b788994cd578990c35131da26f8061a.npy +04256520-252be483777007c22e7955415f58545.npy +02958343-8280b8d35355bbd56204845b7cb50f20.npy +04379243-66b43780a0e81cbf16a2b5862518c93.npy +03636649-110b426397c707bdc9c869210ebfd6b0.npy +03001627-7eabd19312bde1dc9335750905007562.npy +04256520-bc72ab493655beb5d329896bbf26eda9.npy +04090263-d747c1f677349e78803b54e9738b20a6.npy +02691156-8f4e31ee9912f54e77fd7318510b8627.npy +02924116-69e61d2ec68e8184b1626da45836ca54.npy +04530566-38b55fc61393e40653d45bb9e1743653.npy +02933112-4e89985989c6a1936aedbd2a02b96953.npy +02808440-78648b94a2402ca6904e03fa15bd73ec.npy +04530566-d35fc449232d68474163d08524f89006.npy +02933112-d6bd6fb5d0149227fa242b893d7c243a.npy +02828884-bdc3a9776cd0d69b26abe89c4547d5f1.npy +04379243-eee6cf14a56af26ad71f17d6e8238d04.npy +04379243-4bac1dcc5b39f3d1a4328b1daf5160d6.npy +03467517-81bb9fa998f58f2e4bfcfdb26b8cb2c3.npy +03691459-427edc7774b50232a789103b1a0f3e38.npy +04530566-a77c64b41bcc66bbca4b459ebb5d9bcb.npy +04090263-75066ff8b9740bcccb88c9db6e396994.npy +04379243-4f31d399c2c778135fceaa39a8353bde.npy +03636649-d2fc5882e1faa78c1592f292ab531da8.npy +03001627-d521a48317d0b14d7ac55d461d1984.npy +03046257-944ce52789d061a74d6ea0439e37ef4.npy +03001627-589cd6a1f4367fd834b707eb14b2a4a5.npy +03636649-96837f1ee184d9a4522f1ade738c024a.npy +04468005-e9d3f23adfd51c53125a6be5853df664.npy +04530566-2dbe5ea82a45443b71f3cc81eb6c076e.npy +02958343-f7b9529fb166ee56ac922d597da8f180.npy +04090263-7f219882b778b66c67fd32336d183e10.npy +03467517-b47dc8ec5f06cd414bd9729c64cda7af.npy +02691156-c6342ca5cf5c445cbd46d022fd7d80aa.npy +04379243-74fe5611d491a2b77b286d3c174c2040.npy +03001627-d5d4dfb9e6901b66a3f22b4b00de6dfb.npy +02958343-f37c7ab91bef514b4125854591376336.npy +04379243-e12ce317c2d9fd0eb9fb1fee7d937756.npy +03513137-93acbfac563ebc4c1d05dd90478fa7ec.npy +03691459-5c400c09175e3801bb3613d5601159a8.npy +04330267-b99428bafbeb30ae4f925e12806745af.npy +02828884-cd7689a92e0d39896812e49a5c99d0f3.npy +04379243-f4888967269031b295feea036c244c98.npy +04379243-e2807c8c5f5653d4bd91edd7a65c1323.npy +04379243-878872e3494e6b26baa48d60edc63ba4.npy +02992529-d37afdca0c48251044b992023e0d3ef0.npy +04379243-561cd495a38e22dfddbe8a6b8178038f.npy +04379243-86e6caacc1e4ddb5e762cf5917cef4ef.npy +03046257-388da8044b2de673b138d9e8fa5eed8f.npy +02691156-8b1b372c0ea200bd225a23c790f08fdd.npy +03642806-d88e4093a73064b6b44d9812f259e403.npy +03046257-89618f2292b3d05d48d189f942cedc62.npy +02691156-b6fb57668129c4cd4c11ffe5517eef5a.npy +03001627-4785c094e81a5f8e3002761e7a3ba3bd.npy +04256520-96055e2a648903bbaf2302630d34f30e.npy +03001627-5a4c550b1b41114c3d2617f9171b5ccb.npy +02828884-5d8f7c82a04943fed201085e80edb26a.npy +02828884-7ddf43b3b160ba10eee5b98d7c69f27.npy +03636649-b75ab10d1235158ed91ade1c391e4016.npy +02691156-a07446a1799bdea7afd477f714c68df9.npy +04379243-68b18bb0c7eee83129e4b5aa807bb4e7.npy +04379243-43ac9f2d108ebcd0c3bd24f986301745.npy +02933112-a1f901768250762d4f60f15da4c665d0.npy +03001627-1015e71a0d21b127de03ab2a27ba7531.npy +03001627-ec7076f7f37a6e124e234a6f5a66d6d3.npy +02828884-901872a92ecdfa4863b2acb037dfbcde.npy +04379243-41c538c37e2ade9047f446d318aa6c9e.npy +03593526-b1584e986a706101773b5d04f2ffad47.npy +04004475-b6fa2dd4812d69d90071898148dca0e.npy +03211117-8ef52dd9b307eebfa31cc7b61ec6561.npy +02924116-c9bc84079b8ab89acdbb9fcf2ed3a2ea.npy +04379243-f7449ab20f45bcbab1b6b0c5ddacb607.npy +04256520-aef57ed7044469ba25e322bb8575a360.npy +04256520-7598c48286a63854c02170c33e00ea64.npy +04379243-5f3f97d6854426cfb41eedea248a6d25.npy +02871439-d49f87c534c4e0b5b4979bfe197a8c89.npy +03211117-4731c3b756e3366958aeac7d536d442b.npy +03691459-1a9a6a214c957757cc6617fc407c9ed2.npy +03642806-9ef061efe37e9889d7c51311132e27a8.npy +03211117-9d51ab35cca6288da8b55d3e40d96c08.npy +02933112-49b69d5e4330ae2457b1c0b6d5084bcf.npy +04379243-ccf36a20b7ef3bd128071d61462a212d.npy +02691156-79351c8f83f5a3abb2d09bc8d348e46b.npy +03691459-632510d0916f31a184d6a2fa7259858c.npy +02992529-183e8d61b3c4edcc90b5b1d619d7013b.npy +03001627-539dd50ce4d5fd97febad4f49b26ec52.npy +03467517-c5d8ccd04236514966382ee33d7a02f1.npy +02828884-db4aeb6354f5bd0dd4d8765e3910f617.npy +02691156-d07277bc3c95a365bd46d022fd7d80aa.npy +04379243-3b6b823039a912023002761e7a3ba3bd.npy +02958343-4b7b3b54dc04df53c19f1e8ed99ac2fa.npy +04379243-6fd88eb1bc87efd6f51fa0238791f5dc.npy +03211117-e80b420abf6c590c3841abb8f4ea69aa.npy +03636649-2af318d179f969aecbde89e0c48a01bf.npy +03636649-b88c9a7aaab268fb42b08fbc749346d6.npy +02958343-982448cbcbe56bb78f89cf8d2f8a85b0.npy +04256520-cf47942a67cae94eab49dceef0d15b99.npy +03211117-45cae393b431f75e8873c005ead1ead8.npy +03001627-ee6f7e45be30b0a5b9b8611336bc3051.npy +04379243-599200313a698b6cad5067eac75a07f7.npy +03636649-e507bc77c03a1b3afcb8d8c6d4df8143.npy +02828884-634524d6d74142ecd2b12aa6a0f050b3.npy +04090263-15c7233e2e883eb55a443e4394e3a0da.npy +02958343-bacc3c08f58dd96152c6e8b4fe0351e5.npy +03636649-53846d2802f58f97c066b9622c005c53.npy +03211117-7e3d087ac72e46c2e53dd9bb27ba3c50.npy +04379243-3068bb896d8a43c040e6664f04cec8b2.npy +04401088-816aef1e285ab957b1c67c24f425bd0e.npy +02958343-8590a6c8270375e34b5a812ecf553410.npy +03691459-2335c268bbd05a5f230584014222e685.npy +03636649-d0fde1daedab10365240248232b90795.npy +03001627-3211fc4f31b15964aee892adc836ce83.npy +03001627-73cf718c453779fe346b7e70ad2e57d8.npy +03211117-15e411905cf8d7d455c2bf8f07989ec0.npy +02773838-93ca5243aa73b5de81157c9325bb0e45.npy +02828884-1809f6221774f1b62d309335a9a8acb8.npy +04401088-cf0dc63412541764cf9d394118de0d0.npy +04090263-232beffe2c94564b678808412fe4ac8c.npy +03211117-c12a485b4241be83b70b5d25a1334116.npy +02691156-bb91e932504e90ffcc14f1e6f4f4f49b.npy +04530566-4ac3edea6f7b3521cd71f832bc14be6f.npy +02958343-5c960f83d0eab69cc9463ecce7643e8e.npy +03593526-324c9045843b9470d29670d38a4c9e7e.npy +02876657-7b1fc86844257f8fa54fd40ef3a8dfd0.npy +04379243-1c57228e08cdd81ea375e397f0227097.npy +02691156-a69d6f9ea766b9d1a13079850f677b69.npy +03001627-57583ba714a883ce71c3cf047830ec1f.npy +03046257-93369b3e29648260490ad276cd2af3a4.npy +04256520-3420ef8b6b20595e1b7dbdf53d301715.npy +03046257-ea3eb7aa3da2eb2df5f02cba8695cd8c.npy +04468005-7218bcb64665858c3fd38f4cd285f64f.npy +03710193-2c3e7ec7a87e73d8285663b602a605b9.npy +04379243-713a4be770bb19b9586b2526565371c0.npy +04379243-fe167899fda76d1e88dcbe86402c7c15.npy +03001627-d095dd9f3dbf4083a7e870da1ab2a36d.npy +04530566-5a3924c1fb78bb908dea00b146cfa3de.npy +04401088-2b33c33ab4beb7493ce1b993153ccc0e.npy +04330267-8982176eef2ad23fcbf3dda885c64a76.npy +02958343-3ba5bce1b29f0be725f689444c7effe2.npy +03636649-163fb10d7f6f09fcf1c7a32d97b27a4f.npy +04530566-8e1778cdc0bfec3e18693dd92ffa710d.npy +03001627-77d48297d441c7f5bbc0e8a3b6521117.npy +03001627-40e5d8e71ee3902a31358207d42bcb21.npy +04379243-eca46f21f2893069c0a61ad1cf92b694.npy +03211117-a3ada0a8bc0d4b8392ababf87635e60c.npy +02958343-5a9a67bb92fbfca3b1bb46d2556ba67d.npy +03001627-4a89a789f817ab5414038d588fd1342f.npy +02828884-2a80c18fc2b4732bfb7c76304cb719f8.npy +02958343-9aaf299edeecc76e7dfb1ee6a4b12bf8.npy +03001627-31f5725faebb53aba1fb86e891f97aa.npy +04379243-b69722ee8e35829feb20d49510853b52.npy +02933112-9935a1e91ef08470569e2e0d2caa039.npy +03001627-f736f06f8fd04e1119fb4103277a6b93.npy +03001627-420ca6eac51267538a2d6a427829a3.npy +02691156-ed2aaca045fb1714cd4229f38ad0d015.npy +04379243-d656a6250fe0058fd810b14a81e12eca.npy +04530566-6d96d3f9f621292b7eabc15108a128c0.npy +04530566-8d5e3b659cf0df154327dc86b5ea9517.npy +04530566-18429e2495592e5580c2e60c312b0f09.npy +03046257-50acbb342934ddd8ef71ac379ee99590.npy +03046257-9331dc400e10a91c991e9693c5aca3.npy +04379243-f4f96a7c9b71fa9855b72fb3e8922a58.npy +02933112-1e18f136798cb3f0c59350d819542ec7.npy +04401088-29c5585362cf4aa5b4f6326696174df2.npy +03001627-43897195d7f893d759c257be4c612509.npy +02933112-1a4d4980bbe2dcf24da5feafe6f1c8fc.npy +04401088-2cbfb354e5dd731dfd6c7e3f0d9c56c1.npy +04401088-e840fab2f764532ce4bb3cae511f21f0.npy +03636649-1b35500ce44ae7e344b6d51c32a5873f.npy +04379243-5de0ca3516c01ffe71a782a4379556c7.npy +04256520-240b9fc8d34f3af17e20865350fdf369.npy +03001627-4aafa7600e0aacbf7b11ae648ea92233.npy +04379243-56f6e87023f0dcbceba48f396a34b9dc.npy +04256520-5f32acd6df675a414b3c42e318f3affc.npy +03001627-99867a25638b6809b91b871e750ca615.npy +03636649-cdbe11124dbf418167ac0fa90111fad0.npy +03593526-e1fb6357c91654b455f46d55537192b6.npy +04256520-11b544b22dedb59c654ea6737b0d3597.npy +04379243-39806e081bf3fe564ee8db28f96ad26b.npy +03001627-88aea5f475654e491d77ac5988aa9265.npy +02808440-73f3495f2c64c929ccd0340812259a39.npy +02933112-15de6a77af2b4fccc59350d819542ec7.npy +03636649-1e4fd4cc6fee7cb2fcb8d8c6d4df8143.npy +04330267-d63a5fa4070c41c87b0af550cd1619e2.npy +03642806-a17cf326705a6443a09a37cf78d1b866.npy +02691156-4470a28f2dd0cca9d9fba06863881b8d.npy +02992529-54f1cca754751ec14857f88b08630a42.npy +02933112-533ca24b72a0552c5057ad0f363d6ddd.npy +04530566-ece02b7fb2257df139bf01a73033939f.npy +04090263-196b2e3c66d59cb54a4f87aa9a31cd70.npy +03642806-e5d666a9b3aceaa2626c1b61fb70e077.npy +02933112-b7f1176767b87b235c8607e33463027e.npy +04379243-425544b66203da392ebeb1e6a8111f53.npy +03001627-2d701c588b3bbbc458c88d30f502a452.npy +02876657-c771267feb7ee16761d12ece735ab44.npy +04256520-c3f48348482f8c5df4ae8c93f4db5e6.npy +04379243-92b044e982b28fb02075b603cae7ba22.npy +04379243-1692563658149377630047043c6a0c50.npy +02808440-dacf794f991fc0173e9b7c3ab7636200.npy +02876657-950d6ca1d2b53ce52f71dfd07ef088cf.npy +02958343-c7205c6c657daed1ecabc5c9d5c21b7f.npy +02691156-9f7d4125c4b705208b96ae1a0a8b84ec.npy +04256520-588f01ccac8746e1122e20a0279089a2.npy +02946921-6a703fd2b09f50f347df6165146d5bbd.npy +04379243-77b57f3eebab844707cdefe012d0353.npy +03001627-39911f927331db1c8687ff9b0b4e4ac.npy +02876657-4185c4eb651bd7e03c752b66cc923fdb.npy +04379243-9502eecc3a057115b129901f80d24b7b.npy +03636649-e6f2e77940fbc85a8e2d66cbf6a91063.npy +04379243-5b0e8fdc7208b8d3cafef66236db7ef0.npy +04090263-3474d85a58796c7a935777dcb8deec2d.npy +02880940-5019f979a6a360963a5e6305a3a7adee.npy +04379243-8ad88ee4442fd0fd8a6ba7ebad3985bb.npy +03001627-4efc68a96296be2ac785f06f424b9d06.npy +02880940-8b90aa9f4418c75452dd9cc5bac31c96.npy +03001627-5142e809212f8c314500047017815f5f.npy +03001627-d021835e503e575b4f7a7f19de079d1c.npy +02924116-d9208f7caab22206e70da94675b5e3ad.npy +02876657-cf6843231592b29e2586fa0d0359af6.npy +03001627-3a98a93f381ff5fb4b3c42e318f3affc.npy +04256520-e2ea1cd546d6cb4b94db33559ec0df30.npy +03642806-3b2db36aaa2546b99c7c402f274622c.npy +03001627-8e212bac2103bd626c518c577d808035.npy +04379243-93d8e32a11a3502336b0f2a1430e993a.npy +04379243-b399584ed464f6f5d2bdf2c065ab29bf.npy +02958343-60066a5369f1354e631a23fef2ba638b.npy +04379243-1b273f4af777469e42fd31df8966a338.npy +02691156-fc9b408aee84f46d70c4138179d9ed97.npy +04401088-b984d7e958fe9eb961179e7ef17bf7b5.npy +03636649-913ff6452d0ea43c9d62807daf4a2134.npy +03211117-eaad54605e6dfee6d862787d0e1b892b.npy +03691459-79f5622b83f85cac207a7604d676d24c.npy +04379243-1c228bbb8c23ab9295ba6c11631d3b64.npy +02808440-3db87ff05c046a58d787d15d1d196768.npy +04090263-8527c531b4e23b85819b42f03f652dac.npy +02992529-6e30906a4d0854e9f31b75c4a94a8879.npy +03001627-8f9f59e023572749acdc3d668e7c804.npy +02808440-30518996c975c64bb0c867f4bb42a876.npy +04090263-91d9c29371eb5c091b7837f7a64e3031.npy +03211117-9ab58a92609d8f5030b540842bf7e90a.npy +02958343-58d9741ad324623e9872e22d6b8eb647.npy +02828884-a03c239b05374a837c8303a5f3977966.npy +02924116-cdc36ce4f0dda33641cefd10ce5d6cc0.npy +03691459-7ba65164444ed5be3df08ed7d70af1ee.npy +03636649-85e79f31c24f878cef3a2c64cef919d0.npy +02958343-e14338cbdf53c0ae3a0daf3e5400b95c.npy +04468005-c10daecd154c8dc476d9bf960443503e.npy +02992529-ff8676e76a0fd471fc115be4ff5cfb9e.npy +03710193-abc7c3f050deef2b4146a0f3be16b19d.npy +02691156-1b7ac690067010e26b7bd17e458d0dcb.npy +04256520-386b2caac16694edbab0cb5a4ccf2fb2.npy +02828884-1f19f93fc7d88529ad5067eac75a07f7.npy +02808440-24b2f2a1856df791bdb62d1caa529a98.npy +02691156-14453b29e139d81f6d07c55cf995503e.npy +04256520-92720933afa1dfdcb5c1550bc8448972.npy +02876657-371b604f78300e02d76ab6ff59fe7e10.npy +03001627-1b5ab441fb8e3b1b450621b513a975bb.npy +03790512-994dd337f39a32202f2c109faf1ee2c9.npy +04468005-8044d52df3c796861a5e2b71533354.npy +04379243-6818e317471cf5739a83764a2641fc5c.npy +02992529-229077bcc4f52356f582eaab37b1c177.npy +02958343-9f3c463272d13d39eb7780cdb3ece367.npy +03797390-bed29baf625ce9145b68309557f3a78c.npy +04379243-bdcd0c8384971f2a684b7bc3f8a9aa55.npy +03001627-e1e7e66978b888703f146f1fbd99cb1a.npy +04090263-4c31d19625e911e1f8edafa0d47e47db.npy +03001627-483d22dbbee32ee54e5c7d89bdfc49a3.npy +02933112-1f336c9e48f1b54686d53ab0fe94e911.npy +03001627-1ec5a88141aefca9cf6e4dd7ee69d71f.npy +03636649-b75464a7a5546b39e9ad5e44c87685c0.npy +03211117-36255c016e837e6c234c2f2e8f2fe6da.npy +03691459-9080b08716a2be41e47833b310955a9f.npy +03636649-f64e567b44e550c0fcb8d8c6d4df8143.npy +02958343-e28490350bdbdf679ad3ae277a5ccc98.npy +04379243-288aadc96e908b29cc156800563d212.npy +04379243-38cc604066d18d1cae685ca100c909e8.npy +02880940-d1addad5931dd337713f2e93cbeac35d.npy +04379243-1534dd45b3253cfd902c0a1a69e25bd9.npy +02818832-946bd5aeda453b38b3a454ed6a7199e2.npy +02958343-910ba017e13a2220473f10e6caaeca56.npy +04256520-5209919e8e113ce3e09a21c3ea84d95c.npy +04530566-d1f0353c7fa985c91915777d56cf77e0.npy +02828884-5b9261d3ab4192a4cacb7e48ba59c48a.npy +03797390-2852b888abae54b0e3523e99fd841f4.npy +03636649-707a1c16fe9ba4fa60a25ec0f32e89e3.npy +04090263-2cc92e68121301c4ef0c52e20895a77d.npy +04379243-290df469e3338a67c3bd24f986301745.npy +04379243-3d3e1b8e6f1cd412492d9da2668ec34c.npy +04379243-8ad9868947e7391113625562b56161f0.npy +03001627-d2304054a8dc7ea4febad4f49b26ec52.npy +03636649-d6a5a84cc689a2bd620365f6656fe3.npy +04090263-f5522cbc96faae02cfbc7d85a5791e93.npy +03001627-478074fa4b2b604b6c0c723d8da50cff.npy +03001627-d375dfbaf1a2a3316b2befe83a0efe39.npy +04256520-e0c9ef28aff6484e6eb9b08c8a74d159.npy +03046257-6d2f8c13005c05abedf0adca85d84acc.npy +02818832-9daa02ae72e74b3f6bb2e9a62ccd177a.npy +03001627-98ac0106ad244505e04fc3fcc1c852e0.npy +03001627-ced9c5eee916cce089c398a8a379054a.npy +02958343-6bfc2bf0e72a0f66f500cc506a763c18.npy +04379243-e004afd245bd06337e2a6b10ca75153d.npy +03691459-ea83b0bdf2b13bc89c0528265c614919.npy +04554684-1ffd145c196f19fba7ad9409a09b1a9.npy +03593526-ee425a7b654bcac8bbdc99ec57ef9c40.npy +03001627-b9a88078b22a4485fdef1c01cbd4ae0c.npy +03001627-2f42261a7f658407d12a1bc232f6622c.npy +03001627-b60eb72661b2e56f7445d25f394949d0.npy +04090263-edcbf89b4491941b9905a3939c890ad2.npy +04090263-4106793af469db6bf0fea2ee98610322.npy +03790512-ef8672840524f3dea5b5a4b3c46e79b8.npy +02828884-a775a66a362089fdcb2a965e75be701c.npy +02691156-acb398aa5605abe5a8cba409c4409ba9.npy +04379243-9d7e5e8279ed8a30f2fc41ded2e6c02d.npy +03636649-79487b518c97cac315b5ce4486462d3f.npy +02828884-c1973b3aeb0e54df653ac91111db738b.npy +02691156-6ed172205a9805b8dd9eb6c0ee8316a3.npy +02747177-77905cdb377b3c47cb2a965e75be701c.npy +03593526-f1ae9b2eb551ba466dc523ea4bf73f1c.npy +02828884-3ff4401d898b488a601104cd2d998272.npy +02933112-274b2b7de6654d7ce6619119a89ba92d.npy +02691156-64f01ada275ba83df1218670339368db.npy +04256520-bb2ed216b00409665634c21965ee6bab.npy +02958343-39e10c5d24fee4a6311f5d9a1681aa3b.npy +04379243-88c2cbe9552b1b0571870da176ba03be.npy +04256520-7430f611140fffb68101accd22c701b9.npy +04379243-9dd91ad8d34c249970521b3539fadd3f.npy +02954340-3b0a1a20ef0ce1a34c90f2ddc14dc59b.npy +03001627-94371ddd6d62f7b762ec387b772e9e1.npy +02958343-836c3205338292d3a696fea828ec5eef.npy +03636649-ef12cf5aba58871e5510d59f3ab1ed64.npy +02924116-a3915ede8eff71ee9d151674c6eace6c.npy +02691156-7ce599765d4c11fe87bf26680c510802.npy +03001627-7a783968f5b1f88ff50f16ba773dd73d.npy +02828884-758b78e2ad5dfdd1edecfa50e41e5c9b.npy +04090263-152f598b96676178519f927f2bf92da9.npy +03636649-ab8e7d9b77455a8550f4a93ce2060c65.npy +04379243-ed392c6bd0a25ecf5a7a4ee31b873edb.npy +02958343-fe6749c82c57137b28044fe9244db50a.npy +03211117-928c86eabc0be624c2bf2dcc31ba1713.npy +03636649-66defefd07a3fe4548eb521885c87e13.npy +02958343-42dae5b435c27851b11647ffa4306609.npy +04530566-b4a2778eb3f3dc55f877f04737ced5b5.npy +04090263-42288e57b2436e3512b38b1d99376c0b.npy +04090263-1632f8ce3254cfccc8c51c73cb7275ed.npy +04379243-1872afa831cc7f671b50574ebd76a45b.npy +03467517-b928ffa886500109e391f0d9f72fb31f.npy +04379243-eed2efed8f2d5604a0ab1d82ef09f78f.npy +03001627-2da97edb618f05a5b2ccd937df5da28f.npy +04090263-5d806f9cfdf29bc640eee76592e4bb9f.npy +02958343-1569406dfc3b7ecba9fe1734a6086750.npy +04379243-d1ef98cd329a71d1d8a323bf2c61bf7a.npy +03001627-d4f194efb445914e4b3d6a0fb5682cc4.npy +04401088-692ed312d9ba1663577cfcf36d9b3392.npy +03211117-4f46683ad627700edb09a997c699dabd.npy +03325088-c5de940102fa0cdb50da8b99982a3057.npy +04468005-b123bc34ca87b8f88be7c8c5fdb9bd6d.npy +02880940-571f294b5ab7e47a5517442d05421cb.npy +03001627-42df32ea024077732463600025db2266.npy +04468005-9f7f3ea75364f7e6dc14ba0818ee5cec.npy +02828884-3a6ac28f247a30146d812a3e2aa98a91.npy +02958343-dfc08488e2ec687d1c64dffb0265c4d6.npy +03001627-f5f18fccf9e16800dbd185de408ea209.npy +03001627-e4931ffa06d7b05cb04cb542e2c50eb4.npy +04379243-673540ea8227449d1dbe3e8cd87b5167.npy +04256520-5b27e06a178965c5300703f05f8ccc25.npy +04379243-cfe4e4fb603b99c77843fb4efdc19510.npy +03761084-5392b189a357dbd6e5f8c8c5a6f910d5.npy +03797390-e363fa24c824d20ca363b55cbd344baa.npy +04379243-38b341526f21cc9f6e1c16d8c5e127.npy +03211117-676e65417cd3d59f3aabc01aa1c5608b.npy +02958343-aaa54ba9345b6784967bf54a1f364120.npy +04379243-d3645a097a49042bbeab86a0a7f61a1.npy +02691156-ea29b3af190b00367d3b11085e75c7ad.npy +02691156-c7749c0a8b61f43bc9b9e28055202e3d.npy +04090263-257fdddbd7b231b15063ff48525b373c.npy +03001627-643cac07025f195750f9fc0e2c94dd76.npy +04090263-1ecdd9fb715c6fb2b0a59d0f63b741eb.npy +04379243-9feefc5eb43adb4fb7db0056a767efc7.npy +04004475-db9d02b583bdc8cec25c9cef92ff2800.npy +04379243-51c6a7298408c3f19730cb37c9a5f63b.npy +02924116-7e06d4b6e53773f2bb808872bdd72fe1.npy +04099429-8fe2fda28ffb637369bc13a8c13458a8.npy +03046257-b9d78c6a787d2097786e4057cea53718.npy +03001627-8a87ac1748519dde2fbee880b9f634b4.npy +04090263-a86e3d993f82d44018a76e4544dcc8a5.npy +03001627-12f4d8c20ef311d988dcbe86402c7c15.npy +04256520-5cea034b028af000c2843529921f9ad7.npy +02828884-6f607a06c0d86895ad5067eac75a07f7.npy +03636649-75cd24d6b485e9e01735ea0e092a805a.npy +04379243-4fb40a85a2989785d5abaf84513415a2.npy +02808440-dccb280354aefe171e7f704273b6f731.npy +04379243-c6116173a1cffecaec9ff818c66c8a16.npy +02828884-13da7d4d1277574c64b7b850ea7b68a.npy +03325088-233e131ca64c2fd5c36fb70296e45483.npy +02691156-a57802c776ba1b69e44b1dd0f956e84.npy +02691156-49660fd24e5c2fbab87697d3904b168b.npy +03691459-155b9ee29dd8f068f9872b1642da5de0.npy +03636649-8c5f6d5f0ad51f1a45c8b1285cb15c2c.npy +03642806-b29c691472ec9064f67542ac0a8b28d5.npy +02933112-1d973f05e870af4b4da5feafe6f1c8fc.npy +04256520-f43b6b571d66991f95ca4adb70946a21.npy +04379243-8e3fc5f1f8e9658ce8b2b8dc0c816caf.npy +04379243-2ca3dcbd06295835593ebeeedbff73b.npy +03001627-e8ef93ed45300501bfddc5b20c9212b4.npy +04379243-dcee2fa2aa02fa7c4a05fa063da00291.npy +03691459-71b68a5e64903e0a1ad88f716ea80910.npy +04530566-65be4fb7c78125eda52f887aa13ba9c2.npy +02691156-3881241b81d379644d4cb1c2a5e48b7a.npy +03001627-224775a0c7f8fec65780b8d333445e3e.npy +02691156-e66996d97d9f553939e75b12f2e5480.npy +02958343-e0a8ac5ece3222ea16abce8cb03e7794.npy +03790512-d9a4e331d1ade5277395d58407f193ba.npy +04379243-588b84631bead4d1c1fa182c22e95706.npy +03001627-50e8ca681532bf195fa5d73d8d08a44f.npy +04004475-3b43609493ce118dc580fdeb5460f6d6.npy +02958343-4e6131bad4ae8b6c91af0bf49336b8c6.npy +03691459-e1be0b02973011aa4c5341ee07f41676.npy +02691156-7a95a024f5616009ab21e26e992b2c94.npy +02924116-9c9946b6fbd1a5452fd6f371aed2b46c.npy +02924116-e48f8c869435225e47b1d09f6cc16a76.npy +03211117-8a7b80310c1d8d1b3d5369d27421e60.npy +02958343-8b22da6bba6c81452af3f274e91bb46f.npy +02880940-9024177b7ed352f45126f17934e17803.npy +03001627-4a12589099b05c51e13b3410f3683610.npy +04256520-fd33f7d4b8fcaef5d39e33fed94f56ef.npy +03001627-359b6d3d29b08dfe19fb4103277a6b93.npy +04530566-598f1f474f1cedcf33827bf0303796ff.npy +04256520-1878633a36518ffc19fb4103277a6b93.npy +04379243-5f8764573a6f8321c1a89c6b124f2475.npy +04379243-7610fa5f384cbfe2664b3b9b23ddfcbc.npy +03211117-a44dc3e6f574bcc942e76de3842fd93c.npy +02808440-4310dc866b24e314cd49a3bbe129f2e.npy +04379243-cf478aac2058cae0e589b08489d157d.npy +04401088-aabbfc7463d49368419fdfebc874eb8f.npy +04004475-b8f50a9cf77e8b16cb2d9ca9c84945ae.npy +03691459-7dd0a1aaaf29b18529d8eecf3827c486.npy +04379243-7fdad5057b8da165fa9f3ec600076f26.npy +03636649-783b81aa54a69a26d42b9650f19dd425.npy +04379243-61fe7cce3cc4b7f2f1783a44a88d6274.npy +03636649-c3d57dada3819e60fbaaaf5884f2c88f.npy +02924116-d254d5e10bae194acbe05d30721721b7.npy +02958343-7337679ad4bb8f4016abce8cb03e7794.npy +04401088-d7ed913a3888696d289b03e5721252f3.npy +02691156-f1f12c4408b0b4ee445d150719ce97db.npy +02933112-158134028cc664b5c59350d819542ec7.npy +03001627-2499541ace317cbb8cb5d9909aeb1309.npy +03325088-c8f05f1ff6b10463b55b46d261fe0021.npy +04379243-fb6cfd7064a88468a9ae1099ff133d95.npy +02691156-46c07706f1bd10fcf9cf2c77edbc841c.npy +03710193-655cc66caed0a4759c0d8b17a41b6f3.npy +03001627-58bd152fb816ad2f7f91c3974257b780.npy +02933112-b7be75d3cb83457a44221bef0fa3c36b.npy +02828884-106494f75125eea6adf66a6d73888234.npy +03211117-5c16184e52d1317f5c188551f03b75de.npy +04379243-2f106667589a6cedc36874c8749f7812.npy +02691156-879ebdd198cf4aa58f6810e1a2b6aa04.npy +02871439-1db2ec3f8086669b955c7f158b9debb4.npy +03790512-ed0d6ea5407e542d31ef331a356b2886.npy +04530566-a45cbcfb2763423a6540eb087d7e15bd.npy +04401088-c556efeb2bb3df4621844676433a0aca.npy +03046257-66922901b74190cf7c70545e85230d83.npy +04256520-82d25519070e3d5d6f1ad7def14e2855.npy +02958343-7edb40d76dff7455c2ff7551a4114669.npy +02691156-de3a0bb3f0ca87a5674fc9582804ad0a.npy +02958343-5fe9cca902d8135aa36fba949f601317.npy +03513137-4730ce6da5433f3bd93d030573255054.npy +02828884-1348e440934494f581faebbdea6bd9be.npy +02828884-373ae08d8903dc10ba929f7d2edd1706.npy +03001627-ff2deccbef73ff5a349bb1cbbf9a4206.npy +02958343-76680f2bc0d53c6e3112e33afb0a091c.npy +03001627-12f395270a3316d01666e1246e760f82.npy +04379243-89fa346209ccdd0f16626db88aecf64.npy +04256520-51dd0bece7876a8744fe3ba945082ada.npy +04379243-f70df4cd7109fedb4824068fb42a2b57.npy +03938244-49cfb88c1291a152fd5b65552e5580b6.npy +02691156-8c851663113c3f6790baeef8ba5b93e5.npy +04090263-eb71e9847932ddda558fc0121b183f15.npy +04530566-f60404b62c44fd3b49f0e3dd7767881.npy +02958343-6f61af12304781b1297cfecdd0d5b071.npy +02958343-dee83e7ab66cd504d88da0963249578d.npy +04256520-627819d2ea8ab9d9c97e4283c3b75587.npy +04256520-f178d79c569c05d47edb0bede88c064d.npy +02924116-98568658cc2f000719e7223d2775d9c.npy +04256520-4a7db7357b6b6249492d9da2668ec34c.npy +04530566-176cea94ab59ce9949f0e3dd7767881.npy +02924116-82fcd4e8b161f07455653b4d8cecd79.npy +03325088-aba8b03696508ce65072198ae7ea0be2.npy +04379243-d08a421a6362b4bcb000f20a5153622c.npy +02933112-77aff49eccafcf2726831803d0b48347.npy +03001627-d2a5b42cf29b753f71a782a4379556c7.npy +02958343-82b9ce9740bfd28fe9fab7ec4b8a907e.npy +02933112-6686c3a7dc39cb59d2f1945599cd5176.npy +03001627-3dc8243b17bc790620768660cf080d12.npy +02691156-d438a4539d8068fd44601c64497858af.npy +02691156-bb9ba5deec9e2a5fca8607f540cc62ba.npy +02691156-6f96857e279a38793525b6164e3f382b.npy +04379243-39adf6058de74934ba18ade30e563d37.npy +04379243-2e23b1aa756399ea1138d031cf239f4b.npy +02808440-cd23523044b34cb29a461ceb2370bcba.npy +04090263-83a6f7a02470263ce71e857afa9df271.npy +04379243-fe5be6c8f1599697c3bd24f986301745.npy +03001627-3c1dc5c4b0c8db31d20c5daab0fdbf5e.npy +03001627-31bc7f782eb3bd7de40a8ba0cba661fd.npy +02933112-2f87d7d3c522f07b297936c81e7f6629.npy +02773838-5161d9adede671d6edc32c5c9ec9f827.npy +04530566-9b93b845578ee8a20c10ff7bcef26d.npy +02691156-82a2a1830758bacba389345bd31e2871.npy +03001627-d29c14f180ce319f71271c0017c27c86.npy +04090263-378c3f18cf130bace1f2a1daf140ac9f.npy +03325088-c34723e92771fc5b7a867e9b35a1295.npy +02924116-366e45c0ffa4f059f5faeb3213703480.npy +04256520-8d0d0661c57bdd09b6cfb56a0ae182ff.npy +02691156-a487d7527a0d0c2076b0a025d05432d.npy +04401088-a8bab81f66ac5d26acdce172dc618222.npy +02691156-c3600f9ede30352a663e90eaf6b4ca52.npy +02691156-229c164fe2c80acc1ca2e8373597f711.npy +04379243-99fede796e56b4b220eb25a3a058bd49.npy +03636649-6b2a590446ad5794b10e111f2d30684d.npy +03636649-85f1532468f57b13fb26684cf995edaa.npy +04256520-e03147a11bd7c10e3d23022ce06f940d.npy +04256520-1a38407b3036795d19fb4103277a6b93.npy +04099429-a410b9d1557f0bcad6a1861443498ca3.npy +03001627-e50f1b2d0835bb392764cfba57a5de73.npy +03001627-1b3c286bce219ddb7135fc51795b4038.npy +03001627-5aa3f60fb8fc208d488fd132b74d6f8d.npy +04379243-1eaad686e6b766597ff6ace05b36a5.npy +04379243-d38a9d0fd304f3eeb6e024121d412dd.npy +03636649-3edde0735bdd2aeec8bd09a8ecef3d42.npy +03211117-bf5a771386075e449b3250464ea24783.npy +02933112-ba5e1671d26af2763c6c38b12db4d8f3.npy +03001627-374b3757a04c6ab6b9569033586af233.npy +02958343-96c84869cb3c6657e49167a1ad5be1be.npy +03636649-cdf8043d57863c1b17b431cae0dd70ed.npy +03691459-29b26d5aeae88531574d21c0c95092f.npy +02691156-5d7c2f1b6ed0d02aa4684be4f9cb3c1d.npy +03001627-47ad261baf9609ffc27c29012942420f.npy +02958343-7c46bfff2f90f11044592db9be5db5c8.npy +02924116-54f3b48cf9c7ed13a3cfa46226644b04.npy +04090263-5b70d54d7f40fd8e5c413e9fcbe8ea71.npy +02958343-1768f55a3c29cd483337cb9d908ce86e.npy +03467517-5b6306025152e03a59a6208793b9dfca.npy +04256520-581808bf8d8e1d2448eb521885c87e13.npy +02691156-91948fbd89e316b9a1efa53c1b6b3c23.npy +02828884-c33b2dc4fca8fd178cca710901c2e97b.npy +04379243-222c56ff9cddbaf4139eb23f7c8036f.npy +02958343-b6525d69681e4f56813498cc26c2aee.npy +04379243-54dba548def577137f14c8d2897662a6.npy +02747177-62f4ed6e1df63042cecaed25e0da0964.npy +02691156-93da50dbee3d1f78a7d0c1e4eb8db7dc.npy +02933112-62e1a04718635c981c7fe5be55ca5cfd.npy +04090263-c9e48e2db6786fb7c90b07f90175a30e.npy +02747177-d3b69f01f5f02240ad5067eac75a07f7.npy +04090263-513ba432b16287f5baf4b37340b9dde.npy +02958343-9009d75263e350ffb3b0f00a15b90e0a.npy +02747177-8b071aca0c2cc07c81faebbdea6bd9be.npy +03790512-e38201d0af98e566ba85a673915bd3d.npy +03636649-389653b54a3b5d3cd73bf61f46c61ea3.npy +04379243-f40c11ff508e477d55f46d55537192b6.npy +04379243-8e358c6f92a0624219fb4103277a6b93.npy +02691156-be96646f774c7d0e2a23d93958262ccc.npy +02946921-6b2c6961ad0891936193d9e76bb15876.npy +03642806-4a715660d89e097664c908bd136dd7c0.npy +03211117-48c17189e6c58d619f4c3c326d704746.npy +04401088-a56fa90572f9e23db30cf593b4a23b0d.npy +02691156-f562ff06e51e573e42979ff355194f16.npy +04379243-e79e55e6e08245c8dd34b2617efa7e35.npy +02958343-25f9e0e65b8fae1f9916e41a3ca14d3a.npy +04379243-af592a064d5a83989ccce4c6d5bb195f.npy +02958343-24819ffdc34b28efe4bee94a37836d67.npy +02992529-e840fab2f764532ce4bb3cae511f21f0.npy +02924116-68d05210e6e4d4b4cfcd1fbe1cf0ecec.npy +04468005-6df2dec0dfa5731ebbdb7391763a8729.npy +02958343-1fde8f41c6a39c07111f983eb293b51a.npy +04530566-47c53f9cfdd4addfe054bb56e3407f7b.npy +04530566-9ea697394812ce328b68234f52d97099.npy +04379243-a377ae927e09bbe976e9713f57a5fcb6.npy +02691156-ea9eece7f2c45a2a82e4c37374fbdce.npy +03001627-33fcb31af4c4d039fac1db559484b15b.npy +03211117-d6752674a181d04829c956de83176829.npy +04379243-ad3e2d3cf9c03fb1c045ebb62fca20c6.npy +02933112-6a36134591ec32cd37c7771ad8a91690.npy +04379243-cd01fd75885d9f606ce1f91756352daf.npy +04090263-e9adfa95465f806b056c98b2e5e5e4e.npy +04379243-33486ab58b77ea46768449c155e32d73.npy +04090263-aedd534b9f323b2f9f433921788191f3.npy +03001627-8be5b3b2c8c8f067a341228b21d337a9.npy +02691156-9d3eb87e69fba56890b1d6deb98feec6.npy +03001627-719f6578bd1450cfe5b7031248b81d78.npy +03001627-68151e7a9fcd8545851e82fe58f53ce1.npy +02828884-18d0aff1a5eb486ae2be3aed8abfbbaf.npy +04090263-b519a23d82f367ffd39cbbc2eb28bad4.npy +03211117-2608db8ae887c6e0b996b003c2af3823.npy +02691156-2a906a12b740afe2fe93207afde39a32.npy +03211117-fe3e7a35b8a1c06d3bb4a1304fe504d3.npy +04379243-c838d6a451994749310af74324aae27f.npy +04090263-1533494d4139062e9f433921788191f3.npy +02747177-2f79bca58f58a3ead2b12aa6a0f050b3.npy +03001627-94e5d7fb2ff59ff98a94168388287ad5.npy +04256520-fdfcfc4e9daa45306aea2f18ee404fd5.npy +02828884-92f1fa8d3b5da497ad5067eac75a07f7.npy +04379243-23437993281f7e1fb06ed3dfa60b19a1.npy +02958343-d6def3a1a90ff22bbecf71e2e014ff6f.npy +03691459-92039123d08d8ad6adbfb30d8d1b297e.npy +02828884-504ad0bf35b2004dd2b12aa6a0f050b3.npy +02958343-3aa2614f69105d0f31780fdd33037c9d.npy +04379243-5403184c2b01e0dae4061112aefd200c.npy +03691459-a18c311eba5e551d20363e2561dd589a.npy +04090263-9280249d5e91334f0864f9e40a51390.npy +03325088-ddebdd166c4562e7c36fb70296e45483.npy +04530566-5af5aa92ba49930c3f41ddf3713a131.npy +02958343-198dfa16ba9f5f6617e76f36a4eac3ec.npy +02958343-dbded0816afdfcf776ad064d1c5fdd7c.npy +04379243-1b78b8e14a21439afab04609f4609e83.npy +03046257-45234ad309a071d0ce256d7e95c7a4ed.npy +02958343-c9b49f7b355528e5632dc979097a3ec0.npy +03636649-e6dae18d7ffbb7ff952c851f81463faa.npy +03636649-74df8c15024e81f79f1a71e46bbde97c.npy +04379243-2a0eff86efdf60a89a682a6d0e92c30.npy +04256520-770b9528c04f99d5a3bafec3b56382db.npy +03001627-3bd437d38068f4a61f285be552b78f9a.npy +03001627-dfd7e14d25b81c1db5d9b03636b8bad3.npy +04379243-9ba82ad65b1e90a1f51fa0238791f5dc.npy +02808440-1036dbcbbd36fbf385d4c5933ce331fd.npy +04256520-6051f687d35c6ba577dfa90ae0b0a3ed.npy +02801938-caefb14d743df2d69c3870d54ab64b77.npy +04256520-5ea73e05bb96272b444ac0ff78e79b7.npy +02747177-156fe84679171501f155d75bbf62b80.npy +03691459-2a32fbf104a7524ec78a85a5b5306f41.npy +03593526-acf2697f5c1cfe9b89035c25f0dfeb63.npy +04090263-981d2bf1b1b028e46b1aa8d90854daa1.npy +04090263-866fc73e306a47a1f246f64ee1a24a70.npy +03001627-d90e76683d11f75fde11596dfa0db02e.npy +02828884-ae6e6210e0280f24ad5067eac75a07f7.npy +02691156-d2412f19d33572dc4c3a35cee92bb95b.npy +03325088-3ab88b710b8ad3ee3321831d2245cf06.npy +03001627-20b36bbb42d36e0771dcb8deedb6c8d.npy +03001627-2a643eaf143a779f7eeca6709b6a824e.npy +03001627-91534e0a3b0aea7526fc87e2982c8a2b.npy +04379243-7953711de0134028ee18bc48b60b36b7.npy +04530566-ace32fcd2b6c3fd081e9f45621d2c8eb.npy +04401088-30d54e046b9abe8bf1cb19f636b1c2bd.npy +04379243-81094bd607e33c1e0c5923879d79f21.npy +02691156-67da7044f5bee4f65c6d168c6e7f59dc.npy +03001627-4450887b9a8867e6d9b53420a5458c53.npy +04090263-c57c4311f1f23690603b56d612737c9c.npy +03211117-d3f9fc10276d8922f7248d9dbed7a7b8.npy +03513137-d739548a9b15c18cfac6099f3d4830fe.npy +04330267-f8bda034dabaae9c9d2947b7231ac529.npy +02691156-d3856a35d1fb8536d8e727806889c9b0.npy +04090263-c0ac896c514cd91428a27232df2537e4.npy +02691156-bc764c59e4bf4e9f508cfa5a106b05fe.npy +02876657-20b7adb178ea2c71d8892a9c05c4aa0e.npy +03691459-d35894de19f2ac5af6ab94ce02a994c4.npy +04468005-d9a4a8423457bd92bd127c2230a8477.npy +03593526-f47da3a419cdf600e01d7dc978602402.npy +04256520-dd370ef3f3e8097abb9760cf9cd1a953.npy +03691459-f0629a8139a9ba04f398d0c5832df00e.npy +04379243-11cdaf2939502622815a10e5a35009c9.npy +02958343-7d099ac5bcc09250e61b9ff60b1be412.npy +03046257-d2cd542928c5b684c98f75a9ff83e3b7.npy +04379243-88676c2f87a5b54c4500047017815f5f.npy +03001627-4ce5a0d60fc942f2e595afbdc333be49.npy +03467517-5446e1b00632ba2186f9feebc35c79bb.npy +04379243-61c279a6f178a43c5f48f9175316bec.npy +02828884-2f2fb3e4f0d9c4fe9f8ae7ed6368949c.npy +03325088-ea8d250e3363377c36fb70296e45483.npy +02691156-551e8582c195944af1b991541832fbf8.npy +04379243-490eb3a23cd0ec4e9ccce4c6d5bb195f.npy +02691156-ffdaed95c3063cdf3ce4891c7dcdfb1c.npy +04256520-e92955e3e3ee33f32650883217a11488.npy +04090263-4cb322a9a37e3a4d1c1943a82a09125f.npy +04256520-4424a906da6fd4c961bf0ba277ea473b.npy +03797390-44f9c4e1ea3532b8d7b20fded0142d7a.npy +02773838-72dd1dca3421f63576bb31db0358e9c6.npy +03636649-6aa1ce4e245001589f1a71e46bbde97c.npy +02933112-9ba333215be4d6654c62bee40dcdc539.npy +03046257-220d4bef77a82fb164c33a5741e8e076.npy +04256520-5b23328fa6d5382d295b24579cf55b8.npy +03046257-854ce0d6ed37103248e2701b91d7249c.npy +02691156-83e4e523003294ab9a6e43b878d5b335.npy +04090263-34e8142e7b3cb229d735fa1ab17311ec.npy +02691156-b5cdecafe353e18ac1006ed55bc1a3fc.npy +04256520-c04dff28e5b5a2e5c283ca2c9df7372d.npy +02691156-46a1b199bd63c0b4505ae8d422ba349d.npy +04256520-ad274aa281d74c7d78e2b63e72b94e04.npy +03593526-bf2106de86fcdb3c9f695af5ccc7d06f.npy +03211117-26b26a5c4a8fad9e57145c11333eb62a.npy +04090263-a11f9df8336fd83e5cd09b5ae4a3c552.npy +02808440-848124bf8497ee436bb6bc0db07c71e8.npy +03001627-249f3eb6a7236ff7593ebeeedbff73b.npy +03691459-dc73b4f97b493d18176ac8585fbd7fcc.npy +04090263-daf8f85c017aa8c3e1f2a1daf140ac9f.npy +02747177-85d8a1ad55fa646878725384d6baf445.npy +03467517-1edaab172fcc23ab5238dc5d98b43ffd.npy +03211117-aa2f94416852aaccc60dad40a0c0e85b.npy +02876657-cc48fe97a95e8716ccaa5ad584801c3e.npy +03636649-bc704db7b62582e5d1cbf3e52b9b6237.npy +02924116-7b68c55d0cf319a6cd801adac9ea724e.npy +04379243-a2418ff066f38084ead6784d11c8f5b5.npy +03759954-2f65b3f9a1ed10c099bbfaf5793d01a.npy +03001627-1db766ad516a6993f4b6538438a0b930.npy +03001627-73f9aa75944ecf0b9debdd405104de8c.npy +02691156-e7158ecb09050b03873ec74c119307b9.npy +02924116-729f939672b218c26d09993d87837d01.npy +02801938-ac36b5a7ebeaf8fc317c35ada68f2189.npy +04379243-68f72d87a2f94e0c8f58b2a82381f0a1.npy +03001627-7ee5785d8695cf0ee7c7920f6a65a54d.npy +03001627-260768554aa1a64f2180a9964be89fad.npy +02933112-9572162eb971e75dc7cb20726c4d6c81.npy +02933112-eea67da61b5477c7d4c6910fb477cd67.npy +04256520-4ac96465d859ecc647826489152a0c30.npy +04256520-c3c5818cbe6d0903822a33e080d0e71c.npy +04379243-ca9bcd3ecad18d8fb4c161851ed2b4e4.npy +02958343-3ed487192c098a36811090af72684c2a.npy +04401088-49ce3fc723ee4b362d43b5caea00b490.npy +04256520-c1950e8c9869a7aa8dd711af5650bdcf.npy +04090263-eb1655ade2554c156e49a9db8e76daf1.npy +03325088-6c692c34625914a64cc3b7bdfa613934.npy +04379243-c1d99397e37782c0a8699b6183baa203.npy +04379243-f995c1239510cf8b5d009c98a5b96836.npy +04379243-2ec13bb2c3d06c0543dbb6421d614c0d.npy +03001627-68d41388f8a62fce19abd93be2967664.npy +04379243-647692d3858790a1f1783a44a88d6274.npy +02828884-2fec2d7fdd169e28bb90acb1046227f8.npy +04090263-b7a8d379fa29b41adfb4916f5d51df47.npy +04379243-7c653a77d59fbfbd84d52b3f4a5fb1fb.npy +03691459-1071f82bd0d6a23935cd53a06b1d2317.npy +04530566-9bb4fa1026322f0f3e39f2e17005efc.npy +03211117-4407eac60124e17789e75af9d2c4ee4b.npy +02992529-89019c955310bc56eeb3fafe1bc8c07d.npy +03636649-e993492372fce761cb3a30f2c37c38a6.npy +02933112-740392e1c6522664c20c4293bea04a44.npy +02933112-4f168576511489f91439869d172d3897.npy +04530566-e2ee62e09af461498d84ac376021f1.npy +04090263-aa724e9dd919edc3fef144202cb2b935.npy +03593526-23e0d277a58fba0abced73c51e99f8b2.npy +04530566-5d48d75153eb221b476c772fd813166d.npy +02958343-f8ccef3ebeaac7c0539e4d34a3035bd8.npy +02958343-f9f50e199b706caaa148ed368ea0303.npy +04099429-23ac907063ffc5de3df4fa4547276fc2.npy +03001627-5a60c649a221293d72ed554eb3baedcc.npy +03211117-a5939f4fbe1009687f2411014f221968.npy +04379243-6f92486fa7a1aea221ab9b8a0e862145.npy +04379243-2ce9bdf770b06e3745a4a35cfc2e42d2.npy +04379243-1cbd8a3d7208cd6b8990d2712ce4d993.npy +02933112-373fc669fbead0bd1f8d8332ee17945a.npy +03636649-5c7965b0835a1a241de9bf5a9c22fde.npy +03691459-c5b38593b74c39695f7109466a688ac.npy +03325088-ed88b271bff935dc4bbbee4015534b3.npy +03001627-bdfc3a43eccaac7e908cb3a44391b80.npy +04379243-82f1ed2a66bf8b49f08a713d0c983d8d.npy +04090263-da6a91e6557973ba78dd5400499d0e7a.npy +02924116-31d34e11e37ad640c6bf3b18b8ca71a.npy +02828884-e0f7a559a6066203dacc0b57c47fa747.npy +03001627-44aed693950b077d4f9691cdd5f8749.npy +04379243-8b963c7f5f091b3c98100807afd99d94.npy +03001627-ce2982a9b05fef738a075f7da2b32df.npy +02958343-7de59e150d4712b7b3cf5236f651a8e6.npy +03642806-9980e8f99eb0098bc6b48dee64de8434.npy +03001627-bcced2f12f206a927eaeab1f0c9120b7.npy +02924116-de8c870859f57c4752470de2774d6099.npy +03467517-6e65c6b79bd8df3184ce60b118ccc0b3.npy +02933112-82c05fe4890a7f5112de5317fe5b354f.npy +04379243-acd6ba50b3081e5cd3470f853139ec0c.npy +04379243-dde92f6460b1d7b2b4cb6dc412eb15ce.npy +03325088-412ac477ee9e761250da8b99982a3057.npy +02992529-3bc6f902628b3f7f85f6153ed2033a1c.npy +03337140-69080f3e82b012ae2590dcdc900ce405.npy +03593526-85b34acd44a557ae21072d05c97a5e0a.npy +02828884-cc08d4ced5931ed181faebbdea6bd9be.npy +04090263-cbcc80e6964f1080b2d09bc8d348e46b.npy +02958343-cd3db50308c852a02630fc4a206fe3d7.npy +02958343-6d083701a45fd0721ccbd9e5bb82dd04.npy +04379243-97e4bfc6f8d2e2fb986b72a93898270f.npy +03001627-7a5d539e3771a491ca6a405498436716.npy +04256520-52d307203aefd6bf366971e8a2cdf120.npy +02691156-7d180493022c01daace5721ccacba16.npy +03001627-515f8729b20cb3612412319d111a4961.npy +02992529-5bbf52512a45bddb7525dc2f981e5489.npy +03001627-468b7e16a29ce746bd08524bcb66a009.npy +04530566-1e8c9dd30d54392856d301bf1319ad4.npy +04379243-1bd49921fac3e815c3bd24f986301745.npy +03636649-1f58b59a1b6b06df766fc93a239bada0.npy +03261776-b26bc64c51736aa7eadbd0a9373027b4.npy +02808440-303b0d2566846f373c8d0fdfb1cc2535.npy +02691156-2502fffc569075b152486b4487d562c1.npy +03325088-5b0049fff25483854e0738735f157c3.npy +04256520-3897ad42f73988a62406c215cad9df09.npy +04379243-875f7a7c2d69b01a30bbd4cddd04c77b.npy +02958343-4c2c33070c6597ca9004afc0d5dfd164.npy +04090263-60ac11a84e307db07c52b7b7b148ce27.npy +04401088-fa9b007a326be6975c8fa950032e0987.npy +04256520-f2ad41a5ffb961c4276813f95a6b7283.npy +03001627-25957008f839ef647abe6643657b8aec.npy +04090263-10e60e0eb0d7915c8de11d571206924.npy +03001627-9e0a1e2857b13b5853353c404519f02f.npy +02828884-3830a5b2eec789ac63b2acb037dfbcde.npy +03001627-d5b9579151041cbd9b9f2eb77f5e247e.npy +04090263-235853d2947a90e65e9786b1603f45c8.npy +04379243-4068a0e8533230e4ed8cfda52671df0b.npy +03691459-c6480c816679773dde4fca22b4a322f6.npy +02933112-c8631f63ec5899a4a84a884e8267301c.npy +04379243-ce8ec2504676cf874b3c42e318f3affc.npy +04379243-2d1fef407ec41165700ade95b2f08044.npy +04256520-ace76562ee9d7c3a913c66b05d18ae8.npy +03001627-ebf8166bacd6759399513f98ce033426.npy +02958343-34762df3ff8961188bb11dbc05ffaa74.npy +03001627-cd7674dec40cb30f30e06a011e63236a.npy +04379243-99316252e1dfbde1d810b14a81e12eca.npy +03001627-8b886cf32f340c89a9e00c019d029152.npy +04530566-b9d541ece25778e12783b84b5d2d6e46.npy +04379243-2d27e4d0f8cc2c9cf577ff4de1ac394c.npy +02933112-2e4184763139ff274da5feafe6f1c8fc.npy +02808440-2677d8c3f8be424a6575a854c6bafe.npy +02828884-2f8bf1c9a8f70cb0f4fb4dee5181bee.npy +03001627-fb633f298fd5a44a9a8ef44e1d2c5b75.npy +04379243-af8d3848b96bbd0d18821e110fa8400d.npy +04379243-4c2103f096818e16ca368f1abf470106.npy +02924116-68a2211cb0d8c16a9afb67dd284d342.npy +03642806-d4a1b5ef035650a51021cd55d164c0ed.npy +04256520-6d7972e468db59a6613f0dbd986ed6f8.npy +02992529-f5f1fbeca9af99c98efee9b82d757c0b.npy +03636649-15fc5a4a342c00525412c66cb6f267da.npy +04379243-d80a4629ab6badc16469e58b3534356e.npy +03001627-4abbf49c3177b32c9f613b70ec8c2f82.npy +04256520-63fe6b5903df38a0ba0f037fee399b18.npy +02828884-9e429b7f77646b4ccc8f8e7f17e9d7b6.npy +04090263-c29bc7b0dcdbc2b9e1f2a1daf140ac9f.npy +04530566-587cc1fc65ac4991ff920fdb73e92549.npy +04379243-14d1d6227d6e111049afcf135d820991.npy +02691156-f50eba69a3be1a1e536cfc00d8c31ac5.npy +04379243-7d1fb46a27bd93252c4683dd00deec1.npy +03001627-51670c355ece91abe24f4cc9bc86052a.npy +04090263-e4a10d825ba51a1fc648677bc9b1d6ad.npy +03001627-d374912c3a9fca96c141a04b2a487fd9.npy +04256520-6caf860b216a951edd97e8e261a01f65.npy +02828884-b54d0fbc33d125bb7a6d149f6c9151a9.npy +02691156-df7313e87ef2905d37678474be485ca.npy +04468005-8cd345e5980cb800c3bf8b7b051cba6f.npy +03001627-59f7e527386ab08b7f0751100c225ea1.npy +02691156-3cd1b98f12d2a22bf3ad4b0977199f23.npy +04379243-a00017528f02804e85c2318bffd77ab.npy +02691156-25864172dcde70c6ace5721ccacba16.npy +03001627-f59627a077dcc2566c63b8b48495261a.npy +02924116-1016074a78aa410cc1c19bf4f4f5ddb2.npy +02958343-c23a65ae787245248580e2c19c4f9aaf.npy +04090263-faffd9098e488836fb6bde4b7e6c6613.npy +03001627-1b92525f3945f486fe24b6f1cb4a9319.npy +03636649-d90639e69c82f864eb2d9895648d1206.npy +03691459-cf7a2cb0c487f3a0bd1cba733b111584.npy +02958343-52abca690cceb7c634a65e2e5c663c7e.npy +04401088-585f02091286a7a82b7045644a6897b2.npy +02958343-2e37013195d95f494470fce578e2b84c.npy +04090263-461cf03b41be093d9ee71f8982c8aa68.npy +03337140-de98cdf56188a576731d11154716a6b8.npy +02880940-e3d4d57aea714a88669ff09d7001bab6.npy +03001627-5008d5e0ddf1b3dfa37d17ad9e86b6bb.npy +02958343-9aec89a595e4682fbc5845a373118df7.npy +02946921-96387095255f7080b7886d94372e3c76.npy +02691156-5f2f19cff434d86ceee9782f3a645bc4.npy +02691156-ca2a07b005ad4385ca8607f540cc62ba.npy +04256520-58cf696abb5d3e7426415728d9c23636.npy +04379243-decd9ab8c2714f2e7235016c2c2c8150.npy +04090263-34ad54857a4dd37e12b38b1d99376c0b.npy +03001627-587ebb2aa71acfe644dd3aaee16d3f4c.npy +03797390-bcb6be8f0ff4a51872e526c4f21dfca4.npy +02992529-7e8e9cc2cd70a66d4d1f2fe604198dc9.npy +03761084-42aac49442bb9f8bb4e3935c6cee4b35.npy +03636649-39bc57beb358fae677981b941eb4f5d1.npy +03642806-6e728e12c4b4dcf26479a182158bae5.npy +02691156-48a36df204cb05dde7fc8cd567dee096.npy +02958343-9a152b11907b11074549b3c52ae0632e.npy +02924116-e2824565083fd0c4ca8e0c77b23bb25.npy +04530566-ec97e9975c94f7ba727ef88d634f1148.npy +02924116-521fbafd6674948eeea69f3a548f8109.npy +03001627-490cc736a3ffc2a9c8687ff9b0b4e4ac.npy +03636649-67fc0e388b91d55fcb8d8c6d4df8143.npy +04530566-4021a170452d19393c79f1baa816886a.npy +04090263-9b5a5de7af6ecc4274e18e0e7a19212a.npy +03001627-32f918efaa64a4d9c423490470c47d79.npy +03001627-be0890a6a0f3fcf841f91bc9e1dece3b.npy +02933112-3c28e4a1a5154ecc59350d819542ec7.npy +02691156-f1111840bde23096ee2723567c7709e6.npy +04090263-4e42faa1861597c9f2c612775ea2be4f.npy +03001627-9ab18a33335373b2659dda512294c744.npy +02992529-350dad20c76cb54b7ad5140f7d56e11a.npy +02958343-83cbe72c4b5e9268ec89747d864c8515.npy +02828884-835086fd24eb283650f9fc0e2c94dd76.npy +04379243-640da7c995f9fcdeab571431db8834c7.npy +02958343-8997065fe94841771ef06e9b490109d8.npy +04379243-b69087245c6ce1c57fc1f91f1396c600.npy +04256520-e29de3e590d4541c285e5a1f74237618.npy +04379243-b18fcb1483fc0f4c8ea6bd444282b41b.npy +02808440-a64f942a8107ce5f44221bef0fa3c36b.npy +04379243-2a43665ce0526ec3bd24f986301745.npy +04379243-39f202c92b0afd0429d8eecf3827c486.npy +04004475-710bc6c5434612d6b1ce1e5dfb273bde.npy +04401088-424ccff9ceea33451c81652b127a0ec9.npy +02691156-b6d61068ef2bf2d46059aeb39e538eb2.npy +03001627-5c9b4af9d0e9c132b161f36d4e309050.npy +04090263-73dc8568cca29c0f7bffd97a22e78e2a.npy +02876657-70e58e9f89fd9802a9891f6668163611.npy +03001627-c7fe45610d10cb108ad3a7d07aac2767.npy +03593526-72dad3d3eb9aaaa6707cdefe012d0353.npy +03467517-46eca0ceefe7bf062b996d5d44e09408.npy +02691156-11def84f9fe8ab0acd726e804e5d7a.npy +02958343-18f6df600df7341ab0bbc6f39febba97.npy +04256520-c3cc9a21c0732ef9b2f052bd9ec28053.npy +04379243-a0796a2532fcb95fb1b6b0c5ddacb607.npy +03001627-c9913221819588b519fb4103277a6b93.npy +02828884-f4afba7266031dbbb62b272ea9e18d0a.npy +02691156-c2923f0931fa539f794f2d24bb38b7d1.npy +02958343-45bbe9d4f12433cf4f2af69a26c97402.npy +04379243-e056700bca093e0c1cf96a5dc33e37f1.npy +02958343-7112c1cb9b6461c9a551e6372afde900.npy +04379243-57f881c06c1080ac91829b477862aff6.npy +02828884-23931fb6b6c46da895f577622f465c85.npy +02933112-75c26ffff01ea7063ab3dfa44f5fab01.npy +02933112-315f29b2492f66a9c59350d819542ec7.npy +02691156-2d7562f5bf2c7f2da1d85548168d6015.npy +04379243-e72421299768187426a61458b682cfd6.npy +04379243-cc6283a5bcd5452360d9b527752ac99f.npy +02691156-d8d9de967255b4c562b600da24e0965.npy +03001627-d74870729fb3e3c5aa0a75782a86b0f3.npy +04090263-597f7914fa401ce1433d7c8e9cebd7c2.npy +03001627-1e2e68813f004d8ff8b8d4a282992be4.npy +04379243-88e73431030e8494cc0436ebbd73343e.npy +03046257-c45e4604958d9d1d3153a6db1fd05f23.npy +02691156-df0b14faa90bd4dce68b9e5f5c3d0eca.npy +03467517-120b5821b1d27de5ba32f71f79130dff.npy +04256520-5eb9da1ae0ae618f1190e285a2cbc9c.npy +03001627-9dcede4115b4379e2af4036e9c51cbc4.npy +02691156-b63c554a915454b7a8481a97c910a7de.npy +03001627-34d255abb83e8d7519abd93be2967664.npy +03001627-1fccc2ac4bfd3da535836c728d324152.npy +04090263-e6ffef0550b5b2aa7833354cdb66ee8.npy +03001627-9c50878c91aeb8126bb6bc0db07c71e8.npy +03636649-27ed76ca359d6eaffcb8d8c6d4df8143.npy +02876657-6821f9cc313dfdebe7ef9fff09638f8e.npy +03001627-a273d2fa5244c74f654ea6737b0d3597.npy +04379243-65e5036f67dbac4e1cb7b51444dabacd.npy +03211117-21de0761d0f8f2f9342b2a88bd008cbe.npy +02691156-414f3305033ad38934f276985b6d695.npy +03001627-e440059fcf6f36496ebf11292bdb9130.npy +02828884-85034e80317e36d9a6c03a53cf0a14c9.npy +02691156-123bd9e948881939c38a1d3458dafa1b.npy +04379243-cd413f0540b54bc1fcf003a332eb3241.npy +04530566-e969147de0934040b2533fe4d795f40c.npy +03001627-9faecbe3bded39c4efed9665e3f75336.npy +02958343-c52a2f6396ad8d5f97df6383472cc5b6.npy +04090263-f130c222ff91520182c15a8613f6374a.npy +02958343-eafa5935e963b0035e875676652081cd.npy +02808440-210c971bbc492960b022c94235bc8601.npy +02747177-9d453384794bc58b9a06a7de97b096dc.npy +03211117-ebe5a5c179cd4ae355b9f0c05f9db07c.npy +04530566-e0b49aa20792f2fdc99bbfcf5650bf52.npy +02992529-3036e6b2a898fc85e85776440ad91264.npy +02828884-e0777bc4f8e3c6db63b2acb037dfbcde.npy +03001627-f9fb36db323fb2d2df6cfab91d65bb91.npy +03636649-6c5b0451e99192cbd4bf7024dfa167d.npy +04090263-b9d2e06cd1844f6a6325009a8a12b7e9.npy +03046257-34545d313538df146463df620b7b4cbc.npy +03636649-5e7f0e657142fff3e4692b8e5c093494.npy +04379243-7842ac8b7a053dbf61bf305cc5ea87da.npy +03691459-bb570a28a0e81a51d747b49524a1246e.npy +02691156-9bfd7f4ecdd8efd8bd46d022fd7d80aa.npy +04090263-42b44473503d82101c7be7f1ec012899.npy +04530566-b0238a48839d2b1b64ada2fd6418de4e.npy +02691156-b4b1b113173a6ec6bbf3143b1cb6076a.npy +02924116-fd22e8ff23d7a4da3709ffc87474086d.npy +02958343-96c404939bdba58331ec7db1bc2ab2b4.npy +04379243-1b9605a88fdee0626bdcd672c2b17215.npy +03001627-ff2223a085d32243696b74614952b2d0.npy +02924116-a85b9a3ace923e424721d5612f98ae26.npy +02924116-d0f9952155dfafaa58e6c5721f48a106.npy +04379243-5e84051a6a839c24b577ea930304326.npy +03001627-7f820a5aef9899d5e2953fd13c76ba9.npy +04256520-4d8ec1a57f4ac78258db0ef36af1d3c5.npy +03337140-fcdd18edf5219ae6e7ecdbe73ef4323c.npy +02958343-b2f3ab0b028eaabe443ea0e3853eed5d.npy +03001627-dee24ea8622e2005dd0e1ff930f92c75.npy +04256520-6c3b3c37c20bf2fbb40f0ac0fb9a650d.npy +03513137-c3fb3e4f87ca6c91388f6c7a9d3e1552.npy +03211117-95244648a330b9c0330afa9b9b51085f.npy +03001627-be305d2400194ef726e926172da61b44.npy +03001627-64fcd1ba0df5d54d79b3e1be3524f72f.npy +02958343-a42b6210fa2682adeb4ea3744b7acd6c.npy +02828884-bbd82d91a0b7fc12ad5067eac75a07f7.npy +03337140-e8307e0cd56ea254c3aee8e9d3a6ffa.npy +04379243-bc36a2facb65a01263f50818822b2585.npy +04379243-54addcbdd400808f54d30af857cfae06.npy +03001627-5f562c9c8f0df90fd2f33aaf794b5932.npy +02808440-5663138e433fa57c79d57ee14f8ee702.npy +02876657-8b7933b0376cea4a1efe98244cb8c300.npy +03636649-1b9b6f1ddf363e0e8b424343280aeccb.npy +02958343-c07bbf672b56b02aafe1d4530f4c6e24.npy +03001627-61b94385426a74323002761e7a3ba3bd.npy +04379243-ce803beb471c728a4f5f1d630285ffb.npy +03211117-2f07cae4c7809f0bcf5a37a70014c623.npy +02808440-75957a7274c39d54b8fda7a3b5ccb8f7.npy +03001627-944a665e765a13ee6d7db84fa3ca3146.npy +02691156-f25ffb9cf92236fb9671f5163e7f6535.npy +02958343-e0901a0a26daebea59139efcde1fedcb.npy +03001627-d56da491d5dabacd4453212030cbb3c9.npy +02808440-97ce198e3d7cdda13991a4f3b0ed6e4.npy +03001627-b4b2e315ec8e17c9a4f70fb45099ec30.npy +03046257-2f484b80a9a0f8a1c1bd423f37647123.npy +04256520-63865747038e4c66c35131da26f8061a.npy +03797390-7223820f07fd6b55e453535335057818.npy +03467517-5c570a10f35716bcaff103adc6dea0b0.npy +03325088-320e3c136e71c412b0957d845ac33749.npy +02818832-30eb0a2f835b91b19e9c6b0794a3b4d8.npy +02828884-7cc80dbf0cb6f4c6b8134b0fbf68257d.npy +04379243-37299b12d2ac7fe13fcaef19d88744fb.npy +02691156-2bc9a8aa5826f7335fc197bbabcd5bd.npy +03001627-184b4797cea77beb5ca1c42bb8ac17a.npy +04090263-7e826b890b683200b63969f9f8d6f075.npy +03001627-e0b432f43a70aa4dc71dfa81bbc5b8ef.npy +02691156-133b74393a3349aa70c4138179d9ed97.npy +02958343-a9a86444fd7402cac69ef68baeaf5d49.npy +03636649-bf3c1ceb076a334acb43a77d9793979d.npy +04256520-5f1a2fef69c5c0ce19fb4103277a6b93.npy +02876657-c107c8cfe88fa057ce53fd26be6d8b08.npy +03636649-c20ca2a29975866cbc7ea0c51211251.npy +04256520-8c6348fe629fb8c876a45e9a12af8158.npy +02958343-6ca9967adcf862a461c6c61410fc904b.npy +02933112-78937816b70f990d8fe14b5c9bc18491.npy +03001627-8a5b706a57166350bc3c6c80ccbccb1e.npy +02691156-17ad3ab1b1d12a7db26dc8ec64d633df.npy +02691156-4de5861211ad5b95e7ef9fff09638f8e.npy +04379243-621ebcbaafeb91a78616812464c86290.npy +04379243-5cebb89b77fcf78084cb825ff0118ad1.npy +02808440-5a4cf079a43f0a793321831d2245cf06.npy +04379243-c43d83c84e8d2614742728b30848ed03.npy +04256520-adefd541f3b51aba5f5e789acd4d1122.npy +02992529-7552cd75673834c9c8470fd239ba13d4.npy +02992529-4dfc1e4efd7fbf083cdba96133f0c38f.npy +04256520-f3abd87858a226aabdbfcb10306a3977.npy +02691156-697161441b9da2a7ca8607f540cc62ba.npy +03467517-8ef7b4bd85885a185a7d605170ee325c.npy +03593526-889b2e6dc1b409cd5e29ce2c9d37b952.npy +04379243-6555b5004c742433e3785a46a5c831bd.npy +03467517-d7a9114b17fbacd376d05024fabfa1e5.npy +03636649-8e0f611116a8df69fc9ae1e9c70f67b1.npy +02958343-d17acdc9dd449748ca92a4cdad802b45.npy +03636649-90d70f0a6b1cf72d79f0be73913de469.npy +04256520-5bf5096583e15c0080741efeb2454ffb.npy +04379243-297778bf1a3f8db5cea003eff0268278.npy +04530566-9798a8b84987bd661851363a5850bdc.npy +03001627-97c5ee9d477c82146c7e21b4ce9a4103.npy +04379243-d6ed3a1e5d5eab8d97fe55e7ac43b9fd.npy +04379243-e1b85df09d33ddea3e43be0b542efff8.npy +03046257-6291b9e4aeed283688b34c259035ab5.npy +04379243-7f6db7a3f529949601104cd2d998272.npy +04379243-29d9c6d84c6a126917b431cae0dd70ed.npy +04090263-2165d568388bfe649a6e43b878d5b335.npy +03001627-bf3f14225e8f899db62f9fb4b7f0626.npy +04256520-6f22991fc456e7a5f63bf7d908efc575.npy +02958343-68f06cde1b907c44e9e6d625d754e501.npy +04256520-d1738a15fe737103917b96045c9b6dea.npy +04379243-d32ccda2f4614dca4b2ec20c30ace65f.npy +03001627-ff02a89047d6eca2f95b04490c0648a1.npy +02691156-4cdd238ccf9002344f59c2a67aa8473b.npy +04379243-dc956d4dc6982188febad4f49b26ec52.npy +03001627-e1897a4391784bc2e8b2b8dc0c816caf.npy +04256520-bf504bde782c3f2ce8ced3508709e1db.npy +02691156-3c52f7f687ce7efe3df325aac2f73830.npy +03211117-cebb35bd663c82d3554a13580615ae1.npy +04379243-5e3ad0f79dc0c429bc8967b0321bd9d2.npy +03636649-beab7a10e86dc5bd70d7da54cdb9b8d0.npy +02876657-ba4b48d76eb79f7cf54e1b6f41fdd78a.npy +03790512-707dfe4769f3e3c5ebe67d9b32c3ddf8.npy +02933112-8390466432e2c364298a4bdd07dbdc0.npy +04379243-2da006ded7b80b61febad4f49b26ec52.npy +02933112-7f50a6bb1827b9f582bfcd34215ccfc7.npy +04379243-a7172fa4177661f4858699aaad4acee4.npy +02958343-bfc1822c1d6a529d531e940de4b7770d.npy +04379243-d10bf548de6c75a966130541a711692.npy +03001627-353bbd3b916426d24502f857a1cf320e.npy +04379243-16e874e6165e836b30bbd4cddd04c77b.npy +04090263-3b8a22fe5666ec993bb35aa9d5fb636b.npy +04090263-56bb7870765f37a05ad0ccf97045200.npy +04379243-2908340693e3dbbd8608f23147a4e121.npy +02691156-861dbd415c83e12e67c647d96462f673.npy +03337140-4cb3532fef99ecaf4c3aee8e9d3a6ffa.npy +02747177-8a50955facbac20ecf19858fd1963d10.npy +02924116-6e303c1727509522c0e9e88e2a6f9b60.npy +02843684-7dd57384aa290a835821cea205f2a4bb.npy +04379243-4116d19d60fc24f037a346dba83c013b.npy +04256520-29ec7e1541397b0e5ae252905262c0ed.npy +03797390-cc5b14ef71e87e9165ba97214ebde03.npy +04379243-5191d64e9a1b9664bfdcc70dcc16baa1.npy +04379243-1a08afbeb4334efeefa472e59de52b43.npy +02828884-90a309f7ac2c947f155d75bbf62b80.npy +02691156-fd7c74a05072d3befef192e05c55dcd3.npy +02933112-16bc9f5821d887f2d7838dc22b16368e.npy +04090263-fe26829c67320001638241f3ad71c10.npy +03691459-4ca26cee4108632859d58b5bb5e2bfcb.npy +03691459-5338db4536b4a889de7da340cde8d034.npy +04225987-36755d38d12e80c0702c58bc53d1e55f.npy +03046257-82c54e1f130534969cfea89fa3f36223.npy +04379243-21cdc417e398378e40f3ac0af6b7e700.npy +02933112-14b5e16ba851e17ac59350d819542ec7.npy +03001627-d792c65f8b1710709b9f2eb77f5e247e.npy +02818832-d7b9238af2efa963c862eec8232fff1e.npy +02924116-721792117cbd8de252470de2774d6099.npy +03211117-5a4add4da7414d11f2a521bdff0d8feb.npy +04256520-54baa6e5d9584469b80b68728684f2ff.npy +02828884-54547a5cbc7cd402c955e5ed03ef3a2f.npy +02958343-e40b027b68ff767d76ad064d1c5fdd7c.npy +02691156-6946f7a2a5ef851215ea536736a1eb7e.npy +04379243-c44792206360e4e4be1b0e1de3e987b3.npy +03001627-1c5d66f3e7352cbf310af74324aae27f.npy +02880940-9a6cec1cfca7e8b5ebc583f22bd58b85.npy +02958343-1b25c745164e53b822d2fb8fec68f2a1.npy +03211117-c0125cb175a11bc4990549fb11675099.npy +03691459-66d9f9f961a12754d1fdf116b1be3b27.npy +03001627-d8774646afed0312732375ced502498.npy +04530566-739a6f209a49040a4f44d84b9baa5f42.npy +02691156-de9e093bb17848c3b2bd4a92202f8700.npy +02933112-6b7123a3631583c612de5317fe5b354f.npy +02992529-e1fb2b5e5a306e6621ecd2b49af349a.npy +03001627-24c0e6a8b10abb77df2b21995cbbbc4f.npy +04379243-6bccd5c9b9c64af7812abbc2a4d00ee8.npy +04256520-b4a72257eff26336d7231c5bdc5ab135.npy +03325088-ef853be8e39805d4589577ccf07b31e7.npy +03325088-b8e9b70818bef88814b35a7d7cea7130.npy +04530566-e64bb04b54022e708d7bd537eb907025.npy +02958343-536477e0842580e0c3c4805a61e06841.npy +03001627-f13d600a3c4515e220ccbe1c34ca182d.npy +02933112-b572114b0944ac203fe047712e43e185.npy +03636649-63e9be096e29681829a42a0444436860.npy +04379243-af5e2282958114c3f12d7184a2ad3430.npy +04379243-4d22674c2acd9cc9f51f77a6d7299806.npy +02691156-ad98f06fa29c52eb23db3adbb2f1dce.npy +04379243-1eefaae6b1ab9615a22802c4e64a501c.npy +04090263-8f38c44779be7fd4340b66282f54c877.npy +03211117-f6a08ec163a037c310b3ff08c68acccf.npy +03325088-8f1e94d2e214b5c076d20e73c57c9a03.npy +04090263-27a144ab9c20b710ae9e1c81f7e5b0b6.npy +04256520-f96f7bc4d005a88db38d1ee17ad4a4a1.npy +04554684-53e2b5c6f9a2103e3fb0920a55a7e805.npy +02691156-131db4a650873babad3ab188d086d4db.npy +02958343-9fda50a84e042ff1a7e7e5ea49ad8e45.npy +04379243-4e3191c1f133fca0586c8517ad05e6f3.npy +04256520-5e118f0edd514706593ebeeedbff73b.npy +03211117-c98e0e745a92abccaa60d250862f15f.npy +04379243-28710bbf732bd651c955e5ed03ef3a2f.npy +03001627-748957972cae6b03c56be62b05937331.npy +02880940-6a772d12b98ab61dc26651d9d35b77ca.npy +04090263-bbcaf90d1025714f98ee95803c8422bf.npy +03001627-11e28120789c20abc8687ff9b0b4e4ac.npy +03001627-e159d82f67a5953b1fb41007d56c0ca1.npy +02691156-85738a291d67c649f019a51d1a3b2e07.npy +03691459-8c7c72599c6bbafc8323fc17a8352c3d.npy +02828884-6fe6b24009d0ac4f19b647a92023d001.npy +02924116-60b79c17ea581aa99c7bbb03ea46a56e.npy +03211117-ebd183cd1d075dd3bed06f4e613c0aec.npy +02828884-5c1dea3aaa34fee26c289bdcae73ee89.npy +02992529-fe9d97823a25e56d95e43220ee0eb824.npy +04256520-899f5c18a528aac2ef0b2fc3511b6fbd.npy +02958343-4e488242b665d85f40bc3b36a331b786.npy +03001627-2c8f57bf281dd31119fb4103277a6b93.npy +02933112-87708c9ebd845c21854c6e2381cc9350.npy +04090263-b1cf5989ae77d71180ac63732535bbcc.npy +02828884-2aaf5fe631a855b4de9ff1d2442cc6d1.npy +04090263-c474fa4cf4a4c282f5cbed688a0bb106.npy +02691156-35c9e363ca3fa6f8e4fc4c6009ee9462.npy +03001627-8e6dcb9b3eadaf9ead885ade4bf3150c.npy +03691459-6152f977e3cf8ccae47833b310955a9f.npy +04379243-9109c50681f033d83b233a16f6b369c3.npy +04330267-5b0c38cda43ebcb35a7e054e0372a0f.npy +03001627-a3c4bd89e7570dcc6204511a506beabf.npy +02992529-2274e1f494d6d2c3226bc3b9ce9ff2a1.npy +03691459-27867443c228581e515eb678a856048.npy +04379243-656b7353e4580f8fa93e942a054d60b5.npy +03691459-bc09422920aec02cb8901bb57b05fb9b.npy +02818832-2c8b8a58ecffdaa17b9c6deef486a7d8.npy +03001627-68747a56aba6ee318677364bd64735c4.npy +04256520-4735568bd188aefcb8e1b99345a5afd4.npy +02958343-6bb14c1083ed44f5ac34b841f2070767.npy +02747177-1cb574d3f22f63ebd493bfe20f94b6ab.npy +03001627-c13d5f3639f427587fa29a3ea424473.npy +02933112-c89a5482bb756c041d86c17c15247b0.npy +04379243-5b685a0318bcf5ff4ced24553b268ec.npy +04530566-c83910ef0a35953756e0cfd6e5118fc9.npy +03001627-fa8f7c225d3b9f1def4a09e7eb872bd9.npy +04379243-610ccbf900e1bf4aeb34db531a289b8e.npy +04090263-ceba1f5b53f3c3f0a4c018b03e3993f7.npy +03636649-b000d66b8f78ab20cfdfe3f21f42a111.npy +02958343-7b74eb8f053aabe64eb766e5a46fceab.npy +03467517-e530bbce9716bf95bc4ac3caf16ef65.npy +03001627-d5360f2b0b0299c29b9f2eb77f5e247e.npy +04256520-5ff07557bb0a3a30dbbc9440457e303e.npy +04379243-91a56c9037ba4a63a393ceda265543cf.npy +02992529-b1537f1eabb7f5009f7477e2986c440f.npy +02691156-dfa310706fad49d873ec74c119307b9.npy +03636649-a258951f55855e41c02170c33e00ea64.npy +04530566-4719acf1c3e56fb489d39b85991ba25a.npy +03001627-3b1b0186ebeb8ea579bb09dc5605a57.npy +03001627-bdc58ca6d411823cae786e8787e8886a.npy +04530566-4c8c605b2b452cbba66c1707a338712c.npy +04379243-607f9e630d94edff9292bdf65b24b621.npy +04379243-a4dbf0f4fef1c36cf199233c9f2ce2ce.npy +02691156-3cdf7ea70c5a8471f446f92b52bbd82a.npy +04256520-21236ac9a464b22a91fa1c643766450d.npy +04256520-bc65c38188f1e72c532e8683617554c4.npy +02691156-5f0e7de6a86a694d3930849f1d75b1.npy +03001627-1b67a3a1101a9acb905477d2a8504646.npy +03001627-a203bbe3c9c1c676c3bd24f986301745.npy +04256520-6f0477514eb4f9319b0530265e62c9b7.npy +02992529-cf3f330fb6e3e034449ec657800ab951.npy +03001627-400ae609e39ff49639d5fb08047c894e.npy +03624134-8f499dae474bf37589757884a4547730.npy +03991062-84fb2bea1b0b6701dd3adf3090c701f7.npy +03624134-e0a78d771cfde145a5cea7e40e4d21ff.npy +04379243-4b47e8b6ac084de116a2b5862518c93.npy +04256520-592fdb44d4bbf0ee490ad276cd2af3a4.npy +04379243-fb1e39667d83506a41dea5e6084523ee.npy +03691459-b0d4ab08b9498de4f42138205659017c.npy +03211117-7636d7c650108b884dcb5392aaf2167b.npy +02828884-7a3590d0abb36b49593ebeeedbff73b.npy +03636649-6bd7a0abc6f77368b0cf606cb698fa08.npy +04256520-a03ca96c53c69c05f8a51dbffe0021e4.npy +02691156-c846ad445cc9acbb98427765723d5e48.npy +03642806-cb090bd99ed76f9689661310be87a70d.npy +03001627-bdbf18aefa5b980585b479b317175b55.npy +04379243-a29ee68d1279e8ff98d5fc0473d00a1c.npy +04530566-ffacadade68cec7b926a1ee5a429907.npy +02924116-73fa2052813f9e78730865f7b652666e.npy +03636649-c1532683707c38b51cce8c25b11ccdd9.npy +04530566-390de3a1bd0191c881d9d9b1473043a2.npy +03624134-cc38f97557029b2a2b5fd8277662be97.npy +02933112-dbcf0d09a1cef0aecfaf287992b2065b.npy +02691156-d7287ce98d521db5ca8607f540cc62ba.npy +03211117-149733a616f846a2b661587eebd6c4d7.npy +03624134-3a0f48139bfd3a4ea152d2e823b9fe06.npy +04256520-218f5acd2b8f2d7c85f6609ec867506c.npy +03001627-64ed01e4a892fa8e498bd5a555c21b1c.npy +02992529-16c6403551e81a3eeedfca8b846d3b01.npy +02992529-4475473d3a96860621844676433a0aca.npy +04090263-6cd490d9cce62e94d2c901959c439025.npy +03001627-5ef54fa5d00dbdf8c8687ff9b0b4e4ac.npy +04401088-e862392921d99119ee50cfd2d11d046b.npy +03642806-dd282ed5d4956590b713df0d260c2628.npy +04256520-494fe53da65650b8c358765b76c296.npy +02958343-2a0dad4f32251b353ffe0e5069bf1eb5.npy +03636649-9e0b193df5bf4f2097497273a66fca55.npy +03642806-247012532a6342f424afdcb79b0329d8.npy +02691156-cbb5ed444249f0a9e90916c8815b5c43.npy +03624134-c20cca071ea58e3ef2c542131520d62e.npy +04379243-6550c93bce51b9b4719088c8e42c6ab.npy +02691156-2b2cf12a1fde287077c5f5c64222d77e.npy +03001627-a9e2b04bb60240d0febad4f49b26ec52.npy +04099429-e98fdff7cfdf15edd8e5da8daec55d43.npy +02958343-c234638891f21417ec5e3fe5c33367cf.npy +03636649-92bdae8c11323fc518df0876cc6aa6ac.npy +03001627-241d81f586925ea0fbdebca9f6788597.npy +04379243-5ed584534db04e128ddc9f1b5f92baac.npy +03211117-946ec8b571ca42d378838533e331d3cf.npy +02691156-76a86e664e302f32fca1f1143bb6bc17.npy +03691459-2003690fcc8390a24c40f34de8f3bdb8.npy +03636649-421734c234a9ecce5c166769fb8a1974.npy +03001627-359331da71ed26eca6c03a53cf0a14c9.npy +04379243-fead7e0c30a347b1710801cae5dc529.npy +04090263-f0acf574b96f9fc3829eee2486bd54c3.npy +03001627-67b082d174af9ab06acc27496f96b513.npy +03001627-5c660775f1c7b202855c835f93769fb8.npy +03991062-aeec00d8dd6e196451a2ad3de1977657.npy +03001627-55740c07554a726257f40ff86fe708ff.npy +02924116-d8bbe91e70fb6dc0aa2a2973c341188f.npy +04090263-c37c062ab5ecca2ef3998727b15249db.npy +03636649-b9d353635f7e1134e95ee7559a2a873b.npy +02808440-69f95bd359cd47d0448cbcbac44a38bf.npy +03046257-1944938643bdb1dd56538cee362f80d0.npy +02924116-505d081493bd01a09600ffd1ed0f3806.npy +03001627-8f6634a231e3f3ccdfe9cab879fd37e8.npy +02843684-c815baf0ba9306cca9af96dabf6167b0.npy +04379243-f260449e91824f96d810b14a81e12eca.npy +02808440-ea012fc2a70eb38c14b1a3362bf89056.npy +02691156-5a38f5eb63dd8b20ab9d1113aabc16f5.npy +02958343-6c50a9b8e01fbca27dfb1ee6a4b12bf8.npy +03691459-fa2cf860e277919a7445d25f394949d0.npy +04379243-d06d27bc9ad1faabd7bf6fb68df7f786.npy +04379243-1f9923d1e65004d836e4b0ae0f52067b.npy +04256520-ecdefc9c1104da52bca88fbd368f59a.npy +04256520-dd8de6dddffe302f84633b41c8a09fa0.npy +04379243-bfd32cdb923c8430e260ed121aebe3d6.npy +02808440-4399b850494bcfcd2dee675288ffec8e.npy +02691156-ade3c4987f49895ff960bc420d751255.npy +03948459-b62475e6bfcc88a226735d0798dfa389.npy +03001627-6434921f88bd48deb0957d845ac33749.npy +03001627-421b11a26931160a492d9da2668ec34c.npy +03325088-8ea7517f0c9c8a5ce27c891af4570491.npy +03001627-f1787517791764e74b3c42e318f3affc.npy +04379243-9c57462582737eb7d46cc1240811b39d.npy +03624134-b678ebb41660034c32e713e886ed6efc.npy +02691156-c3a03137955f65c5cf67c0b63878e138.npy +04379243-33d620c4e8af291d5dcc7ddfa72357b1.npy +04256520-51194e8dad49dedeb38821f893bc10f9.npy +02808440-bbe02a8cb3ea4b4844221bef0fa3c36b.npy +04379243-8a47668d3584eef1e4317813b39d4fe.npy +03001627-b60546b326e585e03ac416718757a350.npy +04379243-38e83df89967420b876b399a99a15c0f.npy +04554684-bdfbadd16a5ddceb8e55c35c514cb2f7.npy +04090263-d761053ffff137701d9b004d9d8d2781.npy +04256520-3eb1a7a9a4ea97e3e44bad6fc9badfe7.npy +02958343-ee1d28a50a2b71e129348d14ca881f7d.npy +03001627-53675c4bbb33fe72bcc0c5df96f9b28e.npy +04379243-e8ce7c3e66e6aec08ee0a9ed0efc243f.npy +03948459-15a33eba4028d9e9359df9cdf4b82128.npy +03001627-7efeece3b5cf2853d706779c93538ee1.npy +02808440-6be7c8fafd1268776b448b8aaebb705c.npy +03001627-52afab7f974e7bdbac1ffe34fecf39b2.npy +04530566-8605c975778dc8634c634743f56177d4.npy +04379243-93d61cd5da999d774b3c42e318f3affc.npy +02691156-1e4fb40e5908f2bddf2f34e1100f0241.npy +03001627-20ec9403d616f96ee6cfc789522bfbab.npy +04379243-77e044ca2ebca1f4d148fd8215fc3114.npy +04090263-c77af288e7c373979905a3939c890ad2.npy +04090263-fb96b1414205d7b525c70fb1df3f879b.npy +03001627-d66cc87c717c15f57f0839ffd260627e.npy +04379243-5d77e8f6ad3741a0c30ab36bf7b0552.npy +02933112-8697ab2a0da98ba65588a2543ef0b0b4.npy +02958343-aa7f127bb8cd9db73755eb267a6f3b6b.npy +03001627-91645c82e357ec502744bf8869518694.npy +02992529-b1feb3020d9380ba4fb324159a14f34e.npy +02828884-ff71a0d33a3aa440565888a91a05d618.npy +04401088-ed5ac4e8c681102e848d333362aaa342.npy +02808440-6716bbccb88071daed20bf7873c38793.npy +02691156-62bc52c204b738317dcda43eefa0ac02.npy +03001627-329ec98f10af7214ac6962daa1b6ab91.npy +02954340-e8a97a1fd97c1a75a52821bf1aa3b19a.npy +04379243-10b6147009cbc17ec25cfdac7cd67ea3.npy +03211117-444fe598a0ff9d7ebe24753b6321b5ca.npy +04530566-5e8276dfb4c1db936f31e247620349e3.npy +03948459-5e895f53b72ad0ba49590df9bee4071.npy +04530566-762afb11bf41fc61642f9e27aaf0c47a.npy +02958343-9807c1d0bcec85fcc3c0146ad3ea2d7d.npy +04379243-b0d7c6d51712d1fbe76bc197b3a3ffc0.npy +02992529-976a8d10e8423f8d8f15e8aad14ff29e.npy +02992529-57ff44f979370766976fab5d6e2569c1.npy +03593526-96106df7b7d1ca5dfaeb9da29098949.npy +02691156-ca91becbfaf5a094bba1aa1c98256342.npy +03001627-4e9475fea6f3ca32c4cb3d6800567627.npy +03001627-c9d5ff677600b0a1a01ae992b62200ab.npy +03691459-a99cc4f1326b9b48b08cd968d6703683.npy +04379243-57f64087490954d2c015b1a51bdead97.npy +02958343-70d46fce66801e0f16abce8cb03e7794.npy +03636649-ae5ecfa01e88e47f41bb00bd5475793.npy +02924116-856afb0a9a494aa6402dc8d46be324b6.npy +03001627-99fbc3ebabd3b83e54beec3b24722e27.npy +04379243-62bba707a00a2fd0c271edf49b97f472.npy +03001627-a216d6a04494ef6a32485dc6e0b2347.npy +04256520-2ae32451bd6b947e593ebeeedbff73b.npy +03001627-3aa41731c9bde97796d5112fb101f3ce.npy +03636649-9b9b39303c66baba490ad276cd2af3a4.npy +02958343-b25bd03ac3b1ce39d5238b9ecc7822b0.npy +02992529-2703b7edaf11d79a6b203c09a4932f5.npy +02691156-76f142e62adc0f2ae768735f27170bc4.npy +04379243-2c14b0b718a1f3765828f54ccfceb8a8.npy +03636649-366a93bce1f6f524eaf14273fa406ffc.npy +02880940-8d1f575e9223b28b8183a4a81361b94.npy +02828884-3a7b2f1220e7c13092ccafdeb0ce5a8a.npy +03636649-e38e89e852fe924d957f81d76123f1a7.npy +04379243-ec3f93916a91e386c29f1e5c35eaaf93.npy +02871439-9e23b733b160313ed260ba674fb1fc01.npy +02691156-9618b78610150b53825b20c2472ad90a.npy +03790512-2d655fc4ecb2df2a747c19778aa6cc0.npy +04379243-cd895c35fff495cdd0b93fa304cfa755.npy +02828884-24f090d8ee565dd1601104cd2d998272.npy +02992529-1edc7aa574624ca0200a0406803801e9.npy +04090263-1d50f114691be38fa9286f039319ff7.npy +03001627-d1bef1cf465da3acdca30639ad4a20ca.npy +02958343-e4d1edc4cda4a6445fb81d6394b59c19.npy +03636649-13d5888a6598745f82bfcd34215ccfc7.npy +04379243-40e4f56f34f98a779ebe79011e3a0eae.npy +04379243-f3fd419f725aa894ba5342d638d0c267.npy +04379243-42afa0dc60b32a6d7dcf230d8b7d162e.npy +04090263-9642b6d77734a1c351cfdb4c9f126c12.npy +03001627-5509f56ce625c42aff2b8acf844d34d2.npy +03001627-225ef5d1a73d0e24febad4f49b26ec52.npy +03001627-5840d369b3e0e40f7c4ed45ce654123.npy +02958343-c8b196595745bbd241c181f4a7e1bfa5.npy +02958343-5cf1f82c6fd31a73e0445fc6d980dd5c.npy +04379243-30573f43ecfd93f0684b7bc3f8a9aa55.npy +04256520-1914d0e6b9f0445b40e80a2d9f005aa7.npy +03001627-6ade3daff4827379492d9da2668ec34c.npy +04530566-c4c9a32c9b1c3e515586434189043e91.npy +04090263-ce50f2f8034fafe86b2c8bb96250e4a0.npy +04090263-9ee24e8914555d18d0a6af9bfb470a20.npy +03001627-97d75ad96c2c08268cbb8bac2032149c.npy +03001627-d607e86b83f628faeaf288f952624966.npy +04401088-c410d13694b8ca1d15e144fc878b7afa.npy +04530566-7b568afff918289614621506c22882a0.npy +04379243-b0b0df035ab58b92822a33e080d0e71c.npy +03642806-25f391ae823c118963439329667c7723.npy +03691459-d6ad58677b397894224f9d60ad32613.npy +02871439-2d628b78cef91948636882dec160c4d5.npy +02958343-a0a1b0377d72e86bab3dd76bf33b0f5e.npy +02808440-d5c8f32fdf76cd316b448b8aaebb705c.npy +04379243-735acef5841a826b6ae95494c18318.npy +03001627-7aaf5573892cfe086e6e0f71258e961c.npy +04379243-53afd3dc40b699cf124123a40f9164a5.npy +02958343-caa7b1a7dabd0fd3be0e4b4a1a900aa0.npy +02691156-973211dfe6bcc4ae90b1d6deb98feec6.npy +02691156-87edb38cd76e89f5996d31205aa7f7a.npy +04379243-9c32d9398c04a66bddaf28b23330377.npy +02691156-4b10780b9e0f93f1d32761b337f8b72a.npy +02691156-365747560fafc7e847b5c8181a9fe9a3.npy +03797390-46ed9dad0440c043d33646b0990bb4a.npy +04090263-7e5c0d35215be21ff3998727b15249db.npy +02992529-c688e0c0830ddebed23d7150656e0d04.npy +03001627-f5be22e0a737ca9f2c0658ad22a9a9b.npy +04256520-63eeb7ea2c7683b3f811db9eaa01354f.npy +02828884-c52f48c97868b7dfea8a406c7edcf3b4.npy +03001627-30ba0d3e750dd7e0876b399a99a15c0f.npy +04379243-2c08b5408a7ee4da98cfd47a860803c5.npy +03001627-1f3591151aef17ab997a9cd87230da.npy +04256520-10552f968486cd0ad138a53ab0d038a5.npy +03790512-80e717f07645a4a0b37378f3c85478b4.npy +04530566-973d0293e286c80bf3e39f2e17005efc.npy +02876657-5979870763de5ced4c8b72e8da0e65c5.npy +04379243-638c86ffc1c9e00c5749f7a8e1644575.npy +03211117-ab2f9418c111cc6ddb965514105122a4.npy +03467517-9eee9fb35c1f62d34c9360dbc3be7004.npy +03467517-113b65f0e68314737c481698bd5233b4.npy +03001627-80fab0c55a60abb7dafb0be26f6b45d5.npy +03001627-2f1a67cdabe2a70c492d9da2668ec34c.npy +03761084-891f65c773939191c834958aed613724.npy +03938244-4691e0947b1e2a6b685998681d42efb8.npy +04330267-2b9af8c16f4b64595e5e29d9f2069262.npy +03001627-610ea34f683eaad58cbb8bac2032149c.npy +04090263-2d1fee5d2dfc73cd231b1db6fc883f4b.npy +02958343-41c5c3955dc6525a402257734064a917.npy +03325088-bf4f75844044654076d20e73c57c9a03.npy +03001627-a521fba02ca7f9aa822215026d1e8d82.npy +02818832-5f49c821b5223ab59c00f10333f1c0b5.npy +02691156-f5e271c3cb2edc1681209be1a5e8b10d.npy +04530566-59d2e9b3b4de8695a0c75f497eade21.npy +04379243-1b73a0ff61df00c5a1cccbba517add5e.npy +02691156-e2ddbf9e63bbf9cc4e99bd46be8e610a.npy +03691459-3110c18edcedfb6331f3d76ec3df45bb.npy +04090263-7aff2693a24b4faed957eaf7f4edb205.npy +04530566-3658be4cae1c98b84a51f4b900f5eb50.npy +02691156-c6ab8acad9e61a3e48227c7754aae2a1.npy +03211117-ab8cd6dd65cb0ca9770f31b5d5715b63.npy +03001627-34898c36e711fbde713decb1a0563b12.npy +03046257-4f0f676001ebb1de561dce3fe08634b7.npy +02828884-c2365f1009f94814ece2872dbe44bfca.npy +02992529-1292caa1282ad8cffc3c4ad908ac06f4.npy +04379243-41e443beb22248b46ba14bfd91a75020.npy +04379243-ec4675f62f6946118cbb8bac2032149c.npy +02876657-98f2bdf417a15ceaa5d6dc096343ac63.npy +04256520-5c0d256f2bf7559bfc8914dd77284b3.npy +02876657-656ef8a799ee1c5118431871c8e05789.npy +04379243-dd3de76ab27a6aee8141276dba5d99db.npy +04379243-6746eb452d8b84323087f84b199fd297.npy +02691156-3d6a8f8c27e465aac6747f7c9ffe9e32.npy +02691156-1cb757280b862ae52c7575c9089791ff.npy +04090263-43fc3a905d6024290dc2ed23ceb8a8.npy +02691156-76252e1b65ede02f889919e9428eee54.npy +03991062-4254d2adf7f909eb2cb3e065bdf11951.npy +03636649-36182fffe5b450fd65d1b2bc83ce78db.npy +04090263-7787dec9a3d40aa9c6b36efc015b1017.npy +03691459-2a6f78d39d66f6171bd445ab4c056b71.npy +04379243-e5ea9b41ff06d7ce2c396131c7cc7ef8.npy +02828884-11665c5093e85592b340344cde6e80c4.npy +04090263-332cc5d5d3484f8920517b73a75a21ed.npy +04090263-6c51211b773c51cf683e3750b53385d5.npy +04379243-e6a188bbf8315d11f1783a44a88d6274.npy +02924116-c88a4393e101d4e8b855cdc1bde1c5c9.npy +03642806-546b40d15cd483873339d8259ddfa7bb.npy +04256520-349f3f4d65f64c1235836c728d324152.npy +03001627-dd414923feefc1bd160139aa3ea05a51.npy +02691156-4a552066ae1da546cc34b900bb2492e.npy +04256520-e8e8f3249b237cb3450fa717654492da.npy +03928116-8b987a81642f3cbf195d81040cc60.npy +03636649-e303a8b8aa3aa14a39b3360f500ac52a.npy +02958343-95844f86f4f0a6b58a6cf8c6b92417f2.npy +04379243-71e814e5c0f59c1ec45dce3c044e7ab3.npy +03593526-a060ca371b0f70d736b0f2a1430e993a.npy +04468005-6a930aee7d68abd88e966271baaa42c9.npy +03001627-a2fdf98f85cec8696ca407465d3c74d7.npy +02933112-5a6715ef95a99bf59856fa70a578baeb.npy +03001627-3e5a18ae1c8d5fe068d1b9a1d97e2846.npy +03636649-1f30b28f2dfe65a21735ea0e092a805a.npy +02958343-2490227846d06e5a2387c64d55d0b4e5.npy +02871439-d1ce207dbd39b5695668a412457992c5.npy +03001627-1aa07508b731af79814e2be0234da26c.npy +03593526-c331b4c98868bfb529a42a0444436860.npy +04401088-424d356bbbdb38daab0fba1d15eaeacf.npy +02958343-2181653ec5313196d2c8600344d8bfab.npy +02958343-44c7a7a13fdc673abda72093f9b5aa73.npy +02946921-6f2c06bb129e52be63ed57e35c972b4b.npy +04256520-7ac7a4f53a89ecb48f966131432ef871.npy +02933112-9b28e4f5c66daae45f29768b6bb620cb.npy +04090263-a15d5a9816ba40bb76d500a9282a3dab.npy +02828884-d6924af4f2849c8219fb4103277a6b93.npy +04090263-8d9471defc6f3a8fe71e857afa9df271.npy +04379243-b23bf5b53e1e61768984d623cdd9496c.npy +03991062-51b09b5732e8f6baa2c59a4d90e63212.npy +04379243-c3023187d59aeb87a731e84e842dd6b1.npy +02958343-78555893ae97d1fea37127a27e431e39.npy +02828884-2c75963e304f490223ed665630afd1ce.npy +02958343-1dc58be25e1b6e5675cad724c63e222e.npy +03636649-cec37bc68adf2a20e6d206b2ed87676.npy +03325088-b1a88b5b7861649e7a31dd5af93fdb5c.npy +03624134-fe975241a968467ac3669fe98cc0dfc0.npy +02924116-739725054f3dcee41ef2486fe36a1e66.npy +03636649-9d1e04bd3df11256bef045a510a22fbb.npy +04379243-17ba1ba8f935f2bbdb01c957364e77d0.npy +02958343-664b8ab637c1fb54a78cb4f1b66f009e.npy +04379243-1ee2b2bc538245a85de04aad18bd94c3.npy +03636649-b1dc9ca886ac0cabb924fe739b83941e.npy +03797390-f1866a48c2fc17f85b2ecd212557fda0.npy +04401088-474b04796bf1ec91962bfd5bcfc9bf86.npy +04401088-17d4ef9fa59ede481cfeae953cc2339d.npy +03636649-23040992da19679aaa7cb30470f3273c.npy +04379243-bd516ff50ec6fcd498d5fc0473d00a1c.npy +03636649-eb1c735af1339e294b3c42e318f3affc.npy +04379243-472fe5ae8d386452bcd6195ec0f1e297.npy +03636649-b64e98c991d4103170365ad078f710ff.npy +02958343-5be79b1758410803be40bb45ea25a041.npy +04379243-67057f4425cf8fa5f46b0a91833c80a4.npy +02691156-dab7d624889233a863dc0bc8d259b20e.npy +04530566-61c17240229bf84581d9d9b1473043a2.npy +02808440-c843cc9df022e96ce6c3e73b818a2cc.npy +04379243-4e6db34a8ddef9abb9569033586af233.npy +02828884-1042d723dfc31ce5ec56aed2da084563.npy +02828884-4647754b7c5b31cccb2a965e75be701c.npy +03325088-c4c8a8f2ce62f6f4c36fb70296e45483.npy +04530566-3a68e8dc897fba988332d0d58794c3c4.npy +02691156-9818f0b88fed05b24b0a1bcf2fb497ec.npy +04379243-d77287719eb7bf0d66ef9dd2f3ef27d3.npy +04225987-ee1e75f67edf37707f29c61065b4dc5a.npy +02924116-a98700191f42cd976bed41d0253513f3.npy +03001627-f0f9d29b3eb76fb7490ad276cd2af3a4.npy +02828884-7b7e73cbc821d520f155d75bbf62b80.npy +02871439-d8a53f2b980eafae777668bd5471e4f9.npy +04090263-bfbe959eb045a3826e181e3da8402358.npy +04256520-38f6d097455e58053d6e282938a47f9e.npy +04090263-f04dfecd1ae139a23e7a62ab2a088af3.npy +03624134-889f73fac7e89bf932315e7b779fa298.npy +02691156-3caf95d83fcccdcc28662498a294724.npy +03211117-df2f0bef5a669d6262c440075d5ed193.npy +04256520-63e45aeea568f1b0c35131da26f8061a.npy +02933112-783ba337e5bf328abe81a9109a782712.npy +02924116-c9c6445740eaaa74a495c196d4f0cebb.npy +02958343-511962626501e4abf500cc506a763c18.npy +04004475-3a4e546431684c822f84cb7932f866fd.npy +03211117-e5b50925213ade6a340d4ac30c6d322a.npy +04090263-407324b2f2b89934b5945297ce426f02.npy +03642806-e1773be8392c5fc4f7d4d3ced798ad90.npy +02958343-ebc59fa7d366b486122181f48ecf7852.npy +03001627-fee36ec8c8ae503fc68456e8da5b9a30.npy +03624134-6d5466e70653d80aee22e58d18efdd28.npy +03948459-2f5b4bcb8d4dd901609e2d916fa0da27.npy +03001627-128517f2992b6fb92057e1ae1c4cc928.npy +02691156-902cc09a60a494a278d0cdddb0c08062.npy +04379243-250cd21169a42a2bfaf26c91ad27299b.npy +04379243-fcad199862c19cd97fb247f6727f93f3.npy +03691459-893bca10c44ffd673e1b2d018c0512.npy +04379243-7436f91df61e7d5bc10555abb2efb430.npy +04379243-d1457e572ef95ddbd2096b2fa6f98cc7.npy +04090263-ccf770542367f03f276c3d558130f8b4.npy +03948459-baaa7b7c8a39bfa5bf8434cfd671215a.npy +02691156-f0d6c53d21ae5b5cd0c57f18e8d8830d.npy +02828884-3e81e31d8cd99cdffae0a22d98098878.npy +03636649-5f865b98b4be6abf35836c728d324152.npy +03790512-c9e2437df080309baab0751e11299b9f.npy +04090263-79461905bb97ebc21a77229b9f90bf5.npy +02958343-d6089d1b75c35945b7e8c57d131d2ca7.npy +03710193-26ac0ea516715a5044b2fa2cac0778f5.npy +02933112-2f0a56c30e384642c59350d819542ec7.npy +04379243-3bcd7dc964487b1ae6c5cd45aa112726.npy +04379243-f622d7d6892fe02937251258858a7a58.npy +02691156-e6908f525ab8e6823a562128d0cdc8f1.npy +04090263-14a3a4e859a9462bb335d40260934189.npy +03691459-cfc38353ff8392e73a7dda43d8d95517.npy +02691156-940c9ed5d7610d915d3bbd70fc7759b7.npy +03001627-c98207781087c7c2995e7ab497adca70.npy +03761084-698b37ec06448da7160ce9e819e30139.npy +02958343-b3aea199d8f8945d3c8089ca2f2a9299.npy +03001627-2ae1dc95e09b858128fda76c378c923.npy +04530566-e8d1da5077f0fd3754f4583ac182c2.npy +04530566-2ab688c7eaa21bbd77e7acf84a1c4b6.npy +02924116-79e32e66bbf04191afe1d4530f4c6e24.npy +04256520-dcb434ec43228c7e98621bfaa41dc79c.npy +04401088-3aa3d13575540a99167196b0ec8ce495.npy +03001627-4cc4cb9b533e8b84b04cb542e2c50eb4.npy +02828884-3ca55ce22b40b8c2ad364a967d96b388.npy +02871439-2d68b12e799ec982df18258a84843c90.npy +04090263-e9cd2397c0a7ea86341aafe10fd0cbd4.npy +03636649-f4db9c55f72edb36ad0d9196eb691e00.npy +03991062-bd6ba738a4e40e23cb2a965e75be701c.npy +04401088-ae7098f0bc20cc6b2a87aa332da7bee6.npy +02691156-5efa09bee2cf193afaad157818f6ee1e.npy +02958343-a26d63de878b28fd52980f173b56924f.npy +04256520-bfd09a13ca8d039d24d3570ac22df4c2.npy +02954340-1fc6f3aebca014ab19ba010ddb4974fe.npy +02933112-5a3428f5690f57a7cf004563556ddb36.npy +02958343-77d9a23f45c888e595551e0d9e50cb0d.npy +04379243-737cc2beda4a023619fb4103277a6b93.npy +03325088-2e31697d451f89843321831d2245cf06.npy +02958343-78c5d8e9acc120ce16abce8cb03e7794.npy +02933112-e2d06603fba3bf3310af74324aae27f.npy +04401088-e0b1cb72aba261731fa8e666182e8619.npy +03001627-5e259c1b8640f5b7dfe5fb64510022bb.npy +04468005-1aa05c2e358d09b52470de2774d6099.npy +04379243-6f39877ac66ff1b55936c7265c890fef.npy +03642806-e34a4bd815f38858fb15d1c4afffaed3.npy +02828884-107c0b6b32282102493c8fb81dc7c4da.npy +03001627-ed953e5d1ce7a4bee7697d561711bd2b.npy +03001627-6dfb7b5b4bd0d5f9febad4f49b26ec52.npy +02871439-c9bccf9e749da5d6742728b30848ed03.npy +02808440-8604c03fb772a81eb362845c6edb57fc.npy +02828884-bee41df71228b870593ebeeedbff73b.npy +04256520-94988ca3a0f73d16cabc196a7f35f1aa.npy +03636649-ef45c648fe3b0dde8449e0b8dd14796b.npy +03001627-fecb6b1159091d36d0176f9a144100cd.npy +02924116-e17c497806951fadcb4d826afd1c8fdf.npy +02958343-3ac664a7486a0bdff200a72c9245aee7.npy +03467517-e7b57f47d2ff2093f0194265a9746c.npy +02691156-8615e879f5d72ed5860c8fc9227db68d.npy +02992529-a13cea3066cd5b1746ab0c6c4666145a.npy +04099429-3a571503ba7f70c73df4fa4547276fc2.npy +03001627-65da0b239837b0f3f3ee5e8ea028d6.npy +02924116-b445a7e6f824f2db6a6393c63592ba88.npy +03797390-67b9abb424cf22a22d7082a28b056a5.npy +03211117-cc499148f0e031054b8def6cb3b321af.npy +04379243-9649ef758d3334c74500047017815f5f.npy +03624134-5e14870221caf3bb1395331ebe4786cd.npy +04379243-dd24fcb1ceb67ded3d937a346d1565b.npy +04468005-78430d9dac1f443a43483de0903bef89.npy +04379243-4768cfe825063ef930c15a57aa97b3c6.npy +02691156-ddb96cc263869979f446f92b52bbd82a.npy +04256520-9f12f8119a52b141effcc073d8ec38f6.npy +03991062-37853a4a1a918e9ea4de89c8b25b5088.npy +02691156-dcb5bded8772135b4295343ee7255799.npy +02958343-9031339141bad8608f89f9805dc3c90e.npy +03211117-3529cd0cb733596bc22a9d71e5721aa6.npy +04090263-b10748ed5e3e01f99464f279e4e22634.npy +04379243-16961ddf69b6e91ea8ff4f6e9563bff6.npy +03001627-2475ead1cfa0a5a6490ad276cd2af3a4.npy +02958343-6103654b252c5d3bb1bb46d2556ba67d.npy +02691156-a4c41dc85210c3a0ae049cb809622fee.npy +04379243-c074e43821469150d6084fb53091249.npy +03001627-609d3b4977310957909e1fac9945adaa.npy +04379243-da234c874b8beef22e1a5fb6897c8678.npy +04090263-51ab5dcd79ccf3b5ffd7722cc96c6452.npy +04256520-e5da166f78544aabd37035c74acfab37.npy +02992529-fddadcb723b843eaafb07a946d621b3c.npy +03001627-85b73c87c4c73263a7c64d6a7060b75b.npy +02924116-c01459435b19e42b52470de2774d6099.npy +04379243-58cbc849279b38e0c16f7010a3b8fdee.npy +03593526-bd96246be9854deedfd64b437f0ace42.npy +03001627-3ae022522800685c610195e4fb10d1de.npy +03211117-34f6cff3e8fb6315fc2aaecaba21de51.npy +02691156-fac9c4f0d5f239e4f2b0736dd4d8afe0.npy +03790512-828210e9d0a307c0a9a5251e8f29bd8c.npy +04379243-f5a42533b878229d942b01e78b9a302d.npy +02691156-ace4fe6e9c97150a35fc197bbabcd5bd.npy +04530566-9746bffb188fa8d776dfbd72ad52dca6.npy +03691459-a24796b40f26be4a19f048d3a7935eeb.npy +03790512-48233d99d0bd59e5d8a587623571014e.npy +03642806-e4c34c87ed1bc2191ef7a71d6e01357e.npy +02958343-83e5b5a3f3aad942ed29cc2a32e4bbed.npy +02958343-c2467fec08734fc81e1473be174fcabe.npy +04256520-f7b17391a903c29ef84b0be7f50940eb.npy +03001627-a3c1460f50bd470dd064b65ccd89778c.npy +04530566-cd67f7d1ba943b162f84cb7932f866fd.npy +04256520-4dbe50ba1f562fb236413faee81117b1.npy +03797390-5ef0c4f8c0884a24762241154bf230ce.npy +02828884-ef1149155829a5175c7dbebb6c018341.npy +03636649-6efc48bb9267c2ab4c6deb9ede0648df.npy +02933112-cc198051642f31029a88326b888756d7.npy +02992529-5a28460645d4a28c7fa29a3ea424473.npy +03691459-af39a67dea9ff78bf46f716b2b22b550.npy +04379243-7a1d2827369011344d3fed2e930520c.npy +03691459-f6d4918c7dd190447f45370489ca3156.npy +03325088-e9dc5059372ef82e7843fb4efdc19510.npy +03467517-950b02a2db950424c4a359bec2c17427.npy +04401088-d406eebe0342fa8373acc74b15c67e07.npy +04090263-1f755931c16980e06ea2d3b1b25fdbb7.npy +04256520-9fdbd10380d433d0f564f8e3eeb8449e.npy +04379243-b28f6acc151cc20e19fb4103277a6b93.npy +02691156-61e8e8a7ea726a03c79f92df566f8c6b.npy +03710193-976e6d4efdcb81a0e9c2721ccab8cde4.npy +02691156-634de14a7721145fb3f2b01de37c0b29.npy +04090263-4a32519f44dc84aabafe26e2eb69ebf4.npy +03691459-7599541dac4a89ada1efd4f01acbedc.npy +04379243-e21fddb872844e02713f2e93cbeac35d.npy +04530566-7773c432613c96596cdd81a51107bb1c.npy +04379243-c3959f18e44ed46b40f4518b250404ee.npy +04530566-423f4d084e13106db75e46a5ead1e5fd.npy +02958343-f4822aa5b83b28cb35840786ceee5cd2.npy +04379243-184c944daf00dc9919fb4103277a6b93.npy +04090263-36b65f1b9161a5f231f3d76ec3df45bb.npy +02992529-2a6d70bc7ac6db391d4136675e1527dd.npy +02871439-47e8801869f3dd62ecb0f4b907025ed.npy +03001627-c4cab2a416a4537e2871cc0b3cc1a485.npy +03991062-2ebe359d8cf7f6aba2c59a4d90e63212.npy +02691156-e416ba617d5388401b0d75a1d7e2d58.npy +03001627-20e0e65d8a10a88f91b8ec332e6d93da.npy +03211117-8f9c63f788d0044dedea6f8de4918c9e.npy +03211117-fd2f94be1061ff2ac92f2f0063445de9.npy +03691459-a8de7f2c7e00f9a01e5b68ee10358ea3.npy +03001627-c833ef6f882a4b2a14038d588fd1342f.npy +02691156-d15e3519a61c5bad86442c51e82d8d69.npy +02808440-532ea759470c7e0b3321831d2245cf06.npy +02958343-c0b9eb823b9fff9a2764cfba57a5de73.npy +03948459-7c799e8aa1ea1d29804fa2d77fbff970.npy +04530566-83ca38043fa57a7de8e8428fe69dbbc6.npy +04379243-3de638f1ace536c41b17743c18fb63dc.npy +04554684-67e25e8640583e8d91219aad82abc053.npy +04090263-faf6a45b04c24fab1d9b004d9d8d2781.npy +02871439-2a40f207dfd0d77727eecd8b185d6f50.npy +04401088-d2f3eb92a31649647c17b7a9bb17a24.npy +02691156-4c0f48d49805a37298a97ddfb532e08c.npy +02933112-a1daa27571e67bf7239d26686a11c3.npy +03211117-977da77136819715cf8a1b5af7e0bc1d.npy +03211117-b4386438057e85988bfba3df1f776207.npy +04090263-934fabb18c71373f1326f2506129299b.npy +04379243-4a9ded4f31e089129cd1fe76686a65.npy +04379243-2b0c16b26ebfb88f490ad276cd2af3a4.npy +02828884-abf250a01f526137a035c800c58595d9.npy +03001627-65ff1205a5f89150315ec3dc61760fd2.npy +03948459-ccda5c751d3feb951e824347c651d873.npy +02828884-4f44a4d47a8911c4f155d75bbf62b80.npy +02933112-7f60f68c48e67cfb422ac19d4a83319e.npy +03761084-af1e967283fa203110b42f6d9481f5b.npy +04379243-5b0d2362c82416695b903ba10d2ec446.npy +02747177-9f9c097de7167031cb2a965e75be701c.npy +03001627-23c4d774910c9ce03c832f0140db42bc.npy +03001627-2ca81da56f941624191c3762b497eca9.npy +04379243-871530f9e0ad4e2be6b70bffe12b936c.npy +02828884-d25262c74c8269a04c80535a28040aea.npy +04090263-43e2cd954ae1e3ed18bc22abef3f86ce.npy +03467517-32dae2a523aea5cbf9165190cf65b885.npy +02691156-98168c1772b769c0ea1bd6f2443b43e7.npy +04256520-ed151b7e31cf582ffe00f644e4f1521a.npy +02828884-b2b856a8e25eb566ad5067eac75a07f7.npy +03928116-7387007f9b6d551cab2c39e7de6e100e.npy +02958343-ac3f9387cd4319592a9eb0f146e94477.npy +04256520-aced3dd677d1e2c46ef340d5b029818a.npy +02828884-5121a485a7eebfec5674b1bb8d658d39.npy +04379243-70562998ddeecf5ff5816ac43b9e4b2b.npy +03691459-4d033564f0dcb412afac285245c66df0.npy +04256520-29065562beae791be069c558a1f154b2.npy +04379243-11c16f6a5fbedf4213c3458a0fe5598.npy +03636649-511917ee5ee2f91649244b68aadec703.npy +04530566-c4830136a2451f8f45aff212946058fc.npy +04379243-db5a895ae7358c97b66213207f46bee7.npy +04379243-e97b4992a642a13c789195d85b2f8718.npy +03325088-84c1ef3fc2a614deb362845c6edb57fc.npy +03337140-839996ad49bfe12aaee45fb27ad3a6fe.npy +03001627-a559b02ec38b9995c5fdf6b0c2c57721.npy +02933112-7227b96bff4e94a86f9e9f74beb7c348.npy +02691156-6615d159d2e250376969ef231a00a44b.npy +02876657-6d680415396d14d4d7c5502d4a22edf5.npy +04530566-404061915066692d89e410fd8930ae43.npy +03001627-bf1dce61ba47209189343fd44bd400d2.npy +03467517-1c8c6874c0cb9bc73429c1c21d77499d.npy +04090263-54fd9a41c1e7b94329d95b93a79ce1ab.npy +03797390-46955fddcc83a50f79b586547e543694.npy +03593526-be9bec33a4c5323a7d44dc16af152638.npy +04379243-e881a6fa6c3443ad5d28221e3b996124.npy +02992529-2ea4a3d502b12c61707fb0d61a11775f.npy +03624134-a996f7e1614e0c8e6c51785addc24406.npy +02946921-f4108f92f3f12f99e3ecb6fd6ed1dd90.npy +02924116-6a4a5125ed80513aa4667b5cc14ef4e7.npy +03001627-fd05e5d8fd82508e6d0a0d492005859c.npy +04090263-b13e4eef50c826a2fcf264b62ed090b6.npy +04256520-5b9919f927005de3b867e31860078994.npy +02828884-868d86e47bcf7c9d1dd03d3141d85a03.npy +03691459-d457ef805b078d037f5e8f62dd90fb59.npy +02924116-9171f8d3aed990fd1759ca9eefe0e251.npy +03001627-47cd848a5584867b1e8791c225564ae0.npy +03691459-55e58eac4a2e7f4c24abfaa350249967.npy +02958343-45c88ab8a670797a134736201a79843.npy +03467517-eaa2ff0101bbc4ac352b6518abcc1cc4.npy +02828884-7a4a9c948c54de261dee989d1177ef4e.npy +02946921-3703ada8cc31df4337b00c4c2fbe82aa.npy +02808440-1fb49b048e21c27344221bef0fa3c36b.npy +03001627-b59735c72cf9af0c17b431cae0dd70ed.npy +04379243-47315d244171ef7171a782a4379556c7.npy +03636649-66acf7f6883db6a377b9297f3055210.npy +03636649-963e6743370d5c5c9b5d51fa8cce1753.npy +04401088-3bc6f902628b3f7f85f6153ed2033a1c.npy +03001627-6ea4ccd680f3635b14038d588fd1342f.npy +02691156-49e9aa7ffa2b1a25e9d8a35d7a1fb08d.npy +02924116-92766794a46801bfe8784f880dac0f61.npy +03691459-62729cd3a4f7403f712b392cfc0c51c0.npy +02691156-1b3c6b2fbcf834cf62b600da24e0965.npy +03991062-cc5d178dbfa91919beedb4c8fd29e2d1.npy +03211117-1308ff4c4998cec02918c93bdb2b63e8.npy +02691156-4377ea17eb17fa79216b327569dd806e.npy +04379243-a5d5fc6b0bb7881419fb4103277a6b93.npy +03001627-8ec3459ab9fa3ce8738e43095496b061.npy +04530566-764ed516b7f5f7e16b74ad4a219e448d.npy +03790512-12ffd15dabd7e3b596b84415a3f1393b.npy +04004475-4f891a5300d8b10b55b46d261fe0021.npy +02958343-84bc3155bc5c95bfaaafd94b9f216ef6.npy +04099429-796073614ef36a40a336873d5d63a7d5.npy +03046257-a538df6d82a197dd95f577622f465c85.npy +02924116-b74ad95e6bfc346062845e894af87f76.npy +03001627-5d681a38c0de5545205884f75aba3a.npy +03991062-a7bf27af31391712cb2a965e75be701c.npy +03938244-3fca753458f2b44c283b00891f680579.npy +04379243-34feac86a178437527eb00c151c6f711.npy +04090263-3da01ac97bf8e71b12b38b1d99376c0b.npy +03636649-1facaa0eb35496fb69783ac218a8a2bf.npy +03325088-70cf2fcc591044323321831d2245cf06.npy +02942699-5d42d432ec71bfa1d5004b533b242ce6.npy +04468005-dc490f62c19246fb4d04aae9d29ba449.npy +04379243-e15d98f37565adbe650ec61be62e0cd4.npy +04379243-66e0abda60998bf61a96060575291b6a.npy +02843684-8a159ab6dc7b409cc211ff482a022b4d.npy +04090263-2068c2f0972d82e569f9dfaaa2301a49.npy +03790512-7c4fc3a05d5fc8b1d0f568c31c1cd62a.npy +02691156-2893dc61be63a8a16d0ff49003c479bc.npy +02808440-393484a5228413b777138b91927032b0.npy +03001627-460eef2b90867427d9fad8aba2c312b7.npy +04379243-14922c38b2cbfce6fa31c88352968918.npy +03991062-3152bd6fb7bf09d625ebd1cd0b422e32.npy +02691156-56ba815f883279b462b600da24e0965.npy +03046257-32197ef6ce095472e59f529cd1b6faa8.npy +03211117-36ac6a08317e2c618f533a7f52262bdd.npy +02828884-48a9e1be51e751eec4da326c9127fbbf.npy +02933112-6543e0c78675e6eb868fb986bc092533.npy +04090263-2d2f48b293f5ed5d40385522d1beeb20.npy +04256520-1a78f3397910037885f6153ed2033a1c.npy +02933112-c817934380830ccb4da5feafe6f1c8fc.npy +02958343-e6643b95e245410b8efc69f75162eba1.npy +04379243-684dd5cc9c642f98f2dc935ce0a740fa.npy +02958343-fc6f6309eefa5178590462ce3bd1e59f.npy +04256520-fcff900ce37820983f7e27638e63d848.npy +04090263-45a756b1fadf20c7dd0a2071dde26395.npy +03636649-73a4a5e3a27aa7fcb9f5f10496f09f56.npy +02958343-c06a5f0315b3784dcece4698ae3579cc.npy +02958343-81fad64b8fd8f010b17445a1c29f6d34.npy +04379243-c6d1d2f8261885abb2c2cd006d206129.npy +03948459-aec662fe0a40e53df4b175375c861e62.npy +04090263-384d3caade76bfbda84690bd684fe15a.npy +04379243-497659c4723fbc4fe90ff84c89de437.npy +02876657-fa452996a220dd49257c84a0e95a18b0.npy +04379243-385521a6e023307644fad574b043beb8.npy +03636649-6e913f0b67bb638288c10250d0e7fba1.npy +04379243-4b5536d2e9c5b9b7febad4f49b26ec52.npy +03761084-dd96916749ee3939e793cc5433bece89.npy +02691156-732ff6155a096fb0151f2df200a24ac.npy +02933112-8c60fe0d274ef76f6b983cbae7aad051.npy +03211117-fd19c9fe3d5e58549c4081063e213a15.npy +02828884-f934f89d094313362056b4bd5d870b47.npy +03001627-c62a17ea91815a7a492d9da2668ec34c.npy +02691156-94cb05b56b89aa2223895f8c849f85e.npy +03467517-e3378988d0aee759d48b953ad82bf595.npy +02958343-70048a705ad4363642db06daf723ec44.npy +04256520-62852049a9f049cca67a896eea47bc81.npy +04379243-3863d248581965c0f42980cb0dac8238.npy +04379243-d92354e060c98854b0ffd7a60ee2298f.npy +03001627-d8b189ddc0ca5b8c681404257d94ad9.npy +02773838-7565e6f425dd6d376d987ae9a225629c.npy +03001627-7fbdef802b9e160cc242632b2a8c3129.npy +03325088-7313e873a641411b979c556124bee033.npy +04256520-28b9e6b16443e183fcc04d1259a0af57.npy +02958343-107699ca67fcdf3fea999fe4ffdc2504.npy +04379243-757bd36fa1b0f3984b3c42e318f3affc.npy +03761084-7b53aa1ce95b1efd1773834ba0a5df02.npy +04379243-208903274bfe69cdc5d1c45cadcaa3eb.npy +03691459-cb904746fddde134b9e8bdc9c4a49aa2.npy +02924116-a3a75e027a5274261bd9a8f6e632e88.npy +03001627-759d66c5dcf1cabfb99d75d512b660d0.npy +03001627-7212f652dd37232a80360680c1602c7d.npy +03001627-7a5215c4f74afd1af7c7ad2549a1b15.npy +02691156-2980f6ac8412890548437f47a316427e.npy +02691156-618b433a97bc23acb1f09c4591ed2db9.npy +02691156-26950e05ed379413bbf3143b1cb6076a.npy +04256520-9cfeab8ccdb908a7ada629e23b16719.npy +04468005-5dd23b3d7247b98b4c3a35cee92bb95b.npy +02691156-aa21bf2a545e710cf68a010d0fc56333.npy +03046257-ed4815a2c0d6e641809222e4341a7d65.npy +03001627-2c7d258bd18de1c28f7b968097bdb0fd.npy +02958343-74b73c2cca45cf483c1d9add3a87bd2d.npy +04256520-26a6dd90bc8d6a0e227f59b6a8b64739.npy +02691156-3231fc366c6f4f3cca8607f540cc62ba.npy +04379243-bf6c171ab896774d2f95e2a1e9997b85.npy +04379243-e55dde3c1153ae5d7eb43b1b22d3185e.npy +04530566-a8daa7461ff94965c0be177939e290.npy +03211117-e6a0a8940246d5bf4e104a60eb91ab8a.npy +02691156-c88275e49bc23ee41af5817af570225e.npy +03691459-2aad0ff91e947e64baf402ca36cbac3b.npy +02691156-63c78352b218c01a995425f067333fd3.npy +04468005-ed66247c141a18936ef38ad304e9224b.npy +02924116-60c404b902c5680985718c281d7fdf61.npy +02958343-14121abc9e2a868e52ab7aae4be20d81.npy +04379243-5d4eec616095ed87dbe6f297e0ec0d5e.npy +02691156-a8c4288e4027e6a319ba010ddb4974fe.npy +02691156-790e9d3a9e037d3efa86938af3fa9595.npy +03211117-132df41128e6b43356fd3a55668db806.npy +02958343-c849164176944e08e39b6a0d304ab967.npy +02691156-6812a13a1a99f0da2f20ac99f64093d.npy +02924116-63cb99592744321415a7b5ba389301f1.npy +03636649-ec01e8b79f2d07df784a45ea6efa1d77.npy +03642806-b9eb4471432dbbc3e4b68d3b17c43658.npy +02933112-3076e5d4a8078a0c59350d819542ec7.npy +04379243-c6304f008d2a44f81943903831aa7f4d.npy +03001627-5539a4a9f2f1b45f3eec26c23f5bc80b.npy +02828884-14af4a9931635c75f4fb4dee5181bee.npy +03001627-81158ce36c90c319740641939c9d6dc9.npy +04379243-68a7bad2b06bc1a9d93768e7b9b1eabf.npy +04379243-3bcf1f68540a478de2680d1a8f76531.npy +04379243-f7921f51bcf7e93b24a15e3e5e0014a0.npy +03991062-f5ecf2549d458beebd4a7a372c75ee76.npy +04530566-c680824e615c772d18d5c097fe7ed300.npy +02958343-86c8a3137a716d70e742b0b5e87bec54.npy +03991062-1e42e5b37a46fd9c3202f7933a14e59b.npy +02933112-4ec97e83a1e9725c77a332e31ab74b68.npy +02691156-de001f9e2311dffb7209009cfb89d4bd.npy +02773838-5afca35479b347786f0abe366609662.npy +02876657-ee3ca78e36c6a7b2a367d39c852840d5.npy +04468005-3b8c505fd1127ed88f134472f61cf6bb.npy +04379243-9ad79b67c56ead5dc862eec8232fff1e.npy +04401088-bbd5005058f01a54909425bd531e6033.npy +04379243-2854c3a6724724dbf5561b9d69a2eca7.npy +02808440-79db8c9f8cac9aa680ecb974987586f7.npy +04554684-5bd6bf181544ca23c5d1eba75162ba.npy +03001627-5d20adaf6d8f89fa2f1c10544d7d6f.npy +04256520-af978eb2f903536e5b9e30b3558dc362.npy +02958343-dc8765720d8d3828b3cf5236f651a8e6.npy +02933112-46bb63196198ffa2fc98aa4b97627df6.npy +02691156-77410e47feee769deb1a0518c224975f.npy +04004475-a74db482402e533d9d23dd9e1ad481db.npy +02801938-e3bae8da192ab3d4a17ae19fa77775ff.npy +04401088-3f4a507d616678da650fb6b8f6bf3419.npy +03211117-767a4f06f66596a4d0e90ab6c6492cb4.npy +02808440-99c5407b80625a0c904e03fa15bd73ec.npy +03691459-6c1ab06a1ae2471e86bb0379a61a0978.npy +04379243-60ebae123ae653e2a4385667567ce9e5.npy +02828884-a06d35db2ddc85e29656036c096710ba.npy +03001627-cf391bbecf5926ecfe51dc4aedc63243.npy +04004475-132325926d85caa6d0c63a304a95442d.npy +03001627-59b45e83bf13e8e2374110224c1c4eb0.npy +04090263-6cf8bb50d1a8f0d7663e90eaf6b4ca52.npy +03642806-229f440bbd8f5482355323b019d9d87e.npy +02691156-d390f0246fd43cc8bd46d022fd7d80aa.npy +03467517-c0cf37064ca57ebd93f0194265a9746c.npy +03325088-f2a2ad135f62a8351875e8709de3862a.npy +03001627-d645bf9037e7dabda341228b21d337a9.npy +04090263-6e91124a4ecaa1a365564d9c2ed3b493.npy +04379243-98482492d4cd11698a40b9ddd9e5eea5.npy +04379243-78b4eb949311548236da5f8a6c22b2dd.npy +02691156-6d752b942618d6e38b424343280aeccb.npy +03691459-27415ac0b56e87528dfe57cb1b540899.npy +03691459-15e847b20d22d56cd288bc0586930768.npy +03636649-f330eebb153447181735ea0e092a805a.npy +02691156-98480ee19ba4dc93ef5f09964a6a1f97.npy +02958343-4eb276926f620fa831354a729b0d6b5c.npy +04379243-6d59cd216e896670b7562ed1f28478bf.npy +02958343-8498fb254e1669faaaafd94b9f216ef6.npy +02828884-a11caea04fcac4f5643a8f56e2ede6dc.npy +02808440-25e9f914f5c18b2b3321831d2245cf06.npy +04379243-3f9462d720929e73873bf2cf33e10943.npy +02871439-9e509b3774ee8c0a398c13334e998500.npy +02958343-5b423f02b76df0ec1472a7f3e4685aa.npy +03593526-31c50baef63a3cd0b64920759fcc80ba.npy +02871439-43731a6a4bd64ae5492d9da2668ec34c.npy +03691459-ab6b43b6529d6d6f9580f98cb259b96f.npy +03001627-4c775cfff4afba83b02c91492945da50.npy +03001627-76f2ead0035fdb2ff94d7e6d8577c8ff.npy +04090263-7816689726ed8bbfc92b24247435700c.npy +03467517-3338f59aefd2066f5b3335548350bdee.npy +02876657-5a1e624764af0205bf8b9d530de7a108.npy +03636649-57930764a16deae9b219dbeac7819b2b.npy +03001627-aa7489c9c7cd0c1dc3a1be62b60323a7.npy +03001627-c465b7ee24741eea9edd9a0b28d406e9.npy +03636649-a0dfc97cf85ddccdac42bdc1d2df4a3.npy +04379243-7bbd69e2b6e1bb49f7075cbf4d009544.npy +04256520-8701046c07327e3063f9008a349ae40b.npy +03991062-a8b41d9e570e2a8e7afd114af4bb7b4b.npy +03001627-2a0f4fe08cec3d25680876614ed35a7f.npy +04379243-1f64fc95a612c646ecb720bdac052a97.npy +04379243-b63ab8d3dd4eee098d95727c923f3722.npy +04379243-7d518c96a145547073ee7d53b833ad02.npy +02808440-4cb7d2c28ef5d4d854d7082b34825ef0.npy +04379243-fba0f822f16932aa10566a0096ed09d.npy +02933112-575d99ba4197caf041ba999b450870a8.npy +04256520-fef42356f1acb01b593ebeeedbff73b.npy +04379243-52e7aecf3ca3a0db391e4d6c585a697a.npy +04530566-fa18c9283443b67388fb22c0c1b2b173.npy +03001627-62aac1b94f2b98cb9f9a4edc4751ad63.npy +02958343-1355f3aa779b599b16abce8cb03e7794.npy +02992529-a1c60f087535c7726fde3adc6768fe52.npy +02691156-a097428376f298abd872dc56d048665c.npy +02828884-69f724fd745669fcda56795a6fbde1f.npy +02958343-380e0c29c9ea00e9ce158c6cc0278580.npy +04379243-731b2115d66fc850999b33727fe6db14.npy +04090263-d77515679ddbcd9c8064e4301e947b0d.npy +02828884-5ce845f80b1d407282dde982679cd879.npy +02958343-744f3661d9030c059cc32a851e7d6f32.npy +03691459-dcf84867f92cef75a9c2f34ef56404ef.npy +02808440-7a3541431dbfc5d6dbb76013b759885f.npy +04379243-ab463d43646bd5dcd27b31bdeb5f5c79.npy +02958343-bc75e8adfee9ad70bda733a39f84326d.npy +04256520-7f6c75c2d820337b69867582939a3cf7.npy +03710193-af6f76f4e447991b9d6be629f8f5773e.npy +02828884-852d65fcf7abec4a301cd89e7156530e.npy +04090263-f154291136c45c24545c558f9b86cc0e.npy +02933112-b60bf64c7402978555a060c097fa68cc.npy +04256520-6d74c6092567868b65d5de7b04a51b37.npy +04379243-330b4c2ab42bc715f1783a44a88d6274.npy +03790512-992fbae5178edcbc4e31d0cb4d7568.npy +04256520-bd5bc3e6189f6972eff42b9e13c388bc.npy +04379243-a70771fd3bf24d65c16bd6fd1b8c7eae.npy +04530566-df575767acf17d7188ca49762bf17cdc.npy +02992529-5b826c910108d27a684b810d277e0e9b.npy +02958343-180d1e3463c29355bda72093f9b5aa73.npy +02958343-50e986077b994d6aa848f24544821b25.npy +04379243-519c9687ede3906dccda8d28b44378b7.npy +02924116-ecd4e00fe0ce46dc5d3130ea1c8a44ad.npy +03001627-175e2a8cd6e9866ab37303b6dde16342.npy +02924116-f59a474f2ec175eb7cdba8f50ac8d46c.npy +03001627-a9eae610d9ab7c40a7d147d66b8f507d.npy +02691156-f0e7808ee55510be1a7dd57f67482196.npy +02828884-702428ed9e72d74456f6fc4b4ce1db04.npy +04379243-b659c2162c4ff214684b7bc3f8a9aa55.npy +04379243-ee5dda5cfc8349caad5067eac75a07f7.npy +04379243-df811f7a858750875634c21965ee6bab.npy +04379243-6fb986ed2a4db0c1bc7f8f77923d8ffa.npy +04256520-549f6b723e4bcc91e2cded16638068b.npy +02691156-f485dcbd466f217286774cad40dd456a.npy +04225987-aa886bed91a13113d5498a74ca9ca78b.npy +04379243-949e39403ab4fab37ade8e3ca8db8db3.npy +04379243-416af739e6ae8b2ca9e3e4940ed610e4.npy +02924116-e06db4bbcb51cc281f3f27ff04a4459b.npy +02958343-965000959c53a8612fdbcd3e1b829315.npy +03636649-61555024958cb5efe4e7668ba612f00.npy +02828884-fcfc935c2ff7c66c858699aaad4acee4.npy +04379243-3d929eab6abafbc5cf004563556ddb36.npy +04090263-9a5e20b8f1881145d735fa1ab17311ec.npy +02958343-be86ce7f7aec3ad4f9e07ddc212a2f71.npy +04379243-7d040b260fae0807a2d3cfe77a14b5f4.npy +04225987-994dc9307a0f228e30eaaf40a8a562c1.npy +03593526-3c148476c78123f3283b00891f680579.npy +03636649-302c3b1ea1a86a1ed2da3773f06dbf7.npy +04256520-71783c8431b28220593ebeeedbff73b.npy +02828884-50c0de8fb13d6421dbbc9440457e303e.npy +02691156-8cf06a71987992cf90a51833252023c7.npy +04379243-2da415184cca0aeb2063f99c33f5c49e.npy +03636649-7e5b5fa94575f873c2e0b170f2ad8bc.npy +04379243-f19fb80eae2ed668962a9d5e42f53a23.npy +04379243-15bab3d19de247cd9cd431573238602d.npy +04090263-70ec646e9929c7cb9a2ee232a197081e.npy +04090263-6d247b103dece20af500cc506a763c18.npy +04256520-65fce4b727c5df50e5f5c582d1bee164.npy +04379243-565ad2f2a4caf3429d297e74104d3ac3.npy +02933112-3167991b1c87967ac59350d819542ec7.npy +02933112-d347f6e236975a6b7c4767a4f4c46bba.npy +04090263-528bc52f211ff34ed2a72bb74eb549ff.npy +02958343-a3881c3f4e8c807f2a9eb0f146e94477.npy +03001627-c97f8f3d828173607301b41e73e277b0.npy +04379243-59fe91d51febd1f3c83a073fb943e852.npy +02747177-b9b1108520918039a47fdd008f2ae822.npy +04379243-265851637a59eb2f882f822c83877cbc.npy +04090263-1dc15b9574f88cb1fa9286f039319ff7.npy +04379243-59a1703cb9320c018f49a52c8d710d0f.npy +04090263-61a0bef6e9c5a01dfa6c79a0c671edcc.npy +02958343-1cd4a2c1b3b4a9661487189ebf835715.npy +04401088-ce62e8c8a75a501535c433f6b651ec89.npy +03001627-9e08476e458e21519fb4103277a6b93.npy +02992529-c7e4a425cebaa04bf9c8feac0b33491e.npy +03001627-33e28d560bf1bbcc32db3218111111ed.npy +03636649-8872dceb7ba9f34c140406de8e63ea3a.npy +03001627-7573185356240f5e2b4f3c9a4b815590.npy +04379243-164ec64e7a28c08b221ea40148177a97.npy +04379243-8e3524b6312f60738ac5263758737a81.npy +03928116-f90c23de385d10f62f5fb84eadb6c469.npy +04379243-19c5696d315c359dda90d20b69102dd.npy +02871439-625ee2fe616a92c8d706ecb3379aa341.npy +03001627-94f9fa9f8a20f7d040ef1c8b63a628f9.npy +04090263-e3f16aded8ea5a2fc79f92df566f8c6b.npy +03325088-2003d9e8ba083c4e2f066782346a992.npy +04530566-27bee532a7cbe5dbc4bd6e2ad0dc6de6.npy +02924116-148441ff0fd22c774d9ae46885a85f72.npy +04530566-fe482b5db6daa95f88e2183678696c9a.npy +03624134-57795189a634e21fa0f8e9a2d8ead2d5.npy +03636649-5254dbd4b24449edfcb8d8c6d4df8143.npy +03001627-9d0ec3530b39e89640f4518b250404ee.npy +02924116-cd6f59fdefeeb46273873da0bf53928f.npy +03624134-d6924db1f51953eecaecbfc7057f661f.npy +03001627-9c339d9fd8068f81351d9ca36f76b95.npy +02691156-d2daef39d1cb8d027089ddd41f4af842.npy +03001627-56300f790763af1a872860b02b1bf58.npy +04256520-2bb1b5865455b2b814513156cf2b8d0d.npy +02933112-45553c754e1132533fe047712e43e185.npy +03211117-b8db7ada8acd039a3406f1378b19168e.npy +03001627-e3d3b3e060ef84c93ed60220ff139f8a.npy +02958343-292f6606c6072b96715e04edb8af9c53.npy +04256520-bb31bd378273e437f4b35f4029eb1ecf.npy +04379243-d81df8f708d4360c5e05d85b12fbe60c.npy +03948459-194195123b03cae8912fbf9a0eb12fea.npy +04379243-2e71bc549eca25fdfebad4f49b26ec52.npy +03790512-655b9dd9425cc3a12a45a87054fa7272.npy +03593526-739f97be019f29f2da5969872c705114.npy +04090263-a759e6ddc0378dacfdb02ff6a9949154.npy +04379243-cff664776c56345a6c71cc363c51a922.npy +04256520-1c54ad94269d0e786abe5555a3b447d.npy +04379243-8db2878df7471c53e45ef4135c266a12.npy +02992529-e6cfa46780f8634de8d86c9b116d4e0c.npy +04401088-57632112a9128a16a82783081c89c0aa.npy +02691156-413a85d9cc7f19a8b6c3e7b944b34fa.npy +04379243-a767beea4085c58d301fa758e52a6264.npy +03636649-e120efa70ef8efa71ce05d96d33be415.npy +03001627-c6409b289ef9aa2176f028c3dd1719d5.npy +03001627-ca53f7ce3b6951ad3991f56363dff980.npy +03691459-384fbf785f1691d2d747b49524a1246e.npy +02691156-a9a7f21271b3efbaf446f92b52bbd82a.npy +03467517-e585e31db7568c4cf0e1c0df18936d05.npy +02691156-224a8b6776a242f8adcbeb54f3d014e9.npy +04379243-316021f1937b32c8e3e78c911e081c08.npy +02691156-de9564aeaa585a6ccbc790a63192d2ab.npy +03001627-e3e76d624f1f855bcc8a9c365968620.npy +02954340-13295f09e0e9e5d4a6e67635b9d1cee5.npy +04379243-490b186d11cf5675a872860b02b1bf58.npy +03001627-dcfd665cdc0b01e7b04cb542e2c50eb4.npy +02871439-c28297dff455c1d88abbce8b0b4c2d45.npy +04379243-951d129ced4e7d13cd4e8a27ff8b78cf.npy +04530566-73fd73a8bda002eae8d6be23f236225a.npy +04379243-7afb1812e86fac4f492d9da2668ec34c.npy +03593526-44878567a2cae5f8b5e1005644816d9f.npy +02691156-ad9059778f3e34ed4c3a35cee92bb95b.npy +04379243-ad92bfc65465091c48d90eef8384210.npy +03991062-408717256509036d44c183864792bc2b.npy +04379243-146ecd9d7712eb81e6c5cd45aa112726.npy +02828884-c8fa692760ba875848d791284650e46d.npy +04379243-ea9e7db452d2df55d42ec7e303174a87.npy +02924116-50866b5fd13389b4193d7855ecfc1bd3.npy +04530566-1f7f1d7c3882f638fb64f9487ce62dd2.npy +04379243-be5501adc4564d9edf30786b8faddb78.npy +03593526-a258544f4f27cb7fbbdc99ec57ef9c40.npy +02958343-7d59691881b13cc5702956de1b65c053.npy +04379243-d6c875f6b3fa82fd9aa3aca17bb25c50.npy +03001627-96cb0c919d3f379dd0a96520c31993ad.npy +03790512-f06b4f382bac9c9a5a6093c81238167a.npy +03928116-231a265be57b08cd521f9db09805b6c5.npy +02828884-8f6890cfdd98450f4f782ac57aea97b.npy +03001627-b654fef8eb98e99d65ba78ad9601cf1b.npy +03337140-334b5457151b0cc4492d9da2668ec34c.npy +04379243-2bbd62449b56abee659dda512294c744.npy +04256520-e6ecc4e6734f056855f9a00acc25f137.npy +04379243-2e990f9b5c2bb3098eb91f418e60b82e.npy +04256520-575876c91251e1923d6e282938a47f9e.npy +03691459-70acca9ae753b952c71de83a48ed3076.npy +04090263-bd48edaecaea23d65814fafedc6971c7.npy +03001627-ca23c31de817db9b67981fccd6325b88.npy +04256520-1f9cf65275610cff14038d588fd1342f.npy +02958343-42ccff0d88276152e341b5704aa568bd.npy +03001627-b6843e186082096ebf80985a99195eb8.npy +04330267-a9d6e7fa088ddf177fde87eb01f5851.npy +04090263-14139593048f806e79093d8935cfe4f0.npy +03928116-854ffe2c60091876e07a1c4b84dfd325.npy +03001627-8b52303e5ee47ac617ffa9a4ab48724c.npy +02876657-15787789482f045d8add95bf56d3d2fa.npy +02958343-504e8dbdccd8beea7e488037e176d2f0.npy +02958343-df1081dd18fa7bcd57d7020aed3513bb.npy +04090263-1fd98fb84317ae248cb94bbc7f05ffb7.npy +02924116-6d81decd46d9040741cefd10ce5d6cc0.npy +03211117-5c67f17ab9c9db50fcf74172442ff5b7.npy +03636649-e6c64600128ca2c176e9713f57a5fcb6.npy +03046257-86a053255fdd01266559ee74abc3e41.npy +03636649-22c24fc303fa5c8c48cef9d4cb5ab8c.npy +03467517-92fee1447bd437898ca72a94f8440a42.npy +03001627-9cf25518a8d3eecd9c48aa7bc7cbcce7.npy +04256520-78742b25c20ae244cf01bc59d215f0.npy +02828884-a37801a9289678201f8b303c0da5108d.npy +02773838-74c548ef3ca7b1987515e7bb7dba4019.npy +04379243-131bca5d855f49d428e3317d62e4ff40.npy +04530566-8db75d7703406e81e4f8f268ed99350e.npy +03636649-dc5e7460dff922246a44fdd49dec8069.npy +04256520-69f5626d5dda497c2af11d59b11e0199.npy +02828884-98de2d75e89789a7d301ec101065cf10.npy +02992529-54539e30a59cce413864ee650d9e9c5c.npy +03593526-5c55279aabef108425b2c60a44b454aa.npy +04379243-785e93009913379a79f7c71429a96cf8.npy +04401088-db89fa13b1c3c53afff0e9d5e9e3da5b.npy +04379243-7573bc5999555ad635e2fdf95cd06839.npy +04530566-9c19eacc8033da3698a97ddfb532e08c.npy +04090263-b577e94cb0a28f73e8152bb1bb6e4c3c.npy +02924116-b081d18ce7fc240241cefd10ce5d6cc0.npy +02818832-e7e05f20bbf738c47ba6f8f10959534c.npy +03624134-ee7ced71701c3e88b9e3f0d9deebf307.npy +03642806-3934cb69fe3584ef8f6cc6fefa15515a.npy +04530566-d24616fb070d105d3a10f0b86a89bfc3.npy +03211117-c257e38f51bb660447de0ecdff019da9.npy +02691156-b76c6ef211d627efac8c46f8a114a34b.npy +02691156-b9006dadc7ae7f7d21afc48d963f897.npy +02828884-c069553c08631597cb2a965e75be701c.npy +02933112-b3328bd358d7ace07c68e936cd219e1b.npy +03001627-9c563031f09dc2459a87002a4eeaf610.npy +03691459-a6fe968066893c10faa3b42d05e08ac2.npy +03636649-5c25916b55fbe4ca29695ec09b98af5.npy +03001627-fe5310a3457bf0e5c4e8952b27b5f370.npy +02808440-a03a2f92431e190591a491e8257bd6fe.npy +02691156-f009f3112625ee00b8cf782e8c539948.npy +02876657-9da48acd8046be50307e049494951dab.npy +04256520-40f6e30804ff4aae20125f039fb4c8e.npy +03593526-25d459836c571e1e6e130a30b5ed875.npy +04330267-bda8c00b62528346ad8a0ee9b106700e.npy +04090263-419226b09e44e5bf8c8cac88a8c48208.npy +04379243-97e3768e85c686f9601bea3dca268229.npy +02958343-49a114b29a54300e51a95aaa6caba1d3.npy +03636649-d49a8626a9eb5ac2553bbd6d743ae8f6.npy +03636649-c8f5bf57a3215cbe9a6c869309041adb.npy +04379243-622e30a7ccf34ed5b64a7c8189aa3893.npy +04379243-8ea7ca2c8b48eb68ab610b0c94236463.npy +03001627-1b5fc54e45c8768490ad276cd2af3a4.npy +03001627-d6da5457b0682e24696b74614952b2d0.npy +04530566-b5d1a551525c6b7876ed13a8bcf33762.npy +02924116-ea5b5c44f4e0cd7ab06dffea8c2baf8.npy +03325088-e452db5f61ea4593321831d2245cf06.npy +02958343-2ef61a1083304211d27be7764701cfe.npy +04256520-5560a425c597eacbff841fc99bb16039.npy +03928116-3fc831f0c69c981048d189f942cedc62.npy +02801938-ab6e1ccf0f35228416fdce62f5c06e29.npy +04401088-45e907ca47e0122c1752adf979b66914.npy +04379243-2a48b2cc3a5b7da6833b2489037ae4d9.npy +04460130-76377cf0dc70d027e7abbab3021b6409.npy +04090263-6d88bd6c04bd5bb01a18bc096aeb4c21.npy +02876657-e7818a94d20fd8e1a4136492f17b9a59.npy +04256520-4e1ee66994a95492f2543b208c9ee8e2.npy +02828884-b2596a0e14772bbad5067eac75a07f7.npy +04330267-6fe99039481ce154c13f6e8e2f6bde6.npy +04379243-977787b51140f4bba100d1443e9d6b3a.npy +03642806-4f3575df3821e08c466909b3e9553909.npy +04379243-2d90a1998eca8778dcfcef693e7ec696.npy +02958343-828c32ae594a5409b1bb46d2556ba67d.npy +03001627-bb4868c1026c04fd7df0e9a69c97c97d.npy +04256520-1e4eb3bad18b75f23d6e282938a47f9e.npy +04401088-e6cfa46780f8634de8d86c9b116d4e0c.npy +03691459-8a5cdc3bf1ed6226b7b1e717b48d88bf.npy +04401088-80243e34f66a503bea95e61f66327e28.npy +04379243-1bf71e2f8abc7698b232f4221eaa5610.npy +04256520-909ea8e0e2728ced59f8e31ca87c470e.npy +04379243-9ec420c3155ef5af707cdefe012d0353.npy +04090263-b5aff534c7df4d86f06f0427d3aa3395.npy +02691156-398fc0e717b0cd524c3a35cee92bb95b.npy +04379243-7b22287c9a2ad418b9deee229eae6efa.npy +03001627-52d41eb69bb764e784aeb682b234df80.npy +03991062-b9126c3c945b19b7a2c59a4d90e63212.npy +04256520-9389ec8dd802a1fa7d7598e07139ebfb.npy +04401088-205b1494d7d3448e21844676433a0aca.npy +03624134-28d99b90d09e4205744848276b011f94.npy +04401088-67baf038e83456967f521a3dcd28e9d2.npy +02691156-5024341275a685bdecff69852469d7e3.npy +04379243-1950a6b5594160d39453d57bf9ae92b2.npy +04256520-1662f76e3762fc92413102507b68bcb5.npy +04401088-ebb6035bab99c3e221844676433a0aca.npy +04530566-e8b19c46e5beb3823b12275bdb30c153.npy +02691156-106dfe858cb8fbc2afc6b80d80a265ab.npy +03991062-496e747582bf5e7187abf842aa6d3bf6.npy +03001627-76919a456a23b9779368d1198f406e7.npy +03046257-4fea2346a95ff9fa97e30bfe57d923fb.npy +04554684-cf13890b1cead267be96d0229f49fd6a.npy +02958343-d6dab47acb946364f0cf9a4b3162f487.npy +03001627-223d0330466ac6bff7628281ecb18112.npy +04379243-7062f5b229674ab7b0b54dd2cf2a35d4.npy +03325088-a8ff57bb496e582ac36fb70296e45483.npy +03797390-1bc5d303ff4d6e7e1113901b72a68e7c.npy +03991062-a042621b3378bc18a2c59a4d90e63212.npy +04530566-f582d2315b6182ec6f6b59ea659e8324.npy +04090263-2f0c7483f4eacbf1c03d8e9f14212b58.npy +03207941-401ceb30354af54d20192a5319e3e2e4.npy +02958343-2c8e9ff5fd58ff3fcd046ccc4d5c3da2.npy +02691156-679d4f84caa5a1a8f019a51d1a3b2e07.npy +04379243-382b49301bbd3d707d6dfba3e792b660.npy +04379243-9d8f0444a8c09adff0d4c8f4dd125299.npy +03001627-cd4fa15a13d7448a14038d588fd1342f.npy +03337140-4374f1908ef835b1b25f5f33b0704a5d.npy +04530566-2f004ec4a719d231e513e51a78e5ea1b.npy +02933112-8e7dcefda14362f866f6836074ef23fa.npy +04379243-3ed500a12dfa511ba6040757a0125a99.npy +02828884-48ea3558db137e87ad5067eac75a07f7.npy +03325088-891944c98c72a487c36fb70296e45483.npy +04225987-97f85bc59f09a9f455c660e6cd8e92b.npy +02958343-6e76975ba073f2a89ba83e6d08a84f26.npy +03691459-374df728f54322363b0edb55efd49670.npy +04530566-cfb1882ac34b81d8a357368f9af15b34.npy +02691156-e49d1e1d176ec1dfbc0909d98a1ff2b4.npy +02871439-7b17701391dcaa7bd2473c216962c0f3.npy +04090263-2680233498fe409060c049bb6fb2fb09.npy +04401088-68918effca4b9becf3434ae1311a0329.npy +02828884-722f3510b849c950beedb4c8fd29e2d1.npy +02958343-e0f1de19f0f65ce09123224ebaa118d3.npy +03001627-c5afaadb73323de9645a86b04c64b372.npy +04090263-144201418b5dccef1a857c47fd0ecdc3.npy +04256520-fee8e1e0161f69b0db039d8689a74349.npy +03593526-5bffbd5a0ca14f342f841233486fac2b.npy +02691156-847bfe2bea87c55b2d49d91e9a282aa0.npy +04256520-1c756525061c4b0b4f3443b22038d340.npy +02691156-a281b2664e7e5b2fad9d7d48f3cddb17.npy +04468005-feb23a40a79ba13c9f97ca916781e800.npy +04256520-27c82d27a4d38e6f41b160b9adc112fd.npy +03001627-8cf71cf6f0bf6bb2b5af95b2c842e5a7.npy +03691459-181d03027d30429dced68ac20944148.npy +02958343-703bd04475fc330d59139efcde1fedcb.npy +04379243-b70eeabec7fd454581960a3202db094d.npy +02747177-ad0bba7ced79b52fad5067eac75a07f7.npy +04379243-26a28d973e40648db40f0ac0fb9a650d.npy +04256520-95c1e7d85da0497fc1a61b0a501d38f.npy +02958343-46a71fe0e651986fcfd826dd468a5497.npy +03001627-380a5345fda8e97492d9da2668ec34c.npy +04256520-3d7301760bbf315f3598efd14e493d5.npy +03636649-9464e80554bbd3de030fd2fa0608452.npy +04379243-f3775c07e5ba9515d6944324b21393b5.npy +03001627-35e8b034d84f60cb4d226702c1bfe9e2.npy +03636649-7264167cae71c90c72bce768f6d2af1c.npy +02924116-639822a6db5ec3d852470de2774d6099.npy +02691156-a4d75675f0f871c96466a07aedd68378.npy +02880940-db180e4f9a75ae717ba6f8f10959534c.npy +02958343-f76b9a9455b20cd875a45359f7e88a3d.npy +04090263-d109693d2d43e65b6ed5eb4c1d0d366c.npy +03001627-40020a5e90c75d94a93412f1b60e6fba.npy +03467517-4a15c0df0f02a9d840c20797381ee39f.npy +03948459-d965eb9091d180245f91354f947d2313.npy +04256520-b5eabf007a57d863a35a7666f0cfa5bb.npy +03001627-be38dc611c4bdef7f1cdfc0a8f38f2e.npy +04256520-934cbc4617c6a6f4b001e9ae2ac46c17.npy +04379243-178703fe974f63e9c3bd24f986301745.npy +02924116-66b963a73fc2c9b2f3f21609a16d7ba6.npy +03948459-286ed45d14215f6e2219667ae51f9fa.npy +04530566-7b0ed74742d27ff3ccc6f1de97150965.npy +02871439-53f91b5f850b5bdc2bec9713eaa8c4ae.npy +04256520-39f5e0c179377860d3eab83c82350281.npy +02828884-19bb2f65f3de8f5fbdc7943e19c9bdf7.npy +04256520-9900929c21330dacfebad4f49b26ec52.npy +02958343-6ea4111bb47039b3d1de96b5c1ba002d.npy +02933112-2544d05396cf1c91bc19762eaa7ba40f.npy +02876657-d5dd0b4d16d2b6808bda158eedb63a62.npy +04379243-136f3b0a4893cadf4f1b88c70d074e4a.npy +03691459-39c641a818474a46e10cf62a02f1a100.npy +02958343-63a4e46bbbd855fc2b63d3b2a8c4e8b.npy +04256520-40a6a3ef4e4e4c4c300703f05f8ccc25.npy +04379243-daa9e908b5aafc2fcce90f0d61ed7a70.npy +02691156-af696fc30a96a0c8bc0909d98a1ff2b4.npy +03001627-a5898fefb1733333a82b0d8d157287f5.npy +03001627-31d48d6b3951ea8e1191025061735ea3.npy +03790512-18f5c9d827522c859cfdf97abe35029d.npy +04530566-18a8a4aaf68d294f800a0120f3e757a2.npy +04530566-a431fbb7e58ef0c46c03c11657c96c60.npy +04379243-55a3fb19f099a06adc061043e7c712.npy +02828884-af79d505f2ef2223cb2a965e75be701c.npy +04090263-fd927e1258969e1ada4044967c19cf99.npy +04330267-41d11126029f5b98e793cc5433bece89.npy +04225987-5fba47ad66c45cd113314092564c13fd.npy +02691156-34e87dd1c4922f7d48a263e43962eb7.npy +04379243-91f6f0813eaf4e52707cdefe012d0353.npy +03761084-d713865a94c8229575f4e5007488531.npy +04468005-19daec6f2602f9c0dc14ba0818ee5cec.npy +02958343-b6bcc1b1ccbf0ea0996e71cb10be68ac.npy +04379243-30c9865cfc4294a7ad16260d4d73b56.npy +04256520-54215008a46fdb714386ad145fa8aba9.npy +03001627-bae3e35109b939cfe7c7920f6a65a54d.npy +02958343-3f6e9baa4657276f97df6383472cc5b6.npy +04379243-ba34c92a41a9ac9f20d3c05c08e26f.npy +03001627-35f83268d4280532dc89a28b5e6678e0.npy +03001627-5d959b0f79a22e8c67c9124d122355ab.npy +02933112-7cb7d54954caa7a2d3cedcecf1ed3b27.npy +03636649-284986b4c72d624abd73284bc3c3cbac.npy +03211117-ebc62d2dac989b7d8b71a158ed504795.npy +03211117-58fceeffe91b7b1c20685b5a7e34b501.npy +04256520-4f0d2de3a60f247662d15c83b2279a53.npy +02818832-9860944cfd30a13dc3bd24f986301745.npy +02933112-23b7a3961eda17df4da5feafe6f1c8fc.npy +03928116-c57408045e96f5d5b249ce9318fa571.npy +04379243-a5cbc0a86cdd01bd348f8ec207893cce.npy +02876657-7467b9892496a83fbf8b9d530de7a108.npy +04090263-18a1fb21c8c1c18f4dbc4096bca262f3.npy +03593526-c4ac6a5f651d12c6c6b4aaa0b0f9d794.npy +02691156-bbd8e6b06d8906d5eccd82bb51193a7f.npy +04401088-4f2919438ca46d8de8d8ad3bdef6aca2.npy +03001627-22b40d884de52ca3387379bbd607d69e.npy +02691156-917694a71164f2148e8405d6c51a908.npy +02958343-6c85bbbbbea160bd81bcd6355b440fd5.npy +03001627-3cf6db91f872d26c222659d33fd79709.npy +03636649-53685a90516a12c5f51fa0238791f5dc.npy +03001627-5cf55d9c3a3c7907489452a0032ea575.npy +03325088-78c5c2aee9ae697b3321831d2245cf06.npy +02691156-e777a6a46ae240a7bd46d022fd7d80aa.npy +04074963-8e167ac56b1a437017d17fdfb5740281.npy +04090263-736200c1ac8d1c34c14cbe2c343fa431.npy +03211117-17226b72d812ce47272b806070e7941c.npy +03642806-2c61f0ba3236fe356dae27c417fa89b.npy +04090263-7ca37968914be27d82b2a307d22750bd.npy +02828884-e66730e74570d0016e90d42867af9dbd.npy +04090263-ae57975d9461b324d10b86bd6e8bbc34.npy +03001627-f497cbcc4895d5386b684500e5db87c2.npy +02691156-75e9e2d6970f5ee71927c29d6faf370a.npy +03513137-9cdf5e674bf943bf69ed2daa3338779.npy +02992529-cf0dc63412541764cf9d394118de0d0.npy +04379243-26dc6dbcf6b36278ed4893d5d6c77f16.npy +02691156-317ac4d5ff597c9ae719b5362fe06bbb.npy +04379243-94672a37947da258f70bf5700b78659f.npy +04379243-b59753a2c0751e7f37251258858a7a58.npy +04379243-a05d8e55e329df41ca2ed12df13a916a.npy +02933112-37d41aa1ab8e7318534f016fc3878f48.npy +02958343-6d493677c8dfb9d8321338b7ef756ea5.npy +04379243-6d67f5a9d2daec3467ca2ad6571afff.npy +03211117-30e739ed4c65f67ab71158027becbea8.npy +03325088-876f08c390a7528ac36fb70296e45483.npy +04460130-3a1e36329722686c2c406efbeb1811b0.npy +04530566-3f3043e275bac07a6f315eca7454150f.npy +04530566-ea491bbee7524859cfea3d4fc15719ea.npy +03261776-bb2ea6e44847055d59a6208793b9dfca.npy +02876657-d9aee510fd5e8afb93fb5c975e8de2b7.npy +03991062-fe438d5b6303da859f9892433e1b1f4.npy +03001627-6e98c5d61e008b4c2871cc0b3cc1a485.npy +04379243-d1807006e89f9e7c3087f84b199fd297.npy +04379243-dddd611b4262ede6e3b9db784be35882.npy +04379243-32d832455878ef581bf2b66b52bf6885.npy +02691156-e36ce61195489a56c8da6d3458daff84.npy +02691156-bb7d526405e9347b8f6810e1a2b6aa04.npy +02691156-124062ccaeae95085e9e2656aff7dd5b.npy +02924116-7bb582b2e2a587d8481aa8b5531c68a9.npy +02958343-6b2766e55b6de7779d34b5c385de0e34.npy +02691156-ca359fd1ed701d06f119374ee5d5f944.npy +02942699-ee58b922bd93d01be4f112f1b3124b84.npy +03001627-d0a3e48a84f68a9143dbb6421d614c0d.npy +04379243-a0d2754011acdcc9d8a0e410093d6619.npy +02958343-a88c4427e1f0e871d7755e7baabe8a6f.npy +03207941-fba77111f045a448fad3c648a4e3c1dd.npy +03691459-9f43d3116f4162fdce029fab54b6cfbd.npy +02828884-9edc26b719dfbd49121811fcf3127a22.npy +04379243-87c49d4ca6b740d5275d003e423c59ba.npy +02958343-d1dcddb5b1d7404dd9b0c189eb588ce6.npy +02691156-7628e525228e5a2d9a46ec065c01b381.npy +02691156-f8d8b590a0dcd399718ac2a6ddb54499.npy +03001627-5043b2deab10560fc458ea4eb61fea2b.npy +02828884-d9479cb37b782ce5b714422ef873ad34.npy +02691156-7ae99c0cc14cdd97408827f71d73e45a.npy +03797390-37f56901a07da69dac6b8e58caf61f95.npy +04379243-821e6d43a82eadfe8818864c19a17b87.npy +02958343-59c662d403a108d47074a72a1ea2aef2.npy +03211117-db4de4095a962680c951cf8670bfff6.npy +03046257-5c9012a6af482ce01050b055aafa6fb8.npy +03001627-c658d1006595797e301c83e03ee59295.npy +04256520-1685b0cf2d1a2849d0a2ef258a9c71d6.npy +04090263-82c3357fcd007893d17373579e6fd9be.npy +03636649-941271c5d9b192eaccd8f9b9403fd602.npy +04379243-c9ad9501c31fae5c71a782a4379556c7.npy +02933112-93eaa414c043264910a7acb23a71a618.npy +02880940-4845731dbf7522b07492cbf7d8bec255.npy +02924116-93e1e926b47c010c861a6907a2829b07.npy +03001627-87e11c9e61442510b21450114b9ae3a.npy +04379243-604efea445d3f3ab6d322cb027df34ad.npy +03691459-2cb180d4322b8ee9c0d2bd04416ef7c.npy +03001627-66b7533af3449aa820b64028d2efc877.npy +03001627-bd6bc40b3327e5109501f2fa226917d0.npy +02958343-1c4590ebc214e029816bd8f64e08b2bc.npy +03636649-f77abf171ff5968720331d4c3b7d944e.npy +02933112-1ded292e60cf7f11178e7d331e641179.npy +04379243-86996ef1ba6aeacc64558a1c6a2a9f11.npy +04256520-b3fbac6ffe8e00622f6acf89a420ef0c.npy +03991062-e72ed3e25469c682a391a8379ceb19bc.npy +03991062-db9eea0b856faed772652f4081ec5a77.npy +04090263-89a5c8583b2e2306af646833cc36618e.npy +02691156-882b5868ee1382ab1608512333cae245.npy +03001627-3e1a5042dcff313971a782a4379556c7.npy +02691156-541ad6a69f87b134f4c1adce71073351.npy +02691156-ad66ece988a63911643ae903098a314.npy +03207941-1418f648e32f1921df3a1b0d597ce76e.npy +03593526-1666ce5ced647ed25d878ba9ec3c0d6a.npy +04379243-1d42f42755aa3a87b2644d7d4d7ea2c7.npy +02924116-8bf720e46c7f3dc2d27ba3fc43e70958.npy +03593526-434351669b58f5bd438d8caa9ae106fa.npy +02876657-c5032e4be091aabb36fe7a88df793982.npy +04379243-f7e7473775d8c3f3f51fa0238791f5dc.npy +04379243-87dc5ace74ed29fafe43ff1e45af424d.npy +03001627-780b18643b4cdd991df85a93cb67ce5f.npy +04256520-e809c16325be020c795085b4d203932.npy +02933112-b1d8cd17d6c936392caaf8842dbb8ac2.npy +03001627-5eb67ecc35e39eb59753496ba23f2183.npy +03001627-5fa533f71e7e041efebad4f49b26ec52.npy +04379243-42496cee03df8154ac2b62da1791c2b6.npy +04256520-cef25c3f7412814b4b3c42e318f3affc.npy +03046257-e23d73e264608468b5e1005644816d9f.npy +03001627-bf557411c41d07bbb38821f893bc10f9.npy +02958343-f3e467dba61ebb972a84c9dfab949065.npy +04099429-4936716925b1cd6428eba1f0b7744e9.npy +04379243-d6dbb647d85df780615b3e12f53b391d.npy +03691459-137c1194efbdcc1bfa0892265dbce8fd.npy +03046257-929afe0b3ad23608c7b37fe5d21f2385.npy +02876657-c13219fac28e722edd6a2f6a8ecad52d.npy +02876657-7565e6eeee63174757354938178674b.npy +03001627-c2220851bf50eda931ecc34700496180.npy +03938244-d777679b4dd35c76a4136492f17b9a59.npy +02828884-8f824b462a2870fd98e0d1738edd4f19.npy +04530566-93285afc55afb00f6bad0887a204b994.npy +04401088-6693fcd81ce5a4e6f5d789e33b735c9e.npy +02691156-2c1fff0653854166e7a636089598229.npy +04379243-7f5a875b5a2811b07d2313b9cd9e2952.npy +03001627-d4326cd55ed8333f6a059e1fc701f06.npy +03710193-445e18f9f2e42da4e911be944cb8c454.npy +02691156-3c2986906532a1c8cc36f752df32539d.npy +02958343-1f5a6d3c74f32053b6163196882ac0ca.npy +02880940-ab2fd38fc4f37cce86bbb74f0f607cdd.npy +02871439-81b8784259e3331f94cdfc338037bd95.npy +02958343-8bf2d0d0b01f6476c3fe7930fce05ded.npy +04379243-6aae683be40c3a9610c2a68437007d6.npy +02958343-7c13a71834d2b97687cc3b689b9b258d.npy +03001627-2ab4b8a3fe51d2ba1b17743c18fb63dc.npy +02958343-70899bf99412a69db38722563212fa4b.npy +03691459-76cb5a9b7b8dbea99b590f104a4a4c1d.npy +03636649-5614d1c24806ce0a8d1fe8cdc415f4c5.npy +04256520-42ebf2d478ab8af85ac3e286c38c6d66.npy +02958343-783f141774ea26e259d587c4b86a22ea.npy +03211117-44651d91ab8b2851fbff60ddd047b071.npy +03691459-aed2ee05cf37c85c9a8c31231dd99d82.npy +03991062-b4caefc750ad7f9723500a5b036df62e.npy +04379243-56fcca11e3d3a920c1702e8e8263bbd3.npy +03001627-a0c17b34d677907e1f98c0761af40e04.npy +02691156-d722973c75c85d93d0734afa0d357999.npy +02691156-a96c1589731b06a1efbd0f357ff7c40a.npy +03001627-4702e6196503ff84f1c0e03f321d0b20.npy +04379243-d3469cb008d98844902c0a1a69e25bd9.npy +04530566-59a363d3852757572b249fd16295bbfb.npy +03691459-4383b2bbce729356a9c2f34ef56404ef.npy +02876657-73632ddb4a5684503594b3be653e6bff.npy +04530566-2507ed5c9eb161569a704df179502ac7.npy +04379243-acafaecee00323af7ff6ace05b36a5.npy +03636649-e0a2948797cc33b2e19a0cc107ada7cd.npy +04530566-9043c404e310864cd5dfe0108665de88.npy +03001627-6ffbc6f14a7257caffa41024c63fa9db.npy +04379243-e9bbdfed8a39f4cbcb2a965e75be701c.npy +03991062-5b0f71dfbdc8089ca2c59a4d90e63212.npy +04379243-fe0e7198411fc340c057222d6d091c56.npy +02871439-1b35d8bb3a01668f6fa63795f94c4d8c.npy +03948459-383ed236166980209e23d6b6aa619041.npy +03001627-d0782d2afef19adf4733824eae5cd9ae.npy +03001627-bc722985df07090d51c4deb11af7079e.npy +04379243-a5cad9ba5e73ef239b11da89c22111dd.npy +03467517-709a1592b28e8c16489afeb4f07ae3cc.npy +03691459-e7af5657b90b9a73558880eed6ddb84a.npy +03761084-624edb4561b948c1374efba5c7752da1.npy +04256520-df912366bccfcc0258db0ef36af1d3c5.npy +02828884-319c099e8df5fcae2056b4bd5d870b47.npy +02828884-137c82020b8dc458eafa2f074f6cbe37.npy +04379243-98bba4f6837ece036c18e23645ff9868.npy +02958343-9abfdc63aa88be60733269057ed164db.npy +04379243-9098e2c564337b01bde1c279d540fc66.npy +04401088-f9bc179b45d2e5ffc55273be8e22f2c.npy +02808440-398f7f2f78f8794686ecff2582325794.npy +04256520-f12c92ab5f422c07fe5adaeab9475bc5.npy +04379243-51cef4b98624473e193a311b8faf4ace.npy +04379243-d15d37d902d2b8494ca386b8f1ce4c62.npy +04401088-35f584cf8fd22794e4b68d3b17c43658.npy +02958343-5d8476a9aecbbe1e9ec9fbf723f60ac0.npy +02958343-359841936db476cc8cf4cf458d5ff7b.npy +03636649-e94643bd9c777491d49b2e04785f8492.npy +04379243-813d34995b5c4406b65b71636c46ae49.npy +03211117-6fcbee5937d1cf28e5dbcc9343304f4a.npy +04379243-5649e478e7ef25c4490ad276cd2af3a4.npy +02828884-a4491b4a67356be5184c1614f4105c8b.npy +02828884-258a52f3077d3ed56c342cf382162bc7.npy +02933112-920b27c2d3c83a0c59350d819542ec7.npy +04379243-4987ccbc34697b446385bd4c1a835150.npy +02958343-513e2ad82336f56bc0e3666c7d0ec7d0.npy +04379243-5b69a60d7b980b134671d97b0fd17f51.npy +04090263-89f4f2458aa64d94daf2e4c786df29a1.npy +02933112-e3f3d58fe3cd9746a485daf2a997e28.npy +03001627-8cb34663a9e42f95c3bd24f986301745.npy +04379243-e0b333381b21780495e29b6e21e8c291.npy +03325088-c3bb910a7c423f8aa21506405d3c8c76.npy +02691156-97c12e6155fdf8ca90baeef8ba5b93e5.npy +02958343-cf698011f90ac05f253c03b7df20edd5.npy +03759954-e596111d27ca09f043a6722dac94523b.npy +02808440-f7e08b485c7e64bc1fc68ad6ef71f41e.npy +03001627-9961b26d1eb9170e98e0d1738edd4f19.npy +02880940-b007af6eabaa290dd42b9650f19dd425.npy +04379243-ae8f31ba66709b8278cd7885232df677.npy +03467517-64205848fba5d7f74fdc524a49e62393.npy +04090263-bca09e37935082a925ff9d2d1e4772c3.npy +04379243-6b8e579c5178d3e117b431cae0dd70ed.npy +02691156-6baefb84d6e12a0c6bdb424f4ee7ff8b.npy +03046257-5bbaf43f2f86ba638b33d3087add7a4c.npy +04256520-91839305f25521a3fa5b6212657ae4a4.npy +03046257-d5f08d4df09a74b327390fc4fd3ec0cb.npy +04379243-a11b3450e77331367948cb8e1d9ee487.npy +04379243-99686d07d8ced954490ad276cd2af3a4.npy +04090263-5f2f4771bf59c3a32edc45348090e195.npy +02933112-1f6d5268afb826c38b424343280aeccb.npy +03642806-5458437965b3d5da2462e129dafd29fb.npy +03691459-a690234747bb56ceb4767ab55965ebbb.npy +04530566-556a76a5d29e124635952e349f57d.npy +02691156-d4cc520929730248642fa8402286a797.npy +04090263-4b6647ba7664a03198467494eaaa2f8.npy +04379243-97551108bbb5afc36199d6fe090be061.npy +04379243-cca7e05c69a5d8e0a3056fa1e8da3997.npy +03691459-b526ef9f77ce64d398ed31a2f734ab49.npy +02992529-52a81d42c352a903a0eb5a85db887292.npy +03001627-d6f2d44c693d2e857062f2d72cde5c95.npy +04256520-6905206d5f2ac04bd9e0690b0b191.npy +02958343-d4434de782382a47a7e7e5ea49ad8e45.npy +02958343-51f4aebb148459a45fae7711b4095f8.npy +02691156-5f46b24028db58f490baeef8ba5b93e5.npy +03928116-a56bbdcb466fbe47472f0eaae2165f9.npy +04379243-8cc8e16280748c3823fe3501bb9e7193.npy +04530566-99f00898c6b373d5eb2c303a0e0d287b.npy +04256520-8904f205681acc62dd8a663469942954.npy +03001627-e388792a151735e57597e1f94410131a.npy +02933112-cd251287fd34d7e0e3f7a74e12a274ef.npy +04379243-681ee7768f9fa9072c5d34a902e568f9.npy +04530566-70f91186bb61208c56988d12ecb12e06.npy +04256520-86d2aa8a80fd9f38dcdd187a6a5d68ad.npy +04379243-30de7eb171cb381f99e8bf807e902261.npy +02691156-9fb60716f0f5a2b84408eb298433d643.npy +03691459-96904b01dbfa0d0c5865090ad6b0dfd2.npy +03797390-f7d776fd68b126f23b67070c4a034f08.npy +02946921-af444e72a44e6db153c22afefaf6f2a4.npy +04401088-37846d5854ef7da646e4b9487666a2f7.npy +04379243-ea60ea168f766580617092ec6e36103f.npy +03001627-115b11a77b8d8c3c110a27d1d78196.npy +04379243-54b26954e478b1a34ea8d5f5f27d7ce3.npy +02958343-2df4b1797723b140419bf2f84339ec5c.npy +04379243-3c7cf00cd78adaef4b3c42e318f3affc.npy +04256520-6db11b763b7c3e76fd5b2dc3df6521d5.npy +03001627-c605d4742f68a00ece45069973024eb1.npy +04530566-79a13d8bffa87b8ba8ae9698506bed5.npy +04379243-335c2e4c3991768218ed1f44219ab7b1.npy +04090263-19e16b7050b25507d43bb185feff0470.npy +04379243-e724ee5c326ecb9659db00799f9936b2.npy +02958343-d72ffa185738bccd10b75223b5be6dbb.npy +04379243-47a381f4ed3d30614187eeeb0dea4986.npy +04379243-aa54c2e6850253ffe08dd63aa50202d.npy +04256520-ece6da595e7754b3eb0f7c4d37fcbed7.npy +03001627-df8374d8f3563be8f1783a44a88d6274.npy +03001627-3a8b5f5a627bb2e199b439fff97886d6.npy +03325088-30316a92178da5683321831d2245cf06.npy +02808440-47b337a43af4d557b8724a732b3d4cc1.npy +04256520-99d036d409c1fc366f12b402757e5b72.npy +02691156-c494f446954523a8a32748a9f843a0bf.npy +02958343-936702a0367e95185b03bc28c642bc.npy +03001627-63e6c50e5435e35d822a33e080d0e71c.npy +03636649-e8350583c84b5e6731ae8c8ff1eb3d45.npy +04379243-c2679e65b9d5e95de6fd255f2d77a585.npy +03001627-1d0abb4d48b46e3f492d9da2668ec34c.npy +02691156-bb785567f73903da2661ac6da30aefd.npy +04379243-2c730735f7f3e60f848ac41b30fbbc29.npy +04256520-aa27de991298fb2eb3a010e5a9dcf3a8.npy +02876657-84bc4006535545fad2986c98896facaa.npy +03624134-ceb3b39c9a035752b4fc059d1d10ec5d.npy +02808440-a2e7bff47380868e6b37e99dfd7a802f.npy +04379243-ec6de49b6fee801a4b3c42e318f3affc.npy +04379243-ed1e06e886b5514fe8f49d7c9e73ab9.npy +03636649-9f09619002ab4d76f42a90fe4baf4591.npy +03636649-a5bfb9a3571e7e86e59f529cd1b6faa8.npy +03636649-97e63c1f813cb1926f43c7673a499bbc.npy +04530566-81a7b820899ccbf15ddefb7321dceac0.npy +02691156-1890f6391df25286394b1e418d5c594.npy +04530566-ba62a620689a976f721c8a4254856c86.npy +03325088-ccd1a028cc366882b362845c6edb57fc.npy +04379243-119819c15bec2e1e299457639cc3cfe3.npy +03938244-121f2fa5ec7a7db47df4feb40f08ca17.npy +04090263-b77b49b9bd84123140385522d1beeb20.npy +03001627-326f74afbed5d727da8b0c70313fbbae.npy +03761084-684b0477a4ffae9f92b1088bf3ddce02.npy +04004475-df443a41d3b4f092d5805a1d6e49bc4e.npy +04090263-4301f958c305ddfda1b7cf86a93141b4.npy +04256520-a9a8156722fa81dcbc36ee6cb276b00a.npy +04256520-4373d31c2ac1d0bc57278947e7c4dc7.npy +03928116-9ebbdc0d84ffb0039edb2d87f2bf300b.npy +03001627-88dda281b3dddd57517c7e27988bea5f.npy +04379243-54598a1cc5f389ffbeb83c64f2162734.npy +04379243-6be2058f02beb0569699d7bc7fedec1c.npy +04256520-3f1af655a7e3ee57b838ce7eb80b48a.npy +02933112-54dfbf6333cf06dd652b6926f989dd09.npy +02691156-8c3419a655600e5766cf1b4a8fc3914e.npy +02958343-e13ea26b1b229e74bbc8d784a25de148.npy +02828884-eb06da40812adaa9542357877f3143f8.npy +04090263-3e0b251299b8696592cea77f96988ae6.npy +02958343-6f793e0f29f6b0b4da82e7357e8ee170.npy +04379243-74e9d9cd7b3d632a504721639e19f609.npy +03790512-5131b742dad94f6175dadc997718614d.npy +02773838-83ab18386e87bf4efef598dabc93c115.npy +04379243-dc47d49db6ac670635d498476a30ff0e.npy +02808440-ff507a7e1febf2ea3321831d2245cf06.npy +03046257-6d193b1a63e7f617977a52409ec6c456.npy +04379243-d528d80f04f387fea570c6c691c987a8.npy +04401088-dd02413772656bf5f6cc8d1cc08b421.npy +04379243-70a4cc63977d8eb018d385624fdfc6d0.npy +03001627-bf8004c0d88210a291efd008fb89dc2f.npy +03948459-9647b6b16b7744e67b1ee883bfd9155b.npy +04330267-1b625db2af8c02b04253be890e153964.npy +03467517-2cbc0faddf227502bbc745a3524d966b.npy +02691156-f144e93fe2a11c1f4c3a35cee92bb95b.npy +04379243-155599b6ab61a872f51f77a6d7299806.npy +02924116-358ea149995d8b826ca2b6e5474aad11.npy +04401088-d5fd6679ddfc8ddc59f56ab706e2f74c.npy +03636649-370ff00dc6f08167c3bd24f986301745.npy +02747177-1ce689a5c781af1bcf01bc59d215f0.npy +03790512-ee0a3213a08a23d27d2d874548544c4e.npy +03928116-3696bdc9797130c56599aae9284a50cb.npy +02828884-756108c9b72e95aa57d85583f4ad07cf.npy +02933112-4d0ee9779956b74490a9ce3e4b15521e.npy +03691459-59455b5c509a7e9efe96ea0860283ff8.npy +04379243-97a137cc6688a07c90a9ce3e4b15521e.npy +04379243-61d5c19a08b3f4a9b3dfbaddaa1a935c.npy +03001627-3d988ea2b68f48c7492d9da2668ec34c.npy +03467517-d2938be9fd0a6cd340c20797381ee39f.npy +02691156-c46336844aa275098b96ae1a0a8b84ec.npy +04256520-4d251436236babb87189b31b3e8c8ef3.npy +03001627-1b90394dae690dddb53be07817c1dd99.npy +04256520-201a6507d261c9113847ce0a45864e80.npy +03001627-b251886df47a873eede14860b165d604.npy +04379243-68b5f18b0790e9e128ffacc8063f0f75.npy +02828884-1c79aa69e4ec26b65dc236dd32108e81.npy +04256520-fe591a1cfbb6219afebad4f49b26ec52.npy +03691459-e47b83b94a1956ad7a16fcc398700938.npy +04379243-525b2042bd4547fd7ef440dbce8c5be5.npy +03046257-237b0f3acdd0b69bd4bf7024dfa167d.npy +02933112-839393d59ef6c8cfc59350d819542ec7.npy +04401088-f7fcc773249429a2761eb63018291094.npy +03046257-b2b40e80c9d3f530d5f1db12f95f0fe4.npy +04379243-e731ffc67b03d0555f46d55537192b6.npy +03325088-23fb74a31fcbf2b6b362845c6edb57fc.npy +04256520-39b29bb4fd8140ac9829306a513f9466.npy +02924116-83efc266d8e8ec03fac5a1e8b1475766.npy +02808440-9eca0331d9e89d5bc3035ab7747ce27a.npy +02958343-aff67f837a958d2329984c4afd2e98a4.npy +03593526-14ac8d866a8ea8b398910e50f05b8001.npy +04379243-5e96ddc94f51f99d2165c54dcecaacb4.npy +03593526-49a97b1ceaee4a15525b133235812833.npy +04256520-9ea95280cf81f9c5c151419181ef256.npy +03001627-9d6fdcf7fd47fb5af22166a43d725fc9.npy +03325088-902a12f98b7d0b1a76c18e71fd49c4dc.npy +03636649-2b7eaa54eba94f34502b0796fdf972.npy +04379243-537e9f07962478412de1f397a20604d2.npy +02828884-6d1883ed7f0cec103023dc1d1218bb2d.npy +02933112-3b98711b877ae402824662341ce2b233.npy +04256520-5d382ebe0f2ab55efefccbce7fd86667.npy +03001627-d32fafb61e1e4a5bb0d5741be7de64b1.npy +04379243-ac40c46401406b71d9c36c82d746b699.npy +03691459-48a2091454502770408d050f12518231.npy +02933112-3e662f9afbe62838f0f8b2d752b1c7a1.npy +02801938-1f6046149060eb81cbde89e0c48a01bf.npy +02933112-9990d6c43d95c521c4df475ad1a6d009.npy +04256520-b228fe3ec218f2b7fd609f4a869e9831.npy +03691459-43730d7a76ea63f920363e2561dd589a.npy +02958343-c17e88a6b0267754c6529edfd0032791.npy +02958343-bad0a52f07afc2319ed410a010efa019.npy +02828884-cd49cc9aa0377a298fb953ed1ae534fa.npy +04256520-f4526b250d9ba847a1d83e910853d9db.npy +04090263-176b7637e807853d34ad43a472bf958.npy +03001627-a63ceaceaaae4af9753496ba23f2183.npy +04379243-6c6aaa451538a8ed6ec2cd9a23ae5af9.npy +03001627-6634fdee517153e7e8523833000f615.npy +02691156-c61f67c3f03b10537f3efc94c2d31dc5.npy +03928116-bb551a5c33e3743297a999e2367a4a2d.npy +04379243-695639f21a7995f592d5b25c536d8044.npy +02691156-8951b4f9834869a6673a028ac04b7de3.npy +03001627-eb23621d7ac1094398e0d1738edd4f19.npy +02992529-2c32c1b5d13074431c1943a82a09125f.npy +02691156-cc1e143cf7da051a6a6dc7e2bbcd098.npy +04379243-c139948ad09b042991a3d45e8887248a.npy +02946921-95ca52eaf8010a004cfa3ec30cb9847f.npy +02958343-e042d636cfca46f56436916a86a90ed7.npy +03325088-36e4eaad0530977a3c8d0fdfb1cc2535.npy +02691156-79e924263f903feb35fc197bbabcd5bd.npy +03624134-ce07e9a3b66742926cb0c1a2f69481e6.npy +04256520-9e3fd54c2e7dc4204b19d2c99e22ffe0.npy +04379243-913d774c845a0d7edc889d1ef9591d24.npy +04379243-8cf448cafd11acee84d4c0ff7581c569.npy +02691156-b26c50c3dd4a1cbb16b34c3751bc447d.npy +03337140-8c46c51995853d384c3aee8e9d3a6ffa.npy +02691156-e216667457193c729a6e43b878d5b335.npy +04379243-2ff9f572b715e86b1cfb6a573ef73942.npy +04379243-b69b6e09d5f5bc1f21ef666e979e4e80.npy +04379243-1c66f97bf8375052c13e020d985215e3.npy +03593526-a16e051fe5507ae2396ca3dd50467ab.npy +04256520-e6e2ed3f41a3eb951197663c308adec2.npy +03001627-bcc4ea0133864bfe4d4c0769270d8651.npy +03991062-a7bdcdf20b7e5ce7a2c59a4d90e63212.npy +04379243-45970e6048cadb39691e5fa75e122ce.npy +04379243-f361b2c70470eb71b71df3a52d67a993.npy +02876657-e9371d3abbb3bb7265bca0cae1ecfff5.npy +03790512-867e3e502de5cc0dd5dde04c96fd8146.npy +02933112-b74f87f4d4c7da7343638dabe1eb5336.npy +02958343-ea954837920f94e6f58ff156bb8fae0c.npy +04379243-8839cf79a5338a568ce66f12ba927a2b.npy +03001627-b80122c3a0543a7b7eaeab1f0c9120b7.npy +02958343-6482b8e8c8516a3b473f10e6caaeca56.npy +02924116-58b46b4dbf019171b4c69692992c7aeb.npy +04004475-94b56634065b6b4471df0fdd633b5540.npy +04530566-8b0d1cd6731593974543d90faa1260e8.npy +02933112-d4be807e568ae84d7b386db5665a1b3.npy +04090263-ef46f9c14bcb69193a3a90ed08de76ea.npy +04256520-9695e057d7a4e992f2b67ae827b02632.npy +03991062-dd92bd3e7c865023b3357f2f0418422d.npy +04090263-9751e6d0a0d6c1919c82b3f5ddca589c.npy +04379243-96db71d279b97c4ae02c30c9027468fb.npy +03991062-1c28000ccaa92ef72f5989acbfd15191.npy +04401088-271bc457eb5f8f4d2bcf2225e929a245.npy +03001627-7b2d8c9f611071c7d810b14a81e12eca.npy +02828884-38ea17d177c4e872fd07832c54eb7e78.npy +02933112-3891210a28be585fb9ac96152ab66583.npy +02691156-edc9fefa5fb82a0443a0c73d98327de8.npy +03636649-3330789450af921544fe3ba945082ada.npy +04530566-19a72473173bf26ff7bc9a344bb7bae5.npy +03624134-84ca0624075af918cc34b900bb2492e.npy +03211117-f8c22e6011567f655dee408cc1ce3ebd.npy +04090263-89c1d5cf1ceb8a81c8b8e03401520eba.npy +04401088-97e214d6b93e012f6337fbfda5096043.npy +02880940-c8a4719150446e84664b3b9b23ddfcbc.npy +04401088-6710c7894efe94cb918f30c146a92bd0.npy +02691156-c8dcaeda94da8da962b600da24e0965.npy +03001627-7051b028c8c1facfced9bf2a92246703.npy +04468005-582501051c6fb18a4c695bfe6fa2baf7.npy +04256520-dc35836a8c5bbdc919fb4103277a6b93.npy +03337140-c1aee431269eb53191c352d02061b3f7.npy +02828884-3e4f4c54420bdcae75becd8a4c3f1866.npy +02933112-4e33ef381f5be0e165b61ce1124a4806.npy +02871439-cfea3a81c83c30e775ece18553078e31.npy +04554684-b04403b592cf3516df3a1b0d597ce76e.npy +03001627-6e7455e21a6668a7f51f77a6d7299806.npy +04379243-9d039675f4d51869f3edd695842c6d58.npy +04090263-96023028ba4ec62b65b14b263bdb456e.npy +02958343-4fd6fe1f81a83dcee6513d84422cefc4.npy +04401088-1d390d2560fc259336eb9fe355d50fdf.npy +03948459-7afbd8e91df4282f1b5391e37ae81402.npy +02958343-e4b5734836d9519aa8a84951596cc1.npy +02942699-a3c9dcaada9e04d09061da204e7c463c.npy +02876657-b38eb308649c8c5de7de92adde5735ef.npy +02880940-9ea66797afeb86196ea1c514a0de6d2d.npy +02958343-9c65624c5d94aa29801b0db1d49ea10c.npy +03337140-5479c44349a3dbb4823b9dbfda3facc5.npy +02880940-3bedfd655c45c6747bc26b16f550876f.npy +04256520-98b6c00c4fa346cd187ccdd3303d9e5a.npy +02880940-d2e1dc9ee02834c71621c7edb823fc53.npy +02828884-696697545f8c8b9ff26d8e17374f38e2.npy +04379243-fc64a8a31f30ab8bb780b07b76df3b4a.npy +02958343-1dc757e77f3cfad0253c03b7df20edd5.npy +03001627-38ff18330fd5aace162bf7725b3fab02.npy +02924116-aedb07b6ad73e3b759a2046f98794106.npy +04256520-d20569519e7920bc38cb7d8503a3164.npy +04379243-dc3167808a79ebe24a1806c17996a001.npy +04530566-d77beeb2abffd0818a6b641df8a0d183.npy +04379243-f74c321042dbc8e684d78f017ff73fd6.npy +02958343-fd765ab34e7907db186bed5098d348af.npy +02691156-2cc44e0f9fb1efdb85e0a2007a11e92f.npy +02828884-127dcb2e061ae07f155d75bbf62b80.npy +04256520-9d1886cd5aebab3019fb4103277a6b93.npy +04379243-65ad913e23eec800cea003eff0268278.npy +04090263-428eadf77b50d6a6cfe6670bda9305bc.npy +03797390-edaf960fb6afdadc4cebc4b5998de5d0.npy +04379243-b1835f603e1477f61b50574ebd76a45b.npy +04554684-3a289ed95f5902fb46cde67a6a1ea328.npy +04530566-677ffbc1ee40a0a0db5a9ea3574bb285.npy +04379243-1c7d7b6754dccba230bbd4cddd04c77b.npy +04090263-cb35c8f7c723d041916965fb9c37252a.npy +03001627-19ee0ca97ed377fb69fffd0daafdccbc.npy +03337140-df26b9e9e3c642e0e7ecdbe73ef4323c.npy +03001627-7f11908f7ea9483c415dbfd895473b4f.npy +03691459-5ec12b34a69e34d9c85671f86a50354e.npy +04379243-d1e01c36346b4b839abebb636ba42f4.npy +02958343-e66bbdf57fa6f7f575f257e5fe0a71cb.npy +04379243-d9c11381adf0cf48f1783a44a88d6274.npy +03001627-383a9a2c39332f7f50eb11cb3709022.npy +03691459-b7c92dfdd563ffc74533f2e74542acda.npy +02691156-91d3479f5da120a9b4d73e4449062b04.npy +03467517-b58facaf0086786090794f393d445340.npy +02871439-f61465baa4c1c36de6089046407cf8f2.npy +03211117-ad3e62240370a4eab2c358fd992922e6.npy +04379243-6cadd91f66569c584f60f15da4c665d0.npy +04379243-d60166dbf522deccdc8726953f344666.npy +02691156-ae3556f7151098b0f64801ad2940cdd5.npy +03624134-38798b7013607bbf1e0b76f10c6e38af.npy +03691459-619442d40cba1f667a964feaf6ebeb.npy +04256520-781ef644347280bcce59ea70152320fa.npy +04379243-165e579c965b215b43dbb6421d614c0d.npy +04256520-9c18d53831315667af78305d7f7113c.npy +04256520-b9ab5b0ba01f4d896ae963205db1109f.npy +03001627-acbc30795b9826ec283b00891f680579.npy +02992529-5e485b1ae058fc11b26a5d88c8b02ed9.npy +03642806-17069b6604fc28bfa2f5beb253216d5b.npy +04530566-316d5a8e671fadf3a7fe2e170d12322d.npy +02958343-b3ffbbb2e8a5376d4ed9aac513001a31.npy +03001627-50477d125025879386855a8015309d66.npy +04090263-d0987a5b6c5c6118143bcc14d754d44d.npy +03991062-802f4afe1388b7b0ebe67d9b32c3ddf8.npy +02691156-3a54f2b6f9b053b759b859405dee3be8.npy +04099429-64803bab9799d0e698d2d2b2ae2563b0.npy +03691459-51b745123abc098c10198e93f73dfd5d.npy +03001627-51c8f249e778e84a5bae8923b29985ad.npy +04379243-5ba34bb2440aa2b917b431cae0dd70ed.npy +03001627-bbab666132885a14ea96899baeb81e22.npy +04379243-ae1a7b7c3ec72178b848d7d3af8eb610.npy +04090263-6e3239e448539dd25c351e299b24e355.npy +02691156-d45772f938d14d52736e55e9ba083986.npy +03001627-4c3f452cd60df0efb0957d845ac33749.npy +03001627-f0337929bdf10321d22730b0728b2fc9.npy +03001627-1e9004958eb935b2ef2777c7d8e09db2.npy +02924116-7b981340ba0b243ed7b025993d18028f.npy +02958343-330645ba272910524376d2685f42f96f.npy +02691156-515b1b36d9f7721a903a13c314c66013.npy +02828884-c0336b0471ca232bf155d75bbf62b80.npy +04379243-d27130df514414d1d8c46a3a266762d7.npy +03001627-c7da13238eb4a7e15128da2cbe23f6a.npy +03046257-9c9e80c64d5ab227d5f1e32336840b07.npy +04530566-141b2e976df2d4ed4ccd729f8bcb378.npy +04256520-d5aefefca08da17819fb4103277a6b93.npy +02958343-167ec61fc29df46460593c98e3e63028.npy +02691156-aeb538b2f1c36a8d9e811b082458229e.npy +03211117-1d1cd29446bff16090adfc5ef6476a6e.npy +02808440-e1133d232c5fd7993321831d2245cf06.npy +02691156-33ddbeb13fecf7868405970680284869.npy +03001627-4a0b61d33846824ab1f04c301b6ccc90.npy +02747177-4088f2056763a95752e986a5f722a6f.npy +02958343-19d0843797b8b2216abce8cb03e7794.npy +03991062-52de37a011a32c2fa2c59a4d90e63212.npy +02933112-7e6c0a7c630cce1d4702663c3b3faf8f.npy +03691459-882154aab31d483e130bc0755682f7f3.npy +03046257-1948275d99403353d7bf6fb68df7f786.npy +02933112-c18a4772bcfbb98e85bc264270ae0601.npy +03790512-9453199691f58147429f1c522640e6f0.npy +02933112-d209aaa7fd4035a34c7384dbb75cab0d.npy +04379243-913c38e7faa82c984a62fa5dd236505b.npy +02992529-9dc0c2ca8de18e28b4c18e3209e12990.npy +04090263-e5a2a579e54cf1bad87c63d8b3018b58.npy +02691156-20b6bc7d69902db4d3ccdbb72feef61f.npy +02933112-a0eb46b125a99e26473aef508bd8614e.npy +03001627-fb8b45151900e6e016a0c57b9ceb6d01.npy +02958343-1b2ef0809ca1abc7ca92a4cdad802b45.npy +02933112-14590b6bdb425e80d8986c3ed6c52fe2.npy +04379243-385f8323f5051b85f2c48e2288633251.npy +02876657-546111e6869f41aca577e3e5353dd356.npy +04379243-f1252c297d7ad9a47c51ec7d2716b33d.npy +02876657-b71afc7791d18eabc573899ac6ab82e4.npy +03948459-5a36e7861e4f414163e7abbde5e6b2db.npy +02808440-f033e6bfaf0c41963321831d2245cf06.npy +02818832-82df8acd0effeb9faf31209a7c3f5c4.npy +03001627-78779361a406474db516c05d046e8e45.npy +03046257-c39cf8d87c6cdb5a3339d8259ddfa7bb.npy +03593526-6bfcacdff00d57c633774da3deff863.npy +03046257-b972dcd268517c5df51f77a6d7299806.npy +04379243-6f58b8c1d826a301a97bcacc05204e5c.npy +03001627-18bf93e893e4069e4b3c42e318f3affc.npy +04401088-325ecc3acd232a5e981b9cd34407d026.npy +04379243-fe9d363792ee708b35836c728d324152.npy +02942699-ee0f44a37e50eda2a39b1d7ef8834b0.npy +03001627-602b7217c42d3d365eead856a4605937.npy +02924116-c8f079359109f462c6bf3b18b8ca71a.npy +04468005-1af852e72c44954b8bd91d7cadd7c123.npy +02958343-d838c8cb52c92df3b112e5ac235c21b7.npy +03046257-bd3924dc45097f029ba80f08c401fbed.npy +03790512-8521276f8a6df852c83b248a54afdeb1.npy +04090263-17577c2cbdb7c916642f87788fdb63a7.npy +04379243-241ea467140a03a1e015e8084a32eed1.npy +04379243-9c12baa3337390578592b396b177b348.npy +02933112-4bda28b19b2f6f865cd4f7d5b0608a.npy +04379243-56e00d6764a7205fa9fe1734a6086750.npy +04379243-8bf421d191e4908bb8fa4cb65e077db1.npy +03948459-a0a1633186261a031274aa253a241db2.npy +03636649-99efb45cf927a0c62cd2160e449d45ae.npy +03691459-ffd168e54f722339ef94793a67b4c5c0.npy +04379243-86604589a588bfbd98cfd47a860803c5.npy +04379243-7f1bd688960e2c1b97f2016c3d6097c9.npy +03001627-34160b90f6abd883c731e4cb72d7c0af.npy +04004475-1eb6bc4d41f19e07c29432ec481a60b1.npy +04256520-d2964213849329b494887ea54f3cfb87.npy +03948459-39105892cc0b553753e0a70586b5c8af.npy +02747177-8a321a0750972afff155d75bbf62b80.npy +04379243-e1a8e9e2059f4792fbb8cbddab1c2002.npy +04256520-ebc8467a8de995924b3c42e318f3affc.npy +03948459-34eb31e5ac8802246f2614b47f532d63.npy +02691156-f8bc6483dd3c87085df50a69f2f8e096.npy +04401088-959975a60ae104c48780444eaa02106b.npy +02691156-788cd4e599b0ca1819ba010ddb4974fe.npy +04401088-ed9149921b734b2941edb96d309c9a23.npy +02871439-fbc6b4e0aa9cc13d713e7f5d7ea85661.npy +04379243-135f9b1fb72e16d0dcf4cc877ea9b3ab.npy +04090263-2d5208bb08d89bf9a3e2fa8a8e389f2.npy +03211117-2c5b951b726b7672c137fd38f49b032c.npy +04379243-f511c1d4356a6a7ac0a61ad1cf92b694.npy +02691156-4e85ef428689df5cede07437dedab44.npy +02871439-d438f761339ebf6db2ac45db35c175.npy +02691156-ebd96d07a7d68cf2fc7b6f7beb3a27ff.npy +02691156-33fff5b8d113cca41b950a59358e57bd.npy +03325088-e4e3ed7621c9b135b362845c6edb57fc.npy +03046257-59ba9701544bcbe167944f5aabc774fc.npy +03211117-e58344689760e33158aeac7d536d442b.npy +02958343-7887e8306742cf844ca84d60642ec7e8.npy +04379243-e7655dfef36db9908c31ab4d97f0b44.npy +04379243-2fca68e0ce294506fe3e90bc90e90c63.npy +04379243-9f9d8c3acc3d33e628c187222995b2b5.npy +02871439-cfda7e588ae6c925ff1830d863863fa1.npy +03325088-66b11d49e1b91a7438dd26a27be095eb.npy +02691156-669060a91dc45dfd2ede7237ec38a80.npy +02843684-9d4da019570ea9748d438032a8fe6ff6.npy +04379243-7f14110c96ee2cf6afa167a727ddfb67.npy +04460130-8956ecd996dc60af97802b1c3f15658f.npy +04379243-ba73c0ea2797bded8adb98ef1d9443ba.npy +04090263-ba789d3b971e4095e2bb19fbad3e4596.npy +02691156-e761cf88524cf8f24c3a35cee92bb95b.npy +03001627-7e6b4a7b4dd60c40cc8bd7a04c9659f1.npy +04256520-68712432581f8a855739643afbd8c926.npy +04090263-5ed0e0b4d26a30fbd8990f79240f3290.npy +04379243-d1494e0665f06507b79de6fdd84b2221.npy +03001627-92e6546c4aca4ed14b96b665a8ac321.npy +02958343-3586f47af775e5158aa8c3cca6f13406.npy +02992529-9efabcf2ff8a4be9a59562d67b11f3d.npy +02691156-f6e6bab105ab890080be894a49cc4571.npy +04379243-f9ca8f7549af695a5aad165050e534c.npy +02691156-daf0298bbe90dff19751c7a6f15617f4.npy +04379243-186e501aa015cd367f768772b7a990fa.npy +03624134-1be1aa66cd8674184e09ebaf49b0cb2f.npy +04379243-18fef71ad80139a2af02521b7ec8a38e.npy +04530566-c6ef6b859205ab53609e2d916fa0da27.npy +04530566-b91a01dfd51d615b4f84436cd4bc7d29.npy +04256520-6336e1ec8679ae5c512941e37c7d7dd6.npy +02691156-8af65c495c966cd7c337e45399cf632.npy +03001627-675c6c0c5c9a4a8a3bad033fffa5c327.npy +03001627-238cd4b409ad9951f1d6726679b21945.npy +04256520-374c336ccd894dca717b2a5841d92.npy +02958343-d6786ef05af6127d58e7058c5c570964.npy +04379243-efc9a32719fc71962c95e86abe3e6416.npy +04256520-94728591e785c00278fe949fc1419876.npy +04256520-fb65fdcded332e4118039d66c0209ecb.npy +03513137-366a517ee3a9aa3db4c1516b11b344e0.npy +03001627-e0311d577cff9d85f6ea7461c0aa61c3.npy +02958343-1abeca7159db7ed9f200a72c9245aee7.npy +04090263-2b22712b66d3f1d7fa9286f039319ff7.npy +03467517-65e3bdc247b3ce3d4de904d1abbce016.npy +04256520-2efc425b95430055f7406d785bf36110.npy +03691459-ada2311f4edda41478108236e982c2f2.npy +02992529-5a7e19fca06d2bb7f2848e928a160066.npy +03211117-d8142f27c166cc21f103e4fb531505b4.npy +02801938-9b8db1890e6b74d430c7810cba6da248.npy +04256520-213484c5675cc80b4719088c8e42c6ab.npy +04090263-57337a97460a63129d5aeb7097eddbda.npy +03636649-b2d5929e66044aeac7db9c21ccfbc4a1.npy +04379243-fe4bcffc64838402684b7bc3f8a9aa55.npy +03325088-7219dec616569e833321831d2245cf06.npy +03001627-1de49c5853d04e863c8d0fdfb1cc2535.npy +04530566-e7bd994999e1d6d87ad17faf524063ac.npy +03467517-d2ad57f36e00c602baba3b7560fe62f4.npy +02958343-27e267f0570f121869a949ac99a843c4.npy +02691156-b590adb6d3486f6e90b1d6deb98feec6.npy +03001627-bec78ebd204764f637a0eda928b574d2.npy +02992529-8ea08c4be8f2f96095f577622f465c85.npy +04256520-411444708e41ec314b3c42e318f3affc.npy +03001627-bc6ca247b19398b89c7dd675565aedce.npy +03691459-d3a872834cd0aa94d77ea5e1afa5bfe6.npy +02828884-31846b186cddba04554672356b2029e9.npy +03928116-b896fde9d5fa81c4d0fb5e8be7de90c4.npy +02691156-42b71c3f82a845574c3a35cee92bb95b.npy +02876657-807f781ec8310baaa2e58dbee8c64797.npy +02691156-9f525ad90573de3dccc19f6800e20c43.npy +03261776-9790b84ae96e498d09efdd367bd2d59.npy +02828884-4ba13b996d6f1d3b286ea987ad5ffa18.npy +02958343-82bd66a7ffcb351c1527e35a652f449.npy +02808440-539296c36596f6d3b805ea9e53402739.npy +04379243-85f2fc137f3c7e57a19748ad08476c18.npy +03991062-b251cff600d748103918c3b319764298.npy +03001627-5c4c50c0a987f8c2d9789e40093c1324.npy +04256520-944842d74aad4e2617b431cae0dd70ed.npy +03991062-490e2e25da735cfd3df324363ca0723f.npy +03001627-2608335ef22bcee1c97114870bb573.npy +04468005-d2e368bd92b5180fa68662d570e5f2cd.npy +03211117-d061d2b6c934d0cc8b4b5227fac4401.npy +04379243-2b7b66623a00dd8b78838533e331d3cf.npy +02691156-c9f91acaeea4136f2863c6a2c8157d17.npy +04468005-8948aeb6b31b62bec3d4460f3366687.npy +04379243-7671a315e8ab32f4664b3b9b23ddfcbc.npy +04379243-10139657dfa9afe0c3bd24f986301745.npy +02691156-4cb1c851d4333d1c4c3a35cee92bb95b.npy +02924116-997db64d612406994b525b3ec330a8c9.npy +03001627-c4af5a5858b4f40082db9fca4b68095.npy +04554684-99871b9c854889ba5cb3e2021047f79e.npy +03636649-3b90765f78db34cdb827dc66c75bf2d5.npy +04379243-263e097a29c520c717b431cae0dd70ed.npy +02958343-a4fc879c642e8fc4a5a4c80d90b70728.npy +03642806-ef5b312fc20f1b20aab089a6db538ba7.npy +03636649-4521282bd4550113a5f600ed2cf472ac.npy +02691156-4cee36a2e8dd3b24b87697d3904b168b.npy +04379243-1abfb0c03c81fc2219fb4103277a6b93.npy +03046257-3521751471b748ff2846fa729d90e125.npy +04468005-e71a412203c7d783ddd78f4c842acf97.npy +03467517-4ad5927ac53f3660a1f7bd4770762353.npy +04379243-893d3871e46b18f79b11da89c22111dd.npy +04468005-d10cd54d59b35abd52470de2774d6099.npy +02992529-864e5512dd35164b2d477e233bc97afe.npy +03001627-e6355bbd9aad146a149098a193698017.npy +03636649-1e62d260a8a64b5d8f720345751070e9.npy +02924116-1005d0f6134d4afb69c93024dedae1a3.npy +02958343-7dac31838b627748eb631ba05bd8dfe.npy +04379243-d679b6e72d6c0ead391e4d6c585a697a.npy +02691156-3f3cd5461f7ec6edfa8a0c9a1860ff01.npy +03001627-4e1c6dd1146ba848f71f1345a68ed387.npy +03636649-5e2d2a5b9a69125b23c3accd4496ea68.npy +02958343-a476444d87bc7aeb1699b1ed8dbb7ad7.npy +04379243-3bc7c7450991737c36b0f2a1430e993a.npy +02691156-121e9fceb90440efed79d3bd546890bd.npy +04256520-7d8fde70f5c3f351567232766992241d.npy +04379243-dae4f6f734088c4de3a031805ace4a99.npy +04379243-11cf749cd0a65ca13339d8259ddfa7bb.npy +04379243-287f1318fd5e282a185574a5e2255bb6.npy +02818832-68df37a4bdb83f7c03cd8f7413e947b.npy +02958343-2131d5bcea38ce3a68bdb39538968e8e.npy +02691156-142acab4424009a123fc69eefd95e6d3.npy +04554684-46749d40640967a94b77d9f59f49ab0.npy +03207941-7d4a04196d3b8eba7984fb9ec7e40829.npy +04379243-35a65ddfe8690ccfbc96558434dabb4.npy +04530566-884454f0d5a376c295ea46728bcdc15d.npy +02958343-2650ad9e7a1d0ebf6df8cb2765f8ec95.npy +03001627-f2c1f929f451753de4ee93147efa8cb1.npy +04401088-c1077972752aac54e8deab000196f61d.npy +04379243-fc93d1a1476e4f86309c518184dfbf58.npy +02691156-5785c8651893ca6b7209009cfb89d4bd.npy +02876657-29b6f9c7ae76847e763c517ce709a8cc.npy +02691156-fc0dbd045c9391ce4a29fef5d2b2f3d7.npy +02747177-e5b7b5112e396a49b581cc9c4410f841.npy +02828884-6b4e4125c1a680cd2cc92e3c03668ea8.npy +04530566-215861c4bebeb328d9a75de54b023ae1.npy +03001627-1fd7d0fe883059e355feea066cda8f9a.npy +02747177-c904d927672acd48ad8a0ee9b106700e.npy +03001627-3baacc59dc30783a524dd35a546a4c2b.npy +02933112-22d10cc8165d310a15dd7d7985e749c1.npy +02691156-b1998932482a6215a9b2becd26dc2fc1.npy +03046257-5d47a83ce211f6a331387b9bbb0e1fa3.npy +04379243-f5b682cabede450d1191025061735ea3.npy +03001627-225891ce27478eec54e404e041bdecdd.npy +02691156-30b9882d1d75be3537678474be485ca.npy +04401088-937b3450c8976f3393078ad6013586e7.npy +03790512-eee947c35691b7d12279b76b11a9a16c.npy +04256520-e0b897af3eee5ec8d8ac5d7ad0953104.npy +03001627-a9a1147eae9936f76f1e07a56c129dfc.npy +04256520-60bca735b8dc8e487c4364ecff196aea.npy +03593526-cbca5373309e5e192396ca3dd50467ab.npy +02933112-c4d17b681e7f3d8a1e1f137e13140387.npy +04256520-f97cb4e2aed44b05593ebeeedbff73b.npy +03001627-f2dd3bc7d6c85a8f2813aa30be7ebdbc.npy +04530566-3e97094bc123e370be7ca2216dc1576a.npy +04468005-c56d3442d937eddb796ef482cb4dcf22.npy +04379243-33005098444c222b2b70eac6546e93fd.npy +03636649-20e4c5b5783eb950490ad276cd2af3a4.npy +03797390-54f2d6a0b431839c99785666a0fe0255.npy +03797390-eecb13f61a93b4048f58d8b19de93f99.npy +04256520-923e063599dc9ac7679edf1f9e4dc0a7.npy +03593526-5cf4d1f50bc8b27517b73b4b5f74e5b2.npy +03467517-5d6c1516b83dec8663e148e250c0340d.npy +03636649-a3ff2bc2ac65bf093aa7852a81a014bb.npy +03691459-a234d7b21f06dc58d77ea5e1afa5bfe6.npy +03636649-aea8305fcfd8a1d2ff0b82a28078fd3.npy +02691156-ffccda82ecc0d0f71740529c616cd4c7.npy +04379243-bb00ad069df73df5d1f943907d4f35fc.npy +04090263-98882aaa0d1b597127aebc12b787c594.npy +02958343-6af177bc78ee06a0e8acba6ad3725ca8.npy +03642806-1f8338b068279743f8267dd94d223348.npy +04468005-90fb6c97ceb13cd67b9bb226efd81df.npy +02691156-42b464affaa4b3f985e0a2007a11e92f.npy +04256520-f6dd2e82ae1f5f8d3d4d11ac89066d36.npy +04090263-63609476aad03e4b9a6e43b878d5b335.npy +04379243-d1d9e395bff3d3a7c8fc6229eb64e56a.npy +04401088-bd7b84ae3b88bd5cd2dd279a9538db3c.npy +04379243-adefdce69de361c58d8358620132e773.npy +03001627-bbba083270a2b0d031d7d27dc50ba701.npy +02691156-66a32714d2344d1bf52a658ce0ec2c1.npy +04379243-ec1c92efffb9ee78beedb4c8fd29e2d1.npy +04530566-82be57a43d5d1e14fa286e2f06a75d07.npy +04074963-1aa78ce410bdbcd92530f02db7e9157e.npy +02691156-66b9ccf5842ed7f79330265a9fff38de.npy +02808440-3a55b7caf574bdcb362845c6edb57fc.npy +03001627-3116d8714420cef4ba33c5b911977a18.npy +03991062-ef148620745fe8bc4fce6348712475db.npy +03636649-e11d2e065d90200c7543d7dbfecfffbe.npy +04004475-4e2784b9fe210ced4f2ac6d17d58c936.npy +02691156-1345cd9d0da6d149c6f6da58b133bae0.npy +04379243-adf250aa1c9e0f9567232766992241d.npy +02933112-ba17ef05393844dfcb7105765410e2d6.npy +02958343-620e8aac415e9805ea752ba39dde460.npy +03001627-c552529c54b0612e53041c49040be3d5.npy +04379243-2f8b594d23665a2de8058cf23f6382c1.npy +04379243-2b36b46dbda291b5855931d119219022.npy +02958343-49d6a631f23a324cde361784b4e1f04.npy +02958343-909422a9d1b42e1380360680c1602c7d.npy +02691156-e00d7bd590ac129bbc0909d98a1ff2b4.npy +03001627-8a26820faeecd40d4bf49568516d5f0e.npy +02691156-f55390ed02c0b2b36aa3bf023a2b42a5.npy +03325088-b33ff042286d575af51945de050323d3.npy +02924116-f4369a3f1b28a7da78c6ad1c898f52db.npy +03691459-f142707a0f0acab4cd229b7f28637ecd.npy +04379243-92246f29bdcfe82cd323d6bd8db8de5b.npy +04090263-2bdaaa66b6a2618b43c62aa3efb9d383.npy +04379243-a223fb0172d705fc3234880d6f34f7eb.npy +02691156-b812c2df636aa0218b96ae1a0a8b84ec.npy +02933112-6ecb73ea5a117e3fc6647a321d32ae9a.npy +04379243-58182c7837f0edc35da16758ae613576.npy +03636649-55077c2175d97b8889ab11a408196888.npy +02876657-14adee7ed296842c874073279cad6d18.npy +04401088-7e8e9cc2cd70a66d4d1f2fe604198dc9.npy +02828884-e3c1e31ca2a0247979dee05d9c95f934.npy +03001627-eaf5428e15655d0b3c8d0fdfb1cc2535.npy +04379243-ab0d3af786b87262fa74bdb8d964a92e.npy +02691156-776bd07271792d1b131c2ccc2e4397.npy +02958343-4f9db143aa853e69b207e9cc82f7c858.npy +03624134-81fe707672e60cc0873aebd175ac6f11.npy +04379243-a5af3ca6791da8292c48d6b905457dcf.npy +04225987-7fc2cddac7ad57a2aa4eefa8f42b566e.npy +02691156-57fe8ad460bcb4929a4a28ef635593ce.npy +03001627-b70600293bab55c0593ebeeedbff73b.npy +03636649-5656f1bb53d675ffcb8d8c6d4df8143.npy +04554684-a7c8177faa40c43a87be36ce60737655.npy +03642806-30cd08287b6ddeadb275781e0d014d27.npy +02691156-796d6fba50664f5b1bcd0717744cc5bc.npy +03001627-96a03b164315d2b65dc3653f8341633a.npy +04401088-cb80f0eb9d3566da655b6157f54b4abe.npy +02691156-f6b96f56212f55363023a5c0cae3fffe.npy +03001627-cb5f7944ec02defcc6a2b7fc00a47507.npy +04256520-7875815356fb41f3d772e458a8f80cd2.npy +04379243-abbdbed926968014b3c42e318f3affc.npy +02876657-c3767df815e0e43e4c3a35cee92bb95b.npy +02808440-7288fb375238b544cd97b994e487c6ab.npy +03593526-5b13716dfa70014c726dbbf7bc5e4df3.npy +04379243-f9bbfd8acdee30158a63c123f2a561a6.npy +02747177-23a38f8cafa5bc9657a8fa4c1cbcf3ea.npy +04379243-49672809018ebc55224dbcbd6815e727.npy +02828884-802e7f3207fe4306175516c727777db1.npy +03467517-8b1d0f73e54ef59c93f0194265a9746c.npy +02691156-c7f6766e4e96ca0f444c0cf9e8ad6399.npy +02958343-58dfa36440ada6cf2a9eb0f146e94477.npy +02958343-dc5c1b1d9bf826b8851f021b9ed69c58.npy +04530566-11c2a8719a7d23207ca6caab209ed3be.npy +04379243-c1ba1f5fa5781abe276333179717351a.npy +03636649-a8d45280f2ac4e7190c926f4231a7285.npy +02747177-7919df48b23e61ba6739a7caa0c577bd.npy +04090263-69765630d57639cdd7166ab41aa5cf74.npy +03211117-c32dfbc85ddecd0eab610b0c94236463.npy +03001627-90a15feb4f77c63e5e73882ba2654055.npy +02691156-b152548ae1a12bcb680558279a114842.npy +02871439-93903b233ecb3937c21c5d9d91c5c9b5.npy +04379243-4977e64ab070b003b778cbd50553af38.npy +03325088-b658725e78e7ae9014b35a7d7cea7130.npy +04379243-a1d2dbfb4b3a6c113ff4affcd321d45.npy +02992529-ab8243a880170c00cca1221aa4c4f70a.npy +04401088-adf64019f7a54162550c9b1b1c5f7e5f.npy +02691156-536f5d8e46467566643c3c243d611069.npy +03001627-4bcc7c4e4c0bfe47e8f8c11a24c52ebb.npy +04090263-b7e59df21f4859281a857c47fd0ecdc3.npy +03001627-c98c12e85a3f70a28ddc51277f2e9733.npy +03624134-ca6e866ca1133eeb1395331ebe4786cd.npy +02871439-30f45a446153b9f1fab6e40cce6926d7.npy +03001627-677846a1d3777e90ffb9df6156f4114e.npy +03948459-802312b6dd3bd38332a77024dbc3f67a.npy +03001627-46e1939ce6ee14d6a4689f3cf5c22e6.npy +03001627-70f57047512c2eb84104b1c5cb7f9280.npy +03624134-97cf540e9a88704972dde081fcd2b8ff.npy +02933112-2a22566c3bad34a7d0b36851d61b6fca.npy +03001627-5e89f5cc834553622acd2bb6205825cb.npy +04401088-5ce8fc4a82d2d97736d4d4df7a719b88.npy +04379243-3338d1a99d7387562a488bb287b71f6e.npy +03636649-b158a8e4f45653cecc571cd3cf8f17a1.npy +04090263-6021c3fad833e4e51646f62c9305a389.npy +03636649-e6629a35985260b8702476de6c89c9e9.npy +03948459-4a7d8a49bc6365f92f55420fa8e157d3.npy +02933112-6eb88254824387bfc59350d819542ec7.npy +02958343-eadebe4328e2c7d7c10520be41d00de2.npy +04379243-5420d2a9cdd0d511e76bc197b3a3ffc0.npy +03046257-f1e2c567a76c9b0ee3f7a74e12a274ef.npy +03001627-ddb53381dfd0a2d7d2b12aa6a0f050b3.npy +03001627-41bb8be36df856eb847d4e46a1f9f05.npy +03001627-432346a3345e3e5dd79b19c7c4f0e293.npy +02808440-f7b303def4a2c10f211278b445671dff.npy +03928116-512b7b3f96cd981f834096795cc3cf10.npy +04379243-855e0dd7d801faf61886830ef08153db.npy +03001627-cb8e63317e0ac998e6543556f230fe9c.npy +03790512-6ad8d3973ccf496370a48b7db120f9fc.npy +03001627-a1ca000d08da97ae43b5d2063387bd6e.npy +03001627-733b580501f3e25c21ede3e0ecf73091.npy +04256520-de6e76b4be0db5a0f81b347089add3de.npy +04401088-ad66da8440023d8a1e929774f9727b5e.npy +04530566-af936a44c902756dfb04eeadf4d8d0aa.npy +03691459-ce21542cb2b0bb3458107383640dddec.npy +03691459-5bbdb492122b18cf65d1c7f91840e570.npy +04379243-1adf96850963550f19fb4103277a6b93.npy +03001627-d19ab2197f8e8582f97cb7fd36f15198.npy +04379243-4e934cf95db4cd3bce58f346b4d8abe.npy +04460130-64942df95c33b2911dacca859c0fc7c.npy +03211117-91bd5e0ff352d942abfcccdda2fa4764.npy +02876657-b31ca446cb3e88dda88e473ddd1152a6.npy +04256520-a4367b42274cfad1f2b7580a739cd4d5.npy +04090263-8e40afb2fc5d8b1c91e284193311f752.npy +02958343-29e9a4beeaeea1becf71e2e014ff6f.npy +02958343-93c56f05dfcd4248274334f2451a8eb.npy +04379243-6dc0048e4326feaaa6c03a53cf0a14c9.npy +02958343-9a3bf26f461a1973b8013668e30e23b0.npy +02958343-ceb561c72a407ddfdc50a691c68014fd.npy +04256520-bb39e48c9c10abee77f0370a839e670.npy +04379243-24b563bccb68e78bf939d21e50c410.npy +02691156-8f39d2dbb98bce6057b643a522b3d830.npy +02958343-8e0572912893a657c697c8c1c6e09e0.npy +03636649-56cfd1c474b7b88920c80e4850e77325.npy +03001627-59dd7258a2a554c34671fddd657dec0a.npy +02958343-2d1adb247cc7a1e353da660a6567c5ff.npy +02958343-a53c3515eff9f3bc2f732d6dce34e9b3.npy +03991062-ac79fd7f10f274aba2c59a4d90e63212.npy +03691459-8296f03cef18cac011cabb4938bfaf4d.npy +03001627-2560232741878aa1ed0003a3eb88f6ca.npy +03928116-599f5594764eeabe36244e3d0dd95a13.npy +02958343-2d41d907b7cb558db6f3ca49e992ad8.npy +02958343-26c382bda051376daebb91b7dc4caa91.npy +02691156-561bab672a9e12352c1752d7966dcc0.npy +02958343-198d8e274c59511b36a1a31af8f59.npy +04379243-51874066ba946c58aaf15b62af6b513f.npy +03691459-23a1ad8f7fdbb6a54821f0e819875cf6.npy +02808440-e203fafb218840443321831d2245cf06.npy +04379243-dc0db74cd78a3805f5600f911d112095.npy +02691156-880715a3ef69f47e62b600da24e0965.npy +04379243-d623665165dc5af0f51f77a6d7299806.npy +02691156-c2be303f5abf0db7b3369733e21bbc63.npy +04090263-40ad008d081e3d40fa9286f039319ff7.npy +04530566-7b200ae33e01eda467fd076ce612c54.npy +03001627-6e923ab0f28c3c2e7251f1ec40392b93.npy +02828884-5f9d3dae06acf0e4e93e1127627b834.npy +04379243-47bfb0c5ef5c3c7ddb6175ef18ad3f80.npy +04090263-3ce5f5a20bae04221fca469af258e053.npy +04090263-ada26cb4cb6e0b1946177b6d1ecbf989.npy +03001627-8967e65c1541d1874aa7f42ef07f614e.npy +04379243-5385893962db72324b3c42e318f3affc.npy +04256520-9e9707ea4d5c5968a283d3d51bc54a1.npy +02828884-f72eddac559ca6a6a51c26819f8dbb51.npy +03636649-e7552c8c718a1a109f2349486c570dd4.npy +02691156-8406b2372f6e1478d62bfd1579f9a1c2.npy +04090263-c6bea91c2b9ac3245127e0873cfaa7b8.npy +03636649-98c7c2542dddd40af24f994bad42f06e.npy +02691156-376e9480ebe635b1e98208adea7b4e8d.npy +04379243-6848c467de649ac2af5e7c004818a73a.npy +04401088-45301b15dce2724e483a0f6665d9ffe0.npy +04530566-738eee54143b5406615bb39b45716cb5.npy +03001627-9d395454d6de675d2025ebfdd95f4ba7.npy +02958343-f8954a634d103c54ea778d6c713d08dc.npy +02871439-b8a7c4c8017e49085693f7ffb7544f67.npy +02691156-759da7376ab2196a66df9c92bbd3d5c1.npy +03001627-2b66adf2ba9858eb19fb4103277a6b93.npy +03593526-a76b1bd56ffba0ccc9f016d57db96408.npy +02691156-b63f7eb03f91f8a7de04805f7d685d.npy +04379243-b3f05a35fcb82f678d3a66f462d312e5.npy +03691459-b9c2454fc2ef38db3db7c6064037cd52.npy +02828884-e6b0ac08a5326f23faf575cbae5008b8.npy +03207941-69b0a23eb87e1c396694e76612a795a6.npy +03001627-fc0c6ce55282cb4dc8687ff9b0b4e4ac.npy +03642806-90c01fd78513bb99c9b20aa1b8066c46.npy +02876657-6c24c027831790516f79a03aa42f27b9.npy +02958343-cdd00143a3e1e33bbecf71e2e014ff6f.npy +02808440-76a687cb1dcacf883321831d2245cf06.npy +02933112-879c6614916fb6907812c3baf25c5bb.npy +03001627-2742c0a5e984d92fa0dcc52ca811e565.npy +04379243-34e70464c2a7c17d97b40b8029c75005.npy +03211117-d24f05f573621080af70f0a098b23d33.npy +03991062-ffa6f6a754334d00a2c59a4d90e63212.npy +02828884-759fbe8a3ffa3831a895774ea4e4686b.npy +04379243-2a0b5875dc999a7a29e047111bd79063.npy +02933112-4a30aaec0e83f992c59350d819542ec7.npy +02880940-a95e0d8b37f8ca436a3309b77df3f951.npy +03691459-daa10595347937b9ae7dd8d7b134d1af.npy +03001627-e66276c70cadd32a3eb520ff7cd241f0.npy +02691156-3daca58825ce2ff6dc82b8fee1057b30.npy +02808440-c7c0c46ba87f11ca4c62bee40dcdc539.npy +02933112-7c68771e303eddc16adc061043e7c712.npy +03211117-2d5d4d79cd464298566636e42679cc7f.npy +04379243-e72ff1a58d752d5867279908dcfb86fc.npy +02933112-2f30f402c00a166368068eb0ef40fbb1.npy +02992529-c4b66fac952d4ef7d9039fb3a1715e96.npy +04379243-2810c2aafcdd9fc3f51f77a6d7299806.npy +02828884-5bc75cb5c0270e60d2b12aa6a0f050b3.npy +04379243-3e0fb214c130556aea3f94b6bb1b2ed6.npy +04379243-60fdeb4561048f63f5823a6b2902a9e4.npy +02828884-eec9e185d9596e7ed2b12aa6a0f050b3.npy +03991062-aeef58096019b9e25d8d4d8a3cf8b294.npy +03624134-89f69d95f5598fddd42a2a5a47e9ed5.npy +03001627-3ccc4efe519087c470ef1a9d40467de.npy +04256520-24f5497f13a1841adb039d8689a74349.npy +03636649-43989558d13b1186dccf149c7b4065e.npy +04099429-3e34a0b61d3678f9646343ecf02768e7.npy +03211117-38ecf0c5f3d5ee533fb0920a55a7e805.npy +03001627-fbd890f1f0280b884b47ef9f38e7ab27.npy +04379243-8eb366f4f602219b490ad276cd2af3a4.npy +02871439-faf8ece43ab74cab21b8b4d51c5535a5.npy +02691156-8df55e58da6c297b4c3a35cee92bb95b.npy +03046257-6e143fc9eef8be8c788a9e26a791a23a.npy +02924116-9332819c99f0ba07973f659238edf3c3.npy +02801938-efc55d2da732898d188976e1056285ea.npy +02818832-fe11d05aad83a1084a5fb5c8287668d.npy +03211117-dba7ecbb12fffaebbf61576316934f86.npy +03001627-9df79431f16cad05116162acefe23592.npy +03991062-24bc34cdce868610346ed9821e11e90.npy +02958343-a2c9c1b4bf918cf6d2dcdf586ee56d5a.npy +02808440-767fd747f18ccf466c2e38b335c98be4.npy +03790512-abdfb5b2d82e555e3bd003e0bb7a3ed9.npy +02828884-c50aa1c3da488573ba5342d638d0c267.npy +04379243-bdefbb1f281434e39961e1085a81acc5.npy +04379243-78625405f6c44bdccd67f05ece4a06eb.npy +03001627-6aa1ac5d377261d1c2fbfa4bf3252b56.npy +03325088-470811d9dcd8133f76c18e71fd49c4dc.npy +04401088-5dcb666efc36d9a68480fb9b9f30e540.npy +02958343-f643555dde0f0838346c6b68550f2695.npy +04256520-21ff7152b3bd0bc3df63d1c7e43c783f.npy +02942699-2693df58698a2ca29c723bc28575d785.npy +03636649-4f54aea89016146f771b0e756a54d849.npy +03691459-969512b0adee661679c6a0f7677e9555.npy +04090263-2a2b25ca77af35cf30dd2b88f7efae34.npy +04090263-a3896a954602b229d9d2bbf707e9704b.npy +04530566-3fe8b8d9fcf031574bac1c894ff81b3e.npy +02691156-d18f2aeae4146464bd46d022fd7d80aa.npy +03636649-981b55897cee64403c8d0fdfb1cc2535.npy +02808440-ed208a6ca79ca685b974c98e4d49e283.npy +02828884-4273dca1b0184024b722a94c1cd50b0.npy +02691156-6db52e6917c80e5157b14532cc71431d.npy +03691459-bbe69ee745bd5c427d35e00bb4edf01.npy +02691156-ccc0bbcc236bdff9c1ccec171a275967.npy +03790512-506962955771904b1d471e626c3ad496.npy +04379243-7f57fcbe1e7af1c1b000f20a5153622c.npy +02691156-144070f63941362bd1810447902e2904.npy +04256520-9dbd663d977c64d1b982b1d54ee6ac1d.npy +03691459-9ea3e05166af97ed20363e2561dd589a.npy +02828884-8f99b25df578652ae37d4fb630545e64.npy +03325088-66cc5be6bf49f17589577ccf07b31e7.npy +03001627-6fe690a6f597351162fd10b0938dcb5.npy +02924116-c5f6d95268f6e9d7b96a75b253e6b907.npy +04256520-a109fd29656079e714b96b665a8ac321.npy +02954340-a444fff8c769de616a10eb60523df1e9.npy +03046257-640f12d1b7bdd262868fb986bc092533.npy +03046257-758885e4c4e7bdd8e08074c1d83054ad.npy +03001627-1fe33fe022779bf8b0957d845ac33749.npy +03691459-aede81c0789358891ae45cdab702386a.npy +04379243-7aaed3e906eaf675a57b3bec78e5d1b3.npy +04256520-db19747e2c5b126148cd16ceeddb841.npy +04401088-7d5180e005f1601ca36bec4fa7cd58c9.npy +04090263-a2d0d9e62c7fa469f02ee453ff283e26.npy +04379243-c180b07c9b0f46b9f8c3d2002c77ddb.npy +04379243-e104beba32cf40bee369d8ecc5b0e866.npy +04401088-52541b667e4dee9b1c1be4d7e88f11d5.npy +04530566-54196fe702cd0f5ba27ad5a09bb4c2bf.npy +04379243-5e0340e08510cfc52f84cb7932f866fd.npy +04379243-f9aab5dd0162b688e9a1a03c1d065394.npy +03001627-e35d7d19dcdc9e5c30e06a011e63236a.npy +02691156-c953df8a3f917663a9b2becd26dc2fc1.npy +02691156-d08471df3e76602427743256ca3834f.npy +02992529-34e36249166b8c6bc3f912172873d52f.npy +04379243-bbc451f0431c1b06cea52a85deb0c978.npy +02808440-417754618af59dd754d7082b34825ef0.npy +03467517-a4170135b1055cb8982c503992eaf09.npy +02828884-cd08399f8fd8bd3bec6d7b771f3c56c6.npy +03001627-bfb71bd97fdedc6c48ff063e62e02115.npy +04379243-44302defc423e34a8afd316e82119b42.npy +03046257-1d5c5121e29011ddb8183a4a81361b94.npy +02958343-97bcc7a1f73bfba93e5399147a5b4763.npy +02871439-5906acbe33ee8b218cbb8bac2032149c.npy +02691156-1fc2625479e798b11944f01d3ab2091b.npy +04379243-3b51d76c7770b81a3c6c6fc37120868d.npy +02876657-e4915635a488cbfc4c3a35cee92bb95b.npy +04401088-2098a0f7cef1e593f6c5597dd1efe723.npy +03001627-e07c55b60987e8fa4067a397c01042d9.npy +03001627-58b8bc3981302103b78c56df3d6a2934.npy +03001627-a497f206aa62e89c8ca0fe30c6caf3f4.npy +02958343-397d2e2b3e0988a2d3901a534bc610d8.npy +02958343-d55179fa8bec81799779c759176b96e3.npy +04401088-e7bb86cd04cfd98758f1d9dcdcb62d55.npy +03691459-40e4ae14fac94d0b45bf366c0f22b100.npy +03001627-f678b1e737eb4d5c738e43095496b061.npy +02691156-993599a55057f963ae7c0d0e12bd33da.npy +03636649-a138582b1d0b9cbb137af984a9f45d65.npy +04256520-54a209955f7a47bed8e8a8a207ee5bd2.npy +04379243-18c8f6ded2f14010746cec00e236149d.npy +03636649-4ed37408e5bb257ee356f23093e95c53.npy +02691156-298d674a14dcd356de6e2d41bcaaecbf.npy +03593526-d0be31319409de673ce0d177711e253.npy +04379243-23fdefbb27881722b0f92c9828c358.npy +02871439-b574e0258d18f4a283f3fdd3a2f8d59.npy +02876657-74221bae887b0e801ab89e10ca4a3aec.npy +04530566-dcd17bd79acb60f3ac8108ca15b709b.npy +03001627-658602dd0da08614a1b6f261c8f1ae0b.npy +04379243-5c2c29fd07c365afe5c65540d3456093.npy +03211117-ed7e0817614b1c155e7087f2d9a278a9.npy +02880940-a0ac0c76dbb4b7685430c0f7a585e679.npy +03001627-d75a219d343d2469e22abcbea1db98d0.npy +03513137-20ba624db264002082ee371ba207c717.npy +04256520-b0b942c484db4fd7afb07a946d621b3c.npy +04379243-6152e14b042aa17546f41dc2aaef556b.npy +03593526-ae9e1f9ff5b492524dff7c27c1f6df72.npy +04530566-36b38fd918d01c6b6c63b8b48495261a.npy +02828884-d014dd996cb7b8ba4f34c3dabeae093.npy +04379243-4cf6260ddc4e1ffc2ec2c1c65e9866d.npy +04379243-a95176f3c7a102acdfb197c00c97d72b.npy +03636649-bd9b0dc06cbe7b123c8d0fdfb1cc2535.npy +02958343-7af4a575dc3883afab355379ede04b04.npy +03001627-da7aeb7a73f298329940c34828c5731f.npy +03636649-13c361b7b046fe9f35b0d1c9f81f0b6c.npy +04379243-20ab56e8a819c7f06a9633583f89b17f.npy +03001627-e18776689e00c8b84f871aa82358858b.npy +04379243-812a19a717fb5bf34510596cb4be6a33.npy +04004475-b2330f57a3743c90b713df0d260c2628.npy +03001627-d080bfadaee310d8a21e3ca11c5bc05e.npy +02958343-212685bfc2a32cd9fe8cfdfb3bfc3376.npy +03467517-7eba657565cc69e913f86abea5e4b9e0.npy +02880940-be3c2533130dd3da55f46d55537192b6.npy +02828884-4814cb73a71235dbf155d75bbf62b80.npy +02828884-7d865d0774f34972814c9aa90ee14e.npy +03593526-57693fd44e597bd8fed792cc021b4e66.npy +04401088-f022d7789de219e1fb7ad0eb0a148aa8.npy +03467517-feaacb1b8c140e5ff962b6de585c4677.npy +03211117-e1eac12837bcadcf44d2fe7d13c65f0c.npy +04379243-6ed257cfcd73fc6830bbd4cddd04c77b.npy +03001627-8abd5158ec94dfd8924bf081da6f024c.npy +02828884-54650f6fee0e76b8b173657dabb4301e.npy +04379243-3b4dede09e8125639d653bd9cc95fa15.npy +04256520-dac6d5f66189b340d4ffe37a3ab73512.npy +03948459-1b8adaf6f8c40366c416aa58a067b7bc.npy +04256520-12cd30f7f83f441dc13b22d2a852f9c2.npy +03593526-2da4d88435eaab6aa7f0dc86456c3021.npy +03691459-f2eb4b53ea11200cfb10a282776be584.npy +02933112-12bb12017516f20d28b780bf7c8edf1d.npy +04401088-41d95e8979b8377d251f8cf5c284bd7e.npy +04401088-a3c1c9fc390b1bbbb099170e6f5a4af9.npy +03593526-7bcc0e91bd43908df4a06efdbafdd7ea.npy +03211117-faf54bcb640753a28c6daa755196a36.npy +03001627-6b9dc32e4d278663c8687ff9b0b4e4ac.npy +03211117-722df1da5778d45b1e43523279c7f09f.npy +04401088-5e485b1ae058fc11b26a5d88c8b02ed9.npy +04379243-2fad51052bae2366377b9297f3055210.npy +02924116-dff59b81f0eff60c8c5004350953aeed.npy +04379243-d35a2fb01107b6178727c7a6ed7a8927.npy +04379243-469122d4947cf83ee6942c5426df6055.npy +04090263-6e157a5e034eb9f49f433921788191f3.npy +02958343-76cd991287a5aac9acc9e84c45e9a610.npy +04379243-1ddbe75f64683937f4b6538438a0b930.npy +03636649-fa6b1702f7c1fa191b17743c18fb63dc.npy +04379243-ecf3d40b14300d3c0c26b04b6b8e17a.npy +04530566-355a85d0156984c75e559927dcb9417c.npy +03211117-59580147939bcb7e8b296db8a8f00728.npy +02828884-cb48fccedaee0e82368bd71100fb3a30.npy +03001627-d15c94b08b5d92e57962800be79c6e52.npy +03001627-4bd7a49e63e0e97936e3b2fa8d1eb4eb.npy +03046257-7e322702d66d54b560d9b527752ac99f.npy +03710193-1954c0e02dafb95291389b3c4840180b.npy +02958343-db86af2bec3e48d7beda80d430b92891.npy +04401088-280c7836d6302b4bf3f8467cb6fe657e.npy +03001627-4b79197258fad3363efeda73d60343e4.npy +02828884-a8a6aed819779d6b19fb4103277a6b93.npy +02808440-bab85a8a0338b58e3321831d2245cf06.npy +02933112-932abcefa2fa0d5960e37b3f76995f8b.npy +03001627-bcf67dfcbd6c1fe7da8e9e0272759299.npy +04379243-5640f565daac3dd3772b104757a4809.npy +04379243-a6f69bef589c295d51ef8c8b1fdb41ce.npy +03467517-ed486c24321fcddaa3d3eb77b119df6d.npy +03001627-74391d05121df162492d9da2668ec34c.npy +02828884-79b66254a33c4a80e68b7becf68bd6d3.npy +04379243-89e73205e8d18a8c99e8bf807e902261.npy +02691156-471ca950dbdf0c6c5f80f808704d6409.npy +04379243-3f1579c1713ae72e2d07d128adae16ff.npy +02691156-e45d71c7afb3cb1c67629418bd553f95.npy +04379243-e7adfbfabcafa394278f90ef85162deb.npy +03211117-6856b84c3a8463e3d5f7c62c7dfe63f9.npy +03636649-583a5a163e59e16da523f74182db8f2.npy +04379243-6c6f63434cc1f447f51f77a6d7299806.npy +04460130-6d43d4642c7a474638cd8eb23853c009.npy +04379243-2f5f32ab1652320dba18ade30e563d37.npy +03991062-eafe716a8ab5722278caa162a41a851e.npy +03691459-46ab468d333233b062a6cf00d929f875.npy +04379243-d16bb369a03f260cc48d90eef8384210.npy +02828884-498ef3fb51503dc36e07666ce67ff5a.npy +02924116-ac2444d4255279548a7522bf08a9766c.npy +02992529-efed528241cd773fa2c7c5886f4bbc93.npy +04379243-98b3a7df1e233ac7ff10e98a19606836.npy +04256520-a702d178064c7b81fc078d27c856022.npy +04379243-e42e2c616f8c38619ccce4c6d5bb195f.npy +04379243-3f80c1ddfce08d18525211e12d56c55f.npy +03001627-40a9dd43155979e7c40cffb9454b27e.npy +04379243-574447022c4473d455f46d55537192b6.npy +04530566-e604463b6c45712395ea46728bcdc15d.npy +02691156-b3323a51c2c1af9937678474be485ca.npy +03642806-476cd9a7a0a7c491c96e2e556a25ab0c.npy +03325088-ae3c54f6a88813d214b35a7d7cea7130.npy +04379243-496de03106abdf4ba766a367d5e2d6fc.npy +03001627-1e1151a459002e85508f812891696df0.npy +02958343-115170b8b44f9e2e5b2bb28aa7453162.npy +04379243-c20a5f8cfa29824b310af74324aae27f.npy +04256520-1b8894ce5f53e0007143b902ce4e435d.npy +04379243-689c4f50ce0aae27908caac6d5f8ca97.npy +02958343-9c827e532de4967285089a13cc567dbd.npy +04379243-c29a4a7506b89be2af4d0d91ea903469.npy +02828884-6c1ca36830d54ca5c9736640ccf985f5.npy +03207941-b187206fe6ed4228a805114916841d69.npy +03624134-20050969c1d7134cf69ec30ab244a145.npy +02828884-702870d836ea3bf32056b4bd5d870b47.npy +04401088-a6b2c1427dec317525bf2427892579c7.npy +02691156-d1e81c9479eb1b7da9263338bcc7d067.npy +02773838-e1838a13ace989545de21284bb515a83.npy +03928116-9071693a85f8425790845915a86bf9b9.npy +02933112-eaf341c056c79bec1a2c782fdbf60db6.npy +02871439-aa0bab8405274a3568966ba896bb15dd.npy +02958343-f1a20b5b20366d5378df335b5e4f64d1.npy +03636649-994e14ddae6f642ca0a1df19404132e9.npy +02691156-820ba20e5da8325f19ba010ddb4974fe.npy +03001627-b16f1858c1a7c0a65001cb19c4a0eee4.npy +02801938-526a9f51fe93659c3c140c326fab0b5b.npy +02958343-707c8930b987b1f3a6c0381be0943b0e.npy +03325088-1c0b65c18b56fc71a6c6cdd30dc62f82.npy +02691156-a331e93c3184742853a6ddb5892da51a.npy +02828884-22af1585e38e4e76ad5067eac75a07f7.npy +02828884-931017bd80aa7a90edccc47bf0dcf5d3.npy +02828884-ca85baab8740ffa198cd58ee93c42c40.npy +02828884-e8db4ae7ddd84627d4d8765e3910f617.npy +04256520-930873705bff9098e6e46d06d31ee634.npy +04379243-9160a9dc1c840e79c607634b4693f04f.npy +04090263-58b926ca85b6ea549a6e43b878d5b335.npy +02843684-5919f39dbe6c9351d474325246d1c061.npy +02808440-11fccf143d5209c71c17aef130ed6213.npy +04530566-6a541c64083d2bb9c5408f4f799fe72.npy +04379243-2a0f853dadd841f96f1e07a56c129dfc.npy +02958343-501ac8493044eff04d44f5db04bf14b8.npy +04379243-84d8b1ce802662984fa8d6439169bda4.npy +02828884-10b43623dbc8ab25ad5067eac75a07f7.npy +02958343-316086c3587f9c07d4db32f454eb6c4e.npy +04379243-1a8a796da899cb2c4d672fe014b9000e.npy +03001627-bdc892547cceb2ef34dedfee80b7006.npy +02992529-9cc581a6c5d0b8fcc14f5d127de947a6.npy +03001627-588bf81e78829fe7a16baf954c1d99bc.npy +02933112-7415fc8bf90b3696bc08b7cef3268bb.npy +03001627-802f70c906274da08616812464c86290.npy +03636649-19fc4044912f5cc4869594a32151bfdf.npy +02958343-b35117b7e025a012bda733a39f84326d.npy +04379243-c12ab3b5a8d40626c6027d1f057f82f5.npy +02958343-5dc3ec70f394965368d733072f36728.npy +03691459-af7aded6c26d2b119d3f10ce46ef328c.npy +04379243-1a96d308eef57195efaa61516f88b67.npy +03001627-b2d91caf3615a9a7f51f77a6d7299806.npy +03624134-c7a96262d5dfc1ae72c447ef6e5cffc2.npy +04379243-8d143c8169ed42ada6fee8e2140acec9.npy +03046257-30bfa6b225b030ba3756a875bf156f26.npy +04401088-678ec09bbde5f116716c29316ac4d0a0.npy +04530566-29af666e04825f66576378847ca0b69.npy +04090263-85e714acb678fc59ed6071560148e6eb.npy +04090263-945564d4497f3a0398838fdf70b3e60.npy +04090263-6eda9bcd1c2f4c8fa33c2b3fad570e45.npy +04256520-bf837b5821d05c00efe1cfa376f050c5.npy +02691156-845364350601ca0cbdf0b44e2f8f4e6d.npy +04401088-d2bce5fd1fd04beeb3db4664acec42ef.npy +04379243-b9ac8f3615d8ba0bf51f77a6d7299806.npy +02933112-7206545c3f0a3070e8058cf23f6382c1.npy +03211117-dcd4d3d6bbbabdc6376c487287ae2b71.npy +03642806-298cf1c20abcd641f9f562601150287.npy +04379243-35bce0bd439e04e63d039fd0dc042dcf.npy +03001627-cffe40b41d0162c46b2befe83a0efe39.npy +03001627-b7d4357aa24126a227a7baff096e3087.npy +04530566-2b1d09f8412f647899c0080e6a5589fa.npy +02933112-5d8c63fce0f30a46f251828d7c328331.npy +02828884-a5856a7738262b05738e43095496b061.npy +03001627-ef5eb51bbb7141c119fb4103277a6b93.npy +04401088-5fe99904fa4b22d4ff1911c2640f2e42.npy +03001627-1b81441b7e597235d61420a53a0cb96d.npy +04379243-631a942d7b87387019fb4103277a6b93.npy +02933112-646fa7efaaef21a41d20b5ad5ef1cb1b.npy +04090263-85d9133c2be9be93d017eaebc1ed8e2a.npy +04090263-702b1c4aac9e825f51cfdb4c9f126c12.npy +04401088-92ec69548761efc61f74e5d5bf005208.npy +02880940-bed9f618bef8d3e9f6d436d018e2b50f.npy +04379243-f992b2e0e44987698cb5d9909aeb1309.npy +03691459-dfc293d76992ed9656fd7f904d2e0c.npy +02924116-7e62538347c521325f7a2a8b8d62d402.npy +04256520-a27b9f94d052176af27383fc5a5a711c.npy +03001627-20627f21d8681503f2aa3fc45e8202cf.npy +03624134-6d542cef32a690f248c2fa4fb6bd3e62.npy +03046257-9986c03f7d7e8ed111d1123cebe2740b.npy +02828884-70edb39bb2710eebcb2a965e75be701c.npy +04379243-bf45b5c2c9dd8fa9fa24672a35ae8bb.npy +03636649-571137d6378372c5fcb8d8c6d4df8143.npy +04090263-1a289f162d63c0fa8dba2b86f956c537.npy +04090263-feeb8220f21521d4b4c6d1a32dc4f554.npy +03001627-b6de66042941f5691301e24e9e27a9c3.npy +02818832-de14f6786ddc7e11bd83c80a89cb8f94.npy +03001627-4a24652fbf2bed7e93583c67df8faf1.npy +03691459-8e54ec9d554584cfdfa0db1c1e10ab1a.npy +02933112-28b381915e04c62934b6da227fd64942.npy +03001627-e5da52f5d1ae95f75a8ae8f7c307d01c.npy +02924116-4fdc02421954e0fbc08550bf6ec9e732.npy +03001627-2aa2d2bb646fdc511b7ca0421af5a45e.npy +02871439-699468993d0ab5cb98d5fc0473d00a1c.npy +02958343-e3cf84131f9293a5ea0b6fe51a588e07.npy +02958343-e5247d798b4538094046e8fe9dfc34b5.npy +04256520-9c868997ced1aec1dd904956425d1eae.npy +03001627-bf37159b9ca55259e6fe3612af521500.npy +04090263-1711fdba3382cc39fa9286f039319ff7.npy +02843684-bfb6e6472e91e0148ac033353d37592a.npy +03636649-bf3e47e405833ab715655d3195f5022b.npy +04256520-6e3771d48b3982d0eca22c501ad0a77a.npy +02992529-ae7098f0bc20cc6b2a87aa332da7bee6.npy +04330267-898c20d376d7d44e5eb64c1003065596.npy +03691459-3b63777e658e7137f36ecf951968a8b0.npy +04379243-20e5bb165c5e129ea5a11194083a61e7.npy +02954340-fd63218d927ae58cbf444790f25ea3db.npy +04225987-e7c330f4c4421dbb24e49a3e82c3d033.npy +04090263-9bd4ef716fa467a6c72189e41b1941d4.npy +04256520-5a99fcbf7ad93010ebc1a7ae7c4c250d.npy +03624134-5da598733fda1b7aea5aa8dfe86aec5e.npy +02808440-4decc1afdd1eb8494c62bee40dcdc539.npy +04379243-25775a3ee25c6503dddd8ce1cda8c6d9.npy +03001627-e6778535d7fcbf6fff16555386d173d.npy +03624134-79e64f242e7101fdce92dcedd9b9f51a.npy +04379243-177c1102dd46badce958df2e8332e31c.npy +04379243-6d5aaba9f6dafca977252fffd1947df5.npy +02828884-35686cf1e7db69d580be56c7b04dd6f0.npy +02958343-974c3d82f8726f086b418c7d9fedcaa9.npy +04379243-927dbeedb2d864d635dda488a4bbb1e1.npy +03624134-b0f9aad955aebe6759d0a47cd36512.npy +02691156-cae48a376cb607547d3b11085e75c7ad.npy +03211117-195d9d0305fd1625679efbdc830f6d0e.npy +02958343-d060adfab4c02ec616abce8cb03e7794.npy +04530566-fe24ea1bc3383631370d3273b84cb8bf.npy +04090263-5dcda2b98242d00b55f41a702b987e76.npy +03325088-bedc697875ba693676c18e71fd49c4dc.npy +03001627-4304100faeef130337f67f4322e8d3d0.npy +02691156-d9d282f79262ebd4c3a35cee92bb95b.npy +04256520-54506969a60017ac8f0a57a8b9390a.npy +02691156-59b8d36b0f96aa5cca649c0959202cf.npy +04460130-17f5482dd8b9dbddc850800ac472a578.npy +04530566-a6d232b7443609fd20ded1536778b0f.npy +03211117-11c041a780cd7e58e8b612d9fc824411.npy +02691156-77dfd8d4ee3c54c3e99ea3c41458bc01.npy +03636649-f69d3903096b6bb78ca4aeb5e3b33af7.npy +04530566-933382c8b6cc6e24f0cdce9bd16b6c9a.npy +03636649-ac1e6d46bfff76a664b3b9b23ddfcbc.npy +03691459-91b781b40d32b74dc491effd0ae881ea.npy +03046257-4593877d0b238443728b983f64e482fa.npy +04004475-d3ea7b61f5fefcb59983625c07de3812.npy +02691156-a55a46c1442470aeace5721ccacba16.npy +03636649-6512e3a8e6566fd0cf004563556ddb36.npy +04379243-b4bc3e5192dc476f609fb05dbd8681bd.npy +03642806-28fbfd8b8c9c6f16e1e44e2fc05361d9.npy +02828884-7a89313a148bf1bfcb2a965e75be701c.npy +02828884-7229a4c3b3146f74d838ae16242881dc.npy +04401088-57ff44f979370766976fab5d6e2569c1.npy +03211117-182a5ccd3c0c9887c21c5d9d91c5c9b5.npy +04256520-b090f9315fc9e0cf9936c7914e42d921.npy +03991062-b384f62a88a2e5a8a127ca53341bcf9e.npy +03001627-c472a815afff5ff0e6c5cd45aa112726.npy +03991062-f794d82d7be73b1a9f7e329438453d00.npy +04530566-cfb7ca78b0b65c4f2d615e80824301ca.npy +02691156-a922f408bb1b1ea1f2cb090f7f07d463.npy +02747177-b03989e0afe2443581faebbdea6bd9be.npy +03337140-bff01605583f2d7af84b0be7f50940eb.npy +04530566-e3431dc06c6f4c22441d5d15cc0399df.npy +03046257-686a205c36f5c85443ee5a34155b4f2b.npy +02958343-ed4fb30733bd0979b1bb46d2556ba67d.npy +04379243-dc6f030d9ee566a5dcfcef693e7ec696.npy +02691156-4992d4c425b3cb426e8204b21fc3574b.npy +03046257-4936b4d8dfbdf2cdbd09663b97413cd.npy +02958343-6056451a4b65a12858dbdf2b5c6acfca.npy +04379243-b4ca27e38b327aa0240c1f0f1e25335.npy +02828884-a82c14ef1540d3abf4c42dc386169bd6.npy +04256520-c2d78f31b197e0bce2d881f085d6d86d.npy +02828884-c96afd58ad067a6871b66f80cfaa9877.npy +02958343-63599f1dc1511c25d76439fb95cdd2ed.npy +04379243-d9b418e6ec14dbf50efffb055ed6bd1.npy +02691156-da5fda29d2415fb09d92b4de623f5639.npy +02808440-fcf0ef94d568f97054d7082b34825ef0.npy +04004475-e3898229d4bac27b15a34fa27bdf3d03.npy +04379243-ce8fc9bf9c9fe3ce99e434a62f00f7de.npy +03001627-914f301fd07c20c840ef1c8b63a628f9.npy +03001627-95ff15679bc2d2bfab41e4eb455c2269.npy +03001627-df23ca11080bb439676c272956dad3c2.npy +04401088-fd1dd7c841cd9cf51f05b3da5aad55f7.npy +03593526-1d4a469bdb53d3f77a3f900e0a6f2d83.npy +03636649-107b8c870eade2481735ea0e092a805a.npy +03636649-e7310381c64cd87f8880edc6251fa529.npy +03636649-777a686890d74b350359b4e03cfdfa.npy +04256520-b8469c14aeb092f74fde46457697d80.npy +02924116-9e75756bd1bb8ebaafe1d4530f4c6e24.npy +03001627-4facf9c7f5555b28c0f947750540fb22.npy +03001627-477dfe89f1d5df337fa68300c57bff0a.npy +04379243-88b217db267f1ec61e616612e30565e8.npy +04379243-b04a4cb79890c846ab7f9d2da6fc61cf.npy +03325088-af708fe6eac1bc9450da8b99982a3057.npy +02942699-f1540b3d6da38fbf1d908355fc20d631.npy +04090263-d835a2aa71cfd29dff790997f2048517.npy +04468005-d928c4ee5ef8f84e186582d606e06e65.npy +04379243-29c6a184dfee3050820018801b237b3d.npy +04256520-dd3d82569d4cb2b5af140afd78cbb542.npy +02691156-7981eae34c05e8409a6e43b878d5b335.npy +03001627-434405216f00c9654b0375f3afdcad10.npy +04554684-177501db32f76aa4a2ef01d38c90dbd6.npy +03691459-a551777c3b35c06f43f491729931f44.npy +03001627-43cc05f81df8307a4357a62465045ec4.npy +02828884-9da3d1f848bb801c77ec6cec7835f07c.npy +03001627-633110fedf1efac0f7628281ecb18112.npy +03001627-d89e39192db6fa78492d9da2668ec34c.npy +03467517-df25fdb2b8ceac673b2deb8c31cb5d73.npy +03001627-9d63d69501b9ab9067994ca435825ef.npy +04401088-8cac6df50c515c498be6bc9d57b6a438.npy +04379243-d93d1957e7a38a6619fb4103277a6b93.npy +02747177-c5c2a3f8d66cdaf7ad5067eac75a07f7.npy +03001627-195464ae11f6bfe1cba091e036bf65ed.npy +02691156-90bd96c05c0208c642d1180c659735fe.npy +03790512-b4112da294c1febf65c8f8f77b16f337.npy +03337140-229a34f1529c4ac14c3aee8e9d3a6ffa.npy +03691459-e41aab211af3f84673e1b2d018c0512.npy +04379243-6f019fe6ab60a3e37b11ae648ea92233.npy +04401088-da1fcb7a374f9c43397c13131c65cbca.npy +04379243-216da8313bc7b192ab610b0c94236463.npy +04379243-9e22ea3530631b5e95937f6e581cbd41.npy +03797390-b9004dcda66abf95b99d2a3bbaea842a.npy +03636649-3fb39b80530c18842417a6b5541e7395.npy +04379243-4b1744fbbe73dfb39ccce4c6d5bb195f.npy +04530566-54daf1472c51bb47a97a590141e0046.npy +03046257-9b28217f38c32415e02c50e637560d85.npy +04460130-58695979fe916c43327144edfb578d92.npy +02691156-1490a4ae04d453784f856435f28995af.npy +03636649-3f6e9d27bf0e972b9f42325587eab087.npy +04090263-18271afb4b31686bb53dcfbf8e62caa2.npy +04090263-b50f6037b0f9b86879d9900c00629c24.npy +04401088-5b7901974a37066aee44e0ef4ed60fd.npy +03991062-3e2dd918360309554b3c42e318f3affc.npy +02880940-da5f13f4048dbd72fcb8d8c6d4df8143.npy +02958343-ebb3c22708c9ad3a55064a110bff2f03.npy +03001627-b2ded1854643f1451c1b3b2ed8d13bf8.npy +03001627-586f09dd66df0beb2f45520e48bbfc3e.npy +03001627-4f7e9b96404fe19af37f22e93a631b3a.npy +04379243-4315e96a1dbf9337cacf13745dbfd112.npy +02958343-d2e1dc21db9b45df6436916a86a90ed7.npy +04379243-15b0e9fbea6581354ea9b65fc2574d0a.npy +03001627-253ca5aa292b344b7e673473caa41d7f.npy +04379243-3ac69f9e2517f836a341228b21d337a9.npy +03001627-ae3b4195dfa9779f89e49c5729fd5d6c.npy +04379243-9330bd524773fa17915e97a8e8ae6c48.npy +02691156-9fe677b21938f6bfcc14f1e6f4f4f49b.npy +04090263-2a811e61b3d6ce11c45f65ad2adf422c.npy +04256520-88d523dbcd94be8a4af957103f4767ac.npy +03593526-4cd2f74d052b561952e2d18963a75b4d.npy +03636649-573500f52762f0ea8485cf03cd00c621.npy +03691459-f3f07513f7deb6d1e4ad2926a22bd27d.npy +03624134-b31cf3ccb489ba2e7b635ec9828c6ec2.npy +04379243-44e9b15e214b390b2b70eac6546e93fd.npy +04379243-5067a85ef67c2e45ed403132b02528bd.npy +03593526-a791d4fa1d840408c5beea20858a99d5.npy +04379243-acfadff8f5ab4e7880d6227ff9b21190.npy +02747177-c461a147d5dea8152e91d3ee7cb428f0.npy +03211117-ffc9068c8de1fe46d9869786ff7f6a46.npy +03001627-908fd690e253f651f1783a44a88d6274.npy +03001627-6f11d4ab55b7a63e261fd7080fd6f759.npy +04379243-ecdebac7ddf6ef0011c50f6f633c5e38.npy +03001627-37e2b82d5e9dde21cbde89e0c48a01bf.npy +03636649-cb4b887b5acd27cde76bc197b3a3ffc0.npy +04401088-3bdd569911660da81229c79e4cce736a.npy +03991062-d1ed787e654dd0ff25ebd1cd0b422e32.npy +03001627-3730f9cc29006f4b65ba78ad9601cf1b.npy +03001627-cd6d000df66f03368ce66f12ba927a2b.npy +03211117-1984fb95afb6dae5804722305621f918.npy +03636649-26316fabe129210317fad902853ecfd7.npy +03001627-6893a0aac52e31a3578fec929fed235d.npy +02747177-e19887ca50862a434c86b1fdc94892eb.npy +04379243-1d393a06a5cf567d3892cfdb72a66fb4.npy +04379243-8cfe3ff92244310534506cc3910614fe.npy +04379243-92ed9344484dd026dfd21203bf8b4b46.npy +04256520-47dfe5f98cc9075850336112dffe8551.npy +02747177-af32b6f5a0343c107c35d3c5d3b1fcf7.npy +03001627-ef3377832d90dbbacfe150564cb24aad.npy +03001627-cee5c4ec2b284e7317b431cae0dd70ed.npy +03636649-ce621e6df1ab9ae35d2cdb96c1afe34.npy +04090263-dc29aaf86b072eaf1c4b0f7f86417492.npy +04379243-1b70ae39748f9b97456cbf78e1e89022.npy +04401088-5050d6be55dbb7cbbf82a0d508a096d3.npy +03636649-f018f4d78d295ef3a78d991d8e8834d0.npy +03001627-d2fe67741e0f3cc845613f5c2df1029a.npy +04256520-9ae05089e29678adeeacda4374ad94cf.npy +03325088-9fca1d6653e2bcc914b35a7d7cea7130.npy +03001627-fbd48960edc73ef0490ad276cd2af3a4.npy +03636649-d9e6815b6af181cab76e29c9c43bc7aa.npy +04256520-1d6250cafc410fdfe8058cf23f6382c1.npy +04530566-3679338b5a90bbf5fd1d4880da709562.npy +03337140-7dc4c1459f2aeaa6eea9d91e5bfcfc8e.npy +04379243-3f198d5bb97b930c87e847ff3a8836f1.npy +02691156-f858fdc6841407e6d4bf37afb4832e7b.npy +02958343-67aebe9ff1f103e18d1e606155667e23.npy +04379243-4ed5863efaae348d8b773535ea8cba6d.npy +02691156-e814190f683946b798b4e13cd6d24c30.npy +02933112-3e52f25b8f66d9a8adf3df9d9e46d0.npy +02958343-a8ee57eddfe30b35553fca48ce732862.npy +04530566-eb8569cf15db1dac1640aadca4c54050.npy +03001627-28bdf067b9fea968f17e3402958be9f.npy +02933112-ca0fd2a5d6aa32945aeac558fa5c869b.npy +04256520-8c6d7c225ba8a152387133b1607f2aef.npy +04090263-84149440704cddbed735fa1ab17311ec.npy +03001627-e46d1c2bef1875e2ed30b335ddc8b66b.npy +02876657-4b5f54fc4e629371cf078dc7b29022e6.npy +04379243-ca577373ec8bbddc7730743b6aaccb6f.npy +03948459-8ae24c618fe450d9ad047ee0c12cdcc1.npy +03325088-3ca7d12fe0b4fc5d3321831d2245cf06.npy +03211117-9d9bfaf1a4d6c3a05f8ab9d7b9f9d24a.npy +02828884-55f637ec7432a97d1d677cb74bd6536a.npy +04090263-1c74382abb0281e26314c3b6a3a65519.npy +04379243-34d280e8968c180cdf63d1c7e43c783f.npy +04256520-fae52eb61560b246f8555ec936cd4b63.npy +04379243-40b632472f8e69a7664b3b9b23ddfcbc.npy +02958343-ae086c610d023693d8a99964311c4152.npy +04530566-abdd2218a607a19819194900293f58f0.npy +03211117-246f0b722dff7f16fb7ec8bd3f8b241d.npy +04256520-cd10e95d1501ed6719fb4103277a6b93.npy +02691156-8615fe6e2a959ac1efe5f291bc2f5fd0.npy +03001627-6ae8076b0f9c74199c2009e4fd70d135.npy +04468005-3a5753b332b0b735d85b408a8edc983b.npy +04379243-8807a8fdc7a08a0fb664d1885442ba70.npy +04379243-104ebf7f96c77fb46a0faccc2a4015d8.npy +03593526-67f7d931a1796b97331dae093cef31.npy +02958343-156d4748560997c9a848f24544821b25.npy +03001627-562e6354049ecbc19f8f9f2bcc40c84c.npy +02691156-50d2629e7e96c2883034111f96c5f617.npy +03001627-36cb782fbc164ac312591a3ac05fadf1.npy +03642806-4bacb1694e86005afb6e846333373df8.npy +02933112-4d9152d6df9883529c75eb4326997fae.npy +04330267-82cdf477807e2af5eb64c1003065596.npy +03467517-345a9c0aee179a2293a3cb7ad5bbfafa.npy +03001627-3fae0625f3cf5e862678f553478310df.npy +04379243-bacef6e42574bc25d43cd8b5619b5cb8.npy +04074963-d9ca2dcaf1d9d850dc605801df3f66ec.npy +03642806-35462b6ea0597bf555e8ddeaf1791474.npy +04090263-4defda42f01b1345119486cb086a6c5c.npy +04468005-e2e07adb05ebc0a14c213c1a52c1de2c.npy +02691156-372c95e7685363ca18e0889038e4fb6.npy +04530566-2570f4db767fa046760fb52676c518d9.npy +03211117-34d998b1845880795b1895ac674412c5.npy +02958343-37e8db361d61971b184a07a6c7fa882a.npy +03001627-d4d7607336810a548b95c9b52cba3b9d.npy +02958343-dab0cd8adac9404780575af49bfeda6.npy +03691459-ed0c530e245dfdb269d48411e34c9daa.npy +03593526-eb7d628a0c635eff5ca1f314f1afc186.npy +02828884-78c7cee6016d8dba2056b4bd5d870b47.npy +03001627-baee1a3918353466d1d10c27b779ddcc.npy +02933112-21a6906ec6cc806182db9fca4b68095.npy +03001627-6f6191af40bfc07116f5e76c24d541f3.npy +02691156-f0bd0660d9cec23cf2b0736dd4d8afe0.npy +02828884-adf284153a2a87208c9b655484c84004.npy +04530566-a32082d31b6b9a0566dd4c46ee29f5d0.npy +04256520-c955e564c9a73650f78bdf37d618e97e.npy +04379243-31678ef74b85de0b15b943c35c765be0.npy +02876657-6e57c665a47d7d7730612f5c0ef21eb8.npy +03211117-5e0fe73a4d919b1af5f79806bd65844f.npy +03948459-139ecc9b5ec25ea77a9772e56db4cd44.npy +03642806-fdf791fbb8fc7cb58ca8637757ac3f67.npy +04530566-7d997dbaf47acf92866219ff4a62ebc4.npy +04468005-1fe869656812f5b0d85b408a8edc983b.npy +04530566-f1800fb3a9873af1e64f09105f9c8a56.npy +03467517-96b506f34b6ed188b470346f25b26583.npy +02924116-9bb3fe269e2356a983e4699e0a71dab6.npy +04379243-6eb9e1ec0365f5cce7e684d25d4dcaf0.npy +03337140-e877142c58eb5b03f2e2911dd34dc68a.npy +02808440-8662ec01d9c580827ac6ce513ae497d3.npy +03513137-6fea034555e60897e9fed33f81b1fa79.npy +02808440-d1ad479b9c04a9e6ae410fdebd404ac2.npy +02828884-6ef84eb436bf63de8e7865f75f64bf68.npy +04379243-133f18648797d149e27790b0ec8671f7.npy +03636649-42fa87cd27edca9efcb8d8c6d4df8143.npy +04401088-e633f997f4a47b2d727a08b50053320e.npy +04379243-9431f50b757b81fb15e0f0bc4a421e4a.npy +03001627-184c07776b38d92e35836c728d324152.npy +02958343-292ade37cba7f109e5eb989e223f7e7e.npy +03001627-bca76c4925b9a33177a7d775ec38a82c.npy +02828884-fc6c2a011ba0997cdccf03d91dc58d38.npy +02924116-570b7043031f05b6601e240e768fce7b.npy +03001627-beeb89082b38c83c992640a67216b77.npy +04379243-826b18241c9c2fa83eeddbccbf885e99.npy +02828884-9d0eb5ca2d849ff01f9ede15ab569b5f.npy +04379243-37f1637edfc6ca5ef51f77a6d7299806.npy +02828884-5aa59235750d4dce9953235c64bd990.npy +03001627-c7542e15626489adab4faba16579e3d8.npy +02958343-bca97563f170ff4ad2bcce019eeaafbe.npy +04090263-3ed5ea03e0eee521bc6e84bc30e573cd.npy +04090263-d07b1082474dfc9889172d41dca064d9.npy +04379243-54215af9f13cbb0c62d6ddeaf5a29144.npy +04379243-b444c5e5488806439b9e80c00bcf83a0.npy +03046257-aea16490befe0ce676e9713f57a5fcb6.npy +02828884-9f757c0acb5264f665ba78ad9601cf1b.npy +04401088-effeac02fe96f769146071e83265f12e.npy +04256520-2723924e712ccf1b98f5bccb3529a48d.npy +04401088-76a4a3e8370bdc24bd2d4107e8dc02b8.npy +02933112-19e444da148930154692707833167ca3.npy +04379243-4ba0563454fc10f365f5f793afed824e.npy +04401088-c8948cb8ec0f10ebc2287ee053005989.npy +04379243-fcf0e9c2aed826c7fdb2052f1980b788.npy +03001627-d6075b23895c7d0880e85c92fa2351f7.npy +02933112-5a935225ccc57f09e6a4ada36a392e0.npy +02808440-99fcd275c9f57ae044221bef0fa3c36b.npy +03624134-cbc6636d399803d1276c3d558130f8b4.npy +03046257-a630e09afe21e711f51f77a6d7299806.npy +02924116-c2c5217043ec617952470de2774d6099.npy +04256520-d3b0fe62f115f0588bd90ebf95555835.npy +03636649-35975525ec3d835046f58f62995211d4.npy +03636649-5f7abec29905605b1a19392327642641.npy +03001627-c53054060b5fb91beb0fe7d6b5545a1a.npy +04379243-14be1ed92182d2da722332c7d77935ea.npy +04256520-f551048075b5042d7d6d37ceb4807b31.npy +03691459-800a0a91308845b4519f3f3e6cd6d1a6.npy +03691459-16f4517d129ed54fd747b49524a1246e.npy +02992529-d7b2a9546b6f68bfd0659574aaccef0b.npy +04090263-3db828bb2a32a5f356c95a1e5409420d.npy +04379243-9f5ac902975f409e820018801b237b3d.npy +03085013-18a5269c99053eff1aea59cd55c902b0.npy +02958343-c2d2e3f46f7cc1e8ba69e14689f7b974.npy +04530566-a7707ea8482e4c3f925ef26228f6f62.npy +02933112-7eecf98d3b8f93a684c210032662e046.npy +02958343-a17d5aa16a529a88cbc76a30015552a.npy +03325088-35fa2ea1fc9f855e14b35a7d7cea7130.npy +04090263-7c53d8e4c566843b1e262ec64ad2c6c7.npy +04530566-921a5d88994aa99c71327f667b2179b0.npy +02691156-dbab9feed7e936cfa87372b03d6dc78b.npy +03001627-3fa2fccd96f3e5b5347185e772ead5bd.npy +02691156-2988a7a566ea79797209009cfb89d4bd.npy +04379243-e98dcd0334fa639fef9f898cda0ff409.npy +03691459-ebe84e8ccc8b5f3fa817854e3b5b5439.npy +02691156-57b5666dfe2607ea1025c08d338b6d83.npy +02933112-48b9fbf28fd33df5c59350d819542ec7.npy +04530566-799d446d33e604f990f7927ebadab5fc.npy +03001627-f83f1cbaf6c41a5db04cb542e2c50eb4.npy +04090263-f97e307455ce56a734e7e0c760ac1c0.npy +02691156-bdbc01a1bea50bdba6cb562d18000d3d.npy +02958343-e4c4167bc6b8e77dccdeba95a15fc6d1.npy +03001627-30e3af034e3dc084ddfd4f4b3d47049a.npy +04379243-4de6d195f07edbe5cd18e512cbf0ebf8.npy +02992529-29cf2bce2e67ae76264e721f309fb873.npy +04379243-c153d0d6b4fcf74f54a61dbdbc1ac262.npy +02958343-a7bc9db453e66329abc6b562f9bbf76.npy +02958343-36b23cc38786599285089a13cc567dbd.npy +04401088-35a0dc407f3df8d27450656ae41f00c0.npy +02958343-b4d7ad07dbcefefaafe1d4530f4c6e24.npy +03001627-4edfd09b8d7717cc579600e6ae92ac5e.npy +02808440-b3bd8f6d01d70f47b362845c6edb57fc.npy +03513137-3621cf047be0d1ae52fafb0cab311e6a.npy +02801938-3c06fb3595c39a4eeb6c29873b08c02.npy +03001627-426ab868a6acc7c6492d9da2668ec34c.npy +03001627-356fc758685e9054347185e772ead5bd.npy +04379243-a38405108fb416d8356ca1f9220b9968.npy +03636649-e487374a244b5f03b428462f49e66329.npy +04379243-20129f3c7b65b98b9856fa70a578baeb.npy +02958343-69492fdcd530eb3da6ce6972f601a2e9.npy +04379243-a7941c2ffe089884fff16555386d173d.npy +02828884-58e85d628f86aa897bd76190db9f54d7.npy +03001627-6dbe90994925f51c26fa92f330dec063.npy +02924116-83078ef9d6ef49315a50a5b89c58e20d.npy +04379243-a8da41b28b37833d14f6a05ceb8c1a6f.npy +02691156-4761e30dcb30471cf7d5cc24ec79e682.npy +04401088-3d1d0255e2163917f4ad1770263e7f39.npy +04379243-e047af849d703eb51933ffef19678834.npy +03001627-eb51e814c3f44a07914ced7dab3536b9.npy +03001627-c0857de5101f704f3c5e1addd9922bf2.npy +03624134-cab9d14dc07b7179cc34b900bb2492e.npy +03001627-a96226408895c2685e3c4d3bc6ac3be0.npy +02933112-28e7fd7a7a5ee8787d3ced6148bd0a15.npy +02691156-b6a1b55eb79a383542086bcdee59b1cf.npy +04379243-9d5718ed61c116ae4b3c42e318f3affc.npy +04090263-99c48010cc0c6405e1f2a1daf140ac9f.npy +04379243-868bab5194e93577858699aaad4acee4.npy +03001627-917e8fa5d1253398ca6a405498436716.npy +04379243-ff404f70bb77a5a876e4a31295619fa6.npy +02691156-2c64c521c114df40e51f766854841067.npy +04090263-3c42d32dee40f39a1ba59fe23593fa2e.npy +03797390-10c2b3eac377b9084b3c42e318f3affc.npy +04256520-9136172b17108d1ba7d0cc9b15400f65.npy +04379243-9bb7bbab61c5d4e947839bae1bc65257.npy +03467517-9a4d1c4535c3f3d2d872eaafa837d692.npy +02828884-d673c7ec4a08aa6db6f5e7b313e4eaae.npy +04256520-b0a85031201b0fb1df6cfab91d65bb91.npy +03001627-3ff879e891701079ea07bd8096c66582.npy +04530566-4e8a28d0659e430845aff212946058fc.npy +02992529-7d93b8dae79d5bbe7015d3b6f402d5a4.npy +03207941-a2ca291c8660a3465ea2d22d991d7d33.npy +03001627-d43f7db89fe864691e046801e2748f1a.npy +03001627-7fee792f0dc5d74cf2cf6a9bef44d625.npy +04401088-7cf110165b54e7511d3a21e67b7da85e.npy +03046257-e6e0cc99a9c6c104f51f77a6d7299806.npy +04379243-d3a1f88f644f36722f92c6319744ac70.npy +04379243-8b61fd451bb28c80c8bcf367bf7d8952.npy +02992529-bf8e0289ba786e97487d18402ebe69d5.npy +03001627-fba62693a28b2e4c43f1c519d66bb167.npy +02691156-4b623f70c9853080aac5531514d15662.npy +04090263-cadcb2e4e882ce75dd0a2071dde26395.npy +03325088-95cfff8a4333c320a70cb86be490e5e.npy +03467517-dbdf45cab0adbded1f260c1b356c52ce.npy +03001627-702cebffa33a19f019f079d1b712f46f.npy +02876657-b8767b71c2216dcad317c475f024f3b8.npy +02808440-a82d1a985717e161a3d8d955f4f42c39.npy +04256520-db7851745fb04cf732388c13cc4a0ba3.npy +03337140-fb6851a182221bcf14d1291d9f969ff8.npy +02691156-63ca41783e5d41f1651e8da9cf70afea.npy +02691156-9b285862ababfc3a68222c7df7dc40f1.npy +04256520-66240ded565b0927a8373ea4ea947e84.npy +03001627-94f5c52453dfea0b6606be97908355b5.npy +02691156-5fed73635306ad9f14ac58bc87dcf2c2.npy +03991062-57a71b2cad845a76fbd91d8fa434e93d.npy +03001627-fa7347547e290732bf65e1af50b5b7d4.npy +03636649-77fb025b8a2314787eaeab1f0c9120b7.npy +02958343-7cdfcbaec700fb98d230ef808f13e7a9.npy +03691459-1445e30aa2d3212db6a78dbbcf2e408.npy +03261776-b71c9a055a7f45c759af6c3da8aff0e6.npy +02933112-b56494e8810764286739a7caa0c577bd.npy +04530566-8849abb0be0a0ca99cace9782a7cd30a.npy +03636649-6b7a76b841ad8bb3488017d48a7f7eb4.npy +03001627-3ff4401d898b488a601104cd2d998272.npy +04379243-fed82f2ee0c82f97beedb4c8fd29e2d1.npy +02871439-77d1e531262c00a9193fc676f19b70be.npy +04379243-ffe1c487f7b9909bfebad4f49b26ec52.npy +02880940-441cac4bae5c7c315c2a2c970803cfe2.npy +04379243-f80427c47d2fc4169ccce4c6d5bb195f.npy +03001627-326352f7a20c31e2e19a0cc107ada7cd.npy +03046257-143e665cb61b96751311158f08f2982a.npy +04379243-9c1ff252b47f13055764829adf9a789d.npy +03467517-9ccb3f9179bf47f8b9689591a51e7ce7.npy +03046257-18299916ec3e95bff5ca1792a289ecf9.npy +02958343-8ffc484a850350f916abce8cb03e7794.npy +03325088-e9c737ddba0610f33321831d2245cf06.npy +04530566-ddf03991440ea0d15eb13ba95b07c9cb.npy +04090263-fe286de2443835694aa96bdf46776318.npy +03001627-3e1e1070ed7a0ba67484091a041fe77e.npy +02954340-ed52d2c2a9c1b606cf9bbc203a5cff99.npy +03001627-ed9d0bf4b699c2e86393e0168650b62f.npy +04379243-ead93856b735ec90f0aeabfdcb4e1dd9.npy +03761084-3c475e459a7cf86a13508f8f9877b42a.npy +03691459-ac6d3202823055dc1918763f44383273.npy +04379243-8d2e17e38a624565fb70a55ca9d14169.npy +02691156-8238cca88d753930a23a96b0250afc71.npy +02958343-a1d85821a0666a4d8dc995728b1ad443.npy +04554684-29561b3ac0b7596cb23717c90dbac0d.npy +03624134-45e28ff647b388e12d2336c44ce1b2aa.npy +03642806-62818ccc8dd6a3ecb300959c6f62c5f9.npy +04330267-c2adda9e5b8a94dae7822b3160005e08.npy +03467517-1c374a198daaddc493f0194265a9746c.npy +03001627-bf9ea87a9765eed7d53b73fe621a84b4.npy +03325088-19ac42daf0dfd5f454d7082b34825ef0.npy +03642806-774f062adc4130eca309fc846e6b0c18.npy +04090263-af6601f4d67d85e9422881265f219fa6.npy +03001627-62127325480bec8d2c6c98851414a9d8.npy +04090263-93de686cc189544335a8ac768bd119f4.npy +04090263-53b50183730125e68c0007e5a8235290.npy +04225987-9eb11450fa872445ad8005b08617c09.npy +03624134-95d6e8797064d09ea4dd752ddde80fb1.npy +03207941-a238b87f02c5de1edf3a1b0d597ce76e.npy +04379243-7a22c6cba42b73cbb5a356b3f810d217.npy +02747177-c1b3e0b6930003fa3b146c3414841312.npy +02828884-3f8d7d662c9cd90bd6abb4efd157f402.npy +04401088-ab47334a425e1650bbef66962a25aa5f.npy +03001627-d3f393615178dd1fa770dbd79b470bea.npy +03211117-ab20e7f54f10bd0ec1f8c53978a2ad35.npy +02691156-ae837be3456bd54f71d03b466c72ce41.npy +03001627-3022c71659584118c62a9d560fc45fe6.npy +03001627-9894e30c8c7f7e56eaf35c5a2cc7d71d.npy +03001627-45e2cdf1708680822165c54dcecaacb4.npy +02691156-22ed115500e9648c5fabfc69ee61b28b.npy +04530566-8ecf57984f77fe84583ae8949bf11b56.npy +04530566-2228242cfad46b73a0928eccd5f75d69.npy +04530566-e6d6a78f53ed5a34d0a07165a76e5a8.npy +03636649-8d93a9b663a6378ef5c0c3f661e90ca2.npy +04530566-e3c5033a9367bfa5a6dc0341d8503142.npy +03636649-4bf29c47c18e7020fcb8d8c6d4df8143.npy +04379243-3558aeeb9698722acf19858fd1963d10.npy +03636649-8c4ca1f645def5efd5cb6d178687b980.npy +04090263-51a327bfd4cbf109a06a81572261e82e.npy +03636649-41fc6d8dcf353f9ae420612cf7bb547c.npy +02958343-bfa01c632be2eb06e8a3b392b986583.npy +03001627-27a8827b0ba5d743169bfe841050f4a4.npy +04256520-16296126c5a0b92ea597952f9a39cf73.npy +04379243-4c55e5b0eb04f854297c137c93a4b9a5.npy +03337140-2f449bf1b7eade5772594f16694be05.npy +03636649-57f1439f5161b8d366cff95abd9dc80.npy +04379243-a0fd031270822841febad4f49b26ec52.npy +04379243-aa2b82f576f3df62f51f77a6d7299806.npy +04090263-61204e00cd517e4e9d360253182ac1b4.npy +03691459-9b7001c69e6f1978bf518c96c02a8c5f.npy +03790512-152de80e31b016d4ced49279fbb1dcc7.npy +03325088-e26918664dbd68eb7a867e9b35a1295.npy +03001627-aae036d8ebdc472535836c728d324152.npy +04256520-fe48d9b6cba42ef214fa93b6acf93e82.npy +03624134-c71280ea272fbfed4b7644126b1d71e0.npy +04379243-2bc3439a36c0518b4b3c42e318f3affc.npy +04468005-2ae835c4b5d1eff25f72adf4b0bfab9.npy +02924116-b657b823876fc62b8449e0b8dd14796b.npy +04468005-efcf0fbc2d749875f18e4d26315469b1.npy +02691156-240136d2ae7d2dec9fe69c7ccc27d2bf.npy +04530566-3c8dc4a3621674aabb29ab7e4f889a04.npy +03325088-a0bb3e71fa03369e843f813f752a5e35.npy +04401088-ee7ef8b40cc2c90d6b7170bfc4da1f8.npy +04379243-dcc24b55654a9e6bb65b71636c46ae49.npy +02958343-8aa5d1c7ca4e3f2e61b9ff60b1be412.npy +02958343-1ee4f19fa617ec5949493d905c02fa86.npy +02808440-acbbca9c00c87c81c1a9d86dbf500665.npy +04379243-59c8b38f75ae93bf785953e8e787ef2a.npy +03001627-112cee32461c31d1d84b8ba651dfb8ac.npy +03001627-317b404839dea88d827b401415ba9e3c.npy +02958343-5dde5594b4e9e86ce60ff101126e254.npy +04256520-c4d65d8701b7e9b977e95ce4d5a0e556.npy +02691156-92306925325c9e8a3f3cc56bc9bfcde3.npy +02871439-d998e75348902a511dff03f33a13aa77.npy +02871439-c3c8f8d5a5dae6c2d42b9650f19dd425.npy +02958343-cf39999d7c9e2b4788ea3c115b90ce56.npy +03467517-1a96f73d0929bd4793f0194265a9746c.npy +04090263-56d737fe2e8ec9d81fa5c14a532505cf.npy +04379243-5807109a9db7124e894dec385705c4bd.npy +04379243-ee6ab3dfcd7757bc6f2c5bf7cec019c1.npy +02880940-899af991203577f019790c8746d79a6f.npy +03467517-8b005f829bec6bf263e148e250c0340d.npy +02958343-df037c72470d33217fbbc45f009914a6.npy +04074963-9fcf820f1362798e1c990bbe4403b3a1.npy +04379243-2e0a8f727d87045818e800f0d88f9019.npy +02992529-c589332137d854a1808ba9235495a934.npy +02958343-4b092065568af127d64c207b9313bbaf.npy +04379243-194fd39afab11888b84c578d4c100fe6.npy +02958343-1ca64f9d6e008fb35fcb05674109534a.npy +02691156-c8143c3384690147d13ef00338ba8c52.npy +03001627-bdedbb7887d2c1ac6a45b3b48c00378.npy +03001627-a08ad49c281128ea53615647c93fc704.npy +02691156-27acb1d0e8c808262347b4731688b0f.npy +03001627-ee665ce6679ac8cfb502ac2eb9128f9a.npy +04530566-2a569537a0f6abd34b5acb1c7aa990eb.npy +04225987-344e9402d06bd94031145076011658c5.npy +04379243-15be511a2433482aa192483aa282f8e5.npy +03085013-4b13c682d58bb2184e7e6a507a54ea94.npy +02958343-6f2e76e362ba6c73c0e3666c7d0ec7d0.npy +02958343-32e6ee437b8fa3fb5e52943dcb52313c.npy +04530566-82138919402b3b8f642f9e27aaf0c47a.npy +04530566-efa85ab5aa4704d299429033f40f0f8b.npy +03691459-91f4c25e1e325683e7ac477bac77def9.npy +04379243-9a762e9ca86ce96da5e3e028709e0474.npy +03325088-a4ae53ecdfdf393593ed75a828b3d239.npy +02691156-523f1c2392338cf2b7f9c6f6b7bee458.npy +02828884-d9c927569da63ff92ebeb1e6a8111f53.npy +03001627-e807c535765fbbbab40f0ac0fb9a650d.npy +03991062-606895063559fb1243c090e8cbe314ff.npy +02933112-863deff7bdee8cdff51f77a6d7299806.npy +02924116-a8783a6095646146d2551af1d853d82.npy +03636649-7a3abc9f27ffaa0418a6353ea60f11b6.npy +04256520-a1a4f5670251b8314b35a7d7cea7130.npy +04090263-68b0af57466b5a0d735fa1ab17311ec.npy +02958343-eefce52130d223ba2dcbf88f7c685079.npy +04256520-ef5eb51bbb7141c119fb4103277a6b93.npy +03001627-70ac5cb405df84575e62305d14755686.npy +03467517-36b49aff54f6d7e893f0194265a9746c.npy +04379243-14130d541c4a419df51f77a6d7299806.npy +04468005-311a3ef41603f86c3f51596dfebf9893.npy +04379243-6491dfcf1c9782154932af0c4e356b6a.npy +02828884-e3e3c49caf4b1885d661ff085a0f14b7.npy +02958343-16d6ecc22218e21b36dfef0450f0ee37.npy +02691156-aba51f26f4da1b44b785bc4e6e3fb739.npy +04256520-3d0575e2fbf2ed5c99e1e63653e7d97.npy +02933112-7e06d12a3db817df7f07552c1b0b212.npy +04256520-a19aacbd84e0ddd92bf36b92481c5940.npy +02691156-5ff1cd7d4fc48c864b6d6a3a20b9f7f.npy +02828884-eb940ba9c22e793f35f2c389ea4da425.npy +04379243-9954b8f6fc40f0ab1cf96a5dc33e37f1.npy +02808440-ea9a9f6922adb1b70c61a2b7d6910c.npy +04379243-11084af510183635ee56c4ac0904ebb.npy +04379243-884589066f028f237d3a650ebc940efd.npy +04090263-78a1e4efeac9bb6f55d33831e71fa52.npy +03691459-245ed4407d4cead6b9c1ae865c9193ec.npy +03001627-7f523cf6780aaeda2a691a30a5c88605.npy +04530566-296c315f8f0c7d5d87c63d8b3018b58.npy +03046257-e82da3357403f25376e9713f57a5fcb6.npy +03001627-1031fc859dc3177a2f84cb7932f866fd.npy +02691156-8ccaaa2429c01bd15e33fa4a58c78442.npy +03467517-8f4974d21383c817489afeb4f07ae3cc.npy +03691459-6ab218aba38bdada2268dda5c324173f.npy +04468005-9ee93d31c7fa7c20a5a56cb268819922.npy +02992529-39b78390f8d5067e983a0c5c52bdbaaa.npy +02992529-e8d704bfd9b6c7f39af985c9d0dd6085.npy +03636649-c41293c84dfc509cfcb8d8c6d4df8143.npy +03593526-216d97aaa039609555f46d55537192b6.npy +04379243-e52a290532a567aefa10901ed3f9da3.npy +02691156-cfb555a4d82a600aca8607f540cc62ba.npy +03636649-6f6fc4581830b1c49ae96150e853545f.npy +02933112-7324733dbe394447e78cc773ba5d9e52.npy +04530566-806834c2b3c0bce7989a4a13be837150.npy +03001627-e5ce55d61830cc017f1cdfc0a8f38f2e.npy +04256520-896e8970c81b33d068b6f94bb42f6cd5.npy +02691156-93c3ce7904b3258b2285a9bad03a0ac7.npy +03046257-23fc56bba1889c2e970d557f49392fb1.npy +03636649-204a4eb580e93c559d709998b2d6e774.npy +04090263-39ff99d67fd7eb1f4aaee15c65289469.npy +04530566-7b602de66f5eff247991cd6455da4fb3.npy +03636649-5aefcf6b38e180f06df11193c72a632e.npy +03593526-c2bd95766b5cade2621a1668752723db.npy +03001627-cbbf0aacb76a1ed17b20cb946bceb58f.npy +02933112-c4fd6d64caa1e371c59350d819542ec7.npy +04379243-6c763c259b83b9bcbeedb4c8fd29e2d1.npy +04090263-54ea995ca2645fe0f4c4f1f541cfa2a7.npy +03001627-b2c35c8b748491a1684b7bc3f8a9aa55.npy +04468005-a260584cbbf5c65eb73b721987a4f9d.npy +04379243-1b33172342f58feb76963e5e6f4f642a.npy +04379243-d28e03eaf042c33d714531f0291497fd.npy +03636649-5680570f242c595255ee7d0585fd5223.npy +02958343-57e16ac1b026db4e350d065ac10959e0.npy +03593526-4d054c0a0c2fd8e4503adffe35460705.npy +03001627-303a25778d48a0f671a782a4379556c7.npy +02691156-fb01b45a0659af80c1006ed55bc1a3fc.npy +02992529-7757585cdde7953d86ecff2582325794.npy +03636649-c0b0d7e15d3dfab1733c22d8b8e1c33d.npy +04530566-8480865aa92d13dd46687b3834d255fa.npy +04090263-212a96dc292df1bce1f2a1daf140ac9f.npy +04379243-91282b5e9c019a1944ee2f4962f1290.npy +04379243-c7f4004cece37b4bc08256cf85537e.npy +03513137-e4ac62dd8caeabb1f80d3a620e00dd9a.npy +03797390-c60f62684618cb52a4136492f17b9a59.npy +03001627-624339070f8a749260c69156bdab9446.npy +03001627-b932d245e5e9f98b504721639e19f609.npy +04090263-1cbfb1c063b34ab4ab379c9b5bf12bf8.npy +02828884-a6c3eea17a4b455d75b557dd77720f6d.npy +04379243-b62f2d11c2aae12cc54baced9903a02a.npy +03001627-86e15a077ee6f438910979f825490a99.npy +04090263-fcb3636dd82e1c37741da1d923dd6a96.npy +02954340-138d0b89ab5b5fa52821bf1aa3b19a.npy +03325088-efaff4f34573d23caac6c989b01c7.npy +04004475-13a521e846eaa8599c6f3626936936a0.npy +02924116-1e0ecacc02c5584d41cefd10ce5d6cc0.npy +03211117-31ea65d446d980162a544c9c0bfe248c.npy +03001627-52a7930e87e75591a78e44eefea09073.npy +04090263-d6ab580443ae008d6a2345809e2bb169.npy +04468005-e0468c8448d92806bbdb7391763a8729.npy +04379243-a860f37217b12b26bffdf578c739e217.npy +03790512-242d8c07fabbdabc78fe949fc1419876.npy +02958343-358ddbe8b39125e9e81913b1de19c3f7.npy +03001627-6b91f4fb8cdcd6f46fe24f5659031935.npy +04379243-5f64c977d89c2417e2059182b9d400ca.npy +04379243-665a646e8413fb17fe537547af4fdabb.npy +02801938-4867b23ae77c1c2a490ad276cd2af3a4.npy +03691459-5da457ae73142749280e0c1e89a63998.npy +04379243-9b91c3d35057b2f93eec26c23f5bc80b.npy +03624134-6ca0db952c7e2169e2bb19fbad3e4596.npy +03337140-46ec29cd38a7ad694c3aee8e9d3a6ffa.npy +03636649-e1891813cf904b3188e7efbf7ff736b7.npy +03001627-d7b8189fe69cebedc41b07b1627c4b43.npy +04256520-d1016939207fc52841b7cd2d531f3797.npy +04256520-823219c03b02a423c1a85f2b9754d96f.npy +03636649-b4e939adfc94954a276206fae5d3c473.npy +04256520-6e4ea95fa805aca632a526e2e9a7e9ae.npy +04090263-169bddb624e60dffb6c8238440c79e2.npy +04256520-8ffc9da1ad2dffb3200d50e893131ba.npy +03261776-ba1ba6d3a76841132e398c137a41081d.npy +03211117-31c2bcb49eebce088198059e96f7b9ac.npy +04379243-50882181ce7f2bc1739680f4e31f35e0.npy +04090263-5c463ee11ad412ffc75e2dd4efaea578.npy +03001627-6ecc9a0b03cb8bc2d2b12aa6a0f050b3.npy +02691156-520382dade7695c4906bca4ffd4af837.npy +04379243-8b4ec70a3c1283b1fb5f8baea920e189.npy +04256520-86b91784e9f32b8f10edd100dffd8d85.npy +02924116-b247dc34286641995d04635357309588.npy +04379243-ad746c9c7f7548be7608168119193cbf.npy +02958343-261d55ef790a2da187bc776d46f94d3.npy +04379243-8d177d02c291deeca7f2f03d5c90e79.npy +03001627-2581685a8aeff78b713decb1a0563b12.npy +04379243-415a08a66b8527519f803a8da27dd9a9.npy +04530566-94e1c24d7f205a39779adafea0303e70.npy +02958343-2bfcb2381581c05a95551e0d9e50cb0d.npy +03790512-9d3b07f4475d501e8249f134aca4c817.npy +04379243-637bc87d013b1b09f51f77a6d7299806.npy +02958343-721ef3846535bfad179005454847728d.npy +03325088-21b77fd7e71cc47ed773a8448a79e14c.npy +02958343-8783151b8f23f41144ad526dfb20e2f9.npy +04379243-2e632844af2fd0892ad0b8f780281bcb.npy +03001627-38d000cadbd439da63be0260dd648a5e.npy +04379243-37bed46307d59fa5cc4dc0a78fc422fa.npy +03001627-493b8b8eac5d3de978f8b40f4a2ae98a.npy +04379243-6dad3b17869cb20fdf94ba6a907dbe8.npy +03691459-665dfd9711b2a3ece4fcc1af3285ca51.npy +02808440-f84308c16a081311ccd0340812259a39.npy +03001627-95d83e52954e1ff2d19175e7d19b7cb.npy +02691156-2751a0d9a1effa41f0b8c8d7a19e0d9a.npy +02933112-1834778d026108e0ce5d6e9371bb5c33.npy +03211117-441c5d2f78e1100558ecbb7ebe658148.npy +03325088-7525991c21bda36c54d7082b34825ef0.npy +02933112-21dcc3c0485b43136473d8f2b21437da.npy +02958343-dff1f351bb34fbbabecf71e2e014ff6f.npy +03001627-73428fc75131e0a9d8dd12a67280079f.npy +02958343-8c6c271a149d8b68949b12cf3977a48b.npy +03991062-de23789ce3b881dbe42c56b45979e3cf.npy +04379243-d312c70dfc7017e9c55161a63fbd109a.npy +04379243-1c8121e1ad6cd6fc7a480f3f1d55ed3f.npy +03211117-76d351e5df26f91fb895bc5ff828fca.npy +02958343-eb575f66bedfeaf629ebc23acefb248a.npy +02876657-de71aa5eca9ee76a95f577622f465c85.npy +04379243-156ebd353a36f36ac3bd24f986301745.npy +03642806-a923fbd2327097c6e95cd0dc8c2f0e83.npy +03467517-6f456bbe112de70993f0194265a9746c.npy +04379243-60365049ca80d98b77e620d253d331c8.npy +04379243-23aca164c7b2e2d4ad8af6714b643432.npy +02933112-7bdeadcf72ee257dce5d6e9371bb5c33.npy +04379243-5c45f8d68b676f634b3c42e318f3affc.npy +04256520-37fa77e9e48371545397d07b571cbcb.npy +03636649-d2ff6b9d63c65ab71735ea0e092a805a.npy +04379243-664c6792448950dec19dc7c5f46bbf55.npy +03797390-649a51c711dc7f3b32e150233fdd42e9.npy +02691156-6cf5d850b55bc9f990b1d6deb98feec6.npy +03211117-76d87469c1fa3638577ed6878ebb1511.npy +04379243-af5fb0179304e7c48cbb8bac2032149c.npy +03001627-29883092cdaabd09b41b7625e8c42dfa.npy +04379243-1469f244a1968345e2d95336601deece.npy +02958343-e56749ccdc861495b9e97c7f06f23bd5.npy +02924116-748f9e642180de12481aa8b5531c68a9.npy +03211117-df5e129b50eb2f253bec56bff764ba78.npy +04256520-e8524ce4800693ad1aab7fc1a7e09451.npy +04379243-1a5febd8d65b97e4f4b6538438a0b930.npy +02747177-3b8ee522cf6c207063b2acb037dfbcde.npy +03001627-64ae981900a1c1a37753393bcfa5f775.npy +03001627-328685b8dd3a7353bfde9cad2b5fdc64.npy +04379243-1a15e651e26622b0e5c7ea227b17d897.npy +04401088-5a65ef748eb3a3d1ec475b573e4d1a38.npy +04401088-9f6acb21f86a88d93ff936510fe2e02f.npy +04090263-377f4054812dec1c9f433921788191f3.npy +03593526-28938abdb2114e53bbc7a6acbd8f058b.npy +03636649-bfa83d8f88e91d3fed83d50637042c60.npy +03001627-3aee7c282063723d8a17805dbfb751e2.npy +03001627-7862b32132af278f45ce8baa9aaad5d5.npy +04090263-68ce5805f49f8484a90f0d3f07dcdbc1.npy +04530566-e2f4c0d1c8b6e26549e3c7e37819c26e.npy +02958343-488fc8215ab4e5e02edf5935f10637d1.npy +04256520-d2a3268e85d81c6c6bd365389d6dc6e7.npy +03211117-ea4b90cca359e2d38b9be827bf6fc77.npy +02924116-2bfc0186f3f10b3174a16879fb3ac81f.npy +03325088-34152f014bc3955d188386a1b5f2f907.npy +04090263-966fb54dcc7bf00ba3fb48700889ab3a.npy +02933112-17d25c26485edcf94da5feafe6f1c8fc.npy +04379243-527458cf1c581025d4b7f1dc8ac42b22.npy +04090263-9d969dabaddc27568bb83d47cdb90d09.npy +02828884-9e4391cde5446bded98cca8f0ccd5f7.npy +04090263-580f6487cf149c497504cc74f24f0eee.npy +02691156-844d36a369cdeed3ac4f72bf08dc79a6.npy +02958343-b5a6e71a63189e53e8a3b392b986583.npy +03001627-ce242d5e5e3f4befb13cfeddf8d6bfe0.npy +04379243-c516c27390cd9890f3a67cbaf0fde1bd.npy +02933112-3fcb5eaa202513bd2f815a05dcd7ddb5.npy +02828884-5cb40adcdfa5247681faebbdea6bd9be.npy +04379243-f01ca36bab1a7a1d9e9583a661702ed4.npy +03046257-d08469a971f560102ea413435dde1792.npy +04090263-8560fbd0b90ff133b96aa5dc23c036c.npy +03001627-d6203deed1b54c8279b3e1be3524f72f.npy +03691459-1d7af68d31944c358a0181490cb73cbc.npy +02828884-b695128faed7cffdad5067eac75a07f7.npy +02828884-300781592a3dcc2313e9164feae00e7.npy +04379243-233c497df4d252aea5e91f4d594e20e6.npy +04379243-59b6e5cc2b4dab5ebcd25191f45283d0.npy +02958343-30f96aa701d4e088becf71e2e014ff6f.npy +04530566-9a20ab78eb6a5e7af7ff315fbee3c6eb.npy +02828884-6ec0ed3fc05dc7b7ad5067eac75a07f7.npy +03001627-30083f20e81ba69b593ebeeedbff73b.npy +03211117-ecb96d46eca5724fef0411fcb48f0299.npy +02992529-9fd7db6d334e6acab29f572d1167c0ed.npy +02828884-8d40e13e8d27786b5a2cd0e0d44dc51.npy +04330267-a82fa198411f80b272d42ea0c136b6e.npy +04090263-7bd5febaf49a0cd44bec850c6c6ccac1.npy +04379243-b5a3017da6739ea0c46152dd624f1d49.npy +02958343-78ff8795f2cce2f7bedced414fad522f.npy +02933112-a8e160457848a8be3bba238110c3df2b.npy +03636649-b4c69d04b835bd716c8ef569725a5272.npy +03691459-4c944233440d87f4b8e9f7eca3eb3e3f.npy +02871439-3a9d74e3bdefe4107550c20897273f9e.npy +04379243-4a5fa41eb0fff4496316c951e41c61a5.npy +02946921-a8d4a3b32149d3ae4f0b8af4571b1440.npy +04256520-51a14c2d62a2963d86234e915108e6a.npy +04256520-6822eea5cf7f5fc9d92d669b28d58950.npy +04530566-c74dbde6656efb4eb4248d66f92b2feb.npy +04468005-865dd76030699cda623728a0bfe80a.npy +03467517-33bc720b6836bef4c69ecd2ad81e89bc.npy +03991062-a46b5662ee7e2985c3648f83bb1262ce.npy +02843684-d5171f20e202b8aef74a754b7c345792.npy +02933112-a06df01467d298caac51268fdb437a9e.npy +03001627-cbbbb3aebaf2e112ca07b3f65fc99919.npy +03001627-d29bc9defb4f021cd1e6c0ed5832129d.npy +03691459-8dc1e06a23a2fdb7c77445c6f0b20418.npy +04401088-6e18484e72c79bf6943bfa124ea09a0b.npy +03001627-46185164829c492c9dcf2183c858e6e5.npy +03001627-49b38e22f104005ecbde89e0c48a01bf.npy +04379243-3fb8797c780710e45213cec267286d18.npy +03797390-1a97f3c83016abca21d0de04f408950f.npy +03636649-12d03f06746eb49990c2e24416edfe5b.npy +03636649-f0b6bf1a583cd99169d13a7b2498cca9.npy +03691459-6575a80a0daca56d1b37f37a4873fcf0.npy +03337140-109a19840a8fbc774c3aee8e9d3a6ffa.npy +04099429-a507b5c6e6cd71a191347c63d1dae43c.npy +03759954-1a2e3602e54e8e5f4fdb7f619836e43d.npy +04554684-ac2fd0b05d956f7a589577ccf07b31e7.npy +02691156-59209cb5ba7a34633e1e5609a53c0477.npy +03001627-6016c2e4f5d5c2ae181fb5b25ff8403e.npy +02828884-388d83f25e045007efe85e37dd46e84a.npy +02691156-c9620ae77d3eb16ea3123c495342b850.npy +03325088-91b9542a41c2c80dfcff3f0bf2219ec7.npy +04256520-c00d5c9b043b600019fb4103277a6b93.npy +04225987-70c8f82bf6a6fef2db8b0e67801ff73a.npy +03691459-d5f20697fdea1b20fbc9490485dff00c.npy +02773838-8569a0c606bbba73d9985ad45fbb635e.npy +03001627-5cf26a5558580c8c75a82b88fe6e733f.npy +04530566-93de96748cab511731205bd848315f04.npy +04530566-41032fa8e4f632a5447ea5854b3cf405.npy +02933112-e1ff64e53154ccfaf51f77a6d7299806.npy +03991062-9d200849933d76c52c528d33bca1ac2.npy +02933112-1767bd876a8b8c6e4da5feafe6f1c8fc.npy +02924116-5dedf1f1c3c1eb461759ca9eefe0e251.npy +02691156-b1deb3638098e9c92a4947824596dce3.npy +02828884-ecbc04934735cbc852dff9108cf86a17.npy +02924116-d493568e7c343bd6378953424bcbb407.npy +02691156-8add45a11c9fcb446eb5821e78d8898a.npy +02933112-98d963a9f353cd026b0f9e3b3feb2454.npy +03001627-5ef0c3e89d51eda2d62069fe2138d0b8.npy +03991062-e4f8e15dac885beb846aeca11136b56.npy +02924116-e879b8f56a0bb33ae87bec97f6a7c3b7.npy +04090263-4c41c172046a4a5e9a6e43b878d5b335.npy +03207941-f4d152d2ffb8b2d9f5f2f72b977592e.npy +04530566-5c0e6663c131610a2c3770cecdd58208.npy +02691156-2c89cc6eb008eaf5ca8607f540cc62ba.npy +04099429-d9b0e3cd3ce4507931c6673b192319d8.npy +03001627-6f84118b912eabbd4587e90e2fc67ac9.npy +03624134-7bdab5035a80cc52f361b515e2f5c19f.npy +03001627-fd5ac9b342fe518b9d3ea1c6b57a0095.npy +04090263-d8e64f106fc611c186029a2be51c0321.npy +04530566-5bc0bff4ead8277b421dcde4f714e772.npy +03001627-6cf6140483ba1b347b11ae648ea92233.npy +02958343-9240401e750395b456fd4619a315629d.npy +02958343-73140624a636925ada37be44e2d84539.npy +03642806-6c6a96e4486cc02cda66ecbb2c411f37.npy +02691156-951358ab93e7380c1ccec171a275967.npy +02691156-7b6f528acc10d3fbcf5b9c6e0c7ce895.npy +02876657-af853a8c58d2b631992eedbdd14b936d.npy +03636649-6bb38bc6fdb6adc359c5c7ba83ec931a.npy +04090263-8369cd1bf3c6f377504cc74f24f0eee.npy +02818832-5d12d1a313cff5ad66f379f51753f72b.npy +04379243-7727cc0cb47705632dfc2f8d5d30193c.npy +02946921-59dc6215c5eeb1ee749d52b3e269018.npy +03797390-2d10421716b16580e45ef4135c266a12.npy +03001627-f46ccdbf92b738e64b3c42e318f3affc.npy +03467517-46e8a39b49acb800cc766ee9bece4aca.npy +04401088-86fc58a0c40316f2562c8e1ac545ef78.npy +04379243-14e00e9bc6ea1b7230bbd4cddd04c77b.npy +04379243-61b88b501933ebae8f7068c66465c4d6.npy +03207941-5776239d3e133b68a02fa8dacc37a297.npy +02958343-8a28abfb5751e767b9f455b31f6fc3b6.npy +02880940-47175c7b12bf0b61320b691da6d871fb.npy +02958343-bbf84d45735af3314dde7b6e74a2cede.npy +04090263-57287268b594fb3f3a653cb492d78488.npy +03211117-dae83168187a9ef8628fbfd12f0feda1.npy +04379243-abeb8fa38979d2fb9d46068d27fb8249.npy +02691156-ab35aa631852d30685dfb1711fe4ff6d.npy +04256520-86a7258b0f094aa6a3fa78fb8c679d78.npy +03001627-3f8d0d53e2bd74124b3c42e318f3affc.npy +04379243-b8c0ed645cce028b3fa313db82fc9cef.npy +04460130-40ec49e3e3147508ca9081e720bd7dff.npy +04379243-c4ee00c87688f3b0b161476a346db176.npy +02958343-82720b201a7731e3b376886260eb15c1.npy +04379243-ea87ec56cc2fe88fb20577fd2a0fb434.npy +03001627-b6457a76f24de9f67aa6f8353fce2005.npy +04401088-a86eec9735db06a8226bc3b9ce9ff2a1.npy +03636649-d3f84442201b6c137fb7f79251dd7727.npy +03691459-3e33b290c010b3b88bc9d953a3f1955.npy +04379243-f66d010471970cf0391e4d6c585a697a.npy +03001627-f128d707527eb10cb04cb542e2c50eb4.npy +02818832-1f6eed9be4aa249de76bc197b3a3ffc0.npy +02691156-dae96d5eb7dd6fcd2863c6a2c8157d17.npy +02843684-80337f796ef8859a527f76f3d3db2f8f.npy +02958343-1cb102a066270f79db1230abb5fc0167.npy +03001627-33587d34aab902057add36d8e31831ec.npy +04090263-6f09a5d74998c8ec49a3c1009fa79820.npy +02808440-3cb7df6d3fd900acb0026ac53ebb5587.npy +04379243-7257fc99c253994c6fd6654fda9ac5f0.npy +03001627-4ef623a1f272c40019fb4103277a6b93.npy +04379243-a86b48fbcd775bb16cff9b44fdf0517e.npy +03001627-83839b89dd91996c7d910d51d878f708.npy +04090263-868aba7b4da060a3683e3750b53385d5.npy +02992529-bbbca195cd6b85f1562c8e1ac545ef78.npy +03636649-51634562e4cbb4be27c4ca11e0316b1b.npy +03691459-5072c19da106b95583247f812f2eaa97.npy +04090263-9cf5486d4aaa5c0dd107072754c68ce7.npy +04330267-7c82a4c439803269eacb651f5864b906.npy +03001627-9de69e28a07c6e10592cc471d13e2037.npy +03001627-7d8e6b132c64d909b161f36d4e309050.npy +02933112-26d924cab0c8e8f348d189f942cedc62.npy +04379243-6278f1b6aa0c85effebad4f49b26ec52.npy +02828884-14b63361a48a9fffe4a048c146e8bd43.npy +03211117-763d4754a37cdb953c491389420760.npy +03001627-accebea3a0e180f0812e3ecbeaae3980.npy +02992529-dd02413772656bf5f6cc8d1cc08b421.npy +02828884-cd1077a52f972810cb2a965e75be701c.npy +04090263-e61d4911c7142c65d735fa1ab17311ec.npy +03001627-f2075f1c3088a167cf513de9a02a2561.npy +03636649-cf6c082b9534049494db33559ec0df30.npy +04379243-64adf1d226e4a0894f4d213d7c852596.npy +04256520-9a88dcf980a527cb4b3c42e318f3affc.npy +04554684-3ccba2b436b03aa635325a5f07346e1b.npy +02958343-e90b0381a7c8841c1c65421fe734e7bc.npy +02691156-4658a2fb7353f839643ae903098a314.npy +03928116-6beccfcb76d8dc3fb12da0b74652c93d.npy +04256520-4146cfb4fce9055bf51f77a6d7299806.npy +03928116-a9ae9e2b1e80fed6a519a2fd2539c0b6.npy +02691156-5f11d3dd6ccacf92de7a468bfa758b34.npy +04379243-ed554b9e04b7f7eee7be13c697329304.npy +04379243-7e833179b58ae9ec115e53c2ed23d57d.npy +03948459-1e9955ac94f8facf9e272653667f1619.npy +03001627-a7e33746f41cd181e258d1c3e7302e7b.npy +04379243-214e52abf34b4e18ab96a46a16fcc9c.npy +04090263-1fdccad4c0b826680685c30eb1daeb1.npy +03046257-ce2c4226c28a7f51ffe3432ba4f2e6d3.npy +02876657-cec14f91bf10f86e8291825d073a05e1.npy +02828884-6887f90a83081b56a1ebafc9c1beded8.npy +04379243-9a294d3a661f96a3c98555c181f6055.npy +02808440-885497f2bb3cbd3c859d92988090f02a.npy +03001627-1ad766f9e95ce308aa425ecb668e59de.npy +03928116-532420acbb08cdb410a322420f6f5d87.npy +03636649-5383c9b60d5b66a2d22730b0728b2fc9.npy +04256520-c2e4095266254bc1948a3bd895ea5ecb.npy +02691156-f39e0412290bcc714917e69390d054d0.npy +04090263-216637165f69a2b5be0132953bc535f3.npy +03001627-19a3ac2ec0312e13c8687ff9b0b4e4ac.npy +04530566-320b3f040f6d5147ab87075c54b494cb.npy +02876657-a00a9d045b69171472dfe26068766359.npy +02691156-2c4228b79cf44778b96ae1a0a8b84ec.npy +03691459-d05c2dfdb34f38433e8a91ffbc9ffd64.npy +02958343-430941674faedcff6436916a86a90ed7.npy +03642806-1622e466794cf72998536cff5312b747.npy +02924116-a7791bcc705e5a4ee9479f80dcbf204e.npy +04530566-2e958577e7756f59bf9717d602b327f4.npy +04379243-3585c614e9a6825fd42225b7548c8765.npy +03790512-a52bac9239f4382ea513de4eb79b310d.npy +04530566-e951df8d8d2f6ebc96f165bae5f0d61a.npy +02828884-80593a84e45e4345f51f77a6d7299806.npy +03211117-61d0f582475b3d2089b367279b017ccc.npy +04379243-c736eb1545f8b7b4ed403132b02528bd.npy +04090263-7d0b9246a180c59785c111973dec28b.npy +03636649-a53112591be182b9d93768e7b9b1eabf.npy +04090263-e5e273acb04a5687bbb7f70943d3cb52.npy +03636649-ff1f829e2d6ff0d4fcb8d8c6d4df8143.npy +04256520-6bd1d677786634ad27118ebb1d23c10.npy +02871439-6e2622466f6264098a653a9f65a410f6.npy +04379243-4dd2d2ada39e32d15f522d72d0dd08cc.npy +03642806-ccf62b71e7a9aedfb162fa62b36ac9a4.npy +04379243-19d202ccdbc617d8eed6cfa9fc6d794c.npy +03636649-2cc1ea376c68da216502fbbc8833905.npy +02828884-1b1cffcc9435c559f155d75bbf62b80.npy +03001627-5f355e2a9fa2f0db4b3c42e318f3affc.npy +03691459-9b8512f0cb1fad4e73e1b2d018c0512.npy +02933112-230a987c4ff5f673921dd903dd0b8b17.npy +02691156-e88e090caa1ccc5d187bd96066d7269e.npy +03001627-54e9203b65ca4989bfac64b1ae78ad6e.npy +03001627-ddfe96c6ec86b8752cbb5ed9636a4451.npy +04256520-bcff6c5cb4127aa15e0ae65e074d3ee1.npy +04256520-e063706e52feb2db039d8689a74349.npy +03691459-18602a0608af58023b80bd981244df4c.npy +04379243-79f4f47f29267c4cc46152dd624f1d49.npy +04379243-e2efc1a73017a3d2e76bc197b3a3ffc0.npy +04256520-6d31bf9cfaa63bd1455785c13440f50e.npy +04090263-5ae6db470db214b258dc97820d1d9537.npy +04401088-e48a2eff0b0d0a39a0eb5a85db887292.npy +04401088-da390e1a895506db28792f2ae4de363e.npy +04379243-2b88cee2ab30101b9b11da89c22111dd.npy +03636649-c83073e02e70410a35836c728d324152.npy +04530566-7f81a9c7137c855cd03428b7741c342b.npy +04379243-e795845c4e472bfcac4834e2c94f2b9d.npy +04379243-9a8852ff4b82a1585d624cfcd9a37a7.npy +02924116-ddc86e59f6a2756b99ebcb8df4d39cff.npy +03001627-60763dc3cbf36974b0957d845ac33749.npy +02808440-ef03e3a3dd7de9cfe52ffd0e748a1ab.npy +03325088-a48b7d5d965f8cfeb362845c6edb57fc.npy +04256520-3fd28462dda59ee49ecd5a75a29f0715.npy +02691156-fc16704314dc71ee9a6e43b878d5b335.npy +03001627-6281a6537c8c4bdce6fe3612af521500.npy +02958343-1963641a15916c03709ce7955adef61b.npy +03046257-f4a7568fec31f2ce2e12ad5cca2dd4ca.npy +02958343-51b8011a2eaaed85cde8c99e4b182f9.npy +02828884-56916be69d224f2a3569fd2bf3d0a41b.npy +02691156-494660cc290492218ac43fbf276bac06.npy +04379243-6f3506c9c5202101c4e8952b27b5f370.npy +04225987-b2dc96e7d45797f69a58f604ee2cbadf.npy +03642806-be6af6c0bdaee6e06ec6fb380960ec65.npy +03691459-2b3a776ab2c38e3844f57509e473c41a.npy +03624134-b776aa0216ea6cc8fa45e0e67b513758.npy +04379243-a96600d919eff11c3f92fc6b6f6f5bda.npy +02924116-bee327978e3a95256ca2b6e5474aad11.npy +03325088-207dbdcd7f90c2f576c18e71fd49c4dc.npy +03691459-37325d57c8ea891ad77ea5e1afa5bfe6.npy +03624134-a8d99d551c341522192714da339f337.npy +02691156-a9240313c39307574c3a35cee92bb95b.npy +04330267-f23bc665def38d3950dca30f65c243da.npy +03467517-b6599453a9903ed45b0e6a2e453fe7f7.npy +04530566-5456c7546e3f3c3d9c5408f4f799fe72.npy +03001627-86ec9c796a6c1789e792598ed58dd1cc.npy +03636649-69a708be7245f4c9786e8e92cc08146.npy +03001627-5067a76bac4fd7892665f68ebc337f05.npy +02958343-4d0115d72892d27531780fdd33037c9d.npy +04530566-9df836e5ae285e2a5c5cb89ac1b518ee.npy +04379243-b7e0c66b0c6641137141495dc4a593.npy +03624134-dd2173371e7d5f83e255124126c8e640.npy +04379243-fb5e8a6361262c26acf7920879052e93.npy +02958343-f4440b2cecde4131afe1d4530f4c6e24.npy +02808440-4305c0f75a0bb2703af30a3946d92feb.npy +03085013-908428b9ee9db16ffd06de9ba37d44bd.npy +02828884-302c64b3f9d0e0a3961c690e3d679ac7.npy +03691459-73c40350f07efb92d207241113bee327.npy +02958343-d91d378248a55e44d9cc84cf84983165.npy +03001627-9bd5937be6aafe704c29eddba1f2e390.npy +03991062-e538a79b42c8db6b2d7a27ffaafaaddb.npy +03001627-c9d68e1e5309ac25ac57e7d566628472.npy +03211117-453b06180bcfd33a86b76551c6a3b2b.npy +03636649-e6b34319c9ce57258d6a77b750ad3e43.npy +03991062-c1505bf780727e15cb03b57fca000b1f.npy +03001627-e2c7903ad9e8f497a7be81e6de3c404c.npy +02808440-407e9ad1c8352e1f125fa9990176f0d5.npy +03691459-b6210936b5d1be007670e02527d78e8d.npy +03636649-2ba14b4b910e3f41d983ed4f6d016adc.npy +03001627-5d4252d082ae613a2fa77440dcb93214.npy +03001627-d5424b7fdd031fcdd41c21de8af66e26.npy +04256520-75214586f291a04fd45611d32fd7733d.npy +02958343-9c10e71c06558c3b1bb46d2556ba67d.npy +03636649-24fb5c490856f7bc12b31765ab67b41.npy +03636649-9dad7ce60aa168d72cd2160e449d45ae.npy +02691156-a72bf66e9213b313a9b2becd26dc2fc1.npy +02828884-243ac273ab2262b117b4e4e00788e093.npy +04090263-bbc67c7095126f60e3e6e6fc6b79d595.npy +02691156-befcb95d80e0e49119ba010ddb4974fe.npy +02691156-3923b98b26a3c7865f50257ecdfa5c7.npy +02843684-2e81196fa81cc1fba29538f582b2005.npy +02958343-9948d84501b8ab721e7b5f06a32cfcd1.npy +03325088-97189607e5264b2f58813b85ef7bf518.npy +04401088-de271ee7c512d31551c2056c93a582cf.npy +04379243-6765d83445c2338555f46d55537192b6.npy +04401088-7434bc601d949333cd5ca8d1acb8ce0d.npy +03001627-e658d490aaad69d1746cec00e236149d.npy +02946921-e706cf452c4c124d77335fb90343dc9e.npy +03691459-2a8345bd5d50456d8db1a0ee98c45ee7.npy +04256520-cbc445c307221601433b4c9b207205a9.npy +03593526-c9f017cf330911ab1fc611122dc20c0a.npy +04401088-e3e43df4a3fc1870d4d7de9e3c2bb6f4.npy +03761084-11b6eb19d293f93676839a521e23c8fa.npy +04256520-fd2f1f0d3c4b90d535ae67400a94a6fe.npy +02828884-f540ad990dbbd600f4fb4dee5181bee.npy +03001627-d8cb5a5707686c9295a391f7b991d876.npy +03001627-801fe0b3a0e555a937b2bb75885cfc44.npy +04379243-383c5e64f539b2852f852bdd38b1133b.npy +04379243-746f88894a7cadb6253bda70c38d078.npy +04530566-1e047e25506b4885eb5715ea2e14242a.npy +03636649-4b3bc509cc074ea5ccfcde790fc2f661.npy +03001627-239a5029476b8a2adb6f46583a3903bd.npy +04530566-ea34a8282ae86edcd3fb60637c014c9e.npy +03001627-17d7a3e8badbd881fceff3d071111703.npy +03001627-45dcb53af7bea0d091912372ddaeb001.npy +03593526-e0a62f7d9bb5cfea36b0f2a1430e993a.npy +03001627-8d7f0c67789caaa3f415ddcc43feede.npy +04379243-452ee9c2477e471b1aed2875db0a8711.npy +02828884-a7588e794de38fd055a60d8737d1c0e9.npy +04379243-ab9bafe307e11e7a2b8a1a2aaa466160.npy +03691459-7aba5bb94270d994451485c22fb285cd.npy +04379243-a83cda80e5c5a0fc3719086e0b4ab8be.npy +02691156-88771c5b02d6e267b02bf6205401969.npy +04530566-83aa90436933149311c337781d78350b.npy +03325088-3810cc92f4ed3420c36fb70296e45483.npy +03001627-f9c61b40d4f49158ca998f0f87d0c84.npy +04090263-897e6a6307da50906314c3b6a3a65519.npy +03636649-9cf29c3de0cf127730f6e0ede20c4525.npy +03001627-91819d15c2c044ebd47ffa500636d198.npy +02992529-1e597e56b6b2fef6c331b59dc8938ad.npy +04379243-91569ca6f0578ea9ca2ed12df13a916a.npy +04090263-aa858f23b682f5616314c3b6a3a65519.npy +04256520-709389fcd446ca6593ebeeedbff73b.npy +03636649-79bba57a00789023febdb1f263373824.npy +04379243-e18c2cce4bbab2e45b7bf37141f96eae.npy +04530566-f18739a47f1f08e08510ad9ae6ed36b6.npy +02958343-aebcf0140cd6206ed6dec0e17c3e2971.npy +03759954-61552084780cdaa311eba86b475bafe7.npy +04379243-a2baf45f001e118e2c79f7f31759bfa7.npy +03636649-41f3ad2781ee196bad0e80a2288e336.npy +04379243-a9d27bcf51153e4567de2aaf749e5256.npy +03337140-73ad48664248623691c352d02061b3f7.npy +04379243-92a05eba553fd1247674a65b52217c22.npy +04379243-10cc8c941fc8aeaa71a782a4379556c7.npy +04401088-c65f71b54023ee9897d7ccf55973b548.npy +02808440-2b6bea31677afd413321831d2245cf06.npy +02871439-348d539dade47e8e664b3b9b23ddfcbc.npy +03691459-c6c88ee9ea728a3220815abab29462c3.npy +02958343-33ce4837f282443258c27e607f6e2d4c.npy +04256520-c87497b3c00b3116be8af56c801ecf41.npy +04379243-a479fea6394b100a98f849d6224d303b.npy +03691459-453391a5d1d60bd51e859883d2ec3f1a.npy +04379243-a44249589b77b4674b3c42e318f3affc.npy +04530566-1fe84ad7b78667e47428866500a95dd8.npy +03467517-f4dc2860ddfa244caee8866e459a90ea.npy +03001627-e8e586ccf4dcac74cad9a65dbad13fea.npy +04530566-d0ed110df0d56672b26ad4ebd4ebcb88.npy +04256520-79a9aa1e8b3b108cc48383e281a276ec.npy +03790512-b91424e8cef60e3e1bcfe9129a6aea3a.npy +04401088-e33e1483c4c22b1ae71852a7b0e4fcb6.npy +03691459-e5c1a7e9bb2dd0d65a31d91ec836a511.npy +04379243-9a314f79b18ba7914187eeeb0dea4986.npy +02747177-d5c28f4d7b89bc87eb13448f2bce3ef8.npy +03691459-7f87d18e6cad013ba448d8e70febd930.npy +04090263-ed64394470cc3075feafd6f06fc45258.npy +02808440-2edc92c82cc5db3d3321831d2245cf06.npy +03337140-2cc64133d27c1946ce5d6e9371bb5c33.npy +02691156-b793e65c707e884262bbb378da4fdb53.npy +03001627-e9a8bc335a7faf78f91663a74ccd2338.npy +02876657-aa616bbf51ae233278d5828fe3be4b43.npy +03710193-a603aea34beaf4424b3c42e318f3affc.npy +04401088-ab5fc5879ace7418bdec90548bc24588.npy +04256520-c47c9d6c6c8291d61008a8e167b50735.npy +03636649-7ea1864f38bc326696a3517f50eeb9f4.npy +03001627-95c5a8897fa78d3883b06dcdd869d9ac.npy +04090263-d421d54e21e5f9edaf56497f051566ab.npy +04379243-a0ee8f7c4c2907b4e45ef4135c266a12.npy +02871439-5ec9bedab0bfa761664b3b9b23ddfcbc.npy +03928116-3d7066d8fc23db60df13db406a7a8ca2.npy +04090263-4bcc0ecc49ac0617525b3f0594400a46.npy +02747177-a2e9d8324c1f62cd5ecea499ceee624d.npy +04090263-6fafe3b82e6e07de460c5cf20e4c5e41.npy +04379243-8343d98e3710f5bee1b32bbe69d5bc15.npy +02958343-481c55b1fa36f6c7d834dead2eb68d68.npy +02924116-5124b67208af1ff7d26e47b24e76e338.npy +03001627-7553af75b08b6a87eaac479593c9ad1a.npy +02808440-6c92a80574e97e6a2f38c0d2792fb5e.npy +04256520-c734c6bc3524b673ff2c92c2a4f65876.npy +02958343-d695f936edcc28d497df6383472cc5b6.npy +03001627-c66a19f08d86386430bbd4cddd04c77b.npy +03797390-8570d9a8d24cb0acbebd3c0c0c70fb03.npy +04379243-5ef7fbec36f8854ef7b4b759a0c02e4a.npy +04379243-89942c8f3c2796a71e54ac67f0143e13.npy +02691156-e5af05179ffeb8fcbd46d022fd7d80aa.npy +02691156-d0ee4253d406b3f05e9e2656aff7dd5b.npy +02691156-4457652c2853e0bea8cba409c4409ba9.npy +03691459-3e16cce54c6f0b0f8c21317f25d028ee.npy +02828884-165cd9780f069ff31a546a81aa94b4a3.npy +02958343-e0978173fcfc5203510556e7c3123591.npy +04090263-7e316474bc8b072fca74c4e4ab012aef.npy +03001627-aef0600be3f8f384f51f77a6d7299806.npy +03948459-2e787f6b6f93c097a576fcada53c585.npy +02933112-29832b9c3d644c744da5feafe6f1c8fc.npy +03001627-5d3eff6a1b9a119da011ccf7cbabf68e.npy +04379243-8a179c7244ed94f4f8369c172d21d852.npy +03325088-adbea30c5cb5e4d94a0a22774477f1a9.npy +03001627-708cd72e15dfaab8a687729fda50af77.npy +03337140-7fe6d63cab6a594030bbd4cddd04c77b.npy +03001627-d64b2ba9f1f35362cffd61677456447e.npy +02828884-b4a9481e902d011ced98cca8f0ccd5f7.npy +04379243-ad14b4bde4a656dd53b1634376cbfb93.npy +02933112-4293fa9040a1790f5e30943bb32d54af.npy +03001627-e93d141a3dd25b46219e03e23fb59d78.npy +02808440-c69bef4275de0fd6412deb0d2b0f3dcd.npy +02876657-645cf2b7f442865ebf8d8d6022c8e3a.npy +03001627-97a4d1ab6d58bc2ef60f0f3341009abb.npy +03001627-ef6c2cd0b8bb6e8720768660cf080d12.npy +02691156-6ad89740605331aef5f09964a6a1f97.npy +03642806-461b3592ac4674cbd2079b28d473791b.npy +04256520-e232e06ccba3e82d27039dbb84e920ce.npy +03325088-7d2092c9bdaa6b6054d7082b34825ef0.npy +02828884-fa51b43a7de98d0b7a7695d948d413b6.npy +03325088-4335832712076999d84cdc7f15b1ee59.npy +03001627-6cd8056d4dd6b3c799b17588a5699c72.npy +04401088-515b5a63ebb56aad7aeb5bbdd191fd4d.npy +02958343-82b9bbf2c5c630d9acc1f3191aab65d4.npy +03636649-49749cf225cb899573ab7b7128d466a2.npy +03001627-eb1019c438090004db6175ef18ad3f80.npy +03001627-617f09d333443b8e91745c588e2e0fa.npy +02828884-c311a54150b7c64acb2a965e75be701c.npy +03991062-6e66370dd674686ec938effd02ae5d4c.npy +02958343-88ad6f5df57cf8ea16abce8cb03e7794.npy +02933112-dfe503e6a4a86d4dc59350d819542ec7.npy +03046257-90d93cd686935a4bd866363c8e6eab2b.npy +04379243-5b1000b7bc6e0d3b7e67c36deaaa271e.npy +03636649-3fca250636e2b47a8d0fc77aab7a8d33.npy +03001627-d1d9da0da16dbb1a765101d95c92a0e5.npy +02924116-320ef9e8fc776863670716c89dd036f0.npy +02691156-30d1974a29d95d8be8bfa4901aefcf8d.npy +03636649-5aeb223a91320c39edd4171cd40b3feb.npy +02958343-936eb7eec6b76e4b421c2195de5e56c4.npy +02958343-d43eae16d1c14f48788f2ee06c24b7b1.npy +03761084-1a79926636905e0ccb349a60fd15aa15.npy +02828884-ddd142d8dcd4e95bf4fb4dee5181bee.npy +04379243-dbc98a58a2425925febad4f49b26ec52.npy +03001627-fa263643fb3f45c7492d9da2668ec34c.npy +04379243-9b7b33f2892e7bb9562c69acee9936b0.npy +04379243-4c8992b5868f945c8164355cfcd0b549.npy +03593526-81a4a5f10f2f759fcee8a4975a4efb00.npy +03001627-49a3b0242c13f92da6fee8e2140acec9.npy +04379243-d6f122e1570e4180d6686dc2df08cca5.npy +04530566-5eb2d085267142f26192896700aa3bd4.npy +03991062-2ccd2b095bd8ec27e2ec5524ed185c34.npy +03636649-70b78b9439a9de7530f6e0ede20c4525.npy +02958343-3d6e798bed67ab81f00cd8c386c592fe.npy +02691156-cc86a2ca41e279bc89b1c1fd829ec927.npy +03001627-5d5ea6ab578db7ad331fc18393f04d2a.npy +02992529-9adae247285e9538836a2d8722d73dfd.npy +02924116-7400579f0ccb8df3193d7855ecfc1bd3.npy +03467517-1455e11a8e89e348c80076acba9f64d.npy +04401088-f46531484dea3574a803a040655859ad.npy +04256520-725def83aa65422dd4fd21ba7448467e.npy +03001627-447e5db7c84797272127b77d9c9dbf6a.npy +02691156-3fb7ceab42d7b17219ba010ddb4974fe.npy +03001627-d49ce87d43cf4c8f1679065e1c457f94.npy +04401088-73339a7ed1e72d89aef10502d58d4967.npy +04401088-e76bbcc0029c979721844676433a0aca.npy +04379243-9f4eb0d734a2b7a4ab610b0c94236463.npy +03001627-cd9cd0ec7bc9400b559cb8a953a07d9.npy +04379243-392963c87d26a617d5d95a669ff2219.npy +03636649-ddc2beaa04d1b06f5fa701976706a45a.npy +02691156-77a81458ea729c62ace5721ccacba16.npy +03636649-acaf95927290a89182bfcd34215ccfc7.npy +03636649-1e9a36b3360f23388962005ce0e986db.npy +02958343-c7bd3c33967a3f80d292079a67d9d7f4.npy +03513137-737e1c921100f038e263fa6049be3541.npy +02992529-4991cd37af08577070346e4935b9a42b.npy +02691156-cdbd857f25b1597c711d3e79ce66dfac.npy +02958343-8ceb581fe28a6496510c6353f9f7a5e3.npy +02958343-94c75ba9c6747f1bb491214a0cc2380.npy +03001627-6f0def5e832f3614c01e0156f398b4d2.npy +03001627-3ab3c9d99fcaa66bebd676e3a69dcf6.npy +03325088-d1a30eb29847c0d6c36fb70296e45483.npy +04379243-f616f5c2068eebaf6aa35752fcfa44c0.npy +04090263-8a8f66b04e6d8f4ca9e925ec046bd20c.npy +03642806-283a115028fffe6e4e67e2e8459ebde.npy +02876657-8adc0ce79962ac2021072d05c97a5e0a.npy +02958343-3973846825fc4d857cb2a55fa21392b7.npy +03001627-26bee1a8ea71545c3a288f3e01ebe3.npy +03001627-9451cb35f46ec0f6f946fe2e431cd4fb.npy +03001627-ba7dc0bb03a57732a9d30b145d59ff.npy +03636649-e65eb892b1d1730e52470de2774d6099.npy +02958343-5801f9eb726b56448b9c28e7b121fdbc.npy +02818832-16b4dfae678239a42d470147ee1bb468.npy +03001627-33dc06a8e0933b1efc385a284336f217.npy +04256520-5101b79892ce920b6ee5c30704fa2d08.npy +03928116-ce4945cde785aecb478fa0ab37c461c6.npy +04379243-56ef806397cc9c4a62e6af9325f07021.npy +03991062-ce9dbad314c55616cb2a965e75be701c.npy +04379243-f6f180c3e72caacb5077539b37310c29.npy +03001627-433c6c88f1a43ab73ebe788797b18766.npy +02828884-4b6276df295b3967601104cd2d998272.npy +03211117-ed31aec87c045ebdebe17c8dfb911d2c.npy +03467517-819251e11b46438ff6ff9bebca919581.npy +04379243-7982e2f2984978c6f4b6538438a0b930.npy +04379243-c421fdd1b116030fb129901f80d24b7b.npy +03211117-a296a6d7957a8ce9eb752889d5199f9f.npy +02924116-2403779924ebf18af446f92b52bbd82a.npy +03691459-b8b17a4a9b8d0d18b1561629b743a85.npy +03636649-45fcbb7812f0c9e729426a0f57e4d15e.npy +04379243-ec356bd4c5cea755748e58db1ff83cee.npy +02828884-a73601ecef6e3cf9f155d75bbf62b80.npy +02691156-c878cac87819f01490baeef8ba5b93e5.npy +02933112-228a83ea767bcab94da5feafe6f1c8fc.npy +03001627-46557f689f4cf5dd2acd2bb6205825cb.npy +03001627-e30bd575bbd6c68c9710e093c764abec.npy +02958343-216d910f71942f205df3c6413d40ccb2.npy +04225987-573daccbcfdc94a3cbd54f2dfaecbd51.npy +02747177-14a49c2b9f46faa04d6ef9ab90177563.npy +04379243-96cc60da5c390047c242632b2a8c3129.npy +03513137-f2107d6768adf4952fafb0cab311e6a.npy +04460130-8b52d84dc97eb3a74740473002adcaee.npy +04256520-9866fc915383a06cc85117b19e0f4ee5.npy +02808440-54cd5f394513b67fb0cfb8f47209a593.npy +04379243-37a73eab8cb0267f855931d119219022.npy +04090263-ff7afbe21c3c9408a2e534aa19c114b0.npy +02958343-be348430ab5fa5cfb1bb46d2556ba67d.npy +04401088-c2884eed47300891697f9662a764c78.npy +04379243-20cc098043235921d0efcca115b32b84.npy +03691459-2f4e9cc37c3bf5f1fdd84f4a160b8854.npy +04256520-fa0eb1bb05ebe3f2dd3adf3090c701f7.npy +02691156-1496504f42de2eef8b96ae1a0a8b84ec.npy +04074963-48d98af2e73604103c207eb23f7d33b0.npy +03790512-464a86f04b0f6e452a643a53ea2e7c56.npy +04090263-27156455bd418715a50ef3fc203c6ba0.npy +04256520-f0f42d26c4a0be52a53016a50348cce3.npy +03001627-681203ebfa280f5696d5b0735c6b5f03.npy +03325088-6a3bdf75976bcd914b35a7d7cea7130.npy +03001627-bca8d557dac05e082764cfba57a5de73.npy +03001627-58409b308683d908ca2bec46a3b47519.npy +03001627-1bda25dc158098f438f6f5a7dee76fde.npy +04379243-7d96b0823233ebe7b49b261a212e60b5.npy +04401088-e14de927fca30e267a351c9c1f605db0.npy +03001627-29483ee10e6c6e4c2c37553db37ec752.npy +02818832-2a177aa438616992c9b60ed0e1da4c.npy +04468005-539ad95ea77939f8f9a3483407086411.npy +03001627-a11592a10d32207fd2c7b63cf34a2108.npy +04401088-e0355773a18fc61224d795aabf4bd88.npy +03001627-ba1adc474cfa2f429ab926a7e944e795.npy +03325088-f17f569ccdf9e9e85b1c02ea3a290822.npy +03624134-298d152fd0adb0f33347c5de2992cc8.npy +04379243-4ff1ae700013a877ca6910e4922d61aa.npy +04256520-e0591c0d35f82023610c2a68437007d6.npy +04379243-cb860d60db8f3d18febad4f49b26ec52.npy +03001627-8176364215748b23490ad276cd2af3a4.npy +04401088-3036e6b2a898fc85e85776440ad91264.npy +03001627-b94002e3a92ca65efdcf3d27ddf91f4c.npy +04090263-fb36203aa01524aaca3e540900266737.npy +04090263-a24c70db5fb77268b61fca3643811d06.npy +03046257-1b315e0f647b812619a7b441086db5cb.npy +03636649-1129a07c75f5a709cf004563556ddb36.npy +02691156-d3b9114df1d8a3388e415c6cf89025f0.npy +03046257-26ab68f614b5b24f2f841233486fac2b.npy +02958343-4235a8f0f7b92ebdbfea8bc24170a935.npy +02691156-9a29495f38c07b0526a6eb5f28c0aecb.npy +03691459-4e0473ee9d5c72aef00aae52edb0b7b.npy +03636649-3ca37e415fe44ec2ebeb1e6a8111f53.npy +03928116-861b8b85db9652ee9f7eb1b54c601d0c.npy +03001627-f441e4f7f123bde3cd7677199133326a.npy +02958343-dfce5b313bebfba3ef8e28849949a11a.npy +02958343-23ae5d6c60ab3f60ee3362a8d2d8318f.npy +03001627-28ea1d2d2ff08b1b551d2444ac95a3d.npy +04090263-84b9cd6750fd102a9a2ee232a197081e.npy +03761084-30f4135ed68bff99186b61b33e112099.npy +02954340-4bd0b6df02772d8f59c9250a427b57f.npy +02871439-4996e0c9dac4ba3649fade4fe2abc936.npy +04379243-32d64e4638eb6e371594fba9df8f37fb.npy +04379243-649fb8e1ead691c6359e4b9c4f6dadd.npy +04225987-755dc44dae7791761082f2ea630bf69e.npy +04530566-de100dcbc3be32f2baeac688ed8ea6cd.npy +04379243-bb9304218d9741489ccce4c6d5bb195f.npy +04090263-5f2b8f1a75a51d90e76598b090652f4a.npy +02691156-5e31a194b02a286df8c6d04d97f8cf7.npy +02958343-b36c9481f71c2428ca92a4cdad802b45.npy +02828884-f5557538f4c6d755d295b24579cf55b8.npy +04256520-8affea22019b77a1f1783a44a88d6274.npy +02958343-2e6a9622bf83f04c38ee77d0178bbf4a.npy +02691156-fcfa1a67f34e7f2fbb3974ea29d1d642.npy +03046257-cb625b3a9b631d89dab8b525f98c6502.npy +02958343-99606d5346d6b958b96244559b61fdc2.npy +03636649-72b73a861b7626dcc8745da32e9100ab.npy +02992529-8a56e999d75c4d6e8d1dabf86742ec3c.npy +04379243-bb28f4978ec66a9d5369e32fb818f337.npy +03337140-fb5dcb6b8bceecaa4c3aee8e9d3a6ffa.npy +02876657-e017cd91e485756aef026123226f5519.npy +04256520-b37f1363aa93688619fb4103277a6b93.npy +04379243-228561e28a40fa1dda49e29c548bb1eb.npy +02958343-279adb2c37867b3a18d9ca1acf6633f6.npy +03001627-2759711dbb8b66ce66e463776e370597.npy +04379243-94a62cfdb84e88ca9a3528690d225ee1.npy +04379243-211f8bcd0542292a90eb1f8a00f61726.npy +03001627-f495c500ef468ea781a172d69c52a28a.npy +03046257-ce1c9b167cb2db948f83d145fcdeb409.npy +03636649-b1ac784f48473df1e7c7920f6a65a54d.npy +02958343-22abdb50fcc189d58a1aed4fb5fe5280.npy +04379243-993675648a0f1b1a9a87002a4eeaf610.npy +03593526-4f52256337d0d4a4c6e7cc40a98a4ef5.npy +03211117-90502bbf33c05edb369cafe8a991ad4a.npy +04530566-7edbaebf7d4fa994eca93934e5f39869.npy +03085013-e834257d8910fab3cfe78be5b7b99c8d.npy +04379243-9859cddbb637f5c8d3bb9bbe8087feb7.npy +03636649-d1b15263933da857784a45ea6efa1d77.npy +03211117-666902d92f3c8e3f8ee4af899d7fc545.npy +03467517-9e26dcbac33f056c343b0b12983b9982.npy +02691156-63f4d6895e0de9079bd3f7086e6031a.npy +02828884-21358aae456be5087e03aa42670e6f5e.npy +03991062-ad258c77538632867bc41009043d88b0.npy +03325088-55457023edc5af692f7a42055c3e9340.npy +02958343-6aa8f648cc8df63ab2c17ece4015d55.npy +04379243-78e1ea4568b0a1f5e7608f43dfbc9312.npy +03593526-b61141090612ac3ab361b6be63163da.npy +04530566-a7444ff7be7aad024c8ad92cfce1307c.npy +02691156-f7f69ecc4ff199ec5e9e2656aff7dd5b.npy +04379243-b623ede2cc40ae1d377b9297f3055210.npy +03001627-e4a93adf5399b23419fb4103277a6b93.npy +04379243-35ae6545bdefd0ae7ee217c21e683487.npy +03001627-65a1f4ac3e5b57dffff16555386d173d.npy +02871439-41bcf314c6488e939af4053b8815b239.npy +03046257-8cac6e868bd4b4d0db54f0ac1f9f81ac.npy +03636649-b2acbb6717c7a842fcb8d8c6d4df8143.npy +03636649-5e4f40ec0a77cd1e876b399a99a15c0f.npy +03001627-df8440d8678f3a91c8687ff9b0b4e4ac.npy +03593526-23f305e2ca3a3007ee106795de609335.npy +02801938-98c3ddee85264efd7cd51b1084c649a6.npy +03991062-7c86cdecd3b2d29125ebd1cd0b422e32.npy +03211117-5f2048a8af029336a186ecbc0474571d.npy +02958343-de79348d1ab77d2de1274d5dbd93afc8.npy +04379243-290dc618c8ac785cb000f20a5153622c.npy +04256520-d116e9440f64d7a0e7791a1581855f1e.npy +03211117-2361d8f169a7f3479ed83bc63b2fb8ab.npy +02933112-407a485c7d711903ae25f6fe802a8997.npy +03001627-32c2fe641cc95e2d3ed2a8b3ea354e3b.npy +04379243-169deb7aa6472eef2d26358520dd8de1.npy +03691459-f993f348260454bb538cf6df9faa9b65.npy +02958343-780d41c78c60794a6a2345809e2bb169.npy +02958343-e729c1d5c3cccfb3bda733a39f84326d.npy +04225987-515f3fab6bee0c40de82f1e4605731da.npy +03691459-68e85f236ca1b43467cfbcdcd1be46c8.npy +03001627-d454f99b99248bf337c99625b0c170be.npy +03636649-de93987085cf4dcc5208aab875b932bc.npy +03636649-31768574bcddbdde60ad823977adaa23.npy +04530566-3b662a6ae2eab330d7ea446be069b8cf.npy +04379243-47ebb5ac05b46c18488e54fc0c1b4fef.npy +04379243-47758895632d44efba4e573e8ad2f887.npy +04379243-95eb78897f03652eaaf42e97665fa72.npy +03001627-a52e8bd8b570f268f19146fa01c25917.npy +02828884-d8c1f1b9bdbd697b849cf9ca1e2dcbed.npy +03636649-e178ab3b967c7fddc901d9dddb735c9f.npy +02958343-5e857724d62912969acee38782dd9680.npy +03636649-5bd90c0cb1f01b24118486d21a76684f.npy +04379243-a12a759155f4d0ed7eaa96064512efab.npy +02691156-aa07239e9397cf189601fb40d0d298b9.npy +04379243-63aa14915f59ed8671a782a4379556c7.npy +04090263-42291af681d91a6493ceff0200cb9e84.npy +03001627-8c9b2023ecdeb7b049d998127ea6baf9.npy +03691459-993cbabbe4b4bc4431baa3c9ee4148cd.npy +03624134-f0402647fd0236f999abe44c28bf45e.npy +02871439-95eb9d33fae745a616a2b5862518c93.npy +03691459-3dd9222c775b1779239fd9d02eb7da4e.npy +03337140-e34cda176bbac1967a50afc9c93f8a50.npy +04379243-c7358b3aed4160cb21bc3cf138f79e.npy +03325088-832cb748754a0adfe2741a99971b1f5a.npy +03001627-1b80175cc081f3e44e4975e87c20ce53.npy +03001627-58ef4177c711f38fe302d4da760c718f.npy +04330267-45c494c0219a5ffaccb5c4dc056b97e2.npy +04379243-2aeebc06bc97ac054287bb3d3a4847fb.npy +04379243-2ec13926519716142b0659b9edd2a3d1.npy +03211117-3defd11d1a251becc2fd601ec7a8062b.npy +04256520-7f5f4774132a25f3bc8126c23d2deb4c.npy +03001627-5420d4699cf0125fd08f8c5dee475682.npy +02691156-a9e6abca0f6bf69416ee5e3e330ec691.npy +04256520-af796bbeb2990931a1ce49849c98d31c.npy +03001627-4c30d612b8663402492d9da2668ec34c.npy +02828884-648754d5b241b12e4886781cb92ae74e.npy +04554684-83546b11f6c0cbd0c6e1273d5c613c62.npy +04379243-7d3a5c7a3c319544bc4ac3caf16ef65.npy +04256520-8c788c0a04623efbb45ba874f2848e8d.npy +04256520-248e014f31771b31d3ddfaaa242f81a1.npy +04379243-378a4f0524756b0ab20aa91e9e90c311.npy +02933112-ccf7d017b67b51b7b9349bb36676bc81.npy +02958343-488e4530f2b157c2e877e82c90c24d.npy +04530566-c318af82802fdcfa9863712216521456.npy +03593526-6c47d6e5ee3f6a5da8f6851a5d3f13b6.npy +03691459-bb7dc95eb35acc8bfd7a7d6380a6ae94.npy +02992529-4a81237a7fc743763992b1138bb05b3c.npy +02747177-1860c92b11061edce3b4c991629e71ab.npy +02992529-6d85b3dfd681eba530400184d5d3220b.npy +04379243-8991703fa2ac67e7310cd758d9b7cf.npy +03211117-59e53aaa8d8e9d5d9bb1951c99c5330a.npy +03001627-f35645e0b1141804a57b3bec78e5d1b3.npy +04379243-58884a3e77d874efc3bd24f986301745.npy +03001627-9ab888a92d73e4d4a6ffec31b6fb775.npy +03001627-1cc6f2ed3d684fa245f213b8994b4a04.npy +04379243-4acb95a2fc33c3dd19fb4103277a6b93.npy +03001627-6a00357a35d0574b8d7d306df70cbb46.npy +02828884-85bfe701cf6398c69875b72c651247a3.npy +03046257-f01c3ee2b1210cafdb3180683be7ca4f.npy +04530566-bc691ae1f2d6cf0ba628de2fd7989b40.npy +02691156-b3c37b67cdcfd68571d03b466c72ce41.npy +04256520-66ea6f8add81adc848fda83c10428379.npy +03624134-ad5716a9d9b75daf812bade9b93f0eaa.npy +04401088-39e571ec1bcd371bb785a4ac4a0dbd73.npy +04379243-8c5f1bf61d4c1d55b65938a95e1f893d.npy +03636649-774d99cb78b5b82e3a5e6305a3a7adee.npy +03001627-9e5e03508b204754c2b64c0adffbe398.npy +03001627-6673cc5f492f48a229404a50338e24e7.npy +04530566-55d87dea079d2b991bc665188b93587b.npy +04379243-e97089561bcb8e85833c6c72c4b62a4d.npy +03790512-7c989bfae27a958b615e82f53965c4cc.npy +03001627-44ce5f9acd418c7dfebad4f49b26ec52.npy +03691459-b92c1ad2943ec29168faa7730065e439.npy +03593526-1654250bf1bc5a0131fef20bb2ae787e.npy +03001627-acfd2b0f06c128d72157d75d50a75b71.npy +04379243-edf4152aa274a8ec78fe949fc1419876.npy +03337140-a9f6d8883895ba6a19c53845e62c180e.npy +03211117-7940b411f730cb767ba0766d8bbd9a5c.npy +02992529-afa806973174e442ac4f72bf08dc79a6.npy +04379243-51cfb783895a8af9febad4f49b26ec52.npy +04256520-30ae6ca65155012e4b3c42e318f3affc.npy +04256520-22da5fee0352cf194b3c42e318f3affc.npy +03001627-b167632dc5c6c72b19fb4103277a6b93.npy +03325088-aaffe37373701787a5434dd1663ada09.npy +03467517-9ea48deefedac72c441861ef056a75b9.npy +03001627-73a7e497299da43885a2d2169cad3428.npy +02933112-c4db384855e345009f8c3d2002c77ddb.npy +04074963-436c74caa92dcf123c81d9b042c20aa4.npy +03636649-cd05ada0981bd85a2c528d33bca1ac2.npy +02958343-1d700f9bfc275cd23681114f72c10d56.npy +04256520-a46f3d5b1d3382d5cb11c9bb51caa476.npy +03046257-ffbf17fbe4ca367d54cd2a0ea6cb618b.npy +04379243-d1f808613f6dd787a2c8f09e8ae34f27.npy +04256520-2e445df8836c2f55722ac248306b14e3.npy +04379243-ec1e1abd7c9f2eaf5dc565f18990abf4.npy +02992529-112cdf6f3466e35fa36266c295c27a25.npy +03001627-a93d8aa9a17b9d07f5fc96890ba7d316.npy +04099429-b3b20a3769cf8797b95c8cfc3b5d231f.npy +04256520-4ebbe3f30aa1f5eb14038d588fd1342f.npy +03325088-d519321280e573574e65aebfba5f980f.npy +02801938-7a931ec996edbfeacb2a965e75be701c.npy +04530566-925c05dbefada808cfe472915a175bb.npy +03636649-13ec444752bd414bb01c58badc8bbc39.npy +02871439-81a1cbc08793679e75becd8a4c3f1866.npy +03001627-b6a89034b3da55b2cb79ea4974c73b2d.npy +03636649-af8fdc831cc65f0cb0a29c51aa6f10ce.npy +03691459-7c56acc57cae84a9a3e7d768d81f6afa.npy +03691459-3eed264487fcd94bd88a3e0e92891ad5.npy +03636649-b31a3ebb83f3c23f92bdd7f1055f4a13.npy +03001627-10e523060bb5b51f9ee9f382b1dfb770.npy +02691156-1ed9876ed48c145d663e90eaf6b4ca52.npy +04256520-ed1acc5b1cf032b94fb315ce917a9ec2.npy +04256520-fea783c6499e39ed4d304d5dc34c7e17.npy +03691459-956556bceabf511d871b94133e874f2e.npy +04379243-4fb805fd299207e7848af3cb674ead1.npy +04256520-ae1754891182af2675da567c4f0a0f43.npy +03337140-cd7ceb53a90934d04c3aee8e9d3a6ffa.npy +04379243-841082ec0a936a16a4bec68446bb57f4.npy +03001627-8e664a0bcaf9d2a45ca1aaa0789db621.npy +02958343-52a988b361f6cefd685753e73124c6e8.npy +04379243-a859f1f16a230a681a49add4e8d9a4bc.npy +04379243-f7896eb08596dcd6f9883d2fd957d60f.npy +03085013-f10ec7a7acc71e2db24a19cdd6afda6.npy +03211117-66a50da0551d36c9f13ece01395d269b.npy +04379243-1a521b256704b08fb6068c62e84866a1.npy +04090263-2832026da7b9c61ee1f2a1daf140ac9f.npy +02828884-9bd3bcb173dc1fdd73141c5c444ce860.npy +03467517-10b65379796e96091c86d29189611a06.npy +02933112-8d3d624b37b4803c33110e4a1f22f6dc.npy +02808440-4e399a21e6900cb9cbbed63b99f90f4a.npy +02958343-6dda1440d653d0c3bc5845a373118df7.npy +02924116-67658574bcbb1fb041cefd10ce5d6cc0.npy +03593526-6f2c815565cfdb97a1c637e821f12a67.npy +02924116-2c52d56ca79606a9459d3b2509b790cf.npy +03938244-15c98bfa322106a0d291861d5bc3e7c8.npy +03759954-f36757bccf80382a7db5f98d194d7618.npy +04379243-199d183157f213e0da7c128b58fc7554.npy +02958343-b12bcd0ba039b8d09362b924f11fb193.npy +03001627-d0e24e315e67bff2cd80b6234fc6097f.npy +02691156-e6363b1d63f6aad3c1006ed55bc1a3fc.npy +02871439-586356e8809b6a678d44b95ca8abc7b2.npy +02691156-5963e4385e6e5c0925c10fa44a32fd7.npy +04379243-5e70abb053c31036e9de663abbea1800.npy +02808440-f5dfd2eac1ede18c35403ea5eb244169.npy +04401088-5bc22a940bd88a21886d9e4484b773bf.npy +03467517-c99fd50cca7aebcf63e148e250c0340d.npy +04530566-a06a7f4b82beb87df6fc999231665677.npy +02871439-3d91b6fac7df81e4b209708994baff7.npy +04401088-9a4812cc600c67a6bc4fefdf821af065.npy +02933112-7d22aa2a9ce589b37ca94e8674788609.npy +02691156-c624907ad60cb9348a69ce464571d8bc.npy +04379243-a56fb908880a3693af8c4996d9577fba.npy +03790512-788d59c1aa057d8452ee90e577613070.npy +03991062-2352c917dd760e515510d59f3ab1ed64.npy +02691156-733afba7f61652e789850bc84e2ce90e.npy +02691156-b6d2c4beaec0520e9a6e43b878d5b335.npy +04225987-732270ac7e23d610e62bec48c266b5c6.npy +03001627-c6b6f0e604d6a5fe78a7b08b50e4d193.npy +03211117-3317e93256b3f4f15e7087f2d9a278a9.npy +03636649-32c0bfaac424ae9bf51f77a6d7299806.npy +03211117-2d56817501cf5fdbf477ab3f8ee0ba9c.npy +04256520-de14f6786ddc7e11bd83c80a89cb8f94.npy +02808440-721617d5fe78f33363ffebf86d8dd00.npy +03001627-61950eabab269b5c530a9fedbeceb83.npy +03642806-cc691d9e8e189ce47a381a112bfd785.npy +03691459-a159a9bfbe200e651ad88f716ea80910.npy +04379243-98791e9d594a7bcd41f7bb21ee1aab57.npy +02992529-a82fbd031a79f88eb6d41c42f7ade8c8.npy +03001627-e462df8166441ffaeedb49f6d982d28.npy +02933112-c04c1766fcc28fe886c701087a194026.npy +03001627-a4942597dbfd1e683ee344f731525f3c.npy +04256520-4e218928736f1e2bf35a12c589281a9.npy +04379243-4c39c5bcd53c1b593d08add0058f34c7.npy +04379243-b8003b8cd4263cb51573632af24b9a9.npy +02828884-92d4dbddae3f26772056b4bd5d870b47.npy +04090263-b84b0631fa25958f67ed496709eb9df5.npy +02691156-122963149f6a04272620819ddac40644.npy +04379243-70d0937e1d38a9c2a45b742ddc5add59.npy +03211117-3cb53b32b97c0a04c04cf0f68103eaea.npy +03001627-2314a3400230f50d14038d588fd1342f.npy +03001627-3f83565ed40f87c5593ebeeedbff73b.npy +02958343-8c835911f332db4ca92a4cdad802b45.npy +02691156-eaa0d465e9d0c16acfbf0f1430c86945.npy +04379243-e4487798c95013956a7d64731fd3b515.npy +03001627-1f65075818c1d832c05575120a46cd3b.npy +02876657-33dcf806c673d958f4bdca145ed48dc6.npy +04379243-26e020b7c9be193782db9fca4b68095.npy +02747177-e349b1d60823e089da15415f29346bc8.npy +03001627-b50529fcea40cea9e8f8c11a24c52ebb.npy +03001627-74bde5a0a8927f816e107e0a7fbbb723.npy +02691156-dc28756381ac019ac2912ef1a1302821.npy +03001627-46acde1907c1ee378523e42ce157c5d2.npy +03636649-9749404078fe4a8b6afaa22adc38077c.npy +04256520-3ac6d1680c7e0ba4fb315ce917a9ec2.npy +03001627-285931af369b12c2ccd42a2d6eea63ed.npy +03211117-44c3e596206ce29dec86cc96197c0b31.npy +04379243-5d2d0250111a44d49ca96b2737246fca.npy +02876657-6b884893938943f70b5ecdc69e74dca.npy +02924116-e136ec304c87d075a5d02bb361cb2bac.npy +03642806-850673bcbce8f73ec8a6d87a62ac0341.npy +02691156-762e29f11597581d62b600da24e0965.npy +03467517-8c3f4396af236610dae41e77f26f90.npy +04256520-1c78365aa05c3d2d64614cce5789ae5c.npy +03001627-42711692db3647394b3c42e318f3affc.npy +04256520-1de7678ce07c845e91ae3c216ac0d5c8.npy +04090263-2306f0777527603722267cbd3eded69a.npy +02924116-565bd4df285e7715f356d801a44749f1.npy +02828884-d25707cca23ab03ac8d56a266ac05b68.npy +03642806-b51683c6285fa0f69067ac5c9d4ee692.npy +02924116-f66b3c220fccee3bbc2719739d0b9f88.npy +03001627-89c85a35c353ab4c9a037b4abf810691.npy +04225987-16edf6f6574568723f7198a00163bb6.npy +04090263-38c4d7fda771b9b984593c54486394e3.npy +03001627-885c83345016a120c02b229e9105ae6d.npy +02818832-da206aa73f6083781ba83e86537e1799.npy +04379243-48054442012cf1989eea323f522c6486.npy +02828884-6ec8ad28c96e49b588c2a8e73c840fb2.npy +02818832-36980a6d57dac873d206493eaec9688a.npy +03001627-e9df7789d02eb998c8687ff9b0b4e4ac.npy +04379243-5a00f82cae6d2566d249abd69334079c.npy +03211117-c9ff448d7dd7b271c7c51d4ea74651a7.npy +04225987-9ac2d972bedd083342535d908ea693ac.npy +03790512-9b9794dda0a6532215a11c390f7ca182.npy +02828884-15ed07a6b7265f802056b4bd5d870b47.npy +02691156-ad2bebd9c3004b2e151f2df200a24ac.npy +03991062-48e2d1dfac6fdc05cfbdcee86b0a9a40.npy +04090263-2b331127befef5a184727a9a27a761c3.npy +02933112-5799c06f71bf6b88c59350d819542ec7.npy +03467517-e8ce159ab0250cdfb6e0a9d1e411d50c.npy +04379243-e8870f3190f6b8d4bd1025bd755a15aa.npy +03207941-776918b2918b11664a44340bf227e40.npy +02808440-985cd0d15f067f18a08bf4a5e8bfb746.npy +02958343-19f52dd4592c3fb5531e940de4b7770d.npy +02933112-abbb13b953629109d0b36851d61b6fca.npy +03761084-369e83693c7445a48ee2f8110bce2d6b.npy +03691459-6db722284891a7f684f5f65c78855f9f.npy +03001627-f3c0ab68f3dab6071b17743c18fb63dc.npy +03211117-dc004210d943c86073b4ec5aa28d567a.npy +04379243-9f75d067359e6db4f9f8d2db335100b.npy +03001627-f2e7ed2b973570f1a54b9afa882a89ed.npy +02828884-c8298f70c094a9fd25d3c528e036a532.npy +04256520-9ee861bebbc312d97fac4224dd2383a7.npy +04379243-de0267e2e1753bfe684b7bc3f8a9aa55.npy +03991062-8d4512e43c33cd0121f118c0cb20cf34.npy +03001627-ec00ee8e8345be7a852028c7654a8ec8.npy +03001627-116bcb3b43de74b9df9054bbcf5c6adc.npy +02958343-37249c6f16b203de2e877e82c90c24d.npy +04225987-79288e2c98c7be7c6e72f8cfa29d3672.npy +03001627-9c7c3478edebfc1031d38697be8abe58.npy +04401088-16685299c37055c2be40226527c9872.npy +04554684-4c90de8c1b850265bf258aa99523f66b.npy +02942699-6ca77b19e3f52c5031c1d3ccd72d7161.npy +02691156-3aa98ec8f8a1c1f44d210d9468aedaf2.npy +04379243-6327de18a3a3423c947ec73b27c6abe0.npy +04379243-c972e1b113c5972f577be0cbb9f51dc2.npy +03001627-76772a027634c747c8687ff9b0b4e4ac.npy +03467517-80aa2f0d66100844925eded29d6897b9.npy +02828884-8c95e3b240f590c52056b4bd5d870b47.npy +03001627-e454cdb43a7118678162dd776d80e71f.npy +04379243-d120d47f8c9bc5028640bc5712201c4a.npy +02958343-1c86d4441f5f38d552c4c70ef22e33be.npy +04256520-ed4ac116e03ebb8d663191fd557d3a61.npy +04379243-1a10879bcfca0534f8bc1f8036e08e44.npy +02691156-f8ceed6c984895079a6e43b878d5b335.npy +04379243-4f59b7e00a94352fb0bf045ee98272fc.npy +04256520-8092428a6a37b0b9970d4dd67731c543.npy +04530566-73c6ef5ee071b7f9791ed0cd6a81047.npy +02876657-41a2005b595ae783be1868124d5ddbcb.npy +04256520-9f6d960c57515fb491264d3b5d25d83f.npy +02691156-9e8f908bc6c822ae3f6fe63822cb343c.npy +03001627-459bef9cabed55cc593ebeeedbff73b.npy +03001627-5457691268846b073ca87feffb4fd9a0.npy +04379243-72a697466cab7851f51f77a6d7299806.npy +04379243-5245ab687729495b8c728dabc1255d.npy +04379243-70e603b83e06f7258de9f116e0231954.npy +04004475-dfd4fa58919862a071863f1e1f0d28a4.npy +02958343-2bbea02b59ed2bab944bfc22204b55bb.npy +03691459-93b8f4ddd36419998cbc76a30015552a.npy +02958343-8bb2ae81ca9e9a4ed14ae991e75ee782.npy +03001627-a9e72050a2964ba31030665054ebb2a9.npy +03991062-2f06f66740e65248ba6cf6cbb9f4c2bb.npy +03467517-df959f68bb22e402a24eeca91f583600.npy +02691156-41d4250764619ff5bbf3143b1cb6076a.npy +03636649-502e62c502cf2f10280b54299018290b.npy +03624134-172b9a77462dcdeaed90ead9558ee6cb.npy +02992529-8f3dfdb531d1b5dcb4ca066f17bc06cf.npy +02828884-cbe6101e5199ca2d88c88a4c0a3c4a21.npy +03337140-3076d27c5ed34949ce5d6e9371bb5c33.npy +03001627-3669c9b2954c730e492d9da2668ec34c.npy +04379243-2bc602c2b7d9a622ee05b1e9462446d8.npy +03467517-1b91e01820c9f2f0140b4ffd009f9ae1.npy +04530566-efc4de2b174c736dc99bbfcf5650bf52.npy +04330267-afa39ab158e8edc51ee4e0b833e7dfbc.npy +04379243-4afa7cb9a042b7e3c4f66791e25960f.npy +02691156-895939bb0da197f8303d346f4be7d4f.npy +02992529-14726c2482a092d3a9fe1734a6086750.npy +03691459-9d62d13afcca23d841c6e77793c5dc94.npy +02828884-c2c0a205bb318031ed98cca8f0ccd5f7.npy +03797390-b46e89995f4f9cc5161e440f04bd2a2.npy +02933112-48e0fa8a06a163014da5feafe6f1c8fc.npy +04074963-647b7f4f47b3fea54dc062c02826dec.npy +03991062-28859f582ed2c8a0f99b89f8ef639ae3.npy +04379243-2820444f78ca0d82399f8b5570a02c59.npy +03001627-bceab717048f35fea481048c76a35623.npy +04379243-77e03976667383c3d810b14a81e12eca.npy +04379243-dc49259a117af8f1d200faae04ce3f8.npy +03636649-8cf524d8cca9d451fcb8d8c6d4df8143.npy +03325088-e6a64eb10a355f02aa3dee53ca79e7b0.npy +02933112-5906bfad8f6d794f490ad276cd2af3a4.npy +04379243-5ebf57428b18f78a1ee6305032661052.npy +03467517-6c731c424671345c63e6b27c89da971e.npy +03001627-3fabddc7c0fa27f92bdc75f1ee88d8e0.npy +02871439-8815c0f0a0e21be7a09649082c657e65.npy +04379243-2c6beb9625fcb1a43c7fd9917aa4ff1e.npy +02924116-532569f907baac9134ac4f8ff2084698.npy +02828884-1a55e418c61e9dab6f4a86fe50d4c8f0.npy +04379243-1f067718ea071a4ec804f0ac5b784b6b.npy +03636649-2f2d4805ac5eb033e49675db0062ac74.npy +03797390-1c3fccb84f1eeb97a3d0a41d6c77ec7c.npy +02691156-18cd9dc7631ef3064c41882468413db8.npy +02691156-93ba822e84586999e3375a6b96a1d765.npy +04090263-5395c4dac8e66ab6543fc9b228fa4afd.npy +04379243-cce2b5399e5e46a45510d59f3ab1ed64.npy +03991062-f1d505c01e188533b11036f4855ac4b5.npy +04090263-7537fb364b25e32e999562d1784e5908.npy +04379243-79df23303a3192c1cdf1dfd78f33901b.npy +02828884-e28f8467945b5d526070f6b7b2547ecc.npy +03636649-670ad2964ad5a98c9f1a71e46bbde97c.npy +02958343-ec42bd73d57580a85b48f89d50b1db79.npy +02871439-eb7b06f942f4c8fa42e99d71e01c9ff.npy +04530566-53fb6683aac2191fa8a3d44052f8cb25.npy +04379243-bdc7c9339145602af51fa0238791f5dc.npy +02828884-ac4de7e08bc1f024c955e5ed03ef3a2f.npy +03624134-d68ad03780e0e08ee527a71b8fef8ccf.npy +02958343-6b7f573997bc6f8c953536e7c905b301.npy +04256520-7b405c1d6d2dbea9f91663a74ccd2338.npy +03636649-3768d9037d103d9630a24fed263415f3.npy +02828884-e18d11ff6f781d843d2dd82a57bb3bd7.npy +03938244-ea69362db645cb4c1185ac82ed4da80d.npy +04379243-236380670cdbf2c3a4a70f7cc08674ca.npy +04379243-bf17779bec6abccf161bc5243aab8ea4.npy +04468005-e95ce94f475f77d16d99dfe91d90e769.npy +02691156-54885d5beee4e76ab63969f9f8d6f075.npy +03001627-7a79fdfdd72f06e9f8bc1f8036e08e44.npy +04379243-ef130b03885738918f7d9678498f2295.npy +03001627-9910380fedce395e80165d5b901b6e64.npy +02747177-2f00a785c9ac57c07f48cf22f91f1702.npy +03001627-111cb08c8121b8411749672386e0b711.npy +04379243-e05344d8bd3ef63c5b7bf37141f96eae.npy +02691156-36393e03ed11f78461f1ef59130c405d.npy +02828884-ae9c8421189f6590809b609a351bc774.npy +04379243-8c1775d71c36f89d6ca407465d3c74d7.npy +02992529-7a2a5b36831f45501b670e8e7f0f2c3e.npy +03001627-502be527c054ebca6e0ad36e9a10bd13.npy +02691156-7f837b389e885af471b4c018296f73c7.npy +04379243-89aa38d569b025b2dd70fcdaf3665b80.npy +03001627-df2b7e697ab6ca0f155d75bbf62b80.npy +03001627-5ebe4b9a29d5c0274de7ed732f5aeea4.npy +03624134-832cbaf563c649305eec6d8d24f1fde1.npy +02958343-62499fa5041de142707223ebf2d3b38.npy +02958343-ced56d51c144b40373dc6d54075665ea.npy +03001627-980feda55fe02c5868e9405ab8968607.npy +02808440-2d765fd16aedb02b362845c6edb57fc.npy +03001627-cb714c518e3607b8ed4feff97703cf03.npy +03624134-60277f4060b8703e4e18d7136dc2dc80.npy +04379243-322897a771d4591f980d4e1477df0f00.npy +03046257-32a7331dfe2c9a866463df620b7b4cbc.npy +04330267-8bc67008044e0e8f843f813f752a5e35.npy +03691459-abd3b55d14db9b3c8db1a0ee98c45ee7.npy +04401088-acda976ba347a3e58ba35fc6cd3da287.npy +02958343-8922c6c3435f16fee694960c91796f38.npy +02958343-3e7884501c806601b9fbf66e2446b0a9.npy +04256520-9f5b090a3697b05f8f9cd2ac878055af.npy +03991062-69c0cf5ac04d356c6211b44918593b2.npy +04379243-904ad336345205dce76bc197b3a3ffc0.npy +02691156-9513fcab860b113795ff232cd38210b4.npy +03001627-d4b5f8edc72b4676f4175ee3a177350a.npy +02958343-c20ff7778ca2b8ca86ac29addefc0f11.npy +02924116-bb6a09f63ccb939a2d4ead5a1be351b7.npy +03046257-4468cc03f0d13d4286322e4cc6f2fa7b.npy +03001627-b8e4d2f12e740739b6c7647742d948e.npy +03325088-1c5b1091af3106fa2c3adce840300a4c.npy +03001627-fa27c1b8dac76b6d1f285be552b78f9a.npy +04256520-490383705f78d366bf67ac39195100ff.npy +03759954-ed1328cfa8749bb8d80ce3f2fd66be0.npy +03001627-1ef31b046039bf985c8a41baad250b1b.npy +03001627-ef2da724b16ae36654e404e041bdecdd.npy +03001627-3f41b4339ebd59c1c397356311cbeea4.npy +04090263-e88c326a1c2a570fe2bb19fbad3e4596.npy +04379243-e7b99aea5bbb980ad617d95dfd4d6158.npy +02691156-e3b06cf8bea9a6a5c1006ed55bc1a3fc.npy +02924116-7b86fbfc235e124e797ce0caffb8a237.npy +04256520-1746d1c62d9efc742665e2e07399c56f.npy +02958343-2d096d5dc0e0eeb370a43c2d978e502e.npy +04090263-e1f94a758b97b728c2ef4561daf0cd46.npy +03001627-37ed1b9ebaf4b92deca22c501ad0a77a.npy +04256520-2b4de06792ec0eba94141819f1b9662c.npy +03001627-cc6d6035bb5074261f98c0761af40e04.npy +04090263-30a2198addc7de5cedb0c6ac5ecac060.npy +04379243-a017b980b5bc255c19fb4103277a6b93.npy +02691156-6c87f8378066f8f171d03b466c72ce41.npy +03001627-42ceba8e460de1de820898ba01899de3.npy +03211117-3fc7b2412782b8e9964f7ff178873e82.npy +02933112-99ff3359d64f1f45ce5d6e9371bb5c33.npy +04379243-41a4cfee883a91f2d9ec500769fff320.npy +02958343-fe2ce22107693354f1cc1cb691702a23.npy +02691156-4a559ef6547b685d8aed56c1a220a07d.npy +04099429-668aa148b7147080227275b7e0831bad.npy +04379243-65f126afcc43ba69a4d89a7050f2b7cf.npy +03001627-b7a1ec97b8f85127493a4a2a112261d3.npy +03001627-54fc8ae4211e121a55450780441af433.npy +04379243-1c9048855223f744fb85ea6fd426098.npy +03046257-e8cbb09dcdce16f172b9579598bda76b.npy +04379243-38888628843f7b38f8b8d4a282992be4.npy +03211117-74cb25b4b8b2b89df9f3c6290096f50f.npy +04379243-5354ecb0e3aa1da074a16879fb3ac81f.npy +04379243-ef1e4af0d76ead1afff16555386d173d.npy +02691156-cb7c32bd7266daef37f38dedb2f1219.npy +04379243-e263fafc76ddb82b4cc80585c0d3d970.npy +03691459-101354f9d8dede686f7b08d9de913afe.npy +02933112-65f11f7cb5c5106eac00fd1150223027.npy +02924116-2142f1b622cc1b07e99562689078395.npy +02801938-cc79f97e37dd431ecbde89e0c48a01bf.npy +03211117-51b92bb1df3b1a10ad1d87becf13ddd9.npy +04090263-421da608bba18bf2688fc2fc0a14edd5.npy +03991062-b33edd2dae68b9c8cb2a965e75be701c.npy +04090263-338998b6f6f541c712b38b1d99376c0b.npy +03001627-123305d8ccc0dc6346918a1d9c256af3.npy +03001627-9c3e53d9d1e653c0bf80985a99195eb8.npy +04379243-d5b21d6154c0795813dd6eafe1477be1.npy +02933112-31a7cd3b7990834cde650492e45fb14f.npy +04090263-9278d3daffecc60a8e75bb5638d14ce9.npy +02958343-8648667e03bde366b17445a1c29f6d34.npy +04530566-1a2f00c6886f14354d85fb76de815344.npy +02691156-75d162523d703917b87697d3904b168b.npy +02958343-ef6b9ea0fbba6af828ea89475d3a158d.npy +04090263-a5f8af7423a45b293568a24dac4b6dc2.npy +02808440-3bbffbe6bf88c8cb362845c6edb57fc.npy +03001627-c12dc91e3564d8e3473f10e6caaeca56.npy +02828884-575595ab81e657315b3aba3f0877c74f.npy +02958343-a50a46d3423e7dcad1eb2a2149d13665.npy +03691459-aa8f197979376d792d563c85edb49108.npy +02992529-80243e34f66a503bea95e61f66327e28.npy +04379243-2c0ade2de5ed1ad66df14337f24e49f4.npy +03991062-d2fefb9c0ee02c2ca2c59a4d90e63212.npy +02691156-9912b47f0efc512b8d548f89c1029ea3.npy +02933112-956c437be87a2be5f51f77a6d7299806.npy +03001627-f2f0f205af792d3d40332412c5d013fb.npy +02691156-83cb2b58d88c0ae3f4fc64fb3aaf41d7.npy +03467517-5beb3384470cfb3e18edda4db8cbb5a0.npy +04379243-99720647e210078beaf288f952624966.npy +02958343-145e18e4ec54ed5792abb3e9ac4cd40c.npy +02691156-adaadca2be822544d81b6465d8dc20b5.npy +02958343-903b043072a209ba8290d32865eb3245.npy +04256520-72045d74edb0547581a172d69c52a28a.npy +03001627-939383f36692508afebad4f49b26ec52.npy +03211117-b3a975cb984a8fc6cc98452c8fce6b43.npy +04256520-8d0472ffc368a8e431b5f9e34ff03906.npy +03790512-3ef6b2e0a896e4ce54d08b5b71c0b603.npy +04379243-90f7b8cd8e41321c53315facdf531a34.npy +02691156-37f2f187a1582704a29fef5d2b2f3d7.npy +04379243-d1e231e9fc0e9127ea6202eee73b76a8.npy +02691156-2c16ac865f06542381598514fe928082.npy +03001627-28bbb851dd01a162a5615d35d4766b93.npy +04090263-2ad7a0bc552f1df96b2c8bb96250e4a0.npy +02828884-3bbca1223d18e2caad5067eac75a07f7.npy +02691156-a1a58070ca1749d76abbb3e202b76402.npy +04379243-673dc4bc9271880fa320e34dad7c78bd.npy +02871439-b587e9d84ce2158e1933ffef19678834.npy +02828884-b83b544f8536375ed00e4d1c6a5a3a74.npy +04379243-dad3122c094cf582ab82b08bd2b110cf.npy +04401088-5cc54b5db73e9e1e6decf1414eac2924.npy +03211117-b8386207364e622d5e7087f2d9a278a9.npy +04401088-69e45e401c1d05b767d8789d3a6519d0.npy +03261776-91a17b47f79aca8b2ed3579bacedc134.npy +02747177-9ee464a3fb9d3e8e57cd6640bbeb736d.npy +02958343-9f2721257bcbfc70dc1fa1f50eb490cc.npy +04090263-d91c45e8d51b2ffb12b38b1d99376c0b.npy +03001627-91cd85647eef236490e75b1cd0f0169.npy +03691459-ab70b452a7ba1c445f46e754938b29e8.npy +02691156-e2612c366bd11e305e9e2656aff7dd5b.npy +03636649-914a876b24bea577e97426e55fb77981.npy +02691156-a69edb40dbc1fc6c66cf1b4a8fc3914e.npy +02958343-5dcbc04a1ce783eb73f41773bda9db5c.npy +04090263-94d526e75ba18f3326243ac6fb5d9ad9.npy +02958343-4b841ea5b31090fe2bc9f17412005422.npy +03001627-892381333dc86d0196a8a62cbb17df9.npy +03624134-bee1a473472639e25ca3862a7efa6401.npy +04379243-a9cc8112fb8c4ed5dfd21203bf8b4b46.npy +02924116-377b4d3e6b5c47e9f5d789e33b735c9e.npy +02828884-704e4229c7f8a0771015feecec1fadc0.npy +04530566-42d4dfd73f7e27677e72e199dc6b40e.npy +04379243-34da9450728ca9fee0be4360cd00cfc.npy +03001627-94645127bd4168e03e63b721c3743983.npy +03001627-6352d748b1843287921ea62370e5ffe0.npy +03991062-4635eae69badb028d26da3063fcdd79.npy +04090263-5128892dbc0e8e4d12a8e5e6e6618c8e.npy +03001627-c2a7da6a1e1f896a301e9490bfb35bc0.npy +02691156-4ea714b785e24f0d9a6e43b878d5b335.npy +03001627-3289bcc9bf8f5dab48d8ff57878739ca.npy +03325088-8b96750136eac3c5c36fb70296e45483.npy +04090263-bcc0a71596e9df4a6314c3b6a3a65519.npy +03636649-fb76c5cd78d3c9deea3655638ad668b9.npy +03636649-7fa0f8d0da975ea0f323a65d99f15033.npy +04090263-409306cbe659e516bfd79d2627fd465c.npy +03337140-dc8eabfea086d0a7d6d49cce41472b6e.npy +04379243-888faedfa6002b8cdd7e7281b421bca5.npy +02818832-3fc3087faa29bce5b1b6b0c5ddacb607.npy +02924116-2d137b4ea44c3abbb1626da45836ca54.npy +03593526-d73ff526d74baad2ce891e9ba482e12b.npy +04379243-dacde6546ca2e07f66dc6ea1ac82d91f.npy +03001627-d6ac690c293a492d2d2a5d4c4022b4c6.npy +03636649-185e37856f55b2c4e9aa07397ea1cf8d.npy +02691156-ff13be97bdfa45f8254dc1d04198881.npy +04468005-3496b32efd7d03a74da9f355ed79f620.npy +04379243-c87729314f0a7e2fe67d6af004465e0b.npy +02828884-e68f6dfeb7ceea7084663e651cb1f07e.npy +02691156-e93a2143cbec37a173fac4529123dfb2.npy +04379243-e2a2fe3713803e9e04e2b29e7a72f7.npy +03211117-98b12e9101b3d93c972a63e345b45a25.npy +03325088-e173499d5c1b9aaf72101dcac4ed75d3.npy +03337140-f1bb8fefea5543554c3aee8e9d3a6ffa.npy +04530566-7a5de2857213a2547ea0f302610f14a5.npy +02924116-e79d84edb9ce21af550f48125b5f584e.npy +04379243-4e03170994b4347e6f1e07a56c129dfc.npy +03691459-a4a51863fe887cd970165cb455c090fb.npy +02843684-b68f37561d77468da6ffec31b6fb775.npy +02691156-c12d132ade345228d75cdfed9b20c6e7.npy +03001627-648fc7caefda981543d890f2dbb65163.npy +04379243-7ff6c7f050eecd378c9b2896f4602557.npy +03001627-udf068a6b-e65b-430b-bc17-611b062e2e34.npy +02958343-c18c78cf54b60f078e62780ddf14e62c.npy +03001627-8ce6f67b8683c0126db434563c7f5ea3.npy +03211117-ac30fac9534c509f2de252a52ebb4cfe.npy +04530566-86e404c548d965c6d28357d0413f2f80.npy +04379243-ec379ae9e5d850459f2349486c570dd4.npy +02958343-a532b61524432d454ed192f2298faac.npy +02828884-23378697712a8dc2d2b12aa6a0f050b3.npy +04530566-72eb488206297aeaa60ce6f0a0028c13.npy +02871439-f7b93826de3020f3a5f3ebd90cb33bd6.npy +04379243-a542ba8480b71843cea3bc3a9009695.npy +03636649-f0131187d57b6390fcb8d8c6d4df8143.npy +03001627-aa80259311e2a8c0d8bd0a659ff7eef6.npy +04379243-de46aee11f397e1c5af597c14b093f6.npy +03642806-950d3ea26d07b7dafdc319d8ace3a11.npy +02828884-1147218db46702242056b4bd5d870b47.npy +03691459-8e632ba25f8af84b9069c2d361390698.npy +03001627-b7184dd450c5fc2e17c1e3c52889f7b.npy +04090263-640bfdaa8cf5e3cd325474a1336ea459.npy +02828884-34577ccdcbd46908ed98cca8f0ccd5f7.npy +04379243-2b06a917abc1150b554ad4a156f6b68.npy +03211117-7e53c694e5a223346989969642549931.npy +03211117-d330d50a0255529d19ed6e1a590c9122.npy +02828884-5117dd16339a8b943ebaaaea70571daf.npy +03636649-f8d4e335655da8855e1d47baa7986b2b.npy +04530566-d7755acf25baf326e625a0837cc45a0f.npy +03001627-fd4cce51df6571ecd204c1ad14be926b.npy +03001627-b16ae1856433e726786e4057cea53718.npy +02933112-9fe8af4bc8683818579c9a60a6b30a2a.npy +03207941-5596ba626d613f2bfede59875ed98083.npy +04256520-14c77d23044bdfd5327289c00b6dc9ca.npy +03001627-9d9d69e5f2bc80a867903707764646db.npy +03001627-668857eb0c18b0785dc3653f8341633a.npy +02958343-19245fb8ee79038fcd059a326bfe20ef.npy +03001627-46f6a6e0f239282fc8687ff9b0b4e4ac.npy +03691459-77433c14eb1043a91e5b68ee10358ea3.npy +04530566-e28a79fa4880c3c5b0df8f7e348f816a.npy +02958343-cfb4626f879c8355b4d8ed7f5558a6a6.npy +04256520-120735afde493c277ff6ace05b36a5.npy +04256520-ffc0bf43dccf71865257cc5c33f9e8a3.npy +03325088-8fd048fe9a092189979c556124bee033.npy +02691156-8f39cc306f68c89c8139630c61d12904.npy +03046257-7b99bf2508d8c5f36d684a4a25bbc7fd.npy +03337140-90d57e3d7ad999254c3aee8e9d3a6ffa.npy +04090263-79f507c3befe69ba2987a7b722c00b7d.npy +04256520-3c56ceef171fa142126c0b0ea3ea0a2c.npy +02828884-9c9fc31bba4881794620a50068fc504d.npy +02958343-7e63db420468e1b1bda733a39f84326d.npy +02933112-ba6c211ed08d5c1b292e33b9f44edab7.npy +04530566-d4882179bb3a1868abc6b16fdb345d24.npy +02958343-a295d3ca78e2fa9a6a2345809e2bb169.npy +04379243-5d1333eea1b2a9bf85857023d32c345a.npy +03001627-9a6cf471cd7e26566acb4ace974ce36c.npy +03211117-3f4a2b59d82e0f353e72acd01188238a.npy +04460130-9ac90e8814cfe72dca7b89674ac5c6e2.npy +03467517-6a2ffe917b2171497b1bccfe0b4bbe47.npy +03790512-3de5068dfcbc766d3b44aa8d94a815c0.npy +04379243-587f53986db55d45738e43095496b061.npy +04090263-5835ff29188f0f493bbe4035b770f62b.npy +03046257-96573e0386f36abac5daf15558a4e938.npy +02691156-9f25e4e0aa598c7fabda204c62559ac3.npy +02691156-5335e5be2619bbed8141b488a44e65e2.npy +03636649-3a5a0f4c78e17b284f0c4075db76b7c.npy +04379243-a375aa82c58fdeb67cf50d57d36c5a02.npy +03001627-8e1d232ce609392ebd8eb8ad250e5135.npy +04401088-3ed359e502a24e5a79510444cc61f839.npy +04379243-6e45d510dca43cf6490ad276cd2af3a4.npy +02691156-7315cd530e4858246ed10e8f7fe336e.npy +03001627-43d40b726c369eaaed98cca8f0ccd5f7.npy +02958343-269676546548fba38e271c56304de147.npy +03001627-d6edce467efdc48eba18ade30e563d37.npy +04379243-1844a4ed0ff7ed38c2474c54a2e772f2.npy +04379243-72a7c2a8221afcd27e6cebe5e9a662c6.npy +03001627-455829a425b5f919fc93c3b1c0fca400.npy +03001627-e93714e5553f63619215045784774049.npy +02691156-83778fc8ddde4a937d5bc8e1d7e1af86.npy +02828884-381317c1e4c91e87855931d119219022.npy +03467517-d546e034a6c659a425cd348738a8052a.npy +03948459-ac39344e18972fc385eeb0104312297d.npy +04090263-fd00cdc539fded38ddd7320ddee77bde.npy +03001627-74a8078a8e89872780360680c1602c7d.npy +03928116-e8e4c13587e7a5ea6c0a067418a01c18.npy +03691459-4902b88bb0834522ea9b57bdefcbc9bf.npy +02818832-e07dffd4c5607a6672b7738d7a601564.npy +04090263-f499b088e48914256f260fa9465b564b.npy +03691459-a8f3e98220f34623b3d8c1107f6ae528.npy +03001627-1d8d16c0750f22f5ece93f2bb0b6d036.npy +04379243-d5d8632e5a2a286bea46bea76c64cc3d.npy +02958343-2dbfe9c041fc6b3a94ce9d7b04676231.npy +03001627-6b6507085db5a631f3c9c1464e55d580.npy +04379243-2df1f411c26e7d93ad64f84f9d54ddae.npy +02958343-7e12d83df581424ee61b9ff60b1be412.npy +02958343-676ea229aaf8f90858c27e607f6e2d4c.npy +04379243-c07c9ca0cfbb531359c956f09c934d51.npy +02691156-f97fa7329969bcd0ebf1d9fd44798b9b.npy +04379243-23dffe55684018589030b5e29a228aff.npy +03001627-6079b4aa115d08c28998b3b64a143d42.npy +04530566-77a02f09cd22e9f879863338881ed398.npy +03001627-d51112040176efccd5cb6d178687b980.npy +02808440-9c2761796fe65c9b3af30a3946d92feb.npy +04379243-7f7bc0b7e275d1079477196152a8f4a2.npy +04379243-641affca2294fe1879368d1198f406e7.npy +03691459-84d2d9ad08b4c39029cd33b1c7847c1d.npy +04379243-9bac9418d56234bcbc5996932c1238cd.npy +03001627-93bb03379efddea148bc9dfced4f8d35.npy +02924116-2ba84dc6a7d2070b973f659238edf3c3.npy +02933112-c55a7e2cb3ab9aea8ca4aeb5e3b33af7.npy +02876657-f62bfe9756ae99be9921431405933fd2.npy +03636649-d06ab2779bb0b73b822a33e080d0e71c.npy +02958343-af60bafcdba34eab56de8db8652eec4e.npy +02924116-d4af2f443f0ac8b4635756f2543f41d7.npy +02958343-b4250be25fbd19a994abc9429888948c.npy +02958343-adda68ed2da5cee0a413908c0e169330.npy +03001627-ffdc46ab1cfe759ce6fe3612af521500.npy +02933112-aab180818ea51dbc7cd8de3984cc1e94.npy +04090263-4f98bd25bb9e03ef7ec95138ef83ef2f.npy +03691459-9d62c46fc3fd343d1f9f3ce366e030fb.npy +04004475-11ff4341475b3731c39a00da16746b95.npy +04379243-e026b4997f7d037c39d3717288022c20.npy +04530566-eca25540e280ac1c2d1e53cffa2132f6.npy +03691459-64aed24bbb7542c6afac285245c66df0.npy +02958343-300f9c418d6ec9f6473f10e6caaeca56.npy +04379243-88e06a85e2a0f99fa7e7cb173e141227.npy +04256520-deb7ac5670e9bb27af8808fbf39db46b.npy +02808440-a91650269d8efbb454d7082b34825ef0.npy +02801938-9c7cdfa8de249b6c924bf081da6f024c.npy +02933112-aa3e41a51b1aa79a4da5feafe6f1c8fc.npy +02747177-e6ea9e633efbe1e281faebbdea6bd9be.npy +02828884-192684f9de3adfe827ee88e8274f281e.npy +04379243-ce3c408a60cc0e19e6c5cd45aa112726.npy +03467517-8ba739111f5e7c50373ab6cb5c0c1bf6.npy +03001627-3ea3cfa145794baec2454d017a7fc2b1.npy +04379243-a38f012987a2b29593df8c78d1d8e26d.npy +04225987-f5643778dbcd653655a834a7aafb0236.npy +03337140-8b0411805e3dfc164c3aee8e9d3a6ffa.npy +04460130-edf288c16aa9797a4d423544e7c5cb27.npy +02691156-1f47381312c9bebc9bff604afc480b65.npy +03991062-73475ea71ad4af98dff284ee8fea7cef.npy +03001627-465cb28961d2680bbda72093f9b5aa73.npy +03001627-26e8033e59a3adf6bb53a6a5f5051240.npy +03001627-5027bd5ab457e99068821642e9a54505.npy +04379243-20e65777d2ce327035ae67400a94a6fe.npy +04379243-3c46109dc46f1714cb2a965e75be701c.npy +03991062-fe7289fd89f504aaf91cf8caaf3da124.npy +02933112-dd2325abe32870f5a99e0f0bf1de3bbf.npy +02808440-526f26b56fbee9221291d1279f7bf122.npy +04530566-1fb578de4aebcd62b249fd16295bbfb.npy +03636649-da12a5d96b465cf6bced73c51e99f8b2.npy +02828884-16e3d7f2b75cd67dd2b12aa6a0f050b3.npy +04090263-e3d49735508753b6ac6a323abb28e29c.npy +02691156-e0e0d713c8969b52ca8607f540cc62ba.npy +03691459-92b24dc36603b59685a979ae0f537b4e.npy +02691156-26a29227d6326e20e63e266a803d9270.npy +02876657-714320da4aafcb4a47be2353d2b2403b.npy +02933112-695002fbea3c5e4a9a6b496c6e9f4c2.npy +03593526-311f29deecdde671295ffb61d1cd3a33.npy +03948459-897e6a6307da50906314c3b6a3a65519.npy +02942699-1298634053ad50d36d07c55cf995503e.npy +03211117-74e3d29a7e0d5bc48ce0f31e09d08e16.npy +03467517-511fc5ccf4f1c857a24eeca91f583600.npy +02691156-2c49289098e4492bca8607f540cc62ba.npy +02691156-9d292c07f1dff16e1304733e0af0907.npy +04090263-bb95e848c9e1940a2b299c40b68f70c.npy +03001627-235c8ef29ef5fc5bafd49046c1129780.npy +03636649-a2ff853cea4e3ff5bddb797cbb74c.npy +04256520-c6329e1d12285ed761fdb06bea79b81.npy +03001627-5fb53dd1dc9453e77eaeab1f0c9120b7.npy +04379243-2a7130734389335c5c5a7639ceca3973.npy +02958343-d5c046451e5bd6826a9c18480b4632cb.npy +02808440-e7d3cba805b57f5fd011a170fc36c24.npy +04379243-5e4a74e0bfb5bd2835836c728d324152.npy +03790512-9324341a957733ff52ee90e577613070.npy +04379243-230047ad76c117412cba66dc6aeabcd4.npy +04379243-8a385fd026d4efdc517376ab44a447e5.npy +04530566-a6af4bc3629fc5101998595492ff7acf.npy +02691156-7bd76c17b7194d571aa9d8d95b6740cc.npy +02946921-52e295024593705fb00c487926b62c9.npy +02992529-60df2f27d33f3f472eb2c67660ce4f3.npy +02958343-bd3130013af1d709be95cf6cfd2d0f0e.npy +04379243-e0ab42e831e007cf9be2020f4ae1ea66.npy +02933112-7cb09d16e07e1d757e1dc03b595bd36c.npy +04379243-e0229fb0e8d85e1fbfd790572919a77f.npy +03261776-943048e64cc2bc980a070963925e308.npy +03046257-2f638d0d4d5cccc35b903ba10d2ec446.npy +02958343-ef15b938dcfa9893c4d922e8a1141322.npy +04379243-3c686ac317c496f9a71c812e027f94d9.npy +02992529-59e5dc88174971c567964ba700cd97f5.npy +03642806-4e8737495201fa3f71f82dc8af2fe0e0.npy +03797390-f23a544c04e2f5ccb50d0c6a0c254040.npy +03001627-362f53ee8de161fac653c0205ce8ff57.npy +03211117-7fbb5bb76b0058be972398ea2df8e7c2.npy +03325088-49532a66e2ae68c6ec846e583adcece4.npy +03325088-78763ba6006732c754d7082b34825ef0.npy +03001627-9619f0c887f8d879d79b19c7c4f0e293.npy +02871439-f51959078d93caed379cb0fe259da0dd.npy +04379243-23e1e8b7ea54079cd5217e3e48d1c0d9.npy +03636649-18145f4b303c37f11c3739edd52fa3.npy +04379243-8965a7a0234bfcbf82f29b648e624c33.npy +03337140-30224544f65279f24c3aee8e9d3a6ffa.npy +04090263-47a40af2fde212a7b70797b2c89f136a.npy +04090263-d03318b031d2105b5bd5996a1713323f.npy +04256520-2c7d2bb93b49197cded06cbcf08b2fff.npy +04256520-63338a227246399141fba545b7232cfd.npy +02958343-3a735f1a5fe8906cab0fd77f2e9aa584.npy +02691156-ea58a51483e3604897dec65c2238cb8a.npy +02691156-c398f78fb73ccf29751c7a6f15617f4.npy +04379243-2d1400cf45b94df051a0bc243f04669e.npy +04530566-d8d49c7e002656aab572a59093f8c0bc.npy +02958343-7b01d9b011361e82a7fd25564c2e888e.npy +03642806-1d20a8518db7e689f0b97bc9b1844ffd.npy +03001627-4623efb456cc6070820018801b237b3d.npy +03691459-4f0173cf9b1472c37d4f87d95d70ab8.npy +03001627-447856e1071e8b83c036a40816608369.npy +04530566-d66b7128600af54e7afee304cce81d6f.npy +04379243-24dfa4c63b11373f5bb375b194991e4.npy +04379243-9ce692996699529b8430b7446f9e1252.npy +04530566-1c6c51d2d315d576852d4401c7cd1fee.npy +03211117-26c4051b7dfbccf4afaac116abdd44e.npy +04379243-915855afcc5f8918ab27cc93fdc68c94.npy +02828884-a5669fc418b91f9959cbde03ded257fd.npy +04090263-52486aec2292ddd48f0d3a3dadaf3299.npy +02933112-131072b0a226f05f51f77a6d7299806.npy +03636649-dd22b87797f960f47b0f9bd97c2f1a90.npy +02818832-71ebb1db4d8ef7c51db05bb2d8c217b.npy +03790512-24e12e9dfab0892e468bac13e007a6e9.npy +02946921-408028e3bdd8d05b2d6c8e51365a5a87.npy +04401088-e691c8f0fd7d64d7ab0b172d4dea80cd.npy +02933112-1ae6d530ee86ee9a4d87481e09b681b3.npy +03001627-47da08d9c7cd7e104b3c42e318f3affc.npy +04401088-2dccc7cfff6f9a28aca331f9e5d9fa9.npy +03211117-37a5faaf0eb38031e0e89fd83955713c.npy +03211117-2809c09ef575f34214618fe9321a9ffc.npy +03593526-c444d4f782c68dc9140cbb818dee6c.npy +03001627-7521f2a08fae96a7666933f2248e8d9.npy +02828884-aa27d1ed2ebb8ebdd2b12aa6a0f050b3.npy +02924116-fee9872b2821b79f366228b8d159e36.npy +04330267-1d032da39f25772fc99ba9ee5d4194d.npy +02808440-6a6fed877d517549b12da0b74652c93d.npy +04256520-470dd418057f9946a30f938496151204.npy +03211117-d854bf9f589e5a6e69a98c3ec2f88e7d.npy +03593526-1a953dddff37998ef0a5dc57c9d2438f.npy +02880940-53f5240e1e82c96e2d20e9f11baa5f8f.npy +04379243-f4b820ba5a347d939e0a5cd76ae8e45a.npy +03325088-e422f89f233787d7b362845c6edb57fc.npy +03325088-e2fa7af63f902bebb7a867e9b35a1295.npy +02958343-783577d449be4ded3121f82ae456ac81.npy +02958343-35d1938e4ab14fa79ea5c205086e2a63.npy +02958343-9fb89a485c814f7e18f8769175b6766b.npy +03001627-8f2e3c9cb5f25021492d9da2668ec34c.npy +02691156-a0d3a490ee1b74762a4947824596dce3.npy +02828884-b8eb131fb74aa39af7436fe692c24f3e.npy +04090263-7fa43df6d88d2391e103b85ae3ac182e.npy +04090263-6f14f17167243fac5427e47767269c4b.npy +03467517-30a1f256b5b691f09540ada8114b63aa.npy +04379243-a3474b03dad787de8c5fe7d2e262dff3.npy +04256520-66c8df461f312684d329896bbf26eda9.npy +02876657-13d991326c6e8b14fce33f1a52ee07f2.npy +04379243-79ae3e5787e0a07542ff37a1b760099b.npy +02828884-599dd0b655adc794ae143c6e852a4f2d.npy +03001627-938c0560f25a6a9cb76982957f05710f.npy +03691459-123f9066606d80206454c2aa07613033.npy +04379243-97bda10740c4a74036b0f2a1430e993a.npy +03624134-e5bc92012784d89592cea77f96988ae6.npy +04379243-b088212c18a00fa0c3bd24f986301745.npy +04256520-53f4088679746f1193f685578b3d085d.npy +04379243-cb631d4a3bdfb02d2c58f3c20d9d1840.npy +04379243-c46bea30afbbf07fc1997d3da2532033.npy +03001627-7e190338d3f213c3f7b1230869d2b89c.npy +02958343-f84ba2039d0a4ec5afe717997470b28d.npy +03948459-51c3ad915c53f9bde3f7f7749a803060.npy +03691459-813bb87d0679eeb9e4f8604d0992a17a.npy +04379243-dee160f20e1195a4b2cf6e4d01862bc5.npy +04379243-6f3e12831cfefc20a1d8e55816ec2b5a.npy +04256520-b651ea269f4aa92731780fdd33037c9d.npy +02828884-4bd994f25cd3e1fd2b12aa6a0f050b3.npy +03593526-d3978e26d3e0d773b3ffb0c309689ebd.npy +02992529-5c141e299b50f1139f24fa4acce33c04.npy +03636649-230efad5abd6b56bfcb8d8c6d4df8143.npy +02958343-c4d49c0625be70c417da7541f1b2fa76.npy +04379243-72fef5cb33aae9cf94d7e6d8577c8ff.npy +02876657-4a1fe3495565001d211b8bef58aae14f.npy +04379243-7b5c5d7e3b9d89b577cf3bb06f394ad.npy +03593526-9aff149b3b73200fb4b94732d6aa086d.npy +04256520-ebb29b67c390a28ae7c7920f6a65a54d.npy +02876657-412d5f41b5fda0b271dbcf1c4061c69b.npy +04530566-47133569866031669268271e4d570275.npy +03001627-cbc5e6fce716e48ea28e529ba1f4836e.npy +04379243-64e260594e3c3dceabe659e45c4a5b67.npy +02876657-1df41477bce9915e362078f6fc3b29f5.npy +04530566-b7d6c9e38884b121cf439004777f8b49.npy +02691156-96409ee8309b4c679c72d95bbb12b7e8.npy +03467517-ec1149cc44edf89a6909632a947fc19b.npy +02808440-e592e2536000ee2644221bef0fa3c36b.npy +03001627-c8aca0182d3e48add93768e7b9b1eabf.npy +02691156-d984822941e7a768c231d70e1e0cc567.npy +03211117-93b69d3caf90a837e441f5bb6f88ca61.npy +03337140-4eac890c8ae0edef735c6678fe50843.npy +04090263-8d0947db43c20e819ad96e0af6b934eb.npy +03001627-ca032d3b6dcbe1cea3056fa1e8da3997.npy +04379243-8b8152865839a79719fb4103277a6b93.npy +02828884-65e7b3316245780bb5512a11bb8b2bf4.npy +02808440-859f263919c702bbba4fe5622b726d13.npy +03001627-a770cb6ad4a97df84abd45348d17aaf8.npy +03325088-46b445c31887a70eb362845c6edb57fc.npy +03001627-81c481c1a0477555f0a61fe93fafdeec.npy +04379243-783af15c06117bb29dd45a4e759f1d9c.npy +03001627-20cbe565f98b4dab40ef1c8b63a628f9.npy +03046257-1c1899bd9fa34ba7275d003e423c59ba.npy +04379243-1bab21890e560d54d5cb6d178687b980.npy +04468005-9ce7b859b306c3224b0b2e6e63122009.npy +03636649-62f4efec7059e531ba5342d638d0c267.npy +02933112-2d2ce6dc51aa6c7a9856fa70a578baeb.npy +04256520-8737aff6eced02df3598efd14e493d5.npy +02747177-b74e2ac0928725ba6f1c1d4ef8eeb77b.npy +02933112-154f41bbdd20cd9d8430b7446f9e1252.npy +03938244-59657437cc799e51616f4ad120b6332a.npy +04379243-7a8399fc51d83969a8b1d0fdee586dc9.npy +03337140-dab5be91b21f031e995c80c53f5c4c0a.npy +04379243-ec316148b4cdd446b6068c62e84866a1.npy +04090263-d68f31ea513d3a5d6a816b111e5f1b47.npy +04256520-34df668babda666f7b0a2c22acd10794.npy +02958343-2a5df4956f694efe829e2483ba27ce0a.npy +03001627-30cc0df021a947e9706ce6d0dff37e85.npy +04379243-edf1d95e72479c4bbe13ce34aa7c0c1c.npy +02691156-697b4a3b6a380443c503a3776fc280fe.npy +03790512-52e096f02d12b3bfa70f3e863a68c2c2.npy +04379243-a82387cf9d9d253aa06f94abffad1304.npy +03991062-50f0a34edfa5a3b4db41ec1fc554dca9.npy +03991062-c0ed2720d248d4e125ebd1cd0b422e32.npy +03691459-c32bfe130412d9c6d9b106ceb230ede0.npy +03001627-2d80c89d4284b4db21f01d01c8c9dec6.npy +03991062-b89de6e29a5a1d6425ebd1cd0b422e32.npy +04379243-81a5a42f161688ef36d8dd30a594b2af.npy +03790512-9e9300a6e1caec217395d58407f193ba.npy +02691156-41fadd55b341e54ab87697d3904b168b.npy +02933112-d3ff3bd1badb62c2c59350d819542ec7.npy +03261776-2a6cbc4fe096263b6dd0f46427834ba3.npy +02691156-a692309cd39291106055329cd9432d36.npy +02871439-f595c01f296c220935c9a487bf9f4664.npy +03325088-5184b95d850acc92f84537dcf9baed45.npy +03001627-13e29ccc0722f4f958df8eeaf3dad1c.npy +03001627-3569709b421075c730bbd4cddd04c77b.npy +03624134-99c7feed0581cd1fb88eabc621107e4c.npy +04530566-f12f615701b9fd31a9e77d2a83027228.npy +04256520-9507b4091c4d02a37e1b1f098db17ba1.npy +02828884-990c56d6ab64279c2056b4bd5d870b47.npy +04090263-2b1fdf919d42a55828b12a43019163ae.npy +03636649-3977cc8807304dfc5adb3ef1dbe9e3b3.npy +03211117-d7b87d0083bf5568fd28950562697757.npy +03001627-37754da896362bcf28c0cecb7de2397a.npy +02808440-a0020274eb81d539ccd0340812259a39.npy +02933112-9c8dff9a5f5cc6ab490ad276cd2af3a4.npy +02958343-fed8994632223d52afe1d4530f4c6e24.npy +03636649-bc800138650bc4a6c7c8ce3bef5c2aa9.npy +04330267-38cc2f381576c90e36f5739020329c46.npy +03636649-ec344c1076b5c890b02103b4dd1798f5.npy +04379243-657bc03a22b4ee207638fc7b029fa96.npy +04379243-271db646af45e4e48312cb7420a2ad11.npy +04379243-5317439efc03a22de27790b0ec8671f7.npy +02818832-2d1a2be896054548997e2c877588ae24.npy +03624134-f316283f7b179d69faf4eb5f62ee440.npy +02691156-ed0a9a32a8e35f21ca8607f540cc62ba.npy +03636649-67b0ef08720310aa14f846b7e32e76c4.npy +03001627-6cf4bcb8a694242473ae2443c97a1733.npy +02992529-767205e25c8755fd89d59b774c6bc1b3.npy +03710193-757c1d231149dec8f1ad51d1ecbb963a.npy +03636649-dc04781fbec1e188b1baefce5cfff2fa.npy +04379243-3ac426922252c21a855931d119219022.npy +04379243-f1f3021c1469c8e5610c2a68437007d6.npy +02958343-aa9f41bc3925ffc4be9358e8c18dc481.npy +02958343-804c21bdd416783176ad064d1c5fdd7c.npy +03991062-2c262de36d12bc82411e92cfbad3bd2c.npy +02933112-2375dfeeab7fd8678430b7446f9e1252.npy +02992529-84cff93cb8ed08e55acbb5d30672759.npy +03001627-7910a6262ad8fc113fa02fd212ba0e5f.npy +02808440-2f90ff6319c74691c7cd249d921dad67.npy +04090263-93112d8e6d0710e774816c28a6351828.npy +03790512-73fd19410ce60b83d5dde04c96fd8146.npy +04256520-694c7bf2ad1b133b1ce14d4c70990479.npy +03325088-4162e08b1662a6cb3321831d2245cf06.npy +03691459-a23a775c5bfec73d8275986ae1324d10.npy +04090263-e4ddaed36daa1742fa9ff575e691c052.npy +04530566-2b17c0705ee0426e53b2b4f48361e0b2.npy +03325088-d75e4ebefbed7f50317551e5a477d434.npy +03624134-6813197ad5e7011fcc34b900bb2492e.npy +03691459-984d064e7e0310f54cb67f35c09e50ad.npy +04090263-468ac0df7f343a67addf8a484a63f540.npy +02958343-c8849755b29ad49b9af07fbc15eb8427.npy +04379243-7c1bcea89b0037a2d67bd369ec608dad.npy +02880940-4eefe941048189bdb8046e84ebdc62d2.npy +02958343-f9cad36ae25540a0bb20fd1bc4860856.npy +03337140-b078888d60179693c4f66791e25960f.npy +04530566-4e45c5a16f45c3bad9356bb4e82527e5.npy +04401088-87aeb552057c3d1a65a7971ba2230c53.npy +02880940-e072da5c1e38c11a7548281e465c9303.npy +03636649-be13324c84d2a9d72b151d8b52c53b90.npy +02924116-52f337f3047112b42534f02c8e8b5ac.npy +03642806-32ab7469a9c4bb584ae6254ab33d9f52.npy +03761084-f9e75a7b5abe9f3fdec134b6ed53c0d8.npy +04379243-50e69dfb7802b094cfedb1d8b135cde9.npy +03001627-ccfc857f35c138ede785b88cc9024b2a.npy +03636649-d7465ce6bfe4b898c98f75a9ff83e3b7.npy +04090263-84de9995b0a416b5fb5c1b0f759e2bc1.npy +02828884-303c1519c700d19299e8bf807e902261.npy +04256520-4f2ab57322d7a7e3df63d1c7e43c783f.npy +02958343-df8000281bcfdf0754f3692df239bb9b.npy +02691156-5a37bc42a52130a18f52dc705c3109b9.npy +03636649-e389b9eed612e5c225a454369d791fb0.npy +02691156-b9ee9a1ed9296e8c598bfdaf1b614b1.npy +02958343-7ccdf7bc2af0b068e43ab89cb5563740.npy +04530566-aac813074775281a4163d08524f89006.npy +04379243-4572e2658d6e6cfe531eb43ec132817f.npy +03001627-8908ecf5c86377ba7b31e6c3fa42a7e.npy +03001627-c78a6f04268dd802cf004563556ddb36.npy +04256520-e76457b55a3c041cfe49db72b6ffb2c9.npy +02958343-95d36965fc6d1f7de2d4c157e5bf1dde.npy +02924116-4dba3b31aa7de657e550942ea36e5443.npy +04379243-627248fa64c1db5fab610b0c94236463.npy +03325088-dbe7761882240c7a3321831d2245cf06.npy +02958343-7d4c3d9795570647657231d17e42d06f.npy +02691156-6896058e4bc0be46bdf566b587d6b21.npy +03337140-e6e8c85c84f7c6894c3aee8e9d3a6ffa.npy +04090263-97e856173cb708ecbb9224760a70fece.npy +03636649-f95012d97b44f6a52a1b9710536b86bc.npy +04379243-1a1fb603583ce36fc3bd24f986301745.npy +04090263-94540c8b2d13b48ae09d3d2b183cc5bb.npy +03467517-46c7ea02f3f06c26dc691b483dfba5b4.npy +02924116-2e94d54ce3a9aab42ddeeb09f6e4dbb4.npy +03001627-3d629d27b74fad91dbbc9440457e303e.npy +02992529-98b929df60f9ffab49f9ea699d984c9f.npy +02992529-bacbf0d14e0cb5df6a802ef1ce963117.npy +02992529-27085a2456319497f1cb19f636b1c2bd.npy +04530566-55853d0f4d5ba19745aff212946058fc.npy +04379243-6e849ffbc0c14739b31b6dfccf08260e.npy +04379243-4c3ca87e50585617f9696ffb3e2cb66.npy +04379243-6bc941dbd290c7f21acdac000802e11c.npy +04530566-3e233d02a6943be81c99ec30e7a67a36.npy +02691156-8ec085a86e6d9425f4fb6842b3610149.npy +02924116-d3e9d6e0a9a01fade1da81584e31b667.npy +03085013-ac37c2bffd932033c03cb21be18ac701.npy +03513137-1cebc02c679add362f20449572a3a77c.npy +03001627-3c58dc00cf251172c05575120a46cd3b.npy +04379243-71e00a86a67df6e9c225da989036c576.npy +04379243-6b01be46542d507e674ce64e4bf77aec.npy +02691156-c62237ac28c4ed61efe0d4e1eba2e3af.npy +02933112-3216246565768e2fa716f601854e234e.npy +03046257-7c7b518b7ce049e648718eb33db1802e.npy +03001627-fa5dab91cbaecea8ce9a0998abec10aa.npy +02691156-593dbc303a7afed7f44f89e40af48618.npy +04090263-74e930c54ddaf8add34ad43a472bf958.npy +04256520-7833d94635b755793adc3470b30138f3.npy +04379243-9a3df6c365a3df3db000f20a5153622c.npy +02691156-fe1d825ce462c3e7b96212c8f6cd06e.npy +03001627-dc77b920bda118d54627f3cd8db22919.npy +04379243-d1ea83fd1ee634963d5da2a72f595df5.npy +02958343-55c545ac0d94ea16becf71e2e014ff6f.npy +04379243-884eb62c72c1ee75e6fe3612af521500.npy +03211117-b2ec76ac8a5c7afa40ff33d80c1d7d1e.npy +03991062-595a2947c890819d58c88d30f502a452.npy +04379243-49d441b49adde95b20768660cf080d12.npy +02958343-6246696b7db8ab34eeae8bcbf655eede.npy +02958343-7bf415dbff028a3d4470fce578e2b84c.npy +03001627-3f0beaab92a08fd74138477d68528833.npy +04256520-69257080fd87015369fb37a80cd44134.npy +03001627-8a9af7d8a83d90fcd53e36731300f5b4.npy +03991062-d52b2ede7c05092662a167ea4947f3a0.npy +03636649-b384676ddfb3b657fcb8d8c6d4df8143.npy +02747177-f10ced1e1dcf4f32f155d75bbf62b80.npy +03513137-93a86f07803b31c7715a42c4b7cc3a54.npy +03325088-e013eb2f75029d25572f8e1c1caad99e.npy +03691459-3538a656bdfe47948dfe57cb1b540899.npy +03636649-5d265be0ec25af3a7f772a7ed7ffb61.npy +02747177-56efabe64ce30e08d7bc2c778b186f58.npy +03636649-6272bb389bb524f0c8e1fef75f114ecc.npy +03991062-7e9f9553fc4fa9d56d93e521f7fd48fb.npy +03624134-42d9f9c31522d61e8cf144cdbb59254f.npy +04256520-346f3d9b39930b87dbfb0f09ba9f2d99.npy +02958343-36b28d2fd1085c53b6581f6f0cdd370e.npy +02992529-ab9c56981431ec70f7b18034d9df056d.npy +02933112-9bcfb450ed3046a74da5feafe6f1c8fc.npy +04379243-c306205a10978fd695a4c885dffe439d.npy +03593526-bb1a0d719c6c92ec564ef9ade41a3447.npy +04256520-df2fd8e97036e287dce02b254c09566e.npy +03001627-49e3ef3939d7a6ec6bcd32c43682e841.npy +02691156-3b2a19d782234467f9cc1fc25372199f.npy +03636649-ab7895189ef13e754f3443b22038d340.npy +04256520-b86d536860cdcf4ce7321f25048c6142.npy +04090263-d147dfc972ff3a8c673a614c45f3afe4.npy +02828884-83e19abeae8b157d3eb520ff7cd241f0.npy +03797390-3a7439cfaa9af51faf1af397e14a566d.npy +02924116-196fbbd797e9738941cefd10ce5d6cc0.npy +04090263-90612c4b3a2c6d849d9fecebc5860b6b.npy +02828884-974668cad6e15520c955e5ed03ef3a2f.npy +02691156-6ba7cad8fa7301f9c1ca96a73599ca7e.npy +03467517-35cdae95d5e278291082f2ea630bf69e.npy +04379243-dbf4aeb1d6c8b77a30bbd4cddd04c77b.npy +02924116-3988f8e1321f90b36519fb49e2941e.npy +04530566-f7220f2e7b880c2492ab202de6ff04fa.npy +02691156-21adc93a24e86672f054f5e37c7ac323.npy +02958343-6c449b92891754c6b8b6b17d4ce17d67.npy +03636649-b45b40ea1c3a813235836c728d324152.npy +04379243-ac2ee1eebd5f2e335c8a49a27f01fd12.npy +02808440-12aae2c1b46580c48e48489883d168e7.npy +02958343-2b9cebe9ceae3f79186bed5098d348af.npy +04530566-58e6243d1aade364186e889431adb691.npy +04379243-fd6a530388f275c926700e14156d231c.npy +04256520-893e3f15f023e9abdba08b82bf5c2f3.npy +03001627-b79bc903ae820b5ffefccbce7fd86667.npy +02933112-8238404daa0a13bfce5d6e9371bb5c33.npy +03001627-750bc77ca0328a29dbbc9440457e303e.npy +04225987-d3ff56062272f3e6346e65609be6d72f.npy +03211117-9557d54db1c95572e15527f70689f25a.npy +02958343-667f7509425dbc60c43644e93a8d03ff.npy +04379243-6a357f24085bf0fcae199f04f49518bf.npy +04090263-3d0012e27bf8ff429bddaef1ba7e1752.npy +03001627-8b0886f97f038a5fabbc3f24ddd185bc.npy +03001627-78abbfe9ab73729f56d13e757b0dc374.npy +04530566-eb01f5a73f0239a348c096ae17d885c9.npy +02958343-719912031bd692fbd02bf342687ad381.npy +04379243-359ffca14508cbcc86c701087a194026.npy +04554684-828f6f95c6e8651691219aad82abc053.npy +03624134-bbe934c9cdca9c1839ec49305bb07d3d.npy +03001627-8aca9f9005d8a8bae36724f611fabaa4.npy +02691156-b4e9ebb75081f146f6babb7d9ead7011.npy +03001627-a7fc36d1b5d29280ad484915511ccff6.npy +03325088-c02b905c5d602a7ebfc2343650cf257.npy +03797390-9196f53a0d4be2806ffeedd41ba624d6.npy +03691459-95eb96eef8f0e3a7ed10ef1927ebd15.npy +04256520-fa1e1a91e66faf411de55fee5ac2c5c2.npy +03691459-496aea93dd8f7af1f3f18c4c348425c1.npy +03001627-26c9e85dfa18af9fcf004563556ddb36.npy +02828884-9ad5cab6ff1e45fd48113d3612de043b.npy +03001627-5194d56c118786fa1a4e0f13d375972f.npy +03337140-97df987c252a2623820018801b237b3d.npy +03928116-6da19d0d62f55b3257c37d9adada9daa.npy +04256520-4774343934cead2828a3b1af7eafd3f7.npy +03001627-5f5cb0520b70efce750821560ab1d243.npy +04379243-159a2a760327ca5bababe11fcea8796.npy +03467517-8cdeac5545518a07459d1a070aba30d3.npy +03001627-304efa07923fc3c1c681404257d94ad9.npy +02747177-ee8ea1be0821a32860b96188a6533c41.npy +04256520-a3cfcc4d567590e19d4d5dcd2cc33826.npy +04256520-5d2c7b6f863379f1788963ea499c61d.npy +04256520-a996982326ffe668593ebeeedbff73b.npy +03001627-2f282d5e4f140119e493511b69cc95d0.npy +04554684-da98f4f303a500856e27419626f050f1.npy +02958343-dd8b4530c7122fde6a8da1ee9004e891.npy +04090263-b128968ac3ba7207210b7d136d269713.npy +03325088-d224f4d3e56b42ba979c556124bee033.npy +03790512-e54d1fb6aaabcaf8d5dde04c96fd8146.npy +02691156-66e0fbcab927f21a875d37e2f5bce5e8.npy +02992529-471a1ba8c1e1fb0a5b031707d900d7ec.npy +02958343-a8a4b511451c2f36463d04eb22b0bb17.npy +04379243-ae5ac5b2b027fcf9118ddfdb81cc6068.npy +04379243-68ea1f319a9d724ec3bd24f986301745.npy +02958343-12a034b6be9afb50ae983613a2e0a741.npy +02876657-b7ffc4d34ffbd449940806ade53ef2f.npy +04379243-8c2bb08ed6fcbcf3fdd3e2baf05d0f57.npy +04090263-e818959be12871d461b28e02a259d647.npy +03991062-7de2c51034e824811f2146f064414afc.npy +03642806-9fc5b76d363ca64ed03066fc8168e9c6.npy +02691156-ca4443e9a37c4f0b16ade7bb280a6832.npy +03001627-eb89f3b0af31bf40a97cde0b3996ce62.npy +02992529-3621cec4df1ddf421844676433a0aca.npy +03001627-411a1a4ac8ade7da76e9713f57a5fcb6.npy +02691156-ea527508bb74f476f64801ad2940cdd5.npy +04379243-4ced745f960f7439b91767277279ac70.npy +02691156-d883e6e5622a0cab72351dbf9e0687e0.npy +04256520-1fde48d83065ef5877a929f61fea4d0.npy +03928116-5a62d52920d2fa959335ab591bdc347b.npy +02958343-f64f81f7cfcb74033a2b1a2e5e169910.npy +02924116-1d00d8fe776689ac485dded84d35fc65.npy +02828884-9c1310c5ab89888bd201085e80edb26a.npy +03691459-21b9af9e21bbc7975afcf0aaed5d73d0.npy +03691459-65bb8f59e10a0cd837f1b3cce66816ca.npy +02691156-cbabb37711c06d4046ed10e8f7fe336e.npy +04090263-18953ef908bc743a5baa05bb713f2498.npy +03928116-5574c469aae489c355005b4420ff0a5.npy +02818832-447c50e658d729f044ededc21cf0e35e.npy +02818832-64c2347dfd79c63a63d977b06bbd429d.npy +03938244-3fab1dacfa43a7046163a609fcf6c52.npy +03991062-ed86685bc4a0711044c183864792bc2b.npy +04379243-5141810a02a145ad55f46d55537192b6.npy +02933112-a95f93b9da094471c59350d819542ec7.npy +02958343-420d1b7af7ceaad59ad3ae277a5ccc98.npy +04090263-365ed0964805ef59f5cbed688a0bb106.npy +02691156-7f6e55daa567aade3a1cddb101d3e1ea.npy +04379243-e90b641f8f1489d44b5e2e6b95708893.npy +03593526-a5db4bacbe009f2ef51f77a6d7299806.npy +02691156-48e9c61de4db838d84b83051fa0ae5d2.npy +03991062-912c3e1cf2ef3b9ea7d0cc9b15400f65.npy +02808440-c6449e52f945035a1ee236984e84b5e3.npy +02828884-c6dbedf2028735ccd2b12aa6a0f050b3.npy +03001627-c45ff54d4192633684cd6dc1b226aa5b.npy +03001627-be5df38dc7877c13c681404257d94ad9.npy +04379243-2aad9a8f3db3272b916f241993360686.npy +04090263-42aa9630886c7512ed6071560148e6eb.npy +04256520-c7631617fc36715c37363131ac7e8139.npy +03001627-49918114029ce6a63db5e7f805103dd.npy +04379243-8891a73ddf73656be4ef113421a70a46.npy +02691156-a1947665b3f56b584f127ea45c2fea1c.npy +03991062-bdbabbe2c21689fa3d382fe678ddae38.npy +04074963-4df6e942001af26f16a077c4c0fc1181.npy +02880940-b941ca9770b59c3918a27ff49f2f297f.npy +03636649-ba05f660341b7b7b70be09f44cb2fef5.npy +03948459-d0547b978857a41ceb7091f9004469c6.npy +03636649-dd1dde844f5b8ceef361255e85d5896f.npy +02691156-95cfdf728da16975c5f6fdebb053ab2f.npy +03001627-ee2ea12a2a2f8eb71335bcae6f5543ce.npy +04379243-580cac53a1f9a799446ad0d387c02a3.npy +04090263-731b2960620dd7883bb8b3b6d2fcf780.npy +04379243-3622046c1b2266a0fad46760e869d184.npy +03467517-92c2563a4df361dc93f0194265a9746c.npy +04225987-b140249e4615f0db6d8b6ba513969afe.npy +03001627-70711d5a1aead05b90a9ce3e4b15521e.npy +02933112-1cd80ed7f3ab7a5d4da5feafe6f1c8fc.npy +02691156-77ab8bb69221b13bbc0909d98a1ff2b4.npy +04468005-8823677178c21f28dc14ba0818ee5cec.npy +03467517-40cd2cafde62ff7ca24eeca91f583600.npy +04256520-4ed1591fa1c692df44265a262962e6ef.npy +02828884-579e02140aa4c03edd67a519fc8b2283.npy +04256520-bca2ce9beb8b9a3c909c248d0d9da9f5.npy +03046257-db230ee6f183643b14038d588fd1342f.npy +03991062-23c2a637319a07b425ebd1cd0b422e32.npy +03001627-708e7ef3c2afc842febad4f49b26ec52.npy +04379243-3339d615f108948876e9713f57a5fcb6.npy +02828884-7a500a01f5ade316ed98cca8f0ccd5f7.npy +03001627-da7fd2dca5e9f29455f0f54ca9692531.npy +04379243-70d8bfb20df2a08ce4730f03eef08800.npy +03046257-7c7204ae38cd5ec7af8a2e210ebd5168.npy +02871439-49d402238a272804cd114fa69ff09cf.npy +03001627-62c3b6eea96337609ae676623bdd3284.npy +03624134-debbbf239d59d8724662dc124dd336ed.npy +04379243-3532707a0addc62e13680f9c7026bd5b.npy +04090263-e24570b7293756b7cc34b900bb2492e.npy +02933112-9a7263ce1cb720d7c59350d819542ec7.npy +02958343-c2adec4dfc0dd05b2e877e82c90c24d.npy +04256520-28f2563c5e757b1c1b7dbdf53d301715.npy +03001627-35ee4bcad88ab50af6e44a01c524295b.npy +03636649-27e4369a1d6a5a2d490ad276cd2af3a4.npy +03001627-24465c99afde3b9782f320c67d1f2e15.npy +02691156-498ea154c08d51abc863ab010b80d9ed.npy +03001627-f1f69b9b2dbf7402c862eec8232fff1e.npy +04379243-7595d2709fdae7f4cd6ba6431f9f9d71.npy +03691459-2fc738e7a7dae1b59e08df3ef197add6.npy +04256520-f8fc1fa935aa8f792ebeb1e6a8111f53.npy +02808440-ab48dc1b65a3af0a3321831d2245cf06.npy +03001627-b72342e210414024e3e472a115551ec9.npy +04256520-e03c28dbfe1f2d9638bb8355830240f9.npy +04256520-ee5f19266a3ed535a6491c91cd8d7770.npy +03948459-d747c1f677349e78803b54e9738b20a6.npy +02691156-a87c4bebcad260edc05997f3aeab04c6.npy +03001627-1b7bef12c554c1244c686b8271245d1b.npy +04379243-8d9b10974c5e3b35a82a6374374c9dbf.npy +02801938-dc4a523b039e39bda843bb865a04c01a.npy +04379243-9da456630ad311b917fe334c5911fe13.npy +02958343-5b925881cf8678cabda733a39f84326d.npy +04401088-4546af9a8a67e7439c3dc4e242073921.npy +04256520-200324d0bafb1c2e19fb4103277a6b93.npy +02691156-dd9e42969d34463aca8607f540cc62ba.npy +02801938-be3c2533130dd3da55f46d55537192b6.npy +02808440-4a7d4186a966d777e49bb55b21b2d30a.npy +04090263-d9eede71f6941a7c766069834b8696c7.npy +03624134-6671717c417bc68bf912acc8c54e7fc1.npy +03759954-1e3831bff914f234bd4bf7024dfa167d.npy +02691156-41fd618a15692db27359b134afde902.npy +04379243-91c3c63dddd49d3a5271513b292108db.npy +04530566-ff77dc4561e1a8a531d119333f70ecc8.npy +04256520-eb34216913b891ad54a1f8a695b8eea2.npy +03991062-d049058e41674c06c584aa932b291740.npy +03001627-f8594a24176f732b4c7e2600dbaebf40.npy +03948459-10640377f4eb9ecdadceecd3bc8bde14.npy +03211117-9ec1a96e81e1e714fa6dbbeb09c2f316.npy +03636649-d153ae6d65b31e00fcb8d8c6d4df8143.npy +03325088-79a4a16b4062810c4f50865b470f2168.npy +04379243-f99ebf0f053140525a0e5699b3040a35.npy +03001627-a4da5746b99209f85da16758ae613576.npy +02876657-26e6f23bf6baea05fe5c8ffd0f5eba47.npy +02747177-cb8c6fc0e70e3dc12d1fcd0df2dc6d5c.npy +03325088-1309cb5bbd90c7b250da8b99982a3057.npy +02808440-42c74e5da10975c13af30a3946d92feb.npy +02933112-2d0d55da9d8de4356e79c14dd16aa04b.npy +03991062-728dbfa809bc9f4b62747237d98979dd.npy +02691156-4fe7bcbeccf207a5a2a2a57a63160d60.npy +03001627-4e294d057291c50fc8687ff9b0b4e4ac.npy +03948459-9f6b3d59f7ec96fac4dea24d28c9ca05.npy +03046257-1a157c6c3b71bbd6b4792411407bb04c.npy +04256520-eda881a6ea96da8a46874ce99dea28d5.npy +02958343-78c0bec338fa1c01d6b98bf27ff43caf.npy +02828884-928fa92b9f25292f75a9709a8c0e1e6.npy +03636649-5b74e8ee70acba2827d25c76a863dd52.npy +03001627-52b667b2014bdf0482db9fca4b68095.npy +03261776-1d4f9c324d6388a9b904f4192b538029.npy +04090263-251deeda2394fcbc9c96fa78389d2873.npy +04379243-99a3484c310cd1211e8fb9cbb32d2cb3.npy +02958343-2650c2325b7a8d0c811f8dcd8963ced5.npy +03046257-adf095adc30803a148996af2140a9136.npy +02691156-67b2e9282e92abe110ac482828ea39f.npy +02808440-268967dc3b0b09d0412deb0d2b0f3dcd.npy +04530566-22078503d5625b985dd2c581ea62184.npy +04468005-4f0ee7b0644ef0ad930027595c4fa0af.npy +04379243-adfec21e21737eeeb000f20a5153622c.npy +04379243-d0ef9d431a16e70de6c5cd45aa112726.npy +02933112-26657a42d9ec207ee30ec6a0c7ae873f.npy +03948459-a97fdc331fd7c8299cb41f075aef64e4.npy +03513137-43c7b9475c17df536b9e4b1418714282.npy +04090263-69e59c0feb5415ff71936222e0293591.npy +03624134-14f5a704b3898ec7426c116c412c132.npy +02871439-dd3ff69f2d82461777668bd5471e4f9.npy +04256520-a17ba222a54865cdcbde89e0c48a01bf.npy +03691459-93cc6af2bbe3675cda8f53dbeb7453f9.npy +03691459-22d5aa5c6a173d31b59e9758ae7f41a7.npy +02958343-dda10fc985eea0868c368040825ed335.npy +02958343-57e91b50c5420cbb4628d74a95bb7fe.npy +04379243-3b36f062f56e320674b9a1885f058618.npy +03001627-735df13871e3ab4edf6cfab91d65bb91.npy +04379243-264a075e293394a843638dabe1eb5336.npy +04460130-ab10a5607c25e6b0d730ccbc8780d609.npy +03001627-312b3fc351fc0998660e7db8c993ec8.npy +02808440-ad70bacd3a9234bcac5ad68050161b06.npy +04379243-1d447e3b068b924ad91787f0eb159c8c.npy +04530566-112743160fae5bd7ad83f267e8f0b536.npy +03691459-4f4629b12510571886be4ba1f667c92f.npy +04530566-46421ef3a412660b428cf87eb5ebe5e6.npy +03085013-d22bad5e72b815c41aea59cd55c902b0.npy +04090263-19c5068675de48b839264bb933c2348b.npy +04256520-79c3dfc2f90a5cb619fb4103277a6b93.npy +02958343-a836fc66c01eccca58c27e607f6e2d4c.npy +03046257-e1275afba2cf3718d5e4ad512ec499a0.npy +03636649-e138b41985e7382cfcb8d8c6d4df8143.npy +02958343-40f0bac5bcb4f8686ff5dbbe822945fd.npy +02958343-4eb5fe734f4eee71c6fc5b6f6b2a70c.npy +03211117-12ea5095e96f9ed185d624cfcd9a37a7.npy +02933112-951377627e2fb20f86d53ab0fe94e911.npy +03001627-1e283319d1f2782ff2c92c2a4f65876.npy +02828884-b9535bf9b002a226d4d8765e3910f617.npy +02691156-6ea7eb1ef18eabcf8699933784576e73.npy +04530566-8a553a23adde929ceb2c303a0e0d287b.npy +04256520-1e658eaeeb68978214038d588fd1342f.npy +04379243-3aadad80a0e8d21620768660cf080d12.npy +02691156-abb19f2adc42aea2579c3d4943e463ef.npy +03001627-5f33a76ff2e4d25ea7c7a7d30ca93d68.npy +04379243-3a800ccb5e7de7811705bfd3afcd10e.npy +04090263-fdee9fa34e570910f2a8e4598a15f7ce.npy +04379243-689cf8174210c2701933ffef19678834.npy +04256520-ec77376330a7975214e726c15c7dc200.npy +02828884-550e62946d2f55554bce3147c41ec725.npy +02828884-28e12ef0e54e204830bbd4cddd04c77b.npy +03948459-623068000236841ec686380962888391.npy +03001627-11dac7c4d7e4b32af9aec59741c69cf7.npy +04379243-86dec892a246e0c02cbf13da1d4abcc5.npy +02691156-91ad0ff431597651767529f9ae81ac0f.npy +04530566-88cc060aa20b340611b3e656ab4bd115.npy +02691156-3a18489f9615a350e768735f27170bc4.npy +03325088-a9b43b9181475e5b7a867e9b35a1295.npy +02992529-67524ffa83e3eb7c4948b3842dede005.npy +04256520-ad708015fa2c131853227dcd0d547ba6.npy +02958343-ca9a4a00209632808acb0ff76f4aec7d.npy +04090263-267af66d92c1b6b6e6819fcae2e26ad8.npy +03001627-cdd2c7251be91ca779b76fdb1a0daddd.npy +02958343-cd85df142f1999e5f38ed4497f2c53c.npy +02818832-f87682301c61288c25a12159dbc477b5.npy +03211117-ed0975c0bfab1af75f17e2852ee16b0c.npy +03211117-6946bf798ab999b7cfbd2b4a434b378.npy +02691156-6e4570ef29d420e17099115060cea9b5.npy +04379243-ba6a1d8d3f8e832d67668f34c2939f7d.npy +04460130-927ee8b508cde67f5ac73f8a88a91040.npy +04090263-c14017bc897d73f46314c3b6a3a65519.npy +04379243-12567fb8261120cf63a97d76062d3220.npy +04530566-4a01d52c0d8346fda8215f78849a813c.npy +03991062-e9eb1e4250b5c727d0546e77f7d9b0d4.npy +02691156-12d15ac778df6e4562b600da24e0965.npy +03001627-fc2a1c4c332f7731e45ef4135c266a12.npy +03593526-5e1c630396c0a1ce30cbeaf8f6d93761.npy +02828884-fa1b7b9630c840eff4fb4dee5181bee.npy +02808440-33718430c3a5c88bffc6e457221b9271.npy +02958343-c21cb9575910e30bf0174ad879a5b1cc.npy +03642806-2da650d7d946a4f04b7717340dfa57ba.npy +02958343-8fedb0c03a49bddaa8c38723d07b122f.npy +04379243-8e009300d7671a33b2a5818319136c5b.npy +04379243-111df730a9d3f2a8eab46ab0515e8186.npy +02958343-36f8760e54a7a1835cb0db8915167503.npy +02933112-26eb1d73803b2426ef46cffe4939fce1.npy +04225987-6867832e7b9d3654aacda7f1c4fd3ea7.npy +03325088-f0bb725ec0ddbc7eca25b2e822a430b0.npy +02924116-cdfb80edb15ba29762e9ca743c2e311.npy +04379243-1e6d470b0330afe7abccd5469c032787.npy +04256520-e541933c90eec36182db9fca4b68095.npy +03001627-758a68f80f0754f14a8a0ee8b17f83bc.npy +04090263-39c1ebbe7f6f1d5f4a4df88f87b30520.npy +02691156-351c9235749e398162147e00e97e28b5.npy +04530566-44c07d26323910f4fdef75f370a46dd5.npy +03001627-807c16e4f6f2c5852cf52ec1a1c9b69d.npy +03636649-36c1653a021a526319620b61f6587b3e.npy +04468005-76470b75fcaffab629054625f34e281d.npy +04379243-956776ee66e095df2822b5101b06e070.npy +04379243-f58b9e92e45367326c3484ac7eef025f.npy +02958343-5db9380876853a6eb690ce0453406d16.npy +02933112-3aa643b4eb4a165675a4e003752c1044.npy +02691156-a87cad03c8f717e230dd29e8b6a554b3.npy +03001627-2194e6394a31194962e682c9809bff14.npy +03001627-4e0dcb9beee7bd3f3a11565e5be9cf53.npy +04379243-6b2edba33e92b96998fc1d0403f6ad0.npy +03001627-9c499d86350d32a28639ef683ea7ed9b.npy +03261776-56c4d7e643d6a7286329e8c7b28434da.npy +03593526-45ba72a5187c5fd7b9c6deef486a7d8.npy +04379243-65ffcbd025d2151ba5901d93c937a07e.npy +02958343-c9bc4690b171e5d7f0ae46ab6a68f9fe.npy +04379243-cc58de930acd321fac242c3aebc81b2f.npy +03691459-fb4c855848345ecd3e738e11bd8803f8.npy +02747177-3c03342f421e5eb2ad5067eac75a07f7.npy +02828884-8b19ea942987fd72eb753607b9a115b5.npy +04256520-d0f30590066a88fbd5cba62773b8025b.npy +04530566-1e0c84d82fd52f8c394eb4a27c704b88.npy +02958343-fe29b245be45318c80e6a7abc49befc7.npy +04379243-f0f1835eca48e3ae3241548166bb146.npy +03325088-9b15d9a617b37d16d0157e3e7a8917c.npy +02691156-8ba22e93df58242b61c0a7e9e23d6288.npy +04090263-2428abd6cf67771461cca2fd9af9f2.npy +02818832-a903172a5a2b7f7534ac8202f42b5791.npy +04379243-cc1666f0fa7a1672e5a8eba5f6050bab.npy +02691156-881a9dd186e1d5c3ca8607f540cc62ba.npy +02691156-7cbd504262e2d17ee91114a141d25a9d.npy +03636649-e12e898cceec4e23f51f77a6d7299806.npy +03085013-60101361c899c9b54ee5c9c77434cb10.npy +03636649-7f518fe982aae1b5940c8a2639c8747.npy +04379243-40d0dd3fe786e120d75c27ddd792e41a.npy +03691459-112deef454bb8345c6bd342792702e80.npy +02691156-6021cb206f3db880c57b4651eeb679eb.npy +03207941-e4919cebeceea53028b72743e7b13756.npy +03001627-3776f058b918372899b00821ae388810.npy +02828884-7ac31f1da37aca5160ddc468fe733ed1.npy +02691156-82cd0676627c20b0879eac31511e27a8.npy +02691156-72c28618e3273795f9066cd40fcf015.npy +02924116-fb8045ca34f292a087c6856023914391.npy +04530566-2a9b44ad6d6200c02b3fb35c6618f417.npy +03790512-55caf44a43f2c04d468bac13e007a6e9.npy +03761084-cd475ed6b6300dbdbe3a55bdbe3532d.npy +03325088-a7e23856ee1f9789a12b86efa90a53a4.npy +03001627-cd238045ebff9be59186f15d520c12ad.npy +04379243-8be0acca4f67e4a4ea966ed2fa6fd5c0.npy +04379243-b23030e1b7084fd9d38913e96bbf2a5d.npy +04256520-1050790962944624febad4f49b26ec52.npy +03001627-8c4d57109ce0f2f222659d33fd79709.npy +04401088-5b111b3a3e94b5907e1c85c5c15da7fb.npy +02933112-52e92f372629cf356e8f1932e45c9faf.npy +03636649-f2f6fbeacda7cbecfcb8d8c6d4df8143.npy +03636649-342ea0134b504918cf5a37a70014c623.npy +04379243-977457a28e32ddbec242632b2a8c3129.npy +02691156-1de58c7eec71b438bbb26c14135f164e.npy +02828884-23bb9c45796a28d4154e78d1322f3484.npy +04379243-20292fba71362950c59c53f7df509858.npy +02992529-5ce8fc4a82d2d97736d4d4df7a719b88.npy +04379243-d5de572c3f6517374b3c42e318f3affc.npy +02933112-b50c25e6b5447714e90f8ac2c1271ce3.npy +04554684-725bbfc557d3e1b9b5af85a5be833ee.npy +02933112-3f668a006192f1afffcdb54593f6ab3d.npy +02958343-eebbce8b77bdb53c82382fde2cafeb9.npy +04379243-e1f77c5cfd7ea402738e43095496b061.npy +04379243-d40fb361cf8aa18767dc358060e3c47b.npy +02958343-125a4780c2d5095d19454008aa267bf.npy +03636649-bb7d710f4104d16b88e7662971dc736f.npy +04401088-b9f67617cf320c20de4349e5bfa4fedb.npy +03636649-8e9c28fc5813a5bdcf004563556ddb36.npy +02691156-ebe0d0bfa6ec36edd88eab18f1be033b.npy +04379243-79f63a1564928af071a782a4379556c7.npy +04379243-a80b1f16f5dfae242aed93548190eee8.npy +03790512-48372a904ec9cda048272812609617e2.npy +04379243-6cd84ff61583805c85e2af9bf984f0b5.npy +03001627-41bf66b762decaa42c6c98851414a9d8.npy +03636649-3607a2301201064ce7c8fa552499fc0e.npy +04379243-91dfc3575149ff71342398ca9dc32672.npy +04401088-db96e9b2c96c273de7d92dda5756fcfd.npy +04401088-768648ae74e9d84e6d445fdc5fd8bfe7.npy +03001627-37e5a1f7f0409a3b81d7f282a3dff363.npy +04379243-94966aa8a7a6f540f6807434c358ea12.npy +03691459-9a94af940a768aee5865ac92cffc2982.npy +03948459-73c9733fb85d974b3b2b25ffabe35ca6.npy +03636649-c372499c4fb0b707e262a7452d41c334.npy +04256520-3acbbce6f05c2623fdb2be860bb16c8c.npy +02958343-1724ae84377e0b9ba6c2c95b41a5446d.npy +02924116-29a4e6ae1f9cecab52470de2774d6099.npy +03001627-73b369b9808bc2d0f6ba522682be8978.npy +04379243-cc5ef32dc87e0f245dcc7ddfa72357b1.npy +02933112-bc1298b1c55849b14e82b8d74b98baba.npy +04090263-b0a050985a5ce6be25508ed649b952cb.npy +03691459-7d2bd4d349ae34a2fcefa74f1d0bc6e6.npy +03636649-3c9f0efc08817ab6fcb8d8c6d4df8143.npy +02958343-12a445770f7d6f2b70a43c2d978e502e.npy +04379243-c05f807d12761472dfe9cab879fd37e8.npy +02691156-9550774ad1c19b24a5a118bd15e6e34f.npy +04379243-c5178a8a0da618a25d78ff7fb413274d.npy +04090263-d9aea67e3209d6aa1153b2cafc57da88.npy +04379243-60fbc4c64d6032337af2ac6660aa6669.npy +02958343-41d317b520eec9d38d3d01fa03326bb0.npy +04379243-cfeda84f71e95e6169ee3dc2896968a5.npy +02747177-d75e58ff57a881286aecdf1bc1fdd961.npy +04256520-d55d14f87d65faa84ccf9d6d546b307f.npy +02933112-3a0492e3892bb29f12de5317fe5b354f.npy +03948459-98c0bd351e275b3c96893524e607761d.npy +03636649-ee9849dc8d93e16c118ddfdb81cc6068.npy +03085013-c6f97082a7d28645ecda5e76a9473fca.npy +04379243-7affe342bb9be16d5936c7265c890fef.npy +03467517-b7e1c7e7ddd1485277df4c4d253ba3a.npy +04530566-93c013c922b90649ec08eb6485163157.npy +02958343-e1c3687f400be151cd21a68c6dc7b5e3.npy +02747177-1f4f53bc04eefca6f155d75bbf62b80.npy +03991062-92dd4a5efaf2a1702d7a27ffaafaaddb.npy +03001627-1aeb17f89e1bea954c6deb9ede0648df.npy +03001627-22740f20eddc5420492d9da2668ec34c.npy +02876657-545225eda0e900f6d4a7a4c7d6e9bdc3.npy +02933112-92e421ce25931b6da5e3e028709e0474.npy +04379243-5c6cad6a12d7cff3bb6e988dd2500ba5.npy +02958343-50ba203c086c496df43db49cede9f847.npy +02691156-56ace4b209c9ee823bb911cbca3906a3.npy +04379243-2a4f92a70be4e2159c0b027ae5b223d6.npy +03211117-96f01698d0446641ea6e0950aa8ac31b.npy +02958343-dd0b595b15a7203e185ce5d54f27f6b9.npy +03001627-b44d32061d313fc1b7a3c315f744bdd8.npy +04379243-8af6aa6372ade15d8457b637f6fe1690.npy +02808440-f5713226c59f9332ca11f350bd7ec054.npy +03636649-aa1e797797bcc2b161b08af0433fd9aa.npy +03211117-648fe31415502db61c298d13539601a.npy +04379243-3dd217a06e76292b372b6139ac78b39e.npy +02992529-59a168f51f8d7dd9e59685727bdd9ae9.npy +04379243-690e073a4000c7ae540e292bd26f307a.npy +04379243-6137e19255f71a0a26700e14156d231c.npy +04090263-346d1a548be65182a67ac8a08d7e171.npy +04530566-548c6234fc7c787bfeea5c85a86089b5.npy +02747177-1864da0abd05dde7f4fb4dee5181bee.npy +04379243-cdd6c99231cca3c65b187a2f89229cea.npy +04379243-eaea1cf98b61abd043383304411cc9ec.npy +04090263-d3f3e2dba3dc32c0ebbc1e980ea10b4f.npy +04090263-1e6e823412133e585a5fb2c1a52fc5c.npy +04379243-bb5dbf708d5eb7f82099f9e22ca45b04.npy +04379243-cf010623152e31ad2366f6466c2cbc19.npy +03085013-ef86e713b0f71801d5ed7cc6bf6e7003.npy +03001627-6223f3849d57154b5ecb3cc57fe87cee.npy +04379243-f0d8620b49ea76db83130614d8020b3.npy +03001627-e4a890f2330ebd7e4a11872aa986426d.npy +04090263-fbf5a7f93f70cfde12b38b1d99376c0b.npy +02691156-2f4133664133746cf64801ad2940cdd5.npy +03636649-66f7a541e0459b06fcb8d8c6d4df8143.npy +03046257-7627cd63f72a64c3a50aad89e0fb309b.npy +04379243-30afd447dd7201d652c0eaae5c15cab1.npy +04256520-81a7007ead4051cd22ed3259ee7e608a.npy +04379243-128011ffc7787d50f0920fefbe028677.npy +04090263-5b9b869475b3af7281112f9b0beb0a14.npy +03001627-6440fcf4fd8214b7dd58412a5e38ff83.npy +02933112-54a7817fcd0919697753725ea42159e8.npy +04379243-7ec1ec1db13eb349ff085529822a7226.npy +02691156-d48064100e793155f56a7ca118af1bd1.npy +03001627-c92721a95fe44b018039b09dacd0f1a7.npy +04379243-5b97f44d872864c21f7d7307c1f45af8.npy +04090263-285854c90afd66c4c9e18dbb8de06b45.npy +02933112-2c6aee97b0325e92de650492e45fb14f.npy +04256520-929614d79ee9b3f7ba83cc8b3ca4d7c5.npy +02828884-671cade486e88b3880d14ef4d993c2fa.npy +04379243-a96f4daf990b3eda53a3e8b300a51f98.npy +02924116-321c0fc84c8fc3c82d4e86573259e388.npy +03593526-a6d49ec1234f2465f84f031022f95405.npy +04379243-abbc5e4950ff6ea8f4b6538438a0b930.npy +02773838-e5fea6c1dacf3ed4cd99ccc7ff441abf.npy +03001627-4f66b8a004a1515df33978a307b45373.npy +02958343-30774e3218da1f793eccc98914b46c47.npy +03001627-cdf733e544e6646f9b75b6346baf0c12.npy +04379243-4fad1101568fcd48fa7b9a6c80e4e324.npy +02808440-8de00e529b8b39a244221bef0fa3c36b.npy +04379243-8e5c3b7366f2f017b4e3935c6cee4b35.npy +04530566-997054b7ea21f5829588e71e21de9f30.npy +03325088-29e597c4e5cf1612b05296093fcb87fa.npy +03790512-5be7e00fe279ac927cb7616d82cf9fae.npy +04379243-3695727c04b15887b983088451bda93b.npy +04090263-a8b65f50dfb2a74a9a6e43b878d5b335.npy +04379243-441e0682fa5eea135c49e0733c4459d0.npy +04256520-bf816001f25b2ff822e11aea23332c0.npy +02828884-2bfeb0ef0693823d1418b6bd61b3ca4.npy +03991062-39ea99284138e5e835b3d63776480dcf.npy +02691156-13370c42b8ea45cf5e8172e6d9ae84ff.npy +03325088-36aa5b58afa181c76d20e73c57c9a03.npy +04090263-ea9ee0992bdcad77e641d7676ac20451.npy +02691156-1fccf0064e0aebfeb179f2ac46747670.npy +03991062-de673ddf9df03b8278cf1a714198918.npy +03211117-2971f417b08961475a4cd9b26f359d36.npy +02773838-631fd8c280dfb9d5cd3852d63efc4336.npy +03691459-af4dd70becae7293efcf7226d1117163.npy +03691459-4aa41b48ef7711f89e87d2bdcb41f548.npy +04379243-98dcbe480586e9a951d5d1004657a651.npy +02924116-782fb7fc878169906ca2b6e5474aad11.npy +02958343-cfb6c8867c6dd84c80e74058ee862f05.npy +02691156-6dead775080763b94c3a35cee92bb95b.npy +03001627-79c9fdc6bba82709c8687ff9b0b4e4ac.npy +04379243-ccd3c75b72708a90c955e5ed03ef3a2f.npy +02691156-9436273fc1a5e3ca7af159eaf7625abf.npy +02691156-e25794343ee37d6fa8eeb11153b68d81.npy +04090263-128cb9e49c7e214ef2e947b62e6a6cce.npy +02828884-5a52ec36c75fd3d87f502c4e1de97042.npy +04090263-b2c3114a9acd55636d4858690640024e.npy +04090263-b13c2dec1a1dd7ab9bba8f87a19ff3bd.npy +03001627-77dcd07d59503f1014038d588fd1342f.npy +02691156-a9668a32a91787a6be5437d0813f18f0.npy +02818832-ddd75dd50dc40a3f8c1632739e6c2fc5.npy +02828884-ea892969e4035e0fcb2a965e75be701c.npy +02691156-4209abb3ec319f85e5118a089c2a99af.npy +04554684-5e071ea7184305122c5cdbc97c64ef41.npy +03797390-d7ba704184d424dfd56d9106430c3fe.npy +02691156-fe4ad5664773074cb536c73c7d134340.npy +02924116-b5d8740b0662dee71cb7939487e62b3.npy +04379243-476e7d25434b67e75f490d1795e78588.npy +03642806-67e4cc8e13aa863cc418dd4d8b66af83.npy +02691156-439c0ad637f11af762b600da24e0965.npy +03593526-7fe9e595c5eb7d04bb4fd842f8631c2b.npy +04379243-d2cc7d1f7fff8488698b889b37529d3f.npy +03001627-972d675d3ce3555d492d9da2668ec34c.npy +03211117-68a4fc70bff1e1cc700fc5aa044d9995.npy +04256520-6e4fab35f29925f14f438613584cbdf7.npy +04530566-6fbf3621aa1d3a8e49f0e3dd7767881.npy +03636649-ce406a32bdc610198ca4aeb5e3b33af7.npy +03001627-fe1081843a08b7a64d8fdc4d7658fe42.npy +03593526-76b3419536fa2802ead5bd90ea492d1b.npy +03211117-dd8cebcb4d0564059352b002a7d38daa.npy +02958343-528c01214da6d4bca7fd25564c2e888e.npy +02958343-f5e0edd70d644777cf1e58caa15acb49.npy +02958343-85f3dc3318f5200c8672c9b355cd2075.npy +03211117-caa4afd404f24d21275c1147a304ed86.npy +02942699-e9e22de9e4c3c3c92a60bd875e075589.npy +03001627-b5706706df77157627d4fc401a34f3de.npy +03636649-4bb676c497969016de98d10ab5975b59.npy +02818832-f6fb20673932fe50230e608bf41b643e.npy +03593526-370c9228a2f41e99346cca8c07629c62.npy +02691156-74797de431f83991bc0909d98a1ff2b4.npy +03636649-10ba42fc70f16d7f41d86c17c15247b0.npy +04379243-cea61ac56a07271a96cc2d2cb6bf6019.npy +04401088-57245f4db78fc2be7aa291768a04b26f.npy +04379243-73d57c83a4ac0979d80195020ba66865.npy +02958343-1d4066f8ae88a1ebec8ca19d7516cb42.npy +04530566-6e739e28803bbf257446ad526c7486ad.npy +02828884-e8403ea994ecb1cf855931d119219022.npy +03691459-3ee30326a3bdf219ec2ca8479368108a.npy +03593526-b59f693b45f636d54c6c80caaf15808d.npy +03691459-6d6fef896f1196416526bbcfb9a38489.npy +03001627-63d45791c56483bb2662409120160a57.npy +02933112-9a195ea2a21bc7511a4db721d603d852.npy +04379243-8cc8485f249a37f595b25bd3accf45b5.npy +02958343-3e823f89c611fe57a413908c0e169330.npy +03001627-f7b52f9c95ebaf3ff91663a74ccd2338.npy +04256520-5850eba97de66d8e283b00891f680579.npy +04379243-c1fab1be028d2d1192d39b162a300de1.npy +03991062-6067418287b99c57c0592af70eec7f.npy +02691156-65b3e612c00a65a6bc0909d98a1ff2b4.npy +03001627-21a7166815b80f3f7fee47aa19e2e28c.npy +04379243-3ceb74b707f814a17bcd6a9a3aec51dd.npy +04379243-3243ddb2aa4d1659beb83c64f2162734.npy +02871439-920251969a40dcb155f46d55537192b6.npy +02691156-adad9536c34c673862b600da24e0965.npy +04379243-1e4d84c0be21fadfe84db9643b62f161.npy +02958343-b8c8758f8ee058182a9eb0f146e94477.npy +04379243-4f5c111a89b3fd27aa29e9f0529e8ef7.npy +04530566-ad8b5aaa3eb9f2f69330265a9fff38de.npy +03624134-eeb6322ec7492375bef48d9603e8869b.npy +02924116-be3a3b68029787359751c0a6c5d226d3.npy +02958343-f82b9a21855ef3feb1bb46d2556ba67d.npy +03991062-26d74b9867e986b08d38155f5ee83a11.npy +02691156-a61a59a4c48154db37678474be485ca.npy +03636649-12c0b15c8ed8a3edb039d8689a74349.npy +03790512-bf7794ea4ceb978bafc70af22a99299d.npy +03797390-7d282cc3cedd40c8b5c4f4801d3aada.npy +02691156-8700f6db654c5d2aca52e8e28cb200ce.npy +03001627-5ca11d3f35d870e1b724bccd568c5fc1.npy +03636649-33147aaf3d2c6fbc137af984a9f45d65.npy +04379243-f0735e59fa7222f9fe8adc3c073336.npy +04256520-515431e0c0854f1cce8417aef1b7a422.npy +02958343-318eaf9f125d8296541e8704b64e3884.npy +04379243-b1ca280d9567270ade98d10ab5975b59.npy +04379243-16ee1b2d9a12abead99c7626c95596.npy +04256520-9ef66cd1ab321cd3872052160bdade26.npy +02691156-53d8ce9573e361d990b1d6deb98feec6.npy +04379243-a5e061fc25bff768623d10a210f40a3f.npy +02924116-85efa9b5820d4fede381e109d127fc51.npy +02828884-2f815697256fce5a155b270ed8c04b46.npy +04256520-1867c1751ae7bb2829024035009201d2.npy +03948459-75476ba20ddf71fae868ed06b4dfef2d.npy +04256520-36ab61ce3c894d6514038d588fd1342f.npy +02828884-ef207b78de8277ec42fc59644ef58e22.npy +03337140-1d11f72cd35fdf2a4c3aee8e9d3a6ffa.npy +02924116-49f6f4047f548094b343a6a5860e15d4.npy +02946921-25c253b2e40b6f4ea61649b05d63e9bb.npy +02958343-626738526152dd13d76439fb95cdd2ed.npy +04256520-bda845f53dace1a7ab610b0c94236463.npy +03001627-e905abdafadb48d4155b2bc3322563d5.npy +02691156-bfd02b9a1ad7ce73fe2d13a096d8b561.npy +04004475-d92d3fe1e9174e3fe0db0b99552a07a3.npy +03001627-654b7415b53b5138fc5718d28351c534.npy +02958343-45745eab59d4ed09e9415adaaf77fdbf.npy +03001627-7aa759758e3b0d5024ef48ae9e8e965f.npy +04256520-1545a13dc5b12f51f77a6d7299806.npy +04379243-c578d2fa302f0b935e7f9846384b5857.npy +03467517-19edd59f5ac0f3c7972b486a47e2bd46.npy +03001627-7729d76b67931981f9111ef49c078dbe.npy +03001627-885bc048615523273eec26c23f5bc80b.npy +02828884-e79a991fbf64c2c771dde564c9e207fd.npy +04379243-a355108bb5272ff256d80c2792e1f42c.npy +02828884-229d510bace435811572ee5ddf1b55b.npy +04090263-f646b2bad0332c0a52a927716d03931f.npy +02691156-735aad15a1d22ed3dc92eaa8f8f40f9f.npy +04530566-82242062558a24bc97a9c690ec97cc81.npy +03001627-e862a41f869a4274ac7f1a00b76bd166.npy +02691156-edc185566c1df89c35fc197bbabcd5bd.npy +04256520-1f620792984f66fd22c3a2386a9dfbe9.npy +02992529-2fe9e8fd2a7c512ad1f278e1513f3b7.npy +03642806-39e61115ba9df4d3cf75707bd872e2b3.npy +04530566-e9c603efb5aea8087610cb1c03c9c3ea.npy +03001627-55dadd6acaa2a0c0dab72035db8eafd.npy +02691156-b837c3b8eec02a4967c54439d6177032.npy +03001627-219c0f0f7ee5c3737f9dcf5672c2dd0f.npy +04379243-5b67be496c11533c66289707fcc0ca1d.npy +03001627-b2239339005b14c8d675cc466d0d6fbc.npy +03636649-69baf1ded62a0259970e9f7b51f4efe.npy +04379243-2024beb1477fb5d2278d386bfa54545.npy +04379243-f2a759729bafbe88fef3fa725923b557.npy +03001627-5f256dd64efba74a4316d3320fdfa899.npy +04090263-fc0cf8eee4c33cbcb53b1ee7df9d3a60.npy +04379243-6ab7ebf9b94176456f1e07a56c129dfc.npy +02691156-12b25b8de7aa37a0bd46d022fd7d80aa.npy +03001627-934f911815518a12862ec27465061d4.npy +03337140-f4e9f25443ff6f963b59eeb47ee49193.npy +02691156-b2bb5a56b3d805b298b8c800ae001b66.npy +04090263-2f5dd43b4ffd7d433dd48eebe8f7b24.npy +03001627-60e8cbfd3cbf85d097b3b2f2bf40d247.npy +03636649-aed950102f1e9c7a659dda512294c744.npy +04379243-d2b0fe8551e6e3b0ab610b0c94236463.npy +02933112-c9ead211b387ce0c5c59c6146ff01de4.npy +03001627-1e03b1793723dc25fbd332e3dd079259.npy +03636649-b4f7f20fe212e633c14d5c159bab8297.npy +03691459-6450e70e275a80e0e39b302b17f4c82d.npy +03636649-fac2081abc0375649f41ef09e8fcdbeb.npy +04379243-feb92b34c698d396cbde89e0c48a01bf.npy +03211117-f7623667b09f2737a10a38d9fc3b0d4e.npy +03001627-b738a4aa965784abd86234e915108e6a.npy +04530566-5001bc761fe86d60a43a471ceb7c72ac.npy +04379243-4afbcdeba648df2e19fb4103277a6b93.npy +03991062-fd68b3538d3f12a2ff67c12005f72d2.npy +04090263-a9c06da447ff8ee6d6d33c92d1d05e93.npy +03001627-42ecccc972b45e38f4cccb2a97578c5d.npy +03636649-13f46d5ae3e33651efd0188089894554.npy +04379243-5b375eacdbe49cfaaa539cd22945e538.npy +03001627-e90f124b13901eabae8375def5e736d8.npy +02691156-4fbdfec0f9ee078dc1ccec171a275967.npy +04468005-618256f81ca14c15c50a037462bade42.npy +03001627-2f24021efe2ccfcc2db431502a680805.npy +03624134-8bac6592cdc56dcd3cfaf38598bf5d36.npy +03636649-169d73f18f7b17bb4a6ecce2eeb45768.npy +02808440-cb38405e384c79c05e4e385b035691bb.npy +04090263-cf5538e2b369b7b33ed6ca821e0a9e81.npy +02828884-4b715a1f611b30768b45d2a1081eca04.npy +03001627-8fd6ca8f2d0ce46b846c0e4d54382ad6.npy +03691459-590e2fa429a94e711b45df3fb820c9cc.npy +02924116-d630edbde8e8c3c1cbcf10e5718c0454.npy +03691459-ae4bcb4baca763c24521562865ab775e.npy +04379243-cba38f14dc16d5b5fbbc7c456d85ce59.npy +02691156-68ac5704aefbe4f54e86b47976e55141.npy +03001627-cccc93857d3f5c9950504d983def56c.npy +04256520-9b5e8c302f7e6fb4593ebeeedbff73b.npy +02691156-8fc553e3a88b7ad54e461d462a3ccbc4.npy +02691156-47b409c5c80dd7c533de69c9cd670995.npy +03467517-2e51f4d434d7f760e7447543ac4d4049.npy +04090263-6694001fb50d3f1237ff6d90891805e8.npy +02933112-59b0ac376af08592824662341ce2b233.npy +04379243-8bcba9172db65219ad5067eac75a07f7.npy +03001627-9fae85a69532d03fda686a7d8e3d0692.npy +04090263-6f09b74771f8b4808962281585efe24e.npy +04256520-4d05c9f0f34e1c22715de3ea7b582d7.npy +04379243-f2fee52b9098c13fdcfa6f33a3c5eb83.npy +04379243-201c3e44a5967cd030bbd4cddd04c77b.npy +02828884-ffad1499a8bb6c7c19fb4103277a6b93.npy +04530566-d5b2fe7ceeed1ff59268271e4d570275.npy +04090263-8d9d9b749562c59a9a2ee232a197081e.npy +02933112-8fcfa31d1df6e8ec9c2edb56a98b4be7.npy +03001627-d7da1c65f996cef2febad4f49b26ec52.npy +02691156-debd942c5fcdc9c84c2c88971423d0be.npy +02958343-1f7393970917e558b4a20251cec15600.npy +03046257-2d65d034332ffc8397cf3f86b15a00c0.npy +02876657-882d477872fd88347df6165146d5bbd.npy +04379243-8efb3d9ec93520a797046e48d8f1e936.npy +04379243-5ef5685e19c5b253674ce64e4bf77aec.npy +04256520-b281da26ecd358e1e7e684d25d4dcaf0.npy +03467517-c5f9c372078561644368de794b251ad1.npy +03624134-229edf8adcfee7ee70b60f242c0a291.npy +04530566-4b63a567e41b63974de203ef6842ee61.npy +04379243-74d470850c9f9fbcc2b64c0adffbe398.npy +02691156-e805054e6b9b3666fcfb100fed3ed97a.npy +04379243-40f1be4ede6113a2e03aea0698586c31.npy +04530566-6de5985910b222f8afa96d6d0eac8962.npy +04379243-884d2cc0d3aa8a72640e544a5d67c33a.npy +03001627-45a0b8c6923f587e694253b740159af8.npy +04379243-e2571e4eba2d9f5eab610b0c94236463.npy +04379243-49c24587a96211191679687a9323c13.npy +03710193-7ddfa116704ae5555bee258e658f9767.npy +02691156-ca0f8f701a042689331960c3710d952.npy +02871439-82b88ee820dfb00762ad803a716d1873.npy +04090263-5658068646336771cba7035647fbacdf.npy +04379243-104c8e90ecf0e5351ed672982b7954af.npy +04379243-fb4d71ac2bbefa2297936c81e7f6629.npy +03001627-59f4a5d8390c3c3d5fce6078044eb87.npy +04401088-8b291d445d412c09cc018c0e073a98f6.npy +03001627-b2f125cba550eb8bfebad4f49b26ec52.npy +02691156-d7f71651e6571ee2f63894cf4226f14.npy +04330267-902f4ee7655514ba109dc73fee74b150.npy +03636649-e6de1ff0564f172ad96790493cac7283.npy +03691459-75f07f0e8343639d37276d660ae66f0b.npy +04468005-7c511e5744c2ec399d4977b7872dffd3.npy +03001627-39fb5d3f557f64d4389f9a01d027a78.npy +03001627-9aa05f609e6731bbec19069e387c0327.npy +04379243-7f808e545bb01ab7ac91966b4f1152b0.npy +02876657-368bbfbb2fe08a6b4c5c5c89015f1980.npy +02958343-41a6deadd39b4c754d0f9a1ef5f184fe.npy +03001627-610b1621d1997ee1daf3c002be658861.npy +02924116-fbb06ea3f0c57f4d57987cc554f65cff.npy +02828884-4ddee322f191096a54e14b4b3de20526.npy +04379243-de500885a5cda50f99284d844aba7576.npy +02958343-1bfe2cb495f63c8f6bd865f153842b49.npy +03001627-12a56b6d02a93c5c711beb49b60c734f.npy +04379243-1ef656b0524b755eca6c3f11f48d07ed.npy +02958343-ddd17a0d7ca713f2291ea03049d40375.npy +03001627-780809a0d1b68f4a8ef4ac3a24abb05b.npy +02958343-8fe901ed95e115ed70a5d1d8432b5405.npy +04379243-32c78783100eac55b45b50ab552e35ba.npy +03001627-b3ef1c8790d42507d0dd5269e5b9cc8.npy +04090263-d9f1cee28bd9a88c2f2258791e7c116a.npy +04379243-b86e23bb0a3d337ef4b6538438a0b930.npy +04379243-c3b49ab37876c7f219fb4103277a6b93.npy +04379243-2a44569c8ab6ea22f222df538827afaa.npy +04256520-5d6a4faa40dd337826fc8d57346a2e4.npy +02691156-7977f492ebf2c1d5ce78be835f7c74e3.npy +03001627-d80ea722df716bd0b15194162f658e87.npy +03001627-76767a15f8de108975907ca70d2973a4.npy +02958343-79d4876cf799516b977b27045b1d8055.npy +02933112-3bc232700d2ed20b89a68decc32d3e34.npy +04379243-f89a468c302c89d9534fa06200d07790.npy +04379243-a4dfdf3529355cd934fbd63590727729.npy +04379243-f34a17d1b45ccc541763ab8766fa2282.npy +03593526-8ba355a47e0dd19c491effd0ae881ea.npy +04379243-711b4eeae1c12b77cdd18be3aeb2d66e.npy +03642806-f5fc954736b06be15fd06491ae919ea3.npy +02843684-e49629ce9c305ea6c725388bb41d64e3.npy +02992529-ec549f2ce1fd9acb634c1ac38a055513.npy +03636649-a90fe01c3ef3ee30fcb8d8c6d4df8143.npy +02958343-906e1969f7974f85977b27045b1d8055.npy +04379243-a6ddbd0556f5de20c64b3fdd6a5588a9.npy +02691156-71ddef945e2ae8de7d64cad20089f027.npy +03691459-b865f12d17532a3fdb24fbbf172c2159.npy +04468005-a41ec8a882ece95956055ed8cb4119ce.npy +03001627-387a0509406a8653b40f0ac0fb9a650d.npy +03467517-b58fa1227a9dba7941e721059b25b8b8.npy +04379243-33d18dbc04c4fc02e76bc197b3a3ffc0.npy +02691156-65d7ed8984d78a797c9af13aaa662e8e.npy +03948459-f6fde7ed3205f66bc440ec33c5d16292.npy +02808440-b7f3c33d4cf8d2fd191c3762b497eca9.npy +02958343-6e25d6cd4b112d0654ed192f2298faac.npy +02958343-e67509fb6192be6a7e7e5ea49ad8e45.npy +04379243-c582922f61a11b1ae76bc197b3a3ffc0.npy +04379243-64b2121e41762bd47954eb05bbab463f.npy +04379243-f0617cdf9dd8ece3d838ae16242881dc.npy +04530566-293781c9bf4f6168c4ff53ac1cae3d62.npy +03790512-780767b19b3201fc80ac3c28ee20beb9.npy +02747177-b51812771e42354f9996a93ae0c9395c.npy +03624134-6fbb80c3ad257a0bca53a8c40217e117.npy +02992529-1c87049d11292c5d21e2fbffea258ad5.npy +04379243-f48e40d7f7b07b8ae0c7300d2b2cc1d.npy +03691459-2ab4f9bbdc17d9cd618e9d35559b7aa.npy +04379243-cd09a9641ea97d873823cce3247aa03b.npy +04090263-498b4043ab8a0675e19905e7053d006d.npy +02691156-bdc5360ff3c62ed69aa9d7f676c1fd7e.npy +04256520-db09115f98ebf4bc20768660cf080d12.npy +03001627-741db054bd52c8884733824eae5cd9ae.npy +03636649-54d9556d51287bb470a43c2d978e502e.npy +03001627-501b15f5ff2152e5f7628281ecb18112.npy +04401088-8ef2182a6f91e71e7877a964f5722626.npy +04379243-8d7ac6078989980fad16260d4d73b56.npy +02958343-91be65c386bafdd21aee99ace10c2d7c.npy +02808440-8399987b9bca0dd0e63a9e8397b31118.npy +03691459-c15fdc911c54f4cb62c440075d5ed193.npy +03513137-eafb1b2b77dbf8c8172c0c1bc4c72a8c.npy +04530566-f17262f7443b98de38d037116a032a18.npy +04530566-7af3abe01d2ba4ddf09d36263ac1039c.npy +03991062-5a1ce09a479b866f1ec48bc3c478566d.npy +03642806-25192ef0befdd75d291d2d0d560233f4.npy +02691156-ffef991d85e3136a9a6e43b878d5b335.npy +04256520-91e6ad8710f56cbd91d7b2865937b45c.npy +02992529-ad0af9e3dc8473296841a8d53aa30506.npy +04379243-6fd426f7cc1a2b00d5130a83cfbc8bfc.npy +04090263-5f8daf709c9d4edfd3b936925082270f.npy +02691156-baa972f48cde1dc290baeef8ba5b93e5.npy +04379243-80ad425b12c2c008738e7290b6f3237.npy +04256520-2d4bda48253f35bf52979c729a1f9cc2.npy +03001627-5da5cc7b5a6a9d6f433334f7dfc6c30a.npy +04468005-a9c9ad88e5b800ae810c01b1498aa2b.npy +03325088-b17ff4c76129d106742cb5615ada39cb.npy +02933112-2b45de8320e0b2ca55d7f0828042fbd.npy +03211117-57093dac689edcf2cd318d8b7a33448f.npy +04256520-7c4bf66c71ca90b5c2c449c0c0579ec3.npy +02924116-9f2a6f480d60dd2424e09d2b1795b9f0.npy +02933112-265521e0fc7a663259f8e31ca87c470e.npy +02880940-530c2d8f55f9e9e8ce364511e87f52b0.npy +03991062-fc24453aa13d6b2293b2b448490135cc.npy +02992529-623bc1157836ddeff8a51dbffe0021e4.npy +03001627-a45477c29f71d4f37597e1f94410131a.npy +03636649-e8c75d7c6f151e2b3d23022ce06f940d.npy +03790512-24359f14ac176b13d270caeadc60b9bb.npy +02828884-54c5e4961c97527dcb2a965e75be701c.npy +04379243-6560601e3e72b64296c50b25b74de6ab.npy +04379243-1ac080a115a94477c9fc9da372dd139a.npy +03325088-ede36d1ad901fffa54d7082b34825ef0.npy +03691459-469f794b77f3f82b5f1f3016f773503.npy +02871439-39ef7e982d00763560507fdad4357e06.npy +03001627-34b1b2ee54ea314486a1cb4b695edbd9.npy +04074963-57759e351ec76d86d3c1501c166e6b2a.npy +03636649-1e5e1ff56c27c0d2adc5f5aafedb1c38.npy +04379243-e7f44c111fc65019e76bc197b3a3ffc0.npy +03948459-752a981f2d8910a5fef144202cb2b935.npy +02691156-e06c2333068e9bd0755d33896264181d.npy +04256520-1c7c7a7b20831d699cd2678508cc27b8.npy +04099429-7fead32a8af2bf9d347bb8efbe3bdc7e.npy +03593526-75ebd17ea72f4e6257f40ff86fe708ff.npy +04090263-dfc1c3367bba345c45727cc98c29a700.npy +03624134-4fdd99c04126b0027037e93b1456fd1d.npy +03046257-31c8a274d5b80d798325b286685278a0.npy +04554684-c0a1a342e0ca945edb04615d958147f5.npy +03001627-5c95a378674a05b313236fa00fce09e4.npy +04379243-e5261b63c63b226bf7e56c1f3346606a.npy +03467517-c1d8991c3a219e335f1fa9e7c1fad10f.npy +03325088-903a72db42df53f5669f229cc42f76.npy +02691156-8d847b813fa70470bc0909d98a1ff2b4.npy +03207941-d6b3d8434fc41179db4c5469c0c1ba80.npy +04379243-a04a45fc865cb61dbfb7d42898b82ecd.npy +03001627-a00f4f424b6b4c4c19fb4103277a6b93.npy +03691459-e849b0017baa1a978a0181490cb73cbc.npy +03691459-db9fa74a2b9ae465c7e50d673f14088d.npy +04379243-c8bab1768e4af6ad5e89486951545417.npy +02747177-3886bc0f590dd5ef2056b4bd5d870b47.npy +03001627-bc75933af4146bd3fdce5d02dd243c32.npy +04090263-e92b167233273b73f4085f263b03d26c.npy +04379243-1b4e6f9dd22a8c628ef9d976af675b86.npy +04256520-901440644e396746bab0cb5a4ccf2fb2.npy +02958343-479f89af38e88bc9715e04edb8af9c53.npy +02691156-d837b5228d9c010bbe584d85bf07b4ac.npy +04090263-79e15b2cae644af4e8d3100f6970279c.npy +03001627-a734ccbcbd430e8c9eea64ae4d2b4158.npy +03636649-c1d2b20435cbeea0c0028f3b08785d05.npy +03642806-a702d347f32e0d3a229fe85eb79d32b.npy +03636649-b31c246d2341429f76c2a9de5c96f76.npy +03001627-6f04104e178fb858f7628281ecb18112.npy +04256520-9e88cb24b40dfbfb85b479b317175b55.npy +04379243-9d02362926dcb3f6951c1fffab4f5807.npy +02808440-f6f8241116920f45b362845c6edb57fc.npy +04256520-330d44833e1b4b168b38796afe7ee552.npy +04379243-48afc56a733cf916660094e03bb531dd.npy +03991062-9da456e7bae24501ffc6e457221b9271.npy +03691459-e02649d9d5ee2f26d07c55cf995503e.npy +04074963-5eacb3e90eed9700fee59de128b08a7e.npy +03001627-c960ba7a781b6fb9fb7e1f95705d8fb1.npy +02747177-208777cf36e27cdef4fb4dee5181bee.npy +03636649-2ab4c7882329710f29a42a0444436860.npy +03948459-34d72e4e5e487d9c93550d252b5c25ef.npy +03001627-9582e42453da574f37bf42a4ca375618.npy +04460130-dd36bd331fce23aa5a4e821f5ddcc98f.npy +03636649-94eae2316754482627d265f13671170a.npy +04256520-a2b3c5312188bfc2789b222a43900931.npy +03325088-8323ee8eae530a642b3e9b6eb52d35df.npy +04530566-5b88544e42981ce0a71aa3ce894d7bf7.npy +03001627-10de9af4e91682851e5f7bff98fb8d02.npy +03691459-3fe90423ef5b56386af2396cb8af8a8e.npy +03001627-cf32f38c2b6c58dce45ef4135c266a12.npy +02691156-675464537c846822aa7669713586004c.npy +03211117-e767c4f34fdce88a9c4081063e213a15.npy +04530566-54c0a11324d0ca82942dbbe2d0488895.npy +02691156-455bcf19112ebab52e78e1154b9a2647.npy +02691156-f58b4ed02fc2fd1d4e7648015fd29a1c.npy +04090263-77ef2da2754d6b82fa0021572e849910.npy +04379243-e6e92596fe6fa9c965124e7461e47506.npy +04090263-6cbf83cff8dc7b23623b64770edb4be.npy +03790512-923ce819405ae29230c72ee872e188e1.npy +04379243-883f5e54f764056f6dd4165bd7fb497.npy +04379243-e4e30282a0089a5bff06c5af4a0771d0.npy +02691156-56fbecc11e62071553a6ddb5892da51a.npy +04379243-3d95c4ebb88f94b3d2f054448bd437d6.npy +02808440-88b4942caf79dc944221bef0fa3c36b.npy +02691156-30b5160e2870b7a0ac8be969b55649e0.npy +02691156-f27927b066b0696d1f95d2b537942ba5.npy +02992529-fcdbba7127ad58a84155fcb773414092.npy +03001627-6a8e63f10bd6736e713decb1a0563b12.npy +03001627-b1f50d8d41a8c53b6197fd390b16d14d.npy +02933112-7822a30ec2e5c57f59f8e31ca87c470e.npy +03001627-6d78523e939aedd482e23b5f9fd46e1e.npy +04468005-1ceea57dda2812282ce211b1462eb07e.npy +04256520-fd2c3219b28d98768dd711af5650bdcf.npy +03991062-aff6b11c514f2c07f9aec59741c69cf7.npy +02958343-47aa50eef6b59ddbc552d162ae439d98.npy +03624134-539ff9b2a7a0329e759e4c424bcdaafe.npy +02876657-fca70766d88fc7b9e5054d95cb6a63e2.npy +02958343-6dbae14e481e8fb9333e0bf0b765fa12.npy +02808440-691d75148d42c03cccd0340812259a39.npy +03001627-91cf38c4b99d75374fa746d16faad4f5.npy +04379243-83a2a5dfe03a2be1b2b755acb296d925.npy +03636649-1c2327fed3930660177f2a3a0c71fbcd.npy +02808440-70b6ec39b993a7437a809fceb352d42.npy +03636649-f4994cf967f3407ff47b2ae6b11d6f43.npy +02933112-b6fa01c7e28a4a777024462ecce15220.npy +02958343-89765af115d9a4955591fcdffe729c55.npy +04090263-2edfa6fb67b14cbe6659d9c9bcbf8054.npy +03001627-2060f4d31feb73dd7762ba3a489df006.npy +04256520-7e1d225f13bf40d0d39e33fed94f56ef.npy +03691459-cc88df1c3cfac12a99db62650613bd48.npy +03593526-8c1d8325da907adf51f77a6d7299806.npy +03211117-1a9e1fb2a51ffd065b07a27512172330.npy +03001627-736630a749935489f78c99506bdaf97d.npy +03759954-738c4d765012dec0c0038311e9d5344.npy +04401088-a698b67778c02fcb5a0a15c8380e928f.npy +02691156-b0599ecbf78aa615a8e091cb544689d5.npy +02691156-596cddf6fbdc9d6b96212c8f6cd06e.npy +02691156-261093138afff514d8d7812d176664b2.npy +03046257-cbf19a9c2a47ae354b3c42e318f3affc.npy +04090263-4ae8bb7c50daf1352e4df18fcaa65e04.npy +03991062-ce15f18c40d5cc66a2c59a4d90e63212.npy +04379243-c7b8f5ba396c07331eb51344489c49f3.npy +02818832-b31dbe37497a7fd3812729af89b046f.npy +03001627-d16b62da42fa61f0cbce248a4e686c70.npy +02691156-ea1aa637a6cbe7b4fce29e20147f9d9e.npy +04256520-9840eaff2718fe1214038d588fd1342f.npy +03001627-b6fcfd4f7af69e1ce8f8c11a24c52ebb.npy +02876657-bcacdde81063a5df30612f5c0ef21eb8.npy +04379243-adcb67b58024afb99910b7ec4c4e599b.npy +03337140-8fba7de21910dcfc4c3aee8e9d3a6ffa.npy +03001627-a682c4bf731e3af2ca6a405498436716.npy +04401088-ffe8cc1d33f3fb83d954b120b2d50f0f.npy +02691156-e0b5c450de6d7fe3d87c63d8b3018b58.npy +02691156-ce827e4c857d553f71d03b466c72ce41.npy +02691156-3fb3fa76a2e67bae71d03b466c72ce41.npy +03001627-95ac07c8c517929be06a9b687d35bd76.npy +02691156-ba662ec78231c493252b4f9439ef95a6.npy +03636649-c78a8f317896b79f51f77a6d7299806.npy +03636649-34a9c2b926de1db2a50b88953d263a42.npy +04379243-956752510546d938788e70128ded264a.npy +03761084-628ab6e5d0cf78b8931f48202f034c81.npy +04099429-3e75a7a2f8f602df390a81c7a00f98eb.npy +02828884-ff7a08ac16701dcec0277fc71766d822.npy +04379243-99f15c63712d9fbe84868d3618d73011.npy +03337140-30aa30307b5c651f4c3aee8e9d3a6ffa.npy +02958343-c12a701bbdcb3df7473f10e6caaeca56.npy +04379243-5c4557a826e80297490ad276cd2af3a4.npy +03593526-3ce0e5906686042c939163818f3c3007.npy +02933112-bf4aed04442c31e4f759a9b042055cc.npy +02691156-5aee97ad467ed9d75fe4b20a3aaa51a2.npy +04090263-c513665dbd0d0606f85b811e02bb4272.npy +04379243-7e1f5ec947e7587e391e4d6c585a697a.npy +04401088-44cb63b74117f9a77877a964f5722626.npy +03797390-fad118b32085f3f2c2c72e575af174cd.npy +03211117-40c53f54e7fb0e3ff4c409c17e0a5165.npy +03691459-9d0734e39f06529ac0cc451921109913.npy +02828884-8a5a59ab999c03ccfb0eb7e753c06942.npy +02691156-1d5beedb73951ef68649ad8da70da1e.npy +04379243-39fb0260d1e669bed0037f03195bf42.npy +04379243-27fd962813feeb26be25fbd47cafc694.npy +04401088-96f4e3797b8e66042b8a15395c060463.npy +03001627-ee001ffa8483ae1b7f0e458a1629fd0a.npy +03991062-1ecef53ddd34e07d78caa162a41a851e.npy +02958343-fdb16a8648016157994a3466f8481f8a.npy +04379243-9a0f67133d4757964ef2fc89218529a9.npy +02828884-4d38a3e7f051446a9b5ae2fb66e1e25c.npy +03337140-4791327c6e5d0ce68962005ce0e986db.npy +04379243-3437f0ce3933d664842f894f9ca76d59.npy +03001627-e09466e9c122dbfdf51f77a6d7299806.npy +03001627-ea6c45a1a6accfa7201a419fa3bbf2e4.npy +04379243-6c9ab42a8e028b103fb0920a55a7e805.npy +04530566-14241942d79f89226587cb13c78fb9b.npy +03642806-645a52293092eceea37e4476f3cf2752.npy +03636649-629f9f656b05ee62ac280f441d6450c6.npy +02992529-d3dcafb368c1defaa2c7c5886f4bbc93.npy +02880940-fa23aa60ec51c8e4c40fe5637f0a27e1.npy +04256520-8c03e6ea484108bcfebad4f49b26ec52.npy +02691156-6f0ad1fb7917fd9b50577cf04f3bf74a.npy +04468005-68fa56bae19b6cc32b97ac865c3ecf8d.npy +03593526-f93f2a0590a805da30f549f12038e49a.npy +03211117-f75d1962eb04669a164790a64bab08f0.npy +04256520-5e9e4d6551b775d8cabc196a7f35f1aa.npy +03691459-e5012f54d03b863ecfd43bf63e641a70.npy +02958343-25c292692638406620f29d4da2b76f7a.npy +02992529-6609f05bbe9c49172cf708d3028fb325.npy +03001627-483cfed0659965ed73c478529c40c4e6.npy +02828884-5125cca7f42b90b2ad5067eac75a07f7.npy +02958343-e7add7a018da8056bda733a39f84326d.npy +02691156-fc7c3ccb57f65337209009cfb89d4bd.npy +02958343-33f95e59143938ddb490a9cf145bf702.npy +02933112-4d97127bea831058b26ee99f2f592682.npy +04090263-d4312787c89edb399a6e43b878d5b335.npy +02992529-fe553cf733e29a349426aa93c5c54668.npy +03691459-98cff6064749a5f3e746404352385716.npy +04379243-11fc4731e38789e0210283402c81dbf4.npy +03001627-86fc0fd9ed51dc11664b3b9b23ddfcbc.npy +03001627-6b8c5cd585ef8c67ff2b8acf844d34d2.npy +04401088-5a37ad3759b4d93df843a7d4732b1d6.npy +02691156-157936971ef9b6bb858b20d410ebdb99.npy +02747177-7b407dedd933e3812f59b845f0db2ab3.npy +02958343-9a22505d1e6221533c35e65001c8c258.npy +04379243-609f064ea48440645d8fcbc36a5e8c00.npy +02958343-5d381fb0fcb9ec3f3c2fa80e345b3e7.npy +04256520-fb859910000d1e219b709c9b379c59d9.npy +04256520-500fdf3d6ffbab95cb57ce1986fa546e.npy +03636649-1a87883fd4f52527e21c35aa7a22a003.npy +04468005-97fad8d4386e8be41183ae1f57465c4f.npy +03001627-e96c3df69c2a6fdee7e684d25d4dcaf0.npy +03211117-3f15446861936b20eb1a50f8f2ea3a88.npy +03636649-c05cc9636722504688e7662971dc736f.npy +02691156-cc9b7118034278fcb4cdad9a5bf52dd5.npy +02828884-e25c7c2469135e3fdd3adf3090c701f7.npy +04090263-d90fda1aec4042ca42b011d8a1631bd1.npy +04090263-41a9912bfe0dc96239169e4b52d9f093.npy +03938244-530cc7dd793df95f8f5ae2c97614087a.npy +03991062-9a5019501c85aa9c897534402e0f40.npy +04379243-b6884eb4e95d851b5f606243e56be258.npy +04090263-96b74853ff1d922f42d160994fd6c822.npy +03001627-ff5e8226b88c6b95741cdb62023d6a2f.npy +03948459-ac5baab43d72fce2771f90a41c66ca88.npy +04379243-c3c635d741fab1615f0b5ee0fb357b4c.npy +04379243-7c2fb7a6dde6be96bd5a65d923c337a6.npy +04256520-c1ae15118f856e5e3759b16de9b6963c.npy +04090263-1aa5498ac780331f782611375da5ea9a.npy +04379243-dff5b7cb4f72def6641f7a370ac2809e.npy +04256520-fb835879f66b7b95c43a4855019be9b5.npy +03928116-8678ed372995f6e49d1512864d95af6d.npy +04090263-27937d4b55596d689a2ee232a197081e.npy +02933112-7bd5510b4451cb651d6ac856ecde9eb2.npy +04379243-d9994cf6d5d444379dbfd5cfd194350d.npy +04256520-a3eef12c108186997b9a616d4541ada8.npy +02958343-c42f9dec04f0fb3151a95aaa6caba1d3.npy +02828884-3e323c2a7e5ea5dcbd4364391061cfa2.npy +02992529-271421566061988a93d9d97ff82834ba.npy +02933112-4e217d2ef816a08251c4deb11af7079e.npy +02992529-d8071a38bb3dd8f097c8d78b9aede742.npy +04074963-d393e6667bb949b74ee7c201cd897ec6.npy +04004475-1eb2eb87a623d9422d24866ea0018e08.npy +03001627-77cf056c6beffa5e3b6eb1ba4e121206.npy +02691156-86012cd0bb6727e9e80771be8faac585.npy +03001627-524bfc8159111e4571697d26793100d2.npy +02691156-5f8fa607106199e7bd46d022fd7d80aa.npy +02924116-4c13b5050aa7fe24ad3f75ce207a0bf.npy +04379243-a1cc1745e89098913a4642fe4c259750.npy +04379243-3031461b84576d7d6a69760cb58e50e8.npy +02924116-ced158ecd466c371d53a1e636a178955.npy +03337140-1bf8e2a98e2ab4316bdc8a5dbe375ecf.npy +04379243-90d87b4d9a5a1e78f4b6538438a0b930.npy +02691156-143326cbe409ca9f62048be44e1fa435.npy +02992529-e8d826158072a6bf1455397a420729a1.npy +04090263-7efdd44bf9d6ace13a653cb492d78488.npy +03211117-5fb06d76ec44a16bfa6dbbeb09c2f316.npy +04401088-7ba45cacce4b4c09c7a217851f86faa1.npy +02691156-c476ac72594e39ffbd46d022fd7d80aa.npy +02828884-9d56087c9f98bf90717cca22daef45e7.npy +03691459-6d070eaa65ffa57193fef5a7dc080ac7.npy +03467517-6602c186baded145d57700c05b1862d8.npy +03001627-72827d33aa4e3f54d8ce2b7ddb5bbcea.npy +02992529-933d5c217d9c01789daa2bf0c68f794f.npy +03513137-c347db0e6df5e11efbf020c099468179.npy +02808440-faf3f0ab58eb18d263f5120cfc7fc76f.npy +03691459-e8dd60afd061fb273ad55e05c29c23ee.npy +03001627-2fc2b897b6b131c4dc75a59e280f3bf8.npy +02691156-acb99bd964b1b23ad13ef00338ba8c52.npy +04379243-eca9efad6364021cf42a90fe4baf4591.npy +04256520-3f8aba017afa6d94f78aa2d67f081607.npy +04379243-21e8c818e9d517f919fb4103277a6b93.npy +03001627-7b4dc28c2d3268a09af25a2e608033f.npy +04256520-336fc8a43b3120932c48d6b905457dcf.npy +04379243-6124096fd3488b7fbbc8ef3196ea5fd2.npy +02958343-9446a1c34cc06eb518b1741f84b73b.npy +03691459-a31ac0bd8915d99631c992914b89bc52.npy +02691156-d171967c6353177bb87697d3904b168b.npy +04379243-14786ae920496ca7197c43c7dc584772.npy +04256520-3a693ca4add94bdffe1db2d0679386ff.npy +02924116-8b44b2dfd3de8e638468bf2aa02981d2.npy +02876657-3d758f0c11f01e3e3ddcd369aa279f39.npy +04379243-54807aa2b0f646a448efbbb060f51a02.npy +04256520-37cfcafe606611d81246538126da07a8.npy +03948459-434a15053bf9d88c670144fdfc186d25.npy +04401088-d6120b12aca39e73cdbe8a30cf95821.npy +04530566-68e60ab321e4198ab437d385637c4e1c.npy +04401088-983b045d30322f96b102e855af58e521.npy +04256520-9473a8f3e2182d90d810b14a81e12eca.npy +03636649-f4da1907ed935101ad5d0d05865f4466.npy +04256520-5a419dd9295d84c538ae0e23b03ac623.npy +02933112-bb741a003e5ff46c59350d819542ec7.npy +02828884-57678bef578b487a738e43095496b061.npy +03001627-11c7675a3dbc0d32f7287e3d21227e43.npy +02828884-6a3bc6b44ba974b69c0c9824ccd078be.npy +02828884-61cb827012c745e0ba29d2aa241f8fc2.npy +04530566-1f846bab69b20a23561fc06c3ebd59d2.npy +03001627-f5d8dd0309401ebac47a35332c17cce2.npy +02958343-fabcb04fc015f822ca8bf2993ca245b.npy +02843684-c5a9713e045f91363c04c1aafcac3ee2.npy +03001627-f0f9048f45eed1ab3a8888e78d004b3.npy +04379243-6cdb79b485d9df2dc667146eae95e931.npy +03211117-ffbe714918d982594dea158f05aae320.npy +02691156-af6b292c7857c78abb0e5c1799dab683.npy +03636649-8e2c822e2a316fa04f3443b22038d340.npy +03948459-5b31070deb9226b134c40d765f77199.npy +02958343-395d86efa3a1a55a49ddf31673a8d73d.npy +02958343-863d6f24aa1a478e569564f61ef539e3.npy +02958343-85952ffb35de9bb951a95aaa6caba1d3.npy +02828884-72d5a7338dd7ccffd7262b1b986920e7.npy +03624134-9cd61c62fb1bb4c6fe72e087f55a178e.npy +04090263-c253c204b55470eaf4e90b82ab227094.npy +04090263-5eb64afe7a276c243a653cb492d78488.npy +03928116-e97e0ec1af5c74002e20b5399bb84222.npy +03001627-2f0318b23d899a84493f17f4fe9b9eb2.npy +02818832-d8de84e7c0f8cbb19473aab1da686220.npy +03642806-39778c495baf4bd9ac41b162b25b4656.npy +04090263-cd4fe695c04daeda6d976be0196645ff.npy +04090263-d83e4e5a7957117be6e1d9f65d65c2b6.npy +02691156-724be1fb093a31a1ac8c46f8a114a34b.npy +02747177-18dbebd6527cffa254685f5f473de41f.npy +03928116-3a27071e0436ca2e5917531e67f8d3c2.npy +03211117-3f83beaa4da6209dca62ec94d15d08.npy +04468005-e981f0fedd7680cbb2faf16541f353f5.npy +02691156-95fe3a31e4c084a128132d87f74ffe13.npy +03001627-590ae1748c5acdedb05550de345b6d0a.npy +04379243-d198fccb12ad508a3c97cc6789da1c31.npy +03001627-341e18eafb46f892a6fee8e2140acec9.npy +03928116-ef398cc2782a3a2191e9393f43799b4a.npy +04379243-87fd23051b01997418885412f2b0a4f7.npy +04379243-280949332aba8b8a6d8dfe83fd00685.npy +04330267-2a5cd751b522d07dce1b91578a49ea56.npy +04379243-cb6a8ea7b323c023f046f610ef0e4e90.npy +04379243-15e651b8b7a0c880ac13edc49a7166b9.npy +03001627-2448d9aeda5bb9b0f4b6538438a0b930.npy +02924116-9b2d743cdac60228ecd77a402e690110.npy +04379243-7a2f94d95992b5716521d4b69744cc6d.npy +03593526-9998f783571e10a7d680196133d8b70f.npy +03467517-3fba85bfdb125b1b93f0194265a9746c.npy +02958343-8c01303b68d30be5b9ad5039d820c924.npy +04099429-b6cc97a892c025c07ec95138ef83ef2f.npy +04379243-34df750af2640f576d616bfd695eec80.npy +03001627-34fc767b72047d9ae97426e55fb77981.npy +03325088-7224a70801bec99c3321831d2245cf06.npy +03046257-330f2677d7ba810ed527a9a6f5a872b9.npy +02871439-33c1b4d529f6899bd810b14a81e12eca.npy +03691459-d09f0e2e33452a739d3f10ce46ef328c.npy +02958343-87020c25b9166cf11d27be7764701cfe.npy +03636649-1c05f1a7125402ea4c135b40422475eb.npy +03636649-366b8a4c8e38961597910e2efc6028df.npy +04379243-8da6fc70195d2b4029820ac1e8a0acf2.npy +04379243-7ec59be3e55081f788292be2b58381eb.npy +02958343-15a5e859e0de30e2afe1d4530f4c6e24.npy +02876657-add17b35bc4665e6f33a685c2506bbe6.npy +04004475-c88c542028fe83834454439c22a43db6.npy +04256520-e21b95b9dbfcbed28ccbec49bbc083f6.npy +03046257-8a759c2f399d11e01560641bf48464ff.npy +03691459-a3f14846404245d5bbbcb091dd094e5f.npy +02691156-74cbf170c5f2fb587d9c9c8a8ba32919.npy +03325088-7b24ed5898c4971450da8b99982a3057.npy +04530566-4464fb8cf0d04cb732c0857fb4bcf47a.npy +03001627-deb0889d902f08bef51f77a6d7299806.npy +02691156-b5b6f5ed2031f34cec7a415ac918303f.npy +04379243-b00de96484b0275a5cca18918d24f6cd.npy +02933112-97ff4614190d8cdfff05fff9845ac53e.npy +03211117-318d349c03f0926e9b72ce7a99d3dedb.npy +02691156-3ca058682dfe98f7f678b53750b6d181.npy +03467517-2a7bbcd317bf2abc5eec6d8d24f1fde1.npy +04379243-5e1ca9adfe8c6af61f8d8332ee17945a.npy +02958343-9c686d6ec470f280473f10e6caaeca56.npy +04256520-93d5203022d651c831ae8c8ff1eb3d45.npy +02691156-afc975c77f6d5a1bd23d6ce2c840685b.npy +03691459-af4a2a3b3e3510bad49b96b9f2811c7d.npy +03046257-788d32da6b0e8ebdc6df46ed5c17ea84.npy +03928116-18d4bd26fc3946c536244e3d0dd95a13.npy +02691156-12877bdca58ccbea402991f646f01d6c.npy +04379243-1acf7b0939f3eea2eafdf94e5032b200.npy +03001627-7e2ef2a1256f2dc1ebe13e25a6ad0d.npy +02958343-300c1f29d253f94a97e6e890ac2fb198.npy +02691156-1850f4acdfb738bd7456183f198fd1e9.npy +03001627-b8726f4ca171189ca858c901f3d90b5a.npy +03001627-320261e5f3835f6381f667e2a25e0619.npy +03046257-e479a6ba9b2792d59c2f1b6ea824cfc.npy +04090263-f297de88033168facb88c9db6e396994.npy +02691156-ff12c3a1d388b03044eedf822e07b7e4.npy +02933112-46a618f995c1019b15dd7d7985e749c1.npy +02801938-284c23b810fc7823466f97f37dccbde.npy +04379243-be0174f29dba41c19dd07b7af48c9a5.npy +03691459-9c5a473824505151fdd0cc0c1a7bf8f5.npy +04379243-4c809952877b2a0bde88c30a08fbb953.npy +02933112-5ba1fc89122c13c5d4a147733422d301.npy +04379243-cb7ebc943b1b424988386fe1512ed26f.npy +02691156-2c1f66380af03e4c5d1df55cbe0874aa.npy +04256520-8d8d2859338eadc7bd16d4490a10a752.npy +02691156-949acc63ad8f8816e816c75152573ee0.npy +04379243-5d45378d9d2e11ff497df23b9b74f339.npy +04379243-83a8d95b2dcdd3a854cd2a0ea6cb618b.npy +04379243-691caf9e558fa4dec7f671ba289ebd83.npy +04379243-8f29431ef2b28d27bfb1fc5d146cf068.npy +04379243-63ed1dfd7ccdb5be20768660cf080d12.npy +03211117-27e65dc223cc8bc0ec059109909662d2.npy +04379243-b8fbc4e32270751830bbd4cddd04c77b.npy +03991062-bfd7c0ba3d690291271666a0c21c3f2.npy +04379243-6f5813533bb9001dd24546afc5de2582.npy +02876657-289b2ca2562277a9ca3fbd0e4ec160a5.npy +03001627-74d4b9b13cd160e6f51f77a6d7299806.npy +04554684-ccd7d621279425b8d1b2557b80a0d3f0.npy +02933112-6e4407e2b40dac9eda9c49a653a829eb.npy +02828884-69494ba3ad8569aded98cca8f0ccd5f7.npy +02958343-579bc3731a8a25f7c639b4cb04d4d746.npy +03337140-c0e291566ec3e3978aaae3d020f5ddf8.npy +04256520-e16abadfd438100b65569474a61cabc5.npy +03001627-6d270bd691a168f48fa2f6eb9fb1de7c.npy +03001627-a1cbd161f91e80eb450e3da30d6676cd.npy +02691156-1322a9cabb1517219a6e43b878d5b335.npy +04379243-7d9073ffce209233865f763ab6e6778a.npy +04379243-91e7dd99a4c945f9dd03ec353c1af474.npy +03001627-2b783fe4230af5436a7b680929b3b0fb.npy +04379243-bcbc5e30e12a58f07ea323bc74055b8.npy +04256520-de55a935ca4af29649a92ce7de587886.npy +03001627-8dfb550d8fc07ebe490ad276cd2af3a4.npy +04379243-f0990151fa433f1498cfd47a860803c5.npy +03001627-b5877df9f111bb91222f2fee97f8bdcd.npy +03636649-3bd57e05db01e224e7e684d25d4dcaf0.npy +03624134-508b292d7fee30b0cc34b900bb2492e.npy +02933112-bcee1a76f453723c4cc1952ae0d6e81a.npy +04460130-6cd9f0f548979d5160ddc468fe733ed1.npy +03636649-b1e552b454366a9d7787152e5befb05b.npy +04379243-4a310db5ebe11142eaf288f952624966.npy +04256520-cf2e145ae0b8923488df69d6c56c6047.npy +04090263-b28220a981c84b25427e47767269c4b.npy +03325088-935514d63bb8c70e3321831d2245cf06.npy +02691156-226e3f0a844a3b4a77fd7318510b8627.npy +04256520-9c103621101bcf9919fb4103277a6b93.npy +04256520-b33ce45211c0950e3ca067e8715715df.npy +03636649-e062fc06dd5e0e01469ef73f4f6c51df.npy +03001627-4a672cf09d7fdb7c83b06dcdd869d9ac.npy +03211117-28ce23d5e56e9afa8fb952c92850e1dc.npy +02924116-e2d650d6572321281ab9df4be75138d0.npy +03001627-5d5e887b9479de0ea9bdc22a1e02e82.npy +04379243-712d2c844d61aa9cefead98a255f706f.npy +04004475-6a5612fc6e4c19f65afcf0aaed5d73d0.npy +04379243-f7574c55aa4d5c80cba9caf4d254cef0.npy +03001627-17883ea5a837f5731250f48219951972.npy +04379243-307bc4f0db5cb0452f0ebd444c10bd0c.npy +03593526-256b66cbb1bd1c88b2cb9dff9356b165.npy +02691156-41acaa4d19dbdca75ad6eb90e75c835d.npy +03636649-5038edfd2c36fdc1bf1911e2d5611e35.npy +02876657-b2507913d631e8b8bcfad79fc308fa6d.npy +02828884-2fd70e9049377e22d4d8765e3910f617.npy +02992529-86fc58a0c40316f2562c8e1ac545ef78.npy +02691156-3636483aff4b7977b7d7aa9b9ebcccb0.npy +02747177-64b0698f21be2061fc555f910d0519eb.npy +02828884-77323ba74273cfe017b431cae0dd70ed.npy +04554684-58bc4edaefdf3b0e1db42cf774e49bf.npy +03001627-b998016472e9dd7a9b9f2eb77f5e247e.npy +04530566-f5217865935d63c61f2cd7f4ede43a74.npy +02992529-fe34b663c44baf622ad536a59974757f.npy +02691156-2bdf8800514abd05a7d2c4e7aae73d33.npy +02828884-8def49409282ccd4d8d8ba9872cc7fb4.npy +02828884-f2390f9103195622ad5067eac75a07f7.npy +04379243-cc5b638d81529dde3c2e50348f23d3d.npy +02958343-f4da249169898dd915212cd62adf957e.npy +02747177-1532546ac3d8a2cff155d75bbf62b80.npy +04256520-628d837b3c51f539dd97e8e261a01f65.npy +03001627-b2968ca25d2e2fe0f51f77a6d7299806.npy +04379243-1fb2be490f45ec6e19fb4103277a6b93.npy +03001627-70230673214644cc7954eb05bbab463f.npy +04530566-7fbdbc374263bc0e44fe68fe7fbc12cf.npy +04530566-8e7fd92d91a9974a2d220e1baafcedd8.npy +04256520-6d32f20579c9f422843ead12644a79bb.npy +03624134-6566d89cf6d6075c955a1453af41c99.npy +02958343-e67e3e3a21393927df59757e1209f2c7.npy +03001627-1f501c5ed6423e259c89c86daa5af59d.npy +04256520-21e0ce3126c67610c397356311cbeea4.npy +02958343-3d358a98f90e8b4d5b1edf5d4f643136.npy +03001627-f34a4514f72a3a767c11a4098d0a0259.npy +04090263-7864fa7de2295d33e6e039bfb82a52e6.npy +03001627-f1fcbd856669e000118128b8b252e07b.npy +03211117-60e6ee2c3a2aa3fd6d07c55cf995503e.npy +03991062-c4e339d4ce70c55a6ec7369fb34c68f9.npy +02808440-5c77eba7135d8703b362845c6edb57fc.npy +04379243-50fb47768cfdada29f2349486c570dd4.npy +02871439-5c600328b252bf051da287f87237ff38.npy +03211117-e52ef251efe783ab9475cee1777b2299.npy +02691156-366b149545ba4df546ed10e8f7fe336e.npy +04256520-dd375d24e534101b33f2b52ebeafcf18.npy +03211117-38517a97e7eaca1cf801e8fe8a186462.npy +03928116-95440fc9b3fbb5fb1d4127b3f0e05b90.npy +03001627-7f3562432f02b8a897d3ea932731fd42.npy +02958343-cd7feedd6041209131ac5fb37e6c8324.npy +04379243-8ffcdc51a930bc408964093366ba01ab.npy +04379243-1a05bd57d0ea709e7d3ba54b9bdaa55c.npy +03211117-d1b3804c23311181f361255e85d5896f.npy +04256520-1aa509f3d8c1d1e46bc58b7f28700afd.npy +02924116-3805858e0567994041cefd10ce5d6cc0.npy +02808440-617e1aa8b3e05d49bb6226644eb475ad.npy +03211117-1dd3f80712873a638f6095a93258c867.npy +02933112-3297041a1a8de1d3d0f3f1f5f6accdb1.npy +03001627-e2ced471afce616454bfa32aa0766acb.npy +03636649-721baad382f73c46fcb8d8c6d4df8143.npy +04256520-ed90b3d1d41c46a82b09cb731e7a040f.npy +03991062-d6154a1c8df6a464a3b06ba374e12b77.npy +03636649-933176941f95f833fcb8d8c6d4df8143.npy +03467517-887c39981c4cfef661cdd121f4738c70.npy +03001627-a241ab0fe7fbb1f41dea5e6084523ee.npy +03325088-1554a9af8847c2bf14b35a7d7cea7130.npy +04379243-8ad152454e2f1663cd701e9c04d3cf7a.npy +02691156-8ceca54101f96a96d972c9dd75ed77d4.npy +03325088-310875f409f511ecb482922dfbcdcc.npy +02946921-70446b4dc6649d0173c0d206b70af93c.npy +03001627-30d93191cb91f8ece6c5cd45aa112726.npy +04379243-20ca7b1864d7badc75bff8d65bb29152.npy +04256520-33bfb06af948d3415cab680ae8f530b6.npy +04379243-39b90508935f0118dde86ae42c792b26.npy +03001627-c1b64fef5f3efa0a129905ebfd12d5cd.npy +03691459-3636ebcd2e5568616bb15da9e307a14.npy +02691156-9d72d4ac799977bb71d03b466c72ce41.npy +03691459-ab5c8c38528f06daf398d0c5832df00e.npy +02958343-2669bd62546a8c8176ad064d1c5fdd7c.npy +02828884-1b40594ce6fa66ca35028a2641239f56.npy +03001627-58a7b826ed562b7bb0957d845ac33749.npy +03636649-c4dcfcc8c434f13230584014222e685.npy +04379243-5f0c33039269b7a9f0e84b9d9ad447e2.npy +02958343-560cef57d7fc0969b1bb46d2556ba67d.npy +03001627-a85ce69dd5aa852055dbece39a4b7905.npy +02876657-d829ffd1d35f36a61ad51dad4e9c1543.npy +04379243-1dae9ed6781af75f6675521fa630312c.npy +04379243-8770701a1d5cddb9def21b8ee4b159e4.npy +04090263-9fd0c3cd4a6a4afeb8d88853b13ee149.npy +03001627-75d28a98c151cbe678d2ffcbbc0020d.npy +02958343-3870022ab97149605697f65a2d559457.npy +03636649-f2038cb9bb9438a6c790d7efcdfb5239.npy +04401088-19208607cafce17dcb85f279c97d4c5c.npy +03642806-19117e74b575cdca82555f4c45537277.npy +02958343-61f4cd45f477fc7a48a1f672d5ac8560.npy +04530566-cc6656baa69ba0defd40bb12da2df97e.npy +02871439-5a163a048d89f667731124f40d99e6f.npy +04379243-4b1ca7263ad178f8bed8cac5da4f54bb.npy +04330267-917676329f834bed201769e59267569b.npy +04379243-85db937f27544f5f9f23b3819daf3902.npy +02958343-4e201189ae860008bc1bdcb65bf3d926.npy +04379243-f88d344aa47deb52276813f95a6b7283.npy +03211117-5530382ad4ea8b364abfe5850a7ebd07.npy +03001627-309674bdec2d24d7597976c675750537.npy +02942699-a4b0c73d0f12bc75533388d244d29c5c.npy +02933112-e47b9d0905d05d656fa63795f94c4d8c.npy +04090263-9bf95da67ffa58213a653cb492d78488.npy +03211117-792839c9e28f5afe4edf4a0df1fbc500.npy +02958343-923007b377bb1cab473f10e6caaeca56.npy +04530566-410c336c78ce00ebe2f628ca3c07d462.npy +02691156-b8fbf59025f18f1ccf5fcd318778a0ea.npy +04530566-1442afdc0aade741c46814fb26e284d4.npy +04379243-f44c91626e4900a5a26aea0642029fc.npy +02691156-b43165635fa89eb11416125fa4d8926a.npy +02691156-fe266c740580c102ff9ce0c50c2cd25a.npy +04379243-6ab1ece006f03b9c955e5ed03ef3a2f.npy +04379243-af953537017f49351e3178ebc750d175.npy +04401088-23cf8469ffbd93ff8faab772f03eba4b.npy +03467517-1904d163ebaac00722b42f314feaca43.npy +02933112-a5b61e473c6ceef9f51f77a6d7299806.npy +03513137-e3d98ac62469795b20f6e48f6a30cbf.npy +02958343-56d463162ff5352cbd835ce3c63f4d10.npy +02808440-3358fed603caf82bb362845c6edb57fc.npy +02691156-d6ca5966c5ed5b86da2b0f839aba40f9.npy +02933112-a55b6196e3402ba340789cf33f2f1153.npy +03467517-c8010d22e39c2f0c2b996d5d44e09408.npy +04330267-411079245246f35841965be83b7745a.npy +03001627-4b366b7995cd8d7fce4f274577283b16.npy +02691156-db73a3c857949f469a6e43b878d5b335.npy +04004475-c8ddeb1636a1c90ac327bda7ad667fab.npy +04090263-23a91d141cd1cd36a9405d5e0b8196f.npy +04379243-debd11754f993031eef3a45c2f31a227.npy +04401088-ba9f7bd05d6f028fc1a1659eb4f57afc.npy +03001627-d27be0741f13327efc66b92945eed242.npy +02871439-18fe362284ba7ca4d810b14a81e12eca.npy +03636649-77a7d38645738e2212c5719ce6179.npy +04379243-15ec20de98359ec88de7bcb173109d60.npy +03636649-e35009c75fb246453f02f5b8959142cc.npy +03642806-80f23c80d8d050db169ad157eae2079f.npy +02958343-494e45d11299de95c571e4850ce1413.npy +02828884-77597f34b5f37c5e7a403ae58647b271.npy +03046257-9cb8f60044f2f2e014038d588fd1342f.npy +04379243-67b25a96e4a0f49bc41d4e0e25295960.npy +02880940-4227b58665eadcefc0dc3ed657ab97f0.npy +02691156-63c63aed97f15526bbf3143b1cb6076a.npy +04379243-fadf4f0b608be6272648eaf710bc2c44.npy +03001627-cadf69f5353039e8593ebeeedbff73b.npy +02808440-4aef9fc6633010a927b4493ee0c4db3f.npy +03001627-487040c5fdc68fdfe6cfc789522bfbab.npy +04379243-9dcda566c3265d2784868d3618d73011.npy +02818832-a6635de3c4a0e934b822d48a43773c62.npy +03467517-95b6d674bd840b674817b69d2797a90d.npy +03001627-583deb9e5cf939a9daeb838d0771f3b5.npy +03991062-f47da3a419cdf600e01d7dc978602402.npy +04379243-8ce70dead5119191cc3492a06e9bd850.npy +04256520-ad5ef1b493028c0bd810b14a81e12eca.npy +04379243-aa6cfcdad80f0ea961e8d86dc5569c02.npy +04256520-bd088259c8ee711c3a4642fe4c259750.npy +02924116-1dea3af9695415f71f6a5b0146bf3030.npy +02691156-557429a274a21e1e6a257cd6bc529741.npy +04379243-97779400c9a7a15e3c7dffee9c6890af.npy +02828884-c0840a82cd05765c924bf081da6f024c.npy +03467517-fcab134da044e5fc77f469126771fc30.npy +03325088-bb428566c6138a876c18e71fd49c4dc.npy +02691156-2c97e6b2c92913cac1ccec171a275967.npy +02691156-a04d10b24ede5e9a3de778e85611513b.npy +03001627-c29f439d92c7ae8d6d26324fae5ec3af.npy +03642806-b3a2081fc19c7bbac241f229aa037cc2.npy +04530566-9fe579f5bc52735cdef1530f49dfe050.npy +02691156-b702e35f4a59e81f64801ad2940cdd5.npy +03691459-ca052c8db0c94fd345189af3887d3c51.npy +02933112-c28ae120a2d2829e50e9662c8e47fff.npy +03636649-9b579915b883bea042a65b86449bc7bf.npy +03636649-1fa4508dad05235a7d3aa3bae1f7b494.npy +04256520-c2a8f4c920b6f7c24097c269bc92f53.npy +04401088-8da5c29d14a1003d23247d005da93d43.npy +04090263-4c5a984272a922ef94a57adad86ebb52.npy +04379243-aabcb5d610e76ff19ca02c396af0c503.npy +04379243-29ec54b06d35acb2027cee422df2aa3.npy +03761084-b6f8be7f5c4a97424a44340bf227e40.npy +03211117-810fac004670692fe9d7a3dffbf25100.npy +03001627-2d711c85c60a0785c3bd24f986301745.npy +03001627-67017c046fee2900d09b414c3d8c49bc.npy +02880940-b5d1f064841b476dba5342d638d0c267.npy +04379243-6a8df7fe3bed16f736ac40071701c687.npy +04256520-f4830a8e2ba2c531b18ea2be5fef7826.npy +02691156-62fe06fd4f1b390fa9bcc7eaa4032fa4.npy +02828884-2fe40aafbefd99a9d2b12aa6a0f050b3.npy +02828884-87783e267a4db70044a8a9dc66c6c095.npy +03046257-fb95a457d7382fd5902df966e52b1aca.npy +04379243-ce4e075487aa05ecdcfcef693e7ec696.npy +04530566-4d95b6e392c9d95981e1e9063401fa72.npy +03001627-a97e09489b46f7492933f312813ce997.npy +02958343-30c86c4764df9f795686045783681fbc.npy +03001627-68b26c9353e65419c3e46f55b34610cf.npy +04379243-dd0521f27114171e492d9da2668ec34c.npy +02691156-172e23ab5b4d189566cf1b4a8fc3914e.npy +04256520-21140988a7602153f05a611b5fe35f32.npy +03691459-8150d4e919381c64e1ecc02d6acf021b.npy +02958343-dcdee01d7fe6e1a76ad064d1c5fdd7c.npy +03691459-c8a343f35b8593981ce8823e87f4a7fd.npy +02924116-32fd2bc978defda79aa320f2e657a09e.npy +04090263-5d461974aa75e99fd88db40a5e607f21.npy +03691459-8a536e4254674fbb73e1b2d018c0512.npy +04379243-f7fea253245d97786c02d42bfa6c5667.npy +04379243-a15f31e2302f6ae5d67a73ffd62ba73f.npy +02691156-15ce56898a636466afc526de59117398.npy +02691156-7fce28d597b3137cf24f8f5f80968450.npy +02691156-f6373cc88634e8ddaf781741e31f0df4.npy +03642806-7766bddc0cc89e4234b8b727387e0b56.npy +04379243-1c1f65cac6bbd1e15dd7d7985e749c1.npy +03001627-7f647aa4750640fdaf192dd05d69c7a2.npy +03001627-6d4ce042f204e89db413bc67c6e4035a.npy +03325088-5ba4d7ff5de1e727c36fb70296e45483.npy +03325088-d8baf610ba6cc3cf3321831d2245cf06.npy +04379243-72bd77bd74cce09cbc6a236746230424.npy +03636649-433c55dc486ff83398b2240479533a01.npy +03636649-bad7893ac164cc44a43934c3f4e340d5.npy +03001627-183974726abab0454aa6191ddaf4b676.npy +04379243-55457cc3f0e7d0e06bcd32c43682e841.npy +04225987-a34d794cd11272512cba79096b49c1aa.npy +04256520-e78c23ab7426227b4b3c42e318f3affc.npy +03001627-3eb60e6679d1df1dde7eedbb2790491b.npy +02958343-768ea3241699f663f1cb19f636b1c2bd.npy +04530566-e0d1f833e8dc5c604947b319a9e09fd.npy +02747177-45d8951ac1dbf2cbf51f77a6d7299806.npy +02691156-56bb8130f49b481e230ac8907b9b7f90.npy +03467517-bd6057c7ac1ef31193f0194265a9746c.npy +04256520-317850f9c80cafb561bfbba8a5defb02.npy +04256520-e4ca81487385c5f490ad276cd2af3a4.npy +03001627-4b1e09314ecc02d53c8d0fdfb1cc2535.npy +03691459-fc6066741f5b60e5280e0c1e89a63998.npy +03991062-29a8f4b92a1702f6ba14bfd91a75020.npy +02691156-2cc1ff07bcb27de4f64801ad2940cdd5.npy +04256520-a7bab06221eb932e79c251b4a7838829.npy +03001627-58b1c10a6e1d67b3b0cf2e642b746bfb.npy +03001627-ffa6c1a509986a5676708f8dec712a28.npy +03691459-83cdedb3431e8d8a41c95631f0cd177d.npy +02691156-3fc5fb97d23b6bf111f78b196c636566.npy +04379243-8b2c3c73b624c3faf4b35f4029eb1ecf.npy +03642806-5b5247b13d5b21bdad2954b86711abbd.npy +02818832-20b7fd7affe7ef07c370aa5e215a8f19.npy +02691156-9e30fc9f2d9ae56e3ec83bd6bef75c92.npy +04090263-420822a543c50b05230a4d129580843a.npy +04090263-c755cce8095ceaff4b49cd65dfcc3a9a.npy +02942699-b27815a2bde54ad3ab3dfa44f5fab01.npy +02958343-15c785a7505992c3a9be8fd09fb14f4f.npy +03467517-ad6cab75780f3f10d57700c05b1862d8.npy +03001627-a66d78cbf3603e8bba9df3ea0397b1a6.npy +03001627-c97b5b80a24030ae70e99aac955544a0.npy +04401088-6ff995a8e9faa6e83e43be0b542efff8.npy +02691156-76f949c39923b0778f297017462c6cb0.npy +04379243-6365205d2324234fc8a1efeb4b91d393.npy +03624134-435cd82d4017a783dccb54aff8e9710f.npy +02958343-23e7ae83601f893b575116d39d0ffbba.npy +03636649-f56600b8cb2f94d64d8b0368afacc65.npy +04256520-557d878e747fa35db161f36d4e309050.npy +03001627-72669be1815b2bb81e4fe86c4ad3ec90.npy +03593526-f2cb6d5160ad3850ccc0a0f55f0bc5c2.npy +04530566-7abde2cf79febf6efe4db18443aaee4d.npy +02691156-fb62efc64c58d1e5e0d07a8ce78b9182.npy +02924116-4f9ace193131b8e34ac4f8ff2084698.npy +02992529-35a0dc407f3df8d27450656ae41f00c0.npy +03593526-9669911986797a4584d1421a33bba279.npy +02828884-447ad1f23f96171f8d9b3c3ef984857e.npy +03001627-def8af022dceee892acbf58c0b138e50.npy +02818832-4dbd37cb85686dea674ce64e4bf77aec.npy +03001627-fc5f813d499cfd84d540c52e6ddbbebc.npy +03928116-1d139c80e904584b4243f79fcf368f62.npy +03691459-95c24657d2ac0469a3cd3bc808c81de5.npy +03001627-e92063f7bf538df17eb00a494c61433f.npy +04256520-4fcaa3e642e153f3450621b513a975bb.npy +03928116-cddea83b86dde871205444155ae5c84d.npy +03001627-a0e9606288d3ac22b61d9ed7bbbb5b3f.npy +03790512-ba9a5f13dcd8312f543a79ca976efea2.npy +02871439-3ba1563f381785bc6739a7caa0c577bd.npy +03710193-81f30bae0a1474fff601d2ded3aef05a.npy +04379243-b4015b8800115683b3f10885d03d0fb6.npy +02828884-23672bcfaa06a86764ab399dbd3ef465.npy +02958343-7000274ad11a419715ed2279a90f8f38.npy +03001627-a13fa904e05d60f176e9713f57a5fcb6.npy +04379243-e608701de43f3edcc0f947750540fb22.npy +02691156-912219c657177b17774a720fca15e35b.npy +04379243-683ddfb4cf9c8f2883f21c04f5e0acd2.npy +03046257-9e1e652f6477ecc87b9aa4fb5234ab40.npy +04256520-5a95984eaab1d85dfebad4f49b26ec52.npy +04090263-481372303918c2b22c12168d5291219c.npy +02747177-9ea0965fc34131ba7b104108655459df.npy +02691156-5e29fd83e0494cd815796a932d10290d.npy +04530566-f269ef3a1c758432e8d6be23f236225a.npy +02691156-bf5d59729b0c0e336cec6e2299cb4a76.npy +04256520-4fa4da6b966578cbe78a749ef6aadd72.npy +02691156-7317dec9c1cd67a815ce9e432a3a77b8.npy +02828884-2edc5c32e3ca7242aa6d4fa3e14dc1ab.npy +02691156-b3a59a941500e76535592b447835a16e.npy +04090263-5605d839bc4fee8d51b9e8cbda863b2.npy +03636649-b15485a55d855bf980936c51aa7ffcf5.npy +04379243-77f54df25e2d1bf99a1735fdc80135be.npy +03593526-c072c3656e9022977af7743c26a5495d.npy +03593526-49943fa341bd0fc86bc258c0f0234be0.npy +03691459-60d58e77382f081a69d22ff82177f51b.npy +02958343-d6e27c6523a3f2b58b8cd97e9d1c6a86.npy +04401088-6e183cdeba6b83b3805062aaa3bb7665.npy +02933112-77d1cf70e480af7e6a400d4015c42de.npy +03991062-9307ad32b595cd82cb2a965e75be701c.npy +03467517-9fb36e3b793183268853b066b4c501fc.npy +02828884-98af453dfb3b2284cb2a965e75be701c.npy +02958343-b8de49dd963c0669afe1d4530f4c6e24.npy +04379243-e79b8e7272ea19ca2112c05ea370d321.npy +02828884-81df1fcd6e2eec15f231d3622caa1150.npy +03001627-ec41d22862df4aa7eca29403b7226aa1.npy +02958343-625861912ac0d62651a95aaa6caba1d3.npy +03991062-415cae243e110f5cf155d75bbf62b80.npy +03325088-af09dbd4880d1fc8b362845c6edb57fc.npy +02933112-1b3d4f2291545e472dc6c96daf8fd5ea.npy +04530566-d0aa1202f01227f7b9528bf167ff877e.npy +04379243-9c2fb771ec6073b37ff6ace05b36a5.npy +04090263-7d7a915cefca95471db44ede0efdfd5d.npy +03046257-ae8042e2ded0cf01b17743c18fb63dc.npy +03636649-d42435906e79e4131de8e551fc6cf2b0.npy +03691459-570321d63f5fcb9391666edbc97a985a.npy +03001627-124117cdec71699850c2ec40da48fd9d.npy +02933112-8589e65944de365351c41225db8e334.npy +03325088-c1c670ecd6f00497c4cbb2ffd574f216.npy +03636649-574e0de3cea53dd472b623d6378b1581.npy +02691156-c54ca35ef1df558850ea677bbfebf3fb.npy +03636649-390bc0018f132788fcb8d8c6d4df8143.npy +04379243-f97cf997df0945fa1e09e4a1b10c649e.npy +03593526-d278b42591a08a1555f46d55537192b6.npy +04090263-e32501e54d05abf4f1b2b421ee7abb94.npy +04090263-c4eff07f05998965c79f92df566f8c6b.npy +02828884-10cfa696ba2259ccbbba142d6df53ce.npy +02958343-662cd6478fa3dd482d7d789814cae761.npy +03928116-c327cc501312d1bab9492d4f3d8bee7c.npy +03991062-38ea4739b92f125c81a172d69c52a28a.npy +03001627-3af90da238ac4ddbf91663a74ccd2338.npy +02808440-e78f7e89878402513af30a3946d92feb.npy +03001627-97b3a1b718278c09bababe11fcea8796.npy +04379243-802287d31c1f5c5ba4ee05a5737b7178.npy +03467517-52ecf1d8e279c1bb1f8d5edb17ddb332.npy +03636649-ec782fd2f4825158f24dd57a3f1f3b51.npy +03691459-cefdbfba01e3128920363e2561dd589a.npy +03046257-a67f72b0df7d9574b3c42e318f3affc.npy +03001627-d3a958aa302f198b938da3ea2c9e0e4f.npy +03624134-b80c5d63962c04b41395331ebe4786cd.npy +02876657-99d595bf3ac08bace13f76b539e1d69a.npy +03325088-fbe2cc8e19ad7a13b362845c6edb57fc.npy +03046257-e92cdca0cd98e908c3795daea94ab3a9.npy +04379243-339f5b3610ea836682f29b648e624c33.npy +03593526-2ff5347d6ee079855337cdc4b758988c.npy +02958343-36bc228a8722bf27473f10e6caaeca56.npy +03001627-c47e364fbc29803b2c0eb4a518e123ac.npy +02958343-7b2ad420c7829e881cae32f43c09c982.npy +03691459-4ded23cf84c993e9df3c63f2cd487888.npy +03001627-329c2234d134dc89492d9da2668ec34c.npy +02924116-557073f60379b9c852470de2774d6099.npy +04090263-b8828cd2b6bba8989091900cc7eb1968.npy +04530566-234541314abebbd02783b84b5d2d6e46.npy +04379243-6a8f125c174c07a57b11ae648ea92233.npy +03001627-8ab6783b1dfbf3a8a5d9ad16964840ab.npy +04379243-e59fa20a6988b93e29e4b5aa807bb4e7.npy +04090263-7eb5fbc480326d64f02ee453ff283e26.npy +02828884-eb038519c5ba87b663b2acb037dfbcde.npy +04090263-36083138334c7981d735fa1ab17311ec.npy +04468005-ee396a4a5fac385f1183ae1f57465c4f.npy +03636649-636d72f06ebabbdf9e8cd846ef13776.npy +04256520-1f438263a82a1b8919fb4103277a6b93.npy +04090263-357f37fd725c0fc116814c0baffb6c9c.npy +04090263-b942751009dacded735fa1ab17311ec.npy +03928116-df61cf8ba982c0f29a9d23378ae33f35.npy +04090263-b20d634c826cacc3b1ba4c891c81b80a.npy +03636649-47a7bbd995c37d3d4aeb986669a16017.npy +02747177-5a947a76bf8f29035b17dbcbc75d58df.npy +03001627-3981642f57a689276ef2faffa907bc32.npy +04379243-d582887570d2c1c2d7e17ccda34f6b0c.npy +02933112-e18f47b52ff3aa2452174f43a416bc6f.npy +02933112-2b9b2ece245dffbaaa11adad6b2a69c.npy +04379243-dd2c3ff28a34556a47839bae1bc65257.npy +02924116-3553a35ebb586c10550f48125b5f584e.npy +02958343-ec0555ccba700387b45e6d6d9af21f30.npy +02992529-5a65ef748eb3a3d1ec475b573e4d1a38.npy +04256520-d50233ec66ac6ee2b70eac6546e93fd.npy +02958343-63f9acc425dba89d68c45fd057f7db12.npy +03001627-1cf77ee00faa6de7fa6450cce25dc4cb.npy +04090263-48bddbcdd626298540385522d1beeb20.npy +03001627-89208a619341d9fdb8c516ed5c4ce32.npy +04256520-74490c45305da48a2b3e9b6eb52d35df.npy +03636649-3b15a4be5e248d114cc30865d6337b9c.npy +03001627-ff9915c51ece4848cfc689934e433906.npy +02958343-b70d970f8020c25dd141480e2c154d3.npy +04530566-9c2c87ceba2a465f86b234e3f0128df2.npy +04379243-506ad995cecb082f54e1b6f41fdd78a.npy +04256520-7b9f151735391e7a14513156cf2b8d0d.npy +03991062-ed1d39c6592739f72652f4081ec5a77.npy +04379243-f7c25526cd3740cb52e2d18963a75b4d.npy +03211117-dfde382270f1d69a28010a96423245ae.npy +04379243-57364a6bcfdd730f166ddaef2c2c61ae.npy +04460130-e5819354e7ddc4a2545370dbbc80d144.npy +04256520-bfd337ddffdd91b4190a91fd9a6f7d55.npy +03001627-544aeccfe77f230a1cf10a36e3d0884.npy +03797390-4815b8a6406494662a96924bce6ef687.npy +04256520-146ad9d78f06f1f0b246c4171f2c393b.npy +03001627-59704fd0f662d7b4da986730050de1e8.npy +02691156-7bdf4816b61c0e1748766ee3c52f8ba4.npy +02808440-7ecbb98e2bb428c85721e2cc9a13e7cc.npy +04379243-bee3ff1926f3068cf09df371fae9d63d.npy +04090263-e8a019a32c42bca7bc6e84bc30e573cd.npy +02691156-68303a007a6c8ab02d6ff44f79e93a89.npy +04401088-69b74f6c66dc2adf5a627be422951096.npy +02691156-c5d748c352d8eeeb3d4e343a1ac21b93.npy +04090263-bb1dff989d7b563124fcd7bb489fc827.npy +04530566-e3a49772e431fa6a4911559f9f073abb.npy +02691156-2cf6583a74dc4d1e373ed874fe97420b.npy +02958343-b8599e22b152b96e55e3ad998a1ecb4.npy +03948459-36af281561491d77ea768093544ea6d8.npy +02958343-83731bad1b7d6ec531fde3a1e19a4940.npy +04379243-a6c192247329a32e6a19b0779ac03754.npy +04379243-40afcc31186c0b452d19175e7d19b7cb.npy +03691459-8d7d7dbf8f0c0f7673e1b2d018c0512.npy +02691156-420f3bb771e8e75ed878249aca2571f.npy +03642806-b5f6fd84a3f44ddb1aa47689117a61e1.npy +03636649-90c323c4d6288aaabb40b038e5e0b7f0.npy +02871439-29b66fc9db2f1558e0e89fd83955713c.npy +03636649-1b957f2c258ed744b3c42e318f3affc.npy +03001627-30beaf15d2d2beb1febad4f49b26ec52.npy +02691156-2e0c7d77c0b74e87c1ccec171a275967.npy +02691156-c1fd4eb9f911851f4352ea917328a5b.npy +02958343-f3dc4ff3cecb4eaf8ee29572addd5275.npy +02924116-5bb2d2fdaaecc6d2542f64e03384ee7b.npy +02828884-2af98dcf936576b155f28299c0ff52b7.npy +03636649-e1916a904163748e8cc413950b617e8f.npy +02801938-b02c92fb423f3251a6a37f69f7f8f4c7.npy +02871439-fe025a756926fd9620192a5319e3e2e4.npy +02958343-f850f5ddc42bdc3a117db354abf0d721.npy +04379243-da0badcc10ee1a4aea966ed2fa6fd5c0.npy +04530566-e364eac9ec762c54de203ef6842ee61.npy +04379243-da84e4621c255691490ad276cd2af3a4.npy +02828884-32bd91d61ad0824e2729c156998d6717.npy +03467517-78704c7d77e34b803283ea69e022bdc8.npy +04256520-72252b1486f22ce3490e0c0c00192ce3.npy +02808440-19e3356bdc1600e48356c7b0827e2e54.npy +03001627-31e59dcaa15f2599a52abcb0c06a3598.npy +03046257-24841121c7d090d72d2d2896f4b277fc.npy +04554684-677a00ae2e3f7a2145ca70e41d71c65d.npy +04090263-242a543a598c3d7a657e1a784010b9cf.npy +03211117-2fc578c8daf35023ef641b9022b66b97.npy +04256520-7527c6db4e52d511db01c957364e77d0.npy +02691156-7e1d4583f70c8583431589819e5ca60c.npy +03593526-ae81dc3d42c59e8c500158c23c4c5a8e.npy +03211117-ed9c1a4011d870c258d40d577ba17fc6.npy +03636649-eedd40c0191a90a5cbde89e0c48a01bf.npy +02691156-f96426f2392abb1d8d58389384d9812e.npy +02691156-19fc1b9ff4b6456f1232236eecec447b.npy +04379243-70f1b5f74faa9bda664b3b9b23ddfcbc.npy +02691156-8855c5531c093275146f724acb952fba.npy +04379243-3b3b35ab4412c3263edd525d249a1362.npy +03691459-8705c20e8dec94539b0037ed0d57b3ef.npy +03928116-c43e1a3537d56f439a957a60b2bcc479.npy +04256520-df7cced6f0e5e65c26e55d59015dabc6.npy +04379243-1096b4a30bd7717c4733824eae5cd9ae.npy +04530566-35960e065788a31b123c06ea72522927.npy +02818832-4abe567bf6f1e2eee213bbda0587ff6e.npy +04379243-19c0e93cdca6433fb8d33c22fd35264c.npy +03001627-b967ac98b1cbd8fe36a7a71199dc2cb3.npy +02691156-1914552110aa5a61c1006ed55bc1a3fc.npy +03001627-d10ed00430a61909793b1150bb246dc0.npy +04379243-cde43e92674a66f46f3f02fb4d0927eb.npy +03928116-d2eb696f6bf5569ee6abebbc3abab4cb.npy +02828884-8c387d5e8ca71237d2b12aa6a0f050b3.npy +04379243-d20e0f359f37f7f5648b060eabbed82f.npy +03593526-2872c4b8e2f86201b7d0f3d89bbac230.npy +02747177-c0951455fe667165599c7cf847d431a7.npy +02933112-7b98e7b25bb83413c59350d819542ec7.npy +04379243-5a2f605200b4e4d5eb6d17f913d54c76.npy +04256520-c029d82ea1d3af4e19fb4103277a6b93.npy +04530566-beacf34e9b0c0597894b951d14f8e56.npy +02828884-ecef040a94ab9e59928f4521e8b299ce.npy +04256520-e3f5405a4843343e91fa1c643766450d.npy +04379243-4c5ac5335e50ba35b385698e6487d3bb.npy +04379243-14c66bb1292a764f7e7c9f487eee4fdb.npy +04379243-6a56d0f447d477e12de0bc4fc4d02dd6.npy +03001627-c400749eaa4d10871a782a4379556c7.npy +03001627-3ebb8f29a7c44776f51f77a6d7299806.npy +03636649-833baf068fb6225c99570bac758be6a4.npy +02992529-a56fa90572f9e23db30cf593b4a23b0d.npy +02958343-d7a09b2936b3d3e7e97c6bb243ef67d.npy +02933112-1a51237c9515ad0a4da5feafe6f1c8fc.npy +02958343-704e60e6e5be85e1f500cc506a763c18.npy +03001627-3d04cb63d2b1873fcf0dfe1797286ae.npy +02691156-9469590435736800b87697d3904b168b.npy +04330267-510d5da107f80051e1d0950dd1aa903d.npy +03085013-72d9a4452f6d58b5a0eb5a85db887292.npy +02958343-eb5f04670263d8bd075955b404dedb5.npy +03001627-96fb86091881d54724894811dd3e6d32.npy +02958343-db1e6a78a84615b83c9d2d3d4dc0edb0.npy +03001627-1986eeb9bb594bf9a6d7a9f3c5f7bb41.npy +04256520-294afbd7a0e90ba9490ad276cd2af3a4.npy +03001627-7f2f8dd929421cd130e6a28391d443c5.npy +03691459-96a3c3653c343db6ba8a1820ecdbe891.npy +03636649-32bf66766c1f33983466f97f37dccbde.npy +02958343-5d0e79c02907bb8f5cde8c99e4b182f9.npy +04379243-384bf53e12744e2019fb4103277a6b93.npy +02924116-550dd89fd258d839f01129d246a5d1a5.npy +04530566-a85ef79371cb1edb52fd6b83c5929135.npy +02691156-e3f68fbd5d1629e238976998fb731b88.npy +04379243-857ae7eeae1508e9b0957d845ac33749.npy +03636649-22a0864cef495771fcb8d8c6d4df8143.npy +02992529-bf0f0ba650108d03cf144715a1bb5595.npy +03325088-9a4a7de766558e343321831d2245cf06.npy +04090263-3c33a0754d1c6a71b9a4a5375572bf62.npy +03467517-cb99963122f01a92e8bcbdd9e5145d74.npy +03001627-80c1f7ee486e7b5aa61649b05d63e9bb.npy +02958343-3093f587c5660c7a473f10e6caaeca56.npy +03325088-3d9c646e912c7723af0b75abe6dfe88a.npy +02691156-2d4a57a467307d675e9e2656aff7dd5b.npy +04256520-173d2bf95fb2e6353a9b2e04441ce376.npy +02958343-cb5fd4e2c29b9193a134736201a79843.npy +03001627-547ad86927566ed0f9111ef49c078dbe.npy +03211117-ffd0fd5aa21b9c8fb441e189e5a85c02.npy +04379243-d455b490f08607a57c6de7e52b00ebab.npy +04379243-c667df83b0e77f96770db120e736ddf.npy +03636649-d5480fd1d05e8962d42b9650f19dd425.npy +04460130-7344d6188932b2de72f6aef300d24d64.npy +04090263-e0c6be7a5b560f3af13eed41b64dddca.npy +02992529-2cbfb354e5dd731dfd6c7e3f0d9c56c1.npy +04379243-97b3dfb3af4487b2b7d2794d2db4b0e7.npy +03636649-14c84c76c927fb282cd2160e449d45ae.npy +04530566-7b7847ccb4f15fa9b1bb46d2556ba67d.npy +04530566-943567584893fd5218591932caa46ff6.npy +03001627-d283b1073ceae03f35836c728d324152.npy +02691156-f62ad267cdd1a00a34b1f3550986bd42.npy +03001627-9a8e84b82ca17e3f2f21cf17406f1f25.npy +04074963-a67e5a678c54d757db8fa1712f9ee93.npy +03691459-67e18c3be264e30b636095aedba53117.npy +03467517-238f738a7012b713e909a939d5488b76.npy +02691156-5c72cc06d79edd1cbbf3143b1cb6076a.npy +04256520-87ab409c03acea4af994e2a430ba61bf.npy +03513137-aa51f885208208375094ac652b5174eb.npy +03928116-8b533074327be24b776ccba7ee1e3e9e.npy +04530566-ca2e4bd483c006a5c9f3294669fff77d.npy +03001627-8cc42bd1f681f126d0176f9a144100cd.npy +04090263-4acda16abeddc1a24d0af51460733e47.npy +02828884-564474f25a4400c5dc20930e6fc85682.npy +02933112-63465f2647384da7cf44224546cb0306.npy +04379243-c900e6f4dfefafbae06f10e4878a855d.npy +02828884-9ef2f740d6dc7cec8d01d636ec229b2.npy +02924116-c479358dcb0168909df4e878bc750cac.npy +03948459-9a1208d777d287bbaf2c6c19cc41708a.npy +02933112-433b0fe363861867b25e7c54df7809b7.npy +02933112-cd3c926cf4ae4564a80ff03f6dc10926.npy +03207941-53ad4a901e8b0dd9121859336e292a5d.npy +04256520-1e71489bb315efa0eea222b336f100f0.npy +02828884-2cb61abc0c2663ae8f0add668496d7a1.npy +04256520-f76d50f900b034af19fb4103277a6b93.npy +03691459-9de56b4a4a9eb3a4cd4e2b9cb7f670fc.npy +04256520-63d67bb924a00203fff16555386d173d.npy +02958343-a6842a04cef3e5ce69a949ac99a843c4.npy +03691459-394302e20816d0fa07828ee23920679.npy +04401088-3bd6626a05b4f79bcf17364e7927abd.npy +02828884-4be9494c9b476dbbd201085e80edb26a.npy +04256520-41c838f99b46093fdb5f60e9c5fe6c8e.npy +03928116-d3a9b80fd68429d7f2dfae6f0c6544.npy +03636649-bf4b1a3597373ac0664b3b9b23ddfcbc.npy +04401088-2266b891f080ad7eeb2a3da43bd37462.npy +03001627-d30ecbe6cbe364e5c8687ff9b0b4e4ac.npy +03001627-c80c0b8107583898c1956375af82917f.npy +04530566-7e0d128b6c8ce8b59e5ca238b1551011.npy +03001627-2c6fa3007e79013cc3cf9ae716575390.npy +04379243-8c10cd9e5b4d589299ef6b0e70be718.npy +02691156-647e76622faa22b626b85a24a73a298a.npy +02691156-23c8d6c73cf78ab23cf128905a10d59d.npy +04004475-41e1eca9857f0ed1f7cd74b993fa73e3.npy +04256520-ee57ae3e04b1930aa6bb70ffc9e4e52.npy +02958343-413fcc9afd53136a16abce8cb03e7794.npy +04379243-e428b7d6634444a910bed4209a0dd8ed.npy +03001627-4602fbcc465603882aca5d156344f8d3.npy +02747177-2ac7a4d88dfedcfef155d75bbf62b80.npy +03337140-149a105979cad722c1467c54b9e09ce5.npy +04379243-f78e16c1dbc4dbd31349824369d952b3.npy +04379243-b5529f6f5679d705c8b2ff62b26cb42.npy +02933112-adb7c7229f4871c2c59350d819542ec7.npy +02828884-9920a0a8393494c59ec4bb690ca24962.npy +03642806-a4b410734514306ac401e233323032d6.npy +03691459-8d698e60c436d75cf398d0c5832df00e.npy +03001627-b7e01301bb1eef41f92f3e7bff4c4ab0.npy +02876657-e824b049f16b29f19ab27ff78a8ea481.npy +02773838-f5108ede5ca11f041f6736765dee4fa9.npy +03467517-ff3b5763b3dedda3241d076ab53023c1.npy +04379243-b23b29f4b08cb2e7b65b71636c46ae49.npy +02954340-d7de36db04c61722a52821bf1aa3b19a.npy +03001627-beccd4a6031f6a5a3eaabea23fed5ec2.npy +02958343-e9bccdd7a52f13329b3f352e6fa9112e.npy +04379243-f26d68c69a06b95ac440f8a1412258d1.npy +04530566-a668bb9ccffe8cb627ca60ff81c74bf5.npy +03001627-3334213d3f378a7eacac9cf65380267d.npy +02828884-327dcb9a47911686815bd25a546c8489.npy +02876657-7d41c6018862dc419d231837a704886d.npy +02691156-aafb38ca8d8f27de350ef9fb5390c42a.npy +02808440-f88e093eff5adc09ccd0340812259a39.npy +03001627-7348ec0e16e99fe1ad484915511ccff6.npy +03636649-ef4478daba21f2d49244b68aadec703.npy +02691156-ce682d7a2bbf77b6fc4b92d3d335214a.npy +02924116-8ae47b15b7cdbb4ad4bb8b9a2c4a2dc7.npy +03636649-a16fe5e25c99ee73172986dc05e3b9d1.npy +03001627-276932e7bf229d37c8ad93869b52d215.npy +03991062-c63b1b8785020e1e340ded9bd2d6948f.npy +03948459-506a25c906db09ca1bd872e105bb611f.npy +03001627-d8e2e2a923b372731cf97e154cc62f43.npy +04530566-47ab7cf5568066fc86f968b3508ebacf.npy +03593526-6d652a95363bb682b692b490d9871ff1.npy +03001627-7948f2715d32c813fd60059ad8523f1a.npy +04379243-c356393b27c3fbca34ee3fb22432c207.npy +02924116-f518e29070ab89c541cefd10ce5d6cc0.npy +04074963-226078581cd4efd755c5278938766a05.npy +03467517-4e4d180e78d8b52a93f0194265a9746c.npy +04256520-ef511c56878424e4a6380f3fc7269ff.npy +02958343-287f4c8f87099957473f10e6caaeca56.npy +04379243-e3ade6122be60b39742cd3471ca7caf4.npy +04379243-7acabc265397e604593ebeeedbff73b.npy +04256520-debcadc4067158674ab1b242068f86fb.npy +02691156-4031ee8a4631762c9566f663623859aa.npy +02933112-8382308b895aa93286d53ab0fe94e911.npy +02958343-2f13fc44e7e06816a134736201a79843.npy +04530566-d262a9cfdeca256e228ca1071b304db.npy +04090263-5eaad35703c992f71092539e96a339ed.npy +02828884-31af3758c10b5b1274f1cdda9579594c.npy +02691156-f186d2998485c6ed5e9e2656aff7dd5b.npy +02933112-1074bdcb3c2032fe0f3f8b6e1796773.npy +02808440-df67f38c55e4dd0b3321831d2245cf06.npy +03991062-7a971531ff72a48d5706d1c54190f27a.npy +04379243-10f0753ae756fe489c0c9824ccd078be.npy +03624134-da94bafd8b3ea6a6a6e0c365eca0e86d.npy +03001627-31f34cbd9385944181faebbdea6bd9be.npy +03790512-59a2f0fd2b81bb273b6d7f17f2b61d2d.npy +03001627-7e298a6653f0febd1f30b807ae39b61d.npy +03691459-4c68944b2b8105d11a2f7b80918eee9d.npy +03001627-f69b87648aa2c6f52ef787234c3ff353.npy +02808440-868517dfb1753d901d91d3160643d7d9.npy +04530566-8d53d8f4cacbff77853339423b00f029.npy +03001627-3ce9a0301f36ecf4cb32c5fb502d0e18.npy +03337140-b35f8b3cf70ec503bb31aa2e1985084.npy +03710193-19c6003e0b37b66675b7cfd132afcda6.npy +03211117-2d0138ffe3eb25b9e23244d89a2e66d6.npy +04379243-462c1b0c6f14f168c3bd24f986301745.npy +03001627-8bce3b7b7f0f48ad28a1548e344f0e2e.npy +04379243-3c9a23693b76e2f8acb16624e184454c.npy +04379243-5bccf52849ce93b5f4d0ace72e0fac85.npy +02691156-8938ab05c9dd830cb422638f4c34a0ac.npy +03797390-b98fa11a567f644344b25d683fe71de.npy +04256520-188505b2fc90ffad780bc2708a85ba9a.npy +04256520-2b73510e4eb3d8ca87b66c61c1f7b8e4.npy +03797390-127944b6dabee1c9e20e92c5b8147e4a.npy +03001627-680b3add007725792feb9fdea8e07927.npy +04379243-15676a89e39262ea852bb95bccedfda9.npy +02958343-7a12f058a0474559a7fd25564c2e888e.npy +04256520-8112da888f66bbf3c1a52e5a697bb944.npy +04401088-db1f83761a7a19f6d0c7ebb68662b4e5.npy +02958343-a2d1b78e03f3cc39d1e95557cb698cdf.npy +02691156-e8bd07a978ac82baef40e4c1c2686cd3.npy +03938244-80326c3f2dff14412257a9702919f3a.npy +03001627-534c5f9ea1ae94b54644491844ed9566.npy +02958343-9648aaf755e6556e2a9eb0f146e94477.npy +04379243-91530c95f442dd71793b6229a2639a1c.npy +02958343-ca24e69261dadc94a9fe1734a6086750.npy +04460130-15cc3d9020384e8d6e09a8e31c7575c5.npy +03636649-b37e07ac31fa4f311735ea0e092a805a.npy +02933112-aa1077aff8bd9e44d8f27b2e727c3511.npy +02691156-54c13e95f07492a9e10e757961deca98.npy +02933112-648bdbefbe72c6e596d5fa1ee6ada8d1.npy +04256520-c8b6897dac50a2c3eaf288f952624966.npy +02691156-f7c2edc1beeedd006e68e46a69a2d96d.npy +03211117-76b4b83212ffcbe034af0ed44f2ab2fe.npy +02691156-d2e2e23f5be557e2d1ab3b031c100cb1.npy +02691156-86a5bdbd8c0c70eea7de26672c5fab85.npy +02958343-ea3561150f4f2790253c03b7df20edd5.npy +04379243-a269c3b2b456e61af4e73c80c5eb704f.npy +03928116-2f6fb505856129f640e11a38b418d644.npy +03001627-1e40fef11894c4b9ce4f274577283b16.npy +03001627-11e6e58798ae5be83e5b5dbd84cdd0f8.npy +02691156-d8e8540acddacf98c1006ed55bc1a3fc.npy +04256520-660cad84e71a5f67a74931688d634d2.npy +04379243-1acc3dae512b56b01f8b303c0da5108d.npy +03001627-4552ab193b8566acea343d0d02e4d3bf.npy +02691156-af55f398af2373aa18b14db3b83de9ff.npy +04090263-dbbb9a848b8a6697e1f2a1daf140ac9f.npy +04379243-67d97102f9c54cc95512673aa47c7e3d.npy +02992529-7772938405ac56c1b6d41c42f7ade8c8.npy +02958343-effb7322805482465740f5f1a3b45938.npy +03691459-dadb71e216b54f701c5d4854f1aaed94.npy +03325088-d1383f1ba0a348726f893b5bc716a3fa.npy +02828884-15cfe15285425b67bc96b70d50d39da4.npy +03636649-1475fe59961fc726f096eadaad23f93d.npy +02691156-6b15289a71312a5af8ea21a9397429b9.npy +02958343-e8745e2d659061ee4a15d27f5dbfc7ba.npy +04379243-db89cf8ec0ae8e10f42e033ed19d598b.npy +04379243-77fd14f1a7f2d27ec3bd24f986301745.npy +04379243-649cea3b17ffb31bfebad4f49b26ec52.npy +03001627-4178e43e2756f1d0af7a8f97983e7906.npy +02876657-2efb9eef0ed832a89769b3a50399d097.npy +04379243-81f049a3410c8d295833b7f8c91b5b48.npy +04468005-8714037a49f313b12e97c1a558edd2de.npy +04401088-39359aaddcc4b761b0a79e28606cb167.npy +03001627-5ce636f716f8f11e601104cd2d998272.npy +03467517-715d17d76a80c54bcc34b900bb2492e.npy +04530566-2f682d31b26398cc2218383c174cbd7c.npy +02958343-8df7178ab0f02bd7a795ba688a0bfdb4.npy +03001627-e6c900568268acf735836c728d324152.npy +03001627-a2eb6e2ab073dfb2e0340d230bdc7ee7.npy +04379243-9fe655d18bce7ede23fe3501bb9e7193.npy +03001627-e9e224bc0a0787d8320f10afdfbaa18.npy +03001627-b3c503ee276ed0a75298386582afecd3.npy +04379243-91df49ec00f2c5ce73f1ca2ca101a20d.npy +04256520-73111c5505d7b5eae3db80a3cacc6e3.npy +03001627-3aaa59b19eebcb5f41552c6ecbda964b.npy +03636649-89b168160388c29da996f5a90dae9cac.npy +04401088-4b91c9711ca991768a57ed2dc0905847.npy +02958343-1f0d149b320aa4faafe1d4530f4c6e24.npy +02958343-30e971ea6fceac68f5cb3ca022cf045c.npy +04379243-1028a9cbaa7a333230bbd4cddd04c77b.npy +04530566-f6288a9297948fdc67383adf153b22c5.npy +02828884-323f0787810ef9a285a030bdc6cb9884.npy +04379243-a99a74777f6aacf2489e5619471f9f53.npy +03001627-2320dab001320f69f91663a74ccd2338.npy +04379243-fc66d797cc6b4bb672a7060b4557c0e.npy +04379243-429d850ac1621fc176dc93c8128c2c20.npy +04256520-2c6dcb7184bfed32599dcc439b161a52.npy +03467517-33da9c54f43be3e17693a84bff425e3.npy +03593526-21efadc7372648164b3c42e318f3affc.npy +02691156-4c5b8babafbb7b5f937ae00fead8910d.npy +02691156-36d2cda57906072c1e08b6601b6fd998.npy +03691459-80000b93ffb0ab8ae47833b310955a9f.npy +02691156-ac0d1320328f5636b819f3a4f3895504.npy +02958343-752d240eb33f328cbf95baecbc060806.npy +02933112-d6edc4c02e38c7dda5737ca21e62ad39.npy +04090263-fb4969c29b155f2e9c8bfc08f511409b.npy +04256520-c06d35db226f47d4de03ab2a27ba7531.npy +04379243-48af84a5600ad5bc19fb4103277a6b93.npy +03001627-a1240606049c440edbf3c13c5c0e828e.npy +03636649-ba95511c0a79f2fc73b8ea30c1700f67.npy +02958343-4db6c644912bfbb3e0445fc6d980dd5c.npy +04530566-90bb60a421727973e3852f9948e4ef35.npy +03001627-8f4c2a7243b571f3b21450114b9ae3a.npy +04530566-eb00c722894c3d70c40386bdd72f9a0.npy +04530566-29a131678dfba5339a6e43b878d5b335.npy +04530566-9b90b9cbd9577d842b72b4a851b36ab9.npy +04379243-194b279c7e892a2d15fa8082e5524f79.npy +03001627-4138f85b00b53185dc3653f8341633a.npy +02747177-f53492ed7a071e13cb2a965e75be701c.npy +03691459-92b3275e46a63fce1ccf3280eab717b.npy +04530566-84097ba1b35f844ceb2c303a0e0d287b.npy +04379243-a767059df7040b5fbe127423452ccc7b.npy +02924116-775c6216da8ba981cb2ecbd32dc2119e.npy +03001627-a544d05ee3bf362d27e1ddec710c515b.npy +04379243-efa1b72ece626ac6e3989b96851850ed.npy +02691156-d96f2b6990d0d79e247412be0e58d7d4.npy +04379243-21d160eff925f48055f46d55537192b6.npy +03001627-cb867c64ea2ecb408043364ed41c1a79.npy +03001627-49d6f3affe205cc4b04cb542e2c50eb4.npy +04379243-233efac14ec7189e809222e4341a7d65.npy +02958343-48723bca810f80cf7c84d27684eb86f7.npy +04401088-7617e95211fc3ba0e02ee35b95994e2a.npy +02933112-809d5384f84d55273a11565e5be9cf53.npy +02828884-f35697e0ec1d35dd357ea07594f25728.npy +04379243-d97e2a50640387adf90c06a14471bc6.npy +03001627-966aaab0434c950cd7f7a4c4609b0913.npy +03046257-8fc855cef77177e8c598d38a6a69ad2.npy +04090263-76eabf417f880fbaf0cefc099c5b436c.npy +04401088-54d5d64e0d3b0f95952ef623ec48449b.npy +03001627-edb86d102237488ce8f8c11a24c52ebb.npy +03001627-89dba482df6fd02732e2044f695909a.npy +02958343-2928f77d711bf46eaa69dfdc5532bb13.npy +02691156-3033e5dbbff674a55d3bbd70fc7759b7.npy +02958343-3d2fbd9bfdfe08573a93df79ef2b80ef.npy +02818832-ec8298e0eb6fe81aeb3829c3063c353c.npy +03337140-1d5d3b178c89b282492d9da2668ec34c.npy +03467517-a92cd0b5d559075daa9518d76daaca23.npy +04256520-28cb2ca084164fc15da92fb9f7555d73.npy +02691156-4044d5954ef85af8279326882e8430cb.npy +02876657-935b737dca29fbf4ef026123226f5519.npy +03691459-46d03a4d9dec071d1047e2dc3fdce97a.npy +04004475-eecd888b440831bffce3743f4e2437fe.npy +04090263-d5322c4c21c1d16ceff31787d7394ead.npy +02942699-2fc6168fba3ef6953ada8db96f6d95a3.npy +03001627-c1b312919af633f8f51f77a6d7299806.npy +04401088-c960421b8c637137fb4952f06d5e75bd.npy +04090263-6d2761d9749fb354167e6355c6e5b5ad.npy +03636649-13e4f5f06cb42211fcb8d8c6d4df8143.npy +02876657-9f50b2ddbcc2141cfa20324e30e0bf40.npy +04379243-d21405eeeebe4085d42ec7e303174a87.npy +02691156-aa3a801045f6fea9afd51f67d3985e6e.npy +03211117-75ba7901816b273fe24979df4ff99c50.npy +04256520-aa8b70ecfdd237bbf91663a74ccd2338.npy +04379243-e29252434d37520ff008d8a3590fb522.npy +03211117-3ca0f34c03ddd760234c2f2e8f2fe6da.npy +03636649-8508808961d5a0b2b1f2a89349f43b2.npy +02691156-1304ef60fe9793f685e0a2007a11e92f.npy +04256520-7db3c05e67e9b847393b0262b4e8b707.npy +04256520-ff2dbafa8d66856419fb4103277a6b93.npy +04554684-3cafaabfd4924ee47e5b110192149385.npy +03001627-5490efbdadce792f524f4eb395a8604.npy +03001627-7289d67cc454e7215790e40d47191474.npy +04379243-2ca883ba6a9dc6f68985be89a0ee21a.npy +03001627-e7ae6edc3fc6c92ac423490470c47d79.npy +03001627-432138c30378b2a8e1b6c3a3e12d929a.npy +04256520-5b693b3edfb323d0febad4f49b26ec52.npy +03691459-e34b3e11083387b9c9d5b08933b9e0c1.npy +04256520-7669de4a8474b6f4b53857b83094d3a9.npy +02876657-8aeb546f0381df6e97b6ee740552021c.npy +04379243-2ad1a20d43c6106f71b1188ea929234b.npy +04379243-8e8b8a01fc4abd88fc4a4d8514534de1.npy +03636649-2632d9a8462774cd81255bc546ed0fe3.npy +03636649-8006e3cb3ba934a05b977412e02c412c.npy +04256520-5cc378efd61f0333afd8078191062c7f.npy +03001627-3be2c90d1c2730fa14659d605ff53c6f.npy +03001627-24cd35785c38c6ccbdf89940ba47dea.npy +03642806-dd205f0f8bc78bae359d7b39cfebb287.npy +02958343-b5a25bcf42cdfb15523270fc16562838.npy +03467517-58ef47d7e4f4ce9b2442fc1f96a68061.npy +04530566-44d1e432239591887b2cd6c1f3acedb0.npy +04530566-5b45a9913b90c67f8e2d64007fd7ea91.npy +03001627-c3a3d9cdaf29cf6597c8d78b9aede742.npy +02958343-a238facc26681bac8efc69f75162eba1.npy +03636649-a690290543a1b904cd5a7785cb8ad4.npy +03046257-7158637af55b7c51f51f77a6d7299806.npy +02828884-cd052cd64a9f956428baa2ac864e8e40.npy +03001627-6c25a321d75405aafdef1c01cbd4ae0c.npy +03642806-c012da029408fb8d498c10f665c444af.npy +03211117-ede70dc992195dc272e55f1aa85cc5f.npy +03001627-ea577a1e9dffe7b55096c0dd2594842a.npy +02924116-6875d86990f0e143c3326b0bcdf7d332.npy +04090263-1030525f8d49753e519f927f2bf92da9.npy +04256520-8f8aa68c8c6cc6b53dfad56d2a4eefcd.npy +03948459-e4b03ae84f8d11394c3466ee2269609a.npy +04379243-1557647df4c4d298f6e8f2cf4a97051f.npy +03001627-9c825b20d4e35eb595a6db6161d501d6.npy +02691156-35835c28f33d985fa18e0889038e4fb6.npy +03691459-6d5698eba0fbb1cb2a9eb0f146e94477.npy +03790512-aae0037cd1dd489b468bac13e007a6e9.npy +03001627-76fa373d984bd515504d5af97121b5f.npy +04256520-6f0f6571f173bd90f9883d2fd957d60f.npy +03001627-bbcdf9d0ecf02e7e9fce07ae6c046b8c.npy +04256520-3dd89f170133fbd7d609055a51359428.npy +04379243-ed66ef9698fef541b945039752747042.npy +03046257-4e4d010aea4d533756325576fb0d1968.npy +03593526-81cc70eb5ec9e3c75706d1c54190f27a.npy +02818832-eccc3a7a3a5785e8d359a99f94460600.npy +02958343-470fc68779da0f923d68b6d025852738.npy +02828884-87086d24c964f9524ee9546b7112f88f.npy +03046257-487f2bacddd58bc9f959a2da56ff43b4.npy +02933112-3aabe5c704cf7a6d1db624f8d6f26a7e.npy +03001627-a8a2f0865365b521c87106a609982130.npy +04379243-4302fa68485f0734776f723457d34a2e.npy +04256520-23eb95ad8124b45cc27ecf743c1aa320.npy +02691156-b4dbf6f6b0cc8ec5ce19d55bc5e6a406.npy +04090263-c6e6cf657ba3f2df4376957d2c85a4a.npy +02876657-ad33ed7da4ef1b1cca18d703b8006093.npy +03001627-63249ce6d12ee0bc7b20cb946bceb58f.npy +02958343-42134787c805fffe1ab9df4be75138d0.npy +02958343-e920afce255de6ee3781057335c8a2e8.npy +04379243-7bc45a32e5b7f14f7e1dc33a9d8d260a.npy +02871439-14e2cc3454ffcc65cd1d915262958e02.npy +02691156-88af6c30339602c2c87c199a35aa58d6.npy +04379243-450ca83285f0a0bff51f77a6d7299806.npy +02691156-b02aa659514366aa2c6868c67da0489.npy +02691156-7385f1416e93f1c14ba2821676102936.npy +03211117-cf7434589520c549e420fe49ae1a5a34.npy +02958343-7275ca45638f16041899a3ad18d10126.npy +04530566-d235d9f72448d9f82c1bf9a642a59d24.npy +04401088-dcc94b8d84b5093df47a365062723f15.npy +03691459-97f758c8d327d072871a975200291c6f.npy +04379243-6f86cce2bf8fa88821da01c0bdc324b2.npy +02958343-1688bcda878d3b18afe717997470b28d.npy +04379243-41b548aa6f4146fb1962281db2f162a0.npy +02828884-66af742be9a0c722b93fc2b66c6b86b6.npy +02828884-26f583c91e815e8fcb2a965e75be701c.npy +03001627-c04f515b688f9d97fff16555386d173d.npy +02691156-24fbe7a49fd786c5fb5c1b0f759e2bc1.npy +03001627-47ac4f73d91f8ff0c862eec8232fff1e.npy +02958343-bf37249fc8e16fd8f9a88cc63b910f3.npy +03325088-569dc8ef952c3e039bc6283fe73f66e1.npy +03691459-142f66a7bc5e119d18d385624fdfc6d0.npy +02958343-c8bc71dadbdaa890becf71e2e014ff6f.npy +03691459-b7b69bc187bfea4a8b1598dab950d979.npy +02747177-edcbeac5da0b42dd7936acbca381136f.npy +03211117-846b6c8cf241ce2648d13901d1f48e04.npy +03001627-ef7d9ace8098733b8e80abc614a52973.npy +02691156-d639c8d2f55982558b96ae1a0a8b84ec.npy +04379243-c18781f9d9d6f34a79368d1198f406e7.npy +04379243-6d3828602ec4b79232a1f4cd459cdfdd.npy +04256520-875b65ed8484c7908bd21f911d388ab2.npy +04379243-f643a64a4e38723f73c478529c40c4e6.npy +03691459-fcd642cc82a4417848db103415b9e9da.npy +02871439-55c822c909fe5df991b2b5632f598ef3.npy +02933112-21ae39cf6ba8557f4da5feafe6f1c8fc.npy +03710193-5fea323ff9baae9e8ee9863a6dff6d33.npy +04379243-59ef41df3ae8a4026c2e61baa2a8130.npy +03991062-b06b8ff170974a41bf01982c823d8b4d.npy +03938244-d212b1cf646b23f5fdad967a7c361c07.npy +02747177-d0811b88cf8db844375bc8943daa105.npy +04256520-41149ca3a44aff87707cdefe012d0353.npy +04256520-dd85decc87fd988c524446331aa4f326.npy +03001627-3af3096611c8eb363d658c402d71b967.npy +03001627-c7dcd3fdd4ccb7563dce8e6b691b2a29.npy +04379243-d81388de1add33d8e41c171730c26c4e.npy +03636649-2f02e4f875d651b3c066b9622c005c53.npy +04379243-e78e481200b9c01323720b60324690f9.npy +03337140-7d4abd821dfbc7dfcc786970133d7717.npy +02691156-57e135ae4fc03f2e6d06e36417078f.npy +02773838-20b4891228ecfb4876bb31db0358e9c6.npy +02691156-bd2a375de8c7374195adb59fcbb6489e.npy +04256520-980d28e46333db492878c1c13b7f1ba6.npy +02747177-c2d6739b7d2b6cadad5067eac75a07f7.npy +03211117-9b6d300449f7bd573cffc71116771f14.npy +03001627-4dae16dcdfd7d10be6fe3612af521500.npy +04460130-4884377f5433a9324f2ea904df2fe040.npy +02691156-425619faec43ba86a000a5a61b867bca.npy +03467517-9c260623916034b6f7d037d5768b173f.npy +02958343-6a13836c3bc23bf316d7d2293315a234.npy +04379243-2c6c50203f519351bf5f47124ed0461e.npy +02933112-df509063ec7b78ce8f7d9678498f2295.npy +04379243-da330cf1b5a8f1ad26f51cb1aef0ea9c.npy +02828884-7abeb2903fa22d0fad974a50533b722.npy +03642806-8b4de33bc47389d17cc7e57b94b43e43.npy +04256520-a939afd0e1336d17d20e3ea5765d7edb.npy +04225987-234b2d3aae0b3c44b17369c768229699.npy +02933112-c6a306867328d90fe42c2d012c73c412.npy +02958343-19042f5a90290859441c11ab4641b257.npy +04090263-1cc47a6181beff44f18a63d96554f7.npy +03001627-c405457198f59d86492d9da2668ec34c.npy +04379243-bc7a99b74e3dd257c955e5ed03ef3a2f.npy +04379243-1846b3533f41ae82f8c4b4cfc2702232.npy +04379243-97b7baeb8a172de42f56f09e5bc67bee.npy +03636649-39af776c1435a3374b59758e9336ca87.npy +03001627-9253f198c06794cdc7689830acac6e59.npy +03467517-c739664436ac5237aa0c867d5b070a5d.npy +04379243-65f27b374b83dff560ddc468fe733ed1.npy +02958343-97d0903cf8912c3ee9d790a68c844819.npy +04379243-5835aec0e4aacb278305420c03f867ef.npy +03636649-5d3d9d6a6721646e441f5bb6f88ca61.npy +02958343-a2fa0bfd39718f1688a610ac9b7aaa40.npy +03001627-5427106126c9851dc862eec8232fff1e.npy +04379243-91b962b6de5efaad79679c2bd6c2f2c2.npy +02958343-6355bc126ff0c2d9ef923467520bd6ef.npy +04090263-7c8a7f6ad605c031e8398dbacbe1f3b1.npy +03001627-c12da8acb2c7973597e755dddca14449.npy +03001627-98b003470034007f51f77a6d7299806.npy +02691156-68d3c213b16ee2a6b5f20f5912ee034d.npy +04090263-232a75ecb85c7fef6c70dd7879e7e453.npy +03001627-a1575aa70fbaab0fc05575120a46cd3b.npy +04401088-df2299185baf20a17b1546f309a98bd9.npy +04379243-a2554ec7e2331a8fab610b0c94236463.npy +04379243-c97fe8ab1bb4e195af983a27c524ad0.npy +02958343-e1d2157def9f3ff469856ab03b318817.npy +04530566-fd13e9a9d84bf26266d02be2d9ba0945.npy +02691156-fb0f2907b977e7cb67c5e3041553656b.npy +03001627-e7d4a3cca8edfde4829113e62386fd50.npy +04225987-591971ce679ca4b93ad38b993d9e745f.npy +02942699-c3a410e532cbf900e5a8b3dc188dc518.npy +04379243-6bbd16ddf2f8be61377b9297f3055210.npy +04090263-907def283c0727f7143bcc14d754d44d.npy +03797390-b18bf84bcd457ffbc2868ebdda32b945.npy +03001627-f5caa9b5ada31a8b3cf15c77de45986.npy +03691459-710014b815369e1c2bcea2cd4cc7b042.npy +02958343-45189b11f0524a85e921d7ca67acd2a.npy +02691156-2103dcb213151791acf77e718d93f3e1.npy +03001627-d94490f503e005cb9eeee305ab9432f0.npy +03325088-d24b5c4d9635352c76c18e71fd49c4dc.npy +04530566-9115745cde6f30c67f141c9abbacbdb8.npy +04379243-42db26c80b9530b7c188d6c6d00e7440.npy +02691156-1066b65c30d153e04c3a35cee92bb95b.npy +04256520-855407f176aeecd6ee7d178666aae23d.npy +04225987-2785d91a40cd41a659c9250a427b57f.npy +02958343-19541db644551287ee0112963a7e11e3.npy +02958343-21999849a6a8aad752470de2774d6099.npy +03948459-b022617c83eda074de67c4fcc9fa48e9.npy +03001627-32f007e84efcb9d12cba66dc6aeabcd4.npy +02691156-a4b26e08b6080277a47575cd04a1d851.npy +02828884-4e512ab638542762d4d8765e3910f617.npy +03001627-9e03f57afb7bbfb21b356ab8b24c147.npy +03636649-2958cd9fd799bf02cfbcbf340cec6da1.npy +04379243-e58448ee821f56bc409de7db3ae4697a.npy +04090263-7d54a0f10b79f06af70f35281ca419ac.npy +03642806-920c43f5940ad5516395c48c836f48fc.npy +02828884-213ddf647e36ce28c933c4a3701f5695.npy +03001627-cd6a8020b69455dbb161f36d4e309050.npy +04379243-d056e7c8c972455b22a22d22d00874ec.npy +02871439-aef9733c1f4f09498381de546409094b.npy +04090263-f6b9cfaabbcfbc494298740d1f3c17c.npy +02691156-d1b28579fde95f19e1873a3963e0d14.npy +02958343-6bf75ddeac192594bda733a39f84326d.npy +03337140-30ad23a8f6a3a4479725f8348364f5a8.npy +04379243-92973023278f568a4594f83fd12bcf18.npy +02958343-cadd53fdbf69727721f6e2b0f75cf9c4.npy +02808440-ff0a7ba89bc77fd58797cf21d0643b9f.npy +02924116-91394611fb3302e973f659238edf3c3.npy +03001627-7a9969fac794484c327289c00b6dc9ca.npy +04379243-9cc8c5869737e8e3f51fa0238791f5dc.npy +03001627-e908c290fb506f2e19fb4103277a6b93.npy +03691459-64ebe165fa668ad4abbfc2108a5a7885.npy +02933112-18798a19664ed14c14038d588fd1342f.npy +02933112-7155c1f2abcd7dd2e3f7a74e12a274ef.npy +03325088-957c49fda3109da9c36fb70296e45483.npy +02828884-5cbed790bc24fa22056b4bd5d870b47.npy +04256520-dcd9a34a9892fb11490ad276cd2af3a4.npy +03691459-4d8420f146df7c37ec2dd234c32c102.npy +03991062-a5db4bacbe009f2ef51f77a6d7299806.npy +04256520-216821d05f00b1ccc3bd24f986301745.npy +02933112-3700aafc0160b162c59350d819542ec7.npy +04379243-1f67cbeebf4f65b22b71faa8701e3f78.npy +03467517-fc897eb93c621572ed724609df3eb104.npy +04256520-6fc69edce1f6d0d5e7e684d25d4dcaf0.npy +04090263-37f8e929e458d0a9c2c44977d8755d41.npy +04401088-add38cbd2fd27d62cc98c9802550400.npy +02871439-b2284a33e3a49eac120a829bd43c87b1.npy +02924116-a45862b9b23c240f3c898e35284e3eec.npy +02876657-3336ff069b249afcaea6c6fc97ee6184.npy +03691459-67f091721c90a533d747b49524a1246e.npy +02691156-4d13a1b180422efc2d0334ee3a22c9fc.npy +03001627-8748c7f2041761401fc5750ce9890422.npy +04090263-e40227f3cfb50588ed6e4dd9aa9b9ab0.npy +03467517-c76525770fe831c21082f2ea630bf69e.npy +04530566-4cbffb314a589346b9b184da9c0040b5.npy +02933112-6d30a4d1ed6f4bdbf51f77a6d7299806.npy +04379243-f718cb5d6202341dc183308b9aafe2ca.npy +03691459-1a4ec387ea6820345778775dfd5ca46a.npy +04530566-630bc6dc892aa9bc642f9e27aaf0c47a.npy +03991062-5e825f4aa6a916c544cd688b4bc0d629.npy +03001627-6fd7e0881e4148a238dcf62407724e73.npy +04530566-1f2e662c92843dc9c083d5272d526845.npy +04379243-408b03db5a9972cac3bd24f986301745.npy +03001627-46a6c470367cb57ec5facc3cc8dc041e.npy +04379243-4454343a673c8b3483e0de42574c850a.npy +02691156-45985e48353c65cfd14a90435b48593.npy +04256520-f1e1585a89e6826a1d1a08d58541ab5.npy +02691156-6fe8da29821a60d75057515802db06ab.npy +03001627-8fa742589b47b596e8f8c11a24c52ebb.npy +02691156-fef935c1f862f4aa31309643a94d8a5f.npy +02958343-a78990822fd4836a12615f8be9c552d.npy +04530566-80930e10f1f3ab9358401a911725e987.npy +02691156-580e54df8765aac1c1ca96a73599ca7e.npy +02691156-90489d6f74296c88daf24b8b932d0212.npy +04530566-6c1458eec06ad0c147a67ad1fb1cf329.npy +03636649-5a1484a25a5b8a08e0df09c6ef42b40d.npy +02691156-f95d8e86feb79b17cbebff57eecf0a64.npy +02691156-84e45a6f079cfb9526360e1e29a956c7.npy +02958343-b9ae3fb6b027dc4294a553cca1043426.npy +02828884-ec917ab14b06fe402056b4bd5d870b47.npy +02871439-7bc107131eb35d089de7cc26da67a42a.npy +02958343-18aad9d102afbca57ba2273581c30cb.npy +03211117-f2f41913123a7a7e4b87db09ac4cfa73.npy +03691459-bd76dee31cdad0f0bb62a53e25c6d701.npy +04468005-896352cb09e6bd1e398968fd209b2972.npy +03691459-c766463a3623d0ab8a0181490cb73cbc.npy +02992529-452b924abd2ece2d58932236a22029d3.npy +02808440-f02c871c08d664544b97a2297d337e28.npy +03467517-a1eeab052ed7be831082f2ea630bf69e.npy +03046257-78083db936435d0a410f8c2a2eb53871.npy +03337140-c20ce998ba99451991c352d02061b3f7.npy +04468005-97a93d1479a6382752470de2774d6099.npy +04379243-e81af191bb828526815b2b467e8e2eac.npy +02958343-1736b8494abf38ba4eb766e5a46fceab.npy +03710193-f76e818f809a73921b17743c18fb63dc.npy +02691156-cdccbb56939fcdafa266a0298675ed53.npy +02747177-7069760a16db98f46c9e5b09a1c294d9.npy +04379243-c755eeaa4a588fcba9126dd5adc92c1e.npy +02691156-fd0e59013a16eb5184306f3bf0a1f2d7.npy +03636649-47cd62ec53571be3276206fae5d3c473.npy +03636649-a4f257a3eb6c5c37f716a9f638b146ab.npy +03001627-b51e2ec95cb6ae33999b33727fe6db14.npy +03624134-e6d18d45abd40a22e5ae31c6c631a39.npy +03691459-cc01f463f825ee9024fa1bc380696e03.npy +03001627-6a2ae8bc01eef7b25e655c6c6e834498.npy +04401088-738e377ef785ee92d3429357dd0adcaa.npy +04379243-869516eb98eb3c2fb54d798b09097adc.npy +02747177-af6fa396b2869446d4d8765e3910f617.npy +03337140-f33558146907dde59118eee0b123125f.npy +04530566-3ff4ba746d73fdd08f845c46c317c0e2.npy +02691156-b1021932b387da327f58a59a37266b2e.npy +04256520-1053897adff12c7839c40eb1ac71e4c1.npy +04256520-884edfe9e34533543ede9e7417860fbf.npy +03636649-980e88a168a94790899bad344dc01f2f.npy +02958343-3905d1dcfd5e702333d445f141c62a67.npy +04379243-168e317409670cf2a0006518e6ab8b1.npy +02691156-b458bf7d57d211ee43bc2645d97a220e.npy +02958343-83afcd8ba9cf63cba7094e4ecf18eecd.npy +03001627-df55d3e445f11f909a8ef44e1d2c5b75.npy +04379243-a1d9f62e3bf2863278f39854b0025475.npy +04401088-844633a98977c10d9eedb085a3d8dd72.npy +03001627-866e1be9f53830ed7a6617a3ecd0b52e.npy +03636649-9d340cb226868e39ce4f274577283b16.npy +02958343-33e897abe9e7df46a9aa61915b4add2d.npy +04256520-4ec9d99e4094a2bd91659e904513cf6c.npy +04401088-a3f4cae960ac74babc54d4bc75a1a826.npy +04379243-e6b84acd543ebf20662cdc2f77e49a85.npy +04090263-f5f4d746b6d0b8f59f433921788191f3.npy +02691156-a6b9d686a7b977035bae66e2c509821b.npy +03001627-eb039f6a86785f3a9e633556753261cf.npy +04090263-25cf1e85d9875c9412173f61ff9d1fe5.npy +04379243-71a26c00d3a4bf834397d3416be8cfe5.npy +03593526-9d4bd3ecfdecc031561dce3fe08634b7.npy +02958343-f6d7cd8a000997b1aa69dfdc5532bb13.npy +04379243-967d0f37416158b897a6420376995cd0.npy +04256520-cc4f3aff596b544e599dcc439b161a52.npy +04379243-15339648435a8e6290ef7803f19df417.npy +02876657-d10b549075e8f3812adf8abaa25e0215.npy +02942699-416ce9adf7ad40f4959c1c3d740c4f1.npy +04379243-2f98d5e721e84debaa8081a7009091db.npy +04530566-3076e52758d28680b534b494664155d3.npy +04530566-65f8bb163e351bfa9399f7cdb64577ad.npy +03211117-ea58a7f6955d740fd18c7d7f7c43f51.npy +02924116-239f4f66030286e73a304988a6618a7b.npy +03467517-c7c7542265b8172c7e1c85c5c15da7fb.npy +04401088-39b91aa425472c3676fb191f3b44695a.npy +03325088-e34fce990f5c1e3bb362845c6edb57fc.npy +04530566-dc27c81f14e3a89c84306f3bf0a1f2d7.npy +04090263-897084449b84192db449aac65ff63543.npy +04379243-da96905b5b3c821c8cbb8bac2032149c.npy +02958343-e98955e5d46a492c036e20efe5e5ca8.npy +03636649-8207274d3677061673ab7b7128d466a2.npy +04530566-20c2bcd71abffc2a93add66353cae8ec.npy +03467517-b6d0cf333c7e013993f0194265a9746c.npy +03636649-8fdfdb325c5239e798e0d1738edd4f19.npy +04090263-c0e05e56826d5fbc38cddde805fe966f.npy +03691459-30bf1d16fb6c28fefa70f8d6bbdfb0f4.npy +03001627-f0f04644e071d9348ca588a3264b9f86.npy +02958343-affba519865b72fc2c95ae1829869305.npy +02691156-a09773e513ca86ba8699933784576e73.npy +04256520-b10f96a79a4fbb039444333dad662f20.npy +03636649-c2f055fac2817b263cd6abbbeca4e2ad.npy +04090263-c497e1a1ef3515f197e3ac788f68f6.npy +03790512-f145950bc661e61bc4b71cf5644b0ee1.npy +02691156-92e445da194d65873dc5bf61ec5f5588.npy +04530566-a58fb21bfa4e2f451ddea1d5aef06a06.npy +04379243-367284cdf79742334305d9043f82a6a0.npy +02876657-532376fe56d3597ac65f62bae01f4803.npy +02958343-36fe332c1b11696d51a95aaa6caba1d3.npy +03691459-e2c1e8958295f84459fca7a6b28640d3.npy +04530566-5bd0346e72866c8256f77b6bc6731cda.npy +03046257-c9dd71db5e6713937d0fed3563de13d.npy +04379243-50bc6269b12da0e5f88cd736e1bad067.npy +02801938-d9fb327b0e19a9ddc735651f0fb19093.npy +02924116-a20de35fdfc74932bf5e15f245b14644.npy +02828884-4b00859dc8ce46eff4fb4dee5181bee.npy +02958343-ac3585c59a80b822b4d8eb72d337b2e3.npy +02958343-e5c45e408595abe2bfff0ff366de48fe.npy +04379243-c45e6ceae72c7a97be8908669c476d49.npy +04379243-a8dac23add615b33313f9af5275b7c70.npy +03691459-c82577c608e88a8fb2ce325c854088c2.npy +03636649-8cb3f83d6ca1a4849364e552d5e4060f.npy +02958343-7cba7b4a6e106bfa2bc5065d4094ca0a.npy +02691156-b97900a7f44bd7dcca8607f540cc62ba.npy +02691156-2d0945065aa2a427eec7473defebb526.npy +04090263-347cee581e94fbe5d735fa1ab17311ec.npy +04256520-d851b8a016cf114c742f75bc7df727ae.npy +04379243-f5fa9f592d891083996915f7802ec40.npy +04530566-482ad82769d6b5b11274a3ddd0ec9301.npy +04379243-c0e8eca9811baaf1237b12b19575e7ae.npy +03001627-ffcb8206f907e663eac685b1b2988af.npy +03261776-1a5e2a7cddc8e46aa681aea7976a4565.npy +03928116-ee5f02473d056362ead00c9724dd9a8.npy +04530566-d271233ccca1e7ee23a3427fc25942e0.npy +04090263-1c6064f070b55dbfa449921c4b97dd7b.npy +03046257-e26485c0a14a90867903707764646db.npy +02958343-f21bd46dced01bd835da01f298003d56.npy +02808440-545abe6ce52a927d3321831d2245cf06.npy +03207941-f0a18797e3fe9456ca8fc0fc5ee911.npy +04090263-164248eefde5ce846314c3b6a3a65519.npy +03691459-7b81d4cddf859fe7ec8f1b76923633de.npy +03691459-33b19fdf42fd767d871a975200291c6f.npy +02691156-b90571e8736a296c549b705aa127253d.npy +02828884-fd6ae258090bf95b693e50e46681af47.npy +02958343-ec469722be9d015c1ef32d215d1c8df5.npy +02691156-e4e98f8654d29536dc858dada15498d2.npy +02828884-818879b4a23c12bf575f9747ff6fb5e8.npy +04256520-67386a2dcd3be10b8a09f7075b904cc.npy +04379243-1cce99367326fb45a7f4087375d26b7.npy +04090263-a3d111fe5fab82a54aef47a2c7bc343b.npy +04379243-5247e4e978399f1b486040c0d9e85846.npy +03001627-e65ca690574bfca53ccbceb68fb352fd.npy +04379243-c62dd18f43f11b858d2fa6ffb11d1cb3.npy +02992529-52494d36a6d136f6b34ae4286be3d813.npy +03001627-882f30dfcc94ccb5ee57043a0b4866cc.npy +04090263-508230aada88eb0a550a87cda3436d95.npy +03211117-b06ad1afbbc8ba7536b34d1a0ff085ad.npy +02691156-59bbe6a07a5a68d5d96b332cac4e78f7.npy +03001627-68e9a9ebe0475536194b666f21552cb8.npy +02691156-7d89d64afbb5b24056dd1ba442ba87e2.npy +02992529-54b4288766d87dcf332f5e5df5b42874.npy +03001627-2ae70fbab330779e3bff5a09107428a5.npy +02933112-4c8e95fe5fdbb125c59350d819542ec7.npy +03636649-bd2dea41f32e4562ce11183544874734.npy +04530566-6e3db071ed95552b3faeafe37c2ce4f6.npy +04530566-847e8fedddf6bee5518c49741aed1bc1.npy +02958343-1660d6b7221223708a49a62fbc70ff9a.npy +03001627-b431161712ea348cdbbc9440457e303e.npy +03928116-2ada8e6257eee4b73bb4a1304fe504d3.npy +03467517-4b325df8da005995f0e1c0df18936d05.npy +03001627-7178731312819be3ecb14096838a20c5.npy +03337140-d88e590e79117ec7e7ecdbe73ef4323c.npy +02808440-7e3f69072a9c288354d7082b34825ef0.npy +03691459-67192701cf183eaaf2a2172bfa1bbe55.npy +02691156-636dfe39d75701b6cc14f1e6f4f4f49b.npy +03001627-d0894aed032460fafebad4f49b26ec52.npy +04090263-abcfbaaa409d62001d263b1fb57ddbcf.npy +03001627-80784cc9f549e4abc3bd24f986301745.npy +04090263-1762f93a8249ef356e4806bebefb1ca8.npy +03001627-ad7a6efb5aa6c289810da4adc58441d.npy +04090263-c4787a48747c6db1cc34b900bb2492e.npy +03001627-2d204f50f33b3994fe52ffd0e748a1ab.npy +02958343-175a289947f549b0e088606e38104b2.npy +03211117-bb01397739208d30d39a67ea53079d95.npy +03636649-956ef7ea0d496de01735ea0e092a805a.npy +03636649-64a45d75c1c5bad6f51f77a6d7299806.npy +03211117-f2b3efb28b5f5d56fb4038701c4e8e29.npy +02933112-36d62d9dcba0e3ec4da5feafe6f1c8fc.npy +03467517-11e4201608076126d67ed0980f6dfc4.npy +04530566-5cee5c3afee327cf360d3819686769c9.npy +02958343-b12841de144ea6fbee3362a8d2d8318f.npy +02808440-e4cd718118a15c40dcf3aa5cc0c09272.npy +04379243-6986716a76d8a2952ca3f5e9a38d33a0.npy +02691156-c330992ccc6154d82b6925c3587009fe.npy +02933112-a3a6f9e80956ec6f4035f93ab9531db.npy +04379243-37ef68300b944adac5a1529d102e7db9.npy +02933112-3115a3a0a61aacac59350d819542ec7.npy +04256520-7e728818848f191bee7d178666aae23d.npy +03325088-1943c8dfb6d5f0bb362845c6edb57fc.npy +02933112-4c7cc0a0e83f995ad40c07d3c15cc681.npy +02933112-817e119f087cf8f8f44880b8ee951142.npy +04379243-14bbf802bf00121267d783b4714d4324.npy +03001627-805bb12faecf99a9bbc0e8a3b6521117.npy +03790512-c7c8d9406c1a93ab52a0573c504629a6.npy +04379243-3cb345b1ef0f4d929a7e020ff2597416.npy +02933112-4de45ae952657a45330a170e9ceed373.npy +02958343-99f9ab439e890e79aff8ec395bcde91f.npy +04401088-e1effe88e974292f8ba7bc4a733e1db9.npy +03001627-2ca91e56bef8cb5034af953b663e921b.npy +03642806-8d9bae8897ac3f973c28672f19a43c87.npy +04379243-3af5b1ef3e742dedf4b6538438a0b930.npy +04401088-a13cea3066cd5b1746ab0c6c4666145a.npy +03325088-a9411c894038543ec36fb70296e45483.npy +04401088-d9ce2d0be1f3952aa36bec4fa7cd58c9.npy +02958343-a49df2707037f82a94ce9d7b04676231.npy +02958343-2fe4a878e34bd3bab8013668e30e23b0.npy +02818832-6284bce6e6fe15c8aa69dfdc5532bb13.npy +03761084-13290e02935a82a22846fa729d90e125.npy +03001627-89509ce24bf62df0950baa3a522faef2.npy +04379243-6be99fd273c3eb879d4c79351958f461.npy +03337140-657db7fc093199c891c352d02061b3f7.npy +04401088-312c430f8b1a3fc80249ed612e14df4.npy +03211117-eb54df4a6211364d49d7025d277c28a1.npy +04379243-7f6a5ee3a0fb9ff19fb4103277a6b93.npy +04379243-c87012fece9848de87f79701ecbb26ac.npy +03624134-594dd047f15ec08ab1e00d60b0f9cc70.npy +03001627-6aaa9bd6e835eb0f9b9f2eb77f5e247e.npy +03325088-460cab47b5657c7176c18e71fd49c4dc.npy +03593526-10af6bdfd126209faaf0ad030fc37d94.npy +02691156-e69631d34410f99ac4f72bf08dc79a6.npy +03710193-d80f223e5e1c96d8e4ae8899818510b8.npy +02808440-ee230a2651945801b20f6e48f6a30cbf.npy +03948459-f6d52684720d52a01ab78426351eea4a.npy +02924116-c8284ae0b7a06eaba697ce29493f3815.npy +03691459-2c64384906f809f09e9eb484700b40ce.npy +03790512-c9c41d106fc36402b0f9875a6c9bf605.npy +03593526-78c709102ee8d89ab7d0f3d89bbac230.npy +03001627-26ece83dc8763b34d2b12aa6a0f050b3.npy +04090263-1dc7cb6866488d93cbb897b3e6934456.npy +02691156-fbb2e9c15888afcaca504cdc40c452de.npy +04379243-41a464b6ea17ef5ce7321f25048c6142.npy +03928116-809307d04ffd3fe5650ef5c65206a324.npy +03325088-32afa83cf029cbd414b35a7d7cea7130.npy +04379243-cfe15cdc16a2e2054e2e1b2af0cc59a7.npy +02808440-cd21cb60750fd91f4eda040ae95dd4aa.npy +03001627-8ca2c0a0eed4a31abb93315448664e1d.npy +02691156-c7ae9f9e3f95ce76adecb6fc00604132.npy +03467517-233064561655ddbce4ca9fc57c06f078.npy +02691156-4f9b12d07dce21ac9d93a50cb0355558.npy +04379243-4019bfe9bd7605f7a52709499e423710.npy +04379243-6adda4f50154d662492d9da2668ec34c.npy +04256520-93b09a953435a00175aa7f24a9b6003a.npy +03991062-b8ad53f8af09fd10e299f2c0038a26f5.npy +03691459-6e6b4d2603930dfd4fc88114be3a6b6f.npy +04090263-70459a553f42c300f85b811e02bb4272.npy +03797390-8012f52dd0a4d2f718a93a45bf780820.npy +04379243-a59ef94cc10c7a434e6953a92bb25210.npy +02933112-c365225746f2eb94ce5d6e9371bb5c33.npy +02958343-d5c4532a34ba10e6f9798a883006064f.npy +03001627-3b8f2b955ee9a904b3c42e318f3affc.npy +03636649-c43c89d862e10552b24ecc319936dfe2.npy +02871439-9c3319cb3c0a2ccccfb1f9b76452480a.npy +04379243-d083fd20f6f953fd4187eeeb0dea4986.npy +04379243-ce4fde399bd5f6f6784a45ea6efa1d77.npy +02876657-6b810dbc89542fd8a531220b48579115.npy +04379243-565225390d303601c0f947750540fb22.npy +02924116-9384cf835d1edf0dc95c7a8a79dc0c72.npy +04379243-15d58d8098de68aa48d189f942cedc62.npy +03001627-5b1744a03be753cf3ccbceb68fb352fd.npy +03046257-e43b7ebc9a1b71c95dac0a5eac75a2a5.npy +04379243-e01e72e173dd2cec8c76ec1f86d432b3.npy +03467517-3f287ca94b719bec282708d01f090528.npy +04379243-97deac79537426ac9255fc5df0de0bff.npy +02958343-8242b114695b68286f522b2bb8ded829.npy +02958343-91440448603dffb62c8b6ee41d7d5d62.npy +03636649-c61d6c246dde340462a510b8f97c658e.npy +03001627-9b27e1b557a5e499b01c58badc8bbc39.npy +04256520-7e1321155d43dc8bfff16555386d173d.npy +03211117-324ef9fa783f6fa3a70ed7ac6903e853.npy +03211117-4a2a1d7cf80d6031275d003e423c59ba.npy +02876657-78d707f4d87b5bfd730ff85f0d8004ee.npy +04379243-65164df6ae3dd848a1d7c136d0e341.npy +03691459-dfe7f79a9a4279d09596b23e90d45a7.npy +02691156-437de410d7c23cbb29b33c3ec58287c9.npy +02747177-5268d7d72312c3645fa85fb6e983b148.npy +03790512-52e2bc89667a8e35617798af67b81f2f.npy +03636649-1a963b28c5520cc737b2bb75885cfc44.npy +03001627-b42e4fd21f39ff4a19fb4103277a6b93.npy +02933112-91b2bed2f4b87e615164a043915ac8c4.npy +02992529-20346d307d39aa7eb6a804c25e3218a.npy +02958343-95ebb3fd80f885ad676f197a68a5168a.npy +03001627-71b53a5f441d45b742b7e4c0136bdb7e.npy +02924116-193fdf550fd5f12f446f92b52bbd82a.npy +03624134-3fe6dd259603ea70f342cbac7471c0b9.npy +02808440-9d3e7604b922e1e551b711a0825fda5b.npy +04401088-19b1c1a790c6824578bfad8b5ed8c4ef.npy +03624134-1574b4bc968ff33b33ae329611c23135.npy +02691156-c4f22c879e8adbc6aaae11b67645c759.npy +03046257-702fe577155d343cec77540dd1841b98.npy +04379243-ea3ecd082151c2137ff6ace05b36a5.npy +03636649-7d6dd04be7630ff01735ea0e092a805a.npy +02691156-24c2cc372c63603137678474be485ca.npy +04468005-96d5563fd3dffff75706d1c54190f27a.npy +02933112-5c2d14889827e1fc14038d588fd1342f.npy +03325088-a851047aeb3793403ca0c4be71e7b721.npy +04256520-251cccb082a6d36024f2ff737a52b0c8.npy +03001627-beb8876f47c5d4287eaeab1f0c9120b7.npy +04379243-11e12804b2712d08bee8ec52a122c491.npy +04401088-50504687883a08e3c6587b192c4cd3e.npy +02876657-33f6ca7ec9d3f1e6940806ade53ef2f.npy +03624134-4ad7d03773d3767c2bc52a80abcabb17.npy +03001627-4ea3d680127a9fe91360172b4b6205b1.npy +03636649-f9ee021d829cb2ba1cff7132ce500fbb.npy +04468005-3dcbbdebe3be1c53f54087fb0e024d3.npy +03991062-fe6737dfa2c07780d4d8765e3910f617.npy +04379243-3f14c153dc861c0990453a996fcb7627.npy +04379243-7d4c3e8b3304d8f823fe3501bb9e7193.npy +02958343-1176dff7f0ec879719d740e0f6a9a113.npy +02808440-d0df653cb5c1ca016b6c87c9f47318a.npy +03211117-ac2ea2d41c57d1075999f9ba82d15928.npy +02691156-420eb46efaa81427b60ce16063f0788e.npy +02992529-b45f58361ed3ae739d2375e90e0e0425.npy +03001627-bea34ffef0c02f07492d9da2668ec34c.npy +04401088-e8c4ef4c74c631e83628c1e9941a8ab9.npy +03691459-2dfc635b5ea197bbb611871e114769d9.npy +03948459-b0a050985a5ce6be25508ed649b952cb.npy +03636649-89622a50662e28d56c09b6371c58b533.npy +04256520-cc4a8ecc0f3b4ca1dc0efee4b442070.npy +04379243-192ec952a75014d09eaa55bb236fb6e1.npy +04379243-6d2783fa677cdfdc14e775cfdf4a76ca.npy +04379243-125ef28adc874f72934a4834f9d7586.npy +03513137-1dc0db78671ac363f99976ddcaae4d11.npy +02691156-b5b0dac4093a61cb3f2b01de37c0b29.npy +03636649-2b8dbd2f75503fb0c29700c28ff4f50b.npy +04379243-8d608e1a1a1f34adf4b6538438a0b930.npy +03636649-def342a8d095d8501ab5f696a41d80c.npy +03710193-514ed68efd116443493f0d0eb265f250.npy +04379243-3e34ca92c5067543fe9536dd9aed405f.npy +04256520-5cc1b0be0eb9a6085dca6305fb9f97ca.npy +04256520-1837416f6aef641bafcd24b8661a2fd9.npy +03325088-6102c9de80e5625eb362845c6edb57fc.npy +04090263-ce400eea04127631b8611345dfd403f1.npy +02808440-8825b869b855967fc197f3661a4ec752.npy +03636649-608db437f2aab3c13cedb1808e691a01.npy +04379243-991738fc61b81af030ddb6ead95f49cc.npy +03636649-66fbe6533abfe75195b26656722dea64.npy +03001627-42836979b217e0535836c728d324152.npy +02828884-aec473af77a77008cdb14b1e0ff2c14e.npy +03467517-1387dfc170091bb33c5494866fecdbc.npy +04004475-7f60e19e4f1b7b92f08c6efc59ec3825.npy +03636649-7ec821d5d8bd9f17d4aea4231844b26b.npy +03325088-684e3d299f3f7910843f813f752a5e35.npy +02958343-ae088f798f2c99c2927e12317acf49e7.npy +04530566-1c974cf5f4053701876d2c2355e426da.npy +04379243-d1ef95530469a1de1fc4857cc94b6562.npy +02747177-c1177110cf5b9b12a3c9394112c76917.npy +03001627-5283a98b5c693e64ebefe6b1d594ad2e.npy +04379243-cc05a1835e7edda1c02daa819b61338.npy +03001627-6697a325ee92e17695e321e9c6480.npy +03991062-81264e9ebc22cab136b0f2a1430e993a.npy +03207941-270b80325b30676592a31ec18c4e190a.npy +03636649-b88130805777f2efb76e29c9c43bc7aa.npy +04379243-20f561347df7703c9c9e05c155b1837a.npy +04256520-f0961a7006186493df6cfab91d65bb91.npy +03001627-671d34c27cc0f1bf2deeb5ec76cf103b.npy +04379243-c676bf562cb559e5ea820b41f77ab7c8.npy +03636649-421c9c7d606e0cbf26c27fcd604ee778.npy +02958343-24866846d728484e1d1a964dea8a7aab.npy +04256520-2507270b7e344bbda494798fa117187b.npy +03928116-6a5cbedab021de133516f91af8d2e0cb.npy +02691156-acaccf2af6ed78925a25a01ca5b91f98.npy +03001627-6be6173e7eea5888a616caf97d73fa02.npy +02818832-1aa55867200ea789465e08d496c0420f.npy +03636649-42cd4d8cfa141d4d374110224c1c4eb0.npy +04090263-199c603cb0ba88899ac559af07c55afa.npy +03636649-1d5ed34e8ccd86a88c94c2386714981e.npy +03001627-7508cbbffe5f2f95f51f77a6d7299806.npy +03467517-6bda8064db052734cefc37637c8d9a99.npy +02958343-5662d48de15dcacee1c2519ec6f06d41.npy +02691156-71fe2583bff79bf1c66589cdaf418925.npy +02992529-e76bbcc0029c979721844676433a0aca.npy +03948459-6b2d89a7f2b173f0d9deb3f829cc2475.npy +04379243-5fc5ebe830d27064563796b09a95b12.npy +04379243-dab44e951363e187ed44d599900d391d.npy +04379243-2633bba6168a580c8997f7623978b6e4.npy +03001627-b30517fab8b8300bfed6ad7429dd8443.npy +04256520-99ec963187a1cd2593ebeeedbff73b.npy +04256520-1168fc14c294f7ac14038d588fd1342f.npy +04379243-d5402d5be271438ef51fa0238791f5dc.npy +03636649-64f61c9c81e3eb7b8aaae3d020f5ddf8.npy +02876657-cdeccf2f410846d0e0155f56493d36bc.npy +03636649-6ffb0636180aa5d78570a59d0416a26d.npy +02933112-17e3997117f88d921ba9fd11dc8bf457.npy +04256520-ae4f28a7c4e22d9535dda488a4bbb1e1.npy +03046257-14d26e0c75890a69d1100e95297cce90.npy +02691156-2764f43226260c94a5a118bd15e6e34f.npy +04379243-690c3f8a4e7d384f1270a3c39ec25c61.npy +04090263-cb392c32ad0446aa576cd215d51ddd.npy +03691459-dbb3db217511d9cbfb906a2c84fd375f.npy +04379243-98c67a49d64d7bed1cf96a5dc33e37f1.npy +02958343-1336353d15efdf010f6f717db02df67.npy +02942699-e57aa404a000df88d5d4532c6bb4bd2b.npy +03636649-d3194dd3e07881828f58d8b19de93f99.npy +04256520-ffc1283c098f46cbc6ff4c4f6444568b.npy +02933112-56253642219df29c37d43e094da89ace.npy +04256520-a0ce7fd10e80a9f9f0fb3e3d2a0d34c9.npy +03593526-398818a67897e02fbab0ed993e467961.npy +02691156-4f7814692598ebdc7dadbbeb79fd1fc9.npy +04256520-d8b0f33dd965d49447558b47f7ba0b0c.npy +03001627-d0255120e3351121c3bd24f986301745.npy +02924116-6f764b306282152971a782a4379556c7.npy +04468005-e429a05307bfdefeb8976e45db2e8d04.npy +03928116-4b29f873229621a13a1b23713d5a88eb.npy +02818832-2cd2307d0ff140d71bb5b0562ff6c354.npy +02691156-37d32db3143814fd9a55c6af6f4b2bb3.npy +03001627-b34d40cf68d35685edd5830365d88456.npy +04004475-37f2687738571a0518e2de4e83d3a734.npy +04090263-4f0659c5971bcfbead2649d755c19c29.npy +04530566-396fb90a02afe669258bd22729297863.npy +04379243-91981bcdf94b60cf3e5af54d0ed82d00.npy +04379243-57e4a4a4806c38e33702d3e624608075.npy +03001627-92373022868b812fe9aa238b4bc8322e.npy +04090263-8fbd9668fdd563f5359ad7d9ce49f504.npy +04379243-7486e6cc0f457c4c12a1d8ce70d3a8e.npy +03636649-44cb50f7614a4574d09ae058ff1abff8.npy +02691156-e51b620853f2cc0137678474be485ca.npy +04256520-3b66e52a5272e0b4851fe006c784eab.npy +02808440-b9faf51cd53539ae8bb4434d620302e3.npy +02942699-4852ee95e7bd8556c60396a717ba6c7e.npy +03991062-f8a37a9da22f9e19c2ed3fce8969c0e9.npy +02828884-1d5d89cc3c83bef056f6fc4b4ce1db04.npy +02828884-c67c3e22b0c0f34e7db48c721db3fba4.npy +04401088-528e6424ccdcf2af21844676433a0aca.npy +02958343-204b1b3e35df174859fcf77704d7f1e8.npy +04401088-31e8327ffa4ba6a87790cd6f6e8952aa.npy +04379243-35b696cb05089cdcc8dbe21f531a88d0.npy +04530566-f2b504b2e368bee6d3c2fcae9650358c.npy +04530566-792427f5da01907ddf48ca5a34c88e7c.npy +04090263-60eccc70ad4f9aed15b3bff1113c0f8.npy +02871439-b45ab0b19e7ba07fbad912dbade87ed7.npy +03001627-b7fbbd8cdd2b0b27a37bacfe19b0d747.npy +03691459-5755d5aae08a8f2dd9c568a52c35ec71.npy +02818832-162af9629f9071cd38f8f3d7f64ab05f.npy +02808440-8183d981730d9f4b4c62bee40dcdc539.npy +02958343-b11c0c16e0eed1f4b8671dc42cc45273.npy +03691459-1301670e3ddb72b099284d844aba7576.npy +02828884-cad0a0e60708ab662ab293e158725cf0.npy +02691156-b98a46b40d030e8a26360e1e29a956c7.npy +03691459-6d755a3d6d0f265d77ea5e1afa5bfe6.npy +02933112-b1f23b772bfe59c2f766c600156dc40b.npy +03001627-f33b6f791e9d64387d01b77e04a0bc7b.npy +03593526-6c7bcc925e7c6fdfb33495457ee36a49.npy +03636649-3a58b059261aa07229a42a0444436860.npy +04379243-23b7e640f09dcfabf1477cd05362531f.npy +03593526-97401d5d5b06df3cf470479da1b48414.npy +03046257-3d027f0431baa68a9dcc4633bad27c61.npy +04530566-ff54247b18f676d9129032621d548b11.npy +04401088-69e334b26683a81935bbff93749c520.npy +03001627-70aaed71e394259c87a0ca36e3a00f4e.npy +02828884-4eb3dc26aad9ace8f4fb4dee5181bee.npy +04379243-f7600660924857c0d31d0d81bfe9c743.npy +04379243-25244dda23e8f58d788f926f4d51e733.npy +02691156-de1a7b4e9911e48b48e8405d6c51a908.npy +03001627-4dc7fe6e98c4db21d79b19c7c4f0e293.npy +02992529-a24fb0602fc7fbf4ec059109909662d2.npy +03790512-8134a965cc0b134bb37378f3c85478b4.npy +04379243-480ddc59636d6516659dda512294c744.npy +02958343-1c1a3dc04b6f1f8fd8162cce87567b4.npy +02691156-fc5d7c28e254a0d84c3a35cee92bb95b.npy +02876657-6987e839b802a349a9039b9668d0f11f.npy +02958343-3261855155346979473f10e6caaeca56.npy +03790512-a9e2a1de33b99d08b37378f3c85478b4.npy +04379243-1b90a6d174038fca46ae6b1cc949e238.npy +02924116-b94d71a0d28f79de613cc927c5b662d.npy +02691156-9acef1e2e46120f8fdd77aff53f4b7ba.npy +04090263-a14547884e1ab54f48ae8c3efb265806.npy +02808440-1384585a48232ade2b4641ae88b2ff3f.npy +03636649-8f7863c4940c99211735ea0e092a805a.npy +03211117-f6722edbe92ed28f37b2bb75885cfc44.npy +03001627-491eb8f7028d06152966622c3d8ee695.npy +03211117-37eab42757ae1545be36894b151eda76.npy +03593526-98317e58cb7f2c5c598a453fd9fbd988.npy +04090263-6afd1407c216151994bdc5b116ecd8dd.npy +03001627-b1f85c18b3ccbe3a8bc6f322a9608b07.npy +04530566-1eac28fe0b2d620bf0f75e254acd7ce4.npy +04379243-a1446962064bdf3ba5342d638d0c267.npy +02958343-44eb9496921072b6e5f9082491d52810.npy +04330267-69ad4c4dab82ce29a642711976cdde72.npy +04256520-11b36d8f9025062513d2510999d0f1d2.npy +03001627-54054535e70d9ca0f91663a74ccd2338.npy +03636649-67e03d2c2b7f6b19b38821f893bc10f9.npy +02876657-c80173e23efaac35535deb3b0c692a2a.npy +03938244-89fd3acbd34e72106a6cca39468798a8.npy +04256520-d9d4b2af7ada1426fc385a284336f217.npy +03001627-99a4ced5a15438131ff008919d662aea.npy +02933112-4073ca6ce52b5d65ce5d6e9371bb5c33.npy +03636649-90b0f9a1ac2e54ecbc7f58784fda27b5.npy +02958343-c53256341ac5693c66d89345e534c861.npy +02992529-c1077972752aac54e8deab000196f61d.npy +04530566-cff1998a2a2f1b5985f7a3de54751f1b.npy +03624134-5ee83e84f18782eaffe50f88045d4553.npy +02828884-5d4fd92c09e3369256f6fc4b4ce1db04.npy +04379243-bd974108a3455842668ae11a7db5e82a.npy +04530566-3173f703a1e52d7f38d037116a032a18.npy +02924116-1bfeb10fc8e4435591020bf045ba1fdb.npy +04379243-17936c67b822fdbb6129e6c3b6c36a7e.npy +04379243-53b0206102d236c99f8c3d2002c77ddb.npy +03593526-24f615dd07dab76cc6040c0e6de6a84d.npy +03636649-9c3c8db3c4b29c8e7bcb070cc655f13a.npy +03691459-fbb7610643dae4a34c5341ee07f41676.npy +03636649-3b20c6ffdaf2dc97ef0add8da8532fa8.npy +02828884-cf873b381095c2d43cbc166debd211cf.npy +02773838-adfe9029a1ca723eb8966aeece708f87.npy +04530566-27476b5c965b010618b731fab8bc3743.npy +02808440-8177f9d2397e8dd3d85b29704f5fc7f2.npy +03001627-5c28b7d86cdf577c944bd645bf5a9d4f.npy +02808440-6458583a168aa52af42a90fe4baf4591.npy +04256520-95c9ed9cbdae00eb768c07b3cdb90be.npy +03001627-8b38389cef61cf06fa675450a2f0c084.npy +03211117-3c475567446dc6b7d6f4cef762589739.npy +02828884-cb4c2ef4e926f7c6d4d8765e3910f617.npy +02828884-7a8dbe4a1ce3be987962800be79c6e52.npy +04256520-c8466c51d29e4782dc149927e19d9b07.npy +04256520-709f1d6837ed560bb12cf25c409aac26.npy +02871439-840ffef504ac563cba5b64592e406eca.npy +02958343-cde88b5900e8dfba725a7749daae1afa.npy +02691156-8af350191d35e65cc3fe7930fce05ded.npy +03938244-7a555dba7e9f00549276a66e8d922b73.npy +04379243-3b8af4931096a5b7310cd758d9b7cf.npy +02880940-ff7c33db3598df342d88c45db31bc366.npy +03991062-3dcea39601c77b69a2c59a4d90e63212.npy +03624134-135f75a374a1e22c46cb8dd27ae7fcd.npy +04256520-ae1b6411a089bfabfff16555386d173d.npy +04530566-d09202ccf8fa18d7de6289e76b045123.npy +02933112-5e6c95a93849d3a9cf004563556ddb36.npy +02924116-6c3edb2e494dfb34238f44c3636a01e9.npy +04379243-2fb395d53b34b02fae5873f5a6ed699.npy +03761084-1508af47d1e83932a10831b4711b98b9.npy +03001627-554dbcee2b9ea7301c75d484f9069623.npy +03928116-4a969cd6fc3f2c0a834096795cc3cf10.npy +02691156-cb145792217196e27d64cad20089f027.npy +02828884-aa7f8ad0e6108db92056b4bd5d870b47.npy +02924116-a1569abb031718b9193d7855ecfc1bd3.npy +03001627-c523e86242af4b4ecf6d196856691e1b.npy +04379243-9a2529a1b49282cd6eeb02236344250.npy +04554684-63b49123983e4cf67a31dd5af93fdb5c.npy +03211117-1a5494c28b607f699263b5578aef09fa.npy +04379243-17624075a52c9b15cab01e89f60c9290.npy +03001627-5a95f4fbfbfc55bd93768e7b9b1eabf.npy +04090263-344d200007e2f72e9352b002a7d38daa.npy +04090263-3cb82befc3290e36b58435942a1b4dac.npy +04379243-1d93291de09fa5c876e9713f57a5fcb6.npy +02691156-9712035b78970ca71e623da3c4e40c05.npy +04379243-57f273bd63f5287199e8bf807e902261.npy +02691156-4f1fb7c062c50fb15a2c5766752aea65.npy +04379243-68e8c6def7cd57053e946fb2184f0c4.npy +02691156-e7c1bb596e9a1ce9ca8607f540cc62ba.npy +03636649-e21f21744e65eb1a4ab1b242068f86fb.npy +03593526-9119ef4a6a876ff3664b3b9b23ddfcbc.npy +04330267-177fedf455e50b4d352845ab138522d8.npy +02876657-c82bbd1b1a929c7ce8ed8cf0a077ddf7.npy +04256520-25fd91f0cc5c2e30e1c2ef56608a124e.npy +02828884-fb39d112f22db46616462411d4c2b1b9.npy +03790512-3d37db1d974499287395d58407f193ba.npy +04379243-80131db5f6be83b7d7bf6fb68df7f786.npy +03001627-e93649e36377a12050e52c25df21b57b.npy +02958343-feefd0978ed8e256bc050b2495b2b4ff.npy +02828884-4eb44cf234eb74dfcb2a965e75be701c.npy +03325088-5450352c9ce20b61b362845c6edb57fc.npy +02691156-81bfc74dd037d1ea88d58cc5b9d401bb.npy +02828884-6b7e64a23106bc6ad81bfa7b5196f847.npy +03001627-8cb44a50906b827615e7ec87bf4cc5ab.npy +04256520-f6ef2cc4bb31d953a40f4c396e0c7dce.npy +04256520-e09efbe78b2adfc322d06a647cb73a3b.npy +04379243-7205a833bced185c41bad6f6f893aff7.npy +04379243-1c9aa0fdd563da04c397356311cbeea4.npy +02828884-6d9c95a2409a8c90391e4d6c585a697a.npy +03211117-83ceb90b398df731a8b411915b2949d6.npy +03691459-663174c8076b969eff258dbde860ecfe.npy +04256520-45cc71dc2483972e742728b30848ed03.npy +03211117-c8d02bdfb32767648e4cc49dd8a5f1a.npy +04379243-7fda06ada2d897baadab4c26397edfab.npy +04379243-64d243c58e649783002761e7a3ba3bd.npy +03325088-247e144e0babc15d76c18e71fd49c4dc.npy +02992529-48a2000b54f4fc792a56a29c6d979b82.npy +03001627-d5c67068390ece634060d2cb099a78b3.npy +02828884-9dde18e7a5ea2416cb2a965e75be701c.npy +04554684-a428bf705d0b6a5ddf3a1b0d597ce76e.npy +04379243-cec8fab8ad62fe3840f3ac0af6b7e700.npy +04256520-b3b18a2b0bec3bf1593ebeeedbff73b.npy +04401088-49a51e66314253d3f2a0433fb7c53e0f.npy +04090263-2859d1753713558412b38b1d99376c0b.npy +02691156-f3cbfb52ea1c907a850e00840470903a.npy +04530566-933aa8e54e97de9392694c864c93195e.npy +04379243-9f2dbddee73c639ecea003eff0268278.npy +04379243-92c68ae13848ef32c3bd24f986301745.npy +04090263-12a5e976e028409ca67ac8a08d7e171.npy +03691459-6eecf81ba7508617cee3603bd2c54843.npy +04379243-e8502118aeed3381d5b708f09789d978.npy +03337140-98db6cb890a9776f65ec59d478b48347.npy +03710193-8700fb772854d8c2dab143a63ea21a89.npy +03513137-9c5d16afab1cd899d1f50c75142faa8a.npy +03001627-eea2622d5a8ad64bcb23db7a28593905.npy +02958343-e05680db6f028c15bda733a39f84326d.npy +02933112-190cb7264781df604da5feafe6f1c8fc.npy +03325088-b73c4ec843ff090dc36fb70296e45483.npy +04379243-a9e371d1c714f222716641f54c7a54f1.npy +02958343-ba3e00431d584664c0f081c0bea90dfe.npy +03046257-e8c8090792a48c08b045cbdf51c133cd.npy +02691156-59eecc0a983a27a8130cc35407fba74a.npy +04090263-2c9de4575938dc88d1987c07c912c6e1.npy +03001627-48dbd34c00d1a5ccc9daa743e958a401.npy +04256520-6017c8c817937296e1df71e82caa58ae.npy +02691156-157a81baeb10914566cf1b4a8fc3914e.npy +04256520-6e213a2ecc95c30544175b4dddf5be08.npy +02933112-ca15dd33a276b636d1fef881bd33f613.npy +03211117-195ab29b4e0bcdd07b20cb946bceb58f.npy +03325088-97a5a1bd8e59e98ce2f066782346a992.npy +03691459-1cfd7a56b1d59ed837f7fabf76ffe0b0.npy +02924116-9862dbfa48af20f5353941f152341c47.npy +02691156-fc25e0cdcb2ecf1ca2bd098b9203af.npy +02958343-646359acaac0219f4096f51fd3e2ee8f.npy +04379243-7eea0fef45efd698a22a3fbee2fd609e.npy +02828884-5b24beacd0385489a6ca26b5255a8e6.npy +03325088-1fa1f1515365ecb0b362845c6edb57fc.npy +04379243-146f90f6a4d8c7bd142fb08fcc642f29.npy +02691156-c06b54fce5cc4961c9d5e99e50e5e709.npy +04090263-cd50da8bd34f050af27eb335b754fdaa.npy +03001627-60167ae64899f8ae966a40fb39b34846.npy +03691459-c389dd22f9209798f72fe2e3cc67d234.npy +02924116-cb5239d87f4d903b6df42853f67b5836.npy +04530566-ec685f1f4bd71a191bf585548743bf8.npy +02958343-875bc6efc7f33c052e877e82c90c24d.npy +02924116-b2c1a1240442a1edbd2004256abd019f.npy +03642806-fd2f7a1c6eb7a0d4803dd502eefd8dc3.npy +03636649-3ca8da93aff926a4edd822c7d5ea26ed.npy +04379243-5807c27ba3c04612f51f77a6d7299806.npy +03467517-1b65d2e0c0ed78237e1c85c5c15da7fb.npy +02691156-6aeae52e38f892a7e0091ae06332b2d5.npy +03001627-748d7e99a0ed4646f4b6538438a0b930.npy +03001627-8da91a953d645457456cbf78e1e89022.npy +02933112-429488f8be42c9ed73149e0cf45b2c4e.npy +02924116-290c67589cbf5a1e52470de2774d6099.npy +03207941-707e9078bd63a41af7fd77472e77581e.npy +04379243-a6fea71cb6bee0ccf529ce6ea3376441.npy +02828884-b65f1141e4eb2529100a6411eafa7455.npy +04530566-63f170670881b2deaf6320700e3cf173.npy +04530566-b00e1af5a8d0674efe9d6d96542b8ef4.npy +04379243-8b3bae4e65ee0f67caf7718498824d44.npy +03636649-bad4a1e98a6111f7db48c721db3fba4.npy +02958343-235392f8419bb5006a34aa94ca8a3355.npy +04379243-711075229a3bb0fff51f77a6d7299806.npy +04090263-9af23e8759e070ef35d753857de68a9a.npy +04530566-b25e91edf5510306eb2c303a0e0d287b.npy +04256520-73e342d3bef02e923d6e282938a47f9e.npy +02942699-c3e6564fe7c8157ecedd967f62b864ab.npy +04379243-f2797245a220fbf1850622797c13f562.npy +04256520-a17c259d1af349dd45c21ae2e309d69f.npy +02924116-c6861c7c959431979868593c91e945f9.npy +04530566-61142394175b9e2b6a42e03bb7759e0c.npy +04256520-f67714d13805df294b3c42e318f3affc.npy +02691156-3b9241e85d07de6a8b6c3e7b944b34fa.npy +02691156-3e0e8b37400e290125b57604d8b9519f.npy +04530566-bc698a05ff49b6e06d793283e2a4a87e.npy +03001627-5ed72ca90351b0c4d5b24cafb84903c7.npy +02958343-6265f0745d3f40546bcd32c43682e841.npy +02818832-a2499fdc5535875087693c0a016606d4.npy +02691156-18d994c4f8362cfaee9d01b4b18e1b2f.npy +02958343-33211aabfefa14603b05c2ad25b4380f.npy +04379243-b84b06178cb49ee171d0a1a8ffd305f4.npy +04256520-16fd88a99f7d4c857e484225f3bb4a8.npy +04256520-6a2f4e3429093be819fb4103277a6b93.npy +02828884-29aa1d7505e08fb66706998a3e61629.npy +02992529-5e87bca3231cbdf15b5f05be350ae67e.npy +02691156-e812f54386acd072d44f37c9e0fb10d0.npy +03593526-af61c129521b9a36ad56360b1d2e97b8.npy +03624134-7855c181c65e964a7f277d7152b6b3ed.npy +04379243-8af2d1420ac255be490ad276cd2af3a4.npy +02958343-fd3c767468a825ba860800e6696b8284.npy +04379243-ad62637a77b172af3542091189dc62b5.npy +04530566-c746175e0993abc19a6e43b878d5b335.npy +04256520-5d15e6c23f233a13ce60514f9a637ce.npy +02828884-748e447a5f7a698df155d75bbf62b80.npy +03691459-e22ec5ee664f7c172a9eb0f146e94477.npy +03325088-7719e435d30b6aed50da8b99982a3057.npy +02958343-8f7520f908ee54e2391da6d66c78fad2.npy +02958343-6058ad4a6ec4eba46436916a86a90ed7.npy +03001627-c133c2af39e7d169b1a9ec000a076431.npy +03001627-273fe8996937648ac8744f5d8b9af88e.npy +03001627-766d7892fbd7a9f58d6e12c39b2d5023.npy +04379243-3e4cba53909d9bc8455060ebe53aefc2.npy +02958343-61c4db4cd886250f473f10e6caaeca56.npy +03325088-c8b9f478f3b94b3513bcf6712568dadd.npy +02992529-cd74be6a1d8a6cc721844676433a0aca.npy +04379243-782a5262c3d349e3c3bd24f986301745.npy +03691459-ed0f8fdfd9e1182cf83b540214901572.npy +04401088-953a952a18e389e4eb386a4e845c05f5.npy +02691156-24d4c063f7a361bacbc6ff5546f4ec42.npy +02691156-bfcdf2928e854d109b6724d4f3457e3e.npy +02958343-d3869e2527ff032623276041d0efb3cb.npy +04379243-729673ab33a7c9cc4d3a0a56bdd58a7d.npy +02958343-a86655c0ca05c2646d3e11439c6c22c8.npy +03636649-bf792ee1a5570858d0615e6a68ba2d50.npy +02958343-bf493207165e9359492225f5fc55e666.npy +02992529-4b97582ec707108c6ace02f573c40387.npy +02828884-edac7cf37d1d7a42c79156efeb6d05c4.npy +03691459-3fa5d9e396596d36f7d10596716a94c9.npy +02691156-a9b2d531e073113f9d1eb836604648db.npy +02992529-7f6a27f44d8c9f2bbcde31492651e03.npy +04379243-33b727a7c5e984bd377c09d18bd75e8a.npy +03636649-29a1afd3e6c25af71b17743c18fb63dc.npy +04256520-2434dbf29922a0a44cd8f60141ab9d6d.npy +02691156-5459029489f68030590874dcd9dc8481.npy +02958343-fa8ecf7278bb320bb7ecd40416f4e39.npy +04379243-895c87ab1c2e404de7c7920f6a65a54d.npy +02828884-84e95910bf6b0b3bb411c6406cd0f9e7.npy +02958343-174f1a421f652029d577c0ac53e96823.npy +04379243-9f321f05a7808719ab610b0c94236463.npy +04401088-55698d990b8147e33c7b6ed91d531bc.npy +03691459-c7c2dcdb1f3e85dd35cd53a06b1d2317.npy +03337140-533fa6cf9a7e1e724c3aee8e9d3a6ffa.npy +03046257-49aa40472dfb892ac5d70d7dd4a0dae4.npy +04379243-8ba76dfda765f72b7c363db824bff7dc.npy +03001627-4e26eab28703c12bdd5f3f2440a93d21.npy +02828884-644043e43b18d2fb4ae9e8fe36a5d4d7.npy +04379243-3822433e287ad25799e8bf807e902261.npy +02924116-b501b9b43dd02c2beb2c303a0e0d287b.npy +02691156-93e0290ab5eede3a883f7527225435dc.npy +02958343-84dc5b9d1a60419b7cbc6cda01aaca49.npy +02691156-4ed01f44e3e422dff64801ad2940cdd5.npy +02828884-c3ce87b94f493cba4ecb12161a6eb47c.npy +02933112-11224ef64e1702b412e0c474ff07001f.npy +02933112-fe5f6a2aab0091438860c69ebde1e4b8.npy +03636649-caf2efbfc9ebf42ae068fd8aad8767f3.npy +03691459-47f062aeb83f19e1618595b659cf68fe.npy +03001627-8e7f354489bf4d9b65684b1827478535.npy +02828884-991c84609666c015da34af5fa7da2314.npy +04074963-5938818cc2f2cfbe9cb9203a133c0554.npy +04256520-2477014dfd55144ded526a7be77b30e.npy +02691156-c9584d90a1da19f723a665a253ac8cae.npy +03325088-8e912dab210f460778fe949fc1419876.npy +04379243-951a9c85494b53993c2e50348f23d3d.npy +02691156-2dec9e7b1acf88fea8e091cb544689d5.npy +02942699-c802792f388650428341191174307890.npy +02828884-b03c1ad073bf95cde9edcfa70ed557a.npy +04401088-5fefcb474b6dca4b23b380c931ece1e8.npy +03001627-3d67836a3bff5f733aaa67d66207f5e3.npy +03790512-7c34fdccf25e4113d5dde04c96fd8146.npy +03325088-24f5bd8d409c7d89b229726a165222c0.npy +04379243-57afaabf994feb305512673aa47c7e3d.npy +04379243-6358336cbeedb9232d9fe390e23fd20f.npy +04256520-8634968c859b2dba5e4b35ff1ea95f37.npy +03001627-2d0344ee62954b0afc4743bde9e89079.npy +02924116-486ef7a6c13e67522e8c450c92d469f5.npy +02924116-6747a3af99c639e683d931288a9d25a.npy +04090263-315038c85d3e3f4a1a857c47fd0ecdc3.npy +04401088-fe02978cb3b6fcc4cec837e48e8de67.npy +02958343-cce33c56b1c83237c7b48e36e31209b9.npy +03001627-5f8b70c628c7f6fcd4fd21ba7448467e.npy +03211117-3ee0923254671a1ef2bc9da1ba799c60.npy +04379243-5b75e36e302eb2cee9b7ceaf400b2906.npy +03001627-b08dfb07c78a348b19fb4103277a6b93.npy +02933112-a5d193fd45690070b93ba26740e73067.npy +02691156-5e34c340059f5b4b1c97b7d78f1a34d4.npy +03211117-42ad980a4102f1c1bac465483662a51d.npy +02808440-a6c700ba871bb9d7f76e18bed49cf55c.npy +02958343-80ac9cc0d4c9dde3b7a7bc444c2d756b.npy +02828884-8967e65c1541d1874aa7f42ef07f614e.npy +03790512-eb74f2365d6a55c212fa50e85877ced8.npy +04530566-379fa7ba7c753376619ef21bc094a137.npy +04379243-81eea4f86f308c6a589aae130c1f06fb.npy +03001627-b6e662b81c62dc9b688f5a44034a346.npy +03467517-2e2d2d6dbb316502872341b062fa57a9.npy +04379243-43e2a0220f1fbb9cc1bb249ae60b3bdc.npy +02828884-e9491a1e77cb2a65cb6a91bf3956b490.npy +03046257-757fd88d3ddca2403406473757712946.npy +04379243-d67a0b5dfecb565f2197da8dec8488d.npy +03211117-78e3dd96ff1dab94e20f4d2769bff1e6.npy +03001627-7dc1a66d228c8787e39e97231748e33.npy +04468005-e3f9be0bb0da7a23e70da94675b5e3ad.npy +04379243-9ea5a3905313b07e3d752b0785b76136.npy +02958343-2e5ab446d0767e1aa6dd909dc6fc8d4.npy +04379243-5b31b07efaee09fde63a9e8397b31118.npy +04090263-86db029236b5dbafcc34b900bb2492e.npy +02808440-dadeedcb7aeb8344fdbe2bf897d8a820.npy +02691156-7191b4709d5142a1f86c2bd4e090c60d.npy +04379243-28743475c1892193b0097f8288b985a5.npy +04401088-bacbf0d14e0cb5df6a802ef1ce963117.npy +02958343-93a813f96365c108f217b9504689397.npy +03001627-85208e245c49fd72349bb1cbbf9a4206.npy +04090263-4adfca873edc6ad8566f788c330079dc.npy +04256520-20b6d398c5b93a253adc3470b30138f3.npy +04379243-562288b15bd065d4b29ac64be50e118a.npy +03636649-d05b908d82722b5ab15194162f658e87.npy +02691156-4bdb2c4fc6701174ca8607f540cc62ba.npy +03642806-92e6341ab62ce4875c0be177939e290.npy +03001627-ca84b42ab1cfc37be25dfc1bbeae5325.npy +03046257-835f94a1d33ac78bdd7f1cd6f7ae0960.npy +03211117-f4877a34163978f84efc7e7114f1b9c5.npy +03636649-c904c93a0a1739e5f51f77a6d7299806.npy +03001627-cf62f90e75531ac63cf953ab4f77463.npy +02933112-1a46011ef7d2230785b479b317175b55.npy +02747177-872810933ae35485ad5067eac75a07f7.npy +03593526-8c6d7ad2b0674bd61952fef39dab6347.npy +02747177-44ed0531eedc723dfaaa4370fa1ccec.npy +04379243-eeaa44341a57c0cfb9531c981c83e1.npy +02946921-203c5e929d588d07c6754428123c8a7b.npy +03001627-36a2d17d63dc83f983c05814b11dc86.npy +02828884-6a5ba469761d03c0d60ded25865ac76b.npy +02801938-44ed0531eedc723dfaaa4370fa1ccec.npy +04530566-5f2ddca70687dd3062ba640dde834b4c.npy +04330267-40c7d35e40916b3d9c50c94ef954cbe9.npy +02958343-444829c02bec2ede60d2daa56695faba.npy +03790512-fb5d82c273bdad39359c7139c3be4ec1.npy +03001627-738395f54b301d80b1f5d603f931c1aa.npy +04379243-46cdb3dd8b6c460d473f10e6caaeca56.npy +04379243-2873620cf8be87ec798432661977bc1.npy +02691156-54984229a5e704f2941d71475449eb25.npy +02808440-a5da160ffe4b697e35c5b7b901a05c6e.npy +04256520-660df170c4337cda35836c728d324152.npy +03001627-7846afaf010913e4110b42f6d9481f5b.npy +03513137-cfd3bb444cb730458636fc327bbb2619.npy +03001627-e84d39ce475415399f165f18603a28b1.npy +02958343-d0ea101dad5bc464a134736201a79843.npy +02876657-b6261066a2e8e4212c528d33bca1ac2.npy +02871439-61ebec53da40801f99e8bf807e902261.npy +03001627-3f04a08d840c0a9c18b14db3b83de9ff.npy +04379243-d37205936d372513ff868cd4e441fef3.npy +04530566-b71deabf89e42df5cb167b89a3c3ef9a.npy +04379243-d013cc09fdad8ecca282c4787019214e.npy +03001627-977b3355b3f93b09e6fe3612af521500.npy +03046257-56f3829b744dc836158322a6470db5f7.npy +03593526-636eea1d5a7b3c61fdbe2bf897d8a820.npy +03325088-a1bf1c47f2d36f71b362845c6edb57fc.npy +02958343-2a9b4308929f91a6e1007bcfcf09901.npy +04530566-11e04ef8f037194919869180453a248.npy +04379243-9913e76fbe2c438f4bb836860bc1cca3.npy +04379243-7ad23def902ea4f37b7a2c2624e46d0a.npy +04530566-859daa33e58191bee2d4c157e5bf1dde.npy +04379243-11520534ea9a889c7d36177f6cb74069.npy +02691156-d8a43017132c210cc1006ed55bc1a3fc.npy +04379243-8eb85236a450db4c44e1d3da2eab581a.npy +02958343-5f78048536beb320afe1d4530f4c6e24.npy +03325088-78e4f87c3e5580b276c18e71fd49c4dc.npy +04379243-1509a8710d2fce3c4785a5d3b6c47521.npy +04379243-fece36426ea77b92a7bfc1660a1e18f0.npy +03001627-4e9d664144f4249d8957917d005717e7.npy +02691156-369244d49f8f1308b858e64ff0fa8db3.npy +03467517-667746d97ffd439868ef8f8a433fc787.npy +04379243-81514408605063ccd7be956e59a3bd7a.npy +03046257-d3ee26da2bf297d9815b2b467e8e2eac.npy +03691459-10d03876d94ec5f4e7670ea63e6cabfd.npy +04379243-2fdc21532b09d7e37f768772b7a990fa.npy +02958343-e6846796e15020e02bc9f17412005422.npy +03761084-6db8ab6c9693a340575f4e5007488531.npy +02691156-8a25b5ee4421f96a349a1add3c9c4a87.npy +03642806-d2eabcc071cec6f420bec9be02f008ca.npy +03636649-c816540b4e0eacd57697d9c3588bbfc5.npy +04379243-67a9dcc974fc402552d23bb2388b1b0d.npy +02924116-458aac785c7ef79455467fd13bb5a6b3.npy +03001627-27c476533e66bc04b21bc3cf138f79e.npy +04379243-33e59bac5a2a5c5e8300cbd55c34dfc.npy +04090263-60cd2f3d326475e829c6b4b73d88655.npy +02958343-ec5c003421112630f53148c8cdf6fc9b.npy +03636649-495af808806f1727a753b1b88fff4abb.npy +03593526-1252b0fc818969ebca2ed12df13a916a.npy +03467517-3ad4c0cc3aab8cf31377689fa4e4b2d6.npy +04379243-d045064064381237e9ada1586a8c9364.npy +03691459-6b9dd73a65dd50a71ad88f716ea80910.npy +03325088-6f954843bec713b6c36fb70296e45483.npy +04256520-53eaace9bb8bb34ab4fa97f642d1a681.npy +04468005-30892de05b7136a6e810c01b1498aa2b.npy +04379243-be9467a2641fb58330bbb59b54a585de.npy +03001627-762e86b38d1428fe78e6c2bcdf90770f.npy +04256520-c9c0132c09ca16e8599dcc439b161a52.npy +04379243-e7580c72525b4bb1cc786970133d7717.npy +02818832-4954953090ca7442527e7f2c027f7469.npy +02924116-2a46fe04fdd20bfdbda733a39f84326d.npy +03636649-e3ee6b31e54e95b7d42b9650f19dd425.npy +02691156-9ac7fb5963ae673f7d64cad20089f027.npy +03642806-4573c3dc7525a4754145b5f47fac09a5.npy +03001627-676287fd6b02428f2fe023c7dc3e5231.npy +03691459-e62dd51d47ec4e2ec29f84f96a7e29f.npy +03636649-9534bb19e66fa5cbfcf6007208e5f114.npy +04090263-6529b6134cafc299d43bb185feff0470.npy +03636649-594b2fcea3d15eb4fcb8d8c6d4df8143.npy +02958343-9eaafc3581357b05d52b599fafc842f.npy +03001627-a554d5e0eee3109762411d0498399c28.npy +03593526-39a8179c80a38ee130612f5c0ef21eb8.npy +04379243-fd7f26ea3a1d1cfab092f06f28d82d71.npy +02691156-8c2d5c6dd599a5bb68c7efc443fd2354.npy +03001627-48015ffd76a443f89f8c3d2002c77ddb.npy +04379243-564385b1081e9ab760eb699207aa149d.npy +02773838-8ea3fa037107ec737426c116c412c132.npy +02691156-a359cd0297d4e655a871065f9ebc6ac5.npy +02958343-554bfeff3c44a3d6425b2c354eccabaf.npy +03337140-72bbf19840933991bdf5f95bea7759e5.npy +03467517-6fdbbb1a44f2ac2854b87c21f44ed61a.npy +02691156-e79e9e1c8dae48888ee1ba57de3d34e0.npy +03046257-637237e978d5168f9751189c905e470.npy +03467517-28ba8477fe3db939d57700c05b1862d8.npy +02828884-b6e3891b9a761300b77f0c4f1c150c3f.npy +04379243-9e5973d8a4ac051f6e71174964d90e49.npy +03001627-8bb74c3e07557ba9177f2a3a0c71fbcd.npy +02958343-f60955dcc1d1c48687dc1da2515df8f7.npy +03001627-bb9efb4912a018b3c329e2758ab09ecb.npy +02933112-8f453f19fa9396a7824662341ce2b233.npy +02691156-1e44b99c8de5eb01ebc54ed98d6399b2.npy +04379243-b2eb5e56fb8342f81c25d54737ed5c8e.npy +04256520-14016326133a68c72897bf4febc9c106.npy +02843684-689f228f64564e663599338e3538d2bd.npy +03948459-e9d193e6c5ae7a4e265b6d46c677f2ac.npy +03797390-1ea9ea99ac8ed233bf355ac8109b9988.npy +04256520-781a7cb1d7f9347d7ec5a98b3b8c425f.npy +04379243-a0ccae355918b63714038d588fd1342f.npy +02933112-1d7b35cda1bbd2e6eb1f243bab39fb29.npy +04379243-85b930a031d9036481aaf17ac7662991.npy +02828884-9f27ed5d7877a38fd46c340938e2ff1c.npy +03513137-7a0772798520e9e141bb12648ac801b9.npy +02808440-6be2b6d4aa8124a34e61c48313846944.npy +02924116-ea08e81401c6e458490ad276cd2af3a4.npy +02691156-125417c3fa9bc1b130f57e42c77d3894.npy +03691459-81b711a75b8781956faee4308b49b522.npy +03001627-7932489d9aa9fb58492d9da2668ec34c.npy +02691156-1ea7a36e4f353416fe1f6e05091d5d9.npy +02958343-cba0b54cd104c411e9d8921ebe6d5b8e.npy +04256520-4c49cab86dc3ffd2c84c076312b543ae.npy +03001627-8cfbde91dc175e2ea54b9afa882a89ed.npy +02933112-8f7a277ae05da76c1bb088904f7cb154.npy +04090263-3e5711b79fd4876a4ef2a27f51a6e36c.npy +03948459-1115b4018238385ef1714763a5a5ab.npy +04401088-313e9b124e421a4efa9922db9b6aab31.npy +03001627-5ab67b30e17a2ed1c862eec8232fff1e.npy +02691156-fb01f6b428d094ad3ec83bd6bef75c92.npy +04530566-b820d42d6b9a08a03cf31426f0438400.npy +03046257-d86dcc32261d58424b3c42e318f3affc.npy +03085013-f6517b0bad40b72d36871b478a4420ba.npy +04401088-f48cb1a242e99745ab905891b6fa1a.npy +02958343-e15f9acabfa0adc5470d3ca356fc4190.npy +03938244-75c1215326a32653de03ab2a27ba7531.npy +04401088-3921288228020482b305960cf7a7281f.npy +03001627-72beb9225a841cef24367084627d607d.npy +03001627-48fe63616e70f84778ae896933c670d1.npy +04379243-167559b98bf6139712d9440c7a73ec3c.npy +03001627-8b5f8b83715a378e473f10e6caaeca56.npy +04379243-d14bcc93169f80d9b2d5d82056287083.npy +04256520-3a503e0e9b48a8925ff61a3a2a0e2484.npy +03085013-1e11af6fa598cd6960113b959388060d.npy +03001627-36f85b1709a62c406daafc9da8386a39.npy +02958343-d679b2dd7a7d6b1da71ed5958a35c6.npy +04401088-f73493b7c8a78000b594bbf2c494ab81.npy +04225987-fd3627deb2476b0f1f942c57ac0e8959.npy +02933112-9bf9e8d47f7b996263d977b06bbd429d.npy +03636649-fdc4b403601fedf955b7716fb9f91d35.npy +02828884-e56b95381904bfd08ccde000e771fc1a.npy +04379243-ab8735a26c5c9ea4f8574543281e850f.npy +02942699-89f0e0da4747aad1172ac9cfeff21994.npy +02818832-fb9019af9de69ffaf50f16ba773dd73d.npy +03948459-efb488715a03085b9f433921788191f3.npy +03593526-1d7868b4ad0913bf9f6b966b784c8347.npy +03624134-bcd7ed830358dbd6d58ea69ee1ced10e.npy +03467517-16bc13ee237ebeb38460585fe283a1c9.npy +02958343-1f191e0327ce54474cdd04162f008888.npy +02942699-509017601d92a7d1db286a46dfc37518.npy +03001627-9061324684c39682c2c449c0c0579ec3.npy +04256520-4c92e530e76f4ee3febad4f49b26ec52.npy +03624134-342f17b5c8b892311209554d4cff7188.npy +03624134-cb188764e239f18d4282aa337cbc8f81.npy +02808440-4d3a9133a7297ff54f0ef2e216a06871.npy +02691156-3e7e119508f0abf935fc197bbabcd5bd.npy +02691156-21a1049ee5b7f531bc0909d98a1ff2b4.npy +03797390-cf777e14ca2c7a19b4aad3cc5ce7ee8.npy +04256520-279150abc1b0b0b75369e32fb818f337.npy +04256520-fdca3e183b3d1eca45e6e5503635ab1.npy +03636649-dbc50a84c8d24f9168c981036afdae64.npy +04379243-1299579419252fa954b02959579aa6bb.npy +02876657-d45bf1487b41d2f630612f5c0ef21eb8.npy +04379243-3f756d8d35b51ad629e4b5aa807bb4e7.npy +03513137-48b7dafda49b9175365930cae725a1a.npy +02691156-da9d111e1175d318bbf3143b1cb6076a.npy +02691156-e25e3dc95243a92c59bcb260e54d3785.npy +03001627-216821d05f00b1ccc3bd24f986301745.npy +03710193-8787c825338116b2ac6beb6ececaf6e1.npy +02691156-7ecb807e2270606619ba010ddb4974fe.npy +02958343-2ccc8183090b97cb21a66e8dfcce514a.npy +03991062-b2b0dd16870742a2fc41e59f3518733.npy +02958343-44f30f4c65c3142a16abce8cb03e7794.npy +03001627-e867483a25b070ed89ccdb4a5b6b972a.npy +04379243-c5b224f6fcdbd7e655f46d55537192b6.npy +02958343-e57092f6c51ed37dafa781871c8b9ebb.npy +03467517-a64761b5f748cc61082f2ea630bf69e.npy +04256520-a0baf84e4bde88691912372ddaeb001.npy +03624134-d61a5fa6dc3f703613abf93d1c879c43.npy +04401088-2c32c1b5d13074431c1943a82a09125f.npy +04530566-325c2da58c641c12e3bdba9430565083.npy +04256520-4444828846fc38269fbbbda5e1d9195c.npy +02958343-b782800ed15ae74c6227cba038bf7c95.npy +03046257-6bd4036a2ef142fc956e5f06e8cf4db.npy +04379243-df3f7ccdb375675fb145a08fb49c17fc.npy +02691156-aad69c419b27d6744d8e7d3c15c98c3b.npy +02876657-b45d6cadaba5b6a72d20e9f11baa5f8f.npy +03513137-f232d07e98fae2d4eeb425ad8cf9eedc.npy +04090263-29f33014b958d37e6d25219b6c577d3f.npy +04379243-8797234d59d03951bcc69f56814897a1.npy +03691459-7a48d550ef85f41d4873a2cc06a4fb6.npy +02933112-74c058f9f24fbb524692707833167ca3.npy +02691156-3cab1ffcff8b84cbcad035c2ab458.npy +02808440-d8ee3cc88f58ef06a39450bfd028c5f0.npy +03761084-faf8ef1f6f78b75bdef92a6dd2a4a6ef.npy +03001627-4f1f4c4d1b2f6ac3cf004563556ddb36.npy +04256520-8dd277fd02903b82bc0e720bd48e2c3.npy +02958343-db86af2f9e7669559ea4d0696ca601de.npy +02828884-84cd6e96a464894af132460d3f8b116.npy +04090263-77dbed07aef42a5e3b9e9f1cae8061dd.npy +02880940-9c7edf31042fea84df95dda4222cd1bf.npy +02924116-6cc0a9c53066efae80288501d9901d7b.npy +03001627-548ab6b6e8b2dc505ff61a3a2a0e2484.npy +03948459-1e83ef6ed5d0b78b7efb854782e23566.npy +02958343-ee5839537440f8b6f2e4b4084cb7a07d.npy +04090263-5afd33d495b111449a2ee232a197081e.npy +04379243-6ca761172d2c1ba3ce522e6dda26fb51.npy +02876657-829ad86e645d11b1bcbe24a1993b1795.npy +02691156-70bb20cf86fe6afe76b85a01edd4a109.npy +02933112-1aeff9aef2610ee1c59350d819542ec7.npy +04530566-3bd4a80ef718b9c9a069f11e22e91bb4.npy +03991062-8c278785a66bd82ababc8956356bfae7.npy +03928116-66428302f0c879c068661782af60b711.npy +02808440-210e770d7cf45629b362845c6edb57fc.npy +03636649-3a3d292307c4831f4dc0ed4c2f72c4cf.npy +02828884-2b065fc9d62f1540ad5067eac75a07f7.npy +02871439-b12a523931d15b49a169b9ecd9e046dc.npy +02691156-ba0f83a82b18613d2350d07acbcc057a.npy +02691156-1169d987dbbce76775f4ea0b85a53249.npy +04256520-970aaae286331b9cfdef1c01cbd4ae0c.npy +04530566-485f63613911c93fd316c98a55307c24.npy +04090263-5df501ece93bd3f522e2c8abc98c5f41.npy +02801938-3e88bbe0b7f7ab5a36b0f2a1430e993a.npy +04090263-d33dd32b628e46f1d483df64f44884fa.npy +02828884-db8f61eb5dab7b26b7710a2fb1bf7a26.npy +04256520-3746c2c38faaec395304a08899f58b0b.npy +03991062-4bfda925e35d32df2f4930ba29aa525b.npy +02828884-f98acd1dbe15f3c02056b4bd5d870b47.npy +03001627-49795a9ebd9a9c6d2c697f0a1454869.npy +04256520-a39fcabef17deeaf593ebeeedbff73b.npy +02828884-496f1d6cdd0a0aa247b74f4d1238a1fd.npy +04256520-a4c8e8816a1c5f54e6e3ac4cbdf2e092.npy +02691156-e5fe5ed2cdc8b11d62b600da24e0965.npy +04256520-6c6cd4a17f142fffc3c1d36485e9888e.npy +04379243-bb93a65aa5768c557b9c6deef486a7d8.npy +03207941-b93e45ceb3030c473321831d2245cf06.npy +04256520-9d56b14e39f4c1f9ff6eb780c82e5ec7.npy +02992529-c3e18e5d0f7a8709e41b17b375798648.npy +03001627-794e80fd66c833917d20e6f91e9b2f9.npy +02691156-80770c90ba84524e825b20c2472ad90a.npy +02958343-c911f8a7084e7929593b8de380af24a3.npy +02691156-3bff0d84311470a357f53fe209e96fca.npy +03691459-5679f86d9eb0bd1ed4ab0eed66631cfe.npy +02958343-21cb55aae53e3eb351a95aaa6caba1d3.npy +02808440-5b8badaa652f4363210c439c61dd9b9e.npy +02958343-f16194da236b7c595264a3f45260d821.npy +03325088-eb5a55c6f9887aceb3425db9d50d5dff.npy +04379243-cd94233033b1d958ef2438b4b778b7f8.npy +03001627-42140baad25c8598baa1a4ff2c45ffc9.npy +04090263-9384db12f13af3e4e1abf5082bc04e75.npy +02691156-8d49b7496a2575d5146e44cc99f07c52.npy +03636649-b66524f44170023ff7248d9dbed7a7b8.npy +03046257-7f5f3d2526d1c5a46463df620b7b4cbc.npy +03001627-9dc77fb24cb14e5b3abfc4d0a5688916.npy +03790512-346e30470cfbabdd7395d58407f193ba.npy +02691156-8c11ef88dd944d00fca1f1143bb6bc17.npy +04379243-8bd8776f65913f17b3c03e06e3a5c3f8.npy +02958343-8fc220461ea512f3abeba927b56dd398.npy +02933112-919591b27262702ad0b36851d61b6fca.npy +03211117-4736b46f6cb97d091e02c9947dc6e279.npy +04379243-3ce930bb150aef8a69fb38085fbc320c.npy +02691156-2bdb44eece3409a5a18e0889038e4fb6.npy +02843684-7d5679fa05d7ee982e1d0f368aa4d2b6.npy +02876657-cb3ff04a607ea9651b22d29e47ec3f2.npy +02828884-c2c788ec4dc9f467d85a7a4d55e9b869.npy +03001627-ff529b9ad2d5c6abf7e98086e1ca9511.npy +04379243-d064b468c3cf683cedf48f9fa39262b.npy +03001627-acef669b784a4fec1b17743c18fb63dc.npy +04090263-aa21e208420cd4c2202be79d8b285c1e.npy +04256520-948923ab76b8d9efee7d178666aae23d.npy +04256520-187386c46e9fb3a44b3c42e318f3affc.npy +04530566-fdd7433470c31c8b5332ddd5fe4d4fe0.npy +03001627-5b68a6c2baf0ad61d0de9c949c366777.npy +03636649-a524e5a1d81df32b68b4a15ea963e059.npy +04379243-8ee93ff23d882efef3eaa8afef8adb8d.npy +04379243-b063b55df11f5df434b168be15357fd0.npy +02992529-ebb6035bab99c3e221844676433a0aca.npy +03001627-8ec95f15623085a7b11ae648ea92233.npy +03624134-1943c87f92ac76e112cad8be168fe72d.npy +02924116-3b7f02cfc5be11825c91439f98ea327b.npy +02876657-2f4cf418cb91949d38fc23bb1b265fa7.npy +03991062-a537c640764baf41ffc6e457221b9271.npy +03001627-a248417b6ba82801610c2a68437007d6.npy +03001627-eb8073ac89cf7b4181f667e2a25e0619.npy +02924116-fcb54368287c9e10602b8b650088ca6c.npy +04256520-7061f5384074da6d6f37a8be59c15bbb.npy +04090263-61a502275b50f6624a38706cd8ac54a1.npy +02933112-a248de70fda12c5af27383fc5a5a711c.npy +03001627-6897c2665267cca39eea64ae4d2b4158.npy +04468005-9130d6c4b0823dacc9de7b195ccfa970.npy +04379243-dc0e0beba650c0b78bc6f322a9608b07.npy +03636649-7d77f1dd8bcf114ab71c4c06094146e8.npy +03001627-106a0dbaead5066519fb4103277a6b93.npy +04530566-2a9df36f9327beb27244f3b2d7f5074d.npy +02843684-6918606915c91f0ec5c86021644af7b5.npy +02992529-bf11938460e160c78190e4bafebe046b.npy +03593526-488139f06d9905d830ffab76baff35a5.npy +02828884-10db917982072df1739680f4e31f35e0.npy +03337140-dbfffa51bd4f094353227dcd0d547ba6.npy +04090263-cced6c0c2bd60368b0f24bb611f821a8.npy +03001627-1512e3c41de7a461e10a48f2bbb9bef4.npy +03001627-5932d26671d104d76370a012706ac174.npy +04401088-e8508eef82fb9163a1288f74f9304471.npy +03001627-730fc3ae87640d952c528d33bca1ac2.npy +02992529-dea7ce7ab01c08dfd4ea3f4c41b1b9bb.npy +02691156-b552a6155c5b340e70828dc2c11733e1.npy +03790512-3fd1bff496b369f71765540024eb9fef.npy +02691156-1e358e70c047687a1a8831797284b67.npy +04379243-bba5ce8555c8fa89ba18ade30e563d37.npy +02942699-fd058128095abf343ce579773d34f5bf.npy +02828884-3c2ffb35d0b3d831e1aab65fbcc9b689.npy +03001627-3d7ebe5de86294b3f6bcd046624c43c9.npy +04090263-89f53c736eabcca966c0c88d96ba938f.npy +02818832-1347959af4df977a15dd7d7985e749c1.npy +04256520-9b94f7822f3d73e84b509f4ddcfa8ca1.npy +04090263-fb11e17c9dd72d6851cfdb4c9f126c12.npy +02828884-554a52dd42ce558bd2b12aa6a0f050b3.npy +04379243-a4473d9c69324b492c026fed19c0d206.npy +03001627-9ecd81b505ac3a175634c21965ee6bab.npy +02691156-563cef4df464ddb1e153dd90dac45a6d.npy +03001627-89133468bce0e63f8101accd22c701b9.npy +03691459-a4ffce648faf8349e651a075b3dd0597.npy +02958343-10247b51a42b41603ffe0e5069bf1eb5.npy +04090263-1c0d3cbd1bacfa815f8d7780d59bb4ae.npy +03001627-37b432326fecc8a1327289c00b6dc9ca.npy +04256520-3e2cd7495af88fe352e393d25dabbb72.npy +03325088-efd013235615a4924c62bee40dcdc539.npy +02933112-27e65f34c3b8dd7f490ad276cd2af3a4.npy +04379243-3edc519c38938ee8d42b9650f19dd425.npy +03001627-9c103621101bcf9919fb4103277a6b93.npy +03001627-670b6b7d3fe6e4a77c5a5393686fdcfc.npy +02958343-4c3b9ecbafc80b9cd485372bb746f3c7.npy +03001627-d5bd619acad1bed3d2b12aa6a0f050b3.npy +02871439-225da2a2b7a461e349edb0f98d2a2a29.npy +03691459-3ff725e1e30e4ed6a939d6b77e949639.npy +02933112-69544db102786237f51f77a6d7299806.npy +03001627-3ffd794e5100258483bc207d8a5912e3.npy +02691156-4e1dfdfdd417479f49e1f7e01fe2ed1.npy +04530566-5ecf8b2c217b840fef5e991e1c32e94a.npy +03001627-d81327c591d1a709377b9297f3055210.npy +03636649-81e0c3b0d851492fb79ee87044437bbc.npy +03001627-331f49270df51b2e5bfcb9d3e84d74f0.npy +03046257-8fab6c1e294c7b936e72fdd3e26969d4.npy +03211117-f2a27af5dba2217a38a57abd4646e319.npy +03001627-42db4f765f4e6be414038d588fd1342f.npy +02828884-21409db44ac9db8b6f1234a0997684f.npy +02691156-2b1a867569f9f61a54eefcdc602d4520.npy +03636649-367546484916da6275225719b7a8b341.npy +03948459-2dbd07826cb984cde687f35a3b96a31.npy +03001627-10d5c2f88b60bbf5febad4f49b26ec52.npy +02691156-a75ab6e99a3542eb203936772104a82d.npy +02828884-ad9f6cdc0cab11986bcd8c7601df5d35.npy +03691459-3986913c6dc63598d2e26510f3f5390c.npy +04379243-3411daa955306811d93768e7b9b1eabf.npy +03046257-2277c1146f943ec8a5f9d52c12457194.npy +04530566-c172ec6226c1374c43a8324aee7340e.npy +02992529-4bef48f1c1b4a40fbdeec9c43546255e.npy +02992529-e1effe88e974292f8ba7bc4a733e1db9.npy +04401088-18dc34a116734b43bfd324d8acaeb3f2.npy +04401088-de48276b397bfbbe8fc27711a3d87327.npy +03790512-30968c53e0d37b6448c90b3a2fec4b8.npy +02808440-d917f63efd341a0f54d7082b34825ef0.npy +03636649-7bebdd742342ba93febad4f49b26ec52.npy +04379243-e97546c24cad95ee9eea323f522c6486.npy +04379243-525d48d65079b2003f222a37719e9945.npy +03636649-88ea703e063e715d6770da39e2737f95.npy +03001627-8709db708ec617ec8b5d4279936d177a.npy +03991062-312f18959d1a04edf9aec59741c69cf7.npy +03211117-217e2634c55f240c18533b168bff8839.npy +03001627-2d51bd678668a0f182db9fca4b68095.npy +02828884-c0e755071b467ac433faf2dd5a7ff771.npy +04379243-941c65a25cef70c184edd435e02f1ecb.npy +03593526-306e447225c6976082db9fca4b68095.npy +03691459-d8fe44ea5aac77504d0c24eb0094dc21.npy +04256520-40dccfef363dd1474b3c42e318f3affc.npy +04256520-ef2d1c27124c41e06bb6bc0db07c71e8.npy +02691156-46791426a5b92fed6cc9876a2c35084c.npy +02691156-7934ca36e240e91d5e9e2656aff7dd5b.npy +04401088-2601fb1cdef9d37223d5a55215ee8f43.npy +02808440-5703aca738f8d92b44221bef0fa3c36b.npy +03948459-59849eb8aabd97a189e70f2b8644e333.npy +03211117-5e70a62a7a1bdac5590b59440deecfa9.npy +03948459-2f2ee52394a53c74bdd651b07eb299e.npy +03691459-e75c0fb00d2b70ef1aadbcf355bd688f.npy +03636649-1dc135b611b2f4b2fcb8d8c6d4df8143.npy +02946921-d53fd8769ff53b9a2daf5369a15791ca.npy +03636649-1bb78fe58e75596d9f42325587eab087.npy +04379243-40fa6161e7f921f6738e43095496b061.npy +04530566-b0ef1a0332a50ad1ae4c18c4a7d1a8bd.npy +04379243-857d1ef816b8409fb20aa91e9e90c311.npy +02691156-35fcf4cfd91d7cb3e1211756a8e887aa.npy +03001627-9c7a028edc97dcbc3012f749207726db.npy +03001627-5141e8716b98a16d632786b910371d31.npy +02691156-f9209166fc259d8885e96081cfe0563b.npy +03761084-db63e48b9a308d9efa80fb391ee7ccee.npy +03636649-6c5d68e495c1f0a4d42b9650f19dd425.npy +04256520-e91742c726572352593ebeeedbff73b.npy +04379243-f6474c0704d2198278696f3c9c5b8290.npy +03991062-7ade1ebc752ac3a1713f2e93cbeac35d.npy +03467517-442d447797c93b4769da8e7f9a803d12.npy +04379243-bc44413ddfc3f861c5f48f9175316bec.npy +04379243-36a6d851dbe02410ad16260d4d73b56.npy +03928116-3d0e93c7aeb06cfccb349a60fd15aa15.npy +02691156-e31da3ac74fa3c0c23db3adbb2f1dce.npy +02828884-715e78fa6ac13a5ba5d322186fc10e9d.npy +02958343-1d82316d98f620513b86a9df4269733.npy +04256520-83d48b9accecd4bae7200b78e3310827.npy +04090263-8cfac69c394c3cf8de423072102e0bc5.npy +03691459-d4ae1449bdee448b1ab68128992ea30.npy +04256520-de431e15a30f57f27d5681734ecfe522.npy +03337140-78005cd4b4389fb73b59eeb47ee49193.npy +02933112-a5b0aa0232ecc6dbd2f1945599cd5176.npy +03467517-2b26ca6b597b39464804bd5c9b82ce7.npy +04379243-984ccfa5aa5c87334187eeeb0dea4986.npy +04379243-4c4c719ac4b61d8f812c9aaa38f9a422.npy +03636649-e9a9f966236acafab48ae76bc6e76e1.npy +04401088-18bab729642c42631308c95c9c0fcafc.npy +03948459-4421883492edac988075e9c7f3d235af.npy +04401088-3d5d7e610fc235cbcce71a7ef3de6f04.npy +04530566-5aac718c51fc73ca00223dcc18ecf69.npy +02992529-aef45c975ed647778768dbb598f40c93.npy +04256520-55f6500b52310f26352ecf815a233abb.npy +02958343-cb19594e73992a3d51008e496c6cfd2e.npy +03001627-a8febf7ef6ce1d8cf7d0fb681a992ad6.npy +03001627-8ade914cd21b6e49656f29b05c68d39f.npy +03797390-1be6b2c84cdab826c043c2d07bb83fc8.npy +03948459-d1cc54762432fd058a2c998c0df41abe.npy +03001627-fbee8c9e5b8c0c19492d9da2668ec34c.npy +03991062-48862d7ed8b28f5425ebd1cd0b422e32.npy +04530566-ee09bd0664e0a02292b9fcc49a614e2b.npy +03001627-587ee5822bb56bd07b11ae648ea92233.npy +04379243-712167f9036fbfd050e7fa8e7f4c04f7.npy +02691156-30bfb515f027be9a4642ec4b6f68a.npy +04379243-c9a9feb520968bc79ccce4c6d5bb195f.npy +03624134-906b20dc0a5a5022714112b147c95c8b.npy +02958343-8fac42d0e74f5b454ca84d60642ec7e8.npy +04256520-40f968fe1a3442acfebad4f49b26ec52.npy +03948459-1374e4af8a3ed46ea6766282ea8c438f.npy +03790512-f1879331710ab83ca7e3c21092c26d09.npy +04379243-ac424c33c6fc302355f46d55537192b6.npy +04256520-6c26b5608557f3e8bb41d1ff31a800de.npy +02933112-720ee748eb25f010c59350d819542ec7.npy +04554684-1ab22863c5f183eab00a4eba25ea081.npy +04256520-59959eb5b4cd9fd15e0ae65e074d3ee1.npy +03001627-2031dca3aaeff940f7628281ecb18112.npy +04379243-cbd789375190fd62f3d2cb60d3f3bab.npy +03325088-d72e5aa3ab8bb33ea82a83c21accafdf.npy +02933112-534d0386ab0bb650ae96150e4aa362f9.npy +04256520-fe652e6e444a8b827f06bb1a83bb6426.npy +04004475-37a4e11b0d449a0dd8f9dd7647048a0c.npy +03691459-d5bca27bf05ac5c92e8dbf40bb4c181d.npy +02808440-24ade9db94db6f22b50d0c6a0c254040.npy +04379243-fe2aee5ff66e4fe8d5f95109c85d2816.npy +03001627-196b9e195ccd4a0de03ab2a27ba7531.npy +04090263-4cdfe4029f51c3b16314c3b6a3a65519.npy +04530566-f5dcf3213002301ee4326375f53c1686.npy +04379243-765786fb271e394a204812d6a020ec9b.npy +04379243-36e167a2c51751a630bbd4cddd04c77b.npy +04256520-43c435a4a10d90204d724d9ce5af6d8e.npy +04090263-a0361a353c93899fbe35b76ae96c4b7d.npy +02958343-133b51a2dcecd83c7c3c6f82a395b347.npy +02933112-1257abde355da7ebc59350d819542ec7.npy +02958343-30776fb35aa99150ee3dd0c47654345b.npy +02871439-79f81b259e597d168e6da51641e48238.npy +03001627-1bec15f362b641ca7350b1b2f753f3a2.npy +02691156-54711bb9127ddf7ef412783097373bdc.npy +04090263-8cff3ca8a9a250272472dec3b03e0eb.npy +02691156-4a15b999378e1831dee83316225be271.npy +03636649-7f1a429b9df0dee97c36714e9fbbc038.npy +04379243-96ef5cd61c49b9ebdd50ab7b10e346f.npy +04379243-c876b151a22b59a24702663c3b3faf8f.npy +03001627-a32e0ecf12641f34515e5383285f6afd.npy +02801938-91b15dd98a6320afc26651d9d35b77ca.npy +02691156-8bfcf5618f2d169c9a6e43b878d5b335.npy +04379243-b4ef1de99422b08768661782af60b711.npy +02924116-7905d83af08a0ca6dafc1d33c05cbcf8.npy +02691156-f47c5c54c4e49f62e0a768dae1badf69.npy +04460130-b13143d5f71e38d24738aee9841818fe.npy +04379243-3942f02501161134c3bd24f986301745.npy +02691156-f691f2409e006d33f412783097373bdc.npy +03211117-dab9064d7c98acaec5aa65dab0a56ab7.npy +03001627-749c3d0d59bf7aface4f274577283b16.npy +02880940-2d2c419136447fe667964ba700cd97f5.npy +03211117-5c53dd3bab676b6444ac2f2630483b52.npy +02691156-c1b9934ddbf4f29e77fd7318510b8627.npy +04379243-b286f1a5450d3958c5da39cd0403824.npy +02808440-7a9c46a3a33c7f5b15c4530387bfd.npy +03991062-a3223c8dd57ff46e1118b641f14b480d.npy +02958343-535f244d5b6043e8cbc76a30015552a.npy +04401088-4f2b1a13f06a85961138452c33de4a3d.npy +03001627-6072a4739c12979baa69dfdc5532bb13.npy +03001627-f9f55661e6437920c5a208307819a3a1.npy +02958343-18e16129375e723e6f8f8c736fcc7940.npy +02992529-57632112a9128a16a82783081c89c0aa.npy +04379243-adabe7da527cc52983572753b9298b2b.npy +03691459-f000edc1cfdeda11bee0494534c13f8c.npy +02691156-2f576be042897eae38f859e2bc79169c.npy +02958343-b7909c8d862ac27a82c3507e44bb5d92.npy +02828884-4e1acb893cafc1ea29c39f613cc72411.npy +04530566-8595fde74bf250a5d9fd1bb6b75d9865.npy +04401088-b8415769dc1bc92821844676433a0aca.npy +04256520-1843c388615d12dacb16624e184454c.npy +02828884-f2bad48085f087dac95c21b3fa5ebf36.npy +03001627-b2dc781aae692b2555182f299fe41fdc.npy +04379243-8f48ccd17a15baf5ce01c07526cf2aa4.npy +02958343-72502c40fc59b62f4fb68b983a4df738.npy +04256520-6131018e5caaedb87980e3c69ea07675.npy +03001627-f5e5ad69111b96646d6e68ce9f2601c6.npy +04090263-e2d4ef975cbfe84bd9d2bbf707e9704b.npy +03624134-15f5527e669eebfeeb7c476925d02aa.npy +03001627-8ad1db95b5b9d60136d9cfd13835101.npy +04090263-f31b23b6dd65d8ed8edead259832feba.npy +03001627-26a5761e22185ab367d783b4714d4324.npy +04379243-9614faa3e0472656b988865f09908beb.npy +03691459-b209054be0f71cfdf398d0c5832df00e.npy +03636649-fa853b92d9a5cb66168e1d639d85c126.npy +03325088-d7c83d555374c3b27fde87eb01f5851.npy +02958343-9539149f41e453052a9eb0f146e94477.npy +03636649-7591d7cc9587643caa5752b5743a662b.npy +02828884-6ee8866fa7b253e8f4fb4dee5181bee.npy +03001627-450cd2f81b38b6fc7ec728abdd798547.npy +04256520-acafbbf4c4f3aed424367084627d607d.npy +04379243-9b6395c94a80daefcea003eff0268278.npy +04379243-a9946cff00d5a43c3b0db8c24d855998.npy +04379243-6216ba4ee25256c9490ad276cd2af3a4.npy +03211117-cb8a39997ea5433b159fbcda62e85465.npy +04379243-73d4df18ad195ba6492d9da2668ec34c.npy +03691459-49e47ec81395e290d3e5b33a5e1cb23e.npy +03001627-e8089df5cd0f9a573a3e9361d5a49edf.npy +04530566-4bd85ce20325ba7442c20743f866e1a6.npy +04379243-bbc0faf338bd07c3cffd61677456447e.npy +03642806-6c1cba2e5d2ebb552209327b12ad3fd.npy +04379243-174928ae6f9aaf3cb1b6b0c5ddacb607.npy +04379243-e6ec89773cb0e3ab3880b925e059dd8.npy +03467517-ff956097c2e0fd2cf66a9e192dbe265.npy +04379243-a74cad1781afed87dcfcef693e7ec696.npy +04090263-26744766d59c28fb6b2c8bb96250e4a0.npy +03691459-ecd9a96ebfd0caf6d8f9dd7647048a0c.npy +02691156-e7fed0e0dbd871ce35ae6d8873b772f2.npy +04256520-f567137b74a175c6f49a23658fe5597c.npy +04530566-248092c201dbf7008088de1a3d7f09f1.npy +03691459-8c2bfce4c190934da98a11883c15abf.npy +03001627-11e521e41ff6a64922e4620665c23c97.npy +03001627-a8bb7a8d6f2e1c5dbbe43d356df0e955.npy +04379243-a0e6486608007bf4c955e5ed03ef3a2f.npy +02691156-65cde29553fe7d763a63e8ba97b45ddc.npy +03001627-c3cfd2188fe7ae365fe4ecea39e8bd40.npy +03001627-37a79a0b617e2e711d172d0e1c97cfd4.npy +03636649-85574f6036ea1f90d8c46a3a266762d7.npy +04256520-5e6fe3ce7afd4490441e918a50adf356.npy +03691459-beab6a006f44f33de19807d50c8d841b.npy +03001627-fe56059777b240bb833c6c72c4b62a4d.npy +02958343-862a345b6328d641ef3ecc8551d2c1fa.npy +02818832-b1debacef4d43e4a20685b5a7e34b501.npy +04379243-d2ad73295752e323255c4b3adac8f815.npy +04379243-a084dbfaa217331894c13f8f78a6d62.npy +04256520-b9faefaee3f409ce2d86e6f67ef12498.npy +03636649-e88e3d0c851a00fe6764a784715fb668.npy +03001627-9979c8433d92fd80d1dcc55e36186e4e.npy +02992529-8caf79a2bf3be9fabfbac23a8087e8f4.npy +04256520-c8108de19d8a3005c5beea20858a99d5.npy +04379243-f434ad9d54919c9029d8eecf3827c486.npy +04530566-2dc008ba026e4c8c8209e983a346eb25.npy +02691156-afe6a70cc5fa98fbd93d05336f155bb9.npy +02876657-f4851a2835228377e101b7546e3ee8a7.npy +04256520-f4a0d0169abf306a754ec1f2eef2c6cc.npy +02992529-6475d2eb77c7ed5a59812638b595a4ce.npy +03001627-d2771921272ad1536a69760cb58e50e8.npy +04379243-bfe852b57d198bd2e83f416cc5d1e30.npy +02808440-d127726fbd237ab197c5304296d7b1a1.npy +04256520-34d7f8dbbe80413c4ad33b69f9597739.npy +02691156-abbe69a6f94918c79eb9aa3111a82815.npy +03636649-e4c9bb21fe5bfeb3e21f078602e2eda8.npy +03991062-c868008632d3523a25ccde673a683af0.npy +03001627-9e36380dfd1364f6d01673c7c57450c9.npy +03761084-5b2633d960419bb2e5bf1ab8e7d0b.npy +03636649-78f5bbde973fa96780b013c1c827c9b8.npy +02691156-d31a0f4f945775de5823df672991ed66.npy +03001627-8f54c32d7097b753542dfd131ca455a.npy +03636649-b4af7e9a7338a9a3225afab722d9fd2.npy +03691459-be277cf919c1467dfc1c2fb0640247ec.npy +04256520-a1a8920f91e2f3d25dc3653f8341633a.npy +03337140-3ab7d894293dff6bc5bf424b15c73f47.npy +03001627-31569815c88e79de4458bae25a4e518a.npy +02691156-12f4778ebba781236b7bd17e458d0dcb.npy +03001627-42d5b7df0524a3aaf785f45147f3e474.npy +03691459-56e11f06a19f9c3edb24fbbf172c2159.npy +04256520-c5f48faf560bbcb3debd3ac8a0c825d6.npy +03211117-f5f5e872bf70f59983f551e0fd7d32ac.npy +04225987-5c55e6b6708f730d758f6def7204bd6b.npy +03001627-98cb91189f35e5f57c311bdc1462c34a.npy +02828884-ea56c97ec123270c2d776d9e024e5deb.npy +02958343-885207d4e9d28f317bcd1993e004117a.npy +03991062-aeb4b2eb456518022271466eed05a4d3.npy +02958343-ac488b046b024bdc3aa029ace5323fc1.npy +04090263-ce351c4fddddba2a7dd22c0aa3913f0.npy +03636649-edce64335e42ac2f58452382da1a79f3.npy +04256520-199085218ed6b8f5f33e46f65e635a84.npy +03211117-fc542f42b786ae20c40162916d18053d.npy +03001627-fa8860d6a0d45a4688dcbe86402c7c15.npy +02691156-1d96d1c7cfb1085e61f1ef59130c405d.npy +04530566-1d075cc087e9c9e3e3d3b281e2d34942.npy +02958343-56332360ecedaf4fb095dfb45b5ad0ce.npy +04256520-acf458d2b16dd918ef188758bf2e3a30.npy +02808440-ed35928bd1dc8a2fbec80b85c820859d.npy +02691156-3a5aa99b9e9e37a6bbf3143b1cb6076a.npy +03948459-42de9b896d23244fe6fbd395d87e5106.npy +04530566-97b9c8f223390554e2584b7a39a94cb9.npy +04090263-9d80168647f0c0ac9f433921788191f3.npy +02828884-870562aca7165d703c78f7fe78269073.npy +04256520-5c69960804458df5255ac1b93c90af25.npy +02691156-d919249737749c36417568af9ae9577f.npy +02691156-45bd6c0723e555d4ba2821676102936.npy +04379243-bc2f853a8f2c42701b126712b4d6e5aa.npy +02691156-5903b9eeb53f1f05a5a118bd15e6e34f.npy +04379243-3b5195c53046e4bd6e9ad486918e1764.npy +03001627-38b5f764afc9d28f200ad3f421b6c3d0.npy +02880940-e816066ac8281e2ecf70f9641eb97702.npy +03001627-8e853d5bb145c11486c701087a194026.npy +03642806-9ddd8a548dce36fc800b903035974869.npy +02691156-78a94b8bd2971595ca8607f540cc62ba.npy +03001627-fbca73a2c226a86a593a4d04856c4691.npy +04379243-9391dcc782fa7f6bfdad344760a9dafd.npy +03691459-a6cc92fec1071df0fb2034808cbff90e.npy +04379243-9e94631e0dcb5c15890bbb282640d692.npy +04379243-f7ec331aac39a17fb129901f80d24b7b.npy +02933112-ac536462e72dea3211fc2b865c2a185b.npy +04379243-6f576d151a46bdefd5cb6d178687b980.npy +04090263-9e98bccdfb3cedf612db810b4de23290.npy +04379243-b3fc5247186936f1dcfcef693e7ec696.npy +04090263-31895d26609fb45dfbf44f447f38c175.npy +04379243-7afdd54c53562cfe43008e14d7d4c137.npy +02958343-ac7e674eb67488dcafe1d4530f4c6e24.npy +03325088-4de724831f09791676c18e71fd49c4dc.npy +03325088-996932ea9d17bc9ab362845c6edb57fc.npy +04379243-3cec584145ee513d635418e95eea8a17.npy +04379243-dfdef0c8739cdd0944b0115560181a7a.npy +03691459-86f45d4bb1f5f8597a040c8bcae232df.npy +04530566-249d543a30a88020be7995d5b4bc81b7.npy +03636649-761fb0822bb05bc8ee0cd746086d989.npy +04379243-9c87f81ccf8a2559dd33a7e96aec2a56.npy +04090263-5c646e68fe7981366314c3b6a3a65519.npy +03001627-d13c7cdbaa6941c2f0f0b1b5588b0b7e.npy +04256520-d6f81af7b34e8da814038d588fd1342f.npy +03001627-9641c65e9a8f9a873f9d6e0ade5188b0.npy +02801938-5fc11cef6ff80f2250da8b99982a3057.npy +03636649-ea9ec4d9db2e06202471e6dd5ac3ef92.npy +04379243-1b6ea0e8c6785638ad8d9da81848733.npy +02773838-b1234d3adf9e476e9432386574f02229.npy +02946921-3c8af6b0aeaf13c2abf4b6b757f4f768.npy +03636649-98cdb45ca9925feb194eb328dc97c7e2.npy +04379243-b292c70f70377635192ae4e26f16c930.npy +04379243-3576a576c81f2966f2f40b9b3af5eeca.npy +03001627-eff6231acedae01c17103f9c0716a636.npy +03636649-3c012309d5c68153302ef84771572fcb.npy diff --git a/zoo/PointBERT/segmentation/data/ShapeNet55-34/ShapeNet-55/train.txt b/zoo/PointBERT/segmentation/data/ShapeNet55-34/ShapeNet-55/train.txt new file mode 100644 index 0000000..1d77abd --- /dev/null +++ b/zoo/PointBERT/segmentation/data/ShapeNet55-34/ShapeNet-55/train.txt @@ -0,0 +1,41952 @@ +02828884-3d2ee152db78b312e5a8eba5f6050bab.npy +03636649-86f8f2c064c79e6cb0c0d433974e32b.npy +03001627-d3a38afe0a0341cefebad4f49b26ec52.npy +04256520-fafd58ba00e8590119abd93be2967664.npy +02958343-41175e2053fb636852e23117ce8d150e.npy +02933112-41472c96b430a1c44f03bfce55719739.npy +03001627-5bb5b15807158f71504721639e19f609.npy +03001627-41ef5dfaee26499afe0dc3bdfa883025.npy +02958343-1c8cc8dd7b2d9671c7709b125ddd3d3.npy +03001627-6cb6373befd7e1a7aa918b099faddaba.npy +03593526-8872d686186924e6c8724d5673a063a6.npy +04379243-efe2bb181502eac1f3c9c1464e55d580.npy +03636649-273314626729b1e973222d877df1ecac.npy +04256520-c5e55f00566f0da2ec012e3517533bb1.npy +03636649-de5799693fbddbe3c4560b8f156e749.npy +04090263-710148ab44c6e48441c4ee8eaf0d3f6e.npy +04256520-1ebf04ee0e620619ea006adb8af93414.npy +04256520-6c9f559b0adfbd6985d87e0aa09f3117.npy +04090263-f373746d1ef6fb5da4dd752ddde80fb1.npy +03991062-8442df5146f188a925ebd1cd0b422e32.npy +04256520-8918d572cff6b15df36ecf951968a8b0.npy +04379243-994e524d70043c3496e349c87c588bf2.npy +04379243-33e18d453f4a8c90ab610b0c94236463.npy +03001627-9e65e8fdde35dcbef91663a74ccd2338.npy +03761084-ca0b473a5c373dc1f3d773b4af1f0c9.npy +04256520-5f66f9b4afd7d0bbbe99c53d7c66ee1.npy +02958343-a358931939481311bda733a39f84326d.npy +04379243-2d1d8a2f976387bd3145205f02ff9fc5.npy +02691156-e0cc4f538a8da2d65d3bbd70fc7759b7.npy +03001627-cff9a523a9e20eaeb40f0ac0fb9a650d.npy +04256520-8889b2abd894ab268d1b9a1d97e2846.npy +03928116-54e3ca588d0975b6a3c4aad99618c729.npy +04256520-ee5d770da5335578f7d7b7d6143367b0.npy +03001627-75b9ddc5017a5eb137f8f3a1ea8633a9.npy +04090263-a1f46e16994569d8743d370dddd1ff3e.npy +03636649-db88171d1793fa2785718c281d7fdf61.npy +04256520-4f5780a3a0466469e5c864cdd2c65afa.npy +02691156-c600de8c83303e6a441eeb748bfdabb4.npy +04460130-a2beb5f14190c1702637f1559971e0a6.npy +04379243-2598bfc04772f90cc20778ca035801.npy +02691156-ab7001e6d0321374b378822897b79a81.npy +03991062-3185f5566da7b4fe78253215bd9538ec.npy +03636649-a957a1304a1fe3f2f78c91c136e5b5f8.npy +03046257-9d3efcd35cda4abac7cdfa94351d0f74.npy +03636649-c26b7862f2afb7ee4b3c42e318f3affc.npy +04256520-a9ee7aaca080a86798e0d1738edd4f19.npy +02871439-2c55ab36465941714dad8cf98230ae26.npy +03636649-617e98c1d743c17420ccbe1c34ca182d.npy +02958343-1aef0af3cdafb118c6a40bdf315062da.npy +03001627-5472ab8df7cd3ecc1c1b3b2ed8d13bf8.npy +03636649-c0a0f01bf127b972257cafc2ddee5167.npy +03001627-93ee27f70b593cee7b11ae648ea92233.npy +03636649-f6425a421a497aad6cc679ef84e06ad6.npy +02747177-92fa62263ad30506d2b12aa6a0f050b3.npy +04090263-c07f9e5e064bd0ef93c9577cd4b35faa.npy +03642806-e8f89f185dd8165b9b07343517e0f88e.npy +03636649-4bd3f50f903cb1bffbaaaf5884f2c88f.npy +02958343-2655a48c8867146bf63ee8a34069b7c5.npy +04379243-22b4c1176e8433134ea79bdd828d5828.npy +04401088-7f55d778584ee63d2271b84575f49c3b.npy +03691459-43990265c9b6be4a989542bab68e6843.npy +03001627-66e1329d6098499382e4e6b3ab10271.npy +02958343-b481b928be9f2bb0e71f141b16973142.npy +03001627-fa5bb6d18535f66219fb4103277a6b93.npy +02933112-6e75ca2b08fe53a344221bef0fa3c36b.npy +03636649-44b84b479d9f8ae7ce2b80886d544375.npy +02691156-c6e4d12318bc4a3b262daac8a0882e96.npy +02958343-a2fa9237519db867f606d4ef0b8dbe5b.npy +04530566-d608bdcd8a87f3af7d2dc2b4ad06dc44.npy +03211117-64fe6e4480939c5e9b485b25e7417c6f.npy +03325088-ab01f61d19cce83aaf0b75abe6dfe88a.npy +02876657-62451f0ab130709ef7480cb1ee830fb9.npy +03001627-58f3e49e746363dcf91663a74ccd2338.npy +03085013-61f958f07b7489e56f03051f81ab06b7.npy +04379243-906eed2a218acb42699c80a6f97edc9f.npy +02808440-d95901baec87549e54d7082b34825ef0.npy +03691459-b3158c23dbd08f554cf39544f467e5c6.npy +02691156-42b63c881861105ccc14f1e6f4f4f49b.npy +02933112-1ef44fc1b4cac21af51fa0238791f5dc.npy +04530566-33d7cf0698dea49acaf9c991e0bc2cd.npy +04256520-165a78e3a2b705ef22c3a2386a9dfbe9.npy +02992529-cf7973f49aa611346be7f66e5722d994.npy +04256520-514d64dec987c01d552ef6186e5d52ac.npy +03001627-6cc65de3b510406ba0c5548d84070f68.npy +04530566-68babb87d66a981dd187e410b169ccd0.npy +04379243-6b6c03883c704389c3bd24f986301745.npy +03636649-5f943996d99dcf59726dbbf7bc5e4df3.npy +02958343-c6ab70b8319d7f2451751fb7affef409.npy +03001627-86c28989c2edf29a2bb396d08a9b621a.npy +02958343-2996a60389105deb649a971570be83d.npy +04256520-bd3cb48163e43810f29b3e56ea45251a.npy +04379243-6d705b609f98e559173b9f28a2caa84d.npy +03636649-418a6ed14b4571daa5af58528d00e4fc.npy +02808440-a369b8bb41a81cf7dbabfe882776e1f8.npy +02691156-4bfa5d948d9ca7ab7c5f0032facde6fe.npy +03636649-55af2652c4460b05ef3a2c64cef919d0.npy +03337140-90a2174624d8b62da53326e496617646.npy +02691156-48e47a6e592cf635590b4d838791a67a.npy +04004475-8f0d3efa9e511ed53fd0acbaa54efdfa.npy +02958343-282293948b21262769416db9b743e50b.npy +03001627-5d346bdb7db27accf3588493d5c284.npy +04468005-553450a802f3ae6b33bba21b4e20708b.npy +03636649-d08941d91a52d4ca411abfe83236ee8a.npy +02876657-3e7d7a9637e385f2fd1efdcc788bb066.npy +02958343-b18e5aaa86cd8716a7fd25564c2e888e.npy +03001627-7a1de77ca204eaf28a514cac7cb18507.npy +02958343-6e651b2230b8474c2de77cee5dfe5031.npy +02808440-fcc74af36543018db38325455ee7a49f.npy +04330267-ef0ac3eec2bd550a2bac1bcdfc2402d2.npy +02808440-c4c3e4b9223ac6b71c17aef130ed6213.npy +02933112-3cdabe258ed67a144da5feafe6f1c8fc.npy +02828884-f958d18643e7dffd99892aa9c57c2870.npy +03001627-30bbee7ab9026c5e4b3c42e318f3affc.npy +02992529-2b33c33ab4beb7493ce1b993153ccc0e.npy +03001627-269698853d294f595761a0b53ed37cec.npy +04090263-ac161c74926a5face378cd9d51dc5be0.npy +03325088-1ae1609816687a883792c04fd8184496.npy +04004475-7c1ac983a6bf981e8ff3763a6b02b3bb.npy +02828884-26299b4f8e03f3ae9470a3e695aa4fae.npy +04379243-176d3994129f9307c3bd24f986301745.npy +04379243-ceb0c123378d24bd9f4b4145f6688869.npy +02691156-f2d4b8440d4bde5330afbcb38d77d0c3.npy +04090263-94386a700272405ef0d11ae402ef940e.npy +02924116-585f25e44777c5a1403c57e7ce69f902.npy +03337140-20f41c44148871104c3aee8e9d3a6ffa.npy +04379243-bbddae0c95f3b7b636b0f2a1430e993a.npy +04530566-7a6634eb949d72719e6f7dedb7e5f584.npy +02933112-c01ecf4426f58beec3c7482d23c2379.npy +03636649-534c7e2c9495d7987b6fd5468f603b31.npy +02691156-4129199695b9344930813b40bae6f4cd.npy +04554684-5a94498353af7763e169a380d7bfbfc.npy +02871439-4f53f0d00d3491f35eea3e3d89293379.npy +03636649-67e18db74dfcf7f418df0876cc6aa6ac.npy +02828884-23b5a3c3d7d6057636ebcfdda999d232.npy +04379243-c416034b70b1d339838b39398d1628f8.npy +04379243-68ef6fc62b9d7f161a8a283df3396be6.npy +03001627-5e3cf3c40c6bfc0471a782a4379556c7.npy +04256520-a659b730251c2da7b3660298957b3f6f.npy +02828884-6d420bec5284eb43ad5067eac75a07f7.npy +04256520-3ced29b0f7f38bcb8964df2a32faa49f.npy +03593526-c81fa64321c8d49fb9be450193b1790b.npy +03001627-a93aac9ad86008e69fc01fb65ca37d30.npy +03642806-a3d3ce1084c2dc3457cd4ef590dc070.npy +04401088-a24fb0602fc7fbf4ec059109909662d2.npy +03001627-e8126f9e2d106620d2f33aaf794b5932.npy +04256520-2639242e8f06f93919fb4103277a6b93.npy +03691459-796384ba0e8cb525e17b9e33c097dbff.npy +04379243-3429a5b0d0497316ce44dc01dba1e174.npy +02773838-5f3af8ff93de34c9e7922afdefd88b6e.npy +03636649-a21744a28956c93cc5a208307819a3a1.npy +04379243-fb7af067384d120b46ebf4f1147c3f0f.npy +03001627-6a72bf1b1ba3254c51c4deb11af7079e.npy +03001627-da160f272c6d77f571a782a4379556c7.npy +04379243-bc48080ee5498d721fca2012865943e2.npy +03001627-b6b426ede67febd4a413908c0e169330.npy +04401088-d3dcafb368c1defaa2c7c5886f4bbc93.npy +04379243-7dd4c0baac6c76703002761e7a3ba3bd.npy +03593526-19fb5ee10bc867a492ffc535cab01f7a.npy +03938244-f7a1abde2723321e8bd9de6b28931bb0.npy +04530566-75198f9e1c5a075c1e6afa6efa6add34.npy +03001627-c0739ef0c29f005ef1f5e7b74609d54c.npy +04256520-acd97b28893414c41e4599068fc59335.npy +02808440-ca63d5d8d3f1933354d7082b34825ef0.npy +04530566-cea154f7fb5351bc26da67afecb7dc87.npy +02958343-53a031dd120e81dc3aa562f24645e326.npy +02828884-f5c6c9a4c5787dae19fb4103277a6b93.npy +02691156-4542d34685168ecf7a571401e6605fc2.npy +02828884-2ab2387e58cfd17ef155d75bbf62b80.npy +03636649-752a9fb2cf32fb5481e0c510e9bf91d1.npy +04090263-6639f08c2275398352d6d9553235a14e.npy +02691156-c0c32558decf271df3ad4b0977199f23.npy +04256520-ec836d156e8157fec862eec8232fff1e.npy +04379243-18ea2f5371184926764a784715fb668.npy +02992529-5b111b3a3e94b5907e1c85c5c15da7fb.npy +04401088-c9a50d65e19a4aa3e2da685d55be1eb.npy +03001627-6aba15a68e745c8d48fda83c10428379.npy +03211117-b302ee5206ec79c34ec31516689e34ad.npy +03337140-f44e926b21e1633e492d9da2668ec34c.npy +03691459-14f7468c0ae24a73d6317d54cfc1018f.npy +04256520-2a8554af80cfa5e719fb4103277a6b93.npy +03001627-5bf38f7840d4c8fc8e9d341bc3648f0d.npy +02828884-6d6143cd573920ba7251f1ec40392b93.npy +02924116-df3f687930b79392d6990bffe29902a9.npy +02958343-2c3e7991d4b900ab35fea498c4ba7c5a.npy +04379243-447f9f9dcd85f6242849dacb94997f4a.npy +02958343-acf64e44b021fd4613b86a9df4269733.npy +02691156-f4b734236ec678d269e10d525d6df27.npy +02691156-6e324581dbbdfb5548e8405d6c51a908.npy +04379243-b7aedc93c53ab7c1490ad276cd2af3a4.npy +03691459-c52531bfe9fcb17a87586c1eb104adc8.npy +04379243-10fbf670bb017ec94ebb593f0d0b4581.npy +04379243-aecdd6e67c790959504af6e1321617aa.npy +02880940-f0fdca5f5c7a06252dbdfbe028032489.npy +04530566-bc8cfba04c86ab537117d5d39e7f9235.npy +02958343-a19d008c68e9c942a78cb4f1b66f009e.npy +03691459-acbda0d16acd03329d4b859036b8707c.npy +03001627-61943ed43201e59ed7f7a4c4609b0913.npy +04256520-8952146d844d41f78dd7a714af22f7ca.npy +04379243-461e2b86470326ed70e89b1ce671b01f.npy +03325088-af92e8fc813b826550da8b99982a3057.npy +02924116-c50e814a2e40e78ce8784f880dac0f61.npy +02691156-118e8142a8cb1fe19a4a28ef635593ce.npy +03691459-e71f2c0e0c760ae98139dd63d55edc44.npy +04379243-6d5a70271c0529071360172b4b6205b1.npy +04379243-3f4ee26a68f2e9386051d49e4b21b83c.npy +02691156-ddd06628f3bfd0b64e1dedff94c67c76.npy +02958343-8212b62591234c743a0daf3e5400b95c.npy +02958343-54514b3e6ea7ad944361eef216dfeaa6.npy +02958343-bae4b861b5cf87275b182da8c76b7238.npy +04090263-3190d8d6542e51fa4b349e4b3dd5565e.npy +04379243-a3dd0302fd716e8624d89cbad731b903.npy +04530566-fa2b5f163549ca457ba04de7d6d93ce8.npy +04379243-e40afb4171ccc460de03ab2a27ba7531.npy +04530566-6e52344e2aa435d37e264261353b57e1.npy +03001627-da6cbcac794d377df9111ef49c078dbe.npy +02933112-e05be650930e7eadab9ab77fc8888129.npy +04090263-30d7d9f98893cfd62511f68da65f4c4.npy +04074963-a036b6be1c50f61fa046bbac53886364.npy +04090263-39bfd3455413996df8f666ba0e601ac.npy +02871439-29398b8b0425408a887c133d6a014f38.npy +02818832-a39d775401e716948cbb8bac2032149c.npy +04401088-7f6a27f44d8c9f2bbcde31492651e03.npy +04379243-e801542eb03f6e3b96d5fa1ee6ada8d1.npy +04468005-a301441491fed52e98d3c3293089ec31.npy +04379243-80b20fdbf1183f37b7491f8d3451cded.npy +04090263-db8f1174280680de5e561f212b7229f3.npy +04379243-146a019a7269fabc45656b6a28cfe2cf.npy +02691156-4c9214d70e0a00c6c1ccec171a275967.npy +04090263-2b6e43e973ee42ea1080be321101ad10.npy +03467517-bad8978268948ea3d3eb77b119df6d.npy +04379243-e0c570b6776eeccec715f352ef265874.npy +02958343-f8885a2372b427f8f2626f7f7bd2296e.npy +03001627-6b5edd2c4df6e85cf9b9977a2406713a.npy +03001627-65f3d57bd9c6911d492d9da2668ec34c.npy +04090263-30621c7dddddd06f42a2e92acc266edd.npy +04090263-4edbccf034f4ab241c3656c6593bed66.npy +02958343-49da37115bf906a7548ac25911d2130a.npy +02958343-49f3932e6fe0828951cc889a6330ab15.npy +04530566-726a60f7dabb1c88c746ec5b7259bed7.npy +04379243-fe710962895c20914476c40fec27b24f.npy +02808440-57f5f67de9a46afbb362845c6edb57fc.npy +03001627-662409af279f322eeb82005949031741.npy +04256520-7dbdddc3a60664f9e87dd5740f9baf65.npy +04530566-37aeaa30913d6ac73e7331a68f273ff6.npy +02691156-72aee7d0e998a68aca8607f540cc62ba.npy +04401088-8f1ec459492c61ff562c8e1ac545ef78.npy +03636649-1f5919744e0376315f38797299bc3fc7.npy +04090263-8fb4cf2a9f6d0abd8e7e8cfdb2f674b.npy +03797390-83827973c79ca7631c9ec1e03e401f54.npy +03991062-4192ea096a7afd3595f577622f465c85.npy +02691156-350d4b260bb18470f77959a47a1c16a8.npy +03642806-719be2a932ea7891374110224c1c4eb0.npy +03513137-b14fa79d2a1efb586f7dd5dd40daa88a.npy +02691156-3e5aa51d27e294a835fc197bbabcd5bd.npy +02958343-7a5eba46ba4cfac35aa429db266f0c30.npy +03001627-510b1295f70873e2f91663a74ccd2338.npy +02691156-b51032670accbd25d11b9a498c2f9ed5.npy +03046257-b9493a141be0e2fe192693a5c1e96238.npy +03325088-c9c3fce5cf0e964f116162acefe23592.npy +04530566-a771ed8115610f0320d75154997de910.npy +03691459-f529e7d74d5ec3d9a1bb636e72c59b32.npy +02924116-9188b08104130e52f446f92b52bbd82a.npy +03001627-2016d09b261b09f05413c1f22a911d58.npy +02691156-33c5c1919425791de038c01d73511063.npy +02958343-d50fcb81298e51e4afe717997470b28d.npy +02954340-da5e5ec4c486d6c03baa6271927f050e.npy +03513137-ae0a3cf547c0534ab0aa56928723eca5.npy +03001627-c0b45de1c0e8f80d4521562865ab775e.npy +04379243-2933b92d193e31b46cff9b44fdf0517e.npy +03325088-3af3bb6e47732764c36fb70296e45483.npy +02933112-29b2a25804651a34c59350d819542ec7.npy +02933112-267545b2c6ec6ee1f51f77a6d7299806.npy +03001627-807f08096308af5e28c0cecb7de2397a.npy +03636649-181ec75aca2de25f6dbdf247ab8522eb.npy +02958343-2e5dbf98157a53a55cde8c99e4b182f9.npy +04379243-6cb41b2a5e27533f436e6787c76ef3f0.npy +02876657-70172e6afe6aff7847f90c1ac631b97f.npy +02958343-55181c34dadb4f032db09455d18fca0.npy +02992529-d809653bf5a21f10e5b8860dcdb97aaa.npy +03001627-9a789be179253acd66c580e84dfb7998.npy +03325088-98543b751804811c36fb70296e45483.npy +04379243-1a767b8130e8a5722a7d46e74f08da70.npy +03797390-92d6394732e6058d4bcbafcc905a9b98.npy +02958343-d07300cbf12c42c3c427f8508e3d634b.npy +04379243-ea96b8a866121d1abed1bd9593e318c.npy +02828884-56f65bffa385a635f4b6538438a0b930.npy +02691156-55b7a2661bffdf9d55a352cb563d3195.npy +02808440-3981200a977815ae3321831d2245cf06.npy +03691459-a872cbdc66e671ec29d1e4faf5d375.npy +02691156-2f01cae5fb585d56ca8607f540cc62ba.npy +04090263-733fd68ce2fdeeb76a853eef701ef7ce.npy +04004475-e232d3b7ba947154684a64a3647d1ec0.npy +03211117-fac8bc5420f9d472b36c473722d8f02c.npy +03001627-9682d28e03acd2e3735013f3db728e20.npy +03211117-6ac7bd79924399c4a0778cc08d9b97f8.npy +04379243-391005d8f1291cb71bb088904f7cb154.npy +04379243-8e7b48d1eba786cde8ee269f00f30d13.npy +04401088-428ac05b36bb576d2a9eb0f146e94477.npy +02876657-1c38ca26c65826804c35e2851444dc2f.npy +04256520-6d60b813582de6c1febad4f49b26ec52.npy +03001627-4b35fbf5df52938a76d876646d549aa0.npy +02924116-7822eead7ed7abc5c150a7c590f1de60.npy +04256520-2f1e6b2c94d6b6c474072e8e7f655555.npy +03636649-80a5ce76688700a2fdd36147bc6b8031.npy +03928116-58fbc1679a7b229b7773fd259c9bf7d7.npy +03991062-a2841256fc6fd90da518b93bb7233de6.npy +02691156-dcbd333ef51b76862b600da24e0965.npy +04379243-832ea764f0d3ffad9923defa57043b67.npy +03046257-811e5e7b22e7ed15b9cdfe8062f449fa.npy +04530566-d95c49195e51912056f316a86bec8b19.npy +03001627-314c04d32f9e42c5f91663a74ccd2338.npy +02876657-d34628eb8992d1f418ae046addd85243.npy +03001627-a06114a07a68c995c8687ff9b0b4e4ac.npy +04379243-9d17b91f7f301cfc6655d494d4092078.npy +04379243-63f568ee89ac03c6603557e69ac4ca11.npy +02933112-be7d2a1a7fa7ce0b11fc2b865c2a185b.npy +03211117-cdf8eff26c940d7fcd1272091a2a216.npy +02958343-360cc5c25fd6bf20ea50ea60f77ab4cb.npy +04530566-6f3384e934f3588ccc37416b6163cbbd.npy +04379243-1d3aa66972004e861f5bdd219902caa1.npy +04256520-d8e1f6781276eb1af34e56d1d9ad8c65.npy +02773838-2f97f841aff238b74245c6fcbfdfe98a.npy +03001627-44ddb3d46266bb0ffebad4f49b26ec52.npy +02992529-3f3770476f094a6f2093f68f248ba9f6.npy +03211117-25df40f2502c6bc2b2fee0e811c64fd3.npy +02933112-24eb9773fec0eb609e4965f0106e00d9.npy +04379243-6292216ef69f6edb11c5cce13f76151.npy +03593526-6cccc41151a9578d4b3c42e318f3affc.npy +03001627-e3b04359a3e9ac5de5dbcc9343304f4a.npy +03948459-391e01226bccecab1d74bbc1a32c7aba.npy +03797390-b815d7e084a5a75b8d543d7713b96a41.npy +04401088-401d5604ebfb4b43a7d4c094203303b1.npy +03325088-465491e7cfd3e0b198a7e0d99b5bf4c9.npy +03337140-9f26b723e21d0fe94c3aee8e9d3a6ffa.npy +03001627-529c0a3650d6a7be97e2a21b8bc2d948.npy +04401088-67524ffa83e3eb7c4948b3842dede005.npy +04401088-162341ffb94a3884e4ba5fe92f32019a.npy +02871439-3a3015426ff544c46fb17e2962e0eb20.npy +03636649-1a6a520652aa2244146fa8a09fad6c38.npy +04379243-c38ba6c06d2b813230c589758b4b5646.npy +04379243-1cc70da57ce2e9e7309b03efb521ec1e.npy +03207941-45eb04a33128a2065dc3653f8341633a.npy +04090263-abfec35b505a92da64c4db7c3b428292.npy +04379243-e9546947de34dde213a5873d239ac557.npy +03001627-bf3c19bb6bf16aa8beedd4e6b38acced.npy +02691156-dcca40aae3eb0c8757bef59252fb18b5.npy +02801938-9394df08489ae97eba5342d638d0c267.npy +03797390-7a8ea24474846c5c2f23d8349a133d2b.npy +03001627-247353514479969ce6fe3612af521500.npy +03337140-8633f465415ec9e41933ffef19678834.npy +04554684-7de9dc34c7230ca54d3df84a5eca1a73.npy +02691156-7d928af41b7dd26e1d0f8853f6d023e3.npy +02958343-e61dadc02535e6e44b6e62b17dc78f70.npy +04530566-e72c59779e1a85f05308b39b1b1978d6.npy +04225987-f9752bb556ab1e20681083250d6ef1.npy +02958343-e64dd4ff16eab5752a9eb0f146e94477.npy +02958343-505ab718b8083f02ff1370452e3a0154.npy +04256520-5e8b318948817989a33ae3b0de29197.npy +03790512-8e956bae37beff87c2743f037f439af3.npy +02691156-c510e14ac20edee814a46d7ec44fc258.npy +03001627-d1237422881f4d22ff25b0c2db862d19.npy +03691459-513775c0ca44462d912b963d265d5e8.npy +03211117-bba0cad6dbbef2589fb287620a60b403.npy +04256520-7550aa9d29f252611431dc89d81d788b.npy +04379243-68fb0825ec07a521febad4f49b26ec52.npy +03325088-1226b60bf7593f08c36fb70296e45483.npy +03001627-2d018e8c0a34a863ff59f04994ef1f0c.npy +02958343-9232d8834704e5f9dd141480e2c154d3.npy +04379243-ec16de40e8415006855931d119219022.npy +03513137-257676761b471e0e69508b2b14833df3.npy +04379243-f5d1fc338e804d7fca7e81cd26bdd69.npy +04379243-1c814f977bcda5b79a87002a4eeaf610.npy +04090263-5019d7c3b413a57012b38b1d99376c0b.npy +02828884-8a541c1e735e834ad5067eac75a07f7.npy +02871439-a37d60f8e90a3afd810b14a81e12eca.npy +04379243-4c1048076c0a8a09c785f06f424b9d06.npy +03761084-77c4453bb4349e398128bc89a67202b0.npy +03001627-ef8b9243c75bdc93347805f93d32915b.npy +04090263-e574eb37ea6ee685e1f2a1daf140ac9f.npy +02876657-9f2bb4a157164af19a7c9976093a710d.npy +03467517-909e86e4a5af7fdf93f0194265a9746c.npy +03636649-cd1d426e08bcbe3e5a4e392b59939d74.npy +03001627-31423159297243ded65766fd3c4f994c.npy +03991062-4976f22bb8ba359713c828323b9d4bf.npy +04256520-b85dd5219ebb52455a1bada754e9e91.npy +03001627-5cf5615844b41442118bf3432a979b3c.npy +03636649-63fc809815b9639de7c7920f6a65a54d.npy +03636649-f049bbd180d89cb5490ad276cd2af3a4.npy +03001627-b3a9c49a1924f99815f855bb1d7c4f07.npy +03325088-b7ca2740aaae2d2c908061a998e20526.npy +04530566-4bf2dba91007f0285ce1e6c1c914b7a9.npy +02828884-3c40692f71e9b773c2c0fe12f0bcb343.npy +03467517-71137de8f3188ab3ac61a2f8346a8f.npy +03636649-36cbe594af434ef9a89ecd28750d46ac.npy +04379243-dbc5a4d1dc3a6e8271a782a4379556c7.npy +03211117-d41ff8cc1f08db6341d8f14d547541e.npy +02808440-e9344c904146df46533e0927d26599e2.npy +04379243-7689de934d5af6505e8431ceb98e6b3b.npy +02933112-b404faa639b8600855f46d55537192b6.npy +02958343-37954fb8bb9a7e351076d1567fc9aa51.npy +02818832-b294f0771e8cf0f4b844ed59ffd3b45c.npy +04256520-e08354a352fd0d6914a163d2b227b320.npy +04379243-9705c2610980d0fdb2d0500bdfc28f70.npy +04090263-2f8a672751f8c284a5d999dbf2c5fd3b.npy +02691156-2b99e54070c8b6d466cf1b4a8fc3914e.npy +02958343-71ea237c598aad1becf71e2e014ff6f.npy +04554684-8d3cd0d2cf88b2c2a83d16be6f14bd8.npy +03001627-a5de4210ba131f0e6ac7817035f206f9.npy +03948459-a7f7db7ce1dd7772515515e554d8cca8.npy +02747177-d6474403437240d578e4d091a0ee3ecd.npy +04379243-2d468e75b3063c165dca6305fb9f97ca.npy +03991062-ea473a79fd2c98e5789eafad9d8a9394.npy +04379243-c28f9a82cb7ddbb53651bb31f42d2f80.npy +04256520-9152b02103bdc98633b8015b1af14a5f.npy +04468005-dc52a7e38d59a2aee68cb23a969dff91.npy +04530566-227db3047b2ab275b3492776d9bac18.npy +02933112-36223972cc8153718cd9445de76e734d.npy +04256520-2dcd9c9795ce4471b65843dc986fdf7a.npy +03001627-55e4b862b56e873eb36dcc661f3905d.npy +03001627-fc14c1aa7831f4cbcaef18b2fd3fb17c.npy +02808440-6e4339050c5338933af30a3946d92feb.npy +04256520-5a7b6de19865d1332c8896155b09445c.npy +02871439-6f46c38f86fa961ed2f1945599cd5176.npy +03001627-d9af882ab6d1cbbd492d9da2668ec34c.npy +04256520-a8ff859fcdae8f70f2543b208c9ee8e2.npy +04225987-571dd1b4d09773c5bbe43d356df0e955.npy +04401088-43b59b01866f23e6f8d380ef6d10e2a7.npy +02828884-58eb1f7c59fda8271068f29f0b65163f.npy +03001627-abe225081bec7d21c5a208307819a3a1.npy +02933112-316bd800a04f14f0de650492e45fb14f.npy +04090263-8949412a776f34e6a821a9df9523f811.npy +04554684-a4fd18ac554ef926756dd585069c80a5.npy +03593526-80059506552f4a2cc97114870bb573.npy +04379243-fe0ac2e334ad4d844fb315ce917a9ec2.npy +03001627-dfda3c467eb6066fe6fe3612af521500.npy +02958343-66bdbc812bd0a196e194052f3f12cb2e.npy +03001627-ea02e94e39a2fd3922963ea1e168015d.npy +03001627-59ee0ee98def6f1e14b86d5282eb8301.npy +02691156-468831f7b19aaebabbf3143b1cb6076a.npy +03001627-53eea17c88e31519492d9da2668ec34c.npy +02828884-ea4e8de5b98a0463c955e5ed03ef3a2f.npy +03797390-d38295b8d83e8cdec712af445786fe.npy +02876657-b742bd7f675191c24ad6a0c67b7f7a5b.npy +04256520-57ceb2601802a37e534fa06200d07790.npy +03001627-9aecd48a3af10deeee83c0324834f3fa.npy +04256520-8ef1ea7a7c4b4e7d5cba62773b8025b.npy +03325088-71a0a8c0c7d749fc4c586a3fab372c5d.npy +04256520-849ddda40bd6540efac8371a83e130ac.npy +04256520-3a525a1286d4879ed35d1c787a8f626e.npy +03467517-a31ef3a8c70b789b93f0194265a9746c.npy +03211117-abc4a3eb2c6fbe8064d221a686772b82.npy +04401088-24d22e3257420bc2b785a4ac4a0dbd73.npy +02958343-b809864c779761ab7ac2a2313c9e8844.npy +03001627-e3c79d6e34b1285e4580ed619ae2daa1.npy +04256520-fcf30cec3180c05da5f9d52c12457194.npy +02924116-de1800e9ce6da9af52470de2774d6099.npy +04379243-a1cb5947d7b09c2c7ca68e217a316e15.npy +03001627-97f1121561e481a3a1f1563b05df75c6.npy +03991062-8d930cf7b852fc6181faebbdea6bd9be.npy +03593526-bf43945eef1782f7f6f19d35df0b096d.npy +03636649-ce798635ececbffd5ac3a75efa13522c.npy +02924116-c9991032ff77fe8552470de2774d6099.npy +02958343-3ef7cfbc172840b2393bf61b30c528bb.npy +04530566-f61524a539deb8097f7b259a472cabd9.npy +03593526-6b1e3b2af2a9e54bef76898f881b76a.npy +03636649-4e3d1346e76084a2c1caa73a5e644b6.npy +02992529-e633f997f4a47b2d727a08b50053320e.npy +03691459-a9d5719c3c2af900ce029fab54b6cfbd.npy +03938244-fe2236c135bc169e7676dfce60793e46.npy +04379243-bd430a701652963faf0ff870be225563.npy +02843684-f71f6bcd0bea761d32e483dbd0fffcb.npy +04468005-4aac817a256e3121fbaac8096a32753b.npy +02958343-62393db2dee065956e28ffc6e1f368fe.npy +04530566-6ab4ddc238851014802f537afffb178.npy +02691156-b80bd34ab330babbc8727b27ee96a4b7.npy +03211117-4f598d41b30b28e84158c4db508f74e8.npy +03001627-49a60133d6b05b8d19fb4103277a6b93.npy +03001627-1230d31e3a6cbf309cd431573238602d.npy +04530566-81170170d0cf36eaa5c5aafe837d3f8f.npy +02691156-26bc67e3ecda6aa1adbb4c4e06ad649.npy +02691156-71a96b4e134ceaacbfacbd9a73055b6e.npy +04090263-b0bff9f866c3d101af25bbd7d4e31ad.npy +03325088-1170e12f08a5f2952dc86760e17ef6c.npy +04256520-1f74a21433c43c784209d14d674fb332.npy +04090263-a33697175cda9f2d742567ca48f0f7e2.npy +04379243-a1a9c417180124f1a6c03a53cf0a14c9.npy +02691156-feb0bd0dcd155af4cc34b900bb2492e.npy +04379243-d5f2968e4b7254ccf4104961857ca9c.npy +04530566-645382862cc284869bfdd98fcb85ea6d.npy +03001627-4a4c7abae3929595184740798d03a659.npy +04379243-86bf47a73d93b66ecd037ccdf14d7446.npy +03001627-d0bb642e810bd2fea6fee8e2140acec9.npy +04530566-d49066858c55d7b021d7ca6ede0e9373.npy +02992529-aba1179bf8b62c812a6d73bcecfd73da.npy +04379243-133d7c9a1f79b01ad0176f9a144100cd.npy +04256520-22c68a7a2c8142f027eb00c151c6f711.npy +02747177-4606c9bae0c3a717ba6cf6cbb9f4c2bb.npy +04379243-ab2967188299bea54cb0654f4cfa9684.npy +03001627-8731945435676805aa29e9f0529e8ef7.npy +02808440-ceb077ecef095d452d70ca35ac1a10ff.npy +04530566-c1825c8ddf2f263ed6f64c5c0b0cdccc.npy +04530566-686a53aff9209c258d25d8990968dc68.npy +02958343-114b662c64caba81bb07f8c2248e54bc.npy +03001627-8bb3a13d45c5337d20e3ea5765d7edb.npy +02691156-e8d5a3e98c222583d972c9dd75ed77d4.npy +03691459-c9de3e18847044da47e2162b6089a53e.npy +04460130-47ce1a5380447249c26ade84d8048a3.npy +02691156-6d3965fef2c63d37b3a197029fcc978f.npy +04225987-ab76bf4b966e3fb5b10029f76a5ab54a.npy +03467517-ea23bdf251c9be975c6a44a505804654.npy +03513137-8eb4152bc0f6b91e7bc12ebbbb3689a1.npy +04330267-a5fab90884f5b576506c648223cdabe9.npy +03636649-4c4078f8206ef3cfe13094731a5351fc.npy +04074963-cd0c46f23b28b94ce56eff8fe87c1176.npy +02871439-13d1ffe8682729b29af4053b8815b239.npy +02828884-989c5de438050d9d6664ead1964339d.npy +02933112-62d67406fb239e21533276a8c0b1c862.npy +04090263-4e0cf21c4e7e1eb58c7ca3bb219438a1.npy +02942699-fdcd83539b8db2c8b5635bf39f10a28a.npy +04256520-c22dd8c395f465c87599bba30f391291.npy +04401088-98c63a8e5485b0a12737a4ff69ca3cd7.npy +02958343-5b1f078a81df862ec2c2c81e2232aa95.npy +04379243-8281936e9123cbbcaf95ae40867329f.npy +03710193-7b722675af1f1cec91adfee365fdcaf.npy +03636649-ec8dc2311d381a9e3d39d8012919dd25.npy +02691156-d56fba80d39bdff738decdbba236bc1d.npy +02691156-381111f176565d48fe4c91be246ef13b.npy +02933112-9166a54bcb06b6c7c59350d819542ec7.npy +04090263-ab9da6638fe428e87f3efc94c2d31dc5.npy +04379243-be045fca16562f6764c85287e21825c4.npy +03001627-117bd6da01905949a81116f5456ee312.npy +04401088-e13a5d5b3f7581cbecf207e73a787c06.npy +02958343-8c04413559b71fccbda72093f9b5aa73.npy +03001627-9570ea7fa3a0ef775436c76691cf3d3.npy +03691459-892af085a4518fc673c609379da5b9c2.npy +04090263-8a95676f5965c580276c3d558130f8b4.npy +04379243-66a801881c4ef524848eff6ddf1058ec.npy +04090263-ed01d61bb0439a33b4cdad9a5bf52dd5.npy +04330267-7020994986d2bc01bc59ed4ab44a78f.npy +04090263-670857f79c4d47c13a6842b1f893c19.npy +02924116-a02e4c26e3d769be221d7b13f13a827e.npy +04379243-7050eed75c60753cf0eaa338269104ae.npy +02747177-e3484284e1f301077d9a3c398c7b4709.npy +04090263-4ec09a25c05bc7d0fdc1361c2b9ae6a4.npy +04379243-f5ee06263c91d7eadfe9cab879fd37e8.npy +04379243-2a2d6560f14a01c6afac72146bbc9d59.npy +03636649-688d88d300429b7dcf78a76e06ee9b92.npy +02958343-28d7a23b2311b1029dce0c74b747947.npy +04379243-a33b6291afb1f8b066b38b193b506338.npy +04379243-71ec472682954cee353c1d159a8a8422.npy +04530566-c04df151b8677becd8af3a076c923cf.npy +04530566-f5fc09f67a5fdb0142d0e83abdfab1fd.npy +04090263-2c0f882d4c5fae8f2bd05e1cf7da8957.npy +03001627-b66a32bed74e203591f74997d435672d.npy +04256520-9cf1a9ea641d548a7e1dc33a9d8d260a.npy +04530566-3d396cf4279378456d165da625f3894c.npy +02958343-7cb387de84bfd2f5fcf949f5ffa7ff6.npy +04530566-d23e71adcc315d56c748af2814b558c4.npy +03261776-63179fbdf2db65fff325ea98afcb29f9.npy +02828884-19aa04605b1b00d0ad5067eac75a07f7.npy +03001627-u6028f63e-4111-4412-9098-fe5f4f0c7c83.npy +04379243-877e3505ebab096848f551687b50fb00.npy +04379243-4be0f809a66f1797ad9d8182e90fd7fb.npy +02691156-4b4fd540cab0cdf3f38bce64a8733419.npy +02691156-399449fd9e6149de62b600da24e0965.npy +03636649-8a9f2e5b726ea37f60ad823977adaa23.npy +04256520-3ac827b804fee818b0b88207ef0f5bc6.npy +03636649-43deffcae6d595f3fcb8d8c6d4df8143.npy +03636649-5179edb45a24a785fbd4fd7714358815.npy +02691156-eb2fbd46563e23635fc197bbabcd5bd.npy +02880940-12ddb18397a816c8948bef6886fb4ac.npy +04379243-e458913e25ca7053c1eb59469984d29b.npy +03001627-352bfa764478b1602bc694a93134e562.npy +04256520-b3346d1b7ced3daf1b2fbf268ed76a.npy +02818832-9dd1b8e40151bee5d2e83a37b2825e1.npy +02691156-a361d82b2c510ca5208842e3d616cb23.npy +03001627-d9061907b7b411dbe3db80a3cacc6e3.npy +03046257-3477c3900a9b1124738e43095496b061.npy +03001627-d7d709cd13cdca931afedc87fe387fe.npy +04460130-f14b153ab99da1bb73a921481ee71edc.npy +03691459-c20a8c3b7a06cd323a5b5efb52c46c0d.npy +03001627-9bb6d3d76d4f5ba94b3c42e318f3affc.npy +02992529-dd8b9ca9abc834feb5784fac792d6797.npy +04379243-1855a4b70958b3354b8710a3469971b1.npy +02958343-ec11fb287c9a68475de701ebc922ac2c.npy +04090263-92164d8660dbb9d278fc07d6c8069b8c.npy +04379243-19140f9ff7eebc13470412e9b69c8933.npy +04090263-ee7d9264ce8c77d79d9900c00629c24.npy +02808440-487665836aea026ccb2f32ac395fe2b.npy +02992529-87f8a738b3f0ae0194feb18ebe41aa84.npy +03636649-f5a48805f020d3e3967cdbf1c849239.npy +02828884-b4a8d71b840fa5f7b90be68f49e6aacf.npy +02871439-dca2cd661bece47bd810b14a81e12eca.npy +03325088-d35cada73c24af13321831d2245cf06.npy +02871439-dc9af91c3831983597e6cb8e9bd5d9e5.npy +02691156-97bd6259fd4dd69a90baeef8ba5b93e5.npy +02691156-642b46912529c6e57f1f82f6fc8747b8.npy +02828884-92b9ca91ff514bc90658f68885fd5d0.npy +04379243-44d70581b7c1468e1771ee930e861b13.npy +04379243-5b74412eba257e5182b796aa5845e185.npy +02691156-1f96a33a3a461544ca8607f540cc62ba.npy +04401088-4ce4f7fcf5f0c57a3caebb882f007959.npy +02933112-426f7850e60a5447616fb9ab42452112.npy +04530566-4a5ad5b71ce08abc687e743787d2aa6b.npy +04379243-1f7143556f4d75522d1adc013ed654e9.npy +04530566-5c46f6ce5efa21175060c1b57f88c056.npy +02958343-996c99bc344453ec6436916a86a90ed7.npy +03928116-afaf8f844c5b0ec37f96386fffd17d87.npy +02828884-117259de2f72887bad5067eac75a07f7.npy +02924116-ddc770ef4e0c0681c7f2b15673ec88ef.npy +04256520-62bc75a69029614877bb84100a5c6b59.npy +03636649-51fd15743cd0568219179d4701451afa.npy +02958343-712826b933a6818c7e003129afd0cbfe.npy +03211117-cf16012ae10b993bd15e5f70c1308761.npy +02691156-62ebb16b6b4ffd74df8fc3a07f996293.npy +03467517-ca9bba09dcae4b487693a84bff425e3.npy +03001627-91de3157ea61d943f27383fc5a5a711c.npy +03046257-db1ae97ebd6440613ca265f557f5dc3e.npy +02933112-789ee42d2fc0c5e088c59e12e565eb6c.npy +02992529-b1085da37756ddd1d3f1ccf368ff60f9.npy +04379243-4ae4635c7c69ea908d0eb3d070197e49.npy +04379243-a369da8e8e47d0f3f51f77a6d7299806.npy +02691156-52c9b1a9f8d3cbcb9a6e43b878d5b335.npy +02876657-26a8d94392d86aa0940806ade53ef2f.npy +04530566-1d8adfa96dca83849143982c80da1e75.npy +02691156-5e0331eab3f051988f6810e1a2b6aa04.npy +02808440-7ab615debab4fff9afc85023f866b252.npy +03001627-fd43278c60023763d4da89766e80607a.npy +04379243-ff26f7003826d1a2d810b14a81e12eca.npy +02924116-28e730a4db0602e3f446f92b52bbd82a.npy +02933112-defde3dac0ce562361c0d25e41396e8c.npy +02691156-69121d9daf6d569fb96212c8f6cd06e.npy +02828884-c4c9828b5c0e5db1ad5067eac75a07f7.npy +04379243-cc6fbdc6f2aa5ea3d889130b88839a0c.npy +03948459-cc014e78b5cd9e7ed957eaf7f4edb205.npy +03046257-45bb09eac47597ad6fe2eb61cd6e74e5.npy +03691459-d5e77992b28da2729c90f715a36a51dd.npy +03761084-617358ef5ce2639ff5b1c85b3db5d1ce.npy +03761084-91aa6504b3900385df3a1b0d597ce76e.npy +04379243-22ea80a1c8798eb22d19175e7d19b7cb.npy +02924116-3714ce121ae95608a971f258593ad6f4.npy +02958343-12097984d9c51437b84d944e8a1952a5.npy +03691459-84a87ff36612b3e53ef7ad0f5cedb0e3.npy +03337140-b8dbf1725cd55f7492d9da2668ec34c.npy +03001627-98ee09de954fdab1843ead12644a79bb.npy +04468005-a10330472393343e44399be51ebd0ad9.npy +03325088-4352119300b754d4e3f7a74e12a274ef.npy +02876657-ab51424e92acace2a1c3f37422b63004.npy +02992529-b87251d1d4f4b7ab2c216c5e0f221195.npy +04379243-949143f5e3b772a7986b72a93898270f.npy +04468005-773aeb7f76f9a0c4dc14ba0818ee5cec.npy +03691459-a4a0efdf9359987515f30bbd054cf549.npy +04468005-1fff38d54059eb1465547fd38c0cec46.npy +03467517-900c3823f47a8ad1d57700c05b1862d8.npy +03636649-aa381aff183b1427b7d9d23574a480ae.npy +03001627-233009d4f30fb416dbbc9440457e303e.npy +03636649-bd1cbcb990375022b45fed2806c331ab.npy +03642806-11494281ca09a63d3b54554be306bc70.npy +04256520-33f862846366476fc79619984c97c1ff.npy +04256520-305d64b9fec0015b62a510b8f97c658e.npy +04401088-610a9f79a2f2faacc43c9f60fcc79b4c.npy +04090263-2cb0634dfd39f71623c02c1a690f1e7.npy +04379243-970e70ae46244887c35d3c5d3b1fcf7.npy +03593526-3f7d866f4e28e8014b3c42e318f3affc.npy +04379243-52257815b77da840f7628281ecb18112.npy +04379243-95d3519b036c862d4e3155c362b85bd5.npy +03624134-75eabcbd45e92882a87957ef7e9f3d70.npy +02691156-9321ab235b82ca268c9bdb0f364cdad.npy +02808440-e65dc1c9c07f7eaeb362845c6edb57fc.npy +02924116-4972a57b656446979a426d999467f4a5.npy +03636649-261cc5f20787f50cdbb57594c19a59cf.npy +04379243-70bfb9d08e50970093fcbf4338a54def.npy +02954340-a4f94067b0ec9608e762cf5917cef4ef.npy +02946921-ac0eafed7aa1719b297d1fadd26a7035.npy +03624134-ee0b4054d8b40ba5812bade9b93f0eaa.npy +03001627-bf39672eec1e343284c6c80813d54fe5.npy +03046257-b602321e87ba6ffedce1f8ab000da922.npy +04379243-f99f09473fa068dfc834d9ecc7d5f465.npy +03790512-27733dbe070efcd8c9a9842c993649ff.npy +03790512-46afe9d5d8a45a17a26d3c6c2e980dd5.npy +03636649-a11dd450220af960ca70272754aeb3c9.npy +02992529-1b43d9193794748e31811399a4ff3aa0.npy +02933112-8a758b29a751764d14038d588fd1342f.npy +03691459-1eb6ae90ea03673ee792f9d89b97c271.npy +02808440-55eca9bc125d32fd54d7082b34825ef0.npy +02958343-7376511fb191429eff1370452e3a0154.npy +03636649-dbe15772a731fff01de2a416d49fc18b.npy +03797390-43f94ba24d2f075c4d32a65fb7bf4ebc.npy +03593526-b145d989080a57afe0b42601a8b58d3c.npy +02808440-911847b0eff48ba087a301d05ef6a538.npy +04379243-dc3fba5ae5e86e62416e6e65da17ce54.npy +03636649-c906a9c7ae536a0c7fb7f79251dd7727.npy +02958343-a26b62fa78e9d6e016abce8cb03e7794.npy +03001627-8b22c3e3be1f8fd8b645b903fc5f4135.npy +02691156-fd9f1cdaa381599bca8607f540cc62ba.npy +03001627-b405fa036403fbdb307776da88d1350f.npy +03001627-3aad9ca0d7fa80d76beba0439e85fb62.npy +04379243-155af42283f8ccb9b3664229461d7332.npy +04468005-f98a21d6b11f26935febed8de0838d7.npy +02871439-fedd668769a5916a30aad3a2f98e3b63.npy +02958343-c8fb314a1866d1d2428df271ebc70bc0.npy +04379243-c37632eafbf41b9c1fb41007d56c0ca1.npy +02933112-dca4c8bdab8bdfe739e1d6694e046e01.npy +03001627-66f18d05d960ffe0bcd12732b5a4b789.npy +02992529-29f27d4472a17e723fd445ae159c2cb2.npy +02828884-23325f47d2a812351165bc0a3b02b27f.npy +02958343-26cc3a9cc0c28174ae30cad08127b470.npy +04379243-c6e3f651d2acdb0a746f36c9587bfc04.npy +03928116-7324583e739a28075931320aab0d7485.npy +02933112-37e5fcf70007bc26788f926f4d51e733.npy +02828884-23d1c6e2e35cb252bb85b5a298d72ac7.npy +02828884-e4d1d4714d5dff9b79fb1978bf47fafc.npy +03642806-26ad81059039dfcca3e30e62a8e6f77f.npy +03001627-3e973b624578fc89b76e29c9c43bc7aa.npy +03001627-195c379defdff8b81dff5c2e57ad46e.npy +03467517-3634c40841a76b348c91fa35e72c6c9f.npy +03001627-11ff2e9f9b0993b7f51f77a6d7299806.npy +04256520-f50d32a6083c8f146dab7044457400e6.npy +03624134-a05ea45d396c86784e52b614e584a543.npy +02691156-2ab4a5c3ca32ba9a4d4cb1c2a5e48b7a.npy +04256520-7517e2a0c921b89d593ebeeedbff73b.npy +04379243-e58e958428584b2b79972b30518c97e2.npy +03046257-10312d9d07db5d9a4159aeb47682f2cb.npy +04256520-e491dc151c8e801186abe5555a3b447d.npy +02958343-72d4deb3b797c03dd4f6529a209c5dc0.npy +04090263-6c56be203155b9d2c3d04f57fc87fcb0.npy +04256520-a28bfe80037449cf5eea3e3d89293379.npy +04460130-f982e86909ed9e7f2c8891dbc3e6988a.npy +02691156-6db64533897238af392d539dc5a47ed5.npy +02992529-81f527c62191bcd465c46de8aef92580.npy +03207941-cc244af17335b1af52f4523ded466b8c.npy +03513137-791c70769828cda852bc033e87de1006.npy +03001627-a55140d6d7b1148519fb4103277a6b93.npy +03991062-3e4c784f765dce24766224c8ed44ac6f.npy +02828884-7d79d398f56c13eb12185770c6bc35e3.npy +04090263-8a40c59eaf7bc85c322a3e035e31af50.npy +04379243-e14e867c0cfbf1f42cef66bb37b0cc33.npy +04530566-b7c24dca7db1d2985c00e52236fed2eb.npy +02773838-c4cb5bcb1a9399ae504721639e19f609.npy +04379243-ef5788dd59881f2dbeea80ff21252e37.npy +04090263-4e292f614c51676c6118b98f3fdee6c0.npy +03046257-6f712bf7b828c9e920fb6b84fca9d3c3.npy +03001627-4cfc78be98de1d2bd607f0b8430fb29a.npy +02691156-a3bcd8767d2827626f5b49394e7f4cdb.npy +02828884-38dff7c9994cda58f4273dc8988e4c4.npy +02946921-b45716cd72f1e9172fbee880b9f634b4.npy +04379243-1cba04d4679da07ef51f77a6d7299806.npy +04401088-ed71d2ed652b911e7f521a3dcd28e9d2.npy +04379243-b9e3e65aa754f3b49ccce4c6d5bb195f.npy +02691156-b7c11baa48456c23149f1a143758cddb.npy +04530566-f15c255128f2c9c6b7963b720a430c5d.npy +03691459-f904f64f961e9cddcd3e44ab53ae1e92.npy +02958343-3587008282540864673ddeabdcc8c6e.npy +03991062-5563324c9902f243a2c59a4d90e63212.npy +04379243-495db04c204196ec47c638c0eee4a2b3.npy +02933112-8fe70b11448dfeef2369c46027bce7af.npy +02958343-2a0a53917dde654c3196f09f71403d35.npy +04090263-83e29d672713f0da270e90bcf29dbfc9.npy +03211117-daae6d7f0e8d7e208a8be3c02effecce.npy +03325088-d8844694dff0986d30fff73f53312a3f.npy +04401088-427d255534038d47e5eda863cef11226.npy +03691459-e5c2ab51068e9f8b58ad8ba2f750cf1d.npy +02808440-8c989333427537ce44221bef0fa3c36b.npy +04379243-ba6992957c2e6e6df67676f416157590.npy +04379243-e65cbeed1eb687d514038d588fd1342f.npy +03085013-13c3acba1f43836a3123e2af297efed8.npy +03001627-eda8edcd64072b0db784faac204319d9.npy +03001627-c7739fa5e32a7218a5f9d52c12457194.npy +02871439-80386678689904d16421c9121bcb0cd.npy +04256520-c4ebd90eb8496903f4ed05effa0aca88.npy +04256520-e233f53558015ba4f05a611b5fe35f32.npy +03636649-2059087b746a931e6bc1922eaa6b6752.npy +04379243-c1df09878a7a4a81190e285a2cbc9c.npy +04379243-4cd0c4c75f124cc117b431cae0dd70ed.npy +04379243-569b338df880d560a71c812e027f94d9.npy +03001627-45127e6f4fb5cf568173979dc89222c7.npy +04379243-7e6fea75f410181855f9913e822d5318.npy +02808440-79ace304188699fd5fe7cbb6d6b5e421.npy +03636649-81bbe86e17196c2fd0db1e44373ee2d4.npy +04379243-2bafe9aa12aa1d3bfebad4f49b26ec52.npy +03691459-b0a331fd0d599fe8e69f17d076308b42.npy +02933112-6098dfbdd0fc78a321e96d7b34bacdcf.npy +02958343-d2efbf5a3b7ddbf94c0aa7c1668459cf.npy +03790512-ea01df8a5deb6b278e5369269261b398.npy +04530566-a2d4f32a82902118aaac2db0a60f403c.npy +02992529-c43c9123ed893de5a0eb5a85db887292.npy +04379243-10733a711fe254965d7786e1df78254f.npy +02933112-d17b46d9ad9378209c68640456c0e.npy +03046257-a545e60aa1f2e13bcc84fc85b2c06435.npy +03991062-61e5f9b2abfe02ac93271d2223fe04be.npy +03001627-edba8e42a3996f7cb1a9ec000a076431.npy +03211117-aaded29a2283bb4c4920a74a78f531dc.npy +03761084-a8574cd983b761248a5e8294bc48dc55.npy +03691459-a9d7e7bb4d72c52f1574d21c0c95092f.npy +02924116-f5636ed22f1a3daa193d7855ecfc1bd3.npy +02691156-9441549e323552f2f001dddaf44c449b.npy +04530566-1660bbd9c43284d98bfe41fc81907f54.npy +04379243-1fa211118fcf90d858df8eeaf3dad1c.npy +03691459-2d408222b334fec71b45df3fb820c9cc.npy +04256520-64f47c058d0a2da68bc6f322a9608b07.npy +02691156-541c19fe42806c4d26360e1e29a956c7.npy +04379243-d19b4bde0766723c9b3bb0ef2a08be04.npy +02691156-3109b3740ac1a056df55310efbf4c0e4.npy +03001627-59529dfd60b211a45277f07057e8ce87.npy +04379243-864499eb14b077b4e5aa1f8c960ae63.npy +02958343-2894449c2f1992bc3a65ca10b9ee2981.npy +04256520-1d86fbf39c3d2954222713fd18dc031.npy +02933112-a38f20793fbbd3d3ff03fd9a67a9cdfc.npy +02691156-959f28c6724979ef9a6e43b878d5b335.npy +03691459-15c6b5792b19af3fe99c48db5f195989.npy +03325088-356f8deac817eab7a0a07918e742ff41.npy +02691156-93c38745ac281f6b8aeaf14658928f6.npy +02691156-efc7d4fb87937413dc13452e3008005b.npy +04379243-e1c190513b084f4c4804b5831b58a04d.npy +03046257-cb6ee0f8931923cd4f262ad0a8c89c0.npy +03046257-94d692071e8404ebc0aaedf10d776af7.npy +02992529-c7407877d3325f7f391258277c122351.npy +04330267-72a0fcf0b41e788935914415372cbccb.npy +04530566-635bed8b6b180fa3e65273dbd0c0f949.npy +04379243-584d3ed9669b1fcfbb7ac4d22a68ec08.npy +04530566-7ba8d5a8edb7ab991f377e6c4dfe0096.npy +04379243-804a9b89e0279aff1ed1d681aa8388f6.npy +04256520-525c959a4a09aea164def4b29bf333db.npy +03211117-f124d85da3ef5ee5fb51920a0179fa71.npy +04379243-8129d4c51abc3356bababe11fcea8796.npy +02933112-1a146144063c778cd0d447e37edd880d.npy +02828884-38e8a36cdd879fd2d6f2f8f659863647.npy +03001627-4003f4046a3a5ed9297936c81e7f6629.npy +04379243-731b5127b72cbbd9b9a17f7cc0030785.npy +04379243-d6580bbf1220d39ede270fc3c23d78b.npy +04379243-6375351785793a96412608755666abef.npy +04379243-c8062ed073ce04058cbb8bac2032149c.npy +02691156-1943ee06ecb139819330265a9fff38de.npy +02933112-24da7fd5e33513814da5feafe6f1c8fc.npy +04379243-d2beb9795e88d3dadcfd6ca2b952d624.npy +03211117-f3d4cb310a6106f5e66202687a227eab.npy +04225987-393ca71bd734f3071082f2ea630bf69e.npy +03691459-35982cb980f6916c2633ff66beb9cf31.npy +02808440-c04531f473baa75def0b2fc3511b6fbd.npy +04554684-c1d4c8c438c4bfb346cde67a6a1ea328.npy +04379243-8dd1ca36888301919fb4103277a6b93.npy +04256520-93b4258c377ade381deb48513aeadf93.npy +02933112-9705e66769fe130add7092ed47061a36.npy +04256520-ae2c9a06d9f7076532388c13cc4a0ba3.npy +04379243-4b8e0b22664904c1c8b8dbae22c1c086.npy +03948459-6c805c53ada82e954e77d7996e16376.npy +03261776-3a6dd2e7dbcdc49d7eb37dc0a59a307f.npy +03001627-da7b1352978b35c1490ad276cd2af3a4.npy +03636649-e99793b871d27333d42b9650f19dd425.npy +04554684-a6f649b55bb9fdfa7a1aca5b147accc5.npy +03513137-92c11ff47a2d1a4f673a614c45f3afe4.npy +04379243-186f6c911a4255bc1b17743c18fb63dc.npy +03467517-4b006452e6cf43d53ac61a2f8346a8f.npy +04379243-688a2fcca4d94685a11f6bacf5c7662d.npy +04379243-b4c54426262f142fc16cddb2140115a.npy +04256520-530fc7ae6a1d6a40e830a5cca365799a.npy +03001627-5a7ad45fa4672684f63bf7d908efc575.npy +04379243-b86657d541c2e26a4197bf8bf6f07b46.npy +02691156-a153353168cd47869a6e43b878d5b335.npy +03001627-671f35148ef1cb2fc0806ee26b689c99.npy +04530566-99a27d7e2553c629b0828c4cf6b95ee9.npy +04401088-980cefc1df9b24458b13932a0c28e98b.npy +03046257-21fecb28d1c8ee8c6463df620b7b4cbc.npy +02958343-c44111ca55c697117fbfaeeb4819ffd2.npy +03001627-d892a0fddeb963bdff4bb1e34fb13b70.npy +03691459-54681e2434fdc9ccd747b49524a1246e.npy +03001627-a469bcecc0a03db7d40dff3e049589e9.npy +03001627-75f4282ca1df236ebf08050442fade6c.npy +02691156-28448469f5bce47b4ddd8a480b571bd7.npy +03001627-32303484de7f1998f8d44451ec1ac05.npy +03467517-414302b6fb93064d6b072a28b9bce334.npy +04530566-c9bb36ffd5ccf7584cbfeb2946087e59.npy +04530566-269ada03c39d200498a4434c6f79eefc.npy +03001627-4ed0eb4f4e7ea0952efff55e0bb2e42d.npy +02933112-1a1b62a38b2584874c62bee40dcdc539.npy +02691156-b2b1c1d5c757af8a7209009cfb89d4bd.npy +03001627-948f1555282e27da190c615a2115d2f7.npy +02828884-a557114149ae934819420b7669e7265.npy +04379243-e9a68d0ad5177d24ba5342d638d0c267.npy +02828884-c50e2c7a82ab0362c69be1660283647b.npy +03991062-f2599921c8e0a76ea4e7499e379fa4fc.npy +03211117-ab68830951b9a5a02ba94c8f6eceab22.npy +03636649-c8ba5b8ad05d553acd017fc6c40a6bea.npy +03513137-cdbefa5bb13ada4a52fafb0cab311e6a.npy +02958343-d4251f9cf7f1e0a7cac1226cb3e860ca.npy +02691156-d0e517321cdcd165939e75b12f2e5480.npy +02958343-382496958e58e9a0658e57fd275f6bed.npy +04256520-c63d2ed731595cdd8cbb8bac2032149c.npy +04460130-5495ec547c13d8f2de1c31612629d3dc.npy +02933112-3b3a1bfd87c87a184b499a9d711de5a7.npy +02808440-53b67010fcd56a163321831d2245cf06.npy +03790512-ef4bc4af2b7ebf42306928a0ea1eb003.npy +02958343-7e5b55d43322de49295eb8d2a941a3e1.npy +02818832-edf13191dacf07af42d7295fb0533ac0.npy +03928116-68472f6ccc7296ab86e51e6823d1498b.npy +02924116-9a5ffdbb89d171e5b5b0c584eaac6c4c.npy +03211117-1c47397db49047b9d35d1c787a8f626e.npy +02691156-b88fef1090e6d151b3f2b01de37c0b29.npy +04379243-401fe961ec7b0cb5dcfcef693e7ec696.npy +03636649-6b130799a53c2917cea97147b08cd8b.npy +03001627-b4827a7b42d68aadbeab82a04eef83b6.npy +04379243-e75f2a369eca1346b157bfb9ccdf274b.npy +03636649-a90fa89d0cb8ec989cd3f9e8648111d1.npy +04379243-d6d29b0c347f2ce23002761e7a3ba3bd.npy +02691156-8c1d67bf88f34ac55823df672991ed66.npy +04379243-adc027df0d7ee0c9ccce4c6d5bb195f.npy +03001627-e76aad9a92f83d70bda72093f9b5aa73.npy +04090263-487ef6821e82c9548839ade0cf1fb995.npy +03211117-e6bedde4571506491fde762a4c6848dd.npy +04256520-b2ea31ad8b8b3e19994626ba7fe8ddf7.npy +02747177-ec1c1aa7003cf68d49e6f7df978f3373.npy +02933112-992e569c61916848e26ab56647fa5b85.npy +02691156-6ca40d19374c9d735c5f85af1b625f04.npy +02933112-4b67001c30b3a68be4e346ee2650d150.npy +03593526-1a7ba1f4c892e2da30711cdbdbc73924.npy +02992529-be254a4f3097143fe0e25464307430b.npy +02933112-687a33b0fd4a906dc2185cc0ca1b306b.npy +02828884-875b1307c76566c8d0d4e85a15f02eb4.npy +03001627-11dba3a8d7b7210f5ff61a3a2a0e2484.npy +03691459-359d760f7d8fc091fdd1073b17e9e51e.npy +03211117-dfe2e7c66b4063f79a6b496c6e9f4c2.npy +03001627-533650991ca60fbfdbca69f936e89647.npy +04090263-d9180361e225bb418bfbe54b5d01550.npy +03337140-ab029c1aeeffa5a4794a354d0ff88088.npy +04379243-a358b5f98f632adcd1fbf79741fcd6d6.npy +03001627-bc46b7460e4476d351e0e6ea07e9e2e4.npy +04256520-615d9c2b37a3616ace8417aef1b7a422.npy +02958343-3b800720bd8d41657810f4dc287137e0.npy +04256520-f756d6d576a3e238f797b840852566c8.npy +04379243-76595f5c7689a4559ccce4c6d5bb195f.npy +02828884-162550a8510464d97881b8f7aa99120f.npy +03797390-57f73714cbc425e44ae022a8f6e258a7.npy +04256520-35eeee5f998f24e8a505985405786f0.npy +04379243-b41cc94ebd03eeb2593ebeeedbff73b.npy +04090263-2d49519d725de02396e5f13299458076.npy +03691459-94abce2eb2c9567da7729f9969cb563e.npy +04330267-3ed7ea7c49a32247c4c2cb2195d7bfe5.npy +03001627-c65f9af5b5a6cbfe5936c7265c890fef.npy +03001627-4c8cb8be444fd405bed1bd9593e318c.npy +02958343-3c02c18d64d3f13b8c988ea512260358.npy +02958343-b5b6b09711cbee6daa44bfa127abe4bb.npy +04256520-a10a157254f74b0835836c728d324152.npy +04460130-d143fcdf4e9810f13488053ccea5d42b.npy +03001627-ea7337dbfced9674d2844b25962c000d.npy +03636649-f228f6cd86162beb659dda512294c744.npy +02933112-a71fa3fbcd132c39cf44224546cb0306.npy +03085013-3f34b7f6ef1fd8e7891aaffa5a7c7cad.npy +03046257-e743856943ce4fa49a9248bc70f7492.npy +02876657-b362273df5596c7e7f095f36ba0999f4.npy +04256520-2a9da31660f0c0b73505e48e4fe20c28.npy +03001627-a1f46215051dec0871a782a4379556c7.npy +04379243-fa010af968a0e1635ba41eea807f5d3c.npy +04379243-4c15f432da3400ad2404817055fb55cc.npy +04379243-697e5edceaffe68e738e43095496b061.npy +02958343-12410830e8a5067c69576518bd9bfe48.npy +02818832-806145e92798a35f15dd7d7985e749c1.npy +04256520-f5ee22abc76f7491cc9651014a82e2b9.npy +04401088-8ec44fb44e4a3224795284068bb430b2.npy +03001627-fc3d4268406b396e71a782a4379556c7.npy +02691156-adb3ea03d7b954255e9e2656aff7dd5b.npy +02958343-a34260b8cdb1ec95b63de680261b9e1b.npy +03001627-572da8680677fe8937b2bb75885cfc44.npy +03790512-e033e7dc322bf8a133735c05ad7be6dd.npy +04401088-8f3250e029d561341b92a1339af2f7ce.npy +03467517-4899c1d7a3af5cc737058b1eaa7b4b1.npy +04256520-8a0ee11e68d4565d72e26fa14efa9297.npy +04256520-d0b06478f56a1306e8f8c11a24c52ebb.npy +03046257-448a81d7afd06b3d2a548038c4031d1d.npy +02691156-fabe8fdc617e3aca2bd098b9203af.npy +03325088-cbac6ded2160f1beb362845c6edb57fc.npy +03001627-5128a385e9c90443febad4f49b26ec52.npy +04379243-3439020f6fd015c02d51eba7952634c5.npy +04379243-4a3839f687aad9122d98de61f824e5b2.npy +04379243-3459eec8eb56fa312bac236fe109e385.npy +04468005-56687a029d3f46dc52470de2774d6099.npy +04256520-c6fbb991bf184331847d00e95a10eacc.npy +03467517-14f88fcb1e613fc4eb792814ca6b5bcc.npy +04401088-7ea27ed05044031a6fe19ebe291582.npy +02691156-65960aceecc9d6f88388594197e843d8.npy +02691156-bf5d6902e75fd8812296d88107d065f6.npy +02828884-e55f19a6d411966c6bf2e668f01c16f7.npy +02691156-b4a420a55d3db8aca89fa467f217f46.npy +04090263-117be2f79d591136ed9c5b25fef60d04.npy +04379243-8bfacae2de0067cfbfd72d7396bc040a.npy +03046257-19162323595891b955f46d55537192b6.npy +04468005-7d9cb763f622e2aa90f5fac3ff9f322.npy +04530566-e36cda06eed31d11d816402a0e81d922.npy +04379243-d3f4d13ab71856953f5dcc11a7c57129.npy +03467517-4e73161a7ec1b50e4616d9b0c69933ac.npy +04256520-a1b02adc96a97e176eb9b08c8a74d159.npy +04379243-366902c0009575664f856154cf68897d.npy +02933112-c5aa72cca5cafd3f842982c980a38094.npy +03001627-9e54053a1b16299153c5215ed09cc4b0.npy +04379243-ca2070bf7d1aa372cb922bcc33df0268.npy +03636649-cec61b6fb378925e498725b9a1405ebb.npy +04401088-c71acd79ec4cf1cdd11ec2c68afc26e4.npy +02691156-22d9a4a9290e8f09112a90660b187a10.npy +03001627-490384776503eea9e2dee6f9fbe318ea.npy +02958343-32189802f3d95fa46c56ebce3aa49447.npy +03001627-5af850643d64c2621b17743c18fb63dc.npy +03001627-7e9448da23c3387754e9211d1e7afbcf.npy +03691459-9916643790d32d0dc4529c39a8e542cb.npy +02828884-ae635fcb688b88c757411f16004b6df.npy +02992529-76781e8b967f98b5a0eb5a85db887292.npy +03636649-5a79339279fb7173fbdebca9f6788597.npy +02958343-6d01a15517fcec07a546b0c1c6a4821.npy +02828884-691ca19f8a2324652056b4bd5d870b47.npy +02828884-143032619a82710b2056b4bd5d870b47.npy +03001627-d66de4cc1dc6cf5e8f8c11a24c52ebb.npy +03624134-ef0dd0f2af9869325867e536d32c89f6.npy +03001627-2e9e0711c4f8e6c6f51f77a6d7299806.npy +03001627-b6ff694af011b45f4f52551bb6d0494.npy +02871439-70bbaab945da20bbcbe8623e8d104185.npy +04379243-3f036c403ab34bdac3bd24f986301745.npy +03001627-5229209bf66b6657b11ae648ea92233.npy +03636649-e8e4f730f9bb892a85245de9410e292e.npy +02691156-97a6bb84720f250122df1994a149e700.npy +04379243-d83cfb75c24a8a89eb0ce5843fe6b264.npy +03001627-672e20cc6ffa29d41c6aa36e5af1449.npy +03636649-e685cd3f7a980812e94026ea66f4d4bb.npy +03211117-8449704b3c3c290ec5243a0ab191990d.npy +02880940-7d7bdea515818eb844638317e9e4ff18.npy +03001627-e63546037077f0847dee16617fd6925f.npy +02691156-123ba1ebe2ee533ef0c45eff2a917cc9.npy +04090263-19d5298e49eb6e5a30b14dd156373f09.npy +03207941-b5ca6cded4b23f2455b2aedb5bd199c6.npy +04379243-7c793900baa4ca16371fff21f277e702.npy +02808440-56defbfbfd46b4533321831d2245cf06.npy +03211117-e52a477d9b54dbd5672efd73ea104790.npy +03790512-cbf639979de64e14739936b7765e22ae.npy +03636649-30464d7e164a40aa2bc52a80abcabb17.npy +02958343-b811c3c5ac8eeeb2f63ee8a34069b7c5.npy +04379243-d26eacf8d87a522647839bae1bc65257.npy +03001627-8191bad981637a71b356ab8b24c147.npy +02691156-7182efccab0d3553c27f2d9f006d69eb.npy +04530566-863fd298e6ea46a5614edc3c9b2489f4.npy +04379243-841f48a81cf3f066ac00fd1150223027.npy +04379243-7730689fb323f88555f46d55537192b6.npy +03001627-a13a7a1c82bafa56188f1f634a0f116e.npy +03636649-3cca977e9e6ae9e181a172d69c52a28a.npy +03211117-cc7bac4f85cbd7d68a04632e06812aec.npy +04379243-312a5be8c4449afa456cbf78e1e89022.npy +04379243-6240ad3b8776b5e88e4f659f0755a47a.npy +02828884-25876fee744f8f8dd45380eb90f62b3f.npy +02942699-9db4b2c19c858a36eb34db531a289b8e.npy +04379243-c75ad4217e58ef871833a34736708547.npy +03211117-a33702c33c345df57dee7bb3061fcbd3.npy +02691156-525446bc8f55e629151f2df200a24ac.npy +03001627-d02fc4ae6bc4278b68c4c9cb55925fb2.npy +02808440-2004425c4a997e33a7287f0d359a1a39.npy +03636649-3f22e6719decb1bb3a9ec79b9c5da99b.npy +04379243-5f188ef6d852a85c8d0180586cee2c13.npy +03636649-e655d36c391a57c156ca893ec1044405.npy +04256520-9e0071fda87df6892e73d126bf16e692.npy +03636649-7e61de32ddbb59c89450c010f9b3ff4a.npy +03593526-8b1781610ff164c7ba5342d638d0c267.npy +03046257-aec546edcda7c5abe579ef1e3d185e3c.npy +03001627-90f8e6e1694039c0142c8d1dd30ee99a.npy +03761084-30e4d5f28706a95abf37a318b55c6a3c.npy +04401088-6fe550e061e70579a05d3424fd8d541a.npy +02958343-2df225b8df2633c231141a7d4d06dc13.npy +03593526-5cb41c58e0bb0b44deceaec2593e1649.npy +04225987-980af78085bffb43d790b0d3f0ce898d.npy +02958343-4c3fe644e76bb94fb3cf5236f651a8e6.npy +04530566-bb601d5ded9bdc00746ffcbc44510229.npy +03636649-e529fc190753cc9df647dc544bb0ab61.npy +04090263-5e7afb318ff701583018d2d3c13a7462.npy +03001627-adcc6534d6db1ff9dff990aa66c50fe0.npy +03001627-fcfb3a50acf5e83ecc0484ea4f50062.npy +02958343-943be90f18274083becf71e2e014ff6f.npy +04468005-e52819162400a82a54189e414c6ba9c4.npy +03636649-154c35bf29fa227df51f77a6d7299806.npy +02691156-a0d63ee7fd87f93619ba010ddb4974fe.npy +04379243-6449378cb78f081b2369c46027bce7af.npy +03991062-e4b68a848bb9677e34c8ebd75c7d8f3.npy +03001627-28a0b2a5afc96922ba63bc389be1ed5a.npy +04256520-37cbc18323826bfb19fb4103277a6b93.npy +03211117-eaea42ae1a406492df8cce42a274b981.npy +02691156-89175682a6cecf548966fecb9138dba7.npy +04256520-54a08dff9191dff13462c3e6678345f.npy +03325088-3b0a1265844b0a54e7ec4274d0a48ec.npy +02876657-77be452b59bebfd3940806ade53ef2f.npy +04090263-3e4cc718eb6aa9e4559750dd149043e5.npy +04379243-905edb931ab4be1e27356ce25a15eb6d.npy +03691459-9f7eb24e82020dcf40df330a2f73b17c.npy +04379243-388c9f343896272813126e7abd481c60.npy +03001627-3c83d6ad882270287ad11050da24bb12.npy +02691156-910bd9a7d9ac4738d5c4dc314e25b351.npy +03691459-73a695a6323e1d38eb5f0682bcf1d404.npy +04090263-d1be6a2cebae5ed7609e2d916fa0da27.npy +02958343-2ccdd6d8db5a366f93680c5a9a367b4a.npy +02691156-c76f2214e133a81adbafc7250d0654e.npy +04379243-97af27d6dd13962fae9714d138f9ea9d.npy +03928116-899c7d740d89ce5740332412c5d013fb.npy +03046257-ff3923d3ee5855ae13b6a765d5fd3ff9.npy +04401088-5f600251394fabe6808ca88aece2e3dc.npy +02958343-d164a37bffeb5a83f04c8b6c3407554.npy +04379243-5c1d815561a7725496c29359f424ce25.npy +02933112-7b97739140eebfefaf8acdb77a4cc720.npy +03513137-7c3bf8abf7b2b41e172c0c1bc4c72a8c.npy +03691459-8d88dafbfd4200c772e8dfb640f12f2b.npy +02818832-a207c52399b289be9657063f91d78d19.npy +04379243-58fc0d5a44ebbf194f6edfbf4641cd2a.npy +04256520-8f23005418fee71819fb4103277a6b93.npy +02828884-9027bc9728f006bb40f0ac0fb9a650d.npy +02818832-290b083404ea24c87ff6ace05b36a5.npy +03642806-5a13f7551c20eb29f3ebfe51dc60263e.npy +03624134-891b987aff4eef786600258587aa4835.npy +02691156-56c827003a2fdb16853d2b3113ecdbb6.npy +02958343-91c12a0bdf98f5d220f29d4da2b76f7a.npy +02818832-a0078daa6d0328026ef2f8c390381ab2.npy +03001627-8e55684da4fb8219d3f6d823f04dd65.npy +02691156-b4cc2bdefd4f9ce13f4d6518603e8629.npy +02876657-e4ada697d05ac7acf9907e8bdd53291e.npy +04256520-23c4b23f2e74d6232fee6b7db2f5f826.npy +02992529-8959f06b36d90e6a7c4a9987d1ab61dd.npy +04530566-c3648d0cd141035428cf87eb5ebe5e6.npy +04379243-1952d19986c5f122fcf7c0d4b65182c4.npy +03207941-e7323270ebc99539121859336e292a5d.npy +04530566-7488e965278a8b8524e54dbd7430a489.npy +03046257-7608f3f2d484aadd5887f1f81e7530ec.npy +03001627-a2b55fd7ab49da518a049f37ab48adf9.npy +04225987-24e46e195f4907887a70e5e6aa241c88.npy +02880940-f09d5d7ed64b6585eb6db0b349a2b804.npy +03001627-9884421ce028e9b1d2ad4916ac26e560.npy +04090263-193e079f24ac1ded1153b2cafc57da88.npy +03928116-e99e6a956739d58f62f4bcc4369f8010.npy +02958343-ef2655aecd7d8f2b6fca0ec9a39d7a9.npy +04379243-eafa1680912b4ee3391e4d6c585a697a.npy +02933112-4bd1e17e8bfe8d5622309d9bc2301ff1.npy +04468005-47c0481747741fa247367565b9fdaec5.npy +02691156-6cf2f9112ffae7c3be54b70092ca256.npy +03948459-c5f8a50d7f32abef283f56573a59ff6a.npy +02828884-739d41c59dc387e575f9747ff6fb5e8.npy +03325088-f2c9422c2c427a8f3321831d2245cf06.npy +02828884-bf7342b225f836a9d2b12aa6a0f050b3.npy +03001627-ff143c09dbfb0e8029e513fd785f7886.npy +04379243-299b3728b46d7a4de343d70bc2971644.npy +04379243-ad86ddf54e0db02c5d91cd746759626c.npy +03467517-97aebbc8b63432d3d2f0cc036969ee4f.npy +03001627-69a7ed6a13ef4b2edf6cfab91d65bb91.npy +03001627-452115e132539be4daaaeef365d8f6e5.npy +04379243-683fd587db784b87a71c812e027f94d9.npy +02691156-fac4af109beb0108b4f192eea1889928.npy +02691156-48fed12884533a5fe48f6bbab67fa514.npy +02958343-ed6780486efd79a9fc3898548dce2392.npy +02691156-8c746468d3dcb6d3ff3a35e90542981d.npy +04379243-db20d1cc56356476a58a1de596e6d773.npy +03636649-7bd642ba9f7cb683fcb8d8c6d4df8143.npy +02691156-7f6af37cd64377e1cabcecce1c335df1.npy +04090263-14ae67574004fc83dd0a2071dde26395.npy +03636649-77883e18cc08859ddb1afe6c464e7652.npy +03928116-438f64dd9ff80bfddd5efa4c0e7932e.npy +03001627-9d28a066df22319cca2e16d6cd76503c.npy +04379243-cd2a53371cacfac49a3528690d225ee1.npy +04256520-d377dbbf7b198ad474fedb3ee91ea4c1.npy +04090263-cc353b464c22be528ae80165ba928e0c.npy +04256520-a875e8dc1a39c769440e386b5061b2f6.npy +03001627-e3d23dc47ddd9620c9be65dfbd21428b.npy +04256520-9d436dcfd61622d6199833105dc1a90d.npy +03467517-ae28c848f2655f8bea94ea0f135d0e2f.npy +03001627-7186f1e8dbcb3e8a116162acefe23592.npy +02828884-e1ce45ee8de4436655a9b4fa7594b177.npy +03593526-8661762e0da6a8a29d3d767e1bc88d65.npy +04530566-3897d265d993ee2a1fabf3cbd0fc77bc.npy +03001627-11525a18678f7ce6ae1e1181f20bb9c8.npy +02691156-62d03831457b2fee62347b4731688b0f.npy +02828884-6d08f3c059e674dfcb2a965e75be701c.npy +04379243-7bf5f689da285153583ff8a5fc7c1869.npy +04379243-6b276165b6118e85ad312873b158ac49.npy +02808440-41d90b22f1c6a4a083b345c7947a2916.npy +03691459-f75f60a086094c27e5096e2c6dd4fe11.npy +04379243-d05c4f1b47e37e574b3c42e318f3affc.npy +03001627-9bdb034f30c404edba1028cd22cb8779.npy +04090263-271e58c2650147829a6e43b878d5b335.npy +03624134-11c987c9a34457e48c2fa4fb6bd3e62.npy +04530566-1e3f014e8eba0db7fa575e221973fef.npy +04379243-77d20db9fe05302376e9713f57a5fcb6.npy +03001627-8830f76c748f09ef3e870ba5db422375.npy +03593526-f8f5f60f804f0cb32ca2d100d9fc2f99.npy +03325088-17025bbed6ac4e92f25bf4040d22848a.npy +02992529-558c9b7e854db7da21844676433a0aca.npy +03211117-5bace77f1df591e9241640224e45ebea.npy +03001627-f6810de4042cc5ce57bd4bc6eae9b341.npy +04256520-a8b0e2a953f3ab6a68b3e52c71552a50.npy +03691459-3c71e2ce15ec92e9c8ae2f680beb7e46.npy +03790512-c2d942244bae1557b37378f3c85478b4.npy +03001627-9978e73fef1857bcac6b8e58caf61f95.npy +04379243-49eda1b86917d3d7d0a96520c31993ad.npy +02828884-4cd4797320eae6f90dac09d2827796c.npy +02992529-a860adc078391edc6774046e1fe3165b.npy +04379243-995f33073ca76ab69856fa70a578baeb.npy +03001627-9dc454ec0b5b7b50e45ef4135c266a12.npy +02933112-365b6a92fc2f46294da5feafe6f1c8fc.npy +04401088-bf259988d2e8728c391790b8b8084f0a.npy +04090263-81807680baebc5975516c1e9dd717741.npy +04256520-12c6a146bde9f6f5c42c7f2c2bc04572.npy +04379243-a6947349fdaf27ee9cba29f8b9fba633.npy +02691156-db628662ba1cac04b627754c4259e985.npy +03001627-84d783ab90b79f8036b0f2a1430e993a.npy +04379243-a4d27a18402f6f4511c3daed4b8d9da2.npy +04379243-75b3ffb0c09ce8b5febad4f49b26ec52.npy +03001627-ee8208e26cffa9f8ba208e534614d8c0.npy +03991062-3222a71a73df75a36a808760ea50bdbd.npy +03710193-293698b318418f16635f2989c7524167.npy +04530566-91a124454518abb7f2ad837508eb2db7.npy +03001627-b9a7bbf1e0b08853bed1bd9593e318c.npy +04379243-7aeafb18b724738b9d57383d20e2e6b7.npy +03046257-a6b58e9bf4b74ea461e381b34d499d82.npy +02880940-d162f269bc5fb7da85df81f999944b5d.npy +04379243-109a8d453ce93a6fc21b51dd4113da62.npy +03761084-1f50be38c10cc2201c8302bff3c63802.npy +03691459-2629234a2fa847dd9b106ceb230ede0.npy +02747177-f76b14ffc2fe6c7485eb407ec5a0fadd.npy +03325088-38d17c83d5c891a2c36fb70296e45483.npy +04379243-b1d834cd686cb8b8477f06cc543186ab.npy +03001627-447a5eee395026fa8d09bc92d0fc6d3a.npy +03636649-f842fd7369833b91b7e3a72c32cb38c.npy +03001627-60186a5e4e1aee8daf8fee88d245152b.npy +03001627-a62bf8818c8aec7062a510b8f97c658e.npy +02933112-64af194c4c53040e492d9da2668ec34c.npy +02933112-510fa8653c10b0d1ccd0340812259a39.npy +03001627-606cb23f9a7f23ef51f77a6d7299806.npy +03325088-647209d564ed6d174b47d0a1f007bc8d.npy +04554684-969c60ef5f2c2fe696d5fa1ee6ada8d1.npy +03691459-6aab9afbcdb94edeb59e9758ae7f41a7.npy +03046257-f57ba7abc40fa531e8b2e9c72a02f109.npy +03467517-2e4ec0874ea34a50812ca0ac90db1c07.npy +02958343-a1e3c4be68cfe110d9e74b7f1cf9cf3c.npy +03337140-a369ef0e532948457283e1ee3c77e168.npy +02691156-7b39d993f6934a96b08e958a32ef3184.npy +02747177-5bc989c9ee00622278353166fcf5b850.npy +02958343-4e7d91a6e2300d88a3049d0dcf503cdf.npy +02958343-18244d93dbd2afbebda733a39f84326d.npy +04256520-61711ab3e6fe99ef1c6aa36e5af1449.npy +03642806-da0f6b3a375a7e77e963c7e7c24b8dcd.npy +03642806-22389f9c3c049ce757c29983a611b1c6.npy +03467517-a8a9da30d35cc70bd57700c05b1862d8.npy +04379243-9f035e68630d704b46fb9c38320df24e.npy +03001627-f106bc80265faaabf78fc6de5952fb84.npy +03790512-30f5eec1a7fbb5884fcfb655743e93d8.npy +03691459-16ea8ecabd3f373bdef52d9b75805a83.npy +03211117-32413d2f2103b3a5286e185ca42b30ee.npy +02691156-b10ab8efa0aed59e90baeef8ba5b93e5.npy +04379243-ec34ee731c9dd55758df8eeaf3dad1c.npy +03624134-80f0436251c2108fb6bde4b7e6c6613.npy +04401088-2293983c6f234d94e304974abc9afad9.npy +04090263-ab4fd00b47d9d6f4fb5c1b0f759e2bc1.npy +03001627-26421cc00c639ee55a5324f7626af787.npy +04379243-72cfb60a075369ab7252c133a7e17d94.npy +02958343-7bdcd746432bf123416a3426987b1133.npy +03001627-56902e76cb4f1039c482eb499cc8fbcd.npy +04090263-b27b78d3e1c97180fa9286f039319ff7.npy +02958343-f51555db645f14468bac13e007a6e9.npy +04530566-a0b661c93028d7de798832e32e32aae6.npy +04090263-eae96ddf483e896c805d3d8e378d155e.npy +04256520-a9439ca0eb112e7782287102d4d0c28e.npy +03001627-f1188bef2980d2c985b479b317175b55.npy +03001627-9b9cfaea2a7ba04c461ec9f1803b17a7.npy +04379243-e089dc57993ffcc72fd098ed2128156.npy +02958343-8c1664cc8771aa3fce95c44a0ed1e01b.npy +02691156-79dba7fc4ba0829d62b600da24e0965.npy +03467517-39a2bbcc322da804b78788f924c5f0e0.npy +04379243-527b2d1e964f056383be1aa5a5ab0c80.npy +03001627-fb847cd696ec711197f2016c3d6097c9.npy +04330267-60727797b710f68659a84e2e2b7fb62.npy +03001627-2621666fa21488a4e922ceea1248b9b0.npy +03691459-3bf8ec07e1643746b319b8417d912123.npy +03001627-d92f4a4f2faa545ed08f729a736c90d6.npy +04530566-f66bca54b97bf719b1bb46d2556ba67d.npy +02880940-326c6280eee2bf74257e043ec9630f.npy +03001627-bec151e32bbc7e9b28c54e8f8953f499.npy +04090263-213c8d7870b4bddf320c2b53dcebe82f.npy +04468005-3244c30d7fa72016dc14ba0818ee5cec.npy +04379243-96aff91d7898cb1358df8eeaf3dad1c.npy +04530566-57a8ccaf2eb8d6a3924d278e5faa7137.npy +02691156-aa780af4d9cc83c3669c7dec71cfc5b0.npy +04090263-cf72122ff9caadf0622bf4353f4bc7c7.npy +03636649-ad17118799f11952a3721d780ca17da2.npy +02808440-653dab02848c6090b362845c6edb57fc.npy +03001627-e29fb377ebf475c51b1a00a31bfed97b.npy +04379243-f28e030e715b9d3e318462aca9e62b6b.npy +03691459-4227748867df8cc020363e2561dd589a.npy +03001627-ed1816d4dee58c7ddc809959e304d48.npy +04099429-60e62b419220c21e1a18bc096aeb4c21.npy +03211117-15ccd76ba83a2e02b0f9d182eb000fb.npy +04379243-d1fab6f92fb0682763a371f6fe9862af.npy +02880940-260545503087dc5186810055962d0a91.npy +04379243-e86ddb9617b8c44758b3fd27263469a1.npy +04256520-3e499689bae22f3ab89ca298cd9a646.npy +03211117-af56bcebf21951faefc87a91fe7ba1b0.npy +02818832-af840a4bad942462938fba07665a5a0b.npy +03337140-551404936411078ce5d6e9371bb5c33.npy +04379243-8b8de5b5ce7fc61def9f898cda0ff409.npy +04256520-f76d1470e843601f14c803eab703899.npy +03001627-c3ebc70a348051e1af7c7ad2549a1b15.npy +04379243-cbd1cd9b5423f890beedb4c8fd29e2d1.npy +03691459-1ba39460a5e31c722a813544190dbe4a.npy +04379243-5f1ccf0974b862c6f0d0eca70b77de34.npy +02992529-dca3f5a8ab0b850c8c8e7e9e3310fb01.npy +03624134-8ded17ea250fa58dcc34b900bb2492e.npy +04090263-2d203e283c13fd16494585aaf374e961.npy +04379243-4739bfb9ab23e4b92a87c4cb5e925da5.npy +02808440-b5ebd151fc2625da54d7082b34825ef0.npy +03211117-c57bb5a71ebcece8751bb40f9a4c6ba5.npy +03001627-6a9dce6566cd61652b339ec555ba3bfc.npy +04379243-5dfb4f36101a933ae1f4ca4f393a5a35.npy +03513137-354b570e62b161b8b20f6e48f6a30cbf.npy +02876657-a1858315e1b17f57e1507433bf0da3de.npy +04530566-b6ce7ac71fd3e33617a96ef097e71178.npy +02958343-12cf05b9f5f2d2c195c8d3a7db4dbe65.npy +03001627-f4a2478ebfac3e56b0957d845ac33749.npy +02691156-75705b82eb24f5ae23e79e99b949a341.npy +02691156-f1df46c588524ee76aa3bf023a2b42a5.npy +03691459-58cdb18878bf9e42d00d418bbce73381.npy +04379243-1a8fe5baa2d4b5f7ee84261b3d20656.npy +04379243-1d332d00746e2dc0f8fe975c2cbdb85c.npy +03325088-114546cb7b19119da70cb86be490e5e.npy +02691156-fc2d2df18182df8c82a2a8a82be86fd6.npy +02691156-9159a77918eb86cf408508ea36928b08.npy +04379243-6ebd63203c1ba404f51f77a6d7299806.npy +02958343-ad45b2d40c7801ef2074a73831d8a3a2.npy +02871439-40f49755a7a7e10effcae7f0dc8a7587.npy +02691156-c0c49c529f1ac5d8ca8607f540cc62ba.npy +04401088-95e61ab6f817d7ffdf3f86c9fe70c0ad.npy +02992529-cb9e8cd0a29cbb26b6d41c42f7ade8c8.npy +04090263-124fa4277bd03c74359ad7d9ce49f504.npy +03001627-a021adf9bdfdcff68d12adb6778d2a90.npy +04379243-453e290f4425e0604671fddd657dec0a.npy +03001627-5402eecc67e489502fa77440dcb93214.npy +02691156-fbf6917bdd86d5862df404314e891e08.npy +04401088-84cff93cb8ed08e55acbb5d30672759.npy +02828884-8450be279a0ea0b555839db883c17775.npy +02871439-4784aa14cd3a65a1898bf206629dc8be.npy +04090263-f6e2f5d6b724d8f855f41a702b987e76.npy +03691459-c462e3b75f570a3b42227a2ba4dff5ab.npy +03325088-142ee2de14c410623321831d2245cf06.npy +03001627-ef76b9cbf76bad40586ef70b3cee4240.npy +04256520-cbccbd019a3029c661bfbba8a5defb02.npy +04256520-aef8e3f17370fc8ecc98452c8fce6b43.npy +02992529-e2ffd39f88dc381c3455cac94a339dea.npy +04090263-55fde587d83088b39a2ee232a197081e.npy +03948459-9d5e90c0d6e341093e63a7526ef5b080.npy +03691459-59b78ba40b16eafed6baaf394ad18924.npy +02691156-c087319ca6126c51c5b0cf694baa734f.npy +02691156-2bc0d99cba39f7adbbf3143b1cb6076a.npy +04256520-395e53e3fbd2e717557ab4b593540354.npy +02691156-2a895d17616bcae1f361e4786a4d3c00.npy +03790512-e553d75a3635229b429f1c522640e6f0.npy +04256520-ad0e50d6f1e9a16aefc579970fcfc006.npy +04256520-68f6b68bac9f5d64d929fe644a1325a3.npy +02691156-e557af9d5aa40f424d210d9468aedaf2.npy +02691156-494a1698eb82572c3df325aac2f73830.npy +04530566-8e06600c02764ee98aa3ca9bfd776ccf.npy +02691156-a991428cd388fa7278afdab27190395e.npy +02958343-f6e5c35314beee84618e9d35559b7aa.npy +03001627-24445a532ce3e18f7b5f4d129cc2873d.npy +02992529-ce0d1ea23002e463861d8a7d0e05bb62.npy +04379243-551bf4f010f155ea4718e6c48e1ed95d.npy +03325088-5ae7c06613656ce8db0923ddab67dd72.npy +03001627-d9ce33c5f448815d7062f2d72cde5c95.npy +04379243-3c4c8e7ebdb95c2089a886870891682e.npy +02992529-7434bc601d949333cd5ca8d1acb8ce0d.npy +04379243-c5143483b413b4ed6991c1a663897b1e.npy +02691156-8c42e3042a4beaa7d5c40787c7bb7824.npy +02933112-64b8884bcd36c6fef94d7e6d8577c8ff.npy +02691156-5c9b09738d7920f0546100d9c41f5274.npy +04256520-c4e36c36679f27887586d00bc0d54b2e.npy +02958343-957a686c3c9f956a3d982653fc5fd75b.npy +04530566-b090b42f3dc0e7a4aa7c6f19b4833a28.npy +04379243-630de8111b5299f5f51f77a6d7299806.npy +04090263-28444490d359fe49cb833b31b53d151.npy +04379243-351c0bb85c887df27ff6ace05b36a5.npy +02871439-d66cd9f08956a1627d1b264ceeb294ae.npy +03001627-39ac0b216df14eecd225e12279334514.npy +04379243-e9cbfadc69d199c6368aec320face349.npy +03001627-b0849a1c01da76eeffa41024c63fa9db.npy +02958343-9c35f00f81110738783854950b26f0d3.npy +03001627-48106a12bdc3f7d8f5ee22e800bb9145.npy +03211117-740c4c76185ae7ef91a491e8257bd6fe.npy +04090263-4e817fcc0fcf1ba0b2d09bc8d348e46b.npy +04530566-6c9020061d71b190a4755e7555b1e1a4.npy +02808440-544762f1081340bd3af30a3946d92feb.npy +03046257-6965979c0f35f7adcb51c5ee8218e4ec.npy +03001627-659fdef8de4769079c251b4a7838829.npy +04379243-38b0f5874f16c1264307817adcff8140.npy +03642806-679bb4a724b1e2bc3339d8259ddfa7bb.npy +03636649-b230c6d9aeca66e52633ff66beb9cf31.npy +04256520-24f03d70f686533d7583d8e3d877fffd.npy +03211117-bb284aaeb7ccb54b5c4dc8ac281ba59d.npy +02691156-989da7f7bce36747c6c291015ab44100.npy +04256520-44e151bc576b4b059a46f459dd13f5c2.npy +04401088-cb21dc07d0ca602b151d8b52c53b90.npy +04379243-14e5e4db3246dacff12d7184a2ad3430.npy +03001627-4ccc0a3cc38c41af666bebf1a1d4e946.npy +02691156-1b300fd9ad4050e6301fa0a0663ee996.npy +02933112-b1e2647ec67a6402d616724413b4089e.npy +04379243-90a1748069ca92df9667b9ba9d06c778.npy +03001627-fb6c81cc88761a927cf3afd3f215c3ae.npy +03001627-8bb9a20b7090c90bf2356faf7e20b90a.npy +04379243-f92b1c64b0306322de6ff974c28c2f8b.npy +02933112-6db5a05080eb2480f863ead9331efd45.npy +04256520-d5b99ed4075d9ad559497798da6e2013.npy +03001627-8c81ff18e04584547f409062bafc8e2.npy +03211117-aa73f1b28817376c6cf19e722198d69.npy +04530566-3bcfc7f00e9fb213846571d66928670.npy +02958343-adc6f0f3274cf92cd4f6529a209c5dc0.npy +02933112-7238faf31667078b2ea98d69e91ba870.npy +04256520-b913678e74f02db521f0090670ee931f.npy +03001627-611f235819b7c26267d783b4714d4324.npy +04401088-7fa841359a3dce3dbcb8492ce3867c34.npy +02828884-247227d258f2c239d4d8765e3910f617.npy +03001627-f6cb298705842600bd259faf16bdac27.npy +02691156-1367266dc0a07c925d4533028830a79b.npy +02691156-5c74962846d6cd33920ed6df8d81211d.npy +04379243-1c40ccb81c862cbf595d2b7814efa054.npy +04090263-c39040b055a5ba329a2ee232a197081e.npy +02958343-3a5357aba2201fb03f823401cb5b3c88.npy +03513137-2171c3694013b15177b4e19e75551fd3.npy +04256520-325003759d3fefc7615ce01bf34878f0.npy +02933112-22cbdf59fb7fdae277b4d8470453cb5.npy +03001627-71c83afeb7e203e1bb7d8446afd650f5.npy +04379243-d386586a2fef0389393a1ce5402b0d23.npy +03593526-724fb5eb32401b96ed681532841d3af9.npy +03710193-dd76ca1f36937b5e558d3001d2e30ac0.npy +03046257-e51d02a4b1ff76d2dcf98ea199a73d39.npy +04379243-42191edf2eddbd733def89b32cef8e45.npy +02808440-ce8ba9a23d9fb8ac125fa9990176f0d5.npy +04379243-87385a994745e92cbc052c28a9e28ccd.npy +04379243-15bcc664de962b04e76bc197b3a3ffc0.npy +03467517-a26782a7130d5b76cc5a6997e65650ba.npy +04530566-dcb9f686556399a51a57c39f178ee66e.npy +04379243-6183e3d4c73872cdc955e5ed03ef3a2f.npy +02691156-26e10058cf9835aaca8607f540cc62ba.npy +03642806-81bc775eeb14299279510444cc61f839.npy +04530566-dcb390b2e8e5093def84f4e0accfb14e.npy +02691156-eb60d49fd5cdb809e6a2524c335c48f9.npy +04379243-1805ca3ac2779a443eec26c23f5bc80b.npy +03948459-aea1db1c8c014314314ac38f6030684f.npy +04256520-b581f1d0e58ef9db584536aa725442da.npy +04256520-961a646cb33dc785b0ed39ef5ec2add2.npy +02958343-a5dc2526c9ef78b96212c8f6cd06e.npy +04401088-7a1eba075f17d7b0a456028305c31de3.npy +03001627-7f5d8154877887727efcd98cd5f24de.npy +02933112-d4fe9416de5e2a95b022c94235bc8601.npy +03467517-e175f500370eb8f9561dce3fe08634b7.npy +04379243-1b805da9981a6393f454e62143e2dffc.npy +04256520-fdcf1197a5bdcfc1ab610b0c94236463.npy +04530566-c8dcc1e4f2276ef1ca6895dabdbc0ada.npy +03624134-925bb684816592ce35f686496653f774.npy +02808440-5af2dea565f2cd7138da322e72ae3fae.npy +02747177-ea5598f84391296ad2b12aa6a0f050b3.npy +04379243-1040cd764facf6981190e285a2cbc9c.npy +03691459-f2bb5c899ac2de670eb1591edd539b.npy +03001627-1f1a9120cba6c1ce177b3ebe695b7c2f.npy +03207941-85d91f3e489df57d14b35a7d7cea7130.npy +03001627-174019d47144a9462fa77440dcb93214.npy +03624134-9968b313d498ba92bfdaede1c9f37e88.npy +02958343-306f684fa89eb73ee151bdef07e713a2.npy +03001627-fe57bad06e1f6dd9a9fe51c710ac111b.npy +02924116-56a660ccc0a78a5d9c96fa78389d2873.npy +03001627-d8e2bf1107567774504721639e19f609.npy +03691459-c6eeddeb0366b4b6cf584303d1a1b5a3.npy +04379243-58a9e0e6fc43ccc5db32b682f6360550.npy +04379243-28e64eefcada205fddf120185fc0b2a0.npy +04090263-81593386d69131c5228625d43be3e606.npy +04379243-1c70e72ac0eb77816349f6b5431fb3d1.npy +04256520-546a90c5b673720bdb01c957364e77d0.npy +03211117-dd724473b5eba80421844676433a0aca.npy +03001627-a487bfde2aa50faa6d7bcadc05e0f4c2.npy +03467517-9dcc9c7653ade6f363e148e250c0340d.npy +02958343-f92aab09a6a1c6556c23793d085f1519.npy +02933112-73789bb6c0286415db823df37b893ef4.npy +02691156-133937bd45f953748be6919d4632fec1.npy +02828884-807b854a7c35379af5779d217e69b7a8.npy +04256520-ce46ea86a7f7a77b3adc3470b30138f3.npy +02992529-2b48b14e226b131af3b2c084b195b056.npy +02808440-8f7672193b88c72db8724a732b3d4cc1.npy +04090263-c446a7135467cd83e906ff5bb78d7b1.npy +04090263-3a23773469b2bfa8c12463ed30107df0.npy +04090263-661ad35c5c3a908c6d1e04c7ae242f3d.npy +03001627-fe6b3c001a86d844d5767a0de8dd037e.npy +04530566-854728b0055ec423e4f0b6b21d3809cf.npy +04530566-a443271055ad0ebccc9f5b25407f3c72.npy +04090263-3b614a18f9c8eecbf0fea2ee98610322.npy +03636649-84d66f07cafdfbc4fcb8d8c6d4df8143.npy +02808440-b73dc1a43a1f4685e06a964c79aed206.npy +04099429-e04bda8655d9e606ebcdf982796b4fa.npy +04256520-be1eb41cc9eb4b04ae685ca100c909e8.npy +04379243-5d6b4205111991c879170a5f8beda902.npy +02828884-781eb96c0a6ef0b48a51001eb8d95d32.npy +02933112-763d3c4ebccee884da5feafe6f1c8fc.npy +04379243-45c2a08625ade6e5e50eebdd2d05baeb.npy +03001627-9b275819a433a9c733e4fde2bc371944.npy +02876657-2db802ef3de3d00618a36258eabc2b9c.npy +04256520-354c37c168778a0bd4830313df3656b.npy +02828884-b71a0cca7ac86498430b7446f9e1252.npy +04530566-bd4614ae4c709729f8527bdfe6691c9.npy +04379243-a364b8af9a8d28acdaf1a853214fa9f.npy +04256520-e86d2ddb1e38d2e082db9fca4b68095.npy +02691156-87ac28e0b2342ac19a6e43b878d5b335.npy +04379243-de90266b552fd26c2ebeb1e6a8111f53.npy +03636649-35bc2c88e20e099db8bed6beeaf025b3.npy +03001627-f1a1bb6ad29d703078d928ba1c4a6f75.npy +03593526-1a8f9295b44b48895e8c5748ca5ef3ea.npy +03948459-8c944c84863d3d6254b976bcc599b162.npy +03636649-427806f30c61059c22e05b5d2ce39e3b.npy +03001627-410146dc84b6196230fbe480cffda9d3.npy +03691459-158f8a4ceaa281ab2bf4f773fe0e622.npy +04379243-90cd6fd66e29d712486040c0d9e85846.npy +02958343-40f160e49a6d0b3b3e483abd80a2f41.npy +02691156-f04fbc2423b13da170832200321e72bc.npy +04379243-f2d39c20369e9c524b1c88aaac3e0ad7.npy +04554684-d5ad82f383a9536d46cde67a6a1ea328.npy +03001627-ce055b7a4cccc7e182db9fca4b68095.npy +03001627-24b5aa5ca592ca5764945fb936667f89.npy +03636649-46aaf3bca1d0a3e776e9713f57a5fcb6.npy +03001627-ff5a945aef7a68ffcf9ff3ee543c2925.npy +02808440-536cbcc72e3f648fb362845c6edb57fc.npy +02828884-e4b80a7e381c6ef0f4215050a7660e65.npy +03636649-54ad0800a524a96ee039576a17a0737d.npy +02691156-d12f7698698bbc8f9b10643ba761a774.npy +02691156-7b3ef304a0088b39112e53a423c9745e.npy +03636649-a172874df5369cea1e70766334ac46af.npy +02691156-6d52412e798efdeab87697d3904b168b.npy +04401088-30efef3eef4b37eb9ed75a6428ac0ca5.npy +04256520-58156edc9c54973014038d588fd1342f.npy +02808440-7fc6a3771c2018d91884c7a487bba311.npy +04379243-93f3d802ab5132d162079c4c0e1b031.npy +02992529-67baf038e83456967f521a3dcd28e9d2.npy +04530566-586154b90852a5c2e0a6b888ad6abaa3.npy +03001627-37645c4e5ddb142e89955e67129be104.npy +03001627-6e965fc2145df32f4d678187b8261d95.npy +04090263-124f09d314c2c229331960c3710d952.npy +04379243-b45217934564854288e0556a2aaca7c7.npy +02691156-19ff8fce1658f864ca8607f540cc62ba.npy +03211117-8a7712d5c8614b97974e278a62ec98f.npy +02924116-3ff98b31a921fd0f51dc8a1ad94841b7.npy +03467517-8dd7df733a5ba17acae98171fea031ef.npy +03001627-a32e7b7b9e2ec5c351bcd597cb80c1f9.npy +04256520-b501220805eab01a6599ee0a44605cc8.npy +03001627-b3ef15af53eff822423da7f4f4231bf7.npy +03467517-cd17325861bcf9d22b24594c4702f953.npy +03001627-369caaf3ee33837ff2c0848478a667ca.npy +04256520-69b501570e12c4a12c216c5e0f221195.npy +02958343-69986baabb9cfdd1b1bb46d2556ba67d.npy +02691156-97e58a98eeee184565d73e2944dbef1d.npy +03001627-a808d40b66123c7ae9602306ed19eab0.npy +04090263-d7bcb405e59d20a112b38b1d99376c0b.npy +02747177-a97bd9998d12467d7275456565149f4f.npy +02691156-5c63ad3688c623b1a787d03c28977672.npy +03001627-4c1d6b12b48a80b0ebd10747ca93b13b.npy +02691156-caab31ecfe961086bc0909d98a1ff2b4.npy +03761084-cc959a175b783b95de8982fc28ddacc3.npy +02933112-4b06417d98fabe3b4c62bee40dcdc539.npy +04090263-3c92069416189d7fc7b525efdf38a3c1.npy +03624134-22671e883ceefd85e41f3b9c5c62b1e7.npy +04379243-33c6e3b21a67b750e78d7b497732dce1.npy +03001627-9c88f3031c4a660da6fee8e2140acec9.npy +03636649-d2a4c36321c50c06d28b52ade6c7e48.npy +04379243-6688fbb6e3fb092eb1b6b0c5ddacb607.npy +04090263-ed502e8af9df3df2c933c3e835f6d18e.npy +03001627-1f8e18d42ddded6a4b3c42e318f3affc.npy +04530566-f45d51939d8ee9122698fe11741f2ba4.npy +03001627-263cb748cb81e69cc329e2758ab09ecb.npy +03001627-2ae5f2290acacd7fd5b24cafb84903c7.npy +03001627-b2bb0eb5670296ed5acd449a2ae99009.npy +04379243-b074b6460f46170660edf8bc2f5c8881.npy +02691156-873f4d2e92681d12709eb7790ef48e0c.npy +04401088-ce0d1ea23002e463861d8a7d0e05bb62.npy +03001627-94d55392edad30d35192e08e628ef9a8.npy +02958343-1c7a2752e1d170e099399ee63318a21b.npy +02924116-92417d3466ae88bd563e41b6f7313ed7.npy +03001627-2182398f0f8fdd81af7c7ad2549a1b15.npy +04468005-8944e940719c340b9954eae9164faecb.npy +02958343-631aae18861692042026875442db8f4d.npy +02691156-c9ba5885f6ffc835a8cba409c4409ba9.npy +03001627-387dc2c22bdf6d2a6df42853f67b5836.npy +04379243-d796405237a2721937251258858a7a58.npy +04530566-8a779f2127dee13b28db2e450917f8b5.npy +03211117-cb0bbe56efdc7c2590fbc3d35abb4728.npy +04090263-75bf3b1cfba045819e172a9318b5b7f3.npy +03001627-264322794651490ec0d3c02f7e255b2b.npy +03001627-b659a94c6643282f504721639e19f609.npy +04379243-c271d00152fb6363214a15a5a42c49c0.npy +02992529-49a51e66314253d3f2a0433fb7c53e0f.npy +04090263-66f804b1400a139ab5aa01b641366717.npy +04401088-29f27d4472a17e723fd445ae159c2cb2.npy +02808440-97f7ff0b07dc37c18dcb895d63e0dcc.npy +02691156-1db7bca33ba446aba5cac89017eae8d1.npy +02843684-2293faef03d23ceecc1908493f380315.npy +04379243-6dbfbee18b2e149c71a782a4379556c7.npy +04090263-38a906533b048ad8341b8a806253912c.npy +03001627-a2824df0ddb58c0617b431cae0dd70ed.npy +04256520-2ea00b36ccb8d3baefc579970fcfc006.npy +04379243-153d0c95cd2981a46a76e23e6f966dea.npy +02933112-c09fe6e32490f4511b17743c18fb63dc.npy +04256520-31ae964a8a9a15e87934a0d24a61231.npy +04330267-34c8bf6c8dc677995147c3e89e46a102.npy +02958343-91f59dc0d204dc64260a770f90456bf7.npy +04379243-f864677894410315ab610b0c94236463.npy +04090263-af877a0a066fa63ffd180252c91ed0f3.npy +03001627-df6a3bc55f86781218930ac69342cc5c.npy +04530566-c9d1159874c934f16f1b09a7281511b8.npy +04379243-2892423e515ee379530176ce07cad21b.npy +02808440-61a19c2b6dbab7be1291d1279f7bf122.npy +02828884-9f51e1e44bd439f32a0697dbc1a34813.npy +02691156-530540dc968b396d7f3805c1aec66f00.npy +02828884-71970f9a11b0b5bcd7262b1b986920e7.npy +02958343-a53f8a03871fd1d1c4e15ee0eb85afd9.npy +02958343-4baaabaced0c9e0ac0e3666c7d0ec7d0.npy +02691156-67c8fe06930cf8788762ebad71629f9b.npy +03001627-e821fb5eb1e21368c341afa383659322.npy +03636649-39fcaf51940333b46ab88e9b8b75d248.npy +02828884-879fec928fbb6ff36b95ce378e386482.npy +03001627-ef89cc3901e27fe0c5cedfd70cc18cf1.npy +03710193-c6bc72f24af5ef42531a9cd007e29075.npy +04004475-6120c9dee581013e940d5ff3114b57.npy +04530566-94ddf20a9a6e035e85f7a3de54751f1b.npy +03691459-a58fe03c817fd0311ad88f716ea80910.npy +04090263-ffe20b3b5f34fbd0cbc6ff5546f4ec42.npy +03001627-3586ceeaea45b3598f5bccb3529a48d.npy +03046257-cea1956637d8e28e11097ee614f39736.npy +03001627-dddbd223b3bbfa8efd93c2ac42357c74.npy +02691156-fa5c740ca9192b708e8131a047a07ce1.npy +02958343-1079efee042629d4ce28f0f1b509eda.npy +03467517-2352c23fe113d9c754ed8bc786bc3eeb.npy +02958343-a053946cd9048d46f200a72c9245aee7.npy +02691156-fbcc12c5530ab67cad659a74e36b6387.npy +03991062-e7bd0fe36857413d236f012e801e4d49.npy +03642806-7b4260884a1dfd76b080af510dd640b.npy +03001627-4b2ede169dcc83ce4591019e9d133858.npy +03001627-9d20e4d4637e66175836897f0d296c15.npy +03790512-5c0eaef35c2911ac1d7cf2c1f472233b.npy +03948459-fe62130ce6fcd9b77754fed890b42399.npy +04379243-94a458e0932f189f755454a26c190c21.npy +02691156-5bea928fa9b2255ca8cba409c4409ba9.npy +03046257-f904afa5730aee1ff4700e9a01318eca.npy +04256520-fc24d012f6b12036aa1f8e0da2ec8814.npy +02691156-b089abdb33c39321afd477f714c68df9.npy +03211117-f84f47c7ffe0e49e44175b4dddf5be08.npy +03636649-40e6433da380273d128650ca4a80c238.npy +04256520-36d4a1a290c541aa21d25a6a55757584.npy +02691156-10e4331c34d610dacc14f1e6f4f4f49b.npy +03467517-d3684d071dcb6bffd3193ed047bef161.npy +03691459-8684b67d71677ac95ab0bd3eb49f9a70.npy +04090263-214dd04f06d5683ed17373579e6fd9be.npy +02818832-ecc1de9c62c1dc0559c46748f8e9b30b.npy +04530566-389d122da973fd5cd812ac1676a22587.npy +02958343-6bbcd5608ddf871a4cdd04162f008888.npy +03001627-c166f67f391022d31205bd848315f04.npy +02691156-2b62a8a0bcac6f22e1873a3963e0d14.npy +03636649-8010191bdd123581a7e0a9557e913c86.npy +04090263-66b3e706e98f22c7324318e511b81a2e.npy +04256520-e75990aa494d4dc7371ea954c8939aa.npy +02828884-ba4ffdf3eed29dea9f8c3d2002c77ddb.npy +04530566-cfffdac8ecda7575de208b4547dba0e.npy +02924116-d88be40c27f7723237d34ce4e00f2504.npy +04401088-9e2169e8e8186a3a27bac6c74974cca2.npy +04379243-c37912d7dc6504e3b7977f4fd4002c2b.npy +03001627-8c4fea06a94d7ecffd61677456447e.npy +02828884-b8f462d89a31e95b777c3ba457301e8c.npy +02691156-257d7b5ccd3b5c7f7c5c969e221ece01.npy +02958343-1100f9eac1ca426a3dc399576707b67.npy +04379243-10b0d655bf4938eae1ab19b3beff6716.npy +02933112-606d50b144d8ca164da5feafe6f1c8fc.npy +03211117-5934ee46f6872adbf19c9a0272a2c26.npy +03636649-4d6bced89943df73b4edf02c99e16daa.npy +02691156-b237bc484545cb46d8f63fb451ae8aba.npy +03001627-4ae3ee61ebfd4d7bc05575120a46cd3b.npy +03001627-2b8e3e95616a5fedabf945c9a80683d1.npy +02808440-8113b0f14206155a74f9a02bc96d14ca.npy +04256520-1cdc625f58dc911518af974879cc252c.npy +04256520-51396ab24d97a1bb245495d3641f83a4.npy +03001627-81889ad00179daf8adb91c074e672e22.npy +03636649-4c1912cae9d53594fc26f53456c58834.npy +03001627-88bdfdfb2a8b94ca1b17743c18fb63dc.npy +03001627-d0cf0982f16e5d583178d91f48c2217.npy +03001627-a1e16e59abc3fa56bf0788e630e3deb.npy +04379243-e36a5e4069db8198bbbe32d7a5038eaf.npy +04530566-8cf34976d5cb61b0f8901acdb7280141.npy +02691156-f5bb02c0df184488e0b6c670e0e97766.npy +04379243-5fbfc884ac25001e29426a0f57e4d15e.npy +02691156-dc03e743739c4f87c27f2d9f006d69eb.npy +04379243-317d8dfc74e872832b70eac6546e93fd.npy +03046257-bebfc25c773a5528a7f2fb8267777262.npy +03001627-2b3da2a8773d2571c3bd24f986301745.npy +02773838-88d375bc79ef32532e50abc7a1305908.npy +03001627-6ecec258a1b6fe2a6fee8e2140acec9.npy +02691156-e88a8692a22d548e1ec438f11f5ea1c3.npy +02808440-d847cdb16cae06404d059d8c55114915.npy +03001627-dfc2328946b2d54a29426a0f57e4d15e.npy +03636649-9f4b472b57e4eb76376135b28de9dd8b.npy +03261776-7da7c2b10597af90b21450114b9ae3a.npy +03001627-8945c698ec3e9d1ad9deb3f829cc2475.npy +04530566-e219390e6eb152024d0a79ea230a0577.npy +02747177-ff2f13bc0b9d4ade19c52ba9902b5ab0.npy +04379243-aa79a19ba1fb3cd1febad4f49b26ec52.npy +03636649-91d0d5301653c3b33da8556a622a2ae1.npy +04530566-a728c32eccd560e69412a62cd6b1bf5.npy +04330267-d58cf869f92da04198253a3e4a6c1a73.npy +02691156-c3408a7be501f09070d98a97e17b4da3.npy +03211117-736c5f322277bd99ff21f7d46312e751.npy +03948459-fbf675bb44706dff867ea9c96b799755.npy +02691156-3d6b9ea0f212e93f26360e1e29a956c7.npy +03001627-a3ba66bb0fbded22c5beea20858a99d5.npy +02691156-85396c57cdbf919f83467b3671ddaea2.npy +04379243-f9a795649f679b578f3be993fec1ba7b.npy +03001627-c56bca4b7f353ad86debb0a33c851f8.npy +04099429-99314b704285c0ca16e3314677399d49.npy +03325088-39333e9f93d3d3696d0157e3e7a8917c.npy +04401088-caf0f73f4a609b7a2c4e8a2f66e4b8a3.npy +02808440-32704fd3803c02d7fe52ffd0e748a1ab.npy +03691459-91f570ca6702fe4abd1cba733b111584.npy +04379243-2356544fa047516126f51cb1aef0ea9c.npy +04379243-dc4ba419b9035c4b917b96045c9b6dea.npy +03790512-5df0478fd19f0c175af8505fd49bb4ca.npy +02876657-47ebee26ca51177ac3fdab075b98c5d8.npy +03467517-49be6209142d8d1bd12eaca0749d01ab.npy +04256520-dd50bf448cd6d69016e9e510d2c2a9d.npy +03636649-8a840a390cc8ba885089a13cc567dbd.npy +03001627-51704a889ebcadb72cee4bf5d0f11ffe.npy +04530566-8c62487a3593dc337810d5f988f90f49.npy +04401088-20e5a92f95731f04c4440dd41b08b3f4.npy +03001627-6b881cd27826bd6b97a79b27e081b077.npy +02828884-4d6b053f11e784e2a136ebdce43e4200.npy +04379243-539548613fa54b6725aae1be30d7ea21.npy +03642806-2777dfcee7d0f364b0d7b0d4230df8ca.npy +04256520-d44fb796a1772d5a490ad276cd2af3a4.npy +04379243-7c29c16650cc74bcd17bccae1d897a22.npy +03001627-525776b59266140381dff5c2e57ad46e.npy +03001627-43681f9356e330b36ac40071701c687.npy +02691156-4a27a6276e748777bc0909d98a1ff2b4.npy +04256520-2bf095743bd8f21f6f37a8be59c15bbb.npy +03001627-2a87cf850dca72a4a886e56ff3d54c4.npy +03337140-9053de990d7c71e1e4cf665cc17bc4aa.npy +03046257-ba090cfc159e1495a9575f4ef037dfdb.npy +02691156-839a950d0264cbb89a162c818d22a620.npy +04401088-7552cd75673834c9c8470fd239ba13d4.npy +02958343-9cdd8cd41303cbdc650bba674124a73b.npy +03001627-39f5eecbfb2470846666a748bda83f67.npy +03001627-983414e34ee6a7966aea2f18ee404fd5.npy +04379243-d9467c88e3e26d3c4b3c42e318f3affc.npy +04379243-ba08fa516347f4e6f51f77a6d7299806.npy +04256520-5192e47e1e8267068907728f92c46d69.npy +04379243-377d6044219ec8b3063f9bdb41a65e3.npy +04379243-1f116a581f9e15e01b17743c18fb63dc.npy +03593526-5e6c6769815668b817ba4f4092c6f41.npy +03001627-f891816329ecee93774476b2e205b9b7.npy +02691156-c05bb681e0ee27e2eea65ef742e4d989.npy +03001627-fbc560d04067a6b58ce66f12ba927a2b.npy +02958343-99311deac352b9a5873751b4c304dae7.npy +04090263-f0236f202fe3588a8d4ca42bc1bef451.npy +04379243-a1f130e921df44b037135011237cc916.npy +04379243-511cf6bce918c6738e0afce805a277dc.npy +02958343-e93f88a9beb9ddbeaff90a85d875467.npy +02871439-cbdc7ed6ba5aeb2a3a272da15f3c1cb1.npy +03001627-ed6c9f6d77831e5cdf2b21995cbbbc4f.npy +03001627-50faa1777b012058492d9da2668ec34c.npy +04330267-10f1eb0113a6340e35914415372cbccb.npy +04379243-c9ad84452fe0ece05ab833c88a8efb15.npy +03691459-43990d5a8ffd32774f074cdf0a32eafe.npy +03636649-882aae761370df14786810c22b062a88.npy +02933112-1cf9f1ead192b6c9824662341ce2b233.npy +02942699-39419e462f08dcbdc98cccf0d0f53d7.npy +04379243-65e7fd8d158658106a76e23e6f966dea.npy +03046257-afeb49c6ae3977cfcb87baa8bbd720aa.npy +03636649-b7716e735dc72358182649d086615bf.npy +04090263-43d4e6583cef197aafeed2d6e5e28a9f.npy +03691459-1d4ea80f49114ec0813621823d82b548.npy +02958343-b0810f509a3c4cf895cad68eb5eb0e38.npy +02933112-47fa0f6c9b9f019742cc639a26c5af8c.npy +04330267-fa759d830cce8dea7e4bbc5bb7fd2afa.npy +02924116-f7cae23060d52bde99ebcb8df4d39cff.npy +02691156-23eed87ac79f1b152f9c405cf0817830.npy +04468005-52bc6eae0a13f93751bd803a9a30b004.npy +04256520-2ee577ae974272dc9faa444e7f5fd692.npy +02958343-8dcccd3d9221f9a0d61b6a34f3fd808c.npy +02691156-a4f5529edc990706e719b5362fe06bbb.npy +02747177-f35efdf00062e177962bfd5bcfc9bf86.npy +03001627-6a7050042fbc77d5635418e95eea8a17.npy +03467517-16afb97fe3882483cf45555a18e7351a.npy +02691156-6271b0016c5fb3bd59d2e83012533b47.npy +02747177-b77e94ab409def2b72745b90f9692729.npy +03211117-10953ef61c72aacccd14781dae25affc.npy +04554684-226f73828ad8562f4c86b1fdc94892eb.npy +04379243-68c52fa67028fceb47637d2621d965b1.npy +04256520-79edc7c4e10a6fd8b3aef1eb2166205f.npy +02828884-5be09ade953eaf6ca6910e4922d61aa.npy +04379243-5d3d9689b1447e01febad4f49b26ec52.npy +03001627-4ca29321dadaae90a516b539b31607a2.npy +02958343-ad1db5ce98d385fdd1e15301c83686f.npy +02924116-867d16b7468cf4cf75ba84a155b61876.npy +04379243-d78d509ada047f34e1a714ee619465a.npy +04379243-3c886639d67798f671a70be9f12ce8b0.npy +03790512-81e1a6c5a4de9f8f7a1f4451e23d8e4d.npy +04468005-eb35e5c9c3d0b97058a624688564e0f5.npy +02828884-ed8401565e207665f155d75bbf62b80.npy +04090263-1c4ffc878b001a097e270f84701afcd4.npy +02808440-6bf87e25ad2b7e1cdd43f423f86ddbb9.npy +03636649-cf3407cf42643d3184cd259bd328e92a.npy +04090263-9e6ba8035db3ead6cc34b900bb2492e.npy +03046257-81be602470e4fa90b2f671e673cf292b.npy +02933112-530d7817abf9b54e73f47577531a0b51.npy +02828884-35ac96f483e073faf515c76790f82ed4.npy +04074963-a27dc622395c3648db8fa1712f9ee93.npy +04379243-8bfb5dbd48e6bcd5aec454eed44c3c27.npy +02828884-6ccec23049ae42ce2056b4bd5d870b47.npy +03211117-1707d858ffaf146e640578ae55230ebc.npy +04379243-611e834a83c63f50a8840b31c6de34ce.npy +04225987-e60f8e703bf6b7e8b267718342f3f316.npy +02958343-8b7b6c2a5c664ca6efe5f291bc2f5fd0.npy +04256520-1507432d805eba8dd773dcca82f4a71e.npy +02958343-14ace3e8d05f8d21a413908c0e169330.npy +03642806-c87bd5d0b4caa95de14be8c4a6dae8.npy +04530566-7dc72dc46c46410168ac0d25269a2c67.npy +03593526-3976bd1f61e4b5c95d878ba9ec3c0d6a.npy +02691156-ed7eb0caa75661addc82b8fee1057b30.npy +02924116-923dc3ec59c733a5fa07f5a050a0502a.npy +03593526-cd03a7bd6ace5432e7a3b2beb7306f11.npy +03691459-d2426b884d1108e8bdc8d5970acdf989.npy +04379243-5929d3983eeb8d5cbf96d22e92924ea2.npy +03001627-5cdf1e5cc2fdacedb01116e8ff585621.npy +03001627-4246c8c293c56ea34b3c42e318f3affc.npy +03001627-987122b945dcf1fef713f414dfd3c16.npy +02691156-31d40e6e24511386d6d949577c389a84.npy +03046257-41d0afa958bd0621dffd9a568a626d77.npy +03636649-dacef14e18d54f3857d60a3bdfb4976c.npy +03467517-afb2a038358c5f391fb05d58f51ec4fa.npy +02691156-535dad1777edb67bbc0909d98a1ff2b4.npy +04468005-649d1dd617a2e5284f62d2a35ec091f.npy +04256520-a2a136afb803eb35cc571cd3cf8f17a1.npy +02691156-d532a5abb756ebebcc14f1e6f4f4f49b.npy +04379243-224766e5a022785af51fa0238791f5dc.npy +02691156-ddf0e3053cb1ca8f5e9e2656aff7dd5b.npy +04379243-eb773e1b74c883a070d809fda3b93e7b.npy +03001627-c967b1e07ef7fc0bebc740fe800c0367.npy +03001627-e45fb6b81247cef0ad312873b158ac49.npy +04530566-6d2c856797bc246898f9d8529de7066.npy +04379243-87dda49474723fa816a2b5862518c93.npy +04379243-203d58d26d1546994b7b33169889d14c.npy +03001627-ca01fd0de2534323c594a0e804f37c1a.npy +03001627-9e8ba34b501945d1f4b6538438a0b930.npy +03001627-6e9b9e6dbef7d1d219fb4103277a6b93.npy +02691156-dd9ece07d4bc696c2bafe808edd44356.npy +03337140-4eddd7e49d6c6d044c3aee8e9d3a6ffa.npy +04379243-30a525c7bd5ee80192b396ed960b67ad.npy +02958343-1c7ddd2735778013ce50f18f6100cef6.npy +02691156-c8db76f18f56c1344c2c88971423d0be.npy +04256520-43720278eea721d27d18877f45b7c3cc.npy +04379243-e5a84d7ed9a5ce097f4557c0cd5f53a.npy +04090263-44ab011decde6fe4c41bc86ace512f24.npy +02691156-a839884fba87173ce25031ee39d82b94.npy +04530566-5a7635031cd518daefa33903c8f77ab8.npy +03636649-a2316a225facd3114f3443b22038d340.npy +03513137-ae8a2ae90ac11bd93d4e343a1ac21b93.npy +02828884-59a3fc2f98cc53cfa13c59d3c05ad9e1.npy +03001627-d4e974b1d57693ab65ae658fdfdd758d.npy +04090263-fddbba55cea838b9b2d09bc8d348e46b.npy +02933112-7ef23a05ff56687087cffb2975eab062.npy +03467517-fba2fc6f7ab8a62a93f0194265a9746c.npy +03046257-79f572f4428ad13cf54e1b6f41fdd78a.npy +03593526-3fc4784d1b2247306ded232b3f448b08.npy +04530566-da738558b1230b8288d5590328ce0ddf.npy +02992529-26175bc1827c3569c4b311ecb3af9fe6.npy +02691156-404714cf775f5ceed32761b337f8b72a.npy +04379243-29c4539ae1760a50c955e5ed03ef3a2f.npy +03001627-fbfdc8eed6598437b2bb75885cfc44.npy +03325088-9d98b2c3591441a83321831d2245cf06.npy +03761084-e38e26de9812e1adf5f79806bd65844f.npy +02954340-9673c2be589c2b9df0d11ae402ef940e.npy +03046257-a366005a5856c873202ce3547fa5ce9d.npy +04256520-999c10445b9126fabda72093f9b5aa73.npy +02691156-26237deeb192f83d3ada73811bb576de.npy +02808440-cf565a3576331f67433b4c9b207205a9.npy +02691156-395cb914880adc105b50b4451364cc2c.npy +02958343-bcf0b18a19bce6d91ad107790a9e2d51.npy +02691156-2cd9e40d1ccb1917228c3c30d65cabe0.npy +02828884-3a85b1fd831c15bbd2b12aa6a0f050b3.npy +04401088-f1b9de7276c1b07fe5562f06ed322f7e.npy +04379243-1599c3f78f521c0c3bd24f986301745.npy +04379243-4c529b6171aabea2e8058cf23f6382c1.npy +03636649-89cb9b2ad175b833cadf6344ec272e8.npy +04401088-c688e0c0830ddebed23d7150656e0d04.npy +02958343-ded68cb3b5318425bb164ad50a9faee3.npy +03001627-875925d42780159ffebad4f49b26ec52.npy +04090263-486e685875e840dde4b30fdd654658ce.npy +04379243-7c08d40119ea39923fe3501bb9e7193.npy +03001627-654ff4d929914b7ff91663a74ccd2338.npy +04468005-45f9f9a2991b3c0b76d9bf960443503e.npy +02828884-244955211c2f3b94b821b834431f4e0e.npy +04379243-9f097427c4d2bb4af2c0658ad22a9a9b.npy +03991062-30b3abdc25299028cc01fffc6fcc7b74.npy +03001627-e2dbad7996e7e13430c589758b4b5646.npy +03211117-5cbdebf9422d9858dcabaa2ad147fa73.npy +02924116-d7ce4cd86d8d7f1637da79b407550d26.npy +03337140-f8c3c4da6560cde54c3aee8e9d3a6ffa.npy +03790512-49edb54e97458de8d373c34785838ee4.npy +02933112-910eec62d3cf0936ce5d6e9371bb5c33.npy +03691459-fb60dd3c36439d836d74ed7e4da4b6ec.npy +03691459-8d55d634810b52f176f6deb1c78dfee8.npy +04256520-dfb54a98465dffeffcd08faf4fccd0f.npy +03001627-6744d53d1557cd2443dbb6421d614c0d.npy +02876657-d2e7e725aa6b39f0d333084c1357713e.npy +04256520-9e57afbc186ff5387c0c12d35fb75ce3.npy +03001627-a551977f078f362c492d9da2668ec34c.npy +04379243-3d4a592876d60a3c0f9df0cafd74e5c.npy +03948459-c2b8580d4087bd708480d5f7e7366fe1.npy +02958343-192fdf42f5a2623d673ddeabdcc8c6e.npy +04379243-a95df9c4372e860c73eb02f1d995d891.npy +03691459-86775c918b6f4fd2f149a4641e0b7067.npy +04530566-90d83e1dde32426407e66c6e74f5ce3.npy +02958343-a88baf98bc73649fdd61bedeefabbeb6.npy +03948459-664579680dc09267e1f2a1daf140ac9f.npy +04530566-e453412c14d47ef176dfbd72ad52dca6.npy +02747177-83488978efe02f562a1ff22c35676be7.npy +04379243-d7576f0e6f9acba7d261e17fa0c462a7.npy +03325088-c2a9e63c47166a75341d61f56edc2872.npy +04379243-11bf776fe946cb7af897d07ebee05db5.npy +04379243-233c3eace6ea1267eaf288f952624966.npy +03001627-5c92b3aad6c462514b3c42e318f3affc.npy +02691156-76851aaf721dcb63509012911cf74f29.npy +02876657-bb46957091f2a282cfdfe3f21f42a111.npy +03001627-6c1352ffa574e154ca2ed12df13a916a.npy +04256520-d100d576372b75bcc6b705e3bb4769f5.npy +03467517-bf041bc9abb1114597b6cc42b1ecbb47.npy +03691459-986bd3ba96016425cc0d3a65104f5927.npy +04379243-70e3188676407076c3bd24f986301745.npy +02691156-3ac64a2c67cb44f19777d69c8d47140.npy +02808440-22eb6e2af43e6e78ba47eca8aa80094.npy +02876657-547ace45594ef71fc867fe00083d17f7.npy +04379243-1f95c9d8e65c117343dbb6421d614c0d.npy +04379243-4a519fb8089dc7d248eaa510713cb074.npy +04379243-d9c75799ff9ff74664b3b9b23ddfcbc.npy +03211117-6f7689fbca875b034302674f512c0e5e.npy +03991062-9c0a4184fb751fe58f4d17a342e13fb1.npy +02808440-fcf3ac6ac5ca3738e6b3aedd6ba272b.npy +02691156-fa9d933674352c3711a50c43722a30cb.npy +04379243-7a0eab4d41f461e980fc8e4355cf787d.npy +03211117-4b85feeead6313806329e8c7b28434da.npy +02818832-7a4e07fb5701172c862eec8232fff1e.npy +04256520-9ef9ea0de3fe64d4e7e684d25d4dcaf0.npy +02747177-69ee57f4534eb475e9bfc203f193ce76.npy +02958343-b28d1b3e81f407571c02ebb3dd0baeb1.npy +04379243-d108dd323ed295991b17743c18fb63dc.npy +04090263-4bd456ea9809a296c60369962d1bf5.npy +02924116-7a275413fda13866f81aa5c6f39752d6.npy +04530566-f02b990da656df8dba71d80f7b736179.npy +03691459-4d1061e19f05e919a5e698f08af11df1.npy +04379243-71a7bcf52da934d0f008d8a3590fb522.npy +03991062-38c66f3168743604a2c59a4d90e63212.npy +04530566-294644520ccc2ce27795dd28016933fc.npy +04074963-c21ec53c8531344b8ef01232dadbdf7f.npy +04256520-f6190e61f116d159ca119b1ec88d8df8.npy +03001627-d1291956cb0983ee7085b4353236aad.npy +04554684-2d65189ff15fe1538a8c921f75bfa58c.npy +04379243-20765ccd89f9d915d200faae04ce3f8.npy +03636649-2d638c6b6b2feb9248da169d95204ce2.npy +03624134-6ebe2a22b8d9d70862a95b942081dfee.npy +03593526-b2e502425dc3f07bfe4f69210ea5cdca.npy +04379243-8a86e3045ac5fe7e1f335cc23d448de8.npy +02958343-3ffd5155eaeab76bb17445a1c29f6d34.npy +03325088-c02a4ba752dcaefce3f7a74e12a274ef.npy +02828884-9997397f29b90af470e359f3b1d0f6d1.npy +04090263-de0f9c9b67c5f5a6422f205de59ac7e6.npy +04401088-3a8b1287aed892ba5661e3450b04a6b4.npy +04401088-ecbb1c53e881c2b25f4e4793ed432bc1.npy +04090263-ca2bafb1ba4b97a1683e3750b53385d5.npy +04554684-c667f9cf4f72ef6fbdabe30acfd2c07.npy +03325088-daa26435e1603392b7a867e9b35a1295.npy +02691156-36d8c865f766e3e097872638b21438e3.npy +03325088-5a0e759e281cfac71250bcd0500910e5.npy +02958343-39ec376b0df877986483e7894702b192.npy +04090263-f3004f6eb2e5fb8eb7a51049b27f4bf4.npy +02942699-ec28a64bdf9501161bfbba8a5defb02.npy +02691156-d696c3119cae40323ada73811bb576de.npy +04256520-b15fb2ddfff73f502cf0d9a4f66100ac.npy +02691156-5d8583703889178a8bc354dd4eb23614.npy +03325088-912dc428abd8cca1c36fb70296e45483.npy +03085013-ef3d038046cab5cabeb3159acb187cec.npy +03325088-33f6b54f6b72e64c76c18e71fd49c4dc.npy +02958343-62032b070c02c6b1570673441ebdaf2b.npy +04379243-80ef50d3e67bfa8783ca982ecb7c4900.npy +04090263-d35bd51cdc04c103882d915ba9d043ba.npy +04225987-4e19d12d0924a2f58266b26a9b45059a.npy +04090263-f55544d331eb019a1aca20a2bd5ca645.npy +02992529-c87bd717c3640f0f741e88434245c899.npy +04090263-35b5cba53b629223cc2e8ce9ba1c97dc.npy +04530566-ff70051c32217b2df671917093bd361.npy +03001627-8f09ae17dedc43c6dd7640b87074419f.npy +03467517-a78c3356a5dca4e7670b811945485012.npy +04090263-fb6e8e453293303a4721599ec64bb469.npy +03001627-920af478601258e24762da3a3017ade.npy +02818832-6193a59df632dc4fd9b53420a5458c53.npy +03001627-9cd5f64caf7077ec3266c035d8afd13b.npy +02871439-2a3ce38991b93107275d003e423c59ba.npy +04256520-65dd8c9418c29ddba066c1f884f0378.npy +02933112-68257aab07479c64854a6619c08bff6d.npy +04256520-2c3a679d6640a93abd16d4490a10a752.npy +04379243-2ef5b582482d7d52cb71061323057eb9.npy +02880940-bbf4b10b538c7d03bcbbc78f3e874841.npy +03001627-faa6255bb4de99d90606ee5fb3c339a.npy +02828884-5856737e6fc90bbac1a25f36f85c3fd6.npy +03211117-ff8418d110a5fd5211ab369e12343c13.npy +03938244-31db3f4dd9d5944c3628a80a75ee02dc.npy +03046257-5972bc07e59371777bcb070cc655f13a.npy +02958343-d7b8287ca11d565bd9bd5ae694086d5.npy +02828884-4526eecda7ff1136ad5067eac75a07f7.npy +04256520-526c4f841f777635b5b328c62af5142.npy +03593526-dc9eca5831f9d6ad230584014222e685.npy +02808440-2f5a70ee78ed7cfaca581939cd410ca.npy +04379243-1c3317b33bfccab0824080f516909671.npy +04401088-2278cc8b5a50421613fcb9cbc590fba.npy +03046257-5d7549beabcc86af6329e8c7b28434da.npy +03001627-465c2cc6917e02fec681404257d94ad9.npy +02808440-7f5a3684f57a6fe754d7082b34825ef0.npy +02808440-8be7711dfc0c7e3a54d7082b34825ef0.npy +02958343-9167cb083368cc6be3d59d595daeefd7.npy +04256520-9f57f0155caf1c15404a78e172d68d45.npy +04379243-cf10ac71297ae632f44880b8ee951142.npy +02691156-ccca0685aa63308ed54e5c2e672a56dc.npy +03636649-925fe53d5075145981a172d69c52a28a.npy +03624134-b8648ae17fb9937949f73a97204d432b.npy +04090263-5105e493bcf5e63f75a82b88fe6e733f.npy +02691156-9f21e660ba62b9c8ac055f4f708c624f.npy +02828884-f1f14399ac9684df835bac7bf872f771.npy +04256520-a1262399c6c0ac93e84291b9d249a95b.npy +02828884-6b9b014c54423664a9bf865a81345d8e.npy +04530566-1b5e114692abf9a5fdbbffe94281448.npy +04379243-b2564957632c596c2ebeb1e6a8111f53.npy +04256520-42b13b1ac18724f84b3c42e318f3affc.npy +03513137-69d70c404f47b1f9b137667443c4be42.npy +03691459-9b9b41d3d02ce68d1b009b4923bf4541.npy +02818832-babeae78f6d2412a15dd7d7985e749c1.npy +04401088-cfdd44745ba101bc714ce1441b585593.npy +03991062-d56098d4d83f5976a2c59a4d90e63212.npy +02992529-aaf1159cdc4e6ce5b2ff1d6fc3caddc1.npy +03211117-225d37286bed9bb9dbf53b03c847b004.npy +02992529-5cc54b5db73e9e1e6decf1414eac2924.npy +02958343-5d385a0a87d0df4a51a95aaa6caba1d3.npy +04379243-f82a5f3c2a57655d825da2b9ec9c8c29.npy +02958343-881cf849fb2d003514d92936db4784c4.npy +03001627-357e2dd1512b96168e2b488ea5fa466a.npy +02876657-f0611ec9ff89209bf10c4513652c1c5e.npy +02958343-8e3336175a338970a9fe1734a6086750.npy +03691459-9c98e3576baa1f25b3150cb8eff8d9d7.npy +04090263-68a7652d28ddf2035488420adf4edfd0.npy +04401088-78855e0d8d27f00b42e82e1724e35ca.npy +04090263-34d2582f7fc79e07a5fc2a01ff709b89.npy +02958343-b554614b14148e4ec0ed6ec757ca50f5.npy +02992529-641234f284243decea95e61f66327e28.npy +02691156-a1e5e9561b501f2a19e06ee1b2e7b1b4.npy +03636649-9aff9fdad0e3555c7eecb4e0df212ad9.npy +04256520-c131c9feb56c6b7a6bb6bc0db07c71e8.npy +03928116-8ffd503645f31d6115ed47584b7a4537.npy +04004475-9c6e72feeefaf01390eb32e4b2b2efc9.npy +04379243-5667350dffa82263968da786c4da00c.npy +02876657-d511899945a400b183b4ef314c5735aa.npy +02958343-db432e9f280ffb1e3dd4bdc1dbab98bd.npy +02828884-11499e2fe78c7a6d73bc78c81dfbb18.npy +03001627-30518e2d6fb5dff259d9b12c05c8f809.npy +03991062-c4ac6a5f651d12c6c6b4aaa0b0f9d794.npy +04379243-cad4cd1fc0c0952e71a782a4379556c7.npy +02691156-cbc9d6ae9d22fcc57f3efc94c2d31dc5.npy +04090263-73bf687a44580f037f3efc94c2d31dc5.npy +02924116-3e0c9a10f8e200be17b44457cd291bcc.npy +02958343-ca7202152b84a70fc6a4281cffc3c014.npy +03001627-e0c76c1c82f12df4c1e1aceb66eee9be.npy +02942699-63c10cfd6f0ce09a241d076ab53023c1.npy +03636649-cdbb91da1b21cd9c879995e59bad3d69.npy +02691156-27c409ead0c4e34c9a6e43b878d5b335.npy +03636649-d7fb922f162360b5c66a63406f818460.npy +02924116-59f6907b10ed62e475dadc997718614d.npy +04554684-592e665fa7e0a2bcc9614070d3269898.npy +02958343-3506955660641ce61d693e0a12bd4ff3.npy +04256520-4997b2b6120f84e948eb521885c87e13.npy +04090263-e5cd986f028b4e27b91a90edeb58ed0b.npy +04379243-c9e9466f782d1b4f7fdd70657322b4ac.npy +04379243-1c111a837580fda6c3bd24f986301745.npy +02924116-72271b23f406c7cef8dc13cb78906875.npy +04379243-62b17d7d8fa7ad00f51fa0238791f5dc.npy +02828884-abf095439d2d7bdb57a8fa4c1cbcf3ea.npy +04379243-9c49b5339e9f3cfa5c6b6ad017b2e512.npy +04090263-c1267e4fcd29c63b60053189e2e21dd.npy +03001627-3ea6a179fdc3c01daac8336231c53cd1.npy +04256520-651270d31b03d1c12f1d01f48e42a6d3.npy +04225987-52ffc103719ae88ef0f40fbf85e100a.npy +02933112-386bf465df74b1321d860ee2ad2a42e1.npy +04256520-d6b6f8854bda98a6ff458e602ebccbb0.npy +04530566-b4ea73d8daa2789699c1d6f5c0b53b84.npy +04379243-b2b57e89a036970d22e5ecbe03e765d.npy +02924116-b7656d749dac1071f75f41eca7a019a.npy +04256520-67626389926740a08de89023dfc7cadd.npy +03790512-f736168c42267866eba25bbcd3786140.npy +02958343-545abd37dd50dad953536e7c905b301.npy +03797390-ea33ad442b032208d778b73d04298f62.npy +03624134-95db800016f8fb955d33831e71fa52.npy +04379243-5d8ea325e7182fd84b757d0f16894ea9.npy +04379243-53cdb2389fe5a5e5bc78bb6f3ca89e4c.npy +03001627-4d6c67174bdab63ff11cd7e1bac77b0e.npy +04460130-64ae93807abcaaa38cd8eb23853c009.npy +03636649-2140c6a8b4648d84f3443b22038d340.npy +02924116-7122ccbf7cf39de6cb239ba7670e0fec.npy +03325088-c33c3c63eff994aeb7a867e9b35a1295.npy +02958343-30f4b931145acc98a3049d0dcf503cdf.npy +04256520-9be24460d1f7d084b3c42e318f3affc.npy +04379243-f74a63793db25c8911fc2b865c2a185b.npy +04090263-a9e1e9c25f250b289546043a05bd4e6f.npy +02828884-9c69b56c5867afdf5d65e445b951c79a.npy +04379243-3931ce39e77a25a9dfefa992cb59ea0.npy +03467517-dccaa9555afddd96a5c8e9fc8b2242fd.npy +03948459-e9ae98d8679409f8f52692247799a350.npy +04090263-5f69d649d9036be626b78ab29e6b0231.npy +04468005-423da92d362700483fbd1495c921f279.npy +02828884-c89d4c95f1e7c950a805114916841d69.npy +04379243-79d0985603f7ff3be6c5cd45aa112726.npy +03636649-5cfe9300f102ad65fcb8d8c6d4df8143.npy +03211117-a18316fe31d3e24ed113457aa21fa2cf.npy +04530566-2de6a45649b392d2f7051f81d65f99eb.npy +04379243-6631de96600690d158c88d30f502a452.npy +03001627-61bcde763ccbfe520ab6214a789faf.npy +04379243-ef4e5099cb7c543830bbd4cddd04c77b.npy +04379243-d073f58c96c17aca95786b1c8687acc.npy +03325088-24d438e0a5966a8316f1e46eb2815c0b.npy +04256520-feedba483f628b8f584e3f372dd1a2d.npy +04379243-587143666166faf155fe0f12b5bf32dd.npy +02924116-2fc461ae4d2b416c3ec3fbbb89296dcb.npy +04379243-612caa5ea6c888c850cf3715818ccfe8.npy +04090263-180846dd3deda6785127e0873cfaa7b8.npy +02871439-7bbd940fe725689fd320119b2e676c6a.npy +03948459-42740af029297f1d9874fa4c7b1a4298.npy +03001627-9f3ff62527bf46f237b2bb75885cfc44.npy +02828884-6798771442c7d473f336cb889fb7c819.npy +02691156-7030044b49828f08b96ae1a0a8b84ec.npy +04256520-2d5cd8bb42310f3eb04cb542e2c50eb4.npy +04530566-fe8f54e34ccfa35f3ceaa5264772e8b6.npy +04090263-5c1d73e16d1a4459b5070c7ac310bcbc.npy +02691156-3069d990d52051eb3a34c2907e8f3f1f.npy +02958343-3ec7f0347638f7a891eea2fc80d4a25f.npy +02691156-b1696ffd98c753ccea88a0a7eb1222bb.npy +04379243-4126746447b424197fcb8ee54b1a951.npy +02871439-37e570eb9cc1bc7b50fe7d207ee3a1a6.npy +02691156-53d0eca7c8ab5e644c3a35cee92bb95b.npy +03790512-fad668ac64ccea1ab37378f3c85478b4.npy +04379243-eb00a4e8b33d257cad16260d4d73b56.npy +02808440-59630f5750ba5aa46935f7e0522b9fa.npy +04379243-c77ed43659f01a0cf51f77a6d7299806.npy +02828884-c6885d073919e897de9de6d8a1c444be.npy +03624134-c30f7e40f4cc1d52344cf8873eaeb8c6.npy +04256520-c0228ff42e79e272db039d8689a74349.npy +04379243-be971a899c96649262158b7ee658e910.npy +04090263-11126129151f3e36afb1ffba52bacfa2.npy +02958343-5fc2334bf83f4c0e3505c0c7d5679ae2.npy +03691459-dbe86be505750b8d9c92e8251d55352d.npy +03001627-9b94592fe0fdcc34492d9da2668ec34c.npy +03636649-798028b70ab2a1d529c726e7d66b139d.npy +04099429-c0d736964ddc268c9fb3e3631a88cdab.npy +02992529-bcf3ca7e860d04eaf0fbb92458462640.npy +02828884-2e78dad09566bdcecb2a965e75be701c.npy +03001627-79053fcbcb68e2c31528cf73b8bd8799.npy +02958343-9e5faa247753ad479289f0a3d35e8de4.npy +02924116-cac296959eaeca1f550f48125b5f584e.npy +04379243-db75ed97a5c5234e8f7d9678498f2295.npy +03691459-3db03a00661e6113f2a29b1958708a7f.npy +03046257-e78b66ad9fac907822b68de582c1281b.npy +03991062-247237dea2ef00f444c183864792bc2b.npy +02933112-716b2e87f41b14cf48d22c298c611495.npy +04256520-4b11124f5ccf051086708ca48528bc8c.npy +04530566-8877086211c9976cd27beaa6c9701d39.npy +04256520-bc0ef0dc1d69ed4c852bb95bccedfda9.npy +04379243-bca062605b3f79b9a75c3b311265cd31.npy +03001627-24a83977b422b081eedb66d04882750d.npy +03001627-df6157db2534b72a9a293c6471e6f319.npy +04379243-8ad01793daeda43dbd71cb387c4297a8.npy +02691156-6ca6c7920c62773073d96deff5ddb8e5.npy +04256520-bb4441db7c68a4cec7c8ce3bef5c2aa9.npy +03636649-6d14f1e95641dbb329a42a0444436860.npy +04379243-a860e5edcaec268e615bcf72f8385966.npy +03593526-9b77a0f168b2b8ea620c0ff8940a6989.npy +03211117-73669f92851d3b28eb34db531a289b8e.npy +04401088-8a56e999d75c4d6e8d1dabf86742ec3c.npy +03636649-e7ffebf4dd9176542cd2160e449d45ae.npy +03325088-aa53b268354b84a1b7a867e9b35a1295.npy +04090263-5909ebf625e0d04dfd6d10d22bbd142.npy +02924116-95e2cd84253aafbc1d272dd11937e8b0.npy +04379243-569e2fce2f1ab3be617e9d9aa36a8137.npy +03046257-413c5497de808d1a177ef3150c947f22.npy +03001627-95fe1f3dec357704e27790b0ec8671f7.npy +03636649-8b712f3a63bb01061735ea0e092a805a.npy +03001627-65b8c99a5ab7eb0492ea5a71c9e33093.npy +02691156-a660b01d17f929f54e61a0c2eaaabe87.npy +04256520-19f0a14207f4f953bb1b55ae5bd11e93.npy +02871439-f364a6a23f19c5334a60c1a189046dd1.npy +04090263-3c8bf6360e36d51874b27677f8e8f04.npy +03001627-804c35699b163b7756bc5724b6282816.npy +03991062-e7d1773d6278ba1ba2c59a4d90e63212.npy +02958343-fdcc09ad608e95b4b631b59d5abd1cf8.npy +03513137-cd7ecd4007cf6738807322bc19906e74.npy +03001627-e98fc1a9b608a0c1a8760470bc8702f6.npy +02773838-c5c0f63f94ddf4c258d149fbd24761c4.npy +02691156-a5215569ae825265ff3feb917a6004b.npy +02843684-ac090163657e31d08d6b0dc9bb200f8d.npy +03001627-bd0fab2e72b445bd1e722bceee6e83aa.npy +03001627-fd8c375d0a267d20283b00891f680579.npy +02691156-5de885a47cf8aae2951971f8370d9050.npy +04256520-426d75ae016abffbdfa8261e130bcc9c.npy +04256520-c6c8b57de92a243abb3f330b15ee1442.npy +02958343-86f1cbcda59640594dde7b6e74a2cede.npy +04256520-aa5fe2c92f01ce0a30cbbda41991e4d0.npy +03636649-674a0ba32db48cb6ba2cb2a05654d738.npy +04379243-5151ae4f84a800a189035c25f0dfeb63.npy +03948459-b1bbe535a833635d91f9af3df5b0c8fc.npy +03636649-c359b4c545e5ee3efcb8d8c6d4df8143.npy +02958343-2fceea2bce91439ca26fdd1a1e470de9.npy +03928116-b04647659c599ade7fb4fbe822d98e36.npy +03636649-1d2c6757217bb2797388d403c2d39798.npy +04256520-6660af5568f1fcea324a6d32f13e7cb6.npy +04090263-9e40b56e67c305db74e18e0e7a19212a.npy +03636649-9e3905c3fe967a4dc13933f92cd75682.npy +02691156-45c963d64b8ef3de37678474be485ca.npy +02691156-cb1aff81a3c6ef71d25fd5e3115979a5.npy +03001627-c95e8fc2cf96b9349829306a513f9466.npy +04379243-e5413a9305d52482ee1a5886e50e3f9a.npy +03211117-8f577d90510e94e09506335f6ccd62b6.npy +02691156-a1db8dcb7f1fcdd597190b73ffeacc5f.npy +02876657-860c81982a1703d35a7ce4c111af2db.npy +04256520-d1c09e81d31e38868cbb8bac2032149c.npy +04379243-3f74e2274140ec70705165b0e6ec548.npy +02958343-119033fe083145e22f31600ac759c763.npy +04379243-726a974620efd98c377b9297f3055210.npy +02924116-b778f89a3aaab26c8cd65eae2089c6d0.npy +03467517-f7f1f2430ff969e9eb2f514f87188941.npy +03691459-3855f5027ab422fae6ee52444763d57c.npy +04379243-82fe7fa7a6655955f51f77a6d7299806.npy +03001627-854f3cc942581aea5af597c14b093f6.npy +03624134-6a9df664a41aa590cc34b900bb2492e.npy +04379243-fb9e9c0767a92d2e923b3c05c4c4fae.npy +03001627-49748c9b987b6bc8dbd60fb6b8607ea6.npy +02691156-6341436b6a9df0c6683651cbc8e49e4f.npy +02871439-e445595fe6c85cf17f768772b7a990fa.npy +04401088-8fcae817c180d5224208dfa1c5fa1065.npy +02828884-70612bccd74c969476c40ae77a98137f.npy +04530566-d57e124826aabbbfc6cb0dfa2f14f9d4.npy +04530566-8c3148ee031b15446e0dbba30ac27e8.npy +03001627-7595d089aefd8ed5af7c7ad2549a1b15.npy +03001627-7788afe9baeb2410e8e9bfe58361d5c.npy +04401088-c589332137d854a1808ba9235495a934.npy +02942699-21f65f53f74f1b58de8982fc28ddacc3.npy +02871439-31a777c94501faee5ab608caed81de7c.npy +02992529-16685299c37055c2be40226527c9872.npy +04090263-a5e62a05ffed4b0231f639996cb3d35d.npy +04090263-816df97057a7df79f47439175208c26.npy +03636649-80650d082f6d45fc53fa79783efbc3bf.npy +02958343-5686e48a700bf4c989439bf55b857b9.npy +04379243-6c0ee01fb43f8f46c045ebb62fca20c6.npy +03467517-cebf1d6e25e40224eb86f11fe2a7a388.npy +04379243-99f50ca8fe9b541792ed85b04a73eb29.npy +04530566-8500272b43352ae6f844b7e844d01ddc.npy +02828884-c3d8c664906eb8e57b11ae648ea92233.npy +04256520-1f6dce83e8d582e9efc579970fcfc006.npy +04256520-13f5779fa224ee03490ad276cd2af3a4.npy +02828884-a8e987a6a6486b962d6c8e51365a5a87.npy +02933112-1e91ab0d6eb0053ac59350d819542ec7.npy +04379243-a21d0b3b4ae4436e76bc197b3a3ffc0.npy +03636649-9bb957d69a2c2369c0f9df0cafd74e5c.npy +04090263-937f3a803767480efb6bde4b7e6c6613.npy +03001627-81ba974369a343d3946b850f0cd29857.npy +02691156-7d226c520a29c7705e28caa3b26a73fd.npy +04256520-b32b7dd742f915581e6dcc1ddc222f68.npy +04379243-b9dae236a2dc3476ffd5817f210f277d.npy +03001627-8b8fa92f9c677b0713decb1a0563b12.npy +02828884-efd2d13058330e49d7f638b2b2e0564.npy +03001627-25ad35439836dd7c8fc307d246c19849.npy +03211117-f675d7c91d540e6bb45df535caecae62.npy +02828884-9452149917cb2e27f4fb4dee5181bee.npy +03001627-5912ba21e93d2c5b8bd10c3418cc648.npy +04090263-973181651497efa3230a4d129580843a.npy +03261776-763f06de96ae50d5823e88e264b80650.npy +02958343-1284876ac0e2371aa4dbb766064f8bbf.npy +03797390-85a2511c375b5b32f72755048bac3f96.npy +02828884-d9432798bd2aa338ad5067eac75a07f7.npy +04256520-8f6760875b37750b19fb4103277a6b93.npy +02958343-c59c26c90a724e84ce27281f3b76d1f5.npy +02924116-afdbf161d2482dffc39bbd7cd12a26e9.npy +04468005-14e70ba7f308c3ab1112c737944f1b6.npy +04401088-a2953e7ff6dcd4465af22172f09754fd.npy +03325088-b35cb57337d6330f76c18e71fd49c4dc.npy +04379243-ed5f0875b3615861a6c03a53cf0a14c9.npy +03467517-69ce55087f8ed69fad6d53c0f12828dc.npy +03642806-a2346fd2b76d58bb2aacdb6e0b5b6c83.npy +04090263-74b965dee85e951a818accd7207190a0.npy +04379243-954f39bdb27c54cbeedb4c8fd29e2d1.npy +03261776-99a402291dee883145e2a4e5729b970d.npy +02808440-a879b178b96ede50694afea2e3c77a94.npy +02691156-cdeb868930b32468f879f4163a3ec7b.npy +04090263-ca8c360dd014910ccc34b900bb2492e.npy +04379243-5633513a1cd1adcd9e9d84e41b20ddea.npy +02691156-4bb41171f7e6505bc32f927674bfca67.npy +02691156-2e389edb9a3c0496e1c255da0d1c1826.npy +04379243-647678ff9809303260eb699207aa149d.npy +03325088-50bf9cea0963f340ee0aa55e2c8ca202.npy +03636649-8e4d5fa2a1c91f036a9633583f89b17f.npy +02958343-7f2acaeb45b72793ce6183244062e7c.npy +04256520-8b4a2a614f7b2a9510edd100dffd8d85.npy +04530566-94aeb294adb9be58b05dfc874f00d5f3.npy +02880940-ce48ffb418b99996912a38ce5826ebb8.npy +03046257-88565e0eb863eb31426db14e2702705d.npy +03001627-1926843fb9da47ad8852b93498ca8c83.npy +04256520-839807049a0c29a6ea693790a1608aab.npy +04379243-8106aef3eb88f9e4578defb131c3ea1d.npy +02958343-31cfc24310109174b11647ffa4306609.npy +04379243-417f1c15c20966a54f5039bed03ee12.npy +04401088-855a8a4c39e8fe81a060e584e7409aab.npy +03691459-3cbeb01fae7fb6ec7238b5c2712646b7.npy +04256520-b593b430e799ac4af256e6841810978e.npy +04530566-19640fee71ffa82816581cd5751ca97f.npy +02747177-d828e4f441b150b460174b3ceb24976d.npy +04379243-82109c884a0e195714038d588fd1342f.npy +03001627-2b85487133b04a543f86d4a1692234ec.npy +02828884-6c47b6b082cdd9b684370b1677f53d8e.npy +02691156-b71c16266f1674cd884ccdf529614144.npy +02828884-408ef9729c48dd40bb273d6b4d49877f.npy +03001627-1eab4c4c55b8a0f48162e1d15342e13b.npy +04090263-1caf976f39c934f1589c07868201b17e.npy +03642806-67387cc47a39a4b1cd4fb35969ac8028.npy +04379243-c15b0b5f7d835b5012660c1de94a79e.npy +03467517-727fcc85add981325e683993f34d42f2.npy +04379243-bff0d461cd0fe835b67d6c1fd03fd403.npy +04401088-257ef557fee9c083324b3288c1587efe.npy +04256520-b0ed631f887c522519fb4103277a6b93.npy +03261776-bc404e52bfcd2038538cf6df9faa9b65.npy +02992529-6e6d7c2ffadc2fad2fffec7af390883.npy +04401088-79f11cd09522565fecb1ea9fbacd5278.npy +02691156-65b12fc357604a2587b2a887422ab97.npy +03001627-7f539a846e9e88f0d9fad8aba2c312b7.npy +04090263-96c96b2569853438663e90eaf6b4ca52.npy +04530566-25c736b7ca26bcb7bfccc00eb137e6ec.npy +03467517-35e77edd3ae6ad4993f0194265a9746c.npy +03001627-2576091d2540147a473f10e6caaeca56.npy +04090263-2621cca0eaf82143f9014984f90a7387.npy +02958343-4458ed2a746e61a3b11647ffa4306609.npy +03790512-cc213702fcec23677395d58407f193ba.npy +04379243-52cb81e736aa856cbea68008b6e5c5b7.npy +04379243-5a0c76bb4dd53d13a6c03a53cf0a14c9.npy +02691156-5c306ddfcc08ea1b230ac8907b9b7f90.npy +03001627-d91457217673528ef91663a74ccd2338.npy +04379243-912c044ef5e129522c98a1adaac88b94.npy +02691156-a5beb33ba75edd59485e40e44ec62786.npy +02691156-8df8e2580639b093c1006ed55bc1a3fc.npy +04379243-109738784a0a6129a02c88fe01f2b9c1.npy +02691156-fb9deec3a422b06b609e2d916fa0da27.npy +04090263-87f0e810c573b90c803b54e9738b20a6.npy +04379243-9287845470d119bb940b945d5ba9958.npy +02691156-c57409c95dd4bafba5a118bd15e6e34f.npy +04256520-db01af2b84f8a9f615a72fd59f390cc3.npy +02828884-389f2aa083a7d732f4b6538438a0b930.npy +02747177-d7394e554aff20b2f155d75bbf62b80.npy +02747177-e500097e7023db9ac951cf8670bfff6.npy +02958343-22c0b90fbda00bb9a3a61aa922ccc66.npy +02691156-670d455bf1bdaafdf577ff4de1ac394c.npy +02924116-dd63a0f6eb852d089797a4124a9f002f.npy +03207941-f8a673d7d5e0c410d48855885373053b.npy +04090263-8f48e9f97dc644ca8752becd01cbfbb8.npy +04401088-b801c4ebbc1149b34961b0d325e91640.npy +02992529-b7ab1b6f7dc5026dea8f4709e6949c8.npy +03001627-8f77a33dbdea3d19492d9da2668ec34c.npy +02691156-8686ebc30c07b53126360e1e29a956c7.npy +02992529-bc301249d58b89b638d913262f25e96d.npy +02808440-50c67260bb9322e8ebc740fe800c0367.npy +02871439-db6c5f944751d4a0eebb0db1929cfe93.npy +03001627-a2bffa12e0737e66febad4f49b26ec52.npy +03636649-36943f6afca6cbf518134b529d13e79a.npy +03636649-55eea74e6f73173b49904d779af64a6e.npy +04379243-731561e2626163e8a4dc6822aaa2cf2f.npy +03046257-e59e73bc340207bfe214891c68fa8e36.npy +02958343-7c651c4f55c5ca57d76439fb95cdd2ed.npy +03790512-d929925b54d82db139e5b34b546caf02.npy +02992529-177a44b5e36fe9856e10bfa9f3e32b96.npy +02924116-6ec626a0a5d7c9f84d44f5db04bf14b8.npy +04379243-a70e1160739fa533f820611afeab68c6.npy +02828884-437167659b0b5a8fce8fba09dd640742.npy +03211117-4744bc26253dd076174f1b91e00d9f2d.npy +02876657-681e91bbadebeac529471183b63392dc.npy +03928116-3c9b7b7fe4a349c618dc1e4c79721773.npy +04379243-c8b3d39ca53c0cfa4b3c42e318f3affc.npy +04401088-f4eda7905f55d1b382476058422e4a4d.npy +04090263-c0a429d6e4cc9d0366597c7d470782b4.npy +03691459-3c467fca7449a857a2b4d33761839e86.npy +04256520-b44d152534373752febad4f49b26ec52.npy +03001627-631807f69f02f1785532b747eb9b3728.npy +03642806-59c7c6a65cf462be43acec71ba42b6b7.npy +04530566-c78d6f5c908e2ff1b05dfc874f00d5f3.npy +04090263-6fcfd40ef3d8dbc1046a0002e847ad2.npy +04530566-13c289d915523f2348132c07d51cd81a.npy +04379243-d3aeb75da27b505f1c9acd0bdfdc9f62.npy +02924116-d9d1d7161c59786fb58d6ede2c134ee0.npy +03001627-92b81e84090fdab2f027786820c3fec4.npy +04256520-5e3be8a7a61235dc2099f9e22ca45b04.npy +03001627-d7867d215f52107ba5e8cf3aa1686d66.npy +04379243-963ead3bc27459b2f51f77a6d7299806.npy +02880940-dd381b3459767f7b18f18cdcd25d1bbb.npy +03636649-a1db02b6b7264b6d1cf9f632ab9ad62b.npy +04379243-f8f8ff7d9cfdd395765b19233e844344.npy +03624134-cb0eaaa84ca1be4639c78a1e40e247f3.npy +03948459-6de6e56c6f7d43692866658c90231a1a.npy +02691156-de776175878f17d1f4c1adce71073351.npy +04256520-ca8c140ca26c4d6cc9b96a88ab877904.npy +03001627-6b00fdf6062389ad738dd0d3509c7e47.npy +04379243-50505520611014b07298f1711edd69a0.npy +02747177-637a9226a0509545cb2a965e75be701c.npy +02691156-4515ac65d312fdbdb63361ca9ddfc9ae.npy +03001627-f9e8a5547d89615dfcce6278f5ffb13a.npy +02691156-46f9b86c1292366fadc12de54d203570.npy +04379243-3c72ddd0dca19bbedcfcef693e7ec696.npy +04401088-aef45c975ed647778768dbb598f40c93.npy +03325088-6136a19b81e5e70954d7082b34825ef0.npy +03636649-5f0a23ce527d0be52f38c0d2792fb5e.npy +04379243-a26897b681a3841aa81634d14a6ca786.npy +04379243-d3a5f7b56e3e6e1482e6c3a4e742651d.npy +02808440-8346416e382d3a3fccd0340812259a39.npy +04379243-2dfdedc4e2d10ccbce9509a520498ebc.npy +04379243-acf0ad26f9feff411191025061735ea3.npy +04379243-8143949bf6d5e294ff2c800153491d59.npy +02958343-f4c4bc930957be4951e9a28466112d97.npy +04530566-ed94229d6bb18b783f351db9d8c0e76.npy +04379243-6def73c13a40922d9274d508495753d2.npy +03691459-90143acb141fb1cb4292de5cdfae65e2.npy +02924116-f877396a3f529e21a71edfed1705a549.npy +04379243-bab86ce3e5bf3aac9715146e52a0621c.npy +03001627-f1933161d8b49d8dfb266533561ee98a.npy +03948459-3b4f6cf1745e0a44a04d2f46d86c50a0.npy +03636649-715be273074283557062f2d72cde5c95.npy +03001627-ebd73aa8ec2fea5c36c26b54df360d91.npy +03593526-20de70652a72eb4ae27790b0ec8671f7.npy +02958343-d5d47fe322179a83473f10e6caaeca56.npy +02691156-3b82e575165383903c83f6e156ad107a.npy +04256520-2bec1d8c0e8a1b3b7b98092cf509b83.npy +04330267-f8ee8e3ec6e56b8d5dc3653f8341633a.npy +04099429-731db7871e19a2efddf75684fdf930e6.npy +03636649-20ddd6039bb61e97fa01175e0dff0063.npy +03001627-1bcec47c5dc259ea95ca4adb70946a21.npy +04379243-734c761c6fd2b260b4c161851ed2b4e4.npy +02691156-f12eefbbefabe566ca8607f540cc62ba.npy +04401088-d740b0679a9996ae56acd5d5597a72c4.npy +04379243-d65624cccd27e85ce8f3ad90cf010c5a.npy +04256520-bed08d3f3d82bd2f37b2bb75885cfc44.npy +03691459-709864406b03fa2f880d754debc41bc5.npy +04401088-832d6075c8fafe4de862e3cac45aa769.npy +02992529-ce0ad218c6b19e76e7eb1b9b386befd.npy +02933112-595999124367c701de650492e45fb14f.npy +04530566-355f5aa01c79fe1458a8952c93ff9829.npy +04379243-3763dc87aed9fd73be6b1cdaab15028.npy +04090263-b38371493e6c31ba2e2849ea51389478.npy +03593526-e51c76a9d10593a9aa5b514b364ab62b.npy +03046257-5fd0cd70a717e36914038d588fd1342f.npy +04379243-fe57d6cfb3ba455fc35f1f8a8febbdc4.npy +03001627-a02d2ef9789836981bb088904f7cb154.npy +04530566-4f245403e6366d48fb3294f1e40c8a29.npy +02691156-3c7e4628a9ea201bbf3143b1cb6076a.npy +03001627-ea19940c812803d1383b5acc757bd668.npy +03001627-6da85f0549621b837d379e8940a36f92.npy +04090263-3e25cad3c3379be6bbfe0a3a537396d.npy +02828884-53e3f4b35e8c992e954bfb4cc0842c46.npy +04379243-68794d2e264ea2d75cf2470a6eb9a24d.npy +02871439-6e8a54f0f1d0c698b4dbc260302abeb4.npy +04379243-ff2b5b315173f3244fb315ce917a9ec2.npy +03001627-470ee88d9cabc6028be5ba60d0b948a6.npy +03759954-46e0c1b2e0635a111ef58b31c4ba0d15.npy +02691156-2176fa9f69e5e1dcca8607f540cc62ba.npy +04460130-6e87ad11e8c3c273af621148ecacc588.npy +02691156-480d027eea9830b511c04c8a3e94088.npy +03991062-da9efb2601fd872d2ef1c225dc7772c5.npy +03001627-41ceeeab52fd3ed3a341228b21d337a9.npy +03001627-98c78b59a5d97666dcad73f240f03a20.npy +02958343-9fc18cf33ac91041425b2c354eccabaf.npy +02958343-51d9af66315d76f9e6b335b85df4d203.npy +03636649-364ea921dbd5da869a58625fdbc8d761.npy +02818832-37ca2cb730cac30ea42bba87fb4a4a5.npy +02924116-fa7c1c950b99389e5deb3d7d530fe881.npy +03001627-2c03d0a4c83f0e89488017d48a7f7eb4.npy +04090263-31f4d647d59ecaaa5d0dded52efeb4fd.npy +03593526-c0d6cd0537d0fcc8235e3c816d887b3.npy +03593526-a2da2f83adf04371d680196133d8b70f.npy +04256520-69eaeff55a5a9c5568d1b9a1d97e2846.npy +03211117-f7effbc133537f0aa5d0c95600bf54cb.npy +02691156-ee92bc35ee989f59271b3fb2659dec56.npy +03593526-712db68c0889d82925e0f641bff885da.npy +03001627-38abcd9d3157f7fe71a782a4379556c7.npy +03001627-be67f51c3df7dd165b9ac5a4b39649c.npy +03211117-cf4c78178c9dc8c292df4681ccc21025.npy +02992529-3d5401f4ecab9be91aec2282dd8bc87a.npy +02828884-b773f8d5af2c1087cb2a965e75be701c.npy +02924116-5f67a64225eee1d28e7126bd2d50de26.npy +04460130-547e1ef6922840b23899914213d0efde.npy +03001627-7e4025dcdad5415386c701087a194026.npy +03001627-6a8f1dd7e0642ca4b367a648e9b173ab.npy +02691156-ebda573deda43034f2b0736dd4d8afe0.npy +04379243-6962c6b32fdd0a6d6b872683e72852e1.npy +03948459-17e9d8c1b7e7be20213f0776ba8707b3.npy +03001627-4fe3809c20606e5369d8d5b35c38db0d.npy +03001627-d3213947dec793de213c3458a0fe5598.npy +03001627-797ad20122fb300659810674e1df4887.npy +04554684-43f60a28b62b616573d8be0e464c51f5.npy +02924116-5809985c32fd5bcdd81b677cc22e58ac.npy +02992529-c0969979d6ff51f3db27d84853613218.npy +04379243-f16f939baeb7722e664b3b9b23ddfcbc.npy +03938244-6415c868620b99a061c93a6de3b6bd7a.npy +02924116-76f657e27f2aa86391a491e8257bd6fe.npy +02933112-90b901d37c751841c93205b4771d5663.npy +03001627-60d11f54c4d3e1d856232348d1bf86cc.npy +03001627-725184eebea99d42a49e2dd37ae1f85.npy +02828884-7cccf8e8ebd9454fe42c56c78fb88524.npy +04530566-2a301f7070178c028cd011e47ff1df1.npy +02808440-af592551a5f44e8e54d7082b34825ef0.npy +03001627-19dbb6cbd039caf0a419f44cba56de45.npy +03001627-a7bc0f5b5d73df73f51f77a6d7299806.npy +04379243-2447732fa2e0d8d870febc66c2c7f4f6.npy +03636649-fc8345dacde827e376e9713f57a5fcb6.npy +02691156-70e4200e848e653072ec6e905035e5d7.npy +03991062-9b1c55fbfa0c337b81faebbdea6bd9be.npy +04090263-6e127603e720af7855731e75c389c9d.npy +02958343-58a500adc776ffd5a9655fa3e976d18a.npy +03001627-2afa06a01a0a15fc504721639e19f609.npy +03636649-f72efa4574100c12a8930422448288ea.npy +02808440-11d2f19d44c24eb53321831d2245cf06.npy +04090263-204decf8bb9bc9e623c69c7ff0f71040.npy +02958343-3b41ffcb4bec60cc21a66e8dfcce514a.npy +02828884-f0daa96d0eb986adcf729faf809733b6.npy +04401088-388798a892636235d2a526c0a7ff71e.npy +04401088-af983238a3e47692f90d7ee51bc3530a.npy +03636649-28b50bd5aaee8c4e7384352a7758c897.npy +03001627-23b0da45f23e5fb4f4b6538438a0b930.npy +04379243-ec7795f1efb90af9f37db3b69001ec04.npy +02958343-e7b500cc55c8f13b4512af8eced68fa8.npy +03001627-d9a1f2e7290cd2c3baab0c7159046dc4.npy +03790512-33b1973524b81c4ecafb6b9dbe847b85.npy +02871439-964e866377b784ab58bb658c8a827077.npy +04090263-19949be9b9eca5c667a4cd2863eb1ca.npy +04379243-edaf24be15738ea2c5d1c45cadcaa3eb.npy +04256520-d2711d46aac0b5ed492a9f7c65daa58d.npy +04379243-b5eaf46797ada237738e43095496b061.npy +02958343-4bdcae58e18e4c94c1bbb501b1d87871.npy +02691156-67eac921334c130c336fa8434b94be14.npy +02828884-8ed3f1b59a74ac71f155d75bbf62b80.npy +03001627-d14d1da1e682a7cfaac8336231c53cd1.npy +03001627-6c0b7ec41053d2e463860398b0d16872.npy +04530566-bc4ab06257678e8db25f0198c2ecfb0e.npy +02828884-552ab19eab47725cb2a965e75be701c.npy +03991062-546025d656c166562887a88b1b446ef8.npy +03761084-a635200a9c6258cc1dc59d2adbe5297d.npy +02691156-eb5baf7bb88c1499873ec74c119307b9.npy +03001627-fbafdfd16d929c715b52e74a988c7255.npy +04379243-ed30d775da40ee9ebd907eb5031fe9ca.npy +02992529-d659d98d384e2c37e405d2e0f546cab.npy +02958343-373ddcf15e21eacc3cb72b063dc95295.npy +02691156-3b9c905771244df7b6ed9420d56b12a9.npy +04379243-1f036102a311fdc174813b7165294e91.npy +04530566-338e37f313d48118789eecd157794d2a.npy +02992529-38afc0467599bd6bfa13d53e5e4a7d2a.npy +04379243-edc14df2b7e3bed1b15370175a9d2c81.npy +03991062-f84d30238a4784b9a2c59a4d90e63212.npy +02958343-415c24869f57fec9d9e74b7f1cf9cf3c.npy +04090263-f1f780b6afd284d0764c65bdf1040995.npy +02691156-e1a8e2f93abfc7d590baeef8ba5b93e5.npy +04379243-aafc579804cc095cbababe11fcea8796.npy +03001627-8ce2e49ab9f58811610c2a68437007d6.npy +04530566-8e431fd55a7aca0b124dae0a32996c4c.npy +03593526-5d123380371637c330b9e09efbedfc98.npy +04379243-fe621b83750698a6855931d119219022.npy +03211117-fb92cb1fa04c2ba6bf1c304f780914c6.npy +04379243-445402730a420ee63190a57d5547dcac.npy +02958343-3671b83524f48dc5801b0db1d49ea10c.npy +03691459-2f9b00e9c1a1b00c47569806bbb7c5a0.npy +03001627-b2ba1569509cdb439451566a8c6563ed.npy +04256520-f2fbd71be2c50fd89fb1d3c5138b2800.npy +02958343-d157bd15ee2d92b0bda733a39f84326d.npy +03001627-e767b27d6625f905e9af7c2087a87b0e.npy +04379243-482fad8b18008ff8c6540fe6bc16d6f.npy +04379243-e3fc414b6b9b52ac50d71b436e21a7da.npy +02828884-28b9f2908f0cbb179c21c139c0613648.npy +03636649-892900c66731d9c473ab7b7128d466a2.npy +03001627-569500b7add934625090f949bc5dabd7.npy +04256520-ca7dc4294b1080acf256e6841810978e.npy +03211117-eb712261aec94a8ddf8fce61d01de43d.npy +04379243-7bdfc4bd3fde9066b0028474d8c979d1.npy +03691459-2c4d13cc64a679f3322f30a0f4208183.npy +02958343-e84eb770bb6cedf3bda733a39f84326d.npy +02933112-6ff13af4d409fd25c3c22f38f0cbdf9f.npy +02946921-4cc3601af4a09418b459058f42771eff.npy +04379243-6620b366c1532835789195d85b2f8718.npy +02747177-4dbbece412ef64b6d2b12aa6a0f050b3.npy +02992529-c3e0378cf861099ae3f7a74e12a274ef.npy +04379243-333002057d45adfa7cc56a6af4771185.npy +03691459-b96feb6abb039ab8c7c56d4a401463d1.npy +03211117-165531f6138b14eb107d63d06953370e.npy +04256520-8e9de6e848ed53a248cfc982ba61d3a1.npy +04379243-dd9782826dda1284b3104e94482ea9ce.npy +03001627-e275ae27990e21988d2d730aebe7865d.npy +04379243-24bf4d4382c6bbf0d99562b7e15abcc1.npy +02958343-10d388f6f578e4e8851f021b9ed69c58.npy +02924116-8ff82359ef1ab92e52470de2774d6099.npy +04379243-316a52439f11450355f46d55537192b6.npy +03691459-5b9b77ad6ce283a398e4bc44d45a32e.npy +04554684-360e2cb74c9c4d38df3a1b0d597ce76e.npy +04379243-dcae4e8f41346522e1448c25c538991a.npy +03691459-b7f4de208a1051e62a27a874411d1ac.npy +04468005-d12a8d45a7a6cb188593314c6dc5571d.npy +02828884-8b98dbc11c5d2fb7601104cd2d998272.npy +04379243-189f519f6cb7b8c516fdce62f5c06e29.npy +02691156-c0796e38ea7a1d9fbc0909d98a1ff2b4.npy +04330267-270e25863ba6098b0a04bc414beaa99.npy +02808440-7ce00acd26d3ce63125fa9990176f0d5.npy +02933112-acbc349caf76e6b171337fa12bff07ad.npy +04379243-3802e59d5a3970d5ee6f3ff2305dcb14.npy +02876657-684ff2b770c26616d3dfba73f54d35bb.npy +02818832-34292cd1143461a6bda4e7fc3e4df4d4.npy +03001627-7f11f4251d2faee4492d9da2668ec34c.npy +03593526-a3b9caa337ca7c8e6597d391ab6fcc1.npy +02924116-49e79427faf2694811d89826bd8e0670.npy +03593526-3e2dd918360309554b3c42e318f3affc.npy +03991062-38b2432c5a2be4c95d8d4d8a3cf8b294.npy +03928116-1f7301bb64526ce9d4cdf759998ef5c2.npy +02691156-4e4128a2d12c818e5f38952c9fdf4604.npy +03691459-8cc5a2ac83bcc120e7a1105f5e7667c.npy +03001627-cc5dea482768651ed0e93cdb469eb63.npy +04401088-d130a357978694bf58efc722b5cff71c.npy +03046257-247ca61022a4f47e8a94168388287ad5.npy +03710193-914fa58a47245909a0dcbb80c5a68d2f.npy +02876657-5cbf1e8f31bae4cd67d1cb27b1ca00d7.npy +02876657-d85f1862dfe799cbf78b6c51ab8f145e.npy +02958343-286ce4a8390b317f93680c5a9a367b4a.npy +03001627-b9ac31cc001a0ab72a64ba172c1ba615.npy +03691459-f57b269b91e369f07b646fca2237eb6.npy +02958343-f1b97d671bb93ad928044fe9244db50a.npy +02773838-e0eb0b7925869326aa7b926be24dab3d.npy +04256520-8a85b0675605ed8219fb4103277a6b93.npy +03001627-5e338c489e940ab73aab636b8c7f0dd2.npy +04379243-81fd25d9d26de497c34335c1a2a9193f.npy +02958343-706671ef8c7b5e28a6c2c95b41a5446d.npy +04256520-5b7b8b094a52794675543092060e57fe.npy +04468005-936eac04b6a873049954eae9164faecb.npy +04379243-e2a56bcdb18d820047ad57fbec8be0bc.npy +02691156-c950fc7d559f30016e86a8ae6e1f4d7e.npy +03001627-33aaad494817a6f4ab705559ec99536f.npy +02828884-ba8ce85fe8f294929126d89585a68a7d.npy +03991062-86dc5ed985f2efd268ce23faf6fa0bec.npy +02691156-37b413fb76f97e0a29ad19c61d540866.npy +02924116-cf2c392c427c5a287a4d6e5c691fbefa.npy +03624134-ac2ad0d425f80152ea88f776c5c6a310.npy +03001627-f854fa8ee2fb6d715936c7265c890fef.npy +04379243-6d5211390473c3bc3bd24f986301745.npy +02958343-4aa7fc4a0c08be8c962283973ea6bbeb.npy +03001627-5ca0b01dae9e3476f51f77a6d7299806.npy +03001627-cc5b5e367ad8eaf19fb4103277a6b93.npy +04401088-1e52452aeb4bacbd83156841b8188cc7.npy +03691459-60474fda23d64ef0debcce788b4a424f.npy +02946921-297b1ba8efcbb6a86128527957a7bb1.npy +03691459-1124d162420a75232633ff66beb9cf31.npy +03001627-66e37e1831d3e49843638dabe1eb5336.npy +03991062-45d80de406c4878b59c0d8b17a41b6f3.npy +02808440-8738c8df22c4847fad99c01a1a18d1c4.npy +02828884-fb861f0e4e7f528fccda8d28b44378b7.npy +02933112-53e5fe30d92d6733e6c5cd45aa112726.npy +04460130-88b8559c748d1d326eaa9b51f546908e.npy +03211117-ba5518af411cffd8cfe78be5b7b99c8d.npy +04530566-5edcd7984de7fd4b42cdbb9140b25a0d.npy +03928116-c1b63d9e33a7f3b1741447c6658311e.npy +04530566-c2d71194be5909a75f71e6fef75fd750.npy +02933112-594128786d7aacf26f2c2a3461eaa93.npy +03001627-3ab838f55e56426b35836c728d324152.npy +04379243-132f7a4ddfe7f230fd6ec91a99a73de9.npy +04379243-f6e56ad2fe9e6c30253be0083bb3c718.npy +02992529-88c3248ee6950fc3d24be492f98354f.npy +02828884-8ea569854b8dfc8022b74f7ed4070ae0.npy +02691156-4d885cb269ae88ccbc40166c69b12cc6.npy +03642806-cc67f6608c41743ec1830f8ca7a3cbed.npy +02933112-7a48b295d6c3956fa96fd0f479def5ab.npy +02958343-a55f4932b0f8a212402257734064a917.npy +02691156-4ed5983b7721f1da7f79d93424b708f0.npy +03691459-b14b479cf64c7d9ad77ea5e1afa5bfe6.npy +04530566-313aaf9d79105fea82fd5ed7e39258c7.npy +04256520-6b569ad307bc38c06eb9b08c8a74d159.npy +02958343-40e51788da97a9c7212ff4933c4abe56.npy +02808440-a14611b43f16f0fff0bee563b25a27d8.npy +03624134-8d3142e751030a211395331ebe4786cd.npy +03001627-d38a49a15715c46ec3bd24f986301745.npy +04379243-a3f86421758cec25a092cc351404fb5d.npy +02828884-14a73dd6b5d7ef35feea12256ad59f11.npy +04090263-7cb94f3b4bda0dd9783a7c2adc432e76.npy +03001627-a235f7c4947aab15bf40bda9de89848a.npy +03467517-408a8e1b51266b9ccc34b900bb2492e.npy +02691156-4875318127182dbd15aba2f83720a298.npy +02933112-7f137684240ee0d62fb11210723490ee.npy +02992529-2acc3bd87282a7e31da45817bd55c1e.npy +04379243-c92e4772e218f5cbef9e56a2aea1eb90.npy +03001627-9ddbf01abee716b39b0530265e62c9b7.npy +02954340-90c6bffdc81cedbeb80102c6e0a7618a.npy +04256520-3b37e15f2dfe0bdf55f9a00acc25f137.npy +03001627-f64aa038d1e21e0ad2ebe04c523a4739.npy +04379243-4c8472bdc535102870553da2430bcd98.npy +02871439-5357cb17dad20db549d28b1865273fb2.npy +02876657-8e20da9c3f63ac2ce902acf138e668e2.npy +02747177-8b0728eb28c1873938f21a3304cc4bdc.npy +03211117-5305858e5ce441d65fabfc69ee61b28b.npy +02958343-d76c9eb102316ac631a8860374e7eed.npy +03948459-4648980f23149150edfe35c9179614ca.npy +03001627-acf23f78322f00f219fb4103277a6b93.npy +02691156-d6edd8b0801a02baf7571913c73c0c78.npy +04379243-d4de4deff5410e2be499c77acfcee9f4.npy +03001627-4042faba97a901aa08cd647a48e605d.npy +03642806-5173aa7f75ff3cf1b55fde51a411949f.npy +03513137-8942f437af8771afa1702a37604ec6f.npy +03001627-bce5c7402feef6d235fce1b314c89aa4.npy +04530566-26bdd8852a95cd2d4e4ba49b2943b913.npy +02924116-904ca55b79821ff85dc6bf5b8d674d37.npy +02773838-f1c9ebc8417c029a4da5feafe6f1c8fc.npy +03710193-1e4df43ee2f2da6967f9cc18b363cf72.npy +03001627-2fc6eef6605be9a4550584dfc8970d11.npy +03991062-be0b5e9deced304a2c59a4d90e63212.npy +04256520-6315fad2852149fc19fb4103277a6b93.npy +03325088-d67146079abb59a43321831d2245cf06.npy +02992529-5101c0131cdf76d03f9d84f9a87a44e4.npy +04530566-c19f98f149ee5da8b1bb46d2556ba67d.npy +03046257-b0b7d5ad6219ef0ddd425da1a5e9a595.npy +03636649-c898f9b1dddbb8801735ea0e092a805a.npy +04379243-2a963bc9ad704e5f525b133235812833.npy +02801938-5208bc4450a16d0e4b3c42e318f3affc.npy +04379243-2f32966fc64688969a08db804545b684.npy +04256520-40df73dfda0e26ce442b5d6d90d0cc78.npy +03001627-dc0bc65e9181c2f698eb62961a525575.npy +02958343-dc9bb9540228dbd4a8977f240035577b.npy +04379243-5de8e8b5034ded6b707cdefe012d0353.npy +03001627-f90dab51bec2bcd1a3340564b56a7f70.npy +04468005-2085c9f2619ccb014b0b2e6e63122009.npy +02828884-ba5e47b9a08c33d1ad1f278e1513f3b7.npy +04379243-a42d138bdd78cfe640abe029c3c77771.npy +04379243-5d65f46bcc49eef08b378a8c4400c79b.npy +02933112-9a688545112c2650ca703e831bf56f93.npy +03001627-c04d0cf81d9d870a7aa0699f5d30fdef.npy +03001627-c41ece3374d0e860e32cefe0e484fed3.npy +04554684-c6f9e7650c898b017b197b8311051a3c.npy +04090263-34eb6b0af5ae9f26d957eaf7f4edb205.npy +04090263-c42fe5b663661e1b4b004f8ab4aaf710.npy +02828884-131edf0948b60ee6372c8cd7d07d8ddc.npy +03991062-5856212eaca6fa76d4665c9b5f6f833c.npy +04090263-9204db8d40b7fcd7fa45f4d7e1ef7d0.npy +04379243-f5f5caaa07335f4e5c3654528317cdb2.npy +04256520-c856e6b37c9e12ab8a3de2846876a3c7.npy +04530566-71fbcc8e65022567b031dd7b49fa6191.npy +04256520-f9f8f089be14d5b672b33dfe598bdd77.npy +02933112-a0dfc5cd7e2331e6166ddaef2c2c61ae.npy +02924116-28e81e16c2c1e2723720164441111d99.npy +02958343-53a604e4037c650beedcafe524c3dc4c.npy +04379243-72f98e4a45f971ffaa0fb4126a41efc4.npy +03938244-c1f39c4bcd931875f51f77a6d7299806.npy +02871439-89f1540881171ee3f4c4977ed0ba5296.npy +03467517-ea0cccc085a8c4214f99643b5c4dd7ca.npy +02691156-1492ab4cf7a345e34b6f686803e61ffd.npy +04379243-223fbcc813831d8c6e526771d2f7444e.npy +04530566-fd52c80ae21d19251e0d0f6bac6856eb.npy +02808440-aba9f8d311894cf539d4219710154fda.npy +02691156-f8038d33c212f81fe99ea3c41458bc01.npy +04379243-70e58cec417d5e1ec283ca2c9df7372d.npy +04256520-67711689ee7d8dd76b4675882670d943.npy +03001627-1006be65e7bc937e9141f9b58470d646.npy +02828884-3e850a85b7c0f82cad5067eac75a07f7.npy +03624134-5314b350d816db25fa3fe405f2a25e27.npy +04379243-a8713681fccb1d647ff6ace05b36a5.npy +03691459-8671e50787f3486e1ad88f716ea80910.npy +02691156-f56cde19efc8d428b03f97f6dc2a21fd.npy +04256520-15c66bed7e6bdf85160c7765c528fad6.npy +03001627-73f16e230ac102536e07666ce67ff5a.npy +04468005-759db14cb3d146c28a3bb66b1c21b5ce.npy +02958343-ec07cd8db8f2bea851f021b9ed69c58.npy +04379243-4fb0bfbe85fce25cf9a2c981b043f98a.npy +03636649-ea7a5e58c0462957edf4c948f5a7c441.npy +02958343-5a728c7371f8fa3f1e0401312b984eca.npy +04090263-609bcf41c9d33c04fa9286f039319ff7.npy +03001627-9850d225049f987e9b9f2eb77f5e247e.npy +04530566-2e620c48f90f6fb2f569f587daa38158.npy +02828884-be8fa5b70de21c9ff155d75bbf62b80.npy +03642806-3b2bddb0e8ff57c85831a0624cf5a945.npy +02828884-b358c31d1bcab88a26b5e3d0c65cd557.npy +04379243-e153f757330a4ea3cdd1f51ef2b8f2ed.npy +04379243-e296f2e967aad03a55f46d55537192b6.npy +04256520-a5d21835219c8fed19fb4103277a6b93.npy +03624134-5eac9253e2e8803b67b50160faec8785.npy +02933112-a4caf30bbf028b63713f083e39bce318.npy +04379243-f323d90dea57815e119555fc7462650d.npy +02958343-52cff656189850a2546b7395fb17f97e.npy +04090263-cc380bcdadfc3040ab49837258a1bfc5.npy +04401088-c13cfcc92e41e5a924fb403e4bf9a6b1.npy +04379243-43f1b98f950af6d04f3443b22038d340.npy +02958343-cf4c819d9deb6533108499aad0a89b28.npy +03001627-77eb55272e3c00f2cb774aa5a7f9653.npy +03513137-77cdfb9d433531c6a8963fe61f2bc75f.npy +04379243-ebece7c581e3a42c32ba69f5f654ada.npy +03636649-19acda4f74d91d908351668cf609c7df.npy +04256520-ea295fb4335e3499f51fa0238791f5dc.npy +02958343-ddea3123599a628ebecf71e2e014ff6f.npy +02958343-2ef03b91692d6dae5828087fef11ba9b.npy +02828884-e8ed5a53c78744aa600895f6141c10ae.npy +04090263-92a71ab8a9862a5452d6d9553235a14e.npy +02924116-e90cafea6e6d9054b129901f80d24b7b.npy +03001627-dd78c16d85780d6b413102507b68bcb5.npy +03001627-21f9dcdadcca16227ad11050da24bb12.npy +02828884-96fb3569c007fec46dbc2b0ff6fd8e0c.npy +02843684-24e3f96618446a3ee65b26d9dc163c75.npy +04379243-2ffcf26e3cff97ee40b4c5428883e585.npy +03636649-8b7ee8229a579ee135836c728d324152.npy +02880940-5aad71b5e6cb3967674684c50f1db165.npy +03001627-34dc6c4e022b380cf91663a74ccd2338.npy +02958343-bac6953b6866ec02300856337cd5b2e.npy +04379243-fac2aedc7b6ab4b93002761e7a3ba3bd.npy +03467517-7e78c9080d79e7d3c0177b7521e73828.npy +04379243-31c278a2aa2a490241fe42b98fee4b0b.npy +03001627-3d23d594355c65d9376f771510e6da27.npy +02691156-55fabcb7e7c11560fa6bb68bdba0e663.npy +04256520-1acdc3f794d927fd63fba60e6c90121a.npy +02828884-7e524d1958ca0348d6abb4efd157f402.npy +03001627-40fc53f1c111a19c7d3c9de9415fb224.npy +04401088-298ca71453baf6ee2a9eb0f146e94477.npy +04379243-4f64eee409e34b41aa8d36cc58ba1cf2.npy +02691156-2de92a57e410020cc231d70e1e0cc567.npy +03991062-dec28aebe77c1ec4a2c59a4d90e63212.npy +04090263-5da81098c784b512673a614c45f3afe4.npy +02924116-af6358f5b2bc3b2a859e9bc6b5cb2580.npy +03001627-736e9ee917f741193b908295ece2b069.npy +02691156-5dd2324cd6ebf52e293fdbda4e7beec9.npy +04530566-388c5175593b057a66bc841ba9cad258.npy +02933112-b67d58cd774ebeaea480742f4529182b.npy +02958343-c631ec6f38a5e1d7fdc1d9a76d31d55.npy +03636649-d90d20f02ba8fb9a6bd00d0eaa99c3c3.npy +04379243-ec9d241cddcdb149f5a6ec2a96a47435.npy +02808440-3b501fa442876e4860fe69425c98b781.npy +04379243-d46537f513283d6cdcfcef693e7ec696.npy +04379243-c479482694623359fdf2e93846e20960.npy +03001627-e53b07b648e8d041107a17cfae0b6df6.npy +03467517-dfa75192819d2b89d909dfebe054cd91.npy +04468005-e7934a1982f37a695c37515681ce1368.npy +02747177-bc0ba7a521f9c61dad5067eac75a07f7.npy +03325088-a360dfc51bae92cd76d20e73c57c9a03.npy +03325088-79b89dc3e5809c5450da8b99982a3057.npy +02828884-516f47d7763d1db5ad55477d55e7af82.npy +04090263-291534185aa7328217ae750b40e40d3e.npy +04379243-69fa3275d6aaf1dcc9ee6bf6bfac3917.npy +04256520-26d165613b7baf134b3c42e318f3affc.npy +03636649-47adca3b217160d4b0957d845ac33749.npy +04090263-99866ea1b82e18c982cb4f2e118e48f4.npy +02958343-d0bf09ffa93ba912582e5e3e7771ea25.npy +04530566-52ad452f1c63aee5a66bcb069f7626a7.npy +04530566-b33a673da4745b08b5ee11a06ae8ae58.npy +02691156-8341ff3b44ed2e30473f10e6caaeca56.npy +04256520-e8dfcea40c6cee9b990561fc34164364.npy +02958343-a90b6f926a6307ab31b57ba89dcc78c8.npy +03001627-9ee7a2dafbcc731319fb4103277a6b93.npy +04379243-e2022bd4d83dd6155a15b6547f08c8fe.npy +03046257-7e98d09503ee0f39ad2ec599df06ea94.npy +02958343-6208166202d795a2272523adb0c9ecd0.npy +04379243-e920d6df55f51b9d3abfc4d0a5688916.npy +02958343-93bb1cd910f054818c2e7159929c406f.npy +04256520-f6bfc818e9e265b34b3c42e318f3affc.npy +04379243-b90ea1e6e5574e5814038d588fd1342f.npy +04256520-a9317911db005724f19c36a916a93d14.npy +04530566-cb8a73c5aea2be236b26711d34e99cd9.npy +04379243-f3f8fcf3713f89847e2388e35557b84a.npy +04468005-691349d753698dd8dc14ba0818ee5cec.npy +04090263-d04048099296ffe4dd084a7dcd1680de.npy +03001627-21cd62313612a7a168c2f5eb1dd4dfaa.npy +02933112-150a5e3deaacaad4983f6ae6d409aac8.npy +02958343-2faa3cff00d98abdf5274507f44ab711.npy +04379243-3fdd61db58e5856c91c74eb018d3bfd5.npy +02828884-6e29c6e045daf2a5d201085e80edb26a.npy +02958343-82fdfc4ecc49072c3ffe0e5069bf1eb5.npy +04379243-50641bc54d5d41e2a85acc7b983a0d66.npy +04530566-c7fb35a9ca583715ef0445a3d98d3d35.npy +02876657-46910c75d17ef8554c6e2707eea5c15e.npy +03642806-34913d1dcde913848bd55eee82fc09d6.npy +02924116-a907154f61d0bbff6b418c7d9fedcaa9.npy +02691156-c207db490c4acde27b5d32a85e1b7987.npy +04379243-780479255b0af544ef56e80181daf078.npy +03001627-bec075322d514fc9f51f77a6d7299806.npy +04256520-cfec2302eb084b5c58f4eb05242852ad.npy +02871439-825fad19825ce9f9d42b9650f19dd425.npy +02691156-ca8e8a54b54b41eceb1a0518c224975f.npy +02942699-68f66f5ab594fd3cc2890daf3a9f7413.npy +04379243-78253ff57339985a28c0cecb7de2397a.npy +02924116-484d31fd95214ecc6bf3b18b8ca71a.npy +03001627-c951e7bd4c0cbce17ec5a98b3b8c425f.npy +02942699-e67273eff31fabce656c3a28e34d04c4.npy +03636649-d3e5c225e8ec17ece4a604577ef990de.npy +03593526-67b6b40050bdc870e43df8c9a38bf11b.npy +03211117-cc1611b5120b8aad9651cd1d591d64d.npy +04379243-9b02cf9719863b8e9e990e1185980a77.npy +04530566-7915c47b72e6d496e453885abe85c310.npy +04090263-6e700588bfb6de35f30e6249e336e80f.npy +04379243-a95828fa4607295674c8eb7e4d6198a5.npy +03593526-94235090b6d5dbfae76bc197b3a3ffc0.npy +02691156-e594754cc2a264d63da2ae40e7681e7e.npy +03797390-c51b79493419eccdc1584fff35347dc6.npy +02747177-e4bcc42ed5b66b22b491f065bc1219a.npy +02958343-1790131f5f74b1ed973aff268eb6b00c.npy +04379243-97e6d79058bad189ca96b2737246fca.npy +03001627-866aa287bde4cff9bfd324d8acaeb3f2.npy +04379243-3b7db1bbe9ca00204d851671c3f1cc65.npy +02691156-68a423eea131656b1e2b909763d0fd31.npy +03001627-fb8c3a832eec2ffe627fec6651ed13bb.npy +02958343-7a8f5c085be36a8052aa494042b7c9db.npy +03325088-c23d9166bdeec5e5b362845c6edb57fc.npy +03636649-382e40ed472250924f3443b22038d340.npy +04460130-4fc1268f6aa26fd76ec5e0e1e130ecd8.npy +03001627-ed3cc4a95e18b3fea19b492f7b035eac.npy +02691156-b7023a2bc0b1c28142edba76767f7bf5.npy +03001627-e564f393acf979683c2e50348f23d3d.npy +03593526-dc39b65c9ed54544debefefb2e8c0245.npy +02871439-5bcfec5fe326fff4e0deec465e890dca.npy +02933112-d3829c7b8afd0d2ef51f77a6d7299806.npy +03991062-e744d9040133cbf4bf9296aa16dd149d.npy +03325088-8571a28754a62b8ce163f4a7838826d.npy +02958343-9497f33086b582b7473f10e6caaeca56.npy +03001627-93dc91115a9002e1663fcfd6703c85f3.npy +03337140-e4f8db369e639af74c3aee8e9d3a6ffa.npy +03337140-27b87b953b733d8a4c3aee8e9d3a6ffa.npy +02691156-d3f93b6da62fae46a98ae8c73b190485.npy +04090263-48d5a68d2228359fd735fa1ab17311ec.npy +04256520-34a2341fbd255d82b8a06a6203bc49a9.npy +02958343-38e30aa86d7bd4e0574fbf5e869a42b6.npy +02691156-e66692f2ec8ea898874f1daffc45b57c.npy +04401088-590017c9eabc3a1cfe8474bfd438f6d8.npy +04530566-9408002c21ae222b27ac692756be9e24.npy +02958343-12de9c37c83992c66392cc95e1b05a28.npy +04330267-4979ab695941487a40b559ef47048b86.npy +04379243-bef84446fe50feccec7cbf3284585a40.npy +02828884-58a09612c838e441e7b89654b68b9e5b.npy +02871439-d8d8488a7a209ed2a74c2333655a11dd.npy +02992529-234d1646b21fd765ee45e1eced971f52.npy +03001627-45f9f54b9e7cf6897886c5f50906be82.npy +03001627-26a6ce644504c5fa22963ea1e168015d.npy +02828884-55da2d1d9250d41b800e0abb10f41d36.npy +02992529-308cce8808b076bff49084215d845d01.npy +04379243-51930b149cf6125373fa072a624ce947.npy +04090263-f5ffdd214cfa8edf94c9a8d7fabdfed.npy +03636649-cd389501a749d5b13b080c0097c00a32.npy +03467517-14ca31ac1b2801f2d57700c05b1862d8.npy +02958343-9ec13da6190ab1a3dd141480e2c154d3.npy +03211117-ec190042ef2f7aaef925cd3fbd303c2c.npy +04401088-4bef48f1c1b4a40fbdeec9c43546255e.npy +03337140-ed5a8f4ecdbe78fa15a34fa27bdf3d03.npy +04379243-e3fff8b83cf999467ff6ace05b36a5.npy +03001627-d23682341fc187a570732116fb5f6e1.npy +04256520-ce049a259cc2e624d5446ca68a7e06a3.npy +04530566-b0e8c331eacdc9bef3e39f2e17005efc.npy +02958343-4d2daaa14ab2f051bbfdd95a15649dec.npy +03636649-438e9c32633a7094056b9c3d62d1efd.npy +03636649-26f725bb6578936cd247b9308cd5c441.npy +02933112-45679a0d39b500533dd5cc05646564a4.npy +02828884-7b58a3e5d7f4dddcad1d789f3b2120d0.npy +03636649-37f318fc52f4ae333f534d0cf4cbfb4f.npy +04256520-fff199c067a6e0f019fb4103277a6b93.npy +04401088-1e8d859734efb73567a6837216666401.npy +04090263-1ddc9f25d09da805d957eaf7f4edb205.npy +04256520-766d94bac9ae085455f9a00acc25f137.npy +02958343-bc587f9680c5ea9b58be2d1dec5d09d7.npy +04530566-38b6dc2ce1e8cd05e8d6be23f236225a.npy +04090263-e4c32f0b48b6c4aa31fddac73d878514.npy +03636649-fb4783fb006f89e4d9b53420a5458c53.npy +02691156-29b92db18649b64e959a8a7d5a8a5077.npy +04256520-29f890e465741b7ef8cb9d3fa2bcdc0.npy +02924116-2a7301abb348191552470de2774d6099.npy +02958343-15d6cd7877c6601d9ed410a010efa019.npy +03467517-33ec10ba6e6e0de41ba258440d3e234.npy +04090263-3553f6cf76c2f9e1870906b5178d97bd.npy +03928116-89814e650a56b657663f013a9c68bf1a.npy +04379243-e4dc0ff7a1f3151814f68a949b9a6baf.npy +04379243-978936fc521780702c5b6d66521f20aa.npy +04256520-67b1d2a43f266f4bf51f77a6d7299806.npy +03325088-567eb00396cdb60214b35a7d7cea7130.npy +04530566-9908b25da1e19480b51edc80d299de94.npy +03001627-4f79d43b70f5bca3d082d95e9bd50b49.npy +04090263-8cdac72ba112e8f6d2c901959c439025.npy +03001627-421472e991acb24490267536df1b0cc6.npy +04379243-eda7058a8c6440b7abf529d72f4c9152.npy +03001627-2404a64c8736bcc37ef29b55d8edde64.npy +03211117-459ea1db4ad52f3d7b7c888d3626712b.npy +04530566-925f3de9b1256113538505dcebf57ab1.npy +03001627-2de04227fae28e70b6eb6f056d511fe1.npy +04090263-6ac3f88bb36968ff6797bd93e1caef31.npy +04530566-aeb021c1e1838706b44ca19ee8c5531e.npy +02691156-a5ca77bfabfad028b56059027b9b30d2.npy +02691156-33e11a7dec64dd42d91ca512389cc0a0.npy +02933112-13dbeeacdabce3b694658a0201ba0367.npy +04090263-ae221dbffaa89b3264279e248bd2a91.npy +04379243-7ae9c3f17c5f9c569284ac9fef3539eb.npy +03001627-23d76c249645228d1e23e0195c502f30.npy +03046257-627617f3931dd0476e1ae929b00acbc4.npy +03593526-9097ce398b9700a27e561f865dc44fc5.npy +04530566-c6e255195b9a8691ea9bd4954e1c8c49.npy +04379243-35aced569e5e1d869d10bf389452ce96.npy +04256520-4820b629990b6a20860f0fe00407fa79.npy +02924116-660e11eff2108a00f8ff821990890128.npy +04379243-df4593480b94850bbf6d78b1e39e2718.npy +03001627-45a355545e7a807a492d9da2668ec34c.npy +02843684-4566d6e03bcd174b5fd335a0d0b003d5.npy +04379243-77147f716a20028635469b95109803c.npy +03001627-2ac0a9cdbe7ab8a6ad484915511ccff6.npy +02691156-ae4a9574248395b671d03b466c72ce41.npy +03001627-9d0b25421c13008e35836c728d324152.npy +02828884-7c770e38383d59be279e896561802d26.npy +03001627-3757a60634d134da35836c728d324152.npy +03001627-62257f79605faa66e6fe3612af521500.npy +02808440-ff6b4c0016394ba83321831d2245cf06.npy +03337140-1c319fc6985fc7cdb8405ecc20044969.npy +03001627-2acd3a3e50e8e068fae61b8c1512b8af.npy +02933112-494fd6deccdfb5cd5051fbeeb2dff27f.npy +03636649-989694b21ed5752d4c61a7cce317bfb7.npy +04379243-24019c15c4707356bf96d22e92924ea2.npy +04401088-8b174c67bfa00f03df269b2c62a1bd4a.npy +03467517-3ef569c13f4ab5f83ac61a2f8346a8f.npy +02958343-381332377d8aff57573c99f10261e25a.npy +04530566-de0964254f4599e8666f23db664db86.npy +02808440-47ae345322c4add9f9c0f9cbb10e38a2.npy +03001627-2edba114d2e9454295bea7c29e873d16.npy +02828884-6f2fa876147a970c5acde0d39b1b9dba.npy +02808440-b6df9d21acef1e11b362845c6edb57fc.npy +04256520-b675ac4b668ace54bdcf8e3531f470bb.npy +02691156-25bd1569261bc545e8323edc0fe816a8.npy +04379243-6da4b164828c371824507e0767ffba7.npy +04468005-8d136e53fdd5adba8be7c8c5fdb9bd6d.npy +04256520-a8df97262f1f0a44e4975e87c20ce53.npy +02992529-57004d88e4deebcabec15cbb63c9ab60.npy +03001627-7fd10f44a20506ec1b17743c18fb63dc.npy +02958343-34080e679c1ae08aca92a4cdad802b45.npy +04401088-5ba2137f5131db06219e978e6e16d30b.npy +03211117-75237ff4dabf0e9592552ad7302636b3.npy +04379243-332ce2f8d9c3927dffb8fce670bd5738.npy +04379243-4548b28199a044ab19fb4103277a6b93.npy +03790512-d644ca9d10aed7cdcd4bec905df51d1d.npy +02691156-1667ab313638fb366cf1b4a8fc3914e.npy +03642806-a874a1d28852062ec2743f037f439af3.npy +04379243-6d2c75d89b0a5f5d8cbb8bac2032149c.npy +02691156-c7b2f5b125bc41056d07c55cf995503e.npy +04379243-56ad1b4f94a1d84ae340086172f20153.npy +02958343-9d3fd293f6b9e46f28044fe9244db50a.npy +04379243-b3d7407f79c36ee7367336fdf5bd5f57.npy +03001627-69e591a9769e03012c528d33bca1ac2.npy +04379243-37c932b30ce507c6510e28eb1584c355.npy +04379243-f5adf1351a56586719fb4103277a6b93.npy +03636649-25999cece7e71cdae8c9f1b00ff43053.npy +02958343-4571e0fbe9cfb5f8fd52c8b6dd37752d.npy +04379243-cf5a0589134088ba37e5c2aed7049b42.npy +03211117-1f76e392f49bc1cda6c7922fe9004961.npy +04379243-9afaf5ab87a889f67acae9ce58893de5.npy +03790512-6683e13507dde030f6435254228a9d64.npy +04530566-411da0cd0b0089362b249fd16295bbfb.npy +04256520-51912ddf693219c81c8aa60fc1bb8474.npy +04090263-fc2f5a2623b4373a83bd2c1aefe617f0.npy +02958343-f7f7b1b4021be11afaeea7738551d104.npy +03636649-57c1bc69df779d87bbc7a6acbd8f058b.npy +02808440-ee9261d9011255453321831d2245cf06.npy +03991062-4cb7c329170ef2d6179720c8796635a.npy +02958343-b059f09a0b26d4b5cfc78902445ccff8.npy +03207941-e21ac8931606e2a2d1b2557b80a0d3f0.npy +02958343-40a30a8e56fa4a6c7b48e36e31209b9.npy +04090263-85c46176f030583bb349bd01da88f0bf.npy +04379243-41101b30e8a82faaa640b0223e089df8.npy +03325088-41aee3c40e294f9776c18e71fd49c4dc.npy +04530566-bff4e5d71e9b695dc6a303e6239bc3b0.npy +03001627-e8eedd37cb054e37b59d74a7c956bd18.npy +02933112-5c80714fa7f21981bf2e25c697250b54.npy +02691156-7ee59463dc17ac6e3e3f3c9608255377.npy +04379243-84c9082a8cbd03e5e76bc197b3a3ffc0.npy +04379243-c29fc3e0096d399e8d4b2547f739c887.npy +04379243-363c9169b12de77e1d4c681138512bef.npy +02828884-9e4c82a76b6aff2bbeedb4c8fd29e2d1.npy +04090263-359ac7f4ddf3e7fbafc7bdb2f8d1ea84.npy +03467517-52d82d2d6a82571554b87c21f44ed61a.npy +04379243-1e37f6dad9bb5fdf2f05c3ceed4d6250.npy +02691156-29925f23c2050efa7def3dd22d9ef72.npy +04379243-72bf6e88fc05d48c2ebeb1e6a8111f53.npy +03001627-589829ef4fb0390e492d9da2668ec34c.npy +04256520-79bea3f7c72e0aae490ad276cd2af3a4.npy +03636649-a89562207e0d50a6704c1b723fefce78.npy +04530566-db3a31bb1fb188c727ca48a52046110e.npy +04379243-e439549f5da57f5ea5676001632ead27.npy +03001627-731d9114eecdeff93454e751432992d2.npy +02828884-9dec54fbded3ed1767680982183b294.npy +04379243-ad17445446e4fd3adcfcef693e7ec696.npy +03636649-cdab137a52000da1b0957d845ac33749.npy +03001627-2280197ac01a58912dbc66eac8105387.npy +02880940-c2882316451828fd7945873d861da519.npy +04090263-a0a36ea333e8a39319dde5f6d908cdf5.npy +03001627-1b938d400e1a340b17b431cae0dd70ed.npy +02958343-4e2ca20091449636599389919f6522e6.npy +02871439-6888506448a935ea96b6312669c8f92.npy +03624134-74379a5fbc4935cf3b2b25ffabe35ca6.npy +02958343-cdd58286e3e428ec1fabf3cbd0fc77bc.npy +02958343-43fc65dfe952a7f4cf6923c08156107b.npy +03001627-bca8b73b32108ad6d42ec7e303174a87.npy +02747177-a8f009b0b4a76bf663b2acb037dfbcde.npy +04530566-27540cb221ffee07983f0317c2c6f92e.npy +02924116-4be2483503d0f71c98c13d6112727de.npy +04468005-556a0b9a789abc71eb34db531a289b8e.npy +04379243-867b553b34a3399919fb4103277a6b93.npy +02843684-304394899d284fe1ec1e281e84d8961f.npy +02933112-462ee81a089208caf2f140388f79bf7c.npy +03325088-153159f63d195bf576d20e73c57c9a03.npy +03691459-2336a8ba5ba8a9f0ce029fab54b6cfbd.npy +03325088-58fcac9c816ccf08b362845c6edb57fc.npy +04530566-44858e0564cdf90e299482fc72b07ee.npy +04468005-ce8f672133804c3ddc14ba0818ee5cec.npy +02871439-fd7f43c0ac27aa33b2592439813a5d1c.npy +02992529-1e8d859734efb73567a6837216666401.npy +03636649-3993a9c841dbc35061294c3e9dd88196.npy +02958343-e09813b03bdfce83a23218adb697420d.npy +04379243-9d54c8a7ea484adea330b2d4b3aea8f9.npy +02958343-19c25429d34ce9748c844a5e3a5e1a93.npy +04379243-50894123f3f237c161062d371b5548c7.npy +02958343-45ff3c9bc849f2e33a2844e8778fdc6.npy +03948459-5cc23a432b1b88dbf5029f48ea6cff14.npy +04379243-43aef0e663e734b75dcc7ddfa72357b1.npy +02958343-e6b8fe458aba5b0da86ce1de1d1e7ff6.npy +04379243-33f24a72a875633297e755dddca14449.npy +02924116-65b4a6c8cc40ee0f1288426428f318cf.npy +04090263-e776209bfa7f2844589c07868201b17e.npy +04256520-4e7062e2c776db18dbbc9440457e303e.npy +04379243-a72b18ca7d4aec7e67cfebe3c2e9790f.npy +03001627-20fd21021f3c8e5fcce6278f5ffb13a.npy +02924116-d1ff40feaf0516c6388c858f142b8b6b.npy +03710193-5a81ffe8b9acace8e51d90f0237045d2.npy +03636649-14656fe47266b0eb88e7662971dc736f.npy +03001627-7ff2f20512e7ce8e572f8e1c1caad99e.npy +02876657-7746997b8cfd8d11f4718731863dd64d.npy +03001627-efd07df34c1f73cae2367b9e27f16a71.npy +04530566-a40a870c5abd8c83d84b8ba651dfb8ac.npy +02958343-abcabe3968a64d4f16abce8cb03e7794.npy +04379243-a8c9827810c66962f8fd14d222168087.npy +04468005-564df1a62306be1552af501dc2728308.npy +03001627-e20a22906784e3d08758c89c2f45caa8.npy +03001627-6df97f6b123be35b71a782a4379556c7.npy +04379243-6a53e24442be0a9598f91bb06151de8f.npy +04090263-7e225da92fcfb868eac137faa8adc92a.npy +04530566-325d1e9be246e1644d44f5db04bf14b8.npy +04256520-5fd7cd5ee43e0cf0eaf288f952624966.npy +04379243-e2e3f057399a2b41276b6f6d90ee3a83.npy +04256520-328873bf304530b01b17743c18fb63dc.npy +02691156-10db820f0e20396a492c7ca609cb0182.npy +04256520-b06afb4d11ee4eb9ce4f274577283b16.npy +04468005-2197384551252127ecb01d351e78a9e7.npy +02958343-a3e8a28918af7b07e3857ce739e6606f.npy +02958343-993bd3b6fe7c6e32cbb047938846b5c7.npy +03593526-472eba74eb73dcb9c5beea20858a99d5.npy +02958343-f1bcdbe16690a985ca92a4cdad802b45.npy +03593526-30b7bc199de66fc57eaeab1f0c9120b7.npy +03513137-eeaf3811af59e557cdc59d2b768bcb80.npy +03636649-ae50216235a96cffcb8d8c6d4df8143.npy +03636649-7daa2c16580e9f8ee055d2b52a9e17d8.npy +04530566-d10cd8bfe5eb85572aec0b439528eb79.npy +04379243-126b0452fa8b16bbf7ba6397f9858441.npy +03001627-c1c0b3d35cdef5e2f51fa0238791f5dc.npy +02808440-98a94630dd0be49444221bef0fa3c36b.npy +04379243-50336797d9a86e9625d9442054ff1a51.npy +03691459-c398c35b48c31188c73a379f25dda815.npy +02958343-813bedf2a45f5681ca92a4cdad802b45.npy +02992529-7af2a3d126ac5e44fdda95e9849ffbd2.npy +02933112-cd781f0ec08ba028af232a5661e85835.npy +04530566-ec51dbe499e88615a267c8b6fcca89d9.npy +02876657-8458e5a34c67958130f549f12038e49a.npy +02808440-a7d1d15be88c5cc133d742e03c58860e.npy +02958343-810476f203a99d3586b58a9b1f5938e0.npy +02691156-e4665d76bf8fc441536d5be52cb9d26a.npy +02871439-e9850d3c5243cc60f62af8489541547b.npy +02958343-de3280a89c7ccbcf946f6dc2df6150bc.npy +04379243-87935bfb0ff57aa4668ae11a7db5e82a.npy +02691156-960d086565fd36def0a9e4c23bc75c0.npy +02691156-8b3bccc84ac7d534d56132409b00c58b.npy +04379243-28f3844a7a3d37399c0ca344f487323e.npy +03790512-80011e85cd42668ad373c34785838ee4.npy +03593526-f17c8c7d510658a02f2318fdd66be40a.npy +04530566-24f5011d64dff5cf1c0f52f4ec8b820b.npy +03001627-7f2854516404a3a7de03ab2a27ba7531.npy +04090263-79ec181e02cfc63af4de29b99f103946.npy +04379243-5239e7c9a83e99762b6168eeac2194de.npy +03001627-51ec0bdeb8bd9b8d60eb699207aa149d.npy +03797390-141f1db25095b16dcfb3760e4293e310.npy +02691156-6044301c7b4c63ec90b1d6deb98feec6.npy +03046257-716802270b2a331ed5330d8b61efb724.npy +02958343-b05d651c17e9e626ca92a4cdad802b45.npy +04379243-679d57762f6ae711b282e6ae268fb5a7.npy +02828884-6953a491a4c74d42d5cec9a69bf229a3.npy +04554684-8797bf2bcd0c914dd6b976d6c56a2c0c.npy +03211117-4f11144acd79460b120322eac6386b.npy +03001627-a374da8227eca67b89014675a548cbb.npy +04379243-8f4c9f7f38e15d03593ebeeedbff73b.npy +04256520-eaeaa6879cb8f5193a9b2e04441ce376.npy +03211117-a0f10ade51e1adcd8b8d299c28ab08aa.npy +03691459-e1d8c419be35ee1e209a4a663fdfe000.npy +03001627-bd6a5c01b9c6f17a82db9fca4b68095.npy +03001627-1c2cad4df1697103a5139737ddc33fc8.npy +02691156-8b4309aac2f7f6b3b97c9314bd4647d5.npy +02828884-643cac07025f195750f9fc0e2c94dd76.npy +02691156-a0a7e673a1e1bca78699933784576e73.npy +04256520-3fc4cf00b8db1f03b086b372af6b049e.npy +02958343-2acbb7959e6388236d068062d5d5809b.npy +03691459-2240cfeefea8b69fb90623b288d5691f.npy +04379243-f7ced3de6f4c1ffb4e3935c6cee4b35.npy +03636649-c11e3e763402346f22c3a2386a9dfbe9.npy +03001627-bdd51e6d7ff84be7492d9da2668ec34c.npy +03642806-93958423b98be8b538ff1b6d120c56aa.npy +02773838-506a05b6ba66bde0b726426d6c667c7.npy +02958343-7dda382210dd768680e74058ee862f05.npy +02954340-40f0c6599f0be25fce01c07526cf2aa4.npy +03948459-4dcc11b6acc758b1429a1687ed6390ec.npy +04530566-620f33e5f326e3c642f9e27aaf0c47a.npy +02828884-c29ae4355b73ad302be4222736443739.npy +02828884-2d1ea225c279836cd67b3c7873295e75.npy +03636649-c9b4209f1a7e97cb90a9ce3e4b15521e.npy +04379243-a26046fbf2d7368cd6e1954365b10b52.npy +03593526-a217a3505ef6b67de6597d391ab6fcc1.npy +02871439-711126944f5bb83e1933ffef19678834.npy +04379243-5dd9ef055fe3582687ccf9baec60b534.npy +02958343-e5a3ffca76415acc33529abacbef3013.npy +04090263-5f0cb03ebd45ee7d735fa1ab17311ec.npy +03211117-5145c2175f9db9d3f0478431b5ad57db.npy +02691156-647576c71cff90b4ca8607f540cc62ba.npy +03211117-3ad5eaabf85f4b5cc4d320644a1ff105.npy +03467517-bdb021331b396851c09b3b7b0c2153f8.npy +03513137-ee4046b8154cf9fd5964bcdfbf477f81.npy +02828884-56a818c4e5891f1d39316df04169d12f.npy +04401088-e679783f54c36220b99a2cc4ddf0d3f9.npy +02691156-71222607731812fa5e9e2656aff7dd5b.npy +03001627-680eec559a71dcdba023804ba421cf6b.npy +03001627-77e7660d71c6f3befebad4f49b26ec52.npy +02880940-6816c12cc00a961758463a756b0921b5.npy +03001627-4b95e968966fafc6e0675251723e1e08.npy +02871439-9664d50fc1a03534d42b9650f19dd425.npy +03691459-88ae9338c167e8d5238ad1274d829e68.npy +02691156-d068bfa97f8407e423fc69eefd95e6d3.npy +02933112-1c898677c5b4291c847857e42f50ec6e.npy +03001627-31a77c04ac5df53e9429176ba100075f.npy +02691156-9efbd65b09daf8358b96ae1a0a8b84ec.npy +04379243-564b7a755e3003da64fad3c7b88e6060.npy +03001627-88842eadd96e5cab570b6bda9783c8ba.npy +04090263-d1508875426ee5f3d87c63d8b3018b58.npy +02933112-464e34455b49aa5c824080f516909671.npy +02773838-f872a64810c123a47abde6405e4d8323.npy +04379243-8a505843a90a7486dc2bb3ee5ca7ba76.npy +03001627-1ee30d218c8c730ecb01bc908e8cea6.npy +03325088-b8d46728c6f3b0bf76d20e73c57c9a03.npy +03001627-ef9f4de6ad345818b25f0e6fce03dcef.npy +02691156-2599e47b04ea7a32d872dc56d048665c.npy +03046257-990f4d12875bbd61b76982957f05710f.npy +02933112-85502157d9e253d411fc2b865c2a185b.npy +03691459-e854747b2165ffd6f8b75fa4030d2e21.npy +04530566-d55ce64040e0b3e4ecc9205d69d88837.npy +03325088-5aeed0c9db054c395f12a496ed94ff1d.npy +04379243-fe2e9385283b62922de0bc4fc4d02dd6.npy +02958343-3587079f3146273faf8b8a34d449f60b.npy +04530566-b044558b01dfb98d3d8de7c49284d3.npy +04090263-a4d4e316f6511990309d43c07397e2bf.npy +02828884-3a271805da4a65e06a5d67b8fcb702fa.npy +03761084-4df99b98a1f4967ddf3a1b0d597ce76e.npy +04379243-10f1b51f2207766ff11c3739edd52fa3.npy +02924116-207c332fea56649952470de2774d6099.npy +04256520-ef99fe2058dbf199a2ebd6ecc07363e1.npy +04379243-25640329444772c6c2e20ec62321c272.npy +02924116-9d212c62dd02d40a1255ac7e5ca8c148.npy +02924116-22a6553c141476e06824264d26b3f6a9.npy +02958343-1c5a350ea0f55f793fbce9ec40e1f047.npy +03636649-b7b4361b0042126ac7d17f1ea7477fc2.npy +03001627-f6096649f87c37f1af7c7ad2549a1b15.npy +04074963-8f14d5b24d2b798b16a077c4c0fc1181.npy +02992529-c978be9ff9bfb9c67d2c763bf3599a8.npy +04090263-e54b7a716399aa646a29c14eca4d216a.npy +02958343-921f87f3d9a4cb8ddb37d391409760c4.npy +02871439-a62b569b9b55a34d14067ffcfc2ba435.npy +03001627-675aaa5b883e2398d7f7a4c4609b0913.npy +02691156-dcded0031a71305c52d6957c59c3d213.npy +02958343-84e4dd1c6306a582a97e62e669e9544d.npy +02871439-b3d9b068be7786d52eedfae7df5d8c3c.npy +03467517-7b99c00792408061e9d9b43230155bd9.npy +04379243-1c1c9e7676dd618e6652506d959dc71d.npy +03001627-8f13ac6499dfcc83f381af8194aa4242.npy +04256520-7a3dd8889b18cc80f51f77a6d7299806.npy +03001627-f1d6552ca66b2e37713decb1a0563b12.npy +03325088-8b12d095112cbf23ac9cfb689e5db0da.npy +04379243-e603a4f0bc12522558df8eeaf3dad1c.npy +03991062-229cc8886a1f18fb9173fae9a2149528.npy +04090263-52a90db915a53200f0478431b5ad57db.npy +03001627-87c742a186ef731b464bb3035358ab7a.npy +04530566-6c2fffad4d28822c1d57de40f2cd04f6.npy +02828884-76d029e29ac2bb69ad5067eac75a07f7.npy +04460130-1b781ad3315b36510f233dcbf8432d5.npy +02747177-5092afb4be0a2f89950ab3eaa7fe7772.npy +04379243-2e0a396cc21ed4e3781e3b226aea8d4.npy +03211117-e51c13070dcd4ce25432e3a73fd1f7a9.npy +02828884-25d1aa23abd04998d4d8765e3910f617.npy +03001627-85f56a4d68ff8d75c3bd24f986301745.npy +03211117-e17da83890fca0b8290273bda7ed0d31.npy +03636649-926d66e2adb79d5b79cb09497d80655.npy +03001627-e4c866b5dd958cd0803d0f5bac2abe4c.npy +02828884-47c991f72eaa53c6a8737fcf23389014.npy +04379243-8db8568a21645abb2964e7c9f80f3597.npy +03624134-65c05c88c441009f5d0dded52efeb4fd.npy +02691156-916950e40ca7aabc8b96ae1a0a8b84ec.npy +03046257-1f9ebcee16d5164b62e575249843c117.npy +04090263-2348490cb8fae973b6792578a0d9ae89.npy +03001627-735b16d075ad6ce3d197f67767b32741.npy +02958343-ff64fc33b5d8f866d4ad6f63f570d711.npy +04379243-dc9a7d116351f2cca16af3198c99de08.npy +03691459-22654d0b3683df91650c44f51c50faee.npy +02871439-340df58fd886d4e504af6e1321617aa.npy +04256520-bfc6b2328c9c12bf283b00891f680579.npy +03642806-8faaabdbdf4764b3531a9cd007e29075.npy +04090263-272e1f3a719f2e35e2bb19fbad3e4596.npy +03928116-fbac1681358a4289dcf02ff10643ca8b.npy +04379243-537a02eff282b33df58bc14da5676759.npy +04379243-e6cd3e7a25cfb1c3593ebeeedbff73b.npy +02808440-a1c617c1cdc5553b3af30a3946d92feb.npy +03691459-a6216e99923da6988947789ccf4faf06.npy +04401088-5ff8806e12ef72e0650185da4813c6fe.npy +02828884-d8dbfb0f58a2df0bf1eac5a8cd36b62b.npy +02691156-cd846470dd7a135d29ca62020db7d733.npy +04256520-a39749334717e07098f49a8972f75c6a.npy +03467517-5c805aca7aa8bdd3ac61a2f8346a8f.npy +03636649-19654d8fe7090a887eaeab1f0c9120b7.npy +03001627-5563067c7c05518415aea01a869de65.npy +04530566-b032f7baa738f10ef1ec74085c31730d.npy +03001627-1e2ddaef401676915a7934ad3293bab5.npy +03001627-695a02a5620aae6e78eec18a8a3356a2.npy +03001627-497f67c006770b9f94e98ee4fdfd7464.npy +03211117-f82557870d71f3a11f9b5b6530d6e16.npy +04090263-50fa60269066614e70a30ad089da2cd9.npy +04379243-b3eb7f278d595307d2b12aa6a0f050b3.npy +04379243-11aee78983b57cb34138477d68528833.npy +03001627-99a16c86225e538d9e72cd13d3c26c66.npy +03691459-6ff24c5a5003a1a5bf12d1e914fa62b.npy +04256520-3b34c3ac871a2d40593ebeeedbff73b.npy +04256520-2d1dbcb6802bf2017879e882bea3b8aa.npy +04379243-6d78f55d24f1c4e714038d588fd1342f.npy +02992529-a434289b281e629b81139543c959a70a.npy +02933112-bb0255c8582c74c6557f50690310ce8d.npy +02958343-4489a777dd90ebcce28605e174815eef.npy +02933112-90ccd5fbb48ba3bdde650492e45fb14f.npy +03467517-176ceacdbc44bc3569da8e7f9a803d12.npy +03046257-6cd9f0f548979d5160ddc468fe733ed1.npy +04256520-3f8f1d7023ae4a1c73ffdca541f4749c.npy +04256520-b5655dbb1a19b94c14038d588fd1342f.npy +04379243-e02fbeb78d8936fb586ef560a3203b3.npy +03624134-df0a8c7d1629313915538488147db324.npy +02808440-aea6cef49fd3a6ab3af30a3946d92feb.npy +03001627-995ecc9f34e0dc3bfa2cf126b85e1994.npy +04379243-7f39803c32028449e76bc197b3a3ffc0.npy +03691459-3b3f46308f2ad119988b934ce1e16bb7.npy +02958343-5768ae99da7499feadca4990256df2c6.npy +04256520-90b3ec9b7f122e3ae677774c24ef850.npy +04379243-1d90363feb72fada9cdecade71f5dca2.npy +04379243-d673e7a605249edf7c1af3afc3f87aef.npy +03001627-4171071eb30dcb412dd4967de4160123.npy +04379243-577155d24ebec9833ce2d31ef93d6e81.npy +03001627-98547d9147a58195f51f77a6d7299806.npy +04256520-a98956209f6723a2dedecd2df7bf25e3.npy +02828884-272162e616a4e8e9ad5067eac75a07f7.npy +03046257-147df4e2a9af41fbf51f77a6d7299806.npy +03928116-6e549d6229e1cfff1420b81fa6c7ce78.npy +03001627-41e5e9ecb83b9a45504d5af97121b5f.npy +02924116-df89f05643f34c645cd2bb143228195.npy +04379243-38e90183c838f443b43753a53e4593db.npy +02958343-1cde62b063e14777c9152a706245d48.npy +02924116-3d2aeaffcbc6f0bc41cefd10ce5d6cc0.npy +03325088-38acce15053c16d3321831d2245cf06.npy +04090263-574e6f325fc821ad6314c3b6a3a65519.npy +04379243-a5634b2fbad2b88d5d14030c75181478.npy +02691156-18d55087d052ecc86b7bd17e458d0dcb.npy +04530566-9efd4dac9e4b1698876eb99526752ffb.npy +03467517-ba7ef4973b9c4f995eec6d8d24f1fde1.npy +02880940-ea473a79fd2c98e5789eafad9d8a9394.npy +04256520-ea9a266329617a165298386582afecd3.npy +02958343-d0cd9b6ca511c6b9920355ae987b66f1.npy +04379243-6c95f72153478de8b162cef80a91798d.npy +04379243-d0008b042256fb5f7ab911835312d4f1.npy +02958343-b40c9e44350f95aa1b9234e4ab67a3eb.npy +04379243-d5a78c5e48ade3e38fe22a5ce827e9fa.npy +02691156-cf96229978efbb488b96ae1a0a8b84ec.npy +03001627-18fe5de83a17c6b5876b399a99a15c0f.npy +04379243-e58c53d29aaee1fc8101accd22c701b9.npy +03624134-e6e452eb238659f61ce93adae4bc9483.npy +03624134-4bbde8accc3bbfb87f277d7152b6b3ed.npy +02691156-322e8dccadea03d3340b9c9d10273ac.npy +03001627-e62b187f6741283bd8f27b2e727c3511.npy +03691459-f289aadb7cdf59daa62fb160d742c45.npy +04530566-fdf4b58a27a3ac8ead83f267e8f0b536.npy +03691459-73fa71b650b99bc951d3c864cc68e22e.npy +02933112-5a2de91981d27ba3c59350d819542ec7.npy +02818832-3d14f0782e488c8bc19762eaa7ba40f.npy +03211117-9a24880343d943f7ec059109909662d2.npy +04379243-ab16eb9d6122a5fb41cf86c757faf4f9.npy +02691156-61bd590e917928f6b6ecbbb2e4d05900.npy +02933112-1a7b9b946e797ce59f8c3d2002c77ddb.npy +02924116-737aee2e780049ef887524da02be2633.npy +03001627-59fa70f195fd4ac6ae8c9d3b8c4b9bc3.npy +02691156-d80486b768083cd6ba0d990ae229b477.npy +02958343-ffbb51fcc3955d01b67c620b30c63392.npy +04090263-d5e99caa1d8e7c859133e432dd7411d.npy +02828884-8e25c33aafaade0ad5067eac75a07f7.npy +02958343-557413032afecbd4c627f7f719e1032.npy +02958343-52c589e86fd500cd4a42886683bb52d2.npy +04256520-306679647d906c39bbc7a6acbd8f058b.npy +03691459-533582fec17b538e60e1d7e27755edc1.npy +02958343-1f92e07294960629a39ce7aafdab8210.npy +03636649-aab336a18bb4e51fcd4910413c446d9.npy +03001627-9231ef07326eae09b04cb542e2c50eb4.npy +04468005-f34dbc7687edf0902be6b91d40e230f6.npy +04330267-355f5eea3905262d54665a4e9c906cd4.npy +03325088-ad63886b1f38bb16b7a867e9b35a1295.npy +03636649-fad026744a6abb1937cf479d4bb58d.npy +03691459-5bfeafef1be5f4f5bb476b1cb791329b.npy +03001627-b33a3b1627ad61eb8ca4809dcf42fe1.npy +04379243-4b57450a988be6c1f51f77a6d7299806.npy +03001627-1eb5613aa22df87b8ef9327f5d5c024d.npy +03001627-608b46b0f8f9eba81b1a986f753a489b.npy +02924116-a2178368fff2a71824e6f48def711dfa.npy +02871439-2efb3ad49fa103b1cc786970133d7717.npy +04379243-9d18858529b76154aa7cb30470f3273c.npy +02958343-3335fb305afa0494d3c820a40c219fa9.npy +04090263-278f6f0588771123f8edafa0d47e47db.npy +02691156-1530400ceabc1d7145ec485f7da1d9e3.npy +04379243-758f982c1aa6f5edd6eefa796d2f261c.npy +03001627-985b7e5b5fe997f0670cf6c75c1c5868.npy +04256520-2a98f28036915f805510d59f3ab1ed64.npy +03691459-f7a45911d01fe4a961775b840d882da9.npy +02924116-8e0e80eee17c86415a9da89784be865.npy +02828884-1e4c1fc02be62675f90c2728303e546a.npy +03467517-8ebc3d48afeceec752561cc0fb924c36.npy +02818832-b6ac23d327248d72627bb9f102840372.npy +04379243-39cf5ae2b497715a84253b2030fab070.npy +04256520-1f28f2ccce4940f2c6fe57159221338c.npy +04379243-ec5469035d19434f9ba80f08c401fbed.npy +04530566-92be906c57e20430fd87075a257732c6.npy +02818832-643621e32b3177d3f0fb3e3d2a0d34c9.npy +03467517-68a8bf89972cd337a77e8142614cdaae.npy +04530566-3038a5f927db994e6702681953f194c0.npy +02691156-af3863d4ce7dd92ac6f6da58b133bae0.npy +03001627-572cbd8b4cbdf7f1f91663a74ccd2338.npy +02691156-2495267afeb60584c3a35cee92bb95b.npy +04530566-7aaa404bd120be52816427daa1887efe.npy +02958343-92f697d036addb55ed576c2966428f.npy +03001627-997b0aaad2301a44b31fb46b2e6304f4.npy +03691459-9d180f7f43dff3d51ec48bc3c478566d.npy +04379243-41d280b7db61ebddfebad4f49b26ec52.npy +04256520-47362cb47416904b76e38b52d9aafc11.npy +04379243-f195ff52401da593344db0d9ed96427e.npy +04401088-e513675ffb2da709a060e584e7409aab.npy +04379243-7a5acf5f20f8cffbaf030eae870a2d14.npy +04379243-1bd138c3e54a75d32f38c0d2792fb5e.npy +02691156-f6a09cbb6d08feeec9d7d324d11034c9.npy +03046257-2d3306996a223a992c4f629232dbdb8.npy +03001627-95f8a62c031dbb8ff0f455e219813ed7.npy +04379243-9269d120ecefe48da2aa7d89ba9aea43.npy +03001627-662f95ed8d41a24bf63bf7d908efc575.npy +04379243-f48a955a73fa0fe79aad7644557603ac.npy +04090263-39c4214ab44383258a3dbbf31a87b8b0.npy +03001627-aa88b0f05470452f7ea323bc74055b8.npy +04379243-f4976e80b8533bcf85518f8659f21d56.npy +03761084-eccfbd9111c640789e11c084f781b48.npy +03636649-989a70bcea69bb4372a02c2db7bf58cd.npy +04379243-6c4c1465fe472cfd93ed8929b636c206.npy +02691156-dd65065e6e2d31d62e350437b1fc5163.npy +03046257-91d9bce8460a5cd010fe662c4b4066df.npy +03001627-43f762270b438fe618a36258eabc2b9c.npy +04379243-7f6ddb13d3b8c07c1c19e7863a1c200b.npy +04256520-622552cb1f5670a614038d588fd1342f.npy +03001627-72a40501ded8a8dd2c2f29cee8379a34.npy +03001627-507de496a9a77945e40b5e9eb4befc2.npy +04379243-4a27cb9384782ce33e95c55cb020b7e6.npy +02992529-73b0bcdcf57a8a7fe8d8ad3bdef6aca2.npy +02801938-a838d7fcfff9732fed315c548018de56.npy +02818832-6256db826fbb31add7e7281b421bca5.npy +02818832-ed4ac116e03ebb8d663191fd557d3a61.npy +03624134-208610aa6d607c90e3f7a74e12a274ef.npy +02992529-6907dd835a22c32f46895db2a69f45e2.npy +04379243-589f5927d37247564fad3c7b88e6060.npy +03636649-b668df78adedbd1735ea0e092a805a.npy +04256520-3d87710d90c8627dd2afe8d5254a0d04.npy +04379243-b0c37b379725feec97ed2c3bf3711e68.npy +02958343-2c3a5d170774da5ae4a44d0583e1bb01.npy +03001627-8098750b6089a9d8ad3a7d07aac2767.npy +03001627-dec5920f32fa546a6c518c577d808035.npy +03046257-cebb0e2be3b2cc1b474465268b958bdc.npy +04256520-2ebb84f64f8f0f565db77ed1f5c8b93.npy +03691459-73a337691b4015ff1ef58b31c4ba0d15.npy +04004475-d0ee507ba98a89525df8d70b74fdbdb5.npy +02691156-5e44d38e88458ab1e1873a3963e0d14.npy +02818832-10c15151ebe3d237240ea0cdca7b391a.npy +04256520-54ee1ef79b340108e5b4d50aea96bfd9.npy +02933112-2cb76d6aaac3c677bb60e56ad1645b95.npy +04379243-35dc5a90392dbc1563f26b71f9dca732.npy +02691156-b65ddb8f80d8fb562e38f6d9568202c7.npy +04379243-a1379276f75d137ac5ddf9f6c8e4b3a9.npy +02871439-4cf8fd9b396d0d24868bb660c8b7e409.npy +02691156-892ae1180c58b3e671d03b466c72ce41.npy +03001627-54f276860d9b00436370a012706ac174.npy +04530566-4a0cbef5bbb19d840b6c13818321d0e.npy +04330267-f5543e4b09f4a49a2846c469aaca3af9.npy +02691156-fbebcde2d8fbf81ee7cf320ab5761d45.npy +04256520-aa7dbd4acb4878c9620f1933fa113025.npy +02958343-38b2bb3bf698f38ac2920de4c5efc2ee.npy +02958343-9c7cbe5b36b7ae9216abce8cb03e7794.npy +04330267-c647966562bd62f45eb64c1003065596.npy +04256520-9ceb81a09813d5f3d2565bc39479705a.npy +03642806-7e5b970c83dd97b7823eead1c8e7b3b4.npy +04256520-13d3462293023fe71f530727405d60cf.npy +02691156-f7f915160c0e1f6f42bc0eea174f82b.npy +03001627-2936cfb442eeb0a32a673c8b84dfc32.npy +02691156-aff764398f14383eb87697d3904b168b.npy +02828884-c2516123957e1cc42283e6cce5561adc.npy +02691156-8463c1f30bcd9151b92527b70e93ee2c.npy +04256520-d8fa31c19a952efb293968bf1f72ae90.npy +03211117-981d4ebcfcd3c733701bcc8e95172446.npy +02828884-d406968659ec5ab87d55717abcc7106d.npy +03948459-9e1835a6671c1163fef144202cb2b935.npy +03001627-7fe836b46890d24a65ba78ad9601cf1b.npy +04256520-359b6d3d29b08dfe19fb4103277a6b93.npy +04330267-38978d1d3a97e57ffc6e457221b9271.npy +02924116-2cb165856db926fd851591e44f18a8a5.npy +02818832-31e0375f0776e4949c9245e96a55cc5.npy +04530566-ca129502c7b2b8186d54dce3f3e9f18b.npy +03001627-4848f84b015f1360e8058cf23f6382c1.npy +03467517-b9c10bf6fc2095f93f0194265a9746c.npy +04099429-59389aac7b1ea9b09b28f5f9cf8893b5.npy +04379243-7f1749643345953cf51f77a6d7299806.npy +04530566-728fa87ee84c5c2d2fc7e4ac493eaaf8.npy +04090263-9cc7d4e39b1fb17993d988207a39086f.npy +03636649-da8141b45da808199a06a7de97b096dc.npy +04530566-ad2c82cd40584b43fc4c78b4701b2fab.npy +03001627-d3562f992aa405b214b1fd95dbca05.npy +03636649-5fba90e6e30b503461bfbba8a5defb02.npy +03636649-2691d3491111def44674c364bb213983.npy +02958343-128ad72f92a3e96db96212c8f6cd06e.npy +02818832-48973f489d06e8139f9d5a5f7267a470.npy +03636649-845542d0f578a9db1ec48bc3c478566d.npy +03085013-a86e4fb88103550d4dc96c27c8aa82ed.npy +03211117-dddc8d8cdd6361e49c9fa9de1518212.npy +03001627-11040f463a3895019fb4103277a6b93.npy +02933112-bbdaeb32d4229d70c59350d819542ec7.npy +02773838-1b9ef45fefefa35ed13f430b2941481.npy +02828884-8553cd048bbdbc15ad5067eac75a07f7.npy +03001627-e4ce4c2a3709855450064625270cfef.npy +04256520-81a032241031c2e5f97ef3b999ddb957.npy +03991062-92a918828b34ab9372652f4081ec5a77.npy +02933112-9deca642cbf3e4ef49a734174fea032e.npy +04468005-75056755fb8f1fc92217baa3b8e01690.npy +03001627-71a52b54d732450bdd766137cdd5195c.npy +04256520-e93e9beb358d9fb8c397356311cbeea4.npy +02933112-4dbf616f15f8818ba3f600c356573d21.npy +04256520-c983108db7fcfa3619fb4103277a6b93.npy +02958343-f5a54f0cf2b575fa9fe1734a6086750.npy +04379243-1ffcbc064f473b7de7c13848b2d8f5ec.npy +02818832-42e4e91343b44d77c3bd24f986301745.npy +04256520-7c299b1e1374a538e78a749ef6aadd72.npy +02801938-52d197b32476156334b599aa7a6234d3.npy +02880940-d28f7a7a8fbc5fc925b5a13384fa548b.npy +04379243-f7bdfe5af3b26d1b5f06dd739e88c77f.npy +04379243-c9a3ea912a35c3e1601bea3dca268229.npy +02933112-ea48a2a501942eedde650492e45fb14f.npy +03636649-6ea3addd99f0106b77981b941eb4f5d1.npy +02691156-5f9d38e5e7fef49f7a571401e6605fc2.npy +04530566-5e6e9a61eb078041556f795d265590.npy +02924116-803848450b34284f41cefd10ce5d6cc0.npy +02808440-621f1f65eca6fe7fd7c9d85d3b7335dc.npy +04256520-5895b40b8c4d103ac60ea5009df4047d.npy +02992529-39e571ec1bcd371bb785a4ac4a0dbd73.npy +04379243-df74203c0a1585f9a29294366c3334b2.npy +02828884-38441b4582f29c8cb2a965e75be701c.npy +03691459-5e6d30de53afebe2fb0a4dd466ef3d66.npy +03636649-96e1ba69697ade7682db9fca4b68095.npy +03001627-c94f7f5ec96e10994231039830c7e1d1.npy +04256520-d7b69d5015110b1e2c5b2f528cea9dd6.npy +03991062-bad0dd72e36add64a2c59a4d90e63212.npy +04379243-65bb2d37c52ce089e76bc197b3a3ffc0.npy +04379243-83464126ed62ef54707cdefe012d0353.npy +03001627-32fcd056e1c474b84f5cfb5dea01f97e.npy +02924116-8357b3db7aab85a3e6f75728b7e2cf7d.npy +04256520-c9e41b8e7827cd963dbb061ded33aea.npy +04530566-3c785a132fbf152249d508bbe117085.npy +03636649-7d4d715c4812e42cc0f8577a553db1b0.npy +03636649-4843b9c8523a4affc29d936f5ac7e23.npy +04330267-fb05baf6da5b0856875c4d98e634f167.npy +02958343-16bd0438de54fc91b1bb46d2556ba67d.npy +03001627-6acb045fe11f7a81f771b7c5ceefa9be.npy +02992529-fa14355e4b5455d870f7cd075189ddd8.npy +04379243-3aa65a29330bb87f980f165bc2b4c765.npy +03001627-7726993e4b88223fedc32c5c9ec9f827.npy +03467517-a38684b166ce2c77c155f88004a92bc8.npy +02691156-45c4867cd4554e7cc863ab010b80d9ed.npy +02924116-da99c75df648834a34f4804e95b55ebc.npy +04004475-51da7fc000ddc4ab129e8b646eb2bfca.npy +04074963-55858ff5b407677f35a527bc320873ed.npy +03761084-4c9a1496692048922ec64b86eca750d.npy +02828884-456e373768179bf3f155d75bbf62b80.npy +02818832-a13de93c557a327c36d8dd30a594b2af.npy +02691156-16079ddc92f4c9efd677715e63c14038.npy +02924116-2f0663bd37ca4e0db1d8796911acd773.npy +04530566-508e6fc3b47590556be64995e9ed73eb.npy +02958343-d9049f432296ed36afe1d4530f4c6e24.npy +02933112-d6a55d2dece36ca0e3f7a74e12a274ef.npy +02691156-6d93492543d1087eb87697d3904b168b.npy +03636649-bda58405e4e3319d809772d66d13ee02.npy +03001627-5e4552935979a7a1c25c8c68d88e274e.npy +04256520-af28dbdce6ed8cea19fb4103277a6b93.npy +04090263-b6f2b71e726f5dabab97b3fa5a6b9e6e.npy +04379243-838b05234e648ae5db4c5469c0c1ba80.npy +04379243-7e27606e126c023d5dd94d7a8cf82d08.npy +03001627-d7b22da1174eade770bc652a18e29c3d.npy +02808440-783c3fc429a969b6dbb76013b759885f.npy +03001627-6a878ab386c927e6d1a63a2e2039ff73.npy +03759954-cbc023955a18d8167964ba700cd97f5.npy +02958343-7022a37dd7fc841ce98e65cfc071e8a0.npy +04468005-ade5ec555dc1f0df5706d1c54190f27a.npy +03797390-633379db14d4d2b287dd60af81c93a3c.npy +04256520-70e3bf6b0eb99dd6cdcf4980e386b48d.npy +04530566-dfd7315b7f8a07ca67585a906cb87a62.npy +04379243-4ef4f289b6c23719588e951dcb8abdba.npy +02808440-f0e4c180558694ff904951ea0800d3f0.npy +03001627-b9c0dcc854da8c7d60558e0a9a66f173.npy +04379243-ae5631ecb6ed463f5ad83814029a1a10.npy +04090263-5ce262d2d63b4c56357baa13baa16351.npy +02691156-ed4aab2d41d62b49895ae53d16ed9e39.npy +03642806-81ba52b908e4e1bc8ca8637757ac3f67.npy +02691156-ea6ccb2dfb61484caaa29616be3e223b.npy +04530566-d3eaeb69557892657828ce3c6ecfce8b.npy +03636649-5926d3296767ab28543df75232f6ff2b.npy +04090263-c91b4aa1105a0e506a34aa94ca8a3355.npy +03636649-92d7ce3f06a44aa582db9fca4b68095.npy +04554684-fcc0bdba1a95be2546cde67a6a1ea328.npy +04379243-ed30f840756baab042678d21fbad4632.npy +02992529-3dac1f92b3e13977d19f91734fdc72ea.npy +02933112-b06b351b939e279bc5ff6d1af2135fc9.npy +04379243-f5af26e3cc266932ea88b65c86e82a10.npy +04379243-8d247c6f6aaf805a2530bfb25087f2b0.npy +03691459-46bd2ce6ca3439c9c2687184da14e3dc.npy +04379243-649bcbf07f29fcae355d9ff291618ea6.npy +02942699-77096e9094680faf603e5a6a09a35395.npy +02691156-7f2d03635180db2137678474be485ca.npy +03691459-b9f853ae8b693ff91574d21c0c95092f.npy +04530566-1f5d3310cc5f9346f1d7b2f32e8fa69.npy +03001627-828d2c47bf56b15c49560f24b21df85.npy +02691156-b30bd72e684744c521b1ceea9c93aa79.npy +02808440-9269512d34ab85213321831d2245cf06.npy +03001627-8b005a01cf4ae50dab49dceef0d15b99.npy +03001627-e00291d775c572f5e8f8c11a24c52ebb.npy +03001627-3bb8e6e640c32a7c36b0f2a1430e993a.npy +04256520-642aba784c86bb67fff16555386d173d.npy +04379243-f70b502758db5927be2f6e4bb98bc38c.npy +04379243-72f46e20632f469c9cf718a4c796aece.npy +03991062-35bfcbb0af43d0d6980b4a4e82abb4ae.npy +02992529-e6838870d0138aa43b995d74ae757c1f.npy +03761084-70f55c83dccea88043c8f1cd479ffb1e.npy +03001627-ff2dbafa8d66856419fb4103277a6b93.npy +02773838-22065bf26a7da50a5c4dc8ac281ba59d.npy +03467517-9992c9f68e5c3e004dfe0ed95d7290cf.npy +03624134-9dc11afe70cf097e497c98fff4316992.npy +03046257-772f1ed7779459e8d835a15bbfa33167.npy +04256520-6024afce9a12fd87318b348b36fba247.npy +04256520-d04a6f268f16bae7d472d3bb6a889c20.npy +04379243-71fc8c7cdb48978282fa4d4f2c19b2ce.npy +03001627-408b8f2a75350af98ce66f12ba927a2b.npy +03337140-13d5f9d6a7464e39f0f01f1432a517c3.npy +03001627-a7ae914aba9eb59d84498bc295cd5a4a.npy +02828884-b20a0209355ef6ddfe6460d8d9bd16c6.npy +02924116-ffcbf6cb730ea266296fe052063ec1ad.npy +03797390-1a1c0a8d4bad82169f0594e65f756cf5.npy +02808440-f327905a8577d9adb362845c6edb57fc.npy +03001627-3fde6688ea2022cde0f6ee1aa6b96429.npy +03938244-c665ecfac697faa1222129b9e83640a7.npy +04256520-fab5f1daa52608365768db72e79a5dd5.npy +02958343-b52486fac51d119110c18c6084937a7.npy +03761084-90ba871e45aa1d10b8bdb4201eaa026.npy +04379243-4180532fda31d19b37251258858a7a58.npy +02691156-642e481ed56874eb19ba010ddb4974fe.npy +03624134-32d009edb5d9474c4e79e5d262243b08.npy +02828884-b859f6e61529db7b195c5c738f050b29.npy +04330267-8295e45a734c059d1f3d773b4af1f0c9.npy +03001627-2b82a928c4a81fe1df4cfe396cee719e.npy +02691156-35892510dcd7cebb87bf26680c510802.npy +03001627-faeb171add09f98cc8687ff9b0b4e4ac.npy +04379243-3b2855b73aac8d04d6686dc2df08cca5.npy +02808440-cc060d05ecc6b760cb6267f1b348aaaa.npy +02958343-efd87861810e35ca921cb81cb1632a5e.npy +04379243-11a1bb35960f02d83dc1643807625350.npy +02818832-6e5f10f2574f8a285d64ca7820a9c2ca.npy +04379243-4b455e9b8dc1380dbd508cb7996d6164.npy +04379243-7822d47b9ce66e5591a1a434bc319a99.npy +04090263-326eb76ab05669c55e9786b1603f45c8.npy +03691459-e76108274392bff53d91ae2b92426394.npy +03593526-31b0a01063a976104725f67267e31c89.npy +04379243-10e7056ac077a0f54a111702084d37d7.npy +02828884-2a050ecb95f2a056593ebeeedbff73b.npy +03636649-a3c4ce97b725fc2c5f57ce7e4ba40e2c.npy +03624134-65892e0f7f93129d14cb807a24b99e1e.npy +03001627-5edfec789343e0c3319f1c1eee46f332.npy +03046257-2022b303e954ad7ed603cac03886a314.npy +03211117-e7a14693e9c70577ac74d552b6a649aa.npy +04379243-a84f09300e4b1c1ac624b11e153a6d87.npy +03691459-8310e1e0a80ae09967964ba700cd97f5.npy +03991062-ea662c8a7f99d7d1b27dc9f9b9dc6f03.npy +02808440-3f61daaf0f87563b4ed5b40788f6ba60.npy +02828884-16549eea10c75d0f65d3152da5208307.npy +02992529-72d3c4148500a7fe1bf02ad5664135fe.npy +03691459-c6c69578203357f3e3bf55e5ac6083ca.npy +03001627-facd3e432232c27f245ac1812a4e4d0c.npy +03991062-febef99e371fbc27584536aa725442da.npy +03001627-4aa9b5829edec8ac4671d97b0fd17f51.npy +02924116-61d3aefd8450ab0b41cefd10ce5d6cc0.npy +04379243-33dcc9e237783c3c955824885d6e7dc0.npy +04401088-27b4f430b881e16ad6339cac3214b6bf.npy +02946921-f390f6d6418135b69859d120d9976364.npy +03001627-45220c3f4fba09fc665309339296e85a.npy +04401088-f5eb39c7d2e7452ee7ef9fff09638f8e.npy +03325088-75379bfc4f264daec36fb70296e45483.npy +04090263-ac1ad4d7ac10f3e1db6f3ca49e992ad8.npy +02958343-4d22bfe3097f63236436916a86a90ed7.npy +04379243-fe25a9fdbf70cc25f81ed792b3a38b04.npy +02933112-d7c671ead816afdda2aa7d89ba9aea43.npy +02933112-cb506ccfb07faa60f51f77a6d7299806.npy +02992529-8b08eb5ebea05e49a3ed2b429444c197.npy +04379243-4df3ce9b02b4765b1a8db2c23945f1fa.npy +02958343-676e3e6067fc1b065552c4ac8607d25.npy +02828884-f8a1b4d4b7813afe55cb90b2d132a49c.npy +04554684-8dee44b4cd1f34ac856e3ad6b24f68b2.npy +02828884-5b4cc3097e79fd316c262ba0bee45d20.npy +02958343-45d4fae3d107296728e9ca8e8fb04e0a.npy +03691459-dc9c9ce6dc9a771f500158c23c4c5a8e.npy +04468005-837c94e7125781e9978a4784edc632cd.npy +02747177-e6ce8ae22ebd6183ad5067eac75a07f7.npy +04256520-f78b75284089cd6514038d588fd1342f.npy +03001627-c93a696c4b6f843122963ea1e168015d.npy +03001627-8a1a39223639f16e833c6c72c4b62a4d.npy +04379243-fbf9b1f026a86d59eb5bc459c7142a3.npy +04379243-702cebffa33a19f019f079d1b712f46f.npy +04401088-128bb46234d7250721844676433a0aca.npy +02871439-ecb9b808a97c3b009725f8348364f5a8.npy +04530566-1175df3d5cedc3365c00e52236fed2eb.npy +02876657-44e45054f9ef4e251881e4573fc7a947.npy +03001627-73b96acec1ea41d1ad484915511ccff6.npy +04401088-342ef21b1ed9615685feaf23dbe1f454.npy +03211117-41bfdff7b99c13703f7e27638e63d848.npy +04379243-67e6cd9381c22b9045c6cb69e0968783.npy +04379243-1a80520ab14439ef79b3e1be3524f72f.npy +02924116-2f9c60f6eb0a4ac1b4b1329ea0ab3ba4.npy +04379243-4b4b745af2c816c28ffa76d198ce7f6c.npy +04379243-32bbf7d09d3acd4c339797c21e8801b1.npy +03593526-e571895508fb587a561dce3fe08634b7.npy +02808440-896808e1daecd437d72076e39d62f17c.npy +02958343-8a2d335efbf40060481c5c74462bb8fa.npy +03001627-6ad7e3a8e6f3ed1dd068cfb43a81fc7.npy +02876657-b1e5b106e6e25c44a4530e3038c81e85.npy +04379243-289f7178bfabe667550a2025ec9eef3d.npy +04379243-54d17ad404678720d0a96520c31993ad.npy +02828884-2346b4f87a4f683b92e6829c9c63f7e8.npy +03001627-b0c70ce8427da34d98e0d1738edd4f19.npy +02958343-c6978e2a0ef9f0df866f1a483075a782.npy +02958343-4359a0878f823f5b96e24f86f1144c52.npy +04530566-209213f07114a06a2b249fd16295bbfb.npy +04256520-37e4e81fda1f2c923a2face9eb30ef55.npy +02924116-98092c327e82dfa834ac4f8ff2084698.npy +03325088-2f44351ce849a8056f893b5bc716a3fa.npy +04379243-53f5bd148ec293f92f44039661980ed.npy +02691156-fca4c82b2c488d329554e5818acd6e12.npy +04090263-ed5e68fcb3a7be0c886fe00dcdc18c8a.npy +04379243-8c89f56df87eab907e5207b5eb59c49c.npy +04379243-e5567a82c577e8af83ab2e8865eef185.npy +03001627-c7e590c0390e8d5debe67d9b32c3ddf8.npy +03211117-6a85470c071da91a73c24ae76518fe62.npy +04379243-b85174a2ea03f4189cd431573238602d.npy +04530566-cce41dda51ef0335a413908c0e169330.npy +04090263-c9812d343e4e376c95ff232cd38210b4.npy +02880940-454fa7fd637177cf2bea4b6e7618432.npy +04379243-7462ac6e44457697d017709a3cfbb660.npy +04090263-beb9c8ac912c770bd5e0e036a4082b58.npy +04090263-b5afc3eef7f7213250b870543ad6330.npy +03211117-d3bd7aa1ebfa45fcfba7d64da57889bd.npy +04256520-6703a4ef8b0ce866a6fee8e2140acec9.npy +03636649-74dff8f0a865368b4a8e02787dff638e.npy +02880940-baa4d6ca9521a55b51d6f7c8e810987e.npy +04379243-1dce0f95df134fa6498e56bb9f3fbb8e.npy +03001627-aed911c2849ce53b707cdefe012d0353.npy +02958343-ebd820a0694086e81f0d59cde6139796.npy +03948459-a40ea0c5f83700cec0f919a9a9f1e7fc.npy +04379243-df297071493f894e79b3e1be3524f72f.npy +03991062-53f3285cbd0c4add1620f4d6ce4714f9.npy +04256520-9177c05744b77b6f6157c3a167984fee.npy +03325088-72861dc714b3dbe2b362845c6edb57fc.npy +03001627-e3a838cb224367c59fce07ae6c046b8c.npy +02808440-2962e044492c43f2921bd8a746d486d6.npy +03001627-38201114b7f2c48d6c63709946cf3bde.npy +02691156-fbe213adb802384db443c685f436f80e.npy +03001627-8b6f776954e65e7ab05550de345b6d0a.npy +04401088-1a9707b3e9d8345048891ddb73756acf.npy +04090263-2f2e30fde0c26bb36b2c8bb96250e4a0.npy +04379243-4a72468fa13c36cd2bcc0cde35567dc0.npy +03001627-5162651a4c6da72e8a5e49d8f4867e8f.npy +04256520-20f82d98b188f16cad885ade4bf3150c.npy +03636649-1d21fef4a67153dab76e29c9c43bc7aa.npy +03001627-114b563de051057fcda85f6a3e19b0a1.npy +03001627-96eb2c84ab3b8df0c175a98f27dc2236.npy +02924116-94e068a4c09efd6ae2fbdb7fcf40400.npy +04379243-6c4c3bfe275e66b1b75e606711562bfc.npy +03261776-5fbad7dea0243acd464e3094da7d844a.npy +04379243-49c0aaeed2f926e3f2cf6a9bef44d625.npy +03001627-b0cef14f184c10e14af957103f4767ac.npy +04090263-87a868bd1d4cbbfbff56a19447480f3.npy +02958343-48aaa1fcf8da645c68925c742a212a74.npy +02876657-4d4fc73864844dad1ceb7b8cc3792fd.npy +03001627-79bd56e6a44e5bf1a3f600c356573d21.npy +04379243-3037fac5bc67207e23fa92d98173c06f.npy +03991062-49195d1e985bda23bd9d6adb1ec203ef.npy +04256520-36f7e8086a8849fd5883ca9b41ac387.npy +02871439-184eb80b82bdd4e1159f1e6a557f2ea8.npy +02691156-55ce4fc0b3df0234bbf3143b1cb6076a.npy +03928116-a5e01dbc483964989ff9b70e6ed76515.npy +04554684-8405ab2d49b428b191219aad82abc053.npy +03636649-9cb61effca346d48eeed1ac073f42256.npy +03467517-d52f696ab86b354624933d5e1bb8057d.npy +03593526-3834ca6d4c3fda9d5b2ecd212557fda0.npy +03001627-d1ec6e9b8063b7efd7f7a4c4609b0913.npy +03001627-671d51da473849c7369a4f66bf103682.npy +04379243-268436b1c1750a1e14659d605ff53c6f.npy +02691156-265e6c77443c74bd8043fd2260891a82.npy +02958343-12909f5d613953b8b3c9b3f81618206b.npy +04379243-1b01ef65920c342323bdffac38e6b250.npy +03761084-d54fce16dbf7ba12b8f6d409bb3f1e7e.npy +04256520-294fe191a191f812917b96045c9b6dea.npy +02992529-f7fcc773249429a2761eb63018291094.npy +03790512-4548d86cf7f1c11ad373c34785838ee4.npy +03001627-92ebdd82509fd637593ebeeedbff73b.npy +03001627-f444df40dadd83e22cedd65b2f6d1fdf.npy +02828884-e86a2291d77b8ff9408623dbb138b966.npy +02992529-e9ef88d72ead910b8b431083b6191e2.npy +03046257-726c7cb702cade25ad1da5f59ea6f4e3.npy +03938244-4b351af9567719043a4cd082c6787017.npy +03001627-f66ea5e07a8ad9eb283b00891f680579.npy +04379243-1161ca9bbd655ca17b431cae0dd70ed.npy +02992529-8cac6df50c515c498be6bc9d57b6a438.npy +03593526-b517eed6f77a7a39586574d8cfbafba0.npy +03001627-2a79d429e9effa6de7c7920f6a65a54d.npy +04401088-89d70d3e0c97baaa859b0bef8825325f.npy +03691459-bb3667b3a72b0bcbad6ba00d22308a6c.npy +04256520-94463eb34be49887c3bd24f986301745.npy +03211117-816eabad5c1ca552744107c67e903f9a.npy +03790512-a19d4bb8fe4e70b9d97964d17de80d2c.npy +02691156-a2b6edd3f2f060c7ca8607f540cc62ba.npy +02924116-276002136efe5849193d7855ecfc1bd3.npy +02933112-70d390b1e9b3053a22ca415af010d9a2.npy +04256520-7c68894c83afb0118e8dcbd53cc631ab.npy +02828884-909fcd9e329cd49581faebbdea6bd9be.npy +02880940-4530e6df2747b643f6415fd62314b5ed.npy +03593526-701ea218827f9a7a733657da4b6687f4.npy +02958343-6969e9ed46acce2fa7fd25564c2e888e.npy +03691459-ff4bc6c329ec7bf8a0eebc16d3afb516.npy +04090263-5c1d62c9ff844458cac68db180607870.npy +03001627-a3688350b1556cbe65ba78ad9601cf1b.npy +02958343-d471c4f43f008df5c1bcae9def1986da.npy +02933112-785b58a111b0498b9572486e5a924845.npy +03001627-20964e03ef001d8910684e111251a45.npy +04379243-43ca66b4cebe3aab41c3fecef2f1308d.npy +04379243-499ab88b7bd33cb92466f73de2a564d0.npy +04379243-1ef6c2b9d413fb7c681404257d94ad9.npy +03636649-dac3843c8f77b34362a510b8f97c658e.npy +04379243-cb6c20669c6d1dea593ebeeedbff73b.npy +03001627-f4a0d0169abf306a754ec1f2eef2c6cc.npy +03001627-87f8fc2fdc88e4ca1152b86a40777b4c.npy +02924116-c352ab905d6f741c2913b5e01aca8e8e.npy +04468005-c7b805e1ebea97f0f4ad1770263e7f39.npy +04256520-93bd851dc5bb3527d437a7a1ae2552ff.npy +04530566-6b87ed6710a0fc8d8aae7c4db7244339.npy +04090263-6de1ce73a377df3633faa05410dc119c.npy +03624134-bf07ece7d3c0a28f9d40dc50674e6347.npy +04256520-1af92afe68b3f837f51f77a6d7299806.npy +03991062-2ab54e76c7fb6a3bcb2a965e75be701c.npy +04379243-96d3a59baa02d7a47d117016cd1926d1.npy +04468005-367c2b062bd2728e40f45eea058ceeda.npy +02691156-9b62f887f1839e5f4c3a35cee92bb95b.npy +04256520-a247bf1e595abd266080784e4b7841e1.npy +03001627-a1ef57bc2563ec37dcadf30d9ccdd100.npy +03467517-2376a95ba9a43414c94b36e9b7b92195.npy +03001627-f083f6f7e9770fb7b161f36d4e309050.npy +04256520-c0036465dcbeed6a912f115faa04d51.npy +04379243-a2dbd26e8a382509738e43095496b061.npy +02933112-57dc5950f0a7304d4da5feafe6f1c8fc.npy +04256520-23cb1d667213c3a7e897e87345fc323b.npy +02747177-2f1510cbda5a89e2bf3f7db9590eef44.npy +03337140-44d1045be6acb7e5920de219c00d1c3b.npy +02818832-ce0f3c9d6a0b0cda71010004e0594e66.npy +04379243-ad243c4ca5f44fb828b75d6c308e3c12.npy +03001627-e84b5bbe91e0636cb21bc3cf138f79e.npy +03001627-e9e7883a296587ed804722305621f918.npy +04401088-541cc8b3ccf4c799502122ac3599bb74.npy +03001627-2669d4df8adda44571a782a4379556c7.npy +02828884-c293f2fbc66af3dbf4fb4dee5181bee.npy +03467517-fcfa96b85ce4d6114e96698ef01e7360.npy +02808440-47f4bab4593437481c17aef130ed6213.npy +04090263-c8a74709a6a0724f96a9670983483761.npy +03046257-d322992d2c1df38b75119b5f9ee576b7.npy +02992529-ec39e26f8c0829b3413ef77469a0f9cf.npy +03001627-b89952c6f2dbc1aea50b88953d263a42.npy +04090263-c7f54b82e3b1682b65564d9c2ed3b493.npy +02691156-43abe330362164e99be82ec29531a70f.npy +03001627-5ef3e4abd4386c8871bc6030acc85f1e.npy +04256520-48484a86775668cc7e77281775c253e.npy +03001627-8778c23fd21bdebf8a80d99ff4e76c20.npy +02691156-66e60b297f733435fff6684ee288fa59.npy +02958343-dedd7ee03210ff8a1ccbd9e5bb82dd04.npy +04379243-b9fc2f624533bb8119fb4103277a6b93.npy +03211117-ba29aa5a87317ee09327b89c3431616a.npy +04090263-8ab72b47faa4d2d4b524fe86a5d055d2.npy +04379243-acf57dbafe8966f577fb15a8d7923976.npy +02691156-9fb0988ef701a11388170d426b6605b5.npy +03001627-bd41ed35fcfc0ab7b5e2296ee51ed515.npy +03790512-6309c20c1ad258efbb297232fe17fe77.npy +03636649-f01cf64f05572ac4b509f4ddcfa8ca1.npy +04530566-b791549dfe175150a7d88fdd8b14a0fa.npy +03513137-8f17e31867f1968969b2407ca5e1a9ac.npy +02958343-2f369806f69ba9cb55048eb8b7ed14b6.npy +02958343-c92ef17bef6471f72a9eb0f146e94477.npy +03691459-aaf32dcc3d51cdfe81757e1914c08a9b.npy +03593526-fed045d07c91bb2723901b5a0f119b35.npy +04379243-240ddf8b63318ef534506cc3910614fe.npy +04379243-4132539ff314f0654d1fe7f29df13cf6.npy +03636649-19388898dd69dd9fddc8e6d1ec6242c3.npy +03636649-869836fe379f585a732b621b679fbd70.npy +02747177-fd013bea1e1ffb27c31c70b1ddc95e3f.npy +03001627-8c3a4f26d6ea2c864a3bb1a89bb7ce84.npy +02871439-21e537b6d8b8276fd138a53ab0d038a5.npy +02958343-f70df58949dcb108b682148e4ffe282d.npy +03467517-e5ff4634ee6d00323f00d55155ebc541.npy +03001627-38f8b44fc8dac88ce3c886e48eaa6e2d.npy +04401088-e4a0f08d8a6d487ac9de9dbf8ea0d889.npy +03636649-48fc49989a124917cd4a89b0fee32930.npy +02880940-2e545ccae1cdc69d879b85bd5ada6e71.npy +04530566-da15ecf40742e9e46d813b270092aa6d.npy +04379243-6eddf598e4199497d684faddec3c0090.npy +03001627-3e427b76d051cb9ccdea755aedb6e3f3.npy +04090263-2a45063d7d03b865ebeab56de94a5835.npy +02933112-85f41119ca2bbde1dc1f6c4cdb4bb9b3.npy +04379243-a530dd6e10797f3dfa5f1c647c19b0d7.npy +02691156-ce2c4502b06c3c356abde8e1529c422f.npy +04379243-ab0393b07d2965ef79675bb6cb63c97.npy +04379243-d3b715e7d98bfe98658d908a2254f194.npy +03636649-3b5f0c01c2b914fc6f16f167d27a7dab.npy +04401088-180f36e0bdb9b33f53de6f45c4ae68a9.npy +03001627-d8358969dad764edbb6f5a9e4b6b8b34.npy +02924116-bc22e40a72a1fbbce99562689078395.npy +03001627-9b359e42a5bc98572085b87de8f7581b.npy +02828884-10654ea604644c8eca7ed590d69b9804.npy +03001627-a3260f0c8fddf11cf0f4992137d8f4a3.npy +02691156-f4a5b28233523a4e588ed1d0f708d42f.npy +03001627-2b90701386f1813052db1dda4adf0a0c.npy +03593526-bcb86164cb709371377f115011370864.npy +02691156-c781fcd64271dc15224d7b1b956e1382.npy +04256520-167088246175f31c593ebeeedbff73b.npy +02958343-85f6145747a203becc08ff8f1f541268.npy +04090263-d442863599da17d951cfdb4c9f126c12.npy +03636649-9d41e23f00d11d153033d35b49a20c8.npy +04379243-93c2221188b4948f79b2fbab4d71b78e.npy +04379243-38feb6b209579f6faadbf8208284c675.npy +02958343-90f85f62885afeec65ca154580c5c7a.npy +04256520-6645c2afd5af2cd2610c2a68437007d6.npy +04379243-242b7a0fa9e9c439b20aa91e9e90c311.npy +04379243-8b4ccdf057b895f888a682c7326c32d1.npy +03948459-d3baf46b6c8a162fa267c8b6fcca89d9.npy +03001627-d3302b7fa6504cab1a461b43b8f257f.npy +03636649-605ddd207eed0d81414aaa1b9210e59a.npy +03211117-d4bffa0adec5f9a73387ebdfbbe050db.npy +04379243-26b2a15646f6a3a06f1e07a56c129dfc.npy +03001627-c0e5edb2602a7bbbab3d781e4dcb85cd.npy +04256520-af6ae25b2e295c36d79b19c7c4f0e293.npy +03001627-b37c77a90ba66c92564339cd0fd02849.npy +02871439-f7b449e5cbbf1ad26402b8f491cd92c7.npy +03046257-f9c02d4ef3c07b16c0a61ad1cf92b694.npy +02992529-97669779da217dce4f37c101c765cd3f.npy +04379243-fa7a5f65c561d9d2fc43dee2a1d6272c.npy +03001627-5fd2483e98dc2ddef3c9c1464e55d580.npy +03938244-5ba3bd3907f4513636902d83e4cc385.npy +03691459-56e2ab8ad78040432b3bd152980e4b5a.npy +03046257-5a9ef9410163bb569100b79b765fc7b1.npy +03001627-fe47e7645f1080735f0277eebfd05be2.npy +03001627-95e1571acdd75922afdb9a672b7d3b8a.npy +03467517-e4a2c2b16b5425825d90edd33668a4c2.npy +02828884-459cad806518f195ba6d436b28fcddfb.npy +04379243-e7ed7eeb46e18296fdb9ebad3cf3755b.npy +04379243-44087c74e5ea66dede436dc05ae39dcf.npy +04090263-c65cf6b063e1a21025251b7dc26d833f.npy +04090263-dcc3914659963636b2c8bb96250e4a0.npy +03325088-ade333c657e7b1c2b362845c6edb57fc.npy +04401088-ab2e514557ecb359224096f37ce8c08c.npy +03001627-b06f26c5403c3e922e653f6e789d3d8c.npy +02958343-1254c6ad2b420879d7622e6da48b19e5.npy +02958343-48260abd4ff73f99473f10e6caaeca56.npy +03211117-23c99db82c910931e2c8e43c97ec5a85.npy +03790512-3388b8d2486d366ab19ce2dec0d1925.npy +04004475-37d9a0dfc5051bbe8d793f7f9f50b0c7.npy +04379243-6b457dbbd8d875afd3520bbaf4a08c12.npy +02924116-ff7348571fde88cd6c1dd93d4254dda5.npy +04379243-8cd0334f04368168b8025ff83c807f47.npy +03046257-33d36c060f80361b4b3c42e318f3affc.npy +02828884-6319038bd4748a03d2b12aa6a0f050b3.npy +04379243-db406d9b2a94bce5622d7484764b58f.npy +03001627-2a56ff0143d4e69fe6fe3612af521500.npy +04379243-d15135247c2f52ce420e437840bac4fa.npy +03001627-3e53710a62660c60c39d538df4c93695.npy +02828884-ddbcdce0db6aa00524b325c2195eaee5.npy +03046257-c15389c173fc1cfd415cd6d00346fc76.npy +02933112-47f477a8b67d28028f1735145fdf5c5c.npy +04468005-b5bdcbf79ea375158be7c8c5fdb9bd6d.npy +03325088-940eb228aa016a3a6d86099178635a1e.npy +03467517-e70d5369f840577593f0194265a9746c.npy +03691459-4949c92a3f0d0946f536dbb8b34a9553.npy +03001627-87cdc53aec65aa0ff51f77a6d7299806.npy +02828884-8277bffcffda5c4edab3d510e4b89249.npy +03046257-c0add30f5a2566165e29ce2c9d37b952.npy +02924116-6b4a68af3d9636b96076a0921edbd4d.npy +03001627-bc92651fd7cd9ca8cf68feb7ddf815ce.npy +02828884-f98b9721d2f5b3d7f4f81e1d4b32b45.npy +02958343-ec65260a83a395e850df5ffbac7e7f74.npy +03991062-22e28d8f92a632ef2dacb6509c7ddd54.npy +04530566-6ec5e181c6df65d9a7afac0aa00dd174.npy +03001627-1d9dbebcbb82682bf27a705edb2f9ba6.npy +04379243-c35f0f50664264d5e6a1cd9763fc2f3f.npy +02992529-388415634e1056942ab70120fece57c0.npy +04379243-78218e7cf3b5f6026e24b3256330e605.npy +04530566-77327d5b8b56083415a0ff0aad35ca87.npy +04090263-36846ef535bd195efa45f4d7e1ef7d0.npy +04090263-eb39683f67d5d2fcc648677bc9b1d6ad.npy +02924116-4191757df8aed75952470de2774d6099.npy +04090263-317353de88cac813d9e057a3558cbfd4.npy +04379243-813d7c5131f6369cb898f6ca189a940f.npy +04256520-978dcc1e9c3f9a3f92a31ec18c4e190a.npy +02691156-9eef6307dc504b88392b84e3285cce39.npy +03001627-b1cbca9a2646b6f1bf899e941ea0fe55.npy +03691459-4829f4099c72420351c3197f6363608c.npy +03261776-4262c3dbd68a5c14957b6a4f3924d982.npy +04256520-1f0f9a821671271eaf288f952624966.npy +04379243-6e31a64910fa5fdc9db8ad97fd392b59.npy +03710193-150ae00a9d9d07788ae1c1abea367249.npy +04530566-3216e49e5dd304956bed41d0253513f3.npy +03325088-5943e3c0ec6edcbc76c18e71fd49c4dc.npy +02828884-ae99771e1f77fd2fa9bdc22a1e02e82.npy +04530566-3da3c73abafe7a9eb9e86d477b879ac0.npy +03691459-f6cccbb93c35fcaed49b96b9f2811c7d.npy +03759954-86e2b5f2603db0ca6ef604d255267aae.npy +04379243-e8ed10a7666a10a1edc98d150672fbfd.npy +03325088-e6c895dfe3150772b7a867e9b35a1295.npy +02880940-18529eba21e4be8b5cc4957a8e7226be.npy +02876657-14588e373cdb9143ca972ee98a070b3d.npy +02958343-7dfe2b1451449501588556e812e00901.npy +02691156-abb3c5d793e4c26d7aeb2194e56698b4.npy +03001627-6af354d0e86b1d5ed77c4541cb2e97a4.npy +04460130-800f8586461b18c238cd8eb23853c009.npy +02924116-682856891ee0318bc2876b98c07c9251.npy +04256520-18e4ebaba8998410ae8c9d3b8c4b9bc3.npy +02691156-20d97069df784e19a80799ffaf21ea7d.npy +02828884-4a5f9a0672cf3a1fad5067eac75a07f7.npy +02691156-ddc14c7e0a228663796843908eee8f7d.npy +02691156-816935cac027310d5e9e2656aff7dd5b.npy +03691459-6c2a8b174ee60c241ad88f716ea80910.npy +03797390-dcec634f18e12427c2c72e575af174cd.npy +03691459-17f87baa813447ab9588e71e21de9f30.npy +03001627-665bfb42a0362f71d577f4b88a77dd38.npy +03001627-8a9d6ef075d5a0721242c827d7f16c58.npy +03636649-85f71a4724fa37c33d39d8012919dd25.npy +04379243-5f100571ffd90f8252b4875f731f71cd.npy +04379243-63cde6b5e85cae2bf4b6538438a0b930.npy +03691459-9d43e1b188ac816087d72888c0a9277c.npy +03211117-3ebda8146a84d7e64fceb9938a41179f.npy +03211117-eb2b450565c77e3efc7ff8f848d1c6c9.npy +04530566-9472a24df8372cd42e436d38f27146ec.npy +03797390-8b1dca1414ba88cb91986c63a4d7a99a.npy +04330267-bae2babb26dc352b20489998d734835a.npy +04090263-bb7474cb9310e33aa7dd22c0aa3913f0.npy +04530566-206c86e4cf614dd5d03c0ce6ad42cc93.npy +04379243-a9ac09540c655b08d0bdd07d0170f389.npy +04379243-19dc20a7065fba0501a7e3ae8c65473.npy +03691459-9cd16abcc7fa224ce029fab54b6cfbd.npy +03211117-c2d39973237252e85e7087f2d9a278a9.npy +04379243-7e2c9dca60e09009df1d847ee0a8f3d3.npy +02942699-235a6dd25c0a6f7b66f19f26ac490096.npy +04256520-32cde5adb86d540a2eb3768aa5c5fa1c.npy +03467517-a4274a5db19db1ed7c8a96b42661aee8.npy +03636649-763ceeaa4ce2ce1d6afaa22adc38077c.npy +02691156-aa5cdbe94abd2ee15042e5fc5b753f1.npy +03691459-7d75382b7b9e7bcfd88a3e0e92891ad5.npy +03001627-a3d1cc17aff08bc7eab55e294b4eea02.npy +04256520-9d5461070e008c453bdc60e3df3aace8.npy +02880940-b65cbede8f483d51f7de4d28691515e1.npy +02691156-a051219f3f444fadc5e2bf7b5a5f1c56.npy +03001627-8b6f6304674b1280d6cb6d27840b9d7d.npy +04379243-56daddb695e25fac341afa383659322.npy +04379243-5214aab74399556959f8e31ca87c470e.npy +03761084-1605a1923b99fe6bdb4c5469c0c1ba80.npy +02958343-aefcbac53b05ed5a27404deef339faa.npy +02691156-260288918550573dc9eda6e157b92d90.npy +02691156-81440fcd51052844af7d907e4e1905dd.npy +03211117-25913689394d86bd158b0b2e23af3d37.npy +02942699-17a010f0ade4d1fd83a3e53900c6cbba.npy +03636649-cb60159e291c3e5cfcb8d8c6d4df8143.npy +03001627-5fc6b04623ae6a9963ed57e35c972b4b.npy +03642806-72133503ddaf54483e725ee552a0026.npy +02992529-d4a038b20b1250d7241d076ab53023c1.npy +04379243-2053961ba985591af51f77a6d7299806.npy +03211117-6011d9bbe9b04cf7b6b6751f39e7b3e5.npy +03001627-49f3a28d33c34838d74aae0eb2ddb027.npy +03001627-3d442388af50f61138ae3771b1788e76.npy +02691156-21bf3d8201e3e41f93358ca8580664d1.npy +02691156-7bc46908d079551eed02ab0379740cae.npy +04090263-188c3d3b8da2b83c2d4090ebfdad3018.npy +04256520-c070cc8563e2b3d65d06d6b9708d8ce0.npy +04530566-2e4adc3992a773b1eaac92a15231622.npy +02958343-38334022b922a9d4e7540f431cab4686.npy +02958343-44cc90939a67b72c71778fcae3da6f00.npy +04530566-4e5b83181a13e0661868b1150be0eef4.npy +02958343-9aca55eb91a9b348ab7ba9bb57593f51.npy +02691156-24bbc1f5225969fb90b1d6deb98feec6.npy +02992529-844633a98977c10d9eedb085a3d8dd72.npy +03001627-206dcd879e5c3fe8df4cfe396cee719e.npy +02828884-38d4d7313a3698704bbe1e20736de8a2.npy +03593526-e74cb96c0fc30d03993afecc2c675915.npy +04530566-cafc4d2198b6531bd5527b961edeb7bd.npy +02942699-657a650215e453846f90fff80f29e77d.npy +04379243-2444551d00693a0fab610b0c94236463.npy +04330267-c586c25a121326bcd621f96e518e01fd.npy +04256520-2c1ecb41c0f0d2cd07c7bf20dae278a.npy +04004475-3660a8b78046ffc52f81cb887dc35578.npy +04379243-a78273aa10b2dfb0bc8d334f99e7f52.npy +04090263-da9069b1bef61215716e30105a919115.npy +03691459-e6e085e31c30925466bdbbf263e9429e.npy +03001627-9fae8d94a028e9ec2818b21315fe1bde.npy +02876657-6444875e3217bf891f5f48a891d827bd.npy +04379243-b5168a95f760cbefa22728b9e8cfa4dd.npy +03001627-1013f70851210a618f2e765c4a8ed3d.npy +04530566-21256efa0a78f86b4448fadc60fab7a7.npy +02958343-8e72ff1064eef473714e6c6511843d28.npy +04256520-c281babcc88358f31ff05e2259c2ba15.npy +04090263-a83bfd1065f7dc34176d7cd6eb76e767.npy +02958343-bbca92f53f04d80d8bb5c0bf5eec83fc.npy +04256520-2a027aef8813a131624a1aaab5ca52f.npy +02933112-d77dd358b31497aae2f840a8b8c7384c.npy +02828884-bbe3d0864b95faca48d057884d36455c.npy +04379243-69c74567d77a88fe5af397cf24be6deb.npy +03948459-6640a8fac8b624a23d2e4fbab0e82203.npy +04379243-597b0d10535c25d538f21a3304cc4bdc.npy +04401088-2b829a38051e6f8d1f6dfedaba98d5f9.npy +03636649-59ca30266fb153ba50f93b609ce4feaf.npy +04379243-1aed00532eb4311049ba300375be3b4.npy +03691459-614a16b7b994063af6d28508a7c94d33.npy +04401088-bf2a5f434972f11a690a03770c5de186.npy +02992529-d21231fb7d7f7337f521a3dcd28e9d2.npy +04074963-9d5f59e259057baa910a53622567655f.npy +03624134-3b1f7f066991f2d45969e7cd6a0b6a55.npy +03337140-58f68e07e47eac944c3aee8e9d3a6ffa.npy +04379243-59dd1eef8072ad8de074517a246f1e65.npy +04530566-6cc258399daf767ae1942965937d3cef.npy +03001627-e193b0d75fa674142b3e9b6eb52d35df.npy +03636649-fbd59db93e38bdafc8687ff9b0b4e4ac.npy +02958343-e00169580fda5461473f10e6caaeca56.npy +02992529-1621e08661de948d7532dfb76fa58e9e.npy +02933112-4b006b7a2215db3d284f6213916dba67.npy +02871439-8a5783031f99e9d5c8bec3671aea0fa5.npy +02691156-448bd2bcde027ca9e5d07633dda45110.npy +03991062-9a630f5e08e2cd8d61a095aa05632df0.npy +04379243-4643de4838d7048437251258858a7a58.npy +02828884-df31fdbbf7e3616b774561c9c1990536.npy +04379243-87b15b50b03054360cbb0bb881f838f.npy +02933112-6d42969890762ef2ec8eb53ffeeadc85.npy +04090263-8f268f9f187292f1179177d1cafed62b.npy +03001627-776cdc2ed288076882eddefc99ebacfd.npy +04379243-8653180e64d70a47b3cf15c77de45986.npy +04090263-6dcd7fbe37463ff38d4ca42bc1bef451.npy +02828884-6a11450577768f2747d4c7899ba36cd.npy +04330267-f1ce85e56633c1cabea08f0d71567278.npy +04256520-d8142324c33dfe7595bea7c29e873d16.npy +03001627-ac47b4d30b598978d5a4a04ac21f0578.npy +03211117-5bf10196a11a166466ebaa8e9b491151.npy +04256520-841cb38f7447dc698e4182295c92f949.npy +03001627-5d3cfbc8bae19e701f580a0f9153317f.npy +02691156-df411aa240fe48d5855eb7906a7a7a04.npy +04379243-5db59a8ae13705bd7843fb4efdc19510.npy +03001627-25196058a95b4fc3359e362142e70c8d.npy +02924116-c2909962fd25520a696975d93fda1bdc.npy +03624134-85ced924eedc6ff566b5b592ed1ddee0.npy +04379243-7e3022a7bd00eb4195b8ea6a366e14d.npy +04401088-500fbdefb58e261af2cdad303f49c9f9.npy +04530566-f4923b4ce88bdda3a9142e7277ee08f1.npy +04379243-d007026a83d6be854e48282b72e69035.npy +04099429-e1cb02a589e09aa193a67322c4cf7081.npy +03991062-870c7ddd93d5b7c524042e14aca574d2.npy +03046257-6080c5b09917c23830c7810cba6da248.npy +02818832-ae200f07aa45b3381efae51bb1dffa9f.npy +04530566-6f4a328af926532b642f9e27aaf0c47a.npy +04256520-7173c0462d9ee2a344949d7685cb63ea.npy +04090263-5b37d0eaee45e12cea768093544ea6d8.npy +03928116-2b8f0dc6c0bd6764f5072ee3ec9236b4.npy +03001627-9930f9ec8e2e94b4febad4f49b26ec52.npy +03691459-d088d0b4cbf1d8447b041fd2144f3532.npy +02871439-538ccfb554d8179bf3bc30c1c812e48.npy +03211117-4516c31dae48a0efbff4c0ca0d98b77.npy +02958343-791885fd798b1981c1006ed55bc1a3fc.npy +02958343-6d61759c3f8636f816abce8cb03e7794.npy +03001627-ed7b1be61b8e78ac5d8eba92952b9366.npy +04074963-49c6003c2248bdd1906ed109a4ea50d6.npy +02958343-df672140efe7b8ca89e9a9eee39907f.npy +04379243-4791914b3bcaf57efebad4f49b26ec52.npy +02691156-d2842bc324b3dac5bc0909d98a1ff2b4.npy +03636649-16249c6e2a76400dfcb8d8c6d4df8143.npy +04379243-61b80232d3aa0a409ccce4c6d5bb195f.npy +04256520-d053e745b565fa391c1b3b2ed8d13bf8.npy +03001627-fe20f6a58ca6c84c914eb005afa6475b.npy +03001627-b899182610c12c78ed88a55f92d81d7d.npy +02992529-d98df8313cf5e0a7814fa32b2a1183d4.npy +04099429-aca0df6bbdb0ef3f870a795cbbf52b3f.npy +03691459-c76fc96ad122a33e75f6e8ca4d589c7b.npy +03691459-5e71a80c6ac94e0177818a0572bf1777.npy +02871439-d0739d3cc5c3549eefd584ddda1b5aa1.npy +03325088-b3565dc2c1e46134b362845c6edb57fc.npy +02958343-4a5bd025a2500b3b3967c36b4916b4de.npy +03636649-a1a81e5d0450d463df9c597227d75069.npy +03001627-79e5eb7be94f5479696b74614952b2d0.npy +02828884-d7d6a7fae6003dd6f4fb4dee5181bee.npy +03691459-d4562a410244eca8823eead1c8e7b3b4.npy +03001627-95e5f6e550761aefe65b629e4a22f51e.npy +04099429-777aa6841e1306beb5a9f8d018fc9500.npy +04256520-1299643f99c8a66df59decd9cfc8a5bb.npy +04256520-dcba7668017df61ef51f77a6d7299806.npy +02808440-e90977d3e1c960ed904e03fa15bd73ec.npy +03928116-35259e9bb2669df79bad64a9c6516f06.npy +04379243-3016d678209377c1c3bd24f986301745.npy +04090263-a669193672e033f512b38b1d99376c0b.npy +03691459-11d9dd7b170216eabc4d71e69505510f.npy +04379243-53ac82e4ef6af3da9a5ac88c7195fa36.npy +03636649-ee3bf15041b96387fcb8d8c6d4df8143.npy +04330267-8974fdbcf6bed0fbf0f660d2dc5ddf2b.npy +04256520-3610635cf623f3f8917b96045c9b6dea.npy +02958343-51e74bc165f2cb21e2a6bd02594b7cd0.npy +02828884-5f3782702eb8f2d421b4fad85a658c.npy +02691156-196d35794f869816db6f03b6829a5891.npy +04099429-974472ca7b895f74c6f5c7c0f17e11c3.npy +02691156-71f718d82a865472bfa44fe936def6d4.npy +03467517-12e30808350dd945f4b498e11fb60a4b.npy +02946921-343287cd508a798d38df439574e01b2.npy +03948459-18598beeeedb20729a6e43b878d5b335.npy +04090263-2970d1dc154363735960f9d4a75e81d8.npy +04401088-fe34b663c44baf622ad536a59974757f.npy +02871439-957dd2b31285002b4d6ef9ab90177563.npy +03636649-454b7345c01c404b6d0fc9460109eda7.npy +03001627-9d229e34818effff07d3e3c7bfacb95.npy +03046257-63664307ac493090b129901f80d24b7b.npy +02992529-420138dffb14f929f0b45b4b4c7e33b7.npy +04530566-408cdd476e8bb202852ae095a967f0ca.npy +02992529-ac0a78736d78a5a5dd8524baa80cc603.npy +03790512-481f7a57a12517e0fe1b9fad6c90c7bf.npy +03001627-cc25ba35b3f6e8d3d064b65ccd89778c.npy +02691156-857350d3e780366537678474be485ca.npy +03001627-510fdcfcba1bc18ea1081ad712f6fb3.npy +02747177-22213dc6019c215a81faebbdea6bd9be.npy +02808440-d7d4367ef5ee5991b362845c6edb57fc.npy +02828884-f8dd3c18e0735bb4b2644d7d4d7ea2c7.npy +04379243-2cafcc8c772d4860c2d043ecbc42284c.npy +02958343-2f2ed1fa349d50f3bb15a692385994d1.npy +03001627-e41e8329ed0c0b88d93768e7b9b1eabf.npy +02691156-c5ff8a911c2780efc03676083f8f4de6.npy +02924116-f90cfb1b651090cc477d87ca43ed5744.npy +03790512-966cc24ec5fb927b22b51f1a980f45bf.npy +03636649-88257c5a48d94b1e2b151d8b52c53b90.npy +03467517-f6884341f0d6d2cd69a645978ae8c765.npy +02954340-30be60f95e2a3b47a6e67635b9d1cee5.npy +02942699-9e91f482b829c4d1e9fff7dfdebc774b.npy +03325088-ce69c6b309dc055eb362845c6edb57fc.npy +02808440-a8765cfb0701f015fe52ffd0e748a1ab.npy +02691156-b80131dacfa19f77337e02e3502c7536.npy +04530566-d214cdddcfaeb0cbcf8dc8d39d90900d.npy +02958343-4f54d7acc33111a56afa0fe12a1de326.npy +04090263-f5cfa769619f708bda733a39f84326d.npy +02958343-de683c906ed97d7456ca31471168385.npy +02958343-c617227027a05eddfec731b1d5d5cac4.npy +03636649-dfe800d8d8642e9647bc3701b998a7d5.npy +02958343-88aae5646dcad7062a9eb0f146e94477.npy +04256520-480cd721e7bbf720b0eeccd21a9bc702.npy +02958343-f3205edd456cf36feabc798aaf5f039f.npy +03001627-23babf1dd4209349def08b067722d9e5.npy +04090263-e49e18cbd48a2479cdbadd1af48b5cd6.npy +04401088-54b4288766d87dcf332f5e5df5b42874.npy +04379243-6e77d23b324ddbd65661fcc99c72bf48.npy +02828884-31f34cbd9385944181faebbdea6bd9be.npy +03046257-e5d21511678e9075b8b431083b6191e2.npy +03467517-c553d5d6a458401c8792f38f9bbb6676.npy +03467517-a4fc4b7d8d40790e4bfcfdb26b8cb2c3.npy +03948459-a3679104af613021912d826efe946a9f.npy +03046257-9f56b67ee6ba16fca05d3424fd8d541a.npy +03636649-85f8a8c585742c9b96a3517f50eeb9f4.npy +04099429-4bebae2aeb3e9c0d2ec5ae9242443840.npy +02808440-2231d841b91eb6d53321831d2245cf06.npy +03001627-28d3e0a4e4201ddb19ed4d1541e44f14.npy +03001627-9a3d7e6194b7a5bd3825a5bc524f67c9.npy +03467517-9ce5c54dfe145950156788cef4ad8bc6.npy +02808440-14b01ccd00ceb5e4a701ffa903c732b8.npy +04379243-79e3d485572b54bd9f2349486c570dd4.npy +02691156-5abba5b86814b98a9f4ab5ced9b9495.npy +03513137-3aad2f60419948f891003fe635f8d594.npy +02828884-2d80f237dfa7e73e5b7bc62e486d578c.npy +03928116-6f09b0176486be2a9c75eb4326997fae.npy +02828884-754250f866079c2083f64069b9b28eab.npy +04090263-f2e64c42370475cd52533bf53842cf9c.npy +03624134-a2288d5f3a44233bc40c6b891c4913bd.npy +03046257-8d9e42ef36ba9e5f7dd46011c41be2ef.npy +04530566-6a5f7a634b13ea7a94daa4565dd30535.npy +04379243-97e2ca564decce0b575f9747ff6fb5e8.npy +04401088-e5b629f4a5e7467066ccbd11a6ef0f68.npy +02871439-433136c9fa211d5867f7514c37b83a.npy +02691156-f36ac9cdcf15ac8497492c4542407e32.npy +03467517-740972191167ba363fc4ae76a96ac53.npy +02924116-c7881385a4077694f5057f866a21c1b7.npy +04401088-bbbca195cd6b85f1562c8e1ac545ef78.npy +02691156-30b514b24624da4fc1ccec171a275967.npy +03636649-92c2c146432ff304153c1c3f0c464db2.npy +03636649-84e870f2255d6b6efcd4910413c446d9.npy +02933112-5bcb725e26e521364c7384dbb75cab0d.npy +03001627-d417795442cb0f75593ebeeedbff73b.npy +03991062-3df897f668d419b978caa162a41a851e.npy +04090263-75ca1520edb6825d12b38b1d99376c0b.npy +02992529-ccf2058300cac188639e45fae4b57d2f.npy +02924116-1708ed19e3bfd07b2504ddb627974db0.npy +04256520-2860b2b5e16f4ae8c29432ec481a60b1.npy +04530566-96b27c98daf461269ff59e10e6ad1a4c.npy +02958343-83e537cd6bb435e91d1a964dea8a7aab.npy +03001627-6a73ce89c4a941ac0f947750540fb22.npy +04379243-5c2ec61293c30ee7bdba4e1fee183355.npy +04379243-1164897f678f3bd627e98d0f3d735480.npy +03001627-ebf1982ccb77cf7d4c37b9ce3a3de242.npy +04379243-16b72d74bcac545fe3eedd8db265e106.npy +03636649-fd26f566fe08c3dac64d4b10f9dc65a.npy +04256520-47c45ac7187a9674421b433358248213.npy +03593526-ae77abbf5ab4893da75d03186a0409e2.npy +03001627-4b904e1d68d09dd3e15e36ac023c5182.npy +03211117-36ea450f5d479481c795085b4d203932.npy +04530566-24000ec6bcb6ab9182b5804533e545b1.npy +02958343-7c85e6cf9c4f46e91cc13e432d5756b8.npy +02691156-9e617d72fabc718b90b1d6deb98feec6.npy +04256520-7d2032e1af7fb191cabc196a7f35f1aa.npy +04530566-df0f90c6abbfeaa0255deca950ace5f9.npy +03636649-1165e8de3cee9f706314698551cd43b.npy +03790512-6ea0a49bd27fa58b2279b76b11a9a16c.npy +03948459-49483669657caad2f6a222569e8730d4.npy +03593526-fbaee96700018ab3835b141fda2da5ed.npy +03001627-8dccb87a61e565cfd4713685ae50fa13.npy +04379243-4f38d59a7fc3010fd7483d79670cc91e.npy +04530566-31230e9a2e4d7cf7cf291a4a9f36cece.npy +02933112-56676ff1d9f8a1e94c61a7cce317bfb7.npy +04530566-e0190bd315d8109f542c6282a2a9329c.npy +02691156-fb06b00775efdc8e21b85e5214b0d6a7.npy +02958343-15fcfe91d44c0e15e5c9256f048d92d2.npy +02808440-71753adcff89e231b362845c6edb57fc.npy +02691156-8da50272a54dee98d972c9dd75ed77d4.npy +02880940-c399bfee7f25f0ff95aab58c1db71c10.npy +04379243-7f23cb04feb40ced8161eca940958ba.npy +02933112-273bd29d931bd255343edb005e0de5c.npy +02691156-b54d9c1ccb737eb6d972c9dd75ed77d4.npy +04256520-341ef2d97f0f9091183903d8843a24ef.npy +03211117-ccd03d11c95554bae4aef3a037da6f67.npy +03001627-6050ef2e6ac4ffae490ad276cd2af3a4.npy +04401088-2eae0713342e1103397d790c3d0a8fb5.npy +04401088-b4795b53530c26c58b13932a0c28e98b.npy +04401088-c7ec332bd52f939f04143dfe595ba79.npy +03325088-4be2cb4c94a4ae9f3321831d2245cf06.npy +04530566-92d7254e73fdab7289c6f1079da7a8d4.npy +04379243-1a417e4090ced738855931d119219022.npy +03642806-f496fa98fb41f6b1ea5768960d4a805c.npy +04090263-5d40add22ff7d14c77b7d0d4764c121d.npy +04401088-2682cb34e7db8735bdc7fd7cf135ade2.npy +04401088-98f0a229291ea982d670fbfea4c122db.npy +04379243-8f1934c5ca7772837d44dc16af152638.npy +03001627-4913388a4c94547a81806e3880250dff.npy +04379243-6a754d9c379ff246fbb20af1c3b4b0e9.npy +04379243-81c8ec54ab47bb86b04cb542e2c50eb4.npy +03691459-26363bb293e6c9e499db62650613bd48.npy +02691156-647a8f5c79b54910f6c0d5cf01fdaf45.npy +02828884-5c76331c2d99f3e2fc9d3ea96a9a9d1.npy +03636649-94f4c42b6db62c9688e7662971dc736f.npy +03001627-ebaf425ea2c92f73a3bafec3b56382db.npy +04379243-d1b34fc25b5ed4e42fa77440dcb93214.npy +03938244-f83e0334efbe5ac33c702793a783cff1.npy +02958343-b55112c3c09949846a0cf750aa55c4f3.npy +03636649-e4201614cb3590e41735ea0e092a805a.npy +03001627-12d7ca3c06faaadf17b431cae0dd70ed.npy +03001627-6b9c3d42724275cf7a5c8cd74a7bc29a.npy +03636649-aecfc0a531b67a478b424343280aeccb.npy +04530566-f193688fa17197f7798832e32e32aae6.npy +03001627-dd27edca07570d277ad11050da24bb12.npy +02876657-bcbc2c637bed89e4d1b69ad96276e132.npy +03636649-8566e44b5f1a818ff44a1c032c5fcdb7.npy +04401088-6475d2eb77c7ed5a59812638b595a4ce.npy +04530566-92e3343250e181e1428cf87eb5ebe5e6.npy +02876657-56c23ba1699f6294435b5a0263ddd2e2.npy +03948459-2091ab9f69c77273de2426af5ed9b6a.npy +04256520-679010d35da8193219fb4103277a6b93.npy +03991062-8d87b950d8e192f5f51f77a6d7299806.npy +03001627-fd2c754ca43457107d910d51d878f708.npy +02924116-50fd00d8c6c216ab52470de2774d6099.npy +03691459-27046cee7ae745e6d207241113bee327.npy +04379243-58b499ba308f9e82b4c161851ed2b4e4.npy +03325088-6b23fe58eecdc1946048f75ed36a5ac0.npy +03642806-3088048452f40a8965932bedd33dbd98.npy +04379243-8d44182e9916d617938da3ea2c9e0e4f.npy +02691156-5558a2511bd43caf2fc668af6d3ad0ad.npy +03207941-8bc3e5012c3cb5837f7408e5e4714afa.npy +02933112-1ee58b9b772b8807f51f77a6d7299806.npy +03691459-2c8cb15e2d973bc847cf5450436b1047.npy +04379243-7bbb0921945cb5fb45e2a4e5729b970d.npy +02958343-e866dd4d4bf1f1f5bbadf8db57668863.npy +04379243-8d05d40b15f933edc22013ebab50762.npy +04379243-7dea0c96340d5b9455f46d55537192b6.npy +03261776-98eb96633935d994c38ed9bce4ed5d0f.npy +04530566-1d5ff455b6ebd04e413559acd5524c40.npy +02924116-46858dcb18c2630478c6ad1c898f52db.npy +03325088-d7cf55161ac23e2b76c18e71fd49c4dc.npy +04379243-3929a118c5252a768cbb8bac2032149c.npy +02992529-ae0b011684a6c46c10bc2436075f6a52.npy +04090263-e9fdc6039ab91746580389adc8c1bb70.npy +03001627-63f6ff0ad9cf9d17adb532bf77da46c2.npy +02992529-caf0f73f4a609b7a2c4e8a2f66e4b8a3.npy +03001627-cc2639f8c584001a922dfe32810651d0.npy +04379243-c2369a8875367b56fab6e40cce6926d7.npy +03636649-ab53b6e7b2f87cb5c1935c9110af1bff.npy +04256520-8f971956f31d9faecb3a30f2c37c38a6.npy +04401088-693fba444859fb7d54c65e829609f393.npy +03211117-30b5026e1c3f8c8a93e4d36e0c61da87.npy +03001627-79030f846b4dee0f9d709998b2d6e774.npy +03001627-ea04a5915e3982aad7f7a4c4609b0913.npy +04379243-1a6d43aa7b5c4e1d1c6a34a68ab9e1d4.npy +02876657-72a9f3c57e40416f8884a069d9619eaf.npy +03636649-6770adca6c298f68fc3f90c1b551a0f7.npy +02958343-5ff285283e8ec610434fdb742d7e0cea.npy +04379243-1834fac2f46a26f91933ffef19678834.npy +03991062-facae3f0d92553bfbc5c4c571faa8806.npy +03001627-3cff2db42b3ba901e83221ad0d21775.npy +03325088-bdbe36608edfcb23b362845c6edb57fc.npy +03636649-857122dd5f5cb1b0a34f84d89d87830.npy +04379243-1d4e22bc8ed400fc368162d385acdaa9.npy +04379243-105f53a6471f3ceb4a420e3c1b966720.npy +02992529-4116965029bd24393423610e52061098.npy +02691156-e3d197bfb47ec943c9d7d324d11034c9.npy +02933112-a247a4978888e6403fe047712e43e185.npy +03593526-d1f9e06eeb9e5fe237af722b64576c2.npy +03046257-626c1a3c6fac65a924a6b810f75dc774.npy +03046257-35e5685d7c25ed8564c33a5741e8e076.npy +04379243-db302d0ac596b4e059db00799f9936b2.npy +02691156-b273c9007d1e364fca8607f540cc62ba.npy +04379243-fdd8dae63e8781414a803c33df86f3bd.npy +02933112-cdc2c14b62e110fbf8bf793ac0a3a901.npy +03001627-6d199c744b17d85953735b417976bbf5.npy +03001627-bf179410ad7f9f37af6595f7d3f20cf6.npy +03636649-d0650b751034f567457ba044c28858b1.npy +02828884-91a39f76430e6cca19420b7669e7265.npy +03001627-1e678fabd0622a1119fb4103277a6b93.npy +04256520-41c9fcaf5c6b83a61660e46cb2e4cc15.npy +02958343-5bb83a60fb8d5f45a1089359fc10d7fb.npy +04090263-9ce27cd793dd3da29ac0a7e766b7c815.npy +04460130-ce4acc0cd5f5a33cc4406905076c720.npy +02958343-3af1559045965b6f1f1bf16cb0b58c6d.npy +02871439-2f703181d8069cd0d42b9650f19dd425.npy +04379243-4e48be33083b8c70d810b14a81e12eca.npy +02801938-61ce681b67ceb94f4c2db8f2b94d9c39.npy +02747177-ffe5f0ef45769204cb2a965e75be701c.npy +04379243-3b0e4c443ff69840c3bd24f986301745.npy +02992529-a8bab81f66ac5d26acdce172dc618222.npy +04530566-11d9bfb57990eed6d674557449cdc5a4.npy +04090263-16308b7668753c078080f52bfb02d6bf.npy +03691459-76566bf65b49e49c864d68471e7fba29.npy +02958343-d1f100f660eae4548acb0ff76f4aec7d.npy +02958343-1e2f9cb6b33c92ea82381b04bbe0ce6d.npy +04379243-e41e3b1d11fdf7cef9c9f9697d1ec60.npy +04379243-46e1e82d296cceb389a52d0b0203298.npy +03691459-afe96f3cf256cbac81a6b6721af23c58.npy +03001627-e936176764be83d029426a0f57e4d15e.npy +02924116-7d0d3c8f823b3debf03a6fe18d6a133c.npy +04401088-9dc0c2ca8de18e28b4c18e3209e12990.npy +02992529-a19763322fe669cc7e51366b0cf7747.npy +04379243-8f05326e122a6b973eea2c65c18f73c.npy +02828884-41fe326e3decebd1b40f0ac0fb9a650d.npy +04379243-282d36d7ca9705f6ca421e9e01647b4a.npy +03636649-99ec967442fe35e46aea2f18ee404fd5.npy +02691156-cc68ac5b18674485475045ea78b20eb7.npy +03636649-872407329ce09557bced73c51e99f8b2.npy +03642806-e0cc767bf10134509fd6a63b3b6f6cd4.npy +02958343-9dd02330c7c4ec88ec455839e63f83dc.npy +03636649-3d26aa294ad1cabcfcb8d8c6d4df8143.npy +02876657-b00152d19e8f2b87b2d2b5b947dc0b8d.npy +02933112-906d1dc1a8e519868cb5d9909aeb1309.npy +02828884-444e7c5709eca2496f61afd58e50ae2.npy +03001627-662ecf4b0cd1f3d61f30b807ae39b61d.npy +03593526-3d7710926dc165d29d70a5dfc06759d.npy +02992529-bbd5005058f01a54909425bd531e6033.npy +02828884-826a100b907c3fc4edf84ea98391428.npy +02691156-a2de53a5de7ea01dd01b5600c06c528d.npy +03211117-a6985e8e32df69a7fe50497d5e2cdada.npy +03046257-6245999a79c5d853c31c0b92a775f88b.npy +03991062-88515725e87499c1e9dc847f63d339d5.npy +04379243-47e7fbbce59804cd30bbd4cddd04c77b.npy +03001627-56e51afd9d5c5fa38b7a92edf72424a7.npy +04090263-723162e8e15f4ac55d0dded52efeb4fd.npy +04256520-e80ade8966a54fe419fb4103277a6b93.npy +02818832-e1f93c13decef335e3c3d58aba901b14.npy +02828884-d34b04cb67bf2115c308e7dd57b5111a.npy +04530566-31ddf87b5ef64c9080c9c53be28cd7ba.npy +02958343-e92786612a9d60455dca6305fb9f97ca.npy +04379243-b12b2f12db92ed70c48d90eef8384210.npy +02992529-1847d3782970e60679510444cc61f839.npy +04379243-5d7f7ef4f2f2e99f1e923e5a90fc6bf2.npy +04379243-a7d1fb495c33316cfdbe2bf897d8a820.npy +03642806-8235de380bb100cadf5a805be6fefb86.npy +02691156-28402efe2e3435d124fbfb66ea1f14f7.npy +02691156-211cac5d62271583b85f0298cf43349d.npy +03624134-adf0a46e8a00693e131d8fbf069d5d12.npy +03211117-1412e61a9bc08ac4e6d9f3854f1baef8.npy +02958343-8237df29002d6cda20fc61a2a01df353.npy +03211117-a9432163d01a99f1d38b9064784c4b38.npy +04256520-12cae0fa5180fce64b7366b9d17acf07.npy +02992529-ecab7b7bfef8d7f423575ca8cfe7da9.npy +02691156-14d6bbabad3ad00dbbf3143b1cb6076a.npy +03046257-ce222cc498d073ec59fadefffed47ac7.npy +04401088-be7a560b2a6996558c646f076042ffd9.npy +02958343-296c92e4e7233de47d1dd50d46b1e3d1.npy +03001627-eba001ddae2ce5eed5d673747c0e3adb.npy +03211117-fc314f1e3325a47af287ec53a469521.npy +04379243-ea89750a67ae2335b9315f9098d51eae.npy +03636649-c60a072ba63c12cd8ae0d28389a2d006.npy +02828884-36583be1062e0f48c24b862f5ee36086.npy +02958343-746765dbc0106bfabda733a39f84326d.npy +02808440-fb39c85a8e31535b4c62bee40dcdc539.npy +04256520-d5424df6acaee9762d19175e7d19b7cb.npy +03211117-6bf634a79cadc9851b02cde7e81f0fc3.npy +04379243-f82e5554f1c877a1e074517a246f1e65.npy +04090263-9e3d8792aba09939855b2b6b2e96290b.npy +02691156-32d9fe9366da899b90b73cf2bf8fe3d1.npy +02691156-218caa58819e10d1fe40308d822f996c.npy +02958343-5f148a8b824ed7e72a9eb0f146e94477.npy +04256520-fe45a0e02430b195b6f5fb02f36f9480.npy +02958343-e7e94f8dbbe8c1e9784da3853aae78cd.npy +04090263-d8c06e41fedbf387e5a528a89590d5ea.npy +03001627-383ab6330284af461fc4ae93e00c18e5.npy +03001627-4e3047842ba1a384d2b12aa6a0f050b3.npy +02808440-cd55a6a2d57067df3e49f3a2a35ec8b6.npy +04379243-ae4367ce28f1e5d96917161dc6c05572.npy +04256520-d7af346415eebe008f36404f302c9440.npy +02933112-b31c1b94a2badecf43d2fa0a85ff9354.npy +03001627-533e0a52acd257bef27383fc5a5a711c.npy +02933112-b92e2c18c0eeb8cba80ff03f6dc10926.npy +02958343-eaf664eaf6b27cd1905f30c879d154be.npy +04379243-e7373d97df1216af869f35aa46529daf.npy +04379243-6d311facc6387a7fcd1233d74066ed8.npy +03691459-ca9ca5c5dbc82019e6bc953d57dcc636.npy +04090263-afc13a1565e027c5d735fa1ab17311ec.npy +03636649-3259e491870a8c49eef5d83b671bb264.npy +04379243-1686831b1e585dd9729c5ef452d153c3.npy +03691459-19ec27b0dc5e478e2a9eb0f146e94477.npy +04379243-2bb1bb0516d7cee747839bae1bc65257.npy +03001627-d2b9e98373e96afec8d65ca96e6b18ef.npy +04379243-54108a40e3e2f09b940268b86285118f.npy +04256520-3c61862eca2f0979febad4f49b26ec52.npy +03325088-426ae1a946daed5f76c18e71fd49c4dc.npy +02828884-8ad57afa55cebfe0dad433a29cb627ea.npy +03642806-9fa387d7f442b96e75e60c00fabe2744.npy +02958343-650238554cb16926bda733a39f84326d.npy +03001627-88ba4696c25632507b6a13c9370327f2.npy +03636649-9f0e6bc1fb0a97a6db493a050f0c45fc.npy +02691156-46d2373fa05a4876bc913a3935f0ae10.npy +04530566-1abf3b20f05ed8ea902d6f4ac8edb5f4.npy +03636649-a72410196463086561fc247a18f47792.npy +02691156-eee96e21bf51ee6ce719b5362fe06bbb.npy +02691156-db02eb57817e4b4d22362be7f5226e91.npy +03325088-653ac1e615b18b19b362845c6edb57fc.npy +04379243-64a7fae36a56705e3ae0df12be078c7c.npy +03691459-2cf41211ffafa4ea1f9f3ce366e030fb.npy +04379243-6373c7a17a41666219fb4103277a6b93.npy +02992529-da1fcb7a374f9c43397c13131c65cbca.npy +04090263-f82762004d55da3d265b6d46c677f2ac.npy +02691156-895e49f92ff5003032611f2edb791b8c.npy +04379243-14b250fe1e9d53beb97452240e92ab9f.npy +04379243-ebd353db403531b4257d13bddbc14c41.npy +02933112-da5d7b5dfa92abdace5d6e9371bb5c33.npy +02871439-7087c34ea40273ea734a703453e2dabe.npy +03691459-ecfb9655edf2b5297160646d65ba4383.npy +02747177-49bff2b8bcdc50dfba6cf6cbb9f4c2bb.npy +04554684-5947c6f05f5f74437b3ec0bc4f26f615.npy +02808440-9a2356d30def73186b448b8aaebb705c.npy +02924116-5ec24e802eb61e624d429997b4e3b64d.npy +02933112-595a8444c362be66b8803f6649e6cb9b.npy +03001627-6d54d175396e3a99b1aef914f6383f94.npy +02691156-8b0d9118e9e7dc3f95c9af648ce95367.npy +04090263-aa03af3233ff0be207c113ba65e29ca.npy +04379243-f9597fd50738ba45ba5342d638d0c267.npy +04256520-7606f7f0a8d6434f4b3c42e318f3affc.npy +03691459-4bf9f2ae5f3b32e5d74f2f4a7f5598c2.npy +04256520-f2458aaf4ab3e0585d7543afa4b9b4e8.npy +02958343-543a6562ae746ed45daf03c341f7f599.npy +02880940-68582543c4c6d0bccfdfe3f21f42a111.npy +04401088-e9ef88d72ead910b8b431083b6191e2.npy +03046257-a8cc05a9ec2e678d5eb2784f19b3d21.npy +04379243-899f815eaad62b56d8cad143689f8b51.npy +04379243-a41b3ec61751fdce6c28547eeaf2a8c9.npy +03593526-365d864e8c58391e62a510b8f97c658e.npy +04379243-581d698b6364116e83e95e8523a2fbf3.npy +04256520-ba6c0baa0a122f8ce2aa36c9e5ae7ae.npy +04004475-23fcaafbeabc092f921e793cb951210d.npy +03691459-19a8736130ef822b93dcf5e22ecc3f5e.npy +03938244-20655268b1709c8cc75ea4b124a227b.npy +04379243-59ee80e3af7a4e3df4b6538438a0b930.npy +02691156-46829981c5c25285bfc0a2c490b4c222.npy +04530566-194ea4b2297cc2ce90c91984b829ab51.npy +02691156-3b31e28ac1eb36fe1eb4be4ad34a6dbd.npy +03642806-bd879abd9b5c15d75d66db82418edc83.npy +02933112-23e3c2a2f61ddb2986d53ab0fe94e911.npy +03691459-5501c4caf22a5c974533f2e74542acda.npy +02958343-c24892528799ccf486b4d991d5310067.npy +02691156-72e68e04a203c96d873ec74c119307b9.npy +04379243-abef0c609ad3e9c2edea4b985280bcc1.npy +02876657-688eacb56a16702f9a6e43b878d5b335.npy +04379243-de2f120b21e228c2e6c5cd45aa112726.npy +03211117-1e9d554d26d4195f37ec10b15648a127.npy +02880940-188281000adddc9977981b941eb4f5d1.npy +03001627-3526528270d5f3f766268502c798b9af.npy +03636649-561853e6377361196afaa22adc38077c.npy +03001627-374e76e8b8357e5f796d422781cbc933.npy +04090263-6169b7bdb2a76d471ee416ae4351c7b.npy +02958343-d373922da2a6c73b616f13ee256019e3.npy +03593526-2886e2026ed9da084b3c42e318f3affc.npy +02691156-51f24c13e4af3e06b6e5b4d7b00c5b3.npy +03001627-3f7417590f1bcfded5c89ecb06d1099b.npy +04090263-12df496292b5c016f9489a342636086b.npy +03691459-4ba818da340a4e5d60647a90a03914e1.npy +03001627-13bc03eca6aad4b2d7bf6fb68df7f786.npy +03928116-887687ab426ffdedf7406d785bf36110.npy +02958343-ea37a9b97e092552b927782fc69a1fbb.npy +04256520-a6e9d5735c36b80ef4a06efdbafdd7ea.npy +04401088-e97033321b1930ed4391592096b033ae.npy +02691156-cf17d0ce34f09f572722fc1bdd7e0e51.npy +02933112-2b80c8d68550986bc59350d819542ec7.npy +02954340-8b2951e32e0906bb5f6cb4951755315c.npy +03001627-8ac2d831ebeab4896b7c7aa09852a4e0.npy +03948459-68cf8f5e1bfb9ff8e71e857afa9df271.npy +02933112-23b8cec330bc7699c59350d819542ec7.npy +04379243-c2b9613e2898f3381c7afcd6c011dc9e.npy +04379243-943d786e2df9251ec76aead7da70af41.npy +03759954-514024b4a66a57d592ecd319dfd8c5d.npy +04379243-dd35a3f0ba7c5f2e73ea70c16ec9e2b7.npy +03001627-6730f663d0e012506f525e79a05bbcb3.npy +03691459-b24c25a01d69adbcfb14bc0c4e180ab9.npy +03001627-1c45b266d3c879dab36dcc661f3905d.npy +03325088-1f00e3c311882a8866279f6cdc4d0486.npy +02801938-2d8bb293b226dcb678c34bb504731cb9.npy +04379243-82271bc614a76c28890992ddacc04113.npy +03691459-85eb14c504232ad1bb36a678453013a7.npy +02933112-39b51f3a6e8447c3c8a1a154de62786.npy +02933112-7e2e24fed142bb20310af74324aae27f.npy +02691156-94b0675bb9f2a7fdf8a8bda5d07839b5.npy +03001627-8577be35989634fb925bf1713cfe05c.npy +04379243-8cd6a33e6ba794419cd431573238602d.npy +04379243-53f6531e2fc2d31ab2c2cd006d206129.npy +04090263-249e0936ae06383ab056c98b2e5e5e4e.npy +03001627-4dbddd8f3f658821ad484915511ccff6.npy +04530566-df8fdfbda6e15f38fc740ecd0dc695a2.npy +03001627-c7bbb1dfcac15f43e33c1bced7bc2a7.npy +03046257-aac0d032dce735c7ded4c23d05709216.npy +04379243-ddc404bc12e45dbfb4e3935c6cee4b35.npy +04530566-dc0d90ae6a41e0acf68668364a569266.npy +02691156-e387c8d826cbbdd68a8dc9dc46f918a8.npy +02933112-8e42a0d11784c74fc6a5c971c030877d.npy +03001627-58f44c0057ae64b525633180ba767a60.npy +04379243-2ad85522947a9cf5f4ab13f4b49ac318.npy +02691156-a4462b31326da9493ea703383c665f30.npy +02992529-692e46bc27bcdcebbdc2330c91f5a859.npy +04379243-22c4449df36e20a025ca952293bf3fda.npy +04379243-cdbe8e456a3e3202c55161a63fbd109a.npy +02871439-e88b3fd502ab3316d42b9650f19dd425.npy +02958343-2f503625718536ad5d9d397842621b7.npy +03001627-c24ac9257d6392bcf284804023c6c8a.npy +04256520-41b02faaceadb39560fcec8f64d76ffb.npy +03513137-dc10f3b2b8cf3c8f3a0407ebaf7dd3a5.npy +03636649-46b8bc4b5b2a6094d46763ec4d902968.npy +04379243-c277ca4a9195df2ffebad4f49b26ec52.npy +02818832-e68e91ef2652cd1c36e3b2fa8d1eb4eb.npy +04530566-6dd448ee6a2288ff5a680bf43a0499b7.npy +02691156-7f4a0b23f1256c879a6e43b878d5b335.npy +02691156-28da27a6bebc81df62b600da24e0965.npy +02691156-1d269dbde96f067966cf1b4a8fc3914e.npy +04379243-4d45859eaf2627f5ba350d190cd1c00.npy +03691459-44ec5df88564c859e180a1a604561d3b.npy +02933112-878383dee814d727fd2b139960f72a73.npy +03636649-bb3c2fba4e1b712357ddce8e42aa6e90.npy +04379243-8c4d7014c59f619c2b1c5715bfc0f094.npy +03593526-c5351c4aa1011866cef8c6985387af2a.npy +04530566-ad251b2cd68290a41c9545c3c7193d55.npy +04530566-5d301491ba435b71257fc1c453f165b6.npy +04379243-ee00ed62953f4bd280afdc8bd41edec3.npy +03001627-d708c7ed9201ec45d29e20ec5f479208.npy +02958343-1151e7cd24f5bd21ccbd9e5bb82dd04.npy +04379243-c733e81695923586754784b56fb4c23b.npy +02691156-5c8b6d47313dae4fca1f1143bb6bc17.npy +03001627-8efb37e93b208234671d97b0fd17f51.npy +02924116-290387f7da9b702941567ce9c420c236.npy +04468005-35abd22f4961926f196c433756c6bebf.npy +02828884-e4f68fb5bdfb68e936a9515582552983.npy +02876657-ca2341f33cd4995dae7fdc0845a47bf5.npy +04530566-d19c003cf7dbf111543941eaaf04581f.npy +03761084-146d5859bbd8d629bbf88898fc491e0c.npy +02958343-61f70557b8bda7422ee0f9a97b71d505.npy +03691459-b0feef9f599d41cbb3d8c1107f6ae528.npy +02691156-bb244dba6323f80a126bd036879e7101.npy +04256520-aeb5447d59fbe49add7f28fcffe810f9.npy +04379243-1fd1d459e79ad6c1c3bd24f986301745.npy +02958343-97b9c8ae37e6480e1912cbd26ffcad1c.npy +02808440-eb7eae7aebd087323321831d2245cf06.npy +04379243-a48942e0190d14a5a8930422448288ea.npy +02958343-ff3c8e21a48ed17cc1bcae9def1986da.npy +04468005-3bc4944779090cd3ff790997f2048517.npy +04379243-6e96a8c237b549b6e3f7a74e12a274ef.npy +04256520-45aaa81cb6b7f1585e7dcc6fa9b3c324.npy +04379243-4d54165ac08d47dc30bbd4cddd04c77b.npy +04090263-177d48f6f156193bdcdf952acdf10f.npy +02808440-2b655690268f451a11fa1d2a0b030f17.npy +04256520-8169b36ef1ae45ec19fb4103277a6b93.npy +04090263-8128e1bfcc18d4769a3e2fa8a8e389f2.npy +02871439-dd1d4a486f7cdd8a2381fb852817e4e7.npy +04379243-9004a7d87a62e40111310cfb881ab9a6.npy +03001627-a06c4c2f4634ccb1ee928ba0d9f88258.npy +02958343-9c4a3879c71df693af0f25977186b501.npy +02871439-959b3402f426223bcc88311b3d194337.npy +04530566-b3aa94c4aac0534ec34b1b7198ff8321.npy +04090263-b84fadbc6f41cd0375e4eff9f26b7ac8.npy +03046257-4833383d30f7526fe30738a8d635be29.npy +04554684-52c23e4a42c5f058ffc6e457221b9271.npy +02691156-821309c2037b49135fab3f99161dc2c2.npy +02691156-c1aa42594ad2d80e4c3a35cee92bb95b.npy +03636649-b479c49366c4d5def2cdf09737c19aad.npy +04256520-b79a15077c4a662719fb4103277a6b93.npy +03928116-512b54ef050a7b4a11cc56dc4129a22d.npy +04379243-1b2dc847e12c32d4a430f20b4b0a337c.npy +03991062-ee0e42b157a8d8554d226702c1bfe9e2.npy +04530566-212a323fdfc0d8e59399f7cdb64577ad.npy +02958343-fbe6ff98196a8ddf1992fbc3c9e8b937.npy +04379243-795baddfac35711a30e44a4c4faa2773.npy +03001627-ed53217c9a4443b8a4ad5308cbfec5eb.npy +03001627-54237961055ef73782db9fca4b68095.npy +04256520-64702fcd98b04ad21206ff076758ec85.npy +03001627-1190af00b6c86c99c3bd24f986301745.npy +04379243-1b7cabb894adef68939793f922933b6b.npy +03636649-e0a99ab7c7a0d2d4e59f529cd1b6faa8.npy +04379243-4bbf789edb243cafc955e5ed03ef3a2f.npy +04256520-d31fb17a6a6515d5febad4f49b26ec52.npy +03001627-4e15234057b863dc659dda512294c744.npy +03001627-9897713e0efb2942f51f77a6d7299806.npy +03001627-b16dceadabff3976dec8d69f9356ec51.npy +04530566-e93d2ab44861bbd32a4947824596dce3.npy +02808440-8a7a7e70aa8961f4edd7686549ee4484.npy +03467517-57286d92604c9ebea3d3eb77b119df6d.npy +02954340-ed352b53b17b6119e762cf5917cef4ef.npy +03001627-7b01e2a03e614eba4710269d4bc18736.npy +03467517-1157ee852f69a82376d05024fabfa1e5.npy +03001627-bf8e44b58d2d95f45c6cb69e0968783.npy +03928116-ef752c493b9a41b21fd394f1bc0bd850.npy +04530566-85dbbed13875a3a2b90142192ec795d.npy +04379243-9b923ffa07f51fab2032a1fc189d2617.npy +03001627-2d1ebd7356968c0919fb4103277a6b93.npy +03325088-4c3fe77fab3730caec944ac16e6ab528.npy +02808440-c11ac2c84d7e8566b04f97563601480e.npy +02933112-7d9b7a4412d9f373c59350d819542ec7.npy +03046257-38c78a9f3f676878dda58cf2744aced9.npy +04530566-6067d0e8dda0b78c4628573ed5739806.npy +04379243-853c3913ba95570ba2651abaf391628e.npy +03001627-6b719f78721d1eb742559566b871c978.npy +02924116-992e27c87064000a163e670ececef2b5.npy +03001627-7885f87669b8fbc73f7e27638e63d848.npy +03001627-bd504539074e453721a08935eb37d792.npy +02691156-c69c73793f459a2c3d4b1f38e3dfce4b.npy +02958343-b812523dddd4a34a473f10e6caaeca56.npy +03325088-334025201d6536fcb362845c6edb57fc.npy +04530566-a5fa8ae8f743d5498052128bafa4f7d8.npy +04379243-785a68eefd1035f468661782af60b711.npy +04530566-887be2603a56d8acc13b4b8de5611825.npy +02691156-bbb8ec10b86465356630654359fc97d0.npy +03593526-d2f113f579d2c4c9b7e6746928016c6b.npy +03691459-82f1e500df50302e26870852082c4c6d.npy +04379243-63d1427d86f62c45ecc46197d5349c6e.npy +04379243-93bb999fd7e586199fd83fd2ba5fe30c.npy +02691156-c14cb2e75415dba59a6e43b878d5b335.npy +02924116-dc0601024a535f5c51894d116f1c652.npy +03001627-308b76aac4b518a43eb67d9fb75cc878.npy +02828884-89cb6473e1b3882af7436fe692c24f3e.npy +03624134-35233c0d786b5956d25d105fdf500c48.npy +02992529-f75e6866c8965374f1c81a6df84170c9.npy +02818832-50b21efadb3692347b0284d1ea60f713.npy +02958343-25d92177ec6bd745deadc9ca0263db5a.npy +03928116-c625f1771e40e374e1c27dfba919adc5.npy +02933112-a477a301e1e1a67fc2185cc0ca1b306b.npy +03001627-3eb9c5fb2a7ab54d490ad276cd2af3a4.npy +04090263-170574550b1b5c12fd0c2683cfdf8b6b.npy +04090263-4b5668e651a6a9664a4f87aa9a31cd70.npy +04256520-683fbc39025b9b75e71d6290824c2748.npy +04379243-7356817f2b175b80f7088fd42bf47c7a.npy +02828884-50db85e4889831dff155d75bbf62b80.npy +02747177-bf4e08fe5e07373ade5ce145a809def2.npy +04379243-80d80b73981eb265b30ae4347e74f709.npy +03001627-95d6aae8728a0aed70e95b2fd46626d.npy +03636649-6e3da73f16586dc56bd3645c59279a16.npy +02958343-d47353fc60390df85d918097f81825e3.npy +04379243-2eecafccfce0a14546407779dbd69b2d.npy +03593526-64a0985a86bbead9fe9d8ee1a924ac2e.npy +03642806-92702a4de72aac3e20685b5a7e34b501.npy +04379243-35803ad1072c4221e8b2b8dc0c816caf.npy +04530566-810cdbec3687a16e122e1a230357df67.npy +02876657-9a777a5f3701fb6b940806ade53ef2f.npy +03325088-ee2f338a166b799ebca5df27f3ec6373.npy +04379243-5a2c14bbfcd9ca4d68f8796d69d0c486.npy +03001627-88376e3d3a23d263de29d28278a34a18.npy +02747177-9b5eeb473448827ff155d75bbf62b80.npy +03636649-caf410661e9311299dd0351f01396cda.npy +03001627-be373cf14b9f9b77bb01e8d0bddd5702.npy +03001627-384861155b7786fcb21bc3cf138f79e.npy +02773838-cbc2328cadf8dc573394926146371698.npy +04379243-dfa86ce9f892793cf51f77a6d7299806.npy +02958343-42d960259838027461c806d3425b088d.npy +04530566-501154d9504b62b9da27170f98feb295.npy +03991062-f8b3230c97fdaa97beedb4c8fd29e2d1.npy +03636649-d08164b754c2f139b93e96f21cf0da86.npy +02958343-4c2412cf0f720bb9618e9d35559b7aa.npy +03211117-fa7324388797a2b41143ab0877fec7c3.npy +04090263-85cd554c3681ba40a24fe41bd648bb1b.npy +03513137-1d1cc96025786db595f577622f465c85.npy +02924116-8b7d52fc3a771047d0ecfe587dafa03.npy +02808440-215352e586ec6aa0b362845c6edb57fc.npy +04379243-7eeceefed2b3aa2794f3bda96cf548cc.npy +02933112-b29f2d0d278e938914038d588fd1342f.npy +04379243-1bc212abfc3ba87ae5c3f1a4056686f7.npy +04379243-8eba29bc85c8c830b4c161851ed2b4e4.npy +02933112-4cee2825142a64acde650492e45fb14f.npy +04379243-a1419b0cf5fd0c2c47fe5b27e60471f.npy +03001627-ea389bc8d94f87ad95db811b45a94857.npy +03001627-2c795b27253f9ada336961c9971d866b.npy +04099429-93d96c35e4a343d1f7e86418b9396c76.npy +04401088-719a564d600f1ab38162d5a2262f4a8.npy +02747177-330cdd681a0890b190fdbeabcd02777c.npy +04379243-96dc43fe4cfe5668cdb6b5e54fc64b6a.npy +03001627-736ef1325209503533d93f57729688db.npy +04530566-d8a72e6a9f34ee36b571511eb0f92ed9.npy +04256520-34bbfab80042b25bc1bc03f4ef8a4411.npy +04379243-62f75f68a559cd9c5edbe4a62f5ee3a4.npy +02958343-bebfba98a5e97c6180360680c1602c7d.npy +04379243-684ccc0f629ee45cab610b0c94236463.npy +02691156-bd6966d7d0beae75f5c7319b71bdce6e.npy +03691459-4ef6b09f9a8e1fb233ed13d3bda59480.npy +02876657-1ffd7113492d375593202bf99dddc268.npy +04379243-3a1a6dcf1900fe42bdeec9c43546255e.npy +02828884-b6de66042941f5691301e24e9e27a9c3.npy +04256520-9a24fd0d36ff856662e682c9809bff14.npy +03991062-5b5fc2f78d935628479e6e44e41a0562.npy +03001627-c10b1973a0d692ef910979f825490a99.npy +03001627-3b25f03d2f7be870fff16555386d173d.npy +02818832-f2c35e05e0759d2d946f8fe474296fc.npy +04530566-8fdc3288bd73ef58a127697b1776e4b1.npy +04379243-c49e9c8c1306d3a4f09a2b323d5dc94c.npy +02876657-e5a5dac174982cea2dcdfc29ed7a2492.npy +02958343-c54586fc90acb4d0a46498323e7a9af5.npy +02691156-42d9f626ba4bc61516c4bdb2c8eca27b.npy +03948459-43b1fefe6b13b3e849b3383f0d8ed83a.npy +03691459-fa09acded526a0105b1433436fd82800.npy +04256520-8c9cb8a85aa36620a5f9d52c12457194.npy +04225987-1ad8d7573dc57ebc247a956ed3779e34.npy +03211117-1d628bde22788cb74161e123a102b12b.npy +04379243-a04a7efb21f799f4c8bec3671aea0fa5.npy +03636649-dbe83cbb4cd5113c14038d588fd1342f.npy +02933112-4d36c59bd32fd885aadbf8208284c675.npy +03691459-b3f76f7361b123f5b3878cedd8c8fe6c.npy +04379243-4d873bf1a658dcd523eb3ad3d378722a.npy +04256520-1d4d7533d453ace4dae12f3947d07dec.npy +02992529-a9d358ce2d54d95e54c7ab6aa5674ccc.npy +02992529-55698d990b8147e33c7b6ed91d531bc.npy +02933112-233612a657bbda534da5feafe6f1c8fc.npy +03593526-e390d119024d6de9aca4186c3b7dd23d.npy +03001627-317a2cc9f3b54a48283b00891f680579.npy +03337140-9404bf7671ce9cc52871cc0b3cc1a485.npy +02808440-d7bfb73072d8a3fb54d7082b34825ef0.npy +02691156-72e1cdcb882b6993c1006ed55bc1a3fc.npy +02933112-836fc8edc0414fdd9925b11f2b3f86ba.npy +03337140-4ecbfec208b1aac12f84cb7932f866fd.npy +02958343-6e1d942233917ae996c458818630d123.npy +03636649-fa9a37d95fa8c6542beec56b24479ed1.npy +04330267-3586a28ad9ad3aa8230584014222e685.npy +04256520-27f8e4a89307406614038d588fd1342f.npy +04379243-5eba36c416524db2f42a90fe4baf4591.npy +03691459-529f3a898bd030f558b060a361031075.npy +03636649-13a20b16bb59fdc712e1ea5343ce0273.npy +02958343-22654a0cc1ba382c4eace6243432632.npy +04379243-fb2191ec35ad66da30bbd4cddd04c77b.npy +04090263-c2acfd34d7c030f5dce23741b366d6b.npy +04379243-6feac0a35c8f8626e73947fdf756a329.npy +04379243-506a09d327936cf8e2e6aa5366c8ffc3.npy +02691156-6ba642ca477a73db4c3a35cee92bb95b.npy +02946921-5bd768cde93ec1acabe235874aea9b9b.npy +03261776-a9661a8bb610d902957b6a4f3924d982.npy +04530566-577acbe57ebdcbbdeeb8eb76c515e836.npy +02691156-a4ca564574e55f1a66cf1b4a8fc3914e.npy +03001627-57cc406d478167a6a6c03a53cf0a14c9.npy +04379243-f41e9600bd8bcb92716a0dc6cbf69f91.npy +03001627-uca24feec-f0c0-454c-baaf-561530686f40.npy +03790512-7d75e8200565ffa7b37378f3c85478b4.npy +04379243-5b54a7ca6d758fa1e12186cc8c5022c7.npy +04256520-def69858279a9b23f841858369432cc.npy +02958343-d28ad2ed7b1ba665b1bb46d2556ba67d.npy +03001627-58ad41e336942bf3c5243a0ab191990d.npy +04401088-a801c5a24131f1842ed91d160fd4ae97.npy +04090263-da7f89368a80ce9e1f2a1daf140ac9f.npy +02691156-ccd448614257253cbc0909d98a1ff2b4.npy +03790512-ccefa6fea8b7a57281eb6e0cf97c3b0b.npy +02958343-2cbcc226b4f952f29e1c4d21c8ecae7d.npy +02808440-99b04530c2640e38571be7eae57ba8b5.npy +03001627-f9d050a51da1f3ed30bbd4cddd04c77b.npy +04090263-f1f0a765def9499c6a2345809e2bb169.npy +04401088-bf11938460e160c78190e4bafebe046b.npy +02691156-ed1a5c9fac829d17a6766282ea8c438f.npy +04090263-b85aa72e2d253f34e38850a3ae501b7a.npy +04379243-eb379b2b95e76502e258d1c3e7302e7b.npy +03211117-b6bb7bb5927798724161e123a102b12b.npy +02958343-ef966d85be54c98ab002e5b0265e7e9d.npy +03636649-9d66a6faebd46b1d68661782af60b711.npy +03211117-815060a9c109ff4659de6f0155fa4014.npy +04379243-dc291fbd5838138a833924252d812d1e.npy +03046257-780ce22d20547cc0f028fb77e2bdb0c0.npy +02691156-4eced94670d10b35e856faf938562bd0.npy +02828884-a7366461245f831ea764a25163affad1.npy +03797390-b88bcf33f25c6cb15b4f129f868dedb.npy +04256520-6580148c3214df2395ca4adb70946a21.npy +04460130-75ffcdedd253c62aa86cbf46be15aeca.npy +03046257-612f3199c6212e55a5aad165050e534c.npy +03691459-8d437b97fc1cc7bae9bba7108b76f097.npy +04090263-9445546f0d348b2ddd0a2071dde26395.npy +04379243-1799a85dc6eaaf48d25222e04574632c.npy +02808440-d8d89fb14672b3893321831d2245cf06.npy +02992529-283e3f79ecc4b74d1e4e60ebd003a0c9.npy +03001627-b9e9eb2d09981218d3c5964623f1547a.npy +04379243-9d5ffd7cc6f9084abd790f9b668aa24f.npy +02958343-7bf6249a031b5095ddd41159baaa3ad5.npy +03001627-6584413da69096db65ba78ad9601cf1b.npy +03001627-4707a1494196ef829917ad57402f53f1.npy +02828884-170b01ba7fc575aaad5067eac75a07f7.npy +02691156-112ca5420188df4bd90bfc986bc4c94d.npy +03001627-5e6d8f9275fc311fb7c42e403b7689ad.npy +04379243-22e3a5a8d22b268593ac14f56e1bb33b.npy +04090263-67f67bc8e340fb23cdbadd1af48b5cd6.npy +03991062-c78c54d03c727cbfdb497067d6c15d08.npy +04530566-4f16bb70a2c3ca48104d2711f226a055.npy +03001627-d7f35cad0f4ab17788dcbe86402c7c15.npy +04004475-12f86fe69336131b71df0fdd633b5540.npy +03636649-e35c7cd183a6de4a8bd5065c89cb7063.npy +02924116-1ccd676efa14203e4b08e5e8ba35fb4.npy +02933112-d0aee9e36e73a88a11fc2b865c2a185b.npy +03790512-818a641ccb945f6ecd03ad51b6badc3d.npy +03636649-f77e6d8f251887e9fcb8d8c6d4df8143.npy +03636649-6e5a9f4f1f0ba4a7beb83c64f2162734.npy +03636649-230c9e3d0e423ade7b7adc4c6de912f0.npy +04379243-5e5f15626f1f230bff7e95552a1d6a0e.npy +04256520-6ebad671c5ccfee94c02d21d2fa4d397.npy +04379243-98f00281db9a43aa6430c2c15987e4cd.npy +02691156-da26509e7d1864a162b600da24e0965.npy +04530566-724b7c80ebd318cd5a7da3f7c33cd566.npy +02958343-bf52cda8de7e5eff36dfef0450f0ee37.npy +02992529-f63a0d0c33f7a0c69a83e6b4ae8b154f.npy +04256520-3af6ec685a6aa14e2f99eeb199d54554.npy +03001627-c48bc68a100e8c24696b74614952b2d0.npy +03001627-bb04dc0b336abf4b263915c09bc4854f.npy +02958343-892266d574578810afe717997470b28d.npy +04090263-94bc0758fb14e8de104a9760d2a92bd3.npy +03636649-c78f6882973e616d2102429c788ba90.npy +03948459-4acb6494e3aaeb39998978df244b5bd.npy +03001627-522960d8c4a7b7f2e8f8c11a24c52ebb.npy +03001627-75135e879341721c1cf9f632ab9ad62b.npy +04468005-578ba0e5871fd931b8e562d273208aea.npy +02924116-259d331ad47b2fa7e96a4e289c6e6e0d.npy +04530566-553a28a8cadedc9344046d4d2ed11860.npy +04379243-b1cad66b13e1a1e7714531f0291497fd.npy +04379243-b17bfa9db55c2d2e4702663c3b3faf8f.npy +03636649-76da74f3a8f15fe8bed8734977b26c06.npy +04379243-11b110b37b1cbfd6bdfce662c3df88af.npy +02747177-269b2573816e52dad2b12aa6a0f050b3.npy +04379243-a18aa2d20d516333daf1f22b6daf05ed.npy +02828884-d46ca28fe271ef7bc5a208307819a3a1.npy +02818832-4a63f649cfb18cae67d352f95551668e.npy +03636649-28186fa2690df5daefe905a3f9856df5.npy +03001627-a0654bdfc12e9e1ac64aef1ba2bec54e.npy +02933112-28195efc838cbb6a4da5feafe6f1c8fc.npy +03636649-4b031808cc2b126243dbb6421d614c0d.npy +04379243-676d05aaaeecb8a04b3c42e318f3affc.npy +02958343-ea0d722f312d1262e0095a904eb93647.npy +03691459-2eb05cd394f94bf7944366528422e02.npy +03001627-be0c5a0e91c99e804e1a714ee619465a.npy +03046257-663e8f056e9ea81772e0da953d900dd.npy +02880940-89bde5319b8a7de044841730d607e227.npy +04379243-4b8c1a30a11197a831777a3afe490d7.npy +02876657-b95559b4f2146b6a823177feb9bf5114.npy +04530566-67adcb4dd6d1b51f3a2bf22c38d431a9.npy +04379243-7a2a0c5175ea17d88101accd22c701b9.npy +02958343-e8eb095ef1b65f96e26cab0dd65d60c6.npy +02691156-9f40666fcc14828abc2db24227b9dabf.npy +02876657-2618100a5821a4d847df6165146d5bbd.npy +03207941-e726e6409dc3921ff622709cb80f8ca1.npy +02924116-2359865685fad6ab1bc59ed4ab44a78f.npy +04379243-f2ac49e7de8898d6782db34fbe677487.npy +04379243-93cdfd14889492dd91a4fd87fee47737.npy +03624134-c19c47736309bed2ede07437dedab44.npy +04379243-c29137d144c96b17febad4f49b26ec52.npy +02808440-b23e03b24683b504cfc7935acf134396.npy +03337140-5e00f3509af8382c50cd753c91f38465.npy +04256520-d5a7ef075ff5e17a29f849a67b494905.npy +04530566-6db27ae2c9cf722d1743d8ffcf66c439.npy +04379243-9e84d2ed1fc4a0efc772d43f7a27a1e.npy +02933112-97b415cd78587de5fa29682ba98e856d.npy +03001627-59126ed88bf7735b1817f13b030c6f32.npy +04530566-2c68972ae4868355a6a720afea6887c.npy +02933112-225e398e99d98995b0c71e21a9386658.npy +04379243-273b600198cba2f840363d9858e1b6c4.npy +02876657-cf7a79435eb5b1bdb0be98650cd7fb6f.npy +03928116-c9fc3fc5c6cd686a5a2f45519a421de9.npy +02933112-2cf613433894022dc59350d819542ec7.npy +03325088-f0c7d88a8ee66e2ec36fb70296e45483.npy +02958343-a59c142ed6850a26ad4bd5fc1269475a.npy +04256520-b19003d682594a71d37a26a6fbb1c7f.npy +04090263-e21bcbde60deaab7716183d105fb8ab1.npy +04379243-23b43da125fa4dbd755c957ccb0117e2.npy +02691156-9cbbede82cf4f7e463a33dad5001f8d7.npy +04379243-5dff67091a2f7ef1ab988fe471b1bd06.npy +04379243-13b744116e4f23c340914702d8ab1d37.npy +03636649-a2fb35f872225ab2f6cbdab9ae1f93de.npy +02691156-b151573056013eaf71d03b466c72ce41.npy +03001627-96929d658ba1a01211ffd7c4e1c9d12b.npy +04460130-f3b26a49739b20a08b7e02a440eafc36.npy +02691156-d1a887a47991d1b3bc0909d98a1ff2b4.npy +02924116-9085eef376a744f5f88b61e9125676b2.npy +03761084-f8a7646ad61d3d24a44340bf227e40.npy +04468005-3b79d8815ec492076ef2f6739437286a.npy +02958343-b17d638e7def9adbc8a6c4a50ada6f9f.npy +04256520-6c74c7ab655d540dfebad4f49b26ec52.npy +04379243-41ffb4ec3d22e9dd9e7e7bd5f870f40d.npy +03636649-9113ec0bd742c5c5e86e8111763264e.npy +03001627-65e770a8307a9332e68b0e385524ba82.npy +03001627-37ea477f2b894c6ca72559fc4f86f700.npy +02808440-ee2b060177dcc12522f427296d72cac2.npy +02691156-47a40ce42bb9077579dc7d843e2be5ed.npy +02958343-554a04784b2f0eccbc513bbf92336c2a.npy +03948459-557f644e37dbbf8fd11c813bb72a58f6.npy +04379243-306cab12f4dc8a47f51f77a6d7299806.npy +02691156-9a878c5f0bfbd964d470a0056f762381.npy +03325088-832cd41e86b6820869a59c3b42f34f2.npy +04379243-c4621b03630247f816baadb9e8e34df7.npy +03001627-a14c7700cfc99b03ca6910e4922d61aa.npy +03337140-8f1fb3337da58dab91c352d02061b3f7.npy +03948459-44f2f626a4c73b216314c3b6a3a65519.npy +02871439-4a9731874f7472e2a3017456b64dcf36.npy +04401088-10a1aa2255ede06589b4abee87a908b9.npy +02880940-804092c488e7c8e420d3c05c08e26f.npy +03001627-79317a7ee8c26288ce265ed390193062.npy +04090263-a413fd3df8c6a915fb5c1b0f759e2bc1.npy +03948459-1f646ff59cabdddcd810dcd63f342aca.npy +04379243-a8840b65c6dacc627984fb9ec7e40829.npy +02992529-ae819b81ba34165dd6ec95d8e6b9f557.npy +04379243-16001e59100b03c5fca0560918d50ea1.npy +04379243-5b4a3107afc425be60ddc468fe733ed1.npy +03046257-95abdaa7c190243b75c7b38519066811.npy +04401088-6609f05bbe9c49172cf708d3028fb325.npy +02691156-ae857883c77d156b71d03b466c72ce41.npy +02933112-42689fe4a481168276e9713f57a5fcb6.npy +04379243-209e7d26bf9421cc9959d6de6fec7ffb.npy +02808440-b6ad2af249e6f779df87b9c01eb0d775.npy +03325088-24b8bfb0ce76421b362845c6edb57fc.npy +04256520-389751629226a005cbde89e0c48a01bf.npy +03593526-3e79d011230224283307b6a54feea334.npy +04379243-33c9515dc8f887bc664b3b9b23ddfcbc.npy +02924116-8fbfd6ab27e1b3436ca2b6e5474aad11.npy +03001627-a27db3ddc9bab11a5fceaa39a8353bde.npy +02924116-d68bb8e6b2c612ec8b645746fb0b699a.npy +02747177-415cae243e110f5cf155d75bbf62b80.npy +04090263-ffdcd1ea957aef3dc5e86946f2168706.npy +04379243-6d0ef6312f8af87a53e946fb2184f0c4.npy +03001627-b4bbc9d05c1872239abed18a788c862a.npy +03001627-11e0f0dfd3d0b22130ddb6ead95f49cc.npy +04530566-d00fe7ce177483ed5cb65f793213d431.npy +04256520-fcf030593c0bfac4f13ce777d031b4b2.npy +04090263-91fd0f24b4865bcfadfdd35441a4b4ea.npy +03001627-3a51a83963c167c422e8a95d8ef092f.npy +03991062-4616a444bbbf7858a2c59a4d90e63212.npy +03790512-f0c7043178a8a2fc52ee90e577613070.npy +02828884-c56c65eff860855def9373d49bf935b4.npy +04379243-d4063d86f6b2d27cd5b312abcf74b469.npy +04256520-4fa6c9c06efa1fe14156f0e87c6858f1.npy +04468005-62012118bf9486daea52501e96cfb14f.npy +02958343-b1c6a021c1c47884c9463ecce7643e8e.npy +02818832-1edea7d187858e2630b07c64830a47f3.npy +04379243-a1be21c9a71d133dc5beea20858a99d5.npy +02933112-34850728ad9af669490ad276cd2af3a4.npy +04379243-9046b2e610065fe5a5d95e73eecd308a.npy +02808440-c0b9dade20bdf5eb17bd6af98d7f8e7.npy +02691156-b725f44502906a42dc5a5a67e94552af.npy +03085013-d6bc3855da47fbc842e76de3842fd93c.npy +04379243-187804891c09be04f1077877e3a9d430.npy +04379243-3a990272ef4b83ca8d3e8783b997c75.npy +02691156-489d3e4cc3d790a0ca8607f540cc62ba.npy +02958343-8b8f4f12e5b142c016abce8cb03e7794.npy +03636649-579387a47297e1f4276206fae5d3c473.npy +03001627-6fcb8bf770b8606697e2a21b8bc2d948.npy +03211117-52e60434725b8bf8f0975d5dbdd766e.npy +04256520-a5a855d1b710641ba90692240cb38ca4.npy +04090263-12ccacc72630c2a4c4a6c34a09e62a92.npy +03691459-8f9c393fc17d1cabd77ea5e1afa5bfe6.npy +04379243-c9da930b808c18d0923ef79fcb120ce8.npy +02828884-dd1a375db7015e0ad6983f351200ac6a.npy +02808440-5406f6de80a4bf84fe52ffd0e748a1ab.npy +04090263-ca13a3342c397d68952d52701459b1f0.npy +03001627-96c019b564eb9cfbf3c9c1464e55d580.npy +02933112-350be7f9f7eaf2667dcf5135889d9f2.npy +02828884-e108673170d8f781d40c07d3c15cc681.npy +04379243-d58bdda16e6bba6f796740c80be6053.npy +03624134-c66c2c4dc16813a4feec58e9448e8e82.npy +04379243-17bd2a95d2c691326fb8d4cf06fb5045.npy +04379243-99f9eac72f5b4df04d31637b346f5216.npy +04379243-b14c4d5783a339609fd4171283f33ca8.npy +03001627-78ba9e32a9a5c276f69d13812ce67f33.npy +03001627-da5aa9fe015114731a1272c8e47f5670.npy +03710193-7410410cfc1684d19df6f10c48eb6cee.npy +04256520-c09ae0a971165afe4fb315ce917a9ec2.npy +04530566-f728f7efb5612cfe6be14c19eeda8326.npy +03001627-5bc916f8b9d0a7c6b40f0ac0fb9a650d.npy +02958343-d8879578d668b458cf899c77ac8ff2f4.npy +04379243-478cc8d5c72f2823d2ad39bada7a0a.npy +03001627-ea572cc193b804399c66df0f068d2a36.npy +03797390-b7e705de46ebdcc14af54ba5738cb1c5.npy +03001627-98b698b0253d933b72dadd9292b51ceb.npy +04379243-b9c5de845a1f5ccf23f93d9b8d14f53c.npy +04530566-37b4b837ca7da6a4561fc06c3ebd59d2.npy +04379243-e07c83841b933e74c5facc3cc8dc041e.npy +02691156-523f5360c3aa35b5e1c77ed807ff5c62.npy +04330267-e72944489018b7b39360ca51ac4aef20.npy +04379243-e0bf1408425c886da159545213d74ea.npy +04379243-2a8a8ffd2ef41cef20768660cf080d12.npy +04379243-a0fa360b6e9b22196db2ac45db35c175.npy +04379243-5844a7d413c48b3eb9ea118461aa8a00.npy +04256520-64895a5b618e8a6fb40f0ac0fb9a650d.npy +03691459-22e8cd8675ab57e26d2f7f4796305f20.npy +03211117-32be865d1baf7eb9ca4aaad7dc0e3a16.npy +03636649-86bcb422f12d4d17446ab9475f488764.npy +03211117-c16f53ea58244af7d5297776dd9015b5.npy +03001627-67d3a3eceaada710e400ee8c5c49a7eb.npy +04090263-afda81e011c79d183978e5bb605fb72d.npy +03691459-4e0dee54cd02258eeeb8d422649e5f2b.npy +04256520-8d5acb33654685d965715e89ab65beed.npy +02958343-b44b09bdef8fa2209473806fbdf65cb6.npy +04379243-12193ca7bef40d40a84aed1cd93567b2.npy +04256520-e92822b0b73f0ad6976792e9f0f98e95.npy +02828884-8bcf6b5dc0c19e6cad5067eac75a07f7.npy +02958343-a74409e07d1a9e1a2925dcb663974b0.npy +04379243-7a95843ecfa6e5b7c21dc5ac5592089e.npy +02933112-3d326cbd820a49443a9bf8c718fc345e.npy +04090263-c888076f7b8cb125550a87cda3436d95.npy +02958343-7a226f6c9c37c8f7253c03b7df20edd5.npy +04090263-792adfe42bcc28b36b12c93c965d90bf.npy +02924116-c84de00e45935c77b049a4dd81126be5.npy +04330267-7c3287c18d2cff672e57a20276f6e9.npy +04256520-a6ac0716e7f056579f2349486c570dd4.npy +03325088-e762df4624be42054c62bee40dcdc539.npy +02933112-1ceaae0aaeeeaa1e5a8eba5f6050bab.npy +02828884-2cce7ee3c360abbad2b12aa6a0f050b3.npy +02801938-769f607f748898c737ac8d648045f9c5.npy +03001627-510a6ee3bc0a0669c8101121c12c3f9.npy +04530566-8c0199fb20e7d4d391347c63d1dae43c.npy +04379243-7534b0ffb603e3c571a70be9f12ce8b0.npy +02876657-ee77714471b911baeeff0dee910fd183.npy +03636649-2ee70ee71a0b7caeb15194162f658e87.npy +04379243-5e83bcbf2cafd5663087f84b199fd297.npy +03325088-a8a40aa426ecf89754d7082b34825ef0.npy +02691156-c47954200b78fc32f677dde7945cba25.npy +04379243-832bcb192b80378fdb039d8689a74349.npy +03001627-933902ec014c6d487135fc51795b4038.npy +03211117-91db88d4d0956e92a9a12c50dc330a66.npy +04090263-4125cf5a6e85244f2bf266a8f0187ce5.npy +04401088-1e597e56b6b2fef6c331b59dc8938ad.npy +04379243-73ea0e595fe794dced787bd949919203.npy +03001627-5b38b467c20ac734f7c5e1744a5e6f5.npy +04090263-59b69d23c7a2f9568f12efb4f632da7.npy +03001627-51f1ea91a1cd7370b3fdb1a7c9a60207.npy +03001627-9ee4b9c97bcf4b3715dec43ae6a12831.npy +03001627-674122da19a75d9bca86e527b84d8854.npy +04530566-1d6d57f489ef47fca716de2121565fe.npy +03325088-c04fd0df2310b7653321831d2245cf06.npy +02691156-70f330ba02ad7a05bec2ed99cca9acdf.npy +02992529-e0d9622225e1361883b4bc86420ed21d.npy +04256520-2b69e899da0c15cfb40f0ac0fb9a650d.npy +04379243-4386633c2d2a1a2c5fceaa39a8353bde.npy +03948459-3da97809eca46f35a04e0afc178df76.npy +03624134-1897adf19953756d91687e259c21528d.npy +03001627-a1555d448a9d6fa0666bc0b629562709.npy +04379243-d6f8a3bdcd20146929e4b5aa807bb4e7.npy +04090263-6ce72fcd06e465a6cbc6ff5546f4ec42.npy +04379243-89fe1ff1b8de298752e8ff799642884c.npy +03001627-956dec7d9cb7d078a9fe51c710ac111b.npy +02924116-8b95e9545df064536436916a86a90ed7.npy +02876657-9012b03ddb6d9a3dfbe67b89c7bdca4f.npy +04379243-a797546d87b4a03bf4b6538438a0b930.npy +03046257-e75539f66fe4071e4858278d1f98c5a.npy +04379243-7b5544ecc31bc609a8e4e5c9426fb9cb.npy +03211117-9abd70906336af9c1c209b1cd3e81587.npy +03636649-790931b57e9513bf661713a114fc5367.npy +02691156-692797a818b4630f1aa3e317da5a1267.npy +04530566-8508ec8efeedf4a41ff8f5b5b24b7b46.npy +04256520-b23656fc9bf32eaffa22474bb826a278.npy +03046257-a0cac1c1e4de1434f51f77a6d7299806.npy +03001627-88aec853dcb10d526efa145e9f4a2693.npy +02691156-3039adb37c192644f8c6d04d97f8cf7.npy +04379243-f9e126d15c5761b29af4053b8815b239.npy +03001627-9e3dba0e6fd3408bf382e154aede1b6a.npy +03001627-713d9d23bb3eccc17fb8cf8a85dcfe23.npy +02691156-5e9129782c45b26992e39b8eae3e6b15.npy +03337140-1709429729eca32ed477567e8c8a6c59.npy +02691156-f5cc091bacb338c6951971f8370d9050.npy +03325088-b963d7abd99a0f9df94134d46393e640.npy +04379243-15490f254e6e226835cf289fa8ad7115.npy +04090263-f36f38edfbde85c73a04e41b7ea7de8d.npy +04379243-126347c2c4404eba96a3517f50eeb9f4.npy +04090263-e6ff26a9ad6f6321ec69d13496bd4a34.npy +03928116-c86b1da5558ff70a9949833630526071.npy +03467517-1416788a22ff5ffb1082f2ea630bf69e.npy +04225987-d4c042d11f29dffa1082f2ea630bf69e.npy +04256520-c06ec5cdf3500b6c965332f7444deb03.npy +04379243-3817a222e96acc4ca78510b72d2281ea.npy +04379243-7edb9183dade5413ae685ca100c909e8.npy +04379243-e692a96adb18ae3fce101336817a135f.npy +03691459-68d5652dfb91b82fa2b4280235a76885.npy +03790512-8a5175f5b9be6f34e91fe7b067344e07.npy +03513137-d8b02a2ef9de06702e85eab6bca44d5c.npy +03636649-ed323758d0f61cfe6085a0a38e2f255.npy +03325088-7bb78658b34e569933264edfcbff9a7.npy +04379243-6eb19c354c19e759d5883ca9b41ac387.npy +02958343-3da0d2ecb594ceae348b30181b0729b3.npy +02880940-ed220bdfa852f00ba2c59a4d90e63212.npy +04090263-36dee5893da238565dca6305fb9f97ca.npy +04256520-9895736717c559ad48d8ff57878739ca.npy +02958343-aa5fac5424a05c6be092951e627bdb8b.npy +03790512-42b5ea257418825b5c11b538bde9e3f1.npy +02958343-259bf3c89b0b2152c1f18a2d53a6674a.npy +03001627-bbadf45aa419015c7e4d369f13ed434e.npy +02958343-6d89098a33908cbd77b59844decf6d46.npy +04379243-1ad672c0a138f8ffe286a7dded929c2a.npy +02958343-8e05e4f955eaf140ff673973a435017f.npy +03211117-1d9f55b1651c5190a3f4a96ccd277d49.npy +04530566-6a65cd6bd6897cbb42df9eeba89a416c.npy +02933112-8093937b9072e92afab6e40cce6926d7.npy +04090263-98f15a80dc5ea719d0a6af9bfb470a20.npy +04379243-8d35df98a26e8317a193550461f84122.npy +03325088-73349e2e4982b3aac36fb70296e45483.npy +04256520-7e7c1aca9d7ce7f2f7628281ecb18112.npy +02691156-79784107e5be61a562347b4731688b0f.npy +03691459-79267b91b523933d73e1b2d018c0512.npy +04090263-45f3755b324a97803bce1f290fbeceb2.npy +03325088-b53baa693c98951e589577ccf07b31e7.npy +02958343-6232fe1824a6d1775b72003cd427d0c1.npy +04090263-efe36ad683de3640a5aad165050e534c.npy +03710193-f0d2c4725d7c5bd037aa26bfaa1093ed.npy +04256520-6262bddcd8bafdac3bec56bff764ba78.npy +04379243-c11167eda66f60f219fb4103277a6b93.npy +03001627-df7735e2bce09a511f98c0761af40e04.npy +03948459-254c2310734d6a5ce3cf43faf3d38113.npy +02924116-e9c2ef4bf977b1b8d8b621afbb58ba75.npy +03636649-df4e44114543e805fcb8d8c6d4df8143.npy +03001627-810cac0d137efb1d21bdbc0445d9f748.npy +04256520-e4c4c35bffae3ea375a82b88fe6e733f.npy +03001627-8b54af871a3ac77c492d9da2668ec34c.npy +02933112-b8e019587c8157041a3b39b07e4b3d0f.npy +02691156-1896f1f8724aff33b7ea0a7ab024f81e.npy +04256520-15d2efe697d229aceaf288f952624966.npy +03001627-9505568d7a277c7bdd7092ed47061a36.npy +02958343-1f8aee726cbf44c23d27832ab9ea6d92.npy +02691156-a61d4ad108af6eecca8607f540cc62ba.npy +03211117-4a8e7bab0b1bcf77103e42d04ec345ab.npy +02691156-5de2cc606b65b960e0b6546e08902f28.npy +04379243-c24b7a315dbf2f3178ab7c8b395efbfe.npy +02828884-3bc45b4fea81c02463b2acb037dfbcde.npy +03636649-456a6dc3d369a749519f3f3e6cd6d1a6.npy +03001627-32788564558e513f7628281ecb18112.npy +04379243-a13c36acbc45184de76bc197b3a3ffc0.npy +02958343-bb3c68db5dc0052e98b54df7430097ce.npy +03001627-a122cf5d1e23e88d72a5c49c981e6593.npy +03001627-b60fb4126e9e7c2aee3907b60a74e8f8.npy +03001627-e2ed8de5542c5fcd215a29c5523c5fad.npy +02691156-7fa1d1bd456f0fdf6e68e46a69a2d96d.npy +04530566-33f7a4ca412285334616fd0dc3d5279.npy +02828884-f2916fe6d5f06678ad5067eac75a07f7.npy +04379243-dd6e80140b3462f4a1b2e810c76f942a.npy +04530566-1c7f49bab676187480901e43af4435c7.npy +02828884-1dd7409c95d59d0da192483aa282f8e5.npy +03325088-1e5712458907fe06b362845c6edb57fc.npy +04090263-2d34668468d0b542612389706438d0e5.npy +04379243-8c2ec4b15289d88cc5d1c45cadcaa3eb.npy +03001627-3795f02c9818a7213b407f4857c15d98.npy +04379243-2f3557438a95798fb76e29c9c43bc7aa.npy +02691156-dbd0efc89242cc9318de900bee20377.npy +03211117-771a0b1638955f3946f539968f885949.npy +02958343-28fe2af4fd6ab3848772afa45900d07f.npy +04379243-1ab0b879f52e7cbe958d575443776c9b.npy +02958343-c4941d6a2266813c3a2b1a2e5e169910.npy +02691156-5ab5f03340921fc8b96ae1a0a8b84ec.npy +02924116-f350f3e3bfea76429afb67dd284d342.npy +04379243-cf46448f9ef495c81d022067655f6c16.npy +02691156-70ae0521d5ca428d7b3d3cfb30f2513e.npy +02691156-cda1206f9460ece9868255f726935f63.npy +03624134-24052727fc20af3723323642c1ad333d.npy +02871439-d70d80e5855785a761b9fd1751b9fcb.npy +04379243-36f771a41910dd89fb713eaada66481d.npy +04401088-6f725c21e92ae3e8dfac5fb05629bdfd.npy +04379243-38ededbc1b3693cbb9aafffd8edadb6c.npy +03636649-c6755ed48456490d2744bf8869518694.npy +04379243-a7809c62e26301e08850ff5e612b6198.npy +03085013-56794ac8b1257d0799fcd1563ba74ccd.npy +04090263-299416940399c3729d05095e3aff5e6c.npy +02871439-80b9e4e048733c2916421c9121bcb0cd.npy +04090263-78dd4dc65639258cd735fa1ab17311ec.npy +04330267-f16c01b6daab26e5f05f8c8f732a9858.npy +02691156-260305219d81f745623cba1f26a8e885.npy +04379243-1328dc6429d179d056f6ef8b6ca8f4cc.npy +04379243-cb1cf4ec74b4aae217923568dcd460b1.npy +02691156-22d36043ad59ef026edd138a394f7c4d.npy +02828884-6aae683396bc08eaa4b1640fdb2c85c0.npy +03691459-c0de25758444d71f77818a0572bf1777.npy +04256520-7bc386f19f261758664b3b9b23ddfcbc.npy +03691459-7f1be3e7b6adeeae9bb399e812556da2.npy +03001627-68b88c0be088c21d5e0096fb2d3266a.npy +04099429-fa07813a89527d195d1df55cbe0874aa.npy +02958343-fe7c536197065436b3030c76de18d16a.npy +02747177-f8b449eee1c8775fd2b12aa6a0f050b3.npy +02924116-13339384a87e3557b1626da45836ca54.npy +03001627-df28bda265e0e5bd2d282edce951a03f.npy +02773838-f5800755a78fc83957be02cb1dc1e62.npy +02691156-856a4d86ea105d97be13ce34aa7c0c1c.npy +02958343-8fc2691025a48e21381a9e1cee6d0b00.npy +03691459-a34c80e1f6175711c9d5b08933b9e0c1.npy +03790512-e1dbe3832c41e45a8f23c5d2712dcf1e.npy +04256520-523daab7896a34ed65234765b3a00e8c.npy +04256520-1c2fa78dbf2d2cda9e02fc85f824870c.npy +02958343-d1e2f84cc473956696e59b6a2c87ca55.npy +02691156-352a8e4f2023b029dcc75fd1795fa3a5.npy +02828884-35908dced5e46b32ad5067eac75a07f7.npy +03001627-9aece6c6436cde6fd9ac1bf1eddffd24.npy +03001627-ca5d7ee5cc56f989490ad276cd2af3a4.npy +03001627-114f72b38dcabdf0823f29d871e57676.npy +04530566-7c4ed531d1ecacb156258bc213b2f9c6.npy +04256520-afd1b4501cbda28814f62593b9237aa3.npy +04379243-5740806aae21635034943af333340cd2.npy +02958343-c8fa4fd7fc424121932abeb6e2fd4072.npy +03642806-57f3409e6f6c2dbc73baa2510487646b.npy +04401088-657fbd67af945c39d9e3837723c05057.npy +02924116-831d5d480526df85f991e1d909fa63e3.npy +04468005-7a8919f9d2bd7b2327745e9b6b461e93.npy +03948459-46093a3a5f168491e1f2a1daf140ac9f.npy +04225987-d041334fe322ed211082f2ea630bf69e.npy +02808440-97cc75a511c0e11b54d7082b34825ef0.npy +04401088-2d3208fa267160862c611effe1bec8cf.npy +03636649-a911474d0fa043e3cf004563556ddb36.npy +04530566-61eaa4afe332ba113547ed4d05d19f04.npy +02691156-934e5dbb193dab924d02f09e7a1a5b28.npy +03636649-a7f67a2088ce033f3ec7ad443e0ae81e.npy +04379243-1fe806fc0004aae877845ad7d2ecfba.npy +02691156-95f7a9754cba79469a6e43b878d5b335.npy +03001627-87b576eaf04f1b62305e886266e302e1.npy +03797390-546648204a20b712dfb0e477a80dcc95.npy +04090263-5376c38ea63848d643b0dda994f793ec.npy +02876657-9d2d3a8d1dd877c1101343fb67a1d189.npy +03001627-c98b7e1952c2c7bb85f6153ed2033a1c.npy +03046257-57e7fc194e77abd5a8ca6a1b83e76dec.npy +02924116-c2c9e1682f395fb051894d116f1c652.npy +02828884-ccc1d51eabbf589ad5067eac75a07f7.npy +03593526-aa638e39c28f3a184800dfbcda5cce3.npy +02958343-52a1d23a09e38c4d50577cf04f3bf74a.npy +04090263-7d2adefb8872fb564d73c4d754d3623a.npy +02808440-591906b60da78a063321831d2245cf06.npy +03001627-4159903eaecd9560fdac1e69603928f.npy +02691156-56ed0ef0864d18c2f5c7319b71bdce6e.npy +02942699-1cc93f96ad5e16a85d3f270c1c35f1c7.npy +03636649-5bbe3658e49eece0b49beb995c4209b8.npy +04379243-fd42924378694d9c2554f2f6bda30622.npy +03001627-22ada577361ed0374b3c42e318f3affc.npy +03691459-c73bd84347cd8fc9599d9c8430d600ff.npy +04379243-df38d8c2f3b36ff76e4b69f8ed4dc344.npy +04379243-e7c9af90b186c098490ad276cd2af3a4.npy +02691156-d64f391dee878277bd46d022fd7d80aa.npy +03001627-dada2389e96606307aa7cd663df90f18.npy +03001627-e467cfa616850a4a990561fc34164364.npy +03467517-83c5644f07ee55906f29623db019b549.npy +04256520-192ca330a80532471b17743c18fb63dc.npy +02747177-5982f083a4a939607eee615e75bc3b77.npy +03001627-a724a8b2ea1ef63954a8e7cfdf35a7ed.npy +03001627-796903c53c6de2025213cec267286d18.npy +04379243-ea367e390741fc38dcfcef693e7ec696.npy +04401088-878135eab6ae9aa181471a5ba59fd0fa.npy +04256520-f813edee6c5acaff4fb315ce917a9ec2.npy +04379243-aa97318224630a33f51f77a6d7299806.npy +04379243-25fc395dc873bb478a252571106d569a.npy +02880940-3f56833e91054d2518e800f0d88f9019.npy +03001627-7e7c1aca9d7ce7f2f7628281ecb18112.npy +04379243-8654b644c766dd23d1dcc55e36186e4e.npy +04256520-113a2544e062127d79414e04132a8bef.npy +02871439-dc4398c59766b2e8d42b9650f19dd425.npy +03001627-764866604b035caacd0362ae35d1beb4.npy +03001627-776c1d1857a4ea3d853c3fc864dd58b7.npy +02691156-a231f85d38f2b52154eefcdc602d4520.npy +02958343-2f0ca88dc76e39a7ff1370452e3a0154.npy +03001627-6455bf241fcbe3a03adc3470b30138f3.npy +04379243-aad4591952dd151189485cd87f37f89f.npy +02992529-5e5c0391952208e81213f8f7891e7fa0.npy +04330267-18943947ce3b8cae8a94168388287ad5.npy +02958343-473dd606c5ef340638805e546aa28d99.npy +03467517-e15f472709c535382c8ae424ae73c66.npy +02691156-958cc8251e6f7d8fa9b2becd26dc2fc1.npy +04379243-f37310698d465cf8c8bd09537246ca3a.npy +04379243-229af4d0700b3fab29f2e5c9212b176c.npy +04090263-ad0bdb0b1b0c8077b4cdad9a5bf52dd5.npy +02958343-edb2ab8a1d7e20f36436916a86a90ed7.npy +03325088-839b652592f066cd31ee592be5c5c0f1.npy +04090263-8690ee57423c0e591f3140bdc5d4932.npy +02933112-19dd35ef180808c38f1735145fdf5c5c.npy +02946921-b6c4d78363d965617cb2a55fa21392b7.npy +02691156-28711664a9d08bae46322bce65ca3756.npy +04401088-ae942af3b88d07af2c557fc696108818.npy +04530566-13a9352a47bab8c98cfe472915a175bb.npy +03642806-e555880523dc11425b440d1b0fe8ea5c.npy +02958343-2be8bd6b150a9fee97df6383472cc5b6.npy +02958343-2fb155f2d36541b5e3bdba9430565083.npy +03001627-124ef426dfa0aa38ff6069724068a578.npy +03337140-8b3e462e8050e8f8e4e346ee2650d150.npy +04379243-a79ed851896a40d8c10555abb2efb430.npy +03636649-5a957ade80507541ff2c92c2a4f65876.npy +02876657-2bbd2b37776088354e23e9314af9ae57.npy +04460130-a0cc96c45bc569d9ebc1e59456a1eaad.npy +02876657-1ef68777bfdb7d6ba7a07ee616e34cd7.npy +04225987-95c69877104059fd1389cf37af584e4b.npy +03593526-bbb981cec11e59771fc611122dc20c0a.npy +04530566-707f009ba421780c2af11d59b11e0199.npy +03046257-d3676f524d86dc1d6463df620b7b4cbc.npy +02691156-b7b94613ab6076a2a959294e5fb80cf8.npy +03211117-9740d1752c70a41350577cf04f3bf74a.npy +04379243-6a31302378d14412d42ec7e303174a87.npy +03467517-ff18697f9ce909311082f2ea630bf69e.npy +04090263-7b6a6e33903b1639a5772249c0d44247.npy +03046257-8e0c621551e9ace310eab5c01cf505db.npy +02691156-1284eb71b82f6794207f77cc6c79e3d5.npy +02933112-178529522942bd9e11fc2b865c2a185b.npy +02828884-6b9d09fcf8998360a36fa9e07c662628.npy +02808440-8a79f6c9e4e6badc26ab2d6bff19a0af.npy +04379243-15647d8895f78f6096a3517f50eeb9f4.npy +03467517-1a8512735ed86bc52d7d603c684cb89e.npy +02992529-cc3f77485b8a18db562c8e1ac545ef78.npy +03636649-9b0c6f3ee4a7965644b289cb940133b8.npy +02958343-b156359022f172578c844a5e3a5e1a93.npy +03001627-39c2f4690aff8f049a45ed2554d2f93e.npy +02933112-5984042b95305aee4da5feafe6f1c8fc.npy +03991062-707224831466c848368b14e48c164a6e.npy +04530566-4bcb45bdbf0309201d2d2f3b717d35d5.npy +04090263-931f74bd98683d493a04e41b7ea7de8d.npy +03938244-adc12b60e048f81b283b00891f680579.npy +04379243-61c9711cf5308ff98d4b556335cc5d64.npy +03001627-d9fe499372f2156fc0d328376073b25.npy +03642806-7d2718656efb3920d1954a7ac233ac80.npy +04379243-905ac0420ec18c415aa4c6e8ff29695d.npy +04256520-86ba626309daedc8e8f8c11a24c52ebb.npy +02958343-cd24768b45ef5efcb1bb46d2556ba67d.npy +02871439-c007d1b4972f70102751be1fc72418bb.npy +03691459-16e0041bffa976462d563c85edb49108.npy +04530566-8c611205ba2d189068b6f3ae18faf6b7.npy +03001627-c47b50988fef70c9220c18114ccfb3af.npy +03624134-e9280056548518c0ce7c7b3554aba2f8.npy +03001627-a3aa7e473a8059133087f84b199fd297.npy +03636649-d450da2cf4d0b79bb20310112468976b.npy +02808440-ae1a11d1ca89ba26e863737836cd53b4.npy +03001627-fc7b535acdde11f4aa3e869226c9586e.npy +03001627-1c2caacac14dfa0019fb4103277a6b93.npy +02933112-124cd036611b65b514038d588fd1342f.npy +03001627-fdd21f7f2ca9f0bcbdcbca499b446e89.npy +02691156-e58010dd5766e0ce78f081615c34707c.npy +03001627-2ab159f83754a93ea6c03a53cf0a14c9.npy +04379243-d4b3c13ec756196f94b77d9f59f49ab0.npy +03211117-b0cc3e614afbe6546892efe917403e6c.npy +02992529-11f7613cae7d973fd7e59c29eb25f02f.npy +03797390-9278005254c8db7e95f577622f465c85.npy +02958343-857a3a01bd311511f200a72c9245aee7.npy +02828884-d7025b55fe15337ed7c5502d4a22edf5.npy +02808440-a44b0784e8f0c72d8a1b2423d95562a8.npy +03001627-239c363cbe7a650c8b1ad2cf16678177.npy +04256520-afdb8885328a9e1e8cbb8bac2032149c.npy +03337140-220844159a323ead4c3aee8e9d3a6ffa.npy +02691156-f70e5f2568e927147d755f57c8fea340.npy +02958343-37887931377037621f71e734a2d317fb.npy +04090263-99cd8bbe5b2f92fc643ae903098a314.npy +02828884-f397f583f459134030c983bcaf68f0ab.npy +04256520-b50c0ff1aa497809afbd772c78d05c2b.npy +04090263-ad8abb01ee9066b425c01bf8ef97ff0.npy +03991062-56d1efaa9b9cf0a85706d1c54190f27a.npy +03636649-4e0aabe8a65ddc43e019184dd4eea7e1.npy +04090263-a4ba46bca40afb3722fb813d47b359e3.npy +02958343-53d9995a0b94fd37428df271ebc70bc0.npy +02691156-6826af6513566b12f4aab844bf68e35e.npy +04090263-4aa568a12086e742fe773002d2182b7e.npy +02924116-3d5cf6ff4603cfbdafd9b08701d71980.npy +02992529-20e5a92f95731f04c4440dd41b08b3f4.npy +02691156-1026dd1b26120799107f68a9cb8e3c.npy +04379243-316863fc4ed4dcf7251178be84deb2e.npy +03001627-131abb0b13d6c5b97f0b1e4f6d35b0ba.npy +02691156-af188ff4bc1ed0693faf1ff99e423b8.npy +02958343-90dc895f52bdd3a748d3485197509ddb.npy +02924116-17fbe76eb329ca1f481aa8b5531c68a9.npy +04090263-c40d62605e84c6beba1d8c8cfb70e106.npy +04074963-759c3e99588cf5c7a25c3f3b8b3a059a.npy +03046257-51184ef0d515b5f2345b53c800e94980.npy +02958343-6dd48d74d8bc67e7a7fd25564c2e888e.npy +04090263-b3f0d3a6734e040be658483f9f1a085.npy +02958343-a6fe523f0ef082a2715e04edb8af9c53.npy +03636649-d456beea1501f278f70220cd6be776f7.npy +03001627-bdacb728b23fc758fc0035da39bd5e1.npy +03624134-b61c9b5f29ad581c860a45e027159a9a.npy +02801938-adc09c0ed058fe5f4725f67267e31c89.npy +03691459-400fb89ed6cc3d2bf1acfa9a5200e941.npy +03046257-395ec392bf1764d8eaf14273fa406ffc.npy +04379243-8e5bc7946066f431ada975aaf86ac85d.npy +03001627-8e581e01a8b742214e3003b3c5dcc179.npy +02691156-faa361f642620bb72def37e9c0b35d0e.npy +04468005-5a7c58285f656a47ada7c0f51e9fb493.npy +02808440-3121fcae458eebe383797e9920834fab.npy +03001627-103c31671f8c0b1467bb14b25f99796e.npy +02828884-ca4bb0b150fa55eff3cd1fcb0edd1e8f.npy +03325088-a63d9ab718a0427fc36fb70296e45483.npy +04090263-8ef53ef4767baf0d9af0e0a4fa12498b.npy +02691156-556363167281c6e486ecff2582325794.npy +04379243-8d07df2bf706cda58c5591114064d173.npy +03001627-2a1184b04dd8f30e3e92f39ce48d644.npy +03593526-3bc220b749489ffa89035c25f0dfeb63.npy +03593526-d20501ada9005a3fbd16d4490a10a752.npy +02691156-9a3b5fa35243504124f575085333a65b.npy +02828884-e6a3b8946b66b83065ba78ad9601cf1b.npy +03636649-93a984496599a5b82b151d8b52c53b90.npy +04401088-4f3c84ef24e1fe6f3b41ed175964f6ee.npy +02691156-fcc2023fd98e157f2d99c69702933ca4.npy +04256520-cd5f02ca40330f18febad4f49b26ec52.npy +03046257-7c1296df0dc164abc114ce436933a33c.npy +02747177-bf4dd114b53bd8f0d67352166d8df9fd.npy +02818832-a7d64e6a7223641733b13410d81359e4.npy +04379243-e8c92eb88e60460e9128f82277957970.npy +02691156-789f032dccc6092977b7d0d4764c121d.npy +04090263-d945ecdf7613bfe0c7da109ecb5068a0.npy +03001627-7fc52894c0d1e26dc433ba3e0e025e8c.npy +04379243-8e33e392d91ecf1c668ae11a7db5e82a.npy +02933112-c21853b4876b7078684b7bc3f8a9aa55.npy +02958343-1e0ada2b1891ea39e79e3bf25d5c768e.npy +03211117-d1fe596d83fc231ef300ba2413f318b5.npy +02828884-b2ab0b13c344132ec569803a3242d4b9.npy +03001627-601cddae7aca083a2db431502a680805.npy +02992529-7bd9b1b1297013ed65f78a217bb320fd.npy +03001627-3ab0a1dcb23aa0f620bea10952746d3.npy +02958343-2c1c8c4aee1e79d52aa494042b7c9db.npy +04090263-b1a6f690b8ae5ee4471299059767b3d6.npy +04379243-2eb503dde3cc027d86c701087a194026.npy +02691156-adee8f091d7cc677508af777f11ed409.npy +02828884-a8be828647ebc817abeb67a6e14a6d65.npy +03337140-de40f8e4834666b94c3aee8e9d3a6ffa.npy +04379243-44e4ff8c96e5864742d23b95defe1ce5.npy +03467517-9aa333a858848cb685a8bf3411bdb83e.npy +04468005-987bf24137c0d0d2c9b18c469e002c35.npy +03001627-a0d662f047378406a39cf424b6103cce.npy +02828884-d94b57d9a5d0b3732056b4bd5d870b47.npy +02691156-2b96f4b4896962473eb731541f9f8d.npy +03636649-d8d129b1a07b23b7a738de48265832af.npy +03636649-d87a2d766579f15e38b27a25d1336579.npy +03991062-3306b6e41cd1e40e7d257f312237d3ef.npy +02933112-584de35ad1e27820365f491f6e3dbc3f.npy +04554684-50c639910aa3d75f29d8eecf3827c486.npy +03991062-17235acddd0fb5a6cb2a965e75be701c.npy +03636649-8425fcfab0cd9e601f0d826a92e0299f.npy +02691156-3f9cab3630160be9f19e1980c1653b79.npy +03761084-ba6d0df5585528369a16c253ade435df.npy +03211117-70df1655d1e766ece537be33cc045ee9.npy +04090263-6d4bb384945e1a95d5388e4d9f5e09f.npy +02808440-6c122d48d254276f3321831d2245cf06.npy +02808440-c45f6c706330e9bf3321831d2245cf06.npy +02691156-e2275ee8d6b175f2f446f92b52bbd82a.npy +04401088-7ab7f36fa3523a1a33c7b6ed91d531bc.npy +03001627-2249c62788a52c61613f0dbd986ed6f8.npy +04379243-75aaea3b26362e7a659dda512294c744.npy +02747177-6a1b359efc20cd1aaec6ee5ba573fa6d.npy +03001627-81c291ab8abc1d0172b24bdfca058442.npy +04379243-3d7a9a28bd6b772a878cf98f645da333.npy +02691156-f40467cbad9ca466eb7d375d58cb985e.npy +04256520-2b64dbb623899dec7bdbd1926dd38bdb.npy +04379243-a414a3468a40d91027a4a1658277b4d4.npy +02691156-52a6ae9074397d5f65f50257ecdfa5c7.npy +04379243-ae632e7cfc0bd3a861687229b61f22f8.npy +04379243-f624b401d623b74a87b2f182070d92e2.npy +04379243-e809af47a0255110855931d119219022.npy +03046257-afd459e16aa2f8f438e5ac608a19dac.npy +02933112-634a4ad6496e20dbc3ea9e7b2ba79cb1.npy +02958343-263e3ee9f0182cc48e35db9103756ad5.npy +04256520-2e12af86321da41284e6e639680867d1.npy +04379243-966cef675324e416cd415550f639925.npy +04256520-adc4a9767d1c7bae8522c33a9d3f5757.npy +02691156-cc0c7bf3f0f598db2a9ab3cbfdfd536c.npy +04379243-e8c01f71fd941af11190e285a2cbc9c.npy +04379243-bf2a153556edcdc96325dd85752d9221.npy +03938244-757be11305637a815b68a464a9cbfadf.npy +02992529-61e83782d92bf80b7548281e465c9303.npy +04256520-4198c7de2a9f450bf07fee5fc5c45ee2.npy +04379243-66d7c4e6ba6c4d415963245f0923337f.npy +03761084-2ebe8d4adde5172dc4ffd3331f849437.npy +03991062-9c00e85febb3950fbd353c96f0f6d633.npy +02958343-f7cca46c4c8efdc6fa5eb13ccb8cd2c6.npy +04379243-ba444152722b67444b8710a3469971b1.npy +04090263-df0c9cef42873e71d2888692adb4769e.npy +02958343-bacf0105f617a750becf71e2e014ff6f.npy +03636649-44e442591f82cd4cab0ac374f450cdc.npy +03325088-82c9b22a5f1f0999b362845c6edb57fc.npy +02933112-429536832f2f4e1abfbd6f1ce8dfb216.npy +02808440-fa02ef26c333e469b362845c6edb57fc.npy +03467517-f1a405948649acf919dabd0465d1d64c.npy +04256520-aed821e5939f74a461bf0ba277ea473b.npy +03001627-7ff1b0ac88baea05dbbc9440457e303e.npy +02808440-bdf94fe1bef0281b362845c6edb57fc.npy +03211117-f4097db6ad343f90d551435517f7f18d.npy +04379243-770f6ebf01b135e556938a56df3469d5.npy +02871439-aeaacd2127e9f88de8bb25231731c25d.npy +03593526-65d3ab62e8fc9f2fda564dc72444286c.npy +04256520-35d44bbbaa9763a1b1b2d85ddcddb619.npy +03513137-8018b307a127ec8d4051b6e037481c7.npy +04090263-636c6b4415df67c5a5aad165050e534c.npy +03001627-53a442e47743fa4f457ba044c28858b1.npy +02958343-ffbebc7c9a32a6f88ec8762dea278247.npy +03593526-4c9e762d331457997ed8de38e968d714.npy +04379243-3b68fa3c60e1cfb7745a5e8b6205e3aa.npy +03001627-2a98a638f675f46e7d44dc16af152638.npy +04379243-ff49113c1bda893155c5c4533d35b323.npy +02808440-29081c2803a3c83b362845c6edb57fc.npy +02958343-229d52c6df86197bc33d84e056f4fd5d.npy +02691156-ad66ac8155a316422068b7c500584ade.npy +04379243-5562593c6448e4856402b8f491cd92c7.npy +03001627-a4d7d4203cdec5dffebad4f49b26ec52.npy +04530566-a53312711cd84c9fcfea3d4fc15719ea.npy +02958343-39201299cf83ec2577763486d77d1cb.npy +04379243-8e637b52c16d8874f09e0399552c33e5.npy +03211117-64f160a87582cea38a57abd4646e319.npy +04090263-a979bcfe6e057e87696934ac57f77b3f.npy +04090263-32e4f161682231ceb785a4ac4a0dbd73.npy +04330267-93ebe284d3d0f9d65e723252788c3d6e.npy +04379243-8d29772f3fbffe408fb9278cf94ef5eb.npy +04379243-5ec773b266374121e8058cf23f6382c1.npy +02691156-6a47f4d30d54771e8782c935066e938.npy +02747177-ca9c8771ab1ec28920de219c00d1c3b.npy +04379243-a06be76ebccfceb91c8935ddaf3dd9f5.npy +02691156-1560968d05cd8887cc14f1e6f4f4f49b.npy +04379243-db454c99849016f8febad4f49b26ec52.npy +02691156-e6e8f0e244efac73da2b0f839aba40f9.npy +04090263-8a1275efcf36b408488d77a033721bf4.npy +03001627-5fc3b7d677788b486cd47753062bdba4.npy +04379243-7d6ad371f7037a6679368d1198f406e7.npy +02958343-9511b5ded804a33f597505fd7d99b613.npy +02691156-463834c3aa682c281883411175051361.npy +04379243-6c160b3f23bdb1af1832c6620d562eb1.npy +03938244-af515313df72452f29dab95fdd4a19d8.npy +03761084-15ba6dd7a9ad8b12efe5f291bc2f5fd0.npy +04379243-ffc2c7813c80d8fd323d6bd8db8de5b.npy +04379243-e67046b9860feedeec7cbf3284585a40.npy +04379243-234e44f27b5a2852500cffceffd2bd2b.npy +03467517-87f6b43385dc55702d9fe04691733c67.npy +03636649-8fe1766aa6997b0f899bad344dc01f2f.npy +02876657-323705d1a8505cdb498751cf10995c30.npy +04379243-ef7ff0018b4041ad577f990873b69f82.npy +04401088-a4910da0271b6f213a7e932df8806f9e.npy +04379243-8df9eb57d6f6bf7f490ad276cd2af3a4.npy +04379243-1270e7980d2d69d293a790c6eb6d2ee5.npy +04379243-57a27a7ce775e13197ff8153b678d004.npy +02992529-c1ae3b758aa9ea5e6dba92a4e2177102.npy +02958343-9c27cdc4feb2fa5d4244558fce818712.npy +03001627-ee484fb2c1e4e611a0dcc52ca811e565.npy +03636649-9f6c2428e0cd344d157d629c9921fc15.npy +04379243-114520b78a1726cf86de8d6734d81fc9.npy +03636649-8bcbfeebef5df95fc664c3d4e2d59341.npy +03636649-ca75df76115441abc516ff01c2593ee9.npy +03001627-58b3e0d46af2019bdd7092ed47061a36.npy +04090263-27fc3208942d136b92cea77f96988ae6.npy +02933112-ab096629bed6f8e0f51f77a6d7299806.npy +03636649-ed45838f0c557b778a0c77569eaa010f.npy +03001627-769df6463d9f566e1bdd2be5d322fe48.npy +02747177-a09482e9b131164ead5067eac75a07f7.npy +04379243-49f625856c796254d249abd69334079c.npy +02691156-d5b78307fd9a0764bc97347c46fe15e1.npy +02933112-17ba4ef76444e74b4da5feafe6f1c8fc.npy +02933112-40d4200a071b555c5588a2543ef0b0b4.npy +02876657-9a70dd116325eb2df6b14e57dce52ee1.npy +04090263-62586a8eabb2a67a609e2d916fa0da27.npy +04090263-6ef67d1906344eda9905a3939c890ad2.npy +02933112-6d5049bc983aa8b4a805114916841d69.npy +03001627-746ec5c7c0ab8924fc1f58a995f231d1.npy +03001627-6721f13f40f706c31b17743c18fb63dc.npy +03691459-ed80a69f448cb9a7205b075c6f63f661.npy +03001627-b4b65ad3117199a2e8b2b8dc0c816caf.npy +04379243-e39d56046b309a64229048a9abc3ab6.npy +04090263-3fba044c23facdaefa45f4d7e1ef7d0.npy +03001627-49434684366778973002761e7a3ba3bd.npy +04401088-3d5401f4ecab9be91aec2282dd8bc87a.npy +04530566-58f13d9c96d702c72d5c18abc132bda5.npy +02691156-d130dd0c96152140bc0909d98a1ff2b4.npy +02691156-d45809b73a371efd185b376619557c95.npy +03261776-2c6f04001afcce7ded85c3dc02bada79.npy +04379243-8f059d82a5c37104587d0dbfbd9ca24c.npy +03001627-d621bfa4a44a98e3829e1f3c4926c485.npy +04379243-a0445e4888d56666b9d7c2fc41e80228.npy +03001627-a366bbec303662a3ec545e4e9c852271.npy +03001627-7727d0eef3eeb3ba73b2b620da30da86.npy +02828884-7c5bebe21d2f9232af268f6180933aa3.npy +04256520-c293fb5d58a88ce85b903ba10d2ec446.npy +04379243-aa122afea2dcf725db039d8689a74349.npy +04379243-b1c7003075067621682d288075fc0dc1.npy +04379243-80af0f92ecf69f69f5ff054d67d5fe35.npy +03046257-1896aaea4625200be7b657772044425f.npy +03325088-64050bcb4cffb2d176c18e71fd49c4dc.npy +02933112-9a0d2ef1f31fee42b022c94235bc8601.npy +03001627-2fed64c67552aa689c1db271ad9472a7.npy +03691459-b8092ccc834f31b9d69825aa8e687d85.npy +03001627-297d3e472bf3198fb99cbd993f914184.npy +04090263-766db9eda4efe6aaf7bd077790d66b82.npy +03001627-a09091780fcf3af2e9777a9dc292bbd2.npy +02992529-280c7836d6302b4bf3f8467cb6fe657e.npy +04256520-337165c7708f17314038d588fd1342f.npy +02691156-a4ea22087dec2f32c7575c9089791ff.npy +02828884-61ade658bb475cc6a992c1353f8a88ef.npy +02808440-40aa0697e18dba1184dd6c3274cd9823.npy +04379243-616894d973384f358be590460e3754d8.npy +03001627-a5f300f3975497fa9dcf2183c858e6e5.npy +03337140-a3d4da412ce4ef2f4c3aee8e9d3a6ffa.npy +03636649-dc78674611170676a87391c8bef1a77d.npy +04379243-25672204a764515578439215682e01f6.npy +03938244-953d16ed7eee84d32d7a27ffaafaaddb.npy +03991062-37ad5cc6e0357defbffe63c069324d61.npy +02691156-ddb9b552868e8c61334736c27ce16882.npy +02818832-6ff38c09b9ab4dfd712f5f94eaf97217.npy +02958343-3220cc9f67cd763af63ee8a34069b7c5.npy +03046257-3c4c2a5b991508adf51f77a6d7299806.npy +03001627-f4b6bf9253918b52944d8f8e13d63fde.npy +04530566-1f1fb65b78e0f6ac816e21307f82dd39.npy +02958343-890e61bfb197190e6382e1684e46349f.npy +04530566-246335e0dfc3a0ea834ac3b5e36b95c.npy +02954340-2f347d95d4a2dae3e762cf5917cef4ef.npy +02958343-8e145be3c332199dd6821061f4432a0.npy +02773838-6881468dd51c214922022e93ae2b2b5b.npy +03001627-9a864d5de972a8c7cb686b8b855fed61.npy +03642806-c8309234b360aa2c747803756378b292.npy +04379243-b0910467658fa43f7fde87eb01f5851.npy +02828884-6550c93bce51b9b4719088c8e42c6ab.npy +04379243-30b506e5e1fc282afdfcfddf24fb29ec.npy +04256520-3c389c01263d2eaf2b3e9b6eb52d35df.npy +02958343-89431ed41e43bbc816abce8cb03e7794.npy +02691156-807d735fb9860fd1c863ab010b80d9ed.npy +02691156-7584ab1da1ae2778300ca77569ad3884.npy +02958343-6a06a8905edb576edb976bf16d451bb2.npy +03211117-ef7ea1a94404fa633c1661cdd6e9aee5.npy +03636649-615019f5899e2aee8120bc4dfb819859.npy +03001627-484f0070df7d5375492d9da2668ec34c.npy +03001627-b2d6c064af0c735f1783a44a88d6274.npy +02958343-751a2e8afd998768fb8f6150ea0ae369.npy +02828884-8fc8fb14df48da05ad5067eac75a07f7.npy +02691156-98b5a3a8e2ab94ccce19d55bc5e6a406.npy +04379243-db00e248dce5fe409cd431573238602d.npy +02808440-d5d3d361bdf7245e75519658e0efffee.npy +03211117-aa99cc4323af7144e7321f25048c6142.npy +04225987-f9efb1b00b79c035c1cb365152372fc5.npy +04530566-b5290cd73084cec0283f6ecb26ba2c4c.npy +03001627-cef1f5c49e5de64f593ebeeedbff73b.npy +03636649-41caf27a559755fafcb8d8c6d4df8143.npy +04379243-63ebf8f4f1e63fb0bc85ae0034c4dd9b.npy +02880940-524eb99c8d45eb01664b3b9b23ddfcbc.npy +02691156-5c43f5436b308ed89a6e43b878d5b335.npy +04530566-a83a9d54e0680aca640afc71da6e41a1.npy +03001627-42e1e9b71b87787fc8687ff9b0b4e4ac.npy +04256520-b8f0f62a95143a60c5ae767f471fad27.npy +04379243-42756ba88f851b6e3c8d0fdfb1cc2535.npy +03636649-fec5f9c209e09dd9d49b2e04785f8492.npy +03001627-4387affd3bc4509a36b41ce3eef1f5be.npy +04554684-9ac5425b6c547d3d99373190f2d703c0.npy +03325088-bf3e6eca3beeb5e89f5dacf3fb5f1b3.npy +02933112-8b35178a614ee2f462023490a1e05c18.npy +02828884-ddab02e0fc2921caf46518fccab79b6f.npy +02828884-3ee044d00523169dd4d8765e3910f617.npy +03593526-ded8dc705001ffd01261f7393ffee2ed.npy +03636649-d231a8b21aeeb7d78749901456352d5.npy +04379243-7c77974a20ec2629d8f27b2e727c3511.npy +03001627-9e6564dce4cc128efc24661f5f8d5d00.npy +03001627-43a275d9bd008a64bb0085d0daabdaea.npy +02958343-ba1a26acae4b773431141a7d4d06dc13.npy +02808440-3c16de8249619580fe52ffd0e748a1ab.npy +04330267-287fd6b1b61269907fa354dc1b904bdd.npy +03593526-d0240d785e39c7ef8da95317eef6e82a.npy +02691156-6705821a6b32fb3eca8607f540cc62ba.npy +03001627-736589cbc46fe6b059f8e31ca87c470e.npy +04530566-62b67cadf45841ab82b5804533e545b1.npy +04530566-badc6f1a2c19f724f3e39f2e17005efc.npy +03991062-f1c17606d5952d9225ebd1cd0b422e32.npy +03001627-270b86f1c341d7fc98d5fc0473d00a1c.npy +04090263-800299ba59951df3527ce7c85e81fc57.npy +02691156-27e6fe140e6e668a3881254c11db28.npy +04401088-19bb5e75692793fd45df661aef5d0a33.npy +04379243-996096692592afa91a0e159a720dabf7.npy +04401088-9728d42d4de74ff69ae0ec37bea5341c.npy +02958343-8d1ef0a2c958b23f22aa128014a842c4.npy +02958343-fce2b933f93d132f4f45033b2f001552.npy +02828884-1aa15011153c5d6aa64b59533813e6d6.npy +03001627-80f96250bed47b4f52e9aa88ca53e944.npy +04256520-77a56bf8ea88336019fb4103277a6b93.npy +04330267-bb5533538179f6c39209092a6c03f1bd.npy +03001627-7661a325724ae00acd0362ae35d1beb4.npy +04401088-ffd186dcf855e13e26479a182158bae5.npy +03513137-777497c94098014818457223b2b684b3.npy +03636649-60d1a7bf1e70c526befa8f2022732db1.npy +03001627-be43e61912136b5710f438ee952d42cc.npy +03001627-975d6db745442a755634c21965ee6bab.npy +04379243-f4d21f925b703fb7e46b767696592d01.npy +03001627-38d623b46d07a93fb7d9d23574a480ae.npy +02691156-122776d17b6a118086da73d36506db6f.npy +03001627-4356ef46fbc859a0b1f04c301b6ccc90.npy +02933112-8cfbb0ecb20361e8a7cb178ec63a7c4a.npy +02691156-7713f76f4ef99f19954990879891d2b.npy +02828884-9b41191a915c09bc669f4f2ecf8fba0.npy +04256520-90506850596aaa99891fca5db446d193.npy +03691459-d62a7c344c62875f9a0cc1a6d8beba8f.npy +04256520-b1f4e7cd4a1b24b4e086fd45e580f116.npy +02691156-79e06d1fe2e217b2cf67c0b63878e138.npy +04379243-3af91fd634a5ba759c0ca344f487323e.npy +04379243-2da86dfedc2620b61001738bb075c8ce.npy +04379243-8d4693c04d684e61a3430e4fb40c91fe.npy +04379243-93078952823dddaa5e56625f6688e473.npy +03001627-c4d1ccacb82d854b5a395b344d6773ac.npy +02691156-5869e6c3e9d2748e5ff3feb917a6004b.npy +04090263-8c4b9320b44f674ab09afb04c84cb438.npy +03691459-485a778cb7416a59e810658c16fad24a.npy +03636649-7fc85bf0b0989f864f3443b22038d340.npy +03001627-a78d31c9dd3cea02f91663a74ccd2338.npy +04379243-.npy +04530566-c0c1dce07f56384136da2d0ca22ed9df.npy +04090263-a85ac77659985978d43bb185feff0470.npy +04379243-7aefbd0f95e0e9653b09cd02500a89ae.npy +03001627-40a32b11861df98133ec62ad9f83dbff.npy +04090263-45f97261ea66fefd302ca88f2e083254.npy +03001627-8a2c1a7b282b9bf528ea9c4c28e5ce40.npy +03761084-5a933873658018998312881285c04cb3.npy +03691459-5ea9cb9068520d3bac80666502f7b62e.npy +04090263-ebd426ae34b743f4a50ef3fc203c6ba0.npy +04379243-867e978b82c313693002761e7a3ba3bd.npy +03761084-5874b21cb167217f4d9ddb9a204e75cd.npy +03991062-28129ab65778341d2e18cb49f02ca304.npy +03991062-d919a2a0e84382da148a76a78b10eb5d.npy +04401088-f77811bd35b9215dfd06b6d6f44d62dc.npy +02691156-a39940973102985635fc197bbabcd5bd.npy +04256520-9bcd5c2f575295283cd8f469f840fbd8.npy +04379243-3fa4d59a29c3b506a5e91f4d594e20e6.npy +02958343-6a8982bd53a9bea726149ed5e11fe70.npy +03211117-fbec33bb92e066ade1f2a1daf140ac9f.npy +03001627-8a26a4d0726014065a4867cafb45a61d.npy +04379243-b99bad700049d8f7cbe3d3c1931d32af.npy +04379243-eda01b811087e2f17002d0c486c20865.npy +02691156-388c9b9f1cf24ff84e61a0c2eaaabe87.npy +02876657-c6442bba98ad3dcf5e912b2d2934c0b6.npy +04379243-844199875fab83dd1b17743c18fb63dc.npy +03797390-5c7c4cb503a757147dbda56eabff0c47.npy +04401088-71fb433e386a5547f63375fea17cbfe4.npy +02876657-58279e870f4aec6963b58f539d58d6d5.npy +03001627-ca3670f77268f899febad4f49b26ec52.npy +03001627-73374d8256f79089c308dc58cdbda034.npy +03991062-63313f52b9b69592ff67c12005f72d2.npy +03691459-cb356bbfb74abea2c6573f6ede3fd543.npy +02924116-a549a2bb2ec82b3d7c76a81fb3030fee.npy +03001627-63da17eda9d415b5319c5e90e9cc9126.npy +02818832-d65ddc26ea062a2b9e4965f0106e00d9.npy +03642806-d786b5399e27a82978522e02fc65059.npy +04090263-e3dae8ffcbcc498c935777dcb8deec2d.npy +04379243-e777df6ffb40e3a1853d412328e7e7a6.npy +04379243-ecbb5a30557f659b2c528d33bca1ac2.npy +03938244-b422f9f038fc1f4da3149acda85b1964.npy +02808440-f1772937648f0a1b602f79528bf8e63.npy +03624134-ae7a91523600106259bc1c849ab4dd16.npy +02876657-738033cec99efcf2890766cd24d8fa7b.npy +03691459-46ac6f60aff34c5fdfadbc4d6667b477.npy +04379243-f1c3fdbbba8e36bf62a510b8f97c658e.npy +02958343-9586fcdd105347123ed4cb179e56ad61.npy +04401088-280a42d54e91c6968a02f6ad0818c761.npy +04090263-3592149d9f069cff276c3d558130f8b4.npy +02958343-62fa029fb8053560a37f3fc191551700.npy +03211117-f5fc954736b06be15fd06491ae919ea3.npy +02691156-ac4774b7a9fd06d55e6724a7c6e30991.npy +03691459-88c752eedbb2e133f7f12bd413763dc6.npy +02876657-2fa757f584a3be31a7ceedb2540a32b0.npy +03001627-631e102e9a689339b0ec386df15ab64f.npy +03761084-bfe33a2e7906a28f8405745f8a74e13b.npy +04256520-b3b659db2b29e8201dd80053668dcec7.npy +02828884-2eb289d5829907b9e6ad3e1a394e102.npy +02924116-642b3dcc3e34ae3bafe1d4530f4c6e24.npy +02828884-729c336995af1f96955a1fc933a0f899.npy +04256520-79170ac3bea792317984fb9ec7e40829.npy +02691156-81596cc38eef8260ce9e5ac45c67ec22.npy +03001627-aaba865e99c23e7082db9fca4b68095.npy +03001627-a680830f8b76c1bbe929777b2f481029.npy +04256520-8771f9b7cd6b7c81e724074e69c062a4.npy +02958343-9ab8a24e82568c598c2c132c71e94f7c.npy +02933112-1d898bbd8bbad8f98430b7446f9e1252.npy +04530566-c2d83f3b8665638c664b3b9b23ddfcbc.npy +03642806-2d38fa685e71721986a7e0484f5238e4.npy +02933112-b7dc1e9a3949991747d7c2aae1e5c61.npy +03001627-32c35f86754c0b4847307542345b60c.npy +04379243-f30419ee8ff3edeaae04ebd863e388a1.npy +02924116-139502837db81fafae3dfcb7ed2f0b2.npy +04256520-2c2265c2a9f3c886d0250e0e48027a4c.npy +03642806-a76724964bc58c73ec00b83eb025362c.npy +03001627-9d177c3174439ae1a48e53188865c070.npy +04379243-cfefed4429defd86febdb1f263373824.npy +04379243-2148ddc7d6228861e4dd86e9188294f.npy +04401088-81f527c62191bcd465c46de8aef92580.npy +04090263-cf36df80bbcbc74a6f8398adde24f538.npy +02992529-5814df537b8f1bcde95cd0dc8c2f0e83.npy +03001627-d2597d18fdc3594e1dc59d2adbe5297d.npy +02958343-f31eae8f1f64638c2a9eb0f146e94477.npy +03001627-4eeef58f4015cf74d93768e7b9b1eabf.npy +03928116-7da48dc86606fdec616c08e4715af963.npy +04090263-c4f3ee55952e49ae12b38b1d99376c0b.npy +03211117-72b55fd0ec85d68164ac9dbe3ce7e6be.npy +04401088-f7cb2d921f246c00cc8eea03ea8843cc.npy +03001627-a8f6ca4151f966f5c2e24dd3e5cf2d2f.npy +03001627-ff8efd10f5e6c5c7c6c0380e62f2644.npy +04256520-8a9630332c2cb42644ac83b3e97ad658.npy +02958343-a9e8123feadc58d5983c36827cbbba97.npy +03211117-777a8a1c887779f47ac59aba6f9a1449.npy +04256520-17770580d5c314ea268f063686455b81.npy +03636649-e8e2c055f8ea53a144638317e9e4ff18.npy +04090263-4c883b2d79225a06a5aad165050e534c.npy +02691156-965d457720def9a490b1d6deb98feec6.npy +04379243-9d80e026c9935fa9ea4fe6fd890fcb78.npy +02691156-29b3b168322ac49448d2ba4615e03b21.npy +03001627-c3b6c4563e5f3dc4166ddaef2c2c61ae.npy +03001627-573a615f3496ff4b9b9f2eb77f5e247e.npy +03636649-4cf8166bbaab7c816fd1582e84bf3110.npy +02992529-5f919ac1f790280f563028cebd5782b.npy +03001627-35e77eed59e1113c22e4620665c23c97.npy +02924116-414bbe39e41a8a378e60a499e73975be.npy +04554684-bf1fc3ec1617fb0064f9059364710e5.npy +02691156-7de379891610f5feaf7dd1bfd65143a9.npy +03001627-30d3b99aabb3ce1c4adcf948bcaafbd8.npy +03636649-1a5ebc8575a4e5edcc901650bbbbb0b5.npy +03642806-c0c055ba43c3528a3cb4d5b227cc213b.npy +02828884-602f39fc7534bc4a162bf7725b3fab02.npy +02808440-35a0eec62047815f7454c09d6230a4d.npy +03624134-60d54b7d23edd00b9ed3084b435bf82a.npy +03211117-7dd5b5e5fbb63466ce4aeb2e2812e0bc.npy +02933112-8415b7cd04f981d94692707833167ca3.npy +04379243-5f4ce562f8ebfb00a9f598bc574004c2.npy +02691156-f6b7f7695d091b9bc0909d98a1ff2b4.npy +04379243-4e928377ae98ed8d99e8bf807e902261.npy +03797390-275729fcdc9bf1488afafc80c93c27a9.npy +02876657-5ac30e855ea3faad8884a069d9619eaf.npy +03001627-58891b4cc3fcdd7622bad8a709de6e5.npy +02992529-3d5c17c3e60a168bdaab9d410eb59af2.npy +02691156-cda3cd7f140fe791ed137f17a6d8e3c8.npy +03001627-6ebfa5329b0d1439d4ea3f4c41b1b9bb.npy +04379243-f1b10865243d1ebd77cf3bb06f394ad.npy +02933112-8714a704af18d44b11a97ee9284a563.npy +03001627-1a74a83fa6d24b3cacd67ce2c72c02e.npy +04379243-75c5b314933c8bccea896321ee86caf3.npy +03636649-98636fb562413a10dd999d2409f5212c.npy +03991062-b565a82e10bf41d2131cd41ab5cc1dbf.npy +02691156-2aac22a33893fad8b96ae1a0a8b84ec.npy +03001627-b3194efdf2b8031e8f6e9f07be105c48.npy +03991062-18387bda93f1b17e36b0f2a1430e993a.npy +04379243-178eced0bff71d3653e946fb2184f0c4.npy +03761084-c5143f702625a10dd99265061a435799.npy +02992529-342ef21b1ed9615685feaf23dbe1f454.npy +03001627-d4d9b991ff7d31e8c8687ff9b0b4e4ac.npy +03001627-d57a11d2272f0d9f9c5c7365bb502b0d.npy +04379243-9fa0a6c2c9d102cf2bfb1b91e3f49afe.npy +03593526-5c2079f8089b0419ca2de9a00262030f.npy +04379243-bdd9dbe62272e25c48d90eef8384210.npy +04256520-a25fbfb1c72811d86e4d44229ea605db.npy +04379243-c35a14f84985f92a9856fa70a578baeb.npy +02691156-de1e70fefcabfb6f79be89de816ea2e6.npy +04379243-2060a7a8bc18a63b1cf96a5dc33e37f1.npy +04401088-9cc581a6c5d0b8fcc14f5d127de947a6.npy +04379243-4229653c43599d726ed8927720f5e445.npy +03001627-36ce26e70eace0a3d9b53420a5458c53.npy +04379243-17f3a2945d6550cbf7628281ecb18112.npy +03636649-746b82746c6a02cca5f600ed2cf472ac.npy +02958343-aaa31209c049647d190d02a746694d92.npy +04379243-8d2aac03aac051bedd3adf3090c701f7.npy +03991062-65d2760c534966f2d2b12aa6a0f050b3.npy +04530566-924eeaf6f203fb636be14c19eeda8326.npy +03001627-f1f8e16d23d3a0ba95f2719038c22311.npy +02958343-a583ea14f9da98936436916a86a90ed7.npy +02958343-d1acd4916d3d3b57c48db2ed8f5e994c.npy +02871439-38be55deba61bcfd808d50b6f71a45b.npy +02808440-a969cd5e93fd389b3321831d2245cf06.npy +03467517-7739bbd9890d0e47965378fe06bd3c02.npy +04256520-4b7785695ead572e175255c493aea87b.npy +03636649-f274cbff23bda61a85024815e816c655.npy +04379243-3125b833a365799ac79619984c97c1ff.npy +03046257-6a34103b8186cfe1490ad276cd2af3a4.npy +03467517-32a337387527f39193f0194265a9746c.npy +03001627-678ae2d4a386f4e4d0250aa1ac19fcf9.npy +03001627-e955b63a4bd738857178717457aa5d20.npy +02924116-cbe2cb74dbfcf7fc4aa94fe75fa150ae.npy +02942699-97cd28c085e3754f22c69c86438afd28.npy +03325088-1f43546db1dc2912f38c4a12750d961b.npy +03001627-e696f4c7cd88b8b52ff834514c92e8fd.npy +02924116-83bda5045aca68671db751af8df870f4.npy +02958343-913b747502e92aa34d1780ed2b3fe073.npy +02876657-c5e425b9b1f4f42b6d7d15cb5e1928e.npy +04379243-94fa2ca1212536d84a8050bb0dd3c541.npy +04379243-701dd3ef213c653b39401293115e30c.npy +03046257-4baba9e85a3ae76bb030c2da12a8fb31.npy +03001627-3109a0b9f9bc5fecb4cd1bd556007aed.npy +03691459-4f42950d660bffcdcdd18be3aeb2d66e.npy +03691459-6be15f4f6dd64490d747b49524a1246e.npy +04379243-3a6a01d03f28cf83664b3b9b23ddfcbc.npy +03710193-a4c11b601dd4a63bf8c63fffc82e8907.npy +02691156-b6dc4ddde769573df551b6c3f174499e.npy +03001627-5607b02869c1f8a019fb4103277a6b93.npy +04379243-e0f8fc5dc186a597a636371b2023a251.npy +02933112-703a95f9e0f51654f51f77a6d7299806.npy +03001627-8830354625df010037b71c02ebe8cb4d.npy +03636649-1d963d5c54613202b0aa15078ea6f391.npy +03001627-60ec0611befb7102dbca69f936e89647.npy +02691156-3feeb5f8ecbfcb4ba8f0518e94fcfb22.npy +04530566-c6e127fca727e2be3d312efac35b8a09.npy +02942699-7077395b60bf4aeb3cb44973ec1ffcf8.npy +03325088-45374c209823108c1036b9adf51844e6.npy +03593526-e4a868a10e10dda4befcf48d5b3e17b5.npy +04256520-52dd0fac460adb45e2879d5d9f05633.npy +02933112-226873c8d34e38286d53ab0fe94e911.npy +03001627-c7da2d72f9927f1881dff5c2e57ad46e.npy +02876657-970027a2c9f1de88c123147a914238ea.npy +04090263-54e1ce2402c4f754aca4b8a57632be04.npy +03325088-13b0cdb40fdb8e3c979c556124bee033.npy +04401088-a41e693828a65064e565c13e00bdea3d.npy +04379243-718df0ef71586a6ecccd93cbd8dfdb84.npy +02828884-5f8f2518fb850b544bf6fb242f907340.npy +03001627-f39d429ab98d5323a1a6556bd50a3110.npy +02691156-d5f4e2228e3fadd2aa6a832b9db7452f.npy +02958343-2881a09fc1f3d2be9dab4604fbb1a7b4.npy +03691459-acf4fb74200b838d874179120554c44f.npy +04379243-d151d9f45d8b14536cd661fb5fd95741.npy +04379243-28001cb70c38f19cf32b6091d9628440.npy +02691156-ed738ba28cd73714bb0f4bdf8821663a.npy +03001627-2137a8fcee12e72d19fb4103277a6b93.npy +02691156-4b4782c572fa8b11a20c7111a5d0d7fc.npy +02924116-9ec0c9cf9d90433035dc35aa11c480b8.npy +03636649-d54d7977d760f4c3bd16d4490a10a752.npy +02958343-1a56d596c77ad5936fa87a658faf1d26.npy +03593526-c369c35d54a88e56fe572c9a3e59d718.npy +04530566-d2d3ab44415a3d3fef5e991e1c32e94a.npy +04530566-52fb0261b905147d2fe023c7dc3e5231.npy +03001627-a58f8f1bd61094b3ff2c92c2a4f65876.npy +02691156-c6bcec892954942a83855ba2afe73b0b.npy +03790512-e7c8dd1efb78b8baba85a673915bd3d.npy +03001627-95e2f1fb6be241b4742728b30848ed03.npy +04330267-b94b76056a072784685e443e0ea51d93.npy +02843684-7f9bea8d412c57cccd777fa0a7548d4c.npy +03467517-401ff6021157dee293f0194265a9746c.npy +03001627-71b01320c8e9dd60f7628281ecb18112.npy +03691459-5f525c37469b0437feae521e94848af6.npy +03001627-d29d2c5a1b35b85b40f0ac0fb9a650d.npy +04379243-fd8cffbc99f7388e4f2b9e837678be87.npy +04256520-4742de1edfb9462a60fd51b2fec8dcce.npy +02691156-71bb720c33da689090b1d6deb98feec6.npy +03001627-e82136f5c8b2c3156cdce1333d517d16.npy +04090263-a1a89a8cc3557d373fab9f1733a68f6.npy +03001627-cc811f0c28012f493c528a26a44a30b6.npy +03691459-e2dc092a4ef62c09d207241113bee327.npy +03467517-661c603f9f7645f0d50e84209ea2fc33.npy +03991062-d61c8ea9eeb02397dfe9cab879fd37e8.npy +03691459-33d9a210df86a437cb3c1170309e6b12.npy +02828884-dc4857179ccd30ad5067eac75a07f7.npy +04530566-564d88a1c49ba742473f10e6caaeca56.npy +02747177-fa5f703728fd7d5ff4fb4dee5181bee.npy +04379243-4eae659d4bc093465f675b8d0bab4126.npy +03001627-a0f6ec9aede1d9039bad36d0a57d0adf.npy +03001627-657790bc7fd16326c132086242d50af2.npy +02691156-5da145252e095024ee738cc95b5ae8e.npy +04379243-6a311b1416a53f87697ad7b0fe6813db.npy +03636649-fafef4866d1a74f3fcb8d8c6d4df8143.npy +04256520-d2018df95fe894c388acc944857403a5.npy +04090263-7dba6294173994131226a6f096e4f8c8.npy +02691156-d0614abb68caa5ddac7f1a00b76bd166.npy +02924116-d0cc83d6fded7f1cc98c13d6112727de.npy +04379243-3cdf9215a9cf0ff5855931d119219022.npy +02773838-1b84dededd445058e44a5473032f38f.npy +04379243-ae2a8d605b8c4090acc95948d4efa8e6.npy +04379243-ea4fbea57b0b7b677c0ffcaa63ee0500.npy +03636649-2b194d6bed8daa82c0b2dda5ff15ea28.npy +02691156-a9b808a446c498f475df24d58e852c90.npy +04256520-a92f6b7dccd0421f7248d9dbed7a7b8.npy +02958343-17c08a4bf8224f47473f10e6caaeca56.npy +04090263-a1f65f97e61094e1202be79d8b285c1e.npy +03001627-2f0a94efe6d1da7f8616812464c86290.npy +04379243-b3a77356e56d7c9a2820d27b806f8454.npy +02691156-35f43f566f2f14651713426437a9f7cd.npy +02691156-1c2e9dedbcf511e616a077c4c0fc1181.npy +04090263-262510dc5b4cd7003d48ceeccdc87fcf.npy +02942699-22217d5660444eeeca93934e5f39869.npy +04256520-fb12015e8f705d901f8d8332ee17945a.npy +04401088-1b1aaa9a95ae964746becd46a4907f38.npy +04379243-e4f206e9aee482a15510d59f3ab1ed64.npy +02958343-36c4d31969a8c1111a31578ee9a364cd.npy +04379243-5b546ef5de5d10f3ecc9201d3d846bc1.npy +02933112-ac980e21cd4f41eed5076afb08856f4d.npy +03001627-3b472a135aefdc2943a0e2e54f038a60.npy +02933112-455a583e41579db14da5feafe6f1c8fc.npy +02808440-124807f04a76c484c62bee40dcdc539.npy +03211117-faa79bebcefea4256a4b4e0348cf692.npy +02691156-b253d5dd187679c74a9ee9951c24bdb0.npy +03636649-3d82ed43806901b4df9c597227d75069.npy +02691156-e090eb003856ed12ffbd931fcaa69140.npy +02808440-906d00e5cdd0f23437b3df14b1086ae1.npy +03001627-ac84a2eff5e6a64347598b39fd1f6465.npy +02691156-36dd57178402cdf2afd477f714c68df9.npy +03624134-8f61777bf6b57fedc13545c5b1a2e607.npy +04379243-9825c19c22c97af2aff4f3612743fea.npy +03337140-9633dbd1bb8c11134c3aee8e9d3a6ffa.npy +02828884-e8480e72fb656057656a19d1d18fdbac.npy +02828884-b274f40cccd7e067f155d75bbf62b80.npy +04379243-42018e077cb76cd3948fd22ef0eabdf1.npy +02958343-afeb58fbf8c45924cdf21e49b4ebfe68.npy +03001627-c570ee85ecb0e514492d9da2668ec34c.npy +02958343-f7c84d18011f76fe5e18329bdc55fc9.npy +04379243-a333abca08fceb434eec4d2d414b38e0.npy +03046257-313da995b26c1ab2e18cb30f79057c27.npy +04379243-14146d1e359f998b19b278d00a891f19.npy +04379243-410ad32a9cd5377458c429c80cce21ba.npy +02828884-e7536c6b13e44b9df4fb4dee5181bee.npy +04256520-af9245138b29dd19c8687ff9b0b4e4ac.npy +04379243-d458bc90f183605119fb4103277a6b93.npy +04379243-2d1d1b66d6e268d8c67c3af5181fac2d.npy +03593526-483b9263192747a3a4c322790a683350.npy +03001627-bae518da1e709e83596f70d1d7edd4bc.npy +02992529-21056b8560bdd1a9f63375fea17cbfe4.npy +04530566-1cd39434382e08ab8510ad9ae6ed36b6.npy +03636649-d982697f8c20b769aec118775e1a3eb4.npy +02828884-6152fd8b7b5b10df436455e65b78c0e3.npy +02871439-31a1fd4a86320f332c45f75322191dd7.npy +02880940-782aa72e7f14975b39d764edb37837d3.npy +04256520-bdd7a0eb66e8884dad04591c9486ec0.npy +04530566-a9737969ac039c9323dfd33205b06c1a.npy +04379243-24672a92667a51885878d4300758f637.npy +02691156-8383c4706c60ea2fc1006ed55bc1a3fc.npy +02691156-a0359a8d86947a2049fe495b383f9f0a.npy +02691156-e8de6c58f4a772d771d03b466c72ce41.npy +02818832-4290c1a305f46cba4cc1952ae0d6e81a.npy +03710193-4d1064364236d92dba999a2694e75319.npy +03001627-2bcf0b0586570ffe6c63b8b48495261a.npy +02691156-3c109726e03fbac4ace5721ccacba16.npy +03046257-1926de4988741ad81b17743c18fb63dc.npy +04379243-627f4b1f48b6190b9341eeec703c4d4f.npy +02843684-a448fb21ce07c5332cba66dc6aeabcd4.npy +02828884-ba8e193569ea391efcd6646576d2dbbc.npy +02876657-bfe7d0102dcd0deff43af5716b936459.npy +02691156-57c4a88a7b2e10f14c971d5c531b9d1c.npy +04468005-ce0cdf24724d4339c74aaa8fec0125e1.npy +03325088-d185710a223fc5303321831d2245cf06.npy +02808440-30d2a4ee211c4383125fa9990176f0d5.npy +04090263-f80ec2ac6f6e851bca7250d90eb506cf.npy +03513137-8d50220bdf7be7b92d356a2793fb4d69.npy +04379243-6686819cbb40a3502aa2b411702b495c.npy +04401088-6753572868705eacdd043998582f5fa.npy +04090263-1c6680f257e5c97498e6e8ec38d9445a.npy +02933112-4f53f0d00d3491f35eea3e3d89293379.npy +03691459-c2bf199ce5a022a1126d510cb8dd3d9e.npy +02958343-383a4d1ee8022e9a61fd7e090d4d0d45.npy +03211117-a568d8aaf2b587a2f27bd2175000097.npy +04379243-1d825a5cd1884610b08fe058d24e7e61.npy +04401088-52d1db0a460723949582767760266e88.npy +04256520-6c50fa0b3f1bf58e178548484b14e6f6.npy +03642806-6d88f11ac37f07a86a7e0484f5238e4.npy +04379243-17fd058dc352b9d11191025061735ea3.npy +04090263-17e2291c6ef778034b349e4b3dd5565e.npy +03797390-3d1754b7cb46c0ce5c8081810641ef6.npy +03046257-b6fa9b0aaadf6c89a1b95b258b5f7139.npy +03790512-d9ae53fbacf92182b37378f3c85478b4.npy +03790512-e24b42fe6296c613be23697565633b75.npy +02958343-bcc3a1e280cb9153618e9d35559b7aa.npy +03710193-31f30fad514955060d6908d0bcf26ba.npy +03593526-c795ed7d374e893964558a1c6a2a9f11.npy +03624134-4b57d6d81db28f8ccc34b900bb2492e.npy +03513137-73b749a0704ad08398ce5d19cf9bd7c9.npy +03001627-e642ac79a2517d0054f92a30b31f64e.npy +03467517-ff82ee8b58b03dead5ba605b3c01b057.npy +03636649-46dc3daf02f51d09490ad276cd2af3a4.npy +03593526-e81b2e879acd96f5664b3b9b23ddfcbc.npy +04225987-d303055e96cd59949da15808191f1405.npy +04379243-d578287c4a9452efa9af104529ef47c3.npy +04379243-7b50357760759ad58a70042c3e4356d2.npy +03636649-200fe239e1eac6a2651636b7e802cd3e.npy +03001627-fc131dfba15fafb2fdeed357dfbe708a.npy +04379243-7f29e2e6496ee99aeca1c556848f5db1.npy +03001627-e6ec608ccfb38d6247928239f46b6ef1.npy +04530566-f61132a535bd608c85f7a3de54751f1b.npy +04530566-eddb01638a0c8be89c9cb44b983e47a.npy +04090263-501312760a03072cd9deb3f829cc2475.npy +04090263-556be45ad32a1f18726ef46500f4c772.npy +04460130-b7600836218f2556e86e8111763264e.npy +02808440-e1bbaff08c5309a6412ac8cccf0c180f.npy +04379243-c7872212279d59eb540291e94bc8ddc3.npy +04379243-9e408f772321bb1920768660cf080d12.npy +02958343-ba03db3866faadf0dd27b2ba4335b978.npy +04379243-df166b0407fef7ae4b3c42e318f3affc.npy +04530566-852a4a82f02d64fb31205bd848315f04.npy +03467517-3bca4bb40d2b8cf23b3435cb12e628d5.npy +04256520-3477f074d38e57821a61e560ab9e3736.npy +04379243-10b5723ea035cb047464e25da6d2e90.npy +02958343-e333b5c405fbbb98457cfef9186c20c7.npy +02691156-9759b89377e9d3f454eefcdc602d4520.npy +04256520-6cc0e9deb3b519eba347d2a9b736d5f.npy +04460130-2ecb6add2316f940ffad7221e3cdb3ef.npy +02691156-1a9b552befd6306cc8f2d5fe7449af61.npy +03467517-e22fb9fe7451af10afaf9bf875738c30.npy +02691156-f3463eac7325b600d01b5600c06c528d.npy +04468005-b4d66e95bf17f53e9954eae9164faecb.npy +04379243-a8ff038540e5ef35daa3ef8c2a95fdb6.npy +04090263-c2ea3ff598b98f3f4528f6465fa2466d.npy +04379243-8e07fff2ae8a542051ef8c8b1fdb41ce.npy +03636649-2f345ba66e683c2bc5a208307819a3a1.npy +02958343-d482029701573b9a43fb5689d5ce14d3.npy +04379243-4ebcc39496c64f0a50566f53e37b2171.npy +04379243-b9886dd3c4a651f3664b3b9b23ddfcbc.npy +02691156-82e50255f14e7d9e60c9b6e4c75a092a.npy +02958343-bf523e37ff88cb10e23d60a1b706b44f.npy +04379243-53ff581b91740efdfbf96e9694161951.npy +04379243-5be46c0c35d3cff2297936c81e7f6629.npy +03001627-e08add655395ce8df51f77a6d7299806.npy +04090263-d16ba2810dd8489cfcace4d823343363.npy +02933112-381d0eb848eaaa07eee615e75bc3b77.npy +04379243-bf81d46925ba8ef7ef6c510e24348d3b.npy +03001627-92f79b8e45269847f0efa341b439d741.npy +02691156-a0c9b929b9a57fc8f0ea53ad10b4d47.npy +04379243-1f8205bc25d4d5f21771ee930e861b13.npy +03636649-ea02a7933158caecfcb8d8c6d4df8143.npy +04379243-f585560965413925d706ecb3379aa341.npy +04090263-c6567e2f9896825b49352dd33f95cb9e.npy +03938244-cac45c821aaa15e577ca5eb24dfd03ad.npy +03636649-1874da9ffb42f3ee990f8ee13a15ddf6.npy +03691459-72ecb9a2d25458ba8b4cf2c9fe044514.npy +02992529-bf15900bf5afb946b35f223cefd97829.npy +03001627-7ec876482b8d80ce5a8ae8f7c307d01c.npy +04379243-48dd6b701f9909da6a8a13d57e4d05f0.npy +03325088-2b06f6839c637fb54d7082b34825ef0.npy +03001627-2b6cbad4ba1e9a0645881d7eab1353ba.npy +03991062-4a2a3ef283ebab579e1e8b2486a6bb4a.npy +02958343-692001fd91d8328ef421855cd210fbe9.npy +02691156-d004d0e86ea3d77a65a6ed5c458f6a32.npy +02876657-1349b2169a97a0ff54e1b6f41fdd78a.npy +04379243-1bc8eb160194017cde26427f80dbcfad.npy +03797390-6c379385bf0a23ffdec712af445786fe.npy +02958343-fff64da26715b520e40201fea1ad0f1.npy +02691156-c80e8a74a31c6156bac66f0bb664359f.npy +04090263-e55bc0a1b57acec4a7dd22c0aa3913f0.npy +02958343-bc7ca9eec356ce21ad32396cbf7f43dc.npy +03636649-6dcbc7efc9369de386a5dcc6ebde687f.npy +02958343-b56bfe0649294ebecb02238be5da228.npy +04256520-babdd63b18d73a196625bd63cef94df1.npy +04379243-3950da9e4a5083d7b4fa97f642d1a681.npy +02828884-132231578d6084cacb2a965e75be701c.npy +02933112-6e03d2f837cfeb8ee75ac485a81d5fa9.npy +04468005-5ddf4835ed5640e942e61fccfc5d24ee.npy +02691156-222c0d99446148babe4274edc10c1c8e.npy +04330267-cfa1ad5b5b023fe81d2e2161e7c7075.npy +02958343-f94003409831db21f2cdad303f49c9f9.npy +02828884-5fa51bc60906cc548270ab5c6ee87257.npy +02880940-fc77ad0828db2caa533e44d90297dd6e.npy +03691459-405db2cef5b41756fa16d3c3138134ae.npy +02691156-ed35478403ae873943cf31d2bcc8f4.npy +03001627-3c17fe56ae05d51620768660cf080d12.npy +04379243-279c8601278e827dab610b0c94236463.npy +03001627-52f0514f5c38bc96f51f77a6d7299806.npy +03211117-8ec017a94a41b097b1b11b582321dc3a.npy +03636649-5eefe57de9ad8b6114038d588fd1342f.npy +03636649-873aad4a222d541a91c2792fcdc1ca8.npy +03691459-9fbb43c7437c1bb8a2ec0446d32ce69.npy +04090263-a4001adbd9f3443d3a9a4f49cc5d8efc.npy +02958343-970ebe02365dd05bfd7e1079f2e4956b.npy +04379243-af2feda1ed22097d6200682ef9a0dc75.npy +02691156-57a57f639a3e636d914c075742032f6.npy +03593526-85ad6844a52ec08cdf7d84aa9195db06.npy +04379243-9daf7804f32079f7b1973049b9d84541.npy +04256520-9ac58aaf9989a0911f98c0761af40e04.npy +04379243-9b042d709402eb968dd711af5650bdcf.npy +02691156-ee672fc1455b9fc43523242fdf9b75a7.npy +02958343-6d714f7b7170a581da8e502a3c6cb4fb.npy +02958343-fc521be0cb604c1aee4687e8f2543e.npy +02958343-3776e4d1e2587fd3253c03b7df20edd5.npy +04379243-89cb658542b25e1f4671d97b0fd17f51.npy +03691459-5f9d75a41d264b9bf4fd8600b18b879c.npy +03001627-fc6129a9310ba34c645311c54e2f9bdc.npy +02691156-8da05b28d9b2e2fddd01eabba9d45203.npy +04379243-9bae37b85e2c71ae62158b7ee658e910.npy +02818832-a84ff0a6802b0661f345fb470303964a.npy +04090263-7a2904413d538525bd337aeee16061a.npy +03001627-9191445d1c215cf09a8ef44e1d2c5b75.npy +02691156-94981062a6f3748844750bbcfe7b8fee.npy +04090263-1a6aab87fdd90323d810dcd63f342aca.npy +04256520-56cafcac4df5308d35dda488a4bbb1e1.npy +04090263-32706617176faf4a32dee48b245ce100.npy +03001627-bb48377bba20a712a45aa09d68b87656.npy +03001627-99d5fabe3b8258ce9d4d5dcd2cc33826.npy +04530566-8cbb360233696342309e1bb5976741f2.npy +04379243-20ba57a048c518e5732649bffe80ba61.npy +02958343-34d28083d9f0c31fa2e586b3e41e79ff.npy +03467517-4e982d5baec36536c86b22832615248.npy +02942699-5265ff657b9db80cafae29a76344a143.npy +02992529-ac6f6437f9e63981b6d41c42f7ade8c8.npy +03001627-63b5ef650f1020eb7fa0ee8efe00d1ee.npy +03624134-47f56f25d4582327cb77d096d6538915.npy +04090263-e65080fac483ce98f0878b58b4e887bf.npy +03001627-8da97531717192fc3215145fdcd9052.npy +02958343-787a38da42c2026ec29f776eec462c6d.npy +02691156-9afe827a622d8ca28699933784576e73.npy +04379243-1370db5c4f0b84026aa35752fcfa44c0.npy +04379243-938e3529b774a91fcee558e7a5a02ad9.npy +04090263-815a2488eff62e6ce641b9ab504917bf.npy +04379243-23acbe1f91d445f91ca1c7e576bee6b9.npy +04379243-4faf91d6e511e153b20565fa9224214d.npy +04379243-94c98b1e67618bd234943af333340cd2.npy +04256520-828940d7035de09f62e682c9809bff14.npy +04379243-1804dd6f5c827c1a4bf8d5f43e57b138.npy +02808440-b47731bf94a8f64bd765b52819c487ba.npy +03790512-b767982d38b5171e429f1c522640e6f0.npy +04379243-2e7a728b482bd2d453e946fb2184f0c4.npy +03001627-53ea833512f2235319fb4103277a6b93.npy +04090263-2762292f3f5629fe12b38b1d99376c0b.npy +03001627-f40332e31675a54d492d9da2668ec34c.npy +02958343-e1134a7e936b516fb1bb46d2556ba67d.npy +04379243-aad7eaccc93471d6ab610b0c94236463.npy +04530566-6189947ef21a4f4b7f6ea2f642fdf12a.npy +03001627-7eb7574764b397c3e87e9b3f41906a3d.npy +02691156-4a11239139c5f81762b600da24e0965.npy +04090263-ed939aa2573fc0fd3b5abd28a9df8c72.npy +02691156-e218bb755f35da1bb4cdad9a5bf52dd5.npy +03001627-60c328c57efb2a69820018801b237b3d.npy +02958343-2a2a1822fcf96394ed3696d854eee1ec.npy +04468005-814e850ce8c5498b5f73a346378dad81.npy +02992529-bfba0e8cdd5462e4fe103fdbd20df6.npy +04554684-71f26627a3eece3e151c656115fe24ee.npy +02871439-8007cf8349381dada5817f81a1efa3cc.npy +04379243-edb32ed999f08ed4a12cedd896805aef.npy +02691156-737629e185f4c45f99f30106e678cab1.npy +03001627-3a52c8cd645f40b4670786463e520f4d.npy +03691459-66baf7b7b4ce43d7e50f6aaad9a07bc.npy +04256520-572da8680677fe8937b2bb75885cfc44.npy +04530566-89ca399e4ab129a60014fe834c82238.npy +03001627-5e598a82d584211d2681d406cc3868fb.npy +03636649-aff71b0d462342aa4bf6dad97590bf33.npy +02958343-17bfc66c6bc0a99d68c415156b102065.npy +04530566-d0e7102863fdb18fb90142192ec795d.npy +03001627-64c80a33436b8a84541e733f245fd038.npy +03691459-217733447f1ec818c066b9622c005c53.npy +02933112-bbbd4de3e7ab25ad80d6227ff9b21190.npy +02691156-5011e352793d063f26360e1e29a956c7.npy +03928116-79d07ff15dd24e398043364ed41c1a79.npy +03636649-26bb7229b024a8549b0c8289d51d981b.npy +03636649-4916f793d87dd184d42b9650f19dd425.npy +04379243-53bc49f45214d8d6ea73a64ae4344bc3.npy +03790512-ce46af9eb70d91e2b37378f3c85478b4.npy +04530566-5b542fec3cd96c872e28b2b96a4985ba.npy +04090263-39219da571e93e9825c70fb1df3f879b.npy +02773838-133c16fc6ca7d77676bb31db0358e9c6.npy +04090263-bb46900b4f00ca7292659aea259f7c91.npy +03001627-e22e9f5088838675a72559fc4f86f700.npy +02691156-1435b52348569ce1bd46d022fd7d80aa.npy +02828884-b7c366d9ad90bb8a847d09fbfad470bc.npy +02958343-29b714c4aee36c9d6108f064aff2426d.npy +04379243-df39a8c8b7ce47a25938488ff499d96a.npy +04379243-e94ed46ede91eafa50f1b9873bba60ae.npy +02828884-2d1e8858446d1a32d2b12aa6a0f050b3.npy +02924116-1004ae81238886674d44f5db04bf14b8.npy +02691156-5ea68e6edd123801ad75fc64c51fb188.npy +02828884-e2be5da815f914f22250bf58700b4d8f.npy +03001627-71b1134533fb33f489452a0032ea575.npy +03636649-375c6cce56f3967ed323d15bd4f8b2d.npy +02691156-b9c8536f91ec3bcd3aff44a57f77b39.npy +02954340-6f93656d083e985465bae2cb33eb4baa.npy +02871439-6ebfa572d4501a9b680acf911e95b6a6.npy +03001627-cbe006da89cca7ffd6bab114dd47e3f.npy +03001627-575cb36c87cd4896c5ae524fbf4f75e1.npy +02691156-4a300ea7cbe3ae58a42c49797afd1f5c.npy +02808440-c1b1aeff3537eacd3321831d2245cf06.npy +03759954-c7dc827236dd6d0f67964ba700cd97f5.npy +02933112-ae20b4fa1b552b62614d87bbb5364f6a.npy +04090263-2193f3624198ede23f0af1eceae2dd4.npy +03001627-aa300965dead4fa33f09c790ddd20f8c.npy +02958343-1641efa5c92514d86c4f4dbcda5f2fc0.npy +02924116-dfc6fa5fce5d47cfc42dfacd196ded31.npy +04530566-bea0e3452120318b8c954439655c356e.npy +02828884-5a074a3422d783cbad7b4c3c92e50b84.npy +04379243-14f3de4c23d535e92c528d33bca1ac2.npy +02691156-58d23c8bf0902cc590b1d6deb98feec6.npy +03948459-2db5da73d177fe773ffeeaac0d1e84d4.npy +04256520-a7be35f955f8d45419fb4103277a6b93.npy +04379243-2e7cb2cbfbbb4d002ee19ebe356c2dcb.npy +04099429-c236c7fef78dae828457d30df312d8bf.npy +04530566-66fcc3b9b53e0564d619719db5285416.npy +03211117-fa48bff74086eb8ad69923e104170fc5.npy +03691459-f4308c030df7d027ced68ac20944148.npy +02958343-1f416598fe329a88b1bb46d2556ba67d.npy +02958343-f33b310ba5e68b82becf71e2e014ff6f.npy +03001627-893e3f15f023e9abdba08b82bf5c2f3.npy +04401088-893ed9fc527a8329d3fdfcd95fe3518a.npy +04379243-393d3977af188cd7798c257640d6867.npy +03211117-ac81f325fbc993d3eb42617d0a1c53b.npy +04379243-b3b8817a8b781fce2e4761573669341a.npy +03211117-b0952767eeb21b88e2b075a80e28c81b.npy +03636649-555152a8e9cdbbe41afedc87fe387fe.npy +03642806-3dd1b4cdc6d3b33f676394b063daab40.npy +03928116-4b18f31c04e6d31e76ef7e6bccf9fa31.npy +04468005-88c8695f2796d660dc14ba0818ee5cec.npy +02808440-4a41317b5baa2d52c658b057b1ffe06f.npy +04379243-f17661552a06bf85282d5d529f9dee5b.npy +04379243-824e0f5fd086565a4eee3420590dc822.npy +02933112-8e9a51408589448bc59350d819542ec7.npy +02992529-5ba2137f5131db06219e978e6e16d30b.npy +04379243-edbff6864a97cd6aa1b5ceeca96f6fbc.npy +03001627-aa412e95e1f9c047d9b53420a5458c53.npy +04460130-c2a2b8c3b9884d5095c46bada0d9437f.npy +04379243-8fdb0cce840b2977d0edc2a586731adb.npy +04379243-89bfd0ececc5a00b6e861001bc3826a.npy +02691156-8eeb9f69fc9ef1b0b45fd154bd3b6957.npy +04256520-3a62563bdb750b988b83086412477462.npy +04090263-8fcd6435e32af3f729454b854b87bde8.npy +04379243-b699dcd9de34b5023002761e7a3ba3bd.npy +02958343-692a66739b9ed5e14c88b7369bd6883d.npy +03001627-5d9906be39e2ee012f24668c019c448f.npy +02992529-8ede5d8c00e10a2ff35554ebed2bf2.npy +04379243-e1bdefc225831db150fa82c2f036109a.npy +04379243-43deedd337b00bfcf84b0be7f50940eb.npy +04379243-4fa88f9362f216481b99c25df49800ad.npy +03001627-40567b0166658623b80ea7d1a9683df8.npy +03001627-92e2317fd0d0129bb910025244eec99a.npy +03001627-a20760333defff73d2ef7d159eb54508.npy +02808440-a46408e74eb7430893a9c38d07133147.npy +04379243-3a0bb4b6c7245e0435836c728d324152.npy +03467517-2c2fc56385be92b493f0194265a9746c.npy +02808440-99ee0eaaa7511e2344221bef0fa3c36b.npy +03046257-8d127c73436dba6741ca67b3a986966c.npy +03001627-d7e26a070ee3b35cdf6cfab91d65bb91.npy +03991062-7a931ec996edbfeacb2a965e75be701c.npy +03691459-91d876c2c51a81797ad9e38d6dd6575e.npy +02958343-5dbed4f17ebc271a3aac79fb478fb6b.npy +03636649-4b7ba911d5504501b320860840f0eeef.npy +04379243-5b621e5fe06ebfc7b71f7e05ca67f031.npy +03991062-10433e5bd8fa2a337b00c7b93209c459.npy +02691156-830f3e14a8882ea0f4fb6842b3610149.npy +04379243-15fd9085d9aaa0fa43ed4f51d7ae210f.npy +04401088-75d6dd4112038b8359aa4ad538fd90de.npy +03691459-2d53b9798c7ffe7a6e55c6c7c80df9dd.npy +02828884-cc5d0040931906ae81faebbdea6bd9be.npy +04379243-1fe846f8b74b5fc66b510e987fd42f59.npy +04379243-d1b97ecf63191e19c19a59cdcb309b91.npy +04379243-9b2ee4ca099fdcebb4c161851ed2b4e4.npy +03001627-ea5c19a6ea9b13719fb4103277a6b93.npy +02958343-d9b2fc71e809140bbe40bb45ea25a041.npy +04379243-5aa3a0e7ef40f2d385c2318bffd77ab.npy +03642806-7d9e5d105941adf17dde8647dee63fd8.npy +03928116-96a3da8cbaa34575ca5363ae2c24c8a9.npy +04256520-d255253a4af43b4d4cb1d8db6be39c65.npy +04379243-982e83068fcf2f26a0b169584d4ab1c8.npy +03636649-78dc5a0c38d5aa2fe59f529cd1b6faa8.npy +02691156-cdb17eb7b14c83f225e27d5227712286.npy +03001627-8afad2d7f30c9f02ebeb1e6a8111f53.npy +03046257-46320beb087955da408e862e5daf1757.npy +04330267-298fc1492df14dbc96c91a9093ecb199.npy +02828884-ad9a12cce63df1c9870f22c94729669b.npy +02933112-187f9c840611133b7fa41e06a7f4a88.npy +04256520-3637b0d6db204c0414038d588fd1342f.npy +03467517-8f974059b8ddb17b40dcbf42c0e79c66.npy +02958343-af834c760bf3c75043f0e92e826556b8.npy +03211117-8bd568244e513b09c3a0fa8ea839ee26.npy +03001627-73379ebbbac81af13ee8e30b29f70dfc.npy +03624134-a683ed081504a35e4a9a3a0b87d50a92.npy +04530566-bea93ebc1fa965ab34292139f0435d74.npy +03938244-f3833476297f19c664b3b9b23ddfcbc.npy +03636649-6e268cddf895c20ffcb8d8c6d4df8143.npy +02691156-e841e17e3256acf38699933784576e73.npy +03001627-6a5ee2ac74c81e9d470412e9b69c8933.npy +02871439-b07cf8ae0b87b01ad8c063432abc4bb9.npy +04530566-39b7b83a42af6d83ad0582c282e8474.npy +03593526-76677da63039c6d9e6a735b744b69aa4.npy +04379243-3ea744a70049d4edbd069216df40b64d.npy +03691459-4d74d8c3df7a85051d225d751745cd28.npy +03337140-4a914da1b8325f1fb2029d92310f4aeb.npy +04090263-7eaed6f53420b4ca51cfdb4c9f126c12.npy +04256520-945a038c3e0c46ec19fb4103277a6b93.npy +03636649-a7b9dc38c80e86fbb13604bbce4eb6a8.npy +03001627-e507b4d0aedf8451504721639e19f609.npy +03636649-708aa847cb730f07fcb8d8c6d4df8143.npy +02933112-2bda2392d5715d16c59350d819542ec7.npy +04090263-4344ea073ad91f7ed87c63d8b3018b58.npy +02691156-a799568755357be8a07b3b853565360b.npy +03467517-904838f2757b1534b90a4f86cdfdcadf.npy +04379243-4a3641784a9ecca04fa8d6439169bda4.npy +04379243-8cc6cd529cbd74b5769cf9dd5d8f2768.npy +04090263-8978ffe2b8b770c363e66191800dfc8a.npy +03001627-c65cd2f7588764872b70eac6546e93fd.npy +03636649-6c0b3b0c6bc6eb97862d7667d873e591.npy +03001627-e6c11fed9469141ace8fba09dd640742.npy +03467517-fa82872eb8c9017f343b0b12983b9982.npy +03211117-e46e45f94470b45ad1924b802935a37a.npy +04379243-5e8f470250f92a0f597976c675750537.npy +03001627-19ce953da9aa8065d747a43c11e738e9.npy +03046257-f18450425e69b37b76e9713f57a5fcb6.npy +04379243-894e095c7036c8411933ffef19678834.npy +04530566-c2b394de8407988bb538a15c6737824e.npy +03001627-47c33af88f4926676213fd2f62884e62.npy +03211117-e6585f8ce05ee27cf8bee374511267d3.npy +03001627-f5490bd0c64cd42b9ca5a26dad9fbaa.npy +03001627-49110d0e41bb90b8b8e1b99345a5afd4.npy +03046257-ae570b0ec2b265cd14621506c22882a0.npy +03337140-80f1221d6a11a5dd4c3aee8e9d3a6ffa.npy +04460130-759121663da89b5e7cb17ae4c4c3b9d7.npy +02924116-4273a55343037d40fc319b95010c3346.npy +03790512-90a521e0def2631fd5dde04c96fd8146.npy +04379243-30c88fa790ac14f750d31060ff1b5551.npy +02958343-f045547c7c6e5d0ae74479f4823fa2bd.npy +03642806-f8028a9b5e095caa8051d8192a80578f.npy +04379243-8cb5ae6c0998479a8cbb8bac2032149c.npy +03593526-1c17748268b02c1c8da95317eef6e82a.npy +02924116-98b171ff0df70474ced1f1f28cdae790.npy +02691156-9dbc0aba1311e7b8663e90eaf6b4ca52.npy +04530566-e5ede813e9f07ee4f3e39f2e17005efc.npy +04379243-66517b894b9ea3ffe22ea6d770699e4b.npy +02958343-657ea4181e337213fa7c23b34a0b219.npy +04530566-daa873aacd7960d61d2d2f3b717d35d5.npy +02958343-36ba5d46f034ec58236804c5ee26a2ab.npy +03001627-d02eda9e00688d71d0c63a304a95442d.npy +04379243-1d06d1bc8f10c45ab1732c7d45a02ba0.npy +04330267-44fe1c2abda6a722e793cc5433bece89.npy +04074963-2c6493d31849c15a75f1efca97bee05a.npy +03211117-b6070e5c314eb16033fe3b9714de209e.npy +04379243-a9aac9089791465d30db3da8ce2a0a12.npy +02958343-3ead00eade22d0aeb376886260eb15c1.npy +03211117-3057eaec13a196fd5b244f7c2ed32e73.npy +04530566-3de0aae73a33188ecc8c5a250a07787a.npy +02933112-bfec781e562e1dde3eec26c23f5bc80b.npy +03001627-2bbf00f0c583fd8a4b3c42e318f3affc.npy +02992529-1105c21040f11b4aec5c418afd946fad.npy +04379243-8d0563a9920592d10b3ff08c68acccf.npy +04379243-df5b55da209637624b3c42e318f3affc.npy +03001627-33cd8045bfb42e53dca072a2e97c1839.npy +04379243-82a60a0aaec8d532150d30262f9b49dc.npy +02691156-ff52c059efaca3c1ca8607f540cc62ba.npy +03001627-4e8d8792a3a6390b36b0f2a1430e993a.npy +04090263-5c76d759674869d559db9878902bfe69.npy +02958343-a4aede8e488db95220363e2561dd589a.npy +02933112-6c4fa2f9e7e938a15cc8912051dd9ae3.npy +04468005-f2560eb50ed3fd09d248376edfe1878a.npy +04379243-e97106cc8bd3ef5730bbd4cddd04c77b.npy +04256520-21c071912ffe86fdf564f8e3eeb8449e.npy +02871439-e481fd4e0120f72875ffdbace36c25f8.npy +04530566-704aaee1bba4d220179fa02faff22219.npy +04379243-f4ce170a6abb80b081654cb17c02fd.npy +04379243-d157a0598ef5c33416e09341cb9bfb7.npy +03797390-9ff8400080c77feac2ad6fd1941624c3.npy +03001627-990d8c0c0008081fff2c92c2a4f65876.npy +04401088-bf2f0de18abd3bebdc858d428f2620a3.npy +03001627-c7087db2f1ec6e62acd2bb6205825cb.npy +03642806-79b420b8fdf6a37db747d76ca5db985e.npy +03001627-e5f381dd81cca6a36a348179d243c2c5.npy +02828884-e7a18e21f877b039f4fb4dee5181bee.npy +04379243-ea98f80f4a663d7bdadcd309a90928c9.npy +04090263-55fe2a8c65c9f24424ee6c77dead162b.npy +04256520-b1cfde20b5b0194af91663a74ccd2338.npy +04225987-11aaf89382b3a4de983ec12a2b33f18b.npy +03001627-751b12c6e22386a49a195befe1c2db74.npy +03001627-c0e667218359978d94ba68807fec4bf4.npy +03624134-89c6acb3635f9a85c15cf6e5ad80f2da.npy +02828884-7f6db7a3f529949601104cd2d998272.npy +02828884-ba6348031c6f0a795213cec267286d18.npy +03001627-cf662e6564c5c3c5ce60514f9a637ce.npy +03691459-403649d8cf6b019d5c01f9a624be205a.npy +04379243-7cf228b6fe5c6c596c342cf382162bc7.npy +03928116-613cc0f0663a29cf1ef241de847b5ca2.npy +03642806-1312ea502b4e9b51701c1f58e22b85e8.npy +02992529-27f7ab052f3fce42b35f223cefd97829.npy +02808440-77e53f8e3e624a1cccd0340812259a39.npy +04468005-65bd12f0cc488e76202d683f37bb765b.npy +04256520-4c29dcad235ff80df51f77a6d7299806.npy +04379243-13e19274b358ec867aa3000697a75d55.npy +04379243-4b687008902de4543e3a599e79b43485.npy +04379243-3d8616a9aa4a8c87cba9038a9140d5df.npy +03991062-58916943ab7cf2b4a73e364671ba824.npy +03325088-99e55a6a9ab18d31cc9c4c1909a0f80.npy +04379243-9377b1b5c83bb05ce76bc197b3a3ffc0.npy +02924116-a54664830fb18ba48391de56a6a5b902.npy +04090263-20d48326842d7c601274aa253a241db2.npy +02958343-cb9577139b34703945e8a12904b50643.npy +02958343-88a814d2107f882d3d30c6f269d07627.npy +04379243-13cdbfd56085fc3af51f77a6d7299806.npy +03001627-48ae43c032e9f89737f67f4322e8d3d0.npy +04379243-40b48121d1879be2ee0605a41c3320d6.npy +04379243-6f13be4d995e55b25ed28ed911e69310.npy +02992529-f9418c13ca82fb887f75fa9740df3aa6.npy +02924116-685c9ef95d3e779aeb0efde6945afda8.npy +04530566-327be46d4b15ba2aa79c0870e481d9eb.npy +03001627-6af8d7bfa508b8d23759750e8db40476.npy +03001627-b1f5b155f8e080c765ae658fdfdd758d.npy +03001627-10991b3b01cc6cc99982a4d6320875e.npy +03211117-ed90f61317c3d3598435a9b7d922cf3b.npy +04379243-5d10c947cde5f37f2e7ed79f4f48ff79.npy +03211117-a5c6d3b9945df19dc534b4cdb1fd80d6.npy +03001627-696bafb55dc14fa4638f48a6603fb3ff.npy +04379243-7a415346ab7eb481f8d77b3fd14416e3.npy +02880940-92f04b8d36c98d18221d647283ba1e26.npy +04090263-c514a4eb146d84163a04e41b7ea7de8d.npy +03001627-8e7714615a4b1e6f82390c5f604e0d9b.npy +02958343-19cd3489f05d203f9ed410a010efa019.npy +03211117-21e8d146503b0e72d9651cd1d591d64d.npy +04379243-e2121844a25d93b2c3bd24f986301745.npy +02828884-280553e975d6b79fd2b12aa6a0f050b3.npy +02691156-7b1d4aff088fa3736e0f3d76ecf4a53f.npy +03325088-61a58b21c73a7f7db362845c6edb57fc.npy +04090263-59ac1042dbfeb36e51cfdb4c9f126c12.npy +02958343-846f4ad1db06d8791e0b067dee925db4.npy +02828884-6718a5b3f89a5d8844c3e89e175ff663.npy +04090263-477f00b10a859851abefc916dc2adb50.npy +04401088-27c4bf6a96c6439a86a04ec9e4169973.npy +03636649-6a635b75306512b3fcb8d8c6d4df8143.npy +03593526-badbcf9d64bd24c868c6661a48aa297e.npy +04379243-6e08e7ef76b1c27027f02aaa836b59f6.npy +03691459-46de1dfe54a261b4c7e1f9c70054d66b.npy +03691459-de68b68a234de1a0ea2f8efb8b3faa3.npy +04090263-b5c1dcf4ccc0b8aca74fb613494614a8.npy +03211117-d53e94b52e0cd47f71dd5d95c394249c.npy +03991062-91e6349193ef212d14b9fab7373cf259.npy +02942699-3b5838e660e2eee27f85a81aa54b70ae.npy +02924116-92bf837e546da42abc7f39bf011e847f.npy +02876657-1a7ba1f4c892e2da30711cdbdbc73924.npy +03691459-bfe4ba1b06404e4bae19bd5568e6325.npy +03001627-b2c62e5b20b34fad5844a4d0ab925627.npy +04530566-75991571412e7ce74059b9174ed51649.npy +03001627-cbf829a6c4df229dfebad4f49b26ec52.npy +02924116-a74020b26b3a942a6c2ab21b9089d9eb.npy +03001627-b351e06f5826444c19fb4103277a6b93.npy +04379243-30335a7b507390407689cc8768f5250.npy +03636649-5493cc3e023e9e6ffcb8d8c6d4df8143.npy +04530566-58b6ab987872ed42f36dc23129445ac0.npy +02691156-408af35642971375be13ce34aa7c0c1c.npy +04379243-a3f060a21d7a29bfe5b095b06da9076.npy +03001627-ba9b35c49d861f7f4e994a4c55e56a4f.npy +02958343-3a98adfdc309cca9cec94038e2141ac1.npy +02828884-6a78bd21ec72d396f155d75bbf62b80.npy +02958343-84498085850b19d11673e1c313348a01.npy +02933112-359fbb601801fa9b5588a2543ef0b0b4.npy +04256520-8494a1f6985e8173bcdc50d6b73788ae.npy +02747177-97e3b7b4688c2a93f155d75bbf62b80.npy +03001627-8f1a661dc1048e36297936c81e7f6629.npy +04379243-481e00e4559705c616a2b5862518c93.npy +03001627-51733b725532817ac8687ff9b0b4e4ac.npy +04401088-d79b59ea51a9d80c483afc91de6851e4.npy +04256520-4cb25759388ec29935fd302efa96f6d6.npy +04379243-4aab0e569f1dc3bc8d7e9f13fd8f661d.npy +02933112-a62c9f6091337b5cd5382f3f8f33a9f4.npy +03991062-5d567a0b5b57d8ab8b6558e44187a06e.npy +04330267-2c0c7a289d37157ecd8f3fe9ca2145e1.npy +02691156-69d471ccfdf9e55cace8f9c62f7ef839.npy +02691156-b97446f1c30c0ed7b13143dea57f5eda.npy +02933112-bf57fe6a331137c2abaf316e4a957cb1.npy +03337140-b91dad01a72aaf9f91c352d02061b3f7.npy +02691156-c7c5bb658cafcc7c67711f7c205c5b63.npy +04530566-9d3f9edb3fe0ada39bddaef1ba7e1752.npy +02958343-673ee096916a5440a96c7d9d13cfe9b4.npy +03001627-923bce0b230f5a1a2c919c0510a0815f.npy +03797390-61c10dccfa8e508e2d66cbf6a91063.npy +02876657-807ef57d3d9d13eeccf25325b962dc82.npy +04256520-681f7af0ffc7e220db6d2ff65cc5b310.npy +03636649-8304e6daccb18c2de3855de370260f05.npy +02958343-556ec1ccfcb79f08a7fd25564c2e888e.npy +04256520-1f75847dbddcd34afac76e6fcbdc3631.npy +02691156-a367bcfb5d26801a848c716e284f561f.npy +03636649-1e10f920ed440021cbded0430ad5ccf.npy +02828884-fd38474cc1c62274f155d75bbf62b80.npy +03513137-385480a2554374862cc4218c4be3f082.npy +04256520-89045848f586c0a729404a50338e24e7.npy +02747177-75dbeb01fdc7f265d0a96520c31993ad.npy +02958343-ddc5e41245918030f014feb3e3bb3ace.npy +03211117-27107e057772be0d6b07917e9ad0834a.npy +02691156-f963bac7f45473cdb33bc7516e53285e.npy +04225987-212e0563473156e255483301a044235.npy +02946921-3a7d8f866de1890bab97e834e9ba876c.npy +03991062-47adc9b7d6d281662c528d33bca1ac2.npy +03691459-82b56b6d371031ab7c8813aa71327b73.npy +02876657-5a58f9c3966c1248a7c2417f4b260d59.npy +04379243-c8532b5928b242d29ccce4c6d5bb195f.npy +02691156-bc92b144ec7029782e7c68eb5d1b9123.npy +04530566-3e5e782373516ad760ddc468fe733ed1.npy +03636649-21a4556c02678fd7e59f529cd1b6faa8.npy +02958343-9a556cde3d153c6230e527480f210909.npy +03642806-2416c2fcbae368a7b95c83f902f3aac0.npy +02933112-66a82a157f4a1c9a22e05b27cb30bde.npy +04256520-430d315cdf5b3ca7963845a6a5eacb6c.npy +04256520-c5dd746e08121f8f71a782a4379556c7.npy +04379243-bfb8531870be8be971a782a4379556c7.npy +02691156-dd465efdee6a57e966cf1b4a8fc3914e.npy +04379243-cf9ed2af8cb3085917b431cae0dd70ed.npy +02924116-a0ff4e261a0d8875193d7855ecfc1bd3.npy +02828884-c023275b1a68d6432056b4bd5d870b47.npy +03325088-7b6c6838bc4bd4d33321831d2245cf06.npy +03642806-df624231ef05b83d54c7ab6aa5674ccc.npy +04379243-44d6debd1db8c2e57fb0dc5c3ba15465.npy +02992529-3d5d7e610fc235cbcce71a7ef3de6f04.npy +02691156-41aafedd84a6fa7490baeef8ba5b93e5.npy +02828884-2a45727df039318ea46a4c5f3c2363fa.npy +03001627-c5479437882e03eb282d0900e186958f.npy +04379243-6b1a24847e5b666de3b5d4a92fbfd4bd.npy +04256520-14658bfae450e891b89b974fa14a05a.npy +03991062-d69e25b85eee67d06b99047335b63e1a.npy +04090263-27c9d26c58200a1527be842e82df28b3.npy +02747177-8e09a584fe5fa78deb69804478f9c547.npy +04256520-a731e2ceb44d59e1cbc66df5fc1969c2.npy +02691156-43edf9f02a027ed162f11c7bf54cc1ed.npy +03636649-676ec374028a24db76e29c9c43bc7aa.npy +04256520-71a4f27e4c6fa0a1362d127df6d94eb.npy +04530566-51537c56f71ec82acfd826dd468a5497.npy +02958343-5c997a7c241190937cbd61b2affd051d.npy +04379243-52c72274af4c7e19910979f825490a99.npy +03928116-6060bfa3909185f78ce35a9a4af57797.npy +03636649-f01358d4f45cae23ce670f026edf07e5.npy +04090263-a299aa2fee9a1d297ca8eb6ffcff94f6.npy +03691459-3a7b68f7312c16f1e9bb042b8623f922.npy +04379243-43b0de9be0df3ecf51f77a6d7299806.npy +03691459-704d0b362588638aa249f8489bc060dd.npy +04379243-c0a18b8e41041386e1a698146efec195.npy +02958343-6de0b37d14cc7c7393680c5a9a367b4a.npy +04530566-c0f619a710e4cccd15c8f969616647e5.npy +04256520-c866adf9f2d0bdd9f3598efd14e493d5.npy +03636649-94f9cf8754e2f080fcb8d8c6d4df8143.npy +04256520-77090c15f738bf3079da6431b0766445.npy +02691156-f087be2dec869154acb63dc32be3cb01.npy +02747177-b2e03341b4648a3d63b2acb037dfbcde.npy +03001627-11c8f43ef796e23941e621b1a4bf507f.npy +04379243-25136703ff8fe0a8a27b22aaa3daadd6.npy +04379243-f10f579a973af061fc527605fed20d9c.npy +03691459-6d24eaf8aa3c362fdb6f3ca49e992ad8.npy +02828884-b73da1e1a2f2f549d4d8765e3910f617.npy +02808440-2ae90c52820a705a16af3198c99de08.npy +04256520-dc2b5f9abce70f2b55f9a00acc25f137.npy +04379243-9c62e14436f27b6c457ba044c28858b1.npy +03001627-dfc9e6a84553253ef91663a74ccd2338.npy +03211117-bb5b1f086ec0012d2e80bae93fb41fe8.npy +04379243-f25cf833c2200fef239d0ce9a68d2afa.npy +04530566-75aef09a516f59da49f73a97204d432b.npy +03636649-101d0e7dbd07d8247dfd6bf7196ba84d.npy +02992529-b4795b53530c26c58b13932a0c28e98b.npy +03001627-6124a2bebfa255719fb4103277a6b93.npy +02958343-1fb16b5399a4b3a710bd1697bfc4e3eb.npy +02691156-1818597d398db8f7f1f82f6fc8747b8.npy +03001627-78e1977bc5f0f4041552c6ecbda964b.npy +03948459-429202f8d250310f8a937c1a7380813.npy +02992529-8e3e1213e47661506457f8736d1c9e5d.npy +03001627-c8963b0930306a61781cbff504e4168d.npy +02691156-ccfe789ebc77be87e71a4f02883f26bc.npy +02828884-9a3310c20959245b791985eda7619303.npy +03001627-f12a3ffbe0f8b5076253bf0968762241.npy +03001627-c8938f54fecab41e77cd061c90fcdb44.npy +04530566-aa741f0f7784b791e99164b294d0c671.npy +03001627-584ab19b5df1fe697daabf84de73fb1d.npy +02808440-af1626daddb7a607b805ea9e53402739.npy +04379243-4d14547b54611e9bcf1ee9bc9708f08c.npy +04090263-6bf9cdb0f879a8f894deaa9fff391d41.npy +03928116-44001374b5037d9373a1732868f719ba.npy +04379243-2da4d3085b438b4f35836c728d324152.npy +04256520-a613610e1b9eda601e20309da4bdcbd0.npy +04401088-fa21f65c051ea2577500d68c500fdb4b.npy +04256520-82aee3c5088d005414038d588fd1342f.npy +03624134-88251eef61ac727945fc4bc75aa67159.npy +03325088-f705e6e60a4d9ff576c18e71fd49c4dc.npy +02946921-adaaccc7f642dee1288ef234853f8b4d.npy +03001627-7a8b8bbd24974013327289c00b6dc9ca.npy +04004475-8af6cb411190ba2df20c09ee03883555.npy +03001627-48429b3467c7185060fcaed6cc231482.npy +03636649-967b6aa33d17c109e81edb73cdd34eeb.npy +04401088-7afdaca858bb0a964a28575f3344964.npy +04460130-9024bb81d726d584dfda46c9a34dab22.npy +03642806-5515081bfe708008edf29b343d09db45.npy +04330267-cbe066eb10e871454b3c42e318f3affc.npy +02808440-5395c36e4449a364a0986899fca7913.npy +04379243-1f0c62f30be6f19aa6fc75a75fb8d65e.npy +02808440-bdc71b9efd77276f9f39bedffcf91275.npy +02691156-6d119be1286c7b129a6e43b878d5b335.npy +02958343-296a15d4e4b903db94b42287616a3ea7.npy +02958343-78471673cb8ef99f78ae9714eeb937af.npy +02933112-3d8183c2f6c0003bc59350d819542ec7.npy +02958343-193ec1089f0a98a36518e6cd1fbc5fab.npy +03046257-15ba3509f1dbe068f546596ce7364503.npy +04379243-8a42ddd769a999a9e6942c5426df6055.npy +03001627-e792a2d799d79bc1b249ecc7669d184f.npy +03001627-bd4fb5e30bd993727eaeab1f0c9120b7.npy +03337140-53af35fe75337509bce0d8d171e7e87b.npy +02801938-a91387fd7e02ab1fe1642713fcd8a902.npy +04379243-b19e399e93447dbdd2dd99b484971e89.npy +04379243-760f49288c2691b5b4d1176ea5549480.npy +04379243-2d12d4984230e79a4b3c42e318f3affc.npy +04379243-a56200b624a644f7df6cfab91d65bb91.npy +02818832-2b692b1963908c87a792c81933e4614e.npy +04379243-51d386439cb748c54f2b9e837678be87.npy +04090263-55821f1ee5efcd6280c2e60c312b0f09.npy +03001627-955ee3a20ba242414580ed619ae2daa1.npy +03325088-be6b8a7eeecd8e572101dcac4ed75d3.npy +02958343-1a30678509a1fdfa7fb5267a071ae23a.npy +04530566-337381e4b5c11c4f8c9312de4e9cb8a8.npy +04530566-853edd2a09215d83aad3e4869fb7b555.npy +02933112-6b984c6b1e49d9dc59f8e31ca87c470e.npy +04256520-73379ebbbac81af13ee8e30b29f70dfc.npy +03790512-bae59e64a50d3aa2f68f798d07e007b6.npy +02924116-9348a737cfd5f36f30bc176d97eaf5ed.npy +04090263-47dbdfdcbd971cd2203f35d9b3b48203.npy +04530566-81358250f7b811e73c70f7afafd32393.npy +03001627-be1e5985324b401be92225287f8225f7.npy +04379243-6b43cb708670013d2a475baffed905d.npy +03636649-78c87f00ebe9491e2cd2160e449d45ae.npy +02691156-853dc1e740631bf2ffa79951b9f955a3.npy +03337140-352dee789cb5b1c64c3aee8e9d3a6ffa.npy +03046257-d295c1b6b9d134a65f7f2cf289fe662b.npy +02958343-46adf74e07a86c55e370ad7734071a37.npy +04090263-5de2a57211e47dbd1f56bd5c23e00f1d.npy +04460130-b88387c316d85bf6544a7584e1bfdef4.npy +04256520-1712200bca469561d20e3ea5765d7edb.npy +04090263-11549f435b7454563571d7763ba5a413.npy +04379243-b08dc9e0fd675e6664adc666ed4e2ec1.npy +02876657-d297d1b0e4f0c244f61150ce90be197a.npy +02924116-523033507a9eae1eb77d370c8664bf4c.npy +04004475-ef5296fc06b736d038e6072b52bce43a.npy +04379243-f469759b2790b6cf6c1a170c83f9532f.npy +04401088-170f4eab739637f2a101047bb63a1772.npy +04379243-369b720841edc539611a3acf20a3c963.npy +03001627-8e9812ad9e12d467679c9e94dfb2276d.npy +02958343-5e014eb2bd03daab9fbe97de4a41d527.npy +02808440-a375d94c02f2924b550584dfc8970d11.npy +02828884-2902b377edd4b48aa3a0c1cc16d124ad.npy +02924116-97e9d6aa1011555352470de2774d6099.npy +04530566-6371cc04f48161ec43b0018b6edb5e48.npy +04256520-1b5ae67e2ffb387341fbc1e2da054acb.npy +02958343-8b049c92888475f67c3c6f82a395b347.npy +02958343-9dd5fb440759181035fea498c4ba7c5a.npy +02924116-1582c81bf7dff678d26b2d2076566bb8.npy +04330267-64f6f5a386e63a1d5eb64c1003065596.npy +02828884-dd86f9095341d19af155d75bbf62b80.npy +04379243-b266c6e40c1e976ef3c6b7a01c418f2d.npy +04256520-1b28eabac10276cb7062f2d72cde5c95.npy +04256520-93d943320472c9fc599dcc439b161a52.npy +02958343-ec67edc59aef93d9f5274507f44ab711.npy +04379243-d187561a6b0cbd0acaed5ce7390f30b7.npy +02691156-953baa426dac775bbc8c4428ef1dffc7.npy +03001627-d0500d229baf05b0e83221ad0d21775.npy +03211117-421ad85cbba562878fc3447f3635506f.npy +03211117-198eebeca7243399ca5ca7089655f058.npy +04379243-1dc7f7d076afd0ccf11c3739edd52fa3.npy +03001627-2ae4f1392d44ca24654a275ea978255.npy +03636649-2161683c44a7dc356bd865f153842b49.npy +04379243-35705c4e27888e5d27b31bdeb5f5c79.npy +03636649-5eb0e18b12f4940d6f97b7cf7ff5d41.npy +03001627-45f32105a1d05455bc996a5f03fd7bf5.npy +02992529-ed0f3e1d20fc722bb0478ec258b0ea3d.npy +03691459-5027b6f6c32b0d28daf9b9aae267bea7.npy +04090263-403195be81485468d10b86bd6e8bbc34.npy +02828884-30d3152964e13201520d2a054af1eb24.npy +02958343-86b488c74b27d70ace27281f3b76d1f5.npy +03001627-96a19b41f440040426f59f4497a464fc.npy +03001627-76283716a2c6586e266d673a6188bf4c.npy +04379243-5000e001c72cebf44f60f15da4c665d0.npy +02958343-2fe7e3fc47dad6c7afe1d4530f4c6e24.npy +03001627-37a0959115e6fb4ce7c7920f6a65a54d.npy +02924116-c87efc4c88f58fb3cb1288ccd7a59563.npy +02933112-4e31ddf3828a40f3cd525309aaf63a44.npy +03691459-2034f891fe2d1e79bb51f8b36601764d.npy +03001627-3c408a4ad6d57c3651bc6269fcd1b4c0.npy +02958343-38f403b915d950d3ce8f4a5eeb103d2.npy +03938244-db211dc89ca9e40c29dab95fdd4a19d8.npy +02933112-d7fe270a81b0f21c3fe047712e43e185.npy +04379243-e6a89aaa226b116a60885f79b3a5579a.npy +04379243-45acacde58d7717aaa7cb30470f3273c.npy +04401088-758b9da6bf573838d214322c26aa0cfd.npy +04379243-5a3789ede7e60884e35c5921850b7bf.npy +02958343-30f0ba361010ea11e66cabd11ba41eae.npy +03001627-58a8f29ec056a19f71a782a4379556c7.npy +03211117-dbcc94dbf216e37588bef8ce0a02fc04.npy +02958343-aa9cb692a7ca1070b2d2900ee0ae7e0.npy +02958343-5a841a8269d3560d756e18912340de0e.npy +03001627-87991eba27985f3a417a8f1d2c94eaf6.npy +03467517-feab270427cee00a24eeca91f583600.npy +04401088-d9d06d2772ecc526c0dc3ed657ab97f0.npy +02933112-5294d0d31a33e67912de5317fe5b354f.npy +03211117-b11d7ae45f5a84de8641d137e7c33076.npy +03211117-fdf5375eea4c3858498a04ba00344041.npy +03642806-689667fca044e15b941a99145cf33e72.npy +03337140-ca206dfa66c21cd728b0a3696528436d.npy +02958343-ece361a95a2ede4e629cf5743e29cdb3.npy +02691156-84de1d44d8795d5876817284cd40c7c1.npy +03691459-de5a57d8fce504ced747b49524a1246e.npy +04379243-b70483396e091a75808b6f0b77e3bec3.npy +02958343-c8bd4d0ac34266ffaaa232d0915adae9.npy +04401088-ef2472e661320b03e324fbf60278e45a.npy +02933112-a0beaab9a8c2f0954e7d60def15dcb8b.npy +04379243-90cd6a48cf2789a9b430d97a45d5824.npy +04090263-d81bac8b449807bab7b81b671e901c39.npy +02958343-9c0f4c3c72190a6ebda733a39f84326d.npy +03001627-7fa4db28bd803691c91adfee365fdcaf.npy +03691459-1499859135ccc6b267bde58c681df405.npy +03001627-e4c84068e4c56e53bf8b9d530de7a108.npy +02691156-b07608c9c3962cf4db73445864b72015.npy +04256520-9b88f0839b22b33022fea5173e5c6318.npy +04530566-5e0e9215f91c163d7c513e87d3f6c6c.npy +04379243-3b082e34a78a3c23100d4716c7fbfbed.npy +02992529-e2d49d74845ff0207e1c85c5c15da7fb.npy +04090263-20468faa3d66dce03cfd5b33045bf719.npy +03001627-e00b802d5b93172741052e43309393de.npy +04379243-73157856beb04619eda877ebd51b3abd.npy +04379243-283e5cbc29b92fcc8cbb8bac2032149c.npy +02808440-693b8a150f9e844e50539bb73fa8aaff.npy +02958343-8680d89294724815d9976212be28e1b.npy +03001627-fb858b9e5f2b3e1043dbb6421d614c0d.npy +02958343-49b67421f1aecb54619e733243629008.npy +02992529-8a62ea56cad1ea25430f38f25519fb5.npy +03325088-882d5e269c44830976c18e71fd49c4dc.npy +03642806-13f5cbc78856f977927930e64238782e.npy +04379243-43f2e83d015469c71ba2f806cba87b47.npy +03636649-71090d1b424b4b4b29eb9d04ea723179.npy +02801938-955ee4b78f049d9b5af4278cc885a78f.npy +02691156-3b5b8a2384e8850d185b376619557c95.npy +04256520-8659f0f422096e3d26f6c8b5b75f0ee9.npy +03001627-e6a5c9fdb609d00a5ff6fe84f53e00a5.npy +04379243-bf9df04aea08b0f0f51f77a6d7299806.npy +03467517-62f77c35b213ce976ac47c8f9e87947a.npy +04379243-2b6fd7a94ad69b019ad1212263439f22.npy +02691156-444d67950ff9a4cc1139bebb00fe5be8.npy +04401088-c6ad139da5e0799c712cb59213324f9d.npy +04256520-aa1da8200477456bab610b0c94236463.npy +04256520-a0c9e23365a3516dd60ef9801956a8d9.npy +04379243-ca77f1d8d0151975901e3cd572b4fe52.npy +03001627-932bb63e4525d57b3b8dea4a358cbf0d.npy +03593526-7dcc9324c5c23029bc54d7012755d50c.npy +04256520-2ab2a7cdbd8770318f17764fa642770.npy +02828884-f5f8c8e5d2de751f63b2acb037dfbcde.npy +03636649-853c5ea3c279b9e9f7887b5467c02fc8.npy +04090263-4315071df41d5766a7ebb24c1614411d.npy +04256520-4d33fb26aa7baeef88dcbe86402c7c15.npy +02876657-7bf5bbcff98f3d272561bfd89201eee3.npy +02691156-460f2b6d8f4dc18d565895440030d853.npy +04330267-994e7339a67306d75eb64c1003065596.npy +04530566-b9c516eec45c825979283d5c77809cc1.npy +02691156-e8ceb64406509714e5dcd47593c60221.npy +04379243-a877ec39efb4c8cff37af16b2893f1d4.npy +03211117-b05a54988fb28d20d0b341c1c5648015.npy +02942699-5334cfe15f80099f15ac67104577aee7.npy +02691156-d276954441de1e878a3d2bbe7d58317e.npy +03001627-8bdb589e5e0e7f57b04cb542e2c50eb4.npy +04090263-5f68ccfe85cba73d2a23d93958262ccc.npy +04379243-6b1b63af6ccd71a1b129901f80d24b7b.npy +04530566-2f0acfd47622a8fa419fe456f622e6b2.npy +02924116-294c7bbfbc67edf72232a4c7acb57248.npy +03001627-58867a00409c47c0813a1237d2827540.npy +04379243-35e033efcf79391ef581ec61f9db71f.npy +03991062-990903dc0a1b416681faebbdea6bd9be.npy +03991062-9d7710e65ad393114b3c42e318f3affc.npy +03001627-a7b9f9e341c74b8d57ddce8e42aa6e90.npy +02691156-f59a2be8fd084418bbf3143b1cb6076a.npy +04530566-5e9890e2f4cab96dbc6cd96a5e6546c.npy +03691459-dc8d31790da3b1c6c06fb481fc51ebd6.npy +03636649-3533b9eff82f2f9cf22140029982c6f4.npy +04554684-39e2a2eac45d9ee9961469926610c5fc.npy +03691459-bc547d63373a98997dc4f6934317af74.npy +04379243-deb8b5c0baed637625f61c02205f9a5c.npy +02958343-b30efada80553a1d202258c0423dde73.npy +02924116-7d9109eeba6fa218ceeb72b524f3e0ca.npy +04225987-87115860707b0208813c2f803c03ef9f.npy +02828884-afe3b299132016512056b4bd5d870b47.npy +02958343-37a75534a7a006ffbda733a39f84326d.npy +04256520-9d5815f9ba8f0ddb19fb4103277a6b93.npy +03001627-4c0d8f04f27f96284417bea8868af4d1.npy +03001627-b884ff155c4117a7508dd48e67ad44bc.npy +03046257-70e6d9a58bec336898d5fc0473d00a1c.npy +02958343-e5d6df012b219fa6a7c4dca3ad2d19bf.npy +04090263-157c2b391f7a7dda1a857c47fd0ecdc3.npy +04256520-28e246db6ffc3497384b87f5fc9c7afe.npy +04256520-8b62bb92edcede30886ee1269f93c784.npy +02691156-64dbeac5250de2bfc5d50480246d2c40.npy +02747177-.npy +02958343-70e27da90dec2de49604bf8c981ad1eb.npy +03001627-2de1bd62aef66dc9bf65e1af50b5b7d4.npy +04379243-a90e18bb9bdadf6a6d8b4dad28688a76.npy +02933112-a631a1a99b21cd92b87eaf81a9afbbe.npy +02747177-e91da0c5c59ec4c8cb2a965e75be701c.npy +03046257-6d12c792767c7d46bf3c901830f323db.npy +04530566-368dadba3b837dd926be51fab07b7ec6.npy +04468005-212b58e8aa6ceadc196c433756c6bebf.npy +02691156-7dc614fd957186cf216b327569dd806e.npy +03991062-b00fc3306eab53e0459a1ad9a3821e02.npy +02818832-2b8633b9bdb72ea215dd7d7985e749c1.npy +04004475-90fc6f7b0b84755796348cae6ab0021.npy +03046257-341c76da1822e1793a86a6fba656f58b.npy +03001627-5893038d979ce1bb725c7e2164996f48.npy +03337140-5ce6aa474b597edb4d3a0a56bdd58a7d.npy +04379243-99d03f162477263b22996d48badb33c9.npy +04401088-82aeb34ab6fa282766148e8aa85ea356.npy +02933112-6ab14d89360d0a55ff3ea34d08547895.npy +02691156-72a74e13c2424c19f2b0736dd4d8afe0.npy +03001627-f4a0767a3d7039c38a841ccdc50a763.npy +04379243-aafa8e4293eca14d6bb54533c16c8fa.npy +02933112-87b62cc2f0368983824662341ce2b233.npy +04256520-630d612af74628053b28ebac0b25d03d.npy +04379243-4a4f58b882325236f6e8f2cf4a97051f.npy +03001627-f00c1688bd33aae28cbb8bac2032149c.npy +03991062-7b0e40cc37ff733d4437e0a6aa050dc2.npy +02691156-c91e7b5681d8aeadb81009266e6622c4.npy +02924116-cb39ceab50b3c984bcdd0fb2fc18a716.npy +03001627-268f73b8f57676a71732dfc96352c472.npy +04256520-8426b07a7f599d011a3b39b07e4b3d0f.npy +04379243-5d7631230b4fab707934a0d24a61231.npy +03001627-3d66c60796d59662ea693790a1608aab.npy +03467517-ed1ca9a829715b78a71985b33d2601e3.npy +03001627-f6988e6ca8ed9261492d9da2668ec34c.npy +04090263-f6fceaf62bdb85c05e9786b1603f45c8.npy +03001627-398c1d570b642b6cf91663a74ccd2338.npy +04379243-79ea27001d37617b4f7c5e1744a5e6f5.npy +03938244-ab60bad52d6244db86052e834fbd2c4a.npy +04330267-9bc1d272c82f528376a2788017b16c37.npy +02808440-5841ba7ec3f334dab362845c6edb57fc.npy +03624134-481f304ae81616c54e09ebaf49b0cb2f.npy +03948459-2acea60043da129a5a003776cb72cb3a.npy +03593526-9d1a07991391ecec6b7154919b02cbec.npy +04530566-7e35bae76c10fd7968cdca3005c2cffc.npy +04530566-9798a8da8fb83d63847c4e55bb965ab0.npy +02691156-d5f01e2aa54bbf28ca8607f540cc62ba.npy +03691459-457c7205d3a193c01692dd4d739ce02f.npy +03001627-b13a4df698183bf9afb6676a5cd782b6.npy +02691156-57f30880519c8270e58d21f41272cdad.npy +04379243-30cd6bee25352baed5857f15f877a4e5.npy +03211117-668f2602ee2cd581a312d1c0842a5165.npy +03948459-50fcbde9d69020130a1f1f44ddfeac.npy +04379243-df7f8b7ea0e2c4ee55f46d55537192b6.npy +04530566-782b29db43c02f7442b917ff8145b491.npy +03636649-e5e9ff118631c2a3ee088de33038f12a.npy +02828884-1167fd85d3dc7c8df4fb4dee5181bee.npy +04379243-dc1645a2d2b61e5950794366030f78b.npy +02924116-32cb1cec0bcc12c7c6bf3b18b8ca71a.npy +03790512-49b7ec863c4599aabd1734e75169b9e0.npy +02691156-a26639a06e2ae1ede7d756565593b850.npy +03001627-29656461b26f620ff3c9c1464e55d580.npy +04090263-e59086e0a9bf161b170efd05fec8727.npy +02933112-4b2e20535d3ecd016b7154919b02cbec.npy +04379243-da09745bd5be34b9aaff8bf395bfe94.npy +03691459-a1c80145373d98837dc4f6934317af74.npy +04090263-8456aa006d740061bd8fcb0281cd4d0a.npy +04379243-cc554812025dc498e7ed5b5b11f935c9.npy +02933112-47ffa354257d2e3b20f4d1b537b5ee90.npy +02880940-38d2122b2aa05f92e1b9b7b3765e2bea.npy +04460130-1ebb17d0790e384844e2f9503fe415b5.npy +04379243-2c0b0f0e9ac21f6ca1a2ce4cc65d552c.npy +03001627-9ec08262ef59d69d6412cccabcef91eb.npy +03001627-fa0e922a339bc7dfeb9a9ca952f63e23.npy +03467517-32969766a65974e9e52028751701a83.npy +04379243-69ec86dbd4df85e51ee2805756841071.npy +02828884-988d4a7f08e66aa3d42b9650f19dd425.npy +02958343-6d618b1cbb187baf6c6f7354ef18ac49.npy +02933112-2175d15f93051f0bc59350d819542ec7.npy +04379243-6d4e96c31d1b1f9d16aeb5e4ffcb8813.npy +02871439-bfcced53e67cf63ad80f4eff3307724d.npy +04379243-3dee82c33d65b74a99e8bf807e902261.npy +03636649-f6a7d85ccca5e5e34a6ecce2eeb45768.npy +03001627-4b3ddc244c521f5c6a9ab6fc87e1604e.npy +04379243-f5de3fdb7c073f48dbbc9440457e303e.npy +04379243-fccd86d2aa3c565334aff3344c00890c.npy +04379243-bd12dca2d655a093bda72093f9b5aa73.npy +04530566-f65e78e69d1d5eac465721b273720f4c.npy +04379243-34ec5656afb6860af3c9c1464e55d580.npy +02691156-6509073d1ff37d683d41f76be7f2e91f.npy +03001627-cc8066a5107a2bf5926f2c1927eee8ee.npy +04379243-b15ff00cf3ec4dda14038d588fd1342f.npy +03691459-74d27bf812f4a7d83a2dfdc3f38ea6c3.npy +04379243-ac747a86af391b9548f9d76a105d8448.npy +04379243-c472e242175ecc75dea0c7d7198f1b0c.npy +03636649-8e03bd383d8696a7ccca59c0649ee0d0.npy +02691156-f88906b677e97695f4126163bc622a34.npy +02871439-8eeacd5e91d7f70e9881fc457f8cf42.npy +03325088-50090633b32bb6adb362845c6edb57fc.npy +03593526-bc6d5b787a1672cec8687ff9b0b4e4ac.npy +03211117-8c4a886b6b2c8d94d7f301df5d83f77e.npy +02958343-6d8da7ec9ead6677701c1f58e22b85e8.npy +03636649-53afad2e573b26b141657e31b569b105.npy +02808440-e7f07d51b5261395ede9471c962dd6ba.npy +02924116-3ae82c64c5c9c0b7ab26c897f52b5439.npy +04330267-df78913fe9070bf682b4ca3750aa2fb.npy +04256520-9ab0a81e580dc1f4f008d8a3590fb522.npy +02691156-5515a62182afd357f2b0736dd4d8afe0.npy +04090263-25d950a8c7fcf04b57855ed10703bbe0.npy +03691459-a6453864512f46dd747b49524a1246e.npy +04379243-7efa6d2ff959183c3002761e7a3ba3bd.npy +04090263-581f03521f0253636d75fedffe6398b3.npy +03001627-13990109140043c919fb4103277a6b93.npy +02691156-739c8cadb1db6db39a6e43b878d5b335.npy +04530566-1317defca6e05d78e9fa15608cc1561f.npy +02958343-3c685bf24a135262e88791d6267b8a1a.npy +04379243-6a52c7461aa23233c2e50348f23d3d.npy +04379243-4fde6d734ef8490336d4accc80b34c1b.npy +04256520-e62a984beecfdd9a695c69bb6f9606c8.npy +04460130-aec546edcda7c5abe579ef1e3d185e3c.npy +02876657-dd280525cf000bc3a608634464309a70.npy +02691156-1c673748703c99207f1f82f6fc8747b8.npy +04256520-fdb3ab843f2a244eb9b4a0bf4166f120.npy +03790512-803f90199731098552ee90e577613070.npy +02691156-a68e67e5fa7ae694d9a7daf2d70e57bd.npy +02958343-988108a7536d686824065b218dc1b5b9.npy +04379243-5a38d21dd30f52e972463ee0ec4cc614.npy +04099429-e02e5bc1a52b63523df4fa4547276fc2.npy +04379243-d634c7577c8bc1f0492d9da2668ec34c.npy +04256520-e61751c485c937fa717300ec93e59c63.npy +04379243-bfcff8d45de2f950f751d8c0e5773abb.npy +02828884-557899ea369eedd4cb2a965e75be701c.npy +04256520-fe602b7929307607e59b39f8355b80d.npy +03797390-b4ae56d6638d5338de671f28c83d2dcb.npy +02828884-5dea347d55e0704d1992408f320d16dc.npy +03211117-871dcd6740ed8d2891a7ac029a825f73.npy +02933112-3824d4b03e74afe0743d4e4333af43e6.npy +02992529-bef91c1804ec226e5b1c02ea3a290822.npy +04256520-2528b8f7ad0a177e1491843220e463ea.npy +02747177-6dae7248443fdad9f4fb4dee5181bee.npy +04379243-e6cb8965b985b8a07eec403e4de3e723.npy +04379243-1f8ff48858b1d78136c236fff3cd03ce.npy +03593526-d31eea002a8dbbd744f73d1b4abfedac.npy +03636649-c89d854d5c61e751cdd3c867acb77e12.npy +02880940-709778e5ebb67e32b396efafc0d0d8ac.npy +03636649-bb0ab5c460ddbd65ef3a269219210793.npy +04379243-a9b81cb82f73f249f7248d9dbed7a7b8.npy +02691156-ed73e946a138f3cfbc0909d98a1ff2b4.npy +04379243-5fe3476df92392e1397aad305ec14786.npy +03636649-f41fdea6ec38439193b00be700931140.npy +02876657-d74bc917899133e080c257afea181fa2.npy +04256520-4781d90373fffdcaf9aec59741c69cf7.npy +04090263-46ac5939e2eb53189a3e2fa8a8e389f2.npy +04379243-201833c55354f1a2d1d1bb832a2f0352.npy +02691156-e3c26c3920b93f36eb7fefaef8eada2b.npy +03790512-47054c1839830834a88e8cb97b773125.npy +03001627-2c2fbe0622220e7cf51f77a6d7299806.npy +04256520-22ca96b824795ba8ef188758bf2e3a30.npy +02958343-eb40501934995e1a6560c47a91b4db1.npy +03691459-d80f344b9de3e280610652dddb029059.npy +03001627-b2a658572331c578340a1d09e918e861.npy +02958343-db14f415a203403e2d7d789814cae761.npy +03325088-486fd6e4809c8c59b362845c6edb57fc.npy +03691459-c4ca7f58c6144e1416eb1b6d0ba9133c.npy +02691156-8af46946b9b2b3aacf0820a704ed425d.npy +04379243-7f1019432a168f451512cfcf562674ac.npy +02958343-1a3782ae4bd711b66b418c7d9fedcaa9.npy +04379243-89580ac98637f985c3bd24f986301745.npy +03928116-638cfdad8f5f9e0989964e04888bd74a.npy +04379243-55d2be43d71717e1f4b6538438a0b930.npy +03211117-5a9951b9945e67566d260179aed5cd80.npy +03211117-87882e55a8914e78a3cb15c59bd3ecf2.npy +02924116-38ff0caad9fc3437cce85fd33c4e1aaa.npy +03636649-80e9c1d6499b6a9689ab11a408196888.npy +04379243-99a43717f3487aac63fba60e6c90121a.npy +03642806-fdec2b8af5dd988cef56c22fd326c67.npy +03790512-6921ac96d7bedf7bd5dde04c96fd8146.npy +02958343-cdec84be0cc9364eecfe83f5db813c4f.npy +04401088-234d1646b21fd765ee45e1eced971f52.npy +04256520-1fe1411b6c8097acf008d8a3590fb522.npy +02924116-cc8bc88b246896e92f8244e4db35c973.npy +02691156-7a97d3dadc608b4350f01eb2b12b0a8.npy +02958343-86d5ba5d14672ae7becf71e2e014ff6f.npy +04256520-3af5eddf5022015788dcbe86402c7c15.npy +04225987-36221454034311a4fcaae723fa352fe6.npy +02828884-50612adf11f22931d2b12aa6a0f050b3.npy +03991062-1a1a0794670a2114d6bef0ac9b3a5962.npy +03928116-e3d5f6dbff73a7a5e769f0986786b881.npy +03001627-3db18530ff6bbb50f130e9cdbbb1cf40.npy +04379243-e9d6ce5bdae4462aa187e6150daf1a0.npy +02946921-e8c446c352b84189bc8d62498ee8e85f.npy +04530566-24ce8f07f05d14bfb274bf54d5e89093.npy +02808440-1dc36bb29702c28b3321831d2245cf06.npy +04379243-9d547457c4404412635469b95109803c.npy +04379243-cc8e9d46def8065c5fc367a00ce4b49d.npy +04401088-68189c0fdca1a8744db121a0d72356af.npy +02828884-b3c8573a2d8b0a14c347936f40ef6857.npy +04530566-60ecf4adf9e115f91eff78a25c58572c.npy +04379243-49e0fb5a2318e4c1b0a15036380e635e.npy +02958343-325ce7d1af0e0621221f497d46720397.npy +04530566-3b8c16861667747fcfea3d4fc15719ea.npy +02828884-273c618c2d24a562ad5067eac75a07f7.npy +03001627-b7aabc0069ea63e096d5fa1ee6ada8d1.npy +04256520-5e0fa460af0e5e898223ee0bdd50697.npy +02924116-acdd5984ea1c11d3d687ba8afc125512.npy +04090263-5ffa1a012a2b18fc83b41d2cfd151bad.npy +03691459-10e079ff34f99777bcb3fc1376c3a85d.npy +02747177-889768abe1e56957769df73d7c60d904.npy +02924116-4ece51cc1786dd0a7a49a4f3f2ced32.npy +02871439-a392e8e541daf1d9b33454de94308f9d.npy +03001627-5ac8b44ff77e5490c8687ff9b0b4e4ac.npy +03211117-14add565ff90153855f9913e822d5318.npy +03636649-dc6c499e71d04971d22730b0728b2fc9.npy +02843684-b4449f8b823bdba634e9af37b2b44021.npy +04379243-5c8668d215fd79079a037b4abf810691.npy +04256520-523516236632fbc8c799384bc2c5517c.npy +03797390-e984fd7e97c2be347eaeab1f0c9120b7.npy +03624134-7cfcd09e09a697f3d870ada59aadeb87.npy +02871439-28af0f5a5e055917b52c730840dc727f.npy +04256520-26d36969b0ef62b1c2c449c0c0579ec3.npy +02933112-9460ebcbd28a8cb7d5a4a04ac21f0578.npy +02958343-7c7e5b4fa56d8ed654b40bc735c6fdf6.npy +03636649-6ccb43088eda061dbfc838749f053cf9.npy +03001627-413a7b8c5de6dd4ebb7b779fe99ae983.npy +04256520-776e86412e7f3c6dffb78a7278f8e374.npy +04090263-f955bfc9ff0d300cbd2411bccc731f79.npy +04379243-c8662ebf433759bd4bcc3951a8858950.npy +03467517-b2f7148aedd45f2e48067bd564571c7d.npy +02958343-31998170afc1a0b9d13bda570aea1f6d.npy +03642806-519e98268bee56dddbb1de10c9529bf7.npy +03001627-bfc6b2328c9c12bf283b00891f680579.npy +02828884-7b17313f2c00178b2a4d67a8ec314d2a.npy +04401088-a53b3ac989d9e6f35f8a15a7cb97bf7a.npy +04530566-49665c3dca5441d77c0ab7347b9e831a.npy +04530566-72d110284cdf597e68b6f3ae18faf6b7.npy +03991062-ddabcd35f817876272d7be5a06d0679f.npy +04379243-bf3b3076b1f43b8a855931d119219022.npy +02933112-5217e7aa71d06df2921dd903dd0b8b17.npy +02876657-948e374b08979da230612f5c0ef21eb8.npy +02958343-d9deccd1a5dcd5d1b7ad70a0cfa5f7b6.npy +04256520-8aa7651cbe3651d64af957103f4767ac.npy +02808440-68f9ebf8529d567ab362845c6edb57fc.npy +03642806-fd54faba3bd95b6d6d59d46ccb8deb56.npy +03467517-590110ef2859bc70a3063540dfdfeebd.npy +02958343-e95d4b7aa9617eb05c58fd6a60e080a.npy +02933112-3332c4ac1fd931d01586ac387fea1cf9.npy +02958343-17600a4881b1ff6a5c14de0cb75f4d3e.npy +02958343-51048ab1eeca5e8dee79ed7216eaef91.npy +02933112-11ee3844cf96c7194da5feafe6f1c8fc.npy +04530566-aca0172e1b301b8b60c68a106ad561fd.npy +02958343-298e8c0d9ce547b4e1e2aee44e822aa9.npy +03001627-f73dde8df5d0e5c7f91663a74ccd2338.npy +03691459-52e710a9bb750e3235cd53a06b1d2317.npy +04090263-596c401bf2ea21e55e9786b1603f45c8.npy +03991062-bcc3ae4de443d29b1b70317901324056.npy +03636649-a0963082bcabc46b762a4fefad9c8461.npy +02691156-f8f4cccabf7ac33b199dff268d0aba38.npy +02828884-2830e62e4c5fc707f155d75bbf62b80.npy +03636649-1c6701a695ba1b8228eb8d149efa4062.npy +03001627-bd7566c32259e41b4c161851ed2b4e4.npy +03001627-4e5c18c87a10f050e7469a3f8248f48.npy +02958343-1e6e7bfb08b6b44d615949fb78ffe44f.npy +04530566-fddb69f72a853e2f8ff5243f1df2529.npy +03001627-44b0b359d2eab610c2a3b7c9bad24907.npy +04379243-827af0ff0d9eaad196a3517f50eeb9f4.npy +04090263-71d9d636a30ed1e7d6a22172ba0f0af7.npy +02924116-1aeac7d5572ece389cec6ee5e26b0519.npy +02828884-7f7956f11a1fdfd0d81202a54291c0af.npy +03948459-f3f6678898938575575e33965575974.npy +03991062-486eb0ed2f97b9fcffc6e457221b9271.npy +02958343-797804cd4594553156b22cefbc2dcb87.npy +03636649-ea5ae3cfd142c3b923f93f957094a824.npy +03624134-9c7caa0ce8694300ab448fe46134225e.npy +04379243-30e12322c7e23ac358db0ef36af1d3c5.npy +02992529-5cf5bbb8f745033195c9a4bc0e92777e.npy +04256520-724ee53f18ea8e77cc166099a6fe7573.npy +03046257-108b7ee0ca90a60cdb98a62365dd8bc1.npy +04379243-18be1556eb4da5af7ccf848ce05c84be.npy +03642806-7bdac195f81588ff743bd44138e7d2e5.npy +03211117-75617d66e4d82ea2318461dc09ee739c.npy +02828884-b1adfb9857fc98fc28fbd1dd69384cf9.npy +02933112-73c2405d760e35adf51f77a6d7299806.npy +02691156-db0c0fc7ce05d372311e3590f044c241.npy +02958343-fc1840952ac878c99b63159808b36877.npy +02691156-f1210d8f895e40b663c15773e7567372.npy +03001627-6abdb0b46d2a3fd02813aa30be7ebdbc.npy +02933112-140c308db70cd2674da5feafe6f1c8fc.npy +04379243-57754ca0ec4fce12990d726e600161b7.npy +02691156-521b82ced564aa2c8ee17de2c75c8e96.npy +03593526-f84313fa79e1bbd3d826e39f6130227f.npy +04379243-d3c31829b1295d0abf22a5ca4fa4678e.npy +02828884-531658856a6347b1f4b6538438a0b930.npy +02818832-bf6bc80cb11e131362cc0ece5cfe0d88.npy +04379243-e0e00d2012c4306117fcdb9c02a9e950.npy +04090263-5de8bdd7f586399ee0685d22b2927984.npy +02958343-d21ffd4838ff2ca75a30f4aa03635c5a.npy +02880940-5b6d840652f0050061d624c546a68fec.npy +03593526-6e97b8fd720790455ca1f314f1afc186.npy +03790512-c1acd4ce749a46a6dc2693ab94b1f3be.npy +04379243-3fcea883442d7e5bc0f947750540fb22.npy +04379243-3f9b11fdf6d5aa3d9c75eb4326997fae.npy +03001627-a9ee7abdaba4ed6c14817c31e6492a06.npy +04401088-692e46bc27bcdcebbdc2330c91f5a859.npy +04379243-69d4ba3043aee963dc2bc8a782be94b8.npy +02691156-4ee420a617a2bb40bd4fd4a5b9107dc4.npy +02691156-f13827d156628467b4cdad9a5bf52dd5.npy +03467517-a7f449a1f2cd1f1693f0194265a9746c.npy +02828884-5a383d9a0e67caed4ea8cb420cbb292f.npy +02992529-69b74f6c66dc2adf5a627be422951096.npy +03001627-295a3bb2aa43b691ed2d43425218e827.npy +02958343-98316f2e772d60587e5e3333f4cc9f83.npy +02691156-f2975fde05d9d63eeea0c0561850e04e.npy +03001627-47a661b489119b764b3c42e318f3affc.npy +02691156-ecd19c1f74064962c6603e997b54421a.npy +04256520-c80c48b901ad94effebad4f49b26ec52.npy +03001627-86a25532f255728fdaeb838d0771f3b5.npy +04256520-3bc7d4d59503cc92c1a25f36f85c3fd6.npy +02876657-8f2b8d281413a8bd5b326e4735ab9003.npy +04379243-ed45493414f9214687694c57464ff1e3.npy +04379243-41283ae87a29fbbe76bc197b3a3ffc0.npy +03001627-ff9b59e29b547dd504721639e19f609.npy +03001627-7238d2ade707fd1e6c63b8b48495261a.npy +03001627-2acc2a87aef7cc559ca96b2737246fca.npy +03001627-afbd7d1e68be93ac35836c728d324152.npy +02933112-c5212968cd5ef1dc3c6e7539caf3791c.npy +03636649-60697ef538d1372f5bc104fbace43d56.npy +02691156-98c0c90dcce8f9ee3ba77af508a192c0.npy +03991062-f1dfb16470f5c7e22553e89eb4de13bf.npy +04401088-fecfbab790d979a25d560b84ad8d9e87.npy +04256520-aadc03f6499b5ec5b60747861a92b009.npy +03467517-86088a6aadd3e08963e148e250c0340d.npy +03593526-cb9b25b587bad917e6085a0a38e2f255.npy +02958343-7825218160564f137039b7b9eba2e0f7.npy +02933112-d410c925c5e8ebd65b7f630bf166b499.npy +02828884-a4c8d232f7943e61af8dca8fa046a737.npy +03593526-d3e31e11258926104d38ef17af2f7d70.npy +03636649-f1cc6b6fa75bd67ff51f77a6d7299806.npy +03001627-e56087cd55cce8b4f41a4361d0ca9bc8.npy +02691156-48cb2de06f46cde25ed29e0a9f14425.npy +04530566-9c4d83025107322b2aed6a9a322ced74.npy +02691156-e4bdcd6baad501ab2a8b9d468136b0a1.npy +03001627-df59c2ab638e5bf47c4b9c3e153dc1c0.npy +03001627-ba3b1064eddca7212d19175e7d19b7cb.npy +04530566-31f7c298ea24bb99847c4e55bb965ab0.npy +04379243-f73d62321bd0a5b7d42ec7e303174a87.npy +02828884-4fb9527f357f37f99dac46bde4c69ef2.npy +04004475-71bc31bea1c38cc22e90f5e9b0ad48f4.npy +04256520-b16b22f49cfd1d2541dc8e09670d2b5d.npy +04379243-82f5867145f64346a9cf1782d21bd9ca.npy +03691459-a88fabb4286706afbb9b205a4c97698a.npy +04379243-bd4662a53f8efdd955f46d55537192b6.npy +04530566-5b6044746e12fb6733b68f5ec4e8a690.npy +03636649-9af0807b146c564a45c4ecb2f4b73702.npy +04379243-72cc0fe296b9172617271868b642acd3.npy +02992529-a523f6e5662f8f178ddf0e44d13d17e3.npy +03211117-dede15a6e1d27b9bd2458bf307c1dd72.npy +03636649-e1fe4f81f074abc3e6597d391ab6fcc1.npy +03001627-f3e50f6d0b7b293035836c728d324152.npy +03467517-13c12d297a29357919179b9e5a0c010c.npy +03001627-5b1d0dad82acd6e5893104fdda835c64.npy +04256520-2fbf971de875a1277df50de84a56e505.npy +03636649-b54f6d30b6edd7f1579cea75b38cb7ce.npy +02871439-a96c3d0ab048b72d1e678557cfa9c9cf.npy +04090263-87dfac7fdf6e81bacbc6ff5546f4ec42.npy +03001627-9527b62eaae8f007259ae7b2899be714.npy +03337140-3a40cea19ff1dea4ce5d6e9371bb5c33.npy +02924116-5271016b64559e2141cefd10ce5d6cc0.npy +04256520-f98615e51a596fc5c05575120a46cd3b.npy +03211117-cfe8df98fcd4964d9d58cf21d5faaa2c.npy +03991062-70a30729c23aa5ab5425a71c247ca5d1.npy +02958343-88a476c48a4cb5e72d0c578824da8af5.npy +04379243-c547a17e35360322fd6501c4dd41b22d.npy +04379243-ade4f7281cc55e016fad58965decd164.npy +02691156-41c7470ce9ecb74b6f9423fcc87803f2.npy +04099429-b66ae0c5ca74decf613bdc6883aa3f40.npy +02691156-5ac00867c7d78b1690b1d6deb98feec6.npy +04379243-ea3bcd9e6c4205031964126395b17c2a.npy +04256520-40cdebefbd3bc2634c7384dbb75cab0d.npy +03001627-a09a88c11d0b27368821ad3452f1c8c9.npy +04090263-e0513d1ceaac23ad341b8a806253912c.npy +04090263-fccd8e7b6bb1a6eea1ce1dd4c7e01188.npy +03001627-4178fab56c04a32ae8f8c11a24c52ebb.npy +02691156-d9eaf9c7d58279dc9a6e43b878d5b335.npy +04256520-22b11483d6a2461814038d588fd1342f.npy +03001627-811c349efc40c6feaf288f952624966.npy +02958343-532070461b869aa7468dbcd58a793b1.npy +03991062-7aef12ad7f602053d4d8765e3910f617.npy +02691156-c1c341e597c01d3814a46d7ec44fc258.npy +04379243-2367a0e01767df36dc40b058754deaf8.npy +03636649-a1f602d18e9c0f06733c22d8b8e1c33d.npy +04530566-6313352481b445a8ecbbed03ea2b4cdc.npy +03211117-dac4f4f039a9467f46d83d16be057f3e.npy +04090263-a262b6955756cbea34250dfcf5a9a6d5.npy +03710193-a1fd2eb471c5b5345a3d5de8976cd08.npy +04379243-e7c8486921138d5c7ff6ace05b36a5.npy +03928116-6a0839a9bd3c10b7f2c5403cbf111281.npy +03211117-a536c6a5f1a118feac653254a68e1397.npy +04090263-58e1eb81bae67052c79f92df566f8c6b.npy +04379243-161be2d2421c18154e61d5e9018b6ba9.npy +02828884-77fd0def3c3469adf155d75bbf62b80.npy +04256520-d6d69d04e3c34465e9fa215d22832290.npy +02958343-307e83044ed81f6c473f10e6caaeca56.npy +04256520-cb643270a86e8fcc19fb4103277a6b93.npy +04379243-60c0cb7599fddb50d3d709dbfce9caca.npy +02933112-1fd36ae1d93b6f3fc59350d819542ec7.npy +02691156-611c65a9a9099c6121e570d3da54bf9d.npy +02808440-b450fdd06d466db83321831d2245cf06.npy +03001627-80e45b0a5fc1d3ed68bbb8e471856979.npy +03325088-9b68d5578e58f8c46d0157e3e7a8917c.npy +02880940-be8a2f8460a963426a6acc5f155f864.npy +02933112-3e858a898accc14132f8567794723a79.npy +03467517-e3f45b5945315a939526648647837830.npy +03325088-227084bd966b704d50da8b99982a3057.npy +03642806-6a9cffdd120720a6512143cd347a4650.npy +04379243-ced7d80d220dca01ce5b275ea2158e2.npy +02924116-5eecd4415ae176b6c6bf3b18b8ca71a.npy +02691156-cccf4d96e0e3d728c93b40751084c22.npy +04256520-882d5d8f49e52e81a53276bbe109327a.npy +04090263-32d410088758f9bb89dcfda443251892.npy +03642806-56517e22979b563460ac9d6174947ab2.npy +04379243-523ac3575244c7f3a130bbab7337a0cf.npy +03642806-cb6ae19022733ef1956ad4a5a9b8400c.npy +04379243-c31fb1b1dc95160d8f893d87da13e049.npy +03642806-cc0535a34cdc7d676bf98d15712168f.npy +02691156-a5cd14be786fc8175e9e2656aff7dd5b.npy +04090263-12ad493bc65380df1ec84866750af1e6.npy +02933112-b399f7819e05c8bd492d9da2668ec34c.npy +03001627-21e0ce3ed3e9452c93271d2223fe04be.npy +04330267-58caa0426be5f71f41965be83b7745a.npy +03046257-f7f1df271259f793ba0661808286ba45.npy +02958343-5503658520e08b519b58a6529594c9d.npy +03325088-92637cff21142487d84d1b7b18d6e7c7.npy +02691156-657439efe649f57f47f8deec944763f7.npy +04401088-f6679591247bc328afb07a946d621b3c.npy +04379243-b62798e1d1075115e870ecf4c364a4c9.npy +04401088-dacb3f6f6b0cc7a52b1abd641c06dcad.npy +04256520-5f5c4e66f07fc2695c0be177939e290.npy +04379243-a342324aeff75ec7983d269bb8e4ede9.npy +03001627-a4d7c8b97066cb74f63e8e405d49b8ce.npy +04379243-80e1d8c228dced88ba6d62b5b05dcbc0.npy +04379243-fe20b0cb9c6a922d58df8eeaf3dad1c.npy +03991062-6ba49cb9ef1992a2a2c59a4d90e63212.npy +02958343-445185842d893b6978fe949fc1419876.npy +02691156-29fd29045703ff18b4a8b7176ed97248.npy +04090263-ab379b3916c45a78710c119014476e8f.npy +03001627-2c4d7d33ecb486532569827d39fc0af3.npy +04256520-7ab86358957e386d76de5cade2fd5247.npy +02933112-8cf41a94663c7fe24da5feafe6f1c8fc.npy +03211117-9ff60c2ab8d5a15abad8372756ee3232.npy +03001627-bd1787066323c7a64424fc4d3c9cb157.npy +02958343-dc3c6748e5f96cee9b3f352e6fa9112e.npy +03691459-d1274fdcd4f8a611fe10244ee697dc96.npy +03636649-d385523f0cd93d48d6084fb53091249.npy +03938244-24b7f744e060522993450a6db2a946b4.npy +04256520-7d71922494b8788ce10ddc5f810dd417.npy +03001627-8d1616ada1d6f239d1f4836ba5ad2863.npy +04090263-39eb4b7bb1d93d94437724fec373d206.npy +02691156-51c0b132806335051592a2f89cfd307e.npy +02871439-5793619650b38e335acd449a2ae99009.npy +04379243-fe4984dbd32e69eca4ba22b64b537bba.npy +04379243-214e9b1346a498c0f51f77a6d7299806.npy +04379243-68bdc363716f181c61b4bfc684868124.npy +03467517-d37d82695b935e59d57700c05b1862d8.npy +02828884-27fd962813feeb26be25fbd47cafc694.npy +04379243-11fcb3abf0a487b9c3bd24f986301745.npy +04256520-964887dfda95963fb0957d845ac33749.npy +03636649-ce8a14614b85a8fbfcb8d8c6d4df8143.npy +02958343-7434c137695be0eaf691355a196da5f.npy +04379243-a3d5d0122b01f7be62a280769c3934a3.npy +04379243-e02925509615eb5a4eaf5bbf36d243d4.npy +02691156-8996445c6d2407c0fb5c1b0f759e2bc1.npy +02992529-1727e7aeb3d159a57f521a3dcd28e9d2.npy +04530566-a88f4ec8440e412c92336765b86c93d9.npy +04090263-1205174a90e130bf595b6fcb838bee85.npy +04090263-41c55010eb7ab373a4dd752ddde80fb1.npy +04379243-9f7a8670a87dbde9b50d0c6a0c254040.npy +04379243-f741f1bb6a7ef8ff7916bf6f8da94ee5.npy +03636649-3a0edfd418e020b97f32712aef0efc5a.npy +03001627-26638126794a48d9b0957d845ac33749.npy +04090263-7ccf43d35755a35976ad064d1c5fdd7c.npy +02691156-f9589c9b900fd33ef23c3116d040903f.npy +04379243-780799646ab0a19b589fc18f8d1e43a.npy +04256520-63484c8326f8fe73cb922bcc33df0268.npy +02691156-2d43bb802a8faf0bce15d210eb57e565.npy +03593526-1febe89e0336d5bcee106795de609335.npy +04379243-5689abd8ba685b3e72075e8b19ae0485.npy +03001627-280fe2696faf0f3a53e14f34c202d656.npy +03001627-5e706e87ca60bd19ecb01bc908e8cea6.npy +04401088-e2784eee13f340f2195cb740f5da17ea.npy +03642806-6103fd8c11413be975e42c1faa1148bb.npy +04256520-fb88e94765c2b3e9f16b2a6e0465cbb7.npy +04379243-b08e0a90b1bd3f0879492e1986fdc4e.npy +04379243-e88b21faa1d937f3695cf5feae151847.npy +04379243-32d06518fd07df9bcf004563556ddb36.npy +03642806-9f4a0de5fb60ca3e1ec0c47eb137bcb.npy +02691156-5d2f0bdbd08be6fa3105bdad0abb9e24.npy +04379243-14ae5631e7dfa10430bbd4cddd04c77b.npy +03001627-c04c13649c4cbc5ebed0f345f50b6a5.npy +03001627-2892ab19f2d3a88a3ee8e30b29f70dfc.npy +03691459-de5ecf353cace18574b0aadaa58fdcf7.npy +03467517-a628f408f1062c0649788b38f0ff60f2.npy +04090263-c1d5a68f196d647fb5070c7ac310bcbc.npy +02691156-b45e5b92bb4623ff151f2df200a24ac.npy +04379243-45722fed3a3035fc59f8e31ca87c470e.npy +03593526-de61c6f2300249f45dc9e54641a3f5bb.npy +02747177-af8ae2bd4ec21bfe63b2acb037dfbcde.npy +03001627-5e2003b18752e5f82f809039658ca52.npy +04090263-ea2d9117c341df9377b7d0d4764c121d.npy +02933112-d88116de5721301298fc1d0403f6ad0.npy +03691459-7e3e0b648aff4aeb6a6d1e86c6266511.npy +04379243-e1581daad0ddbbe4465d230735fb8831.npy +02958343-2ccaaa66525d7f095473e57e894e0ef5.npy +02958343-2262d8b1d5fc79b67211919686015200.npy +04256520-9af15fd5baed25b64b3c42e318f3affc.npy +04401088-cfeec23a9ea66a5021844676433a0aca.npy +04090263-281790c93c1f8876972d2a72136fdc80.npy +03325088-3dccc5e096aa99e4fe2ecb70903654e9.npy +03991062-2a7d62b731a04f5fa54b9afa882a89ed.npy +02958343-a6a1c91c92f86c463a93df79ef2b80ef.npy +02808440-f7c8d4e57a30918944221bef0fa3c36b.npy +03207941-14e9d064fe9d247127787a85c3bfabc6.npy +03636649-e4258a09db0c03bc97bc1a2d2578970d.npy +04379243-5cf6612712d8ad26c5c86021644af7b5.npy +02933112-5b08e72cfe785f4912de5317fe5b354f.npy +02691156-879a8f69cd931fe9f64801ad2940cdd5.npy +04530566-d5f0a8785afc39120dfe072b77502f8.npy +04256520-374fe2584abb594da094848ea4d06501.npy +02691156-edd9f45c7c927032db5e5b1ef1010d8b.npy +04379243-1d98ebfb72120470283b00891f680579.npy +04379243-d1611599e3dad7292f4c88fd91c6b1b.npy +02828884-7c33a6f55768b7acb97ad864945165a1.npy +03691459-5a59e8590b3f12580275d4a88484513.npy +02924116-ee672a58bf542ea464bcef064272eebc.npy +04379243-98108861d6d5235017b431cae0dd70ed.npy +04379243-739a97e0e3c446c15255bb0d3c16575.npy +04379243-7a8653592db2dea36518d4b6acd71be6.npy +04090263-72e4b314e45d67bdf371f38ed06fa82a.npy +04379243-9c510bfa2304c78480cd53d4e54e1fe.npy +03790512-7b4eb8cbc470d0d6d5dde04c96fd8146.npy +02828884-fbf16da56e709e422056b4bd5d870b47.npy +03211117-184a3f58220427c39fd28cfa9e6e405f.npy +04379243-90b0880e3c85c133cf7ff48fd8d30a70.npy +02691156-76788a2758e938f435fc197bbabcd5bd.npy +03001627-38732a2b4c03e7a8b7a8bf5e3604ae72.npy +02933112-444ff46c1275b83fefead98a255f706f.npy +02828884-1b9ddee986099bb78880edc6251fa529.npy +04379243-c712261a32a0efca4b3c42e318f3affc.npy +03593526-b828d1859065e0e4cdc03f207b7c6c79.npy +03001627-f1a1c9f231d2db078a8a3348259a374.npy +04256520-771a9729f19fcac4bbc7a6acbd8f058b.npy +04530566-5da7daeff2b24f23206066da291e8981.npy +02828884-5ee7a51ae38eda6b26b7fce5a7fdd285.npy +03991062-dab9d3c4afc644764732d159b629c6ab.npy +04379243-641f479a3b90e659282c910029b5cf54.npy +04379243-339b9707363c16d895341c0dcefceb68.npy +04379243-608ea98ce4a80a61aed393947b9cb125.npy +02828884-c20409a88bc98bc8ad5067eac75a07f7.npy +04530566-19b29e973ad05c71e0a1fe48a8d148cb.npy +04379243-22a67cefe94bd5eedb402a46aa8f1779.npy +04256520-a053322861de88a21725b4111480fea8.npy +03001627-b34b1a7cd8b645829d0103304b799f18.npy +03691459-24e25e63d6871f884358473f5b9be205.npy +03642806-7da4f6dcda3fc40db1ef4670cf6c2a91.npy +03467517-5df08ba7af60e7bfe72db292d4e13056.npy +02924116-d68a726ced8cd11848c6282fee705e22.npy +02818832-ab9e57b316f43962b738ef7a6757633a.npy +04090263-ff84eb89a2c7e1b55cd168ffead8840c.npy +02691156-53011f6c40df3d7b4f95630cc18536e0.npy +03001627-3aab16309520fb21dc0a8cba62d9a78a.npy +03636649-58e0f2ca80931a77e99f6f079f038d.npy +04379243-ba3120844f785a1430730ba8faffbad9.npy +02747177-f2c7e1b8112282dbcb2a965e75be701c.npy +04379243-b8411c6434b79e59d6686dc2df08cca5.npy +04379243-c27a1c6a26642c907ecc778b34d42f32.npy +03001627-1d9bc60209572861473f10e6caaeca56.npy +02924116-cfcf79d337e79438c98c13d6112727de.npy +03948459-cb4b38a0535101f2a39dc4a567ce225f.npy +04530566-efd174efe9130399be7ca2216dc1576a.npy +02801938-133d74f10a0401317773da01b1ba21ef.npy +04379243-b3cadc82852f5f5381901288eaf14401.npy +02691156-3948ac8a29ae42c761f027f2a55df6ea.npy +04256520-65c32eacefa3f4fe2058afcc28d23393.npy +03593526-1a01c2d7705193b4917cb569753af492.npy +03991062-d0537f977c7442aa2e51995ed62a7d39.npy +02691156-8277c0294461b76e8405970680284869.npy +03261776-e33d6e8e39a75268957b6a4f3924d982.npy +04090263-f0cdfecc69f4beb7fd434dfa483c57fa.npy +03691459-f7366c0025b2eaabf5fb60584950565b.npy +04401088-93d617cb7bf7558671fd17a89eb6aa70.npy +04379243-7eafe1321f7d566c9654713ddaad32c7.npy +02992529-88c64c14d4b6ae5aa7636d58d56f8570.npy +02828884-1ebdf871b03ae445f4b6538438a0b930.npy +02691156-db5fa6a73bbe6d35ca8607f540cc62ba.npy +02958343-eec2ea5ac4e048836a2345809e2bb169.npy +03642806-8834560018510194d8caaf6298f89d14.npy +03001627-7ee09fdece7d9142afdb9a672b7d3b8a.npy +03001627-5bdcd3d77e1c91f78e437a27fb25efdf.npy +02958343-da59928c982bc34a2a9eb0f146e94477.npy +02958343-ca6baf5768bc105ace827f20895c88ad.npy +04256520-470bc951c8b9bb5b4ea6967a5607d572.npy +03001627-a8e5e4016c44f896b1b3c8adf02d88.npy +03636649-a37695d83a39adb52866fbd701f50f71.npy +04530566-4ce56405f7f67d3c38cd6a6c9620e96d.npy +02924116-e311aaea6c2662e7193d7855ecfc1bd3.npy +03001627-e8fcc8054e445a0c20768660cf080d12.npy +04379243-c3732b612ee72d7f1071105723d4cf63.npy +03001627-7e7f1989e852eb41352fc7e973ba7787.npy +02933112-8f39d603e733eb58fcbe4e14ff0c4707.npy +03001627-6731a24561fe44839b92627dbcf8ae26.npy +04379243-910db4c45df40b67d3e19c2bbe0ed38c.npy +02933112-c7418e21982dcb508c2f9e4176bfe555.npy +02958343-3ef364afe692557edd344a2b29517bb.npy +04401088-e2ffd39f88dc381c3455cac94a339dea.npy +02933112-be1978696eddc1e980a88936375f2ef4.npy +04468005-44fa6c544b0e67ac4c4a58bade1fd64d.npy +03467517-4614d233c54498408f3f9a4bccfe246c.npy +02691156-2c3df6a4d0ddc9a69725372054c2f091.npy +03001627-9b6f17ce2db29c4c9ae35d137ece64f9.npy +03001627-e59cc0fed1520985b21bc3cf138f79e.npy +02691156-fa27e66018f82cf6e549ab640f51dca9.npy +03211117-d206f9b91dbe5693cc5743e8d662956.npy +03001627-f8c5604f39699e0fbbc2b2aef664ba29.npy +02933112-ac7935b217aeb58e19ca41cdb396f36.npy +02958343-4cecc9df9c777804816bd8f64e08b2bc.npy +02808440-8e22e5984d5149c835e1d1ee0e46a9dd.npy +02958343-ea58938dca17f3853c9cf79df3851b10.npy +03001627-11d4f2a09184ec972b9f810ad7f5cbd2.npy +04468005-bfcea023feb6fbc15c636c73fb4546c.npy +02958343-2dd2a5154bcf52c2aeebd3372dbf7ae6.npy +03636649-c2e2cbcd1cf9a5bcfcb8d8c6d4df8143.npy +03211117-a0383e1388e74ad8b0851ce87f32a267.npy +03001627-976f1a2aa3224af329d2a9b1cf0c2446.npy +03001627-4365a4d98c9b979019149a7f35de06bd.npy +04379243-1ad008783272fee4c3bd24f986301745.npy +03636649-df0823f1c81eb6bbfcb8d8c6d4df8143.npy +04379243-dd276ac55465f51e1457f3eb061a2fca.npy +03325088-c15d54b2a98d4debb36717b39afb6ad8.npy +04256520-82927175fc00ca7e593ebeeedbff73b.npy +02958343-bc9cd53b74743dcc8772afa45900d07f.npy +02933112-b8300f2e4a8adf9b31de0931bd5b560c.npy +04379243-9245ea14da5198b64b21175170c559e7.npy +04401088-ed004bce9e457ab037c7c775913296f5.npy +02924116-69233ecfef5d67e1c00633847c439a52.npy +03207941-a5a6b467cc0e55eb159fbcda62e85465.npy +03001627-4f520217376a00ac3e4dcc9f0008b73e.npy +02691156-b356ef92a2052648b8494b55ada518dc.npy +02958343-de6b2f1796b1887d84e2301109bd5b05.npy +03211117-ac06493582be880388c7562a134f5ac2.npy +02691156-6a861b7cf2552818181edaa32d7673d8.npy +03593526-26795095a52c788f664b3b9b23ddfcbc.npy +04099429-9b75297c580ff937b61ce5beb9f92726.npy +02747177-a23c4789341aa242cb2a965e75be701c.npy +02828884-d34e91db39030275fc94591f6f745953.npy +02808440-4d7ce41fe16725c5e346f79b9a86790.npy +03991062-478bb08c9de3c176a2c59a4d90e63212.npy +04379243-bccc9bc81809cc0d31a3de62b78a7245.npy +02871439-4552f6002e96cb00205444155ae5c84d.npy +04256520-43e3fd98669121eb826fc8d57346a2e4.npy +02992529-7f41f4b186fdf84c7ecaf377af2046d6.npy +03001627-5c70ab37293d81911b17743c18fb63dc.npy +02691156-796bb7d6f4d5ce8471d03b466c72ce41.npy +03797390-c0c130c04edabc657c2b66248f91b3d8.npy +03467517-8b8b084109eef6d81082f2ea630bf69e.npy +02958343-7d7af9263109f8aed4fdf31cc2d78fd0.npy +04379243-25bff1399600790bc3bd24f986301745.npy +02924116-ea5ac377dea6214c9a54987d702a03ac.npy +03337140-3d35053e01610058ce5d6e9371bb5c33.npy +02933112-94883014b900c6d6647872b8585e132f.npy +02958343-10e15fd62309a13d1812324a4c0d910.npy +03691459-fa37905b884bdb169f69aafaa5236e51.npy +03001627-60a1742f1cda02ecce5a69be7dc7d68a.npy +04401088-a262dd4b61d374c8b91c0e89daffb776.npy +03691459-f4ecacfd4fd61afceb34db531a289b8e.npy +03046257-64de924c24fb12968b48a6a0b4b6d38.npy +04379243-cebc20baf900f828147637a0471f2f73.npy +04090263-d08bf745e6f7e4b14aef47a2c7bc343b.npy +03325088-f5b60361fff872a676c18e71fd49c4dc.npy +04379243-a568d1602f94c814f8a51dbffe0021e4.npy +03337140-b8e0513adede8586820018801b237b3d.npy +04554684-da021d3f1eceeea49ffad002249ee384.npy +04379243-bfaa1c23d2622422ad16260d4d73b56.npy +04379243-a98482ce1ac411406b2cda27b9d80e15.npy +04379243-569095c884b4361f77161ca74d215eee.npy +02828884-f4b6526b744290ee5459024571014ce6.npy +04379243-443eca86041e57ab1e99b149cff6a230.npy +04379243-f39e46c8468ba7f07ba6f8f10959534c.npy +02691156-ab9e9045e6c7bc6537678474be485ca.npy +04090263-7fc4dd8163f4a67d6327d46d93c637b.npy +04530566-705df680888e17ed8841beb2e0280e42.npy +02691156-11d2af04fad0a7e2ce19d55bc5e6a406.npy +02691156-6456e87ff00e31a96efa61580a088aac.npy +04379243-cb71e1cf52531981593ebeeedbff73b.npy +03001627-741ea721bf610a9b9225fc8da7ab1c1a.npy +02828884-f5ca026c6cb2b06b56be5749887a17a3.npy +04090263-6646f169a45f40bfc510111f5d1cfcfe.npy +03636649-9b8f6e93608fb244aec118775e1a3eb4.npy +02828884-ac1b9a34ed8450bb2644d7d4d7ea2c7.npy +02958343-9803af6123238620247a5be450795511.npy +02828884-57fc8345fc8667a4d2b12aa6a0f050b3.npy +03046257-b9814ed05c91121edc6e40059e75ca86.npy +02958343-83f205b7de8e65e517f9d94e6661a9ab.npy +03636649-ab02e202accb9b4b65b77a565916c7f.npy +04379243-d330377051e6180319fb4103277a6b93.npy +04379243-3a8b062c50c0a5b7977a08097a2f2d7.npy +03636649-7cb828eb3b8e424b1e88064118b89a3e.npy +04379243-a30eb4a16f30f29498648daf3d784f2f.npy +02691156-43e078c68d2fa3b4d5d30e1306d90d74.npy +04530566-8b5ccc3b1eba2c9bdf921d807a1adbf.npy +04379243-f9573b0425b08a38f673eef39387003a.npy +02958343-2b0207d7f6a6f23bf0ff8cc77ea4c273.npy +04379243-b6457c273fca48f8b5b7c35a8e7396f2.npy +03636649-5516c456d95ec0df2de0bc4fc4d02dd6.npy +03001627-b67aacec8e98edded0b19424de5f7fe4.npy +04530566-b5a1facfd0a023251e6afa6efa6add34.npy +03211117-cfac66fe0cec664a8069dabf6dffa846.npy +04256520-1f899a4f5418158f6721e288acfdbcb2.npy +02691156-da67955425ffe66071d03b466c72ce41.npy +03691459-563b0c299b32e73327ac18a9705c27f1.npy +04090263-2e3256b3de213e7ad87c63d8b3018b58.npy +03467517-3ddfc6cbb08d60b393f0194265a9746c.npy +03642806-6227e7dd1a391e8d54f22ce0a3592d5.npy +04256520-91ceafb0b1b2008d98223ee0bdd50697.npy +04090263-32909a78138cab24d4f4334cc3aff513.npy +03928116-1b76644af9341db74a630b59d0e937b5.npy +03325088-92bff24b0c36862e979c556124bee033.npy +02992529-625e2b043a61452b80d5f0084d375f75.npy +02691156-329987191cce68bfe64acd170567d820.npy +02871439-bcc620a199d0155e6bf60d91b08331aa.npy +04090263-21d6c28c11dfaa72fb5c1b0f759e2bc1.npy +02691156-c9be9f07f5ae7c375d7629390efe0a2.npy +03001627-971539fb57b476d5c40593250b73d0c7.npy +02958343-37a7f79b9eeb5096b11647ffa4306609.npy +02818832-6df4a4c52c90d70d438e4ded908f7146.npy +02958343-4618489fc34c3367323a23bddac1281c.npy +04256520-30e95358ed817addbaa0f6b191f18222.npy +02871439-d486f1d668cc1376a3fb70cdc0074f48.npy +04379243-7364fd26628b7f6a3e0881f7de9a6e52.npy +04090263-3d7dfeb58c481e88e16974ffd95b0c65.npy +04379243-9d547553b8b68c062f3110a733450426.npy +02958343-bcc3625a31bea6cd6a2345809e2bb169.npy +04530566-adbbaa33c52c3b0d5c0be177939e290.npy +03467517-1fbbf4450cb813faed5f5791584afe61.npy +04090263-d5714c28b82df83d8d5783af2345d2c1.npy +04256520-1aa55867200ea789465e08d496c0420f.npy +04379243-2b8ffe339a50f0a5f51f77a6d7299806.npy +03928116-63bd5dd05e693b762cc8c3d5fbecbcf1.npy +02876657-48202d357e79315e45891653421dc140.npy +02691156-7b4b931c5b6f8167295338c0e33a082c.npy +02958343-261f4a30328cd40960a676833b21afd4.npy +03691459-c805f5a262130e6cb4f6b6fae7a188ad.npy +02828884-98fe81af9b74e4c278d386bfa54545.npy +04379243-35e62b9c23928bc57f5df2bc47846a54.npy +03001627-7a338e9b13ae5da3245e874042d8b8db.npy +04330267-e3d4640125f5eabce793cc5433bece89.npy +04379243-2f8395ded89cf84f40b4c5428883e585.npy +04256520-302fc57b3d180ea4733824eae5cd9ae.npy +04090263-345179cdbb6ac9da4dd752ddde80fb1.npy +02958343-bc803cea33d77530a5038167d6f08983.npy +02933112-927ac18cb336cfe3df289a3ea5d3a440.npy +03636649-6d52f0b6141dee194a200f5f1797d729.npy +03337140-b6e0738a9b5b4d572fcdb68f2467747b.npy +02958343-a4b793df04e3bdb11fed6082009db27d.npy +04379243-75b0a926c795a110dd965e6a8387505b.npy +03593526-3585601ea0abfdfb409421506a05b6e1.npy +03001627-71aa917674beaa2926d044baef0e5df2.npy +02691156-47006ce926cd5519b3f2b01de37c0b29.npy +02992529-5f4c8cb8b3feae768c641604807c82a.npy +02933112-146c3a9cbe3d8f703fe047712e43e185.npy +04379243-74cca53996772272e91a460ae1e88b96.npy +04256520-90275a9eab184067e2ca61e91f2755b7.npy +02958343-b21bc9621960f418c330b66f68c70be2.npy +03691459-8a3b591b72d0f5326d9bd07411a71e3.npy +04379243-f6497e9f02f50c98c065481f0c2ebbca.npy +02828884-3461cf51ad90f09ce3dcb92695647492.npy +02828884-e8ff891162fa20607572046550aace88.npy +03046257-2f570bb2ab6bcad896d5fa1ee6ada8d1.npy +04379243-ecfb5ad31b6e40b72b70eac6546e93fd.npy +02691156-f9d30b24d9651ee476c772fd813166d.npy +04379243-4ce0cbd82a8f86a71dffa0a43719d0b5.npy +03325088-fed454953dfcbb4bb362845c6edb57fc.npy +02942699-9b4953f653bfdd40ea41ceac179ca4d4.npy +04530566-70e4afbe0fa15ef3bc1624bd222f607e.npy +02958343-56dc27e4374cf87132eaaf3b7c9989f6.npy +02828884-95096288ad7e0777f155d75bbf62b80.npy +03001627-e803b31e2185d0405784b22e1081a3e1.npy +02933112-c7a7a1254c5d98b8449f1c29830da6c6.npy +02691156-ab2f47cda3622573c231d70e1e0cc567.npy +03593526-7797bf6a6f3f4a809e9e01b160c24e12.npy +04379243-3250cee2b00f2bfc9141594c44ac35a8.npy +02691156-7175100f99a61c9646322bce65ca3756.npy +04074963-dd110b09266edec5fdcb551a4a7a3f9f.npy +03797390-9fc96d41ec7a66a6a159545213d74ea.npy +03001627-38444677513af4e7bc41009043d88b0.npy +03691459-221a981adf503875e17b9e33c097dbff.npy +03691459-62021776119f573bc7c51d4ea74651a7.npy +04090263-397b2068e029945216b34c3751bc447d.npy +03001627-2b8380ed4b779be7af7c7ad2549a1b15.npy +02828884-b625936e3db6af6318df1fa50d2b64c.npy +03001627-39d1a6007a4a29fe492d9da2668ec34c.npy +02924116-335795e7ab1cb5d84d44f5db04bf14b8.npy +04379243-573922f28958f34446bb945d4cb1ad55.npy +04379243-99224e792b7a7f7bb98f36033d4304b1.npy +02691156-26f8a11864fd6bf7b68211fcc7956ac6.npy +03797390-9426e7aa67c83a4c3b51ab46b2f98f30.npy +02747177-4c89f52fde77d653f4fb4dee5181bee.npy +03624134-28f21da67a53771772c447ef6e5cffc2.npy +04090263-84ad561ea0b15621e33e9d99abaf3052.npy +02691156-558d3d7e6e78f2d941756cc47b70ca20.npy +02691156-aafbf69ed97274cd462a084c3c6d8557.npy +04379243-d956062bec339ab6c67bebb34dbddc1a.npy +03593526-396534e7ea5b33c482db9fca4b68095.npy +02808440-311c8d3738490a553321831d2245cf06.npy +03691459-ce90cf5be2ffbf92505e438c8a36b3e7.npy +04379243-7c07ffc0147bef7df3c9c1464e55d580.npy +03001627-ecfcc42f2386ef37f51f77a6d7299806.npy +03636649-e8006513d5f46d79e738f481f8560d58.npy +03001627-260f65e1b1baaf7c7b707c797539b200.npy +02933112-221d442d733de66144221bef0fa3c36b.npy +04379243-7a32aac4ead10e0bf51fa0238791f5dc.npy +03001627-4f6a5769aab5de542b848a53a7028d2e.npy +03467517-6e8b6c64b425ab9fcf31738f69fc886a.npy +02691156-32a2723086f770e9233d80f3ecb7c6d3.npy +04004475-63ef3350b84efb4b5d45f15f95346a04.npy +02808440-2cc413a8680b6269b362845c6edb57fc.npy +04554684-7da46c2fa47deac5f509767312277f4e.npy +03636649-7474deb91f55a63840719e09f7e71f01.npy +02958343-963a4fdf819cc5ab3174b45571ecff3d.npy +02958343-698cface060385ef9113c2c7a4e97ab.npy +04225987-937c41b3d0d3a87fad1f278e1513f3b7.npy +03710193-17f741662540b2f08990d2712ce4d993.npy +02808440-414688637cd72b6c7685118aff98cc67.npy +03325088-c322cfc79e07849bb362845c6edb57fc.npy +03642806-7ebff305b2e93504239603972bcd2e7b.npy +04379243-5d24567426a614ecfd726e98b98fb36f.npy +02958343-7b0ed2e4d59ad5261d5011bbe723eeee.npy +02958343-504793ed2da6cf7eba3e2415e22cd45c.npy +02933112-3f51197359289bf839d3717288022c20.npy +04401088-bfba0e8cdd5462e4fe103fdbd20df6.npy +03467517-db5e01167c49c793d5d673747c0e3adb.npy +02958343-648ceaad362345518a6cf8c6b92417f2.npy +03636649-f2dbcc8dd8a7c604865a5ebd0b487fe6.npy +03636649-b286c9c136784db2af1744fdb1fbe7df.npy +04379243-9171bc27d62095bfe82a8550427833e4.npy +02933112-4768d015c33de0acc6e4e9360ed1cfdb.npy +02933112-721bd0402e92e339c59350d819542ec7.npy +04256520-e68c603dc62dbbe5a1281b4d4bd889d7.npy +04379243-4bf6707d8cc11c0fc631e7eec6a153bb.npy +03001627-5a3ac1ba6f751bed79368d1198f406e7.npy +02924116-60d958a773186c31f4c1adce71073351.npy +04090263-dc263bc31beedb09589c07868201b17e.npy +02691156-c380dfb1b098757ace19d55bc5e6a406.npy +02691156-ec03d76cbd50314f5c7319b71bdce6e.npy +03642806-471005df47f0b4a6625cbbe81bda8c5c.npy +03001627-d990c996a67bab91d9233930731da67.npy +03211117-5286df5fdb7ab5cf403c2939fca0114.npy +03046257-b1267cecf443b88f4b3c42e318f3affc.npy +03467517-7f3f5c9953fb7e0a6cbec6f3d994a573.npy +03001627-a4ecc0a3d68dafd44925bc492489de9c.npy +04379243-54ba7e77a2bf5fe3158b7df020486ff2.npy +03001627-4c6c364af4b52751ca6910e4922d61aa.npy +02958343-29043510fd903bae457cdd14086d7361.npy +04256520-d98731f20d3de9c4d9b53420a5458c53.npy +03001627-9a0571ae6169a6ebfebad4f49b26ec52.npy +03001627-60328528e791d7281f47fd90378714ec.npy +03636649-8e8f964be5bea1068616812464c86290.npy +03636649-8be8becbec0d42b799e70de063b51884.npy +03001627-fc557cf617e03564da733bb42d274ff9.npy +02691156-1cc3ebbadfe69e8011f5789deac2dcac.npy +04379243-fb1b4b6d51cbe29967d783b4714d4324.npy +04090263-a4d20d766e6bdca4b0659fe8776130e3.npy +02992529-609321c1351a955c1e1f8455cdf1c0bb.npy +03513137-bde25e25b138b1f75d21ec234969aa2c.npy +04090263-a6984e79681321d7665e26d8660e8f05.npy +02691156-1eb1d7d471f3c4c0634efb708169415.npy +03593526-fe575d606cdab4ad713f2e93cbeac35d.npy +04256520-3681d113ea4b98546609f3f8aaad34cd.npy +03325088-69c012fcf92a926414b35a7d7cea7130.npy +04379243-9eac41860580d9ea8a75ef32ea6ce62.npy +03761084-e0d08b4c03d1a0d36be98452b3c7a6c.npy +04074963-33f2d5cb9df739a0cf01bc59d215f0.npy +03001627-e4834c88847b288648d8ff57878739ca.npy +03636649-5bb0ad1e0c9432b2dc6493177a28df03.npy +04379243-fc9116a6ee32b9b79223fc014b68160f.npy +04401088-c145f0b0f18d4afe99aee91747c9768.npy +02818832-9e0733f8515335ba9a87002a4eeaf610.npy +04530566-d841f12d8e22039f56f77b6bc6731cda.npy +02924116-5798b82280016ad3a2181d7deaec8f2c.npy +03001627-30dc9d9cfbc01e19950c1f85d919ebc2.npy +03948459-8efdd5a6333179619f433921788191f3.npy +03325088-33135d27972e8d496c5fbe25b434bf62.npy +04379243-b267c88cc2a3cdbf48d189f942cedc62.npy +04379243-41590fb9de5414f244b154f79bdb5bdb.npy +04090263-dcf9d53ebe90d9a85f14a92a8b55f317.npy +03325088-cc060d05ecc6b760cb6267f1b348aaaa.npy +04090263-9ed34fd8df53c865cccd2ea14d020703.npy +03001627-4fa95ea95b42125be5c1abd833032715.npy +03001627-31ea40d2624b40a17b431cae0dd70ed.npy +04379243-c3884d2d31ac0ac9593ebeeedbff73b.npy +02691156-d24e6c81b5261fe5ca2bd098b9203af.npy +02871439-50fea70354d4d987d42b9650f19dd425.npy +03001627-1eb8558d0f6885a1268ecf2838ad6f15.npy +03001627-48190d05babcbe2c68b95f9576f01a6b.npy +04256520-f0f3a9b0aed5ff1cf1c0e03f321d0b20.npy +03211117-5ecf4a1f273ae695729e474769d21582.npy +04379243-5b06d5db4da42b96492d9da2668ec34c.npy +03001627-3885255ca5d75e69da2260dc4a1fc2c6.npy +03691459-5b2afef3206a153db06d0ef27244d1aa.npy +04256520-dca66ae8a95f7f70552a7b4f3448af2e.npy +02958343-4c6aa3e7a8130295b528c0abff96f586.npy +04090263-b4f152116e77505d202b6e2a481f1de6.npy +03325088-234daa663f5f79b7b0957d845ac33749.npy +03513137-fbe830888a111027b20f6e48f6a30cbf.npy +04379243-a8473c68f6a6f9ad7a1efe7ddaf6952d.npy +04099429-55ac6badaa420c04a19c2099429852a.npy +03001627-bce6cb5f92247eb6844690e7ee348ec2.npy +04379243-252fa50674207d749eb332cd2d2a300.npy +04379243-631028ddb76eed4dbb0085d0daabdaea.npy +03325088-453557d8109ff422c36fb70296e45483.npy +03001627-4bdbecfbc925219157915a20ae9ec6b6.npy +02871439-484a99e5ec7ba9f4b2029d92310f4aeb.npy +02691156-40278c4bbf6c1f3d9642905e5096dbcb.npy +03642806-a96983022f36a0a83ad38b993d9e745f.npy +04256520-ea9aaecb6305da9ff51f77a6d7299806.npy +03211117-a51ca49763fafecf8f25f3eae9fd9c7b.npy +03593526-32e863f0d34384cc7ad908dd9229dac8.npy +02828884-7ab9419e7bfdc80ac51268fdb437a9e.npy +03761084-6aa4b136ec94b46472a38ac2b8f5cd48.npy +04090263-163101758687bfdf30d6a7e7f84a00b3.npy +02691156-ac75db84aa4e72e28f21c6f032637775.npy +04468005-3a1614d8da39aa2a8be7c8c5fdb9bd6d.npy +03001627-f9cdefd31b167f95e8f8c11a24c52ebb.npy +04074963-e08c8823d837fceeb2b53d011d5b25b.npy +02691156-508fa09e7df177e7fee8021c81c84603.npy +02876657-701ea218827f9a7a733657da4b6687f4.npy +03001627-d3ff300de7ab36bfc8528ab560ff5e59.npy +02691156-df25be12ae47d2517ef7776b3bf5815c.npy +04256520-390562a0a7c74cee19fb4103277a6b93.npy +04379243-aa3a0c759428a9eaa5199c5eb7fa3865.npy +04090263-552e31db6701e0b7381178c6c47f7400.npy +04330267-6265be481c953acd8c159f8d5e761b17.npy +03001627-dfca4eae14e0bb541f6399f392c887ea.npy +02880940-a9ba34614bfd8ca9938afc5c0b5b182.npy +04379243-f7a0f1e7e03fba8c9628f611995a13ab.npy +04256520-9b5b636b4b412d33d93768e7b9b1eabf.npy +03046257-25963f5a66bab37529a60d6ab40898d.npy +04530566-5e65f519b9f5361e657a96a9bceb8713.npy +04256520-c9f83c2615326e7aff04196502786921.npy +04256520-e68e91ef2652cd1c36e3b2fa8d1eb4eb.npy +03636649-6b10584984035b088314f68ce9e12e4c.npy +04379243-96a2a4c8e6b988d5676612319c6a30c3.npy +03797390-64a9d9f6774973ebc598d38a6a69ad2.npy +03691459-311354773f4c016ee1e724fc0e43bde4.npy +02871439-22cc76cf032e93d63f200afe6e0af4d6.npy +02828884-522f8c069a76c21fad5067eac75a07f7.npy +03691459-d06efc46aa999fa21574d21c0c95092f.npy +03001627-12c2b7080b07146a9d4d5dcd2cc33826.npy +02747177-ca901a3fa7a02f07912bc5b1ad60720.npy +04530566-73be7ff2caea7fd47c173089abc6401.npy +03636649-edf15d323abc7333cf66a9e192dbe265.npy +02691156-1c16739bbf3fa7c44276157eea5f8676.npy +03467517-70d9a5d0330abd9df4b498e11fb60a4b.npy +03624134-4c632e73e331063a942c72c00d252030.npy +04468005-7ae6c3c5d9518a5e982c7c6a3539d1c.npy +04379243-28447e9816bfedd268a2b8e2b27b7d8a.npy +04090263-8c151b8df929ec9616cf8b1cd2155e02.npy +03325088-b0f7fc62dfea232f14b35a7d7cea7130.npy +03001627-4e358c2dc0513971f98c0761af40e04.npy +02958343-952160c39258af7616abce8cb03e7794.npy +04379243-b491449d06aa40cc82e6c3a4e742651d.npy +02871439-e4fa76351e8733d3d810b14a81e12eca.npy +04468005-f046ee2a338501aa1ea6661badd5a5bd.npy +03593526-c637b5e2387eec7421aff7e1274fec72.npy +03691459-970ada2dffb5ce49a663d9823c133130.npy +04530566-9a0c149f5c47207f22252c899eb7861f.npy +04256520-11be630221243013c087ef7d7cf00301.npy +04256520-bab33dad5baa7983ecaafbe064b13083.npy +04090263-9dd91ae86cb9914678cf950c87657866.npy +04379243-ccc9cc45699f95f21bec2e8246842c2a.npy +02747177-46bd9fb29f0ad74151f881addeefe983.npy +03211117-64a769a9a884d63f802380d5ccf70dc.npy +03001627-697cfbe6e043136b737a00f007529fbf.npy +02880940-a73d531b90965199e5f6d587dbc348b5.npy +04379243-b254462a49aa73df51f77a6d7299806.npy +03642806-d1388dc83fa45da33a8222bbf59f8f16.npy +04256520-db49ee0d87af106f2de0bc4fc4d02dd6.npy +04401088-d21231fb7d7f7337f521a3dcd28e9d2.npy +04379243-77c74742e9504005a7d0cc9b15400f65.npy +04530566-6fabf91638fda8bcce1decf313ece97f.npy +02933112-9b33a5363695ebc3391e4d6c585a697a.npy +02691156-e24be0487f6a3a92d4fd6e0556ecdd3d.npy +02747177-63adebf24a1de9ecf91cc5a18046145f.npy +04379243-7cc444f165a22b80cb2a965e75be701c.npy +03325088-272582c1e1fd8a7876d20e73c57c9a03.npy +02876657-3f6dd828b9880456807c41acb554a82.npy +03001627-27f4207dce674969c3bd24f986301745.npy +04379243-e0aee89fa986647257256b1738023f7b.npy +03001627-9695267b69d145dea14bb1d7e401bf06.npy +03636649-656d25df742a84877e44e3c724db889f.npy +03001627-73aeafc0af4f1a62e1c624539dfec6c4.npy +02992529-81ad8af206d6b21b89b367279b017ccc.npy +04090263-a15719f77035596aea1c54714433d676.npy +04379243-ba8b2d50ab955e94beedb4c8fd29e2d1.npy +02933112-69949f47106c9140391e4d6c585a697a.npy +04379243-783f84e17b53447de76bc197b3a3ffc0.npy +04090263-6fa6eb2479a09474d87c63d8b3018b58.npy +03001627-34ed902dfa2d8eec2cafe1b125cab8fb.npy +03636649-52783aa89adf06f3250c527721570ba0.npy +02933112-2441395102a132354da5feafe6f1c8fc.npy +02691156-206a4bec609b727566cf1b4a8fc3914e.npy +03691459-61c61c893164dbf275f6e8ca4d589c7b.npy +04530566-e5524ebe2d9f1e8c47caa6b5f3c46e10.npy +03001627-78505373e756b214a3af90debe5fa17f.npy +02808440-2a57aa530ef82b91904e03fa15bd73ec.npy +03001627-38afa26a419ea3abed040525648fc6d7.npy +03636649-bac7b2c006c9cff76739a7caa0c577bd.npy +02958343-68c72623c8d32451f44e15caa8fd94b4.npy +03001627-4f061233795740bb411c679938d00104.npy +02691156-ddec69970cbc4d29112a90660b187a10.npy +04256520-f8519e593fdb348ab3d135d7fc8306a1.npy +03001627-64952439f8d9e1da9c0c9824ccd078be.npy +04530566-6a5405246814b82281c5ee986f4484ec.npy +04379243-82236bf856dff003b8fe77caf901462.npy +02958343-afb36ab0a7bb906bd95840a0da458be0.npy +02828884-74983e99e7606eb114708467db3d00e2.npy +03001627-701551efa4f1f4fe3e478b26cb10ebe4.npy +02818832-96bf3b5230681dd9e595fd37db7104a.npy +03207941-dd4cb99f1f210b196e25f3efedf6785f.npy +03325088-6555b55b9782e592b7a867e9b35a1295.npy +03001627-a6f280a490010a1d593ebeeedbff73b.npy +02958343-4e42e2b6986a3d86a20249b45c17a5c9.npy +04090263-fef082ee4cbfecc4a65322353bdd17ff.npy +02992529-24f3752312dccca3e23b34f33128879b.npy +02691156-d39075b8eb890a898deb28944f3f72ef.npy +03001627-226f096dbce49857bdfa5e0753fa3240.npy +04225987-6e76a333d9fc9a2972e15b580d9a5b3.npy +04256520-cc5f1f064a1ba342cbdb36da0ec8fda6.npy +02958343-f414e36d6daba864d9bd5ae694086d5.npy +04401088-4133d764b4ce5323a44bdc236120a21e.npy +02691156-527975c6c0e1c426ca8607f540cc62ba.npy +03691459-767f4a63260c8419e279011f622f20b0.npy +04530566-d8b92646ee0cad39866219ff4a62ebc4.npy +02933112-53d1e4d3a815840b7753393bcfa5f775.npy +03991062-fa3a58bb2806913ac77ef7a50d334603.npy +04530566-43bc1dd4f4d7f07a84f7e91f7eafd792.npy +02933112-6d54014c7e0847376bad80b4002b9511.npy +02958343-2a887d0b865d8ab4dfb921b4cd0b4571.npy +03467517-fc0dbc2ff44c860ed57700c05b1862d8.npy +03691459-49c6597ddbc1196be50209c399f9eaed.npy +04379243-7fef7125c14e0fc3b3ec4062c13aac32.npy +04256520-312ee9c8bc6ecec5ce59ea70152320fa.npy +03593526-93fa7a1e2aff0b84154dddaf2978e13f.npy +03001627-d107532567ee3f316663d1953862c637.npy +02691156-694da337c806f41a7209009cfb89d4bd.npy +04379243-291e43df05fba9b53d36088e1ac945e3.npy +02691156-afc2efb530e899634d4cb1c2a5e48b7a.npy +03467517-34874708b51c7ed493f0194265a9746c.npy +02691156-c31bdeebd8d74a7dbbf3143b1cb6076a.npy +03325088-cd0b16a0ee7ca94269fb38085fbc320c.npy +04379243-83b8e64089968ae8fd3feb4581507302.npy +04379243-998d6e318306153c3d67fb6c1e0f28.npy +02933112-ac11c66661c8f95825b0a60e00f47d7d.npy +03593526-40f0d91382abe04b2396ca3dd50467ab.npy +03001627-c709aa613431c0538a653a9f65a410f6.npy +03691459-65425eebdd205119b128e24d154447c.npy +04460130-26e099d5d7040b03b96aa5dc23c036c.npy +03642806-343c090b2004dfb0910bfefeca21d514.npy +03513137-64010c4042824e03b13741399690655.npy +02818832-d3aa611e639ea0228998b3b64a143d42.npy +04379243-ffa875f5e2242d62d13de1e342854aa.npy +04379243-48cc2f299fb1692288c3056e77bac805.npy +03211117-58eac12dcadab8bd6ff188b4687b7936.npy +03636649-c3277019e57251cfb784faac204319d9.npy +02691156-bee504b4909890df1dfabee9ba27dc70.npy +04379243-b8efc08bc8eab52a330a170e9ceed373.npy +03001627-942a10a33418205819fb4103277a6b93.npy +04554684-9e991b898c6362977123ef821e961857.npy +02876657-dc9247034a68285efea8a3df5e20f054.npy +03046257-c154e48d36e44c179e8f28fdc2cf9ec9.npy +02946921-a7e0a5111234031fbd685fccc028124d.npy +04379243-30c669e02f875ae6668ae11a7db5e82a.npy +02828884-38403c071594b1cc749694da9ceaed25.npy +03928116-818575447bfc6dbfa38757550100c186.npy +04530566-703c1f85dc01baad9fb3e3631a88cdab.npy +02958343-7272b7e028737097f200a72c9245aee7.npy +04379243-62ae9ded861138be9d2be74cfb51ade1.npy +03790512-d08e47404f0fa3f6a05d44ba0445fced.npy +03991062-2d890efbb22ef27d72652f4081ec5a77.npy +02876657-d3b53f56b4a7b3b3c9f016d57db96408.npy +04379243-9eeea5f7b030ff6ac155f88004a92bc8.npy +03211117-f9acfb901156d3b7dfa29c60bc1700e1.npy +02958343-24dc3903b254fe41b448bf2dc92c4fab.npy +04379243-a3db8fc07fefad03db984b8f0550fcd4.npy +04379243-ad50c756edb20111e76bc197b3a3ffc0.npy +03001627-d7db1353551d341f149c35efde9de588.npy +04379243-14ba2a965791a003b37e6e0c89177ef9.npy +04379243-2330e9debdedf9ff99284d844aba7576.npy +02808440-cca20dbad3faf4343321831d2245cf06.npy +02828884-287475ec16f5b7477b636e5c31038bd.npy +03691459-84e6e1fb56eb60e918d385624fdfc6d0.npy +02876657-ee74f5bfb0d7c8a5bd288303be3d57e7.npy +04379243-3f31ad5e9cf3e51fa6255bf8e0b4ea3e.npy +03001627-244eb71b1dd140dc6f64461f0eb7cd69.npy +04256520-f34cda8bde3c79709829306a513f9466.npy +02933112-c65b640e9a3838f91d76d38b3dec9476.npy +02828884-fd359f64dda4e753870f22c94729669b.npy +02691156-1af4b32eafffb0f7ee60c37cbf99c1c.npy +02933112-d33e54d1880f70c310cd758d9b7cf.npy +04379243-50b076e7917c1297cfb87ab5efe3dc31.npy +03001627-1b4071814d1c1ae6e2367b9e27f16a71.npy +02924116-84d920a145b5487154d963fd62c89fef.npy +04379243-ead13c29c385832eb4c2969e5244fb83.npy +03001627-9a82269e56737217e16571f1d370cad9.npy +04401088-49081a0c0cd4ad32166f3c6af52a7c59.npy +03636649-81e42a3f9e13e1e52beec56b24479ed1.npy +02880940-c25fd49b75c12ef86bbb74f0f607cdd.npy +04379243-c52a6a569770d1b39ccce4c6d5bb195f.npy +03001627-5202edffd4882c252192179b64411b43.npy +03624134-8f0e77eb8d646ea8aee6942381ab7f9c.npy +03636649-da5db67a2385d5e8da9baff5f5368802.npy +04256520-9ec7016d6978216c94fadb3555028734.npy +03211117-95df08344f4737e078785e24320d5ee9.npy +02828884-f44b93dcbf00d80acb2a965e75be701c.npy +02992529-11e925e3ea180b583388c2584b2f0f90.npy +04401088-ccfac9fefb0326003f548cb8701b2293.npy +04004475-52574afcd545b512a370c653486c68e0.npy +02876657-ac131ac1bbe3dd10846564a8a219239b.npy +02828884-e0e2dfd6ed0880a6d6421fd2aa576b15.npy +03636649-9db87bf898efd448cbde89e0c48a01bf.npy +04379243-8f9f4ac0dd2734d77ff6ace05b36a5.npy +02933112-3105e7ff7fbf3e423e72cffee9fc75b0.npy +04090263-71f31b9a96f1b312ddd7320ddee77bde.npy +03001627-d0d3585a2c4579bde290ca81b042ebb4.npy +04379243-2c72d9ccd9399fe8968731dfb1dc1f13.npy +02828884-ebc20661d9e103334b3c42e318f3affc.npy +03046257-849413d99fac88c48cc8fdeacb50bc7.npy +03001627-f350621fba76ee29e7b1367d085b7e66.npy +02933112-1548461b13adc0d0c59350d819542ec7.npy +04330267-1e2a3147e365744f41965be83b7745a.npy +02924116-2f9aecaf8c5d8dffc90887194d8d151d.npy +03211117-4440935e5e566502250bf58700b4d8f.npy +02933112-1838f9b62a102d704c7384dbb75cab0d.npy +02958343-94c0575659c6cdf2091b4cb93147ff9.npy +03593526-a2da98dc3d78788435836c728d324152.npy +04401088-17072ff9ec47bfadc3fd2392bc923b2f.npy +04090263-2d4ba3b93ed69bca2bf266a8f0187ce5.npy +03636649-923097cec128ae77469cbaa3d6420fb4.npy +02843684-cfd6df4bf7abeb318ac033353d37592a.npy +04379243-5771d5a3084b3ca3a2d7b309863cb1b.npy +04379243-7807ff57a21a0ab8740c0058fed336e9.npy +04401088-b18f0d53dd3db1999410a04d09c14d1a.npy +03991062-ac9b4ff01655e74c67a2f40ab335eb08.npy +04379243-28db458b524dc934f2c9082debcece6.npy +03691459-e878e519af882f493fc48162942e3418.npy +04090263-ce43c7f0642a72a25e9786b1603f45c8.npy +04530566-20e8718d1c6d5a665a525c461820c6b3.npy +03046257-428647629e3a9906f0df3cdcd733f686.npy +04090263-5076565550186d3a1f23c99243882ce8.npy +02691156-eb85e7d86e2ef861e7cb9c477e2b7be.npy +04256520-3a053bc6997155674ee2933c1153f63b.npy +04379243-10506aab1adfe9f4eb7b988bf4f0d1ef.npy +04401088-976a8d10e8423f8d8f15e8aad14ff29e.npy +02691156-862f246e54900f48ed4212b3ec7c4371.npy +04379243-6349f0d123ad1ca62ee5d388bdaf2f.npy +03467517-aed378fa2803c946dede9e8b66028607.npy +03001627-2be29f8ad81e2742eaf14273fa406ffc.npy +03001627-360a12c8666f5f764c6ca0d259b5e0f5.npy +02691156-a60b2775f1955153ca8607f540cc62ba.npy +03046257-7830949f6069c4fbf546596ce7364503.npy +04530566-7dbcab223200092feb2c303a0e0d287b.npy +04090263-c41ea087ba71931967a4cd2863eb1ca.npy +04090263-43c51dcb5c9c812ec1385c8c0f4d3915.npy +03790512-2fa098eefef49c8c85b48ea6a7114159.npy +04401088-4458a5056f633fa13abacfd1353cca42.npy +03467517-5dcc689f1472b2c7dae24eae11385498.npy +03948459-f6d74e48206fca39a6e43b878d5b335.npy +03642806-9b4ab67eb448c49c11ced4a54f2e6229.npy +04090263-cfc172b9164357ad42a9381145738f08.npy +02958343-35a32cbdfd9e7ba460ed0d611ab79ae0.npy +04379243-4967c4df72373464622e43c0e0591de0.npy +04379243-1fc4b8f3fdbb5cca12464df1bb7d5f0b.npy +02958343-fc28356cd7948b90466f54ef02e60f2f.npy +02924116-dd21b1599951d4bcb84877c61813ddb3.npy +03001627-e605d3ea3be01ac3b11a97ee9284a563.npy +03001627-e4384c55342db206713decb1a0563b12.npy +03001627-6690683366993cb1d42ec7e303174a87.npy +03001627-22575f5719f3eb3d23bd3a8c035c98ff.npy +03001627-4e664dae1bafe49f19fb4103277a6b93.npy +03001627-b80e1766b45076ff492d9da2668ec34c.npy +04379243-6e13d5d26a0c53e13a66b6fe2c876ded.npy +03593526-809d15e11cfdbe10a2ee63b46530621c.npy +02933112-fc5b7d19b1ab1e8bd0504a433b7a549.npy +04379243-5d53ed3005f4dc6856786b90799c4fdb.npy +02958343-dee6d83ec808d673c4e77c640c2391c7.npy +03691459-ba63e6e1bd33064a90146e2a0489a257.npy +04530566-969c3262a594bda487a9e46bb7812fbd.npy +03991062-f7fd1967f8c15bbd52492ca5b5b3a7af.npy +04401088-4c9760ac0bbd2003151c744078238922.npy +03636649-e4df4ee697e71902f95e2a1e9997b85.npy +03001627-381782d3562f2fe0302dea4b3acac371.npy +03691459-1ba62454cd137945337410fccb2e7331.npy +02691156-e6236c5ec784a48111dcece1819895c0.npy +02992529-eb58b011745519194fde46457697d80.npy +04379243-2e86b383f43bcb1b66dc6ea1ac82d91f.npy +02828884-54c05e235c8d3a4cf09874e0e8a75195.npy +03636649-cf5b6127ac18e85b6aea2f18ee404fd5.npy +04256520-c0b61d423f449b3c6f37a8be59c15bbb.npy +04379243-6f317ae1892ec6e22f63d70fe82e78de.npy +04379243-133686fa1a2136092c280c3b5abf8255.npy +04530566-d4079a1fa9c5eee8a3599da6d4b3696d.npy +03513137-13da2cd827cc8b9f99976ddcaae4d11.npy +04379243-2e61f5b4f26b890cf27383fc5a5a711c.npy +02958343-7f7bec6423847a583002e98d41e915cd.npy +02691156-8bb827904cd9acd36c1cd53dbc9f7b8e.npy +03593526-ac40978140155f2e5d878ba9ec3c0d6a.npy +02933112-c4fc9ac6e45a8ebc90546f5d45015351.npy +03001627-450b4a6b6afa6280d5a910bf1c23bf18.npy +04379243-d4fc029d3836221b76e9713f57a5fcb6.npy +04379243-733722cae46eb715febad4f49b26ec52.npy +04530566-9de5e010b46919293bb25e78abe7f382.npy +02942699-cef23409b1a030d516fe5320f9715eef.npy +04379243-2259e09ebd0ed2befebad4f49b26ec52.npy +03001627-126e65c55961e5c166f17d3ad78f5a62.npy +03001627-e3bc0a03103cf84e7a471a654ffbc436.npy +04379243-bf06de9143b2e36190eb1f8a00f61726.npy +04256520-d644ef328d35d28ffebad4f49b26ec52.npy +02828884-bf0b9b88be76628440126a5bcf48fc87.npy +04099429-7f8f5ba0ab543cd99cc7053a5669450f.npy +02958343-45563d97886d68eb12d484f58f506441.npy +02871439-e4c42bcbba4ef5b09a2d4f7bacd6e0d8.npy +02958343-1e17510abe8f98bea697d949e28d773c.npy +03467517-8b61adb73d6349838014d29eab9ba665.npy +02958343-7b35ba084bfb741780e98029b8cda1b.npy +03790512-c8a99ee61a2003308b543692e5ab59d9.npy +04256520-4f7392168ffafb8aea91375557c834d7.npy +04530566-e82e97e22066a75d798832e32e32aae6.npy +02808440-4bba4847c53eefa43121505b9493314.npy +03046257-9973f62eeb03fa9b6e259a0b666e79d.npy +04530566-9848322f786fc6d9eb2c303a0e0d287b.npy +04530566-18a4466173b31541a66c1707a338712c.npy +02876657-1ae823260851f7d9ea600d1a6d9f6e07.npy +03211117-2711433532f6d1fdd7426bda0fe4ebcb.npy +03001627-376b0c463a2bb625c036371d3ae886e1.npy +03211117-78c2861ca4574a8fd9deb3f829cc2475.npy +04090263-bcf362f325cf658e282dd3b430ec2654.npy +04090263-84735b7ac61d2ed023c69c7ff0f71040.npy +04379243-974cc395f9684d47c955e5ed03ef3a2f.npy +03001627-9189415b98c9981cc2b6cd34eca9d8c1.npy +02691156-78ceee44d207e826c87f6dba8af25d8b.npy +02828884-c36cc90d01f21180c3c8317b7074dc0.npy +03691459-c3180cdddec577f2e17b9e33c097dbff.npy +04256520-98f2d21c4dcac477f7628281ecb18112.npy +03001627-5fc3bee56e8ceae26fa2cfca412075ea.npy +03790512-bcbcfdad5e0e1d9ba88e8cb97b773125.npy +02958343-48863925f0e70aafdf8e4da0a37cb43e.npy +02880940-11547e8d8f143557525b133235812833.npy +02924116-c9fe4ffcdd6c5ae1f4704cbd27fa6eb5.npy +03593526-1c0a264dfbbf285cafe995003c9eaf93.npy +04256520-9bcad07a9c2e8e13490ad276cd2af3a4.npy +03467517-2d31ac290daab56a4e96698ef01e7360.npy +04379243-b2d64a218b373b0456d80c2792e1f42c.npy +04379243-5c3932413e5433e0f51f77a6d7299806.npy +02924116-c68284aa7904fb4d5e2fdc02779b5bdb.npy +04379243-45da524a32676350b5817dafa1567392.npy +04256520-fa877c7d428253515e4b35ff1ea95f37.npy +02933112-54daf9093eabf27a34d6aa31914c287d.npy +02933112-e5bd1675d43422bb61706e18472540d6.npy +02871439-71b87045c8fbce807c7680c7449f4f61.npy +04379243-5c5f434f9ea8bf777bcb070cc655f13a.npy +04401088-3c244a5e76cec2cf6f108f2b64e6593a.npy +03948459-abc7a1373f4b30291adcc40d88daf7c8.npy +04530566-a755dbab93afbb3a1a05bdebf75f301d.npy +03001627-a75e83a3201cf5ac745004c6a29b0df0.npy +04090263-2757f06b6b4d3ca3f02ee453ff283e26.npy +04379243-9e5926bfdc7f01749e65a3d2929a9516.npy +03046257-969841e102fe5e1c2de0bc4fc4d02dd6.npy +03636649-20e1e4849339e64f5077539b37310c29.npy +02924116-e205f10f3b2dbf0941cefd10ce5d6cc0.npy +04468005-7ad6c009fe02d1845f73a346378dad81.npy +04256520-83a7b2e11589b4cc5fc6df6674be3b9c.npy +03467517-3c125ee606b03cd263ae8c3a62777578.npy +04401088-48a2000b54f4fc792a56a29c6d979b82.npy +04530566-71aedddffbb7b1befb4a964cf6619fc2.npy +03001627-ef544a816432b0a78dabc11b24766ce2.npy +04379243-7eed749ec4a3e391289014a3a9ce92.npy +03467517-fc003660554be7334dfe0ed95d7290cf.npy +04401088-addf767a669d9732691c3af43bf5f97e.npy +03991062-b3a1437b16fc2b5b88650557d3dcdb73.npy +04379243-482123c5f097d29f278d386bfa54545.npy +03325088-12eb51d74f30c3c054d7082b34825ef0.npy +04379243-5783c7479b89f76b0783d9ebb200d10.npy +03991062-4e5172f357714b7f78caa162a41a851e.npy +02958343-3476290a1220338ffa975bcfd21f6dfb.npy +02691156-3716ed4fa80dbf5f41392ab7a601818b.npy +03001627-8ad5b0bd9f1297e5492d9da2668ec34c.npy +03636649-cbea72b8621f99703394926146371698.npy +02691156-eb8fe6d82d195ab5bc8feea465aa74f2.npy +03001627-b8e40ffe5c8e61ba3c8d0fdfb1cc2535.npy +04256520-262b2e2a13c8099d60f888b4e2fd3e4.npy +02958343-105dedf1b70c2826b2dcc642c86ae8f4.npy +02958343-4d8045997209a8cb1bb46d2556ba67d.npy +02992529-2435be698167b2167120841458f79dbe.npy +04256520-3c0dd3719baecf3319fb4103277a6b93.npy +04090263-6e1572214d2606dbcf7516eda265328a.npy +02876657-8ea8ced5529a3ffa7ae0a62f7ca532f1.npy +04379243-78ecba6d2bdb55ba9174750cc2a009c3.npy +03636649-f34d9842b68f0b59fcb8d8c6d4df8143.npy +03001627-5390dede41d523f71a782a4379556c7.npy +04379243-c15f3a4903ca16b98c0a2d703f217201.npy +04401088-71899992cbb987ed5baadcb81f14fd84.npy +04379243-1c259cf6c1206aadb6f6d1d58b7b1311.npy +04530566-512251a635bd548f3463d0a80e47bc52.npy +02933112-da62a2f330280273896f268d8862011d.npy +04530566-8851329ba7c3394d41556f795d265590.npy +03211117-518b97c2a0892aced88854fc3e3ce05.npy +04379243-45b23ac79688170893ba1eeaf62819a2.npy +03001627-ef018d0bcb3d4c89601104cd2d998272.npy +03046257-a294c351a2225ddf6b0c35068783779f.npy +04256520-bba610163b83053514038d588fd1342f.npy +03593526-353709f2c6862ac56bc258c0f0234be0.npy +03624134-e6b5462b34d8809529b0445cdc28e4cd.npy +03636649-3e9ce9f30f1999ab45bb7680f88b3d99.npy +04256520-3b72c4223eb452168f5c37fe197319e1.npy +04256520-b23dc14d788e954b3adc3470b30138f3.npy +02933112-6f679ca92bfaca984da5feafe6f1c8fc.npy +02691156-a4678e6798e768c3b6a66ea321171690.npy +03001627-120735afde493c277ff6ace05b36a5.npy +02958343-47fcc0e1aee36584b1bb46d2556ba67d.npy +02933112-5fc881594598fd937eee615e75bc3b77.npy +03001627-a976138678aa74d0d9ed5cacfd88cef9.npy +02691156-f9505b01e3ea959cf9700e397b8b4e4d.npy +03928116-1f0153042cceff37d20e6bdf4e0f4a18.npy +04379243-9b8e7652eac8daef33e6ceca7fd89911.npy +02958343-d862b3766583ace6c2aae5fbcd555ab4.npy +02691156-543412ccea0db2f8f37f38dedb2f1219.npy +04090263-ceee9df336427c427e1ff5b356a80cc6.npy +03001627-a6d282a360621055614d73f24792753f.npy +02933112-181716a7a34f2708c59350d819542ec7.npy +03001627-2ab2ec342a3b2a45c242632b2a8c3129.npy +03691459-57412ca31eeb15bf75fa5879e0c49e00.npy +03001627-51e27bd3ee95338588d458757d655e0a.npy +03001627-b29d302a87099d924d8777315ca26f7d.npy +03211117-3e9af28eb2d6e216a4e3429ccb8eaf16.npy +04379243-6361a90210b69a9590a2e9c21353bf7d.npy +04256520-61cedacdae156b4dcbae681baa9e61e.npy +04379243-adc1d752f04c338bfbe07b96393f97f7.npy +03001627-7250e86b4feb699aa08cd647a48e605d.npy +04379243-fa3dcf1562e5f60829e4b5aa807bb4e7.npy +04379243-8c878bedb8e052041944bfc1093ee4d3.npy +04090263-198bf0b56e9235a11afbc27572ea3d1c.npy +02958343-9698be0fd3516f01fbeda5389ab05f5f.npy +04379243-161da97088255c645ff9646ea22eac1.npy +02828884-d77f648c6df22a05c6510aa63622330c.npy +04530566-8682988328acbc62b8acbfab1478caa1.npy +04530566-44571992d18375483506f52bbfa5b648.npy +02871439-2f30f402c00a166368068eb0ef40fbb1.npy +03636649-646031cc994df3be11fd25b4ef1afe87.npy +04090263-4edb165109339c63cc4d8251423f62a2.npy +04379243-dc5a136f23bd3f31c710d14956729baa.npy +03001627-9c3d7b65c739a618285330f26226f8fb.npy +02958343-1c3c8952b92d567e61c6c61410fc904b.npy +02958343-3154c3dce06ae7e216abce8cb03e7794.npy +02880940-817221e45b63cef62f74bdafe5239fba.npy +04256520-62e90a6ed511a1b2d291861d5bc3e7c8.npy +04379243-6dee2382e2c710fcdb266b832300e6da.npy +04256520-1e4a7cb88d31716cc9c93fe51d670e21.npy +04256520-1037fd31d12178d396f164a988ef37cc.npy +02691156-579187a52086b0a63690bd3a9fab7134.npy +03001627-48b257f80c7434cb56f6fc4b4ce1db04.npy +04090263-af1778e415b0e0be20fc54d2500eb7f1.npy +03001627-3c0dd3719baecf3319fb4103277a6b93.npy +02924116-1b74500dc5d2a6547c02d07bab7b395c.npy +03593526-edb8e199485be4e968747a7f12307bdb.npy +03211117-692db5a6fb6cea2174649592553d1a1f.npy +04379243-18cea57b061a65e5a346e6ee1c343985.npy +03001627-7eb842de7ad4cbad3e329950ec40f6dd.npy +02933112-43552fecbd07876acac27d617fa518f5.npy +02958343-7f198a2357dec222f98feeb6b46f3cac.npy +02958343-ace409d84c89d7258a0683934fae3156.npy +03642806-942156d763bd7e867cff7d16e20f126a.npy +04379243-704f75e32974f0f9d5316414c56bc1a8.npy +03636649-aa4720a899ddf5456a5c4fd998d89f43.npy +04256520-cca6e720741a6d00f51f77a6d7299806.npy +02958343-ee0edec0ac0578082ea8e4c752a397ac.npy +03337140-c6c6cea3ab70a9fd4c3aee8e9d3a6ffa.npy +04256520-71fd7103997614db490ad276cd2af3a4.npy +04090263-3c9b810025d7167fe641d7676ac20451.npy +04379243-d9ed9f1577b22330aeba6a38e5ba02f1.npy +02828884-ebdcd5f64e44ce0cb2a965e75be701c.npy +03790512-c52be51c1aa7cc9752fa4ad29a1236d7.npy +02958343-924599eb8b6aa6429ed410a010efa019.npy +04256520-6658d651878eb023c7db9c21ccfbc4a1.npy +03691459-b703762eb7b1fd39d0cd692038573317.npy +03642806-39b54fd684a4ed3e6f0a9a10dc885e17.npy +04256520-3582dc0c828ae4b1febad4f49b26ec52.npy +03759954-b86751a9f75423dcffbcf74570805a6f.npy +03938244-ddf0c95f168e43f2283b00891f680579.npy +04530566-70b7ef0d69c7013473965669ebe40616.npy +04379243-d533837495d31706d4bba81d85a6a53d.npy +02958343-cf3a2894431c55f43b5ec9bc4ed9097.npy +04401088-c7e4a425cebaa04bf9c8feac0b33491e.npy +02924116-bd8d7b8ad35df2d52470de2774d6099.npy +02808440-be9496165cc6322244221bef0fa3c36b.npy +03691459-108316842b17210394a42262667addbc.npy +04379243-e24979696e6b8e7060edf8bc2f5c8881.npy +03790512-11b1e520db0bf1a1d5dde04c96fd8146.npy +03325088-78a7613f9eeb866ec36fb70296e45483.npy +03001627-79401adba0311d9b19fb4103277a6b93.npy +02747177-71f3b101a6d47811cb2a965e75be701c.npy +02691156-d1df81e184c71e0f26360e1e29a956c7.npy +02992529-d130a357978694bf58efc722b5cff71c.npy +04256520-6aac93deb58a35f56a3237a661a9fa9.npy +04530566-f3a1538193bfc54fad3766494450e53a.npy +02958343-1714b6e57c8c4983fb1aad5dae793ff4.npy +04379243-2a80c95b4bbcb73d87ed2480ebb0f3d2.npy +03046257-681a251290c5b59583f01376c92cdee4.npy +04530566-b38a6ed1bb88dc6ccd57b018370ca909.npy +02828884-cff15ed24c45878b3567b82c74e275b4.npy +02958343-e308a6e4472658b618e9d35559b7aa.npy +02992529-a4d81a74a416b88948637414dbe9de8d.npy +02992529-e862392921d99119ee50cfd2d11d046b.npy +04090263-db396982ae541ac97f5c403400264eea.npy +03001627-c7f607892513a2f787bf0444104341d5.npy +03001627-5f06664b4eb0af4c352fc7e973ba7787.npy +02958343-48071634bdeb66e271a126804ae24042.npy +03593526-cf65c7fb56850194490ad276cd2af3a4.npy +03001627-2c2a5f5a8931fa0822f0b32ec619eee6.npy +04379243-d60a87c721416783ec7a87c695ada295.npy +04256520-499242b0da957d1e33f2b52ebeafcf18.npy +03467517-65b6279a17e7ace2df17c838e7147b58.npy +02691156-31b75f20c64b03ff6b7bd17e458d0dcb.npy +03636649-699fcda4f4e9166ec5eb7aae719027b2.npy +03001627-9efb86c07170d7e897ec301178d1c7e.npy +03001627-94b779e6bdf6c3d171a782a4379556c7.npy +02992529-854ab60bd57d3d6d2f412e1bfcc51526.npy +04379243-6b8b6d09fcd05c1819fb4103277a6b93.npy +03001627-e5b8d52826245f3937b2bb75885cfc44.npy +03001627-8a2a0cad888b871eaa84c578b771896d.npy +04256520-49b2df85a32176c8e47780c3e225251f.npy +02691156-1e8c56bac4e66672e85e222f6559b47.npy +03691459-d6f0a0ca6446eab0c0b5947ffe18a468.npy +03001627-b6cd2d8af74226a3cd8b5e03f65e1405.npy +04379243-acde36e1b4c14b9aec2d07c46434bacd.npy +03211117-4d033564f0dcb412afac285245c66df0.npy +04468005-ff41a3016d0ed18552318481004055fb.npy +02691156-da1acb401541235be4d2773f0358b43b.npy +03691459-5820d7ef5c9942e6d49b96b9f2811c7d.npy +04330267-72508fd1bd92e1d39c436f89fdc07cfa.npy +03636649-3dda46a537bc16e689ab11a408196888.npy +03001627-250e0d866303abedfebad4f49b26ec52.npy +03001627-b6b911aecb417295e8f8c11a24c52ebb.npy +02946921-bb487f4b77abbef0a8d976d1bb073663.npy +02828884-6194e1897f8ebb17b40f0ac0fb9a650d.npy +03325088-70ba2ae5080de487b362845c6edb57fc.npy +02691156-a4cbb0489a3a680eca8607f540cc62ba.npy +04256520-fa5a0b7134e3e9ecb04cb542e2c50eb4.npy +03928116-38900730fdf8d22b8377768c43f7783c.npy +03790512-d165adb88d2e569552ee90e577613070.npy +04379243-18a9c13c3999e9c186abe5555a3b447d.npy +04379243-4ea4834db898a3f58cbb8bac2032149c.npy +04379243-2bb9537b798dfda490ad276cd2af3a4.npy +03691459-2edc94885c4ba7ad2d563c85edb49108.npy +02691156-3b0efeb0891a9686ca9f0727e23831d9.npy +02691156-895ae296f701f5e2ee7ff700fef7cd22.npy +02958343-b27c818401f48e5220453276fad563e4.npy +03001627-e4494542ab04c033e6fe3612af521500.npy +04379243-79d992df7306436da1ed581c544d9fd9.npy +03636649-6283ad834ec0730720efab7988749bc4.npy +03001627-f2e2993abf4c952b2e69a7e134f91051.npy +02691156-eb658ff31f0becea1d0f8853f6d023e3.npy +04256520-1149bd16e834d8e6433619555ecca8aa.npy +03790512-d82165e9ab3cbde7eba25bbcd3786140.npy +02808440-51ac21c5f5c10583b8724a732b3d4cc1.npy +03337140-bde6f229cd9fc1aaadd6705c8c483552.npy +02992529-e0ccc0cae4dc414cb4e7b68321c9d305.npy +02924116-b2fea5e98eafe6014edf4a0df1fbc500.npy +04090263-2a525d9178f347ce5ab27081157ad594.npy +04379243-a37bc9fad75b6def3087f84b199fd297.npy +03691459-461441f5606348f3d88a3e0e92891ad5.npy +03001627-2a2ef361fbe78f1e9f3cdee390cffc8e.npy +03001627-795f38ce5d8519938077cafed2bb8242.npy +04379243-e2c7ca786fc4b050a8a813669d8b4f2.npy +02691156-e283e3825d66a985b87697d3904b168b.npy +02747177-caefb14d743df2d69c3870d54ab64b77.npy +04256520-b351e06f5826444c19fb4103277a6b93.npy +04379243-874d1890f62375ea30bbd4cddd04c77b.npy +04554684-e51ad19bf1dc680b525bdb2a29d19760.npy +02933112-c031c55d7ff5bd7d824080f516909671.npy +03636649-c58b04ebb038758ba866d377a1785e37.npy +03261776-1f66f8c897bfa84b8c08913777779fe.npy +04379243-18c7c6eed722b9761f8d2643b5438b70.npy +02880940-d5b3fb99c8084a6c5430c0f7a585e679.npy +02691156-371a609f050b4ed3f6497dc58a9a6f8a.npy +04379243-1fe2d919fb4685ea93271d2223fe04be.npy +03001627-8654342caec219e07cbc6cda01aaca49.npy +03001627-e5ce7b150310f288b04cb542e2c50eb4.npy +04401088-60df2f27d33f3f472eb2c67660ce4f3.npy +04256520-930bf61aa004692c1834dcb2b62a80a.npy +02871439-ea1a28f0b31f1be34bd9e0690b0b191.npy +03636649-108a5262552050dfa9370719b830fc2c.npy +03211117-ad0b349657fb807d88d19ffcab9e20eb.npy +03001627-be1546c576c7c189edd7ee0476a331f6.npy +03642806-ddf5d6d855c2aa5d1c644ef3ab0c8ffa.npy +04530566-9bdb0cf464f5c65956b5365bdce185d.npy +03593526-8f7f15db817b3a1982db9fca4b68095.npy +03991062-ce008e86ab858be7ba90901a608c6cb.npy +03991062-3cce39eff2128c34ed390075067c2702.npy +04379243-32c4e455cd92d2a3c3bd24f986301745.npy +04090263-d90b571a1259cef1ad51de5d9ac9dcd2.npy +02691156-e85cd06b4a14d3ffbc0909d98a1ff2b4.npy +04379243-2ec254595840417424754d384796666.npy +02828884-17d8e07c30ff1657d201085e80edb26a.npy +03636649-98c6cea5f2d3ea28fcb8d8c6d4df8143.npy +03325088-a7c12a4d02bf3614378f7f7b635ccd96.npy +02933112-779cda069c3b6338824662341ce2b233.npy +04379243-229d510bace435811572ee5ddf1b55b.npy +03001627-ce2d77c8b0436db4f5d0dadcce96e179.npy +03636649-fd1371c24e12c16251d6edf97cc5502d.npy +02691156-d4dac019726e980e203936772104a82d.npy +03001627-e8788e6f0292f503f4b6538438a0b930.npy +02933112-7759a26614f6c4fdf815c17ff5624f52.npy +04379243-c5faa34d589240b859d0a47cd36512.npy +04379243-b796639ea7368f3bec11953b27b8a03a.npy +02871439-ee7049259da1bcbbfaf46ebe96d4859c.npy +02691156-52e7f93d592622a9615ba7bf3620290d.npy +04401088-a120a29467045d34c3f199bb1cdfc734.npy +02958343-244a8476648bd073834daea73aa18748.npy +03001627-33e436e30da86f3bc5beea20858a99d5.npy +02691156-a9b95631bcbefe9ad225a1c252daae25.npy +02691156-53eee66291c47a91bc0909d98a1ff2b4.npy +03001627-550fa302257e193ec93d39652bbb58f.npy +04090263-17bb6d46e1b07ed789cff8e09537ec10.npy +02691156-ac39424c7666c318cde5b07c0f09692a.npy +02958343-f60779c934ee51eddd1e15301c83686f.npy +03046257-cde7dca42588ba9c93d604ee670f39e7.npy +04379243-d2d5b8f99d977e353002761e7a3ba3bd.npy +03636649-f9bed8743eba72439a4cbf5d3b79df06.npy +03938244-f19f78894858d57c38bf051f9aef03f8.npy +02958343-cab3b584786dda8c85c68dc758ce6c5.npy +04401088-427e06d425b901be5c0be177939e290.npy +03593526-7b0b4571876644fcef76898f881b76a.npy +03593526-b67d4f4361affd4d664b3b9b23ddfcbc.npy +02958343-5cad9a0e7e69c6dfc427f8508e3d634b.npy +04554684-da0179a5b68f13586a6a687121d74e50.npy +03624134-fc40e3685a99eff084db38829945aab.npy +03467517-ed2823c4896d692ed5ab54dd668fd99d.npy +02691156-bc3b68407bba00d92756c2c914ecfebf.npy +03948459-abaf150fbbcfa58e9f433921788191f3.npy +04379243-9dd63148e5b0a4f79eaa55bb236fb6e1.npy +04460130-3defb00d43c0ebc853b60a2c38c44521.npy +04379243-161a209c418646444b3c42e318f3affc.npy +04379243-1ab2ac2a0af6bf36798e7d16c343c306.npy +03325088-495fc62a822f66116f893b5bc716a3fa.npy +02958343-ea529cacc239f82989a8ac0e4c77f4d2.npy +04379243-6bf058da5c3835b415ca6115a4467dd6.npy +03046257-f2a47fbb788c05953ddbeec164af367.npy +03797390-dfa8a3a0c8a552b62bc8a44b22fcb3b9.npy +04379243-1e6143253f8f984735d95c26c81752cf.npy +04004475-3c5a8a2262dc3ef1ab4efe44a581aee7.npy +04379243-6081fd59c46769fdf4b6538438a0b930.npy +03211117-c4b636e2c361be9dece694d60a812f12.npy +03636649-36a1e900d1b4d4b287b2013bc93e747c.npy +04090263-d8e7abded14c00cef02ee453ff283e26.npy +04099429-cbf630e17e0dd6fa8db04a0e4b407440.npy +03636649-446f8c76eed76c199df50b7f68c99baa.npy +02691156-46ae88cad17edca7ae7c0d0e12bd33da.npy +02933112-4dcec5b89f1e9e4915dd7d7985e749c1.npy +04379243-ed59907918516bbb4c24aa998833ed98.npy +03642806-9e5daedde75196487548281e465c9303.npy +04379243-bce2998e60345f86ab610b0c94236463.npy +04090263-cfd06e58d354213c8f2a8ddb5c970b6.npy +04530566-cab0b302a23381adcdcba7385a96c2c8.npy +04468005-f91686b42d529db2dc14ba0818ee5cec.npy +02828884-b4584ca6fe22a0be599937922ec198cc.npy +03001627-8ec79ed07c19aa5cfebad4f49b26ec52.npy +02958343-1f8fc7a787f254e6428df271ebc70bc0.npy +03001627-30b0196b3b5431da2f95e2a1e9997b85.npy +03001627-8bba3f2eac551ada2c0e1e24bb9eb3ab.npy +02933112-6336b5516cc8bd50635469b95109803c.npy +03636649-8e78283cdb07db1fb33cda5c8e604e7a.npy +03001627-72713f2b894ad2846d16cefc94cf3648.npy +04256520-527bc61087456aebbf27ea70a1a65d9b.npy +02691156-8264f874bc7fa58ac3d9e92d9c33325b.npy +02808440-97a2ac7e8ada9d981f003e83c2518be8.npy +04004475-bbeee5ffecc0f04c8476f77a9e6aa3bd.npy +04379243-bf3b9638b7be27bb4c26a0d2e78f0aae.npy +03513137-d7a860627e8ba083ec3df6ee3b84fcd3.npy +02924116-378c6395b62df11cdc6c67d3cbca448e.npy +03991062-3c73f2f15c10d253f2665ed92bcd1166.npy +04379243-8eed35fd5b777acf58316b27df6c8e87.npy +02958343-6c5c45f7a474daa9a134736201a79843.npy +04379243-734a664e9d0aaa1230bbd4cddd04c77b.npy +02691156-c6306d07f28bc5231309643a94d8a5f.npy +02958343-b31c2984546d2746becf71e2e014ff6f.npy +04379243-f27b818a99bf195f76e9713f57a5fcb6.npy +04379243-296cfdd6b347a8e219fb4103277a6b93.npy +04401088-8e00be7402a612e17d6b888b4eb1ac9f.npy +04379243-8ac4d93e65b9d58d9b937d98d58545fa.npy +04379243-5690d17b330f73adfeb8ceb93793cb5.npy +03001627-4fae9528f1403fd0f9702e673573a443.npy +04379243-1c123801cd052c833bd248747cb27ae2.npy +03001627-474b82a849e5064fa9dea4db53ba3dd.npy +03593526-3cd46f573c68e5fcfd41ffe96f6ef4b4.npy +04379243-d820b240ee17047fac51268fdb437a9e.npy +04256520-8daffd33afca5e02ca8dac6d3025a7da.npy +04379243-933096cbd0f7ef0aa73562d75299fcd8.npy +04530566-e49935adf322de2f77e672c4996ec4a3.npy +03001627-5c4e1a58eeb3171dad8af6714b643432.npy +04256520-34878cff5db772bad810b14a81e12eca.npy +04379243-9184aa5ef68a383918c27c564e9b3b91.npy +03001627-58616932b0e7ab6d78b03575bb54dfd4.npy +03001627-97396529412ab7602f81cb887dc35578.npy +03790512-e55e06e7a84f49e2b37378f3c85478b4.npy +03001627-cf24fc2d10f8da31283b00891f680579.npy +03001627-d01321ae63ae0b40ad1f278e1513f3b7.npy +03001627-903e861a95d6a2d5a6db47a0a040d0ff.npy +03636649-7d097f4b38f0a8a65b6c7da997b0e5e3.npy +02691156-775f06502261575c26b390daf74a4b00.npy +02691156-a3fc9ef9f611a783525e60273896d30a.npy +02747177-78f8bb00a5850aaf81faebbdea6bd9be.npy +02691156-cce565137003bb39b2da68ec42b2eaf6.npy +02818832-3a627c3fe65325ab052788001910919.npy +04379243-1815c6431b06dfb4f008d8a3590fb522.npy +04379243-471f9b50c57b07056abfacdc918044f4.npy +04379243-50da3e6b87b52ccc99e8bf807e902261.npy +03467517-16d9563fe86318cdac496d9f900602fe.npy +04090263-6ab8bee75629e98d2810ab2c421a9619.npy +02924116-7f0f12b1280c47ebe2dc67b821479cc4.npy +03001627-98a1f8651c962402492d9da2668ec34c.npy +04379243-e993ddaf6d03003071a782a4379556c7.npy +04379243-c5d499a443ef70906b882130fa92c175.npy +03001627-2b5953c986dd08f2f91663a74ccd2338.npy +04379243-83ca8d37a6f44dff1652fb73e93ef5e7.npy +02958343-79aafe31e4f2677b1f0fdc8ac183f8b.npy +02691156-b9e6298004d7d422bd46d022fd7d80aa.npy +03211117-bae43dafa75f827f4375bc8943daa105.npy +02933112-b4130f8f597c8f38986f688b80d667f0.npy +03046257-97fc20eff457b57fe6fe3612af521500.npy +04379243-f476ea8dabe53bb8efb94709f30ce0d2.npy +03001627-ea918174759a2079e83221ad0d21775.npy +02958343-91b636d0c4729cda1d9cc9d194c8533.npy +03001627-40e9fdb477fc0c10f07ea52432becd0a.npy +04225987-abdc4a823b1f78c397f47f3057557cbe.npy +03325088-3814a29d435de3db54d7082b34825ef0.npy +03642806-b36c5ee8b04b4b0243cecf206f8bdb34.npy +04379243-da2f2572b10c0ed8f1783a44a88d6274.npy +04256520-c37d49d715cc4d2ec7e48270ba1490a5.npy +04256520-89e00bb2b82e9e86c036a40816608369.npy +03636649-d682bfc447413fd167a9bb855340227f.npy +04379243-d2f811bc37858425a63ceecddc308b25.npy +02691156-cfc075c635df8a7a94b9c9a92aa36f8c.npy +03636649-60fba8438739f3cfba9ea396e14c59f2.npy +04530566-4fc0f4f2d29a463cb1bb46d2556ba67d.npy +04530566-36123091df7600dab1f22ce939b4db68.npy +04090263-c9b36427b66414de42ca7cc070f21ed3.npy +03467517-6c438af8d57d047cdc6782957fd2f5d2.npy +04379243-ab8cdc829a360d59339797c21e8801b1.npy +04090263-2d310466453c3e42fa596c3267b95876.npy +02876657-3bf6160225cd15453a762233fffc49ea.npy +04379243-f1c17621d394670b48d1a35afd3934.npy +03001627-7eb4a453070b3f090d1267f8054d8a8.npy +04256520-382d5ba8f3f89385debd258f4352e626.npy +04379243-b052445a4de3c06a10c0c01485abc473.npy +04256520-810e4815b0ef6f1314038d588fd1342f.npy +02691156-f7c11b5e07e9ccab3a116bc3efac4e3b.npy +04379243-d9744ed1255664e7b0c90fa5479c8a6.npy +03211117-64c23d38d98f7529811348287b48cb45.npy +03046257-5437b68ddffc8f229e5629b793f22d35.npy +02924116-7fbc3347e024ac2f3cc48ad84c73863d.npy +03691459-f98620e647a77e1f8b5ea808b63cd2a6.npy +04074963-775230183193fb9c39054ca4bd28c2fb.npy +04090263-bd1711225c6b87332e60a638a5e115e7.npy +04530566-cdfe819679f7c2e2916576b265053633.npy +02691156-7664f3809169e998a4ee0fb6a51564c3.npy +03001627-a0a01b87633d31061e6becdb5008d9af.npy +03001627-9c5b246616974299f1783a44a88d6274.npy +02828884-360d9cc763aa370320768660cf080d12.npy +03593526-8029c2527230111aad1d789f3b2120d0.npy +04256520-c4b2bd128c424f361b02cde7e81f0fc3.npy +04379243-e64f3681d7c76bb743638dabe1eb5336.npy +02808440-5634cbd9ad6317b444221bef0fa3c36b.npy +04256520-3513af0a9abe4b48f13ce777d031b4b2.npy +03001627-8ef2d2d320e4f3479e3ca99089143c61.npy +03513137-fd861e0998b5acddb20f6e48f6a30cbf.npy +02880940-46d014209027ec188e74a3351a4d8b3a.npy +02691156-2d7aff5577ae7af0d8ff6111270336a9.npy +02691156-d617ffca7890b33eeb9d949e4b90f4af.npy +04256520-7b9d9c738c6042ad1c2c02171f63f02f.npy +02747177-90669f582a8fccc5ad5067eac75a07f7.npy +03001627-32563c1b8b31667bb6695fcbbfeb161b.npy +02958343-9d77d4c959974035fab60fc805223a73.npy +03001627-b455c3037b013d85492d9da2668ec34c.npy +04379243-ebfe93f04bd040ced98bf80379cd1d6.npy +02958343-4a23138e9dc20916147f7a82b2d95068.npy +02880940-aeb7b4bb33fd43a14e23e9314af9ae57.npy +03636649-4dde6d694443a488edb5be732846826.npy +03325088-f4f6333e2342ea4276c18e71fd49c4dc.npy +03691459-5b3bf009f0dee3f01ad88f716ea80910.npy +04379243-d31b0d2a41051f2c7b79156a61ad4c01.npy +02828884-c3531b822720720bf27f378f9a625c3.npy +02691156-a3927542339a2c491b1cc145b0144991.npy +04004475-6039a39331a844138796ffe7637b86a0.npy +02691156-6ecf2dd001e3b029dc53c0dc42fb387b.npy +03001627-541746ddb47aa2af4e186c8346f12e6.npy +04379243-9c9554e0883818c9febad4f49b26ec52.npy +04530566-51f002bbc33e4b34aff407511d7dfc96.npy +04379243-5e3f91e841bf74d240cb0a485b0065bc.npy +04468005-7c35b5da555b7a0c3b2a9f4a86c95221.npy +03001627-b9382558b6b4e858ce5de6b2dd443a15.npy +04379243-6e9e8100ffa2a7fb3b1bee6df796f998.npy +02958343-b8f6994a33f4f1adbda733a39f84326d.npy +04468005-54538ea15381fb87175776dbca7c7036.npy +02691156-e138a98d82f3aa692142bc26f72ae44c.npy +02958343-56a3f3d118f350a516abce8cb03e7794.npy +04256520-4f6ba19d62789d90d71c0b5c63bf171.npy +04379243-3b569be398a7e56eb4d174e5c61f344.npy +02691156-dbee200cebd464779b0ed23034a67f7f.npy +02691156-fc76d0a9da7cde0bef5ebf5f74916182.npy +03001627-bdd29e651e5f6fb2b079317292bdc5d4.npy +02933112-6e5ac40051b3e17b697129c0aef9e5f7.npy +04379243-5ee4cbe45bdc4cd571a782a4379556c7.npy +02958343-3500ccddade6926233307cdc293a210c.npy +04379243-b8cc89f8dbffe099a2da1afa391f92db.npy +03325088-9ce16ab9b4bad6e2b7a867e9b35a1295.npy +03001627-2c250a89e731a3d16f554fd9e81f2ffc.npy +03691459-9f4aab6206870d5deb34db531a289b8e.npy +03636649-91b7d2915bfede639b3360f500ac52a.npy +04530566-f226832ef907984fd8d4a0e4fc199475.npy +02958343-730608de801837b495b02c654da6c998.npy +02808440-549663876b12914accd0340812259a39.npy +03593526-2d5cccc84167c652b5918a323a1320cb.npy +04379243-7dca56442a9756a2e38cad80f0be5c63.npy +03938244-94e39fb5f01f15118998b3b64a143d42.npy +02924116-636f88c563c889147a69fd1f16c84fc.npy +03001627-89b05900bf1df4d8c8687ff9b0b4e4ac.npy +04256520-f1a09674a12a3aa7297936c81e7f6629.npy +04530566-d37263bdd876ddf6f885c09aa3e51c57.npy +04090263-33d90fc45cfadd54cc273c614d275d95.npy +03001627-d504ebe36ddde74cb5e61088d6c054a1.npy +03001627-670c7df7c840f78bcb7547c95fbdff26.npy +03001627-8a21b853c8de77f0c8687ff9b0b4e4ac.npy +03691459-9b4d3ead5066a6c5844e9c5caa6d29c6.npy +04379243-bd9758dc06e3c2a01e4317813b39d4fe.npy +03691459-5578446e4a13451a6c7c9dba2abc9f8b.npy +02876657-59763dfe99084f0440ba17ccf542984c.npy +03046257-312304e53430a5afc1f818f3a4aae3be.npy +02691156-90769434f2b588c1b675ec196a869fe5.npy +02876657-591153135f8571a69fc36bc06f1db2fa.npy +04379243-ca43d45909245ceb4ca2c1f43556033c.npy +04379243-78ccb410de7bfd821f8d8332ee17945a.npy +02691156-80b8f4da6b77eb66d208f79049825a82.npy +03790512-fb3e72a17d45156eef7c0039cbd1871c.npy +02828884-530b1267e70cf134d4d8765e3910f617.npy +02691156-66cd9502b63e8a97bbf3143b1cb6076a.npy +04379243-492de0f32fc58c83297936c81e7f6629.npy +04090263-7ce9eecd689e432892cea77f96988ae6.npy +04379243-1417875756d55264ab94214c753c8efe.npy +03001627-eee352c9cadd79cedb1051713db42252.npy +02691156-fd425567d79a43d14f8a08a5e6b028e7.npy +04401088-f9023b680f219f7c363111a4e20c10d0.npy +03001627-2c052f5541d4d5689b2d7f86be5d0083.npy +02691156-f89b085c37779a5997517c313146c4ab.npy +03636649-dce4bd10d499b2f24b3c42e318f3affc.npy +04379243-87accfd64238d29845511d16be3037f3.npy +04401088-e870d160aab8a55f1a696e9ae9fac3ba.npy +02958343-95d18b69c9624a05473f10e6caaeca56.npy +04004475-d918b4b7498972bdc9a1694d5d1efe00.npy +02691156-5cbe5be753b5c7faf389d19fad321c37.npy +02992529-9952f0dc41b20fcfdd5b23028b480cc3.npy +04379243-3512806247a9e1ae4ffcc2bca1c09e9.npy +03325088-6909b927f7712ee7f235ab3c41aeb5b6.npy +04256520-9eaaf854334b3bca676de9b6e111da8b.npy +03001627-6dfa9675d27b5fc134f6a34e269f5ec1.npy +02691156-fb2204e98090448ebbf3143b1cb6076a.npy +04256520-85bb20bc97b61c17261770c74651d29a.npy +04379243-a8fa391882414febad4f49b26ec52.npy +04256520-96ee3d286bfb909a204812d6a020ec9b.npy +04379243-f1b42fa8b6b48e927c34b035140384.npy +02691156-8a47b24f85a0eafa12234b062bc6c471.npy +04379243-763737ea91a58b0360eda59359536e76.npy +02876657-42f85b0eb5e9fd508f9c4ecc067067e9.npy +03991062-297999156841f16ade98d10ab5975b59.npy +04379243-5970844b794a55a736d8dd30a594b2af.npy +04090263-1c231bd6dfbefeba6bd753a4bc3410c1.npy +04379243-8a98eb9c64d878dd419786e9c37fabbe.npy +03325088-b89336e1f0e8aa3d76c18e71fd49c4dc.npy +02992529-ed53e90551ef9cb7118f00b061390b2.npy +03790512-9dd4ae1c34af4766b4f2746c8140d6d6.npy +02876657-347f9f4a04cc00841fba588fa05a3c38.npy +04256520-89f4fca1f562f9103264e1c4b42b3e14.npy +04530566-4b7642b98790bd4a58a8952c93ff9829.npy +02691156-f2f779b4f12ea6d67209009cfb89d4bd.npy +04401088-5f4c8cb8b3feae768c641604807c82a.npy +02828884-9113be55eb8ddd8ead5067eac75a07f7.npy +03001627-3115864130f4e8188f56c17c21b5509b.npy +02992529-959975a60ae104c48780444eaa02106b.npy +03636649-b2347fe81bd2db6a4b3c42e318f3affc.npy +02958343-460f7950d804d4564d7ac55d461d1984.npy +04530566-491a1618a4891fc73d1328bfe2caad0a.npy +04099429-1ab4a282a803461bf3e918c6494ec5fa.npy +02933112-30675877e822626e3fe047712e43e185.npy +03761084-c261ced82d435328c5b43a3b554f31ab.npy +02691156-87d764f79c2f3af24c2c88971423d0be.npy +04256520-8ce496ed6befb8db78fffc86da230525.npy +04379243-eecddd2b28a9e59866f379f51753f72b.npy +03325088-efb3a634efc20f9a4d4b39461684fdf9.npy +02992529-396fba35f02a9cc9bc1f690a77fffa14.npy +03001627-191360ba29f3d296ff458e602ebccbb0.npy +03001627-cdfe4ea9d00ce861f77e1de7c7a7b6e7.npy +03636649-a654df55875a2104d663817442d5278.npy +02691156-e15f4c98857b67e41e287f9f679ab620.npy +03001627-2b8c678b99f7b2807ea88ba060407992.npy +04379243-45a09b1ce3111e4f22f4fabdf1ee0670.npy +03001627-e916dfe829b5b3daf4b6538438a0b930.npy +03691459-337db7fe63aee7512d97367ba974aca3.npy +04090263-eca3075b0b976054f471dd2a9b3b53b1.npy +03467517-46354939c9eb3e20d7dd3e22ab50af23.npy +03691459-1aa51463dac23d5cc9f08ea7a19d874e.npy +03991062-3f9f732d2921e37781faebbdea6bd9be.npy +02828884-550b7b205e57c3b2315d0535381646e0.npy +04379243-ad26e8e474d42a4a79b3e1be3524f72f.npy +03001627-738188ae01887d2349bb1cbbf9a4206.npy +04468005-83806f7ea055359cd0656aee7124fe30.npy +02843684-3ee8b741d2a93a146faea4ea390b4428.npy +04090263-faf37c99fc99b88ba3e868f66b3e92fb.npy +02691156-f1b407dd7f610bb1a266a0298675ed53.npy +04530566-591d1b833b9ebfe798b8c800ae001b66.npy +03001627-1997d5827caf81df67d783b4714d4324.npy +04090263-4d355e20ad1b6eb6e7da0b4c2db4425f.npy +04090263-8deda7d1c75b33676314c3b6a3a65519.npy +02808440-49e43bbff6765f95d16ed9439ea3f1a5.npy +04379243-3f21494d8a34df8481a172d69c52a28a.npy +03001627-fb381061e67388ba80360680c1602c7d.npy +04256520-4076958da964edb95ff61a3a2a0e2484.npy +04256520-39a922f31e5a93bdc563fcc2752ece39.npy +02933112-7910e29e5285fa1a178e7d331e641179.npy +04379243-17b2481d38b84b334c37b9ce3a3de242.npy +02880940-a83b2eb519fbef17e922c0c19528ec07.npy +04379243-c74bad51457fb0faa0ab1d82ef09f78f.npy +03001627-80415f427a9368227678f114ae956b82.npy +02958343-7db943b676cd86d5729c04438af8eabf.npy +02828884-80d62612758f74d4e8a5546ad55c2a41.npy +02958343-5c4bb9e23c6cd8511371f3c322b54f2c.npy +03001627-a037d4ba135bea9472a38ac2b8f5cd48.npy +03691459-fb6bb656468452fb22d1a40e420084a6.npy +02933112-7e0483b10eb6ae141620773c2aaaa465.npy +02808440-9db2b3689da207ddb9cf447f0a2a43d3.npy +04256520-dbe7ab8fbc9429c2cf40e78cb31675ae.npy +03337140-c227d03fbea989c6ef93db01ab079fcc.npy +04379243-aca4c523f999de86febad4f49b26ec52.npy +04379243-dd0c4018a8b310edafaeb6535dda1ed.npy +04379243-5a3e5f0fff5a7220b4ca2ef8c032d07d.npy +03001627-a6507d76e88e9d68c28a12683f5d3629.npy +04379243-758df6055459cdf6cf58a1b90d479c9.npy +03001627-107caefdad02cf1c8ab8e68cb52baa6a.npy +02958343-c4a2e92c4b79ef3140273d3a78e6b502.npy +02958343-f9f6c13367f93890657766c4624e375e.npy +03691459-e4edc21690f623a35587d8c9be86464a.npy +04379243-174832b73cd6d91c9856fa70a578baeb.npy +03211117-d1718f74c964b34e234c2f2e8f2fe6da.npy +02808440-ba86184fb4bd46a23321831d2245cf06.npy +02691156-d9a263d86ae0fa599751c7a6f15617f4.npy +02992529-725cf43af935ee023832db239383a26e.npy +04379243-43fcddd5232a6021a56e8b79ca4e2911.npy +03001627-a5abf524f9b08432f51f77a6d7299806.npy +03211117-56dee4eb44b2f0e64a6b6d001599a1e5.npy +02933112-4b80db7aaf0dff0c4da5feafe6f1c8fc.npy +04379243-6f1985e1c09aa1be7dd7d23ce6ceed2e.npy +04256520-e3b28c9216617a638ab9d2d7b1d714.npy +04379243-9c0485519f34076a486150a9b7f2cf18.npy +02808440-449e90cbbe310030b983088451bda93b.npy +04090263-5aa0e518413524436ea2d3b1b25fdbb7.npy +04256520-4769bb2062392beb453a4adde9273930.npy +03948459-c045c2df9649384e58da2ab14df356b2.npy +04090263-156dbdcadae5e010337b0188275140f9.npy +04256520-dd4c87420882a7e6dcfceb73ef9b6e3b.npy +04379243-2e8500336964ddabcb51f8085cd316d0.npy +04379243-d1a0b26d98ee4a877fa6d07b5977c143.npy +02958343-863f9284eec4a256e9d8921ebe6d5b8e.npy +03636649-8b60bb548c0813a7e420612cf7bb547c.npy +04379243-bb1ff02f14d1cdd19ccce4c6d5bb195f.npy +03001627-5a3228a34ec0572b4b3c42e318f3affc.npy +04256520-5cc8f84b9b53b30bdfa4ff010b8b9d1c.npy +04090263-9c70690a9d79a4d412a8e5e6e6618c8e.npy +03636649-1b0ecf93a4a36a70f7b783634bf3f92f.npy +03467517-ce3e563f291d1b3311a3eda9aff2873.npy +04379243-e10181e68d41be9a75f27865805fd94a.npy +03691459-6c31773432190681f46dcb5d9d87ce1b.npy +04256520-a3feac5d875f764c1961e650f3cfa396.npy +04256520-447856e1071e8b83c036a40816608369.npy +04379243-65cbf486ccc5afc53002761e7a3ba3bd.npy +03691459-c50c27f14da0f7fb86785c91e1a79038.npy +04256520-ee71654238a92dabddcbda91db0cadbd.npy +04090263-6e0e38455b33bbf7632bedb12ff8cfc9.npy +03642806-e5559cd005d5c4942a7b0c74c5f22fc4.npy +04379243-b7fa4e123bcf7457ab610b0c94236463.npy +02691156-9a266b3a734e374687bf26680c510802.npy +02958343-ba9097cf9c836c0f2a9eb0f146e94477.npy +03211117-795fab6a3c23c0779f8445dce6fc950e.npy +04379243-7cb4211c4a8dc2cbad5067eac75a07f7.npy +03211117-2bb72bc8157a2d8dd5f7c62c7dfe63f9.npy +04379243-766fce6fad5a071bc5beea20858a99d5.npy +02691156-d7a2512d9d8ad4c8a18e0889038e4fb6.npy +03593526-41fcf346a7b3ceb75337cdc4b758988c.npy +03046257-f63ad6dcf847c2f95860148f7c2404c9.npy +04401088-c95b7121b6408df49fda13f2ab6d2b41.npy +02691156-d708c311bcd60e61c9ac656f0c2edc4b.npy +04379243-75f2bc98aecf198974984b9cd0997a52.npy +02691156-f39985959d394f8c863ab010b80d9ed.npy +03001627-631671b636ab97d4da41a38d2e317241.npy +02958343-b06c5da878580bec3c0146ad3ea2d7d.npy +02691156-35131f7ea7256373879c08e5cc6e64bc.npy +03691459-efb33523a6be2e105a31d91ec836a511.npy +03642806-773e395af8222f5a7ade0e7a3afdc8.npy +04530566-c00a8f1dc19a0e5341213ed93def741e.npy +04379243-64ffb47735074fb128ea9c4c28e5ce40.npy +02828884-8ccb3bf7c49c24c0d4d8765e3910f617.npy +02691156-37f251fbd5e094348139630c61d12904.npy +02958343-eef8e5bd46755164eb2d90cf3f6fcb8c.npy +04379243-33b56fcb0b86e914c3bd24f986301745.npy +03046257-dbec11f4a9869cdff51f77a6d7299806.npy +02691156-b2960c2be8fad9dac140e34b6af37a1d.npy +03691459-bda24b02920f91d1887e8faf8f33b0c5.npy +04256520-f2446f65ba438c2119fb4103277a6b93.npy +03624134-b382ba6ce202434bd3802c3145f560bc.npy +04090263-4dff14f1635e9abeb1e00d60b0f9cc70.npy +04379243-7f0aaa160a9f024e492d9da2668ec34c.npy +03636649-2da9d9bea10d936e23c0d2e0152e91b5.npy +03948459-fe6368e73425bdc8ea70d2e1ac81279b.npy +03636649-1ac102f4a452771521e935c3c465f9f.npy +04379243-6d580c3fb8702ceaa864ae08f4e79056.npy +04379243-20bc1ce03f5996bf9ee02475d7f98585.npy +03085013-e2cd4218113ddcfe75b627155369ae7.npy +04379243-188ce43d9c8caabc5213169cc9897a9d.npy +02808440-805f3d85487a6e523321831d2245cf06.npy +04256520-a65534c7545a4b3a19fb4103277a6b93.npy +03636649-b95719df909773fe65d8717db5192d1.npy +03624134-8c2a7aab604336ebb1ca50cbadeab92c.npy +04256520-49d6f351e82d186b366971e8a2cdf120.npy +04530566-9a9bd517b3d9c60f9e23f6fc87a31098.npy +04379243-759cb93134fd5efde76bc197b3a3ffc0.npy +04090263-a4ad8e643348a9ff3f217b945a063dd2.npy +04379243-963f0a74420659066c09be1a24173c83.npy +02828884-66aade9f5d8c74ae924bf081da6f024c.npy +04379243-7153026411fbb33cae685ca100c909e8.npy +03642806-80523db48cdfd058b9e4d514e1e82b2b.npy +03001627-u481ebf18-4bbb-4b49-90c9-7a1e9348b647.npy +02924116-7cb9f004d48454e18cdfa422d76ee8.npy +04090263-339ae95cab075926c1fb6fdac33c3f5.npy +02828884-ec3b32347c823f258c2b40655482a651.npy +04256520-cd9ef0c92376e604963cdf8b01c64c16.npy +03337140-c06792fff0774954492d9da2668ec34c.npy +03636649-89ed63af13b79f3ef42a90fe4baf4591.npy +02924116-2dca337ba2d9d12a0fba45aa212129.npy +03001627-d571022446bdf81ee83221ad0d21775.npy +04379243-c4b5ed6c9ae1ec5e8c54ec820a9ed1cd.npy +02958343-7c421b6417152aae473f10e6caaeca56.npy +04256520-c91ed7cebef758f935836c728d324152.npy +04379243-12fa3eea2b02ab9e931178a47d29b194.npy +03001627-c47f71319ead4eb8a4fb72f4f3b0e317.npy +03001627-4bc5920f74bbf6412acd2bb6205825cb.npy +02924116-f413b641dfdbf6317f8c317a43ebc941.npy +03211117-c2b4ffa6f1911d4cd1ecbd6620e3fd17.npy +03790512-d54e0f22d4604d741f24b86004bccc4d.npy +04090263-be55b1a477c465226f8c560cfa1fa0c9.npy +03001627-330d08738230faf0bc78bb6f3ca89e4c.npy +02828884-6accdfe97ecfa9952056b4bd5d870b47.npy +03001627-1c17cc67b8c747c3febad4f49b26ec52.npy +03991062-ad200681b4a58c30de24f3da4a0e8540.npy +03001627-763bccb675b7439ab9afb6208cab1d.npy +02958343-7a13aaf4344630329ed7f3a4aa9b6d86.npy +03991062-b84f95f09345b864a249f8489bc060dd.npy +04530566-fd255f604c44b9cf497768bbb615071b.npy +02691156-1628b65a9f3cd7c05e9e2656aff7dd5b.npy +03211117-2a08ac484551337a90eb6645edb4567b.npy +03001627-2fa044df89ef13b0e5c1abd833032715.npy +03691459-37992f1a3a6eb8abf398d0c5832df00e.npy +02691156-1cfada8b8ad2428fcabcecce1c335df1.npy +03513137-d8736fc5b77ac6d26e686498ed562f91.npy +04530566-8eb481ee0fa4f55bf9d742d7f0246fb0.npy +02828884-349e1bf46f54c4f267efa971ab69a8e9.npy +03001627-f35abb8246614d7ff38854b09cdc7cc5.npy +03001627-e2acc4d276fda3d77d70172a29ade99a.npy +04256520-75a451559a48b42f6e525b37bf033529.npy +03001627-7182f94bdd17c0ecd6bbf317cb591f56.npy +03001627-fb369c50dc8fdcc5ff2c92c2a4f65876.npy +04225987-5aec8d7745acbca498c63cb68f11df34.npy +04379243-63b5d8f4fcb29b12d0125a4a81c5d058.npy +04379243-7807caccf26f7845e5cf802ea0702182.npy +03207941-276a54bd18473b58703939fc621a3e37.npy +02958343-b6f76fc67324911616abce8cb03e7794.npy +04530566-ec4a394fd782e66b749227c7279794e.npy +04379243-7602875276e42d1990eb1f8a00f61726.npy +03636649-596ac8748f6c946efcb8d8c6d4df8143.npy +02933112-2d1b4c33c0a40653c59350d819542ec7.npy +03325088-7bbfca0420c26d692db5d63410b93a87.npy +03001627-7fc00af759f4382c48d90eef8384210.npy +03001627-5e685e076287215be8f8c11a24c52ebb.npy +04379243-d14a4b797fec250b83768a4ac1607d73.npy +03211117-33083674276c5cf5b07a27512172330.npy +02691156-de5cade3966a1dad94946b454cd190d0.npy +04379243-46a07944ca646df01ff8bce0e3352d0c.npy +04530566-6c2c2ce0215d3f979b3523fcb9cc5680.npy +02691156-d21c556af88582754c3a35cee92bb95b.npy +02954340-61437489633f5d167c35d3c5d3b1fcf7.npy +02958343-fc99fdfd71b5662a669a6bfc71569d.npy +04256520-fefb2c5e88d7e647eaf288f952624966.npy +04256520-6aef3ffcf683005263cc440c7caf3d76.npy +03928116-214ddee55941f803a94b8a2c7c1e5b8b.npy +04401088-fb050aca4d5f2573cf1d3d11d6121bb4.npy +02958343-510df40932e79779a324deea8acbeebe.npy +03046257-d5cf322e44690c0d6030431156406c3a.npy +03790512-104d1e5422e79ff667691228a451173a.npy +04256520-8bf3680dded4772ff51fa0238791f5dc.npy +02691156-73fb8c3c4530ed4bbf3143b1cb6076a.npy +02808440-a0c19e3a7fddb5733178fd967888865d.npy +02808440-f9fe136c1738dcb1ec3cc26553cfa06b.npy +04379243-34d82982f75a6249ccce4c6d5bb195f.npy +03001627-edef00af1cdfbe1419fb4103277a6b93.npy +04379243-debd06d3176a5b728cbb8bac2032149c.npy +04379243-7d0eea8581ece273820018801b237b3d.npy +03636649-ebdc97f5fa29b1dae6597d391ab6fcc1.npy +03790512-c6fbae9bbff2829db3a2525d53af0903.npy +02992529-3c244a5e76cec2cf6f108f2b64e6593a.npy +02691156-4a837740b388aa45d8ff6111270336a9.npy +04379243-669a8114b9a602c2febad4f49b26ec52.npy +04090263-dc9a54a41fbd77314aef47a2c7bc343b.npy +04379243-9e2cb89de5564d7c1dc5f68d8d7e8ab0.npy +04401088-4157af4a11fda8ebdd3d821abaa89276.npy +04379243-1a2914169a3a1536a71646339441ab0c.npy +04090263-4e699ed7d6b3e556d3cd5c5355c4e1f6.npy +04330267-44d882d8627163957a35fac374dd53e8.npy +04090263-f42ef3273a8b4cbbf4f70c928a738b3.npy +02691156-eb43db95d804f40d66cf1b4a8fc3914e.npy +03513137-77266730e34800638d23b8b99c98bb6e.npy +04225987-dcb9a62d5ef76f389da15808191f1405.npy +04468005-8a147e233c90a5d52470de2774d6099.npy +04379243-2642d805c53e243d629f73b53bd7a234.npy +04530566-4fbc7c634bd4488798b8c800ae001b66.npy +03211117-c65b30c8ec2833692d56866e214da3cf.npy +02691156-3d2e10ca9a5db964dc398f7f89f37ee6.npy +02876657-3b956918a41da89c325e6e8eb2c67fd8.npy +02958343-d9838c0fcfd30659d9f8911ce020a037.npy +02747177-3be3e86b2fad511048d5a1386787189.npy +02691156-32edb6ba5788dc12d8ff6111270336a9.npy +02691156-229cd78f9ac3e77c8b96ae1a0a8b84ec.npy +04379243-7722e83d837b5bfcddafe9b591eb9ebc.npy +04379243-cc3cdaa52b4b96fa55f46d55537192b6.npy +02992529-8fcae817c180d5224208dfa1c5fa1065.npy +04379243-7093cec0f1eba67e11f3f1bdf34ac930.npy +03001627-47fc279d7f0c2a492d9da2668ec34c.npy +04379243-5040f8f3e2293db448e116352760c52d.npy +03046257-738dbd4808eec6c5472c1918bd40698f.npy +03001627-c877660e0ec15c0d22be63590e183603.npy +02958343-5c04452276a26b80d97e5ba4dc9a93c3.npy +03001627-643e55c58a248949b24e615f75a5a1bb.npy +04379243-f8f22279842d9b8bfc6d85675a0e869f.npy +03001627-d1caa22978e516655c31590a2627247.npy +03636649-46811f96fdad80cf912acc8c54e7fc1.npy +03001627-3df44d30265f697e7e684d25d4dcaf0.npy +03691459-fc5315b04ff094686d564e28438f8cbc.npy +03001627-2fb9c50ebbd98075ba5342d638d0c267.npy +02691156-e09c32b947e33f619ba010ddb4974fe.npy +03797390-a1d293f5cc20d01ad7f470ee20dce9e0.npy +04379243-e28af7dd5593fe6f820018801b237b3d.npy +03211117-6f3c489407842f81c36ff2417ee947.npy +04554684-ded40c1866a00ea02b5631520b7d94fe.npy +03211117-9aea8bba40aa793d9429f6a938b3978d.npy +03085013-6b8b2a80a834a297590e6ac98d4b27b0.npy +04379243-d7b56f61904aca6b7422d2e1b1d40882.npy +04379243-376c99ec94d34cf4e76bc197b3a3ffc0.npy +04379243-6f934779da945914bccaad2aa3926367.npy +04090263-c18b96da3e1c8a2350780f5a8c844eae.npy +03001627-6e1fbf46f1d0fb73d8cc7a9b2448f97.npy +03001627-37aa434da4ef00038b424343280aeccb.npy +03636649-dd818b0269b1aa15fcb8d8c6d4df8143.npy +03001627-e28a52d8864870b222ed3259ee7e608a.npy +04256520-34e10b72cfc4f36ad8e004adc6acd545.npy +04379243-4f7497a449c2e4a56b9e47850f23a791.npy +02691156-3fa6a05b62169e0d2350d07acbcc057a.npy +03636649-37aac1913201b058c02170c33e00ea64.npy +02691156-7e75688f4b185d4193a78ffd70737098.npy +02958343-9a2854600f24017949b12cf3977a48b.npy +04379243-e18d2ccfd7e0da86bc22c9f90939338.npy +04379243-246b26ca99193386668ae11a7db5e82a.npy +04401088-d932fb5d06d5e4f8da8c8a88ff86c5a7.npy +02958343-dd37570a8876c4a4a513de4eb79b310d.npy +03636649-53ae95290cca57d430c35ecdb9dea035.npy +04379243-7d6102f23f51764d2ed4a731510fb423.npy +02958343-5bab0881b7a18b12733269057ed164db.npy +04401088-c3a90bcecce7f4817b6fd5468f603b31.npy +04099429-d6c905e92a1da84fac912b2d8003cafc.npy +03797390-928a383f79698c3fb6d9bc28c8d8a2c4.npy +03001627-753c5b7f6ee56a77d73237b8afc2f0a9.npy +03001627-c0cdfbbf3a80105fa8699b6183baa203.npy +03001627-2a197b179994b877f63e8e405d49b8ce.npy +03046257-22a1e55050bce5c3b441e189e5a85c02.npy +02992529-25eff75e43287223f1cb19f636b1c2bd.npy +03211117-9c23caf872048374ec8285b7fd906069.npy +03325088-1e2e11043b3d67d76621db2c3226f08.npy +02954340-9c225cd8f50b7c353d9199581d0f4b4.npy +04090263-3ca8b397052d4da818336d317bffd215.npy +03001627-2ac88058053d5c2671a782a4379556c7.npy +04379243-1345a6b69c9e7330427e34fb2aadd7a4.npy +03211117-cc4b7dbffb52fdacaccd68c8aac6846c.npy +04379243-ccec9e173fb41a3323eb3ad3d378722a.npy +03001627-59b79461f64a41c3d225e12279334514.npy +02924116-6934ae6c15afd23ed687ba8afc125512.npy +03797390-1dd8290a154f4b1534a8988fdcee4fde.npy +03001627-f5b08ab02727922b738dd0d3509c7e47.npy +03001627-fb912528e642f6ea7c7cfdf5546967dd.npy +04460130-5bae6e286a9ce96de6bffcc6da770837.npy +03325088-7d44ccb1ef1ddb483321831d2245cf06.npy +03001627-9cd0529b7ce926017dbe6b236c44c533.npy +03001627-b19f85fcd46f456bd5cba62773b8025b.npy +03790512-450aa58cb4bcd8a34d8ad024e30db0d.npy +02691156-f07028f2080aaf4e75b90b083ed202b.npy +03691459-cd451b74570bd84f44dc88afcdcd380.npy +04004475-ac2ea2d41c57d1075999f9ba82d15928.npy +02691156-e039c9760ca026cc6aa3bf023a2b42a5.npy +04379243-3bd1fcc6ef50264112126d1916209079.npy +03001627-c405857cd7d8aa04d225e12279334514.npy +02958343-1c351358afff1cc582e5e3e7771ea25.npy +02828884-32563c1b8b31667bb6695fcbbfeb161b.npy +04256520-5259557e17d437954c90f2ddc14dc59b.npy +03001627-4422c64dffcd8662eaf288f952624966.npy +02818832-b9302be3dc846d834f0ba81bea651144.npy +03001627-a67a09662c39430bc8687ff9b0b4e4ac.npy +02808440-c1b69f70751648a0b362845c6edb57fc.npy +03790512-832c4a316c419228b37378f3c85478b4.npy +02933112-9c87aebafdb4830ba5dc3fef8d22887b.npy +03790512-58705c949dd5d944d9d3572bbd9cf789.npy +04379243-fe7dd4f6b988123bd810b14a81e12eca.npy +03001627-98d1fb12c3354d341e67ee2399c63faa.npy +04090263-d1e786e052c26ed3cfb3f4d4e98ee41e.npy +03211117-13c8048199d8063c6c6253deb0c008d9.npy +04379243-f7dc5f5fde343cc5c955e5ed03ef3a2f.npy +02958343-c41fc68f756437b2511afe12ef4fe731.npy +02828884-39904b25a6d2f13ed4d8765e3910f617.npy +03337140-2ffd2e6d1a55bdf44c3aee8e9d3a6ffa.npy +03001627-5566ad94be22e7b5d85141a9ad5b3597.npy +03636649-ac662716b87687be71e364dec61013a6.npy +03001627-df609533cd186278398c7598b0d2e5d5.npy +03636649-12e8d8176f2bd111978e8f21c8f49a92.npy +03001627-a990ac870ac807c4d838ae16242881dc.npy +03001627-efefba3f45a9e16dd64ad79e5981cc8f.npy +02747177-ada5b924669c5bf4cb2a965e75be701c.npy +04379243-96fa9d34fcb17ff21fc43d5b32fa230f.npy +04256520-d15ccf2af52a95f619fb4103277a6b93.npy +04379243-92fed8fdc8f881d2dfda46c9a34dab22.npy +02958343-a5a6c94b8a93c11b679506fe2f937c34.npy +04256520-855a071aeff2351a593ebeeedbff73b.npy +03636649-c6612c884c025a48f647dc544bb0ab61.npy +02933112-eb2843ff62280f5320768660cf080d12.npy +02958343-acdb7b476fc5a1ca96f65931c8819eb.npy +02871439-80276f2c816c9e2342fe42ef24970417.npy +02828884-99cd1d8970feddbaed98cca8f0ccd5f7.npy +03790512-77e00aae33f3ecb4f5724931a8c2eb52.npy +03790512-f5badefe2a054ff7d1cdd91e6d9c7a4c.npy +04256520-8f4ba17b19d2d5a0ee50221b2a22a6a4.npy +03211117-b86af5698f9a04a4d0d1157c0bfa4669.npy +03636649-e0577be012414515fcb8d8c6d4df8143.npy +04004475-ca6ffcb4cdf260e62f5798686b2c3330.npy +03642806-2926c35f9f2b8c7556faf77ac8662d5b.npy +02828884-51c60589bdd1ed73d4d8765e3910f617.npy +03337140-49c97ea1b6f4d3c9b5418cab1c661a7e.npy +04090263-35f7e2c8a6c9072eb43c84780cf56b88.npy +03593526-7bf1c516ca16d0c02367de4cd267ca0c.npy +04256520-7d4d8e65979c28c1f8d4231017d95f74.npy +03001627-b162f52f6a1ac00e519f3f3e6cd6d1a6.npy +04379243-54b4555dacd9fc16e1eb1991fb37eb9b.npy +02808440-c97d74e85fb248e6bf258aa99523f66b.npy +04256520-9770f3e5ebc261794f15b22cc208bec1.npy +04090263-1d69667fdee51c20e6fe695987d47043.npy +03001627-bb9bc0e6f8ec17bb7b07a77641318a82.npy +04530566-332d072efa23ec9ae89f0d5485194c5.npy +03001627-d64a812bb87a822b8380de241b5e0725.npy +04401088-98eab6b7dee0d64519907bbfddac6b6.npy +02958343-490812763fa965b8473f10e6caaeca56.npy +02773838-e8039f73cf912ff5e8c69fd29511206a.npy +04256520-d54be63f3df4a80aafb1dd61dbf468dd.npy +03001627-866d6243ed67de2ee0a87b67b4933300.npy +03046257-368d9126e2053bd4815b2b467e8e2eac.npy +02828884-6198e40d0055c59fc34a45b74d0027ff.npy +02691156-ac76572656c1e36ea79176d3c96ca1af.npy +04256520-17b1927dbf59786a45b09d36414f81ec.npy +04256520-2bc178dc567eaaa7e01b76a0b6e5fec5.npy +04379243-76f4352b12cebc55685756818b5a05e.npy +04379243-452a33df06b678c6822b5ad61b22977a.npy +03642806-e9e28a11f71337fc201115f39f20d1ff.npy +04530566-6e0f329ced87d7a3c9cfe13d43d30dc.npy +04330267-27e067d588f8fa27ae410fdebd404ac2.npy +04530566-80e8c7703883a40c9e4614310319ea50.npy +02691156-a273a18b004c209c90b1d6deb98feec6.npy +02818832-7afc224d6b6cb2e4a82f8da544827cac.npy +04379243-5b4997ae8d1e46fd16a2b5862518c93.npy +03636649-ac2a766efbe869cdf51f77a6d7299806.npy +03001627-d081ce6cdafa416c8687ff9b0b4e4ac.npy +03337140-bd86234b060b77857a50afc9c93f8a50.npy +04530566-c600a1ae674cb65c335aeab2c20177db.npy +04530566-f89a76e638ecb1aec79d3cf109867c13.npy +02691156-5bd746709adf5b3ccffae3eeba6126e6.npy +02958343-9c846ae63f5fbd9a16abce8cb03e7794.npy +04256520-5e217fd0fd2b1ce7d3a80acddc1093d9.npy +04379243-3581d1bdd22e782a855931d119219022.npy +04090263-3945a1d805dfde6a989c6c7df583f91e.npy +04379243-4bb8e7499f9c5466a341228b21d337a9.npy +03691459-c117b031376d3c12cd5cc02ebe46ffbd.npy +02691156-48fc59725119ac1133de69c9cd670995.npy +02808440-56fe318a9d7fb0503af30a3946d92feb.npy +02691156-b7bd7a753da0aa113ce4891c7dcdfb1c.npy +03337140-205bf6a78db9e112e7ecdbe73ef4323c.npy +03636649-f8bdd98f53fd851ec1537287b5c50d9d.npy +03211117-92e757e989dab6225ad009ac944c169e.npy +02958343-8364ea0a27342c9d16abce8cb03e7794.npy +03211117-bca2b66a9ef701bf585db0bff5175f74.npy +02924116-9178a769f38b01e8245f1bff867e8982.npy +02954340-c7122c44495a5ac6aceb0fa31f18f016.npy +04256520-58915b74af8f69af5213cec267286d18.npy +04530566-2ee1a459db90488826fea6918e74b120.npy +03001627-cb74cf36ff8fcb8d61d7edc67034608e.npy +04379243-192812aa4ad73d2fe6c5cd45aa112726.npy +04401088-645c1b7e5297cdf567b9bb226efd81df.npy +02691156-241648add391b8d54d210d9468aedaf2.npy +04379243-351057418704d299f51fa0238791f5dc.npy +03001627-6b38324cb8beedc5ca86e527b84d8854.npy +03467517-96af19353b4e3f44bc461aab61d7a636.npy +04379243-b1a156c751cb960f270371af13f7e37.npy +03001627-1ac6531a337de85f2f7628d6bf38bcc4.npy +04379243-f9d405eae2dd08fd12439bb9f264f4d9.npy +04379243-a9a618507a691298febad4f49b26ec52.npy +02933112-55b945bcc9d3525be005c5c244da3c48.npy +02958343-72a35a471514d6299e317a6cc797b629.npy +03001627-986e49bd8314d7424addf6a5f8726274.npy +03938244-7d9cb088956a9c4993e60794f9200b7.npy +02946921-56dfb6a30f498643bbf0c65ae96423ae.npy +02958343-14d47aa57151ae4baa93570ec0c0afff.npy +03211117-a6ce00ec813199804e2b01a3e0fd3197.npy +04530566-b3baa99a603abe4415aeee24c2916cad.npy +02808440-5b7d8d0f5c9ac09a5a4742c0584c3335.npy +04090263-9c0a483ea22323c78ca4596df3cbf136.npy +03001627-8f2cc8ff68f3208ec935dd3bb5739fc.npy +03636649-26cdef36773542454d1e14997920b517.npy +02691156-de29a1335c332a5ef7bc9a344bb7bae5.npy +03001627-45c998547946bc4d6a88c250a18c2861.npy +03642806-62b25a5e3119b8409023147b38c03c9f.npy +03211117-f89e49aa0058323d677ccd99bc42875d.npy +03001627-4909c59d7326a2e6217eabb7c57f6292.npy +02958343-4d8a4808e9bf605b11647ffa4306609.npy +02828884-b09f17c66d25a38cf155d75bbf62b80.npy +04256520-52f6fbe3a36a4d1f19fb4103277a6b93.npy +03046257-8c00d87bcc8f034aa1b95b258b5f7139.npy +04256520-1613148b579a747814038d588fd1342f.npy +02691156-2a801b1918ef23f1121ca0b13e917b22.npy +04379243-53afa98f1de6af6d810b14a81e12eca.npy +02691156-26830050c44b5a8f9cf081e9d8a0b57f.npy +02933112-29ce2b045bc6111912de5317fe5b354f.npy +03636649-2ed8dcef657845be4a8e02787dff638e.npy +04379243-89054836cd41bfb9820018801b237b3d.npy +02691156-d1b407350e61150942d79310bc7e47b3.npy +03001627-a5df9c511f51228f19fb4103277a6b93.npy +04256520-61d93b7c3e83541c81dff5c2e57ad46e.npy +04256520-2e17fbc8ae8989911751d30f076514e.npy +03636649-92c74371acbdc4b1b8e1b99345a5afd4.npy +02992529-30d54e046b9abe8bf1cb19f636b1c2bd.npy +04330267-b6a2fb4fba91d35099762eab905e5e24.npy +04468005-210891be5182a77a74b43df14d002c9d.npy +03710193-168b842e1b905547e5ffa6096479cd83.npy +03710193-b079453fe8d3f43ac51268fdb437a9e.npy +03337140-71da51493940abadce5d6e9371bb5c33.npy +03325088-d613fbb4f7e4cf6a9ba4d8847eef9270.npy +03001627-cf80306fbfc886095213cec267286d18.npy +04379243-e1d8f005e47f3a4ead01cc66cfa1fb80.npy +03001627-f1645567130e99a878268642d8df40d1.npy +04004475-70d90d42d01ec9c479dab49a427a6afa.npy +04379243-c613e4469bfeda17cc4256bed53b2ee2.npy +03636649-571027d7f9639bfa7d7103fc1114c50f.npy +03001627-d0fad7458cdb5178d3f6d823f04dd65.npy +02691156-61c804d4751079962df73a6189a3b87.npy +04090263-b0417ea1c8623f189c5408f4f799fe72.npy +04379243-2f1a310ca0fb6b0177e131ed5f0fcc86.npy +02828884-9891e489f1f4dab52056b4bd5d870b47.npy +02958343-191f9cd970e5b0cc174ee7ebab9d8065.npy +03001627-751667777ff0926ab03957cf6f6ea666.npy +04379243-b825cc91b6257e73002761e7a3ba3bd.npy +04530566-8e8a38abbfa3ddec942654e703edf3c5.npy +03211117-d9bac9c418667d2ba62bc668cb34e698.npy +02933112-132185edbe4f2c5fb4c161851ed2b4e4.npy +04090263-3d5bdd3fb1f4ac0e12a8e5e6e6618c8e.npy +04379243-2aa624d7f91a5c16193d9e76bb15876.npy +02924116-f30209622ad392b1dca398a9db6025b3.npy +04090263-6e4a5a5577d06899498dc39a5b1a1c7d.npy +03467517-af4e80985f965bb091437d7de92c7dd7.npy +04379243-5884f7c8367ea46c7c6c78d6efdd12ae.npy +03001627-fb056f0260d4855d36c8b9bf2576aca2.npy +03046257-f82e94171acffa9cb3914c1351b16c4d.npy +02691156-1e9acb74ad09ba97192ddbe75f0b85fe.npy +02691156-afcb946d2d36a77abc0909d98a1ff2b4.npy +02958343-6a737d71a4c4d81958943aeb17f0d326.npy +03691459-361a97dfbbcdd820b182f50d8877b64.npy +03001627-67bee683e394395d84ea893d074ffaa1.npy +03001627-11358c94662a68117e66b3e5c11f24d4.npy +02828884-1480fa8916f31b6d3c77a85180cab6b6.npy +03001627-fd9b63c23342e57045b799df37b9f05.npy +03636649-57dfd0ac5a78c9322f841233486fac2b.npy +04530566-52492bb52701aa4eac05cacef62577ec.npy +04530566-47a07536cc3ff3219c42421cfc900873.npy +04379243-273b31cfb08c2f2aca9e6cd07e5806da.npy +04530566-7400be7b247ce021be99fd8a5f540d8f.npy +04401088-89019c955310bc56eeb3fafe1bc8c07d.npy +04256520-12ae9aa6900536aaf24f0645d0949356.npy +02958343-575266906372ef117cc922af3684d251.npy +02933112-10c14b0cb76f87584da5feafe6f1c8fc.npy +02828884-80ac9f2999087c868c0a51976aeebbec.npy +04379243-668fc6063bd05447e4bf96d5b836adbc.npy +03001627-2fc85613e0c1fd7c6ff6a1869fe2467f.npy +04256520-eb3b29fb1782c83de8a4454323586e35.npy +02958343-95d8510258f7f919c9be4fc52f26b7f5.npy +04379243-4b237530ff7c8c064b2ec20c30ace65f.npy +02958343-df7c767eba9455f651a95aaa6caba1d3.npy +04379243-1c4192bcee62e018a4207c8c70da88f1.npy +03001627-a4ebefeb5cc26f7378a371eb63283bfc.npy +02924116-6cb8d31ae40d5cacef2ffd8d8b11b2c3.npy +03211117-6f7bbbc83183a93daafac0c8d5992bd.npy +02871439-2a9acc146f7310b1492d9da2668ec34c.npy +04256520-9625852787b360bf20900f5b6ea8b024.npy +04379243-f64617385056e0b1beedb4c8fd29e2d1.npy +02933112-92a1e771eb621c14c2a5a06bb7a05e87.npy +02691156-bd48d0beb5d1acf1d2106c9042f1bde9.npy +02691156-5c3e308093e9f287f019a51d1a3b2e07.npy +04379243-9fd065502f87d1f4c2cd59b38b35eb54.npy +03928116-26aefd556e434170fc33ea9eb1363feb.npy +03691459-9403368e6a0bebf5664c61db46dc2c9e.npy +03211117-85d0ff09690c539cfc727671f5682283.npy +04379243-8b54150f56e59a91de9149d4acef1da1.npy +03467517-36145d7338b0dc2040c20797381ee39f.npy +04379243-c7ff0afab4b7885a52160ba64fb535b2.npy +03636649-fd074c0819b9934f73b8ea30c1700f67.npy +04379243-2e9be34fe47802b217ffa9a4ab48724c.npy +02808440-d34d1113a1125ac756abb3039ae17c7b.npy +04330267-83341c37c4f58ebeb3abbd2edaada094.npy +04379243-1c2e9a364b82f14fb9a0f5d18f1ce54c.npy +03636649-ed6f57c8e550c60d39adae6ec56b2451.npy +02992529-d72b00ba0cbe10a1157f4a560c24391b.npy +02924116-71ba773a665447b583c8e6d5420def84.npy +03593526-1c73c8ff52c31667c8724d5673a063a6.npy +04090263-c26b1d42bad81b6397fd8ef0d14ce047.npy +03001627-dec4d499ce2ff518dc732bd0305fe3a3.npy +04379243-ea559127f7f21405372d8d157558385e.npy +03636649-f8534299ecce5c16eaf14273fa406ffc.npy +04379243-af057970729b2cb255182f299fe41fdc.npy +03001627-d15ccf2af52a95f619fb4103277a6b93.npy +02828884-83e7c29954256530e2c4291819b46f29.npy +03636649-981e7c99ee1fbf91fcb8d8c6d4df8143.npy +02958343-76f35efa4083dc6a4d31b03e74c723a3.npy +04530566-87e1eda2a99c713d4fbe64e9d0fe42b6.npy +04004475-d44c19fe6b01e769f040a28fe9ae7.npy +04401088-afa806973174e442ac4f72bf08dc79a6.npy +02808440-357e42ec5c66861cccd0340812259a39.npy +03001627-78261b526d28a436cc786970133d7717.npy +02958343-f9b9b12c6061d32ab910dc0e33e50abd.npy +04379243-4dc3e9e293450817d3dad974dc098fa1.npy +04256520-b6de66042941f5691301e24e9e27a9c3.npy +02958343-389cc4b8b1e28d1770905bc56bbeab9f.npy +04379243-b4b5eedfa5c159e0d4e369d956a06b76.npy +04090263-7b0889c55d482cdcf0fea2ee98610322.npy +03691459-bc611920d1608f96df172f74754804e6.npy +02808440-f37c6c427d253657bbf140c61ceddce2.npy +02958343-c57c11cbcb97f74058c27e607f6e2d4c.npy +04379243-fed87d16ece9ac0ad42ec7e303174a87.npy +04090263-35976b05836b249552c3271e911ffe19.npy +04554684-e66739cb1df7e6e92da2064a99bad66a.npy +04554684-a4773b8eac98c358cc9b47ce449d317.npy +03691459-1f929c099da1f3d890824251c0961f3.npy +02691156-b1dfa9a6274688cd29ba25678ec45698.npy +03593526-3dec5904337999561710801cae5dc529.npy +02992529-9e302a3f21a992c0bb579d1d8d989550.npy +04530566-6824763a090a0b2fd942f20c59bd7ad0.npy +02958343-4a6dea7ffa04531cf63ee8a34069b7c5.npy +04090263-60035e734229f5eb19f2faa30e245eec.npy +04379243-cfa823ee81496f5912b57997414c1d71.npy +04379243-66e49590fed26b4b8a6a1538ac23319d.npy +02691156-6b8bd13bb6c2589db61f9d3f64979662.npy +04379243-2d8fd94c6aeb5be2beafccdad931a74a.npy +02958343-5fb19e8ecfe42bd170bc1eaaf2d60138.npy +03001627-cb1986dd3e968310664b3b9b23ddfcbc.npy +02876657-9e274df011a9643c21ec51d5b72ac4e7.npy +04379243-7e15b41158aa0bf73542594e05cedc89.npy +02871439-c91abdb369f0e2a1933ffef19678834.npy +04090263-226917d478be80f3542283b6fc64a8f9.npy +03046257-4b317124cfa511b7e26be0306b963c93.npy +03001627-ad64210b56ed1bbf9096ff01c3d5022b.npy +02958343-5695a98b66b2b9a9c81ddeca50aa3117.npy +03001627-41f3a12d9f29f204dbbc9440457e303e.npy +04379243-3f94c1aa9254356579b3e1be3524f72f.npy +03593526-65bec5b1e02db6573543a074b9dea19b.npy +04256520-4c044b514ab3e0eb6eb9b08c8a74d159.npy +04379243-50e269a6c3f3b558db19fa16d5cba023.npy +04379243-ad41461d3fa9b483f6bf408264db131b.npy +04330267-e55fbacb7ca1262814de2a9aaff52ac7.npy +03691459-eb8f035d56539657f90555a83c8826b.npy +04256520-3d164c442e5788e25c7a30510dbe4e9f.npy +02691156-6cfea839d3dfe358bc0909d98a1ff2b4.npy +02992529-b9f67617cf320c20de4349e5bfa4fedb.npy +04401088-202fd2497d2e85f0dd6c14adedcbd4c3.npy +03001627-2b1af04045c8c823f51f77a6d7299806.npy +02880940-64b180d51c6b8cc1e4e346ee2650d150.npy +03001627-97131916969631a379a212fc9db8be5e.npy +02691156-e16f9cc7dedcacdb9b0435532743fd43.npy +04401088-e4d794e92cd098d740dec81c6722f67f.npy +02933112-7328b4c001a249ca39d3717288022c20.npy +04256520-ce424dd12ccad62575206c207a147264.npy +04379243-5d30db5c8d27e120a653489f44e1bf89.npy +02933112-14e2319299a434b24b8710a3469971b1.npy +03001627-e8dc06c3d01d6592f4b6538438a0b930.npy +04090263-3ed4ce6dee76fc90180d8ddbbbd9bd3b.npy +03001627-37ec57f6376fce6d19fb4103277a6b93.npy +02691156-2d43c1430df8194ace5721ccacba16.npy +02958343-1ef8f98842f2a388a4dbb766064f8bbf.npy +04090263-f21a0e54ed515d344110c565e849308e.npy +02691156-6e66c96067f3c631ce58b9b5a8f9e3b2.npy +02691156-1c93b0eb9c313f5d9a6e43b878d5b335.npy +03691459-481d17e1ab933142b868767ca39f1cf9.npy +03046257-7e6fd9692405db19ae46613afc6454.npy +04379243-ece7f04700c5767a4cbf9a02e3342127.npy +03001627-9e9e6025f821c2bdb6d6d1ff246c4885.npy +04379243-e2f632abcd84c03ae7354dcb6082ee59.npy +03001627-8f0deb6b599006a22cc460e9d064e57d.npy +03928116-b42a05bd28f090b3ebc1a7ae7c4c250d.npy +03691459-9a37a34c652c33d37b46c73cad9e78ec.npy +02933112-3c1f9b42e848c740c59350d819542ec7.npy +04530566-5b1552a30341a3b27ac692756be9e24.npy +03001627-489391452ccb38e4c8687ff9b0b4e4ac.npy +04256520-8ae5acfaf2b115382d19175e7d19b7cb.npy +03636649-fea629edc206a49529fbb534b2045025.npy +04330267-f65123e8c8b2fb93324d4e93d8b9cf3d.npy +04530566-481e13e24905af01ba1e7c529a2559b5.npy +03261776-a501174de50bc9e675bdc2c2f4721bcd.npy +03001627-effb1b260f100f5919fb4103277a6b93.npy +02691156-8ef4637cb349584420c6a28228acb628.npy +02691156-562a94308f7bf09b8aa0062ef5480a6d.npy +03636649-19d4c28ca3da609a5beaf00da5b709c2.npy +02924116-6b8a93184bd984cc8b89799e9a2e578c.npy +02691156-66bdf712963b9a17efe0d4e1eba2e3af.npy +03001627-2abe8d5b5d29ff52f7628281ecb18112.npy +02691156-b74369cf3556cc822fa1bda037a5a7fa.npy +04530566-bb248dedd82b2f28deed0e4a55ad5dd6.npy +04379243-8cd343b3adf5118d7fa29a3ea424473.npy +03691459-acbcfec18a26c4583247f812f2eaa97.npy +03325088-382b1b947fba964dc1def5c6acc12bbc.npy +03001627-5edb33755a80aded3da27ece6ae88fff.npy +04379243-7eac5c3e4a8e4e086e5b9257c4084ca2.npy +03991062-1dcd1b5af8e876185894318693217d52.npy +04379243-788a2ae90158f42af4b6538438a0b930.npy +03001627-b6d43a52bc2eb8504d5af97121b5f.npy +03636649-bde9b62e181cd4694fb315ce917a9ec2.npy +03761084-eda35c1f6db60a9557b6140a0b345e1d.npy +03467517-bd1705d6d87fc81f6505b7589f976309.npy +03046257-a8b354178a8e4bc5a7e57b3c1c645a2a.npy +02958343-a4017ff2cc8b9150f4d6a46019767b57.npy +04090263-8588b43940114af7eab5ee569c9de1b1.npy +04530566-b093af9dabb14b70cfd826dd468a5497.npy +02691156-87348bdeb8bc74139ebd7d1067b13a.npy +04468005-fd47a012475b88815392bb73ff1a60c8.npy +04379243-7d04f5a75055273af9aec59741c69cf7.npy +02933112-643191e8ee56104e424f8f8e828c9ab9.npy +03211117-ccd6958947505b34f9f3c6290096f50f.npy +02828884-66670424b72dc0beefe2ffb03223403f.npy +03325088-1c684a5a113c4536b7a867e9b35a1295.npy +02933112-a4c79586ed938b5ecd81cf227afdf993.npy +03001627-f58ac8ac63d5a52d19fb4103277a6b93.npy +03761084-400d1bc76504769c1d5ccc40b510e4bd.npy +04379243-1f7ae7a902f453b39dd0cb4dfd5b80bc.npy +04099429-1a3ef9b0c9c8ae6244f315d1e2c21ef.npy +03790512-5e4fe8a57130744dece0b0a75f5fc9f6.npy +03001627-a7f911657d2ac259177faed93fef7451.npy +03211117-f6515d1343e25bab8913de0e5cfdcafb.npy +02942699-b92acfcd92408529d863a5ae2bdfd29.npy +04090263-76fb0e79e77923de9932cdadec1db39a.npy +03001627-c8420e434b1680edaf7c7ad2549a1b15.npy +02924116-b6c7700eb147491883b8b9c448a35518.npy +04256520-359e995834270ead614871b18a2b1957.npy +02818832-3d51b8ad6b622c75dd5c7f6e6acea5c1.npy +04256520-4e3f1e4f1fc88029d028c2e338a88f09.npy +03642806-18fdfff5acc4eb28e2720b34eb9e71b9.npy +04379243-f954f8a605974809dafcfea63f0b694f.npy +04379243-2e3e46e427b45207765ee729adbdf968.npy +04530566-8742b1778f2a6e7deb0cc8797c62d3c8.npy +04379243-dc537055864526217d970cb50eca3a9c.npy +04401088-2435be698167b2167120841458f79dbe.npy +04530566-9e4f7b6ed7936401af2bbb4162e3123.npy +04090263-2f9d017b565a274f2a1ecc02c3ced6bc.npy +02871439-ea2a60c496731ab087ef0846c4705cc1.npy +03797390-24b17537bce40695b3207096ecd79542.npy +03207941-21ee412299f40368df0c25a5c4f4cf31.npy +03948459-4c152610b23bc4db9a6e43b878d5b335.npy +04401088-dea7ce7ab01c08dfd4ea3f4c41b1b9bb.npy +02691156-ce12e8c1a5f5ce1df58f507a9f1e3e03.npy +04379243-370e911bb0313e0cdf76e252f60565c3.npy +02876657-5d6b5d1b135b8cf8b7886d94372e3c76.npy +02933112-663c290dd2e02f03e3f8b005c90fbce8.npy +03001627-40acea1827a81a774f7f6d1fb681883b.npy +03691459-21127c6f6f4a28fd4bbad62bb35c0a72.npy +03001627-a32febea4a0ac30171a782a4379556c7.npy +03001627-69735def3b0f009eb098f5649ee97d24.npy +02691156-4ec2aff45e8c495a667f1f26ed74631c.npy +03325088-2781a072e2645ccdedf1aa83ea962bc0.npy +04379243-97610f0edc786956d5cc62720ec8273c.npy +04004475-142a8e6cf56b63b2f31b18e68eb944af.npy +04379243-6ef3a3de6152b19be513a3136ebdf08f.npy +03211117-144ab629198c837eeeb8d422649e5f2b.npy +02958343-891b06955bdd04a7909e2381adbddb4b.npy +04530566-715699f07f8e59a1620e7892e762134.npy +03001627-e76f7d88022a0bf91b17743c18fb63dc.npy +02691156-d4ed7de4aa7799f066cf1b4a8fc3914e.npy +02871439-e1f316c10167d2a54dc4e0eac00a09cf.npy +04379243-5325e56ec7dcfdfb83130614d8020b3.npy +03325088-5940435f40a189a4b362845c6edb57fc.npy +04379243-db247fa7a6d2ae45aff7c08b060f5ed6.npy +04530566-4e3cd4d3b11584dda70cfb3232f40c6.npy +03636649-6b837caba2f63098360a9d5ff73ffdad.npy +03636649-b9a8cb27dbbcdb2a404a436d0f18c82a.npy +03691459-40f8addfc03b2b1e4d0c24eb0094dc21.npy +04401088-4a81237a7fc743763992b1138bb05b3c.npy +02871439-fabbfb00c3d698a8b022c94235bc8601.npy +04090263-de0bb836ad8b5a24fa9286f039319ff7.npy +02992529-98f0a229291ea982d670fbfea4c122db.npy +04379243-cfd0fa8a6d9ee06e6456cc507eb8f5c1.npy +04379243-8b0f94dde4b772d41ca25a4447d3477e.npy +03467517-3492e05bb96d5c8093f0194265a9746c.npy +04379243-37c76d4830a4968b719d8721fec72f0c.npy +03325088-d0c1d926a69a0d186d0157e3e7a8917c.npy +02933112-b261964d7c920a4cd8a45f471fe2ac0.npy +03710193-12839e81e67dfa88bc41bf82aa0f2714.npy +04530566-4b501c73f3cb02c63438e17bc657daf1.npy +02691156-bd91c1eca592312048464d2edba1bcf0.npy +03467517-8f4b1f242bc014b88fdda65f2c9bf85.npy +02691156-fe00bf68a2cd32b6dd455eb19d4d269e.npy +02958343-f8dc466677c26ac6f63ee8a34069b7c5.npy +04256520-8cba819b9a56da95b91b871e750ca615.npy +04460130-2af6c073f8b0ece92030f08aa0abc03e.npy +02691156-36a5bd4ca6a0b191532d23702363f9a5.npy +03001627-717e28c855c935c94d2d89cc1fd36fca.npy +04379243-d8c35b0ed66cfafa426c7177f78cd656.npy +02691156-6ce399fe42d54815e4406b3bf37e6ffe.npy +03001627-e1791ff04ab8348fdb63e6ea2fd66753.npy +02924116-b5fd5589a7e2b45a550f48125b5f584e.npy +03001627-18fd8342fa5d1d4f5268b70948af88b2.npy +03001627-40e6fb27aeb9c9ab44f999802029a79a.npy +03467517-2028861c76471591c64d0082475b0472.npy +04401088-d51e5d7eae216c9ef1cb19f636b1c2bd.npy +04256520-1d8716f741424998f29666f384be6c43.npy +03325088-1db4071178f5818250da8b99982a3057.npy +04256520-340daf71c78f53ac593ebeeedbff73b.npy +02958343-2254e63f695a1cccbbae182929bb7dd.npy +03001627-4acc9de888c0a73dca6910e4922d61aa.npy +04401088-57056c8f465dd1aec03bc4569d70377c.npy +03624134-4e0f2c48c02815e3f461fcc2f3999efc.npy +03928116-8edcb709ebd1d09e5f3d43a486973313.npy +04530566-b1a080228ad8a7c6eb2c303a0e0d287b.npy +02958343-998aaaf6624deca41548d161b5bc02.npy +03001627-aac5882aff90763affa93170c5cc3d58.npy +02942699-935fc76352a4d5fd72a90fe1ba02202a.npy +03593526-3c70ecd8d8c92f7b2ff65fa033da81db.npy +03636649-33b77c66e1f849b790c4e2a44fddf755.npy +02808440-816cad16553dbb004f2d909c705c7509.npy +04379243-868d86e47bcf7c9d1dd03d3141d85a03.npy +04530566-50ec883d9c1f715614edc3c9b2489f4.npy +02958343-a262c2044977b6eb52ab7aae4be20d81.npy +03001627-3b5364e2f1624ef992979c651b40698c.npy +03001627-d30e58a2361785683fb0851e9bc87551.npy +03691459-77c70fcd8ebcfbd4c83db093c68b1d7b.npy +03001627-c9f5c127b44d0538cb340854b82a069f.npy +03001627-1be0108997e6aba5349bb1cbbf9a4206.npy +03991062-6f4d7b8e06df314531b606c8e4dc32d4.npy +02691156-5e6c986605a2817ed4837a4534bf020b.npy +02691156-103c9e43cdf6501c62b600da24e0965.npy +04468005-1d4be24ba28946152470de2774d6099.npy +03211117-ff512c4ebd3f9e27f08984f51debc075.npy +02828884-2c6c50ead2551d51a0e159a720dabf7.npy +04379243-ef29c3dcc28f4e314785a5d3b6c47521.npy +04530566-43ff0403af233774a245ccf922912805.npy +04256520-227a9255c15c267aa5c25aecef10278f.npy +03928116-e6545f30f7bb6e2115426084cee9d242.npy +03211117-a990477e9c1bcaf4a70518e25ed617a7.npy +03001627-5b9ebc70e9a79b69c77d45d65dc3714.npy +02876657-2d1aa4e124c0dd5bf937e5c6aa3f9597.npy +03691459-792be08647d7e0fdd4221fb0ed444ec0.npy +03046257-b0251e1b5ca130eb50dfe5d3d82f3d77.npy +02808440-673e5bae900225783956bf2322987dd4.npy +04401088-933d5c217d9c01789daa2bf0c68f794f.npy +02924116-f9c9cb740629615426479a182158bae5.npy +03046257-b756ddadd752021b4a9073afd3cb57c.npy +02691156-4bae467a3dad502b90b1d6deb98feec6.npy +02924116-f2e8854ee4d0c7bdb55c3d293b3b9a94.npy +03001627-825bd436471f47457ef29b55d8edde64.npy +02691156-ff7c22a964a5a54e3bb4b8f3758b3c41.npy +02958343-e3b306ad8f7297817a81f08639c57244.npy +02691156-60b5f5da40e0dd33579f6385fdd4245b.npy +03001627-6189b30ed01f7bfa5692a9640d6947fc.npy +04379243-680a106cb0098e7fa71c812e027f94d9.npy +03001627-efc684ff4dc6ff49ccd42a2d6eea63ed.npy +04379243-7813370035ee02eee0c5923879d79f21.npy +04379243-809af89dca17068ea0ab1d82ef09f78f.npy +04379243-e921675e5dddf58b30477f27f55db318.npy +04379243-bce02d42bfab37b2f4f06a8cc0f0315.npy +03691459-fb86950be1b0ced7760a6b24be218cf3.npy +02691156-ea06bef342fbfd4236f3a2343a8221f2.npy +04090263-c92c0ddb2c729589b6dee66cb1bf8e00.npy +04379243-de205371514307babc2e0a60f47fe031.npy +04379243-981f5f50bd8821e8d935bb36a3b0560c.npy +04379243-5b2c4198bb1be0373704a45f4027ebcb.npy +02808440-b425065d760552afb362845c6edb57fc.npy +02958343-17bf28a8d9b5a7ccb5e3401710af905a.npy +04530566-6a43eb690d0157bddeadc9ca0263db5a.npy +03211117-3b188e87ba5f109e377cf79903309074.npy +04090263-42c6d1184ae147ce6e00f130b3bd101c.npy +02933112-3ba62bcd5394d5504c62bee40dcdc539.npy +02958343-900c32b154c0dced994a3466f8481f8a.npy +02691156-e50f001069380884b87697d3904b168b.npy +02876657-3d295fccf7d4e4dfd317c475f024f3b8.npy +02992529-338c3f116cd39022a40276c99b77cde3.npy +03207941-b66bf349bacc035437b2bb75885cfc44.npy +03948459-94d1e4013b9713ecb97b7b911836b479.npy +03001627-1c199ef7e43188887215a1e3ffbff428.npy +02933112-86d1c6a6a2278e7e1b17743c18fb63dc.npy +03691459-40511e6769c91cbcd3dbdb797d2f78b5.npy +02691156-c1260a89eee28413f2acf00738ce9d0d.npy +04090263-9ed0aa906ffae0c26bcd32c43682e841.npy +02958343-10fda5aa525f6232be8100817bfe3c8a.npy +02958343-a9876012922192273a8cad69dd295a56.npy +04379243-cdb13917ddd5fec6f712b42a5a217e5e.npy +02691156-40a828b10b1b092bd208f79049825a82.npy +04256520-7c8dfc67f9d03d02bddaa551be7f3f7d.npy +04256520-1c912a8597962f1514038d588fd1342f.npy +02691156-89f21747e6403735d9e1375411b582e.npy +03001627-77cf4ff8297014faa6fee8e2140acec9.npy +03624134-73dd7fb60dd52b85ed4efc1a1dc582cb.npy +02876657-27b9f07da9217c89ef026123226f5519.npy +02691156-f8fa93d7b17fe6126bded4fd00661977.npy +04090263-d47fb169bef4420bc4e8ec0d6d668411.npy +04090263-18e5827d2cfafd05d735fa1ab17311ec.npy +03761084-81e961930e6ee5fd843f813f752a5e35.npy +03001627-68fab23a050707213436bcb4a3bd19ad.npy +02958343-b5367bf3cb07b8ea593fee7ac9114e04.npy +03211117-4ee9c39b1f77a29a9d5e963395eec7e9.npy +04379243-86e6ef5ae3420e95963080fd7249126d.npy +04256520-5c54937316aaac98c563fcc2752ece39.npy +04379243-40b9f144ea6f35659928e3bfce70611d.npy +03001627-b1d4d7c5aa13b0642a3f8f484e6c5c4f.npy +02958343-72f6c3c3078ef567dfb1ee6a4b12bf8.npy +02946921-ace554442d7d530830612f5c0ef21eb8.npy +02691156-6f72a0d86494b551a834b9c8bfc8647a.npy +04256520-a0646924dec3b2c97348ac642586ce23.npy +03797390-6661c0b9b9b8450c4ee002d643e7b29e.npy +02828884-69ab287543b3a04a7e3b0132a2f87650.npy +04379243-5c6748b094725d9af008d8a3590fb522.npy +04379243-3279edef6a631940ea41b93204b74265.npy +02691156-66ae19841350ac2d4ba2821676102936.npy +04379243-f577193ba408f5eba71c812e027f94d9.npy +03325088-19fe41f0a0b6bee2979c556124bee033.npy +04090263-c4a5c40e5fcd1727a2bf3fdefce3fd4f.npy +04256520-90aa5fb0cac28bfbf91663a74ccd2338.npy +03046257-ea7d8d3f6b660e8f9f1a71e46bbde97c.npy +03642806-3dc60bce3e8d3ece3077dad41839c251.npy +03691459-3490844946e68402e47833b310955a9f.npy +02818832-d52149ba05e9efbfd54014b91baf8631.npy +04379243-1ea28bffca73c3d44b8710a3469971b1.npy +02958343-e4886a4d0c6ea960fe21694bd5f519d1.npy +04379243-b2aee339ca0dfe94de1b0b03ca051f02.npy +02691156-c58e9f5593a26f75e607cb6cb5eb37ba.npy +02828884-8d4693c04d684e61a3430e4fb40c91fe.npy +02958343-68b62b9b9d49f262b12ea83455b0f44.npy +03001627-ed948a3d2ece4b3b71a782a4379556c7.npy +03001627-7e5a6a86dc490f7e7288e3849fb636ff.npy +03790512-4a2f0b20ef680347395d58407f193ba.npy +03790512-f1693f82a326cb8afe11eeaa72c8aa36.npy +03001627-1f3336163f11015c1a7069a11c22548c.npy +03001627-3469b7f0709ed90ac681404257d94ad9.npy +04330267-9a5ece8646e88468877a6b14ac3aa8fd.npy +02691156-9c916b72d9f9f93b9f2700a6b7be99ac.npy +03001627-511c6fc6d3881b4ae43df8c9a38bf11b.npy +03593526-947cf0b19783a119154dddaf2978e13f.npy +02691156-96168894d7331c75acf77e718d93f3e1.npy +03001627-2a5abe261ad074f1c6fca4cd59d9149.npy +02871439-9cef7572697b44ede98e4da245e0b83.npy +03001627-19f597c6dbff03c114038d588fd1342f.npy +03593526-a317ac0956d4e885535deb3b0c692a2a.npy +04256520-b337556f36a5e1bb9a2041f674671d05.npy +02691156-fb68077d405c233ef879f4163a3ec7b.npy +03001627-1d1b37ce6d72d7855096c0dd2594842a.npy +04379243-b1a1d78a2736dc2755f46d55537192b6.npy +04379243-33b9bc49338800e87dd2ad68f72eb830.npy +04256520-c9241b6f755e7134f564f8e3eeb8449e.npy +04256520-b6cbabb92f1d0965de85c11d95003a6a.npy +02808440-3ffffa5a05b2254d4ee769ccec97aa83.npy +03046257-4af34d709f39ab8e76460fd7f97d7f44.npy +04379243-e69dd1a9bbeb62523002761e7a3ba3bd.npy +02958343-e20b8a9c388eeb012c8b6ee41d7d5d62.npy +02958343-2961e679a651dd5ad95ed6bb7181c98f.npy +04468005-d985e5c98e8a97989954eae9164faecb.npy +04379243-acbc99e153b9d4d419fb4103277a6b93.npy +02691156-c1b5dc92221bcdad5fc84bf2b9ef981.npy +03001627-3d390c6f1051295d9501f2fa226917d0.npy +04530566-6c687a500aff678ad83f267e8f0b536.npy +04379243-4d3cc502d4444c848cbb8bac2032149c.npy +04530566-98a9c16aa2c6030f7d962e3e9892f8dc.npy +03001627-179b88264e7f96468b442b160bcfb7fd.npy +03001627-c5958d1f079b0be47b8e25a5db8c2573.npy +02691156-19e2864af4f6de438050e8e370967931.npy +04379243-61cb695902f7905e7afed106527393f6.npy +03636649-6af800e7bbdc5f21735ea0e092a805a.npy +02933112-e16c0191973a25f02d63c890dc92b5.npy +02691156-e3de366a0cfb59ed38294c37c250d7cd.npy +04379243-e08d1cd0dc7dc73db9d7c2fc41e80228.npy +04090263-cd6cbd60e8f7cbcbe378cd9d51dc5be0.npy +02691156-bf93f4dc64eff22b4d4cb1c2a5e48b7a.npy +03467517-b35e8f73d68885059e25703eed62525b.npy +04379243-b0d7e13b20b190afaf1a814fb0f45a9.npy +03001627-9281f52d6c5908987ca6caab209ed3be.npy +04530566-99b36b2d2174f061ff8f632f1c753803.npy +02933112-9a2c9e5bda713668674056261e8e6523.npy +04401088-2fe4f1ea84cf924ea4d4dcdfc6fd3059.npy +03001627-4566839a362c5c223ec13b32c4d64f06.npy +02828884-10a66ce0a6b469d3b2cb19fcedc32ddd.npy +03001627-1d7fdf837564523dc89a28b5e6678e0.npy +02958343-ce63abf6d78ea5bf4f39b2731f699e34.npy +02958343-b8cee2711b84bebb425b2c354eccabaf.npy +04256520-ba5cc31429d4c97479c67f086ffdd34.npy +03513137-d25312c53aa9ded3b57cb9238c4c8e81.npy +02808440-259a1fec7969d3e3501f3c19b1676682.npy +02691156-52ef4ccb24accbb295673ce3194af95e.npy +02876657-ab6792cddc7c4c83afbf338b16b43f53.npy +03001627-ec9f1fc13f2e4ae2c3bd24f986301745.npy +03211117-a6fe1a137c076e51d404da78b2c36d5d.npy +04468005-d76e81f2dfc3ad9162c75ca00b8927f2.npy +03790512-e792c49e0e4b2872d83cd5d7c4553c91.npy +02691156-8c6ab402ad29ff5c3b9dffcb3e0245d9.npy +02691156-47e48c70040beb9c8db97d9bc169245.npy +04379243-41264bc3d705a6c1cea003eff0268278.npy +03001627-8f226d6b3089d3b7bca860dd9b04c52c.npy +02828884-e31212e9f9f5888effd5817f210f277d.npy +02924116-eb5b4205ad06d6a17dca29b91e24dff2.npy +02691156-b481294a2692419cba5f6626ebfdf87f.npy +04379243-1a9bb6a5cf448d75e6fd255f2d77a585.npy +04379243-328e8b5e3419c66c493f7199d76f57a.npy +02808440-450fa1bb2cc0ee578c0a569dc2eaa6c1.npy +04090263-8872698c6eae3a8ffb8c26d5226415eb.npy +04530566-34b77143d6313e3f717ad2ef4c4af2e5.npy +02958343-2faff2861e87020a4d9558e8f1b57178.npy +03636649-e15960ae59486c464ccb9dd377d00737.npy +03001627-2276d36a40335c19215045784774049.npy +02946921-fcd14e7ad72bfa70471c65fdb52b88b2.npy +03207941-77ddd857eb3c1460121859336e292a5d.npy +03001627-5af36cc3a98642019fb4103277a6b93.npy +04401088-467ab7ee9487525b13e4f8e4c4578272.npy +04401088-61424998613d67b75ef3453134070b3.npy +02691156-b3066d613364710797020a1f4453e3a4.npy +02958343-85d04dc3f455bc56ceb5044e1e1e9739.npy +02992529-bf259988d2e8728c391790b8b8084f0a.npy +04256520-c53ec0141303c1eb4508add1163b4513.npy +03513137-57ffd28975abba38480514d7f2edc0a3.npy +03001627-557542994c02cffce83221ad0d21775.npy +03642806-b14ceb94c7930ee55054cc2bc9eccddf.npy +03636649-9b7d490678f2c9db3d2be70e06ed6b30.npy +04530566-49075ee8db9d66538d1140748efc85ed.npy +04379243-40b55c0578228337f521e1d72c94993.npy +02924116-1ca19240b42fd2f049d40c74f2720fb1.npy +04530566-d3de6c76e6d96f7fc5fc3eafa9cdfb3f.npy +03467517-6ad792f9321dfb82aa0c867d5b070a5d.npy +02691156-d64caea6c332861bcc14f1e6f4f4f49b.npy +03001627-6e21df8cb8db3819899718fd4553951.npy +03593526-4d392c12240cfe352150a45ec52bcbd7.npy +03001627-a919152f07e9e0d0fdef1c01cbd4ae0c.npy +04379243-c083552372e71f9c7ee217c21e683487.npy +04090263-2b44f7b45ac72b24683e3750b53385d5.npy +03001627-7e097351b98060b8a8dad913bb47fe00.npy +03001627-3ae2857e04641093b0957d845ac33749.npy +04401088-6b9cd9c72e69fb81d8630b8390e34e0d.npy +03636649-f530508e27911aadabd4ed5db7667131.npy +03001627-4f467dcef4a710a5911016bc0ad99a16.npy +03636649-b8350fcf08ff0b2ca950bf8f33cff658.npy +03636649-d378c508566d68cb48d2aef7552b65e3.npy +03325088-83c9c0a13e3bb6c76c18e71fd49c4dc.npy +03691459-18abbf4da8320e69438aef443c33bffd.npy +02691156-32a547e29d66132110b2a26d47842033.npy +04379243-28912046d42946df7db48c721db3fba4.npy +02691156-ded529516b4362c9f019a51d1a3b2e07.npy +02933112-7a9feaea9793b570fc9d1bd1b5b90d13.npy +03593526-79a582343eece9c645c7a8e7c70da8b1.npy +04530566-f7f62b9657aecbe77f00b68989ad3ebc.npy +04256520-9a1b39f920863964b3c42e318f3affc.npy +03636649-aa5ebe13f6d51761d197f67767b32741.npy +04256520-dbbf72729fafaf3737f67f4322e8d3d0.npy +04379243-d7da105cbde6ad8ad027f5769c5504b9.npy +04090263-509f0edd2fd65d5e213f0776ba8707b3.npy +02958343-3a48188e012364f8921cb81cb1632a5e.npy +03001627-74c06950e3f8d25157f40ff86fe708ff.npy +03001627-2592e69aaa2344292463e74275a0e3c.npy +03001627-cc1b4eb1a9164e04f06885bd08de3f64.npy +04379243-9e99421220d92f1da8699b6183baa203.npy +04379243-f00992135ebf50a9339797c21e8801b1.npy +03691459-c3733b26c3fa23ce2633ff66beb9cf31.npy +04530566-1a2b1863733c2ca65e26ee427f1e5a4c.npy +03001627-98e1936d3f25389bc3c6a889ee0bd115.npy +02992529-8da5c29d14a1003d23247d005da93d43.npy +03593526-ffc7e98720e71017b3878cedd8c8fe6c.npy +04530566-9ac6483c969f1120b05dfc874f00d5f3.npy +02958343-99c2ddb7e6169412cb9ff477a2867fc.npy +04379243-765d6e5ebce3fe25aa11adad6b2a69c.npy +02924116-a3601225009a1f63481aa8b5531c68a9.npy +02691156-4ad92be763c2ded8fca1f1143bb6bc17.npy +03001627-7aabc57856fc6659597976c675750537.npy +04379243-fcc5717aca6a3be188bda5f1df0be8.npy +02958343-1f167c74bca9ec83622a8f038ee88042.npy +04256520-8ed3fa69c808741a42e1bb4fe264125f.npy +04379243-c68407d2f752ae71ab2bcc3443271151.npy +02958343-3ea2b72ba08a2e8097df6383472cc5b6.npy +02933112-be4c2bb409fb8374b5f72e2923ab992.npy +04090263-6aaca4e199c1f84f1087ca95a9795303.npy +04004475-4c7a10fb9bf4905d983ec12a2b33f18b.npy +02828884-48f517497df57a2c2056b4bd5d870b47.npy +04379243-940dc92bda153346eaf14273fa406ffc.npy +04256520-de4e483a1587da9fdb24ee630144f57f.npy +04379243-83e669596e491dfe20070923ea969bd1.npy +04379243-35f7655867f9223d82db9fca4b68095.npy +02958343-83098846c82db490a00a2bd11cd80551.npy +02871439-b7b5978bbb72747f9a2615537bdd5695.npy +04379243-2fe5bbb0df6925d1f12d7184a2ad3430.npy +04379243-1db1bfaa8eca186e9295484d295fcc9.npy +03001627-2de10784fa2655d6ad01ec966c80ac91.npy +04530566-573c69987f0508d210572d5e96d039f0.npy +02958343-4a423ae9a28afe3588cf40718544e7cc.npy +03001627-4f24a67f85e71e144719088c8e42c6ab.npy +04256520-55e0dfba8cc226871b17743c18fb63dc.npy +02747177-af7a781f08fdd4481faebbdea6bd9be.npy +02924116-8df1feb988e51609db7aa9f86faf9bd0.npy +02691156-802cbaaf1a51cf38c863ab010b80d9ed.npy +04379243-fe0a8440aef8f597a6656391f7752a4d.npy +04090263-c42ca534ab455a778625e5523ac2ce12.npy +02992529-2c03ac9bbb3d918411f02c4c36ed7f25.npy +03211117-19a4584a4d29778a78585e33b915d9a5.npy +02691156-f24daae76836e249f0878b58b4e887bf.npy +04530566-cf254a334ba1af0aaf96425967f2d458.npy +03001627-516c4adba7205cb43e9bdff70754d92c.npy +02691156-48c4e5e2c2dfccc7a68efacd2d601104.npy +03636649-4aee1567027d9dd14357a62465045ec4.npy +04379243-bdb5a2a25223d1b645613f5c2df1029a.npy +02691156-69d7ae2143c2a2709c6df67fce5fa25a.npy +02946921-788094fbf1a523f768104c9df46104ca.npy +03001627-18e5d3054fba58bf6e30a0dcfb43d654.npy +04256520-1670f9ce4de8a548d08f8c5dee475682.npy +03928116-c554d50fe22d9fc57e8f7075286950f9.npy +02958343-f044724a6fb07ec73b294ac02412e874.npy +04379243-1671665cd0e2ce05660aaee3010d2fe2.npy +04256520-ca6a71e5ad6e8964ad33b69f9597739.npy +03467517-4b0c7381c4f2c5bacc34b900bb2492e.npy +02958343-a4d535e1b1d3c153ff23af07d9064736.npy +03001627-70a2b281cd8d59a52d19175e7d19b7cb.npy +02933112-3106e06eb594238c59350d819542ec7.npy +02828884-2731687dd460a263d8eae9bce48bbeed.npy +03001627-632bc741220bd52e51c4deb11af7079e.npy +03001627-d528a94f72c994f3e8e5fd5b1798c97.npy +03636649-69762de7892483b64fa8d6439169bda4.npy +04401088-b490aed1d7d9a42ec4e2c9b051d6a014.npy +04530566-6367d10f3cb043e1cdcba7385a96c2c8.npy +03001627-66a36dfe1cfd2d17b40f0ac0fb9a650d.npy +02691156-61fe19a62a786c96950d2b3eef73a70e.npy +02958343-491653e537f1a701697b84068abf146c.npy +03797390-8aed972ea2b4a9019c3814eae0b8d399.npy +02958343-e337e9940356e866b82298c7ee2fcc7.npy +02958343-5389c96e84e9e0582b1e8dc2f1faa8cb.npy +04468005-5dd69dea0b94b9abb216fb38ac0eb009.npy +04379243-726ffd1d94bf5c0558df8eeaf3dad1c.npy +03636649-50f14b490f3f4589f51f77a6d7299806.npy +04379243-fc9910fa6262cd4e1125c64abbb51ddf.npy +04090263-791efe6841d0995a1d9b004d9d8d2781.npy +04468005-40fcd2ccc96b3fbd041917556492646.npy +03001627-c043285da4600e168a5e49d8f4867e8f.npy +04090263-3238588ed960920c400c7ace1cfd742a.npy +03691459-b8b54d43aabf84a67aec59a4d1722658.npy +03325088-7ade4c8d7724e56b76d20e73c57c9a03.npy +04401088-d050f7389538de04ae0591d02e40f07b.npy +03046257-b750e23ba662cb4fe0865a0bf86de287.npy +03001627-9b8f69874b502bc2742728b30848ed03.npy +04379243-ffe4383cff6d000a3628187d1bb97b92.npy +03636649-b2ed0a4a8caa5139295966c2452536a6.npy +03046257-a1a8a811f5260ae675aa7f24a9b6003a.npy +03001627-9e19e66686ed019f811a574d57de824a.npy +03636649-e9f83f1d54e959bd35836c728d324152.npy +04090263-f8a772a405e76adcf02ee453ff283e26.npy +04379243-8c0999396ba60e758738e7290b6f3237.npy +02958343-7f0f750d6ca959b6ac5eab1f4e9b0f1a.npy +02958343-ac85727971fe63dd2c67ef33d7521ade.npy +03691459-b8410a2c19a50aa88b04a17db360913.npy +02958343-4dad98955a47e81a8b3877a62f2cbe1d.npy +04379243-e8599df1d0465e3811f3906fc1b00350.npy +04554684-6bb2e6f20f189167d48855885373053b.npy +03001627-d2a48ffb6d25f88dfb0eb7e753c06942.npy +03467517-71139bd2ff6c4257280ec2e5049bb369.npy +04256520-8ce7a3ce304220257c071b4859b99983.npy +04379243-98feac40e78b92bda1fe796dee2910f3.npy +02924116-1b8d1c5d1b463a23193d7855ecfc1bd3.npy +03001627-dae8b3ac69d80cf1b94e60a139ac4b1c.npy +03636649-a8d6e75a7d2712f3fcb8d8c6d4df8143.npy +02691156-3e4b522e38ef9a781b5928ecfc4b0684.npy +02691156-4204361e3781952a8e951223a21e1fc1.npy +03046257-78b20642a66f421630cd51d117004d92.npy +03001627-3421ad5a45b85f7a4b3c42e318f3affc.npy +04401088-27f7ab052f3fce42b35f223cefd97829.npy +04379243-48baef3ab18d2d43d2afe8d5254a0d04.npy +02691156-5f6b6f649b419cea71f4784575c35350.npy +02691156-8fe406a829c40c933b353a5057e248f5.npy +03046257-c422e03b825d5e0046043f7519b6b4c7.npy +03467517-6a2e66511506a517a716de2121565fe.npy +04256520-c29c56fe616c0986e7e684d25d4dcaf0.npy +02691156-5454ef3f1e0367f38f92ff0dbc52d7eb.npy +04256520-1908750cd67208e0c4f370f57df9b202.npy +03642806-11654b536fd6ed67616b0fada7303ece.npy +02992529-16ac60220ed738901cfeae953cc2339d.npy +04379243-2563d1fd68ae9d77ac803318d4b3b4b2.npy +03790512-74a3df7e06713f4a48272812609617e2.npy +04256520-304db04f545f53b021bdbc0445d9f748.npy +02828884-bbdc34eb50c32ff7c6e70747a64ccaed.npy +02958343-7240a21ee34bef83dd141480e2c154d3.npy +04379243-d256323d2b756b9e76bc197b3a3ffc0.npy +04090263-8bf221c8f17b152b2607a47034bf62a6.npy +04090263-4faa63f17be98cbf1389e18ca61056d3.npy +02958343-d9e58ec3ad748aae2051f6248df99d19.npy +04379243-d94de64641651a2079b3e1be3524f72f.npy +03001627-d324baae6630d7c8fb60456da917147.npy +04530566-37ea55e2d023f9ae9588e71e21de9f30.npy +02691156-32fb1aca48b3a0d197eae247c9b1df47.npy +04379243-fcd4d0e1777f4841dcfcef693e7ec696.npy +02958343-cd67376cac9f989151008e496c6cfd2e.npy +04330267-f490138e211ad6e9c3c11bfa5a6c7ac9.npy +02958343-c6b98edfbb65320654b49557f8ea8b42.npy +03211117-be89d32290b9dd4aba27b59766aaedd9.npy +03337140-474fb0ff79e036b0820018801b237b3d.npy +02828884-639dd737961f1806985ef0bf52b97bf5.npy +03001627-d015bbb45833955537b2bb75885cfc44.npy +03691459-7317a113f9999e28824aa039bc530c36.npy +03797390-15bd6225c209a8e3654b0ce7754570c8.npy +02808440-1acfdd86f8d48bb19750530d0552b23.npy +03001627-834fe65aac9ea9bce589b08489d157d.npy +02958343-56b6c950f4c5de80ce27281f3b76d1f5.npy +04379243-3dafd09d21c9ca607d55378e40c7c3d9.npy +03691459-3575177296452c98f149a4641e0b7067.npy +02691156-efbf3d4c8877e7dc7ce8c809505eca2f.npy +02924116-f4e25d681ad736eb52470de2774d6099.npy +02876657-44dae93d7b7701e1eb986aac871fa4e5.npy +02958343-3c1ecfc2dc88c1919214bcda3ade39f4.npy +04379243-6571fbfba919ac76eca66eeb3eb4982e.npy +03211117-f3ab112671b02010be54ae8147665701.npy +03337140-84e7061f807f8f7e91c352d02061b3f7.npy +03467517-5e452914684ea7fc398707f20de9db08.npy +04379243-11f1101ba2e29206cc963bba1556032a.npy +02828884-9897a75c64a369d458c73770090b865.npy +04379243-49dfb00ce7ed1602b05fbbe21a0097ea.npy +04256520-983f0b9bf020010159f8e31ca87c470e.npy +03691459-3e21834bd08c078963de47aaa413f122.npy +02818832-9249fe17635540b594ad6c58a4781766.npy +04530566-849c8b9c0acc91b6ed4404549c4013f5.npy +03636649-d73b4313372ca6e1a6a7b6e78d8d5bcb.npy +02828884-e01c283efd6a0d2120d53ceb96ec7d24.npy +02958343-2ba7ea78b9b6e2a6b420256a03f575c0.npy +04530566-9e653d3b0b8f8c6b28f998b2aa4c5983.npy +04379243-c3134ae6fd6691d7db039d8689a74349.npy +04379243-e6bc7735ed67822e60a09749bdad79a6.npy +03001627-3276361e9e651238ac4ed5495364a497.npy +03761084-87bae84777fe8b702bac1bcdfc2402d2.npy +03636649-d6db6a800c1ac87bcd783766d090e665.npy +04379243-e36e90c1db6bf1d5470412e9b69c8933.npy +03691459-c7d423c4d63ae4dfa5bf0df4639be0b0.npy +02808440-62f4114f43f07786b362845c6edb57fc.npy +03001627-badfcd24d9b640fdf74aae127b28c047.npy +04090263-99001b28e4fc6bdcfa9984f75a870c1c.npy +03759954-5889d83902a9c2c478a2ccf0e4d84b2.npy +03001627-9f8708db66a4ff07f4b6538438a0b930.npy +03624134-171c19d5205fb3291fc43d5b32fa230f.npy +02958343-1166b049a7230db9f50f5d46dfed0533.npy +02843684-45c547298f85241b959ad2f80f4dbcca.npy +03001627-cbaca6a6edfa2d512b520984c067934c.npy +02828884-ba58fdaae9a5520b421b60451f2f74f3.npy +02992529-68b80d0086322ea33615136d92a66ba2.npy +03001627-7b5b032a2cddeebc54d7082b34825ef0.npy +03467517-ef1c22bd3b74953689f0379846507dd3.npy +02828884-5d88fc00adb325e6f3a134eb65b35f7a.npy +04074963-7852a457e59fd546d26c2593d1870bdb.npy +03046257-5e10ee8a39ff0e519f1a71e46bbde97c.npy +02691156-136c2b868c5326dbba5db366aa3ac475.npy +02871439-1d3014ad5c35944f9af68b4b3261e1f8.npy +03761084-4ab6c77bf27d4c86b8776ad71dcaa161.npy +04379243-a145bba4e4409bcac905813b9803ef0d.npy +03624134-b8fe56eeed3951392f98be9d5bb04d17.npy +04379243-614f1c6f5e0d2372ef5f18853edea926.npy +02933112-975884e7d9cb74ff39974e6e2bbe1adb.npy +04256520-8c69c0bafdf91e85c05575120a46cd3b.npy +02933112-9b34b5983bd64409e08dea88cca8641e.npy +03001627-e3b625f979f3a32fb591e8fb800990fa.npy +03642806-7df09674bc991904c78df40cf2e9097a.npy +02958343-7c72e179b251171d4d1780ed2b3fe073.npy +02880940-b195dbe537993945e4e346ee2650d150.npy +04256520-a409a2548e7cdac7febad4f49b26ec52.npy +03624134-c1ab7029de67351cf97a65c35ea619f0.npy +03467517-d685415d4fcd3205a24eeca91f583600.npy +04401088-c3c5fd4ce226ab0c4694b8455e89054.npy +04379243-ac965c2d5c68551be6c5cd45aa112726.npy +03636649-a5423069e30181a019655a581ade300e.npy +04379243-2cdbe6c91dbe4fbabc7589eefbdbc3c5.npy +02691156-d0ab3ed71a4ac9319d1eb836604648db.npy +04530566-feaf5c41e664348220dfe072b77502f8.npy +04256520-75f69b9fc22c4c04eaf288f952624966.npy +04379243-7dfa5642ccc2b8fe5e2a5c16927ff414.npy +04256520-4264fffd38596e3a60f888b4e2fd3e4.npy +04530566-ac5dad64a080899bba2dc6b0ec935a93.npy +02958343-906e2e532b7156b612be63c74304797c.npy +03001627-323f0787810ef9a285a030bdc6cb9884.npy +02958343-ee975a7e62edc7996a2345809e2bb169.npy +02871439-b6264b92d0cbd598d5919aa833abb5a.npy +04256520-c88d26d20803d385e8f8c11a24c52ebb.npy +02871439-f6c0d095a49f5880fe1a61f05bc63860.npy +04530566-e3206eef4da407e7c08fee43ebed0bfa.npy +03046257-c74cef5d18061c5b5dc7f4502a6f8c8f.npy +04379243-eff2f84104e78435d6f4cef762589739.npy +04379243-bfab799cd63b345e232dbd6edd2fe625.npy +02828884-338fc00ee5b182181faebbdea6bd9be.npy +04090263-75008b972144b426b8eced526ddc241c.npy +03001627-18f2f833d95ad137111c729c2fe5f751.npy +03797390-645b0e2ef3b95979204df312eabf367f.npy +02828884-a1276733811a864b99cb1d062b75ee73.npy +04256520-c5380b779c689a919201f2703b45dd7.npy +03001627-c0689f191df5cfe1c785f06f424b9d06.npy +02958343-23bfcd49917919006a34aa94ca8a3355.npy +04379243-aea8be27a9e5dcec1158f00955d38a.npy +03001627-331ddb6fd9c333456cbf78e1e89022.npy +02818832-ac97ffc6b6ef238382c3b56998e08a4c.npy +02924116-60c830af5fed1ca5193d7855ecfc1bd3.npy +04379243-c2a33328b7df204e1754bd6e58ab2748.npy +03991062-3f7d866f4e28e8014b3c42e318f3affc.npy +03001627-4300fb717f89c832d42ec7e303174a87.npy +04554684-5f8991a5039ca4385c8adc541f88498.npy +04401088-71240556952395e0925bda4660525f97.npy +04256520-23e7767edf2f861e58c75a3520cc91a3.npy +02828884-9663627be99d2e27d2b12aa6a0f050b3.npy +02828884-fd2394a5f4d05d4c331bc7630c8705e8.npy +03948459-2137b954f778282ac24d00518a3dd6ec.npy +02828884-f3db005b33b9f8916cd47ea628d8cef0.npy +04379243-c86d75f3408c7ab5a6b3538efbf4faad.npy +04379243-b52f6dd58875030ead5067eac75a07f7.npy +04379243-51149acaab6049d05938488ff499d96a.npy +04401088-dca3f5a8ab0b850c8c8e7e9e3310fb01.npy +03691459-f0d27525fa81798d982acd4b5c0a58b0.npy +03593526-ed3c75975804636e34a8988fdcee4fde.npy +03001627-f9c4baf01dbe6c488616812464c86290.npy +02691156-256626ea73837e032625b83fa7422e2b.npy +04256520-b64277db98afae7f8efae927921987d4.npy +03691459-2dc57057c96ae0f74c24a2a9e289662d.npy +02992529-ef2b505068cf120efe48f52a0ccc160d.npy +03593526-3304e9400b2d610a69eaff4d4a8a103.npy +04379243-cced836d07325938f51f77a6d7299806.npy +04090263-511dbae3805dad80ab5938f464bbb85a.npy +03636649-f673fc77f397a061d49b2e04785f8492.npy +04379243-bcdf93ab467bd7d84fb315ce917a9ec2.npy +04530566-4f8e847d3453f2f17301f2b895d332ac.npy +02828884-7e8caf5bf2eb1a61ecaa3c66b0328b42.npy +04379243-2ef28aca6afaff1d88863f114bcd9f80.npy +02871439-ec882f5717b0f405b2bf4f773fe0e622.npy +03790512-22ae98e613bb8e188249f134aca4c817.npy +04530566-ec8d021a7d3816f2e46fe97e5f3e2c98.npy +02691156-571cfb1da3d5b3704b5910188444efc8.npy +04379243-9c12fada31224bdf58c4e7e56d799d97.npy +04379243-31c090b23f52bb61208c8c852ee795bc.npy +02958343-21a1f2a7b7e671826405999d829064fa.npy +02933112-9b1175f3e0b7f0938ab7e957399ebbf0.npy +03337140-a5626b08c059654b4c3aee8e9d3a6ffa.npy +03636649-f567bc1dd416ebc9dcf2183c858e6e5.npy +02880940-5bb12905529c85359d3d767e1bc88d65.npy +03790512-1e664c94e932ece9883158c0007ed9ba.npy +03001627-c24b79602fccaf603379c738ca193530.npy +03636649-a48ee5668d042342eef5d83b671bb264.npy +04530566-20286f6d7aa7a853b48c6de5e38e3312.npy +03691459-aee6f0ef9f8a7c13b54cfe6aa07c2036.npy +04379243-460a915796f36eaa55f86bb3ad320a33.npy +04090263-e53badb78702d54e15b3bff1113c0f8.npy +04090263-568728cb599dc18880c2e60c312b0f09.npy +03001627-9eecb9726ab34ae0492d9da2668ec34c.npy +03948459-6fafe3b82e6e07de460c5cf20e4c5e41.npy +02691156-640c9b76fd75aa94d13ef00338ba8c52.npy +03001627-9a83000e9128d677b04cb542e2c50eb4.npy +02691156-49aa625393dbd1a4d443895deb2f03aa.npy +03593526-bcf5a4b764ddeac759f9892433e1b1f4.npy +04379243-a927b0088531dec823500a5b036df62e.npy +03759954-fa06eacff134fbcd59a6208793b9dfca.npy +02818832-75b74fce7335d1122c1fb51c278f01a4.npy +02828884-24eac2668c9f241fd2b12aa6a0f050b3.npy +03691459-2edb8ba1a031b3f5ce029fab54b6cfbd.npy +04256520-f144cda19f9457fef9b7ca92584b5271.npy +04379243-9e3586331eca79e48a5e3400c9c8f4e3.npy +03211117-bdde8a0134ad5283340f0692b6ac89e8.npy +04379243-f46fe188be699e5c593ebeeedbff73b.npy +02828884-2cd9593e8b7f0560d41e37baed87521d.npy +02828884-3eba7b7b2b1d139956f6fc4b4ce1db04.npy +02691156-b46455f82ad28fb595ff232cd38210b4.npy +04379243-eee08384e4f5c338a6ff78107fd2d715.npy +02958343-448efa9c287dac40a1523482d6af89d8.npy +02958343-4d24f5e0f3f394c030e91498c0369393.npy +03636649-5ffcd5bc4f1548181c7f081cf615f39b.npy +02691156-59f258b7aa7c1f7aa7d0c1e4eb8db7dc.npy +04379243-8b319bad7b3ff1b2ea60ed8d67a889c.npy +02933112-a268283b0fab6092eb835f4eccb92a70.npy +02876657-39d4723b8ac197d4dcc91b6bf08a2274.npy +02818832-d934090d6e0be2746121178eafd002fd.npy +02871439-34d5923ee8b8a6333bb4a1304fe504d3.npy +03211117-2049436c2457a4203087f84b199fd297.npy +02958343-4ceeed48d1a48d4ce09e4fc69d1a2697.npy +03593526-3e82203bf2cf0c81e6597d391ab6fcc1.npy +04379243-580e48297791fb394e684eb336479e2c.npy +03325088-f76ee8c9af6323bdb362845c6edb57fc.npy +04256520-e1662c8dfabda9e76eb9b08c8a74d159.npy +02691156-ed50758d8792491314777db9411e4949.npy +03001627-2bb65d6612027f18591999955e20a6d0.npy +04401088-cd1739ec8797049072f1ebe52d9b9daa.npy +02691156-aecd996b2ec3832771d03b466c72ce41.npy +04554684-8340c44f09408180d122457e1745c167.npy +04090263-8cab7fcd543a1d0a74e18e0e7a19212a.npy +02958343-f73858d58e6371f7d76439fb95cdd2ed.npy +04530566-2d702653fd65092cd3ac8c766eb7aca3.npy +04379243-6bc7148a5138aa6765eacc25f128a1c5.npy +02691156-aa70737ddaede2e3368d7e7849f8df62.npy +04379243-18e73a715023714691829b477862aff6.npy +04090263-94a7069ee4d637de40aa5b072f9ee3d1.npy +03467517-8cc7d40d73be99c9d57700c05b1862d8.npy +02828884-28ccec6ab49631e4e0f41fcfea9716c3.npy +02958343-e625eb804f2fb6caa26598ab726b7540.npy +03593526-e57f67c2da68cf1d6bc258c0f0234be0.npy +04256520-e4e0f428fcaa01bd19fb4103277a6b93.npy +03001627-e6e00a7324357c7dbec105fec16416d7.npy +02828884-5cb02fdcd0f1cf5d3d06403e6871e4f.npy +04379243-9bdb8268baafde1f44c642950fb4550a.npy +03046257-182760a92182873b4cbbb913355f84cf.npy +04379243-40ad41340725a2477251178be84deb2e.npy +03001627-e1e2a1aa3a6cc913eab1a145ba6f6383.npy +03001627-2b2510922e763c2443b0708c694aaf46.npy +04468005-65507a0e35c02ed24e971947186deba4.npy +04379243-33a3aaf17cb7d0ea351aa299020a0e0c.npy +03001627-6cbed10088dfb841e2a5f8edb044130e.npy +04379243-91d47945645a1039eaf14273fa406ffc.npy +04256520-c73d63f9080e84a91b17743c18fb63dc.npy +02958343-732ed918e2bca89ae6e1c83427eed339.npy +03001627-e4602d2f261da4a314b029b11f36ab2d.npy +03691459-29faf5a7c444df58a1fabddca717cbad.npy +02691156-fc6decc887f6d8a0bbf3143b1cb6076a.npy +03001627-22af872ac796ed26ff8d7c1096fae070.npy +02808440-352453edb5b6f8b4a485efa4c77b16eb.npy +04530566-6cae5a0551aca4fdb39afb07adb2a544.npy +03691459-b16d2f432bb57fc76dd78e11c421d52c.npy +04256520-f2bfa61e1a8894dd1071797a42296ada.npy +02828884-6512b58401c7ea51ad5067eac75a07f7.npy +03001627-f515332dbceba51120768660cf080d12.npy +03001627-8a38d65b4909e79d727e9f790cd597.npy +02691156-7edc7e17171b488bd33efe8cc2e2bf98.npy +03513137-2a6f4a2ff5e11b264dead5f22c05efdf.npy +03691459-b044555289c7439f4c40f34de8f3bdb8.npy +02958343-33395dcb83b43eee21e570d3da54bf9d.npy +03211117-c28d66941e2005cd11ea7f12f22c0e84.npy +03046257-181d994ce6c150df9cd779a86f74ad9d.npy +04530566-54ad30894e9c74f28abdeb0a990504a.npy +03211117-956f4464a0c344d621c6aa624f82ef1.npy +02691156-f04b62deb7737c86d37636af9c7bcc34.npy +04256520-1d878962087fbab2350c104b3ba8ddb.npy +04379243-f06857189fae823f35836c728d324152.npy +04379243-cbc2d0b1d7a64ffd2ce1f2e292dc9c31.npy +02828884-b380b855aca5632dad5067eac75a07f7.npy +04379243-f6b3638983b0effaf3bf08ec218707d.npy +03636649-1eca42abff644eee57a48b78ff77644d.npy +02958343-6201a29763c2256a2bb5796f842ca661.npy +03691459-3db832895812dd37230584014222e685.npy +02992529-6753572868705eacdd043998582f5fa.npy +04530566-84b75e53176c9f1fe1e2f026632da15.npy +03001627-48d44532ffcdd4a2fc30bf6907b3dbb9.npy +03001627-314f567d460a88c7ad02e4a3aca566f.npy +02992529-980cefc1df9b24458b13932a0c28e98b.npy +04379243-5a5d896489318c0279c251b4a7838829.npy +04090263-55bc5e1223f4868646862032be5afc61.npy +03001627-4199756380f14898e8f8c11a24c52ebb.npy +04379243-f86c1da9ed243ff055f46d55537192b6.npy +03211117-840dfd5a8a5ad3f31db54d45f574231f.npy +03001627-e67d503940c1d95b73e5f839658fc536.npy +03001627-a95df2063ec98e429e6aed0cfb3be6d6.npy +02958343-3a3f3ee1eb027cdca413908c0e169330.npy +04090263-9a8186e85c80d89541deee31792586bb.npy +04379243-b5d5db47b33a9186ffac3d5f2301b75e.npy +04090263-149adc06e4b1404940232a3c75f1f92a.npy +03261776-2b28e2a5080101d245af43a64155c221.npy +04379243-a4b09d3dc36ce23bab4d0308b2ec6512.npy +04090263-a58beed0a033875567a4cd2863eb1ca.npy +04256520-f736f06f8fd04e1119fb4103277a6b93.npy +04379243-fa259703a9f28b1c62d7d9f5324445af.npy +03593526-88160fcb6c1eef2c35ac4a6a37bb3b6.npy +04401088-62314ec7373898059f7477e2986c440f.npy +02691156-cb55e0710b727bf62e36a049ed2b7f88.npy +04379243-b4ee137cd86d7e3a6afaa22adc38077c.npy +04256520-1d3dcb5fe999334f83de73f58b2fc4ff.npy +04256520-a007a3cd5b8ca7fb19fb4103277a6b93.npy +04379243-681c53daf7810b9f92d5b25c536d8044.npy +04379243-ca6c07357ba5125b8e2adb29857f8a1.npy +04256520-402c270ea6fd4754d93768e7b9b1eabf.npy +04379243-94df93e1c5f96c1891bed99343331f7c.npy +03001627-732e0abfbd4d09858d775f6f7c8f1b0d.npy +04379243-fc8768524737826190e7e9cd4c47f9dc.npy +02933112-9eada38b3a65963e30bbd4cddd04c77b.npy +03593526-7def6a25e235f2deaf0245cb9d7ad8ee.npy +04090263-461684f261c66471e3bdba9430565083.npy +04090263-bb8ffd0d313c3e33202be79d8b285c1e.npy +04379243-ab8f7cd2ba798e33b035d20a1a3ca345.npy +03001627-eda9dd4d0d18c3f2296420d5ebe64c52.npy +04379243-26adf340ea5d552d3c5e1addd9922bf2.npy +02828884-110f199f516657c1473448e3f3f73bc2.npy +03001627-63fb3c970f0051c730bbd4cddd04c77b.npy +03636649-26ce3db3122afe74a5f600ed2cf472ac.npy +03636649-bc49fe3559e18fcb7d910d51d878f708.npy +04379243-3820449f17744298847dc1a0820caba6.npy +03001627-384dc36226d1d4deb7f1aaa55af02518.npy +03001627-a2bfec12cf53f198d810b14a81e12eca.npy +04379243-7105bd044f464358beedb4c8fd29e2d1.npy +04379243-be81240ed3cb8e5a7d8864caa856253b.npy +04256520-7b8a8776c2bd135694e14fba4acebb36.npy +02871439-4c773fb32c39ef14891a7a8a744cd90d.npy +03001627-c7a87dff6ab53f3b7490c34ba5d2779.npy +04379243-ad6317f2a90d71f6f4b6538438a0b930.npy +03761084-3a78c8e5c361ff554a44340bf227e40.npy +04379243-cd44665771f7b7d2b2000d40d3899456.npy +03636649-a708a75b3727b12fcb8d8c6d4df8143.npy +04090263-9a6c8702a8f5d01ad6945707de93a7ab.npy +02933112-b592fe51cdda66394692707833167ca3.npy +02958343-c0db588c8c816cd2dc668d3d64c871ae.npy +03001627-1022fe7dd03f6a4d4d5ad9f13ac9f4e7.npy +03636649-6267ef99cbfaea7741cf86c757faf4f9.npy +02828884-3f49fe14826172dff155d75bbf62b80.npy +04256520-2cb0f608feed6256165ce3a6b1468e1.npy +03325088-a37a43fd956d1ea73ec0850b5880d3f.npy +02747177-a7441227a374ee8cad5067eac75a07f7.npy +02691156-1bba3fb413b93890947bbeb9022263b8.npy +02691156-4a9f55420d17c815d37636af9c7bcc34.npy +03513137-e176a78b82a5add0de8982fc28ddacc3.npy +02828884-3776c500e1654d55c50517751ed5f28c.npy +03636649-b88ca09d13a5a472e3e80050b31d1851.npy +03001627-78952b099c650a85d42ec7e303174a87.npy +03001627-fdb00b6e3c3a8c6e9e7154e1e649e020.npy +02691156-8383e10a1d1faf89c7749c7e68c22ddc.npy +04379243-eb097732d3f31469aa11adad6b2a69c.npy +02942699-58e9faa223142b7fd5af42f3e1f05e3f.npy +02828884-2356e0b210f85371f8fa66012789e652.npy +03046257-a1671be5957cfd688bb3deb7fab7c9b7.npy +03001627-8e19d2ec95c45186a6fd617b2ff5d2d.npy +02958343-5d62b276cf9582e2473f10e6caaeca56.npy +03001627-4b7f260d832c2776a7b43f93c63d6e63.npy +03691459-59ed437f426da7c8c3eb2e07e7561a08.npy +02828884-682cb02cd40c9fa412b60d5939b55d61.npy +04256520-1dd6e32097b09cd6da5dde4c9576b854.npy +04401088-ab96be5a6e3827932a6d73bcecfd73da.npy +03467517-a5e2f05386e4ba55a894e1aba5d3799a.npy +02828884-4e3e67fa22620b82056b4bd5d870b47.npy +02958343-7c9136f3fdbd6c5938948312b270283a.npy +04379243-89827ac677337629ab610b0c94236463.npy +04530566-759c3321f016c1cf7cd1f8dd6fbce8fb.npy +03790512-f26c108283f42995a41f6474541ac161.npy +03001627-4231883e92a3c1a21c62d11641ffbd35.npy +02828884-a77b423dbe9f9a34beedb4c8fd29e2d1.npy +02691156-9bd8d0fa75bc21c5e3375a6b96a1d765.npy +03691459-bbda555f0874e9d5b35234ceed4dc815.npy +03001627-cc3d9160369d09845e61ef8e2af97499.npy +02691156-55f212ad58883877ca8607f540cc62ba.npy +04256520-199f330c7a4880b84b3c42e318f3affc.npy +04379243-3273b3eb8dfbbd8e6942c5426df6055.npy +02691156-1605bdb8709be6773c4d876662ed7ef0.npy +03928116-cbe392ea073dfc763fbcdcb4c54d4ba8.npy +03642806-a9aaa5daad084d18cb5b7dfc5966f56d.npy +03636649-6e1fe96adbb5ffba8bae2d07dadd1b5d.npy +04379243-139e0706288b7ccf1657aaca7aaa9a5c.npy +03001627-e69e032ca0bd60a4febad4f49b26ec52.npy +02818832-c9eb8864f33152a3e09520ec2bf55884.npy +03513137-69ece333c6d386ebbeee9a165d0dbe2.npy +02691156-e96cd99f545a4d22b0a339fc52929deb.npy +02691156-a6afd80fa3d70682ca8607f540cc62ba.npy +02808440-529eb2a106db950ccd0340812259a39.npy +02946921-3a9041d7aa0b4b9ad9802f6365035049.npy +03001627-319115572f7aa81d06ed06732b21e08.npy +04256520-c0580211c63f4fc9cd3f9e8648111d1.npy +03001627-639a10b856336f1fff2c92c2a4f65876.npy +02924116-a5f52fc53695fe9897d0a7f777e9238.npy +02958343-58f447ce8de6b9794c40f34de8f3bdb8.npy +04379243-12a5cc49c75b93af5b4aea6c98f52b6e.npy +03761084-a13b51c46b590287df75fdd4632be672.npy +02871439-f1181054abd6ab38335e5968fd22399.npy +02933112-6478d877795d2214f51f77a6d7299806.npy +02691156-d441a12b217c26bc0d5f9d32d37453c.npy +04379243-c72f97d0b25e030db0892e337a99f42d.npy +02871439-fb1a15143f6df0b35d3dc7a81f13d5e8.npy +02691156-85462aa8b58d5a1ae753c4c9af8a19d7.npy +02876657-495dea92a04b43e6be9fabb33de62010.npy +03001627-78446e1cc15f757297936c81e7f6629.npy +02958343-5351646fca246bc989c6f1079da7a8d4.npy +04379243-ae1cc74a1db83b0e6ab95c4e859970.npy +02958343-884014d60de73249af551becaeca18e5.npy +04379243-8b972b066bfdd7c44f016493aa9fd9.npy +03001627-3a4843e09b8dcafae6c5cd45aa112726.npy +03513137-82e027e4b43fa602f99976ddcaae4d11.npy +02773838-e49f6ae8fa76e90a285e5a1f74237618.npy +03001627-4d3bf8ef55b4e4fcdb66736e6592e424.npy +03001627-d670d3919c87c91cf1783a44a88d6274.npy +04530566-9b5077b81457cfc2986bcbcf53ae184f.npy +02933112-202ea0a26125f716ce5d6e9371bb5c33.npy +04090263-30a009a1877c9ae282a52e2a06478500.npy +04530566-1dffc8919a03627ecc015b9f8906f7b4.npy +03636649-5828e8ad9fd14a1cdb1afe6c464e7652.npy +04379243-881756250fe9a7fa5fceaa39a8353bde.npy +03691459-213d39983b0a865d1369827a16f97392.npy +02876657-f03f9704001d2055ab8a56962d772d13.npy +04379243-a96eb4bdd69c103dd293c20958d173d3.npy +02691156-ddf4aa5f68f89616bce962d6c4b37336.npy +03001627-e88b094644e1e80d8f2ca82d6e1c314.npy +02691156-723a86a2b266109d1fc43d5b32fa230f.npy +04554684-dbd0ba5a349a8849fb0f1b7266d79466.npy +04379243-5a945b9e86d60a4aa75d03186a0409e2.npy +02880940-d98455f19960f99ed684faddec3c0090.npy +04256520-92be674b2edb7f54d18c447b567dbc27.npy +02691156-14282db0ca4238429a6e43b878d5b335.npy +04379243-61397fb909774541e3c62e8199fc6b89.npy +03001627-e279758e8a5b6a8d492d9da2668ec34c.npy +03001627-3efa8030c71fab9055afe589a9f09982.npy +02808440-c4f40a208cc903b18faaa3c714890be6.npy +03636649-9adee08c737c7c134c6deb9ede0648df.npy +02958343-6ad0379c2f24581a1c0f83a9278e7dbc.npy +04379243-6777c68f2b62b581b3f89af909332a40.npy +03001627-428bd9c7c8a0a6bc7ff6ace05b36a5.npy +02933112-88982fc3cdf5d2b212de5317fe5b354f.npy +03467517-3d65570b55933c86ec7e7dbd8120b3cb.npy +02691156-da9c541228a171b7ca8607f540cc62ba.npy +02808440-32a286ab7be40cfeb5c63839abd9baad.npy +03001627-dbfab57f9238e76799fc3b509229d3d.npy +03593526-7775947ce2333be398910e50f05b8001.npy +04090263-5b2fc9e582dd7052d957eaf7f4edb205.npy +03046257-48784197e358000da239e7f1ff51b07d.npy +04379243-e74841627e110e98d9de0de5dc66ab1.npy +04379243-ca82beca43a3b9b59ccce4c6d5bb195f.npy +04379243-83dfe7d2df18ab58fcd4910413c446d9.npy +02958343-cdc8453c63ffc13e20f29d4da2b76f7a.npy +04090263-c1b9ec727b9ad093fd0b1d4a6a5da4f7.npy +04379243-7d7510e6bafe8d2aaab74c2fedafd.npy +03636649-441726d957d718a137b2bb75885cfc44.npy +03001627-df487c3660e7030dc5ed74d70201d4c.npy +03636649-97c26d66399ecdc973b8ea30c1700f67.npy +04468005-d5ed0af28683130b4b0b2e6e63122009.npy +03001627-4133e9d231ca52c6a16baf954c1d99bc.npy +03636649-67a087a3f917c3a7cf004563556ddb36.npy +04256520-fa46769b0817a8744f52551bb6d0494.npy +04256520-d3a8b906f6909b0252899f0b4e8d8ae4.npy +02958343-42af1d5d3b2524003e241901f2025878.npy +02992529-e4d794e92cd098d740dec81c6722f67f.npy +04530566-d04816fe3c531b66f647317afa6ffdd4.npy +04256520-e2c68936d051b926646568c803ce68ef.npy +03046257-b13b3f7b09b6534ce02c475590efce0d.npy +04379243-567ca6e5eebb09f87d0efae8dc996b9e.npy +04401088-a8d72bc949bbf361d8dc338f42ea38e9.npy +02747177-501154f25599ee80cb2a965e75be701c.npy +02958343-b67af8c92198eab432e9b7d6df5ccd43.npy +04401088-7a2a5b36831f45501b670e8e7f0f2c3e.npy +03636649-1854bd4bcf32ca32e95ee7559a2a873b.npy +03001627-f0bd1732f37da50c7000797f53fee6e4.npy +02691156-ffc1b82bec23a50995b8d6bdd18d56e8.npy +02808440-e34833b19879020d54d7082b34825ef0.npy +04379243-a8fd0c73fb6214cad56c79d3df7792df.npy +04379243-2f33abdfe147813e44949d7685cb63ea.npy +02691156-bdeb0a21cf1d602962347b4731688b0f.npy +02958343-948827c3833b8ce26d709900f94f0df3.npy +04379243-d3624229f0310175658d908a2254f194.npy +04090263-1ef4b49ad8b4e51f1dc5248baf82e0ba.npy +03046257-c764e7f423ea0b0251dd279724dd0c.npy +04256520-20b601472e40f47b17b431cae0dd70ed.npy +02958343-5be0fa6b0bb7a281a170b3adf3b6f220.npy +03001627-e30b412be565a1026efe57da6d3d385e.npy +02691156-445404a75a0ba2ab1fc43d5b32fa230f.npy +04090263-546acfcb08d2af05be90eac69c95aeea.npy +03467517-4a3e5c774d15a35c1082f2ea630bf69e.npy +02958343-5ea6bb423b1600141d225d751745cd28.npy +02691156-c12362906beecc796059aeb39e538eb2.npy +02828884-2480c05ad2b4969971a782a4379556c7.npy +04379243-39dba8b2e416449a19fb4103277a6b93.npy +02871439-33b29c9e55250cc57f0bdbbc607f1f0e.npy +02876657-41ab1142420916e374bb1e92fd01dc00.npy +04379243-29d2c8d1297d9f5c9fa24672a35ae8bb.npy +03211117-9ef960721520d46a922e9adbedbcd67.npy +03691459-46acc0258b449d18f01503c3476a4944.npy +03001627-26da81dbdf7784dddb984b8f0550fcd4.npy +03001627-cc6840207c0cf55db30e42459dcb06f.npy +03642806-241ec8a746dd1cfc78f71a335ebabfa5.npy +03211117-d85f501bf76933c609d7d8d27dbba7f.npy +02992529-e691c8f0fd7d64d7ab0b172d4dea80cd.npy +04530566-27d5c5d0dec7b209124dae0a32996c4c.npy +02828884-3ef52655b95ea7828d1fe8cdc415f4c5.npy +03001627-b8bf7e161cbff74066ab323d8f805a57.npy +03636649-cf9987efe529a5c538b27a25d1336579.npy +03211117-bbfac23f57b5fbd820e867fd9fb7164.npy +03691459-240521f502e491cd4eddc7a5aaee958e.npy +04379243-20b72612211287d43002761e7a3ba3bd.npy +03642806-1d66c26055573243a0efaa0482f35281.npy +03593526-be91cefe6cd75c15ed7e8845633fd652.npy +04379243-2fe5e4d8a871fb861b1a00a31bfed97b.npy +04530566-e4717ec5f7e12fbf07aa2d157764a08.npy +03046257-99d0eb7e23df54864d46ab71b147ac5a.npy +04256520-601bf25b4512502145c6cb69e0968783.npy +04090263-377289b4275551e83624215edd93853.npy +03691459-acc5b71d898d510f1ef58b31c4ba0d15.npy +04256520-d87a4ae5c2a768d4283b00891f680579.npy +03001627-71e139bf13970c94492d9da2668ec34c.npy +03001627-34bda4dba48231b97a90098a7525b367.npy +03001627-5a3fe2c1f1e2009e762ec387b772e9e1.npy +04090263-af06013159ad2e45cc34b900bb2492e.npy +02958343-c179735c4d9f65d7d1521952154c90ff.npy +03790512-1a48f3b3c0ab0fdeba8e0a95fbfb7c9.npy +02808440-7efbe90c9685e23cede9471c962dd6ba.npy +02958343-752a3ce746670be176ad064d1c5fdd7c.npy +04090263-1a8c91b4803b3470f9c75ffd2648d7cd.npy +03211117-762b30a37bb098ebe7db3cc5ece34048.npy +04530566-98cbe2b3e62879058e3175d49fbb0f30.npy +03001627-19cbb7fd3ba9324489a921f93b6641da.npy +04225987-8310154df085baf3e3cfaa4e6977fab6.npy +03001627-92175cfac21b10e76e5b9257c4084ca2.npy +03691459-16245718c786456b35949989d0ab81d2.npy +04379243-680414bc3ea1e9a67ff6ace05b36a5.npy +04379243-772b0908f5aa09c687d3d93a515ee29f.npy +02958343-7e7f0637d6798113ddb4014f0e8d0dac.npy +02747177-816d92c78f85f5002056b4bd5d870b47.npy +02808440-b6fb767050949172ccd0340812259a39.npy +03636649-2f46b8a15b15439d713f2e93cbeac35d.npy +04379243-3398658268644c2539eff6a5994f7472.npy +02808440-564813720bdb0cd93321831d2245cf06.npy +02933112-13aeab12a8ccdb244da5feafe6f1c8fc.npy +03642806-367fbaea8743ec1cc98452c8fce6b43.npy +02924116-75e1a6e156e8373b193d7855ecfc1bd3.npy +04074963-b9714784de07ad31cae0e78ad4bea7bf.npy +04379243-ba0cfe7ad9775de3276b6f6d90ee3a83.npy +03001627-a374415a1ccc05aa283b00891f680579.npy +02992529-adf64019f7a54162550c9b1b1c5f7e5f.npy +03211117-d5ae3a2aeb50a07e75e49fe23848bbe5.npy +02958343-3eb545f745d827752e4d5bd853781216.npy +03636649-211a5b7347645a99967cdbf1c849239.npy +03325088-31b197f507561fe7c91cb0beedee33fd.npy +03636649-43b59fbc4703d7d1c8e6d2030713566b.npy +03001627-b0531a0d44fc22144224ee0743294f79.npy +04379243-2bc37c326782ecfb9bbc8ad5ece3c1b.npy +02828884-65f6f33358b798892056b4bd5d870b47.npy +04256520-f1ae0c66488c39c8ecf6d12e1f8958fc.npy +03001627-99e4c4b39b75a06b30e06a011e63236a.npy +02691156-16f67f87f414a5df26360e1e29a956c7.npy +02933112-b12fd3c4e5912a7dd8b510632cc84b8c.npy +03046257-4dab14b822fd4a06adc5f5aafedb1c38.npy +04379243-41056728cbfd7aba9f8c3d2002c77ddb.npy +03001627-5b6a608c22d77fbcb04cb542e2c50eb4.npy +02992529-d51e5d7eae216c9ef1cb19f636b1c2bd.npy +03691459-3ff2ce8b7432b5d6feae521e94848af6.npy +04554684-a339c3e29128a402c8e4135ffa0bbfdd.npy +03001627-72d7299f4a0a542c76f992c4dd795e91.npy +02992529-ed71d2ed652b911e7f521a3dcd28e9d2.npy +03001627-699fb3293e219808599dcc439b161a52.npy +03001627-5fe56a4a9d5508c3b2373df00b89e5d.npy +03991062-5044332515e02a2b78caa162a41a851e.npy +02691156-b53ea9af10f2a151bc0909d98a1ff2b4.npy +04379243-f28874ee319d1e2dd3bd10ac60e54bc9.npy +02691156-bc86e4461bd4c955a34fb3db6a11a22d.npy +03001627-33774f1314ea9b504b3c42e318f3affc.npy +02691156-9a847e8c8f9c0acbbb05fba9fce1c1e0.npy +04468005-d26eb320ce4753d03ae1361afc45ac52.npy +04256520-2c7fd96b46b2b5b5efc579970fcfc006.npy +02958343-afd73137221d690761c6c61410fc904b.npy +03211117-e38a7ba01d45953ccb7547c95fbdff26.npy +04379243-15bae7fe612add11bf899e941ea0fe55.npy +02691156-7b1859e6b57bb6621c795eedd7ee6db0.npy +04379243-ac646aa05a0ae0e11b604216cb6e7d3d.npy +03046257-1d5a354ee3e977d7ce57d3de4658a486.npy +03211117-9711341338f550145b778a830599543.npy +02958343-894e186c1224c14f86590219e6a70ff0.npy +04379243-3d7f82a1bfc5e1ee9dfa717f86ba8028.npy +03593526-537670c883cc57f730612f5c0ef21eb8.npy +03325088-291eba55363e33cf979c556124bee033.npy +02691156-1d68bc47a558ec9b266eb575093ccace.npy +04256520-8951dddfc3cd6b08e8f8c11a24c52ebb.npy +02691156-22ced10a5d20b1c1fca1f1143bb6bc17.npy +02691156-d6cc7ffd165de05e2e2de556c136fbc8.npy +04379243-e8dedc79c201f076973f95b50a1641d3.npy +03636649-9cfefdc1e63a3c2535836c728d324152.npy +02691156-5d7b52a58c667ca835fc197bbabcd5bd.npy +02924116-6718e0455f3ac9a4459eff669967d5b0.npy +02747177-ecd9af137b451664bb46eebc96453b8e.npy +04379243-8118d53cd86b7aa6436e6787c76ef3f0.npy +02691156-94379090010cd6bb874c9ce092a813ef.npy +02924116-b73fd7769a870f7e52470de2774d6099.npy +02933112-39db396f57ec698cc59350d819542ec7.npy +03325088-cb80870b4c80d9c4b0bf85736b51ccfc.npy +02691156-d2faf50d6d88dd0690baeef8ba5b93e5.npy +03624134-5c5e4a7e5670eace44841730d607e227.npy +04468005-b9257fc9ef316cb56d99dfe91d90e769.npy +02691156-f40fe7461dc4e3396b7bd17e458d0dcb.npy +04379243-5a6c1cc3731fedeb55f46d55537192b6.npy +04256520-8f05bca2d46582483b28ebac0b25d03d.npy +02808440-5eab643d440c4a4bab78f79703f1828f.npy +02691156-613bf91bc5c201e115392a14b2886d23.npy +03001627-451458fe90bd0f4144f23566597ec464.npy +03001627-2195099b0295f692afca3357bb07ab96.npy +02828884-fd355d06238853c7f0d9805ad6c2059c.npy +03624134-82ebc48a41abaad2e72c243118d89f07.npy +03636649-a04e341e7dc206edfe10244ee697dc96.npy +02958343-536b6629c4f60d07e78002a96f52ef26.npy +04379243-75a824a5acd71051bb29ecbc4d013bd1.npy +02828884-a0ee85921d1bcfbd81faebbdea6bd9be.npy +03467517-f430d1ecf9ebbf23d57700c05b1862d8.npy +02828884-df6fd36040a5719662701a18243b45d3.npy +04379243-9f76504d9b551e548c37cfe791015e2f.npy +03001627-bab30539155767a59f422d8258cbffab.npy +04379243-f4b5313a0bc95a48da7c128b58fc7554.npy +04379243-3f5daa8fe93b68fa87e2d08958d6900c.npy +02933112-7eca681f6174f1ce12de5317fe5b354f.npy +03636649-6c33f42a0f97360143dbb6421d614c0d.npy +04530566-b6eefb8fe960df93d4dd83fc93961e73.npy +02691156-40192d0e50b4d2c1f27a705edb2f9ba6.npy +03636649-f7b3550d5e59934595bea7c29e873d16.npy +04379243-a034755df11115a1a71c812e027f94d9.npy +03001627-6ff87a46571c52c4f4b6538438a0b930.npy +02828884-f0b85200702e4739391e4d6c585a697a.npy +03337140-1e22bb0b68275ddfce79c0972693d245.npy +04256520-7b3bab9058f7de33fab6e40cce6926d7.npy +04256520-24bfcb97fb60fab7e812c99c6645894b.npy +02691156-ca16041e31078463afe21c1ae3d91b49.npy +02828884-8b677cef30fba873240c1f0f1e25335.npy +02924116-d3c35d123af3c8e826829c11d9aba173.npy +02958343-40c2b97577b43161aaafd94b9f216ef6.npy +03001627-1be38f2624022098f71e06115e9c3b3e.npy +02828884-b9b708af97a57de481f502b2c7b6ba78.npy +02958343-3462d5da3654b52d4a47c09276b7f6b1.npy +04090263-c802de6725483fd9ab66079ce2700442.npy +04379243-d5a3401380fdefa0f51f77a6d7299806.npy +04554684-a94bec767f059a013bf7bae2651d2cf.npy +03593526-5a4af043ba70f9682db9fca4b68095.npy +03001627-6aa86c295de207dcedad5734e2d87ca2.npy +03691459-483c63155f2be7a8983b2cee8fd0fb3e.npy +02876657-b35081bcc11ff7847b8ec2c9a49686dd.npy +02871439-2f8f1d7cd9f61a07b1edbf57c29e5fb3.npy +03046257-166bd86229867093031b562a9def0c1.npy +03211117-6437fc773d50e93b5c915b36bc455bdf.npy +04379243-aaaba1bbe037d3b1e406974af41e8842.npy +03691459-f4b733690a0fae8ff357e7c4167f3100.npy +03636649-80931bba35ec76db7088591b1a3e2750.npy +02808440-49b59c49ceed072491b664dd7cf765a4.npy +03211117-e70f6a81158cfb213a762233fffc49ea.npy +03001627-b1908805f05c6f47f51f77a6d7299806.npy +03001627-95317d46812e4ed4df5aea2392d894b4.npy +03991062-27d804a7d8ecf4ed148a76a78b10eb5d.npy +03636649-fc8cfb4ad6730207ad90876bf5435820.npy +04090263-722051c679217db6f436d0d7fdd21532.npy +04401088-144d8038c1688e37ab3dd76bf33b0f5e.npy +03325088-c46661274623b6cb3321831d2245cf06.npy +04379243-8a1687e286cb0b6f9f2349486c570dd4.npy +03001627-357f1c031b1bdfb3efaf604fa2300241.npy +04379243-cfeb699abe1b76c9964afc371e247bd5.npy +02942699-74ebdf5a3cdf33ebc6966f67e1bb9e90.npy +02958343-46befc634315de3f1ccbd9e5bb82dd04.npy +02946921-7bd05573c09fb0c2af39ccaab9314b14.npy +03467517-2f9bd6e61e038d8fd4b4ae2ff4c58b57.npy +03797390-659192a6ba300f1f4293529704725d98.npy +04090263-cb842e500cebf07a87856c3f95c33cd0.npy +04256520-75e62dceb6fc577e593ebeeedbff73b.npy +02958343-bbc2f2ffeec425a38eac574d099cd5d2.npy +03991062-440a38d6a90a5243de98d10ab5975b59.npy +02691156-99dc4702d20942da18e0889038e4fb6.npy +03001627-269539368eeb8ba95d99e410bbfdd132.npy +04379243-f621e2ad900ad48535836c728d324152.npy +04530566-991b0f19022a0233bb97258c2be2acca.npy +04256520-3c05461b9f6330efc61d98cf72b72c17.npy +02843684-7f53db3b31fe08283c2748dd7bf1793a.npy +04379243-276e35b78c24f8b2127787d2c89d5a93.npy +02691156-f9a8c5ae39362284d538ebc793e748b2.npy +02828884-e2cf4a7357cae6ed2dd04fa3e4c2a53f.npy +02691156-209bb7656231011d7965bced3a0d8967.npy +04379243-3b9b877ffac13289b6536581b321be90.npy +02691156-e55224bb456066c618d508b491dafd46.npy +02828884-6a6aba2dd0491b99cb2a965e75be701c.npy +03325088-ed8a6218e467e8a676d20e73c57c9a03.npy +02828884-616f9d109968982ced98cca8f0ccd5f7.npy +02828884-c327cf2527737f7ef155d75bbf62b80.npy +02924116-6ddf96982bc07456813f04ea98c97256.npy +02924116-2cf0cccfc228d92fc98c13d6112727de.npy +03636649-738646252a89e865bc5cf22809274024.npy +02958343-4acc28685ab111b672601793664460d.npy +03001627-947dfd74fc8b2e60643b321651a8f917.npy +02933112-a66122ff2d0e4bac6ba14bfd91a75020.npy +03691459-c3280f7bc5fa9ff28a0181490cb73cbc.npy +02828884-1998e800a95bfd18edd7d0866499ad97.npy +02958343-275df71b6258e818597505fd7d99b613.npy +03624134-23d7c17ddf80cd5549f73a97204d432b.npy +03624134-118141f7d22bc46eaeb7b7328341827a.npy +04090263-bb3f4468dc88370c9caab46c14deb892.npy +03001627-43569dc880494256b40f0ac0fb9a650d.npy +03593526-decc21646f053418df2fa7eaa812363c.npy +02828884-cad58af144b615b674a3201fd136f855.npy +02946921-2b08d2c26d1fce3afe34061aca66f702.npy +03691459-53856db6d2a2873c80ce1b5d66a0b782.npy +03636649-1a48f00729981afbc01ff6a6aade8d2.npy +02691156-52151d6a699ed1acecae07472b415b97.npy +04256520-eaec2a137b0858aa599dcc439b161a52.npy +04379243-a7ef45d86ae5b496a97f238e46bc2221.npy +03001627-6921b41c2f6916e2bea04b36c2ada3a3.npy +04256520-ebdeea981de34c1b2d19175e7d19b7cb.npy +04090263-2f2f7819edaa4ab7fb47f041a00e8417.npy +02876657-dacc6638cd62d82f42ebc0504c999b.npy +03467517-5852a24dde24a8ef93f0194265a9746c.npy +02958343-d4f88e7219c4b9417b5adf84ce6f7865.npy +04379243-50d898f6d1c05cee2d99129afd32edf4.npy +04379243-59e1afdec89de9442b70eac6546e93fd.npy +04256520-68aa553c520fdeada30a92122fc999e9.npy +04379243-23d1c6e2e35cb252bb85b5a298d72ac7.npy +02808440-cba294fd8320a4b13321831d2245cf06.npy +03691459-fe613d2a63582e126e5a8ef1ff6470a3.npy +03691459-98ad42e08a991125f0ea0ee719f6dcd1.npy +04379243-8a8934756916a42855ce350c1c834503.npy +02691156-bc59a1d1f959b6f9b2acbfd8323f804.npy +03691459-d956f40d4b3cf48f7889725d46ad23.npy +04530566-db01f2f8cff7b7e1c517f0fe59ec7ee.npy +02933112-bb9ac4b110f7ed3815dd7d7985e749c1.npy +03001627-d66b701631851e7b4b19d2c99e22ffe0.npy +04379243-cd27c39dc711626d7e9fb8aa5670f37.npy +02876657-365f8a3cf397adf66e71bbd43f7f5d20.npy +04379243-b0264f893f25e10ec955e5ed03ef3a2f.npy +02924116-672173207e1cd8a8c567c0a983faf2bf.npy +04256520-ad7dd9434ad5f61db759217db94d2883.npy +04379243-3ac209693a4e89c4a4b99739648f763.npy +03797390-a8f7a0edd3edc3299e54b4084dc33544.npy +04379243-b323d3002578f5f3f6cabe1df6f4c9d9.npy +02828884-feb6a23a5e25abe459af9a18ecf57ec3.npy +03211117-d5eaa13bf0dae2fee2e6b284e4b0319f.npy +02924116-b60af2693c12f6181afedc87fe387fe.npy +04530566-cdd493581ed137c5a6dae8586082d789.npy +04401088-641234f284243decea95e61f66327e28.npy +03593526-94b833e6157f13565ca1f314f1afc186.npy +03001627-e5d285ad477a33a27eaeab1f0c9120b7.npy +02924116-6886edda8e86aa84af02ff7e690e1b0.npy +03467517-faefd0da82f1606d9e0d303f663a5614.npy +03046257-3c5690e5ecfe5f0afd9cfa6c7f5305bc.npy +03001627-11b7c86fc42306ec7e7e25239e7b8f85.npy +02992529-db1f83761a7a19f6d0c7ebb68662b4e5.npy +03001627-640f61579181aef13ad3591a780fa12b.npy +04379243-8fed49d9a02124903002761e7a3ba3bd.npy +02691156-e7ff46a15ae32ede7480441c35610069.npy +02958343-2b08d1ac4111542f3a2b1a2e5e169910.npy +02801938-3071896180371f53eab2bd7322386ffd.npy +04379243-440b50a6bd10d00eb000f20a5153622c.npy +03001627-90587a80c1e58a7ecd447b0bcf9cfb5.npy +02958343-37c5ac3d5b34761add75f724c0ccbe00.npy +03001627-d4d18aea46db0b4d42e792292462a0ce.npy +03624134-b60d44263ebdfbb24b7644126b1d71e0.npy +02958343-9901e5d7520df242c61cbe35764dfac1.npy +03001627-550dd11407c28f9f3bd04286517a8395.npy +02808440-46bf8401785b96e336d8dd30a594b2af.npy +02828884-b6410fb9ca3cad2170a97514aa270017.npy +04379243-6aa865b9e1e9384d40ed3786e46af8d.npy +02691156-8db0b83cee14e1e5eacd58bc9fc5db51.npy +03211117-93b288efbbffff30c1dae5936fc55ce0.npy +03691459-b4e360a10bed4677aa0022295937af95.npy +04379243-c734ed1d590bba80df6cfab91d65bb91.npy +04379243-794f6c8575cb9828b44aa1973fabbd64.npy +02773838-68b7ca73de30ad6df2197da8dec8488d.npy +04379243-fbee497d2941270d79368d1198f406e7.npy +03001627-30e8a82eccb30369e3ca99089143c61.npy +02958343-441d0b3f687e3721fed6082009db27d.npy +02828884-54239ba1b945460ae4409e4832196128.npy +03691459-3fcff447f43c75c3ea3d2e9efa07ccad.npy +04379243-f078a5940280c0a22c6c98851414a9d8.npy +02828884-783b224ec9a89638736ecce7d21f395e.npy +04074963-80701d854496d6fe67a964feaf6ebeb.npy +03001627-470d626518cc53a2ff085529822a7226.npy +03207941-35617fd7ece26150ffc6e457221b9271.npy +04379243-910a506648c64970a8737fcf23389014.npy +02933112-33ad208b1b1468bc558ef7f77265c6c3.npy +02691156-e52f809111bb75692b5a1d128057b6a4.npy +02958343-24c46b3a467bb4954b1bdab82d834140.npy +02747177-b6fa6b957d2ed982e4612a77ab3114c6.npy +03001627-79862d8abd869cf6b3a8888e78d004b3.npy +04379243-57b68a9891773c89d27b31bdeb5f5c79.npy +04379243-b20204ca63c530fae3f7a74e12a274ef.npy +02958343-3a6a1feb338c884a8079d5a13e411210.npy +02691156-9b09169e0a2b8650dcadc22bf3c23ace.npy +02924116-2c10db171628f11c462dc6b25a076dfc.npy +04468005-7578f09ea13f2d04ed79a511eb448339.npy +02958343-d3f5e04481e69974d1521952154c90ff.npy +04379243-ea45019340b754c155f46d55537192b6.npy +03691459-e0c6692e0af5dda1459a1795a6d0c69f.npy +03001627-6bd131b9cc3e8b97b2ce8575669c9dbb.npy +03691459-7f448ebca95a536f40e7eb33087f3287.npy +03691459-2379915c82c2b2d02530f02db7e9157e.npy +04074963-4c78551ab00fb1873fbe480a485feffd.npy +02691156-7bb1d2f8be9593b3cc14f1e6f4f4f49b.npy +02691156-3c9d577c78dcc3904c3a35cee92bb95b.npy +03636649-fd5f6ab819910a66dc7f95a5a82e36f7.npy +04379243-a7164d4766ff0e1b4ff124faf2d8d947.npy +03636649-d6d7fb290b69e985ee2b478fec745c0a.npy +03636649-dd40743536da78a2bf964fc57f6a7d6d.npy +04530566-aa695b15cb58096f36aafa2ff65e6955.npy +02828884-448010b6066f3da3b069944d084e877.npy +02933112-e408c939829d0353a6490b68274665e.npy +02958343-4bb61e5a72bea4506ca2b6e5474aad11.npy +02773838-a55b721ea5a29d7f639ff561fa3f5bac.npy +03928116-a9292522fb6fbb987de45a8ca0837da.npy +04090263-5c28fd7c3d261e1b3e243aaa4500940e.npy +04379243-3ab6e079e4af17401a53162afec5ca5e.npy +03001627-376079d4c844328ad6eefa796d2f261c.npy +02876657-758fb2cab125eb6b153b368d6f14e275.npy +02828884-d73143a767890e26505bbba2c4eee722.npy +03211117-37ed0bdf52f2eaa83c5474c35497dc65.npy +04379243-12ecbeacae03825ef211221ba01b03bb.npy +02958343-c8a69b3e40337ba8c44c06ae133f875a.npy +03085013-485e300538ca1fc9f1e852be2b9d80e8.npy +03636649-ec449d7c89e84657cf66a9e192dbe265.npy +03001627-d36de0f850783d8fd6b3090036b71698.npy +03991062-31923669954ca57025ebd1cd0b422e32.npy +04379243-4d8abcddafc52ccc95e7043c2fdf14cf.npy +04379243-b977915b93e87cbdd724c69102d5ef2.npy +03467517-8f59fee745f1e37ea5c8e9fc8b2242fd.npy +04225987-e314be67e02df59c520f00c860557591.npy +04530566-6c99359667a1b49d657a96a9bceb8713.npy +03001627-2c67f62020ca22927297db8481c2b16b.npy +03001627-bcdcb4928e07e4174a623eb2e3317415.npy +03691459-f8b0dcf0788e775db98f9e89101e3f14.npy +03001627-81910ec49fc4951330e06a011e63236a.npy +03001627-9f1a83a9fe6ce47afe74f7508ff628ce.npy +04530566-713861441f4c7110b7b1411b0ad3bd0d.npy +02828884-972e0e5717676e47d201085e80edb26a.npy +02828884-89f810f17284aceb85ef4356ea4ff622.npy +04379243-6c4cb518c38c50c9939c47ac2990d9c1.npy +03624134-1460eded8006b10139c78a1e40e247f3.npy +04256520-6ed77417302eb83832a1c3052eaae289.npy +04379243-ea7ca8c7d68c1f62660d2c57f39fb65d.npy +03001627-6cf7fc7979e949c72dc9485cd94746f7.npy +04090263-c9e4c1b4cdc45601dde078ce46d9fe3a.npy +03593526-869a98e1ef4fdb543c8d0fdfb1cc2535.npy +02958343-79c9b9b6e2cb15a2dc1f7c6230f38f00.npy +04379243-2d018cff733a8e176870e413ec7729b0.npy +03928116-673c3f77f3702338a1845d2858b500eb.npy +03001627-29b3a8cb9595cbe63b7fe46c7c128390.npy +03001627-5aeefb539699524044b2fa2cac0778f5.npy +03691459-ed06c596dd9b9cf3dc99793862c889e0.npy +03991062-4e377c970b6dcf4347264d6335395c04.npy +03325088-d62a9031fc6961833321831d2245cf06.npy +04530566-a6d50000249d71cf70c8aed16b49b164.npy +04090263-f0cc8d1741f287fa276c3d558130f8b4.npy +04401088-b02d8e0fb3ec903b4a952171144f2812.npy +02691156-a7394a6f2dcf8e9b3cbb132878a747df.npy +04256520-f4370eb6449a1e8e191682d3b3321017.npy +04090263-9b9d03274e856982c2c44977d8755d41.npy +04401088-9fd7db6d334e6acab29f572d1167c0ed.npy +03001627-2f4b0d6e2faf22d68c18ac3fe1584a6.npy +02691156-4a9d28a5f272853fbbf3143b1cb6076a.npy +02691156-6c613c1893bf7f9ffae8113cc147b3ae.npy +03467517-a10303f8b98342cedb6edcc84d526a7.npy +04379243-26ebcfb2ebd8345f14b86d5282eb8301.npy +04090263-154c779086865eafe906ff5bb78d7b1.npy +02773838-2ca6df7a5377825cfee773c7de26c274.npy +03001627-6de012f3ce256e9930c7810cba6da248.npy +04379243-660deb63defcf872e76bc197b3a3ffc0.npy +03790512-6611e5f5092d1ac1104831d5b063e54b.npy +03513137-17969fc40964dbe0288d8f1144f7979f.npy +03467517-153e7883f6cf0e66d57700c05b1862d8.npy +04401088-ab8243a880170c00cca1221aa4c4f70a.npy +02958343-b4110c921adb2c40bda733a39f84326d.npy +03001627-d561ff6788ab46517b016084e2ae95e.npy +03001627-ec637164befa6a016bba96a850a0781f.npy +03691459-f996317de417329b1574d21c0c95092f.npy +04401088-5bbf52512a45bddb7525dc2f981e5489.npy +03928116-fd2d4458a90405c0b60747861a92b009.npy +04530566-c2eb256cde2dbb93c17ff170974eac43.npy +04090263-9b59affd52c33944c6c1e54aa8170142.npy +04401088-9952f0dc41b20fcfdd5b23028b480cc3.npy +03928116-604b2240f6e827d21995b51f9c4e1836.npy +04401088-9b608bcc7e62c3e2dbe1e810cdc7471d.npy +04256520-903dda9c731b73acf661d29029f2c819.npy +04379243-8f0a115dc4c1c183f16363d52e74cddf.npy +02691156-22829f20e331d563dd455eb19d4d269e.npy +03001627-36f4f54d500dfcec9969831eec1821d9.npy +04401088-a860adc078391edc6774046e1fe3165b.npy +04256520-164f50d574036cfb2ff0fced1c150b31.npy +02924116-cb6defc2b3478f2223448236beaf8ea1.npy +02691156-2677c3793143e75766cf1b4a8fc3914e.npy +02876657-9c8d90ef60e0b37fd317c475f024f3b8.npy +04379243-fc1fff82a7c97884fc5e332306225be0.npy +03691459-46b229154ab6434177818a0572bf1777.npy +02958343-c1daf553ebba8c07e4b68d3b17c43658.npy +03636649-79861fc79f8dd8b478b03575bb54dfd4.npy +03691459-b02ae2bb9756acdc5587d8c9be86464a.npy +04530566-20c2e1a09d00f51294daa4565dd30535.npy +03642806-1497a7a1871af20162360e5e854659a.npy +04554684-933dc825712acc8ab5a3b8119a3da34a.npy +03761084-cc932ff79453c009a6bce7f3d1dfedad.npy +04379243-8aeb236e281bd5a4f51f77a6d7299806.npy +02933112-ce9c5aa7a4016f138c2f9e4176bfe555.npy +03624134-81d9a6aeafadb719ed6e4dd9aa9b9ab0.npy +03991062-bdb680eafe46baff3f7e27638e63d848.npy +04256520-a157ab590ef0f9b6dcdd187a6a5d68ad.npy +02691156-3902709d4b10903579995cc5afab9d5.npy +03636649-3834d7f376879c03eca29403b7226aa1.npy +04379243-f674a5a3c9c5c7c781faebbdea6bd9be.npy +03001627-712415ce3f126dd921bdbc0445d9f748.npy +04401088-aba1179bf8b62c812a6d73bcecfd73da.npy +04530566-68f118940e88df383ac122c0078b9b60.npy +03636649-120f940d4c32c48df51f77a6d7299806.npy +02958343-b4f06573afbb3c1d9a997e8df355a668.npy +03948459-2eca5fa283b317c7602717bb378973f1.npy +04256520-9fa4f3e75f6bcd89b758c822519f97be.npy +02992529-c6f62eb51d1750497dbf89b54afcec5d.npy +03467517-d7e1b36ab46e2d9130f83c7e8a7d80c9.npy +04225987-58ade10f7f87edc6e860048d7ced02e3.npy +02808440-bc990a3fff60a55ea64e5c46abb30c70.npy +04379243-1e5f3bc86bddd77f700e86b51ee00536.npy +03325088-d4939c7a314174e276c18e71fd49c4dc.npy +02691156-a0095db392a8b520884a857d19f7439f.npy +03001627-469d04bcf9576a8b8cbb8bac2032149c.npy +02691156-c7df0d3a924147a49a6e43b878d5b335.npy +03001627-c2b898dd5601454d626d7e3d07da8352.npy +02691156-1beb0776148870d4c511571426f8b16d.npy +03636649-2e5a58c43539442a6858978be907b0c1.npy +03001627-fe9467d48dc6b3491dfc750afa3f442.npy +04379243-e407b3cb5cbd7d4fe0f0631862fa9bfa.npy +03211117-5f248c8e804af22f6436916a86a90ed7.npy +04530566-41d1856d2e24a738b4624ce09086ad45.npy +02871439-1b301a8217f3b0ae13b18ba49b3eb9b4.npy +02958343-406ff3d73672bb2b21669bcdba443569.npy +03636649-85b3f0b7d9968d79664b3b9b23ddfcbc.npy +03001627-55bc1f325928f28c738dd0d3509c7e47.npy +02958343-6fd9b065c795d915473f10e6caaeca56.npy +02691156-df990580230f0254d21176457f0be3a.npy +03325088-b2a3d57b66ec42f350da8b99982a3057.npy +04256520-28940687b3516d6e8dd711af5650bdcf.npy +03337140-ce20ad86c7e6e0a16c8051be410ba0ef.npy +03001627-cfd2b4a2c8398220731d11154716a6b8.npy +02924116-afb664bf0c6e3311b2da04cd324f7af6.npy +02946921-c4bce3dc44c66630282f9cd3f45eaa2a.npy +02691156-cbdf611a2146031823a665a253ac8cae.npy +02691156-ec4cd947eb2ee3103554ccf8c30febe7.npy +03325088-78412afa26ae9e4d76c18e71fd49c4dc.npy +04379243-82d1c45956b00636b7b774bdb9e14e53.npy +02691156-44e08106211ff2596ed8c57a1980bb26.npy +03001627-747667ef89d03f0dc79b7c4f72055bcf.npy +04090263-8f4a280e59ed5fe859360964d7fe1813.npy +04530566-69c4fbba77ee7891a3c3bb12365964c6.npy +04256520-7cc630a72eca68c0457ba044c28858b1.npy +03991062-9bf2153c2068fd39a2c59a4d90e63212.npy +04401088-c28ca490e5e7d104b1508bbfb8b56edb.npy +02958343-719a65d25f0f97b22935bed12a852dcf.npy +02691156-a6aa2281ebfd822e9b2acbfd8323f804.npy +04379243-2d22f3f0723011548aaae3d020f5ddf8.npy +02808440-7ec638ee1fa35cbc125fa9990176f0d5.npy +02691156-3a7e396786751f544c3a35cee92bb95b.npy +03467517-ee434f96e8398084a9edb43ba009e64a.npy +04256520-450b2b913495b73e9069b3c9aa123329.npy +04379243-7c7e0d1157c727371c7fe5be55ca5cfd.npy +02933112-13a42286f65c8b559f8c3d2002c77ddb.npy +02691156-471f072ea9d51f639d92b4de623f5639.npy +03938244-5429faac916362e185bc264270ae0601.npy +02691156-a849d4325008fbea85dfb1711fe4ff6d.npy +04379243-5026668bb2bcedebccfcde790fc2f661.npy +02808440-ef39099e75d450b46012ae9c733eecc.npy +04090263-7bd6db14ec6c37efeac2c9f41d1276bf.npy +02691156-758b67f9af18602715aa5b227c027ee0.npy +04090263-2cf699bd28ec65dca58b002039bd187f.npy +03001627-4d6107c32c75ad6b9f4b4145f6688869.npy +04379243-a5230f3ef20e6d460a7085510f65cd6.npy +03001627-9233077bbe6926c239465fa20b0ba7fb.npy +02933112-31590e22b5abce1191c352d02061b3f7.npy +04090263-b26c0df3e57ab7a298a1a2453e72ce7a.npy +02924116-a079073bee81509552470de2774d6099.npy +02958343-b51d8c15d8f603c350937622ac92802.npy +04256520-793aeb3e33325c491f4fac9ac5e71796.npy +04379243-a00b79f779bbf4d7bdfce662c3df88af.npy +03991062-6c683fac62caf6c23b0674ad753b6090.npy +03001627-a6afbf5a5eaafec74ccf4672ec1e7efc.npy +04379243-73bbc651e2d6eb22ea65c47b660136e7.npy +02876657-1b64b36bf7ddae3d7ad11050da24bb12.npy +04530566-528689641a6562e7bd7a55708242b1bb.npy +02958343-ce375f51744396e52a9eb0f146e94477.npy +02942699-b42c3da473bb4226dbe4bc54590e1d59.npy +04256520-a8395165dee1adafe0c381fdfcdec36d.npy +03691459-6e97134cd7dc3067c24c52be855c1525.npy +04379243-5b109b578e82cd4f40ebe9b2fa95ae8.npy +02691156-a34a6611fd6b2451690ce339b831e7e2.npy +03790512-13a245da7b0567509c6d15186da929c5.npy +02801938-f8a8501a980f1688d5f9523b8b36563f.npy +03001627-7139a30ff80da3a6b12dfa50fc9e07e6.npy +03001627-35053caa62eea36c116cc4e115d5fd2.npy +04530566-dd4b3fc340bddb7f70adfca72a15271b.npy +03001627-73b7d6df845221fa9a2041f674671d05.npy +03624134-1f8d5050facea8cb7e0660626012c911.npy +02691156-e430f24c3125997339cb1b92881e8e76.npy +03636649-be60fdf6e4c9e45fdac42bdc1d2df4a3.npy +02691156-53f0e2f6671346ae5ff3feb917a6004b.npy +03001627-9368cd9028151e1e9d51a07a5989d077.npy +03636649-e8568e17d0fc6418e6543556f230fe9c.npy +04256520-732f5f4226ceba1e593ebeeedbff73b.npy +03001627-b9f80c27c118564a9a318f18e43edb72.npy +04379243-d63496bc51de5d77e3837ef7356e7613.npy +02691156-5d022668941c6559b0ed23034a67f7f.npy +03001627-b718fe66075a7c952af70677c0b21b90.npy +04379243-fad62f2339aefa8f9d86e5f05f1da2b7.npy +02691156-f680ee392bad2dca29348d14ca881f7d.npy +04401088-83dedc1afeb57e199edca1fee171b669.npy +03593526-f8ba5c5c9530a2d43dddf957f22bddb2.npy +02828884-9b7b628bc8cc7463103d45b529610c5c.npy +04090263-6e4ed358feb31feb27c767f081f1365a.npy +04379243-38ad5333308ec5b5f4b6538438a0b930.npy +04530566-eab41e8a5c5fbdff151300a2afaaffe0.npy +02924116-4293b7b9281953e74aa94fe75fa150ae.npy +02808440-d8c81bf718d534776b448b8aaebb705c.npy +03624134-c4851aee1af7d874cc34b900bb2492e.npy +03046257-f2d0906afe91c7ceff3e00f1a386bbd4.npy +04090263-973a961200eb14f1a64fa3a308f2f098.npy +03642806-9728d5d4ba7fc664aa4473b82fdc5099.npy +03001627-e9a16aa9d2ffdbe174cc0d9ee0d1e8c8.npy +03797390-d309d5f8038df4121198791a5b8655c.npy +04256520-e09005010542d8193d28966b7ef7a935.npy +04256520-3a44efd1fd14ea66dfa4ff010b8b9d1c.npy +02828884-8c6057a5258539fef155d75bbf62b80.npy +02691156-91f3ccba290da90671d03b466c72ce41.npy +04256520-1d19f508f104e881a239479de51795b2.npy +04379243-bbae4abbff206a2a14038d588fd1342f.npy +03046257-1d476f6d585baf62e1292650537a7c1c.npy +04379243-2e5d2487b7e1b708e4f659f0755a47a.npy +04468005-ece4c9bf30e601575068939b1e366148.npy +04256520-1193da9a06f87fd6a0064771a6f2cf3b.npy +04554684-6e606fb36a1fa72370011ebcb36fd95d.npy +04256520-4e25ae1d1ce18c4a40ef1c8b63a628f9.npy +04530566-f4aa1a1c7216fdfcd3d8a17e1b074875.npy +03001627-d50c5777a2727679b247f6fe3b8f7af8.npy +04256520-e8342d53ae929341b6feeb62eb9d939b.npy +03593526-6488a88563cb1f3b2dcb7217e1ed4196.npy +03691459-3b6f73cc36cdabd2b3b44ad99a214777.npy +04379243-16aca29aae2d252cb8372f06f79c32ca.npy +02933112-e22f10f551cac7fc6cb99ff1a702c4e9.npy +04379243-3d6e337c521f73f3fe222bdfe4498489.npy +04468005-923313c1b085c415706d1c54190f27a.npy +02808440-6f1c542f24b8e50554d7082b34825ef0.npy +02691156-4a21d3920b11cdbf1592d7a04a86fa53.npy +04530566-7aeadfeb93825b387b3c166137b0d772.npy +04379243-1d6e0462e30692d8492d9da2668ec34c.npy +03085013-fb6ee1aeefa551e188e2183678696c9a.npy +03636649-d1dc19013dca2182536407ae4270b9be.npy +04090263-b65ba6d3f77ede2d79aaabe4686a1aa9.npy +03337140-ccefab3547696e1791c352d02061b3f7.npy +04379243-e2930bd9b16db2a80d6227ff9b21190.npy +02691156-9267c510247327a2297d46b42718e32f.npy +02933112-7941cfe08a5288337a3bc7b2417286c9.npy +02691156-6a242ce20c44e82bcc14f1e6f4f4f49b.npy +03636649-e7b9477eaf6e2b64fe755e3418b63110.npy +04090263-8e27088dc71b89f9faea005b8f19889.npy +04379243-337479a0afb08dc91933ffef19678834.npy +04090263-74b14a0da86ff0b6e1f2a1daf140ac9f.npy +03211117-e4f34d5f5cc64a85f2e5d34c7b677bc4.npy +03991062-620fc0a4a978ebf870e620cd439a45f6.npy +04530566-99102724561012729ebc23acefb248a.npy +02958343-a166f97f10557feae7a7d875eac9a93.npy +04256520-4b139ceeb56ca3a1991d32d5bc1065a5.npy +04379243-db9458fd1459982347b1b3e368e511da.npy +02924116-6a202c870a278b131db751af8df870f4.npy +04530566-b1b5e16d0c96f34c46b7a006accd201.npy +03001627-537c7bd16e8a00adbbc9440457e303e.npy +03001627-a7154b3c2b2a0641a9fe1734a6086750.npy +03636649-6d8cb53f3b1cd94a4da9b199f21864cd.npy +03636649-3e7ef877f826230dedde7b5a5ea6d004.npy +04256520-28ce909659a826d1599dcc439b161a52.npy +04379243-fa719ece51c607383f3fb2f375c18a84.npy +03046257-e37eff8f127dbaa9902a571380e15334.npy +03691459-67967d0213be8b199fa004564ade09f8.npy +04554684-8fb4749a25eca524cba07fb2573fff75.npy +04090263-a4046d9996609d50b8b37cfdf060fff.npy +04379243-fa4d09b10928d8322685733c782593df.npy +02691156-ee0105d05a5007ab827afb33b6d5eec6.npy +04256520-15d59eaf24645f501030665054ebb2a9.npy +03211117-ff62121443345bf76cff78602fbd834e.npy +03636649-2ceeb17225f4e460d493bfe20f94b6ab.npy +03001627-653c0f8b819872b41a6af642cfc1a2bc.npy +02924116-8abad4c89c0a7333a6a511745136dc32.npy +04379243-16ecdb0dcbd419ce30bbd4cddd04c77b.npy +03211117-8399366b1dbe22edcb349a60fd15aa15.npy +04401088-407e5ee21fb23fd92ffe71e0e78fe3b7.npy +04379243-1f2fe0bf66eba0b03968da786c4da00c.npy +03642806-7a4342f61ed7b153341aafe10fd0cbd4.npy +03001627-54f13fbf4a274267a50b88953d263a42.npy +02691156-2c9e063352a538a4af7dd1bfd65143a9.npy +03211117-d5b088ccd7d1a7ba8e2d66cbf6a91063.npy +02958343-8fdc090f498ddb39f63ee8a34069b7c5.npy +03001627-cdfd278e8b1c11bfc36d58d0f13497a0.npy +04379243-45b4df78e3cec0d99860e9353bb52a1.npy +04256520-8d91786e13808f73e4248277d408e4b7.npy +04379243-ebc82e7df36f6e9a33963916b86d221f.npy +03001627-4cc17e003a26a3d5eea9006d9d8918a7.npy +03325088-27588aad5d5bda1fcb6036d6e778885f.npy +03325088-e8d35278a035f50d14b35a7d7cea7130.npy +03001627-17b77403b80de623f1783a44a88d6274.npy +02691156-165c4491d10067b3bd46d022fd7d80aa.npy +03467517-913f3c90f5b78256e98e318d424a4bb9.npy +04401088-74dd744f5c5b9d132fb56cff2a0f826.npy +02843684-a36e1456c6d68281132a08135eefe76d.npy +03001627-d6dd3de6d6ea6d0b1931ace01cf1b948.npy +04468005-3df90286fb1158115ae1d71af1bb3fed.npy +03467517-cd80049dc2c99ce0f75374472ac71de6.npy +02958343-8c2430564a8e3a2354277bd8a941f068.npy +04256520-f05f6b3e7c0afdb352fc7e973ba7787.npy +04530566-606b512701e71ef6fb80910115d3c39f.npy +02924116-42aafaab0612f10dbce4c69e4f1ee611.npy +02933112-acba82ca76cb0201774bc00c294ec5e4.npy +03636649-8cc8499cdf11e9fc1735ea0e092a805a.npy +02808440-e37fc3b3ec688a44a451f23dc98be5f0.npy +02958343-a49041daedac3ecf2fdea40a56b4c57d.npy +03211117-df35d335e76abf5618ba239e198ef2ba.npy +04379243-1f267da10062622092018116c595a95d.npy +03211117-ecb3d57cc0e8018f3f6b4923416758fd.npy +04401088-2163366f7c3a7a0e6c63b8b48495261a.npy +02992529-17d4ef9fa59ede481cfeae953cc2339d.npy +03211117-d9b7d9a4f7560f6ffa007087bf0a09.npy +04379243-425ccd56a558a719754784b56fb4c23b.npy +02958343-d000ef0c691489c9801b0db1d49ea10c.npy +04256520-ece3f9c071f7ab04bbc7a6acbd8f058b.npy +04379243-5fe429691ecc5f0311e6fe968f9f8b0.npy +03938244-7c1194c82d28663d7d910d51d878f708.npy +04379243-63ca298a0bc7dac4d1f4a577576ffb5d.npy +03790512-86b8e4e5ed18fe082a45a87054fa7272.npy +04530566-93304640e3a2a60d611cd70ef25f5235.npy +04256520-664a84b65396e168707aff99601b0e71.npy +04530566-c6e36ffba5630fcd7301f2b895d332ac.npy +04256520-93b421c66ff4529f37b2bb75885cfc44.npy +02828884-6a237c1e61fe2bba8490246570868c8d.npy +04401088-72e61015d1e4fcee8739b6dd0f9695f.npy +03001627-9343df9a7ed6cbba1923501fcdd899bb.npy +02691156-a9545fac33430c6062347b4731688b0f.npy +03797390-c7ddd93b15e30faae180a52fd2be32.npy +04379243-314f35827359105d6faea4ea390b4428.npy +03001627-ff546450fb0bd81f6e7c5546c1dbd220.npy +03001627-c5d880efc887f6f4f9111ef49c078dbe.npy +04379243-92bfb87451cca049febad4f49b26ec52.npy +02958343-9e52d425db48a33bbda733a39f84326d.npy +03001627-b9908906f1e1f65b8e800d2aff155191.npy +02828884-ca21ae1c48c020db1a7fdfcca5768f88.npy +03467517-7eac9185f94e7be35fd682b25025f90d.npy +02958343-5e4a1ac9bdce2766473f10e6caaeca56.npy +02992529-901a0180abe1011b3c629b56d283e7b8.npy +02880940-e3e57a94be495771f54e1b6f41fdd78a.npy +02808440-47f169c6aeebd2665f9b40f981270a7b.npy +03001627-6f70a7948c59b49943da6ec23cebe068.npy +04530566-7bfd756573de367176098e230fa177d.npy +04379243-7a22339a0b7dd26aee088de33038f12a.npy +03624134-8d777e28695e8bb1b036a5cd72ed9d11.npy +03636649-551bec14757bd4b27b79156a61ad4c01.npy +04468005-9c1dd6638cbb2ca05ac4d0d3890f2d0b.npy +02818832-e7d0920ba8d4b1be71424c004dd7ab2f.npy +02958343-5ad82d706e57607ce4b68d3b17c43658.npy +03001627-9c68011042990da3abe36bab1da1fa35.npy +02801938-9d0428e82fee9fba50da8b99982a3057.npy +03001627-2c14e910ad4173a898d5fc0473d00a1c.npy +04379243-98bab29db492767bc3bd24f986301745.npy +04379243-4058207a9467712966a503e0f1ab5917.npy +04379243-9a1312e39df01dc1d44683cb4ca416.npy +02691156-9c7395d87c59aa54a79f2ed56427c6e6.npy +03513137-709348783d9c30c970290a7176ca24df.npy +04379243-cd0581de9bae7c6c7d1aee311ce12c70.npy +02924116-f08b481b079d9c18ad19b94b8069bb8b.npy +03211117-ffa987a79bc96e869e23f6fc87a31098.npy +03325088-a2a6c837e09bffcd76c18e71fd49c4dc.npy +03001627-2bf1fdef16967a929753496ba23f2183.npy +04256520-e3992b75b446fb5af7c7ad2549a1b15.npy +04090263-18fdbd5f5448e1eb9556d0a8c8dea494.npy +04530566-bc9448e22c2379d487f08fb94cd2785e.npy +03046257-332ef2906bb304e8b0aa15078ea6f391.npy +04256520-a841d5d39c5ddbc28ec45320afaa5d0a.npy +02808440-44bf3d065ab35d43b362845c6edb57fc.npy +02828884-94bd6118c10de515d201085e80edb26a.npy +03467517-2d767b3fbb8a3053b8836869016d1afd.npy +02958343-83f26e6b8298c3a0a134736201a79843.npy +03636649-7603ca578be87f24b48d582908a164ed.npy +03001627-6e9a3650b8ff39a02dae74041d029566.npy +03636649-1b35827236954b2bb6436276138aac1.npy +04530566-d8ea840a28472e04954c06f15cb2b5c8.npy +03691459-58d0623bfc9043965c3fc20f066d524.npy +03001627-5042005e178d164481d0f12b8bf5c990.npy +02691156-47fe79cbf9d6ef36dc3607950feada54.npy +04460130-92e4cc97df1ebe141203ec4ca6ccf208.npy +04379243-d5d7324c2233d6edf51f77a6d7299806.npy +04090263-18b4acd3b0809e6fc14e2939682bc455.npy +03001627-287bce5664e168fd744dcb8aae5f2395.npy +03001627-2a28a1658e9b557062c658925896f75e.npy +04401088-16ac60220ed738901cfeae953cc2339d.npy +04379243-a713adfd7d82df5bebf5869836d37497.npy +04225987-463434d2fcf567d56a93dc68b4021dbb.npy +02691156-1c27d282735f81211063b9885ddcbb1.npy +03001627-7d59399c37925cd7b1b9d9bf8d5ee54d.npy +02958343-8e7475bb6c54d39f398bc3e9fa82bf3.npy +04379243-40a402e1d949364a104ceb84075e40d6.npy +02871439-5f1abf912782e0d7350be33372161c1b.npy +03001627-3d267294b4a01900b04cb542e2c50eb4.npy +03759954-e989a2cffc4d967bd80ce3f2fd66be0.npy +02958343-398a791990b106dda5a4c80d90b70728.npy +02747177-2ce9c6ec2d071187ad5067eac75a07f7.npy +03797390-896f1d494bac0ebcdec712af445786fe.npy +03001627-ec5d90a37ec99980e2b417d08f69e019.npy +02691156-6459a6977cce8f8789b0d69aba91f1ef.npy +04379243-9928c36919730b927c077130cb57dad.npy +04379243-d7d732d0ad7537eb610c2a68437007d6.npy +04090263-782f3821e6b638d6fb6bde4b7e6c6613.npy +04379243-a31867914b71ac40d776c08b6a3d0a38.npy +03948459-ca012a47cf5efca23f9d84f9a87a44e4.npy +03001627-dfa7aa13ee696833593ebeeedbff73b.npy +04379243-16f603525c5ce57b23f7198a00163bb6.npy +02933112-45039a5ac0912f8523d871b44977a702.npy +02828884-68d603f0483f4f869bd9ce04b3b1fd54.npy +04090263-76d55781aaac09f918b61860f81c82f7.npy +02871439-959c45c154559acc6e1ae929b00acbc4.npy +03636649-99ab3dce10653cb7f4525a0066419a00.npy +03001627-cb78334a5ad9517d7a31dd5af93fdb5c.npy +02958343-bf652fdb40c4cb3696ab9df3b3d7537e.npy +04379243-82e4990a3a9290f33ffd3a8003988fa3.npy +02691156-6e5810d6fc96e4a7db73445864b72015.npy +04090263-253bf52d80c11314c7d00c29d97b78a9.npy +02691156-c0375c2ce28292d9a179137acc8d4437.npy +02924116-2ddf7274d729c372c98c13d6112727de.npy +04090263-e6017a1e15095b4e6314c3b6a3a65519.npy +04090263-4929111d16135ccf613792009f64ab4d.npy +02958343-d09039d34746615fbb164ad50a9faee3.npy +03001627-2cf7ccf97b09187fcb7547c95fbdff26.npy +04401088-3ff176780a009cd93b61739f3c4d4342.npy +03467517-ef4fd97b0605d39d3f1082c2ac460e88.npy +02958343-36f17730152ac28116abce8cb03e7794.npy +03624134-102982a2159226c2cc34b900bb2492e.npy +04379243-95a7581a491d3706996336ab975e6575.npy +04256520-ebba3b7239bd43cbd4fd21ba7448467e.npy +02691156-53edcc6832e776dcca8607f540cc62ba.npy +04256520-3eb9e07793635b30f51f77a6d7299806.npy +02691156-d01da87ecbc2deea27e33924ab17ba05.npy +02933112-d3759f1bd6dc9652f51f77a6d7299806.npy +02942699-73b02fe7b4b2e45f74cd541b34c6124.npy +03325088-bd23c02e78913855b362845c6edb57fc.npy +02828884-3b7fc97192e483ebb0bf045ee98272fc.npy +03991062-5091d2d8b43472ad4182a764d1311955.npy +03948459-a2ae72e791228034e209cfa3a83f54c7.npy +04379243-a54eeb7ca4dfe0bea71c812e027f94d9.npy +02942699-e9f2c58d90e723f7cc57882dfaef8a57.npy +04530566-24a0d85f723fed2d7f332834f123f44.npy +03636649-32a196685d10bfcad7811c9daa943fef.npy +04530566-30cf2b36478a21ee701c1f58e22b85e8.npy +04379243-fb91ba29b46a519f8f37c398c1a74a0f.npy +03001627-94464e51e6f3be07f9443c9263f2354b.npy +02691156-7cfb337744133ea1bd46d022fd7d80aa.npy +03691459-9785f01a6ee36e6d874a6a37ca17d9ff.npy +04090263-4a9c2632d6055fed735fa1ab17311ec.npy +04256520-8e61d151220b5397970d4dd67731c543.npy +04401088-112cdf6f3466e35fa36266c295c27a25.npy +04530566-d45f39e14c365801892294bafc22e040.npy +03001627-a1734a851af178bee15475f0b1eb22aa.npy +03691459-d337b40eca9f87259fd3da8ff7252b25.npy +02691156-d220ffb04a5ff31abd46d022fd7d80aa.npy +04379243-ccf3a20e438ecb09384512f195951058.npy +03001627-8daeb5877bba8cf5936c7265c890fef.npy +03001627-36843ea8984df5a63719086e0b4ab8be.npy +02691156-530d0edd6e2881653023dc1d1218bb2d.npy +02958343-d2b847baf4a6d1a5ff1370452e3a0154.npy +03001627-22fe855981e97ec5a1bada754e9e91.npy +02828884-c541d59409647408ad5067eac75a07f7.npy +02924116-98ab95c8a34196e1894431539dc5c19c.npy +04256520-1dab0c0c72f9cd6f593ebeeedbff73b.npy +02958343-7c0bad8b2b62cb7c673ddeabdcc8c6e.npy +02992529-f1b9de7276c1b07fe5562f06ed322f7e.npy +02691156-cd9062c0065ee3a4727e0d1e650e3b69.npy +04401088-6adb3426ac55ba827efa8dff0d683ef7.npy +03001627-c16a1a47bf34a84d157e7edaf1e3e602.npy +04379243-e3cb6cc8df6f7390d1a63a2e2039ff73.npy +04554684-cccfe2cec3069c449c72dfe3cb318a90.npy +03001627-3d57e65ff4cc42df70a7748e958c62a2.npy +02691156-8ff8f3c845e7ae8443afdb9c81ff2967.npy +04090263-809d2439412bcdac896cb6094e2801d6.npy +04090263-ee5aede335490e0f76b7c600f9352862.npy +03636649-295ba9410657325f9d7f638b2b2e0564.npy +02992529-41f5caf37dafdecc5dcb6feb4bf8ce13.npy +04379243-a9a81543d5297d13dc20930e6fc85682.npy +04256520-deb0889d902f08bef51f77a6d7299806.npy +04330267-bda4558e0312ccc174dae1b41226ef1f.npy +03001627-2a1d80a0aa67ee7585d33ad8f24c4885.npy +04379243-5aa83cb8217619d9ed8de30c53213f6f.npy +03001627-ce074e18e988a481d082d95e9bd50b49.npy +04379243-272a4cf3cfff3eb1e173cee47fbaa88.npy +03046257-5ffbd3bcc935279a8cbe149774a11d9c.npy +04379243-e35775e1f550d3d65339eb67f6086a2b.npy +02933112-47344f869d6c12e486d53ab0fe94e911.npy +03001627-593f7c848e6246ad8c37cfe791015e2f.npy +02691156-e431f79ac9f0266bca677733d59db4df.npy +03001627-5f30af30db19dd23afd330d4b2aa45c9.npy +03001627-5c247c042e5fa6077b712dacb1db0737.npy +04256520-3c30c45a5ba3b535f564f8e3eeb8449e.npy +02691156-54066a3cdb79ac8fa5cbab5aded19a14.npy +04530566-bed3fb84c9b876f930d7c2b672980ace.npy +02924116-c7547c076d6c51d752470de2774d6099.npy +02691156-6fe837570383eb98f72a00ecdc268a5b.npy +04256520-470dd8c92aa1b9ba593ebeeedbff73b.npy +04090263-783e6e45a8b4125b29ac2ce4d16a7d50.npy +04090263-389370f7e03b6312eb73ff4c9e061b8e.npy +03001627-5b0e833cf2ea465e42bd82e95587d8af.npy +02691156-461891f9231fc09a3d21c2160f47f16.npy +03001627-f93bbb0ae5d66c075fb57c89160d1cb7.npy +04530566-3d33ac667a885a1a7856807e3e4b01ad.npy +02958343-7b067be3aa39b1a124853ec273f6c1d2.npy +03001627-780aec25d416fa07ca9b40e76e725878.npy +02808440-3bbf438a17d77cbe3321831d2245cf06.npy +03211117-f3a03a173932c42b4b9b715645ffbf22.npy +04379243-b1850a02aafbca6aba18ade30e563d37.npy +03001627-6af67c2dcb4c38bc67f0a77fbca7cda2.npy +03046257-4ca5e78eadeefd8651c1709f78d865ba.npy +04379243-9f56c17cafc1ba35bcf7c2310bd3f83.npy +04090263-b6cd61c71fba44d512b38b1d99376c0b.npy +04256520-4cd5a2a90a9bdd5eec2fdb822d0e9d44.npy +03797390-7d6baadd51d0703455da767dfc5b748e.npy +04379243-2b1684e4cb37d9e8ab541fe336214393.npy +02828884-4cd23aae912b7de019fb4103277a6b93.npy +04256520-6a62d0d3c8eeda396ba836372832f055.npy +03001627-e94089cce370e7d1aae894b47cf9777e.npy +03691459-82b9111b3232904eec3b2e05ce8fd39b.npy +02958343-45f0ea3cd0df8624e341b5704aa568bd.npy +04225987-792953b4101753c6ed3696d854eee1ec.npy +04256520-725041f78f7c4274515d5d6477915e98.npy +02958343-93942ab3fc970415c596a26318046886.npy +03337140-c328da20f2af4eb14c3aee8e9d3a6ffa.npy +04256520-b53bbce3774bba2f5ade1effc174de.npy +03636649-7a1d06ba4fec22e8dac42bdc1d2df4a3.npy +04379243-645500232eb286aa8f6d69f1a6681149.npy +04379243-4bb4904b8f4c7f8b0e5927ab4191382.npy +03337140-2731349879db84fc24517c38da518f49.npy +04090263-d05f6ac929eb1019f5cbed688a0bb106.npy +02876657-7f5db4889a433ce5e7a14f6d159dcd47.npy +04256520-4c6f6eb326716c8fc71d1873c074ffe5.npy +04090263-3d0b35ba89b8c600efb47d8e2c9f3b57.npy +04530566-d7fc7ed59558b7b3f3e39f2e17005efc.npy +02691156-6859dc976c0528a831fec775e1dce6b3.npy +02691156-67a6b5b12ba64c529a6e43b878d5b335.npy +02828884-d23ca8dad2064c4ad5067eac75a07f7.npy +02828884-d3a5134df6cd94e2e8db995f7899d418.npy +02828884-621c4fcded12fff2d07d128adae16ff.npy +03636649-5c5119a226e1ce9934804d261199e1bf.npy +03001627-6ec4d5fa96861bcd70311dea98ba710d.npy +03001627-8d2a4106de2e0e9f952334e469766710.npy +04379243-6a3e7d05a7ceb4e1a3df3190f4f32918.npy +02691156-c5143d3be7f1d0eb27745e9b6b461e93.npy +02828884-7c3314a24702128d19fb4103277a6b93.npy +02808440-5bcca919768845bdd0043cfa915003ff.npy +03593526-3879379848c2c0c55b2f23b9c7b146a8.npy +04530566-dcaf4238da8ef379106f24d0bacaba69.npy +04530566-6737f75bb87e3cc0847c4e55bb965ab0.npy +04379243-8d9e1624c85dc88621bdbc0445d9f748.npy +03624134-7e0ea29ff4fe153fee2a04c68bc263be.npy +04256520-b6694e5bb51f8861f51f77a6d7299806.npy +04379243-bc6646a52843dd63474659fc572ff56b.npy +03001627-ce1237c5ad42dd7b737a00f007529fbf.npy +03001627-d409dbda0a34a953c9020fbe6b2ff6.npy +03001627-a2eaec61c28670a459b42406a4cdc4b3.npy +02924116-54de13044a09529b3b16ecf86da2e780.npy +03001627-c54aa12a3d8c34e2efacb264ebf1ec75.npy +04379243-335bf5e7f636ea198be1375d26d1cb89.npy +02876657-46b5318e39afe48a30eaaf40a8a562c1.npy +03001627-3a5c8d46fdc6793b956abdbfba57903a.npy +04256520-53812514f0d50568efc579970fcfc006.npy +04090263-74a38b74bb57a2af6a405aa597e7fe24.npy +03001627-fad907934656c52ba1abaa6eee3840a6.npy +02992529-4a7c0d263fa0cc119553267f4c8c48a8.npy +04256520-f01f6f88519a58e0e015ffca2672af29.npy +04379243-1abed35643d34f60afed86cbd9fd5335.npy +04379243-f5f7ce79ef61e0ff3f0ee3307f850b4c.npy +04090263-a51c1dcbed07d1de27be842e82df28b3.npy +02924116-9af22616a6b5b59326fc4e4686c940b.npy +02808440-9a4d71b2741f45f3afc9f2442d869509.npy +03001627-e72bad036bcc04ea3f68fa735d443de2.npy +04256520-3ce2794845ba4bff5c63d035d2a7c889.npy +04379243-b7bd6522f540436c23500a5b036df62e.npy +02691156-f7110ecac70994a83820d8f180caa23a.npy +03001627-82979f3a00ca7b5b0003dd98e70da8e.npy +02691156-729aa8cba8e1398a43afdb9c81ff2967.npy +04379243-b61984e31dfb04c1d1d031a1b745cd85.npy +04468005-45920718b96cb262ddbeb5a3d249400b.npy +02933112-c11449b64486b4df4240b2500b599345.npy +03636649-7b53493f7944fcf2b691e708071fb777.npy +04379243-2e2a612aaeafebd5ea23ec7dabaae1fa.npy +03211117-bdb87409ff3ba876cfc4c39af557e76e.npy +02958343-ccccf7342390d139ff1370452e3a0154.npy +04090263-305a895b0b06808b9d5aeb7097eddbda.npy +02691156-39ae262853031e42aedf20f7099e25c5.npy +03001627-fd5492b732f41dc3f7628281ecb18112.npy +04256520-5d9f1c6f9ce9333994c6d0877753424f.npy +03046257-4d804d5f4e5d87e88d84bad46345484d.npy +02933112-1ff28690a2ba31e4da5feafe6f1c8fc.npy +02801938-5c3dcc9b312de5b5a5d9ad16964840ab.npy +02691156-b174db77afdcdd055b2a16b1d9c48e6b.npy +03001627-52d687e4f4c59dd72535b68a1251d8a8.npy +03642806-a01beb9be51756f3a507c96c993b141e.npy +03691459-3dc77d756da1ff5eb3b44ad99a214777.npy +02992529-bdcef95e8efb2665408f0e810863705a.npy +02828884-c104f4e4a21ef8d42c29915205c35b65.npy +03790512-8bf620bd023c602b74f7bf9c15b075d9.npy +03046257-31d2d0a213bc09b33c2e50348f23d3d.npy +02691156-bc2c90ea00831423908b15214255bff9.npy +02924116-af060666a0e474adf59ad08996c77e8.npy +02871439-d841664bb8c7b842cbf15a79411ef31b.npy +02958343-fe860c6a74a86905468bac13e007a6e9.npy +04256520-22f89fd9e2a9f1a6bb6bc0db07c71e8.npy +02808440-61a7615cde3ec86a2cb48639eca80132.npy +02691156-5aeb583ee6e0e4ea42d0e83abdfab1fd.npy +04090263-4d772170bb26d40ea36c408ff083fee3.npy +04379243-9aa0b98bdeafacede76bc197b3a3ffc0.npy +03948459-74264c103701bcc23baa63499ddcb388.npy +04379243-3d7101bbd994e2f5296ea8292ef2edbc.npy +04530566-aba35304010a7ca093f1a6337ed3a54c.npy +02828884-2e2518a8a2f335ae76bc197b3a3ffc0.npy +04379243-23506d31a9ba77201b54d8d0b255b88d.npy +03337140-3bf437403138e6c9aa669fbe8e7a7c4d.npy +02958343-1ba30d64da90ea05283ffcfc40c29975.npy +03624134-ae7744b9e5bb5a11e9ff7117715adddb.npy +03211117-3899bd2eb8f9e9d07e76a21e51d48a61.npy +04379243-58bfcc581879c121b20808ae6de0ac93.npy +04379243-9ff98fa1fd750053cf853995b84c068d.npy +04256520-45963319edb54bc0dcb4d348d782a96f.npy +04379243-bd14692fff933409856ce0c2a704bc40.npy +03467517-a7c0bad6e907cb8793f0194265a9746c.npy +04379243-cf2ea610fbafece363944951133f1c85.npy +04379243-bef379d51df02d5fdbcb30b4afc25496.npy +02747177-37c9fe32ad87beccad5067eac75a07f7.npy +04379243-ecf3f077d30540fe5d5ac0a8c21f0bd4.npy +03636649-3c4d8c4ebe9dedbc2cd2160e449d45ae.npy +03001627-1e0580f443a9e6d2593ebeeedbff73b.npy +04530566-135a15f938c824ff90e2484c52623a2.npy +03001627-7e2b07c0ebc5781a297936c81e7f6629.npy +04379243-7e1d0214a916543b37b2bb75885cfc44.npy +03211117-7467b25f70675892d50c22be0354e623.npy +02924116-3858580452682f43ac1817b697e11672.npy +02828884-f57c2037fdae635b29a9b1ca9709749e.npy +03046257-32ace01a69fa498e177ef3150c947f22.npy +02958343-e9c5e6d46c47129c5b72003cd427d0c1.npy +04379243-6d09606aeb54b55659a44e6453790000.npy +03991062-dd2f38a2acf5334781cf48bf3eca784c.npy +04401088-c56262f4a6a7fbe5fcae16e8230396f7.npy +04554684-73425393306ec8cf46d396f47f99de3b.npy +04256520-98f43bc0ca2c510ea12caf23554642ba.npy +03001627-d31ab2866270fb1c19fb4103277a6b93.npy +04379243-8a63086a3c861151ce2bbb5a9dafce04.npy +02958343-3c97b002e510db11e23d60a1b706b44f.npy +03001627-4607280c3a4286b7319c7c751f273141.npy +04379243-214374134d21f90354482522828e74ae.npy +04379243-c2f870eebd0ac7494719088c8e42c6ab.npy +02958343-791e45f93e9ba58071a126804ae24042.npy +03691459-57b8d08d37d835995d0dded52efeb4fd.npy +04379243-fb4d877cc4f2c63b20768660cf080d12.npy +02691156-300a0c78e402decd7e67bd3e242c324.npy +04379243-f84b49a7d9e6f31ae0c8359faeb78bbe.npy +02691156-ffce3c994052ffea339b6c8cc24f619d.npy +04530566-61df71a58a9d0161202de8d12c6f7633.npy +02691156-ebd991666f177f8f575bf8a4b14be4f4.npy +04379243-8574daf4d23e75da042d36b1c1b84.npy +02691156-2705c3edd082f0987f1f82f6fc8747b8.npy +03797390-3c0467f96e26b8c6a93445a1757adf6.npy +04379243-7b411de42d4960eb6e25f3efedf6785f.npy +03467517-1860264e320c7979f4baed97c2afc4fe.npy +04379243-b48d04aae94702504b3c42e318f3affc.npy +04256520-d7a7bb6725ac5248febad4f49b26ec52.npy +02818832-f6d07714c090b2afc6c1b30c2119b092.npy +02828884-1ea895308f2aa98f966097adcefba56.npy +04379243-83248f27f069f0fc8312881285c04cb3.npy +04090263-313c2f35e1c461219f433921788191f3.npy +04256520-8f71670ddaa954c963860d683ccd0da.npy +04256520-7b76ae65480d1312538c0715f23f94d7.npy +04379243-1949b4cd6b88fa0713a5873d239ac557.npy +04379243-9823679747e563b4d42b9650f19dd425.npy +03001627-60cbca441e3f062444ac83b3e97ad658.npy +03761084-ed20db84209663b0c22f3fca4a074c25.npy +02691156-e59c4f290d8585a862b600da24e0965.npy +03001627-2b4f2fc77c47056eaefb25a27e962525.npy +02933112-e4523c675fb6a103d08b0f17fdc8a28.npy +04256520-b5c6ede83e55d05048f174663905cbff.npy +04379243-54f4d28ee9986b329a1a0970b4896ca3.npy +02808440-e3779000fe8c6805ccd0340812259a39.npy +04379243-3a7fb4cf118c30d36f3d2b1b15fba494.npy +04379243-dcf246280361e20d1bf2b66b52bf6885.npy +03636649-b0a3cf1e09f7a3591c1ef519b9196b63.npy +04379243-22add506f2a09c8dab93f6188b226527.npy +03467517-5d27923586133803ba3161efeed0ecec.npy +03001627-228d5702c588fc1cf7628281ecb18112.npy +04090263-6af8538d532e44237b1f1d03ed22f671.npy +04256520-c474bd0e12d386dfe25bd42000b74e3f.npy +04090263-7bef98c5eb45b13c6c1e54aa8170142.npy +02808440-f1395152e42dbbb33321831d2245cf06.npy +03001627-ab62680f067bf94dd6a6b5838ef6b356.npy +03001627-e04ceec8711a6027a6e27bc066049db5.npy +04256520-a32e10cb422cca67eb9f96cccd63af6f.npy +03001627-31fc10f348cdd2f77f754cef9da1323a.npy +02958343-2bfea38242ba63cce77aa0b62eed1492.npy +04004475-79281796bae975956751803240e2d3aa.npy +02958343-1104f0924e03f2b6fc5886e868449015.npy +04530566-3f3912cf68cd28eed7259ae7450dc47b.npy +04379243-a47fcd8bc5aa29dc998473a1ceac4e95.npy +04090263-f79014425f660bc4d93d9e447c233c3c.npy +02691156-7206b1f248826f2398b39d2f77aef0eb.npy +04379243-2eb880249672bc2386b647696ec80093.npy +02828884-b997659a319cae6369923f7b2ea9aba.npy +03001627-79be636f7f6b66724fde46457697d80.npy +02958343-12f2905dc029f59a2479fbc7da5ed22b.npy +03467517-77f178a2b61cbd1e76d05024fabfa1e5.npy +02828884-46cfcb7eb682d16d2b12aa6a0f050b3.npy +03001627-dacbb2d9dad289b1492d9da2668ec34c.npy +03636649-99d884a5b3a6677bbebfb887e83028e1.npy +04090263-9c4ba5d99727de4f737477c115ad5b33.npy +03211117-f34958255486228cd174bb92d075f795.npy +04379243-606b2e47238b02178c37cfe791015e2f.npy +02808440-295ea26696a0e45b3c5aa738749715da.npy +04379243-5db80b2854ccfb6ae2b372d25f6c9482.npy +04225987-2026cbe0ebbe1153d975109d955e6652.npy +04090263-5b1434e9b907eab76bcddb6c0dc071c3.npy +04379243-adf574f947f00bdd548b2639ebc3e759.npy +03001627-ef4e47e54bfc685cb40f0ac0fb9a650d.npy +02958343-26d201a532879a60a7fd25564c2e888e.npy +02691156-b7f6e94ddb5ecc2366cf1b4a8fc3914e.npy +03001627-83d3b40a6ff6a04af4b6538438a0b930.npy +02958343-6749e5a1458ead5abda733a39f84326d.npy +02876657-30c6b5511ff09ac33526ea1c3de37e7.npy +04090263-3c10faabf2ff5415ee72fba28fa8d35f.npy +02958343-1b94aad142e6c2b8af9f38a1ee687286.npy +03691459-1ac22719af776fcea2626afcc786d93.npy +04530566-7d2194fb89c42da8ae5c852356538a5e.npy +02958343-206e39a5f67f4a4a81d0c86cc18e6647.npy +02828884-3e5f4d788fcc628f442b181d72d9d1e6.npy +02828884-f3e13747a652b96bf5fb97c1f9661c61.npy +02933112-b184de34d988236464a7317444d5a8d.npy +02933112-1b92b53bdb962de337aa612844f43db0.npy +03001627-fa6a5806956d82aaad484915511ccff6.npy +04379243-1d19305840960acde220a4c1303a51c.npy +04090263-8c9e592c95f95e7c9a6e43b878d5b335.npy +04099429-ca746c12c01a09b58db04a0e4b407440.npy +04379243-94ffc8179ae6bf8ddcfd6ca2b952d624.npy +03636649-bafc295a6ffcb375c3d3652f80cdec64.npy +02958343-192bc73d5825bfc7bda72093f9b5aa73.npy +02958343-14330011009dacfed49701eac14326ae.npy +03467517-2ab76c46285aaccc6505b7589f976309.npy +02958343-92a718b74a2e5e84fd2d6c7ed5a8dbd.npy +03928116-934d437cf82c0de5cfb9b585aa85fffd.npy +03211117-e1d73ee44f1d2422b5fb024f65f6da.npy +04379243-2a88f66d5e09e502581fd77200548509.npy +03991062-1a03376343b2e4f0c27d3c9a6f742a5e.npy +02933112-4b75b3d199523a91f8d6a4359d6a181b.npy +04256520-63e8ec717a68181fae1162148fdbcc5f.npy +04379243-aa96fdfe679adefb203eb08a0c3b4355.npy +03636649-2ac3b0a04514988e8c451c71f65d5dec.npy +02933112-bdb118e2b6c9f4d712de5317fe5b354f.npy +04530566-996c90952cfff5b24baa0720a34ff704.npy +04530566-67dd862f05f659c71f98035449adc4bb.npy +02933112-5f44807953f9babdaf31a22c7bed177d.npy +03001627-3ff53879d12a2259cf004563556ddb36.npy +04401088-1621e08661de948d7532dfb76fa58e9e.npy +04256520-2554d1db5fc9ebe525f8fb09254b26f9.npy +03211117-d59cbf752abeeb17f1a5dd559b550d68.npy +03001627-2c251c2c49aaffd54b3c42e318f3affc.npy +04379243-6c06faf4538bdc00b9e8bdc9c4a49aa2.npy +02876657-a118d15a0c74091e3ba6f328e4cd62be.npy +03636649-c4e8a6d40f6433928eb8d149efa4062.npy +02958343-17926c1ef484b73e6758a098566bc94e.npy +02691156-d5189c00524f662c79f9bc8b647dba0.npy +04530566-1c4ea31563b54bc8b77192b0405b4a6d.npy +02876657-cbc1cbc9cf65e9c2fd1d6016d24cc8d.npy +02958343-525c1f2526cf22be5909c35c7b6459c6.npy +04379243-5472624a2a130443e70021280aa1db1b.npy +02828884-b8ae866a44a272bead5067eac75a07f7.npy +03790512-a7554de7ada3163fbec38f8cdf3f0f2c.npy +03211117-538eebd970e4870546ed33fa3575cd87.npy +04379243-19b46cdd0a44286823eb3ad3d378722a.npy +03642806-ec3223edbdef2db93334fb6668ccd834.npy +03624134-850cc847a23896206cde72e597358f67.npy +04256520-1a9d0480b74d782698f5bccb3529a48d.npy +04379243-ddeb44a5621da142aa29e9f0529e8ef7.npy +04379243-7713f8a266cfcb1ee31752932c101137.npy +03790512-4fd8e8522a431781924dd6806b28c0a2.npy +02992529-fa1088998ad523edf85a324c5324329e.npy +02808440-275005a67aba33ca9d97e7b300a8d98b.npy +04379243-719c8fe47dc6d3d9b6b5a7b8c31557c.npy +04379243-e7058b820e66c9249cd431573238602d.npy +02933112-cf57b6a6baeb421c8c180d5d98aa66c6.npy +03325088-e7e03d363f0bb22376c18e71fd49c4dc.npy +02691156-e3fd510add7b1aa3c19eb6ab3736de88.npy +03624134-1e198106fd8339674e5a4dd299df24.npy +04379243-5ac2020b6b8e2c5c8e5e60055b9b9f67.npy +03636649-bb04811d84ec072130cc41b666fd9890.npy +04379243-f720b36f39f9dc0e5582a46a1071249.npy +04401088-2488bca663eab268d53bf953feb52e3f.npy +03001627-8c7d2eab593269f8607566378b3d8827.npy +04468005-7670f8aed98c8a653015b0b4292af7d.npy +02691156-6fd578ff0ad4f6e8203936772104a82d.npy +02954340-5eb9ab53213f5fff4e09ebaf49b0cb2f.npy +03001627-3d32d89db2286377e63c6421b71f17c8.npy +04379243-e7eec2839ea91f07df6cfab91d65bb91.npy +03001627-b371bb691811acae68d92632b2a01360.npy +02691156-f58a26c915e7a1dceae7a0fa074b4a2a.npy +02691156-6422d4a9c5b5b8f350361148ac946a05.npy +02691156-87d37c43f41871fb4dd260a1dd3357bc.npy +02691156-a61bb94e08709f2bd0734afa0d357999.npy +02933112-2a3a3bf0878f1fa4c59350d819542ec7.npy +03642806-a4eb5dea7eda6ab58e5480b52f7861ca.npy +03790512-3837c8ef573c2a7b360cf6eb12fae4.npy +02808440-dd49561080df1a3f798df87163b1956c.npy +04256520-605b9827489d47a14038d588fd1342f.npy +02958343-6cbadb3a39216f12ac6dec6f3725ccf.npy +04530566-19cbb5d8d74f8813e60e51f454cfc3c9.npy +04256520-2862150fe6816499130963f0203c947.npy +04256520-4ed87061082a0ecb273e86fe77f08a50.npy +04554684-6b5bd7b97b0fafb83bd5bed2701d5593.npy +02691156-3692c62cd29c6f1378a64d47db225ea2.npy +04379243-bc4167ab0fa22678e0fcc90cf126de96.npy +04530566-b7f288e9187a72ea5d3426ee101e9f8e.npy +03046257-e133ca5fa7e49536fc5a6a6856432614.npy +03691459-348d289b6a08e7b44884161c20b458b0.npy +04090263-c89488a80cba5fa5870906b5178d97bd.npy +02876657-b13f6dc78d904e5c30612f5c0ef21eb8.npy +03691459-39318878f6e98ed2150eaf7a4ddb8bec.npy +04256520-253ca4f655355b6f8bc1f8036e08e44.npy +04379243-1e588358e4681e1ac3bd24f986301745.npy +04379243-31af0afdf9d7bcf7855931d119219022.npy +04379243-5f2b41b50439518be679b7e0ecf5c9b0.npy +03001627-9c0c0e1a83243dde6f283df3449ca535.npy +02933112-7f416248bb57f1c0598f1102685df4cd.npy +04330267-f8c7e054fc46898a41965be83b7745a.npy +04379243-a6c91690dc96de97f1c28c9b4267c8f3.npy +03211117-88be1603c4e07fed6418651cc29befff.npy +02828884-4de8d632bae6b3719e76a83ca837d918.npy +04379243-47008a5646d3d84d85969b141e43f51.npy +03001627-d57c9aac973c3722197c43c7dc584772.npy +02691156-46d4d453ceac2f5c3c3b254d8683a766.npy +03991062-be681177e9540e4be4406b3bf37e6ffe.npy +02933112-d22fae260519b9cc52051c3ad59857ed.npy +03325088-a61075356271eb72979c556124bee033.npy +04379243-c65061bae7f351e419fb4103277a6b93.npy +03636649-c263fec31c8d33874f51382fa3549a00.npy +04256520-3d863a4eb22c548e9d4d5dcd2cc33826.npy +02958343-2cd119ce9ec61f1af63ee8a34069b7c5.npy +03001627-6ae92754a0a90af09eb811e8e20749ae.npy +02958343-669974eb491f2bf7f8883e486ec8cb7.npy +02958343-86fa16c6da908e6b44221994b043fd86.npy +04530566-68dc6f43a895e7e143909b9ada90aa22.npy +02691156-dfdcc024d1043c73d5dc0e7cb9b4e7b6.npy +04468005-3149e8ae0b352b90b2faf16541f353f5.npy +04401088-2c1cf34eb46756c1aa8ee930afa0ad31.npy +03759954-273e1da4dfcf82443c5e2d7fd3020266.npy +04379243-6fa2751d57a4ee44490ad276cd2af3a4.npy +03636649-fe02f6594ed8b96ae85a3dc26b76b2ae.npy +02808440-1e454ec01708c3b24c62bee40dcdc539.npy +03691459-65688eeafdf06f8752e2d18963a75b4d.npy +03325088-98aa4c5587088c4430397be0cba58a16.npy +02933112-cb9c0c90b5c6cc9c189d4f3a6cc879f7.npy +04401088-fe553cf733e29a349426aa93c5c54668.npy +03325088-3c38d1543ca1b63a9bdc22a1e02e82.npy +02958343-53502c15c30d06496e4e9b7d32a4f90d.npy +02958343-ef3ed9f139571826ce27281f3b76d1f5.npy +03636649-d6fb6984306d5197e96d94a67d9df99f.npy +02933112-7664b9208a84674926a555721514c9d0.npy +03636649-fd15a43ef545096fb6f5e7b313e4eaae.npy +02958343-db216ae493f303f35b4953d8add91f.npy +02958343-fe3dc721f5026196d61b6a34f3fd808c.npy +04530566-10212c1a94915e146fc883a34ed13b89.npy +03001627-11347c7e8bc5881775907ca70d2973a4.npy +02691156-d2c7b95823938833339bd6b570381585.npy +02876657-c1ebc4254a9f43823c0d2e0152e91b5.npy +03046257-ee6489d2d306ca11f04a4560b57187d9.npy +04379243-c3c467718eb9b2a313f96345312df593.npy +02924116-dba9527c3318d060973f659238edf3c3.npy +04379243-616a8ac7d1667a062c1a544eca74c954.npy +02691156-912d89d2d910a81cadcbeb54f3d014e9.npy +02828884-5207969c5c38875a6eca3a103e1326ab.npy +03046257-7a7d7bf03278d81854bec7a9a0a11b9.npy +02933112-bc1bca3cce664ab11fc2b865c2a185b.npy +02808440-6fe99f67b888794254d7082b34825ef0.npy +04090263-66c92d4b4cb90639fb5c1b0f759e2bc1.npy +04379243-2b51c3e9b524ddf560b5fd678a94e9cd.npy +03636649-45d24c9106f2cd7614cd86cb97af8937.npy +03636649-701dd0ee2f3c86502feae54a926ce14f.npy +03636649-66b98bb2b9d34431ec7cbf3284585a40.npy +04379243-da2a145da58d39c7aa5ceeb306445170.npy +02691156-a19a5a459d234919c1ccec171a275967.npy +02691156-29c0b705d6368b6ef0483511b875f0d2.npy +03046257-40f7ac90780052f99539294b73a00f55.npy +04379243-a49d69c86f512f5d28783a5eb7743d5f.npy +04090263-403f8de536d9842222b13c48c34706de.npy +03001627-182c47283b90d8b2d85934de5898f0b.npy +02958343-e0bf76446d320aa9aa69dfdc5532bb13.npy +02933112-93ee050394f3b15e3c8d0fdfb1cc2535.npy +03948459-298d300e70d6bf24e1f2a1daf140ac9f.npy +04090263-a9af1bb4648a448c8ff23e7e19499284.npy +04090263-f0bf5f36ac0cbb2b1a77229b9f90bf5.npy +03636649-fa80490adfa79863aa9da28fb4d9b628.npy +04090263-69e470b712063a2212b38b1d99376c0b.npy +04090263-9301403c048cc8a3fbd94d73a34fbe80.npy +04379243-675c225ef7bf4b4b3db912a90d289dfc.npy +02808440-7e6b409823580827a80d0ac32aa1e5ef.npy +02924116-f7c66493e877829eff8a739dd4de4368.npy +04379243-24b27de7ebb852ddb472f782e8890df8.npy +04530566-42b1b67e53c9a8ad14de76bc030c9322.npy +02808440-8b42485c93c122643321831d2245cf06.npy +02958343-e6581335186f5f6d8f01b3789ded1e40.npy +02691156-572cae68af04663cb145cb2b20ac87f8.npy +03046257-c2a14e7178f4153cf100868565cc78ce.npy +02958343-3ae62dd54a2dd59ad7d2e5d7d40456b9.npy +03325088-9f6a53de1239fd6f50da8b99982a3057.npy +03001627-44689408a7d879a664d56d7ed347e929.npy +04379243-746ceaf694d85eb5d5192f88466da1dc.npy +03001627-502d0f698e20af83de03ab2a27ba7531.npy +02691156-2349e4b9a4ccbd97bbf3143b1cb6076a.npy +03636649-2054bfb594262929a89fa001ff6369ec.npy +04379243-f76bddb92341f2a8a8a7283d9841addf.npy +03001627-30fafef5c734f926781ba0fdb47276df.npy +02958343-77a759df0166630adeb0f0d7312576e9.npy +04530566-2212a794bfca650384d5ba37e7a649b7.npy +03001627-50afe00f341993ae7d63360731b4227a.npy +04099429-c55fcaaf3301f97e978efdfd2ccd8bdb.npy +04256520-4e37752b33506d0313dd6eafe1477be1.npy +02828884-cb4389a968257a7dd2b12aa6a0f050b3.npy +02691156-23616b4d03c5bac61232236eecec447b.npy +03001627-5ceabffee1c333293002761e7a3ba3bd.npy +04379243-326342c53d6b26bb423d2dbc3b38c389.npy +02924116-6fc6b7d388c5665e455762fa3afdf17.npy +03001627-1861715e59337785dd7092ed47061a36.npy +03001627-a4b14d0f3cf8a8d7b37a59fbad57ca4.npy +04256520-f16d8f18e03669308f00a5ba54aa8088.npy +04379243-51b4537837adf046fec95a1eac04b338.npy +04379243-612117acf07984468e52a975e7251969.npy +04090263-6bdec3364b44e8d8ec69d13496bd4a34.npy +03001627-3aec502173e565d9f7628281ecb18112.npy +04379243-1fdb34aefd1d6eebb4f9aaea3b860d10.npy +03636649-d12558a4b1dec5ab37b2bb75885cfc44.npy +03467517-9ab3ffd9fb12633227849fd89ddd1d7.npy +04379243-e857e87654e3807e201a7d6fe269f8b8.npy +03593526-ad035d236a8fe58bc8f30866a59f8bdd.npy +03211117-caed0c8c10f5738bafe08eb441adfc09.npy +03797390-d32cd77c6630b77de47c0353c18d58e.npy +04090263-ec0706775e0585fe4c82ce83dca284f9.npy +03593526-79ee45aa6b0c86064725f67267e31c89.npy +02808440-e15eb12dd12574171645a90c3364810c.npy +03211117-cd859f728ba259b0eb5d382c7eb13b28.npy +04256520-e9e54de1814ccae5bbb6a513934583ce.npy +03001627-d29445f24bbf1b1814c05b481f895c37.npy +04379243-7303502cf80ac41481f172e682de585c.npy +03636649-b4b15a84b9067f94a75d03186a0409e2.npy +02924116-314eb222862a53c7249d7c2e6eb0a2ff.npy +04256520-d9ed3fd60f4d42aa5f75bf17509b9bf8.npy +03636649-2871a6c7eca55e63d0482422df1ad01d.npy +03991062-304438fc83a3d9b237ab51e1f8240a33.npy +03636649-b2ed672f1d7c2a34664b3b9b23ddfcbc.npy +03001627-8d2fd4b9c583e1e6a12cdfe22cdc2f5d.npy +02871439-ebb7a6ef91d05970e3ada376097bba33.npy +02958343-31546074e22ec0b69ce1b0be9ab0ab75.npy +02958343-7faf7e8c2f383eafca92a4cdad802b45.npy +04379243-f27eba536ca8d428eb1f243bab39fb29.npy +04090263-3222936b563fbccddb83191ac0ff763a.npy +03001627-c5637356cfc865b33ad3591a780fa12b.npy +03642806-cbbfa8d8eff7a681797b57ae3deab1be.npy +02747177-c21d8f5641be31a285cac25b72167160.npy +04379243-90d08564f19279ce714531f0291497fd.npy +03467517-ecd53707110dbc208d8778ff441ce85d.npy +02954340-e823673c1edd73fb97c426435543a860.npy +03636649-a87825df690f900c408d050f12518231.npy +03085013-657c0de244576d26add3e496533730f.npy +02828884-469235b1160c6df1bd44b6fcd3e363b9.npy +04256520-828a2a981ec78e7c14038d588fd1342f.npy +03001627-668c488e900c2ede62a9eaa32bfe99c4.npy +02958343-cc8b44ddf6ec80fffd8e7b05498794b9.npy +04530566-fe7b7ad843678dfcd8c527d4042f291.npy +04256520-725af978a11bb5c383a0857b7b9398b1.npy +03001627-48bb4afc8cf90b4664215ab2598fd5cd.npy +04379243-9d0c9d8e03fa4f281a67ed3cdf707521.npy +04090263-b7f7746fc15d67343571d7763ba5a413.npy +02958343-46726bf3daab9d14b1bb46d2556ba67d.npy +02691156-ec2ceb5d65007bacfbb51ecfb25331aa.npy +04256520-fce0ca2464802f5ab0474c2e080078f5.npy +03001627-a65cd22689f14147f155d75bbf62b80.npy +04090263-f8ac577e9f60ccaf3e7a62ab2a088af3.npy +02691156-dbdca81a0f9079096d511e9563e4bbe7.npy +02958343-5d2e6410d4fb760befdff89bf9a96890.npy +03046257-ae4bd519ca0158d1624540d1cf03ba7c.npy +03001627-d4a2a7d81cef335cdf6cfab91d65bb91.npy +03948459-7568ed12e06320b32ee0f9a97b71d505.npy +03513137-f0a1e3c919471b2819fa27f3bdd7d71c.npy +02808440-a92ca67b245f008b54d7082b34825ef0.npy +04530566-337531151abc41a7b390176e65ea3f39.npy +04256520-b6ac23d327248d72627bb9f102840372.npy +03691459-e11cde2df1c508f7e098c9e597ef1d0.npy +02933112-38def13ea098f098fb266533561ee98a.npy +04401088-a04e8cce46e70fc48f2c50408e4e65f6.npy +02691156-b7fd11d4af74b4ffddaa0161e9d3dfac.npy +04256520-4da36f40feb209fedb52360728b4b83.npy +03624134-8e1642ad868579a57ef00b10b1a864e.npy +03928116-dc078a781ba248f016a0adac6af4232a.npy +03636649-5c8df2c17d09028543ba2b548bab2839.npy +02958343-d56104e27f9d5f55725a7749daae1afa.npy +03001627-a27818db3f288ac8473f10e6caaeca56.npy +03001627-bd6a8b133fa4d269491d6cee03fef2a9.npy +02691156-cfaff76a1503d4f562b600da24e0965.npy +04401088-2eafc16c78c43b35d9f7ce5b19e46227.npy +03691459-4ddccf2b67d0cef538cf6df9faa9b65.npy +04379243-460bd446c3f1cd5711beb49b60c734f.npy +04468005-9518c86ac24e7c91bfb63e2c713ae7cc.npy +04379243-93277f95f365b958ffd5817f210f277d.npy +02933112-51d9a60e0654e3622ea98d69e91ba870.npy +02828884-cb81ce8d2558935881faebbdea6bd9be.npy +02933112-59e0e7f6eaa54e359cf7640f6c7f518b.npy +04379243-eb66e5ca3eeddee87fc7604ac712879d.npy +04379243-941c99dcbf881c6939070a7367ed1554.npy +03046257-6073c2fa3bc752b314038d588fd1342f.npy +03797390-5fe74baba21bba7ca4eec1b19b3a18f8.npy +04379243-faabf2f29b99589991752ed21892d778.npy +02924116-dc172096d37448faa3cfa46226644b04.npy +03001627-9fe840a156a5647c9ce67e77fac3db9.npy +02691156-62e29787d3623618575bf8a4b14be4f4.npy +04379243-5700152736510e2b45c44a42b411ced8.npy +02958343-5d756a52f6f361abf500cc506a763c18.npy +04401088-e8345991892118949a3de19de0ca67aa.npy +04401088-267a2d6fbf29c04cbc17518d87dd1f7a.npy +02958343-b1f75a8e8b9e921a8a6cf8c6b92417f2.npy +02933112-70c0c5438f0da757307c5c16466b10c6.npy +04090263-43dade9260b93b2c3d204f0b9150b384.npy +03636649-57aa536c02ea697b2195f9e636aede6a.npy +02954340-3a666502c0432522a3340564b56a7f70.npy +04401088-b91bbf0a0d09d2eb243525d45e430520.npy +04530566-1dabc979fd569a0e850e00840470903a.npy +04256520-b08fb5e8df4c11c090a9ce3e4b15521e.npy +02992529-722acb5e8ccd39391e5d846d206adf3d.npy +02871439-caf2c03bfb37bbce35836c728d324152.npy +03624134-713e17148c90c902830e3a69f9610d57.npy +03691459-1297c443d9a147ed9d783559814f4705.npy +04004475-b5d3d85c016b25b0f39d7554d3e63ae4.npy +02958343-f4b86f895a221f353b0907d01b34682a.npy +03001627-1145248e1eba424d492d9da2668ec34c.npy +04530566-44ee47ab9926aa821e062833a4a1a38.npy +02691156-40c730231c4da8f33c3bcafb5ffed4c0.npy +03325088-d3aa2eeb7641d99fb9101063463c970d.npy +02828884-3824b040bd8906e0f155d75bbf62b80.npy +02691156-1bcbb0267f5f1d53c6c0edf9d2d89150.npy +02958343-8798825a3c68e5c7e0470509f60266ee.npy +03636649-48a5b451573920d44cb3aae7b27db2ba.npy +03636649-5aaf61da59f1c0773225afab722d9fd2.npy +04330267-2d5b7183f052b34f56efcb65c52d83a1.npy +03001627-3d029e681e0b4a0c12bdfd84d1dcaa33.npy +03642806-520d98e360cf44ec8139dd63d55edc44.npy +02958343-93d49d2e5e4ab1b7ae33d942430658c.npy +03046257-a911990b617749ee738f481f8560d58.npy +02871439-b7697d284c38fcade76bc197b3a3ffc0.npy +03001627-6072ff799065609b6bc601efa799c927.npy +04256520-615ebac351d7e8356051d49e4b21b83c.npy +03636649-bf659a08301f20f2ac94db38cec7b356.npy +02924116-e9afd0d7aa653df4b129901f80d24b7b.npy +04256520-b913574ffbe7400ce8417aef1b7a422.npy +02958343-3027a9d3b70435416abce8cb03e7794.npy +02958343-3b95f46c0133167b80e98029b8cda1b.npy +03593526-cdfe4639a2da7801d50406298c1adb95.npy +02691156-1e7dbf0057e067586e88b250ea6544d0.npy +03691459-b8b1643518382596aa623a443910bb58.npy +04530566-819a7b31f925a302474a33db0a80b327.npy +03636649-e485053f3e0d18252cd2160e449d45ae.npy +03001627-1fe0a612dfc3fc548be8b77157b819c9.npy +02924116-6f59f085a589522b6481aaaba8c72ee9.npy +02958343-96762f5d7f7e93343f9daeef6b843610.npy +04379243-8ccbd2949fd8809b82cdf8854f156846.npy +02876657-ae52386c7a6e25a1a666d1503f8e34ad.npy +03636649-4631e756666a8a208ca4aeb5e3b33af7.npy +02828884-f7b5756c04e354a0c1c40d87de24d930.npy +04401088-558c9b7e854db7da21844676433a0aca.npy +04530566-e177d4186bff96ea6dae8586082d789.npy +03948459-d706263b307d12c9d4f4334cc3aff513.npy +03001627-4aa70df1db0ff6ce2d19175e7d19b7cb.npy +02924116-967d5e9bb9b79d92ab2c2809513f396e.npy +02691156-9634ed6dc8ecae0026360e1e29a956c7.npy +02691156-18806a80387734b754c7b6e11bf7148d.npy +02691156-ab95a4e7f2d3cf9ca8607f540cc62ba.npy +04379243-e435c1e3430eb7b253fa79783efbc3bf.npy +04468005-b36bcada3b5d7c7ce0ba12f63b0c5b5d.npy +03001627-88042e6d331ffba0f63e8e405d49b8ce.npy +04256520-bff79b49732569307ea323bc74055b8.npy +04256520-82a13477581d96a1fd3e75cecd4d5ab7.npy +03001627-cacb9133bc0ef01f7628281ecb18112.npy +04256520-7fde281d5d2cf5bcdd2b32fd72ab4fd1.npy +02924116-f3f22f9a45ec3592b747ae6b3860f54d.npy +02958343-5823e5205bc7eb46cebc874b6631de1.npy +03001627-74636f18a539da1cab610b0c94236463.npy +03642806-ef6d43add46d0cae4e07b09c086cc5c4.npy +03928116-ce7a03d645722d503f7e27638e63d848.npy +03928116-f858955bcd01c82aabbc032d2bc8593.npy +02691156-4d139f21350f64d2425a06bba46b20dd.npy +04090263-a4a62998899fcea2fccc89e375e776d6.npy +04256520-34e48812eaf19420499252a7ccb366fc.npy +02691156-bbaa22bfada1dc0fc6194c8172019a35.npy +04090263-9c3f797d9b352d35669d741f4ab14065.npy +03991062-70cfce0a272195a236b0f2a1430e993a.npy +04379243-758649ba384b28856dc24db120ad1ab9.npy +02958343-4fa9b14789c8af5e3781057335c8a2e8.npy +03211117-5a20c7f723b42d2b74ff95ba57b167a8.npy +03211117-45406c697e4fcbced742faccfe08d94c.npy +02992529-748f4a9aee8f610e8463cde8953cc1a5.npy +04090263-81ba8d540499dd04834bde3f2f2e7c0c.npy +03593526-971d8456fc6fde71cf644619c59e0de.npy +04401088-9e302a3f21a992c0bb579d1d8d989550.npy +04090263-7dbf5ff231497ee511f7dcbb4a32aee5.npy +02933112-c0d58499d2cecf07e1c245f9728d365.npy +04530566-dbcf36d87385eeadf64bc205d76349ec.npy +03642806-4fc3d56243d2d8801ef1ccfaf50f2048.npy +04256520-64c8591e8a837cd5dc8d41086ec55d96.npy +02992529-c7ec332bd52f939f04143dfe595ba79.npy +04530566-ff7b2ba047233a5b149489fae2289e6b.npy +04530566-5fb24b87514df43a82b0247bfa21216b.npy +03001627-2e28fe9594c48874a6eb1dae0394cf12.npy +04379243-89157839dd80262087e118e254d6659f.npy +04379243-dd2238408ee5d84d8d1c97149a00bd19.npy +02958343-347ffb0b0761c6ba8514fc08fc0d2ea6.npy +02828884-2f0cd28e2f8cdac16121178eafd002fd.npy +02691156-6a54d956a8adb2d0e691625fb79e2c2.npy +04256520-5f5150a80e5be6159141f9b58470d646.npy +03710193-e6f75c44739ee7b48f74cdb60878d9a.npy +02992529-9b74db2ebc90ae4789905122ac8b41f3.npy +04460130-3668753b904e53c4b96aa5dc23c036c.npy +04379243-33c4c7c47b8874123c8f5d3bbb1a3215.npy +04401088-e70ce62b41a598dba48aee3bc134fbf8.npy +03636649-e35c4fadbf8d0426c26e81144f3196d5.npy +04379243-5a7f0ba2b1845e7bd2a79e157dad9b1a.npy +03636649-dde3b4bb9fb1ad25e0d089cf3411494c.npy +04090263-3dc3dd08910169be2e3059b0e19cba0b.npy +04256520-8dc7bba62eabeae9b3af232f92902efa.npy +02924116-8886dc9b9405c6d914f96752ea902e3d.npy +03001627-3f95c370fb3871621f98c0761af40e04.npy +03001627-e9f36f74e22ca0897298e452825d1f0c.npy +02933112-85ddbd698b3e7dfec59350d819542ec7.npy +03790512-4f30742005b7c20e883158c0007ed9ba.npy +03001627-bf0ba9e2ebcfb431e6fe3612af521500.npy +03001627-9d05b0a242a5ee06639159c697a89e8c.npy +04530566-ac52cf0b598e930ab38d3c03866c1379.npy +03636649-d357edb3b9ae47f230f6e0ede20c4525.npy +02958343-7751f6695ce5013bbda733a39f84326d.npy +04379243-aba18a9a32753bb6390dcdc075aa60c5.npy +04379243-21a65be5dfed538fa3461a37f23a9515.npy +03001627-5f2441ed2a9ec8fab5d55ded7962c792.npy +04256520-1f860a494cd615fc7d4bf609d539b368.npy +03948459-4af05095ad02dd8c9cd99d3d15a8756e.npy +02871439-465bb5a9ed42ad40a5817f81a1efa3cc.npy +02828884-26e3a9d86dc09155cb2a965e75be701c.npy +03593526-578096b08ef3c3534637188d1bc69cfd.npy +04090263-15a209524ad3fcb67b84b9482c4b66d7.npy +04256520-21b22c30f1c6ddb9952d5d6c0ee49300.npy +04379243-6f630e2080aa9f10e45ef4135c266a12.npy +03001627-3316a00869217c2632ed7dae08823495.npy +04379243-525148edf1f9aa72bc7f58784fda27b5.npy +04256520-288837a47f55c0e9d8d964adc0b6502a.npy +02924116-b875a7af988b644d29ebc23acefb248a.npy +03211117-fc0d0287ea544c707c65e97bab3e4970.npy +04530566-1d176576e4ded157a313c221866393fc.npy +02828884-edf14e0208ac61b570eb586f56eab45.npy +04530566-dd012d1ee91543ff500cc506a763c18.npy +03325088-aef73acaaf17e0b614b35a7d7cea7130.npy +02958343-54b89bb4ed5aa492e23d60a1b706b44f.npy +03211117-3077837de566c236a42abfb83da6a2e.npy +03001627-47ae91f47ffb34c6f7628281ecb18112.npy +04090263-5370fd7b6529876574e18e0e7a19212a.npy +03636649-206ef4c97f50caa4a570c6c691c987a8.npy +04090263-b68218340f090e03519f927f2bf92da9.npy +03001627-226f38ce0d46fddef7a06a265fb36208.npy +02933112-6219b46946f62474c62bee40dcdc539.npy +04401088-ac0967f9fe8f63f46b2ba76eab0d2b1c.npy +03001627-234f40c665976a51dc1e30a57aedbe31.npy +03001627-8affea22019b77a1f1783a44a88d6274.npy +02958343-f6a93b95e10a8b2d6aea15d30373dbc0.npy +04379243-bdf30e94446293c645de94e1bc93a4f6.npy +02691156-18e86ba0172154f3bc0909d98a1ff2b4.npy +03211117-94482409d0396dfa3f8f528a267748f.npy +04468005-d2a55d5745da47892aa93fe7a6076a9.npy +03046257-9937b55d4b6bd3b3f78bdf37d618e97e.npy +04379243-d126210a20db32c23027f298c7ea0c6f.npy +02958343-15c3b923c85d22796d8b9531f93cc8de.npy +02691156-d59bb0ad79371634f3d7c71ae132007d.npy +04379243-f5d9f518e284989cf930da774352b970.npy +02954340-6e983d20e0bf80296829cd4082fbdbdf.npy +02691156-b8720c5fee3264f735fc197bbabcd5bd.npy +04530566-9380065fd20eec791a7be2887bc37d1.npy +04379243-48ff9804a1ae69f4ad5067eac75a07f7.npy +03691459-a5c19b4bfab3a826236632eedd876bae.npy +03001627-e12ac2c1c707b7b2f45a7a3d26bcb6ad.npy +03211117-e7409303fa52f74b98de02aebd38a1f0.npy +03046257-3234632251c769afe460d06cd9b374c9.npy +04379243-2e30c286710fd73d492d9da2668ec34c.npy +03593526-1f5c74f0a55cbf9798d5fc0473d00a1c.npy +02958343-705840df46a582e2ac826a3c82da491.npy +03624134-9b3bb2c269ed48741c63053ffe1a64a7.npy +03761084-e1e2879a951cac7b178e7d331e641179.npy +02924116-462d1cff923e1e94c366973b1ac73478.npy +03046257-97789558032ec294f166e7ba85df03e0.npy +02691156-31b201b7346e6cd15e9e2656aff7dd5b.npy +02958343-6942e70e574edda3c8831f15c6e487ac.npy +02828884-9d7185edf0717575a6195e775546b04a.npy +03001627-6501972156717723e8b2b8dc0c816caf.npy +02933112-85b82499e3ce7aea3a5893ad04c930a0.npy +03001627-2abb64b16e61663ce99b044850de1b87.npy +03636649-894cdb80665ba73dbfeb5b5bfc3dfc3b.npy +04379243-97894130bbbd202df4b6538438a0b930.npy +02747177-5d756e92b734f2d2b12aa6a0f050b3.npy +02958343-4c1504f3463445dbbda733a39f84326d.npy +02808440-5b088060eeffc5723af30a3946d92feb.npy +03636649-9a976020602ee60b5fc8f4c1fc00b380.npy +03001627-3b57aac4b7f4b9f52d19175e7d19b7cb.npy +04379243-15ebb1e7e6663cbfa242b893d7c243a.npy +04401088-1984fb95afb6dae5804722305621f918.npy +04379243-3a3c922623ddb42e5d81820421265171.npy +03001627-8af939d95f201d17283b00891f680579.npy +03001627-507a5974b24dce2ee1fc1bfd241d8d6a.npy +04379243-d37fd2ce56b3340eaccac37ae24b8e2.npy +02933112-9ea0005f3d702b4f6cc679ef84e06ad6.npy +04379243-b63c8ddca680a2a3492d9da2668ec34c.npy +04379243-62a4f3c24bc69f593eff95e5c4b79279.npy +04379243-752d13c1011bbe94f68132aeb243f95b.npy +02801938-f76b14ffc2fe6c7485eb407ec5a0fadd.npy +03001627-b1f4b2c32f8a2fa77ee217c21e683487.npy +02691156-8675974f9f6ec91ceb3b5fc90bde085d.npy +02691156-d54ca25127a15d2b937ae00fead8910d.npy +03325088-57c9713acf2765a13321831d2245cf06.npy +04379243-a9747a8f0c31b46188793ca7bd0e6fb0.npy +04379243-ed0be8928caab4bdab610b0c94236463.npy +04379243-d70bb0c4015f6e10df2b21995cbbbc4f.npy +02958343-e07608ddf2b0bfeec726c061bf976915.npy +03001627-b47e994452b71943bf30e5b4764cebc0.npy +04379243-73f34f95a001731b855931d119219022.npy +02828884-608af07bd357d605f155d75bbf62b80.npy +04379243-30f06495dec55016bde93a1daa41f517.npy +04256520-ddc31f9e7064be80f51f77a6d7299806.npy +04401088-5e87bca3231cbdf15b5f05be350ae67e.npy +02992529-1ac1e6fc09611ff049c647f92ae11714.npy +03636649-fca3ffd4ee694c1a9c0ca344f487323e.npy +03001627-38c67c695eb4cd819e179bac86183112.npy +04530566-563d66d82ad3f27e324be6ae66f7fdf.npy +04256520-b653a75f89a6c24237b2bb75885cfc44.npy +04379243-99e89417f985d077738e43095496b061.npy +03001627-5db74dcfc73a3ea2f2ca754af3aaf35.npy +04256520-a693b27591fe6ca2fee6b7db2f5f826.npy +03636649-b4aeed70a21518fefcb8d8c6d4df8143.npy +03001627-d2c93dac1e088b092561e050fe719ba.npy +04379243-e3820857258a0bd2800d7b7d07715065.npy +04379243-7a0a47c08464a493d1433b6d2f686197.npy +02958343-7121e0332f0c2e0551a95aaa6caba1d3.npy +04379243-327f5df925ff54121dc8654936e2968.npy +03046257-50015cb7c658ce3d93f709c6d6d99cb9.npy +02958343-38b80589a780fc3af63ee8a34069b7c5.npy +04554684-49a0abbe22fb557bee526fc96b277c69.npy +02958343-dfe114950aa726f1cfd826dd468a5497.npy +03001627-286c07abeb67b83bf7248d9dbed7a7b8.npy +03001627-9b902b5c6570acb314b96b665a8ac321.npy +02958343-29b558ed31fcbb48a2cf64b275615f0b.npy +03759954-d48385dd958c4ec2f1e87737afc5aa24.npy +02992529-e8345991892118949a3de19de0ca67aa.npy +03001627-4f51dd4fc61c41a27ad11050da24bb12.npy +03691459-ec0a8e2fa00a746dfe74514a9fcabaf8.npy +03046257-447b9c347c64d6ab2d2d2896f4b277fc.npy +02808440-deba7a0e1fe26833f0aeabfdcb4e1dd9.npy +04379243-aa0d0d753ed85d62389bb6b6a6e983d9.npy +02958343-3831ed7bc22100f7c3c8fbe62717803d.npy +03001627-9a3a80065f75e33d822e11aea23332c0.npy +03624134-3bc1492102c727e420cb8f10e0bcc790.npy +04379243-8aab7aa2fed02c6f3de1a463b8ceba0c.npy +02992529-2874447c7552c6b942f892024869e751.npy +04379243-817f1c820e82cd498962005ce0e986db.npy +02958343-ba0ac1d1e25d3fad63f2c3a55558a78f.npy +02871439-e3edade4418b0b88bcb7a87b4876a2a8.npy +03624134-bf5cae3922d3cb2bca7250d90eb506cf.npy +02871439-74311e787aca16d661720f1d4858ecd6.npy +02808440-166f3c900cac3bdeda5444b776d14740.npy +03325088-c297a977dba85f9fb362845c6edb57fc.npy +02933112-b29de5206eb16c146ec91c2f4565a1ff.npy +02933112-1e25501b8930873129a50a2b3c5e5b6.npy +02933112-40df2ce55ea8f002c59350d819542ec7.npy +03001627-fbc87a27b5691196bd3b190b59dd9fb7.npy +04379243-4dba531ab70199ec3002761e7a3ba3bd.npy +04379243-a569cf5284a45a3f353c1d159a8a8422.npy +02828884-9699995246fd521ca909cd1ba5751669.npy +03001627-1de733a48e5607b22d9c1884c92fce12.npy +04379243-be4db395f7b2f089391e4d6c585a697a.npy +03593526-5e914dd726313181b1b4b514128408b0.npy +02828884-133d46d90aa8e1742b76566a81e7d67e.npy +04090263-df6581f0ce7c00421b00524af022276f.npy +03001627-56fd0fa3863cd4c17d63360731b4227a.npy +02958343-d776d298be6bfe88e78002a96f52ef26.npy +04379243-93a6eb93e11437e1bdfa5e0753fa3240.npy +03211117-25c6bdd929f9aef77d6fbcfb6b291844.npy +03593526-8b9432e22e801493ce364511e87f52b0.npy +04256520-7882a06b4612d536ae882f622d5cda14.npy +04460130-224934a28705403238cd8eb23853c009.npy +04379243-d6ef0aa7b674c171fb4f26e87f6a6814.npy +03513137-65bd772022c2ac094fd7d35b0d9ebb77.npy +02924116-76b521e4dca09e7f673ddeabdcc8c6e.npy +02924116-dc771f013d077fe4dde60bf2d879e14d.npy +04379243-138a1ff3aa457b30497839e108373e6e.npy +03642806-9cb54ee28aec14013cb02989e2da5a2a.npy +03001627-9b6d1c0f3a20783af51f77a6d7299806.npy +04256520-d9fde31ef5c2f3ed17b431cae0dd70ed.npy +03001627-91e4eb92e010047d3fc7406e820e0781.npy +03790512-ebd02a4811dbb91b594057aa2102e240.npy +03001627-6326e2f6e17cfc21d43c0a5e70f98227.npy +03001627-5043512b70a157835a15b6547f08c8fe.npy +02828884-605b2c687b73695c8da90b986150cc3b.npy +02871439-edf600503d359b7975e8c36bab2b18e0.npy +04090263-65bdbbcd861aa385ac52f5edacff5504.npy +02828884-c3f92e6a78ad156863b2acb037dfbcde.npy +04090263-28d70dbbc48193e0a39dc4a567ce225f.npy +04090263-8b1b66ae9e416cb13b5076da3c7eba98.npy +04256520-6f84940f81a61eef2e9208ffa1a27124.npy +02958343-e607a20da6c5132dd141480e2c154d3.npy +04379243-b0890c9a4332f7a07e28af1b4b42317e.npy +03001627-6549c13a4c96b926f51fa0238791f5dc.npy +02691156-7bd43965f17c25377209009cfb89d4bd.npy +04401088-2964d10d72ea38cf4857f88b08630a42.npy +04379243-713c28954944221f618af5c2f6d28c1e.npy +03928116-a6b26dfef15ace459e0d848896b0095f.npy +03467517-9925355d4b0deff6247a5be450795511.npy +02808440-a88e254ea9ff7b4dfe52ffd0e748a1ab.npy +04530566-88baa5e1db4d1c624c24aa820d0994e.npy +03624134-dde6b5fad601b25e80b72a37a25b7e72.npy +03636649-bfc4cae9fc343792fcb8d8c6d4df8143.npy +03001627-d38129a3301d31350b1fc43ca5e85e.npy +02992529-457b4310870bcf047f4e0c14aca1a926.npy +02808440-469536fd1244fed42bb02d55712c595d.npy +04379243-fb3c684afcafce085a3075d93a0a3a93.npy +04256520-7b914fb42c8f2368393b1800bfc51a93.npy +04256520-a3faa167208786cef81b7bffcd0a03c8.npy +03001627-403b4eb7194f563f79b3e1be3524f72f.npy +02958343-f45022f442368e60c038d3a33427a80e.npy +04099429-c486afc7d7184e0457c81888891466e2.npy +04530566-48a584c9080f7495b97c9314bd4647d5.npy +03001627-94b55dcb770626d9c8687ff9b0b4e4ac.npy +04379243-346db24c1279e8d273fdbe4b39ff4036.npy +03636649-e02cc9c4cac285419cb07ecb5b4102.npy +02828884-96d87da2fecf81ddd2b12aa6a0f050b3.npy +02958343-29fc55965346a53733d7c9e122eec9b6.npy +03790512-896f688e07909b9b893e67220bf9be7.npy +02828884-a90115832bb80dc956f6fc4b4ce1db04.npy +02876657-f079d5f4f4a8cd9318431871c8e05789.npy +04401088-da24f27173874672ed7485a1aa598365.npy +04379243-18b1461f48e0fe9aaf15b62af6b513f.npy +03691459-a1d1f232168607c81dd4da6e97c175c2.npy +03001627-c67949ee2c241e8e9b9f2eb77f5e247e.npy +02691156-6c8b2544144c38d99e8d5aab043eeb56.npy +02828884-71225307ddd5a772dc11eeca04f912e.npy +02871439-8f16bba329b15e6bdc219d6984e72318.npy +03325088-5b7e61559ed415c6f893b5bc716a3fa.npy +02828884-4b079b2e510fffb8cb2a965e75be701c.npy +02691156-55d0772f003a362916c1ee83fd7a7f1a.npy +04530566-f3f66f0bce27d439c1dbab1d1ee81853.npy +04379243-2b3b491b70535af2f7f596f1d05d059.npy +04256520-107637b6bdf8129d4904d89e9169817b.npy +03691459-8c23967793e62320825138352acfcb46.npy +02691156-aa2af754642256c08699933784576e73.npy +02808440-96fd142c3abacda0ccd0340812259a39.npy +02808440-290df2ce1251492db84959963148f2a2.npy +03991062-6bb307429e516e2f129f1cb6c6fa9dd5.npy +04090263-d980e47a5890b42e296e0e62674e2efb.npy +04379243-8b3543f09b36696b488017d48a7f7eb4.npy +04090263-2eea6b3bddd73b1be768fc5ed1ac23d0.npy +02992529-113303df7880cd71226bc3b9ce9ff2a1.npy +02933112-e0f6e225c7f88db19ea59510032cbc74.npy +03642806-6b6edbe38c23db5a4599f539a26d98d1.npy +02691156-ece25d89898c7d9090b1d6deb98feec6.npy +04379243-1615fc31b6daa088c3bd24f986301745.npy +04379243-4c18b279e078ebb91a8781c24b79ae57.npy +04530566-57b1795508e5f9d19996f95a20b4c45a.npy +02828884-16ce0976d3bca243e6fe3612af521500.npy +03928116-1a8a5e4095e7ca4749f90dfc30e57686.npy +02691156-7f4b166fba71407490b1d6deb98feec6.npy +03001627-72fd9c2f47db23987f377effd1f7ba9e.npy +03001627-e76b4872f067395988dc0b76b0c63f53.npy +04379243-b723429f1ff9df7dd604f93937ce2d3f.npy +02933112-6343efcc64b331b3e3f7a74e12a274ef.npy +02958343-40f2f3962e360a3c16abce8cb03e7794.npy +02747177-555a9bff25db49ddcb2a965e75be701c.npy +04256520-31e343b657358ed0a4e97ce1d10a5ae6.npy +04256520-23d1a49a9a29c776ab9281d3b84673cf.npy +03001627-60a8c55e653a107ca192483aa282f8e5.npy +04379243-d1525a08cc96beeec786af79f5203d8e.npy +02958343-953531696c554fb275dadc997718614d.npy +04379243-496b37559f4ac973b9fd3978c6bb311c.npy +04379243-409a932e371e12d490ad276cd2af3a4.npy +02801938-781c3a0887e320575ce2e5974a5aa15a.npy +04090263-51a8def44b1e4f40e8e10eefab4b2a63.npy +04330267-ecf21890f17fbe04a3cdeb33500ff1b1.npy +03948459-96013016f3e33bf3e1f2a1daf140ac9f.npy +03467517-95f9f944e62274e8a2bdf3e6e90db79a.npy +02691156-319cf93077118d19f64801ad2940cdd5.npy +02691156-bd22bcf18a9c8163adecb6fc00604132.npy +03467517-ad605b17253e57a9c0f719b596bfb81.npy +04530566-3f6340ffdc0de35caba19ce79eba1cbe.npy +04090263-25796f85c74347726a34aa94ca8a3355.npy +03325088-541954f6d461d83d76c18e71fd49c4dc.npy +02691156-4e2769ec84c0bd0454eefcdc602d4520.npy +03211117-a71826a92bedd8e1f3c3e7bb31acc31a.npy +03337140-67571ae65a181c09d42ccf5f969c90ad.npy +03991062-db562d86ea10c9eefcf9154182ccb5a4.npy +03001627-ee4858f78dc33591100e9bd5c4b0af54.npy +03001627-8f70be87d6eeefdf213c3458a0fe5598.npy +04379243-3eedf733e9318ee06bf0788e630e3deb.npy +03691459-5551b67ffe95c01b73c7253ec9acd58b.npy +03211117-dfe294c64407f6035c6271c95adbdee.npy +02958343-54473bc01457b7291b3636ad9ef344ff.npy +03636649-fed712ffbeff29defcb8d8c6d4df8143.npy +04090263-677d8473fe8fb35280c2e60c312b0f09.npy +04379243-c958f04d72957fb855182f299fe41fdc.npy +04530566-4abbc9f36affe95dbcbc3fd6f72b94c.npy +02871439-58b97051fb1efb3b4bd9e0690b0b191.npy +02958343-3b578ddeae9eeb9ffb8de648691848ea.npy +03001627-61917c7f7953ee7fe6543556f230fe9c.npy +04256520-8f3545743c58b730a92a1b6e1dab7c04.npy +04530566-fcab40b30e1ca530713e7356d62985db.npy +04468005-110a2bd7bf9f8c74de773d95513f207e.npy +03261776-db076e314df03db9235fd81b905fa6b.npy +03593526-2ddd2ef6c8ed56afbfec1075852e48f.npy +03001627-eb7c250519101dc22f21cf17406f1f25.npy +03691459-5e320dffc984b6b5769dec5ec0157054.npy +02958343-a3672e5ee27e389ab19dbf7b5aff7ec6.npy +03001627-9e0a0ad80be6df7789d2595edb5088ee.npy +03001627-b79a15077c4a662719fb4103277a6b93.npy +03001627-f112035c6413080a664b3b9b23ddfcbc.npy +04379243-c27e9191723f352d91829b477862aff6.npy +04379243-af4bb12decb39ab082f29b648e624c33.npy +02691156-688c645ad207773f5c3e79a10705422c.npy +02958343-3bfa196d1b48f1e0c5dccef20baf829a.npy +04256520-d1f68ceddaa3b0bcfebad4f49b26ec52.npy +03761084-94c1905c213382a71a839a72929cc712.npy +03001627-f2dae367e56200a7d9b53420a5458c53.npy +04256520-3a01d750779057f8febad4f49b26ec52.npy +04379243-8ff873162e6237fe571b2dc3839da461.npy +02691156-2018b7614e77d726c1ccec171a275967.npy +04090263-691880ea91ab76abde423072102e0bc5.npy +02828884-4ed2e0a972432881ac3644c4bb0fb64d.npy +02691156-909f59399d056983a0a3307f8f7721fc.npy +04379243-c3e5380fb498f749f79675bb6cb63c97.npy +03046257-4d9733eb21fe5c76eed4b2bb88c072a8.npy +02747177-8f641a48f55555f7a2105179d0c9d51e.npy +02828884-a0ffa64279a8c6f0f155d75bbf62b80.npy +03001627-8086d53c2535511597976c675750537.npy +03797390-17952a204c0a9f526c69dceb67157a66.npy +02691156-1b0b1d2cb9f9d5c0575bd26acccafabd.npy +02691156-1ba18539803c12aae75e6a02e772bcee.npy +04090263-69d0e94a5dc3eeb3fcfb3ae2df2f7efd.npy +04004475-df48a134fe1abe30ef77ec138083ff82.npy +03642806-f1c6801e84c85a07bfb149497503af.npy +02958343-d0a906517e0ec98589fc8cf5232ee9c.npy +03001627-419698e72a0d4d75d8f2ca82d6e1c314.npy +02958343-b61b7103e8d8af91fe21694bd5f519d1.npy +04379243-bdc159bdb0147e2d54f10b531fe5914c.npy +03001627-d40e314fbb7f37199753496ba23f2183.npy +02773838-cbc1512b28e9ed382bef451de0ed6949.npy +03001627-cc70b9c8d4faf79e5a468146abbb198.npy +02691156-446f9144536c0e47f0c7ca80512a3ddf.npy +02992529-50504687883a08e3c6587b192c4cd3e.npy +04379243-876794a6a673dcfe502c728096f4ea53.npy +03636649-ca968e46ba74732551970742dd566321.npy +02958343-3b56b3bd4f874de23781057335c8a2e8.npy +03001627-9a68fc6d001c4ceadc75c30c88b2f7a9.npy +03001627-9324b077e28980f3e3dec121245a30.npy +03636649-2269f268b32b40b35fc8f4c1fc00b380.npy +04379243-206cc839c7796a82a09e5a1a20aee2ca.npy +04379243-9417a62558b74cb8fda92aec8c5adcfe.npy +04090263-4d1881a99b034305e71e857afa9df271.npy +03624134-97ed13011e2d85e16029317225a75a9f.npy +03636649-ca4607a427a5aa127715096cb6ba15f2.npy +03636649-f7a4590c54e2ac7ce62fad6b4f42c880.npy +04379243-8f1efc5edaf6d44a8e6d6e67bd4767b.npy +03636649-f40624156dcbab68620a56d13e6d773b.npy +04256520-6b8908f72b78ddddf51f77a6d7299806.npy +03636649-c28d9f943fbf806ca0f23466c3c25e2e.npy +03759954-2d680a6c4d0097f1127454bdf69cf23f.npy +04256520-fff8834b262dcf4aa89012425147541b.npy +03624134-4e5602e8a655ab0ad43bb185feff0470.npy +04379243-43842d53c1ecb4ef2e3a784001157d1e.npy +02958343-c033fb1c91079242ed3696d854eee1ec.npy +03636649-be6c5d39cbc0d6f9764567afd7c5990f.npy +04379243-57362886500b303632a11457e23fe120.npy +03001627-84767939783aade4611ea9b20dcb5c83.npy +04530566-e964c2fe232f6c3e3ece64552d44d319.npy +02691156-4374a3b4b98e247b398db3ebdf468ed7.npy +03001627-7bc3dbe5a36791cb451e78cdde0ba44f.npy +03624134-74a175fcc024644cc34b900bb2492e.npy +02691156-3bad4bd2c944d78391d77854c55fb8fc.npy +04090263-6072a9dbefe5fb3ab397b12318e6683.npy +02691156-bfd606459cace196e7ee2e25a3cfaa4d.npy +04530566-8f9e62cf323515c4ca380c8375c4cdb6.npy +02828884-5a6e7c4fb53f27925d3bb412062af8d4.npy +04090263-b8430f8c82e80d4dffc0a401ac49c50.npy +03001627-61d313bb88532dcb74039aeb9f7d295.npy +03001627-3297a632aee6ac55dbbc9440457e303e.npy +03325088-4524aa501d924471f7efbe2b298523b2.npy +03001627-1d498876c8890f7786470a1318504fef.npy +04256520-cd249bd432c4bc75b82cf928f6ed5338.npy +04401088-6f63df7ca322514f41ced50d3a574698.npy +03001627-d8e5d15cca97d3fcbda72093f9b5aa73.npy +02876657-150108e481b52e41bfeb5b5bfc3dfc3b.npy +04401088-84f07a9773374b062da40fdb29d70537.npy +03467517-6a983b2ff1b8a42e1285d7bfa3e922e4.npy +02942699-b42c73b391e14cb16f05a1f780f1cef.npy +04460130-7feb6c263e565cfb16a06efd4ad41db2.npy +02933112-c0b055d5060f7f6b4470f9a1ecf7bbc.npy +04530566-a36f6174628ee5807789fc10abcbc749.npy +02958343-26f20ab8033f6937ea859f774de0c90c.npy +02691156-4f3f39ddde5874f2db73445864b72015.npy +04379243-1875947951e8d536365c18a0ba9d127c.npy +02924116-d9c61b05cf7146fd7195e86ac1f6df00.npy +02876657-d910d855fd179dc066c1a8ee69277898.npy +03691459-19f4ee5b1f70c6a47117786c46f53d55.npy +02808440-e3129b782d99d04a44221bef0fa3c36b.npy +03001627-cd10e95d1501ed6719fb4103277a6b93.npy +02933112-74c692a9018b66592246f58eda789fa1.npy +03001627-8e2c39986badb61e6fe3612af521500.npy +02691156-e5f08a5e3dad6cdff810506e9ae2dcc2.npy +04256520-3ee93f4b1efe249bb21450114b9ae3a.npy +03001627-c4a73db5b3503ffa86abe5555a3b447d.npy +02828884-ebf5b387f119c51cad5067eac75a07f7.npy +04379243-580a053d716c2d5aa09e5a1a20aee2ca.npy +03636649-f835c863f175df72fcb8d8c6d4df8143.npy +03991062-7c506f558c25a6cffc6e457221b9271.npy +02958343-4d12d72baa7641a1d1debe6139d9c454.npy +03928116-8e3923a40b3889e532f775d262a68ce9.npy +03691459-5d0499650653cdb9a37f3fc191551700.npy +02958343-fe8850296592f2b16abce8cb03e7794.npy +02958343-4d1dc1ad555807559b0a29632c8d0005.npy +04401088-abf5c8d2cbcd97d81a0d6bd0d03a1fc9.npy +04530566-67f3fa7b1ae6df7bd36a8aec7c2382cc.npy +03691459-3b911043f7cea0639f2401cb9e9e4a2.npy +03991062-fcbf5e87e140b2e78f672c860d940b4c.npy +04379243-b31bf17ab00837ce30bbb59b54a585de.npy +02691156-50da48c8e7644508fca1f1143bb6bc17.npy +04379243-34309cdc141101e42027cee422df2aa3.npy +03001627-c18cbe2537859ab6877a4d9f8fd3e241.npy +04379243-1c7ce8d5874553ccc3bd24f986301745.npy +04090263-d72ea947f961b2bc589c07868201b17e.npy +03467517-4fc341332ed9e642604b03739297cc32.npy +02801938-5c67e859bd49074c5a9dc003587438be.npy +03046257-9d7439534373886fb8183a4a81361b94.npy +02924116-915a57c5635457bd38b9be827bf6fc77.npy +04256520-b567bd1f46bb3b347cf414b698427dbd.npy +04379243-809dd3a7fc2bbd2dec89626a4213fd07.npy +02958343-43cb6a878cf18fd92a9eb0f146e94477.npy +04530566-7103677dbfe63b1ff85fa5c7c88c6c9f.npy +02924116-3a9f2ce77802ccd2b8c11d63630fbd96.npy +03001627-f413955a0f16ae18b76e29c9c43bc7aa.npy +02691156-5678fc24603d25cb74745e8fbb11e3df.npy +03001627-dbcea1998258b0fa6f500315ae356942.npy +04090263-e33dc844a5227c3d410e09f4a064836b.npy +04256520-d27b9c12f500c3142d19175e7d19b7cb.npy +03636649-f8a6f60ee9926c01e7822b3160005e08.npy +02691156-f986604528abe35554eefcdc602d4520.npy +03797390-a6d9f9ae39728831808951ff5fb582ac.npy +04379243-d9628700a086ca293c85bd0482f3094.npy +04379243-db3f9b48562440acbeedb4c8fd29e2d1.npy +02828884-f495bd67af8d9f0cadd1cf65e8dc4de.npy +02933112-c48151eb47f0e4ffc59350d819542ec7.npy +03790512-6046f323c82b280ea75120c0e0c5316.npy +03691459-d12ec06509389e01574d21c0c95092f.npy +02828884-5d68fdf84dfdc4809f136629ee03397d.npy +02801938-d8b9cb175465fac03a360f4a31f99f4a.npy +04256520-5a0fb2d34e0dc4445369e32fb818f337.npy +04090263-27803e00894dc087da95b0caa53ebe1c.npy +03691459-38e4bd990b3031bdfce87fb06e25db17.npy +04401088-8d55c1677626cc48214d974150b798e9.npy +02958343-d22a2d20acbdca70c972ff3f74d38438.npy +04379243-2cd0f589d64ea3ec36ac40071701c687.npy +03001627-e23400a634c81fec3cc5c2b17dc81196.npy +04379243-4f2b4f1c35054480438d580e74643a65.npy +04379243-9d41c5e8ac8ca4e6827b73eb36515554.npy +04256520-fdc419e377f15e728101accd22c701b9.npy +02933112-422975f531854eeaf36ea1eb6542fe7e.npy +03467517-980e470ec52ca71863ae8c3a62777578.npy +04379243-631251b7c08bad443e890a18a7c6a6e8.npy +04401088-8270c952b147d263b9746cb9e2b9d08.npy +02958343-2b043f3cae45d4937cbc6cda01aaca49.npy +04379243-535911bcbab242877543d7dbfecfffbe.npy +02958343-35f6b9780e173878a8c38723d07b122f.npy +02958343-5f2ae8bd2d571e7c6436916a86a90ed7.npy +04530566-5ef0011ffbd75eb6dc1a42a6163b8fdd.npy +02808440-3e9b4b309c9db612b0957d845ac33749.npy +04004475-f3ff60a4243d6667b609fce60c2dc7.npy +02933112-b6c1fd850c5b042c738e43095496b061.npy +03691459-ff9c1754252b9ebf73c7253ec9acd58b.npy +02691156-7220043361fe9e50eb983188eb4e930b.npy +03593526-c6506a2457f14e9e5ca1f314f1afc186.npy +04379243-4bff004a90877ea319fb4103277a6b93.npy +02691156-ff2f975a23b78bc78caa71b1fbf7fb98.npy +04379243-5ac80d0ff2237fd8e2dba1fdf90cf48b.npy +02691156-9a84ed39f9a2a3c0b3f2b01de37c0b29.npy +03948459-8cf7c6268ed360c35ca3862a7efa6401.npy +04530566-cc03dbbf18adc483bcf964ea747b39ec.npy +03593526-d61010bad35efd8199e8bf807e902261.npy +04090263-bbe366b82cec5894c082409e8305f221.npy +03636649-cab6546da3916aa53c8d0fdfb1cc2535.npy +02933112-7728f0ae18c58d067e427098d75ece6a.npy +02871439-a69640051e489a414b9112ce9ce98204.npy +04256520-9451b957aa36883d6e6c0340d644e56e.npy +02992529-93556001d266860513ddb059403c66d.npy +04379243-f03a86b27bd0a6b3d86234e915108e6a.npy +03001627-6dff84a93b82c888486150a9b7f2cf18.npy +03001627-33abfbb0993473bd71a782a4379556c7.npy +03636649-d508d163bd2e50a41b62028fb8bbd788.npy +02958343-92ff3c7b2b8b1f65e2693f33cdca907b.npy +02933112-8a2aadf8fc4f092c5ee1a94f1da3a5e.npy +02946921-f8fd565d00a7a6f9fef1ca8c5a3d2e08.npy +03710193-e434e428f65c56ed79dea5ba5d13aa5e.npy +03710193-b06092a58fd7f1dc9981642c1048582c.npy +02808440-d066024b84c1b4fb469ceade478d6997.npy +03001627-103a60f3b09107df2da1314e036b435e.npy +04530566-438a1ce3825bc06a18803813f0c0dee8.npy +04401088-9c2e939e173fb6e88af54f33b2f21f70.npy +03691459-f7624b0826b4da3ae7e41e72dd76c27a.npy +03761084-3420e627144ab8bcba7ad9409a09b1a9.npy +03337140-bfcdaac4627b7c13a7a7a90dc2dc5bd.npy +03467517-27e36c61a12d6df8d57700c05b1862d8.npy +04554684-4b5552c17c1fee56b6c98c3c1d4f4fcb.npy +04379243-9b8e6eb835f0c8bcf37af16b2893f1d4.npy +02933112-2fff20fe8b4b4a6cc59350d819542ec7.npy +02828884-722458bd2a0eb811214a15a5a42c49c0.npy +04379243-d799cc222f34fc0879bb09dc5605a57.npy +02992529-434e23fb04effbb86bc30c6a9ae3d46e.npy +04256520-7446fc82485002938db1c6c15d875c99.npy +02958343-485df8eb9c410c132a9eb0f146e94477.npy +03001627-3f11833d3d9309bc9952c05a06935ddc.npy +04330267-558f7129b2b31c34134a4ff70ce43955.npy +03624134-8280b4bba3a38926ddafe9b591eb9ebc.npy +02933112-d3257b1df741d9a099c549327bba1953.npy +03325088-cba9093647736733275d003e423c59ba.npy +03624134-7aed22a7074f16431cf05d6e4dbb95af.npy +03790512-3a247c8b82bd675c1fbdb352261d023.npy +04379243-c27bb0cf69183cdf78ebd8af2a314e49.npy +03046257-f1bb9e3a9f4b37984ccc5a59d21f8efb.npy +04379243-20714210c5319a68b16d12ee250aa07.npy +04090263-4b4273fd49971552cb833b31b53d151.npy +03467517-e0ca9ed192df5529e5e24299d76e4a78.npy +04090263-2caebc928dca9f84b205c7feccc0f737.npy +02691156-132111c575000a3c146e44cc99f07c52.npy +04256520-152161d238fbc55d41cf86c757faf4f9.npy +03001627-2d08a64e4a257e007135fc51795b4038.npy +03642806-3237f5cd4bca555955357c338ec9641.npy +04090263-9cc96465d70061cb94deaa9fff391d41.npy +03001627-90b6d8a730e9e17cc55161a63fbd109a.npy +02958343-4773cf28df771861b112e5ac235c21b7.npy +04401088-90010049891220187eda1e12bd28fb7.npy +02876657-912a49eeda6cd8c5e3c462ac6e0f506f.npy +03691459-74a4f472155ed5a3b2bf4f773fe0e622.npy +04256520-16ca439cd60eae5f23500a5b036df62e.npy +04256520-51e5da3e9f55c77ec15dc8fdbaa55abe.npy +02828884-617fa8d6d65af35d71295682a9280b8b.npy +02958343-604d915e7bf91cbca22cf2b42142a7ea.npy +04379243-1d43a3a22ee451e62511fca00e0288b.npy +02992529-fa9b007a326be6975c8fa950032e0987.npy +03001627-8862fe77a7856db29a8ef44e1d2c5b75.npy +04379243-8d0e190bf8d8021cea7b477e7b62986d.npy +04090263-90859d41f2b4b996cc34b900bb2492e.npy +03325088-abce921108990509251c40136771148c.npy +02992529-8e00be7402a612e17d6b888b4eb1ac9f.npy +04379243-a2f9a8c649bb70d35c08aa223a05362d.npy +04379243-7f71383698c24d4f43dbb6421d614c0d.npy +04090263-c3d75ea41abecf51519f927f2bf92da9.npy +03948459-b8fc16725ae2daf076a05817943c3b79.npy +02992529-2acb9ffbc050ac2e48bb2194a2a904f7.npy +04379243-8b5061128585edb49e9583a661702ed4.npy +03691459-244f40cd50620b32dfdc04b8b8434e84.npy +02924116-21be26f34e5a017f70a039e6dffc91d4.npy +04379243-33e344d8250471396f6d5059be65ac2f.npy +04379243-59ce1f3fbd81ab18f4b6538438a0b930.npy +03001627-46323c7986200588492d9da2668ec34c.npy +03991062-2f6399df18f55c0f5076fe09061f1a7a.npy +04401088-eb6fd5cae6ee26c8a2651abaf391628e.npy +02958343-d474f5971b5e8ecae9795e5d56b7e9f.npy +04530566-c929e6d77b548b27e6f3ce318264cd13.npy +04530566-3d908c2b4f5812702fc668af6d3ad0ad.npy +02924116-a58cf9f41c11e32541cefd10ce5d6cc0.npy +03636649-31c9507ec40650d0d5506bacc83bff24.npy +04256520-2e0f5e0ed5acb122597976c675750537.npy +03001627-a345ea2820d2f4af7ff6ace05b36a5.npy +03467517-d8fe40b706db9bedcfcd7283054963fe.npy +02691156-d54a694d514b1911844ac48bcfce34.npy +02958343-28c83c5adf799340f2cc18e077b7ba53.npy +03001627-842130b6eaaef7a4932471681ea5bcf2.npy +02691156-92a83ecaa10e8d3f78e919a72d9a39e7.npy +03001627-6ea006e5c76576b89753496ba23f2183.npy +02828884-86341aada547727593ebeeedbff73b.npy +02818832-ede5fb0f443d4f6afff56d5190327d3a.npy +04379243-958c5eac527deb6e89a6f9d60821eb9.npy +03046257-68b82646290e0be6b0a29c51aa6f10ce.npy +02924116-c2799e2c3f5845f22d42c1e28ea24b6e.npy +04401088-bf1f95958ec4d3e8d485372bb746f3c7.npy +04379243-a5b1e3e2c602d464ded526a7be77b30e.npy +03691459-1c25b626dddfc36a28d267d044b54402.npy +03642806-97df7577c2690ab82290f0f0820b73a5.npy +02958343-147889b73fa491d82e877e82c90c24d.npy +02871439-bef0368b3a9c6424d810b14a81e12eca.npy +04379243-5129899201421fe84a873bbe35452b88.npy +02808440-830fbc92254de7051c17aef130ed6213.npy +02933112-329f80229edd920a82ef94da039e491f.npy +04379243-e4571a5b7457d2dacea003eff0268278.npy +02691156-10155655850468db78d106ce0a280f87.npy +02958343-28009514ec0e2b4ebda733a39f84326d.npy +03001627-602ada3b41238c77b87028a4b477349f.npy +02691156-37608404f9e224d4fd180252c91ed0f3.npy +04401088-725cf43af935ee023832db239383a26e.npy +02828884-5b45d3a1edd81a8f2056b4bd5d870b47.npy +02828884-e285e553a6879a5e2056b4bd5d870b47.npy +04401088-6907dd835a22c32f46895db2a69f45e2.npy +03691459-80aab147daf83cde332fd8bcb8108236.npy +02691156-852e1b84dfa1f7e8e075f0bda7acfbe2.npy +04090263-602c00b06f2b47af8bfdbc9c53b14228.npy +04090263-263cb889dcad2b6ffcfb3ae2df2f7efd.npy +03761084-7431c55078a49981f557d80e0a8a9303.npy +03001627-2f1bc92c53f359d759a6208793b9dfca.npy +02933112-82f7946adba23f5f1c6beaa592f1b2c5.npy +03991062-a96ae58bf14794197e03b8d39fd0ad70.npy +03691459-e2603611f6d3c661b9b2b9d5b2804865.npy +02876657-24feb92770933b1663995fb119e59971.npy +02828884-a0cadebde61910df98e8242d4a63e1e5.npy +02933112-a8bb33c995207084bed1bd9593e318c.npy +03001627-cfe139c0e8b8cfdae342bce0d924820.npy +03337140-7ac63d16fe21f2a491c352d02061b3f7.npy +03467517-675a76195e608c749f817bf67854cc42.npy +03691459-1ba6735cd32d907ad493bfe20f94b6ab.npy +04256520-c70310da520e0499c2c449c0c0579ec3.npy +02828884-d06cf2129d36dec7a4f92840428bbcfc.npy +02958343-11dba0c2ec8127356c2fe9dcfa1ee2f8.npy +04090263-b3bdd86b01306e7b410d23b0a192e911.npy +04330267-12931afc82f7925359e2566a2e6781e5.npy +04379243-486b0764bb1fb92cc3bd24f986301745.npy +03001627-52f9bde46afeecc5dc3653f8341633a.npy +03710193-df7337cf26adeb865bee258e658f9767.npy +03325088-d35b4af3d4e779d4c36fb70296e45483.npy +03691459-48c21ec6f9623c997ededbc2b9b4362a.npy +02958343-c778e4d590417da82205cec171865d70.npy +02933112-9d0a9c46bb6768fbd37a1bae74ee50a2.npy +04379243-bd75fa23435df54b8430b7446f9e1252.npy +02933112-115e4c9a9150fe8e99dd23ec22c4943b.npy +04379243-f5d87f88bd9b31ad2f0ebd444c10bd0c.npy +03001627-3193949a635d8682648909df12856289.npy +04379243-4b399cdce8337c29285e0e27752e54a8.npy +04530566-c2eb5277d66ff1af79953c8c5ce3505b.npy +04379243-e99f7a450afce3b62553cc33364504d5.npy +04379243-4cd35d6ec155d39633207e4c3ac155a4.npy +03001627-e6719610fd2c44c99295da7959c963a1.npy +02958343-135c965744d1a523a60665b13300f1fd.npy +04379243-4231174a23bac5d354d30af857cfae06.npy +02924116-a3841f9c67d82a24193d7855ecfc1bd3.npy +04256520-d2a4faf6613ea1e66db434563c7f5ea3.npy +04090263-d439acf80dc6e1a9d40e00f72aac160e.npy +03001627-22b8498e1ee46520737a00f007529fbf.npy +04530566-7e6aa3337c2e52ff196f35b142096073.npy +03636649-b2c3fb8c5b65a63ce2c3d541bbe76212.npy +04379243-45b9800c1bcdc13735836c728d324152.npy +02691156-46c311894026d9a762b600da24e0965.npy +03001627-7740fa5979753c734209d14d674fb332.npy +02691156-d5ad529ad399086e4e9a6f7cd468e49d.npy +02992529-2009fed0ea8d1fc3e2dbe704eec7e8d9.npy +03710193-42cf808462bfcc2a8d1fe8cdc415f4c5.npy +04379243-a131dabb9fddd3c97a845b3267216856.npy +02691156-b4b21950f0627213fba066e52ee0e502.npy +04090263-5833fa72da0bab839c82b3f5ddca589c.npy +02747177-41b946cebf6b76cb25d3c528e036a532.npy +03636649-6faffa042190494a3def89b32cef8e45.npy +04379243-843713faa2ee00cba5d9ad16964840ab.npy +03046257-7b10961a2fb3de4b4b3c42e318f3affc.npy +02992529-fe02978cb3b6fcc4cec837e48e8de67.npy +03636649-8422870b0a65255d5cae1a083183a237.npy +02933112-30b75567780d84638ac5263758737a81.npy +04379243-2baa1d2adfec9a58445e85eb534460b0.npy +04401088-30e53b35873e59da73ea3d752b4ac8ec.npy +03691459-ada71fe1283154ccdd70fcdaf3665b80.npy +03046257-de0a333f86fd60713b48a711df82173e.npy +03001627-97326604c5fdff1febad4f49b26ec52.npy +04379243-e6ee101d3cb13bdd16a2b5862518c93.npy +02818832-89675cd9d71a905db0541044a1a3304d.npy +04530566-4b491c434e9c230c9e450dd115401ef.npy +04256520-76bef187c092b6335ff61a3a2a0e2484.npy +02691156-26e26e21438ed02990b1d6deb98feec6.npy +03001627-d460611ebc267961d838ae16242881dc.npy +03001627-46dfeffa91719044de2bbe257d2639e3.npy +03636649-e22cc77e9bf9eb0875d36c94c257eb30.npy +04379243-212756a9f7bff5892f6b08a7db6d1426.npy +03001627-c4170208c9586eb63c2247b30d3fc073.npy +04401088-e3c02395e83fefaa42dbe6bfe3cdb29d.npy +02828884-d290989e0cd0ef7acc546d806a30d5b.npy +03001627-59bbf4d0360e4cf733e5ff708bab9b06.npy +04379243-cae89eddba3c4fa1b20aa91e9e90c311.npy +03467517-13692f8afa936159b1a94e2dc3e48368.npy +04379243-592819b967c53ef0f1755b5047ed68f.npy +02828884-1ccab18605adebb15735dec4de5bdaeb.npy +04090263-49083d2b9f3e6222bde9b246866ffe11.npy +03001627-2a1f13b41192e80bf51fa0238791f5dc.npy +04379243-cc4c36724d3c26c65ff61a3a2a0e2484.npy +04468005-5b4131c68ac6062152470de2774d6099.npy +04256520-8ea0e8e7a863b6dab2302e21338c08b.npy +04468005-12733f035bee06de52aed63c67d1c6.npy +04379243-798fa47b8508c8b162a510b8f97c658e.npy +04379243-e65cd563d3a74dd4c0a61ad1cf92b694.npy +03046257-6ed55af31d57c4f929a60d6ab40898d.npy +02828884-501e374fc9a9e5c263b2acb037dfbcde.npy +02691156-2d255ec7a05b301a203936772104a82d.npy +04379243-d4c330d27bbef3808f6610bf672cd686.npy +03691459-69212e8c41ec753fbe62db7ad46c40f3.npy +03325088-fc13ea21c2542368c36fb70296e45483.npy +04530566-a7fdfc15268ff4d68413778731d6cd28.npy +02691156-299ec43108d7109113ae47e860a2333a.npy +04099429-b6a04a1ad7e71394973c59607554704c.npy +04256520-bcc3c5da89afe93517a7e95ef7821038.npy +02828884-715445f1eb83b477b1eca275bb27199f.npy +02691156-576edc1da4e3fb47b627754c4259e985.npy +02747177-f2ee002e961747032056b4bd5d870b47.npy +04530566-af09fac5d37072a3b830672ec83e0072.npy +03691459-c98654c348ccf6baed1d3c8863995334.npy +04401088-7eb1bb8e7f83313b5bfaa3ead015ed29.npy +03001627-f51ab8433184dfd2c8687ff9b0b4e4ac.npy +04090263-46b29fe9796be46497ca877cfb285ed8.npy +02958343-303bbfd0c5862496ec8ca19d7516cb42.npy +04379243-eb62d577d4de8bcbdda7f1d27cdf247c.npy +03001627-d5939ecbcb583dea9753496ba23f2183.npy +02958343-e859ef0e793c43dc159a969baa659ca7.npy +03938244-3e4659a2dcb7bd3f959a2da56ff43b4.npy +03790512-1650afa5bf6c8335b37378f3c85478b4.npy +04256520-be5def882071141c1a8781c24b79ae57.npy +03325088-6b513f89b3b0a06b2b3e9b6eb52d35df.npy +04090263-48b607ea57a1e16d309c2ee598f7f2c8.npy +03325088-cdd72ac0d6def4e8b362845c6edb57fc.npy +03636649-904f90ab5c4d408b313c6de30934784.npy +04379243-685b5890e66bd010dcba2d9cc78a3a32.npy +03001627-8ec247d0e133ad3ce922ceea1248b9b0.npy +04401088-db4c6fcc45cdee08d8dc338f42ea38e9.npy +02992529-d299bcdfee69c57d419fdfebc874eb8f.npy +04379243-6f88879125d12e03492d9da2668ec34c.npy +03046257-86c295f96d02fda679e11b00c4c5627c.npy +03624134-60e7b05ddeeb48eb37fa2c3ecb75f337.npy +04256520-21f76612b56d67edf54efb4962ed3879.npy +04401088-ef57d8665eb5ef7cdb965514105122a4.npy +03948459-c3906de76406ea607086518c859a3e32.npy +04256520-d334047dcbb37017f5f004a628d601ce.npy +03001627-b6c9495629c00419940806ade53ef2f.npy +04401088-447cb44311eb5dda57e80f5278d5b50.npy +02924116-3a9ea0b73c70deb015c32d7ea7a11ea4.npy +03046257-ebb7e54b68ffcf2c3ee5ff7ba8322f9f.npy +03001627-673c396b8989cd1971a782a4379556c7.npy +02992529-e458abdbff34fefe255591a17641445.npy +03001627-70e3e98efc6ec0dc611a1a85a9d58686.npy +04379243-c9c29b00aa05386562daa5fd16a7828d.npy +03691459-fe13f67712bc5e4a1b02cde7e81f0fc3.npy +04379243-72c884f3b9b9119966f379f51753f72b.npy +03593526-d7c1b9b30600ae252a6759f6ef8e2848.npy +04530566-83c90f7b104816ecc748af2814b558c4.npy +04090263-85b6261930b2174d85639a40426ad4d7.npy +02808440-62b3b1e91deef860ede9471c962dd6ba.npy +02958343-777365016f4b7febb623d8d239f6c6ae.npy +04379243-9a52ba3ccb97a11426392a5b643ed5e3.npy +04379243-5af813d1c68d4e557307e0a6ee770fe0.npy +03001627-33f5c19e34d74fa97f07eeccaaddf1d0.npy +03938244-71dd20123ef5505d5931970d29212910.npy +04530566-a88fa5daf540c14a4f6190a680acb783.npy +02691156-c0bb4f92d12f4504d65766fd3c4f994c.npy +04379243-f183fd6b062f642b5fceaa39a8353bde.npy +04379243-689ce3419913a1c5ad5067eac75a07f7.npy +03691459-82ccc798c04e4592eb34db531a289b8e.npy +02871439-bf8c485ab29e0c3549a1e995ce589127.npy +04256520-1543a5ea73b6ab10df2fa7eaa812363c.npy +04379243-2bc58f346be3570ed739a99f2688300e.npy +03001627-c535629f9661293dc16ef5c633c71b56.npy +03001627-8f6395e2451cafa6473f10e6caaeca56.npy +03001627-3dd8c11bc608441f1b17743c18fb63dc.npy +03467517-2b394d7e325c0ff5f48dc85fa744ff46.npy +03001627-e026adae39724b4ff5f913108da5d147.npy +02958343-498e4295b3aeca9fefddc097534e4553.npy +04379243-b09894688b176d426f3d2b1b15fba494.npy +02924116-ae370b6f9e51b0b26ad203a886d7045e.npy +03001627-935f5e58e9e15231febad4f49b26ec52.npy +04530566-8666e4e88dc55c5795ea46728bcdc15d.npy +03001627-f29cbdb2c7bb10f9953d950bcd7de7a.npy +03636649-92f9d60912030cfb3a8888e78d004b3.npy +03001627-1e4fb9149de6be81f51f77a6d7299806.npy +04090263-65e3a44a0a13a1bb547046f04c724fd3.npy +03928116-13394ca47c89f91525a3aaf903a41c90.npy +02958343-626a407fd0fa17d3aa1fca93ac59c77e.npy +04530566-a8db7dcc16750af73c83f6e156ad107a.npy +04256520-3e3ad2629c9ab938c2eaaa1f79e71ec.npy +03991062-a487dbb48fbbe5393f437989dda71b40.npy +04379243-c64b12e620977f0a87039a8d98cfc027.npy +02958343-879121a1bb623324eb79f1a2fb4e869b.npy +03624134-7fa2fc6addfa9191b70d6d22050634f8.npy +04379243-73dfee7c17dd0b2e469ceade478d6997.npy +03001627-4e1948cb03956c9079b3e1be3524f72f.npy +04256520-d21b63623023b40a593ebeeedbff73b.npy +03211117-c7185c6e5dd741e139b7c00cb61e68ec.npy +03691459-6833234a218df871aa35b1de51ec4cad.npy +02808440-1ccb1ab19056b80891a2440e0fc33776.npy +04530566-4af6289f159094d21197663c308adec2.npy +03001627-51aa5f1157cd456f9f9dd9e7d6540d50.npy +03467517-605ddf879e8601d4a072700b3aa0dc00.npy +04379243-625d465a8d9342867ff6ace05b36a5.npy +03467517-bf038654db326b819f585e02b4e871f9.npy +03991062-911256bae9b19fdaa2c59a4d90e63212.npy +03691459-f0e562c21dfcaaa1d1936ff8c5fb2337.npy +03001627-100b18376b885f206ae9ad7e32c4139d.npy +03636649-f85f26c5a807b22312bea13341a54c3f.npy +03691459-8e55b303ce059ac5aca1a38908852eab.npy +04530566-18761559208a970188d5590328ce0ddf.npy +03001627-bb88bf9eb071f85bb232f4221eaa5610.npy +04530566-7e96722d076d9e9020dfe072b77502f8.npy +03642806-4504a4d244d05ddbf5f79806bd65844f.npy +04379243-af8636a4e4d6bfecfebad4f49b26ec52.npy +03211117-6f9ee2b839d3a03683fb187ab7c1f026.npy +03691459-6922e97ab45e4e47b59e9758ae7f41a7.npy +04530566-303736b1be32f43c1c426bf7baf37c25.npy +03636649-441d06d5a657a5dfe7ae87d20a4fdaa5.npy +03642806-c3382162e3502ee41bd042808f3b79ee.npy +03624134-a105080ce4564145aeb54153795ede63.npy +02958343-73e977c312f8628b1d65faadf0df8f28.npy +04090263-552243084ecb0eddf500cc506a763c18.npy +03513137-500502549d46f6d34e61e54863a9d5af.npy +04090263-6f652f3940aa986e3e243aaa4500940e.npy +04090263-b7b3f609d8af14965d0dded52efeb4fd.npy +02946921-efa4c58192cc5cf89e7b86262150f.npy +03001627-4c5ae0ca12a5e8b3490ad276cd2af3a4.npy +04379243-71d35a394d35f70619fb4103277a6b93.npy +02958343-139df45393b6847838805e546aa28d99.npy +04401088-b442b550e827cbcc8ea897fbf75dc392.npy +04256520-79b544db8d95c3dbc1a25f36f85c3fd6.npy +04401088-2216e78a43c5d587b8e1b99345a5afd4.npy +02958343-eee2c0e2912f27b15a49026b22f63b06.npy +02992529-fbe18b762a1328916b7f36a4c89ad37.npy +04379243-469fba8f6fa06e6d2668a5ff3e8889a1.npy +02958343-b41bb2a3159a9506977b27045b1d8055.npy +03046257-e2f7bb607fce0e39cb0b7c9444ff3e4f.npy +03325088-a85bdfab2e46ae2ab7728045d0c829bc.npy +04530566-a53eb39c51a7e0a2dcb7d7c06abe0da3.npy +03636649-ad5c4651205a59f7fa0f332f678cca2.npy +04379243-45f04dd3dfbc4926d42ec7e303174a87.npy +03207941-fdcd7f8a036dae3a96a401b0ce8b43ce.npy +04530566-8c4fb998d99465b48cfe472915a175bb.npy +02958343-d85d6bcdc81df377f52657bb1f80be90.npy +02958343-67ec617aa2352596ce6bb1d0811960f.npy +02691156-e08402fb1e5953a2a93f0f952e72609.npy +03001627-366118e316f03a35327289c00b6dc9ca.npy +03325088-222c02d696583d5b362845c6edb57fc.npy +04256520-7cf9738a01e47dd6a123ce0dff5bf4e6.npy +04090263-ff3425cf1860b6116314c3b6a3a65519.npy +02691156-3bc8cebf08ac975dbd46d022fd7d80aa.npy +02691156-9e4c0840aeacbf10f119374ee5d5f944.npy +02933112-d894ca00249da3fbecbb1f16dced7a99.npy +03001627-f3fa7bd00b76f6a87a8a6b9421844d96.npy +03636649-bcd32489ef6fc12d8f32b552c0a1567c.npy +04379243-3834bf577a25eb2d1ce5b91ffe4491de.npy +03211117-ab69e803c34c6b8536871b478a4420ba.npy +04090263-40f9c088e4a4eb77df3029a778e2c881.npy +04530566-b78f1dd3083c35a1a716de2121565fe.npy +04090263-ddc90b69e90b208580c2e60c312b0f09.npy +03624134-de62211649b4cced49384f9741ad64d8.npy +02958343-c1aef2e67a9608511c4ba4758a592406.npy +02691156-4244f171a6065c2f71e3a79f2415f19.npy +04379243-25dedf655982acf6490ad276cd2af3a4.npy +03001627-4848b62ac4a996b3f51f77a6d7299806.npy +03001627-ba5911cd07d1eebb31475fd256bf1b7a.npy +03001627-ca4900c42b8016ef8397cd720acaa508.npy +03001627-7b17a70aef82c51cb8fa4cb65e077db1.npy +03790512-6b93d5f2e88326f91f80189578e6ea85.npy +02691156-6dfde67c8b905939bc0909d98a1ff2b4.npy +03337140-58e1ece086677b135d354898d3243eb3.npy +03513137-854adc84a21c0a1de8fe5a1391785bf6.npy +04256520-8e74405f71017cd5d509fba1e6dd3b0c.npy +03211117-35003dc3d74527729a1d432cc80562d9.npy +03211117-c8223ca4a4fc81b3ad1f278e1513f3b7.npy +04530566-7d3eb0d2de5c5b8672a78a0929ee12bc.npy +04530566-e708ec80c30086c36dd8881532b5a3d9.npy +04090263-e37b87e001f24db1e55d13d7a8d27c90.npy +02828884-9790980a8ff823287ed9296ee19fa384.npy +04379243-d69a4fe99afe6e0097a5b791ac4ae3c8.npy +02933112-38c9f4bc9c5583d7824662341ce2b233.npy +04379243-f252711946bff75aa5234533e6540c01.npy +04530566-4a7375e11a8ac1ae565f244baeeca983.npy +03001627-d29971cef754cc91cd8c5d1ba690a2c3.npy +03337140-946ae7b4553f69d7784168ad9d1dbd5b.npy +02958343-8e85cc8c9b9ead7562b21e1bf23b9ba8.npy +03691459-1152c16d1081c32a561e8b31a1141890.npy +02933112-c95634c0a44d6596e71fb4d3a412f2d0.npy +03636649-846ae34d173c06d828e0b580c4eee0e6.npy +03046257-9f997f890bf6143d5bcd4b910d7ff028.npy +04530566-5ab18f317c0a5d21576932faf8645222.npy +02958343-4c53afe560e36d8380ba2a9340bf2d77.npy +02808440-6fe04845ce20dd244221bef0fa3c36b.npy +04460130-614ea50301bf9179514f720d40bfbeb2.npy +04530566-9d8d5086930871efe2e5f41247736024.npy +04256520-9ecb691016c6295a50f06b72cb7e77fd.npy +03046257-2be4aa0e5ee54d80ae77574c7d9d2318.npy +04379243-e09377eefe363b4f8101accd22c701b9.npy +03001627-b85de1f567a654737f8769b595aa12b0.npy +04379243-d4491f4fc4d37391f8333d818f5f80e1.npy +03001627-91d84fd5e5ad5c09e63beedfeef0900b.npy +04379243-9c5571c45d44edebb6aa381e6d41cd4.npy +02808440-10d8ddc79b74d150d9b53420a5458c53.npy +02933112-3bf437403138e6c9aa669fbe8e7a7c4d.npy +02958343-fc5d8e25052fb713f559279c88cd9a37.npy +03467517-f411d80eb0dbc9158757b091804bc082.npy +02828884-f7fe4b70b7268f6cc118bd35b5372812.npy +04530566-9004946f75082a8632c0857fb4bcf47a.npy +04256520-bdfcf2086fafb0fec8a04932b17782af.npy +04379243-9affa2569ec8968c60edf8bc2f5c8881.npy +02808440-e90b251f9f026ab36b354c7301136f53.npy +03001627-729650e08d4ddb97ed98cca8f0ccd5f7.npy +03001627-1c6eb96eab5e75b67b79156a61ad4c01.npy +04379243-a8e015f1de2c48c5f51f77a6d7299806.npy +02876657-4c95086448461907d2e07f4a91040392.npy +02691156-9a5f4508a4337d195e48cdafd0101d9.npy +04090263-3387f6bf3cc73546434837e2aadd6d77.npy +03642806-8fefaa8179404c4ae165aa9cd54a0a29.npy +03001627-ce474d7c415941acfebad4f49b26ec52.npy +03001627-48fd6cc3f407f1d650c04806fcb7ceb6.npy +04090263-24386a93c942c7ebad7daa06d33b72e7.npy +02924116-bca84022a19d22f041cefd10ce5d6cc0.npy +02876657-275b8572dbfabb9d88873c05c27001.npy +03001627-f9bb302961c91d7220160736f02bc9e4.npy +02691156-de72864008c4db8bdeadc9ca0263db5a.npy +04379243-d1087cbbd15f509c20768660cf080d12.npy +04530566-3ffae5def89153e911141f4b3ef0acd0.npy +02958343-22d57b895b9cd22137ca7da637f7c918.npy +04530566-d8acb2681ea3e2466c64e0542c2b0af.npy +03325088-54eda983813a7168bad9bd0c4ab8e3c.npy +04530566-7eedbeaa5216ff06ccd600f441988364.npy +04379243-6f1d3ad68c0440a38b424343280aeccb.npy +03001627-5f45bb76bdcf883d5adb3ef1dbe9e3b3.npy +03001627-b23cd3a93c8adbf56d33c8b6c0fec1f2.npy +03001627-96e8a51b1680b756e99481ddc3bbddfb.npy +02691156-d6749fad86648a9719ba010ddb4974fe.npy +03691459-3609604595f025801f9f3ce366e030fb.npy +02958343-dd35ef6632cf507804272696dc83193.npy +04530566-769a3afbadaa92648bfbe54b5d01550.npy +02691156-47c7b3cb099b3212d1c83bc8b134e4d8.npy +03001627-7aea8e52f24cd40c496c9cdc8d0a8c08.npy +02828884-717019a5d139874f44dfa7c5506ef235.npy +04090263-dc222cfc347506ee73482852b5932f76.npy +02691156-2ebfd5fec5c0bc85a52a419d042ca7b5.npy +02828884-76e5103be2d6199071998932c708d327.npy +04256520-23833969c0011b8e98494085d68ad6a0.npy +03325088-7b1678602d33579254d7082b34825ef0.npy +03636649-42bc0dce81734d892610e2a20d7c4b61.npy +02933112-abcac243e3ed325b34943af333340cd2.npy +04379243-9e55b1135ddf93211c8d18742f91c015.npy +03797390-39361b14ba19303ee42cfae782879837.npy +03001627-da02c479d1284ad38727553325e63baf.npy +03467517-133ebdf2ca7bf4b81d4e8021f58beea0.npy +02828884-64010fd77c10672dac3644c4bb0fb64d.npy +03467517-54aab60ad947a9da37d3e9143e987d83.npy +04256520-3fcb0aaa346bd46f11e76965808086c8.npy +04090263-a7da2c6df867c3e91c1943a82a09125f.npy +04256520-aa2d1614a9bbaff7e6fe3612af521500.npy +03691459-b03b88ff24870f2720363e2561dd589a.npy +04379243-681581df89b7d39975eb2bddebec5e6b.npy +03593526-d3b53f56b4a7b3b3c9f016d57db96408.npy +02958343-c61ec8875746ab78227375499b768057.npy +04379243-5bbfa33dfdab27e5821ac289e2458975.npy +04530566-693566461a33af90d7f8e93419dcfd5f.npy +04090263-adef049969b447f87ddef91dabb146f3.npy +04090263-de637cf64b212f4061b28e02a259d647.npy +02958343-88fda6df0a162605e52943dcb52313c.npy +04379243-4b2a7beb13fbe74296610c8d5ae64f96.npy +03467517-4709e55a82a63f64d57700c05b1862d8.npy +02958343-89c7e63c3d3d14aa17b597d473206848.npy +03325088-10fe88cb5484797d664b3b9b23ddfcbc.npy +02691156-41afa42c77cd167c2b5147716975ed8a.npy +02691156-c01746b173e0870b3a4cd082c6787017.npy +03001627-bbef67b2c3d3864e8adc2f75cf0a8389.npy +04379243-63e109fc1e40fda246b9f3b6ee20ff4b.npy +03636649-75cdbf96a597b57a29a42a0444436860.npy +03636649-bd0bbdadcd0b9fca7d57a0513a353be5.npy +02828884-7631a05d80484ad6d2b12aa6a0f050b3.npy +03513137-21d201f43ddd36c52fafb0cab311e6a.npy +03001627-5eb38d4e556a893a3b832d9b48bc2dd3.npy +04379243-b6a24109a5076d4ba5a296b0eec81c96.npy +03636649-84ab363e60b9bd9185d624cfcd9a37a7.npy +03928116-bfa3b2dbacd27547c124f92750a205ca.npy +03948459-898424eaa40e821c2bf47341dbd96eb.npy +03001627-8a5d60067de905336c183a120a388982.npy +03636649-d3380ee3db68aefb3f214ef9c53ac06.npy +02808440-ea8891fa9a19f8cb9e2e2edd05265482.npy +03636649-3bc8edd5ab3a2ddafcb8d8c6d4df8143.npy +04379243-6f87c833355679ef36b0f2a1430e993a.npy +04090263-f70396fbee1bf3f2f2866d10640f3af5.npy +03001627-4a48b39219bb7d64457ba044c28858b1.npy +03001627-acbcfebf917e708b2b5bf1f191733d75.npy +04530566-209f569f50d42f7e45e2a4e5729b970d.npy +04401088-e85bac837e951f3780ed245d94a6a268.npy +02933112-403661cbfc8deb029a50a2b3c5e5b6.npy +03001627-1fc918b0e5c7cf2da5c25aecef10278f.npy +03001627-d9bbd1a1eaf6d2259d3ea1c6b57a0095.npy +02801938-95385afe0390705a36b0f2a1430e993a.npy +03211117-d34a267fb332b052901fed29c825c894.npy +02958343-a77879318434261612725caceb9cca76.npy +04256520-a4de0830d9a1020e3b85980206d96693.npy +03797390-642eb7c42ebedabd223d193f5a188983.npy +02924116-fa47d3c4547b4d4fcf8b2866c5b881bb.npy +03636649-54a7ea6d6e297a849eb34048e600e1ea.npy +04256520-9c1b448ec62cb9fb36dd029536673b0b.npy +03624134-b0c7d11b2c7a3515eec6d8d24f1fde1.npy +04530566-e9cb5c7799f291ce51b48b48046ec39f.npy +03593526-c7fa54dc356f039d2f2318fdd66be40a.npy +03991062-eaaa14d9fab71afa5b903ba10d2ec446.npy +03642806-d30e41084edd4d73487f00a15f77c99.npy +03001627-abddac917b144928f91663a74ccd2338.npy +02924116-d236a2d3d923650aa3cfa46226644b04.npy +04401088-e2d49d74845ff0207e1c85c5c15da7fb.npy +03211117-3e1d0fb46bc7f84f9c4081063e213a15.npy +03636649-1ef03aab18277ff1ef3a2c64cef919d0.npy +03001627-fc369b19cfb50322492d9da2668ec34c.npy +04090263-5428fea9cd816d764fe44fa90b97c5ab.npy +02933112-6c7a1a40e645c48e9c22f14c4b6aad23.npy +03636649-d00157a022079bdef3655a2ce983ab1f.npy +04379243-44c35996414c4d89f1f3662486c882e5.npy +02933112-443a726ba9fa8d04d99265061a435799.npy +03710193-10e1051cbe10626e30a706157956b491.npy +02933112-6bf0f5e06cb748bb9671c58246946ed6.npy +02958343-7b57af1bd2d83363ea1216357e7f0768.npy +03642806-dafca3237829fef9f6fef4a0ba2e7186.npy +02808440-20c8ca22f5010bc81291d1279f7bf122.npy +03636649-3e1a71694488a4cd77b98fdac17a3204.npy +02958343-99fce87e4e80e053374462542bf2aa29.npy +04379243-9e560ee4c7438578f51f77a6d7299806.npy +03467517-576ee680a8aa61fbd4c2efa838ad32da.npy +03001627-f1f670ac53799c18492d9da2668ec34c.npy +03467517-fb1a79f06ffbcaf540c20797381ee39f.npy +03001627-23218bd682d522d19fb4103277a6b93.npy +03467517-f2b4f9d8f31d0dfcfffda81e9d316a1d.npy +03636649-33db0d4bf66731a7e7c7920f6a65a54d.npy +04256520-bb4c963786dc746855f9a00acc25f137.npy +04379243-3e760133301353a147cddb7c026e92eb.npy +02843684-91c3a3be8f8c5ed1a309fc846e6b0c18.npy +03691459-efb2eac3d84429d6363cbfdd3d5388a.npy +03211117-4b2a5a666ebcc1ae57c0e3dc4a759a6e.npy +02747177-c50c72eefe225b51cb2a965e75be701c.npy +02958343-e9738c96c8ffbdfdeae19b6e682da29.npy +04379243-b6afecd780203c81b9a51c308250e422.npy +04379243-cacf61ed869db8e7f84b0be7f50940eb.npy +03046257-3d18df96d6de08b1cbf3dda885c64a76.npy +03636649-ca6c2a23c86be64e2b93fb2743876c57.npy +02828884-1695ec4ee4d2e60b50039fe1590fc615.npy +03001627-e07c7d5be62d7cd73ff4affcd321d45.npy +04256520-901eff0fb9cf6e0646a3128b588876cf.npy +04379243-bed0b40333f195c52ea6ece84d077ef0.npy +04225987-30c835f06a930d356e6c9ebd9b889ec2.npy +04004475-2135295ad1c580e7ffbff4948728b4f5.npy +04090263-cf21d9de1440d3d203f35d9b3b48203.npy +02958343-4fcf76fa7f07a0008bb11dbc05ffaa74.npy +04379243-9665f677dff2405ef51f77a6d7299806.npy +03593526-ddad820c8cd5c1ee564eaedaeaa04f28.npy +02933112-1d7b04fd768eccb5f838a2212356e267.npy +03001627-434512cad2c10e09e8b2b8dc0c816caf.npy +02942699-db663e3f7ee9869f5c351e299b24e355.npy +03001627-987770212e08392d2c528d33bca1ac2.npy +03636649-3a29634236aa0596f9e8cd846ef13776.npy +03642806-6a360b7d69a4d522ce45dbec0d835ca5.npy +04330267-ae6e6b33ef0f78d8c9a835319c0150eb.npy +03636649-8adca6727b3275cc305056296c226e1f.npy +02924116-e887b5b410aa97d347eb2ab702fd92a8.npy +04379243-d903be5d4ceb3fd56eceb9b47ba95c.npy +02958343-1d5872004edf12038644d87f4c93cda7.npy +04379243-73a870e530c3a9993c77a85180cab6b6.npy +04379243-f979c7a650d29ea819fb4103277a6b93.npy +04256520-1b4cfb30e4f49edb4b3c42e318f3affc.npy +04090263-3aa24b3c616c2d649d5aeb7097eddbda.npy +02828884-6daa439badf26355593ebeeedbff73b.npy +04256520-3c08ae3ae78253bb73800789ccff9705.npy +04468005-2c7bff9607252a9829054625f34e281d.npy +03001627-800f60058f12a5243c2e0b170f2ad8bc.npy +04379243-898936a8b8e448ad1d70b774ac91773.npy +02933112-2bdedc5d70cda02cc59350d819542ec7.npy +03001627-66c791cf5f1e61a09753496ba23f2183.npy +02871439-60a120d9fd6d2e6afa910dff05693976.npy +04460130-f584f1a14904b958ba9419f3b43eb3bd.npy +04256520-82f8c687a9cf7dcd5dc3653f8341633a.npy +04256520-9cddb828b936db93c341afa383659322.npy +04379243-f2e6820ca69d9b7719fb4103277a6b93.npy +04004475-a3cbd7f73ef9107ac79ad43fc7954c58.npy +02924116-cda78b99ad19e0bf7cd3cf23748abfc7.npy +02924116-da206a22fab289812dcbe72a6f5292ad.npy +04256520-d13cd4fdf27074854b3c42e318f3affc.npy +03337140-10f998ca3f52fd7991c352d02061b3f7.npy +04379243-f294a34bf1c9ebb7f12d7184a2ad3430.npy +04379243-6af9a593129b028eb67e68783d58425a.npy +02958343-c5f77a00c9cae334cfd826dd468a5497.npy +03467517-2a5254c39a3ada8ab7f9d2da6fc61cf.npy +03636649-b57bcdb88c669663ec2a7a1f5fe7365d.npy +02808440-945852e568b5674a1c17aef130ed6213.npy +03211117-1ec7d9fe07b94f6e274d4393e80e99fa.npy +04256520-933a9330407d51b6a8cfd114c4b34e97.npy +02933112-a58e77d8a9b37e0280b9485fe431cb14.npy +03046257-a70d4a4cd569e7ae4e09ebaf49b0cb2f.npy +03624134-e4f610f36ba3c6f69246ea0301684d80.npy +03001627-2acb11399d4d6cc335836c728d324152.npy +04379243-70f9acbbc2881b7657629428a2666327.npy +03991062-79e00a2e90a0f4e37680453d225551f.npy +02808440-a00e66c628e452413beb0acbcd481c2d.npy +02808440-751e8ebf30e1045e54d7082b34825ef0.npy +03211117-5a440522b7df4cdf318d408ca5b702a3.npy +03593526-1a1905d6da94d9c7561ca0447e446f39.npy +04379243-b10d84b3a04085b17618b16b281bdf56.npy +02691156-92fb0d6a866fe7aca8607f540cc62ba.npy +04379243-8934c3cc317957db4637188d1bc69cfd.npy +02933112-b64d237b3718134b6e5b9257c4084ca2.npy +02958343-e23ae6404dae972093c80fb5c792f223.npy +03001627-3ae4d69fc1f9b15d2f008cb82e08f24e.npy +02876657-f2279b29f7d45bbd744c199e33849f2a.npy +04256520-f49df2996692bda02c528d33bca1ac2.npy +04090263-d7192df213be19cb365a9fccb786f8e4.npy +03636649-fa0a32c4326a42fef51f77a6d7299806.npy +03636649-bc4db3c90716f7ede76bc197b3a3ffc0.npy +03624134-40ccb8ac250e0ea5880595487ba7a30b.npy +04379243-99ff33b261920e8a55f9913e822d5318.npy +03513137-dfc0f60a1b11ab7c388f6c7a9d3e1552.npy +03001627-a598b87a9e37a438617c72672c86a49.npy +04379243-682263e19fe7c52d492d9da2668ec34c.npy +04379243-6ace903899706a5819fb4103277a6b93.npy +04090263-9b570b06ee8a7b6f56642b7cedd4edb3.npy +04379243-743992f3e73c7e258ba8ff316aec8d3d.npy +04090263-369127e85227fe5e218e4ad7111aa13f.npy +04379243-a88b21425768bce39f6ec855d7c1f09c.npy +03001627-11c9c57efad0b5ec297936c81e7f6629.npy +04401088-fca7558e383a8200a1a64f95774cf79d.npy +04379243-124c4b3afa6a3e56eaf288f952624966.npy +03001627-fbe08af112773184e6fe3612af521500.npy +04090263-3d4d7ae437d1153317c2892ca017a9e0.npy +04379243-a3ecb4d209807312492d9da2668ec34c.npy +03691459-56e41e5e3bdb2c8dec29f84f96a7e29f.npy +02691156-4542b5cf23a95691ca8607f540cc62ba.npy +04468005-3158fe582164b940cb2ecbd32dc2119e.npy +03691459-e637b80011db78c3dd6a08110bca7bd5.npy +02933112-76172d3f487ccc6cf4ab13f4b49ac318.npy +04530566-9b02ecc129d89000f4841afd366e16cb.npy +03624134-67b845419e36948dbfd8c61edd01bb6c.npy +03337140-2a9fe1253f9433d1a2651abaf391628e.npy +02924116-56c9074a335703c8c9684e1b606d6226.npy +02933112-763c7a6a8821cc75ed40cf95f720995f.npy +04379243-94ef4f9589a1577e123691872d565e10.npy +04004475-d4786d9d56c74302b216fb38ac0eb009.npy +04090263-311f3a46111ef5346314c3b6a3a65519.npy +04379243-41c027788c1388bbc48d90eef8384210.npy +03636649-b8e26fbbb44def8d1deb48513aeadf93.npy +03790512-103e3c517cd759657395d58407f193ba.npy +02828884-9a7847726c939d86c267d7dba6c1d40c.npy +02958343-7076464b3733aa38d2c2bfa672ed621f.npy +04330267-b41c827cde59b18c41965be83b7745a.npy +04090263-cb9255733bf39c58f2dfd8037041a218.npy +02691156-aa4df918db6c5973db6e67bf56014264.npy +04379243-ac864eb8b8a084756ddf5c10cced4ccf.npy +02924116-cb92e325a921477cb2396a459c8a8602.npy +03928116-f687d16e2b69a6d48a8cf1e3e05903e3.npy +04379243-4e08d2efcf14b7adee170fb6995748d0.npy +02747177-21a94be58900df5bcb2a965e75be701c.npy +03636649-da5f13f4048dbd72fcb8d8c6d4df8143.npy +02808440-10912c73b7290f963321831d2245cf06.npy +02992529-49ce3fc723ee4b362d43b5caea00b490.npy +02958343-d5f1637a5c9479e0185ce5d54f27f6b9.npy +04379243-59d4c154eea079c5492d9da2668ec34c.npy +03636649-d543465b35604aae1735ea0e092a805a.npy +03593526-82b47431bb7a115a797bc94512844136.npy +03636649-9cf1c74f842be30624a15e3e5e0014a0.npy +02691156-bc48b77452fd108adf8f666ba0e601ac.npy +04379243-12936ff9bc1103944b3c42e318f3affc.npy +03211117-cab3f094677c1070202380f1becb8a55.npy +04379243-73d02435d9e077a75e062e3835b2d911.npy +04379243-1955e341a77661a749684afbca35f3c6.npy +04530566-44a50dc1a9d8a8a65144962e2c20b832.npy +04401088-597b3a321198f0a029b6ce1cfa22349d.npy +02958343-27645458fec3d7ed514e3d96995c555d.npy +04530566-969163f17ce6467d9378da473ee38a8d.npy +03211117-3fa2125a637970e2dc43f1f9f0a849c6.npy +02691156-6615bb23e68159c193d4024985440d4c.npy +04379243-15f0878e6bd57e6c417da6e71c86659f.npy +02691156-fdcb11fa39661f0fb08f81d66e854bfa.npy +02828884-82b8609a6b1dd9c1c1c1ff0fb1d59ad.npy +02808440-35cda808679bc2544221bef0fa3c36b.npy +04379243-14e1d60337a533acea003eff0268278.npy +04256520-34d7a91d639613f6f51f77a6d7299806.npy +03467517-93ee32a4660864eb1c91d5bf986c0423.npy +03325088-1cc79cefa63fa41d2d3adeba9d9c3aae.npy +02992529-25152b4f593e5c0555940ab8fd747fc0.npy +03001627-85c2609fc7a511ece32cefe0e484fed3.npy +03211117-9be4d56513c06315a045e7ca381c39f6.npy +02808440-b27bff29f03406c63321831d2245cf06.npy +02933112-26dcf7a76c89d5aa4da5feafe6f1c8fc.npy +03797390-83b41d719ea5af3f4dcd1df0d0a62a93.npy +04256520-9f575d367e59591128fff7ee99dcfdf8.npy +03211117-3351a012745f53a7d423fd71113e0f1d.npy +02691156-da7354a90e6596e6139336f03eb955d2.npy +03001627-51adac207965e93559f8e31ca87c470e.npy +02924116-93bc3e5c081291c2fd8a70fadf367c22.npy +02876657-b8fd592b4b5dcaa41aa761bcc4793321.npy +04090263-62217abb02b74e9deda1c1890030d195.npy +04379243-993ce4314e32140f38454b411e0edc29.npy +04379243-41cdb5b619790d5a74eb542502c2205f.npy +04379243-d05ff7b47febe58a656db3f863b4b796.npy +04530566-e738f72e4c461e79cd202a4790115f0c.npy +02828884-94ac417b7ec10bcc6420261eb2dfc717.npy +03467517-48d8c9000728c71d9cfb8e6f6728789d.npy +02747177-632c8c69e7e7bda54559a6e3650dcd3.npy +03991062-5b79c55d2266d4f272652f4081ec5a77.npy +03001627-df7fc0b3b796714fd00dd29272c1070b.npy +03928116-5a91c90b73671e35b249ce9318fa571.npy +03001627-df8311076b838c7ea5f9d52c12457194.npy +02691156-38884564ee0da15798494085d68ad6a0.npy +04379243-c094e213b2199035ed90a8a4ccf0ca93.npy +04379243-6f957742745697cbceddef1607dd507.npy +04256520-29fb859b965bc4af691e0e3fa7867bda.npy +03636649-50cade4e6f714f2fc72e6d708486db91.npy +04379243-64aa142f104b99379a535d0a5590e4c0.npy +02808440-9e0e6ad9f5fb863bb362845c6edb57fc.npy +03325088-e1e7f5f1d431e77f6d0157e3e7a8917c.npy +02958343-ab2759c8e0cf3b8da9d243597c4c2c2e.npy +04379243-611354b629b71f72d5b708f09789d978.npy +04379243-41e1dd0f69afd7b093e18ebd46d61795.npy +04256520-baa8760ca5fbbc4840b559ef47048b86.npy +04379243-fd861b13a3fb637e463650bb8b4560e7.npy +04256520-136d5a16b110c84566b7da89cd9376ad.npy +04460130-aa20fa2c82a588d381b0d56f7467d8ca.npy +04256520-a4ecec332f0ac0d22906e6acfda251cd.npy +04379243-399b6e11c037f7fb5a11acddfe168a04.npy +04379243-db64db160fd13a514e1a714ee619465a.npy +03001627-65840c85162994d990de7d30a74bbb6b.npy +02691156-85d3691b7bde76548b96ae1a0a8b84ec.npy +03642806-d380e53dafa66c1a86a7e0484f5238e4.npy +03001627-c2ad96f56ec726d270a43c2d978e502e.npy +02924116-638f96b7300e754178d5e65673875191.npy +03467517-2105dd5dd6a40240142846fc3207334e.npy +03046257-299832be465f4037485059ffe7a2f9c7.npy +03636649-c125ab8675fdc2b03225afab722d9fd2.npy +04090263-156fbb9dc2645686a3daeaea95a3adc4.npy +02958343-71304f56bb1165e7f42b5c72b4901f94.npy +02828884-d41ba8cd6a5b1071c1237601d86c1b5b.npy +03001627-b38d05caee69c7ac8fc6229eb64e56a.npy +03001627-38279fe5f442d95f458feb88086a534.npy +02828884-4ba9cbd97e4fb17a75e6bc7c944c5642.npy +03001627-17b7a0e3c70dbc3d90a6b1b2b5522960.npy +02691156-b23e79036b214fd4ca27bba175814d1.npy +03001627-74cc57ea0e2e06dbe4106b1d06dc89b3.npy +04530566-d9e8f45b4cd81f0fd1c387e16c0a41b0.npy +04379243-32f116e50ba1dcde7ff6ace05b36a5.npy +04379243-2167f82caf4ed2309eea323f522c6486.npy +02942699-ce40b134b11e8c822bbc2c380e91dfe2.npy +04379243-5315fe89ddcd618a6b9a552adee29b1f.npy +02801938-3ebac03588e8a43450da8b99982a3057.npy +03325088-194ad4c66c27718b603f99a15dbe4cf7.npy +03710193-7970cdbf8b2f60922ccc07812ccf5b3.npy +04256520-58447a958c4af154942bb07caacf4df3.npy +04256520-beb06b61dad3795c95c7d6b48c371712.npy +03991062-7ae8b260ffda13745d90c2f8862ed5c1.npy +04256520-a6239b94b8def78a2f7a42055c3e9340.npy +04090263-86baf335855c96d212b38b1d99376c0b.npy +03593526-6628119d7cf6ca8b82db9fca4b68095.npy +03513137-bab3a20dee03a0f0e4773d7a183337d9.npy +04379243-48ccce122177c96c3dc1643807625350.npy +04256520-10f2a1cbaee4101896e12b33feac8da2.npy +04379243-8478187660d5443186915ea7a2083dcd.npy +02924116-2466d6065594dbd373873da0bf53928f.npy +03325088-bb727c220cb940bad3ac876afae3fa86.npy +03691459-27266a732bc955e4db965514105122a4.npy +02828884-3a8f4586fbd17e6d56f6fc4b4ce1db04.npy +04256520-458bfa76a934921f4494e96d71433541.npy +04256520-fbd0055862daa31a2d8ad3188383fcc8.npy +02992529-2266b891f080ad7eeb2a3da43bd37462.npy +03001627-a18b3364ce7ca94d5921d1ce0656232d.npy +03001627-8841a35812d5a95f98a4820926b2a786.npy +02933112-1b32d878eeb305e45588a2543ef0b0b4.npy +03046257-c00fa590249faaac140ebdd4d6d66fc.npy +02958343-d6b7bb6c6203fd9590f0aa5ae25c9b7e.npy +04379243-72194d338303b1b155d7f0828042fbd.npy +04530566-45642e87b3904a1395f5b96bf7fdcaf5.npy +04379243-6c844e3f4a99bc3ae8375def5e736d8.npy +04256520-8481271bdd974c424b3c42e318f3affc.npy +03001627-1886b3e3f3d4af3ace522e6dda26fb51.npy +04379243-6fa6f986755409b77f4b44e9ef57971b.npy +04330267-a036b70289e45fc177fc9677e91cfd1b.npy +04330267-830b31818f5b91474efc7e7114f1b9c5.npy +03593526-4689cff7bb28dad35425a71c247ca5d1.npy +02876657-a4a6a464cb1db9286bdbc69440dbff90.npy +04379243-26797a03b7940d43d9a7daf2d70e57bd.npy +02933112-4946c14a466fb5094da5feafe6f1c8fc.npy +03642806-cc596eaa22c3e6cf37e1b9ea967d5071.npy +04379243-266ba504ee57b85c5298386582afecd3.npy +04256520-ae4b600e137214dfb675aa3c10a97f3a.npy +03001627-b526dccbbe8417bd6cf45f1c1a3d29af.npy +02691156-ff77ea82fb4a5f92da9afa637af35064.npy +02933112-5b6195448cbcfc04b8cac7fbb9e49985.npy +02958343-a34dc1b89a52e2c92b12ea83455b0f44.npy +02808440-d319ba92fbe38bf4429d80a62aad88ab.npy +02801938-f870bedc47fdbd287ae6f33544c233fe.npy +04379243-bcfda4ca76d65ca8d4eb6d6477feba27.npy +04090263-5cb8be7d0224277b74e18e0e7a19212a.npy +03001627-458637d073cb6e9dc8687ff9b0b4e4ac.npy +02958343-1e6ba139bec5e49dd9f9c2955f462abf.npy +04379243-84f5e52756fc84f86df14337f24e49f4.npy +02942699-d6721b4ee3d004b8c7e03242f1bf8d19.npy +03691459-3a346d78102ca842b996cd669da05484.npy +03211117-7a5a80c7a2d89bc6728fa2df514c65d4.npy +04379243-31f09d77217fc9e0e76bc197b3a3ffc0.npy +03001627-c98e1a3e61caec6a67d783b4714d4324.npy +02992529-33cd4232a87e1f416a1f7081746396ba.npy +03001627-e7304e89fb763e45507243968c1db8f3.npy +04379243-76814dd29a8fdd76e400ee8c5c49a7eb.npy +04379243-4e855038d6060cbb47e81ce1f9a6ff7.npy +02691156-e0ad511aab31dfdb3e237dc81fd8be72.npy +02691156-655dc5a5376e9c8152c3271e911ffe19.npy +03624134-2bf31f2abe9aad6d1a768998fd92e128.npy +02691156-487c60f57489506d5d515fd83cfe3891.npy +02958343-718bfae0c87ad9fdb04112587bd2b79.npy +02924116-7c39944cf7564a05c05ee00ba679322.npy +04379243-a3d05dc39ca639bc662cdc2f77e49a85.npy +02924116-3fe3cc5389773fc21f3f27ff04a4459b.npy +03636649-e474916f1ee1635e0bc0e32d71e297.npy +03001627-35c3575340cc8234456cbf78e1e89022.npy +03790512-a94060c97cfa0c6350bbf5cd198b144c.npy +02946921-91a524cc9c9be4872999f92861cdea7a.npy +03211117-bc690122f4a3646047dd811b692e315a.npy +03001627-66683c677e7b40593c2e50348f23d3d.npy +03624134-423adc73596672f08bad9bd0c4ab8e3c.npy +03001627-b856a62e23ef65324b87db09ac4cfa73.npy +04530566-a31a0ca1247e23ceb1bb46d2556ba67d.npy +04256520-7f0bd726971e34eef9aec59741c69cf7.npy +04256520-a6acd78fda77bddc52862c62c571b1e.npy +02958343-e1c16a07b6e974b951a95aaa6caba1d3.npy +02876657-4fcb653e7978812d9c3900c9619d4db4.npy +04379243-e44531f7204b6fb9fe43ff1e45af424d.npy +04530566-c6bc9330b0a75d83cc73edf5d735208.npy +02876657-1cf98e5b6fff5471c8724d5673a063a6.npy +04401088-5a7e19fca06d2bb7f2848e928a160066.npy +03636649-af3d58dc258e0fe06ef604d255267aae.npy +04379243-ef92a53a5aa6ce008f88435cd882fb0c.npy +03624134-df6ce028a9a0d8178bcec9d54ae64e9.npy +03691459-84adc06696eea1774a2b8524bd5c98.npy +02828884-de80be770d51dbf53567b82c74e275b4.npy +03790512-aea3c4f2687e97c92942fa3063963cb6.npy +04256520-11007f74b06bd90c518b6fc7ed4f3487.npy +03642806-f811252fcd1f7d686845a0762dd07baf.npy +04468005-4ee9bd908e79cceba09163d0bb607639.npy +03085013-a5349bc8e3a7ff77c600925618bc4f77.npy +03337140-e58274d0771d56f77984fb9ec7e40829.npy +03636649-ef9e0709f535c549b3914c1351b16c4d.npy +04379243-eeb23be65d6c76123199fadac163f8c6.npy +04379243-ba8378a73db72f51febad4f49b26ec52.npy +02691156-68899f486f3a6015ca8607f540cc62ba.npy +04330267-51c2dac89ab9db802f79567a8778b1cc.npy +02808440-6bccbd29c44ea50d54d7082b34825ef0.npy +03636649-9282928d320e83091735ea0e092a805a.npy +03642806-55a05b33f34e7211f71cb38553f14917.npy +03001627-7fa5ce045ee0a286606aad310bc344b7.npy +03797390-9961ccbafd59cb03fe36eb2ab5fa00e0.npy +04090263-69252c7838ace59f8aa7cb0651220ba4.npy +04379243-c5a02d586ea431a1e76bc197b3a3ffc0.npy +02808440-29ad8134c0e600c458661a3fa3dffb70.npy +02747177-fc62acf82529b74867964ba700cd97f5.npy +03624134-67802020163f6b8c1395331ebe4786cd.npy +04379243-b00d6677641be37dbeedb4c8fd29e2d1.npy +03636649-348fa2fd3af7dc0a4016a312c4d162ae.npy +04379243-4e87db85d5dab96822339a4b4aacca6b.npy +04090263-6f447ae319cb3f8c95822127460cc765.npy +02958343-457ef8db81db726909e2381adbddb4b.npy +03046257-b7b988707b63c048c5c6c5671b8e3bb3.npy +04256520-a015c48d41079f9219e48122ff512ea5.npy +02958343-6979a814a64f6da8becf71e2e014ff6f.npy +03593526-9e8595c3bbb0a5d0ba5342d638d0c267.npy +03001627-3919e93cc1f3bf5bd7f7a4c4609b0913.npy +04379243-9d63f4971a332c55f7628281ecb18112.npy +04379243-b69df94b39931f196c8336429b11e233.npy +02871439-3c6b1e5888e5fabd9463d0e381798ed8.npy +04379243-12b1fb7c765dfe8eb76e29c9c43bc7aa.npy +02691156-326e859d86a8078427eb9e7911a17418.npy +03467517-cd26da8e82da2ff36212ceeee46a9894.npy +03001627-9ab4d3826bd2f07b51bb569b4bf0aada.npy +04379243-ed320d80089655bedf6cfab91d65bb91.npy +02958343-d967be366b99ac00bac978d4dc005d3.npy +04256520-17c61068a15115a87c2f226180343d2e.npy +03948459-708e38e7b733fd22bfae4699de9cb91a.npy +02958343-36b211593bfa7c2f7f33a9b0659de0d7.npy +02933112-600d06bd779fbedfce5d6e9371bb5c33.npy +03636649-a54ea55a07b96a237b2bb75885cfc44.npy +04379243-7ee81223e7a4785ea7866257ee5db61e.npy +03001627-76ee694df725b5b4664b3b9b23ddfcbc.npy +03624134-854e7bb73afaff7591ea3afb2749822f.npy +04379243-b21a6839869018c6ab10c969b34d14c2.npy +03001627-7f4f73ad1b3f882ba14472becb07b261.npy +03991062-4996f1c0120f4c62ab361b6be63163da.npy +02958343-f45268c928a4b3fc8bc584bb94b0b13b.npy +03001627-726996e3177354cf2095dce957a7a5d.npy +02828884-516e288a1f609250d2b12aa6a0f050b3.npy +02691156-7201f2a0f410dd0ea79efb489d71d723.npy +02691156-e51bd7d434d1ee6622096c1bee7ddc7a.npy +03624134-581bc5e4154baccbadbb944d3d9cad9.npy +03636649-817c0b1b85437923e7321f25048c6142.npy +04379243-fb50672ad3f7b196cae684aee7caa8d9.npy +03691459-f0f9a2082454542751dfe6844b6e8393.npy +03211117-f47044b611046a7bf901627f525bf7a.npy +03325088-f92135b11ed446bed42b9650f19dd425.npy +02871439-c947f9834b2e3dd66a2c9acfda86bcf1.npy +02924116-514623ec3be9f8ac9f46749e28e16975.npy +02828884-582ecc11367a2aca2056b4bd5d870b47.npy +03001627-fb794b0b3260794bfebad4f49b26ec52.npy +03928116-a51c7a09c0bd3e8535a276fbe43f61e5.npy +04401088-f0b3e6f5bd34ca3cf0c6f578f0594c3.npy +03636649-a0812cee3fff72103ca265f557f5dc3e.npy +04379243-e0caa2e794d98c814c9587cb3f654544.npy +02958343-37ad66d0433beb633df8f4ac45647158.npy +04379243-994fac397c6246beba878f7904755875.npy +02958343-37e781aa8ae8933a61c6c61410fc904b.npy +03761084-46dbba829a57ace8cffd61677456447e.npy +04530566-2d07f2ed9c3d78b33f222a37719e9945.npy +03948459-d0116dcd5bf9b88fea96bfd37cd8bdfb.npy +03046257-ca9d22c90fb687e045a3ee2cfbb67212.npy +03001627-bf01483d8b58f0819767624530e7fce3.npy +02691156-babf58c69501ae6b9b46c030f642fc41.npy +02958343-1b85c850cb4b93a6e9415adaaf77fdbf.npy +04225987-710467261256490ce1bed90743417b0c.npy +03636649-da09a8c73054e9220ca3aeb14e36a45.npy +03797390-d75af64aa166c24eacbe2257d0988c9c.npy +03691459-14e608a76c6b77bdf6045e4ebc9df52f.npy +04379243-8421fd68fddd2a033f40a91f25bb93a.npy +03046257-5924dd5aeb057e576ef2faffa907bc32.npy +03636649-11913615a1b732d435836c728d324152.npy +02828884-895563d304772f50ad5067eac75a07f7.npy +02933112-bd89eb4a7407f07e54d8afaf6caac97c.npy +03211117-f800fbcdef1ac9038b5dbcd4be5ceef8.npy +04379243-b35bba0caa2faa642eaa34003788a9a2.npy +04379243-73ca85d8666e7e26e836e479c0864af1.npy +03001627-218233bd68f5261dff318cdb0cb45ca.npy +02958343-4b67e004d83d62bca1aea50fbc4b17d.npy +04530566-72a9394882b8151bef94bcb012573cf2.npy +03593526-ee81529fb1ab07754b3c42e318f3affc.npy +03337140-25ec4822418e70cc91c352d02061b3f7.npy +04090263-3925a46f22a5587551f49d4582a8d17.npy +02747177-676aa5ae01563ba9ad5067eac75a07f7.npy +04379243-87c752e8280cfa2316a2500eff5eef3a.npy +03624134-bcd5c95026dff530542a1605686ede02.npy +04004475-2263c8fa2d951833ecc46197d5349c6e.npy +04090263-c8cf9fce86c7bcb3b38e8b1e877a5704.npy +03001627-1fb9ffbcd38f8ba63eec26c23f5bc80b.npy +02933112-88e89b29e8100f1c1bec2e8246842c2a.npy +02992529-3f4a507d616678da650fb6b8f6bf3419.npy +02691156-4c008f39378be18bc0909d98a1ff2b4.npy +04379243-3804253f3eacff56a55e6ad8c321a190.npy +04379243-97f5d86912ce0f872caaf8842dbb8ac2.npy +02958343-beef4a450e0d42db6436916a86a90ed7.npy +04379243-fe84ae93e0eac1e45b903ba10d2ec446.npy +02828884-50a3b398b3a2e5979ec4bb690ca24962.npy +03325088-228a2b60a63135eec36fb70296e45483.npy +04401088-4116965029bd24393423610e52061098.npy +02828884-c79fc66b27a900ac842d08202a7fd76.npy +03211117-9e1b897c08a6a91f94cedf1e55d56e03.npy +03991062-f4fc8dba27f70ba8d4d8765e3910f617.npy +04379243-307474fd0cab5c982fa77440dcb93214.npy +03642806-2d47af483371ff60672faaae04fc887.npy +02691156-fc2c9fd0bbd77dac4d210d9468aedaf2.npy +03337140-6479718ba7e517e6492d9da2668ec34c.npy +02958343-8d560e44c4eb588d4fdf31cc2d78fd0.npy +04379243-95483e7754185e03986b14b31452df23.npy +04090263-bf76395bab45ffac2249915e95f55f08.npy +04379243-25bcea593e4314c3436e6787c76ef3f0.npy +04090263-3be0bc4b1169ca4959db9878902bfe69.npy +02958343-25480875a6be8e11afe1d4530f4c6e24.npy +02933112-b13778ff6594e980605de7eae9f0b0f4.npy +03593526-507b672473eda11032a1eca0e8e4f468.npy +02958343-65f0321c5aa8c303a1936d27bf774e9.npy +03325088-576e6b3d7b188fe9b362845c6edb57fc.npy +04379243-e77fbb3e21ccacf1a03bb2c2325d6f92.npy +03642806-f9f484e4364663d61bb5a64b9a0f552b.npy +04379243-a31e317e57540f3ffebad4f49b26ec52.npy +04554684-452f7e16dcf5b2cf46cde67a6a1ea328.npy +03991062-7eaf07e7139f5832a2c59a4d90e63212.npy +03636649-3889631e42a84b0f51f77a6d7299806.npy +04090263-5a2232cb9dd25917768d4c3a89626da8.npy +04379243-22cb00fd7f4d016429b55029703aed8d.npy +02828884-976636850849c3d6ffd996335233167.npy +04379243-f7646a27fa757afe1829bffea9d18abb.npy +03001627-32a4ddf426cef33c323ad87fe7d4deee.npy +04379243-faa36ee5b5a296ff7e66b3e5c11f24d4.npy +03467517-3839f1edddecf07c502e2eeb62a0f66d.npy +03001627-a5d41f647e7ae9deeaf288f952624966.npy +03001627-1c758127bc4fdb18be27e423fd45ffe7.npy +03636649-4b48b7f72cb4f56ef00f0216ab99ff30.npy +03001627-db549976c0b7b960d42ec7e303174a87.npy +02691156-167740d2a5f5cb6c7f4561609781d8c9.npy +03001627-929ab79b4f45f747e6fe3612af521500.npy +03001627-a6009749fd05fed82d19175e7d19b7cb.npy +03325088-d9e81180a1dbd0a550da8b99982a3057.npy +02747177-dddfd6b37ca28647167a483e22d2eb7a.npy +04379243-70f408c759664b953f99a25d2bc1902.npy +02992529-4b72058b03234d188a81847056b4708.npy +03991062-cc7c12306cc3785fe15a365ae69dc5c5.npy +02828884-f8ff2310c6b130d38aaa31e538081318.npy +03467517-3a234019cd1da956fd3e16c646c7a0a1.npy +02691156-c489f0cb96399da63c326782eb2d380e.npy +03001627-a98b128938b56846ee316b26c8d85c48.npy +02992529-4b91c9711ca991768a57ed2dc0905847.npy +04379243-8963760f8bec0fee7f807d3c406ee.npy +04256520-f114b76d551b5e5affcd08faf4fccd0f.npy +03001627-21da49c5fccfc3e68d861be5b561accd.npy +04530566-6b72a64f1a6a745ec99bbfcf5650bf52.npy +03001627-a36aa9aef138fdc1377b9297f3055210.npy +03325088-1818f3ba4874e5ab362845c6edb57fc.npy +03691459-7998efe14649e07c397a4ece637a5.npy +04074963-a6a121234c2077d6dcd16fe97fafc2c6.npy +02828884-8d1f361eb7a927d8907921e9162f6a43.npy +04256520-70cf74bb4e1e14dac15fcbb4bdbaf13.npy +02933112-47e09607098c43b5768049e7324c832a.npy +02958343-edc9a70958a17433b1bb46d2556ba67d.npy +03001627-896303208667c3e9713decb1a0563b12.npy +02691156-273e90f5c26654ea8b96ae1a0a8b84ec.npy +04379243-ffd45a17e325bfa91933ffef19678834.npy +03691459-bd2d91052e6c10804c6c80caaf15808d.npy +03593526-44e3fd4a1e8ba7dd433f5a7a254e9685.npy +03636649-d5a67642ff0a2908dbfbef883e8d10aa.npy +02933112-e2de47fd0e63a280490ad276cd2af3a4.npy +02958343-481999bad4bfe8bd3dc7f272b20d8426.npy +03001627-916a6ff06a128851ed98cca8f0ccd5f7.npy +03001627-4978fcb47c15f96dce88197ffe0c21da.npy +03790512-edc4c7a08293697db37378f3c85478b4.npy +03636649-a22c4d43974086de31ae8c8ff1eb3d45.npy +02691156-9705e3c2d21106ced7f23cd024f22c12.npy +02828884-bb020b7d9c7fca9cad5067eac75a07f7.npy +03636649-a51f72154f09a2f926d49ab26d3c4ce6.npy +02808440-125720e2aad7cbae412ac8cccf0c180f.npy +03001627-b8772904c25b61ac6b2befe83a0efe39.npy +02691156-59b851010f0aef7422b13c48c34706de.npy +02880940-95ac294f47fd7d87e0b49f27ced29e3.npy +02933112-dc4e9bf3eaadf2544c62bee40dcdc539.npy +02808440-a5554278ba72e07213d2510999d0f1d2.npy +04379243-e48675e37096a6898527e24d5de49fe6.npy +03001627-6e5c0ca5ee70c88b77dbab4c80b965e5.npy +03001627-4f243d655c40702ec772d43f7a27a1e.npy +02958343-4270f4f3372a1b24546b7395fb17f97e.npy +02691156-b8e4e4994d4674cf2023ec956848b741.npy +02691156-22393fa9307224ec853c6f214c15e60f.npy +04379243-21227197948fd2857c2f94a943a8669b.npy +03046257-289850e742ec351bdc7cb2def50cc404.npy +02933112-964258d29263afdae76f0f0566cf10f2.npy +02818832-e154ac0ffdc047b8729c04438af8eabf.npy +03001627-3ba15bab072af6ced014b923da2a041e.npy +04379243-3a52892dc6c06efeb2403dba7fd079eb.npy +02691156-78789e98f905fcdd9107f68a9cb8e3c.npy +02691156-5d81abbccc11935b4d4cb1c2a5e48b7a.npy +04256520-83d39faa5782395b651fb4677c188d35.npy +03001627-72fe5266a93c1998dbbc9440457e303e.npy +03001627-a4bf3b34bf49c5aa799b0b9a0d4a12cf.npy +04379243-3ffe22ce4ede7a187886a3eca4dfc4ab.npy +03001627-669a23c329080506d295b24579cf55b8.npy +03642806-29f5cfcef7272f1f640578ae55230ebc.npy +04330267-bee6f7918373cf8026587cb13c78fb9b.npy +03636649-2ce7732982343c1d9792f6094a78f8d5.npy +04090263-337d3642a2d949a4f58d2dcaa6073061.npy +02958343-da82ba81a8fb0737d06f1bbd2acc051.npy +03001627-43c71ca7f9d3dceb8b0742c681b435de.npy +02958343-6208c5fcc94fb6ddafec9b6a5ecfd79d.npy +03001627-43f15ce32c7c97ef19cb07ecb5b4102.npy +02958343-1159faf9bf78998493680c5a9a367b4a.npy +02691156-5f73e503595094b783b772877a547745.npy +02933112-25c3964cf7a607b1f51fa0238791f5dc.npy +04090263-f3298345f6d6ed3dac4f72bf08dc79a6.npy +02871439-b8e455419b42c77e262b272ccb3b11c2.npy +04256520-1a201d0a99d841ca684b7bc3f8a9aa55.npy +02691156-cc113b6e9d4fbeb23df325aac2f73830.npy +03797390-c6b24bf0a011b100d536be1f5e11c560.npy +02691156-22ce6f6d1adb08d7bbf3143b1cb6076a.npy +03001627-d7e4851fb3001a10f652f706160dc96d.npy +03211117-6a743f7ae8deade97e0bbc356ce23758.npy +04379243-45bd3bed8ef1315ed42ec7e303174a87.npy +02958343-40953c3fd24e9d65ecf689885b7c1e59.npy +04379243-3fa5372c0ff38e447135e387a71e9d31.npy +04090263-1639ae190f0e05196df38a7dd1b448e6.npy +03001627-769b26b459617608b04cb542e2c50eb4.npy +04401088-f66d8ca1f6b259de2a9eb0f146e94477.npy +03797390-6aec84952a5ffcf33f60d03e1cb068dc.npy +04379243-c35a4a82cac49ecc55f46d55537192b6.npy +04379243-91ed62f2b3fd5919f12d7184a2ad3430.npy +04554684-8f9232a493ccf77e46cde67a6a1ea328.npy +04379243-1b5e501a28921c43d46cc1240811b39d.npy +02958343-2a82a66ce6273dce601c8ebc794de3f4.npy +02691156-b75575684fa8ffaeac7e7b41e1ebe3e4.npy +03001627-85654bf43265664eca5d1f82257fb9d9.npy +02933112-8e897603bc5217174b8710a3469971b1.npy +04379243-5d82e3924ace17d814038d588fd1342f.npy +04379243-138c29cb642dcd6352620f29156438e2.npy +03001627-a838d73a1ae66934b161f36d4e309050.npy +03467517-4bcac7ffff02037f624b30f45b82fb10.npy +02933112-55bfa46d7b39f4dcc59350d819542ec7.npy +03624134-3ad3c5fd3ba04fdb12cad8be168fe72d.npy +02691156-f7739764eb1c78a053f370d353cea84.npy +02691156-a3bafea9edc457463da2ae40e7681e7e.npy +04379243-15ceba504a820cdfb4c161851ed2b4e4.npy +04090263-4c727a571a5226549a6e43b878d5b335.npy +03691459-569fc1b111617f4038b28f94c165f833.npy +03467517-a0f18369bec03d61e32ec871de9544ab.npy +04401088-2c6d9512b4013504ff0682cfb57a62dd.npy +04256520-104256e5bb73b0b719fb4103277a6b93.npy +04379243-5243b5491a4f8a16a2b5862518c93.npy +03211117-dada218e78c9c81e2250bf58700b4d8f.npy +03001627-747d2db60ca6b98f3eec26c23f5bc80b.npy +03636649-6999ab054bc900d1868fb986bc092533.npy +04379243-cda35fec5923a8602250bf58700b4d8f.npy +02773838-e6daa1435018a044da5feafe6f1c8fc.npy +03001627-b81be96660f38a8c7543d7dbfecfffbe.npy +03001627-5b185142b33f3e45c3bd24f986301745.npy +04379243-6f2fa876147a970c5acde0d39b1b9dba.npy +02933112-962b62d2b3823aff51f77a6d7299806.npy +03001627-33d8a82696afadcbc3e3d5df2a6ddacc.npy +02808440-1f0ae93f9aafbe27322d134e1c4a80fc.npy +04401088-d37afdca0c48251044b992023e0d3ef0.npy +04099429-d781243cc1d1d2e91a0ec553feb1c2c3.npy +04225987-776eaffd7cbe7bc6b9e8bdc9c4a49aa2.npy +02958343-49a93fdbcaa0302ae434963ea517a487.npy +03211117-191bc5c03d27789379857d0b1bb98706.npy +03691459-61ec03d50268a852d4c639228615260.npy +03636649-6a11bbf62bfb5a5a59f8e31ca87c470e.npy +04379243-7607b1762ab9c79719fb4103277a6b93.npy +04530566-a346005de2c522e9c9078664355a9ff2.npy +04090263-49429e1d1e90c1ca202be79d8b285c1e.npy +04090263-3332ad937d4cf220d34156e5a2f990b.npy +04401088-60193289e8d9689b62f6b877265e2679.npy +04379243-a4b1d784abd7eba15b17dbcbc75d58df.npy +03001627-eabdb3aa920b216820b64028d2efc877.npy +04379243-1c90216659d7b97fec5d8105ca6b7dcc.npy +02691156-f25da5eca572f01bd8d90babf3c5509a.npy +02871439-d7f1a22419268800e76bc197b3a3ffc0.npy +04379243-f0c1fe7cfedf97e9b91b871e750ca615.npy +04379243-a392cd632ea01b6f53a71d150e481685.npy +03991062-81ad2114304874ccb7a1efa8b86b495b.npy +03001627-21ba49d0622c590c8a93d439b5823fb6.npy +02958343-65c225fae513a6dbe7b23463fd9b0ba1.npy +04401088-9adae247285e9538836a2d8722d73dfd.npy +02828884-12ae14d584758b4ee42c56c78fb88524.npy +02691156-7462d130f9c7abcd5e9e2656aff7dd5b.npy +04256520-465e28e9cee51df8d5cb6d178687b980.npy +03001627-1ab8a3b55c14a7b27eaeab1f0c9120b7.npy +02828884-af06152e440a5224e23bd316353fa056.npy +04379243-2ef075a7b9433b06b2b7d07d6c0cd464.npy +03325088-7ae63b6abb0eb0f4b362845c6edb57fc.npy +04256520-d52584133659bcb24b3c42e318f3affc.npy +04379243-a6681ac778c7c314843f1df79528e538.npy +03001627-27700c06980561845c7f80200eb528f.npy +02958343-d63110386a6bbd52d647b1c17442c93.npy +03211117-415b39d4f60a36d742274cb89cb6c841.npy +03636649-e293003f297e155624d1b7c6bfe44fcc.npy +03001627-ea1566ac9fe1670d3b622c8598928cdb.npy +03636649-e180510d07b65fff571108a6d1e94edd.npy +02691156-e9704a563a5a0a3f5a4b8d382b9decda.npy +03691459-2eacd8302d46093ee138e561e8f9c254.npy +04379243-d3fd6d332e6e8bccd5382f3f8f33a9f4.npy +04379243-176e6b9b4340f25a7ff6ace05b36a5.npy +03636649-22315c51156a826525b5da4000a94497.npy +04379243-9199b088ede8a2c920768660cf080d12.npy +02828884-85db4f1bf9e2b62c492d9da2668ec34c.npy +02924116-4fcb65468c2a5a56592ecd319dfd8c5d.npy +03046257-eda7c21b3ab9fc61592f292ab531da8.npy +03001627-99e2f8ae1bef62dcb74c46f4848028ad.npy +03636649-bf6674af4ba8b95fa4080573400e0dc9.npy +04468005-87886a91100844985f72adf4b0bfab9.npy +03467517-58543cda179fda8e6761cb5f9159210f.npy +03001627-90fb9a742f5a0cedc9736640ccf985f5.npy +04256520-93e20cc90bc4ead618a6353ea60f11b6.npy +04379243-3e0f8c39a72f3c91200ad3f421b6c3d0.npy +03001627-43db37a72cbe0f5d4ef0f56ac2c64e7f.npy +03001627-aa4b1153a1c4248930e06a011e63236a.npy +02691156-91e3ab3e12059b4a9d92b4de623f5639.npy +03001627-c42bedf7a36202309056fd4a77b3a4bd.npy +02958343-ef7f623beb7260287b5adf84ce6f7865.npy +04379243-1fb025077ea5546bf7af398806a30cc7.npy +04379243-5b3b19203b5da49c310af74324aae27f.npy +03001627-3fc1e991fee82e42713decb1a0563b12.npy +02691156-538f0b5ee7c786e6d3b936925082270f.npy +03636649-c7c15b7d23fdfd98808760409d52a60d.npy +03325088-26abb7085ac6d50250da8b99982a3057.npy +04530566-fef52f113f59137dc541ae04c251c7da.npy +04256520-f398deceae25a0e752ac884aea4686b.npy +02691156-4f9a01d66d1de632f810506e9ae2dcc2.npy +04099429-9d6c3971491bd0de616ce6fe9495197c.npy +02828884-32b74d6b08ea4603d2b12aa6a0f050b3.npy +02691156-d940f33afc01ff036da97d9f744f7e97.npy +04401088-b7dd49e4f54f736afd5d38d2ca555422.npy +03001627-3f7c81bc7eab161e19fb4103277a6b93.npy +03636649-2a05423b37f2620e1b17743c18fb63dc.npy +02828884-73cc1e9a8f666ad2d2b12aa6a0f050b3.npy +04090263-5f03499ea2b4adb5857835988c6a287b.npy +03001627-2b6c09e26719b256c5facc3cc8dc041e.npy +03001627-ece627bd883d9bbfb0eb7e753c06942.npy +03691459-126ce29983c5421fce567a7bafc3f52a.npy +04379243-67fe5ba50738e325beedb4c8fd29e2d1.npy +03710193-d0b43f44ee976eedbcdd9afbbe6eef74.npy +03085013-21f6bbe54dab206a571ee28145703271.npy +02958343-4ff291758d03aab8d935b10ea652d50e.npy +04090263-83d1b16c362e03ee99362c38b018f042.npy +03001627-56eca3d859b5e8b4594cea63c14fa879.npy +02958343-2e37a9a6abbdf6cf25d175f53644eac1.npy +03325088-7c33d6466f9e1df350da8b99982a3057.npy +02691156-33c9e81a88866451f4fb6842b3610149.npy +03001627-e7a0200c28cdfea7c3bd24f986301745.npy +02818832-9fb6014c9944a98bd2096b2fa6f98cc7.npy +03761084-2b7006326f739b3fe793cc5433bece89.npy +02924116-b943af5eda244f66784879e4d6b78ba0.npy +02958343-425ba801e904cb50f3aaed7e86215c7b.npy +02691156-ebedcd06f1770cd4bbf3143b1cb6076a.npy +02876657-74e5ea1a783a5f5f533775ea6714a372.npy +04379243-3073165c54b44f276e1bbb3913878400.npy +03636649-18010f1e7133415290c2e24416edfe5b.npy +04330267-99f1b9951d4ad128453c30eadc73690.npy +02691156-a42bfdd67b3fc9926b2f6b824c9990c0.npy +03001627-2952ec189e993eeb17e114a7b3c6fb1.npy +04090263-ef672b394e09257d719b648239c8e160.npy +02992529-bf7daa3ade10ee75bad093be69512dcd.npy +03642806-8ac9eb2b975c0d12b5328fde615e4a0c.npy +04379243-cb65b7ed48165ab09e9f71d2c7dacf45.npy +03001627-dfd92aab082e4915e3d9492680c47206.npy +04099429-d1b5300610189ff4e972ca7ee40523d1.npy +02880940-e30e5cbc54a62b023c143af07c12991a.npy +04256520-cf027d5b0debe18321bdbc0445d9f748.npy +03001627-10c08a28cae054e53a762233fffc49ea.npy +04554684-a40e52582bad42308961a7696b4b91de.npy +02691156-e8289fd7e6ab0df4d37636af9c7bcc34.npy +04379243-854b885039dd51e7ba57e2d7b7436136.npy +02691156-dc7c5d12854b9467b96212c8f6cd06e.npy +02946921-29bc4b2e86b91d392e06d87a0fadf00.npy +04256520-1226d123e89626a2406329dad4c94770.npy +04401088-ae819b81ba34165dd6ec95d8e6b9f557.npy +03001627-abbe727944da8cc55f0f8f79871ee942.npy +02992529-bf2a5f434972f11a690a03770c5de186.npy +03691459-96d6d519784e40c0c066b9622c005c53.npy +03001627-31ab0936f07c21ba7b11ae648ea92233.npy +04379243-9a0d79f4e766f18c7d10f85858b5d957.npy +04379243-f74b9b8412dd152f6558f5c8c0d2d888.npy +03513137-be9b9c3bd70c6f5c785b8fa1ee371fb3.npy +04379243-3b9e28ad033825b6d0ae74ce506ca590.npy +03691459-3983ad3c93f4ff0ce029fab54b6cfbd.npy +02871439-6081348fd96b21c3eca22c501ad0a77a.npy +04379243-415c174ecdc612fb6f5c30e29039b12d.npy +04379243-8b7f24a53beb18e8a69f5de385a4c191.npy +03710193-b9f695f1f05c06c573b8c60b60e50ba9.npy +03001627-73abab8429d1694c82e3bf439621ac4d.npy +04379243-dfef8f26e9a8437782db9fca4b68095.npy +03001627-e3a7c517fbe992ddd493bfe20f94b6ab.npy +03790512-9ff5b01d1aec18b2aae529ab4a75c4af.npy +02958343-87ee241d3d0d1dda4ff3c6764341833.npy +03691459-1c29d002435ce5f484f78eafcf19b8c2.npy +02958343-3428307ad66c58c53a0daf3e5400b95c.npy +03001627-aa05a0db9ab12c5e3e7d886a315f2350.npy +03636649-3c1c411ce82c4c43f193a5d512f2c2fa.npy +03797390-ff1a44e1c1785d618bca309f2c51966a.npy +02880940-afb6bf20c56e86f3d8fdbcba78c84028.npy +03211117-941c16598b8fb4f92ddfcbe9b600cb8e.npy +02933112-c8f5521a1f0ddac6c59350d819542ec7.npy +04379243-fa83ef67ce97491ac955e5ed03ef3a2f.npy +02691156-83b55a6e1677563d6ae6891f58c50f.npy +02924116-60e9f9301610e0d8f446f92b52bbd82a.npy +03001627-7a427785ad85f0c771c3cf047830ec1f.npy +03325088-938780d2b2148596bca5df27f3ec6373.npy +04554684-2ecde1b0c35fe63b4e4ed13543f85ef0.npy +03513137-58fe8b9f7026cd2bf1c20b7f59bbc099.npy +04468005-a2c5af9fa5633c3ecb607ef51aa2061c.npy +04256520-7051b028c8c1facfced9bf2a92246703.npy +02958343-d0e68e14e8012b497d6d702dc488f23a.npy +02992529-645c1b7e5297cdf567b9bb226efd81df.npy +04379243-e67447e5ab4b63246d871377f0c1e8cb.npy +03928116-ba07707823473bff5dea31ce253437e6.npy +03938244-397d66329fcf4b862bf863b361489dad.npy +03325088-7d6baf6cdeab0db93321831d2245cf06.npy +04530566-4c1c5200b239b15db700877f4d4ef8cc.npy +02958343-aeac711326961038939aeffada2c0c5.npy +04225987-bdfa2c97ef7089d6b267718342f3f316.npy +04379243-dd63ad97240a5744a022be8e8ae85897.npy +02691156-dadf41579d385b0aacf77e718d93f3e1.npy +02958343-f78bf954495be532afe1d4530f4c6e24.npy +03624134-245d7d1911237928c36546d954c4fa3.npy +03001627-52240b141c70e6d8a5901d93c937a07e.npy +03948459-4a5ed50fe28a7380fef144202cb2b935.npy +02691156-595556bad291028733de69c9cd670995.npy +02691156-ce339f515469303979e13964f05c24f9.npy +02691156-315f523d0a924fb7ef70df8610b582b2.npy +02828884-6e84c668dcc028e6864f7d01926c6c64.npy +04530566-ebb7451625233d772afc5c10dbf83b25.npy +04530566-c715bbc7a1586afe64ab9e610db7c692.npy +03001627-720bc3f0677a75fb2f134420f7b0d7e6.npy +03593526-e142e0414bbe9b39cb6782d0f0acad78.npy +02958343-29c0b746704727593030e8e3910d2b3b.npy +02933112-a08aa6e386cd983c59350d819542ec7.npy +03642806-1dc28ae9dcfc3d773487ed70d4534caf.npy +03001627-1e44e3c128b667b4fdef1c01cbd4ae0c.npy +03001627-c2956c43f763e135c9bfaa062f2e9d4c.npy +02691156-f0137228f926dd464f8327dbe71ce85c.npy +02958343-29487596941c12dd99f6b4f86609dd6a.npy +04530566-b77075c46e424ce9eb2c303a0e0d287b.npy +03001627-6730fb4ca7c90ddccd8b2a7439d99cc3.npy +03001627-66342d92d51f402d3f7e27638e63d848.npy +04401088-c8550b3e45672f5d891ef59b77a7541b.npy +04090263-43ea7cdb23aa0e3de1f2a1daf140ac9f.npy +02691156-b1f08c51a098c43696d224195a988f09.npy +03513137-5174613439e9cf79d2808af04871028b.npy +04090263-bc1d02e51b46cd8f12b38b1d99376c0b.npy +02691156-6ea21a2265075beb9a2f7b9a6f4f875f.npy +03001627-3fdc09d3065fa3c524e7e8a625efb2a7.npy +04468005-2d0265b94d87d381dc14ba0818ee5cec.npy +04256520-1b17f84df81e0165e336453ccee6eebc.npy +02691156-d844094b073a0452b04b2d1c5ce9783b.npy +04379243-659e7b7166d8b9972f84a7804aae667f.npy +02871439-6d5e521ebaba489bd9a347e62c5432e.npy +04379243-ad75eb223ce16ec5b6dbeff8ebe9459.npy +02933112-c4802a2901dcd6e84da5feafe6f1c8fc.npy +03001627-981bbe2950bc9b188f1d1d7c3673dc3d.npy +03001627-fd3759f684abe981d85b29704f5fc7f2.npy +04379243-36fa3daee9a560f049ad73d13f0c98e0.npy +04468005-3b1d2be218ead5992217baa3b8e01690.npy +03001627-5963e316d9015ff1785d41fe7f67162e.npy +03001627-cf88ae03d8cc2fabfcce6278f5ffb13a.npy +04379243-46cef01263d9b449405738a4d4d0fc7f.npy +02691156-1d4ff34cdf90d6f9aa2d78d1b8d0b45c.npy +02958343-5494ca610eb9fad59bd53ddfa65bb6b1.npy +02828884-26240de6617ea89cc6c4a9ba1f33346c.npy +04379243-a2781622b5941ff2a886fe6408aa7382.npy +03624134-dfabed4f151870eb4bd26ac3bc3791a7.npy +02691156-1caa02b831cccff090baeef8ba5b93e5.npy +04379243-3cf25cdc0cc8b384c652d01955093125.npy +03928116-af4904dfed13c508f6646a841979f507.npy +04090263-74a11a9b7ebd4baa424c267cd8f453c4.npy +03211117-ed9d09a17e472e0acc9692a1d1e7dea.npy +03001627-681f4302a8bd9698f4b6538438a0b930.npy +02958343-4b6e6fa36c1e6f865cb51d79fcf5dad4.npy +04256520-3ffeb5868d6f5dbd8c46a3a266762d7.npy +03001627-77a4269a0d64d48336b0f2a1430e993a.npy +03211117-aef2bbdc3b1e9e026a5e01bb88954fd1.npy +04090263-ec688ef9a40c78451188f2b8eec55c9f.npy +03325088-5f76becd78c7eb2bb362845c6edb57fc.npy +02933112-47b069b828d9fae54692707833167ca3.npy +04225987-35c281c44b5ee115f62521393bb9c2f6.npy +04379243-132ffa7d607ffc53d810b14a81e12eca.npy +04379243-fa1317f3a80bd8b1278d386bfa54545.npy +03001627-4ac17ecd78880859e302b6082b0ffc09.npy +03001627-3789c5b85f49b21ef7628281ecb18112.npy +02691156-e75ce21b914ba565b4c6d1a32dc4f554.npy +03467517-40ec077329c26d773127c5e409872bcc.npy +03261776-d768ee2d3f60aedad4ea3f4c41b1b9bb.npy +02876657-21239b0cafa13526cafb7c62b057a234.npy +03636649-8c0380a0d385c98145d451096984140d.npy +02871439-6422a1f1dae8fd231e23f97c3de97d74.npy +03593526-117843347cde5b502b18a5129db1b7d0.npy +02933112-8ee0fd1d620ac1ea974523dbdd88cc4e.npy +03001627-f3f331e64d12b76d727e9f790cd597.npy +03001627-325f9ca506317aeff2c0658ad22a9a9b.npy +03001627-4dd46b9657c0e998b4d5420f7c27d2df.npy +02691156-a5021faf372fa2c48f329df3701cbb3d.npy +03001627-f7dec3c72af895884cafc8d32c041834.npy +03001627-5b2b23120a4607dff7628281ecb18112.npy +02958343-df91db4ada9bad0f9c0cac0d72a31ff9.npy +04256520-3f1e897f2da10d808e52cc55aebae3ed.npy +04256520-2351fc9da59d571d9a404da609e2789f.npy +02828884-74a91aa0a8d9f2b5bef71ebb79d44440.npy +02924116-27b53c8572a52cfa0ea4af438fd24ad.npy +03207941-a7b9af190b190bebc8a1bb0c38d7dee6.npy +04379243-e15a28c0743ded35673b9aac59c306c4.npy +04379243-4ff87c5a639b181b6c6add082247679.npy +02924116-454ff74dd295dbc52470de2774d6099.npy +02958343-1d4b2404a00ef4bb627014ff98c41eb1.npy +03001627-ceec3aaa6ee72dee613f0dbd986ed6f8.npy +04530566-995547c0276be2626bd4106c65ec103c.npy +04379243-b48d04600e7cf2bebeedb4c8fd29e2d1.npy +03642806-d37f5f4d76bb5aee6d0e9ec8b698ce7a.npy +04468005-6f4ac6a0940302a31307b8e7d9f7be90.npy +02958343-d32cd105c2dd79259d959a8bee08198a.npy +03001627-b6a0afcc2ad2db2b490ad276cd2af3a4.npy +03001627-1b8e84935fdc3ec82be289de70e8db31.npy +03001627-b8049c767cb298745dca6305fb9f97ca.npy +03513137-1ae94e883149a07a242154514ef1967f.npy +04379243-15616cf6115c302264e63375fc652d6.npy +03642806-42f71a2df30eabb1b8183a4a81361b94.npy +03797390-71995893d717598c9de7b195ccfa970.npy +04379243-7fd9f6bc9a89d240800a0120f3e757a2.npy +02924116-304d18039eb8f78cb362fb9a75ddde8e.npy +03001627-fc97c771d058556f593de14e4664635a.npy +03593526-d6b6a7a860cfeeda2f2318fdd66be40a.npy +03691459-d4fa4988db7f2eb477818a0572bf1777.npy +03691459-908202c73ba60671c0d274eb53f065ff.npy +03761084-4809d18c7a655877178e7d331e641179.npy +02924116-e21827cb731e3e8d52d3524c5bacd7cf.npy +03636649-16327d928854b34ef11c3739edd52fa3.npy +04379243-d2a331898525d0d1c955e5ed03ef3a2f.npy +03001627-d02f9ae175fa83d3e6fe3612af521500.npy +03467517-22b21e858c58a3d59a6208793b9dfca.npy +04379243-6b13e49c5c13050f5589b48ab7a00cdd.npy +04468005-5e09f52f141e1c04e8784f880dac0f61.npy +03467517-e5fc7cde70b4d5dd63e148e250c0340d.npy +03691459-10421ef12dd27f3650f5fdf97aa1ef24.npy +04256520-8bb72bf16f65fced40ef1c8b63a628f9.npy +02818832-c758919a1fbe3d0c9cef17528faf7bc5.npy +02747177-89aff0d006fc22ff9405d3391cbdb79b.npy +03001627-2eaab78d6e4c4f2d7b0c85d2effc7e09.npy +04090263-7d310ff81ee66564b38e8b1e877a5704.npy +04379243-d51dfe604d380ba9bf01c8d1f07a5c67.npy +03001627-5d0a9fa5c8d9bef386f6991406b6a562.npy +04379243-252d046ecff65ed1f9f3162e7c61521c.npy +03085013-3df729da3b80c91033297782c16a4e28.npy +04090263-56141e8844aea9e4d6c7a58fae95cf0.npy +04379243-4a6d33949265bb6569eabdc5c4c6d724.npy +04379243-46bfac85035dc6f0382c5a0f87d73d23.npy +04379243-15090e10ae2d06306e25f3efedf6785f.npy +03001627-9958038b6d06278a68d1b9a1d97e2846.npy +03001627-bffe3e68857faf7f4d1242a685303c47.npy +03001627-3fa1eeed2e8e2534febad4f49b26ec52.npy +04379243-caa172578943812ec50fe5c30bda6ca4.npy +03691459-4583734434ae5842a820191310c9bacc.npy +03642806-91b857a748f0ccf2ab0b172d4dea80cd.npy +04379243-d87841ba0db5931576a45e9a12af8158.npy +04468005-59b81fe0e2223ac752470de2774d6099.npy +02828884-41d8b7b9480fe27dad5067eac75a07f7.npy +04090263-6e2dc15452034791a791c4f82c7b99c6.npy +04090263-6d751616e0ca4ca0aab32791f5a03201.npy +02958343-c9e555bb1a17cfbc5d918097f81825e3.npy +02876657-523cddb320608c09a37f3fc191551700.npy +03001627-324b0bc4363cf4e382db9fca4b68095.npy +04530566-cc7369fee843cbfc8d1322963ff40d1e.npy +03001627-91bd85c70bf89da2a8737fcf23389014.npy +02828884-9cd6dc2b9d11016c49b3ccbe36f67015.npy +02691156-605c79a4937e72aed0f4914f6d630bad.npy +03001627-f8b90f63fa9ed154e759ea6e37e5585.npy +02958343-7cfd1dad90b79cadfe2e8ee5c450bb81.npy +04090263-206d5e32ece7b8878cb55268d473f123.npy +02691156-e8ed294534ba18df4a29fef5d2b2f3d7.npy +02933112-37fbc4e7c9e46b602b5631520b7d94fe.npy +03001627-1055f78d441d170c4f3443b22038d340.npy +04256520-4307657b2731fd392c37553db37ec752.npy +02808440-240302fe2eb2dafc322ed2ef5fc90e25.npy +03001627-70be8ecf5200fddd818fffcf4a59bbc9.npy +03001627-f68c32ea1e6cecd3c48d90eef8384210.npy +04401088-5891622298f30916f31b75c4a94a8879.npy +04379243-b08310a1d75702eda09ce9c1262c7237.npy +03001627-106e9487a1d47ff1a09cb462b3e723e2.npy +03948459-6f8956455813727c3e93a3c4fff5237.npy +04256520-3a3f425190044bdb2efb565c08a63897.npy +04379243-2e007165e4f48ee3cd4a89b0fee32930.npy +03642806-cb1e3a990782678b4b6682da890df381.npy +03001627-791c14d53bd565f56ba14bfd91a75020.npy +03636649-39acb6226133f9e0e4c9b82a33ca42e6.npy +03211117-4dfbb9a4ee89b5b29382b62c9161999f.npy +03325088-484b0d59f6954a8854d7082b34825ef0.npy +03636649-5116452b7826dfd92548598e855f0844.npy +04256520-24cbeedf72674d1eb615f5e15a637115.npy +04379243-1e3dc37e2cc335441326da246d3ca9c5.npy +02933112-6ee01e861f10b1f044175b4dddf5be08.npy +03636649-ede739cf0fdf5af9d49b2e04785f8492.npy +04379243-2ee72f0fa8848523f1d2a696b973c343.npy +03211117-42a81c2a4a261f1e1bb088904f7cb154.npy +02958343-8053e014516531ddc3f500d7b182f6.npy +04256520-9b1a7c1df1ecc3c0cabc196a7f35f1aa.npy +03001627-ed7ed25d40b3c16b37bf42a4ca375618.npy +03636649-f91b13fe06141138fcb8d8c6d4df8143.npy +02924116-188ec01e6dd6b60ddfe356ac4b10fe3d.npy +02691156-b788ca6fc544c0aff3f3e17ace8695b.npy +03790512-7fcee59a33976221a88e8cb97b773125.npy +02691156-fd6210721415e4bb51a9048f9848535d.npy +03001627-33fa27b08aee4432e8f8c11a24c52ebb.npy +04379243-fe4c20766801dc98bc2e5d5fd57660fe.npy +03636649-5f24434ac22353708749901456352d5.npy +02691156-ccdec989c4ca289d9a6e43b878d5b335.npy +02924116-2f3d0b1432f014caacf9e4b0d73d2434.npy +04256520-9c3b2d053adaca577b50cd55c08e6bb6.npy +03636649-daaca6107846a666a8737fcf23389014.npy +02958343-b0801e9d8e004e7758dbdf2b5c6acfca.npy +04379243-ad61a5bc7cba29b88cc413950b617e8f.npy +04379243-42f22cf6e29876a9c19a59cdcb309b91.npy +03325088-416dd83d7a18d2543321831d2245cf06.npy +04379243-7c3507fc4eeb9854febad4f49b26ec52.npy +03790512-1d8fb258aac4175a5834749a5ef37100.npy +03691459-a9957cf39fdd61fc612f7163ca95602.npy +04090263-d7806192d775465cf26216cc0b9f4269.npy +04379243-180dd8913e894dbf5c6a44a505804654.npy +02691156-c6009ba1bf947303ca8607f540cc62ba.npy +03636649-b2e4c14ea09658e3d0e9f1d4665fda29.npy +03046257-ba3121c7429ff19b83cd0ac541913e0f.npy +04379243-e36dc839d70d3bb927445c0c7cf3becc.npy +03325088-1396874a375c365e3eef3cf37d74e423.npy +03636649-34e4bfd2000916c6a5f9d52c12457194.npy +04379243-2145b7d411f1cf91bc4e0550f830290.npy +04379243-a18a9e2ea68eeacd36b0f2a1430e993a.npy +02871439-701d5ef8d155c3c7eb6d6d4fb283476.npy +02691156-52a1b6e8177805cf53a728ba6e36dfae.npy +04256520-9508699d8e6112cbc6b21d0fcb810056.npy +03001627-d810a38ebae55007eaeab1f0c9120b7.npy +02992529-d565df5aa65604c86b69fa5331093439.npy +02691156-c2f43dd2c483e0d86b7bd17e458d0dcb.npy +04401088-9644fb6a1520af7fa90f3ad3635b46d5.npy +04379243-799a262e7eeacf2a593ebeeedbff73b.npy +02958343-e46d79a5d356436f23a5d95daeb50835.npy +03636649-38eedb7c36b785fda81f841e85c630d5.npy +04090263-804342eecbe40a4c79f92df566f8c6b.npy +04530566-3899f8b55ec9f1db8a1ec28cb7d97871.npy +02691156-c8b848f32a850b15e816c75152573ee0.npy +03691459-ba85d89312054ee95793a80f4f864500.npy +02958343-b7707e9f69d6c0ec6c23793d085f1519.npy +02958343-e90a136270c03eebaaafd94b9f216ef6.npy +04330267-dfcc7689382e0f91adf06fa21339d492.npy +03691459-95b29837dd0209a413e18f148987464c.npy +04379243-9e6d6817c0a0a022fdb7f86985d6e5ad.npy +03001627-2a445cdc8cac449271c43550cfb383a8.npy +03636649-6b29d8827f1705b0eef5d83b671bb264.npy +03593526-eaaa14d9fab71afa5b903ba10d2ec446.npy +03991062-48c94c6283fa5566a4136492f17b9a59.npy +04090263-dcf13ca83d9580bd44c069e8827241aa.npy +02691156-14762404f34eb050bf7a28999a707afd.npy +02958343-fd5a6dd153a455bdb112e5ac235c21b7.npy +03636649-c5da06189b219effcb8d8c6d4df8143.npy +03691459-b987e53822ad2809c7e1c32ca6dfa00d.npy +03948459-ac8ecc77946b9578f342a9bc61de5ab2.npy +04379243-b1333bac9640db456e5061f0592f234c.npy +03001627-59155eb9123a9aa330bbd4cddd04c77b.npy +04004475-4dd4acc48cf804d39b5ce3f3ee534f14.npy +02691156-347d86d7001cef01232236eecec447b.npy +04379243-392093300321b9e1eca22c501ad0a77a.npy +03928116-7a7f23b15bad26326753813b2a3a4093.npy +04090263-c57d7e81270598096314c3b6a3a65519.npy +04379243-1aebb6c07b8d53737062f2d72cde5c95.npy +02933112-21eb0039185dd955c59350d819542ec7.npy +02691156-cc7a48498e745baef828c8b5be2ff54.npy +04379243-ab7b0db92f96381f8cbb8bac2032149c.npy +02958343-6cd11fccae408795a99406d7384c870d.npy +03001627-6344b2a2fce93cc3d2f33aaf794b5932.npy +03636649-5eda619e5f36499fc1537287b5c50d9d.npy +04379243-ea37d7670bf3294e60a3b49d78923dc3.npy +04401088-aae6554b1abe736c70ed77f7659cc6f.npy +03636649-369555d5aca3e7e65a31d91ec836a511.npy +02828884-38c4c2ddbdb502e162701a18243b45d3.npy +04379243-a3f369c885720efc459b850e737e0048.npy +04379243-4381d6508786fbdbc694ced1c311421b.npy +03467517-ae0b98bc6313c33940535e68d82b97bc.npy +02691156-3fe365251b54087af0478431b5ad57db.npy +03991062-5b56ec15c6b412115aa9d06b3815555a.npy +04530566-a554a62acf40e578cba07fb2573fff75.npy +04256520-ff2a456b438b0f2ba494798fa117187b.npy +04379243-8b077b3be444a1338aa76d17cc411fb3.npy +04090263-bc3dcabc80b38ab6ba3efb88a329778b.npy +02958343-9702eb7f07f013532764cfba57a5de73.npy +02958343-8bbbfdbec9251733ace5721ccacba16.npy +03001627-b54d0fbc33d125bb7a6d149f6c9151a9.npy +03636649-abf04f17d2c84a160e37b3f76995f8b.npy +03046257-cd074c458e0aec2a4b3c42e318f3affc.npy +03001627-5107542cfbf142f36209799e55a657c.npy +03261776-49b17a26edadad7f46619c79b20f2c6e.npy +03001627-903a14845425ca3176e30bf48cd56fcd.npy +03636649-20d36ce3148091c5764b5e62529f6d7e.npy +02958343-d04fd72c36fbc71731d383b4a9dce77c.npy +02958343-64ea044763ab4d742a9eb0f146e94477.npy +02933112-6c7a2ca9ef6cf7a3ef4e42d70375aed8.npy +02691156-e18b6350437cfe0d727249e8d9a90100.npy +04004475-a6d9da1c37aab01129f8bad8fa208851.npy +04530566-6ea8d00d7359f08f9e4614310319ea50.npy +02828884-beb4feca82b0082efd60059ad8523f1a.npy +03991062-8f45584aabfb17e9ffb8dd272bf2a810.npy +04379243-dfafa039da1cf318a42557fe008dfc94.npy +04379243-8e3303cae6cc104bad4f8ccb153c24e.npy +02876657-a02a1255256fbe01c9292f26f73f6538.npy +03325088-a0642a6b2849d4f5b362845c6edb57fc.npy +04090263-2f4209998288a4634d0af51460733e47.npy +04090263-604d927e4954713fd735fa1ab17311ec.npy +02691156-1a963a929d9b1332290d63dca780cfb6.npy +04379243-a379cb01e0a98298607974568e26586f.npy +02924116-aaf17fbae6721ff4839e2313a3cf4083.npy +04256520-4e664dae1bafe49f19fb4103277a6b93.npy +04379243-a713c7f070c4fda022abf78951dd8624.npy +02958343-d0aa115eb63f6f0c97df6383472cc5b6.npy +04256520-f5960ae57bf84fe77b79156a61ad4c01.npy +02958343-6b642c1c62ae5b49247a5be450795511.npy +04090263-36d72181bce0939c49f0e3dd7767881.npy +02691156-89a6af782a025acc62b600da24e0965.npy +03001627-cbc47018135fc1b1462977c6d3c24550.npy +02992529-49081a0c0cd4ad32166f3c6af52a7c59.npy +02958343-8141677722f680076a2345809e2bb169.npy +03001627-730a4d879380fc78990561fc34164364.npy +04468005-8ce6b54c47bb1b1671547adc319f74f8.npy +02691156-6bfb3e84a0fe44c1bc6e7c82ab33ecb.npy +03467517-97e8ee1b6df404bd57700c05b1862d8.npy +04379243-8bfdaf14a1b271954be714694b176f45.npy +03636649-aa734f5c5dab1e672d26f74bb535ca48.npy +02691156-12c66a0490b223be595dc3191c718398.npy +03636649-15e38eb29fb84898e7e684d25d4dcaf0.npy +02958343-b2b22a1454f2c88bf63ee8a34069b7c5.npy +04530566-a56c3a66dbe0ddf4a70cfb3232f40c6.npy +03991062-eff3b8277a2f1fb9d4d8765e3910f617.npy +04530566-7cc3c41e998caed8a70cfb3232f40c6.npy +04004475-586a0979ea3792f1c17df6b0271bf00d.npy +02933112-6c2762c2c95d7a2063b3c67777442463.npy +02691156-89b6f678789287a3d3128304aa2279ec.npy +02691156-c1d8614b0e5e3f3bf5a498db2fc1d347.npy +02828884-45dc4d46a456d36c2056b4bd5d870b47.npy +04090263-97532871e6ae97d8f0e1c0df18936d05.npy +02992529-ae942af3b88d07af2c557fc696108818.npy +03001627-d9902456104543c898d5fc0473d00a1c.npy +03207941-dfdf181c7c4b9a0a525c8adfc0dedbf6.npy +02958343-2307ced410b955a8cf1e58caa15acb49.npy +03642806-8e38d4d1f849f024296462783ef76d22.npy +04256520-fce58f4938a670db91c74eb018d3bfd5.npy +04379243-2ba4638aa672a0c419fb4103277a6b93.npy +04256520-899389d5ac054e7f33a851a05440ba33.npy +02691156-121b5c1c81aa77906b153e6e0582b3ac.npy +02773838-756066117169dbc96c1d5082d1bdea19.npy +03636649-ef40f27470d99d6fcb8d8c6d4df8143.npy +02818832-57764cebd92102552ea98d69e91ba870.npy +04379243-460bc82ba3a41a4f492489969eb2d929.npy +04090263-5835fd744208d5c9e6f7dedb7e5f584.npy +02828884-4f4416c9c53cee10b3a46b931571f116.npy +04379243-3a3f32deb30dc4e32ea98d69e91ba870.npy +02691156-9e06044df59e7f9f953041d9e16fa262.npy +02691156-56616237ed5168f3a18e0889038e4fb6.npy +04468005-e9dd4e42bc49b8c230a8c472227cd05e.npy +03642806-bb6af0aea6bd2381b0d7b0d4230df8ca.npy +03513137-a1bf8b293de641b5a5cc2b36a8952e0d.npy +02924116-a78fa491148db09526479a182158bae5.npy +04256520-33384d4600a8bd0ad88a7002dfb37846.npy +04379243-9b32bae53b91a01f278d386bfa54545.npy +02933112-a8cf3a04f848ff0e4c62bee40dcdc539.npy +02818832-d59ed3ebe65d978a922962743a259201.npy +04379243-eb34935c60281450d42b9650f19dd425.npy +03046257-56a3239391f73773a5e3e028709e0474.npy +03325088-81ca48ee431c29d472101dcac4ed75d3.npy +03636649-9b786274df42d55b774476b2e205b9b7.npy +03513137-96e81d71a15ecb1dd3f1ead878957615.npy +04004475-1f2a2824554a679abe4baaeae0897839.npy +02992529-7731182b7b8702bb357be8fc4a9ec12a.npy +02691156-b2b3fc16b9a676f5950bd071d87a18b3.npy +02808440-44bccd348dbbc2d6b448b8aaebb705c.npy +04090263-c12e1342d88e78bfdb132fbd93e54108.npy +02933112-278d1992a0aa9116ce8f46fabe978829.npy +03467517-33f932665104970740a420d466980e34.npy +02747177-cf09264eb6d80455526c1122178737e6.npy +04554684-270df61e08a104c4c2180858eb6a5f28.npy +03211117-dc73dee56c43fe018047f0f85f295702.npy +03001627-1e6f06d182094d4ffebad4f49b26ec52.npy +03001627-eab716562b582538f2599a47b2a7e92a.npy +04379243-798c315f86d8f02f931e98da3a93e73e.npy +02958343-c59e3f28f42e6ca3186fee06ae26176f.npy +02958343-f120085da70b2913627279ad10ae805a.npy +04256520-f094521e8579917eea65c47b660136e7.npy +02992529-5bc22a940bd88a21886d9e4484b773bf.npy +03636649-6e46cdd2f97cd28ad98bf80379cd1d6.npy +03085013-4c0d7cf86419a997d528a236ffa583af.npy +02691156-e9f39176973edd33a8cba409c4409ba9.npy +03001627-4e222d6b128a7af7b8fa4cb65e077db1.npy +02958343-171c20ce4de5ee8730f65ce13e7c1910.npy +02958343-355e7a7bde7d43c1ace5721ccacba16.npy +04379243-b3ca1f79cfb6b29cfc25405fbf8f85f4.npy +04379243-c47d1d0aae5de919f2bf00ef0d8c7aac.npy +03467517-66a6838a0887a85fd2f0cc036969ee4f.npy +04379243-585f8cdd992f541d23500a5b036df62e.npy +04379243-bbb7ad20cbe09b9b2ae0028d477b835f.npy +04090263-6e10893742a5add1139336f03eb955d2.npy +03001627-9a54daea9071a536bf80985a99195eb8.npy +04379243-bc8e050a6c0e49afea5682a3b818969a.npy +02808440-225742b31d7e28a97c35d3c5d3b1fcf7.npy +04256520-a05d53587e59b2ead6784d11c8f5b5.npy +03001627-eb3029393f6e60713ae92e362c52d19d.npy +04530566-ee3d521376d89f408c954439655c356e.npy +03001627-60512d74c623484bf27383fc5a5a711c.npy +03636649-e2209dc7b188f4a061f2222dd11ba79b.npy +04379243-649eda5783cc47e7948cb8e1d9ee487.npy +04090263-6a5c090b753cde05b5c25a656ff55929.npy +03001627-32408a694ac56775ce62834dbceac22f.npy +04379243-b9009a7b33df161ba022b82859ebabcb.npy +03948459-7ba9f65e926d5e3e6fe695987d47043.npy +03593526-d4b9e1085ebd4f226bc258c0f0234be0.npy +02828884-5aa9a03af76807fa94f937d854219137.npy +03928116-4a28d4c85e55a252a876e1c6fd98a946.npy +03467517-5621a833a3b1609145692e007d878b1d.npy +04379243-31e3a6b2e0b40045cb2a965e75be701c.npy +04379243-79b1e6c1e72490c98ca0fe30c6caf3f4.npy +04379243-e14f505926399396b5997278ed74fcb5.npy +02958343-80642f8965edbc51ba01f2d8d5d9ff0.npy +02958343-614d683fa574cd817fea5423f91210c9.npy +02958343-bcf4d748b5f3f13dafe1d4530f4c6e24.npy +04530566-52176ee07927984ab13f6ba928a796f.npy +04379243-505a99351f70664238b87428c6845ef9.npy +04530566-29f385987ef4594ff6b98f041a0ed52.npy +02691156-45574293b59c62ff301fa0a0663ee996.npy +02958343-fab45f900797908bbda733a39f84326d.npy +02808440-7072816b1da8ca1b1c17aef130ed6213.npy +04256520-b5c61f497f9354d535c2f4da17c09efa.npy +04256520-4e05ca172c988b72dc1f6c4cdb4bb9b3.npy +03001627-9a711bb7070ae88de948e3d64826c640.npy +04090263-1c96532b385e22edd0a6af9bfb470a20.npy +02958343-9e44269655ec3df9afe1d4530f4c6e24.npy +03513137-b3049575684f6ebfc0e57505cc92501b.npy +02691156-63a2144cfae402149b30aa09067b7eef.npy +04379243-2a88b6cbfe4b9a3ce2dee6f9fbe318ea.npy +04530566-ff2b8253ca3190d5d65fb76f5f0a1db7.npy +03691459-2a77ba363947f4f38a9641b35ef045a.npy +02933112-12f1e4964078850cc7113d9e058b9db7.npy +03001627-ccea874d869ff9a579368d1198f406e7.npy +03928116-3a8539e63cffccf65420ad944870069c.npy +03593526-e1835d106d89c69ef1f3019850abf317.npy +04099429-95fd683ddc8298d0b5a019b4fce31328.npy +03593526-661f1f07ee3cf13a77d7528e1646c585.npy +04379243-6a94aa414d11c624552edbe2a62e882b.npy +02871439-32131c4f13c51192bbb25886240eea46.npy +04090263-49ff48905ac9d95e585eba7ae331fc47.npy +04256520-43131890e972bb1febad4f49b26ec52.npy +04379243-fdf1cbe0d8aeba868c1cf3f7d7f0373.npy +04379243-e50bed5236712874ed258f1e4fbd53d.npy +02691156-3390c5050cda83c09a6e43b878d5b335.npy +03001627-2882587cd2fc021c168776226d349d71.npy +03691459-4c18da768d4c81c787695b38431695f3.npy +02828884-ab891fba7aa43f9df155d75bbf62b80.npy +03001627-2853ec74532f23f3670cf6c75c1c5868.npy +03325088-449ca62078205918d79b16e52324b152.npy +03211117-7422a1f42ebb1a1bea9ea4147227b8a3.npy +02876657-ee007f1aac12fbe549a44197486ae284.npy +02992529-84f07a9773374b062da40fdb29d70537.npy +02958343-db8eb94d24f5d8a2350dd0b332d84c76.npy +04379243-8915112d9819c83633b2a5760b4dd1f.npy +02958343-65ccd33df41999496d6573f48a06281.npy +04379243-599dfdedd707f7c8ef38727c2b4dc2e6.npy +03211117-a47aaca6619252acc4f499be00229a55.npy +04379243-d9ce0b512e0420f8be95ff480950e9ef.npy +02933112-8f30bc2f3ae12300a4669f677ccd56a9.npy +03948459-224947e496219e1da39dc4a567ce225f.npy +03001627-eea9a17689ef174ec14f867747674e73.npy +04379243-661b8e9d5a93e2a4b4c161851ed2b4e4.npy +03797390-3093367916fb5216823323ed0e090a6f.npy +04379243-9a5cb4122d518111b339f790b1757e92.npy +04256520-8e6312c23b6ac12f956c23e7ddc28c00.npy +04256520-8b066cf28fc1319da11411fb873de302.npy +04379243-438b2dcdbd25a93dea65c47b660136e7.npy +03691459-add914368a6ca448732bda87f2718525.npy +02747177-f095cf11c6049709d395fa91e75a7dc7.npy +02958343-9cabc9b21a7c5fcab02964031d37f87.npy +03636649-58b269eba3c6d09b57f40ff86fe708ff.npy +02828884-d5fd97ad2620480c62cdb4b7b7821421.npy +03337140-bbc516fd63703eee9dfa717f86ba8028.npy +04090263-aa235b7d9006c30de98e3214935cca1.npy +02808440-9de93ed7919c499854d7082b34825ef0.npy +04090263-144f38700549b35b31f639996cb3d35d.npy +03001627-27680e1b7951526518694a7306254063.npy +04090263-5e3e2c6779b3bbcf5e22590d7220b895.npy +03001627-ff49ca82d7f8e2bef27383fc5a5a711c.npy +02933112-40209ed0c2a718bd82ef94da039e491f.npy +03001627-37607ea19e352af4fffc97a61124b1a9.npy +03046257-f035ac6992723f9ff546596ce7364503.npy +02924116-b0604333bb40f58136c3fba5bd012bf2.npy +04379243-75e59e4626875167b2f7093e7efce142.npy +04090263-21acb1cc84ab5e5040aa5b072f9ee3d1.npy +02876657-77ad88568cb55237e01d7dc978602402.npy +03636649-e959384247c0dfbe1e18a354bfd56290.npy +04256520-de4d86efa8bdc67684ad2abb799c0f8d.npy +04379243-2fde3d8a04798c325b937c87a8810c08.npy +04460130-90e931890719c1b43d36e0a1be1c720.npy +04256520-53319f95d4bb6a0beaf288f952624966.npy +02691156-e712867dc4c1a4a6d016d0153a25a372.npy +04530566-d25d9a2bf4820003f3e39f2e17005efc.npy +04379243-73fc0f27cd57942ea2edf7a1fa4be45a.npy +03001627-e71ad853f50ea7872acd2bb6205825cb.npy +03593526-eb344ece6d6669fe68dd306b8ea5e1c2.npy +04090263-c61fd3dd6eee6465ccaf38f4d3340ec.npy +02691156-45570756a871989cfb5c1b0f759e2bc1.npy +02924116-b8f32af73acc268939f4ce9a2c9fb9f4.npy +02958343-cfd7228f455912dd9618aa9e2febbf80.npy +04256520-614ee0988dd6661d9559145fbf4877c0.npy +02843684-fa74d414933cb06d8c1dd15b51930812.npy +04379243-c4e7fef0548b8d87247b7570b0fbe63d.npy +02958343-425431f166ea35bdbfed25440ee4185e.npy +02828884-c9ca9b7317ac41b82168e5dee0d7f21.npy +04379243-48c2e34854c9aab889b74a90878aa3cb.npy +03467517-a2610d25db838d92538d7c152e19632d.npy +02958343-93c647af0338e9f35a06092d926a13ca.npy +02992529-16d7d7be19cde848dbe1e810cdc7471d.npy +04379243-3f1b826134c88f5fa0a2f1a46df5a003.npy +04468005-1461a40ebd86a9173c38a6d7dd5303d7.npy +03797390-b9be7cfe653740eb7633a2dd89cec754.npy +03001627-b3ced617a2923f674c9740802f05a1f4.npy +02691156-e33fbcf5b616d6f9f44f89e40af48618.npy +04379243-e4f9062ec3d2c6247d7b76078f434820.npy +03325088-bf1a08ed8d7a09833321831d2245cf06.npy +03593526-912c3e1cf2ef3b9ea7d0cc9b15400f65.npy +04379243-eb31e5efeb810c5280d6227ff9b21190.npy +03325088-bb2c9b746e450ae514b35a7d7cea7130.npy +02958343-fa997987367ed84ef15cbb7bb6511cb8.npy +03636649-d1ec5f73a0d3d6e4f3ff0017952fe4bc.npy +04401088-56a32f9e4785d3928a4adbc089030705.npy +03636649-b45b8df0557da6acc14d5c159bab8297.npy +02747177-f116f3c432856fccddd8899c86e55073.npy +03001627-bcadc00cd1bdc19494db33559ec0df30.npy +04379243-a3d155f1ab4731a515dd7d7985e749c1.npy +03001627-bf236db6dfa517aa456cbf78e1e89022.npy +04090263-3564b539a24a1b721a638d3d0d97d12c.npy +02828884-cf4075a6207a77fad5067eac75a07f7.npy +02691156-ff569b4018fc2640cea77fac5d58428e.npy +03636649-a049ad0f20953a144cc30865d6337b9c.npy +02924116-cfff3b5dd35f0b7d174bff1ac228f365.npy +04401088-b854fc846c1fc2ba619a006c72381476.npy +04090263-1d285f3bc7767bc8b4cdad9a5bf52dd5.npy +03001627-7bb5321d1e63d8bb36b0f2a1430e993a.npy +02828884-8596664f3d7925cdfdeb515ad63cf4b0.npy +04379243-670c2d3d20dded2bc5a208307819a3a1.npy +03593526-bacb6b671e5904d8274d4393e80e99fa.npy +03001627-446430548f6ac25ef25f6a97c97019cf.npy +03046257-921afad0f119509c4e09ebaf49b0cb2f.npy +04379243-a80c06903eca9eef7b05ef4148fe3aff.npy +02691156-939f3dcf67a1e1adbe13ce34aa7c0c1c.npy +03211117-b9cc669597085c028766390809048ebc.npy +04401088-ed53e90551ef9cb7118f00b061390b2.npy +03691459-b51a5f044c349741ebc9199df8e5ab6.npy +03636649-99f8c4a6b9ff1a2ab7f1f0dea571cede.npy +03691459-f9e6e10cdb3066929a3fe7e437a02206.npy +03001627-49aa713bec70ee1f1104b8f54582c707.npy +02808440-93e9520a999562f93af30a3946d92feb.npy +02958343-707d1e19b465d075adbfb30d8d1b297e.npy +04090263-1abeb8d7f5dcdaa4e06ed7bb63be5503.npy +04401088-9fac50c7b7c72dc694f8f49303e93f14.npy +04090263-5738a6de833d8da68d4ca42bc1bef451.npy +04379243-855f3c5541cfeffeef5609fd2064c33d.npy +03636649-a4c50a7adeb7d20b51014c684c004c28.npy +03001627-1e67e443849379fd6666a748bda83f67.npy +04401088-ce0ad218c6b19e76e7eb1b9b386befd.npy +02808440-ccafecd2880b61f754d7082b34825ef0.npy +03325088-fe9a455eb6d7867c3ca0c4be71e7b721.npy +04379243-f6f9626b892a529c2b642dfce4c7d8fc.npy +04256520-57183931e41c7aaa5ff61a3a2a0e2484.npy +04379243-4903be367953db8c579961b8f4afc151.npy +03211117-a9a2ec15d1223290916cd984b3abbf4d.npy +04004475-6f754dd4251d2bfdd4713685ae50fa13.npy +02801938-e3ef8c272a15fe83a0a1ab077d2d8b1e.npy +03001627-17f9eb6c0d818d45d7b20fded0142d7a.npy +04530566-47130fa6563a4712af6320700e3cf173.npy +03636649-c561496324b6d8154c5b22ae639d5204.npy +04379243-9bf704d5e2474cba3a6b5b5b9b35aa8d.npy +04379243-509d9d137fd7465a85c5f690e9252fc5.npy +04256520-ccbccd9a5bfd52cbd29d1a0303294bae.npy +03636649-8b85d01ba70a09e9a5f600ed2cf472ac.npy +04379243-46eb174e4df0f2e53719086e0b4ab8be.npy +04379243-a4990b3c86c680c3a71c812e027f94d9.npy +04090263-19fb748dbb9a97d3bc6e84bc30e573cd.npy +02691156-721eab5632f60887e72b7fd373921885.npy +04530566-12159b68a31a4a7eacb3e49e16caebeb.npy +04379243-1dbb8fd083f96ad279b3e1be3524f72f.npy +02828884-a12abb06ee3aa30ae074517a246f1e65.npy +04256520-73bb6025df29d208ae17f74ec30c4d4.npy +03211117-75336682aa3e245f80ecbe6250826360.npy +04379243-7249c3e41c4807c0f7e0e05bae6131.npy +04256520-a86bf379ca2ba8d8f2d5a0d235580548.npy +03691459-5b83ccf84149f28882613fcb45c2087e.npy +04256520-44d55ed577b77106599dcc439b161a52.npy +04379243-eabe7e2ee9547616214a15a5a42c49c0.npy +03211117-ace79948f769c652fdccfdbeccce2c03.npy +02992529-96b1d230e88cba16f71555c6480aef72.npy +02958343-98aa3b11abac3d73b7e1a37f8df80928.npy +04256520-3d5084d5e7654bd11cd6319703a6cb25.npy +03624134-d243969f5010c6c29b5844aa8fc56c71.npy +04256520-15fad17654ddfd3c33defcb28e53dee4.npy +04401088-49db0f97d215a109a2db3e68315c7819.npy +02933112-9ffc432bb61dff9f339797c21e8801b1.npy +04256520-625ffe6a78f1697d87ea4c09ea2202b1.npy +04468005-d433ceb5bb3eece98c8b260b832217ab.npy +03642806-69850d70fcaf5a464161e123a102b12b.npy +03691459-c725f6e275e9942f989542bab68e6843.npy +03001627-67d9afec46e20fd279c4b4a860b67e81.npy +04256520-192afbc1f0977f74861e0db9bb7afc48.npy +04379243-bc38dd123d9d50ad8b17d6d1965c2fb6.npy +04379243-92cae8ac60b09e3c6cfd6748e1399a49.npy +03001627-33ec1e64a02ff718faaadcdc0221eb72.npy +02924116-ef798c5d0e531dc53a56022c831f34f6.npy +02691156-918b46dfb239ee044a8d8b0dca1fd34.npy +02691156-a374b0448461438ef3d4cc10d9776c62.npy +02747177-aa547280eb99fd3fc8a06b09a9a18b3d.npy +02958343-bb9109ffb1789e98e55e3289e5df0916.npy +04379243-b7f733e648c850abdd91f8f6f381b291.npy +03691459-209086558286d4621ad88f716ea80910.npy +02691156-ff6f81eba664481126360e1e29a956c7.npy +03337140-4d591f85405c6a458eaad608e74402f5.npy +04090263-b8ccd8d1b693e4fb11f7dcbb4a32aee5.npy +04256520-7b1d07d932ca5890f51f77a6d7299806.npy +04256520-e471ff9cacad70d391fa1c643766450d.npy +04379243-7368b47a95e0db8886cc6209ffc37d3a.npy +02958343-405cb7dcad3d6f2f65af93d4326737fe.npy +04256520-51ccdee7080b11dde21111e385a0661f.npy +02958343-ef05b5fa8e2377f8fa7a46166f316347.npy +03948459-6663978acbe7f2b5336eda14178e5ec4.npy +04090263-16c510cfb4186a46d44d717fb37058d9.npy +02958343-a242c0446b186585852e57cec5098e60.npy +02958343-928a5f0e95e7aae5780bcccc86c008c3.npy +04379243-14ed71cd9f154616bdfa5e0753fa3240.npy +03211117-6fa8694a2b5dd0b9db768007c05f817.npy +03001627-5e5d9a681b53ee0d3b8d5c0ebdd194c8.npy +04379243-cfa43d56d70e530160dc76a524f85955.npy +04379243-10ca7bfe736d81b64b3c42e318f3affc.npy +04379243-ad060b3914729efe2175f7e45480df72.npy +04379243-16532364b5876d3881a172d69c52a28a.npy +03001627-4519d91ba59f0267cc0484ea4f50062.npy +02691156-1e4bb798f236f0b17f1f82f6fc8747b8.npy +04090263-607a6770f3bd10a16b2c8bb96250e4a0.npy +02828884-3ef2e306aadb9f98dd1f70bbc27696f8.npy +04401088-975de17c0b5d96cda38e5bd2fdb10d11.npy +02958343-f7b61de5d6d919a8953536e7c905b301.npy +02958343-4244e025c4a5de67ad411f846a866947.npy +02691156-219fa6821c9240e42476c2e017302af2.npy +04090263-21f013795d1b241d525cc89e716770ad.npy +03691459-21612bf3e866a8831d6b14cb827cdf85.npy +03636649-f39cc29063a308168466f606a3db18ba.npy +04379243-fa345f8f107d93b9ba70f71694a4b74c.npy +03691459-5b7cebe280c5aee935cd53a06b1d2317.npy +03624134-7725d5d2067f8fc0dd9394cb5004b836.npy +02958343-26c2c91d8eb660ecbeaa545f7f633287.npy +02876657-74690ddde9c0182696c2e7960a15c619.npy +04256520-7525a8d905a7aef4b3c42e318f3affc.npy +04379243-5919dea71f3bcb071d54ab02e78bef2.npy +04401088-ab621af8d265667a396287d16057dbdd.npy +02828884-410c1c5ae4e9d49f5ebcc146be902492.npy +04090263-62f99c3f2e7d133131e1c03c914d6f10.npy +04256520-14aa542942c9ef1264dd558a50c0650d.npy +02958343-72d4244540e81c671d9826a79afd9186.npy +04379243-81d84727a6da7ea7bb8dc0cd2a40a9a4.npy +02747177-3562096fbba555eaad5067eac75a07f7.npy +04256520-e5dee68606d47d3aca9b40e76e725878.npy +02828884-a2c53b2490e4151517a6e523c9595e10.npy +04330267-ef97ff5c1d6a00f2a760e402290727de.npy +04379243-8a45e9dd681d40d4789ee5c8d247b09.npy +02691156-ae8a5344a37b2649eda3a29d4e1368cb.npy +04379243-68b2ed56ad8d4e1896b84415a3f1393b.npy +02691156-f5403d3ffcc6bb17adce4f2283adbdbd.npy +03001627-6131ecb5a6fc9329f51f77a6d7299806.npy +02828884-5ab786ce3a18e3a170387839208c8db.npy +03001627-b69401b412d9300454d7082b34825ef0.npy +03001627-c6786aeee29edd1b2bca88fbd368f59a.npy +02808440-176b7a226dbede9ba9fe1734a6086750.npy +02691156-4fb69651d04e010554eefcdc602d4520.npy +02958343-755717e2f9edd1e36782fc9cb2c37844.npy +04256520-2dd491294a34ed7eff98db9ea1554f19.npy +02958343-7478183ebde9c6c2afe717997470b28d.npy +03636649-dccb4da9805924c23466f97f37dccbde.npy +02876657-5561fe6ad83a5000fc0eb7bdb358f874.npy +03948459-5f487e398bc0551c276c3d558130f8b4.npy +04379243-64f73518c32b8b7af49a23658fe5597c.npy +02958343-373cf6c8f79376482d7d789814cae761.npy +02924116-7c3411d4bcd34e6de841ebdde48e3937.npy +02691156-fddcb2b3d45ce98e641c309f1fd7e183.npy +04090263-a12b0328e2b9eb17f084db89eb9085ce.npy +02958343-9d5c0108ce2c848e977b27045b1d8055.npy +03001627-39d357d7ba9645d4647d4fd8d921152a.npy +02691156-37fbd275a734ec1b66cf1b4a8fc3914e.npy +04090263-84ab70232093057c12b38b1d99376c0b.npy +02691156-e7c6e2f7c5fd372e8e9091d822257500.npy +04379243-639d99161524c7dd54e6ead821103617.npy +02946921-100c5aee62f1c9b9f54f8416555967.npy +03467517-ef8874b3d10303c793f0194265a9746c.npy +02691156-3cbc83ba49edeccebc0909d98a1ff2b4.npy +03636649-d748241313e5664696a3517f50eeb9f4.npy +03001627-5d72fa9aea5383384a73e364671ba824.npy +03001627-898dc475a4f36d0d35836c728d324152.npy +02958343-323c9dc2a8911e146f2f07de403e98d8.npy +02958343-ee5e6649db524dc2eb22840c40c3154b.npy +03325088-7d1c4b0c119adf6914b35a7d7cea7130.npy +03211117-ff9a428991106434b9e65df431a37c1.npy +03790512-68e8c73ec51aeaaeab548456bc75847f.npy +04530566-77331918e10b8eacd07153997ca82b26.npy +02933112-54d9053622deb8866ffe0f6a1d92eb85.npy +03467517-2a0a47930aa7ac1163e148e250c0340d.npy +03046257-fb0fd780eb40e7151b02cde7e81f0fc3.npy +04225987-1c8d5e05c3faa05861be5ced44bc18ac.npy +03337140-bc07b1d9c50dac514c3aee8e9d3a6ffa.npy +04330267-a7414667b8274cecebe9a187b97c9295.npy +02958343-ba7a583467ff8aee8cfac9da0ff28f62.npy +03001627-38dd3fee84698e5242ecda58458cd17.npy +02691156-262795bc8a994b11ba0d990ae229b477.npy +03325088-2c80e8261b08d3e76c18e71fd49c4dc.npy +03211117-44d14268d1e961e02f653d2c3f9c5e62.npy +02691156-62fa636e217a3db25a70c4e5328e0b9f.npy +03636649-1a9c1cbf1ca9ca24274623f5a5d0bcdc.npy +03001627-bebd1aac01d747e82500a3366a96c301.npy +03691459-739f89b772ccf495b9451ae41e1d9ea4.npy +02958343-42eb287e220fd02c2e466666025c187.npy +04256520-a0a53f2f112055d496626c84a010ee5c.npy +03337140-53e41619c15465c14c3aee8e9d3a6ffa.npy +03691459-4678a534b01fd4d6a29efdf1e3212661.npy +03636649-437b5e12cf1b8771146f6ae9394828b0.npy +03001627-540aaf05d1ff41c0c90a83871023986a.npy +04468005-cfe064a6bbc9a33a64efb12b82a690dc.npy +04379243-1315d61d095210c05510d59f3ab1ed64.npy +02958343-79d684368c596b4613f9826aa0cb4736.npy +02691156-44dece8f8529374ee2199ec015f35ba2.npy +02871439-8db6a080f00b52e46b8fdc9bc8edc250.npy +04379243-726164afa497b154b075b4c36d25279a.npy +04090263-57bc575daa1a56109609aa6ba54014c1.npy +02828884-6b2caf6470d3dcb58ccde000e771fc1a.npy +04530566-c8f5e3891a7b0d1188d5590328ce0ddf.npy +03624134-150ad6a5c35beb17ee79d445a3ad4fd4.npy +03790512-1a2d2208f73d0531cec33e62192b66e5.npy +04379243-bd594555e192d5797d3a650ebc940efd.npy +03001627-798a46965d9e0edfcea003eff0268278.npy +02691156-db8ee29417ddae1bae6908c1ddfd8734.npy +02808440-eb00cc6ea32fdf6d3321831d2245cf06.npy +03642806-5678a2173ff575d09cebe817bc1591b3.npy +02828884-e329a9a5e7422b0a43638dabe1eb5336.npy +02958343-9af8945bd83ba89dfb115c90506f20e3.npy +04468005-55c595c848a8478da09163d0bb607639.npy +04256520-698a0a47dd9bba797ddb7abd4c043364.npy +04554684-d2711c36636e9b1eeacaf08e3ee3b2b3.npy +03636649-538dfee2a9b520962301d516d0cd4456.npy +04004475-c34ab9023b4d12b8b49ae6eb1612b7b9.npy +02958343-3d81e36e5252c8f0becf71e2e014ff6f.npy +02843684-4fdd9afdb1b0785c74b7a6c82ccb98ba.npy +03790512-30157c4a6c09f884c97a3fcdcfe70d5.npy +02691156-df68b8fb9f4531b42e690fa6dfd5d610.npy +02808440-61475bc1cf693943d6a6890cb66ada39.npy +03001627-7228564fe629f578e8f8c11a24c52ebb.npy +02880940-381db800b87b5ff88616812464c86290.npy +03991062-6f3e2c8b4647f488ce6b277e4d642b55.npy +04379243-9f3d0cb709260aa09ccce4c6d5bb195f.npy +04401088-434e23fb04effbb86bc30c6a9ae3d46e.npy +02946921-28c17225887339bd6193d9e76bb15876.npy +03467517-5294e1ae86ec43bf8b6c1eb99bbc3bf2.npy +03211117-f39b7f08d4ea066be57ac88f5432bb4e.npy +03991062-d74b9f970a2f4ff098910e50f05b8001.npy +03046257-3eb3ca1c532733841e085a650cc639f.npy +02992529-c410d13694b8ca1d15e144fc878b7afa.npy +04090263-f26068a05c107a8823c69c7ff0f71040.npy +04379243-884f15cfc6a3eea3dcfcef693e7ec696.npy +02801938-e57f5dcfc6c4185dc2a6a08aa01a9e9.npy +03001627-575eb48e4bf8f7b4cccc2bf504407f19.npy +02828884-b19e1c6ab766b09bcb2a965e75be701c.npy +04090263-575ccbbf4be84e3ff85b811e02bb4272.npy +02828884-3b8d16dc796f667af155d75bbf62b80.npy +03001627-8c2a3ae39c683fde3ae7d83fae2b798.npy +03790512-6d4ee0be5746095d7c088bd2a4124c69.npy +02958343-3db560d20e40c3b835ac1a825225d411.npy +02808440-b19ff5aaa6a6940b412deb0d2b0f3dcd.npy +03001627-f39d0db80cf41db9820bd717b66cebfc.npy +04256520-9c0ed8415a0a9e5c49b1e464b71de577.npy +03001627-82b42b0f3ba76484e4fa0af6f7c25e58.npy +04379243-21486e6d0bd896ad5cca18918d24f6cd.npy +03001627-bb0c057df2dff54fba4b91e89f6f35cb.npy +04379243-27d846b100a1be0535836c728d324152.npy +02747177-46fca3bdcd454402f155d75bbf62b80.npy +02924116-e3c1213d68656ffb065f1478754df44.npy +03211117-ea7dc70f0ef4b04bcbe0b8af4aec5d6c.npy +03001627-bc78f5fc9b614e357cee0fb3ce7bfbe.npy +04379243-768cb2332a16fd63855931d119219022.npy +04379243-3d8feac23ebc7b5dc6a19173dfae14a8.npy +02933112-353dd8c418146de16c7d1f675f2a04a5.npy +04256520-f43414acdca3878674c5bf7a74b1b6df.npy +04379243-ad5c26058efb026446b5ed2bbbe6c.npy +02691156-186ca7892ed6de2adb22b838c125a50b.npy +03001627-ed56af61297594bf1c4300651205adf3.npy +03046257-3c100b0dea7a60b768aab09a0ea50724.npy +03001627-9bda786a525b1ef93a11565e5be9cf53.npy +02691156-4710274bd87b099f19cd118ab9f114a4.npy +03001627-9214670b7c1e36bc1b1e2ecfb322ccbd.npy +02691156-5fc53108f6bf2f45893f875739da1b24.npy +04401088-e7ef78ddc23ab4edbad0eedd46c6260f.npy +03001627-c649c3e28d05e0877c65caaca24f3fa0.npy +04379243-8b835170d8123a1dcf004563556ddb36.npy +02691156-c00d38c09ac5e6b8405970680284869.npy +03001627-9ad2ee3a38a3d0ce3b32c8e0ac22ac44.npy +03991062-133dc38c1316d9515dc3653f8341633a.npy +02691156-fe23572aac36c84761cfaa00f7177470.npy +02880940-a042621b3378bc18a2c59a4d90e63212.npy +03001627-e26ac9cc4c44f8709531b4e1074af521.npy +04530566-99c19a1c05dea30454e3de9fd2bf8dea.npy +03046257-c526b6315e1600092a8827a91069be93.npy +03636649-ad7fedee24a70d82a5f600ed2cf472ac.npy +03948459-467ac647f0aee4453a4133add633b5c3.npy +03710193-51ad8559caed86a55b2b887334b359e7.npy +02933112-97902b0e2ce271ae60f16a92a4f24bcd.npy +02818832-7c8eb4ab1f2c8bfa2fb46fb8b9b1ac9f.npy +04256520-bf264dae9a5fd53dd39e33fed94f56ef.npy +02808440-fd34f47eb1b816139a625c8b524db46e.npy +04379243-5bce0f5c92198217aace21c72a80029c.npy +02691156-172ac13acd9aa91f3df325aac2f73830.npy +04379243-4502c9c63e7b0bda412dfc90452742c7.npy +04379243-933937b12b4313dbe7c58a5ade21d962.npy +04379243-18c25f8049fac943bb7ac4d22a68ec08.npy +03001627-953a6c4d742f1e44d1dcc55e36186e4e.npy +03001627-ccc772dd462e8d2da6fee8e2140acec9.npy +04379243-995b7cc4da9f0371eadc9f074ecd1df1.npy +04379243-afab57dbd3c7ef0e98d5fc0473d00a1c.npy +03691459-94944fbeaf37861c61ffb06b88ae391a.npy +04256520-371b7d7d2f2d334c574754e046bb9a7d.npy +03691459-93e9c3de55b1a662989c6c7df583f91e.npy +04256520-8880686b417a054fa1e36ad603c7b9c2.npy +03691459-736820a85063a4371e5b68ee10358ea3.npy +02924116-beaa2d7bb79d11758b89799e9a2e578c.npy +02933112-65dcdb468234c4f64e2e1b2af0cc59a7.npy +02801938-7a0a4269578ee741adba2821eac2f4fa.npy +03001627-bbf45d2d189dcd758e5f5b49c9f5b3f2.npy +03691459-ec1b85abce89d680a7bc6032416bc8ae.npy +04379243-69604fc24b7976d69ccce4c6d5bb195f.npy +02958343-df72f352c7fedcfad9951d9ecda74409.npy +02747177-9887c4dfab0816a0febaf541a3d4b03e.npy +04256520-c57bac39e7c4e151c8a0fe52b1df3602.npy +04379243-3b9f12fa1f257b9d85fcc38efca7d59c.npy +04401088-ab3ebae8a44e1ae8ca47cd18decbac61.npy +03001627-312df229ef2675c4492d9da2668ec34c.npy +04379243-ba03fd0b4b54655df51f77a6d7299806.npy +02691156-7ba9eb4e8405371ca8607f540cc62ba.npy +04379243-d21ad1e0d76175e3486040c0d9e85846.npy +02924116-f6f71cf39d30d421269ee466c7a9d8b0.npy +03928116-dfc9e0e55de5b717c4fc722cf32cf40.npy +03593526-5e421da99a879732d8564c06b061019.npy +04379243-1d8278324bf01d50c45662a6a951b979.npy +03001627-44c5b57d406c663403f064eb1ac2f31.npy +03001627-1e68489b0dc2bfc3327289c00b6dc9ca.npy +04256520-6d0cd48b18471a8bf1444eeb21e761c6.npy +03001627-6986aa6ac96abebc71a782a4379556c7.npy +02691156-22acc443fd007fce6e80138ae17d7d07.npy +04090263-785ec43cb6f1a534e1f2a1daf140ac9f.npy +04256520-626104245de40df863860d683ccd0da.npy +03211117-9b7cab4099b2d1dcab29d5c9003deef.npy +03046257-1ce45a951007b5948ead471f0d2cadc0.npy +02871439-67f5342ca73bcb5a664b3b9b23ddfcbc.npy +04379243-2312d2762c1bad27f84b0be7f50940eb.npy +04379243-d291243cfb51ea7dcb25d116843b43a4.npy +03928116-a5c7e8103ba4ad8e950035704d666ca8.npy +04530566-afe3c44c5c05c22649d2623ea24fca00.npy +03790512-b1bb49d472fa7a39e0dbf31b32c641d1.npy +03337140-7074f91370bd1acc91c352d02061b3f7.npy +02876657-618d55a791b8280cf256a8c3e3396495.npy +04256520-70a16608ffc4988a81ff2b419139512d.npy +04090263-2bc57c73ab84f2c7d14664a287de0fb9.npy +02828884-ac477aa3d54d0e06f9e4cc51c75c384e.npy +03991062-91e4df396135fc1e368b14e48c164a6e.npy +04256520-cc20bb3596fd3c2e677ea8589de8c796.npy +04090263-e98b64d14d3fbf40b4b0a5ba224bba06.npy +02691156-75db11c354c6342aad01ec966c80ac91.npy +04379243-9f1d1d13f42bd2728490246570868c8d.npy +04530566-27f0d2bf42b0e3374ed242fafe836df1.npy +02691156-812111e3a4a545cbc863ab010b80d9ed.npy +02828884-514ba7cb3392ca5ad5067eac75a07f7.npy +04379243-80f986ae572fce791429f9a19502375a.npy +02828884-8c942a8e196a9371a782a4379556c7.npy +03211117-6ffb9e26f6d0ac61e4a4a1a686b4ec8d.npy +02828884-4145da9aceda5bcc8b6ad894ae3d111.npy +03001627-3adba11cee055363f51f77a6d7299806.npy +04379243-2fe32a0c23de48b7a4462b13868efd3c.npy +04330267-cb5668415bbfd5dd4af957103f4767ac.npy +03001627-83649708d0f14dfb8367ecca203c14ae.npy +02924116-8bd2c0ed3ad104266a35b75910eea5d3.npy +04379243-2692e57df4705d4d10faac7a8c2754de.npy +02992529-ff9e8c139527c8b85f16c469ffeb982e.npy +03046257-d697509cab438f240ba17ccf542984c.npy +04090263-e6fb0c7f8a5f944363e66191800dfc8a.npy +04090263-c836ef9c895460ae9e4b997bcf5c860.npy +02828884-d1caf5fd22c6c5083892cfdb72a66fb4.npy +02691156-472e6c2a77198432e1211756a8e887aa.npy +04256520-13a8c6129a8e80379904131b50e062f6.npy +04256520-436a96f58ef9a6fdb039d8689a74349.npy +03001627-bdeb8ea8a146bf69e54cb890e8682c84.npy +02691156-aa05bf3c5a7bb61bcacf204c07dae519.npy +03642806-928c86eabc0be624c2bf2dcc31ba1713.npy +04379243-e0b849b1545d35dab04cb542e2c50eb4.npy +04090263-b632d00231acfc0211b5cadd4563c164.npy +02946921-926d45845c2be919f8cd8f969312dc1.npy +03636649-6f984fe4627c8333752653a04e5ed7ed.npy +03046257-42529911fe6265862b5fee72119e2778.npy +04090263-48e24736473ae37f4b349e4b3dd5565e.npy +02691156-b22014408721ec314567cadca15fe337.npy +03513137-6e082b8d5dfe38c0c4278fc12d4f4d35.npy +04530566-da57d296d06af50d6fbde5631e3e226.npy +02933112-329f11a156aee39ac59350d819542ec7.npy +04256520-76fb7ca32181075e9a547820eb170949.npy +03001627-6419887905d9d67b7d3115a956c20163.npy +03636649-e69b661bb90d7e9c9dcf2183c858e6e5.npy +02942699-936a458fdb8eb12171dc2053392a6e6f.npy +02828884-2f340f2bd55d51e5c8cbe1805e7b8eb.npy +02747177-7bde818d2cbd21f3bac465483662a51d.npy +02933112-d707228baece2270c473585373fc1fd0.npy +03624134-5cdafa063633c35ea326c894c9217cb.npy +02691156-e9dcdcd8963ba18f42bc0eea174f82b.npy +03636649-d98c3d6304228f36d3cb982c5a53c2d2.npy +02880940-24907349b2323824664b3b9b23ddfcbc.npy +02958343-63f6a2c7ee7c667ba0b677182d16c198.npy +02691156-37ed9b767fb055959d61264e98b74348.npy +04379243-95b7d8f0fe70e768827291701dfaa1ff.npy +02958343-7448f1cba230298fcd61ab83ca5e9957.npy +02933112-c35d287217403cf3236641942dd4b3c.npy +02933112-c73ebca7db882f3ef26c21d3bbafae87.npy +04379243-7ab4a9f2c8aa3636cce18f92a75d5ffa.npy +04379243-e8d55124a196c71f64a8099f44773f21.npy +04330267-50c1f300272df84cd696cc46feeb6125.npy +04530566-d3f6fc016f72c08f1346991b5a9f4d21.npy +02933112-8994e11588b62bdfed208c42f7ada5c4.npy +03948459-50ad0fec4ad3b273839b0ffdb91ef00f.npy +03467517-f6146aa6171dd4f4828b9741c7dfc3ed.npy +04256520-55d89b64ec895fbbf2ca754af3aaf35.npy +04090263-6f0de5ca4ec2493ba7dd22c0aa3913f0.npy +02691156-21c7cc3e5f27540be6553f96496649c9.npy +03001627-341bcae1e7f366a233d93f57729688db.npy +04468005-84f7242486ac543b40f45eea058ceeda.npy +04256520-d60975380ebd13746a12da8b0e0f66fa.npy +02876657-fec05c85454edafc4310636931b68fdb.npy +04379243-9eba16c76875225a2d69ef58c7c1b72c.npy +02691156-2a7c34d4f5aaea962b600da24e0965.npy +04256520-31256698e33ac007dc149927e19d9b07.npy +02828884-450fd49e69534ee6d5032aaea433efa4.npy +02946921-97ca02ee1e7b8efb6193d9e76bb15876.npy +04530566-cc3ebcb96229bd325f8dd1b77a5d87c4.npy +03691459-90882268b1169ce79428390c02f266d3.npy +04256520-f986646cfa075237c02170c33e00ea64.npy +02876657-e101cc44ead036294bc79c881a0e818b.npy +02958343-187b002f0af1ab5a473f10e6caaeca56.npy +04379243-c1371e87799885a7a329355bc8cbc0b5.npy +02933112-bfb9eda1e7f92339800f2aaba8549124.npy +03636649-dafdd320477802a19a4cbf5d3b79df06.npy +04379243-927903e9992ce4877b619f30d1fed49.npy +04090263-e639996b832a157e6e0c9892807c7fa1.npy +03790512-12f06f32ede64d613ff4d2f5a7608a24.npy +02924116-eb073520d0c4db4d346f9a49ab523ba7.npy +03636649-3469cdf83a3cba1f35836c728d324152.npy +03001627-990ae87d8fb108ee80bd85224f0b94aa.npy +02828884-d87bd42b60591573c83f7280476c6eef.npy +04468005-4bde97a6453c809adc14ba0818ee5cec.npy +03001627-3869d2fda85428c4f91663a74ccd2338.npy +03948459-9accc818df62042146be58202cd6477e.npy +04090263-f7f945288a571090202be79d8b285c1e.npy +04090263-1068169d0f5df80e91cd21d02e676faf.npy +03001627-d85b661f2c9345f819fb4103277a6b93.npy +04379243-154fd969a077a39772dc9d42e683347.npy +02828884-5b50871735c5cce2d2b12aa6a0f050b3.npy +03001627-a094ba480568333819fb4103277a6b93.npy +03001627-1ee92a9d78cccbda98d2e7dbe701ca48.npy +04379243-33eff70928eefb54738e43095496b061.npy +03001627-df91f68fcd968fd0e4f1a5bf17db27b1.npy +03636649-1a5778ab63b3c558710629adc6653816.npy +03001627-4c1c81cc186dc50fd84b8ba651dfb8ac.npy +03001627-cb711f2991feea1de6c5cd45aa112726.npy +04379243-ed59a9478c7cdaa27d892bb924f972b4.npy +03636649-2388c99892c2185268d1b9a1d97e2846.npy +04379243-d35890b708c633546f31a2b0e5969628.npy +03001627-1d6faeb6d77d1f2cf95cd8df6bebbc3a.npy +04090263-2ab086ef262c8688d6a71f46c1c1c5da.npy +02933112-babe716e40b3aa81a54c1b71c072d546.npy +03001627-e7316ceb5b944b6fd0a96520c31993ad.npy +02958343-67e1b04f88c88a5c6d07c55cf995503e.npy +03001627-895be5f65513a7d09a8ef44e1d2c5b75.npy +02808440-6c1b18b0fa544552d93d979414505038.npy +03001627-52a96a3c89305673504721639e19f609.npy +04256520-40337cef87a495ff6e8f2cf4a97051f.npy +02876657-ed8aff7768d2cc3e45bcca2603f7a948.npy +04379243-a14d6cda9c2ca5c0c955e5ed03ef3a2f.npy +03691459-2bdeb030dc3caba21ad88f716ea80910.npy +02933112-58b97051fb1efb3b4bd9e0690b0b191.npy +03642806-f53a54a64dc475195f2e56f31ec62a24.npy +03046257-fb0c59c0bedf2276f51f77a6d7299806.npy +03211117-4bfa2e1e43d64c51cbdbc7635e6b79a5.npy +04530566-8410626d841dca3218b14db3b83de9ff.npy +04379243-497bd3f966eba2d76402b8f491cd92c7.npy +02691156-5c6590461085c93ea91e80f26309099e.npy +04379243-856e86709df98497dcfcef693e7ec696.npy +02808440-654362e53ebb6e303321831d2245cf06.npy +03467517-222b705a80d75a4343b0b12983b9982.npy +04379243-1c996c187f4354db7252c133a7e17d94.npy +03325088-86e97fe0431d070fdf279ac1867e743a.npy +04379243-d47189d9686125553caaa84ea4cea094.npy +02691156-f6e6fd724a9eab24ba8e93696257b3fc.npy +04379243-c06a4b0f57cac2b020afdc30846c0661.npy +04090263-320c462553b4eb18d18f925e78a25ab7.npy +04379243-322e8aaa889e25720768660cf080d12.npy +03636649-df22225de54de36d71d7520e3757f3e9.npy +03636649-b4be7d84e2151a3e8bb3deb7fab7c9b7.npy +02691156-e2f91794c302f5c03221f63172285740.npy +03001627-61a6a9dbd3d0efc2c3bd24f986301745.npy +02843684-9c038a6c2564f3b0560e99aa033eed2e.npy +02691156-55036f6b22ddeeedca8607f540cc62ba.npy +04090263-744064e205da68779180711d39b16e1.npy +03001627-f030f5181057ddf75622d7484764b58f.npy +04379243-e686855b4c95330db3a8888e78d004b3.npy +02691156-b4d64b689e870d1b828204947d78b9af.npy +04530566-f83474c31e7bb6bc1022decd5ff96217.npy +02958343-caa26e8b5033be6ac02f176e44f0fcec.npy +02924116-2e86a7793af11e422d32966c67e5becf.npy +04379243-905628a74c7cec233a574a2e3bc99a1.npy +03928116-4b108a9725e4d514f787be2ffd2fc6c5.npy +02992529-b854fc846c1fc2ba619a006c72381476.npy +03636649-1d89da4ac1538ada9c949ae6274aa016.npy +03636649-4775f35d9b6942081b42cc426459cc26.npy +03928116-b4c3484639d15d24d6cfdd2c4c6de262.npy +02958343-274bb81c9dd9420b748999a5d81a158c.npy +04530566-bf8995f756b59102698137c717c4ad11.npy +03991062-80608e58db79d4d83b722c86abee0751.npy +04090263-d032874b5c3129a313b55e8563d02319.npy +03467517-5062f174c623b70d4bfcfdb26b8cb2c3.npy +03001627-56bd6bcf5034c7e2f9b9977a2406713a.npy +04379243-30d6d671a33b6c22e76bc197b3a3ffc0.npy +04379243-57d6c26b519918d770cd267ba4f2b2ee.npy +03046257-7e779affe56aaa3645a3ee2cfbb67212.npy +02933112-37ba0371250bcd6de117ecc943aca233.npy +02958343-7ff4c1fdfd0e9bc7b99adc532ba20916.npy +02691156-b3ac8c2c48af1c07ca8607f540cc62ba.npy +04256520-1c9d333bda4b2977f92f3e7bff4c4ab0.npy +03325088-a954783de7f881e9c36fb70296e45483.npy +03513137-43f6f91a2a64a62b5fd0ea7ae0dec99c.npy +02691156-8bb8876d55433eed216b327569dd806e.npy +03636649-1f15e31094a7460aad5067eac75a07f7.npy +04090263-28f82ff412a37a304c8f375eb1452283.npy +04554684-24d50c4d744c20494a084dbeb79b6bb2.npy +03691459-7bb0cc242729aa90eafe995fd10c1326.npy +04379243-f3b8c91c5dd1cb6b8722573b29f0d6d8.npy +04379243-d97819998f885d54fb977fd7ef10cdde.npy +04379243-3fde8835e0f31a64d8cad143689f8b51.npy +03325088-3be00bc0418fa112b362845c6edb57fc.npy +02958343-9f5d5b655ebbbb9c4d31b03e74c723a3.npy +03325088-a088bb2b65e1275f76c18e71fd49c4dc.npy +04379243-224820b020c1b6136b0f2a1430e993a.npy +02992529-ecbb1c53e881c2b25f4e4793ed432bc1.npy +02876657-10dff3c43200a7a7119862dbccbaa609.npy +02691156-700bc5991a46c1d53ddab476a0f5c5ee.npy +03001627-34108b791e6bc4ec1bb7158ebaf7e1c8.npy +02808440-f3cb920a47e224cb39773ee5b5578e3.npy +02691156-e86fd13a49f0ee0a62b600da24e0965.npy +04379243-bfa77d6ff4e853a275b278bf2780ee51.npy +04379243-440d371725f4f6bca570c6c691c987a8.npy +02992529-359be05b5042209a502122ac3599bb74.npy +04379243-8647063ec039c4eff51f77a6d7299806.npy +03001627-32d67f875ead7f1eaf46128407fbd2a0.npy +02871439-7d8a58d4c6dae408b4e3935c6cee4b35.npy +04090263-3babca331dad56aa1b3a159059d827bf.npy +03991062-d31fd6abafb3daf3153f43b48d21615e.npy +04401088-43f7d0cb3f0ace029bc144914804a8be.npy +04379243-b278b58e294a7d2bac242c3aebc81b2f.npy +04379243-b6ad7be371729438dcfcef693e7ec696.npy +02828884-e807cba7fec6d514bb5d4e2d93fefdc5.npy +02924116-ac69801f426df5c76ca2b6e5474aad11.npy +02691156-6047f2c5854dd38526cb540828830330.npy +04379243-821f2cc776043008efe8aae804e55d6f.npy +02691156-2c9797204c91e3a440975e4feec771f6.npy +04090263-77241daf76a045c099d9d900afe054b8.npy +03211117-e5e5018fe96e414528d0f4c81cc1f1d8.npy +04379243-df767f2df999315b74ffc2f06690002e.npy +03001627-eb63908dde4b579e25d45769a218937.npy +02808440-1c68386f4be530973321831d2245cf06.npy +04379243-224ec626233b7a0c14038d588fd1342f.npy +03991062-db36c80ae2c96e3dfd8e2841125af0fe.npy +03691459-f25cae5549e30302803f272bf12359d9.npy +03001627-c8265e04c94bcb5a1346e336f65f96f6.npy +04379243-ee6a58b9f4a5a129ba5342d638d0c267.npy +03001627-27317a0db349369c8b74e4684f0d409d.npy +03636649-a2c9d00ed67862af2c528d33bca1ac2.npy +03593526-ef5269ba557da598561dce3fe08634b7.npy +04256520-ea0ee7b60919e35bb1dd813f3c0d0dd.npy +02958343-a6acea161250379aba3e2415e22cd45c.npy +03001627-2dca240a3726c004a83826e22c7812a6.npy +03001627-8f23005418fee71819fb4103277a6b93.npy +04256520-baef1491d5bfb6cb58e51facd8ce1a25.npy +04256520-87936de578cb81c4c61648d3e90c5695.npy +02924116-bfa9f15a8aad2e4d37bff66a594d9608.npy +03636649-381c2fb265c32cb093be5e169656ef71.npy +04379243-ba4ffdf3eed29dea9f8c3d2002c77ddb.npy +02958343-d953bbe38edbc6f4ea999fe4ffdc2504.npy +04379243-5485834dbd8cd031c963bc72ef3a8742.npy +03636649-b0c346ea1fa3ad0b2d7dd0a148440b17.npy +02801938-eb58305e6c1b4455a9e3e4940ed610e4.npy +02747177-2a25715df1064c8ad5067eac75a07f7.npy +02933112-c7c782fd5976ed7214038d588fd1342f.npy +04530566-9e4cf06ced9331d3bed4193378c6c5c8.npy +02933112-6a121783609b4a18824662341ce2b233.npy +03790512-bb1c9e1346c5262bedb66d5d04c0da43.npy +04379243-17f4b14ebbe37179ab2b7e9ed9191486.npy +02992529-e30f2d19e9f44f6ab0cb879d4613195c.npy +02958343-2fb5fe84c28b8b35cc02882a83047172.npy +02691156-446327ea5e2e50aebbf3143b1cb6076a.npy +03948459-af10941be2d5778d25c70fb1df3f879b.npy +02818832-be8ce1bffe716f7ed2ebda13f0b603e6.npy +02924116-cb3bb1c939c73f5752470de2774d6099.npy +04090263-49fb34153b09db8dff790997f2048517.npy +02992529-53ce93c96d480cc4da0f54fde38627c3.npy +04379243-ac1f8fe1e544b87fc798432661977bc1.npy +03636649-57e53cf314a173f835836c728d324152.npy +03991062-6e8297cba6273bd172a90fe1ba02202a.npy +02691156-7f09b3b11ae3f22dbe13ce34aa7c0c1c.npy +03593526-451d7b1633aa8ee741da9a75408092f6.npy +02958343-37fb762e57f343a7aaafd94b9f216ef6.npy +03691459-a0f57b3d2c2ff2ee2666ee81c3e6ae4f.npy +02773838-6187bd900c3bc002ed13f430b2941481.npy +03636649-b444be0623b2e237d73e51f8db3a696e.npy +03642806-f3d162798a285521da0ccb8671dd235b.npy +03001627-e9f83e38241515a7438d8caa9ae106fa.npy +02808440-a7e6c5f63e2ed8c2f6b70f40d73aaf47.npy +02801938-f15e1a252c89c4d3494d18cf12f347f3.npy +02958343-3d693af6fbae47f9cfb661f69a0dfbbd.npy +03001627-2a6b8437623a374e504721639e19f609.npy +03001627-19861e56a952fe97b8230112437913fd.npy +02691156-d1cdd239dcbfd018bbf3143b1cb6076a.npy +02691156-2b5c0a38c754927d21abaaa81d1a4195.npy +04256520-9357812939117927c0450f087c15de65.npy +04379243-dc611d5add49200d868cace2a58d7210.npy +03991062-5b476163b025a5931143841839c8c312.npy +03046257-83215aac91958278ee2b478fec745c0a.npy +02691156-9dbab9e46b372e837645a27090729af6.npy +02828884-1d9fc51fa296bac9a1770107888e7eb8.npy +02773838-581af450a3a8009abc49cae1a831a9e.npy +02828884-1ee7b919637a2acecb2a965e75be701c.npy +02808440-e88fb160e35aae493a762233fffc49ea.npy +03691459-9a91398e66a8c980ebc29484102f14e3.npy +02924116-d6b48aa8ab3b5c8ea22d178fb4ac75ef.npy +03991062-297b925ff864c56c8ec58bafa7a6bebf.npy +03790512-70d9cc5115bfedeeab548456bc75847f.npy +03593526-9a5cb53a2858225e72a5c49c981e6593.npy +02871439-f807ffc89f4855f7d927b44c79143ca4.npy +04379243-ad63116007d98a6d19758238d4c7aff2.npy +03636649-67780176ebcb050dfe3e90bc90e90c63.npy +02958343-528fffd59eee9bc5851f021b9ed69c58.npy +03636649-3c756a2c1c62e73b7252c133a7e17d94.npy +03642806-151fccb37c2d51b0b82fa571a1cdbf24.npy +03001627-28844eb55fc82dc8f4b6538438a0b930.npy +02691156-6eb12144093da25e816e98a113f4d393.npy +03325088-7e8cc52fa74c26b4eb1f243bab39fb29.npy +02691156-8f33d2c0c08befe48caa71b1fbf7fb98.npy +03467517-264811b5e65101acc34b900bb2492e.npy +02691156-a430ba73d3ee2c0fca9f0727e23831d9.npy +02958343-b619910e7e51d8e176ad064d1c5fdd7c.npy +02958343-9609eee1c5f60dcd610425baad975046.npy +03761084-b2ed63bc028b50096c3c8e8c91d35a17.npy +02691156-9378f4e9b3bc187e621c837076d6923a.npy +02958343-d014af11d76dbf667aaf79c2db0c7371.npy +04530566-3c52a65c90a604f36d41dce38b96c472.npy +02691156-584e076b6cee78addc3757fd1f4189a9.npy +03691459-28be6cc8685c68464aebea9384ce74e0.npy +04379243-90631514bc5dd234c798432661977bc1.npy +04225987-efdc98987203bafb183fac288c6ded1a.npy +03001627-1d1641362ad5a34ac3bd24f986301745.npy +03337140-b4194440c21b4db77a50afc9c93f8a50.npy +04090263-329f6414584d87a999b3da21343e5637.npy +04004475-d80d585502fcb9d3199f2eca998ded6d.npy +02828884-729650e08d4ddb97ed98cca8f0ccd5f7.npy +04401088-bcb8525b5aa7e4a5a62dc47412730fc9.npy +02808440-dea2eef8fa6690061031459726e7e8b9.npy +04090263-a8e3b605c0eb659e5f6c4107d78f2cc.npy +03636649-bb3f359cbcb046a8d24a4ba64e02f65e.npy +02958343-e7f40f595169f1b44a383db4764d5432.npy +04379243-fc3d08b88b00d95212610a4585592f3.npy +04530566-697c8a9055e5ff2ea7a62969e8bea32d.npy +03790512-6bf1f988493dc23752ee90e577613070.npy +02958343-1a64bf1e658652ddb11647ffa4306609.npy +02808440-1f3abd1016b4b39e4c62bee40dcdc539.npy +04225987-141616a00df67c351082f2ea630bf69e.npy +02942699-9d79c246317bbbe87f72d6c7f2024896.npy +04401088-46261b630244bdda533775ea6714a372.npy +04379243-7b9a5531e98308c8c3bd24f986301745.npy +04256520-75d58cb9ca1475f86f37a8be59c15bbb.npy +04256520-83f9051ae9fb1598cbf5d61bee02065.npy +02691156-77c86e12f27b2adff602d628e1c92113.npy +02924116-48a23d75d3bbdc1c8c6047ec67401af8.npy +04379243-6c322cbf532f87337c577fdb71c158.npy +04004475-68a0a6e41a0409ac77efed640f9b11b5.npy +04379243-904a4c3f1ecef5f852046ee916d15a12.npy +02992529-df2299185baf20a17b1546f309a98bd9.npy +04379243-649da94b45bafa807f8769b595aa12b0.npy +04379243-7937479e527b07dd19fb4103277a6b93.npy +04530566-e765446c37351a26850e00840470903a.npy +04090263-b0bfc504cf144baf2685de1ac73dc74a.npy +02691156-e1e7f3843b1fb876f5156bb441883fa.npy +04256520-4afee57f3134a483d9b53420a5458c53.npy +04401088-96b1d230e88cba16f71555c6480aef72.npy +02691156-52a84fea7c314f4c3dfc741b4df74043.npy +04460130-10312d9d07db5d9a4159aeb47682f2cb.npy +04256520-63e91cd73f169af037f251300f603b8c.npy +04379243-8c67fd5a15e8d9defebad4f49b26ec52.npy +03593526-bbaf380835e362d0de03ab2a27ba7531.npy +03001627-4446234d12158c42b161f36d4e309050.npy +04256520-c2f02274b4dd4431b4e7c0374e7ddf69.npy +03691459-40007a605a25c71d747b49524a1246e.npy +04401088-d944c42ad08401651e5d846d206adf3d.npy +04401088-36290375c3ff67b9fa391a6b067626b4.npy +04379243-387b1c9a2f50ec314b3c42e318f3affc.npy +04379243-a50fe14a700587304b7b1010fff3cd07.npy +03001627-21fb308ca737174e22f2f93459bd863e.npy +04256520-990adbf32c6452878eb3bc6c6d15f9bf.npy +04256520-dd78c16d85780d6b413102507b68bcb5.npy +03593526-44a5d28686a9b8c9182816640e3b1915.npy +03938244-2805a2c180bdebfa38071eaa0d0d49bf.npy +04379243-d8b547a164d2f356ff24b36f1450b61c.npy +03593526-e42b51de027eba748b9db7e7b88ffbb9.npy +04379243-7e85deaa7bd114eedcad73f240f03a20.npy +02808440-eaa7c4771b639fc554d7082b34825ef0.npy +04379243-5530f95795fce09ca71c812e027f94d9.npy +02876657-a429f8eb0c3e6a1e6ea2d79f658bbae7.npy +02828884-595e48c492a59d3029404a50338e24e7.npy +03636649-f97011a0bae2b4062d1c72b9dec4baa1.npy +02828884-db663d2bc7e398ad67a2f40ab335eb08.npy +02958343-312da43baca104262c98dffdf7adc4e3.npy +04401088-504c453471faee3ee304974abc9afad9.npy +03001627-94ae179dd1a1492d1191025061735ea3.npy +02691156-9a3cb94af2f2a5b826360e1e29a956c7.npy +03001627-539ddc43afec160e57b8f616df7adf9a.npy +03636649-28210d460a79e323322123314d92e1d.npy +02958343-a015b428cf628af3522dcdfaad316d22.npy +04256520-13534db5278d476d98e0d1738edd4f19.npy +02691156-9259906152f9d885a8cba409c4409ba9.npy +03636649-c6424950ca9447627d8864caa856253b.npy +02933112-d56ac97208393d54bc8967b0321bd9d2.npy +04090263-a32acd243e91fb32a59327b8ab7c01fd.npy +04460130-fd6ca820662bbbf3ba10616cfe5316d6.npy +02828884-33458d73568cfb62d201085e80edb26a.npy +04090263-c044bff4423c7889a2ee232a197081e.npy +02691156-8b72934186e1d8b0f510cd52a5f27547.npy +04379243-69e670c5a40a40ec9095fe1213108032.npy +02691156-3112ef52e6da5d6142320ab3b0c39c62.npy +03636649-c52af321a31d28a2e95e8a5faf311c2.npy +04379243-25c9cd32e5ec1e7cdf54d2cac06dae5f.npy +04468005-e02ea2b2d926095aeee40229e2e3ae1e.npy +02992529-3993102ecafa0826ffd1164158ab2e9f.npy +03691459-ac27fec4b0460b00318a4feb4ab5fd2b.npy +04379243-237e15796ba16d86e1b32bbe69d5bc15.npy +04256520-71e0e0315d718004e7c7920f6a65a54d.npy +03325088-16ea35ec6ba0c4a7b7a867e9b35a1295.npy +02747177-2f1aed8925147120c62ac18334863d36.npy +04090263-e892f50659fc9f8ad33dc284f29d8394.npy +02946921-a70947df1f1490c2a81ec39fd9664e9b.npy +03691459-421eb9597a33cffdfdd1073b17e9e51e.npy +03001627-8db4d399adc4d6148738e7290b6f3237.npy +04379243-75bb849ce0a252e72c1a544eca74c954.npy +04090263-b3e73818cd2e03c080149f7d680e9c1a.npy +03001627-20d01aedf15d4d1d23561140a396280f.npy +04379243-1a3cf7fca32910c4107b7172b5e0318e.npy +02691156-ca88882d06ee5468c34c40f49da8010e.npy +03642806-ed35ed3a7c8824e5996bace9c8deb982.npy +04256520-c35d42881295d9cb86debb0a33c851f8.npy +04379243-d4937d73a4602e66d9a65329a03d80e5.npy +04379243-379ad91ceb20859b0a3f25f5d8cb0f8.npy +03624134-d7cd204b24ccfc99baa86a06fa108e26.npy +02691156-6e25548ed9d2c7b597dec65c2238cb8a.npy +02992529-f400eb5421283e8a102f4912aece242b.npy +02958343-53c118280e60df0bd2350421a9405ba.npy +04090263-8e461cdfdb0536e1b5666ac9dae008e8.npy +02958343-2d1718bda87f59dc673ddeabdcc8c6e.npy +04090263-c5cfbac689f8f49310e71dd8027aa9c3.npy +04090263-5004ff6a719d0c16c52533855abed4c.npy +03001627-2f0bda4f2c225e0254141309938df7ee.npy +04379243-c0df578cee43eb8526f51cb1aef0ea9c.npy +03001627-330dfd669062043f5e60ee22a227533.npy +04379243-c8575754df874644dbbc9440457e303e.npy +02958343-9ee32f514a4ee4a043c34c097f2ab3af.npy +02958343-cdba926f41c3b1ce92dd8154d7e0933a.npy +03085013-6c3bcb83c57e430f584c9f4a9f37e15.npy +02691156-1f7a516fdf80dcdc1006ed55bc1a3fc.npy +04256520-97334ba30676598958f7bbfa65d864aa.npy +04379243-6efcaa530059319a720daf9b94e7a5a.npy +04256520-64800f14a795d8759055f83d11955109.npy +03001627-523269ef7703a120cf004563556ddb36.npy +04530566-82180d1a6a7edf815e585de41f56d4fd.npy +02808440-e3a0391e9fdb7671fdb7801f07fef3bd.npy +02992529-ab4ddf9e4130d6b560cc5a290ea3b31.npy +04379243-2943ee99465c7adf30bbd4cddd04c77b.npy +02691156-f21a375ca5fd26994fb6540b6bb872e9.npy +03211117-2d8a4b48acaf84d791bf924be509bc17.npy +03691459-b488f301cc8c7d0d4079257326eb1699.npy +03001627-3c81fab5678a3872327289c00b6dc9ca.npy +02691156-65468fa9ca2f3e9e642566c028df23cd.npy +02958343-4271d0c8cdad6a84e572d3df5e4fc85f.npy +04379243-683ca17c9b0d6c83f15d71fccc06917a.npy +04379243-2dedcb98bb6e9375aa2e219918fb41bc.npy +04379243-db3d26a5f2a99aec433eec73a2fff97a.npy +04090263-85eba152f5c367bdb3bf5cd8f4c141b8.npy +02828884-ce9c518ef76b4974d56cc378741d37e8.npy +02933112-de23f702d6e8232f12de5317fe5b354f.npy +03046257-7c62a7d42797a720a480742f4529182b.npy +04530566-12b5302a8aa697a138b0c448fc291f4a.npy +04379243-c7fb18d9ee7dc33318a6353ea60f11b6.npy +03325088-1216d075b84b3557979c556124bee033.npy +02691156-dfe65f8a20df11c5d1df55cbe0874aa.npy +04530566-6f8bb01950141f63b3e3c8d3ee0e8f52.npy +02871439-128a322c75bb43195050d6a2f5d42f74.npy +04379243-12cecbf8685f52aaad762904f2c09cd0.npy +02933112-d7762b2997bb9e2aa70a592d6c8c9234.npy +02933112-1b269019c7698355a8737fcf23389014.npy +04379243-210ad02f34db100c236f7a807f5aed3c.npy +04256520-b929ff628fee53d452f2ff843abfed75.npy +02808440-8bb8368541ec46f654d7082b34825ef0.npy +02933112-6aebdfb1622324617eee615e75bc3b77.npy +02933112-54c4eb19c59440128f7c4148465d43b6.npy +04379243-e13ea4661bd5e168e7fcbdad594ae05b.npy +04256520-1731d53ab8b8973973800789ccff9705.npy +04530566-5cf29e4dff6535c394eb4a27c704b88.npy +03001627-7139284dff5142d4593ebeeedbff73b.npy +03001627-2b69e899da0c15cfb40f0ac0fb9a650d.npy +02808440-3124505d1bab02cbb362845c6edb57fc.npy +04256520-cc906e84c1a985fe80db6871fa4b6f35.npy +04379243-fdc04ac9fe8dd6db04cb542e2c50eb4.npy +04379243-a7f98e26ccb27f0b52225a4689f7f600.npy +04379243-485516a2c88eb0b8b516c05d046e8e45.npy +03001627-ceb04c53d8aae1319fb4103277a6b93.npy +02992529-6710c7894efe94cb918f30c146a92bd0.npy +02924116-36c043dde81d976b9c331a603e039290.npy +04379243-42384087aab891baee18bc48b60b36b7.npy +02691156-c235f2c6d1e8c80e7f436bc8bb8973a3.npy +04090263-5aac06335039030132f8337ee2b84248.npy +02828884-9ceab93b37b71c47c62ba64662b2626d.npy +03085013-aaa82b33a0414ab6a374d341749045f5.npy +03790512-f5510d06aba5b0f683a3e53900c6cbba.npy +02828884-80b20fdbf1183f37b7491f8d3451cded.npy +04090263-94a724430f78e09bf0e835155cdd677d.npy +03642806-2ce3a50ca6087f30d8e007cc6755cce9.npy +03211117-58837198e067db4cde008fce66fdc56a.npy +04090263-27b6d2084f80ef3a7b7f00333604764a.npy +04256520-ac16057c9ab79f7f2c7685af80c3d87f.npy +02808440-9c66a619b577ae713321831d2245cf06.npy +04256520-e877f5881c54551a2665f68ebc337f05.npy +02691156-a36d00e2f7414043f2b0736dd4d8afe0.npy +02933112-2cfa88eb16cfd27b921dd903dd0b8b17.npy +04379243-7494fb1b493b36db2b3f122bf827792d.npy +04090263-b017d865b68cd1adb4cdad9a5bf52dd5.npy +04379243-41adf7a8d492a41ff12d7184a2ad3430.npy +03467517-1070208ea6a020b8782a47e264016477.npy +03001627-ecb57b01c7ff75cd416e7824059e108.npy +04530566-1b00e4c41b4195807e1c97634acf0214.npy +02691156-c0edd36fbf8d63fa35fc197bbabcd5bd.npy +04074963-7af8b6f6f78d0eddea30b1080420ecf9.npy +03046257-95603651d927cd6c36a36f8fd7d27134.npy +03636649-9fc3ddc511f4ef62dced62abd38a02b0.npy +02958343-b0945cdea946d1a363c65629bee30ef9.npy +02691156-a87adc4fb1229b7f6d0f2528dd6f85b9.npy +04379243-4c0e985f49767f90388021e2e5bfc1bf.npy +02958343-b1736379a44bc475352a2541f8b4515a.npy +02992529-8d55c1677626cc48214d974150b798e9.npy +04379243-d6acd7d7c9e0deaacc963bba1556032a.npy +04256520-aa41f9c1ea3647ef5dc3653f8341633a.npy +04379243-8ac4ba5328ac4f423a14972b15e80b93.npy +03211117-68944f7b386310c2515fc0d40df6c5c1.npy +03710193-34b80115a8b77c8c1647dbe61e0fcd1e.npy +03642806-4c7814676c42d67b902e12fe4da5924d.npy +02808440-51ec60c0a42d6b23911cae4661bfbfe1.npy +03691459-5ebf73b0ef33aac5451319990092e2bd.npy +04330267-50557c5a0d38b38920192a5319e3e2e4.npy +03325088-12e62ae56879bda8979c556124bee033.npy +03636649-4bb0f244d4abe00b44949d7685cb63ea.npy +03991062-6c2bb8a74adf58305a340b65638f743c.npy +03046257-52255064fb4396f1b129901f80d24b7b.npy +04256520-5319006bf5783b6919fb4103277a6b93.npy +04379243-c21637acf98dd08649bab4be538c970f.npy +02958343-c1b4d407168867c45dca6305fb9f97ca.npy +03085013-3ebc2b3e6235869fc7be8dc1ce3991c2.npy +04379243-2b4d9c4722bfc075ebeb8f91be624923.npy +03001627-388ffdd2dd3c0dc0780672cae8ec94c.npy +04530566-ab40191e935c415cef0a5cdc2cab422d.npy +04379243-6ce30b0327db26f340b4c5428883e585.npy +04379243-bc5d39edb7a6efd77b9bc6a8e1b90da7.npy +02958343-b67d3833e6991de8dd141480e2c154d3.npy +02871439-6003c51eee40d5942f84cb7932f866fd.npy +04090263-f90191dfe0bce3ad49f0e3dd7767881.npy +04530566-1b2a8980c17fdd97c897e89b561760b1.npy +04379243-46c3080551df8a62e8258fa1af480210.npy +03691459-28b91f5ca7e3d174fb0a4dd466ef3d66.npy +02933112-938d8ae0cdc787107bcb070cc655f13a.npy +02747177-a9cd539f8a5e19e06af350e51093426c.npy +03636649-12dd2b962777328551014c684c004c28.npy +02933112-22cc22fa33c8203ef1bd05634b542a1a.npy +04256520-6ec8a2dc3bae5a9b8b709c58c1c5ee96.npy +02958343-d1a54cb41a88702b1e8e2692714b2614.npy +03001627-13d4fceabfda96c0bff8d8db0f9298ac.npy +02871439-fcb0bf443c62225b4bd9e0690b0b191.npy +03948459-b86cc2e83384030d91e284193311f752.npy +04256520-d3c5ce89b20dafcc57ae08c3105b4e6a.npy +04554684-d4305fddf4c03812625f0e5788fbff74.npy +02958343-fffb1660a38af30ba4cf3601fb6b2442.npy +03636649-dd284c442afd361e37f2340db925336.npy +04090263-37cbf8e368b06b655e43a6efcaa57d09.npy +02691156-75916f78e72f90984b70ddbaea6e513.npy +04379243-a2405bb8642d5bcecce90f0d61ed7a70.npy +02808440-1dc8e88da760f186ccd0340812259a39.npy +04379243-4abe61d5f1f800b6c8d74856214be3b8.npy +02958343-c8c51e709d1cdbe0673ddeabdcc8c6e.npy +02691156-44836457aff60736e10e757961deca98.npy +04225987-8f78a26403f09b708b3b3a08d28a7d7c.npy +03636649-d4498a4ba89b9a0d4a73e364671ba824.npy +02691156-48c4b6bde824e987a8cba409c4409ba9.npy +04530566-ac8afdd8c70178abf0a977ae17a6b223.npy +03593526-82298657eaa980d323a295070ca176a0.npy +03797390-b6f30c63c946c286cf6897d8875cfd5e.npy +04379243-96edd3d807d2b1c7d1869c3a235ed163.npy +03928116-8c021db546a9248b582c9847073623b0.npy +02691156-251313501093a024599faef54fd54e83.npy +04379243-1f748bcf0ee8eea7da9c49a653a829eb.npy +03991062-1b39d7b69bee8a09a2c59a4d90e63212.npy +03211117-f7d209529e47778d7a39f8821ef8c382.npy +03624134-dce941899bcb752dfe474f09e3f3ac9a.npy +03636649-522bc10920249e67141c66e2b49d221.npy +03001627-4438e29f9d3cf45bfe52ffd0e748a1ab.npy +04379243-8c7a08d437dc8431369b4bd8c721a288.npy +04379243-dc13119307bb03338aaae3d020f5ddf8.npy +04554684-2010a39c4b0c58b714b35a7d7cea7130.npy +02958343-f7362613dfd3772faa69dfdc5532bb13.npy +03691459-9432e02e277a206e3fccb208b0350a.npy +03001627-2d6ec4afb0ef827e2c5b2f528cea9dd6.npy +03001627-5cb06ff2b420c24721711c78ff413696.npy +03636649-a17a7f72494b303abc5744a94c74a7b9.npy +04256520-75071b6962f431175becd8a4c3f1866.npy +02958343-b88a4c0cb2092fa52fa4ad29a1236d7.npy +02691156-324304121b61339bc36cfeafa51d54fc.npy +03636649-8425ceaafc6cdb0b159fbcda62e85465.npy +04090263-b449f16a0cbad90088be2a30dd556a09.npy +02808440-2e752b6c5b6c1cf865793e85eb09b261.npy +04090263-baa007b1a903fc432ce452abffb6910.npy +04379243-7084db2193bc9ee43d113b8340bd5029.npy +04379243-913c0ff011ad0658dcfcef693e7ec696.npy +02691156-40dc09d726aa6325ce2cec85ea6ae00d.npy +03761084-1674b409f2dda7774c86b1fdc94892eb.npy +04379243-c06f1cb96170e548b2c2cd006d206129.npy +03948459-2f50338488d6254c6460d209041b501.npy +03211117-f17247f450ab313489d3a03b2edae972.npy +02933112-6e765437962f4c578e51433393e177c0.npy +02958343-4b7f9ec47ede386222f104fd8dca95f6.npy +02958343-63959ab016687a50618e9d35559b7aa.npy +02818832-efdc740a363e1521a58e28eb06d46abc.npy +02691156-4a199b1c3c80c8823bfdf036d38c839b.npy +03642806-517de75577ac6e8a42b9615216f9a30d.npy +04401088-bf15900bf5afb946b35f223cefd97829.npy +04256520-be5f2498434ecf9a4b3c42e318f3affc.npy +04379243-5df14a5997ca80fee45ef4135c266a12.npy +02828884-6b05c22024088fa92056b4bd5d870b47.npy +02691156-5c379a118ec80927febd4e8b843c95aa.npy +02691156-7662fbb435dc1d0760bb9786c97a649e.npy +04379243-27a90972dfe64be5c3bd24f986301745.npy +03001627-fdc7f288b8c65494a7101992f797b6a.npy +03636649-4ffb03a364a13c376b41b8bcd0404ec.npy +04379243-724fa46215e03f4c52d9fc61873164a1.npy +03467517-eece2b501ee7563683ce694a1c6f6c51.npy +03928116-5e3aa6ba5934dfc6a9a82795b0444b1e.npy +03001627-49cbfde1ae92ee555706d1c54190f27a.npy +03001627-f3718bcd0e497868af7c7ad2549a1b15.npy +03642806-b962658596d9a6ccc05c2f3d0d461abf.npy +03991062-51a88bd35c6d7824eaea040a8e2015d2.npy +04090263-68432645acc0d554def607f4d4140edc.npy +04379243-d48ceb6fe098d078f0cfa7d27eaf1bef.npy +03001627-cacaca67988f6686f91663a74ccd2338.npy +03001627-d49ce68499ee980de6c5cd45aa112726.npy +04379243-dff9b5c37bedc55e9f011a37a96f51f.npy +04379243-cf52e17b21021ad9490ad276cd2af3a4.npy +02691156-f2fda88e9688fd81d972c9dd75ed77d4.npy +02958343-de0cbca344b9de834f36122a581b2941.npy +04090263-7bde81ebddddd161cba7035647fbacdf.npy +03624134-693c599683ba86a410240762b65ed973.npy +02828884-a064a3e9b537fd64818b16b10229b98.npy +04256520-ceb04c53d8aae1319fb4103277a6b93.npy +04256520-17555a8b1def80abce101336817a135f.npy +02691156-efc2f4eb92871bb2b7a641946dd77b16.npy +03001627-3a4d572dc16ac52e201e82f29479384c.npy +02946921-e928ebedb376404f8e5478c8425d418a.npy +04379243-79650ee83a0aabc8e1dbce34224f2394.npy +02691156-53958f924a50069090baeef8ba5b93e5.npy +02924116-f55c41a1f4dfe4e5a1c12b50998c10.npy +03624134-ebfb56c4968055e794581d435607029.npy +03467517-d4ec02d3ebae75249f4d0101328eae2.npy +04379243-89875a037902c0664bd9e0690b0b191.npy +02691156-a2b758aa5d51642bd32761b337f8b72a.npy +03636649-376c16f40c95e81429eb9d04ea723179.npy +03642806-be6a1fba2165bdfe2f81cb887dc35578.npy +03001627-200597e4eaf96015a4fb72f4f3b0e317.npy +03046257-729270762f381e7b1bd71c75e3a794e0.npy +04379243-a8126dbed61e760433ea3991d83e660a.npy +03467517-aebe041eaae1962921d62dae9ac1d30f.npy +03001627-ba074c9ff5e36f60e8b2b8dc0c816caf.npy +02958343-555a48617127033c25ad20bb66839d61.npy +02933112-85868e1440bec257a4bc7fdb4c84963.npy +03001627-45fa737cbfa8a8b69b75b6346baf0c12.npy +04401088-5cf5bbb8f745033195c9a4bc0e92777e.npy +04379243-1dffc3840500e89ab8e1b99345a5afd4.npy +04379243-394c63a5658ef759b515d1675be6b5d3.npy +02828884-433253d0d97f814025444614eab3fc33.npy +04379243-e92a4ff2b36cbf83490ad276cd2af3a4.npy +03001627-28a60e0e9adf7eb0a3340564b56a7f70.npy +03938244-cf2ab5d9bff184ca6325569942918d9f.npy +04256520-3aa613c06675d2a4dd94d3cfe79da065.npy +04074963-86982fe32e06c96b11eba86b475bafe7.npy +04530566-c96d837820b8fad281b4fce04c14eb91.npy +04379243-b4a66058027312c7ac51268fdb437a9e.npy +03001627-697cb70c54a483f1f80ff10f4838c137.npy +04379243-9e3514da2268557855931d119219022.npy +04090263-c4efdc79b1132dc6533df38649ea120.npy +03991062-f7e29e0b93652ea4b522742df2e8c383.npy +03691459-1e9032f25c5d068fa7a69b946cbafa2f.npy +03211117-241b26438e8523ee2846fa729d90e125.npy +02808440-ae8938fbd91ce8e0c790d7efcdfb5239.npy +04090263-f16eab54ab97a97c8cb82d02bad057b9.npy +02691156-1deb997079e0b3cd6c1cd53dbc9f7b8e.npy +04530566-fcf21e1176459664806b90e3f08c9a28.npy +04379243-8aa73d4e62b33e8787e41ecbc4197db.npy +02691156-12c82319147385e7ef0e1705c5c9e361.npy +02958343-bf1893badd1c6bef59a47b1880958de9.npy +02924116-30c34a579410bbf2102055801a18154b.npy +04530566-e2446b9f4b9fb179f525bb02d30fbbfe.npy +02828884-7cbde340db4f4ee2cb2a965e75be701c.npy +04379243-392315d4bc7f11f0ca67acef5667509c.npy +02958343-cfac6b6374bc4fedeb7780cdb3ece367.npy +02933112-942e67160b47dee1b27fe5b4f7a28eec.npy +02691156-8448475504ba9fdeca8607f540cc62ba.npy +02992529-ed9149921b734b2941edb96d309c9a23.npy +02958343-5ce9ef613933a245538f2c6e5c51cc7e.npy +03991062-f294c6f54167f608f5c37fe197319e1.npy +04379243-3083f8a34c6a2087a538396439009b89.npy +02958343-a8f7a7271a02fd56afe1d4530f4c6e24.npy +02958343-fa37419c844e77076489e70b7c61a054.npy +02958343-8d14c94dd325400d93b973d059f27e65.npy +04379243-bfd91773d0b2a32fd39e33fed94f56ef.npy +02958343-e673f203b40ef869567880160b3acb12.npy +04379243-ecd56b7b86c4d94ad1f278e1513f3b7.npy +04379243-a871ec9aeea7cc5ccb5cb7e88a8b34ae.npy +02958343-d224a01422266fc51b3c1c9f0ad4025.npy +02691156-1d396e76ecfd973575ffe5b08493cffc.npy +02958343-cd2ac3225eb36c0e1a04a94f2d5fba0a.npy +04379243-441bfde4486fb4cfc3bd24f986301745.npy +04530566-d65fc1dbe7fe802a5761a0b53ed37cec.npy +02871439-aa0c28ead04591cf85e5aa3b80e9875d.npy +04468005-ab084adb3157a8d44b0b2e6e63122009.npy +02924116-134537791c7e420180288501d9901d7b.npy +03991062-289ae5a92b072ffcfa34c1a2d1bce0e.npy +03642806-b6b27929b34cec44125129881929616c.npy +03001627-8c629a89e570c8776a9cd58b3a6e8ee5.npy +02691156-ec879d7360572a5db65bd29086fc2a67.npy +03691459-55e68ac8c812b332ce1db673cf70420f.npy +04379243-2d466533183daaf027cdc3d721fe0086.npy +04225987-47bb28c62a245621ad3e04762b7c31c.npy +02691156-1d6afc44b053ab07941d71475449eb25.npy +02691156-3998242c3442e04265e04abc9923b374.npy +02933112-247dfd279585b1b0c59350d819542ec7.npy +02828884-63a218005fa1bee7fd313061a14ce51c.npy +04090263-2d0eeaae7231064af4de29b99f103946.npy +03691459-bb1b387c674fdc4750577cf04f3bf74a.npy +04090263-2036799fd4fa273918ffe448c7d16fdf.npy +03636649-ab3e153cd23e992b576a354bb9319732.npy +02992529-758b9da6bf573838d214322c26aa0cfd.npy +02828884-c064a0ebde53de5ad5067eac75a07f7.npy +02773838-4e4fcfffec161ecaed13f430b2941481.npy +02958343-2b800f158324986ab6f657757c95f74e.npy +03691459-47d3fbf37d73e0bfb9b1918ad0534ba6.npy +02958343-846e6c678f53bf422e877e82c90c24d.npy +03928116-c7ab660e1fde9bb48ce2930380f4c6e7.npy +02933112-736e810b71d009bbd40c07d3c15cc681.npy +04090263-fb62b780ab54dbaab20f6e48f6a30cbf.npy +04256520-d6f95d8ef06e6db3ba0604df5d71bead.npy +04379243-5261950cc1cc0d2a9ccce4c6d5bb195f.npy +04330267-2de24aec04fa960a5eb64c1003065596.npy +02933112-56e1f35c70ad2859c59350d819542ec7.npy +03636649-169ee245f8ae927f5dc3653f8341633a.npy +04379243-ab10c2ec41e0e7f1391e4d6c585a697a.npy +03797390-e94e46bc5833f2f5e57b873e4f3ef3a4.npy +04090263-5a64d7b0677ea932d08e423afb7a8cd2.npy +03636649-4cf4ca85d2685b9b98d5fc0473d00a1c.npy +03211117-2a2369e8b0a139f67230cc2111ecdc77.npy +04379243-5353ec05576ed7c0aa7cb30470f3273c.npy +04379243-f98b9036a56fae4626da964cc0cf44a4.npy +02924116-7290270e8dc33f5bef54591980b8a426.npy +02691156-5a4c3f3af30e42e057891d676f728bc0.npy +04379243-e2ccba151d9fee85a71c812e027f94d9.npy +03046257-eb1bfa668da64d48beb12355e9e20a98.npy +04468005-b46cc19663effd52c6a67affe9c25b21.npy +02924116-6f4317ada701853d76c2a9de5c96f76.npy +04401088-72d3c4148500a7fe1bf02ad5664135fe.npy +03624134-820138b6742e713ddaf44b37a13dc4d9.npy +02691156-ac463974cee5a8867bd1a5c452e6bb5f.npy +04330267-3ea1ace396f6ccae48407a54b1fbfda8.npy +03001627-fe8b246b47321320c3bd24f986301745.npy +03636649-20cd92a6797a9ee12ebeb1e6a8111f53.npy +03948459-6dbc7eb805ad5830bb1cd7e49c28b731.npy +02828884-210ca657d9a1b85cb2a965e75be701c.npy +02801938-acfe521c412fcd04564c0afd61663476.npy +02691156-391b9c5bb875607c19ba010ddb4974fe.npy +03948459-990a4cb8e20177dad957eaf7f4edb205.npy +03001627-672a6459e7606b23532a8e162f399205.npy +02828884-c7fb65bd3bd09a852056b4bd5d870b47.npy +03691459-ebbb434aba6d7c271ad88f716ea80910.npy +03211117-c201c9ddb8493c15c3b69089417dba57.npy +03928116-ab86f892d8efc2f263920080bd2c2ed3.npy +04090263-ea4247ef739736199f433921788191f3.npy +04530566-9262aa413df7b369d735fa1ab17311ec.npy +02933112-148180c71c8ad4e3a1bfe809f99d2951.npy +02691156-297316f1c8a6f59bd007e7980e2b01ba.npy +04379243-fc8e92ecfc4a39a47149dc6ae5708157.npy +04379243-9ee885f08e0dd5273d154a49485f64f1.npy +02691156-14bf5197d60d733f2a3ecc4a9713cabb.npy +02691156-c85079e83e463fac65f50257ecdfa5c7.npy +02691156-41abfb4a9e8071754a40844f179aeca9.npy +03691459-573a662d56db6a9d1ad88f716ea80910.npy +04379243-7b8c92d0202211d53d098fcb46b95c.npy +02946921-9effd38015b7e5ecc34b900bb2492e.npy +02958343-9cd875a215c8806731b76be6623555e0.npy +04256520-8a4e1f7cc3bb76da9c9245e96a55cc5.npy +04379243-f96c029d342f72d6ae59128002f89f91.npy +03691459-afb32fcdbc6716b2fb14bc0c4e180ab9.npy +03467517-8a212984c1175c8fe2b49d4be00c74da.npy +02691156-41dca8046b0edc8f26360e1e29a956c7.npy +02691156-be11ce096084bd784f95630cc18536e0.npy +02958343-189c2b53ef76d02978a20fe14185667.npy +02933112-bbc516fd63703eee9dfa717f86ba8028.npy +04256520-a8418bfeae7c4cffaf802a9d0ab09410.npy +04530566-2ca06dc9165d4cdf5fbe3e7e4d41e98c.npy +03001627-3dac0fd995c747ab336e8bf2357c029a.npy +02933112-94b497f0a8606eb96dc1f81f95db52d6.npy +04379243-8627071fef9f1ccfc79fd92a0bf07e20.npy +03691459-35fa721c71ae04c1472cc88b92e0d72c.npy +04401088-baafe1add38af23a5f0b5b54dbc4f35c.npy +03001627-865551d21a4b2c09ad484915511ccff6.npy +02691156-1887d7e3ec69fe06a5cac89017eae8d1.npy +02933112-aba010c771d153069c7285ae7854d4b4.npy +04379243-2a34205ffef345d13002761e7a3ba3bd.npy +04256520-b6e744f896a202c119fb4103277a6b93.npy +04379243-fc731e1489031acbe02c30c9027468fb.npy +03001627-7dfdfe28e3d25a0d19fb4103277a6b93.npy +03001627-76de2f91710e9bd85f31725202dd5bbc.npy +04468005-861e13b787eacc236568be7ac7858e63.npy +03691459-c3d845c1fe644b39b6ab6d583025c7a1.npy +03001627-61b76525022f44fa9f2fd5a6f642de3d.npy +03001627-40e603e93818760fa7e431436fa7573e.npy +04379243-66bda56e82bf90a677ceee024ab73ab7.npy +03642806-d7e7e6651a23afc68ba4e518219eb66a.npy +04379243-8c68ea99b5de38d3a6d7a9f3c5f7bb41.npy +04379243-92aab082da6375cf5b9744d121bf802.npy +04379243-ab04df0d02dd6126c183308b9aafe2ca.npy +04256520-8f784e9c1bcf3f04225230e9f2d3c8a7.npy +02747177-b6833a66eedf457af155d75bbf62b80.npy +03467517-7027bc171baae1d663e148e250c0340d.npy +04379243-2eb4a0d015b80a8d9ccce4c6d5bb195f.npy +04468005-e14470a10179d300e810c01b1498aa2b.npy +02843684-11dc4e10ef6e592f1aab8791875b3551.npy +04090263-d27b357966e47647f8fb6cb99631d97.npy +03001627-d761518bcbcefa4080067e3fdc6db24c.npy +02933112-13d5f9d6a7464e39f0f01f1432a517c3.npy +02933112-de30133b2550826647d37c7945792fff.npy +04401088-c1ae3b758aa9ea5e6dba92a4e2177102.npy +03467517-5d629c65f490d33063e148e250c0340d.npy +03636649-e365a641480635d330c09d86acf3d5c1.npy +03467517-5715a289185f284dfe12fc760976ec8.npy +03001627-44875441fe578186d35ac2e5000061ec.npy +04379243-5db63af675507081118ddfdb81cc6068.npy +03624134-ce57682fdc1209731395331ebe4786cd.npy +03001627-8d983a0adc059082b300c4ca2f51c01b.npy +03211117-586b4ef8eb5a59b39bd9aec93599c5cd.npy +02924116-9ec180fe80e8d0d46bf1727fa78b974d.npy +02958343-e4bc9cf3aaff441f19d740e0f6a9a113.npy +02691156-67636e7d15d082089412a62cd6b1bf5.npy +02747177-200b3f3d859c8677ad5067eac75a07f7.npy +04401088-c06c6362fc6d1c9c5677057f93c3c270.npy +03636649-2ed7e410931f984cd59517820ada1bea.npy +03001627-f3f0238ae8d9ba8dc8687ff9b0b4e4ac.npy +03001627-c07c96f19ea1d431d4f67da0de6a1054.npy +03642806-9c6176af3ee3918d6140d56bf601ecf2.npy +04379243-fa6952fbf7f52682aece045e8bdac80f.npy +04256520-89ce842fbc7c786d2d19175e7d19b7cb.npy +04530566-254f1c0cf13108c46c63b8b48495261a.npy +03636649-a0e4661a3c458405899bad344dc01f2f.npy +03001627-de3e082195346ca419fb4103277a6b93.npy +03001627-f1c390f2a04d13f6742728b30848ed03.npy +04379243-da9ae22db57775cf67cda8f7f78d0d19.npy +02828884-cbe802da10dcae19f155d75bbf62b80.npy +04256520-9484665b03423168fd1e5a951c425f11.npy +04090263-5341d156f8af28966a52e97955091b6d.npy +02691156-675a2332a973401f6376dff6c42ab2c2.npy +04379243-3de49fd2e80f8c95c97cfc3e8a6b1d16.npy +03948459-56a293cf1103aae4c6e34b38e9a5066c.npy +04256520-6971254cdae82dccfebad4f49b26ec52.npy +04530566-fada91842e68dac015ebc00dd3588bef.npy +03691459-7e63f06b3c48fadfd6d49cce41472b6e.npy +02958343-d3d121f2e2d57b5cc5903e2355330295.npy +03001627-6f8ce08e77bc27cedb4331c656714a1b.npy +03691459-be2df150c86b57d2c9db3276cf490d3d.npy +04530566-6c1c628f4ff60addc5b0cf694baa734f.npy +02876657-abe3a232d973941d49a3c1009fa79820.npy +02958343-819b98c138192c88e5e79d9024e2fcae.npy +04379243-d26f2c85a4aafa72db6f3ca49e992ad8.npy +03991062-e53e623e49b97bbd72652f4081ec5a77.npy +02808440-cb4d05a8749093ae3321831d2245cf06.npy +02933112-68220c134171d105f0fb3e3d2a0d34c9.npy +03001627-90c8ae65e3ec4ef119fb4103277a6b93.npy +04379243-4f8ea79100a324b77445d25f394949d0.npy +04379243-f4fb644d5c81e60e1a1485fc0329e88d.npy +03211117-48f2b6c3c82635c119609759f8339ed9.npy +03467517-a19fe6a94d0c6d2c56d301ea6c7f3155.npy +03325088-2f46e4d513207150b362845c6edb57fc.npy +03691459-50b1f4e5a130dafbb5b1048c702c9b77.npy +02828884-6df5b51b250a823b147d36b9f2f13116.npy +02691156-8c0c8307c5de1b65ac96c03d6280efb7.npy +04530566-a4d9445d191c80a235a6b421c152ac60.npy +04468005-858da2187b0dec8152470de2774d6099.npy +02933112-a8725dd0e0eb8d7d492d9da2668ec34c.npy +04530566-27e9a27b6e3b49c227ac692756be9e24.npy +02946921-ebcbb82d158d68441f4c1c50f6e9b74e.npy +04379243-9c09df47d2aca46ed6f21f7a864a309e.npy +03325088-ba9606bd6aaf2f0a50da8b99982a3057.npy +02691156-1b171503b1d0a074bc0909d98a1ff2b4.npy +03211117-181bc7c78185f30516a6c448fcdff967.npy +03938244-e973f4a81707004ef2197da8dec8488d.npy +03001627-2773ae187d1e9d3d504721639e19f609.npy +03001627-342d41101756553eb3ad032acba61b79.npy +04256520-4b24bbd3cb03206b58db0ef36af1d3c5.npy +03636649-2e583ea74f46aee239b3360f500ac52a.npy +02933112-8928e0f1fdd7f107f975e70a1bde427d.npy +04379243-34ba7b78ffcf0b46d30ffa15d9c1eeb4.npy +02933112-8ddd7f1e19ff809abe81a9109a782712.npy +03691459-c91f926711d5e8261d485f425cc21556.npy +02691156-440ac1b4ac3cbe114c3a35cee92bb95b.npy +02691156-d615a8217b70af06bc0909d98a1ff2b4.npy +02691156-70295db03521e219a5be3c7b80fdc3d.npy +04256520-a73a49fd2887a030f51f77a6d7299806.npy +02691156-b72804a8bd3dbbaca8607f540cc62ba.npy +04379243-5f3fd62e285aeaae4e2090b842effe89.npy +03001627-b8af96d9c542e1bab34e8f502d7c7e1a.npy +04379243-ad139879f97c141e1ac9af6c714d1419.npy +04468005-fb26c97b4f84fe5aafe1d4530f4c6e24.npy +03691459-dd57cef71e09d11121572f6a2d968d88.npy +04379243-6fa34794adb6acde24dca86ff4e91ac2.npy +02992529-73b87e2025cfdb6daf19fa8e8218bf64.npy +04256520-3d297a9092136d914038d588fd1342f.npy +02958343-2668f2d9b8a2daad95551e0d9e50cb0d.npy +04256520-4538a9c622fc554dc048a125b47d14c9.npy +03001627-b8eaa2fca64d7e4da52ed1964df255d7.npy +02818832-cecc7a6677eab8accf9f37ec17841254.npy +04090263-ee4ccd4b40db28e2eb068a83f75a6c3d.npy +03211117-dbc61cbed5f7f2b33c1abb78f1519c49.npy +04530566-731b8fb370639bec2c8b4a1ac32beb2d.npy +03325088-3a86bbcb33d39bc72636ff7d41908032.npy +04401088-9e98174951026624164c8c77555f8e1f.npy +03001627-7facccfa81369078a8930422448288ea.npy +02691156-7526757d0fdf8acc14f1e6f4f4f49b.npy +02828884-95eed587c3728d22601104cd2d998272.npy +04379243-6ae77e7aa510e044c955e5ed03ef3a2f.npy +04090263-f30464cf9aef3abea7f9996575f1f5f7.npy +04379243-2b40fbee96b93a5eae25f6fe802a8997.npy +03991062-f4e2f7d4ba0f8af8c7c88564709ab8d9.npy +04379243-c927a92a2ce0be7030bbd4cddd04c77b.npy +03593526-a263bb1f29feb8354dc11e421397c795.npy +03261776-b14f3ad3044ae1545f16c469ffeb982e.npy +03593526-c067e10ee057104abd16d4490a10a752.npy +04090263-9b0867286d296d3934057837e526fb02.npy +04256520-37b94e004ee1f7847c63c1e5173c47a8.npy +03001627-287413404880403751e5a8425285015a.npy +03211117-898073ee0a493fed4c58a7782e1dd690.npy +03325088-3cace6ee49f5bfb0b362845c6edb57fc.npy +04256520-fc7b96235eef479075becd8a4c3f1866.npy +02933112-931fcaa08876700e788f926f4d51e733.npy +03001627-cdc2a53559d3db78febad4f49b26ec52.npy +03001627-66aea803dc4a6c5390907a4c1a185a7.npy +04530566-7be86a514fd217dbc91817453f80389d.npy +03991062-af689238ec306deecb2a965e75be701c.npy +03001627-3e34987bd5e7cf0e6c5cd45aa112726.npy +04256520-a00bdbddfe3511208dd711af5650bdcf.npy +03467517-6f480a2f23eebe9b552ddced979ec9be.npy +04090263-1fa2cbd03c1d57829f7e0a8a6309376.npy +03046257-8944ac6e4a7ee7d1e47b5004844debd8.npy +02958343-20e01ed9c14d4659e61b9ff60b1be412.npy +03207941-2666ea267824515b6a047293eefdd617.npy +02958343-df1d1694cb98584cc23e2024862e7f3.npy +04090263-8c43f0fb829887f972cad024c77ecfb1.npy +03211117-14a02f4475a5df5e337758c9d9c83ebe.npy +02933112-68bc79caeaf162a7ce5d6e9371bb5c33.npy +02828884-bd40921448838cbcb2a965e75be701c.npy +04379243-78a144a7c0f60dde744107c67e903f9a.npy +04379243-91763ac2faf129e9b35bd41c666704ac.npy +03001627-3026908df3400c1a11d9b84664f8595c.npy +04256520-ee7ffc0b1cead515b2cf0fffc23ad5.npy +03636649-4bd69765d13c26ee29a42a0444436860.npy +03001627-6e1e73e14637a28da1c367d7a459a9b7.npy +03001627-22ff2267856b5d369158e0f216b27548.npy +02880940-80608e58db79d4d83b722c86abee0751.npy +04256520-77a5f44875119a6b5369e32fb818f337.npy +03691459-a288498f21acdedb2a65278501cfbe7.npy +04090263-10cc9af8877d795c93c9577cd4b35faa.npy +04401088-4cbd57cc8e6aef9f2ed91d160fd4ae97.npy +04379243-4d5362a8446fbc8f8cbb8bac2032149c.npy +02843684-f04ba261ea073ef9390cc49064ed7b4d.npy +04379243-f6c5bf92d03a93e247839bae1bc65257.npy +02691156-8ddc3bfd5a86d4be2e7c68eb5d1b9123.npy +03001627-2ca6d10b1ba99fbd9784ddd96453bcc2.npy +04090263-61796c118778fbddd0bc9224a67ebcda.npy +04379243-11cf833ad0f8ddc1a6f925961cc8367b.npy +03636649-13daa0657f5c3e32cb0c0d433974e32b.npy +04379243-7b5b7bfa8580e913e2580b23e60e4674.npy +04379243-51fd921d3703b86381289b3cbd650b9d.npy +04379243-be025ee89a077c31a9bdc22a1e02e82.npy +03001627-d7ea1356ef7664e2ad5067eac75a07f7.npy +03207941-cb469755f7d9e486abb564bb0657e0d6.npy +02691156-be92048655bc5b001d4c061b53288f62.npy +03001627-786c20111b691c152b4875f731f71cd.npy +03691459-c94dfdebffb371022b75817a0faaa5a0.npy +04379243-b60145d7ace5fb53aa7cb30470f3273c.npy +02691156-2229bc4e646f506679f56e78e8640bfb.npy +02958343-39279457a4bc87285e717a211c863fc6.npy +03636649-c080aefc6cbff8c81185ac82ed4da80d.npy +04379243-285857e7d12f1b74a4d2a71d4ca57f99.npy +03636649-d6ae7a5542800519fcb8d8c6d4df8143.npy +04379243-6f1594512b88901798fc1d0403f6ad0.npy +03001627-9f212a5127b4544bbe3ca6e34dba44de.npy +03642806-3b9a99663babc301e2ce1e6d2467cb03.npy +04256520-de2bb45b7e200d6916d102513d0383c0.npy +03001627-6e1dd008531f95fc707cdefe012d0353.npy +02924116-b7dd213f86614a464a166e19dc7bdc6b.npy +04256520-7ae657b39aa2be68ccd1bcd57588acf8.npy +02958343-ff267b1a6d986426c6df82b90873315e.npy +02876657-898101350771ff942ae40d06128938a1.npy +04379243-7c7434a9db4a407a2b151d8b52c53b90.npy +03325088-a159b9589f58872c4170d40a78a51640.npy +03001627-3b4292989394ba62f51f77a6d7299806.npy +03642806-342150823878f1ec9aeacfc2a1a52243.npy +04256520-9df9d1c02e9013e7ef10d8e00e9d279c.npy +04379243-7f837553c70b2a63684b7bc3f8a9aa55.npy +02828884-8a03039b614b41b319fb4103277a6b93.npy +03593526-ffd399fabbe3c6268798e1381538cb0b.npy +03325088-1fa06b97a0498b3ebb201909fefe7321.npy +04004475-598ef206ffbed1476307a98defed0dd2.npy +02958343-2521a90182ccc29c253c03b7df20edd5.npy +02871439-f081b7f255aed00053d040168a517ac7.npy +02958343-f34c03711c3fc44ac10e9d4ee4bae4f4.npy +04379243-5430799502754b5691fcddfa9c1209c7.npy +04554684-33d3f4a7b2df861248bfbf0a3bc453a5.npy +02691156-542a1e7f0009339aa813ec663952445c.npy +04090263-460ad09b269895f73f82da5dbc1a5004.npy +04256520-75b57fc1eb40d27114e19520b26970dc.npy +02871439-e7e3aacb7ef4ef00f11caac3db6956bf.npy +02691156-362af793b1d0084423fc69eefd95e6d3.npy +02808440-bdfb4d590b4810f38d90c09521490a5e.npy +03691459-2dd5a69034a03d267aec59a4d1722658.npy +02691156-fca40e8cba1e5fd75bba9363f40680af.npy +04090263-1e57dbf3e917e55c25ef5089f95ac09e.npy +02773838-3077a9b76724b6d35de21284bb515a83.npy +03636649-fd8f9cb134743e0c80bcdfbddc82df7a.npy +02933112-ce85ce0eb106d409b8a453d61eaf046c.npy +03636649-990aa9dec2223f108bad9bd0c4ab8e3c.npy +04379243-9d90a58677e619f94b8710a3469971b1.npy +02958343-4f17af1ca7ae689d409b2c4484d833cc.npy +04530566-79803d0a02bbdc93ff790997f2048517.npy +02691156-ed95d9219432bbdbbf3143b1cb6076a.npy +03948459-6aae44dd39fb9476f059c10da31213ea.npy +03001627-d6579d7c278cb9a47f093285855bdfd7.npy +04379243-972ff7998554988ae6c5cd45aa112726.npy +02691156-af71e72822241808a8ab13c300600dba.npy +03636649-466af3262bb31094c35131da26f8061a.npy +04256520-a47c0cddeb15490cca68d7e2f215cb19.npy +03001627-a7b82d009e29bafe705fef512417e4c9.npy +04090263-152f03b7d3eb03c8276c3d558130f8b4.npy +02828884-4ec290c73990a82aad5067eac75a07f7.npy +02958343-6a23da6a9ab0771caa69dfdc5532bb13.npy +02933112-33445d9d7f166d6c5588a2543ef0b0b4.npy +03001627-619a795a84e2566ac22e965981351403.npy +03337140-9864a3d01b9627e94c3aee8e9d3a6ffa.npy +04004475-4641b207d1190937fbe68c7a7c2ae4b.npy +02876657-a34966853ab2272ab2047d3072d5e051.npy +03211117-52a7f3e36d09848ca63c1bd05197cc.npy +03691459-3972d44065257859c0b45c582c6ed736.npy +02691156-bbd1b96d77b8dc08b96212c8f6cd06e.npy +04379243-3f843409e853828803734eb00d01e20.npy +03046257-57df2e218911273d68661782af60b711.npy +04530566-ad8623ad47d72317eda0f8d4b3ce03d.npy +02828884-135765739f0cb969f155d75bbf62b80.npy +02773838-dc52131684ed9cbbfe4a8257a424ee86.npy +04379243-e9a1325245afff7c405d9b5bb7b18be5.npy +02876657-63f60daa8d254f445200bdb78a83bb9b.npy +02924116-b70e1062c67b159367f73e2a1cdb19c9.npy +02691156-67217ee1bb8443c8316b8b2265213f7a.npy +04379243-d2b7b34e176262513521fe8ac6222005.npy +03636649-27436a813a1abe835836c728d324152.npy +04379243-ba68b45f1cc9038abeedb4c8fd29e2d1.npy +04256520-cf651d12e2048e1a4b3c42e318f3affc.npy +03636649-a1a8616e38e5f684fcb8d8c6d4df8143.npy +03636649-e9b1b74a44465b8b192ae1372f64f330.npy +04256520-bf28dd5d38900b1314038d588fd1342f.npy +02691156-7a3392340af9ec7b62b600da24e0965.npy +02924116-4df2284d70a36be2dc033f2a4b1df7ba.npy +04379243-6fd5741bbf559e0ff51f77a6d7299806.npy +02933112-92ef2c5091a97df18a6e1efe1f5fc0a3.npy +03046257-abbde103685802186e71174964d90e49.npy +04401088-1c3795fd5c4c0a3c2efb70bd2c052734.npy +04468005-d2eb4582107f4d8b929629f626be0dd8.npy +02691156-87fb26b8e56d25f2b87697d3904b168b.npy +04256520-4cd14d58eff772da946789884353d9f6.npy +03928116-b170bbec8f10e7ba5a64dd604e7f66d9.npy +04530566-a3109a4b09953b5e2b141dc6bd7c4bce.npy +03001627-63ac45ba2c2231d155f9a00acc25f137.npy +04379243-bfcd5d38663fd5338738e7290b6f3237.npy +03761084-6888d8702b758476fc350be62d126bad.npy +04256520-81c3f54ae8f5c434970d4dd67731c543.npy +04530566-d7fe3d95cde66115874f0e42f84eb4f5.npy +03642806-b272eb1541844f55ad7b15cd0061e5ee.npy +03001627-1d99f74a7903b34bd56bda2fb2008f9d.npy +04256520-5015912352daa0113e2f5d8f8875fba6.npy +03001627-c5abc457162ec704bfffd5d6a62e360c.npy +04401088-68b80d0086322ea33615136d92a66ba2.npy +02933112-953f545f33716fd01d860ee2ad2a42e1.npy +03636649-b82e5c6e1133aafedf6cfab91d65bb91.npy +04401088-ae7b93f3ea4238712f20ec3aefa0fb91.npy +03636649-2f972bfe152e4c23f36ea1eb6542fe7e.npy +03636649-15238270f4f59a011b17743c18fb63dc.npy +03691459-a1f0c93f000051c7f1aca3fcb64b7fb2.npy +04379243-2a5618e34de3e26a20768660cf080d12.npy +04379243-5b2fcf551345b64bf3412e3273fc1682.npy +04379243-4d2f7c689e77df6b6dc1766995c17a41.npy +04090263-851afe676885dd1dd5c93d34ff51959.npy +02992529-cea8f15682797fe6eb386a4e845c05f5.npy +04401088-1727e7aeb3d159a57f521a3dcd28e9d2.npy +04379243-610709315a0f542552b3505ff8f3d685.npy +02992529-996fd7ccc0567c3c6b2ba76eab0d2b1c.npy +02828884-32fe3c383ab3687c94c13f8f78a6d62.npy +04090263-8d65e71e5f925fac58dc97820d1d9537.npy +02818832-5f9dd5306ad6b3539867b7eda2e4d345.npy +04379243-2391f652acdb73dbe958df2e8332e31c.npy +02958343-5316fab78a6732f0428df271ebc70bc0.npy +04379243-b82e068c2c18cd67b09f0ca9c143fdfd.npy +04460130-7f38c8033cc2f0854d423544e7c5cb27.npy +03691459-a543d9e58d4501422a9eb0f146e94477.npy +03001627-f2934658407472a92ce025aebfea84a4.npy +04256520-4991f4fe771cae7f18b14db3b83de9ff.npy +02924116-38213f1b26479fe87586f47a860969f6.npy +02691156-1954754c791e4571873ec74c119307b9.npy +02924116-3e9d38a3fce2070312aee40928395cf.npy +03001627-cbc9014bb6ce3d902ff834514c92e8fd.npy +02691156-4653be69e215a1a4b378822897b79a81.npy +04379243-678f7fe1c4f977927e9fb8aa5670f37.npy +03001627-7dc902a12843fa60e84c9243a4e577f.npy +02747177-6d1aacdd49c4bac781faebbdea6bd9be.npy +03211117-9cdad8b178d7743326782c9200ca97fc.npy +02691156-6c36b0f84118a75cf9c41a0805a0d953.npy +03001627-6e12481d3158dd4e8f8c11a24c52ebb.npy +04530566-bb79e21e85306ba19e51f6d13f6d609a.npy +04379243-db49ebac740bdb91d016fde69633b7dc.npy +04379243-c26dfd3453d81bf7788eb1f5e7ba6e7b.npy +02843684-65b9d72427e109fa1d531071e42cd4e.npy +04090263-82c241396ddd0232b3f2a90d50e9caaf.npy +02992529-2d26f853e710b3e894088ff49a6baac4.npy +04090263-da421715af11fdb4beac07ad11d3663a.npy +03691459-bc6dd957c20a08f67b440c5df8efc309.npy +02933112-9fbb34244e00b2a9eacb155f400b9076.npy +03001627-bf52432c9b1b5e11f98c0761af40e04.npy +02958343-ff564f7ec327ed83391a2a133df993ee.npy +03001627-7a712ca74183d8c235836c728d324152.npy +03001627-3aa228edd648d1e1f51f77a6d7299806.npy +02958343-2ec9a7479a8ece30ebe23ea7d95f2a30.npy +03691459-4e6e05676ac77f30ce029fab54b6cfbd.npy +02691156-6ea4e68428cba49f68557927e45c29cd.npy +04379243-5407f938370ffd34390dcdc075aa60c5.npy +03001627-19e2321df1141bf3b76e29c9c43bc7aa.npy +04401088-420138dffb14f929f0b45b4b4c7e33b7.npy +03001627-cf04f5b16aba20e3e3849910c5019154.npy +03991062-23dd0031ba0db00d1a08ef511bce5615.npy +03001627-31dad882e67008adab1b53c63e6e87b3.npy +03001627-77105ec0251d92a8ba13aa51cc141639.npy +03001627-75a2cfe5b82e03d2fb0eb7e753c06942.npy +03636649-eee7062babab62aa8930422448288ea.npy +04379243-3adaf5ec2c9fa6fef7248d9dbed7a7b8.npy +03211117-31f6f2b4bb6c524cab1a5567c60e2688.npy +03513137-a50fdcc3128ca95c663e90eaf6b4ca52.npy +04256520-8fd43f2955e4d397b822d48a43773c62.npy +04530566-567e385bc5c40247e414f982f9c422f7.npy +02691156-2af04ef09d49221b85e5214b0d6a7.npy +04379243-b1cb375e7f3fe171c242632b2a8c3129.npy +03001627-5ea01d852c88e30a6f2222642bd41c09.npy +03467517-cda7995e00026129e33462de7b4c569b.npy +03211117-54f5393846bbdc64e34e21eb7fabb319.npy +03691459-6abdfb1ca4d076a09c4dd878242c44b7.npy +04379243-abb8d6d056f48eccb8015e57f308c60.npy +04530566-e6fa4d02d2df5a9b1bb46d2556ba67d.npy +02808440-752f091bd4264d2fce772b67783de9cb.npy +02691156-ca6e0a1d5cfee53a8cbc4ababb61ad1.npy +04401088-9e5b9dd860689c5c217f93816a639386.npy +04379243-892e2630024144f94f29aafe46fcf418.npy +02828884-bd39e9a5489f89c8d6d3866b78fd4902.npy +04530566-6419254bff42d878e820a92cdd43b76d.npy +03325088-53270b19da085eb1b362845c6edb57fc.npy +04379243-1264d88ae599df3fbeedb4c8fd29e2d1.npy +04256520-429d58759c85f4750276e25240d21a2.npy +04330267-b37d8ea38b1438f6fddd891c70a6adba.npy +04090263-1c1008be00fa5edb30dd2b88f7efae34.npy +03636649-44eb1db902d44daa30f6e0ede20c4525.npy +03001627-6d83067056915f4dd2f15044a9418e0d.npy +03636649-5b744ac897fe8bc557f40ff86fe708ff.npy +02691156-6720352c366eba1a60370f16a3e15e76.npy +04379243-e055a8a5d8ca0b9869df3aa2bce421f5.npy +02958343-498b7c799350d1f7c4acded0fc8a9118.npy +04256520-f15d3637d11e93f5dd17d7a192a3a64c.npy +02933112-62f5c85919a21aee7868105076bde789.npy +03001627-3230b6c7f396afff19fb4103277a6b93.npy +02958343-383f8d508b6f25f565d21723f535417.npy +04256520-192b06cd91bf659ce3db80a3cacc6e3.npy +02828884-6a7ea728941d3f4f4fb4dee5181bee.npy +03211117-c57f3b53b19aec84713decb1a0563b12.npy +03001627-4e4570768f981ca7b95617254e8005c0.npy +03761084-b92829a039380e31cf7f052999a00e5c.npy +02946921-129880fda38f3f2ba1ab68e159bfb347.npy +03211117-c4c15ab5dace66f81ba1d2ff478f3057.npy +02691156-a2491ac51414429e422ceeb181af6a7f.npy +03636649-399573561336a341b754c9a53619150c.npy +02808440-35a0ea7e7f9eac13321831d2245cf06.npy +04379243-ddc16ae1263d506c955e5ed03ef3a2f.npy +04090263-a7b3c912a793ddbdd107072754c68ce7.npy +02958343-5d2e0f8fa5d5bc1496bb71fec38e082d.npy +03325088-808b5b4a67f645db362845c6edb57fc.npy +03593526-4b16d8e3aa65a107e9814058bbcd7b44.npy +04530566-9a7b0effb53375625f647c1b0a6369bc.npy +02828884-d9b39a2a427c17ed43d55fea640906fa.npy +03642806-8d70fb6adc63e21eb7e0383b9609fa5.npy +04090263-172a4e03c151d14a9f433921788191f3.npy +03636649-98d0f886ae05db5af54f0f3959ecff67.npy +03325088-c6815bc73e12dd1f8f64d37593728c5a.npy +04530566-7551b29b91fa4d47ca732a92ee1dda3b.npy +03001627-3f55eca70a6ad5dfb4f2d409b6697059.npy +04530566-ab6724e38aa593602a99899765aa8dc1.npy +03001627-60790035c8126a677645b4fdaedbc34.npy +04379243-bf9d12b9a6a79eed342501391dc44531.npy +04401088-350dad20c76cb54b7ad5140f7d56e11a.npy +03797390-d0a3fdd33c7e1eb040bc4e38b9ba163e.npy +03001627-56184b3a4ea198af7e14b034d75254c9.npy +04225987-aa2c5469590761793c497dcbf6659611.npy +03046257-464a76c004ba77e8cc14b65ef8ab235.npy +03001627-22cc9b68e67339738d2d730aebe7865d.npy +02992529-90010049891220187eda1e12bd28fb7.npy +02828884-93e43734f99c7ca6c42fa56863e48020.npy +03001627-fed8ee6ce00ab015d8f27b2e727c3511.npy +03001627-d90b1021dc6e09b455369e3e5b79b017.npy +03593526-3074ccca5d98c71c197894d64e83a327.npy +02876657-7a82a497bc4d10511d385f351a1d14c5.npy +02691156-7e8be9c88e596b84198609c994ea801.npy +04256520-6f0b36b76bb0946ce642ef37786b5c80.npy +04401088-10b3b46298af96d40e7407386eaee0f.npy +04379243-941e751844d8b0aa8b424343280aeccb.npy +04530566-97402ccd78c061251141cd3611961b0.npy +04379243-4d4eedf718daacf945714140d50db61.npy +04530566-4690184ef7ea805dfdd29529d1a15514.npy +02747177-a513393efc093c7cb00bfc975577e7b5.npy +04379243-b814241f84521f797ea323bc74055b8.npy +02933112-7aa00b5d006a7e8de6860aa648421493.npy +03046257-b5c200a23c66bfb4617724635ed7cc4b.npy +02924116-931f70003561699ea8d89e4d21910b0e.npy +02992529-68189c0fdca1a8744db121a0d72356af.npy +02992529-e06b902efc1576c62fd4061aba358325.npy +02958343-b8d3a079edbc04fe51a95aaa6caba1d3.npy +04256520-8428d483ba327a2da11f6bacf5c7662d.npy +03211117-dbcd5a88a9d4f1d7579cfe4420588034.npy +03691459-3d7e4939b677bd9f3670cf6e57497e9a.npy +03001627-7f9733a6370440dcc8687ff9b0b4e4ac.npy +04468005-3a20481892ebe6a0e810c01b1498aa2b.npy +04379243-df7761a3b4ac638c9eaceb124b71b7be.npy +02876657-b198ccb35182e73ffd2866d52d2e8042.npy +03636649-308bd35d5f52de4e57b8f616df7adf9a.npy +03046257-29d4598fa30e51958e2b55561bfbee30.npy +02924116-9baaa5688e83f884f4d6cfb91981e4c9.npy +04090263-62fc2e971d8023e61a6fae073bf19933.npy +02933112-14864858c05f52ec4da5feafe6f1c8fc.npy +02958343-40c05e511efd3fa96945ae93118ea9d6.npy +02958343-63cc90709837d314a0b2db16370345f0.npy +04401088-52a81d42c352a903a0eb5a85db887292.npy +02828884-abd7c6ee28e19480a00f752d8c024637.npy +02871439-65f8af76d8e4f477c6baf9d9782f25e1.npy +03001627-c2e50f21663db36af8f5708c6c7585cb.npy +02992529-4ce4f7fcf5f0c57a3caebb882f007959.npy +02747177-db9d164a58b37117ad5067eac75a07f7.npy +04379243-be461a1a083481c8488017d48a7f7eb4.npy +02992529-136ef91c95ca5c2d4b9a4e1a888c5f59.npy +04256520-9de6e26211d151931ae8c8ff1eb3d45.npy +03948459-c6f8a4781d8a5b228c8cac88a8c48208.npy +02992529-9090bc906ec8d80aca54a3214c333cc.npy +02691156-cbbf6ca6a621c5f9acf77e718d93f3e1.npy +04379243-3c1c6695e665ab474b8710a3469971b1.npy +04379243-6c081d6351e07db937251258858a7a58.npy +03513137-ecabb65ac86924cfea1118e44682a5ab.npy +04004475-322a2ab28ff01dc496f0bcf2d61abe7.npy +02992529-388798a892636235d2a526c0a7ff71e.npy +03928116-ac47e870aee0ecf5c4dbe872a948b23.npy +04330267-41da6df6f2a4e48b5e4e23ed78187234.npy +04379243-faa05897ccdaa0e4f51f77a6d7299806.npy +04401088-6909da0ff58823615a82137b384b94e.npy +04379243-e440f87f88335680b20aa91e9e90c311.npy +02933112-2b6bd6e0b3c2565839d3717288022c20.npy +03001627-96af52c34e42b546cd2c9316e943c316.npy +02933112-10798ccb7072393e86d53ab0fe94e911.npy +03948459-2e3a11f4328843dc61da9de756ddfd97.npy +03938244-1399af537cd5f80723a295070ca176a0.npy +04379243-b3e92f795bfea504492d9da2668ec34c.npy +02958343-25a44213579e75782e877e82c90c24d.npy +04530566-e27fc8b68996d205f650f4803ec7962d.npy +03001627-3186f9dd5179358b79368d1198f406e7.npy +03948459-732dedcf453bcf0615ea1d7806d654ad.npy +03928116-a8b047e1ccb66c889e4f174839257564.npy +02933112-2f12c90e2001a0bfd7bd133fd14c164d.npy +02992529-8b11b38e035143ddb007a3ad40c5add6.npy +02808440-f2ef257f008b08277f540470fee080f3.npy +02691156-ff725af6df1b76207b164268a44f7712.npy +04379243-14b96e25f93105674ee71d2f70ae4021.npy +04468005-30fb22cfe7db9dc7ad4ca49782f6b451.npy +02958343-88c884dd867d221984ae8a5736280c.npy +04256520-8603da907b2d1bf0a9c6c82c1fd82c5f.npy +04090263-60a861a5b416030a93153dd7e0ee121c.npy +02691156-fa7cf8d11d1340ff9a6e43b878d5b335.npy +02691156-1dbcb49dfbfd0844a480511cbe2c4655.npy +03636649-2ac7f0509507c6cfbaaf4e0b7520fb81.npy +03001627-29d5a6ae911ef708f51f77a6d7299806.npy +02691156-22d0100fa46f20eb8699933784576e73.npy +03001627-cecbaaf284d32574e669ded0ef71cc0d.npy +04090263-a467801481b450b8cc34b900bb2492e.npy +03467517-9aaad035af7e6ab1ed724609df3eb104.npy +02691156-617259db5ef0b9f8bc0909d98a1ff2b4.npy +02958343-c09c9e2d85df1abf6a3f171e9d98eb02.npy +02958343-c769d45be62178f516abce8cb03e7794.npy +03046257-e67f610cafeb2c0dbf93f50e43a43f7e.npy +04379243-ac35b0d3d4b33477e76bc197b3a3ffc0.npy +04379243-796fed2b90efc756dad3b08da15912d.npy +03467517-aface94c7aeb373865ffdcf45b6f330c.npy +02828884-be9c2b70082503eb352fc7e973ba7787.npy +04225987-a6d79366eefbfa6df9034ea5f524d56a.npy +04379243-82e47329faf11e5c7235016c2c2c8150.npy +02808440-9c72e9c273fa91701b5647ac5820a290.npy +04379243-f714747e5abc01cc14038d588fd1342f.npy +03691459-b8da73245beb77848d257d2dc106cc1e.npy +02958343-1c1bd2dcbb13aa5a6b652ed61c4ad126.npy +04379243-3565f5bce51b333e9b19181a19104021.npy +04379243-8c3c81a802ecdc45609fb05dbd8681bd.npy +03001627-1767c5e3771b0510f5225bf5a419e95.npy +02933112-1252e89db37d786386d53ab0fe94e911.npy +02992529-ef16dd3bd944608821844676433a0aca.npy +04379243-b079b8fbb6199f0eef53a66b4f397367.npy +02691156-e30e25fe047ce1ea10b08ceced9a0113.npy +03636649-c414d046062b529ffcb8d8c6d4df8143.npy +02876657-712b597f47b04755f715d98aead3ae6f.npy +04554684-4bca315fd61741797fb96900a295055a.npy +02958343-f0d16187cae178e7e9d8921ebe6d5b8e.npy +02876657-8a980192662f95b84f42eadbd9a0b820.npy +04530566-8b57b62c984575334f89761f054e2019.npy +03691459-bf27f6d33ea63c041df7ea94ca903361.npy +04256520-bc007cba6288e3503790005cfb7639de.npy +03001627-ea762c2f1c6e966be464faca7dae7fdd.npy +04401088-e1a4ea72b1f98e92d265c94f4d41d924.npy +03593526-a96b8f654eee2e8168825f3d0ad04fa.npy +03642806-5ea74fdff0f69a60546d7b6431984ed4.npy +02958343-73723a79817b594098c11e8f05368fe.npy +03691459-4e8eb4a0a6dc83e0c779d976f4b3d7df.npy +02958343-278f301a4ec1382865306f052698c1e5.npy +03948459-89bf5ef4ec5f275a70eabd84d42e060f.npy +04554684-e3c637980c8c22eaf4a3d771dd0a0ffa.npy +02691156-cfd42bf49322e79d8deb28944f3f72ef.npy +03001627-86fda548f0fde39328f80188b7c24dcb.npy +02828884-84d0db8ad40017a195c500dedd6e2c23.npy +04379243-66f1182a5e4dcdf9ccce4c6d5bb195f.npy +02924116-a32145f859e16c791bf41075ed1aebfc.npy +02691156-64e36b948869a79683653a771e25099b.npy +02691156-15442b53631b7e88232438a710acf1da.npy +04530566-28c2e4576e53da5ee25f26a257fd7871.npy +03991062-125ef534450afd4de770d8514271b45e.npy +02691156-c94efebebb2eaefcedc8262267425d73.npy +03759954-b4df512cd2ecdef445eaf8d7198d3016.npy +04379243-425e21671035806ff51fa0238791f5dc.npy +04256520-ae69ea12f45b428a327289c00b6dc9ca.npy +03001627-fe5951beafda9dc5b76982957f05710f.npy +04004475-a47045e07932413812bc5d0d72352297.npy +03691459-7fc23785c19991e4e180a1a604561d3b.npy +04090263-65b1329eee48bd00d87c63d8b3018b58.npy +03636649-20af3e3a79e7023a6c342cf382162bc7.npy +02691156-c8ea73dddcd80d901b1cc145b0144991.npy +03001627-40d202afdcc49c6d35836c728d324152.npy +02876657-2ed752a96e55398928beb1ac60ef8914.npy +02958343-c0aeb1f7a3fa4e2aea914417bf582f8a.npy +02691156-f9f4daf3015b5ece5e9e2656aff7dd5b.npy +02691156-7c7fe1664a1f36b8ad6a38fcc21e6e9e.npy +02924116-96ad7a734ab428c4193d7855ecfc1bd3.npy +02828884-651141a1e0138b82ba6cf6cbb9f4c2bb.npy +03691459-e796a74db4708efcf115c1f523ea8464.npy +04530566-448148366050fa2b17dccc00bc197b9b.npy +02933112-cac3d104981b47cd3d113b8340bd5029.npy +02933112-6f2ce914b5d4db81e28993aa4d91dd77.npy +02691156-b0f3f0f754c0129486faacd7b0ac262e.npy +02808440-d9bb699461f28db61c17aef130ed6213.npy +04090263-91156c525c67581f0cadf545f40c8f9.npy +03001627-b46361e53253c07b6fa2cfca412075ea.npy +04530566-498bc74044946e85484d83b7c37bccdd.npy +03001627-8da327a8eea887fd492d9da2668ec34c.npy +02958343-6a02e129dabcea8ba7dc87c65b6a70a.npy +02828884-bf504bde782c3f2ce8ced3508709e1db.npy +04379243-b9695f4e1589c6bde12186cc8c5022c7.npy +02933112-7e881ebf38366c6b5c91aedc71c80652.npy +03001627-abf03d43cdf0825ff51f77a6d7299806.npy +03001627-6446846bd5cc3cef5b4aea6c98f52b6e.npy +04530566-7677121309eded5fbbd09450267d17cc.npy +03211117-12c1b3fa24cce3e75745b9fe8da12812.npy +03001627-cc665438c4f7baab137d9700e13a503f.npy +03467517-73a1ac3658e2505f76d05024fabfa1e5.npy +03642806-3909e96930cb1e32a4f2e5eab55eddea.npy +02992529-30efef3eef4b37eb9ed75a6428ac0ca5.npy +04379243-812f86b9e1de03419c0ca344f487323e.npy +02958343-1f6ce6dd6720436642534f02c8e8b5ac.npy +04379243-76665ee7994012f2bc74913d2fc4a0c.npy +03001627-27efa956ccd86120464bf8a1dbad4432.npy +02808440-868d4ab648e8cf62b2f1a4f3f8449762.npy +04379243-dcdea1e749d4e20c63eb57c871ab1d8e.npy +04460130-1fc436fd53db26d667ff3be08608de4d.npy +04468005-5df84478c357fc7c5b056960183c4aff.npy +02992529-99fcfdd6edb3898a1117cb504804bf09.npy +04090263-9319229e8b90b7d794a57adad86ebb52.npy +04256520-a9da19aecc65656019fb4103277a6b93.npy +04379243-e4947c9bc17eed10e54cb890e8682c84.npy +02876657-5fb5ef6280e09d96d11ab9fa7ac20266.npy +02828884-ea6da848da3f603f81faebbdea6bd9be.npy +04401088-c3e0378cf861099ae3f7a74e12a274ef.npy +03001627-39311ad85e77d3b7492d9da2668ec34c.npy +03001627-c19ff7d2a5a3d29aab966e32f5a3808.npy +02958343-7046566750f129126aa0f1550c0a545d.npy +04256520-fd56410fc541a09a749add7c3dfb27c1.npy +02691156-d34eba7c2ce4db53adecb6fc00604132.npy +02933112-d69d9de0c79ac6a9c59350d819542ec7.npy +04379243-ebfc108a60197d8d55f46d55537192b6.npy +04379243-74b86828a5adb4c15b4baf82e4d24faf.npy +02958343-95a6e03656bdff26f69bc9777f9c3c39.npy +04379243-16dd49ad350321e678996b707ffa04f5.npy +03001627-71372c1f20b6a04c43c40c5aa3d5c5b7.npy +03691459-a11a2f20b1680f91b626640605322b5a.npy +04530566-2d847f7ada349864a4f87aa9a31cd70.npy +03001627-2e17502c7a131b4061962815e1518ae1.npy +04379243-4f0fd96b50c261ed48fda83c10428379.npy +02828884-e941e1929bdc87d5ad876645af0395fd.npy +03467517-7e4c32c76690d64a59ca4b9cdfa4cd73.npy +02691156-688f4e273beef132f0daafcf2996daaa.npy +04379243-eb98dcef687ca46970553da2430bcd98.npy +03211117-cdede148ed40e40187cd01e4a414d87f.npy +04090263-c825f86ca0c8550d45e0c3a4b827d51a.npy +04256520-d3a550ef8b98f55b21cfc6e95839d798.npy +03001627-2783a969fa42cdecbe31379a5751d820.npy +03001627-a39f54db298e53b035d20a1a3ca345.npy +03691459-1f59ba1fc5d296a817a0d4867f131bc.npy +04460130-63150ddf5088cb6a1b4b48d3a6cc767.npy +03211117-a8e109c66a0fcce7a87d866b539e4b68.npy +02992529-bcb8525b5aa7e4a5a62dc47412730fc9.npy +03211117-64abc0ca2670818e441f5bb6f88ca61.npy +02876657-3dbd66422997d234b811ffed11682339.npy +02958343-c6e3d9cf26016b5752aa494042b7c9db.npy +04379243-2c08886cba42af25f1acf3f2c6f9e1eb.npy +04530566-1b3a8fa303445f3e4ff4a2772e8deea.npy +03691459-440745e23b80c41f398d0c5832df00e.npy +04379243-352be15a6b1439c135836c728d324152.npy +02958343-6710c87e34056a29aa69dfdc5532bb13.npy +03636649-c8305b6f8521e9b3565822a81bbbb03d.npy +02958343-93486febc6ffc1aa7f04cab89c8d2959.npy +03337140-9d4189605087b029ce5d6e9371bb5c33.npy +04468005-dbae1cce1fb122d7dc14ba0818ee5cec.npy +03790512-e86e4d0b530743e129c87d1be93099f7.npy +04530566-35e014dccdd4fed12c791a7edd1fdff6.npy +03636649-e30a70e900f0a9565d28221e3b996124.npy +04379243-827bfeaf1de70f08f7d9678498f2295.npy +04256520-e2b1b05de388e7db3b52c6376e0759d3.npy +02958343-4849c61634fe3023fbeef84a1ff2df7f.npy +04530566-607b88a99de743eda0fefbd3658c7966.npy +02958343-5e236dc6f4381ed37af61b3a12bec0aa.npy +02871439-da85e3cd457b2306a64bdf68b802832.npy +04530566-99450835aba6e4c4da2951c4977eb283.npy +03691459-e750bda061e86402cf39ad4726172e1d.npy +03001627-6ed05dd2e39e06223b12a1486cdc4b7.npy +04379243-9be565678aab11cba0ab1d82ef09f78f.npy +04256520-834fe65aac9ea9bce589b08489d157d.npy +03001627-d69aad24d253474dc984897483a49e2b.npy +02958343-663bec87ecf2e0adad0e351bfd714e3b.npy +03642806-16c49793f432cd4b33e4e0fe8cce118e.npy +03790512-90c209ff795be387afe1d4530f4c6e24.npy +03691459-1c5c9d780dffb5c2599d9c8430d600ff.npy +04379243-6acf2b080e171859412dfc90452742c7.npy +02691156-99ee9ae50909ac0cd3cd0742a4ec7e9b.npy +04330267-91171b5e88099d8a642cdeb209ce68c.npy +02828884-2212ad7db1587578d2b12aa6a0f050b3.npy +02933112-8bd6e4ce15468e1ad6eefa796d2f261c.npy +02691156-876127a17b7285b3c1fbdb352261d023.npy +02828884-bcb4f576747e10bdd7f6e86d7d335698.npy +03001627-a801ccbf4985a57f17adebabcec6b7e.npy +03636649-f12822778713f5e35b36bbc16e99b441.npy +04530566-62cebab704dbc0d02b76c9fef45435c7.npy +02958343-7eeebaaf4df31022aaafd94b9f216ef6.npy +02691156-94bb7abec5f1b984dd1c97b5ee3d49a6.npy +03001627-bd3e65b625c9d994b022c94235bc8601.npy +03001627-662928421872897f489452a0032ea575.npy +04090263-3fec7abae87ae773560ce90a898cf5fa.npy +02933112-54ea003ba0d36f34da5feafe6f1c8fc.npy +03636649-97b7d9aabe38f91df11c97be803c47d.npy +03211117-a5269c81a3d7e8a01242824b4827fe77.npy +02992529-595901b2d5b23f58ed756341424d6b8e.npy +03001627-9b4e072fbf32d793e6c5cd45aa112726.npy +03001627-8707cf0c311ba8f34b3c42e318f3affc.npy +03636649-c97cc6e7fd4b4a07d650f729d0ffe69.npy +03211117-5880abd2815da0492fc6a8cbc82a5bb1.npy +03001627-4647b2b982deda84217ad902ee02afb5.npy +02808440-1c6117c2eef53221b362845c6edb57fc.npy +02828884-cae6c2b329bbc12de5d5fc930770c792.npy +03001627-a8c0ceb67971d0961b17743c18fb63dc.npy +04256520-a680830f8b76c1bbe929777b2f481029.npy +03001627-bb5791b1d4cb5fe81c1b3b2ed8d13bf8.npy +03001627-52a8dd8b79ac85299d4d5dcd2cc33826.npy +04379243-da9ff1881e8d59847d76632660780a8c.npy +04090263-f4239f72396f4170e80f8461d134c14f.npy +02843684-1b73f96cf598ef492cba66dc6aeabcd4.npy +03001627-f31f8722de9008c8c5aaa7f1cfa788b7.npy +04090263-f53d6eb7baf5a29ec24d00518a3dd6ec.npy +03636649-a1194aa9dd64c3c849d61704e3b15013.npy +03001627-c5c90d3e84be70a11b17743c18fb63dc.npy +03001627-be9d5105e48ae27e713decb1a0563b12.npy +04090263-bdfb8df0d6d316012b38b1d99376c0b.npy +02691156-d37781e47470fa3d664a56105f5816ce.npy +02828884-6e045aac2c52c7c556f6ef8b6ca8f4cc.npy +03467517-f7938e387f8ee3f8f94083089dddc4d3.npy +03001627-797df32cd5248558f779fe11f536ba12.npy +03691459-fbdfa353d97d91fc719d3f85e0c9919f.npy +03261776-5b2847f952068fd8992fd3dac901d508.npy +04468005-b5be8fd2d66546f452470de2774d6099.npy +03325088-b3553c13686cc769ebde9a63a3b4b302.npy +04379243-343bf23c280a14cc4ee8db28f96ad26b.npy +03001627-488041c2e021e8e87b11ae648ea92233.npy +04379243-5a9e3e5bcfe506cb323ead02771c3ad6.npy +04530566-2e19e953c01ddd69d5bb7fc09b61862a.npy +02958343-1710ff46ca275e171df27141dea8c9a.npy +03001627-d04a1ec4ac9de6d6eab55e294b4eea02.npy +02958343-1552f1a6521bb54a4bb135bcd06914d.npy +04256520-27be61a3c437d7a0eaf288f952624966.npy +03325088-88bed42acf279854c36fb70296e45483.npy +04379243-7f5c20bafb143b92492d9da2668ec34c.npy +02958343-3ef041182cc1d037a9d3767c58267708.npy +04090263-8cac8a38e96e3754a59c12bac2e48f46.npy +03691459-5000f99de4ae981bc52c9abdcf87548e.npy +04256520-e48455c2ad642df1febad4f49b26ec52.npy +02958343-679a25d96d21cae4a7feb903e89a6153.npy +02691156-34c656eeca31045724a182d01c698394.npy +03001627-477fdfa65563f180f51f77a6d7299806.npy +02691156-2993c233805d2718ad8912880b776dcf.npy +03593526-f8e8740b44ca276abb6f5a9e4b6b8b34.npy +04379243-45dee2774ca0527c9f8c3d2002c77ddb.npy +03001627-54f33a7cb3621d5ced98cca8f0ccd5f7.npy +02958343-c004e655af0b35e3bda72093f9b5aa73.npy +02828884-9d7a51641609efeb54db38a439aab3c3.npy +03001627-cec74855ee27972040a35da25154231f.npy +02828884-9159af619d9125ecf4fb4dee5181bee.npy +02924116-52f8b3ab45b05c27379393d232db737.npy +04379243-a24cc636d32bea058c833bc3a0fba1ca.npy +02958343-c0b2a4cec94f10436f0bd9fb2f72f93d.npy +03001627-13c18609602e4ced37b2bb75885cfc44.npy +04256520-1429db0e06466860dfd64b437f0ace42.npy +04090263-f54a04aa65598c3cbd32f07d6724eb4.npy +03691459-c56e62ebcae613624c40f34de8f3bdb8.npy +04530566-e2595bc7ef0809097c0ab7347b9e831a.npy +03624134-960333056428b9302393df8f7c1d9394.npy +03001627-fd9e909b082d8175d319c38340319ae4.npy +02691156-330f797ebbc565e71560e45167753555.npy +04530566-90a71287364b3d1bccb9d5278825aef9.npy +04090263-243a8273104d83b6e1f2a1daf140ac9f.npy +03001627-cdea84a63ad8c44febad4f49b26ec52.npy +03001627-87e11555e7233fb4a9bdc22a1e02e82.npy +03636649-6d5d4e506d6630b193528e10aeca0aae.npy +04256520-ea35493dd0e9039e8d2d730aebe7865d.npy +03261776-6bf1559769018cbb354b166143712fb3.npy +02933112-1dcd59ab33d275705ac7b7ceda74ec30.npy +02958343-ef686b06e51b00601c9427735f8d544f.npy +04379243-852826a94cce36ea9f1deb04fb8ae481.npy +04090263-e1e43d3916a7e19acb7b0ec95e9a1b02.npy +03001627-37a273cab5c24d457e871e09a3769b30.npy +03001627-3311f1cf612be98290a9ce3e4b15521e.npy +03001627-9b12d223347d4bdd4a11872aa986426d.npy +03001627-c0720c8d54745ea8c8687ff9b0b4e4ac.npy +03001627-1f857fce279b761435fbe95f496199e.npy +02691156-bddc2c1a4fae008947a1dbf5fd48a4dd.npy +02808440-f0fc7248fd16e45dfac6ca167c92d21.npy +02691156-1f5537f4747ec847622c69c3abc6f80.npy +04090263-621502aa0a01864d20ded1536778b0f.npy +04004475-b13d7229f113cc6fa3ac1bbe37d03a29.npy +03467517-c33328c564f0f6be799d06ad2011f8d4.npy +02958343-73dd68fb65a4f4d25d9d397842621b7.npy +03928116-c8cf8b011d5a3dab2203dc8a6e206818.npy +04530566-58d8ded0bcfae37985974f8a4d3be0b0.npy +04256520-360c1058f401dd27fbc060fd555478.npy +04256520-46eaf99e641a0fd264558a1c6a2a9f11.npy +04256520-54eb2ff4ee8889f65ff59927d484940e.npy +03710193-f1f92f0942b4d85b5b9eccd25a4faf01.npy +04379243-ebcd23b7d8d9247292cf95a109e87d7d.npy +02933112-28bd3151d50a4d78c59350d819542ec7.npy +02958343-f8b92a0ea7f4705c9fec71e8f4aac226.npy +04256520-e771166e02fe1016bd16d4490a10a752.npy +02958343-77065a7bc997bae82d5feb260eec50c.npy +03001627-475e2c8f7a2c1bbd9acf9a86c283d1a2.npy +04379243-10a4e263f8087c4b8cf2bc41970d572a.npy +04530566-953adc8c58842c1281d9d9b1473043a2.npy +04330267-e30e4f8c9383b4b3a805114916841d69.npy +03001627-fffda9f09223a21118ff2740a556cc3.npy +04379243-a7949f6ffcb23c178339e983761bc4a3.npy +02828884-d26818a4e62d931d2056b4bd5d870b47.npy +03001627-d619fd50c4d0fb46dea83bbf303af433.npy +02747177-4648772290e4dcf6ad5067eac75a07f7.npy +03691459-f8d4287a583bcc499393793f9cf3dbea.npy +04256520-ead4e128aa3ef03b9283104e53cccd61.npy +04090263-b7d6f5e0a80f9502d4eec64750f57123.npy +03211117-600bb2a17b238a927f7954f9ba534b6d.npy +04379243-5924fe80dc26ae812b0c00d36a59e875.npy +04256520-f6d695e08f246d4ef5b0cb6df351ab49.npy +04379243-3d54679cfdfe8d72e1aff9039d025.npy +03636649-b10efcf01493c922e7e684d25d4dcaf0.npy +02691156-f3f3805b0f1c81e6f1218670339368db.npy +03001627-d490f77bed3bded5af7c7ad2549a1b15.npy +04468005-2c66af94406704f3bcce76f79beff867.npy +04379243-8b62f4352dca92f657c81a572b80bc7.npy +03001627-77e703a4baba613937f1b3cce66816ca.npy +03938244-a97e7bc8291f73d521788cb501e76904.npy +04379243-1fa966f9c1d9b994d2ae2f26e86f819c.npy +02958343-2a1523ee15233761d9f8911ce020a037.npy +04256520-c4dbc5a64db6c2d72a9a1691b6f98331.npy +04401088-cbe652c317a4366b4298c9fe028be1cd.npy +04256520-15ca4d51db95edd783f3ef99fe735c7e.npy +03636649-d7a10c837316de2f3ca265f557f5dc3e.npy +04256520-5f5ccb837124abe11298312f680c9cb8.npy +04401088-a6fa27ebfdcfb0e165f198d5d73e9283.npy +04379243-d7c40ca08579ba4e664b3b9b23ddfcbc.npy +04256520-73f7237dd7ed9c1d593ebeeedbff73b.npy +03991062-8d7083a120eb546c1c3b3ce292007d5b.npy +04090263-12038871e583f645af56497f051566ab.npy +04379243-391fa4da294c70d0a4e97ce1d10a5ae6.npy +02691156-3c1e298b4222f4d15d3bbd70fc7759b7.npy +03001627-ecb43e4b0fc96935664b3b9b23ddfcbc.npy +02828884-e30527e054c1bf2ed201085e80edb26a.npy +04256520-c71a8fe3f0f14c074016166a4bbee8e7.npy +03001627-c86cfe147872280463626070a93463cf.npy +04090263-154d2a83fc91d473d735fa1ab17311ec.npy +02828884-7807c68ed9963df7f4fb4dee5181bee.npy +03001627-5cc61516525325f55e0d6e917505f52f.npy +03636649-d97a86cea650ae0baf5b49ad7809302.npy +02958343-4dc19314aab40eb83a93df79ef2b80ef.npy +02828884-7047ed12851201138cc469a51e5a5cff.npy +03001627-49345c62f63818a036be1486373f076.npy +03761084-7672e8f619765cc51af9a5a7008cc3ec.npy +02808440-7e5e0372dbccecb244221bef0fa3c36b.npy +03691459-c216e0b5470ec21f6ca2b6e5474aad11.npy +02924116-a4b740849e66f14241cefd10ce5d6cc0.npy +03001627-a48e359faed3da88d3519c62a8100783.npy +04468005-5e4a6599e030061d9f47439175208c26.npy +02933112-28ad7242b0bd168ec59350d819542ec7.npy +03211117-72353901edbe553ef5f9c04ae80a1c59.npy +02691156-1272dd98c66f13579a6e43b878d5b335.npy +02871439-a65e62186ca1b1eea58c3abb1c7c441b.npy +02958343-437f3ed08c32f2b9092ea6b09901598.npy +03211117-2bd7f9ea0c695a309c739d3276070b8b.npy +04468005-59b9e0fc43c367df52470de2774d6099.npy +04379243-3491a4102095b1e87ff6ace05b36a5.npy +03991062-240a7e8eb09d64e2b1a98fe8994d06b6.npy +02933112-76271327a3224e56c59350d819542ec7.npy +02691156-34ddff243ac3783521b85e5214b0d6a7.npy +04379243-9a60b3b87a457c73f522eecffc49e6a3.npy +03467517-ca9d66e82f8495a790e6e6b4a6e53622.npy +02933112-243284bf14a193771f6fe06b2fa3ab21.npy +04401088-520bdc1f312a9c92e44148b82b01a424.npy +03046257-3c78e14b999a04bbcfa93d76721b3c29.npy +03636649-d60a54564aa1856fb18d6f615cb18bdd.npy +03211117-8dda338160076595234c2f2e8f2fe6da.npy +04379243-d4a3c7e26b4a6eef30bbd4cddd04c77b.npy +02992529-2488bca663eab268d53bf953feb52e3f.npy +04379243-c25167c0af7517778cbb8bac2032149c.npy +04401088-20bcd48918a843946e74af071fa12682.npy +04530566-acc820666df876cb33af5a5d96363fe1.npy +03001627-da1ef4e9ccbfab13b3234e0da44b11e4.npy +03046257-e6d392fdd687188981d125a53e3295bb.npy +04530566-b26565bf67d9f61abdda868bb83c524f.npy +02876657-40e5d2c6e9e9cbbf5cafd3b1501bc74.npy +02808440-1b021f1332e7d185ccd0340812259a39.npy +03001627-a33c519a3d90184f504721639e19f609.npy +02924116-992436dd99cf145a19fd3efae56693ab.npy +04379243-74a626c1b31c14cbf8b8d4a282992be4.npy +02992529-57657c2b0d983a1658975870bb96a55c.npy +03001627-331e7c7897b8243694887ea54f3cfb87.npy +04256520-c2294d5c7d629f11b17743c18fb63dc.npy +02933112-54f801646e066ce92afc25cef0918375.npy +03636649-b8f5122793e92cccfde2773767fa47e8.npy +04330267-39a419de848fdf542a2fbf58d878928.npy +03691459-4a158b46d8e943f2d612e9885a7318aa.npy +03046257-31e745ce313c7a786463df620b7b4cbc.npy +03001627-18d391ede29e2edb990561fc34164364.npy +03001627-e545ff0d2058b382c3bd24f986301745.npy +04379243-b5feedcaea797add4830ebf7106a333e.npy +04379243-6d67f92d6e11f29e5792b99b8245d225.npy +03001627-81519481b3e24fd7b0957d845ac33749.npy +03001627-39ac9a459a28e252763d2f5638da324e.npy +02933112-5ff47fe4724d0c9320768660cf080d12.npy +04379243-f8e8b0059395805d9bd3e6056359bce9.npy +04256520-25220d902288e352632c9ddc45ef4651.npy +03001627-fdfedb5bb8cd35374233148ffd345970.npy +03211117-6f1c8a6b5d684a98e3d888a4f2b9ef73.npy +04530566-8411cba605709e46c26de8baaf779d69.npy +02880940-b5d81a5bbbb8efe7c785f06f424b9d06.npy +03001627-7228d43e00af4c1e2746490e2236e9a8.npy +02933112-b4cb08749e099f0a899736e5d685d0c2.npy +04379243-52329d991c54c5104febf42664c91820.npy +02691156-733db701650ed0d4651e8da9cf70afea.npy +03001627-e4114b81f793628fe8f8c11a24c52ebb.npy +02924116-f86dbb66cffcfd9b38b9be827bf6fc77.npy +02992529-7afdaca858bb0a964a28575f3344964.npy +04379243-d4bf9872856d6fc2b300c4ca2f51c01b.npy +03636649-d1ba336c09928deefc91db1746a83b15.npy +03001627-ed6bc67f247a5aa3e43df8c9a38bf11b.npy +04379243-697779230551768eedf21eadb26f2ac0.npy +02958343-60c6194b6f164cdc30276fff5ca3093a.npy +02691156-b7eefc4c25dd9e49238581dd5a8af82c.npy +04090263-9fc9bed98828febed4713685ae50fa13.npy +04530566-36c8dc4d5bbc44c87ce8c809505eca2f.npy +03691459-93aeccb6a5e0a62035cd53a06b1d2317.npy +04256520-730dfb84b370682d9cd8353ccb52cf6.npy +02992529-ed5ac4e8c681102e848d333362aaa342.npy +03001627-1769c3cf3391d5c1a1d7c136d0e341.npy +04256520-254fe5715b9de05db499b6b5bf6f9f82.npy +03325088-5cc1d274e57dcef73321831d2245cf06.npy +04379243-156d606fa86ba19c4eb174a255d0ec5e.npy +02942699-3b56239e45828d2bb4521a835b1946c8.npy +02828884-3b18e32e6e0c5942d4d8765e3910f617.npy +03948459-89e248c25d3fbbeded6071560148e6eb.npy +04530566-49fb20c0d5c84e2757920cec1ab34b29.npy +03001627-9a522f446662bd23a07a1bace8cff15c.npy +02691156-7cdbe41e6701c661bc0909d98a1ff2b4.npy +04379243-f52e33287b89f0109bbfb8262cd69a18.npy +04379243-faedeae65bb5644040ef1c8b63a628f9.npy +02992529-2df0bc8b46ad3cb858932236a22029d3.npy +02691156-4d2d87e61a18760ff64801ad2940cdd5.npy +04379243-3c1f16ccf38710e64b3c42e318f3affc.npy +03691459-8dded99a589a526d609daf4d63b3df5d.npy +04225987-d31aaca67fd8ef1827d17dabad15093.npy +02876657-e24fb21f7cb7998d94b2f4c4a75fd722.npy +02871439-fb577abb5e7b7835b5268e212359ccea.npy +04401088-e0d9622225e1361883b4bc86420ed21d.npy +03001627-9a6061dc962c0480ec2a7a1f5fe7365d.npy +03790512-4df789715eea8fa552ee90e577613070.npy +04379243-43321568c4bc0a7cbaf2e78ed413860a.npy +03636649-b074f648cc99aca6fcb8d8c6d4df8143.npy +03691459-cfdd69078d7752298b54295fac36ff1b.npy +02871439-dcd43c744d65d713c351d52e48bdbbe.npy +02828884-5775bf637d14acf1eaa4526a35f01085.npy +03001627-ff969b22a8de5eac30e06a011e63236a.npy +04256520-f39246dedaea087c397356311cbeea4.npy +04090263-17733d33502704ce9555419173518aa4.npy +04090263-8b8baee427b1adbe30ae8c7dca0728.npy +03691459-5ea3d1068a624c1da91bbba4742a1643.npy +03001627-ebaffb5ce608e7158d09bc92d0fc6d3a.npy +02958343-e54eb2674d6b3e241e351ee0a9db4268.npy +04468005-c4634b70047f855292f8ff9dd121a20.npy +03928116-b549a0c108ff0272e4b68d3b17c43658.npy +04256520-b67232c18d00fca7593ebeeedbff73b.npy +03636649-266ca6ba2582dd9dbc24b3e693083ca4.npy +02773838-d5881d42567baaf5dc19a9901b7e9a4f.npy +02946921-3fd8dae962fa3cc726df885e47f82f16.npy +04379243-4e5172cf359d577154ffd0de2b0db5e3.npy +02876657-5566c65116a9567078fe949fc1419876.npy +03001627-e175bc785390e8f6c05575120a46cd3b.npy +03636649-e083ee4f045402b2806fa01b99bcd24.npy +03691459-b10f7a407b4a3722296ecd3bbf65f1a3.npy +03001627-5ecaad1f7575b3918ce66f12ba927a2b.npy +04379243-b69b2ff85d0ec661d8f9dd7647048a0c.npy +03991062-1b121101806758e4f9aec59741c69cf7.npy +02933112-98e47ed9746cbc88ef9b1f19ef4b8cc0.npy +04379243-8aaca7e2c1b0ec549eea323f522c6486.npy +04256520-ef479941cb60405f8cbd400aa99bee96.npy +03928116-e966f5e34789b32210240762b65ed973.npy +04379243-ca6071926d0d910372ee08e78374a212.npy +02933112-4a007c5263b36c35f51f77a6d7299806.npy +03001627-42f77dcefe75f7eb19fb4103277a6b93.npy +02958343-b4f385b36ef0918d9393793f9cf3dbea.npy +03991062-4fcc70a519fac2a3f11c3739edd52fa3.npy +02924116-f1620392bd8d9249193d7855ecfc1bd3.npy +02691156-65bdf7b997087055ba30a078a973ced0.npy +02808440-9b2952001ce703ab6b448b8aaebb705c.npy +03001627-267dcb267138fc92c242632b2a8c3129.npy +03636649-c0f67a9a45cac532fcb8d8c6d4df8143.npy +03001627-a73a49fd2887a030f51f77a6d7299806.npy +02876657-908e85e13c6fbde0a1ca08763d503f0e.npy +02876657-22249179e88b0502846564a8a219239b.npy +02958343-9e3a69fc219ef73d37c910d2f91b3d73.npy +04379243-1ceaa8bd231d922cc3bd24f986301745.npy +03624134-a0e6f9f1061e2f2c1e5999ea0243607d.npy +03636649-bc40c19e71fd258046f1a7cdff74f3f7.npy +03325088-f1d5eb645eada0c03321831d2245cf06.npy +03001627-2025aa3a71f3c468d16ba2cb1292d98a.npy +04379243-a5e951c9d7a9a93f8cbb8bac2032149c.npy +03001627-cc8fe2000b1471b2a85f7c85e000fc79.npy +03593526-afeb60dda62138a04013b7b0fb1ceaff.npy +03325088-d79fbf2a080e30a2b362845c6edb57fc.npy +03513137-2750a9be8f6cbce54e5e6ac3ef6bff73.npy +02992529-ae86fa976ddb0f923bb35aa9d5fb636b.npy +04379243-ecf3cc67ede747adba5342d638d0c267.npy +04090263-e93954daf5406e15e564d15be4778337.npy +02933112-1ad4c572e0fd6a576e1e9a13188ab4bb.npy +03001627-5cc0b0e0035170434733824eae5cd9ae.npy +02691156-2be6cc069c95951a4304ffdb51711149.npy +03001627-8ad57afa55cebfe0dad433a29cb627ea.npy +04256520-f5d7f60d4b33ea4f63d977b06bbd429d.npy +04530566-baeb1f25ccc59698cca5d826f4b024b3.npy +04379243-f71296c0a7e93ec282db9fca4b68095.npy +04401088-295d6f0caa702a1a2f58405e4baaa2ed.npy +02958343-414ae320397821af8bf92e87e504146a.npy +02691156-86099a00dd63ac05aac413eef609e99b.npy +03001627-674f8f89f68491ff38a7c518e9c1b4ce.npy +03636649-6750d3745d49f7ad3c1ac1040256359a.npy +04090263-178539e39c6a83efb1c46f058c033ec1.npy +03691459-b1112f7597347113892a11caedd0d90c.npy +02958343-c3cfbe068adab0579583ff717105f70d.npy +03636649-3abe4c174e5e5ffe490ad276cd2af3a4.npy +02992529-983b362e25c008b1b36be681f90b79af.npy +03001627-10dc303144fe5d668d1b9a1d97e2846.npy +04460130-8b5f398ede93e1fd8da631348bdc760a.npy +04256520-383e435cdbe406e76ab870ad2db8ed02.npy +03001627-c30813d1130b492e81b31fbac7146568.npy +04379243-81922145630fced4b49e18913f04bee3.npy +03642806-bad11c851d356f6363920080bd2c2ed3.npy +04090263-e6b01d0349c34a4b9d40dc50674e6347.npy +04379243-fa871f2f88b933cd7a63d8989415726b.npy +03001627-a69a2807ca667fd9492d9da2668ec34c.npy +02808440-a26f1817df243dbf601f1922eb3d98df.npy +04379243-bfe05e0cf137791d1029f6318b92e21b.npy +02691156-dacb447d7820e7f7ca8607f540cc62ba.npy +02691156-48bcce07b0baf689d9e6f00e848ea18.npy +04090263-1fa5a9170bb276e7fcace4d823343363.npy +03001627-e02949c5e582d20682574dfd1b102fb6.npy +03207941-91cec7275a9b3266a6eaed098287ffd3.npy +03642806-97e94d800fd6dc07dbaa6d42a4980930.npy +03001627-7520005e70a54526c266013a269e5f81.npy +02691156-af04f04964fc2f1b64a62403221fd59f.npy +03636649-d284b73d5983b60f51f77a6d7299806.npy +04460130-dcc345e983796eeecb9157ba706d9589.npy +04379243-5be5ddf3780d2cbf71a782a4379556c7.npy +03001627-5b69cc96d156f286e7c7920f6a65a54d.npy +04090263-2a58d9c3a766742cc6f30d9ee0d5574e.npy +03001627-bafb9c9602d00b3e50b42dfb503f5a87.npy +04460130-5da1ddcc8d5f62577f5d4139a48ddb6f.npy +03001627-64d535abf6fe5ec46874ce99dea28d5.npy +04090263-7b0137debf39237d618f190677511085.npy +03001627-eee7f5138b978078fdef1c01cbd4ae0c.npy +04090263-22c33fb33a18b5bfbe250bd311b0c6b8.npy +03001627-63a1c3810119e2b660389b3f7b5c9026.npy +03001627-54c9f96ffc35d0c2eec2ef73f04d4ff7.npy +03636649-1c7f8ad295bcc3795a233e989a47d3aa.npy +02828884-84efcf2796fad0d2917fe9209d09e56e.npy +02958343-d01a821c8b2c43cea0061ac8d975ad8.npy +02747177-480e98c025179a68b47ef2a0cb1f9cbf.npy +04379243-4894b2193e36814dd42b9650f19dd425.npy +03691459-df8afdea84c72cd5c3dcb7e0e318dce1.npy +04256520-1059a78893d810bb14038d588fd1342f.npy +02691156-f6ec20afe98e37ef6e2a24768a2fccc.npy +04256520-277e5fc4d325fb1381f667e2a25e0619.npy +04379243-8cecee14e55bf1f4c255a5f53b753fe4.npy +03001627-86eeafeae817263414038d588fd1342f.npy +04379243-f0275c22904d275222dab9b5e1c1282d.npy +03001627-d239d38424429a9a4626612b5d655dc.npy +03636649-5e6abfc7d93fa5f1dc0efee4b442070.npy +03046257-171a6752b9a2dd95651adbce8f1811d5.npy +02828884-5d9880d63d54b9c442bdc91bf8c0f902.npy +03001627-2c76aaa00e55c26836c07750784b6bc6.npy +04554684-8a0a7c14b9cd6489d202e705a59e5585.npy +03207941-5d17e90f512a3dc7df3a1b0d597ce76e.npy +04256520-4e1a956e406bb70714038d588fd1342f.npy +03001627-89dd53d0377c28207f7114254c4286d2.npy +04530566-66a90b7b92ff2549f2635cfccf45023.npy +02933112-ca6d108120fa949163d977b06bbd429d.npy +04256520-2aa0288017b4e249f6a7b03b801e1d47.npy +04379243-89b23586ad3af3d6252e0775cff1c394.npy +02828884-146934a1cb852afc1a1a2dbbd3d54d53.npy +02871439-6be63942b2fe82eefcd4910413c446d9.npy +02958343-2cccdc287a5329c2ca92a4cdad802b45.npy +02691156-31af9b965002990e27e7e81f554f78b.npy +04401088-fb1e1826c233104a4e09ebaf49b0cb2f.npy +04256520-26205c6a0a25d5f884099151cc96de84.npy +04379243-a41865cc8dfffcc137ad4a99518dba6d.npy +03211117-5b2585db758fac87bed75a82d9bfc7c.npy +03001627-4b3c381658cfe96d4db79ead79f57b22.npy +02933112-958fa3ccebcaa8246c4866b1c92b8a35.npy +02958343-d2064d59beb9f24e8810bd18ea9969c.npy +04379243-5a550763e7705e532ea98d69e91ba870.npy +02808440-68970c4f57bb44167d54ec3c8e01d52e.npy +02958343-312cfe616ce515be5826faa473422ba6.npy +03761084-7d83379d6c2239393bf7bae2651d2cf.npy +03636649-c464b5be51b387fead5067eac75a07f7.npy +04090263-96fef95e1fbb3763276c3d558130f8b4.npy +03797390-9737c77d3263062b8ca7a0a01bcd55b6.npy +03001627-8a2349fc21f48ca78ce66f12ba927a2b.npy +04379243-fed1a75cf5c1ce38dee1e85d063fe6b.npy +03211117-8a89e2085e5f8404da89bed86b8f9261.npy +03337140-3421141b1e11a501824080f516909671.npy +04256520-47fbf101a830769fd1dcc55e36186e4e.npy +02880940-ce905d4381d4daf65287b12a83c64b85.npy +02876657-216adefa94f25d7968a3710932407607.npy +03467517-a74168d620cc4fb1b5fc96dea70b7e52.npy +04090263-4a90c8a6980c9b53aa6420fd028bc571.npy +04379243-56b7150b4fccf41355f46d55537192b6.npy +03001627-28b605f55e21acffaf88fb4321b22872.npy +04379243-456601c88eae2449f51fa0238791f5dc.npy +04256520-785b692194203f119fb4103277a6b93.npy +04256520-ff213b889d304febb6f5fb02f36f9480.npy +03001627-b04f736cd05361d1cf63f06c65fa88b2.npy +03001627-a749c31cee6965f33dc9e0e58bb697d3.npy +03636649-7e4905eb4670c6df2f939979b0dbf5d5.npy +03001627-a10ee4a0964f4ef9e3b9dbfb07aa21fc.npy +02691156-db5146b7695fafba78d7c0e1adfe122c.npy +04554684-d1aa6a6c230b5150f0ddc6174ecef5c.npy +02691156-58e7f5046a0eb6474298cee0ed15ce9.npy +03624134-464dfc36b0b340724b7644126b1d71e0.npy +04379243-8f3642beb6eb088d37251258858a7a58.npy +03001627-4a9ed043cb91fd91b04cb542e2c50eb4.npy +02958343-a5dcd1196a1ffa9739f20966eb25504f.npy +02801938-557c0c8dcc9d84b2250c527721570ba0.npy +03467517-21a517abc4729e6e352e5d4d2615db5b.npy +03636649-e1fedf82bf8fce9eb8b431083b6191e2.npy +03001627-4af5131ebc2ffc25ec7cbf3284585a40.npy +04379243-ae9e04d050f5cba1492d9da2668ec34c.npy +02924116-8cd0cc99910e471d3fc5ff9790be0ab1.npy +02933112-955a80162f342ab45d64ebd26708751e.npy +03636649-60d7d0e9c45368c282db9fca4b68095.npy +04256520-7afd499e9b3a2e0c1a90a4432f1af114.npy +02958343-bbaef5a610b0b4d5368f3995546e59c8.npy +02818832-22b8e1805041fe56010a6840f668b41.npy +03467517-c55430c190de1580922b76fa1a7a2ce0.npy +04530566-370ab590d5f9f6e12998de2923cbf8ed.npy +03001627-5ad3a3c3b67433174733824eae5cd9ae.npy +03001627-67fd2b1f102f4f76ec89626a4213fd07.npy +03001627-8df0910897498e764d183b64817fa09d.npy +02691156-5a0fe6557b4e2b9ea8e091cb544689d5.npy +02958343-fd7741b7927726bda37f3fc191551700.npy +04256520-a6d807661eec51a8c0b437e347e8066.npy +04379243-1241ec2dc5e59b0ec3bd24f986301745.npy +03467517-5c4ac761701cbcb21021cd55d164c0ed.npy +02876657-fdc47f5f8dff184830eaaf40a8a562c1.npy +03001627-5b0dd54eced22552b283c8c7333d797.npy +04379243-93aafe1aee82e2fadafcfea63f0b694f.npy +04401088-dafeda191170938ad33f96248c28a3a9.npy +02942699-fc83047701a0e21b901ee6249a8d9beb.npy +04379243-6a3c9ea7e4cc8fabb20aa91e9e90c311.npy +02828884-687efa006864f71d46c340938e2ff1c.npy +03636649-25427fc8b45e4c6370ad12dcb213189e.npy +03001627-6dd5e21ca65a9ff73c837ed50dd492e.npy +02828884-a31ab48a2b96574b9c3a7877712317b8.npy +04379243-1ca75076bcebfac76c3484ac7eef025f.npy +02871439-d8d3d2c777b12d4996b705a68a9174b8.npy +02691156-f1ef7546cc85a1815823df672991ed66.npy +03636649-61b57e8b5da8fb13d527a9a6f5a872b9.npy +03211117-3592a95cd54f38599bb952e15a37e248.npy +04330267-33cc4ac44ff34a789f71457a3f84fcdb.npy +02876657-7778c06ab2af1121b4bfcf9b3e6ed915.npy +03593526-a32fd1283c58bebda7f0dc86456c3021.npy +02828884-5e0c9babeb535aa4718e797a380b813f.npy +03467517-8e15e57014a36199e52028751701a83.npy +04090263-a4d66892876b5e0cb5acf79024643c18.npy +04468005-2158a6182c1be38a4b0b2e6e63122009.npy +04379243-fcc387cf43f5c63855931d119219022.npy +03948459-2a0ac4cb28aeea64eb127ea937b74f9c.npy +02958343-5785192c95cdd67b704715417c0f83c1.npy +03636649-cbe6d8fab4be74a11735ea0e092a805a.npy +02691156-b3dd0a06e7f727449a55c6af6f4b2bb3.npy +02958343-51c957fc4a2690ea7af49dac67ce8f.npy +02691156-eeeb30213be73bd14c3a35cee92bb95b.npy +04090263-59997a310b8fb3c9c1cc3f503d10007e.npy +04460130-4d1af8461018b714579e0a60e99d2683.npy +03207941-44d766f0954159773321831d2245cf06.npy +02691156-bdb7294dc4742b33bc0909d98a1ff2b4.npy +03001627-5c0d4cf28a71ad7296db593b49da23e5.npy +03001627-b4e30a512991aeba67903707764646db.npy +04530566-9f468767b1fd9285eb2c303a0e0d287b.npy +03325088-135cc2e885a4a46bc36fb70296e45483.npy +04256520-741dd57baaea906cb0449d422c1e5657.npy +03046257-93558e7f6f5ee9dea6a9ef34cf76a74f.npy +03797390-6c5ec193434326fd6fa82390eb12174f.npy +02958343-95ddaba8142bb8572b12ea83455b0f44.npy +03790512-8ed4bdaf0c8b88ea8b31e74d456742c7.npy +03991062-dee4dc24ecc3067f44c183864792bc2b.npy +02958343-1164dc97642a22ff5acf55f30acc008d.npy +02691156-12e127c0416f94ca4c3a35cee92bb95b.npy +04379243-b0e3b90a33ced56e2029d06c0cadaf74.npy +04256520-62a0f0734b9111084e78d6c405d01fac.npy +04530566-fda1e57da58ec9bee88464b900e0eced.npy +04379243-2add476bbc4144e57c9cc507bfc0f85b.npy +03797390-3d3e993f7baa4d7ef1ff24a8b1564a36.npy +02691156-6dd16a06f0e9a286bfc945be58e73eac.npy +03636649-fb8be091d77118ab90fd203f931c9af5.npy +04379243-23ece3bf871619366ff454af1e8947f3.npy +03001627-5346017af72c1843169d299c5f567c18.npy +02691156-3427fa8e6ea160f1fd138baf628cf158.npy +03001627-9ff6c78f309d55471449a39c0fb09f2f.npy +03636649-a90233920f619e03fcb8d8c6d4df8143.npy +04530566-24beb61e46bf6b1970d557f49392fb1.npy +03624134-8d8f91609580d8527bbfbed6e6c4dd29.npy +04530566-6d0c48b62f610ec0b90142192ec795d.npy +02691156-a1708ad923f3b51abbf3143b1cb6076a.npy +03624134-819e16fd120732f4609e2d916fa0da27.npy +04256520-bbd385cb3ee28279e3cb1f46427ab37a.npy +02828884-419f4ab8254c97a2056b4bd5d870b47.npy +03046257-7b4bb93293c880d3e61f61099b064399.npy +03642806-2c697db8a982242d54a8d8e3b6972768.npy +03691459-6c403ea54430684990146e2a0489a257.npy +03211117-3934f942bb0b462a90b6c749bc63f3e6.npy +03001627-bea846f692c8bdc8ce6fb1d4c6089968.npy +03790512-9cb038f61be71ed0cca5d7fbf4f17f56.npy +02828884-5b5be5419120ddbcb2a965e75be701c.npy +03624134-e8a6915bd0bcf1bebaa284808a1567a8.npy +04379243-797ecd23342e744bbff15b656f256f05.npy +03001627-6c0fb1806d66a9cc3002761e7a3ba3bd.npy +04256520-f8e0bc0d84a8f76cece93aa52d895bf1.npy +03211117-3017481ad6a978393eb1d3da560687e9.npy +02828884-4cb196a794bb7876f4d63bd79294e117.npy +04379243-c490945c032f5ca0fc0035da39bd5e1.npy +02958343-c3a1e04f49e80d22a10cf495b6dc4ef.npy +03001627-fa277e2693cba669731d11154716a6b8.npy +04401088-a523f6e5662f8f178ddf0e44d13d17e3.npy +02691156-e3473fc8fffca7d4d972c9dd75ed77d4.npy +04379243-c8f29afd512b8595b000f20a5153622c.npy +04379243-f8f36e7871d0e8382c026fed19c0d206.npy +02828884-b6b10e519fed3c9ea9d99888ae8a3eb5.npy +03797390-1d18255a04d22794e521eeb8bb14c5b3.npy +02933112-7f726fa36a428c0e11fc2b865c2a185b.npy +04090263-93743b9b3e33a272531756272f07b3a3.npy +02691156-983cb909846f4e1bbd46d022fd7d80aa.npy +02808440-e5c97c7b5cca57cb30f98136f75a1800.npy +04090263-b87fa4a82de9567af877f04737ced5b5.npy +03636649-1917888a2b6901091735ea0e092a805a.npy +04379243-54b3cb531febad83bc9f3fbfc126b5e4.npy +03001627-5a10fc10de7bd8cb8bd24d13dcc47e64.npy +04468005-51a8f19d22c1bcfcdc14ba0818ee5cec.npy +03467517-d9cd03133da5c44940c9c81d87cadc01.npy +03001627-d712f92ffb883fe6fbe6ed8d24e16d28.npy +02958343-77a170eab59d866d8a1aed4fb5fe5280.npy +02808440-fe59e0e02ca91956b362845c6edb57fc.npy +03001627-38a2b3491e8e8a0d490ad276cd2af3a4.npy +04090263-f6f254a6b02ad5268fc148cf8ab667ca.npy +04256520-9fd96a966aec6594f51f77a6d7299806.npy +03636649-6b42816b1e70429f61bcdcc7d95ea51c.npy +04379243-cca5144ed02e693f83ab30e82b39a93d.npy +02933112-19c79a42f68d7d444da5feafe6f1c8fc.npy +03636649-40c3135c95004291240cfa0649692c0f.npy +04530566-9feb86becf3f22f93df8f4ac45647158.npy +03467517-6ce23c82af30b629e8f705eb96ba3376.npy +03001627-7a962a612d7cd0feb7611322d07bb05e.npy +03001627-7eb566a254731d8871a782a4379556c7.npy +04090263-45c5c36e3736d3d64e868b194cfd912.npy +04468005-87952a04a88c9316a79fe2742d7899dc.npy +02933112-acee69c7c5517899af4d0096b3f9aa03.npy +03046257-f41e23b98991d0f535836c728d324152.npy +04401088-748f4a9aee8f610e8463cde8953cc1a5.npy +02958343-575ac5c53ab9fe21a26fdd1a1e470de9.npy +03337140-eb31fcf943d70e44f9d623e237698c54.npy +04256520-a0608ab77f25ae922b8f1e4489d2e1b1.npy +02933112-1971024c0cac65a824662341ce2b233.npy +04554684-9cd0227494eeaafabd2a8bf2cac51544.npy +02691156-d1e3bba19cb9447dcf6c095014f481a4.npy +02828884-7a0d913c66278596ad5067eac75a07f7.npy +02691156-1f7dbc112b7375dae0cfe7507a46f0c.npy +02946921-91483776d1930de7515bc9246d80fdcc.npy +03001627-6f37fb57f3da696265ba78ad9601cf1b.npy +02691156-88fe762bfda775f84c3a35cee92bb95b.npy +03790512-f959ea5503659fd33bd003e0bb7a3ed9.npy +03790512-d2f6dec6d70b111fda8b038dea29f4da.npy +04530566-79c98bef5c1870b64c55cd455710ca53.npy +04379243-4cd7d883aec1db86890992ddacc04113.npy +03636649-baf7b66d35abf0ab1735ea0e092a805a.npy +02691156-48d03ffabd0399f4303510f9a56d94fe.npy +04256520-e4066cefe0230cc7b2ccd937df5da28f.npy +03624134-e47774ba19c5aa99988abef1fd117e7.npy +03759954-c9fe3b38eb59689175a3010d3ada28ba.npy +03211117-3b01bed34001c78211eba86b475bafe7.npy +04379243-22ee7f1fdddddaccd78a975872fcaff.npy +02958343-1cf14b4004e1d2e22c6ce678c9114ba5.npy +03624134-d4be83e3062bfe9086bbb74f0f607cdd.npy +02958343-a0fe4aac120d5f8a5145cad7315443b3.npy +04379243-d4054b29b329a700490ad276cd2af3a4.npy +04256520-67d7f94aa2ab272bab610b0c94236463.npy +03001627-8d458ab12073c371caa2c06fded3ca21.npy +03001627-cca975f4a6a4d9e9614871b18a2b1957.npy +04379243-c7623649c8f34cab23afb61f25e1136e.npy +04379243-6f4c33b5becd1f3920768660cf080d12.npy +03001627-a592c3bf73afeb9294741031f62be2f6.npy +02958343-b2b2f4952e4068d955fe55d6e406ecd4.npy +02933112-2bb2456b272a23dc59350d819542ec7.npy +04379243-12ecd8ff5fee05c68cbb8bac2032149c.npy +03001627-2f2da13322d30ccaf4b6538438a0b930.npy +04090263-2a18722913244bc3c24d00518a3dd6ec.npy +04256520-17278f64413654cffebad4f49b26ec52.npy +04090263-ca012a47cf5efca23f9d84f9a87a44e4.npy +03624134-5663637633c938d1395331ebe4786cd.npy +04256520-42e06113efdedd0fbc19762eaa7ba40f.npy +03001627-b97dc64d0406c07259d43b06ede1b24.npy +02871439-de4168fe61b0968a7351a916a214ce9f.npy +04256520-755f23d93b06bc168cbb8bac2032149c.npy +02958343-ced46f74119cdb36a7fc8832cd5fa42b.npy +02808440-a23e7892bd3dc65b6f893b5bc716a3fa.npy +03642806-4ad5cbcfd2e2256414f029a400534157.npy +02691156-8d2903595298549959bf29282ea7962d.npy +04090263-f0b6875689fb72f6feafd6f06fc45258.npy +03325088-3c8af998b8d3336c7793996e6e93af11.npy +03691459-19b900dfc658cdcbd4b4ae2ff4c58b57.npy +04401088-2b48b14e226b131af3b2c084b195b056.npy +02691156-237b5aa80b3d3461d1d47c38683a697d.npy +02691156-3a3d4a90a2db90b4203936772104a82d.npy +03636649-47ff70265cba94df900cbe2c18fd90e9.npy +03001627-41660fd9cba4d5b72f4413c96d686e51.npy +04090263-9dd3d881c473a5323666119626b2af32.npy +04554684-1a23fdbb1b6d4c53902c0a1a69e25bd9.npy +03001627-d5bd6ea417eba6ce456cbf78e1e89022.npy +02933112-1c4e2879669e949e3fe047712e43e185.npy +02691156-7e10d8f0457cb48219ba010ddb4974fe.npy +03636649-cef6757831b4d9738c8f019f17f4687c.npy +03790512-db5b6c2f64fefe5b448c90b3a2fec4b8.npy +03001627-8c281caf626df58671a782a4379556c7.npy +04401088-6d053ef40bedd8fcbfa0195eb6461a44.npy +03001627-64ead031d2b04ef0504721639e19f609.npy +02871439-9a078a05f9ffff1b28f28448e3bb829e.npy +04379243-e13f70868bd5e3a08d9d8badd9c0cbf8.npy +02933112-39f7a4eb09dd695d46dbdd6b5b884b3a.npy +03691459-c27f121649123d0a51d91df189dc282b.npy +03211117-2ea0fcf4f443b36c5516f88085cb9af9.npy +04256520-124bead2c137a6d1f652f706160dc96d.npy +03624134-2cc5c29fe6e2d1e92e933547dc663323.npy +02808440-95ef936127865ae2a9a1691b6f98331.npy +03991062-e2276eb0322d1885cb2a965e75be701c.npy +02924116-6083ff0f7219d82d6d45d698c7dd7b29.npy +02747177-44a64fa7c3378f16de27b9aa1df630c0.npy +04379243-9c8c8bfbf77716f36b4fe272da0db543.npy +04530566-ab01205090242c7277945fcb3f0ff3f2.npy +02828884-c02649dad5a5946dfcb04979ea30d7e8.npy +03001627-5516e76a34984182b6f6d1d58b7b1311.npy +03991062-9d0b790fa24015c0f9aec59741c69cf7.npy +04401088-a7056690a5bf34d24ffbcf8cf904ca12.npy +02992529-6d053ef40bedd8fcbfa0195eb6461a44.npy +04379243-6af7f1e6035abb9570c2e04669f9304e.npy +03790512-aa619a9f4b2e200495ff232cd38210b4.npy +02933112-c55498c03c913177d200faae04ce3f8.npy +03001627-50415355dff6f4e0c2c1a442b53fa053.npy +03691459-e66486c1f5644e298a0181490cb73cbc.npy +02958343-c3858a8b73dcb137e3bdba9430565083.npy +04090263-b451d4091032fe57aca1893e093d31f3.npy +03001627-d9558dccfe8e3381e45ef4135c266a12.npy +04256520-ecad0dfdf6338cbd457ba044c28858b1.npy +02958343-bc9c588a00ae179fa2645d665a7d8fa.npy +02871439-3d422581d2f439c74cc1952ae0d6e81a.npy +03001627-bd9137fb2f1151b23def89b32cef8e45.npy +02747177-9c0847d6c42eca062846fa729d90e125.npy +03691459-b819ee65569e9da21acadc443e8b347d.npy +03001627-57b043906feef78fbeae145d587f201e.npy +03001627-2d75f86921cb919b88dcbe86402c7c15.npy +04379243-ba52d8aed2dd75bba75f2876a99ed045.npy +03001627-95d8553504c65fb4b770bfdf3ce10896.npy +03001627-d4b4d348cfdc2aa5f99372bbf9c0b8a8.npy +03001627-b24b70c9aaec3932cf577b918c6f725b.npy +02828884-7bcb67e77adbb19bed98cca8f0ccd5f7.npy +04379243-43ba3898894751d4a2be11b607ccaafd.npy +02958343-6d296f7fae3f7f34981c1fca8c617850.npy +03467517-16e71fc6e50d0e6226587cb13c78fb9b.npy +03691459-119d64f6de33ed4093eb0b4dff044a09.npy +04379243-96e9571393290511be52c3c71dbf7749.npy +02992529-ad66da8440023d8a1e929774f9727b5e.npy +03790512-c4e0be3db8960e7799c206f2618a97af.npy +03001627-4019d848076af6157fee47aa19e2e28c.npy +03691459-9dcf9b3c53f1cb135afcf0aaed5d73d0.npy +02924116-a47488463d1fea38550f48125b5f584e.npy +04256520-3b8f2b955ee9a904b3c42e318f3affc.npy +02871439-3cdcdefc72c3760596dd43aa0ec847c9.npy +04256520-65711cb0e57123e037b2bb75885cfc44.npy +02691156-1397f5bfd89673b21fc43d5b32fa230f.npy +04379243-c4d4d0cde7e39bbeaeeec543ce96f24e.npy +02747177-e5050955cb29144b907bde230eb962dd.npy +04379243-4788fa0af36e94ea38c2e72e63f5bbba.npy +04090263-1f4f948abd74399572e9add3b9371377.npy +04330267-69d2d6bab648bcb487dd60af81c93a3c.npy +02924116-aec4d33a26e8b959193d7855ecfc1bd3.npy +03211117-68e75f7265569b8ca2d7e4322f7f9e03.npy +03636649-54654f299bbf5ce4e7a1d4df7812ed0.npy +04401088-fcdbba7127ad58a84155fcb773414092.npy +03991062-eadfc9d3098273dd6ba14bfd91a75020.npy +03001627-fa4155f8091689a273801486f0f205ad.npy +04379243-cf37563a68edc94bd71ce74ab5e9c1b5.npy +03211117-d9960f7455676e94a0a7b8ecc42036d5.npy +03337140-aeb08906aded103ad61a2ba1b75d9b90.npy +04379243-ba311a09f08ea7899c39abaf208a73e5.npy +04090263-95cb92425673feac6b2c8bb96250e4a0.npy +04379243-e811612c42cf5c5ae0cc7e7449604bbc.npy +04256520-13568cb7d4bb7d90c274f5fac65789d8.npy +03636649-bece8f6d89e653e6fcb8d8c6d4df8143.npy +04468005-b8161eb1622da15d9762e982d16958a5.npy +04530566-a70c472cef0c354dba2abf2ecc57eeda.npy +04379243-84d5c290aa1c5c3e28d0a21d73b2739d.npy +02992529-280a42d54e91c6968a02f6ad0818c761.npy +04379243-90889a0cf4285ff4f46e6e4e575a5bf.npy +04379243-b7bab2a7986f34005268928fe2c1fae8.npy +02992529-d9d06d2772ecc526c0dc3ed657ab97f0.npy +04379243-14d6b4b09dfc54e9d679a95896f75103.npy +02958343-61bcc13c67a92542b6aab5f7ece0e6cd.npy +04379243-8d0390d8d66bf1cc30b07c64830a47f3.npy +03001627-64e440b5350da101512d71be7dbf2d60.npy +04379243-97bfeed6025f68de5fe8cd129a2c0fe0.npy +04256520-7511cf30cf10869b4f7ad0010e5a372b.npy +02958343-33ca3037b6dc96c1df7375fd56cdeb81.npy +04379243-de5de9cd2d952cc5278f90ef85162deb.npy +02871439-e5d5ee2194c108bbd295ae4632dfd941.npy +04090263-e8ceb645b5a82aad8e27654291ea5e0a.npy +03593526-de673ddf9df03b8278cf1a714198918.npy +04379243-3f682ce98ca01c85b3cf15c77de45986.npy +04256520-bc1b55a6807caa9b490ad276cd2af3a4.npy +02691156-2c9d5fed0ebb4a544c3a35cee92bb95b.npy +03467517-dc7708c870000008a24eeca91f583600.npy +04401088-57657c2b0d983a1658975870bb96a55c.npy +03691459-5775db2064a6b0e87d72888c0a9277c.npy +04379243-abd1518f823abd0ff51fa0238791f5dc.npy +02808440-247a755e3e86bdd254d7082b34825ef0.npy +02747177-f7c95d62feb4fb03c0d62fb4fabc5d06.npy +04256520-b543411f1fce1f30e6fe3612af521500.npy +03001627-877391ca125a5ad07a56985e287037f3.npy +03046257-84d1404385710894fe3e90bc90e90c63.npy +04379243-73eba3054b62c14b76c7054c38bb1311.npy +02747177-7065044631c0eedaad5067eac75a07f7.npy +04379243-1a23f3f25a8584cc49fc9876b157a42.npy +02808440-b4e2c11f4c01123933d9cf37f30825d7.npy +02933112-87e7c6e590eaab04f42a90fe4baf4591.npy +04090263-7da1ea50ed1445ce2511f68da65f4c4.npy +04379243-ff42855b8cd62a1060fdcc1483180fd1.npy +02876657-caa8379f21c74f611f058bf0578300.npy +03636649-1fcefc2c2ff00dd6c7c291dc7d41000c.npy +02933112-d06a1c6dc8a4dcdecb3bcacd97bbd8b8.npy +03001627-bff224175aed2816597976c675750537.npy +04379243-8b0e0e3fdf70192e484776fb236aef2e.npy +02828884-537a02eff282b33df58bc14da5676759.npy +02958343-3ea856c52fbb213fe151fba1241f1efa.npy +04379243-217a31e6044506f41b17743c18fb63dc.npy +04379243-f0e18881d2d01e91286a9d56d8187adc.npy +03211117-23f0e9274d835f2d75796bb36346e6ad.npy +03001627-813f2777195efc4e19fb4103277a6b93.npy +04530566-bec39afc5bad2dc45ef003dbb9fb9184.npy +03001627-c976cb3eac6a89d9a0aa42b42238537d.npy +04256520-377fceb1500e6452d9651cd1d591d64d.npy +04379243-3629fe311f6a83eaac8336231c53cd1.npy +02958343-6a81b52d03080172ea7256175786076.npy +02958343-ca93e4d0ca75ab1bafe1d4530f4c6e24.npy +04090263-e03a316409096ecb625f0699ec733ab7.npy +04379243-4b39fda4ce751bdaf51f77a6d7299806.npy +02958343-bfa5b41549e86f3c618e9d35559b7aa.npy +04530566-7cf500d15ff839e92f35bf9c34b31609.npy +02958343-73df85f3bb763fcf148474f05635eadd.npy +04401088-78b4f3aa956b52139531a714ad5bf7d5.npy +02828884-5f12f2a5d67a1e9fcb2a965e75be701c.npy +03001627-aa1e9626e1e23038cc0b9bf177196e52.npy +03691459-c3661475a6b1f7bcfbe246021081638e.npy +03325088-869d5441e74a94b3251c40136771148c.npy +03001627-3457146f11dab7eff3c9c1464e55d580.npy +03211117-2112d3266c05ad92d99bf9137e86c0b.npy +04379243-4d9a737a9ffa6277589aae130c1f06fb.npy +03624134-db33d647c8e9c8f9aa19ff1f7032d4a0.npy +04379243-f94e4eb78fa79d9d41578d1a851771d6.npy +04379243-a5f1b90f85d875f13afadfff198a630.npy +02691156-ad10ae20ac2e87a2adcbeb54f3d014e9.npy +02691156-6ad44d7abe7492b7d89ea85a4a66c0f9.npy +03636649-b474613907b293682f8b82e61bb347fa.npy +02828884-367cc7ed7b83b7c8fff16555386d173d.npy +02691156-effbe2683574dca2b37a6cf3f07b9ff4.npy +02871439-ad808d321f7cd914c6d17bc3a482f77.npy +03325088-a1b38345041badc5b362845c6edb57fc.npy +02691156-4635326bc4fdc3e9297cd7e2ef7dfa80.npy +02933112-d30e98009559150df27756ab62184cd0.npy +04379243-d03cfa4dfa08467f19620b61f6587b3e.npy +03001627-b9d60d124e24849d37b2bb75885cfc44.npy +03691459-7174c62e843e444286a8288f8ff176fe.npy +02691156-a2c5e769f19c7e97b7d7aa9b9ebcccb0.npy +04090263-c7774cf7e0e74fd2194ef2821d9a630e.npy +02828884-1b77f2fbf17f28e726cd2499b0c05f5a.npy +04379243-1645b28322131b6258c407efcf93be6b.npy +04468005-7003287f015d22fd52470de2774d6099.npy +02958343-9e2e375fd5fd55b02a9eb0f146e94477.npy +02828884-7aca4c47c6861f2122445e799be0f18.npy +04256520-629e4382f2d569f366b86624c235daca.npy +03211117-e09670b2d890f63d84e349450a5c51b2.npy +02958343-22bc49837550bed21e570d3da54bf9d.npy +03337140-96ba97564f5ab63191c352d02061b3f7.npy +02828884-86ef2d2a38bde1ebad5067eac75a07f7.npy +02992529-4a48ce1a067f686dfb63369d5dd85d25.npy +04256520-337b0e3fb3c00f6e6ff454af1e8947f3.npy +03691459-dd05c61250149ba5d49b96b9f2811c7d.npy +04225987-10b81426bea7f98b5e38a8a610bb08f5.npy +03261776-f90f01ec45ea95d65481d2ca627e43e7.npy +02808440-170cf39eca88a50e125fa9990176f0d5.npy +04379243-caee24359d445f4fac509329c62279e6.npy +03001627-3a123ae34379ea6871a70be9f12ce8b0.npy +03001627-ef463d298bb401b3ce1493daf6a835b0.npy +02924116-4f934ef7f9b725057d5938f6fe09fcd7.npy +02992529-6a073661711d8b9f1a5b805dbbf26206.npy +04468005-574ae16c1b6cabbc8a3f1a8dd89692c6.npy +02828884-fb9775e4ada511d7844283a0969502b7.npy +03691459-4d165a6accfad3d36f18f54fab5ec8d.npy +02958343-89edb3d434f4c983afe1d4530f4c6e24.npy +04379243-94c0ab5650ea392ddcfcef693e7ec696.npy +04379243-74ade89963828a37d94ed55f750426f.npy +02691156-85a15c26a6e9921ae008cc4902bfe3cd.npy +03991062-bc37a3aaa9651aa410897bb36a0ea9b4.npy +04379243-2a2d4bc0c2ad2e7e332e588d1e0957a7.npy +03001627-c06a8f95fc273106b0f4a0d43d1e4c23.npy +03211117-12c64d690700ecd2d25ca1a27cf9bdec.npy +04379243-db96923291ea465d593ebeeedbff73b.npy +03211117-ba0f98e212668fdd22532be027c41b0c.npy +04090263-f1938c5ed63aaa7c91c108af8af49f8f.npy +02773838-e90e27c3020d25dd76bb31db0358e9c6.npy +03001627-f4268a28d2a837a1167c009da6daa010.npy +02691156-ce337df2f75801eeb07412c80bd835.npy +02871439-64eb95e3fd7cfdf759bc1c69ff20e0.npy +04379243-80a86204247b30fd21ef666e979e4e80.npy +02958343-b4715a33fe6d1bb7f63ee8a34069b7c5.npy +03001627-9e9697da825cbe4b3002761e7a3ba3bd.npy +03467517-5288448a001ace0b47a275fea6658912.npy +04090263-d9c6c64bc9b2c1e0a5dd675711905b91.npy +02828884-7acc1a370dfcd3a85ff6fe84f53e00a5.npy +03001627-a3e3eee0669bec82c9f016d57db96408.npy +04379243-47f25d5b367326ceaaf15b62af6b513f.npy +04379243-6ff63214c89d65d7b87028a4b477349f.npy +03624134-954fb0819736737a1b9c8e2fdbfc1118.npy +03938244-7c94c3ede6a3d3b6d0a29518c983e8c6.npy +03211117-2eb15877e9ae80d1d50505ee01b106d8.npy +03001627-226927edcf014278cb94e5b490ba717a.npy +04379243-be5349431760322c7b7b1bcdebeec13d.npy +03624134-2e9a0e216c08293d1395331ebe4786cd.npy +03761084-fadfea8610d0a2f839d3717288022c20.npy +03642806-fae8d4929159d0df7d14ad32b7473fd2.npy +02958343-713b7eaeea5580af1f71b98bc1f8bb06.npy +04256520-fd1ca30eda9a2163e2ca61e91f2755b7.npy +04379243-332c75b56c4a80f77ff6ace05b36a5.npy +04256520-8188a091928db3cb489883f17c1c79b8.npy +02946921-f4ad0b7f82c36051f51f77a6d7299806.npy +04379243-1c679d8a4fc274f47523f50a56d94935.npy +03046257-1b85f3cd227da31de4511d9a59e40339.npy +02828884-4e4b38efc9345bc3cc543a6b1ba2fd1d.npy +04530566-56e2b7332f9011b28fecb9f40039f353.npy +02828884-481885f3ffe14c40665f42dc26fed092.npy +04379243-2b68cd4ffe443506abb564bb0657e0d6.npy +04379243-a78bd5277a6c03cdd3726fd70b88cb7c.npy +02958343-c5079a5b8d59220bc3fb0d224baae2a.npy +04090263-fe9777c5bc60bc393554ccf8c30febe7.npy +03991062-756cc1276b4894682271466eed05a4d3.npy +03337140-7cf0301223e59976e7ecdbe73ef4323c.npy +03790512-fdb6223c286cb653cc9e7530f9d8e186.npy +02933112-634fe05a380adac585430ccbd2632877.npy +02946921-11c785813efc4b8630eaaf40a8a562c1.npy +03046257-18de33d37e409ea296791035e86a30f4.npy +02992529-fabcaa4858df16e35817e30de1dabac4.npy +02958343-aeeb2fb31215f3249acee38782dd9680.npy +03691459-e7560ac665c6fedc7d54ddaedba43004.npy +04090263-6834350f16324d0527d7c45115828e34.npy +04401088-a0efaa2ba04bf091adbfb30d8d1b297e.npy +04379243-55accdd4bb5337db5cb8c3b627244050.npy +02924116-b743b94f562fa33a7c3c6f82a395b347.npy +04401088-359be05b5042209a502122ac3599bb74.npy +04530566-9e49192ba54ab0fc92c108c58096cae.npy +04090263-846075a4b76fe0c3052214d75e02efc.npy +03467517-567df77255c293b3352e5d4d2615db5b.npy +04256520-dda3a0ecc85a337a593ebeeedbff73b.npy +04401088-a434289b281e629b81139543c959a70a.npy +02828884-23c874e54f1f9f152d07d128adae16ff.npy +03211117-8359589eb5c647a61f571c9e890db987.npy +03467517-79e1607ac6676f3a1ae1027f8632e61.npy +04330267-27cebdcd07cf90aa500158c23c4c5a8e.npy +02992529-e55c20e95bf299b5fc4d1dd4278b31a5.npy +03948459-41bca1dbde9fe5159220647403cfb896.npy +04256520-b918cd058e822e00cce02970cdd7e7da.npy +04379243-e2312615b21d7690c4f22423196a0dd2.npy +02828884-22031fe0420834a9ad5067eac75a07f7.npy +03467517-3e4bc88d2f2456f4ac705d0d37f5ef0d.npy +02958343-e7f94161bd90444f8cf4cf458d5ff7b.npy +02880940-4017528ab5816338664b3b9b23ddfcbc.npy +04330267-89550f9f628589bd3e65b46d4ef6236d.npy +04379243-54bc0f4268150dfc616626762e4bb71d.npy +03593526-c0d3656a60fc5e3b16acbecd8bf6925d.npy +03211117-e65ace5f42977a75cae346657a37ed71.npy +04256520-70e157cf567eb3aa79b26024bd30ee26.npy +04379243-fe38d140fa386ed4c434c6fce2e7773.npy +03001627-4217f023367a28b06747dd1c5ab1ba16.npy +03593526-ccfa627a398599ebde03ab2a27ba7531.npy +03624134-e199629e24c10052ed9c5b25fef60d04.npy +03593526-189996124312ea7430612f5c0ef21eb8.npy +04379243-ff32ec299e6c37e767d783b4714d4324.npy +04401088-9028fceed53a144e10bc2436075f6a52.npy +04256520-cd2a6bf7effd529de96ac0c4e1fb9b1a.npy +02828884-675f7c94f5422ebe9e4965f0106e00d9.npy +03636649-3eb6c3bf89e5c9312569f5d050e29bc5.npy +04379243-3d38d16334e796526f3d2b1b15fba494.npy +02958343-5e5d7901f587c39726d36807b4d406ea.npy +04379243-6ec67ee0e57282c01e6058fbce2703bb.npy +04379243-9da75bbb92f594f19cd431573238602d.npy +02691156-23fb92d8cc0f8ac4def547874c3364e3.npy +03624134-2514540f36b2ced12f8c68dc62edc38.npy +02691156-1385305478499e6c1e06124bec25a766.npy +02933112-1fc8231114fa42a7c59350d819542ec7.npy +02808440-2272656841c3c84a61c4f2a9857347d.npy +03001627-47d13a704da37b588fda227abcbd8611.npy +04256520-aeff3da4a02a22b07b0278d6b5ba1920.npy +04530566-ac4286c2e92e3367d5ba5130450bf929.npy +03046257-faf4bfc17b75a160af04fb2a17e783e6.npy +02691156-2af93e42ceca0ff7efe7c6556ea140b4.npy +03001627-577d1c446658fdc7ebc935c637c3e3a0.npy +04379243-93f7c646dc5dcbebbf7421909bb3502.npy +04090263-f5a1080ff36f7b8c38cddde805fe966f.npy +04379243-98b0b99d86a2342b2b23d7805f9b288c.npy +02747177-4117be347627a845ba6cf6cbb9f4c2bb.npy +04090263-3ddd478e24daf437f99860cd321d6c67.npy +02958343-6fd6bb6ccf11968c5242705df8faa8e5.npy +03325088-75400f002f5ca46f275e59035e1ccbda.npy +02808440-a1531938a8f8c32b6e1f781c3bfa1222.npy +04379243-98ec86d721b235374d18c1ce5fca6777.npy +04379243-3297d1740b06d444855931d119219022.npy +04530566-605b56aa6a4c9ef49f1deb04fb8ae481.npy +04379243-380f9d534e139af5dde0caad53ba7e0c.npy +02958343-f61888bca4392106bc790478b4a84bf2.npy +03001627-77b457b102a9b82f5dca6305fb9f97ca.npy +03467517-ffa8015ea7ab2e0b900fb9e135826c5e.npy +02691156-a73231f3d0342db94e8b48a4c01e36f8.npy +02691156-e452189bb7bd6617ef7cbef6334698fc.npy +04530566-f99537c4b6d50126d87c63d8b3018b58.npy +03001627-430f87764dc3f455ad484915511ccff6.npy +02876657-3108a736282eec1bc58e834f0b160845.npy +03001627-7929676e756dcd41577b5d737869717e.npy +02691156-d80afa36aeb72c552b5147716975ed8a.npy +04379243-15180f731834feeb2f0a9a342c0178db.npy +04530566-5d0d84924e96eee6b6162efbd23a9d5f.npy +02992529-9e5b9dd860689c5c217f93816a639386.npy +02828884-edec9a4512b98f6f2056b4bd5d870b47.npy +04401088-cea8f15682797fe6eb386a4e845c05f5.npy +02933112-2dddaf7774fd11efe4d4a3bf05a8b705.npy +02691156-1d09583e9236b8d149d860a48be37092.npy +04256520-3dc8e7cd623f5aeb65498947b67a3f6.npy +03001627-4275718494dd309bc7d25fde6b97816.npy +03001627-92db07d09bb110386bd0aad3d992cb54.npy +02876657-ac7e1eed3c4ded7db3010b85c6cbc688.npy +02958343-61bbfe43afb10fc8360bb9d5bffb2354.npy +02958343-e2e9b87d7aba1dfb28044fe9244db50a.npy +02843684-ba88e788ae3bca5e84ee0c32fc6ec7d3.npy +04530566-d317c39473534f97b1bb46d2556ba67d.npy +04530566-2340319ec4d93ae8c1df6b0203ecb359.npy +03636649-d1aed86c38d9ea6761462fc0fa9b0bb4.npy +02933112-1f1484649f0b2d9f6820cc0e7030e15e.npy +02958343-ef0703db8a04f8c0c0e3666c7d0ec7d0.npy +03001627-4a671498c6e96238bf8db636a3460ee5.npy +03636649-3ba4b7bb7b6d89415461e7d030e03e48.npy +04379243-4fb3b350f197a7e64e045e9030a39002.npy +04379243-a6311f0c2108867aee18bc48b60b36b7.npy +03691459-85399d0503bc8a5b59a6208793b9dfca.npy +03001627-bc76dfa9e0a91e131e06124bec25a766.npy +02691156-3fa511e1882e41eeca8607f540cc62ba.npy +03691459-af97965ad9dc0ef01ad88f716ea80910.npy +03046257-c805c00b467a90227cb512ba2d8dc1ab.npy +04468005-7adc8184ad679791e810c01b1498aa2b.npy +02924116-869d7fde444e238d87cfb85cd974d515.npy +02958343-2fc27dad23406a2a7ae33d942430658c.npy +02933112-c07a52687cad81a4824662341ce2b233.npy +02992529-8b4d28e4df5ac6e8656557acf97c5e2a.npy +03001627-49e920c98895f90281a172d69c52a28a.npy +03046257-83255e2f9b4f039372f8ff3c650e385a.npy +03001627-9663b0a707ba9753983e0ae0e9b98f24.npy +04379243-1ad0e2f815c6f242d197f67767b32741.npy +02828884-c9d456bacf459248930524909158355d.npy +03467517-c651a91562b86ed8edb9371445f615ae.npy +03636649-330b05e262c93e216078c74a96498820.npy +04379243-7191fe8893bb6a89b5b7c35a8e7396f2.npy +04379243-b2867d5067f44e0d6b1cb83d86c19bfc.npy +03761084-86bda959021c63b48242cb5dc48c7177.npy +04401088-5681c4fec43043c1a9f85d9079e13c55.npy +04379243-175c0be26d0f2e916cb0bd372b0960ba.npy +04379243-262f3ee836b6b023c5beea20858a99d5.npy +03636649-2156df35753fc26c6e285dd101afcb51.npy +04256520-3aab3cf29ab92ce7c29432ec481a60b1.npy +02992529-cfeec23a9ea66a5021844676433a0aca.npy +04256520-103b76b2594a1582eaf14273fa406ffc.npy +02958343-74b37c2f88e0ef7a469bb3d27ee3bc4e.npy +03691459-d2553e5fc4f1527cfeae521e94848af6.npy +04379243-be8a750947549c7555f9913e822d5318.npy +04379243-adf9117f3cba509cb4e3935c6cee4b35.npy +03001627-7772a25ce35049881dff5c2e57ad46e.npy +04401088-2acc3bd87282a7e31da45817bd55c1e.npy +03001627-8f4750616cc16a3f84633b41c8a09fa0.npy +04379243-202e7b5c3ec079e299e8bf807e902261.npy +04379243-61ae29ce7a0d71bc57f15fc9385a8a01.npy +03636649-afb7cc3bbc3595a4e9b3dff83c7ff715.npy +03001627-e015df603fbf0852f58087d377226538.npy +03211117-8893ff22c6dae8e3a276bea9ebd065c5.npy +02933112-4dabd28be1615419546a56a24fdd418a.npy +02876657-5d6001f9e6a15de3e3edb5ba52088f8c.npy +03691459-bfce87b0ea79c8aa776400d171cf9dfa.npy +03691459-8ae34239b6c46afd55a4dbb6a97481d9.npy +03046257-813fc7bf6c5cc031fcda1fad26dee92d.npy +04090263-af727bd232a8f1f4c3d83d64958925ad.npy +02958343-a03c7c73c067afa9e5bf84cdd88910df.npy +03001627-61eb0af11765544ef91663a74ccd2338.npy +03001627-3c27660aacbcf99886327adaa986dff.npy +03593526-5e61ce9dd25efc97eb7b988bf4f0d1ef.npy +04379243-36a14a47b91d7c42f51f77a6d7299806.npy +02933112-5413dbc1844cbed099dd23ec22c4943b.npy +02801938-b884587324a0cb7a643af06537e992c3.npy +03593526-57c542a72c735adb7e2297b5fd58c53e.npy +02828884-a968b5d4ba65b1af155d75bbf62b80.npy +03211117-b2257460f3465f76370c049e2352d133.npy +03467517-d05fcd42a07cd11dd57700c05b1862d8.npy +03001627-56d06d2b12a40bebdbbc9440457e303e.npy +03337140-4563c70da4aa13814c3aee8e9d3a6ffa.npy +02691156-e8e1b765fdf5edfa14c19f41d007670e.npy +04468005-ebe70e10c1b17c91616c9d4a76208d49.npy +04530566-965153f3599a6ed6be7ca2216dc1576a.npy +03593526-5c1128439ea33c8398910e50f05b8001.npy +04379243-cf1a7653c10aaa0eab610b0c94236463.npy +03642806-21e03f21a8724ab5bfa1d058f8ea2f0a.npy +04379243-8069dde16a0f987664b3b9b23ddfcbc.npy +04379243-39a0cbf3e4b34ca44499f83a01888ef1.npy +03513137-8322568841b84054b581f592cbd3b472.npy +03948459-d4705e348edc0e405f4103077989355c.npy +03513137-c354dab2bcbe9c68d6d40d1978baee1c.npy +04379243-18cc2e8b4034da8fb20aa91e9e90c311.npy +04379243-a10406dec2b6e9a2df81d783214232f2.npy +03261776-724c6fc81a27625bb158ade66cebf744.npy +04401088-e458abdbff34fefe255591a17641445.npy +03001627-c4a4710012ee39bd19f4b416b31c46e0.npy +04379243-2acce0e402725f80ece694d60a812f12.npy +02828884-188a2c6c2add34399dcab1d3e38b3b70.npy +03211117-3de6f62a6faeb80933e9820fd7ca74b3.npy +03001627-465ea1eb1c76c1478d1fe8cdc415f4c5.npy +04379243-1901183525f0063d2822b5101b06e070.npy +04379243-32ddda038bd1bc15c3bd24f986301745.npy +02808440-841e9b3d40aacec23d89f1ada385db86.npy +04468005-bcc41de06b8059f5ba32f71f79130dff.npy +02691156-ffbc31352a34c3e1ffb94dfdd6ddfaf0.npy +04401088-f75e6866c8965374f1c81a6df84170c9.npy +04554684-41f9be4d80af2c709c12d6260da9ac2b.npy +02958343-ed91b2509171fdc1c48492b454f1615a.npy +02808440-da7c0e8e5a2d87f190a2f7468a138e7a.npy +02958343-1713a1ac8aedcc522b12ea83455b0f44.npy +03991062-2d97e5970822beddde03ab2a27ba7531.npy +03001627-ce8f3a0c0c0bb0b9b20716e5484f7807.npy +03636649-5c9f3efb7603bd107c57db67d218d3b9.npy +03636649-9b876bb9de59e5e9aceb781f079a299.npy +04530566-d3c26b292a4a6a82621153a3cbe4a77f.npy +03593526-94f4ad8b9ef500221952fef39dab6347.npy +02933112-2856634c4c0551a814038d588fd1342f.npy +02691156-157bb84c08754307dff9b4d1071b12d7.npy +04256520-f080807207cc4859b2403dba7fd079eb.npy +04379243-7653898ee4d8173827edb0fd78caee34.npy +04256520-19f52379f01878ad9517a37c9996fdf8.npy +04256520-92ee5842113109b05550af5454dbad36.npy +03642806-5363c4a882e17c9088557758112e80be.npy +04379243-5e0b6969f252cee2b355cfc2bfa121d.npy +04379243-1af5dee23444c104fff16555386d173d.npy +02958343-3026dc837dc5dd7a157e36ecb370d387.npy +04256520-69e983e816774aa01b17743c18fb63dc.npy +03691459-1742419bf5a54be3e1a894502fdbf97b.npy +04090263-2632b2d716be1677914c738e92faad58.npy +03691459-56e2847e61b36a134c7bf604b18af84d.npy +04256520-e596ed19966b698c10edd100dffd8d85.npy +04379243-c363667046c562c7d9c568a52c35ec71.npy +03636649-3f7eb5ef5d304040d847cb32379eb854.npy +04379243-6f7260eb15f4531348ca89b7a9405654.npy +04468005-ec0dc5270b3e1fd4a5e12deb37e3ef08.npy +04330267-a46e0c10f17f928ba2bc8d1e386113dc.npy +03691459-f5024636f3514eb51d0662c550f8f994.npy +03211117-5f0119e9c7f437ff83361808b78d50c3.npy +02691156-1d63eb2b1f78aa88acf77e718d93f3e1.npy +02828884-d8b87f36fde3f2f3bc5996932c1238cd.npy +04256520-9294163aacac61f1ad5c4e4076e069c.npy +03636649-4078ba4cad280d72b8b431083b6191e2.npy +04379243-8bd48b85e15e23e162c098c9081f25f4.npy +02933112-63cb49d18eef102a5c910a98e42d23d.npy +03691459-5da2a1ae6ec64155dc7dfac1f2c9f0d4.npy +04401088-ff8ba237ee9164c8ff86292618094648.npy +03636649-ed2f272286506a5786e8e92cc08146.npy +04090263-5ff5a86fd864ddcaf0e1c0df18936d05.npy +03001627-b0fdc43b0b4e990719abd93be2967664.npy +04379243-d62f718a14db87cdb40f0ac0fb9a650d.npy +03001627-412b79b2d0572c6afb76895427c01995.npy +02958343-e1197a4adc50d16abecf71e2e014ff6f.npy +03636649-9150920591733fae0fa444666ebe22d.npy +02691156-619f0ed9bd92778e1c6bce26aea93f68.npy +04379243-f0b044c592e19f3d8dab161b48d8b921.npy +03001627-780441a4b2e033f2796c584ff1fcf56d.npy +04379243-10d9b52541550c909cd431573238602d.npy +03636649-ed81fd0ffffd360638e74158ae3d41a0.npy +02691156-350110d2828b3b927370804727e72eb2.npy +04554684-1a53e51455e0812e44a7fc53aa1d411c.npy +03636649-266d6b136cba49504b3c42e318f3affc.npy +02958343-a3e1cb03e1af7c6161c6c61410fc904b.npy +03046257-3edef12fcf087125868fb986bc092533.npy +02876657-e593aa021f3fa324530647fc03dd20dc.npy +02992529-1c3795fd5c4c0a3c2efb70bd2c052734.npy +04090263-6c82de0208ed0f551ff1879fbc41d0b.npy +03636649-2ac3425dd13590ef1f9097f35cf9fde9.npy +02691156-b55748e796006e18b3f627c3cfda6efb.npy +02958343-bfae73d79c066a1fcc0c0cae12126488.npy +02924116-22f056f45adc9b81cd9505c17c2fdd7a.npy +04379243-62f7c1abde6bd25e601bea3dca268229.npy +02933112-c54828598efd80d78542f96306060db4.npy +02808440-93818961a43764e23321831d2245cf06.npy +03593526-e3fcf5ec83e5fdc54b3c42e318f3affc.npy +03046257-23f83dd607100e84b5c397b37fbf4059.npy +03325088-90ee4a3d500e4ca4c36fb70296e45483.npy +03991062-762ff1483169859d44c183864792bc2b.npy +03325088-f1cc1b5b92f010a73321831d2245cf06.npy +04256520-e3ce79fd03b7a78d98661b9abac3e1f9.npy +03001627-4966ef665c6ed17d4240438e2a9161a.npy +04090263-6571520aee22fe52eab5ee569c9de1b1.npy +03636649-d2d645ce6ad43434d42b9650f19dd425.npy +03691459-f858ecde18c5dae2f398d0c5832df00e.npy +02808440-189c1ffb58c74c3bccd0340812259a39.npy +02958343-3129657917191e101f0d59cde6139796.npy +03001627-8e93fb99aaf17b9504ca5aa564aebd0.npy +02924116-27f138cd6641ce52b038a1a418d53cbe.npy +04004475-b2ff768db80d2d723e6c258d47d0b669.npy +03211117-d8b955cb8ef35cd22f2d2270d816bf3a.npy +04379243-ca7bcac6b92b5a7d377b9297f3055210.npy +03636649-8261f96cc33ddb264a7f20ad39e7a642.npy +02992529-b91bbf0a0d09d2eb243525d45e430520.npy +04401088-ef34d9789a83659c9f8f9b52e89f6554.npy +04256520-bc8e9f4d4076ce4f6b4675882670d943.npy +03001627-d50b0c6c006936f8de03ab2a27ba7531.npy +02828884-1c47c37d6c785d4fe7fd9a18c19837e5.npy +04379243-211d17b0424b10c539d3717288022c20.npy +04401088-831d6d9118e1a2fb71f2e8f64dc1f509.npy +03593526-8e7b2732b637559976fd405e95f98511.npy +03337140-5ab4826be1de80dab7a33532f4904aca.npy +04004475-1d2a6082238f011c22d3f170937c6a0b.npy +03636649-84b093611cca35f86f104b4f395219ec.npy +04256520-3aba6ceca44f747b29a72cc7a32af9e5.npy +02818832-1f11b3d9953fabcf8b4396b18c85cf0f.npy +04379243-a44b3e23fa01c205c3bd24f986301745.npy +02924116-43bab6803534b01f52470de2774d6099.npy +04256520-d4a80e7a92e2c4f98981b7cb87854e68.npy +03636649-32e9d8a4b5a141a2615efc34c3b36ef0.npy +04401088-74a65213a90e1f2d850a112e6048afc4.npy +02691156-a00ed5d078c6244c37678474be485ca.npy +04256520-181f594fb55e7d811b17743c18fb63dc.npy +03001627-5ee976518fc4f5c8664b3b9b23ddfcbc.npy +02924116-183c1ef7e783a05a8aa27cedfe9e8bf6.npy +02691156-5524fd6b35f47d5ba8cba409c4409ba9.npy +03467517-2dbc73ad4ce7950163e148e250c0340d.npy +04379243-449c32cd053b97ac623f20df7a811122.npy +02828884-220ab2896e0b5d87dae58dd9656897ad.npy +04379243-5912cbf7bd756d3bf51f77a6d7299806.npy +02876657-ffa6c49aa8f7ec19971e7f8dbfabf375.npy +04256520-2eb0a772c36144eba3f22b4b00de6dfb.npy +04090263-54ed1b7f842914285488420adf4edfd0.npy +02801938-b9a555f6ce431c8a3adfd94cc5954055.npy +02691156-fa4e8f24d7f0ae1cc1ccec171a275967.npy +04256520-62b02c1b27a5793fef188758bf2e3a30.npy +02801938-717f1009cff7c62e741621be11e9d307.npy +02818832-5cdbef59581ba6b89a87002a4eeaf610.npy +03928116-9b3fde7f4559be2363915d3d0e86b8e1.npy +03636649-5ef8a1aeeb1b25bd63fba60e6c90121a.npy +04401088-a1e51e185a9f24354b8478bdb97333d3.npy +04256520-d28912450f62b4efa8699b6183baa203.npy +03636649-5d45d41ee7fea0187cbb0b604dd1148d.npy +03636649-a5fc64e1faa85794de03ab2a27ba7531.npy +03001627-1c2b230840baac57df3c82bbe2e3ca02.npy +03467517-4590e640c4828cccd57700c05b1862d8.npy +03211117-20476424cf10985610b144a5a224780.npy +04330267-d98da0d1b24f509d6134c153bee8ea0.npy +02691156-396c8e232192a44be1a9c234926c21e2.npy +02876657-78f5db072e28145db1e647730e72f91c.npy +04379243-d14dfaade3e105306ebc5c7b8e36e351.npy +02958343-b76bdcfc277f54007f3efc94c2d31dc5.npy +04090263-a5f55a60971922fff3059fae889f5fb2.npy +03001627-700b11e2ea3e941faffa8ecba9b9d6f4.npy +03636649-ff43ef647c75b5a4fcb8d8c6d4df8143.npy +03001627-c9288e09458ec0e9bbc45ba666751519.npy +02828884-b852e63ad5983f1a8ccde000e771fc1a.npy +03636649-bf2687bb57e94f4071d7520e3757f3e9.npy +02924116-b4ad2006f3c6e09adab8f5f5224d1d8a.npy +03325088-fcfe9beedd2970f3b362845c6edb57fc.npy +04554684-d78b4c3dc263a8f9c5243a0ab191990d.npy +02691156-1825c91c5f2da4bab12962b43f188cbb.npy +02924116-d48362c5a290701f78194ea2c3f9c38b.npy +03001627-c41fe0605cfe70571c25d54737ed5c8e.npy +04256520-f23636645d46b743ad4f8dd77b0e70fc.npy +03691459-b2ed74172242cd805b2ae1f253050025.npy +03001627-7aacb2d4940e1af772ee08e78374a212.npy +03761084-5f51f5e0607167b4178e7d331e641179.npy +04379243-e37262abd76852ac00ee852f6d8aa3c.npy +02828884-8141d9182908d7288be87af3b9c7b4c7.npy +04256520-79745b6df9447d3419abd93be2967664.npy +03991062-c19c6178ed0f6f9da989559b7c93527c.npy +02691156-820c903c55d7a1908f0d19519a0ef908.npy +04379243-3889c517afd62ac5dbe9c90af547c85d.npy +02747177-5eea24527c8b3124cb2a965e75be701c.npy +03001627-b987a2ca54c6ddecb74697ced5978572.npy +02691156-3b86245a5cd388ccf12b4513d8540d7c.npy +04256520-4271d43fd97a7baa591cc7aab9026e54.npy +04379243-cb87512d706828e1e95cd0dc8c2f0e83.npy +02924116-6c3e80092fa36371cb2ecbd32dc2119e.npy +02691156-e41bbd12896cdc724d210d9468aedaf2.npy +03624134-d78c656d1847b92ddadc002e53eaf226.npy +04530566-816efac46f2f3c99452a4c76a476a0f6.npy +04256520-3f8523f11a622d8d6983f351200ac6a.npy +04256520-19192524e6ae1e85cdca798c54fdf54a.npy +03001627-2ba1779986eb9546f51f77a6d7299806.npy +02992529-6f63df7ca322514f41ced50d3a574698.npy +02958343-d22cec9b9f500ade28e9ca8e8fb04e0a.npy +02691156-8b9a404737736ece774a720fca15e35b.npy +02942699-2153bc743019671ae60635d9e388f801.npy +04468005-e5c8853f28328d0c2511f68da65f4c4.npy +04256520-f6ccf5b4afd9171c818b86d9fa7a616c.npy +02828884-32b62bb2758b4c7fd2b12aa6a0f050b3.npy +03001627-7a79745b6bba49114ee3d18ae9bb4bb.npy +02871439-d616e70071825c91281816ff6b8d922d.npy +04090263-41fd7683b4e722b716b34c3751bc447d.npy +03513137-d516787b65d08365480514d7f2edc0a3.npy +04004475-c2579f3b815ca02d9318709b609c3a71.npy +04379243-e49b95f478df00bedbbc9440457e303e.npy +04379243-4d56ccf8487a0a64fbd58bd1e0b7491d.npy +04530566-eea06d3bf1f7ce6cb538a15c6737824e.npy +04256520-4f863fb727ffab64ffffee5f2b1293da.npy +04379243-a5c6be40bd9332e873d4ab618ffba803.npy +04090263-173dd045c9da9aff6099a039722df68.npy +04379243-fa0580ea9b8940dfef1b7984700142ff.npy +04379243-bbf0968957f58e78f00f21861968ae14.npy +04379243-8ca1fd346eb62580ffc6e457221b9271.npy +04379243-5fbbdc1e83a45d258d1c65d617ea0b5e.npy +04554684-8c122f99b5a0aa047ca3f903b5926fb1.npy +03928116-6806f3e6e973f715c114a8120a565776.npy +02691156-2a856d0462a38e2518b14db3b83de9ff.npy +04379243-99737ff619cae25d6effbd64ad6b71b8.npy +03211117-d6039aa6de8b5992af6cfa169befaf46.npy +03636649-d6ebf710756c5839f8d3a35c7c106515.npy +02992529-7fa841359a3dce3dbcb8492ce3867c34.npy +04379243-2b39330072a4d5c83825a5bc524f67c9.npy +03001627-5fdb10483f79355581f5ac91b0c9e99b.npy +03211117-d89cb5da6288ae91a21dea5979316c3e.npy +03325088-840c861dd22947bee3f7a74e12a274ef.npy +03001627-3e80bf14b5e02aedeabde033450b7299.npy +04256520-2459280764bc155554a99e49f597fe94.npy +03636649-9de2685230d41d58c397356311cbeea4.npy +02691156-7932eddb8032b6f1e4d2773f0358b43b.npy +04379243-38d5b6ad3077e8b1caa22a10624245b6.npy +02958343-100c3076c74ee1874eb766e5a46fceab.npy +02691156-38edc8fad5a5c0f0ac4f72bf08dc79a6.npy +03046257-3182826d3c212720c4440dd41b08b3f4.npy +04379243-ccb1c5fecc863084391e4d6c585a697a.npy +03001627-39c629e6f9e752964c6ea7add0063fc3.npy +03636649-b736ffab5afcc08ace1d463bed0d7bb4.npy +03636649-52cd206dd4674bbd4fbd95145f67665c.npy +03593526-99f6281962f4b4e598910e50f05b8001.npy +02924116-abbb6509d2f4662452470de2774d6099.npy +03001627-375dd87b163dc8a3a3c9394112c76917.npy +03991062-28cdf1c93d91dbc671fdc118f95a3db8.npy +04530566-63d91bce2f3d26abdeb3e56da26a6974.npy +02958343-584a78bbf7932674d4fdf31cc2d78fd0.npy +03046257-b4604066f95413ffd2d25e908d9cfaf6.npy +03001627-ba5054bd7c2598ed832fe5f29a662936.npy +02808440-72685559e732565bc394d70fcc44879d.npy +02958343-2525b83c84bd3afbde2d51ea8231791.npy +04379243-23d68e01b77089ae76ad4f5e7c7020eb.npy +04468005-afbb150345afadb35392bb73ff1a60c8.npy +03691459-b40b4cbf6309c3519fa340262d231abd.npy +02958343-21eba3c73a705597db2c2b0116c82e56.npy +03991062-caadd7927e891931b27dc9f9b9dc6f03.npy +03467517-fcc1d297e1c4be5d93f0194265a9746c.npy +04379243-b3477e3ea9fd1676f016aee3d784d83c.npy +03001627-5a960456884d2a3b04cb542e2c50eb4.npy +03467517-bb36b42935f0a1bfe5ef386e39420701.npy +03467517-275c4f98ef07f2b393f0194265a9746c.npy +04379243-e75ddddd62dac8a119fb4103277a6b93.npy +02691156-23e30666530887e69a6e43b878d5b335.npy +02691156-de863b025e53c9a63554ccf8c30febe7.npy +04330267-7963f2d868a8cbb01989a128e43b35b6.npy +03001627-70eddfb0000447c637b2bb75885cfc44.npy +02691156-7f0c20bc26b08a163e2ffe63fcfe09ec.npy +02828884-152617f1e955e8baf4fb4dee5181bee.npy +03046257-6fd5c3b0efc04f3986c439c0403660e8.npy +03513137-4f0ae9814adde64f6a12484fa9d9be10.npy +03001627-5f0f17c97234b510b4bb271cfa904d13.npy +02992529-4303a97b71a1bb894208dfa1c5fa1065.npy +02958343-2c6b14bcd5a5546d6a2992e9465c023b.npy +02691156-7d19ed245331582c3fe7930fce05ded.npy +02747177-45d71fc0e59af8bf155d75bbf62b80.npy +03046257-ef17c03de89a1ce3b1bb46d2556ba67d.npy +02828884-ae2605e9e8c47cbfad5067eac75a07f7.npy +03636649-ea8eb3f3d917d61850c421917af4a474.npy +02691156-2818edd47cbd2aa1afe30fe053f7a977.npy +04530566-adb1b651af34dc6f42534f02c8e8b5ac.npy +04379243-7cad0234edde1e90edd9ab1253e1a9c4.npy +03938244-218f86362028a45b78f8b40f4a2ae98a.npy +02691156-cf6fa8a054ed7bce5de04aad18bd94c3.npy +03691459-3dae5a52602e2fe58a0181490cb73cbc.npy +02958343-59c39dc0b47f338c25a535f4350429ed.npy +04090263-52fccffbaf93c3de71e857afa9df271.npy +04379243-343838f40056270a738e43095496b061.npy +03636649-d526a340408764d8ec0f2eef0b7e551e.npy +03991062-95fc36833cee2525ffc6e457221b9271.npy +02828884-49ab2a5a9005eab9d2b12aa6a0f050b3.npy +03636649-33d0e0731c771712eed9bc72790ab85e.npy +04379243-b9aeea4fbc8db8f3a08ae93bc9509b4e.npy +03001627-ef4f9cd2b498a10a614871b18a2b1957.npy +04401088-2703b7edaf11d79a6b203c09a4932f5.npy +02691156-a69c25f93540eaed6370c33da8a7988f.npy +03636649-35b23397ce08256e847d4e46a1f9f05.npy +02691156-4d3fca1d1cacc27beeefea58691b769a.npy +03938244-9451f92833603bd3630771196b76eab9.npy +03513137-fe47f10f637b54594e5e6ac3ef6bff73.npy +03790512-dd38890e85c6dd91138452c33de4a3d.npy +03001627-4ed25bf015585031490ad276cd2af3a4.npy +04090263-2150ef6d0dd9333ad1f5735620433167.npy +04379243-8f27f3da43406402bd5d9cd72de2e1b3.npy +02958343-dbd67f5f505a795161c6c61410fc904b.npy +04090263-914cae3548759cbeb351750c5651f2bc.npy +03001627-918145be863f7aeaf050758b903e6054.npy +04379243-81148566eef063bf6b1cb83d86c19bfc.npy +02691156-f44c0e1e55a3469494f3355d9c061b5a.npy +04379243-ca484b4b04e546938c9e244e3fbf98f0.npy +03001627-bfa5964a53730c783136fad73a1be67b.npy +03636649-9326c0efeda12e4642f42b7e6beeed8.npy +04460130-75f72747ea9ea6cc459aed24ffc76d42.npy +03001627-26891b80550301721a648655355dc699.npy +04330267-a6d6bbbf60c1a5829d76e54b77715d6.npy +04379243-52ed857e6f9965886b429fe8da4d4ec5.npy +04379243-23fa6ee1004e6c6ef4b6538438a0b930.npy +03790512-5037cad0901fb395b37378f3c85478b4.npy +02828884-190bc3dfbed8c9ad4e77259b0944c35b.npy +03001627-e3f1f899d63ab008492d9da2668ec34c.npy +04090263-58f9adb6b5065dd6ad2b8e02a4932f3e.npy +02828884-67bee18dec77f305e4af5827e8177766.npy +03001627-70ef2b4c4b287c4e3c00c853d8b7ab22.npy +02958343-e97d26f05a68f833cd89498c213958c8.npy +02828884-4769720a332fd899d2b12aa6a0f050b3.npy +04379243-3ba656a9bbc2a38ba22a3fbee2fd609e.npy +02992529-e48a2eff0b0d0a39a0eb5a85db887292.npy +02958343-1687b77b048d1aaf635b88185c42637a.npy +04256520-42dc453547b31f0b71a782a4379556c7.npy +04379243-af65bb882c818f9861dcc050524e1d17.npy +04530566-bf47c2f0b5d1c6fef37a9c459d3dd62a.npy +04379243-742524cb455a050f246c3d7aafc9b697.npy +02818832-b96d8d6400e319eb8d6ee799b331d163.npy +04379243-76b32980bdb108df1b17743c18fb63dc.npy +03001627-74500999671b4c99d7bf6fb68df7f786.npy +03001627-420709f63a0b15ca35836c728d324152.npy +03001627-b8f4ce34b44620cc9b9f2eb77f5e247e.npy +02691156-3b41c0837f22555871d03b466c72ce41.npy +04256520-8cb3672d113ac9aaef188758bf2e3a30.npy +04530566-8a3a23f85c4c4fc4f2ad837508eb2db7.npy +02958343-fcbf9e1dd55ab172ce27281f3b76d1f5.npy +04379243-b514d9ac72abf291914858ee6a7fe3b8.npy +03691459-da9317e5776ed22b732bda87f2718525.npy +04379243-449491be7c2586bf261efd8e659b02a2.npy +04379243-4dae8fbaa2411c5598e0d1738edd4f19.npy +04330267-35f6e6a770258328c7667da8fd923578.npy +04379243-945565e4684886ea9db6feaa7eb1b013.npy +04256520-a7908e8fb217aff63d6e282938a47f9e.npy +03001627-f2440b15f3773299490ad276cd2af3a4.npy +04379243-4cb84e424122cfa7b9148a949a91556.npy +04379243-e285d68fe197f968492d9da2668ec34c.npy +04401088-59a168f51f8d7dd9e59685727bdd9ae9.npy +02691156-7e092d9460157e968b96ae1a0a8b84ec.npy +04379243-7eef97cfb1b73681f1755b5047ed68f.npy +04554684-9b744b01aaed2d603ebd14c45634ff71.npy +04379243-37726dbb4357739bded526a7be77b30e.npy +02933112-29c6f3ce118576724da5feafe6f1c8fc.npy +03001627-6d30eabb3b56d8f897842bde7f51d0cb.npy +04090263-e63bbc4b3a28f6fce5f887ddc636e202.npy +02691156-395afa94dd4d549670e6bd9d4e2b211f.npy +03001627-9a75ecc1e677dfe755d57295806b2c59.npy +02828884-cd385ebe6cd0c1262acc546c71bed8c7.npy +02691156-2a2caad9e540dcc687bf26680c510802.npy +04379243-c0ef2c3ec04860e5b0e0dee6075b101d.npy +03001627-c1e8b1bd34874c83febad4f49b26ec52.npy +03636649-68b79b143cb1538c3087f84b199fd297.npy +03761084-f9ab08ad0d7d8bf626587cb13c78fb9b.npy +04379243-c8276ccc8fc631104a7dc8b5b1635d46.npy +03759954-f8b19d24d53102805495b39f8c929b31.npy +03624134-a966fb3045e83dec68661782af60b711.npy +02871439-b1696f5b9b3926b1a523e28192de797e.npy +03046257-b8c0cbd2f9c6e9269ba80f08c401fbed.npy +03948459-d13986cc2403a2034b4b3d2a28039009.npy +04379243-b588c0169924f8e32d6a698a89d341f2.npy +02691156-52764ef0877372245ddb9958cad651ae.npy +04256520-3bde46b6d6fb84976193d9e76bb15876.npy +02924116-5354c4fdc8585838cb2ecbd32dc2119e.npy +02933112-ba1230fc38050b1bbf1d236bec6d905.npy +02808440-9fe14f7850411851ccd0340812259a39.npy +02958343-ee9b3f31f40a0161b1fa0b2eada93a95.npy +04256520-33eb5d4c6ebbd6b1327289c00b6dc9ca.npy +04379243-a224010a537bc683104e417f71823787.npy +03636649-809ed642119aa5799e8bf807e902261.npy +04379243-6777718e193b45c4f2b931201029bc76.npy +03691459-d11f1c28831e85a920363e2561dd589a.npy +02871439-db5b6dc38fd82fa7cdfa73f789b383fe.npy +04099429-5408f17e0356fe547462fea59b81b370.npy +03211117-536bbf9f697bbe881df9770149d6661b.npy +02958343-b0f1e8e11aea5f622fdea40a56b4c57d.npy +03001627-d959b7666dc2fda41c691caf3fc2f46d.npy +04468005-21ae3c4b2d31b10fe810c01b1498aa2b.npy +03001627-1e3fba4500d20bb49b9f2eb77f5e247e.npy +03211117-4b29b207acce575dafb07a946d621b3c.npy +02691156-ed709305e61acf6a9b017c80f62649a0.npy +02828884-613e9e33ebb303b0e9e2744369bf17a3.npy +04379243-d5c3542c080d61462c45f75322191dd7.npy +04256520-784093cacaf5a2fcf3598efd14e493d5.npy +04379243-bd25dfa62c3c2cf772bd03149507655d.npy +02924116-b2204b9d48c30d7c28a7c1b14d47bfcb.npy +03636649-6dd3bf7b105e88e79d3154c451a33fc0.npy +04379243-7e215b6386f3fd4156d1d06c447a736.npy +03211117-2b70ecfd4dfd162d4a5f5cae871f39f9.npy +03636649-6be148a3e219dc68e6597d391ab6fcc1.npy +03636649-5f3f11372141da8def0b2fc3511b6fbd.npy +02691156-ce3c18550fb997d1107e1ecf38d6ca93.npy +04379243-ff58a52586bb1f692c95f6d76cb3094c.npy +03001627-103d77d63f0d68a044e6721e9db29c1b.npy +04379243-babb0963a0e17bb59cd0aef0207ac8c6.npy +04256520-3a72dc930392152e27787a85c3bfabc6.npy +03691459-a1118bb5b6afd77e6f11d65f7a59b6f5.npy +04379243-cda580f16378e12c3002761e7a3ba3bd.npy +04530566-71fb9e98e62ae65f6a8fde3b294e520d.npy +03001627-5a28539d01a0bbfa8ccbef2c1e41835e.npy +03636649-62ab9c2f7b826fbcb910025244eec99a.npy +02958343-714e69d3b56560ec41a5d15a014fb347.npy +02691156-78f32f279a50beea216b327569dd806e.npy +03001627-4f22f44c331ad407166390f4a0367453.npy +02933112-4c4043756b3aac2ba80ff03f6dc10926.npy +04256520-271cb05be2eb02c53b2e058a33951560.npy +03001627-4c52204e49ce9449492d9da2668ec34c.npy +02747177-5c7bd882d399e031d2b12aa6a0f050b3.npy +02958343-eb59c9376d1e04ab49352dd33f95cb9e.npy +03211117-9a64fd5e660a8725ae95d460d60954d6.npy +03636649-5bc478e9c4e0bb8180936c51aa7ffcf5.npy +03001627-d3f31fd0fc99f45e8b3f6b4a44a70e52.npy +02992529-5e6ee0c5d155d2298b13932a0c28e98b.npy +03001627-635906aade1c775df6cfab91d65bb91.npy +03593526-5d3c251a9c593929c268c38e2d88a8f5.npy +02691156-62c875c3db8bbc512842bbbd2f23c97c.npy +04379243-eb8bee4832b65d8655252a6eccfc24f4.npy +04004475-dd749c531fbe92ea882c1cdb32ffe2e7.npy +02924116-6d22bb9007a4b85e76dbcdc2c193a074.npy +02828884-78ff35f4e229d1306f08940aa2c35d2c.npy +02933112-d0421fb0b59291df7eee615e75bc3b77.npy +03636649-ff07372af062502af47e57eb62ec59ec.npy +04379243-d8e3d77a83528e5cdc1206c3c8202eef.npy +03001627-1016f4debe988507589aae130c1f06fb.npy +03001627-bf91d0169eae3bfdd810b14a81e12eca.npy +03001627-6db2255a51caf84e823e7e244bf84209.npy +02747177-658247fdcc33f379cb2a965e75be701c.npy +03001627-6dadf2259bec12c6a51c26819f8dbb51.npy +04256520-373b91686b4ac7859829306a513f9466.npy +04379243-d5d1e750bb492dd5391e4d6c585a697a.npy +04379243-de214239a28de6b9d00689b1b6482b4f.npy +04530566-f5812d814e114a185c8b6bf3197caaf6.npy +04256520-17bcd5b12b4c3f96d8f5a246b73a66ee.npy +03797390-162201dfe14b73f0281365259d1cf342.npy +04379243-4bbedd35668b06514b3c42e318f3affc.npy +04256520-36980a6d57dac873d206493eaec9688a.npy +04090263-5df56f5b5c339b15df46f2ecb43811d1.npy +03001627-fcff900ce37820983f7e27638e63d848.npy +04379243-7f28dee9ae1a39f1700e86b51ee00536.npy +04468005-deff7415ff1e0424b0b2e6e63122009.npy +04256520-9875190ff87d3eb6a510987e3d5db7c5.npy +02958343-9907db7f1b96ee9a8b55a52bfd1cce7a.npy +02691156-b26d238e335c59b567b13a456b2224a6.npy +03691459-343678f49806ebaef09c0ee854308ef3.npy +04379243-7fadae39394c5622c3bd24f986301745.npy +03938244-55a09adb1315764f8a766d8de50bb39d.npy +03001627-4a45b026317349130e916fac260c672.npy +02808440-38773e1ff9871cb33321831d2245cf06.npy +02691156-64a0f304fa3c113bc817819d30841d0.npy +03001627-59f9d0acb4cbb1465611cca00f1f427d.npy +02933112-2dbd6cb6a14805297812c3baf25c5bb.npy +04379243-9e97c5ba09adfc481b17743c18fb63dc.npy +03261776-6475d0da1bfe0006c78df40cf2e9097a.npy +02946921-90d40359197c648b23e7e4bd2944793.npy +04379243-3fff3e35a4b68352820018801b237b3d.npy +02828884-423a75018428cffd46c340938e2ff1c.npy +03211117-56a247c3688af350723edebb30e0215f.npy +04530566-201fdafa7287d2fe8a55122197709269.npy +04379243-3154c61c595bd600e56ddd87eb888f65.npy +04256520-fcbff3584d926ea3f13ce777d031b4b2.npy +04401088-1292caa1282ad8cffc3c4ad908ac06f4.npy +04530566-3c3161464bb86b2d3ece64552d44d319.npy +02828884-9d68ef4ac84c552819fb4103277a6b93.npy +02958343-54dfce0866b65c4778254b98f5b75eb.npy +04379243-a452252cd1112d346cacd811e7524a0d.npy +02691156-b64f57298cf3e4328b96ae1a0a8b84ec.npy +03636649-29f2e3d2815a018ba77f16c25b1f7f4d.npy +02946921-85fa7911905e932bf485d100eb31d589.npy +03001627-313bfbd7bc2d516e14d782de5388fe8c.npy +03001627-2aa1d5cc784b0b65f51f77a6d7299806.npy +04090263-689a9c745c6a776021d9cbc846872d86.npy +02933112-1eed828f325b45bf5f960aba13b9c630.npy +03001627-758173c2c4630eab21f01d01c8c9dec6.npy +03467517-624e93d139be86a7e46203898ce1124a.npy +03001627-30f862f46bd96da835836c728d324152.npy +04379243-6bb2a335613e8e2ce26ba91c6bf4ff82.npy +02828884-1a40eaf5919b1b3f3eaa2b95b99dae6.npy +02691156-35ae2885a0e645fb7843a50f3dd2047e.npy +02691156-f57c74e194cd2b2bc8727b27ee96a4b7.npy +04074963-cc5571508716b1e5808951ff5fb582ac.npy +02691156-5df7124460d8cd14fd17e1e0553418c6.npy +03691459-5ee19a13a20ab65edaa5dd7053bcd03a.npy +02691156-f3cc7d5c4089b842df6e254b0245ddcb.npy +04401088-8ea128f9035474394cb30fc798a4d976.npy +02933112-7fd938d174a81474b4aed946870413c3.npy +03001627-ce7cff543f8cd89f8d1dabf86742ec3c.npy +03001627-f595abef9bc7320944b2fa2cac0778f5.npy +02691156-aa3a317001bb8617f7fe0727acb55c39.npy +02691156-d5e01850a9d1f3ac5fb48d488d5dfafd.npy +03001627-ea06ed485ab0833a2ebeb1e6a8111f53.npy +03467517-437b134bcf55f69e9c66a84603388766.npy +02933112-77df125bac962fbe4c5470734f591843.npy +03001627-c06b5a7aa4557182f51f77a6d7299806.npy +03624134-431b87d480ae0699a95c6095f89cd899.npy +02691156-ecb0d8d1c592bcc11bee3078a673c2ae.npy +04256520-6caa1713e795c8a2f0478431b5ad57db.npy +03325088-d1971a4133203c8976c18e71fd49c4dc.npy +03001627-69d6d2835bdf709b6df61a30cc649b07.npy +04379243-60f273bb4993eac8d4c42dd307b636f8.npy +04379243-d732f1d1e8a8510ff68e7a883fa7f8e4.npy +03797390-f3a7f8198cc50c225f5e789acd4d1122.npy +04256520-1bbc63fe00a7c3e2bbc7a6acbd8f058b.npy +04379243-6170a0a35febdd19129dc72c6879c0ee.npy +02691156-14ec1da5f5499d83bc0909d98a1ff2b4.npy +03636649-4bca3194ec4308a837b2bb75885cfc44.npy +04530566-306aa8588bead6f3ccbb877d944b8a64.npy +02828884-3250f6d70feb1e77d2b12aa6a0f050b3.npy +04401088-e3291bf83de108ad98b4ae7d0ad0f9.npy +03001627-69e6f0a5e903cda466ab323d8f805a57.npy +03001627-f4cec47ced59d95a3002761e7a3ba3bd.npy +04330267-7325f7bda50b7dc41965be83b7745a.npy +02691156-52e27aecdd55c1bf5b03388497f76a9e.npy +04256520-4b529738e7b5f910288138d7d3420148.npy +03624134-6061ca49f854f6e5e889573847ae2a32.npy +03636649-3591b4c764217d2833e4e0fe8cce118e.npy +04379243-15b495c101881d96e2367b9e27f16a71.npy +02958343-f11d669c1c57a595cba0d757b1f2aa52.npy +02808440-ca14dca61e50a05b3048063251585afb.npy +03624134-34cb3fade2a5de47ffb638a278d56097.npy +04468005-dc71a910775b2106995425f067333fd3.npy +03513137-1f3aa976ccfc9e66780b70108bbf4c51.npy +02958343-127b9ba77b54ba59bda733a39f84326d.npy +02958343-74f7b559d6af926012f2e446484bbaf7.npy +04379243-323ed7752b2a1db03ddaef18f97f546.npy +04379243-4c4675bc602b2a95febad4f49b26ec52.npy +03085013-e9e5d448b7f2da86edb8bbed3955f432.npy +02747177-fe2b3c0ca29baeaed2b12aa6a0f050b3.npy +03636649-e15defcb3dd448094fffb007974c9976.npy +03001627-efc62fa0fd71d739d42ec7e303174a87.npy +03001627-b9027939e6c71d844d256d962a5df83b.npy +04401088-c7407877d3325f7f391258277c122351.npy +03593526-29b41e593f8c1db24b3c42e318f3affc.npy +02958343-12243301d1c8148e33d7c9e122eec9b6.npy +04530566-99acfc63ec4f4ad09f97ca916781e800.npy +04379243-35e5159ed908c99c8fc6229eb64e56a.npy +03001627-c953d7b4f0189fe6a5838970f9c2180d.npy +04379243-3b7fc97192e483ebb0bf045ee98272fc.npy +04379243-baf006da82e4007a2d79e73bf7425e50.npy +04379243-22f298bfabc8982691a76c36d0ba1ac.npy +04379243-2e4fbab46e264616d93768e7b9b1eabf.npy +02958343-90ba6416acd424e06d8db5f653b07b4b.npy +04530566-108d62bb197c948c60c7b57bf6d67c74.npy +04379243-e7abcb9f3d5876962b70eac6546e93fd.npy +04379243-f7ada05f68013e2dbcedcb5f4c7257b9.npy +04090263-f730043e6a9843befe2133a365e39c7.npy +02691156-735466165c04f71f62b600da24e0965.npy +03636649-6c19af16f46fa4699b2dd2b9747d7d2e.npy +02933112-bb5c331b32e39d0d3ec45bd2bc895504.npy +04256520-f5639e976f7b8e70a6fd13ab3827d508.npy +04530566-d4fcf6486fd18a4982266a2b21a2294.npy +02876657-9edfe64416a9646e30612f5c0ef21eb8.npy +03325088-84496aa6efb270c9b362845c6edb57fc.npy +03467517-50647eda7b5aec4b1994831be6654b30.npy +04256520-821bebd7ac070a0550fc88ed745bdb67.npy +04379243-d4f8060cf95edeba6ac2b0edda2c907b.npy +04090263-5c59e7cd62f20a8bbb0bf6d0a9fb50c.npy +02691156-2f5c1ef50794aa92a55d095b876bb574.npy +03211117-d31610e1a17c5d31631465dbc2e64814.npy +02747177-5f14eed855c48a7f63b2acb037dfbcde.npy +02992529-2725909a09e1a7961df58f4da76e254b.npy +03948459-1226a05aba30d0987deae9192b6f5fdc.npy +02992529-ab96be5a6e3827932a6d73bcecfd73da.npy +04379243-ba993afc907987b33087f84b199fd297.npy +03001627-7121296a75c725aee8f8c11a24c52ebb.npy +02691156-62bd247f0e8081a171d03b466c72ce41.npy +04379243-25aae534f3aadc9c9aa9d7f676c1fd7e.npy +02747177-e8878aa23064c704ad5067eac75a07f7.npy +02808440-c66b0bdad2628150ccd0340812259a39.npy +04379243-67d11f49bb73a66535836c728d324152.npy +04256520-9428c331f2230e33a066c1f884f0378.npy +03642806-1ce087aba42caa73b8152979f6537fad.npy +03001627-453be11e44a230a0f51f77a6d7299806.npy +04379243-6cb965ebd6fe2e3bd8d12f352b5e1839.npy +02808440-6abb270bc9fc54fe4c62bee40dcdc539.npy +02691156-fd8d7742ee03905df446f92b52bbd82a.npy +02691156-1d4f988b009edadf54a2210c7b2aa25.npy +04379243-963bfaef4271c4e6955824885d6e7dc0.npy +03001627-b9415bc240e074837e76245c0a9e51ab.npy +04401088-8b17963baf2e54f87a0b781a26650bed.npy +03001627-fc07472e4dd1b6698ae97f14e63e7e01.npy +03001627-4cec451d0ffae39b79e99a4e49de900.npy +04379243-b160e3f80850d23755f46d55537192b6.npy +03691459-b93169c2360aa02ea14443313213c384.npy +04379243-594564c315e37c57925b56a4db8bb70e.npy +04379243-e791f274c6cc7ded36a36f8fd7d27134.npy +04379243-a6543278e970aa7a396d452ec85b027e.npy +03928116-282e61eed4ab9a06bd049a07b95e6725.npy +04090263-5ca0dccd8b0f6357d1987c07c912c6e1.npy +04379243-d9a0b526a354225dad1da5f59ea6f4e3.npy +03691459-9c1bc89152d90500c92750b56fccbe69.npy +04379243-3736ae6b32d288fad832a3fe59576848.npy +02876657-dc192dfce3556031fc0310aa34dddc94.npy +04256520-7b0f429c12c00dcf4a06efdbafdd7ea.npy +02828884-fefc87e051b4776a2d8a6d5087fd263.npy +02691156-a1ce38065b93520335fc197bbabcd5bd.npy +02933112-10c484963692d3c87d40405e5ee68b4f.npy +02933112-81bef552e83476ad3da27ece6ae88fff.npy +04379243-711de3c464c11233a82ebea018a340e4.npy +04379243-7cf3167e5a469fcb4c7384dbb75cab0d.npy +04256520-8c29f480d31a1a521908c34adf823c32.npy +02747177-b4b4f2d95de89e88b693b28f9c9c2143.npy +03046257-8797071b5219973daf7c7ad2549a1b15.npy +03636649-cfaf30102d9b7cc6cd6d67789347621.npy +04379243-e7bf775ba6774a2e278d386bfa54545.npy +02691156-96600318559071d48caa71b1fbf7fb98.npy +02828884-89326f54e97f65d82056b4bd5d870b47.npy +04379243-2f07c59d4099b5762241dba92389a637.npy +04256520-13990109140043c919fb4103277a6b93.npy +03691459-7f7ca259133096cc4d8df313232fc497.npy +02958343-d07c8208ad9dc35780e74058ee862f05.npy +02691156-6d6b6777cf1c15106540a0ff73700634.npy +02933112-4e0cc6a0dbeeb87df51f77a6d7299806.npy +03991062-f7a32f51a03a37f3e422be95e44ce930.npy +02992529-db058088ec098d9bdfbc59eb47b047b3.npy +02958343-ad1d30f2294f40dc622ac2f50deaba1f.npy +03636649-9a447967a9fb5938bb3deb7fab7c9b7.npy +04379243-b4fe4d5be595c1158c1cf3f7d7f0373.npy +04530566-e74a9275bf24d3e47dd35385411db37c.npy +04090263-563097fac348e6463d476be0564f2b74.npy +02828884-f343599b3eb41ae3f155d75bbf62b80.npy +03642806-9a0cafe6dfafe0503fe4aa36ea0cc020.npy +02876657-5872e807edaf985878fe949fc1419876.npy +04090263-2fda76fc28c9133d8428b8de1af34c50.npy +04379243-6581edd8565321685512673aa47c7e3d.npy +04379243-f37348b116d83408febad4f49b26ec52.npy +02933112-2817480c23e4a106c59350d819542ec7.npy +04379243-259125651db34085a4865f78beea84b7.npy +02871439-37ed10ebcb9c0cbc932ec7aa2da5961e.npy +02691156-d3dcf83f03c7ad2bbc0909d98a1ff2b4.npy +03261776-937cdf200b33bdfd1aec2282dd8bc87a.npy +03948459-edec08542b9312b712b38b1d99376c0b.npy +03790512-31a96fc694f0e58cd5dde04c96fd8146.npy +03001627-beb4c42cfa1c3b282811d30bba54859.npy +04379243-33c8b21a29bef56645de94e1bc93a4f6.npy +04401088-c3b9cb70c6a80ed686a04ec9e4169973.npy +03467517-6f3e9247e77897989ce06ac269757e69.npy +02808440-ec840887e7cae5b6ccd0340812259a39.npy +03797390-73b8b6456221f4ea20d3c05c08e26f.npy +03001627-516d94f2658b2258d79b19c7c4f0e293.npy +04379243-b8ad178c1d78980472dc9d42e683347.npy +04256520-1bce3a3061de03251009233434be6ec0.npy +02691156-71a3888c2229715b694188e21796efaa.npy +03001627-a40133bc1af575291bd0966183650a4.npy +02828884-e223e77b8db4aea17d8864caa856253b.npy +04256520-cb71cb7b36dbcb6f826fc8d57346a2e4.npy +03001627-546c4449b8001f0815d1fabef5f236ab.npy +03593526-dd37047caaffb379f9215f842248bc25.npy +02958343-1a87a329781b15763820d8f180caa23a.npy +03001627-177849848dc83fb9cb85ba5866080618.npy +03337140-97d83d7e969a309991c352d02061b3f7.npy +02876657-9fe7e6a7bf8ca964efad53eb3f0b36fa.npy +03337140-e4497669bb1457c655b2aedb5bd199c6.npy +02871439-301c2df72793fd33d42b9650f19dd425.npy +04460130-df8591577e0ef1095ae4226ec4ca9d4d.npy +03001627-58d39cbcd842cf6eaa90ad3e0254ffab.npy +02828884-bdf722327e02a0f0ce7719c693f5802e.npy +04379243-91cf4849ad3f7ac2a81005b904311cb4.npy +03593526-a4f56aa9a291cffb80067e3fdc6db24c.npy +02924116-ea3e697424a86f89f607cd34b3ff94c0.npy +03001627-bdaaebf065b112da492d9da2668ec34c.npy +02828884-a380e75d8efcb4192f550a4f461edf6b.npy +03691459-48bf5d4693bb7ecfb4bf1edf2dd92af.npy +04090263-3240b627007008146a2345809e2bb169.npy +02691156-60af3c930040c8b915d4d2fdca08573e.npy +03001627-eb59a4b8deddc6f659fe320c015eae2.npy +03467517-83e4f00f3c5b50ceb470346f25b26583.npy +02958343-e717bcb56d012a48b1bb46d2556ba67d.npy +03691459-d04ece855d678568d74f2f4a7f5598c2.npy +04379243-a68f06157d6ba8d4f51f77a6d7299806.npy +03001627-38e904bee502bd31e8b2b8dc0c816caf.npy +03928116-39d9f17c8fc14f6b8dd4b8aba823ee77.npy +04379243-4506f150e4f43633fab6e40cce6926d7.npy +04530566-85481518c0938a6eb1bb46d2556ba67d.npy +02691156-8de793e2e964f40a26c713777861983a.npy +04090263-97a75366f7c6ef24b8d6e958e0707d71.npy +03797390-10f6e09036350e92b3f21f1137c3c347.npy +02958343-6c7ed2d306fc7cfa4ccaa6b556a5ccc5.npy +03001627-2bd045838a2282ab5205884f75aba3a.npy +02992529-312c430f8b1a3fc80249ed612e14df4.npy +02691156-5d1d88958bd1c9c573328938c756eb4b.npy +04401088-e006061cc51617b9498dffe5de12eacd.npy +02828884-f061967a9b5ab9b6fecb38606c52659f.npy +03046257-ef6c1b823990c0f4f51f77a6d7299806.npy +02871439-1ecd9316bf586354ae25f6fe802a8997.npy +03642806-40e0263822860cc5d69e26904fa68e7f.npy +03001627-bfa242a09f35dcaa38fba5f798d10731.npy +02691156-14c954d5d3c8e954b6b87e72ead132ed.npy +03001627-97df0e7773e51feb331fc18393f04d2a.npy +02958343-af2f10112f943f54c730b513773cf286.npy +04379243-ce56b5a3ab23e12489aad4e9e4feaf9f.npy +04379243-1c00da8a9bd6f7403b846408f8d3469d.npy +03467517-a2c1ee6a7ddb50a493f0194265a9746c.npy +03624134-d9a9c77250224c5c9037640567c760d8.npy +03001627-3622d983fd6d7b98e3a73d090627e9ba.npy +04090263-aad61c4d490d4a8b6dbd8278fbb6bf38.npy +04379243-3c899eb5c23784f9febad4f49b26ec52.npy +02691156-5abe1e80846dd485c3e7213e9e8493f0.npy +04379243-58475b1b20ece0c5eeb8d422649e5f2b.npy +02876657-c4b6121d162a3cb216ae07d515c8c56e.npy +04530566-d5c7613bf466d33e94daa4565dd30535.npy +04379243-50480d9733231475eaf288f952624966.npy +04379243-1df409cfefbb51658b9b51ae4415d5aa.npy +04090263-b3ccd1643cffcabce37934d75f36098d.npy +03211117-314bcf37588dac1ca802f44e0266ca93.npy +02828884-745ce171571074decb2a965e75be701c.npy +04256520-19dd57f04ed04422c528d33bca1ac2.npy +04379243-4c7931492b41f960d50eef20e0914a48.npy +03325088-f4c37e34ea1d940a50da8b99982a3057.npy +04379243-77ecc55547840f06d42b9650f19dd425.npy +04256520-3a98a93f381ff5fb4b3c42e318f3affc.npy +02691156-8ac8c21b63ff535fca8607f540cc62ba.npy +02958343-c4f6540454e65939921cb81cb1632a5e.npy +04379243-cf24aa524055dd5ceebb0db1929cfe93.npy +04379243-8b0480b9d0bffa6e8d740231f5a3de96.npy +02958343-9ff9c8287fdb49be8b55a52bfd1cce7a.npy +03325088-607ecd0df535e60176c18e71fd49c4dc.npy +02924116-3b90b61ecb49cc2c65b80aea88017aa7.npy +03001627-33bfe7ad9544eb93d7f25634a7c65cae.npy +03211117-dac5376988db376b7700ed9200d31a49.npy +04379243-4b887a7bdcfbc4ca7e04e68609264bc1.npy +02958343-173669aeeba92aaec4929b8bd41b8bc6.npy +02691156-bc3f4d2bf11e1c6382328b5e05417037.npy +03001627-c5d58dd0119f0e49503aeac2cbb6e06a.npy +04090263-2689d78a4fba15bbf3998727b15249db.npy +04256520-e70fb6dca41fc8bdfebad4f49b26ec52.npy +02691156-74b0d11834cd8ec258a4fbb6b625be1.npy +04379243-34e260786b78eef475e2a70bd3d8ac6f.npy +03636649-81dd7cff35cfcfba4b3c42e318f3affc.npy +04256520-f644e0ae72dbe83d72ff9ec64cb596d.npy +02876657-725c3906071ecad52701ea82a42c662b.npy +02801938-1ed60448a8cc4b916e6624d94e2e0a1d.npy +03691459-2ecc5b85b343b20c2ca06fd2350bea43.npy +02828884-6f630f561e5ae2a5423efd8c02bd12f7.npy +03691459-6aa3bca1ec6b261edbddba07a492a0ac.npy +04530566-1f4e0613a3ec7b5a975be43df8325f3d.npy +04379243-565c8256aa446f152685733c782593df.npy +02924116-7c79103dfd1dada03690a69e4cb84963.npy +03691459-6d28e2683df5f013c9d5b08933b9e0c1.npy +02691156-bc140e3c54b27bfabe13ce34aa7c0c1c.npy +03001627-6f194ba6ba254aacf51f77a6d7299806.npy +04256520-3ffc1c26db51a3ac948a3bd895ea5ecb.npy +03001627-f029adb6cdf37c402b339ec555ba3bfc.npy +03001627-e4b40369894a16ce6821a1e68ba5ebab.npy +03636649-4ba237c2c40313f373b3ec02b97cb0f.npy +03001627-8fe0e6780b3dabbbb098f5649ee97d24.npy +04401088-9dc1088c4f5de29ac78df40cf2e9097a.npy +02933112-382b6f8e93e1f576149dc0f3c5ce899e.npy +03325088-4eca4ca3fc1a63ba50da8b99982a3057.npy +03636649-e43996a9154a48e0db039d8689a74349.npy +04379243-7dceb027969fed5e2c0a7b8ff2381a5c.npy +02958343-e7c4b54fe56d9288dd1e15301c83686f.npy +04379243-cf63d0c639cf4d36da1aea1fe709296.npy +04530566-25677ae07e0257955dd2c581ea62184.npy +03001627-440e02f574afa478ac38b834d5dbcdb3.npy +04460130-a07c8e2d0127b26195405124ff912ff6.npy +03636649-44820a27f86f13e7e420612cf7bb547c.npy +04256520-f8998de3b4d36dea4b3c42e318f3affc.npy +04379243-dd4f28a0e0d3f93c614a26402360d21a.npy +03642806-2134ad3fc25a6284193a4c984002ed32.npy +04256520-a28a2bf7c899fa38baaf4e0b7520fb81.npy +03001627-89f8c12dafc877009f8c3d2002c77ddb.npy +03001627-5bec8011c4042baf14038d588fd1342f.npy +02924116-59db922e827def242aa8b7caea8a1807.npy +04379243-57fd351d970d60fd60a25ec0f32e89e3.npy +03001627-4344509d0442364d3f9d6e0ade5188b0.npy +02691156-24968851e483feb237678474be485ca.npy +02828884-5cce62b38c0486d74201e10f9a6fb035.npy +02691156-3e0561d70c7fd4f51c6e4e20f2b76086.npy +04530566-3625522559a753b78dd2cbb9124e6d20.npy +04379243-1f47bcef63468cd9b90b306cee0c8c91.npy +02691156-a4391c7977d990142c20743f866e1a6.npy +02992529-3dc95447a57f8d06c1e615a94e798da1.npy +03624134-ced1a454c0e5fadd567f010bb1e0a2a4.npy +04004475-e0b4fb5f282bab11d18dff33f5d779e3.npy +03001627-971a98d242991e2222ed3259ee7e608a.npy +04090263-4e4b42da5513ecd175d25d68bfc74949.npy +03001627-e6b822bea1d5a5a9f7b783634bf3f92f.npy +03211117-fe75bacab7594206ab0b172d4dea80cd.npy +04530566-ae93355992a29c428064e4301e947b0d.npy +04379243-15dfec695110505227c1f8d037f650.npy +02924116-fc6c9de9bab5154e481aa8b5531c68a9.npy +04256520-ce863933e9e5193322d11432250c3331.npy +02691156-6659e72d40cef80be07c29b23ef67611.npy +02992529-d7c350e5d29074c9b4c216fa1de7d5a1.npy +04530566-c46aa66acaffc37af4a06efdbafdd7ea.npy +04379243-2c6741a965bc580072f9a9353d57f9ef.npy +02958343-3ada93d04b72256df63ee8a34069b7c5.npy +04256520-8159bdc913cd8a23debd258f4352e626.npy +04256520-ad1428e73eafd4a6660dac8da5753e14.npy +04256520-1ff1912cc74a76c3b2152dcc3ff6a477.npy +03001627-ca1bf3f8bac2927cefda51b1bbd149fd.npy +03001627-323bae92774d8def78aac1ce4ecb73b6.npy +02958343-4af41048861594b4897e805df74453bf.npy +04379243-6762370303178268d323d6bd8db8de5b.npy +04379243-7aba44f7a5ca1fd9a35da04de92b0f11.npy +03211117-2c4bcdc965d6de30cfe893744630a6b9.npy +03691459-414fac13be35799d19077496eff9d4b9.npy +02924116-6aadcf70fc49873ae14cb463f23a6803.npy +02828884-1f0c3038d2a9bb391b305ee09b6b9906.npy +04256520-acf23f78322f00f219fb4103277a6b93.npy +03467517-6554f6429eb7b67585e3c97721f726e4.npy +02958343-8606a6353a2c0f7a453660f3d68cae6e.npy +02958343-51ae6558e6914920253c03b7df20edd5.npy +03467517-a5825f1ffa48c72f3754416ec24e02bc.npy +03636649-d13f1adad399c9f1ea93fe4e1ab627a2.npy +03467517-bece1efdae5f94d0e4ca9fc57c06f078.npy +02958343-8320c70894c3cdfdff1370452e3a0154.npy +02828884-cf24c6b52b12c56ced8d4f003c2a833.npy +03325088-9df6805f555e98fe944fd4e41cc8d418.npy +03691459-a29485bfe6a688f0ce3ab2c820261e42.npy +03991062-bedda59ae84775aa37b2bb75885cfc44.npy +02958343-1328a95d69cefe32f200a72c9245aee7.npy +02992529-a2dedd1d1369d4ae25bdb70a4d3731d4.npy +03928116-b11213949b59e6bdfbed28a02a11bd9b.npy +04090263-b8970e3d0eaa2880dd0a2071dde26395.npy +03001627-1d1c829a54f0ae426cdb122727dd360f.npy +02828884-49a07e9db250cb5ea17702c02a7c3b1f.npy +04256520-a0bb04577e35ca2440ea7eb155c4e420.npy +04004475-9df2e49709f014d242eac36fac92c11a.npy +04379243-78a81cbd2a5720d93a938fdd57fac3b4.npy +04256520-dc6308addc91fd9eb9e8bdc9c4a49aa2.npy +03691459-db90e043486f216ead1d87becf13ddd9.npy +02871439-3826a129f5d8324446ebf4f1147c3f0f.npy +04256520-b672f2487b04c2e72a7455a9948f4f3c.npy +04379243-f87ef5a5c13e7b29d810b14a81e12eca.npy +02958343-efade459a90b2b143337cb9d908ce86e.npy +03046257-73fba47ad11432dd14daed0f93827804.npy +04379243-c0ec7cca02bd2225f1783a44a88d6274.npy +04530566-5a84b0529edd7101d3ca4877ecd2c01b.npy +04256520-ac96d2fa0e2052a790a9ce3e4b15521e.npy +04379243-d0220473a40678ad137619fe8083152c.npy +03691459-113aa3b68f515427205b075c6f63f661.npy +04379243-8f73278956fecb80327289c00b6dc9ca.npy +02954340-18387b36aa7b2d4af0d11ae402ef940e.npy +04090263-1220880371b176f9a06a81572261e82e.npy +02828884-d03199998c84839a844cd843a27223e5.npy +04256520-77371d342cddea8d8b424343280aeccb.npy +02691156-b87cb85be0d8eedb44bf3710e93f8cf7.npy +02924116-a6799d14b9d42a85d4ccd960d9711d72.npy +02924116-d312082e00d08d43aff1be9b3d197e11.npy +04379243-5b04e4677f1a45d3609211b089fcd35a.npy +02958343-3ddda21d4496fbc693680c5a9a367b4a.npy +03001627-bfbc5e6ebe1813a5d9fad8aba2c312b7.npy +02691156-5eff54a76d8ef89d7e1c97634acf0214.npy +03991062-8a88fff550a841c5fc2b7781f0f02585.npy +04460130-64f50754e6b67305ea3f1ffc49ae6b01.npy +03046257-67f8adff4cb252bbf269315e1b3458a7.npy +04379243-bcb51814564c9308b27067c40cfa2f80.npy +02828884-5c31950da8e2eb09929ce23741435ae.npy +04256520-163af537cd485a75e73748f506e4b955.npy +04379243-516f73ee8b530042593ebeeedbff73b.npy +02808440-11955ce486dd9b6954d7082b34825ef0.npy +04256520-31b21dc34d770ce8dca17035ebddd61e.npy +04379243-bb521fb4f1ec77a0ebf17edfda20712b.npy +02691156-284e6431669d46fd44797ce00623b3fd.npy +03211117-a57682cb8ebc224eedb8bbed3955f432.npy +04256520-b821fbd0ea6086ce9670b99b613138c4.npy +03991062-b4bc7d35f20935f9aec59741c69cf7.npy +02691156-bf54b050d092d1e35b5e900e37653d26.npy +02691156-3c98bc293d33375a9a6e43b878d5b335.npy +04379243-13f7210d5d472518febad4f49b26ec52.npy +02871439-45f111fa4aa4bacd6153b9900b1cf5e.npy +02933112-bd7cae3c39773a4ed0a0c43e4971be14.npy +04379243-4eb395cd5dfe658318a93a45bf780820.npy +03001627-1f8dde91813456e87e777e4db5dc272a.npy +04530566-4d5d231a701433110a313d673794913.npy +03001627-3bcbf7c8c8eef525c5b0fe224c67bd68.npy +02933112-cb75de930881a633f51f77a6d7299806.npy +04090263-f267ad7ff7c3a5dd763221be209af140.npy +02691156-b74611a3b3b3ac72ca8607f540cc62ba.npy +02924116-c327201f40fc6a03621930cd3ccccaef.npy +03001627-3bbcd9e945c6ceb8d3c29b715a9f3afe.npy +04379243-59d780e98c0c3a6f41c78a933c3b0bad.npy +03636649-62a5d7a59b87d150e6597d391ab6fcc1.npy +03001627-3372fd42f389a36a762ec387b772e9e1.npy +02747177-38418e5ea375d66a56f6fc4b4ce1db04.npy +04004475-4280940636bc0c3686f436bb2260061.npy +04379243-d430b0c4136e87327e72463702194870.npy +03211117-d96fda816cfd848e9aefc6fb585e9617.npy +04379243-bde0b499bb218666c6f42ae239fa6819.npy +02691156-5676893c90ec0f6dab81b7399bdbb6e2.npy +04256520-e37b46236accac968cbb8bac2032149c.npy +03001627-ff6e6b7b7c7f1c0f15f78c98555ab41.npy +02946921-147901ede668deb7d8d848cc867b0bc8.npy +04256520-c602f932c692ba2714038d588fd1342f.npy +02691156-124a579e0635b8eace19d55bc5e6a406.npy +02828884-397ac4bbb11796902d92929fa159facf.npy +04090263-56b409a50c8404afc24d00518a3dd6ec.npy +04256520-a23357a29af9f63ed26fff8ae28c5292.npy +02924116-4c5cae9a12252e1db1626da45836ca54.npy +02992529-a9c181d7378f92cfbc59a3627d9edb6f.npy +03211117-7e1212c48c877b87eca8a38e13335285.npy +04379243-9bb816d6a3517a5ca74c2333655a11dd.npy +03046257-7b1f529f00ea482a788a9e26a791a23a.npy +03636649-ef612752f6192e8d29eb9d04ea723179.npy +04530566-2ceb5d34a15b73393302308333adc4be.npy +03337140-abd27e76be6194d84c3aee8e9d3a6ffa.npy +02818832-e2532c6b9a56fe984bef72f03d7235ca.npy +03001627-83f74ff9d96c4d77bc5804ffb7fec416.npy +04401088-2ea4a3d502b12c61707fb0d61a11775f.npy +04530566-973b398bbcc97c3fea9bd4954e1c8c49.npy +04256520-1c4bfbfceb9e579c708f430fbe4ae8ff.npy +03001627-646ce5490817ceef4b6538438a0b930.npy +04090263-73903a9846293890a1ce1dd4c7e01188.npy +04379243-70a17261539dd92fce1403db8f7dbbbb.npy +04379243-cdf0a34dc3504e40643beaf431c0975a.npy +04256520-7d4113d5cbf4ba376efe57da6d3d385e.npy +04256520-e3c42f99d05348c6d456f2c60deb666b.npy +02958343-fe2e5f0993bbd4726fadd0e0ad926818.npy +04530566-1dce61f6dd85dc469811751e3fab8939.npy +03325088-63b97b5f2f209f667ef3547d02ab05dc.npy +04256520-af9d9a0ffad9c2dc8a243182cace7dbe.npy +02933112-b2b89d3ec5918f69c59350d819542ec7.npy +03001627-e682c43e2f4e7463d0ad32b8d8cec005.npy +02924116-8b95a88f6be4038841cefd10ce5d6cc0.npy +04460130-f679821836f140f39ebe905ef4009f84.npy +02958343-c558c64b6b97a529658e57fd275f6bed.npy +03691459-71b4fb2d151a9d70fb0a4dd466ef3d66.npy +04379243-fe99a1127734f7852b70eac6546e93fd.npy +02691156-e511258df02edf1046ed10e8f7fe336e.npy +03001627-af34090f13146fef15afaa91253fa857.npy +04090263-99957708f69cc13acd0bf1b7ed0a63c9.npy +02691156-52712e1c07ea494419ba010ddb4974fe.npy +03948459-30195a2d2fe56a1f6887cd98a5557c7b.npy +04379243-c93aa39b76980ff655f46d55537192b6.npy +02958343-e7141fa81a2828841e8bd72b0feca0a8.npy +03636649-fa6f034a8beb74f6fcb8d8c6d4df8143.npy +02876657-e90e0506fd00fe93f42d6bd378df1c70.npy +02747177-fa723633a3cfed271e74a5e93d408a1a.npy +03593526-930e0e91518dedaf8b5a342cfa6159b4.npy +02958343-e66cb97aabb79193da5cb3be8feeaadc.npy +03636649-ed4f7f214ae7042cfcb8d8c6d4df8143.npy +03001627-1cd152cfd71cd314e2798a633e84d70b.npy +04090263-350c4bccc1509f83583c7e128cdb4e36.npy +04090263-c26b3833f66cf4691756b5d674acc4e5.npy +02924116-b52d68042ec5e75e193d7855ecfc1bd3.npy +04379243-fe3a8b30aad625ceec56aed2da084563.npy +02924116-21675fd70633384bb1626da45836ca54.npy +02691156-b81339a2f1dbc0de9598ceb95c7f0752.npy +02828884-2e8f1b6cb9b4f568316a315354726289.npy +04530566-3632e9d36e280dcc6a6cc078f0eef937.npy +02691156-67d9607d84fb51435fc197bbabcd5bd.npy +03691459-54fadd7a6c5c04d752560296120d4cb.npy +02958343-69e99923c3cbcbcca9fe1734a6086750.npy +02828884-a4d107815780161ab7ea82317702e856.npy +02958343-aebd98c5d7e8150b709ce7955adef61b.npy +03001627-40ee8ed17f6ea51224669056e0d19a1.npy +04256520-221e8ea6bdcc1db614038d588fd1342f.npy +02933112-984c969b9948fea738e43095496b061.npy +03691459-f64068aad93d502abd1cba733b111584.npy +03211117-5fda7abf1b684ae8f464a4627ebb5e55.npy +03325088-9ff3b5c3aa7c2d5c36fb70296e45483.npy +03211117-b569ba9d9d74e7d5184dd44a99578080.npy +02958343-7e7b757052225615a73f47f4261c01dd.npy +04379243-2a44f4def2a20e7f4b3c42e318f3affc.npy +02958343-efe74cae23f8061382fe9569faf087db.npy +04379243-50bf2749c1963d319d84faf1493a1f98.npy +04379243-c5ea662fb31f56cb2a155afd9dbbb0a.npy +04256520-d84ffaa12c52d6a9994626ba7fe8ddf7.npy +03211117-c19d616f13bb70d39306959137da47ca.npy +04379243-f18c9ab4ebdcdb8ac8595ea32135ffd9.npy +03001627-54e2aa868107826f3dbc2ce6b9d89f11.npy +04379243-9cd301c49dd65c68819b97ced0e92930.npy +02933112-ade25be3b1ee38bff51f77a6d7299806.npy +02691156-422700fbef58a0ee1fd12d3807585791.npy +03001627-a6ab184a68bc67d179b3e1be3524f72f.npy +03325088-95d17d2a88d82812b362845c6edb57fc.npy +03046257-8af7cb8b42d0c8b1f9e8cd846ef13776.npy +04379243-1f2c84d387bd1af9609fb05dbd8681bd.npy +03928116-90af8109ae86f1d4f7895369e50c9000.npy +04379243-2f257e35ef61553b63c9ead28992f1.npy +03467517-4d98e1ec983e315f8e7905003bf56417.npy +03261776-c6d19db35f69bae7b6d9c2cee7f2f72b.npy +03211117-68dd0f25329c5779be95cd31e095c9d4.npy +04330267-650ab459ed284b4349bd139dfeecc324.npy +03991062-eb485c8d5b0acd5dff67c12005f72d2.npy +04090263-10439f1f81fbee202be79d8b285c1e.npy +02958343-606c0050a2ed4e19d834dead2eb68d68.npy +03636649-525109ea19096fe8eeee03ae21af2d39.npy +03325088-bb5589eac797c14db362845c6edb57fc.npy +04256520-bdbdc31c4ba48868bd91edd7a65c1323.npy +04530566-7f05275eddecedd06f3d18c7cf5f8b6.npy +02691156-d59d75f52ac9b241ae0d772a1c85134a.npy +02958343-348fe55c1976b64c45aa033a20004998.npy +04256520-bc0971df7f259c581d38890680ce527f.npy +03001627-ac9cb6f769bf90c824d8364776ff163c.npy +04379243-7853c9da0f57af87e649091ae21aee74.npy +02801938-9e2a1751b9129b1132fd0b3f17b0d6c.npy +04379243-58f8fd169c9578e62f81cb887dc35578.npy +03001627-7ad134826824de98d0bef5e87b92b95e.npy +02958343-26b7a9c6c7e74829eabc798aaf5f039f.npy +04379243-a59b2884db9574cd1a72c98fc69f22ac.npy +04379243-de2d98c18293a15219fb4103277a6b93.npy +04401088-6682bf5d835701abe1a8044199c77d84.npy +02828884-4b4c1a775f9a49958cd4e3ad2fcaf039.npy +03211117-87fb8857bf2bd3a7420ada7b49a056b8.npy +04379243-3456178d3ff37ae1e76bc197b3a3ffc0.npy +03797390-8f6c86feaa74698d5c91ee20ade72edc.npy +04090263-caff0ebc560479ced735fa1ab17311ec.npy +04256520-27edeaa6c6e2e670ce4f274577283b16.npy +04256520-735578d3cfa39279d098b24937823a09.npy +02828884-2edcb17b897706cf71a782a4379556c7.npy +02691156-a02387f2b9d73a01a5cbab5aded19a14.npy +02691156-9a9f615801c2dfff4d210d9468aedaf2.npy +03467517-f11881e9363c00f6352e5d4d2615db5b.npy +04379243-6df5ad89a152dbd26e79c14dd16aa04b.npy +04379243-6db77fbd32e0af3e3f9d6e0ade5188b0.npy +03691459-87a0dac4a3c483de6671a3cd2be21041.npy +04090263-7c10b90abbe17fb9935777dcb8deec2d.npy +03467517-890bfa7ff894aeb3ba9e56c15cb175df.npy +02828884-7536b671103f96e5b12a55dfcc392e26.npy +04530566-ad440e99d3a9bed3cd202a4790115f0c.npy +02828884-40279f85fc80e16edccc47bf0dcf5d3.npy +04256520-d9bb77735ff0963ae7e684d25d4dcaf0.npy +03636649-cf0c13fb0e57bad9cb02404e1e21ec1.npy +03001627-4a0e7f1129a9172349bb1cbbf9a4206.npy +04379243-21a5b3d29075564e2314deb821327685.npy +02828884-da92767c2e0fe6bad5067eac75a07f7.npy +04090263-b094f9184c3098a781fbd53a4fc6b7f8.npy +02992529-a3bc032d0842d570348e2c62a688b780.npy +04379243-5c11a1fa21e8671cbafa5bee623d5d.npy +02958343-f03a4533fe681a155b48f89d50b1db79.npy +04379243-5516cbfe2ae44c0a7062f2d72cde5c95.npy +03046257-c7704d12c66e09dabcb557b5b19897c9.npy +04379243-e4a9b9db82ff871a1b17743c18fb63dc.npy +03001627-247dd48e4b6c029e4b3c42e318f3affc.npy +03325088-c1c7a391d18c9ac54392467549e2de91.npy +04401088-1847d3782970e60679510444cc61f839.npy +03636649-67f6c0f40fc9216e8aaae3d020f5ddf8.npy +03636649-2c0177660b7ecc915c118a000b931714.npy +03001627-4c9d9b37b13b0dc720211b71e9c4c8b0.npy +03001627-69933c14a02d65166e28ffc6e1f368fe.npy +04530566-611824dac2873f5b59f280bab375e8b4.npy +03691459-e767a0e8df4e41f4b3b44ad99a214777.npy +04401088-ed0f3e1d20fc722bb0478ec258b0ea3d.npy +02876657-6f4749e802e6b5eb30612f5c0ef21eb8.npy +02691156-617a3d4bb40402679c411d305417ef6c.npy +04379243-79a3bd60b48584b11ea954af295a6a98.npy +02808440-4a6ed9c61b029d15904e03fa15bd73ec.npy +02828884-1ac6a3d5c76c8b96edccc47bf0dcf5d3.npy +02958343-5dd97775bf24ffa2283aaea3c1a7dc36.npy +03636649-ce879c871fe2015b4cbf9a02e3342127.npy +02958343-83491cab81e3a330bda733a39f84326d.npy +02691156-ccb9e8dd6453b6c2a2981e27422ad4a7.npy +03593526-4b35db459bc209bf5d878ba9ec3c0d6a.npy +03046257-6695577b5fb358ebdf5f14f6397a827.npy +03001627-473afe27e45b37101c8d18742f91c015.npy +03624134-665bf5d30d342d64adee73efb2c043f8.npy +03948459-e9e6426605eb6d5952d52701459b1f0.npy +03001627-8a8c67e553f1c85c1829bffea9d18abb.npy +03642806-de2e95eac460c361e862e3cac45aa769.npy +04530566-341905f73563a75717e4d86bbbb01f9f.npy +02924116-1514f0bcc843fc62ad19b94b8069bb8b.npy +04379243-d481ee7e971849339db8ad97fd392b59.npy +04256520-499edbd7de3e7423bb865c00ef25280.npy +03636649-a9f5d780f8303489d8f5adb469ca89d3.npy +03797390-e6dedae946ff5265a95fb60c110b25aa.npy +04090263-138cbc9b5456cfef55d33831e71fa52.npy +04090263-5fa42f48d1d279bb7de50e1a7b436c85.npy +02924116-da69974a1e548e8c95c7a8a79dc0c72.npy +02828884-1bf5b1fa54aeec162701a18243b45d3.npy +02924116-c851c4559c262b77473aeab56f2a35f4.npy +03046257-f4104a9af5a0fb3cf016aee3d784d83c.npy +03001627-1d828c69106609f8cd783766d090e665.npy +04379243-e157bbb54d5a2ffdd6944324b21393b5.npy +02933112-ab7ad8afde03897aa52fef6f94fcc8a.npy +04530566-2c23f32d6eaac557b93dc42f7dcef6a.npy +02958343-baf3415a57e6f282b23c333ee1a445e.npy +04256520-804b776428062f18f024b0f23b15c6c8.npy +04468005-8ed080571013f33e8be7c8c5fdb9bd6d.npy +02691156-56b44fdca08540da71d03b466c72ce41.npy +04090263-e534d084d3bc37184d0af51460733e47.npy +04379243-81b379e6871c97e45964cca694d01a7e.npy +04379243-43bc8b8b33811a2a54afac63dc6bafa8.npy +04256520-e4ac864732a8dc40f99656b78fd61fd5.npy +04379243-95eed587c3728d22601104cd2d998272.npy +02691156-21feae1212b07575f23c3116d040903f.npy +03948459-96fb7421c604f2f89a80640ff158687c.npy +02933112-bfdb60bd61d083536739a7caa0c577bd.npy +03001627-fd5ca05b59b30241d838ae16242881dc.npy +04090263-935645a83387dd25719c27787d6741f.npy +03624134-c7fcf3077b230ce17b635ec9828c6ec2.npy +03211117-5bd1493a07c13d675f1b26547b9ff327.npy +02691156-a3c928995562fca8ca8607f540cc62ba.npy +02958343-5fc83a88645b1869514e3d96995c555d.npy +04256520-8a470e5b043a38904b3c42e318f3affc.npy +04004475-f9553ec63a0724cf52c2b779770ba628.npy +03761084-52000b7c14d7804e976040de71c9b526.npy +03001627-243ab0d808fae5b76f1d1c49624bcfed.npy +03001627-48091b14719964986d075d8d4fe1141.npy +04090263-ca4e431c75a8242445e0c3a4b827d51a.npy +02924116-5961772d9c7dd56193d7855ecfc1bd3.npy +03001627-f550b5413eb040c29829306a513f9466.npy +02992529-aae6554b1abe736c70ed77f7659cc6f.npy +02691156-329a018e131ece70f23c3116d040903f.npy +02691156-7608d7a5a3e3c2b13d4b1f38e3dfce4b.npy +02747177-55e6f6e5a37777b7f9e1e633e708c001.npy +02958343-7bb54d802ac6156ab96212c8f6cd06e.npy +04256520-17e050b62fc249687d3c9de9415fb224.npy +04379243-edfd25e28cc7b003869c91937070800b.npy +03636649-7a67bb268436b3636a578f1b525d976c.npy +04379243-e5f797c0266733a49b8de25d88149da8.npy +04379243-370b45eeeb9b11416f04d49e4de95b59.npy +04379243-198551bcb90f2fd5ef40cf5f2b241770.npy +02828884-b7d0a6ed347a549b278d386bfa54545.npy +04379243-ce998bbfe6fa0d22bd6c42a70e9434e7.npy +04379243-b1384cf261fa99a03002761e7a3ba3bd.npy +04530566-4214845c44563c5fb1bb46d2556ba67d.npy +03636649-6936b0f0e7c88e3bdc22f557e01eba14.npy +03001627-aa0ad3538d0d7b3be6fe3612af521500.npy +02801938-434194622dc684f81de9d8208aaa2d25.npy +04090263-d65e4cc9b69a3ec4691fdeddcb509b59.npy +04379243-a447c1fe6f458a02e76bc197b3a3ffc0.npy +03207941-a2caaa68364f6207f054969eeb39ff86.npy +04379243-cb8ee43492cbdda3bf6f067b2fb335d.npy +03691459-b70c600b20614f4c690135fb845b8de1.npy +02992529-40dbb04ab8f780d6cc571cd3cf8f17a1.npy +03691459-c556fa897131c0c833b20ff045584bf3.npy +04256520-da964fb2d92a461f6295e8bd02084b6.npy +03467517-2292b7ee00d2955723b563ac391a63a7.npy +02691156-f1384d3fd2d59e63f4d6518603e8629.npy +04379243-8a64395b321a34161191025061735ea3.npy +03001627-ea7e09260babc698983c05814b11dc86.npy +03624134-fbce3be99b20b169f1ae0a5e4119d01e.npy +04379243-10e6398274554867fdf2e93846e20960.npy +02691156-b31bbc50a0d3a4366cf1b4a8fc3914e.npy +04401088-595901b2d5b23f58ed756341424d6b8e.npy +02933112-5aee956ff28e337a44221bef0fa3c36b.npy +03337140-6a98c9c55ecc6a2f4c3aee8e9d3a6ffa.npy +02808440-549245920e6e0e7c6b448b8aaebb705c.npy +02691156-fb48754430b17846e3375a6b96a1d765.npy +04379243-2f7a2d27e58224e689035c25f0dfeb63.npy +04379243-fff492e352c8cb336240c88cd4684446.npy +04379243-a09324ab0389029260885f79b3a5579a.npy +02828884-8f24d2e90bbd5855b77d52b64ec9e9af.npy +04256520-99175131585f4cfded403132b02528bd.npy +03001627-308e56be04f6214e50ed95708c70cdfe.npy +04530566-d25531bd6b7b8274ceb0dd441125df3e.npy +04256520-9001c9558ffe9b5651b8631af720684f.npy +04530566-cb7bc049274173df73a75ef44d66eede.npy +04379243-10657fcfce1d326b30bbd4cddd04c77b.npy +02933112-698debfccb32f7404c62bee40dcdc539.npy +02691156-f944c570191885e8ca8607f540cc62ba.npy +04379243-3a36028507ffd1a6ddd15630382184f.npy +04256520-eba5b24b9c3dc8cf9c0ca344f487323e.npy +04090263-c7fc0b36bbaee6382bf26da672b84220.npy +04379243-46957ba752c3554bd42b9650f19dd425.npy +02958343-e6e932a5d92d62251d15f502e679d4c.npy +03691459-65dbba7ce5b4c40192e34403f6f6f5f0.npy +03001627-248e014f31771b31d3ddfaaa242f81a1.npy +03001627-5f1b45295c72cdf03a4a5c95fa1b0032.npy +02691156-d4849eddcd93569ac119f94203b4868c.npy +03761084-4e0b08959229923f2ccf9daeb92717bc.npy +04401088-5bb9020da1d3bdc260a9d7568d474ade.npy +04004475-63c80a4444ba375bc0fa984d9a08f147.npy +02747177-a8b39c32604173c1d2b12aa6a0f050b3.npy +04379243-29f110b8740bd8068c427edcde5d5e2b.npy +04256520-1f8098eb2fe947398dc38b92af981645.npy +03001627-b69ce6bf8156deb155252a6eccfc24f4.npy +03001627-65b21a2af8709510f91663a74ccd2338.npy +04554684-ba5ea28f0065c71cdf3a1b0d597ce76e.npy +04256520-bbf1d8071651580cc79b370d801db3b7.npy +04379243-b7d6030b31b59895ba0b91d2ba672bfc.npy +03001627-ba707bbbc56d1bc319620b61f6587b3e.npy +02828884-88440ae4e218fa6ed4d8765e3910f617.npy +04379243-166cb38606acc1834265eb8d6103818.npy +03001627-2620443433d2292ebed0f46f915a3980.npy +03337140-59184214eb54c1144c3aee8e9d3a6ffa.npy +03928116-5c2a57c2cff7cc06d636d2b2e734dd7a.npy +04090263-b9220d1c981e2824377a1335e81633a9.npy +04379243-9be8aa90001e8f6b492d9da2668ec34c.npy +04090263-ff46f3fdaba78638aa7cb0651220ba4.npy +02992529-df768d07fc99eb30142bee3d28727203.npy +03691459-b0705be54d6220d9a344697865361601.npy +04090263-287f4e9b70b010a29ddd1aa0a00ef579.npy +04379243-5d30966509f58394237c47118f6132c8.npy +04530566-160271b40b1d6822c40386bdd72f9a0.npy +03001627-6251b398004a02fffebad4f49b26ec52.npy +03001627-428b77d0ffe6ab456e06155d245f15d6.npy +03691459-8dfa9921e51e0fa3f99860cd321d6c67.npy +02958343-cc7dfb5ecdf370a178c14a9d99ecf91.npy +03642806-aec07e314b2fdb8a60a676833b21afd4.npy +04379243-2698d4b8ff59120179b3e1be3524f72f.npy +03001627-c12ea730ea29f8945914d57d976758c0.npy +02958343-a75ff576da012340468bac13e007a6e9.npy +04554684-c18dffc90a4633d191219aad82abc053.npy +04401088-457b4310870bcf047f4e0c14aca1a926.npy +03001627-32d243fc56b7b8658cbd400aa99bee96.npy +03636649-9ea81b2f43dca29c5412c66cb6f267da.npy +04379243-4df369ee72ea8b2c3da27ece6ae88fff.npy +04256520-dbadee62f27c31e9214c7379b0e80b7b.npy +04554684-30925e14af2a92814b35a7d7cea7130.npy +04379243-fcbc0127388b446b7d6b442f66caef56.npy +04379243-ce422cb06b1f372c561f802d2e81cd69.npy +02691156-9f18925334b6f37bd560687a81f263dd.npy +03001627-9b82e2d4714b97827eaeab1f0c9120b7.npy +04090263-6cf13d5b7791b8618af39b443dc477ce.npy +04530566-18f650bbd1068f0589c6f1079da7a8d4.npy +04256520-5f145696aaef1e6f342398ca9dc32672.npy +04379243-d9512362b43efd8f91fee7773e951339.npy +04074963-9716c839bba80514906ed109a4ea50d6.npy +03991062-636b7d403c7717c3edad66bbdfe0c434.npy +02933112-367044e655cdce1f109be8beeb87a681.npy +04530566-5573567872450417d61794222ef2800f.npy +03001627-73970143d9af7218c8687ff9b0b4e4ac.npy +04004475-1d8d5d60023482dcab0a8ebbed30d677.npy +03636649-176b4495ed006475bbf899459f3f71bb.npy +04090263-bc135e8d9571775f20b92c47b3d5c1a3.npy +03001627-4fe364b3390d3e158afe76b3d612e00b.npy +03636649-e04e5a96efd77a6ed2f5c44a5922d7b9.npy +04379243-a3f3c3f288a750de83d38badc3559dbd.npy +03046257-23bbab353b849d3a6077d83faabf62af.npy +04256520-a97a1e97d08a236a68d1b9a1d97e2846.npy +04379243-e03d534f3ce3c77d19fb4103277a6b93.npy +02958343-c5b67d87b22583dc13ca2951bd3ea3d2.npy +04468005-429f55d65314335592428dddcdfd8a50.npy +02992529-5c8d554075a904bfa7ca3fec59d82214.npy +04379243-e3e1762fa7f935b3f6287cb48a47c45c.npy +03211117-28ec688f444eeb4a394b1e418d5c594.npy +03001627-bb9027dded04f7da2b3e9b6eb52d35df.npy +04330267-e8838770de9a6e4595feea036c244c98.npy +04401088-6d85b3dfd681eba530400184d5d3220b.npy +03001627-2e62d5829f60bd7758df8eeaf3dad1c.npy +02992529-bf2f0de18abd3bebdc858d428f2620a3.npy +02871439-35afa1b806556803e99c79bad29da781.npy +02933112-c3dd5d3f16f231c7cb0c0d433974e32b.npy +02691156-a9cdbca070047fe61e9dc95dd6a9f6.npy +03593526-b1271f402910cf05cfdfe3f21f42a111.npy +04379243-d1b4a4f43818c34e490ad276cd2af3a4.npy +04554684-e0bb2eefa09251a6149c1768202b4e64.npy +03001627-e31c6c24a8d80ac35692a9640d6947fc.npy +03001627-c64691882dd54d0eec1a944671ba8259.npy +02958343-7bce50c36d8166608e35db9103756ad5.npy +03593526-59deef87601c4a86664b3b9b23ddfcbc.npy +03636649-58d8496e15d6945bc562b0b258e20992.npy +03001627-e2cef660d0d7a4629976735d0dd7540d.npy +03636649-280fa01686e780ba3501c961e91ff6d7.npy +02691156-24db19ddb06fcd3f9a6e43b878d5b335.npy +02924116-ae4ded29e55b2173481aa8b5531c68a9.npy +02871439-131b5b691ff5bff3945770bff82992ca.npy +04379243-df63a11436240ec7fb906a2c84fd375f.npy +04379243-ddae5f8a28d8d616e4bbcfa1dc6a2906.npy +03636649-73ed11936acd99a627ebefef2b2130c8.npy +04256520-a0eeb4524c84f7a0b8a09f7075b904cc.npy +03691459-ca3d4a62e7a851816463df620b7b4cbc.npy +03513137-10dee7587a785cbfe22dbe8dd678fde8.npy +02691156-64da2f66ccfb98c6c511571426f8b16d.npy +03691459-6b5458409e54d8b99c5da70959a4c7d1.npy +04330267-e8deb7d4453601a5a53276bbe109327a.npy +02958343-7582e942f3e60a7c1477c1a2d9ef8312.npy +02992529-c145f0b0f18d4afe99aee91747c9768.npy +02691156-152d35bcceab5592eb1a0518c224975f.npy +02691156-c3454da26509937d4b4c1e25039af4c8.npy +04090263-ab0fa4305623f6c3cdf27c4099cb6beb.npy +02691156-130422d62194cf026c8067e570d6af71.npy +02691156-c64e43e18b01fb5eca8607f540cc62ba.npy +02958343-c83458f94ae8752f63ee8a34069b7c5.npy +02691156-b5d0ae4f723bce81f119374ee5d5f944.npy +04090263-8935329f244ca398cd89d443b4b6353a.npy +02691156-2407711ff7759994101cacf58b339533.npy +02808440-986351819dec1974fe52ffd0e748a1ab.npy +02808440-8c4d0c92f26217a84c62bee40dcdc539.npy +02828884-8861988f97b2e8c722da8c30c5c6c8ca.npy +04379243-9d57cb805345d761beedb4c8fd29e2d1.npy +02933112-3e4d14a8716d2418999b33727fe6db14.npy +04530566-7ba457477629beb8888d5ca4abf8aff.npy +03001627-2a2e5ecd0ef6ab2f80360680c1602c7d.npy +04530566-c3d22ce3607156466ac9421934926ab8.npy +02691156-4c3b1356008b3284e42e14fe98b0b5.npy +04379243-a94ea7183f27073248c0c0980e363341.npy +02958343-d142c919254dba0e41ab8016efaf0266.npy +03337140-db9fab17bc383c9e91c352d02061b3f7.npy +02691156-ecc50d702133b1531e9da99095f71c63.npy +03636649-ed1de19103e97b74c30ba10ebbf8ea21.npy +04530566-2fcb8c472f1cbdef185cce17ce166549.npy +04090263-899e86a8dc53568694deaa9fff391d41.npy +04256520-6fae3f21375b43b24ad33b69f9597739.npy +04256520-6bbbddc84bc4d3a68eb3bc6c6d15f9bf.npy +03691459-9de3cd602d12d178887e8faf8f33b0c5.npy +02691156-aabbf242aabd1af7766c6046535346e7.npy +04468005-fc21dfd12e8eb8ded4fec646771c576a.npy +02691156-32637024c9aad5289a6e43b878d5b335.npy +03636649-2b1817fbc0f3ddbe8220566e85550c0a.npy +03001627-ba747d0535cb7fdfbfb5bf9fe49f43af.npy +03642806-ebc59a9b4291ce274c3c121820623e4e.npy +04554684-aa9d1a55c1a546a1df3a1b0d597ce76e.npy +04379243-d177f7632a4bb3405073c32a9cf4a6a9.npy +04379243-f6f3b8e08af617e44733824eae5cd9ae.npy +04256520-16bb3ec52397cdf9cf01bc59d215f0.npy +03211117-646b0bd4e03fba8d566636e42679cc7f.npy +02933112-c060caaa105890d74da5feafe6f1c8fc.npy +04379243-28fb9a81898f88c4ae8375def5e736d8.npy +02871439-5c7914575a4f671d4b209708994baff7.npy +02992529-424ccff9ceea33451c81652b127a0ec9.npy +02691156-f11d14402a759a1465f50257ecdfa5c7.npy +04379243-103ad97126bc54f4fc5e9e325e1bd5b8.npy +03759954-365742901915252a9c75eb4326997fae.npy +04379243-7d6d7984fe8eeb3099e8bf807e902261.npy +04379243-c2c36909e461e10adaaaeef365d8f6e5.npy +04256520-11d5e99e8faa10ff3564590844406360.npy +03636649-e7e45a8f0b0ab311c754474f0ac106.npy +03001627-26e85b84b3b6eeea21711c78ff413696.npy +03001627-19d7da928d179a07febad4f49b26ec52.npy +04256520-5c39c2691a36d9e5a8f59bb67a917984.npy +02992529-612466085d24ce50b260ba4e94db1a27.npy +03001627-7b8e24c31b7509b6dec3f6fd3a03085e.npy +02691156-32e8412ce01e63c1a47575cd04a1d851.npy +04379243-b7e3aef758749005c3bd24f986301745.npy +04379243-7eb961d3f19080983ac416718757a350.npy +03001627-3021054d61c4862bf29666f384be6c43.npy +03948459-ddcab81a79b6d9448618c83c15f2c76f.npy +04090263-96c60386a5888d2094deaa9fff391d41.npy +04379243-64dedff769355d281bce08795c661fc1.npy +02958343-4036332be89511e31141a7d4d06dc13.npy +04379243-a96c429fad0af4c6bd1cdc725a461877.npy +04256520-638c8ca3dc94b152f6d79b8d34aa426a.npy +04256520-11f47772cbe2a2d0a5f9d52c12457194.npy +03001627-46bd3baefe788d166c05d60b45815.npy +02808440-5ffc44cc5b953a4b572c0ed39433d683.npy +04379243-3e42e3386f4aea9277cf3bb06f394ad.npy +02924116-35bbe8b3dc78680f2232a4c7acb57248.npy +03001627-b1f311d5fd262efcbc47c7f012e5fa27.npy +04256520-235c8256c6e973de19fb4103277a6b93.npy +04379243-4a579619524b60aeba18ade30e563d37.npy +02954340-a3d8771740fd7630afd6b353b2d4958f.npy +03624134-fb1f385d487d13d7aa0079d6fb0f853c.npy +04379243-97cb53b5e54a2abedf6cfab91d65bb91.npy +03636649-abd8a95ebe132c58cf004563556ddb36.npy +03001627-7224a8114ee2daeb0c0a8b87064ef09.npy +03001627-a7f0f0dce71747624671d97b0fd17f51.npy +04379243-a4d149a48607de3d92f4c88fd91c6b1b.npy +03938244-3b5e274f653258a737f437b479038901.npy +03001627-5f4af72ed8cd633a14038d588fd1342f.npy +02691156-30b317e256e9bfcb1f17e8416b3322a8.npy +03001627-2dd12e29d36c2b5519fb4103277a6b93.npy +02691156-959044f10e27b89ee664ce1de3ddc8b4.npy +02958343-96bf8cb730f728414a383db4764d5432.npy +02924116-e3c8034ece8bb14ac72758c329889173.npy +04256520-484259aff803ddd6f51fa0238791f5dc.npy +02933112-c7165635f2288945585ed17f54616d23.npy +04379243-f580dcfbb898139df6cfab91d65bb91.npy +03001627-a996cc501faa4ec841c6494d29fffa82.npy +04256520-6a6c10088c857de114038d588fd1342f.npy +03211117-830b29f6fe5d9e51542a2cfb40957ec8.npy +03790512-efe1456e80e2a8646350c50e0a456641.npy +03797390-c6bc2c9770a59b5ddd195661813efe58.npy +02958343-5ad845ccc1a5795ecc19d582c2bc11b6.npy +04256520-f7efea85176f8cd01f274b4885739ec6.npy +02958343-4eb9dbe42616e407b112e5ac235c21b7.npy +02828884-aa2571b8067d6d5383c4907a93b0fbc1.npy +02958343-586da8cf648767222a9eb0f146e94477.npy +03001627-c08c39b6ae7a44ff3935ca98160cbcab.npy +02691156-1d0c128592385580e2129f6359ec27e3.npy +04530566-3fb4fa12a4718cdb2001fe4ad7074729.npy +04530566-7890b89eba662af0ce90854bc9efdc95.npy +02924116-2b5dd01279b39fbc128fe65339f3ddb2.npy +03001627-b33e6d5d6bdab020af7c7ad2549a1b15.npy +02691156-2f7253f8fd1a6a999a6e43b878d5b335.npy +04379243-424c77a1f39ac41620dd2dd4d7d7656c.npy +04401088-6039379abd69be2f5383626fb6f0dbda.npy +03691459-4fca42120b49baa526841583f16744a.npy +03467517-b4fac38edb5b311d4fa7c0fdf6bf7f60.npy +04379243-700f59abde33ee3ec2d043ecbc42284c.npy +04379243-14624a2cc43aac50e3a031805ace4a99.npy +03001627-4148f94098b428095dc3653f8341633a.npy +03001627-7ec2388fdc271fc4ef22b31268b1b7ab.npy +04379243-d236d890ebc96f9ddaeb6f944439aef2.npy +03211117-df81df82811b2b2fe2d8a7cb76d59615.npy +03046257-b53a925ecca75b04455baaa8ae183248.npy +04379243-855e3ed8e5f233cd2b722fc42ccb4c6a.npy +03642806-ab21f75b97d6b1054f22ce0a3592d5.npy +02933112-29b34b5121639a65c59350d819542ec7.npy +04256520-b1b2195e45bf0495593ebeeedbff73b.npy +03001627-9e9dc51a4e0db2e4c3bd24f986301745.npy +03948459-7bd66b182aad44e79a2ee232a197081e.npy +04401088-d62ebc23fe1a7e6a985b19765176f4ab.npy +03001627-a58e894d520ebda28f94476574196c14.npy +02958343-702edad0d2fa9eda2a9eb0f146e94477.npy +04256520-effb1b260f100f5919fb4103277a6b93.npy +04256520-2d3a484f14ec3d4d7b11ae648ea92233.npy +04379243-259775bd1af2954e30bbd4cddd04c77b.npy +02876657-8a23e8ae357fa2b71920da6870de352.npy +04530566-6d537a1a09de6b13f5678db9e73ab77e.npy +04379243-1bf9ee6578bfbcb0f4b6538438a0b930.npy +03001627-5a2c6a6f832b14ed31251f4428012eaf.npy +03001627-f14fd8433dc1b43efe9f0f410eddfda5.npy +02828884-694681de16b492987170f3141eadbf9.npy +03001627-a1949183ec03f3ab2f6cf9c2cf79a5.npy +02691156-bb6bc2b0786734a79b2acbfd8323f804.npy +04379243-4f7c024d01141f23f51f77a6d7299806.npy +04090263-955021cff365f5907ed475464ab76870.npy +04379243-f07cde4ef5e76ae6c4cd9efc031e94b.npy +04379243-dc5b7cbcf45e557f310af74324aae27f.npy +03636649-6fbc93ef5b90b06ffcb8d8c6d4df8143.npy +03691459-9a35e159b52a7b1897bc8a58bf164429.npy +04379243-388d9e7b2b8a8f909492fbce0bd54e2e.npy +03991062-2399ba91d5263c913666eb1bf2ae701.npy +02876657-2722bec1947151b86e22e2d2f64c8cef.npy +03467517-e12d45cde8e886c463e148e250c0340d.npy +03001627-f05cdaa4f262ebfba16baf954c1d99bc.npy +02828884-8f52743c3cb564f149e6f7df978f3373.npy +03636649-581ad338a34dc3bc30f6e0ede20c4525.npy +03001627-66b5fd596ac18aa79c1db271ad9472a7.npy +02946921-be67418a10003cc9eae3efbc9dbeea.npy +02992529-d8ee6baa8b57a89add62317fcd30f203.npy +03001627-523a54d33ce5fa9aadcbe68a4d5871f9.npy +02958343-53e7ed598e9c3a09405f29f7fa3f25df.npy +02828884-360d4f846b37b7fb5b9049c85f69b9b4.npy +03636649-934981825fbc4e14ff458e602ebccbb0.npy +02691156-8338cdc32688a863bc0909d98a1ff2b4.npy +03991062-53b0b1db08024807c995f1efad0eebc3.npy +03001627-c31483b018ba90c30e62accf4408263.npy +03001627-bd867ce1ff2dd281a0f7d9635ddf7a01.npy +02691156-1e9ef313876bfba7d02c6d35cc802839.npy +04090263-3860f5c1ebea3de7fc3c7341bf676efa.npy +04379243-5e8452a2014eadd5ea8049eca11c54ef.npy +03001627-d040157682f60a7ddf6cfab91d65bb91.npy +04256520-17fbdd9d8e8b3e8dd2afe8d5254a0d04.npy +04256520-4a11e50e8e5c79e82cc460e9d064e57d.npy +04530566-6729875f6c9b48cbe4707b1374ec004d.npy +02747177-555f9430c2ca273ccb2a965e75be701c.npy +03211117-b7a259bd391ad43c69b642ba22680f87.npy +04256520-1e70ddc0e4cef3a832a785b4a7e37e67.npy +03636649-c233bd44815828b08bd5065c89cb7063.npy +02958343-ab8b6d39057d2f6cc86779a6788ad464.npy +04379243-7041d4ec390b8b12234a98794d9f2b5d.npy +03046257-4325f0de6001e3a195f577622f465c85.npy +03797390-b9f9f5b48ab1153626829c11d9aba173.npy +04256520-4653af854bf098f2d74aae0eb2ddb027.npy +02880940-154ab09c67b9d04fb4971a63df4b1d36.npy +04379243-6b9c15484369406919152a83d1ba40ea.npy +04256520-7b7c14e8fd0521bde4511d9a59e40339.npy +04379243-4f70d14dc276a9539a83764a2641fc5c.npy +02691156-2767994ce3078824f38bce64a8733419.npy +02958343-c73e146596486bdac427f8508e3d634b.npy +03001627-5da96a876b66cfeb922f1115ce03b77e.npy +02933112-61b9d7c12ba7aed4c59350d819542ec7.npy +04379243-614c37441ed33c338a3c75a1023723f3.npy +03001627-311e72dd86f0daa981a172d69c52a28a.npy +03325088-160bf4447843d769e6460c75101f5b6.npy +03001627-6df81788b1cdd1c3ab93f6188b226527.npy +02958343-f9fbc58e3692c4d5583d20ad0a6b981d.npy +04530566-5a4e0cb4562b2e0ef647317afa6ffdd4.npy +03948459-948732c47471ea808e75bb5638d14ce9.npy +04530566-aec5ec913aa2084b543941eaaf04581f.npy +03001627-c5ee6b77f9f84adeed52100e321c9f3e.npy +03001627-2282142b6b136a6f2ebeb1e6a8111f53.npy +03337140-fea46326afa3180a4fb42087918269e.npy +04379243-da7310bedd8595879daeea1362fbd792.npy +04256520-1d4e0d1e5935091f78b03575bb54dfd4.npy +02828884-bff5fff9215b5c412056b4bd5d870b47.npy +04530566-e57c1a72d265147548c2e07e979bc75.npy +04401088-67b3696286a96a8c171bc7a10f38839b.npy +04090263-56a8f2d9908cb417609e2d916fa0da27.npy +03761084-7acbd3fd7d1425e38f029c88b393c0c6.npy +04379243-4e3d100672af00842dc02296076d8ee0.npy +03001627-d554adc917b635c0fdef1c01cbd4ae0c.npy +04379243-28ff86c01e0faad758df8eeaf3dad1c.npy +02958343-c31891b69780886ffb907109397a6c7a.npy +04530566-860e632b27b9d2469f1deb04fb8ae481.npy +03211117-d9bc4b2da5df08b7eedaa5970dd41792.npy +02958343-7fc1cbdf81a1edf5bda733a39f84326d.npy +04256520-69e8d0b7366591dc578d107c71db28ac.npy +03001627-537924063294eb5f46ed025f8f85e067.npy +02691156-77ee6ccca238ceec5144962e2c20b832.npy +04256520-b2d70313d7d408f729404a50338e24e7.npy +03211117-e1eb75d031091e422616600cb9fa6226.npy +03593526-3ca8bda43d9d5775499773b0b5888ca6.npy +02828884-50ef39d633520df0855931d119219022.npy +03691459-dc9f8240a57b7be77fd9594c37158b0.npy +02992529-f48cb1a242e99745ab905891b6fa1a.npy +03001627-6b796faf03a2806f397aec0de5712401.npy +03001627-5d92fd12417a9405cf004563556ddb36.npy +02691156-b8df5a1fb0fa198a9a162c818d22a620.npy +03001627-eac0a44a4b4bf460f37e11038ce8fb27.npy +04401088-7f756e697cd03ac821844676433a0aca.npy +03211117-7525e9e986fa5059f64945cf4aa3c1a6.npy +03001627-1eeae84f10df85cd74984b9cd0997a52.npy +02691156-95a79d9ea571592bc3e5025cb598f546.npy +03790512-115a5200ff80b5d0b37378f3c85478b4.npy +02808440-c6ff7725e2e3832835b3d63776480dcf.npy +04379243-8d3d9f1bdcb245b49eaa55bb236fb6e1.npy +03691459-40f0e44f749ec0c7b3e0a2cf776be56f.npy +02808440-fcafadf19df05ee11bb088904f7cb154.npy +02933112-d68b1b0c95408b95380188eb80c957bc.npy +04256520-d6f7727a3e5736437b9c6deef486a7d8.npy +02958343-48f5446e6ac9c1b51f1446551412bde4.npy +03624134-81ba3f06ec38eaa46016d22b1dfacd4b.npy +04379243-e476ca4169c3d0ca490ad276cd2af3a4.npy +02871439-6ae80779dd34c194c664c3d4e2d59341.npy +03001627-323ab1a1a81ef0f51f77a6d7299806.npy +04090263-db313451e6581570e16974ffd95b0c65.npy +03001627-6f754a2c354b17642c0eb4a518e123ac.npy +03325088-a4bb5d2f36b1319f50da8b99982a3057.npy +04379243-b3371ffc36150f817bb281f66a49b55.npy +04379243-ed20a233783090839039bc4ea22a379b.npy +04379243-41fb180e6e8b19a14ee40fa7f6af487c.npy +02801938-bd11c268ebb14e2d7ae6f33544c233fe.npy +04379243-ae6594f65639a51845f0e5dddef26b1a.npy +02880940-6501113f772fc798db649551c356c6e8.npy +03046257-90526ad050d212adfc00df8700518cc6.npy +02691156-4853e07c17127af7df92be10876fa000.npy +04256520-71147c7ef2258b894a1a4db9532622c3.npy +02691156-5fc63354b0156d113136bac5fdb5050a.npy +02871439-f5114cdda24d49216638e88207c822d8.npy +04530566-9b300840d96e46f08c173f7caf7ef0ff.npy +02808440-89ab13233adb2f879d57ee14f8ee702.npy +04379243-8d84471c4af977d917271868b642acd3.npy +04530566-4b54d54c1e9cd6cbff5cc490d863ff3d.npy +04401088-8e9c97d54060d1282085d549612807d7.npy +03001627-7f8d63acb7b4b5e84d2f52566c6c4e9.npy +02924116-9e14792c344aa053e78cb83d32b44564.npy +04256520-a73fc5b447cab6493ca57f5648ff1b0d.npy +02808440-5b8d1278d408864eba47eca8aa80094.npy +03691459-91ae8db92f3dd88b55a8aec4bacc60b8.npy +04090263-c7f8678e3ea91a99de50356926b60476.npy +03790512-25ae9e6628ed05d81e32f79edfad8027.npy +02808440-e34dbb83a23b3b019bb88ff9c0d772b2.npy +03636649-4d44c896993e80a11391d5b018495c2c.npy +04530566-f2c8239dc51b315858e86ae676396826.npy +02691156-3a6d6534045b1895e8ed194c80e0b1ef.npy +04256520-aebb3daec0cf81e695b2988c41a35527.npy +04530566-99d12cf62a1b5cc3f4352ea917328a5b.npy +04090263-6cff6f4bd6a5d73e8411da876c84603f.npy +03325088-e10b62f9792ecdc1b362845c6edb57fc.npy +02871439-601359d274c2c00a1497d160eced5e7a.npy +03001627-8b3d1c34753e095cb05550de345b6d0a.npy +04530566-e456eded209aac05a8b0c9e2ebd8eeb.npy +03001627-e2c3729e9729b75f40ef1c8b63a628f9.npy +02924116-fc5863dd1595add5f95dfd5eb5f06d19.npy +02880940-aa70f5e55fa61d8dac6b8e58caf61f95.npy +04379243-30820b470df63087afeb21083ecb38eb.npy +03001627-8e945aa01bbacf7c3fbe480a485feffd.npy +03001627-5555c24767e66a3384633b41c8a09fa0.npy +02691156-86e19045d9f27bfe269856bd6e519d10.npy +02880940-4fdb0bd89c490108b8c8761d8f1966ba.npy +04401088-1ecbb2ddeca087b5fd71b7a0b881ae82.npy +02691156-bb5844976bf8ec479e8d5aab043eeb56.npy +03636649-cf09b30a89f70929cc67b3de75c44c76.npy +03991062-f33a6fd8d570b5de4e7284648d65204e.npy +02958343-7c4aa4b3f916d26c9cdc71dce6a3b485.npy +03211117-993e7df9e8166312af8f68791a7d624.npy +02808440-60427211b9845f4e9ee028845f1b68b.npy +04379243-4ba447371db8c37c74739c2c9ecfb3ee.npy +02808440-5592d42aab84d67dd27bbf2d1aff38ec.npy +02880940-13e879cb517784a63a4b07a265cff347.npy +04379243-8bb3a7e1cb24fe6febad4f49b26ec52.npy +02924116-57e1aa38fcc42438d3a958737449e7cb.npy +04256520-b24e1117e49c75f817b431cae0dd70ed.npy +02958343-b2f06baf5851e7a36df8cb2765f8ec95.npy +04401088-5ccde0c95cc0538ef39072555215f568.npy +03001627-4afbcdeba648df2e19fb4103277a6b93.npy +02992529-83f766eff3c5c12c781fb7da315db2c1.npy +02691156-aac4ceced7042e4c1a6d59f1fe711d12.npy +02691156-7f895411162624e92023ec956848b741.npy +04379243-ff5a2e340869e9c45981503fc6dfccb2.npy +03001627-e401be99c5a51d8bef8e9284f76f3024.npy +04401088-294d1fa4193f54528db944c07f28e3d8.npy +04468005-1fee0527788d5f6fbefe0ffe2abbe914.npy +02876657-e29e8121d93af93bba803759c05367b0.npy +04401088-1cd8004a1e0dd825c33f370fa5b41cf7.npy +03790512-d91a81a1d57ce78a739936b7765e22ae.npy +02691156-4385e4300e72e49e90b1d6deb98feec6.npy +03001627-c79532846cee59c35a4549f761d78642.npy +04379243-712a7d7ab58960829408655f72318aa1.npy +04401088-4991cd37af08577070346e4935b9a42b.npy +03325088-d40acf58d3ab13763321831d2245cf06.npy +03593526-17bd8e7317498f21f0afc55e2266b11.npy +03325088-80b9619326f25bac3321831d2245cf06.npy +04379243-7122eeaaedc364fab5e360679943d9fe.npy +02828884-238825520fbdda8e6a4265f8860b466f.npy +04530566-eb1b91b2e6458a813f6d8df212adba77.npy +03636649-2e32934d4a49c374b20bab10aa3ece03.npy +03001627-4dde5285971f0b73ba4ec8b7deb104ae.npy +04256520-9cf60525ffd70735edcb0677ec04fe0f.npy +04090263-8d5c7600f31e45482249915e95f55f08.npy +02691156-e726c8e6897130439a6e43b878d5b335.npy +04401088-9f3ad4e5f16f40b3d0f9f958bc79097c.npy +02808440-3a5a6113f20f7462c0f3ab010f0dece7.npy +03046257-4d7de5c46a7644fe8b7965c971f6e497.npy +04554684-880a6bcedaeaed1fd095418bcfa348eb.npy +04530566-55dce6844c2bb0145368bed34e5564d5.npy +02691156-e8409b544c626028a9b2becd26dc2fc1.npy +02933112-140ec01582235e15c59350d819542ec7.npy +03211117-fc0b4809f5a1a613496b87cefd345586.npy +04379243-aa3eb180a4f6d8d42de421c2ab5cfb52.npy +02958343-86c31c04c436f5932e877e82c90c24d.npy +02933112-17ad636e45c233bef79e00aae9a7dcf8.npy +03593526-7333b1ae767c03db2396ca3dd50467ab.npy +03001627-bd0b06e158bcee8ac0d89fc15154c9a2.npy +02691156-688c6d406c789b8d71d03b466c72ce41.npy +02992529-f6679591247bc328afb07a946d621b3c.npy +03001627-a63d7b6e62333b23ddc809959e304d48.npy +04330267-55878303fb7fccc58e4d888a487bbe11.npy +03797390-4b7888feea81219ab5f4a9188bfa0ef6.npy +04379243-a39677e069564a7ea7e7cb173e141227.npy +04379243-f7ddd0ae5b0107efdde6d22342684df5.npy +03001627-e594b1e2f7a7f677492d9da2668ec34c.npy +02958343-92c882d35dfca864acee48fc4abca0f4.npy +02747177-abfc82b4f2071aa6ad5067eac75a07f7.npy +02958343-6ed2957beeb7940a9fbaa69916aaebda.npy +04225987-254feab290d4b460d4e77499b42cadd3.npy +04090263-c640c5ff1527fde7929ae5eb653afaef.npy +04530566-aec79b6f0379b1749fb6fb8ca3454a08.npy +04256520-9d1e8c37315e292f31a50841704a69bf.npy +02933112-31a142710610023cf51f77a6d7299806.npy +03991062-7c1303d3a19a1cef51f77a6d7299806.npy +03691459-20fa8d1542e7f835efaf604fa2300241.npy +02818832-1101146651cd32a1bd09c0f277d16187.npy +04379243-e6b61073fa46571df71e06115e9c3b3e.npy +03325088-9199954a99393c6e6d0157e3e7a8917c.npy +02958343-4cabd6d81c0a9e8c6436916a86a90ed7.npy +03001627-cc1dac5070d0bb7d5c43d2b61614d0d0.npy +03928116-d9b103dda28d8d20bab3d34d85dc6ddb.npy +04530566-4e6313bce5ee3698909d4348e3fee2dd.npy +02958343-7c5e0fd7e8c62d047eed1e11d741a3f1.npy +02808440-73baa3af38c96a52c85e7a9bf0779313.npy +03046257-8978869197f846ab31a50841704a69bf.npy +04256520-e014e3cecb1bc2b949a3c1009fa79820.npy +03636649-98ae07e021f3227711d89826bd8e0670.npy +03001627-a0196df591bcb5f7e404848d22e4a58b.npy +03636649-833d33785c62634b192fe29c2d3d296a.npy +04225987-c190e478faaca09baaf812076502792.npy +04379243-83952bdf5c426c4a85cad391c250db01.npy +03691459-99dce9c359b0bf4afb33d0031815b3e6.npy +02828884-6eaa388bfa782df4392580629414747b.npy +03211117-732dde95416888ac21d25a6a55757584.npy +03001627-3c363c3a75aa1daee8f8c11a24c52ebb.npy +03691459-37758713e7a31d1710b84d6f34c2f2e1.npy +02828884-8d3e69ee2d0168a6d4d8765e3910f617.npy +04379243-1b1f24767e5555d8c3bd24f986301745.npy +02843684-4357b7e7d5b0607d961dc4fac22bbd1f.npy +03325088-667db69a5d07b34f50da8b99982a3057.npy +03691459-fe977bebc78501995996c3a82deb78d6.npy +04379243-a7ab2b8bbe94bc89b41f4c6c5919541.npy +04090263-ad945e636e38338d8aa7cb0651220ba4.npy +02691156-38a8e07ed9b0da99fa7918e5874b2c16.npy +03691459-38007ed3e5ce40ab13dd6eafe1477be1.npy +03691459-86adab79cdfbc284d7872acf770948a1.npy +04379243-2d4005749db552232430716fc386281.npy +03790512-177c8a8394f5a78772408d74edbb952e.npy +03001627-f31a13e903da7e865e61ef8e2af97499.npy +02958343-36d0b6beaffc68ceafe1d4530f4c6e24.npy +02691156-213cdfff847f32135ae839ffe09b9d31.npy +02871439-dda1bce96f08098ad072fd39a51dc44c.npy +04256520-2a154c6f14a749179f6fd848d2db8a5b.npy +04256520-57e1cdb6f179cbdb98e0d1738edd4f19.npy +02933112-8b24699e1351a78ef8e7f2c38fe37243.npy +03790512-3a94134ec9698b74ec5901a85efd6b67.npy +02958343-44108b58784ea6a1b5c12c7484d0ec31.npy +02933112-4ae5df17829fb50799dd23ec22c4943b.npy +04401088-58d40261b05f9a148abea0092096036.npy +02876657-d3ed110edb3b8a4172639f272c5e060d.npy +02691156-167a44b60adc37319ba010ddb4974fe.npy +04256520-9ea38e213819c55680dbca6e7b64a4bc.npy +04530566-afcafaf311af722a5446fdbcaa866773.npy +02992529-7bd964021c9c26e0e4b68d3b17c43658.npy +04004475-4a49d478c563bd7dad3955f0fcf64b8a.npy +03325088-19a3ce38f92f792376c18e71fd49c4dc.npy +02924116-fe66024bddbfb69310c9db2520d67003.npy +04379243-b390566645360e5d69fb38085fbc320c.npy +04379243-f5526d438b53a244bda2eee2725ec127.npy +02876657-3f41aaa42a237fa3c785f06f424b9d06.npy +02958343-695bc26f67e001e65bcdedfa3370f5e1.npy +04379243-c67b454761d7c84eb2a155afd9dbbb0a.npy +03691459-102f9164c5ae3846205b5aa6ba4df9c8.npy +04530566-2552d0de59d21f1bfbc6fe0b6b7dde54.npy +03211117-7a2d9d3d185cff794b85c79082892df6.npy +04379243-948f1bc3a1d574196086aaeef17e8c87.npy +04379243-54c121f22e8fb768b129901f80d24b7b.npy +03001627-497833f2073ba6ff70d45c28bef72613.npy +04379243-2362ec480b3e9baa4fd5721982c508ad.npy +02691156-81b67bd14fbcacefd67fc01cbf5eb7c4.npy +02691156-8c622c7e0b15a0243ec67cba9d24f2c9.npy +02691156-d109c08886c2a3dabdf566b587d6b21.npy +04379243-596f93940a4d97866c752a9b08e87ad3.npy +03325088-c5ec1e91a2de288fb362845c6edb57fc.npy +04379243-5c1f92f1c0bd459386a48a74e08b1cc6.npy +02958343-61ff6beffb91b6a82a9eb0f146e94477.npy +02876657-547fa0085800c5c3846564a8a219239b.npy +04379243-adbd3814cdb655a7b11ae648ea92233.npy +04379243-7d0b868cce75a059a0ab1d82ef09f78f.npy +02933112-55f08c36c20f161be186198f40d88f09.npy +04379243-3237f2e39e0f2f38c3bd24f986301745.npy +02691156-536e1640461854957a86454b5377c47f.npy +03001627-9e8e454c76cc6815dac5061520ffd33e.npy +03636649-e519ec9a23b1612dad19a449ad99c8fa.npy +04379243-6962e8f899bf60393d9c503e95bc363.npy +03691459-39ade62ad13e3c79206861ce7df4037f.npy +03001627-d323e6d19dc58526f2c0effc06a15c11.npy +04379243-fb6d011741ccdb374a00834418a35d1d.npy +03691459-e2d6a0851b9357141574d21c0c95092f.npy +03001627-954a964459d33b8a71a782a4379556c7.npy +04379243-ffa71bb0a75ebd7f93ad7cfe5cf8e21f.npy +02691156-3f80ce1461f3dbfe16af5d7a0b735543.npy +04379243-f695567555986b6a71f08386b3af436f.npy +03797390-34869e23f9fdee027528ae0782b54aae.npy +02958343-fc86bf465674ec8b7c3c6f82a395b347.npy +03691459-4421130ffdb720c7421e5649908a4a06.npy +03991062-1ebbd0a9e447cf62a2c59a4d90e63212.npy +02691156-e0058b4948f87d3b87697d3904b168b.npy +03325088-98b09e32fd09e51ab482922dfbcdcc.npy +02828884-4b495cde98399a83d4d8765e3910f617.npy +04256520-366c86849245170262f6790b971792e9.npy +03001627-76fe7cf10c5dbf1edcb466b6f48b5810.npy +04090263-fe21904b4e1548ba5bd1f946b0dbc061.npy +04379243-3c5281bf572e2b6f2b70eac6546e93fd.npy +03001627-8e779c0b252d4b5e118ddfdb81cc6068.npy +04530566-3f35daa80c8b364fb7b1411b0ad3bd0d.npy +02871439-1c1795169de018b97948cb8e1d9ee487.npy +04379243-c0b74c61865b563067dc358060e3c47b.npy +04256520-d0842064c9900af698e0d1738edd4f19.npy +02933112-e619cf6aa221424cf80ff10f4838c137.npy +04379243-f83f03cd8d6d787f73678cf8aa86fc01.npy +02828884-3f50c37f196c541e776d8bc79b9caa2c.npy +02691156-f7bf32d3aecd197360c9b6e4c75a092a.npy +04379243-bcc14b683930f8d33924adb2bfcfed72.npy +03001627-92cae2e67b788eaa9dcc460592c0e125.npy +02691156-25a057e935aeb4b6842007370970c479.npy +03624134-6128958f839431276978912735020245.npy +03001627-ed97d1c954fca49851ceffe90913a32.npy +04256520-509a533e17fa45572814c9aa90ee14e.npy +02933112-a53a96efb6b9f29a490ad276cd2af3a4.npy +04379243-372d52845e1c620fef3b6dbf349349be.npy +02691156-310f0957ae1436d88025a4ffa6c0c22b.npy +04090263-6a62d0d41a2351af7f683793234d478b.npy +03001627-8a1187956642c3895331e304403f2050.npy +03001627-5b89de55ce0f464221f824bda064425c.npy +03691459-8562c442745af497b5b6356ddd072fd9.npy +04379243-8ad09d90888f71dfcb9cf5f7d536cddb.npy +02992529-c71acd79ec4cf1cdd11ec2c68afc26e4.npy +04379243-b97a0bc7e2213913ae96150e4aa362f9.npy +04379243-3cb17903afe49e6962e682c9809bff14.npy +03691459-acd123e2a1fd25366cde9ab9486e09f0.npy +04530566-b9dde09099e081e65f76b0776a50c136.npy +04379243-4fc00c3e48cdee77883679e873099585.npy +03046257-ddc323f128d4bef76463df620b7b4cbc.npy +03046257-b0cafe0b5efb6cb44cdd82d9cdddaedf.npy +04256520-28e546337f4a5188e6fe3612af521500.npy +04379243-b7eecafd15147c01fabd49ee8315e8b9.npy +03513137-8e624ace735e6baf96c3bfb1b184602c.npy +03636649-3ef55697cf7f68061173b43d09e96094.npy +02691156-f9fb41a3b1f59bb027745e9b6b461e93.npy +03001627-aa2242ae4ea1074bad0881e4ef1ff29c.npy +03001627-1166b15756ed9b8897317616969032.npy +04256520-ec4948183b308204e4d5ca1617e68f91.npy +04530566-fb8206abb1fde4c08abe79d18310fd73.npy +03593526-d67ac9e710ba445089035c25f0dfeb63.npy +03991062-a30eea3bbb52b3d4f13ce777d031b4b2.npy +04379243-10e279c69b5678d39a45b69dede1154b.npy +04379243-f4203c90d740596f70b396e6f5e48bfe.npy +03991062-a2970be7c866fe33a2c59a4d90e63212.npy +04379243-7e967a3c6d2a46c3e2d62d6f0e6f01ec.npy +04379243-5d9f67dc1f1518b6d5f8f84e75452c7.npy +03001627-e9c9d998f7b0de3ca6afe5903a01a59.npy +03636649-2fa7dbc66467235e2102429c788ba90.npy +03211117-d2f37af28550950f4161e123a102b12b.npy +02691156-d3580448933d00fd90b1d6deb98feec6.npy +02924116-fd2ae226f9c957e8bd69e36f5d4705c8.npy +03761084-c597a020f422d48a90071898148dca0e.npy +02958343-66d4d1f28cdbe97559139efcde1fedcb.npy +03636649-878d76c9657bec71fa58f9bd5c78b9e4.npy +02924116-75fc875e3d2bd8fbf01129d246a5d1a5.npy +04090263-3b22c066b7786677b1c46f058c033ec1.npy +04379243-ae3f65ef020c8170cd80f9971acfba.npy +04256520-3ddf9a51c44970fd5e4b35ff1ea95f37.npy +02958343-45738568b9c0eb2ce2915d41189be12c.npy +02958343-2d9b790608d32763ec2f3f4c642b88b2.npy +03593526-c673160553979cebd37947b3ce04a083.npy +03624134-824ef824c95632932ec2ef9f7cbb064a.npy +03513137-179b3b1df301b95ccc34b900bb2492e.npy +03325088-66c916bcb881f8b13321831d2245cf06.npy +03001627-8fcff2582b55291389e2d345fb844f4b.npy +02958343-d34b0494fc4d756ab927782fc69a1fbb.npy +04379243-5e68b3e485b9e033ab4d0308b2ec6512.npy +03593526-ee07000195ef7c93e89c405d853359af.npy +02933112-5b2201c133876813f8333d818f5f80e1.npy +03636649-f01ce55e789efa7e5127e0873cfaa7b8.npy +02691156-1280f994ba1f92d28699933784576e73.npy +02691156-7e52ac52a2eb74ac26360e1e29a956c7.npy +02933112-27cfe222aec3463bc59350d819542ec7.npy +03636649-e2e7f45670fc5e369a6c869309041adb.npy +03467517-7068e37ced4e8e0ca9f121364bea84ea.npy +03261776-9cffc684f6f3a077c0a508349d9ada60.npy +02946921-8cf26f6912f4a9e34a045a96d74810ea.npy +02958343-9f610a7b0be81dfa3a0daf3e5400b95c.npy +04256520-d9c184cf0d80efa6150855094a28ed1d.npy +03001627-5073d7a546b9a4d0e810eba61b778ebb.npy +04379243-9012c6ca245c1bf4e6c5cd45aa112726.npy +02992529-37846d5854ef7da646e4b9487666a2f7.npy +02946921-7b643c8136a720d9db4a36333be9155.npy +04530566-c48e3ab1cc01521cdfaef96860d73193.npy +04256520-2b79edc3da006592395a2b8836b4be75.npy +03797390-e9bd4ee553eb35c1d5ccc40b510e4bd.npy +02933112-33ebdfbed1aff9fb12d532e9deb7e02b.npy +02958343-e7c5fb8f7a553da7d7755e7baabe8a6f.npy +02828884-5a96b6b335bada106fa8ce57c8ec2e09.npy +02871439-68042811281ce35a3d80c564be8c917f.npy +04256520-c44ab66d4938052a36e4b0ae0f52067b.npy +03325088-7aefdb866624662114b35a7d7cea7130.npy +02808440-f629c8296f95491d83fe9e17f17632f1.npy +03001627-a7f9e2612d0764a0656a19d1d18fdbac.npy +02958343-8ee2dfd1460eded9473f10e6caaeca56.npy +04379243-89b478643e53d3d6285c99063fc6fcf8.npy +04090263-8cff6a796ea47a9cfef144202cb2b935.npy +02828884-ef018d0bcb3d4c89601104cd2d998272.npy +03001627-79a3115a6f96eef7c151419181ef256.npy +02843684-a842ad87774e1948a89d6f0a00bf90fd.npy +03467517-2c1b6a4fb58b04371a3c749a0d8db8f3.npy +04256520-130c64a2c0232fd03fc2ef4fdfb57f60.npy +02828884-fce4206a99792d47cfb87ab5efe3dc31.npy +02958343-bafacc7f28509d4157abc6fa0d632bc7.npy +04530566-dc38553436df0e4bb129901f80d24b7b.npy +04379243-43906b48471bc76e7571d17c374fac42.npy +04379243-1a35db5eb4f931a3eba0693b2c2a423b.npy +04256520-a1743777bd7c796b57ae08c3105b4e6a.npy +02992529-f649a5368586aa77eecb4e0df212ad9.npy +04090263-3d9907c402689521d8a2f3b4102511.npy +04256520-681d226acbeaaf08a4ee0fb6a51564c3.npy +03467517-3463e9eab1648fdd91c260ea88c0b690.npy +04256520-c837f4472115496cc93e5ef112648b04.npy +02691156-47331e4c26dd1dbc66cf1b4a8fc3914e.npy +03001627-866e7248434968051cc7750d0afca796.npy +04379243-f38a18709e55e4647ee217c21e683487.npy +03001627-b596b505cbeb456e763d8d4012bcdd98.npy +04256520-12766a14eb23967492d9da2668ec34c.npy +04090263-4d55fbf2ec19dc227359b134afde902.npy +04379243-f166eeb3434b9ea4d79a1acd1a8c2d4e.npy +04379243-e603bf3c3d2d26f9579e0a60e99d2683.npy +02828884-e2f79a5d9126b25aed98cca8f0ccd5f7.npy +02876657-6d652a95363bb682b692b490d9871ff1.npy +04379243-bc29a2ba03444764c3bd24f986301745.npy +02828884-186da14db8a38403612d80eb7de76ff.npy +04379243-e046b02e2d5c5187fe38a836aa59c483.npy +03991062-7ed1eb89d5463580a2c59a4d90e63212.npy +02958343-56cca58a4f37323bd0889537a7d54003.npy +03636649-8843ee2b220a702e5dac14d8f50c13f3.npy +04256520-93e652f343412a3e1c8509b1d97a23bb.npy +04090263-99a1608f8e848bf6519f927f2bf92da9.npy +02933112-731733f855e5ec4ae4c30caf4bfa735e.npy +02933112-bcceb065b8c433b99a87002a4eeaf610.npy +03593526-998c2b635922ace93c8d0fdfb1cc2535.npy +03636649-7634fbdcaa6b304d62c83ac1e3a4ebaa.npy +02958343-e75846320e6aa623960b997a49ac99a7.npy +04379243-1a2abbc9712e2fffc3bd24f986301745.npy +03467517-a541f89066da370693f0194265a9746c.npy +04530566-848164edcd9aa41594daa4565dd30535.npy +03642806-d31e025e9ff79c58db3780255bb0fd19.npy +03691459-864546c6fbf636a2d0d6252a768bb9c.npy +04379243-4e9852331e1d5d8dc3bd24f986301745.npy +02992529-ef57d8665eb5ef7cdb965514105122a4.npy +03001627-64f6991a3688f8a0e49fc3668cb02f74.npy +03211117-887fdc9a9940ea57bd59d5b2d356dfd7.npy +04379243-4ce62e31dff3ac18ffc6e457221b9271.npy +03001627-9f5add46af4a41a1305e886266e302e1.npy +04530566-8d8e8de880b4d7dd12ce033f7610a23e.npy +04379243-a2824ff9eb173055f4b6538438a0b930.npy +03636649-d1948365bbed9de270bb6bcb670ecdf5.npy +04379243-818258b7cc1925031b17743c18fb63dc.npy +02958343-ff794bcc5ffe460169e495ca617c20a7.npy +02691156-882c6bdea5fc5e82a3ee83e6cad78356.npy +02958343-8c1741a5ee03b865bf5aa6fd28a4a75b.npy +04004475-e103e8c985edec6ddca809889e6575d9.npy +04256520-ff73fbfb9f4a273be738f481f8560d58.npy +04379243-531381f5bbc69e485769b3af36a2ff9f.npy +02747177-dd2ebaecb3d046d2cb2a965e75be701c.npy +02933112-b0f01584cbb37d2ff546596ce7364503.npy +03691459-5aa9c76ab234dc2234560c18f9de360.npy +03642806-760b1f82f7133ca1de7d2830be38218d.npy +04530566-2defbf22a2d6c97d48f817470e1b499a.npy +02828884-99e759db1e01bc3196ca2abd33a2baef.npy +04256520-df70c07c2b0a066382241d99b4e87f38.npy +04379243-c1254fc0d8d0625b8738e7290b6f3237.npy +02933112-123994ddd751ef58c59350d819542ec7.npy +03928116-6f5036645aa28645a2b96515f0a8f928.npy +03991062-7d4aeb5d950a335cf700ea08eca56581.npy +04554684-64e1c85034dfe93ab7dc65d7950bd55b.npy +03593526-b2507913d631e8b8bcfad79fc308fa6d.npy +04256520-b42e4fd21f39ff4a19fb4103277a6b93.npy +02958343-4ac021653126a29e98618a1ba17f086b.npy +04530566-f791188138166b4d9db44e8b39ef337.npy +02958343-ec18723333333a6e2fb4628a7a8b337f.npy +02933112-f939cc4fa30511963fe047712e43e185.npy +04379243-5883da6d43e3b9743087f84b199fd297.npy +02958343-41d9a381c12ee3e2b7863a3a9a8d5d0d.npy +02828884-d0ae223012be978a49a531253b5beabf.npy +03761084-a91fc98fb71dfa46eed4b2bb88c072a8.npy +04379243-c8dc82f68335fdbe6b41b8bcd0404ec.npy +04379243-2a896f1d6925cc61dc89a28b5e6678e0.npy +03691459-211cf10bd078f91c01c4160f17211fe.npy +02958343-e3dff7195a2026dba4db43fa521d5c03.npy +02933112-c7dd92386b9d18bac502b42dc3551a09.npy +03642806-47583d8af57c13d94145b5f47fac09a5.npy +04090263-3907ed2cfe0cbd22853c6f214c15e60f.npy +04379243-ff1c8d1e157f3b74b0ceed2c36e897b8.npy +03759954-e074316e42dcf9e15c8e7963449f8577.npy +03636649-a47a54ea870ac35396280c8d384f22e4.npy +02958343-a70703613b83063d27c34dcc9b552d03.npy +04379243-d9fb408a6fd11e6c22ce72a02bf771ea.npy +02933112-346419b6e2131dda5785f58f071c8c43.npy +04379243-2f9f15a48b674ea25c87325f4fc53794.npy +04401088-6c53f579c7a8da15c7ef7dadd1baff8.npy +04530566-ad00fa76c831858ebb4a6ccf078584ed.npy +04090263-c88aece300c3c4e05127e0873cfaa7b8.npy +02828884-35554b4c00816a08b50485c33b91d8c0.npy +03467517-168cf0014eb65a479c3e3fc875294773.npy +02958343-9aaeb0852a4cca28471ac7b6a0462075.npy +04379243-580373e581fa155d3ec45bd2bc895504.npy +04379243-5f274ad7c2989f5119fb4103277a6b93.npy +04530566-75947361891546713c3d3b81c7ce4f52.npy +04379243-9b56632bff0d00dbd626c689702869b7.npy +03001627-f2aa3808b870ba95429b498f2f24a42.npy +03636649-6e51353655289e10ad885ade4bf3150c.npy +04379243-5897116720fbf6b5d1308d82a3302eb3.npy +03325088-a0e8cc8bc5f9c00143c5a4b82cd776a3.npy +04379243-2b8961b3c1deaab8cba466d56886cb4f.npy +03001627-af96bf24c341e56436b0f2a1430e993a.npy +04256520-273e8e15b6740e5932a526e2e9a7e9ae.npy +03046257-79e6df3c7e4cdd027ed10ef1927ebd15.npy +04530566-bdc39427c6267262c541ae04c251c7da.npy +03636649-776e4b38023091002cd2160e449d45ae.npy +03797390-32e197b8118b3ff6a4bd4f46ba404890.npy +04256520-20050b94da092fb8803805d815ede61.npy +04401088-f6b4f01d4c9c09e6af1fe3c052ed3a8c.npy +03624134-1db70d6edd9d27cd45e6ffe8c3b08de2.npy +02691156-de7cc3442b1775d46559a92f80e3672e.npy +03636649-b990d515ee1cfc214a200f5f1797d729.npy +02958343-8478439998e4af846602d94d941a9c9.npy +03001627-27574a49bb8055ace6fe3612af521500.npy +04256520-5cfc913387c753f114038d588fd1342f.npy +03001627-85f1b136e6935b7baec8a763854c53a1.npy +02691156-13daaef458d6bb11e1873a3963e0d14.npy +02958343-ab7eaf660f1bf4db23fa56f2e03fa992.npy +03001627-813be9a8485050571563f0911e3e5fc0.npy +03001627-9e519ddc82bb9417813635269a32e293.npy +02958343-5c5908b7a19d8df7402ac33e676077b1.npy +03001627-b944154f00e7cf1fad484915511ccff6.npy +04256520-2ccd286e8d5963199201f2703b45dd7.npy +03710193-4ef4cdfc65eb235aa26a056a2194a6f0.npy +03001627-e4214fa7a544e12a37b2bb75885cfc44.npy +03001627-a578b0027e7d9ec7b2ca3ea77e53abe.npy +02691156-4afcc2cf695baea99a6e43b878d5b335.npy +04379243-c418195771c7625945821c000807c3b1.npy +02958343-56dafc275ef1367d307cb03f4c762959.npy +03001627-5cbd738436d0523d6996454765a52e50.npy +02924116-a642cd8a3cf8de31797ce0caffb8a237.npy +03513137-272cd30169e040d3aac6013f3e2b09f9.npy +02828884-65470e16a5880d4dcb2a965e75be701c.npy +02958343-f90ffde4e5ac04bcc627f7f719e1032.npy +02924116-e13587cf4367206627787a85c3bfabc6.npy +03207941-66725b8cad4355a03735baeeeb56a00.npy +04401088-ac8d3abc6a6f7a939260029564d4cf0.npy +04330267-a98941af1bff5bc6843f813f752a5e35.npy +03001627-62d160f560c31e0ff1d6726679b21945.npy +03001627-6def527e32885b7888dcbe86402c7c15.npy +02924116-2292b067ccd1bb2dff93e4ecafd3dedd.npy +03642806-7f6bd9a933f6cbd33585ebacb5c964c2.npy +03467517-5fc56e6d220d775e381b7fbf79296afb.npy +04256520-485fd17a8679ebea638c2f4fcd9a8e7b.npy +04379243-53bad3b72a7b6c1bd810b14a81e12eca.npy +02818832-1e820e0daaae16c7c3bd24f986301745.npy +03642806-5baaa726f51cd09b507f3bf1d3472684.npy +04379243-34157148280e9342d810b14a81e12eca.npy +04401088-a3bc032d0842d570348e2c62a688b780.npy +03001627-6fd76577d0df60669b9f2eb77f5e247e.npy +03001627-8bd8c34158a3aa04f91663a74ccd2338.npy +02691156-b70b049cacaee0f210af2c858faa12b9.npy +02828884-c81cf82daa56a165271513b292108db.npy +03691459-576fbdcf1aab3887e4e65d5ecb84eef4.npy +03624134-948e15ec5f61a445f21c57f8caa5d803.npy +04530566-3c041c05395b37782c8a76ae283dd98b.npy +03467517-6422681d33a052c393b667ec2f48a310.npy +04256520-787e23d8521faa3a6b3538efbf4faad.npy +03636649-34020466b4342812218c9f1216abefd.npy +04090263-85a1d16ecd3989cd2e3059b0e19cba0b.npy +04256520-6a42a50f5f6d959ec036a40816608369.npy +03211117-300b49e25538c0ee5088116dfed138b9.npy +04379243-d4a7a1dc0f1a51986f15d61c214769af.npy +04379243-778d75fb125165379d297e74104d3ac3.npy +02691156-407135e4c3c7cf2523c853ced7da0343.npy +04379243-1600f311c31ad47fa4bec68446bb57f4.npy +04530566-b9a6e086fa26907897eb0d3a9685d3ed.npy +03761084-95bc6fb98624ea3229d75ea275a1cb4e.npy +03001627-e6ea5e70c2f29d881e8fd793667dc14f.npy +03467517-214f6a08b78670de2cb522418d5742a0.npy +04530566-b31884906c966b4fa54923b7d85aee7d.npy +04256520-5d2ff1a62e9d58baeaf288f952624966.npy +02958343-4c456e47a09ec8c96c13d41607812b45.npy +03001627-e67c305a676930b123c95a77265c8dd.npy +02924116-c4d20747c3ba3ab8d4a3ff2918680f4b.npy +02691156-5bd21df38ef89239ba4ae55719e5e195.npy +02876657-488139f06d9905d830ffab76baff35a5.npy +04256520-55432fbc7604292ed9993d66b5a0e2be.npy +03636649-8f85c2195890ccf671f0940f5ed452dc.npy +04379243-5be1589df948b227c955e5ed03ef3a2f.npy +03001627-710a0a005ba7b0cd6a6b5838ef6b356.npy +02691156-3a72adcf14ccec9965f50257ecdfa5c7.npy +02958343-bc8e978655bb60c19fec71e8f4aac226.npy +03001627-42c27211881f1377d7f7a4c4609b0913.npy +04330267-a0cc38afc62d6d102c026fed19c0d206.npy +03636649-be5b76136b37205738e43095496b061.npy +03593526-2a7c0beb84e99d6636b0f2a1430e993a.npy +03691459-e314110b72e1d310dae4b8efbd2ae014.npy +03691459-c72753b17403466c51fb196f32308d0.npy +03046257-bb0b0afc8059701076e9713f57a5fcb6.npy +02691156-b9fabfa6d5fedbc3a8e091cb544689d5.npy +02828884-2cdd25a716ab2ac12056b4bd5d870b47.npy +02808440-b657b07733051ef83c7c1f545abb6527.npy +04256520-aa7489c9c7cd0c1dc3a1be62b60323a7.npy +03001627-4fd4cda3d713bb29c8687ff9b0b4e4ac.npy +04530566-5f5490a8a7af2898b1bb46d2556ba67d.npy +02871439-9c1781c13cd9bab154b4839e5dc7b736.npy +03636649-e86e6469000a7e7deb39e694585254c6.npy +04401088-767205e25c8755fd89d59b774c6bc1b3.npy +02691156-edb916c2cdc2d3b9ce2cec85ea6ae00d.npy +04460130-acc8313c1f285a51d3a20b36eab6731d.npy +02958343-b688cde1a09ea5d3b1bb46d2556ba67d.npy +03636649-58588e4f7c57007e11bd92e9690e7fc2.npy +04090263-fee4130baaca04225516c1e9dd717741.npy +04379243-149b59e69d25ad09c3bd24f986301745.npy +03636649-2a5e2e5ec5eb986385bf3590978fc71f.npy +02958343-a9abdcbb5cddac8117e76f36a4eac3ec.npy +03001627-c7cd67d1a9def55aa192483aa282f8e5.npy +03325088-642752ced8ceeff0b362845c6edb57fc.npy +02942699-e3dc17dbde3087491a722bdf095986a4.npy +02691156-958c54f8da7a1359cea2c06142ecb1b3.npy +02828884-866b0fab7a3e54053555de1e3169ac6e.npy +03046257-d512e75fe5142f9cc23b8534bf62ba29.npy +04379243-5510ca90cc08d0c4e825832d1f6b3273.npy +03948459-c34d4ec7a3340f375e9786b1603f45c8.npy +02828884-faa74f8980fadf504777535b9098089a.npy +04379243-c8ee4a8b703180992985858e6f5832da.npy +03211117-d8a44fc1f40d0ec271d096a6914e7333.npy +02933112-a5ce16faa5ecbc4bc6a5c971c030877d.npy +04379243-cbf3470a35aff67e483fd274b1c29225.npy +04379243-63606249852d537ee958df2e8332e31c.npy +04379243-2aca16abe2e5175281faebbdea6bd9be.npy +04379243-53c11596c3fc36a8a5094cb6d104b35.npy +04379243-ed964779023b7af85f6276ff8d24e520.npy +04379243-1f7e4805b267e71f21da01c0bdc324b2.npy +02933112-7b02f0d94886f66a121859336e292a5d.npy +02958343-6d7472ea15dd5c18433f1e7c64b884cb.npy +03691459-c7b58eb662984d701df2664cb33da9b9.npy +03211117-7621d8ca26b9296b104dc10235c6ecca.npy +02828884-b57079e504413f02ad5067eac75a07f7.npy +03001627-3b5eb8c85130476a38dc42f802aebe31.npy +03593526-b8e8182813626e7a3792407aee21900f.npy +04090263-5b99c77733a74f36b74ae5e50aa93037.npy +04401088-54f1cca754751ec14857f88b08630a42.npy +03211117-786f74cbab946ef78517036a5ca6b1c7.npy +04379243-6c0fe6541769a3f6ff4f2504a49d0458.npy +02958343-ea7ce310216a5a64a1bc65068a7d3cef.npy +02871439-ed6e541f87d15abbe76bc197b3a3ffc0.npy +04401088-80d73417fa12508d7d6b888b4eb1ac9f.npy +02924116-bbff113e57da6566e99562689078395.npy +04379243-614b46cfcbe04994d91158b2b7873a40.npy +02691156-dc3bfc83bc2d1db643afdb9c81ff2967.npy +04256520-dc079a42bd90dcd9593ebeeedbff73b.npy +04401088-2f468e01f4fdcb54d81a607e3ac2f927.npy +02828884-5f0e28d1324397d9c0b027ae5b223d6.npy +04379243-65e4bde475632e5bbeedb4c8fd29e2d1.npy +04379243-9c5ed0a888a5807ca9b8d9d3b5cf54cc.npy +03467517-fa6e4f4c21032d4befe0d4e1eba2e3af.npy +02958343-dcfdb673231b64ea413908c0e169330.npy +03691459-f153783eb4ae84f2405c6851258f4dc0.npy +03001627-e51df025a8c64a483147d51c94487639.npy +04256520-25f1d50f80494d624b3c42e318f3affc.npy +04256520-a55140d6d7b1148519fb4103277a6b93.npy +04256520-2853c28f2690b0a48888e7425bc4b85.npy +02958343-5b7985f5dd37dec2c2509a0026f2a07d.npy +02828884-941c1bc0f10560a2310d80140e59b9e.npy +04401088-774bec08bd534dd28a1687774f473322.npy +04468005-5824eaab128d5e89109becaa93f86177.npy +02691156-a49a75d2b22c9eeeb87697d3904b168b.npy +03593526-b55c349c1a770df62edec63e41367782.npy +04401088-5f919ac1f790280f563028cebd5782b.npy +04379243-f65decafeb2b8518dcfcef693e7ec696.npy +03636649-53d7272eee54bad2f841233486fac2b.npy +04530566-5b6d80dac7d626baa218acf6a387078.npy +02933112-96969d7adc540bf686d53ab0fe94e911.npy +04256520-608936a307740f5df7628281ecb18112.npy +04379243-7823530be7179f50e08668a8b378b020.npy +03928116-336e206fa25555adf4e0e15368c84346.npy +02924116-d54947552a72fd70a2ffe654fbdaa117.npy +03636649-2324e8f0e334c218f7248d9dbed7a7b8.npy +03001627-341a2d3df9800314fa260f4362cac599.npy +04090263-f05e17d75e8f3e2ce378cd9d51dc5be0.npy +02958343-17f89c25a3142ee09d2b99af43da16b3.npy +04379243-2325ec6e77f29578d9b00ae2f30c0a5c.npy +04379243-1deaeff17e093d1c8029e7f07c5ed73a.npy +03636649-76db5f1046bfcd97fcb8d8c6d4df8143.npy +02828884-8d9903f1a197ea9af4fb4dee5181bee.npy +02924116-3c1395041fc842dd193d7855ecfc1bd3.npy +03001627-97febe7745f35b9183e0de42574c850a.npy +04379243-da76df9a506534fa5eee45c00c4de9d3.npy +04401088-ae0b011684a6c46c10bc2436075f6a52.npy +04379243-3d01fd2f13ece278e27790b0ec8671f7.npy +04379243-86eea3415d5a61df490ad276cd2af3a4.npy +03593526-9b9c50a911bbccb0bd16d4490a10a752.npy +04379243-2144d79a6310f1e2934cee69ace78b94.npy +03046257-184454aa3ff239ccb16cd2a45f8cec20.npy +03001627-8031478c3fe31ddcc337647acafe65f0.npy +02691156-828176e6eaee542ceb532c8487004b3c.npy +02958343-cfc8e5925bbec93de20af544ce47dd47.npy +04379243-776732bc127417f28a7219d923f4718.npy +04256520-4ad0739a957f27dcad2fb8cd0793fa9a.npy +02871439-8fe314abb1af4d23e7ef9fff09638f8e.npy +04379243-7a33f3e6c8a1cd0c9ccce4c6d5bb195f.npy +04379243-9b673972e8873bc403c57e7ce69f902.npy +03325088-6b48e8d129f22956b362845c6edb57fc.npy +03001627-f19e8da9d8f369c531e63f1270e2b445.npy +04468005-30b543e0b45fba65e810c01b1498aa2b.npy +03001627-884341d10af51df9737a00f007529fbf.npy +04256520-2ff7a54101b3a51283c1014d9ff52cf3.npy +03636649-1852cf691d561b97760c1770d1a1230.npy +03948459-da0dfb17cd9ab1459be47ac7c7e37815.npy +03337140-a23e4375e78df8d0e7ecdbe73ef4323c.npy +03636649-f0421826cd511f401592f292ab531da8.npy +04379243-1e5db720b375205315bb540f42facfa9.npy +04090263-ba49c58d6d320357f1cb19f636b1c2bd.npy +02808440-d401cc66a61e9177355e3146e6882aa4.npy +02691156-fcc94cf74fb886b7bbf3143b1cb6076a.npy +02747177-f8b6bcf0dcf240e567e4c36fcbad1d04.npy +03001627-e4ac472d21d43d3258db0ef36af1d3c5.npy +02691156-56ec4638067cfccd3dd4ea7aa5ac3a5a.npy +04256520-118a7d6a1dfbbc14300703f05f8ccc25.npy +03001627-b5350feacacdec9e1a4c9a8c5e7ae925.npy +03636649-ae37dd444b0813b8fcb8d8c6d4df8143.npy +03001627-1f82011c2303fc7babb8f41baefc4b12.npy +02933112-4a4ae602159a711c824662341ce2b233.npy +03761084-15e1055bb947747048407a54b1fbfda8.npy +04401088-ab9c56981431ec70f7b18034d9df056d.npy +03691459-e911bf2418eae6241574d21c0c95092f.npy +03467517-fecefd8313bb5bcdd86d4f3257dfa437.npy +04379243-86c467981ec229909b21a1a3552b6ab7.npy +04090263-e4289a32092b3e667f8cba909d4faac5.npy +03948459-2ea634a6b6e9323a035111f6a92f4e5.npy +04090263-6efe78a38abb45bebab70e35b0e13530.npy +03001627-fc66e46fe850a243f51f77a6d7299806.npy +03046257-57c8fe2fb023b648ae29bc118c70aa10.npy +04379243-bf29f1397cfcf056febad4f49b26ec52.npy +03691459-94ffa3ebe53ca46327eff743d2137fff.npy +04256520-f92dd3f4d0b4475514038d588fd1342f.npy +03211117-1e6d8cfd991e829ae441f5bb6f88ca61.npy +04379243-96dd123d4b16ce2afc62a892407efc0c.npy +02808440-3fad29fafe787406b362845c6edb57fc.npy +02871439-4623d2cf0aad860bed729ab50bba7ddd.npy +02808440-881043bb57784d4e3b918969f743aebf.npy +02828884-1dfcce44c2f98d2c81e7c6cfefba0d68.npy +02933112-9aedc18053d412048ca998f0f87d0c84.npy +03001627-ca804e0f760537cac4545d2091e9ba5d.npy +03046257-4e979d296586eeb880aaaa0b0a5c59dc.npy +04379243-f41ff2d573ac836dad3a17b61c0ca09a.npy +04256520-4760fede61ec9babef410cd6a99ddc.npy +03636649-fbb4a4faa8f2faedd661ff085a0f14b7.npy +03325088-eec7f9256d78d41ac5e10683f58486dc.npy +02924116-d53912686e1fb1cdb687507a46e99ba9.npy +04379243-91aa75800ef385e9f51fa0238791f5dc.npy +03001627-ea62254f0a5650579a8ef44e1d2c5b75.npy +03691459-24cb5019659114d5176545ad403d244.npy +03001627-6d5d42d1272467953b63c9ead28992f1.npy +04004475-ce2e32b26627c25a64368eb37d895c58.npy +03001627-6caccdad9f8d4f0a7f1cdfc0a8f38f2e.npy +04090263-e06992f45548f0416b34c3751bc447d.npy +03691459-cbfa6c888ffd893b31b5f9e34ff03906.npy +03001627-9a37886efaa98354317e912dcf9f9b6.npy +04090263-c8b9fc62a220f63fbd6317b3418b592e.npy +02691156-a1a419007c828bf290b1d6deb98feec6.npy +03948459-ca7ae7fa6fb11ee460956dfa3cfbfa04.npy +02924116-96aa88bc3fb67b5fcf8b2866c5b881bb.npy +03001627-30f077da43f30e64c862eec8232fff1e.npy +02958343-491df319c52dccdafb5c1b0f759e2bc1.npy +02828884-65aa814b10f778b2056b4bd5d870b47.npy +04401088-39b78390f8d5067e983a0c5c52bdbaaa.npy +03001627-b4584ca6fe22a0be599937922ec198cc.npy +04256520-57f383c1eba6bdbbbb07e1e44f4c30aa.npy +03642806-dda1832a36858f06ea791b47ef8b531a.npy +04379243-98440aaa709af51192d5b25c536d8044.npy +02818832-21f11dd1eda2b1dcf51f77a6d7299806.npy +04379243-b130260b9f5d05bb5510d59f3ab1ed64.npy +02691156-8daba5f5c906b3b331fec775e1dce6b3.npy +03001627-61fb89fca404e37f598bcf8ac674b63d.npy +02958343-b4a0711a46f9e2bdba3e2415e22cd45c.npy +04256520-447281db87623862413102507b68bcb5.npy +04379243-238a974ab3fd46e0ba7b07dcdf3d00b4.npy +02808440-6787698a1fbd9a6d44221bef0fa3c36b.npy +02691156-4b20c1736440ff9d90dd6eb126f6cbbb.npy +03211117-66a71f2cb778aa726321867cfa9ee57c.npy +03642806-cbcb79f534518dfbcfe78be5b7b99c8d.npy +03642806-13330d1e7b199dd82530b9c2b65d3f86.npy +04256520-1dcb4a52dbd349ceb9b8611336bc3051.npy +02828884-f0df158b0694ee1f2056b4bd5d870b47.npy +04530566-f31b394d652f0bd0592f00ecf480857e.npy +04256520-7d04346070eb5b9d19ea2628fa9897e5.npy +02808440-d2a511578a387365ede9471c962dd6ba.npy +02958343-ea76015145946dffc0896a3cd08800fe.npy +04004475-b9a71c2cefd6da6ade43eb83c675552b.npy +02828884-f5d370e9fe5b7452dbbc9440457e303e.npy +04090263-7ee51d04734c82198ca4596df3cbf136.npy +03636649-d3a3d52234e722825208aab875b932bc.npy +04256520-f2edaaa8bef11dedbac8a2db6cabda6a.npy +02933112-7359539c1b62cf1e29a50a2b3c5e5b6.npy +03928116-4935addf7de12539c273f5d1e0123211.npy +03691459-5adc7f63a154a43be9bb042b8623f922.npy +04090263-faaa98e92d722d0ba7dd22c0aa3913f0.npy +03001627-31d026a65b64c4d5f529761e946287b2.npy +02958343-6acb271397e6f9b9e858db1dc3499392.npy +04530566-e3923f2d2fc2d1d39263b5578aef09fa.npy +04090263-404acdd4cbb0544eeab5ee569c9de1b1.npy +02828884-276195bc09970fdbec0de4d645145eaf.npy +04379243-f36f3912a86717146b82340329d7ca26.npy +03691459-995ad1befadce7771148996e35417db6.npy +03001627-4918512f624696278b424343280aeccb.npy +03636649-85dfdbe562059fa058b65cbe3be2c45c.npy +04530566-eaaeb5f4195eb55c1cec93449f0f44dc.npy +04090263-f71fd8ebea347bfa3ed1dc72750c6f75.npy +03691459-635db4f2e3fe1f918e14a32e5ed95bbe.npy +03207941-d08a36f582d2acb5b425b904f1063e75.npy +03325088-14cbcca59f500f5835efe6970c23032d.npy +03691459-196d5295dc5c62d513bedd75622dc40a.npy +02691156-96a69c2add6d55379a6e43b878d5b335.npy +03001627-3b606ca14c5f968319fb4103277a6b93.npy +02691156-8259a1fdcb9bca7526360e1e29a956c7.npy +03636649-ffc3e351b9ae77b0d42b9650f19dd425.npy +04530566-2c7a846828d3584f2e332a83fed6fe76.npy +02958343-b9e20b751d869418ce2714c5fa8be19d.npy +02808440-15c43d52c1c50d373321831d2245cf06.npy +03467517-7e49ef6e1b1dbc8dfe96ea0860283ff8.npy +03691459-6592d33f84263ef435cd53a06b1d2317.npy +02691156-aaefbfb4765df684cf9f662004cc77d8.npy +03991062-25a032e5624789da843bb865a04c01a.npy +04379243-3ba61eb411ec52c41586e0414b03ff10.npy +03337140-f5c863ccfd78cc6591c352d02061b3f7.npy +03325088-372e27ec3af50a91b362845c6edb57fc.npy +02828884-a8c8aca72463418581faebbdea6bd9be.npy +04379243-e9faaa484cb11948cc89f898f3cf6588.npy +02691156-22eb91041de27ca4936b2c59e7c43ba.npy +03001627-634524d6d74142ecd2b12aa6a0f050b3.npy +03636649-af93ccabac8d1aa9f4482a3d4ebf4782.npy +04090263-a52c4c07d951fcbc3068951f59ff267e.npy +04330267-af07fd43dde94e02bba2a247817a4593.npy +02691156-9a8aecab136ce50db7ef47444625afb2.npy +03513137-3497a6217d54da094dd343ea1de55435.npy +04256520-d5a11602655790bcdf6cfab91d65bb91.npy +02691156-5d5aefde5935fc9eaa5d0ddd6a2781ea.npy +02808440-ec1d737b5962bd306e12d65bc1882e95.npy +04401088-b7ebfa514d14036e2da685d55be1eb.npy +03211117-1063cfe209bdaeb340ff33d80c1d7d1e.npy +04379243-a69b27f76baf9f75d612e9885a7318aa.npy +04379243-a133b092d24da436e7d9f0fed41b005f.npy +02992529-73339a7ed1e72d89aef10502d58d4967.npy +02992529-4e8cb66f915fb5ac5fdc2445fe061736.npy +04256520-4146baad4a04882613f96345312df593.npy +04379243-760d38c2740eddfb8b38796afe7ee552.npy +04379243-6cae7a045734cfcecf03af5e7a1277b.npy +02958343-9fa56c19e4d54cca99c8d14f483ffc82.npy +04401088-ba669a9b03186ee8108c9111b239151.npy +04401088-29cf2bce2e67ae76264e721f309fb873.npy +04379243-615417f66fc542c6f51f77a6d7299806.npy +02992529-774bec08bd534dd28a1687774f473322.npy +03691459-17ba9b90304be1b4ebe67d9b32c3ddf8.npy +02871439-fef03ca588a2b475a7bde56da6d9a270.npy +02933112-42c3c76c8c8912c61b17743c18fb63dc.npy +04379243-59cd90e24a68f3f5f1783a44a88d6274.npy +04379243-29531549b0a6a0f5ed403132b02528bd.npy +03001627-1803116582841b39a8ecfcf20e8cc0a.npy +02691156-58fe58e9f7431a1a428659c2b5124968.npy +03046257-422505904f773dddb441e189e5a85c02.npy +03337140-afaa6975c6000ecc4c3aee8e9d3a6ffa.npy +03001627-375aab9251b2df59b7a68845946bb67f.npy +03636649-367773a008b63a2c5208aab875b932bc.npy +04468005-277c840eeb343b7d85b408a8edc983b.npy +02808440-6e0d5ac416c002d13321831d2245cf06.npy +03001627-99996ded94b8bf974cddca4ca9fe5080.npy +03001627-a1adf14b24469f8835acfdef2ece21c0.npy +03001627-e50825b2477ba5a0dcc52ca811e565.npy +04530566-340a4a4420b4d9c0406483a4cd65b281.npy +02958343-12d7c4013415ea147f5b0cb87a91de52.npy +02808440-52f17cc850b55edd54d7082b34825ef0.npy +04004475-e00f543043e36ba2199f2eca998ded6d.npy +03001627-5aea2a227125a81bccda8d28b44378b7.npy +02958343-c4744d66623e04b7518f93fcf50bd8df.npy +02691156-c2e38200a238177ebbf3143b1cb6076a.npy +02992529-2293983c6f234d94e304974abc9afad9.npy +03211117-d32688a505930c96e2c8e43c97ec5a85.npy +02933112-2e6c2878b005b5c8bd7feb85baf9225b.npy +03642806-6fd01f7db45bff66cf01bc59d215f0.npy +04379243-455df1ea3058c48e33c1aef7ee7c6797.npy +04256520-d0bdb5de2ae0de1adfa4ff010b8b9d1c.npy +04530566-cc3957e0605cd684bb48c7922d71f3d0.npy +04256520-6f08148e6be15ec812ad7c55c944504a.npy +04379243-539d207a10c615fe76bc197b3a3ffc0.npy +03211117-61a9c9dd90089425769ba004c0947e77.npy +04090263-c7e59e374c2cbb7ed33646b0990bb4a.npy +02808440-e814a58e52652f43e702e0688ba77bb0.npy +02992529-2601fb1cdef9d37223d5a55215ee8f43.npy +03636649-89ad10075443cc8ece868a9ece283694.npy +03001627-ed9a4172130d3d5baf1a85b857ec9afc.npy +03790512-5a997a42abaf1a0d52ee90e577613070.npy +04379243-7a0ec4445356a79410643b0cbd7095e7.npy +03001627-2641f174d2d240ea788a5c6586b10c59.npy +04256520-a84ff0a6802b0661f345fb470303964a.npy +03636649-9c2a936a664a59823c10371ef1aaa57c.npy +04379243-c26d26e409d01e8420d2507f5cf72c4c.npy +03636649-3fb06dd95ac94436f51f77a6d7299806.npy +04401088-436d7a114f72dc03d4713685ae50fa13.npy +04379243-4b82103c9ee9ae4f98e0d1738edd4f19.npy +03211117-21d627f21efd9298c9b80153270af5ed.npy +04530566-215e4b59683247378a3e8bd3a4e48433.npy +04530566-a4d1ec9841281a3cd1e97c10e2464c2d.npy +02933112-a01619556405ba3f2633ff66beb9cf31.npy +02691156-19604020a86ab1790b1d6deb98feec6.npy +04379243-e83930a4a62413e1187ef2b10c31bd17.npy +04256520-c49d9fb6c8b32b265beaf00da5b709c2.npy +02808440-24bbfd544bd0db74ba2cb2a05654d738.npy +03624134-6070b6817869c14ff02ee453ff283e26.npy +02958343-45953aa831508fb51e0d92ae9d1b10cb.npy +02691156-9e8ab1862683399f570726399d67ccc3.npy +04379243-4ceba450382724f7861fea89ab9e083a.npy +02992529-a0efaa2ba04bf091adbfb30d8d1b297e.npy +02933112-4b2bedb7014636afd38913e96bbf2a5d.npy +04379243-7fd8601b0b0a01c9beedb4c8fd29e2d1.npy +04256520-c304687f0778986c6f1e631ee7d027b9.npy +03001627-658c983e6982f6a43b48a711df82173e.npy +03211117-2ba6e0c4ea459f84f5f79806bd65844f.npy +03624134-94f20e34be2d0a6dc728559272e2d712.npy +04379243-4d6b0bcf351183bef8c4b4cfc2702232.npy +04256520-9808424960998ae93d4d11ac89066d36.npy +02958343-149978eefad83cbafd8e7b05498794b9.npy +02691156-9a4bd6fa35e2e59689437db5f9b0a8a1.npy +02828884-348c52c333d7a7953722bf980385c3c3.npy +03636649-4a868756ae6404a5c0bc57897eddf6f.npy +04379243-ff9bb9597cac5ef17a50afc9c93f8a50.npy +03211117-d10dcdae2d7645ebcfe78be5b7b99c8d.npy +04401088-f2245c0ff356a85dda10b9c82531bbc2.npy +04379243-cea242a600c342fd33891f25755e1e1c.npy +04090263-b01199433137d6123547ed4d05d19f04.npy +02691156-a53846c68d0df55fbaa5dc5e42189b81.npy +04379243-f4f000158796b9593002ed4dcf002f44.npy +03001627-fbd234dca7bb201c1bfa4cc8d66175d1.npy +04090263-ca25a955adaa031812b38b1d99376c0b.npy +04256520-de1fc3a00a11e87af62af8489541547b.npy +04330267-87530f4483e4f4a0b8183a4a81361b94.npy +03211117-ffc224f284b63b17b0f6d70666df2668.npy +04379243-47aa3e340eb5be093fccb8cf9f00542f.npy +03624134-f5abb706dd1c1e931fc43d5b32fa230f.npy +04379243-532a4a4b8ce7b6feb9ac39a10cc48e08.npy +04379243-db6561b883e56b9072c6d81e4b9f21e4.npy +03001627-2a05ae00b701fda36567137a59cb1a56.npy +04379243-e9fd9958920adc279943cffe175cad01.npy +04379243-8e424220b8f053c81ee2805756841071.npy +02691156-ad85ce4dde9fde14a13757cba42c461a.npy +02808440-31d9bb666cd262004f535519233c8e8f.npy +04530566-eb90fdddcb1f25fca60ce6f0a0028c13.npy +04379243-1b84ce3667a99f1d30bbd4cddd04c77b.npy +04379243-e64876f5590e6fb7c3bd24f986301745.npy +02958343-da73c98813b82014d94cee2a22cdfdd2.npy +02843684-ed8eecb25a61ce8ec30aa7d959330a5f.npy +02828884-137fdd05ae4e69c7a68359455a0ffe24.npy +04379243-2783c8d705a1a146668ae11a7db5e82a.npy +02958343-be28d4b681ab04ecca92a4cdad802b45.npy +04401088-c0969979d6ff51f3db27d84853613218.npy +04379243-7cd2c11133d7470db9278b13f52df097.npy +02924116-ca75cad248b081a52470de2774d6099.npy +04256520-13169bd2b9b02ad44089c2a25bbcbf23.npy +02691156-2bfd3dc8b0630de9e1873a3963e0d14.npy +04379243-a186ef9f36fb95c3bd24f986301745.npy +04090263-fb62c74f88a285a712b38b1d99376c0b.npy +04074963-28f2a5df4a926c3e140a527375fd6757.npy +02691156-5a1d4af1f417d28566cf1b4a8fc3914e.npy +03001627-c76b2d2e9b7cc59e82eddefc99ebacfd.npy +03046257-39be4ef0dfa6833e49c9c494c2fb14ce.npy +02691156-d05cdbdddb68865d2dcd3faa5a0a5f24.npy +02958343-785cb635a01fb7ab2a9eb0f146e94477.npy +02871439-5dca62207dfe3e0e1adca12ed8c544ac.npy +02958343-b0a659083ec6e936ca92a4cdad802b45.npy +04256520-5cfec53fca53be4cc9fce74028b97ec9.npy +03211117-339950e98c5d943a20685b5a7e34b501.npy +03624134-198a109dc6c19ba4c09190536c002dc.npy +02747177-c0686f7b0da06f36cb2a965e75be701c.npy +02933112-98d2b95fc4f59c426ba8b3973e201d74.npy +02933112-7aca460dbd4ef77712de5317fe5b354f.npy +04401088-b35c2da756f8df5aa0eb5a85db887292.npy +03337140-3259ed5798f633c8784168ad9d1dbd5b.npy +04090263-b20e2aa33c1a54fba791c4f82c7b99c6.npy +02871439-ee00bd67de87106cda268e3f4aab0907.npy +04401088-f9418c13ca82fb887f75fa9740df3aa6.npy +03928116-e83cec9fb3e0d81d82c5b9bdae127001.npy +03001627-47b37ce8f304dd0bbababe11fcea8796.npy +03001627-1ace72a88565df8e56bd8571ad86331a.npy +04379243-6176df18ef54e0a3f12d7184a2ad3430.npy +03593526-353015291fdbc5589de5525299ba58f.npy +02808440-bdacdeb89e174d743321831d2245cf06.npy +03691459-adab0912bc0ad1271ad88f716ea80910.npy +03001627-9fd3f3034d3e867336587f5b4db3e782.npy +04379243-aa03428d48a820697a138f06ba3ebae3.npy +02958343-65e3e2893669a09cc7b48e36e31209b9.npy +04090263-479adb86f868044b82771a19d76c960b.npy +04256520-c4d472c94921bfc63a36ba9606d732a1.npy +03001627-e1f6a4f5c856ac07bf80985a99195eb8.npy +03636649-75e788db909c6e07bd4160ae8a5798e4.npy +04401088-2bb42eb0676116d41580700c4211a379.npy +04530566-22a66588db3822831d20b5ad5ef1cb1b.npy +03001627-82d8391c62e197161282d4d9178caa92.npy +04256520-2b9612dac350a3d6764a784715fb668.npy +04468005-43ef3b9a4b46aed5e17c2efe05365fd.npy +02992529-e6f4ceda4907fcc13c47272ccf8f316c.npy +02691156-2997fa1441eb7bb735fc197bbabcd5bd.npy +02871439-abe70fd61bf0b6e0504af6e1321617aa.npy +03593526-41dc952ae902bb2d2a087337e55e3e2e.npy +04379243-de24c1b05f0ee7dc58674871bd9b2e6a.npy +03001627-cebe4dbc363265ce46746f657ed598.npy +03467517-280e5926a81270463e148e250c0340d.npy +04379243-589d2e18f9b85e4715dd7d7985e749c1.npy +02808440-ace556a5c45fcccc1c17aef130ed6213.npy +02691156-ca91bc0603ac0b808303d346f4be7d4f.npy +03001627-dfdb73c6bb358fec18c4d7ee5b83ed4.npy +02828884-f123b8da77f6d17e50f9fc0e2c94dd76.npy +02691156-d532217c7fabf1d44e8b48a4c01e36f8.npy +03761084-753c4428f12b2233b5d3c5ea5d496caa.npy +04379243-a757f06addc26f314b3c42e318f3affc.npy +03797390-ca198dc3f7dc0cacec6338171298c66b.npy +02828884-8f102661c3efbdd184f92715bac39b74.npy +02691156-f80343ac3064e74862347b4731688b0f.npy +02691156-4a9d3df03a7d41d77209009cfb89d4bd.npy +03642806-818a8f85eb37248f7e51366b0cf7747.npy +02808440-b65f30d853b7cc96f86926db87a5c419.npy +02958343-b61f6554d83c50684fa22c482c32995d.npy +04256520-b4c1dafcdd5cfe67d070a4f9796238.npy +04099429-f77daf9340eb6faa262f035db428cc4b.npy +02924116-f0947e7dbdd0c5f1a70590fff7a7d815.npy +03001627-5695fd37d1e673cebf964fc57f6a7d6d.npy +03001627-85f4e9037425401a191c3762b497eca9.npy +02691156-db4e26b10e48f0202eb17a4a1756af76.npy +04090263-277fd403270ca32b72e5d9d5746d6da7.npy +03636649-540335c2788125cbc9dd845c88786daa.npy +04379243-91dbfe4dac593d3e35836c728d324152.npy +04379243-5808fa88b17592217caed426d97afe76.npy +03001627-d18f361e22f7626b707cdefe012d0353.npy +04379243-ccf0059e0697982ecaa22a10624245b6.npy +04379243-10c25bdfea5eccfd153555abe935e806.npy +04256520-95829021770f25fe15afaa91253fa857.npy +04379243-7df9115b511668bdde98d10ab5975b59.npy +02933112-86905b35aca5a3f11f8d8332ee17945a.npy +02933112-3b577e2c7bbb8ca4c59350d819542ec7.npy +03642806-2f9cc3e20647ebb1cb8118818e564f96.npy +03001627-47db22433821989e35910b9c436db932.npy +04379243-7a1e70d3b087970a23fe3501bb9e7193.npy +03001627-a8da22b87a249bc9c9bfaa062f2e9d4c.npy +02992529-f760cdb0f8cbc6fa3c28e819722231b4.npy +02924116-e8a03353afa0253c15a7b5ba389301f1.npy +04379243-f81301719860a0e14626b1c05b10e40e.npy +04379243-cf046edeff204b81cdf7280ff8af6720.npy +02691156-58e967e02a183d49bc0909d98a1ff2b4.npy +04379243-2fcc875b28c5557dcfcef693e7ec696.npy +03513137-7f03445e003b692f3fd0acbaa54efdfa.npy +02828884-ca238683133f6a7f38f6614f37ed2984.npy +03790512-8fd0238d882c6f45e3e8453287c65951.npy +02818832-df4d5db0d81fd245c8b7b6fe706a520.npy +03211117-5757f2fe8b1b4b559ee60daa6185f65.npy +02691156-45a4b43dc4c77dea6818e4a1f2613507.npy +02880940-5f2ef71aa9b94edbb84959963148f2a2.npy +02876657-aec6aa917d61d1faebe67d9b32c3ddf8.npy +03624134-b16961b5dc1404d4df0719d707e5d64e.npy +04379243-520b83f501329fa955f46d55537192b6.npy +02933112-a2dcaeb9f64566672027cee422df2aa3.npy +02958343-bb5264bf7306327abecf71e2e014ff6f.npy +02801938-80765e61d1305e5936b0f2a1430e993a.npy +02691156-990431d8a1ef435bbc913a3935f0ae10.npy +04530566-1f883bf1bf0f6bc7a993db466b6d73d3.npy +04256520-aee5c13c32775f24b1e5b4bb39b2ab9f.npy +03636649-f6eeb5d67c32616648fda83c10428379.npy +03467517-e0d7fbacf037855393f0194265a9746c.npy +04379243-7d22cd72bf2762b19a4b266ed4d507c9.npy +02924116-73eb995e9b1fd1377cd3cf23748abfc7.npy +03636649-66cf69a98ff895e2b55fde51a411949f.npy +04099429-9f71204ece40e327c4c8e4ace0fc3aa7.npy +04379243-442546c2af24d782d197f67767b32741.npy +03691459-f1cab229b68c9ac1c4dc2c94f81faffa.npy +03211117-9b66be71bb69a85b3e6db88fd9485c19.npy +03211117-9852ad45bb14a66fce2fdea99c5936e8.npy +03636649-639c2bfefe1bb6af1cce8c25b11ccdd9.npy +02924116-ab13c9869343bd8cdde6e3a892dcc1a0.npy +04401088-320d0f9256ab9cc3a046bbac53886364.npy +04401088-7114283643761bb4a5545c1d5c84020a.npy +02933112-253c1fd3743c47234da5feafe6f1c8fc.npy +03001627-e4cc5cee7b011df316037b4c09d66880.npy +02933112-c700103d0294eb186c66754c2bdaefab.npy +04530566-c8bce97e59665f2811b9a587ace886f7.npy +04379243-c1dcefb2613afebfebe4b9fb2707d260.npy +04379243-4b21a06b433b563f450195dfcfefd1b9.npy +04256520-9ecd7b01b9be890d19fb4103277a6b93.npy +03001627-a7579c588d289fee4671d97b0fd17f51.npy +03001627-5ce98a1c247f0a2d623ddc7262bf3bc6.npy +02933112-4068c751d46ca222de650492e45fb14f.npy +04379243-33f9152bf617f22a16a2b5862518c93.npy +04401088-14726c2482a092d3a9fe1734a6086750.npy +02958343-abd0aa2e0ca4fc4793249f89773e858.npy +02691156-d25572a7c7bd40a72d716a8ba99beff8.npy +04090263-502bcd962340e12838bd5e76f1ee812b.npy +04379243-9cf9313fcb038801815b2b467e8e2eac.npy +02691156-a28b92f0ed237d6d13256b8319a93100.npy +02933112-a6d90c5628a598a1598a453fd9fbd988.npy +02691156-6fc4f30540b2fa9dbc0909d98a1ff2b4.npy +04379243-53e8fff5ddea1b47d44dc16af152638.npy +02818832-94855c7a018d53e3dbfdb9be425ff2e5.npy +04530566-8d7c4ca5e08a8a3a6d4334e260ec617d.npy +02933112-6e2beb63c61144f54da5feafe6f1c8fc.npy +04379243-1a00aa6b75362cc5b324368d54a7416f.npy +04379243-3779ef1608ed12dae074517a246f1e65.npy +02691156-bad95673c40e3bbd66cf1b4a8fc3914e.npy +04401088-b7ab1b6f7dc5026dea8f4709e6949c8.npy +03991062-2ac8e00463d247119201f2703b45dd7.npy +03001627-11f1511799d033ff7962150cab9888d6.npy +04379243-2d11e38388d212634cafc8d32c041834.npy +04256520-db49cbcb6a2ac87657b1c0b6d5084bcf.npy +04401088-16c6403551e81a3eeedfca8b846d3b01.npy +02747177-24884ef01e9a3832d2b12aa6a0f050b3.npy +02958343-f723dd6b7a95e230c75bcb366ed55ad8.npy +03991062-106676e68e8031e51085ede6a3c1fc8b.npy +03593526-8354259c3fcf12fa31f42a72ddeda489.npy +02691156-541db123c3ae32cda91f7285bb2efb4d.npy +02691156-707da8b9f37fd990bde4f466a45d975a.npy +04460130-8074bede148f1cbf8a982597ea241696.npy +03001627-9d2cf09ddd9a05fa1f8b303c0da5108d.npy +04379243-d8baf8507ff705dc2787b53b27e2d44e.npy +04090263-b548a4e02e014405de423072102e0bc5.npy +02871439-edab7fdfbcef3ef2f77e23ececdab4d8.npy +04379243-9b18c8de0d9d2882166ddaef2c2c61ae.npy +03001627-b1c221e3ec7fe34782b50ea5cffa80bd.npy +02691156-9d7e431ebd35cdc2bd46d022fd7d80aa.npy +02691156-cf402c23d4ce807d847335355bf4459e.npy +04379243-1cb5ed66917df7b3615b3e12f53b391d.npy +02933112-9140ef4099eadf73887c1a82cf8c6eea.npy +04379243-589e7c32a63816b1d4a147733422d301.npy +03325088-ec1c146241042d2c25faa413356e0316.npy +04379243-7988dedacce42552ab610b0c94236463.npy +03001627-9d7d7607e1ba099bd98e59dfd5823115.npy +04401088-25152b4f593e5c0555940ab8fd747fc0.npy +04379243-4fdb53755e578678cd7f32327bdc729f.npy +04530566-6d71354936e0e1e8c362d63d34a4d0a.npy +03001627-78c9204b2eac432b65b77a565916c7f.npy +02958343-3344ba7f18d9623d549733b112275285.npy +02958343-39957ba700c2461d6b6786771012aae1.npy +02933112-165c00d292773865ae6eaa32356aaf3b.npy +04090263-15cc5a007bb325a3405d5eab6bdcff6f.npy +03938244-2fe82cff107cbeaeb357233991a61d01.npy +04090263-2ce39c653c42982948b7bcada24e2926.npy +04379243-f46d7f7da9a056d7fff16555386d173d.npy +03691459-ff383dd89f76410a49c18a2c5bf89a47.npy +04379243-8c81742da70c5abba7574b4673f4d777.npy +04379243-af0206602e75c8bbdc6a693174c70feb.npy +04379243-798598965a343fc9b0957d845ac33749.npy +02958343-6b44be4025c966d4672601793664460d.npy +03211117-3813c5f6f50bb28a3e2061cce7606c61.npy +04256520-4b9c06e04d329213843ead12644a79bb.npy +03325088-393fa5f93b539b1914b35a7d7cea7130.npy +04379243-54a22269051c9674cfdf2d08e1ba2a48.npy +02880940-2c1df84ec01cea4e525b133235812833.npy +03001627-ce12614d019f86e840ef1c8b63a628f9.npy +03001627-c375f006c3384e83c71d7f4874a478cb.npy +02924116-2bde632f14fa5a8377940b0d988b91df.npy +02958343-2fc99d3fe3f1f3b3b5e3401710af905a.npy +03261776-719b4249339e7eb4c030d1f2c16e4c51.npy +03001627-103b75dfd146976563ed57e35c972b4b.npy +04530566-85ca7456e200e8cb874f0e42f84eb4f5.npy +04379243-98583f22ba708ddb4b3c42e318f3affc.npy +03337140-6125e3064e7324f8e4e346ee2650d150.npy +04379243-e3e1d9e88b396e6b8cae28243a4ae130.npy +04468005-887636e0984bcc7984ff53e2628fd6d0.npy +04379243-ffb5e48fde2cca54518bdb78540c51ed.npy +04256520-6e97f3391a8de74bc862eec8232fff1e.npy +03928116-89e4214536b63bb13fbcdcb4c54d4ba8.npy +03001627-bbe63bca5688ac6b7236a8143b10600f.npy +03691459-f657a906298e9151e3178ebc750d175.npy +02992529-17072ff9ec47bfadc3fd2392bc923b2f.npy +03001627-fd5f6ed4a873c5ec300fe8666348bd38.npy +04530566-d4ffdf377bda1aa5f650f4803ec7962d.npy +03001627-f4b141ab64a6c4e771a782a4379556c7.npy +03001627-18f57a3d41117140ed98cca8f0ccd5f7.npy +04090263-ff6e6c1fd1069b92116f3b4758e85d85.npy +04468005-97ef43be022c84d334a4f565076f7529.npy +03691459-65dfccb2d5e47538a24143eec482cd09.npy +03467517-defcf80fcef4b51b3f431ca2c1260d62.npy +02924116-8114866e788441652b4948f27a5833ba.npy +02933112-a46d947577ecb54a6bdcd672c2b17215.npy +02933112-90e6262b1713ab09fa3b6936d7879478.npy +03001627-c5e3f6da9e818851618dd45f797b66b4.npy +03001627-db0925930500d67d7094f114e4783e96.npy +04401088-2e6c1cc7d262bc36c1d28dd38097a536.npy +03211117-b72579335543691423c841f9d5051936.npy +02933112-a81a218a06fa2cbabc78261b35f7ff55.npy +03797390-ec846432f3ebedf0a6f32a8797e3b9e9.npy +03325088-ec3a09d4e06843823321831d2245cf06.npy +04004475-d12512c99c7836c0aa4b3fb09d44650d.npy +04090263-d0d4e25322d8fd3a1f58b8bbfc791148.npy +02880940-eff9864bfb9920b521374fbf1ea544c.npy +02691156-94843fffd7d2a8c0dfb86dddee1d6ac3.npy +04401088-3993102ecafa0826ffd1164158ab2e9f.npy +04256520-853707d42be3a24c3eb520ff7cd241f0.npy +02924116-43195339c363c8f1cfcd1fbe1cf0ecec.npy +04256520-9955ce757c0bfaa5843ead12644a79bb.npy +04379243-55c2262e68f311fea5526f91aecc0c37.npy +03642806-1b5ec8c5ca53caa5ad6be7ca8dcfc55b.npy +02933112-18a1c4eb2e4b31fce83221ad0d21775.npy +04379243-f85e243539823dd56fa63795f94c4d8c.npy +03001627-2975a651cf06a21260902b587804b688.npy +04379243-15c32aa0f0dcad130bbd4cddd04c77b.npy +02808440-2e61279ce7db97ab3321831d2245cf06.npy +03790512-57a7a9e163e8f087fe11eeaa72c8aa36.npy +02808440-55f7cefd2fd58bd4f4dbd7b2c34ea2f0.npy +03001627-9dad5d3a04753f69febad4f49b26ec52.npy +03325088-1de8f72e190d7ef1979c556124bee033.npy +03928116-3fb81f5f3a3f0d69be3ca6e34dba44de.npy +03467517-dd95faf803299254d57700c05b1862d8.npy +02958343-2b5a333c1a5aede3b5449ea1678de914.npy +03636649-a26a9f9ddb5f345fcb8d8c6d4df8143.npy +02958343-58f2baf01b8a3baf24da76692f3228e0.npy +03001627-ce50c6235cf3ad8855afe589a9f09982.npy +02876657-80a3b56c86f906e5f913a7c27a7e15b9.npy +02818832-8ce474b9f38b5e11130fdafa1dfb8326.npy +03624134-5e15d63317014f30ceea8802f71596b5.npy +02691156-d75ce9ee8a64adfd98459325335edae9.npy +04090263-e4540723eab9ff0bef0c52e20895a77d.npy +03001627-23299a939a6ecacda5817f81a1efa3cc.npy +02818832-6e4707cac21b09f0531c83488903771b.npy +04090263-e998d23c1e691a33a0d2eb90fc1468af.npy +03636649-2f216bc398d3da98cddf96969ede3013.npy +03001627-3f04adffb69b5ebee95cd0dc8c2f0e83.npy +04379243-cf7c2cfb403f2819548cdb167cc8bdd.npy +03691459-6b621f006878b74f2a9eb0f146e94477.npy +02958343-666beb2570f33c64f64801ad2940cdd5.npy +03211117-8fb07bba1524168f7f6853a06fdb3f45.npy +04090263-f92b4caff4bc0f6d9352b002a7d38daa.npy +02691156-787d2fbb247c04266818a2bd5aa39c80.npy +02691156-f592e88114a240cc61a8d3163a0a75a7.npy +04256520-b216efa7925318b1e466d83a76d6230b.npy +03001627-faca91ff3f9e2b93a87dbaf229daf408.npy +03001627-d00a7550cf050fb3720daf9b94e7a5a.npy +02958343-8df9feeed8678aa6bdc56c6b6d74b51a.npy +03991062-a641529c7e3cea2293df73cd41b59aef.npy +02828884-d7eec9ea272f5fc9cb2a965e75be701c.npy +02992529-447cb44311eb5dda57e80f5278d5b50.npy +02958343-a3e7603c0d9ef56280e74058ee862f05.npy +03001627-c790496caf5f2904f14c803eab703899.npy +03636649-b2116d5a9b93a0704f377bc8602186f5.npy +02958343-d86119f06459e996897844133a297d65.npy +02871439-f4143a20243d832152e2d18963a75b4d.npy +02801938-a0e69e333f8aceaa24ad83a2d67317f.npy +04256520-cd47287d6da7492e64810cc21086da42.npy +04256520-4fd35417e08ffd8597e11b0362ef2f51.npy +04401088-383a304edf67f757769dec5ec0157054.npy +02946921-fd73199d9e01927fffc14964b2380c14.npy +04379243-be7a1bb508905459f51f77a6d7299806.npy +04256520-511168d4461d169991a3d45e8887248a.npy +02958343-e9ae93e6ddd5bc1e6047f64eee8fcb68.npy +03001627-ca764efc4e76a8b48d69616377752ecc.npy +04379243-3144ba0c286cc61f490ad276cd2af3a4.npy +02924116-c54d49c3e1d9c53f1a1d4468b3f01868.npy +04379243-8569c03c2a233f7b4b3c42e318f3affc.npy +03636649-eb8466da51199e0ecc4c445068949125.npy +03001627-7ee46c6f7c028fc6d661ff085a0f14b7.npy +02691156-697b269a890237fe15796a932d10290d.npy +02933112-2f2e54607ea04be4c93bb8ae72b9da71.npy +03467517-bf7026f9814230414269db3f92b7aa5e.npy +04379243-1480684381add1e7fff16555386d173d.npy +02828884-a2ee6b6eb6f94856c35213a917b76486.npy +03046257-8fcb8178010667392f84cb7932f866fd.npy +02818832-ed40b57386714d23940d5ff3114b57.npy +04379243-59a2490719d49a25aaf15b62af6b513f.npy +03001627-ef66111933d5cb32e46ed8e42660ff49.npy +03001627-6ddb87a44f7f68b89c0ca344f487323e.npy +04379243-734271cab27abd133d0f9f8a61342808.npy +04379243-60fe09a5de2a484f45613f5c2df1029a.npy +04379243-1de679dd26d8c69cae44c65a6d0f0732.npy +02808440-3db95e318c29a2ccb362845c6edb57fc.npy +02958343-c6038e4cf08de1a7c805dfe4ca9f2fdb.npy +04379243-1c20d8cce30ded086ee08f750473a436.npy +03001627-9f7dd8cb949fb0971f6138b700829a47.npy +03001627-614347b0e864cdc7492d9da2668ec34c.npy +03642806-4d3dde22f529195bc887d5d9a11f3155.npy +04379243-7b504e7d89d9e8d822a33e080d0e71c.npy +02828884-ab131feec69007a42250bf58700b4d8f.npy +03211117-2f12da0c7460b22cd3ab2bc0f53ca878.npy +02871439-c9a603de83e6914199e8bf807e902261.npy +03001627-c1a0882e6e8f8b082b722fc42ccb4c6a.npy +03001627-5bfb8edf221c7b0e84edfe802bb43dcd.npy +03001627-1033ee86cc8bac4390962e4fb7072b86.npy +04379243-672af8a6cb34e00678a875f897a47818.npy +04468005-22880ed187b2c5ec95f2655a7e810da.npy +02808440-c3524cfa04be2a427568fd1ca5bc0200.npy +03001627-bacdce8bc1974ff82c528d33bca1ac2.npy +03001627-989c95491d7e823fa413908c0e169330.npy +04379243-5c938860481a2d0f62ba00e4e73bbc2.npy +02992529-af983238a3e47692f90d7ee51bc3530a.npy +03211117-cccbf9be5d578b49bfba6cd89592cf9e.npy +02958343-4a8aaa19c413328d2557e2b5350c7e1f.npy +02828884-913cb50bf5d336238b0239afbed4a626.npy +03001627-ca05bd1afb0ffeaf6b9a484dedfb7d25.npy +02691156-65511fdb2afad900203936772104a82d.npy +04090263-1ab4e79889c1288995f22290198b089.npy +04090263-f7ce17ee88cdec33973c46c285b944d7.npy +04090263-7faeeb69a870d18a2850d4a1a9c25bca.npy +02691156-823de294a08784fc879e4d613e8d4e33.npy +03624134-19dff8164764e2a259f37b6e82c5e93.npy +04379243-bb027ed892722b1f3399de188dc5ee56.npy +03001627-c0d25cd4481b3c2a365f491f6e3dbc3f.npy +04379243-54db32cdda20128ffff16555386d173d.npy +04379243-7a6cf20a719c16cde8258fa1af480210.npy +02691156-a3c1b9b0c75af9a65cbd1a70b5b90a8.npy +04379243-dace4e7f0ec285abcaa22a10624245b6.npy +03513137-6f41517d1eec863b52fafb0cab311e6a.npy +02992529-53cd656555da181db6d41c42f7ade8c8.npy +03001627-98d37b373c0207915dca6305fb9f97ca.npy +02958343-144d0880f61d813ef7b860bd772a37.npy +02958343-e06082fd22dbd3d425da9962b829b47.npy +03001627-7a7273d390ea180db857892c38c46c13.npy +03001627-5d02aed0e9c93e829b9f2eb77f5e247e.npy +04379243-1f59698c02bd1662dbbc9440457e303e.npy +04379243-4f35874fc0301d015cd4f7d5b0608a.npy +04379243-fd07e0a8265d1e15db11d29991a4fad8.npy +03691459-26369dd5c4cc8c55e9e3ed40810044f.npy +03001627-4ae919ca418d3625d30ba6a673002f3e.npy +03001627-b7a04fb7a5fb790d96626c84a010ee5c.npy +04256520-2314a3400230f50d14038d588fd1342f.npy +04256520-32464457314622264587e90e2fc67ac9.npy +03001627-46c8f742ae31294cb4a4ddb21cda79e5.npy +02924116-e0275ff6dfb3de5ae550942ea36e5443.npy +04530566-602df167ba6cb5f5443efa8c2bef3b97.npy +03642806-7da524a31c9cfe22ea8725c845547c21.npy +04379243-b696793f05faa0debc5c12f67106b799.npy +02924116-154eeb504f4ac096481aa8b5531c68a9.npy +03001627-d8f7e27824e61aaa81dff5c2e57ad46e.npy +02958343-48862b67f5932cd4473f10e6caaeca56.npy +03325088-5f9c1f87d28294153321831d2245cf06.npy +04530566-a0f1e4ef99b57121a9142e7277ee08f1.npy +04225987-f52d56b5f81f1258c70ae17ca06472e1.npy +03325088-4de8400e15f1ce79b362845c6edb57fc.npy +03991062-da871256377ad8fa53d040168a517ac7.npy +02958343-b0c2225ab347e28f1a48cf85d161a723.npy +03691459-7a7193771ada6796a1b0d9ebe362f8f3.npy +02992529-4c9760ac0bbd2003151c744078238922.npy +02933112-1e200d34c5555634c59350d819542ec7.npy +03001627-52d747ca443134da81dff5c2e57ad46e.npy +04379243-37dcf713a1842b93a8699b6183baa203.npy +03691459-596f7a94c6d1443870896ebcdb67d8d7.npy +02691156-6b6cb0c71731aacc277d303e3a640f98.npy +04256520-9c113b80d75659ffdb8fa1712f9ee93.npy +04379243-e5c44394471f29d874739c2c9ecfb3ee.npy +03001627-7644e30dc0d88481a3d974b4624d6717.npy +04256520-de3589ff77017c7df15e23b99997e42b.npy +03085013-442a30c7e3d4f820cb07c68667cfdc00.npy +02828884-3a91034ceb33784b562fc21c99684e03.npy +02828884-cf14c102e6da1a78e6d475a101a6dfca.npy +03593526-1a9dade4e4a4c47589035c25f0dfeb63.npy +02871439-f605462946e280e6ed46ddfe25ee83ba.npy +04256520-98546869c4ac8516febad4f49b26ec52.npy +04401088-3dc95447a57f8d06c1e615a94e798da1.npy +03691459-ea944f309ec70895c9fff209a296912.npy +03046257-51b07fb2a039850c384368499a680cf1.npy +02808440-c118e19caa1c626431f28caafecd610.npy +03001627-6ec9b7c65db28eb32342d056300eceae.npy +04256520-32c1445f65f4ceb23eec26c23f5bc80b.npy +03001627-2909a46120ca93afff16555386d173d.npy +03593526-2fa653cd90c27f8fbd16d4490a10a752.npy +02933112-11694171ff49a7521ee0429e004db48d.npy +04090263-55966a1b272679b256dafdacf26ff875.npy +04090263-5d8c7291e06122c14eb1cb28584abf8a.npy +02747177-22cac9601407b70bad5067eac75a07f7.npy +04379243-38aab2d4679f51a7d70e365688839034.npy +04554684-2ba54a5656c25096174c6fb6a5678c41.npy +02958343-4212ae43231ba858b1bb46d2556ba67d.npy +03797390-6dd59cc1130a426571215a0b56898e5e.npy +03001627-8e0832b4ee38c9743b8d5c0ebdd194c8.npy +02843684-bf9a6c379d2dd1ce5bdd1b5cdc787a49.npy +04090263-48eaec39f20dfafa7e270f84701afcd4.npy +04379243-623c9a5812ff9ac920768660cf080d12.npy +04530566-dc422a7fdde68d8bbfc744c1348ee017.npy +04379243-8f7cbae92fc1c6f9327289c00b6dc9ca.npy +02958343-709774861793cca453da660a6567c5ff.npy +02958343-a1b7a3cc11b25b3a82c0a051a54c0e33.npy +04099429-5925619f2bcb830aec83434daf14e347.npy +03001627-57c6cf844c09c5d8b40f0ac0fb9a650d.npy +02958343-1d2c5ee3b5ef205164bd4e0c23ded276.npy +03211117-b5f473b7fb7cb7a7cc12bab62e8ade64.npy +03761084-a4a556292a3d9395230584014222e685.npy +04379243-bdb44c3f5215ca84b6d51da3ac2ed48.npy +03710193-e29e2eadf4e79ed6b34538f1e32363c9.npy +02691156-8a343fecfe2b8660d0fe0309648c1f07.npy +04090263-181d88c9e36d9ab88aa7cb0651220ba4.npy +04379243-e300cdc549ff426723fe3501bb9e7193.npy +04379243-6fe854efba4d9ddcd4cfbd0aef5a371.npy +02992529-e55ef720305bfcac284432ce2f42f498.npy +02818832-51223b1b770ff5e72f38f5bd71072746.npy +03211117-18dd6b73f3ac2fa26da250acc5e18ffc.npy +02933112-83db7fe5bdd2df12824662341ce2b233.npy +04530566-f84196260e558ff5abb59ca95d19016.npy +04379243-2c1d79e1e1533bf1f51f77a6d7299806.npy +04530566-8dd5ad35a45f72a64bad9b80eddb4cd1.npy +04530566-d8d0fcfc22f1b587308717e0a8b6a9a.npy +04256520-be19ff23b9cf375d6ee717407316be0.npy +02954340-60104a0945f83b063f30fadefd6911f2.npy +04090263-587cee5495322f18cf1584c5b09d332.npy +03001627-6d5207270292fa01c914a9f52c152c86.npy +02958343-c29ff3df2cb0139f635939ef1a7d59b4.npy +04379243-5b5532f71d63a7a772051d450c32f58a.npy +04530566-143df6dce1d90696874f0e42f84eb4f5.npy +02958343-da34cb394fb3caa58dcad5127c74b8e0.npy +03001627-2fca00b377269eebdb039d8689a74349.npy +03636649-1991d403d8ade0ad338afc540c33f34c.npy +03636649-ae67ee6392fe8ab94e7cb04dd663c825.npy +02958343-27f7336ff6ace6d460c94cf1a48e53cb.npy +02691156-f74cbd91e6fb40dfce5965228d7e8c9f.npy +03642806-a7069a96e11b8825483afc91de6851e4.npy +03691459-7f2cb859eb00046d3bb72a8bf55ec27d.npy +04379243-3ad4ddfda32220c388eed60433632c64.npy +03467517-824184668c5a297a5ece9c83df74def8.npy +04379243-5326de43a392840657f40ff86fe708ff.npy +03001627-6be3e544deece8441191025061735ea3.npy +04460130-9c3a256496120013d444bcd674952301.npy +02801938-55f00572c277b1876effbd64ad6b71b8.npy +04379243-f4fecae627f0c8906a4e86536413f450.npy +04530566-90bf73b91185303139555c8c231d0eb7.npy +02933112-5d765603dfb0f151e367f8f62a7e9398.npy +03513137-5021db37ba1fb177202339ec5396045d.npy +02828884-e6f7d84750ac46b260bedcc07a9f285c.npy +04225987-db4c8bf323465e4c537d393009a79347.npy +04090263-e74ab615b3008320e2bb19fbad3e4596.npy +03467517-77095861248c816693f0194265a9746c.npy +03325088-72863e1ef3c0a6fbdd5cf959690bb73f.npy +03948459-7f3ec97cfaea31137504cc74f24f0eee.npy +03001627-6c554635dcd6123a35fd8a41e49d8421.npy +02958343-2a07432c2860b54becf71e2e014ff6f.npy +03325088-e76c3dd5d8baf0c5bb9760cf9cd1a953.npy +02958343-a49107f738b26379428df271ebc70bc0.npy +04530566-43f7e9f8ad44e8236557d610dab4f1b2.npy +04530566-768bb9fbc3a5e3724f42eadbd9a0b820.npy +04379243-20edff7e1500fc4ed45f502ecff9e44f.npy +03691459-4a0278285d649ac779b2745bcc82f6a5.npy +03790512-de4d518333b82995d5dde04c96fd8146.npy +04090263-e4bbdf84d07fc208703494a0657c2b45.npy +02691156-457c12e05d0f5d15762c3bd1a2b3f377.npy +02876657-541c4dc1d1b42978648ed39e926e682f.npy +03001627-4960144353a6dd944c5483fab67d9a50.npy +04256520-ada8ce574ee473827c373e0e7470a338.npy +02958343-f795a928e1c7136f94d732a98738804e.npy +03001627-73b37c243cbf23e0b516c05d046e8e45.npy +02828884-b3548e858e4fa7e0ff3245f22be4d221.npy +03593526-8e5595181e9eef7d82ec48ff3a4fe07c.npy +04379243-322b055809086143c7860707e3deb3e1.npy +04256520-fb1bcd50b847a99d7948cb8e1d9ee487.npy +03001627-35f94bf244a7fdc5f51f77a6d7299806.npy +04530566-973a6d80a9dfba962625c670c48fcecd.npy +04379243-83786b4a5d955949a495869179e36802.npy +04530566-d1a5a246ffc956d68c841014ca8dc002.npy +04379243-21ce94947b07b5d1f91663a74ccd2338.npy +03467517-25a108bc4c106249480694b9b5582e9e.npy +02924116-26c334c2faacbbdd9f46749e28e16975.npy +04530566-a034dc83750e7b8144c1f09f7df84b24.npy +03636649-1e91664763d371937dd73da65dc0e6a7.npy +02773838-5d4f774fdda6fa1dcd99ccc7ff441abf.npy +03691459-61add6842a1dc131b59e9758ae7f41a7.npy +03636649-b8c809f74a592a91ad5067eac75a07f7.npy +04379243-e2cb95f03f5dedf9f198b94f669bca91.npy +03636649-9c62735cc43add358f63636e145483fb.npy +02808440-c4d230faadf735c3ac7bed72580dc30f.npy +02828884-7bdea368f85d9eb5b47a47f71cb78bc1.npy +04379243-38ae45935dcc83fcc8c2a1a2edf00686.npy +04379243-2700f6693447c32d66c64744a4252d3.npy +04379243-bc15e43c4af5a6d0f51f77a6d7299806.npy +02828884-3749b110a6f7895afdb310510a9dc39.npy +03001627-75369f55718d5adba0bb10bfbc5d4718.npy +04090263-194a4d0bcc1443fffcfd5149a4a15414.npy +04379243-1ab95754a8af2257ad75d368738e0b47.npy +02691156-b97b9cde30c23b4d71d03b466c72ce41.npy +04090263-c02b44f51d159cc4a37c14b361202b90.npy +04256520-953196a4e8a813e8fc909e63d58b00ba.npy +04379243-3134eb0e0dae6dd7b26d198318b74e09.npy +04379243-4b1bb0475e67abe029426a0f57e4d15e.npy +02828884-71b9976c657291772d07d128adae16ff.npy +02992529-9644fb6a1520af7fa90f3ad3635b46d5.npy +02924116-9294e3a8412a9219928aff27104da001.npy +02958343-e2bc765fc68afde6afe717997470b28d.npy +04379243-3a44efd1fd14ea66dfa4ff010b8b9d1c.npy +04379243-af90af72a4808ea767c8e42cd3ac65ef.npy +03001627-f9b24a3b88f9037e4b5cae2ecfffe51c.npy +03001627-cb17f1916ade6e005d5f1108744f02f1.npy +03691459-1eb0b35e8e8ca4da85113402a7623535.npy +02691156-b008491b09894384451efd5041dc713.npy +04379243-3bf20deddacf5cc64b8710a3469971b1.npy +03046257-844b4e8847e4612d30949acb87806dc4.npy +04256520-b6d1a72c1f27f4cbcd701e9c04d3cf7a.npy +04401088-fddadcb723b843eaafb07a946d621b3c.npy +04379243-8519a614ac4b1c642b70eac6546e93fd.npy +03636649-b07acedb329345f0157f5033576317e1.npy +02871439-60a48fd8f1191133664b3b9b23ddfcbc.npy +02958343-9e6156aea0c7e60ff7d6fd2038bf9a11.npy +04256520-7b57ecf4b5e9617d6282231ccf88d909.npy +03001627-117930a8f2e37f9b707cdefe012d0353.npy +03691459-96ff36cb731b29a61ad88f716ea80910.npy +04090263-5ecb203a4b00b9a5a6d1f73319179578.npy +04468005-9261fb7f5dfdb35f92236fdea0aebebe.npy +04379243-f6cd420f08155054803d0f5bac2abe4c.npy +04401088-652a6fd052491909ab19ce2dec0d1925.npy +02691156-7089929d7a778403e91b0867f5d9629f.npy +04530566-74480b3e812f7c1428cf87eb5ebe5e6.npy +04379243-7634b09c8ce172ba71a782a4379556c7.npy +04379243-735afb29934346513d41bddf307a46a8.npy +03001627-6782b941de7b2199a344c33f76676fbd.npy +04379243-a546045291e8f61c8163a33a6bfa14ec.npy +03691459-702c2f9c3e8770b534943af333340cd2.npy +02691156-b82731071bd39b66e4c15ad8a2edd2e.npy +03467517-305367bd8723cce9d57700c05b1862d8.npy +03636649-8bd35721e2767dc43225afab722d9fd2.npy +04256520-210076a2e26d5d53adc3470b30138f3.npy +02808440-35576badda1a56e6ead5604ea0ec0346.npy +04256520-af0c4f45e0444ecb01c58badc8bbc39.npy +03001627-6fc581beb03eb73349c9c494c2fb14ce.npy +04401088-12f2156b99444e955d73afbd7c310e93.npy +04379243-87ff92c179ed5ed292f4c88fd91c6b1b.npy +03642806-7f75b94bd59d649958dd315c54df0c15.npy +03691459-869225f275f3dee12a42340e65c9f0ec.npy +03691459-2cc52cc8e9de5c12f398d0c5832df00e.npy +04530566-70744087c22ee199a51aab4cdab636bb.npy +04090263-d3795e145d8fb811d735fa1ab17311ec.npy +03211117-68206e7d85afe3619d8d0b45bd2b5b8d.npy +04256520-847ce2a3541a085ccc9651014a82e2b9.npy +02747177-2a20ec86e1aaf196cb2a965e75be701c.npy +03001627-a6a7b00de9ccce0816a5604496f9ff11.npy +04379243-aaf6be1d92a8c61fdcfcef693e7ec696.npy +02691156-1f86a689ea6c35f0d9da70c3ab6dcf3b.npy +02691156-deefcd290f7f2f1a79201593c1eb4b0.npy +02933112-552b14104b7add4049cca13fb3e44bf.npy +02691156-1a04e3eab45ca15dd86060f189eb133.npy +03467517-18da35f3835f75bffb5c1b0f759e2bc1.npy +04379243-9ff56887e5f00cff412a0eaf6d0f1809.npy +04530566-dde98d21d4359f24799c6c3b2fff049.npy +02958343-860b7d89728a27b1afe1d4530f4c6e24.npy +04530566-320683da0d8bd1f394a6427195fa0bd9.npy +03691459-841818bf97827792b6fb1533bcae7a75.npy +04090263-638b5b75b9e7b0c4bb6581a048a6fb18.npy +04379243-599cf052b675ac2c8457b637f6fe1690.npy +02818832-b7abde250c295574d26ae70d41aa7c7b.npy +02808440-e1315ed591ae2c6af6a9cd46986959f7.npy +03691459-4c5b7420078b23b098935bd14e27f0a5.npy +03938244-c9f732b5bfe7b1cd29c99526bacef0da.npy +03624134-47d1191bc5bf94bc625ac64d4da8b7e4.npy +02828884-eeb6784f5812bcebb281680297eb79f2.npy +03337140-820868b702c588e0ce5d6e9371bb5c33.npy +04090263-1d9d85fdf5241ec31dfb190851825aa0.npy +04004475-99df53ab6417e293b3b8d66c43b5b940.npy +02958343-1f9a735052840d4fba1ba1170e0a8dd9.npy +04379243-934f8fd5d11af1e6e75232ab5942fa9.npy +04379243-db5f1c46d8af7d17db073a02eddafbe6.npy +04530566-87a750e55b04395e668e250d23d1f86a.npy +02958343-57aa7560dcfecea81edf5a868fdffb8d.npy +03001627-cd5ad4afabaed0d3e762624dc3c8fa2a.npy +03001627-24bbe7f32727901aa6fee8e2140acec9.npy +03001627-c50c2887ba2b5535c32fd7e88552aa9.npy +03325088-da28d9077b9bf42876d20e73c57c9a03.npy +04256520-e2965d9df7974ba25369e32fb818f337.npy +04256520-7c9e1876b1643e93f9377e1922a21892.npy +02933112-452ef94b9cbd238dd869694b17a45f49.npy +03636649-238138a3b01dc4fa68f9be495c6674d2.npy +03928116-82e0e96bd89956d9f330eedffaf3339e.npy +02691156-33a4f9403600f29c281f657e8f8481a1.npy +04530566-ae9ab937f6c1998fcc34b900bb2492e.npy +04379243-84c52a5ac0f8d1d060ddc468fe733ed1.npy +03001627-3a91034ceb33784b562fc21c99684e03.npy +04256520-c309f25d69ad12dd4733824eae5cd9ae.npy +02880940-4b32d2c623b54dd4fe296ad57d60d898.npy +03691459-48720ac336dc7012d20ac02530d96758.npy +04460130-10be0ff0e5eb12584edd82d34d189d0d.npy +04256520-a259b6ff6a4a787b4c30acd2d55583a.npy +04468005-1cc54ea296582d76793d6971ed960dd.npy +02828884-7cd1d8b686ac0059ad5067eac75a07f7.npy +03928116-36b6209b6450a35993680c5a9a367b4a.npy +04401088-77817771db0788d3241d076ab53023c1.npy +04090263-55518164337571f9ad0854712de182c0.npy +03691459-cf42a073500a1a222a9eb0f146e94477.npy +02691156-d9c080cb6634a902ca9f0727e23831d9.npy +04379243-4b11be42b0c0482dd94faaee2b20e2bf.npy +02828884-da52e5b3a29c06b1eb8ae9cf8e3a676c.npy +03691459-78efefe36b492b6e5a31d91ec836a511.npy +03325088-9cc5112d89d6c79720ea64e16f9dc224.npy +02933112-ebc49b9b624dfb55f9913e822d5318.npy +03001627-ca1cfcf4d5060ead8610f0b48b38e644.npy +03001627-5752f7caf0dbbe4d94210977e5394f26.npy +04379243-c50794596b14605421c4aa1c0e1daae3.npy +03467517-3f94fd316d4f2ca1d57700c05b1862d8.npy +03001627-2a8d87523e23a01d5f40874aec1ee3a6.npy +04379243-43c1a78d9d8b3735f2b931201029bc76.npy +02958343-67e2f8985a28e895a592cf90fabddd34.npy +04379243-6d9be8619f48e3dad096bf408b606360.npy +02691156-6af4383123972f2262b600da24e0965.npy +04379243-74983e99e7606eb114708467db3d00e2.npy +04379243-6724ae69c0bde4c09b7dad6c9c46bcf1.npy +02933112-81cc63cbfa6e492154cd2a0ea6cb618b.npy +04401088-9c5952804e0b2ba3e1fb8c5792a5768b.npy +03001627-9b40015761a54e18c29f8b0ac356b8ca.npy +03642806-eeca77a4ae8aa0ce3bef19ecc8621d89.npy +02958343-e9b2aebf673e516d1f0d59cde6139796.npy +04090263-98572b8a17031500c2c44977d8755d41.npy +03948459-61064e4a00abaaec589c07868201b17e.npy +02924116-59d03143935a47811bdb28bea09e3a92.npy +04256520-9381eb770cfa95bf6bd365389d6dc6e7.npy +04090263-5f356bfdcf9cd4218d4ca42bc1bef451.npy +04256520-27f0c4cde547763ab8a40f9116438027.npy +02691156-f222d51d7c6fedc2db73445864b72015.npy +03001627-eda92b7bd76d8bb0b083574fdbdf0a98.npy +04468005-214442a4247d8c049cbb6423d7247328.npy +03467517-71574955078e0e6191437d7de92c7dd7.npy +04379243-bae99f3e4af5bd5ad9b53420a5458c53.npy +02871439-5cfcbeccf9c9681220192a5319e3e2e4.npy +04090263-2e7c6e5ee2f07f3ce19905e7053d006d.npy +02828884-54197739c383e3b9ad5067eac75a07f7.npy +02828884-843cbbdda45de37970709281289b3745.npy +02808440-a78afbaa1c7e8795e44d45504b29e834.npy +03001627-734ac9809aada180d18df440db206fb1.npy +04530566-395ce591ad2e2d9be47b958d3d1f5177.npy +03001627-9a8dfc7a6831749f504721639e19f609.npy +02958343-49888b45d4bf55a530855e8db75dec30.npy +02958343-56478692749392a19dfd5136ef0f2af.npy +03001627-5f7152813631754bba07a29886846807.npy +04256520-82c4b96fb61723aef3598efd14e493d5.npy +03636649-fa9dc903c8324b85e3d605ae370b7c5c.npy +03928116-cd53fdcb3213ff4a9012f53cfe64e327.npy +03001627-2c5e32bb738a5306e27790b0ec8671f7.npy +04460130-1ec4566d10cc58d7a2f3410d5eb66b3d.npy +02933112-ad4ca1e6d178dedfbdc5348d65406054.npy +04530566-907c179103304ce8efcba30d0f49b70.npy +02828884-26c48cae38ed374e786f181221f27278.npy +02691156-ac026df0c0add322f37f38dedb2f1219.npy +02942699-3019eea689e5d9c1fb045022c5d3b1e2.npy +04379243-a3064f61346b7891ea0464486db6b687.npy +04379243-4cef53c3310bc0561826247b46b2ae8.npy +02828884-7be476ad18fc7b40d201085e80edb26a.npy +03001627-4a17e5189aafa9afc8687ff9b0b4e4ac.npy +03211117-917142dae380e5591ae30faf8d21acd7.npy +03001627-d1436d73b3060f2ffd6176b35397ccd5.npy +02691156-a3e15e215144dda0a03ebab0e8b8f7a0.npy +02828884-874577f61fe70621a1370c1659f8eb45.npy +02958343-18c7b5644290ce2caf0c754abe32de.npy +03001627-5158aa43b78b81a0f7628281ecb18112.npy +03001627-7e4e9703841f16194e045e9030a39002.npy +04256520-742d1d33eb66d91014c0ce0d45458397.npy +02958343-233ac4ee75d1ff0c6d111cf7e70d924e.npy +03636649-6778917189e50370a894da3d4a669d7b.npy +02747177-8b8668ba154df43bad5067eac75a07f7.npy +03636649-b7a6c5c6c27273b3253cb5b81530269b.npy +04090263-cee56f2ecf92cdeca0834a5219dec81f.npy +02958343-a281de4b24f5500d4c40f34de8f3bdb8.npy +04379243-9b7352c3a8d69c2a1185ac82ed4da80d.npy +03593526-2ec608cc4d3287bb92e0b07fda7527d0.npy +02691156-c00b97813a9cbd72ec85c5551a78ef2b.npy +04256520-d992ee06ffa2455219eb0cf70882af88.npy +02818832-8589909841fbc75a11099baf02792d0b.npy +04090263-c44c0319f2f31c455814fafedc6971c7.npy +02992529-855a8a4c39e8fe81a060e584e7409aab.npy +03001627-2fe5d78dfd82bafbcec24f0586fc0928.npy +02958343-40313368870df2c0df59ad08996c77e8.npy +02808440-980d4377aadf1fe1b362845c6edb57fc.npy +02924116-60c6d162776e07178c468c10bc96961e.npy +03001627-eb6e55bb557701e37df0e9a69c97c97d.npy +03642806-caa4afd404f24d21275c1147a304ed86.npy +02691156-123ac29b0aac8c8e5d07633dda45110.npy +04379243-aa6a63745fd7ef284084fa5d51d65c65.npy +02992529-8a26be623e40850a203d19a168d29f04.npy +04256520-e922a4ef330ad87ca37f3fc191551700.npy +04256520-951e63303cf5eed1cd4a89b0fee32930.npy +04379243-3b91620452041b664b3c42e318f3affc.npy +04099429-2de8ee55ff69502863098049d14fe32f.npy +03636649-7293f886dfe144f3496d07587574cede.npy +04330267-54b9ac27f2bae92627a11dcb35000f7a.npy +04379243-672cf4b2e0deff1e693e54627de491a9.npy +03642806-62cf794fb5fb174aadbfb30d8d1b297e.npy +03593526-8ec888ab36f1c5635afa616678601602.npy +02691156-e42443669339a6c1a5a118bd15e6e34f.npy +03001627-ed0d65c68a1fa5c485e2f8b1d3a373fe.npy +04379243-3a651c78081152e77bb4e437e41d3c3f.npy +04379243-17a5f7fd90d2bf98b40f0ac0fb9a650d.npy +03325088-eecb6ef43e0902eab362845c6edb57fc.npy +03001627-ed51660fd119dca819fb4103277a6b93.npy +02924116-c150b150e25f4bd438f13d421c59f8e3.npy +03642806-1b67b4bfed6688ba5b22feddf58c05e1.npy +04379243-70cfb2647d8246971c81cfce8a9fa8b.npy +03001627-c22ce6ebc2b5bc9b59a44e6453790000.npy +04090263-b28e6d6cb4bb868ec27f2d9f006d69eb.npy +02691156-6c3593d0cc398e715d058822e4c8a2a8.npy +02992529-bf1f95958ec4d3e8d485372bb746f3c7.npy +04379243-575fd4acf0112feae2b24d5cb1e4e616.npy +04256520-7a32d6d22231a58d32388c13cc4a0ba3.npy +03001627-78f5b44157269f99fd60059ad8523f1a.npy +04256520-9beb39285a581fa1f2e202d571b458dc.npy +04379243-f0e98a20a4ad33b15578685df571d8b6.npy +03046257-8c8c6b1c3d201d55490ad276cd2af3a4.npy +03624134-d69e028056c9291069654277b747a908.npy +03928116-508962b8f60b4b0d8c6ed1c74b495e08.npy +02691156-e332fb3eb2c4016ec1f9d235878ff0a9.npy +02958343-cd5223d35c9cf611ea7efa739175072.npy +04379243-517683d0866085dd2beec56b24479ed1.npy +04330267-ab95b15a38c246c3cace11e1dcfb4b5.npy +04379243-7ad4285694233688105ea47d266f5adb.npy +03001627-2a417b5a946ff7eb2a3f8f484e6c5c4f.npy +02992529-effeac02fe96f769146071e83265f12e.npy +04256520-b3d216ad7575478d202316dd49948ea2.npy +04256520-396ee2a2333e80815b903ba10d2ec446.npy +02958343-36a5117c64d8ca6ca10cf495b6dc4ef.npy +04379243-f9ca04891f79cf2871124212e03fb7de.npy +02933112-60508a8437c09eb2247353095dc395a2.npy +04530566-36fba9c2f4c256dc4387c5ea62cbbe8b.npy +03642806-21c0187bf2174c1684c4330348773d0a.npy +02876657-40aee078f0390b7134076b5960251711.npy +02958343-59a8ea75a9c70f51a0e1f1086c88ba71.npy +03691459-e6e09672fd21f3d887695b38431695f3.npy +04330267-b23b39522e810d8d47605ecd69fe97af.npy +04256520-d83aea7de9d3d4242c37553db37ec752.npy +03001627-4dd8f21d05f7d9a99e48f9f4020457c3.npy +03636649-15211f5ea7c7432686c701087a194026.npy +02958343-262a03114b8095856a1de667a28251e7.npy +04090263-da2799e2d7b9334ef0b45b4b4c7e33b7.npy +04256520-e963f9423720600cf506f5cb7d8ce57.npy +03001627-b89cbb45476e94a5e65235d5580cc3e0.npy +02958343-34ab29cea66952f16f48edd113a40fce.npy +03636649-4dc9f86110ea40aaa570c6c691c987a8.npy +04330267-a18d795628d848a5589577ccf07b31e7.npy +04379243-305795f4aec83b53a51d50d3f9ced065.npy +03467517-86788d23472ba4de8cf17104f488ed2b.npy +02828884-66adf182075ea88177f32db2e5e73311.npy +03211117-48edccab11f0698be441f5bb6f88ca61.npy +02808440-5a67b4165fca8f4a34558e566e818bea.npy +02876657-a87fc2164d5bb73b9a6e43b878d5b335.npy +03001627-5392f55620f601471a782a4379556c7.npy +04379243-fd7769d0eba554c53def89b32cef8e45.npy +03636649-8b674da68033700333d93f57729688db.npy +03211117-d72732ab9e03ca861d73f583f51a758d.npy +03928116-71bdb3a149c93be6834096795cc3cf10.npy +04256520-45d96e52f535907d40c4baf1afd9784.npy +02958343-832a8f6cfe462e48402013bef9b89b74.npy +03691459-aed74c2fb80bf363f5776cc601097c0a.npy +02691156-49917fb82beca4beca8607f540cc62ba.npy +02958343-7a0f252961e5bffad95840a0da458be0.npy +02691156-c7b1ae292fb3d011511e2f9385a386db.npy +03001627-c826c65111c867ab45a1df43bcd9e471.npy +02958343-bd33b9efe58ebefa99f8616cdb5dd27c.npy +02691156-fe58e1c34a7fc8ac7f6b2c9a3874dfdf.npy +04379243-303ac20ea2febf9ec3bd24f986301745.npy +04090263-d75ba8d56bf868b75a950bb73f1dbae4.npy +02691156-b9168b74c6d459e65a73760c6feb254c.npy +02958343-ee2b541ccee732254c938921b509ee11.npy +04379243-dcca76b81c747e76a65e19246f8119cb.npy +02958343-57a2d812153fa225c740046119b36696.npy +04379243-b595da70965fff189427e63287029752.npy +03001627-61bc4930719717a9492d9da2668ec34c.npy +04090263-f32e61f7124ccf327aba5d123c068416.npy +04379243-db0685c490a05ac7c5facc3cc8dc041e.npy +03691459-32ce47d38aede60ed614b9a1d2062a4a.npy +04379243-83433f0c0a3801942eca57a2fad76f58.npy +02691156-21827b0be78dd3e17dd9ca9e282b9209.npy +02876657-f0a5f6d2cf8fcb72c12d8e00a78db6e2.npy +03211117-9fc580b2097a1d3beaa3086aec501406.npy +04256520-1b0432fd7b56f7e219fb4103277a6b93.npy +04090263-5f3487876c91c0b5ddd7320ddee77bde.npy +02808440-96777ae57747ee41ffca1588abe4e39c.npy +03636649-59e852f315216f95ba9df3ea0397b1a6.npy +02924116-d39202ebc7b025a012128d25485af84d.npy +02691156-854c2f430e7aa00f4d210d9468aedaf2.npy +02958343-c916164d0e5c667a75ef328fc121b1c5.npy +03948459-36e0d91630f7c958d4ca42bc1bef451.npy +04090263-1be1707593a15cf9fa9286f039319ff7.npy +03790512-5a34a535ced91869354ab1decf4fe605.npy +04530566-7a1754186937d247ad78ed9a26ab1091.npy +02773838-220f08ff0c1d2a4542282fc88db7886b.npy +04530566-e0845c8579c5d4acc3e7754d5a998758.npy +02691156-df8bb967a346ccc25e9e2656aff7dd5b.npy +03325088-dfd23237c9ccc149b362845c6edb57fc.npy +04379243-919b2b8877c90f6885718c281d7fdf61.npy +02958343-5089b134ef31941edacf4de272c1e30.npy +03624134-1e491eee214ee77eb71f7555d9f1768d.npy +04379243-64298fc3b7cb8171eaf288f952624966.npy +03691459-10d16ee9c9402e6df2e5d34c7b677bc4.npy +02843684-b6348429292d990be67195cc1ecf4787.npy +04530566-6f36c486675210cdd566d7f46e9a16d3.npy +03001627-53d88f50e3abc2888dcbe86402c7c15.npy +03624134-46723d416c8a27ba104aa0e918fc8fde.npy +04379243-268a263f41b82227f10f2cd5149de8c9.npy +03211117-288a8917e51c57deb0957d845ac33749.npy +02691156-969455251a1ee3061c517f0fe59ec7ee.npy +03001627-831ca4306245810435836c728d324152.npy +03325088-184fdaf0ea2fda9c5dc3653f8341633a.npy +04379243-68c76bd1d8ddd433dcfcef693e7ec696.npy +02691156-d74767519393a937f73e5bc170b7e2be.npy +03467517-b6f67c7088197a76f4b498e11fb60a4b.npy +04330267-be935d47bfa0fd025eb64c1003065596.npy +04256520-8a5a40fe10eb2b2eb022c94235bc8601.npy +03938244-8b0c10a775c4c4edc1ebca21882cca5d.npy +02691156-20f2a121d9dbbf9e98494085d68ad6a0.npy +03624134-1ecb37ea8f0c4abc20fc54d2500eb7f1.npy +04379243-13c8f06bf87c074f9b75b6346baf0c12.npy +04256520-24178c4efeadb8bbadd1969a2adc38a6.npy +04256520-47ad0af4207beedb296baeb5500afa1a.npy +04379243-3e915e96e22f15a1af9174ac65b8d24c.npy +04379243-ec91cae6576b5149484539ed1814944e.npy +03467517-ce5aa7d561bd83122d1748032da3d7b6.npy +04090263-192309e06577f893bb4594cb67b6eaa3.npy +03211117-e3d94861020f97eb37fe7bdc65e35547.npy +04090263-84a95f9216f5c3255d3426ee101e9f8e.npy +02946921-3fd196c22459cc66c8687ff9b0b4e4ac.npy +04379243-724b8cfc8c4b8e16300009db8b7749e9.npy +03001627-e984974d54645e8328c54e8f8953f499.npy +04379243-889654f30ea7b4c3ce84b253beeae59.npy +02691156-9daa49ab2f97fc14d85e5191b992b560.npy +02808440-768acba240b21a492beec56b24479ed1.npy +04379243-d41c8af82fe98a019fb4103277a6b93.npy +04379243-c826802d2a084845979f073230404b25.npy +04379243-4d24a0d4ed77db9f4b3c42e318f3affc.npy +02828884-bfaad1f9dadac9b6a385f05be5d65f80.npy +02691156-a591b49406ab0d2abbf3143b1cb6076a.npy +02691156-13f9eb29d699488a99eab31c7df6f5c3.npy +03001627-906608e3146548e6a4e733e4e18a6d05.npy +02933112-35faa6d255a474f3dde9018a607defc5.npy +03636649-e2343ffc39e5f4bf85a18a4e86f89dc9.npy +02876657-200b3f3d859c8677ad5067eac75a07f7.npy +03642806-95908e92aba3fb46fc588a8e4bb2f15.npy +02933112-bd55f9190cb5c9ea3fe047712e43e185.npy +03337140-75b534f907b9d89491c352d02061b3f7.npy +04530566-77d2d34922964c7b57c58fd0f9b1d74.npy +03691459-ccffe9befaec2d1c4ffa46d1fcb77f51.npy +03001627-e1092c9dfe55273876f83644d71a31ee.npy +04379243-c46135263f88cf68bfca5f90d2eb0e0.npy +02747177-d30c7f6073bb8565c8a06b09a9a18b3d.npy +03642806-51dad6ff8c00b7be288d8f1144f7979f.npy +04379243-3e51742cb382aa1f79b3e1be3524f72f.npy +03710193-cc208bd200cd7cc5276cc2218f09ba08.npy +04379243-4cd11ae56eba48684733824eae5cd9ae.npy +04256520-25bcc7d412b1b3f27713a8d3e281895a.npy +03001627-7114ef00fe68d053cccbd142483bf2e7.npy +04530566-d14c92a31d848b1371090852934fa2c1.npy +04379243-ddc6ea7906f28cace8e2c411e1e93d03.npy +04379243-24bfb2f2e403e025d5b708f09789d978.npy +03636649-a56224d991c3eedf77d8f08447bad584.npy +02924116-1e10538e90c43ff33db75a4ec21446d9.npy +03691459-c55edafad476d908d17058acd487e2f1.npy +04090263-ee01a3d156cfde95b6f73775a54c59c6.npy +03325088-721de72c2dd58fb33321831d2245cf06.npy +03948459-dc50408025d922eb1c81652b127a0ec9.npy +02876657-cf0a733f9a63f4f5664b3b9b23ddfcbc.npy +02876657-ed55f39e04668bf9837048966ef3fcb9.npy +02808440-5e9c7ef153807504a58a5ecb2008fd42.npy +02828884-87dfa3332d118867d0d69b51a45f7aff.npy +03001627-4b7cf20cac8f2344664b3b9b23ddfcbc.npy +03325088-872a7873bbb56f1958c88d30f502a452.npy +03001627-a287b508914a00a6857b1bfbb80503.npy +04530566-dc3336883fae5239d76134f29a265550.npy +02933112-a746b71bbbb56c93c59350d819542ec7.npy +02828884-d2193ef2753921aced98cca8f0ccd5f7.npy +02933112-243cea3dfd6619944b8710a3469971b1.npy +03691459-b7a6e59fe546d81cdb2e05daba43d6f.npy +02691156-f59470cae839ba0e9b2acbfd8323f804.npy +03325088-bf4dbc47f8688cf2b362845c6edb57fc.npy +04379243-c6442db6d5fc94a62744bf8869518694.npy +02828884-2e016658e44247bd2056b4bd5d870b47.npy +03797390-1eaf8db2dd2b710c7d5b1b70ae595e60.npy +03636649-b5c4331e5896bcec1119ad686ed3f611.npy +02992529-cb80f0eb9d3566da655b6157f54b4abe.npy +03991062-a5975549391ef2215d2b72e86737c92.npy +03691459-87d70f424653c8c9e2a6fc5932a88f35.npy +02958343-15f605c6fffea827e7436c0fba14b4d2.npy +03325088-b8e1178589c797e5da12673acac7d94f.npy +04256520-7e40a1af933a05a6ab610b0c94236463.npy +03001627-d9156f5552178de2713decb1a0563b12.npy +04530566-65577c66f22fd84d6eb9a4c3b55eb0c4.npy +03001627-94461b3e6212f63265b1b65ffcd737a9.npy +04401088-2a38116473099355498dffe5de12eacd.npy +04256520-7eddb52d83f3d48eee5580e1b1723da0.npy +04090263-334ee6c5bd30011af8edafa0d47e47db.npy +04379243-1e4bf6ab2b2be368614fa2de2dbe583a.npy +04256520-2f85863e90aae79240ef1c8b63a628f9.npy +03001627-4706461c517a755d4e6ea835fbc6facc.npy +04379243-d49d33a379000a8d4b2ec20c30ace65f.npy +03691459-552dd48f9a264d721574d21c0c95092f.npy +04256520-4dd014b6e5a87cf462158b7ee658e910.npy +02747177-b401be1a08b87882f4fb4dee5181bee.npy +02876657-abe557fa1b9d59489c81f0389df0e98a.npy +04090263-5e2661c632995b4e40c568d90bfc809d.npy +03691459-ae66dc3ecd9c8932fc459988e6a7eba7.npy +02876657-2927d6c8438f6e24fe6460d8d9bd16c6.npy +03001627-d388617a719f23a191d0dff7aea42471.npy +04379243-e21392ebcec0e7cb1a3a884dfddd1bde.npy +03467517-e0d1720034ed6333542e93670cfd32f.npy +04379243-edffc05155544431436e6787c76ef3f0.npy +04379243-72c957a020566f4bfca61b0bec17b8d3.npy +03001627-99a9e829fd4bece8f5f520af1365ee71.npy +03636649-ab999b20d88829d5efb94709f30ce0d2.npy +04379243-40ee6a47e485cb4d41873672d11706f4.npy +03636649-e20889cbe2d917787d616ef0c11d6a7f.npy +04090263-26c60364ecc5858c80c2e60c312b0f09.npy +03691459-da9c218b79205d489c4dd878242c44b7.npy +02691156-448ff32981729dd38eeecfc1f147b56c.npy +03001627-9e140d4e30a90721b459fd126141e9e6.npy +03636649-49cd0dd4d1c008edbbc7a6acbd8f058b.npy +04554684-74dc1a59c3585ed746cde67a6a1ea328.npy +03001627-79b65e898b52b197b11ae648ea92233.npy +02691156-4e4ae13865bf47f41adbb4c4e06ad649.npy +02880940-468b9b34d07eb9211c75d484f9069623.npy +03624134-67ada28ebc79cc75a056f196c127ed77.npy +03001627-ff3581996365bdddc3bd24f986301745.npy +02958343-6ee903e016ebbd66921cb81cb1632a5e.npy +04379243-7a7590d19cf8274dab610b0c94236463.npy +04379243-dd86b0fcacb9990914038d588fd1342f.npy +03001627-d2b334ad08ac9857c3cf9ae716575390.npy +04379243-6bf4bc4a845bf639ce65ba7fab42a621.npy +03636649-1ce3f06d80025d9528eb8d149efa4062.npy +04256520-c9ebc7c6abcc9432560dcae81449eed0.npy +03636649-683118b2740958303fe64ec32ae84891.npy +02958343-e300d58621f7d0e963d444e16188727b.npy +03211117-62188618e7d0b2f23dabafedd9562ca6.npy +04379243-d4a1fb16866d22287db09046a5e7a0a.npy +03001627-8b1af8f7f37c36bb4368753867df1156.npy +02828884-46a1e2560a1e96f3897fc31a9c059e16.npy +03642806-7dd0b4787a78a9b6ec6505914db06723.npy +03325088-5732785a362a6f0135cab19ce2dc6f10.npy +02747177-16e1950b2d507f532056b4bd5d870b47.npy +03001627-4b4773ef582c002b5bfd842976fb7956.npy +02691156-e70bd95ab764bc1b3465be15e1aa6a0c.npy +04401088-6bda193370e2c7e9a30edee0b4a86a6c.npy +04379243-421d60140736eb03d098fcb46b95c.npy +02958343-bd8654fbca233e41ddb8f37b1865d989.npy +02924116-3cec0247f726e9ee41cefd10ce5d6cc0.npy +03211117-600fd2598fd5761eb9099be21c212692.npy +04379243-8e5866a0c093f5a17eaeab1f0c9120b7.npy +03211117-e477ab5ea25f171172249e3f2c8f56f7.npy +02942699-cda4fc24b2a602b5b5328fde615e4a0c.npy +02992529-c06c6362fc6d1c9c5677057f93c3c270.npy +03710193-5449665fcc96c12175becd8a4c3f1866.npy +04468005-6c7a374d85da1ac0ec8621169acea877.npy +03001627-6393b49ccd72e8b312cef4e6ce7bea86.npy +04401088-a1c60f087535c7726fde3adc6768fe52.npy +03790512-7b58dca40a1e09dd393c2e9c64ac953.npy +03001627-47c540c2e9c3483ce79a6b87656a120a.npy +03991062-9dc765021f27a4772e079ea2858e15fb.npy +04256520-336ac1316e0d5cb7e6fe3612af521500.npy +03636649-bc218fcb647e7127984fb9ec7e40829.npy +04379243-f46c84466664f3162f023f89cad43868.npy +04379243-fc9f18e509b363fcac7bed72580dc30f.npy +04256520-b1d7bbccf07f38d34338dd5307c2e704.npy +03001627-u45c7b89f-d996-4c29-aecf-4b760d1fb2b6.npy +03001627-7275cb0572b1c0042725cbc5586c6d7b.npy +04379243-3f10bef75e979d83b32d32632cd702eb.npy +03001627-5974ff38b45265bb352fc7e973ba7787.npy +02933112-b154cb1a8dedb14345ef69cff7e6d57d.npy +03211117-597a278f80d04db46d3e11439c6c22c8.npy +04256520-2b8a9009d91dc09863d467b618e97922.npy +02808440-86cc268fa01fac6b9f4775ea8562d2.npy +03710193-d81d64c36914cce9252e123654a8206.npy +04256520-f157bee08e60f88ce6fe3612af521500.npy +02828884-d58239c7178651ed1fb7397472fde3e9.npy +03337140-33715bab747f569e4c3aee8e9d3a6ffa.npy +03001627-463fe7f155dd7279a7635bec8b4f9183.npy +03001627-709204dcd233483f242f861207c6d189.npy +02818832-359c25c700ef86bfb4e9891cf4a003db.npy +03211117-2f3bdb6fbaaf9e60eeb8d422649e5f2b.npy +02691156-e88ce288726375ff87bf26680c510802.npy +04379243-9b4acfe0ed67b32a63848853b5b7618f.npy +03691459-9165f1681f4c5df6f63ee8a34069b7c5.npy +04530566-5f1956ad3dd52a69d3a2c7c88c74aa63.npy +02828884-78f68a5f65ef88482056b4bd5d870b47.npy +04379243-9130392b20b977813c41e9c62d62dbcd.npy +04530566-c84cc7d62a9112f7b9d24c378f086d93.npy +03001627-8a53c692453e7565c1fa182c22e95706.npy +04379243-e5140547647bee72490ad276cd2af3a4.npy +02691156-aa0802b8b940b7222296d88107d065f6.npy +04090263-98205844a3267ac6423adc2e6f1b28d.npy +03759954-63f5ef382e8bd0e0727b9c4a6cf12d11.npy +03046257-8426dc58f4b4d94bb43e6e0f22ab9ac9.npy +03636649-1833ac3f2c14e6bafc26f53456c58834.npy +04530566-4d9a23b8b75a412c82fc4dc31c839439.npy +03636649-e34d17542b26773a84aed1cd93567b2.npy +03991062-57a0bb44f5a68151ffc6e457221b9271.npy +04379243-462d928e94689592cb2a965e75be701c.npy +04401088-496270f12655bb84e38ab39b0490e043.npy +03001627-26d0416a064d23f1f9aec59741c69cf7.npy +03211117-792427e9b92c4de63b1969d0afef691a.npy +03593526-ee10db30b91b9683f9215f842248bc25.npy +03624134-2afaf2674a25fd16d444bcd674952301.npy +02828884-690aa4622c4d3246ea1bc0d82403165c.npy +04379243-49f7fadfe67b54c478b3bb39df25d28.npy +02808440-52160c130b4c132244221bef0fa3c36b.npy +04090263-31a0c1adeefa95f488b9635e60aa884.npy +03991062-1cf2f201bb36708be053f54949c9bf20.npy +03593526-7cd890d57c3d5705a0c6f54ff9ff2ca5.npy +03337140-76881763d22c637ee7ecdbe73ef4323c.npy +02828884-597cb92a5bfb580eed98cca8f0ccd5f7.npy +03467517-67f24d338d812f8049e3c7e37819c26e.npy +02691156-3656c9bbd79f6e29f6439977935c2784.npy +04530566-c1b48711737649616a740b8023d40f30.npy +04379243-c9857deb88989a67b5851007eadc6f74.npy +04460130-46a090f0bd14180bf1a48a667d61ced6.npy +04379243-ebae52c84acf994e9e4da01b847d5cb2.npy +04379243-d1e9a83ee99b48a49856fa70a578baeb.npy +02958343-98fa551211d228ef6a089bd459bbc1be.npy +03001627-6bff9667fa51178ce9930a50732a44eb.npy +04090263-59159483028516c55de49355f870af76.npy +04256520-17a768e79ba434b91ca25a4447d3477e.npy +04401088-452b924abd2ece2d58932236a22029d3.npy +03001627-d7e5de817d603fefa123ce0dff5bf4e6.npy +03001627-d1f76ed6072b9332ee558d9fec5dbe41.npy +03797390-159e56c18906830278d8f8c02c47cde0.npy +04256520-4ba2ad7525a7da6c4daf5898cf18a390.npy +03001627-9d9992f7da4c888c7d3c9de9415fb224.npy +02992529-24d22e3257420bc2b785a4ac4a0dbd73.npy +03636649-fc6ca834ee897c2be13f009579d33764.npy +02828884-7f67934afc4f95b014bcc66f599f3e46.npy +04530566-544ed8713bb6b697846f1b9d68a7eecd.npy +02691156-cf61af3c52dae1e0651e8da9cf70afea.npy +04090263-37681c6cd8bd88d1d04b05b0f20a897b.npy +04379243-b95e59bfc90c4a0a266a96e416bad065.npy +04379243-e705fde0d14090d05f2733e561547b29.npy +04379243-827166feab020929811cdd52f3d07553.npy +04530566-c52ab3a375bec0baaff407511d7dfc96.npy +03624134-3dcaa6f00e9d91257d28657a5a16b62d.npy +02691156-cf93f33b52900c64bbf3143b1cb6076a.npy +03001627-753452a3a8f44bd38b69f185154696a3.npy +03337140-b766d5783ca2e1ce4c3aee8e9d3a6ffa.npy +04379243-7960127aa69c0447492d9da2668ec34c.npy +03691459-8bd1d73922ebc098627a66821130f814.npy +02808440-b2a500b97b21c4eeb6adb81b8de263a3.npy +02691156-5c7ef3d5de5ca9a1ca8607f540cc62ba.npy +02691156-ecd761d36abc0fb5250e498b1554a6f.npy +03001627-9d443b06a03742b9bf6931cd2a81bae5.npy +02876657-dc005c019fbfb32c90071898148dca0e.npy +03991062-c03bbfcd33f310155076fe09061f1a7a.npy +02958343-19d49c8015948b742d60c8689a64d7a0.npy +04401088-6e6d7c2ffadc2fad2fffec7af390883.npy +03211117-bfa95d845671c54c26d3b1eda72fa17b.npy +04256520-cb3bb5481f214d6bf51f77a6d7299806.npy +02958343-8fc3cde1054cc1aaceb4167db4d0e4de.npy +03593526-e4c871d1d5e3c49844b2fa2cac0778f5.npy +04379243-9162c1cfbd1e42db9ccce4c6d5bb195f.npy +03001627-fcd25e25dfffff7af51f77a6d7299806.npy +04379243-97b1b1f674df7fd08d413b6cca5747d1.npy +02958343-6ee1f28244a72fcadad3ef3f3ebed150.npy +03691459-6bef36ab570225cae7d74840e6097218.npy +04256520-45ff5f465a6a907488e82c4bb71ec6f6.npy +02691156-99c0ee178c5a4dbd8d8a353a30b33dd.npy +02958343-2ab27beb8a37ba37ac00fd1150223027.npy +04379243-df2d80be5033d200e2af4d98190aea8.npy +03513137-91c0193d38f0c5338c9affdacaf55648.npy +04401088-625e2b043a61452b80d5f0084d375f75.npy +03046257-bc66e7f0d88274ac58308ff4b09ad476.npy +03001627-66312d6c06a24772a8e75a1a0cf7490b.npy +04530566-d76ad4ffab09bf27f3e39f2e17005efc.npy +03001627-e68bb6f55e2454fac7f1f7c0570e288d.npy +04401088-d0c5bdc45a59669a39a4971adc53c51d.npy +03691459-dd3f884d9b5b3c0de7b7e97e5332a9cf.npy +03211117-9a8487c37ea68b49e5a14a547274f040.npy +03001627-33ab50198c84645ef91663a74ccd2338.npy +02958343-a44fb2514e9ab51f79138cc3f6db7577.npy +03001627-7a617f62ec5bb2075e7faf7f49c2907a.npy +04379243-3f4e117f6172555bd7691f54dfc57244.npy +02958343-f36ce0c0cd0cfacba7742c4ce47c2229.npy +02958343-de78fc3652596d3e9ceaa43540dc0e9a.npy +03211117-7a89e5ca49a48bf6fc22823f73266007.npy +02691156-4580804c798365a094a6f19fab16fe62.npy +04379243-2d0f4d977d61aecf89c33ded8af67808.npy +04379243-52ec1d25f2d6aac661d4e2b4b8b99e7b.npy +04401088-88c64c14d4b6ae5aa7636d58d56f8570.npy +03001627-d07675c29d0bd535580b0de4af0eb56b.npy +03001627-7ae6518311bf2f66e1a0327ca4c4d5a5.npy +04379243-f82473746c17ef04f2baf097673c64e5.npy +03001627-dfdc94c658a98c79627fec6651ed13bb.npy +02808440-29aaa8f337632ec125fa9990176f0d5.npy +03001627-7fbe0c40524fd37465ba78ad9601cf1b.npy +02691156-a162465f9664d92a94eaa56dbee38b5b.npy +02808440-302618414a9991de3321831d2245cf06.npy +04225987-55da5b37f4fca69947d4c8697a40872.npy +03001627-3de9a7a40851ceb971a782a4379556c7.npy +03325088-49a6f4ee7fabf08cb362845c6edb57fc.npy +03001627-d62051da1ac1ef21faf575cbae5008b8.npy +04256520-e6cc5fa521f970874c6deb9ede0648df.npy +04256520-68fce005fd18b5af598a453fd9fbd988.npy +02691156-6f96517661cf1b6799ed03445864bd37.npy +03928116-e8f207efd9bf825bb9683248e4a5465d.npy +02992529-31e8327ffa4ba6a87790cd6f6e8952aa.npy +03001627-99ae1b3f970c61fd5b56aadec5c0be6b.npy +03593526-dece4e1eb0d2f202150a45ec52bcbd7.npy +04379243-55b586076edb416ea169b9ecd9e046dc.npy +02691156-4de653411d132abdf1e2558bb9cfc329.npy +04530566-cdaff2fe98efb90058a8952c93ff9829.npy +04530566-e70fa867da6276efa65562f270f71c81.npy +02958343-d9ee9de8527d309cc0c0cae12126488.npy +04530566-bdf142a3fdc97a23af018ffb2ed4ff85.npy +02958343-bb1afdd76bd9555abf3af70ab74680f8.npy +02933112-70b15dbfed77ad2d4da5feafe6f1c8fc.npy +03691459-b06106540932feefbb9b205a4c97698a.npy +04379243-37f684f64af84541609fb05dbd8681bd.npy +04256520-5d27c5cc1395586c66eb0dcc2b2e2221.npy +03691459-f8aa418d093076c4c194eaff7ea54233.npy +02924116-29c7615460f943a36ca2b6e5474aad11.npy +03211117-6eaba6819fa9b07a37a807a435008662.npy +03001627-fa7f42b395c3cfce520ab6214a789faf.npy +03691459-a55295b8538238ad6ab2ad957c1db573.npy +03001627-fd3d59ad4d0ddb44e15475f0b1eb22aa.npy +02818832-3797bd46f01466f8c3bd24f986301745.npy +03636649-3bd2db092bede98957e3b0a0099797c.npy +02876657-83620edd3ecbce0de3bf00cc25b4223.npy +04530566-35857ac61388f9fec2912ef1a1302821.npy +04530566-25164e1af059f8507129983ba40a1750.npy +04379243-8438555826c5a19079368d1198f406e7.npy +04256520-80c143c03d0d7b3087752c136d371e3f.npy +04379243-3222d3e3c90f4a3238b3634f169dcc74.npy +04379243-52989e315ee1d3839ccce4c6d5bb195f.npy +03001627-486863b7fbd169fe67903707764646db.npy +04460130-8af5e20ddd4ac314d3e8c09edf9de80a.npy +03467517-aa8f6fbdc184a732cf45555a18e7351a.npy +03467517-85bef84a26a91bff9ce363b13bdd195d.npy +04379243-3ab1e5d4f889f8f1cb7b25164a43bff.npy +04330267-c70176038a545f3f9a6c869309041adb.npy +02933112-92aa3075799e275a3fe047712e43e185.npy +04379243-f2893a87ec37f8b3781cb4570305e329.npy +04401088-1d53adf8f82d223db0a79e28606cb167.npy +03001627-fd31b09de6b3a75666764c53f1bb4495.npy +02958343-50af70a51a2db34d777b3c68b2536729.npy +02691156-eb4396ab17012b3c9a6e43b878d5b335.npy +04379243-336c81a0546a4ebaa71c812e027f94d9.npy +02691156-71e9496397481233a8cba409c4409ba9.npy +03624134-cff4276a47f1a4e29d5aeb7097eddbda.npy +03001627-459a01afd2d5d4225267ac530b1d88dc.npy +02958343-a0ba66028d22cef6975be43df8325f3d.npy +02876657-e37cfb42fe03034842ab55d7ba3461f.npy +03001627-88058de808184f3937b2bb75885cfc44.npy +04379243-6b9b672041acc540e61062b89cc2de3b.npy +02691156-3c6c4be95d2dad2937b25178f54477f4.npy +03001627-9518130aa4876f146ec0232dc7739bc0.npy +02958343-f605c1f4d1be8d00f63ee8a34069b7c5.npy +02691156-e9df546c1e54af0733d72ae4e2c33411.npy +02992529-ee7d2d986f2c989ac66dc18b3cf1700.npy +04379243-f2bca089598c94f71d246659f49791a1.npy +02691156-86f2c71ef3700ca2cca362d2a61f33e4.npy +04379243-b685208ccf38786a6f1e07a56c129dfc.npy +04379243-1aaaed47c3a77219f2b931201029bc76.npy +02808440-7e32602a20e478ddb362845c6edb57fc.npy +04530566-e5c3835b9f3ae3634a27b0b4657ac8b5.npy +03642806-33b46231ff0ac2e46c8f71c9d7a79dc1.npy +02992529-92ec69548761efc61f74e5d5bf005208.npy +04256520-dd6f44f5b788d5963d6d3c2fb78160fd.npy +04530566-f81ae8a4452ad290aa9bbcb26e1c5ea7.npy +02871439-1e95c521f70972a2f5758e5628273c4e.npy +02691156-3cdb3a166a13e44dafd477f714c68df9.npy +03642806-606f4b61d81085d1adbb6cf5d72fbe37.npy +02871439-962a500ebd7175dc702cb0c2071c40aa.npy +04379243-7327bdbb165b8d034761d0d07b9cb991.npy +03001627-a113c1f24b803d37bc5a6eb75687367.npy +04530566-b1dea53e9995486c1b4a375734e87fc5.npy +03467517-f288cd2146b8f4c1f0e1c0df18936d05.npy +04379243-c103c0f93c690f5067dc358060e3c47b.npy +03636649-9cdc3191bede2d0eef3a2c64cef919d0.npy +04379243-e9e47d6b53c915f3e12186cc8c5022c7.npy +02933112-d6523ff3e0acb768490ad276cd2af3a4.npy +02808440-e34616db6be63a881c17aef130ed6213.npy +02808440-7c9e7480ab034225dcfe5e111166f221.npy +04379243-f3164e1781a296597f6f00dc967c386.npy +04090263-5005f42fcdf718e558f55d364b38127b.npy +03211117-3c495b3a2c2af890acc9692a1d1e7dea.npy +04090263-e6ef0c7bb7c73e4bad4c449f974dc221.npy +04379243-f7ef48c7de69ae03cea3bc3a9009695.npy +04379243-b9943f2962f4ac9840ef1c8b63a628f9.npy +02924116-b9fe8bae926d5cd8e5a1c12b50998c10.npy +04004475-70dc97e3f5f7465e9a4c189047192f81.npy +02958343-129921679aaa3009e44df9b78a00d12c.npy +04379243-13c680c1fd4d1ab4bdaed8eb424ecfdb.npy +02691156-7b3bd63ff099f5b062b600da24e0965.npy +02691156-b4de0e888e562f40873ec74c119307b9.npy +03467517-8d9fa6f14ab6bb3293f0194265a9746c.npy +04090263-bf89af91f6f699a3b758d4b2d9dccb00.npy +02924116-6f2436c52c0a78947d2d874548544c4e.npy +02958343-8aacf6e90bfa4610becf71e2e014ff6f.npy +02958343-2c407d592623011eda2ff65a113288d.npy +03001627-764abaffc5872775f0dff71ec76b46f7.npy +04379243-6ab805062d5d945d53e946fb2184f0c4.npy +02958343-6ae21b4b5aa92db4c79d3cf109867c13.npy +04530566-6f5df8d6d0d77039be286ae2fb79c470.npy +04379243-cc2a9dd5dd6fda66e02a8ce45e810a15.npy +02808440-1257e60da04ab350b022c94235bc8601.npy +04090263-e1ba58d83c23c6d1fd4f49e0598b199b.npy +02828884-b9263e32f3d7a9ff81faebbdea6bd9be.npy +02828884-aa88a7bb135e074e2056b4bd5d870b47.npy +02828884-42be414abcd4f66113c01fa2f350f6d.npy +02958343-55e0897c0ac089a6da5cb3be8feeaadc.npy +04530566-461517433312704299986cc2d8a2c28b.npy +03001627-dd0e48963b73476f7fa93550ab8061c2.npy +02958343-e14a04dd31112dbcafe1d4530f4c6e24.npy +03636649-71dffdee89efe07cdff00b2637ddcbde.npy +04256520-207c81a9bbdccbb8e8058cf23f6382c1.npy +04379243-175b6c97de52974a8f27e336794e60cf.npy +04401088-ceb47998c0ffa704f1cb19f636b1c2bd.npy +04379243-27a463aebb289175f51f77a6d7299806.npy +04530566-876a4bea4fc35db067fd6c1ab7f8324.npy +04379243-4cc695f3d582116fc655d08d986ea26.npy +04379243-14c35137c3612fd0d409d3400adf2d96.npy +02958343-c314a4de4aeffc0854ae303007921fb6.npy +02773838-39381a2718d2a1d4d5f008f38a566dee.npy +02924116-42bc15ea6374ca6652470de2774d6099.npy +03211117-65d100a427b8078de1fb8c5792a5768b.npy +03001627-2ed8d45343a442097869557127addfc0.npy +04256520-1cd54be30a2aa4effe3e4e51c69744ad.npy +02958343-1feaf720692bdacc27a1a7fdc1941283.npy +02691156-6cdc9acb022b2d7d98aeb62a3dfc01d8.npy +02933112-cb4234b5106ee84dfba786d6c256035b.npy +04379243-12e1f83d5fb0af107d0cdce142e729b2.npy +04379243-64e65f881d846d9235836c728d324152.npy +04379243-80b2eb0e500bca46f3412e3273fc1682.npy +03593526-9bf9f7dc9f7160cf82db9fca4b68095.npy +03636649-e515076a09191d075fa6da97b9eb4a2f.npy +02691156-d5b08d1355502d325f83a2299c09f64.npy +04090263-823b97177d57e5dd8e0bef156e045efe.npy +03001627-1b6c268811e1724ead75d368738e0b47.npy +04330267-8b3b891df4dfbe2d41965be83b7745a.npy +02933112-195b0fd745df898d86d53ab0fe94e911.npy +04379243-79e7911ce615b63078831722644c29c3.npy +03001627-1c08f2aa305f124262e682c9809bff14.npy +04379243-a882ada8bc14e42080d6227ff9b21190.npy +04090263-42b7e8c381cb392740112771efe22586.npy +04379243-86a7bbaceee66eb36b63d78a2e71a26.npy +02958343-3264f78bfc3bc58c9213ea6cb12e4e3c.npy +04401088-cb9e8cd0a29cbb26b6d41c42f7ade8c8.npy +02933112-dca6f5a582517758eab2bd7322386ffd.npy +03642806-fb641fe28d0f5e73d51fce576fbd4600.npy +03691459-e270c383e0d9c8e0ce029fab54b6cfbd.npy +04401088-ecab7b7bfef8d7f423575ca8cfe7da9.npy +04379243-44a3f66a0a40f21119fb4103277a6b93.npy +02933112-134055516ed892913ba1c51b82b58419.npy +02843684-589760ac1324fcce5534ad7a7444cbeb.npy +03001627-11506b96d41f7d3dd7c4a943f33e0384.npy +02958343-3cd83324de4a2fecbecf71e2e014ff6f.npy +02691156-707cb24ab99bff07e2aeeb16e93626f.npy +02691156-a6693555a4c0bd47434e905131c8d6c6.npy +02747177-9e2a1751b9129b1132fd0b3f17b0d6c.npy +02958343-5a91741d3a0ca58cf200a72c9245aee7.npy +02828884-117f0ee18ed91ea2d4d8765e3910f617.npy +04090263-5ca2752062ddaa0e21fa7072ad9ba0ea.npy +03001627-c69ddb5376e22cb8c4e8952b27b5f370.npy +03797390-5d72df6bc7e93e6dd0cd466c08863ebd.npy +02992529-77817771db0788d3241d076ab53023c1.npy +04256520-ab2f0f582e3fa5b1780c9f3df5b1ce52.npy +04379243-e5aba07854af35d89e6a137715910e1f.npy +02958343-1d4eaafea3ae8303ce94fde2d6224f79.npy +02691156-c4433144c905ad0b71d03b466c72ce41.npy +04256520-d8087961b06c9f7d4b3c42e318f3affc.npy +03001627-56cf253d14abfeb92c528d33bca1ac2.npy +02958343-fd3b75f7f1e9172fb6f657757c95f74e.npy +04379243-bbe30ffa9234cb3af268f6180933aa3.npy +04379243-658138c87c9184f279368d1198f406e7.npy +04468005-2a89a00cd90ca5b844b1f4461f7a073f.npy +03325088-8267bf624e6234f776c18e71fd49c4dc.npy +04379243-7135fed6de70df8d25fc264b1d80bb27.npy +02958343-8feac5dae8852d2e175f8ba1fccc4d0a.npy +02992529-9728d42d4de74ff69ae0ec37bea5341c.npy +02958343-18ff13d7f181e7625fa21635eac9e4ed.npy +04530566-57b3fb45b6c484c8cd9052ebaae01826.npy +04379243-97661c4a58929ff2d9886e45007f4f88.npy +02958343-cac12f8e291f3d1fe43409f9be327bbe.npy +02691156-6778c46aff633538c0676369cd1d063d.npy +03001627-2364d6cbee1425fdc3bd24f986301745.npy +02691156-d0b7060229617935d2a4e6ac398c976f.npy +04379243-392b7f2c8b72ba54d05b3855d81c2ed0.npy +03001627-c88eb06478809180f7628281ecb18112.npy +03938244-ef5ee3879df49ce7f5b2cf5056edd6db.npy +03001627-54bdda983ea87dc9d727e9f790cd597.npy +02924116-b478069e03e9bc07583e351622462335.npy +04379243-dc61d1287fff3ebdd2afe8d5254a0d04.npy +02958343-6e5340cfe979238998ff545c3abe3e44.npy +02808440-2c217197bee9dfbcb362845c6edb57fc.npy +02691156-9825919cffec79701944f01d3ab2091b.npy +02958343-e21ff1f90750ab24b8085998d32fb54.npy +04379243-6f8f9aa1ac705db9fcbe4e14ff0c4707.npy +04379243-cb48a015b203b3084acc8059dcf0a054.npy +02747177-c3b31dc8c48265ecfffc97a61124b1a9.npy +04379243-39dcbf2d99d0e7e778104ea7bb00d557.npy +04379243-e3da34a62e53689e82028a475156419.npy +03046257-c04f2df69acd7361bebd3c0c0c70fb03.npy +02958343-c887bed724f4a30c31d6c59225b395cb.npy +03636649-1833ca8ab16a7b7a43448fccd73e2957.npy +03001627-77fbfd2f194ed73975aa7f24a9b6003a.npy +02933112-15d3297d200f8979c59350d819542ec7.npy +04379243-372a6ff9847c899bfdb026c58bb97e2e.npy +04090263-6bf8c32f62fb38bce1f2a1daf140ac9f.npy +02691156-b77aae4fdee662f487dedd9dfc0f1d4d.npy +04256520-c81d3992ddcf2fb41b17743c18fb63dc.npy +02924116-bc544e6a141e26227c0e7feb0b8d987a.npy +02691156-885b7ba506c9d68ab6ecbbb2e4d05900.npy +03211117-9727d690fe514475ac5153554deeb14e.npy +03001627-3b342f2ef792ff6a6006cd11c597105f.npy +02828884-9f5ae162a075ec741e85d47a2a5461b3.npy +03001627-a272771d6e9a29c2f4eefa83fb709ec6.npy +04256520-556166f38429cdfe29bdd38dd4a1a461.npy +02958343-6a8058611e45e7d243ff4cf09319bd2.npy +02924116-2f1b2510d1481e9573ba5c85a4ea149f.npy +02691156-22d0561f06900e165140beb2199de2af.npy +03325088-b6a1fb06d6658d30c36fb70296e45483.npy +02933112-b99b7673b0927283b1732c7d45a02ba0.npy +03624134-681cb407b784758b74d6554e3155d415.npy +02958343-26e2b2920a2330b2cdb8ce1e61248143.npy +03001627-2ff12e3a324071c0525a3d382a240768.npy +03624134-43ec2092d43691b4d7d3985b6fde9645.npy +03001627-a69c999cd76e29862f8c68dc62edc38.npy +04256520-83ce58add39dd471d314007fddce52b0.npy +04530566-597975f72770523eedb8bbed3955f432.npy +04090263-fb9a94c179ce70c4561dce3fe08634b7.npy +03636649-a500dac5ab226476b9445129e5607c02.npy +03001627-4363eb3e65ada91ae3f7a74e12a274ef.npy +02924116-239459cc296a1b4a995425f067333fd3.npy +02876657-7984d4980d5b07bceba393d429f71de3.npy +03001627-6fd485a2345c3dd69233bf560301e53.npy +04379243-413ceae95ebcb6b5707cdefe012d0353.npy +04468005-62f8ee99e2961024834b1a533ffa0490.npy +04379243-4cdfd605352adcb0da13974b3533fb59.npy +03207941-4442366563c116fbdcddd0cba5e9fbec.npy +03046257-22d83db25a203f8535208cce48b17170.npy +04256520-ff51b4ea697e7bd2a59fc0a73ebddd23.npy +03797390-513c3410e8354e5211c7f3807925346a.npy +02958343-8545a6862135379c813e8e6859b9f2f6.npy +04379243-6b5cfd0de413ce8841b160b9adc112fd.npy +02958343-1d82451a55d19cdd711f9e3a79a13dcf.npy +03691459-c37c230e15f8c561ce029fab54b6cfbd.npy +03001627-6333b3de61610070cb443b1c1b54049e.npy +04468005-367904ef57b82d848be7c8c5fdb9bd6d.npy +03001627-23af2a09ca2509f817dc12307fee9432.npy +02691156-d6b4ad58a49bb80cd13ef00338ba8c52.npy +04401088-68376369681e50847e814a763437cd9.npy +03001627-c59cdd1537bd75ddd0818327fc390a5.npy +03001627-50e97407fe2f7ebaa8135ec53db502ee.npy +03001627-1f343169e6948a2a5b7d8e48ecc58356.npy +02924116-22509148f79b14e09afb67dd284d342.npy +03001627-639e40029ef06d6f7e67c36deaaa271e.npy +04330267-f4a1b9d53784e55682b4ca3750aa2fb.npy +04256520-50a4aa069dcd171937b2bb75885cfc44.npy +03991062-b036923580ff3db6eab2bd7322386ffd.npy +02958343-6f1888091dcf4ca550577cf04f3bf74a.npy +04256520-3b7f2867c3d56290267536df1b0cc6.npy +04379243-e460f8b0797b44b06a20dcde106482d4.npy +04530566-507e097913d1364bba2dc6b0ec935a93.npy +04401088-8b08eb5ebea05e49a3ed2b429444c197.npy +03467517-ae52de8945d1626e79138d56f2e3aef3.npy +03636649-8937a2d361775c68aafd61baec633e88.npy +02691156-c5e999752db444eb91a464c5de1b632b.npy +02828884-691480901ee9f047ad5067eac75a07f7.npy +04256520-3319a9b24416ecea7ff6ace05b36a5.npy +04379243-5ba5f9648b50ede83918f23e2305ede2.npy +03001627-b709b41d6bafd77480cef45d94d1481b.npy +03001627-d6e0a95f00c7af6fbae0ffb97058b7cc.npy +02691156-f3e2df468c15795872517bb0a6b4d3ef.npy +02992529-71240556952395e0925bda4660525f97.npy +02958343-886246c286351bc6cc010a80df5d3c87.npy +03211117-6e26dd3afa4eb0a889cc5332e945f058.npy +02828884-77ed241c90b88a189f197237213064cd.npy +04401088-bc301249d58b89b638d913262f25e96d.npy +02691156-4f3a64164fbe16f54c2c88971423d0be.npy +04256520-aa86df339042feeba4d9f38918617d27.npy +04401088-5ec85395159a335221844676433a0aca.npy +02958343-98a4518ee8e706c94e84ac3ac08acdb2.npy +03046257-fac633a56e88786559d14889fe22f10.npy +04090263-280896ad10aa1272ba11c8c9c0c3770d.npy +04256520-7a6c2247a36d93b6f4553a0692c9821.npy +03046257-fc5e57ba9bade79a86a499d1a4d80ea4.npy +04379243-cb31b6293506eb639a3528690d225ee1.npy +03991062-4d054c0a0c2fd8e4503adffe35460705.npy +04379243-80a2c69d8ca29bd136b0f2a1430e993a.npy +03001627-be50a399623910e1fd03f420a0b8656.npy +03325088-5978d6e26b9db10db362845c6edb57fc.npy +02747177-e6c0e2578876d6fd808bd51049b82b48.npy +03636649-5849d1a237cb493c659dda512294c744.npy +03593526-90c112fd862cfca1cb497d0953a32f5.npy +03636649-859182efd11b40669018dc7bde518d9.npy +03001627-a7dbbe66942a7b7c40ef1c8b63a628f9.npy +04090263-a8e185dcb791be07ebf69cf03ff6f737.npy +04379243-a5071459f9774ff43215fffb0cc2c59b.npy +04379243-2dc57230d14506eacd6ce29440b718cf.npy +02773838-45f56ad8c0f4059323166544c0deb60f.npy +04468005-61a269d35f68a189ceeb72b524f3e0ca.npy +02691156-893c03e02dd0e1ad7d64cad20089f027.npy +03691459-5584bebdc80ecb42c9d5b08933b9e0c1.npy +02691156-7a80f3950b5e31f6b0d51feef5761dce.npy +03593526-b20ca8a345790b03d3dad974dc098fa1.npy +03001627-7d0467dcbd13505f2314deb821327685.npy +02933112-b30ee0cf13247fa7f51f77a6d7299806.npy +02691156-934b1ff5cf72b25c4310636931b68fdb.npy +03001627-4362e715455f42ba9b9f2eb77f5e247e.npy +04256520-36a6725f30a73f0e91ffcd1d3522e1d6.npy +04379243-d91c5659ba4770b3650590f03418c5e4.npy +03991062-2d815a9139dc24e5adfef0837ef69723.npy +04256520-85bb2ac1c8896881837d598c1c392d83.npy +03211117-4270cebd8ca0f2593dfb5aeeb86be115.npy +02924116-ea4feb09b8f4c7be41cefd10ce5d6cc0.npy +04256520-8981c0ffae1af00a50fc88ed745bdb67.npy +03211117-42fe49800a1e65d18a6b1cf8170af1b3.npy +04256520-b7cd67499b36cf60417a8f1d2c94eaf6.npy +02992529-8ec3b148b8c608a0562c671ec5000f23.npy +03624134-a385e6b7a1953838a1c6ab435d705f36.npy +03211117-e42fdc1419328bd7efdd13124d5ebc47.npy +03991062-fc7ba0ce66b9dfcff155d75bbf62b80.npy +03691459-a2b1f43ffd80d53aed46d95e646228af.npy +02924116-c97f1811bd4104e652470de2774d6099.npy +04530566-b998ce1c2a335d80868bf275e08c687.npy +02954340-8338e10954ae6c5296b84415a3f1393b.npy +02691156-dfa36bffe436a98ee0534173b9189765.npy +04256520-fed8a89a89c96271490ad276cd2af3a4.npy +04256520-8243278b0b5881fd41ee82033240ca28.npy +03325088-2a7001af4f018827d86a78ce9bac042d.npy +02828884-aec1143f9e7375846555a8578c9b250.npy +03624134-d1c757548ead4a4d8d03ca4865da5b6.npy +02958343-6188f5bafcd88523215d73d375c978d5.npy +03207941-85f3f3bfec4b787814b35a7d7cea7130.npy +02933112-d89866af0e191e40c4ac7545c4775b33.npy +03211117-46c594660d9fd584c8ec06d23612ae6a.npy +02691156-750000e25d4078f64e61a0c2eaaabe87.npy +02924116-6b5c172c49f15064e550942ea36e5443.npy +03211117-542ea1fa89d51f12dbb15541d28bf6f1.npy +04379243-c5b83c681c085f2195493ccf8f26ab2c.npy +03691459-300d579cb4dea9338cbc76a30015552a.npy +03691459-b859938280d0c7346583871b5c274818.npy +04379243-d3a72603f65b921b391e4d6c585a697a.npy +04090263-5fbdc4c221b31d5b93153dd7e0ee121c.npy +03337140-a4a939a0bd8f8cd9492d9da2668ec34c.npy +02747177-6d21c75bbe308322513c73fd461b230a.npy +02924116-4faf2b87d20ef1d6ca2b6e5474aad11.npy +04379243-5f31ed4efc21b67711a59b122fb65ee9.npy +04379243-e222abacac76f2a5470d3ca356fc4190.npy +03691459-70d2fc496ad0da4aa7f1b033d01e1364.npy +04379243-8f440a7c0e2af79f3ed0ffd59feeec00.npy +03513137-50c322394e1587c54e5e6ac3ef6bff73.npy +03991062-5dc2fd41c59a87e1a2c59a4d90e63212.npy +03691459-cb320fd1f48f60d347e20662b9cc792d.npy +04379243-485b69363fa53a5ec35131da26f8061a.npy +03991062-312b2a3cc205857ccebb4bcb108e5022.npy +04379243-c1d44782ac45d6fe3671949e4f99cc76.npy +04379243-b77556086eea0ab181187d9890753294.npy +02958343-24b9180ac3f89ba4715e04edb8af9c53.npy +02958343-998f600899c76e4583653a771e25099b.npy +04256520-e1fe7e3d2dbdfda9bb5bd941c6665c21.npy +03467517-ede91ce18b53368484d922f11bc5db6e.npy +04379243-b62d45745434ac46c4cfe384be4426c3.npy +03467517-de9ca0c3e32f907dcb61cf5d9c47c2c7.npy +03593526-c13437979b41c607cbcddf7f55015a5b.npy +03211117-b47b05891c5161189722ef9ae1c74e1.npy +02880940-cda15ee9ad73f9d4661dc36b3dd991aa.npy +02958343-42ad4b456bb964e1d57c4849288ce494.npy +02958343-43be650d6fd7468fd9952f9e00a53f0e.npy +03001627-4b785965d54454a4e82cbac5cad4b7d3.npy +04530566-de55eb89c357cd5baff407511d7dfc96.npy +02808440-f7db8bb845d6024e7935a3238f63108a.npy +03001627-3b2c9428da926e939ae03736d955651b.npy +04379243-33cb211cda607e9b922752cea2acdd17.npy +03691459-58c7ab29b2cb73171e652fa812161367.npy +03797390-f09e51579600cfbb88b651d2e4ea0846.npy +04379243-f472e9e63984b443f155d75bbf62b80.npy +03467517-977d172a08113bdc1082f2ea630bf69e.npy +03790512-5742426c4c9fa2e4b37378f3c85478b4.npy +04379243-1f239239d1039d60ad8e5e47362bc281.npy +03001627-5c9d582488732ee0d7f7a4c4609b0913.npy +03211117-8798383e9e4181d3f4c39a35147bf949.npy +04004475-1773dafc24ded61cea3aa8137e136b5c.npy +03211117-47cc124678ef84c53bb4a1304fe504d3.npy +02992529-45301b15dce2724e483a0f6665d9ffe0.npy +02828884-5a0f0d22870fc83b2056b4bd5d870b47.npy +04530566-ca586d3aa941479ed95226c21abfd72.npy +04256520-4a7cafc9f91cde86200f88c4e37ac5ad.npy +04379243-dc868ad981c23d22f91663a74ccd2338.npy +02828884-f21333a7141e7fbdad5067eac75a07f7.npy +03001627-570ee99e247c6cb0492d9da2668ec34c.npy +02958343-7486c73293cb8af3175a3b42530b4c51.npy +04379243-6daca3df48c0e8491cfe337d09cb7c35.npy +04530566-6fd433c69f9c498a12d1578498a3b488.npy +04379243-caf7f51add1284ab7ae016d7bb06fd0d.npy +02691156-9a007813a38638c379a04281ec8c6618.npy +02691156-a7a0e7eddf4ffb8c19378fd691582500.npy +04468005-506ebcdee663d5ba52470de2774d6099.npy +04379243-fc7ec69f0402424de27790b0ec8671f7.npy +03001627-d13eb19745344ae5fb0eb7e753c06942.npy +04379243-d0578233f05855fcf58998c8c192d0a9.npy +04256520-c344088939a4d4e4c8687ff9b0b4e4ac.npy +02933112-c99ec52d66a6e89c3c8d0fdfb1cc2535.npy +03001627-7f14058e6bf50047ea1d47b7c8c17fea.npy +03046257-b029b05ae3761f0b582ed853b74eeebb.npy +02828884-3e59aa33fcf672b8f4fb4dee5181bee.npy +04379243-4021d983b2359b2d4354f9eea413cf2c.npy +02691156-b976a48c015d6ced5e9e2656aff7dd5b.npy +04379243-124583cd4b54d9c01b17743c18fb63dc.npy +02933112-9f07ee5bcf6a4b11151b305e5243d9f8.npy +03636649-1e0f7ff92144792ac3ab13a0474803d5.npy +03467517-ca3930d49357ef676d9376f644442e99.npy +04379243-b0b704778e9e06ee22dc61df4cdad42d.npy +03691459-f9a615ecebfe7ae1b27175774c9e33e9.npy +04379243-a422fe1fc47fd85d59a230640e61666e.npy +04090263-45c8f8e154fe9642220da6190e4d5a0b.npy +04379243-3253af88a5568d6e5e0e77e9cf965949.npy +03001627-69314c01e2b6ef2a95a4f7ae0be930ac.npy +03636649-102273fdf8d1b90041fbc1e2da054acb.npy +02933112-cece5afa11b5ea16d2096b2fa6f98cc7.npy +04099429-cdc4b9b25334ee6f789a31ba8b4b1248.npy +03636649-5c8da21eabad2dfe3d59e2f2ea85dc18.npy +04401088-912d81dbf33f20956aedbd2a02b96953.npy +04090263-9f4658773bf2c31ffbf44f447f38c175.npy +03636649-928505a660acfc20c7e400d2701a92d3.npy +04256520-42b297f23638f17e27813b202e608c61.npy +03046257-945d98aacfb5842f8e8ef5f0615457e2.npy +04379243-7f3e2154bbe217d4143e713a73e832c1.npy +04256520-1a477f7b2c1799e1b728e6e715c3f8cf.npy +03211117-5c79b27734380b011a9e831992816ab.npy +02958343-d8b50ce6cbfb56a4786993ccbbbff425.npy +04379243-dcda90e411cb4e35506d1e1cc84da713.npy +03001627-5623d0ec9efedbc9d4da89766e80607a.npy +02958343-2236a1b9cde71eff13d31c5a107f3c4.npy +03211117-2ca1353d647e5c51df8d3317f6046bb8.npy +03001627-8cb521c0e96b349d65ba78ad9601cf1b.npy +04090263-da50ca3dcd5aaecd8bdd85f9e4c21fcb.npy +03211117-18371c836b01c024b41d52ced3f83dc3.npy +02958343-d9867d92edba3d0cb96212c8f6cd06e.npy +03001627-e0276adea0d4f4bf1783a44a88d6274.npy +02958343-dfec37059dcbf6e64819e00d73fd49e1.npy +03001627-fc0e86a20a9606493cd6abbbeca4e2ad.npy +04379243-8d01e61b216324d0f9814818e8ac1c35.npy +03001627-6f8dfc86a34548dfb0380c06db6e7e.npy +03624134-fba0688dcfa8e2d6b9db80316f5d0ba3.npy +04379243-83ce738c3cc05c54283b00891f680579.npy +03337140-7d08f0d49ba912bc91c352d02061b3f7.npy +03261776-ccf84f2cbd3ebeb247ba1bc05b9a0f37.npy +03046257-f36af79f59ace6f3b48a711df82173e.npy +04530566-e88c7403ff401716b7002bddf0942f8e.npy +03001627-3452faac2f4ef4d1f89f4ae158f2441.npy +04379243-db4f8c9f1c62e421efca4f7cb98e0c29.npy +03691459-8aea25f1090e419c9f78b1e1185445c4.npy +03636649-c7b77a991430bf08b8812f80908a0273.npy +03337140-1bee7b073a38d30a4c3aee8e9d3a6ffa.npy +03991062-f74e2aa18622de8872652f4081ec5a77.npy +03948459-c29bc7b0dcdbc2b9e1f2a1daf140ac9f.npy +02924116-7e1ebfe89513837f4b49e2e4c84b2e43.npy +04225987-c4b7db8e09375b4d6830ad3775f4cffc.npy +04379243-eeb6784f5812bcebb281680297eb79f2.npy +03797390-e16a895052da87277f58c33b328479f4.npy +02828884-fc301ae04efc46cfcb2a965e75be701c.npy +03001627-d1e9d5b534c77a2a14b96b665a8ac321.npy +03642806-aaebdb95de0459f66a51abe62a0f8cce.npy +02958343-68b4a03cd8d49553e98e65cfc071e8a0.npy +04379243-139c9b504cd85237c5984c8ccbe1a38f.npy +02958343-50e3333f66829c8fbe40bb45ea25a041.npy +02828884-9787c8521ba8d46b5b83c5170da4c6c2.npy +02691156-c5c726006697aa19b5666ac9dae008e8.npy +04225987-fc5c4986b2661d848fc8944fc8bfc667.npy +02958343-3a0c0927ed24090355f11dda63ed3832.npy +02691156-47319a4f6de68c2966cf1b4a8fc3914e.npy +04379243-3b391b1f9337fb5490ad276cd2af3a4.npy +03001627-90bbf2bd1acca50fd684faddec3c0090.npy +03636649-fce6b0ca06f8a565b45df535caecae62.npy +03001627-3a95602170ff3fa89c0f0342c78089af.npy +03001627-d93133f1f5be7da1191c3762b497eca9.npy +03001627-8a9630332c2cb42644ac83b3e97ad658.npy +04379243-da0ee60c93c215a05b30881dc0ecdd7a.npy +02691156-dc74cd06430b61f478d9c09d692f9057.npy +04379243-9c71de3e26788e20d810b14a81e12eca.npy +04090263-7e13df65e9fdba575814fafedc6971c7.npy +04379243-5094e6f7e49f2006e6942c5426df6055.npy +02801938-a2038457c94b4a5a36b0f2a1430e993a.npy +04379243-2e3037a285fd8b5c1be2a853ec4f9e8.npy +02691156-b2c69aa6c8d78b59f119374ee5d5f944.npy +03211117-801812bb859e6c91f9786f6e93041cd8.npy +03624134-c67be2da5eed3d10d50d1e618e5eb2bc.npy +03211117-9329eb153c1e8b4d8479362ee6ff3679.npy +03001627-64067f7029087ee07eaeab1f0c9120b7.npy +03001627-51375e5aaac17a8ef7628281ecb18112.npy +03325088-13b8c245f4fdf1238d28f213d83c9d3e.npy +02958343-c4c21e09e91292b03f82402961906323.npy +02958343-5ebc7e111e9d0b5d473f10e6caaeca56.npy +03624134-93b1e4a02037c52e679c9e94dfb2276d.npy +04530566-4ec2f4afebc5933638d037116a032a18.npy +03001627-4a367285ab5c22d07548800e3d70d83d.npy +02933112-5ff7e1be775072e5824662341ce2b233.npy +03636649-1f4df93fc1ca81c985bde43adc8959db.npy +04379243-224be4e98e6edc46cdc7385b337a3db1.npy +04379243-2f4d4e41a5ea61df8cb5d9909aeb1309.npy +04256520-a0a164ffbbbdac8d52979c729a1f9cc2.npy +04256520-b2f2058ab083cfa0a8055fb11b774454.npy +03001627-3776ebfcc23e6d87cfab10986e008a3c.npy +04379243-376a1d212ab8971125f61c02205f9a5c.npy +04530566-409ff4fbba1ba94adab1bb7802748e9e.npy +04225987-871516a54b6c8689615c01c6c616fbc8.npy +03467517-e0d74618e316b0f16d9376f644442e99.npy +04256520-dca3a1737e2e3c5c6d0fc9460109eda7.npy +02958343-49defa8dd73d03f1a7fd25564c2e888e.npy +02876657-2eba1ad799a00142938c8d9daf9b36f6.npy +04379243-75234e713a2baed84d5f12fa5114b4e.npy +04256520-1667fb24efa940b9527e7f2c027f7469.npy +02933112-9c87e3b439c20e177f1513678f5ee92.npy +04530566-29c5c9924a3e1e2367585a906cb87a62.npy +04379243-1d3d621e02b8a6edc6fcb6f3205734.npy +04379243-75fb953aaa9924d1f28b9459ae3635d3.npy +04530566-75078bd36089fd98243f62fe7d2ba690.npy +02992529-d944c42ad08401651e5d846d206adf3d.npy +04090263-af960bb41e705a579a6e43b878d5b335.npy +04379243-f54945d1d185b387659dda512294c744.npy +03691459-d458f71eedc7146994fa1ea146084110.npy +04530566-7baed55a551f03efa27ad5a09bb4c2bf.npy +04530566-bacbb452a0f6917a663e90eaf6b4ca52.npy +02933112-147eb60e7a6cadde4da5feafe6f1c8fc.npy +03636649-62e887efeecdc1a31ebf42c64df00eb6.npy +04004475-fc9bc191134f08ad18dff33f5d779e3.npy +04379243-83c5f5d8ab0733093fa313db82fc9cef.npy +04256520-8e7d422141080fee59f8e31ca87c470e.npy +02958343-8549c4948c7285f438acd89c0735f4f7.npy +04379243-b158eeea059f2c7484edd435e02f1ecb.npy +03001627-d5d18ba694ad228346b9f3b6ee20ff4b.npy +02691156-221c079c90d4d5779e9cd6cd13c91bb9.npy +02958343-ff809d58a66fb4e85174ee1075ae80c1.npy +04401088-2fe9e8fd2a7c512ad1f278e1513f3b7.npy +03001627-c5be8052dddf9e92283b00891f680579.npy +03467517-8c14b3b474245ce9465b60d363b610aa.npy +02801938-242e6c21d53890a236b0f2a1430e993a.npy +02958343-52c0adae9be5dba12e877e82c90c24d.npy +04379243-fa5dce1043f44c06ab88e3acae6e8bc5.npy +03001627-274189e25f44397f51f77a6d7299806.npy +03001627-e344e50eb6754cf890ef7803f19df417.npy +04379243-7e725fcf5f56b74bdfef331c9e51db71.npy +04379243-2ca0370bb8ba5ad0e46a4046edfd3265.npy +02958343-fd243c10d91f08e46e282bcaec079702.npy +04379243-b305fed48f77f5d3b40f0ac0fb9a650d.npy +04090263-d96e0f2fdcdfc47cf1cb19f636b1c2bd.npy +04379243-44ebc446b2cb44b0c12f5058c05b3979.npy +04256520-e9017aa5115303957be8ee92c39a9d4b.npy +04530566-fe84b8e3bf172880f54a2210c7b2aa25.npy +03001627-961396e0e5e46a4a208462e8bafe70e8.npy +02828884-3d470843f013f9d8c9fd4914d3d18461.npy +03991062-e089186adbcdf495c0781ed2e47426c.npy +03325088-34faf4adaf07fd9dbd490710936da71a.npy +02958343-919b95beccb25d2eaa3fe7369efb56d4.npy +04090263-2315893467e8b5eea50ef3fc203c6ba0.npy +04090263-ed9225ab8a02b0fd4b349e4b3dd5565e.npy +03337140-6b4a0b4d90640e45c78621ab7e0ef193.npy +03467517-ad2711786f1bd2f3bece9f494cab1c6d.npy +04379243-21d141b130a76e0e497b98603e1cd1f.npy +04401088-cf7973f49aa611346be7f66e5722d994.npy +04379243-39f6dc2839dc4e1bbab624e35355496d.npy +03001627-59879a7a34ee2ca840e8b85dbf5f349.npy +04379243-46184eb6f03e8d2afebad4f49b26ec52.npy +03325088-adb985820edec4577eaeab1f0c9120b7.npy +04379243-416f41390bcf0f87a961b86aefe617fd.npy +04530566-5261e8e52d1581d2398589a18564a81.npy +03001627-34ce485c1fbb9af578785e24320d5ee9.npy +03001627-3d703ecc2358ea0ff51f77a6d7299806.npy +03642806-dbc61cbed5f7f2b33c1abb78f1519c49.npy +04379243-f850a69b0d308fbc19fb4103277a6b93.npy +04530566-b4f254a5c49748a2db2b485c26c9f191.npy +03636649-d438e1e1b540a30b1f329c416dca6157.npy +03001627-93a6876247c7a015d84b8ba651dfb8ac.npy +04401088-97669779da217dce4f37c101c765cd3f.npy +04379243-2a3297e263d9931b814465edb1048711.npy +03691459-72d2729801d56aa51f9f3ce366e030fb.npy +03001627-3269630cf8dd9e87bfd5f349b1ab226.npy +04379243-e7abab128d0edb033396b0dbcf4d4bc7.npy +03797390-62684ad0321b35189a3501eead248b52.npy +04379243-74db7acb40bca6eca707ebedc87d7580.npy +03211117-402938797a9a63bee270f79b60ac4232.npy +04379243-3253f2c59e6bd2a119fb4103277a6b93.npy +02691156-aa0b34d9bc5b77e0d86ebdaa02a63c4b.npy +03593526-72a7b73460850cd777939c607179153c.npy +02691156-35e2eceef33804d8196c5820729d438f.npy +02691156-9483e1b0e4222cb4f2b0736dd4d8afe0.npy +04379243-e3c8c6e7bc421e52e4721974983917c4.npy +03691459-9e2230b0d4d8d33e4ba7340387a30ad3.npy +04256520-9d6ac979ebf86ea9f37af16b2893f1d4.npy +03991062-fa2f25665c561e7be4179a13aff1e10.npy +03337140-53e1d0645ff2afc54c3aee8e9d3a6ffa.npy +04379243-66255a0a235927ea1b81a92ddeaca85c.npy +02828884-831955faf1c5eceb433fb7e44afbc69d.npy +04225987-1d527bbed4d12817fa3bb91f4e3cd35f.npy +04379243-7fd24508190c2e5351d3c864cc68e22e.npy +04256520-80e34c832c4881c1c1acd07b40d583e7.npy +04379243-5a04d5055cb9e3c3e45ef4135c266a12.npy +02958343-d849e0fee026c98aeece2324fbbe339.npy +03467517-af69a061bed20d8a2ccb8d77f3823711.npy +02808440-44278df837544b8a412deb0d2b0f3dcd.npy +04090263-5a79d10c5665b9dc895b56cd0d702185.npy +04401088-e5bb37415abcf3b7e1c1039f91f43fda.npy +03001627-4f42be4dd95e5e0c76e9713f57a5fcb6.npy +03636649-42c6478d294d71adfcb8d8c6d4df8143.npy +02747177-da9ee9282a5e7c77ad5067eac75a07f7.npy +03325088-4f3871c661ac8ae6c36fb70296e45483.npy +04530566-9122c94c6aa76d9e652b5e55e45d0bc1.npy +02828884-88f9fa58ee9ce3de1c863a93a9948fe0.npy +04379243-62bb78bfca7f4bba6113140c4b8aa3a.npy +02691156-78bd38a7282a73f8b184ba15dd506a2d.npy +04379243-7e51fe2b0e56f2e771b7a1511b87f5b.npy +03001627-59009d87f73ce9385dc3653f8341633a.npy +04004475-dc5354098d9fa08d49843c4f9ce432be.npy +02818832-8c1f29ccd64da4a6eab9455d2e880746.npy +02808440-9c2c7ae1ddbbf166eed6cfa9fc6d794c.npy +03001627-e78f25a1f66c19a38a63c123f2a561a6.npy +02828884-20222f467d257022c8bbbd98dee48cb.npy +03001627-a6d850761adf6003dc89a28b5e6678e0.npy +03001627-e017c5c8562ae50882eddefc99ebacfd.npy +02691156-c353ad7ae6ad2b9df1cb19f636b1c2bd.npy +04401088-393ae1877a5e20478139dd63d55edc44.npy +03991062-b3c256f5013d9c2244c183864792bc2b.npy +04401088-9c8bd4fce744a7df5d4e1af18c85258.npy +02933112-1e40a4dfbd78455812de5317fe5b354f.npy +02808440-2a83a721763cb79df15dc88ff54e5f9f.npy +03593526-4b5cfef99f228397cf0c9e00a1c0d141.npy +04256520-408199b4b50fca50f415ddcc43feede.npy +02747177-f0f6b79c748c9598ae1c1abea367249.npy +03001627-91ffa0718376a4fb3f7e27638e63d848.npy +04379243-6ab612b7a5d4def82454f22008de5a3e.npy +02933112-895de6b9d3e0f1ad11b65536c08c170d.npy +04090263-2ed25f939dd286cbf4c4f1f541cfa2a7.npy +03636649-2071651fb8407e4314038d588fd1342f.npy +02691156-aebc4c46b3cb7c3bca8607f540cc62ba.npy +02933112-ca9e248cdcca240f11a59b122fb65ee9.npy +03593526-8e88eb643cde1363ba5342d638d0c267.npy +02933112-39d9512e482ef253c59350d819542ec7.npy +03001627-9e1b32f73908cae7e8f8c11a24c52ebb.npy +04379243-96ef0920cb6be395e44bad6fc9badfe7.npy +04379243-1408914f71c66166febad4f49b26ec52.npy +02924116-dfacef652f7f414e4b88ac4b14fcb8bf.npy +02992529-ceb47998c0ffa704f1cb19f636b1c2bd.npy +03642806-1971fd62c05b664a816d6ef08b9362ac.npy +03636649-e94aab17400945413225afab722d9fd2.npy +04379243-8ed32fc808a31eb5ecd447b0bcf9cfb5.npy +02933112-8b0411fcc2d48f9a4b8710a3469971b1.npy +02747177-ccd313055ecb8799f155d75bbf62b80.npy +03001627-e6b0b43093f105277997a53584de8fa7.npy +04090263-a84652cb6886d873643ae903098a314.npy +03325088-7793cb4f3cb7f664979c556124bee033.npy +04379243-a0864018495ae55cdef39da7703174e8.npy +03624134-385bb539629cd6991dd89e5fcd05911a.npy +04379243-61198aa59e0aa31764d8b0368afacc65.npy +02691156-20dbfa169424bb8ed7b90ecb4a11cd32.npy +04379243-db77ba0cf616e2908369c37b40e82efa.npy +03948459-f6e410358d5a095a49a3c1009fa79820.npy +03001627-f0fe5f6030e999be3b9dbfb07aa21fc.npy +03691459-fb231e827089f9db69a175548b8cecb9.npy +02992529-3c0801c11fc7e4c5f31b75c4a94a8879.npy +04004475-4d246967795180971ed16b27fcde478a.npy +04379243-8fe842d92037d55be6942c5426df6055.npy +02992529-f7cb2d921f246c00cc8eea03ea8843cc.npy +03211117-f47b9fc9a55a731a7bc6032416bc8ae.npy +04379243-900afcc9f0f5fbfd858699aaad4acee4.npy +02828884-9399c7769b01d4742591fa6348c25a73.npy +04379243-abb1710ecb79812d93f55c796c857bef.npy +03001627-600f6f126d0b6c046dbda90cc7f3517e.npy +04379243-bac7bae00f0553bac88c75598a661012.npy +04379243-a7536a73ce066981c6641602bad03c73.npy +04379243-594a7dedea7abb21f77e460087130a90.npy +02808440-85bafd18f0457795810b41e4924ac586.npy +02958343-e3181dcc6b60432f658e57fd275f6bed.npy +04090263-45d3b7dd92a80269da4044967c19cf99.npy +02958343-3302dbdd74d978eeb1bb46d2556ba67d.npy +04379243-421657269cac10f7492d9da2668ec34c.npy +03691459-64058330533509d1d747b49524a1246e.npy +04379243-127e202f77eee5725d02cdadf545c773.npy +04530566-65e829c5a8a52b9491347c63d1dae43c.npy +04379243-613888be9e80b92fda684e203423d5f5.npy +03001627-582b375411f6a4565ba78ad9601cf1b.npy +03325088-4349f60256e8bcca76c18e71fd49c4dc.npy +03636649-66fcb967b951c0f11bb088904f7cb154.npy +03691459-93927ab6b44bb95a1c4980134f4ff624.npy +04330267-3e8165c41c526ea45eb64c1003065596.npy +04379243-104c5225ef0a288ff932326d9778e21b.npy +02691156-98ca06c300ad5a6bdc9181d6fa468db3.npy +02958343-598f0aea814b1d0f8db98a39370e7faf.npy +04379243-c842f85477f9bac0a7a7a90dc2dc5bd.npy +04379243-c6dbc7938060818cf51f77a6d7299806.npy +04379243-e6ddcae1c08b880811d3792a7f546aa8.npy +03636649-ae25da30c4293fcf230584014222e685.npy +04379243-b82e94209375e92a17b431cae0dd70ed.npy +04004475-29d22386bead2931a066c1f884f0378.npy +02876657-5566f264a6fa08cd2a68e506fbd6eecf.npy +03948459-d7e86e0e5b1982d4bf0ab4d7096d87f2.npy +04256520-1cfaa8ba4979b36ea60b4d749290e4f.npy +02808440-f15b0f42feae8d75b87c8f5e7f9beb6e.npy +02924116-cfc817de0241de11f5faeb3213703480.npy +03636649-380a312c4eede2eb72ce68571bfc4bb2.npy +02958343-e0b9bb886c578be86e9dcc2d1ea2784d.npy +02691156-997cb29f544d6f2726360e1e29a956c7.npy +03761084-c75ebd7c340649ba5ad304c2564ae1df.npy +02924116-7796efe8e1b0dede4c949161e83c47b5.npy +03691459-7c02e1c88907e8426b424c689f1d711a.npy +04090263-b52e26101ea750dfd1f50c75142faa8a.npy +03001627-64e77e9e5887ce95492d9da2668ec34c.npy +03691459-1e8aea643deed7cc94c70e7fd262be3.npy +04379243-92cbad40c55de5843002761e7a3ba3bd.npy +04379243-ec07a28c3d57d3275c6a44a505804654.npy +04256520-ce6c597847e7dd1e55eab99951962891.npy +04379243-ca4ce5ea2835b9d71e9c9b11de2def7.npy +04090263-81d26c915198c2d857f253aeccb15f0a.npy +04379243-cc1a9fc08b4c481c382c5a0f87d73d23.npy +04530566-6f61d84f9373f7c5c05557706bb20c4.npy +04379243-ee642ce4112cda8c229ab176c921b2b7.npy +03636649-9358ffb1bae027166aea2f18ee404fd5.npy +02808440-24c288011f4c14463321831d2245cf06.npy +03211117-3783ec2d4ac3b097a7f97cee360e8d0f.npy +02958343-97970b4b0f351f5a9697635485e4aab7.npy +02691156-12e6e5f07b3aad3c5b9f44d7cd72a051.npy +02958343-8cd32df8c0c566b2fbeef84a1ff2df7f.npy +03991062-471fe0704ba80876a9e86fec93eaa6ef.npy +04379243-34ca15546a48e34798d5fc0473d00a1c.npy +02958343-685f2b388b018ab78cab9eeff9aeaee2.npy +03636649-c4d62e5fe71fa71f1ba2f806cba87b47.npy +04379243-56cee7545143c9b67bcb070cc655f13a.npy +02958343-c54dbefca6290ee8a3b392b986583.npy +02691156-e025a1fc1bd71c2aacf77e718d93f3e1.npy +03642806-621882a4afd2a126369873c1090720a1.npy +02828884-f1252c297d7ad9a47c51ec7d2716b33d.npy +04256520-1a713136ff3c0a506298eed3ee847aba.npy +04554684-c1e9cbae0d223f9135e770f723375070.npy +04379243-2087680eed2edc0a20bf3b65a70accd3.npy +04330267-e4c8385cdd91eec0be8b4a628af8a88c.npy +04379243-52eaeaf85846d638e76bc197b3a3ffc0.npy +04379243-161e0ae498eb2b9be3ea982be8e701e5.npy +02933112-b56505eeac0de779289f8cbfc8541c14.npy +02880940-6930c4d2e7e880b2e20e92c5b8147e4a.npy +03325088-f3f585885793fe4814b35a7d7cea7130.npy +04090263-d31008f7c9b5d67678fc07d6c8069b8c.npy +03001627-9f6b1b905ee5ee9ddacbd849c304f00c.npy +02747177-1d5e46b18684ede7ffe3432ba4f2e6d3.npy +02691156-ab06b28f95e4c2caca8607f540cc62ba.npy +03001627-43fc49e4d4ff831b7df0e9a69c97c97d.npy +02691156-ec531add757ad0fa9a51282fb89c35c1.npy +03928116-accff92f4636f077396d085066c4d70f.npy +03991062-5e59e0970a6b05a5d67c0e209ce7200b.npy +04379243-14c9ffa70653cde3492d9da2668ec34c.npy +04379243-e8300d560b8d60244cbf9a02e3342127.npy +04379243-ed2d7f09d80ec3a259577d199a67fd7.npy +04379243-3f0e61a567fe7d366349f6b5431fb3d1.npy +02747177-74949d20ce6f5162ba6cf6cbb9f4c2bb.npy +04379243-ad461a7b5e8cc66efebad4f49b26ec52.npy +02958343-ca5236a5d06b9bb13fcfdd465734daf8.npy +03001627-35bcb52fea44850bb97ad864945165a1.npy +02876657-3f6d549265532efa2faef6cbf71ebacc.npy +02808440-c52b603a212365a4670204dee97dc037.npy +04379243-9db8f8c94dbbfe751d742b64ea8bc701.npy +02933112-c55eef8d5b4d3db563b3c67777442463.npy +02958343-7e4667d837e39d0945e930a0b8a8cbc8.npy +04530566-d2f2ccde17f68aa6f0a2921fde94663d.npy +03211117-2eb7069d227393558ea0068b966c5177.npy +04379243-b03bb928a8842c7ab748e35bbe935720.npy +03001627-c09cab69cc04378cff24fe90298ffa71.npy +02808440-7ea685c4ca42c7df63ffebf86d8dd00.npy +04401088-3d5c17c3e60a168bdaab9d410eb59af2.npy +03691459-dafd6b7408e43ae5ec3b2e05ce8fd39b.npy +04090263-45272a2a7c41e0095c97ca64716dc6d5.npy +04379243-c715a29db7d888dd23f9e4320fcb3664.npy +03797390-403fb4eb4fc6235adf0c7dbe7f8f4c8e.npy +04460130-376cc07140ada8e0b21a5c4b7083cf07.npy +02958343-2485b755d54f95b17461dc7993bb5c2a.npy +02958343-c34ef43ef8ccc3a701a8678a1e8d9e5.npy +03691459-2daca96a8e202949c67b8955be358784.npy +03636649-c6b545ae1a7b180879c251b4a7838829.npy +03642806-d838fc238fc640b83bba289a9fdd2a7d.npy +03046257-25f5f0d55feb7662f546596ce7364503.npy +02828884-64cf18fe86206f6e1b1a00a31bfed97b.npy +02828884-733cae1ea9a85122d41f2c02e27f6d9c.npy +02808440-f313673174ba24de1c17aef130ed6213.npy +04256520-16dca17207a6a2b87f6fd4fd84c364f4.npy +04401088-2d26f853e710b3e894088ff49a6baac4.npy +04530566-7a188a5ed26af4b360a251068e7dcf6d.npy +03001627-4a89aad97f4c503068d1b9a1d97e2846.npy +02992529-71121add7e94b024fb88c3d40924fb73.npy +03691459-62fa02df51eb19a5679c9e94dfb2276d.npy +04256520-ed80dfdb4a552b189d4d5dcd2cc33826.npy +04090263-1e83ef6ed5d0b78b7efb854782e23566.npy +03636649-1ea51a962ebd04f5775b45d31226d2b3.npy +04530566-91fd8bfce87a0e7d847c4e55bb965ab0.npy +04401088-11e925e3ea180b583388c2584b2f0f90.npy +03593526-c5fda0e7168d23ed89035c25f0dfeb63.npy +02808440-f0836272c93c3c40b362845c6edb57fc.npy +04090263-b9b2f960a937bb22643ae903098a314.npy +04004475-528e663093a892594eaf2ca511fa4e67.npy +02808440-a1774ed7dd03d7b717e29780ff39c480.npy +02691156-6ba3a181a40ac7aa35fc197bbabcd5bd.npy +03001627-fb3cae311c16eae32b18cbea175ad66.npy +04379243-8fae5133d952b2ddcfd3cc1d09bc8fc6.npy +04379243-511a939f29ca6763f169404e5c013db.npy +03001627-33319915ae51cbf33542091189dc62b5.npy +04256520-fc48d6602ba4904b5bbac631310d500f.npy +04379243-5918b05f59251e8c24507ea38c2d7c6c.npy +02828884-f11c39810334bc2a45bf743eed1481df.npy +02958343-ce93ae42d9cba64c8dcad5127c74b8e0.npy +02958343-ae54e2952eae6ce4473f10e6caaeca56.npy +03593526-d9ec6c788995408997e88473b28104.npy +02691156-2ce94527ad7f57333bfdfb6cb363d727.npy +04379243-c0b7cf5017ba0f21504c7f76533ac19b.npy +02958343-4c8280d581df259716abce8cb03e7794.npy +03325088-eaceb24407c702da3321831d2245cf06.npy +03211117-fb62e62c2b1584b45d32c81b99496e1d.npy +03642806-ca98fa6fe9c91b8b8b0a7ba4456e7659.npy +02880940-2a1e9b5c0cead676b8183a4a81361b94.npy +04379243-46e097e8c17a4098593ebeeedbff73b.npy +04379243-f6ec4343f78b94b42553cc33364504d5.npy +04530566-92fec5e70e9c972130327a4f3a474384.npy +04379243-d78c722ea1a1b2d4df253edc1fde0322.npy +02691156-7568400ccaa12eb9d972c9dd75ed77d4.npy +03636649-6e705a94eb0a7210e0ebca47533963a7.npy +04330267-bd6f0ae37e25089e136ac3990ab77b2.npy +03001627-974afa9a51eb74245c26acfe9040fa59.npy +03325088-b485f4d94b00763b362845c6edb57fc.npy +04379243-d12b589d464fab1862ba5d2f24e5abbc.npy +02924116-2a20a7a3da107ee749ce6dd3d22ed666.npy +04379243-5fc08f3f8c3aacb8456cbf78e1e89022.npy +03325088-182136abd343be8b8fa6d5040a6c641.npy +02828884-c5625ef76473a5cc7c3efce71c4e8d70.npy +02871439-3fe283e402ab8785937a1594070247a0.npy +03948459-d7ac2d2fafd9b9076314c3b6a3a65519.npy +02933112-6fcae7f06d9f86b2ce5d6e9371bb5c33.npy +02958343-f04f2fa810b6a66994abc9429888948c.npy +04256520-813597b7f538820ef51f77a6d7299806.npy +03593526-e4bd6dda8d29106ca16af3198c99de08.npy +04256520-c47bb0485a3aa2407252a102efb37f50.npy +04379243-e8f5c6944e41c12840d79382490f0976.npy +03928116-bb8acb49245b8f6ee8a1430c80ad4e85.npy +03636649-ec2806b889462892a84fca5de7f98b9e.npy +04379243-2ba8eb5ec0a05694593ebeeedbff73b.npy +04530566-502f848385718cb76e1f79eab597a3af.npy +03046257-4c0d048f0414e92e1b25839d42de8df8.npy +03001627-20e71125748a11bc3c65ef99d4b819a4.npy +02828884-1e4eacc8dc69a40e414354bfb060c386.npy +03046257-38b77917fc05e5a390e588f8bb3fb0c.npy +02992529-2d5f1105a92045c8af0fa49592cf7bc7.npy +04530566-29a895c9367516c1de08ac29282054f6.npy +04225987-9d79847df77172f5ee8f98672c31bd1.npy +04379243-c11829ca8ee139283d2617f9171b5ccb.npy +02958343-783bafaa18e8e5a0bda72093f9b5aa73.npy +02942699-290abe056b205c08240c46d333a693f.npy +03001627-c4f9249def12870a2b3e9b6eb52d35df.npy +02828884-969f830a531682cef155d75bbf62b80.npy +03046257-bf476938942c3e7e510ed2bc209ba71e.npy +04379243-782cef41b14a2009a71c812e027f94d9.npy +02691156-208114e3aafd381ef27c5ff0af8b0e80.npy +03001627-7220dcc0f3f95da3a84d309c7a35a478.npy +04256520-68c58177f6ead1ba9f2349486c570dd4.npy +04530566-4e6264af2f2c3e135a15c264bb25007a.npy +02691156-c4111dbb21e1f17043afdb9c81ff2967.npy +04256520-2a7fb9c95b0e8eec8de75bb03756213a.npy +04256520-6600d60c9d3bacf8d34d30b545306d1a.npy +03001627-d9159a24fb0259b7febad4f49b26ec52.npy +03467517-b8e67f04491740ac2be4d2d80280cd11.npy +03001627-21f2927b04e2f22830ddb6ead95f49cc.npy +02871439-34411a9fa3e00f668cbb8bac2032149c.npy +02992529-983b045d30322f96b102e855af58e521.npy +04379243-30e642f1d7b0d8818430b7446f9e1252.npy +03001627-535289ef7d9bdba8a69bcaf4198ba9da.npy +03046257-557a521bb01e092b503c5b0dd3b93560.npy +02958343-9e136de952f33de0a1830153974050c.npy +02828884-de00838284782bfe97fb25ec4f973add.npy +04090263-48f60ed3a4e32891fe00453e7ccbcad3.npy +04256520-fa5bb6d18535f66219fb4103277a6b93.npy +03467517-6dc4a1063fe83275a693a2475d32392.npy +02691156-577ef32f6c313a5e4ca16f43c2716caf.npy +03636649-7d7dfd2bd5cdcc4cfca61b0bec17b8d3.npy +04401088-b72ec892f88ab015433d4f1444243caf.npy +02691156-ddd729a8623bcb6e8699933784576e73.npy +04379243-adee49b8f5251efeaade78cbbf8fad3b.npy +04379243-fb158adc15a6b5aa75a82b88fe6e733f.npy +02876657-6a96b74beea7f5b316aa41fc58452f78.npy +03001627-d93760fda8d73aaece101336817a135f.npy +02876657-244894af3ba967ccd957eaf7f4edb205.npy +03691459-4f228d116af6e6ad88a3e0e92891ad5.npy +04256520-207e1410735bcf5a62556536221025bc.npy +03948459-14357d3397d55ed2ee0f9a97b71d505.npy +03001627-116a9cd5ac9a008ee8cb931b01d0a372.npy +02691156-b831f60f211435df5bbc861d0124304c.npy +03513137-7da461d2b7ac1454e5e6ac3ef6bff73.npy +03001627-ec758c4557250ca79f2349486c570dd4.npy +03636649-4b43b17b960930af53b1634376cbfb93.npy +03467517-c3c9bc3aae8231ba93f0194265a9746c.npy +02933112-26979d498a0425b6f51f77a6d7299806.npy +03325088-95e13660ebae4953b362845c6edb57fc.npy +04379243-c477235c02413bfc44d2ca62bee212a0.npy +02808440-b08d711c39561b793321831d2245cf06.npy +02958343-6fce36e4df1eac4fa7fd25564c2e888e.npy +03636649-f7495b2e74c906b5922ab3cc7ca1ae2c.npy +04530566-69379ea3029bb2f6ee5140f12d845ca9.npy +02691156-223b0ac8399bf9c5ea1bd6f2443b43e7.npy +04090263-fa811fb70a13c68f95eaa1471ee21cd2.npy +04090263-91b0c8975ce241d69557371cff545901.npy +02747177-de31ede76692c36271c1c4a28b10d064.npy +02933112-6081348fd96b21c3eca22c501ad0a77a.npy +03001627-fa0eb1bb05ebe3f2dd3adf3090c701f7.npy +03001627-ce774c6584d282ce843ead12644a79bb.npy +03337140-c38a124eac2adf5b91c352d02061b3f7.npy +04401088-caa0cf3c7bf2cc4e50e8879f012090b1.npy +03948459-a2439ac7a1f3ac841ba5cdb283b62da5.npy +02691156-be02fd401a12d23822362be7f5226e91.npy +03001627-c05ed12b1bb79ef6d8e8a8a207ee5bd2.npy +02691156-3fd97395c1d1479b35cfde72d9f6a4cf.npy +03001627-7fbde9d7cd67587712ad7c55c944504a.npy +03046257-71eafda69c77150914038d588fd1342f.npy +03001627-352aae8597fc6ac679c251b4a7838829.npy +04530566-19df5aa5324f265d4de203ef6842ee61.npy +03001627-c109b45b290d4cacb161f36d4e309050.npy +02828884-4c26d27e41726d87f359d99f906f117a.npy +03001627-c5be3a0cd25402f0242f43e6bc9e11b1.npy +03948459-d45435235c262f179f433921788191f3.npy +03211117-3bb7a8505b99216a53227dcd0d547ba6.npy +02691156-d629589ee52d48ee4d210d9468aedaf2.npy +02958343-baa1e44e6e086c233e320a6703976361.npy +04379243-788c9d078cc971bf91a6d2f5a0fae0.npy +02958343-8fadf13734ff86b5f9e6f9c7735c6b41.npy +04379243-d3b644f9eb32ec9cbe1fb1bc0addfcca.npy +04379243-f619501cf26b4d533b7f931c53ba66d8.npy +03593526-7becf46a6f6428404bf49568516d5f0e.npy +02691156-91a00801903a1f64bc0909d98a1ff2b4.npy +03001627-d25b6ce1b5ad6198dbbc9440457e303e.npy +03636649-1feb0beac92a26bcb0aa15078ea6f391.npy +02828884-723138769c7c84eb5006d092e9ad4f03.npy +03001627-e8187497dd464b62f91663a74ccd2338.npy +03337140-b406aa9ee044a9f039e7e5a97caed0d0.npy +04379243-b1335d826d7d60726e066e11deddab75.npy +03001627-6dddf2b95ca09bf5febad4f49b26ec52.npy +04379243-c8ddf2c234adc19b6e848052f86fa0c.npy +04379243-f090d4f5e82b3c25f63a1cc836eff7a.npy +03710193-a305c425f2409d562e33f9f68dbe6c42.npy +04530566-9c41a1bc835ab6d81194cbd9c0740031.npy +02876657-22d18e34097ec57a80b49bbcfa357c86.npy +03691459-c7965a5da1143830538cf6df9faa9b65.npy +02958343-b12e8616bb73f5daccaf7041f92bc85b.npy +02876657-a1bc36109cd382b78340c8802f48c170.npy +04530566-51f269a4ff48c2214de203ef6842ee61.npy +04468005-26d7ebe6f434ac67e810c01b1498aa2b.npy +04379243-a10ed77ab3a714f43dbb6421d614c0d.npy +03001627-8b2949a4ab8f5a7d84c7dc40ac6d743.npy +03636649-a58ef2d9168f9b44de195732ce36834c.npy +02958343-36190ce6fe041e452d647b1c17442c93.npy +04379243-e88f6f4e0ed6d01effc6e457221b9271.npy +03938244-b4175523993f66e8d330ae3d046a415c.npy +02808440-5540561e61ad6e063321831d2245cf06.npy +04379243-62e723ad4ee0ba9d65579260f47a2d77.npy +04379243-3c65571a506b6486db5ebc3f027decaf.npy +02691156-2d33ee87ee5230c335fc197bbabcd5bd.npy +03211117-50575a330ffdc66ff5a91610a18641eb.npy +02691156-bad8f0b4602df33fbe4274edc10c1c8e.npy +02924116-eecc64e912b980241e797b014c500fad.npy +04379243-aef9ca5d1b98b85186ac7f2dceaa530.npy +04256520-72988c811a2c88b11206ff076758ec85.npy +03636649-ed57181b9e7644a3f51f77a6d7299806.npy +04401088-d1b34149a8faba42faab2c6c450c7c1a.npy +03636649-adc8129076715686b3742b0325c8aa1b.npy +03928116-2c740240be7df1958148161f751e44a.npy +03211117-1a92363c2a155ed3c397356311cbeea4.npy +03046257-f764a6a70636d54cafcd02e9a1a7ba34.npy +03691459-5acc9b2fd33a9568bf19c71eb972f14e.npy +03001627-6932261b5c17f0de4733824eae5cd9ae.npy +04379243-d7dbf6005f2e8fccf6ef7bb1183682c.npy +02958343-f4fffa99e8c2b9b627a00642873b9759.npy +03691459-fbcef568b50216e3e180a1a604561d3b.npy +04074963-f3366e751820f0f77e1c85c5c15da7fb.npy +04090263-c1e4e78ba2b714175814fafedc6971c7.npy +03001627-3e2375ff9e7af8002861ed753d5b88a1.npy +02691156-8200621d7b5cb84a6b7bd17e458d0dcb.npy +02942699-98fc1afc8dec9773b10c2418bc64b141.npy +03593526-1ca73dffe31553efcb349a60fd15aa15.npy +04379243-e71012d27b3b3eec67142c6ea337b7b8.npy +04090263-ad5165b445e67c06cd1b85350f224c08.npy +03001627-50aa55467c87774b7215a1e3ffbff428.npy +03691459-c91e878553979be9c5c378bd9e63485.npy +02691156-fc5dade8622f686b4aba1f0cb15b1439.npy +03001627-3837e94954187dbf93b0969ba78346b3.npy +04468005-d8cb93fb3dc3609434754e47237bb24d.npy +02933112-d5058b014492f748220c986172788383.npy +04256520-532e2a8e2ae6f5616bfa0701d875ff10.npy +02992529-df23ff3151aa1f0a3cb2f20e21cb06ff.npy +04379243-cf076ced8264a480cce90f0d61ed7a70.npy +04379243-e5b4980736c034257de96030404c16e9.npy +03046257-e13f5f28839b623bcff103a918fa8005.npy +03001627-4b71f633ddb55c6e309160eb001312fe.npy +04530566-e853f137948055b188d5590328ce0ddf.npy +04401088-4e2f684b3cebdbc344f470fdd42caac6.npy +03001627-6367d64115d665ef51f77a6d7299806.npy +04379243-dbb28a435349c9c76b1cb83d86c19bfc.npy +04256520-85a8fa447231a4fe2d19175e7d19b7cb.npy +02808440-25709b9ab8facc1b3321831d2245cf06.npy +04090263-8325595fddab7e47dbf42f7773eadf2d.npy +04256520-44503d9ba877251a4b48718ea0a8b483.npy +02691156-40fefe66b018c17b4c2c88971423d0be.npy +03691459-93c54cd14ea713d34d0c24eb0094dc21.npy +03636649-a5b8eda3cc13acfbbc8967b0321bd9d2.npy +04256520-aa36fd4d76afcaf8bdcda0bf7e7b4744.npy +03001627-cbcc5cd1aec9f3413aa677469bbdd68c.npy +04379243-d7edd292f614e9dc58b7984178830447.npy +03759954-e9178d7aa6d35cbd76f6deb1c78dfee8.npy +04530566-ac93c084dc99fa8a1613e32ab05e546d.npy +02933112-90f66de8ce581ee39aa778fe3a2080af.npy +03261776-e8195dc3c0235dfe49852b2ef384d236.npy +02808440-2a28b3c0318590983c8d0fdfb1cc2535.npy +03624134-b918bf1a07d71b4f1b9c8e2fdbfc1118.npy +02958343-54d525937d9c6921afe717997470b28d.npy +04379243-9b17a95b794b3dc341a298cc53deb86e.npy +03046257-854f8ec7013d30aae6fe3612af521500.npy +02958343-fc25e4c1bcfd9167b376886260eb15c1.npy +04379243-1a9036f081dd51683a9bf8c718fc345e.npy +02958343-ba0c32b3feba49b0b40adee184c371d0.npy +02933112-22e77a41cc388839824662341ce2b233.npy +02958343-cb5a320fbd846fac28e9ca8e8fb04e0a.npy +02933112-60ac3a02f8c1116b5588a2543ef0b0b4.npy +03636649-27623aecfdae2d887eaeab1f0c9120b7.npy +04004475-f065815f98d3f2e52711ed0adf8251d4.npy +02992529-df816deae044cf448e53975c71cdb91.npy +03001627-9eb0c534624408a6ca9b40e76e725878.npy +02828884-8afe9533153bb82b157f5033576317e1.npy +03001627-a3ba5f8fdc8f17ee95bea7c29e873d16.npy +02691156-9465be8f818fbf94b01a0cb11141e033.npy +04460130-2b6257595edd2e62159e1f7290c9a432.npy +04379243-e7c350f18bab885bd0bcb58c58eddb59.npy +03636649-41c1e411592ecabcb7487183c0e206af.npy +03001627-41ea9182aa12effef47265090d8660c7.npy +02933112-9d75f1513c57e433c8f56fd282ce5ea1.npy +03001627-f9e386d968653602d68fb8f5d99affa0.npy +04090263-981b30a44557ae28caf05f9cece7ada5.npy +03001627-bb380888cf0ac2e79c0b027ae5b223d6.npy +02691156-c2ea74539ffe96f8be4274edc10c1c8e.npy +03691459-f2a13a030a8153d9133aca0b3ca7f0a8.npy +04379243-cd0dccabc5966b40d42ec7e303174a87.npy +04090263-298d300e70d6bf24e1f2a1daf140ac9f.npy +03001627-fedfc00265711f4193c1e619801da0a6.npy +04090263-641157eaebb2183ae96eacf8990e6676.npy +04379243-d67265ea100ceb32ce11183544874734.npy +02933112-740f399fea35db05490ad276cd2af3a4.npy +03001627-8920c0e0737409e29f2349486c570dd4.npy +03642806-ef8ea9a542b06adcbd6e55f88e701c4.npy +02992529-c8948cb8ec0f10ebc2287ee053005989.npy +03691459-2b3e7da84b849a84d3dbdb797d2f78b5.npy +04530566-a9eda0d90297844cf92c4a072103d4f3.npy +04460130-34e391f9e9a72f97c5e86946f2168706.npy +03001627-6cb3d99b20e7fbb5b04cb542e2c50eb4.npy +03593526-7d71fc51ce793a44befd8bfd61b07f5.npy +02942699-2c0b4e318766e01723cd81bf29b64a1.npy +02691156-fc44636ad5fd9754927b6179bcc6e892.npy +02691156-6187d076d53429aa67c54439d6177032.npy +04379243-7ab9eefef9fddaa416a2b5862518c93.npy +04090263-acc7a95f567e94355ce192ce2ee187bf.npy +03001627-5f9fd9bf28da76ebed2eab6efdeec5f8.npy +02691156-68f26c36ba5340ede58ca160a93fe29b.npy +02808440-1c908b81867d6d85b362845c6edb57fc.npy +04379243-4726a178bb7b40544b3c42e318f3affc.npy +04379243-8b5c74d6fc057bb24789ee5c8d247b09.npy +03636649-94e8b7adb07de08e714531f0291497fd.npy +02871439-61ea75b808512124ae5607418ff674f1.npy +04530566-ffffe224db39febe288b05b36358465d.npy +03593526-ca00e43903812f9bf8f2e9a6f7085339.npy +04256520-3230b6c7f396afff19fb4103277a6b93.npy +02933112-a593528259cf4d78c0f947750540fb22.npy +03636649-8ef9c1ffaa6f7292bd73284bc3c3cbac.npy +04256520-c1ccf7d15c32b156cc2af5791bd669b8.npy +03001627-498755187e526e5c1cbcc2e1b14b6d41.npy +04379243-7c46b661b94fdfdd34528a88ad1d85d3.npy +02828884-b95994218ee416f492d9da2668ec34c.npy +03211117-274acc511daf0161bbf0c65ae96423ae.npy +03691459-61508357d7d9ff38a605f453cefe7e92.npy +03001627-3d63ad34e3deca1982db9fca4b68095.npy +02958343-492f36ac59d2d3eb450d7227edc25975.npy +03636649-2fc19897a2f384ebc77d45d65dc3714.npy +04379243-da9d681e20d2c123604b3895514420b1.npy +04256520-697161cff5d04992a4dc2316a7e66d36.npy +04379243-91fa004401e96d0797059057d5df0d8.npy +02691156-137acaae47b50659348e240586a3f6f8.npy +04379243-680d4a8b5a30601a4b3c42e318f3affc.npy +03001627-6398eb498fa1c291ca22b08889f6ea0c.npy +03211117-9716c06d43de24387103ae93fdb3bd5f.npy +02958343-aa78d4465ae18312711f9e3a79a13dcf.npy +03636649-2ab86b983d36642141b0e36ebdbf4b7a.npy +04090263-c5c335bfc5858d11137e0f55e7272392.npy +04554684-957ddf9eb718876dc2180858eb6a5f28.npy +03593526-c03bbfcd33f310155076fe09061f1a7a.npy +04401088-5e5c0391952208e81213f8f7891e7fa0.npy +03046257-1710033fefac979deed60df91eb05a5b.npy +03948459-2a66595c64d5e6ded957eaf7f4edb205.npy +03691459-ae39f8cad4fe0981332d76467c18dfde.npy +04530566-733105c0a74ab0a2b83ec978f31c7f76.npy +04256520-99a3e307a8e08afa575f974bef523d40.npy +04379243-22a19599946e4db6c3bd24f986301745.npy +02691156-6693d4bd6edce2a7fd3f94e9ae089f96.npy +03001627-eaf231f17fccb96d81dff5c2e57ad46e.npy +03001627-d2815e678f173616e6cfc789522bfbab.npy +02691156-7578bae68447de8498427765723d5e48.npy +04256520-d8a5ba127550669d55030a5efaf6babc.npy +03001627-6831b0aaec44c01f5d0b6dbf2c4992eb.npy +02691156-a5cdc19967a8f69fedf24d76037ce02d.npy +04379243-3c5b03a212d8cd3951f776d3ed05550a.npy +03636649-9b1c1def3467c1a7d197f67767b32741.npy +04379243-75f2e71073707ffd9ed6e8a0d47c5a7a.npy +02828884-9fe85429413af216cb2a965e75be701c.npy +03325088-482e8134a2d5461b14b35a7d7cea7130.npy +04530566-ce6e40c533159b2db9e8bdc9c4a49aa2.npy +04090263-86886a49bb69dce3fb5c1b0f759e2bc1.npy +04379243-f7b8a1d716dc1725aa7cb30470f3273c.npy +03593526-682de86ee8578339490ad276cd2af3a4.npy +04401088-5298e9c7eeca74f8ff2988f561e515f2.npy +02958343-f60f11a1a8c8f89992691fb966926839.npy +04379243-edb7dfd7fe00c08e25c8be43ebcd1add.npy +03001627-c8d6e4e789a0c6a7eaeab1f0c9120b7.npy +02691156-fae6ae6ef62cfa107b164268a44f7712.npy +03337140-cd37ee5f404f393cf3a0b1845ee9aecb.npy +04090263-da4294d14502707a82cb4f2e118e48f4.npy +04379243-5ce75eec38f8437c8a64c4f643bb7cf6.npy +04379243-11f2882ca78cd85c9c75eb4326997fae.npy +04379243-ec8a05151bdfd44779368d1198f406e7.npy +03691459-a12a46aa47ce021a0ac302bb9c69c6f.npy +02958343-47748464909a5af473f10e6caaeca56.npy +03001627-cbdfedbf2dbeed3a91f6e3ed62ffa5d1.npy +03691459-7263b5bed1c020d3fd8284eaee3b0fd.npy +04379243-ad6fc60679879c234e08ba22112c59b1.npy +04225987-eb6246b73afb6383b77008f97c3030c.npy +04401088-b45f58361ed3ae739d2375e90e0e0425.npy +02924116-dd932656e7f1d74452470de2774d6099.npy +04225987-54b9d9a3565820e17f267bbeffb219aa.npy +02691156-4788f4d5afd92e151df8f3faa46a0206.npy +02691156-bc16d2cf6420432cb87697d3904b168b.npy +04379243-72f0bf15522498993f10a8b8beb12d1.npy +04379243-dab06bbea57f6051d0b93fa304cfa755.npy +02933112-180154895560cd0cc59350d819542ec7.npy +04379243-ef02c88a34b3888a1b1a00a31bfed97b.npy +04401088-8873af9392bc7506f1cb19f636b1c2bd.npy +02958343-2e27309be42276bebecf71e2e014ff6f.npy +02958343-163786646ae2578749a5fc144a874235.npy +04379243-f5d97731def4d875f51f77a6d7299806.npy +04379243-e2d5de278cfff9cb55388518b8ef9c17.npy +03001627-816d1c517ef6bf7890a9ce3e4b15521e.npy +04256520-fb74336a6192c4787afee304cce81d6f.npy +02933112-1caaaa5c1da4dd2dc59350d819542ec7.npy +04379243-d950e75bf7eba6ff35836c728d324152.npy +04379243-60c942ccc194a8e88d4313dc14de486.npy +04256520-8aeec0b2dc06c3df9274d508495753d2.npy +02828884-1d94afb9894bf975e76bc197b3a3ffc0.npy +02933112-2993b6f0fa043f2744b0bdbb4386e313.npy +03001627-90500d52ac30dca9f51f77a6d7299806.npy +04530566-76dc1a35fee28991a5103c3a2f33a5e9.npy +02691156-132fc603f8f69b08e816c75152573ee0.npy +03001627-a9cc6920422b9d9c2af8b1d491b7ebc.npy +04090263-fbba8fc424ed0ad6f8edafa0d47e47db.npy +03790512-6a05091b7b1bae0352fa4ad29a1236d7.npy +03991062-71421e76243826a8a2c59a4d90e63212.npy +04379243-5c94122a5a3682bdb2d2900ee0ae7e0.npy +04090263-1e7dd1677a62d3caa672357dc73b83a6.npy +02691156-a05cb1f091b01cc87aaa57326478bd1f.npy +04379243-ca9bbb0ecdcde978178548484b14e6f6.npy +02808440-916c3b82c5ce6bda5be62ca6b91c7ede.npy +03636649-2f6f1fe66631572c6c5b8009db95f66f.npy +03642806-877b995954f127225df8529b323d6f29.npy +02958343-b48b8791a3b09753b8d3554bd033ee9b.npy +04379243-4639656b53d21ab1278d386bfa54545.npy +04256520-4954953090ca7442527e7f2c027f7469.npy +02876657-5ca994bd512be485db3bac7ad77ae88e.npy +03001627-4c97f421c4ea4396d8ac5d7ad0953104.npy +02747177-7a73f3cf362ef4fa619b1cc3b6756f94.npy +04379243-3cbd3d2da993a389fb05cb5458b1da64.npy +04530566-8676b1989d68f3e970c565b5a7d76650.npy +04379243-fc8b1310927ce3e6d8d12f352b5e1839.npy +03211117-c5d14b600ba28289ef2d91f96fdec842.npy +03691459-d233b0a03f171cef47e72126a394af4d.npy +04379243-c9e09052118e6fc112e2da326535f859.npy +04256520-d65ef2797ae836ca8930422448288ea.npy +04379243-4949aa2bb737317225f1bb0febd3472.npy +04379243-4775e71d37374444febad4f49b26ec52.npy +03642806-d9acee6657134387c664c3d4e2d59341.npy +04379243-4f7f8af38b1a13f67c1b348241918030.npy +03642806-b913c80eca0afa4a1b7e0829f0e4fe61.npy +04330267-48d103efdc593eb9397a815191739e2e.npy +04554684-ef6d0cac2707dd6ee262a7452d41c334.npy +03001627-7d4aff5680062f0b1143841839c8c312.npy +03691459-eae023e4c609a77799234ad1a4f88718.npy +03624134-ba521f73a0a69280f5125275d6943657.npy +04401088-36760a27d679f058c4a0b6f738c144f4.npy +04379243-1f0df5b240c73a5078dd615a59de5f05.npy +02691156-800334df5da57266a4642ec4b6f68a.npy +04379243-b6ee1aa4e11df2bf8f5708c6c7585cb.npy +02992529-9c8bd4fce744a7df5d4e1af18c85258.npy +03001627-663f02b2ed46f991480b0456bf1622f1.npy +02924116-4e1fdafd569814c241cefd10ce5d6cc0.npy +04379243-860995856455e258fc0004571aec2fa2.npy +03636649-e053e531fc4341b5fcb8d8c6d4df8143.npy +04090263-66e287e1d2e9c9f6e71e857afa9df271.npy +02808440-bdac92a52bc53cb4b362845c6edb57fc.npy +04256520-87f103e24f91af8d4343db7d677fae7b.npy +03759954-3484d12ad3b2f06b35cd53a06b1d2317.npy +02954340-7f9ddfff396634f17790cd6f6e8952aa.npy +04379243-fc95d34ab1afb92b9118eee0b123125f.npy +03001627-f4f1aba65ebe48eb70930286c914896b.npy +03467517-71d0016078dea05a94ca7929d4ba6d2d.npy +02691156-86bba8b007786db7be00b7fbad2ca0e8.npy +03759954-1784a6bea782ef4af50956e9de496e43.npy +04379243-21fe96bc7ca206cf4ce89debb609dbc8.npy +04090263-ac88c6856c21ab422a79dd7a0c99f28d.npy +04090263-8ca120d9501983b312b38b1d99376c0b.npy +04379243-143e612ff081f2fc3dd0bb3e608c7548.npy +03001627-8e1f9f4e3cd226bacb916d8f4f1ff996.npy +02691156-ff6ab0fe13f58e22962a5697e98a94be.npy +04090263-e01eee98a8d18a29a2d71a426315b93.npy +04379243-b7820dbf7820befb99860e9353bb52a1.npy +03001627-434cee44934612a81f98c0761af40e04.npy +04379243-591a2b1a6c44e5ae535089b1cfcbf17.npy +04256520-306a6efdecd98ab1456cbf78e1e89022.npy +03001627-28445d445cb8b3aa5de04aad18bd94c3.npy +03001627-986058a64eb343c6781b8c940ab86a39.npy +04379243-9dfcd3488a7109745b5b328c62af5142.npy +02828884-5ab38425eb09fe33cac2a982f1c2a5b5.npy +02691156-b55af8905ccc3b35102bb5032a53eed8.npy +02691156-88c4ef9645eee90866876073bf7a9ab0.npy +03046257-619cbd4aa6ae5578f5635ac8b18fdb9.npy +02808440-f96cd761f71daf3354d7082b34825ef0.npy +02691156-816f1a18692bca2abc0909d98a1ff2b4.npy +04090263-d0f3ee45d483cd659f433921788191f3.npy +02691156-4fb10ce02887e35efca1f1143bb6bc17.npy +04379243-36770c30c74a32e16dbc8927361b2733.npy +04090263-57c6c69a1406e9be21d9cbc846872d86.npy +02691156-78a63dc99b3b68962b600da24e0965.npy +03001627-48c0684d1c5e279dc3bd0b373cb604dd.npy +03046257-555f0083553a7cbbe4bbcfa1dc6a2906.npy +02880940-a0b34a720dd364d9ccdca257be791a55.npy +02691156-740e79be16a92efbf1f2e10bfa81e2b.npy +04379243-a7887db4982215cc5afc372fcbe94f4a.npy +04379243-839af4cf455c049347839bae1bc65257.npy +02933112-203ef2b06c3ad6033fe047712e43e185.npy +02691156-c2e047aa11190a0f3523242fdf9b75a7.npy +02958343-854881671316e926f63ee8a34069b7c5.npy +04379243-6f85f70a77782307f4ab13f4b49ac318.npy +03001627-1959a7d986720364c8687ff9b0b4e4ac.npy +04379243-9eb1ec4c70696799851f4ba6aaedaaa8.npy +04379243-6b4800452f4655e7d34b068b4d9c2c60.npy +02958343-5aac7e6813771b2f22cd6c209adfc63b.npy +03001627-d764960666572084b1ea4e06e88051f3.npy +03001627-e7aa94a2dd59a5ed492d9da2668ec34c.npy +03636649-7c23362b39f318cbb18d6f615cb18bdd.npy +02828884-88a00b80d432ed5a577e7964e0284adb.npy +03001627-cef1883847c02458cf44224546cb0306.npy +03991062-d6209472e79d0a2422b13c48c34706de.npy +02808440-9dc757fba512200b167a3045f56a81f2.npy +02933112-1e73a722906872b64da5feafe6f1c8fc.npy +02828884-324257d878597916bea0f59596aee501.npy +04256520-b50519cfcc841200e8f8c11a24c52ebb.npy +02924116-1ddcb6107e5b08f39206ca9600b83578.npy +04090263-5d3a612df6585a90cc34b900bb2492e.npy +02876657-7712db835816a52b250241e1ab69b97f.npy +02933112-19127cb1f535bf2c62c9e7b595148d6a.npy +04379243-5d2c769d1afa6e3742f75bc7df727ae.npy +02924116-6df43a1f0bc546a71759ca9eefe0e251.npy +03325088-7f10cd36ec471aacb7a867e9b35a1295.npy +02808440-f1910f9ad5c58ba7f5eed355a820c382.npy +02828884-b6c745406a599dddad5067eac75a07f7.npy +03691459-b8d62dc24152a3463d91ae2b92426394.npy +03001627-97cd4ed02e022ce7174150bd56e389a8.npy +02958343-aadf8736528b0f46857652684714945f.npy +04379243-bb1aa2cdf216d348e76bc197b3a3ffc0.npy +04379243-6bb78393aaff36b8f42467d8c501ee9.npy +02691156-c854bf983f2404bc15d4d2fdca08573e.npy +04379243-46f6cbaf4897aa45aae567e8dbab47de.npy +03046257-5f4711bd703bd262f51f77a6d7299806.npy +02691156-6a3028e1c7205b22ad6a38fcc21e6e9e.npy +04090263-df531a3c9ed88efcac074df1dc27122.npy +02871439-3f543bc217133f7369867582939a3cf7.npy +03642806-535edbd064647a2d21c4ab26dcc5566.npy +04090263-1a1c0ae2b0a3cf3c80c2e60c312b0f09.npy +03001627-74518f7c342b49191030665054ebb2a9.npy +03636649-1ae630bed26fcf4d448e1c9934d83117.npy +03636649-6c90f92219fd4ba74719088c8e42c6ab.npy +03636649-c02a408b63a91d294cccbece4754c7cf.npy +03001627-3a96b4ac78928fadcfd33d85f931f6e8.npy +02876657-6d3c20adcce2dd0f79b7b9ca8006b2fe.npy +03691459-9a8a760dd2094921bb476b1cb791329b.npy +02691156-967b1afce4221816cf67c0b63878e138.npy +02828884-263f629d385be2b1601104cd2d998272.npy +02924116-fb65524daf2a034bbfc1f7b38863194c.npy +02691156-26048b00f9227a9f8699933784576e73.npy +03642806-67e882442eb4c03255e8ddeaf1791474.npy +04379243-e7eb326a867912fe16b2b5432674ae6.npy +04379243-4475dea2d05c1ee4fd9792d1e260da32.npy +03636649-300a2c57c5c0a31c35836c728d324152.npy +03001627-57dfb295c3e699ab2875319f84a135b4.npy +02958343-6c28f87aebb33c294386e619c2d3f83e.npy +04401088-b159743a482e73baa56eeaf8467b96e.npy +02808440-fdcc9d0d2e24b4f854d7082b34825ef0.npy +03691459-90a050674ebcfffe475649efc0ac5403.npy +03211117-df8e098d4dbcb5b2ccc4d915989bc424.npy +03001627-18845d9336d8be637b11ae648ea92233.npy +03928116-9b3e41030538e8b459a6208793b9dfca.npy +02933112-515df524aefbb9c2376a431c347bc40a.npy +04379243-95301825e69b3b2db04cb542e2c50eb4.npy +04379243-f1bfec97b7e9f7b776a402eb60ff1f9d.npy +02992529-f973c91a4c239da9dd14866f469b6370.npy +02691156-151550551758af098b96ae1a0a8b84ec.npy +04554684-5517868119f44388a027ae047c88a1b9.npy +04401088-b514d253eefdbfdbddfa02c62bdf0f8f.npy +03001627-cf975250fbeec5148b01ef724ff374fa.npy +02958343-e0762bd3cd381408bda72093f9b5aa73.npy +02958343-557315ec87e7ab9d3189f4fd2261a1d0.npy +02933112-a69a97674b732b6e951c1fffab4f5807.npy +04256520-b58291a2e96691189d1eb836604648db.npy +03337140-eeffac7af3c013f2492d9da2668ec34c.npy +04379243-3281ed5a4af3494f67990f5b8451542b.npy +03001627-1e7c8833d231178fdcddd0cba5e9fbec.npy +03636649-ca8e73b360017dfafcb8d8c6d4df8143.npy +04379243-650dd98cb20580cb99860e9353bb52a1.npy +03211117-d4d94e7a1f75a67e3f7b7c3393bbad8.npy +03325088-3e208d2bcf317a2b362845c6edb57fc.npy +02691156-ef20d432f2a7b1752c164e0c5ea74611.npy +03046257-fddee751fb9c7244b3c42e318f3affc.npy +02924116-3c45d466c7e1c27367aa983983f9bf36.npy +04530566-8d95b6ddd06a8a80f57109a0257e61dd.npy +02958343-4de80d6104368f4be194052f3f12cb2e.npy +04379243-1bc326fc94e0cfc1cf5a37a70014c623.npy +03691459-e30bfb0ab456101cc0b5947ffe18a468.npy +02808440-2901f503b077e7a0fe52ffd0e748a1ab.npy +04379243-a003e49331f19341b0449d422c1e5657.npy +03211117-bd3df021605a8aa24c619b8a18eba62d.npy +03325088-2439d924018a3b198616812464c86290.npy +03207941-503b4dff71b404dabf195d81040cc60.npy +04004475-dd8927d6710e354479510444cc61f839.npy +03991062-1e2ffb73f4912932cfc0d4d561c11099.npy +04401088-a9c181d7378f92cfbc59a3627d9edb6f.npy +02933112-71bca48ccefa3cd080f94e6470f7d263.npy +03636649-25bd069704996e073225afab722d9fd2.npy +02924116-4e2154c96b2268ba52470de2774d6099.npy +04379243-7d358a01c9467815a9505c473725122e.npy +04379243-57c21a71a3518b6a1af550e7b4aa14c.npy +03636649-9004c69559c8e6f99ea7ba54de81fa1.npy +03001627-7dc91406f30074777b707c797539b200.npy +04379243-1c6eb4cd121175f5d009c98a5b96836.npy +03636649-f97506704760741b460fa882e24b7e4a.npy +03642806-b9b521a7e25caf837b18e772ada5a339.npy +02958343-eb46e6071b4f72659bc0c5b67eaafbc.npy +04379243-37ca38d0074d19978c9e244e3fbf98f0.npy +02691156-49131e925ef3349566cf1b4a8fc3914e.npy +02958343-80e839edb7aeae0bc54427e2c0943fd5.npy +04379243-29367fd1bfe6b23827775562146ecea9.npy +03337140-bdd91f5a44301af0ce5d6e9371bb5c33.npy +02992529-692e5fc16bc6ebd23737433332467411.npy +04379243-1f326aac412e727b62ca3aa650ba65f5.npy +03691459-fd421313164e2d7f1be6fffd725195b9.npy +04256520-a53114ab5cfe2048f51f77a6d7299806.npy +03001627-60a5795c905f3bb157f5033576317e1.npy +02992529-7f5b9c8fdb46cf7c562c8e1ac545ef78.npy +02691156-ae4fff8877a5a64b3ae1361afc45ac52.npy +04256520-dc097b47bf15ec8e7934a0d24a61231.npy +02828884-a7096667d133db73cb2a965e75be701c.npy +03759954-98b0e21d5ca46e222afc25cef0918375.npy +02924116-74ec0dd3a200686f58c7dd2ef106ede3.npy +04379243-d6c68f9d1844c3bfcb002c1e2b5fc68b.npy +02747177-126ae26edcd76f27ad5067eac75a07f7.npy +03046257-7d056103f42dff83788a9e26a791a23a.npy +03467517-dab53ffe5ceafeb198e9e7d2e581bf6c.npy +02801938-9e4a936285f32194e1a03d0bf111d109.npy +04379243-254bf8d40be1fcb025a517a55e2a2141.npy +03001627-9ea39b8f5a9b88d56eb9b08c8a74d159.npy +03691459-460f07680e1d50866f6dffbb7673354d.npy +03001627-1a6f615e8b1b5ae4dbbc9440457e303e.npy +03046257-ad41efed0f69060fa86b76551c6a3b2b.npy +03046257-44930d69dfc35c71f5b59380f08b08f0.npy +03691459-8c919e992db7cb081e5b68ee10358ea3.npy +03636649-b96c8cc6529167bfcb8d8c6d4df8143.npy +03636649-9d9ade887a3fcfee89d70669fd6a0e5a.npy +04090263-4081d740a9bbdc7eb5e784742c8f0ee.npy +02871439-b2f525e82668cca251aad687ca458e7d.npy +04530566-e23e4845d3a990d25fc186cfb5f359d1.npy +04256520-7fe0602271e7b31f52db1d2b4104f173.npy +03928116-14755c2ee8e693aba508f621166382b0.npy +03636649-7691ae0488f3be56f92cb63577c2f16d.npy +04090263-cba7b6437ab3621ef0fea2ee98610322.npy +04379243-5767cd2fa0c64c92a0263d691f98a9af.npy +03211117-73895e2bed7007fb2df5ba101cd14a11.npy +02828884-88134efda194f8f422f9a913dd25c68a.npy +03948459-1dcdbb1ee028412253630d3fa9f23590.npy +02958343-b57bdd19852e0084f7a5eccf728c3b75.npy +04379243-5153292b91b93dc772ee08e78374a212.npy +02691156-bc58ff3369054fa68f52dc705c3109b9.npy +04379243-d43d8df70f357bcb83776366d314ddd7.npy +04379243-575e42b02249f2b3b87a068961a20739.npy +04379243-339092b2aeffea998629cea277916e93.npy +03046257-ad385337f0737d9df546596ce7364503.npy +04256520-b146fb259f64cefaeb6c29873b08c02.npy +03636649-c8b19dd635c346a4bfe7d977deb71340.npy +03337140-eb572820ef16a7bf389e94c9d197b196.npy +03211117-5664e1d072c3f39dc39fc02d4c9e2419.npy +03691459-ab651261126de20c145adb610a878e88.npy +03211117-eb75ac8723230375d465c64f5322e86.npy +04090263-58f98b4bc889c7f580b72a37a25b7e72.npy +04256520-e1a653600512eaccc862eec8232fff1e.npy +03991062-23d866397feee7a4a2c59a4d90e63212.npy +03928116-b2203c3500e0040a1baefda9f87f2d8c.npy +03759954-dba3e5a0273880c8773583ede7320303.npy +04256520-fce0bff765d0c49777ccdc3441fdc624.npy +04379243-5b9a7b7952996844d802aa676be38da2.npy +03001627-b4ff370c931ce57d1705b902738021f.npy +02958343-f91d1032b7cfae618e4e882feb9b406a.npy +02691156-5ac0cd21410b2a6a341877ff7a6c751f.npy +02933112-d5fc42532aac8ea8ad046fea8c3e99d0.npy +03948459-19e45672a3109f18be4927dbd39f74e9.npy +02958343-2dd397a57b35e57f2c6000457712c234.npy +04379243-2e3ff4aad6da120784a05e54516915de.npy +04090263-a2f3ad5b5e88482c30ae0c71c8e3e486.npy +04379243-608f7cd5e647e4a4e8258fa1af480210.npy +02691156-1930a979c7a9a2d662b600da24e0965.npy +02828884-cbf9773bfebd4321cb2a965e75be701c.npy +04468005-7d337d1be2d02b624e38abcf1c844caf.npy +04379243-a9dcc147e83c2a0619fb4103277a6b93.npy +03001627-20310d1bd22d8e28890eb7072fc1df21.npy +04256520-15410f94aefb4982ded10515704c9720.npy +02992529-fc1675526d043e81a2811061ff7e0824.npy +02924116-c970097584110627b012af5689af8c1e.npy +03467517-75b204a6aadb6702d3193ed047bef161.npy +04090263-fc1cd79a8643fe66def607f4d4140edc.npy +03001627-90eea7c7aa913fac57b8f616df7adf9a.npy +02843684-9fe2e8fb0e94a179b9e8bdc9c4a49aa2.npy +02691156-cc60baa1a796f5c14c3a35cee92bb95b.npy +02691156-f2f6684e930651df3dffb45955223d25.npy +03001627-108b9cb292fd811cf51f77a6d7299806.npy +02871439-28570547091748edc2cd59b38b35eb54.npy +02828884-55c97131574186c0d4d8765e3910f617.npy +04256520-6f27ca8835f0d0b54b3c42e318f3affc.npy +03001627-d76ec8373d0a8f0dbb44d2e3e3af4857.npy +04379243-4b2222cc86f2324f7383fb84b914b75f.npy +04379243-746f953a49a68cc2b76e29c9c43bc7aa.npy +04379243-de1d6e1294552606a625499f7117f27c.npy +02954340-357c2a333ffefc3e90f80ab08ae6ce2.npy +04379243-ef56ffb992754ef9efd9e6e4dec9682d.npy +02958343-4c36e3b0210fb9e899232e04f9a28249.npy +02958343-7a756a1c54cd3a5a1b3611fc576bceff.npy +04379243-242b7dde571b99bd3002761e7a3ba3bd.npy +04256520-13de905fd21e501567a4cd2863eb1ca.npy +04530566-1c89943a24952d1737f4612124cea14f.npy +02933112-6bd87f32df22ffe2854a6619c08bff6d.npy +03001627-341ecb71545d84835ecd29875b6f0d44.npy +04090263-3eb4bf4ca864e428ce168de955fd5025.npy +03636649-d82a17b1f646e95dfcb8d8c6d4df8143.npy +03001627-2a2d705d0238396488422a4c20c0b1e6.npy +02933112-21d4a168aa6fd6c74da5feafe6f1c8fc.npy +02958343-b6abe0f00fd452fa4101e38beb790a92.npy +04401088-21056b8560bdd1a9f63375fea17cbfe4.npy +02876657-92472817f72dd619467ca2ad6571afff.npy +03001627-e40d5fac8951692e3849910c5019154.npy +03001627-3b2710b509c3df0ea5e8cf3aa1686d66.npy +04379243-48600b28f63e0dd2de98d10ab5975b59.npy +04256520-1e887a97e283f6dc4b3c42e318f3affc.npy +04090263-a4509077129f900932dee48b245ce100.npy +03001627-fead8d07aa53de5871c3cf047830ec1f.npy +04530566-834dead664b43efb1ca19e5e5c1d5766.npy +04401088-4b72058b03234d188a81847056b4708.npy +02828884-be2bcc5a5ddedefa80065a186bd67f86.npy +03991062-3000b6de1c5ecbdca2c59a4d90e63212.npy +02958343-b09f4d5af99be6c5f5f45e906b41d1f0.npy +03211117-1a92ca1592aefb2f9531a714ad5bf7d5.npy +03001627-e80ade8966a54fe419fb4103277a6b93.npy +04090263-897656f468deb1b9e96eacf8990e6676.npy +02828884-91e169ea3ceb587beff42b9e13c388bc.npy +04379243-9ce40bd942c332644ee9d52ff0ec4dcc.npy +04090263-520ebb92353e7fae6f21883e4b04581e.npy +03991062-5488022c54116756a2c59a4d90e63212.npy +02958343-49e8bd4cf55ea566d97f019cb91636fd.npy +02691156-51ebcde47b4c29d81a62197a72f89474.npy +04256520-a3c1bd440f319a39dd7092ed47061a36.npy +03593526-151a80ff1ad2fe11c8c4893204f16cf.npy +02691156-95a6c003f5bd8a4acef4e20384a35136.npy +02933112-df55c6665781293cbe53b3b9f1274310.npy +03593526-be28bf161b022a1c178bbb7623060b16.npy +03001627-969375970515e5f6492d9da2668ec34c.npy +02992529-878135eab6ae9aa181471a5ba59fd0fa.npy +04379243-7b3dfbd70333485d219a1300d9489f4e.npy +04379243-dce2d814513f5035bfe64eef3e5b93b8.npy +02958343-f4814bc5063ee3a95f0ad3f281ff385b.npy +04530566-7380c6bedbd13059eb2c303a0e0d287b.npy +02958343-fda43d663587c7a9caf180c847b8b75.npy +04530566-e50e4b01588116c69eadbed0f2d15378.npy +04401088-6bd7f7a17a7bbd2d68acf22a03600648.npy +03636649-e4d491fdfd795a9339de811989288fab.npy +04256520-89b66c5a15e9c00b9b43c20267c98bff.npy +04256520-fe56059777b240bb833c6c72c4b62a4d.npy +02871439-d5064a4f00528425e89ebcecd11a393b.npy +04379243-c0eda75ff5b23100a6536c847a708e24.npy +04379243-179841c6d26cada5d75fa3d7e144089a.npy +02958343-80b5df2ecf1051fd61c6c61410fc904b.npy +02924116-9525a66bc137613399ebcb8df4d39cff.npy +03001627-3374905da20ad76f3c9c1464e55d580.npy +02933112-5366e82cfca7382729f1ce9399524695.npy +03624134-96eec3afdff1ceb0d7d3985b6fde9645.npy +03636649-e688f147080f123828eb8d149efa4062.npy +02828884-1b6a5fc808388138cb2a965e75be701c.npy +03001627-45833f137eb7b1fb77591d1bf8931b62.npy +03046257-b4777d47dec08048fd0c7dcabf865c9f.npy +04379243-4c907aab76195556d728db1e986e0b74.npy +04256520-f846fb7af63a5e838eec9023c5b97e00.npy +03001627-fd244782842c611b6443e5551f9d3958.npy +04256520-f8a6cb92786bbafce8f8c11a24c52ebb.npy +03636649-6bf0f3417f775d2c2cd2160e449d45ae.npy +03991062-a3cc533ab668af4ec0708f7bc962e512.npy +04090263-471f57562c00a5c7bb6581a048a6fb18.npy +03691459-ea95cdbe8f4114107354c46aadb2b2fd.npy +03642806-ab9321d89df4d58e78c854de246ffde1.npy +02933112-89ddbdf6366df2a93c2e50348f23d3d.npy +04379243-53bc187c97cc02adda5d247a475c516d.npy +02958343-dca8ed788347b28c171cf359a50c99bc.npy +04379243-d5c3aa73e043303b7ff6ace05b36a5.npy +03001627-7293291b3fe8233fdef1c01cbd4ae0c.npy +04090263-68cf8f5e1bfb9ff8e71e857afa9df271.npy +03001627-22086876a4f3bba0504721639e19f609.npy +03001627-265c564e26071961e27790b0ec8671f7.npy +03636649-aa6cdecffb9d4e403ec7ad443e0ae81e.npy +03001627-bc743137d2070eb1f51f77a6d7299806.npy +02691156-718b6f112f70146c62b600da24e0965.npy +02691156-f1a4a370f9e50890686c25eb09ee7de5.npy +03691459-ff8251d486de70545272b3489d12484f.npy +03211117-e2e40536be6daf7615000ab5e56184f5.npy +02828884-9bd9483c8eeeb703cb2a965e75be701c.npy +04379243-1a1223b411a9cf92e7c7920f6a65a54d.npy +02691156-db4079b8c7d3d674ca8607f540cc62ba.npy +03691459-1f6b0aa7568e70675c91d2edd70c353.npy +03001627-46c7367eede2d9c5ca2ed12df13a916a.npy +03001627-e8c1417f4eec96d228a7992bee4d8cde.npy +02871439-a3bfe9cd86ae43ff36ea1eb6542fe7e.npy +03211117-631ebdea5af51e499399ee63318a21b.npy +03211117-2cfbaf480d94552c43c8f1cd479ffb1e.npy +02958343-330a8f1243e7bf8b2ca8bf2993ca245b.npy +04379243-df03ded86df8fbd2ebd284456950c944.npy +04090263-3bdae6ac0efbaadb49a3c1009fa79820.npy +04379243-2555c9df5fa919692250bf58700b4d8f.npy +04090263-e69cc1d337df7c83cc34b900bb2492e.npy +03001627-2a75b2bb82d7f77c3f9d6e0ade5188b0.npy +03991062-129f9498c8f842b837ab51e1f8240a33.npy +02946921-2eeefdfc9b70b89eeb153e9a37e99fa5.npy +03001627-43e74f15a986eb626a90f735365ac29e.npy +04090263-6b14119033dccaa5d735fa1ab17311ec.npy +03636649-f7627b6ebf92fca6d3f6d823f04dd65.npy +04379243-9bcd5f77b6eb92ec415434d4384bb66e.npy +04256520-a6cfaf6913d9559b7e66b3e5c11f24d4.npy +04401088-d7b2a9546b6f68bfd0659574aaccef0b.npy +04379243-932079d89ba2e7ead16260d4d73b56.npy +03691459-bdfa20e11d204ecd35cd53a06b1d2317.npy +03337140-4106f81820af1541ffe3432ba4f2e6d3.npy +03001627-3dc39c34c37860da2ef1c225dc7772c5.npy +04379243-5f62b83cebad8dd1473f10e6caaeca56.npy +04379243-88789f9c90fd644550c5faea6c3af4f8.npy +04401088-aaf1159cdc4e6ce5b2ff1d6fc3caddc1.npy +04379243-832607835e99761c276b6f6d90ee3a83.npy +04530566-c89c8eca488d5072cdd34f38f87d26cf.npy +02942699-f7e2afd70e37f60ad2b6f4e920e50f96.npy +04401088-c3ded7599240c96f8bbff91b1135bb3c.npy +03001627-432ed2387d4982a635836c728d324152.npy +02808440-fd415d5823bea51f44221bef0fa3c36b.npy +04379243-9fecccf2e75e7c8e1099144def22d76.npy +04379243-b1a5b2caa2b7dc95f51f77a6d7299806.npy +03211117-c4e4d46434173023ddc138ff009971cc.npy +02958343-38f9aa4c68327bec760191d847b7480.npy +02691156-4def53f149137451b0009f08a96f38a9.npy +04530566-d795b03f47dc7cd5525c5b030c9fa146.npy +03001627-c54a464d63efcab2c389b3ea958c8248.npy +02958343-ed799c077fdf7dc47e5246097b57ccd.npy +04379243-64e572ed8f8f23bb815b2b467e8e2eac.npy +04090263-aeba4ad00dae0c78c79f92df566f8c6b.npy +03642806-195e2a65e5396271bc7eb7ec22211551.npy +02808440-27e0851e99c4d04470374408dad00379.npy +03001627-8ef2169d274aa2e9b16dca03855925bc.npy +02871439-5e60b8632d1d2c665dd0ef7a12d95543.npy +03624134-24c6c5c56fe9bd3c37b23f392db50c63.npy +04530566-a51410ca51a40c2529412f6cb23454eb.npy +04256520-ce99ea72f222e7d58bf939d21e50c410.npy +02691156-5793a442744f4bcf7af203abeca5ce86.npy +04090263-49e4708854f762ae9c27f9a5387b5fc.npy +02828884-b51ae78137662b05d2b12aa6a0f050b3.npy +02958343-4bb89ac11d478c0a71fc473170b0a51b.npy +04401088-ad0af9e3dc8473296841a8d53aa30506.npy +04225987-cf04a6f4312be2c0d6f39b72607d85d7.npy +04379243-e696a670af11d5431234386b1304ec62.npy +03261776-20e16ae7c65d81269c1db271ad9472a7.npy +03636649-70e29a12260f811d8f1b70ceeb5e9a89.npy +02691156-e380f6fa720e1c15560a4691498bd2fc.npy +04379243-bb794c54a628a3db6ff454af1e8947f3.npy +03642806-68adcb59ad19c431676394b063daab40.npy +02691156-aea5192a4a7bda94d33646b0990bb4a.npy +04004475-2b1e3a43701dd4c31f49b1a1e04897b9.npy +04379243-e501ac06884534b5d5f962f170e40e8e.npy +02933112-688102337377c19d1d860ee2ad2a42e1.npy +03001627-901cab3f56c74894d7f7a4c4609b0913.npy +04090263-604d962eb17dfd5166c0c88d96ba938f.npy +02958343-decdf28e46edc632bda733a39f84326d.npy +04379243-c45633a0a85fb4d0631c3671ad15929d.npy +03207941-b1080bd937b04a44575f4e5007488531.npy +03001627-1a38407b3036795d19fb4103277a6b93.npy +02958343-fb8adbcf67d858fc28044fe9244db50a.npy +02691156-6fdf55a7ca1e64ff7d7b38cb4a2969ae.npy +03636649-7869e39e4fcaa1b7ab26a588d1ab0ca4.npy +02933112-8a3f6cd19f3f92fe7242f2b1500945dd.npy +03642806-6b78948484df58cdc664c3d4e2d59341.npy +04379243-76338ed3326689b249524cfd5973a145.npy +04379243-a16a6d438d57667bd3299846d5c00f08.npy +02880940-a98b76254bcd32c05481b689f582aa44.npy +03636649-a4c0f3aed58f0e092fdae21c212bf119.npy +03001627-1cc3513e4d81516267510d684b7bfd11.npy +04379243-914293e9cb32a51c880e543f747aeae.npy +02691156-4cbca5f95cd6cbc6e59552931a2cfd3c.npy +02828884-49eda923afb7fd21456cbf78e1e89022.npy +02876657-da2703e6d87a28e75887f1f81e7530ec.npy +04530566-bf5112a856a8f6a3819d76d0172b8abf.npy +04530566-4140a889b730d00cc613c8345c33a85a.npy +02933112-77342f11ba666144d71237b3923fc09.npy +04379243-57dbdc49bd549a508d1542df8403619f.npy +03001627-6b9149d69d3140da258ce5fdea186c4d.npy +02691156-cf71f5442c4120db37678474be485ca.npy +02958343-515492715a04d8756a2345809e2bb169.npy +04379243-3c04f4e0d183976a7e7cb173e141227.npy +03001627-3e72bf47e31aa669f4b6538438a0b930.npy +02933112-80a3b5b036021b8e404dc8be84d677e3.npy +04554684-bb609567ff4d46a0a44768a940557d1c.npy +04379243-33b081062b2195e71771ee930e861b13.npy +04401088-5828a8259ba570bbd24e3068806a8c67.npy +04530566-5e8ce498a93fb7eae1a9c234926c21e2.npy +03211117-6bc1a795d199d952f97ef3b999ddb957.npy +04379243-26305aa1754510f79b3e1be3524f72f.npy +03691459-9f90d7bf89231ba94f5aa6ea4540caa.npy +04099429-5a7f14f4b25dd99ceae5cab1248d1ec6.npy +03211117-b08085c7aad830e3f45db6a75d78cb47.npy +04530566-92f08b4bd8aed9bedc2616ac929c8116.npy +04379243-a4f302ce157687e0861ac00f334ea98c.npy +03325088-a06f174eba7c6553b362845c6edb57fc.npy +04256520-a3a22ad51e59d79a2fe54017cbc6c7d7.npy +03691459-d69d5cf7868651effd28950562697757.npy +04090263-d03854e6d6c6eaa19be81fcc2b07ba08.npy +02747177-ef22cb2b0800568f63b2acb037dfbcde.npy +03046257-8883b1a1a421a178ddd3f1aa46ac1f89.npy +04530566-efa50c4e3e691d3bda1b3e013aeb1e59.npy +03636649-49d9e5b7560eaa89819e369e3c49bff.npy +02828884-b58a0307a86959bd564f6f5de611dfed.npy +04530566-ca3d2f904f53f945d02db4eaa8d7ba76.npy +04379243-ef575c402b734f8d810b14a81e12eca.npy +03797390-4f9f31db3c3873692a6f53dd95fd4468.npy +03001627-131edf0948b60ee6372c8cd7d07d8ddc.npy +04379243-627b977736bac8b0a1f97bf2d7a10a96.npy +02808440-c534e117a4fcebf67843fb4efdc19510.npy +04379243-50f52f9ce377596fc955e5ed03ef3a2f.npy +02808440-95b7632f605a0223321831d2245cf06.npy +02933112-9f17f45a28d063e7391e4d6c585a697a.npy +03001627-52469c47362e41e719fb4103277a6b93.npy +03001627-3f60205b1eef5555a4bf007e7299d9cb.npy +03001627-60e36f3ad1dad5cf71f761119ebf0b45.npy +03001627-3f55885c27d84e5951ae1a6e89264401.npy +02924116-65af4e2e5f2e31431e797b014c500fad.npy +02691156-2e3c317357ecb038543941eaaf04581f.npy +02933112-24b3f8b6bf4a9a7391a3d45e8887248a.npy +03001627-325bf2aee84a1fcdfebad4f49b26ec52.npy +04090263-58f7db3c6be48a83537e3f6cd50ed63c.npy +03636649-9802abad61f4ea7c37c99625b0c170be.npy +03636649-7260ad08488a3156f78e32cea3be35af.npy +02691156-78646117554e23162c00431da4ecd526.npy +04256520-39a79339b49d7cfbc16a7f7cb5642902.npy +03624134-ba31cc5e739da65b8295dee32711a98b.npy +02691156-b6da5542f0a81fb5aae46a5cc955c766.npy +02871439-5b794f8cee0075b53e96e486ca7cfab0.npy +03467517-41262de6af84aa8b57e59dddfaae7826.npy +04090263-64e5444076a4f4f53d69fb2c36f9ef2f.npy +02924116-de287261fce4d8df114c8eea6eb81d0d.npy +04256520-7b2ee63737854db3bd16d4490a10a752.npy +02958343-5c8f71dcfe980f714f3a54559bf4cbcb.npy +04379243-2e666b458f1641f248cb96c78f6ddc11.npy +02691156-49f400e6574c75554c3a35cee92bb95b.npy +02691156-b0b164107a27986961f6e1cef6b8e434.npy +04256520-65ec93f47687b6b4926f354063916d1d.npy +04401088-7a458ea841e4e67a11ee7ca4f000feba.npy +04256520-ed394e35b999f69edb039d8689a74349.npy +04379243-a4fcd8afe8b6de585beaf00da5b709c2.npy +04379243-8b7175b6c74385ac87187471eb78d702.npy +02691156-cf310fe73705eb85a099666f6cac75b0.npy +02933112-d2dc852235fe39ca1112a51947cf2b61.npy +02958343-b7f957411c3353432fedd0aa3d156746.npy +04090263-e9fd75b68e06c18cb056c98b2e5e5e4e.npy +03001627-f4db2e2e90e83c759b9f2eb77f5e247e.npy +03001627-bfb93705c05ecd0d31e7ccd4db190c0d.npy +04090263-36e0d91630f7c958d4ca42bc1bef451.npy +04401088-453c590f0a1b37c1e0c2427da07ca8c6.npy +03691459-78d16c052215997b925c6624a25951b5.npy +03001627-92242be674537e3df6e4c3538272fb27.npy +04330267-3c7cb5ba87684ffaf5f4f288fb912362.npy +04256520-9d77156d64599e9b1206ff076758ec85.npy +04256520-de5ac6717fb307e6b01c58badc8bbc39.npy +04379243-9e0284056aed2a097543d7dbfecfffbe.npy +03046257-10ce229d913c23d56b08f078360ade39.npy +02958343-fea2f9ae1e25b74c12f962c15d41de4d.npy +03325088-f0d703dcfae9e2aaf38c4a12750d961b.npy +02958343-3c310afdf363201cefe5f291bc2f5fd0.npy +03001627-894f033f10abba014038d588fd1342f.npy +02992529-e8db0c85b07ac581d409d3400adf2d96.npy +02924116-4d2d4e26349be1f3be2cbcda9b6dc9b2.npy +03001627-ff3a6eb4556b2c0eb04cb542e2c50eb4.npy +04379243-ae5b18b3515c84ee39683a06407f7f3.npy +04099429-b3956a68fc4a62ed861cd78a675a5737.npy +03001627-cce9ffdcc7ca8ddea300840c9d7bfa74.npy +03211117-3cbe9bb95e5004eb342398ca9dc32672.npy +03046257-81dd20fc58ca6855c0c2cc2dfa2c0319.npy +03001627-3037c7d4d9dcb8f535b063aa516d32d0.npy +04379243-30e0f3d959b16c64473f10e6caaeca56.npy +03337140-2fc468b98c0cd227c8830fa1ef6e3e71.npy +02828884-ed9e22eeb11ee9669fc351f487d31208.npy +04090263-79e07478f6a0a2305ee5dde2964c294c.npy +02992529-25e03c305f41c5dd226bc3b9ce9ff2a1.npy +02691156-29f514bdcf72e779bbf3143b1cb6076a.npy +04379243-d826ce80b06bec855e5dde99dbb2920.npy +02691156-8e50f707e506f65f66cf1b4a8fc3914e.npy +04090263-b3ae08dad4ceb33c16b34c3751bc447d.npy +04330267-9aaca16b41037ccdb4522b651100b435.npy +02691156-313758cb2eacbb576d3e60add9f0d715.npy +03636649-a82af4e7e81334f8876b399a99a15c0f.npy +02747177-36d4caf867e0afcd56f6fc4b4ce1db04.npy +04256520-42486ef061ba8d2e9deec47d8412ee.npy +04256520-8568498cce4c2441ebc1a7ae7c4c250d.npy +02958343-56e0fef0632aed0f1d27be7764701cfe.npy +03001627-b09e3b329eb11c7dae659483f300cdd5.npy +04530566-5059b4e973a0fc7f928a2a26ac296b52.npy +04379243-c177762c0445d57ab20aa91e9e90c311.npy +03046257-f4877fa753aa6f515445e46058840642.npy +03325088-f095f7f95edff9ae54d7082b34825ef0.npy +04256520-11a47d5cdd42a5104b3c42e318f3affc.npy +02958343-3045cc22be31372859139efcde1fedcb.npy +04379243-325d922d3092f7bfc3bd24f986301745.npy +02933112-ab072b1506cbfd921b7554913e3d38e6.npy +03001627-ba40e15e28eeaabb9fad3726e97eca06.npy +04530566-b270ca5a6051053d88e2183678696c9a.npy +02942699-d680d61f934eaa163b211460f022e3d9.npy +04530566-3efda6b0c4e70f7decdcd70d755bfc70.npy +02933112-b6ec38384c0904a666023b6076341c23.npy +03593526-1dee9988a1ece53e4b3c42e318f3affc.npy +04379243-293f2e28d5570bfeaff8240d22dfd73.npy +02942699-87b8cec4d55b5f2d75d556067d060edf.npy +02828884-68df3d5c8ef4cb307cd7dbf0f3d6d9cc.npy +03691459-9a017f96829a34a2b17f090763e2921e.npy +04225987-f74a5dfc0094e2d5561dce3fe08634b7.npy +03948459-35b5b01801304bd9faea005b8f19889.npy +03642806-51be62d456a272fe96a7d658c4b5ee82.npy +02808440-f356aa82f68fe7d9adbcc9ee28cee4cb.npy +03211117-d4d8dd7053596249bc1905b3bc668597.npy +03790512-485a6b42bc4f7e59d373c34785838ee4.npy +04379243-348b2880842cbbca4ca84d60642ec7e8.npy +04256520-2f87e4958b3c1d80b5da5256e41fa569.npy +03691459-b0ba01e0a7f3553897950841baebd2bd.npy +04379243-276d614d42ecfd1490ad276cd2af3a4.npy +04379243-67eaa2b16399f3e88809fffd0cefbf72.npy +04379243-e448e3e40395d4d679414e04132a8bef.npy +03207941-fa01ff7f1d217850df3a1b0d597ce76e.npy +02933112-995a40846929e9753da27ece6ae88fff.npy +03948459-425abc480a0b390d7cc46b39c0cc084b.npy +02933112-dfa0bf0f2b48ea33e3a031805ace4a99.npy +04379243-3e504f94b63c77c34b3c42e318f3affc.npy +02747177-c5d49f41924ce872b7a97a3c2b004475.npy +02933112-c66e77615d80399466e506c113d5d05e.npy +03636649-412cac2afa6299c3f42a90fe4baf4591.npy +04256520-3aebadcd37bd3edd8f5ae2c97614087a.npy +04401088-74314be9ad38b02171eade9e9bdd0f45.npy +04379243-99ebb9278165f04f72559100997b742e.npy +03001627-22b287d232fd062bf51f77a6d7299806.npy +04090263-6a7244726ee48fc560238d65d99cb6ca.npy +02958343-c41580019d43348d3a3afd30f2e86bd7.npy +02958343-a2f658d639f46d95c6d2c2010c35d0b9.npy +02691156-daeb27ada93505b1e24e4b657f0a298.npy +04554684-1ba5e13255aa9d4840b559ef47048b86.npy +02958343-53507d1d09b3c2671cd97374110efb0a.npy +04468005-cb800fda25e740bf9f97ca916781e800.npy +04379243-1ae9db7da9a6bd449453695c10a417d6.npy +02691156-4d0898c7cac1199a4b0853084d4042f7.npy +03001627-8ade0afeb517ce00aab45a6fe87e3c10.npy +03001627-7e81b5f79e6899cea570c6c691c987a8.npy +02691156-ccf4e9c074c3395c26360e1e29a956c7.npy +03691459-bc522596f5da2ecda32913968eae7f30.npy +02747177-99cf791f4725be642ad490d4d7fae486.npy +02818832-9c203361eac308754b8a0e1f781de28e.npy +03691459-7b7d7bc551ca91b3a03d35fe89e56e4c.npy +04256520-d01ce0f02e25fc2b42e1bb4fe264125f.npy +04379243-2425d3befad0440febad4f49b26ec52.npy +03691459-b0f209faa41b8f0879da6431b0766445.npy +03001627-eeaac38269e8f591e55fdfa049133df8.npy +03636649-927e0654427c4d0b82241d99b4e87f38.npy +04379243-22c2431d6be8a3a8d6983f351200ac6a.npy +04256520-ccb08f869edde5e6d8adf1ca87495d41.npy +04090263-c414225a3a0fd0211513ff7357dae269.npy +04379243-f52e52094d8240b2dcfcef693e7ec696.npy +03691459-68bbfac3232f153c6ecea800f06e81d.npy +03001627-9ee5eb90d1176e2547dcda54be6a23ae.npy +02691156-3921f5f454c5733e96e161ce7a956a8.npy +03001627-eb8d2003087a27cf63e9f3319eb5ebb.npy +03001627-715530026c6459873e8366d7fa2c218f.npy +03001627-5a30a8edad307d8b04cb542e2c50eb4.npy +02958343-6f1c766eeafc7740e5424e4e99c9576.npy +04379243-279351131d06222cbe9bca6d7b2e5b3.npy +04256520-c8b49063b5c805ff62a510b8f97c658e.npy +04530566-d350936cad33863bf2ad837508eb2db7.npy +02691156-99c13d3c3f30c34dca8607f540cc62ba.npy +02871439-a976a61f71a8e700876ba2153f34d1b9.npy +04379243-bd9257f538038fac2d9fe390e23fd20f.npy +03636649-f29a94f969dd55ffc35131da26f8061a.npy +02691156-12991e9529a2b2bf9ac9930d2147598f.npy +02801938-97c3dff51452522814513156cf2b8d0d.npy +03001627-78f722590b0885a61efc6aa41666df08.npy +03001627-6c7a07030e673b0b9c9eed7651b77d0f.npy +04074963-240456647fbca47396d8609ec76a915b.npy +03691459-5a943e38dc477bac4310636931b68fdb.npy +04379243-b0d1fc9676e551849e25afd4f06934a3.npy +04379243-db8756b02359c6553f28718dab796f68.npy +03642806-894e47a6adb76680d4eb7e68e898dc44.npy +03467517-e90e8c13288718055216163257dea99c.npy +04225987-ea25b5f1fc8d76a36a1b26eff73443ff.npy +02691156-fb110c5d01f1b3fc59dcf12563d8fce3.npy +04090263-7c426a52358e8c1d64c4db7c3b428292.npy +03211117-a1e844489abee455972d35c68e1bdca3.npy +02808440-3b59f9cff3d39a0b602ced3945939e8e.npy +03691459-4014de6b20178cb92633ff66beb9cf31.npy +03001627-fbf085824e25d7c440ef1c8b63a628f9.npy +03325088-63268b9a020fdb0e2f0f992e258eb5f2.npy +02933112-29dcadb19ddb448ad98e761e6d91dfc8.npy +03691459-8edca4e07dee64e0a08ef684995f5adb.npy +03001627-c435de7be7f5bcba65ba78ad9601cf1b.npy +04530566-ed397dd3d2ca4c8a69852296a4bb593c.npy +04256520-53ce13a6f6a1a5f9f15e23b99997e42b.npy +02691156-f2171bb2d715140c8b96ae1a0a8b84ec.npy +02933112-1a658b76afedb342490ad276cd2af3a4.npy +04379243-26a97ad8dd79eb1ad0c63a304a95442d.npy +02958343-293c7cf5fdde18258acb0ff76f4aec7d.npy +04379243-7bbf01c219dd51fd7d8864caa856253b.npy +04256520-7822a1ef8d1eca8af51f77a6d7299806.npy +03261776-301d3c7e7a8cd529c37e70ff83bcc2f.npy +03325088-80d6971df918758f871adc8ea82b7293.npy +04090263-62d97682c57a0a14758f3dd6623cbf27.npy +03211117-937190441ee0d2568b7ba679b8625927.npy +04256520-9bc53cf72e1b969deda761b10992452d.npy +04460130-d9b4d966b63ba5e12a83093ac1bb2d64.npy +04090263-b73a819d88bde44c24d00518a3dd6ec.npy +04379243-e77d26aa88ec531cc17e7f250c5222bd.npy +04379243-384dc1f8ec0a0cc2ce152ffe2d789882.npy +04379243-9052a28510a4240d49d36f5b69384ad6.npy +03001627-b239fa34b4cb5a8e9b75b6346baf0c12.npy +04379243-7da66ff46ecb79e52225858d7500e21.npy +04379243-831985fb385a5b2a9ae2d75b4fc35b7.npy +02691156-e028fd73515465da5e9e2656aff7dd5b.npy +03467517-d155056f08e7bb10ace273aa67d227c6.npy +04379243-67c246e981ece9aa9f0f464e9e8e09b4.npy +03001627-77ed9ca45b928542266f89139e159db9.npy +03636649-33caad3abdb4f5192d48ab934af26487.npy +03001627-78393a855f214f387fdfb54d66251309.npy +02992529-27c4bf6a96c6439a86a04ec9e4169973.npy +03001627-3bb2201ba3b8709523f4da4464aa0c0b.npy +03593526-8fb8d64e04e0be16a383bc0337fb2972.npy +02828884-ca6a1a938c160036a0f31147c37537e5.npy +04530566-35e1639eac2c9b96cfea3d4fc15719ea.npy +04379243-64fd4269b04f91ecc68c5db94fe444f4.npy +02924116-fb659ecfc831c9915b4eedf3392260a.npy +02691156-d405b9e5f942fed5efe5d5ae25ee424e.npy +02691156-9912e7eaab960bf0e3639a60ffa58b1e.npy +02691156-b3135ae5bad8cc23cbaac693398e53fa.npy +04379243-1b4bc147baf68d4ff008d8a3590fb522.npy +02828884-b6da9b2fefbad3d9693697d8506b1c6d.npy +03337140-5ff8f64baed1c8ea4c3aee8e9d3a6ffa.npy +04090263-64276d3a962f6093923f5cd444c75b1c.npy +02691156-150cdc45dabde04f7f29c61065b4dc5a.npy +02747177-fc7ba0ce66b9dfcff155d75bbf62b80.npy +04379243-21691795da12fdc7bc95db5d49def9cc.npy +03636649-d6c6665366854e6abec99d5b4657d5b1.npy +04460130-9b1903c94dc60e7e38cd8eb23853c009.npy +03001627-c0fa1417c0cf2f20593ebeeedbff73b.npy +03691459-a10f7be978f78f085e2bf91b698938de.npy +03001627-91b738d40201bf18a413908c0e169330.npy +03001627-ca9f1525342549878ad57b51c4441549.npy +04401088-901a0180abe1011b3c629b56d283e7b8.npy +03211117-7cff26e6dc84bd02c598d38a6a69ad2.npy +03636649-60272eb623298fd190a9ce3e4b15521e.npy +03001627-a6bdde9da1322bd5116162acefe23592.npy +02691156-dca7f88e151f196b8179909e06795c03.npy +03642806-b233163860361eda8cfacef5204026d6.npy +02808440-506a041b7ad271813321831d2245cf06.npy +04379243-bcceb065b8c433b99a87002a4eeaf610.npy +02691156-85743f17e13271e0709eb7790ef48e0c.npy +03001627-5d8736041ded1ac7de03ab2a27ba7531.npy +03513137-27e52dac4cafdfee2a04c68bc263be.npy +04379243-a1dabdb19c7e5bd1426cd1b7e837ebc6.npy +04379243-48efd13f8115e3cb855931d119219022.npy +04379243-67e32538a35a5011a0ab1d82ef09f78f.npy +04256520-8efa91e2f3e2eaf7bdc82a7932cd806.npy +04090263-30270408f4d258d2feaf99d0c6c9094.npy +02691156-1807d521bc2164cd8c4f5e741c2f9cdb.npy +02958343-aec393b8c73d3a8ae4bee94a37836d67.npy +02958343-48debbfd63725a743978555bf44cfc9a.npy +02828884-11e98db089a66426ad5067eac75a07f7.npy +03001627-588ca1d34f93eddd8ee30571b0da74e4.npy +03691459-8675e32f2e122ea5c13bcab6e4ecd7e4.npy +03001627-5fe6b79e75130974e8f8c11a24c52ebb.npy +03001627-3823798ca4fe0b439710e093c764abec.npy +02801938-87b731ecd900e291c763c9d0f7bd78f1.npy +04379243-57de7158b2547dbaf2a235c3708accb7.npy +02958343-e738466fb6cc90530714334794526d4.npy +04379243-c1c52930adc815564810cc21086da42.npy +04379243-7d14ae7d0b7338bda0ab1d82ef09f78f.npy +04379243-a7ab34edcd45d7573da27ece6ae88fff.npy +04379243-7e261e5b2b11cddc557e22af3c71c6c.npy +03001627-f439a2db6341cd85f2b931201029bc76.npy +02691156-33d955301966e4215ebedace13b486c4.npy +02958343-63316c4cff51de417fb21fb4ec0d8d1b.npy +04379243-17d336aa38bb77fab1b6b0c5ddacb607.npy +02691156-4100df683795dfa1f95dfd5eb5f06d19.npy +03636649-d5e278feb6007ccb88e7662971dc736f.npy +03001627-8bb332c5afe67f8d917b96045c9b6dea.npy +02828884-ea4740ede10b7620c09352f205bd9134.npy +04401088-f2db6829e0c0298140d50eb4da376b1d.npy +04379243-745a2b060d0f692bf4b6538438a0b930.npy +03991062-b2e03341b4648a3d63b2acb037dfbcde.npy +04099429-3c43ddee5e1d4723db652c825617e3be.npy +03761084-255a0ce59720bf24a53276bbe109327a.npy +04256520-b10ae372f7988e3bc242632b2a8c3129.npy +02958343-bb7fec347b2b57498747b160cf027f1.npy +02828884-153116d4415ee016601104cd2d998272.npy +02828884-3d5cf677f2aa9ad978d4d2afb777f33b.npy +04401088-3ca1d72d2416bee6f4e9c7b80248eec1.npy +04256520-1db7c7411c5d957918f52c8a4cfcbe33.npy +04379243-6dd08b216592dec6a6797fa823fd42d2.npy +03325088-ad51249f5960d841c36fb70296e45483.npy +02691156-78c5137e361e02cb24624455c20aef91.npy +03211117-4ee8d3a617b574ee30582dab79e5c58d.npy +03691459-35196460460f022a105260687f2b18b7.npy +02828884-f2c542ed9750ee4668db2d7865d1f724.npy +02828884-ddb2c6abe41b2063ad5067eac75a07f7.npy +02876657-df4ec460683acbb89d789ef7917b7723.npy +04256520-6f6a4f12041ce6d2593ebeeedbff73b.npy +03001627-53fc74fb69742cab20768660cf080d12.npy +03211117-9da823886a808f7da8f1d83a370a51c0.npy +02691156-16d40e779903e77863b132896d8bc65d.npy +04379243-a1896691fe875eccb9968f25875bdef4.npy +04530566-bfe67a6080ff5bc17ac1d5790f13a22c.npy +04401088-df90c50a892611ca8536be73396b323e.npy +04401088-2c03ac9bbb3d918411f02c4c36ed7f25.npy +04379243-d1296da8d3a45ac88aaae3d020f5ddf8.npy +03211117-ed7d00e977de27e2bdfd4afbfb3ee4a.npy +04379243-872e9d0bc078b4c8b9a1f0848a4940cc.npy +02958343-e5ba98879f06d013b2d3f2371f6b0762.npy +03513137-51ee565cc330e131b20f6e48f6a30cbf.npy +02958343-c6191031c1d685d580360680c1602c7d.npy +04256520-cbe2e3145eea246cff40be78d008f276.npy +02958343-8f87755f22470873e6725f2a23469bfc.npy +04530566-a848decbfe26833c4a27b0b4657ac8b5.npy +02691156-eac2573ef637a0dbf31cac033b2c0831.npy +02924116-6885092b0d1fbb6a8db35146c0a9b3fb.npy +03001627-71eca23b5fc484cc59fe89a0706f1a71.npy +02691156-a762fe69269fc34b2625832ae05a7344.npy +02691156-ff28d340bf0b5d9387b2a887422ab97.npy +04256520-33f47039e62a39e5febad4f49b26ec52.npy +04090263-5a5f7025b960f4bc745f2f3a558dc3f8.npy +02691156-9052a53f45d5f8487d64cad20089f027.npy +04090263-c9b540abc1cc7a107d0c348381a9a6e4.npy +02691156-67dbb0de722cf5cd7a734abc5ba1db0f.npy +04401088-1f4e56064de606093e746e5f1700ce1a.npy +04379243-eeabc27816119ff429ae5ea47a8f21e0.npy +03636649-ea235afbbaa6fcccf32735686fcd8ec8.npy +03001627-6aa1ba85285feb756306d83fc23a955a.npy +04401088-9c26b9b0584920f1539baeab407f4a02.npy +03691459-b7285ba6fc6628a1a43ada367b02a4fb.npy +04401088-2df0bc8b46ad3cb858932236a22029d3.npy +04379243-94a53bc306d106708bc6f322a9608b07.npy +04379243-b67fc33298d026033e0a119fd0be5d3f.npy +04460130-fe5ca50ef83ab52438cd8eb23853c009.npy +03636649-414d4397dddc0134fcb8d8c6d4df8143.npy +02924116-6c0b2009e8496a1b6025f5d96fba4d9e.npy +03001627-f229c56eca8c0ecdc3bd24f986301745.npy +02691156-accb9ee4edf6af6ce4080dcedcbec993.npy +04379243-71115e3a391785be853acd6c98b3fb18.npy +04530566-af07125f24a17476eb2c303a0e0d287b.npy +02933112-7dac6c932ca4f2fbb1cbe768f98549bf.npy +03001627-78b7f3cb97da38c41471b11f88c7b46c.npy +04379243-d1cc46478cde981b9a980acf1a5058aa.npy +02958343-c721c1e89e68e01fec4be884ee173bab.npy +04379243-1b43b4892ab3a4612e85eab6bca44d5c.npy +04379243-968714b674baa3152cf0938654a53e55.npy +03636649-1b79210962721517fcddd74ee6c69025.npy +04379243-76c01c98aba64318fafec1d6d9ed06d.npy +04530566-38189a2101b5e6c3da32b7c218678a0d.npy +03001627-66e204998b6c4f06ffe5cbaf6252d67f.npy +04256520-f6f563d47fcdfe82d67386763ad34603.npy +03001627-d8d5829083c66bd4f4b6538438a0b930.npy +02691156-10e0a7255d279a419751c7a6f15617f4.npy +02958343-ae0058d9ae9bd33d51a95aaa6caba1d3.npy +03691459-e51ccf3bb4413ceb61775b840d882da9.npy +02808440-18a3dd79ce17724bfe52ffd0e748a1ab.npy +02691156-4ae3924f14d2c0084c3a35cee92bb95b.npy +02924116-b5b6404c3267e782f446f92b52bbd82a.npy +04530566-a230c555488ec2664b07b7d8c0d68c50.npy +03636649-b6989c99bba1226539b3360f500ac52a.npy +02933112-4392ad03e7d769a6180dd1b6c5060a26.npy +04530566-203c2cac2c46e06c320fa6e2cd857828.npy +04379243-f09cdde03794151a17be1b91fdcd9df.npy +04379243-b602636c7967016f7305052ff007b248.npy +03001627-fe99f16c2532cdd07ba99ad16fdc05cd.npy +04468005-a89aee8719ab69704da9f355ed79f620.npy +03691459-fba87f3cb973b06871bfdb4b1c2ed05e.npy +04379243-d62417059f78e8e79d2be74cfb51ade1.npy +03001627-b58a0307a86959bd564f6f5de611dfed.npy +03325088-a951f273c8dee77f96a7dbf21dc55841.npy +02801938-2ca614e0e17d4e93162da3dc7be329d5.npy +04256520-f20e7f4f41f323a04b3c42e318f3affc.npy +02828884-ec79d41034e8deabf4fb4dee5181bee.npy +02933112-7fadf6464f6ba381921dd903dd0b8b17.npy +04379243-7c29fac52d4a061140b4c5428883e585.npy +03001627-38c65f38e51df0746fd487bdb55ad0b9.npy +02992529-72e61015d1e4fcee8739b6dd0f9695f.npy +02691156-b3c7044fcd6f15c24b0a1bcf2fb497ec.npy +02958343-8b090b8ab3172dad2d7a27ffaafaaddb.npy +02958343-8efced0ecbd1dd99713391d1ea8d388.npy +02828884-756c2cbd2d42644052b192b5b7698446.npy +04379243-1bdb9df06d749be1a7146643e6b355e4.npy +03001627-668aa5d430fd6d4e8f7d9678498f2295.npy +04256520-7d804eb69e0eedba450447b3239e17e9.npy +04330267-9fde0df9146d61f119bea36737d5c9cb.npy +04530566-1b4268c4d812e54943bd01645155d3ee.npy +03928116-22ea33abd17d1a24c87275f53cae84a.npy +02773838-f72de241037d474e76bb31db0358e9c6.npy +04004475-bed705ad5e375edb5f8fbe378caeb270.npy +03001627-60637687ad5682ef2b93a65c5f642e3a.npy +02954340-1fd62459ef715e71617fb5e58b4b0232.npy +03467517-fc8cc32bfeaca537c39ad9186be3fec9.npy +03211117-66d6590ce707340f1c7075c2bc313334.npy +04256520-20b12dcbb70869c06b5c5023b0ce157e.npy +03691459-4d264fc57f6ea6bde389c9be84ff7ec.npy +04379243-2b9153514eb1c46bc6a830e27533d086.npy +03691459-36206fcd5fd8821996ee15847b17fe3b.npy +03001627-d5b132a3e903e8fc8ad3a7d07aac2767.npy +02691156-5aa22f8c52d2f777a80799ffaf21ea7d.npy +04090263-7744efae453f26c05e9263096a26104d.npy +02691156-4063fb031d8fb78e505ae8d422ba349d.npy +03046257-d9543e5f16e6574a8e9a0e51a554788d.npy +04379243-ab55372db393e4259ccce4c6d5bb195f.npy +04379243-d19c946f825a9786db6175ef18ad3f80.npy +04379243-88b227c5fb3906ce47c638c0eee4a2b3.npy +03001627-2ad0943e70c0bd1481f667e2a25e0619.npy +03636649-6faa72d18f52d7172cd2160e449d45ae.npy +03001627-9ef3323c6ced7dfef313a0fb5fd4d79.npy +02992529-77f5498dd2277aacfd71ce99fb45ba0c.npy +02954340-9bd54e0123d3cd70a52821bf1aa3b19a.npy +04379243-bbb11b745f7c75fdb5b101ae4c3e9377.npy +02808440-c473362142f5cbdd8dbde1890f8a76e.npy +04379243-9d71f9424fc659e17a50afc9c93f8a50.npy +02691156-94ce3a5ad2576e73a5cac89017eae8d1.npy +03790512-e30b8ae3e945d7f5a40fa6b4bae5e67d.npy +04256520-76a9d700dcc91a5fea4a3d2e6628d0f2.npy +03691459-2e40fbdc900e69593971c6f4f1d0a4a0.npy +02691156-b2ceeee3c5b75962ac4f72bf08dc79a6.npy +04379243-e0940f2229e42007d98e761e6d91dfc8.npy +02691156-cf911e274fb613fbbf3143b1cb6076a.npy +04256520-62e50e8b0d1e3207e047a3592e8436e5.npy +02933112-11b8fd945de0ee99642f6fb37a230b5e.npy +03001627-69e35c579a68fe146045fdc35419ee6c.npy +03938244-d534e22b823ad56f630771196b76eab9.npy +02828884-d21839a3d4b5b30f55f46d55537192b6.npy +04256520-24223e3bbba442ffd19c4e0cc3eb15dd.npy +03046257-2451f214bcfd8ed9f3a54fdb52b446ad.npy +04379243-8af3fd230ea7ac6518101790733ed6b2.npy +04379243-f7d727fce5ee3007984a3b60f45af7f.npy +02691156-fc0097a6ad81e5cc1c2daaaceea98731.npy +02933112-acd46f0b09a84c226b987ec2db2ce6b1.npy +03636649-852feb3fca95b6d5dc3653f8341633a.npy +04090263-1f01ba0f7e0948f56108ae6b1ec0f04e.npy +04256520-d9d61f08002dfae421cfc6e95839d798.npy +03636649-8c410dce9de0c632ecb14096838a20c5.npy +03593526-ce2508ec4476b2cbf51f77a6d7299806.npy +04379243-7c770e38383d59be279e896561802d26.npy +03211117-c08e59a3d09cbabf6002a1da9aad9f4f.npy +02691156-fd67c89ff247f9e7442ed26ceeb35a60.npy +03691459-ee962ab0dbd24bcef78c4384b551bb5e.npy +02958343-e2a4635c392e750abecf71e2e014ff6f.npy +04256520-cc644fad0b76a441d84c7dc40ac6d743.npy +04401088-18cb51f36acfe30a487d18402ebe69d5.npy +04256520-1589b8a09c8bd67551d07d3e9ad67a2.npy +03624134-581ad58ce8664d2d4ff0e6230d32c1e3.npy +03001627-9b42da9217caaed8f51fa0238791f5dc.npy +02691156-97ec5b82d9757b639cb1b92881e8e76.npy +02933112-56031b004d5306954da5feafe6f1c8fc.npy +04379243-4a41fa511183aa138cbb8bac2032149c.npy +03928116-b36576fa2483c97a3c81f7197f981187.npy +04379243-f1324b15b7cc9cd48e689df3ea785530.npy +04256520-d08fc6f10d07dfd8c05575120a46cd3b.npy +03001627-3075380de1f28ced3d290591da43d03e.npy +03691459-164ac6f6252e22b5f5c320b27d54d683.npy +04256520-7994498bd9b426cd37b2bb75885cfc44.npy +04379243-8c65dd783d2afcf468cdbc8b02ff160a.npy +04379243-1cb0232d2ec82f9ead135ea7bc8aeff3.npy +03991062-8c3c0ec3779a163098910e50f05b8001.npy +04379243-34fba2f856e97796b0a6e87d5d5521b6.npy +04090263-ed941e7672a4cdb0bddd549216d19f7a.npy +04379243-f023a5489450b924520ad20925ff9d2d.npy +03001627-c20dcfe55ce58c055c10b08ea69398c3.npy +04379243-b1c80d73aa4114811011cbc4b5232a4a.npy +04379243-f4692dabc20f58e0f51f77a6d7299806.npy +02691156-24cc8816b384723510a7b8c5fa89c603.npy +04530566-2988a53fc376653aae529ab4a75c4af.npy +03001627-8e2b4f8e0a38d2cdfe74384b8bc69dda.npy +04379243-c1c81b60f786873262379fe9a26f5cb9.npy +02946921-4d4fc73864844dad1ceb7b8cc3792fd.npy +04379243-629d09ce8c10a4f866603970dfcc17a6.npy +03325088-327d16b036d840a2e1bf57430463e143.npy +04530566-571a2485fb205e5fa9142e7277ee08f1.npy +02828884-f7ffdf91b66c0c989c9513cebb0fb44c.npy +02958343-edf4007e23cd00b359c19df2d1879464.npy +03636649-b89c79537ead39c1cbf3dda885c64a76.npy +04256520-ca81512a7d7934d0b8e42b2c59ee19ec.npy +04530566-59585673328efdf2efa33903c8f77ab8.npy +03001627-c8713376eb588f422c0e1e24bb9eb3ab.npy +02958343-3d85915d8726cc1845aa033a20004998.npy +02958343-c8fd6ee4bdbfa5cfbda3e4f05af7d436.npy +04468005-9b34d4118d5d72e9ed2f8e1c74f9fca9.npy +04460130-c47a34f2a3acdc0bce8973e274e9f27f.npy +04379243-19c2fb727de9c13c51d3c864cc68e22e.npy +03001627-72a86c2fc8d5cb3713d2510999d0f1d2.npy +03938244-2873ef9354972727b376ecd25749b977.npy +03991062-61fb1e91cb867fd930c7810cba6da248.npy +04379243-82346c794fd098f77a1f550045b16384.npy +04090263-4e007e41bad1b1cd735fa1ab17311ec.npy +04379243-f1c64d90ecf5212fac0d0a08bc077486.npy +02691156-8e2e03ed888e0eace4f2488af2c37f8d.npy +03691459-e40e7c3dea88a733eb15975241f6a53c.npy +03001627-3a3ddc0c5875bae64316d3320fdfa899.npy +02958343-470f53291d23cf0abecf71e2e014ff6f.npy +04401088-e0ccc0cae4dc414cb4e7b68321c9d305.npy +04379243-592296965078028282db9fca4b68095.npy +03325088-9797db191dd9813b14b35a7d7cea7130.npy +03001627-379f0efc898d7a7e9fe74a48bbc553d7.npy +02828884-c2e0cc96c3ae97932997d70e9237dd6b.npy +03636649-5850799c5af71d58c13933f92cd75682.npy +02871439-3040f51df4b6f5748abbce8b0b4c2d45.npy +04530566-307a956fb5eaf7a629d81e9641dd535d.npy +04379243-52e0dbbb53159e0fbd8980415d183a3a.npy +04379243-60b2e4ccf3ec715ec3abfe135b5412af.npy +03337140-a3c7255f5ec832c3492d9da2668ec34c.npy +02828884-fdf0f799b897b0c99917ad57402f53f1.npy +03691459-81eafc16db11da806583871b5c274818.npy +02828884-750cec373ccc38a3a3d37e70863d948e.npy +04379243-3c3c0da7a2581f20490ad276cd2af3a4.npy +03001627-dbf235de67b39c2d25e2408bd7177733.npy +04379243-3f48840eca0de14ee693975eda4e3db8.npy +04256520-6ab5321efc4b3772492d9da2668ec34c.npy +04379243-c4071718e45630ee5510d59f3ab1ed64.npy +04379243-7be495e700afefe6cfedb1d8b135cde9.npy +02691156-9f90f3298d7b6c6f938204d34a891739.npy +04256520-37939caae967b34da14c5748cc240cc2.npy +04090263-425279eb4cbd51a48bfbe54b5d01550.npy +03211117-e71f7231406aa6ee4019d3f83e009e77.npy +03001627-b4c73f4772efcf69742728b30848ed03.npy +02933112-a9bc0de459504729eca1c556848f5db1.npy +02747177-1b7d468a27208ee3dad910e221d16b18.npy +03001627-a3cb39c5271c3232feec1f13d2353f3.npy +04530566-511befaedb0123cd96600832daa83ed7.npy +03001627-22b48b577aab6201bb99d7af794753a2.npy +02801938-8ba662af65531fad1657aaca7aaa9a5c.npy +02828884-6a474cb5a494c1e6ad5067eac75a07f7.npy +04530566-bfd8b473e1a8fd650eb615eb69452b.npy +04401088-237b8445c70b1749ce2eca356a0e3474.npy +04256520-4e43e29a68b72d9fd9246d8a288bd77.npy +04256520-eab4334a06fafb7171c3cf047830ec1f.npy +02871439-712d0b79acf23e674dba58e91f113bcf.npy +04401088-3a6a3db4a0174fddd2789f496481c83e.npy +02933112-e0393e80702d9a698cbb8bac2032149c.npy +04530566-ac736a87ca813c6d701c68e1045b606.npy +03642806-1f507b26c31ae69be42930af58a36dce.npy +02828884-77aa33479c2ec92f610c2a68437007d6.npy +02691156-cb8fb401a278fc36bbf3143b1cb6076a.npy +03261776-c5e47b627cb7818f17e22b7299bb7bc6.npy +03211117-5ff51c478471d1f15468776e191863a2.npy +04379243-5525e36ebab96f98d989c9f989a09ff.npy +02871439-46579c6050cac50a1c8c7b57a94dbb2e.npy +03001627-5923697231e1bc86af38a3b0483df58.npy +02958343-e8c48b9ed916910ec800bf2938639a70.npy +04530566-be357b15497cc2133a18a4a0def966f.npy +03636649-6d7aeaf3c1705cc5fda82f1d3dffb320.npy +02691156-842e5dcd452f34aa8caa71b1fbf7fb98.npy +03636649-a68678b3e52fcda2bd239d670cf7d8dc.npy +02958343-a36c53acb3255d1e84b1aa0ed7e58be1.npy +04379243-fbf5c95ec6febbeb07cbf788ba0557c.npy +03761084-29012d42054b3a1087bcae7a654cc37.npy +02958343-260f0644b293fccbfbc06ad9015523cf.npy +04379243-3ce4b963a4869248febad4f49b26ec52.npy +04379243-d91619d6c9915368e6c5cd45aa112726.npy +03001627-d350f40e5f04360565ba78ad9601cf1b.npy +02958343-86a9eacf6b362ff398494085d68ad6a0.npy +02876657-9ba6291a60113dbfeb6d856318cd1a7e.npy +02958343-c2d2eae7ef1a34e1f500cc506a763c18.npy +04530566-9696dd7f30247c5c573080510ce7a6bb.npy +04004475-3800e1d7cb83b4073ba96e34ec81ed42.npy +04379243-884a1ff382ca00d340d1d1b64916e0c7.npy +02958343-5ef8eeb5ba5d2c6ff6efcf1cf084a608.npy +02992529-45e907ca47e0122c1752adf979b66914.npy +03624134-decf7a4989469d3289eec1cc60f7c002.npy +04379243-83b28dc11de6b2625c8a41baad250b1b.npy +04256520-ad856cfd25b91563c681404257d94ad9.npy +02924116-a81cb450ce415d45bdb32c3dfd2f01b5.npy +04379243-65f9103ab7a64e83cb7105765410e2d6.npy +03001627-54a6748359055b5ae5e2f0eaeb6aa550.npy +02933112-d6138b5bee8f009ebd9c9454e3d4e73d.npy +03691459-2e530fca4ce161902b12aea3a74e3599.npy +03001627-39031caf2b11a7f665ea3fba7f481d97.npy +02747177-8be2cf5a52644885cb2a965e75be701c.npy +04256520-6898a9ca21823570a888124bc30aa1c7.npy +02933112-84f34a2d86cd4f0211926054acb73bec.npy +03001627-be8dbd9726372752412dfc90452742c7.npy +02828884-8893daaecc8c76048e53587ea99de59c.npy +03001627-490941bf4a532b62492d9da2668ec34c.npy +03001627-76dd2d9f0183e09dd835cf838a2f2758.npy +04530566-c3bbda10fd915342c24de8a3b5a07552.npy +04379243-59dd0aee74ce6d1798b8c800ae001b66.npy +04090263-7fb2ec71361813bfcec05e03e317cbf8.npy +03325088-7de46bce9c800cf3979c556124bee033.npy +02691156-755b0ee19aa7037453e01eb381ca65.npy +02691156-cb91205ac0f2f62429dc68c96bb3c4.npy +04090263-6b0c761060feebe4affd759bf1ff6b0.npy +02992529-e3e43df4a3fc1870d4d7de9e3c2bb6f4.npy +04379243-e7b0ff6ffeb24ac2cfde2e560cf498ca.npy +02691156-9ba460913d86466f62347b4731688b0f.npy +02933112-ac4e80d4ad2d0ce98060a555dcc63fd1.npy +04090263-55171896c70646cdd87c63d8b3018b58.npy +04256520-96de367b3365416ac580fdeb5460f6d6.npy +04379243-5e978c92d55f7852185574a5e2255bb6.npy +03636649-77d1b5aaf145f8905ecb3cc57fe87cee.npy +03211117-534d3c5dca2d44641af9a5a7008cc3ec.npy +04379243-cfd7e354a5ae982aa0ab1d82ef09f78f.npy +04379243-398dbb0a34ca527871a782a4379556c7.npy +04256520-332b2573bb3675cf14038d588fd1342f.npy +03710193-fd3227fb95b8d29b60ffa41581e372a1.npy +03337140-4c38f799ecb6cfdbb39d771847f20151.npy +04530566-758c75266d7788c0f5678db9e73ab77e.npy +04090263-b47d65a7c6234d06b349bd01da88f0bf.npy +04090263-9397161352dec4498bfbe54b5d01550.npy +02958343-4a30d2147d0e27d13ded1857c15b5b6.npy +03642806-48e07903fe5057a1d7289d94a5c9ea3f.npy +03797390-9af98540f45411467246665d3d3724c.npy +04379243-615b800fb332525385c5f690e9252fc5.npy +04379243-57d7f4c5b427dae69dac46bde4c69ef2.npy +03991062-45ca193e946b5e19956b2452b4c13510.npy +04379243-3e645e9f5703d14e51d3c864cc68e22e.npy +04401088-6d7a0e701b4417504161e123a102b12b.npy +02958343-ddb4ad84abca0edcdb8ce1e61248143.npy +03001627-2718b1d46ca52df052bfb1d5ec273240.npy +04090263-d64825461795cad2ac2ad609ecafdf83.npy +03636649-fd2f5320fbfbc88a47c71c6d277c802d.npy +04468005-537decdce3079c857addcf2661f94d39.npy +04530566-2571a0b3d1eb9280f26f17fb5c4740a9.npy +02933112-62a332e54cca36f547b925ad5d9d8738.npy +02828884-95cbcdc64b28bbf396f61afd58e50ae2.npy +04379243-f8050e698bff9fef8d1c65d617ea0b5e.npy +02933112-c1f419412a6960a27775562146ecea9.npy +03001627-77371d342cddea8d8b424343280aeccb.npy +03337140-dee0925183a5350732fb9a763fd231a7.npy +04379243-89cc879f005dcf50f1f50f6a678fb494.npy +02958343-3232d99c41dd949a8b257f8b62755068.npy +03046257-a60acab7ef47ad82642c99c10134b38c.npy +04256520-3f5fdc05fc572730490ad276cd2af3a4.npy +03001627-4c0983329afcd06f730e89ca0d2d13c3.npy +02691156-48a9b9c041d377b26012a714b05f25ca.npy +03001627-d57bbc72d1b2670e4209d14d674fb332.npy +03001627-26aa22bd1da8b8c5b1a5c6ecbc81953c.npy +02954340-254e230d31a62470a52821bf1aa3b19a.npy +04460130-6d69bdc0bd266b7af7f1024a921d6d8.npy +04090263-60db20e995801bdcac8247d8f020ed1c.npy +03636649-2d2a1da36b840ecfd49b2e04785f8492.npy +03636649-6068920e350f1fcef04bb0474a98ba2b.npy +03046257-73956ea1cfbaa5ef14038d588fd1342f.npy +02958343-6c85063bf5e983a3d14b144052416695.npy +03001627-d2a1aaba7e047897492d9da2668ec34c.npy +02958343-d513c968e5bfefd2516624d6e93a68b.npy +04090263-c2be1232f61da4b6e79db68bf2508b3b.npy +02691156-72537a008bf0c5e09d1a1149c8c36258.npy +04379243-cc6696abd1d76062f90f8519e58d5382.npy +04256520-b99058a0054ea0f8387625a8fa2965.npy +02808440-76004a2497f3bf98581a5df406f5588.npy +03001627-1eb2e372a204a61153baab6c8235f5db.npy +03467517-4dd3b42e67a19210925e0edb2365fb11.npy +03636649-15c51ecb58bf304fef3a2c64cef919d0.npy +03001627-58e6fa617a1bed1a20b64028d2efc877.npy +04379243-a63d31d92b6bee14febad4f49b26ec52.npy +04004475-510a9921ab03cf6ab331a25788d3c6c.npy +03046257-44d60011d28940a0eef5d83b671bb264.npy +03325088-cacb193f82cbaba0b362845c6edb57fc.npy +02828884-95e97cc6e2f7e2e1d5183890546dc397.npy +04468005-9f0b225a83d16aec84e8a55c6921f1b9.npy +03467517-aa86d20d03b2303593f0194265a9746c.npy +03691459-df678ca1f17e32ec3d65eaf8cbd60895.npy +02933112-2f2a87c3626ff6fe1aae34e8209c4d10.npy +02924116-9c15f5571329510792f19acc54e02dc1.npy +03691459-d3b324de8e23851e55b62c3398327a83.npy +04379243-38bcc47be092398cbc2921df9ee1c4f4.npy +04256520-e8aa02effc458838f2098a9f7fc86999.npy +04379243-c3cd2a7f997a6a40f3017d945b17b4d6.npy +04379243-2ebe5dfb7bd9a50c6effbd64ad6b71b8.npy +04379243-a406ef7c367e9c043ce425098c6116e5.npy +02808440-6ec3dbef4a3e1cb279d57ee14f8ee702.npy +04379243-5b99ce5dc47c76af3e57e49d8269b367.npy +04256520-9ec5fcbfe43af15b851a116903680096.npy +04530566-33692290561c798e780bc2708a85ba9a.npy +02691156-a053f49d808b7b36c8db97d9bc169245.npy +03001627-40f188600cf8362b654ea6737b0d3597.npy +03001627-e6c7e75046f8946b27bf2eac25b523a6.npy +03624134-acc8da45bb6d772ebf103b0ce6f42d81.npy +04530566-6d6e65b938b88eaf3a4406b2a58a646a.npy +04379243-7f1548ee7cdd456fc2b9c3cc12089fe.npy +04256520-5b94025a52c244bfc51d071e487f31b0.npy +03691459-95d01543b46b5e43f398d0c5832df00e.npy +02933112-5382680280ef5b57d0b36851d61b6fca.npy +02691156-b11c03976f121b3537007500db3b770e.npy +04379243-3344c70694e1bacdc5bd1ef3bc48a26.npy +04090263-569416cd964e365e20152153c3a56171.npy +02958343-45e9059c3ac5825661c6c61410fc904b.npy +03211117-9db1c375f76c8ac1db01c957364e77d0.npy +03636649-8f5347fce0d9b517cac7c8ef7fe2392d.npy +03636649-54f858f74a0eb7d5ee11949398abce38.npy +02933112-9402e5123bd831e276f1f48f36df7df4.npy +02808440-370dea2a2719b07744221bef0fa3c36b.npy +02924116-ae5b72aa78a2b7f5708871f5411a4ec7.npy +04379243-e013ba1ff446bd56140a527375fd6757.npy +02992529-a4910da0271b6f213a7e932df8806f9e.npy +03691459-1bcf25863e840c11f806e7110c573eb2.npy +04379243-4d3bdfe96a1d334d3c329e0c5f819d20.npy +03211117-33c639831fef416957015074db1e51bc.npy +04530566-c8414ce9b8848c3c1a3ad8aa8e24c7d1.npy +04468005-b3d1c0e95d344ec1dc14ba0818ee5cec.npy +04379243-b2b4829e281f1ca09a87002a4eeaf610.npy +03211117-6e4c06e5dc03291bec77bb7db6eae005.npy +04530566-cc4f56a126353cd81985296f8eaaf6ef.npy +04379243-c76b1d97bda153f51226a0a31e4f771f.npy +02691156-afd43430bd7c689f251fe573763aebef.npy +03691459-58af19399a5a447e4310636931b68fdb.npy +04379243-882d74e3afe42d0b651fbe0e01830a4a.npy +04379243-40604fdd535fd2b2e393e26dcd2928e3.npy +03001627-6e92bdda1bca7b72f9a4f3015fbf70.npy +02828884-1422f82a72e0b7f48ae1c1abea367249.npy +04379243-852e28dd91e4fdb35c1975633309d43c.npy +04090263-e5a481c9c2e1f17516f51ef194451b39.npy +03001627-501bf2a6d014d22ba169b9ecd9e046dc.npy +02933112-c3755418f2df9369e7e684d25d4dcaf0.npy +04379243-5bfef1c85186b2d836b0f2a1430e993a.npy +04256520-5f531e379365040936a36f8fd7d27134.npy +03691459-923b7f0a4bf93c4fb66814b45dc64bc9.npy +03207941-af913c310f1b978ae6488a574e8954a5.npy +04090263-30ee49fefc0d62c8f14183c264ad03ef.npy +04379243-6b0fc2214ff06578eb3bc6c6d15f9bf.npy +03467517-69721c66520226b3f435ae560621097c.npy +02828884-9d4086be72fa427cd2b12aa6a0f050b3.npy +03691459-f4bb44c3b9a044ebaaa7694cf6c95b84.npy +03337140-dcc1c79e9650b987492d9da2668ec34c.npy +03001627-6d619704ac0bed9827eb00c151c6f711.npy +04379243-668da5fd442fa5ceb74af32735cc24bf.npy +03636649-b2e46fb6018d2cf2d93768e7b9b1eabf.npy +03001627-a42aa59fa23b4a4d9c0ca344f487323e.npy +03691459-5f41f45cd57adc0b885333683933c555.npy +04379243-912589813b9dbedaec85606b5c87ea7e.npy +03001627-8f521c85697cfb73f51f77a6d7299806.npy +03001627-d24f623af8e7da479dbf298bdf3162be.npy +04379243-9f760e1d7ab97519eea323f522c6486.npy +03001627-751342c7107c86f0fa9e9ca2723d9727.npy +03001627-9e145541bf7e278d19fb4103277a6b93.npy +02828884-80f9707a7e4a0cc856853064b332a2ae.npy +04090263-80b03f350a5de86e3a653cb492d78488.npy +03636649-b3a98808fb1ccd892a5041fadf25a502.npy +02691156-81e4cc88fc757ee220152153c3a56171.npy +02691156-5ae05c956af61890b58b3ab5dbaea0f7.npy +03991062-cc71eaf7278d78ce72652f4081ec5a77.npy +04530566-f03f7c963928073227ac692756be9e24.npy +02933112-34e80aa7b579469bb163e775a4d52465.npy +04379243-1aba52edddfad70d1bf0233e4c77d163.npy +03991062-752a32c80e716fb8a2c59a4d90e63212.npy +04379243-a78e8ad852e8d3e3cbb2a1d23fae41be.npy +02958343-bf0e8d944ba4843e94e7e8e27399daf7.npy +03001627-185bcb9bcec174c9492d9da2668ec34c.npy +03691459-63f006488cfdb69bdfa0db1c1e10ab1a.npy +04256520-c15b0bca48207d9d8cbb8bac2032149c.npy +04090263-76fbf623256644116c830d654bd05bb9.npy +03001627-834af6ad2a1d5581492d9da2668ec34c.npy +02828884-76efe392461139df80ac1d1d1048ad28.npy +02933112-1f319101d3c05a16886a4b751e0cc0b5.npy +04379243-d60054176a178d18febad4f49b26ec52.npy +04379243-9aca8b4392e603fcb1763573e754f7af.npy +02958343-baa424fcf0badeedd485372bb746f3c7.npy +04401088-759c984fa6831ad7bf0defeaa770e93b.npy +04379243-c809bf0ed02eef7016a2b5862518c93.npy +03001627-47dde30e987efc6c8687ff9b0b4e4ac.npy +04379243-81bfbd041dfdb827c08b855dcc4d6f49.npy +04256520-bcaf0bf7eebb7d7f4fa36fe4cfcd8f6b.npy +04530566-587793fcbae6a6fbf5abe4b4be4c3d4b.npy +04256520-8fc21752c5c874626b4675882670d943.npy +03691459-f8fde8f5f364087d2d563c85edb49108.npy +04401088-d5561b05a6b84a5489905122ac8b41f3.npy +02691156-d709b3afd41a578ba03df56f69a35fcc.npy +02942699-d1a3482c576f8c50592ecd319dfd8c5d.npy +04090263-577388c27e850a97f0fea2ee98610322.npy +04379243-3239a4e1c62099556ee5c30704fa2d08.npy +02958343-1cb95c00d3bf6a3a58dbdf2b5c6acfca.npy +03211117-31daffe57909195455357c338ec9641.npy +03691459-7e061336b31b8604d34bdc365023cf4.npy +04379243-fa1e6b0591047eaeef78a907ef09669e.npy +04379243-8f841c9a11ad77a6794a9f593d938882.npy +04256520-27781344ab489f2df29666f384be6c43.npy +04379243-29b2aaca87d19a3c5759f4335ff2e408.npy +04379243-5b0185f3a758e481618970cea28848f6.npy +02958343-f6ed076d16960558e6748b6322a06ee3.npy +04379243-e095933fc153f7371ffe260c5a3e6b53.npy +03790512-e5a9a7b8c947aaa1949b12cf3977a48b.npy +03046257-ce4de74b5487d0b0e7c7920f6a65a54d.npy +03991062-518360745bd7eb881255bc546ed0fe3.npy +04090263-322a9fd05f1f68b4dc99cc00991f7287.npy +04379243-c850233cd5ebd8a49725e3ec23636256.npy +03691459-4793c0b78701e47dd529f6660fe10a17.npy +04379243-3b465822b34ed20ca05d3424fd8d541a.npy +04379243-9b722071fde9069ccce4c6d5bb195f.npy +03001627-e64275c95e41605caf7c7ad2549a1b15.npy +03759954-c66b5236940fa0c474d0d70573a389d9.npy +04530566-721a41c68f8d1e1af898a4b2192a12e.npy +03001627-56ab99b69cbc1bb50d55c58aabe6e7b.npy +02691156-16868a30ebe634053dc22b596edc161e.npy +04379243-c6fc21c5f51f169f365368fe0de21d22.npy +04379243-b72bd5538da87c0da54b9afa882a89ed.npy +03325088-35cc4aebc9da75a1b362845c6edb57fc.npy +03337140-8032a28768c3f22a7843fb4efdc19510.npy +04090263-f1bb43c7758ad37c12b38b1d99376c0b.npy +03001627-2d1f6e50aad6d88721fbac718728a36d.npy +04379243-8df054f74a538e72c955e5ed03ef3a2f.npy +04379243-c53b11ceba592177564c88c75bda3a02.npy +04379243-6791c92944c99c029f1deb04fb8ae481.npy +04554684-aef595f6f7c14cf4fe43ff1e45af424d.npy +04379243-c1180df0a7ad92afad5067eac75a07f7.npy +02818832-aff661c669a2bb4fe3fb5e8ccfbdda1f.npy +02828884-fc0486ec53630bdbd2b12aa6a0f050b3.npy +04379243-50f93f2278c3cc066bdbc69440dbff90.npy +04379243-f5cbbe04afdc4697562b835b63cfd09c.npy +04530566-2abe34f72a7ed4eb0d00cfc385a039b.npy +04379243-2cf794ec5ac1f1e0f5a97170d660a78c.npy +04530566-4e341338a4425ea391fb4dce28166bd1.npy +04379243-1e2565b2c28e69d3deb25e31ec3122be.npy +03636649-b02bd8e5ef9cfe354b3c42e318f3affc.npy +03211117-792002ca0c65b1dfaf7869e0a5920f2a.npy +03691459-75112a1fb101921edc1b62a5dd6fee95.npy +04379243-d0b38b27495542461b02cde7e81f0fc3.npy +04379243-c5ae96124c15c734e6c5cd45aa112726.npy +02871439-104874322c6f7a75aba93753eed86c0a.npy +04401088-73b0bcdcf57a8a7fe8d8ad3bdef6aca2.npy +03001627-5748c2c222d1528deb0a72cc21af76ff.npy +02691156-c2d90cc742f17ce828204947d78b9af.npy +03001627-6a152238c2ae02faf7b2f235a439923e.npy +03001627-6fcdcbaa1cbcf217be8211d595eb405d.npy +02958343-933b88ebf7eff4c095551e0d9e50cb0d.npy +02958343-e4be3f3bc271ff71c805dfe4ca9f2fdb.npy +04256520-e59bd11e144f6ca49aff919557ab16d.npy +02958343-fb20b20452ef661f500cc506a763c18.npy +02958343-137f67657cdc9da5f985cd98f7d73e9a.npy +02871439-3c9f48785776ee8efcd4910413c446d9.npy +02691156-30d8f7fe0da9d5d0c164bdcf3c9661ee.npy +02828884-17d085303d4c5121ed98cca8f0ccd5f7.npy +02933112-83a9e08664eeec09c59350d819542ec7.npy +03636649-90e5bd9f10fd5216fbb8cbddab1c2002.npy +04379243-b256041abd83a94862158b7ee658e910.npy +03211117-765526579b03cea972a71697434c2820.npy +04530566-80d381a6760185d8c45977b13fbe7645.npy +02828884-bacb5f46add42da9a53649a80e5aff8c.npy +03325088-8941e1839d0e718bb362845c6edb57fc.npy +02818832-4bc7ad3dbb8fc8747d8864caa856253b.npy +02992529-5a37ad3759b4d93df843a7d4732b1d6.npy +04090263-84b0027c1568c9c3694547efe15425bd.npy +02958343-a88d69e53a01aab9ff1370452e3a0154.npy +04379243-d8bd55abd721dc0c99860e9353bb52a1.npy +02871439-24c62fe437ecf586d42b9650f19dd425.npy +02747177-16ce4a2ff48b8a81d2b12aa6a0f050b3.npy +04530566-62255074b0df6a115fa2a5df3ce5bc40.npy +04090263-c95d2ac372888ef349a3c1009fa79820.npy +03636649-6138faeed623475b43ac09133d4c1d60.npy +04090263-218c020fa843aafc99f5e7ab39748cd2.npy +04379243-5d90c1e74acbae27475bcdf5ead5bfb9.npy +03691459-dd6a03f9fdc339c6538cf6df9faa9b65.npy +04379243-c12147db9b29ef9ee0480c954dcd56d1.npy +04256520-cd280bd68e1ce7f266260c2464355988.npy +03001627-573b3fed3942a148c681404257d94ad9.npy +03001627-c3778a3db3d7060bbb40b038e5e0b7f0.npy +02958343-4f2ef861d32a6f0b45594023db7cd10b.npy +02958343-10e99b1475098c0aaa69dfdc5532bb13.npy +03001627-96e9b84ee4a556e8990561fc34164364.npy +03001627-5b27b7cc16d2b25231f8120b4da8e523.npy +04099429-e7bd2548af6584878b95fd0292417266.npy +03636649-4d08db52c717b74d49c3792a0dc29860.npy +03001627-37e3b1b00196001160902b587804b688.npy +04530566-7127c0b5fbcdbf21adcf800d8263e5d6.npy +03593526-ff24afcf157e1b95bc311577a374c00c.npy +04468005-6c616860e640736ae182c6d0e8257bfe.npy +04379243-44f0353cdb820886be25fbd47cafc694.npy +03642806-b02c7e6b02d1ea5350f2b6c0ece5e801.npy +04256520-2a9fbcc138834d07a6bc98af4c2f54ca.npy +03642806-bcf57a7cbbe77f2e41567ce9c420c236.npy +02691156-d23eecb0437107756c63b8b48495261a.npy +03046257-9b9e9ebdd5c4941452b2c671e4d4765b.npy +04379243-5a6e7c4fb53f27925d3bb412062af8d4.npy +04379243-37ac02e6ef9c1ac2e21111e385a0661f.npy +04379243-48443cc15bbca01f20768660cf080d12.npy +04256520-9f4ad442e9cb51125a31d91ec836a511.npy +02933112-a679e4fb660b3751f51f77a6d7299806.npy +02828884-beece550c6a1bb1cef0add8da8532fa8.npy +02933112-bceca165030250f94da5feafe6f1c8fc.npy +03636649-49647be2c7460c5b8749901456352d5.npy +03001627-1063d4fcd366de4060e37b3f76995f8b.npy +02880940-bd2ba805bf1739cdedd852e9640b8d4.npy +04379243-be1a98a8e06c59311556e8f97439a098.npy +03636649-4924f75c6be38334f51f77a6d7299806.npy +04379243-19bc9c781df1da46824080f516909671.npy +03001627-4b495abfcbcf4b76ad484915511ccff6.npy +04379243-1f3e217cbc871152d7465eca206fda6f.npy +04379243-3cebd4314f773f8ccb9cf5f7d536cddb.npy +04256520-22d997a2ee077e3f48fda83c10428379.npy +04379243-4cabc64d91668d76890992ddacc04113.npy +03001627-be9ced795316066f38620af15fa7e604.npy +02691156-a931895438ae4502a9f468923d4ea2fd.npy +03636649-8a6d770e6b4942c5ef3a2c64cef919d0.npy +03593526-2d9fae9136d41ee2b978cf07d1cb130b.npy +02958343-3bb3b6b85e4e42873680ae1a67758160.npy +03001627-80f9fb95252e6e535bc104fbace43d56.npy +04379243-9d59a4bb0e08150148eaa510713cb074.npy +03001627-57a54d8b1594c399423a79096715f202.npy +03691459-2a59accd6ff9b5265c38e15d823f1476.npy +02876657-546eded3ac7801412389a54fb53b0765.npy +02691156-a675480b02f939424131d9ef9081c198.npy +04379243-3f9200756c2e3aecd028c2e338a88f09.npy +03593526-4996f1c0120f4c62ab361b6be63163da.npy +02691156-1a888c2c86248bbcf2b0736dd4d8afe0.npy +04468005-83dd4b87114ddf2ec51d8e07a45cfa0e.npy +03211117-dfbce5e6cca00c1448627a76b6268107.npy +02691156-34ef846a22c6a6ac5e9e2656aff7dd5b.npy +04090263-43aa82d8c71e6ec69f433921788191f3.npy +02691156-9b5e193416d5b2c09d608d5eb8e56ba5.npy +02828884-62cc45e9d704d87f155d75bbf62b80.npy +02828884-7cab2809bcc7b73a141c96faecd80bdd.npy +04379243-adf35ea69635bade7b9c6deef486a7d8.npy +04379243-9a4303e83aaeae9cb2ee6b27e0eef6ad.npy +03211117-fbe9615a45afa17524f0493013a8318f.npy +04090263-cc4eccfdaa0aaf25efcbb3a4a9f89cf0.npy +02843684-4abad12b5ed565da7720fd193c09c4db.npy +02691156-345570c792fde290d49cdf0198aeb01e.npy +04530566-804e29433fda9657746ffcbc44510229.npy +03001627-36447db5cf7b5a27ab5c60fa85a57ffd.npy +04401088-59e5dc88174971c567964ba700cd97f5.npy +02808440-842839d83fea08eeccd0340812259a39.npy +02958343-44f4bebe8b14badf314b3b3dfd6337f4.npy +02691156-18d123aaef6b911954eefcdc602d4520.npy +02958343-6f7cc4940eee83e57bcd1993e004117a.npy +03001627-bf7e8e0dc4f4038cc2567be77cb7ab45.npy +02958343-550d6c4149699f4f93de227e8a339990.npy +04379243-d48b1d27c46b56f2bde1c279d540fc66.npy +02958343-c9b956006607a48c75dadc997718614d.npy +02933112-3efeb00eeba8a6fa2db3e9b673557fcd.npy +04379243-3c991b31710144c5923e4a84d4dce694.npy +02818832-19d88337c81737d3bc19762eaa7ba40f.npy +04379243-2b567360f02ba48e4923701c409a8965.npy +02958343-b50f9931670e25ef44ccce632b473b8c.npy +04379243-27295a6f585b7817febad4f49b26ec52.npy +02876657-634c59bf37676ca64c3a35cee92bb95b.npy +03046257-2f2e423b7155dbc5844442d12ed656e7.npy +03636649-9c4a3637ca2ce09d4454439c22a43db6.npy +02958343-1c53bc6a3992b0843677ee89898ae463.npy +02691156-420f92d84c88244b9a6e43b878d5b335.npy +03001627-4ed2bc57d5fcfbd82c37553db37ec752.npy +03001627-4608b290c2383d7c9730cb37c9a5f63b.npy +04256520-c05bf63cd7818b6f19fb4103277a6b93.npy +02958343-d0552c332fd0182df3cf3d2cc3dcb043.npy +02958343-fe78ad3863e25cb3253c03b7df20edd5.npy +04256520-a1dbdff3da83425f3eec26c23f5bc80b.npy +03790512-6e37615194e808d3b37378f3c85478b4.npy +02933112-6788de26abc86a8480fa521a9c7198a.npy +03928116-1cc9f441f6633b932d9da001bf4482cc.npy +02828884-8325e5496a7ab8abd2b12aa6a0f050b3.npy +03636649-dc005e462f4941078a3097a6302b0866.npy +04401088-e8d704bfd9b6c7f39af985c9d0dd6085.npy +02958343-92c4d4bcb122509aafe1d4530f4c6e24.npy +03211117-1f4b16094bd83af82d2d2896f4b277fc.npy +04379243-34787e9a9a0c1ff4905477d2a8504646.npy +04401088-471a1ba8c1e1fb0a5b031707d900d7ec.npy +04225987-570fae86bb5e1843d587b281fa5e7b27.npy +04379243-aae0d0d70c13b8c781faebbdea6bd9be.npy +02924116-7930d2ca4a3f4b46d64784d8f0d2a643.npy +04468005-62233a4705338938f05cd1b93df67c5e.npy +03636649-a130ec5d53e62931d93768e7b9b1eabf.npy +03001627-d794f296dbe579101e046801e2748f1a.npy +03636649-9ef7ccb91a25dc988cc413950b617e8f.npy +04379243-be509f0aab6ce96251d3c864cc68e22e.npy +04330267-1a98ec71c011d3c1980d7e8bc442d06e.npy +02808440-c033a70110171a594cc3b7bdfa613934.npy +03001627-8bc130dee1e488925a7b0949b519072.npy +03211117-4abc3db68398e2cf16eb1b6d0ba9133c.npy +03691459-3d18b9cbc81bd83b83247f812f2eaa97.npy +03001627-1e304b967d5253d5dd079f8cece51712.npy +02808440-d11d01a4ab7912347c34b08df917732.npy +04379243-75e206fbfaa7a973eff7102cbb9312c2.npy +03797390-f1c5b9bb744afd96d6e1954365b10b52.npy +02828884-d1190ac57a48b879413d0cdcf1f63207.npy +04379243-8ebe791395cadf8dcdc074d7b3f1e7e1.npy +02828884-b1117a83ebf5a4c9c337a931444a5063.npy +03636649-6ee5804580c170cdf6da603e92626bf9.npy +02691156-6da4590bf9d7bb9698b8c800ae001b66.npy +02691156-c7e74cb0f2dcef904abea106683105f.npy +03001627-2a8b0d30928d3161f7b783634bf3f92f.npy +02933112-7abc6f3fcabd914157d513bbf87f8d1a.npy +03001627-86fed830cd355f591c0f52f4ec8b820b.npy +03691459-115115104976edfdc066b9622c005c53.npy +04256520-8f1ce2b3b4f352254b3c42e318f3affc.npy +03991062-58535fe2845a3427ff1ebd5836684919.npy +03636649-ddc2d39dac6e84506c5b8009db95f66f.npy +02924116-fe216feb2fb07f8dc9a4da29878ca580.npy +02691156-a14b262838529c2c81e1d9f6b27f1a92.npy +04256520-708e7253604979d06d83c04495f2aa08.npy +04090263-5febb85000f9df46c2e0257dfc41d300.npy +02818832-6cda64954ee8f9c122347dcaec583703.npy +02818832-76db17c76f828282dcb2f14e2e42ec8d.npy +04090263-8ec7ce14af18580ea5291b13c05695e1.npy +03797390-34ae0b61b0d8aaf2d7b20fded0142d7a.npy +03001627-37078d0597a05284b05550de345b6d0a.npy +03001627-adfab5a4d020094f98cfd47a860803c5.npy +02992529-d1b34149a8faba42faab2c6c450c7c1a.npy +04225987-7c009b2a37ad02a9a72f80277e176a2f.npy +04256520-56652a99cd43b77744dace04559bf008.npy +02808440-1f5642ecc73ef347323f2769d46520fa.npy +02958343-c00ec8e0880f507ba2e48b029cec5d4b.npy +02691156-afa65aa66f7ca040873ec74c119307b9.npy +04379243-474816f0203184f13ad51ab774fc9235.npy +04530566-d80bd439608923e07610cb1c03c9c3ea.npy +04379243-e6a1c65789846ca8c88ecf8c33c3edbe.npy +04554684-17dd78a433c3840b51229e7d6fc0cda8.npy +03691459-14fb43f3962bef40ce2d0b720afe8196.npy +04379243-6ba59a9ea719aefcd323d6bd8db8de5b.npy +03759954-9a4c236fb8dc6e3e1ef58b31c4ba0d15.npy +02924116-f9a30461da15db801b54449bede4940c.npy +02691156-7b7ebc856120f97a1944f01d3ab2091b.npy +03001627-4610136087e41261f1d6726679b21945.npy +02828884-efe997f288fdce2d985ef0bf52b97bf5.npy +02691156-85da8ecc055fc6cb58328b65a4733701.npy +03001627-ca9023f1c44aa7db82390c5f604e0d9b.npy +03636649-d5400264679eac33ef3a2c64cef919d0.npy +04379243-382889dbc86b5dd919fb4103277a6b93.npy +04530566-2ba37ef44fa116f8300ca77569ad3884.npy +02876657-7980922e83b5461febe67d9b32c3ddf8.npy +03001627-3cc90d903e0ec7aa61e11d707ecb7fa0.npy +04256520-1a4a8592046253ab5ff61a3a2a0e2484.npy +03001627-20b0a82068ae767c34cc22336880d45c.npy +04090263-a159a15c0f0acc22cd8875a52047b4d2.npy +04379243-dccb87aacbcb40a4f1783a44a88d6274.npy +02747177-4c8fc739917e3d4aad5067eac75a07f7.npy +02933112-94d10abadfa0d88bf51f77a6d7299806.npy +02933112-d5c60b873643f0e99f0825ef57cf78df.npy +03001627-e89689500a1e3b95fa935eb36a2e89fe.npy +02828884-7792b15f8c598763d2b12aa6a0f050b3.npy +04256520-cc7b690e4d86b471397aad305ec14786.npy +03001627-4b38f041ed60b99f7fe17e97940646fa.npy +04379243-392ed157b61814e2febad4f49b26ec52.npy +03948459-cbe47102e2e71f8120b92c47b3d5c1a3.npy +04256520-a87440fc1fe87c0d6bd4dcee82f7948d.npy +04090263-a14e353d1bb05f46b785a4ac4a0dbd73.npy +04401088-88c3248ee6950fc3d24be492f98354f.npy +03948459-ad72857d0fd2ad2d44a52d2e669c8daa.npy +03691459-601d696b56ed35a3b4f9aaea3b860d10.npy +02958343-433481aa8cde9b692e3dd7c278f108dd.npy +04379243-e053e9199d9d7f2d276b6f6d90ee3a83.npy +04379243-282b2cd82ba901479f8c3d2002c77ddb.npy +04004475-8f8e4848bc5769d0c4d354a5c6371202.npy +04379243-52896ba4c6c35090d3c1501c166e6b2a.npy +04256520-541e331334c95e5a3d2617f9171b5ccb.npy +04379243-c9675e9b6358165f66ccbd11a6ef0f68.npy +02828884-ab13fb5a4eb5897eaa9fc9f9a28d2718.npy +03593526-58757fb09681ea3236b0f2a1430e993a.npy +04530566-74d3bec29981aaa0efbed58ec3ee6f0a.npy +03001627-2c6815654a9d4c2aa3f600c356573d21.npy +04379243-a7d4b7751892502a9055f83d11955109.npy +03046257-11a3be19e931e77caadb7997f5aa04c9.npy +03467517-772d6017a18caf6f93f0194265a9746c.npy +03211117-5ebad73554fd866830bcd442adebae0f.npy +02871439-5b39e6a8f57199409bda39e34f423da8.npy +03636649-83254a427fd8309a36ca19fb57d01d2d.npy +03001627-d0b06607653b1744a8ff3e07cfca4801.npy +03325088-b56699547687adf76c18e71fd49c4dc.npy +03001627-b0a0f58be9f5dc0d3825a5bc524f67c9.npy +03001627-d15543efce9acacc8687ff9b0b4e4ac.npy +02691156-dbd74d18fa992eee7f1f82f6fc8747b8.npy +03513137-8b6b50321f5d5ba114300f3e8908fff.npy +04099429-c602b0228bf58aa2b5a019b4fce31328.npy +04468005-e7bca1d29be28c92d12132319299ff4b.npy +04090263-75af21a2be51a8df49f0e3dd7767881.npy +02933112-83ce531fdc507e34f51f77a6d7299806.npy +04379243-bfa2808f136b8f7f3c8fd4a2aec82d26.npy +02691156-7edf83742bece6be7cc4b32c704a58d2.npy +04379243-9be919e0f9243b9beaf288f952624966.npy +02828884-206904737710cfdded98cca8f0ccd5f7.npy +04090263-11b137bf4816ed40f4c39a35147bf949.npy +02933112-68aa1ed740374787de650492e45fb14f.npy +02808440-8692ef3bc81aa4c84c62bee40dcdc539.npy +02958343-764f08cd895e492e5dca6305fb9f97ca.npy +03797390-27119d9b2167080ec190cb14324769d.npy +03636649-7a8615c643bc3d96ed6eef8e856a36ea.npy +02871439-89dfc1520f7b2eeed42b9650f19dd425.npy +04379243-24942a3b98d1bcb6a570c6c691c987a8.npy +02691156-fcd7a8834a7f26f15069db69b8c1c70.npy +02924116-afce9683ea4fb46fb14a1e316f26e787.npy +02933112-3c2a50e5907b0fb64da5feafe6f1c8fc.npy +03636649-92e0f64c08f0c8ac3c8d0fdfb1cc2535.npy +02958343-2e0051c6acf7798d2c581ef6c05d52ce.npy +03001627-4959bcf3886dc907108366689dda0d5c.npy +02992529-df90c50a892611ca8536be73396b323e.npy +04090263-a2b803e958f8b80b8903bced1c63244f.npy +02828884-294613465801739b4739fd13bce14311.npy +04401088-cc3f77485b8a18db562c8e1ac545ef78.npy +04090263-a2b9d8c5357fc0aebc6dd9ba5ebd71f.npy +02924116-fc5944ab92962debc374eb2c1ec8a1b6.npy +04530566-95de565a937cc4ccdb024f6e72f57630.npy +03325088-f884c50c7afb527778d17489f52f679.npy +02933112-18efc77e6837f7d311e76965808086c8.npy +04379243-2555bc9595a45e9af36ea1eb6542fe7e.npy +04379243-9c33336af33fd905776d8bc79b9caa2c.npy +04090263-8210a8ae16f55c4bfb6bde4b7e6c6613.npy +03636649-dd278cc37ecff49ce6597d391ab6fcc1.npy +04256520-67708b6fc3e76563ca691253f597ebb8.npy +02691156-1de008320c90274d366b1ebd023111a8.npy +03636649-31ddb926f7e196a7fcb8d8c6d4df8143.npy +03001627-b58f4a6b71759e59de1e664b0a22c4a8.npy +02843684-e2ae1407d8f26bba7a1a3731b05e0891.npy +03001627-513686d6d63a1d8e577b5d737869717e.npy +04090263-91ccf1fd54bde780857835988c6a287b.npy +04256520-2d987393f7f7c5d1f51f77a6d7299806.npy +03046257-e8e68c0919fa0e6f1953882160211b1b.npy +03636649-a4e4446f8ba07f1730612f5c0ef21eb8.npy +04090263-5bb16f97c928f6dc4b49cd65dfcc3a9a.npy +02747177-31d318b5f2a1be9ee88c1d6fc3580355.npy +03001627-6e71bcc876af0e319b75b6346baf0c12.npy +03325088-c83b30147dc22d0bb362845c6edb57fc.npy +02942699-7ef29f8a7a132c46e0afa7d1aded497.npy +02691156-20aec82ef5f61b0bbd46d022fd7d80aa.npy +04256520-f261a5d15d8dd1cee16219238f4e984c.npy +03001627-81397314ef43f59e98cfd47a860803c5.npy +03642806-73b436084ec1697627d962ee5b0a40c1.npy +03938244-f7a58269c59ada7c4b3c42e318f3affc.npy +02958343-7e6da78c8dde0479f30da7304391ba9f.npy +03001627-cdfa898eadf316122056b4bd5d870b47.npy +02880940-c82e28d7f713f07a5a15f0bff2482ab8.npy +03046257-d352b743810b3b9e8c95b6223f519d17.npy +04379243-1d53304accfb6fb3c3bd24f986301745.npy +03001627-1079635b3da12a812cee4bf5d0f11ffe.npy +02828884-aab92a965e310885d2b12aa6a0f050b3.npy +03642806-212bf74d7c711a1634dedfee80b7006.npy +03513137-f59e8dac9451d165a68447d7f5a7ee42.npy +03593526-dde696b23a0fa0d01529e78b4656a338.npy +03790512-90dd1c4d894653322cbca070ad1b4ac0.npy +02958343-90b4f0d3187ad88c26a3125b78368401.npy +03046257-85551ef04a5bf758c0a61ad1cf92b694.npy +03948459-14fe99eb0c105a90fc9c56fb43681c11.npy +03001627-7a7b08cf81cf358a8616812464c86290.npy +03325088-fae7848a58bdf27937b2bb75885cfc44.npy +02871439-d97562d2e2eb296dd096bf408b606360.npy +03991062-ead1acf723d7b25d61aa3db764c0b4fa.npy +02691156-5392580fe70da9043554ccf8c30febe7.npy +04090263-18807814a9cefedcd957eaf7f4edb205.npy +02924116-41bfef394b803a9044f19502064e0a74.npy +04379243-971939c687f63b9eca76c527f185435c.npy +03001627-def03f645b3fbd665bb93149cc0adf0.npy +02958343-b15c72a5ce982b9ddc90bfc1d450ece8.npy +02876657-d3eea69d9d58401c76c2a9de5c96f76.npy +04256520-5aed18ebaa1360229d51a07a5989d077.npy +03691459-77f5a7479859ef79d97a4c09acdc158a.npy +04379243-c68ee4070eb551c84e71b4762a7e566.npy +04379243-66a3fb3a480c2b9e7b22e9efea2f565.npy +04379243-81fc73cf3796dc2ce14c803a60e383.npy +02828884-78585e161ee3e39acb2a965e75be701c.npy +02924116-fa9612f559f3cf53349a6083f1797025.npy +04379243-9b0a6771ddd952a036b0f2a1430e993a.npy +04530566-861048281f4507b45935a8bd0d2fe1f3.npy +02691156-333278f95a359498e768735f27170bc4.npy +04090263-8aff17e0ba5d749f6b2c8bb96250e4a0.npy +02933112-25ed0233d292deb413cf34dbb0dd8875.npy +02992529-922380f231a342cf388f6c7a9d3e1552.npy +04379243-daa7a962994ff710d19f6764502e1046.npy +02958343-70b8730b003c345159139efcde1fedcb.npy +03046257-375bdb86278eed0cafd37229d372aba7.npy +03642806-cacb3a7908b0bde4478a2ccf0e4d84b2.npy +04468005-ee72e852bf1d95c875302cecd0dc2ac.npy +04090263-7f7efcc097dd76ac8c0007e5a8235290.npy +02828884-738f4ce6e01920e72e558e0eb05b86a4.npy +04379243-819676c81556d0d09ed5db740d23ca46.npy +02691156-427240c0fde25a90e6901f9a264cdbc0.npy +02992529-1f565ab552dc89727e51366b0cf7747.npy +02691156-cc23974115a8de15d13ef00338ba8c52.npy +02691156-b43ccbfd5e1d88bd780469afe5e05eb1.npy +04256520-e29fbd1feb9659dc843ead12644a79bb.npy +03991062-15bde6780bccf1cbcd075f7b8318eff8.npy +03001627-1bcd9c3fe6c9087e593ebeeedbff73b.npy +02691156-3fc25f2cd192f7d262b600da24e0965.npy +04379243-f67d8afd7611fcdb45e0993de2a122d7.npy +04379243-6e29806cb341576ae9deec47d8412ee.npy +03636649-cbe4301ef1418bd8b036d6b8e2579386.npy +02828884-738e4ec61f69606bad5067eac75a07f7.npy +04379243-d07b44f271ded6a9c211251dafe812c1.npy +03001627-3ede0a86fff6f79632284c722d808bec.npy +02958343-9d2b7938d426633b28044fe9244db50a.npy +02924116-8757c29fd2ad648c193d7855ecfc1bd3.npy +04090263-bfd8b5214e4a174d589c07868201b17e.npy +03691459-c8b4a5d2588868a7a1dc1681ada9b3cd.npy +02958343-43a723b6845f6f90b1eebe42821a51d7.npy +03211117-700dca3a410b751551d078b27da66690.npy +02828884-b179e972d13ffde523c05fdd9cf000c0.npy +04379243-6a3bc6b44ba974b69c0c9824ccd078be.npy +03261776-1757fe64e76a9630fc176230c2f2d294.npy +04530566-fa18b7197a462d9b87c4e42a13b47711.npy +02691156-e5a7a353d5fa8df844b2fa2cac0778f5.npy +03991062-f509d1cbbe3e5bc7e88c1d6fc3580355.npy +04468005-33bc37e13333430552470de2774d6099.npy +03001627-e2dbe84030167f1ca5aad165050e534c.npy +04256520-483518216d58f2581b7dbdf53d301715.npy +02924116-7ee6884bb0bbf9e352470de2774d6099.npy +04379243-2c3a4ab3efbf12d74ef530b007e93f59.npy +02933112-cdc3762d2846133adc26ec30fe28341a.npy +02691156-a1017765200c668c6ecd5ddc73f570a8.npy +02958343-4c427f14f21f128ffa38d2670ab5169c.npy +04401088-983b362e25c008b1b36be681f90b79af.npy +03636649-5d91d6f6fae09234275d003e423c59ba.npy +02691156-bb8c3e64da2788b98057ec2068d8fa1.npy +04379243-f408befab026f5001e5e1a907376dffc.npy +04379243-6722714a020f703451c4deb11af7079e.npy +04379243-81e991df9ff8b970a2ab2154e681ce15.npy +02958343-2c304c54a6141d214ff3c6764341833.npy +03001627-90f124aab57c518eb866f4a999c2a978.npy +02958343-69c6599f55cbe2474eb766e5a46fceab.npy +03636649-51561910f274337c452b6f7f8fb75eae.npy +02871439-c11fb13ea583b02ef6f1a9781d483f33.npy +03790512-a9c432d1dc4034762a45a87054fa7272.npy +02808440-36a1ff10474e401ae440cc76354dcf85.npy +04379243-19d04a424a82894e641aac62064f7645.npy +02691156-3693696a7d11f2a866cf1b4a8fc3914e.npy +03001627-40db46d8496af369c605aeab73103431.npy +03001627-9af15c2a94ef79844aebea9384ce74e0.npy +03948459-db298a7cb95aea676ecdf20adf3e54ce.npy +02933112-8af204f53bc871a2c05575120a46cd3b.npy +03211117-ad0edcc0855d1218dab76ad0db1f9537.npy +02933112-c9576be714b6cf2d219113a79b8c092d.npy +02933112-5bfc4cb92e9d3b1f79b0363dd1368699.npy +04379243-254cda2719087d58d810b14a81e12eca.npy +02958343-cbe2dc469c47bb80425b2c354eccabaf.npy +03467517-22033c6d7e5a90f193f0194265a9746c.npy +03001627-377fbf95d0d5e9eb90c9244ba8c4eaae.npy +04379243-3af1f6a0d7a8584d719d8721fec72f0c.npy +02958343-808e19aed606f10cf919864ecec729ac.npy +02747177-64976ee2a69d3202956c23e7ddc28c00.npy +02691156-ae8073beb28788809f576466d21c96ff.npy +02958343-df741c5b5cf87b16c85067e81ba6deda.npy +03001627-439418b35f600f4bb10dc0fca58d0b2c.npy +03761084-a193f33f35e42bc473a36a7f4c39198e.npy +04379243-4de159bb2663fa4d58b22e372d13dd2e.npy +03642806-69c1b09e3cd5056d11f9b5b6530d6e16.npy +02691156-1b90541c9d95d65d2b48e2e94b50fd01.npy +03636649-5489ecdeac5c1cfb38bc5dac9ac556bb.npy +04379243-b879ff9d30911558fe2d13a096d8b561.npy +02992529-3921288228020482b305960cf7a7281f.npy +04554684-c2eb080246a97865c4c2cb2195d7bfe5.npy +04090263-149785138bfc9c2011f7dcbb4a32aee5.npy +03046257-9c5997539e0a6309356a0af0abfae2cd.npy +02691156-8c2f2570e178823562b600da24e0965.npy +02691156-e6f0811f15286120cedbd07f4cf21a81.npy +02773838-3edc3bc2ecf58aae40090e51144242ea.npy +03046257-d6242c261709ec5286d51c34f8e7e658.npy +03691459-8b73786c112d262d4852385de47501f6.npy +03636649-dfd06ea82f5a5b324aeb986669a16017.npy +02958343-baa2f488ec67a0a7c66e38c3984e156f.npy +04401088-35dc3f0f2f5fe8d667a434dda72a2c24.npy +04379243-f22dc1d847c5b82f585f699d798e7ecf.npy +04090263-ec372fed4900876350c27b805d1a86be.npy +03624134-390448ff0ec27c20c1abdd9923e0a8d4.npy +04530566-48cfd8b4bc4919e6cbc6ff5546f4ec42.npy +03001627-d50a49368f5d0e7c284432ce2f42f498.npy +04379243-4d1d28d15b19f9101e0e41d96d3d0a78.npy +03636649-ade3cb8149a1fe6dc066b9622c005c53.npy +02933112-583c242abdc4c08e4da5feafe6f1c8fc.npy +03001627-73fee38797aeced4de03ab2a27ba7531.npy +04256520-c81cf82daa56a165271513b292108db.npy +02876657-d851cbc873de1c4d3b6eb309177a6753.npy +03211117-6a759a4b85141936e4157a1ae61981fe.npy +03636649-d2c9d9efe9592eefcc901650bbbbb0b5.npy +04256520-e9ffbfa88c9bf2662f3a69b1a6aa6812.npy +02691156-2a05d684eeb9c1cfae2ca9bb680dd18b.npy +04379243-edcb2dc19b063f8ba8737fcf23389014.npy +02933112-8c7cff4d76ceef7cff900d986c9dc4b4.npy +02691156-827c877ebc70fd01faaf13445ab19dca.npy +04379243-aed5697ff59e3d3035478a6869a3602d.npy +03337140-126974e8219d2fe71fe8e0bfc9ed267.npy +03001627-3309d6cdd3f30ece3eec26c23f5bc80b.npy +02828884-2c183b1b94d94d34ad5067eac75a07f7.npy +03001627-21bfb150cfc23accb01c58badc8bbc39.npy +04379243-f742dcebb1d9ab0cf51f77a6d7299806.npy +04256520-9e0b01fab5d15b768695754f4338760f.npy +04379243-87f355b618f13233d5cb6d178687b980.npy +02958343-1a1dcd236a1e6133860800e6696b8284.npy +03001627-73828d9eba46266c4b2e4a0ad7c25461.npy +02958343-167a645149efed1fdca2ca2624f821d9.npy +04256520-e40e193e6468db644b3c42e318f3affc.npy +02691156-5466493424ca47bbfca1f1143bb6bc17.npy +02958343-c6a7b37a33b5eef728af9bd424dcd6fa.npy +02808440-63c94de548d3536eb362845c6edb57fc.npy +04379243-a53e528827345c7b593ebeeedbff73b.npy +04379243-668deaeb91295739664b3b9b23ddfcbc.npy +04090263-2ad5e27d42573768adfdd35441a4b4ea.npy +03001627-ef03458b97c8775b492d9da2668ec34c.npy +04090263-cbac383f55b031eefe3324230bd9365d.npy +04530566-52f3ad585a3900792de1329cfb242f46.npy +03001627-6d6e634ff34bd350c511e6b9b3b344f3.npy +04090263-d0062058d4eeaafe494dcb92319db1d8.npy +02808440-6af7584c142246a23321831d2245cf06.npy +04401088-3f3770476f094a6f2093f68f248ba9f6.npy +03001627-f3955fc72bd9f91e30e06a011e63236a.npy +04530566-abe4b3c405e1cc67bcd376892ed4f5df.npy +03636649-71491d1e3a4c96412474124825d469e.npy +04401088-76781e8b967f98b5a0eb5a85db887292.npy +04379243-ae2575fb16051c6b668ae11a7db5e82a.npy +02828884-a451f5d4b01cc78856f6fc4b4ce1db04.npy +04530566-c77c30796e80cc291edf59b9c77b0b75.npy +02691156-5e77ccd7794465dacbbcf57b22894cc3.npy +04530566-9c50b10fb651e57fdd93d77eaf89012.npy +03691459-926b6071c45525726d3462e1e02b75d1.npy +04379243-d8fa26d89a3ec264ee1dfc331dd3e94.npy +03593526-4708d67a361201b2ff7e95552a1d6a0e.npy +02958343-817bb8c69e4ac23ec81ddeca50aa3117.npy +04090263-56f810f9af40b569fa57ccfa6a55cc4d.npy +03001627-5c1c5dd72247cb6526428c7519676cd8.npy +02691156-359f69a030d69b3da8fcf7222eacb152.npy +03001627-c8ccac20f5cc12528ebcc1a99d4058f2.npy +03636649-4d6ea3aabaf02bcd29c39f613cc72411.npy +03948459-b2bacf7d683379db2f4c3670d21f5380.npy +03001627-39825fb4341ebd1ccb002c1e2b5fc68b.npy +02808440-b82ff88475f56b66c7bff4dd33a963ab.npy +02691156-24e79ed92be932e19bfb78d2af523ae.npy +03325088-50334e43e1fb8c03c36fb70296e45483.npy +02801938-c1abb91a5a9e2ea36d0c80f3bebb5ec0.npy +03624134-44ac83f91f1c5a3d76dac8bd43cd3e3d.npy +03211117-45c66a24bf0851246e22e2d2f64c8cef.npy +02691156-5b86cf0b988987c9fca1f1143bb6bc17.npy +04379243-e3b7fbed310c2c397c8d78b9aede742.npy +02958343-10716a366de708b8fac96522b26f7fd.npy +03001627-e3394ec3b63fdc255d59dae8d8b300a8.npy +02876657-3ae3a9b74f96fef28fe15648f042f0d9.npy +02880940-292d2dda9923752f3e275dc4ab785b9f.npy +03636649-84f3f1dec806b1df82e8c06333eee87.npy +04004475-f944db0e2716b8bade1e489cf4404f34.npy +02828884-6e77b16c5463bf147756371b6ccc35f2.npy +04256520-f0a02b63e1c84a3fbf7df791578d3fb5.npy +02691156-817add33c6fdd1534d210d9468aedaf2.npy +03001627-5cf7a44b8cd841d01f0ce9df23303cc0.npy +02958343-21e028eacc690c9de13f97dcb961e16.npy +04379243-6a61c9e8ade75fbbc3bd24f986301745.npy +03938244-b5cb58fb099204fea5c423249b53dbc4.npy +02933112-3bb0b093c66b1af37a0a46ab3b36f780.npy +03001627-6829ec525eab85671f2351826b1ffa67.npy +03790512-b1f2ea1859ae2aabe4d4c489303b7b1c.npy +04379243-c15e74a91f0b59d533f68dc899e13f.npy +02828884-45c49b9d7cf74ed261477e162a5a4fa4.npy +03642806-2dbabd43fdc9e21ffae724b4e4a1ff51.npy +02691156-e5bb559c00276ad354eba1f1b35fb0c1.npy +02691156-486f1238321ffd2825eb6beb311c44e1.npy +02691156-7df1ad6363410383f3cc56bc9bfcde3.npy +03001627-55fc24bb7f0cab50a24ad2a1ad4f7142.npy +04401088-68082af238b7973aa4d4dcdfc6fd3059.npy +02871439-e4a1c757cc0564f5ca3d3aba150597ee.npy +03001627-d8592dc28b9f0afa387379bbd607d69e.npy +04379243-1e31a474b6867a7dee32a260ef9debf1.npy +04379243-2ef012ddcf1cca54f51f77a6d7299806.npy +02958343-fdf2a756a86b2946c427f8508e3d634b.npy +02880940-5e2c558555092b706e30831c34845769.npy +02958343-ba0fa0e807fd275e0445fc6d980dd5c.npy +03691459-e9723b5243412b462a8eeb2a1f362462.npy +02958343-b72355cdbf1127f4becf71e2e014ff6f.npy +03001627-bc78aefe3bbceb4617b431cae0dd70ed.npy +04379243-a42ad074c9b1bf2467dc358060e3c47b.npy +03691459-a76f63c6b3702a4981c9b20aad15512.npy +03928116-1717a1704e85103240257030127f8974.npy +03001627-bbe36f91f3f0de06fbbc7c456d85ce59.npy +02691156-99b2ee98a16b3c0b1338b1079208569a.npy +04468005-831d42f28813d72ed3e657703ccaf9a5.npy +03001627-b541d3afd111d86f265d8abf3d2f9c3.npy +02933112-1055dc4f3f2079f7e6c5cd45aa112726.npy +04468005-aaa3e125e77e4d6e5f72adf4b0bfab9.npy +04379243-fe5e1df0653804d6ce4670b160b81e9.npy +03624134-508ca8fa00e0cbb3e168961dc7b88f65.npy +04379243-45e24015d08d65eb8d861be5b561accd.npy +04256520-c460cbeabad41fae963cdf8b01c64c16.npy +03001627-94cc9d6473258381171b03ec6def09f6.npy +04379243-8e3bfa092e83c28d55f46d55537192b6.npy +03001627-871243bc93615a758df4f3f615062e0.npy +02691156-d51bd83c27fc3167ba4ae55719e5e195.npy +03001627-8ff4ba87d700054546992ce9fde1b2c2.npy +02933112-d6724f5b2761dd49ffd5817f210f277d.npy +02691156-aeaa3ef74dc4c60c95175320d65fc89b.npy +02808440-65b424795fe6d071ce163f4a7838826d.npy +04256520-7ca57c98a3557774f251828d7c328331.npy +03001627-b8ca8a0c021d152887bcae7a654cc37.npy +04379243-4da9a56cce188c838aaae3d020f5ddf8.npy +02871439-3edaff50f5355da2666ec9bdd91ab5f1.npy +04256520-b233a919f5d2f6ac2ad490d4d7fae486.npy +04379243-a82406382a5d563099e8bf807e902261.npy +02958343-bd6eb1dc7d16372651a95aaa6caba1d3.npy +04379243-a62114bf11affdb1139408582c8ed98.npy +02958343-402d1624e1c28422383a5be3771c595c.npy +03001627-19c01531fed8ae0b260103f81999a1e1.npy +03691459-b8cf1ee73b068390205b075c6f63f661.npy +04468005-826a31947264bb9abb8a744d2911bf5.npy +02828884-77c25a03784c8ea4d4d8765e3910f617.npy +03001627-cb8f3b4355d891514a87d579b680d4d6.npy +03001627-ac041c720dc66c06d1c83bc8b134e4d8.npy +04401088-aa833540c3f2d77e2915acf4d1de24fe.npy +03001627-fb4e388b57e36e7ceca29403b7226aa1.npy +04256520-b5fcd21b70bddb3fbd16d4490a10a752.npy +03001627-9ddec02fc7a03c19a8699b6183baa203.npy +04379243-2275823b40c3e669be2020f4ae1ea66.npy +03636649-1a44dd6ee873d443da13974b3533fb59.npy +03636649-1728c555de071aad3ea96ac97db63fa8.npy +03636649-609dfe9367c0e64e2b520984c067934c.npy +03593526-3986f7e461d3239ed8a9aa07aad9b484.npy +03046257-be4745a1ccd316a914e970d26b98a862.npy +04379243-4dbea9b679493c3c31ec4caf9b70d4ed.npy +03642806-97be95bc027c84da5a7ade0e7a3afdc8.npy +04401088-8a26be623e40850a203d19a168d29f04.npy +02747177-f249876997cf4fc550da8b99982a3057.npy +03046257-c5fba67f2cd5797e4d46ab71b147ac5a.npy +02942699-46c09085e451de8fc3c192db90697d8c.npy +03797390-6e884701bfddd1f71e1138649f4c219.npy +02808440-f8df3a70da926ff2d53f422837597b30.npy +04379243-d3a8019633567d71b20716e5484f7807.npy +02691156-1e155559446469112e690fa6dfd5d610.npy +02924116-6a9fbc6a3b301736191c3762b497eca9.npy +03928116-423d14787208578580ff80bf789cd.npy +03001627-277fb4da6bea894c19fb4103277a6b93.npy +04530566-f10162679968fb0d8f21fab201b7ef8d.npy +02992529-5ec85395159a335221844676433a0aca.npy +04330267-b296fbfbbe5dccf09c12d6260da9ac2b.npy +02691156-bdfa5ff6aefd3fb8a57854d2ce086d65.npy +02808440-77c08eaf01312160a967d8a8714fbc16.npy +03948459-3b4def7c9d82c19b4cdad9a5bf52dd5.npy +03593526-24d09682cc8ead67191c3762b497eca9.npy +03001627-7aad83423b294c59f4b35f4029eb1ecf.npy +04256520-1d9a26feeba782e3f91663a74ccd2338.npy +04090263-3af4f08a6dedbd491703868bb196594b.npy +03001627-53f01d977de993442ea98d69e91ba870.npy +04256520-75d52bdc003e828af2ae88c7a945acd.npy +02871439-1b3090bfb11cf834f06824a9291300d4.npy +02691156-70ed0fe305145f60e53236e6f2fbeb94.npy +04379243-9cd3cd9e93ac389e82db9fca4b68095.npy +04090263-bc79d0cc0c27731a3a04e41b7ea7de8d.npy +03467517-b83a81b2476ec59e59610f6f40382499.npy +03593526-2ebd0fb6ed39fcaeb72e05c63385c6b5.npy +04090263-fa4dfabf8e55704532967a44e902e4c2.npy +02808440-198f8c170347741c54d7082b34825ef0.npy +02691156-b4575e5e6161fd497b164268a44f7712.npy +04379243-b47d8874381c5a03a561edf54b47b109.npy +02691156-fbc429365ab7136be1a9c234926c21e2.npy +03001627-b7012b9baf6a71526cff9b44fdf0517e.npy +03636649-d2d76338428129f62ffd6bbc7610ab0.npy +04379243-6558819685f96577c0f947750540fb22.npy +02691156-5d0d3f54c5d9dd386a1aee7416e39fad.npy +02691156-ebf8011ea1f4b4190b1d6deb98feec6.npy +02958343-9025ac13eac31cccf5cb3ca022cf045c.npy +03001627-fde328d91eee1480fc0035da39bd5e1.npy +04379243-70500798fb5d593be76bc197b3a3ffc0.npy +03046257-3ef61322360370ad81cb5f482735cd59.npy +03636649-380d313b3c277f5e1735ea0e092a805a.npy +02876657-632a0bd7869cb763780bbc8616cb15f8.npy +04379243-bc33b97457ce7a0a569537f38fcb7202.npy +02828884-17b7a0e3c70dbc3d90a6b1b2b5522960.npy +03211117-16e6d2d5b895f04dd3e94baac7a5a368.npy +04379243-3c9c9adaebd66ebc5fceaa39a8353bde.npy +02691156-63dda61ab3ccc4304a3b534252984039.npy +03001627-96c0ecd1ef80e818c8687ff9b0b4e4ac.npy +03636649-229b7e36459a9857ef3a2c64cef919d0.npy +02691156-36ce6d61721805abbf3143b1cb6076a.npy +03001627-b5b0a880ff4e26c1a48e53188865c070.npy +03211117-ec77fd7cf6e4810ea0a7b8ecc42036d5.npy +03001627-5eb42c663aa7c8afb05550de345b6d0a.npy +03001627-51591397480eecccf58894a68fdb6cca.npy +02958343-2861ac374a2ea7f997692eea6221681c.npy +04256520-5f50fabf8c2012034d4134b9987a1946.npy +02828884-5ed9651c928575aab719144d1cd30cfc.npy +03691459-2dbb22fe2a25064a7e95eb283a46224.npy +04379243-c93685c8343e995d760858b697ef756f.npy +03636649-a26918d26e74fcb796433fd91744c67a.npy +04379243-a99b37edfd721010bc7eb7ec22211551.npy +03636649-66a7a9a417660413e2364c65f912dcd4.npy +03467517-740e196e2046c18c352e5d4d2615db5b.npy +04401088-396fba35f02a9cc9bc1f690a77fffa14.npy +03001627-1d6f4020cab4ec1962d6a66a1a314d66.npy +04256520-9ed01e198c9d70a5df6cfab91d65bb91.npy +04530566-bad5505a49b50dc8b89145155e320b60.npy +03991062-c53bab9d7a20250d6a74b20a76e8ee44.npy +03467517-fc49acc3617915075756f5593365c94.npy +04379243-b0abbb1a540e4b3431540522caac8407.npy +02747177-ae33867e3c5e1703f155d75bbf62b80.npy +04379243-34bbe284f7499df071a782a4379556c7.npy +04330267-f093b08c4997bf631b3e6b75a323070.npy +04379243-631c8be7f3559e4e5691f959a7121ab2.npy +03001627-f979d2ead3517a67f20b781026d21763.npy +02808440-2bbad1610128749e1c17aef130ed6213.npy +04379243-45d1e19ee0b79df377e131ed5f0fcc86.npy +03211117-fab433a56c7734aa16eb1b6d0ba9133c.npy +03636649-353224cca3fc3ea6e5da257192cf051.npy +02924116-471005e286f5626b6eda31c44364df9f.npy +02828884-44c720c5edf8942798cfd47a860803c5.npy +02691156-45251b4f76c9a840139336f03eb955d2.npy +03928116-7cd35ab229decb47c05575120a46cd3b.npy +03001627-818c483496ce96745eea3e3d89293379.npy +04090263-2c2abe6a7d754a95c79f92df566f8c6b.npy +03001627-951f1376751fc7294b87db09ac4cfa73.npy +04090263-7c31ae88ca4faa649a2ee232a197081e.npy +04090263-7d03cdedf8e023728d00a96649d5cda6.npy +04379243-f0abcd11d8987f7fbeedb4c8fd29e2d1.npy +04090263-f3ffbc00ec1a1aa7ff5653e278e7cd2e.npy +02933112-e72235ca5b0f9b5de485c93908cf58c1.npy +04379243-6f2ffe8c014a6a458af30108ea9ccb6c.npy +04379243-5fef79348f4bc7b8c710d14956729baa.npy +03001627-74f246c1f7633eb31d1a08d58541ab5.npy +04090263-1bcf4a290a2fb6d288be2a30dd556a09.npy +03001627-4dff2fded7130c631a8db2c23945f1fa.npy +04256520-efddbcc9852c0584e235eb1ec8984f53.npy +02818832-c2b65540d51fada22bfa21768064df9c.npy +04530566-a7b07a2aad642f3f18b731fab8bc3743.npy +04379243-d1ecfd2ca0baa6ad47efcaa87d68903f.npy +04004475-18306958742f8bfbab0b172d4dea80cd.npy +04330267-993d687908792787672e57a20276f6e9.npy +03467517-1ae3b398cea3823b49c212147ab9c105.npy +04099429-d68e08b2be825d1946f4fa69a8f7f711.npy +02924116-5b69ff9c8fa61143973f659238edf3c3.npy +03691459-999e0646b798f67a5a60f8212273313d.npy +03001627-c8df724ce6f12ca2d86a257784298546.npy +02958343-8824c06f737f2888e35db9103756ad5.npy +04460130-3735b272459f1b15db439ec9067ff33f.npy +02828884-a5befb3443b070f8d2b12aa6a0f050b3.npy +02924116-29e5a19b6acef3113a06539f92e15e9e.npy +04379243-b3c5ef225f841cb59725f8348364f5a8.npy +02828884-110d24908bd4f49b93d3c9c269b9b9e3.npy +02924116-c2640c82f7bf960152470de2774d6099.npy +04379243-592420fc90be625a8b83086412477462.npy +02958343-df34c25a1e1abe9428044fe9244db50a.npy +04256520-c23747cbba5d5f9edbb047330001d95.npy +03991062-92ca0eac025afb5a5d8d4d8a3cf8b294.npy +03337140-a25ab4cc7a9df73a4c3aee8e9d3a6ffa.npy +03337140-bfb230a906645dd14c3aee8e9d3a6ffa.npy +03467517-6734fc1b08d9572d372fd8fa16ad068d.npy +04379243-77b60e760e8186bfee18bc48b60b36b7.npy +03001627-a18a82b239fc07cf433619555ecca8aa.npy +03636649-28d35fb9035fcbfffd5c9a0fa28996b4.npy +03001627-e5b0325d624a692467d783b4714d4324.npy +02992529-b18f0d53dd3db1999410a04d09c14d1a.npy +03636649-a711c673d5b6a4b350075206bc274050.npy +03001627-387600bd541f7b502d7ee37bd88bacc0.npy +04379243-7178d8a2f91a9e1c713656cb7b79f97c.npy +03001627-9a8bab7a07a869d1ac822f8036859e60.npy +02691156-ed1d51ac367d0fa5f830b2dc9bf63133.npy +03325088-6ca769c3a4429e4150da8b99982a3057.npy +04530566-7703ba29545cc381acf9e4b0d73d2434.npy +04256520-559019119818194931df860464c5f16c.npy +03513137-37f55552b517eceb501db4f27570eeec.npy +02876657-dd686080a4d1cac8e85013a1e4383bdd.npy +02691156-743670f7f3a8042e6ad6a28101cd3ecd.npy +03211117-d965c9192e2ef568d36eadf9dfcb1300.npy +03001627-2f296d487ade29fe770bec7a2461d9a3.npy +04004475-4475cadbae94638fc4ad1ac611778322.npy +02958343-209c79dbd4f7ad944ee32d005103a21a.npy +03001627-da335ee36e78e24988dcbe86402c7c15.npy +02933112-60d7e8aba1f692a8c2185cc0ca1b306b.npy +04530566-6834c4f307753dd1427c8de062c1497a.npy +03624134-5c6c271d248294e0e0b68f51ad1c0011.npy +02808440-d446c087555f507b412deb0d2b0f3dcd.npy +04379243-85e359daf7e56d6a94ec70278e148371.npy +02828884-19399a9aac37442359cbde03ded257fd.npy +02828884-c06a17f2c79d01949c8a0ee9a6d1d4b2.npy +02691156-78edc61edc8835b5bc0909d98a1ff2b4.npy +04379243-d2f884d5637c979214c06184923f6962.npy +03001627-daabf4a2afac24c97eaf5bcc4a8beb17.npy +02958343-abb2cf2ed0d8679e9cace18601e5d3b5.npy +04530566-10a57262251f03b28b27d51d442cae1c.npy +03001627-564f5f96bc718194166420d06689fcf.npy +02828884-18000ed6034007caf4fb4dee5181bee.npy +04379243-e469e53c260a5ca47d2695833906aa3a.npy +03991062-a19b10e509f6ebb758c88d30f502a452.npy +03642806-36bf7cd2652ccf48dd42bb2503ef78ef.npy +03636649-89fb4886797187e7f63bf7d908efc575.npy +03001627-bc4d7324d2438885f4b35f4029eb1ecf.npy +03001627-eb04d1bffae6038c4c7384dbb75cab0d.npy +02808440-b811317b75610314f7bcd99767bf77f4.npy +02933112-a49eec529b5c44eaac00fd1150223027.npy +02933112-aca4241639feb8f0921dd903dd0b8b17.npy +02958343-e9c2c31da871e0d6c203986ffbbb5e4a.npy +02691156-552871abb864d06d35fc197bbabcd5bd.npy +02691156-4508864390ae424d663e50e76f163b3.npy +04379243-7207fb41b7f9a0669223fc014b68160f.npy +03928116-a2dcfb6f77a72be8a2b299c40b68f70c.npy +02958343-2f7cf2c2d170e3c936f37029483b3e41.npy +04379243-840ab934a623e29d4253be890e153964.npy +02958343-8c710a2319c1a5683f86d898378e5d97.npy +02942699-d5624d29159a4cdb7e1c85c5c15da7fb.npy +03001627-3aa81c6d6d7d7d66c08256cf85537e.npy +04379243-2764d2783f999fd0214a15a5a42c49c0.npy +03991062-d4b9e1085ebd4f226bc258c0f0234be0.npy +04379243-4b6276df295b3967601104cd2d998272.npy +04379243-f797885ebb3b15fbf417851aee42d8cd.npy +03211117-7c16ddd8f3d099dade6274736c2a6b68.npy +02924116-424d411c37fd30384f224d639c7b7c72.npy +03337140-abe41b86df0dcd5a3da04ac9f7df60de.npy +04256520-dd36ab979c4ff93038dc42f802aebe31.npy +02958343-90902c72c195d3ce8256c497dfca7529.npy +02958343-c3e49f8c560ccc216108f064aff2426d.npy +04379243-c74ea23fce212291943df36e40894fd9.npy +04090263-8650b7b809ea14be6314c3b6a3a65519.npy +04090263-fcc1826e28e6f512b9e600da283b7f26.npy +03948459-b4341b7259f66d529f433921788191f3.npy +02954340-48052012e0500fb5a52821bf1aa3b19a.npy +02828884-a393945aad7a2cad5067eac75a07f7.npy +02958343-215da971831129bf63ee8a34069b7c5.npy +02691156-448b45ac858784e9b020e22bd5fe2e73.npy +04379243-3645a90e02d16f0584aa8fa8b66ba302.npy +02808440-dd544ed9e15f9a0e3321831d2245cf06.npy +03710193-54cb538cd36a060bf145bef7cd14676b.npy +03325088-8e8173ea18dec2c8fdbe2bf897d8a820.npy +02828884-5870d0ad92321f8cad5067eac75a07f7.npy +03691459-b18b9f87117cbc94c274436d9bc22f7d.npy +03001627-d20de927fd1b15ef104c86562c321749.npy +03211117-70c042c5761072bda543b6c4e1dad166.npy +02992529-6e183cdeba6b83b3805062aaa3bb7665.npy +02880940-36ca3b684dbb9c159599371049c32d38.npy +03636649-9a0fc544ab771054b45df535caecae62.npy +02828884-76463803e8be994e6716685cf333d2c1.npy +04379243-6da3c94506cd3e114a163d2b227b320.npy +04530566-abb6fe97ba97e1f84e3f9dc2fe7cec4a.npy +03211117-e3201a9e4ac0a8a9e255d96ab3987a.npy +04379243-197393cdb4c836a713c18ca5acf69765.npy +02871439-2c86a69902c2df5f6831079c2c481dd3.npy +04379243-7ee773e031400d09b4fc0a2b20c3cddd.npy +03001627-b24ed89d85b74771216fff6094e6695c.npy +02958343-1dbb02c20bb93af81c1b3b2ed8d13bf8.npy +02958343-ef2406c5f2f280f366cdbd877f6ab1ad.npy +04379243-48ce2cbc14f391e7d7262b1b986920e7.npy +04256520-4c0aeda1ff524383ce4f58889c7849e3.npy +02808440-45b3975a2935d2fe3321831d2245cf06.npy +02828884-9a2d51fbd6b58048c955e5ed03ef3a2f.npy +02691156-d605a53c0917acada80799ffaf21ea7d.npy +04379243-cb374c698a5339f3d6fab6a6a552905a.npy +04401088-f18dbf3cbc7d3822de764ca2f457c756.npy +02958343-9a63aef0a99f7bfab2c2809513f396e.npy +02828884-a9aa868b77c3769ba873941124e3356f.npy +03001627-3612bf5942858c5976ccfcabdd2d6349.npy +04530566-18642f35971d1bec86c51c3aa93bf029.npy +04256520-f85f8e6cefe5aaba4b3c42e318f3affc.npy +04090263-b63023bf7697571912b38b1d99376c0b.npy +04256520-2de1b39fe6dd601f1e03b4418ed1a4f3.npy +04379243-6ac583c624b9b76b9d6741c36fd1cd2b.npy +03001627-94ceeee26248a275e8e2378aa23e4253.npy +04379243-b9bbe91d581fbedac8ba7a179c3a36e0.npy +04530566-39ee3af7e07310f494daa4565dd30535.npy +04401088-33db5943a8942fdfd998bbb6a9d203d8.npy +04530566-cb89a617351ec4c4eb2c303a0e0d287b.npy +02818832-90e5b3c4b760b0b5c5df8e3012a84650.npy +03325088-e53c6ac72d0f1bc13321831d2245cf06.npy +04379243-77e24ba0c290ac3eff87aeb86717e73.npy +02691156-2087ba820bd70001243402995adcdc4f.npy +03001627-60d4a780abba84d20c5de2052b8e2de.npy +04256520-137589e785a414b38a2d601af174cc3c.npy +02958343-7c768295f93290391d0ca8334e014176.npy +04090263-26829f9c5626be049be47ac7c7e37815.npy +03001627-60b3d70238246b3e408442c6701ebe92.npy +04379243-bc2a117e1c6b9d0da9f547acc5e1dd79.npy +02876657-799397068de1ae1c4587d6a85176d7a0.npy +03761084-b8cf469bc1b42ab64a44340bf227e40.npy +02818832-50e6081ee2b47031efc3b1f471c445dd.npy +03636649-b9283738780e29c23a5fb687d9cb4ec7.npy +03636649-40bbb4b123d9df2028c187222995b2b5.npy +04379243-41b492376a6774f9cdaf1a853214fa9f.npy +04379243-869bf2bfa51062c47b8ec2c9a49686dd.npy +03991062-37c60cf073b86328a2c59a4d90e63212.npy +02958343-9ca127580ac4f9712aba37016d02e162.npy +03001627-3fdef0a7606c397331ad067823a3f0ce.npy +02691156-b7b0068ecf75d279afd477f714c68df9.npy +03001627-56262eebe592b085d319c38340319ae4.npy +04401088-ed52bccead5926dfa9fe1734a6086750.npy +04401088-b21610e986fa4c9c7cef36fa43392c52.npy +04379243-13ec1052a32ca23bfd60059ad8523f1a.npy +04256520-49d28b2dbf11e3975e4b35ff1ea95f37.npy +03001627-5c8ea11840795cb5f1783a44a88d6274.npy +02691156-f79fce6480d9276facf77e718d93f3e1.npy +03642806-9f8cc20d6b78fc3f2c545442439c8b8.npy +04256520-272594b65264b90192fe219f5eb82836.npy +04379243-d237260f66c00364dfe9cab879fd37e8.npy +03046257-5a1a2e257a862cabc5d70d7dd4a0dae4.npy +02691156-ff6e377e8e5b3757cc34b900bb2492e.npy +04379243-61ed0adc69dd8eafc3569a6df9a670f2.npy +04090263-2da91be46310f550fa6c79a0c671edcc.npy +04379243-6cf6a546e2ecbffe815a7efb12912.npy +04379243-a9dfd3433837da823fe4267232c5893a.npy +04379243-324f0d772a7b728c36350d50e191a45.npy +04256520-5509f181ac72de8478eec18a8a3356a2.npy +04256520-acaf2b81121c78f6acacae5381781ae4.npy +02828884-a6947bdac4ebc97517b431cae0dd70ed.npy +04379243-e834ef941f7bc9c9e7df9f1005942e3d.npy +04090263-869ba7b568be23521c63053ffe1a64a7.npy +04379243-b14a14cc2f3c38c9e3def9c422df2282.npy +04090263-61064e4a00abaaec589c07868201b17e.npy +02691156-162ed8d0d989f3acc1ccec171a275967.npy +03211117-611a15a623643e12fab31d1a99fa2e.npy +04379243-3aebb428c4f378174078a3e6d5ee40f4.npy +02933112-a234f5b48a26fe1d12de5317fe5b354f.npy +02691156-33c8abb3658f2d4219e06ee1b2e7b1b4.npy +02828884-62ec527e6093cd007a9af08d0375df56.npy +02958343-cded640727157c18c6142312719d87cf.npy +04379243-5ebc9d8f82e8bd9fd3533dfc6ae82761.npy +02933112-ca3c48798200a14050e21024808d3b59.npy +02958343-2cb6de89f5b6e702b626f6a649199824.npy +02958343-98b30f0a29fe2a1ba7fd25564c2e888e.npy +03001627-9d7f79e306288aeac6bcadaedba80eee.npy +04379243-30dd74f09af6b1c2fe5c8ffd0f5eba47.npy +02958343-4eeac6360031021b8141ca5f94f1242d.npy +02691156-de45798ef57fe2d131b4f9e586a6d334.npy +03001627-5eb6ad0960250dddffc127a39b3c57b1.npy +02876657-6ab0ef1973477031ad5067eac75a07f7.npy +03928116-20cda8719140c1dafaf5a63e8f4fada.npy +03001627-502116e5b87d1fbe69e92c4e191537ef.npy +04256520-5fa872fc2e0447fe75fa15ccf4d13b00.npy +04379243-29b70ee8da440240de98d10ab5975b59.npy +02828884-52e921d1e558e6cda19b1c45fadaeb5f.npy +03325088-4af74fd7eaac11a2b7a867e9b35a1295.npy +04379243-98416e9f15b3f80fe76bc197b3a3ffc0.npy +04330267-eff23594cc0aed121b3e6b75a323070.npy +04379243-4ec8d6b5c59f656359357de4ba356705.npy +04379243-bbeb870f0ad9a17af84b0be7f50940eb.npy +03001627-294406eb0453d6a74aad3d2faf99eb1e.npy +03001627-1842797b090ce2ecebc1a7ae7c4c250d.npy +04379243-98b4af37112000d6bbd07219dafd2111.npy +02954340-6cfb76b40fc41da2a6e67635b9d1cee5.npy +03636649-b1ec680145762d1eb784faac204319d9.npy +02808440-a095cdd68d69912b44221bef0fa3c36b.npy +04256520-12aec536f7d558f9342398ca9dc32672.npy +04401088-388415634e1056942ab70120fece57c0.npy +03991062-4224c4923f50229e8cb30b9253efc371.npy +02691156-380e9e8c3ef07372acd7e882b88d2b.npy +02828884-61e3c4fcffab96b9ed98cca8f0ccd5f7.npy +02933112-94bb7157062d59a5f51f77a6d7299806.npy +02691156-7631caf6989bd17e4a51f4b900f5eb50.npy +04379243-ac2f8d240e2fd36ce2acfd5544378c96.npy +04379243-400a2dd6c371a2d446de2420e311135b.npy +03001627-cfb40e7b9990da99c2f927df125f5ce4.npy +04090263-ee4cf4706ce605bd37e67c992a0a6e51.npy +02691156-4f0bf26c62bb7c8b7e1c97634acf0214.npy +02933112-c5eb5577e728c4c1ab4753fa80886181.npy +04256520-289e520179ed1e397282872e507d5fff.npy +02933112-bcf7688f64a642e3fb266533561ee98a.npy +03325088-33faed70ef14d4b362845c6edb57fc.npy +04379243-728ec88a2fe37abd4a2f90e76b7328d2.npy +03636649-7b1fef0071908d4bd93768e7b9b1eabf.npy +03467517-72e8c3d93b75d8c888bb86092c911c95.npy +02828884-4790c04ee2586772d0768f88bbc39dbc.npy +02691156-7fec4732aa03b54e7db7c8d619fa260f.npy +02933112-4298f678b53d370dc59350d819542ec7.npy +04256520-1d31309c617d32b51652e2e95099f284.npy +02958343-7be86bfa8edd04fdced2b3ef33cc51ac.npy +03211117-d54253b71f017565b441e189e5a85c02.npy +04379243-7d0e1c7c5ef289bf94d582a4a37a8dbb.npy +02828884-f1fe8c6c1f9f28321739c3c7bfb786a5.npy +03001627-b2b359d7ce583ce5ed105888ecf0e97d.npy +04379243-eae36b396f6b5f97664b3b9b23ddfcbc.npy +04379243-bdf183022c888426fdda2d9537f811d4.npy +04090263-608c126f0acb73dd7e338aebf530613c.npy +04379243-284831cd2c3c4641668ae11a7db5e82a.npy +03624134-e688f0697b9a970c6402b8f491cd92c7.npy +03513137-e0b4672fbbae71a49617e37e5a669a71.npy +03001627-a33e91aea2b278e0c5ee4aa82bd336ce.npy +03759954-5e0d940640c1808a4fdb7f619836e43d.npy +03001627-5a871d6613216ecebda72093f9b5aa73.npy +02808440-878767d96ae00079a1ad4813ad2137e.npy +03325088-4ce9747bda12fba68616812464c86290.npy +03211117-89f3262d8e06acfdeb0ce5843fe6b264.npy +04379243-daaa70967da2bad4e80de6380bdd8c21.npy +03636649-e5ff9311bee487f5ca4aaad7dc0e3a16.npy +04401088-158f605ffbe6b036436916a86a90ed7.npy +02691156-63ee010741ba665c35fc197bbabcd5bd.npy +03761084-ee586138bb142e67178e7d331e641179.npy +04379243-ef4bc194041cb83759b7deb32c0c31a.npy +03991062-9dab2204d0e6a31114038d588fd1342f.npy +02691156-b95510fb88096a208fc2d09ac4aa4e78.npy +04090263-840eba6d395c192c40938a189bac3257.npy +04401088-e9352850a60bbee4975308da62ab2e39.npy +03001627-8c4ffe44076e9d4a15f62f0f1afbe530.npy +03046257-cb73394b6bf07fd61b17743c18fb63dc.npy +02808440-a57f7ca2555de207a6ebaf0d97eea08.npy +03691459-d8023575778364b035cd53a06b1d2317.npy +02828884-35948e4d06a9b07e8ba8ff316aec8d3d.npy +04090263-8fca9344f9583ed9f433921788191f3.npy +02958343-bc86f6cdcac3e6a5afe1d4530f4c6e24.npy +04530566-268110d849a3aafdec2f14500e179e92.npy +03001627-2ed3b981a9827fb0392642605da2a1e7.npy +02958343-f9584908ada1c74bc2b93f7e42be3ac1.npy +02958343-6ca41d6e48d8cda0e7c0978ffb411d3f.npy +04530566-abb16b391d1634a84de203ef6842ee61.npy +04379243-d40aa82ee8ef7f674e0fb7a6bbb665d.npy +03001627-6419d67905503bf7a09708b19d8be603.npy +03948459-d5be7a5fc72f11498ce08763cba10343.npy +03085013-7e984643df66189454e185afc91dc396.npy +04401088-ae86fa976ddb0f923bb35aa9d5fb636b.npy +03211117-4714a692a7e425285d534b823e951083.npy +03691459-50ab4ba93bb4141320dd2dd4d7d7656c.npy +04379243-1c76a8a55699eb9694605bb30ae47fb2.npy +03636649-fb279afc9faba7ec36d735c5e1c16d13.npy +04379243-244b56d46b9eec86f51f77a6d7299806.npy +04256520-d321d0c149d7762acc8bd7a04c9659f1.npy +02958343-558404e6c17c58997302a5e36ce363de.npy +02933112-b6b378a05bf6982b70c33714b19283df.npy +04401088-5101c0131cdf76d03f9d84f9a87a44e4.npy +04530566-f4f66aef4ae1ca243146aa85e47ab8e1.npy +02924116-9e66732bcbcdc461dd0aaa1eb6128474.npy +02958343-a07227a41b866d26473f10e6caaeca56.npy +02691156-4303c9458a723504d972c9dd75ed77d4.npy +03636649-ca5a19cc0a5f34273b8ea30c1700f67.npy +03001627-ff3ca63c75482c31f51f77a6d7299806.npy +03001627-564b9543fe715f9e1a4047c09ddc83bc.npy +03691459-64b14af80e246549a82acc849eb5e81f.npy +03691459-ef720d2b2de59184e775d184845c9f5f.npy +04401088-1f565ab552dc89727e51366b0cf7747.npy +03636649-85335cc8e6ac212a3834555ce6c51ffe.npy +04225987-99130967461623c37ca71234c2ec5470.npy +04256520-90b1058de189e4589215045784774049.npy +02880940-f2cb15fb793e7fa244057c222118625.npy +02958343-30ad4418703c8cd2f1da888faee23fa4.npy +03001627-4dd8862c73931cafeaf14273fa406ffc.npy +03691459-9c8dd83df9678d3bc33323f64a5f289e.npy +04330267-fc05549add432c08c5f3208c32f3ec87.npy +02691156-a48676cfe44fd9bee40acb87a6be88b3.npy +04379243-8f940fbfffb9b3cfebad4f49b26ec52.npy +03642806-85e029acb2edbd3a86a7e0484f5238e4.npy +02691156-85a62cdab580058925149ab881d5692e.npy +02958343-6af0ad6553d3f42f21f6e2b0f75cf9c4.npy +04530566-a64d2249cbe63b5f9cbca1f73829701e.npy +04379243-f48d32cd065088b6a6551b53c4ec69b3.npy +04379243-8147ebedafb763f21fd3f440755dada6.npy +03046257-408a3303ef2731a48358026595a97ae9.npy +02828884-afa7876470b8b7881d3a1f40308f8b8d.npy +02828884-1d0dae2db37fcb6ab078c101ed808ecf.npy +02828884-3a8490a38cd7f21929bffcef22233b9d.npy +04090263-51dba7756ad837615e561f212b7229f3.npy +03948459-f33f1645e9e35e6ef4de29b99f103946.npy +04530566-5a0ca7a6df97542e69c3c818538357ad.npy +02933112-148638f9a7c72ab55a0e5699b3040a35.npy +02958343-7197ec7776d4e23f10a4b3894aadc04.npy +04256520-536cae63d37ef32265ba78ad9601cf1b.npy +04256520-3a1cb5501dad77f360257b24d454e22f.npy +02691156-c93f76888cf5a14c93421b5e4ff654e0.npy +02871439-96c6507b07129f4ce0e03ec44119b17.npy +03001627-df9eede2969408d0bd2b1bd66a734698.npy +04379243-ada2aa7ccc81977d4ba437934dd25596.npy +03001627-bfe3afaa774eab6e29e17f7efc5a2421.npy +04379243-e77bdb7d3e12d6231eb51344489c49f3.npy +04256520-35da4cce6961e4f2ce9d15b850baf786.npy +03691459-aed97e60cd2802ce7ffb47acd56f396b.npy +02691156-384e72f69e6f24404cb288947cda4a2c.npy +03001627-d72f27e4240bd7d0283b00891f680579.npy +04379243-f8c37aece2b1c730928918e6ee92e0f2.npy +04379243-2475fc0196ea39aea81329004b7398d4.npy +02828884-ff5c5895622d2123aa979e53c1a67c26.npy +03790512-86b6dc954e1ca8e948272812609617e2.npy +03001627-79d7e50715b3b00cc2dd59754f61bab6.npy +02958343-f4498022df553505c35f22936e5aea5c.npy +02933112-3b6042e3f223da66200ec3fc5b3ae5f4.npy +03001627-74625aaed8902197f51f77a6d7299806.npy +04256520-ea49f8fc66df2b1819fb4103277a6b93.npy +02871439-a02dfaa200999ab05e61ef8e2af97499.npy +02958343-18927999d0c5a9687ba2618ede0d52ff.npy +03211117-77f4c991478ad1c26cd5a1d5c8bb85b9.npy +04379243-5e0e607f01cdf9ed93f709c6d6d99cb9.npy +02828884-394563d19e157c126f2e3fcce6bbeeb5.npy +03001627-3ea40a75f22515557dcf230d8b7d162e.npy +03001627-3d9dce1953180fe6f9c9f9697d1ec60.npy +02828884-122a480cfcdd742650c626aa72455dae.npy +02828884-aecc04ab28ca258181dea46b799d4f46.npy +04379243-6ca66a443e651c1423500a5b036df62e.npy +03001627-b1a30ad2706247b53c5f24f851caaab7.npy +03761084-9174b5b1b7306e1edf3a1b0d597ce76e.npy +04379243-a0b11917da240c98391e4d6c585a697a.npy +03593526-bb46957091f2a282cfdfe3f21f42a111.npy +03624134-d5f29a19d7523c8df1f105747d69ebcd.npy +02691156-177ea8d43905b1646ee4da51ee0005c9.npy +02828884-d0fa12d918d97314738e43095496b061.npy +03001627-d04d854533d618fbfebad4f49b26ec52.npy +03636649-e6cd04818644ee6f23acb241f0917910.npy +02828884-161bd345833d982325953d410324c2ee.npy +04379243-b112088ed4afade413b554f4133f4b49.npy +03691459-bbb7275f2a0224eb90146e2a0489a257.npy +02958343-9a806af16e5a102786d01a5629641c74.npy +02958343-3ac08e66bd7da4c35da01f298003d56.npy +03325088-cf9b1dabebb64e20b983088451bda93b.npy +02691156-b6af488133a67825881b4ad693eafd3.npy +02958343-a3d77c6b58ea6e75e4b68d3b17c43658.npy +03001627-453e8c067c8cb5d8f51f77a6d7299806.npy +02691156-9f75309b9744f1b54eefcdc602d4520.npy +02958343-f238821689b42db5d95840a0da458be0.npy +04379243-d1a80144a7efe02e585ed17f54616d23.npy +03001627-629117f474a4bd482d7c2f5a9f32d6bd.npy +02808440-edeee2a9acec49ab44221bef0fa3c36b.npy +02871439-bae48c009fe2a954a4e1718e2dd19866.npy +02958343-41bd68dd23107cc4b0aa56928723eca5.npy +04379243-a1593fbe3a78c7858795000a72749c36.npy +04530566-6b7284918634488da1d10a704f5ebc89.npy +03001627-a4b690e66e3937c88b42931b6e108d6c.npy +02691156-389dd6f9d6730b0e29143caa6b05e24f.npy +03325088-8aebc9a91265216e843f813f752a5e35.npy +03691459-6c71c0791b014bbe7ac477bac77def9.npy +03948459-e534d084d3bc37184d0af51460733e47.npy +04256520-35503a69108fd2a790a1391b3fdfda26.npy +02876657-adace8a468fd575037939c05190e283f.npy +04090263-fd95cf27de958d85827b7030399884a4.npy +04379243-161b5260bcc6f8fc9befe610bb4b9f25.npy +03636649-183e79a892e4294d65666d9a7426c2c8.npy +03636649-38f3a721c7ac21cb8a1a0260fe4e4cb9.npy +04256520-c3cb7d181b205d58a72e1f459869ef30.npy +04379243-38b5da2eb70009d6c045ebb62fca20c6.npy +04256520-548f0e39d6ce5adac036a40816608369.npy +02871439-12766f3b398d1cbd071cf06b697010e.npy +03001627-f239fa77c7b8aa2e81f667e2a25e0619.npy +03001627-d1b2d8868ca506f2a248097aeae36abc.npy +03001627-3853339519aca1bdfcd4910413c446d9.npy +02958343-634b6b50c7e8912f2ce3f1cb66884331.npy +02958343-fe0c5b57b5cf4226bda733a39f84326d.npy +02958343-841a80eb66a079e8e0f3abdce6812423.npy +04530566-2c0b850acd7d11dc428659c2b5124968.npy +04468005-3b4e18c6cfc37f5b4f1cb174d735547a.npy +02691156-fdb107ea7a600f5fe3f3aec01b086ba.npy +02828884-40280757b447eb3cf4fb4dee5181bee.npy +04379243-4517f2aee2482e904da62592caaeb495.npy +03211117-6c56f6063ceb2ba4de1b0b03ca051f02.npy +02691156-e1fbbf2ea1989b49fb2ad20449a93a60.npy +02691156-fe0b8ab916cd568d749f4ec7f5556c32.npy +03948459-1b63a4a6fad149acfa040b4405acb380.npy +04256520-fc786a8d62aad7e7e6942c5426df6055.npy +04379243-8cb6234ed889390df198b94f669bca91.npy +02958343-d67f5ba8950be214aa69dfdc5532bb13.npy +04090263-ae688f34caf5bf7bf1ef0cb5613661a0.npy +04379243-aeb34b796044d26f2705f56670a32884.npy +02691156-c107063f573cbfb3ca8607f540cc62ba.npy +02876657-8d861e4406a9d3258534bca5562e21be.npy +03001627-cbc76d55a04d5b2e1d9a8cea064f5297.npy +04330267-9191df20dc5559a38a68adc64e25938f.npy +02924116-9e117c48527ec9b741cefd10ce5d6cc0.npy +04256520-588556b08760e93b928c76b41dda6e10.npy +04401088-5deb3e8911dbef1adce6ba04fb42df.npy +04379243-c14e9980452c9411aaa05ac4e55dbacc.npy +02933112-41d9c4bc97447c4530ed3cf7f7e32c4a.npy +02876657-af4ff1c4a94383e9ca017e2245ec1dae.npy +03642806-f00ec45425ee33fe18363ee01bdc990.npy +04379243-32a7a2b6974a2e5ccd79ad97258166cb.npy +03001627-e3079223f4714116ad484915511ccff6.npy +03001627-483308834b307b75d5f1108744f02f1.npy +02808440-191c2a4444cb562554d7082b34825ef0.npy +03001627-2a3a847a3d4c39c1b17743c18fb63dc.npy +03467517-8d45c79841bf56331108db7cc39bd3b1.npy +02958343-2c08c221f7c6ccdcca92a4cdad802b45.npy +04379243-fb4cfc22ce88e69625d15f7f2ce4065f.npy +02828884-f8651ae6dc32338ff7010d9d85b1eb2b.npy +03691459-6d83986459f72abd4884161c20b458b0.npy +04090263-7c07a31eca316cb83f217b945a063dd2.npy +03001627-257deb231ce652169f2349486c570dd4.npy +04379243-ef3ae300317c571b490ad276cd2af3a4.npy +04379243-1311cade594e030fe497c7dfb96f4c60.npy +04090263-88cb0215d342a49abddd549216d19f7a.npy +02876657-dc687759ea93d1b72cd6cd3dc3fb5dc2.npy +03001627-bd50871647e3712f79121b38af0e3f47.npy +02828884-f70fe48c38bda53282c132e825d0d08f.npy +04379243-5365dead8b3f7d4166ccbd11a6ef0f68.npy +04554684-a9b39195ae8c707474e92060c1aed1a2.npy +04401088-5b826c910108d27a684b810d277e0e9b.npy +04256520-281330718b2988624b3c42e318f3affc.npy +03001627-249b40a630dd751f8023b347a089645c.npy +04379243-62b7145b5920a67aba18ade30e563d37.npy +03001627-9db1302f2fd980cf3cca2657c9d0b9e4.npy +03001627-d97c5945e9449a58737e4e0df09d751.npy +04379243-f878dcc6987a7a8a4719088c8e42c6ab.npy +03001627-e1e3796be1c4313f9a59e20336b93b69.npy +02691156-2fb78c8d2f27598826360e1e29a956c7.npy +04379243-14f18c8b697d79e099e8bf807e902261.npy +02924116-a08a579a7225b564fd952eb662903548.npy +04090263-d7da6065a37b9b42bc352a3301e817d3.npy +03467517-ed68b19f2f34368bc029bcb600cee01.npy +02691156-56c605d0b1bd86a9f417244ad1b14759.npy +03642806-e6b92cc71ad04a775872a8d7ae27b927.npy +04379243-b6758a9b899d540919fb4103277a6b93.npy +04530566-c3119babc97b4cb374f75d9e92dd466.npy +04468005-bfca8640e2b87091bd76ea3609a7cd12.npy +02958343-1cff510c0630c3cc673ddeabdcc8c6e.npy +04379243-5a09bc1430a2918d1f191e8de8001d7d.npy +03211117-e2fab6391d388d1971863f1e1f0d28a4.npy +04379243-8be1ff29a5088b482822b5101b06e070.npy +03991062-5ee97eb2f085db76993afecc2c675915.npy +04379243-177f4749d22ccddbf4ae8c93f4db5e6.npy +02871439-6cb507b4c8931bc51e006d63cfdcac0b.npy +02691156-ce9246d409f1c688bc0909d98a1ff2b4.npy +03636649-c9a0c193805df62accbc9e602dbf6a4a.npy +03001627-d2f844904a5cf31db93d537020ed867c.npy +03001627-850b424d90dbc66f4d68bade576979ab.npy +04379243-f50603a59b5c2ac7650419cd627ce18b.npy +02880940-b4c43b75d951401631f299e87625dbae.npy +04379243-667a88cc3ca1cef8f37af16b2893f1d4.npy +02691156-84d5ab52436c832d36813a9f7d8d3045.npy +04379243-d0b6fa6b908473b05213cec267286d18.npy +03001627-e05172ca06db0781a0a34f494d525bb7.npy +03001627-27fef9fcdec5a001f8f60938be4e769.npy +03207941-7fce8c7fc6ce0364fcd4910413c446d9.npy +03046257-327182214670d929f51f77a6d7299806.npy +02828884-1b78416210cbdcf1b184e775cf66758c.npy +02958343-2cbe6850de4fa5a34a6a7ab072f22d7d.npy +04379243-184f3a06dc5eaa52881e214542763909.npy +04401088-89f17a3563941ba9f2fdbae39bae1eff.npy +03636649-7075ee8d16f012e350a4c7031a41d126.npy +04379243-f875ff7c72fdada820768660cf080d12.npy +03207941-ba66302db9cfa0147286af1ad775d13a.npy +02691156-d63daa9d1fd2ff5d575bf8a4b14be4f4.npy +04554684-25b6e21ae9aa70824657977e55055ba0.npy +02691156-c271badfb6842c882fd5ed7e39258c7.npy +02942699-6ed69b00b4632b6e07718ee10b83e10.npy +02933112-fdf32559c6b7a6643fe047712e43e185.npy +04379243-d0891a7d205203a9beedb4c8fd29e2d1.npy +02958343-891aac401b4a3273afe1d4530f4c6e24.npy +02958343-8577f3f82d5ce3ecc2fe329dd557eb52.npy +04379243-3c12d6e9cef0adaede2627e1e10e2802.npy +04379243-fd7380eb29fafff3742728b30848ed03.npy +04379243-e750a8adb862c9f654f948e69de0f232.npy +02876657-8d27a39b1a33dcf9660045a6e369fc9f.npy +04530566-d35a759e08855e24dfe2d17b28f48786.npy +02691156-5d6334ae2a0dbf70bd46d022fd7d80aa.npy +02958343-d153b871182b8b3df6aa1413413c923.npy +02958343-97119a85ec049e1df59757e1209f2c7.npy +02691156-18d0da47a238945abc0909d98a1ff2b4.npy +03624134-308f294e2fd166f78000bd932f680a79.npy +03948459-706a2ebf066f3cfc8af105e8848bb6ab.npy +02933112-1a2c199d7c8cb7f83d724fd1eb6db6b9.npy +03211117-3c4382b40b0e9400279326882e8430cb.npy +02828884-9c32648f1412d8a6db6e463bda4c63ae.npy +02933112-6ed6e797fbb6f0c9b4979bfe197a8c89.npy +02992529-271bc457eb5f8f4d2bcf2225e929a245.npy +04468005-9ee07849ff9cfec39954eae9164faecb.npy +02924116-c68f0a21d0c6c4018ae96729cd441b.npy +04256520-7e2fb2fd4c604bb1ef6c510e24348d3b.npy +02691156-5f2aa0bc5a7fc2beacf77e718d93f3e1.npy +04256520-4e925afce2f8fcedec9587880f9bd7d8.npy +03691459-98db1220073f905159f43e87f0a59fc.npy +03636649-a9ed31fba7eacd42f51f77a6d7299806.npy +03001627-d8ea454fb35e38887b11ae648ea92233.npy +04401088-5c141e299b50f1139f24fa4acce33c04.npy +03211117-be2018563a5bf1a088fe6ee2419d9481.npy +02691156-687ebd7d2b1e1475459cbe66a12329e7.npy +04468005-cc206ebaaef18bf3d4fec646771c576a.npy +04530566-c21024d97247df5ae922b610a625137b.npy +03001627-7316e49785de77b9630abf945d2f3e0c.npy +04379243-6110d87def4fa88c154c6bbaeb7d331f.npy +03467517-d3eba720791d85401e67b43145c3c515.npy +04379243-ffe02f7b3b421ee96cff9b44fdf0517e.npy +03691459-7cb1aaaca10a8efa8d8155ff8532e190.npy +04379243-cfb7e0b0f44819c5e2f409c9efab99cd.npy +04379243-c8dd6d63b6d82f8399e8bf807e902261.npy +04401088-5f03b8d583798f7fac18d1d66482053f.npy +02958343-63b0fcfb7a1ac7efe8d8cc304201f02.npy +03691459-710c0a8ede7edb6eb31ee294b2971a9.npy +03001627-4855971647f786b642e1bb4fe264125f.npy +03467517-8a68dc60f7ceebfcd3728028781ec3f.npy +04379243-4bf61d3643b7e6ba19342061b16c380c.npy +03211117-15896858de30017d8e75bb5638d14ce9.npy +02691156-f0b22be59432dc8bca8607f540cc62ba.npy +04460130-a739f388def3e027a72b66695a920fe2.npy +03797390-68f4428c0b38ae0e2469963e6d044dfe.npy +04090263-105c9e30b6fc033d96e5f13299458076.npy +03325088-2559df6172ff5b1a840312071e438eeb.npy +04401088-df816deae044cf448e53975c71cdb91.npy +02691156-296c3ee559f87c9354eefcdc602d4520.npy +04379243-3ea2fc7c32abc9f758df8eeaf3dad1c.npy +04256520-5c66c3e86a131bb969c8f7b0ff61e3de.npy +02880940-a5f42bbfddcadf05eeb8d422649e5f2b.npy +04530566-aa0be5a337baedac950c27aa880e8898.npy +04530566-2f4d7a1873384f5a7301f2b895d332ac.npy +03046257-605c9deae76d0f19b9ed8f64c2cdb8b1.npy +02958343-f9cbd331bd475e07dc1fa1f50eb490cc.npy +02691156-98988dc4e5c62dfbc0909d98a1ff2b4.npy +03691459-35815951ccf18e3eb1f6750101befd14.npy +03691459-acf4daa2ed704ef36a27540a4ffd1b08.npy +02691156-ce00bc7519d595c525a407b55f350179.npy +03001627-3baff0f05a4ac225b872c385efc13c74.npy +02958343-65b9b2df0985821463e6a626b8b4d07a.npy +02958343-79f4f7378074d3478e42313717d27982.npy +04379243-1893e7831f8852a2f51fa0238791f5dc.npy +03001627-9795162b409011c2a6fee8e2140acec9.npy +03211117-3531ea4e850159dc43a6722dac94523b.npy +04379243-11ac24d90fbc20bc5d714c9d7df1c4ed.npy +03207941-14877e33095c0595a86b76551c6a3b2b.npy +04090263-40267f5d09bb0c422c4683dd00deec1.npy +02828884-919f90e92283eff8febad4f49b26ec52.npy +02691156-a1784ead19fb7645b6dd6448cb8a70ee.npy +03761084-4bf44e878bc9bc41ccd4500d193ab05f.npy +04401088-93cc80bca9e1812a64a09de5345a6fef.npy +04530566-410b12d445e5deb49588e71e21de9f30.npy +03001627-2a8bb463e116e51de58b00a9dd2403d.npy +04379243-5554b586330150ab6d5ac6b606b81bbd.npy +02958343-78c3bf6ae1bdf75419b43924bf120208.npy +02691156-69a7b9b7265a70f1a9b2becd26dc2fc1.npy +04379243-da9676ff70b2e78a0a7b8ecc42036d5.npy +02958343-93f82393df6d4b7c315a637e839f5286.npy +03211117-2c1e2873955b563920685b5a7e34b501.npy +04379243-c0c836c630cdb4bb664b3b9b23ddfcbc.npy +02933112-11beea78b1d558d4b246c4171f2c393b.npy +03211117-44bf642d0b33752628fdea86734e40fc.npy +04256520-8bd993fc6a605a63ac4c87b0cf5278e7.npy +04379243-fa29ae17ed1482ed8aaae3d020f5ddf8.npy +04225987-b6074c8d74b58d31ef566954f332b813.npy +04256520-c951d9b4f3da0b5519fb4103277a6b93.npy +03001627-51e14c516e45ec3b18ed59365c9648a7.npy +03691459-1e6a6ff6f4168459e5c00598c3e9532c.npy +02992529-2964d10d72ea38cf4857f88b08630a42.npy +04256520-7f0a1abbf748d3b09a91829e64097423.npy +04090263-948d90262559d560886a4efa4119c824.npy +02958343-57f592c3ec49318661c6c61410fc904b.npy +04379243-8dcd27d37c9b8bbad0733ded25052299.npy +04090263-f8aedbd628e010a64033826da8c9e89d.npy +02691156-146533404a778665c93b40751084c22.npy +02691156-987e67ef16969b93663e90eaf6b4ca52.npy +02828884-40cee2893781b47f50f9fc0e2c94dd76.npy +04401088-709a0c498dfa2b32db9f110046803f4f.npy +02691156-7ea57db538494a2fc1ccec171a275967.npy +02691156-480ee59947a01283873ec74c119307b9.npy +04401088-ccf2058300cac188639e45fae4b57d2f.npy +03991062-75afef7dee74151936b0f2a1430e993a.npy +03325088-a0b96fb7f9ac68cab362845c6edb57fc.npy +03001627-917f2800d9fa9fe8c862eec8232fff1e.npy +04379243-f80cce35d167ff9b855931d119219022.npy +02691156-d4d61a35e8b568fb7f1f82f6fc8747b8.npy +04401088-743b747a119307e8e3785a46a5c831bd.npy +03325088-497e448f82ef1ad3321831d2245cf06.npy +02933112-238e8b7747e7a2503c4f66791e25960f.npy +02933112-4c99fa08135a52d04c62bee40dcdc539.npy +02924116-ce961fddcde47dc972a38ac2b8f5cd48.npy +02876657-d1792ebb96fe73ff30612f5c0ef21eb8.npy +04379243-7918d848b37db85ee1495fb833264cc9.npy +02958343-8d78c8489dc927dcb07f27f3519a9cd4.npy +03337140-99b060ca274d8613540291e94bc8ddc3.npy +02876657-b2498accc1c3fe732db3066d0100ee4.npy +03001627-94c8b873c9214a726e18d8b0769ce75d.npy +03691459-7ab21928504c8f5983247f812f2eaa97.npy +03593526-46eb2397e694c01e2b0ee99af125a449.npy +03001627-603351f3a2ae3259f2b931201029bc76.npy +02933112-886031ff2a514f86c59350d819542ec7.npy +03691459-4294d3cc2e413bafe45b40770dd7ed5c.npy +02691156-40d6a54bb4f276afefe0d4e1eba2e3af.npy +04401088-b1feb3020d9380ba4fb324159a14f34e.npy +03001627-99ee0185fa2492859be1712545749b62.npy +04090263-1a2038ee147fc6d434837e2aadd6d77.npy +03691459-3fbf353af74136feb9001bf6cb0603cd.npy +02747177-62d897a92c86cb392ab20b9ffcec9f65.npy +03593526-dfebdbe996e582f453b5e86c4b574a4b.npy +03991062-ea873ee1dabebca4eab56eee78a237c3.npy +02958343-2b075c9c5d85bc779c75e543b21e90a7.npy +04379243-7f52ac1cf8e52a58be46d062a5971723.npy +04379243-cbef425aa02873c0f51f77a6d7299806.npy +03001627-58479a7b7c157865e68f66efebc71317.npy +03991062-d7ec18a98781e5a444175b4dddf5be08.npy +03636649-297d929269bb62da43fdcbcacbbed64c.npy +02691156-f134306ace70df3ac1006ed55bc1a3fc.npy +02958343-75bb1fc144e6d17a6d00e450aa03077c.npy +03211117-d8f4c5160059ef245d79a44cb814180d.npy +02924116-f7f015833b432f60fd856e0e4b7e59c2.npy +02691156-fff513f407e00e85a9ced22d91ad7027.npy +03001627-fbe64bd927721467dff2bb0129eed40f.npy +04256520-7cf34cdf58717ef0826fc8d57346a2e4.npy +03337140-a9e1a1d22b3f9231dc2bad4d8565b716.npy +04379243-8b094873d775f6e21130871dbfe24c18.npy +02992529-e8e9617b4f7247fa3578fcb734a22822.npy +03797390-2037531c43448c3016329cbc378d2a2.npy +03593526-a84361eb6d9f55d99d3d767e1bc88d65.npy +04379243-e1f9b43eda445dc8c862eec8232fff1e.npy +03691459-859ab0a5ce89e271b4607134dafdbd9a.npy +02828884-d3b2e0d1482ead96f4fb4dee5181bee.npy +02843684-42e9aff6647766ed265d1076b4b6c5c.npy +03001627-77c02e92d5628be59db8ad97fd392b59.npy +03001627-bc21c95f766502a78b03575bb54dfd4.npy +03624134-9ca44477e52bf36b5f43099cebc43623.npy +03046257-a91fdf8f83aab0e56e71174964d90e49.npy +04379243-140f12d10c2b7fd5c77467482d6e756.npy +03636649-7b2b1c24a60bcfab2cd2160e449d45ae.npy +02924116-2ef8ecfcff403cc0403492478acd0aac.npy +02691156-bf448fcf33a5349619ba010ddb4974fe.npy +03467517-6c9a9c0e2af9d5b35f713e773d664ec2.npy +03261776-c6dccc2985bfeb7c2b8ed48c6a7daa1d.npy +02958343-df00eb409d4e8fcec07224da8e53476.npy +02828884-8ad9910699d6a21781faebbdea6bd9be.npy +02871439-403a35d06a12b07070048d788a6ab3c0.npy +02691156-65166f18d4ee36a61cac9affde84fd21.npy +02808440-e3cee2a50dcd43bdccd0340812259a39.npy +03948459-820f8b82a945eada1123c3d969d6331f.npy +03211117-385b89320cb3db4b958a493036fc8628.npy +03001627-c394dfc3c8573d1b19fb4103277a6b93.npy +04256520-7a77351c67566e4159a4e5a60d4753a.npy +04379243-1ce87c214e0be0e87dd6aeb162858c12.npy +02958343-dec396fa569fbd20618e9d35559b7aa.npy +02992529-a3c1c9fc390b1bbbb099170e6f5a4af9.npy +04379243-b4c66c291f2c46581c1b3b2ed8d13bf8.npy +03636649-2df829fa60a85466a2f2a5c7a758a47.npy +04090263-e35192fa08101d5db257aa9856dac07f.npy +02958343-db79ceb1bf94fd81851f021b9ed69c58.npy +03636649-78ccf7d2ee6d5e34fcb8d8c6d4df8143.npy +04530566-2615224e88e47ed29e5ca238b1551011.npy +04256520-27d388a77f5b27db48186eab550b0d6e.npy +04530566-490ba339e10c0b7f4de203ef6842ee61.npy +02946921-51f0b5ce9711f63bb15a1cf05bc3d210.npy +04460130-61dfd94f040757892606d242dcfd275a.npy +04379243-62ca9722d848d0d17f74248f969ff9e9.npy +02958343-f934155d32f9ed5b4101e38beb790a92.npy +02747177-d3cab0515bdbf311ad5067eac75a07f7.npy +03001627-3f5fdc05fc572730490ad276cd2af3a4.npy +03691459-d14e6214d7dd4ed62d563c85edb49108.npy +02924116-9e8edbd1e7b79f058b89799e9a2e578c.npy +03001627-4a2b8f9d13afb39f8f1abd08ebea3018.npy +02933112-a256bf234c60a150c226a4421a1fedeb.npy +03636649-3815469d7a7d336ab0a29c51aa6f10ce.npy +03636649-122fb7bfa09c184ca249f8489bc060dd.npy +04468005-82bc9cc9a34fe639e855454b1172ca3.npy +04468005-52b9747ae68db7f3ae4054efdf73ba81.npy +03085013-9d86f895dc2d54c9b09914703fdadd6.npy +03325088-e09fdcf6ca6cc44969f45219d1cec82.npy +02958343-6283a8fcea4976fe47bff85f09fd66b.npy +03046257-36ba88f12840e84bbc3768389c53bfb2.npy +04330267-41292ef7b99473212846c469aaca3af9.npy +04099429-4c553d6096440b7b64b95779c8554990.npy +03691459-7578b2e27851b989a374ee921da07aaa.npy +04401088-7f41f4b186fdf84c7ecaf377af2046d6.npy +04256520-f1241a9c69cf35feb3104e94482ea9ce.npy +02691156-d18592d9615b01bbbc0909d98a1ff2b4.npy +02958343-8a5b15ec0ed8e9aaba44b506f43666fc.npy +04379243-937fba1b3389783684b7bc3f8a9aa55.npy +04256520-8827bca86b63f748b2c9b996c5b9e81e.npy +04530566-cd1d407bf8637a019a6249baee317a57.npy +04379243-dca821b9d2fed090f51f77a6d7299806.npy +04530566-86fafe5bf7013d18248c5646daf6718.npy +04379243-f9ed6c993f7d65e2e5f83d0df19ff934.npy +02843684-fb7402f91e300ead8ac033353d37592a.npy +04379243-10db06b0d15bd4ee72f847ab4bec38ed.npy +04530566-10e10b663a81801148c1c53e2c827229.npy +04256520-1fb52b6bac60286afebad4f49b26ec52.npy +04379243-84a0b93cb41ee6e129cb4c9f87f87751.npy +03636649-587b4419a39cc088ccbc9e602dbf6a4a.npy +04379243-91d5f09b7126c4b9d158bbba9bf9a9e1.npy +02958343-158a95b4da25aa1fa37f3fc191551700.npy +04379243-5aefdd5252fb662df51fa0238791f5dc.npy +03001627-30afd2ef2ed30238aa3d0a2f00b54836.npy +04530566-7bdcc3c9462eed64482170356260f668.npy +02828884-7cf981899878464e2056b4bd5d870b47.npy +03593526-e0af9e8ee2cf2a82813fb41783e5db30.npy +04379243-761a4fba430377171f335cc23d448de8.npy +04401088-bcf3ca7e860d04eaf0fbb92458462640.npy +04460130-166bd86229867093031b562a9def0c1.npy +03636649-5b12386df80fe8b0664b3b9b23ddfcbc.npy +03691459-5daa294dfd41b3c2e01d588c78e60948.npy +02828884-28530ebad05e63d9d9c2d24a3a0c74af.npy +04379243-ec68e1edbb7e9bc7e93cebb6ba9ca43e.npy +03642806-846c5850093a080f54b2a16efa6e7b19.npy +03001627-562fe0ba05c24bdaa52abcb0c06a3598.npy +03001627-7a1515106a9dbd2bae4c6ed7474cdaa3.npy +02871439-c4966c7d5f8aa1216ca79a8390566bbe.npy +02747177-cfb3a57ec847ebefc99e09be54ad23a9.npy +04401088-99fa43c391f71ffd592461222e5fed0.npy +04090263-bc74663ae3ef56508f65605792e3e409.npy +02818832-3378d2b70f083c173f71f25fc2bf23a6.npy +02958343-f2a990659efa05c5452d05118c2bf489.npy +04256520-691785b64177ec582461aedb84ab8436.npy +04379243-de10ce891b1cd33635836c728d324152.npy +03211117-f155df0854fb33a11030e4efcf938b6b.npy +04554684-265d042dcfed6f15c357c21161963e89.npy +02828884-95db80660b4d979f601104cd2d998272.npy +02958343-25378c7370a06c497ef186a2ac298b0c.npy +04401088-4a0cd042d7479d6810bc2436075f6a52.npy +04379243-b2d9065a028e52c7bd1dc9077c6610f5.npy +02691156-b1762428d609674598aeb62a3dfc01d8.npy +04379243-836ddcae13c81d88a58a5ecb2008fd42.npy +02691156-575b8ec48c550f456252573e97057236.npy +03325088-2ae78fcdf7e0bbe0c36fb70296e45483.npy +04401088-854ab60bd57d3d6d2f412e1bfcc51526.npy +03948459-a8aee0ed266811e5cad3066323224194.npy +03337140-cc9f54a7900dadb2f813f0670c9eb744.npy +02828884-d6075b23895c7d0880e85c92fa2351f7.npy +03636649-15332cc15b3de2e7a4ee05a5737b7178.npy +04256520-c6edb435655e832debe45ef6009149dd.npy +04330267-3486e9ea474af3ebe793cc5433bece89.npy +03691459-15fb39da1ab90994a9504db65c138da5.npy +04379243-bd3dddce162f59ead92dd8f41946f1b2.npy +04379243-501f61f01aaa195adcfcef693e7ec696.npy +03001627-47362cb47416904b76e38b52d9aafc11.npy +04379243-f0c5410293e85a695a96bae7b017a6d9.npy +03636649-7b39100755e9578799284d844aba7576.npy +04379243-52c0950979a8572ad42ec7e303174a87.npy +03001627-b8552f663f2a4f4d54e4f80955961143.npy +02691156-5eb91263da1f0bf3e816c75152573ee0.npy +04379243-2b6ce4f0d57ada2ce6a02cdde4c23286.npy +03001627-84f7061e038484492f8cdfb829e0f65d.npy +04379243-8a2598fefd4a81e9c7b11e86284a2e.npy +04379243-797c7f154643169bb07cbf788ba0557c.npy +02958343-a6d494af391a97686436916a86a90ed7.npy +02933112-91ac5c074c7d137762646c8cd54d58b4.npy +03001627-60622d74c0712934a5817f81a1efa3cc.npy +03593526-d4b38a6a694cc2bf55f46d55537192b6.npy +03211117-2979d8814a450f884b8894e5e467986b.npy +04468005-a6379623690fa49f5483aac47b870866.npy +03001627-4206cdb567679c0dd197f67767b32741.npy +04379243-462e8745e766ed9fd4d8765e3910f617.npy +04379243-3c4786ea0997d6bbc0f947750540fb22.npy +04379243-bdd12e21daf8664689940e75c3dc3e7.npy +03636649-a833d2cae8fada7430f6e0ede20c4525.npy +03636649-80eef85b735218b0ab8d22b09768208b.npy +02691156-3826bf5c55ee469cec4dff11e684b695.npy +02958343-83c31a4085063873dc2afbe43bc71afa.npy +03624134-c68e65d16ebb046b2ee0f9a97b71d505.npy +03001627-2403b6769a03c8a466ab323d8f805a57.npy +04530566-91eda08cecf2e0f1c6cb0dfa2f14f9d4.npy +03636649-930d6656e3df0635fcb8d8c6d4df8143.npy +02942699-fb3b5fae94f7b02a3b269928487f8a4c.npy +02992529-d79b59ea51a9d80c483afc91de6851e4.npy +02691156-a2f0c1bdfe1475bdc1a897657d9a1924.npy +04379243-1cc5bcbad2fdc660d942e529754fbd45.npy +03467517-9f938cb5771d594580cbbabb0edf7284.npy +04090263-54001db75b6071eca7dd22c0aa3913f0.npy +04530566-47adcb0683a3de6cd202a4790115f0c.npy +03001627-e3ada26cde5b4de01186ba196e9dda0b.npy +03797390-4b8b10d03552e0891898dfa8eb8eefff.npy +03001627-d2c465e85d2e8f1fcea003eff0268278.npy +02691156-fef1c15a5db21b00a67cc8f661e7890a.npy +02958343-88161acf1ef955c5d76439fb95cdd2ed.npy +03636649-8d1178acdd04d633c35131da26f8061a.npy +04379243-a0379565daf4b6e6579cea75b38cb7ce.npy +04401088-24f3752312dccca3e23b34f33128879b.npy +03691459-2f7b5ea50c09d928b23f3e90fedcfa3.npy +04379243-f2087cbd26a910355c16106acf3e4b14.npy +04379243-c04b363fd824528bd42b9650f19dd425.npy +04256520-897e43119c6e4b8710a82b807fbeb8c.npy +03691459-438dba79401818884987b3f5f9a53cef.npy +02933112-9c15e8897adce40c963aff3ec12fdcb.npy +04379243-5ad2333321746a8b3f222a37719e9945.npy +04530566-1849ee33d087288ebf473eeb55ae85d0.npy +03691459-5976630a3b8452617ae81ddf970c0d9c.npy +04090263-35818f16eb3540c0bc6e84bc30e573cd.npy +02958343-dfa6c32dec07727ee9d8921ebe6d5b8e.npy +03636649-c0644ddc5cac342b565ae30b0a8151d8.npy +03001627-96d9944f46bd330979414e04132a8bef.npy +04090263-ee36a8770c74281b52188a7e683f7f4c.npy +03991062-ff08db7c7c1f3e522250bf58700b4d8f.npy +03467517-601e01d49a1daf2c79f4a19b034b33f.npy +03691459-18e1be943fecbad143662aee1fc05d23.npy +03691459-33d61def031dc1ef256097a658bc66b2.npy +04379243-23fc3f07efc7ae4d19fb4103277a6b93.npy +02691156-fbd800d43c5f0d74250cb4f7fcd9ec03.npy +04379243-5fdde770581fa1fcbae326b60581fb7d.npy +02958343-d6390f62d9e036efb1bb46d2556ba67d.npy +02691156-a2661597dd2e8a2eb87697d3904b168b.npy +03325088-bf8ceca3b60295f5b362845c6edb57fc.npy +03001627-2ba108b72aa4995814513156cf2b8d0d.npy +03642806-7a6b074fec1b8b9c810b27ad0ef73ed.npy +03211117-c906b5644fe468a2b61fb7ca6803b7a5.npy +03001627-fcd8163b26250f499fe49e672436bc45.npy +02808440-63c4c61e156c25d23321831d2245cf06.npy +03001627-e92bcd55d36a2b70ea934df7efd260bd.npy +03001627-5e13ddf9fa4ecf53c62f0847fa177f8c.npy +02958343-c46a940147e6da66ca92a4cdad802b45.npy +03001627-39c5291a2dd17d6430e06a011e63236a.npy +04379243-fbdf9bffeb353474c3a767747b75e56.npy +02691156-d7e8b636d4a7dab67e697b0700f10b81.npy +03001627-d609864ada7d0170278d386bfa54545.npy +04090263-d7ac2d2fafd9b9076314c3b6a3a65519.npy +02933112-902a342783278a9d824662341ce2b233.npy +03593526-57b186ba25a680584289430f919c490c.npy +02747177-76bd9785d3f6e77f81faebbdea6bd9be.npy +03790512-e59b0be8520e4a899cbc1c09129e1507.npy +03691459-44b9054ed15fac2c3a67bba344536c8c.npy +04379243-47a9339b6a731a1019fb4103277a6b93.npy +03636649-aa001d69c5b051591736c5c04ed41019.npy +04379243-db545f0422e72d3379368d1198f406e7.npy +02808440-86624ab3ee7f840d3321831d2245cf06.npy +02691156-19e6717acfa7d2bdca8607f540cc62ba.npy +02958343-51062ec9b0dadf971c65421fe734e7bc.npy +04379243-ca13cadaeff93c58ad0e9e0d146abe05.npy +02871439-1e46876da968e5de233e9dd8288dd718.npy +03636649-8b4cb57c4d21a84d6af65e5aa19d2e8c.npy +03513137-e143d40f9df57d92288d8f1144f7979f.npy +03948459-b42b1c0c621d2217a8ef632591b544dc.npy +02828884-34bbcc05fdaed2e437638a2ced7d0ba.npy +03642806-3f45cde6f7a13138e256fb3794905772.npy +03467517-3054dcbd4fe67597f57c034b5317e704.npy +02958343-dbd0651a6d5bdad69bc489396a21b465.npy +03001627-ce2ff5c3a103b2c17ad11050da24bb12.npy +04379243-56188419e8052c0b36b0f2a1430e993a.npy +02691156-5274742871cef1aca8cba409c4409ba9.npy +02924116-411d5ea3c73b9214a1f49c8e152c519f.npy +04256520-81d3c178c611199831e05c4a367a9ebd.npy +04530566-fd850819ad05f139bd4f838682e34d2a.npy +04256520-2e2f34305ef8cbc1533ccec14d70360b.npy +04330267-bbaaaf017a32d63a15cef3430fd3876.npy +03001627-ecfc0cf5081976323002761e7a3ba3bd.npy +02933112-a909c649ca19e9c9a45565492492fdbe.npy +04379243-a6ffc5d46a146796ac4c0903ae810430.npy +04379243-4185ad2b10b278f83889b52430b1ab3c.npy +02924116-38aa6c6632f64ad5fdedf0d8aa5213c.npy +04090263-8c6c169c326e61df67b9bb226efd81df.npy +04379243-891c1cd45e849766b07cbf788ba0557c.npy +04379243-78c4b505894342269299936b751bd77b.npy +04090263-10bcfa94dafb185411617c2f1885cb59.npy +02691156-f7160900b6ce7bc4e63e266a803d9270.npy +02992529-7a4619d2240ac470620d74c38ad3f68f.npy +03636649-d4331a5810e36726b8c3db3876404c90.npy +03991062-ad6b3774f97b35ee9eff3cfd975ea4b3.npy +04379243-54401b6df397d9464719088c8e42c6ab.npy +04379243-89e9fa41863867de72ee08e78374a212.npy +02958343-7fee48354a144b5604a60621dcde9e6.npy +03636649-20c399f42ea5e6ee748af47e1b2121e7.npy +03325088-87a6968aa7057c61b362845c6edb57fc.npy +03001627-984900a401b412368412406fac9aee.npy +04090263-2c867f76c95134e6d17373579e6fd9be.npy +03691459-707f0e44e935dd55edfd593a4f114036.npy +03797390-28f1e7bc572a633cb9946438ed40eeb9.npy +04379243-2c6d9b85e2be02d9d76ce82841b0eded.npy +03001627-e64562ae2925d5f3f58087d377226538.npy +04401088-bdb87a4218cc7ecd23bb4223d09fa6a0.npy +02828884-9d01b7c51223f973f155d75bbf62b80.npy +03001627-d5cadd520263753b65ae658fdfdd758d.npy +02958343-5ad0fd6e9fd786937aa522cf442e862e.npy +04090263-cbc84bcebe71e468d398c75d8b3af045.npy +03001627-63cce233e9e5c33cd8f27b2e727c3511.npy +04256520-c75ade3248fb4f2f8962005ce0e986db.npy +04379243-a52ca2940a24a916ebadcdfba7971b71.npy +02818832-5e651f1c15fc66f74eae82c629c10c2.npy +03691459-3adf396785cf9dee7bbfac568080cdbc.npy +04401088-73b87e2025cfdb6daf19fa8e8218bf64.npy +04256520-cb93c492c1c3c00a94c9842dcb05f464.npy +04530566-3e7923c788b0b9a67297c18bca670e89.npy +02691156-3788ee24009c65cb4d210d9468aedaf2.npy +02828884-9f17577e34237f74c2f16c13e1941c0.npy +04090263-4a8f8e108cfa6503202be79d8b285c1e.npy +03001627-e3fba8a576d4d875e1d0950dd1aa903d.npy +02958343-2f03e5379f3e9b6857652684714945f.npy +04379243-cdb0bd21fd5d075bbd1f60c111786ed.npy +03636649-95099d85ebd865f46d11dd9fe20b7791.npy +04379243-c683f7280179260a898f72fb23e1ea6f.npy +03691459-46f25e8462258a85a398a0556683e6e3.npy +02958343-85914342038de6f160190e29962cb3e7.npy +02801938-ff796cbcee132bad747e9c0bb7bd88eb.npy +02691156-29ff751f989bdcfc9bff604afc480b65.npy +04530566-a10a3ed95539d9e81f0c83f3777b8bde.npy +03001627-8ddae5e2493ab76af91663a74ccd2338.npy +03001627-48de3e38b0c5fb40b07fa14c34cd0728.npy +02691156-21e9ae6cdd3ddc27e1c97634acf0214.npy +03797390-8f550770386a6cf82f23d8349a133d2b.npy +03593526-386a6dffaef80143fa0d49b618d792ba.npy +04379243-ac9a28dab6b10451beedb4c8fd29e2d1.npy +03211117-75432c09d6b34efd336e9e51cf4eee59.npy +02942699-483c387d6886e603314b44839465ec00.npy +04401088-3a3fb2919b1bd92658c2dcb60645f75c.npy +04256520-2291855068cbe57442b5d6d90d0cc78.npy +02773838-d331a7bbfb0e7301e858db1dc3499392.npy +02992529-64b6ddb847da082d761eb63018291094.npy +04379243-678f5f5a8c95b0508cbb8bac2032149c.npy +02818832-b16913335a26e380d1a4117555fc7e56.npy +04090263-befe2c697ac907f5410d23b0a192e911.npy +03325088-1eb80664e450516e2c6c98851414a9d8.npy +03593526-6f43bf97b213b888ca2ed12df13a916a.npy +03001627-5b43111740009e719159f4cd32e8e02d.npy +03790512-bcabe20e46e5126ed5dde04c96fd8146.npy +03001627-47c04fe5c1f850b784cb23b18bd34686.npy +04379243-ed0b1bd723063c8ee1be359afa82825.npy +04401088-229077bcc4f52356f582eaab37b1c177.npy +02828884-405d1666d90df2c139842e32fb9b4e4a.npy +02691156-7ef375680d89c711c8db97d9bc169245.npy +02691156-77fea5bd4008e5f09a6e43b878d5b335.npy +03001627-99120ec1daa4ae1bad484915511ccff6.npy +02691156-7401bcbb1a184bf548627a76b6268107.npy +04379243-22c5cbe6271736bffebad4f49b26ec52.npy +02691156-eae958f99bad7dcb18b14db3b83de9ff.npy +02828884-ce23a5781e86368af4fb4dee5181bee.npy +03001627-52310bca00e6a3671201d487ecde379e.npy +04530566-b497c390de93b4dcba21fe79619ae253.npy +04379243-d268aa3ecf296572c0806ee26b689c99.npy +03691459-451f3d4fd10530b9d5a56ecdb5a1cd39.npy +03642806-b95ca4fa91a57394e4b68d3b17c43658.npy +03642806-b806daf849a5dba289c212008d2a390e.npy +04379243-3dab0646af0e6945beedb4c8fd29e2d1.npy +04530566-27d32838007b5a07c63bc8fdb41b8eea.npy +04090263-bbdcf803144145e09905a3939c890ad2.npy +04401088-9c1286570bbc6fc78f257ecba9a6ef8.npy +03001627-bb90094030f369e4305a3b2fd9173d6f.npy +03001627-f3499b524c5dbbefa23949c21eddef76.npy +04379243-b1b499e90f17a6332ebeb1e6a8111f53.npy +02808440-429ca6c2fc2c018944221bef0fa3c36b.npy +04379243-631ab9f813568a602b70eac6546e93fd.npy +02828884-981fb231709d4d2cfebad4f49b26ec52.npy +04256520-1b5bd45428de094f593ebeeedbff73b.npy +04004475-7d930b35795c8263ef895f9600eaaa98.npy +04379243-72ffaa15fd437b33dfecba9aa42b51d3.npy +03636649-34ce1de178694f87e76bc197b3a3ffc0.npy +02958343-5caad0d7bc6524531e51722eeef6dfef.npy +04379243-2602a7b129a08e42c3bd24f986301745.npy +02828884-bd51deddfdcae18b3b8dea4a358cbf0d.npy +03046257-a14c0041225ee741d1d1ea91a730b0e7.npy +04379243-f5a673474566ed53a9360d44e90d853d.npy +02958343-d9dd3e204f4aa43f473f10e6caaeca56.npy +02933112-cb84d931a90fbb8e91ea3afb2749822f.npy +03001627-f43eef7e3991f80346ebf4f1147c3f0f.npy +03325088-df36cb46f484094ac2185cc0ca1b306b.npy +02808440-fe063b20427b13bc1c17aef130ed6213.npy +04530566-9902e521bbd9ff3348d84ab7c5cd4c19.npy +02691156-51d6c3bf592a1fc16dfe8328adcc508e.npy +02933112-1a4ff09890565843c59350d819542ec7.npy +02933112-70424e9cde5be52e25194f3c5a4f307.npy +02691156-d3b39374c97d39da7dc01d89d8a05b74.npy +02808440-5db3375f0e4cf84e133dce51d963916a.npy +03325088-a2d329795c7e4c52b362845c6edb57fc.npy +02691156-a611fb88b28c3f2ec231d70e1e0cc567.npy +03001627-e28c5e90a01027bb4e83b37723b7fdca.npy +02958343-31ae8e03d831a85cafe1d4530f4c6e24.npy +04379243-f95f6251339b759b30bbd4cddd04c77b.npy +04256520-e5a4cb87310ec996e649b526d4e1735a.npy +04256520-e323d123c60c2f2e3c777ea9821e1518.npy +03636649-2e3679df6678e8776908456c5f4ff3f3.npy +03001627-862f70e73fa70c9b1a719e2a845bdada.npy +04379243-fb7124d1ea2937f252219cd24638ae38.npy +04379243-fad9dfcbb4c1755811cdd52f3d07553.npy +03325088-752773b189f2557986a0e7208530ce22.npy +02958343-bc533f9881b0775c3a0daf3e5400b95c.npy +03325088-a2154893d949e1053321831d2245cf06.npy +03593526-6e44adec0854dfaa93fb5c975e8de2b7.npy +04090263-5190f781a1fa9b9a733a41fc18f7f056.npy +02992529-c3b9cb70c6a80ed686a04ec9e4169973.npy +04379243-f1afa2f6205f5c552ecfa9be42d43d0.npy +03046257-5431835bca07a47dd274dcf5b21c1a5d.npy +03001627-79d5977609f99087473f10e6caaeca56.npy +03759954-f3bb6ffcfc132f34418c7dc49421509.npy +03636649-6f5b104f7c1cb4bc636c7e486232cac1.npy +04379243-6797d37aae0e1d4339b483f6ce8789c.npy +02828884-da39c2c025a9bd469200298427982555.npy +02933112-1566915c8a69d58812de5317fe5b354f.npy +04256520-f55beebe7409e84c873aec32fa476d61.npy +02828884-7e73d9c7082453987b019ecf3e106a55.npy +02933112-67616bd629dbf7b3824662341ce2b233.npy +04379243-bc4a64f68f9cfb0733286e10d1a7be57.npy +04379243-79fba03fadd8c00ef10b04ee8b1c6914.npy +02691156-57eaa54ff3e4d6f211f78b196c636566.npy +04090263-3d6ea8a01c3330ea8b22dc3851acefdd.npy +02808440-e6c56b5f2265d6423321831d2245cf06.npy +02992529-8f1ec459492c61ff562c8e1ac545ef78.npy +02933112-8d9fd58227bc92e41f3980612faf041b.npy +04090263-dbcad8c956d195a149a3c1009fa79820.npy +02808440-e8a5492555f645cee4c2a47658c3c899.npy +03467517-10c6c59350abb4c3a8a9e1c6e66d8abf.npy +02958343-bef5b9686c2f93f46a2345809e2bb169.npy +02818832-92e4d52351791ce9d9ba459409ec63ed.npy +02828884-6752d9230ae82d1ce67de87b371d4c06.npy +04379243-466e5bcb7038889d9d48ed08450a6532.npy +03636649-d3e339b83170d89629a60d6ab40898d.npy +03636649-a126861b5d720843aaf2b5b6ef88c2bb.npy +04468005-8a8ddf2debe2167c2be8d09ad36d35f9.npy +02933112-cb12bf5a4429ed4c4639ab25a6c4afd9.npy +04090263-eb11f8abbb974b1d12f1ef17d681ef3c.npy +03001627-2588ff9ade9f3c1dff2c92c2a4f65876.npy +04256520-e46d448389af3fe4500158c23c4c5a8e.npy +04530566-aeb094e328468631d3cf225db57b7a46.npy +04074963-ef639e9f766f2c097f2b5660c54d2f8d.npy +03593526-bd3408700fb963b436b0f2a1430e993a.npy +04379243-c83697d186fc799d7bf6fb68df7f786.npy +03691459-f0c6079a6dfd5e0a7a9e31f14ebb8cc.npy +04330267-2c4eb370f10b4667e6a1cd9763fc2f3f.npy +03636649-b31bcdeaae689dd862af18ecbdb58c38.npy +03001627-50d277986a78f9fc3eec26c23f5bc80b.npy +03991062-add11329471685d6beceb95982284736.npy +03211117-8bf7dbdae495ea9c9db805a3358d2d5.npy +03691459-f2918caa3fe8eceb47eac12ec180489d.npy +04256520-d3cc9f995b1f2b2dffcd08faf4fccd0f.npy +02876657-9b9a4bb5550f00ea586350d6e78ecc7.npy +04379243-efd67be7d7fff02d7b9a616d4541ada8.npy +03325088-2b4f980f62ac992a3b717863742b7581.npy +04379243-3be738da92d36dd09db2b194203875cd.npy +03001627-5d60590d192c52553a23b8cb1a985a11.npy +04256520-f4391a20638d415e76e9713f57a5fcb6.npy +03325088-e7ad0788029da81950da8b99982a3057.npy +03593526-b4d2dc40f931fa5e664b3b9b23ddfcbc.npy +04256520-f3a24b3131da1ce619fb4103277a6b93.npy +04256520-5599465b099deb5064810cc21086da42.npy +04468005-2de2972a127607198ed52f6887b0e63d.npy +02828884-30b57b828f961ca8f002715a08c57858.npy +02828884-8417c3b75ce474d217b431cae0dd70ed.npy +02691156-a75977cd75acf0f05ff3feb917a6004b.npy +04090263-6075b98d3dfb0bf5c1ff4c99e4dddd02.npy +04379243-f7196ec7d732af5166decb1b3cdc5557.npy +03046257-33a6aa9cd6a2aaf3636746e397b0c904.npy +02747177-161e5e86fa48686888cad7f6c0e6001.npy +02958343-2e8c4fd40a1be2fa5f38ed4497f2c53c.npy +04379243-aa8bc1794eb3437977de2663bcb4d12c.npy +03001627-a1314dcd76f53519492d9da2668ec34c.npy +02958343-f88b4156c5e8d35ff500cc506a763c18.npy +03593526-8302f9cd5e454de85d878ba9ec3c0d6a.npy +02958343-a886262ac3be5ca7c126a452758c84e7.npy +03636649-fff6acd5b543ae02a9bdc22a1e02e82.npy +04379243-873d8928f314d95045613f5c2df1029a.npy +03001627-89e6839589a9b450a3f6a82f1fd27077.npy +03991062-febc8f9f30673a7af4553a0692c9821.npy +03325088-a9bb6bb33cc438413321831d2245cf06.npy +03691459-d9b205873345a9b35234ceed4dc815.npy +02958343-a471cdae8ec5df5c9e317a6cc797b629.npy +03001627-5ef9991f0985302c2526940b0dd3ff94.npy +02828884-2c76c171562f6bdfd4d8765e3910f617.npy +04468005-e47a49cceae04d4c213c1a52c1de2c.npy +04256520-308f0ebcbcdad58119fb4103277a6b93.npy +02691156-24c499191b85dd55bf4fc6675b9d12fc.npy +04468005-3ed0d2d3fe223c7273f4e1f33d29626c.npy +04530566-f46a84c0b15f8c0492f7f11d4bb65374.npy +02691156-356a633ea047c549ca8607f540cc62ba.npy +03624134-938a7a0692360ec853b59f50e41b1782.npy +03001627-a2e1ddca35161484f4b35f4029eb1ecf.npy +03991062-cbad1d4f7eb51ad9368b14e48c164a6e.npy +04379243-e8d118117b86ab2e8884a069d9619eaf.npy +03001627-43d13e139d0eb78668007dfca4077105.npy +04379243-edfc8ca3568153d7e8ee6c6df61c5951.npy +04256520-73c8bd191a664678f5ba7cb98f498b13.npy +03642806-9ddc0f876f54a784f3655a2ce983ab1f.npy +03211117-a7dfbb06cf1803b0b6d41c42f7ade8c8.npy +04256520-d3a1db19de4e3fcf7cd71f0b7b44a907.npy +04074963-81cbe7a64eb030c6c221cf4c35c835e.npy +02691156-68b5cf1b10331dfa77c1f99ed297e3ca.npy +04379243-9203f560599ca558c16f7010a3b8fdee.npy +02958343-11a96098620b2ebac2f9fb5458a091d1.npy +04379243-af09abc2c30ac934b3c42e318f3affc.npy +03636649-5929c6937d617f3acf7d397dd220c7e2.npy +02880940-2cfecc8ce6c7cd1f3497637ec59e0374.npy +02933112-21224eab2d099f5012de5317fe5b354f.npy +04379243-a0a123a2c7e0429c1b17743c18fb63dc.npy +04379243-fd487468f7a33adbb2a155afd9dbbb0a.npy +03001627-47a707b2804cc98f1a3c0af5880f464.npy +02691156-589e5b24b3b0e30e2620819ddac40644.npy +04256520-453d56b5906989fff29666f384be6c43.npy +02933112-d30f01d6e50f128d2822b5101b06e070.npy +03991062-257cd060f1947fd336b0f2a1430e993a.npy +02691156-78feacec03272b28854fbae23376cbfe.npy +02747177-e519a53461b3b75b66f3eac0b0a36798.npy +02992529-e5bb37415abcf3b7e1c1039f91f43fda.npy +03001627-212e266cab46f1dd5b903ba10d2ec446.npy +02933112-b8be007c703f1a9eb336215553415709.npy +03046257-8f8858484eae0ef5cd94c4ddf9d43fa3.npy +03046257-3ef61faef1e75fa12b47e06a5eec5e27.npy +02691156-596c6e1e27b102aedf9d17a71b5ddec2.npy +03211117-d5d6824b5115b3d65167d3ead22db5b1.npy +02747177-48aca9c3a4006a5163b2acb037dfbcde.npy +04090263-e48d07c71fac7387870906b5178d97bd.npy +04256520-37b3c4bd619d1c6541ec70becd1ecc7e.npy +04090263-1c4361c083f3abe2cc34b900bb2492e.npy +02924116-a9cb2c6d8f3f502ad392e744726eb1bb.npy +03636649-fc602899fa852d6878aa68632c6b1d5f.npy +04256520-241876321940a2c976e9713f57a5fcb6.npy +03001627-8027892aa03a3d2c907a5a34fd8df2f1.npy +02828884-f560aae80e66f50585ef4356ea4ff622.npy +02691156-e9b29777e840e1fb63737f7c5d9fc39b.npy +02828884-c8802eaffc7e595b2dc11eeca04f912e.npy +02808440-e3ecae5ad7f21c683321831d2245cf06.npy +03211117-415324f27ddd70b4ec3d7b1a84909dc7.npy +04090263-b12d95ad4abbf097e149ba69dbb3f6c3.npy +03325088-d440dce04ceb8b83b362845c6edb57fc.npy +04379243-c5838a6cff5a0163a91116f8fe859a4b.npy +04379243-b5548e1e944a31c077ceee024ab73ab7.npy +04256520-6b0254f2a397129a490ad276cd2af3a4.npy +02828884-512511e994adef8c28eac72b6945b61.npy +04379243-3842d805856309df777b6246417c94ff.npy +03001627-809cd21e86d7caac3162de0102da9582.npy +04379243-785f073399d19cf5b000f20a5153622c.npy +03691459-5ab3bc993eec96709aa778fe3a2080af.npy +04379243-87a30f02d938047987b390f69ff83fb2.npy +04090263-333ef51861a0280a561462387555febb.npy +03001627-8d80cc5cdafc4b8929e17f7efc5a2421.npy +02958343-709ebbf3588849b88b55a52bfd1cce7a.npy +04256520-924339df8bd64d694b3c42e318f3affc.npy +04256520-dbe7fa11097535bae7c7920f6a65a54d.npy +02958343-f10f279643fbb3276a78cd0552215cff.npy +04379243-4606eee54ad02693e06d804f36424ced.npy +02958343-1ab80bc91a45b7d0a31091d2234b9f68.npy +03691459-65c24305578ee500dce0005a7422ebaf.npy +04379243-399797977a78c2c3542091189dc62b5.npy +04379243-f1468b16ea560ae551d3c864cc68e22e.npy +03211117-4428b3a883f177c262f318360c3d0c75.npy +03636649-463a3ee50280fddafcb8d8c6d4df8143.npy +02691156-361f57d736cfc14dc8bff13697c27fb.npy +03691459-6a538eac61644b0f84145006657ffefd.npy +03001627-789daa82e0366966c862eec8232fff1e.npy +04530566-a4cf574f52d4e8d4642f9e27aaf0c47a.npy +02808440-ab70496561127a0332d44b56830636ba.npy +03046257-11c8463ba58a134b68661782af60b711.npy +03691459-8b7afc9b056307f3d3ba59ac5475adf4.npy +04530566-cb79681fc1caae04a63e14ddd32fec78.npy +02691156-775120d01da7a7cc666b8bccf7d1f46a.npy +03001627-419520889432730a970d4dd67731c543.npy +03001627-6e50f19c52a760e3cc1159c3b443c932.npy +02942699-3175f1c1d0cca3c6901887a0237c0ac2.npy +02876657-bd6fdeae09b3c00c3ea96ac97db63fa8.npy +02828884-f4a67224c61f79b1733ee41496c73429.npy +03001627-cc5e3fff3e1325dad67c0f41a0da9c74.npy +02843684-9681386c65c676875efd2d175ccffe45.npy +04379243-199676c0434f5e176bdcd672c2b17215.npy +04379243-365bcd79e58fe001243d6e2cf3942343.npy +03636649-816bafd4dd0a04756da1275102abcdb1.npy +02992529-9dcc24af7e0df254525b3f0594400a46.npy +02880940-56803af65db53307467ca2ad6571afff.npy +03211117-49ad86b608403b8ce760531185a75b14.npy +04401088-a635a6b98eda6c1fa436566ba711d6a7.npy +03001627-b19c970b2b8d6795492d9da2668ec34c.npy +02691156-1a29042e20ab6f005e9e2656aff7dd5b.npy +03001627-f5643e3b42fe5144c9f41f411b2bb452.npy +03636649-f36cab1570442a83466f97f37dccbde.npy +03636649-6a1af043806ddc96ac789d813ddd2d16.npy +03001627-e79b6815925c07acb0957d845ac33749.npy +04256520-17e3db80502cd515bec7eb09198824ea.npy +04379243-a9cfaeaa85dcb7663ca57f5648ff1b0d.npy +04379243-38ef005583b3cfd955357c338ec9641.npy +02818832-3acfa3c60a03415643abcff1f32a8b0c.npy +03710193-786cb8e6d57a7912c3366e417a4acadd.npy +04401088-649c8024460077cce8f3b203d0634c16.npy +02691156-a90230831ba263e5f7fe0727acb55c39.npy +03001627-10a1783f635b3fc181dff5c2e57ad46e.npy +04004475-5259f995c2453ce52af8f68791a7d624.npy +04379243-351d39fa6f9b659f2377f2addb49ed93.npy +02808440-9b55067f02fd4a80ff2ce0138c86aa24.npy +03691459-16d8b1fde755f7f96bc5197cc4c47fe8.npy +03636649-71b7341f69f50e35e86c35c1c8efea2c.npy +04379243-75bde51fca930e35dcc7ddfa72357b1.npy +03759954-5e912251c54c316ea35a7666f0cfa5bb.npy +03001627-75acccc933a08ebd2afe8d5254a0d04.npy +02691156-3ab1e94b6c3a1730c56cc5a87f567365.npy +04401088-decbc541efe459a742f1242fa6dff2cf.npy +03636649-f672eccfe1739e962dcf15e1dea29cf0.npy +03001627-a800bd725fe116447a84e76181a9e08f.npy +04379243-f3db554c71dcae06a40d3d325dad76b5.npy +02808440-167bf252d547bcccccd0340812259a39.npy +03636649-a6ae06e879fcaa019e26fe04e3dd51db.npy +04379243-2b2d827267baf5e75510d59f3ab1ed64.npy +03325088-5ae9420bed69471576c18e71fd49c4dc.npy +02958343-239783ded35d9a4e9f40394aed156c70.npy +04379243-11aeb1b72f433cac279f06792ea23384.npy +04379243-18fa0155b4fd12f9a829287b9dedcaa7.npy +03691459-1a33c0bb3949cd3213f068fa484fb314.npy +02808440-3d6afd4a791e5bdeb022c94235bc8601.npy +02871439-5e2cfde5b2195a923e4ff93cfe0b7fde.npy +04379243-6dedce56f7f60da423f7198a00163bb6.npy +03001627-a5f8050192680e993e6a70f59cdd19a6.npy +03691459-853f3c53280aa44fb63369d5dd85d25.npy +04256520-5d94769d9581fa85295994a5a65844cf.npy +02958343-4b94cdc9c703d00fef3ecc8551d2c1fa.npy +03467517-854baed942f075b4d1f4e3beb8257c5a.npy +02691156-4396510f1346f13050586f69625e08a2.npy +02876657-b35973652d9a526c64848cfde3847b25.npy +03001627-f619416ed17ca24a5dc688388b7d266.npy +04379243-1bac0eef0193952558df8eeaf3dad1c.npy +04468005-72e2827b801a1908c645871d38c7adf9.npy +02992529-a120a29467045d34c3f199bb1cdfc734.npy +04379243-8d459a20748b23b8c0c6e803b020a614.npy +02958343-265f0587e4018f7aff6fa400d1cc4c85.npy +02933112-c08dacfd5dd248374e9bcf25298f80d.npy +04090263-47879a6571648aaf5a5d51f7f565712e.npy +04090263-9079c787f6d944d69a6e43b878d5b335.npy +04530566-7114f947ac296d8034d05799e615961a.npy +03467517-bb9ec41d15fc2a1bf9412922790d06f8.npy +04530566-1b00f29471a41f59e92b1dc10fc46551.npy +03211117-9cd4467976a27ac9f3b65283778dd624.npy +03691459-5d3c3b2e6645df602a328c65e88727a0.npy +04530566-c8f5f746daa5bd96b34ff70ac6c9e4d5.npy +02691156-c641785e297cc8ef74008994fb1880b.npy +04530566-45351c87f019646115aa5b227c027ee0.npy +04256520-9d117d7cc29c3ef314513156cf2b8d0d.npy +02958343-a51b3b0cbd9c24f3a7fd25564c2e888e.npy +02933112-45c91d543ef3c1a829a50a2b3c5e5b6.npy +03636649-58e32cefd2f0ca13e938fdd9451c3206.npy +04256520-6c930734ea1ea82476d342de8af45d5.npy +04090263-59ebbe41c7427a30967ff5ed297c1ff9.npy +04379243-825c5f7bad217f49d96790493cac7283.npy +02958343-3d3a1207dac28b9340d2ba94749368ce.npy +02958343-f81db986082fd0562ac826a3c82da491.npy +02691156-c78cbd0e53900a1ef34db3de24263f32.npy +02691156-80b9b2807547a2d3ab94ae13bc67d41c.npy +04401088-27ef3bc1f4a05157bcff4302eb453f85.npy +03001627-e27cb29cc3df4d0330989b15eb158e03.npy +03636649-2070e39377140bdd7f32712aef0efc5a.npy +04090263-4ce26b6d23caecb3cc34b900bb2492e.npy +04256520-cb6b81f8c581bd2ee6fe3612af521500.npy +02691156-4d97f6fcb6886f49cc14f1e6f4f4f49b.npy +02818832-76a7e959f3f752405d72770c487fd7e1.npy +03001627-498e81334b1dfe98882ebc6f4e497cd2.npy +04256520-8520016e497352aef51fa0238791f5dc.npy +03001627-5fd2d226435431976f283df3449ca535.npy +03001627-5ef73c9bee1b4adcd019a8a03d4a2a3.npy +04379243-938ea1c89e7a62a9d6d49cce41472b6e.npy +02828884-c0d3d5f8941c8014ad5067eac75a07f7.npy +02828884-ab92e0151866e32a9ab1f232db58cef2.npy +03325088-f9ff34cbd52103d3d42b9650f19dd425.npy +02958343-e1c6002b98b4cb2c32f56cbc65681ab5.npy +02958343-1e3f494626a24badf35b4953d8add91f.npy +03642806-37b5e63e9f80e2402052a3b22ea3f616.npy +03001627-117c0e0aafc0c3f81015cdff13e6d9f3.npy +04530566-ae65e1f6bb539fa775e66ae917e551ed.npy +03467517-81e02a57da5c936df4b498e11fb60a4b.npy +04379243-86fcaf63c9e6542c858699aaad4acee4.npy +04530566-5c54100c798dd681bfeb646a8eadb57.npy +02958343-c4d4de90ce7839107dcee93b87532f65.npy +02933112-a46373d86967b3fce9aee4515d4383aa.npy +02958343-eeac3253fc4c0b429092ea6b09901598.npy +04379243-279b9a722b9b203b341625d524f6398d.npy +03001627-9183a9f6e6237492c90fb40095d2be6f.npy +04401088-fe39a57b8137ecbd5b2233351507f22f.npy +02958343-af08f280395cd31719f6a4bcc93433.npy +02958343-435d3d83b7511e39f44e15caa8fd94b4.npy +02958343-4de61edaa8e41c3a53c5346b68828e77.npy +03790512-98ed7f86a65ed6ad4a6b6d001599a1e5.npy +04379243-c71453f2c3fbd5fc56cc009699d2a2b8.npy +03691459-8b0544e065d43369588e71e21de9f30.npy +02828884-f1b8f4c4b2dc4a63c2dbf50c3528525.npy +02691156-daedff5e78136a8b507c9a5cb0f72e1e.npy +02958343-1cf08633fc7e8d193d21cf61f69e40a4.npy +03001627-57285ae595c5cc67eea9006d9d8918a7.npy +03636649-cbf2fd4e3b923f9ffcb8d8c6d4df8143.npy +02871439-6ea3f59ca5b732f01bc471cd5b795bf0.npy +03691459-58142a4c3a71147a2e8dbf40bb4c181d.npy +03991062-b2f08901afcc55e3a2c59a4d90e63212.npy +04379243-bdeb03b610923d868ee99ab78c7c9d6e.npy +04379243-f2ba8040ab2d2745febad4f49b26ec52.npy +02808440-c3fc4231f0388188125fa9990176f0d5.npy +04379243-757deea50fa00eb4e5595fbfd7d35143.npy +02992529-5fea05a3cdcc05756dba92a4e2177102.npy +03001627-9b76a0424563e3f4dbbc9440457e303e.npy +04401088-864b69db6dfc4bd0d4b4ae2ff4c58b57.npy +04256520-e084204cf0c6a345febad4f49b26ec52.npy +02828884-7c40c1a2e4476afbaca9cc236210e91.npy +03046257-ae564765e5ba2f037bad031e1feab327.npy +03467517-f7645b3c690d954682c2412261cb8600.npy +03001627-21a8b1ad63a8d19dd7f7a4c4609b0913.npy +03691459-185315ddc6baf393e0b4198d87217c56.npy +03001627-cfc758bfe8a1cd478c159f8d5e761b17.npy +02747177-f67bf3e49cfffc91f155d75bbf62b80.npy +02876657-6da7fa9722b2a12d195232a03d04563a.npy +02691156-22944fabf8a9763f28132d87f74ffe13.npy +03211117-5f73ccba7af987789744d3b3ee0cc03.npy +04468005-8e6d28abeec94d171b801fa323cefa6c.npy +04379243-d0b6d6210a65f1e4e50369287c07141d.npy +04256520-99b87ca5f2b859988b424343280aeccb.npy +04379243-8e9954ebd739a4aa10234beea2422457.npy +03797390-6d2657c640e97c4dd4c0c1a5a5d9a6b8.npy +02808440-519fae15db7dcd017b39ab85244ee8e6.npy +02808440-7f7d48994b6915d8b362845c6edb57fc.npy +04090263-38bbdc92fcc8e310405d5eab6bdcff6f.npy +04256520-9d2bb2163cba8f54c0e58de02a99f31e.npy +04256520-4a747546b39003dcd59517820ada1bea.npy +04379243-7d8ed7685620a16db2c48fbe46b01575.npy +02808440-c6af9be0c0038798ee5eb4c41d8a7ecb.npy +03636649-a7f25e662466f59dfcb8d8c6d4df8143.npy +04379243-72c8fb162c90a716dc6d75c6559b82a2.npy +04460130-dd82af6c4dc9e26cd9bc2d75eb1cab87.npy +04379243-7f4a5479c612805bb04e388f56884ae1.npy +03691459-492eaa948ae2f795a6d5deb42d3af608.npy +02958343-9bc421a5b0bd481b4e76a17e357a8d36.npy +04530566-b6ec93c690df4cac711722c32e47b894.npy +03636649-d83fc71f3978130e335fe03ac3704320.npy +03691459-b6ec9f482f055259f2e5d34c7b677bc4.npy +03001627-55185010b0b6e42eb98f36033d4304b1.npy +04379243-91bf48934d3b52ea36658c6705d0c08.npy +03691459-164bf28ed57e29a6293982b5acb5446c.npy +02691156-8b65813c6ab0c972ca2bd098b9203af.npy +04530566-d2f5b582c65ee9567f79d93424b708f0.npy +04256520-2bbd5947aca68a81d329e53feaade57.npy +03046257-1c4cd3b790fddfbe2f87b9fc1ad90aa4.npy +03325088-56c35d8a53c2c5d9fb930e40572ccf2f.npy +02958343-99a7f916d137e69bf2cdad303f49c9f9.npy +04379243-e2dbb55cd453fc2ead852a56afc15951.npy +04379243-7d517ccbf0d2b16c50fa82c2f036109a.npy +02924116-18d6a93468a1d0dd41cefd10ce5d6cc0.npy +04379243-875758df9f03fab669a10a3a70c69e8f.npy +02933112-d4277bc8f1301983a77c359d9fe71e62.npy +04530566-8ff4c7162259b1d5cf816caaec167fbf.npy +03691459-e7588cbebdae5863629c8a4be6c1e509.npy +02958343-29ea7766414de256cb34360716066a25.npy +03642806-2cafa6107fff001f7a470f4d014a755f.npy +03001627-a10e8dc1cc9522b67a80d424f0f4074d.npy +02828884-53f19d1ab0828e3fcd3af3995946ed40.npy +03001627-c0f2673cb32574014e972edcee1ee23.npy +04379243-d9e3a8c4f093d66f3e474b0005d777b5.npy +02691156-dc7a703f94b3b17667c5e3041553656b.npy +04090263-fa9f56b25119ab802ca888e33c9ff27c.npy +03001627-9d472f3426868826c43cf68e273d1539.npy +04090263-a38da7d4126b4a4912a8e5e6e6618c8e.npy +02691156-8bde5a00c3caf9771d03b466c72ce41.npy +03001627-c7786437606ac263b04cb542e2c50eb4.npy +04530566-703e4a7096ac1aba8f7e96a8530f50cf.npy +03001627-2724c02bc7797bd1486150a9b7f2cf18.npy +02691156-3360b510b0408682bbf3143b1cb6076a.npy +04090263-1723dcee921fd152d43bb185feff0470.npy +03001627-a0436bbc1e00d9ce6aea2f18ee404fd5.npy +04530566-e92386352c19221ac99bbfcf5650bf52.npy +03001627-fde8c87a485a33b78fa2f6eb9fb1de7c.npy +02828884-cf3821cfe979f0214d84fc9b190bb79a.npy +04379243-d57bb12175463d188aeaff3bff7f4413.npy +02691156-35055f849da2cf0ec3fe7930fce05ded.npy +04379243-1cce1fd7a0184a48cbb8bac2032149c.npy +02958343-9909e197f7383a976d07c55cf995503e.npy +03691459-79e5aa259b3c148789df8842b5523a86.npy +03261776-17c9866b42ae1831df4cfe396cee719e.npy +03001627-bbf89164385610221587835cde687661.npy +02924116-5faa6ec58602029168fc806428a57830.npy +02958343-552233e882a65b6431f5c3d8b8dbfe3.npy +02992529-87aeb552057c3d1a65a7971ba2230c53.npy +02828884-d2d4d92195546a1ecac503d0f3cb1d7a.npy +04379243-1ae856def06f8ee36bec1b6707900b50.npy +03636649-9b34aba70145f08b3ba6f328e4cd62be.npy +03593526-dd815275fce18cdfd138a53ab0d038a5.npy +02958343-fb6c92a80dd9af59b528c0abff96f586.npy +02828884-3e16ff75bbe7ed27464e1d2ff524a75b.npy +02992529-3a6a3db4a0174fddd2789f496481c83e.npy +03001627-70cb8d70d961ca48b04cb542e2c50eb4.npy +03001627-4d7cb35d1d9f2434ccbcb819724fb563.npy +04256520-3cce581fbf55c31b8ccbec49bbc083f6.npy +03593526-5c589d9495c87d7da2fcca81c767066f.npy +02924116-3b5e31b2987f158e9f46749e28e16975.npy +04379243-62d2038ffb8b9df253041c49040be3d5.npy +04379243-711d439d6638b4c33efa790205f68f8.npy +04379243-bf15d331be699886a005442d4981d053.npy +04379243-de6f494dbebd91ede057b217c7790618.npy +03001627-e065edba45aee481490ad276cd2af3a4.npy +02958343-270b0846304e3d66bda733a39f84326d.npy +02747177-af1dc226f465990e81faebbdea6bd9be.npy +04256520-758895bf2fa5e4b5e68b9e5f5c3d0eca.npy +02992529-46261b630244bdda533775ea6714a372.npy +04256520-bc2c0cf666122cc68f5c37fe197319e1.npy +03636649-886ff4f5cd90c6ad39b3360f500ac52a.npy +02691156-1d5708929a4ae05842d1180c659735fe.npy +03636649-c2378f62797cbcb26a5e440d54e375dc.npy +03691459-f7023235e0282c797f357b05b0dcb89.npy +03325088-8cecc2d6db8756683321831d2245cf06.npy +02958343-100715345ee54d7ae38b52b4ee9d36a3.npy +02933112-21f3c0d4604587b4da5feafe6f1c8fc.npy +03001627-a128eda00983dd01fb7d9615be5ab4b0.npy +03636649-ec876529d01d4df490ad276cd2af3a4.npy +04530566-a89cda9712b67a97d1e97c10e2464c2d.npy +03001627-1157d8d6995da5c0290d57214c8512a4.npy +02958343-71b00ea32b1810ac373af83f3f2fe606.npy +03513137-d736c45c5b2397219092826e64279378.npy +03325088-b19d6c949c76e41c9be6726a83c38aad.npy +03001627-981adc1bb90e7cab666bebf1a1d4e946.npy +02691156-ee461612837ce39eedd03f781ec3ebcf.npy +02691156-75b151efa363c18d94b9c9a92aa36f8c.npy +02691156-e9bbeedf2681b8ad154c6bbaeb7d331f.npy +04256520-de82cd275086d50e41b160b9adc112fd.npy +03001627-c6cb59e7645dd14d661ff085a0f14b7.npy +04256520-854c9e951c2cf2e3492d9da2668ec34c.npy +04379243-578f935f182c5cb3bc5c4c571faa8806.npy +04090263-13ff0ba1e8d79a927f71da36e5c530dc.npy +03636649-2577723d02fd914eda113afcb6c5e140.npy +04379243-80f036ce585b1ef648ff063e62e02115.npy +03211117-28b6e44e37586fd797e8123bbbc761d8.npy +04379243-f907cab3a8373d56c3bd24f986301745.npy +03211117-9e087d56d1264f0bae8d825afe55a6fb.npy +02691156-5fe313e070d6fc4e2620819ddac40644.npy +03001627-f428a799c3185ee0c8687ff9b0b4e4ac.npy +03636649-30e5d9149ddfeef27357c8b8283e0cce.npy +03046257-c084297af1373b36b4cd1bd556007aed.npy +03636649-79af7fbe587692a583768a4ac1607d73.npy +02828884-6233b6cce0da0615d4cfbd0aef5a371.npy +04256520-1441ae85e34e1564ad33b69f9597739.npy +02828884-9d47deb11cac29f089345002d2594e4c.npy +04379243-67584a2261e175ccfbed972ae4fd63af.npy +02747177-12c4048e0d2f26a763b2acb037dfbcde.npy +02958343-3ed07ff8b46b2bdcb1bb46d2556ba67d.npy +03337140-2bbdcfcea1a8c5f3ce5d6e9371bb5c33.npy +03636649-ad7dbc3a78d37b4c8616812464c86290.npy +02691156-6a75658fb8242b9c590874dcd9dc8481.npy +04401088-16549bfa3cd0f53d2110cfd44d2335d.npy +02924116-83928dc21ca6588f67aa983983f9bf36.npy +02691156-b1835836e541766882568aa50e4e5dba.npy +02933112-39b50a129ff530efb4ba4a53b97265b.npy +03001627-f3e0042ea11660d0ff2c92c2a4f65876.npy +03513137-6ff1a99371f10144e5e6ac3ef6bff73.npy +03001627-b7403875e1d7adea331fc18393f04d2a.npy +04379243-e6d8569c0957e7453002761e7a3ba3bd.npy +02691156-d22521d217d89f8d5b1bb801ea1e2db7.npy +04530566-e11279543f1e3ea015ebc00dd3588bef.npy +03001627-5456ffcbb7bd6b3e4460d09678055ab5.npy +03790512-9bc8441b3b70b7014a4c9ebcdcc46c40.npy +02808440-e23251d421d5f7d6b362845c6edb57fc.npy +03001627-5df875e6f0cc0e37f838a2212356e267.npy +03001627-6dccf79814289bca5a15b6547f08c8fe.npy +03211117-61645237bf8de4df77525a753bdd4f00.npy +02958343-8285dfa786cf25b2c29fde65e51f52cb.npy +03001627-a33fcf84726cd862d866e3aa112e4663.npy +02828884-96ab21db41e4da2d848b05feebb5193c.npy +03046257-27c132708bab56bd32320778c4ce7485.npy +04090263-87e23cb3540dfc59c89145ad6791be51.npy +03790512-f521fe88cdfe3a291d87d0fbeec0e0ff.npy +04379243-97718e2651d22b3a74740f837351e7eb.npy +02808440-52f74ddc2d35e8e900a91cbf836390b.npy +04379243-d4acb5110512f5c38369c37b40e82efa.npy +03001627-3de3774ea9a05f51585ed17f54616d23.npy +03691459-2f1446816ac58936361167c63c6bbe5d.npy +04530566-d9ca42c1199196a8f8785957fc1b208.npy +03938244-2ec52ad731536d294b3c42e318f3affc.npy +03593526-d2b8e090125199c49edbf2f02d126923.npy +04090263-e8df7ab8879ae3f895bcf48dcf4517b8.npy +03001627-c67b7b62e529295dfc30525e763ef5eb.npy +03207941-fee1215825c04d1d9c12d6260da9ac2b.npy +04379243-8d900764c04127df4b3c42e318f3affc.npy +04379243-294d38860c334c4954a61dbdbc1ac262.npy +04379243-a59f0a9956137c0735962325b2299f4c.npy +02942699-317a7ea24e661ce3bfc146552c7aa5d2.npy +03046257-26150fdcce285cf49fb73a07dc7d819.npy +03001627-fb5ba735ef95fe417ca68e217a316e15.npy +04401088-3f95b3ecbe55c83e9c3a7294039d408.npy +04530566-f69f4b2abc707f667610cb1c03c9c3ea.npy +02992529-a7056690a5bf34d24ffbcf8cf904ca12.npy +03001627-85be4b6c37bd1e801d45bcf0f68506fa.npy +03467517-29a402726ae7c4ebd440718bd2c795cf.npy +03467517-b15aa0998b1453ba830536956f5eb8d1.npy +02801938-e9b6ef7375650b54ad2fb8cd0793fa9a.npy +03325088-9b65733ed1e66f1dcf87dab359f38253.npy +03001627-e505ab84808920d06031c9bf940ea7ea.npy +02992529-2dccc7cfff6f9a28aca331f9e5d9fa9.npy +04379243-bab2fefad03208b0935d906e24c18439.npy +04530566-6a7ce5d7027678c299429033f40f0f8b.npy +04530566-7ba19c8354c66edbb74e6fa236ab84b4.npy +04090263-1813aaa9a82a98789c82b3f5ddca589c.npy +03624134-792f252dcb06f042dd56c1edf3f6e336.npy +03001627-5e5121cc58c4fea78ce66f12ba927a2b.npy +02933112-4e2d3dee0f6c8e18754e8957cd76ff02.npy +02808440-dd3667be79294afe3321831d2245cf06.npy +04256520-c63e1750f61af4bc4be7464481982099.npy +03325088-574a71125f559fbeb362845c6edb57fc.npy +03593526-c59aa436f265a75b8f9c4ecc067067e9.npy +04468005-b5e64ec8070fdd8d299a59bfd8e7d284.npy +04379243-4f79ef44a08bc2ff4a60c1a189046dd1.npy +04379243-46165d8076918c62f51f77a6d7299806.npy +02958343-787ba4e958f1bbe88ec77d0d80815cf8.npy +03691459-f682ee3b4f4dc3fcce029fab54b6cfbd.npy +04379243-48273349239e81b64b3c42e318f3affc.npy +03211117-9536f9fd4795dc2d70ef2132a4b991a.npy +02808440-934bc8fa879c3f0244221bef0fa3c36b.npy +02691156-eac05be6e7f3bfa99a6e43b878d5b335.npy +02958343-22428fd70b02b83ffc567bb1bd08c1ae.npy +04256520-ea581514b73f4707febad4f49b26ec52.npy +04379243-2c671dc7902c140d3b52a6690de3e81d.npy +04530566-2d189012a5b5a64aeb5178df7a9bd7f4.npy +03001627-5bd08666f29e946c988a5637d6d8f36a.npy +02924116-4ead9b28515b97fdc0e2e9e9ade4d03b.npy +03046257-50be9eafe3abc283ecb14096838a20c5.npy +03337140-55054f56f1afd25ace5d6e9371bb5c33.npy +03001627-3b513237d90a4cd1576d8983ea1341c3.npy +03761084-a65e74617ff51c661b1fe5e2144bf114.npy +04379243-b9328275771909fe920de219c00d1c3b.npy +03325088-4a03d0bf342959e7c36fb70296e45483.npy +04379243-6e446bb5adf14b0b6121178eafd002fd.npy +02691156-1e40d41905a9be766ed8c57a1980bb26.npy +04530566-6271c832e8f629b73c83f6e156ad107a.npy +02992529-4b96f974453ef59ea2c7c5886f4bbc93.npy +04554684-9b1b90b033d6c6a42bf3161ae4fda942.npy +03642806-82edd31783edc77018a5de3a5f9a5881.npy +02958343-82d37fceb984256bf200a72c9245aee7.npy +03636649-7e5dc9256f9600d9fcb8d8c6d4df8143.npy +04401088-91240b6e6ca6136dd25ac584f0a4b696.npy +04530566-bcf9572e3f21a9505c0be177939e290.npy +03691459-85e8d20d51ce13cc7fbc060fd555478.npy +03636649-aad5c7256a7c6ba92a4d67a8ec314d2a.npy +03001627-787a4db5b3452fc357a847db7547c1f3.npy +02933112-30ad23a8f6a3a4479725f8348364f5a8.npy +03001627-4e438ade91769be8c8687ff9b0b4e4ac.npy +02958343-1be81460e620aea65cde8c99e4b182f9.npy +04379243-ba6e6f8263e961c243f6b77085610df6.npy +04256520-ede1eb2acb5ba12e7282872e507d5fff.npy +03001627-afaa508214b7515a161d68600952d375.npy +02958343-45e69263902d77304dde7b6e74a2cede.npy +02933112-586cd9ce3d22685f2280e8623aad43f4.npy +03636649-9000cdad54cd0285e6597d391ab6fcc1.npy +02958343-165aec174bb93968a114c8c036e29a08.npy +03691459-a3f012045e4b62b2789df5bd89bb3ea.npy +03691459-44cdc1204fa555be2633ff66beb9cf31.npy +03001627-e5cb5334f18c13c15a7f6c1314f7ac2.npy +03001627-524e4a1041ae53154b3c42e318f3affc.npy +03691459-bf83a8cfb72a6208432eb33b78f3e334.npy +02933112-8a7f0dd58fbf14a4c59350d819542ec7.npy +02992529-a2953e7ff6dcd4465af22172f09754fd.npy +04379243-6f6d4abfb84b9eb527c3aad6317cf3db.npy +04379243-c31155f4beed339e855931d119219022.npy +03001627-c53fa6829ec9a947d13b7d13ee32497.npy +04379243-be9a0901f9ac115d71b883b95236fc2b.npy +03001627-af0831d39fd8f794492d9da2668ec34c.npy +03642806-71907a4a567dce3bb0de1e7a6809fd90.npy +04379243-c393265168bcc56cf3ced7613d1c130b.npy +04256520-b0aab89e3318b09724a8d949d07d1308.npy +03001627-866552d994de3a252ea98d69e91ba870.npy +02691156-3a82056ea319a442f64801ad2940cdd5.npy +04379243-553213ef2a7657fa9ccce4c6d5bb195f.npy +02691156-3e9ff76da8ca4885d0635288642e63e.npy +04401088-c4dcbb047d219cfeb4018979c856c916.npy +03467517-fffc2fc5a90254de9e317a6cc797b629.npy +02871439-495deb98f5096b3be3241548166bb146.npy +04090263-354d382fe282ff567ce76669ca87ee34.npy +03467517-3a50cba9f6239bd037d3e9143e987d83.npy +04330267-50bfe9e46388341c3f175c5b5510099b.npy +03001627-3f12570d87da2383492664434c74d812.npy +03636649-cec552e824883875490ad276cd2af3a4.npy +03211117-2772ad703e5d4b73cf6f327fca156fb.npy +04330267-d8e0d47be86833ffe8cd55fcf3e9137c.npy +03211117-817aa8a9ac7f57f9dd936ff7b4023f05.npy +02808440-d498df3b7c7f53c6f74d83b4be105200.npy +04090263-32d8874aadbc73daa50ef3fc203c6ba0.npy +03710193-7ec679d4c550daf149400676d2d9ca64.npy +03691459-464da0c0df4ed3c0dfdc04b8b8434e84.npy +04379243-e65066d6b0b83719c3bd24f986301745.npy +02747177-b838c5bc5241a44bf2f2371022475a36.npy +04530566-87f68a979aece6f71f29de30ec1bf6a3.npy +02992529-19b1c1a790c6824578bfad8b5ed8c4ef.npy +02828884-dbacfce828f0598ad534c2812395a1c1.npy +04379243-4cf6b0e3320f0740521fac473c90dd4a.npy +04379243-1cb2fe52097b5304217ffa735084910f.npy +02828884-3b688abcaf09a495c62ae1031b767cea.npy +02691156-95bc1c56fd50037ce3f3aec01b086ba.npy +03001627-79780c35666f045d7ff7b6423ebfebc7.npy +04530566-80d9d9fc9c6138c4800a0120f3e757a2.npy +04530566-3a71bdf6dd3e42bd6d08077e9257af3.npy +03001627-cc2930e7ceb24691febad4f49b26ec52.npy +02808440-8c181fc92fbba230a341228b21d337a9.npy +03636649-ee8543345535674822aa4f44d9f697ed.npy +02808440-2f65f22224a48d26ead253ec715c9744.npy +02747177-9fe4d78e7d4085c2f1b010366bb60ce8.npy +04379243-313957e318bb7849febad4f49b26ec52.npy +04401088-678ed514423f067fba55419d0f0e294.npy +04090263-7a79d63c2cf6df519f605c8c86eb1ec2.npy +04379243-9228f548332eacc51287e03b5b76fc86.npy +03211117-c514d99259ffe1abe441f5bb6f88ca61.npy +02691156-a9bbba73d3fb7688b6b87e72ead132ed.npy +03001627-98f923c006fdd918e6d206b2ed87676.npy +02958343-dd84236f0ef27765a134736201a79843.npy +03211117-877cadd597775369ec059109909662d2.npy +03467517-bb4a5712da8f63330d758421dd01f45.npy +04256520-6ed0a767dc4c570e4cb7bc8e4c7cdd90.npy +04379243-5ba371858d595d4ef645e44148cef56.npy +04379243-9e6aba6596ffbf95a9bdc22a1e02e82.npy +02747177-1c3cf618a6790f1021c6005997c63924.npy +03001627-25d40c79ac57891cfebad4f49b26ec52.npy +04379243-2182028f013e7eb530bbd4cddd04c77b.npy +03928116-6d52a20b2a723fda16a0adac6af4232a.npy +03513137-7721ee80bfa4cbc583ce6bc80d855733.npy +03636649-52284fc0b5822495ce140b3448f2e640.npy +04256520-7a379a92b40f0efb3920d120afd003e0.npy +04379243-4b9ccbb4884f12376a5e440d54e375dc.npy +03211117-22e8d055ae154efbd12a1bc232f6622c.npy +02691156-bd46cedafa0568b070d98a97e17b4da3.npy +02958343-7a2cb890271a361799b92ac6181b3e5e.npy +03001627-c3bc47657b691c51e6fe3612af521500.npy +03691459-90cf7907801560fd27766fcc9fe2f132.npy +03642806-f28fe2f836cb0dfaa8f4918d18e28074.npy +03046257-2dc32ccf8ad7e74faa45d7cfa7825fb7.npy +04530566-acc71731a16d074f5a11da1e572e8f01.npy +03790512-c38b3d9be97383c2ebe67d9b32c3ddf8.npy +03593526-9cabda39008f86316d075d8d4fe1141.npy +03001627-f09af71bebd4bea8a2651abaf391628e.npy +04090263-d1044b04ea67ab2d3e10bd7b040a4312.npy +03636649-3aec7c839e247954a38859fd71bee28c.npy +04379243-8e3a98ea6d37d14c59a230640e61666e.npy +04379243-f10473382b623504d79b19c7c4f0e293.npy +02992529-f9023b680f219f7c363111a4e20c10d0.npy +04099429-66e0f9388b2eb6bedb7e97e28dbb721.npy +03467517-57c71d56ec72bd8d63e148e250c0340d.npy +02958343-c34f37b1bdd6fd62247035fb6ff31a15.npy +03325088-2007abffa44d274d25074a00e97604c0.npy +03991062-fe9ad9b2af48f5c28ddf4bbff6a47d4a.npy +04379243-4333e8cd288f47c4e0c9d6065dbbbe16.npy +02828884-bc6914d649379349ab3be97afdba4e8d.npy +02828884-d71d9473e08c108d2f210d96281fe860.npy +03001627-60647c98b5fc96b13002761e7a3ba3bd.npy +03325088-e8a23ca5394733a0b362845c6edb57fc.npy +02933112-1f4ccbdbd0162e9be3f7a74e12a274ef.npy +03991062-657913cf3b4a83a2557ee26019a883fc.npy +03001627-32b56fa66c73c450a86b76551c6a3b2b.npy +02958343-e5236427b42606f4cac26de9a01eefad.npy +04379243-81db02f2b3686761f51f77a6d7299806.npy +03636649-684b06c007aa83873c2e0b170f2ad8bc.npy +02691156-37cbf91baa58d6577dc01d89d8a05b74.npy +03211117-8a87846412b40900ab610b0c94236463.npy +03797390-43e1cabc5dd2fa91fffc97a61124b1a9.npy +03001627-9a91a491a9e74ab132c074e5313866f2.npy +04379243-23a4fc50f123d8801ec48bc3c478566d.npy +04379243-878414eb6e86494d9a8ef44e1d2c5b75.npy +03790512-582e995c76ba36a44f5a72a02a218ed6.npy +04379243-c5230678204a1bb8dcfcef693e7ec696.npy +02808440-a67047070d8693d2c2f0673fe60ad9d3.npy +02958343-96905400f6122662473f10e6caaeca56.npy +04530566-bf4386d3e823a09e57a4e26112104eae.npy +04004475-36391c79c1025c3867964ba700cd97f5.npy +04256520-dc89ccf0f13d42a83abfc4d0a5688916.npy +02691156-ca45f5d7efba158ca35e371359a547.npy +04225987-f5d7698b5a57d61226e0640b67de606.npy +03001627-2745c7d9f2027d605a9f35e635b7e48b.npy +02876657-405ee743f0d8601551238db1f507a8c7.npy +03001627-99d4e65625b32a1d151f08387c3363cb.npy +02828884-66304c61af32ca5aad5067eac75a07f7.npy +02933112-c129e7434b33f3cf1b17743c18fb63dc.npy +04379243-e5567158ce772a43fcf7d910cd22d7c2.npy +04256520-b048119e0f0828d5758f6def7204bd6b.npy +03001627-5c6c95a9a99d452e1d2651c636d3967d.npy +04530566-34c099dc4cbcb0ee7c304709a8c6cd35.npy +02691156-3391c664149308cb4f95630cc18536e0.npy +03991062-8306708f6aed84dee47222ca7f3cc9f6.npy +04090263-963506132e08855de5cf42144086d22a.npy +03642806-39e80a6570002a431181170a86d04637.npy +03636649-85a73c46a97649fa6d0c88a73d7cb14d.npy +03691459-6e542a3dfae28b1cf852111eed0a5c85.npy +04379243-426a9fb4da504a96db3e66b0a511465e.npy +02691156-1d7eb22189100710ca8607f540cc62ba.npy +04256520-9aa3c3c03d111640490ad276cd2af3a4.npy +03001627-73d534b85a1416eefba3e6a55f280fd.npy +02828884-d074449720d6b421e44204a7bf1b3ed6.npy +02924116-59e0e8d9a082548a103ab07d448b13c7.npy +04379243-4cbfd25faaa706daea0e09825584e0d.npy +04379243-234ca609205d8d80a1e28099cf3c0efc.npy +04330267-ffd3126859fdd15ccf0517eac2f2d331.npy +04090263-6f739c0ca5834e825dc7ef8b006fcb7e.npy +04099429-bb07f8aea99dd2cd533e0927d26599e2.npy +04530566-a02fb3d1e8e9d34ffdd29529d1a15514.npy +04468005-e0486cf313d2ad90eff204cce5c18b06.npy +03636649-6b0664c9fb1a4fd1fcb8d8c6d4df8143.npy +03691459-5eb44c2aa29844391f9f3ce366e030fb.npy +04379243-791987a0e943f009b5872b4cd3f92676.npy +02691156-40b916f7c41ad451494ac047ec5b052e.npy +03001627-2d74dcc00e449a5462a510b8f97c658e.npy +04379243-3fc1002b5a538aee50c9fe3e733d8740.npy +02958343-4dd97a6805c2797d18d95feceda870ca.npy +03211117-ccff142a647e673dc24648b5216c0d5.npy +02933112-59263293983a99d3de650492e45fb14f.npy +02828884-9a58d783e013b051d87d55641461d6af.npy +04379243-120f8e2ef276fc6b9a45b69dede1154b.npy +03636649-545672cd928e85e7d706ecb3379aa341.npy +04401088-283e3f79ecc4b74d1e4e60ebd003a0c9.npy +03624134-654ebe35ec5c1cc676b32b03a2729ae2.npy +02691156-cf2bbaaebcadfb282933085759cb1f25.npy +03593526-b22a31918c21981a275d003e423c59ba.npy +02933112-1d93291de09fa5c876e9713f57a5fcb6.npy +03001627-2bf05f8a84f0a6f33002761e7a3ba3bd.npy +04379243-f298b3663ae591a2276bf4bce35c96fc.npy +03001627-566e4f05071e86bbf3c9c1464e55d580.npy +03001627-741fa23c22d97ea81bd5f87ae5f3f83.npy +03001627-8e76d0002b592ef91663a74ccd2338.npy +03001627-bbdaf1503b9e2219df6cfab91d65bb91.npy +03691459-c2598d72d508a33060ee9c7e2ec5f91a.npy +04379243-38c184010d3dbed1d0c05eb40b42c942.npy +03001627-2b110b833111b38c420adf24e49f74c8.npy +02958343-8b722405131e569db927782fc69a1fbb.npy +03001627-6a28919186eb55ecf69d0cf4fdc89b12.npy +04379243-fe2c951f711bf1971a12d98ab62a7b8e.npy +04256520-cf81e26374530f8fc08abcaf67cf0417.npy +04090263-262990856b80d83d4382b46c76d2521d.npy +02828884-b711e64c92fc594c18e830a47a552b39.npy +02747177-d62fb12c728b273b1aae33b6f700ecdc.npy +02871439-abe8a3e6a25fb925cdc110c18589b6ec.npy +03001627-17aeeadccf0e560e274b862d3a151946.npy +03001627-fb9f11f128e006d2498725b9a1405ebb.npy +02933112-a3407d2fdef7386c278d386bfa54545.npy +02691156-1e2de00cf19a0a33554ccf8c30febe7.npy +03636649-2a3267758a3caeb7cf353869450feb9a.npy +02828884-7a5ecec36bcb9eb24c080f2371a3ed2.npy +02691156-22795c32b54719dffaa7ec7d870d2e09.npy +03636649-96b71e055f40cfc21735ea0e092a805a.npy +03211117-d9c951f1008183e69755c35f0639c9f5.npy +03593526-72b25fa022376928e4feabc80d16b5e4.npy +02992529-93cc80bca9e1812a64a09de5345a6fef.npy +02828884-72b6c4e1d8b93b21c2bf98e7124e149.npy +03001627-8169b36ef1ae45ec19fb4103277a6b93.npy +02691156-62ca091091053afd9a6e43b878d5b335.npy +04090263-73695c25b3ec4ae372333100c25acfb3.npy +04379243-af3ad492135860eed8fe1b8aaa4afeb2.npy +02808440-85663f3daba8a0d51c17aef130ed6213.npy +04090263-27df401605241825fb5c1b0f759e2bc1.npy +04379243-fdb61d6d639b1f51851f4ba6aaedaaa8.npy +03001627-c8bd3d33ff8cd4abf189bc4b6aa309bf.npy +04256520-4a01490054b15c90ea5adc188e5a2fc0.npy +02828884-a58cb33e8aa8142af155d75bbf62b80.npy +02691156-d28a3cd771b2bf1e71d03b466c72ce41.npy +03636649-5f4bc8ad5a1a0dd4cccbece4754c7cf.npy +03636649-5c324a7cdf6195a5303c85804d402599.npy +02958343-eb471949c658f39eca736b1d30b87e32.npy +03691459-4c722ef308bd6362d747b49524a1246e.npy +03636649-d16bb6b2f26084556acbef8d3bef8f28.npy +02691156-9cb21d68582e1c4ec1ccec171a275967.npy +03991062-e9f6c53454e068cb2ff65fa033da81db.npy +04530566-159d09a7bd7d09a59f1deb04fb8ae481.npy +03001627-7f70642500b9a3ce45881d7eab1353ba.npy +03001627-884a239f3dc6a91cad484915511ccff6.npy +04090263-2416892a9f7688b01638241f3ad71c10.npy +04256520-c37832a4b22cc13e6654a522b30cb96.npy +03337140-501d1a430865e6d7492d9da2668ec34c.npy +02828884-55ca4cb17b26110d3b160521ef1e85fa.npy +03001627-19ff1d5665c1a68677b8fc2abf845259.npy +04090263-db2916f1dbff9d9232967a44e902e4c2.npy +04090263-ea212437514740bb8b700cf351204203.npy +03636649-e9df996dd33c009bfcb8d8c6d4df8143.npy +02958343-cc7f51159a1a12fea7fd25564c2e888e.npy +04256520-324d7108aea113f5b60d98504d0756f4.npy +03467517-44c05e219618a6395b3335548350bdee.npy +03593526-dddd30f41cd6543e25e65d4b5f3b6456.npy +02958343-2a771048127cf0b85dca6305fb9f97ca.npy +02958343-3975b2350688e38c65552c4ac8607d25.npy +04530566-b89d4bfad9c9b64d476a01ad767951be.npy +04090263-8adb587e61fa424ad199d75ecc2a48b.npy +02958343-fe1ec9b9ff75e947d56a18f240de5e54.npy +04530566-5c313324778eb79ad976d6ec0305833a.npy +02691156-166d333d38897d1513d521050081b441.npy +02933112-9d59bf323b297b327885a2b9445961bb.npy +02691156-35bb733b13c48bbc839ab492b6143b9d.npy +03467517-9768ded42e36d84363e148e250c0340d.npy +04468005-dbe69c9cfc9d5ffa9e7fa80af2c89cf2.npy +04530566-5fd1b1b185638c49c13c29cdfe828247.npy +03001627-1ab42ccff0f8235d979516e720d607b8.npy +04379243-a18c4bd95d90f37091829b477862aff6.npy +02933112-8fa86c85b7985962598f1102685df4cd.npy +04090263-680162d9443e8a408e62f59b444d701a.npy +02933112-48555a476cfcd222c59350d819542ec7.npy +04401088-25e03c305f41c5dd226bc3b9ce9ff2a1.npy +03001627-37a05e83e529a1e044f23566597ec464.npy +02828884-f197553928fccdd2b12aa6a0f050b3.npy +04379243-5e14471dd0ac3e47765ee729adbdf968.npy +04256520-c3664a4a708086a448b7e15d7b3646df.npy +04379243-d6874aa362830375ef8af3aeeb9bcffa.npy +03636649-63da6d6aff4d14789bc41a35200a3af1.npy +04256520-761b8ef3b41a84b82f84cb7932f866fd.npy +03001627-969730a19872b564fdb60f509d2616e0.npy +03325088-903c4ce576afab5e979c556124bee033.npy +02924116-53772463c870f1a1d76caed74eca6172.npy +04530566-fa3ed7b176b0794d5b4b8b1a2a708ac6.npy +02828884-4a9a7e5b88cc4b79b985467c63dd34d8.npy +02747177-def815f84e0cc9cfcb2a965e75be701c.npy +04530566-459decbc3c6bb150ba2abf2ecc57eeda.npy +03691459-b3a4bcdee00ab993ebc29484102f14e3.npy +03001627-ba33781b222ca9346e23a4fabd87b2c.npy +02924116-fb5b5a60d254807e6af3f354644c5a9b.npy +03593526-133dc38c1316d9515dc3653f8341633a.npy +04256520-96ce3abe2e2d4bd3ff24fe90298ffa71.npy +04256520-abc6cff85c8282cf6fe2eb61cd6e74e5.npy +04379243-4391d4d7984a245be0182fa3e963fc11.npy +04379243-21925c161a6aa5bf6d65f86bdc92afdc.npy +04530566-189668ffa80d37877622984b5941cfb8.npy +02808440-12e0842f9f1c8cf02c3aeda648e0cc4f.npy +03691459-26778511109e9e76d936ebf2a7172ccb.npy +02924116-bbe7d3e157ff918541cefd10ce5d6cc0.npy +04379243-52837fa3e281763aed88854fc3e3ce05.npy +04090263-a5bfb8e604bb2d8173db096a9cda49d4.npy +02933112-31ab6947975f5747c62ff677c806df30.npy +04256520-46e6485e5bea085a2b450c5933dcfcb6.npy +03991062-d1b50f008ab9e3d7da7a4e0a62ae3e2e.npy +04379243-d5e79960180078237062f2d72cde5c95.npy +02958343-3e2c3cb4f4c65b9cde9d4070fcdfa604.npy +02828884-27539b0c42068420cb2a965e75be701c.npy +02828884-ca0a5a3a4c5e255b20768660cf080d12.npy +02691156-86b11ae736659136ca8607f540cc62ba.npy +02958343-ff5ad56515bc0167500fb89d8b5ec70a.npy +04379243-fb89493e6389039527d4fc401a34f3de.npy +02958343-60d8d7776789b4b1fe11eeaa72c8aa36.npy +04401088-20346d307d39aa7eb6a804c25e3218a.npy +04379243-5bbc7d606ddd5d17e492aefec5dc15c7.npy +02828884-2c47d12adb8437ed601104cd2d998272.npy +04090263-8c2748ffe88d346ab9915b62040615dd.npy +04379243-60c580efa09c28a91ceb062da003617b.npy +04379243-3ffeeae04bdd3b51c3bd24f986301745.npy +02958343-2d817a6f23d35494d991a658ca89186.npy +04379243-99224f3ab2705aa9985ef0bf52b97bf5.npy +02958343-588c2d2567fd900aefe5f291bc2f5fd0.npy +04379243-e20f1fff2b84f8ea71ba8e8bdf40d1ea.npy +04379243-7efc699b5fc94757f93239519b75aa98.npy +02876657-e656d6586d481f41eb69804478f9c547.npy +03211117-b097e8761c3cafe5a35a7666f0cfa5bb.npy +04225987-113783f51974426b92ba7d308c045fd8.npy +03467517-6f9d1467eb39f8abfae47f572c17b9cb.npy +04256520-a181227b44ccf1ce6199ff1c1ae229f3.npy +03790512-6ebb8ff387bc2510c17fa08d127e11f7.npy +04379243-e339e8b8f1bd5eb9626d7e3d07da8352.npy +03991062-d7e47dbd3b50a3688cbd3996b1c0adf8.npy +02992529-d0b5b899929975558ee99126b119afe5.npy +03001627-d52e7e39bed3ed954f62c7a282978009.npy +02933112-247ef69bd111e8f026cd8d83e7ef5b6d.npy +03001627-df2b3ab36704f9e944ebbc705ad8c07.npy +02958343-23e8adb3bf1961f85332d3b92481b499.npy +02691156-9facc516914dcfee6c32d954b1c7f41e.npy +03636649-7a2362fbddbee9a4d197f67767b32741.npy +04090263-a2015aca6b4268c4dfe6ef2726050c2c.npy +02992529-e483787b7f9c606042f892024869e751.npy +03001627-cf20398c0c3e0359fa2037e5e59ff423.npy +02691156-98011d15300361e54f0e6f5b218145e.npy +04379243-e6cd72665faf3180f2cf6a9bef44d625.npy +03337140-9f17166a3193a8284c3aee8e9d3a6ffa.npy +02808440-b188074441f74c6e1d17c7bdc785739b.npy +03046257-98e52f275290d28bdb54f0ac1f9f81ac.npy +03948459-7e90dc936dc1a725fef144202cb2b935.npy +04256520-250f7b0081d2be215cd6dcd866c8e6a9.npy +02691156-c68efb547224f1dbed4212b3ec7c4371.npy +03761084-2352e8aa50465297df3a1b0d597ce76e.npy +04530566-6974280e14023bd6bf984c00fef39915.npy +03001627-4e37b83cc4f762a5f51f77a6d7299806.npy +03001627-1f83e49ecdf209ddd7f81f50826c13f0.npy +03001627-e5d6c3d62f96e28db3d655d5fe021844.npy +02828884-702cebffa33a19f019f079d1b712f46f.npy +02828884-e7bb6ef568db1c986dfe473551340375.npy +04379243-bc644d8f492e3c25febad4f49b26ec52.npy +04379243-ea5f45fc61e1e26bf994e2a430ba61bf.npy +04379243-6fb0076db4a74b73cde18cb90697712d.npy +03001627-9c9f007599018973f51fa0238791f5dc.npy +03691459-afcd98e6a91b3d16569e2e0d2caa039.npy +04225987-94fc692e0518c0b0537d393009a79347.npy +02958343-1f604bfb8fb95171ac94768c3754c895.npy +02691156-9d230551c65af968b207f792ce9b3f25.npy +04256520-d1a40b075d8aaf62e7c7920f6a65a54d.npy +02958343-e2bdf01abc79a8d054b49557f8ea8b42.npy +02880940-c6be3b333b1f7ec9d42a2a5a47e9ed5.npy +03636649-a0a87d63af355b45615810b8eabca5b3.npy +02924116-6f2a91e27189d62f8bdce51dfacd37e8.npy +04379243-30b176f8b5e7e04ceed0bb714b97ca82.npy +02958343-49997c6f094c0f5e785c95dc3e37946.npy +03046257-3ceaeac7f8a243babd4bf7024dfa167d.npy +04379243-e588e603f5d0e366490ad276cd2af3a4.npy +03797390-b7841572364fd9ce1249ffc39a0c3c0b.npy +04379243-72ac0fd17bbe76375af983a27c524ad0.npy +03001627-313ba5c62a7e746d2974cfd5336a9b09.npy +03001627-1459c329e2123d4fe5b03ab845ae95c.npy +03636649-d0018775e9f2d109fcb8d8c6d4df8143.npy +02992529-43f7d0cb3f0ace029bc144914804a8be.npy +03337140-484a99e5ec7ba9f4b2029d92310f4aeb.npy +04379243-a6b54c79a942cad5a6589c01f678d8ea.npy +03001627-2df8d2af1bc4b9972056b4bd5d870b47.npy +04379243-689fce16d1f9099b9aebadb76803631.npy +02880940-2ffe06ee50ec1420adbe0813683fcfd0.npy +02691156-e0bb0ddf67462f4a8b686f76be476fe0.npy +02691156-7c4e1ab21e8d6549a46ec065c01b381.npy +04379243-e18b448f7e5f6ecc1baf720a45fc5c38.npy +04256520-c529a567cf7e69e2c16bd6fd1b8c7eae.npy +02933112-5556112e5f36cf2755f46d55537192b6.npy +04004475-75dafc4c55f370dd85cac25b72167160.npy +03991062-f6bcfc4694d8841596716aabcb2fff20.npy +04379243-785c03a00ad37ffb8b424343280aeccb.npy +02691156-96430e8f2174428ecbc790a63192d2ab.npy +04256520-c41b7b7d81b7ea5c60a641d065bc7a27.npy +03001627-c447f8e63d691e6f44d8225a445f54eb.npy +02691156-fd41d04f1aabbaea3fddedb0bf24c68a.npy +04379243-b97cbaff986d5db4490ad276cd2af3a4.npy +02958343-354c1c380911fd2f4fa6b747e2cb679.npy +04256520-ab347f12652bda8eab7f9d2da6fc61cf.npy +02747177-cf158e768a6c9c8a17cab8b41d766398.npy +03001627-72da95dd6a486a4d4056b9c3d62d1efd.npy +03046257-e0276227890674bae7169d15a0f0c88c.npy +03325088-1fbbe439f321bc2fb362845c6edb57fc.npy +02958343-d443e86ae023ceeb16abce8cb03e7794.npy +03636649-9936875de81346fafcb8d8c6d4df8143.npy +02691156-dd949574a91719eb7ab25516d117381a.npy +04256520-d6176ad267c3ef92f51f77a6d7299806.npy +04090263-fbee616945eba3a3dde107ed8a50fb4a.npy +03691459-12e055813ed50b7b85d581c11aa2371c.npy +04256520-16f90b5e8d9a36fe35dda488a4bbb1e1.npy +02818832-fa0e6c923694daab5fc6df6674be3b9c.npy +04401088-ff1e484e02e001bdf8a0d9b8943b4050.npy +04530566-67b312f1ecd5e4a9810b5070d24f8934.npy +02808440-babd4a4655d271b8ccd0340812259a39.npy +04090263-7bfdd659a04c412efa9286f039319ff7.npy +03790512-e3de3a51ebcc57f2635b931be375e37.npy +03001627-39b1cdf79b58062dfff16555386d173d.npy +04256520-f36535e1853b9aa5fbb258508605d4da.npy +04379243-535b4f96f57a03b2bea4b6e7618432.npy +02958343-ccac541c0db2044736815730d7fe4119.npy +03797390-bea77759a3e5f9037ae0031c221d81a4.npy +03001627-e89c76bae2ce47bcf4b6538438a0b930.npy +02958343-e3d7833469729b2024da76692f3228e0.npy +04256520-e817922063c3b24ca296c91af58589c8.npy +02992529-e1a4ea72b1f98e92d265c94f4d41d924.npy +02691156-ee30cf94a209a45b91d43bb96e1bb0b1.npy +02691156-6df2cf3685456b4c2e78e1154b9a2647.npy +03691459-bb304ec80f4ba31f8a0181490cb73cbc.npy +03046257-e8d35dc16f04ec9b70012411145e4fe2.npy +02958343-d4cec810b46292ff1f759e96682e340e.npy +02958343-1ebb7511feac4d62381a9e1cee6d0b00.npy +04090263-a8b352220fa53a06a0834a5219dec81f.npy +04256520-e9d6a366a92a61d979c851829c339535.npy +02691156-89a6407ce86efaeee1211756a8e887aa.npy +02691156-34d467fc26232f53f36024ed2c0874a7.npy +03691459-d5c3db96ef6559cbd867c39c06b7c506.npy +04090263-69cc7f3dcec397cd3215e5c5313f5f42.npy +04379243-ea5f31892496ab5457c6852b34adaf61.npy +03636649-e613b3c2006c457ea35a7666f0cfa5bb.npy +03467517-7ee2e600f132bb6f93f0194265a9746c.npy +04379243-26d22dde8b0bf6a345891653421dc140.npy +04530566-10fe40ebace4de15f457958925a36a51.npy +03513137-587ff99119fe5c0efac6099f3d4830fe.npy +02958343-1bb6b1ff46096f592dfac2620a0cf07b.npy +03593526-8c8f6d2b7b2d8dfb60cbb0bb881f838f.npy +02876657-be102516d65bcf23ff59f7e635b49cca.npy +03337140-1201cc45cd7348c94c3aee8e9d3a6ffa.npy +04530566-92e4ae4dfff684832dbef90d406185fa.npy +03624134-faa118fc5de302338ba8cbbd590b1b6b.npy +04256520-9e014bda9022a09095369230ec06c72e.npy +04379243-f9509165955416a79b4cf10910d2df7e.npy +03593526-477932969f473792433f5a7a254e9685.npy +02958343-81655a19f4ce2daa8fd988235de2147e.npy +02691156-71dad8605fbc699623fc69eefd95e6d3.npy +02871439-efcc1769d931a17878f02ba681da30b5.npy +04379243-1460b1e3fb02755e67db1ddda25e199f.npy +03211117-85e99418c109b98e8324c9a156c64d52.npy +03001627-8844e3830bbc5610d5cba62773b8025b.npy +04379243-3a8c86ee236ad156c6542d86974f9497.npy +04379243-e3aa92f57f96a50c4ac1ecd2766586e1.npy +04256520-777aa4f75debc4e8acbda81da5062d85.npy +04379243-1af43a3e8d164168e563c86a0b8645c8.npy +03636649-c7507804ba5ceca79573a52ffe6bb4cc.npy +03001627-5875ca8510373873f51f77a6d7299806.npy +02691156-858c0e466deead2c66cf1b4a8fc3914e.npy +03593526-73d1c7ed4bdb3bfd2f2318fdd66be40a.npy +04225987-488b9ae283b800b282ec895e014b9eb3.npy +02958343-81c52d54f9719736ce27281f3b76d1f5.npy +03642806-1bb2e873cfbef364cef0dab711014aa8.npy +04379243-2c8cb823e48531fa9d1db1d6d9537bce.npy +02871439-6726fdc49931be21d810b14a81e12eca.npy +04379243-6e18de4fa33bc9bcc0639593f50066f.npy +04004475-e12178732037ca9659e0838386a22482.npy +04554684-cbf8ea778b70d1c5ae0f84ab89df135e.npy +03001627-821c88bc79af232bf2acefc3b3178108.npy +03636649-26f2f40fa7fc0c5538b28f94c165f833.npy +04256520-34117792b1a8c180796c584ff1fcf56d.npy +03593526-8c9ffa8ee8f3b497e987f10c30c67205.npy +02691156-7336bffce72ea58b90baeef8ba5b93e5.npy +04256520-d29d2c5a1b35b85b40f0ac0fb9a650d.npy +02691156-f3660119189d3eca4c3a35cee92bb95b.npy +04379243-76635dc55e9783b6c8c2a1a2edf00686.npy +04225987-1e5fd1de723cc66cbb1ed6d4d8526a19.npy +04379243-1a5062241d7903076f88aa1b7f7cc6c6.npy +03991062-7cb2622fdebdb03736b0f2a1430e993a.npy +03790512-40b7a63fd9ede0cf48272812609617e2.npy +02691156-eb7bf553e500b9b544bf3710e93f8cf7.npy +04256520-9504e9be67514fe9c862eec8232fff1e.npy +04530566-deae1ec7a6e340e7c500d4aac3b87ab.npy +04530566-4cb135ddc5d3211c713a67cd30c1e1dc.npy +03593526-311399898943198de59f529cd1b6faa8.npy +02992529-521fa79c95f4d3e26d9f55fbf45cc0c.npy +03691459-5fdb0bb9c3c18d50602d6239bab56abc.npy +04090263-8181c6ea706bff129f433921788191f3.npy +04379243-1455ee780321fd14c3bd24f986301745.npy +03593526-3ce3a0a7adbaaa518e43a810a63361f0.npy +03001627-76d5bec920a9796a5e91295f1f8b2c67.npy +02933112-4e02dea48a1bed6bc59350d819542ec7.npy +03467517-d2cbbe7311f3699cfa3f3bbe4549e789.npy +02992529-2163366f7c3a7a0e6c63b8b48495261a.npy +04090263-c394a39997adf53d319f02af7c25cd6.npy +02933112-217d29a61745991f7aa75dfc74adc93f.npy +02691156-154146362c18b3c447fdda991f503a6b.npy +04530566-123c021333485d698a75485f44bcc744.npy +04256520-f78da0aa23162f3850cf3715818ccfe8.npy +03991062-f4fd4566ce4494b5a2c59a4d90e63212.npy +02691156-90612205109d7458e84aab2e1d454e3c.npy +04379243-3b57aa434803b0ec189c2d5c093a2652.npy +04256520-fabbe9b0db0846a8a823d9fb27aec30.npy +04468005-f6583ccb70cd71aa5ba3252cb57e6f4.npy +03001627-86a94d95c2aadcff1a1584303f0b5ee9.npy +02691156-3713302f0330f960970864f653fa080f.npy +03001627-518c58b170bf5847ff2c92c2a4f65876.npy +03001627-e9043a68f672c1f3a8699b6183baa203.npy +04004475-870a4a67312cde4562b4217d4b905122.npy +03001627-3797290f1dc83a3ab0e5659877cf3f6c.npy +03001627-1eb1a8acd4185f49492d9da2668ec34c.npy +02992529-4a0cd042d7479d6810bc2436075f6a52.npy +04379243-9dd5b7e6f90ee322b56d92c5d7b06038.npy +02691156-bcf7743f0dc85517bc0909d98a1ff2b4.npy +02958343-338eb8e836639e09f8f1f8fdb364ff3c.npy +02992529-fe39a57b8137ecbd5b2233351507f22f.npy +04256520-c55d36457611e7fb826fc8d57346a2e4.npy +04330267-3005a944902cf639fc1390934d948e09.npy +04256520-3e4a24e15c63edb95554764d7c3c0e03.npy +04530566-8b335b0be37debefd85e5191b992b560.npy +03001627-30fe29d73b410c3855efe429bf27a556.npy +03636649-d59202f9d1504c8cc65f1ed6a348c8a9.npy +02691156-d458335c758930c210b8e0008ef5faf6.npy +04379243-679e46c5c67fadd5c3bd24f986301745.npy +03991062-c1923b90d48f2016d86b59aca5792b15.npy +04379243-3441002a52b1cb2946b2a76c074a3f45.npy +04401088-16d7d7be19cde848dbe1e810cdc7471d.npy +02808440-c5a860b9e3a4ef5915aea01a869de65.npy +02992529-e7bb86cd04cfd98758f1d9dcdcb62d55.npy +04401088-fc07770a57d7a87022d3f170937c6a0b.npy +04379243-bd78847e636133c179c8c70bc853d3a7.npy +02933112-d8d2e500860312bf98d5fc0473d00a1c.npy +04401088-cf3f330fb6e3e034449ec657800ab951.npy +04379243-281f296380a0e4a81db7abc68608fde1.npy +04379243-98e8e686225b86aedb7603860ca917fe.npy +04530566-da675d2149827fe56ba3edb0853a984f.npy +04379243-b98dd46e9c1101e2214a15a5a42c49c0.npy +02691156-521916cfab629ce0b6ed9420d56b12a9.npy +04225987-bebaf2c5077b901e92ba7d308c045fd8.npy +03642806-2211a40cc77a085362c091e763f81d3.npy +02924116-791ea9a0664cb42a2f88d2c3eaf53e87.npy +03001627-4fe20ed873d1a80e21d25a6a55757584.npy +03001627-b11c616a19d702cdd7f7a4c4609b0913.npy +02691156-73945c1b294716e1d041917556492646.npy +03691459-e465af1099b63258e17b9e33c097dbff.npy +04468005-6c2c6c7e47c573ac636b52a9d219d297.npy +04460130-a422b6788bb8b2d5663d09b37dd6bd68.npy +04379243-2406cdcd4c60c84132884c4c87a2e061.npy +02933112-94cc8a8df8c78f5e14038d588fd1342f.npy +03001627-48fb419e9273c10a936e8f01c80c6ffe.npy +04379243-8a91b91802db34ea409421506a05b6e1.npy +04379243-49ad167497a2af8c9672e39f89e4622e.npy +03001627-31a3884f500d9fa2025d98fb9de28cb.npy +03325088-70221de88e240b1fb7a867e9b35a1295.npy +03001627-611a76dca411bf089579c5df0e7fa96.npy +03001627-774b94fd956a6601194565c2f3f896dc.npy +02992529-a3f4cae960ac74babc54d4bc75a1a826.npy +02691156-ed7e1a38fe33830b87697d3904b168b.npy +02828884-aad17ac8d5a1ccdfed98cca8f0ccd5f7.npy +02958343-4af44c67c14a477661c6c61410fc904b.npy +03790512-75f2dbb8204c01a4e1720743367d35c4.npy +04379243-4bf64ea69b9e7c85cf004563556ddb36.npy +04379243-9112b638a62b432e3521fe8ac6222005.npy +04379243-c4bfc29898e5a1b490ad276cd2af3a4.npy +02958343-a2a795ad86d1fa12f3aaed7e86215c7b.npy +02924116-d40461c73eef2a7ccbdda2562495e10b.npy +03759954-1d4ac8a8704792cd8e4c2796345a20e9.npy +03642806-20d42e934260b59c53c0c910fd6231ef.npy +02691156-72761d1c2c7e1418d86ebdaa02a63c4b.npy +03691459-e1385ebae6a7869d23a4cda08ffef080.npy +03001627-586b90e4b5e0530935836c728d324152.npy +03636649-75db7c2c9adbf2bfae18328edc91fc39.npy +03001627-d0fa70e45dee680fa45b742ddc5add59.npy +04379243-d1fe23dc2b62082121f2d1de8124ec62.npy +02691156-909548225096784cd5cf6c89d6cfc357.npy +02958343-a81d28a70bb06e18bda733a39f84326d.npy +02958343-5b0710d5e9467e847d80f0c0ccad8837.npy +02933112-d4e6002f0114461df879b7d55192442a.npy +03001627-402e47d9e3f825dcb9d7c2fc41e80228.npy +02691156-b5589ad89ceab860123d1d349cb8cfb9.npy +04379243-628c4fe12881efe2bababe11fcea8796.npy +04379243-a624ebf0bf0451a8d93768e7b9b1eabf.npy +02871439-4e26a2e39e3b6d39961b70a6f96df2a4.npy +02946921-d44cec47dbdead7ca46192d8b30882.npy +02924116-66e9addf909a3414e99562689078395.npy +02818832-41af7173657860b9dff53899485f7c2a.npy +02933112-9dfac0132596ff09b13b0af4c7a59aa0.npy +04379243-bb41a57386b1594c218a519212ed7c98.npy +04090263-1c292bec142b39a5aea3c9294e3d898c.npy +02691156-5608c1b40a0c2fc9c2912ef1a1302821.npy +04379243-ce82dbe1906e605d9b678eaf6920cd86.npy +04256520-cb61e530b7c20409512941e37c7d7dd6.npy +03001627-6895e7aa3c739623927045b355fe1fe3.npy +02843684-7bf5608a4d2c66bac5c86021644af7b5.npy +04379243-2bc4caa1941fed746500462ee46bc39.npy +04256520-48834ca61f0b759583e21877a4e60599.npy +04401088-d41b332b9e6efddaa0eb5a85db887292.npy +02958343-7aff83bed75b6778e5e8ebca62d4509c.npy +04379243-e38b1f4d210fb038c97f93e2910df644.npy +02871439-3e6962cf9ab0ec6d5a7942170a4965f4.npy +04530566-30e45246151fa36a9cccee214bcb0021.npy +02958343-8601cca4ddfd28af18bc22abef3f86ce.npy +03001627-bea7cfa3c0e7e16e63b2acb037dfbcde.npy +02691156-19a624cf1037fc75cda1835f53ae7d53.npy +03001627-7ad6cfc9aa35aa058573c953964a33bf.npy +03001627-226704c72560008421ceb39dc3069834.npy +03325088-b8bdf56796b123cb60cb08c7d22af96a.npy +04256520-46f1ec4173d32c0bf1af69e9778c153f.npy +03001627-d75b618231bf0815492a611633bf8558.npy +04379243-209b2271f9434cb3c242632b2a8c3129.npy +04379243-4fa9bcd45574827d4f0331b81f3e1ef.npy +04379243-48045af90c7959e5738e43095496b061.npy +04256520-b2aaf37365cd30776b9a660069df73df.npy +04379243-49a5c5f524eb73b8391e4d6c585a697a.npy +03261776-de3b9b253e8f1aaf8b15c58b209760b5.npy +03001627-faab798b13ecba08e9f0f0173ae2f184.npy +02828884-411f68beb7d27135d1dcc55e36186e4e.npy +02808440-76ebf4756a43b187753793048d44830e.npy +04379243-aa118e3ed06f00a85c886bf880a258e.npy +03001627-ce463d63d8771c5ccf19858fd1963d10.npy +04256520-7ddd55ed6481457d4211cc92ec35b195.npy +04530566-90c5c6b05a71381cd97a7aaf09adfff5.npy +04379243-2b1c1e0fad3cb3b8fad46760e869d184.npy +04379243-5f726d7fca7ec04131ec2883e34b06d0.npy +04379243-836157300c030c9a246b9f2ca347e8e3.npy +03636649-e4e93d5bfcfac3d72518f0b5d8933d6f.npy +04530566-406e7646609bc8bd8a53c9119bc523d3.npy +03001627-6a01eed3a575987211e48e4bcdc4a2a3.npy +02808440-e696c5d9b42ff5a0fe52ffd0e748a1ab.npy +02958343-825fb860d71c78a477c771b4b7eed82c.npy +03642806-6489453e322cdb53f9f3c6290096f50f.npy +02924116-805d11fea9dc852bfc319b95010c3346.npy +03001627-11d8814ed60b54002449009b96f8a6ed.npy +04530566-3d4b80858a5ae3d694daa4565dd30535.npy +03211117-9de3c0365edd0c0b3e487c876d55197b.npy +03636649-a1d2540e0ca159ec0735e7fd8e163ce.npy +03001627-4f81153b0a3d2fb25f5359f3b8f96a06.npy +04530566-54cf5783ca03b3e015ea3a1685d773da.npy +03325088-c2a09f60c43de534974f28a8ba184023.npy +03001627-9265413a74278fb5e45ef4135c266a12.npy +03467517-8a867571a5ba0e9b3de1a463b8ceba0c.npy +03642806-a59d3d87068d313c2656684d670220c2.npy +03467517-58de2533b7ce80b237058b1eaa7b4b1.npy +02801938-4b520e02e5bfed6ab8183a4a81361b94.npy +02747177-65d2760c534966f2d2b12aa6a0f050b3.npy +03001627-5d7b94584595d7a9118486d21a76684f.npy +03467517-83d6903f31a3e64c14268fe96e3c901b.npy +03636649-c4dc0ac169c91ff29f8c3d2002c77ddb.npy +04468005-79b834190bfcf065bc7069dbf29b2330.npy +04256520-be129d18d202650f6d3e11439c6c22c8.npy +04090263-5b6bf22e5c355592882cef3540bf556.npy +02933112-985eb4a8f9914873738e43095496b061.npy +03001627-89d2cbab56c5a1d7297056ac457c1c31.npy +03624134-4e39d4aff37d8502a0fefbd3658c7966.npy +03001627-ee03232aacadee87d4266d69a5c6f129.npy +02992529-b8a2c7c7df404ab8e7ef9fff09638f8e.npy +02691156-a211208ba6b752b1e75e6a02e772bcee.npy +02691156-51f51906f12681a1dc82b8fee1057b30.npy +03001627-6a20911ef197f358efa66822a012535e.npy +02691156-5a6eb0f2a316f23666cf1b4a8fc3914e.npy +02958343-3363bde33b9abfbf7c5640de9da0cd4.npy +02958343-66baad4c6e4bfa08cfd826dd468a5497.npy +02828884-17ebf60b6ba61ae949e6f7df978f3373.npy +02691156-149702d4e275568c18b14db3b83de9ff.npy +02958343-c4bad2da39f8021b3554e683803baa4c.npy +03261776-32b0b35517ed72e5fc176230c2f2d294.npy +03001627-3f7808c221b01668b4d174e5c61f344.npy +04379243-e4c8211dafa5b903febad4f49b26ec52.npy +04401088-44ce10ddb982c8ff72152988eac576ab.npy +02933112-72048f89b480cd411b17743c18fb63dc.npy +03001627-e7b1407e16d9d644c681404257d94ad9.npy +04256520-7cfbeb2c5af830a26a97150bb2a72733.npy +03337140-682ad244abc1c36991c352d02061b3f7.npy +03467517-e54a1fb20957d39dae8a6b22091f0f0a.npy +04379243-6a5ff41fa5aaadf84c29eddba1f2e390.npy +02933112-72d950ea1c029bf2369c46027bce7af.npy +02691156-9314289f486e58caa8cba409c4409ba9.npy +03467517-c73e40b1c97e24d8a1f251d725bedef2.npy +04379243-88c9c7a40227e935487003545673a337.npy +03001627-c0f18b32a4124eccad9a0199a27b3d8.npy +03001627-4f4b6167ef11ae4e8f8c11a24c52ebb.npy +03513137-7f8767aac7a5bbefef6f32a2a0bd4e8f.npy +03211117-70dacf62da510868a5ff93a193b16554.npy +03001627-63b2f7846c561efc20768660cf080d12.npy +03636649-1c003aabfe3e12976fd90c386180831a.npy +03928116-ef21ff42091957d19df921a933a453c5.npy +02880940-7995c6a5838e12ed447eea2e92abe28f.npy +02992529-d7ed512f7a7daf63772afc88105fa679.npy +04090263-b76f8c041122b2dbf112f20f44aa16b.npy +04530566-28be32d7361adce59e5ca238b1551011.npy +04379243-f09ef9a34df9b34d9420b255bb5956f0.npy +04530566-421db3c87037e7d6c2363c2f18a57bf4.npy +04256520-3ab95ff520d0970b6ae963205db1109f.npy +02691156-9300dc1ca5f16b074f95630cc18536e0.npy +02958343-9b4324a33b1dbad5a7fd25564c2e888e.npy +04090263-afa74746fa10939d153a22537579621f.npy +03211117-45a4d128553abb329bf8498db368caef.npy +02958343-949f6240e1a760992dc53e2d2dfd58d0.npy +02942699-7e677756898b40dc39513d756da531d0.npy +04530566-c74fe97df26a078facae7037c88ca7f5.npy +03001627-a7d124f0c0d9b27479b3e1be3524f72f.npy +03513137-b166d9115ed7b7638e75bb5638d14ce9.npy +03046257-435fcecdc24372a09e4965f0106e00d9.npy +02828884-eacb2a4fc51d03853c7e5bbf72a5f5ae.npy +02958343-b4d258dc5a12f9f7ade7f700b19bcf4a.npy +03211117-7c06bba1afa0553225a454369d791fb0.npy +03211117-15e7231a97ccf7953aeb14563b37e04a.npy +02958343-a7b76ead88d243133ffe0e5069bf1eb5.npy +04090263-fdcaebe1ef2f44406f21883e4b04581e.npy +02691156-560e0890ae86aa7624a25a765a1075c2.npy +03624134-223792d53b9d4d82ef1f81f15fbe736c.npy +04090263-82686f0ea15a7c24783a7c2adc432e76.npy +02992529-36b3329dc0bbd86989704dab2d2a8ab9.npy +02924116-de66b87e4f485c7f1e797b014c500fad.npy +03001627-6ecbaaaebb241ec34b3c42e318f3affc.npy +03642806-76005568c6a76385c8f56abbf37ac61c.npy +04090263-3a8526095bae7e553c79ad8cab094d8.npy +04379243-89c095a52766ecb05d2ac47f638a4ea4.npy +03759954-64af172f468f76a89675998826ae9066.npy +03759954-d9f87094f6a26f8ea2105179d0c9d51e.npy +02801938-615e24df86c59f4536b0f2a1430e993a.npy +02773838-68e4ba38895d820df6fec4b901a12701.npy +04256520-37113588c2d2566b4cf08511890c3458.npy +02958343-bccf69e2dd7de293ab2c2809513f396e.npy +04379243-9d832f72888892e66d907bf61e189d9d.npy +02958343-ea7d39fcc3cf045dfc73a41845471b0e.npy +02843684-ff90921e9631cd73c5c86021644af7b5.npy +04379243-54ec14c2afc2b7e37c5d07ba5fee5aad.npy +03001627-f268849e43f64861cb3a30f2c37c38a6.npy +03207941-f45ee6ab44e4be364f31b34e920051c4.npy +03991062-4765238a39e2a6f8ee5c4d873ab1a054.npy +04530566-1d389060e50915e223676ae79aaa08f7.npy +02880940-8d75c3c065fa3c7055f46d55537192b6.npy +02691156-214d7c0720b860091f21e5fbc0306e3e.npy +02924116-f4ec3e8621e5f7c88317d5418fbadd64.npy +03001627-4a63afd1da7fd633e6c5cd45aa112726.npy +03001627-df8bb7ecc402ede384a05e54516915de.npy +03948459-a3e6dcfc074489fd8ec2966c0323533e.npy +03691459-4d276aacd5e4c510de7da340cde8d034.npy +04379243-2c094e4bfe5958267da1098dc15ca7a2.npy +03211117-de5813ab2771ed36c3c11bfa5a6c7ac9.npy +03001627-951fb0d7ad8ab2bec5b5bea66ef4576d.npy +03001627-bc80b0b638f8a4e61a54bcb8e47577d6.npy +03001627-910bbf8701a4846c2993aa294808121b.npy +03991062-6cccc41151a9578d4b3c42e318f3affc.npy +04256520-159a8e14ee6dde05f7628281ecb18112.npy +03691459-f6958e13ea65bd521b45df3fb820c9cc.npy +04379243-7170910538470c80738e43095496b061.npy +04379243-515460eb527d3439e76bc197b3a3ffc0.npy +03001627-c0e3582a0c8273653c4f66791e25960f.npy +02958343-816f9a529bf7b14817d5c90faf553cc9.npy +04090263-561430988b5af11bd04b05b0f20a897b.npy +04401088-bcc1760ef463671c825b62bd6c28eac.npy +04090263-4327920bfe590d3d262eb9a9badf3c08.npy +02924116-bc65e17577d368674568f0f5b16acc69.npy +02691156-cbf4dc1c144ce656ffa79951b9f955a3.npy +02958343-9eef7b2c492bc1181f4a259ef9bb479d.npy +03938244-84693d928bbec2d18b14db3b83de9ff.npy +03636649-940a5e53f69e193ff42a90fe4baf4591.npy +03001627-d8c6c9fd4919e7f1c8d01774acf97a.npy +02691156-f5a8cae96024e709c1ccec171a275967.npy +03001627-e6a4d6fbdf722dbcc6ec74cc40a0a09a.npy +03636649-368188e7a9b9e1d3c24c2251620b1cc4.npy +03001627-e6b9b5d8b55df575cee7fc32eb84f3e9.npy +04379243-2b34724248743a36a71c812e027f94d9.npy +04379243-bb838e62bfa44f538705931e60ead6a0.npy +04379243-44a525e7793e37c5d340e35bb5304768.npy +02958343-107a17c6f2dd9c488924120dfad0e290.npy +04379243-895d688a910d8ba0bd647f71fcfdcbe2.npy +03046257-8f6b5dfebfdf8e34b3c42e318f3affc.npy +02958343-c6ca5b48d1e5f5ab89442e34f9143192.npy +04090263-6a283eba0e45bc63525c1baee1f19994.npy +03001627-8e5568ec663ae1b7e7526b618f37b43f.npy +02828884-7a8a8c523bcaa364a41bbb5eb703e15.npy +02691156-16b2f62791bd9f003554ccf8c30febe7.npy +02992529-d4407c240737b0c73455cac94a339dea.npy +04379243-1826930f388f5398e0c5923879d79f21.npy +04379243-bfa36cca677c512357f3bb43ed044708.npy +03046257-9a4b06f731898365afb07a946d621b3c.npy +02958343-f378404d31ce9db1afe1d4530f4c6e24.npy +04090263-63c944adedf86b80f8915bea3ae2769f.npy +03001627-d601777b8862bdc8b04cb542e2c50eb4.npy +02958343-530234273d5e31a57c7baeeaa3dedfc.npy +03928116-9de441eb54ec578a5b39a37797d4a0c4.npy +03790512-ef5e9989d2e00fd0d95f95e5406fe921.npy +04256520-9f1de8e71c8a85f23087f84b199fd297.npy +03593526-d447f75ce8f0fcbbd5570174b221bf0f.npy +02958343-52ff21d1ba10add4bda72093f9b5aa73.npy +02691156-6c8275f09052bf66ca8607f540cc62ba.npy +02876657-77a2242bf4ea8f9fc02fe00a7187a6a9.npy +03001627-d97a4a6f84f40854f51fa0238791f5dc.npy +04256520-42265c6cc8d24be09cd3f9e8648111d1.npy +03001627-cb7a4324fdfa690e96dd43aa0ec847c9.npy +04004475-97735b38d3b229d5e8be809ecac11dd.npy +03636649-4d63d3865d635b2be7c7920f6a65a54d.npy +02828884-8d7f97ef9187d6fff4fb4dee5181bee.npy +04090263-9b1d60945756d2bd33f9b4d665d32f82.npy +02747177-ab52671bb9b66e7663996f7debdc929e.npy +02992529-54bb14aad2406a124ce28f0f1b509eda.npy +02808440-6f0f8249e994c288ccd0340812259a39.npy +03001627-d7307a92178e74e055c774cb358c4539.npy +04256520-5328231a28719ed240a92729068b6b39.npy +04379243-5d5fe5537c5496f71f344185981b2096.npy +03001627-6e6ab9da02b8e3bd9bcd01fc6568d728.npy +03636649-918b197d2a157d70fcb8d8c6d4df8143.npy +02691156-2af529843a47df7aba0d990ae229b477.npy +02691156-c27b08dad98f802488a89a28f04ce622.npy +03211117-42c0246643c8ad0a2af8f68791a7d624.npy +03001627-32c1445f65f4ceb23eec26c23f5bc80b.npy +04256520-e49c0df0a42bdbecc4b4c7225ff8487e.npy +03211117-2475d02352162243cba9caf4d254cef0.npy +04379243-f917474a20558aa33bbab77a66bc3671.npy +04256520-819038a4b8db3ed24b3c42e318f3affc.npy +04530566-e2e0d0dbe736e3164947b319a9e09fd.npy +04256520-68a1f95fed336299f51f77a6d7299806.npy +04530566-e02d395707464e692ef42ab47be9662.npy +04256520-c51dc6c9f8db03f51e8fb9cbb32d2cb3.npy +03691459-6fcb50de7df5381835cd53a06b1d2317.npy +02691156-8baeb2c664b0bdf4ca8607f540cc62ba.npy +02992529-1f93dbc9622d83de7a9f0bb7b1eb35a4.npy +02992529-f2158f4f4141e07825a703f74bf22d93.npy +03001627-5d3060a3470d853dfebad4f49b26ec52.npy +04379243-f3efcbd9745da90619fb4103277a6b93.npy +04379243-217430853f56075915dd7d7985e749c1.npy +03593526-49f9a29866f0177bcc4cd6c58bd35c0c.npy +03001627-4dcf1f64f70f22d7b4569422e5e8ba0.npy +03636649-913ba6b6ac6aea3356c82fefb25b338b.npy +04379243-4cb4f4d4bb4771dd1d1d518ba4f78d6c.npy +03636649-9b5d13550ee386e686c0096e326e950a.npy +03001627-38fed916a35dd43d7c8c503b4b873379.npy +02958343-361f3fa1f09d25f07a5533ecb7691f17.npy +02691156-b59a7cab8e95f6eaf3a7414a84b5637.npy +04530566-4a886c242f8d02c8b5d16f91270f7fa2.npy +04256520-1d5675c6d28fcaa0f797b840852566c8.npy +04256520-a4fd0a514cabe8c34fb315ce917a9ec2.npy +02843684-88d4727a4c13ceb5613af97d40709241.npy +04090263-59ff0c5e24abf33f25ff9d2d1e4772c3.npy +02691156-2f988bec20218fa19a6e43b878d5b335.npy +03636649-c54d3a5a9c8a655e46407779dbd69b2d.npy +03211117-5318296d6d07e4e6d40cd81b129905bc.npy +02933112-4ac617dbce5ab494985850bfaa8d58e8.npy +04379243-95bb0549666284168d2b632e2708f79b.npy +03759954-179d23a446719d27592ecd319dfd8c5d.npy +03624134-a55c89bbd589071aee8a029f52654d3d.npy +04530566-614aaafb767bfe62dcf47132cab9d51b.npy +03467517-da8ee6c488a2f4e093f806b1ecaee483.npy +03001627-4019ee7cc7cc5f9e74dc49346c29fd4d.npy +03948459-42358a5cfc9dac388dcf178d0ce30874.npy +03001627-5c86904bdc50a1ca173c8feb9cba831.npy +04379243-6a9c7e9f19cd3583be92df29bb41e437.npy +04256520-26b508c478a9d363f51fa0238791f5dc.npy +03948459-1568357acf75987586ecff2582325794.npy +03642806-62036dabbd9ffa71549c63d8891393c6.npy +03636649-a700451d593a56b45369e32fb818f337.npy +04090263-fd2223d0b93e34dce3bdba9430565083.npy +03211117-2cb149b137f5182ec2c4d83da2705396.npy +02691156-a05347463ea86f1ecc777fcc6b5f19eb.npy +04256520-262833bd44fb0e522535fd8b96de1b55.npy +04530566-4adb08a459076889574b6f4c9eeb8eea.npy +03636649-1e322c9d236ed96d32acbbe2387ce75b.npy +04554684-22c6787bb43651f0f6eb1856550bd229.npy +02691156-fdc1a422b48a16f67341d39902b9e2e1.npy +02828884-7f1f873921ae0c63f155d75bbf62b80.npy +03691459-dbfcda5d40ebc2148bbd829479b32606.npy +04225987-8cea38648128ef1ddc75c30c88b2f7a9.npy +04379243-5bd924058c668abc269aba35b84eb82a.npy +04379243-dd46ae4a6d6cd1154b3c42e318f3affc.npy +02958343-17e146cb10c72fcfa2b80c598d71bf14.npy +02871439-fe571828e5b34d379d0a249a140da12.npy +03636649-b8e25e0825cb5db7765609a3f435fe9d.npy +02933112-4c94892ca2cd066e29a50a2b3c5e5b6.npy +03001627-4e8d4cffee2c4361c612776a678dd571.npy +04468005-34be2cf5c79e6648bb9715d4fc6aab2.npy +03337140-1bca7b1a5b92f44f492d9da2668ec34c.npy +02958343-234902223d35129de74a9a0d75c085be.npy +02933112-78c4b505894342269299936b751bd77b.npy +02924116-7c32b9a627f9f8ba41cefd10ce5d6cc0.npy +04379243-8fc0e4d561b5f551dcc34b96ec9c53d3.npy +03001627-7792861e0bdb95a270a43c2d978e502e.npy +04379243-ce1e09dec6387f715fcce4c360a80a36.npy +03001627-57a20ffcc530b8693b48a711df82173e.npy +02933112-580add3e9e4bd75939a06c149bd5b5b3.npy +02691156-5294c39d2a57bd7e5cad6226edb8e82.npy +02924116-27b7d3f2497848f87f0c75734d52cbf3.npy +02924116-98a557ce95a4e0fab0551d95e7a31051.npy +03337140-34e0bcd04523ae59d477567e8c8a6c59.npy +02691156-bb38d29611ba34572af1006be0f51835.npy +03001627-4a50449de8e26e82eacb498394990f0d.npy +04401088-c4b66fac952d4ef7d9039fb3a1715e96.npy +04090263-7d286b812a03c60e310bbd45bf9024da.npy +03642806-f4c6dec2587420aaf92e5f8fe21ceb0.npy +02876657-25b8ed5b02f07b6cbcfad79fc308fa6d.npy +03001627-c40ea8f03ae6407462e682c9809bff14.npy +03691459-63f06aff0721b648f322c3e7acea58f1.npy +04256520-dd1e9b6cfe8c2ff65ff61a3a2a0e2484.npy +04401088-2274e1f494d6d2c3226bc3b9ce9ff2a1.npy +03001627-25fe34942b619a2eaf7a219828cdb9da.npy +04379243-17e5a64889ca085fa5526f91aecc0c37.npy +02691156-ecbb6df185a7b260760d31bf9510e4b7.npy +04530566-c48ed09355e7ab34275e12937d8e1776.npy +04256520-c8e172e5708b1357545508cb156187cc.npy +02828884-4e3d100672af00842dc02296076d8ee0.npy +03001627-3e08f5809c2abe523ebc93db58e716e.npy +03797390-1038e4eac0e18dcce02ae6d2a21d494a.npy +03001627-9915f9247f671893b89b3e01b90fe955.npy +03001627-337050c0a5a7f965cc5cf3ad66086732.npy +03691459-76007907d4e0ae438c2ccb23eb70d81c.npy +04530566-7e16ed13ded8aba83f59687345e725a.npy +02808440-2ebcb0c668523047b362845c6edb57fc.npy +03001627-a1d217ba806367cbc13a0d88b632af1d.npy +04401088-85841bf9d27c85a26062f54263899d21.npy +03467517-d91b0745e57f6508dc6782957fd2f5d2.npy +02691156-e3dd7fd80f9e53be6ec2a8147a044691.npy +04004475-20af8c248e5719e6aa76432aa0a31cb.npy +02933112-2c1af98d2058a8056588620c25b809f9.npy +03593526-4c2eb778f9b6485480067e3fdc6db24c.npy +04530566-57658278fe1fe0571711b4192259c7f2.npy +04090263-8f70b211673e64c9c97e9355e94c4f15.npy +02924116-8b4bf94aeebbf8a652470de2774d6099.npy +04379243-82130114fee63442f51f77a6d7299806.npy +02828884-f136c5515364f62ed98cca8f0ccd5f7.npy +04379243-fbe97577070afd195c1975633309d43c.npy +02871439-e444eca1d18130c318f52c8a4cfcbe33.npy +02691156-ef0d51f895cee0e04485f82d9fa383bf.npy +03691459-5028625facbf77991a622b6f91cfddf.npy +04379243-fd79c30bf108dced1b17743c18fb63dc.npy +04530566-99ccd811a0e3052634e1b4a71050e6de.npy +04090263-60fdb51a9cc4011289172d41dca064d9.npy +02958343-8db161338795c215b1bb46d2556ba67d.npy +04379243-1bce2f4937d36446a32c566d71fa585c.npy +03691459-1e3da9e2f274b6a89585fee86900e65c.npy +02828884-18f57a3d41117140ed98cca8f0ccd5f7.npy +04256520-baaf2c0d399f7329e4b6769f60f49f2b.npy +02828884-dbd0698df1623b0391da37ff8bdd2524.npy +02876657-6b8b2cb01c376064c8724d5673a063a6.npy +04379243-dad614e8c01b8acd618778e799bced5c.npy +04379243-19e80d699bcbd3168821642e9a54505.npy +03636649-8e34bb5570f790b0796c584ff1fcf56d.npy +02880940-8d457deaf22394da65c5c31ac688ec4.npy +02691156-bb976c45b6812b9254e2b6da60f72ab3.npy +04379243-f726fcaa1d031391b2a0fa0a5d25776d.npy +02958343-be1929020e6bb4c9c2920de4c5efc2ee.npy +02691156-89887eb7413e51a55970a7489fd4b4fc.npy +04090263-16aade23487b928b8084b8c11aeb922b.npy +03636649-397f450de4fc6fd4fcb8d8c6d4df8143.npy +04330267-aad8160404996c1b73c03aee5e8475d4.npy +03467517-1b1c78a14841a4ce3630a3b40acf3144.npy +02992529-6167bf752533508dfd6e968ab91bff17.npy +03467517-5ac1d8b6d9ebb18d48385c672f40e577.npy +02691156-803fd1bf9b85da0aa79201593c1eb4b0.npy +02828884-7a7ca24c50662907bb808757415d8a76.npy +03211117-d475b620ef72756f795284068bb430b2.npy +04530566-5c695e7aa51d16ee557500503415b4e6.npy +04256520-35ba544cb0a342e529404a50338e24e7.npy +02992529-383a304edf67f757769dec5ec0157054.npy +03001627-6ccd1ba0e0d4408e56c513edc77abd33.npy +03991062-c8efa3566eb1ce9bdbbc9f7db3c7138e.npy +02691156-f258c40371334a4e90b1d6deb98feec6.npy +02958343-30c2364393514c5b1c685cd768514e67.npy +02992529-f77811bd35b9215dfd06b6d6f44d62dc.npy +02808440-bde516127c10ceed3321831d2245cf06.npy +03211117-880cec9f3dff564af81b347089add3de.npy +02691156-6058d6701a0ca4e748e8405d6c51a908.npy +03001627-c2d0bea1edd835b6e874cd29a3bc467c.npy +04225987-90dbe261a4d56dcf1082f2ea630bf69e.npy +04379243-5ec5b95d9c21b05ea9af104529ef47c3.npy +04379243-9458b7fef8e84b819f2349486c570dd4.npy +04401088-a4d81a74a416b88948637414dbe9de8d.npy +03211117-7560f6f70263aeb9f5b8dd4ebdc4068b.npy +02924116-4306dc8fac0e49749f9d6858184e60a0.npy +02924116-f735f0310f9240227037eba625e09a52.npy +03325088-804b09dad62f32653321831d2245cf06.npy +02933112-b56d8e21ac71f5d184296c7704cc40e8.npy +04379243-5c466b385c17f36dda6f252b9392c507.npy +03691459-bc3e89ef012a5904688bf677a786d0bc.npy +04379243-1581d2682187764730bbd4cddd04c77b.npy +04090263-8ac5aa7414e3c30030dd2b88f7efae34.npy +02933112-14e612a7cd0311905b539ad6c08a7283.npy +03797390-214dbcace712e49de195a69ef7c885a4.npy +04256520-e09afc136efcabd0dbb841c441320b8a.npy +04256520-b526808fe0903b4484e132150e6e3ece.npy +03001627-57406cae1c2978b40c306db1f141b05.npy +04379243-f0cee441d88de6dafebad4f49b26ec52.npy +03636649-f0b19b0258e8f551d5cb6d178687b980.npy +04090263-8fb14c7aad8e829bc6e84bc30e573cd.npy +04379243-b29e6b183014b61e49426bcf3088611e.npy +04379243-c9a3680859a722a0858699aaad4acee4.npy +04379243-dd363031a195991631b72d9d4e0e505a.npy +03001627-4fd654bdc7fa4658b0957d845ac33749.npy +04379243-424f30af1472fec6668ae11a7db5e82a.npy +02958343-856c62efeff8401567f6fefc01cc7126.npy +03001627-5a85b2ef58145949213c3458a0fe5598.npy +02691156-4d223d7a0e8162cabd46d022fd7d80aa.npy +03001627-98dc530eeece9f0ac3d18d4b522a4e80.npy +02691156-5739574537212a72b3f2b01de37c0b29.npy +02958343-3c6d7c6ce950917b3a93df79ef2b80ef.npy +02691156-7c76d7d8ecfca9c2b1bb46d2556ba67d.npy +03636649-75c15dd98de4ff17bd4bf7024dfa167d.npy +04256520-b797650c894719b99fd71c29e8052396.npy +03001627-23e726da58f115f69b9f2eb77f5e247e.npy +03467517-36dee516ac98dcadb6781382c9d625f6.npy +04090263-72405e2f1e4ad22027a9eb2a0bf0d0a9.npy +02691156-a516f9a6947bd0d639cb1b92881e8e76.npy +02958343-3c059c7851eafc192a9eb0f146e94477.npy +04379243-9200682ed0382e3f931e98da3a93e73e.npy +02828884-b2394480df328a98ad5067eac75a07f7.npy +03636649-7092dd68172560f410edd100dffd8d85.npy +02933112-727a4dbadbb74c33bf1b16662b6673df.npy +02933112-391d1f98ffc6f8cf4da5feafe6f1c8fc.npy +03642806-d2d90e352b2d0533ab0b172d4dea80cd.npy +02933112-12cb11dbb135ca9ac59350d819542ec7.npy +02880940-7c43116dbe35797aea5000d9d3be7992.npy +04460130-99316252e1dfbde1d810b14a81e12eca.npy +03636649-41c5a45c63f07f46c1c74fb098c415cf.npy +04090263-31da90b91370ff74f30ef438bb75825.npy +04401088-d8ee6baa8b57a89add62317fcd30f203.npy +04379243-d14752f7aa2f7ed5d684faddec3c0090.npy +03948459-2d573d37cce5b48b9f433921788191f3.npy +04225987-ac5b849680f5e3791bb7158ebaf7e1c8.npy +03001627-d334e5ab55188d62680876614ed35a7f.npy +03636649-de26f9660d34449f6838f5d4fcdeb579.npy +02828884-1f1f0cb43e65903d1d06bff8f83d7c23.npy +02747177-91a4d060d380409c2056b4bd5d870b47.npy +03642806-2d45f63c9ab71376a1b657e38449a62.npy +04379243-baaa6943a8adda4173705bc397297991.npy +03207941-785d6d568e0c7ea5575f4e5007488531.npy +02958343-d306a61faada97eda43f80a4a74d521b.npy +02691156-b41f477cd3c6843094b9c9a92aa36f8c.npy +04379243-4e9394f9f64859aef4ef86403cccc399.npy +04090263-22d2782aa73ea40960abd8a115f9899.npy +04530566-845426b7dd1b0e55a9142e7277ee08f1.npy +03211117-2963a8a608ba6833b6709846a0e82dc3.npy +03691459-90e3a0488b8ff079d207241113bee327.npy +04379243-6d6123585f79a8a54fa2fb9adc6e6779.npy +02871439-51f7a721c24712f35ce62bce310fcd30.npy +04256520-3ea6bec3578d7a0a24e449d22891bdba.npy +04225987-26cd3bfcef1e254f82b02baba7166175.npy +02691156-902b39a955eeb2bf35569910818956dd.npy +03642806-6170c9238fb2b5da2786f83874f709b7.npy +02924116-b19331d0683fe1ca402dc8d46be324b6.npy +02933112-b0709afab8a3d9ce7e65d4ecde1c77ce.npy +04256520-7104877ee2b4f68516cfe1233e767967.npy +03001627-8a9d8dad6800d55ff37af16b2893f1d4.npy +04090263-7083c94366b7c405330ab9259a8b176.npy +02871439-b079feff448e925546c4f23965b7dd40.npy +03948459-af9eaed1d9574387ab2c2809513f396e.npy +02924116-2de2984722a5bb59563e41b6f7313ed7.npy +04530566-d6ad84cfb652f5dd27ac692756be9e24.npy +04256520-96425edfd54c925457bd9a2a12d86bbc.npy +03001627-6b10b9f8b8f38cfadebf8d14d5516c20.npy +03467517-1300e8bafb819c8e1887f40a4f62df44.npy +04530566-70af463b4a51f0819330265a9fff38de.npy +02958343-6d03ff05596201e6d8df13fb69e08d76.npy +04256520-89155c23787c151219fb4103277a6b93.npy +04379243-aeb33188a1d1f0aaeb1b6e7f54488efd.npy +02958343-6e0e38fa4613df14af3abff6cd36a38e.npy +04401088-ec549f2ce1fd9acb634c1ac38a055513.npy +04379243-a4bea095f35a74d0e6c5cd45aa112726.npy +03593526-48eaa8465573a112bba080e9e0b1ed91.npy +02992529-e4a0f08d8a6d487ac9de9dbf8ea0d889.npy +03001627-dc182335876fbebbe6fe3612af521500.npy +03513137-176bb6178d49f5ace01c07526cf2aa4.npy +03211117-1fa9b1a775b6fd32d8d030206053b340.npy +04256520-b9a1600948000fbbba50f3b3c1c84054.npy +04530566-968848dda6faa772a9c79146773bd1b6.npy +02933112-170be0087472182bc59350d819542ec7.npy +03691459-91bab54d8d14100161d3e32ec60a98b7.npy +04256520-f17b64b1f764ba323bddec837aa40d6.npy +02958343-86d9b82220d7ba342e56818be5fde856.npy +04379243-c8e516785cbaa85259f8e31ca87c470e.npy +04379243-35e821cabad939df664b3b9b23ddfcbc.npy +03001627-96b4422833f806cecb092644051ec279.npy +03001627-e3adf2e6b3c3b015b63c025d1a57d1e5.npy +04379243-7625201ed0ef311eb65b71636c46ae49.npy +03691459-2e44c37aaae8052e587dcec4a739e277.npy +03467517-78a75ce8dc8dc197dc2b574e941c815b.npy +02958343-e914040a57618eb6d3e11439c6c22c8.npy +02691156-167250e2014c72dbb87697d3904b168b.npy +02958343-5ac9d85db6c0d396249cfd7cdcfe814e.npy +03790512-b1ad4777e9a8ad4e6e90540cf031a0dd.npy +02992529-4e2f684b3cebdbc344f470fdd42caac6.npy +02828884-3a93bccaa0b3161afca6ee915b120ce0.npy +04379243-9da02326599123989bb37ee549c6e937.npy +02933112-d7fe9a6bf2c5ad924c62bee40dcdc539.npy +04379243-40addb4af618318dad5067eac75a07f7.npy +04256520-99479cff448798a358db0ef36af1d3c5.npy +03624134-c50af8af50613e822bf26da672b84220.npy +04379243-2a901fa05ae444eff4b6538438a0b930.npy +02691156-9a5d4e2d21506f11c503a3776fc280fe.npy +02958343-1f37a6fbdf7c807e7d439639178556bc.npy +02933112-6059f5f009c40b814702663c3b3faf8f.npy +02691156-b46244d196a7f66635ae67400a94a6fe.npy +03636649-9f47c287c921e4b429eb9d04ea723179.npy +02933112-917de5653765673f8c2611a5a36e83b4.npy +02958343-28151fb21f5a3c94887b6e2409779132.npy +02933112-d917ca3f60dce05aaf31a22c7bed177d.npy +04256520-4fc8fd0b2951d0a0b035d20a1a3ca345.npy +03001627-c8cb59cef2f091e78a44b4d4aac56cc.npy +04379243-1908f2afe36335ebd97122acd7517380.npy +04379243-6402177ad47a8a9514d771bf63ae2f60.npy +04530566-2a492069b6009dec37363131ac7e8139.npy +04256520-a3d8fb85de7cf56fb2d2900ee0ae7e0.npy +03636649-f15294a164747178851f4ba6aaedaaa8.npy +03337140-a102f4ce970e4389126d9e54867801ff.npy +03636649-e30444ae7a929b6687d4034dde63c4f7.npy +03001627-1c685bc2a93f87a2504721639e19f609.npy +04256520-e12cf322cdec8ceb63860d683ccd0da.npy +03001627-34d3960d35d8d5219b9f2eb77f5e247e.npy +02691156-abc465975af79827dfb86dddee1d6ac3.npy +04074963-4e73215ae0f33d23a5e3ac6ff4952f3.npy +02691156-52747021197c7eeeb1a0518c224975f.npy +04379243-47ba08a0f617efc7a71c812e027f94d9.npy +03593526-1fc8104630b00416c151419181ef256.npy +02818832-9725ec5429b19ba05ac28d2931a0cac6.npy +03001627-8d0c04c99429ba8919fb4103277a6b93.npy +03046257-b7b62ffd6555121df546596ce7364503.npy +02691156-7c96e824c287f684651713cd1e90c5f4.npy +03207941-c9e020b0a288dde22404817055fb55cc.npy +03046257-fed6d8a816207b71af7c7ad2549a1b15.npy +03761084-506ce52bbfc7adecdb94e9396a25f7f1.npy +04379243-98bc840471b4fd568e6da51641e48238.npy +03001627-2cbbe7f1f1f75e34d28b52ade6c7e48.npy +04090263-86d90ec4c1e8437dfdf24ee0428a2075.npy +03001627-9d9b5f5b3fd41136244d7c2690850fc2.npy +04379243-50ea883b804766c458a565d8b69ccaf.npy +03797390-9d8c711750a73b06ad1d789f3b2120d0.npy +02691156-6f473d567942897b9908db9f2ff495fe.npy +03797390-ea127b5b9ba0696967699ff4ba91a25.npy +04379243-54dc32618be1ff18b3c0ea2ca7165b1c.npy +04379243-d89d8aff18d0f4fa6262f7bca314d953.npy +03642806-125c93cbc6544bd1f9f50a550b8c1cce.npy +03636649-71c9e25ec4fe08cbf7454c09d6230a4d.npy +02828884-146fb2790c11c7f1aaf6c17538652a1d.npy +02958343-b6749c2b917d4aad949b12cf3977a48b.npy +02828884-db4f8c9f1c62e421efca4f7cb98e0c29.npy +02871439-b60b0839b5cf71d997000b44d733da.npy +04256520-402ccbc3f5f26c095f8ca2b92d19277.npy +02958343-73a58e58e26e7e20e55e3ad998a1ecb4.npy +03001627-cbee0f33a45bc8231adfc48ece0d7031.npy +02958343-28bdade3806ef2f328044fe9244db50a.npy +04379243-25f69a74efbff4d071a782a4379556c7.npy +02992529-73d6b5dfb0f2bd8f5c351e299b24e355.npy +04256520-4f2c9a0709eb8cb9202316dd49948ea2.npy +04530566-3948782a95f084b92336765b86c93d9.npy +04256520-349402b08cc7e5e9492d9da2668ec34c.npy +04379243-fbdd516e90ad48902872e9c941f7c819.npy +02992529-ffe8cc1d33f3fb83d954b120b2d50f0f.npy +02691156-e523ba4e79a48d31bd46d022fd7d80aa.npy +04379243-c266a3883e001404721f5f36cb42501.npy +02992529-56a32f9e4785d3928a4adbc089030705.npy +04379243-f7e0e36f618039dff39d7554d3e63ae4.npy +03001627-7c68894c83afb0118e8dcbd53cc631ab.npy +04256520-225661a6dcd77e7dbd05ef637b36b199.npy +04256520-518cf789a696965b5e723252788c3d6e.npy +04401088-fa1088998ad523edf85a324c5324329e.npy +02958343-609f09c6ce74d6c44c06afea25f8c085.npy +02933112-1c87c14a44982206df3a1b0d597ce76e.npy +03642806-eda651202abbb90c94daa4565dd30535.npy +03948459-eff3abfc08348cf4be0132953bc535f3.npy +03001627-507a5070cde81fd867936ca58e67cec6.npy +04379243-9af7a071bbd432baa5526f91aecc0c37.npy +03642806-dc264eab83ca12b3da4c0d8596dff972.npy +04530566-5ae9838a4646c0551780f6e6561db9c8.npy +03085013-4a14f442ed519225a17d66eaa6c79db4.npy +03046257-b13143d5f71e38d24738aee9841818fe.npy +03085013-3714f64af44a135f6d3e11439c6c22c8.npy +03001627-5b3fd3199d1bc950c1ae25a29e9d46d3.npy +03636649-4fe9a79b382d30fb1735ea0e092a805a.npy +03636649-d779977c2417752b815c6de5374a8dd2.npy +02992529-b7049148a4ffa22fdfe197f9f37aa72d.npy +02691156-468e504d8c28d8c9b8b8dbe00be04f1d.npy +02691156-9695d544e326baeaebc75cd68927f0b5.npy +04379243-a45a7ba9a2842a55634c21965ee6bab.npy +03001627-c48014610839bde3b8e687cbf40e9e47.npy +03710193-98d4f56a842a777b28610e22176f685f.npy +04379243-b69d9e876e7a80a29f2349486c570dd4.npy +02958343-7d4fd8ed77355364fa98472c1d231070.npy +02958343-21fcf7b6cfcd2c7933d7c9e122eec9b6.npy +04379243-ece1e39b8c5f851b9eea323f522c6486.npy +04530566-d617c5194daf4f7298a97ddfb532e08c.npy +04090263-9a4c69fb30dd08bb5bfb24d81b25af8.npy +04379243-3fc6396e6a1270bdbca69f936e89647.npy +03001627-3a0e5dbb68e58cf543fad16a067ce812.npy +03593526-4cd37983220c5949946c2e1ea428382a.npy +04468005-31227f3fc286c00714c06184923f6962.npy +03211117-a17e2808f0176f87f1f3662486c882e5.npy +02958343-4822076e48b366371f0d59cde6139796.npy +04530566-b5b320871c5dd884a24134966691a2dc.npy +02933112-285864fbee3a4038178e7d331e641179.npy +02958343-7b8bcc3cafd34efa8b7227eb0fb9adaf.npy +04379243-4d81894947d08922beedb4c8fd29e2d1.npy +02924116-b01f3b4d7d18588b219d4a071eee0cb9.npy +04379243-b738d1a4caaf4dcb9cd431573238602d.npy +02691156-bf77987a13fc34b5b6c7da997b0e5e3.npy +02691156-de543fb92592aa48236a74f773a58aa.npy +04379243-7ce1b7444c3ba89e74f1cdda9579594c.npy +04530566-377ea2491f8db13c4808655181d482fb.npy +03593526-c42115bcac36e3569f8c3d2002c77ddb.npy +02946921-dc815e056c71e2ed7c8ed5da8582ce91.npy +03467517-b54b9a0eb5be15dd57700c05b1862d8.npy +02876657-158634b1d7d010eeebe67d9b32c3ddf8.npy +03001627-97a87f40f5eb6f04af7c7ad2549a1b15.npy +02843684-75bf6f6a98aea049ba5342d638d0c267.npy +03001627-85b16941984902f8facfa12c7d71c89f.npy +03636649-e44408513c20d08f37aef4415914e1d0.npy +04530566-dde0cd836238f7946cde899c8674e2a8.npy +02828884-3a60057b27f90ed64910664c4d1311f4.npy +04460130-6372299ee506123b52f2aeb043ecdce8.npy +02924116-2acae4f14a734f4972cf25af66dc82ce.npy +04401088-2874447c7552c6b942f892024869e751.npy +04379243-302ba9e290485f9c310cd758d9b7cf.npy +04090263-58d4a585abe57ff59a4b8c8271f09050.npy +03001627-57b4898f5b94a5a89d297e74104d3ac3.npy +04379243-bc7d143f0c666d816f80e82f51b5db7.npy +02691156-57575cb42132554af64801ad2940cdd5.npy +02933112-46629a0cff77972aa47e6c0a5f3e8240.npy +03642806-a4d779cf204ff052894c6619653a3264.npy +02924116-1584a923c35a42628dae4ffb029d1905.npy +03001627-64ef0e07129b6bc4c3bd24f986301745.npy +03046257-8b52d84dc97eb3a74740473002adcaee.npy +03325088-3a32f3b62d76fbd8b362845c6edb57fc.npy +02828884-bd88f333baa6cdc723d95f4309ade30.npy +04530566-ef666f3eb17ea5cbd56c7296613ec69d.npy +02958343-788612c1f9b2efccb1bb46d2556ba67d.npy +03991062-e0f429ea9201e20ed523ef2d2597224a.npy +02958343-72f56235cf1e18cf1ccbd9e5bb82dd04.npy +03948459-18a19c9d7ecf8ba9437e0b38fdbab2a8.npy +03211117-29aaace957daebc982c69f261576200a.npy +03691459-79c0d4ba54cb08ccec29f84f96a7e29f.npy +02933112-14ef9da3809148601b17743c18fb63dc.npy +03001627-582c67ae4d746d121b356ab8b24c147.npy +04256520-e55e87415f0c23baa1845d2858b500eb.npy +03513137-be9812128882a7957e167bb4cf1b28cc.npy +02933112-d15097b4c6fdd9001b6eef8565b06678.npy +03790512-8020984fc6e83ac1331b5e6778e27aa.npy +02958343-a9ae1558ff25e5336436916a86a90ed7.npy +04379243-19678fdb9bc926505e4b35ff1ea95f37.npy +03467517-451678b1ddcaf9e6d26aa1b9cb124738.npy +03636649-7ad15667f654fc08664b3b9b23ddfcbc.npy +03636649-348d6ddf9e02cbddf647dc544bb0ab61.npy +04379243-92499724962a368d53743fbb4759270c.npy +03001627-37d7029722aa0d91904cae5fc41c2d5e.npy +03337140-5738ddc421b5bb0291c352d02061b3f7.npy +04460130-5b0dc77df3bd924c25ed5c2b422915db.npy +02808440-b08727e640554b493321831d2245cf06.npy +04090263-7c6a21d8b91fd12a1b7837f7a64e3031.npy +04379243-52997bb331942b64f84b0be7f50940eb.npy +03593526-470392ec218fb13d63d977b06bbd429d.npy +02691156-db567b8afbaaa95060a762246a709d46.npy +04379243-980b85a3109e66562bbf333b6ea7b79f.npy +02828884-8d28e56cf5d2bfc8c3deaacdfa0e1e8e.npy +04379243-747f70e41b927e13b73481345ae9d2cd.npy +02691156-84615b34a2c8a2868699933784576e73.npy +02958343-e2ea542d46c76a002a025f627835d975.npy +04530566-4ee0ed0c56540273a6dae8586082d789.npy +04379243-a1da0c1db8220563b6b0dd2a0b939a74.npy +04379243-88ffa9b795f527b1969b9778c8fec586.npy +03624134-331bf2eb28033c1d1138511a51ff0534.npy +03325088-81a70dd1b34af19d92f46099482aad38.npy +02992529-b02d8e0fb3ec903b4a952171144f2812.npy +02958343-ae852f7f30bfdbcdf9d73bbb584eaa42.npy +03467517-ed978355ce673ab01009233434be6ec0.npy +02691156-f46df635ac669a9818b14db3b83de9ff.npy +03211117-f06cab8286ad4f7cecb44abbf263be08.npy +02828884-72d098aad341ae4c436455e65b78c0e3.npy +04379243-1033f41fd2decfa938da3ea2c9e0e4f.npy +02958343-1f43243b81df21277925d1ea63246010.npy +02691156-d1d308692cb4b6059a6e43b878d5b335.npy +03001627-55c9891ac274e076492d9da2668ec34c.npy +04090263-4fbeedb2f1f43293b95520b5e9aadee8.npy +04256520-64dc2fa7007421f9cf46315936cd9301.npy +04530566-d651a1f3e02593772b23aad8ba1ba03a.npy +03001627-8617fc907ff8cb36597976c675750537.npy +04401088-b1d1d6a5f46a30894884e1105772427c.npy +04256520-8173fe7964a2a06319fb4103277a6b93.npy +02828884-50cdaa9e33fc853ecb2a965e75be701c.npy +04379243-31f47d0373170683f6c84947abf8f003.npy +03001627-8b552c23c064b96179368d1198f406e7.npy +03624134-e43c5d6241344913c40c6b891c4913bd.npy +02958343-94b3689f899c8cfbd575863af568c85.npy +02691156-4782920ddfdeef4ef6bd63e31c40dc1.npy +04379243-224ccf4c3cfd4cc1b9a0f5d18f1ce54c.npy +02808440-56a19ee862125b28cf8c584ddfde6324.npy +02808440-af7fedb716fa3b119b5b1575bf5ce108.npy +04530566-88ea6d51dcf2cdee3a6f102e22936e2c.npy +02691156-e53547a01129eef87eda1e12bd28fb7.npy +04256520-44d172b5cd523df141b965cb8ba50814.npy +04530566-a08180869abc48b75b0cd10627918af8.npy +04379243-24181beca16bb46bf9931f8a466b18bd.npy +03211117-3a9dfefa52a6d2643ed8be9ed4b2b6c8.npy +03211117-adaceffcf1d89f9552b499dc8d840804.npy +04379243-8700e5f711dd180bef207763b5f4c54e.npy +02933112-6f56fdbf225247abcd8f3fe9ca2145e1.npy +04530566-25159673c007368b8b44023403d275d4.npy +02828884-43cae409bde302d4c88fd5e1f2929cbf.npy +02691156-5a12bc3a78c510cb366a5992755f2322.npy +03928116-e3be0badd5278d1825e1cdfd03ba4126.npy +03046257-191812cf4abfd6166e71174964d90e49.npy +04379243-1cd6a00b71f02b06430c2c15987e4cd.npy +03001627-113016635d554d5171fb733891076ecf.npy +03211117-6c8f7736660f2e97e441f5bb6f88ca61.npy +04379243-2cee786a3480113a2241dba92389a637.npy +04460130-48a1e31e57862a63ff679899febcb0d4.npy +04379243-e4089e22c991e2dcfd277d65d018c82e.npy +04530566-750f5d76abca0a05bdb69bbe5cb6055.npy +02924116-1c6d79edc1ce02b8ea89a7009dca2424.npy +02691156-cc14512d5fe6e8489a6e43b878d5b335.npy +03991062-6f96ea1f948bdb5a72652f4081ec5a77.npy +04379243-31b972951e7a8ed323fe3501bb9e7193.npy +04074963-6f6ed9e0d29b64e714be24585075d395.npy +03001627-c91eb95b40e4b6f8e83221ad0d21775.npy +02933112-48ad79b48a76fcec4da5feafe6f1c8fc.npy +03710193-133dec6c00923805f423417965ceb17c.npy +02992529-da24f27173874672ed7485a1aa598365.npy +02691156-1abe9524d3d38a54f49a51dc77a0dd59.npy +03001627-b3fd987b330d0d2acda56795a6fbde1f.npy +02828884-c6ccf94d3e512ad510b3ff08c68acccf.npy +03001627-7f6bcacd96d3b89ef8331f5a5b032c12.npy +02871439-7c93c71c1ca57d5c9c71f681ea4c5bae.npy +02958343-f7da98a59900ab60becf71e2e014ff6f.npy +02992529-bcc1760ef463671c825b62bd6c28eac.npy +02958343-b17929063c2b3d9a52aa494042b7c9db.npy +04256520-e4e660790950c277cb1362eb0fa793e9.npy +03001627-c9d8573a048c0e959c0ca344f487323e.npy +03207941-4e9832bbbb077f9c5c5adfeaec1397f.npy +02933112-891e56eed3fe1debeca22c501ad0a77a.npy +04530566-71d6ab6979e5a313dde8c025d72da437.npy +03001627-7e66472eb05cca212e77b4bab2489170.npy +02691156-862d685006637dfef630324ef3baae90.npy +03001627-605ebc9107c71d54d8f5adb469ca89d3.npy +03211117-bb6392ddfeb98b19822cf0bd2945d4dd.npy +04379243-2bf3e370da5d2f73ed403132b02528bd.npy +02691156-4e3e46fa987d0892a185a70f269c2a41.npy +04379243-f907cd8cfb723ee6d6eba0d14df5347e.npy +03636649-33e210ccfa79a0ed581fd19c35a5c8c.npy +03001627-e3479f55f5894bb3c7f1f7c0570e288d.npy +02828884-bbb448ee06bd6d83d838ae16242881dc.npy +02747177-93d5f21e94ac5fb68a606c63493ddb7c.npy +03636649-2848ad36017ecc69b4169e4cad9bb63a.npy +03636649-27b2a1bb96fbd760316fa82a71600dfa.npy +02691156-7bbe33ebb5429a0a7a9e881131950954.npy +02958343-94edffd805dc965ca5626f7e1b38f05f.npy +02747177-8675c75413c9938dccf149c7b4065e.npy +02924116-647c7b4faa7473aa54d963fd62c89fef.npy +02933112-4d79731efe402b0d635469b95109803c.npy +03636649-e98c05f4cc8c7afcf648915c85184f8c.npy +04379243-40ae20513a1ddcdcf6cabe1df6f4c9d9.npy +02933112-d8bf8dcbd5cae04094beb1f48b8b494b.npy +03797390-345d3e7252156db8d44ee24d6b5498e1.npy +02808440-19a77323e724b7c43321831d2245cf06.npy +04379243-bda51fed12335c5e999b33727fe6db14.npy +03001627-c5beb566f512bc8d9e989ccbad3213ca.npy +03636649-5b4856005da0ab61d18826cccc613430.npy +03001627-710441e3719c99e04b3c42e318f3affc.npy +03001627-24082b0254dd180c490ad276cd2af3a4.npy +04379243-4fc0bc3fb6438dffab1d1edf764243e3.npy +02691156-31d5be3944350915efde2c2b27dc1843.npy +02691156-bdcc8077771968d67c54439d6177032.npy +04099429-3f3232433c2598e779169036b64ab0d9.npy +04401088-8caf79a2bf3be9fabfbac23a8087e8f4.npy +04379243-c728329a22124fa7e8dd400ae08fade4.npy +03691459-7ec487384a050ccb82d710142ac471e3.npy +04379243-aa219609a504b01047c527f581cb7384.npy +02924116-45ce077a3cb5c211690493afe1d3a073.npy +03642806-7c1eb7cc7dbdb68268981420d1da6237.npy +04256520-fce717669ca521884e1a9fae5403e01f.npy +04379243-b909b35804e9751daece045e8bdac80f.npy +02958343-f1f78226ed08465f801b0db1d49ea10c.npy +02691156-ff554f038a338ef322031be9b666aa96.npy +03642806-f72dc1ffeae0168aadcfd37206a0d18b.npy +03467517-b48531b4e111f30d8388889c8d3c7bea.npy +03691459-cc6ebcef8d2e674690146e2a0489a257.npy +03001627-941720989a7af0248b500dd30d6dfd0.npy +04379243-90c19c729cabdb864b8710a3469971b1.npy +04379243-90992c45f7b2ee7d71a48b5339c6e0da.npy +02808440-63e2922c33f79afaec72042a273c8bd8.npy +04379243-6afd8ac8c1a2e31cd42ec7e303174a87.npy +04530566-aa6a256cce6f8248b1bb46d2556ba67d.npy +03001627-74c97be038139e9792d9ebeee84a8909.npy +04090263-ed1647e209a3f661e1f2a1daf140ac9f.npy +04256520-ef6ec9f481a67015ee3907b60a74e8f8.npy +04460130-6b78705cd18a7b7767b959cddc3d22e.npy +03761084-48eecde6f71bc1a2f99d92708f91e592.npy +02828884-7e2433a3cd020f53588060c928db75ed.npy +04090263-700b82751c12e8ea3745d03a006445d.npy +03211117-609dffc42c3507212492d8a3aa63f4f5.npy +04530566-5bcfb42ffc3490c4af802a9d0ab09410.npy +03467517-8f1f54d337bf6ccac782e6226a4f593e.npy +02958343-2e1178d969bdb3849ea5c205086e2a63.npy +04256520-583ccd71c56aed45f14c803eab703899.npy +03593526-9f62aed6538caca130612f5c0ef21eb8.npy +03325088-49553eee4f0403f850da8b99982a3057.npy +03691459-3c8dd5506a17628fa43ada367b02a4fb.npy +02958343-d98b63a9e35f50b46a835a8530f31f70.npy +04379243-cb242dc225308003de21d22522bdaf.npy +04379243-688bd4df748faa62820018801b237b3d.npy +02992529-407e5ee21fb23fd92ffe71e0e78fe3b7.npy +02933112-c33ab47f610b64e6ccab809eba079ca0.npy +03948459-4bb890182e9f01b26c63b8b48495261a.npy +02933112-b37d269e1ec64992ee71ee29c2167097.npy +02958343-87918f9d328b535befe5f291bc2f5fd0.npy +04530566-c45f67b42b7febf52b249fd16295bbfb.npy +04401088-9911b2ee8470d6dab2098fa3046754f.npy +04401088-fbd120d2c01484d56c95c6d882af3c0.npy +04256520-264d40f99914b97e577df49fb73cc67c.npy +03001627-c5e6c2b4528c371378dd615a59de5f05.npy +04090263-bd23795276854614182f019eac476ad2.npy +03797390-c2e411ed6061a25ef06800d5696e457f.npy +04379243-3eea280aa5da733e95166372d7ac113b.npy +02933112-6e6a324c244158325761a0b53ed37cec.npy +03001627-d75d41af68f4bf7f9af4053b8815b239.npy +02691156-ecb4ae05d7dd135a619550d2af0b6117.npy +04379243-3f4cb895d754dbd3ce47b13319293999.npy +03001627-93556cf01e19f638bf80985a99195eb8.npy +03991062-e74feb8fb03280e639c837a9524b9dac.npy +04256520-18f8fb3fd6222959e8f8c11a24c52ebb.npy +03325088-1e038dfd194d74863321831d2245cf06.npy +04256520-8458d6939967ac1bbc7a6acbd8f058b.npy +03624134-6f01f7579d0ba8238bf4d4792a57629.npy +04401088-cd7e6ab98a2d090099b101e0ce243aa5.npy +02691156-7eef160cf5e4188a5a8c25d312cc3c6a.npy +02691156-47bf091a7c919d1c90b1d6deb98feec6.npy +03211117-7034d396585632ef5450caead37a1c9f.npy +04379243-5292f2930f188e0a7ff6ace05b36a5.npy +04379243-e99a4c2fa99a0038a2aa7d89ba9aea43.npy +04379243-26432bcd60baec3182c17278756c0a5b.npy +03624134-3460fad7c54b8e54801723dfdf7a7a7c.npy +04256520-1512e3c41de7a461e10a48f2bbb9bef4.npy +02828884-275249a603cf7f6df064889421ac8911.npy +03991062-5afc3b1bd57bf6482c2c0fe8f75ba056.npy +02933112-a640e7214f7c5393a5b7c9f0974d595e.npy +03001627-473cbfa40ff731d92e75d78b4c7ea93.npy +04256520-faf387a11f3f944a75dc34583b0239b8.npy +02958343-8b4879617bd256391738f25e3015f92e.npy +04256520-ed1aee9100f58e26b9b072e1f62798f5.npy +04256520-c51e57530257f6e0e0771d4c079a0ec2.npy +02808440-12976a1c355efee1ae51c8fb67762055.npy +03001627-3319a9b24416ecea7ff6ace05b36a5.npy +02958343-599aede2de805313a87928f1d77303e.npy +04379243-b95072f2b12a3274d810b14a81e12eca.npy +02691156-d72a483cf8a0cf2bbbf3143b1cb6076a.npy +02691156-3c0a871ed33a1c6a296ee999ff54cc3b.npy +03001627-4ecb13c40d55bc24fbcb0345af819bcb.npy +02808440-66bf814e881c1c1a51c83dffb1e07a0e.npy +03001627-eee8b6fafd8af9d1ea54e1e7afcaee9.npy +03001627-bce7ff621a5440bb34ee5c94ebdf7f1d.npy +03001627-595b9c165214bdf0b0b1b4239165b394.npy +04256520-42eb9cb2f34c1ac81be5c5f8d4f77343.npy +02691156-e409d714620161c132fa725d7a62a02a.npy +03001627-a07ec767c0a395e53cc720af04c21ce8.npy +02946921-a5bab9546d6a1baa33ff264b2ec3aaa9.npy +04379243-f0d5eefef970fa4b9f2349486c570dd4.npy +03467517-28c3903b29f6b38363e148e250c0340d.npy +02992529-decbc541efe459a742f1242fa6dff2cf.npy +02808440-4033f8440d4b5e83321831d2245cf06.npy +04090263-8036d88d38432a11ff18bc1311316304.npy +04379243-ad0c4c25d7a4d4c296db593b49da23e5.npy +03624134-2d6e9b23e171760c3e332fb3cb6ebe50.npy +04379243-fa7a8f6d4c33a4081f4e3943babe5979.npy +04379243-d7de6b2deca39eb0b20aa91e9e90c311.npy +03636649-a122a15d97594ebcfcb8d8c6d4df8143.npy +02958343-a8ab20351c2e7542912749d867981a40.npy +04530566-4765a72ac8a0eec3993eb1c02818be1e.npy +03636649-78b8718a36910dd32534572dc403ed94.npy +02828884-bdce8b3475f59d38f4fb4dee5181bee.npy +03467517-bb895a87931f51c893f0194265a9746c.npy +03991062-8d2c6ce685eb1fd9368b14e48c164a6e.npy +02958343-b5938ce8c35aac9b46f8ee02bd8f9824.npy +03710193-73cd7f3ea1579431a97f238e46bc2221.npy +03211117-6a9dcf34fdfe8ba82d8b18d11bd45e6.npy +02828884-f5d5f659c9cda6d0ad5067eac75a07f7.npy +04379243-3c514c4f53e3f1ed4b3c42e318f3affc.npy +04379243-49230cfa054929bc718a34fa24049f1e.npy +03467517-4ff4b6305e3d5e2ad57700c05b1862d8.npy +02880940-3f6a6718d729b77bed2eab6efdeec5f8.npy +02871439-de3b28f255111570bc6a557844fbbce9.npy +03046257-a245bbf8367d33ec4b3c42e318f3affc.npy +04379243-bbc685f481cee10f668ae11a7db5e82a.npy +03001627-728fb292d234b43d49a71f577ceadcf5.npy +02933112-2e38fe7e4cd74bec76e9713f57a5fcb6.npy +04530566-ba5723d5cab50a0b7d86b3749977e29.npy +03636649-24c91045ef1c6a91e4407e92c4b0344c.npy +02691156-4e67ea4fbcd0d9a4bfb056e4de687088.npy +04379243-d5f5388411866fcd6f349f21cf5447af.npy +04256520-48a44ed3050ad12dd5b24cafb84903c7.npy +03325088-589cc2df7bf5a6243d7d93e47bfee597.npy +04379243-cdee5ccae3613c507e1dc03b595bd36c.npy +04256520-7e2d4791502378f2593ebeeedbff73b.npy +04401088-27085a2456319497f1cb19f636b1c2bd.npy +02691156-376466b562217c2abc0909d98a1ff2b4.npy +04379243-c1660471a22c98a9c7cdfa94351d0f74.npy +02924116-731b13f29603a7a183c8e6d5420def84.npy +03001627-2cf960825840947aa903b9ef0ae7fb14.npy +02691156-788548a68d7b46ec179febb7e11d3625.npy +02691156-16f81f41ba16edebca8607f540cc62ba.npy +04256520-d8892d8a902616b1669e5c8c05e138e9.npy +03046257-613a7dfb6cd136e3df6cfab91d65bb91.npy +04379243-42bb37f87a9a758ad43fe0060c5249d9.npy +02691156-af69c8020fa9b68366cf1b4a8fc3914e.npy +02933112-7b7067ed1bfcfb62377b9297f3055210.npy +04530566-a8455459a7b93aef9e5629b793f22d35.npy +03337140-2b37f9944a63ba4b4c3aee8e9d3a6ffa.npy +04256520-5b06dcaf32f92e7eb3878cedd8c8fe6c.npy +03636649-7893d0b50a7b6a768ec45924afa4ac91.npy +02933112-68d23effdc37ff8ab59213b4b43189c1.npy +02828884-14688c10826a81933792407aee21900f.npy +04468005-9241faa02acfe08f1b3165b3174f01e4.npy +04379243-6a72d6a26d28b02bd626c689702869b7.npy +02933112-3775c10b5502d12a1190e285a2cbc9c.npy +02933112-3d21c803cfa3bf504c96d44e0e286fe7.npy +03211117-b228f0d5208fd9ac30ae9117a5a20ccf.npy +02880940-cfac22c8ca3339b83ce5cb00b21d9584.npy +04379243-45b839c347e02c86b20aa91e9e90c311.npy +02691156-e533a1a758a1752b187ea8c086d9f2c.npy +03991062-c94497750ff15b998578f0cefc281dbb.npy +04330267-83be70da0f3def9cc1b69d6ad297ed35.npy +03636649-6196ca0c22f9f7271110d567ea61aa61.npy +02691156-fb92c2e96fdf6c37595dc3191c718398.npy +02871439-c214e1d190cb87362a9cd5247487b619.npy +04460130-4059fb45b27d8b1f148a76a78b10eb5d.npy +04379243-4220d2a91737c68019fb4103277a6b93.npy +02958343-c98c68f41fe8747fb376886260eb15c1.npy +03642806-ce13a85fb71694fcb611830890d7aa97.npy +02924116-4ed9d6cc9a4a71d73aa5bf64bbf56692.npy +03211117-6a08ffb169d2929cda4553545dd45630.npy +03636649-7b41e8307e85ab0b87e834be7739917e.npy +02958343-96e164d8347ff4d8d61b6a34f3fd808c.npy +02876657-c553b7e594942f0a4c0bba210aa0d1.npy +02691156-ac0234f2b9f195e3cc1281a5f11b5a5b.npy +02958343-23f31f379d6a5136ce27281f3b76d1f5.npy +02958343-1836f75baa094cd9372ca62e6806c5c3.npy +04379243-4cd119aa7b11f3f54b3c42e318f3affc.npy +02933112-30cf0cedd661880e86d53ab0fe94e911.npy +04090263-469427702fd95c3c6314c3b6a3a65519.npy +02691156-5b815e2726656685823df672991ed66.npy +02958343-c58db3209e58872556f3b9566f5b3b77.npy +03001627-d5439bb962c3cc8579170a5f8beda902.npy +02808440-4d442c72b0083566ede9471c962dd6ba.npy +02691156-896508fa65b8a31c12b38b1d99376c0b.npy +04090263-5f68383c820c1bc4a67ac8a08d7e171.npy +02958343-a944ae569bbff87716abce8cb03e7794.npy +02958343-d4919d3f70b699152b12ea83455b0f44.npy +04379243-78a93c794aa77beb47bc3701b998a7d5.npy +04379243-2f5d2dfc1c8b75666c8f2acb6194d7e9.npy +02691156-4e2322d4f1c0d29df96e777471c18dbe.npy +02958343-2e8a1ae108dd0d89e8a3b392b986583.npy +02876657-edfcffbdd585d00ec41b4a535d52e063.npy +03593526-852c6ad14d32d6272b6168eeac2194de.npy +03001627-ed751e0c20f48b3226fc87e2982c8a2b.npy +03624134-90021da7c71f6bcbf02ee453ff283e26.npy +02691156-94ee700c27e2c05f84fcdb4aed90c145.npy +02747177-69d3b9c9321e3e0bad5067eac75a07f7.npy +03001627-5fe9ae9eb1ece960c423490470c47d79.npy +04401088-42ce5fc532b667bf9f8c6ee75b301991.npy +02691156-525f3ec38c3baa7a4944d3c8bf9547cf.npy +04379243-590128c134fd2fb9c1535160ddca1c61.npy +03001627-9b9a114cfee79bfb492d9da2668ec34c.npy +02924116-ba3a5c4ea765aa6dd01b211d93f47d40.npy +02933112-9dcc7002210e6660824662341ce2b233.npy +04379243-415d7746f792eb1de0445fc6d980dd5c.npy +04330267-cf1a57415ade5703bec56bff764ba78.npy +04256520-25ce64639b8817065510d59f3ab1ed64.npy +03001627-c927b1352027fd6916d8d4903814cf37.npy +02958343-53b6f9eb4337276473f10e6caaeca56.npy +03001627-769f2cb98735158a2334de46509d60b.npy +02958343-c5ef2eaae2b2d8673cd3add5aad1c863.npy +02691156-48c2f17fd1610cddf9b189ce48b45ae1.npy +04256520-c59ef7c56b4d184f9cd431573238602d.npy +04256520-58738b85e8a13c14380e1a7742e001bb.npy +03211117-b95414b9723439a6fd28950562697757.npy +02876657-595e22f425839eac2d4b0854f7611ed6.npy +04379243-fa09f5e809d1c8c983b3f8b7586237f4.npy +04379243-4a9a73e93f19ece06652506d959dc71d.npy +02691156-50e6ab918250ac797a663d343339f8e.npy +02992529-a41e693828a65064e565c13e00bdea3d.npy +02933112-9d2bf81532da5823b69348aaef501740.npy +04379243-9a70b1d07f3027719fb4103277a6b93.npy +04379243-27cd239b41129a13c19a59cdcb309b91.npy +03642806-ef6d92c90aeabf5becae27d182a3e41c.npy +02808440-b768643834bdd3eedc749e0740d903a.npy +03001627-9069ccc5fcf22878564eaedaeaa04f28.npy +03001627-a691eee4545ce2fade94aad0562ac2e.npy +03636649-db759b73923a7e36b9df6a8c2c09592.npy +03001627-c70c1a6a0e795669f51f77a6d7299806.npy +04530566-7d7fe630419cb3e3ff217e1345ac0f8.npy +02958343-35fc22147c160f501636a25380d820df.npy +04379243-6f97636bb2ac5d599856fa70a578baeb.npy +04530566-68d32bb51ab2050efe999a207e6e230e.npy +04256520-fbb78f2c30bfa014703a79ff0df43433.npy +04401088-b207b3f3617db6cb85089a13cc567dbd.npy +03467517-52abaf50a0739bd8cdb542a68600a146.npy +04379243-aa69a26be784dcd2cf004563556ddb36.npy +04379243-3eba5f6a09e87969b76e29c9c43bc7aa.npy +03991062-5bf7954ab8168f24e3849910c5019154.npy +04090263-a66887b692d9326b51cfdb4c9f126c12.npy +02808440-f901b929f8c976793321831d2245cf06.npy +02691156-3b3b2777be8b6b31ca8607f540cc62ba.npy +02843684-cca3e35970a665e56dcb36a8108f189.npy +03001627-5f76562ab6c843cb575f9747ff6fb5e8.npy +02808440-a9d03e90d548a19d412ac8cccf0c180f.npy +03001627-4e50015368a4f3ea4eb6addc0d23d122.npy +03636649-5a502ebda119949ef7dc60c6a4d98c25.npy +02876657-3de5abb596766c5380dd154b5d9c087.npy +02958343-79db6e5fa70b39467df67c910758dfc1.npy +04468005-575289640b8fe387a0c6c5e8898c5f38.npy +03046257-abd4fd596171d33c2d1b942ffb1336a6.npy +02691156-c0f9c28c45e7c8354f95630cc18536e0.npy +02691156-baa3e1edf8870f755f1a3e0b9f8002cd.npy +04468005-e6392c22c70a5735f0f5113376645c58.npy +04379243-707e63122691f0cb490ad276cd2af3a4.npy +03790512-9154fc120f53eaa8d42c4cee3f9bac47.npy +03001627-4a86ad0d870a55e82058afcc28d23393.npy +02818832-415db413b280c69f42d8a8c5af8997e8.npy +02691156-cbacce3a17e061251ab9df4be75138d0.npy +04530566-291e48a99be418846c03c11657c96c60.npy +02691156-8a84a26158da1db7668586dcfb752ad.npy +03797390-2997f21fa426e18a6ab1a25d0e8f3590.npy +02691156-48996e27f430ce286f67a5681eaf4d9f.npy +02691156-c541b8c49b5d2d8e99ad3ba13045dc42.npy +04379243-b420e0461893854bdf6cfab91d65bb91.npy +02933112-9cec9c8b65ec9e4f4c62bee40dcdc539.npy +04379243-d5f55cf498a7562eb000f20a5153622c.npy +03636649-98d9619ca934b01df51f77a6d7299806.npy +02871439-7167cb1a30852249cb08ed38616b96a8.npy +04379243-445528514535ca621d5ccc40b510e4bd.npy +03636649-88153eca8600ecf05b1ab0bf4891d200.npy +02871439-66bc5227baaedf84997000b44d733da.npy +03691459-73f855f34572cf984bb93d09975f5005.npy +03001627-cd47ea438a9387c0ee088de33038f12a.npy +03797390-52273f4b17505e898ef19a48ac4fcfdf.npy +03001627-e777e42470ee9bf270ae142beb408e0.npy +04530566-840d9078c31c188feae47c2aade5a70b.npy +04256520-5d1c69aafe90cc3114038d588fd1342f.npy +04401088-6456bafbb5a656fc487f00a15f77c99.npy +04256520-b0b0186fd16220d4917b96045c9b6dea.npy +04099429-1ada292665f218a8789f2aa296a418cc.npy +02958343-1782558e47730989b96212c8f6cd06e.npy +03001627-a8110dab06c9c72a2c528d33bca1ac2.npy +04090263-16556179cbf2701916b34c3751bc447d.npy +03636649-66cec0a2ab63d9101b6c273f8ff0e8b6.npy +02958343-a5047d31a855ffd1f339a7f0f377393e.npy +03636649-762b4e2cbb8e643790c2e24416edfe5b.npy +04379243-ddc91eea0d38268d616fb9ab42452112.npy +02828884-ec7c3cb273f857ca785c8f27b37ec031.npy +02691156-7442ad61d59fac8c7372dc0a2f1067b1.npy +04379243-7620cd93dbf32cce5213cec267286d18.npy +03001627-3c9bc4876a03093414b65ac180970edb.npy +04256520-385990d0223c92b5f3598efd14e493d5.npy +04401088-36ff3418849b9b8635d9dd2d03e6c396.npy +04401088-183e8d61b3c4edcc90b5b1d619d7013b.npy +04379243-1ba26b0ca7507edd7c8ffa57cf4ce53a.npy +02691156-2ec4d9949f80154b7a571401e6605fc2.npy +02933112-948709ebfb6cd6ff6f2222642bd41c09.npy +04379243-8ebb14fe46f63d5a98cfd47a860803c5.npy +04530566-eb05e72eb8f94a24816427daa1887efe.npy +02933112-786566b66299405a4da5feafe6f1c8fc.npy +02691156-195ca2eabbf7c735a8d66821ccb813fe.npy +02958343-60aadbf4a0a42360ab62a01524fcb1ec.npy +02828884-f1515c5d78429613e80dd430e11432ff.npy +04090263-e8f32ab6ba9ab7713a72dfa25c767709.npy +03001627-d94eeec9f2fc4d6c33fe87c69b83ce63.npy +02691156-f7298a13f6d1644472a4466eb772f128.npy +04379243-bfb2cfb2e454160d78cf5fa17988625c.npy +04256520-25bf067de33706e62bc36def1a7d775b.npy +03636649-dfb6553d8e04cbaae1263552aa9a2d35.npy +04256520-a4b1c819d9b606473decfe0ce0584f.npy +04379243-bb3aa93ba6c9a38afcbe4e14ff0c4707.npy +04379243-df5ac7a785ab39fbb5677466d30ffffb.npy +03636649-357c0ff8a3ddddf5902078d0d905735b.npy +02992529-6682bf5d835701abe1a8044199c77d84.npy +04090263-e9706e37ac92aa199d360253182ac1b4.npy +04090263-71b79bf11ce7ac96b839c45792f79dd9.npy +04379243-3836e0568d0ab079ffc6e457221b9271.npy +04379243-a9dfcb1e1ac5ae67468b43c22b6f785e.npy +04090263-86873de47fac054612b38b1d99376c0b.npy +03001627-32f2998a16e477163c4f66791e25960f.npy +04379243-18b58b179b73dc958c9e244e3fbf98f0.npy +03001627-331e1247f5672328826fc8d57346a2e4.npy +04379243-5d00596375ec8bd89940e75c3dc3e7.npy +03467517-d4b2ddb52e8dcd3593f0194265a9746c.npy +03001627-e14e8241e0bb563f64810cc21086da42.npy +02828884-8b8b59fc52257bea58e51facd8ce1a25.npy +02933112-cc492f2749d63136504721639e19f609.npy +03001627-fe53dcce9a30c5b5348fedb5a291187e.npy +03001627-a85e81c62bed11ea7f4e21263a28c500.npy +03467517-14038f17e185433993f0194265a9746c.npy +02691156-ce0c461237a21cefdb22b838c125a50b.npy +04090263-b5f52968710c4a4de1f2a1daf140ac9f.npy +03691459-7b7904e3d5ac33a65afb688fc9d0c0.npy +03467517-66b24797480ba515d57700c05b1862d8.npy +03337140-412dc6b03934e4984c3aee8e9d3a6ffa.npy +03001627-56c8c9cfb9e6b1b9fdef1c01cbd4ae0c.npy +04379243-d058b63b957076771d6ac856ecde9eb2.npy +04090263-bfa059271ad449e13cf7a43bad229f6b.npy +02933112-295502bcb6d0c0f5c59350d819542ec7.npy +02691156-276908a82ab3728e6283c6757ac506b9.npy +02924116-2270b5b1956c665e193d7855ecfc1bd3.npy +02958343-8bd6b3e216ac44d2d1e34356c50bf8.npy +02691156-f1b3408a3ba452d0c1ccec171a275967.npy +02691156-3a92789dfc5186dcfdbac8c3ccfc63c.npy +02871439-987f3dffca4d921835836c728d324152.npy +03691459-a5e412770440524b92981997d5df910d.npy +03001627-f06d2963ad258feaf5adaa9eef900be3.npy +03001627-b78f64455e41db28341ebff340b2c71a.npy +04379243-e1369c3a3daefef158df8eeaf3dad1c.npy +04379243-c172807c444475ccab610b0c94236463.npy +02808440-129d84a2d2e5242a6b448b8aaebb705c.npy +04379243-8ac2feef21274a23f45db6a75d78cb47.npy +03211117-12c3e644bc371f30366648d52e38fd70.npy +04090263-d21247f000436a8a374d02834a57040d.npy +04090263-de9fcce5174bfe09db181f2efd806577.npy +03001627-a50887c625042b48c862eec8232fff1e.npy +02933112-4db0db06f86fe48f4da5feafe6f1c8fc.npy +04401088-c978be9ff9bfb9c67d2c763bf3599a8.npy +04256520-d669c884e2a9274b1e7ef3c0866377b2.npy +02691156-69ed3801f4f6f4d1e1873a3963e0d14.npy +04379243-5d9f9ee95a7e1623fe9d8ee1a924ac2e.npy +03001627-389ed34a0c989e325fceaa39a8353bde.npy +04468005-1f628dd817eedf50bc80f94fe0a74127.npy +03636649-9c0b48006e3f6aeda1dbdc0360a4cc99.npy +03593526-1da5c02a928b8889dfd1be983f4bd279.npy +03001627-35d62c8a02fc15b1a2c5a50ad2499011.npy +03593526-ad64ff0a281c92b7eb895521e4d63cbe.npy +03325088-953ea008e95d811154d7082b34825ef0.npy +03624134-3a4f0118a57093cbf7c4ed45ce654123.npy +03636649-e569a4ed12ba90c220331d4c3b7d944e.npy +04379243-3683fdc45dc98b8955d054336de5edb5.npy +02691156-3c80dde1fb615ff5ca8607f540cc62ba.npy +02992529-ccfac9fefb0326003f548cb8701b2293.npy +02924116-311dcc47c8f639a1f3f27ff04a4459b.npy +04090263-8aeacdb5884311663716c1574460b140.npy +03001627-d75d1c46cff08f4767c8e42cd3ac65ef.npy +02828884-ab5f53ca60521a231aab721727b6a1b4.npy +04379243-36047e4ed31420904738a251b334366e.npy +02808440-6f1ecf3e720f20e7d63fb7225e5a4313.npy +03691459-8834ec44bb6d291490146e2a0489a257.npy +02992529-f3aac8f54f5f2a2f983ec12a2b33f18b.npy +03636649-b5a0f10269e2f4a6ba5342d638d0c267.npy +04256520-fb0c0e7d7094b64c8e5f5b49c9f5b3f2.npy +04379243-685865c8de58d7dad75b93b39461011.npy +03691459-4f152b01f056d0c35363d5176df02e54.npy +04379243-88140d7ce3a1f6c4664b3b9b23ddfcbc.npy +03001627-704179dd47a2282e676de9b6e111da8b.npy +02691156-4fccf49d6356c756b833a96759a020e2.npy +04379243-3c275368d3e30e775517495984cceec.npy +04090263-1cd506c69f575ba530dd2b88f7efae34.npy +02773838-d9015890f9691fd593daa1a1c18444ab.npy +04379243-6200bfa29b2912048b083202dd9c4b6b.npy +03001627-37b8604d852791651a648655355dc699.npy +02691156-e9c78deefc2950be62b600da24e0965.npy +02992529-9c26b9b0584920f1539baeab407f4a02.npy +02691156-a211cfc04bf47039e933de2bdfbab002.npy +04256520-3b3f44ac9d3245b1e7c7920f6a65a54d.npy +04379243-599f4550ef24f59d19fb4103277a6b93.npy +03001627-ccd49951295cb4cbe139cf2f6f121cad.npy +03691459-774214a85b87204c33dbc1ea1716bde.npy +04379243-4b4ae1bfcf9de312d1dcc55e36186e4e.npy +03790512-46e38cf88b07de0ee2b85785c47c5d52.npy +03001627-6be6d6ae38d8aca4dc2cbc0befb06e1b.npy +02924116-f63095945ba79d10afe1d4530f4c6e24.npy +04379243-75e9e4fd6c512c92966130541a711692.npy +04379243-58c234e30f95394f61aa7729a1bc4626.npy +04379243-1b6bd64fda74bdc4d6983f351200ac6a.npy +03691459-542bc1ef866548c3d24fc75b2f944a91.npy +04379243-bcd046749f03aaab714531f0291497fd.npy +04379243-22c470174c40a0c33dc1643807625350.npy +04330267-c89edade3d122c535eb64c1003065596.npy +03593526-a1fae2bdac896ab83a75e6d000e08290.npy +02958343-73beb19621b7547af8a3d805c6a10776.npy +04379243-7a42b366e7f1da98a5d446d7637cc06a.npy +03636649-25f1a1563f38912250f0b0248b30425.npy +02876657-6ebe74793197919e93f2361527e0abe5.npy +02828884-fc3865756db954685896bab37ddebe7.npy +04379243-65624fa127a2537df3c9c1464e55d580.npy +04090263-8f905b2da32727682a2679e9ffca8e38.npy +04379243-d3a5d161ca44660d4671d97b0fd17f51.npy +04379243-6c10998b950dadd4cea003eff0268278.npy +02828884-eedc7453ee8b1cff9ca96b2737246fca.npy +04090263-8ec183fdbf3fb696e1f2a1daf140ac9f.npy +03691459-be83d48fc695dca62b4e8a84a498fb09.npy +02958343-371c5e74c66d22d451973ec97171fea3.npy +02958343-c35ebd98decdebb9db7706d93442f2a7.npy +02747177-e7682974949a6aadea9a778eef212687.npy +04379243-9472c006a5d35b9ab606ece4189242ff.npy +03001627-689dce303ca3781c19fb4103277a6b93.npy +02958343-7521398f7ab70a073c1d9add3a87bd2d.npy +04379243-889c9aedc4ba47592fb02b79d375eea5.npy +03325088-e9e2bbfded7eaaa99e6460c75101f5b6.npy +02691156-97eb9cf6c8a11a389967b23b351d6841.npy +03001627-9a42cff883cbd358106f706dac6c58f0.npy +04379243-d6577674aee8f8cbe986c6d94503b284.npy +02691156-5a815646537e3b39f51612c193433f02.npy +02828884-16592a1467b7751fbb9faba74eec2c74.npy +03001627-6e06af0dba36d9d8f3f3ee5e8ea028d6.npy +04379243-bb84310d8f022346f2b931201029bc76.npy +03001627-5421802bb8e6e9781ea54e1e7afcaee9.npy +02958343-3373140534463359fc82e75321e09f82.npy +03001627-e0a011619d6c9df19f1deb04fb8ae481.npy +04401088-e483787b7f9c606042f892024869e751.npy +03001627-511a03618c9bf2e7fa762d956b3074e4.npy +03636649-ca6812040234d1ecf57534363fbbac3.npy +02808440-c0249608f553686f3321831d2245cf06.npy +02691156-31a06c63b8932cac8bec85d7b4e1ee67.npy +03790512-e1382731f6fedaefd6207a00f6cde01c.npy +03636649-4f3f01e4b17d018ddaaf0f74e020d2dc.npy +03325088-ba1d52a1f3ea97f7ff8848ee936b8531.npy +04090263-39dae1fb0cd33173d2c901959c439025.npy +02828884-918507f83ae9eb64ad5067eac75a07f7.npy +03624134-4e031e214c34963161eb581103cb1fbd.npy +02958343-72b2c7b2a49d46ac2a9eb0f146e94477.npy +03991062-d7b4c88081a1e59b5117083e4484ae48.npy +04530566-b93e07e84bdfd620f4000b62f164055f.npy +04256520-1bfe2d5a13298b40eaf288f952624966.npy +03593526-fcaab68d0507e3255576bbe3889cc2ca.npy +04074963-c72ecbad07876e71ab0467582043bd43.npy +04256520-f1d1fdca528582dca6c4f2c64bf812b4.npy +03001627-b267d11790325e6cec7cbf3284585a40.npy +03001627-e9068bd3f1f5e59b3fa02fd212ba0e5f.npy +04256520-16a5920c004800ca76e9713f57a5fcb6.npy +03001627-b1ef4c02ac7a0b28632c9ddc45ef4651.npy +03467517-deb865bdb628babd1ea49e67c45d0098.npy +02946921-a7059f3bf782790654976319206e3c9c.npy +02808440-184db8d39477c64f1475ac52df31feb8.npy +03046257-3a1e36329722686c2c406efbeb1811b0.npy +03691459-fba117b56b6829d0cbd549969c6fba9f.npy +04379243-eed0984ed7a72e99cd1c64069cf52e3.npy +02747177-9afa30986badc1f956f6fc4b4ce1db04.npy +03624134-70b6b3ba6a27fd6f782db73f915dfbb8.npy +02958343-62128b128c9a54c6389cb55d070b61d3.npy +04379243-1adc25c3c29e98c454683b99ac4500e8.npy +02828884-fbed7adcac3217912056b4bd5d870b47.npy +03001627-7f1164e82e3a975fcc1908493f380315.npy +04379243-9c17ba009a1f68a5f31d4c4da1121d06.npy +02828884-3abf9811f26c9752a9b8d9d3b5cf54cc.npy +04004475-587fcd5e8024ef687a9cf77b454ff9b2.npy +03797390-df026976dc03197213ac44947b92716e.npy +03797390-586e67c53f181dc22adf8abaa25e0215.npy +02880940-77301246b265a4d3a538bf55f6b58cef.npy +03046257-6766bb45cfe7be90c9fa91c1b1e026fa.npy +04379243-df9a0a4a35c0a1482a610b86c623da3d.npy +04379243-2fd71db402f3939164a62403221fd59f.npy +04379243-335bbef681cee5b46b3f6cce098c8918.npy +02958343-885a8852bda6bad7774c883319711a53.npy +04468005-cf8db3c714acb984239fe5909143a17d.npy +04256520-13d0d8dcb20c0071effcc073d8ec38f6.npy +02876657-d44472ef7086538676bb31db0358e9c6.npy +04090263-7ad1c8369ecca95ffb5c1b0f759e2bc1.npy +04090263-8be6c2867bbd8d27143bcc14d754d44d.npy +03691459-4a4132b1bbc364f573c609379da5b9c2.npy +03001627-ce8e6c13899376e2f3c9c1464e55d580.npy +03001627-cd5007a237ffde592b5bf1f191733d75.npy +02691156-a8471560d4dd5a31ebc34aaab30ca460.npy +03467517-de630541c5d2a44e4bfcfdb26b8cb2c3.npy +03337140-18fc975ac7977ce64c3aee8e9d3a6ffa.npy +03211117-fdf3953c665c36fdeb47c06d7d8c2d65.npy +04256520-3140b8db45212ea0d9b53420a5458c53.npy +04468005-4a4e193b21105f90ceeb72b524f3e0ca.npy +04379243-d6e677600a93bc118ac5263758737a81.npy +04090263-28f2da42122d400d9d5d6d3d4bb65831.npy +02924116-5c718c46b33d804b417efb0412430786.npy +03001627-6c413dd8728bc004d22730b0728b2fc9.npy +04256520-13181141c0d32f2e593ebeeedbff73b.npy +03001627-b81b9e3fe60a49bc55182f299fe41fdc.npy +02924116-47fbe55b7f5f82287e7c9f487eee4fdb.npy +03467517-935eb2290503cc0a343b0b12983b9982.npy +03001627-a3acfe6f313ab881bb088904f7cb154.npy +04256520-d3db0f5bf70b9e32f7823f022ac104a2.npy +02773838-cd1e74f430acfaf0504721639e19f609.npy +04256520-267dcf5952e84873fad6a32f56e259a2.npy +03211117-46cb55835a88ca85eba70eb27950150e.npy +04004475-a945e3df688458ae8075fd3e4c0fdb7.npy +04530566-8bef56b64003be1789f903fb361de4ca.npy +03001627-f76d50f900b034af19fb4103277a6b93.npy +02747177-dfd96d49538de0008a606c63493ddb7c.npy +02958343-8058b048fcc7730ffaf9aa0fdafb5e7c.npy +02691156-e7e73007e0373933c4c280b3db0d6264.npy +04379243-1c2fb38795e6e3c858df8eeaf3dad1c.npy +04401088-1ac1e6fc09611ff049c647f92ae11714.npy +03636649-f79cd66d0a369bdb29a42a0444436860.npy +02958343-a387407d49e209fdeea60824a43a0b.npy +03211117-7c889c3c89dd0933ce2fdea99c5936e8.npy +03593526-aaec691558f7bdd05ca1f314f1afc186.npy +02773838-157fa29bcf6b890d76bb31db0358e9c6.npy +03001627-4bb5877100a76cf5bee7d080c8f1e1fd.npy +03001627-c51937167dd0db45f7628281ecb18112.npy +03593526-b4b7ae650665ff016daef73a0864abe1.npy +04330267-82f134ee4f0dc5ce74dfd914e703ac1f.npy +02958343-186646b16a670b7d69a949ac99a843c4.npy +04004475-e33f0d779f8f0f8127373c7dfd2344fc.npy +02933112-7a051550f229c9a75588a2543ef0b0b4.npy +04330267-a349baf8780207242d3c7a83a255982c.npy +03636649-50683065aa8bd6bec308dc58cdbda034.npy +04530566-78e347c044ac743de2d4c157e5bf1dde.npy +02924116-c20b42745b5b344ef2b99dcb65afc747.npy +02958343-eebc48c480032e45473f10e6caaeca56.npy +02871439-e8f6e0350d99de06be1a3993eff3fa1.npy +04379243-a5f3c1314c027654f12d7184a2ad3430.npy +03001627-44a2a3952ea2315ff51f77a6d7299806.npy +02691156-10eeb119fd5508e0d6d949577c389a84.npy +02958343-da5ee2c950a848f0af8a2e210ebd5168.npy +03593526-92fa811a0cc76fbefffe8e781bf3bc2.npy +04379243-ebc897217df591d73542091189dc62b5.npy +03636649-eb0d19ccdeb98cff88e7662971dc736f.npy +04379243-7147a78bce941b6e9784d1512b6b87bb.npy +04530566-fa8af8f2bedb0d461f29de30ec1bf6a3.npy +03325088-ffbce2bc2d46ad8c3c8d0fdfb1cc2535.npy +02958343-80bdcb908765eb9ec349f2dfac43a4cf.npy +04379243-dcab9aad5876cecd597ff152ef65c9c3.npy +04460130-d4dae64aeda5a50f4f87ba59623453fc.npy +02958343-2a554a704a27618ea37f3fc191551700.npy +04090263-926ced4104fb5d572f63bc22c4d8bf9.npy +04379243-f158c5c293106fb17af2ac6660aa6669.npy +04379243-aba115d7fd94b7cd4bd9e0690b0b191.npy +04004475-41c5dd936949a6a083da7f4ae241cd9.npy +03642806-b3c5bb4eb4c797ae6984b767317d33c4.npy +03001627-ed40add41826f68ab76e29c9c43bc7aa.npy +03001627-758bc4143fceac844224ee0743294f79.npy +03636649-26e6dc505f376ceee6597d391ab6fcc1.npy +02958343-ef8e257ca685d594473f10e6caaeca56.npy +04530566-fed3590199534e0f300dee22a3d8ed99.npy +03001627-51c858aec859bafad1e274d497440a3e.npy +04256520-b598d571630181e171e07968d18a8d52.npy +03001627-56b171b1f1521d27291d12adef12641b.npy +02747177-4c8e43db118f78c85db5515d1151e20c.npy +04379243-73ace155e7a4b1989d24dba534412246.npy +02691156-b65ac56abaecc35bedcd88be6151afb4.npy +03211117-61a81475b820a85aa73340dd35da57bc.npy +03001627-ce9cedc58c77aab4b5a19b1840ec7af.npy +04379243-a7c9de3c0808584ef827070eae09df.npy +02828884-e60121b8e4ef137bad5067eac75a07f7.npy +04468005-e344ca94076866f62e80200f954ca1fe.npy +02958343-e6ec389325de7ae5becf71e2e014ff6f.npy +03001627-522eef970fa6d87b7d9c441a2a657ea8.npy +04530566-6ec6d6a7124542c1973b07394b864922.npy +03636649-356224e2ce466b551218479e9cbf7bda.npy +04256520-a90cf2c399b7052cd4061e538ffc8def.npy +04379243-b37b72a898169c971ff2429be93a82ac.npy +04401088-bcbf0ce42d2b0f91abae9246594d3f7d.npy +02691156-220a911e2e303865f64801ad2940cdd5.npy +02828884-9787be3282d13a159a3528690d225ee1.npy +02691156-afd6b2789e486ad4663191fd557d3a61.npy +03001627-791c488a167bd73f91663a74ccd2338.npy +04090263-2391fdcf2158aebf9c27f9a5387b5fc.npy +02958343-8e308d28d463427f43f0e92e826556b8.npy +02691156-caa7e70beee4543f42c20743f866e1a6.npy +04530566-161d9d8a1550390ff4000b62f164055f.npy +04530566-696136ed6723971649f471d054f6b528.npy +04330267-b947b4dab047cc879d1589237baad02.npy +03624134-a33847e9c32c1afc93ac017b81605788.npy +02691156-a6b09752263b1de2296d88107d065f6.npy +02773838-4a175db3a8cad99b5dd5ceb34f6e33d9.npy +02924116-41b8698a72385b7c52470de2774d6099.npy +03691459-b43daefea1c1e5a5b8cf54556d95458.npy +03636649-7b005e23eae2768eb08c032bedc99529.npy +04379243-eb291380d399ddebafaac116abdd44e.npy +02691156-4982bea0a007c19593b2f224b3acb952.npy +04090263-e5e7552e8dd1b5e9653fe2b064cca38c.npy +04530566-c8f85606ab95f0bd75086ae01906f5ab.npy +02828884-d8a1d270154b70e2aa1bf88d515bc6b2.npy +02871439-ac0710b8484a44fe20dd2dd4d7d7656c.npy +03046257-603ff80e374621a69d4f807ccb693a14.npy +02933112-7ed5c429313f20e079bb09dc5605a57.npy +03513137-3e3e8a71c208d991226eabe1cca3e850.npy +03001627-e967ee5f0790d685286e59f068d9cd0e.npy +03790512-295de7567ed18e692692003428d9fde9.npy +03001627-7fb336186da77367962800be79c6e52.npy +04530566-8790881fbc0331a87cef2df31bcf9d93.npy +03467517-b36971c158d49c94d57700c05b1862d8.npy +04530566-7f8d800b3fce12a7874f0e42f84eb4f5.npy +04379243-8a545c071537d55014038d588fd1342f.npy +02924116-79bf4c4574bc9c4552470de2774d6099.npy +04379243-e653570cc6bcf8783f9f131076f84791.npy +03001627-ec25a41ca233ed096e5a467428553af2.npy +02933112-e0d37d661f26e9eb4b8710a3469971b1.npy +03001627-61fcffc9fa0995dcdeeecaed91450a4d.npy +04468005-119446fc9b593c594f57a4cae005e56a.npy +02958343-335b3ad6f7a96bf251a95aaa6caba1d3.npy +03211117-87f8c79413300052252cde31666379c.npy +03636649-aca8867b962deea91a8781c24b79ae57.npy +04379243-5e84a7deca3e153ce1c2d3f86b7aa002.npy +03636649-78f85448752ae2963873cf6e670bb8b6.npy +02828884-69259c43d80d4815cb2a965e75be701c.npy +02992529-b72ec892f88ab015433d4f1444243caf.npy +04379243-2bd90eb4b9aaff9af84b0be7f50940eb.npy +02691156-7b134f6573e7270fb0a79e28606cb167.npy +04379243-efe6257c1073e003c862eec8232fff1e.npy +04090263-900211102042c2d8fcfb3ae2df2f7efd.npy +04379243-54efc0d108cce07ee166717db5dd896a.npy +03691459-30e85c002b800f2771fd733ac7e95be9.npy +02691156-71a3c6e1c87c8b42233f6392bb87bbd4.npy +04379243-a088285efee5f0dbbc6a6acad56465f2.npy +03001627-b475d6f1cfb6eee21071105723d4cf63.npy +04379243-34bdbfbe94a760aba396ce8e67d44089.npy +03001627-2c40da664d4e736b972d35c68e1bdca3.npy +04379243-601fea1fbb6d791589ccdb4a5b6b972a.npy +03001627-802c4ba91b2d1dde9d03faeacb82516f.npy +02958343-43874d4b5154b6a0e3a6d6259addf247.npy +02828884-393bc2b638ed33fd201085e80edb26a.npy +03636649-83353863ea1349682ebeb1e6a8111f53.npy +04256520-eda8029bfa428c38f6ab3cbe0907fba9.npy +02808440-b3dec10ca40086343af30a3946d92feb.npy +02992529-79912d77eb2866af4e964633a1b1c39c.npy +04256520-e5d5c0cfeea2fdd11b17743c18fb63dc.npy +04379243-dd7e82f0ccddf0cdea3769fcd5f96f4.npy +03691459-ccd635e4cdca96e33b6e05aed261d1e8.npy +04401088-7483bc04eec05077b6d41c42f7ade8c8.npy +02958343-be7fe5cfda34ba052e877e82c90c24d.npy +02876657-6c56bd467b8e6b7912c4d7e462c15a1a.npy +02958343-6ee9f222a540a905e4b68d3b17c43658.npy +04379243-992c576d8efa6d5870c3ad1df4ebf5ca.npy +02818832-a7b24b5ba84a6bc6545580104c9b8ca0.npy +02691156-b848dca797986bd69d175f8055b49b9.npy +03467517-e50dfe2b13d51ea1adb66be7b8c12fbc.npy +04379243-24187332192704e4519259b5fe9bdf5d.npy +04379243-77a115a1ad9d7e687634fef39c2ce2c7.npy +03636649-41fce4197aad78f76fab5a5e55726ee7.npy +04379243-e70d9645a26a4e941832ad614f693f66.npy +03691459-576e85200907fec189d3b4ea8dc19f36.npy +03325088-2a7ffc2172f9a2ddb362845c6edb57fc.npy +03085013-9ae261771f20269a2cc2573cdc390405.npy +03001627-3dadf67ebe6c29a3d291861d5bc3e7c8.npy +03797390-1ae1ba5dfb2a085247df6165146d5bbd.npy +03467517-6565cb5e586aa68730f83c7e8a7d80c9.npy +04090263-8bc74fea7c5e6f05f95499016f29fbc4.npy +04090263-decdf532717c45767a9bdfb16682d944.npy +02924116-10f5a8abbf0caceb34c10c89302b9aba.npy +03001627-f4de0c72715e193deb1f243bab39fb29.npy +02818832-9f71047cd23dfc00d81aa8b56a36ec8.npy +04379243-ef4fa923a1c2a3215f25c76975ee64.npy +04379243-7d4ccf874d0f1060d59c95a5810fd5d7.npy +03991062-e23d3038f81e65f498c5858b88d0229e.npy +03211117-5cb4fac8452906f66ba14bfd91a75020.npy +02691156-35611fc0fecb7a795e02646e6b8fbe8e.npy +02828884-c63561b50109b27bd4d8765e3910f617.npy +03001627-741bf2e8b46b3082720f4a96fb7a3b3e.npy +03001627-519d19f3adebd20aba49014d9a3afe99.npy +04090263-37914b7cd5c02da8fef144202cb2b935.npy +04379243-2a295b1bbb386e2f3ffa3a50996ad39e.npy +04530566-d0afe316f1648d22b5d16f91270f7fa2.npy +03001627-752edd549ca958252b4875f731f71cd.npy +04256520-99ca3d9ee631247f36d8dd30a594b2af.npy +03691459-1f2a8562a2de13a2c29fde65e51f52cb.npy +04468005-ef1ec257503672bd44df2c169375db7d.npy +04468005-1c416135207d17ca3023a62310645ee8.npy +03593526-8f0c5b50ea07f88e59c1c78579056df.npy +04256520-431ed7bd770ecdcafebad4f49b26ec52.npy +03001627-67d296fd51dddfd4bda72093f9b5aa73.npy +03467517-7eaed9980af85df32ab677b65be9086c.npy +03325088-4bcbe4f02228788d50da8b99982a3057.npy +02958343-e2ceb9bf23b498dda7431386d9d22644.npy +02946921-bf974687b678c66e93fb5c975e8de2b7.npy +03325088-bd0a6045194ff62176c18e71fd49c4dc.npy +02747177-91465736fa174801ad5067eac75a07f7.npy +02992529-715a2661c9be051bf4ede441a9f9be4a.npy +04256520-6c8364730b3c64a43fddc4e3be2d83c8.npy +04379243-d1efb527d5cc9f98c1dea9c21912d169.npy +03691459-a4180d6214012dc7363d10d9d37a65e5.npy +04379243-bf899a2e47420008ef1759e0b43f0fd3.npy +03001627-44456e87be145a703c8d0fdfb1cc2535.npy +04090263-a6f0f0aab2ab2591341b8a806253912c.npy +04379243-ef72310b39244eca6aa35752fcfa44c0.npy +03001627-22f7d658bf2d65da2933f312813ce997.npy +02933112-9edead26059cae09e3f7a74e12a274ef.npy +03991062-ed1faa6575c8b1cb31096c6dfcac53b0.npy +02801938-663082bdb695ea9ccb2a965e75be701c.npy +04379243-8e3a92a1f9155845d810b14a81e12eca.npy +04530566-849f7c682fe9160d8c1a083ca347f005.npy +04256520-1bfb1f52f2200860c3eb4329189b69dd.npy +04256520-addd6a0ef4f55a66d810b14a81e12eca.npy +04379243-559582261b021b7e4f987dd564b75f17.npy +04379243-f01768b8b8ba025ee45ef4135c266a12.npy +03001627-74539775b5ff9bfdbd935a20ad27255f.npy +04256520-86c169593e5584233af1c639b9b2ebcf.npy +02773838-8bc53bae41a8105f5c7506815f553527.npy +04090263-9718f974dbf0c599f0e835155cdd677d.npy +04379243-c33d942c6f7d517d346ba1ca782be6d5.npy +04379243-93040a14fad5588ed889130b88839a0c.npy +04090263-63ab37430cb66270b5666ac9dae008e8.npy +04379243-90be5de0faef91ef3f7e27638e63d848.npy +03001627-28673322a55c9935183d5461e0e1f71.npy +02958343-51eb6c713070607db9cc180a886c1254.npy +02691156-59bb001a6f7301b0bb00d3d91443cc67.npy +02958343-d18817af1a2591d751a95aaa6caba1d3.npy +04401088-38afc0467599bd6bfa13d53e5e4a7d2a.npy +03691459-97e93552e141ae2432caa5592532fb76.npy +02958343-332ac5346c7d3c0f8e35db9103756ad5.npy +04379243-d95fe848b19c277a1fd3f440755dada6.npy +04379243-e537c592fdd7f7b7c3bd24f986301745.npy +04004475-f212a6246d96112d4a418e49f65931ae.npy +04090263-6bbfdbeba3b0273316b34c3751bc447d.npy +04379243-21136301f27dc9bf84633b41c8a09fa0.npy +02958343-b9786e1b059a1712ca92a4cdad802b45.npy +04379243-7d0c5e28089c2b7bd99e852ee772dfa4.npy +02691156-d777b1e4ba72cebac5353b0f3cdec54.npy +04090263-3977db3c5730fc7216cf8b1cd2155e02.npy +02828884-a76a3d33ac6c3c65d46c340938e2ff1c.npy +03642806-234155f4192ecf3da97e5dec8972a635.npy +03337140-a0a47668bb5a53769a5d5a8c4f511248.npy +02933112-b12af552392f92b476e9713f57a5fcb6.npy +02933112-aff3488d05343a89e42b7a6468e7283f.npy +03691459-6995acbcca6f9167f5e02330ef435fa.npy +03991062-63c783fe720dfeb06ba14bfd91a75020.npy +04379243-72edff728d75b0b8f994e2a430ba61bf.npy +02958343-ccca16b8302bc8bd13ded1857c15b5b6.npy +03593526-18b41cb029cf7f6c2b151d8b52c53b90.npy +03642806-9297e108b9780fe7da0ccb8671dd235b.npy +03691459-f046081ff90ebb6dce029fab54b6cfbd.npy +02880940-a2841256fc6fd90da518b93bb7233de6.npy +02828884-c3feda2ac776a972b8962f874d138696.npy +04379243-218f7d1742293b9b2f56d03f2a22adfb.npy +03691459-6bf052e16794f2a73e1b2d018c0512.npy +04379243-47c51069048eedfea9646a2bf24db0c5.npy +03636649-79b93ef5e8928141a54a0acb16609d15.npy +04090263-458578892b309b2080c9c53be28cd7ba.npy +02992529-1bb65c38e6b563d919bade123d9b1a21.npy +02876657-437678d4bc6be981c8724d5673a063a6.npy +02924116-46e634c8d00e9f89308dd10eb9e6032c.npy +04379243-c9221b4eef51600ad9deb3f829cc2475.npy +02691156-398ff83ba75191f050405f236096897d.npy +04256520-d13a2ccdbb7740ea83a0857b7b9398b1.npy +02691156-9b60b20ea5fe6f002a2fdfabfb4182ed.npy +02958343-6c1568ee8807fb73aa69dfdc5532bb13.npy +02808440-b1df1ec87212143781ed34698a1642b9.npy +02828884-b90a642198dfd67ba6cf6cbb9f4c2bb.npy +04379243-ed00de0ec65a54c823ed665630afd1ce.npy +03001627-f54c7cbbd49ec8eb429c1439cde9f6d2.npy +04379243-4489bf9e90a6918630bbd4cddd04c77b.npy +04379243-eb984a4ef0dba0eb445e85eb534460b0.npy +02818832-a0e83139d41e3765e2b4cc1c7993e4b8.npy +04379243-318f4fca1278ea7cab0467582043bd43.npy +03624134-a205f01fec2d4c78c1cc4ae0ecf50bf4.npy +03691459-a82329a937432afe8d28f674ed08c521.npy +02958343-468be6b80d1c7dd655ac255cda83e91.npy +04379243-fc31999571a8bf64ad5d470346bc4d15.npy +04379243-a35771ed1c74b778101accd22c701b9.npy +04379243-8334a19ba0063c7faac58be63ab4013b.npy +04530566-4f9d7b905bdd80792b786ce268ccf414.npy +04004475-2af74548033015f453227dcd0d547ba6.npy +03046257-1f7441e3dc465f1291e12c4c8cef305f.npy +02946921-fd40fa8939f5f832ae1aa888dd691e79.npy +04256520-753e1bb8f3164ded7b3ec0bc4f26f615.npy +04379243-6c46312d5a6b81a59e4965f0106e00d9.npy +02876657-b1d75ad18d986ec760005b40a079e2d3.npy +02691156-3db61220251b3c9de719b5362fe06bbb.npy +02958343-d4103822895075e1c6acd56dbe00811f.npy +02808440-2c62b19b80a63f443321831d2245cf06.npy +04379243-78f387d6eee94759db6f3ca49e992ad8.npy +03467517-80f8b25d8dd77add93a644dadab2d1d1.npy +02747177-ded74a76b1a4dc8ecb2a965e75be701c.npy +04379243-c8ba87c9581f9122f51f77a6d7299806.npy +03593526-fe5561103c4e12864725f67267e31c89.npy +02958343-7cd83953000adce622cd6c209adfc63b.npy +04401088-4475473d3a96860621844676433a0aca.npy +02958343-e97af5444370eaa95fae7711b4095f8.npy +04090263-c44f0aa417ed2a77e270f84701afcd4.npy +02691156-150fd58e55111034761c6d3861a25da2.npy +02958343-8c264b10c4ec3e91fdeea60824a43a0b.npy +04090263-ac57851b846a48529f433921788191f3.npy +02691156-a287dc5d0e28d3d3325212819caa597d.npy +02876657-452c562f86da1ca7bdcda0bf7e7b4744.npy +04330267-68bd9efe9fc3373f47622e8cc2e641a4.npy +02933112-b38a8896aa33692098605fee62c12dfb.npy +03790512-f93a67db59f4a29cb37378f3c85478b4.npy +04256520-b6384ee46eec7bd5df8d3317f6046bb8.npy +04379243-6d22194fe700af402b5fb024f65f6da.npy +03636649-2522a20be5c204afa5534ff9c862888b.npy +02933112-4acadee1dadac64e4b8710a3469971b1.npy +02992529-5286f018c374d3ec3f7fe3cbfc3d51a7.npy +02992529-180f36e0bdb9b33f53de6f45c4ae68a9.npy +02992529-c202335fd3dccf9d45e2a4e5729b970d.npy +03337140-81bfa2ff00f5726a336094a98bcf39d7.npy +03691459-f150315ffddd85353ad55e05c29c23ee.npy +03797390-99eaa69cf6fe8811dec712af445786fe.npy +04074963-29310c9b5bc234155eec6d8d24f1fde1.npy +03991062-b4610dd2047073ef1781e1106734ef2a.npy +02828884-a3f987a1f22abe81c01b94c5b8c30315.npy +02691156-87069f21b11c180799a771d197c7b487.npy +02992529-4f3c84ef24e1fe6f3b41ed175964f6ee.npy +03636649-c603039e59ac33a0ce1bab91cb13240.npy +04379243-91919e69d7aec2b740dc81e448174af5.npy +03001627-f347f2a3d85c9a823fa92d98173c06f.npy +04379243-c74f1c411bdf7f57d0efae8dc996b9e.npy +04225987-56c6e4dcf52c32fc1768eb6cdf70bfe.npy +03207941-4a4d00a00e723983df3a1b0d597ce76e.npy +04468005-8f7eca0b9483de30a814ca8f1d6af9ba.npy +03691459-3738550fa707533073312da09abb660e.npy +04256520-325fcce8c386f813e20babf15421d6de.npy +02828884-515716e2bf805c088430b7446f9e1252.npy +04379243-10f3c10837232428c3bd24f986301745.npy +03467517-43884c4afd9e97d123247d005da93d43.npy +03001627-b11640431506c15489452a0032ea575.npy +04468005-2cebb68aab385306f6fb0164eb28c4c2.npy +03001627-3eef51c1ba49a32ef73a9267136cfb76.npy +02828884-4d1d28d15b19f9101e0e41d96d3d0a78.npy +04530566-70d4ca23f31a5c4373c03aee5e8475d4.npy +03211117-8007344358703f62d26c7f75d64f049f.npy +04379243-15d8de2e2c672a445af983a27c524ad0.npy +02880940-bec41cc7f631e00b1bf40e92cbe8569f.npy +03790512-e63a6a3a0c9765433d6587690e56f61.npy +03001627-331bfb4cc56f09e201cbed672acdcde.npy +02933112-1624e80fb20e12741bf2b66b52bf6885.npy +04401088-ef16dd3bd944608821844676433a0aca.npy +03467517-7d81905ed85f66f40c20797381ee39f.npy +02691156-f4818cd7c0701fbe752556d244bfb42b.npy +03467517-3243edb05f5e8803ac61a2f8346a8f.npy +03325088-68a77b120dd7a73b362845c6edb57fc.npy +03001627-2fd314d0a19433c62c37553db37ec752.npy +02876657-61847ebb20b88ce2a62e98cb10d773b0.npy +04379243-c85fffa8b368d05663191fd557d3a61.npy +03467517-a600151f96c1f1ba2c3755be90ec8862.npy +02924116-5f36b7a19c0f8308576927b79fa8f91b.npy +03001627-508306f8ddf1b54c41cc9e8c39b4e399.npy +04379243-6235d7bbd30566e4c955e5ed03ef3a2f.npy +03001627-35c2de57ee36f652492d9da2668ec34c.npy +04379243-d8d504a5e90e5b48c3bd24f986301745.npy +03636649-21e25ed232808a5a6fdc47d9bd513767.npy +03211117-1dccc6eee1ab6f942d692d2ec5374fbb.npy +04256520-fba76a325f400c597178e3cb5f806466.npy +02828884-445230afd5a0eda8714b6900bef4d88b.npy +02958343-794fc3e07d3c5954514e3d96995c555d.npy +03467517-e0e7905f91530fcc633c3142a206ef4b.npy +03991062-25a43049dbe332ed30cd51d117004d92.npy +03691459-5faca1b9f9a94e379a1e7168a7eb421f.npy +03636649-8f2eec27fa65b6b7ef76898f881b76a.npy +02958343-ad41b5992798d44bc350327861730790.npy +02924116-b4911496c498eedfb0912560089ee415.npy +03325088-92112e7fe6e4c131b362845c6edb57fc.npy +04379243-fc1956b87d9cb195f5854716eabccda7.npy +04379243-40fab70cda2e2dc7beedb4c8fd29e2d1.npy +04256520-6897c646edcc98c149d579ea0e00a990.npy +03001627-b22405009444df73d27ba3fc43e70958.npy +04379243-ff127b5ab0e36faec3bec646284d5a6a.npy +03691459-da21a8c569ff0ac4a7c719349406e0b7.npy +04379243-a9206327ea5b37d75fb62d44a047792d.npy +02992529-35dc3f0f2f5fe8d667a434dda72a2c24.npy +04530566-4818277b913b682a3c3bd8d7abbd3fc8.npy +03691459-9821d2e9018233f665a0f3090522e03c.npy +03636649-94940283714fdff6244ba644cf33cb2e.npy +02747177-37f1daa11b023fdf81faebbdea6bd9be.npy +03001627-67fe832a22b91e6c54ddc93d2b7d3d65.npy +02924116-5c7d98a481c9fedb5024b77c58783478.npy +04379243-25bca46cd4b9c517d1bd956578bfe63e.npy +04090263-dce3a4c4ce2fa691e777176cf1197154.npy +02691156-25ae9c70ded5640ac2a9d7232db0ed61.npy +04379243-77b83ff0d0eeb34e6349f6b5431fb3d1.npy +04379243-62fd8ef531c663bf6fe2eb61cd6e74e5.npy +03001627-dac4af24e2facd7d3000ca4b04fcd6ac.npy +04090263-ab1bf0d24526c51db524fe86a5d055d2.npy +03593526-d6209472e79d0a2422b13c48c34706de.npy +02876657-77c9a8391c708ae5940806ade53ef2f.npy +04530566-15d805635f77420ef724cdbbd599557b.npy +04090263-2eb7e88f5355630962a5697e98a94be.npy +03325088-f2db780ff630c097eea9975640c4ae20.npy +03001627-4ebb653961d95dd075c67b3b1e763fcf.npy +04256520-81d5e6d8bef76a51ba6c2a353e21dbe8.npy +03636649-e1ecd3a4734b91fffcb8d8c6d4df8143.npy +03001627-57d4b5a07e67c24af77e1de7c7a7b6e7.npy +02691156-16689e54c884aa01639c7058eaf33ae.npy +03948459-c344176cc45786e35f08fcff2175b4c7.npy +04379243-d16b6d6daed62ead49936479d30607f4.npy +03691459-8c18ef2a9170a8144884161c20b458b0.npy +04379243-c5087fce38b009ae30bbd4cddd04c77b.npy +03991062-93c837235aa98a7ee685b534d1dbc410.npy +04379243-f7bb30d9c073c0be786dd1f2ad4d8c65.npy +04256520-b3cea4461eb14a3164d6551b52610c81.npy +04401088-bef91c1804ec226e5b1c02ea3a290822.npy +02958343-9f7b4a82becac9cd5568b8cbf53329df.npy +02828884-95ee6234a1638f892056b4bd5d870b47.npy +03593526-460055a94c92bc3ed680196133d8b70f.npy +02828884-d7293ad1c563e0ee318b348b36fba247.npy +02691156-31d1cf39b807c856efe0d4e1eba2e3af.npy +03001627-586984ccc3ea15676c441a62670bab86.npy +04379243-d51c7bcf851a368f90193fd5f5187893.npy +02992529-8873af9392bc7506f1cb19f636b1c2bd.npy +04401088-57daa58dd0715c58beafa80aadbc3232.npy +02958343-53895830484cd75d9a68e1b6bb3d1631.npy +04256520-62d40988172e8c685ff61a3a2a0e2484.npy +04401088-e6f4ceda4907fcc13c47272ccf8f316c.npy +03337140-fae333fdef97b004193e4b893d21eb4c.npy +04256520-5ad772a3c728b948d329896bbf26eda9.npy +02691156-947d6b9cd1966e2e719b5362fe06bbb.npy +03467517-a57ee03b7c376eb7b785a4ac4a0dbd73.npy +03001627-4bcf02d408a42fedc399b0e96597941f.npy +04379243-f5aecb6607876495e03eb69820d1aaf2.npy +02958343-aee2d4cae2954ffde51212f97a7d9486.npy +04379243-ad7ae42e620d2ce7e074517a246f1e65.npy +04330267-48b9c0c72db0859cc0fd596e40539.npy +03636649-7a9872f1e0cefafd7d8864caa856253b.npy +04379243-1c2aa66d76302e1f696f6d06eaf4948d.npy +03691459-88c9a7928bc35ab392b9c678bb1d631f.npy +03001627-c106cbd7794c6b6868661782af60b711.npy +03001627-f1fc7d26395549ba5ad8ce80f1a173ac.npy +03636649-b4f166440439171741657e31b569b105.npy +02818832-97f9d6942dfc12c08880edc6251fa529.npy +02933112-484f3660bf095e6f2b8a1a2aaa466160.npy +04090263-9f0b13efed3da628309c2ee598f7f2c8.npy +03797390-f42a9784d165ad2f5e723252788c3d6e.npy +04090263-1fe5ddf1ca0fde916b2c8bb96250e4a0.npy +03991062-ec2c1338e2faae58adbcc9ee28cee4cb.npy +02933112-bd2bcee265b1ee1c7c373e0e7470a338.npy +04379243-6ae63bfca4db6e42937c609387f975a5.npy +04530566-f73392abd103857666ab813654be63ca.npy +03691459-40cd27b2f685afe3ec7f40971ff466ac.npy +03211117-437d1c161da1b9fc57e4c0b864012bb5.npy +04379243-93f94ca2abb0e6aeda9c49a653a829eb.npy +02958343-f1d902e502f474313fdffa7a79289f65.npy +04256520-1bb31ffee286d9687597e1f94410131a.npy +04379243-c7cd5977b531acd76b41b8bcd0404ec.npy +04256520-f94cef3a1dabeefeb26131b3eacda7f2.npy +04379243-d826633e8f45cddbc22013ebab50762.npy +04004475-a553c7b317e25d17b1bc85a6b37e2272.npy +03636649-e7b719516449701362525a4d857f099d.npy +04379243-798a07e42d76013582695d8aaeacccc5.npy +02691156-d13d131a649c5df38b96ae1a0a8b84ec.npy +04090263-c82214579ed998e06bb9681d4604e123.npy +02942699-9726bf2b38d817eab169d2793795b997.npy +02871439-4f0ad9b5b38853f467aad4e7f685c416.npy +04379243-99d329e5aee0fd21c8c7b57a94dbb2e.npy +03001627-9ca1c0357c3033488cc413950b617e8f.npy +02933112-18d84c10a5068315fe5c8ffd0f5eba47.npy +04256520-ae36181b10bbc7c564810cc21086da42.npy +03211117-c0ed587c1ca5709b1c9fef7c3e095105.npy +03001627-462ef3bb97a88a753efde60c5bd5967e.npy +02924116-2d11b02cedb52eb1fc99d03c124615e4.npy +03001627-87de70c9f96dc7edf5fc96890ba7d316.npy +03001627-13d3462293023fe71f530727405d60cf.npy +02933112-3475657660a798a155590b0eedbb2f18.npy +04256520-df4ce626dc8b2a744b3c42e318f3affc.npy +03593526-f02b827d757fcff25692a9640d6947fc.npy +04379243-db94dde04aad570d2f8bc0d6e7c6775.npy +04256520-9d0dd1f2ebfcf0a4cbaaa37255ec05aa.npy +02992529-2a48a703451da580555dee99eadeb47b.npy +02808440-f7233d47ac57e17f125fa9990176f0d5.npy +04379243-c5f14fe692e70a5f668ae11a7db5e82a.npy +04379243-527445c0b9cf1cda27f5c3f15a1b92ff.npy +02691156-80796b736f1d6bc78e8131a047a07ce1.npy +02691156-22e4e0210f80fae813940713146922c1.npy +04256520-ccd0c5e06744ad9a5ca7e476d2d4a26e.npy +03001627-63f6bb7487f81a03bdfa5e0753fa3240.npy +03467517-22b29fbbf99e9cbde1c6f6ff6004a051.npy +03001627-808fa82fe9ad86d9f1cc184b6fa3e1f9.npy +02691156-3ad337dcef167024fe6302fece358e4a.npy +04256520-8d2339ab19665ee3e7c7920f6a65a54d.npy +03636649-286dc622e6f19929fdbe2bf897d8a820.npy +03991062-7aa43d03be94e322e44bad6fc9badfe7.npy +04379243-f831f836f6468b28bebbd6eb70ab85c0.npy +03001627-bb831481ea5166e318656877cdc36a54.npy +04401088-f1f794c3b6ed8951d07b37cd4d789f4d.npy +02876657-77699e08e3824eab47765668cf4023ed.npy +04256520-c8663904bd8af794d9b53420a5458c53.npy +02828884-bd56c556d9514db3500cffceffd2bd2b.npy +04256520-98cff1ad40ad54bcd05576067379976c.npy +03046257-987c21af1a3664b134a81acd9cfadf13.npy +03001627-cef79d398ec49cb3d25229379db8f59c.npy +04256520-682bc1622b438e58dd97e8e261a01f65.npy +03001627-3b2d9328ab28f70122c4f7f8c92935f0.npy +04530566-22bfa8eb9cdce735d90cecb09ba6f1b8.npy +02801938-3e64a7042776f19adc9938c9fceb2ffd.npy +02958343-fa234addf8fe4f7fbda733a39f84326d.npy +02808440-315a621e6159aea93321831d2245cf06.npy +04379243-ef873c6f267860cd43ac09133d4c1d60.npy +02992529-19208607cafce17dcb85f279c97d4c5c.npy +03001627-bb7755090f984ba85dd1bba5b1310523.npy +03593526-585c1079643d859db2236bb2a62ecfdf.npy +04379243-ccb96ea5f047c97f278d386bfa54545.npy +02828884-fe5711dd4a51b102ed98cca8f0ccd5f7.npy +03636649-4ac2d95bbb9c03d1e5fc53e1eb2fc4a7.npy +02880940-c1bad5cc2d9050e48aee29ee398d36ed.npy +02828884-87113624b71e8961e3e484fe1f0aa4c2.npy +04530566-12a01b67cb987d385859fb379730f7f7.npy +03691459-298e3b4149c28821b9001bf6cb0603cd.npy +02801938-5dbf477ba7765febb3a8888e78d004b3.npy +02933112-584b055cbd62b8572d7ead8d9eea29b1.npy +04256520-b55d24ed786a8279ad2d3ca7f660ddd.npy +04379243-828aef6559b4e1b8a9f015dc2ef2c415.npy +03467517-e1c0fb24b0f16a9d5eec6d8d24f1fde1.npy +04256520-9c1565c6bc50ba7668bdb5c1c01fdb25.npy +04401088-4f71662203c45d66cb2c0b430ff869c.npy +03691459-42fe49780429d25d1de55fee5ac2c5c2.npy +03001627-11a06e6f68b1d99c8687ff9b0b4e4ac.npy +03001627-ced5a7469c77e651fff16555386d173d.npy +02691156-f1a917846d46b61f71d03b466c72ce41.npy +03001627-aa5879b3f20ea90c36b0f2a1430e993a.npy +04379243-6c56052772cdc2b66289707fcc0ca1d.npy +04379243-120ac04ddb930aa9b2029d92310f4aeb.npy +02958343-62eda45907bcb75c320fa6e2cd857828.npy +02958343-66be76d60405c58ae02ca9d4b3cbc724.npy +02818832-2e149e4f08f7cbdfed4d676215f46734.npy +02933112-88fd3b8aa4280302c59350d819542ec7.npy +02691156-d3ecaf6bb9395131d563154e026c3490.npy +04099429-15474cf9caa757a528eba1f0b7744e9.npy +03691459-624046a3a0cba1b6c70985f30f25f8eb.npy +02958343-59ed9bf99fd1262fd77312c90516c805.npy +03001627-d343f06da03eccf34c7384dbb75cab0d.npy +04379243-64155ca51be435614c9ef68654bd2fe9.npy +04401088-e3ad9c85b958737ef7c1509e74f67ac7.npy +02691156-1021a0914a7207aff927ed529ad90a11.npy +03001627-3b0ec945e7290c3a6a0677e97a0ab6ed.npy +02958343-2b246a989e9e8be151db49e653372c20.npy +04379243-c73070837a2f9efe1b45df3fb820c9cc.npy +03636649-2419edff383179cbc53c4281a65fe22a.npy +02958343-2359486974efded33121f82ae456ac81.npy +04256520-317cd5686899922e19fb4103277a6b93.npy +04401088-7731182b7b8702bb357be8fc4a9ec12a.npy +03211117-a6a5497848d40c4a46738cc3b1934e6b.npy +03691459-1686fdd7258aa16383247f812f2eaa97.npy +03691459-47a0132d9a497e8ef398d0c5832df00e.npy +04379243-27b9211229e1bf011f3980612faf041b.npy +03261776-c7d59921f034165880403be969162a9b.npy +04379243-920842b21a3c471b597976c675750537.npy +04379243-ba49e13288189be6fcb704ced9323624.npy +02691156-440e5ba74ac8124e9751c7a6f15617f4.npy +04090263-61f01c585c581fdc8ae8d8f46e8d6c0.npy +04379243-b8fb0a7e5d59693780489003722bd0ee.npy +04379243-8d1a33ecdc93bafd727e9f790cd597.npy +04090263-b0ec853833d21d36859a7164d38b0d13.npy +02876657-225d046d8f798afacba9caf4d254cef0.npy +04379243-190645c1f458a934c862eec8232fff1e.npy +02958343-cf176e853cc739bbca92a4cdad802b45.npy +02808440-f4f6e4a355028a6dccd0340812259a39.npy +04379243-24eb7a5dc2b20ab8729c5ef452d153c3.npy +04090263-68c1bcd26d43d80572cad024c77ecfb1.npy +04379243-a05c04a3cad42012fc7ff8f848d1c6c9.npy +02946921-f755800334fcb49b450911b585bf4df8.npy +02828884-438f3246c29d69e73b67a26c84477b1a.npy +03001627-53eaa7cca72c84f6cacd67ce2c72c02e.npy +03211117-dee129ab8c2f74944c58a7782e1dd690.npy +03001627-53180e91cd6651ab76e29c9c43bc7aa.npy +04379243-a886d16c7fffeb874d6c356c3dcebb.npy +02924116-6d53ec3b3b8026d1e797b014c500fad.npy +04401088-c3e18e5d0f7a8709e41b17b375798648.npy +02828884-fec8bee05108531cf7ad31381468cb01.npy +04256520-e66f4bd6f5075d1755f9a00acc25f137.npy +04401088-5413423e80c9f264abe7f17e61fac246.npy +04379243-803fd62336eca9d58797727ac1d88278.npy +04379243-98356e87a3f5db06a0bde355e2e21370.npy +03001627-c73d63f9080e84a91b17743c18fb63dc.npy +04379243-c9b834aeda78274029edbf57bdd3b0af.npy +03642806-74bddbc79d758bcbda39f7cbbf0da6b.npy +04379243-c433bc2bac3eed219c0c9824ccd078be.npy +04099429-dc06f4a16cb9c38d92cea77f96988ae6.npy +04379243-aeb5975090a272b89f2349486c570dd4.npy +04379243-8fc6c8d02b4b0cab14038d588fd1342f.npy +04379243-1db2c973f2a3b154659277e23bf9b970.npy +04379243-3bde1338423d06b4c4fc66bd9d1f7f00.npy +02933112-9178722c21d03d3ca12fd542784d2033.npy +03001627-f04698af574cb9847edf3a3d7d1bacae.npy +04090263-5ba39bccc3073c11e0a54e072367f4f4.npy +03691459-5f3436d8bb1620f4617146ea341ca085.npy +04379243-79e3bca3008fbfcfe635ea97678c24b.npy +02958343-6f9aca876bb1f736ed3696d854eee1ec.npy +02958343-85cb3207e15a1bf8582e5e3e7771ea25.npy +03001627-a16c172406430b6af7628281ecb18112.npy +04090263-bf41504e86804d3d861bbf60d7f925f0.npy +02691156-b29c650e4d7582d11ae96ac7591d0dc5.npy +02992529-ac1e771d6392e912f594ca916b37180c.npy +02924116-d3d9e323a67cbaf9c98c13d6112727de.npy +04460130-e7a492bbc4838de285c7c66844cba238.npy +02828884-86980fcab93e60151f53db693ffe56c5.npy +04379243-4804f348d4028033134ee81f8ff0778d.npy +04256520-e481539e23b4665e20768660cf080d12.npy +04379243-b7cead95e18b570d2c97486f63c12d76.npy +02808440-25164b395b98da1ebe72274d9d6b1d8a.npy +02958343-d353bf0e0dfe3ac29cbc1c09129e1507.npy +03001627-e18ea9d7ff87c3f86a97ad5f72cdc5d6.npy +02933112-3cfebf4fdfa1384da5feafe6f1c8fc.npy +02828884-d1f9f40f8f58394c91cb0beedee33fd.npy +04379243-c365c85ae03b768667fd127a03ee9f72.npy +03991062-a9af3af6f64643cfebd761d74e9ece37.npy +02808440-13b3f78fcad66e2df6da603e92626bf9.npy +02747177-9b0f61fb80473442330afa9b9b51085f.npy +04379243-e0ea31b7fc2626ccab610b0c94236463.npy +04379243-9a01ec707c25dc606199d6fe090be061.npy +02828884-f3ce6a320a9f2791b1a00a31bfed97b.npy +02828884-4a19288db84ea192871543ab797c3d2d.npy +04256520-5148f79f518a42794fb315ce917a9ec2.npy +03046257-f1f87122fedf6e22230584014222e685.npy +03001627-517880899d26080471a782a4379556c7.npy +04256520-db1ca6cab18d4084191c3762b497eca9.npy +02828884-3b660f1b7f7f41be25ebd1cd0b422e32.npy +04379243-21ce3306dc9589dec7cb90e4399b486d.npy +03593526-cf78b551b5d698e5cacc861613759c4d.npy +03001627-4eed9ad9465482d543b9eef399a0841d.npy +02958343-2bcdaa6516a98b552abd245afcc79403.npy +03046257-8b9dac705a205cba1d2588fbbd278bb2.npy +03691459-1ccc688123d1d873ca93bc607b24577.npy +03211117-1bd2a09a9057cbaa2b518e07b1fccf95.npy +04401088-eaf85cce060622c88de42b14089e0e7c.npy +04256520-d1784efbc243913940ef1c8b63a628f9.npy +03691459-775f3b78e226f125b21450114b9ae3a.npy +02958343-792e31b0bc8415a13ded1857c15b5b6.npy +04379243-5d21564e87d0a1f3ea4b8033405be154.npy +03325088-103f0eb370d64fe532149015b3e64c.npy +04330267-5dd1c0efb1907528ff5687b000691cff.npy +04379243-b54d222311420195d9fad8aba2c312b7.npy +04379243-815ceec9c8f5dd754b8710a3469971b1.npy +04256520-e2916cab74b3703763ffebf86d8dd00.npy +03001627-46c7a2ad0abf4463bbc0e8a3b6521117.npy +03636649-23a4572a96dda133d624bbdc22e247c8.npy +03211117-134c9a46684ab57271f27bd49a6cd214.npy +04379243-69a3e5ea90d66d2efd72380f3800ba4b.npy +04379243-68f2795c385859e914038d588fd1342f.npy +03001627-be0b0a9b0a7108c6e4f106360437e8c0.npy +02992529-6449223cebdb2dc9c8c3ac9bcbcd9687.npy +02871439-1f6ba924c72ae8c46612c99aa973796b.npy +03691459-c029e58c26875322a9eb0f146e94477.npy +03001627-979d210217f798d4f4b6538438a0b930.npy +03467517-1e56954ca36bbfdd6b05157edf4233a3.npy +04379243-fd7a579772b195532de421c2ab5cfb52.npy +03001627-4b35795a0ba482cb4f3443b22038d340.npy +04379243-7370a18bebe67690664b3b9b23ddfcbc.npy +03642806-66e3b7c7f2e8e9297fd8853234f5e918.npy +03761084-88e2e2446a3cd2816694e76612a795a6.npy +02691156-e0df97dfc068e3664bf88973bd147a26.npy +02828884-b990e2ecb2650ba548e7a83cf3fe93c5.npy +03001627-fb42c4a8cf7b6d36ec89626a4213fd07.npy +03337140-e2763ac23ee84c6d91c352d02061b3f7.npy +02933112-152dd0a74ed08ef8c59350d819542ec7.npy +04004475-3453629407e6708d6f8a56ca1f74303e.npy +02808440-629f52ed43de72e6ccd0340812259a39.npy +02924116-c43be5262fdd584d1940a53cd312bfff.npy +02828884-957596b8dc4cba37ad5067eac75a07f7.npy +02876657-64faa2a6a6f844af851f4ba6aaedaaa8.npy +02958343-95ea282dbee00d45ffe141441005acc5.npy +03046257-2a979930dffe3d32897a37b9397f0b81.npy +02691156-4fd9c86e43a1dea17209009cfb89d4bd.npy +03001627-f3ece63fb46fb129eb71e9117b10dee6.npy +03636649-4c5a9be10106d239b0957d845ac33749.npy +03467517-10d2c216c70b788485b61f146daff2fb.npy +04401088-9090bc906ec8d80aca54a3214c333cc.npy +02691156-fe0eb72a9fb21dd62b600da24e0965.npy +02691156-325f0b5ace799075bc0909d98a1ff2b4.npy +02933112-79a8b5fdd40e1b1d20768660cf080d12.npy +02843684-2e1fd1d756563937c5c86021644af7b5.npy +03001627-3c4ed9c8f76c7a5ef51f77a6d7299806.npy +03991062-a4762aa34818d514148a76a78b10eb5d.npy +02958343-e915bd270032eb0cafb617f7e8ac7576.npy +02933112-1f822298caef0302143802691fd0e33f.npy +03691459-865356c79a595c3fd3c3c7b74c67a723.npy +04401088-57aa54c9db88e364502122ac3599bb74.npy +04379243-3b45bea7b1b2ab6a20f002682bf71108.npy +04379243-c7e03bba4ab333cfb20716e5484f7807.npy +03624134-13d183a44f143ca8c842482418ab083d.npy +04401088-7f643ee632aa0a3f51ad7743381c8a7d.npy +03001627-2a0e0b51d919f030ad484915511ccff6.npy +03046257-e03d93a19639a6f887a2d41672ab8a52.npy +04530566-e271e4ef2c327dda28d0def75843d7e0.npy +03001627-3a9de2db9d78546892979c651b40698c.npy +02958343-1523402e11400b75becf71e2e014ff6f.npy +04379243-28249c48cb603cb9668ae11a7db5e82a.npy +04379243-d9b264b94aa3aab652f6234a019827aa.npy +04530566-4dc17782858aab6e3308cf743f153e29.npy +03636649-99253484c463e9dd7688e67ac1793ffc.npy +02691156-83ed7c81a011d72a179137acc8d4437.npy +03001627-c7cbed6203120aabe9a3ed4e7aae9cca.npy +04554684-fa4162988208d07a1cc00550ccb8f129.npy +04379243-d382d9e34f365544278d386bfa54545.npy +03991062-c8620917c25de98bcb2a965e75be701c.npy +02691156-8cd5191c587341029aa2a8cabf259b68.npy +04379243-a16d7c49c0899cad8e43a810a63361f0.npy +04379243-f31398b4a1f8562f9297752c3edd590.npy +04256520-b53a3566842e12b290a9ce3e4b15521e.npy +02958343-b22aa9fcad2104a634fad4a395c51fe9.npy +03691459-2c5dde3b43f0b0fc5afcf0aaed5d73d0.npy +04460130-48d4e52fb735e6b6599d77531b1d13a9.npy +04379243-4cd743a60cfa17d6b0a3f25f5d8cb0f8.npy +03046257-d86f29654ad0040114038d588fd1342f.npy +02992529-1d53adf8f82d223db0a79e28606cb167.npy +04379243-2aecf3003735e8b34cbbac005f3700ba.npy +03001627-2bda2aa53c374ca665ba78ad9601cf1b.npy +02924116-7ad09b362de71bfaadcb6d6a1ff60276.npy +03642806-5a63c5f29f0bc0eb12d8efb2f101da03.npy +02828884-9de1b1608e6ffb9afde926512eb9d305.npy +02871439-37c2dc5d7a2c19ecb337d5f45e24e31.npy +02924116-26141fa25522a3b413d4ae6f75318cd3.npy +02808440-a26c4780b14a9d13d84d1b7b18d6e7c7.npy +03211117-d0e4da00e7f9db087bf393182f1ba834.npy +03691459-97bf4aac2d956c1d5d9e9a1d5cade7db.npy +03636649-79815be2cb9b004b1be03639838c9758.npy +02958343-94a78fc51f84fa839ea5c205086e2a63.npy +02828884-26325f047537acd3f155d75bbf62b80.npy +04379243-7216c7ef1edfed4e593ebeeedbff73b.npy +04530566-fbca0e2a510f2b3594daa4565dd30535.npy +02942699-1967344f80da29618d342172201b8d8c.npy +02992529-31a6790b3175d191dca475581a23e66b.npy +04379243-949c26cd898da9855c5e8df5dc8d3d85.npy +04379243-62c6addae5defe8bc62ff677c806df30.npy +02691156-9aa371acc735844efdd77aff53f4b7ba.npy +04530566-9e6d54edea8f2adb41556f795d265590.npy +04256520-fbe08af112773184e6fe3612af521500.npy +04074963-a97a5e1c99e165c2327b86d5194a11a7.npy +03001627-e14803278dcc08c4af7c7ad2549a1b15.npy +03325088-e70d5905fe100117b362845c6edb57fc.npy +03467517-32fed3850b26c82b1c91d5bf986c0423.npy +03001627-3b1f1913f2bc0dc171dbe96559c7bcae.npy +03991062-4706b6fc43ee09358fe24cab2bc152da.npy +03467517-b05152856ba7ceee1e7516298c9158e1.npy +02933112-480a381b676003df4da5feafe6f1c8fc.npy +03325088-4efc45b85110c23276c18e71fd49c4dc.npy +03001627-7ea38c936513f5df3772b104757a4809.npy +03001627-f6f3c3f97b615a19fff16555386d173d.npy +03948459-df2e8011beb752dc44608b3255ca1886.npy +04090263-8d3cc57dc7d9c24ff6099a039722df68.npy +04379243-2147aa5c55a3913c240ea0cdca7b391a.npy +03467517-2be11b43e7a24b4a13dd57bbc3e006f9.npy +04379243-8c7bff49acf7fbc54850c7706670a44c.npy +04256520-4b1598dc0e623eaafd86c4a0427c047f.npy +02958343-e1c7c7fad8802d67fd6539c5080c830b.npy +04379243-9d1485d7d82df9aef4ab13f4b49ac318.npy +02871439-b8166cce2dc8ea4f8c58bec49e6e6862.npy +02691156-697002e0242f331eca8607f540cc62ba.npy +04256520-144cee9408bcdc3ad062f9c4aeccfad2.npy +03085013-5c30c30f543afcec9f695af5ccc7d06f.npy +02691156-715623df7ed5a6fc2296d88107d065f6.npy +03046257-ade988dac6b48a6cf133407de2f7837a.npy +03593526-5543edf23df6527530612f5c0ef21eb8.npy +02958343-fa1b3bcdbda309a439cc19d48e3f4f5.npy +02933112-5d0c82af3d799573eff860318f968925.npy +02880940-3a7737c7bb4a6194f60bf3def77dca62.npy +03636649-994f375a5f371743b5fd9907631a04b7.npy +04090263-c36fa9da71beb581eab5ee569c9de1b1.npy +04379243-7fc2174b2016f76abffa9cc541347f97.npy +03467517-288ac0b24f3ba1a940c20797381ee39f.npy +04090263-c0d928c692fd95b547f0c66d8dcbd422.npy +02958343-4fea9b67188b830f6a2345809e2bb169.npy +04256520-a2d798bef501195c1ecf441429b11ade.npy +04379243-8aa658fb92830e0e62a510b8f97c658e.npy +02808440-63b259b0b462f6f9e59685727bdd9ae9.npy +03691459-36b61e14fedd020a838f7ecc5ce13037.npy +04379243-dd543a069376134aba5342d638d0c267.npy +02958343-5343e944a7753108aa69dfdc5532bb13.npy +04530566-955507bbb3aa0b97b1bb46d2556ba67d.npy +04530566-f2bf8fdce1a33c66a60ce6f0a0028c13.npy +04379243-ecf301eedfbb508dbeedb4c8fd29e2d1.npy +02871439-9b636b7a085ff78a8cbb8bac2032149c.npy +04530566-b2b616535ffca936c9189a1f098bd081.npy +02880940-708fce7ba7d911f3d5b5e7c77f0efc2.npy +04379243-12df0535bb43633abdd9b7a602ec35ec.npy +04401088-31a6790b3175d191dca475581a23e66b.npy +02924116-b7ae96e9df358c315195dd5f75892d01.npy +02818832-218a4d46550ea6fd5a9dc003587438be.npy +02924116-78ae6f2a8b4add0fd110be36252474cf.npy +03001627-b779b6773ef480e8c3cf9ae716575390.npy +03211117-f82e94964e06f23fd6d49cce41472b6e.npy +03691459-767b076382b239a72d563c85edb49108.npy +03046257-a9e4fa90c4e6349ae71cd3b669370f85.npy +03337140-aef1a6861a9b811c7d959b891d79004d.npy +04379243-a54de0e6573dabc0ac42b9d8db52fc14.npy +02958343-219a0021526791d18bb5c0bf5eec83fc.npy +04379243-f60960ae4dc8e293c8ce22a41ea48e48.npy +02808440-5f1145774cb48e7854d7082b34825ef0.npy +04256520-21b8e95a91fe7f044fa89de6e82c448.npy +03001627-70cfdbf8d22c8176f51f77a6d7299806.npy +02876657-cc399bb619ddddf7c13f8623d10d3404.npy +03001627-6b64af50e21c0006f91663a74ccd2338.npy +02933112-4fca24001a151a43d7bd133fd14c164d.npy +02933112-af99a90272d8f5d7776cc3eef7148ace.npy +03001627-dcdb75ba399230bf98f5bccb3529a48d.npy +03593526-4b574003434d2ba041034a9ebee74b0c.npy +04256520-241bf145fb2d14e67ec0186a79b9da3b.npy +04090263-577e1473bbc1e2654fd8f930cee8e385.npy +03211117-b163a1a49784d1b890da575a4a08834.npy +02828884-fa259d97f0514af1814acb3be75bdbcf.npy +03691459-d3817d6003473f1c3971c6f4f1d0a4a0.npy +03001627-46789c1fb150dfaf51f77a6d7299806.npy +04379243-4003c20ffb525c7ee3def9c422df2282.npy +03001627-a54a6ee9263bc1eaf4b6538438a0b930.npy +03691459-bc7a4151d2098374513ea32c8c934a8e.npy +04256520-10e0543e6e316dca30b07c64830a47f3.npy +02958343-de58645e0e00e6be73905da0c7336cf4.npy +03624134-8fbd38aeb89147271edd0225dcc55a58.npy +02691156-b8ed32beb17c3cacafd477f714c68df9.npy +04379243-e3cc0b06be2c972cab610b0c94236463.npy +03636649-8df4dd50d01bb801e9bc18ec03716e83.npy +03001627-68a1f95fed336299f51f77a6d7299806.npy +04090263-7b74f5d8a2ad8aec6ba53cbcffbd8494.npy +04530566-12e012fc28fc8d784de203ef6842ee61.npy +03001627-3dd04235c696c117db6d2ff65cc5b310.npy +03001627-64f885f39752807c6c63b8b48495261a.npy +04256520-14bf301e9548eb788430c9c8b2cd5ae6.npy +02691156-67e8571eceec1ea44c3a35cee92bb95b.npy +03001627-236f75a784ed58d62b3e9b6eb52d35df.npy +02691156-a5d68126acbd43395e9e2656aff7dd5b.npy +02801938-34fd44c46f40044339da77d05979b2.npy +02958343-43319fbb378083669d5b1db3ffcc1210.npy +03928116-6161ea30b60fe86e16a0adac6af4232a.npy +04256520-effe967a116f8098cc2af5791bd669b8.npy +02958343-61abf78387c84ab67bc163a1196fba48.npy +03211117-bfd57bdfa26cea8b5db5515d1151e20c.npy +04330267-9399d12f4ad210cd7c3206b8af68d4f9.npy +02691156-39ce355324ab4bc8b96ae1a0a8b84ec.npy +03001627-808cd961edfc236c11794406b17d66b.npy +03467517-2a3cbbb4242103a9d57700c05b1862d8.npy +04256520-6e0e701ad50f5f8c63a3732f072a64ec.npy +02691156-947a78a898b6aa81f19a675dcc5ca632.npy +03001627-70207d8482c135f8410594e2fa0c101.npy +02691156-8c6ec24418f0af1950e187c1fbdbf3ba.npy +04530566-abbef6c2f909b9719ef9dcee729574d5.npy +04379243-5de144376ad2826329909e9b8d8324a.npy +02958343-4b339f645507508aa83aa2c84a424148.npy +04256520-398ffbc5870c12e1b5c63839abd9baad.npy +03636649-a072cd9c2593414031ae8c8ff1eb3d45.npy +02958343-f2f62db1a9e5823a7aaf6e2fd8453e07.npy +02876657-1e5abf0465d97d826118a17db9de8c0.npy +04530566-83ecbc5daab43647ff790997f2048517.npy +02876657-917fd3e68de79bf69ece21a0b0786a69.npy +04379243-3edf1ef61a9802e6492d9da2668ec34c.npy +02828884-36e1592e13b4f5ed569c11df1aea8ca4.npy +02818832-e91c2df09de0d4b1ed4d676215f46734.npy +02958343-7ee2193b072afa652935bed12a852dcf.npy +03001627-2dc5055b8d900ec7db4b0ee93cf61ed1.npy +02828884-13b28cea086fbf59585a7824ddda249a.npy +02828884-f2a3ac936fcabeb8d1ccbd5d84e5bc86.npy +02924116-9f70c6bc076c1ee09f8b56cd3edf0bc6.npy +04379243-5d46bcc77b2815fca71c812e027f94d9.npy +03691459-8629dacee484080c7ad11885dccb6f43.npy +03001627-881e7a45e9f149d8283b00891f680579.npy +02828884-d2cd3e3cb4ed6ee4e7fbee941d13bb9f.npy +04530566-4bef06fbd04377d4d6e2030b844bcb2.npy +04379243-b10228c0b83a6d436b8cc29ba15869e8.npy +04090263-91729b92eeab3fdb3a653cb492d78488.npy +04379243-ac4761dada79926919bebd2312571a3.npy +03991062-3023f9aa8405195f37ab51e1f8240a33.npy +04379243-4b95230707396e18916c024499b21ce6.npy +04256520-9e63faa55910e20714038d588fd1342f.npy +02958343-56c056544a2fba1614d5081e13f5a1db.npy +04256520-cf4db3515ce7c603cda053036bd1b63f.npy +04379243-2bbafd62a8c5a2d1520ac90ee81efb48.npy +04379243-2cfd6534a6a57548d20545a75c46659d.npy +02924116-3161de3a7b4064ce7d805ac05a89f972.npy +04530566-1117e714368f61ee1fba2cab1ada6bf6.npy +02876657-8309e710832c07f91082f2ea630bf69e.npy +02818832-ac06e06d1d533932d8ab9ec32b20d37a.npy +02933112-72105548b0e01be8659e37b49210f361.npy +04256520-6f98760567bd7f69bd16d4490a10a752.npy +02933112-4fd61ff0aa949a4486d53ab0fe94e911.npy +04530566-2067c22906b79faff877f04737ced5b5.npy +02958343-f2e1db1997b5e2568926f812d9083f89.npy +04530566-8f3d3eb663508afb1143e3955ded9f0a.npy +03001627-7bdc0aaca74cca86593ebeeedbff73b.npy +03337140-bed9025513a46a09bb1a97f41fc4e5e0.npy +04379243-bc9650bb551fc22e1f6014485d7eefc9.npy +02691156-eed299b690be51ffbd931fcaa69140.npy +02818832-fcf45c518cc630c6af372cbaa79ddbc5.npy +02828884-35e62b9c23928bc57f5df2bc47846a54.npy +04256520-642883f79c9131d842c47c8032438a1.npy +04379243-546f5dbed1636d097ee0de88f23eac1d.npy +04379243-ffe2bf44f5d9760b9a8ef44e1d2c5b75.npy +02958343-d4f910cd784c38dc90b4e3bfacd1b5e3.npy +04379243-db32d69c5b2c77ba51b5726fdf67f095.npy +02958343-4f0147c8a158087a4c19dab9f2c7c52d.npy +02924116-699cd83b28bd248d30f646576d932e1a.npy +04256520-d8751c7d4156c98ef09df371fae9d63d.npy +02958343-dc8aef6a8c88997a582e5e3e7771ea25.npy +03001627-9faefdf6814aaa975510d59f3ab1ed64.npy +03691459-2d1302ed4d4f43ca73e1b2d018c0512.npy +03636649-6bb8020fa82b27dde11a3e838aa2c287.npy +03467517-65c02d42310072893ad5c8c907218ae5.npy +02958343-d255a6f670c3ec18d12568d09c2fba02.npy +04530566-fa2580f6b9a29f5454f886603823eb9.npy +02691156-e5c6ba3e7d4f2fde40acb87a6be88b3.npy +03797390-c82b9f1b98f044fc15cf6e5ad80f2da.npy +02871439-850c4cde0bedbe9bba5342d638d0c267.npy +03624134-5391a808f36b46971638241f3ad71c10.npy +02808440-c6dd3b539e5effd61c17aef130ed6213.npy +02828884-d1d433ab6a289a568e95e8a3bb5a538a.npy +02924116-57062cefa79cad6bc6bf3b18b8ca71a.npy +04004475-e7151d72238ef13c2807a549203236ea.npy +03642806-2fbc09c414c80a2d50577cf04f3bf74a.npy +03046257-3bba665dff8dfd6141c01a2987577d0c.npy +02958343-a61488f91b2837f8473f10e6caaeca56.npy +04379243-33bcda05749d01bc4b3c42e318f3affc.npy +02933112-1a9a91aa5e3306ec5938fc2058ab2dbe.npy +02691156-ec4a2a47f601397ea01e5c9f53f20fd4.npy +04379243-8a6e06fbf74e811667d24b304b35bdf4.npy +04379243-29def96b77d4cfe372f9a9353d57f9ef.npy +04379243-f9d5c41dd092dd8e78c10c978f26802f.npy +03691459-6cd4d9c6b51d785bebc9199df8e5ab6.npy +03001627-5e907bb5204ec4a9a16baf954c1d99bc.npy +04256520-9b3c9023e8c570d5b307b2a73ae3e74b.npy +03991062-71082c00e772bc54b79ee87044437bbc.npy +04379243-b6b8ede77085c0a95bea7c29e873d16.npy +04379243-5de75da0a8142dfb17b431cae0dd70ed.npy +02933112-b9967857b0419d44e7312e7851dc468c.npy +03001627-383bac847e38daa0e8dd9b2c07157c63.npy +03636649-90e4219f897af979cbde89e0c48a01bf.npy +02828884-f3a44bf9a27f1446ae23680cee12f145.npy +02958343-844a5b7af9b67510b1bb46d2556ba67d.npy +04256520-3aeae4150fce9f79ed3b18fbf7db0d.npy +03001627-619d9f32db0780187c34f3963ae12156.npy +04090263-b12faa395027a377f7bd077790d66b82.npy +02828884-442283366e5b20c7a136444fdcc3f2b1.npy +03691459-1605c2ea5ce774811e4a701e01e712d1.npy +04401088-77f5498dd2277aacfd71ce99fb45ba0c.npy +04530566-ab9359cafda4fd98a726cf6fcecd0742.npy +04256520-35c611ddda81b9941206ff076758ec85.npy +04401088-1049bf1611874c9cf0c2cf8583536651.npy +04530566-6edd37977522996a9b8e79aa9da22fd7.npy +03691459-a2dc5748b523db72bbbcb091dd094e5f.npy +04090263-e19e9ab7d858842139336f03eb955d2.npy +03636649-6b8790947a71e9a9bc5996932c1238cd.npy +03790512-f8f73c4ee5da94b076ee2dc2a279fa5e.npy +04379243-24a95d1ffe9b8853468a0257ee459475.npy +04379243-f708d5284928431355ce350c1c834503.npy +03001627-2948af0b6a12f1c7ad484915511ccff6.npy +04530566-e12095f9d33eeeb6711722c32e47b894.npy +03761084-42753fd8af1477e019d629b015d21083.npy +03593526-bcf95c3997bf686b4beac2065c0d9cb7.npy +04256520-77f5e753014c5b69b4b4d657a4935834.npy +03593526-f9ae4485b706ab1893fa5ed2239f9b08.npy +04379243-83c24aad3914e61a73376642dd664bfd.npy +03001627-e82fbdd4857adbd7bc0482e18ec51d0e.npy +03001627-2afcb7db7697d552f51f77a6d7299806.npy +04530566-128ab8b74fa037597fe03c0a35dc1886.npy +02958343-47a0e5448c4a3bcbb1bb46d2556ba67d.npy +03001627-79ed181ca18bf71dc8881577d38510.npy +03001627-ce3b2722cdecb0f0b3272b4a93a044ba.npy +04379243-850564e1e8587f35617092ec6e36103f.npy +02876657-a1275bd03ab15100f6dbe3dc17d6cdf7.npy +02958343-bbc4f08aacdff9c7a8ed0bb390c8ebb7.npy +03085013-485b2b3315e2de0698b3a9547b8c6f56.npy +03797390-e71102b6da1d63f3a363b55cbd344baa.npy +02946921-bea7315d4410d0ce83b1cdcee646c9a4.npy +02828884-98971eb747738a6880360680c1602c7d.npy +02691156-78a7cdbbb27dfb21bbf3143b1cb6076a.npy +03691459-431892f5456a2b9ab96497d8dce09d96.npy +03337140-ce57b6b84feef58b4c3aee8e9d3a6ffa.npy +03001627-8d3ea5a8630be8c0f51f77a6d7299806.npy +02958343-fcd90d547fdeb629f200a72c9245aee7.npy +03691459-fae47d104b9111aafd949ebbd292d47.npy +03790512-559b67efe09f141052fa4ad29a1236d7.npy +02691156-e1225308d6c26c862b600da24e0965.npy +03001627-1f0bfd529b33c045b84e887edbdca251.npy +03001627-2b0f0f530011353d15eb60d655e596e9.npy +04530566-df15e931e12c32c38a5d92735846f6c.npy +02958343-5edaef36af2826762bf75f4335c3829b.npy +02828884-1be0e167a93a1069acb4ead41419080a.npy +03325088-42c5ef82f8d7e3b050da8b99982a3057.npy +04090263-84fee75d9736808afa29682ba98e856d.npy +02691156-63f3edb47c67caa29a6e43b878d5b335.npy +02933112-248ff0771f1eb286f51f77a6d7299806.npy +03001627-7a755f08cba6e387ea8f932ecf29385f.npy +03761084-112624e40e96e5654a44340bf227e40.npy +02958343-67e2e5470d27e605d3c820a40c219fa9.npy +04379243-5788395c87b524db79157224cf10b26.npy +04530566-aa83008f44e009177795dd28016933fc.npy +02828884-95b375118d800de7ad5067eac75a07f7.npy +04379243-bfa94cc8557253982efa4e574711a177.npy +03001627-1d37a7fbe0810f963e83b2d32ed5f665.npy +02958343-21b8d0946135481a8772afa45900d07f.npy +02958343-5a56285761f2d6cf261c731730128248.npy +03467517-cc37ee1b4b007f0693f0194265a9746c.npy +04379243-dddacb5f14641b49766aeccb5d872ce4.npy +02958343-cea62d812396c31a88ed7b6315c3b4a.npy +03325088-3f6ac7c3927f9e61f38c4a12750d961b.npy +03001627-5ce323f8499cf60ce51e3cd2b72fbf02.npy +02691156-b3950d8c2c1da884e52afb4158d0847e.npy +04379243-7aaad1c5c2be8c24a9ed7bb5b55809f8.npy +03636649-73378b714c5bfed2b922d818b19db1e.npy +02691156-ee562cc82d73ab212135f3a0e614f115.npy +02818832-6690d593663cd3db81668ccf07209203.npy +04401088-26175bc1827c3569c4b311ecb3af9fe6.npy +03211117-8dd161fa61bb651eaa95bf474e195f02.npy +02808440-ceaf2e69f2c5402ac76194fc117cdc00.npy +02828884-fa2f82cf9275c2078ccde000e771fc1a.npy +04468005-28a465e9c73c5e11e308292e90ed0752.npy +03337140-3711f7ae4f528f7963f393abca61510.npy +04379243-a296a3504163b053e6fe3612af521500.npy +04256520-b403f11f5ea4a6a9d8c9ac981f1e537a.npy +02924116-a9b7fbe4a8dd4d0c44f19502064e0a74.npy +02958343-97128412dfd802be2a9eb0f146e94477.npy +03691459-91a98a5ab36cd751cf99e87135c925d6.npy +04379243-794395f3e5e2d4f617b431cae0dd70ed.npy +02954340-c1436c38beba0005284432ce2f42f498.npy +04379243-5fa362fd2bd9e4b5febad4f49b26ec52.npy +02958343-77e3ac704a2933d0921cb81cb1632a5e.npy +04256520-ee5cfabb3bbf211f4f46734d27ff5aef.npy +03991062-94dc988b968844c944c183864792bc2b.npy +04004475-c3a4c0139cbe53507810fb143767556.npy +04256520-87640cfc9e38bbb3ec563cfb0e79cc4c.npy +04379243-e8bf7ba06998867d653227f952929af5.npy +03636649-a7f071ed220b495d786810c22b062a88.npy +03001627-5eaa2730f10054d0f6cabe1df6f4c9d9.npy +02691156-79d82d0db21dff48aedf20f7099e25c5.npy +03593526-e70b94a9058952643f88f523fa8b6921.npy +04379243-4beaa698e6a7721279a2553310841ae9.npy +03691459-424e95fed6e7fd5c14fdbb071f44a8f.npy +02958343-5a5f53455c2b400579206bf213559607.npy +02958343-6cc0924f1ad64faf8c2e7159929c406f.npy +04530566-78fe059e63f817a296f6c44da3269880.npy +02958343-868af17aaa07b069bda72093f9b5aa73.npy +03691459-c533b4ce486919121cd3f324e5fa80.npy +04379243-85bbafe7db85e0d44c4373a4939914cc.npy +03001627-da918b121ca55feb9b9f2eb77f5e247e.npy +04379243-28e1ba582708bb21b4c161851ed2b4e4.npy +04379243-f597ff7f743d99a3550660cda66234fd.npy +02691156-89bc3fa2ecf1425f6c32d954b1c7f41e.npy +04530566-3e900d7ea70fccaae6100699d3d743a7.npy +02958343-78f9e32385dd7db27996cb12b5662363.npy +04256520-d09b21e5a16c2a0ea29038f04db9492a.npy +03001627-8951c681ee693af213493f4cb10e07b0.npy +02691156-5213a6520cc225a0fb5c1b0f759e2bc1.npy +02958343-a7065cc33270e551a3049d0dcf503cdf.npy +03211117-782655d93313d14726ee873dae10ece7.npy +02958343-1089cbe82dc0e72133d7c9e122eec9b6.npy +03467517-c8b76f91f783d765dae24eae11385498.npy +04379243-7f827b92453712f3504af6e1321617aa.npy +02924116-89a290078b4d987f6f525e79a05bbcb3.npy +02992529-33db5943a8942fdfd998bbb6a9d203d8.npy +02933112-6adbd040ec2f9fb53f07ca1042ba5dfc.npy +03001627-2a39dbeb52262b975babe43b460dfe6e.npy +04379243-249de04d8d7e4061cb9cf5f7d536cddb.npy +03513137-9668f0abd848e943b20f6e48f6a30cbf.npy +04530566-e8b93c451e4278277220891f188bc420.npy +02924116-85fac8cd5ec481ff2b99dcb65afc747.npy +03636649-c226b3469c086c75a1b5ceeca96f6fbc.npy +03001627-43bc4a978115d3f82ff27b24dc18a6e8.npy +03325088-4c1ebf8c47731b573321831d2245cf06.npy +02871439-3cee003b8928f425d810b14a81e12eca.npy +02691156-29374d5ffdb23451e1f2a1daf140ac9f.npy +04379243-731b983cb313634fd018082a1777a5f8.npy +02933112-654c0a2db749c63a56b67b833e192171.npy +04256520-5649e603e8a9b2c295c539fc7d92aba.npy +04530566-bbad61a484ffb3ecf0e4a921fd6a03e7.npy +02933112-cdf33719d80e3f1dadecb2bfe4fe7f60.npy +03467517-2adbf6c3f8f2d9ca7fe36b1f0a632ed8.npy +04530566-58c05eceed8e0a48f3e39f2e17005efc.npy +02958343-476a54545e873ddf6cfecb6c9c824fc6.npy +04401088-25eff75e43287223f1cb19f636b1c2bd.npy +04256520-eeb9c7f343677bc7167c63de52dd6bbd.npy +03001627-3466b6ecd040e252c215f685ba622927.npy +04379243-c0882eb8eb6fba2d8705931e60ead6a0.npy +03636649-cf280956401024fe92225eae846f578f.npy +04530566-1522b8c3c28a9d57ace571be2585c620.npy +03325088-5522e7712d022366c02a95ee51755450.npy +02691156-f34a66147493f0633d5158710d6fb8.npy +03636649-8eee3b5fd2f3abd4bcde6f92ef1f7ee7.npy +04090263-8c769f47d8d5b0c84b681a5f8ea211b6.npy +04530566-a2f46716962afe72b106d5ef46e12c19.npy +04256520-262e433c526d8b4ad84b8ba651dfb8ac.npy +02828884-89d15e96bdf725bfc955e5ed03ef3a2f.npy +04379243-9207224582ee8aebf57b7c8ba41c730e.npy +04379243-375aae9fcedc76438b9b51ae4415d5aa.npy +02992529-18dc34a116734b43bfd324d8acaeb3f2.npy +03467517-9c2dd87f9fa0614466c0cc72d086c581.npy +03636649-dca5ccbc65594b4fcb8d8c6d4df8143.npy +04379243-4702c7f73c64fa81cc19d3672693a8a0.npy +02691156-6a7bcaa4c62779e45e6724a7c6e30991.npy +02871439-efb65556126571c6db6ba5a23e03f3c0.npy +02691156-76811819fc2bf7fbdbe9ce60b93b8bd5.npy +04256520-7d8e6b132c64d909b161f36d4e309050.npy +02691156-54e926e12382808b66cf1b4a8fc3914e.npy +02828884-d27d7e667c5ccd70cb2a965e75be701c.npy +03001627-41fead15a9ade0f090492b0341436fe0.npy +02933112-941289c22ad19099a87002a4eeaf610.npy +03001627-25c61fb5c237767919fb4103277a6b93.npy +04379243-d599b1176343728c6705ae120c2282cf.npy +03001627-9144c2c7b7d9f733ad484915511ccff6.npy +02747177-6d63c096e32feca4f4fb4dee5181bee.npy +02958343-7d33cb52d556c1fe618e9d35559b7aa.npy +02958343-a86ab6f8af60c6afe1d4530f4c6e24.npy +02691156-6cd3028fe03d04fec6f6da58b133bae0.npy +04379243-bae92d56010d241157aaa9693588d48c.npy +04090263-3be7b34984a3e34fde9c2fd0f82cd3a7.npy +04530566-a473fe0a7f11c7ae9041531b90641b86.npy +04256520-cff485b2c98410135dda488a4bbb1e1.npy +03691459-f2e521a8d08e2a2f20363e2561dd589a.npy +03636649-9f2993a2f6cea208d3e2561755f455b9.npy +04401088-142e9e68380daef34eb88be3370bffe7.npy +02691156-e3e6cbc295806a47cf0420e0d05f48de.npy +04379243-548c2b0a10a3f8c798b664231032816.npy +03001627-ebc5bd5566558b64af7c7ad2549a1b15.npy +03211117-50934056d4c1735dc9d02d4e580c2722.npy +02924116-c7139efd6cc730d177b8f563bc1e52ac.npy +03928116-c955fbf41e870dfaf0591fbec6fb99b.npy +03085013-744c65c1a90c7db44f43b0e03c0602c.npy +02933112-25cd31f334358e0260bec33edd014356.npy +04090263-5b1dd450a929e2823b2b25ffabe35ca6.npy +04530566-fdddf0bea9cc33ae81d9d9b1473043a2.npy +02691156-8af730a8f082af9167b9bb226efd81df.npy +04379243-3e30deadc87180b6c3bd24f986301745.npy +04090263-7392b5a3e2ff001f13e4e654fcd57d3a.npy +04379243-268e68f1819a225c1b4b790955c17432.npy +04468005-ba37b06984355766dc14ba0818ee5cec.npy +04379243-c24bc140335164ba815b2b467e8e2eac.npy +03691459-cf85a8c74cb76caf1574d21c0c95092f.npy +03691459-c8e0a46d8a6352c58df4edffcbea21d6.npy +03691459-ab84f70571827b76dfdc04b8b8434e84.npy +02958343-381bf84829066031a134736201a79843.npy +03001627-d915d2f1664bf76e71a70be9f12ce8b0.npy +03001627-2c548222017955df4530ae9f1281950f.npy +02828884-a047cb14c22517e6f33e284fed03c3fc.npy +02933112-aac417d5df45cfd7605de7eae9f0b0f4.npy +04256520-412b9f3244a5cc56b667ca2c169528e2.npy +04379243-ae099c7bf362b3e5c3bd24f986301745.npy +04379243-56ea26c10c478555a31cc7b61ec6561.npy +02958343-d4e611a541a5b01473f10e6caaeca56.npy +03761084-dc5c91c8c01b1c8c506c648223cdabe9.npy +02933112-a9ade7de80ee8cc8ae25f6fe802a8997.npy +03001627-52f6fbe3a36a4d1f19fb4103277a6b93.npy +04090263-95e3e6cb5f3c8cd39eff3cfd975ea4b3.npy +04379243-343b9ae8ea03e45070f79ce36975718f.npy +03001627-b919250f54644e1e326e6d76fa066efd.npy +02958343-5042d8f781a58c4c9be457a8c6fa099b.npy +04379243-45320414e630ca38b96f0049223adf04.npy +04330267-4346f26dfcfd5b9c869bb2e9e5b3d44.npy +03759954-322615cc1d6cedec494399fa6924e986.npy +04256520-6f271a6c941038a6efc579970fcfc006.npy +04379243-e7b76d66231ad077cf004563556ddb36.npy +03046257-f0f2102800fa6493f130e9cdbbb1cf40.npy +04256520-7cb3f49789714865a494798fa117187b.npy +02818832-c7f039115a83939ebbc004a1c4eccc8.npy +02691156-ab0ab979406ed687a8e091cb544689d5.npy +03642806-f14056ee8bbebeecc1b05209f08e5ec6.npy +04256520-837ba605a4ab4a4f19fb4103277a6b93.npy +04379243-b9c756b2ff5d66ddfebad4f49b26ec52.npy +02933112-40470660e2b7a9ad6fa0ab61d9f9d96d.npy +03211117-478dded38f3f8d52934a98c0476fcf4b.npy +03001627-a38cfc9d2003117e19fb4103277a6b93.npy +04530566-e9da320a14afc7098031a892cba81629.npy +02876657-3b0e35ff08f09a85f0d11ae402ef940e.npy +02691156-9baf5b31d70e0d05e98d814cc4d9c5e3.npy +03001627-bd5eb0bfad19c8d9cd431573238602d.npy +04401088-dd996020281c929f73caa5ba625b1f4.npy +03938244-ac2477b9b5d3e6e6c7c8ce3bef5c2aa9.npy +04256520-a7e4616a2a315dfac5ddc26ef5560e77.npy +04379243-7bfd75013a4d7aeb5ba41eea807f5d3c.npy +04401088-8e3e1213e47661506457f8736d1c9e5d.npy +03001627-9027cd82cdc7da4d2541c4d6fdd1e35f.npy +04004475-75e53b4107a95368a3c3591ebf6e2911.npy +04379243-f7c7e05da64f6e4f2aa0f30a1572c50.npy +03001627-6b74546be8d42c76b035d20a1a3ca345.npy +02924116-5beb6cffe93635bd973f659238edf3c3.npy +03642806-464edfe14e9fa45c3394926146371698.npy +02958343-58a0216bf4c8c91d3d2b2fcaf6a55d04.npy +02691156-fbee89bee5338798d4837a4534bf020b.npy +03624134-eaffd07694c11b20afc61ad0921c25e.npy +02958343-82a783a1ea4e34b8d7755e7baabe8a6f.npy +03001627-77c4867b42d73d9bf24f05137699edbe.npy +03001627-ea3723766e96331ff91663a74ccd2338.npy +03325088-a8d7a9795934772d3321831d2245cf06.npy +03991062-12282e4fb29632286bd4d8addc5eb335.npy +03790512-733b75e867591d0fb37378f3c85478b4.npy +03325088-ac026fa4c69669a25b036534f28c2db.npy +04401088-33cd4232a87e1f416a1f7081746396ba.npy +02828884-8d218bceb517f272f155d75bbf62b80.npy +04090263-61008422050513d987bbc659fe543122.npy +02958343-cf32af5869fee4d34eb766e5a46fceab.npy +04530566-33e3b187089a68d3f983f6a1267b9260.npy +03642806-1c035fa183863780e605719767a1e7c1.npy +02876657-5277b4491396a522333769b054e66b40.npy +04379243-c8aaf90c4e66e235b9c440034ab48a1e.npy +03642806-dbcd5a88a9d4f1d7579cfe4420588034.npy +02871439-31368c56e8779b7951c1fffab4f5807.npy +03001627-25871aa50531fbfc741e88434245c899.npy +02992529-1984fb95afb6dae5804722305621f918.npy +04379243-169a72252808f9d12a7ec74a9a907cb3.npy +04530566-40d4cf2e4c0042b81f6b8c144863b7d.npy +03636649-e93f10a58e0da99bb2920cf5c60c4da3.npy +03001627-3171bae36693716126e4d5b5a8cad4da.npy +02958343-3804a264b503d5812e40b8f7ac380eb5.npy +02958343-f296f3a83e09de75afe1d4530f4c6e24.npy +03467517-b620027321650495b266a77a6097101f.npy +03636649-1682d4404196cf127588e2ca59b15f8.npy +03691459-b3f5d033d3fed8e9d207241113bee327.npy +04090263-c578ba526b8ef653e28e3d2f13cad462.npy +03001627-1820138eca42749262e4024c69de065d.npy +03467517-d82fc6db200cdf6ea24eeca91f583600.npy +02933112-7b927d55b634c4aa178e7d331e641179.npy +03636649-44d1dac026839e25f690049a092c5efc.npy +02933112-b28d1c49cfe93a3f79368d1198f406e7.npy +04074963-468a110ac6ede4507d11f9fcb943bcf5.npy +03001627-37475326277845dc1fefdc190019db13.npy +04379243-88670667d9fcd992eadc9f074ecd1df1.npy +04379243-8ac67043fbc976138705931e60ead6a0.npy +03636649-e78c5337a56dca56bd6e55f88e701c4.npy +04379243-b4e356d1702c4ca2febad4f49b26ec52.npy +02933112-4417497ef6af4cad74555f58f0503de3.npy +03337140-43e8231e5f75409e2a78b8689a653105.npy +02871439-d9e0fd4ed360b3abd67579ede6e465d2.npy +04256520-59056471bc89a215b3fdb1a7c9a60207.npy +02933112-198cbe57b01bad9dc59350d819542ec7.npy +04256520-592ad41d80d018a2d614b159c22611b5.npy +04530566-ae1a4397815849a682b5804533e545b1.npy +03001627-3936ef166d22e60ff7628281ecb18112.npy +03001627-5e2d7d43431eea85364b7ec2e28b3bd.npy +04379243-17e171f6714e330d869e5ec10662e58e.npy +03636649-3ac0f4d87162625dfcb8d8c6d4df8143.npy +04379243-16fa03bfc61770652c5d34a902e568f9.npy +03001627-9ce2ea550b049beee64d5cb52244df5.npy +02691156-20bf5bba045e5a53fdd77aff53f4b7ba.npy +04530566-8e0e3c0c19d38ea1696cc0dd628edec7.npy +02828884-6e683e60075bff408f98ac7ca14e08ed.npy +04379243-4b3d009920bd7ff51f5bdd219902caa1.npy +03691459-b0f6ee90a22dda571711eb7e23a7e2b.npy +02958343-a720d17573022d9ac00fd1150223027.npy +04256520-ff143cdc22f23608cbde89e0c48a01bf.npy +03691459-703dbbf27ae78991a21971bc32fb0326.npy +04530566-83122dd93e3f42c08099d0cb75c1d1e1.npy +02942699-90198c0aaf0156ce764e2db342c0e628.npy +03513137-608f7c4d52bbfeec9f00d9b3defbf21d.npy +04256520-58663919dae316f31ea2c93416c12215.npy +04379243-927bf59af25793ab76e29c9c43bc7aa.npy +03636649-526251a7530426a4b3c42e318f3affc.npy +03001627-dfe0e22865575c43cda85f6a3e19b0a1.npy +03761084-19362facbca806df178e7d331e641179.npy +04379243-5f8baa8b2f5c37f3124c962aae03701.npy +04530566-4af786ed4226705279863338881ed398.npy +03211117-4116b08cd0e4e19ff799a4672edb216b.npy +04530566-223d2316bb8b74a979170a5f8beda902.npy +03467517-5c7b3940e988e7e33af041adca0b9ca3.npy +03636649-435600f37bac6ed9a28fe47978e866bb.npy +03593526-7e4eb671672af422276206fae5d3c473.npy +04401088-c771a9b2dc439adac38a7eff5af707a2.npy +02691156-2c77ff96a9b46996b963df94d2f21069.npy +03001627-bee929929700e99fad8a0ee9b106700e.npy +02691156-52185f504ffa9b32ca8607f540cc62ba.npy +02958343-c7ce82b4b1e795b0cfd826dd468a5497.npy +02691156-b0fb094d1f0fc2a6766c6046535346e7.npy +03691459-cb3bc7b6610acb7d7f38a9bfed62447a.npy +04379243-2368a815da89faf940b559ef47048b86.npy +04379243-d58af24ca497ba8c4b3c42e318f3affc.npy +02924116-62e11d7b19c4c15aefe4e52d7a765fe5.npy +03001627-b091984264b4600f3ba7aee980c3a0ca.npy +04379243-9cdb0315eda9e8cf9f2c21e46768be21.npy +04379243-be00704e7366ec2ceb1488c2b7631b3e.npy +04256520-a5274620fb2ba9a23862dad076579451.npy +02880940-1b4d7803a3298f8477bdcb8816a3fac9.npy +03001627-893c689b192bbe33ebadcdfba7971b71.npy +02691156-ac06ebedebe86a7b4c3a35cee92bb95b.npy +03797390-ea95f7b57ff1573b9469314c979caef4.npy +02808440-67855525b642d59344221bef0fa3c36b.npy +02691156-6dccca8485094190be13ce34aa7c0c1c.npy +02691156-1c4b8662938adf41da2b0f839aba40f9.npy +04401088-98b929df60f9ffab49f9ea699d984c9f.npy +04530566-8f2eb4f44b95da78639e286420a03c3f.npy +04090263-a982e9bcf097e0e595ff232cd38210b4.npy +03467517-fca53c92b6e4b3a1107cf6d75b4a137d.npy +04256520-2f0f7c2f9e3b04a8f251828d7c328331.npy +03948459-592017db407391c68e7e947594effe19.npy +03001627-67713c9a313ece7226f51cb1aef0ea9c.npy +04379243-dba5223072bb092f76ff40a3c0e00e06.npy +03691459-b6f154678c06f537db24fbbf172c2159.npy +02924116-953520d61781e569d26ea7e8aaac5b9a.npy +02958343-9650fa63c6ec14fd80700cbc107b6f7d.npy +03001627-fb0c9739b5bd880ec15f2f972dbc5c17.npy +04379243-ccb8c52ff9e7a01819fb4103277a6b93.npy +04256520-fe3d9267a166c57fee7d178666aae23d.npy +02828884-b20fb19d75c00c9aad5067eac75a07f7.npy +03001627-6ddc64415a10f4b7debe318339eaf996.npy +04379243-195a2ed4931241d3c3bd24f986301745.npy +04379243-9cce8b636c333950eb98f4ac131ee005.npy +04530566-e86aed19f3272118e8340a4561cb4030.npy +03001627-3a0e392db610f1a1504d5af97121b5f.npy +02958343-fd50bc89fc1c1cfb7041f1c5e7744b16.npy +04379243-519ff6f082f8c41692f109aef7d7d6fa.npy +04379243-7c7c705c9f3b0ced3002761e7a3ba3bd.npy +03001627-74ae50b70108ca1118775c05a821f9ab.npy +02933112-8fd43ffcc981f6eb14038d588fd1342f.npy +03085013-3bd591ccdf575c261a6765dcfddfd63.npy +04379243-5431993203dfcf797ec12e029bc725db.npy +02828884-23ce36288382e8285710c881d369ccb3.npy +03642806-93fcc135217fdaf5c9614070d3269898.npy +04256520-36d43bd7a4f90e69e2ca61e91f2755b7.npy +04256520-d0dd5aeb1384125bd0cd98de57e6803.npy +02958343-5f32aca282eb9167ff1370452e3a0154.npy +03001627-512905c0211b947edc6f96c9bb9e3ae6.npy +04379243-e490518bf6d40e138288267d39a90f5.npy +02942699-cd5fd9a2bd6792ad318e2f26ee2da02c.npy +02933112-5523a90c230a1d0699bf8547ee35d38a.npy +04379243-58b58d56e5bb2faa16fafea97f025a07.npy +02933112-6ba512e07979da6ba3f4b1457e62c2b2.npy +03001627-30cd71fcd7616421177b96a1e00762c3.npy +03636649-e86bed66672425464492223278b0e937.npy +02808440-fca2b158f36e31559ce9562d3c10079.npy +03001627-89018ce4961c76cd5a8ae8f7c307d01c.npy +04530566-1b2e790b7c57fc5d2a08194fd3f4120d.npy +04256520-beb7e6c36552f509de008fce66fdc56a.npy +02958343-e4b1de221f2d66352638397725e10cf9.npy +02924116-48709357d52fb59bceeb72b524f3e0ca.npy +02958343-ae1c1141ce4bfde9d66a73de5847ea37.npy +02933112-9e6434ba1ad59fa611fc2b865c2a185b.npy +04554684-8ba3bb4e5f54bc15eb2160f94b208571.npy +04379243-a6c888f2d78e83075936c7265c890fef.npy +04379243-5f66c21e40105601958cd9a7e5831839.npy +02691156-7c6a2879e359f505467f6b8c6b1d352f.npy +04401088-7757585cdde7953d86ecff2582325794.npy +03593526-1168c9e9db2c1c5066639e628d6519b6.npy +02691156-84a167f743ec4f4de6f558e7f4a68d3.npy +03636649-80ced01703281d8e87de7314a5215f9d.npy +02958343-f48dcef252683ce552aa494042b7c9db.npy +02933112-8094a6efa5efa16776d812857a5be1ce.npy +04379243-187f32df6f393d18490ad276cd2af3a4.npy +03001627-6d27c80c3da530d69b11da89c22111dd.npy +02958343-a421aeec78440e40d3a3ff116860ca63.npy +02871439-ee23cf56cd1dfb7ab74a28862e11b00b.npy +04379243-5fbb7a5f01f646ca5830980abc1c717a.npy +02958343-5621ebf65ffd38468772afa45900d07f.npy +03001627-4fd20c1142b642221403e6cccbe91852.npy +04256520-79df431936df0a0719fb4103277a6b93.npy +02946921-9b1f0ddd23357e01a81ec39fd9664e9b.npy +03948459-621502aa0a01864d20ded1536778b0f.npy +02924116-aed84b7e25d3de71d7cd73ccf58d1f8.npy +03001627-40ab45735f526717e25492f5f62d416f.npy +02933112-818043d8e0cc040cc59350d819542ec7.npy +03691459-22fdef9bef225163d747b49524a1246e.npy +03001627-db86d16a95437f3898cfd47a860803c5.npy +03211117-99c0bf1f81b835129857176349e96f9a.npy +03928116-8a6429797237165e63920080bd2c2ed3.npy +02808440-13cd234acf0a6b4db362845c6edb57fc.npy +04256520-875c7185cce6b8b0813204830fbed813.npy +04090263-3fccb4301ce84fbc276c3d558130f8b4.npy +02691156-6c931227c1735c329df8dd4a2554378c.npy +03211117-4476577ff4776f5fa3ca88ef9e9610f4.npy +02924116-f44b45c031a02818464bb8192aeeef4d.npy +03001627-592cf5363737550cedee0bb2b729f22b.npy +03001627-3774a2b8c71e70b9f18a36d57b7cced0.npy +02691156-6dedeb5b87ee318b2154ead1f7ab03aa.npy +03636649-c1b939cc403a0662664b3b9b23ddfcbc.npy +04401088-b4c1d8191707ead52e10692b3b33e38.npy +04090263-94a58b162f17f908ecbf498fbf7a2384.npy +03001627-e7be08b34dacaafc405e3e2b789a211c.npy +03991062-cf184ee375cf827eeee0d5e82f0b9cab.npy +04379243-fb0459ca3947e2fecf5d00de99803a2b.npy +03928116-b0e9391ecbf7334c4383822c87ad59db.npy +03991062-141de0993dd1f2f24efc7e7114f1b9c5.npy +02691156-28add8a00a7bcb7318d508b491dafd46.npy +02946921-17ef524ca4e382dd9d2ad28276314523.npy +03325088-941633c3da8099dc76c18e71fd49c4dc.npy +02876657-8099b9d546231dd27b9c6deef486a7d8.npy +04379243-4d484d20a59a18d3fa6df2d54fa43ce.npy +04379243-29207ae4e01c415894fc399eb2c2f348.npy +04004475-f5aee7d7732eab9bd477567e8c8a6c59.npy +03325088-b7bbe0ef4893621414b35a7d7cea7130.npy +02958343-58773b5aebc3361793680c5a9a367b4a.npy +02992529-1b1aaa9a95ae964746becd46a4907f38.npy +03636649-70bf2aaedbf9499ec889c00efdaf9928.npy +03211117-f240248beae8d20661049a5d9182333f.npy +04379243-55aea0b2f76b3f7819592f8d1b2d193.npy +04401088-96700b47eb9bf33889a1b8cd5b44ae5e.npy +04468005-91bb88fbda95ab44e8784f880dac0f61.npy +03085013-8bbe84f243cad940f0ce652372f56eef.npy +04379243-8222dcc1680112635cc877f4f71ba410.npy +03001627-305589c1e37f32b821bdbc0445d9f748.npy +02691156-a50b4b0ac82a67d0bbb9a486df472172.npy +04090263-6536ba618390e1688e4cfca4542c1342.npy +04379243-6e0fed54fcae8a62edccc47bf0dcf5d3.npy +02946921-5c326273d61272ad4b6e06cda31f9bc6.npy +02933112-4cbb978cef36a5b9c60fe2650bbe2bf8.npy +04379243-8d0d7787f4babee7e66285d36ebb986.npy +03337140-2b2b84efa6e6b42ace5d6e9371bb5c33.npy +04530566-72f4c3c433492d585001cb19c4a0eee4.npy +04530566-476bc79bd6fec6b088f5c2d4f2395a95.npy +03691459-80109bf3b6904d577edd21390c628646.npy +03636649-1562318ff0c62163a488756a9c41f7e.npy +04379243-8383a9cf1380405dd9006da2b93c0a4.npy +03211117-df624231ef05b83d54c7ab6aa5674ccc.npy +03046257-f1ee996e8efb941ad8912880b776dcf.npy +03001627-88382b877be91b2a572f8e1c1caad99e.npy +04256520-a6ee2e98e8ae755f37af16b2893f1d4.npy +04379243-c45fe6d9f2c516997062f2d72cde5c95.npy +02876657-204c2b0a5e0a0ac3efd4121045846f28.npy +03691459-fe4ed2d72cc79c74b59e9758ae7f41a7.npy +03001627-5fa5f75741e94598e6fe3612af521500.npy +03593526-b0f75a497a309499816c17dd8398ee0f.npy +03691459-87e2d9c72eeb8c49f398d0c5832df00e.npy +03636649-1d2c2f3f398fe0ede6597d391ab6fcc1.npy +04379243-5275e0ee91ab4e755d009c98a5b96836.npy +02808440-10caa8d340fa0fddfcd4910413c446d9.npy +02924116-9986dd19b2c459152470de2774d6099.npy +03001627-3c3b33293af7459f2677042d71d00b91.npy +02876657-3ba7dd61736e7a96270c0e719fe4ed97.npy +02828884-90a8b80aa2fa209ca936e2693dce34b6.npy +04530566-98da594a65640370c8333f6c4d99e2c8.npy +04090263-efd09f6901b098e4eab5ee569c9de1b1.npy +03325088-bc30d9336c644592ff2c92c2a4f65876.npy +04256520-9e0feaee4da30fe7fa038765e58dd68.npy +02958343-e24f388736f4e6fd2cdd250493632937.npy +02808440-148ec8030e52671d44221bef0fa3c36b.npy +02924116-c5f11b1e82bf6b1d9aff919557ab16d.npy +02828884-78243d42e55bf254d47bd31d526e1987.npy +02958343-6eba2ec65e8e44ed5545896d1a9ff5d3.npy +02691156-b509fbbe99df854f0478431b5ad57db.npy +03797390-89bd0dff1b386ebed6b30d74fff98ffd.npy +02933112-34bc619e8ab3c0d2a93db6e4c0c75191.npy +03001627-59c89dc89cf0d34e597976c675750537.npy +03636649-b6f69dd63be9146d14f1e0019ad6a8a8.npy +02933112-c2ac91973d449b18738e43095496b061.npy +03001627-e0badcef3c110ec6c4963b39d8846214.npy +02958343-6c339c89246fe6a651db49e653372c20.npy +03001627-3020942d1547cf562056b4bd5d870b47.npy +03001627-4030ea84b560b857febad4f49b26ec52.npy +04090263-b69973526e91e3bd68407c8bfa49d3c7.npy +03001627-f215c608fe63e97d4aada2bcdc05aa43.npy +03948459-1e93ef2704131b52e111721a37269b0f.npy +02933112-3c6b1e5888e5fabd9463d0e381798ed8.npy +03790512-8b2e7ae8b0f0d451d97964d17de80d2c.npy +03046257-48ed307c035fe99e49c212147ab9c105.npy +02691156-94351a82955a6136c3f40f6a57084ffb.npy +03001627-3684490885c259e688235335f9e630b0.npy +02933112-3483076cc008fff0d9826d0ff198257e.npy +04379243-8ec96360a8674db5b000f20a5153622c.npy +04256520-3425e406f20e69efddfee72cbd7395cd.npy +03467517-3a520944e6265920aff103adc6dea0b0.npy +03691459-7628ba96cc90fb4df256a8c3e3396495.npy +04090263-74b95139078ce0dfacc2abd6f796df4d.npy +03001627-661fcd8f87d948f2fff16555386d173d.npy +02828884-9fd13f28f9260e65ad5067eac75a07f7.npy +03001627-209994649e7fdf052ff84f70e18e9c53.npy +03593526-c5beb87c12986f859f3323e6dbd51308.npy +03001627-5bd3e7c9695af73cc8687ff9b0b4e4ac.npy +04256520-5660a383172900a6593ebeeedbff73b.npy +04090263-73cfed37f9da046de2bb19fbad3e4596.npy +03001627-50e3f09b7dc9fcb63fde2470c949bc26.npy +03513137-adf9b0eaf3a1980187710597b0363fe6.npy +03001627-4f7523a3d276bfae4b3c42e318f3affc.npy +04530566-bc09ba292bd9e684610faa04834ad4e6.npy +02808440-b14791a6df68c09fde250725ad622108.npy +03001627-22bee1d9c6357b295493ccf8f26ab2c.npy +02992529-ce62e8c8a75a501535c433f6b651ec89.npy +04090263-64021a29f7245e0fefdff89bf9a96890.npy +04256520-50c1477484688492bbc7a6acbd8f058b.npy +04379243-575a8eca414c69f67bcb070cc655f13a.npy +02924116-b0780e992d557b7a3a142219f8bbebaa.npy +04090263-f172b2748cdd7027d234b3cff759c4bf.npy +02958343-35d8d94bdd379556a37f3fc191551700.npy +04256520-57f5a7660b1f186e14038d588fd1342f.npy +03001627-e19214cabca496a3f7b54e04c7238d7.npy +03325088-22d924ecfa024cc9c36fb70296e45483.npy +04090263-294c7c64f92d3b5537c107a0a05e0226.npy +03046257-15a5bb8c387dc7ac87ad02d88bbf4aae.npy +03001627-31dacef35c2d68cd7d5059679be663cd.npy +04090263-1196978aaae2ab55537a44a51980defe.npy +02691156-14d9c576d06622198f52dc705c3109b9.npy +03691459-9a859f2668f727abf6da3fc8db3c804.npy +03325088-5d7475a12087aba3176bf371ba7a6ff.npy +02691156-47a4ed133dd37264521546825315c695.npy +04468005-3c291cef4c82a608cea8d0e97d819254.npy +03001627-3c3f70971f203c4d6ba836372832f055.npy +03593526-ac3fa82107f01502cba92cca5bb025de.npy +03624134-3dc5a6d79ed591bda709dec9a148b2fe.npy +03001627-972355f42223e6199cd431573238602d.npy +02828884-26b3257b2e094083af9ff91a3a02b5aa.npy +02958343-ffbf897d9867fadff9a62a8acc9e8cfe.npy +03642806-1be64c0aded473d38ca8637757ac3f67.npy +04379243-812dd06fc99f174e9f2349486c570dd4.npy +03211117-9c8a2e3431b0b2dda2cc48a1579329e.npy +04256520-ace4472862ff3f6d917b96045c9b6dea.npy +03001627-c236deaff8c6fb0d29c9a7a92b0a566d.npy +04379243-affb5a80f11b383e1c25d54737ed5c8e.npy +02958343-a72134cd499fd1c4f79e091fa09130a.npy +03001627-1bf710535121b17cf453cc5da9731a22.npy +02808440-a9827a6ad29326ea14c8ee9aa2f8e72d.npy +03467517-1abe78447898821e93f0194265a9746c.npy +03991062-d8feb207fb33eadbfcd4910413c446d9.npy +02691156-e954dc13308e6756308fc4195afc19d3.npy +03691459-ea1b716cdf033bc4bb844bb01fa51c1f.npy +02828884-a001663b61ea6accf4fb4dee5181bee.npy +02691156-b7b8ffe2f07e4eff95dfd5eb5f06d19.npy +02958343-f882454f6fe1c5bcc0e3666c7d0ec7d0.npy +02828884-d5ef0f9bb990ffb3b2725423c902ba5d.npy +03691459-b2ae90026d7979d8267014f0fe84b7ec.npy +02954340-14df58bdedfbb41141edb96d309c9a23.npy +02828884-51d51b67faf16d3d2ea98d69e91ba870.npy +02828884-3feb79684658db043efeb398bf800e80.npy +03211117-46609dafc47fdf2b74b687cfa539ab78.npy +02871439-82b55e511522a942aed93548190eee8.npy +04530566-50c0bd9933f7259fe59358c5e6239c84.npy +02828884-e5af69132cc95133f155d75bbf62b80.npy +04379243-707b9fa6a564ba0e425fe98d8cc1c2c.npy +03797390-a0c78f254b037f88933dc172307a6bb9.npy +02876657-640835881dd33a2d30354e87bd14ec69.npy +04256520-954efb8e36610d1bab610b0c94236463.npy +04379243-28de11ca3a3bfc00acbc34d1ed23b6a.npy +03001627-faef9e4cff5fa61987be36ce60737655.npy +02808440-bf8e5bbe0e0938d98afd316e82119b42.npy +04401088-2caa10c91355efe6ae2545602370c249.npy +02808440-6328094d59f1221d7b57eb4fc830f67b.npy +04379243-482a76d14781e55e25374da32e705c.npy +02828884-ab1c843def8b843bed98cca8f0ccd5f7.npy +04256520-bade4726190d638498614b18e654375c.npy +04379243-c57e4f64b18e9b9aa320e34dad7c78bd.npy +03691459-7b8aedba3024ed389e87d2bdcb41f548.npy +04090263-8fc390879ead5efea0834a5219dec81f.npy +04256520-c6f1601208aa5e72cde6b082a301e49c.npy +03001627-ff14d078e2f0f8c65242f8291aafac22.npy +03636649-ba05811f301cdd791735ea0e092a805a.npy +02691156-bd066f14adf6c0a9f6639976815d96b.npy +02828884-fa4d4e697d21ec65512d71be7dbf2d60.npy +04401088-4b97582ec707108c6ace02f573c40387.npy +02828884-41120a43b6b7c93210399d5a44e67cb5.npy +02958343-66828747e0e7671021c7b87f47c77e12.npy +04379243-ece476ee957a099f5c5fd2c2f381b61.npy +02747177-90ad7e8c047b2dbe4c86b1fdc94892eb.npy +02958343-5b1c430ced749ac3897e805df74453bf.npy +03001627-97bbc8970b05c4a3fcde6bcb709edd9a.npy +03001627-908de4d82bfb422ec43a4855019be9b5.npy +04379243-faeebcbc4798714188b4ba3feb03ba8c.npy +02691156-dad83c903379cb9cfa585c96250561a9.npy +04256520-51f11001548cc8c0febad4f49b26ec52.npy +03211117-7f489cfe5174ea20c29a46091cf24cad.npy +02924116-886e97687dacbfef4fb1d9a9b8854179.npy +03513137-5f0fab98fec5f53bfac6099f3d4830fe.npy +02924116-9482cb79520f1f0dd75a864e79808b6d.npy +04225987-39c8a4798087be3e20d56eaf7c8da531.npy +04530566-edb4574369f95b50689cbb453f479f9f.npy +04090263-3efa6bed63249f928bd9de6b28931bb0.npy +03001627-68f1d9f63eae2b5123c1b1df1d480bd3.npy +03001627-107ed94869ed6f1be13496cd332ce78f.npy +02880940-ee3b4a98683feab4633d74df68189e22.npy +02958343-4e384de22a760ef72e877e82c90c24d.npy +02818832-66eff63edb4f5b4caf5b95a62b058b0.npy +02933112-1676f8b995b976e5824662341ce2b233.npy +04330267-de4301a3ac6e17e9843f813f752a5e35.npy +03467517-d4b021a085d836dd2b996d5d44e09408.npy +02691156-bb7c6c397143f72fe0cfe7507a46f0c.npy +04468005-d8a75faede3de91de75a0b04a57744.npy +03001627-55d147c5125f5043e1ddfae8bbce5fe6.npy +03001627-219c603c479be977d5e0096fb2d3266a.npy +04090263-cb5e01162787772ff7bd077790d66b82.npy +04554684-b0b77a2d6816230c99bb3947ecdf7d2b.npy +03001627-4a45de600363af6bd5cba62773b8025b.npy +04379243-375972fee9a2a6e28d2d730aebe7865d.npy +02933112-4205bc230382f663c59350d819542ec7.npy +02958343-26bc52b1307fca053e5ddfb0ef6345db.npy +02958343-d10226fc9aee707972a38ac2b8f5cd48.npy +02818832-fda18f335dde3c6898ee36f046181d28.npy +03325088-f6666b97498b17853321831d2245cf06.npy +02958343-a7f8cb46717528edace5721ccacba16.npy +03691459-fa6e17f7f928e8a44b2f94f4017fbbbb.npy +04379243-634fece55dc20d232a978d3a5b04bbfd.npy +04379243-2bac94c17bb341d84ab0e621f58e2d20.npy +03001627-a50b78207ec2256168d1b9a1d97e2846.npy +02958343-1b5b5a43e0281030b96212c8f6cd06e.npy +03001627-8f217a409c5407ade6fe3612af521500.npy +04379243-bd2949103a92dd56d3dad974dc098fa1.npy +02691156-9f9cc77c5e32664e6a8a5e39588ebf68.npy +03790512-89c948e75d1c5cde27e168bcc3c092cb.npy +04256520-43507f90235fd3214038d588fd1342f.npy +02924116-1bc9264f1c92b69752470de2774d6099.npy +03001627-b233a919f5d2f6ac2ad490d4d7fae486.npy +03467517-2ad699d80ae93ae793f0194265a9746c.npy +02808440-86880c061d80ebab3956bf2322987dd4.npy +03001627-fa041b0276dcaaaf98e0d1738edd4f19.npy +03691459-52ffd6fe29e51364b21928f7573b58cb.npy +03948459-ac88c6856c21ab422a79dd7a0c99f28d.npy +04530566-a6571d7e2c8f6113b05dfc874f00d5f3.npy +02828884-a857f9d4838b885f2056b4bd5d870b47.npy +02933112-a09130501c18c324404449202e2d8881.npy +04379243-504d908a55f3e0c764810cc21086da42.npy +03001627-2bd6800d64c01d677721fafb59ea099.npy +02828884-5b5d3f675f8d0bfdd2b12aa6a0f050b3.npy +04379243-3372c6b94fc719b9a75d03186a0409e2.npy +02958343-99cc91ea3f0b646be79303516c6edeef.npy +03001627-a89450b61d786e4d115013480320769f.npy +02958343-a495bebb2ebd72f3dd7cb6e3ad90d3ea.npy +03001627-78cf0ebb875de8dfba18ade30e563d37.npy +02691156-f5a667f5796b9a0b9a6e43b878d5b335.npy +03211117-f5b05e9eedcbaf9cf4d1910799b338b7.npy +03001627-8999368504d4374ce4e346ee2650d150.npy +04090263-5d2c6ca737f9accf683e3750b53385d5.npy +02691156-3fa5f65a92a5e521d87c63d8b3018b58.npy +03001627-13076ebf8b5cc457b8d6f69a14683de3.npy +02933112-9ffdd44e709142551b4e9ccf27cd840d.npy +03001627-5019265bd6215c9ed54fd46ccb781717.npy +04256520-1ee15a07c2845ab1b9f43426f477bd71.npy +03046257-223a78dd9e6999e67c0ca8d7a07be3be.npy +03001627-3895b96949fd81c5f07fee5fc5c45ee2.npy +04256520-57094371244c13fbe4ee93147efa8cb1.npy +03636649-b6953f683e8b3feb9571d807bcd25673.npy +03636649-9a244723bfef786294cdfc338037bd95.npy +03513137-ddc07c47962fe10f61f42fcc6613af2d.npy +02691156-cf0cdaa94220ee3f4c3a35cee92bb95b.npy +02871439-e3ae56f176b77359aa1bd50387389420.npy +03636649-eb311e6232cb7011bb5bd941c6665c21.npy +04530566-2d136ffca92d9c4e3639e751e7f78cf0.npy +02924116-60a6ad222bb446721bdb28bea09e3a92.npy +03001627-904ddb7762488b1b5dc3653f8341633a.npy +02691156-e110c699f2ed6511b53a02c8ab03ad65.npy +03001627-e9ccf4cc84c085f8c785f06f424b9d06.npy +03642806-a7f983f1d0642745135a402b573354e4.npy +03001627-c20a354161c28f6ed4da89766e80607a.npy +03046257-a14d909e62adb668661782af60b711.npy +04090263-5fde8eee79ab6885f0c705d37665dc32.npy +02958343-42ca4f6a7d7a39712a9eb0f146e94477.npy +04379243-2575d3108a55adfaba0351028b825931.npy +03948459-8fa02aab7237289667fdfbdf64f19325.npy +03636649-4cda1ff0899a6fd5f58da08b07a975ff.npy +03790512-a54e8fb64e5879161253ed5a61502f52.npy +04256520-93676b6ecba89ebb38449598167b268b.npy +03001627-ed108ed496777cf6490ad276cd2af3a4.npy +04256520-dc62af0b1d8af2c676e9713f57a5fcb6.npy +02933112-5893f6c94b15ba204f3443b22038d340.npy +04379243-83cf3765597a631e4ef113421a70a46.npy +03046257-44a961d1870b2279626620faac40b883.npy +03636649-aa765d04e997e36a1742918a871fc8cf.npy +04379243-b14270faa0beb387f36ea1eb6542fe7e.npy +04401088-cc6c216e25469966bf14f57b214697e5.npy +02871439-3bff6c7c4ab1e47e2a9a1691b6f98331.npy +03467517-e59ccf98ad868a758b1a3513f58ebc5c.npy +04379243-53b1f1781eb6339f5f4be3ad507aab92.npy +04401088-3035c3d7d7eef1fc952c851f81463faa.npy +02691156-7addd02b1c255edcc863ab010b80d9ed.npy +02871439-c3f572493adf0af810b7af17eb4b15c9.npy +04256520-511d9b4ffb8ad21485b479b317175b55.npy +03636649-627ed898c49543594c64af119029e57c.npy +04401088-1c87049d11292c5d21e2fbffea258ad5.npy +03261776-ca1c1c9aba8f4491a656de49935d2359.npy +03001627-92c068abecb15e1adcfd6ca2b952d624.npy +03691459-782655d93313d14726ee873dae10ece7.npy +04090263-164fc79c2ecf843bc8e292146f3d4d52.npy +02880940-45603bffc6a2866b5d1ac0d5489f7d84.npy +03467517-7946e354e342f560c5a468097fc791e4.npy +03211117-5bccf9711e1cfcc914e970d26b98a862.npy +02924116-57b3c60a91e930b42cc89196d0104054.npy +03001627-2ad02c9ed22b03727f141968548cdc00.npy +02958343-b16a147485ec40b25a70c4e5328e0b9f.npy +03593526-a18343c4b0a8026faca4186c3b7dd23d.npy +02876657-2cc108080535bc51e7a14f6d159dcd47.npy +03001627-a8756f91fe03b962492d9da2668ec34c.npy +04379243-345c1bb95b12ff8c013a7bed5288654.npy +04379243-3a69ef9c6512041768c981036afdae64.npy +04090263-50b8d57468b748c9f471ee8186a0fef3.npy +02843684-7a2642b37028b462d39f9e7f9f528702.npy +02958343-7db6c18d976e52e451553ea674d2701f.npy +04256520-27ff0317be31b5932c4e6cb98409dcac.npy +03001627-e50a97aa15d7cbc5972e15b580d9a5b3.npy +03001627-bb4f5cd713a817727d4f8900c5174db0.npy +02924116-3f20a5b51a68667941cefd10ce5d6cc0.npy +04379243-13f2a907f3ac7dfc9b8e42d3eb7abddb.npy +03636649-b6200d3340e31bf4da2dc0e73fb5c1f7.npy +04379243-ddb760d364ee3c5aa7257db74b7b377.npy +04004475-951ea8eeb141a54f9f4a2836426bf029.npy +03001627-e6f37dff25ec4ca4f815ebdb2df45512.npy +04004475-27c2d447b0597c177d9df21a696a9ee3.npy +02924116-2a594ade8abd8f816a7e70b9f461caeb.npy +03948459-fa12f9633aa3c6c9150e6b54e0dc098c.npy +03001627-1b05971a4373c7d2463600025db2266.npy +03624134-c19088b4c32c0f1d22b38218e60be05.npy +03991062-ecac13674a7d2d5be44bad6fc9badfe7.npy +04379243-9081c28e6a90fab1698da6fabf8a99e2.npy +03001627-de9e40c346ad2779f8c3d2002c77ddb.npy +04379243-a516711827a396085528d560ddea455.npy +02946921-f6316c6702c49126193d9e76bb15876.npy +02924116-dca406daf4b48e6760a4e5b4a0135038.npy +03691459-65b461241dd4a4698152e0baa78ddca4.npy +04530566-1e127a7ca9bfcba86df38a7dd1b448e6.npy +04256520-872e3d94c4a37f00d9b53420a5458c53.npy +04379243-f3a44bf9a27f1446ae23680cee12f145.npy +04379243-d7f9651b64c82c799e7c6a73ef46f40c.npy +03642806-a66e02f0effed39f4145b5f47fac09a5.npy +02958343-12d463649ed6c176ab98a7077c964a60.npy +02691156-6e7bc6995080fe6542ca265836030911.npy +03001627-b9e93c2036f24661ae890f02c6b951ff.npy +02958343-385f12fba67e43ada9fe1734a6086750.npy +04379243-95c2e462b2c3e5e529d8eecf3827c486.npy +03001627-b7316f361054c8501962281db2f162a0.npy +04256520-790e42476f871e29e0a954c49a0c328b.npy +04379243-594ca5d155b0bdc2c3bd24f986301745.npy +03001627-7049a1875e1b82d71f8d8332ee17945a.npy +03759954-db4ae89650e2d483d0c3082093ab9709.npy +04401088-113303df7880cd71226bc3b9ce9ff2a1.npy +04379243-b95b9f2d28ab42e49bdca9b7303475c3.npy +04256520-5a2da4b824000054d8390ec1728b1e3e.npy +04090263-9a8ce31de8d6f549a5aad165050e534c.npy +03001627-b117b01ab380362db8134b0fbf68257d.npy +03467517-c96d3c76605bb8ce552ddced979ec9be.npy +02958343-d9cfad911b26b2ae5690f18c88ad5b9e.npy +04090263-b4ad3d030491a7768aa7cb0651220ba4.npy +03325088-83c02a3da44759c73321831d2245cf06.npy +02924116-84b548a6c1b3d7e6c8af801085947b1c.npy +04401088-dd8b9ca9abc834feb5784fac792d6797.npy +02924116-b88c90b6cd62087bb1626da45836ca54.npy +04379243-317c099a20806d10b5c1550bc8448972.npy +02691156-42dcf7058ed936fd22362be7f5226e91.npy +03001627-71dfc2ea8bd6cfaca8e4e5c9426fb9cb.npy +03001627-6fa2db75b28cc1375c728bbce49718a0.npy +02933112-4bbac921678eb957614319d7d997614c.npy +02933112-37b9ca6c1be7e6e7cddef51ecbec6f95.npy +03325088-1f713f9a9ba4eca2b362845c6edb57fc.npy +03467517-7b93f4df48c5e3c4d22ed761db9f24fa.npy +03636649-1efd03d9264973c9f2098a9f7fc86999.npy +02828884-1be83cdaf803fa3b827358da75ee7655.npy +03325088-1f223cac61e3679ef235ab3c41aeb5b6.npy +02828884-f8137efb3a8bf9c3d2b12aa6a0f050b3.npy +03991062-fa392260102667eb612edac3a429aa9a.npy +04074963-e76784a475f7aeb57e1c85c5c15da7fb.npy +03691459-51bdaff7782cab384bde7bbe88086aa1.npy +02958343-f8c4bfc065e35555aa44bfa127abe4bb.npy +04256520-a76a2d34a1aca99611e76965808086c8.npy +03001627-7217176942b8fb42fa7b9a6c80e4e324.npy +04530566-75d41ee15fc8fa4cca581939cd410ca.npy +02880940-98d3408054ab409fd261c3d31246fed3.npy +02691156-dfa5d6ed898152d34210bb5f1b1324bb.npy +02828884-b788370bde4ecd578a333b44b8649ff.npy +04090263-e444044f8872e3b9e1f2a1daf140ac9f.npy +04090263-607b9d1474c640fb3d7c323cf1653143.npy +02691156-bfa8e832618454c0a179137acc8d4437.npy +04090263-27257aee4b0f91b1a16c70da5e24216f.npy +03636649-a4f6213e0b627da55637847f2942f876.npy +04379243-763fe8469c9d204931a818ce55e517b8.npy +04090263-ff5319e43471e9294b49cd65dfcc3a9a.npy +02992529-401d5604ebfb4b43a7d4c094203303b1.npy +04530566-7eefcf457d32b9b03146aa85e47ab8e1.npy +03001627-fc723b936f8d8443492d9da2668ec34c.npy +04530566-81c9e9d3f461c4da9917c7f0cf5ea813.npy +02691156-171f4e9ffda674f44f4fd7b0550f5bef.npy +04330267-826cea6d1387d794e793cc5433bece89.npy +03928116-d31d78811a2028e7d0683b3f1eb1a170.npy +02992529-ff1e484e02e001bdf8a0d9b8943b4050.npy +02958343-72d1eb25d911b6d8913eef1194316fef.npy +03593526-43816943fe7907124e806038192890dd.npy +03337140-d2fa80249a7d959091c352d02061b3f7.npy +04379243-729ff2cedd68a1ad489b0e2838fd952f.npy +02691156-33b8b6af08696fdea616caf97d73fa02.npy +02828884-36d1f0331d7f4ad2cf695c8970a97c29.npy +02691156-831171fab182f62eb115cf6cc3371017.npy +02992529-144d8038c1688e37ab3dd76bf33b0f5e.npy +04379243-96cd9d2f9dc5e102a8529d50958b092.npy +02691156-a5be00166e57ce5dd92de1e594e3dc28.npy +03636649-978df83c1cee012729a60d6ab40898d.npy +03001627-b8b5e172ee58899df2d9e72ba502035.npy +02958343-93357732c6306cb51673e1c313348a01.npy +02933112-2de782c81c89f704c2b64c0adffbe398.npy +04330267-108f01e1b4fbab56557991c690a01e0.npy +04401088-d98df8313cf5e0a7814fa32b2a1183d4.npy +02958343-3ca3c91dae8d2cbdf56f8ea3d9016e55.npy +03642806-7ebe5cc71bdeebd9dd70b866e1cfbf35.npy +03001627-c0b10448880dec62056b4bd5d870b47.npy +02958343-8ed0533fb22f972cd76439fb95cdd2ed.npy +02958343-20ece5093ff8da0bbda72093f9b5aa73.npy +03938244-98159cb7eb8bad07c45c0f305d0b6e87.npy +03636649-e94644a89151a426876b50fc31ccedf9.npy +03001627-297a74e1a658e231f51f77a6d7299806.npy +02958343-79d9cd9a0cc2184ffcc96966174e5650.npy +02992529-325ecc3acd232a5e981b9cd34407d026.npy +02691156-6c432109eee42aed3b053f623496d8f5.npy +03636649-86ae11f8d3079f0869e321f074c1ab85.npy +03991062-f4cae0649c1d4c6034c8ebd75c7d8f3.npy +03211117-c47998c0a317c60611ea7f12f22c0e84.npy +03001627-90dddd5e4aa586bf14513156cf2b8d0d.npy +04379243-710f2f56520b0bdd9b11da89c22111dd.npy +02958343-5f742b43bd5884c6a352068a7fd7afee.npy +02691156-e8c1e738997275799de8e648621673e1.npy +02691156-3a756cbf87c9a6c64d210d9468aedaf2.npy +04379243-35e1541babf368d83328d823e2d2a6d.npy +03593526-420254a2489912c13f8d8f0f2ad2ee2.npy +03001627-2c03bcb2a133ce28bb6caad47eee6580.npy +03790512-b3582e7abddb916c3722d6e4d79b71be.npy +04401088-53cd656555da181db6d41c42f7ade8c8.npy +04530566-6847480bd905f05b544654c1c7449887.npy +02828884-366db933a2c99444f4fb4dee5181bee.npy +03991062-41415d201e1e6b6c78caa162a41a851e.npy +04090263-c9e3dcd6cb94418bfbe54b5d01550.npy +02924116-b31ae15dca8bfe3028c832d54092e2c4.npy +04379243-e80016d5886fced69f8f9f2bcc40c84c.npy +03001627-5b2cfa084b8cfe389753496ba23f2183.npy +02933112-221c831217721399ac043ebb2140dae.npy +03001627-8914307dbc15a20387f0bafef1e13471.npy +03001627-bc61ea1b9348f456492d9da2668ec34c.npy +04256520-81180dfb3874d4c76dc992d5c5e6b2e0.npy +04379243-4d43e9b908d77ddd2d19175e7d19b7cb.npy +04530566-5c9d5cedcb75cd2bad7daee13cc76c38.npy +02958343-167df2c10c116eb5d61b6a34f3fd808c.npy +03325088-b6a6a851039907c433a676b484a36f68.npy +02958343-3b1ad5c98cd92726b60a292fcb118b54.npy +02828884-7b7b25e8ab725feae76bc197b3a3ffc0.npy +02876657-4ec31503deb053636c19a70b7478f722.npy +04379243-eef44075cd1781f1b0a6e87d5d5521b6.npy +04379243-2b1747c389f4d4f1ebadcdfba7971b71.npy +04090263-f2e592962a9df3de1d27f57617a4976d.npy +02828884-b2a585ba5f0b4a25e76bc197b3a3ffc0.npy +04379243-fa5d7f9c54f5bb2010b97bd228fca721.npy +03593526-9215bfacbcac3cb67697d9c3588bbfc5.npy +02691156-f73a8fa9c2859211f2b0736dd4d8afe0.npy +02828884-7df3c8885b22900ec88ad71674956292.npy +02958343-8decf42b145f98d148d2ba4615e03b21.npy +04468005-108baba96ac2f9be5f73a346378dad81.npy +02691156-22c11b2bab2cf93fc1ccec171a275967.npy +04379243-725fbbe72a41e6feafc1aae4dd82ec1f.npy +04379243-884f8604518cdc98c3bd24f986301745.npy +03001627-3896caf2057eed81589929e81650825e.npy +02958343-a39ed639d1da66876d57cf36a7addb49.npy +02828884-3b2f0fa67b29b6cd389a52d0b0203298.npy +03636649-266b5e8e78e4c0dfb82cf928f6ed5338.npy +03691459-12ddcbc94fa909502533128de72c17f.npy +03001627-ffd258571807e6425b1205fcf56bb774.npy +02876657-9dd18bbd88df283a6b36e3e6a5b248ba.npy +03001627-ff2333f528efd790fc93ece3545739c4.npy +02691156-d24f2a1da14a00ce16b34c3751bc447d.npy +03001627-79fb74d29b9b772c36b0f2a1430e993a.npy +03001627-a07f62023d3784839aab0d90d6455f4a.npy +02958343-fad616172dbd52649f06afd991af5139.npy +02691156-a20490d0ffcd3be6e0d6812cdcf8799b.npy +03001627-b192cda468f9390aa3f22b4b00de6dfb.npy +04256520-4ae401feb8499f5c9f2349486c570dd4.npy +03624134-612870fbbbbce57ffcace4d823343363.npy +02958343-40b272e537fae1418277d1ad96e14e9a.npy +04379243-516928532093f765bababe11fcea8796.npy +03001627-508450cc9ab2a5fa98cfd47a860803c5.npy +03325088-bcf485906e70fb0e50da8b99982a3057.npy +04530566-fad2e708e354b0315e585de41f56d4fd.npy +04256520-9eef66b5d0444f8398cfd47a860803c5.npy +04090263-36299a0fd2aebb5b1cb4c4614a9a037e.npy +02933112-83412e29d5978b101f6dfedaba98d5f9.npy +03001627-2a56e3e2a6505ec492d9da2668ec34c.npy +03636649-312d6dc78d666dc88a74e38e7d86eecb.npy +02691156-b9ba988dd9a6cf426e8b6dd39a855b69.npy +04256520-ffa7680b18ede5cfedeed2a7fa983956.npy +03759954-bfca931e3aa57d06ef026123226f5519.npy +02691156-421f45774389984bea6586b61968eac.npy +03642806-8489cb783d249651b674654e7bbe623d.npy +04379243-467e71e8e546721e1aa023603cb7e1bd.npy +04090263-5b7e127c67c72e72f6ebd7f0952711c3.npy +04379243-7b2af227264af938d42b9650f19dd425.npy +04256520-d510edfd51ee8a942dd4967de4160123.npy +03636649-5428e217da1af02822a33e080d0e71c.npy +02828884-8f25e1c5977cf1350f0339a8f91fdfe.npy +02924116-150004fead49c0b2193d7855ecfc1bd3.npy +03207941-a5084a48c41d1c454fa5742b9f971b9f.npy +02691156-757c47e20a37647431e38f024b7ad042.npy +03325088-74d1b8b026ed9dea3321831d2245cf06.npy +03325088-f5768e78c91ac91dd5fb864340bb146.npy +03991062-a002b46a27eedc46abd0967c9a744f48.npy +04256520-bf30f90b1c864bc2d5cb6d178687b980.npy +03001627-e039a013f1877fbf42bd71dd667c95ad.npy +02691156-8d148580eda6994c2a8810071030bd25.npy +03001627-40d4acc240c458a970aa4d5182ecf167.npy +04090263-d3a7c0fd2e4418861fe7d5784ec6d0eb.npy +02691156-b51c1bb30371852fa325f626d0051e24.npy +04401088-5ae839d512364bd4da0f54fde38627c3.npy +03046257-9b66a37c0e1a1da2d4096e81fa01e27.npy +02691156-77a70f61dc0c6260e70eaaf99089d5f7.npy +03636649-7be01530bf43f2ed8a83637b92bdc7.npy +04530566-5b86640d3bc2e43decac3f40526a2cc2.npy +02924116-c08377fec8061e8ab1626da45836ca54.npy +04530566-787e381b4a968a55af5574caf3b1433d.npy +02828884-371e22e18f8e2fccad5067eac75a07f7.npy +02691156-dd9a7dd5e2ea3389938204d34a891739.npy +04530566-8eeb2bec8499fc6ba60ce6f0a0028c13.npy +03948459-9b6c6048719e7e024cb47a45be6e6ae3.npy +03001627-c520bc9dde7c0a19d2afe8d5254a0d04.npy +02992529-c2884eed47300891697f9662a764c78.npy +04379243-757ad2516284e2728d3e4a6c55f660b8.npy +04256520-13b9cc6c187edb98afd316e82119b42.npy +02747177-16521a9446e3de14a6f567d4d1e09ecb.npy +03636649-31dee666120727b0be78c8b300d2a963.npy +04379243-ee5f0411fcff59951105a3fc18779f13.npy +04256520-8760843dbfc059d6c242632b2a8c3129.npy +04090263-6655be7932b8b984c04419d9f4e18d0d.npy +04090263-280cbd90ba9cfd24fc105e275e6ac8f1.npy +04468005-e5d292b873af06b24c7ef5f59a6ea23a.npy +03211117-15f23ffcc92b751af7502a3b84f78df0.npy +02691156-776c423005dbb55d354aed6327ff24db.npy +03001627-76ab50cc6491e518782f27684f3b650c.npy +04090263-22d742f999dd7823bd2cd7f810561bda.npy +04379243-49e5f7af3e3c0ceb87e54aa3a663dbe.npy +04379243-e3457599e244cb83ef9a8aedf51bb497.npy +02691156-ab8eadee08cba8d8303d346f4be7d4f.npy +03691459-acdf7e6e551eaad3423723bc261e3897.npy +04379243-1a43bd2e53364313f51f77a6d7299806.npy +02880940-ad8a50aa5894bc40c762eb31f1f0c676.npy +04379243-f4b83b7fde9a4f0cdc3d55ecee5c17b3.npy +02691156-947ac452f850e284082bf69673a94f.npy +02691156-80da27a121142718e15a23e1c3d8f46d.npy +04401088-4a48ce1a067f686dfb63369d5dd85d25.npy +04530566-9c92c9e16d1d214b81eadf50fbd8addb.npy +03001627-20e1bdd54d4082097962800be79c6e52.npy +04256520-c7f31b9900a1a7644785ad2feb797e.npy +03001627-59bd57fe0389e7831f7c97814eaf956d.npy +03636649-5d69edfdd6f7f62ff88ace17ca85e37c.npy +02933112-19a0a48b2b908dafc59350d819542ec7.npy +03991062-1c4257c50d27388525ebd1cd0b422e32.npy +03001627-589e717feb809e7c1c5a16cc04345597.npy +04379243-892127d87f684bd14b91ba28fa583347.npy +03991062-72bea517f9d243808b80480f1020d2fe.npy +03001627-d851b8a016cf114c742f75bc7df727ae.npy +02958343-56d5921f58898cbc56e8a11c9bc9a7f.npy +04090263-34eb31e5ac8802246f2614b47f532d63.npy +03211117-afcacbd7078a3b4b70bb6bcb670ecdf5.npy +03001627-4f136e2a90fc8ff63ac4c571779c5fb1.npy +03001627-50016cf5a426bd63f9d384ecdcc090b1.npy +03325088-c69047a5a9a995b1c36fb70296e45483.npy +04256520-139b1622071f1864f7d7105e737c7740.npy +03001627-813f84c21a081253c02e349cb722a77a.npy +02933112-548996207fe62d4a89ecd28750d46ac.npy +02958343-db91e70ebe09d5edf446f92b52bbd82a.npy +03691459-98b920157670bcdd716d882f857922cf.npy +02958343-af94283a61eafc7183a0f773f3852fbf.npy +02828884-f133d3165d54e5b227d635628fe95db0.npy +04090263-121ef8a289b232a73c5eae1befdca7aa.npy +03691459-b7c5eae318e4e796d4e62d99c536bbaf.npy +02958343-834c7e46dfe757b4d229396ef51d2d02.npy +03642806-59bf155f2c4d655894c7c2dce500aa02.npy +02871439-6dc2a415f75f0500cbf7082b5354e908.npy +03001627-1c173d970e21e9a8be95ff480950e9ef.npy +03790512-5a1e4b1b6dfe231a362d3a933f999b0.npy +03636649-4f16fffbe480b835276206fae5d3c473.npy +03636649-2d9224be8cc6fdaa1050b055aafa6fb8.npy +03991062-6957f3429308af2781faebbdea6bd9be.npy +02958343-bf506399c934c6b3c3eedd6d54e2a52.npy +04379243-3d4399c54a60ac26febad4f49b26ec52.npy +04379243-68142013a4f5e7c2febad4f49b26ec52.npy +02828884-15fd978b59889cdc30bbd4cddd04c77b.npy +03001627-8114bc9ee0a7a093a094848ea4d06501.npy +03691459-bcada2acf7cdd8c29a08db804545b684.npy +04379243-fc51355d4d03ff4ae6c5cd45aa112726.npy +04379243-a4e5a85d21a6b36ba60a29091f2ab01f.npy +02933112-6c45346990283b7fa2e244117f013369.npy +04256520-1a525427776b39259c89c86daa5af59d.npy +04379243-c85ba9a3e1896eb254adaad15f0d584e.npy +04256520-18a45593c2ac4ffb6deee1099ca09a28.npy +04401088-f760cdb0f8cbc6fa3c28e819722231b4.npy +03467517-ca9720d793355dd693f0194265a9746c.npy +03001627-6df1ecffaa0abdbf327289c00b6dc9ca.npy +04256520-4ea78c36488dd185f3598efd14e493d5.npy +03642806-e083105e9c2a28bb0c3a03d0a1f182f.npy +04090263-553b06cd4354c8ab1c15dec0da4e4dfa.npy +04468005-25d7d7fd82d761b5b80968527b758d3d.npy +03790512-54f016b47a5864cd5dde04c96fd8146.npy +04379243-62cb358e8c73add6b71af98eaf823ae8.npy +02808440-20fb36fea4f6ce91901fed29c825c894.npy +04379243-d828c9f6c3e9f67367d177b869ee03bf.npy +03001627-87a3ee7e68f360351db0d76a41d718a1.npy +03636649-ad01773f3f53bca3a8ffa3a6526018ac.npy +03001627-51d151853d8d05db639e286420a03c3f.npy +04554684-30468019d1d90687b361c88e264d57a6.npy +03761084-2a791816d868a81875782a1c52f768a9.npy +03467517-369fc7f8d880e1b793f0194265a9746c.npy +03325088-7f45c771a4cd5ca614b35a7d7cea7130.npy +02924116-2a5d0c039562dfe8481aa8b5531c68a9.npy +04401088-74e5759913a2ac208b0d3d4e51815944.npy +02958343-a9aea98c1e79a2e6e99225f2edcc7982.npy +03691459-789c800c7f6d9e00b5f0ecf6cb865832.npy +03211117-9b764d286359e0f9cb84789183638105.npy +03001627-3f23ed37910bbb589eb12cef6be5d578.npy +02828884-decfee8dff04ef84990a10a82d99ca57.npy +02801938-951c5192ed4b3759fb0f1b7266d79466.npy +03001627-9058e82b6cd496891e481c46590219a6.npy +02958343-6be5a91bdd709a42634d30cd3ecea7e5.npy +04090263-98375ee901fa6ae4e2e7039a6accd4c0.npy +04379243-f7f5cb907c50a8791f66341aa9abe5e0.npy +04379243-63c4c59906d69b0ffe15c1377dcce2f7.npy +03001627-187222bc1f81d57b781d9dcb8ecbccc.npy +04090263-87652d99be1b6e386d639befe132b2e1.npy +04090263-2385f3cc7fe8490bd3932d50c4a63aef.npy +03636649-8ce777fa2b40476cfcb8d8c6d4df8143.npy +03636649-cc3eb92ef1319ba38a3c32fbf0f86f95.npy +02946921-669033f9b748c292d18ceeb5427760e8.npy +04379243-675ac6cac5a81bd3811cdd52f3d07553.npy +04401088-6a073661711d8b9f1a5b805dbbf26206.npy +02958343-9171272d0e357c40435b5ce06ecf3e86.npy +03001627-8ddaa112e6ba36b5b1e23c7675c49239.npy +03636649-217bf5bf88842058b8a06a6203bc49a9.npy +04379243-5ca0a56bcc0d469535836c728d324152.npy +03593526-770df0065c50c19dd884646143528886.npy +03636649-f5c61ca4acfb7f5435836c728d324152.npy +02691156-7dfaa526d4b432e867c54439d6177032.npy +03325088-c72b179913088d6d76c18e71fd49c4dc.npy +04379243-23486b58246302de979ace30a051374c.npy +04379243-c20a339e2983a462406281a1e760ea19.npy +03001627-c5e3ef17d1fc834b3c84e7f4f4c3d556.npy +04379243-6c8bea32e31192a5f1dc60fdf1e64165.npy +03691459-79cbb3c5f6bad447abc635d6ed355bef.npy +04401088-67743ab1b28ab5cab3fcf86503541b68.npy +02828884-6eb04c416f0e40565a3c5e32936a202c.npy +04256520-49e39486a1df116be3923f7359326ebf.npy +03001627-c93113c742415c76cffd61677456447e.npy +03691459-36b29f93deaf22f66b1cc4d44837f930.npy +03938244-7b2bc135a01a7ff59be1712545749b62.npy +03001627-56fc424a89bb137bf2197da8dec8488d.npy +03636649-a37f1bd2732ce11981d841466b314f95.npy +03790512-fea42d4f08c271dcd5dde04c96fd8146.npy +04530566-77aacd8997c67145cf10e9e4657f415e.npy +03691459-87f10613128f3e6198e0c75f11f82c6.npy +04379243-ad38f4e8026d7858c3bd24f986301745.npy +03001627-9a28bffd582333ae2af4036e9c51cbc4.npy +02958343-c2283d62367d637249b991141ee51d9a.npy +03790512-33aa1eadcd21734148272812609617e2.npy +03001627-10709332176024ce9e47e7a22e24daa3.npy +02958343-5135ad38043cfe64eb766e5a46fceab.npy +02691156-d9a92927192e9755702736225b32125.npy +02691156-8fa9e2e8dbed43911f32208e53f871eb.npy +04256520-db8c451f7b01ae88f91663a74ccd2338.npy +02828884-9f0a6e7c525c3c53d4d8765e3910f617.npy +02691156-9873e280d91107fe9a55c6af6f4b2bb3.npy +03691459-d8ce373c4ad4e6913caae5373ff4181f.npy +03211117-f0582a84c9f7f353ba24f8032b14b71c.npy +04530566-d0d2753d2d3e6d3d2752699ac7aab1.npy +03467517-ab6843f87773c77e63e6b27c89da971e.npy +02691156-c777a5b86424892c644d8182e9bdf4a3.npy +03211117-f464a98b2d4f598be8581b38259c3721.npy +03001627-78d3258e4664daa9e8f8c11a24c52ebb.npy +03001627-a565a80b093f12005481bf9052f50100.npy +04530566-33f4d31a559bc07fc1ccec171a275967.npy +02946921-70172e6afe6aff7847f90c1ac631b97f.npy +02958343-5e87b04efd58cc8922412d2a728de1d5.npy +03001627-e2a7604ce1b5e6c4c3c6a889ee0bd115.npy +02691156-33c6568fd4de5aaf1e623da3c4e40c05.npy +02933112-429638b99d096c89c59350d819542ec7.npy +04256520-8180afee86f2075519fb4103277a6b93.npy +03624134-7be45dc5c51ad883c56c4418b190e03.npy +03001627-d0215a0b82661b82496d6322c763591.npy +04090263-5162b8d6add4dcd7f0fea2ee98610322.npy +02773838-e450a063965ce182372d50f0ef237781.npy +04530566-956c3b989bdd0603158a3417d0510bc.npy +04256520-ecf29f5698798a74104d78b9947ee8.npy +03948459-86886a49bb69dce3fb5c1b0f759e2bc1.npy +04090263-fa4cc6689173c57a25975e984b0e050b.npy +04379243-cf2351b8172fa011a6f925961cc8367b.npy +02958343-5876e90c8f0b15e112ed57dd1bc82aa3.npy +04379243-5b62582a39681d809699d7bc7fedec1c.npy +03001627-a9b75041c8ef8654f2b838d6025155d8.npy +03636649-b4aee889d5e2a826f6747912091f1965.npy +04379243-6aae2a0daba548f082ec48ff3a4fe07c.npy +04468005-3b52c5d66de4247952470de2774d6099.npy +02958343-38326e6ede45e5ab7b1fe308bc94d4e0.npy +04379243-32eceb8ea5b43926de4d0883c61d7e14.npy +04379243-76206b183e39910a1c6b880f91673ae8.npy +03790512-f160284c3ddbc5df573365aa54129c1b.npy +02958343-b2f412545dce6e8266ff862bad2bb0ba.npy +04379243-b24d5f0395eb987e185574a5e2255bb6.npy +03001627-e8c3582f0413179b47edf0d5b6459616.npy +03001627-570527a5388977c878ba201e6a414b21.npy +02958343-3fefe1e60f5683db247a5be450795511.npy +04468005-ff63d2ad2181fd002e730f8b5eb2a879.npy +03593526-5bbc259497af2fa15db77ed1f5c8b93.npy +04530566-fc71778c7daf92e49786591d9b03a096.npy +03991062-4cd5c535b26e905aa2c59a4d90e63212.npy +04379243-5fc81c6ef8ae997a6ba09c1bcc052706.npy +02876657-2c5fd15998b6f8b996716aabcb2fff20.npy +03797390-c7f8d39c406fee941050b055aafa6fb8.npy +04379243-50f1ace689c05bed30bbd4cddd04c77b.npy +02691156-3209a02075cb9f0168023bcf4ba60aff.npy +02992529-a0a41f9444733969c3d30d5f04be159e.npy +02828884-f9e7dcaf9b7a9eb3c9befbd10d7e29b.npy +03001627-b83c9e0fefbbd843e88e73357a673e34.npy +04256520-5149af0adc1f4a6aa45aa09d68b87656.npy +02828884-cedbe77bb857a16d3104206d774d39d1.npy +04379243-9b3433ca11cd09bae7c7920f6a65a54d.npy +02924116-386ba34d362af65e699f58a238068686.npy +02992529-8961485f45d94383af4ba3ad8461249b.npy +04379243-4a3fe6b653bd51d03d5f95f9058dd0d4.npy +03691459-fa98563736440326ce1db673cf70420f.npy +02958343-ad00611d36e535f266d77f2d6fcbca33.npy +02933112-297684bcd05347cd86d53ab0fe94e911.npy +02876657-4c5329ae5fc25ff5b7903bac4a497954.npy +03624134-2f74196bd5cb462727c767f081f1365a.npy +04379243-e241cba189154397718664fe76a3c7a0.npy +04256520-eac135eb1aa4665c4b3c42e318f3affc.npy +04379243-42c35105a94ae6e68ec80f11cb8c2f41.npy +03636649-2d3c98d5d85f22a127babbd370e736b.npy +03691459-3fc0513ac3bf11c873d25f4e2e3775f1.npy +04090263-3b4fcf1d294f11bc5db864c34fc9b1b3.npy +02933112-88a30428b822f8ad630e9aba042fe4f.npy +03691459-1bf06b16e59e482c238ad1274d829e68.npy +03691459-f187f9369aa0a93200d439345883b61.npy +03001627-fcfb7012968416679c0b027ae5b223d6.npy +04379243-7f284e0ae4c1430fc5beea20858a99d5.npy +02933112-696c0051a5d5db993bd5bed2701d5593.npy +04401088-ba21b515df2f8a8f19db431d2a67219.npy +03001627-a06c400e070343cfd8a56a98f4d239c3.npy +04460130-283c8fd32d9b9a95c2c6f10e262c6c44.npy +03001627-3d5053323021b1babbaf011bdbf27c0e.npy +03691459-bc11fa1bae19a90ad74a70b98d3225c0.npy +03001627-b41aaea5754adae0444b41d6d7f557fa.npy +02808440-77e9758d3d2256ddccd0340812259a39.npy +03211117-7ad85d1478f03d4f4532b058befb6326.npy +02876657-d2c9c369376827adf8f0533aaf004c87.npy +03642806-6d2681893925b93133817c25ef5f879b.npy +03948459-2d582f697e4522e6e1f2a1daf140ac9f.npy +04379243-5ca1a1574679afed68661782af60b711.npy +03001627-90a7820e2391509835836c728d324152.npy +04530566-b472526267976d94e145e5e8ca0d926.npy +02828884-1093ca7b44ac90cd902e30b4d3d9167d.npy +02933112-13bae5728bec802034ea40f5d8767c57.npy +03691459-2a38fb6acef92461ed2aedc3715ac201.npy +04530566-e5bb455414be46bbe62f291403035429.npy +02691156-e115f4f824e28246becc132ee053f2fa.npy +04468005-a9c20f1f97afab8485c84583a15d0973.npy +04256520-6043fcf2ea4aba3a8888e7425bc4b85.npy +02958343-66edab2d079680f876ad064d1c5fdd7c.npy +04256520-41aa5dba48b7a3f683257865d0a50551.npy +03948459-9b19164c5b17f3016da79efb34b8c0b4.npy +03636649-39439a41656f7d50d42b9650f19dd425.npy +04330267-52d465df8deb8d51908e9df84c8bf032.npy +03211117-78e7b27f68570f3c47dcca01880c200f.npy +02933112-d4c4d991f9fdf0b654affd783a718eb.npy +03467517-f1fb45c857f52083a24eeca91f583600.npy +03001627-11fa9b044482814ef91663a74ccd2338.npy +04379243-987b7b49a1435a4b1b17743c18fb63dc.npy +04530566-991dab2b2339600a27da61c271c9c6a1.npy +02958343-c6709eb00a557c9785af3668c1cb30b.npy +03593526-b99191dfcaa751ad50e02ef26f47fe02.npy +02691156-1a32f10b20170883663e90eaf6b4ca52.npy +04379243-bd39b7924b0f69359d0d74633db4834d.npy +04379243-6ec12aacb68a918a311268c007111527.npy +02691156-fe3aa0ec747c12c0ca8607f540cc62ba.npy +03636649-45a2e2773a905744d5c91bd67a7ae42a.npy +02876657-bd28b6cd2fdb691b8d8eca78e5e16d9d.npy +04379243-e563bbcb07d70dcc3321831d2245cf06.npy +03001627-64139338cf8835515d6c0eb60be969cc.npy +03211117-ecd1641932584115fcea08a6f6e1c30a.npy +03636649-c905941a8db6575fd5141de389ccb29.npy +02933112-3a910cc1f575b08339d3717288022c20.npy +02691156-8fe1c92c1c9ff33fbc0909d98a1ff2b4.npy +04256520-95d394154dc98f0ddbe9c90af547c85d.npy +02691156-4a7b3bb0f7e4e13af7f031a34b185310.npy +04256520-512434114e17c17d4a79bd7fa08bf04f.npy +03001627-9542f23e526bd7aa24adc0b4355a9827.npy +02828884-bb07fac582a687f0828583ad97f853c7.npy +02828884-b4ae95fbb879bed0ee38cd6552dcaadc.npy +04460130-37d62783bdefc54a1ffedce3943a1ba2.npy +03593526-f232cafa6b5d570ac5beea20858a99d5.npy +03642806-e9bb4175bc73a2eeb60886b233d6cbd8.npy +02958343-8cc9aaf75a2fb056dcff2899f073ea9d.npy +02691156-5b048655453b37467584cbfee85fb982.npy +02871439-4a380e2801664a015c3654528317cdb2.npy +03948459-7418810de4b13e8430b6ca3ac82edfa3.npy +04530566-a3f6f17c5febd688cb5e9b11b96f53b9.npy +04401088-3aa2fd5054465056e25336bb76be9963.npy +04379243-ec8efc59f0e8c0fa97b2fb14fbcb9c20.npy +02871439-1ab8202a944a6ff1de650492e45fb14f.npy +03636649-bb53a3c6ac9cbd386fa63795f94c4d8c.npy +02933112-5f55127e04171d6435836c728d324152.npy +02691156-3764de22af04fd32a993db466b6d73d3.npy +02691156-3af52163a2d0551d91637951367b1518.npy +02828884-38d0cc28d4ff1ad0b604d999bdb46442.npy +02691156-17bc7631cbdaaa0c932e2c9d273ab571.npy +02933112-875437f9f2bfdc3feadc9f074ecd1df1.npy +03691459-39554167163a7cc3f881bbcfcc456ec.npy +03797390-3143a4accdc23349cac584186c95ce9b.npy +02828884-578b801e35fd2defd4d8765e3910f617.npy +04379243-114a39da3b4bf118d42ec7e303174a87.npy +04401088-308cce8808b076bff49084215d845d01.npy +02958343-2dd174957a2053345fcb05674109534a.npy +04530566-74470719a1b44c9a45aff212946058fc.npy +04379243-fbcdfe3edfc9a679ad5067eac75a07f7.npy +04379243-3c6ced93a3103cf34b28edba8d17a601.npy +03467517-4976872c92b0c10ea070d261aeb7d2bc.npy +04379243-27805445a3c587c1db039d8689a74349.npy +03211117-3817ccc2d7a247cbd821b4c6abf4a2ac.npy +03467517-807435998a164b5ad57700c05b1862d8.npy +02808440-78c992bac95191673321831d2245cf06.npy +04379243-d9b82ebcd756397c371fff21f277e702.npy +03691459-e1bcea986fcbb7fab359198a2f47cf13.npy +04530566-ceaacadde93c2be6ee138bcc5a7d5853.npy +03001627-8fd87d4aac0153a26b28a4cbbb97a012.npy +04530566-cdb70178e2562e7a80ac63732535bbcc.npy +04090263-b012c9d123aa8064ace721126020c1a3.npy +04379243-33e4866b6db3f49e6fe3612af521500.npy +02691156-a657a0dec941d40772fe60ad306aa5.npy +04530566-cd65ea1bb0e091d5a1ea2dd0a4cf317e.npy +04379243-74444148ff8d13d0febad4f49b26ec52.npy +02828884-1c310698c57a3d378fd6b27be619556b.npy +02747177-86194a4645da1f19e14ca01ae177e9d.npy +04379243-2afbff3cd25cdd426392a5b643ed5e3.npy +04256520-d8a8701f3fb8855d4d0a79ea230a0577.npy +02933112-528ab24c6afd91c38aaae3d020f5ddf8.npy +04379243-c36d04d3a10fba869e87d2bdcb41f548.npy +03691459-6577288320db747cea37255d6341d07d.npy +02691156-f350f4836dcd13541b1cc145b0144991.npy +03001627-5ce845f80b1d407282dde982679cd879.npy +03001627-9012e4fff3cb71b57773c2e28f019f8a.npy +04401088-c43c9123ed893de5a0eb5a85db887292.npy +02958343-e7b9a6485b15921d51a95aaa6caba1d3.npy +03636649-8232dc35ac9ccfb016a2b5862518c93.npy +02808440-594c15031388ed1588cafac7d7e6b54.npy +03001627-97c343e28e2b9ea4bf4414e655b3a4c.npy +02828884-7ba9140b8e416d79601104cd2d998272.npy +02691156-3ae96a1e1bb488942296d88107d065f6.npy +02808440-88d183f319cddb7344221bef0fa3c36b.npy +04379243-e94dcd39a8e438851b17743c18fb63dc.npy +03001627-4841eb9b6b15d037dfd20491defa4a70.npy +02828884-14abcb14222adcd499b68520b875243.npy +02958343-dca1e82e7d39edcbc2c2c81e2232aa95.npy +04379243-db0c430a51ac45c19d2be74cfb51ade1.npy +03001627-426f02971983126daae8d1cc50964a7d.npy +03001627-47aca56ff3a7b8a71a782a4379556c7.npy +02933112-b7a9d8b469cb06037824b732b006daaa.npy +02773838-1342fc4f613687f92569b963af585e33.npy +03593526-26b9ede17422ff5b84cd259bd328e92a.npy +03001627-8e77d0965bd1ebc598e0d1738edd4f19.npy +03211117-dc4b21d338c4b4d1bef7854be4daf5ad.npy +02691156-25f08a106a0eb00eca8607f540cc62ba.npy +02691156-6bfee98d2078c3c4ca8607f540cc62ba.npy +02958343-f87f654f056b3679f4103381793c29f7.npy +02924116-583a67819f58209b2f3f67dd919744dd.npy +03593526-7a9c65728f8baa6da706b53616da968b.npy +04379243-7c24e4f8778e224799a5e8f6c5baa224.npy +02992529-7dc461c63f3aa4a3a2c7c5886f4bbc93.npy +02942699-51176ec8f251800165a1ced01089a2d6.npy +04379243-2e92e1ec1038ab0914513156cf2b8d0d.npy +02691156-7b9bb6e42aa2191b58a458f7911d7423.npy +04379243-2ab79a94145330a95ca21a5844017a0f.npy +03001627-11355c7f7ffa3c09737d107bffc3cd98.npy +03636649-64d0f2752aea0f40a99e0f0bf1de3bbf.npy +04256520-f1ce06c5259f771dc24182d0db4c6889.npy +04090263-76e10c1cb25e814fe7d6f3ee02d4059f.npy +03691459-831f70cfa81a12ba7b440c5df8efc309.npy +02828884-19f24754ceb9bc948598ced6ad25b3e2.npy +02691156-20865546e07ab8067c597cd12d99981b.npy +02958343-44c278891ddcab2dc0e3666c7d0ec7d0.npy +04379243-571c9ffa865fa70d2dff41777eb31a7.npy +04379243-366645cdaab60c793e5eb583c9d92b57.npy +03001627-c56dcaf6b862a6329158e0f216b27548.npy +04256520-74369d5fdfa2356a066c1f884f0378.npy +03001627-fc818d6fe03f098fd6f4cef762589739.npy +02691156-7b4b249f1d3400e488be2a30dd556a09.npy +02958343-1ae9732840a315afab2c2809513f396e.npy +02818832-8df7e58200ac5e6ab91b871e750ca615.npy +04379243-13782b95eeefcedacf004563556ddb36.npy +03046257-6efd372c631a9ea13b48a711df82173e.npy +03467517-8c3d3e69d03d3443e84e459fb01822f.npy +04379243-43daa5027409cbbd4b3c42e318f3affc.npy +02808440-89343976cb18545d4bce3147c41ec725.npy +02691156-a6cbada42d1a30d0f5c7319b71bdce6e.npy +03691459-62e30deaa5aeac183ef7ad0f5cedb0e3.npy +02691156-3aba99921e9e1c93ef40e4c1c2686cd3.npy +04379243-6a5c816eca38f130c6536c7253813c8f.npy +04256520-438c3671222b3e6c800d7b7d07715065.npy +03797390-5310945bb21d74a41fabf3cbd0fc77bc.npy +02691156-2d4c147d4d1cc40c582bf3113c3974ef.npy +02747177-f97df3db44133969fe42c1e9e335e7fc.npy +03948459-a4c228e14915863eb8efd193bc3eb26e.npy +03001627-8ad35dbc44f40be1492d9da2668ec34c.npy +02992529-893ed9fc527a8329d3fdfcd95fe3518a.npy +04530566-32dc0308ca44f256ae9e3df35a893c9.npy +04379243-2fa04d6a788be63f32db3066d0100ee4.npy +03991062-17a9ed841655bff02f4c86eeb341b7fa.npy +03001627-ce10e4e0d04c33e7322ed2ef5fc90e25.npy +04256520-8043ff469c9bed4d48c575435d16be7c.npy +02818832-75e308dc83c1c1f0bf20c89392e58bb0.npy +02992529-5fe99904fa4b22d4ff1911c2640f2e42.npy +04379243-e367cc737c304024297936c81e7f6629.npy +03467517-f37376f5089ad242561dce3fe08634b7.npy +02958343-fc620f7906f444f1ec403de85b47bd60.npy +02808440-32c2dbf3246c8b2366bf2fda6157c15b.npy +03001627-609746ebe63abc2c2f38c0d2792fb5e.npy +02924116-69038ea9a392fbb924254bfe0c86460.npy +04256520-d580b1bcffceaff39f2fd5a6f642de3d.npy +04379243-86b942f68417df36cbde89e0c48a01bf.npy +02828884-ce663a6430eb9523cb2a965e75be701c.npy +04256520-7cfccaf7557934911ee8243f54292d6.npy +02933112-1258a7bae01e349fa320e34dad7c78bd.npy +04090263-230851bc45f916297c9aa6759ab09b15.npy +02958343-dd0817b9757b74c75d3a87a5c4dd9ce4.npy +03467517-3b7928afa5667e9112a47018402419a2.npy +04379243-34ea33172f39665022d09160e03f114b.npy +03790512-8f032c42d53b5c79aca88bdc785b0d2f.npy +04256520-4756416d882c569b7acade7eda5e06dd.npy +03636649-871e950f1d453b32597976c675750537.npy +03636649-a29aa1d787d4d3252cd2160e449d45ae.npy +02691156-5bc41589eba11a4e15477d594f1fbd99.npy +02958343-9b0d7aac4500546911718baa6d4afc0b.npy +04256520-b0fdc43b0b4e990719abd93be2967664.npy +04379243-cae4f0f8b87db72dbbdc99ec57ef9c40.npy +02691156-92497dcdab4d0a8de1e82eac4119b0b3.npy +03001627-b510aa817f9aa6795906036a9b83f8d5.npy +04379243-185e4e4fe22d65842095a33119f8ea7.npy +03001627-5c427d9fe3c76b356c07fcbf2661d108.npy +04330267-1d089370d1329dbaa2d703b56896de1b.npy +04530566-9625f56fdbada3377220891f188bc420.npy +04379243-c6575b4c39a341c698d5fc0473d00a1c.npy +02808440-f6f4dc302b85c7f96fe347138aa3101c.npy +02828884-f6219339c25b42fe81faebbdea6bd9be.npy +02691156-d43b80dd95a2233a5ae839ffe09b9d31.npy +02992529-a1e51e185a9f24354b8478bdb97333d3.npy +04530566-724ca82e43f5e4816811fda0ba2e1809.npy +02828884-43d40b726c369eaaed98cca8f0ccd5f7.npy +03001627-480d483b508469d1a42913f1450ecdb8.npy +03710193-4816fcb4595a45e2781e7efd407c71fc.npy +03593526-330880146fd858e2cb6782d0f0acad78.npy +03691459-153c468a60e1116b2eafea928e361a58.npy +03467517-d3972d599036251369da8e7f9a803d12.npy +02747177-5a0590dae471241ad5067eac75a07f7.npy +04379243-c57c4616b4a9c14ca93412f1b60e6fba.npy +04379243-166ca6382eb80ee830bbd4cddd04c77b.npy +04379243-a0e7dc01e9bb5de1858699aaad4acee4.npy +03636649-45f11cb4099c9c87bbc7a6acbd8f058b.npy +02808440-77ec56a21b4ae4b8b84959963148f2a2.npy +04530566-58a768c309c01b2cd6dc46f6baef3245.npy +04379243-daf4f3295db84cd39420b255bb5956f0.npy +03636649-4febafd730ab294afcb8d8c6d4df8143.npy +04256520-afcb115706de531f909c248d0d9da9f5.npy +04379243-7ccb70ddb69bf162298a458038c49d73.npy +03467517-16916a50a064304bf6ed0b697979412e.npy +04379243-317a934556406ef84b3c42e318f3affc.npy +02992529-62314ec7373898059f7477e2986c440f.npy +02933112-1af4a1dfa4f94cd44da5feafe6f1c8fc.npy +04379243-b320afa9ad7573401bb64c55dcda87d4.npy +02747177-50978d3850fcf4e371a126804ae24042.npy +02747177-7c90fba6cd7f73871c1ef519b9196b63.npy +03211117-8826871281dc12951072594c80fb7e4e.npy +04256520-30cc7577792d4dfa4b3c42e318f3affc.npy +03691459-105d0802d1ee0430bba5c9b6de65a038.npy +03001627-4603969ca86e226affb3dd5191e9a4.npy +02958343-6615a61a799c144e84306f3bf0a1f2d7.npy +04379243-e35d752ecf4e205ab40f0ac0fb9a650d.npy +04256520-117f6ac4bcd75d8b4ad65adb06bbae49.npy +02691156-4e67529b0ca7bd4fb3f2b01de37c0b29.npy +04379243-7e154e1cd9f231dab8afe053c66e5d4a.npy +02958343-83c21f0f383524e9bdd7ac383509f04c.npy +03001627-df51cb83f0e55b81d85934de5898f0b.npy +04401088-800ef55c1401c26ef5d4e1af18c85258.npy +03211117-94001a0000497e8ae4b68d3b17c43658.npy +04379243-ec81c49ee12e8a70fd06de9ba37d44bd.npy +04256520-ff1bf2df4bc49e1f79add0ba9a2ff19e.npy +03636649-baddae470b28db0482e23b5f9fd46e1e.npy +04401088-e30f2d19e9f44f6ab0cb879d4613195c.npy +04468005-559a4e0316bb0fea6aab81f7f1d40525.npy +04530566-2114fe40b577ced9c7640fef6931a907.npy +03001627-52cfbd8c8650402ba72559fc4f86f700.npy +03948459-5f46578efd2c65e5d4ac2f5fcaa742ac.npy +03001627-6a3d2feff3783804387379bbd607d69e.npy +04554684-14bb2e591332db56b0be6ed024602be5.npy +03636649-53d1324d1e85fd37c35131da26f8061a.npy +02691156-9407c551466b346450e5128bacca96b5.npy +04530566-98a61aa6d78f6f49de91bdb310db8e7e.npy +04225987-a19d80304e26099e7394c987e5e211f0.npy +04256520-8a01d1d686c4b0d3593ebeeedbff73b.npy +02691156-6110cd7e771f0ab3a847e990b54bf80c.npy +04379243-c0ac5dea15f961c9e76bc197b3a3ffc0.npy +04401088-b7741503cf1fe40378bfad8b5ed8c4ef.npy +03325088-9c4876c03981833fb362845c6edb57fc.npy +02828884-3f2d311ddc3b6c19d4d8765e3910f617.npy +02691156-3b529633bdd49dc1e5dbe91fa3801c4c.npy +04256520-955d633562dff06f843e991acd39f432.npy +02924116-e92f10218f66fcd64931a7929d89a2d3.npy +02773838-e73d23dbd069877f4da5feafe6f1c8fc.npy +03691459-27dfcf48220c9ce1c3554591513b53b7.npy +03691459-14a21eb927d89df31ef58b31c4ba0d15.npy +02691156-6adda4af6b2b7bf9f315217de00e37bb.npy +02933112-4e62d6e735b8bf2b90071898148dca0e.npy +03001627-9303d374253d8e7f377b9297f3055210.npy +02871439-9b958222d9673b664b3b9b23ddfcbc.npy +02958343-17457b1f42019702618e9d35559b7aa.npy +04468005-1738b29e7344f8447c44435d252fe26d.npy +04379243-11c192ef34f5dea0a1bc88a716ad63b2.npy +02828884-797d99a5ca291a2085fcf80cfce883fd.npy +03991062-40115670f786ed1a6d93e521f7fd48fb.npy +03001627-47f0e1452ea20e4856c07129c79effea.npy +04090263-bf22abe4fbab4acd91d13947d0d17396.npy +04256520-29bfdc7d14677c6b3d6d3c2fb78160fd.npy +03710193-24807a8b5a4d1f942e9bce9ba08f12e1.npy +03325088-75d1c36ff0af66eb76c18e71fd49c4dc.npy +03642806-76d74a604c1ddacd6093b210438ee0f7.npy +02992529-b69603be92146a161ad8041551e9d3c2.npy +03636649-cef0caa638ab9be03b1e8527d043af60.npy +04379243-270430ab9efb9d85c0f947750540fb22.npy +03761084-c5d13a109a61060c178e7d331e641179.npy +04379243-3f058be47b5d4cf353c1d159a8a8422.npy +04379243-c0b4b99b37cfed365143f38859a6efa4.npy +03001627-dcc892f77239ace06b2befe83a0efe39.npy +03001627-1b8c83552010440d490ad276cd2af3a4.npy +02958343-1eb3cb637ccffd14597505fd7d99b613.npy +04379243-2c06e66c7a66878c3bd24f986301745.npy +02958343-3a3d23c4d325252aaaafd94b9f216ef6.npy +02992529-5bb9020da1d3bdc260a9d7568d474ade.npy +02828884-3880be8744dc0ebaadab4c26397edfab.npy +04330267-f195aba51aa86b934e88996f84b82fe1.npy +04099429-24d392e5178630079f3b7552aff14b6f.npy +04379243-de9b2870157cdba6f83df7938e45b43c.npy +02691156-54f0d46b866c1f714d4cb1c2a5e48b7a.npy +04379243-bc351c5cb264d29e278d386bfa54545.npy +03325088-384ac965e52b16c5b0957d845ac33749.npy +04401088-4a7c0d263fa0cc119553267f4c8c48a8.npy +04379243-fe2f2b120d84ed909b896cf832106977.npy +04090263-eeb8c212c7fbf6871fe7d5784ec6d0eb.npy +04256520-e51d445efd61b1e4e1296b473bec7902.npy +03325088-de4c1e3e21d5202da7c60f6678573a4.npy +04379243-2b00c0cd6353e2fc52ed0af58ae88731.npy +03211117-79f3ccc203ed18cc2b09e302847180f5.npy +04090263-76dd6c8a2cf09887bbb7f70943d3cb52.npy +02691156-9cda097e69ef82beace5721ccacba16.npy +03001627-d5b909ad5d7c793aa16baf954c1d99bc.npy +04090263-ac13748ced7f9fca86b2bcefc261a7ea.npy +03467517-5dd9e0c35898183bfbeef84a1ff2df7f.npy +03261776-6ab05701a8124ac25ff75fdb62ec3433.npy +02958343-2401f097228fdc1348b30181b0729b3.npy +03001627-837ba605a4ab4a4f19fb4103277a6b93.npy +04379243-3ada04a73dd3fe98c520ac3fa0a4f674.npy +03991062-aa7d667a7b5c67642b151d8b52c53b90.npy +02691156-2066f1830765183544bb6b89d63deb6f.npy +04256520-d9d465cf1be1142a86114f7b6efc777a.npy +03001627-58ebbe670d03fb65cf19858fd1963d10.npy +03991062-2558fb8bedc4edcb1b78de62f6c48608.npy +03001627-8a845bb67ee8486d6199d6fe090be061.npy +04379243-517a4c16b7c5960bac2b62da1791c2b6.npy +03337140-a44d92a6431afe516d907bf61e189d9d.npy +04330267-2cb7486cd0d713894c324889334fe6fb.npy +02691156-5b3e534b2d022a9528be5258a76a8dcf.npy +03211117-cbf33a6fa0f21270fc88f15aa2f9c9d3.npy +04256520-1230d31e3a6cbf309cd431573238602d.npy +03001627-a1a34c1d45d47c371519c64630268dcd.npy +03001627-458356b9c5a8d7bd7cc86734cb2f5062.npy +04256520-719eb32ac85c77ac4e7bb85618505650.npy +02691156-94c4ade39534d1902c13e5b9ca0fc656.npy +03636649-8be191f7e61673b13e3ed2a572e608c1.npy +03046257-751c6f35fc0194785445e46058840642.npy +03001627-b1b11a70a19492fa5242f8291aafac22.npy +02958343-7492ced6cb6289c556de8db8652eec4e.npy +04256520-e78b5c9191f3007cd36a803949e62cea.npy +03593526-7c8fcf46c9d543be3087f84b199fd297.npy +04379243-f27a46a8dce3b811707cdefe012d0353.npy +02691156-ec8ba88cdead53f336dafa9b6763ef3f.npy +02876657-bd5f6815e92e5fd72389a54fb53b0765.npy +04379243-20cba21d7122fec4784a45ea6efa1d77.npy +02933112-8317fd220232e3be11fc2b865c2a185b.npy +04379243-f5529ea819c6e97decdeb21614063c36.npy +03001627-c9b0828029f0405c473f10e6caaeca56.npy +04256520-3550a44cffb1fe001acfe75c509b3399.npy +04330267-dbba6cbf758062ba89f60a4ba2e4e417.npy +04379243-7093c8218c88118b3c5f24f851caaab7.npy +03467517-bb3417d78a84a9ac579eb377e469ec49.npy +04379243-4786e3a9fc33024dfeec1f13d2353f3.npy +03001627-da443e90e376b024b0f7e9a1c9f6c90f.npy +03691459-ff9590ccc2613d6c332d76467c18dfde.npy +02691156-dc6a2bdc4c3e630a43bc71474ad05fbf.npy +04090263-858975ab8258845f230a4d129580843a.npy +03001627-fb00ea443c74c00617c72672c86a49.npy +02933112-21185c06b8eafd1229426a0f57e4d15e.npy +03624134-3dbda789bc59a5f99246ea0301684d80.npy +03642806-490245e63baf78fb1bf5877a865437f7.npy +02691156-4c880eae29fd97c1f9575f483c69ee5.npy +04379243-a6f19d6f3a6b3cce35c6c07cec6934c5.npy +02958343-43e48813760ad55875c67b3b1e763fcf.npy +04401088-4e8cb66f915fb5ac5fdc2445fe061736.npy +02808440-e4f9cc6d4b3e4bcaa26ee71c5a5a672.npy +04379243-5441f511736c03f9738e43095496b061.npy +03001627-6c36a5b107e83d331191025061735ea3.npy +02828884-9c7527d5d1fe9047f155d75bbf62b80.npy +03691459-c2007f762f6c3d9f51dabd6f23097818.npy +03001627-7db1b46aa2a337adf51f77a6d7299806.npy +02691156-61330ac001ced49f64801ad2940cdd5.npy +04379243-439ea10da7a148bb2f210d96281fe860.npy +02880940-b69e25e7ab9b829215b14098c484b7c1.npy +03001627-6c72077d968519bc13e020d985215e3.npy +03001627-47a45ce9fb219083411e8b42940aba04.npy +03593526-7de119e0eb48a11e3c8d0fdfb1cc2535.npy +04090263-45030c1a84e0c23d7ec95138ef83ef2f.npy +02992529-43b59b01866f23e6f8d380ef6d10e2a7.npy +02958343-ead6f85d2eaafab32aa8b7caea8a1807.npy +02747177-c77e8499be0ce1e04f3443b22038d340.npy +04379243-2a5f29019fea4513dc0970d34db41136.npy +03001627-32a9329c11b5c35d4b3c42e318f3affc.npy +02691156-9de5723b085c9dd8f4fb6842b3610149.npy +03636649-fc03629860dfd3608ecdcdc5181b3655.npy +04530566-377497ba926616fbfd7a80a80a3ebd45.npy +02691156-c1b5fd196374203d772a4b403daac29b.npy +04379243-866a07295aa3a8ea5804b7e86be64166.npy +03046257-cf0208d1c19e8313cc63543a91bdd558.npy +02924116-1b572b3e4503dcc2a71edfed1705a549.npy +02691156-c1262e16d330f7a0231e16e03ac422a0.npy +02871439-333a32cad481ef84ce438ccfc4d79b5.npy +03001627-ea91d70feb603421f74aae127b28c047.npy +02933112-636c4d449f17b6a8b47cc2471d9dd7e6.npy +03001627-a1e414f0380b7b9e1fc1bfd241d8d6a.npy +02691156-19f211f1dec98bbb82ea21d84574e1ef.npy +04330267-601c1c3d98596cc34a60c1a189046dd1.npy +02958343-691bf14434c590f212a6200f1680863.npy +03001627-69261d58214053d1e6c5cd45aa112726.npy +04090263-cf51da336a5414031b8fee1b14934c0e.npy +03325088-c9716fcd783c1cc178d17489f52f679.npy +03211117-529cf5ad63bd49c8ccbd9a558eb91a2f.npy +04379243-faf951210266013cbe9d845bb7506ca4.npy +02691156-2e235eafe787ad029a6e43b878d5b335.npy +03467517-abf0a261cd0d01512c6fb4acc0f83de6.npy +02958343-232a1bf61d6d80ffab0e638d7c0cfd7b.npy +02828884-3c7a0029ec98c965601104cd2d998272.npy +04379243-60014b37baab2a2fdcc3461f14d611f.npy +03001627-40bfad5f86a730b29f2349486c570dd4.npy +03001627-9b4d530487df4aa94b3c42e318f3affc.npy +04090263-1af21b8dcda98fa6f3817c125fa377ee.npy +03001627-ffd9387a533fe59e251990397636975f.npy +04090263-14a07147c6b74e9d914c738e92faad58.npy +02691156-bc8c26902e912b851a53b454324fd345.npy +04530566-b9bf493040c8b434f3e39f2e17005efc.npy +02958343-b4ea44416a06834af200a72c9245aee7.npy +04379243-1b7dd5d16aa6fdc1f716cef24b13c00.npy +02747177-819795e285ea031625ebd1cd0b422e32.npy +02933112-1919dec93dff59e0ed3ffec8035a48e8.npy +02828884-916a6ff06a128851ed98cca8f0ccd5f7.npy +03211117-559bdf7d41b538f6290d1211e69c442c.npy +02933112-60d8c707c5f8278e3c8d0fdfb1cc2535.npy +02924116-eebb08eb1a4918b75d71b28e8a5230b9.npy +03991062-7335b7a1eb1bb091bf949868a8099949.npy +02958343-e4d396067b97f3676dd84bc138e22252.npy +03001627-8f4d7de6fef55f99232ca089ddf0305.npy +04256520-7e832bc481a3335614038d588fd1342f.npy +03001627-3427a6029f253860450621b513a975bb.npy +03636649-50dec764276863a77933e36129e75649.npy +04379243-419412b927d11c7d8312881285c04cb3.npy +04379243-e0be4621b0ea9893593ebeeedbff73b.npy +04379243-f2b641d16cd8a3ed33473d0d0e8c464e.npy +02933112-1e694a1848b810ebc59350d819542ec7.npy +03001627-45214e3010f8c3ddafa9c337f30be0ab.npy +02924116-75720a82a5ee59c7f72d0267172e294a.npy +04401088-e8db0c85b07ac581d409d3400adf2d96.npy +03046257-fcdc11d9d040e18ae65235d5580cc3e0.npy +04379243-96de9fda13fa986d9cd431573238602d.npy +04379243-c0a143c5fd0048bbcd01aef15a146d7a.npy +02958343-2c3a3033d248d05851a95aaa6caba1d3.npy +02958343-db392da8d05ec4d4f6d01abc93dc7d8d.npy +03046257-6970ca7ec4463ff4224ee0743294f79.npy +04379243-50d8dde1973aa467427adc6587850b2e.npy +02958343-7e3349b2d3e833b0364d334d86d85d.npy +04530566-be8efba4b5c1cbfb94daa4565dd30535.npy +04530566-66fc4d3e245a643c4f7b88e5a2748214.npy +03467517-216b9ada62f817d3e407add7ece1b405.npy +04090263-b7ebbb8db6add885e5fd7320f47a8553.npy +02691156-25805c9f5b2812b6b7bd17e458d0dcb.npy +03691459-2686bb573a9bae79d34aabb2f31dae9e.npy +03467517-9262812345d784f846ce38f148ceb1a.npy +04379243-5334d237bafced4c3719086e0b4ab8be.npy +04379243-31a85a1a9bb22c3bf1e23636310b7e7a.npy +03211117-2967a5504d5aef38bb3914fb474ebce4.npy +04256520-b16913335a26e380d1a4117555fc7e56.npy +03467517-2358df8a325993942b996d5d44e09408.npy +03001627-b92bfb13727f6659e45ef4135c266a12.npy +04090263-9e6d1d06ae82ac106f21883e4b04581e.npy +03691459-d087ad474122e24d887e8faf8f33b0c5.npy +04530566-3b60a8a4d71e3f192063cebb14246130.npy +02691156-985e020b26adf663acd7e882b88d2b.npy +04401088-c33bc3be82441ea66934b554e5b8d4a4.npy +03001627-b0b75045d06201f9329df33f4ef71f97.npy +02933112-962d112db5d7c687e82effbd6750a761.npy +02828884-9b37a6d7c9f1800952dac0add839bf80.npy +03797390-6c04c2eac973936523c841f9d5051936.npy +03001627-c1841ecc1302f45be798c4323a137f09.npy +02747177-4d6b6d392ec6b5b4c69692992c7aeb.npy +03624134-9571186710287c09fdc15a59a3f1c1.npy +04256520-d7aa6e5b0c686fdee039576a17a0737d.npy +02876657-fda8d8820e4d166bd7134844380eaeb0.npy +03691459-ef71576ad5262c4ef398d0c5832df00e.npy +03001627-3d800711f41284b519fb4103277a6b93.npy +02691156-72aedca98ea4429c8ed4db287040dac1.npy +04256520-8fb75426dae65b66a12caf23554642ba.npy +03761084-da44863f40e720ea8a94168388287ad5.npy +04379243-c7feff682976809482db9fca4b68095.npy +04379243-e6da3e780a427429791f2019e8710746.npy +02691156-3255eb4c8ad868b3b378822897b79a81.npy +03593526-fc17a3cffc86bdcae37f5a622d383617.npy +04090263-e5de6a3be440fd1866a9b092716ff368.npy +03593526-6519a8929afa98739de171e0db680498.npy +03046257-b263bde194a2a0be8cc14b65ef8ab235.npy +02828884-ced678ceab87f6b6f4fb4dee5181bee.npy +04379243-327fcae0643a70d916768ffb6be40591.npy +03636649-6de220e49cf87c6bb15194162f658e87.npy +03325088-9d5eb12ed318891d2ccf9daeb92717bc.npy +03001627-b6305089d351329681dff5c2e57ad46e.npy +03928116-ffa3b87986a640b11c30b93bc2bc2c6e.npy +02958343-dd06b4149a6f876341ca08f10af9385b.npy +04004475-128c57ad8f366a09f16da3ba7941918d.npy +03593526-48c94c6283fa5566a4136492f17b9a59.npy +03211117-4e49873292196f02574b5684eaec43e9.npy +03691459-ea4215e0c4455737dd3b7710c385b572.npy +02691156-c022461863cacb39a2872fda285c0d5f.npy +03991062-b82574f7d98d653444c183864792bc2b.npy +02958343-618e8b78bfa803dab1bb46d2556ba67d.npy +03636649-55de711b4c86b86188e7662971dc736f.npy +04379243-2d38fa0a1b4f94981faebbdea6bd9be.npy +03513137-2aaea503ebc42ddfdfc54a7d3e3d4e77.npy +04090263-1eb186e0fc2dd979901b177556cd6c33.npy +04379243-7d5e1184ee0db5cebda5f96847fc5070.npy +03001627-5627a479e2e7373b11800282ad2afb09.npy +04090263-e3a673dd3db3fd2c282dd3b430ec2654.npy +02924116-4427bfc7a4223b8552470de2774d6099.npy +04379243-3d83fa746851500cba85f67361bdb32.npy +02828884-a2a83603f38cffbbd2b12aa6a0f050b3.npy +02933112-ad86354fb5faf1c98a4820926b2a786.npy +04379243-1bba52fa91ad1f9d7ff6ace05b36a5.npy +03991062-da8a38e1d0b6f4aedd3adf3090c701f7.npy +03207941-7d19e1db73ebfee26f893b5bc716a3fa.npy +03691459-913eb13149ceb59a75a3010d3ada28ba.npy +03211117-48b8290cb0dc0a6cc785f06f424b9d06.npy +03337140-4d993b6fe254ce2d4c3aee8e9d3a6ffa.npy +03001627-b63fb0d22a44ff698cbb8bac2032149c.npy +03691459-95db5c34357e2a81bbb94390080b5b78.npy +02828884-9b5dfec7d45eeca94c8c340ea700916e.npy +02958343-8e8da02ac0168a47ec5e3fe5c33367cf.npy +02933112-c184edddd3530a8161e1dc6d433ab6c3.npy +04379243-7269b683b73eb9a1aee34134dce9c534.npy +04379243-159964114c1991b37618b16b281bdf56.npy +02871439-795f3f8a01db10a6b6aae9c441c6e291.npy +04530566-8b92073eb06f0365e18960ef54b079a3.npy +03691459-f5c62c89e8fbb245ce6c2bd14b4c7ba4.npy +03046257-d6659d1e40745561b0a18b9f4533c663.npy +03991062-98a107d314d1b149148a76a78b10eb5d.npy +04379243-7dc6c6f96b77b7d3febad4f49b26ec52.npy +04401088-74aab120cfb4d88257de0221db0b9d32.npy +02880940-429a622eac559887bbe43d356df0e955.npy +02691156-ede14aa589c68280216b327569dd806e.npy +02958343-9a0365ab56ae57ffdf6ad3edb04a4bc5.npy +03001627-b5254b56addb692eb516c05d046e8e45.npy +03001627-bcea72fa334f593bb41b7625e8c42dfa.npy +03593526-8a970ddede52c604eec3bf885b5e46e.npy +04256520-7bfad524f6a550f6a6fee8e2140acec9.npy +04530566-60a1ffde62956a96e4723800c586d63.npy +03593526-a886fcd1a2b625208d1dabf86742ec3c.npy +02946921-38dd2a8d2c984e2b6c1cd53dbc9f7b8e.npy +02924116-1e161833a2e30e114b53951575fe6979.npy +02691156-d75a4d4d25863f5062747c704d78d4f8.npy +03624134-261ce6a51cdfa35e1021cd55d164c0ed.npy +02958343-3dddc113e114b64a63b716db3275cef8.npy +04256520-db851fe630734a8aee7d178666aae23d.npy +04379243-335858ca88e800c34897c77cbc788880.npy +04379243-4fe7555a7457c763db352b8394e172c8.npy +03513137-aba5ab07cb21bf4454631ce860fd196c.npy +02808440-805bb0974d261c98e98372688b8dcb7e.npy +02933112-3763bd1d86776ac397022448220c7d6a.npy +03691459-8171c9bdb75a10d9abdb18c1e87978be.npy +03797390-8b780e521c906eaf95a4f7ae0be930ac.npy +03325088-476aa340d2ac9973c36fb70296e45483.npy +04379243-f90bf59515aa8368e42c56c78fb88524.npy +03642806-9cd223dd78199526628b49aa3b6c49c1.npy +04379243-50b8f401a5e2f2f431358207d42bcb21.npy +04090263-b76c7921d0fba930dcfd889babf6a0d4.npy +03001627-3a141cf2f22fed0ffebad4f49b26ec52.npy +03001627-a94eb852d2137621b38821f893bc10f9.npy +03211117-e817263a3acf985ff6c7cc6dd504006d.npy +04379243-4f5719eaa2e58c9cedb0cb3987e137d0.npy +02808440-7b0f2735068568ef3af30a3946d92feb.npy +03797390-5c48d471200d2bf16e8a121e6886e18d.npy +04256520-2a07656f030d682536c2acd70c777ff0.npy +04530566-425ff664205d2a7f5c0be177939e290.npy +03001627-c3fabb74405368a8c5f0b5eeb41fa897.npy +04460130-d24729b45b9192b8f1390d726a8b3e99.npy +03001627-6a0bd5d9ec4567d9d42216b5daf41a39.npy +03761084-33aeb6c217d9cf7e178e7d331e641179.npy +03001627-566df2b6ad0abb3198d5fc0473d00a1c.npy +02828884-1acf34aa0cb8f06a19fb4103277a6b93.npy +02933112-484aac3c3f3ee4aadfcedefd655bc18c.npy +04225987-1510427efa80c92b11c7049de48f3618.npy +03636649-8522fb13bfa443d33cabd62faf4bd0f0.npy +03710193-edc6601caff93c375cdc413cece6d555.npy +04074963-f677657b2cd55f930d48ff455dd1223.npy +02958343-cf9e82b3235f62c949956811ccd3041.npy +04090263-5a2ce6338b4e399f0fea2ee98610322.npy +02691156-3f6c0034bb278de4f446f92b52bbd82a.npy +02828884-8ff9b4b57eb5a60daed1fc72009b42ac.npy +03624134-bbfd2df3edce576e1e652fa812161367.npy +02958343-425db95a3377f4d6e62a01eefce42a80.npy +03636649-3c39bff6acbb6060899bad344dc01f2f.npy +04379243-e7f1a77130bceb8d8ec45320afaa5d0a.npy +02691156-dba3ab64bab4ed3ed13ef00338ba8c52.npy +04379243-2519505d0cee2edff08984f51debc075.npy +04090263-6c7dec6bbd8ede62f0e1c0df18936d05.npy +03691459-8453a71333241062f1b584cbe791b374.npy +04256520-427c7655012b6cc5593ebeeedbff73b.npy +03636649-7c0e5f39eeaa5d6cef9b6f306f98b0e9.npy +03046257-6c010bbc4ec34296291d2d0d560233f4.npy +04256520-39ba41744345959256a9d1ce1d40376c.npy +03001627-77f5b356fa515f1f396bfe08dd5ca134.npy +02933112-98a1211469f6c6a7c7ac935603e09651.npy +04090263-41da6bb82abdc626a5aad165050e534c.npy +02691156-4ee48907120e261c3df16180af9974ee.npy +03001627-8a67fd47001e52414c350d7ea5fe2a3a.npy +04379243-e03cdcb83404b3c3951c1fffab4f5807.npy +03691459-61a4c1b213e7eb2b2633ff66beb9cf31.npy +03001627-c46eb7460be602b6bf80985a99195eb8.npy +02828884-e929c571972b954981faebbdea6bd9be.npy +03928116-c167f20548e40314468f5d32b3766d7a.npy +03001627-d0c287f11c6cc95012d6d1e9f6b5e761.npy +03636649-e9f5e9f6f8d54caae455de02837313a6.npy +03001627-3a74e3d5172ee94fdef1c01cbd4ae0c.npy +03001627-655102add1989c1064fad3c7b88e6060.npy +02992529-831d6d9118e1a2fb71f2e8f64dc1f509.npy +04379243-41d18d4668939ced3a8e4d3441f2dd18.npy +04530566-ec3e0694850f1a923b7cda02ebfc1f62.npy +04401088-7772938405ac56c1b6d41c42f7ade8c8.npy +03593526-9c06b546a29ccb2f2c27670a86683659.npy +03001627-58b7e2dd5eb73b70dc742bd7c6fd1b27.npy +03001627-ecbb4e4665c7fbb45613f5c2df1029a.npy +04460130-f01c3ee2b1210cafdb3180683be7ca4f.npy +04379243-5e52ffe27434ff446875e2781cdd26.npy +03001627-3d3b7f63f5525b1ae37f5a622d383617.npy +04379243-c8520226f277a6af77cb37b8e3bb5ba2.npy +03001627-a0421aff56cad16790a9ce3e4b15521e.npy +02691156-dc8d9003cde43b66c8727b27ee96a4b7.npy +04256520-ac36eabbb3b405d3473f10e6caaeca56.npy +03001627-24c0fc01144790be305e886266e302e1.npy +04090263-af0bf9c4b6397877cb88c9db6e396994.npy +04379243-15c833aeea88fb19f428c5b66db689e3.npy +02992529-f66d8ca1f6b259de2a9eb0f146e94477.npy +04379243-201e927f4979bed6febad4f49b26ec52.npy +04401088-1bb65c38e6b563d919bade123d9b1a21.npy +02876657-81bf26a14c2dda38c19359cf6b65431e.npy +02933112-d6242003931d0a27824662341ce2b233.npy +03467517-265009e163bf5c6f69da8e7f9a803d12.npy +04379243-cf3270a5af169626efa153ac02df4ca3.npy +02933112-23637357c4e5efb653c80c0a3ef7382.npy +03948459-be4eb62282269fa3d65e0fc33127a486.npy +04090263-13dd392ca784cab79adbbc95db428a81.npy +02933112-474fb0ff79e036b0820018801b237b3d.npy +02691156-96291ea39a5c6eda203936772104a82d.npy +04379243-613c706879ee39c9132c018af3949fe.npy +04379243-f1858f78989891172027cee422df2aa3.npy +03467517-bccc58865720ad5082b2bb742a29db8.npy +04379243-2cec40de07b468661aa47689117a61e1.npy +03467517-e0a4691bb3d3cb47e33462de7b4c569b.npy +02876657-3c6d6ff143483efaebb19cf38af396e6.npy +04379243-c9cda6b019153ded8cbb8bac2032149c.npy +03636649-8935987356200f8d84f9e9db2fdf33bb.npy +04379243-ce2d3e0b58bb1244700ade95b2f08044.npy +04379243-8aac86cf8c72a375dcc7ddfa72357b1.npy +02691156-bb26678e5faaed16300ca77569ad3884.npy +03001627-300d6a7505f24959492d9da2668ec34c.npy +04530566-9a8c57edf56dff168a76a2dc0f9ed02b.npy +03710193-63556b1cf7309010c10acf2ba78060f3.npy +03001627-be745a383ceccfe453fa79783efbc3bf.npy +02958343-61348ed95aac6b3799cbdd78ced2546.npy +04379243-75b308ba45762ad499e8bf807e902261.npy +03337140-1b400773151aa9d64c3aee8e9d3a6ffa.npy +03991062-6e8d1c49e9d239651e70ffb3c83b7281.npy +03691459-cb25ea4938c1d31a1a5a6c4a1d8120d4.npy +02992529-69e45e401c1d05b767d8789d3a6519d0.npy +03642806-fc9dc2b33ac96e41e2dc67b821479cc4.npy +03467517-b234a7ad4a2fd1f2352e5d4d2615db5b.npy +02691156-18f5265d553d72fb6b7bd17e458d0dcb.npy +02958343-368c8d09c88404999be54f79e28fa49d.npy +03001627-63e184952df0f3698f5bccb3529a48d.npy +04256520-2814c27c1ac5370a30eeafee78afcff2.npy +02691156-f9fc7fc23e62986fef6c510e24348d3b.npy +03691459-a0f84cab1fa73358078e785d09667d5.npy +02958343-9472d19187081c62fce798408476568b.npy +03211117-b7315a68691210ebb25884c97d065d99.npy +04379243-6bdc37f729eef70d18706cd9c51d6358.npy +03948459-f249fdbb14d6c86087302680c759eef4.npy +03467517-1a680e3308f2aac544b2fa2cac0778f5.npy +04379243-d1950f4d38df72f59d297e74104d3ac3.npy +03325088-19e85eac24c2bac9c36fb70296e45483.npy +03691459-43f49627bbea5c39a052db10ff2f17aa.npy +02933112-2018d0713d4c22df480fa521a9c7198a.npy +04256520-f42ca56e450c3258b4602b4f31d3d1c0.npy +04256520-28cc5741095e9754cc9651014a82e2b9.npy +04090263-8ba99099a99012c77ec95138ef83ef2f.npy +04379243-62d18b3f3c520ddb37251258858a7a58.npy +03001627-63d92bf1f175a75a25ffbad401072b4d.npy +04074963-cc846e66cbfe697bffb5024c146ec04e.npy +04530566-73343fd92c286e80c570a3d482a3f588.npy +03001627-f3f31db17715ee0c327289c00b6dc9ca.npy +04379243-38310f3d796ac0b56bdcd672c2b17215.npy +04256520-abd8b30650ebda9c14038d588fd1342f.npy +02828884-6b894c1c57ba921c98d10ca8df5ecbe7.npy +02691156-209e9845a482333c77c06b43df2749d.npy +03001627-f645f79d47e2df0f7dca29e186afcbcf.npy +03325088-415b9606f972c2a876c18e71fd49c4dc.npy +03467517-6837886c1c4553ad93f0194265a9746c.npy +04256520-eb568f8bbfee977c6b4fe272da0db543.npy +04379243-a0aeb5a735e15171f15e29f2d0bc457.npy +03991062-6ebaa1c6357a05b33cc55b40df64ab9f.npy +04379243-3a466eacf622b3a13a5badb049bb270.npy +04379243-343b2351e2605a075445e46058840642.npy +02958343-f21188e5f1a6468050bb0437668bebb7.npy +04256520-2fb350e338cc61521b17743c18fb63dc.npy +03325088-4fbb6add41adf7eb843f813f752a5e35.npy +03001627-fb71fc8021c89cf342d8a8c5af8997e8.npy +03211117-bb2639fdd7ee85202f58405e4baaa2ed.npy +03001627-f4c6c927df8edb62c7623e33dc7256f2.npy +02691156-a1b95d2e1264f6bd66ccbd11a6ef0f68.npy +02942699-fe669947912103aede650492e45fb14f.npy +03624134-e98bc872371c852e15b040d25222e627.npy +02691156-d6db0815d8fbaad621967ef97204d18.npy +03001627-f0ca6f9383ee9aae517376ab44a447e5.npy +03636649-955143d7f0b5c70fef76898f881b76a.npy +03642806-9e901676eeb65f352b1c9d869bc37167.npy +02924116-a8dde04ca72c5bdd6ca2b6e5474aad11.npy +03001627-284463280e6a4d003719086e0b4ab8be.npy +04379243-b26f4075b45a3a473c75ff89cc8b70a1.npy +04379243-9a3194d78a592039a95110eea24f99c6.npy +04256520-f693bb3178c80d7f1783a44a88d6274.npy +04401088-c202335fd3dccf9d45e2a4e5729b970d.npy +03642806-6b4b8ff6b859b262169650f5be5e669b.npy +02747177-10839d0dc35c94fcf4fb4dee5181bee.npy +03001627-bfe64c93bf5c3858c4f202fffc87396.npy +03211117-ab8af4bf679eb599ffb8194c06b9bc3c.npy +04379243-8ed0ac779ec4bbc9beedb4c8fd29e2d1.npy +04530566-80c6a14accb189a9c2c2c81e2232aa95.npy +03001627-d9bf326d8ae7a430a5a7dec3df261ad1.npy +02933112-f3bc5eb543bd852bb7ea82317702e856.npy +03001627-8c91c7c19c20bc4cf130e9cdbbb1cf40.npy +04379243-b7c36f0afe9f16655b1ab0bf4891d200.npy +02992529-6ff995a8e9faa6e83e43be0b542efff8.npy +04530566-1d2aa0bcc9ade276a70cfb3232f40c6.npy +02876657-c46bfae78beaa4a7988abef1fd117e7.npy +04090263-605cfb5fcdef75539e6170029f747a35.npy +04090263-fbc88753c7697b825e4f1f524019c.npy +03636649-451fe793f6e8fc29276206fae5d3c473.npy +04379243-d7792a9c16aaf16d98e0d1738edd4f19.npy +03001627-27ef7dafe404bf424e83b37723b7fdca.npy +03001627-6cfc437d8ec6ce7413d48601aed73697.npy +03211117-2b2204a683efead6dfb0e2d6f3832f45.npy +04530566-1fb07d5bf3421a46e2b83b21c9537e1b.npy +03001627-ce159c7d983d74136ba14bfd91a75020.npy +03001627-eb32fa1ae8069d0998e0d1738edd4f19.npy +02691156-dbc521b1d4c2d308303d346f4be7d4f.npy +04379243-2bd915e46c4b08e3f2cd47be0243fcd2.npy +04004475-9504267500abe76c510a6e7bd9c355b3.npy +02958343-f1b928427f5a3a7fc6d5ebddbbbc39f.npy +04379243-c33f90746a3573878b39b912ed4a7b59.npy +04256520-3561da3d136b4deba023804ba421cf6b.npy +04256520-5b3b26c9ec974a1cdef028ff6a07adf4.npy +03691459-161de75c52763afade3a1fb6044fe536.npy +02933112-641e64902bb9f6a4aaca4b071fcc002c.npy +02691156-5a3344eee5b27e670da4e1131665650.npy +03001627-44f6f1cadf8e788f90a9ce3e4b15521e.npy +04256520-8b82330caa9b1a514038d588fd1342f.npy +02924116-b434422365ab5b9df54effbbed1a418b.npy +03624134-2b4aa9edf0e15a6b1e00d60b0f9cc70.npy +04379243-24d1d32aa33c38716a97150bb2a72733.npy +03001627-2e0beb3b6927a2b7e45ef4135c266a12.npy +03001627-3f194ed2680ac0f4f875094dbf5fec47.npy +02828884-2ae355c406b7204e8c5da39cd0403824.npy +02933112-7650fd61f3a162397ee0cb5488055ac.npy +03001627-6684ddb2b7acc11e975d41ba8f947ac.npy +04379243-4c49252bedda66402c2d6a2f47ceb5ce.npy +04530566-61053086346058bd2b477561b6a06f5c.npy +02828884-4aa87768e4e9c7639f7aad887e9e880f.npy +03001627-f0b50b64918ef41b990561fc34164364.npy +03991062-f61a766cd84d46a5e88c1d6fc3580355.npy +02924116-a10b42b69a8caa5b616d27151166e25f.npy +03991062-a1d2ddc8fdcc9f63adbcc9ee28cee4cb.npy +02933112-4f9b95af6720c7fc11fc2b865c2a185b.npy +04090263-3f9522f1af5597cbf0fea2ee98610322.npy +02691156-eefb4a1fcc2ca4d8894e22af7ae821f8.npy +03001627-11d9817e65d7ead6b87028a4b477349f.npy +04090263-fbda020053554eeceab5ee569c9de1b1.npy +04379243-c7778ca8dabfc6809856fa70a578baeb.npy +02992529-a3193340929f4bdd146def56c5fc9b3a.npy +04401088-fa3f5a6c21c56ef7e85fd905d1f6c116.npy +02958343-4471c286051d2bb94da8bffed051ff6a.npy +03467517-c7f501f73e11ee3352e5d4d2615db5b.npy +04090263-dbdf82759d3a0011df6f54267ea02d3c.npy +04530566-5295994daf6e427dbec3353c29751fdf.npy +03691459-6d75b6211f3bf8dca999ad3d6fc50304.npy +04401088-338c3f116cd39022a40276c99b77cde3.npy +03001627-308f0ebcbcdad58119fb4103277a6b93.npy +03001627-d5e9eb9dbf9d30073321831d2245cf06.npy +03001627-181b65afaeca2ee1a6536c847a708e24.npy +02808440-5a79d517ab366c52ccd0340812259a39.npy +03928116-b6272c4596bb32dd732e279d31bf9790.npy +04379243-9df064dd2a0f58a1d0176f9a144100cd.npy +02808440-b671a193d0397ad554d7082b34825ef0.npy +04379243-3c5048910fe8919ed810b14a81e12eca.npy +03325088-faec75b6043eb5ee4e09ebaf49b0cb2f.npy +03001627-f53cba4a288db2d58e1400f6db70a939.npy +02808440-b43b17f0378ed699ff1dc6e98c2e01fa.npy +02958343-94cfcfb74e246f938acb0ff76f4aec7d.npy +03636649-748983e71880720852ac619cbeedfc0.npy +03001627-10d174a00639990492d9da2668ec34c.npy +03001627-341e24df542e0676d42b9650f19dd425.npy +03001627-6190eb8be0f39ad782e3bf439621ac4d.npy +02808440-74de09e85976da12a13787f910fef0e3.npy +02828884-b9fb64100372235adbbc9440457e303e.npy +02828884-12b3daecfb0eb7d2056b4bd5d870b47.npy +03991062-fa894d811206c54dfc5eb16dbbadf7b0.npy +03790512-53d6f04450a85fe9ca547803ba354ce.npy +03467517-493df075787dc0f63ac61a2f8346a8f.npy +04256520-5f93127875373b8657f15fc9385a8a01.npy +03001627-c9dc5d85ea3bf4d8a1088e4f586b1246.npy +03001627-e6408c4be8e6502837a346dba83c013b.npy +02958343-3a46c9b9e8b18d6a61c6c61410fc904b.npy +03636649-77a5a12147a6624d786810c22b062a88.npy +03691459-5222c43f267d9f313129bd51bf061fac.npy +03593526-447730fef97d1f5a89035c25f0dfeb63.npy +04090263-8571fdae210bfd6612b38b1d99376c0b.npy +04379243-4e784e440912c48819fb4103277a6b93.npy +02958343-84394f62a86ddab875c67b3b1e763fcf.npy +04090263-951b61886488dd94d0b636a2d5e450e4.npy +02691156-bf124ddeb1189a3cb312af71146176c8.npy +03467517-6d546f8dd90259d62d4ead5a1be351b7.npy +03593526-ac95989d0e196b4a98d5fc0473d00a1c.npy +04530566-82ff35912d0a143a4e2501f4797d0851.npy +03636649-4610f7cdf3923b05cea97147b08cd8b.npy +03642806-d3606fa80e46f834562d7644f5df59b3.npy +04379243-b7621e8afb9e7b18890992ddacc04113.npy +04401088-b307961888415ab88ec5d235d7e81cc6.npy +02958343-26569f96aa6c4ed880af23b535873bb9.npy +02992529-3d1d0255e2163917f4ad1770263e7f39.npy +03001627-49c955a80749d2e1a5ffdf44ff86b795.npy +02691156-b27de883a83409a86bd2a0f0614d73d.npy +03001627-b5833d19f6fbd9a78c67f98c135b5710.npy +03325088-b3271d0ad091e15ec36fb70296e45483.npy +03636649-faa4b839db01b86fcb8d8c6d4df8143.npy +04256520-66d4f7c3c9018c9c4d3ac4ef5709159c.npy +04401088-bc27ec84fdfa912437ab6ee77f8c5e9e.npy +02933112-ba6599d00e879e11c59350d819542ec7.npy +04379243-795d4213e1dac276f9814818e8ac1c35.npy +03636649-d7760d5f9e1e6a622cd2160e449d45ae.npy +02924116-19242c27a28f09f141cefd10ce5d6cc0.npy +02958343-996354bbe7baa2b2f24437126510c3c7.npy +03046257-a67b32ac05ac3c965ef99326865249b8.npy +04379243-a886752590af36549e726e922f49b373.npy +03624134-5152ec5d2de585ec77b7d0d4764c121d.npy +03325088-a24f6e1d173f61885646c94351c07f35.npy +02691156-37b1f7f02c4b87dbca8607f540cc62ba.npy +04256520-e80bb04a59bd72691b17743c18fb63dc.npy +02691156-7805239ad1e40e07c69d7040c52664c5.npy +02691156-900771de03746670ca8607f540cc62ba.npy +02691156-f16381a160f20bc4a3b534252984039.npy +03001627-fdf0fd3b18066cd7e8b2b8dc0c816caf.npy +04379243-d77f7643e6e34ac91933ffef19678834.npy +02958343-472f62cb87c3f1606e04fb225ca92772.npy +03642806-9d48ab8c41174e60888cad7f6c0e6001.npy +04090263-70db17ecfddd51183554ccf8c30febe7.npy +03467517-15847850d132460f1fb05d58f51ec4fa.npy +03636649-a5b394e2c98f6233636c7e486232cac1.npy +03636649-c9eca1a946d5c74930259ca79b88bb0.npy +03211117-481a1dfe44babb3892b08e504d6ff5ca.npy +02828884-6c5b4a90068a6b511fcbd85b6ac8926a.npy +04330267-fd4201033847644d74c60db5b05c353c.npy +04379243-b5bc21c92dc997cb7209833c7512d6a2.npy +03001627-aa154024474ad7d138a720835dbeef20.npy +03948459-e017cf5dac1e39b013d74211a209ce.npy +03001627-a4b32d26e0962bf74a4ab00b9639232.npy +03001627-3190b19c1ae0aff9c5ff3a5f34406751.npy +04379243-ac440171fe3edf2a5284eac239212f2d.npy +02691156-81e6b629264dad5daf2c6c19cc41708a.npy +03046257-5aab22188aff5a9ecd124d563222b065.npy +02828884-b2fa26eb323ee7e3697079d6fa35f34.npy +02691156-54d49185bcda732a91e8833d3c500d73.npy +02876657-ca210c6696357f98e8ec08b84f068b50.npy +04256520-8892a081230c9e0557b8f616df7adf9a.npy +04468005-f46601730530a00e96cd7d9555234e5.npy +04090263-97e6439ba7e703dcd7d3985b6fde9645.npy +03001627-6aeaf646d526b41025a1c5ed6eeac95c.npy +03991062-3487ce3dc7f16ab15eeb207be0544bf9.npy +04401088-f928f74ed34e46c4b5ce02cb8ffbdc86.npy +02828884-a58e45ec5204f09559cbde03ded257fd.npy +02871439-750ba8feafceba921933ffef19678834.npy +02992529-3488722618d61cacd5b6fb666fe071d7.npy +03001627-597f2b2153af0c544aabcf2a7cb640f9.npy +04090263-da478adc6169bf2b34cef5923891e520.npy +02691156-dd5310819d4f16d7b9fc567905a4b292.npy +02958343-9de10b4469cdc435afe1d4530f4c6e24.npy +04401088-ca2e71c5e101797fa524f6bfc21eae12.npy +02958343-eface8341d001e9ceb01ae4a4788bd4f.npy +04256520-4f17918826b64fc8d5cba62773b8025b.npy +02958343-fd98badd65df71f5abfee5fef2dd81c8.npy +02691156-c18b1ed6e935b11bca8607f540cc62ba.npy +03790512-2610c94869f2456c3630e1f3568e4cec.npy +02691156-5c7729a3c482d77542c20743f866e1a6.npy +04256520-2780834da1be89d1f51f77a6d7299806.npy +02958343-1137cd58d6a45c6659a47b1880958de9.npy +02691156-92ffaa5ebef3c4025d85b5c95b248fc3.npy +04379243-82a1545cc0b3227ede650492e45fb14f.npy +03001627-36d314f3b118caa9bb557fc9202b7772.npy +03642806-9bfb4fcfe4fc903ca1fa797bebd1cbce.npy +03636649-baffbaa9a9338f331735ea0e092a805a.npy +04530566-6cf0d9cb4e2d607856f77b6bc6731cda.npy +02747177-94901779bc2359adcb2a965e75be701c.npy +03948459-9a90f323edc8c30f54e702cd89ce6f04.npy +03467517-23e9190aa371509820f1bd6cc69c7b.npy +03001627-276a4e184b9d71c4d838ae16242881dc.npy +04554684-bcf112d7f50c222685842deebe63f964.npy +04379243-21ca4d36a0f6fa69b937d98d58545fa.npy +04256520-4d5efa4209fc3c126c92f284160734ae.npy +03001627-20b8c6959784f2da83b763ebf4ad2b38.npy +02880940-879a5c740b25ef5c7a88a2ad67bfd073.npy +04401088-d659d98d384e2c37e405d2e0f546cab.npy +03636649-d00391a3bec2a9456a44fdd49dec8069.npy +04256520-5b702274926a8c433be1d0c32f5added.npy +03001627-5a94a4638e8d548cf7628281ecb18112.npy +04256520-221153f680f3ef015761a0b53ed37cec.npy +03636649-8a9ef07176e60ceffcb8d8c6d4df8143.npy +02828884-9c8aba47e37b1eff155d75bbf62b80.npy +02843684-cfa3e202c9b73e63a08977deec57f060.npy +03001627-469597794b28bb2bae5a95f4529b204a.npy +02691156-a18f4e4c291761fa7cebb3dd777c66be.npy +03001627-6f7a337878543c07c3bd24f986301745.npy +03636649-447a8ab0523dde411936a2870d820ad3.npy +04379243-3e4434c7714ebf307ac0fae7c37e01a7.npy +03991062-e7571eb148c46f16cb2a965e75be701c.npy +02691156-8f9fe8d7df1af4e057240bc6888ed016.npy +04090263-38fa7b145b3be7fdb4cdad9a5bf52dd5.npy +04090263-5e4bd1ed44830fb147e5d4c250a3c98.npy +03467517-58264c7b174a7cfdd57700c05b1862d8.npy +04256520-b7b15c6728478971bafac5c6f2fdd4fd.npy +03991062-6bf575f4fb9dabe278634ef2c5fdc560.npy +02691156-213004db08a787a466cf1b4a8fc3914e.npy +03636649-f4e1a4032b1686cec35131da26f8061a.npy +03636649-eb8da4f4245496c57f1cdfc0a8f38f2e.npy +03211117-dca7417eaa143de13ccf3d40fbcf475f.npy +02958343-2ecbacde09270d49cbf57aaa2ef6598c.npy +04379243-a814fbd363007fcfd93cf5f5bfd78ab4.npy +04530566-dbe05209a14fca8fdf72e713dd4f492a.npy +04090263-5eed8cd506081459ed6071560148e6eb.npy +02747177-28d07148048431d4ad5067eac75a07f7.npy +02828884-3b412429257bc1c34e437e844fb32a1e.npy +04379243-8c3e8ef43fdacf68230ea05136ea3925.npy +02691156-d70d648947c65b1eca8607f540cc62ba.npy +03001627-4179c276ee8dacfc8cbd400aa99bee96.npy +02747177-66d96d2428184442ba6cf6cbb9f4c2bb.npy +03001627-123b44b99e48eccb6960dc525de2f934.npy +02691156-f0fb27f3a597838feb1a0518c224975f.npy +03991062-b0bac7f86d4a184bffab4d6f10fa1d97.npy +03001627-35d2e2a050336b78dbca69f936e89647.npy +03001627-5bfee410a492af4f65ba78ad9601cf1b.npy +03710193-4b41dbd95a68067b71c1364ca3ac2195.npy +04256520-6ff38c09b9ab4dfd712f5f94eaf97217.npy +03636649-cb614975be6370dcb6b7592323488fab.npy +03001627-2bc587e0b4c0a0aa5a99858ad1805187.npy +02691156-fad346b02d91348bbbf3143b1cb6076a.npy +03467517-272d3447422afbc05389be63fb12cc36.npy +04379243-ee7e37046c26168dc2fd07f66cbad0f7.npy +04530566-d3043fff20dad5c41dc762869682f4f.npy +04256520-6afbcbdc7ab9357270db6230313d3ce.npy +02747177-e2276eb0322d1885cb2a965e75be701c.npy +03948459-345179cdbb6ac9da4dd752ddde80fb1.npy +03467517-671cdf7d555433fe94c23358bbce964a.npy +02828884-ea96a04c68b969c5c35f34f09f11667.npy +04379243-e7045bfa00de20a39a0d3e7e907e5b53.npy +03790512-5e43289edf360d01e937abf44800029d.npy +04256520-1ce97f222c9caeac14038d588fd1342f.npy +02992529-aabbfc7463d49368419fdfebc874eb8f.npy +02958343-a83c45069b2925efa7e7e5ea49ad8e45.npy +03211117-a03ff904fbcf341ce333e1b65ebab960.npy +04379243-53b815fbd98e6ed237be8761f2d10359.npy +04379243-2cef3d2d545f4a22b305a938e0ed1b48.npy +02924116-80cb1106b1f553669ccc82ba1c8f035f.npy +02958343-6a348343b90f8f06a78cb4f1b66f009e.npy +03001627-a8d357344e421ff21e12bb4aebfe8421.npy +04330267-4bad13c2b787299241965be83b7745a.npy +02992529-5fefcb474b6dca4b23b380c931ece1e8.npy +02691156-5fcc974627fb15fbd1491f61ed5cc034.npy +04530566-65c55828d88fd02da08632bc2f6881eb.npy +03991062-ed220bdfa852f00ba2c59a4d90e63212.npy +03001627-92b332233da033e71d022067655f6c16.npy +04379243-ad09eb0cb78bc62238279ad3a29524b2.npy +02747177-39733528663b8ffbad5067eac75a07f7.npy +02958343-911d8dad65dd79948e35db9103756ad5.npy +03691459-5dd29010575d36ea73e1b2d018c0512.npy +04530566-48a02e067f83c803473f10e6caaeca56.npy +04379243-62a0d0647476f5e5f8ece882ca124c40.npy +03001627-3de9797fbf88fc35d97fd0ea4791ae93.npy +02691156-c85e3f6c572581de7d3b11085e75c7ad.npy +03001627-cf1e9c2ae3309c65d7bb55f118ea0541.npy +04090263-dea853cf0b776f7dbc6e84bc30e573cd.npy +04379243-8e6254609ffacf233e5f17778b45d37e.npy +03001627-587d174c5f2b19c1d7e48afa5cc5db41.npy +04379243-1d8536c4e1b1b8eec5ae767f471fad27.npy +04530566-ee0e9bd4c375f1e76c07231ab3c62b82.npy +04090263-8fedf1a088427ea8ca3e540900266737.npy +04460130-3f95f49a3c400e9eebde864f704d194b.npy +04379243-d6064ca673a721ee44175b4dddf5be08.npy +02876657-726a6ce68bcb4b2d14513156cf2b8d0d.npy +03001627-f1a5a9aec0b63b91f487e71bd57b6e0c.npy +04379243-b20105f74c7a469647839bae1bc65257.npy +02933112-114b810af4a847ca99dd23ec22c4943b.npy +02828884-5e1ef1b63216952dd2b12aa6a0f050b3.npy +03001627-6b385a32489bab4abbc7a6acbd8f058b.npy +03636649-f9259d31df38bd5decd204cd7180226d.npy +02691156-95d0f4440a694e4a203936772104a82d.npy +04379243-bdf7606e8d493149664b3b9b23ddfcbc.npy +03691459-1ca17d2cadd47286c066b9622c005c53.npy +03001627-eeebe3fe14ee4d3aebefe6b1d594ad2e.npy +02958343-a2d50ee31621c3e059139efcde1fedcb.npy +03001627-8e4269ac16e13433d701c68e1045b606.npy +04530566-63c241d90e86ddb5a70cfb3232f40c6.npy +04379243-18d29165fc26330467903707764646db.npy +02933112-aa722d165b5ede74f8832716537767a4.npy +03948459-b3ea2d0331ec9ec650544cd7fa263944.npy +04256520-d58a2c86b9b71f6bef4e42d70375aed8.npy +04379243-f46f68598988b922eede8c01bbe6592b.npy +03467517-86bb8f9fbcf5fc20bc4ac3caf16ef65.npy +02691156-1c87b854cceb778615aa5b227c027ee0.npy +02828884-9683f5ef9e032a8aad5067eac75a07f7.npy +03636649-3cd21b83cf709f1829a42a0444436860.npy +03046257-5147d0b10721d430f51f77a6d7299806.npy +03691459-475853b0ac6bec73eb752889d5199f9f.npy +02691156-18666bda4244d22ca7aff2c3136e8e59.npy +03211117-2e5b9f616a0805dc3704a45f4027ebcb.npy +03593526-1a619680edc5c461a95e4741ba1b4acf.npy +02691156-77dfe229aa38e70b3fdf1b3b0fe86dff.npy +04379243-d2a3193796284084e8775b281dde57f.npy +04099429-863f387309a7c684bf88e92fc4e43a8d.npy +03636649-437482f4d187d43893202bf99dddc268.npy +02691156-ba37c8ef604b675be1873a3963e0d14.npy +04379243-c8cd7f01dd79bff03b92b6b9488ceadd.npy +03691459-e1b3bb54b9855f12d88a3e0e92891ad5.npy +04379243-1f24b9a75606239466e24bbfdb446f55.npy +02747177-2343794f942a698cb6c43a5634bf2724.npy +04090263-4a56ba0b85af56703bbe4035b770f62b.npy +04379243-7e1c4bdfbf19aa22d3cf0d40743efc0b.npy +03325088-a3999e8953b3274ab362845c6edb57fc.npy +02871439-27dd0e22a3151fbbd8d04e687db9eb6b.npy +02828884-4651f5b75533042283bc207d8a5912e3.npy +03001627-f1cb7ac166e7f23fd9d3572bbd9cf789.npy +02828884-ef1a728572967942ad5067eac75a07f7.npy +04256520-cf651c9562d9267032a526e2e9a7e9ae.npy +04256520-3b15020aeaf67cd5b085db76290ca220.npy +04379243-efbf0d75648b7c7d5792b99b8245d225.npy +02933112-b12c3a046c326ca1d9b228d02c3319a3.npy +04379243-f0a7dba4e3c7c1e4ffa178ce1c2c6b13.npy +03211117-115cf7354bf5926331067bcb59115bdc.npy +03001627-8d4efa9893f7e49b3a85b56ecd01e269.npy +03001627-b7af84a7e76dfb59b04cb542e2c50eb4.npy +03636649-58c49450594bef2afcb8d8c6d4df8143.npy +02691156-ba1358d41ef026fbb87697d3904b168b.npy +03046257-67e0ff4c52bea7ce61cfc645a8f27696.npy +02924116-3a46aeed35093d3d2ab2c6d327d62fed.npy +02691156-68537bfb054ee3802ffb52751fee2c0d.npy +04090263-c36992c1accaeba6803b54e9738b20a6.npy +03001627-4ae645f3b724a7dcb83ea6cf8ac00397.npy +04090263-a7de37ac9f6fd8c4d6e401b0db4905ed.npy +04256520-adfda3aefb86478319fb4103277a6b93.npy +03001627-3ef60b4e28c22b3bc7dd78af359f0fc6.npy +02992529-3d5487efc1d3442ce81f45a785365b0f.npy +04379243-5d3d902051858e56ed1397afd2317e5b.npy +02924116-b01aab6f2de05d1e52470de2774d6099.npy +04256520-5161e139d0a58822a773e2c829d72a13.npy +04379243-5826f35dcc58f9206025dd3b37729bd3.npy +04530566-28db3989d5ef36e9c3691cf0253958f4.npy +03001627-bd0cdf88217ac15af9e0f15cc1c070db.npy +03325088-a447d1bd3dea48ae54d7082b34825ef0.npy +03001627-a7d178cd0dc051f25fceaa39a8353bde.npy +04401088-8ede5d8c00e10a2ff35554ebed2bf2.npy +02828884-b53a4b74b0c898ab615925cde06141be.npy +02691156-754d9b0f12e6c6104af5b53e1d2ec5b6.npy +04530566-91c1e885c5cb2ace3c01fd24534f394d.npy +04256520-d8c748ced5e5f2cc7e3820d17093b7c2.npy +03001627-2972fd770304663cb3d180f4523082e1.npy +03211117-5282a5a7482b317ae81a51f0a8c4cae1.npy +02691156-8a674703723db7a390baeef8ba5b93e5.npy +03001627-3f0b0feb58008a663ec7ad443e0ae81e.npy +04379243-d9addbc9e91eb0efb1b6b0c5ddacb607.npy +03001627-62fb28b9a362fa0adf8d3197c3f0b3a6.npy +03790512-45009f5fa4cb295e52ee90e577613070.npy +03691459-4e3669ef40de1b3b465b32805167c435.npy +03467517-173e4f1824f7b9fa93f0194265a9746c.npy +02958343-a13fa4cf0dfdd5b58f7f0d2c9c57704b.npy +04379243-93d4c1821a6eccea462118aaf3f93639.npy +02871439-e6b90d7b634f03e0f65dfeec70ceaaec.npy +03636649-fdcee8d924f3a8404d01f72347a40cbf.npy +04379243-24b997004163af21851a116903680096.npy +03337140-e20a4db61eb83e2cac27179ae57fd682.npy +02958343-afa0436d9cb1b19ec8c241cb24f7e0ac.npy +03636649-ae5a1b5c8b93cdf4899bad344dc01f2f.npy +03797390-c2eacc521dd65bf7a1c742bb4ffef210.npy +02933112-5584ec27aa657c65ad329b1997e89fc7.npy +02958343-3163c8037d5782365688db6590f826c8.npy +04379243-4d85392c3233b2b8d3299846d5c00f08.npy +02691156-9196f5a53aa7756687bac2e90bbe10e8.npy +02828884-49704546a313b40781e404e60978a1dc.npy +03001627-1cad298ed14e60f866e6ad37fee011e.npy +03001627-2a1124c7deb11176af42602f1636bd9.npy +03624134-8fa93b48c0c8e9abca9a013036a28780.npy +04379243-cddbf3a55a623e423002761e7a3ba3bd.npy +02691156-8b594934c14ac5db66cf1b4a8fc3914e.npy +04256520-c5ded02dd51a5482e0c5923879d79f21.npy +03001627-7d3b7916dc5325a9c862eec8232fff1e.npy +03928116-d190952a74fdd232540cc0119178eda2.npy +03001627-2bfa0be90c15bfa0b82cf928f6ed5338.npy +02958343-14ab7a48f51bfe69597505fd7d99b613.npy +04379243-5c7dde9febf82c72e4d8d44a2bc9dd4d.npy +04530566-1b1cf4f2cc24a2a2a5895e3729304f68.npy +02828884-6d4fad5487a044249dc30bab479ad5d4.npy +02958343-b0fa729f031a97d2c3c561b608f78503.npy +02958343-8e1e365bb6202682f43c51e53897fea.npy +03211117-b9ef07b9ea14f4fb1dc17d595f9add09.npy +02958343-8e764c26b9d6fe15cc2825da82c7ac3b.npy +03467517-7b498b66d9426ca844629dda8178547d.npy +03001627-93001617daca67ebc8687ff9b0b4e4ac.npy +03636649-a1bdde7b604dd3a89b1c4543cc5963cc.npy +03211117-cd71c33773db5570be7e507ed67c0331.npy +02691156-6ad619600049376a4aa57d4816c68a3.npy +04401088-9878b77e157e4b0dffc2eedcd24a87fb.npy +04379243-2538c4fb2a271b06e74bf18c5b9ed60a.npy +02691156-422105cd23178ebf333c61abffc4e1c4.npy +02958343-69126951b42485ff88cf40718544e7cc.npy +02933112-1f0b5514d93f39ebd189eb81471216ad.npy +02958343-a37a9d8847ca3b90e6052439e5a76d12.npy +04379243-ffc75a8bdb88c751b7fbcb21c074906c.npy +02747177-5a2d3cfcbcd3779f44a292ef014253.npy +04530566-94e216dc57731577c14e2939682bc455.npy +04554684-add75c4fa0707efa226eabe1cca3e850.npy +03001627-3126c6e9277b775b245ac1812a4e4d0c.npy +03337140-6c07ed789e414305ac477d524b05932c.npy +03513137-bb3a039ef88a9fbc480514d7f2edc0a3.npy +04090263-dc4b75223b732847384cbf852f305630.npy +04379243-3959856509e65a18a36258eabc2b9c.npy +03325088-ac2cca058aadcea43321831d2245cf06.npy +03001627-ed5b718c4efc65f148ff063e62e02115.npy +03001627-dbf5ea40382c5efed30107faf024a18b.npy +04468005-d0465d61dc9f9df9db4b3acbf6e65df0.npy +04090263-7787bf25c9417c4c31f639996cb3d35d.npy +04225987-ac2b6924a60a7a87aa4f69d519551495.npy +04379243-34b36de23e2e64852e3db45253b87bcb.npy +02691156-5afdfdbb4161ce0a7456183f198fd1e9.npy +04379243-fb32e9a7a8c2dfad74eb542502c2205f.npy +04379243-2fa78f97515a4d5624760bcb862cdd1b.npy +03636649-1baf036acc927ae27b79156a61ad4c01.npy +02880940-1a0a2715462499fbf9029695a3277412.npy +02933112-97cfa011875acc33532e8683617554c4.npy +04379243-71581e6511d7782282e6c3a4e742651d.npy +02828884-1cbbb30e8e06e932ed98cca8f0ccd5f7.npy +02828884-9fd5b67a2b20b5d1b19874039c8f3e05.npy +02933112-721f7a03a70b1107c0b2397831029b54.npy +04379243-7f53246b6aa7fd551a44da2424b9c700.npy +04468005-dd17c94e4b9b250ce982c7c6a3539d1c.npy +04379243-c9f3ac109419150246ef4343e2399480.npy +03991062-8d0d51aca855152f8c5f8653702e8d09.npy +02801938-fe06ff4915b6665ae25f6fe802a8997.npy +04379243-eb6ded7c35e0a3f69856fa70a578baeb.npy +03928116-4c68319a9f02d3909807fae46dcfc049.npy +02691156-ad6e93a1db3e1da5977e4bb19a62128e.npy +02828884-6e166423582d68bfd5b24cafb84903c7.npy +04256520-aeff4f4375c08e8ab9c8adebb50c258c.npy +02933112-636ca387c40fa8adc59350d819542ec7.npy +04256520-4760c46c66461a79dd3adf3090c701f7.npy +03467517-c0e00a9f55c9562a1f41064618762936.npy +03624134-a98bff7180fa174742a9381145738f08.npy +03337140-b1d02b692be88b6e4c3aee8e9d3a6ffa.npy +03928116-48e315ed7ae006f7a0c70bf6db5526f4.npy +03001627-689f7ad63ed9a7baa75d03186a0409e2.npy +02691156-87cf8f265536d4369a6e43b878d5b335.npy +03001627-4c513ea0804fc008c8687ff9b0b4e4ac.npy +03691459-6ef86253eb81e4d418200338a176d705.npy +02992529-768648ae74e9d84e6d445fdc5fd8bfe7.npy +03636649-6595ee36783d261ed3281970e2c44dbe.npy +03691459-b78e6c1ed34b29e7fdd1073b17e9e51e.npy +03636649-ca65934efe289843df446319d65b9318.npy +03001627-68dc135cd4671aeaff74317afae0a323.npy +02924116-6bfa535418e49888ba23f12214cb6df3.npy +03001627-6ed95ed3e89e09ac191c3762b497eca9.npy +03467517-ea557b9733435d95e9317ebb79eeaf1a.npy +03636649-e7da3cd73ebd81146251354a8b1397eb.npy +03001627-7c467486ccea38ed9c3a7877712317b8.npy +04256520-d8de84e7c0f8cbb19473aab1da686220.npy +03001627-534b0e6e2c53a8e1a7cdfd3874ed3723.npy +03001627-43290694390ad1adfc735c9ceab0161a.npy +02933112-6a910ffe32ae2e575588a2543ef0b0b4.npy +02933112-7f6d01dfa00872a26cf87f8460db3ae0.npy +03938244-24dfe6ef933ae9692257a9702919f3a.npy +03211117-a98035c0230649c79b95c928a1983150.npy +02691156-c93d0663035962b01b1cc145b0144991.npy +02691156-4bca81eedcc3da52b8013668e30e23b0.npy +04090263-1ad3a8c8c369448c22274f18b3096ea6.npy +02691156-72d96bac651bc74c7af159eaf7625abf.npy +04379243-85fd80db82120aa719fb4103277a6b93.npy +04379243-e0f6e43ec7c44cf0f60d4dd27a88e505.npy +03691459-acdb8a7d906b126e20363e2561dd589a.npy +03636649-e13a855926f25ffc5285aeabe3f6e218.npy +02828884-3a1915451880215e9bfbe8b02639d1e9.npy +04379243-e7dd71eaab0f209dad5067eac75a07f7.npy +02828884-6b70f11a9baa59ade43f70c0a99fd544.npy +03001627-34117792b1a8c180796c584ff1fcf56d.npy +04379243-2777463657ece1a3299457639cc3cfe3.npy +03691459-57374f933930a1453f92eb5e681ffef9.npy +03636649-1bb465b8f22315d1116f219d90a571c2.npy +02958343-a2dbc7c6487ed68f1b448c2bdeb22379.npy +03467517-4a704919068627caeae5cab1248d1ec6.npy +02992529-5298e9c7eeca74f8ff2988f561e515f2.npy +04256520-2c86b652e14005a09c39abaf208a73e5.npy +04379243-5de212ea4d57b20b526934092c2c4777.npy +02818832-8a3240bc541767544b44261aa73cb2d9.npy +03337140-6f392c57518e225e7c54607407af3ab6.npy +04401088-180ef1cc23b96050bc8c03f74d3af56.npy +02828884-cb30a5a8df3007f6f4fb4dee5181bee.npy +04256520-1372c28325f2794046dd596893434005.npy +03001627-c3da3ae20c1f92650640e24a5497a2b.npy +02691156-c7fe2215d41c2db3a45193285587808f.npy +04379243-4f3e1e670753c96ac955e5ed03ef3a2f.npy +04379243-e566fd9bbc3d51d377b9297f3055210.npy +02828884-3363d17303f69d7fad5067eac75a07f7.npy +02933112-a21e3a21401f889defacb264ebf1ec75.npy +04379243-cc182c3aa204614540f68c5e459bb389.npy +03624134-68c2ea6a1c8c147e30f57e42c77d3894.npy +04379243-d819fc4d86af592f7394c9d8807c7bdd.npy +03642806-f0fb8d7162a100481492bb7d502a53a8.npy +03513137-b4c223db8b1a30016cf94eaa382e4d1.npy +04379243-5a61158cfba0bb6a80360680c1602c7d.npy +03325088-f5e2551d23370d93c36fb70296e45483.npy +03211117-f8a23c22e76666a3d4ab0eed66631cfe.npy +02876657-d8b6c270d29c58c55627157b31e16dc2.npy +03593526-6bc426e7226f6f22362d7fcfd32ff15d.npy +02691156-645cccbc057c79cdcc57882dfaef8a57.npy +02691156-d81042a53dd1cc5bd90bfc986bc4c94d.npy +04379243-e6684a7ab98d2809856053d38b62525e.npy +04379243-fda71e511d095837acbf0573260a18d4.npy +03636649-58484d1c37df459e32acbbe2387ce75b.npy +02958343-5bb0076c269d5cb1ad19b94b8069bb8b.npy +02828884-beae527c550f5ce8e4ed7bd95fe664b.npy +03001627-e052eaa1d5bbe795ded10515704c9720.npy +04530566-ae8ccc2a90c7d57ff107f18bfa25e296.npy +03948459-63e7e84894e95a8015595517be070250.npy +02691156-f6ea6663b48bf78261f1ef59130c405d.npy +04379243-d7cde91c536c6502d7a1dc9bb68fc381.npy +04379243-7588da8ef1e427d1177f2a3a0c71fbcd.npy +02958343-7483c242d7feb3a5b9da62c54efcb32b.npy +03001627-30f68a6304d6906c9bdca9b7303475c3.npy +03001627-395868f297f01d2d492d9da2668ec34c.npy +02808440-722a8934497d70d18fcae10bdcf407e9.npy +02808440-ffa8c8fe242f0df054d7082b34825ef0.npy +03624134-9d424831d05d363d870906b5178d97bd.npy +03467517-fc7231fd95d1e4687a57dd3c9d98d88.npy +02933112-14a093126f5764bcf2792e4b1535c6c3.npy +04379243-5f4c30f80956bbd25fc5e56a56e86bdf.npy +03001627-d36ecfec3f3c18a9a28fdea8831e592e.npy +04379243-8840824c8e5cfafff2b7361116ad2337.npy +04074963-33a7613166c65aa0c7c51d4ea74651a7.npy +04379243-f977ba3ec46bf1c064a940596f3d867b.npy +04379243-e19080d150b1932ab20aa91e9e90c311.npy +02958343-a1c337c71f246f0b1d1a964dea8a7aab.npy +02691156-f9c93ddc9b921d88a72ae0d8b7f98590.npy +04090263-ddca06d91af2db70d735fa1ab17311ec.npy +04379243-a2730a66ac07818cd3299846d5c00f08.npy +04379243-396a32fab409303c811237b87ea8b154.npy +04379243-43c9aa5ba91b803edcfcef693e7ec696.npy +04256520-dd572d69cfa263bfdb10cbf40397412f.npy +04379243-e8aed77e92a8c4daac3edc5d86dabc91.npy +04379243-30b3454ab0aedff9fc30525e763ef5eb.npy +03761084-3472585bf8e2cf3ddf3a1b0d597ce76e.npy +04530566-d830527d616f47c811b9a587ace886f7.npy +04379243-385e55a7d0e528d312fbf3eb7146682b.npy +04090263-55b86089f042d17f81d2fc3f6a98fa93.npy +04379243-81e223168807d7be74971c311d25a3b4.npy +04256520-a2bdc3a6cb13bf197a969536c4ba7f8.npy +02691156-3a3827f1a76c5230e24527abcb488f31.npy +02808440-ee70154fce37a50fb362845c6edb57fc.npy +02691156-17874281e56ff0fbfca1f1143bb6bc17.npy +04379243-ba2f81e15029a37baf7caa8fd318856.npy +04090263-67335d8a40daad7a7e60e1bca0143d66.npy +04530566-f6762e2b8bef4ffa476a01ad767951be.npy +02958343-eb1bd7389854311c14f284ebe538e531.npy +04379243-e4f6069dee09b0df237af722b64576c2.npy +04379243-274e9bcb57548a02dab956ed03b0f26c.npy +03790512-83d3483c6c9edc39949b12cf3977a48b.npy +04090263-a20f4c1ff94b9d35127e0873cfaa7b8.npy +03642806-33b9567a9f534747cdd9e16bfb7eee3d.npy +03001627-c487441af8ac37a733718c332b0d7bfd.npy +03001627-740cc6d4d1c6901eadb91c074e672e22.npy +02691156-d06035fb4ba89c91f119374ee5d5f944.npy +04090263-73ce9a5617acc6dbf1e0fcef68407ae5.npy +03467517-7eee3b79e053759143891ae68a82472e.npy +03797390-604fcae9d93201d9d7f470ee20dce9e0.npy +03001627-c93860b7f38bf628bda72093f9b5aa73.npy +02691156-c31f5303997022c842c20743f866e1a6.npy +02691156-bce1b10c92fb9fc81b7a4091d85f2e8d.npy +03001627-95792c6761663652aece045e8bdac80f.npy +03636649-9023acca19d27f3fd49b2e04785f8492.npy +02871439-2567c4d8f4da409e1362d127df6d94eb.npy +04090263-c51600abc4b5736ece58fb8fdf218569.npy +02691156-997539bb0a0d8cf852c3271e911ffe19.npy +02958343-a16ff37768fe676473d32960f279a9cb.npy +04225987-d9b0de3b3aecfffb1fabf3cbd0fc77bc.npy +03001627-873c017f35957717b56a13a4b2372aa4.npy +04379243-719d38e7ec228bc9ad329b1997e89fc7.npy +03001627-e102ff4df6f28b6cdb400c09abe26220.npy +03642806-b211cfb105e9f97e6436916a86a90ed7.npy +02958343-58569e7feac27d3e5da8146fec888d45.npy +03001627-ad023095f1868d3019fb4103277a6b93.npy +02691156-88883a7ad39baf47bd46d022fd7d80aa.npy +02933112-6de399f706f2972970365ad078f710ff.npy +03001627-311c07b96ce39f82c70d3fe6f2ca143f.npy +04530566-667c662b55519e4650cff0d5bea1684.npy +04379243-b78d5b0748c83f3f855931d119219022.npy +02691156-6da4668de7ccdd0d4d10a13d437fced6.npy +02958343-6b0238b41337365a3330c5ee7577e4de.npy +02933112-a2dc947048077f4bd0b36851d61b6fca.npy +04256520-84a119d032947cdf1da03d263d0d0387.npy +04379243-7bc93a4cc26fab5c8c12b667670a35f2.npy +03991062-312314e1dfd5173a9f71dc1b1525f6a1.npy +03001627-82ac145a471e406f35836c728d324152.npy +03001627-6844180c300bbf852edea1c2bfa3bc56.npy +02992529-864b69db6dfc4bd0d4b4ae2ff4c58b57.npy +04379243-3c1b4a85f3a287fe47d51fb55a1c2980.npy +04379243-63a2d10d7c77424ad214ef3f65f73d74.npy +04330267-32fef525b8b75d2bdd833638fb82f742.npy +03001627-8180afee86f2075519fb4103277a6b93.npy +02958343-99f49d11dad8ee25e517b5f5894c76d9.npy +04379243-7bebd474258ec29e3c594bb716fb0dca.npy +04379243-8673b121b420cc0ca23949c21eddef76.npy +03593526-f2599921c8e0a76ea4e7499e379fa4fc.npy +04379243-ec98b08c2093d435f51f77a6d7299806.npy +04379243-e8b3da6a6d938b475966c5a46a5a6ec8.npy +03001627-9d151e778dd4a3f7f91663a74ccd2338.npy +04379243-7da19b39d092fc8e33b12e4baae47737.npy +02691156-863742f8e07f52ba4c3a35cee92bb95b.npy +04379243-c0d8f876e068f17adebc282c830998c6.npy +02828884-b77813d8b4fb7c606919f8efc25fe2eb.npy +03467517-cb9bf7f11fc58db41afedc87fe387fe.npy +03928116-ef668f117f843e0a8be892244b73e9f4.npy +04379243-87ab01946ad4a2f6e56bc109beb9eb57.npy +03991062-3547134cc7eb68e2ffc6e457221b9271.npy +04530566-81d9e9f072f73e42c71a2f2273897a58.npy +03001627-c585ee093bfd52af6512b7b24f3d84.npy +04379243-4d959d3b7b3721d448ee6d5fb14cf83d.npy +04379243-29de23533f0a9c31b79de6fdd84b2221.npy +04256520-6c9beda59f24f107b001e9ae2ac46c17.npy +03001627-90b181de9005fbd04cd0eccf52b625bc.npy +03928116-a27dc2aecb6fa9f69cd438906b0d02a4.npy +02958343-57ad55aefd13445c94a5ecac47d28f09.npy +04379243-a93d61d10d489c8eb2c2cd006d206129.npy +03991062-e5fd89e60fb6f668228d0d8aa4a41f21.npy +02958343-2fcec17ab09a42782a9eb0f146e94477.npy +03691459-68393fdf9730d1c86e95461e6c2993ce.npy +03001627-4ad85a7d1ebf49e3490ad276cd2af3a4.npy +03928116-d1fe87277b6002405aa0446e42ad65.npy +02828884-6ba411c181323fecea2b566ddae9e6f6.npy +03001627-d2992fd5e6715bad3bbf93f83cbaf271.npy +02691156-320e542b0b2f8afa248b612e49a6e572.npy +04554684-4713da50446a7595df3a1b0d597ce76e.npy +03325088-bcf2c837460a391954d7082b34825ef0.npy +03207941-6e85f6897e07e0b1df3a1b0d597ce76e.npy +02958343-9fe68c848c1385a2a9733fa2ac6b95bc.npy +03001627-9c8d3c5779871705d22218517e73100.npy +04379243-45b6c77fd17726713002761e7a3ba3bd.npy +03325088-75f3d28ed37de79c3ca0c4be71e7b721.npy +02691156-d7454b0e80d3236ff268234accd8cf4e.npy +03046257-f6964ba8472cd2bc7adeea6eb984f491.npy +02958343-ac482136fc30fd5ad8f405c5ec4e8cb0.npy +03636649-ea5893e12134c6272f798bd8a3edd4de.npy +03467517-a576b89276b4afd4dfddf59b80ae0f2e.npy +04090263-92fe43536b3f6dc1593fee7ac9114e04.npy +04379243-d0c369ef812dc0cb1839c27e793b8c3c.npy +03467517-910e903e228fc0ca8c8de43217db4540.npy +03691459-afd431c30a98f782d52af5b75b4cbd2d.npy +03636649-68a94becfec1965e21d6b7a56ef55b4.npy +03691459-b2af20dc171d40e4d4e62d99c536bbaf.npy +04530566-4944328c0ea895c53f464857aba8c0eb.npy +04256520-487635f7daf9ff48b3bd1e430b6587.npy +02933112-b278c93f18480b362ea98d69e91ba870.npy +03325088-69fd9452cf1cbeabb362845c6edb57fc.npy +04379243-20b5a668a57dcdb3402fc9e845187711.npy +02958343-747c49bca6d4ae9d7c84d27684eb86f7.npy +02828884-9b1ed4bd84562d3f406f2f420f742d6.npy +03001627-92c176547858fd2cf91663a74ccd2338.npy +02691156-1e827425b289432e8b96ae1a0a8b84ec.npy +03691459-16bf19a982c7cd71dd6a08110bca7bd5.npy +03948459-378c3f18cf130bace1f2a1daf140ac9f.npy +02924116-4cc81551037031571d008b909e781f21.npy +02924116-9cc4191d5af880a131a492bf3af5da7d.npy +04330267-e3650521e9c1979ea3cde9bbf4c69d5a.npy +02958343-4ebf1a8cbbd4a05228044fe9244db50a.npy +03001627-a99285df8c6d4578b980c976a65c0d7f.npy +02691156-2a3d485b0214d6a182389daa2190d234.npy +03211117-3863575f24e6bbe3fe5c8ffd0f5eba47.npy +02924116-2d44416a2f00fff08fd1fd158db1677c.npy +04256520-d9ae4cecb8203838f652f706160dc96d.npy +03691459-b3009e2384620945a35bbc252ec176f3.npy +03001627-103a0a413d4c3353a723872ad91e4ed1.npy +04256520-32198f8e02253fc0d1fbf79741fcd6d6.npy +04379243-87ebd707ca90700d8b424343280aeccb.npy +04379243-7fdb1575e7f15c199d9fad88e2f4c8ff.npy +04004475-c7dc190e3b4d9875e6d38cae12e77b1f.npy +02933112-740eb7316c76854ace5d6e9371bb5c33.npy +02876657-c61edfb672986ee48a9393b5e735dbde.npy +03001627-a20df07368113438ac59dcddec3b075.npy +02933112-71d240b4e2e79be96a001de88d8cd8d9.npy +02958343-90f2e2d8f9b89074425b2c354eccabaf.npy +03759954-18ff360b39e5306272c797c96ca37495.npy +03211117-94525af6a244a33c21d7ca6ede0e9373.npy +03001627-86d77a9e22be4d5773fdbe4b39ff4036.npy +02691156-c85a76404b85d94e62b600da24e0965.npy +02958343-c30bf6d1ae428497c7f3070d3c7b9f30.npy +04379243-ca13d22c81c74698d97cb887517a1526.npy +03467517-b5fb2a19bcd09e0ef1a49eb32e519d69.npy +02933112-3fc6e2baf40f4377f5afb395b99ae069.npy +03691459-a25819c97470bcb09dd0351f01396cda.npy +03211117-2198dccbee4d38e11a23ce2d1a5d3925.npy +02691156-20150c9c3038d08419bf31399c6e39e0.npy +02691156-cbc73e8bc866ecacf7f795409cb230c2.npy +02691156-9b1fc3881a5335cb44012f72ba1e15a8.npy +02747177-8bdea15ae5d929d0a2eb129d649f68cf.npy +02958343-1e12573f2d8ffca667789dfcc3262f70.npy +04090263-83859013886286905dca6305fb9f97ca.npy +03790512-a2af2d47ac7bd232c3b8d605d6b133fb.npy +02942699-9533618250e35304514fae39ba03db5.npy +04379243-4da91eb1adb9e960ad5067eac75a07f7.npy +03513137-a6d6d755b17fdbbc3e8b63b9578c7894.npy +02924116-8b68f086176443b8128fe65339f3ddb2.npy +04379243-db8678030bede8ba88853ff6bbbb4a9d.npy +04379243-9ef38dea16d4d335a71c812e027f94d9.npy +03593526-6596b4cadc29d0448de42fc1392c2139.npy +04379243-6c50ffea3a4ec86655f46d55537192b6.npy +02828884-2d1e5eeb255e79dcab53bf7fa22f3636.npy +04379243-f02907c5c42e1e766f1e07a56c129dfc.npy +02691156-9c41b0040048581c32387cdb9b2a84d5.npy +04379243-80acb994a8dd6d636831079c2c481dd3.npy +04256520-2097fba74518dc6e4a949e376cab703f.npy +04090263-8933f22af2576e5b9f433921788191f3.npy +03001627-7f271ecbdeb7610d637adadafee6f182.npy +04554684-60f7d79d10e19134a3e7878f2bb5f0ca.npy +03991062-7773a6283bd25740ffc6e457221b9271.npy +04090263-d5ee8eeeed055401a3a714c763a6fafd.npy +03691459-ac951c58cd826af6a89585af9e32f3d7.npy +02876657-75bf30ec68b8477e7099d25c8e75cf58.npy +02992529-453c590f0a1b37c1e0c2427da07ca8c6.npy +04379243-5ea758a6391a2f814b7c5e48b51e5c7c.npy +04256520-b4c5addeacfce8242165c54dcecaacb4.npy +02691156-57f1dfb095bbe82cafc7bdb2f8d1ea84.npy +04379243-e57509d06a49646c490ad276cd2af3a4.npy +03001627-6ea2aabe267b519537b2bb75885cfc44.npy +02933112-c6abd725ec744274b8710a3469971b1.npy +03691459-7e359607ecf460f399372ee1e6dff278.npy +03593526-ace45c3e1de6058ee694be5819d751ba.npy +03001627-4e5e8af0880b0d98febad4f49b26ec52.npy +04379243-f69b664bb78a4c2f7537eb150af3dadf.npy +02691156-6d432caaa8eba4fb44b2fa2cac0778f5.npy +03691459-8df018bf733ff01cf00aae52edb0b7b.npy +02691156-2494cb5facfe7b1f85e0a2007a11e92f.npy +04256520-191c92adeef9964c14038d588fd1342f.npy +02876657-1071fa4cddb2da2fc8724d5673a063a6.npy +02691156-a4f5ce5926123e472e78e1154b9a2647.npy +03691459-6341662056860c3e225f3f0d46b4fca3.npy +03001627-aeb86d8354eaafa232acff7796d8c3b3.npy +03691459-38f418f2d64692df63ee8a34069b7c5.npy +04256520-2f458ca5f25954ea9f2349486c570dd4.npy +03001627-d4f5c3e3eab52d0a3334fb6668ccd834.npy +04379243-ff3f1004c4126b966d75aa5db61c1fe9.npy +03636649-b6efb78876150d45c94b622f1207af2.npy +03211117-dec6a8c1c01e148d20685b5a7e34b501.npy +04256520-8641e421ade0f7cae136ac3990ab77b2.npy +03938244-2b627f36c6777472f51f77a6d7299806.npy +04256520-1a389652d23b9cc06bfa0701d875ff10.npy +04330267-8ff18f81de484792f0b94599b4efe81.npy +04090263-65d6c3cd8c1edfea719b648239c8e160.npy +03001627-60c0c32187f4e2ddf51f77a6d7299806.npy +02828884-b218e59af74f0be4ee9005feeed08b86.npy +04256520-26b0765b08c86fed52db1d2b4104f173.npy +04379243-51205a57beb69476fa4763675e844f9c.npy +03948459-446e4145b475eb245751d640a4e334.npy +02691156-ba784e6de35a5c6b4f8a08a5e6b028e7.npy +03001627-19d7db03d81663394733824eae5cd9ae.npy +03211117-581df3d934bbb7d3206de7995cd4a74d.npy +04004475-73a7d3d05b9dd459ffe3432ba4f2e6d3.npy +04379243-f41198b81216f36ff155d75bbf62b80.npy +02933112-b5a6edf04474c327ded35d98d26f9668.npy +02691156-674115a86dd196c142c20743f866e1a6.npy +02691156-71ad36bd32ad44a0c503a3776fc280fe.npy +03691459-119fc0c18388a2a2e338ca8c90019f12.npy +02924116-f8977b22fa73c57910c9f5a2e580dd66.npy +04379243-929cefd882de6f9b5048ab7650c7a7c.npy +02958343-9375ded98380ccc77bbf13cb42ad9d73.npy +02992529-7ea27ed05044031a6fe19ebe291582.npy +03325088-d799034e7a417a97b362845c6edb57fc.npy +03636649-6f4f8f3788da22817217386867d08cc.npy +04401088-7d93b8dae79d5bbe7015d3b6f402d5a4.npy +02691156-829108f586f9d0ac7f5c403400264eea.npy +03001627-c6898b62e82e61a8930422448288ea.npy +04460130-de08da18d316f927a72fcffccc240663.npy +04379243-ccad4d1ffac1b5e978ebd8af2a314e49.npy +03991062-d6342010f3e2502fa4b84ca629203b44.npy +02691156-2228845a400dbad30fb60bd5470eb25.npy +02933112-c59d2a61caf94a97c59350d819542ec7.npy +02958343-f2b350b6c36eb73d1fac59b924f395d9.npy +02691156-2f4f38d774e0e941dcc75fd1795fa3a5.npy +04468005-84de1dc7422b00c627c514aa9d8cc75.npy +04401088-1b1969121f2d099b27192dc5dc6ab252.npy +02691156-d5a94c9f09d238c4c3a35cee92bb95b.npy +04379243-6a35640c7f10aa71850622797c13f562.npy +02954340-7cf439aa8382299047765668cf4023ed.npy +02691156-d3d788c1fb35227619ba010ddb4974fe.npy +04379243-e534dbb5eacd708c18885412f2b0a4f7.npy +03001627-f913501826c588e89753496ba23f2183.npy +04554684-434fc8832f3ade492d5c22cc9b713d25.npy +02828884-dc286270b2256b94d2b12aa6a0f050b3.npy +02924116-1b6f9f69c1bf86ef41556f795d265590.npy +02992529-1cd8004a1e0dd825c33f370fa5b41cf7.npy +02954340-dc3e5c0457defe87a52821bf1aa3b19a.npy +02958343-24d7494c6b92c6e7c1bbb501b1d87871.npy +04256520-c4af170f18f0d6edaaf0ad030fc37d94.npy +04379243-7bbdfac048aefc9a5634c21965ee6bab.npy +03207941-466e441dffbdf9fc14b35a7d7cea7130.npy +02691156-e4ac77fdf28116232fa725d7a62a02a.npy +02933112-832fa486c60335f66ca64288cf1b7ee0.npy +03001627-64a585a441f2ffa336c8b9bf2576aca2.npy +03001627-935093c683edbf2087946594df4e196c.npy +03046257-df5b2ba70ceaa05923500a5b036df62e.npy +04379243-5a9a9b14c1830de641cf86c757faf4f9.npy +03636649-8913c3dff1651a316a3d00506cb9ed19.npy +02801938-5eea24527c8b3124cb2a965e75be701c.npy +02933112-131992dab1550a7aec24cae3e129c189.npy +03001627-f2b2448978785cf5fb63369d5dd85d25.npy +03001627-341fcdd8a40a2612456cbf78e1e89022.npy +04401088-68ffa3cd161114cf55f5bce8dd67399d.npy +04379243-cc82b660e39ee47df287722009141c0e.npy +04090263-b4f358642d91251d26acd17789ec9c7b.npy +03211117-aa92ecd31491bca87a88a2ad67bfd073.npy +03001627-708fabd1e1a39a77aa6bb5920f533ce3.npy +04090263-2e0fd9303c251ccef02ee453ff283e26.npy +04379243-6ba6309d74f4a131272505863dd1b8dc.npy +03001627-b7073426bf9332187c564a6b9ce2156f.npy +02691156-2ef20ad4c579812571d03b466c72ce41.npy +04379243-d0346744d67b08b099e8bf807e902261.npy +03001627-20c6158bbeb2735ed1dcc55e36186e4e.npy +04090263-30fcbf2fed0eb241d8569d1a6c25406f.npy +03636649-eaca02e8f065925dbaf5b49ad7809302.npy +03593526-ce6f30234bb3797fa2ee63b46530621c.npy +02958343-58da19fef63348a56b6ef877dc525506.npy +02933112-6f113f2baf10463635836c728d324152.npy +03001627-81b27636162e148bb3fb065fa3089331.npy +02958343-8202d2165aaff4c05fb2da48d9c8120d.npy +04379243-4561b621e5b7c1ae8cb5d9909aeb1309.npy +03001627-ea1bfe81b88395fcaa29e9f0529e8ef7.npy +04460130-90143acb141fb1cb4292de5cdfae65e2.npy +03759954-1c2267e8b8a099a47457e76661a399e9.npy +02691156-e1324a093b45645c5a5672eede2b271f.npy +04379243-b12ccf1813b424864a62dd9e5e4067d1.npy +02691156-6db6f79bff14b883a0ff12a4a79c7c7b.npy +02992529-b73398902d1c267b5eed8c8b1cd54386.npy +02691156-7b485e11f80e0577bc0909d98a1ff2b4.npy +03691459-72c5cab12c0ddb22a0fd8d18f37cdbfc.npy +02691156-c9764fd84080da3f4fb6842b3610149.npy +04379243-a6e066da6311c2c7f4d017dd03935e6c.npy +04379243-366a7129cdbaa0b8fb94cf898f4fa24c.npy +04379243-54e85b248576c4eb57cd80d4b17e7e11.npy +04090263-5b5acb01373af13180c2e60c312b0f09.npy +02958343-c1186d49101dcd513a0daf3e5400b95c.npy +04379243-ce96139ae5a4dbfa55f46d55537192b6.npy +02924116-845599a0f9d7951acbdda2562495e10b.npy +04379243-90a2174624d8b62da53326e496617646.npy +04090263-76377dc3d6b1dad2c0aaedf10d776af7.npy +02958343-9f08e434ad95c4bbbc37558785e0529e.npy +04379243-9d2c5a0dbfc811b3f9ae74fa595a8a63.npy +03636649-d939b56b53aa7e7c42f80363988bcb92.npy +04090263-3e3ee43e001e800a8f06d4785681c4e.npy +04379243-f772e5b89475fd2e4719088c8e42c6ab.npy +04401088-36b3329dc0bbd86989704dab2d2a8ab9.npy +03467517-3527ff33cb9afa1aae4662a5bb3d78e9.npy +03636649-6918fb9f51d1dc3dba9ea396e14c59f2.npy +02691156-a702da03d770f5096e2738fc9da60e6f.npy +03624134-31b39f0851060f87913cad523820e930.npy +02828884-ac78c8b91417aa5bd2f4120f473fc3e4.npy +02958343-2cc413c3ea9800b3cf1e58caa15acb49.npy +03001627-d28423569bfd84708336a02debb9923b.npy +04379243-407276907088c8c9f51f77a6d7299806.npy +03211117-3aee103b0bde9cd7c16bf14ed6ef2f6.npy +02958343-9748063440a449ab3db642d8dff7fbe6.npy +03046257-37a995cd9a8a125743dbb6421d614c0d.npy +04401088-ab2cdd82bc69255f1fc489fbdec3fa1.npy +03261776-64c7ed011cb25eb5f9df692fb910a2fa.npy +02958343-63428e5fb6fb627aea5698f3cf7b2f4b.npy +04379243-e25fdb977fb867fdc3bd24f986301745.npy +03761084-c1851c910969d154df78375e5c76ea3d.npy +04379243-4f06f4d04d239448bfa17a32b3866b83.npy +04379243-aa96704dbd5e852cd9fad8aba2c312b7.npy +04379243-cd4e8748514e028642d23b95defe1ce5.npy +03691459-16ad8ba41b4caaf66a0a07a21e1bacf4.npy +03593526-852e1bca3ec5fdeb5dc9e54641a3f5bb.npy +04256520-78fa28a031f1042f3bd16075d47dda52.npy +04256520-507d740bec19238d18f52c8a4cfcbe33.npy +04379243-a4b2870ce7a54b8eec11c6b035aac769.npy +04401088-f420bf37baaeee5621844676433a0aca.npy +04530566-a3e0b522698e11a87e43a7221507fad.npy +04256520-f563b39b846922f22ea98d69e91ba870.npy +03636649-22ca1d5fbd8e6eac7b79156a61ad4c01.npy +03691459-54e61267b88174967bc8772c5c1a0c19.npy +04379243-651706776926937314b86d5282eb8301.npy +04256520-cd74a153b605c6a3cabc196a7f35f1aa.npy +04379243-397c56f15e547fad1bb088904f7cb154.npy +03211117-cadc40a7bb182a40cc229b563d900f4b.npy +04379243-f4d0e1be9884f45cd2fc64a9331b7788.npy +03691459-5948bd85a58330628de9f116e0231954.npy +02933112-2cd6ee7e592939a9824662341ce2b233.npy +02808440-36a554e2ef628266b0d51feef5761dce.npy +02992529-addf767a669d9732691c3af43bf5f97e.npy +04256520-fd4dd071f73ca07355eab99951962891.npy +02691156-b153004c293d4b151f32208e53f871eb.npy +03001627-6a227aa2e1fb8ecf51f77a6d7299806.npy +04090263-a0025e80ada9cf91ae9e1c81f7e5b0b6.npy +03001627-47bfa972100a782519fb4103277a6b93.npy +03325088-8c853348df36663321831d2245cf06.npy +03325088-4492ee234374c85914b35a7d7cea7130.npy +03691459-8a3edcc398f34fe534b2581df0f941a1.npy +03001627-90cae938e34b11a429823c412ca4576c.npy +03691459-453c959963a529322633ff66beb9cf31.npy +03001627-c2430d27be01948ab8e1b99345a5afd4.npy +02828884-52c13c1c0812699120f85be7e9edc22b.npy +03636649-4c3a0886647ae06a6ecf9e4734c75a01.npy +02958343-ed6bf649ad5b3d82b1bb46d2556ba67d.npy +04379243-79eb4b57cbd73e117e2e50070ddfd27c.npy +02933112-c6e91d50e1bb3351a8851b4eb6161973.npy +03001627-50a4aa069dcd171937b2bb75885cfc44.npy +03001627-87afe5137d675efb73418f9a8c25ad1a.npy +04401088-67c6c3db87a1d72b7b8e0bea6a77fb50.npy +04530566-c79c87dcf17a40f698501ff072a5cd78.npy +04090263-fe2e9f0363866aba8868d0641feb1888.npy +04379243-fafd354b0713882e4532856089dfcdf5.npy +03046257-883d4ed6c9441e8e707e09f70814b7ed.npy +02808440-3858ea48966b8e5654d7082b34825ef0.npy +04468005-b6d765b5c2e547d64878adf45135c9ff.npy +04090263-8b0710069d95b4563a411ca33a218449.npy +03797390-79e673336e836d1333becb3a9550cbb1.npy +03467517-1758c5cbffc7f6634236d3c4918b91c6.npy +04090263-c0a8c6eca464a1ab9f433921788191f3.npy +03001627-bb13760fd1e2dc182d19175e7d19b7cb.npy +03691459-ca545c7c3bf38891af3caf4aab91511c.npy +02958343-50840e502ec2a45aafe1d4530f4c6e24.npy +04256520-84ab3d4610acab1adb352b8394e172c8.npy +04256520-afb937bd74261f5110004612ff5e29b7.npy +04379243-eb54a7a886da95f69223fc014b68160f.npy +02747177-8acbba54310b76cb6c43a5634bf2724.npy +02924116-1e4909dbe765a9dc18db89a808b64af.npy +02924116-917de64538fb9f3afe1d4530f4c6e24.npy +03991062-9fa3f163821a388d96d49c3c538e4bfa.npy +02691156-48836d07312f930223e2b52fb0c019e0.npy +04379243-3712e31c61ea51a354b250a5bdfb0136.npy +02876657-eded10bf44a2571a911cff0cb398f845.npy +02958343-6165a435160e69bef997a8fb55b67177.npy +03636649-395701deeb1b2bfd48657c771cfae685.npy +04401088-3ef3e3008fd2696ca1033de17902ec9b.npy +04401088-cfc5fce3c76610e3634fff5505144a5.npy +04379243-2a5cd32bacd3ce601ba08c4ff5d0476f.npy +04090263-c8889a93245d305518c3adaf57b2e1d8.npy +04401088-35d370a1531826adbe5693b333a3dd92.npy +02958343-1548f5fb0684d08c63155b8ebc275bd1.npy +02924116-1c39805d5ae78d319797a4124a9f002f.npy +02958343-3980afb8f986988daf285e0d3f56d074.npy +04256520-927967e761c52c11eaf288f952624966.npy +04379243-c36b95723ccd6f6da99d925f789b1cf1.npy +02958343-999007a25b5f3db3d92073757fe1175e.npy +03001627-da49d0ed41204ff65c0da4cac04adaed.npy +02747177-eddce90cae7f1468f155d75bbf62b80.npy +03710193-62536cdfffbec7902e869c74025e32a8.npy +04379243-32f8195c437b5aef51f77a6d7299806.npy +04379243-36821105af341539d810b14a81e12eca.npy +03691459-3256546f0f70af9c39c80a095f51c7bd.npy +02924116-c2441f4ed9ee23984d44f5db04bf14b8.npy +02691156-be080a797406422843afdb9c81ff2967.npy +04530566-b1bc73627283a4076b861850ae66c9d1.npy +03046257-c0eaa0bcd85626c7847d4e46a1f9f05.npy +04256520-6b6509e3589bc296c10c5f14d140478c.npy +04379243-33e0b076b1dfd411654495ddff111d98.npy +02876657-95e6a3a1232f97e3d333084c1357713e.npy +03001627-490797c10b8cdfcdf4b6538438a0b930.npy +02958343-9f4bbcf9f51fe1e42957c02bdefc95c8.npy +04530566-e1a43edb6152a3726e23bf72aec61fd1.npy +02933112-a8a4fbca233fbadb7ef0119f8dd1f40b.npy +02691156-54c0f5b611d3c7e683651cbc8e49e4f.npy +02933112-868509e96bb859bbfd5b2dc3df6521d5.npy +02691156-655ea8d8c710cf98f3a69a6853df2d7b.npy +03046257-1e61fd6a1b436ce6153d4c0fe024d18d.npy +03593526-7b6d5a7a902ca441529e78b4656a338.npy +02876657-810e90684c0d4ce5636e3a589cf8c61c.npy +02958343-4b1227b5dbf1cad92e877e82c90c24d.npy +03001627-5c83457abb14f95768c2f5eb1dd4dfaa.npy +04090263-8b00e0ea294fdedf8af39b443dc477ce.npy +03593526-c1be3d580b4088bf4cc80585c0d3d970.npy +02958343-5b4243556369155858c383066ceeaaec.npy +04256520-75418c9587b8eb0edd7fb8bdab16e83.npy +03991062-4e1845df2a98ffb858c88d30f502a452.npy +03261776-53433f3e15014d831220240e825d0985.npy +03691459-5d11e7821ec86797b646fca2237eb6.npy +02828884-a8ea7dc227b632edb88a2574e8fbb52.npy +04256520-150c9d9b92f7559f593ebeeedbff73b.npy +04530566-a3459aeef2676d7653b838b6058a8d95.npy +02958343-e169584b7e66ef074051b6e037481c7.npy +03636649-c5d999b26cc9ba381735ea0e092a805a.npy +04256520-47bfa972100a782519fb4103277a6b93.npy +02958343-f9fb47305ee7156d59139efcde1fedcb.npy +03759954-78d91f0919fc1e9c799b5809965371e5.npy +04379243-10bb44a54a12a74e4719088c8e42c6ab.npy +03001627-348528e8d474a003cb481b0b11df1849.npy +02924116-1c9568bc37d53a61c98c13d6112727de.npy +03593526-97199437c2b3acb664cc17fe2c6413a.npy +03001627-268304221a5717124a05fa063da00291.npy +03001627-bfca24444b46e75e492d9da2668ec34c.npy +03948459-f80c465c9e401dab44608b3255ca1886.npy +02924116-c9dd192e42466ce852470de2774d6099.npy +04256520-979ca0cbd4bffe37c7b11e86284a2e.npy +02924116-2baa252ceda0b508cccea738142ac97b.npy +03001627-b65c3e0800f1c67cf70828d0af10edf3.npy +02691156-b71bd3c61315abf9ad8a06dbee1d115.npy +03001627-95039795fd8db944608244cbb9b86bf5.npy +02958343-ac813039f9a4468ccc777d23edf2f8d8.npy +04256520-e3610bdf0eb38f6b4b8710a3469971b1.npy +04379243-1bd801dd5da88655d989c9f989a09ff.npy +02808440-b03cb02cab23307b71f6c2d1271354cb.npy +04530566-5b0e4acffe94b6ebd283df6ee191ad24.npy +02747177-18be3d380d248fe081faebbdea6bd9be.npy +02691156-fd528602cbde6f11bbf3143b1cb6076a.npy +03211117-416674f64be11975bc4f8438441dcb1d.npy +02876657-defc45107217afb846564a8a219239b.npy +03001627-26d98eed64a7f76318a93a45bf780820.npy +04256520-139b38251b5bab5214038d588fd1342f.npy +02992529-7eb1bb8e7f83313b5bfaa3ead015ed29.npy +04379243-2ec33e8b457ac0fa278d386bfa54545.npy +02958343-12b5e4f52c22b348d8499d8846cb4c3b.npy +02933112-31c94abeda52273286d53ab0fe94e911.npy +04379243-75024d18227e53b565f968dab29b0192.npy +03001627-c5c4e6110fbbf5d3d83578ca09f86027.npy +04004475-8f827c87f5f7c053f105ef303e18c873.npy +04379243-f85a362c7607921a7aeca7115f6949c7.npy +03636649-c5946f7781bf5167aa6c5592e5d8022c.npy +04256520-ab1435d685c06277409421506a05b6e1.npy +04256520-3dee5f41a11a1fdbdc83753cd31caa42.npy +03001627-41ab50680dfef43aba5342d638d0c267.npy +02691156-48e477d5904bb7bb1ad94eee1d03defc.npy +02958343-fe9c6862f758ee056ce6bb1d0811960f.npy +04530566-7e7ec66ebdd4df7ed1745f739fc0fa03.npy +04530566-c993c40ab88b161e3cedf90fdd80720e.npy +04090263-e6fecb2700247e1dd87c63d8b3018b58.npy +04256520-d835768fc0cc3300ccda8d28b44378b7.npy +03001627-71dbb37c026cc338eff2e9bdfc79fa2.npy +02992529-8ce0fff87979560bed1f9cd2184d7b73.npy +04379243-c0546f05e8a4542f1cf1ba58f558540c.npy +03001627-b29f5c7c73908424685a4d2d2b5da82a.npy +02691156-7f4ceb12e48be00ea4642ec4b6f68a.npy +04379243-ce1bfb999b211d423825a5bc524f67c9.npy +04530566-f2d7625709d7bdaea6dae8586082d789.npy +03211117-31ea284fd46d2d6013d823b13369c182.npy +04379243-94d6518cf1e00eaac013a7bed5288654.npy +03691459-336ae67af51a13309e87d2bdcb41f548.npy +03001627-d58df0968070bf3b4b3c42e318f3affc.npy +04256520-d9acd27e2a9b12d3ae685ca100c909e8.npy +04379243-4ce90fe70faf4c3e255bc16374754e69.npy +02958343-613bf2e7f987553220d9307ef0bda318.npy +02828884-9ebca72c02d26886a6e82f4002a10be2.npy +04256520-6bfe4dac77d317de1181122615f0a10.npy +04090263-6d7b8924dd47dc6e7330912d1744819c.npy +03001627-13cdc9e018a811a3ad484915511ccff6.npy +03001627-f85f33b3f6cac48a512d71be7dbf2d60.npy +04379243-7988c8f23dc634678de5f815e8387cfc.npy +03211117-301148e373839ecc37ab55b97a5e9f9.npy +03001627-2e5e60f57621c1e7480c54eaada840a1.npy +03624134-efbe696985dcb81ae3912d46f2dbb69d.npy +03001627-a3e990cd563b7a57ea411f5a15742da6.npy +04379243-e9c3a3aa2278608bec15b38012222fa8.npy +04090263-9301e31bfb2f8f8d88be2a30dd556a09.npy +04256520-11f31367f34bfea04b3c42e318f3affc.npy +04225987-7a00dee660ee94f5dfa6594bd6ded322.npy +04530566-42a8428a3d909fd64de203ef6842ee61.npy +02808440-857adf3f4e2845b044221bef0fa3c36b.npy +03001627-7eedcb6d76b8c23a9cdb421f6af95e5f.npy +04090263-681e871906643ac4f9a24531fe7127c2.npy +03001627-c7ae4cc12a7bc2581fa16f9a5527bb27.npy +02691156-117861b9ebca4f17c69cb28fb4b4d257.npy +03001627-75d0664363f418efe461a9a9741d9415.npy +03636649-9af818e49ae8a9357bbff3af6bac359e.npy +02691156-649a8f44ccc86f4843513dd632697ccb.npy +04256520-859e3eab73311f38ce59ea70152320fa.npy +02876657-8a0320b2be22e234d0d131ea6d955bf0.npy +03001627-30074024ad3c581a19fb4103277a6b93.npy +02691156-97bc5fffde64178f43afdb9c81ff2967.npy +03636649-155c83f40406bd0c48d945252c13120a.npy +04090263-2ad41c44eab88406924d7b1c81f7a0b1.npy +02958343-985082c9239527ed728fa2df514c65d4.npy +03001627-6163793e4e973450a9b8d9d3b5cf54cc.npy +04090263-78c7c7037e2ac7a7e0490a4a721b5273.npy +04530566-c0eb62cb64ee1a31f29de30ec1bf6a3.npy +03001627-81ba38f4d3b7eac1f82a35e8b19afa86.npy +02691156-dae59259ed2a2951d13ef00338ba8c52.npy +03046257-d11f6cf17b7c9e7a741f8bafb2e2f5ae.npy +03001627-e5b6a3cf96b36a1613660685f1489e72.npy +02691156-898b4899114d9bb890baeef8ba5b93e5.npy +02933112-8dc8d2e0bdf870ec95d0ca3fdb30532a.npy +04379243-b1d643bee9cc33d9668ae11a7db5e82a.npy +03001627-c50976d44eac9f3cd7aac2535b43ae4e.npy +04090263-ae53ea0e6011cdbde2bb19fbad3e4596.npy +02958343-84f258f2969c02de6f94a44ce504367.npy +02992529-9fac50c7b7c72dc694f8f49303e93f14.npy +03001627-b10dd8cb211b26ba98d5fc0473d00a1c.npy +04379243-2766a883126503cac3bd24f986301745.npy +03001627-3ee094648665bc3fca15770f07fe3544.npy +04530566-8b2e1eabf620d76840633dde0a3c28c8.npy +04379243-c627f3639caaf614a6589c01f678d8ea.npy +02958343-341b474e01e039af59139efcde1fedcb.npy +03790512-e65c320aa245854e39e5b34b546caf02.npy +04256520-8673ce2da94bfe4ff42b5131862a2dd9.npy +04530566-786f18c5f99f7006b1d1509c24a9f631.npy +04530566-8b25d01f3fd3d5a373e9b20a29bc1d50.npy +04379243-b1bf0b775e6fc085391e4d6c585a697a.npy +04225987-48f26ddc704fec2f379c6a1d59ef7283.npy +03991062-4d637018815139ab97d540195229f372.npy +02958343-30456a19dc588d9461c6c61410fc904b.npy +02942699-550aea46c75351a387cfe978d99ba05d.npy +04379243-428279529d61b45260ddf36bc44130c3.npy +02691156-46d334b92644b9c8445d150719ce97db.npy +03325088-6f2fcfb9f844979f87dd60af81c93a3c.npy +04379243-15a95cddbc40994beefc4457af135dc1.npy +03636649-68abd2755ff4588b545bbb1b2e749fb8.npy +04256520-b3c7b4435c3d05164dc11e421397c795.npy +03211117-8b5a96b72767f7354fac5eaf08c4d9ce.npy +02691156-da6faddc7079ce8ab6befd5df74fffa2.npy +02691156-b2e86c7880a56b6f71c382fe82cf6e04.npy +03001627-fac321238dc8637eaa7cb30470f3273c.npy +02992529-3aa3d13575540a99167196b0ec8ce495.npy +02808440-474a0aefc64043da54d7082b34825ef0.npy +04530566-f36e77f80e2944ae73fb6350806be955.npy +04379243-5437d8fcd8dcb47a4733824eae5cd9ae.npy +04090263-efd891428cb699e78dd4952817969d63.npy +03691459-b754df4013a71f6873e1b2d018c0512.npy +02691156-201e40e86acd7d34f4c1adce71073351.npy +03207941-717ea298a9a70ae7e5bf1ab8e7d0b.npy +02958343-5a2d4ea15ef5c18abab6b34711b43bed.npy +02871439-6db2136ad0de3cded810b14a81e12eca.npy +04090263-97a7a1f3c53b3c5ff9489a342636086b.npy +02871439-336fa11d8fe3dd2815dd7d7985e749c1.npy +02691156-d0456644386d9149ce593c35f70d3f.npy +04379243-573e85e0e02dec63c5a208307819a3a1.npy +04379243-56e46d8bbb70b17491829b477862aff6.npy +03593526-72cd871f8335f911fe9e40361c13f085.npy +03636649-1112f253e122dc8273111597f45b8227.npy +02992529-393ae1877a5e20478139dd63d55edc44.npy +03636649-8f2e03f91a970464ef3a2c64cef919d0.npy +02871439-c40828710c91001546c4f23965b7dd40.npy +03211117-af2f3c9c8fe90380c75516c7217fb218.npy +04379243-676d6d79d32de9cec3bd24f986301745.npy +03636649-7932b195e0e8ab00726dbbf7bc5e4df3.npy +03001627-f351b1725b288d8847df6165146d5bbd.npy +03001627-f551bf7431e0fd7cf937a9747c26991f.npy +02691156-7bad9d15c0f0d3c03554ccf8c30febe7.npy +03991062-a36d457e57b67ab4a2c59a4d90e63212.npy +02876657-2a3e0c1cd0e9076cddf5870150a75bc.npy +04530566-b04e4650e547e0509803291b0f4bf532.npy +04256520-9fada8462006e138efc579970fcfc006.npy +03636649-a1d09074c83bbe418ca4aeb5e3b33af7.npy +04256520-d0e419a11fd8f4bce589b08489d157d.npy +03636649-ec2d7e5e968c3ace7ddffb7902a68a13.npy +03636649-a6413f422f4ef630fecfeea7038369e1.npy +03797390-639a1f7d09d23ea37d70172a29ade99a.npy +03991062-3d3c8f95006cc061a2c59a4d90e63212.npy +04379243-12b7462856335e3d2404817055fb55cc.npy +03001627-ce33bf3ec6438e5bef662d1962a11f02.npy +03001627-3cc6485ab499244360b0434449421de1.npy +02808440-47e7884cf9d5331c1a448a935e94526d.npy +04379243-2091efe147f9ba11e3069fe10dd75c3c.npy +04090263-6f86a5fd7d3a52dad735fa1ab17311ec.npy +04379243-17d3e93e5f3bf2044671d97b0fd17f51.npy +03991062-e0725fd7859fa238ff67c12005f72d2.npy +02871439-34128cd8b8ddbbedd92903da5c4b5ef6.npy +02691156-28d719b73b1fcd2f5de04aad18bd94c3.npy +02828884-6e27b6fc7769089f4fb4dee5181bee.npy +03642806-dd3642b10fdf3550615ca789e669df24.npy +03001627-2ed17abd0ff67d4f71a782a4379556c7.npy +03211117-eab36391bd7fb745585e5281d7025178.npy +03001627-bd500b346c427b31f7628281ecb18112.npy +02747177-81a04a676ff96a94b93fc2b66c6b86b6.npy +02808440-1ea8a2646a0e33afcd2957531fcac5d6.npy +04379243-e98f06e93bcc237afebad4f49b26ec52.npy +04256520-1896f141f12a0df135836c728d324152.npy +03001627-a910a4447648af1a35133ba9028a8318.npy +02871439-303a84aa514f566883679e873099585.npy +04379243-ac9fae8af57729945eee45c00c4de9d3.npy +02808440-663963fc3b16a4fcfc9a8c335b5abeeb.npy +02958343-3c103561d9a29ae7ddacb20b6a591772.npy +04379243-66b56ba61af420e654a2b6b20aeaf693.npy +04379243-2da6752496e0c37961c55d3f6d7eeb14.npy +03001627-7144c29cc7038186d67fae5fccab266.npy +04379243-f86ad1699aa2da6dc955e5ed03ef3a2f.npy +03593526-e0855a7115eda487186588b1d2fb9823.npy +03593526-7def3eec9ddc24d7a1c637e821f12a67.npy +02876657-89b12196a1db5a74bb8058680b6b9460.npy +04379243-e751c765bfb096da43f06ece0b2b5196.npy +02691156-2e961e38a039f1bc67711f7c205c5b63.npy +03001627-2c4e9d34472b4bccc16f7010a3b8fdee.npy +03001627-7004f4eb1a5b4a41a5e3e028709e0474.npy +04530566-47c35e001ddd44bf1f2cd7f4ede43a74.npy +04090263-ac6d4b9549853b509a2ee232a197081e.npy +03325088-cf29a33f72258731b7a867e9b35a1295.npy +04256520-44854046021846f219fb4103277a6b93.npy +04090263-39b95d373f0ca2de80c2e60c312b0f09.npy +03636649-6ba931adfa36c7965208aab875b932bc.npy +02773838-766fe076d4cdef8cf0117851f0671fde.npy +03642806-34715b469341fd4ce4b68d3b17c43658.npy +03624134-8facbe9d9f4da233d15a5887ec2183c9.npy +03001627-4521ce028e5009811866a0bc19f46a1d.npy +03325088-14269c9440e416d6b7a867e9b35a1295.npy +03001627-65c7a3d8fb95311c492d9da2668ec34c.npy +04090263-c383dcc4c30c70b41a3b39b07e4b3d0f.npy +04090263-c224535cfe42b795a39dc4a567ce225f.npy +04379243-13c51c08c3695a09eda47978b73f5994.npy +02691156-351e24a503c49840cc0472b5df09bf08.npy +02871439-c41a98460321abd5968731dfb1dc1f13.npy +03642806-6f6c8762f55f94e24145b5f47fac09a5.npy +04379243-83f1ff21744e71ad2690c0a5b39562ad.npy +04530566-ead18d83024fab8deb2c303a0e0d287b.npy +02747177-c27682e5292ce95b7eee615e75bc3b77.npy +04090263-2300f57a06457c092235a9282623d937.npy +03001627-c983108db7fcfa3619fb4103277a6b93.npy +02924116-a8d7f2228ca5e0d944bbf36763afdb18.npy +02691156-fdb87fe46a2dd5ae148cecac5cfe1090.npy +03001627-7297ec6faebb50aa1f285be552b78f9a.npy +04090263-5870c596f2359677d3360026d8a2282d.npy +02958343-9a58eccb0ab51d2fa790ab932daff416.npy +03991062-1a85e0a1a4991a92a2c59a4d90e63212.npy +04379243-9fc9605f6ed5762553cc33364504d5.npy +03001627-5f5a3d412807984a27f9863535eba56c.npy +04379243-4c977a08c3969494d5883ca9b41ac387.npy +02958343-26eb9c499fe0ff9edc10f9c1726304b1.npy +04379243-6965b32c6732f5c0668ae11a7db5e82a.npy +03207941-b132e38eab307f2649ad049dc6857ad1.npy +04379243-a06c61dbd3a5f3a5b903ba10d2ec446.npy +03467517-15222c5926c7058cc6df7dab8e567ef6.npy +02828884-af5bec1a8ce2348663b2acb037dfbcde.npy +03636649-cb4f1fc93f5047e1ecd8a55986a51a84.npy +02871439-b1b511bda428926c180cff5124af98b1.npy +02691156-98b163efbbdf20c898dc7d57268f30d4.npy +04379243-338c59dd95a2e93362e5325f0ce7656f.npy +04379243-394e24e46063786ef7632814cbc80bf2.npy +03001627-cfbd835002da52be8f8c11a24c52ebb.npy +04379243-ac343084fcd0677bf78817f740055424.npy +04530566-2362039302d80f99f2c9de96bdb467eb.npy +04225987-e38a4e6fb32b51a1bebb1fbb949ea955.npy +02958343-eb5e956c2dbd44248bb11dbc05ffaa74.npy +02828884-19d52509d16a9c2c81faebbdea6bd9be.npy +04379243-e75138a7ea380470191dd4460a0b4ef0.npy +02924116-c198f659a9e0694890e260bfe14d0e5.npy +03691459-40169512586f3b6f77964cc933a9a0ba.npy +02691156-47bb2e8a53331a2f3554ccf8c30febe7.npy +02933112-4eb789e7b91d1c7374fd54817454ba03.npy +02691156-4008286f2fe8b6a97c44cd1ce3d402d0.npy +04256520-455fad12d4170e398d36ea78699efab5.npy +04379243-747dd84010a0c34d78c3eead10f81a63.npy +03467517-a0561f911b532556aeafd07a67347f0e.npy +04530566-a28a7d34ad5f006f959df312c935a698.npy +03001627-878eee28ccc28b2e4c7384dbb75cab0d.npy +03928116-6fd1d36339cd6ecebd90a01d51d28fe1.npy +03001627-eacc4fa00a65e56e374f33ec97ba7ca2.npy +03636649-42e6823a1ad23819182816640e3b1915.npy +02808440-353c2a6611d4f72d3321831d2245cf06.npy +03001627-f4e355f3c1acc9f01ec783b810d76c4a.npy +04379243-c359be2db828da29cfcb2cdfd88e07cb.npy +02880940-a29f53390194166665c638ab0bc6bc66.npy +02801938-87d80e10b71ebc1f7846915cc11caff4.npy +02880940-5563324c9902f243a2c59a4d90e63212.npy +04379243-9e3f1901ea14aca753315facdf531a34.npy +03636649-3781aa0aaed95b8049244b68aadec703.npy +02691156-eb2ac022b65f827e5e0925f0d15a8f74.npy +03636649-5f1dec078cee0f78c580fdeb5460f6d6.npy +02691156-79f0a9d3d78764ec19ef6dae2862f036.npy +02828884-5bccce74947b32e38a92622cf31f5cb9.npy +02933112-5e61fc6946ed74c3532e8683617554c4.npy +03001627-6d63b89b904264a15fc64c97c5117aac.npy +02747177-95c5a762fc8624859d7f638b2b2e0564.npy +04379243-74c14e9a4ac91242388406859b1b0545.npy +04256520-a7b07dd40ee6af36747bd07ee1e3f697.npy +04256520-6f48fa0ce33292249ac506757b31ba4.npy +03085013-d0885b3f14be8fbe2070d983a046060.npy +02691156-ddd6c2a51c25036c8a43cd65b179a1ff.npy +04379243-ba212f7bfeb2faa75e05d85b12fbe60c.npy +03948459-9cf4051dae7a46ed77b7d0d4764c121d.npy +02808440-d4d61ab0356aa6d0b362845c6edb57fc.npy +02691156-a2c2ad021c80f08c973e06016b069172.npy +03467517-6cdeed314f07b7a8244cb06b21c0ad9a.npy +04256520-6bb62bdd954cfa07e30cb284f2e8e5bf.npy +04379243-91b12d3af7bc52c5550384fc1c3c3d02.npy +02691156-b34526d94a00ab55f5a25dd70eb863e0.npy +04379243-90494fe31b3db5f927eacc88b2b78746.npy +02924116-64998426e6d48ae358dbdf2b5c6acfca.npy +04530566-b8905c60432aadddb4a8f569bbe9f7c5.npy +02828884-e0ecbe3b106f94dbd2b12aa6a0f050b3.npy +02747177-663082bdb695ea9ccb2a965e75be701c.npy +04090263-56737c6d611f2a8465a6407cecfc902e.npy +03001627-4372b33dfc84c2f56a9ab6fc87e1604e.npy +04379243-6e81c795bb5f2fdaadb72b90b2eeacbb.npy +02958343-9e1e61f67c4a41e09783918b4b55c30a.npy +03636649-2768a3ebfde6410dcdfc3ede082b8a07.npy +02992529-db4c6fcc45cdee08d8dc338f42ea38e9.npy +03325088-d3c3cf0cb64bb51a208dc8b344513a31.npy +03991062-24eb0442669efd9b64558a1c6a2a9f11.npy +04468005-1c05fbffc0d5e60734813c288b6689c7.npy +03467517-919859cf5b204b917ccaebc549d343e1.npy +02958343-d894c407d7fcca0d36294458115cf41c.npy +02828884-894f41b8e4e3231601104cd2d998272.npy +03001627-2fa2acd39067ee788f6e9f07be105c48.npy +02924116-9193a78ba7f6d4108d4003a408ee4006.npy +03790512-2d50553277d64ebda513de4eb79b310d.npy +03467517-ac8b94c2d527dbc47f9cbe01d169e4c.npy +04379243-84f0b08cc2d6747b593ebeeedbff73b.npy +04379243-ed50f2409be0ad022b6168eeac2194de.npy +02946921-fac6341f9e5bfddaf5aaab5ed17143d6.npy +02933112-70ef5ad531624a24cb87a43f8f346ada.npy +02933112-6754e64c37f7318c824662341ce2b233.npy +03325088-f1599feb586c4998321d8e522c85e4ef.npy +04256520-d7bd0812487f786b19c5fea91449201.npy +02691156-f12b45a38f012a78ac4f72bf08dc79a6.npy +04379243-388ea3f8ba27da8b777b6246417c94ff.npy +04090263-f74ef838b3d8388b03509f6d3647539.npy +04256520-54cdb325265e343619fb4103277a6b93.npy +04379243-ea5e7b13d0eda809663191fd557d3a61.npy +02876657-5ad47181a9026fc728cc22dce7529b69.npy +02924116-8c71abeb4ecd7db5e78f6c4122b203e7.npy +02747177-755d669a95bc00c3ad5067eac75a07f7.npy +03001627-6169073a194742c5a7de7deb16b90a60.npy +04379243-e20c8cc35a498acc2ba308912365bc23.npy +02958343-18d2959d79af059e476502dcb0dc5465.npy +02828884-f1102a11687f3451f4fb4dee5181bee.npy +03337140-720fc26810e5755b2846fa729d90e125.npy +03636649-d217e8ab61670bbb433009863c91a425.npy +02691156-764894168678b36efc1619e612ccfb0b.npy +04090263-45e88d85974b540732624d0392494ea2.npy +02828884-5d463e4412600a3213afadfff198a630.npy +03046257-d545c16fd540a91127a97d6c875f5b81.npy +02828884-4a3feda042d94e85319eead4390b3fcf.npy +02808440-c6bdaf60ca0529cdf06b5a8163839b92.npy +04256520-f57c0d39936a324371a782a4379556c7.npy +03001627-20ead42180f1ba43ec7d59bee49bd15.npy +04379243-ba2ed19060724207508ab97c29985b12.npy +03001627-4b9ccf80a846432095bea7c29e873d16.npy +04256520-b6305089d351329681dff5c2e57ad46e.npy +03261776-4beb536ea2909f40713decb1a0563b12.npy +03636649-fe4ca0ab385784d8df6cfab91d65bb91.npy +02691156-17c2d3e052dfe73f9cc1fc25372199f.npy +04468005-f17a4c908714b29dd85b408a8edc983b.npy +02958343-e27019b4147f868dbda733a39f84326d.npy +04379243-2a796094f95904e9c6193dcce7cff00c.npy +02691156-b2235fbc13fc2ae0bbf3143b1cb6076a.npy +03624134-3abac859bebd4d8c63a4dab86bd84521.npy +03325088-140f3e225b12062f3321831d2245cf06.npy +03467517-39eaab6f38e942df5217e44802ac5173.npy +03001627-e57aa2d477a818ed2af6ec758865822.npy +02933112-d7e4b6d1d9ae4336ef4e42d70375aed8.npy +03001627-fff29a99be0df71455a52e01ade8eb6a.npy +02691156-98dd57d068c8de064c3a35cee92bb95b.npy +04090263-9f42f31d3b81ef232d07d103eb3a7540.npy +03325088-aee1330150624d22ef4cb84a0218bebe.npy +04379243-9fc50a184e6d86a9b3fdb1a7c9a60207.npy +04379243-fc472163ea149f8e19fb4103277a6b93.npy +02691156-d47207e14e61db3f1436d436f198567c.npy +04379243-16febbf5498604acfb666b203f8cdb86.npy +02691156-7274be512ba47d837678474be485ca.npy +04530566-7a4fb637dc511c19b1bb46d2556ba67d.npy +02933112-1222c37fc0c37124824662341ce2b233.npy +03642806-53bdcb3c0b28a51b580ee4476b0b0ff.npy +04379243-b40b97894f2c750bdbf8817a0e330a74.npy +02958343-1dbb24dedcb23beab1bb46d2556ba67d.npy +03211117-4d11b3c781f36fb3675041302508f0e1.npy +03636649-5128cdc2e7001b0fd8740cddcdf4464c.npy +03046257-c07b92d1d7930faab594bbf2c494ab81.npy +02828884-e0cefe05e1244097b51974a280a6461.npy +02691156-600f970e5d1032dda4642ec4b6f68a.npy +04379243-ed6dcbd0d670784537a0eda928b574d2.npy +04256520-d8a60e70bde76669e484a3178a372c3.npy +02992529-fa3f5a6c21c56ef7e85fd905d1f6c116.npy +03211117-db13ba7f1da5dace4ad2635b7d12d09e.npy +02933112-2c177b47d18940c735b355b56bb31701.npy +02933112-1d442f753e2d7d3cb90e13b20a8dfddb.npy +04379243-8a09f540491889f519fb4103277a6b93.npy +04468005-5f83375dc5b07b4852470de2774d6099.npy +02691156-443be81bfa6e5b5ef6babb7d9ead7011.npy +02808440-cb6e3dea697f87e55f0ba4cbc0133dcb.npy +03001627-9adb6a665f99addc8a4fd70ea4c8b4d9.npy +03001627-bbd6bde216a2c18479368d1198f406e7.npy +03001627-3b88922c44e2311519fb4103277a6b93.npy +04379243-519d1f0e03a9fbefaf794c3011d17461.npy +02818832-845942aee9bee62b9f2349486c570dd4.npy +02958343-82ede85c805bd5a85af609a73d2c2947.npy +04090263-ccf8ce0be2e03076a49c146495d6b4d5.npy +02924116-25387eb43f6f58774e08fc4ea39c13e7.npy +02924116-e2c4d25593f1173cfa13d53e5e4a7d2a.npy +02933112-18f41e91af76c77de25f00a04866d020.npy +02691156-cef4d41c07613b658168857903a9552b.npy +04379243-114d59f2e865eee630bbd4cddd04c77b.npy +03636649-1f115309bcbcbc5326010ae5c9a5e78f.npy +03691459-cf0da3cd69392999da2140846c49e200.npy +04379243-7dd881a26eea656d193afeeca14e3baa.npy +02808440-19da369ff1db9ecd670204dee97dc037.npy +02933112-2cd30f8ab084d274391fb969ff1ec5ce.npy +04379243-12df5c215f4364b7fe388cf6c4c3705d.npy +04379243-ae4507fa0f4c936a31055213877993a3.npy +03938244-fce7f95d023ac364402d272d6d981f21.npy +04401088-4f3c487c54ca29f2439292e4b8fd557e.npy +02958343-ffe0a5b165461eb66a2345809e2bb169.npy +03001627-baf3304f1352fae41c6aa36e5af1449.npy +02924116-896df439c9dd99914afbd069dad74ced.npy +02691156-d6bf9fb6149faabe36f3a2343a8221f2.npy +03593526-d56098d4d83f5976a2c59a4d90e63212.npy +02958343-a63ae43440751ef444221994b043fd86.npy +03636649-181d2b693d7ab89457a48b78ff77644d.npy +04379243-20bf71868949fba4b445ec1f6a39e0b8.npy +04530566-110acfe04edbd526969f70ba15f2ef4f.npy +04379243-95656a46c15d75592d1c552a8c88e58c.npy +04379243-b1dcc70ae478e417664b3b9b23ddfcbc.npy +03948459-e3f45b75b688bf33794921644e32aee6.npy +02747177-b1625cc91f9355fead5067eac75a07f7.npy +03636649-fb4043f7fb8257d8578d107c71db28ac.npy +02992529-c3c5fd4ce226ab0c4694b8455e89054.npy +04468005-f1497874764c9d964f57a4cae005e56a.npy +04379243-7683778558cc36163fb0920a55a7e805.npy +03325088-dfbd28a1b03b488950da8b99982a3057.npy +03691459-dd2a4c416625f29c4f57a7ededfb3bde.npy +03593526-3b5397782a5a1145fdbe2bf897d8a820.npy +02691156-7a3da3c75d98e44d7d64cad20089f027.npy +03001627-b5a741e11438fb83d155b73c25b81001.npy +03467517-51abcb617b2faf3a24eeca91f583600.npy +03797390-f1e439307b834015770a0ff1161fa15a.npy +04379243-a0745770bc3d12477b11ae648ea92233.npy +03001627-4217f2ce7ecc286689c81af3a850d0ca.npy +02933112-906d4fb94d86c4f0f0c255b2dfb0a92a.npy +02992529-6456bafbb5a656fc487f00a15f77c99.npy +02933112-2988d5b3d61d80c276555d27f71ae823.npy +04401088-7bd9b1b1297013ed65f78a217bb320fd.npy +02958343-65d6433043c40046b82c0841410a924f.npy +04379243-9bb646155fe7afd84e55f99914fbe961.npy +03928116-d26149f3d01ffb4d9ff9560d055ab12.npy +02828884-c32504d950d54881c3331c70c9cf7624.npy +04379243-44ee5a33ebe173c4d28a525d8260e58.npy +02958343-706083fa2a8c2b50bc97decb713a2619.npy +04256520-7d756e083f671c091b17743c18fb63dc.npy +03761084-16a1355b8749dcda33f93820d08ac745.npy +04379243-ab76021d53504f38f51f77a6d7299806.npy +03467517-6c3cabefe5c12e5a972e15b580d9a5b3.npy +02992529-ef2472e661320b03e324fbf60278e45a.npy +02958343-5da4c0cd066b7d0889d347432ecb438c.npy +04379243-7c42d9809322b3993002761e7a3ba3bd.npy +02958343-5d6160c6e87be84631d01cb0ca6cb2e2.npy +04379243-25b6b28e3b70be1c5a6be9e325f087ce.npy +03467517-5cfe03b0754039625afc17996a7c83c5.npy +02958343-43553b5efc2674cee4b68d3b17c43658.npy +04256520-c8caf9f60c19157414038d588fd1342f.npy +02691156-9d06f4ff9f1e7932941d71475449eb25.npy +04256520-7e9f11492f1db0e5e81fe3f8835bb5ff.npy +04379243-4d393b562df7cfad9a16b095d67f7209.npy +03001627-3b3a9f4e3aa9f2f4d39a194653571dfc.npy +02933112-973023bbf9c6a603c59350d819542ec7.npy +03211117-31f688edc350505191cb6690cc7eb18e.npy +04379243-93e81005c19a74b8664b3b9b23ddfcbc.npy +02808440-d970177e3a932dc344221bef0fa3c36b.npy +02818832-cea6fe3942aad10f529a225c2959bf7d.npy +02958343-c00e0066715c2226921cb81cb1632a5e.npy +04090263-fffbe09e4890f8f36314c3b6a3a65519.npy +04379243-e7e0942dddd1e709cc963bba1556032a.npy +02818832-9f7809b9eb2745895b142bfdf8ccf55d.npy +04379243-4fe648810cf1b4b5f4ae8c93f4db5e6.npy +02691156-69f1d9c3987d429e5e9e2656aff7dd5b.npy +02828884-8fe23a363bf80c48f155d75bbf62b80.npy +04379243-8b07d458499d63f36d96c6cb347d6a90.npy +03467517-7cf22bda34c2419de943333e8b45c296.npy +03001627-38141adb391a039ff3c330baa382ded9.npy +02828884-2b6ac3eb1232e99b3cf1509e0eed7683.npy +03001627-6cf3b41688dfc4b4707cdefe012d0353.npy +04379243-2c7817c16702e57188e7efbf7ff736b7.npy +02808440-b906bf01b0f9949044221bef0fa3c36b.npy +04379243-39f03b3ec91103af33367a1c9ac6c143.npy +02954340-e7e61ccc69e18440a52821bf1aa3b19a.npy +02992529-f4eda7905f55d1b382476058422e4a4d.npy +02992529-ab3ebae8a44e1ae8ca47cd18decbac61.npy +02828884-7d67ed4517c1d702ed98cca8f0ccd5f7.npy +03636649-aad04909cf72df68bd038489dd82490c.npy +03001627-963452f2fc2a74f62a3f8f484e6c5c4f.npy +04379243-3bbaad82416c897d82d19a07de9030f1.npy +04379243-da90bb35949fb45ac3bd24f986301745.npy +04090263-902ca61bd1f216f32511f68da65f4c4.npy +03211117-817aa43250590b38b3425db9d50d5dff.npy +03624134-895a4c3fd403f9c63edea20a1d0ddb66.npy +04256520-3abafff866f9319d19763227d95ac592.npy +03001627-a339a318c8a40fd4eebb133aa4be217e.npy +03001627-310c65506936cc5bbe5e5822eaa1366c.npy +03001627-64eb6d8212acb69fa094848ea4d06501.npy +02924116-e3d35f5a569095e182dd3c4188947bc.npy +04379243-bc1ff7fc750617d690f7bef12e52ac08.npy +04256520-fd2596a60338b08b318694f1cc6fb1f8.npy +03046257-9bd39bf4d0072abacda14cd39ae8c7f.npy +04256520-7d019d0342f8a70f3bec56bff764ba78.npy +02828884-84d8530355cafc8fd838ae16242881dc.npy +04379243-c43868d3e8ed646f4510596cb4be6a33.npy +03001627-dff768695c3013aaee3907b60a74e8f8.npy +02992529-638695025ca04d351d57a73214dd2a04.npy +02828884-218b98805019ba7df11e0e33e4b1b85c.npy +02773838-71ead7f072106c63ed13f430b2941481.npy +02691156-a99ffd1b1fd121bcf2b0736dd4d8afe0.npy +02828884-d8fe288f137ccddc1c57d18f89ad9dc3.npy +02958343-517dd2b0fc2aa4ea8f01fef4e6f571a0.npy +04256520-4a463efb8baf30e42d19175e7d19b7cb.npy +04256520-735122a1019fd6529dac46bde4c69ef2.npy +03948459-e1c06a263876db5528881fe8c24c5c4b.npy +04379243-f41ead4917ec05a149524cfd5973a145.npy +04460130-1f1f62c52fe4d27946fb3db517d0dfc0.npy +02808440-40b85440de55df08b05d6ed777b5533.npy +04379243-452d4d4dd64dbd32d12d3a3073d6ef09.npy +03691459-83dea2f2561fc2fbe9364d19fabb5f00.npy +02691156-18e6f319062ccb49ca8607f540cc62ba.npy +04379243-da745fe2b26f5d9b9ccce4c6d5bb195f.npy +03991062-6dbdd4270e16cb9425ebd1cd0b422e32.npy +02691156-89e0a038b52184e04f856435f28995af.npy +03001627-6cfe2f5ab1bb89022edea1c2bfa3bc56.npy +02691156-ca8c65b83038dddb17486544d154bb2.npy +03001627-ce387113cca9c0754d33a7fd9c37a7d2.npy +02828884-2eea9c22b37967006e40121acd58a004.npy +04256520-91cace4fc498690119f778c7a8b12264.npy +03593526-afce514f25812205c9f016d57db96408.npy +04256520-e42f4a13086f847be55735bbf02fe10b.npy +04379243-a53650752c2d73ce83eca490ad2084.npy +03001627-1007e20d5e811b308351982a6e40cf41.npy +02958343-732606e13ef11f465acf55f30acc008d.npy +03001627-88e514e71b48738bb022c94235bc8601.npy +04004475-2e42dc81abb41b06d483b3bba3d3c62.npy +02828884-f5e4f9657ecc18efc862eec8232fff1e.npy +02828884-784e9add253365c15a7771962bfe7829.npy +04530566-fcb10d77160ccc67dfaef96860d73193.npy +03001627-8f1e882bdc10f54955f46d55537192b6.npy +02691156-aad1733e7bc7152bcc14f1e6f4f4f49b.npy +03691459-b49306bfdc0d238076247c6336e7c242.npy +04379243-121ae3ce921a1e43ef40aa033482abea.npy +03642806-9785a579ea791039c639c533e8b5aec1.npy +03593526-54ae704d4eee561bd93768e7b9b1eabf.npy +03001627-ef1824754ae554af83b6e0255ae357be.npy +03948459-1171db047e43948b40aa5b072f9ee3d1.npy +04468005-6a26d2eaaf63d2a7b2faf16541f353f5.npy +02924116-58a477292dbfae96f2b46e2da97eabda.npy +04225987-e421c23a2c02cac61082f2ea630bf69e.npy +03211117-d89d1059b23e8c60edd8d267b4d8ab38.npy +02924116-8b44e35b773cd888bc7f39bf011e847f.npy +04468005-7f31a5c189a4c95d93cdde2be60b3ee4.npy +04530566-ba3eaddcf1a2e829fb64f9487ce62dd2.npy +04379243-8acbca7ddfd03dc85d009c98a5b96836.npy +03046257-e905eb10294464464b3c42e318f3affc.npy +02958343-37f9b2735bc9e80eeebdc06b146e1752.npy +02691156-83dd9dd45724d5fbbeb310a83b693887.npy +04090263-60c856b141ec1e75a5bed5eda256483c.npy +02828884-b7fd9faa8c78806da9bd18a6c1eb0c1f.npy +02747177-544bb6c9c8ff5ebd6c63a10c02702cfc.npy +03001627-30378faa6bf5b245fdef1c01cbd4ae0c.npy +03636649-b8c87ad9d4930983a8d82fc8a3e54728.npy +02828884-8f64075972a1f7f3dc18af6f6bfce3ef.npy +04530566-14b8bed0391dfe1dfa808b0b90ff6379.npy +03636649-f10af3d00a4c3e89f51f77a6d7299806.npy +02691156-723c87de224355b69878ac4a791083c5.npy +04530566-df63e149e706e3741556f795d265590.npy +02958343-ccdd144f89a78f5c554ecfc23d9fc570.npy +02828884-6bc471eb8f212c9317b431cae0dd70ed.npy +02818832-d2e248e53274bcd5ec223fd6ddc5969b.npy +02691156-3fe8243b660d5e8fbc0909d98a1ff2b4.npy +04379243-9140c6a8599f28fbf27a87e2aac4fd31.npy +04379243-9ae7f60bc9e20008533841f5cdbf3b2.npy +03948459-2987ca2166327746fcfb3ae2df2f7efd.npy +04379243-c65ab1fc77cfeb37f7c07d2e56f26a5a.npy +03642806-d122ecd3c34e87eaf76120a09d6a0db.npy +03467517-ef87e50f18f1407693f0194265a9746c.npy +03928116-6142342e876a0f6f4b695ac31691771f.npy +04460130-9e72b97a5af45ded7c272b953086dacf.npy +04090263-4f4cc3462f0e9dccf13eed41b64dddca.npy +04256520-7162718ec5f39640701dd519cbbba0c4.npy +04379243-53e06d7506fa12f93fc9a2b2d10317e7.npy +03001627-5822ae77b06bea3091da37ff8bdd2524.npy +03001627-41aa5dba48b7a3f683257865d0a50551.npy +04530566-a13e0728cbc8a41594ebaf95f022dfde.npy +04401088-f400eb5421283e8a102f4912aece242b.npy +02828884-10bb5f29a8654f22ad5067eac75a07f7.npy +02691156-43c5f85e9a10071cb1bb46d2556ba67d.npy +03636649-5859f1dcc6e47322e7c7920f6a65a54d.npy +02818832-f7d2cf0ebbf5453531cd8798c40e5949.npy +03001627-b631b78c2dcc748cba5342d638d0c267.npy +03001627-562b11f6f1fe56ce586a8827cb5b82bf.npy +03001627-29876b641047897f9bbef973cc1034f9.npy +02828884-e70d19625546502bed98cca8f0ccd5f7.npy +02828884-38e54a16698453baad5067eac75a07f7.npy +03001627-e8829b6a1601c109bebd676e3a69dcf6.npy +03001627-96bccddaf0034be04e5cf15b26e670ad.npy +03001627-eb29a065b495dffc85528d560ddea455.npy +04460130-de24d2498ff052c3fe10598e9bcc69e4.npy +04379243-dc0e4a9d3bb0397d5e994da5ba753c34.npy +04379243-bdf99b327d1079fb35836c728d324152.npy +04379243-204d9ecc196990ebe8479ad2eabcbab4.npy +03691459-d7233f2190432638d747b49524a1246e.npy +03211117-397644e58faef380e441f5bb6f88ca61.npy +03636649-eb37d11948d7b4ffe030fd2fa0608452.npy +04099429-2407c2684ee757e89c4176ab56cb612.npy +03467517-1f08ecadd3cb407dcf45555a18e7351a.npy +02691156-fd95b99d4699430a7395d58407f193ba.npy +02828884-7e029f73e9cd98d2f155d75bbf62b80.npy +02691156-caf92880cf63690188a7f6dddc29eab.npy +03691459-7b08e64e66cfe5d473c609379da5b9c2.npy +03046257-c34e4038969908b6daaccab222ac90bc.npy +02924116-e24cde6d0dd917c8a49d11719fd4710a.npy +03001627-d73e46e07bdb3fe75fe4ecea39e8bd40.npy +02871439-e6f306e6f391ace7b035d20a1a3ca345.npy +04379243-c0fb01629cdba5ade6c5cd45aa112726.npy +02958343-5410d4faab53ce49e9d8921ebe6d5b8e.npy +03991062-fa9e6aa9d67d5329e5c3c7284848bbfe.npy +04090263-d8e7f4c92af18cf2892fde398a8eab7b.npy +03001627-cc03a89a98cd2660c423490470c47d79.npy +04401088-d7c350e5d29074c9b4c216fa1de7d5a1.npy +03948459-d81bac8b449807bab7b81b671e901c39.npy +02691156-1d663e36e305fa8e2178120752ee7a07.npy +02958343-3ed25ebb78e48a84ca92a4cdad802b45.npy +02691156-16ef481509c64f845dcf422dd1ee66d9.npy +02691156-6cf339eb8c950ac5d556fc099c90ab45.npy +02691156-d581b2e10f8bc6aecc1d733a19631a1.npy +02992529-987662da7f345b272b1c9d869bc37167.npy +04379243-a0a17ed0d2367f433c40408002fc3026.npy +02924116-1984914daabaaa44afb5b09d8f4dd829.npy +04379243-25b9dbd6cab8f22c37a346dba83c013b.npy +04256520-7b5b2e699dbab90d1ead5d83d8c2f7da.npy +02933112-768564ef92377d886549bee1ee0ae3d0.npy +02958343-2180046932174984a10cf495b6dc4ef.npy +04379243-e731318d8d28bd585913832d290e62af.npy +02691156-995d06b3afb755eef446f92b52bbd82a.npy +04256520-6923a7384068b631d8e0f7676099972b.npy +02992529-7bf76e92b684d32671ab0d8014490a7d.npy +04256520-9156988a1a8645e727eb00c151c6f711.npy +03001627-8c2e0684a98bd4f82553cc33364504d5.npy +04379243-a5475eec7a98a02671a70be9f12ce8b0.npy +02933112-78d36740730c94a4490ad276cd2af3a4.npy +02958343-5822af4cda46d8c2f952aa5aa5267659.npy +03642806-129237ff9e4f5d5c95b5eddcdeed8f43.npy +04401088-eed72e5bc3dc4e85150c05906b260c9e.npy +04330267-5609319914f7d84a14ea9baefd0742a5.npy +04256520-30ed3ecec491408f7ea607586f414f8a.npy +03001627-58ad100d70e436bece93f2bb0b6d036.npy +03337140-94507a5e4ec17da4c3aee8e9d3a6ffa.npy +03001627-32e6139951627142a087337e55e3e2e.npy +02828884-79f02eae8c5b417d756b36dbe53a2798.npy +03211117-d58e51e184fcc1a2fc30525e763ef5eb.npy +03636649-eca8e4d9645271fa37b2bb75885cfc44.npy +04256520-3fdf33059301e1d248fda83c10428379.npy +03691459-9376e8048ae8b34ea35fdda2e8d5933f.npy +04090263-f5a9d847f69449626f07a69f0bbe0f4.npy +02828884-c2b18cadd355a5f18aaae3d020f5ddf8.npy +03636649-2b79c0ed9fc840e7e64208ea01814e71.npy +04379243-5b5fe86aa8e93f91c3bd24f986301745.npy +04530566-2e6a74a610868d5be1e91cfa8fea7dba.npy +02924116-437de36c15c08707294f9f1b885d961a.npy +02691156-1286826ff37699a1a0d713eb26379316.npy +02691156-2628b6cfcf1a53465569af4484881d20.npy +04379243-598e49637250f85d58df8eeaf3dad1c.npy +02691156-17e66cd463ff0de126360e1e29a956c7.npy +04379243-1d53223952ac93dc3bd24f986301745.npy +03325088-37f385f455809ae4b3ab5a380856c75c.npy +04256520-8a1a39223639f16e833c6c72c4b62a4d.npy +03691459-b56efe51e12dfcd72c730e00f4721fb5.npy +03211117-f4955005fc3fa1bb64b3cbf502645c74.npy +03001627-41ce60d5443c203eb31c248b8665b2e7.npy +03691459-28c30025290a56a689296e9c8a412e3b.npy +04379243-5ca423c2f3d176f94c5c5c89015f1980.npy +04530566-f72222b43e40e7e84cd259bd328e92a.npy +04379243-c5e37e895124731176e9713f57a5fcb6.npy +04379243-adfef21c37071016b4c161851ed2b4e4.npy +02992529-205b1494d7d3448e21844676433a0aca.npy +03467517-2eba922263fc1580cc010a80df5d3c87.npy +02808440-4e77f04af9f378fd6bae7522bd91c859.npy +02691156-8d5c3d38de9c3685f2e77d54f4da142.npy +03710193-242bb92902054a0142b99c0f2f4f9b4b.npy +04379243-245a4070c930aaae71e2498adb56e791.npy +03759954-c0aaca906293380f1242824b4827fe77.npy +02828884-87c34f2d5d53a51768679c90b064f491.npy +04379243-eba66ca2e46521ecb16ea05e48de73ee.npy +04379243-74a73d264fb01b188ad2a89943bab6f3.npy +02958343-f4532b1f55191eb7b9ad5039d820c924.npy +02691156-5fb64e3fc0abe449ca8607f540cc62ba.npy +04379243-5b349df34184e7fc2ad490d4d7fae486.npy +04530566-a5a16ec8ebc811f1aff407511d7dfc96.npy +02691156-f214cf57d5d5634960e1e93111ad3e76.npy +03001627-99848304f52de660a26aea0642029fc.npy +04554684-2e9e2ff2b757fcbc23a5a908e4c7c27c.npy +03337140-efee783f896e804791c352d02061b3f7.npy +04256520-c46a4ee98bad8264925bc492489de9c.npy +02958343-18da5e80080352be294d52e32dbd135b.npy +03001627-b83bebb013e4ddcabd1aeba6ff85928a.npy +03691459-fb2755146e61262fd50505ee01b106d8.npy +03001627-781677297ef4db1ab0b54dd2cf2a35d4.npy +03001627-a12d6ad9561fd39bca2bec46a3b47519.npy +04379243-3ec4be6e96bfc2512b5fb024f65f6da.npy +03001627-e1ca70ecc629eb46ca17c984d94453b4.npy +03991062-aa2c5cf4461fc4f8ee66deb6ff51e301.npy +03001627-71539c627eda703490ad276cd2af3a4.npy +03467517-ba597e1578fdd381bdb7b8a99c2de3d8.npy +04379243-f22cffb7f3ca2ea1d719cc16de395dac.npy +03001627-ffed7e95160f8edcdea0b1aceafe4876.npy +03001627-371ebb9ac02ecfd09710e093c764abec.npy +02876657-20c5dff3b09282035b76194468418a0e.npy +03001627-928678562a6a57db698a862d11861eaa.npy +02958343-835d8e35119c714bfdb3ae79bdfd4e2b.npy +02958343-4d39e6f28ce8970530515cb6d98a6c44.npy +02876657-3d8444d8717cc0b7c18cdaa4851a3c95.npy +04379243-46dababb078a797011ea7f12f22c0e84.npy +03642806-72fb4ce0b33310b4d852aca19c37edcb.npy +04090263-c391adc028f6a3df9a6e43b878d5b335.npy +04468005-409108700a3135159854ff9122ad4a0b.npy +04256520-81bb52e7a83d1b3e9c75eb4326997fae.npy +02843684-be167ea4f0718058b4501871f1444d0b.npy +04379243-198ff59a42a147eb8ac5948d70801389.npy +03991062-2392637006a99646d93e521f7fd48fb.npy +02876657-621e786d6343d3aa2c96718b14a4add9.npy +03691459-b638ef590025961f5adfd0d9df77c16d.npy +03691459-21e46ca2f8bbd4df71187cb9cc8e1a.npy +03001627-b467cd6baaaf5bf282db9fca4b68095.npy +02958343-301d1c48d321d29f5d2921c9c16f3c69.npy +04401088-df768d07fc99eb30142bee3d28727203.npy +02828884-b8407ab7eeda1d261be4769a83930a08.npy +02933112-50c7e5dace1d5dffc6256085755e32ef.npy +04379243-7df8028783ecc6ba6d5fdff4a5ada0ca.npy +03001627-f3a24b3131da1ce619fb4103277a6b93.npy +03001627-7824e41c86f9be776383f517a315e69e.npy +04468005-2349848a40065e9f47367565b9fdaec5.npy +03001627-934d183065b149d784e40fd1beec9c4.npy +02958343-8e9f7699e30cdd8c247a5be450795511.npy +03691459-f1d170b03b23a3139cdd3031da0f98f5.npy +04530566-f2db3a2fa09b459a91001ec6a6afb362.npy +03636649-475a3d88004052918a6353ea60f11b6.npy +04401088-3488722618d61cacd5b6fb666fe071d7.npy +04004475-c7a99991ddc26427c22cdcb8852569c6.npy +03001627-51c276e96ac4c04ebe67d9b32c3ddf8.npy +02691156-5c10e37453733ddb46d83d16be057f3e.npy +02876657-5470f2c11fd647a7c5af224a021be7c5.npy +04379243-105b9a03ddfaf5c5e7828dbf1991f6a4.npy +04379243-8e28f1259c6572b86cdcd27a8d5231b7.npy +04379243-e4b2faf6b123b90286603115d2739530.npy +03001627-d7c9ad0bb877b0796c9d2c8251e6074b.npy +03337140-879c6614916fb6907812c3baf25c5bb.npy +02808440-77e0932f0886aede3321831d2245cf06.npy +03467517-d0f1b3ecae66a027b45664be560bdedc.npy +04379243-6c0bc03812d3209fcffd61677456447e.npy +04379243-e1e7caa05e80e973308c1120d480c5b8.npy +02876657-f83c3b75f637241aebe67d9b32c3ddf8.npy +02958343-d6f754f7ccb42b194fc7cbcbd24e4ddd.npy +03636649-5c79a2bc3d2ca6b1df8d3317f6046bb8.npy +02876657-991d9df5bf2a33a1c9292f26f73f6538.npy +03642806-de9a39e8ef9c313bbba0ffaa383992dc.npy +02828884-f13e44c93bca57d092f4c88fd91c6b1b.npy +04379243-69c536d9e450cb79436e6787c76ef3f0.npy +04401088-8aa05d2bb435ab441ac3fdfdb76cf4dc.npy +03624134-4611d319dfdd29b52ee0f9a97b71d505.npy +03467517-5ed038fc12ed2fdc34003ec0e4a84348.npy +02691156-886942791e830bf1d32b1717fde97410.npy +04379243-f6ef4614e853eea9de712e1694f0a344.npy +02691156-89836a37ce10a26c8699933784576e73.npy +03636649-66111d2c7a23b0feb404555b84577afb.npy +04379243-f9ac7801460434b271140e10b6211a6a.npy +03001627-26f798f908ef2908c7660a81296c2300.npy +03001627-1093d35c2ac73bb74ca84d60642ec7e8.npy +03636649-896abd405c79547086485c798787f66b.npy +03001627-5c52a6b471eb82b64ccf4672ec1e7efc.npy +03001627-f9b462997cb333dc7fbc060fd555478.npy +02992529-9b608bcc7e62c3e2dbe1e810cdc7471d.npy +02992529-e4a8822c5faa386fa9976d676758bbee.npy +02880940-8bb057d18e2fcc4779368d1198f406e7.npy +03046257-10a200395145c61aea2f5d52559debc.npy +03085013-4ed5011d30d0bad8654d740782c268f3.npy +03001627-cf09618aedde38febda72093f9b5aa73.npy +04090263-20ba04acfb3a2df63fa974f1d1a1ac62.npy +04090263-5b466dcb5113a0704aef47a2c7bc343b.npy +02958343-ba89184f58f21ff63343f5fadc4a2136.npy +02871439-908c0b3c235a81c08998b3b64a143d42.npy +03991062-f8e09cb026b47fddd7f470ee20dce9e0.npy +03001627-8fbf9ce2c9cb77bd9cb48411c757aef6.npy +02691156-e5610bbacaf098508b96ae1a0a8b84ec.npy +02691156-7c67e8cce3f3eb3c89ba278a735b3c5a.npy +03642806-afa49e97861c45e5e738f481f8560d58.npy +02958343-86ab1c2ea989fda9ab15905beabd3f20.npy +02691156-b522108c4c08430a71d03b466c72ce41.npy +03636649-8d61e7c8fc9d989d1f30b807ae39b61d.npy +04379243-cd762ebd8c8ab61361a38c5058945a3a.npy +02958343-872e01a1c34494b737fd267fe4b3a5ee.npy +02958343-18c06b8c38623c0b4046e8fe9dfc34b5.npy +02691156-f0065f4f9e20d604521546825315c695.npy +03691459-548f94cd0c5fba501148996e35417db6.npy +04256520-7fd704652332a45b2ce025aebfea84a4.npy +03001627-383b4dbf090a73dd597eda2e51f31317.npy +04379243-d8f851bbc98dccc23fa92d98173c06f.npy +04379243-6aaa78b81528f4846674ff79eed6185a.npy +02691156-c156719444d78942db73445864b72015.npy +02808440-8fe4014c96a06f2a57ed847bfc43a483.npy +02924116-a67672775a7fb69a973f659238edf3c3.npy +04401088-9b74db2ebc90ae4789905122ac8b41f3.npy +04530566-9c3810b8bc98c59426fa791c6af15500.npy +04379243-5bcb0976657fe6df37b2bb75885cfc44.npy +04256520-2b5d99fd8dbdb44141cf86c757faf4f9.npy +04256520-4a910d2734c9cffb44949d7685cb63ea.npy +02958343-74f396cff021c1d2651e8da9cf70afea.npy +02933112-321eb85037156544799b0b9a0d4a12cf.npy +04090263-58c5409f614e42bbfd88a8f742d6b88f.npy +04401088-2acb9ffbc050ac2e48bb2194a2a904f7.npy +04460130-7c78b826f0f46ef3b6b5161efde62bf9.npy +04256520-5ca1ef55ff5f68501921e7a85cf9da35.npy +02958343-6cd6f11fe76058089ed785be4fd72d3.npy +03211117-ab729d209e3ebe2fb3cfe9e599b99e13.npy +02818832-7121c556308b16bf158482250c99c0b3.npy +03046257-3746592c1dfa698d49493d905c02fa86.npy +03001627-1f438263a82a1b8919fb4103277a6b93.npy +04379243-dc589e1223aaa5e65cf2470a6eb9a24d.npy +02958343-abc42e7c5ffaa41d1466737d5c4b4246.npy +04379243-dec59b04dd663d5965bc5e8933ad03bf.npy +03636649-16efeb266e249dd63a52a79d6f5aab84.npy +03001627-17d4c0f1b707e6dd19fb4103277a6b93.npy +03636649-608b5df0d5946c68400789f7122dfdab.npy +02691156-f26ea1a00455f44fb88e2a19106395c2.npy +04090263-d8478e58902d241ae1ca70d5205a82b.npy +02691156-172764bea108bbcceae5a783c313eb36.npy +03001627-263f629d385be2b1601104cd2d998272.npy +02958343-3dd52c850785a6ebbaf1745483a8b34a.npy +02828884-2355964634eba1da35eb9316401353ce.npy +03642806-a520b985d944cd3bb74e0ee1cfdd5ad0.npy +03624134-b93b611092db370248b901354fcecf30.npy +04379243-ac6f632b60ec643650fa82c2f036109a.npy +04256520-5eb193a332576b775e333fe3dd3959a5.npy +03691459-291b3dc6e6f0d5a7b249ecc7669d184f.npy +04401088-a19763322fe669cc7e51366b0cf7747.npy +04004475-c2951ff7d0b04515748e58db1ff83cee.npy +02933112-8914b82447db43a8c59350d819542ec7.npy +04256520-1f741437c1dcadc82d19175e7d19b7cb.npy +04379243-21b8b1e51237f4aee76bc197b3a3ffc0.npy +03001627-b7c8be9dbe5ff1d540332412c5d013fb.npy +04090263-50e559a32e81e8a9cc57882dfaef8a57.npy +02933112-2620701a50216dbed0b36851d61b6fca.npy +03948459-2bde85cb58bbee99f307c8df193268ee.npy +02691156-53c27d3031f6f97e402be9c8dff728f8.npy +04379243-e3f583837f5bb80a5526f91aecc0c37.npy +03001627-52c4af69336f4d6de9deec47d8412ee.npy +04379243-f7ff2f9bb62a9f5c96de5fa2ca080bfe.npy +04256520-aa26a6735be82e5da7de3fd12bcc8851.npy +02876657-831918158307c1eef4757ae525403621.npy +02828884-6afb907e76102e222056b4bd5d870b47.npy +03001627-75f32479a35f39e9f43d965e3ff9c5b6.npy +02958343-ad6572f7ac90b9bf2949d5274e5ab643.npy +02933112-5a60822959b28856920de219c00d1c3b.npy +03691459-5a66a86082033c79a3acdfe62acaaf8d.npy +02958343-4dca2e572dc278d563f2c3a55558a78f.npy +02828884-ab3260f85c28adc82056b4bd5d870b47.npy +02954340-be6604a272cf945bf691615c36cac509.npy +03991062-d0dfc32cbcfd0ce753f884bab27d0f61.npy +04090263-313b61a27e01ebff0fea2ee98610322.npy +04379243-70c02e8ff7d19554e6fe3612af521500.npy +04379243-d11363fff4e2dc6589cc5332e945f058.npy +04468005-7addc3adeb16b62052470de2774d6099.npy +02691156-4ae3b41081645ca3e70b97b9b33fd6d6.npy +02924116-ad3c65e1f488f5af37277701a400254a.npy +04090263-a99df9868677ced6ffe50f88045d4553.npy +04379243-6718e0bfb822e591738e43095496b061.npy +03797390-24651c3767aa5089e19f4cee87249aca.npy +03001627-c04660caf4670baed40fb6f8053555de.npy +04379243-f88dca28140a1685490ad276cd2af3a4.npy +02958343-c1ac2aee4851937c8e30bdcd3135786b.npy +02691156-1974f6955c36c2aece2cec85ea6ae00d.npy +04379243-6187d4be01231460a341228b21d337a9.npy +04256520-717e503b3846d60ee8f8c11a24c52ebb.npy +04401088-623bc1157836ddeff8a51dbffe0021e4.npy +02876657-81bbf3134d1ca27a58449bd132e3a3fe.npy +03636649-a18b996f56dbc5cf37b2bb75885cfc44.npy +02958343-2cbd461545e71ffcd3b83549e73dc79d.npy +04379243-5dca7ed62a72a5fe81a172d69c52a28a.npy +04090263-69237e82dd3f7d3f8a5e49d8f4867e8f.npy +02691156-60f99c0946c095e833b2a295000cb6fe.npy +03046257-b31efa25b43918d59fceff51518181d.npy +04530566-751aeec5f1d50668332d76467c18dfde.npy +03691459-b521957294cbb170c7c1bdfb41b9d2d.npy +04256520-e352b0882699b66a44db04bfb021976e.npy +02933112-6ec7c811025a30a2e3a031805ace4a99.npy +04379243-95112920a9ab9c24f8555ec936cd4b63.npy +04401088-ee7d2d986f2c989ac66dc18b3cf1700.npy +04099429-b5351d041405a64421669bcdba443569.npy +03001627-e39df7339552595febad4f49b26ec52.npy +02691156-3844797c89c5e2e821b85e5214b0d6a7.npy +02691156-20b91c5ceb005cc44947b319a9e09fd.npy +03691459-d6cd608c3c75afd01ad88f716ea80910.npy +04090263-f06f841de5e202e5a50ef3fc203c6ba0.npy +04379243-5ec6da31cbe72c7f492d9da2668ec34c.npy +02924116-f61fe8b152f5888a54f791e4a421252.npy +03691459-17c472a6899c92efcf39ad4726172e1d.npy +04468005-ca7432069416afb23f990b83d396f8f4.npy +04379243-497d75f6a5b0c25077cf3bb06f394ad.npy +03001627-8e21f7a88cecf4ab5ef2246d39b30aec.npy +02828884-8aabc6c97aeacae7ad5067eac75a07f7.npy +04530566-76dab7acad83682765aae3dfe86a49ae.npy +03636649-d3ca8a5d2e8c8ba4a320e34dad7c78bd.npy +03046257-9c3e6695a5f258a7f51f77a6d7299806.npy +04379243-4d6a3cb51ac2144dd47d15ec8813fdaa.npy +04468005-91ceb1625c27cb275ef7a7d3024ae8f8.npy +04090263-e91264640374a2716a0207b46ab78ca6.npy +02958343-f49155170c175dff176be984cf2a7f4e.npy +03624134-912ddeb6b325df6aad1d0cc319eac33d.npy +04379243-49ce1344c3c8a652f9883d2fd957d60f.npy +03001627-2db8006b905b54abf88a016bc446405e.npy +04256520-35e15a666990625a1aa34bfa6235956d.npy +03636649-f7093dd024fd09fc7219d6d5c4afbaff.npy +04530566-b2f200bd0861e1daeb78d3e0a9401d4b.npy +02808440-6989e5532cbdbbf344221bef0fa3c36b.npy +02992529-85841bf9d27c85a26062f54263899d21.npy +04530566-50f0d14029f7f7be450c3626dae37aec.npy +02871439-dfdc22f3fecbb57c5050d6a2f5d42f74.npy +02992529-a635a6b98eda6c1fa436566ba711d6a7.npy +02691156-3572e3fa25911295922e63c830b776de.npy +02691156-a7751857e571d6bd3c326782eb2d380e.npy +02958343-731efc7a52841a5a59139efcde1fedcb.npy +02747177-d756ab06172e422fa1228be00ccc1d69.npy +02933112-8316451b3959184963be0260dd648a5e.npy +03001627-663b17baebd39695398b2b77aa0c22b.npy +02691156-14cd2f1de7f68bf3ab550998f901c8e1.npy +03001627-20fbab2b8770a1cbf51f77a6d7299806.npy +03991062-bb5f7de6d079f8e2c054c46f3dc261f.npy +02992529-abcda75b9f826fce8dd7bd77b545a577.npy +02924116-1b9c827d2109f4b2c98c13d6112727de.npy +02876657-1d4480abe9aa45ce51a99c0e19a8a54.npy +04379243-6c8d4952f67d47f56bf829b05be0ce22.npy +02691156-50040de261741893fb5c1b0f759e2bc1.npy +04530566-c554a1d4895b67b457f5c96598c7eb45.npy +03001627-3c9747ff49d0da71f91663a74ccd2338.npy +03691459-88928666d9c3939dac55321e2e1cf09.npy +02946921-1beb16ca4f1fd6e42150a45ec52bcbd7.npy +03337140-d75c5f5cedcacf1a91c352d02061b3f7.npy +03636649-39583310660349282b6168eeac2194de.npy +03001627-bb660ca2ed9e0155f51763a096bdff1e.npy +04554684-22041d5c50a6a0fb91219aad82abc053.npy +02933112-dfb5415f3bb999a4c59350d819542ec7.npy +03001627-70bf905fc0d62ebcb1ab5f3e2ac4cb05.npy +03636649-646956f902b2a134450e3da30d6676cd.npy +02871439-14f0caee76872a89571be7eae57ba8b5.npy +04256520-d863bd46db86b9dc2906e6acfda251cd.npy +03001627-9dfaa9b599fced446f1e07a56c129dfc.npy +04090263-e502392ba0ba05ac683e3750b53385d5.npy +04090263-7a1e38f9d85548e256c58b78d29fd8a9.npy +04379243-eecec73da85e87ccf008d8a3590fb522.npy +04379243-6fb52c296531dc17beedb4c8fd29e2d1.npy +04090263-daaed98e5444c849a50b91ed3855d17b.npy +03691459-a3d5207350bdc01e87d57ccb715c57f5.npy +02924116-b030d739e1e077ac7d42408e08c78f83.npy +03691459-ad2e92448857e1cc6ad08aa387990063.npy +02691156-795e0051d9ce7dfe384d4ad42dbd0045.npy +02871439-34e73c7fb43d489cd810b14a81e12eca.npy +04401088-8b4d28e4df5ac6e8656557acf97c5e2a.npy +04090263-97291a29f435517db6a44e5c103915e3.npy +02958343-75b8fc64f98a71969d69712f9d08c005.npy +03325088-bc42f9907e3478553321831d2245cf06.npy +03001627-6e3435d56d8f8465daeb838d0771f3b5.npy +04379243-610f10d57a44e0d1ba18ade30e563d37.npy +04379243-a465210c23b0136d7afee304cce81d6f.npy +04256520-2b8d1c67d17d3911d9cff7df5347abca.npy +02691156-5cf29113582e718171d03b466c72ce41.npy +04090263-739971469c9903eeb6dc6c452bb50aac.npy +03691459-257e47c2c327ac0f86690e0779a3135e.npy +04379243-f9add10d9e9f13f413ee1dc69b2c2bdc.npy +03636649-3e21ab6c6d82ec4e1509d7278de350d1.npy +03790512-e036a72a92033782b9ba8289eb4d47d.npy +02958343-5e93dfb8e4d59a0630714334794526d4.npy +04379243-65dbf1f9230a2913855931d119219022.npy +02933112-ca6712dace1e32a548d8ff57878739ca.npy +03001627-808ba77745a0934586abe5555a3b447d.npy +03001627-595379651cc8199abf3c0fb77f1e5110.npy +03642806-3ba00d343b8ee1357b9c6deef486a7d8.npy +03624134-702d6f4583b41f911c81652b127a0ec9.npy +03001627-a7200578bd7bea065dc3653f8341633a.npy +04256520-61e1edb3150c71a1f2165a0df94fc0a0.npy +02958343-c850fc6ea372c568a7fd25564c2e888e.npy +04530566-44b4972b96604e08a2fe1981a00251e0.npy +02958343-b963de806d271377935310097e7751.npy +02828884-20ac7b1b285151789dce72832d2a77e5.npy +03691459-9d2f1644bbce8260ff26ed0bd5d4b63f.npy +03325088-e55b1f59cd50df54b362845c6edb57fc.npy +02828884-be9a174af2b3a463f4fb4dee5181bee.npy +02691156-5f7f0545eba4034965e692ae5160ef.npy +04379243-de551ddcab968586a90dd8e076a5a7f9.npy +02691156-e0aec5757f7a907d647cd52f13caf24b.npy +03467517-60a67f8aaac90a5543e09a26d3027978.npy +02828884-da39ee814b8e3c0387d7792ff13e9cd8.npy +04090263-b76f3783324a5f7b3018d2d3c13a7462.npy +02691156-a2041f74f316e7b9585e3fa372e910b7.npy +03001627-97da84d5d78d84cc2360e5e238139587.npy +02691156-8ac48eb3349098b535fc197bbabcd5bd.npy +02691156-8325baeca433510f4e8c959f70e2c0d8.npy +02958343-ed2e4dafc745bdd661fd7e090d4d0d45.npy +03211117-e912fab93eb63fef6b4897a481d7d16a.npy +02691156-f9db62e6a88f0d7129343faf3bbffb15.npy +03691459-6f1913cf723bdfbec5e5fd334d8e3b16.npy +04256520-683384e0e6eb5d4e81f667e2a25e0619.npy +04256520-72b7ad431f8c4aa2f5520a8b6a5d82e0.npy +03691459-918ae70cc8ff08c27f83e87789efc1c8.npy +02818832-ae34003be790938fa3f600c356573d21.npy +03642806-c3eac3a391b81bc8387188c556ebf654.npy +02876657-114509277e76e413c8724d5673a063a6.npy +02958343-a8d3020b33543bdce64131b695068ec5.npy +03001627-2aa122c56910bad8fb0eb7e753c06942.npy +03790512-5bb3597d49c58017b37378f3c85478b4.npy +04090263-8c0827d07d79165ad87c63d8b3018b58.npy +03325088-728e58be6bf87b89c36fb70296e45483.npy +04530566-b4d3624a4e2651ac6bfc202176cd1f2c.npy +04379243-c4a43d8473ddd9b4554be8f12e385710.npy +03001627-67e6503e7ab7e666e45ef4135c266a12.npy +04256520-20eee9b40b2f6f36e4947ad76f8ce42d.npy +03085013-d05abcd34629ca136d07c55cf995503e.npy +02691156-d30689ca6cdf2601f551b6c3f174499e.npy +04379243-5b6bba613d5dccdb21b55dcb76ec1538.npy +03211117-e6304d3bec856684d9c9f98900faca52.npy +02933112-ab9e20f3f9d2f1d1d77c088a902d8fa1.npy +04379243-e7b41a39388925c364f6d058992c3399.npy +04379243-10e5ffa28c252aceea46bea76c64cc3d.npy +02808440-b8cd34d7b1e0e9ae84e6e639680867d1.npy +02828884-5d9dd008caf920b8c29a08a3db9fbe1.npy +03636649-86a5fae37549690cfcb8d8c6d4df8143.npy +04530566-176c629c93b5a1f73cf0b8b75857cc24.npy +02958343-add26d8f4f91ba04c84b95bddf75b22d.npy +03636649-1c9283c95c8bddd5efacb264ebf1ec75.npy +04530566-1b89cb2463ccaf15e1e2fc42e32162ff.npy +02958343-49930a07ed003273fbeda5389ab05f5f.npy +03001627-283e59109ef763ba2168ec2d80dee966.npy +02808440-e41cc68c7809ec9a412deb0d2b0f3dcd.npy +03467517-1e019147e99ddf90d6e28d388c951ca4.npy +03001627-697fc3fa4c36fe9b128d966a6d72dfea.npy +02691156-adeb5d68e8d65cc419ba010ddb4974fe.npy +03001627-5b5d0af8426e604df1783a44a88d6274.npy +02958343-9676e8250cdd90307d5394224a6aa067.npy +03001627-6b95ac6189a395d3fa8cf35dd917fad6.npy +02808440-4119421c85d867c4fb5a74b09b9b3506.npy +03261776-a959980585058ee42764cfba57a5de73.npy +03001627-71656875081adda78b17d6d1965c2fb6.npy +02958343-cd8956854d515c47374462542bf2aa29.npy +02691156-bdf120e29b19f77b352526271bef32d2.npy +03991062-f892893037aaa2028cbd3996b1c0adf8.npy +04256520-244499318ac9251c3bec56bff764ba78.npy +04379243-287d78d72d12b03c3bd24f986301745.npy +03001627-ecad3bef91aa032b6c1d9538813ca7b2.npy +03001627-c2180f4b2d79f55cee30e9904f2fffb0.npy +03636649-f9b41c5ee5ce8b6fcb8d8c6d4df8143.npy +03001627-e6e65bbad248c82c4c59782c74cbf5c7.npy +02924116-6929f0a74db347dcc69634f1103db34e.npy +04530566-2a020ea3cd5e4fba37363131ac7e8139.npy +02933112-3d21c18153474a0acf004563556ddb36.npy +03991062-83ecec98acd12e53ab1be941467a2a97.npy +03938244-a3efd34601ea92facd6e752154c5afc0.npy +04468005-bc9469b0686383a0520ca1141749248.npy +04379243-da7daaa940ae6700286de2124bf64f07.npy +03636649-60500e6bc230e3f3bbe00b56d7315d73.npy +04090263-51b6fab73fc9ea886a34aa94ca8a3355.npy +04379243-8a3fe76dcc0c54cb502ac2eb9128f9a.npy +02942699-60923e8a6c785a8755a834a7aafb0236.npy +04530566-c29e6490308ad33320d713ce6286f99c.npy +03325088-13cdb5df9a944fcbb7a867e9b35a1295.npy +03325088-3bd7088a61b81842c129b46efdbc7885.npy +03046257-6a4547d6f396b3212871cc0b3cc1a485.npy +03001627-b53373122c7964c531a0ecc0d5a7b3d5.npy +02958343-7323fab0a83b9598f11a194d0ae1bf8.npy +03991062-b8bfd969eaa20d4c7c88564709ab8d9.npy +02958343-9a92ea1009f6b5127b5d9dbd93af5e1a.npy +04090263-a11fda24d699c02f75e83577a23faa92.npy +03636649-5580b95ab8e7806c6c5b8009db95f66f.npy +04401088-d565df5aa65604c86b69fa5331093439.npy +03001627-fe224defdf08a99a3002761e7a3ba3bd.npy +04401088-556b1ebe82977992c51777c7f8bdea09.npy +04401088-57004d88e4deebcabec15cbb63c9ab60.npy +02747177-1e1015a06e43c0a5a44b6af22454453b.npy +04256520-31b5cb5dfaa253b3df85db41e3677c28.npy +04090263-a4f94ba638d2bde76227cba038bf7c95.npy +04379243-e0eb9f5421ef2c4584904c716bc3b619.npy +03211117-65988a39887ffed8edba57559632880a.npy +02691156-e8b4bac72559c097e8f5e45871fbc77c.npy +03001627-925c06a5aea45ffbaf7c7ad2549a1b15.npy +03001627-c666bd15aaebd5b02de0bc4fc4d02dd6.npy +02871439-88d2609fe01abd4a6b8fdc9bc8edc250.npy +04090263-9a2d5bc2029c82cc1b7837f7a64e3031.npy +03325088-b039d06d4776f9f9fd24893a94b85cfe.npy +02828884-d63302230b1e358f24e2eef7547426c4.npy +04090263-bf2bf9b61e8eafab30d6a7e7f84a00b3.npy +04401088-1f93dbc9622d83de7a9f0bb7b1eb35a4.npy +03001627-3318f55fdfb9a132f83ac1589b0e94a6.npy +04379243-8862cddf90fddb3119fb4103277a6b93.npy +02958343-59e01fab310fa8c49c9f1f5abaab90a7.npy +02924116-5d55097e65e6495f8b0ca2812178f3fa.npy +03001627-b8c678c49e40ee5307776da88d1350f.npy +04256520-26891b80550301721a648655355dc699.npy +03790512-837330924dba611df6572e2c76e2d78e.npy +03636649-de063371e5ef119cfcb8d8c6d4df8143.npy +03001627-5f34521c634a4045c68e0b8b9ee8a0c6.npy +04379243-bea8659e45a1094f625ac64d4da8b7e4.npy +03467517-eaf405d9ecd6a9df747506aa863f10e4.npy +03001627-637606c1ca1ecd81b502160362bf1664.npy +02924116-d4ac8fcfe5b445d552470de2774d6099.npy +03642806-54dd364a4ea326ca21844676433a0aca.npy +04090263-beb75684ec2f965412b38b1d99376c0b.npy +03001627-11d3fc4092e616a7a6fee8e2140acec9.npy +03691459-39c15f4b2ccd699bf0a8b62260a2a216.npy +02691156-44ae568461e04dc2fb3831486f8b425d.npy +04401088-f3aac8f54f5f2a2f983ec12a2b33f18b.npy +04379243-bc4ba0bd86545f3fcc749dbc8c455b3f.npy +04379243-3f9c84917d92506f3bfb18d76f33685f.npy +03624134-ceeb38ab7929361e76ec14627bf6bbcb.npy +02828884-d3eea79405a0c784f155d75bbf62b80.npy +04379243-90446c710f3495f4e90047543e308ba1.npy +02691156-73bef2b9747edffb8b96ae1a0a8b84ec.npy +04401088-abcda75b9f826fce8dd7bd77b545a577.npy +04530566-2080308141b05e9e584c6557cf979aa5.npy +03624134-ff949d2335a226fde1c0dc67e69df88e.npy +02828884-f213ccec1e4c9dddcb2a965e75be701c.npy +03337140-f889fdcf54cd73d47be728bffb08bde.npy +04090263-4ba87457899d8385d735fa1ab17311ec.npy +03467517-1c9b41481f09f9d33aa393830f0be88c.npy +04090263-c7b9e0958bc8f2ae320f9466abaabfe2.npy +02958343-664473a5493912f4650bba674124a73b.npy +02933112-d9e69e6cd318d34380d6227ff9b21190.npy +04256520-8731945435676805aa29e9f0529e8ef7.npy +04379243-3fb5033b5ddaaf365f7afad12924b3b5.npy +03001627-cff9e23014880e20b2e8bfcc2dfe93cd.npy +04379243-3b8d176f94c0617867dc358060e3c47b.npy +03636649-922902d623e5e5dee527210494d6783c.npy +04379243-c5283929da8665cdcb9cf5f7d536cddb.npy +03790512-7b6d89ff70831e71594057aa2102e240.npy +03001627-23acbdfee13b407ce42d6c2ea750090e.npy +04554684-eca8612dc1cc153c4df5aaa9df719285.npy +02958343-d41c66c7b1ff1f57979ef391885ee5d2.npy +02691156-c814a53c1538cdca4f7e1991902e92f7.npy +02958343-3a5ce33bac316d8f6379c5e421c1d27.npy +04256520-ce378b91236095622155ef587b4a7084.npy +04379243-28f702b5c6ccffe7fcf9154182ccb5a4.npy +03991062-1cd99461021c535b3d2ad39bada7a0a.npy +04256520-fbb0d2c65c3a26a6490ad276cd2af3a4.npy +04379243-1c3310f4c05ce1f6a192483aa282f8e5.npy +04256520-b8909a5d6702f6f31680549bb1d1b739.npy +02958343-a3d0bbca6bf8a565dc90bfc1d450ece8.npy +02691156-e4b0599a9d06f7ae39cb1b92881e8e76.npy +03790512-455485399ab75f93429f1c522640e6f0.npy +04379243-8219a48422582b01c345108a8f6e3cb.npy +04379243-7772fe52eeb64fe8318694f1cc6fb1f8.npy +03991062-c5c04e396d6aecd344c183864792bc2b.npy +03636649-d54b55ff9b0923c12cd2160e449d45ae.npy +02691156-24bdf389877fb7f21b1f694e36340ebb.npy +04401088-4303a97b71a1bb894208dfa1c5fa1065.npy +03001627-6c16024ad8f16d6c83c7ca617c7f7461.npy +02992529-ff8ba237ee9164c8ff86292618094648.npy +04401088-715a2661c9be051bf4ede441a9f9be4a.npy +04379243-5463f71800fcf2e5e89951e6ee90b3d8.npy +04225987-11abd8b2227a9031e65449686a784d77.npy +02992529-b21610e986fa4c9c7cef36fa43392c52.npy +02958343-70d31e0100cab3fd77954285e7764e1b.npy +04530566-6a0da87e5858b4373e45dd2f173cbf9b.npy +02691156-f405858991b190173af8c56bd4352c9.npy +03085013-6445c051acf63ce01aea59cd55c902b0.npy +02933112-4669d272f690a18dc016d21df34cd8ce.npy +02933112-5fec62a43a64ecb6f51f77a6d7299806.npy +02880940-a1d26a16a0caa78243f1c519d66bb167.npy +03001627-efb0e98337c0554960257b24d454e22f.npy +03991062-8fff3a4ba8db098bd2b12aa6a0f050b3.npy +03001627-2cb0ac27f1cdb3f0b2db0181fdb9f615.npy +04090263-ba405d9633ec030ef27eb335b754fdaa.npy +02958343-e703fadeba32d912452ffe4552686849.npy +02933112-90dd9ad1a74e25d53fe047712e43e185.npy +04379243-5f8bb62eec8f6f49616fb9ab42452112.npy +04530566-393f1f8b2c656484a7ace102781bfe8b.npy +04379243-96ccbfacf833d023c3bd24f986301745.npy +03001627-fa6636dfa85cd625f63376552552931f.npy +04256520-d72e78905c4d975f4f650cd6cdc94858.npy +02828884-d3b644f9eb32ec9cbe1fb1bc0addfcca.npy +03001627-a1296954d5190272327289c00b6dc9ca.npy +03636649-94f1ca2ad33eac601ae26e820e4d9a45.npy +04090263-dbe471b64f9d8647e35dc3ced109600e.npy +02933112-3c855f2a52d5e3f63c8d0fdfb1cc2535.npy +04401088-3c0801c11fc7e4c5f31b75c4a94a8879.npy +04379243-ac9f82fd26fba6aac45e8c8bb42d23a.npy +04379243-b7a0dda52974fa642250bf58700b4d8f.npy +02958343-781b45d3eb625148248a78e10a40d8eb.npy +04379243-9b77e481163e91214038d588fd1342f.npy +02924116-17c0d859278b203df88b61e9125676b2.npy +03759954-35f36e337df50fcb92b3c4741299c1af.npy +04256520-6d41a09cc94d2505a82acb2f2fa57398.npy +03797390-f626192a5930d6c712f0124e8fa3930b.npy +04256520-9dcede4115b4379e2af4036e9c51cbc4.npy +04256520-bfc0c2ab5bcaa2df9442d81743a735a1.npy +03211117-d10085421b3cd3a27504aecf4baaa1e.npy +03001627-b773f81e938f95ed65ba78ad9601cf1b.npy +02933112-8057ca7c19a1457ee3f7a74e12a274ef.npy +04379243-28365bca55784894e99f3a1de720cdd.npy +02933112-8504af8851175efd253d6f91951c4f58.npy +02992529-29c5585362cf4aa5b4f6326696174df2.npy +03513137-802b08904ed6bb57b20f6e48f6a30cbf.npy +03001627-ed47d02d4518fb5d9cc2d4308810279e.npy +02828884-241f99f97083f685beedb4c8fd29e2d1.npy +02958343-bfa0a0a7862c2cf3c2179f10f381de6d.npy +02942699-4f2a9bf0d8eb00e0a570c6c691c987a8.npy +02691156-89a5679cb03f30caf5c7319b71bdce6e.npy +04401088-87f8a738b3f0ae0194feb18ebe41aa84.npy +02958343-508b9f9da70d70dc809a9c98ca4d300a.npy +03001627-6e1e605da1c3d680f9b9977a2406713a.npy +04401088-611afaaa1671ac8cc56f78d9daf213b.npy +02691156-813927b25c3a0c6dff227f13dbef5a8d.npy +02691156-7cabdedabd1d65bdfb86dddee1d6ac3.npy +02828884-d7731559d5f485bcd2b12aa6a0f050b3.npy +02958343-527d52b26bc5b397d8f9dd7647048a0c.npy +03001627-a64bc6079afa241f762ec387b772e9e1.npy +02933112-2036aaa68d164c373fe047712e43e185.npy +02691156-a00c0bdf007689619ebe905ef4009f84.npy +02958343-641a0da53609ee3028920f0e0293b366.npy +04379243-92016e48e44e8b8bbc16013e096d0c1f.npy +02691156-fcbdaf6100aad67d5abb92fce0f1ced2.npy +04256520-9df8e759e084a988fb1eb57de0e2e513.npy +03325088-e08ed186843c83bfb7a867e9b35a1295.npy +04379243-63b53646b3562677d395837145ded71.npy +02992529-a857d9e7cd90163e10bc2436075f6a52.npy +04379243-a8c7402b6bb693219786ace2aaa77b00.npy +04379243-92dcd20f1b208af9f51f77a6d7299806.npy +04256520-875aeeeda0a93481f51fa0238791f5dc.npy +02958343-18a9275b78be4b9ec6d3267fc5334296.npy +04256520-f55a514cc8f2d255f51f77a6d7299806.npy +03001627-bb3516732bcd45f2490ad276cd2af3a4.npy +02691156-f9e80ce23d9536623fddedb0bf24c68a.npy +04379243-88e6afb8c56788899470764d5e97d4ad.npy +04090263-360f8314b77730336edbaba04282b1e3.npy +02691156-b7b657d7db3c3b8cd13ef00338ba8c52.npy +02828884-c19a1aeba4d90b4aad5067eac75a07f7.npy +04090263-9548b43e0f416e3a4a4f87aa9a31cd70.npy +02691156-fb5e00c769fa06e7c277130bc8102991.npy +04379243-6eac64eb398b9d7145d4f35fd8d64cf3.npy +03001627-e8f20141696f143cdb77753d44aa25f6.npy +03001627-632a5ea290b0730c6ad8177a9d42d3c9.npy +03761084-401d1543b0617914de2a9aaff52ac7.npy +04256520-9e6ba78f80fbbfde5369e32fb818f337.npy +03642806-41e263d2af5c667f988abef1fd117e7.npy +04090263-b3a41cbb4ddaea6786225a62b2bc2d97.npy +03001627-6ac7b2ef38226e3d26c2e61baa2a8130.npy +03325088-5f46e75b9faf77c876c18e71fd49c4dc.npy +03513137-12a5eb233ecf486e3e01acc90dd935ff.npy +02958343-a2179820a01ca67f1a144f5cf9567bf5.npy +04379243-193aa6ce8777814b90e2ed261620fef5.npy +04256520-dce866778584da8219eb0cf70882af88.npy +03001627-49d4f5dc155b7b8a55f46d55537192b6.npy +03001627-bd0ee3dbadfa724f6ff454af1e8947f3.npy +03001627-668b9f6517f2bf501e54ac67f0143e13.npy +03636649-21ba9de4d311ff31cdb282e42e89414c.npy +03790512-61b17f12bec91d057395d58407f193ba.npy +02691156-999539f6290b7072ca2bd098b9203af.npy +02691156-9e524a14078824b5cfe15db7c5db913.npy +04256520-a37d0d0598d73b07165fd9581927b6ad.npy +03001627-a31b0ccff3aba978c3bd24f986301745.npy +02691156-8b61ba80d9e487deca8607f540cc62ba.npy +03636649-7fa4f80f92b8e779eef2192b7bb521a4.npy +03001627-52621a97e5036dabba18ade30e563d37.npy +04379243-6b62c85b16e300557005dacb6907e37d.npy +04379243-9c390832c0d1569b664b3b9b23ddfcbc.npy +02773838-c3426d26e0408be4285e5a1f74237618.npy +03001627-bd0918d75e22cbf9febad4f49b26ec52.npy +03991062-a2cee19f1c118a73fcf9154182ccb5a4.npy +02958343-c975716963b72b72236804c5ee26a2ab.npy +02691156-552d76fdb54e5d57cf7cf1e30e2f5267.npy +03337140-3d95c4ebb88f94b3d2f054448bd437d6.npy +03001627-3e28e0f5ca5e03df73227452e5016b6f.npy +04090263-9cf37ec1667dcd3b4d4925687e893b3a.npy +04530566-f2ad53e569f8ea255b9ed5fa79e9ec30.npy +03001627-8b016c4df0e139b660065f613e3a3cf.npy +04379243-dd197fdad7f339cbe8b31d97326b3fa0.npy +02691156-a94057f15ca19a33fd98271adcb6e31a.npy +03001627-62d87dab8cb3fd16c050719ed29b64cf.npy +02691156-e3f562bd552fbb14496e2f80fb255499.npy +04379243-400369fdca7608a531292d1fc01277d8.npy +02808440-198abf39ad554388b362845c6edb57fc.npy +02691156-93314e5d740a48049a6e43b878d5b335.npy +02691156-8adc6a0f45a1ef2e71d03b466c72ce41.npy +04090263-cc362ac31993fcb4fa0d7d9af888ead.npy +03001627-3c786ff99885e95c685d4893e4ba8951.npy +03797390-ef24c302911bcde6ea6ff2182dd34668.npy +03624134-17c4163247e9237d4b7644126b1d71e0.npy +02828884-a11db718438648a0ad5067eac75a07f7.npy +04090263-93bdf3bb2fe22dff7ec95138ef83ef2f.npy +04379243-369c19c0971221f3664b3b9b23ddfcbc.npy +02828884-b2acbc0822c163fb491436340b3b4d18.npy +03642806-2d5d4d79cd464298566636e42679cc7f.npy +03761084-3ba680a213e736bc23553854725256c2.npy +03991062-aab73b8b48bec09b36b0f2a1430e993a.npy +03691459-60765697073cc44cec7e019402cb7bad.npy +03928116-9abbf6edaf6148d25803dd89b71b9b2.npy +02958343-3044f0bf0ab7fd8d476502dcb0dc5465.npy +03325088-d20f44a49586d3d3e61ee99f7b43d0a0.npy +02691156-93a635370616538abc0909d98a1ff2b4.npy +03001627-ea87765cf9dbe2fe55f46d55537192b6.npy +02691156-2dcc844fe9c4d4d99b0fce6a4905cf2b.npy +03211117-ae8e106b972648d5bab4cb27e92377c4.npy +02958343-238c6d6da1c8ce2970097c1b40e1ea6.npy +02691156-5face359ff1d4b4f8e8131a047a07ce1.npy +02691156-65654b5c4e488e0c961fa14fc879444e.npy +03001627-28cace7066ffa9c2f4b6538438a0b930.npy +02691156-d0001af4b3c1fe3d6f675e9f2e677792.npy +04090263-a5b31577127d77d28653d927a24ffc75.npy +02933112-ab7b9934fa7d4768c0f947750540fb22.npy +02958343-1a7125aefa9af6b6597505fd7d99b613.npy +02691156-427030abcc0f11a8947bbeb9022263b8.npy +02933112-3735e7c2bdcdcd7eebf9241bfabf12f1.npy +03691459-cf45708ed1ed436970f2559ee6f59e37.npy +04256520-ddf7a59004522f04c366b8589aac6975.npy +03001627-ccabe6ab0816614dde03ab2a27ba7531.npy +03467517-3621933462e7962af4493a5b80949ad1.npy +03211117-bdb7abf15b1a3f437483e5069dd82374.npy +02958343-a111cef175177b3cd89cde5d5f759ea7.npy +02691156-e5abd988cb34ed9cdc82b8fee1057b30.npy +04256520-72421bcdcb3212f1bc2ef6ddd5c1612.npy +04379243-197f31b2a8fb2e1aba5342d638d0c267.npy +04090263-22fd2b354b1d26eb306b3e8b438992c.npy +03467517-b79e39da98c26625bb6216c38da5db0a.npy +03593526-770f2adb9756b792c9f016d57db96408.npy +04468005-faaf4bcd6d23ae08dc14ba0818ee5cec.npy +03928116-bfe3fe6dcf01eefeb9492d4f3d8bee7c.npy +03991062-462b8122f7439283610c2a68437007d6.npy +02958343-c7c3736ad5f3b252e56947f054952694.npy +02871439-55692507997f7884edd435e02f1ecb.npy +02933112-50492ac55ad27122e8990fccb12f2c29.npy +03001627-4bbd110ccfc81dd336b0f2a1430e993a.npy +04090263-1d4fbefad4abb85790acff7491720d9a.npy +02958343-8e2f0f7f5ca505b56227cba038bf7c95.npy +04379243-b1ba4d962206bad5dfda4f5adaef3a7f.npy +02992529-2278cc8b5a50421613fcb9cbc590fba.npy +03991062-5445f01471e4df5da2c59a4d90e63212.npy +04330267-23ea5db3e8c4eb2a99762eab905e5e24.npy +03001627-e9371c17042131d93506b420c6bcd44.npy +03001627-c6c7820d5e2f0011c2bf2dcc31ba1713.npy +02828884-a973a401412f5561cb2a965e75be701c.npy +03636649-b2bdd202470b4166f3a29b1591515940.npy +04379243-ce4e54dbb99b5bce98a96123d0d6b0d8.npy +03928116-f67a6db9393d99c85f3d43a486973313.npy +03467517-b1af1d78597d178ae7ef9fff09638f8e.npy +04379243-aadf84936183c2d7414701ac79f88733.npy +02691156-4937396b74bc16eaf781741e31f0df4.npy +02828884-f0c2b4f3e73873998cbb8bac2032149c.npy +04256520-a308db2269dbf79914038d588fd1342f.npy +03001627-9d0043b17b97ac694925bc492489de9c.npy +04379243-2e25c45a4456df3f36270e8efbeb40ec.npy +02691156-8d84a34d5aac3bffc6f6da58b133bae0.npy +04379243-ee077280e4f7c4a5ca554b08dbb3ef2.npy +02691156-556d2b99469e62e623a346a784afd6ba.npy +04256520-25c859754525fdf713dd6eafe1477be1.npy +02924116-bebd29ff5a8e475d20dd2f4d517f8804.npy +03001627-4428b7dc4b6696812905b6e26038a78.npy +03001627-2af09bd8df40506c9e646678ef50aa3d.npy +03991062-8e764233b0bf4cde4c5c5c89015f1980.npy +03636649-5de6d462706587e9f0f9e9e64b6b41ce.npy +02958343-8bd0d26352ea9de9becf71e2e014ff6f.npy +04379243-c3a9dc47c5bf10aac3bd24f986301745.npy +02958343-9e3a2cfb3c8a25909b2ccdf5f1fe9097.npy +02747177-112120e83ef41de3571c83071e95ca03.npy +02691156-6a8b9f82f1de022a9ea7c189c9a53081.npy +03691459-ac8fb298f7795ba47f1358f741bb7fa6.npy +02958343-e17065d11b36ab37f9d73bbb584eaa42.npy +02828884-7b21980987b63b953e329950ec40f6dd.npy +03759954-6d9ab595a7bd890128ee3839fe659fc8.npy +03636649-81894e0739e3fea9d49b2e04785f8492.npy +03001627-d3bf9df2360f0a56731dc97277e95217.npy +04530566-9bedc0d32c657b5a95003e7aecc71b93.npy +04379243-b8ec9bd6096a14488de42fc1392c2139.npy +03636649-a60c6cf7d4893f2ba26bf7a8fd4719ad.npy +04379243-7311255cee3e412771a782a4379556c7.npy +03001627-7b405c1d6d2dbea9f91663a74ccd2338.npy +03211117-7c5b291091dd0a166acb8fbfb472b3a6.npy +04090263-584cc870ac0550e87a268987b1e73ce0.npy +04090263-2eaed43aa5e4ec8cc24d00518a3dd6ec.npy +02924116-11aa2ebb5db8b9f36922bf4a94dea1c5.npy +03636649-5a4248187b0cce798aaae3d020f5ddf8.npy +03001627-2e0b6f6d19078424c3bd24f986301745.npy +03001627-32d9f69ef8ebb1778a514cac7cb18507.npy +03593526-7a971531ff72a48d5706d1c54190f27a.npy +03991062-263e56f24d3973216fe9ca24e0c157f.npy +04330267-5b0e09f6f3579f45efb11e763be8310.npy +02933112-f07668a627a039b87b79156a61ad4c01.npy +02958343-faeda504709a7af489d347432ecb438c.npy +02958343-35de0d0cc71179dc1a98dff5b6c5dec6.npy +03211117-e8428a7732155fc1134821a4f2837ea4.npy +02958343-81bb9f249771d31ac675ce607c2b4b5f.npy +04379243-6b5f3b7fab02f9e358220b7cab409d3e.npy +04090263-56b2a58cd5c679b35da6a29f026db97c.npy +02924116-da1c8417f95440739afb67dd284d342.npy +02958343-f2422eb6b55e8fb0ef3ecc8551d2c1fa.npy +03001627-ba45d6c491637dc5820018801b237b3d.npy +02691156-e9bae38bc2083d0bb4d73e4449062b04.npy +04379243-788af6bc08bbe51fd9a828fb989f49a0.npy +03325088-c63ab53b4ec1bfa83321831d2245cf06.npy +04554684-5fc3cef0cf926f5b9303a353ee6dfc42.npy +03761084-4f956e259344d4a3599fb6902c958d23.npy +04379243-b661b93b67d0ca908cc8e5a741a7e8bd.npy +04379243-5e4351c4525fae6d6fa63795f94c4d8c.npy +03001627-9db73a6184c82d33f28699debac30ad6.npy +04379243-459f1e82f058fbd0ca42ad68b92de4c8.npy +03001627-a6e3c2cecd4b6b6203c870f1209d6b9.npy +03642806-5430ba1b4995af02717dccfa4b0eec5a.npy +04256520-4b3f84ca13baf80be0c381fdfcdec36d.npy +04379243-3a7d5468084399cd11ddc5a6b5ad5cd3.npy +02933112-7fbd264b7031c399d37a1bae74ee50a2.npy +04090263-ed9b7dbc375d3543d0a6af9bfb470a20.npy +04090263-d82fecbd0fa3fe757e183a626c555090.npy +04379243-b61dec9a8ce09e4b80360680c1602c7d.npy +02992529-fd3c1ac6cd1f94bd3982f71b09380baa.npy +02747177-9307ad32b595cd82cb2a965e75be701c.npy +03001627-a147244346d84fe398e0d1738edd4f19.npy +02958343-87a7ebcb0dc2285d77471d13a466f5f7.npy +04256520-35bbb0da45fbb2d93eec26c23f5bc80b.npy +04379243-add1279c481f88a1955e0ab55bea4388.npy +02691156-68ff153952368948b4eba5f9f157d8c8.npy +03636649-dbe5479ef7f6c752eb1f13e2de7cd7d8.npy +04379243-9634e0b7d04586865fca6ef890703085.npy +04256520-212a8cab17af2454f8b0f8060696d1e7.npy +03001627-3d0b161ef3c026a28a514cac7cb18507.npy +02958343-a54ce961d973443a0daf3e5400b95c.npy +02992529-5deb3e8911dbef1adce6ba04fb42df.npy +03797390-5b0c679eb8a2156c4314179664d18101.npy +04379243-87504deae620d0dbf4b6538438a0b930.npy +02924116-9427168b4111ec2fc7a1e45e54191e0.npy +02691156-2e9c1c3d866c4b6ce2c6d8aa34a5d35b.npy +03001627-66654548053c709ac3bd24f986301745.npy +02691156-559f9a545b9b98a1d433b2698458193.npy +04379243-da1e75a8647bfd919778416969ddad32.npy +04379243-4805127beacfba4a7e7e510dabdd3cc0.npy +02828884-82b06455e41204e110df635c029b4e63.npy +03691459-9076b1b9e23c7446d747b49524a1246e.npy +04379243-b7821e69687d767aab610b0c94236463.npy +02924116-96d2cd5298733a7b54d963fd62c89fef.npy +03001627-8a455c7acaef577824f0493013a8318f.npy +03636649-a3a13218d61daab550903fb6fac1fa18.npy +03337140-4427e5eac495c14e40a7c7e360f68f9b.npy +03691459-1b24c1c65645c5f155b62c3398327a83.npy +02871439-3d554cb7c74d1fa0820018801b237b3d.npy +02992529-1101db09207b39c244f01fc4278d10c1.npy +02876657-194f4eb1707aaf674c8b72e8da0e65c5.npy +02992529-68376369681e50847e814a763437cd9.npy +04256520-e32a5fdbb75ed879568af879e5634175.npy +02933112-df0f03ac21921f02c868162258053ece.npy +03261776-4de2413a28db0137100e9bd5c4b0af54.npy +03624134-eef74fec4fd6537f89145655be527428.npy +03467517-a3c93f4327a923b3dbea3103e4ab595f.npy +04256520-1de06749f136ec8da066c1f884f0378.npy +02958343-d2ec7caaf8cc7a9fbda72093f9b5aa73.npy +03001627-bd6fcae754203396e34dfbaf829eddf7.npy +03761084-6216efeb4d5836d1efa585e146d1a8c9.npy +03001627-44fbc34ea7869e38e13a527279e951a2.npy +04090263-d8f1721d811dabbffe085ac6ce469d2a.npy +04530566-5bc8a432a5911a4c14621506c22882a0.npy +04256520-e389a5eaaa448a00d6bd2821a9079b28.npy +03710193-bfc242ae3d98762ece876412f61273f0.npy +03001627-b518d19f55a1e15f5d714c9d7df1c4ed.npy +03211117-77fee7e689d94e0f3637439a589fcdc5.npy +02958343-d45b86de9175d1c8becf71e2e014ff6f.npy +03636649-3f968096c74ee3a3b04a2e6a78ff6c49.npy +02876657-d44618b5aefe9ecd467ca2ad6571afff.npy +04256520-99ec7e5d04f32409d45611d32fd7733d.npy +02933112-94f4f2342f6335c5875c4d98e634f167.npy +03001627-551be68d484c8910f91663a74ccd2338.npy +03691459-6803540650949be89c4081063e213a15.npy +03636649-5d693f7115e5ae984e9836419f09cc52.npy +02933112-2a3023853ebfeff5eb0fe7d6b5545a1a.npy +03636649-f0414c5a1d22911555683d8c4a0488e1.npy +02992529-54de8ee661787c1d16d46ee44c40524.npy +04379243-decb34ff7d69d024e6c5cd45aa112726.npy +04530566-aafc192d33956391b82d6a0b1fbc7c80.npy +03001627-2b52cd0ffce12156ccbcb819724fb563.npy +03001627-7e7e130acfcdf64b1dec8546fd5980a9.npy +04379243-2df0d24befaef397549f05ce44760eca.npy +04530566-df307c1941ca4bbd8f6810e1a2b6aa04.npy +02876657-883ace957dbb32e7846564a8a219239b.npy +04256520-1fd45c57ab27cb6cea65c47b660136e7.npy +03948459-6dddfe264ab324a5e39bc2c6d1318094.npy +04379243-d29dedf88bac00a21c19e7863a1c200b.npy +04379243-1a6aca00bbc88c7d30bbd4cddd04c77b.npy +02876657-44dcea00fb1923051a4cb1c0c7bb0654.npy +04256520-23780fffcd205ae9f1ce854e012143bd.npy +02942699-a600991b042b2d5492348cc032adf089.npy +03467517-bcfac61cd0459d5437f945ae4b0d3b56.npy +03001627-fdef0425d385c1cadef295ef48e5307c.npy +03001627-a49fc9bab5834df95b1f17dc9a05edeb.npy +03636649-2e06c6e29aa90245532e8683617554c4.npy +03325088-1d5be60c3915be4b362845c6edb57fc.npy +03691459-9a989485d607844c786b126bff0b0351.npy +03467517-f0ea12f645a1c541ce1a36e7d9d3bee.npy +03001627-d04c2161f32a6499a6fee8e2140acec9.npy +03636649-d34a10201a5448a253cf897b7fc1d12.npy +04379243-5276058cfc1e139326392a5b643ed5e3.npy +03211117-e2787b2f0dd35fccf42a90fe4baf4591.npy +03948459-a7072394bb9d23f54b49cd65dfcc3a9a.npy +02808440-397908e45ef98af8aa8891d8ac9b291.npy +04090263-4d4fdcb113d7ed643a6842b1f893c19.npy +02818832-5ba5c9836e19ac7640b4c5428883e585.npy +04379243-8b7f2caf571342398b8e4fade0702996.npy +03001627-42abcded68db4356352fc7e973ba7787.npy +03790512-53062381d490e3d1e203ed9c6e5dca08.npy +04256520-cedd4ec33ee3b2de7252a102efb37f50.npy +04379243-8d1d04d72b7a240d4c61a7cce317bfb7.npy +04379243-472796909612bf1f1353dc45068d6f44.npy +03001627-50b4851d6e067f9bdfcd57c2094a665f.npy +02808440-5e83e7b924759c8ac2b1819e686b1fc9.npy +04379243-d70bd276cd9f66f0a909821b8b014ef2.npy +02876657-cf6eff1143f9826ab5c14191b5dd293b.npy +03513137-96366015f183b237f1ea818b22320c8b.npy +03001627-2268d24a64c2b20b16222ba719ed2541.npy +02691156-d9dd8dd2c422dadaad70e50d5d7d02a5.npy +04256520-bf335aa14157162b6f8304908c816659.npy +04379243-77986a9d5546899819fb4103277a6b93.npy +04379243-81a84fcb2b247a3348eaa510713cb074.npy +04256520-d4ea100ff8f94edadb1109c64edb2c4c.npy +04379243-52f2c6960d67445f896f73ae4af4fc8d.npy +02691156-c237b4636625f1b0af8d9a7eb0a2bedf.npy +04379243-d8ef132f3ae98f688231f48f0f8de6d4.npy +03001627-484a7d924c952e51af7c7ad2549a1b15.npy +03636649-680e5d7185a51e26a50ffe9b7408540a.npy +03325088-873b6c2543798e437d6fb76678b5a248.npy +03642806-b436271050d647052f8d6d501b18a4b5.npy +02808440-7ab27b5a8e1b0ed2fe52ffd0e748a1ab.npy +03001627-8979c1aaa6675009bf80985a99195eb8.npy +02958343-6ee7fc93288d678e3ab3dfa44f5fab01.npy +02691156-ce4b8076f8f9a5a05be07e24c1d3227d.npy +04401088-b1085da37756ddd1d3f1ccf368ff60f9.npy +02958343-e01a56af0788551e7aa225b44626f301.npy +04379243-eae2c096070f0a57beedb4c8fd29e2d1.npy +02691156-eff5216d782684aa3c7aa3e4b8926c27.npy +02958343-2205a3f2c102f180a134736201a79843.npy +03001627-23e80d93926a45f7f7628281ecb18112.npy +04256520-2056de97c97b2c85b759217db94d2883.npy +03001627-a8827a6013e06261e27790b0ec8671f7.npy +03636649-a06089b2d68c974c6273cbd9c7cef4c.npy +04530566-6556015faea5ba45e0f0f0669675011.npy +02691156-96ed9dcc355f3d34585be1dcf6e59170.npy +04530566-ebff6d8111c67fbdb52763715f7a6959.npy +04256520-8a66b03841197e23d93b543e2efc700b.npy +03001627-5c9b1a32f54b12cf81f667e2a25e0619.npy +04379243-2c118800181f296a855931d119219022.npy +03001627-a77b1abaa28588bb926350348c58b8b2.npy +03691459-b28c7b84869ba2aa87d72888c0a9277c.npy +03001627-cd5cc7a5e50478e82b520984c067934c.npy +02958343-bf7efe509caf42cb7481cee66aa2b2f4.npy +04256520-cacb9133bc0ef01f7628281ecb18112.npy +03642806-79ed190f0e35ccdf98ce68842a487b19.npy +03691459-58e73b03f3ecd4a45a31d91ec836a511.npy +03710193-c3b4b8b8e92f77428dd9cfff54e44f7.npy +04090263-10a2ef896a45a682ab379c9b5bf12bf8.npy +03211117-8c4cb4ea7cbd0ff5ad3833a4ccccd8ee.npy +03001627-a8641cd287bcaa2011fd5138fde4c9dd.npy +02933112-d998e75348902a511dff03f33a13aa77.npy +04530566-366c8a02305d2a0f4c9b81664e789bca.npy +04379243-c98eb7f9b2b99702f51f77a6d7299806.npy +04530566-ac2e609dec5745b9e00ca2cd74ddfc7a.npy +03636649-cdb065e1726769ca8cd36201f5f879e6.npy +03001627-4a9ac9e0b3a804bc8fb952c92850e1dc.npy +02958343-8269284992bbd0c886dad8a79e570561.npy +04379243-b59743992b870052255fc74f0e7640d5.npy +03261776-26e186ab10abad8ee6873d49607c1f87.npy +03001627-800dd8ed32104151a37f3fc191551700.npy +03046257-53b0f32afc6cac64f5d4e1af18c85258.npy +04379243-3dc68207126e2e3dd038992c6975ea76.npy +03761084-7cf2f3a1a3de48fda23949c21eddef76.npy +03001627-40cee2893781b47f50f9fc0e2c94dd76.npy +04401088-93556001d266860513ddb059403c66d.npy +03710193-a06df01467d298caac51268fdb437a9e.npy +04090263-ed5cba88deccbeb5a0431d1f46615221.npy +03624134-1640911b9dc0ef0da95c6095f89cd899.npy +04256520-5b5bd4ca75b788c6ece5b3f5f7505a42.npy +02958343-18d9ac72442260e0e97c6bb243ef67d.npy +03593526-789d336e4456d8854dff7c27c1f6df72.npy +04379243-e290e905c015ea0cc58b5b892c704fe5.npy +03001627-a1133464132d65fcfce0ccdae30f97db.npy +04468005-876fb32c52f3753d1cbdffbc1226f0b8.npy +04379243-4a0db050c8703a8d6e3c8a33c4ddf2ef.npy +04090263-d9a07758e979ecca44bebf183fb16c3.npy +04530566-fe09fbe9e43aa889a08db804545b684.npy +02773838-a1822be832091e036afa58a86636d6be.npy +04530566-3fd6e59f9c95a24d88b3e1662276b5b.npy +04379243-21aaa0dad37443f3720c3a14515ab23.npy +02691156-39d7e8e001e0234e8f721bc8b8155d7.npy +03001627-e77d7eb8a4e8f1816f1e07a56c129dfc.npy +02924116-ddd7c100f2c2829b129901f80d24b7b.npy +02691156-30c0995dcb7c10039a6e43b878d5b335.npy +03467517-34c8cf6bc747145c80a2d5cc9f4bea6.npy +03325088-5ba6bb8365b474f773ecd661ad15c4dd.npy +02958343-3645fce32715e0a4bda72093f9b5aa73.npy +04530566-c46b2f2069ce543c4bbcee86e282d431.npy +03001627-6b32d3a9198f8b03d1dcc55e36186e4e.npy +02828884-2cd4fb6323fa2462edccc47bf0dcf5d3.npy +02691156-875c4b43e35b6803a85b9ef94e886600.npy +04256520-45d3384ab8d5b6295637fc0f4b98e88b.npy +03001627-fe307b67739d9620d874a9fab241259d.npy +02808440-e7629f9e27ee058bea7b0e6d0dd8daa.npy +02691156-1bea1445065705eb37abdc1aa610476c.npy +02924116-80b1ea852c8ff6bbbd0a0ca33bfa9c26.npy +03636649-914a91528ef40e7bf7248d9dbed7a7b8.npy +04379243-27ee20b7a7e2467980dbca6e7b64a4bc.npy +04379243-97001433dad08b48e471c0726d35978f.npy +02747177-8ab06d642437f3a77d8663c09e4f524d.npy +04379243-5adf5a7173e588ad76e9713f57a5fcb6.npy +03001627-38bba5755f7d97ee70205dfbbf1e6bb6.npy +02808440-dd6db8928546fa02461827fe9825f696.npy +02924116-59e93330f9fa08344f95630cc18536e0.npy +02808440-3778a4349297e60b44221bef0fa3c36b.npy +03948459-3f5f657bec9a21814ce6ac98dc4781fe.npy +03001627-d32f32d76d7f53bf6996454765a52e50.npy +03636649-792c3698dc7d200144175b4dddf5be08.npy +03938244-b8e55509c5223c09f51f77a6d7299806.npy +02828884-99375af4e13f0b2f50f9fc0e2c94dd76.npy +04379243-eb363770ee36b0309a79b01b89f55c86.npy +03691459-2ae8239afdabc2baaf365ec12406f363.npy +03001627-1f576eefb36c3e189a6ba4499518ef95.npy +02924116-a1b73422396977a841cefd10ce5d6cc0.npy +03211117-6a1e4ab7debcb3f429426a0f57e4d15e.npy +04379243-8cb18fd9c7a54ceb715f13aeb6bde9cb.npy +02691156-85fd79b9fe5948ff62b600da24e0965.npy +03337140-661f24ca8ef19f864c3aee8e9d3a6ffa.npy +03001627-e922bbf8088552badd7092ed47061a36.npy +04379243-77e4ad83f78eb8c3fc8b5999cff24f2c.npy +04090263-6d66b80890d7e5c310a7d517f2e735d8.npy +02691156-9b5a1706223b150613f6b7168403d0e9.npy +03513137-3a12b9c4f7f08b8efac6099f3d4830fe.npy +04379243-f2b3a2f7c9a4ec19436e6787c76ef3f0.npy +04379243-390e0db80fe12ef65fa6da97b9eb4a2f.npy +04530566-325d6d879e306fec3547bc1786bc3b6.npy +03046257-7e2751a46aa8c454e0a659fb66c2add9.npy +03001627-3f4f1d18c61a07f134b707eb14b2a4a5.npy +03624134-7254ae071375f93ee7bd6ca49cbfa087.npy +03001627-878c70bddd336f6019fb4103277a6b93.npy +02958343-868a5166e31428b16d8aac72cf093e59.npy +04379243-435da96586eb1325cc719373d4fe991c.npy +03001627-d48dac046436a29ec3bd24f986301745.npy +03211117-f4d398256e6ec0b4f910da6a487551c.npy +03001627-6eebd118abb1b4146d60aef5fe7e2185.npy +02933112-df74daf1f96515bf9b849da658b46825.npy +02924116-3216f26ef6b3eb7bd01a0e62652f36f.npy +04379243-17c5c22c9ab97788db67d56f11b1bed6.npy +03001627-6f36520144753550f91663a74ccd2338.npy +02958343-d94f5345be1d81a751a95aaa6caba1d3.npy +02958343-1a48d03a977a6f0aeda0253452893d75.npy +04256520-b2ce2532f540cbde67b426838fce979f.npy +02958343-411d95c06a7e9456b3b0f00a15b90e0a.npy +03001627-d5200a27ca0d4a3ea4d56f1fc38d34cb.npy +04401088-5f4937b6e428e4ee122db064a7596ea.npy +04256520-ab1e7ae9a7e9a14a3ddab7e2e0338094.npy +04256520-c2aacd7edbf9b9f98f83f8853be14620.npy +03001627-4353aa4950c32e12f1783a44a88d6274.npy +03691459-3b01bd24d47245289159eab9ccaa73ce.npy +02691156-a93a20767d70220cd3b936925082270f.npy +04379243-8d4fe49d942ec85ff4b6538438a0b930.npy +02876657-59d7b4e7bc3c5d9d99fbba385cc0d41d.npy +04379243-20cdd491a443bc30d9651cd1d591d64d.npy +02924116-dc9c640221f58021c08550bf6ec9e732.npy +04379243-72f501d4168713b9445e85eb534460b0.npy +03636649-f38370fc4c112017a6e7138fdd58748.npy +03691459-b03efb93acd16a49699abba79f165934.npy +03691459-6309ba4b45aa1a648bf9fe7c1fcb7ccc.npy +02958343-ced4053b0616098b7c697c8c1c6e09e0.npy +03001627-209a904959643d0eba7afe602821e0d0.npy +03001627-372118e3595c328c713decb1a0563b12.npy +02958343-8b177994dc29a707e363d824c14767b2.npy +04379243-2a64bd38a4e42f33dc43fde5155b3946.npy +02924116-5aa136c67d0a2a2852470de2774d6099.npy +02828884-33a40eba7b3382f5653e42b6d3d77b73.npy +03211117-60bde4ebc37f9b31473f10e6caaeca56.npy +04379243-962bea9f435909bf3c6e55b962f380e9.npy +02828884-b29e0a7af1f8d51b5c50390adfa8881.npy +03467517-adcb312236c71cdb63e6b27c89da971e.npy +02958343-42e6ce03b361102ab86e0633bb69faea.npy +04379243-8befcc7798ae971bef5d2a19d1cee3f1.npy +04530566-77cf1b9003d904df96bb95f1b1976a40.npy +04379243-2927b65bc7b9561bf51f77a6d7299806.npy +02691156-d6c655a7c97cab8e9f5f802084bd1d73.npy +04256520-8c1eff1f448e33f4d56c79d3df7792df.npy +03467517-73f004a0f2c5e09b1f20024850a8a0.npy +04090263-6d5027e3411b23459a2ee232a197081e.npy +04379243-516c46ceaf6619d07ff6ace05b36a5.npy +04379243-cd2ad198854d47c6e5e7067ae780b222.npy +04379243-40dac9b7b00849366bd83cbbbf17afb6.npy +04379243-18634e783faca47d668ae11a7db5e82a.npy +02876657-32bb26b4d2cd5ee0b3b14ef623ad866a.npy +04379243-24929a5fbdc7682d7fbc060fd555478.npy +03759954-c38c1a3036e7135df50956e9de496e43.npy +02828884-208b5f58f4f45d63ad5067eac75a07f7.npy +03467517-dcb51f940894768f4fc7398f5eb0c5e1.npy +03691459-336fcd767dadec9fb611871e114769d9.npy +02933112-1ec5e12f2b5684a24da5feafe6f1c8fc.npy +04379243-d8a73e0d8fae54c23002761e7a3ba3bd.npy +02871439-4eda0d3b5aedcf8a200ad3f421b6c3d0.npy +03001627-19d3ba04e165e67dcb4387db711dc078.npy +03991062-93acaa40a2d53c726b7154919b02cbec.npy +04090263-1690354ea489c58e493055786e8f9359.npy +02691156-420efeb902ba9c9f47f9199352b2dddb.npy +04379243-cab027dd0162c5b7f1426260885dd0ef.npy +03691459-981abfda92e702e33b9f0ef1fda503b.npy +03467517-eec9877379771abef4493a5b80949ad1.npy +02828884-98d2e8dc90f050d52ef1844825af63f2.npy +02828884-36ac567cae9ab205d4cf0f8e55d6cb79.npy +03636649-c9a464649fb52e99d5cb6d178687b980.npy +04379243-7e5b7032a9faef913c5e1addd9922bf2.npy +04074963-2053bdd83749adcc1e5c09d9fe5c0c76.npy +02992529-267a2d6fbf29c04cbc17518d87dd1f7a.npy +02691156-d6c1cb09e27c3fbce8b8a0b16211ba77.npy +04090263-667772e778d69333e2365746e867db8b.npy +04090263-cbbeaec355a86ba9870906b5178d97bd.npy +04379243-cfb97383aaabd98ead67befd78c3a0db.npy +04379243-d3a55d20bb9c93985a7746683ad193f0.npy +03991062-50498cc86e5eb62acb2a965e75be701c.npy +04379243-6bb09b26c75b70b01c6ed23568095b6b.npy +03001627-b66ef4dd7cd2674f91663a74ccd2338.npy +02958343-9cea9b79ea255dde56ffccfd33efbc84.npy +04090263-72033b782c4f440ffb5c1b0f759e2bc1.npy +04225987-c171d90db4c4ba56cdb1768065dafd0c.npy +04256520-12a0c645e0bb6601ad75d368738e0b47.npy +03636649-f29758075925a871d706ecb3379aa341.npy +02933112-aa0280a7d959a18930bbd4cddd04c77b.npy +02773838-65680f336a50db976afa58a86636d6be.npy +03337140-bbc16b3bd570818be95cd0dc8c2f0e83.npy +03325088-f8ff61c5374aef8672101dcac4ed75d3.npy +04099429-94a4ecdcaf34f9ade07c6fee8d4d96ce.npy +04379243-545c6c30ead2d411e6c5cd45aa112726.npy +04256520-2658567ef94749293784599b9f219d55.npy +02958343-4e009085e3905f2159139efcde1fedcb.npy +04090263-6b06ff0184e3108a4bcc18d4b892312c.npy +03211117-fe314324a1e7e5c967a964feaf6ebeb.npy +04379243-e7c6731436bc2301bf94502f7765c22.npy +02958343-65c067fcae3292d0e7540f431cab4686.npy +02691156-38efd4e4060d8b4ec231d70e1e0cc567.npy +03046257-a29a303f3da335bea64e5c46abb30c70.npy +04256520-3ad0d0becf611ddec6fd9dc5af8f81a4.npy +04256520-711c7f25142a3e2a57253dccd1b3fd5.npy +03467517-95d08e17b620ecdc266e8ccca523895f.npy +03636649-8b6338fa5916b40e7a5d3427f09d950a.npy +02747177-dc7ce614dc719649b394cfa64dfabe8e.npy +03001627-fa172f7f09f785bb492d9da2668ec34c.npy +02958343-c48a804986a819b4bda733a39f84326d.npy +02958343-ec994111db1da0d6927e12317acf49e7.npy +03001627-45039c59b957063e742728b30848ed03.npy +03467517-d71c17b4d1ffa131f10a27cbb87f3a5.npy +03001627-be7ee770ad59ed0eb07bc9fe525caedf.npy +02828884-d74a990634bb4b98ad5067eac75a07f7.npy +03001627-56f9ae090d2fe856ad5067eac75a07f7.npy +02876657-331601288075868e342fe691e18bb5fd.npy +04468005-5120379d6ec5d7e1326fcaeb388e38ae.npy +02691156-b1f40266ad9da400d90bfc986bc4c94d.npy +02691156-85c9fba37bb685d7ca8607f540cc62ba.npy +04530566-cde9d2f6302fda60cd8d9984f3ad2fd7.npy +03636649-4c266f2b866c59e761fef32872c6fa53.npy +04099429-56c13d294f8afb1ffb88d148e845f82e.npy +04530566-283dc6c755398547657a96a9bceb8713.npy +03211117-efae87e53a1fbdf05dc3653f8341633a.npy +02828884-c3f3565f0754f1c910917cc30262fb08.npy +02958343-8bf8a7694267756e3ab3dfa44f5fab01.npy +02691156-b092d523bdd320e4ca8607f540cc62ba.npy +04379243-4fe5fa039fceaa1823eb3ad3d378722a.npy +02871439-f99da003d6daf8743806c49633f7853a.npy +04379243-2fced9721464b4d9c955e5ed03ef3a2f.npy +02933112-6d448fdac1dc71f9c59350d819542ec7.npy +04379243-8480f767da5d68ca9de7cc399bc9b2b3.npy +02924116-c33fa5a2611c9142a680e164a8237975.npy +02871439-722624d2cd4b72018ac5263758737a81.npy +03046257-1251971bcfcfad61624cf22ecb5162b7.npy +04256520-f7c79c7a8fb79212ddf7c7c2aa2325be.npy +04379243-251160ca48f91de7ad5067eac75a07f7.npy +04256520-9571cf49ac1752984ee1dfc331dd3e94.npy +03467517-9c399ebc617349dcd016bd20f13ab302.npy +02691156-d172705764e25e20884a857d19f7439f.npy +04379243-dba86ecb3a5a4d234b3c42e318f3affc.npy +03636649-2cdb96501ab2ccbf35836c728d324152.npy +04379243-4369d61d4409bac0413500ea4648b88.npy +04401088-8961485f45d94383af4ba3ad8461249b.npy +04090263-2acb7ad7112de6c2394e22ae6de2db18.npy +02808440-6751ed8cb63cc76e3321831d2245cf06.npy +03001627-308a3c347dd24ee4fa2713776d82bf59.npy +02691156-9c0431249dd5a50dfaf7f0ef9aa8fd9e.npy +03001627-421746966acf9b175ecd29875b6f0d44.npy +03691459-1788d15f49a57570a0402637f097180.npy +04530566-850d6a53ae03a9aab2640ff8dd6f4f82.npy +02933112-1aa76e87d7bcf5c0c59350d819542ec7.npy +03001627-67d86ed49b1bd1e7af802a9d0ab09410.npy +03001627-b42953e6e55ba5d4d2bc32977ed52527.npy +03691459-267dd5dea4dfa74bd4e62d99c536bbaf.npy +04379243-93fcd3809bc2b9e955f46d55537192b6.npy +04379243-d760cfad1855ef2d35f7fdc3c0cd22fe.npy +02958343-3cdb021c923034c68bb386c7dede359e.npy +04256520-8769b3281dd41c771b17743c18fb63dc.npy +02828884-c8a2ce0e65da4b817b11ae648ea92233.npy +03211117-5097aadb04ed3518f91a08212ded5334.npy +04530566-2e54c2bad5d117994daa4565dd30535.npy +03467517-c4d76ad65741ed1cdf16e78e07c53dc6.npy +02958343-5ebe8c53a7b1f554f445715e3bbcd7d0.npy +03001627-a91b2c89e543a4b3aa3d970c5602cd4a.npy +02958343-1ae184691a39e3d3e0e8bce75d28b114.npy +03001627-e6b2017501b20ce1eff1a662025674bf.npy +04379243-61d9def9b2df3e40dc6f96c9bb9e3ae6.npy +02871439-3fa60816f15b58c4607974568e26586f.npy +04256520-d562328792a3314519fb4103277a6b93.npy +03797390-c39fb75015184c2a0c7f097b1a1f7a5.npy +04468005-6d8ed6218777b1fcda43f9c7d6be09a5.npy +04379243-bac09b6764c6c6b9f4144767ba2e06d7.npy +02958343-ca44101f11f4346a34e8e5a47ae999.npy +02933112-cb6ca53673e681797292641f4348a707.npy +03001627-6214c8ab2dbae2517eaeab1f0c9120b7.npy +02933112-46304273699efb534b8710a3469971b1.npy +03593526-6bce9e16470b57d0c5beea20858a99d5.npy +02828884-5a0468d7c5ce7af6948dd2bc2d391e57.npy +02958343-8f715205d2e70c1ebda733a39f84326d.npy +04379243-3b874fc5f84eff21492d9da2668ec34c.npy +04379243-8024f88aa0136725804722305621f918.npy +04090263-99a3238af6d1b857178b53c3b6bafa41.npy +03001627-731a357bca179804951c1fffab4f5807.npy +02992529-e3c02395e83fefaa42dbe6bfe3cdb29d.npy +03211117-b90e7ec58327059e20327f464fa1f012.npy +03636649-551f8026ff0917c781a172d69c52a28a.npy +04256520-d4c6f2749bd85e9a6a9633583f89b17f.npy +04379243-bf0b9b88be76628440126a5bcf48fc87.npy +04468005-7fd1b974ea23815ba0338a523d3365ec.npy +02958343-3b2e74068fee2458dd1e15301c83686f.npy +02808440-dbbc5c9f97b42166c45c4181842feaed.npy +02933112-a4a939a0bd8f8cd9492d9da2668ec34c.npy +02876657-5c1253ae61a16e306871591246ec74dc.npy +03001627-694d9c2e9e769ffe83221ad0d21775.npy +03001627-708e7253604979d06d83c04495f2aa08.npy +03325088-ecc6eab80e50ea2014b35a7d7cea7130.npy +03001627-58a1e9909542abbae48dacf1789d97b.npy +03593526-7f355d9510fbe2b02af07f81a2ca6736.npy +03691459-16eec6c601ae44c06299da17267bf77.npy +04379243-2cd211982e3293a7492d9da2668ec34c.npy +03001627-9dc1371b6989479c9c0ca344f487323e.npy +04256520-388b70afc2bff624fe7ce990d81a91ec.npy +03636649-c695408a86062c4d242ea50288b3f64.npy +02924116-e868f6184d38be0be8784f880dac0f61.npy +02924116-1b137084c6f7facb41cefd10ce5d6cc0.npy +04379243-82b69c9b72a5159ce76bc197b3a3ffc0.npy +03467517-dceb9450f6d9f0bc171b7dfa253c9cf2.npy +04530566-6bbd0b0e09dd43017ddd35a83509257f.npy +02828884-7ef967a69c03c63dd3a0736b56eaf4aa.npy +04256520-640aadadf4fcba8355f9a00acc25f137.npy +02818832-bb1f8f4efd67582aa4aa57d4816c68a3.npy +04379243-212f9ea1cd96196992f4c88fd91c6b1b.npy +04330267-fdaa15a58a2a6e0d18b188ddf020af53.npy +03325088-21d413dde8e653fc14b35a7d7cea7130.npy +03467517-d50c76c0adf8b657f6ca74c754479291.npy +04256520-52687262fd77ba7e4de2cf65d389c763.npy +02828884-991803aca7fca258b40f0ac0fb9a650d.npy +04530566-e64611b8f590d12d2ae6c39a82bec2c9.npy +03691459-d922dd8309247d10ef94793a67b4c5c0.npy +04090263-f9ee6c612895cfeaf4b4b1b903442d1d.npy +04379243-4f4ea0588e9444be30bbd4cddd04c77b.npy +03211117-8fde0d7ae62ae2c802b4057d350ec8.npy +02691156-8504e370736b26604d210d9468aedaf2.npy +04379243-19708555411f795459a339f8ff4d3160.npy +02880940-c0f57c7f98d2581c744a455c7eef0ae5.npy +04379243-86ad91ef08c53dd77189b31b3e8c8ef3.npy +02871439-cd0563a71a03b69688dcbe86402c7c15.npy +03938244-ec4b9c23be44b35992cd8215a5562ce.npy +03211117-93b702bd7ae98bd16942161d780bcaa0.npy +02691156-13ea0a2ac279dbaa5e9e2656aff7dd5b.npy +03642806-7941f26b5f18d9554ab5d84c066f37.npy +03211117-2b0b8c07582c83d426bb7052f66b6d5b.npy +03211117-5e7034ba47012cf088c7562a134f5ac2.npy +02691156-1bdeb4aaa0aaea4b4f95630cc18536e0.npy +02933112-152a850e5016fdd6e0771d4c079a0ec2.npy +03211117-f0482a9b7084c6f8c83b51ded97d6038.npy +03636649-21f7bf15d2f6a765bcde6f92ef1f7ee7.npy +03001627-ff8efdd26382bb863769fe68c3ec842.npy +03636649-38c6b87674e80ee8515596bfc4f5c627.npy +04090263-e3a1e9f4699dd059d9fa04bac43c622e.npy +02958343-63dceacb54c3c170fc7fcf88dfdc47f1.npy +04256520-3ea28d2184d19410c823a47daff020c5.npy +03636649-f41b9c3cb9243780dce4754e673446ce.npy +02818832-5931f3a3ff29d1a36e07666ce67ff5a.npy +04090263-98ea642f1f50b9686b9603fc5970ab91.npy +02958343-ccc6b5ace9f5164d26068f53fe0ecf07.npy +02958343-7f6031f1738d52546436916a86a90ed7.npy +04530566-677fb8c312d9c5642712ffd807ced208.npy +03001627-4a19f4e47476ee654b3c42e318f3affc.npy +02933112-bd0388dc8384961ccf004563556ddb36.npy +04530566-fa656e5b70f12edcbe7ca2216dc1576a.npy +03325088-a7a2ddaa46155a723970a6f5d8822d49.npy +04468005-99c1749b8ffd4c9d52470de2774d6099.npy +02691156-1d1244abfefc781f35fc197bbabcd5bd.npy +04379243-61128b7cb47e0e6bd6e704b04fd0cd56.npy +04090263-e8931ae7d89ebf11d1c304326f7509b.npy +04379243-d60a5ae4802e7338951c1fffab4f5807.npy +04379243-7dea64a734cc77e6fc5030c2f25772b.npy +04379243-4079aaabaa6451a2765ca89770f206ec.npy +04090263-c3065c23eea6a998547046f04c724fd3.npy +02691156-9ff7d7d71bcf50ff4fb6842b3610149.npy +04530566-64bf2e0712889fb77c1c262c715c9a86.npy +04379243-d37b0328d4b5a9454d9e7559651bb818.npy +02691156-b7b743834a6d78c2225a23c790f08fdd.npy +04379243-9271bb0cab9365d44b3c42e318f3affc.npy +03624134-e6b32b3c927a7fbeae29387f6eb32067.npy +03948459-7681e8a8ba049dcec16b50401ee47ac.npy +03593526-12d643221a3edaa4ab361b6be63163da.npy +03001627-357275196334dc4feaf288f952624966.npy +04530566-91e0e1a6dbf302c3d55da98ad008849b.npy +03001627-42635d55c5905a682672e8af102e0b3c.npy +02691156-dbd589812bda0b1ebab624e35355496d.npy +03001627-1049953406c81b237eaeab1f0c9120b7.npy +04256520-3d95d6237ea6db97afa2904116693357.npy +02958343-f3760c5e8b97149163b803b494079757.npy +03001627-9245c7a6d33320da7b707c797539b200.npy +02691156-cff4a52406b84da7aaeb49542c2cc445.npy +04379243-fca884f9aaea06cc9c1e87e8cf2e52d8.npy +02871439-8e47f2e5ebdd38d8d810b14a81e12eca.npy +03636649-bfeda9055368d2dce76bc197b3a3ffc0.npy +04379243-74f985d5bde29b01dec11b4972c4b3e6.npy +03467517-37e72e4a18a4d0ede2e4961161b75547.npy +02958343-3844e637bc560e6298a55e96872d31f.npy +04256520-5105549b9de890319fb4103277a6b93.npy +02958343-ee0232b37ee6265bda72093f9b5aa73.npy +04401088-271421566061988a93d9d97ff82834ba.npy +02933112-4539b185db32eb4a533276a8c0b1c862.npy +04379243-a1480d2276574cfee6c5cd45aa112726.npy +02958343-d0cf2f187acda5736be7348aa770e4ca.npy +02808440-f9215f88025cf2474258477db4e0c1b.npy +02747177-e48d8446159614caad5067eac75a07f7.npy +03790512-82c8d89f0d15429a17bf584c2afe53e1.npy +03001627-e1623d4ae16bb17989e686021e3387cd.npy +03593526-83e749b6b8a6db9af67a276d485e951.npy +03636649-51b4f0fd600a7cdc580a266ffa083ba4.npy +02828884-b6ab037942cf91c0601104cd2d998272.npy +03001627-ce2acc9d7aea91a0988fec2229ccf13f.npy +02933112-932ae6a9eaca65a03f4b30b8df1dd26b.npy +02958343-151bebc457224c2733d7c9e122eec9b6.npy +04379243-55221b101eec29dc656a19d1d18fdbac.npy +04379243-d1b44c2dc663cca6b8baed360b6cc5ee.npy +03001627-6dc5a07a13fb7dc32ff27b24dc18a6e8.npy +03636649-69ae5e9ce88c9262dd0bffa2f83687b2.npy +02958343-b0a7789537663f7ba1ff2929b2f5cf19.npy +02691156-1e0a24e1135e75a831518807a840c4f4.npy +03991062-23448fc0b511d7b61e66636678929092.npy +04379243-c92ea3f511378ab1e21111e385a0661f.npy +03001627-3010d6ca1b1e8ce3bf54ca9b2f215141.npy +02958343-a74c1aa71334c6af20363e2561dd589a.npy +04401088-2725909a09e1a7961df58f4da76e254b.npy +03211117-cf7294db3c65ca5c945ef919ad31a7a6.npy +03513137-7e4e3a4a38a589232f20449572a3a77c.npy +02933112-9a0013f4e6a0521b5670497a6e548500.npy +03211117-d3bc26796e7fcc6b3956af37bf042355.npy +02691156-34c669182c8c9a2623fc69eefd95e6d3.npy +04256520-f2e7ed2b973570f1a54b9afa882a89ed.npy +02958343-b47d993a5e2dd15e3a3aa1d2d3319a4.npy +04379243-79eeee790ed5a5aac242632b2a8c3129.npy +02958343-63e0df089d6c1442f3aed64053e21b3c.npy +02933112-b1bb6113dcdc8a65ffa51bfffbc09ebb.npy +03691459-e97a846820b094b8f439510dd98d9326.npy +03046257-4f6b01b011b8b21354cd2a0ea6cb618b.npy +03001627-dfeb8d914d8b28ab5bb58f1e92d30bf7.npy +03337140-2a853c2492bc9615ce5d6e9371bb5c33.npy +03001627-f34fea2c05dc63d090984ccce1017e45.npy +02992529-b514d253eefdbfdbddfa02c62bdf0f8f.npy +04256520-b435dc75dfcee77c4b3c42e318f3affc.npy +04379243-d6daf5eca30ca0965722577712723fd1.npy +02818832-90d5d27ab2a94109a043a79379c5661d.npy +02933112-a9bfa9259f31ef9fde650492e45fb14f.npy +03642806-4348768ff9802fc5ce1decf313ece97f.npy +04530566-5702b12bfba4b9eb9223657c918f0a45.npy +04379243-7956ac7aba6295d1c2fd07f66cbad0f7.npy +04379243-3379b29c3a6221d79996b1334107828f.npy +03467517-fdb74c27462dfd837c481698bd5233b4.npy +03636649-3a0719c32c45c16f96791035e86a30f4.npy +03001627-74e14880b5aab8e3490ad276cd2af3a4.npy +02691156-b87185699318f4b635fc197bbabcd5bd.npy +04256520-aa2e8a77de22165ffe369f4f96683f52.npy +02958343-1ed012d3232de232473f10e6caaeca56.npy +04379243-414f3eb4c4de757cdc97baf002c8189d.npy +04256520-784b4379cc7e74e14fb315ce917a9ec2.npy +03624134-daf2098f026e292c152b5e07600b5ea7.npy +03001627-68af43642fa145115029039df67c2549.npy +04256520-9aa38ab7fabbd6becb6924eecbe974f.npy +03325088-7837cd8d1e5e69d4b362845c6edb57fc.npy +02747177-22f7580ee1819eb7fc435963bd99e667.npy +03991062-90dfa95b34f3a84b6777543134f0db6.npy +04256520-1442fc6ef6b82c8ae1da81584e31b667.npy +03001627-67ce9e1ac8e41027bd16d4490a10a752.npy +04379243-7aadbba28333e40a77e6105b101d7310.npy +03325088-13e1e13465fa1a67b362845c6edb57fc.npy +02933112-8b188db0cd8ecb909f076a53721d9427.npy +03636649-ca09dc8016291c171735ea0e092a805a.npy +02933112-1459b403c084a33e7694593a26340e.npy +03001627-355fa0f35b61fdd7aa74a6b5ee13e775.npy +03337140-1ba863365511363a91c352d02061b3f7.npy +04379243-a257171096faa6252ea98d69e91ba870.npy +04256520-147a9f656054d718e10a48f2bbb9bef4.npy +02691156-78c3a29d1153e68e5fa2a5df3ce5bc40.npy +04379243-cd5f235344ff4c10d5b24cafb84903c7.npy +03790512-de1f30fbebaa2cd675e2c647bf7937f3.npy +02828884-48c9e1679ada2949fd8f87bd7d4c2514.npy +03001627-3ac2da28e9a2f547ce4f274577283b16.npy +02808440-bebbe478c5c2d44e44221bef0fa3c36b.npy +03636649-9f8c2c2c3b9796654b3d6a0fb5682cc4.npy +02691156-43beab0c1cc46ae641b5a73cd6c05ccd.npy +02933112-d0af907a612856e964b62a9cc93b56f5.npy +04554684-622d6f378276a09b8fac6a8030e15671.npy +04379243-e27d9fece990d39a0f23466c3c25e2e.npy +03001627-438e57bab04de55e8544f4ec4dad7a5a.npy +04379243-810c87b90f7dc301da9bd441f1db1dfb.npy +03759954-91db799921bc0241c040d6dbf5370e2f.npy +02992529-f420bf37baaeee5621844676433a0aca.npy +02958343-92cc3ad1d3da26955fcb05674109534a.npy +04379243-ed9dc0937009dc031311158f08f2982a.npy +04379243-61b6b273190637e5788a7b7b4713dbc6.npy +02691156-80af162c0c01f27c4f8a08a5e6b028e7.npy +03325088-b68106b79d8b98b95268c5e200a25358.npy +04530566-7b00ce37add93f06ffbdd9e9972332a7.npy +03691459-7e105d770e297ee43dd0d6160c4dfd18.npy +03001627-7effccaa74122b5f2beec56b24479ed1.npy +04530566-5c6c725a75645a305de2c7f7608a946f.npy +04256520-3d498fd733de605a929a5204e472930b.npy +04379243-88e73c92d8d5195fb8b431083b6191e2.npy +02808440-93b1dc8aa040da641f6566a4d01370e6.npy +02958343-1cc85c2c1580088aad48f475ce080a1f.npy +02958343-728f6f29382b70053ce4e6f97016bd5a.npy +04256520-1b25f96d97a94b05125abe33bf4f0061.npy +03001627-5857dfefaa1b6d071d9fd76961a98198.npy +02924116-c7bf88ef123ed4221694f51f0d69b70d.npy +03001627-895099e136437cb799860e9353bb52a1.npy +04401088-21a7e90867b64433316979ee2b237f2b.npy +03001627-ce95fa90122dd67e5935ba184b9bc177.npy +04090263-61c0df4a0db0a32fe73c917c8db80e59.npy +02691156-48df2496242053da4ee0fb6a51564c3.npy +03593526-166c3012a4b35768f51f77a6d7299806.npy +03636649-c211f82e84eb62bb776f01d35517da23.npy +04090263-e3230062ee3def46aca1893e093d31f3.npy +02958343-18cd6293d7b17a698ce68842a487b19.npy +03001627-8a85b0675605ed8219fb4103277a6b93.npy +04090263-e0b23c80cbe3a2d8fd8c7a1bf5db0aeb.npy +03211117-51fcf8537a132b789058e0e56fa89a94.npy +02828884-7f418f4737d4a7339702fe80e90cab1c.npy +02808440-33d2b4361e3fcecfb340943d9bddb446.npy +04256520-36f4fa1689803b442d19175e7d19b7cb.npy +03001627-4a783b2ae8fba8b29dcf2183c858e6e5.npy +04379243-1307c27c3f1d1f7a895e947287fb0c95.npy +04530566-c991fc4636615e64ed01ae0c90548352.npy +04379243-794dc333392caee153041c49040be3d5.npy +02871439-b26b03578ceefc20f9c0f9cbb10e38a2.npy +03001627-1b83311557e48d6328145ddc1e2c18e1.npy +02992529-1bff7e425c06b65af431996b7f8b435b.npy +03211117-edfc3a8ecc5b07e9feb0fb1dff94c98a.npy +04090263-ffba44e241dfb481efb47d8e2c9f3b57.npy +02691156-22831bc32bd744d3f06dea205edf9704.npy +04090263-2bdd7783684aeff0f3ece95ce0e0247d.npy +04256520-50766e42adb211675e0d6e917505f52f.npy +04379243-aa8f7d94b5aa9cc1f9ef5ec0bb70f1c.npy +03337140-a0cdb98dabb459f7b8183a4a81361b94.npy +03211117-41f428dfe76c1788957b752c832ca929.npy +02818832-f10984c7255bc5b25519d54a714fac86.npy +04090263-6d026044f6c68821de698295f9180ced.npy +03001627-b8f2712e8330ba6b3c9fe3a963c6d73b.npy +03691459-de41e90d949a21d6a41c66e27a37f014.npy +02958343-1cd50bde9a3e711637b0898eccd7168.npy +04256520-da77fefef637adc26eb9b08c8a74d159.npy +03001627-dfae4f9155877a1ef57b53e86a4ec824.npy +04256520-854ded41212e767c12132bd78ab15cd5.npy +02992529-c864337d009c823290a9c3b0b32f8569.npy +03467517-a39dcefa599a76dd93f0194265a9746c.npy +04379243-4442b044230ac5c043dbb6421d614c0d.npy +04379243-edb69ee3e3e66e9bc242632b2a8c3129.npy +03211117-f1a3e41b45de104a810988cb5fefedde.npy +03001627-7ebbce44a6001e71268677b0fbb8a262.npy +02871439-e9b41b47c97866b7e76bc197b3a3ffc0.npy +03001627-a232eec747955695609e2d916fa0da27.npy +04379243-9b365e622638616d58df8eeaf3dad1c.npy +04090263-9e43b09d2c4115276f21883e4b04581e.npy +02871439-e3738af2b535ea36ecf5e8796652a83c.npy +03467517-a60209a0df7a3c87282aa382fb875f4c.npy +03691459-f663176a43096b35a43ada367b02a4fb.npy +04401088-235cca962513b7a7629cefcc54d102ca.npy +04401088-2ef0e93ce68dfa74bd1f358005ee8ea2.npy +03001627-9d81bc691486a3c725bc9a8086ca05b8.npy +02818832-74d5ab41106d27a8bf6d866879baaa7f.npy +02924116-43c425087cf9d73352470de2774d6099.npy +02691156-6296558889cbcba8faa7ec7d870d2e09.npy +03046257-f82e90f8a6d49827e8784f880dac0f61.npy +04090263-9b19164c5b17f3016da79efb34b8c0b4.npy +04379243-ef9f3af9b8453613febad4f49b26ec52.npy +02808440-fffe3ce4db102b3254d7082b34825ef0.npy +04090263-1e62da4891f2021d950daf47e5ba3cf.npy +03001627-6bb6b27aa687d422d612b1f62c413c3.npy +02958343-42147d774e08199564c7d8ebbbb68f5.npy +04379243-a2cf3d4375a5c6a65dea31ce253437e6.npy +02843684-524610c549c74ff64197bf8bf6f07b46.npy +04379243-3f5497bf65ff9b91c48d90eef8384210.npy +04401088-83f766eff3c5c12c781fb7da315db2c1.npy +02933112-851274c7a38bedb5f55057dede601621.npy +02958343-d05aa55f9e5b4d10afe1d4530f4c6e24.npy +02924116-e299444f1a4c7457fa9ee9b3a7eba069.npy +03001627-eb9851403aca75937d395837145ded71.npy +04379243-a4cd409ceb0aa148d93cf5f5bfd78ab4.npy +02958343-294331fc6c86a51ec805dfe4ca9f2fdb.npy +04379243-7cfa4ac4e24cd680c3bd24f986301745.npy +03636649-199273d17414e77ca553fc23769e6051.npy +03001627-52c32b187590e8f3bba5aaac798c64af.npy +03636649-6f6a74a5528a7b5d88e7662971dc736f.npy +04379243-afa90f39238804b35778775dfd5ca46a.npy +03593526-82806d655bf46d8793b839ea777587eb.npy +03046257-3a5351666689a7b2b788559e93c74a0f.npy +03001627-4fad9d9b2c73cccccf0517eac2f2d331.npy +03001627-c8166f63964058199947cf98084faa8.npy +03211117-d911b390503a11f96436916a86a90ed7.npy +03691459-34fec404bf5a83dc8fe1b374a74b9d43.npy +04379243-9c162d575505f102ad16260d4d73b56.npy +03928116-47aa44d818a406d822d6b12a61cbb9ae.npy +03211117-2be8c8104d0025ba74dedaf762719321.npy +03636649-1845801e19ac5c22683869a26110a529.npy +03001627-b960544cfd0ff09f26b2c6e6d8c1e1ab.npy +02691156-deb9d02cd1eda25270c4138179d9ed97.npy +04530566-d6cf4f71059b98a13d9a3c3392922df1.npy +04401088-987662da7f345b272b1c9d869bc37167.npy +02958343-c299ad24d291a4b6756936223b42a971.npy +02958343-7e65e7db2b227946631a8860374e7eed.npy +04379243-fcc0737ae08a9cfb63eca8f941f00cca.npy +02691156-d84bb293898861ed9b2acbfd8323f804.npy +04379243-80f8961877a467b23002761e7a3ba3bd.npy +04004475-361e69779293348c7cc896d3ea5ca772.npy +02876657-f853ac62bc288e48e56a63d21fb60ae9.npy +04090263-27326efa9e84ca6aaf365ec12406f363.npy +03691459-c1cc6f59c8c6406df64115eb33ec13b.npy +02958343-e899ede8bbc146278746a6bea8ba48d.npy +02808440-d171a949c9583599ca972daa503b3095.npy +03001627-840b73e5066afa12941584a3d730ae7c.npy +03001627-2c351621045e25351385913bc50a0210.npy +04256520-3535ee6f6b070f07a1989a802607e7f3.npy +03001627-f1563f3906ae14dd32b8e0971fc6a65a.npy +03046257-64f72d2cc5449a28e2334ed17f235e6c.npy +02828884-e2e528622ff47c32cb2a965e75be701c.npy +03337140-6633b658534938ded02b906026bee536.npy +02958343-5ec3322293a39816ad7e7cea4034d226.npy +03642806-76ce3dd6212251d34145b5f47fac09a5.npy +03636649-ecf9ea749680ae432d9c07d3b9171829.npy +03046257-53aff981d28b365ec5996c1602569cba.npy +03001627-e6328c1bb6b194f262e682c9809bff14.npy +03046257-412bf74d9811f27dd06c8fdd4cec77fd.npy +04256520-dfda3c467eb6066fe6fe3612af521500.npy +02958343-ba494b33be3a3e0dc1bbb501b1d87871.npy +03001627-61d29e8133da0b58d1fd43e2bf80195.npy +03991062-5af2910a3b96af5cd2b12aa6a0f050b3.npy +04530566-7a3ad44b854faf361f377e6c4dfe0096.npy +03001627-bd3941eb3bcca6ad9055f83d11955109.npy +04256520-592e8295672e1419e82c020151d41155.npy +03001627-7f6858bd9d4af9df97316612e1a4343a.npy +04090263-411de9a0a7a8e3e9a0d6b294e290074d.npy +04225987-619b49bae27807fb1082f2ea630bf69e.npy +03001627-ca2294ffc664a55afab1bffbdecd7709.npy +02992529-2f468e01f4fdcb54d81a607e3ac2f927.npy +02691156-b2dd8a3e977d8e5f23c640e813cbc041.npy +02691156-f97a48680d63a78a9751e413d5325f7d.npy +03085013-80512f14251fb8c94f0dfda6a4916221.npy +04379243-bad7911965fdf1786487ede8a6f074c3.npy +04379243-24732a80e4b1a44282db9fca4b68095.npy +04090263-26bf4f71d7c24af87ec95138ef83ef2f.npy +04379243-3a069fc75bde2735aaa6ab0dcef7c556.npy +02691156-926749549b15941e6455d739a5cbd8d7.npy +04090263-3151db7f965943ef9bba8f87a19ff3bd.npy +03001627-e9a8c9067bc733ed95bea7c29e873d16.npy +03001627-e5ea39e2b4c28ea2a8df8437731d97b4.npy +04256520-fe154cb3a5dfdffc5ae252905262c0ed.npy +03001627-c571ff6f3231fe861e1a7bd9d68b88a6.npy +03001627-27923c3fde05f14b5ea23a116671b38c.npy +04379243-ea6b9474514df497febad4f49b26ec52.npy +04256520-4ed802a4aa4b8a86b161f36d4e309050.npy +04379243-a5815741cc777e643002761e7a3ba3bd.npy +02828884-be125cab2902e0e163b2acb037dfbcde.npy +04468005-87b7d76dfdc7433552470de2774d6099.npy +04379243-3d791e306d7ae620b3b8d66c43b5b940.npy +02924116-f9cf9ccaf5491830ca857150e7faab.npy +03790512-56f5e30ad65f01561c6c61410fc904b.npy +02933112-33ec57af7f648994da5feafe6f1c8fc.npy +03928116-88f854b66978d1c45caaf941a8fac2d7.npy +02958343-84ffded0ab4b499588ed7b6315c3b4a.npy +03991062-3dec5904337999561710801cae5dc529.npy +02691156-5cd19fcc882cc769e8b0cab853748d53.npy +04379243-743d8382aa44117e593ebeeedbff73b.npy +04468005-f26e122bb890e6ee810c01b1498aa2b.npy +02828884-2974b7f87eb2297ffebad4f49b26ec52.npy +04379243-fbf9ef8784c0cb8485c1a9fb01e08349.npy +04256520-fa71486d68dbe48bf27b78f69ac93684.npy +04379243-8cebe5dcfa2b907f47c638c0eee4a2b3.npy +04468005-2c1478b556f8cca752470de2774d6099.npy +02933112-12de47490769694e490ad276cd2af3a4.npy +03211117-6e3fafd33a4683d1fb0a4dd466ef3d66.npy +03001627-b8666dca76b418e04c9bf8fa5a14f3be.npy +04379243-738e5983a229c432db984b8f0550fcd4.npy +03211117-2c4f9415edb358adb71a0e5ffd778fe.npy +03691459-2750caf7565977341ef58b31c4ba0d15.npy +03325088-9f4ab72b17226d3d843f813f752a5e35.npy +04530566-54da496566d05afb568b456e2715b08f.npy +04530566-fd488ccadbc89bc7ece8bb633fd3452d.npy +02828884-d6580bbf1220d39ede270fc3c23d78b.npy +03636649-ed54691cf655a8a3b3a8888e78d004b3.npy +02871439-3c5225f973732610664b3b9b23ddfcbc.npy +03991062-54fdf8d25110bb95993afecc2c675915.npy +03761084-fa70f7c905cd59294d895026cd5c31a3.npy +03691459-ee6445b3657504053839b8b68c69081c.npy +03790512-86a247b7f3be38957395d58407f193ba.npy +02808440-5f2cd0c8c02d7557bff8b2d517ae4561.npy +04379243-6e23179a3559775a65eacc25f128a1c5.npy +03948459-5b2c7491683bc482fdd247fb557dd75a.npy +02828884-a5a9a0be36997bd82f549c6b85154162.npy +02828884-1b80cd42474a990ccd8655d05e2f9e02.npy +04256520-41f47dbde823f29640d304b02c5868ea.npy +02924116-d5a6bbe13a5781761afedc87fe387fe.npy +02958343-63069a0c741a4d228b7c308bd543da59.npy +03001627-13fdf00cde077f562f6f52615fb75fca.npy +02808440-e9c2323050d30491b362845c6edb57fc.npy +04256520-cfa5feb7486f88ee1b8fe07f15de05f7.npy +04090263-69240d39dfbc47a0d15a5887ec2183c9.npy +03001627-43849351a4da550b33d93f57729688db.npy +04379243-656aefa835e5f6624b3c42e318f3affc.npy +04379243-6ae5a011c8724eb5c3bd24f986301745.npy +02992529-95e61ab6f817d7ffdf3f86c9fe70c0ad.npy +04379243-33857c2548cc653ba53276bbe109327a.npy +04468005-840a2e6a291049ad85b408a8edc983b.npy +04256520-126ed5982cdd56243b02598625ec1bf7.npy +04379243-f12210d97248ee00e3db80a3cacc6e3.npy +02828884-c57b336bd865c0907b20cb946bceb58f.npy +03001627-9f9c83f3014f19c79e4965f0106e00d9.npy +02691156-10cfc2090a2ade124c3a35cee92bb95b.npy +04090263-3a3c0edd93ed40d35a39b667673bce58.npy +04379243-a253b171a28f3ecdb781d9dcb8ecbccc.npy +02818832-24abc08487b7d111259864675d182396.npy +03001627-e9c344a392e311195b903ba10d2ec446.npy +04401088-9dcc24af7e0df254525b3f0594400a46.npy +04379243-e8afe4f07f221087620018391309f97.npy +02924116-29c4c3d205d4d1dad4ea1a05271e100f.npy +04379243-27008d8569ba4426f577ff4de1ac394c.npy +03001627-688af6f43377f16bc3bd24f986301745.npy +02691156-23f911351a5801aa46555ee25941a22e.npy +02801938-814bba8e48083abfdce1af5c27e3da18.npy +03001627-436ed3a8e05baa0d492d9da2668ec34c.npy +02958343-b3f1ad55fa401c35e8c505ac322336cc.npy +04379243-2517066dc728ebb955dbece39a4b7905.npy +03467517-6f52e760ce1d8b95fe2455ba3d942ef3.npy +02933112-63397b0df482d51ad7838dc22b16368e.npy +02828884-ecd56b7b86c4d94ad1f278e1513f3b7.npy +02747177-ae3257e7e0dca9a4fc8569054682bff9.npy +03636649-be02ef97e47b86c34e3474b03483338.npy +02828884-bc1261eb081cce07467f6a563eb9f7b2.npy +04074963-1941c37c6db30e481ef53acb6e05e27a.npy +02958343-50f4fff3a26ea3518b3ab49d2e0e41ab.npy +02958343-477ffb061f40e10e148f8c864a546424.npy +02933112-8f55954a0b07a4b2bf64ff63662d244b.npy +03948459-f4cf735786b69d7a5d0dded52efeb4fd.npy +04379243-a24af284041888bd5f05ba8053abf6cf.npy +03691459-c280153b72c8e8ff571d223b2b8e4a24.npy +03467517-9e6221cb3421a1a1082f2ea630bf69e.npy +04379243-8483abf40b0b4a65d009c98a5b96836.npy +04379243-807c73aa0a556bd496a3517f50eeb9f4.npy +03001627-7c7b4bdc2fc34ffdb398ef956214258e.npy +04090263-30c4a2e9a403c9d9d7cad6f9e585deac.npy +02828884-c930760585e923cbdeee898eeed8aea9.npy +03636649-9c3646d9db630e1d6bab719bf4ec73ef.npy +04530566-8497e02fa1662113776d8bc79b9caa2c.npy +03001627-54b7d484dbad29cdffc6e457221b9271.npy +04379243-c5480855c540290ecb922bcc33df0268.npy +02958343-89026c748b9cf721bda72093f9b5aa73.npy +02876657-fa44223c6f785c60e71da2487cb2ee5b.npy +03046257-75b2120c563d66edbdfa5e0753fa3240.npy +04379243-4a11c4ed20638d74c3bd24f986301745.npy +02808440-401637cb32f0eebb2b8489ea79093b09.npy +04530566-ddd02c6fb780d4f6c683d3e7114aaa37.npy +02933112-2b376f6dfed75d53684b7bc3f8a9aa55.npy +03001627-46d7e85d80411f50a094848ea4d06501.npy +04256520-e5f51c7ccf8ec35d2f134420f7b0d7e6.npy +02691156-934dd5529c22cd05bc0909d98a1ff2b4.npy +04530566-cab7f319f0b3cf8e57e59e0ad2d11e74.npy +04379243-68680849282fb0be21ec2f83d790ab97.npy +03790512-fbe400bd5e06d541617798af67b81f2f.npy +04256520-e17c6810519ba81a559916e9a5177b0e.npy +02942699-6c14c6f6cca53a6710d0920f7087353b.npy +03001627-c42b305fdffad7c9cdc9f3b79a373ad4.npy +03636649-9c11cbb88d574584c4f1f36666bc4b4a.npy +02958343-6f3887b3b8253284de541e973ae662b5.npy +02958343-7da7ba42dbd0a0f9be40bb45ea25a041.npy +02691156-2636cc55f0bee49671d03b466c72ce41.npy +04379243-fed49ae8578b251d9e5f3db95fcbc5c7.npy +03636649-98f1dd4a250a906fb5fd9907631a04b7.npy +03467517-b2861185931876e1e1f2a1daf140ac9f.npy +02691156-5c4095795aad447f7301f2b895d332ac.npy +03790512-973d75ed9c12836f3d033e6cf82ec72c.npy +04530566-da73f51f17f0a8bfb0d00cfc385a039b.npy +04379243-59027dc9bd7a066ec031b2e122ae5028.npy +04379243-687c7be604090bf89cd431573238602d.npy +03001627-588dc044970bc56f3a4a5c95fa1b0032.npy +04379243-9a71b92445cd3f023a9bc242c86fb7a0.npy +04379243-bd27680b9f09262bbdb2cbbdf53d8900.npy +03001627-74e6ecf3201874777954eb05bbab463f.npy +02876657-bf73707d87715aa8ad5067eac75a07f7.npy +03001627-7e5dada1bee3e6dfca76c527f185435c.npy +03948459-d1ba405fef56efa0fa29682ba98e856d.npy +03001627-77e84b5e6526be75490ad276cd2af3a4.npy +02933112-aee149ff795d5a7ac59350d819542ec7.npy +03001627-436be9df788b706fb40f0ac0fb9a650d.npy +04379243-142060f848466cad97ef9a13efb5e3f7.npy +03001627-b07c1560f5c3bf20525319ccc5eeb31d.npy +03624134-a782251f2c38b909bb4cc32522c2ea6c.npy +02691156-67979ab8dc522028788e57551eae0744.npy +04379243-3604b060233bfd79bd08524bcb66a009.npy +02691156-34da5dbfb4bead034c3a35cee92bb95b.npy +02933112-aa28deb4dd304d12f51f77a6d7299806.npy +04530566-f9cb8429f822b8469ae563bb6367e47c.npy +03001627-6b7a74a6a77b0699c3bd24f986301745.npy +03624134-3cbec0d04a115d9c239ffdb3f2fb535d.npy +02691156-a51d836a9349b2a1f42bc0eea174f82b.npy +03211117-c62af9a75f8779b82b8499d50978754f.npy +03001627-36ee2823173fecc8d22730b0728b2fc9.npy +02992529-61424998613d67b75ef3453134070b3.npy +02818832-7c078d8ceed96b2a115a312301bdd286.npy +04379243-27f9965a337bf46d85924458b86f34.npy +03001627-7715c9c229d80afaf487e71bd57b6e0c.npy +02691156-97066012fbca5983c74417871493eae8.npy +02933112-216096d5038c86a74c62bee40dcdc539.npy +04090263-b6b6d7cbe981d57276c3d558130f8b4.npy +03593526-76ffe67d67948975464e3094da7d844a.npy +04090263-705d24724cf1b7fe4fb30f5124687748.npy +04379243-69a96a236eb59dbb4594f83fd12bcf18.npy +02958343-61b40cc1d7e054cfaeea7738551d104.npy +03337140-2d418ca5fe05f2534c3aee8e9d3a6ffa.npy +04530566-4ecbd1471e916cd6c1ae34bcb12af75b.npy +04379243-58160ac529c37aef1f0f01a76c5ff040.npy +04379243-2ae89daf7433f4d14b3c42e318f3affc.npy +03261776-f5d210ff14ca9d29b6d9c2cee7f2f72b.npy +04530566-f2192f3c34a877f1d01eaac447e2e9b.npy +03001627-e60f50cdb48c2626d61bb0c6c287d278.npy +02828884-1ffcb829779ad5942056b4bd5d870b47.npy +02828884-dd4d12077d16512d8ab9e8dd82b356fd.npy +02992529-a6b2c1427dec317525bf2427892579c7.npy +03001627-c00d5c9b043b600019fb4103277a6b93.npy +03636649-3fef4c8dca9dd0e0dd4763fce8a9da20.npy +03636649-48cde19fa1d6af1653b336293441aa49.npy +04090263-12b346d7a60328ba9be47ac7c7e37815.npy +04468005-17407a1c24d6a2a58d95cdb16ecced85.npy +02691156-752a0bb6676c05bbe55e3ad998a1ecb4.npy +03046257-978541d6924dd42d7b0f449c7fb27872.npy +02942699-8b4f63046ee3bf99373b92b376321e13.npy +02691156-99656ff9d5a8a0fcbc0909d98a1ff2b4.npy +03636649-72ba0dc1fd49c2b5eef5d83b671bb264.npy +02933112-4d3df5ede83cd26e661673811de66400.npy +03636649-db447b84e1a8d8d6ba5342d638d0c267.npy +03211117-7fac92e1ac6e11945f6762b47fc0ecae.npy +03797390-187859d3c3a2fd23f54e1b6f41fdd78a.npy +03928116-8d84337557ed610533cada922154549a.npy +02992529-6b9cd9c72e69fb81d8630b8390e34e0d.npy +03991062-6e7a46fa4a22f5cbf2b931201029bc76.npy +04379243-da0def87fd8cd658da094b3bbad5f5e4.npy +04256520-c69ce34e38f6218b2f809039658ca52.npy +03642806-7312c9dc3c2802e926db2cd5ecb2df2b.npy +03991062-630aea241cb0ec8f24cedf205b903c2a.npy +04379243-f9c98f76522d375d20bac10b01e55c85.npy +04379243-2d52675c865f669047bc3701b998a7d5.npy +04379243-5b100f548ae5b162f51fa0238791f5dc.npy +02828884-43e72408630a790181faebbdea6bd9be.npy +02828884-8b9d37a08dc542f86f4e61e20a3631d1.npy +02691156-641af2da275049936cc53f9d72e7fec3.npy +03001627-6272c21e439e0205c8687ff9b0b4e4ac.npy +03636649-be61621254d82a6ebb40b038e5e0b7f0.npy +03636649-9a9aa982c0667012ce11183544874734.npy +04090263-61403e9bbd37636385076c97ccb96169.npy +03046257-47aacfbeb77a977b6463df620b7b4cbc.npy +02691156-723921d0060203a344d33ea02fa0f619.npy +03001627-b67232c18d00fca7593ebeeedbff73b.npy +04090263-727b9b62c52fd7d6bf36cf6ce284411c.npy +03001627-8d3817ad88a809524b9112ce9ce98204.npy +03001627-a004ad56474501f67eaeab1f0c9120b7.npy +04379243-f27a1f3db59556cba0ab1d82ef09f78f.npy +04256520-d906d689ec1edccffebad4f49b26ec52.npy +04468005-e55bf524949fe29052470de2774d6099.npy +03636649-e37796d40348fa5fd8013bb984303089.npy +02691156-b94b4edc5e4701093ba0eea71939b1f2.npy +04468005-d7ac71c003622f4d9954eae9164faecb.npy +03797390-9c930a8a3411f069e7f67f334aa9295c.npy +04379243-ab1d67b6f09b35424ea2d70ab68cd1d2.npy +04379243-a3e030b5fd13158d7a2166c62eb7eb3.npy +03636649-9534d5751fd1ed574cc30865d6337b9c.npy +02691156-d16405b7a4300014ef5bed0139d3780c.npy +02691156-3badd7765618bd66a532a2f6f060af39.npy +04256520-b3d686456bd951d42ea98d69e91ba870.npy +03636649-65f11c0c8a86a8ea9813dd6c977cb17e.npy +04379243-cda92b4188af3a17c03a563a9407c5ea.npy +03001627-b93d170448493717c2b64c0adffbe398.npy +04256520-c05c058169a31a19b149830119040db5.npy +04090263-dd9586cd8cc762dbe43969badba53c7b.npy +03691459-799a7910c5084f1a799c6c3b2fff049.npy +02747177-942887c8d668501681faebbdea6bd9be.npy +02808440-2b535c15e1baec23ee2de8169f41c6e9.npy +02828884-fc7785be580a926a3409d1e6da3f019.npy +03211117-d3193b07bd166c0611e348ae03a757ef.npy +03642806-6da67be7e83afd3be3b927dfeefbac4e.npy +03790512-2ff252507b18ce60cd4bec905df51d1d.npy +03691459-b7acad8df6aef539a35fdda2e8d5933f.npy +04379243-bc23348d2f16d4237155483601ac0c56.npy +02958343-d83fd4f79f16a1313c9d2d3d4dc0edb0.npy +04401088-c864337d009c823290a9c3b0b32f8569.npy +04256520-9805e011defa15f37fbc060fd555478.npy +02691156-8eda6d2dcf9302d2d041917556492646.npy +03001627-3f5f14f6156261473b194e6e71487571.npy +02691156-5cfdb557f5fedd51adb50624aa91e8c9.npy +02747177-e3f87ceed5c45b39eb0ce5843fe6b264.npy +02747177-3b4bc00820afb447ad5067eac75a07f7.npy +04074963-3039044a24972ae37bdb91f66fe1a363.npy +04379243-4822e02112a450f593ebeeedbff73b.npy +02876657-9cec36de93bb49d3f07ead639233915e.npy +02828884-7769891a8af54054bfde7937440ef438.npy +03467517-3824a2336972d144a24eeca91f583600.npy +02958343-a5c969e3401228d2c92e66330b5ca173.npy +04090263-dcc4bb465d403801e1f2a1daf140ac9f.npy +04256520-55bae67315330e0f131878391e12e811.npy +04225987-ccc91585d5d614a3ad3e04762b7c31c.npy +03691459-622a9789d1eaf6e3cf56355417e88d12.npy +03001627-74615c2f7098738ca9764f2d2db668a.npy +04090263-8cd9afeb654c89b8fb5c1b0f759e2bc1.npy +04401088-db058088ec098d9bdfbc59eb47b047b3.npy +03636649-5270f973e56a05f12cd2160e449d45ae.npy +04379243-1cc337d9f3f6d8f47f45370489ca3156.npy +03691459-993d30ee5f04eb7bc41d2caaa616b8ad.npy +04379243-953ffe955229423213d2510999d0f1d2.npy +04379243-2c9756c06606c05bfa85bd040b2a2468.npy +03001627-473a9ac8376e5a15ae0b06ef692d1ec7.npy +03636649-a5a31ea56d8fbe0a72ad95ccf7316565.npy +04379243-48a944dc8751ca7531370540942e6ad.npy +04256520-fbcaa3c4d17b8b7c9b0790357cd0493.npy +03001627-55e1cde05a99f6c7d1d34366ca81fb3b.npy +02691156-8f40518bd30467151e5ae32cb9e3711f.npy +03001627-e0a473eb557c424320768660cf080d12.npy +02808440-d0c3bf270f9e04eb362845c6edb57fc.npy +04379243-1d9b72020d680630bbd4cddd04c77b.npy +02933112-9304e9ad9853d1caf760390d600fe7fa.npy +02924116-4253a9aac998848f664839bbd828e448.npy +04379243-4e46ec6d0826e4525228d12f1858463.npy +03001627-cb87604cf146b4eee897810eac8c21be.npy +04256520-cd1086902b5eb749f51f77a6d7299806.npy +04379243-43b3d26626b7ac54b35c92fbf601983.npy +03325088-981c79da1f3dfc3bc36fb70296e45483.npy +03691459-1a1ff0c5f28f10d642e265df80f79372.npy +02828884-e27ffabfdcd52e7dfa11d00fb25084c8.npy +04379243-9d873d1e7403e2c825971c9167623d21.npy +03211117-cc3adfb500c1d443b441e189e5a85c02.npy +03636649-94af43cc530f8c4649244b68aadec703.npy +04379243-acf4b272c86a011fa0ab1d82ef09f78f.npy +02933112-44d195279a116e347eee615e75bc3b77.npy +03001627-7fe64a3a70f8f6b28cd4e3ad2fcaf039.npy +04401088-c6f62eb51d1750497dbf89b54afcec5d.npy +04090263-874cc0d822e74148b88eabc621107e4c.npy +03467517-8d35e1d412f3715469da8e7f9a803d12.npy +02691156-6a868213168421c6f0985368fed75674.npy +03325088-aeb9d0a78ee06f6e2b3e9b6eb52d35df.npy +04379243-c5fc6c1e0d446d37acce1c6e70b58979.npy +02871439-af326bfd00ac8edda9d79518470babf0.npy +03636649-3766b272cd3836cf28699debac30ad6.npy +03624134-5d3549571f699f8dcbac9c2913bca39.npy +02933112-5f7b88ac9256976cc59350d819542ec7.npy +02871439-a98efeb82eabc760defc4117d86acef0.npy +02924116-56767c32a4f01e2c83b8b9c448a35518.npy +02933112-3649b02bd61a337321730ef9c9d28bd1.npy +04379243-cafca523ae3653502454f22008de5a3e.npy +02958343-dbe713c83afe559316abce8cb03e7794.npy +03467517-9142906d08f5608e8f5758ba0b9a4200.npy +03624134-ca5e9779bed60ea8c6c26a6a38f12bff.npy +04379243-86a955d448e4dc0c3ba9e53316119012.npy +03001627-f859a1ed07d088be920de219c00d1c3b.npy +02958343-596bbe4864580ded5833b7f8c91b5b48.npy +03624134-7238d0009faeacb5fd770de1635caa0.npy +03991062-c313946af426bcc7368b14e48c164a6e.npy +04256520-611f5a21a6f9ad3d7635d2483a62c61e.npy +03001627-1ab4c6ef68073113cf004563556ddb36.npy +03001627-c747e6ceb1a6faaa3074f48b99186254.npy +02924116-9db400a7d654016f52470de2774d6099.npy +02958343-af814b4b43fd826a3a0daf3e5400b95c.npy +02958343-f9e91a22776f3d8be9415adaaf77fdbf.npy +03337140-97149625367ac1444c3aee8e9d3a6ffa.npy +04468005-ac3d0b9db6e5c9c29954eae9164faecb.npy +03001627-22ae801d650a1e3d492d9da2668ec34c.npy +03001627-b56829d48d66fd0bf368f5bd754a08c3.npy +03001627-f23ecf3348299cf743e99e0cae970928.npy +03001627-efafddc93951b8fdc975d461b3f97726.npy +04256520-a9bfb70669bd7f37757a6361b10ec08.npy +04379243-e97156fd53e88e27be2d01aee0780473.npy +02808440-782e16fb84e867632a3ca6620448176.npy +03467517-efa4ceed4d7b25fbce1c7d24654787eb.npy +02958343-47638c9573ee7ba3d8a1849b0098a5e7.npy +02828884-838c48b41d513a2dd0992406ba4944f5.npy +02691156-545cadae487b55bbc46ba5100bcdc520.npy +03001627-7a2d21eddb89c8242058afcc28d23393.npy +04379243-e679dae35e8ccd9acd2220e987e57553.npy +02958343-7c44aa72f314ee8e634b31c394824611.npy +04090263-7edd1e50920e559e0befc0b4697d414.npy +04090263-72e4958882980380e1f2a1daf140ac9f.npy +04379243-9ad91992184e2b3e283b00891f680579.npy +02691156-6bc51a88f3c58469b00421d9df4746fa.npy +04379243-f8c0c4f713f0c136e9048ab4301b0c63.npy +03636649-23eaba9bdd51a5b0dfe9cab879fd37e8.npy +02933112-50f0ea68b77810121fbac718728a36d.npy +03085013-44ed926c35d42e38b20f6e48f6a30cbf.npy +03001627-be1ac2a0b4c75bb9940806ade53ef2f.npy +03001627-bb296502226ae23475becd8a4c3f1866.npy +02828884-a28d0dbb90413692d42b9650f19dd425.npy +03691459-4cd3259a06b904a36a6d1e86c6266511.npy +03761084-f26c8ade290b82c7843e991acd39f432.npy +02958343-17c32e15723ed6e0cd0bf4a0e76b8df5.npy +03691459-16e3c79113685e52203eacdbee49fa8e.npy +03001627-37ba94e29b7d21ee41fbc1e2da054acb.npy +02958343-4dbf4e0654d0c234e811106a82796d20.npy +02958343-11b09de6631b3b3ad997cda1a938a10d.npy +02691156-3f69370401d4dc9a275386e1d3ac388e.npy +02958343-1c6591c3fc686bf24132f89b3e69f40f.npy +03691459-4d698b1e935897905e97b1b6281b6b04.npy +02808440-1f026dc37ca7c7b26b448b8aaebb705c.npy +02691156-bff6cee515cdefa8a5effc03faf54012.npy +02958343-e3d7957c7a9b95382e877e82c90c24d.npy +02691156-50e793fe39e527b245f31985fc702c6e.npy +03691459-f14ddd757b128a96b2b304a0ae97620c.npy +04379243-7c59421abd239c358b069fa6e7378ac2.npy +03691459-c75c5ae81c1fd498c066b9622c005c53.npy +04379243-1a153612bcdab3e23cc149415a408229.npy +03691459-88eefee684586cd3fd56d9106430c3fe.npy +04379243-306f10749606ec9355f46d55537192b6.npy +03001627-397a5fd0a95a17e4dd2be59fe725394a.npy +04256520-1af8bfa4eda36bd697c597ba4db02ec7.npy +02958343-8f8bd59f17f122a163739f01ec1d22b0.npy +03325088-11cae04ea5d825693321831d2245cf06.npy +03691459-ab478f6a1f38a5d18a0181490cb73cbc.npy +03593526-c7e207bcb48a699fd0a0c43e4971be14.npy +02958343-2076be423fa5bb9f9e908ecb03b3d6fb.npy +04090263-2f4d62df133d15ca5874d5106201fb13.npy +04379243-f39401db6cc45a3ae3e15116d1de599a.npy +04256520-e708bde6a2ffa4cd1ed1d681aa8388f6.npy +04379243-b8261a2db6b6525f490ad276cd2af3a4.npy +03001627-2bf69f0fa5be4c3f6ecea8cff53afe1a.npy +03211117-800ca9956f66a22a23d94393165a64e3.npy +02691156-7488f87b1e08bbabd00d52e62bf14ee9.npy +03636649-d460bf2dd59883f44e1a714ee619465a.npy +03636649-2a762ba822eef5fe5c7e2f94d3f5eaa7.npy +04379243-f220f4b4c7b79d7ab54f2a7bd7b06a98.npy +04379243-1b739cf713702b2146f41dc2aaef556b.npy +04379243-3cad8d726389e5dca5e91f4d594e20e6.npy +04256520-36cf45005b263014917b96045c9b6dea.npy +04379243-1652817da2b9193bc3bd24f986301745.npy +02958343-9dee0ea5da388102e6d91d458fe44a15.npy +03001627-ecd46956b35523fd492d9da2668ec34c.npy +02992529-98eb601db13d2a99611f4167fca99b42.npy +04530566-3176313945e3739e10508e1f7e97aa01.npy +02828884-be7408f8b03d491145004a22a9d35958.npy +04379243-e157aa6411d02cb16f1e631ee7d027b9.npy +03001627-3d5c94f748861bcf6038f78d0f44e587.npy +04530566-c00cee4431f3c2db89d39b85991ba25a.npy +02818832-19de1e83fbe292f55a2aa419fded589d.npy +02992529-f2db6829e0c0298140d50eb4da376b1d.npy +02933112-69932a9f53ce20bbe4e346ee2650d150.npy +04530566-f531f4b2ca36d626e18dd06c1afbc426.npy +04090263-27fc4679ae16edc887ecee1779f8c08.npy +04401088-df23ff3151aa1f0a3cb2f20e21cb06ff.npy +03593526-763474ce228585bf687ad2cd85bde80a.npy +03636649-e926dd7cf6831f9afcb8d8c6d4df8143.npy +03207941-a377f5af14ac6710a168e247bb97e471.npy +02691156-c3bd5ab4d3ac6a5a5c351e299b24e355.npy +03001627-caa330f85a6d6db7a17ae19fa77775ff.npy +04530566-5fd55e301007884c742bc8027e4951ae.npy +03001627-b6985891e45b998e7181375a1be1d1c9.npy +03001627-6d7a7f4660e49fd130cbbda41991e4d0.npy +03001627-c6e46dc0afd8b9fdd722b8781cb9911.npy +03001627-404bfa75a054791920e791c9b6d759b2.npy +02691156-bd698089021a4a58e23abb9b807b4cb1.npy +03636649-9627da26edc003e7d49b2e04785f8492.npy +02933112-576170f154143ff2de421c2ab5cfb52.npy +04379243-10ed64b4c7eb6d9311ee7ca4f000feba.npy +02933112-10b54fe832a00c3ec59350d819542ec7.npy +03636649-947c6753d77d8082290e2f84c414e6be.npy +03325088-1501500852a5295db229726a165222c0.npy +04090263-b9b9eb89bea6ce2fbeef84a1ff2df7f.npy +03636649-fe200902555dd8c89f2349486c570dd4.npy +03467517-4064b0ee5430ec6baef45fef9b6cadb4.npy +03467517-ea201ccc779eb93843a90475d48649b3.npy +04379243-ab5dbe7338e842e36f7826c82fdc3f35.npy +03691459-8e25a8e0de9ff545bf1411bc6f3b308.npy +03691459-2e0fc1bc430c5c1bdfdc04b8b8434e84.npy +02958343-c16bafa65123cddfce29c905218d4398.npy +04379243-ba44082e55ea58f431475fd256bf1b7a.npy +03948459-c16e5ae5e9f4af295c288fb30cd9ee47.npy +02933112-b8880afd2b1038c8ea7cdfccad65e7e9.npy +04379243-ea60054e04139d95b90b5e5b769a3ec0.npy +04379243-67b9c88c4f75cd1e886a7d82f0a2cb9.npy +04530566-722b68d90bc3955d2e5eb68672f87e15.npy +02828884-9bb6f0077f91c613f155d75bbf62b80.npy +04090263-e53f8481983564828ef0c1f0d9cc8b8.npy +02808440-81aab72890c8cc3a64c8c924c4738650.npy +04379243-9792d6d50c07e27627992812a922e94a.npy +02828884-27267209ed320cd271cf429728b349ba.npy +02691156-a85dbb5bb889881419bf80b167cee3a3.npy +03797390-48e260a614c0fd4434a8988fdcee4fde.npy +02958343-385d82108ff7ee1be2720e351c87b6fe.npy +04330267-3aa97b75ff79a0594d1cd794fadc7ced.npy +03790512-766002ed9dc8556d390c1a9993716e73.npy +04379243-1e57738f60665b1a908caac6d5f8ca97.npy +04379243-9dd80e356880c9deaf268f6180933aa3.npy +03211117-62ac1e4559205e24f9702e673573a443.npy +02924116-393575fc4533b0e8fd116a83fba6ae75.npy +04379243-575beb82bd20f61fad5067eac75a07f7.npy +02958343-beedf39c8f5709bea9fe1734a6086750.npy +03001627-c2076591d588586719fb4103277a6b93.npy +02691156-be5d2c935a36894c92cea77f96988ae6.npy +04090263-4a0f1b426cea6f13fb41747dcf822261.npy +04256520-83410e32b49b4f9957aa81cfc66d7b2f.npy +02691156-130d3f27fb083eebc0909d98a1ff2b4.npy +02691156-d4aec2680be68c813a116bc3efac4e3b.npy +04379243-b1117a83ebf5a4c9c337a931444a5063.npy +03636649-7a892d6b3951124cf004563556ddb36.npy +02691156-46dcd7b89d67cc41a1398b9e7da33687.npy +02933112-ac8cdb6289d3d446c59350d819542ec7.npy +04090263-be70ada7701ea798a8d379aabc8e63ca.npy +04379243-3bf8b96b10519a984afda4ff857119a2.npy +04401088-cd74be6a1d8a6cc721844676433a0aca.npy +03001627-eafec1b145972dcd815b2b467e8e2eac.npy +02876657-47ede0c10e36fe309029fc9335eeb05c.npy +02828884-f8aa82e7e4c58ce29d31c5ce17cce95d.npy +03001627-d221f07c0921e4d2b9576c1fc1b047de.npy +04401088-58ece48e59781da1fd0a2086d631b6a0.npy +04090263-e8bce069e560a97f310bbd45bf9024da.npy +04090263-f5472d552004345b51cfdb4c9f126c12.npy +02958343-20a967d68b6d291512da0dbf3c68e847.npy +04401088-922380f231a342cf388f6c7a9d3e1552.npy +04379243-718679874bec63183c9bc0d98cd0376e.npy +04379243-a91ee72daa437343d1f4e3beb8257c5a.npy +04379243-1248597ca22fa1e71332a40d0134407.npy +04379243-3ca6199c8adacd4d30bbd4cddd04c77b.npy +03593526-37b06eeb82c1a486835e59296200e86.npy +02958343-99dd952f49606ba01669695e4df59de.npy +04256520-5f50ec09722ee31fbcd054bcf140e51.npy +03001627-e39308cd84103a47f4b6538438a0b930.npy +04379243-b598794290077d8cfbbc7c456d85ce59.npy +02747177-7d47e79aaef3b1482056b4bd5d870b47.npy +02808440-8e1de9c946615fbc6f893b5bc716a3fa.npy +03636649-6e43d4b4829b66d06fa63795f94c4d8c.npy +03593526-281530bc7fbb122f30612f5c0ef21eb8.npy +02871439-e9c50ead4efa013bd42b9650f19dd425.npy +02958343-637a26dc6b1a3f47e7540f431cab4686.npy +02958343-eaeabed4e984364868ebd0cfefbb61e9.npy +03467517-78a978e7e34a751c69b43b9b42712589.npy +03001627-2ac24756c1adbd62c1a25f36f85c3fd6.npy +03513137-956fc471237a3e55613792009f64ab4d.npy +02933112-61d42e7c7c16b2d53334fb6668ccd834.npy +03636649-7bc1b202ebf000625949e084b65603cf.npy +03691459-ddfa1daa59d5bf2676c2a9de5c96f76.npy +03001627-a007a3cd5b8ca7fb19fb4103277a6b93.npy +02876657-bf7ecd80f7c419feca972daa503b3095.npy +03624134-dac1fc01fb44b2b9cb7078d644842b01.npy +02828884-dd9d0cfda54dfc30eda82e072f128485.npy +04379243-4f2eab1aa639ecdc6b17bdafaf39f370.npy +03001627-8eceb15a3c79b1b8719d8721fec72f0c.npy +03636649-26f0f37f0f2623c4a3fa46ae73c48b4.npy +04256520-ab350e81ff71034434895070e6a9b93.npy +04401088-98eb601db13d2a99611f4167fca99b42.npy +03759954-da951dbb3c6ffb3a6c22bf2209f4782.npy +03691459-fd4b2e3a6caf4706a817854e3b5b5439.npy +03001627-7ab99231f6a6cc282ca32e2623a35d99.npy +03691459-32cf86c686fe9b1974828baacbf242e3.npy +04256520-aa21824de23b516995c7d6b48c371712.npy +03337140-2e2704de75c84d3d6f1e07a56c129dfc.npy +04090263-b095a80476a8e002bb9224760a70fece.npy +04530566-9ea44b515bef76f3faeafe37c2ce4f6.npy +02818832-47f5f16fe3f346aa67a76d084b67db2.npy +02958343-6aef84dbaa69dfd8becf71e2e014ff6f.npy +04256520-4353b992d238cff0cda85f6a3e19b0a1.npy +03624134-d04de9ffdb1f36c1deef0cfd16bc41f6.npy +02958343-a52f704da0d3c947ca92a4cdad802b45.npy +04256520-874bfe0bc817ac827571d17c374fac42.npy +03001627-3a40eb7b9122bbfe2f066782346a992.npy +03001627-a86c5179fc3f7ae114038d588fd1342f.npy +04554684-36594769b62b24d63b1e413ac12356ae.npy +02958343-93f298a78be6883916abce8cb03e7794.npy +02691156-a224182f76e4a44fe1a65cde8802138c.npy +03001627-cc30a723aeba69a139e0f39f5249b0ba.npy +02958343-4dca3760ae9748b6b0aa56928723eca5.npy +03001627-d581539aa6d5c2ec7709fbdff3d15bf9.npy +03636649-6f422c48a60cda58472cd9d4266add0f.npy +04379243-a275f4b42b430eaf320f10afdfbaa18.npy +04379243-e699d5904e00a6ab748c0b14b00bc019.npy +02691156-85cf5445f44a49f5cf35fd096a07bc43.npy +04225987-2085eac3fc071dd47292d1029e5a9853.npy +03636649-3101d2b22e21297ccff8db9efabb6c62.npy +03001627-7e8b24aab1f2681e595557081060d0b.npy +04090263-36d3338314e3db7cf6099a039722df68.npy +04379243-4c20048e9066d768b7490c34ba5d2779.npy +02933112-2af2279b9331aa9916c6f599d5622764.npy +04090263-c7b8d834209413393110fbb3943dde1e.npy +03046257-425e82131e7a8db3bde2b05b8fa4f117.npy +04379243-1797eec0a23dcb1dff29be004a6f7c0a.npy +03001627-c15a1da769c1ffc5be1649add3e36e21.npy +02876657-776502db6e2e680e5e4f0d37557f3953.npy +03636649-270ec239221938991735ea0e092a805a.npy +03001627-3a16d7535d87d441d772e458a8f80cd2.npy +03790512-8032295bd3851d75468bac13e007a6e9.npy +04090263-e325afe389a39f49e641d7676ac20451.npy +03636649-f111f0e0c6c3434f30f6e0ede20c4525.npy +03948459-5e7afb318ff701583018d2d3c13a7462.npy +02958343-2999f005f1eba724bda733a39f84326d.npy +04379243-7cd4844def36a9f5bc7589eefbdbc3c5.npy +02828884-54f33a7cb3621d5ced98cca8f0ccd5f7.npy +03001627-ece1a921c1bfd44947f5e245ee376525.npy +03001627-594d1220c2c6df41b04bab4867aadedc.npy +02946921-b1980d6743b7a98c12a47018402419a2.npy +03001627-1ff1912cc74a76c3b2152dcc3ff6a477.npy +03636649-802c287eacfbcba9564b8e0b814c602e.npy +04256520-c136abd9c245ed8819c798cfc4624378.npy +02958343-f9eaaf5abb238c22851f021b9ed69c58.npy +03636649-57b95c1122beac7c3fef86d7b5969363.npy +03046257-c65500930362e3b925bae8352085782c.npy +04090263-8894650164a2222b1a857c47fd0ecdc3.npy +03691459-53d6d8e3e4731b3bc0b5947ffe18a468.npy +04256520-d4704c12862c808b593ebeeedbff73b.npy +03001627-b1d9c55bd4e8ded1c76575d5e6d323f2.npy +03513137-a1357ff99c759de448d4a59eba9f268c.npy +04379243-fb097cffc3cdd8512027cee422df2aa3.npy +04225987-d7045c95ab319b711082f2ea630bf69e.npy +04090263-179764bc36fa4246fbf44f447f38c175.npy +03636649-a0e1732661667683664b3b9b23ddfcbc.npy +03636649-c7aadb7ac29ac778aaae3d020f5ddf8.npy +02992529-44ce10ddb982c8ff72152988eac576ab.npy +02691156-2f379576475cfba24c3a35cee92bb95b.npy +02924116-7cbd178243b93689be4604cdb22fb3e0.npy +02933112-975426b49f98bc1b4c62bee40dcdc539.npy +02946921-4a6ba57aa2b47dfade1831cbcbd278d4.npy +03467517-3cc9bf3137c4776957e2b466f0c765d7.npy +02691156-8b59ed9a391c86cdb4910ab5b756f3ae.npy +04379243-aaf3aeda0f848344b87028a4b477349f.npy +03467517-ebf7994fd17b6331c64d0082475b0472.npy +02691156-eb110db9bdd0463e5b7003ff580606fa.npy +03001627-909244db9219fb7c5bb4f4519002140.npy +02958343-30045ee0751d6ee88b3ab49d2e0e41ab.npy +04379243-2fc468b98c0cd227c8830fa1ef6e3e71.npy +02992529-8270c952b147d263b9746cb9e2b9d08.npy +02828884-873ce9c208428fd5ed98cca8f0ccd5f7.npy +02958343-b098f1db2f190a71d61b6a34f3fd808c.npy +03636649-1e9b2d5d65a8b7c29fe8663d47f73813.npy +04330267-f73ae0a40649c7b950c862b58109065.npy +03761084-c3bb5f3c842a6c2d178e7d331e641179.npy +03691459-3aa8876d86cf481d3fd2d4d929afab9.npy +04256520-6ed6b121918d8f3531ae8c8ff1eb3d45.npy +04379243-b905d2f688f56afff4b6538438a0b930.npy +04530566-8687ac78ffaa38584de203ef6842ee61.npy +02828884-59b1ca3d780ed0381560641bf48464ff.npy +02933112-b4da5084ae0237fca4ab444e58fa9bdc.npy +03991062-1c12e50abd02d26d25ebd1cd0b422e32.npy +02958343-840f98dcf50b48f9a7fd25564c2e888e.npy +02808440-c075ed9936aefd1151f7fdc9a9600159.npy +02691156-452c18f8997c53741adbb4c4e06ad649.npy +03636649-6cb3a2872d2c2646fcb8d8c6d4df8143.npy +02828884-92f20bc7a09dfc1d19420b7669e7265.npy +03001627-379f2db4f028cd7925e847faed0661b.npy +02992529-c70daedaade33fd0fb24e6a63c26ad2d.npy +03001627-665511c6bccac090492d9da2668ec34c.npy +04379243-cb214fef007a2a46bed1bd9593e318c.npy +03001627-6bd633162adccd29c3bd24f986301745.npy +03001627-ea77c800bba6566aaf7c7ad2549a1b15.npy +02992529-22fc328d136756361e5d846d206adf3d.npy +02958343-16ba461c0d7c8435dd141480e2c154d3.npy +03691459-199ce49a7db017107a964f742d0e5820.npy +02691156-2b20176a59621b35497add46ccd9d60.npy +04379243-176e3b32d749ac94d79f2fc0b8d8ffad.npy +03211117-95d82c761a54684db3690a118770a184.npy +04530566-f678356e3e61872a28730ed49126392b.npy +04379243-5668d49d776c954c5963245f0923337f.npy +02958343-79b99595059c53108540dd23f35aa602.npy +03001627-1f571e244384bca736b0f2a1430e993a.npy +04256520-fe63ff3ee440cbe2cbc66df5fc1969c2.npy +02992529-1d390d2560fc259336eb9fe355d50fdf.npy +02958343-4eb5ec5502561124875fb780d36841f.npy +02933112-9b2759851023fad7dedad3eee47fd556.npy +04530566-67e41dd24b6902da49f471d054f6b528.npy +04379243-ab529bd91a158a53851911ab8e53bed.npy +02828884-84aa911799cd87b4ad5067eac75a07f7.npy +04256520-5af36cc3a98642019fb4103277a6b93.npy +04379243-889f48aa85accd2ee73947fdf756a329.npy +04379243-51f0461221d5a86370d2e38b8c410c62.npy +03337140-b6e067ad1812af03492d9da2668ec34c.npy +02843684-bf698ee440b6de7ca7667c99d0d11d68.npy +04256520-a89e0f5b5a8157afb0aea9d5db2857a9.npy +02828884-8b682ef98315c3be21349c674433e602.npy +03467517-ecb17b6917ba033bc39f53b4a75f9475.npy +03991062-7a70cb897ca6c3e1436455e65b78c0e3.npy +04530566-5e1c4ca986d216866554a94f24190b8a.npy +02828884-2a9ad7f4e7ab564a5be2d177e843be47.npy +02876657-8cd9b10f611ac28e866a1445c8fba9da.npy +02691156-105f7f51e4140ee4b6b87e72ead132ed.npy +02924116-920a7d45cf2455f0616d27151166e25f.npy +03593526-9195960e68825d41156d1d06c447a736.npy +02992529-9cedde0b189fc03824ec4b72ec33390e.npy +04379243-cd91028b64fbfac2733464f54a85f798.npy +04379243-39a71631941673b1c287a33ab134ac42.npy +04379243-47cb4740e2e0cb8d11bf24e88933ed8f.npy +03001627-fd726084724adeea492d9da2668ec34c.npy +03691459-3a4950ac89429ff5b396c6d231dec74d.npy +02691156-1b626fd06226b600adcbeb54f3d014e9.npy +03325088-427cdfd5eba597ba14b35a7d7cea7130.npy +04090263-a5b6e717194781776559a92f80e3672e.npy +03642806-decbfc069b08016d6ac2773342338507.npy +04330267-3139001aa8148559bc3e724ff85e2d1b.npy +02691156-646b93aecb7b7011a9b2becd26dc2fc1.npy +03513137-a8e04b323931f2b9f2c6c460ab16f409.npy +02808440-b0cf9853f86d85c062c5411db2c28360.npy +03001627-9ee1b4fd18b040bb5445e46058840642.npy +02691156-53c7a6b56afb63807222da102ac36d2b.npy +03001627-965f9b75de94d03aff74317afae0a323.npy +02691156-8d5ecf095e56cf8cca8607f540cc62ba.npy +03636649-f392dbd90200bd7dc77f357adbe5c980.npy +04256520-125ace480d9f2fd5369e32fb818f337.npy +02924116-1821df0ce1bf2cea52470de2774d6099.npy +04379243-f116ba8983e6728eb1f243bab39fb29.npy +04090263-a7cf230b5a2967125f5038a2cf78b1e4.npy +02933112-743366dfb72897be1ba9fd11dc8bf457.npy +02933112-7d95374a9110157c7d8c689e1315827b.npy +02871439-1170df5b9512c1d92f6bce2b7e6c12b7.npy +03046257-58945eca103891f4887f087750df94d2.npy +03624134-d23341ca5eb721abefafd451049df010.npy +02691156-5bdef9dfed852e26195688f8ce8acdb7.npy +04379243-a9d890e4b6b426dd358ffaf8d4d252a.npy +02691156-e805624480f632ebcc14f1e6f4f4f49b.npy +02992529-b140bdd32b0287a64a21fc95f845c2fa.npy +02992529-27b4f430b881e16ad6339cac3214b6bf.npy +02691156-99e1961a72bb8ac46177b6d1ecbf989.npy +03001627-7720c68121497e555a28000e191ea2c9.npy +02992529-36760a27d679f058c4a0b6f738c144f4.npy +03624134-77c55aef23f91604a4a0a1e78d057db4.npy +04379243-d22e15286d0d99ec52d2de7b04447df3.npy +03624134-c116fc1447fa496ac1cc4ae0ecf50bf4.npy +04379243-9d73e1a51a56683bb65b71636c46ae49.npy +04256520-5a8adf52078b5008490ad276cd2af3a4.npy +02691156-bd298d2907400418df8fc3a07f996293.npy +03761084-6dad0112ef18439cb7add4de9f6e92e1.npy +04468005-f646c4c40c7f16ae4afcfe0b72eeffb5.npy +02958343-7fb5dcec8e6745554ddfff13f461e46e.npy +04256520-7461a53eae4126a79fcf47c4eee9d700.npy +03001627-5b51df75df88c639f51f77a6d7299806.npy +04379243-90343e416528b576f41d9ea5f63b1b05.npy +04530566-498773c5047c01b35fa1a6e8897313f4.npy +02958343-f10e32c6daaf237f13ded1857c15b5b6.npy +03001627-d868b5e696c362b9ae23680cee12f145.npy +02876657-81b2ce7d719326c8fd54367fe37b16.npy +03001627-bfe54fe90c7d99637fffc92abe94e907.npy +02876657-1d4093ad2dfad9df24be2e4f911ee4af.npy +04379243-33ef80eb8ebf4207fe7e23d061690240.npy +03046257-772008d5e703c4564b3c42e318f3affc.npy +02808440-7b440b188067638a44221bef0fa3c36b.npy +04468005-4682b77b2f9de0b942a772abcd2e8eed.npy +04379243-38ec61e847b8ec152864bfffd12f80b5.npy +04379243-63de5ec054b2d310dddd8ce1cda8c6d9.npy +03001627-a93853bdb9b378dd50c2ec40da48fd9d.npy +03593526-9b93492086316fdc61c8cbc38c089792.npy +02828884-7c49749ab1fa402a2056b4bd5d870b47.npy +04379243-e8288b5f567569f19fb4103277a6b93.npy +02691156-337658edebb67c301ce9f50324082ee4.npy +02691156-fbc7afa847c30a4c183bb3a05fac486f.npy +03624134-2743e37a65e198d51592d7a04a86fa53.npy +04379243-a4af8f822fa8d95456c08464b83f209e.npy +03001627-9841030f427150567dbe6b236c44c533.npy +02691156-77f5111d348bf051368d7e7849f8df62.npy +04530566-6cea89128bc0b5e83b9f2b6367bac7ce.npy +03636649-dac278ab197b5efefaa6996ece0d86f4.npy +03001627-268e15d6c73f3495f2c6f9bb81f9e3f6.npy +03001627-f23d3a85baabd7ae32d9baba75737e72.npy +02691156-f277fd1032f615ec2268dda5c324173f.npy +03001627-4afe3d1ef68515bdd6a6b5838ef6b356.npy +03636649-292ba732e002629e68c2f5eb1dd4dfaa.npy +03325088-6e1051dae8109411b362845c6edb57fc.npy +03001627-c6811f115d89758f46fb9c38320df24e.npy +02933112-819a1fd8c7bea7f3984cd513e00e13ae.npy +04379243-2f58b1ca8634a6b48b9b51ae4415d5aa.npy +02691156-ed57671fc0252e15b95e9a91dc6bad16.npy +02828884-459f90aa2162b1f1d46c340938e2ff1c.npy +03325088-b58fbcabbdf942515e861292bc046f7f.npy +03691459-cefb560ac4ca8b38a046bbac53886364.npy +04256520-189e64b308b4345d291d421ca3746ae2.npy +03790512-a3dfeae5bced3533b37378f3c85478b4.npy +03467517-c084022f2ddbf95493f0194265a9746c.npy +04004475-bad6374187a626722d24866ea0018e08.npy +02958343-34b507c24d9eab7f7eaeab1f0c9120b7.npy +02958343-c907a6cb1b178999c805dfe4ca9f2fdb.npy +04379243-5771840ae9ab5a334a3ececf7e04ebcc.npy +03624134-a73a2d9584b2cbc81395331ebe4786cd.npy +03001627-c6bdf057e1a5e900548360e92af6377.npy +04460130-70ea9d97de7de827221d54273fff89cf.npy +03001627-e54417646ad16604738a251b334366e.npy +03467517-c980271f356c3e9b605c81d3188a5b83.npy +03001627-c89a9a38e300cb502c10b2c975aee2eb.npy +03636649-3638d46a41870173713decb1a0563b12.npy +03001627-77f1880f07fc9805ce5f623508bcaa7e.npy +02933112-1e95c521f70972a2f5758e5628273c4e.npy +04256520-21addfde981f0e3445c6cb69e0968783.npy +04379243-52037005fbff92d08fa35606145b47dc.npy +02828884-5f21d3b66aa9b62d63b2acb037dfbcde.npy +03991062-5d2e2e8f2cd99c4b2d7a27ffaafaaddb.npy +04379243-e9871fd4c45b34148737eef0436997.npy +03691459-b44a0f8900edef4c957a55139a8e936e.npy +02691156-4561def0c651631122309ea5a3ab0f04.npy +02828884-2f34980683df2b47ad5067eac75a07f7.npy +04379243-c2c4846106b3597ce76bc197b3a3ffc0.npy +02933112-d4a7b45abac7a39c59350d819542ec7.npy +02691156-728d58b27cd53a16c93b40751084c22.npy +03759954-51f167b8049ae3362735b4cb5e9f26a4.npy +04256520-5a94cc0c277f391df9aec59741c69cf7.npy +04379243-6e16dc2baf237aeb5b87cb2d9a815c73.npy +02876657-d655a217ad7d8974ce60bdf271ddc452.npy +04530566-8fe646e75e9b99bbb58435942a1b4dac.npy +02691156-b2ae4acd6774f410833bb0b457d51a52.npy +03001627-a543f7e8114b19cd5397d07b571cbcb.npy +02958343-3ff887eaebf0bc7e9d2b99af43da16b3.npy +04256520-fbf0c4f6a483bc15ab7a3d3a1341aba.npy +04379243-5b719bcb32b8f291f16681d085170878.npy +04225987-c0280aaad5473e8398c63cb68f11df34.npy +04379243-c0401853da58a1b7beedb4c8fd29e2d1.npy +04379243-42fad469afab19939724db0ba5853d76.npy +04379243-760b1ea228d6c2f6e785b88cc9024b2a.npy +03001627-8c8efbe62a1547942b90a0fb76278f6f.npy +02691156-1df217928b39b927a8cba409c4409ba9.npy +04256520-40956fd98a04f34914038d588fd1342f.npy +04401088-64b6ddb847da082d761eb63018291094.npy +03467517-763905ae00b39589c445f4f26253ff9b.npy +02808440-dd60bfd98b869d96b5e423033398ff30.npy +03001627-a6420c4ed13cf628945a77b945b7b70f.npy +03325088-45fd2fd02e27bbb53321831d2245cf06.npy +04379243-6afec996cdd847031638d1ffbbaa0c53.npy +03593526-58c9d6575d62fbaf12bc68f36f3bdd45.npy +02808440-2f6da348147cad9c3321831d2245cf06.npy +02958343-60458c0d233ccf9daa69dfdc5532bb13.npy +02691156-9e75560008080a8529348d14ca881f7d.npy +03691459-5394ceacb131b5e79d7aee0f8e107545.npy +04379243-199881390e6ac3a89ccce4c6d5bb195f.npy +04379243-855c6cc99578afda6a5ef4b501708f3.npy +02828884-213e68b2abe5cf24bffe63c069324d61.npy +02801938-35bc440973661b91259e0fe12d9ec13d.npy +04460130-7635df079a9d126ff9c0f9cbb10e38a2.npy +03991062-12b90995b3054ea3a2c59a4d90e63212.npy +04256520-80d13b57aa31f79cef188758bf2e3a30.npy +04401088-8a62ea56cad1ea25430f38f25519fb5.npy +03001627-52e2b4be107a9d6495bea7c29e873d16.npy +04379243-e96bc1b7f02caf77eaf288f952624966.npy +03211117-a56c13025ec97af31ac04cb85e251041.npy +03325088-e08f50bf9a0b4776b362845c6edb57fc.npy +02958343-d79f66a4566ff981424db5a60837de26.npy +03001627-d987dc40c90907276bc601efa799c927.npy +03636649-409ff705d837b30ec3c3e425b20b4636.npy +04379243-3db6ff15d7ee52482db431502a680805.npy +02958343-d652c35de82c3f3141fd6622cb2ed89d.npy +02828884-9aafd6c69c331aef535e3a87e2212e35.npy +02828884-cdb6ceae0102632fffc6e457221b9271.npy +04401088-54bb14aad2406a124ce28f0f1b509eda.npy +03001627-f3249612d067e120384f43a3132c17b6.npy +04379243-9ffd670b6eb68ae8840e9c8d11bc8e80.npy +04379243-9b86da62c360aa0d824080f516909671.npy +04379243-2583fa4932ddfe741ec48bc3c478566d.npy +04379243-f4e0c7b0e402ac86e5a953fde71681c.npy +02747177-22fe449cf2cfd7981faebbdea6bd9be.npy +04256520-5e9a36c61649952f555740dfce3e4a45.npy +02691156-a7d29332d98b7b8340a4a448803b06f7.npy +04379243-c02d673e9b7658d52b70eac6546e93fd.npy +04090263-65b8974ca9c4d73e34c4a8f12da88608.npy +03001627-406561a447d3f7787f4096327f1fb3a7.npy +04379243-7a0b6685a30298fb8ae8d7de284e7d2.npy +04090263-add8dbf5ef758141e63959b7baa1103e.npy +02933112-71c2c44dd20ae153353a90f87b8ecab5.npy +02691156-27317e8e93190374780ee0648cf79a36.npy +03337140-aafd560ec2d1d4814c3aee8e9d3a6ffa.npy +04379243-ed8dd7ac0d865ac686f1a0f58f951001.npy +02876657-f49d6c4b75f695c44d34bdc365023cf4.npy +03991062-d7e77f60893f20c4a2c59a4d90e63212.npy +02933112-370608d5fd4f39745e7493df1bf8fac5.npy +03211117-31ef46873b20e53274e7ea1d002bf071.npy +04256520-cb311c253401e27165eff2c7075317a4.npy +02933112-5ec805e8599196746be771595eade0e3.npy +03642806-7b944e090c10969666aa414faa9189f1.npy +02828884-3a4ab482c4d344eb2fed5f7b90bc9e3c.npy +03211117-4812245f2f9fa2c953ed9ce120377769.npy +03211117-bafe343788f824bd372d432893cb48f8.npy +04256520-8fce754ab94cf3c0e07a1c4b84dfd325.npy +03261776-b5c4585baef4a036dae5edc5d34da94f.npy +02958343-7e7e5752ce2aebd46034a921cc85e098.npy +02691156-7b553eabcfe3709f3d2b6eee5a74cb08.npy +04090263-2a1f207a0273683c9f433921788191f3.npy +02808440-ab3e7307f7e3a435863bb5f5739560b1.npy +04379243-722bd78d5f625018d27b31bdeb5f5c79.npy +04379243-e8ac113e9db33ac8cfdf2d08e1ba2a48.npy +02880940-34875f8448f98813a2c59a4d90e63212.npy +04401088-db059495c20c0e2e514ce6dee24d82db.npy +04401088-1b41282fb44f9bb28f6823689e03ea4.npy +03001627-a14880ecec87a82bf9b9977a2406713a.npy +04090263-9104e081cb7d92f0fb41747dcf822261.npy +04379243-e702f89ce87a0b6579368d1198f406e7.npy +04090263-b3bc8adb8349c958de423072102e0bc5.npy +04379243-5b0ca203bc4021a2cf9ca735ff10053c.npy +02691156-afa83b431ffe73a454eefcdc602d4520.npy +04530566-11766a7b1f86adf36bfc202176cd1f2c.npy +04256520-2c1c9fb6e940c636b1467c71658cc329.npy +04401088-eb1fa4d2a399d4c38334e57fff4eb77b.npy +03001627-665fc6411855306530221b1717636e3c.npy +04379243-7eabef19cb02a9e6aa29e9f0529e8ef7.npy +02691156-d83300deab42c100eb9db4e832a6dd82.npy +04379243-ed289e72b00480521fac473c90dd4a.npy +04530566-cc97fdf906ef08afc5646791c1cc7f13.npy +02958343-55785c5e30e293e03146b856dc99bd62.npy +03001627-81276e5b6c8871634af957103f4767ac.npy +03001627-89d62702b266b20a58a2d0ecf7ace1c2.npy +04256520-2f426679ff0345326e467bd7dd946c3c.npy +02808440-c37f254715a78571ae8be095e1557726.npy +04468005-f04e5f2911de028219508c299c767a7b.npy +03691459-607096f600b6b75620363e2561dd589a.npy +03691459-5533322e8dfb7d69efb0fe88d2924d2d.npy +02992529-c5188dbebddbad3597cfb99c9c9efbb5.npy +02992529-39359aaddcc4b761b0a79e28606cb167.npy +03001627-bb878313da4b02e3dbbc9440457e303e.npy +04256520-277231dcb7261ae4a9fe1734a6086750.npy +04379243-1c8d1cb23d037f2a9e4965f0106e00d9.npy +03001627-b58909919d9feea6976cd10355a74f40.npy +02828884-ddaa540f004e7889d2b12aa6a0f050b3.npy +02828884-abddca275435a7b987b6d520ce557b3f.npy +03001627-75716acbe4ace649854cb2d2b60c3da8.npy +04530566-5da69ec4bee76b21f3e39f2e17005efc.npy +04530566-9c92fb3f3a4fbe8cac932f3ba44b77b.npy +03325088-289c4f1b23b09836b362845c6edb57fc.npy +02933112-2f0fd2a5e181b82a4267f85fb94fa2e7.npy +04379243-efc01209cfa158eadbbc9440457e303e.npy +03593526-5b8b46006f36e9a741711e9e73e5d4ca.npy +03691459-d23b86065834982bdc99793862c889e0.npy +04256520-d71b806ed0d2108dc149927e19d9b07.npy +04379243-f49c7d43808b1033f91663a74ccd2338.npy +04256520-98e474a6bbaef456febad4f49b26ec52.npy +03624134-c1a44efab8a2616c44a16a1c9776e2ce.npy +02808440-20192aa7850b2ba35821ec2db55477c7.npy +02933112-23aeb8fdc0d1ed4c4da5feafe6f1c8fc.npy +03593526-9cf099a555d04ea1417700afcf470f3.npy +04379243-f7d17f8d80fd2eaaa62ee5d388bdaf2f.npy +04379243-777365e9179ef98cea4f74d1efed63c3.npy +04379243-58a0638f8bf4f0fb79414e04132a8bef.npy +03948459-d83cb380b72c7724d6794b7eeefabea.npy +02933112-87c85956b41a7fc541d86c17c15247b0.npy +03001627-48f0c9b02587b5a8ea0588dd0d874b1e.npy +03636649-bc5f2f93922aeb65fcb8d8c6d4df8143.npy +02808440-5132921c7ed221103af30a3946d92feb.npy +03001627-400a5dbd31db947b35836c728d324152.npy +03991062-186cd7542e540fc82b2a077db1b64e23.npy +04379243-74b8222078ba776c661673811de66400.npy +02691156-f337580024e8c36da5cec7cc83604181.npy +03991062-5f3a050002015f5bc323742ccd065ef4.npy +02958343-831a3689b2f48664473f10e6caaeca56.npy +02876657-57b186ba25a680584289430f919c490c.npy +04099429-b967f61b749b3d0578268642d8df40d1.npy +04379243-6b5f5a51340e371ea753e2e06c37201.npy +03001627-a54ac4580f151f89278d386bfa54545.npy +04401088-5a28460645d4a28c7fa29a3ea424473.npy +02958343-ca0f99974520bde12776450c3e3bf20a.npy +04530566-9b91a683da8c4781f990230c33049243.npy +02876657-43ad6585f6b9a64675e1008a71b1c5e9.npy +03636649-ea71ba1d8d8c8e5888a1de3dc61bfeef.npy +04379243-2d7c48df632589a7ad5067eac75a07f7.npy +03593526-b7f03dab9501bad647be29e6263b8b5e.npy +03001627-59ca6d57ddd091c26eda1c7568601317.npy +04530566-c15004cb38217b33af018ffb2ed4ff85.npy +02691156-911e9f0246b26b309f789b924eaffb62.npy +02924116-c099c763ee6e485052470de2774d6099.npy +04090263-f06a233c12b64a0ffa9286f039319ff7.npy +03513137-f2513143d0467e357af69fbb2f9a628a.npy +02958343-20b03fde0d55a99fbecf71e2e014ff6f.npy +02871439-d36a9b7716b47b90492d9da2668ec34c.npy +03636649-d36d4552fe1290ee90c2e24416edfe5b.npy +03001627-bb8fbbbb9925a376d1dcc55e36186e4e.npy +03001627-7fb75b03d3ccd58c4710269d4bc18736.npy +03001627-1e53d84e48bb7d25febad4f49b26ec52.npy +03467517-131f827521abed2548627a76b6268107.npy +04401088-d0b5b899929975558ee99126b119afe5.npy +04256520-f27962a9ea7a87a87140e995552e7616.npy +04379243-6913ad01e9b00c4ca6c03a53cf0a14c9.npy +02691156-77a1744ee3c37f9b6aa3bf023a2b42a5.npy +02691156-7ee2912263fa4bb36f14b7a660f4c864.npy +04379243-564474f25a4400c5dc20930e6fc85682.npy +03593526-f9346339a3b24bfc500158c23c4c5a8e.npy +04379243-fa89bec3cccc137b10eb3ebb0bbddbb0.npy +04379243-bd28567361a3541d97fb366fa4051f4b.npy +02691156-d6d84d05892a4f492e7c68eb5d1b9123.npy +02691156-f98964dc88c44a2c863ab010b80d9ed.npy +04401088-34d8c06ade78bee87e273378b31b6ba6.npy +04379243-6110ca3d6213d128c96f5ad2252495c6.npy +03001627-8763bc46c26ab19957b7bfa2b0e9620b.npy +02958343-f6906412622f5853413113c385698bb2.npy +03691459-9471b1f88cca01134c40f34de8f3bdb8.npy +04379243-6acba1cf4d21321a9ac279f421086f50.npy +04379243-25695002a51a61c38596fa5b590d746a.npy +02933112-5c306efe5d4409c31190e285a2cbc9c.npy +02691156-7790715d4bc226f8b569b36137d81c9b.npy +04090263-9a1bd54ed9acf1ae73ede6cad0df9fb6.npy +02933112-1175801334a9e410df3a1b0d597ce76e.npy +02691156-5cd14216765393f18b96ae1a0a8b84ec.npy +02958343-3e36e7b04fbd55a0f691b4bfa2a7ff4e.npy +04379243-622d66d9e598b7788e0faa4ef4033cfd.npy +04379243-a19e6780182c72cf9bf8bea04806ba15.npy +02933112-8c1cd3c09ffef7efc59350d819542ec7.npy +02958343-641e43fc49e754edbcfa8eb5a2d224d7.npy +02954340-373d717709b3e181bbda4bd2b976d8f7.npy +03211117-b68da827b6c8852ecd0f781bc45707bd.npy +04256520-21e930917f2cab28dd711af5650bdcf.npy +03001627-aa3e5b5828912c0b5d11e7d6920a72ce.npy +02871439-7f40e1a4fd8344228ab882e168bd8706.npy +03467517-1817e920fd92124fcc1908493f380315.npy +02924116-1aae0b0836cd03ab90b756c60eaa9646.npy +03001627-858e512945d4544644175b4dddf5be08.npy +02958343-4026bb045c2cfc669f4536d76626fb35.npy +04256520-469a61462432d5521625c754b61476d2.npy +03691459-65e35b8378bb62a3801d0b1c6eb274a4.npy +03710193-551fcbbeb0e75c3dc2c30a1e5c9027fe.npy +03636649-cd7bda99f9797d8b1878e92fa20d38a6.npy +04530566-4c8fa5d0d4b2c54644dbf20ba8545fd.npy +04468005-6ef9b372b0a3ddb7cb01c89ef4a63ff6.npy +04256520-b76e0d43ac0800366a035d0ca8a43948.npy +02958343-a08b151ac5254df184bf231ea6363fab.npy +02691156-f613ace665da5e3e8b96ae1a0a8b84ec.npy +03001627-a3ce9ba74ab50352e6fe3612af521500.npy +04379243-3e08106901d3c9157145387788e4fc89.npy +04256520-b95f97ba63ab989cacbf0573260a18d4.npy +04379243-234a106ec36821d8c9f016d57db96408.npy +03636649-48f878a6176591190c2e24416edfe5b.npy +03001627-e199b1f6a70c9f56df44d20a516c07b3.npy +03001627-c55077d0b8fd893fdc4d371eb87a65ca.npy +04379243-1ba43964b343f6b6ddad726b9e01fa69.npy +02992529-6cc44d39e099bb6b9ef9eb3ddb0818a.npy +03001627-511e6440fad9bfa81fc8b86678ea0c8b.npy +04401088-e55c20e95bf299b5fc4d1dd4278b31a5.npy +04330267-15e020e34e3d2bba60ddc468fe733ed1.npy +02958343-bbf01f037b55306f8c2fb4d10f176f65.npy +03636649-8edb515a3e77afc4a8737fcf23389014.npy +04256520-fadd7d8c94893136e4b1c2efb094888b.npy +04530566-4c6e4bc79308e23e480060a68009533d.npy +03001627-975ea4be01c7488611bc8e8361bc5303.npy +03001627-ub5d972a1-de16-4d0a-aa40-85cd3a69aa8a.npy +04530566-72f3510fb835c3557c0ab7347b9e831a.npy +03761084-31548a2ffbdeb4037b6fd5468f603b31.npy +03001627-2191f89e65241e7be04d00482f14a156.npy +03001627-561d50862a2cb4aabc19762eaa7ba40f.npy +04090263-9ebdd77ce251d68626243ac6fb5d9ad9.npy +03513137-20ef9affd966bb53727b087f26084eb.npy +02691156-48706d323b9041d5438a95791ca4064d.npy +02958343-13d0f68f32a86bdfe3857ce739e6606f.npy +04468005-59b884e12684b48b1b2cfb60d91b4238.npy +03001627-1da29597f89c2b004b3c42e318f3affc.npy +03691459-1b31f250deb7e124fae32a4a57dfb78.npy +03001627-7df2443e976658b7cdfc3ede082b8a07.npy +02958343-cdfe4dc408f4ca84aaafd94b9f216ef6.npy +03001627-17ab0917e215e4fcfd300048280f015a.npy +02828884-ae1adc589a37317b2056b4bd5d870b47.npy +02924116-131a94e966b7dd5dfb89738614af8f1a.npy +03928116-8c2565c3adfa691985d624cfcd9a37a7.npy +02808440-2a5d4962869b1c34c62bee40dcdc539.npy +04256520-916abea85193002adae12f3947d07dec.npy +04401088-75dce3b2e5152c01ead1b13838d77bb3.npy +02958343-e09c2528f56f04d03e241901f2025878.npy +03046257-64bb924549024c7cac26591069295f15.npy +03467517-1821a6d30c529af493b667ec2f48a310.npy +02958343-39cb477c0a03aa1c3ab1417a5ca1ff4.npy +04379243-6b43398bac2b6979438d8caa9ae106fa.npy +03790512-d3e1ee410274fe4036abd307db1ff816.npy +03001627-68c7f82dd1e1634d9338458f802f5ad7.npy +03001627-b1adda06d8846afcb96f0049223adf04.npy +04256520-a8f10f404b317af4946789884353d9f6.npy +03046257-8627319b3c0a9f4c90ce699a92b3fef9.npy +04379243-88c833a60e220f2320ccbe1c34ca182d.npy +03467517-22129fab1497437cc3f912172873d52f.npy +03636649-cc643d2e5b7a46f5809222e4341a7d65.npy +04256520-b2061e554db928f233442b36ae29e50f.npy +02958343-f15ba529063317d241b8aedea2034739.npy +03001627-bbe566c26d28ccfb504721639e19f609.npy +04256520-7f0d93163b0db7a71ebf17f9e9667427.npy +04256520-85293b59b0f9cc1e593ebeeedbff73b.npy +04379243-6949e65a18ca505298d5fc0473d00a1c.npy +04256520-fcdc852692f43041fdac1e69603928f.npy +03593526-a0569f8e769d087467964ba700cd97f5.npy +03691459-abbca9c2aa1ab018ad65e8e6cc8ad9b8.npy +02691156-6481eb70eb9a58cfb2bb87688c5d2f58.npy +03691459-2454758b9629441cf322c3e7acea58f1.npy +04379243-d5e003575739a8ce1bb088904f7cb154.npy +04401088-11f7613cae7d973fd7e59c29eb25f02f.npy +04379243-24c854eb3f4bdba21b17743c18fb63dc.npy +04379243-b16567c16d0aca41532e8683617554c4.npy +02808440-c9dfb7c152684e3f3321831d2245cf06.npy +02691156-253a1aead30731904c3a35cee92bb95b.npy +03001627-86e2424968b01e241b94efa300287e71.npy +02924116-dcfe09e01660f263dd49dbd3b1c588a7.npy +04090263-457cbd3f2a9a710c11f7dcbb4a32aee5.npy +04379243-f17e630571a76d4f4b8710a3469971b1.npy +04256520-1739665585ec210fb04cb542e2c50eb4.npy +04379243-8fd9d529453e8d56c09af5354c5cbf4e.npy +04090263-b151820ba72ad964fa9286f039319ff7.npy +04379243-6f03a6f024145fc9febad4f49b26ec52.npy +03636649-f449dd0eb25773925077539b37310c29.npy +03001627-e0efbc4e240b9cc235836c728d324152.npy +04401088-856d33d16a97605bc9164fb9f03dc1ac.npy +03337140-eb0913a3e196f517ce5d6e9371bb5c33.npy +02691156-7a1954799b5fbb438fc2d09ac4aa4e78.npy +02691156-edd9583988b62c90328f15e6c60d0e90.npy +02992529-1ecbb2ddeca087b5fd71b7a0b881ae82.npy +04554684-abaca4a16b203ccadf3a1b0d597ce76e.npy +03636649-9dd9e38efea22f529a60d6ab40898d.npy +02808440-a4b457c41180e0b9fe52ffd0e748a1ab.npy +03211117-8440ff1637f2c6d7ebe17c8dfb911d2c.npy +03325088-59f6a76767eb5fc72f8c68dc62edc38.npy +02691156-e033b6ad34586a86cc1c9e8218bfe7fc.npy +02691156-d221f607d5b5c553faac198e88c3dbb7.npy +02691156-265f5348ab2320b2148672750a1a335.npy +04379243-cde67434193a2a6f19fb4103277a6b93.npy +03991062-9f4e8476917af3a12271466eed05a4d3.npy +02958343-30f4617775480bcce27281f3b76d1f5.npy +04090263-b6feb20b14f9519ef933a612bb11b1b8.npy +02691156-a56143efe74ee89ebbf3143b1cb6076a.npy +02876657-3a6fae97b5fa5cbb3db8babb13da5441.npy +02933112-46e31ba5963a89fac59350d819542ec7.npy +02933112-dc4affd586bafbc8d45f502ecff9e44f.npy +03001627-94ef9a352eefe9455ac8254dd793f590.npy +02691156-4d50ff789e84e70e54eefcdc602d4520.npy +02924116-ab0921f71fda6e1bf446f92b52bbd82a.npy +04004475-d9a7f7d8d6358ab268e3172ee2027144.npy +03759954-f482692b2086e54e7ec3f7c14c03a92c.npy +02933112-4caef9af7bd31f195588a2543ef0b0b4.npy +03001627-64f03da6f61e5b99d858721c5f89c1b8.npy +02808440-90b6e958b359c1592ad490d4d7fae486.npy +03001627-c18fd0dd722d164f41bb00bd5475793.npy +04530566-ba05637e557909b19527abfa7ff95c0f.npy +03624134-acd9570aab1c4fd47e25b10df54e79de.npy +04379243-45d5801abb4affea5b411468d0e36e1e.npy +03593526-d68da52ed2de0e7bc5beea20858a99d5.npy +02958343-4493638824352150940e51eee9dd2409.npy +03759954-d823eac75f84b3bbf76111a8c1b3eccd.npy +03636649-89f8c456a55c3386157d629c9921fc15.npy +03001627-fdac1f9c0b030841c8687ff9b0b4e4ac.npy +03636649-9c6084d24011c791c8107db508bde472.npy +02828884-e14c754dab919df2ed647189c2f43b5f.npy +03636649-3ab9e4300cee0259f72e8839e840c146.npy +02808440-2f3d0058b843186180a744f96587254b.npy +02691156-3d5354863690ac7eca27bba175814d1.npy +04379243-d1fba8006e7f72bd7228984b9aa31321.npy +02933112-a07f3b931238a5c3fe618e12c7f65698.npy +02958343-600ab6a1f116a5ac994a3466f8481f8a.npy +03001627-19666f52289092a3394a3bbfc81460.npy +02871439-b276b63c40e9ef46534d1a2a7289d9a8.npy +02958343-94b52d2fb55004d5ab2c2809513f396e.npy +02773838-abba6df6294f20c569ea850160c0b35.npy +04530566-c55868566d2cd547d8d2db57c9e192a.npy +03001627-902a46f5caf6b1f7e38c7f0de498b8e5.npy +04530566-40752c807c2be827c924fc2f78f9cea0.npy +02958343-202fbaeffaf49f4b61c6c61410fc904b.npy +02691156-e00b89bc338348caa42c49797afd1f5c.npy +02691156-47d958a8a781144b132a08135eefe76d.npy +02924116-eebc54c82c116bdca8b9756f00ab956c.npy +03001627-38436cce91dfe9a340b2974a4bd47901.npy +04379243-3f2e9c14ab1d26a0ebead06af665220.npy +03593526-a95db9f4cb692657a09c6a60c6dc420.npy +02691156-ef6db5bcb6bb96ddd2f0cc036969ee4f.npy +04256520-b6049bcbc56eb65e2553cc33364504d5.npy +02958343-9e4380de95fea34a11718baa6d4afc0b.npy +02828884-a3e6d02075732ca850f9fc0e2c94dd76.npy +03001627-3c4a33481f45cebb81f5ac91b0c9e99b.npy +02933112-192caea21a57389265dbe89d2f371f01.npy +04256520-ea06841d7501d07436b31862e09495f2.npy +02958343-a17bdad065a0e008a2e48b029cec5d4b.npy +04090263-d601235af9b5e93e49f0e3dd7767881.npy +02691156-fd0262e95283727d7b02bf6205401969.npy +02958343-25de320e58cb3898f43db49cede9f847.npy +02958343-1bace29924c0ae42226fc3902f16303f.npy +03691459-ef793b2369c5dcd9bb63f7ad325b6424.npy +03636649-23c41f1c519c82202dccb0b1a2845fc.npy +03001627-3e8ad99691e8ea4c504721639e19f609.npy +04256520-d0b33818a29689a8ab5d9b3550c46460.npy +04379243-2db1f557e247ded7e907b6d9dc1d71b7.npy +04330267-df6e6a6405d121abf39d7554d3e63ae4.npy +03001627-e779cf261cf04a77acd8c40fddcf9ca.npy +02828884-6466c201a664851de7b89654b68b9e5b.npy +04379243-ad9adf7c2c45842ae7354dcb6082ee59.npy +04530566-5c116a0ca9477e44318f6eb5e296bb88.npy +02828884-52867aee1e2e137912a905e721b748f5.npy +04530566-3807ccfaad3716ec59d8a2cd36b3278.npy +02958343-570a9903fc7fa557d0a4f72b67c7f064.npy +04530566-6e1781a84b5dbda6fb3e64e796c0391a.npy +02958343-6482e3afc2664e32d30f2d8d219e111c.npy +04530566-5168b7d5df698bb2852d4401c7cd1fee.npy +03001627-3ec25d235438258d815b20ced9d3b22a.npy +03001627-320b6f3ae2893d3c9f5d3fd8c90b27d2.npy +03046257-569f15f5c49a880c5c9c63683b16d1e1.npy +04379243-965abcd187b93da3f1783a44a88d6274.npy +03001627-3fc6ab5d3c52c128d810b14a81e12eca.npy +02691156-1203825bf97bc3524722e1824a086fad.npy +03636649-8a6944062cbf8b25ef0a7c6e0ed55209.npy +04379243-408c3db9b4ee6be2e9f3e9c758fef992.npy +02828884-a219234ac9ffe2e012f133bc7efb2111.npy +02958343-d4abda76f4db60086d07c55cf995503e.npy +04379243-319e08128a169440c3bd24f986301745.npy +02958343-b6755cab505f437375cad724c63e222e.npy +04256520-8d87711b1fc30783f06800d5696e457f.npy +04379243-d1c6ed48a115eed0659dda512294c744.npy +03636649-b8c6a482bc4d5da6fcb8d8c6d4df8143.npy +02958343-e69a5ad60aad3da2292296f0c84d7087.npy +02818832-f7edc3cc11e8bc43869a5f86d182e67f.npy +02828884-593251f67107e6b4db03e4f5c01cf109.npy +03001627-b1da0d9aab6d2308608505d960f2a393.npy +04379243-38fb3322efc35807486150a9b7f2cf18.npy +02876657-3861b002979703fbed4f86beca49f32.npy +02924116-2136de514b7c5e994764eeaa5c6e1a63.npy +04379243-124cc3b92266c2767156f312cf4e035e.npy +03636649-8b2b8b1048a707203c752b66cc923fdb.npy +03001627-9fd0c95e0112f6f8dcbca12e02e87571.npy +02992529-add38cbd2fd27d62cc98c9802550400.npy +02828884-2b90bed7e9960ba11e672888e1de63dc.npy +04379243-a5029c18a50d0e4be7c7920f6a65a54d.npy +03325088-d8f173b9cf9b84c728486e67fcce75da.npy +04256520-602e0f167c5edf327289c00b6dc9ca.npy +03001627-ec78623a598fb6d67fa68300c57bff0a.npy +02818832-9995e8f977861716e3ebe8b18779c486.npy +03001627-c4912ddaf24ee0fe7ea88ba060407992.npy +02992529-db89fa13b1c3c53afff0e9d5e9e3da5b.npy +04379243-60052d2cbcb9f8e725c578fb351f3549.npy +02958343-7f701224ca471b2ab8013668e30e23b0.npy +04379243-3365fa395d93bfd8f181ff4e3cb0a33c.npy +04379243-415e3d53c7a93ef88b90ca5a8d93018c.npy +03001627-e9821fb7af7db92b26f6c8b5b75f0ee9.npy +03513137-c54fc7db01647d02823590ed8a67d74b.npy +02828884-3fbbb64cce9b5fb681faebbdea6bd9be.npy +03001627-b8db5d63c7042d447cbf7cf495477037.npy +04379243-726c677962874743002761e7a3ba3bd.npy +02933112-2ce5e1eb83f4510319f778c7a8b12264.npy +04256520-87bdac1e34f3e6146db2ac45db35c175.npy +03636649-88d29e1350eda810c066b9622c005c53.npy +02691156-43d8125d940bb2ae850f318836ee7512.npy +02691156-a312cb2c9bb4665bd44389c0c0e68465.npy +03001627-5008eca8deba6555ee229bc98ff4457e.npy +02958343-420519a0f7390564f500cc506a763c18.npy +04530566-372ff5cab89350d23217bd20648fc12d.npy +03001627-640aadadf4fcba8355f9a00acc25f137.npy +02691156-49611834b200ece04c3a35cee92bb95b.npy +03691459-c198d2df79e4a40fde3a1fb6044fe536.npy +04379243-4b35aeb6ad7a0370f51945de050323d3.npy +02828884-248e0773a2a8d90879ba0a8466ed4e3b.npy +03001627-e5a8500223786886995e7ab497adca70.npy +03642806-6ae14173f5bface824a85bcf396c330.npy +03691459-eb9de225b5d502c1278fe505f40d50be.npy +03691459-fa6fab7bc0823f6e54feda409512bbb5.npy +04379243-eb9b9b8d186a974a7afee304cce81d6f.npy +02691156-2c5bdd9a08122f9e2023ec956848b741.npy +04379243-7e2c280b5839d502eee2d67fbfa67a7f.npy +02808440-556213319f5a21dbccd0340812259a39.npy +03001627-2dbe453ba389adf5f91663a74ccd2338.npy +04379243-9ffffefc4b5a04ec49ed2275c90a1298.npy +03691459-99f296d0bbae5585414ff38ecabd5968.npy +03001627-5ae7ef4cfaa6bd85b04cb542e2c50eb4.npy +04379243-24f753c88ee4376f19fb4103277a6b93.npy +03001627-4f58ebeb561bb94bb9e8bdc9c4a49aa2.npy +03928116-5a3017574c3ab9d61d4127b3f0e05b90.npy +03001627-a95b5ea73cf0c9bc8e72c17826417b99.npy +03691459-ef509cfed1b359a7dc1ad15ea0771770.npy +03001627-fe31beab802cfc56c2bcda262700befe.npy +02958343-fee1c13922c07e8711b978ff9450f61b.npy +04330267-d07660fd1f3ca85f4d1cd794fadc7ced.npy +02828884-adaf1ba4acf51baa601104cd2d998272.npy +04379243-cc445d016f3a487d84cc5b3c1e5e75d5.npy +02691156-17ac3afd54143b797172a40a4ca640fe.npy +04379243-5dbdb35766fd2d4c9f4b4145f6688869.npy +02958343-11e5b7d67058e1d75f67208653687b70.npy +04468005-f5cfce14d01f0c08157566c5ec7088ba.npy +04530566-3c5d0c6c971d39aa70cfb3232f40c6.npy +03691459-3655d8078087f1c62d563c85edb49108.npy +04256520-7140d5cf3fb0c528b43753a53e4593db.npy +03001627-8d5866194748bb3492d9da2668ec34c.npy +04379243-6dffe86c24e3870cbeedb4c8fd29e2d1.npy +04379243-bc5fdc598162f85076c7054c38bb1311.npy +02958343-fa9897315ee8b6ba67789dfcc3262f70.npy +02958343-f18093ac0242d439f500cc506a763c18.npy +04004475-d825fea4d6efcf11c4c8b2717842f75e.npy +03593526-c17615e76d2988802f841233486fac2b.npy +02808440-ea7913efbe22abed412deb0d2b0f3dcd.npy +04256520-ab38a559643b01908b424343280aeccb.npy +02876657-c3bc0cd2648e76b9187964c89b3399f1.npy +04379243-59366e331014e2248738e7290b6f3237.npy +04256520-785505b155a724cb6e92e37d6e2c659.npy +03691459-e5deab6728f237a6fc7703ebafc3f082.npy +02958343-f6e0b8a0746d36d74eb766e5a46fceab.npy +04530566-ce15225b24bb4ed2742fb0ba5ae222f2.npy +04379243-53fe29e7363eaa70ce898a7d76534f1f.npy +03636649-e02e79e028662e9ffcb8d8c6d4df8143.npy +02958343-911029433b8ff0f1afe1d4530f4c6e24.npy +04256520-695b90883d398e5b15cdaecfa8164583.npy +02958343-c896260b935971fc65d21723f535417.npy +04379243-55589c71a2abfe97f09df371fae9d63d.npy +02808440-18100df055914701d79a5415e88748c0.npy +03001627-b8e5ce05c382b9a3f51f77a6d7299806.npy +03001627-7f79aba01e8c572b68d1b9a1d97e2846.npy +03325088-b9816227a0b977c9b362845c6edb57fc.npy +04330267-a6912050e1bb1c13c7fb1a0a584939a5.npy +03325088-2d47bde73180097d76d20e73c57c9a03.npy +03325088-346a94616fa138bb85d4c34ee84c24a9.npy +03001627-6fde09bdd613f6e6492d9da2668ec34c.npy +03001627-fc4d15c15c56aa7baab4888e25356418.npy +03001627-2fa970b5c40fbfb95117ae083a7e54ea.npy +03325088-7d98283d7e6fa67a76c18e71fd49c4dc.npy +02691156-f57caba2eed21f2998459325335edae9.npy +02808440-1302d8860c7bd1e17f53f1372963d362.npy +04090263-82c04946433c4a8f63413b0440eeb6fc.npy +04379243-6a2c94b2c34c6134490ad276cd2af3a4.npy +02992529-cd1739ec8797049072f1ebe52d9b9daa.npy +03001627-e078876957aa6efbb0b0d46323bc2ae0.npy +03325088-eceb070402c34d37f38c4a12750d961b.npy +03046257-d8bb7dc20a30afe1f0aeabfdcb4e1dd9.npy +03211117-2e6204b4aa7ba83fbd28395acf9af65e.npy +04379243-f9beeefdebf70350f4b6538438a0b930.npy +02876657-64ad00b1757205a3f388b3201b32e1d0.npy +03325088-736123b57129c3bc14de2a9aaff52ac7.npy +02818832-c496214ce548416f4af8975fbcc96231.npy +02691156-1e6a71e0cb436a88a3a1394d6e3d2c63.npy +02880940-aad3cd6a40a15cb8664b3b9b23ddfcbc.npy +04256520-f9f7fe005455dbec215b8895763d1ff.npy +04256520-35b4c449b5ae845013aebd62ca4dcb58.npy +03001627-bda113bd71ea0352654ea6737b0d3597.npy +03001627-682bbcd00c5287a39d365481aaba80e.npy +04379243-268116c288b215c43dbb6421d614c0d.npy +03001627-1878633a36518ffc19fb4103277a6b93.npy +02942699-3d18881b51009a7a8ff43d2d38ae15e1.npy +02773838-758dd5af7f18ed9acd99ccc7ff441abf.npy +03991062-9b56496d8e6be657ff67c12005f72d2.npy +03001627-a7d75c84027af5e7321f25048c6142.npy +03642806-8a0edfd20cdfc27d8ca8637757ac3f67.npy +04256520-cceaeed0d8cf5bdbca68d7e2f215cb19.npy +03636649-4f62263f7bb10280a5f600ed2cf472ac.npy +04090263-2fe46eacc06b51bfeb8dcf90fc26e10c.npy +04379243-acc0b552910e603955f46d55537192b6.npy +04090263-cb52cb876bb3ec76aca1893e093d31f3.npy +04379243-bee1f4fa0730c6c5735aedaf68f44c57.npy +03636649-9bbe778f05a04009fcb8d8c6d4df8143.npy +02958343-8109ca22dd6b5772bb54d0b0194b4764.npy +02691156-78551e5fc01df70f77fd7318510b8627.npy +02958343-2830f11dbd7172222214ff09b39580e9.npy +04256520-2e5d49e60a1f3abae9deec47d8412ee.npy +04256520-4a264b02e0d8fc214b3c42e318f3affc.npy +04256520-dcfdd81e4410dab49f2349486c570dd4.npy +04379243-4b6d73d06b7359f26cca17c12e67a536.npy +03467517-b68c1576d19b5f1b93b667ec2f48a310.npy +04460130-c85bd50e2ac803aedfca80608ef618ad.npy +03001627-d657236c764dabdf5de9b4b5ce85d50a.npy +02933112-a32e351352e1053ad124fd2a448c2915.npy +02828884-2b25e49c58ae0e292056b4bd5d870b47.npy +04256520-2b7e704b07fd21febe65001d50394fd9.npy +02933112-623c347d2d5cd6b4a66c900acb409285.npy +02876657-957f897018c8c387b79156a61ad4c01.npy +04530566-d9e044a3cdd4359110f59460c26e963e.npy +03001627-a2441f03fed7c13def31f91fe6afc8fa.npy +03001627-75d3fc4649a63ac13efeda73d60343e4.npy +02747177-acfe521c412fcd04564c0afd61663476.npy +03691459-f0b4735b45d1a6b51aadbcf355bd688f.npy +04401088-22fc328d136756361e5d846d206adf3d.npy +02958343-69aaf42f0b8d0e2da37127a27e431e39.npy +02924116-e4cbd9d5a9c5b7d241cefd10ce5d6cc0.npy +02992529-76a4a3e8370bdc24bd2d4107e8dc02b8.npy +04090263-9f4c4c60efdb3076d02276f7769397e6.npy +04379243-8ee19157170f16dec12312ed5983ff64.npy +03001627-122a480cfcdd742650c626aa72455dae.npy +02958343-b1ad30609c2fa8a2d63b3823877bfa70.npy +04256520-3a27e270712fe178ce59ea70152320fa.npy +03928116-413f8963de404dd6c3c1160502619061.npy +03001627-f2af2483f9fb980cb237f85c0ae7ac77.npy +04379243-ee16bda18e585ce3445e85eb534460b0.npy +03790512-3156fd3e3101da329b0e27507dc1a100.npy +02843684-514e3ac98b1d18565ae27b5e83f8a47a.npy +03325088-fef67b0b5fee52a1843f813f752a5e35.npy +04530566-b1991078d16797eb221fc8bb1161b418.npy +02933112-88a1a68c64ef85394da5feafe6f1c8fc.npy +03001627-341c9b0583d31770492d9da2668ec34c.npy +03691459-bd1ffe5dcd7239d8299f55a072267eac.npy +02958343-f66180e68fb1c98469f2880702ff1c7d.npy +04090263-630818ee20900d67fe0b9f6d3db7b59f.npy +02958343-ffb4d9920493f1e5c29076ad43b687b5.npy +02828884-f3ec1b92140e1d80cb2a965e75be701c.npy +03001627-11e55ca087c74082feec1f13d2353f3.npy +02924116-84d8f737e423d441bb81ac54404de04d.npy +03001627-61b984febe54b752d61420a53a0cb96d.npy +03642806-11448f34681c545439f3410d5f76299b.npy +03691459-6b13ee07cfc1eaf7967b9b287e3372bd.npy +04379243-62eff79cf2e75bc2765ee729adbdf968.npy +03001627-b274fcf203b9ba7612c19a9a8d2be7d4.npy +02691156-d38922599bc74f6da30fd8ce49679098.npy +04090263-1037acddbd363ef5782611375da5ea9a.npy +03001627-b5ae5354fe7c166319cb07ecb5b4102.npy +03001627-7d7b3b8a1734154b3b8d5c0ebdd194c8.npy +03691459-e6b83a9d10349930b611871e114769d9.npy +04090263-bc8ffdeb04d8526e1f2a1daf140ac9f.npy +02958343-1c490bf1c6b32ef6ff213501a803f212.npy +03624134-76d4739797f4cec15d3426ee101e9f8e.npy +03001627-8fbe7ef85a9c57db784a45ea6efa1d77.npy +04379243-e42f2707bec24e028bfc6c6704f4dffd.npy +03001627-768acb4029f2d682bfad749b583f6a07.npy +03001627-892529626a1710cf17ef8b7bd64bd7f2.npy +03636649-c9c2e5fc4d00db3acd99cc18cb18bf34.npy +02691156-ec4f0bfd77978a1cca8607f540cc62ba.npy +02828884-fa1ab735efa7255c81553c4a57179bef.npy +04379243-f0b827eed9f044bdcdcd8e1ae308f03a.npy +03593526-d214b7c1d3b40f935e7cfd06717825f5.npy +02828884-7d1e56ea7f32d634cb2a965e75be701c.npy +04468005-2c25a659d3f1b5d5543c83125736ede7.npy +03636649-42129d6b04cb9038b2f7093e7efce142.npy +03001627-91dbbc203e8562e6238f27554ec73a59.npy +02958343-5ad4cc3f8e191c61d31d4c555d4c5a0.npy +02871439-a82d418331301d2c664b3b9b23ddfcbc.npy +04090263-439fd95bcbf861f572cad024c77ecfb1.npy +02691156-77c9fd0f0c6b0e9fca8607f540cc62ba.npy +03001627-f230308627e5edaa9d796919a8d71368.npy +02871439-3ff6c9fb0941dab184df0a86512fde14.npy +03467517-b6f78c76441e30fbb60d315a520dce5d.npy +04379243-54f33905a3c8973a4b3c42e318f3affc.npy +03001627-27e757d4ed3c929b75c39dc45570367.npy +02924116-7f2de63b2c90a0633b1a772db543a132.npy +04379243-889a50c35328c8ddfd91359c9f546b9a.npy +04256520-18a6381f8a0dffc876828214888cb11e.npy +02828884-5f355af51670666cfbf62ed378434fd1.npy +03991062-e0ba02e9ab9e9ecfdae1b60026a5409.npy +04379243-ca22c129ee2ad8a1f0ca692121a428c5.npy +04256520-251fc26346ac1897febad4f49b26ec52.npy +04379243-6d4fad5487a044249dc30bab479ad5d4.npy +04379243-de1d044910991a072d184f71ff3205f5.npy +03001627-b7fd3cf7f37e22e6713decb1a0563b12.npy +04379243-faa5d5ba2a002922511e5b9dc733c75c.npy +04090263-f4775027ca39270897ddede15c51e64e.npy +04379243-c9f85a671d551086d61f9b2773e1d72a.npy +02876657-ea200708a0779090eab2bd7322386ffd.npy +02958343-99efa2111f3be22d5fcb05674109534a.npy +02992529-5ccde0c95cc0538ef39072555215f568.npy +03467517-8accc9161ad74bd4d13ea145d0a10775.npy +04379243-31ecf1e704642491ce372179a495fcb.npy +03636649-ddeb5d944c128f78b0957d845ac33749.npy +03636649-50a3d09ac90370ec9c48f338871146f5.npy +04256520-be2d759412b18995946789884353d9f6.npy +03467517-ad63f2323dae4b154b938e339e865d2d.npy +03211117-f3d6470b3f4f5ad71c7075c2bc313334.npy +03636649-76eb7436c40e083384d184bdc625781a.npy +02828884-7ac9bc04a2f8e59c7a19c607757a04b2.npy +04530566-d0652ef190720c84f4e9dade6d46323d.npy +04530566-68925483ebc30618698ab31ac670e62f.npy +02691156-f8fb835bdc55ffffdc82b8fee1057b30.npy +03001627-6ec02d7a508434f1b0957d845ac33749.npy +02958343-9f703e578b4b36295b74572d48ff6382.npy +03001627-ef10235a28cdf7cda16af3198c99de08.npy +04401088-8b4c89b8f756cc6e78fe949fc1419876.npy +03046257-8fba28ff0d6dd6bb80d26506b9358671.npy +04090263-db97f4931d2da6e53e1271d7bd927006.npy +02958343-dd184b3f41891cd317c40808ff7018fc.npy +04379243-dbf2123ee206a81b8b00eeaf68a1358.npy +03001627-3c8864b07a5c0718861df5a407858f2.npy +02880940-4bf56e6a081c2a85a11f6bacf5c7662d.npy +02691156-c2d5bd1215248f9c8b6c29bda2bc905a.npy +02691156-a00f6bbbba234739b92527b70e93ee2c.npy +04379243-c15aaf668a80aad9ee5912a5f7e89744.npy +02773838-2022610a5d1a8455abc49cae1a831a9e.npy +04004475-2f0086118aef1549f616f642bcfb80d3.npy +02933112-ac499f75479d2e372ad490d4d7fae486.npy +03211117-6272280e5ee3637d4f8f787d72a46973.npy +02958343-350be6825c19fb14e0675251723e1e08.npy +04090263-b90a8fd2c92f5d26ac0fcae21e22e3fc.npy +03325088-7063aee9b0cac797b362845c6edb57fc.npy +02924116-a701862b4a209173c98c13d6112727de.npy +02992529-436d7a114f72dc03d4713685ae50fa13.npy +03211117-54ec97f055d68a78ea0068b966c5177.npy +03636649-2af78c0b040634e5881cd5e2fd8f0f3b.npy +03261776-c81c908ddf6c48744310636931b68fdb.npy +03593526-cb451e92ce5a422c9095fe1213108032.npy +02691156-c5d0dd7a7b44b079a76ffc04f04676cb.npy +02933112-6c01e409fb522789b664d1885442ba70.npy +02946921-d052c17866cf5cf8387e8ce4aad01a52.npy +03325088-4477714b35747609f34d244dc02df229.npy +03691459-b8417869805cc9913ef7ad0f5cedb0e3.npy +02992529-d5561b05a6b84a5489905122ac8b41f3.npy +03001627-22f030ce09693f4c65c99f3aded15b93.npy +03636649-fcd263dc05862ad1bec3353c29751fdf.npy +02880940-9a52843cc89cd208362be90aaa182ec6.npy +03211117-ab64dabcbaf1086f14d199c00aad9da1.npy +04090263-e479b8f33a323147f0eab8a2ebef8e89.npy +02828884-794573d3e6a2c4ddd845dc43591f551.npy +03001627-30526709beea1350c862eec8232fff1e.npy +04401088-a0a41f9444733969c3d30d5f04be159e.npy +03467517-f440f59916c2ed897b076baeaedfec9b.npy +04256520-cd06c0f38b4db9b4c397356311cbeea4.npy +02958343-7ed6fdece737f0118bb11dbc05ffaa74.npy +04256520-ce3055223e53a46e67d4ef1ee6cc8170.npy +03636649-e0e365a2927a7a73bafad60030e6ab60.npy +02691156-865f434c71d41326c9d5795160525060.npy +03636649-3879234efb8e60219f6b6d8f19761cb8.npy +04090263-5dbe96b00f0d7b201b8fee1b14934c0e.npy +04468005-e40a2d72efd3e67ed85b408a8edc983b.npy +04379243-33bf7aa0aa429a98bbfa993b02d27a30.npy +02808440-40f0604892e7b4268a7ab8a2c534e9e7.npy +02933112-43ed2ac5e1836f5ef51f77a6d7299806.npy +03642806-6b4698eadedd956cd2079b28d473791b.npy +04468005-cefa8b1b55922f419e5c987c836cf01f.npy +04330267-563f955f46e4368d8ae69567bc5a3efb.npy +03636649-121286f843ab37f71735ea0e092a805a.npy +04379243-572abcadc95a8ed14b3c42e318f3affc.npy +03001627-28d27f1204c1b3de6512b7b24f3d84.npy +04379243-ab7405d5b3ae15565e7087f2d9a278a9.npy +03001627-1f1b07bf637b3a1582db9fca4b68095.npy +02691156-3ecea45bfa541b8e4a4dd08ffc16eb81.npy +03046257-4b1283cead37c519e49675db0062ac74.npy +02691156-a82400edb160c18fc8727b27ee96a4b7.npy +02958343-1c14ef4c48b7d95d61c6c61410fc904b.npy +04379243-1613e86311fd7601c103f0a69924253f.npy +03636649-68491d576b5d35aade8e7376ce4e111f.npy +04090263-5ce2da67625a1415ae42d8f433c1cdc1.npy +02818832-3a3a4982fd12d3d7fcc95bb239c4c353.npy +04379243-3e0b229e646595261a719e2a845bdada.npy +03467517-c9b60abdc17708fb78ad94b294a9faa6.npy +03001627-87baf0c4bd11ebe7f771b7c5ceefa9be.npy +03636649-4da9ae6448c860243dfad56d2a4eefcd.npy +03001627-4bc5a889b3ef967b9de7cc399bc9b2b3.npy +03636649-d8a5c77da4c92921f7258dec1a592c96.npy +02958343-ba1b8956b1d84856369912a1ddf80ef7.npy +02924116-7fea6a3b4f76cf6d1b78de62f6c48608.npy +04379243-356e173817daabb0f44dc88afcdcd380.npy +02933112-56f7c9a029b6b40d12de5317fe5b354f.npy +03337140-992b47933eb0f924c3aee8e9d3a6ffa.npy +03211117-5a66f2589c7df206e1f2a1daf140ac9f.npy +03593526-c6ffb2891c1ea743ad8827e8f4f151e6.npy +04256520-9b08d6288f208362dac562275d66ec29.npy +04379243-c4998912c5b40b8de1590f407a430d33.npy +04090263-e85f80f7fe4c8f3266597c7d470782b4.npy +04256520-45e5b5efe95ae98ff2be27e9cc5f92fd.npy +02876657-f6ffca90c543edf9d6438d5cb8c578c6.npy +04379243-6ea2512df0b4f49244175b4dddf5be08.npy +04379243-f247cb60019ea321dffe3352803d6df5.npy +03636649-7972fd0fe5755b4ad42b9650f19dd425.npy +04090263-2509d876e7521634ad26d867b17d1a48.npy +03790512-170cfc531a4fd09fe6905ba5363784c3.npy +02876657-a95db9f4cb692657a09c6a60c6dc420.npy +04256520-918ae8afec3dc70af7628281ecb18112.npy +04256520-c9fb9cb259692ec0f7248d9dbed7a7b8.npy +02691156-2c3ba3f35c5d2b0ce77e43d0a92bdc06.npy +04530566-8b3cf3842a88136c67c16c85d5f8c7d7.npy +04530566-16f53391dba14c9829ebc23acefb248a.npy +02958343-6291f064e64c6eb9d18a5bd35f0d115b.npy +02828884-9596592f31910b9684a9223b0abc0b3.npy +03001627-dcbb15dad2001a0b8a4c763d71484708.npy +02924116-1134df3dbee4c3dc221d7b13f13a827e.npy +02880940-960c5c5bff2d3a4bbced73c51e99f8b2.npy +04379243-ddbbe3651f274503c7f9b652b66aa35c.npy +02747177-60b743e913182e9ad5067eac75a07f7.npy +04379243-6e1dc5da243fc523c5f48f9175316bec.npy +04530566-bfa34aeefb04b4c2356c09782a9de7a4.npy +04256520-bed924f1f1208f37f0bb193323cf7c6b.npy +03797390-6500ccc65e210b14d829190312080ea3.npy +02828884-d5bd619acad1bed3d2b12aa6a0f050b3.npy +02958343-97831a753d80d66dfd24692312e9de8c.npy +04379243-8f8954e310eb265bd42b9650f19dd425.npy +04379243-49374090de654a54fcd4910413c446d9.npy +04379243-283844acddc9df141191025061735ea3.npy +03593526-6a13375f8fce3142e6597d391ab6fcc1.npy +04379243-21009983c23be33dde39a695c03bae3a.npy +03325088-df3f006c8a8a59547bae653f822044a6.npy +02691156-5413e0eca808b2601f17e8416b3322a8.npy +04379243-549bfb6738e5c5a019fb4103277a6b93.npy +02828884-a64965f10047f31db3ee3d0077feb1bd.npy +02691156-44c0cb6571f6f000ca8607f540cc62ba.npy +04090263-b06d8b805dcfd1ebe212dc904164c2e0.npy +03642806-74eeef3fb670363550d5454e56d54b19.npy +03001627-68dc37f167347d73ea46bea76c64cc3d.npy +04090263-736af7558693f029774a2bc3e125b7e.npy +03001627-d4c3dd37d27afa8e7c5910dd17778965.npy +04256520-6931000a5a1932b6a494798fa117187b.npy +04256520-26fe44345859362569e2e0d2caa039.npy +03325088-2031479400b516043792c04fd8184496.npy +04256520-d0fcb2993379cf9ed72ff9ec64cb596d.npy +02958343-d8c7f76320624fef02d716c401defb1.npy +02958343-5881807902ace2dc7d26edf2a8ffb68.npy +03325088-8a1de547037ee5a4b362845c6edb57fc.npy +04379243-f7ce798a5ea0850c4b3c42e318f3affc.npy +03636649-30fd90087f12d6ddb3a010e5a9dcf3a8.npy +03691459-c3fbe6332f413bd2bddb05cb83a4378c.npy +03211117-b0c1b6c373c4ef3a83f09c7d0a6695f0.npy +04401088-13dfb842c1944c64de3b109acc7ed8a.npy +03636649-6b9f509d91eeef913efeda73d60343e4.npy +02933112-36bfa6f0a5897be786d53ab0fe94e911.npy +02992529-dd996020281c929f73caa5ba625b1f4.npy +02808440-30247fa574c0f87b35e6699e9332d49d.npy +04530566-3cbb8096ac9bef3533ffceb8a4acbfe1.npy +04256520-9adffacedef7ae4219fb4103277a6b93.npy +04379243-39b851143b4f68ba21d25a6a55757584.npy +02828884-77fac848d4c863b2cb2a965e75be701c.npy +04090263-13bfc7f0f9fd39f73a6842b1f893c19.npy +03001627-25b55c1686d6114de0f3ac5d28aef4d9.npy +04256520-60fc7123d6360e6d620ef1b4a95dca08.npy +03001627-3187a69dae9fd8dced403132b02528bd.npy +04379243-8215382c95d5dc0a5c6a44a505804654.npy +02691156-b9f486be9d0160349a6e43b878d5b335.npy +02691156-7006c5afe5175d76e69ef11112d71da4.npy +03691459-982f52d3117411a37ec3f7c14c03a92c.npy +04401088-479e2ed536698d478f257ecba9a6ef8.npy +02691156-fbe788465e564e46bc0909d98a1ff2b4.npy +04401088-a82fbd031a79f88eb6d41c42f7ade8c8.npy +02958343-c08d4483e70f02e5322b377b3e7c8ad8.npy +03325088-a76a5fef802be0b5b362845c6edb57fc.npy +04090263-2288e5e13ae8aa7192cea77f96988ae6.npy +03001627-78fbcca91324c141ad2e2a7cbbc076b8.npy +03337140-381cf26b050bf515820018801b237b3d.npy +03001627-44b317a5dc651210e76bc197b3a3ffc0.npy +03211117-ae33f2b2031069e0dc67390c888f2eca.npy +04530566-39c41184f49edccbc381729395a38d7b.npy +02933112-8f8a2633debaeb96c2b64c0adffbe398.npy +02992529-be66886215eafadd56b70d2dbf032aa1.npy +03001627-d274fc14092387c1e17e1cb731e2fa4f.npy +04090263-ce8a04e433d06b03a0ba30bb56da40fe.npy +02691156-f8d7d8331fe29f247209009cfb89d4bd.npy +04379243-cda2b04eb27a6b429ccce4c6d5bb195f.npy +04379243-7ad475266c37d4d3588d78fa7ad8e5a3.npy +04256520-b28f66155cb67bbbf182e66e17d08d5a.npy +03636649-6baa8b21a080da186fa63795f94c4d8c.npy +04256520-b4043ab6723a39f1406316a80ad8bed9.npy +04090263-fd0e1e7c62efab3cbde9b246866ffe11.npy +03001627-41896e1532fe1e63bda72093f9b5aa73.npy +02871439-a9c2bcc286b68ee217a3b9ca1765e2a4.npy +04379243-552692f06e4fb0c9ec5b06c6d7d7648.npy +04379243-fc42d63af681a927e14dcb97ba059872.npy +03001627-71372a09d0dec4f2e3837ef7356e7613.npy +03636649-ba397aa90c4af6ec98d5fc0473d00a1c.npy +03691459-c0add53ae9928d73b184474322bd24ab.npy +03991062-c85033738a03ae6a3b77ef2474e90dcf.npy +04379243-64630e265ab5e1604b3c42e318f3affc.npy +03691459-e6e7c3e1b887d2a1751b29c8fc6f20c.npy +03001627-bed17aaa6ce899bed810b14a81e12eca.npy +02828884-9795c0ce0679cacdd201085e80edb26a.npy +02958343-b6345c309ba64f97e97c6bb243ef67d.npy +04379243-47e24c3995150688d810b14a81e12eca.npy +03001627-80544a1e0e443c7d5438b83aba42ca46.npy +02828884-af264c02f69566cdf4fb4dee5181bee.npy +04090263-78e2a75ff1d93138e8914057d776d90b.npy +03761084-18234c941d0421729e8ab085b6e4d874.npy +03636649-e4d3e153ce7f9904e76bc197b3a3ffc0.npy +04379243-2b4cee8331e825806bd0aad3d992cb54.npy +03691459-63f13073406d8a2b4092d3b515916436.npy +04530566-5adf37321156a7bcbfe1cbc47170312.npy +03636649-dbfa4bf005acf00d351d9ca36f76b95.npy +02691156-9c9d6469ecdfc54fc2a9d7232db0ed61.npy +03001627-4499729e53c858ae71a782a4379556c7.npy +03938244-51f5522d1b9088e2d7465eca206fda6f.npy +04379243-f1fa3fac81269971820018801b237b3d.npy +02871439-48d58a4f43125e7f34282af0231ccf9c.npy +02808440-ef9318f2fb898812610c2a68437007d6.npy +03790512-fd53bf3eb05d8ef4312a95c7d4d74309.npy +03325088-3f99e84747ae5e0216f1e46eb2815c0b.npy +02958343-65332c9a15126b924b3ff698267962d8.npy +03046257-242d1fdad67de9d6f2543b208c9ee8e2.npy +04090263-595fcd065407f54ca97e1deede586e49.npy +03001627-3503fedf43c99f0afb63ac4eaa5569d8.npy +02828884-55619caff40ba259601104cd2d998272.npy +02958343-d43dc96daed9ba0f91bfeeca48a08b93.npy +04090263-8a071ea65e9057a1c7c8ce3bef5c2aa9.npy +04099429-d15f389919446c40d4a6ba4a33475f32.npy +04379243-de4fb391ab81be927ff6ace05b36a5.npy +04379243-57ee5654191b4265890992ddacc04113.npy +04090263-7f5f905397b76cd2304a8d13750ddfa.npy +04379243-95af60aa8cb9be066a76e23e6f966dea.npy +04530566-736e45984ce6645cda5505f71d8f8d5b.npy +04468005-f49f6eac711e7e97413710d5de208fe8.npy +03001627-61dfc04e60e3df4b4c350d7ea5fe2a3a.npy +04379243-fc7a8af42911dc77b4169e4cad9bb63a.npy +03337140-ad6624317d8af2d44c3aee8e9d3a6ffa.npy +02933112-68f25e77ac6bdea7de650492e45fb14f.npy +04256520-d4aabbe3527c84f670793cd603073927.npy +03001627-94bac9505cc503567085b4353236aad.npy +02942699-1ab3abb5c090d9b68e940c4e64a94e1e.npy +03001627-bc6499abd6192f128c605f8788f64de4.npy +02933112-2537e62a6495a46bc47fc2b7741fa.npy +04379243-8345588ba41cd2a87e4bbc5bb7fd2afa.npy +02933112-14c527e2b76f8942c59350d819542ec7.npy +03046257-b086cfa7419c820df69d21260b05e361.npy +02828884-219c0e465d55e89cad5067eac75a07f7.npy +04379243-459304c1c27aa82aa14bb1d7e401bf06.npy +04530566-5b1ef304e7a8cebde255aabfeb1b2b82.npy +03325088-240b8336c85be71750da8b99982a3057.npy +02924116-f0fb07c3592f55b2c2ae5d9462fe97f3.npy +02691156-9a0f4dd21a4ca19bf1cb19f636b1c2bd.npy +03691459-d76360da1411848ace1db673cf70420f.npy +02958343-355e7ad1d5664421898b91227342b00c.npy +04256520-569c7293b52b633814038d588fd1342f.npy +04256520-56df8103181fd18b27787a85c3bfabc6.npy +04256520-f9429d6bef2df25e4dbf8d635749f669.npy +02691156-92b7d0035cefb816d13ef00338ba8c52.npy +02843684-9ea188aa06a7a240290d6bb85a775cf0.npy +04401088-864e5512dd35164b2d477e233bc97afe.npy +02992529-e513675ffb2da709a060e584e7409aab.npy +04090263-d91e08ed981156717a362e61d329c7ed.npy +04256520-ef185107fb8d70ced06d60299de4d22.npy +02933112-19a0d9e5e036290bfe9e4fbec1f7cb98.npy +02828884-e6063d88a2b192ab56f6fc4b4ce1db04.npy +04379243-8a37a87d367ec0fa276b6f6d90ee3a83.npy +03691459-591613a69c2e212f78c0a4707b40a908.npy +04379243-71752a166bbbb06592bf3ce6b900c3ae.npy +03467517-8c9cf16672bdc795f94083089dddc4d3.npy +03691459-e08b3ac3bbae3dfe5580bd812eb6e71.npy +03593526-a88577a2ecffa8e858323e30458acc42.npy +04379243-994f6d12ab22d187c03d8b4214ec06e9.npy +04379243-3e0b8992e00a327bcb2a965e75be701c.npy +02958343-9d82d5874349f623d834dead2eb68d68.npy +02828884-9b15c79ea9ddff8d5065e2a2857d7fb3.npy +02818832-1ef20a206e940a4bd79d7db7b8ed51c8.npy +03001627-30363681727c804095937f6e581cbd41.npy +03337140-ccbe4636d7a55cbd7a50afc9c93f8a50.npy +04401088-e8e9617b4f7247fa3578fcb734a22822.npy +02933112-2862558059dd584c59350d819542ec7.npy +04225987-303555f1c5f4cb0a1082f2ea630bf69e.npy +02924116-d92a10c4db3974e14e88eef43f41dc4.npy +03790512-d6bef9011ee021c677b7d0d4764c121d.npy +02933112-283fed24177526de7eee615e75bc3b77.npy +03001627-91f867d862e6c96c3ea242d1c18c3489.npy +04090263-f5ab909cc5813c7ebe8eb764bcb3c31e.npy +04401088-e6838870d0138aa43b995d74ae757c1f.npy +04379243-9f732b16a7faf3fbf4052eb4c07f564.npy +02924116-b6451e8ac7d3af0ce7132c57a8d37e4.npy +04379243-50fdd5311091e5d742d09291b1705b96.npy +03046257-f1e9b69dbcaa8ca84b3c42e318f3affc.npy +03001627-63b84cdf260ab81b14b86d5282eb8301.npy +03593526-4ed93b27b2b1ae4a17d01689ded74b74.npy +03211117-d0959256c79f60872a9c9a7e9520eea.npy +02992529-8ec44fb44e4a3224795284068bb430b2.npy +04256520-669568cff92228b4e6fe3612af521500.npy +02691156-92e2aee5e86c0fc870d98a97e17b4da3.npy +02691156-d78a16856adad344670aaa01f77ae41a.npy +03991062-dbd112b601a9d91ce651568bc8a2644d.npy +04379243-e8d505c5e89f313dd42ec7e303174a87.npy +02828884-567779d7087c75eead5067eac75a07f7.npy +02992529-d9ce2d0be1f3952aa36bec4fa7cd58c9.npy +04379243-77a683709892e56fc535a1d76df92ef3.npy +02924116-7c2a4413154a1725c95c7a8a79dc0c72.npy +02946921-4961c651fdb6b45fa57e04ecfc2d7abd.npy +04530566-5b00c251f971aaa437a692cc86ebcb7c.npy +02933112-77ead277434621b5343087e1efdee691.npy +04379243-a9fcd41e05a12a0d7e1dc03b595bd36c.npy +03001627-5ab321d70991c94d780bc2708a85ba9a.npy +04225987-58ae991bd0350810b9ac379f661f5c75.npy +04090263-f53a4093fb00a490683e3750b53385d5.npy +03001627-2e291f35746e94fa62762c7262e78952.npy +02818832-b765b2c997c459fa83fb3a64ac774b17.npy +02828884-72dfdf42a06d55f61985df8e5a34361.npy +04379243-3b72f2c31c5aac6ab3421b3649fb16c1.npy +04090263-282f9e161a0bbf58fe00453e7ccbcad3.npy +04379243-70995336d06fc07ae9f3e9c758fef992.npy +02818832-fd1f49ec5a690d53c3bd24f986301745.npy +04379243-3d08a0ed3ba94fca6652506d959dc71d.npy +03211117-f1b1a1badc8ed7e739d3eeb007af69a3.npy +03001627-4a0f1aa6a24c889dc2f927df125f5ce4.npy +04090263-255b002258e74085d735fa1ab17311ec.npy +02828884-e03e7aab2967929d3fdfe80ff0b57538.npy +02958343-5fe3753b18cb01ae1b581e1887fa67b.npy +04379243-8374ea1c4c032ec8488ef35e8e3ee601.npy +03001627-40168f46019eb867be7e1d42d63ca9f0.npy +04379243-ec565aa9b442ac36ae6afb0c7fa710a4.npy +03211117-b13c22f9eda41f328c504ffda4ce2aaa.npy +03046257-955b66d63d6a92f5132fd0b3f17b0d6c.npy +03001627-98d20227789f5c9a5af29473330f42b1.npy +03001627-7bebd3cd1be32a0646f7430ae2c8ca51.npy +04379243-481e479cb50f251a7cc7de242a4585fd.npy +04090263-faa1fb485ddd6c9c8bfbe54b5d01550.npy +04530566-e3fe6f0e74fa641c2247d987054751d2.npy +04379243-9477f34f16c650f7cac9ba4482ce0612.npy +03691459-88bafe4a96ff3348dd1080d43103149.npy +02691156-e87902d01d40c71521b1ceea9c93aa79.npy +04401088-5c8d554075a904bfa7ca3fec59d82214.npy +02958343-2d8b8d98d4e3c76e3000d241e527f650.npy +02958343-5c542cd5371a631d6436916a86a90ed7.npy +02933112-55d1668a7d33f8ebc0b2397831029b54.npy +03636649-d466b21fb042a2ac605afa80919f9592.npy +02958343-4c60f32b6efdc7217dfb1ee6a4b12bf8.npy +04379243-411811d0fac7dea18705931e60ead6a0.npy +03001627-32b7f9324c56d6131b02cde7e81f0fc3.npy +04379243-e5eb64f97f6161ebf51f77a6d7299806.npy +03325088-b405f1da8275fd1214b35a7d7cea7130.npy +04379243-14d0926471af661e3087f84b199fd297.npy +03001627-7252a2c022a1a3b21f285be552b78f9a.npy +04530566-fbc2e96b16209642fc86577bf738024a.npy +03691459-eadad629c581c28c6b424c689f1d711a.npy +03211117-85395b5f99177f864311b8458795b94b.npy +02958343-3e37a76f38d057cd3f823401cb5b3c88.npy +02691156-de65da5cdc92b4aebc0909d98a1ff2b4.npy +02828884-42ffe8d78c2e8da9d40c07d3c15cc681.npy +02958343-30feb9f00597aa2a3781057335c8a2e8.npy +02924116-41fa4235493cf5d9acef723912f2fb61.npy +02992529-ac8d3abc6a6f7a939260029564d4cf0.npy +03046257-788ec08ac9682254f504bfef7c734006.npy +02924116-a18fd5cb2a9d01c4158fe40320a23c2.npy +02691156-eae845d4a7945ecaf2e466e56cb8c63f.npy +02924116-a4617051ca47db2cc29b99b0b80dbb7f.npy +02828884-3e0694b77418eb25d2b12aa6a0f050b3.npy +03001627-2b55385a63cf62f6bababe11fcea8796.npy +04090263-aca833639091b256922309b37ed10e7a.npy +04379243-34208e6a1f53551366d6af16d45fa132.npy +03001627-485831d92925bf03f3d7c13662c10792.npy +04379243-7a7188e439a39ffd9a2cc6d7b7b4954e.npy +04090263-c45c9f4ede3246e6a54581b3915c3bcf.npy +03001627-b88d8b5e5fbee4fa8336a02debb9923b.npy +03001627-ae6770f159b2f7c868c51305d76b1f8.npy +03001627-c58f6a35f86a1802e8f8c11a24c52ebb.npy +02924116-398bbd8bfc14e9d8df98386e2670b45a.npy +04256520-70ed97376be1d0a84301558fdb0b2522.npy +03211117-90d97637c01fd05e59122da3e1ccb92c.npy +04090263-72b28bc54158f0d512b38b1d99376c0b.npy +02933112-a2dcea3f88c397f487d0ef3f1f8b9c07.npy +03325088-bafb5f206f100bffabd7f138f3335c2b.npy +02933112-57041ab17b34eba1f49237e570f62c8f.npy +02691156-acd8f367c36a3d84fc7a6d75b3d807ff.npy +04530566-1356fcf0ea4a95bcbe7ca2216dc1576a.npy +02933112-56625ccb6e7dc3fdc59350d819542ec7.npy +02958343-f24129eb2169197c203f35d9b3b48203.npy +04379243-f2c4fbc0c7c9b87d961b3f02493c4f73.npy +03759954-506f9ea22fc92da4161e123a102b12b.npy +02828884-7139a01aa4fd148b7435838026088e5f.npy +02808440-b16eae893bd12a87b8724a732b3d4cc1.npy +02808440-5e07cb24ec93904bcc6434361376a7a4.npy +03691459-d3e279ab7bb0dcbb85d9d97241397921.npy +04379243-d704a2ea75d8a2b3507969980fe06783.npy +04256520-1210afeba868a87bf91f8f6988914003.npy +04379243-eb6f0eab4203ca0e1c19e7863a1c200b.npy +03467517-7e6d283b6c6728ab343b0b12983b9982.npy +04530566-e19c3bb778bc8e9ed372f295778d1591.npy +02808440-3b222c644a783ebbfcd4910413c446d9.npy +03001627-713d651528ade2516bbe7b731c00d0e5.npy +03991062-28938abdb2114e53bbc7a6acbd8f058b.npy +04379243-f1a6dd0d5d9bccf3825a5bc524f67c9.npy +02992529-ed004bce9e457ab037c7c775913296f5.npy +02958343-b3be6c7fdc27043ad63a36acd73ebb29.npy +02691156-483207a72a39129771d03b466c72ce41.npy +02691156-3547cdf24eeabdc925194e2abdb4c403.npy +03691459-324c0e25576498485373b650bcccdac6.npy +04530566-f90a485c72b6047b102edba1bfa321c4.npy +04090263-c0b2ff6229e1175aae9e1c81f7e5b0b6.npy +02691156-1354e0acd354a3ddb6670e1d7042072b.npy +03790512-532e6f88a9975a27b37378f3c85478b4.npy +03001627-e8c8534a16d600ba20685b5a7e34b501.npy +03636649-9896b288bc97e6556bcc48b8d936ddf4.npy +02691156-e521828113e1e0c45e28caa3b26a73fd.npy +03001627-u1e22cc04-7c4d-4ed5-bda3-8ff8067f22ee.npy +04379243-4c51b04b1b32ddcc4ef96d1bb8be503c.npy +03467517-4275faf3b0234007f03058f020a47ca5.npy +02958343-ee63549013035c385e28caa3b26a73fd.npy +04090263-d400c42c4c4b3ec1589c07868201b17e.npy +04090263-175ac778b726ef5d48cb5e52f6edec2b.npy +02933112-8b23fc57517a57d0523cc82298d77b36.npy +02958343-7e3237619d96b6e551a95aaa6caba1d3.npy +04256520-867d1e4a9f7cc110b8df7b9b18a5c81f.npy +04379243-2568994ff8112b6d65daa37b7e13aee8.npy +03948459-79c0cac016998c7cf7ba4a82f8032357.npy +02828884-1f4ab55de315d6aa7d77abe0f9632d4.npy +04530566-fa63720ea3f8bd379a6e43b878d5b335.npy +03790512-59c019516149fe33d5dde04c96fd8146.npy +03001627-80ca57536dfe8de971a782a4379556c7.npy +03001627-758b4dd493ebb4b34ec0aa53d814a8cb.npy +03001627-96b2bf512fcb51b2af7a8f97983e7906.npy +04090263-bc187370b495d54b4c82ce83dca284f9.npy +02818832-ba690c29eb60a5601112a9ee83a73f73.npy +02933112-a992c3b41cc3027a9e1c34656195f3c2.npy +03001627-cea21726757b5253c3648f83bb1262ce.npy +02871439-aefad6690d1382d675f9535c96844dc6.npy +04379243-66dfbdb8c35a6db779bd5cf8fc22cc7d.npy +03691459-5aad6776bda34de6831627e12e4fbb8.npy +03691459-a423a97b5758a266d747b49524a1246e.npy +04379243-389aab2eb6debceea5a5170d48a648c.npy +03001627-5afc95ed2a26ce548644074928ab3f32.npy +02992529-74aab120cfb4d88257de0221db0b9d32.npy +03001627-a18156a0e60e50391f4c17ff3c45b28e.npy +03624134-bcc178786ae893835f7f383d5cbb672d.npy +03325088-b9aa61770fa227bc6d0157e3e7a8917c.npy +04379243-1bd555bd6f08c5f4f90f8519e58d5382.npy +03001627-90c6d1df1f83329fe1181b0e584cdf9b.npy +02691156-5dbe5dd200fc214951971f8370d9050.npy +02946921-990a058fbb51c655d773a8448a79e14c.npy +04090263-938be7a1544953152c3271e911ffe19.npy +03001627-b490ed3bdc9debe6cad73d9df5957ce.npy +04379243-f11b09dd3782f084f78bdf37d618e97e.npy +03001627-9b52e73f96d181969cd431573238602d.npy +02691156-efc9cda06afcd8c2354ab1decf4fe605.npy +04401088-3dd3ed204c56943389e13811ad04f53f.npy +03928116-4d626fb144471575dd54cb5398e1f0b5.npy +03046257-c50629ffd5def0793b407f4857c15d98.npy +04379243-625c161306cf958eb000f20a5153622c.npy +02958343-7dbf6379da9fc6c3a4ee0fb6a51564c3.npy +02958343-7a228c811e7e18ad18e1879dc4ad8784.npy +04379243-3fbeeb56c557e9d6aca1a38908852eab.npy +03001627-280553e975d6b79fd2b12aa6a0f050b3.npy +02691156-bea43bda17ea2ec792e07599d5caede.npy +04256520-bb529f670d4cb04160d8f573d6badb2c.npy +04530566-99b9eb5e1a7dd3b9e4614310319ea50.npy +03797390-35ce7ede92198be2b759f7fb0032e59.npy +02958343-82c224e707f63304acb3c21764457201.npy +03467517-bac2a7eae4f7d1a8dac47853b7da5949.npy +02691156-a1848a4a69b14704ca8607f540cc62ba.npy +04379243-c35990badac37b256c09970ea0def16f.npy +04530566-cb497aa6439c5a058c8c82196ef75032.npy +02691156-914c308ac4a9156842c20743f866e1a6.npy +02958343-49e4cffd7736c34362b21e1bf23b9ba8.npy +03593526-198a821d967679684b3c42e318f3affc.npy +04530566-50848665c2b2d6f491347c63d1dae43c.npy +03513137-dde4e367492ca88bce01c07526cf2aa4.npy +04379243-61a898c20ddb028dfebad4f49b26ec52.npy +02828884-46bae1672b4d146993a6b3a551dcb739.npy +03001627-482afdc2ddc5546f764d42eddc669b23.npy +03691459-c4733a08e1fc82373f48f08f97da0e7c.npy +04256520-46c6d2fb8c92cba419fb4103277a6b93.npy +02691156-ed4aaf81dc577bedac4f72bf08dc79a6.npy +04379243-db969c98e24511cc98cfd47a860803c5.npy +03761084-aeaa5b0ad8e5c786a805114916841d69.npy +03691459-da23f8427db17c3c627a66821130f814.npy +02992529-1b41282fb44f9bb28f6823689e03ea4.npy +02958343-71a1122469df0bb8cc8ad0deed05da5c.npy +03467517-862247de086eae853f0e01549eab8c2c.npy +03642806-9eb06745445806576e14170ade57410.npy +03001627-e66ee381e20dec3a44f23566597ec464.npy +04090263-a45b989db049e503a04e41b7ea7de8d.npy +04379243-98578539ae351bc3876b50fc31ccedf9.npy +04379243-fe5f543fd0c6b34edbbc9440457e303e.npy +02933112-9623560560cb59a3d37a1bae74ee50a2.npy +02801938-a642201d64f3a2adf345c3e267c3bfb3.npy +03001627-ba673ea75085e46cbfd72d7396bc040a.npy +04379243-bc3c03577d04c17a8dc9009357301fae.npy +03636649-70c523d337585b9743dbb6421d614c0d.npy +02691156-c4ed630f9c0f728090b1d6deb98feec6.npy +02828884-94a2f3859ed66873d2b12aa6a0f050b3.npy +04379243-afd9337f23ea759b54cd2a0ea6cb618b.npy +02958343-8d6de65bee9c269bf222d93492cfe0b9.npy +04379243-df7b982169a2d36fa8d8da6771a88b8f.npy +02958343-793a8675d7a5fecd653effc8a32f84f1.npy +02843684-8fdcf46df1b30e1179f82e70cc0e3b57.npy +04379243-c572c44eb47c2a15c43d2b61614d0d0.npy +04379243-a3a4cda9949c347ddb039d8689a74349.npy +02818832-8ef4ac16aaf7daa9a95095163012e0b6.npy +04530566-d188656d279f4d8b94daa4565dd30535.npy +04256520-6900b73a93136591bbc7a6acbd8f058b.npy +03001627-4d6f35e7eebab44e2c8a86aeeb3b996e.npy +02992529-71899992cbb987ed5baadcb81f14fd84.npy +02958343-372ceb40210589f8f500cc506a763c18.npy +03207941-b904af827973a59977e1c4f3e3547f0c.npy +03691459-5944386805308443cdb1aa1514be92ab.npy +03001627-49e8ef75b5ca2a7c699012d4a63c792f.npy +04256520-c446a77a01eb3e59a6380f3fc7269ff.npy +04090263-d5734bfe7c57d3bda1bdbe5c0cfcf6e8.npy +04468005-c4fa99df3452e4321de75a0b04a57744.npy +04401088-5814df537b8f1bcde95cd0dc8c2f0e83.npy +04379243-5ac1ba406888f05e855931d119219022.npy +04379243-664dd0e93a0f941a47fe752318e646fc.npy +03624134-7f1cf4175b9e3b0dcc34b900bb2492e.npy +04379243-2afcecd6a801171dbe25fbd47cafc694.npy +03991062-c623808300139bc3beedb4c8fd29e2d1.npy +03001627-54b6c08ddcd0762adbbc9440457e303e.npy +04379243-2fae93478f8bb6c423a62335a5f0e6d2.npy +02691156-2117484d4ad547ae719b5362fe06bbb.npy +02876657-74d0244fed5504cdb1d85e3f9755b881.npy +03636649-c2aa9948afc6d4ed39b3360f500ac52a.npy +04530566-2458e4e41633c95642f9e27aaf0c47a.npy +02691156-6c2c84db10ba167e48464d2edba1bcf0.npy +02958343-690609438d922525ff1370452e3a0154.npy +04468005-71df29935222b917aba3295c9fb9b32f.npy +02958343-7219c2a7e7e04850374462542bf2aa29.npy +02828884-4bc92bee14e81db06c262ba0bee45d20.npy +03001627-2343e2c4fa69f33a2ff834514c92e8fd.npy +02933112-5b04efb9a9e392f7f51f77a6d7299806.npy +04379243-de077e0bd6932baef12d7184a2ad3430.npy +04379243-fd958ba5f3116085492d9da2668ec34c.npy +03001627-2ef1e7da7f2a124215d65204573ec4.npy +04379243-4c5bc4f3d5a37c6dca9d5f70cc5f6d22.npy +04256520-dfcc3ebaa7e5ff1720768660cf080d12.npy +04379243-3185d26189034bfa48db03d58a820cad.npy +03467517-dc65ca08817cd673d0b89b8c97d1428.npy +03001627-da292ce4ccdcfb2c842c47c8032438a1.npy +03593526-9eb7d0643394a33df633d7643fec578c.npy +03467517-cc9e9ef3e1326c5363e148e250c0340d.npy +02958343-ee1f5ba95a6bed7bbda733a39f84326d.npy +04256520-1824d5cfb7472fcf9d5cfc3a8d7af21d.npy +02691156-7af320cedd724bc89437816457a69b.npy +04090263-582ff2c7307daccbfae4699de9cb91a.npy +03046257-71bc557e3b154c037a24ef313a983026.npy +04379243-ff60e4b29c5cc38fceda3ac62a593e9c.npy +04468005-b2a72df72812b0edc50a037462bade42.npy +04530566-395471e88200756d88d5590328ce0ddf.npy +03001627-90e67facc9af413abc19762eaa7ba40f.npy +04256520-1a04dcce7027357ab540cc4083acfa57.npy +02958343-cf88ac755b07beb2becf71e2e014ff6f.npy +04460130-9151fdcecbac4d2fbfde35fcbc037c53.npy +03790512-8a9586b8eff9f3a6932abeb6e2fd4072.npy +03636649-e5fa327c14553b11e589b08489d157d.npy +04330267-e7bf4ad72b1ad9b69c436f89fdc07cfa.npy +03001627-521f0ff0b1d7828337b2bb75885cfc44.npy +03046257-d0ca6059273922d25daff59553183e5a.npy +04530566-d152611e5b14420460e26fdb6baad14d.npy +04379243-9f1fcee83cacf964f4b6538438a0b930.npy +02691156-464a8718f0e81ffd9a6e43b878d5b335.npy +02924116-884764173de226d8bbfc16c72fd24829.npy +04256520-791f224b44cc67b084a05e54516915de.npy +02958343-492a339ce5da3fe8e4b68d3b17c43658.npy +03593526-e7c29b8c7709187d42526f5fcee84e09.npy +02691156-9a04c7aa6e1655fc90baeef8ba5b93e5.npy +03636649-d21f149ace9ed2ffa3714990138052c2.npy +03991062-e2a90a8a9c24e8fb6f30d3298af6449b.npy +02828884-44facd26b66e6ec8cf0c8ab22c613984.npy +03624134-d179811d0522500f881796c365ec5f7e.npy +02924116-97db0ea84d0fe5fbe14cb463f23a6803.npy +03761084-479af1fbc8399fe47608168119193cbf.npy +03938244-a136a79481238e046d3e11439c6c22c8.npy +04256520-4da74e02ba23a7e98ec703e791db2af5.npy +04379243-12dfe5b5c7acf776beedb4c8fd29e2d1.npy +04256520-d7280c7d6dbb6f20ff12919fb1541da6.npy +04379243-4cac98acfd5c43e1f51f77a6d7299806.npy +03001627-9e6b834449ed2db86199d6fe090be061.npy +04379243-d485cc87ba99e2caffc6e457221b9271.npy +03001627-3928ff39e32dbddbf91663a74ccd2338.npy +03636649-edd398530cff676282bfcd34215ccfc7.npy +02933112-5abaee58835d67975f9f6f4c95ed18d0.npy +02933112-4c44e4124118a2521e4b67452ae5160.npy +03001627-e491dc151c8e801186abe5555a3b447d.npy +04379243-63c93cb827f004c9c738b9c67433b6a8.npy +03001627-993dfc1874d17acd08b731e9ce099e7.npy +03691459-b1fa05d508d9ed81753a010738a20397.npy +04256520-c0d3ed00259b4d9da326264e704c832e.npy +03636649-352d68b2a816640099e8bf807e902261.npy +03790512-8cc21006e2d9f38fb4f2746c8140d6d6.npy +04379243-980ef88f896e4ebbe6cbbd79676d8c68.npy +02958343-8976e05f72b43a742a9eb0f146e94477.npy +02691156-d9d39f688eb9ba58b3f2b01de37c0b29.npy +03513137-f04ce9786ba0364b6e686498ed562f91.npy +03046257-7dc182e052ddc140bd332b3f93481432.npy +02958343-20649c88556a7e7a113ef105f1affa3f.npy +02691156-3265b621ca222d29d00d52e62bf14ee9.npy +04379243-cc3f1a06508f2ebd1aed2875db0a8711.npy +04379243-9551ceb9c3d5013284c687cefb7c213a.npy +03261776-4f9e3eac5026bdfc50b69fcb22e78050.npy +04379243-98fe480bea8f8f0486abe5555a3b447d.npy +03991062-8111c4fa78c69d7925ebd1cd0b422e32.npy +02958343-12941cb870df79b9815337ac44abb964.npy +04090263-68333b503766aeab6171d14862875338.npy +04530566-7c4b6e4ef996f109a2b4e6eee41ad14a.npy +03691459-b47ec1326b29546bce6c3ccb8279bd8e.npy +02880940-e3095ecacc36080cb398a1cfd1079875.npy +04379243-1eb459fa4f1039ef8245b0d36e16cba8.npy +03001627-71a0fe77f0bc1cf94187eeeb0dea4986.npy +02691156-783f3f72d5639597ba0d990ae229b477.npy +04379243-79c5df613523a462d42b9650f19dd425.npy +02876657-f1c0e107dc158727a8360f05ea0a1d2d.npy +02808440-beeae670a6ed2a4cae5f116398936abf.npy +04379243-f9a9c8e70b6a2b31b20aa91e9e90c311.npy +03636649-c5a69f02323e087181d0740b20dd8fd0.npy +04090263-2d81e10114fa77742c242e8cf15917cd.npy +04530566-1baadd62642d9f03a134736201a79843.npy +04379243-4175d6f2d66c2e1353c1d159a8a8422.npy +04401088-c70daedaade33fd0fb24e6a63c26ad2d.npy +04090263-9586fcb3437ab068e1abf5082bc04e75.npy +04256520-eafc1a44c43b48b24b3c42e318f3affc.npy +04256520-234ba0e3cdec0c306512b7b24f3d84.npy +03207941-e700df968d805f9722c3257bdf875d06.npy +02880940-ae5c7d8a453d3ef736b0f2a1430e993a.npy +02958343-86736cf3dc841eafde5db5d0d11befd1.npy +03624134-aba3ccc2f015ab2cb824d0a927927209.npy +03211117-96c87c372083e06e9ce9562d3c10079.npy +02691156-3fba2f3ea21abb4f8c1b0ccac3d04f1.npy +03467517-482b8b9a225b6ca1d57700c05b1862d8.npy +03001627-88c39cf1485b497bfbb8cbddab1c2002.npy +04256520-423d4e5cadc6dbdaeaf288f952624966.npy +04256520-a6054a189eb45e30672e57a20276f6e9.npy +03325088-591f34168e565c1f1f195495a075a72c.npy +02691156-7a794db8180858fe90916c8815b5c43.npy +03624134-e2a838d9c35af903e332fb3cb6ebe50.npy +02946921-60f4012b5336902b30612f5c0ef21eb8.npy +02773838-30bf69aa24dbb3fc9de193e488fc4dce.npy +03337140-fe998d14e236584ec123147a914238ea.npy +04530566-9119eaa9b5996cd3b1bb46d2556ba67d.npy +02992529-f8d97bebf67cad12a0eb5a85db887292.npy +04379243-69c655d9411692a319fb4103277a6b93.npy +03467517-87650e8ff3d85672381b7fbf79296afb.npy +03636649-ca5d8536386d31d0dd90cd03407bb536.npy +03001627-eae58f128191381de9efec56e07965d4.npy +02933112-5ab3129036e7b69e278d386bfa54545.npy +04379243-1a9ea91307d15d91f51f77a6d7299806.npy +03710193-39728a7708d1b4bef7c06f0b26f28b7e.npy +02876657-d30623112e58b893eee7d6dab02eb061.npy +03691459-2325005b09d12b2585d624cfcd9a37a7.npy +03710193-e2e38e29cc30fd208ae1c1abea367249.npy +02871439-3b2fa4cd0b774d13d3b55643c9c176f2.npy +04379243-b5a2a53b9b7e16e6b85cd7b6d43e8edd.npy +04379243-6b58fd8948d4d34851581925776a606b.npy +03001627-799de8b0527ea329c725388bb41d64e3.npy +02958343-ecf4e8f49102db90a27a0cbcc84ba703.npy +04256520-cba1446e98640f603ffc853fc4b95a17.npy +02691156-b9794f4722f565e319ba010ddb4974fe.npy +02992529-6aa3eee6391336c821844676433a0aca.npy +04256520-38fed916a35dd43d7c8c503b4b873379.npy +03001627-3358536e8e7c416ea9ef8e11754eeede.npy +03325088-94cf19d3af4620d176c18e71fd49c4dc.npy +03691459-5efa892adca22d37cd8f3fe9ca2145e1.npy +03691459-d14285fb64811217e50f6aaad9a07bc.npy +04379243-f3d5911a52b16bf78bf1cb9ea68ce0cb.npy +02958343-f48659c519f422132d54e7222448a731.npy +03001627-351705e42490c3506764a784715fb668.npy +04379243-7580dc6788ab60123fe64ec32ae84891.npy +04090263-be0024e025b5d75024c5c134cb8fdbe1.npy +04256520-978ab0578d8691ceeaf7fa9cda77a592.npy +03636649-e8927203fbdbe320c02170c33e00ea64.npy +04468005-52dacb5f2a7118d2aa28dc6884266713.npy +02871439-364a2a1172dc0a827c6de7e52b00ebab.npy +04379243-f94b4fa5703a0d96983ba8b03ccecdb9.npy +04379243-34303ee69f402e0f2b931201029bc76.npy +03001627-71b3089481026a9e677db18592980bcc.npy +04256520-fa279ffe1c3d480e4b48bc115078129b.npy +03642806-58c9c43b8f4c39b25a9aadea699fb864.npy +03636649-dadeb9844d9f0c00f6da603e92626bf9.npy +04379243-5e409a2627f7cd7d63ecd64ef0e6814c.npy +03001627-72ba6d6bdc6aeb7d330a170e9ceed373.npy +03325088-45418a76d770945552bf76ac5fcbf05a.npy +03001627-9da67fff6ae787b2eb0f0bdaf192ff28.npy +03710193-95a442b63317a572148741ff87dd06fd.npy +02691156-639d85cb4487bb0e3c326782eb2d380e.npy +03691459-58457267e0a8e3eccd4a817c9d7b9f3.npy +03001627-69aeeebc9a686862cbacd8aaf9fd8072.npy +03046257-670df65cc7db261f1f6dfedaba98d5f9.npy +04379243-642fa34b5b7c5e5414c0d1332b864458.npy +03691459-d05deb21bcfffb07fac7130d270bddce.npy +04379243-651560f344dd987fda6f0c2ce3101382.npy +03636649-3ccfbe8b56a3b181276206fae5d3c473.npy +02691156-e60b86c7a4015490e5a760ec65004efd.npy +03001627-29f890e465741b7ef8cb9d3fa2bcdc0.npy +02747177-7e1b27b8df1f9ae8ae868ec20dc7b43.npy +03467517-538a397c8bb811f776d05024fabfa1e5.npy +02958343-6df1aadb0dbc696cf568f785e33a81d8.npy +02958343-6d3d67957e1ca228ca92a4cdad802b45.npy +04379243-58611e7338c17f2bde909714df3390c0.npy +03001627-650d540bac31f56ffebad4f49b26ec52.npy +02876657-cbe88d4a56535ba64e23e9314af9ae57.npy +03001627-20a128166fc9ac939240a35c2a5f105d.npy +04379243-c503356361873b89730cb37c9a5f63b.npy +04379243-215dd9e926305bb7f8e7f2c38fe37243.npy +04379243-e3cf80e575ddbc03d706ecb3379aa341.npy +04379243-74239bc42f23639f3ea6912ae089646c.npy +04379243-82a9838fc655d7f62e6da3d97725a350.npy +03467517-a132eccaddb5decab7a841fa7c24140c.npy +04379243-67ac830369ffe09b664b3b9b23ddfcbc.npy +02828884-323ff904411c3d427c64e9314d548016.npy +03001627-1efb3d9f1cd2499c5339eb67f6086a2b.npy +04554684-ed34c7ded72ba0a346cde67a6a1ea328.npy +02828884-d0c64a8b3fed1ba113736977841a6b9b.npy +02828884-ea577ade393dcaaacb2a965e75be701c.npy +04530566-8faf5fbe39f67f3dfa2eb3102eea4e72.npy +02691156-5aec07305ba4bd3d66cf1b4a8fc3914e.npy +03636649-5c9595253f292e154ce3bd4e27d8e100.npy +04330267-47c68395a5775e10d9deb3f829cc2475.npy +04256520-79fba03fadd8c00ef10b04ee8b1c6914.npy +04090263-79008976055024fa93cea328065cbce9.npy +04256520-294dbaa0e9afde3a35836c728d324152.npy +03948459-75363128f211014a42426cd19697880d.npy +04530566-7aba61c9096ce60b7002bddf0942f8e.npy +02924116-101fe6e34502a89952470de2774d6099.npy +04090263-197f8aac538b6f7327b14e46288c9d26.npy +03691459-96778a7607802a72ce1db673cf70420f.npy +02808440-d7d404ced8414f01a64e5c46abb30c70.npy +02933112-9c802e8971c1b25f480fa521a9c7198a.npy +02924116-3d6c2c05de399202cb2ecbd32dc2119e.npy +04379243-2ad18975be0934bfa93e942a054d60b5.npy +02933112-75c4595a4d1c3bf9fd2b139960f72a73.npy +04379243-e2869255db01d51df577ff4de1ac394c.npy +04090263-fcbfd6863b56c882dda5b2729f8f3c68.npy +04379243-ed963e8e0589eaa5490ad276cd2af3a4.npy +03991062-5e914dd726313181b1b4b514128408b0.npy +03001627-4f1e026bc520de13d66f9962327b4367.npy +04090263-b40a96b48a27dbed8f38658d7fd17ab4.npy +02992529-5828a8259ba570bbd24e3068806a8c67.npy +04099429-b7e7c5a838c33f19be4274edc10c1c8e.npy +04256520-ae9d32ee01af191a32dc1e76c3474bc.npy +02924116-c3c8e100b3c10f80ceeb72b524f3e0ca.npy +03337140-dbf34becc9a4e4c34c3aee8e9d3a6ffa.npy +04554684-2d856dae6ae9373add5cf959690bb73f.npy +04379243-4ef54a72580df356d5617443b3fe2227.npy +03325088-516eed82a6a512d6b362845c6edb57fc.npy +03636649-e001d10c9aed09d9947a4fb398a91722.npy +03691459-e82622f52b46e31df4e3932877a139f0.npy +02691156-1f3fd9b2ce99e4ed164ee3a88aef3755.npy +04256520-605fd6f6541ca57de56133f0e7d362b6.npy +04256520-b765b2c997c459fa83fb3a64ac774b17.npy +02958343-2b18b149cfccacec1d4fdb0e0fa715b.npy +04090263-7fe56b2c6ee7d118994714b2bc8b41cf.npy +03938244-a0903daa3dfa996837b2bb75885cfc44.npy +02958343-20a3df3de67f309d8e35db9103756ad5.npy +03001627-a27b9f94d052176af27383fc5a5a711c.npy +02933112-6a49166d5852d23044221bef0fa3c36b.npy +02818832-d776c6eacad7ab019c57c7eb44b963e.npy +03761084-49670b80947d34aca7f79a2a8b5d6e7f.npy +03948459-10f7179292b04787cf335697521a6511.npy +02808440-98f774d812a2ff0022f427296d72cac2.npy +04256520-fe79eb9d45cfa9c5ca7ed590d69b9804.npy +03691459-f452418d7be7e78eeb752889d5199f9f.npy +03001627-36bfb3be47fd957e543087eec55f714.npy +03211117-691ed09923a0feb95adfd0d9df77c16d.npy +03642806-6123321e3af0b6328204b359ccd3949e.npy +04530566-efdfd88f3fcbc162b4c316c21a905ad4.npy +02876657-f9f67fe61dcf46d7e19818797f240d91.npy +02871439-ad6ba923084a6eccbd3049064a592667.npy +04530566-9d737c1e2872b322d2ff3af4b7716b6.npy +04379243-862cf2d35bd106c55230ba3c88b645e3.npy +03624134-cb95eb6a8a62cb46127075892a2f27e9.npy +03636649-864ecd5e816326dc2da4b3ec05850371.npy +04090263-5de0665cd8e490f47de08b76f60612dd.npy +04530566-d7b1c89328c8f0099c42421cfc900873.npy +02691156-de5807cb73bcbbf18587e940b916a22f.npy +04090263-82267e9766dabdd653fd2f31e6ee4fc0.npy +03325088-4a77b3d8bca397c5f6c00faf69d13ed1.npy +02958343-ce8dae15de55bc57ec96068985a57399.npy +04379243-357d9c5b669d6aa37ec818a4524845f.npy +04379243-72da00b4d8ab22bda571da3abf5b1931.npy +02958343-876d92ce6a0e4bf399588eee976baae.npy +03337140-a71d07ab8246c80391c352d02061b3f7.npy +04379243-65cceb90a30f7b15bf6d866879baaa7f.npy +03991062-9c06b546a29ccb2f2c27670a86683659.npy +03991062-844323768c81e72794b3ff00a3f2269a.npy +04090263-a4d1ad2fe0d98814e6cbbd79676d8c68.npy +04004475-af7b8202bf769382ce4ad3e55837155a.npy +04379243-d416139067bf7db337b2bb75885cfc44.npy +04090263-7eeeec55dc10e1bcfa9286f039319ff7.npy +02691156-e27229a5f83b0ac96ece6611a5309fa2.npy +03261776-ea885955cb82b3cee074faa875b76f82.npy +02691156-6a59f581ea7f33a5700feb5468ed9746.npy +04379243-4707256a1f8fb862a8bcbe9721909844.npy +03001627-40e2ccbc74d0aae3b398a1cfd1079875.npy +03636649-bea6350707d0813c85f486468112b4ec.npy +03642806-949388e7bddc1b02c60ea5009df4047d.npy +03636649-dbd8677c25a60799a10831b4711b98b9.npy +02992529-975de17c0b5d96cda38e5bd2fdb10d11.npy +04379243-fd1573fb1fc4a99b4c161851ed2b4e4.npy +04379243-ecf9321f6fd98688f88f925b568f2dfa.npy +03991062-b8f273f071041f694c6c80caaf15808d.npy +04090263-f02cf5cf3a6c61c7d735fa1ab17311ec.npy +03593526-baa918c56da0512da2c59a4d90e63212.npy +04468005-903584d52613647290df764ad314c67f.npy +03759954-47c434d0a4a571f64fdb7f619836e43d.npy +03642806-40935d32976b7dd3c8ed5bb8c3ee3317.npy +04004475-775d7562a64bf1c58b466382c9d6d096.npy +03001627-545e984b290a7398e8b2b8dc0c816caf.npy +02691156-df9d8ab5ab6f50ed4d4cb1c2a5e48b7a.npy +02828884-2b529b43c73da6e92056b4bd5d870b47.npy +03593526-56f7b662be65b7824725f67267e31c89.npy +02933112-a80ad4eafdb304edb6b975d10a10702.npy +02691156-804821516ddb3203c6747f7c9ffe9e32.npy +02876657-f6fa8cc6b08aaabb2aafb83519a0c8dc.npy +04379243-2e096785b8d98d4430bbd4cddd04c77b.npy +03691459-7f382d870d2816c78ff420534f79208a.npy +04530566-eb891509436863da874f0e42f84eb4f5.npy +04379243-70a2420bdd77d414820ad1ca4d3c95d5.npy +04379243-ea7dcf537a18150cd3dad974dc098fa1.npy +04256520-7598b1e15de58e67b18627bb8f2c00d9.npy +03691459-b747b1fe2a8e76bfefc97c4bab792c9b.npy +02691156-3391b6520218cacbf27ebdfa602af873.npy +02958343-38f323fd119d14ed2a9eb0f146e94477.npy +03759954-a15b163ce08749f84fdb7f619836e43d.npy +03325088-c01e1d2a113e9f65d93da2c1c55e2c1a.npy +02992529-d740b0679a9996ae56acd5d5597a72c4.npy +02691156-6b69e4c1cceb6e0681fa1ee3c368532e.npy +03691459-2afbdce92417c3bdd9349058f7c3888e.npy +02876657-7280a6655ec867d67b79156a61ad4c01.npy +03991062-62890e8b684d82c936b0f2a1430e993a.npy +03593526-a99b8679b072b0cf9b6e5e087210d348.npy +04401088-be66886215eafadd56b70d2dbf032aa1.npy +04090263-5c64271eb8c09c3a6af1f39296f6a397.npy +02933112-e2716932c4739645e0958c0e3fc3eaab.npy +04379243-7d95cbca44393d12ca39a5500b69b164.npy +03001627-77a56bf8ea88336019fb4103277a6b93.npy +02958343-2228a428bfa91e4f771592b49641a847.npy +04530566-6911bfee295138ccae6afdd0fd1549e.npy +04530566-2e447f96f152a33a7428866500a95dd8.npy +03636649-12d44fd814bc9b40ec2a7a1f5fe7365d.npy +03991062-7962092866f8088ea2c59a4d90e63212.npy +03001627-2b454a3d18d5efba615debb484b4c30.npy +04379243-d939c9aff66ee720c47a35332c17cce2.npy +02876657-328ba04ff5119c74763cd81c1b401a16.npy +04530566-6dd917d73699da0d255465ee23ab5b12.npy +02924116-a3e4fc3d00a38746f9c0f9cbb10e38a2.npy +03001627-26ab589f6838edc99ae676623bdd3284.npy +02801938-33927052606fc67a70048d788a6ab3c0.npy +03797390-1f035aa5fc6da0983ecac81e09b15ea9.npy +04379243-16bb609914396bd0fa7b9a6c80e4e324.npy +04379243-8f7ffcbcc7e8e5a4263a16a1017ab2fb.npy +03642806-6ba2cdd89db562a08329485eab7078c4.npy +03636649-74799fccd1636ce4df6cfab91d65bb91.npy +03636649-39262f1d1eb0678f71428d548481a9cc.npy +03001627-886c8d7538d9d7bde2d5f8333c552e26.npy +04379243-b68a370aadfe0b4d4f3443b22038d340.npy +02958343-f478cd5a04d2220a25af19d380ae3a.npy +02958343-bc36588d4095dc0975c67b3b1e763fcf.npy +03001627-9515e377c1ec86529b9f2eb77f5e247e.npy +03001627-a88cdbcd4fe502c743f32dd9b833c1da.npy +04090263-45a794d26abda59e49c13db2bb1e6735.npy +03691459-58db9d793ce3c2ceb0109464688ee1f9.npy +02828884-c1b8d982d97e337f19fb4103277a6b93.npy +03467517-fc76f63343050ee1d57700c05b1862d8.npy +04379243-78c577ff52f4d79ae0a0b410fb7d15f4.npy +03467517-5cbccb74c904efe49d99f2f186e46f1c.npy +03001627-e94befd51c02533b17b431cae0dd70ed.npy +04401088-7a4619d2240ac470620d74c38ad3f68f.npy +03001627-2aacbdaf7dfbc5adb1a98fe8994d06b6.npy +02691156-e74b8862468d887c6d9b5a419d9131.npy +04256520-7577bddda1f3b6de73a5c8eabcf6c479.npy +04530566-c9b7da24378152d082e68e57491bae0e.npy +04379243-7a3326ec918a44846e3c8a33c4ddf2ef.npy +04379243-86b48365b2bd587e61830bc1b4d6c5ea.npy +04379243-31b4349e405e9157f927eef536ae57f1.npy +04379243-cd224ca2a8aa04b11362d127df6d94eb.npy +04256520-58d87762038f551bf2977dcfb5a9b56a.npy +04256520-fb2bad5e3ba66eaccbc66df5fc1969c2.npy +03325088-500a24738427fcb0b362845c6edb57fc.npy +02992529-7d5180e005f1601ca36bec4fa7cd58c9.npy +04379243-4264ba880cb763d37342f7d672371a5e.npy +02691156-2af24e1c7067533d50a05a17b2f9bc.npy +04256520-2bc74fa3617de19fd5bfda5cabec2102.npy +02691156-9595693b6c0f5157651e8da9cf70afea.npy +04401088-d8071a38bb3dd8f097c8d78b9aede742.npy +02828884-7cc7a6e8e2aad387a6a7b6e78d8d5bcb.npy +04379243-58479ad882dcbbfd9d297e74104d3ac3.npy +03001627-5bb8457da2bbc722d810b14a81e12eca.npy +04379243-51c7851a252ed0ff8211891ea560a7f0.npy +02876657-91235f7d65aec958ca972daa503b3095.npy +02871439-8f0baf74e4d91b0d7b39f9a454e866f6.npy +02691156-9bf3c126d5918c41f5c7319b71bdce6e.npy +03325088-34d310b4964578f876c18e71fd49c4dc.npy +04256520-66df0b92b5712c0c917b96045c9b6dea.npy +04256520-69f6a6087f0da861af8fee88d245152b.npy +02958343-9f69ac0aaab969682a9eb0f146e94477.npy +02691156-bcaf04bfae3afc1f4d48ad32fb72c8ce.npy +03636649-d9adf06b7288f3cbac520a24f902dbdd.npy +03001627-f4e24cf8c5d0c5c31dbb0393636b3531.npy +02871439-9181c8bc52315206d810b14a81e12eca.npy +03593526-d090b33ac316a4b8bc7f58784fda27b5.npy +04090263-2eedf3a4c4eeee20af56497f051566ab.npy +02871439-a5f5552f1691e13ba5b8ca7c7b46f1d4.npy +02924116-63f691c1b2bfe5846ca2b6e5474aad11.npy +04256520-f13ce2c21e2ebba4b40f0ac0fb9a650d.npy +04090263-d33c5c2a6d3c4c64d730d5e13144e77a.npy +04379243-73bfba756e6e8511c3bd24f986301745.npy +02747177-ea90a3c6378d6f6d56f6fc4b4ce1db04.npy +03001627-b6689fb8b784c570cc514b26ccc20774.npy +04379243-8fbcd8920abcdcc519fb4103277a6b93.npy +02691156-58fcba9ef405277cfc8d2548f6ad75e.npy +04401088-bdcef95e8efb2665408f0e810863705a.npy +04530566-c521d7e4482fc7f7a716de2121565fe.npy +02992529-ae7b93f3ea4238712f20ec3aefa0fb91.npy +02691156-62aecdd1266b27935fc197bbabcd5bd.npy +02691156-3ad6bdeed351f5a84e61a0c2eaaabe87.npy +03790512-a0a40a9d5aabd6a7d5dde04c96fd8146.npy +04379243-3da823da4b6acf395b903ba10d2ec446.npy +04379243-9437fea69f0b44e8f97ef3b999ddb957.npy +04330267-139478e7e85aabf27274021d5552b63f.npy +03691459-276363a6e7991caa85dbc6e74635dd32.npy +04530566-a35aea08a3cb9391fc1bbbe626c79a7d.npy +03211117-b9b01abf4d7c9458ed756341424d6b8e.npy +03636649-a1d2f39cb17540e8988abef1fd117e7.npy +02828884-cb1ce3240eec3fffd417c7a2ac331601.npy +03691459-1e52b6d474a08635c10555abb2efb430.npy +02876657-11fc9827d6b467467d3aa3bae1f7b494.npy +04401088-c7fef6ae7f7f91814a0be3d856af9ad.npy +02958343-24c0a08cf0f7421d979ef391885ee5d2.npy +04530566-cb9ff07ef4769dba1d055b8893d6182.npy +04256520-2fb74a2f2b2b23a8a8cba409c4409ba9.npy +02933112-49485d1e98629d0c1c76f329bc4666d1.npy +02828884-84caee0c9f3b03571c56cd199c0bfbf8.npy +04379243-5bfbd0f0fb965cca9df2c4ae01002f5c.npy +04379243-f0305c34a57664ba32388c13cc4a0ba3.npy +03085013-dd369d106a5180ddcc47da24d018e46.npy +02958343-45673b0840de7daefe5083d20d7b5c42.npy +03636649-e37de82cff38f88d1735ea0e092a805a.npy +04379243-a40281aa13c75ca2ec4a754398bdb370.npy +02924116-f4d2b141c7956794378953424bcbb407.npy +03001627-88a7740602eb0d59cd431573238602d.npy +02942699-d9bb9c5a48c3afbfb84553e864d84802.npy +02958343-5d851496c2acbd8cd03e665be0237104.npy +04379243-5f226992dc83d5ead42b9650f19dd425.npy +03691459-5b22a13742fc7224079257326eb1699.npy +02691156-b04ec55f4960b3b984b7ea000aa0a2b.npy +02942699-97690c4db20227d248e23e2c398d8046.npy +03001627-39fee081ec01fbae4b3c42e318f3affc.npy +03001627-6fd5a9839c5caa52e8f8c11a24c52ebb.npy +04401088-9efabcf2ff8a4be9a59562d67b11f3d.npy +03001627-386b2caac16694edbab0cb5a4ccf2fb2.npy +04379243-8a07b5fc233b5ad2f51f77a6d7299806.npy +04379243-23ce23d83f097dfe30e9c0571435b6e3.npy +03001627-24d3d4259b35fb93490ad276cd2af3a4.npy +03636649-82c10d98a1aa65e89730cb37c9a5f63b.npy +03001627-3427d2276fb713e5864c004309dc898d.npy +02933112-e0c8d4f4c31b26f6d295b24579cf55b8.npy +03636649-83c0ad378b5802b73d39d8012919dd25.npy +03001627-a3e985835e89c8b1498f847f9f26fae3.npy +04379243-4be9eedfb4071f919f9a4711823598a.npy +02924116-9fb19dac527431c77d5938f6fe09fcd7.npy +04530566-2e4aeae716401155bf9913347b9df76.npy +03001627-96e83c79e8d76d4519fb4103277a6b93.npy +04379243-26642892c5579f25998886098b83a99e.npy +04256520-cade7495591007c2ec53fa9e4378e66.npy +03001627-6a02133392afc96b40ef1c8b63a628f9.npy +03001627-f2d03c1b46ff3c387bb504f750cf6e27.npy +02808440-adf9df7ae15500f88e30f00c0774a63b.npy +04379243-d94795f08cc91051a7bc6296cc70fa9f.npy +04379243-25c0559c051e57cc7fe20aad99c84084.npy +02818832-2f44a88e17474295e66f707221b74f43.npy +04256520-194ca5fd43b1c04be9ada1586a8c9364.npy +03467517-3ca24964106a34e2f8b3e7c2833060bc.npy +02828884-be0b1cfa18356b5bcb8b82ec2ef44379.npy +03001627-197ae965385b8187ae663e348bd216d3.npy +04256520-7dfdfe28e3d25a0d19fb4103277a6b93.npy +03691459-5edee1135040e2a9aa2b654345545ea.npy +04090263-82c56ec37b153eaf97ad4936ef9fbcdc.npy +04074963-404b2de4bc8bef211eba86b475bafe7.npy +04256520-3a99bf8e2a3e5e294b3c42e318f3affc.npy +03797390-7374ea7fee07f94c86032c4825f3450.npy +02958343-52ee842db08cd881979ef391885ee5d2.npy +03636649-2a9cc4404bf738302a278ff7f085c260.npy +03325088-86c6af80c470a805eb69804478f9c547.npy +04379243-918e7e6a01c7645bcb8248441df6c2f5.npy +02828884-7a910c3d6878068ba653610be84c6d81.npy +03001627-328df096e089c4eafebad4f49b26ec52.npy +04401088-7dd788cca7df768495b1245be456cdf5.npy +04460130-35824a59a19511c538cd8eb23853c009.npy +04379243-f52b167d756420c83e5f17778b45d37e.npy +04090263-556f1e3652f8c8984a2ac5bbe9a7c771.npy +02818832-a8cfed0a1b9451c9d213467246722099.npy +04090263-385439035e040c1e9a2ee232a197081e.npy +03001627-8cedc8e684d60ff42a06d8c81262ef96.npy +02933112-5135a234fe18481235836c728d324152.npy +04379243-c7f673b7b956508cf51f77a6d7299806.npy +03636649-fc5aa16de2be4b2b93411b5b3583c4d6.npy +02747177-4a14e1ffc27ba762ad5067eac75a07f7.npy +03991062-e070cedac4d9d52ff9aec59741c69cf7.npy +02958343-b18899d2b002ce0f80360680c1602c7d.npy +04530566-dded8a613927539cd72535fe84d882f0.npy +02808440-d422fa89aec6c1bb50d0c6a0c254040.npy +03691459-d06487d7634bdfddc1b62a5dd6fee95.npy +02691156-23d5975dd63000eb4e901b3386f76d65.npy +02691156-934d7c130fd419cdacffbc7889712a99.npy +03001627-a92a13b4968d7780472349060cd3c236.npy +03636649-b69c3a0a46b932e3d3c1fbbc2200e255.npy +03211117-f480ab303b2b595eb9f9e1b0ade9a295.npy +03948459-7af9e52ccd99125c67b9bb226efd81df.npy +02933112-64f02390a1487f791e4b67452ae5160.npy +03636649-4524946bc53f31a92d5c7a0e60b0c525.npy +02958343-a838af854310e283e8d78fb938bac492.npy +04379243-c450bd1ef8e17865557ab4b593540354.npy +03001627-59907bb6aaa7afeec283ca2c9df7372d.npy +02808440-9f55d5b55085bd9a5e7c3700a257e43e.npy +02871439-95a56e0b1817ba0991857224647f3835.npy +04004475-da1ab3860b75dbe837f7fabf76ffe0b0.npy +04256520-5a71471acef6f8153d4d11ac89066d36.npy +04379243-d0a4d46fd42a0c3df6cfab91d65bb91.npy +03636649-79041f47579a9e3f3c8d0fdfb1cc2535.npy +04379243-564c9bc401397abc7d9b8c8596b4309a.npy +03207941-7c03487eaa8d9cd9a26e3d8de97aed3f.npy +04379243-56eeebd64c7821dd641aac62064f7645.npy +04256520-995a4ed2a96d7c60140c975cafb9782e.npy +04379243-a8130d38d538b6306f3d2b1b15fba494.npy +03928116-8cd2b891b455539433ae329611c23135.npy +04530566-3b726a3562a1bc6e9d2b0f4ee2fe01a0.npy +02691156-cd6a3584c3da1db4abcfca680e6d54ff.npy +04379243-26fa34f25c673a7f4f41773fb12c1cbd.npy +03790512-a1553e0bb7897a7ace0bf41e5f45753d.npy +03710193-9d0ab19d54bb1f90ac51268fdb437a9e.npy +04379243-fb59360b5cfb54ac6f74453f2a3da519.npy +02933112-dd6ebb99b2346757da8c66dd9a203cf0.npy +04225987-ff04077cb675226a1082f2ea630bf69e.npy +03001627-d71d9d23d786cc8dfebad4f49b26ec52.npy +02818832-5ab88816fbf1cf9ba0ee062ac3106390.npy +03001627-21bc90d659dbe28a71aa44dea7a6d383.npy +03001627-2207db2fa2e4cc4579b3e1be3524f72f.npy +04379243-e21f715035a4471ae7fda7f082299746.npy +03691459-99c7341e243c7a2ddffb6acd1a5cf214.npy +04530566-72a68c898941cb3541556f795d265590.npy +03001627-9dac39c51680daa2f71e06115e9c3b3e.npy +02933112-ca89804bd77f770c4c62bee40dcdc539.npy +04530566-20d1090d07a49fe927ac692756be9e24.npy +04090263-f42647b43072abc9c48ca2220df3a9b9.npy +03636649-a415a0bc88904b24ed56e40d2df47c3.npy +03046257-648801b3c9b7d66b9ba80f08c401fbed.npy +02691156-19b6112991fb8e33f3f2af1b43965204.npy +04379243-162e665f12c4340f963aff3ec12fdcb.npy +04004475-263aa26d579b6def14c06184923f6962.npy +03636649-1cf44cb081b1a2b2fcb8d8c6d4df8143.npy +04379243-1eb732041cb7f2d649dd82184c01c565.npy +03001627-f199965dc6746de38b01ef724ff374fa.npy +03636649-ec0979097f7c811922a520e8315099fb.npy +04379243-9ada332060a35a9ea8a8d4103b2a0b3f.npy +04256520-90ccc3b3b344b3ea2250bf58700b4d8f.npy +04379243-8c9782f2dcd99d5255f46d55537192b6.npy +03001627-533af4a6fa955f2e78cc773ba5d9e52.npy +02958343-1a4ef4a2a639f172f13d1237e1429e9e.npy +02691156-a60cd34f71c3c0549288437ebbe47284.npy +04256520-82b6391291239d90febad4f49b26ec52.npy +04379243-fff7f07d1c4042f8a946c24c4f9fb58e.npy +02843684-26334c57fc4b83b543e68d98c50c8932.npy +02691156-5d925e4748bb4ad155050237670e0ad2.npy +03001627-e118a2870622acaf65ba78ad9601cf1b.npy +04379243-2e20f537a7b64de177981b941eb4f5d1.npy +02958343-15e52e44cdcc80ed13ded1857c15b5b6.npy +03593526-12ec19e85b31e274725f67267e31c89.npy +02958343-f6bbb767b1b75ab0c9d22fcb1abe82ed.npy +03337140-9ce1c0b588ad6ef84c3aee8e9d3a6ffa.npy +04256520-7961d0f612add0cee08bb071746122b9.npy +02828884-9705540347025dec9c2dcf27153363c7.npy +02828884-27c3e5b2656c50f7cb2a965e75be701c.npy +02958343-e9573675928b6f1c2a9eb0f146e94477.npy +04379243-855b1a33bfaf996ea1fdf150cebcb587.npy +03001627-bfbb19b74bb5973e14de2a9aaff52ac7.npy +02958343-d691906c87bb2850a9733fa2ac6b95bc.npy +02958343-6c08a180a3437f316dea32b07f945478.npy +04090263-3cd7545839d7c7affc4536f2bcb40d3.npy +02876657-ff13595434879bba557ef92e2fa0ccb2.npy +03211117-dbff3b6424b743f6ec7770a2628afd7b.npy +03467517-5ed99a0b793e1f5ee52744498b9b3051.npy +04530566-1b19bc5a09198bc85fa2a5df3ce5bc40.npy +02808440-550fd88ceb559b49ccd0340812259a39.npy +02924116-e945160734280e1927a32abbd63df691.npy +03467517-797bb7bbc5af3c6567a66e84fcbfe789.npy +03001627-feab80af7f3e459120523e15ec10a342.npy +04256520-8078da16e565846181ae47ffdeb90d54.npy +03636649-ccd12ea2362ef81d8bb3deb7fab7c9b7.npy +04401088-d299bcdfee69c57d419fdfebc874eb8f.npy +03948459-fffbe09e4890f8f36314c3b6a3a65519.npy +04379243-d2578e2ab0be1ea3332e588d1e0957a7.npy +03761084-835ca5f3809182e86d1ffe1a45470ad7.npy +03337140-a6e10b71fbb9feb74c3aee8e9d3a6ffa.npy +03001627-f6d1ecef43ed4eeb907f4a296134a0cc.npy +03467517-ebb111e59d33f36f792f3038a6b53389.npy +04090263-ac25513a060b0ca3cc20f30a7355a75c.npy +02958343-7f4dbefeaeda54628ccbb4eb8965b05.npy +04256520-361b60c0143d91c3593ebeeedbff73b.npy +04468005-7261bd067778a9a2299a59bfd8e7d284.npy +02691156-50342e9cb1a7e00e59c11002fedd14ce.npy +03467517-9bee64cbbb1061678aeceec6397860fa.npy +04379243-6dc6bb97c387b2f3af4e8812cf1b9e1.npy +02958343-60963ce07aa742382a9eb0f146e94477.npy +04256520-8728e0df5b94173c9b709c9b379c59d9.npy +03211117-813b3e438a8fcb189d9f3b4d1ec94c69.npy +02958343-7c35cd27ae8d673bb1bb46d2556ba67d.npy +04379243-1ce2de1e1077d66c1d5fca03776c86.npy +02691156-304c2daaf96c79138cdbee8c4dbbdd7c.npy +03467517-5f24e8a1b07665a7e546539ff7b98351.npy +04256520-4a1b7de779cde76487311f65d7a3e3e6.npy +02691156-10aa040f470500c6a66ef8df4909ded9.npy +03691459-eb0c85cc627406b5d33b16aac56dbe59.npy +02691156-3aa2ba8ca2aede556d96f75c7a1666e5.npy +04256520-6e7f0557400601322112c05ea370d321.npy +04554684-81ecf0670ab97ff5fb23f72ec839c310.npy +04379243-d43664b8f4df83341ee9d48493ad639.npy +02933112-b1bdcc7bcb3148aaa23949c21eddef76.npy +04379243-dca260c356a236053f2fc07aab1b396c.npy +03001627-f2ef238e2e4615e92cf8e80367b40c9a.npy +03001627-7530bff8f0c2b45719fb4103277a6b93.npy +02992529-3ff176780a009cd93b61739f3c4d4342.npy +03642806-3e9af28eb2d6e216a4e3429ccb8eaf16.npy +03001627-8bd75ffee48bb4b845fa198471a5a8a5.npy +03046257-9a3e3e241da6de9d93f86a8fb60496b7.npy +02958343-a4548c56bea7f927ad02214e86fd5091.npy +02691156-37700819bf2af266f64801ad2940cdd5.npy +02958343-c38cba0ec9d1a74f38f3979791e64082.npy +02992529-8ea128f9035474394cb30fc798a4d976.npy +04379243-29ae41cd05f7bb1e377940ad91815d8c.npy +03636649-b78bef16d4f44844931e98da3a93e73e.npy +03467517-663dc9c3e5f11e44d57700c05b1862d8.npy +02933112-9e1fb93dc979f8fb5f9734700aefae4e.npy +03325088-6f3d84d580aa77f0c36fb70296e45483.npy +02691156-730edec9009f8cea615ba7bf3620290d.npy +03790512-365c1f92a54c8cb52a45a87054fa7272.npy +02871439-3edc5b95b8d629931a75b4e96d345a5a.npy +03001627-de351bfde19253af54a7a6750196c608.npy +03513137-68106146958b708540b769487f41c4b.npy +02933112-84a374fd72bab291ccff75c3d7aff973.npy +03790512-cfb2cd4ed1ee0de56dacd34e70282fc3.npy +04379243-f7477e845dad9568b0aa15078ea6f391.npy +03325088-850f04c8e1d8039676c18e71fd49c4dc.npy +04090263-35af9072a2ac0c485ab5fe67efb19452.npy +02691156-91f8e08144218e2d23fc69eefd95e6d3.npy +02924116-36d710fdcc160180452b9ebce7999790.npy +04530566-55cf3c1207e421a29e3e34eaf1f39535.npy +03001627-98f2d21c4dcac477f7628281ecb18112.npy +03001627-939d97b226f11272217ffa735084910f.npy +02958343-a5476137d0f2f930425b2c354eccabaf.npy +04256520-1575354ba1faad67490ad276cd2af3a4.npy +02691156-cc40acee83422fe892b90699bc4724f9.npy +04090263-23a5887211380b2f663e90eaf6b4ca52.npy +02691156-60232dad38a6ec709a6e43b878d5b335.npy +04379243-4f06092100d0164013d2510999d0f1d2.npy +04379243-9976f7053b1b7bf2318694f1cc6fb1f8.npy +04554684-5aa97c0e9c11bcd1677ce0c660f811e0.npy +02691156-791af615e17374d38eeaefe98ae26867.npy +04379243-5348f1ce4dac7dbd5dcc7ddfa72357b1.npy +02808440-1a74ca07a11f507554d7082b34825ef0.npy +02992529-427d255534038d47e5eda863cef11226.npy +02808440-da59b45d5f06d4a844221bef0fa3c36b.npy +03001627-4adde89dd6db1c4845e13b6ba9ac0cd3.npy +04379243-5c593d79b5f9c918b398a1cfd1079875.npy +03046257-550ecca35381f8cb75b642c872f5c552.npy +02933112-da57e1d30424771a14c06184923f6962.npy +03593526-9fe7e6a7bf8ca964efad53eb3f0b36fa.npy +03337140-d98bff9e813a9fc64c3aee8e9d3a6ffa.npy +03211117-ddd82fb23a12e2eb2c8bd51dc6fc05b.npy +03001627-23b52ffd037c95223704253c4a874401.npy +02818832-958f2d4bb17eb247c9dd845c88786daa.npy +03001627-f1b1c92f91d0e52bc68ff00665267e32.npy +04379243-92d64294a4c9af5cf8609c6280e52413.npy +04379243-5533c35223061f231ff2429be93a82ac.npy +04256520-48228cf2207c7af5892eaa162d1e35d.npy +03513137-22ff6fc2c81a3674823590ed8a67d74b.npy +02818832-8154ea19d8f7f02e6a041dc074c34106.npy +03624134-877875fdfa0bd32c8272e0c587033b7.npy +03001627-69709cb300ae3784ee72e5c46412e9a7.npy +02946921-5505ddb926a77c0f171374ea58140325.npy +04090263-72aaf4a05a6d988412b52a369561019.npy +03001627-64d07a909361ccdd1a8a283df3396be6.npy +03636649-c802fa4c82498450af6016f34c89d087.npy +03001627-e352bba8524fdbd98f62bdf4e9082924.npy +04090263-a573925ea3002ef5878dfef973fade71.npy +03636649-1d3259fe9377ca5f899bad344dc01f2f.npy +02958343-81af904b941c47abccf0883afcbd4b76.npy +02828884-ba8ca7cb2d3c265bdf535ea8b5cca766.npy +02691156-460cf3a75d8467d1bb579d1d8d989550.npy +02958343-44559a87bc7a0bb3121f82ae456ac81.npy +03636649-d2ad6adbad3ac49752d7b587347d0cf4.npy +04379243-8ae2ae3b341fe20bf80985a99195eb8.npy +04379243-88ebe411acb90592e8952e902d0fccc8.npy +04401088-6aa3eee6391336c821844676433a0aca.npy +03467517-58a5d088e1b9aa0263e6b27c89da971e.npy +03761084-7bce489081dd3a03379f47575c295bee.npy +03001627-1196ffab55e431e11b17743c18fb63dc.npy +02871439-bae1a98fac9dda6a7dc4aa29087c6236.npy +03001627-b96452f41194937691a3aa674c7ec1a3.npy +02773838-c3a5009c4867f7293c8d0fdfb1cc2535.npy +02818832-2cc7c1f0c903278bc3bd24f986301745.npy +04468005-9e9b16fb7f239b2183d23296e7ba4847.npy +03624134-f19fe19693937db1cb03b57fca000b1f.npy +03761084-8d94838d6ad21411df3a1b0d597ce76e.npy +03001627-184007a6dee70847c2a9692bf3ba76d3.npy +03046257-2b326c82b14dcdcfaf0affed7cfb91de.npy +04256520-c144f9c06cae44492fdae21c212bf119.npy +02691156-89b42bde2332e5c067c5e3041553656b.npy +04379243-a4d907884de88227febad4f49b26ec52.npy +03001627-33990ef5ffde80fa83bc207d8a5912e3.npy +03001627-e127ed243617eaf04904d89e9169817b.npy +04379243-57213d6dd723e767cbde89e0c48a01bf.npy +03337140-4ef6afcc8c732bdb91c352d02061b3f7.npy +04379243-f073fc78c930ca06f777b6b1bae343f6.npy +04256520-a409f5a41d2acd344b3c42e318f3affc.npy +02933112-44e48c541b5466342f38c0d2792fb5e.npy +04379243-21a807616afa7c6030bbd4cddd04c77b.npy +03467517-2cdbb215d7816019f22d46d16026da2b.npy +03467517-b0f553ef37dc1248a97512d711172fa6.npy +03467517-bddbb876fb62fe7fa2633106d043f491.npy +04379243-2d3cb79ce06eba3c7550d396f1a3a8e1.npy +03001627-4efde5d7dfad17354f13c1c9631f2b03.npy +02958343-7f09e6522f212f94512af8eced68fa8.npy +03001627-6233ebe950c7d44df51f77a6d7299806.npy +02958343-b216e194c572e9ff99ef493efb31e54.npy +02958343-c6eebcd03aaa9060e7a6de039856f1eb.npy +04090263-a90a070a0603a4fc663e90eaf6b4ca52.npy +03928116-eb99228ff23aa9f9c6543c981120ca48.npy +02808440-f1c38a8f87ca506f1884c7a487bba311.npy +04530566-af964792bea4edac541ae04c251c7da.npy +04401088-39cd15c429c6007e2826f529d0b74d3a.npy +04379243-f910c50ed20073928be66dc0939fd23.npy +02876657-3f91158956ad7db0322747720d7d37e8.npy +02958343-7b00e029725c0c96473f10e6caaeca56.npy +04379243-b6e4f287aad69f285aefe1fcbc7169cd.npy +04090263-1ae9c8f100db37692d356a2793fb4d69.npy +02924116-81b9a5cbd961da85bc868bcd254a4e45.npy +02691156-d20e3ed9b3430672bbf3143b1cb6076a.npy +04379243-768e965bfe1f6141473f10e6caaeca56.npy +04099429-53009165a8a4d43995698f277be16510.npy +02958343-965e73db41af495941aeea95b863b1b3.npy +02818832-644f11d3687ab3ba2ade7345ab5b0cf6.npy +04379243-edba7eb533ae3578ece232edf44331c7.npy +02691156-110f6dbf0e6216e9f9a63e9a8c332e52.npy +04379243-7c278d5d7fec83ba7d0628daab3fd779.npy +03691459-1e83ac6d9ce1541329965f7e898eb4fb.npy +03337140-6d63f6894c2a8cfe4c3aee8e9d3a6ffa.npy +02958343-5523a6798194043146810e868f84ab51.npy +02992529-1d9169471bf9223423e378ba27e11ea6.npy +03001627-5330a65bc54912ce35836c728d324152.npy +03261776-703dced3f9479f348a731b44a5fe7a8e.npy +03636649-8e025c4aa0b0201a81a172d69c52a28a.npy +04379243-fa1dc9a58da9ddb6235820b1d1961ea7.npy +04379243-6862bebc1f59a5caac7bed72580dc30f.npy +02933112-95ca7e79cf9b51cbb9a0f5d18f1ce54c.npy +04530566-b03e831a78f2f16a5b04bf7f324b7e5e.npy +03211117-b3ed6cea7ecd3f56e481cbc0aafd242a.npy +04090263-2254c238167dd6a5672ed1a3426b68fa.npy +04530566-97dd02cb0afa088d485fd5204f716152.npy +03325088-81b5af68af1b0a4ce25194f3c5a4f307.npy +04090263-366db4aa9243cbee4d0af51460733e47.npy +04379243-459a13812561557e26217a9a857cd404.npy +02828884-1d9fd401e86ab773d2b12aa6a0f050b3.npy +04379243-56597cf3ace4916743ac09133d4c1d60.npy +02992529-6a0c0c55f355cc23a0eb5a85db887292.npy +02924116-ca27d87d42a074f0df98386e2670b45a.npy +02801938-bf4e9a91ced79f63d2ad39bada7a0a.npy +03001627-4f4d7ae825908e303a8be023e0f2e100.npy +04379243-a90014ce65aef22135836c728d324152.npy +02871439-a58e567af32c9f58eca22c501ad0a77a.npy +03001627-4b9278e9f2f4056d1f47fd90378714ec.npy +03325088-702319c82154da5850da8b99982a3057.npy +03001627-429319c0c5bddfccd26c2593d1870bdb.npy +02691156-d2e99eeecebf0c77bd46d022fd7d80aa.npy +04460130-607a0e44587e043a3e974a0808687b8c.npy +04379243-38c395f4655e0e70fabe21cb4fa2fa68.npy +02818832-f52493e81565c11a15dfb09c4607d131.npy +02828884-2c81dd5038d43eb7b11ae648ea92233.npy +03001627-685f2f19452cb973e98f4318c324e998.npy +03001627-b37f1363aa93688619fb4103277a6b93.npy +03001627-8661c4d0ab5e3636490ad276cd2af3a4.npy +03211117-e5dd90d78168e53741e88434245c899.npy +04379243-bd7c71ca15b0d4e56c252f74b6220e29.npy +03001627-1e15f238da6b4bc546b9f3b6ee20ff4b.npy +03624134-c9a3eab86e5e134f6402b8f491cd92c7.npy +04379243-d37560b9ea27af4efe354164024016d6.npy +02933112-fc3bb2eda6e061e9b50d0c6a0c254040.npy +04468005-9c6fc1db4373c6ec37b0cf2f5378601c.npy +03001627-63e2d9ab50536799b2b9c1746713a87e.npy +03593526-7a5aeda354f43cd5baf4ef477c70e0df.npy +02942699-4cd861035c740db5a33f3afcb8763f26.npy +03636649-8064580d3a225366ecbab50f1720e223.npy +03691459-1733111366ac40b76eb0973c46aae0d4.npy +02828884-fd2d7b385db7d186f9e8cd846ef13776.npy +04530566-ff404dc428ac3cb7102f71c17954fcf0.npy +02691156-720d70482d13696277fd7318510b8627.npy +04379243-d45cb36eb4c38786b9a7614f2da8d7ae.npy +03001627-57263b7b778ac3a87c076cdc1de5871a.npy +04379243-eb8a34ab2eb9a26fe93eff560d16430.npy +04256520-9ea47bf98413280bfebad4f49b26ec52.npy +04379243-55d5fce641343449d42b9650f19dd425.npy +04379243-72a4fae0f304519dd8e0cfcf62e3e594.npy +03211117-233a7970efc2594b26735a5c7bb362c0.npy +04256520-4385e447533cac72d1c72b9dec4baa1.npy +04256520-7dedfb51ff65c27f67bb14b25f99796e.npy +02992529-c95b7121b6408df49fda13f2ab6d2b41.npy +03691459-7fb191e5d0d7464b538cf6df9faa9b65.npy +04401088-7bd964021c9c26e0e4b68d3b17c43658.npy +04379243-e7b9c7a47208cb067b14a4ce87ce734f.npy +04401088-9a94067c6ae50d59227a8035cf3430d9.npy +04256520-440e3ad55b603cb1b071d266df0a3bf5.npy +02933112-9ebf23f2bcb8f334246300e1c662ce6d.npy +02933112-108295ef2f00c9aa9d886ab2fa5ee681.npy +02828884-dfb1e5e85b5892adf155d75bbf62b80.npy +04379243-57399be7d3352241b8812f80908a0273.npy +02773838-f297885d4918000ec8724d5673a063a6.npy +03467517-e709e622fb4f54546d9376f644442e99.npy +02828884-ade8119d5a30ba4bf1547b1668422ce3.npy +04090263-ff042c9b61e609a78e4ed0a212e54db7.npy +02691156-4d0994838c31434cef5f09964a6a1f97.npy +04330267-86a46629a011d6adac7bed72580dc30f.npy +04401088-f8d97bebf67cad12a0eb5a85db887292.npy +03001627-215e557db4c4bb5d837b757304479228.npy +03001627-b203918276818529febad4f49b26ec52.npy +02843684-a25a621347c07e49d89388918d47c02.npy +04530566-1b86008df6322c5d438d829603922fbc.npy +03636649-b3530cffd4a04deab641e19ecbf0e871.npy +03691459-711b146200447f4183247f812f2eaa97.npy +04379243-4dfa73e922842c02a7e7cb173e141227.npy +03513137-d76f5069b5f42903b20f6e48f6a30cbf.npy +03001627-8d9061d863268349db224de2961e777c.npy +04530566-f8cf09473d99d5ebfb7214357e073eb7.npy +04379243-33ceeac71f2031577cc56a6af4771185.npy +03513137-32396b24a2106049a8963fe61f2bc75f.npy +04379243-4b2119939de4f6e892cc1f9d231c0f76.npy +04379243-bce46214d9982829f51f77a6d7299806.npy +02691156-91bd6e91455f85fddcf9f917545742df.npy +03001627-fd2fbaa023b5e3a81718a174f9ac28ba.npy +04225987-fff0431e712a1887ac7a821ba28adc14.npy +02958343-31389308f2b032ddf09fb258eb4b1e60.npy +03636649-b1edea6e2974e1b35c935b78db2f5ec3.npy +04468005-b98188592c6cbd55990561fc34164364.npy +03001627-8ac35c25faa261ef4f3443b22038d340.npy +03636649-5dbb2120f2f828d28aaae3d020f5ddf8.npy +02691156-da3ed25d281fc4c065fc5f76098aceb0.npy +02958343-f06af3b73004c92ec7193c87bbfa9088.npy +03636649-7dcbac101ada832568d026fbc8fe70cb.npy +03636649-4865be9773c699bd2fadb0a8dd9104b7.npy +02992529-c33bc3be82441ea66934b554e5b8d4a4.npy +04379243-4d3a4749310a3d242bf2627b2d231d97.npy +03325088-465ec9636301436b7a867e9b35a1295.npy +03001627-367dc1e6752cabbcc34bba142e6e15e6.npy +03636649-78a11c0b8e964c9b41657e31b569b105.npy +02958343-1213742aa7815fd0e23d60a1b706b44f.npy +04090263-c6d573383e36ec052e38f6d9568202c7.npy +04379243-464a6067af815ccd843ead12644a79bb.npy +04401088-c87bd717c3640f0f741e88434245c899.npy +04379243-ccc1fcdb8b104c97700e86b51ee00536.npy +03001627-9c1ee97e493fa79ce83221ad0d21775.npy +04256520-ba8afc95c19a3d369753496ba23f2183.npy +03467517-407b7a6118e1cdd240c20797381ee39f.npy +03593526-2293b6aa5ed35db3b1a98fe8994d06b6.npy +02992529-7617e95211fc3ba0e02ee35b95994e2a.npy +03710193-1f62225a411c998d983ec12a2b33f18b.npy +03001627-946f16a9bcc3c2be75aa7f24a9b6003a.npy +02818832-e480a15c22ee438753388b7ae6bc11aa.npy +03001627-a1a173788669c84befb94709f30ce0d2.npy +04379243-8d10d8d72f135011febad4f49b26ec52.npy +03337140-c5a97a3868a2c9054c3aee8e9d3a6ffa.npy +02828884-7f4f6fc801f4f957263e68b45fad1e64.npy +02958343-ddc63b22552ef13b734650590bacf709.npy +02691156-52b2c8f99319167c71d03b466c72ce41.npy +04256520-241a341105cf3dfe593ebeeedbff73b.npy +04530566-c23960425c8cb654c6cb0dfa2f14f9d4.npy +03467517-5f3726ea13c5bf7f8f4da12eef05ed4.npy +03001627-d4e0707b680e61e0593ebeeedbff73b.npy +02828884-c71738e3b314a72411afa9f5eb84a7ae.npy +03636649-5be8cdad3b218e373d39d8012919dd25.npy +03001627-eab859ac65d47f4e6412cccabcef91eb.npy +03691459-4468a5e60a6fedc086bb0379a61a0978.npy +04090263-92ed31e84e85000beeb5508ef773ccb1.npy +04379243-ba6909f6263ff92f72b785f16db8dbf3.npy +04379243-4368d1fa80c34433f88bdcce05b1a623.npy +02747177-69773dc176d1fa3fe88c1d6fc3580355.npy +02958343-5d353140bc7569a48772afa45900d07f.npy +02992529-f6b4f01d4c9c09e6af1fe3c052ed3a8c.npy +03636649-112058b3f8c94177d2dba55bc7acf0bc.npy +04379243-2abe61af67cbd99aaa1d46a2befc5e09.npy +04379243-78420814bee5ad17f2cf6a9bef44d625.npy +03211117-849b58834fec864c34794e47f2eafa39.npy +03001627-23951f57f090116141bac0aa0782f561.npy +02691156-32b6448c0864812729348d14ca881f7d.npy +03211117-4302bce2d7e6594cab610b0c94236463.npy +04468005-79e1589916d42685dc14ba0818ee5cec.npy +03337140-c68fef3fd87998974eb412130b6b0cb0.npy +02933112-7c12c2a7a1957abc8bf788ad2aab0947.npy +03691459-6503d74fb534ca43d4e62d99c536bbaf.npy +03325088-4bc18e1398c1b56173ec0850b5880d3f.npy +04379243-f10936939b1c9277d6134c153bee8ea0.npy +02691156-31fd02481a07471e4e8b48a4c01e36f8.npy +04379243-edb5fe83efeaf086fb0eb7e753c06942.npy +02691156-130934b3dd2fddfaaf4f36f817f09501.npy +02924116-c975efbd8c9b23ef94a1965cc6affaa3.npy +02958343-72122bdcd4ddcb96a0c0a4b1a1c1a4ad.npy +03001627-b559688f7af76ff5466127bf535bd761.npy +02924116-730fb62cfb278e0c2ac826a3c82da491.npy +03046257-5c851029d69c6252c834958aed613724.npy +04256520-6bdcfd4b681a6254c45c0f305d0b6e87.npy +02958343-3dab4ef100f906c2bda733a39f84326d.npy +03001627-5a96894b5cde0551c8687ff9b0b4e4ac.npy +02958343-d13d0612c64c1c872457c273ba02ebf.npy +04090263-c9ee75f15d7f6bd13623b64770edb4be.npy +04379243-c82910190bf76ef216efc8582f9e6d60.npy +02958343-34412b56217de1112b12ea83455b0f44.npy +04090263-92109df597fb12692511f68da65f4c4.npy +03790512-42857ece33bd9119617798af67b81f2f.npy +04379243-30655ef8f2511b4ad8f2ca82d6e1c314.npy +03991062-44aea02b6852ce98910e50f05b8001.npy +04256520-3247d4bf8bbcbeb6840bf649c20f40cb.npy +03211117-3d4079a37c8fb40e808951ff5fb582ac.npy +02828884-4e43690694133a65e5ef38e098c46afd.npy +02691156-3d23703a618ce7df1e569ed4e4cfe84.npy +03991062-1af2b0b5ca59c8d8a4136492f17b9a59.npy +02691156-6e65a6f2b81fdea2282e76ed8cc73a69.npy +03948459-2a8f236c10ec9b98ba9409808fba922a.npy +03624134-fca703c2489237d51b44a9962207f944.npy +04256520-5f67ee55d76bf582c41aee3d4c9d0c9d.npy +04379243-20bb1a34891588c1cce90f0d61ed7a70.npy +02933112-26a2132b719d226a86d53ab0fe94e911.npy +04256520-949054060a3db173d9d07e89322d9cab.npy +02691156-ca4ec545363b3b8e8c2814a4ead9cb90.npy +02992529-97e214d6b93e012f6337fbfda5096043.npy +03001627-54263fcf9d6380d343638dabe1eb5336.npy +03636649-dc8b9cc431acdda473f5a6f6800a3e79.npy +02958343-fc2b81391e185db9f1335b4fef92b83f.npy +04256520-2082b15a24a55e52cc9651014a82e2b9.npy +03211117-a87214036fbca69e84a172a28c2dc.npy +04379243-52c379f93a8ae9de276f41435671c8b8.npy +02958343-5357fd81d212951a1c64dffb0265c4d6.npy +03001627-1d2745e280ea2d513c8d0fdfb1cc2535.npy +03636649-ead77648c9c7dbf8d42b9650f19dd425.npy +04401088-ac6f6437f9e63981b6d41c42f7ade8c8.npy +02691156-fd3a9743e16d35e51fc210a07910eb2.npy +03636649-1e83293107d6c3a92cd2160e449d45ae.npy +02691156-47d677bf1dec3dca82cea33798fcd6b6.npy +04256520-4b7f63ec83da1c25c59508b4e3a82241.npy +04379243-e92bd321064e981e5208aab875b932bc.npy +03691459-f37f4ef72fd0204d839a84b4ae4862d3.npy +04256520-20222a2bd14ea9609e489c1cf724666f.npy +04379243-88ba062b171b4797e30dbde92844e593.npy +03325088-4a44ef4b181f1101b362845c6edb57fc.npy +02691156-bed589371c324e896aa3bf023a2b42a5.npy +02992529-db96e9b2c96c273de7d92dda5756fcfd.npy +04074963-4fae99783aa8706c548eb4d45dc63633.npy +03001627-6870fbd4a7b733b0674f1c30a8cad95a.npy +02992529-320d0f9256ab9cc3a046bbac53886364.npy +02958343-eb56379e243b0e2090da6b3e2ed8b49d.npy +02691156-4ee6a3030995dcd4bc0909d98a1ff2b4.npy +02691156-1e8adc1e176bc68571d03b466c72ce41.npy +02808440-5125de61a2cf9dd2b362845c6edb57fc.npy +03001627-89f5cda510eea57a9917ad57402f53f1.npy +04460130-614ba760fb825f93ad5067eac75a07f7.npy +03001627-27c00ec2b6ec279958e80128fd34c2b1.npy +03211117-111f2a331b626935d82b15a1af434a9f.npy +03001627-ef1152b1660592d413f0924ccc9628e5.npy +04554684-60b8c29d75c28ce214b35a7d7cea7130.npy +04379243-c2e2206394f6de78a78a19ca5a5a5ca3.npy +02871439-98c20af27765a11e3178ebc750d175.npy +02933112-587315cfb22617a1d37a1bae74ee50a2.npy +02924116-e5eef3183d03c4ab4fb90f1c75bb6c3.npy +03624134-f639cff54b955a9b39c78a1e40e247f3.npy +04090263-fbff23bb1043116a92cea77f96988ae6.npy +04256520-6dc235ab4a2c7c6810edd100dffd8d85.npy +02876657-af3dda1cfe61d0fc9403b0d0536a04af.npy +04090263-b642c89b7359f0cb66ab132932374f46.npy +03001627-c69d5899d85eab9c173b9f28a2caa84d.npy +02958343-abda34ccba30a7dd80360680c1602c7d.npy +04379243-63790a73bd92ec04a55e6ad8c321a190.npy +03001627-768ea32d8303095bfe6f9308e75765b1.npy +03636649-eecf97919cea666e67903707764646db.npy +04379243-1539b9a05dd82a3b23adfb9fc6ab1f7a.npy +02942699-45b01c604426a0a9c5c10e0ebb47766c.npy +03001627-659a60740eb6bfa930bbd4cddd04c77b.npy +04090263-6a9fac86136c7ba0f3dbacbbb2e7e80c.npy +02924116-419cb0a5742d8f1ce68a7b2541c35558.npy +02828884-9a87c9d904851205bfcc4c7214610fe3.npy +02958343-39b307361b650db073a425eed3ac7a0b.npy +03001627-8dee8193a06525f51de495b75c95e5ad.npy +02691156-5a5e4590c54a70c6322c168d7a7c32f4.npy +03001627-59cc459b0e75c2ec1142c13b71507bca.npy +04090263-d326ce10d768da152c3271e911ffe19.npy +04468005-1ac8292d6ce89f7452470de2774d6099.npy +02876657-21dbbd17ae4c3fce6a90f735365ac29e.npy +03001627-ba2f3a0d2e90025bb3234e0da44b11e4.npy +04530566-b7d831d7b1dcad77a8596b6b008107ab.npy +04256520-d3c677deb7e829f05728afe1a12978b.npy +02808440-5ab70805cc7ca4be73fd10002dacf954.npy +03001627-923447d348ddd1ff3002761e7a3ba3bd.npy +04554684-5e411987081d3f3af44ef865a534c948.npy +02691156-94dffe91af2c8834fca1f1143bb6bc17.npy +03636649-3c3286722b31c8e2f678c9833bd643c0.npy +03001627-80bad2242183a77df69c1bc654d8fbbd.npy +03691459-4eceec9a386a21ef77818a0572bf1777.npy +02958343-66d89101c69cd1fc1e4f5422b970bb55.npy +02808440-4f14ed9498cd69c6392f36bc2fbdcf8c.npy +04379243-497175f56357e331b4b7c06325f7a2a5.npy +04379243-c6cc25ee47d08674842c47c8032438a1.npy +04530566-ad62a23a7de3965f94daa4565dd30535.npy +04530566-d74ea3567f8861dc182929c56117755a.npy +04256520-ca2204f36a01e3515b943c35c765be0.npy +02992529-e5b629f4a5e7467066ccbd11a6ef0f68.npy +03001627-751d61e1d2cbbeaebdcc459b19e43a6.npy +04256520-218233bd68f5261dff318cdb0cb45ca.npy +03790512-f04281f2440a6821aa213948f4ab1d15.npy +03001627-eeafc14e4e0db2ca3b481215325f1515.npy +02828884-891b8a01ad71af2db7e843606969432b.npy +02691156-3a6f0d1cff0aa524567ab83a85d8a5a0.npy +02992529-e156db6fe3b9286c87cb3c64e47598b4.npy +04530566-f5a0bce67dca5ccbe3de75b155d3b403.npy +04379243-ddb20a7778038d87f51f77a6d7299806.npy +02691156-e899c19c87245ac94c3a35cee92bb95b.npy +04256520-d5a2b159a5fbbc4c510e2ce46c1af6e.npy +02828884-cc7ab68e97b381eead5067eac75a07f7.npy +03211117-cde799eeb40e6e8524d1772907b17f1.npy +03001627-c46ed3a68dcef72039b07b3056a2842b.npy +03467517-849c080c585387e61082f2ea630bf69e.npy +03046257-90fe7c32c11b9a371bdc62787da74594.npy +03467517-364f85832427992343820c03f9f59458.npy +04090263-1a68ec72239a781627f279690428499f.npy +02691156-1a54a2319e87bd4071d03b466c72ce41.npy +03001627-fcc996c2c8ff394194887ea54f3cfb87.npy +04090263-10639ade9179e38d624a9463cbe27c6a.npy +04256520-4e8087f3851d85cdeedfca8b846d3b01.npy +03001627-c5203dae464c264f4e41620d80d9e89c.npy +04379243-3092a18a275497f54b3c42e318f3affc.npy +02992529-c3a90bcecce7f4817b6fd5468f603b31.npy +03001627-fa33e83563fc2765e238f87ef5154562.npy +04379243-a87c9d907feba5e944187aa25305d7b7.npy +02933112-557cf522ec6be06ffc5195fbc9cb6806.npy +02933112-7177dc5922252f1311fc2b865c2a185b.npy +02691156-3cb63efff711cfc035fc197bbabcd5bd.npy +04090263-7e0e797780f6945fc75e2dd4efaea578.npy +02958343-4f31142fb24b4814ff1370452e3a0154.npy +02958343-df5a4ebff89f02cc25508ed649b952cb.npy +02992529-35d370a1531826adbe5693b333a3dd92.npy +03928116-3e2a452e802b178eb72f1eb118b6fbc3.npy +04090263-313b30e96bdbc29cb1d04c72ba966611.npy +04379243-5fc39e0ecc8e50f0902a571380e15334.npy +03691459-7488e7b4b7174ca73b2680579dc5dcf5.npy +04379243-a06fa6a604ddc974ccd77b10347fd7d3.npy +02691156-8eab40ab482a46f04369ac253fd9f7b2.npy +04379243-3b384a4919d180a666ef9dd2f3ef27d3.npy +02933112-d7ec3740a0c67d89f8c3d2002c77ddb.npy +03467517-aabe3066d17c90c163e148e250c0340d.npy +02691156-b1f056090f81f992301e72365eacb45b.npy +03636649-8c4539bca010eae1cd74bafe512884c.npy +03207941-e4d1d33b9aaf1407be92f74d81ff60bf.npy +03001627-ce35ada9c4a8de2fffc6e457221b9271.npy +04090263-4a20928c1570034d77c52b6e87288e66.npy +04379243-87d5a94d81a299401877c7666e1dab40.npy +04379243-9f6388c27485b03adfd21203bf8b4b46.npy +04379243-d41ba8cd6a5b1071c1237601d86c1b5b.npy +02933112-9702a1fa518b960784db07849359372d.npy +02691156-6feb039c710277aabd10f71f04d299c.npy +04379243-90908595d267ed89d970a88713e6172a.npy +04379243-a5abb8bcc70e8099ff39d54f280fc5d8.npy +04330267-4a82d3e205075abdc5f3208c32f3ec87.npy +04379243-9f62189d260cbad33c11c3dc5dc42217.npy +03001627-a896856650a288c0c05575120a46cd3b.npy +04379243-b57f0907adb6a60b391e4d6c585a697a.npy +03467517-7aa29002be26087ebc2f9fd0bfca25cb.npy +03790512-c43742bc6e7dd467e8e23c8de25a6ff4.npy +03636649-12aa829de18f4e6ad5cb6d178687b980.npy +02691156-45801aa10db0636d4694b8455e89054.npy +02933112-1819a4e03dd67e6c59350d819542ec7.npy +03001627-d020eee9e094050ad776c08b6a3d0a38.npy +04256520-dfc8656b5e7e6104feec1f13d2353f3.npy +03001627-c149718d89776eb5f71db1fd522c9a79.npy +02691156-4d84619c0da53326e90916c8815b5c43.npy +02691156-eaccb2ca303223afc503a3776fc280fe.npy +04379243-df1b280b7763abde3002761e7a3ba3bd.npy +02958343-6d79f2cde0340b5fbecf71e2e014ff6f.npy +04379243-3b112cbb833b57ce7774eacf69d476db.npy +02933112-83bb0c92d3ede1e8c59350d819542ec7.npy +02828884-34a1d09b3ec2f05b2056b4bd5d870b47.npy +02924116-3e2a8aab3ad459e5f446f92b52bbd82a.npy +02691156-393cfa7e090b972dce2cec85ea6ae00d.npy +03001627-c8860d4563be0f34f2b7580a739cd4d5.npy +04256520-776c31753fadd5593a1c86745128d0e2.npy +04468005-e92e28a1ec1c9b2dd85b408a8edc983b.npy +03636649-a4b3971680744f7f1742918a871fc8cf.npy +03636649-e6d62a37e187bde599284d844aba7576.npy +03325088-d1a20d867c2b8f459cd6e2005048d293.npy +03636649-60fe504827e96df11fcc6cd2b8a40871.npy +02933112-6e6801ca4a03a1adc672720c52b0e374.npy +02691156-9ac292686a2fcebbe719b5362fe06bbb.npy +03761084-35cdd3a824ada16042725722166b0554.npy +02843684-92f6d4d1dc94f4db973037aa80f5ba45.npy +02808440-a1d69eef3e42da23321831d2245cf06.npy +02691156-8d62d327fb15c9b42ff26728ed9d7bc3.npy +02942699-eb86c8c2a20066d0fb1468f5fc754e02.npy +02747177-f7470d69ce11121a95f577622f465c85.npy +02992529-500fbdefb58e261af2cdad303f49c9f9.npy +04379243-114a55b4647938cee3dff0d5ebb43915.npy +04256520-44a17a70369e803cc7623e33dc7256f2.npy +04379243-fb5d7176752898cc5fceaa39a8353bde.npy +03759954-62854e501570e57f1781e1106734ef2a.npy +04530566-24ab70fe2e704df45b76db9a8a523dba.npy +03467517-2c491c5718322fc4849457db85ec22c6.npy +03691459-1ab52761b829fcb375a3010d3ada28ba.npy +03467517-ca6740aebb04e18bcf414637ee646214.npy +03001627-bccedf688d8e5536eaf288f952624966.npy +03001627-51d67f7174881679f256a8c3e3396495.npy +03691459-47072a1458f35a8e1574d21c0c95092f.npy +02808440-e5f025768acc620dccd0340812259a39.npy +02808440-44094937bf0f806c49cad307d3d06994.npy +02691156-dd48aa92170bdde04c3a35cee92bb95b.npy +02747177-c6ef918f335bb21c5896bab37ddebe7.npy +03001627-d9aa42439dc6f1b1c63608961819b578.npy +02691156-e127b1f5ead603f9a5a118bd15e6e34f.npy +03991062-34875f8448f98813a2c59a4d90e63212.npy +04530566-1f20ff37655c5dd61aa01ae491663d9.npy +03325088-db54ca4101f454a055ced94b11ca829d.npy +04401088-b77f57d319fd864fda5309001d158b32.npy +04379243-bedbd91db5d280ccfebad4f49b26ec52.npy +04256520-cb680d8c4891670d559916e9a5177b0e.npy +04256520-a207c52399b289be9657063f91d78d19.npy +02808440-453faae27faa3cb454d7082b34825ef0.npy +03001627-802c46001be93276283b00891f680579.npy +04530566-c28ec663f25bc97de8bdcdb326f0e57b.npy +04530566-daf5575e801967cdcefe7473eb81422f.npy +04090263-e0e0041f541a646689ea614fce832f5.npy +02828884-a3e3c1bd2a644e2df4fb4dee5181bee.npy +04530566-4bb41171f7e6505bc32f927674bfca67.npy +02828884-8b4314a159d964fdcb2a965e75be701c.npy +02691156-58fadbeceb7e239724f575085333a65b.npy +03948459-9ab3478772766eec803b54e9738b20a6.npy +03636649-bfdfe22081bd54f7581fd19c35a5c8c.npy +04004475-bd6207b442ca86eb5c4cedf67999f333.npy +04090263-394a97c4ca0132132bf26da672b84220.npy +03642806-e6329b09d7920f006f729e50d852de2e.npy +03085013-fa61675a0f92a2ed3aeab48ed64c0fa4.npy +03691459-6ca4143e8b989ddf8dfd947f5413afaa.npy +04530566-486e953ff691d414d8190076748f5b20.npy +04401088-1edc7aa574624ca0200a0406803801e9.npy +03001627-f0cbf508a2f27a16504721639e19f609.npy +04379243-4d7035ed932406819223fc014b68160f.npy +04256520-dbf6c49376ac9591c8e7e2daa5cdb0c4.npy +04379243-fbd83a2ac7a5dc52e915f7ff1872d16a.npy +04554684-d49400b5298fb56adf3a1b0d597ce76e.npy +02691156-a839663396fe378a896facc4c7b99761.npy +03790512-3339fcde0648dadd11d830afc8c91af.npy +04379243-bcb349231b83952a3da27ece6ae88fff.npy +03001627-1a8bbf2994788e2743e99e0cae970928.npy +02924116-ed4554f4c9ad4f1a3bd565c86a477bf0.npy +02924116-494c24cc1ec8256944f9d2f9464b48c8.npy +03001627-9fd6bb18dc21c70766ef9dd2f3ef27d3.npy +04379243-2145e510632056161afe34ec6aa383f.npy +02958343-12cd99c20b1a5a932e877e82c90c24d.npy +04256520-398fb143825e597b960f73850432c28a.npy +03001627-75ea5a697313a8c214c2f69de20984ee.npy +02691156-ce6aef9846db6aa5c1a897657d9a1924.npy +04401088-53ce93c96d480cc4da0f54fde38627c3.npy +04379243-94f9034f0a3e85d3ee881d4feac7f213.npy +02958343-85e54cec1c6808009bc0c5b67eaafbc.npy +02871439-863be573b1c9420cd810b14a81e12eca.npy +02933112-bae2eb7c426570752c91206be77753e3.npy +03211117-ff7333934e9ecd5f681c36c9abb1a31b.npy +02958343-1424d894bfd59cdc65e9f24f8c34a52.npy +02691156-cf4c2d7d836c781e5a59e179e114b9a7.npy +04379243-3997cdee934a9b238eb3bc6c6d15f9bf.npy +04379243-ed36c49874dc325698fc83ea562f5c95.npy +03001627-2e37697d32d085415634c21965ee6bab.npy +03001627-e65d2f0ed75a786a37b2bb75885cfc44.npy +02828884-90d6cf58f5e9ba30c175dd3be8577953.npy +04090263-fae9667f8fb1217d124c90ae3e698e4f.npy +03636649-1edec15a9740c25edf85db41e3677c28.npy +03337140-cfacfc7c4c6a49d5195ae0b4bee7180e.npy +02828884-9e4e83e67a901168febad4f49b26ec52.npy +03001627-ba56f02dee485974c242632b2a8c3129.npy +02992529-c556efeb2bb3df4621844676433a0aca.npy +02958343-ddd5e2bb26c82862b41ac95a0a9b3aa0.npy +04530566-147fd27a40793d7e9bbe4f1047e9e5fd.npy +04256520-ee3d0be16a4499b7d8ce2b7ddb5bbcea.npy +04256520-5d3a1feb79ab7987bcedcb5f4c7257b9.npy +03001627-d661b52c3763eec020768660cf080d12.npy +03001627-e476879972230ca719d8721fec72f0c.npy +03691459-435ab5f43b24f739bc0c56c4d4a1fd3b.npy +02691156-3adbafd59a34d393eccd82bb51193a7f.npy +04379243-3fedf94dd96ccf8db595eebc49c98d3.npy +03636649-796d944631745f69275286bf1f79c201.npy +04379243-190ac74c619a233470412e9b69c8933.npy +04256520-a4ce7b3e633a6c802c5d34a902e568f9.npy +03325088-cef466a7a055ea8a15aea01a869de65.npy +04379243-8f380fecd7c5b0e4cb95bbaeca3ed4f1.npy +02691156-f1b9ff223b5a13719a6e43b878d5b335.npy +04379243-d443a71b6cd1b4b0d0e90ab6c6492cb4.npy +02958343-1c66dbe15a6be89a7bfe055aeab68431.npy +04256520-2fc2409aa962c5553ca57f5648ff1b0d.npy +04401088-3621cec4df1ddf421844676433a0aca.npy +03261776-8f000f5a05ebffc5275a90d0cd7aaf64.npy +02958343-272791fdabf46b2d5921daf0138cfe67.npy +04090263-36392e6edec3c8b59aa300fabdebe6be.npy +03001627-4ab439279e665e08410fc47639efb60.npy +02924116-45223e07115146db5b81bbc42b23c7b6.npy +03642806-69ca190b89d622d6def5bf46a0f0ff11.npy +04530566-e5a3728a3b5a7ecd1d2d2f3b717d35d5.npy +04256520-461772d07ff458d7470846ec41d04ed8.npy +03948459-12b346d7a60328ba9be47ac7c7e37815.npy +04379243-19eef9f0da098279c8bd09537246ca3a.npy +03636649-41e0a38cafd737a87088591b1a3e2750.npy +03001627-52cc5e280c23ea9d490ad276cd2af3a4.npy +04379243-c40a88d13709eba91f30b807ae39b61d.npy +03211117-3324b4a3f1440d7b4161e123a102b12b.npy +03001627-6b4622c4e15b5cc9f91663a74ccd2338.npy +02828884-d55207728b14e543ad5067eac75a07f7.npy +03001627-1bdf0a0bb9db1db68998b3b64a143d42.npy +03636649-c93f10431b324061581fd19c35a5c8c.npy +02691156-6311138687290f8a505ae8d422ba349d.npy +04379243-8669bdebc11a4646618b7927ac6e11ea.npy +03001627-49e265cf00ecff0f59d9b12c05c8f809.npy +02933112-282f296a666fb63dc59350d819542ec7.npy +02871439-7c1982d2d4a240de3848bf8bbe386d81.npy +04090263-425f45023b30fa6ecb88c9db6e396994.npy +03001627-1f5a2c231265aa9380b3cfbeccfb24d2.npy +04379243-a25f904dfbc0fb0331b9e762848db625.npy +04090263-b3ea2d0331ec9ec650544cd7fa263944.npy +02876657-63d98b2654d8d2a2f9411c52486c6e63.npy +02808440-ead316f148fa1b699fd7df127276ed69.npy +03046257-752bc71803170b3514038d588fd1342f.npy +03624134-c0ddcd295d84beb696196068f29f233.npy +04379243-521e51c43fe3def573ae93d3b4dd6712.npy +03001627-a65534c7545a4b3a19fb4103277a6b93.npy +02691156-1ac29674746a0fc6b87697d3904b168b.npy +04090263-9773bf30a8dea97145f791e063652f65.npy +03797390-b811555ccf5ef6c4948fa2daa427fe1f.npy +04379243-c8fff605d821d607ff28aa687ec5e78a.npy +02958343-3efdb762f2663a014c9dc258dd1682ab.npy +02933112-2ba392a70c40dac7c59350d819542ec7.npy +02691156-1d4fbbf681ba892ddeddb5c33cb2f8f3.npy +02958343-e5da1a1fa675c704a2edbcbb0bd69bcb.npy +03337140-ae4c4273468905586ae3841175e518b2.npy +04379243-8ce538a671c6e684d93768e7b9b1eabf.npy +03001627-65f065a51800eaa5cd476b195edd95d6.npy +03642806-ee31f8d77002d8869b07343517e0f88e.npy +04379243-451e66939d40c5be61bfbba8a5defb02.npy +04401088-73d6b5dfb0f2bd8f5c351e299b24e355.npy +04090263-22bf66e440bdb80c3d7c323cf1653143.npy +04256520-a9698105867e9818f91663a74ccd2338.npy +04468005-22de7219d157d442af02dc8e9b049407.npy +03325088-790d92e4614f2f13321831d2245cf06.npy +04379243-fd1cb59eda441efc3a6294a7f35b35be.npy +02773838-2970e5486815e72ccd99ccc7ff441abf.npy +02828884-6ba417deb22dec19ff8d96709474c16b.npy +03593526-f0612de90c1fe7d430612f5c0ef21eb8.npy +04379243-84611112c9300d6b19fb4103277a6b93.npy +02828884-45d52d8c9b100eb54ebf9d56b42b3033.npy +02992529-8aa05d2bb435ab441ac3fdfdb76cf4dc.npy +02958343-f578a26ffc6771b21767453ad70570c6.npy +02924116-8780fcb7aeb4dbe1e2f5e842488b65f7.npy +02992529-78b4f3aa956b52139531a714ad5bf7d5.npy +02691156-8a050edf3d971a617b17a3f88bbfbb61.npy +02808440-763aa4a2281d5a2cb1e4f0ffdb30250.npy +02958343-67c229c70e64a25e69c2e0a91b39f742.npy +03001627-b90720eca9bff16c45c481d507018ba.npy +03636649-c778a6ac6cf0c81d4904d89e9169817b.npy +04379243-cc8217e65e253ffcf51f77a6d7299806.npy +02801938-27f58201df188ce0c76e1e2d1feb4ae.npy +02808440-81a7ebba1f545a4b57b6140a0b345e1d.npy +04256520-3a69f7f6729d8d48f51f77a6d7299806.npy +03001627-9ea7facf01e448f328a1548e344f0e2e.npy +03001627-48d2769e59e4c2b9febad4f49b26ec52.npy +03211117-70c43793136021289261ff87472ba275.npy +03001627-43d38ad2f5d103adf9b9977a2406713a.npy +04090263-8532101879b57af2fa9286f039319ff7.npy +02871439-e382838534662ffaac6f189ba32d2a38.npy +04379243-1b48826b38c2dc0630d4c74109f9e072.npy +02691156-d63bd140efa537dcf73e5bc170b7e2be.npy +03691459-20ac1211f88a8a1878396b03f57f644c.npy +04379243-46e88f122a869874d989c9f989a09ff.npy +04530566-a646c8780e79d091cd079e2d482994e.npy +02691156-b943b632fd36f75ac1ccec171a275967.npy +02691156-6abe0099d2a6efc882401bb74114a99.npy +03001627-ccc4b5366a6dc7c4cffab2c8f8bf5951.npy +02958343-70cf106dd369bf3ac427f8508e3d634b.npy +02828884-7262d96c5817ab55ad5067eac75a07f7.npy +04090263-1fe9e8fbcee0dcc8683e3750b53385d5.npy +03337140-56dc186e01c7056e91c352d02061b3f7.npy +03467517-b004331ee5cc39caa24eeca91f583600.npy +04379243-65b353144d52d75e98d5fc0473d00a1c.npy +02691156-35c8abfbabb0d8ea66b0983c7366318e.npy +02933112-bde4addb689c2ba55841240ed5c62c36.npy +04256520-c8962afab63de682a9ed6dce8b2a37bc.npy +03001627-df8c98028d8ff2435dc3653f8341633a.npy +02828884-39d8fdb56b0e160dbcceec49967c0de7.npy +02747177-9d579fa393e18a0570442b4b3eac5c43.npy +03211117-3c4c7ec7ffdfec50f39105e1e4d2e270.npy +04090263-22e4139b7fd37bda2538e024d06c30fd.npy +02876657-ab3795042c759b6798646029ad91cbbd.npy +04530566-eb1d9a98d4024b2e89d2f742ca991829.npy +04256520-d0ce2d65a1f3f7f0942fb082e747f0bc.npy +04401088-7392ea79052281e6bfbac23a8087e8f4.npy +03761084-337b1db9d85de33b4a73e364671ba824.npy +02691156-7054f98cc8af397f9a6e43b878d5b335.npy +04468005-af418bcf5fa6b22642ca7cc070f21ed3.npy +04379243-bda00a13a1dcbbee908afb10f96957b6.npy +03467517-e25b244880bb40b9cc34b900bb2492e.npy +03938244-f06843cc11cfe791cbcb2c721c3564d4.npy +04530566-ac8a42622eed9830ae433bf4d273c8e2.npy +04090263-b5f4600ef0e9a5a8dd0a2071dde26395.npy +03790512-66fb059b0102f4275a03ed6c9088ec08.npy +02876657-2a9817a43c5b3983bb13793251b29587.npy +02958343-afc23aacd3e166d9f513bf8e198d377a.npy +04090263-4223e38ce99c160724270d533c13dba3.npy +04256520-61177f1b2f1dc0b394fadb3555028734.npy +03991062-43e335f8f080f6df56ffb3d9eeba35bd.npy +03691459-bae089bd1855bcdcfa9922db9b6aab31.npy +03790512-e5747516a94cc4c9e8d78fb938bac492.npy +04530566-133c9fa2562498d28ae10bd53dffee76.npy +04256520-28a77ea1fc6b43f936460820a7040825.npy +02924116-662fc1d9049603e61759ca9eefe0e251.npy +03642806-466ea85bb4653ba3a715ae636b111d77.npy +02958343-54b10fd57a55e249ad07230f53fe98be.npy +04090263-f9564e57bef8a7446c16036d807ca393.npy +04401088-be254a4f3097143fe0e25464307430b.npy +02992529-8b4c89b8f756cc6e78fe949fc1419876.npy +04379243-d309951e04fd344c7b56d76bb19dcf39.npy +03001627-fdd7090f3ca12395a7ae19ac44244eae.npy +04379243-f3cbca2c7a6b2821f4b6538438a0b930.npy +03085013-9acaa3cd9bf7ab64e1b43120579d856a.npy +04379243-3838913e27df8fe5287005440c82669a.npy +03636649-f021d7374cb40f0da2ee802ea6ed091.npy +04256520-9e35945e9d768135d028c2e338a88f09.npy +02691156-bdfbf1c555dacd9d325212819caa597d.npy +02747177-27ed54b7f9c371b72056b4bd5d870b47.npy +03593526-701cb938a050ced01071d664364e92d8.npy +03211117-d83dcf0d435bbb87b6d41c42f7ade8c8.npy +03001627-6dc02b1884fb578492d9da2668ec34c.npy +02691156-87b4476ce2df563972459a40bb821ba6.npy +04379243-3c475d9f0433a7eaad2650d014e970a5.npy +04530566-e3f81331fa00c5f893375feb9c1d5577.npy +02871439-bb6b74ceb3fae8b5de98e4da245e0b83.npy +04379243-2e4715cfffeb76f6e074517a246f1e65.npy +02958343-8b2f030e604925c92a9eb0f146e94477.npy +02958343-a115d534edec6f89afe1d4530f4c6e24.npy +02924116-d23dfcd55f78a48041cefd10ce5d6cc0.npy +02691156-f390b1b28b6dda03dc57b3e43c28d486.npy +04090263-8a669ef9b92912112b38b1d99376c0b.npy +02992529-44cb63b74117f9a77877a964f5722626.npy +04256520-fa0218bd49f8cc6d593ebeeedbff73b.npy +04099429-9dd060ee900f4e81928f48325a5eb64.npy +03211117-e2cc0d50d6953e760a25ec0f32e89e3.npy +02691156-4fe076aa34c706b83d7edb3bb2d24b58.npy +03001627-a97a00bee5585e49f05defab1869a09.npy +04225987-58ab8327f188e0a063381d3d7e871939.npy +03001627-ee20e46c542e2268f51f77a6d7299806.npy +03636649-13b365ef4887f5d388a942de43574033.npy +03001627-f1167a0c4bfc1f3fcf004563556ddb36.npy +03001627-7b86f52727b40120e3f7a74e12a274ef.npy +02828884-8d074f177479ac42628516f95b4691f.npy +04379243-cbb90091d43fabcbd5cb6d178687b980.npy +03001627-70f1f85d47c970bb78dd615a59de5f05.npy +02808440-8a55c7f9d5fc9dac33da1d126caef9c6.npy +03636649-5ec6c52d6d5dbbddded4c23d05709216.npy +02691156-9be01448f3b2b932828204947d78b9af.npy +03001627-40747ff0ea92f134c409eaceb0331214.npy +04401088-8f3dfdb531d1b5dcb4ca066f17bc06cf.npy +04401088-70fe91a7bc072c39cf81faac56233ce6.npy +04401088-f48acd0450cf96cde6b9b562e2cde99e.npy +04379243-d1cf31acd02985bb50efffb055ed6bd1.npy +04379243-1ee0509358dc8bcae19134c8fbb91f2.npy +03001627-5a52b62f564eb7e117b431cae0dd70ed.npy +02992529-3ed359e502a24e5a79510444cc61f839.npy +03001627-1825f6f71e68da9da36af77e45b32071.npy +04530566-f1d39ce0d8c25403b4caa017b521f7.npy +04256520-978c47d21e5c66c6f519adc9991b5f11.npy +04379243-8010b1ce4e4b1a472a82acb89c31cb53.npy +02828884-ab1614b56ea09479d4d8765e3910f617.npy +04530566-77e304ed79aded1e454ff46d89fe2a0a.npy +04401088-6e30906a4d0854e9f31b75c4a94a8879.npy +03636649-9e49915157b79d911735ea0e092a805a.npy +03001627-a4684772b9356ba28fa2f6eb9fb1de7c.npy +04379243-399680cabe38c8e27b3d8399a9d05045.npy +03991062-2e1b664ff0cf2589577bb053711067f.npy +04379243-92d806ba93c283f73379bf463ad73282.npy +02828884-716fa6d69c22db83bc6fbe160acb5d0e.npy +03001627-dd0eecbd7ad89b2563e7eea06f1f07c8.npy +02958343-4510559f5587f601147d1b898220921a.npy +03467517-6c9f5cce840dd728d74aae0eb2ddb027.npy +03636649-89ec7ebc49a312184205db2677c7526e.npy +04090263-760165682193d0d235d753857de68a9a.npy +04530566-bbf1507f7126733665224ccd01ad35d4.npy +02828884-b2dc3053a4643c876ae68b11b0aa337e.npy +02958343-e2349120e4c089ef2fb4628a7a8b337f.npy +02691156-602a71a251857294959a8a7d5a8a5077.npy +02933112-5f7e3d694d47fe6cde650492e45fb14f.npy +02933112-7470935c77e340f31781dae1261f1d28.npy +04379243-afea61dd761b70a3fc0035da39bd5e1.npy +02924116-eecc5e70c70de25f41d068e6df669f0d.npy +03211117-b3f23358467f8c75dc974f7ff5ddbdee.npy +04090263-98fe43e81b9e1b5ed8569d1a6c25406f.npy +03636649-99688a2668fe1fa3cf004563556ddb36.npy +03046257-58507d92c9c0a4f07b79156a61ad4c01.npy +04379243-d01a6b35a54c8f77dd986a55e273fa14.npy +03001627-99fcb202acf5d60950cf3715818ccfe8.npy +03467517-4f401d78068a9d348ee96618ee16ca27.npy +04256520-a8abbef69d380399429c5e5ac1d52cde.npy +02691156-144649df5a5f9c8b5e4cd38353d7ef05.npy +04530566-abee560e2dd721eeb129901f80d24b7b.npy +04090263-d2aef97be32d8118433d7c8e9cebd7c2.npy +02828884-ec4317837dd247dcd2b12aa6a0f050b3.npy +04530566-3970dff155f0a8731aa129fffe673b3e.npy +04379243-d30873e4da202806d42b9650f19dd425.npy +03261776-54bbfb95b752b658c0aaedf10d776af7.npy +04379243-b87594dec9d851c035836c728d324152.npy +02992529-ffd186dcf855e13e26479a182158bae5.npy +03046257-50ad0cdc651ab6fbc6cb0dfa2f14f9d4.npy +02691156-71dcfd1e5d1e261179febb7e11d3625.npy +02691156-bfcc89117315f3da90b1d6deb98feec6.npy +03636649-64eaa45bd2e01db8991ff09eca5b27a8.npy +03046257-ee017bf2df50cf7d5ae4454b5be72736.npy +03001627-2b01a7501dd9780075e0fac069101b51.npy +04401088-2c8699277b2717be66289707fcc0ca1d.npy +03001627-eb7c48d1729fc4ceb04cb542e2c50eb4.npy +03636649-a4c06cd5032733af543df75232f6ff2b.npy +03001627-c6856ffc6e9afdaf680876614ed35a7f.npy +03325088-c4d3c1f18cd11fbb7fed642e5f1ac4c8.npy +03642806-454a88f4b2fe4472f9cacf0b2853f40.npy +04256520-1aafe6bb91e66b1a22e6294dfcaabbc8.npy +04379243-28411ec68714ab87b9ea118461aa8a00.npy +03001627-7fe08cd7a9b76c1dcbde89e0c48a01bf.npy +03325088-5c93abb4d8158919c36fb70296e45483.npy +04379243-a1d7eacfc3e946cbed4671e7b5b34212.npy +02958343-2a844013c66dd19d32e3a970ba4fb82b.npy +04379243-ddcaa720a7b878a4beedb4c8fd29e2d1.npy +03001627-99f02614707ce072e8f8c11a24c52ebb.npy +04530566-d7c58ed725b2449dc570a3d482a3f588.npy +04379243-3249c3ad90085a9e98d5fc0473d00a1c.npy +03001627-106c7f10c5bf5bd5f51f77a6d7299806.npy +04379243-7473f09709d14a2a8d1dabf86742ec3c.npy +03001627-cbb3ece285d9c48ee7e684d25d4dcaf0.npy +02933112-2b3f95e3a1ae1e3f824662341ce2b233.npy +04379243-5aadc1a9220fdbb8349f14616fb49d0a.npy +02808440-a3701a7cf32da91c52b20f433bf30081.npy +03691459-5c4964d7c42cf84bdd9ef3991bf7600e.npy +04401088-fa14355e4b5455d870f7cd075189ddd8.npy +04530566-fc252e6ab475cfd6882046e7e9998f89.npy +02933112-a874dcff3bcf8a802aca02f099166182.npy +02924116-d1f70630a6dd39ab5c3e3ca6678c6811.npy +04468005-91abdd972aa6223484e6ee03d2dfc5f7.npy +04379243-764c1145134d658275e36e88b6617f01.npy +04468005-76a0286bd59daf33ce5aed93ba1467da.npy +03001627-c67a255a26e30abb6b9f3980da0b1dff.npy +02992529-2bb42eb0676116d41580700c4211a379.npy +02871439-f265bb0c3d006754c397356311cbeea4.npy +03467517-58bb21c325f021088f01c8e793a6e062.npy +04090263-5c960809f4f0424d217fc13ba9e6b2fc.npy +03467517-23d3e315f1364475be98a7e88127164e.npy +03001627-53653524f2ec502e8b2b8dc0c816caf.npy +04256520-7402b0be6d04b45da5f9d52c12457194.npy +04379243-244955211c2f3b94b821b834431f4e0e.npy +04090263-67c285f5c701d6cd8ea092ebe8f64ae8.npy +04379243-4f3b404cc30d2306b96ac7572d4197cf.npy +04530566-3583b3e2b8dab3f29d8ea13dd61813ef.npy +04379243-741b91f2187d54792d4fd2b0f2040d45.npy +04225987-e7a5dd6f6ac650977cbfdb97d3d9f05.npy +02828884-3c90d2eda6fdae1fbe1638d01f5577d9.npy +03001627-994dccd2cb784510a6fee8e2140acec9.npy +02876657-3999ca6a50ae47c876b38b4cbe0c74b7.npy +04379243-a63f58a27c22886a721de3dd14942a.npy +04090263-88b978e04c343d25c11d80527540607.npy +03938244-81f8252de176a440f37af16b2893f1d4.npy +04379243-3d5f5cf765767b0fe8e2c411e1e93d03.npy +04379243-b360448cc4b230c672745a2d9975c702.npy +04379243-9e2318099f77d3df3527ecfeb345775f.npy +04090263-30195a2d2fe56a1f6887cd98a5557c7b.npy +02691156-12f3fb99c95c6a7357891d676f728bc0.npy +03001627-7729a6ad96985f4ed1ccbd5d84e5bc86.npy +02992529-8b17963baf2e54f87a0b781a26650bed.npy +02691156-4f2830d3d566220be5dd38f670a033a8.npy +04379243-5cbd726c3ffd8fc49b458816be7a3962.npy +03593526-cec74e921815d1323785c1af944402a3.npy +03636649-5cca570916f420e64b3c42e318f3affc.npy +03001627-fef17c8f92673dd477b7d69aa83ab6dc.npy +02691156-73bcbc2d147291451e7b1f533ce75.npy +04090263-7f41235f55f396118aa27cedfe9e8bf6.npy +04379243-e897ac13dcc0adfe456cbf78e1e89022.npy +04468005-96aac69e5f77277fa0e49cc1ab2aa478.npy +02992529-3a8b1287aed892ba5661e3450b04a6b4.npy +02691156-9e998a06601e9f944b2bd73664dd1844.npy +04090263-3ff0d95df1076951385d661539b5c1fc.npy +02924116-969b8fb8646a799d9a6127d91a931eb1.npy +04379243-8d45802ef679d08a1a3b40747093a35e.npy +02958343-ad4b1cd62d72089e200c039929e0446f.npy +04004475-6bbb7abe06ab037784d5f12fa5114b4e.npy +02691156-464879f87b67827af268234accd8cf4e.npy +02958343-bb7ca919b59a3a2e6b418c7d9fedcaa9.npy +03691459-2c44213112c85413f0c1015881a0926c.npy +04460130-28685f1adb96fb1eb6eefc259009d337.npy +02924116-339007af4ac0e349b1bb46d2556ba67d.npy +04379243-541087bc5ff0e0bb349c13532142fc61.npy +02691156-95240a3e33d607bd88803e631d9fa455.npy +02691156-1678946724380812de689e373096b0e3.npy +03991062-2dcd625ed44bbf1625ebd1cd0b422e32.npy +02828884-44d2f4786d18667a86d0ad6addf83b07.npy +04379243-b9a0e6854bfab1682db9fca4b68095.npy +04530566-9e3c0b7fb69ec3997cd1f8dd6fbce8fb.npy +02691156-aca6b424287392cf3438e17bc657daf1.npy +02691156-c1e6d2235406d250e9ca68dea406967d.npy +03691459-4cee7bc85dae3a58d6a78c624f639b3a.npy +04379243-cf97b60fbf85b0656f236f75bfa0f434.npy +04256520-c7e3aa97aa279582febad4f49b26ec52.npy +04379243-e53057e1a9f6f135b97ad864945165a1.npy +03001627-1dc63eb0c6b1102f5369e32fb818f337.npy +04256520-24deb13c2dd93649d329896bbf26eda9.npy +03001627-1bbe463ba96415aff1783a44a88d6274.npy +04379243-adb934d3f4ed9dce22cec5ca16c50ce.npy +03001627-11740d372308f12185047f9f654ddc2e.npy +03624134-57a636a6a66cd955f16c469ffeb982e.npy +02958343-eda96319f9f01f998496c87dd2a4075e.npy +02828884-473655a56670e13dcb2a965e75be701c.npy +03001627-f23c1bb951fa8909bc01640b1b5116e7.npy +04090263-aad0d20fb05f8fb0cdbadd1af48b5cd6.npy +03337140-7176a2f2662a410558df8eeaf3dad1c.npy +02691156-53789eb9419da78c19bf80b167cee3a3.npy +04090263-83dafc89711bbdd68cb93ad688d1ab8.npy +04379243-20b8c6959784f2da83b763ebf4ad2b38.npy +04256520-89622aab3cd599787088864e604378e7.npy +02958343-5c3fe4057ef12b6886ac29addefc0f11.npy +02958343-9e4a79d30930cc2fcefa74f1d0bc6e6.npy +04530566-8d7af39621a060ef6483ed11b9134e43.npy +02924116-80437e427d0e38d6ffa4d8d9b47d3a6.npy +04379243-813599653f44dcbf245495d3641f83a4.npy +03001627-81e60b07ea1090bf58e4244f8066a2ba.npy +04256520-bf16681e4b86db58ea07fbd08eb87bf2.npy +03636649-3784e4624e880e3d1735ea0e092a805a.npy +02691156-aeb10a6725afb1abc79f92df566f8c6b.npy +02691156-f998bb1b62da4d06d3a1a47fb9b678.npy +04225987-c7482cb7a8db514921cafafd7e7949c7.npy +03636649-80436dff2a30721849655ac7c771b113.npy +02933112-bc7973150ac25b1ce08dea88cca8641e.npy +02958343-45d94dee6634efd516abce8cb03e7794.npy +02808440-90abc75db76e80e244221bef0fa3c36b.npy +03001627-323fc7b1d2b44cb7ff2b8acf844d34d2.npy +04090263-268b57eb7dfa94a55eec6d8d24f1fde1.npy +03691459-aa293b3c1b4f1509e3bf55e5ac6083ca.npy +03642806-66d47a84a3d522dc9311bf79d4774e73.npy +02691156-5b985bc192961c595de04aad18bd94c3.npy +02871439-3c8722f2c0cba2f1788f926f4d51e733.npy +04379243-d58ea40d8a5c8c0c362f4098f2ea31b0.npy +02924116-c279df97ad444bf8cb2ecbd32dc2119e.npy +02691156-870dc1667e957672c66e7238ddb322f4.npy +02828884-807f68d665cf7b0cf4fb4dee5181bee.npy +03001627-250ffcc789426a255f46d55537192b6.npy +03001627-8c76176c82e3e42d283b00891f680579.npy +04379243-f96aeb7884a318bee76bc197b3a3ffc0.npy +03636649-63ca3763b86aaa4daa29ca6a13991ec5.npy +03211117-901170b0a4cf30e746407779dbd69b2d.npy +04379243-654d6b82543a863c3bd24f986301745.npy +03636649-7bc039fffc79dec9e680aea9bdb841f9.npy +04090263-7ca6a11f827014b4643ae903098a314.npy +03001627-b54ae988f5bb6c6b3efeda73d60343e4.npy +03467517-1508f193f91760f4ff04617a8348dcb6.npy +02691156-55cdb0891d7a05fb2217d56276f279c.npy +03325088-70b9b63ce547031276d20e73c57c9a03.npy +02691156-769efbce0af867807456183f198fd1e9.npy +04225987-fb1ad690d8befb5a74bfd4c8606b795.npy +04379243-d08ea9c1e5b9c2687bcae7a654cc37.npy +02691156-8f4c92227704fdf11c568754310e5f73.npy +03790512-af2648ef08812a0aa747c19778aa6cc0.npy +04379243-40343df799bfbc12c506ad4a52a913c4.npy +03211117-34808bb66b2bfa07ab7f9d2da6fc61cf.npy +02691156-48a0d4cb43c961165de04aad18bd94c3.npy +04256520-7c31c4d88c67d094b3c42e318f3affc.npy +02992529-e70ce62b41a598dba48aee3bc134fbf8.npy +02691156-ca11efc8928c10908b96ae1a0a8b84ec.npy +04379243-c302d8053ed38c06b589fc18f8d1e43a.npy +03636649-7124fa42397a447c34db027e489e649e.npy +04379243-a7197c1bd1bd1e47f9715dc5d7dc0802.npy +03759954-b5f84612f4afab9127454bdf69cf23f.npy +03001627-e9651bd689ba5c14713decb1a0563b12.npy +03001627-e64630913e8b723c23ff850238a15b07.npy +02808440-712d9397ec53765f9e25afd4f06934a3.npy +03624134-d63521a0dfac9c1f342494fa6f09f376.npy +03636649-cce6476ac521a1d130f6e0ede20c4525.npy +04090263-144551f27b55f6d69127cdd763fc899a.npy +02958343-ea6d538fb5cf3c0bacdcbcbaae0ea58b.npy +04379243-ac6b9f1d494c9a007ff6ace05b36a5.npy +02691156-c1e081e8b97b3fc7ca8607f540cc62ba.npy +02924116-d5c8e754e1575799e787217f33881228.npy +02747177-de2d9b57b6bd695c6ef50a3361f29610.npy +04401088-f63a0d0c33f7a0c69a83e6b4ae8b154f.npy +04530566-13b7b299d346020a4de203ef6842ee61.npy +03001627-453a678dec4e9d40f36ea1eb6542fe7e.npy +03691459-2c32c107198ac36d37bf4b78d36088c4.npy +04225987-af4343c5b78b70b11082f2ea630bf69e.npy +04530566-f39ff9453d6247fd5ad805579cc24068.npy +02871439-f7e50a524e4c0120f5e4af71271bcb89.npy +03593526-9bbc7da5313433c4af93a86670701266.npy +02801938-2294583b27469851da06470a491566ee.npy +03211117-95832db2feb0cc7ce441f5bb6f88ca61.npy +03211117-862ac718bed40aef2715de3ea7b582d7.npy +03636649-771d4def2e44bc169eb34048e600e1ea.npy +04401088-3d5487efc1d3442ce81f45a785365b0f.npy +02933112-53b396d2ff7af087d01673c7c57450c9.npy +04379243-9afa121e3aec8bd7c387f328a37d8ece.npy +04379243-cc53e7b618721da04b0c98bb5e7fbdd9.npy +04379243-f29863d2fe8863d4195b8ea6a366e14d.npy +04530566-c06ec9a0e32cfd11abdc408c54a4b577.npy +02808440-a807c9e7d931552198e5dcc53f48a2f5.npy +03337140-f2a535d237557ec26795ef8bd10c984d.npy +04379243-c245772cbf233578164e1349afbd1b70.npy +04090263-38cbe2bd51cfb1e47751f287348e54d3.npy +02924116-5376e60ac978731b3e0663c649d74521.npy +04090263-4696d7e82c49aa2a7b6175b1be6bcf01.npy +04256520-47c991f72eaa53c6a8737fcf23389014.npy +02958343-44bd1920adb5fdbb473f10e6caaeca56.npy +03790512-c2f26a9646369c6d373c34785838ee4.npy +02958343-29793366c4b45bf6f43c51e53897fea.npy +03001627-8ec16015c0956f847acc6457762e6ee6.npy +03001627-d46e16509b1c91b3933dc172307a6bb9.npy +02871439-51afa4e0aa973f8e8798cb61bc1bf943.npy +02924116-6198a0042a1fbd8e096abd9da1e14da.npy +03467517-9019d3332cc8fa89a40020a6eb12ffd2.npy +02691156-aff5f5ac9dbabebee5d07633dda45110.npy +03001627-e34658debcd1644dc8687ff9b0b4e4ac.npy +04379243-dc68436ab1a576f6573d2c9ac4b23fdf.npy +02691156-96ee3ab4413dca5a48d2ba4615e03b21.npy +02691156-2b8bcb6e208a69b16a3383b58c4a9330.npy +03467517-a24d5a44843f54ee26587cb13c78fb9b.npy +04330267-74b1c02e8862abdf1d1f7b2cee80fcdc.npy +03642806-4b4dee079f46cb516b99fe64076e852d.npy +04379243-bce971ee4e980b77e3f7a74e12a274ef.npy +03928116-81412f3a04fb62c39a595400278b1b6d.npy +03761084-c57ce5ac1f4f5e127bae653f822044a6.npy +03624134-cae0a0c69888bde2daf44b37a13dc4d9.npy +02691156-bf78d2e27a671fce4d4cb1c2a5e48b7a.npy +03636649-69222648c3e3ed986c348bc129690193.npy +02933112-737fc2d91572a9032ea98d69e91ba870.npy +03593526-70367e4fd1ad753427eb00c151c6f711.npy +03001627-2ce61518f138b7f75d009c98a5b96836.npy +04256520-4975537eb678cd54ee8a0a0ef14611b2.npy +03636649-fb2de79ee3a257eaf8f5708c6c7585cb.npy +03636649-a3b93f34b7e36cc52460e48c67c108d4.npy +02691156-df1c68e94259c6cf5c7319b71bdce6e.npy +03211117-78f69254fdbe4cb4ded49d32c1b10de3.npy +03001627-adc76ddfb1d619a25dc3653f8341633a.npy +02828884-e5b1626359c609a59d297e74104d3ac3.npy +02691156-1482d7a9e529dde7340461a254c1a95.npy +04379243-6281381ce38aa988de98d10ab5975b59.npy +04379243-45363f30a1e16c215963245f0923337f.npy +03001627-5952c6c49ace76c5beea20858a99d5.npy +04468005-fc3f81e5a2bfc2a08be7c8c5fdb9bd6d.npy +03001627-20eebdb573142c4eb0a9829865a5e240.npy +03593526-ee490d76aac9cf342f2318fdd66be40a.npy +02924116-ed107e8a27dbb9e1e7aa75a25fcc93d2.npy +02691156-e41c5719ad09055f1b880c747ee1f83.npy +03001627-5482bda23163df4f30e916fac260c672.npy +03691459-9f242e37099ac424c3bf2ffa047e96ea.npy +02818832-5b584c8178fff5bb77fe1aa9b41a89c5.npy +03211117-1dd8b03b590dc0ff9470c43f253f33ee.npy +03691459-40b492e1a0fb0860e2f05bd11e1d1c68.npy +02958343-41b4832983f44aa3a7fd25564c2e888e.npy +03001627-df6ca774d390755cbd18e74cb7446915.npy +04530566-bdd8d8f6e6536c0d4d16452ef1302b59.npy +04530566-6a7da232456b16e852f03e17d84c12b.npy +04379243-677f0b4f9c5398caa3e1d5a29d2bb5b9.npy +02691156-3a3403fb14bdb46823e79e99b949a341.npy +04225987-c8aed131dd905c6e1082f2ea630bf69e.npy +02924116-6312773514521960f5770725611ee0cb.npy +04379243-1e90d86b5649720047f453c4a13e89b9.npy +02691156-e4e1b542f8732ae1c6768d9a3f27965.npy +04379243-61aea77ab9adadfb3eeddbccbf885e99.npy +03001627-d481cc9e7d6d7d64baf5b49ad7809302.npy +03211117-6c49b516b04e89a15817e30de1dabac4.npy +04379243-feda1b3bf39743d8f16ec553491baad7.npy +03261776-51245ad5a0571188992fd3dac901d508.npy +03636649-6d15af6141ea7c918bb3deb7fab7c9b7.npy +02691156-3576bf753aea3dcf661f0ad700067cc.npy +02828884-dd97603ce7538c15be5bbc844e6db7e.npy +02924116-8042307e75e578ec80b4025fb2dd9473.npy +03593526-aea1a8fee02c011db8183a4a81361b94.npy +04256520-c365bb7af1fd9fd490ad276cd2af3a4.npy +04379243-a01e8ade2a92a0eb35836c728d324152.npy +03001627-72cd991e81a34504d838ae16242881dc.npy +02958343-72ba2195087f80d8b7e8c57d131d2ca7.npy +02691156-d59cd5f2012a1ca1aae46a5cc955c766.npy +04004475-e5b8c6300b1338c95cc4187bd88e76e1.npy +03001627-9849c890f3bc80723a4642fe4c259750.npy +03001627-d311e10015f19bb7482d5f087974fa09.npy +04090263-4bf3fd740498b489a7d276ed256acd94.npy +02871439-c758f0524891b18110b7af17eb4b15c9.npy +02958343-ec9f938ad52f98abbda72093f9b5aa73.npy +04379243-37e1a5d6689a83d3b03169de4ffd172b.npy +02958343-5a9cb2d24a3591aa27fda8a7465c0e0b.npy +03001627-1c3f1a9cea91359c4c3e19c2c67c262f.npy +04530566-ea940968d0ba131e7b66b8fe985fb060.npy +03211117-5e64913f2c74cb4825680a002b1d7d67.npy +04379243-7b92f6facc2a27bc84cc0348a73b80c3.npy +04379243-618469f067751604b0b9d11504ae34f.npy +02828884-5a86b8c93baf8ad0a9030dd33d75b731.npy +02828884-49908190a4206224f28732697aa0af57.npy +04256520-e8d6ed94c67d6f43708fed31e484f9c0.npy +04379243-5d38978fa7591a3465a50d0cd9008f5.npy +03001627-8c0a0360a7353ec26dd3cca80cedd415.npy +04379243-308a43b7ad3f8c2bdf8a6816927a07f4.npy +04256520-2bd1439924492a3fcea6c8d9a419e8e0.npy +02958343-d20990638711f55967bf54a1f364120.npy +03759954-2b717a6fb2aadcf9a22dab393015702f.npy +02924116-bc1c76c847e4dd6a28c978a3d9ad6d7.npy +02691156-e0a8ae255ed47518a847e990b54bf80c.npy +03691459-368d30ee72c63a9512da48a027621f2b.npy +02933112-d8cd6611c5f407cdbe81a9109a782712.npy +03001627-7eaf212097293229fd3456bfc7553c94.npy +04379243-32761afb4b1eaf31810493eb9cc85e00.npy +04379243-6c026a5f412f0b93002761e7a3ba3bd.npy +02828884-812665596d6c13b1adeb1694faeea26.npy +02828884-29fafe9d3b95e324535e3a87e2212e35.npy +04401088-ab4ddf9e4130d6b560cc5a290ea3b31.npy +03001627-790d554d7f9b040299513f98ce033426.npy +02691156-48b99ae8fbe0762a8ed04761eced33c6.npy +02958343-89eb1c5370b80567473f10e6caaeca56.npy +04379243-6d4128ab108730f1ab610b0c94236463.npy +04530566-aa0e4a79926c68f9bba1d36dfe35a060.npy +03001627-752102fb466042576a63d6c64bf6b56.npy +03085013-980ea79e2dab7a595f4027209dc8065d.npy +03761084-b546876ab51eb402203eb08a0c3b4355.npy +04379243-8eb9536af97f1aa05608802d2be44a9.npy +03001627-a643edc1849558eba81634d14a6ca786.npy +02691156-7f1eaf37fb4e24de82cea33798fcd6b6.npy +03636649-17b083510f14982b7eaeab1f0c9120b7.npy +02924116-303ae4f0f8aa96472889da66a4dd79e2.npy +04379243-c399ed276ed35cb9a6ce08f0d82ba063.npy +03001627-6d866b3d22082b89191c3762b497eca9.npy +04256520-f3e10fe9995b4f864b3c42e318f3affc.npy +04379243-ab5faf4dc8b23517ded06cbcf08b2fff.npy +04256520-14b9fdab8d264fc214038d588fd1342f.npy +03513137-190364ca5d1009a324a420043b69c13e.npy +03325088-e45586f848a038243321831d2245cf06.npy +03691459-17c5950c89528703225f3f0d46b4fca3.npy +02828884-667305123da07968d2b12aa6a0f050b3.npy +03001627-ec454747a071b83291a302a171d24a87.npy +03001627-431ca0621cab1313b0204d9cc6bc8619.npy +02992529-180ef1cc23b96050bc8c03f74d3af56.npy +03337140-d1155a28ca74dac83c4f66791e25960f.npy +04379243-7b89037bf1695628eb03e749ccd7a541.npy +02933112-da3a71168ea830dcc82d9accadcc9c9e.npy +03691459-ee2d8d72b555df84ad5d27efc990ebb2.npy +04379243-b2cee79b97104212aab142a21aede3bf.npy +04379243-9bd1c242bd66d2fbb63c01786992bd2f.npy +03467517-d157227240617cac755f5f999c69a058.npy +03337140-d0b6fb93a69beffc4c3aee8e9d3a6ffa.npy +02828884-49d0d178976c81f52056b4bd5d870b47.npy +03636649-75ae2c70aaf3c818d9c283deb7cdce0f.npy +04401088-2a48a703451da580555dee99eadeb47b.npy +03797390-85d5e7be548357baee0fa456543b8166.npy +02828884-9e5a16d68611c57cb2a965e75be701c.npy +02958343-7b2c86b542f822b1b8cf782e8c539948.npy +02818832-af2e51ff34f1084564dabb9b8161e0a7.npy +02691156-79a62c385180cc51da67790f4274f014.npy +03001627-8fed5abf598c5d113379c738ca193530.npy +04256520-8e4999f0e6bbb791f51f77a6d7299806.npy +03636649-5f901ee60f9c0d2c6297030373bd4c3f.npy +03636649-64c393bec510aa63c83f06951aa9795.npy +03207941-a4576a087360458a5194936fd57ca90f.npy +04379243-94aef6e5634907b16ed6e9e08c602c83.npy +03001627-499c4b519c708ae84cd08aa7c510fb85.npy +02958343-53125271f866288dc8b3f3d7aa7cc0c7.npy +04256520-6cbcf4636ee5593f75a82b88fe6e733f.npy +02880940-fa61e604661d4aa66658ecd96794a1cd.npy +03636649-d7ceec3ad0cad8093164c8a6f66d85d8.npy +02691156-73934196c92ce472f4a5531fe6556d72.npy +02933112-3724c3633a0db0c260a7085510f65cd6.npy +03001627-ec91b1b29b6bccd37eaeab1f0c9120b7.npy +04090263-e0b38e1386eec67624c5b9ac3d3770de.npy +02958343-4145debb6cf68ec0afe1d4530f4c6e24.npy +04379243-75e24952ed996c1072dc9d42e683347.npy +03001627-432ec0e5f2a07ab8795bf1abcc63e867.npy +04256520-75850c6e67073a2a593ebeeedbff73b.npy +03001627-d9943f96dfbdf331b17743c18fb63dc.npy +04379243-8af24cacd38e9c0aba5342d638d0c267.npy +03636649-eeffd79536a7ab3e597ff152ef65c9c3.npy +03001627-2ca371de1093a3867c9386abeb61de4d.npy +02958343-98d4f1e36d400acf5fd7e9b026930cd3.npy +04090263-b72ed7c7239e7bfd8e62f59b444d701a.npy +02958343-f9c2bc7b4ef896e7146ff63b4c7525d9.npy +02871439-72b84b9b53fee78c664b3b9b23ddfcbc.npy +02958343-9fbcae2f132db088b09b4c3b88665c4c.npy +04074963-98f33f33eaf6ccd3b09914703fdadd6.npy +04256520-53c1b173913bbc2b63d467b618e97922.npy +04379243-2bb137095c73ef6fe45ef4135c266a12.npy +02828884-28353d39cde416d0ed49e2c2d58fcee1.npy +02691156-a074750e28ed3818203936772104a82d.npy +02691156-d1a8e79eebf4a0b1579c3d4943e463ef.npy +04468005-95cba66f344cca89bf3ccb21f1908cc.npy +04379243-983cd9caf65adf1ddf6cfab91d65bb91.npy +04401088-8f049b65309d8390f5304dc8cfbb76e1.npy +02958343-7bf95b4dad8c1244d928f30a3aa85f67.npy +03642806-61972112749c9beeb95c80bb1ee18b0e.npy +04401088-5286f018c374d3ec3f7fe3cbfc3d51a7.npy +02828884-f60378083ea9b7fa5e14e00a99d44acb.npy +04379243-7fc3bc8542f4c17ce4511d9a59e40339.npy +03467517-9358f81d204434db1cd605219498ddaf.npy +02958343-39d161909e94d99e61b9ff60b1be412.npy +03991062-1ab5af367e30508d9ec500769fff320.npy +02691156-7855e8ac604ae162bbf3143b1cb6076a.npy +03790512-a70eb1b6321022e260e00ef7af003fee.npy +03991062-16e6fbacfbbc4bcf9aec59741c69cf7.npy +03001627-4447ee47cd2333f6349bb1cbbf9a4206.npy +04379243-9ae98c4b9fc07bc1beedb4c8fd29e2d1.npy +04099429-eff3a27a085e02e5146be45f8a3c1ff8.npy +04379243-6d00c1008f41a099eaf288f952624966.npy +02924116-eea7be530ab0f33e41cefd10ce5d6cc0.npy +04379243-114377fc17eceaae3e12d7ebda60f8f.npy +03325088-dd4f5eff165c85d8200a3881cd915629.npy +04379243-692e96270191113358df8eeaf3dad1c.npy +03211117-65582f49b9191ea805062aaa3bb7665.npy +03467517-6d89c3abfbc99a29ca3b1d47ae5d14fd.npy +04379243-27ef271434e2ab43f07fee5fc5c45ee2.npy +03642806-75936cfb6c3ee142205444155ae5c84d.npy +04379243-61527f3ea1741800c3bd24f986301745.npy +04256520-bd199c38c0fd7602c9f722bbac7c6194.npy +03642806-5d544ee4b094c6606436916a86a90ed7.npy +03928116-4f3300cd29c8b45eb1a6bf6b45cbdcde.npy +04530566-a0372d1c35e531e7130b54be1fe602e.npy +03337140-9c36412009d5311e64d8b0368afacc65.npy +03001627-a56e201584ad5afb61ad1cb92b23bf5.npy +02828884-486535f610428612cf078dc7b29022e6.npy +02933112-b5a0f4e52687b87ea5cbb6810d19a105.npy +02691156-64cb683afd5e9e559db1d21b460eacef.npy +02691156-da12fdb456d5fb588b96ae1a0a8b84ec.npy +03761084-495543ebd719a29ceeb8d422649e5f2b.npy +03001627-37c5d67f97a2231cf51f77a6d7299806.npy +03001627-4e1dae6ca4f220048ee0cd746086d989.npy +04379243-d477a17223129fec53227dcd0d547ba6.npy +02808440-2aadee812a70aa79fb3819b3d3d9c448.npy +04090263-190ce4466c6f4c04fa9286f039319ff7.npy +02958343-b87ae16029527cf3fa87597d91a3e9a2.npy +02691156-a6a27c5acbf70ebd3df325aac2f73830.npy +04090263-cac1edcba53ae3d16b2c8bb96250e4a0.npy +02828884-d27d44b023a8ac1a54457eecf7344025.npy +04379243-bf293b370275cac173eb02f1d995d891.npy +04379243-80ad1f839582d183fbf6f493308acc40.npy +02924116-3ad9c664f9173bd33746b762571ee4e8.npy +04090263-57972c646e88289b7f9e2c1c83736d47.npy +04530566-3ff7e02233affcc350eb615eb69452b.npy +04401088-fe9d97823a25e56d95e43220ee0eb824.npy +02773838-22b7d6fa819d62aefc69b7db9c6d5ad9.npy +02828884-fb2627957d4cda1bda31ead4cf13511a.npy +02958343-f1eb3f6c5a5313564c7d8ebbbb68f5.npy +04090263-c4f95f531b5ab758b91a90edeb58ed0b.npy +03001627-6ac89c723fcd7a55467971b4d8320221.npy +04379243-89a7bd3d0af7be05104a4ca1203542b6.npy +02828884-c33adaafb71b0080582f9c2e887b930c.npy +04090263-c518e4b872a0841e0652a919e7ad7e6.npy +04379243-954ae626fe09e5ccd5cb6d178687b980.npy +03001627-4011b7d293cbeae11890f3b4ec900fa.npy +02992529-d932fb5d06d5e4f8da8c8a88ff86c5a7.npy +02808440-b46801f946f4dd403af30a3946d92feb.npy +03001627-b8fe0dd70bae3a9dba7a8c9ac8add14.npy +03001627-1e6cfd4bfc6270f822b5697e1c26fdf8.npy +04379243-59f4f7f1f7cfd0f3831ae64559c8e0b3.npy +04256520-9faefdf6814aaa975510d59f3ab1ed64.npy +04379243-11a559d19457ea3950cf3715818ccfe8.npy +04530566-183054ec6b2665a38b2b48d71cfe16ab.npy +03636649-40c778a9ff366c2bf36ea1eb6542fe7e.npy +02933112-b34ed11766d80175f40dbe27bdacff57.npy +03001627-f55a514cc8f2d255f51f77a6d7299806.npy +04256520-85644a68a1d5f4cbab610b0c94236463.npy +03337140-3c68117a5d4e9d5814d271edcaaee8b3.npy +03636649-4f1199474ab8c9b240cd51e913c7ba8a.npy +02924116-8beee0018157032415b08060dfa6a939.npy +02828884-86059f6fa56a8c5e44175b4dddf5be08.npy +02958343-2c8e9ae34ce33a40ab2c2809513f396e.npy +03001627-2c149e5ab744616f60ac8f16dfbc3b59.npy +03001627-e76457b55a3c041cfe49db72b6ffb2c9.npy +03001627-953a46766108d4e01f60a203be892cf2.npy +04090263-4539958ad62e662ed197ecac88773a00.npy +04401088-fa98d507d82d325c80202e5aaf48e957.npy +02801938-2bcc1b8bf5ac9ddc97e30bfe57d923fb.npy +04379243-84a354fd068a410d40719bb3f7e29ad5.npy +03991062-a09c1936162854e6f66cfd1e680c17b6.npy +04330267-acef3518b152a08e5645f04397aca2cd.npy +04379243-e56196f67d724cb892f4c88fd91c6b1b.npy +02691156-f533dc37778c6f004c949161e83c47b5.npy +03001627-691b10e17ba828e2b161f36d4e309050.npy +03991062-bde637cdefab785d51fe629e42afb50.npy +04401088-54de8ee661787c1d16d46ee44c40524.npy +03001627-8d14cc01f39f2679a857215a199c2ecb.npy +03001627-8e9247a97fea8e0caab901f164e48538.npy +02876657-e7714b3280fa7f925b2cc658332a8e03.npy +04379243-5c0810caed3ca0f83bec56bff764ba78.npy +03001627-6a6f0168ce551ebf40d341bbe0ce6dc3.npy +03593526-4fbe0133d0df10ef5636a727f8e7b7a.npy +03211117-30fc571d408b84cd6315023d0bef39b6.npy +04379243-55104b3d3c3f853992bd9b46d18a6c1b.npy +04379243-d03256544371f1eafa6e1fd63f4a1c35.npy +02691156-c049dcd36058a87e75b7e61db54ffec7.npy +03001627-389db7fba32b71182165c54dcecaacb4.npy +04379243-d8be4b45afb21cf1616fb9ab42452112.npy +03001627-ce23daa630833de7d9fad8aba2c312b7.npy +02828884-c005e1da092925e5aa3e4791e7582e61.npy +02958343-1da433472693082a3b03cab05e253d9.npy +03624134-f4dc11f89dd2d21eccd82bb51193a7f.npy +02924116-c5d30dc6bcabbb56ceeb72b524f3e0ca.npy +02958343-709d6b2cf528e10296d1882ee61d6c58.npy +04530566-a8f5ce05ab3aac91cbd32f07d6724eb4.npy +03211117-be2f04d1204c86d4db70fa8937c64733.npy +04090263-e57dab2d63693b0280c2e60c312b0f09.npy +04379243-19354bd08463173480f6183c41836dab.npy +04379243-2e13d82c2dd5d0714251f7ff551cfb5e.npy +03001627-5c027016e14cac15ffff2fb60b0d6e6.npy +02924116-92d0fa7147696cf5ba531e418cb6cd7d.npy +03691459-9a9e5e5e3e034e74fedde756c9eb0eaf.npy +04379243-426fbc6c365147fb6430c2c15987e4cd.npy +02933112-a82276d1ca28e11a4d87481e09b681b3.npy +03211117-80976fe087ec183f3de42699b619b796.npy +04379243-da8ec638b64227066d767b6d0313d349.npy +02992529-58c6118bd15ca3b48dd025faf4cea27d.npy +02958343-a2b3346bf52d4d5acee5b7ceecf56d71.npy +02924116-54ca4c3ae9913db82e255cf9f3f0b410.npy +02818832-560854f624e60b6cadab4c26397edfab.npy +04379243-e9383126d043156fc1302d82d108316.npy +03593526-4784aeb9d867aa83f685327911e7e258.npy +03467517-e5c64af35ff60ce069da8e7f9a803d12.npy +03636649-600b2f00113ad714e2367b9e27f16a71.npy +03636649-9e7ae4e322a056b954cd2a0ea6cb618b.npy +02880940-a1393437aac09108d627bfab5d10d45d.npy +03211117-cd9d0c82b16aed01e4db95aedeacfd37.npy +02691156-74ebf601d9c872a7828204947d78b9af.npy +04090263-a7072394bb9d23f54b49cd65dfcc3a9a.npy +02992529-7114283643761bb4a5545c1d5c84020a.npy +03001627-89a13017c0d517319fb4103277a6b93.npy +03691459-b04281aa2c134623cb3c1170309e6b12.npy +04554684-1b77c0248add1d5540b559ef47048b86.npy +04379243-ed73c41dcfe9170119cc3eaf35cd388f.npy +03636649-17349d6d35aac0685ed28d6c8a1bdfe5.npy +04256520-8b8152865839a79719fb4103277a6b93.npy +02691156-92cf58c641a4e5af56a793e48de27b07.npy +03467517-821316d050fb993b1dcb4e3497cb68d4.npy +03691459-8877b9b8e68fcda696d7d56afa10bb68.npy +04256520-a5bec86d283a19aef296d2773652c8e4.npy +02691156-ec9bfc810a015c3a446cb1ee5d43f75f.npy +03001627-6abacfbb354818b1adda578d985c7034.npy +02933112-61f79a63ee5315693fb45d07cfab7906.npy +02946921-fe6be0860c63aa1d8b2bf9f4ef8234.npy +03001627-7af9eb2ebacde5422a373b90044f1dbe.npy +04090263-b7e25fa0ff4920f28f5b599a9e7928c1.npy +04379243-9c4dfafdbd7f9b76c955e5ed03ef3a2f.npy +02808440-1b6bbfbba694e33476c18e71fd49c4dc.npy +02933112-225905a8841620d7f6fe1e625c287cfa.npy +03710193-e939b756e10ceb73f83d66144c2cbfe6.npy +04379243-c2fe8c88c2b42564415434d4384bb66e.npy +04530566-cfd92436ff0d0779b011f864ecc25526.npy +03001627-c8daa8e9496580667b9c6deef486a7d8.npy +04530566-eb214ca65059e8d8fb8de648691848ea.npy +03001627-7667d0da445e324bba600d75deaf8d3a.npy +04379243-b789ef3e2e28aa0c3b08200028f31a6a.npy +02691156-32da9294ff0c3d8c7a40e1005054fac1.npy +02808440-aa1200913fdb9f1679d57ee14f8ee702.npy +02958343-dd1bc8c4063a6521456a647a9e7d914e.npy +03337140-86fbcd62054c7dbf4c3aee8e9d3a6ffa.npy +03991062-fa8538255c27636753c42d8148a60bba.npy +03636649-aa0c8d5c38e8c87f805e3a6c310c990.npy +02828884-b3974f214dd4af93601104cd2d998272.npy +03624134-7422adf7859315961000fcf84b12c2d3.npy +02691156-a12179d6f8b753a934a446df7eff04e9.npy +03001627-4f188d1f92b859fc283b00891f680579.npy +04379243-40eb3b0b1b43f8cdd0a96520c31993ad.npy +04379243-a1efc57eedf9a2e93c8311d2f6bcff87.npy +04004475-5971d36336f3cea81baa19f2d6f07ecb.npy +02747177-fbf7021503a2a11fce41b639931f9ca1.npy +04379243-6ef4f1f0b3f8aad48cbb8bac2032149c.npy +04256520-40da067ec8d56e2242a61f5042a573f9.npy +04530566-ad0879d8dc9312b5c6cb0dfa2f14f9d4.npy +04530566-772835e02fec3a93629f9e3e495fed76.npy +04379243-d9daa0e33f695897136d9cfd13835101.npy +04379243-adc763e089e2535fdd155b45c76af694.npy +03001627-f2129c67cb55c6868779f85a8bc31fb.npy +03001627-779e4f9f044c71612f95e2a1e9997b85.npy +03001627-1762c260d358a1751b17743c18fb63dc.npy +03636649-f18a519effa019d819cb07ecb5b4102.npy +03001627-c7f0d32287191563bf22a5ca4fa4678e.npy +02958343-c6441f127d51e478f0fb72d24c42a39.npy +03001627-d0d18af5959e613ed3040d716596ad68.npy +02828884-5dda4ef4ab9add9411ee8243f54292d6.npy +02880940-a08af31cb43f1f662d88c45db31bc366.npy +04530566-118d43609d6de540fdd92f489e57a4cc.npy +02958343-bb39689b3e6568e85ea174ca141ad66c.npy +03325088-8b5fb07c0ca26bf4b362845c6edb57fc.npy +02924116-2c922ea4c2fdd84b270b857a2cb41e7c.npy +03001627-46c6dec63dd7c45854ca97f654da3901.npy +04379243-8f8f98df7a9caa18febad4f49b26ec52.npy +04379243-8f02a9ff58479e59ac51268fdb437a9e.npy +02958343-148ba646cf954b9249352dd33f95cb9e.npy +04379243-73e9e162c2d4f90a6c4acae4ea0d5870.npy +02691156-604392af2cbb7d1fe30ec10233e7931a.npy +02992529-496270f12655bb84e38ab39b0490e043.npy +02933112-63f3ea0c41eedd19f51f77a6d7299806.npy +02801938-9969392f6425a85750da8b99982a3057.npy +04090263-7823da328516db23394e22ae6de2db18.npy +04379243-383fed2f8f81108c6fa63795f94c4d8c.npy +03001627-5c233981556ff20fcaf36640a0c92faf.npy +02933112-1f674f735abb7b1d75869f989849123f.npy +02958343-e9233510c6e0f2672a9eb0f146e94477.npy +04379243-8657197d00d103ad4ac2955bec7764a6.npy +04256520-fe29b89c392e1bb39a2d92ec05f8de08.npy +04530566-2bf9436a79954087bc585c195913193c.npy +03001627-dfc85456795d943bbadc820495ddb59.npy +04256520-ef05b57542cbf151e7e684d25d4dcaf0.npy +02924116-6d3f6953945f4f38193d7855ecfc1bd3.npy +02871439-d8b0928ddac7b02d664b3b9b23ddfcbc.npy +02828884-38e367e4421ec3cbba70cedf91706353.npy +04379243-45122ce45ad6bbc0668ae11a7db5e82a.npy +04379243-cd106955d3bdf8e751c4deb11af7079e.npy +03991062-cb2dfb2ab016e50a2c59a4d90e63212.npy +04379243-253b7cf1ca03674bf4b6538438a0b930.npy +04379243-a7e343ab31f1e113beedb4c8fd29e2d1.npy +04379243-6726c2d72f835554781ba0fdb47276df.npy +02691156-db758090dd739ee9ca68a659ecae961c.npy +04379243-74246960cafebda4ded4c23d05709216.npy +03001627-2842701d388dcd3d534fa06200d07790.npy +04090263-3728ea8fca746a8d52499cf3d29e4e95.npy +02828884-eb9938d81ec9005882db9fca4b68095.npy +03001627-7212bdfab35f72b23002761e7a3ba3bd.npy +03691459-fd11b075bb1df4b01f1c09aefb59ebea.npy +04530566-6ba7c592495e203f49006426f75e891e.npy +02691156-8a6ab7486ecbecdb203936772104a82d.npy +02691156-84b84d39581a6766925c10fa44a32fd7.npy +03001627-8f3c91049838cdf2b04cb542e2c50eb4.npy +02933112-74104e62e8fbcbeed0b36851d61b6fca.npy +04090263-e5beb08af46a6b8f6fa28a58edcb926.npy +02924116-efdec3c35b0e36128449e0b8dd14796b.npy +03211117-a52e505fb03e2d8568292529fb38e524.npy +02691156-8def338aaf898d6c26479a182158bae5.npy +02691156-9a84164528544d5690baeef8ba5b93e5.npy +02958343-c9d53c90471eeb06ed3696d854eee1ec.npy +03046257-4ea7645a8421c2cb9c2b8a7ac19b29f5.npy +04256520-dd4a6a955c925d7762fd9a1e220aec64.npy +03710193-2912f56d135e2f97b20cb946bceb58f.npy +04256520-bcd6db8d23cbb9a9cf19858fd1963d10.npy +04256520-c2d26d8c8d5917d443ba2b548bab2839.npy +03636649-1d198eb08540837be9bd6b804c8484dd.npy +03046257-b4ba086ae065fbe3664fd9ccc8bafb2.npy +03001627-76389d102e3fb729f51f77a6d7299806.npy +03691459-8a8f13245888b8a1411171a7db2d5342.npy +02933112-4aedc26af43f08d08f7d9678498f2295.npy +04379243-cdc9ea006d761feb8c56c26d10173bf7.npy +02801938-d224635923b9ec4637dc91749a7c4915.npy +04401088-62a6de09ff956e997b239f1b8ec0d46d.npy +04090263-36d4635979ae79256314c3b6a3a65519.npy +02958343-35d473527fa9bd8cbdb24a67dc08c308.npy +04401088-38881e9944ea86dca374e5b9b6427c16.npy +02958343-b10794a03c59e42d32a4e3dd3a89488f.npy +04401088-d4a038b20b1250d7241d076ab53023c1.npy +03001627-4a1510e398260ba36b31862e09495f2.npy +03001627-be4c88a130e622a21961e650f3cfa396.npy +02958343-dee6c7e696048330ccd4ba9035439a85.npy +03991062-63787d5ff22ef52a2eb33053525e23a0.npy +04225987-d4c492d7076b1e6160eeb9e113ae7397.npy +04401088-609321c1351a955c1e1f8455cdf1c0bb.npy +04256520-32859e7af79f494a14038d588fd1342f.npy +04225987-a1d36f02d20d18db6a2979228046d9f9.npy +02958343-432efbe7784cba3ba65b1575070b0b4a.npy +03325088-4ed3d9c8a8ff37ebb7a867e9b35a1295.npy +03636649-94fdbb748526dae4ea2d70ab68cd1d2.npy +04256520-8a484fb8faf9dea01495d00ce1193982.npy +03325088-c956fdc19b02782bb7a867e9b35a1295.npy +04256520-a66befdc2b049fa3eec26c23f5bc80b.npy +02933112-860929843ad9e7e16ff961d84ac7046a.npy +04379243-df2244d33847f7cc4802d94e40825ea.npy +03691459-23efeac8bd7132ffb06d0ef27244d1aa.npy +04401088-1b43d9193794748e31811399a4ff3aa0.npy +04256520-145bd097a4b1cb8a44db04bfb021976e.npy +02691156-7af2dfbf11201feac3ab86afd1c689.npy +02958343-4ef6af15bcc78650bedced414fad522f.npy +03691459-f1175bec19adeadde188dff443a0c2ac.npy +03001627-37044d4f5fbcbe9bae536f42ef59cec5.npy +03691459-e8ffa936875c7b3a7ffffd2e0fcbbf0a.npy +02880940-faa200741fa93abb47ec7417da5d353d.npy +03001627-fd1a87a399c1c82d492d9da2668ec34c.npy +04379243-3b64bf8731a6a2a63c5e1addd9922bf2.npy +03001627-bfa435c63b1e96d3492d9da2668ec34c.npy +02871439-ff62d6b0cde34b7f6f1e631ee7d027b9.npy +04256520-c839f879381df0f0f42a90fe4baf4591.npy +03948459-afa2048d3da423ed3f5d17ee01b81759.npy +03948459-445a386fa38254aa6aae23d08e2851e9.npy +04225987-ffea27596947c29cc983a1dbe02fac40.npy +02747177-1eb3abf47be2022381faebbdea6bd9be.npy +04530566-d3ba52601a902f407f436bc8bb8973a3.npy +02958343-4a1b48e1b53cb6547a3295b198e908bf.npy +04530566-33a9a04e7d8ab8ce861ba49603151327.npy +04379243-602526e4a9de3f2c822a33e080d0e71c.npy +02691156-f6f2905883c49d179e0d0faf84afc607.npy +03046257-395c82f7a56b5cb0ef6c510e24348d3b.npy +02958343-6976cc9f5982474e9aae70753d127b0b.npy +04379243-aa6b5cad531b9ef982db9fca4b68095.npy +04379243-40cb833fe986db191ce7600faa926b91.npy +03467517-a2a57079224183faffb3fd15b3de82ca.npy +04530566-e00d3546401b6759710b5d09f274df.npy +02876657-8be0066e544e11da664b3b9b23ddfcbc.npy +02808440-1866a0bcda2564053321831d2245cf06.npy +04401088-e1fb2b5e5a306e6621ecd2b49af349a.npy +03001627-3515073c473f4ec94b3c42e318f3affc.npy +03467517-3ebceeb3562ed5c751b42caefc789eac.npy +02691156-52cd5876945106d154eefcdc602d4520.npy +04460130-1683c5bc839969f438cd8eb23853c009.npy +03001627-e9e8f839c77a03498307335ef66226a6.npy +04379243-c91c78e14fccbab316a2b5862518c93.npy +04379243-b82c6769c98e877d24d29f1dedd03a57.npy +04530566-dae38d7110c4bf252f84cb7932f866fd.npy +02828884-1bb14f4633ad52e3ae944a46a2846086.npy +03211117-f35e818eba233a7734bb689093b9bebf.npy +04256520-d4dddfd40635a72f1cda25fa42fa5ece.npy +04379243-75f9ad7ded87bffe1bb088904f7cb154.npy +04379243-9482c5f0a38a73c0fa16d3c3138134ae.npy +04090263-4c9c33529e9a555458e51bbf75d8cac6.npy +03691459-88bddaa41de4fc386f936ccdbda50e38.npy +04379243-1810b6accc77d7893918f23e2305ede2.npy +03001627-804cc836409c921ea666d560e4dc80d2.npy +02691156-bfa52c24ed71614f48a7b7802dc31138.npy +04379243-67bee18dec77f305e4af5827e8177766.npy +03790512-89aa8433ae3b9a197395d58407f193ba.npy +04090263-1655608678a4f9ffbc7bb5239e53ea6f.npy +04099429-add291bbd2c208f249d91b0fd3240957.npy +03046257-7bb10722ce68c6d2afbeec40033bd27b.npy +02958343-d1bf2bf3302c0ec0e21186de41a0101.npy +04379243-3842243b1f246b3dc4e62ff7caeb0b29.npy +04379243-11cd9cbf28d3918f1b17743c18fb63dc.npy +02958343-1b1a7af332f8f154487edd538b3d83f6.npy +02808440-3290b970bbb388fa3c8d0fdfb1cc2535.npy +04379243-8768002c872788b8e513931a191fd77c.npy +04379243-90cd1d5e2f33888ebe9fa30bb5c5d8b5.npy +02933112-513cc5132f0543d0b47cc2471d9dd7e6.npy +02808440-52da987951645a4b3c8d0fdfb1cc2535.npy +03636649-6b9e4403230a162b54fb5025c749b481.npy +04530566-60cc5839008caf13cea6e9826e81ed40.npy +02828884-1541e36e8dc2d84caed2201239784a35.npy +03211117-742705ebaa879604f2e5d34c7b677bc4.npy +03928116-17c154783360a7126f2cdf5afa9a3cb0.npy +03790512-4878886fb154d54366c6576de41cd6b9.npy +04379243-32b63d54261678e266a713431ac35e37.npy +03636649-dda91a2215130be16035905876bb696.npy +04379243-c1a04d0c233263aaaa199671f55e5379.npy +02828884-9c9aed95c76b4ecd80360680c1602c7d.npy +04530566-a980a2cc1ece321968165c64a4129512.npy +02691156-1597cbeb8266af206aa3bf023a2b42a5.npy +02933112-20d00eeac9377d1212de5317fe5b354f.npy +02933112-9d7338e6d5da1acd353a90f87b8ecab5.npy +04256520-580e58ca5b0f8dcf490ad276cd2af3a4.npy +03790512-67bff6cc82b6565dfaa866ab8ff6f59.npy +02691156-4f5fc434ebc03254fc7b1255b2e02e3f.npy +02691156-2c932237239e4d22181acc12f598af7.npy +02958343-36d0591781587d9fb1bb46d2556ba67d.npy +04379243-31f1b54fb7c9e5a3cfb87ab5efe3dc31.npy +03513137-6429cf540f58c246226eabe1cca3e850.npy +03593526-e08d96216c6360155e7fae0bb48967f7.npy +02808440-19605cf5174935043321831d2245cf06.npy +04379243-2c5d6e88359ccffc3396b0dbcf4d4bc7.npy +03636649-5360bb53166e73958b424343280aeccb.npy +04401088-b8a2c7c7df404ab8e7ef9fff09638f8e.npy +02933112-4edcf59d45bfff5a5b903ba10d2ec446.npy +02933112-580a7733e55e08be3c8d0fdfb1cc2535.npy +02691156-f88be1c8e93fbfecba0d990ae229b477.npy +04379243-a8a68d6e43cc0e094fde46457697d80.npy +03001627-8a948db5f12d02af492d9da2668ec34c.npy +03636649-1f80e265e6a038ad9c5c74ff620f967b.npy +04256520-48b67f0f05994da092a31ec18c4e190a.npy +04401088-af3c1e4367942543264e721f309fb873.npy +04379243-2b1f1929a6a5a6517b431cae0dd70ed.npy +04379243-31451828a0b452174705d3a68027b503.npy +02818832-b4fe88b1c71ec07817c98cc13ef6018d.npy +03691459-92e409aa16d2d673b5203226c26c59ad.npy +02992529-9d021614c39c53dabee972a203aaf80.npy +02808440-68421e740dd77fa7c664c3d4e2d59341.npy +04225987-8b93703a2046ddf5519438329ccc67e5.npy +03636649-d8b33b356591441f23d2ff62625c9fe7.npy +04530566-340bed24d1dbd33ba9142e7277ee08f1.npy +04530566-176d386905bf227da56b564158d089de.npy +03642806-5085268208bb23ba7b037ded105df073.npy +02958343-c951be855f20a1bfb2a29f45da811562.npy +04554684-aba19f953a07b5d3f589dfa369e10caa.npy +02691156-34a89777594d3a61b2440702f5566974.npy +04256520-946ab73b9f05a85ad5b24cafb84903c7.npy +04379243-e2dac2205ed98fad5067eac75a07f7.npy +02958343-9e0eb55ae7af7f8a61fbb658aa965606.npy +02933112-cc843a4c31c60dec64cb4ed80bd76aed.npy +04379243-ea45801f26b84935d0ebb3b81115ac90.npy +04401088-4a60039ed657d838fe5c7c47101442e0.npy +03337140-4be2322747a8c2604c3aee8e9d3a6ffa.npy +03467517-a276d9eee2bb79f2691c0d594e383a87.npy +02924116-337bab6b54d858ad15a9da89784be865.npy +02933112-7261f3eee6d5cac0e7ae87d20a4fdaa5.npy +03001627-91283b7062407b7381806e3880250dff.npy +04379243-890940359fdfa036569c11df1aea8ca4.npy +03636649-37b0f61c553e0499be27e423fd45ffe7.npy +02691156-e52f08852429e6117dc01d89d8a05b74.npy +03636649-aa9e96ac6c121cc54cccbece4754c7cf.npy +04468005-8d56ae45f65330beff6d47091cf62142.npy +04468005-c8645284ecefc0caa5e12deb37e3ef08.npy +02933112-1411cbedcc428f73b76e29c9c43bc7aa.npy +04379243-6ed74f11887c521f25f6f84717a88f8f.npy +03001627-4360c9c8a22facffaac6edb721277502.npy +02992529-a8d72bc949bbf361d8dc338f42ea38e9.npy +03001627-21e5fb7e2de735f490ad276cd2af3a4.npy +02992529-52d1db0a460723949582767760266e88.npy +02828884-230a85ab57a15b90e074517a246f1e65.npy +03991062-3862f8610e0329e2d4e6b2984840098.npy +03001627-6a5be179ac61ab24b07017f7091028ed.npy +03710193-3ea1339c113555f231c93b4eed4b11.npy +03001627-1bb81d54471d7c1df51f77a6d7299806.npy +03001627-c1b8c2f0c4f3cc43aff7c08b060f5ed6.npy +03467517-8ad0bde65846fd724133bbb00b8e2c6e.npy +02958343-a57e65f0c8f21ebc31780fdd33037c9d.npy +04256520-f611f7d72fccaa4c8bfdb54347dbe48d.npy +02828884-97d009dc14e25080d83393768c99f441.npy +04379243-401cd99ace3b92fadf6cfab91d65bb91.npy +02691156-b42620c214ca7cfc44deee06752bbfaa.npy +04225987-8ae2871e13786052f42b80606c2f3752.npy +02747177-ec95231a746d67a0775917454d940127.npy +04090263-d7d7d990d385ee8a67eb21515c2e5ee3.npy +02924116-f59d8d1976ec3256f07d0074fbd4a555.npy +04256520-8331de0bbd3b0e19db8fa1712f9ee93.npy +02876657-a86d587f38569fdf394a7890920ef7fd.npy +04256520-3600642b1b3a91422d83e0e365c4ccb4.npy +02691156-560b4af718f67902ac4f72bf08dc79a6.npy +02828884-6a9fb118c1501215f6459198cd03dd78.npy +02958343-dd240a8334032434bda733a39f84326d.npy +02691156-77c52530ef9983c94c3a35cee92bb95b.npy +04401088-43d96f5a6a619c06bc663b874223ed74.npy +04090263-64abde6390fa65fe26ffa6f51f050119.npy +03046257-6e5262c1b52858c5191c3762b497eca9.npy +04379243-6f53e944fcac6e49795407f097f1ca4.npy +04090263-2e9dad6c61b3269b1ea15a3c13db250a.npy +02992529-3aa2fd5054465056e25336bb76be9963.npy +03001627-27559a7e2b0b839d75bd952b0c911144.npy +03636649-252152593d97aabfd5f1d0bcb81c89ec.npy +02871439-d3497a61bdbac9bce407066405497871.npy +03691459-5e9cb0d76e74b0a9339c90d74e7a6543.npy +03790512-8da04b6c03068e6ae21ad659cc6e09ee.npy +04379243-9e5c21e11110fc9ec60dad40a0c0e85b.npy +02818832-a3baf2c091f1d89276a8f34f63bf4ef6.npy +03211117-eedbd3126dad6abe5de04aad18bd94c3.npy +02933112-a7e9a54cfae053aa20768660cf080d12.npy +03001627-46cb1e740cf6e9ec7ea88ba060407992.npy +04401088-a4c32dbcb71076d5825732a29ddd146e.npy +03642806-c912c50b812268e8fc9e3f0d993c8121.npy +02924116-80babfe320be84aa5cc49a2de2817ad2.npy +04090263-3594567f8d54fc9475e036b82df78473.npy +04379243-992899a16779bdc99f8c3d2002c77ddb.npy +04256520-8190efdd2054a0d9f51945de050323d3.npy +04379243-2ab14a50afa530d5253e170a96a633c1.npy +03691459-716d1d38cc0bcdc8c9d5b08933b9e0c1.npy +04379243-63aa4cdf9276e6bc19cdd91652400369.npy +03001627-bafa7e4e50e0b2bec8687ff9b0b4e4ac.npy +03593526-63447253a06727004725f67267e31c89.npy +02691156-d9f90f110ce30fbbadecb6fc00604132.npy +03467517-6b1648834de5c0c910a26d9d3646f933.npy +04468005-1a83e2d92fddd64452470de2774d6099.npy +02828884-cca18c7f8636606f51f77a6d7299806.npy +04256520-63b0904e68e5d1c6f51f77a6d7299806.npy +04379243-4de9fa90bcbd6beec3bd24f986301745.npy +03710193-ab94303f7fad5b453b02598625ec1bf7.npy +02933112-33c47c4c9afeea5a4c62bee40dcdc539.npy +03593526-6bb307429e516e2f129f1cb6c6fa9dd5.npy +02828884-c3da9fd354b31502d6eefa796d2f261c.npy +02933112-59d2e972374292c19dadd90fffe49008.npy +03001627-ffd616229a97642c7ea8c9f2db0a45da.npy +04530566-dffd4f1a6a4d3647568f91064f82e7ec.npy +04090263-8f81c50e0b90f961b40a1b2ef5e0c995.npy +02828884-e3fddd1e0ce63b65ad5067eac75a07f7.npy +02933112-23108a41e40a49f6389b013bdebd5e94.npy +04256520-82dffa2751f8e77643c18769338212d9.npy +03691459-36526654949a904b2bf4f773fe0e622.npy +03636649-72d5a2931dc1c913edb30e9b97600303.npy +04379243-41b0491fdb14d41bd25ca1a27cf9bdec.npy +03001627-709a5038988a70f58e6803fc947043b9.npy +03636649-52e15c498d33748d53227dcd0d547ba6.npy +02691156-c798fdb5baef6b8be36e92960e9f090a.npy +02691156-881e02b2d5a2c306f7fe0727acb55c39.npy +03636649-5f22096b25995531fcb8d8c6d4df8143.npy +03211117-f3bfeab806cc976072052f2ed83934f0.npy +02933112-adece72df027acd6658fc1ad354006c7.npy +02691156-7e1646c0a04dc68f6ea66e6959004764.npy +02992529-78855e0d8d27f00b42e82e1724e35ca.npy +02691156-deb196087108dfbdbe4df22b15a36e0b.npy +04256520-413e31ca041f65ee5b40246fea20c2e7.npy +03001627-9aa80e9e5adc8084792de12ccdce67a.npy +02924116-280046943bd65148669bde2c0a4bfb2.npy +04256520-23c65f2ca9165072490ad276cd2af3a4.npy +04530566-767cd95abc076d3af9d742d7f0246fb0.npy +03636649-b5a223ea93f39c2c961b70a6f96df2a4.npy +04530566-873b7ab23a5c85e365a308491a8f2afe.npy +04256520-8a207daaf453777de79c8740b4fafe4.npy +04379243-98d93b260a69366c490ad276cd2af3a4.npy +04090263-b75dc97eb33f6f5f98469ce4eac5b4d0.npy +04379243-5370b493b077fdd39ccda3ab71692a66.npy +02828884-dacfcd3de6bb08e4d2b12aa6a0f050b3.npy +02828884-5ce636f716f8f11e601104cd2d998272.npy +03593526-60abc8a27bb77020535deb3b0c692a2a.npy +04379243-6e029f7d5901aa2e2e4e89f168578552.npy +03636649-2c806132ebd0fa0eccc87962551b3d9d.npy +03211117-f3f21d06ff78f426aa444c25b73bbf6.npy +03001627-30488c6d05b4848388df69d6c56c6047.npy +04379243-db665d85f1d9b1ea5c6a44a505804654.npy +04256520-53c81bd4b93b14491e6d59363e6e833.npy +03085013-57a57e95d06b60458ee125fbff9e483f.npy +02958343-dc2c49d8617d400daa44bfa127abe4bb.npy +04401088-99fcfdd6edb3898a1117cb504804bf09.npy +03001627-233cf8ec4019005ceaf288f952624966.npy +02828884-978e21e3ac24a83c17b431cae0dd70ed.npy +03001627-212ad23c8afe1f9a9d297e74104d3ac3.npy +04379243-1fdc88f78be6ba4e14b86d5282eb8301.npy +04090263-d79182f4d76d63e9f13eed41b64dddca.npy +04379243-38ea17d177c4e872fd07832c54eb7e78.npy +02933112-20d92bdc128be29c59350d819542ec7.npy +02958343-d84c7484b751357faa70852df8af7bdb.npy +03001627-c9cc8df04240b27890907a4c1a185a7.npy +02871439-9bebf2913d515b5c66bc0e25cf103e1a.npy +03636649-9841e6ef0d244f3d42b9650f19dd425.npy +03624134-61c24b66ee29c936813a3b78020f767c.npy +04379243-b24092dde9ca927758aaf363794b1631.npy +04468005-b21af8271ab47f79c82ee199db6586b1.npy +02876657-bd50af3416f45348679a03fdc41e0266.npy +04256520-20ff83acfd590101be65001d50394fd9.npy +02691156-ce5310bbab4bc178d7a85b8b6dea0a54.npy +03001627-7a5e63ee142a424c5f6d0af6de791c3.npy +04379243-c679e4eab49f91fcb4392c1299b1bbaf.npy +02958343-32f458e413dfce699cf7b84b43bdd8f.npy +02958343-eb144af0fef08314f00cd8c386c592fe.npy +03948459-5f540dfb9dd0f21c9f433921788191f3.npy +03636649-1ce6fb24e634d5962a510b8f97c658e.npy +02828884-779907753183ea36601bea3dca268229.npy +02958343-90a59a473e9d110ae13bf7a39e9b5432.npy +02691156-d583d6f23c590f3ec672ad25c77a396.npy +02801938-eb0ad0de58fbfd32ca972daa503b3095.npy +02924116-adfac6d3b3f4f41c91a491e8257bd6fe.npy +03001627-553c6c2a186db82597976c675750537.npy +02747177-df3772b1bac3003c464e1d2ff524a75b.npy +04256520-61f828a545649e98f1d7342136779c0.npy +04379243-63df9bf9884c5b485e7087f2d9a278a9.npy +02691156-cf13bbe558f37bab4c3a35cee92bb95b.npy +02958343-932363431a35b189898b91227342b00c.npy +04256520-2fa5cce72c52f5ea95696f73b672b1e8.npy +04379243-32160b2dd0d1c8ab507243968c1db8f3.npy +03467517-97d91c9c16a2c6b5df7372ed5754c18c.npy +04379243-19b849328f1a8e522ee60509601408f5.npy +04090263-56026588e19ac1ce5109391625c31397.npy +04530566-9951a6732eb8438a79662f01dd94fba1.npy +04256520-3b7c1e67ee312cfe1bb088904f7cb154.npy +02808440-8ba04a13e0b5a33f774f018e2c69edb0.npy +04379243-68247c737f565de8615b3e12f53b391d.npy +03211117-3b188ac95d09cc149d74e2a2b8c0c58b.npy +03691459-323f51a8d5029453d603e2778861154f.npy +02946921-b36902ae19ac77f2a89caedb1243a99.npy +04468005-5588d3f63481259673ad6d3c817cbe81.npy +04379243-53433c9845f6b53955034479f8a160c7.npy +04554684-91e432daef378b24553e9c84d5d40de4.npy +03636649-c83f19fefc2c06593e22d791db24e31c.npy +04460130-b8a35075f420cc7066ea44c6d828197f.npy +03928116-9578f81207bacd5ddd7dc0810367760d.npy +02924116-29e7da770fc347b87ea4a7d096d4ae73.npy +02691156-5f9b4ffc555c9915a3451bc89763f63c.npy +04468005-bea62459ad724a7a3b371d842587b0d2.npy +02808440-fefaeb0bbd82f411412deb0d2b0f3dcd.npy +03046257-caab4218b7855fc5de9107ce13dea90f.npy +02828884-de305de253b7040aa4e9452025f4f1c1.npy +04401088-2009fed0ea8d1fc3e2dbe704eec7e8d9.npy +02958343-368583768dbe789980360680c1602c7d.npy +03046257-e3a00627dcef6b854b3c42e318f3affc.npy +04379243-ce1c3321de30433b16ec4c6284dcbcbe.npy +04401088-44d7b5d87c26896944608b3255ca1886.npy +04256520-9f4447e8dd345d33d68f196c7607adb9.npy +03001627-ue639c33f-d415-458c-8ff8-2ef68135af15.npy +04090263-891731397db0b6d36669f41869e0668.npy +02958343-2dbbd2bec94e4a7440eaf79934ff53b6.npy +04379243-9d5941cd2ae236db2a63bbf40292a37e.npy +04379243-10b246b375c15ab59fa24672a35ae8bb.npy +04379243-6e6f8f0ea7008fee620851befcf2047a.npy +04090263-2c10978bbf84a263b2b9ca36f6b76586.npy +03001627-8e87911087743bdb2314deb821327685.npy +02958343-3ab98667cabf774e3343f5fadc4a2136.npy +02691156-a1bb5d1a075bf7fc37d1c8fcb5a639e2.npy +04379243-15ba6dd7a9ad8b12efe5f291bc2f5fd0.npy +03001627-eb1d92be1e6bd84c4d9a43d557cf49de.npy +03513137-9cbcaecc65c3a511eeb5508ef773ccb1.npy +03593526-cc432b9eeeb02485a6a06826583046ba.npy +03001627-d8892d8a902616b1669e5c8c05e138e9.npy +02958343-53328de5c7e18b752350d856e276adb8.npy +02992529-e870d160aab8a55f1a696e9ae9fac3ba.npy +04379243-fe3351c94fbab8ce3002761e7a3ba3bd.npy +04401088-e96198cfb23a8b9d1d7ccb77d69f693e.npy +03001627-93e183f827d9361cd7c558b0724ffc9e.npy +03001627-374e87fdee7711491e046801e2748f1a.npy +03790512-fede9c1de88d225c7395d58407f193ba.npy +03691459-f2bec55383f72f04f6eb098afb876d6d.npy +02828884-74d4dfa4709ef0b056f6fc4b4ce1db04.npy +03797390-a637500654ca8d16c97cfc3e8a6b1d16.npy +03001627-96929c12a4a6b15a492d9da2668ec34c.npy +04401088-40dbb04ab8f780d6cc571cd3cf8f17a1.npy +04256520-75fa63a7576e2f509ae676623bdd3284.npy +03046257-64a32db4416941acaa2b654345545ea.npy +02691156-b501466a5a77f1173d2cc3e9d55f7579.npy +04090263-e5221bee9996da87d6964d5ad6a822d.npy +02818832-19ecbf9af52ad3fdc3bd24f986301745.npy +04379243-3b0c62bde7b24de85ce578b5b4bfae3c.npy +02691156-b3bfc198214215397b5fa2b5a4fdb00c.npy +03593526-146f6702601f9c5d8bb41b82b15c6ac.npy +03001627-637b36b2e5db7f513f7e27638e63d848.npy +04090263-698623ed6f1fb3076b2c8bb96250e4a0.npy +04090263-96013016f3e33bf3e1f2a1daf140ac9f.npy +03001627-f8bf45e20bec7cbc9cf3f05539f5c4e3.npy +02871439-8f94fb5a0fd17a0b68d1b9a1d97e2846.npy +04256520-2e474051a376ecace543d6ca26cbd98.npy +03001627-e431c68fbfdf826d561dbc0c83a98a32.npy +03001627-2ede0b0117e75a4315d50c1c4b796b2b.npy +02924116-df6917b20b0e16f8fd12abdf466ae8f.npy +04468005-3528e0d7239a47e41f3b9c5c62b1e7.npy +03001627-37cea3ba8e5a146da6fee8e2140acec9.npy +02958343-1ae530f49a914595b491214a0cc2380.npy +03001627-4460e0885d82b7b5d9987a7cd00eb98d.npy +03001627-59fd3d1409c0ee2e47bc3701b998a7d5.npy +04090263-e6887514f6d28e446314c3b6a3a65519.npy +04379243-cf5e67d5e6d7cf03f26f8ea67fbd8269.npy +02880940-a593e8863200fdb0664b3b9b23ddfcbc.npy +03691459-776b1ceb53c8ca881ef58b31c4ba0d15.npy +04530566-23c31b1c25689d2a7ba04de7d6d93ce8.npy +03790512-41cc9674e700c3fdb37378f3c85478b4.npy +04256520-a47681de164dccc6ad04591c9486ec0.npy +03636649-65c87436f6d6c695cf004563556ddb36.npy +03636649-9c5a4f568399539b47afb7a57d27bf15.npy +03001627-2df489b6a14404b3febad4f49b26ec52.npy +02808440-b3e22df8581158c66f893b5bc716a3fa.npy +02691156-1c26ecb4cd01759dc1006ed55bc1a3fc.npy +03337140-1880ed173d662f92c78621ab7e0ef193.npy +02808440-326e05c24641bf43b362845c6edb57fc.npy +03691459-f9250e29e640eff9a5f99ba0b2469cd9.npy +02958343-cc0c058e2eca523051fb05589f6b0d0e.npy +03991062-5cc4660eebade12d25ebd1cd0b422e32.npy +02954340-f40b47fcbf83b962f0d11ae402ef940e.npy +02828884-205b404cdee5d81cc624b11e153a6d87.npy +02880940-d78860e8318fb75a12a72bbc636a1f9d.npy +04379243-49bf25ff4401946524c10ba1eb690638.npy +04256520-3f79bfdf49c2b654c397356311cbeea4.npy +04379243-50d253ed67d73392140251e5a7586890.npy +03761084-391c1645b46367067621f3e966f56f52.npy +04379243-3a1f1de9d4693576938da3ea2c9e0e4f.npy +03636649-37be7d2937f7fd88fcb8d8c6d4df8143.npy +03593526-e8a0fca9bfb4422cff3ef8f363b2cc43.npy +04256520-75d76c87ee1066ae7ca0c2077c3e38e0.npy +03991062-8281f586fc85d6a377b9297f3055210.npy +02843684-1025dd84537d737febed407fccfaf6d8.npy +04379243-3564c6480a95a60323fe3501bb9e7193.npy +02958343-555303045808ca7530e7b962d97a840e.npy +04379243-6086c6195df8e051cce17d79b4472d62.npy +03636649-63538ead3a81058f1c1ef519b9196b63.npy +02828884-94420ab399ce8a1561e51a63d5bc6e46.npy +03636649-370623095c9773e42ce7d46577f8a9bd.npy +03636649-3e2d51c40b37c9c086052e834fbd2c4a.npy +04379243-72659c0df8a3d5f77ee217c21e683487.npy +04379243-603e2237e14611f9d4091fbf7990ddf0.npy +02992529-e0b1cb72aba261731fa8e666182e8619.npy +04379243-505dca88c2a9f7bba75d03186a0409e2.npy +03928116-8cb0a98e336a767421eda8d3e50ed928.npy +03691459-1eac013c89689e58d421ffb972735edc.npy +04225987-90210ee9fd29275dcadc0bfc31415370.npy +03636649-fa3b05deceeddc26fcb8d8c6d4df8143.npy +04379243-7ad02b2b54c9456335ce7cf30c872281.npy +02958343-10555502fa7b3027283ffcfc40c29975.npy +04379243-679f9dd2f3d8c52e2de61958ac6aebbc.npy +02691156-dd9c0622e873de43c752b66cc923fdb.npy +04379243-1f34ff8c2ecab3b0a4ee05a5737b7178.npy +04379243-c26913f8e139a80baa2b654345545ea.npy +02808440-2ad3ff96fe7f5d46a9420f0961aa2e8f.npy +02933112-aae9df5536cce166d5532c7891a349ad.npy +04379243-b6d644abd3a2a54c904f770b8a17d30a.npy +03691459-b8a5307c51164dac78128d32fc0f2897.npy +02691156-5c9e30bf0691c04d4c3a35cee92bb95b.npy +03593526-777bbb60f4596a5155f46d55537192b6.npy +03211117-e9466e872848075d3aeab48ed64c0fa4.npy +02691156-bbc645e0c0449532b3c7301213dfb7.npy +03001627-bf9f2ecb581640bdf91663a74ccd2338.npy +02958343-1198255e3d20d2f323f3ca54768fe2ee.npy +03001627-892d8090f05c136dd93768e7b9b1eabf.npy +04256520-f990194a8401d8de68c2f5eb1dd4dfaa.npy +03467517-d790ac3aecbdfdfdd4f4a255f121abfb.npy +02691156-25668f59015af0de56a7f2952cdf4b81.npy +02876657-a1c63c463ad7fc1fb549927fbd0d12d.npy +04256520-c3e86ca4f6ca077459d0a47cd36512.npy +02933112-504949a3b05dd13e3f7a74e12a274ef.npy +04379243-bba7bc453203fbc6e39344961f657bcc.npy +03001627-210115ebbbd9eefe5fdc736bcab9da58.npy +04256520-6f202d8517db172a5b2e09b1c446ae22.npy +04401088-9cedde0b189fc03824ec4b72ec33390e.npy +02958343-82c6851526bf7350b5554d042286b030.npy +04256520-13f398918a8ae11b17743c18fb63dc.npy +02933112-467b66a6ed7b3cd24da5feafe6f1c8fc.npy +04379243-e5437217b4f28c976c45c685905d0ecb.npy +02828884-75ba60267a6c36af4b0780126e986ee.npy +02958343-3d681ed2a7eef0df28f46021c78a3723.npy +04090263-6c95a697b85c6a52683e3750b53385d5.npy +04256520-ecb362a469c76e76febad4f49b26ec52.npy +03337140-976af9491aa692b94c3aee8e9d3a6ffa.npy +03001627-17dee0cfe9a370b134bce1184e175df4.npy +03636649-caeabb766b3b9c67d3c1dc91e223304c.npy +03211117-2190a888d3f7ba6bd3ffd38a8449bde8.npy +02828884-8256252192c60158c5449cfd4c0f0a4a.npy +02691156-5e7952b2d1a495f24c3a35cee92bb95b.npy +04379243-57e3a5f82b410e24febad4f49b26ec52.npy +03691459-9cb881bfcd65686176d485609557b1d2.npy +03691459-e8885d12901ed5aaa7d0cc9b15400f65.npy +04379243-b893c20bfb5d718371a782a4379556c7.npy +04401088-e1b7a28e8f8ddf15a4ecfe858e518c15.npy +02691156-2d3ecfb6d7ef2c45e08b03c50fd87acb.npy +02958343-68e733f38f957332afe1d4530f4c6e24.npy +04379243-2ab09f4db5f5e842bf595b60a303303.npy +04379243-36f53cf8a68d1ea73ca57f5648ff1b0d.npy +03624134-27f3ffbdbddf545d179125d1d357cdf5.npy +02828884-2cdf972377f30d9485718c281d7fdf61.npy +02691156-62ea17b5f0d46e2288a89a28f04ce622.npy +04401088-efed528241cd773fa2c7c5886f4bbc93.npy +03624134-3464db7fada86430c0e19881d8a9def3.npy +03046257-f9bd4d79a34592ce6695909af0a27770.npy +04530566-b10850ed8a61d4dd148bc340784a8c1.npy +02691156-19b219dbd2e4467828d4f2ffc8f17f3a.npy +04379243-696beb1883be838cc955e5ed03ef3a2f.npy +03761084-406dad41dfaeb674477dbb9bdedfcc.npy +03046257-57723d2d30d532c7adc5f5aafedb1c38.npy +04401088-fef0bba982a4ad5296913ea8ca1ac015.npy +04090263-debc38fe094476bf2dbf1aa086ad30ea.npy +03001627-a3e4639ff201f69b22a3043dcd383f68.npy +04379243-3dd0f8b4dd8a688aba893aa9f42bc953.npy +04256520-2c16efe54c1368b297f437b37a859ff5.npy +03691459-2a7c52141a3a32dfdd14180aafd9db4.npy +04256520-accb504861a4091b894b04fea82e6039.npy +04530566-a3be3018a002bbecacd548a9de859b7d.npy +04379243-3e32e9de344b723435c5f7d532a05db4.npy +03593526-6dfb59f33c88a4e0263c42ff6d6b9672.npy +02808440-733dd5a046be8d4029a0731d6489a64f.npy +02691156-d1e78f6226a9ac76fb2fba771d8219ff.npy +03636649-be00be72836114159568832390d67ef.npy +04379243-91c380f2d26f1a9ff128012535a24244.npy +04379243-eef0387bc4e72a1efebad4f49b26ec52.npy +04379243-5a720d961df190d459a6208793b9dfca.npy +03642806-f53ea19f871a80d420685b5a7e34b501.npy +04379243-c5195b46ac75dc8c20c6f761e8cbbf.npy +04530566-aee93c0ff8dcf746ece2f98c4b805551.npy +04330267-7bddc990442a3c6ea8ab8175d04e5764.npy +04530566-e0fc9177fe0aab2fb50d0c6a0c254040.npy +02992529-428ac05b36bb576d2a9eb0f146e94477.npy +03797390-962883677a586bd84a60c1a189046dd1.npy +03691459-1a511622eba730c79ee3c69ee7ee1fad.npy +04379243-82e1c0b874b0a9e035cd53a06b1d2317.npy +03797390-91f90c3a50410c0dc27effd6fd6b7eb0.npy +04468005-4f7dcdaa6bb963354aa78dbead0d8a01.npy +04379243-b4855f52572ce2b0febad4f49b26ec52.npy +04256520-33ab106bfcc881b14b2bf798c0452b7e.npy +03001627-77727bbfb22c57de492d9da2668ec34c.npy +03991062-e828ac0a8a9a1e96ba14bfd91a75020.npy +02828884-b1ac6f2ba106e8ec2250bf58700b4d8f.npy +03636649-5d94d971dd819985713decb1a0563b12.npy +02958343-c43b1ebad0ba016a7fd25564c2e888e.npy +04379243-e22b23cbdaa1e259e8a94a8468340ce7.npy +02876657-13544f09512952bbc9273c10871e1c3d.npy +04401088-f2158f4f4141e07825a703f74bf22d93.npy +04379243-2fe8de498d0f00f51f77a6d7299806.npy +04379243-49c3ad60b7d5234dfbe06dd91adeaedb.npy +04090263-b754214217c4405dda6cae4e030ce341.npy +03046257-f453f21d54c766d94edcf3b74eb57b13.npy +04090263-b589b1af4eec862beae3ab415b6ca18.npy +04090263-cb9b99a239fa07bb139336f03eb955d2.npy +04379243-65acf2f512016cdf553c860eacad5e53.npy +04379243-ea6571f7ef98f562fca88347d0eb86ef.npy +03642806-6146d9fd9460370c578b3fc82443ab96.npy +03001627-a439465d2bd623a14cb9f394cda169eb.npy +02808440-7d41c1e628b1312977da90a8fc1a6429.npy +02992529-e9352850a60bbee4975308da62ab2e39.npy +04379243-d3b7021f03ecd58d2585ba435c7d1fcc.npy +02691156-46c52edc6107d1a3505ae8d422ba349d.npy +03636649-87107afb7ad115414b3c42e318f3affc.npy +02691156-e559a626d0ef8b4f982014dd9aabdeeb.npy +02747177-e05add2e5e4574997c6269fe8093902c.npy +04379243-7f9c12456dea1c2531c7871fa99a9d36.npy +04379243-2d5b8274376a7095955824885d6e7dc0.npy +04379243-e53f5f3d4b20df8176331cff7db8f268.npy +02933112-9c245f01f94ae038413b3ddc4f2d9a06.npy +02958343-c487e9850891e1ec2d15396b7bcc6366.npy +04530566-67da87349baf66e3c1ccec171a275967.npy +03797390-4d9764afa3fbeb1b6c69dceb67157a66.npy +03001627-d86158642391ea7a150a331b054ed006.npy +03337140-68446c00eeed26264c3aee8e9d3a6ffa.npy +03948459-b3a66094d5ee833bf4de29b99f103946.npy +02691156-94056866a14b015a50c626aa72455dae.npy +04256520-b48603e4595bb61ab6f5fb02f36f9480.npy +03636649-979867c99d8e0b7a4601feca428b2996.npy +04379243-102f0532f9f8bbcdcb503f63ed915ed2.npy +03001627-9cabf21d12d271c5d295b24579cf55b8.npy +04256520-f1c533e2cba193631b02cde7e81f0fc3.npy +02876657-f68e99b57596b33d197a35146ee825cd.npy +03928116-f1e27303883d1c444e09ebaf49b0cb2f.npy +04379243-1faef163785bbc427b11ae648ea92233.npy +02871439-9ca929d28c1838d5e41994ffd448fd07.npy +03001627-d11ee4294daf6ebe492d9da2668ec34c.npy +03337140-137369963be020cece5d6e9371bb5c33.npy +04256520-4521ce028e5009811866a0bc19f46a1d.npy +04530566-c2d6eb0899e5d10dff531859cd52e4b5.npy +03991062-2bc8254cb4d6ed7b5c27243205718de9.npy +02808440-72b2ecba8ab54af8b362845c6edb57fc.npy +02691156-5b5c4dc4bd29dc8166cf1b4a8fc3914e.npy +03325088-4baadfa07397fff83321831d2245cf06.npy +04468005-2d05eeac352398006bd10bf92325d933.npy +02828884-18926a71dd7f17eaac40ad047084c6e6.npy +02958343-c3d23ea4f3d1e18180360680c1602c7d.npy +02828884-ce2112fa16725a7aad5067eac75a07f7.npy +04530566-79284d5d39e4738394749f185cc702f2.npy +03593526-2d69fad249c53ca0c6e02b40b50fb3e7.npy +03636649-4003077668e23d6c9998b4eb812699dd.npy +04460130-6d839fc8ad123620f20d6153247513c5.npy +02880940-aeec00d8dd6e196451a2ad3de1977657.npy +02933112-11798e50090b6dcd0b36851d61b6fca.npy +02828884-94df387a0b97302ad201085e80edb26a.npy +02691156-c359e067e75cfa8693d4024985440d4c.npy +03467517-4ae5a491c3ffb473462c6cdd250c26bb.npy +04379243-7b356141695f75e271a782a4379556c7.npy +03046257-4f62af2d14df6cb6eddb8fb8ef75e718.npy +04379243-22e1bbacd4ae7812a23d33d54fbb4b2b.npy +04379243-801616c42a468c298fb2b3b07693a96e.npy +02828884-7a7c5ca50411d85f4fb4dee5181bee.npy +04379243-1be0ad8c6375f5d47edd45e036b3c8b1.npy +04379243-ae0ed75bbd4c5a74b7c9606efbb8bb3d.npy +02808440-8b1b57f4b4f2477b362845c6edb57fc.npy +02958343-ebbbc8673928ad37308fb27494afe372.npy +03337140-47278fe8f8be0e3c4c3aee8e9d3a6ffa.npy +04530566-a3905dbb972cbb3db57379b548da98a0.npy +03691459-75c408e3ce113c84d084cd4069686980.npy +04256520-8ea11732a1198be1dae12f3947d07dec.npy +02871439-ac9f6f5ed922f0a5ca3d3aba150597ee.npy +02958343-52f592a68c828a1e190cf42afcf85660.npy +04379243-15cb1696b45ef647dcad484e89744ca.npy +02942699-a230560372fd55a410ec06105f027b7d.npy +04256520-f2a96143ed0936265d2b890291504877.npy +02992529-8f049b65309d8390f5304dc8cfbb76e1.npy +03636649-f5a121812ce16ed2578f5640449b6f5.npy +03001627-c9fa3d209a43e7fd38b39a90ee80e328.npy +03001627-6dd44ada2f481c776dddf6f75fbd4a4c.npy +04379243-2e8a4184f4067657f2cf6a9bef44d625.npy +04379243-8bdb57e97f726a8133a39277b6bd460a.npy +02691156-e1e5cfcabcbe26a03087f84b199fd297.npy +02924116-571b77397f1b958fc98c13d6112727de.npy +02958343-3ea68e00dff2847f1f0fdc8ac183f8b.npy +04530566-ac479ce45b04972891bdbed880f31c72.npy +02924116-165b1865ba7eb0efffef2f04639c404e.npy +04256520-f444000ead89fbf2558ba0061239252f.npy +02958343-651497ec47e9d1182e877e82c90c24d.npy +03001627-568050037ad958625ea33df4b8846880.npy +02843684-ece71b326dcb50bdfcfdb70b6c560685.npy +04401088-fbe18b762a1328916b7f36a4c89ad37.npy +03467517-2f1ef453d18cc88d74f1a026675e6353.npy +03624134-ea2a14aa25e34566ed60d0c28bcebc7c.npy +02691156-4a6961377146f08cb45fd154bd3b6957.npy +02691156-875d75a0aef86850b6b87e72ead132ed.npy +03691459-70ee226bddd4005836f19668fecae7e8.npy +04090263-7b1b02b8f71226e4bb9224760a70fece.npy +04379243-8821c22c61ed87e3a585c7706fdbbe10.npy +03636649-908bfd876def9e43714531f0291497fd.npy +04379243-72458d4233742f29fa24672a35ae8bb.npy +02958343-6c5a34971e2bd518d571d7357468d0a2.npy +04090263-37aaff9b0f567ca378d7c0e1adfe122c.npy +02828884-eb245de64157afe8ad5067eac75a07f7.npy +04379243-364b9c00797efba693ab1bc955ac34ff.npy +02828884-1b8e304a9c23fd4563b2acb037dfbcde.npy +03636649-6a977967aedbb60048b9747b6b395fc5.npy +03593526-915ca876e784d965c5b724995774ac86.npy +02958343-3759a08d740859cdafe1d4530f4c6e24.npy +03636649-aa78d1c91a8949313c8d0fdfb1cc2535.npy +03001627-36ced137933c36a3ff085529822a7226.npy +04530566-e6a9f9135e36b6c17c0ab7347b9e831a.npy +03948459-418cb9c89655274822d79ac75435d5fd.npy +04379243-119a538325398df617b2b37d6988a89b.npy +03001627-7035d480f6bda22938b39a90ee80e328.npy +02808440-367f0d3a99b5f9f834f7f29b38d9290a.npy +02747177-8fff3a4ba8db098bd2b12aa6a0f050b3.npy +02958343-90573f5d0156d6e23ffe0e5069bf1eb5.npy +03001627-4c1777173111f2e380a88936375f2ef4.npy +02958343-f1c277f7fc421492fbe59dad8284dc0.npy +04379243-eff1bc2f644be748490ad276cd2af3a4.npy +02958343-6333b9c777384ad14362be10a3fc8255.npy +04379243-1be435a3027d58824461bb4901a4cb6a.npy +04379243-2d5f99d5c2f3463d477551ed4bff707c.npy +04379243-2dcbd662fa03dc88956c2c3ee7a48cc0.npy +02691156-16715d886ecf0a97ce2cec85ea6ae00d.npy +02924116-6d619fcbceaa0327104b57ee967e352c.npy +03001627-cbfa51dd6b795262774ba10f0bcc178a.npy +04468005-a2a67baf798eaa72dd8e272fd230200.npy +04530566-2005e1613f1a46b5c083d5272d526845.npy +04379243-686a09b1584249ecac3c355a33b4399.npy +03593526-5eab5b7ed4d29ce5664b3b9b23ddfcbc.npy +02828884-52d8b9703dfcf31f2056b4bd5d870b47.npy +03001627-3fc616c2b603b333f3369bb203286e75.npy +03938244-1332172ba896e1c2a40f4c396e0c7dce.npy +03691459-4e957072c3c876e02fc6b53066be64d1.npy +02818832-ade1791b73a3b528bf78ecfda71e346a.npy +03691459-5260d7e4d379219df2e5d34c7b677bc4.npy +02958343-4415ef6ca1d9a6a3ed734d5df4ac741.npy +02871439-693836c29e5fa6179a2988e955b5ae43.npy +04554684-aaf971855cff72731a1a2dbbd3d54d53.npy +03928116-bba9c90254fb970b8dfaa3491bc0f718.npy +04379243-c348d279fd22730a9741b7ee128375de.npy +02924116-a645fad8ed4a2ecec13ce7c1406181da.npy +02958343-1ec1c4aa9190e767da5421a736792418.npy +02691156-34ffc5e29472358cae81a3776126c079.npy +03001627-74346aabf555ee0295122b1ef21ee4c7.npy +02828884-9c8a96bb95a62a6ae6e54a934c4318f1.npy +03938244-3ee02ff403e6e5bc2c6c98851414a9d8.npy +02924116-7e5dbe69598c6439ab80ed476c7fb6b1.npy +04379243-635005efb9077ca282c22b790c082c19.npy +02691156-50755e616df58fe566cf1b4a8fc3914e.npy +04401088-bf0f0ba650108d03cf144715a1bb5595.npy +03691459-388ae2b6420bfae26cde9ab9486e09f0.npy +04401088-71121add7e94b024fb88c3d40924fb73.npy +03211117-aba93b2b9b45a30dab0b172d4dea80cd.npy +02933112-b0f329dc43af0fbd4da5feafe6f1c8fc.npy +04379243-b658e507c84d6202610c2a68437007d6.npy +02808440-e456b80ce2d41953ccd0340812259a39.npy +04379243-e935cf0b43767dc9c3bec646284d5a6a.npy +04379243-20cd5280f106b36fff90854b4e00880b.npy +02691156-1580c09f49bb438a7209009cfb89d4bd.npy +03046257-260be91d90d4aff1f51f77a6d7299806.npy +02691156-e161df613fc808b0d7ec54df5db5828c.npy +04090263-80915054aeb243259747e122424ea8b7.npy +04530566-263eeac4bcfca21285f7a3de54751f1b.npy +04530566-447a43ec44a3e672e7cbc4e41c1d1020.npy +02801938-dafcdefea7e1445edce1af5c27e3da18.npy +03636649-9c2699c78add2e5847ecd534f9237f9.npy +02691156-9b687f9cff46d43d89c2da356f872ebc.npy +03325088-34764b40046d5c9f72101dcac4ed75d3.npy +02828884-6f0723826537010c870f22c94729669b.npy +02876657-9dff3d09b297cdd930612f5c0ef21eb8.npy +02871439-824246a3f4b7075182750018fd60ef30.npy +03636649-670525c759c07ac71560641bf48464ff.npy +02691156-2d41a07991b546751702b97fc9845e5e.npy +04401088-61e83782d92bf80b7548281e465c9303.npy +03001627-bd98d493766949a8c05575120a46cd3b.npy +03001627-f9da1bdadc982c7f78ee935ba846606a.npy +04379243-a3a701905091355e96aaf875e27b02c9.npy +04379243-3e09b5c70cc4117d9969f8371ba19c2a.npy +03624134-4389fa45cc843df7e430a24be6d784db.npy +03001627-4a54684f8ab00cf5a4e0cb207f311458.npy +03001627-d80133e363b9d2c2b5d06744a21b81d8.npy +04530566-8bc922537410e1ce847c4e55bb965ab0.npy +04090263-5a148f5250c5d987918977c639d98325.npy +04256520-369dc8240dd358bbfebad4f49b26ec52.npy +02958343-28b5cb11ead4c878fd988235de2147e.npy +04379243-4020a2b829f148a18d8c7827464490b9.npy +04256520-ae7af4ea5c63938878585c45c8af09b2.npy +04256520-e8f21fec8246fd5a8bbe798b99a6a988.npy +03001627-2828b98d980480cec3bd24f986301745.npy +02958343-ae6827651ce624f6f5a0534aa77bf2.npy +02933112-475907f4b97bc1da25ae8e5e777da782.npy +03001627-2d808b6451253b7e7c7920f6a65a54d.npy +04379243-92e742c940c11e60812e3ecbeaae3980.npy +04090263-686be742e65eab7816cf8b1cd2155e02.npy +03636649-70b3279caee3ed985c6e7b50a2f671d3.npy +02691156-52ca6970fb09b561f9f7510373841dd9.npy +04256520-96aa85a45fed687dbbc7a6acbd8f058b.npy +04379243-d753e5da9b064152ef2438b4b778b7f8.npy +04379243-c1d808c75cc5e7ab4da5bb83ec125010.npy +04090263-92431d034edd34c760c81723f0d4ce20.npy +04379243-a98d6ce7eca8cf272d7d7823aa90da0f.npy +02992529-e33124aa016bd1f19c1db271ad9472a7.npy +02691156-d8a8e238987fed8dbc0909d98a1ff2b4.npy +02808440-589c1f69b5a29cb7b362845c6edb57fc.npy +02924116-ebf386fc1ba825d180288501d9901d7b.npy +02747177-2f06f66740e65248ba6cf6cbb9f4c2bb.npy +02958343-372b1a139379f5198e42313717d27982.npy +02828884-f56c78ba29d9f73e9bc72297235ac73c.npy +03325088-30597a40e0756ea650da8b99982a3057.npy +02958343-2d730665526ee755a134736201a79843.npy +04379243-4e5fc1f56057d5f439b1b7041443703a.npy +03636649-20c9d1713fbc0925c35131da26f8061a.npy +03593526-4bc38481b09e397689035c25f0dfeb63.npy +02808440-cd42ce92bf94eaf35e690296776c7bfe.npy +03790512-ba0f7f4b5756e8795ae200efe59d16d0.npy +04090263-c54be9902d947a1ef6fb0164eb28c4c2.npy +03636649-398c948f08b778a1fcb8d8c6d4df8143.npy +02828884-1bace34d2c1dc49b3b5ee89f1f802f5a.npy +02933112-267aa08f20a000a3b15194162f658e87.npy +03001627-e0a0d5c2ba6fdca215b55266697a17be.npy +02828884-8e260916773769032b7072d8dd8cf43d.npy +03467517-7175e8671bc22afea937a742b4b0dc33.npy +03948459-49429e1d1e90c1ca202be79d8b285c1e.npy +04256520-577625945f1b83d16296847c9d695b0b.npy +04379243-e2a940682bf386d166e77edacd2d5e3a.npy +03636649-c05273997fd65e7b88e7662971dc736f.npy +04379243-b515a107aa3a3fd0e3dff0d5ebb43915.npy +04379243-9e229ffbaf9b7395efb9eda839fc42fc.npy +02958343-7d343bbf3265164fb2d2900ee0ae7e0.npy +04379243-48c61eb9c9453db75828f54ccfceb8a8.npy +04090263-e63cd617410ceddfc9ae1c09f478779.npy +03325088-cc79822a10e3cc9eb362845c6edb57fc.npy +02691156-9a58779da170911a7a571401e6605fc2.npy +03636649-545ce32e4a72ac04352681850fbc4af9.npy +04256520-d66ab7a970a3344e34e89adf02e34b7a.npy +04379243-cbf56579ffce57d84cbbac005f3700ba.npy +02828884-8bf63e9b3df32ff1e1aaa7ea27fc24bf.npy +02808440-88ba375e0d96eea94989fccd91bef01.npy +04379243-b2582dd22be909767ff6ace05b36a5.npy +02828884-f95f1121136052bcd4d8765e3910f617.npy +03001627-2ed972dad69431ab89f8949830ad07fd.npy +04379243-9f78ea7856f21a4ac8e00bb0b2c9ef1f.npy +04379243-3c4e1361b066ea3b8ca998f0f87d0c84.npy +04090263-21b7114455da0bf033e73845251cbf4e.npy +03001627-a27a04ccbe8d5c90b91fe758ff985f40.npy +04256520-621dab02dc0ac842e7891ff53b0e70d.npy +03691459-d027e01fdb3830687ffb47acd56f396b.npy +02828884-607414f33022aff2d2b12aa6a0f050b3.npy +03046257-d220a3a4e31ea77a1550babf1ec984b8.npy +04379243-22daa2fdacd34e086c701087a194026.npy +03991062-dec779d32766f97adbb1480d02e6cccd.npy +04379243-3c34a433ab1dd3e2f657e3152307ea2a.npy +04090263-146529b22d3c510ddf14c6e3e40331e9.npy +03001627-2e8748c612c5d3519fb4103277a6b93.npy +04379243-4cab7b493f8f404694ed13cc64e8d835.npy +02691156-2c83e01a7a4423c74d4cb1c2a5e48b7a.npy +02958343-24c0c6d558d4d01d8772618b7452025.npy +02958343-f8857237df1717e3aa562f24645e326.npy +04468005-e7223dd1d94ebc5d52470de2774d6099.npy +02691156-69a46dafabb616191f9b3085a256a338.npy +03001627-2b9fa5950d81d925cf004563556ddb36.npy +03636649-9fbe081afc5868ca5c9ed170ce1aefed.npy +04256520-5b70eb12242d4a03fb6ca00006f2c76c.npy +02924116-60229aae7778899d248376edfe1878a.npy +04401088-7af2a3d126ac5e44fdda95e9849ffbd2.npy +03593526-1ae4ba2e963a82777cba7aa754e5342.npy +03761084-cfd21967d9621f664e09ebaf49b0cb2f.npy +04379243-19d5525d3d65063bb664d1885442ba70.npy +04379243-4309b8cf22f0382917271868b642acd3.npy +04379243-889f05b7771f6b9fe76bc197b3a3ffc0.npy +03001627-c69069021b390de513232b7b9d3f985.npy +04530566-3c835bfc9201041a34f2450730697f14.npy +02958343-6c6254a92c485787f1ca7626ddabf47.npy +04379243-c5a4cea5107d72f54b3c42e318f3affc.npy +02958343-3b3a3b0d9082236cba77eb053523da42.npy +04379243-a387e9c10bce09c85828f54ccfceb8a8.npy +04401088-612466085d24ce50b260ba4e94db1a27.npy +03211117-ed00d5a47a7ddbd5e464ff83d36486e8.npy +02958343-5b74aff38b82c58f453226473c9b5a05.npy +02876657-10f709cecfbb8d59c2536abb1e8e5eab.npy +04530566-3e874274afe2d37c70640aa5d7fd3004.npy +03001627-b5699ce2511433f3b28ede0f9f5a31e9.npy +03001627-7ed9395ec6fa732248db5ebe0dbfb1d5.npy +04256520-5eae999a81861da03bec56bff764ba78.npy +03636649-36d90198790ed82386052e834fbd2c4a.npy +02691156-617993bd3425d570ca2bd098b9203af.npy +02691156-76e66ae36d942c494c3a35cee92bb95b.npy +02958343-88fc7d197310ea4b961b666ad9ed1438.npy +04379243-42fc350dd15b5ee07bcb070cc655f13a.npy +04468005-abf12741cb25bd593ae1361afc45ac52.npy +02924116-15e2d1fe9a4b28e68fb8c03013603b0c.npy +02933112-d4f4b5bf712a96b13679ccb6aaef8b00.npy +03642806-7d2ed394b410e9646f6e459e863eaab.npy +02933112-f0ebc33311b55d6b4e7d60def15dcb8b.npy +04256520-ad023095f1868d3019fb4103277a6b93.npy +02871439-8198c793defb5c1d55f9913e822d5318.npy +03691459-b53eaf891eccce82a4df8e9a50b4aeaf.npy +04379243-7f9d2da43d6aba67afb6676a5cd782b6.npy +02924116-d72902a7e8401366f31ad0ce8af976ac.npy +02828884-1ef8c3cabd16f7cbf155d75bbf62b80.npy +02958343-beec9297d087a1677e19c609c6e24294.npy +04379243-89251f322490e7047e38640a31d0bc3.npy +03001627-b625936e3db6af6318df1fa50d2b64c.npy +02958343-1e987cad6ca8a97a7a24dbc42a104ca8.npy +03948459-e3619c5b8d8ad37cf4de29b99f103946.npy +04379243-64c8873572f3eae175c80d0dd670fabd.npy +04379243-1c97870c90ff3a4f23fe3501bb9e7193.npy +02933112-721c788bb55b083ae8a9bc001231a118.npy +02876657-29cad22b0fc6c9985f16c469ffeb982e.npy +03928116-598de9e74adfaaae2db285a7fcff0623.npy +02691156-d199612c22fe9313f4fb6842b3610149.npy +03211117-76e8b00a0f6f78de1f82a1eb98f84dee.npy +04256520-89f4bb22cb53fecaa0fded058fdc8ec2.npy +03991062-3fd59dd13de9ccfd703ecb6aac9c5d3c.npy +03691459-60858213ecdb37dcb7a0c56c5d82c3cd.npy +02958343-e297de736f8f0b3f67738c2420579616.npy +03325088-74239af5ddd1f9676c18e71fd49c4dc.npy +03085013-4daa8d27a660895142ce30c291f8ca44.npy +03636649-370a49ad568a764febb6b411cf15c31.npy +04256520-330caf403f42c12ace8417aef1b7a422.npy +02880940-7ed1eb89d5463580a2c59a4d90e63212.npy +02691156-17c86b46990b54b65578b8865797aa0.npy +02691156-2aec6e6096e640add00d52e62bf14ee9.npy +04530566-74093f3d2583f3be7b0299baad14624c.npy +03001627-3f4f6f64f5ae57a14038d588fd1342f.npy +03001627-457aed734b0a8619ff6d40d828e0167c.npy +03636649-94ca5c31d2ba70f42cd2160e449d45ae.npy +02992529-427e06d425b901be5c0be177939e290.npy +03001627-594d5b7f3e705a1ab3234e0da44b11e4.npy +04379243-c3e43144fd61c56f19fb4103277a6b93.npy +03636649-edcadf508090e17bfcb8d8c6d4df8143.npy +03001627-9905ba0488b0471dbfb0f09ba9f2d99.npy +03001627-2b9ca6deb278a10cffc21cb5f21201cc.npy +03624134-262a62f3e36262e313195356ebccbadc.npy +03001627-17e916fc863540ee3def89b32cef8e45.npy +02958343-12498dd65e8d65ac3b6f5204eb590354.npy +04379243-190028e65867076ee12186cc8c5022c7.npy +03467517-61f90a151236d28640c20797381ee39f.npy +04256520-398bc907b92b0260285dd489701ccbff.npy +03001627-44854046021846f219fb4103277a6b93.npy +04379243-d36f8b6fbc03cb3630aec64313e58bdc.npy +03691459-29a7fe8fab62a9e134cf66ffc496802b.npy +02691156-e3bdca8304aa6593c503a3776fc280fe.npy +02691156-4843a702815e8ab442ffb0c016ee58f9.npy +02958343-e8a8d47957d15bbf8079d5a13e411210.npy +02958343-9757fd5be93ee0fc82b157e7120744ea.npy +02691156-fc9f6bc1ba1cb7c1c3fe7930fce05ded.npy +03636649-d5815f747626cadef912acc8c54e7fc1.npy +02691156-b644db95fe32d115d8d90babf3c5509a.npy +04530566-88b27dd110461b38b193f1c482b98a75.npy +02992529-f9ecc6749a251c0249852b2ef384d236.npy +03948459-1a640c8dffc5d01b8fd30d65663cfd42.npy +03001627-36c4421ff44218775510d59f3ab1ed64.npy +03211117-1405ccaff7fa9dbd51b711a0825fda5b.npy +03001627-27ea798c55699b6d2c528d33bca1ac2.npy +03001627-5a460cb21fb55f639f73340130af944.npy +03636649-eeefddb3f2ee93dd49b2e04785f8492.npy +03636649-f092117adb1e9254d1cbf3e52b9b6237.npy +03636649-8338a18d589c26d21c648623457982d0.npy +02691156-343a607d1604335fb4f192eea1889928.npy +03636649-a186c58be79925634cc30865d6337b9c.npy +04379243-b62908961c47a373b097f065a7be019c.npy +03001627-60cbc688b57f8b5446407779dbd69b2d.npy +03046257-22d22a2578f0a3574b3c42e318f3affc.npy +04379243-1674e0a5bde2dd67f12d7184a2ad3430.npy +02691156-19e531e6d0bd5ddd67c54439d6177032.npy +02747177-3ce42bc74819f5dd56f6fc4b4ce1db04.npy +03085013-4cade5a7ad1f473870d89967fcf73679.npy +03624134-75e32ddfd15d3ef1fd92188644609a39.npy +04530566-23be001cceb4c31af6f70779d83413f3.npy +04379243-506e4e67efe1794c1dacbc3d67b5a11a.npy +03691459-5b931476c24abb5535b5e203791a802f.npy +04090263-7f9e93c855aec4995e22590d7220b895.npy +04530566-72c942c6ed4dbf4e8e5cf2440102d1ce.npy +03001627-a873a489386dc825ed843e67f2e2e9d.npy +02933112-d08027b0f50619ef5c2f6ec7d4720d0b.npy +04401088-1101db09207b39c244f01fc4278d10c1.npy +04090263-e9ee67ab2cccdba5771dea817d9f8136.npy +04090263-e07fbeeec2a12fe313b315bf7aba3803.npy +03636649-36c6a6f0e206c79890fd203f931c9af5.npy +02933112-b6392ba0cc9448b353a5b360543fbe7.npy +04090263-911535f04299f4a53f732a8d4ec0bf11.npy +02958343-83db7e16a49191e5ed3696d854eee1ec.npy +04379243-63669ae28cf69b767f51cfad32a5bc58.npy +04530566-c189e1768a4f291d4de203ef6842ee61.npy +02876657-72d49a11c34a3b6880dd154b5d9c087.npy +03948459-fbda020053554eeceab5ee569c9de1b1.npy +02933112-9b885f40e2d36819e4e346ee2650d150.npy +02691156-dac25e0fbef7dabaf1692146d36a4a3d.npy +02871439-be99f079debaeed9a0fa21f3ff15b515.npy +03624134-e03a2ab2b6506ca0ef1f81f15fbe736c.npy +02808440-23288026c3ce8e5dc197f3661a4ec752.npy +04379243-a211f3080f4659131622a21d32ed9c9.npy +03001627-7ab86358957e386d76de5cade2fd5247.npy +02924116-d8226fb72a137597be2e23e91e24717d.npy +04379243-c2ad4e19213d839873baa2510487646b.npy +03593526-d9a35f5bcc527fb3a982675e6ec522a0.npy +03001627-efd0411eaf2396c4de7ed732f5aeea4.npy +03001627-e74035d3001deb876fb1d532bc5b4021.npy +04401088-7176e9baddd8a2ea33ac431572f43a21.npy +04401088-5148da752bcd11884ce243cdbc967ce2.npy +02924116-f90bafa70be9bf1bd4713685ae50fa13.npy +03001627-7ef4b16e0c38fe09b04cb542e2c50eb4.npy +02992529-3ca1d72d2416bee6f4e9c7b80248eec1.npy +02933112-15d7f54338bcca35e82e35fa57516a45.npy +04379243-17b444c072a6a3ec76e9713f57a5fcb6.npy +03211117-85240d0fdd8bc669ccf3727bc3da6c48.npy +02691156-3b3eb57af5f995c268aa0dbe2db661e2.npy +04379243-7bf29d83522f630190ff2a7142510fc1.npy +02691156-fc7fda7232bedd84bbf3143b1cb6076a.npy +04530566-2467cd9f4ae70875e26aef76db45b56.npy +04256520-a105701680f658b8f92f3e7bff4c4ab0.npy +03593526-d74e6a54e500b5744f9bdb71bf603cdc.npy +04401088-1105c21040f11b4aec5c418afd946fad.npy +03691459-b6ac65861f2b7a726bd362b3eb022b32.npy +03691459-a8277672da45a94e9d151674c6eace6c.npy +03001627-3f4e88498f4e54993f7e27638e63d848.npy +03211117-c61bc4cd473fe3326bd865f153842b49.npy +02828884-961d59d3ba6c7e1bf174129a51bed83.npy +04256520-a2b93b7632e98eb944949d7685cb63ea.npy +03046257-806f319a7465817814038d588fd1342f.npy +03691459-1334b56706bddaf4451f278fffaaebae.npy +02958343-8df83b28d786ccfc10f2ef3071342a2e.npy +04379243-462afff41381a622ffcc22765a7dddc5.npy +02871439-b0c1a8d1988b72e92987a7b722c00b7d.npy +04379243-b896a4afaa13fec7e90f16feb54700fa.npy +03790512-179998dd1743facfd5dde04c96fd8146.npy +04256520-bdbb64bc1fac0cded0176f9a144100cd.npy +03325088-9d2aaf99df5b83524ef883cf529ce415.npy +02691156-1856da25a85402ce63e266a803d9270.npy +03691459-aff81ceb0788c2c2d77f9c6ccbaf6fcc.npy +04530566-efc2b7a0ab3828761194cbd9c0740031.npy +02924116-c31a4569c45b13c9d1c83bc8b134e4d8.npy +02691156-8b851217c2ef15b8eeb11afd6f15c99e.npy +03001627-ff793ca32407b2022a54a8462d1ffe9d.npy +02691156-d3f2dcf27000283799d9d900afe054b8.npy +02871439-fb25e1f798321c354a134d5eddec03d4.npy +04090263-aded0c6beed6938ba39dc4a567ce225f.npy +02954340-d18c3ce1f186c16976bb31db0358e9c6.npy +02992529-b159743a482e73baa56eeaf8467b96e.npy +02924116-a89483619f413f91e9bc5a3190ed0a27.npy +04379243-7e871b4bbc5e3d175cfc8af3b7d60a4b.npy +03691459-b4e7253cb9ef78852b75817a0faaa5a0.npy +04090263-a4888af5b6c4c631cb239ba7670e0fec.npy +04379243-30ef2e867e365b735445e46058840642.npy +04090263-a0e251b5b4305d49893bac51482eaead.npy +03624134-df7a65224f295122ed9c5b25fef60d04.npy +03001627-79850e4ff6e43e6b3dfa4373373135f6.npy +03624134-2c23a56cbc058d5356c5c8316540f708.npy +03624134-66955a3156556f0d1395331ebe4786cd.npy +03636649-387429f609793f9dba5342d638d0c267.npy +04090263-ddb85b40a6e44c387a9af63cfe0c0758.npy +04256520-bfd15618fcd88e104017642dab433250.npy +03593526-aaa87a2a3a5b8ab4a156590b19c3013b.npy +03636649-fad0ae547e1facc09f97ca916781e800.npy +02992529-d2bce5fd1fd04beeb3db4664acec42ef.npy +03636649-ada0e305757901e589daba250d5b5a5c.npy +02924116-3221d0114c010afd613873e456db29aa.npy +02880940-e4c871d1d5e3c49844b2fa2cac0778f5.npy +04379243-ffb7b155cea1159a3a8e4d3441f2dd18.npy +03938244-590fca6c280bb31c943b92d8dfab705a.npy +02924116-567d3b42ab9b89195135b59750002c2a.npy +03790512-cdd1e5890e5a766a65397d05162306e.npy +04379243-839334dd754c09e5b7ea82317702e856.npy +03001627-879ffa2150c4537d6afcce3b00733da.npy +02933112-ccf5eb1023d22445762406157deca112.npy +02992529-4534e6754bcc38f78bc584bb94b0b13b.npy +02958343-10f158d2f43926ac80360680c1602c7d.npy +04090263-4fd2d1fd9aa1f2e4d3756a4e297a88d0.npy +03691459-60575cff5db034c621e6f308016fab7.npy +04256520-5cf46a99a9dfdc07411e8b42940aba04.npy +04379243-468955eaf3b3a4c6df8b5f0b7511efe5.npy +02808440-85c3bd8f53a7329ed83a3378d32b3048.npy +02808440-beafc45419f70db3252e0775cff1c394.npy +02691156-350d12f5290908c7f446f92b52bbd82a.npy +02691156-884adbb15fcb934051279f7b42f4d889.npy +04379243-995e0edbe7bbfbe0659dda512294c744.npy +04256520-b2cfba8ee63abd118fac6a8030e15671.npy +03928116-c5b7d166231c04328413778731d6cd28.npy +03636649-5a9e0dd068e2436bd7ebac63aa51083.npy +03761084-5a98c841d578715e4a44340bf227e40.npy +04090263-5f8a81e3c0711e087d81debe03396504.npy +02958343-227ab69792241382acfaf62fe6ca656.npy +03797390-128ecbc10df5b05d96eaf1340564a4de.npy +03211117-9ea0bddee8c8654d6b56d21c51d762b9.npy +02933112-68582049d02c7c979ebcda765f4eafa1.npy +02958343-36c2770d00fdd0bdf1ee968c9039cc3.npy +04379243-ff212e47775ea7fe6a3056c8cad72d81.npy +03636649-cd80cc92cf732e8d8a17805dbfb751e2.npy +02992529-cd7e6ab98a2d090099b101e0ce243aa5.npy +04379243-dea755ad1156374f55f46d55537192b6.npy +03593526-bcacdde81063a5df30612f5c0ef21eb8.npy +02691156-e160529ef50ae4dbb819cac660ba383c.npy +04379243-dec1d2cf8a4563d36cb02543e4df83bf.npy +04530566-b942192d17d2e267b7cc248da6c5c5b6.npy +04554684-e994852d9f4502674a16879fb3ac81f.npy +02933112-29faa40d5c0a65a576e9713f57a5fcb6.npy +02876657-b033d2a7efef6d881bd37ceeddc6ee3.npy +04530566-30e536833dee7cd8a9d21767a2141a63.npy +03991062-9ea66797afeb86196ea1c514a0de6d2d.npy +04379243-975b724129620c9af4b6538438a0b930.npy +02808440-75ab1d00c330fbb36f893b5bc716a3fa.npy +02958343-dd768e1b90b4537cd9eb65becee97781.npy +03001627-a5dc036f882fcbaaeb655fc642cef479.npy +02828884-88fa7d07abfcf9f03cbbdb20d4d80207.npy +03761084-6d8a8628eeb8ae92de6fb7d70c413eb.npy +03046257-d7942f024d24b8ac731e5d7a1aea3c4f.npy +02958343-3f702ea027037a5c4d18baf048fb19eb.npy +03325088-ee9f4810517891d6c36fb70296e45483.npy +02828884-ea518b89b8511916ac51268fdb437a9e.npy +04379243-621ae6c715e1af8087694c57464ff1e3.npy +02808440-8ebeac47d29d649acb6267f1b348aaaa.npy +04090263-44f2f626a4c73b216314c3b6a3a65519.npy +03001627-a5eea0cf3865da9749fb53621b8edde7.npy +04530566-d939109a33e6e2d175517226b23c384c.npy +04379243-32ea6609eb659a2cec3367bccf60e518.npy +02747177-33e36da1afca5e57f155d75bbf62b80.npy +03001627-5a61caff5d5b3e22424f8f8e828c9ab9.npy +03325088-21c4d5612e5b0437b362845c6edb57fc.npy +03636649-31a15957bd4f32f87eedf2c7d21f7cfa.npy +02958343-7bd15f738bf2a402d4fdf31cc2d78fd0.npy +03046257-60bc27587a400433b885fc9e74ed3e30.npy +02992529-71fb433e386a5547f63375fea17cbfe4.npy +02691156-79c10c1d217b4e96ee2723567c7709e6.npy +04379243-24b208dd138d8af36210db75a4cd581b.npy +02691156-55ed35a03b08a8f44f95630cc18536e0.npy +03467517-b427af4fcda02cf61a2c693bb85517c2.npy +04379243-1f5ee5ebb9ba55f454d30af857cfae06.npy +04530566-7fa94092d77b9f7877c1e07fcf5968a5.npy +04379243-5e0ef66271f36ba862feaf6b02ccee1c.npy +04379243-3a17eae5843c2c7660a62758a708c922.npy +03636649-2d4c4ceacdd41cf1f8c0f5916f81d758.npy +02828884-ad3c4c72cda4dcbd620ea05889322bef.npy +04379243-4a944441380ba0a45990f2c81f286aec.npy +04256520-824953234ed5ce864d52ab02d0953f29.npy +02924116-b4360cf115a6678ca71edfed1705a549.npy +03001627-92450ce64f51c778f235ab3c41aeb5b6.npy +03001627-621c62aa667c4d3cfe2fba8e5d6db330.npy +02828884-b628ddfe4d99a46021c74c368d3910fb.npy +02958343-fa563c2b77839dafc0e3666c7d0ec7d0.npy +03636649-3c3e36d1faa6c53c1f886eb96ca2682f.npy +03211117-b38d6f1025399725815b2b467e8e2eac.npy +04090263-bad9e6cf69ec4553db181f2efd806577.npy +02933112-66c38b5e6d9ad852307776da88d1350f.npy +03710193-c6d910f8cd92a59fdc83753cd31caa42.npy +02958343-64ee682c9dd2ee467cfc46ae22f84c92.npy +02958343-d922b4f3ba23cf43780575af49bfeda6.npy +04090263-da5d74a592c747e9ef7cbef6334698fc.npy +03211117-3c7ff78e8036b217d3923426933f698d.npy +04379243-47b6fc814d22a030db6175ef18ad3f80.npy +02933112-3e080e2b2556add4eabad247a05ad956.npy +02808440-c9e4c04d662d401afe52ffd0e748a1ab.npy +02828884-7a2ad24394c5d139d46c340938e2ff1c.npy +02924116-8b976988a516590c4096404077ea89f9.npy +04379243-667b59df5e098355c82f50464edece2d.npy +04379243-6afba6bbc7ca32bd339797c21e8801b1.npy +04379243-7556cf66da8b4498e12186cc8c5022c7.npy +03001627-f2a4d96e77d1c92a3d6cc735e3493c99.npy +03636649-caa8985efa72ea528d6a77b750ad3e43.npy +03001627-33ce7f85e65320ba9a404da609e2789f.npy +02933112-3931068c10d0a606ef37b256c10c21e4.npy +03001627-aba6ab10f7ccd59f9f8c3d2002c77ddb.npy +04379243-1a614377adee252e0445fc6d980dd5c.npy +02691156-65f77283a392890aa8cba409c4409ba9.npy +04379243-cd82d526e58e3e7f4fb85ea6fd426098.npy +04379243-7c15998c0d653821ab610b0c94236463.npy +02828884-91c949736e4887002ea98d69e91ba870.npy +04090263-1690a5959e2659d165b14b263bdb456e.npy +03691459-fad354295b4c0fdb55266ce6303fe1e0.npy +04379243-f94bd6bbed8fd60614038d588fd1342f.npy +02871439-2b9bb02f657a0e582ade7345ab5b0cf6.npy +04379243-dcf1095b329396b3a193550461f84122.npy +04256520-308a144f77a7aa2dda625e752fc62bb7.npy +03001627-6bcba04c2e45150779368d1198f406e7.npy +02924116-9e3197f8c8e3d6effa3f6d7e682927b4.npy +03001627-95db11e86efa7c3e8c6222d771a6c85a.npy +03001627-9a91fe80c2cd2f37f51fa0238791f5dc.npy +04554684-81c849960bdf3f1e91219aad82abc053.npy +04256520-9ab89ecff5672c38aff5bf458c586262.npy +02691156-da58b3e055132c9f6afab9f956f15ea.npy +02691156-c9aeb20d7cd1b3b45e9e2656aff7dd5b.npy +03001627-5f2d4c625595dc2499b025797420aa58.npy +04379243-7980d0e22c197dfa5e7e52a559b573fd.npy +02958343-1bef8891f35535ac2e877e82c90c24d.npy +03001627-2f249cbcbb122b85845e78b431e4d529.npy +03593526-7ac1b3847038de0e4b3c42e318f3affc.npy +04379243-e3287950481e9811cf48ae153052b71a.npy +03636649-c25cc72cd06852e75bbea6ee257e41cc.npy +04090263-b79cabe03c878d2980c2e60c312b0f09.npy +04379243-ee5f85db427865e63e5399147a5b4763.npy +02691156-3dc5331ce579b2d0d8ff6111270336a9.npy +04468005-c4053005ec79262c9954eae9164faecb.npy +02691156-5ad5fbe84d7d8ef790b1d6deb98feec6.npy +04401088-6167bf752533508dfd6e968ab91bff17.npy +02828884-632fbec93961015ccb2a965e75be701c.npy +02691156-653665e9c401e7ce6b310cbbfd03b8ce.npy +02691156-15898fef6fec88c53ada73811bb576de.npy +02691156-e17a696c47d4292393db03f6b4e68f17.npy +03636649-e89a02d4a6cc95f3fcb8d8c6d4df8143.npy +03001627-e158f7ba6828db5c654ea6737b0d3597.npy +02691156-2421f54274a5c237e8cef78f8179925b.npy +02933112-139aeafbfbdd6bb64da5feafe6f1c8fc.npy +04256520-9a7f267890144d4a7afe2ae8eef63a8c.npy +04379243-5aef22f5441b495d19fb4103277a6b93.npy +03593526-489317571832ea4c15d3518b43b3bc22.npy +02876657-1f1e747bfce16fe0589ac2c115a083f1.npy +03636649-cfebf5d2a0382ee3fcb8d8c6d4df8143.npy +04379243-71d50d287357e7e719fb4103277a6b93.npy +03001627-8e678a54f2ee4e5e492d9da2668ec34c.npy +02876657-e119bf2041459392601bea3dca268229.npy +02691156-64211a5d22e8ffad7209009cfb89d4bd.npy +04379243-6712647c8e0c6af29b6e5e087210d348.npy +03691459-292353a763d0870432af7736a533c197.npy +03001627-ab4fd3bdd8c1dede578d107c71db28ac.npy +03001627-8ea007bffdc9a27831aee04639d1b4e0.npy +04379243-cdf9659a23c89e80a23949c21eddef76.npy +02808440-1cc2487bfbc0209e3321831d2245cf06.npy +02880940-baeaa576ba746179e8d7df9e0b95a9b2.npy +03001627-eb2fabae15f77882139d2c86c9e03ddb.npy +02691156-c3733e626c07b9ff26360e1e29a956c7.npy +02942699-9cdaf68ed1e1daba9c21adf7cd249be9.npy +04401088-ac0a78736d78a5a5dd8524baa80cc603.npy +04379243-fa72e9cf7308066b1c072ac0b83fe07a.npy +04379243-92ee07567c94fd6d9a53d72e083de39.npy +04379243-4e15b52579903323f51f77a6d7299806.npy +03325088-ce9fb0a7128d11de76d20e73c57c9a03.npy +02808440-547a161a58187d52d4ba28a7ac06cf0d.npy +04090263-f6f468a51ccb62669729231d295371f.npy +03642806-25bc168b214b54799e28e9cf32e5157.npy +04090263-642e457eeebe04758480c9cd0a5e2175.npy +02958343-647faf34f7fdb50c16abce8cb03e7794.npy +04379243-6d9d5501c0a3d8f1615fc479d27ea86c.npy +03001627-336e92c7c570250251c4deb11af7079e.npy +02958343-468780ef4ace9a422e877e82c90c24d.npy +02691156-22dd4b6a60e20112185b376619557c95.npy +04256520-a7f45bd27efe50af4dbf8d635749f669.npy +03636649-b4e7c74a6e6685d2339c933a8cb966c.npy +03001627-f7e1a17728ea76dbc6bcadaedba80eee.npy +03001627-7fc8b858cad8f5849df6f10c48eb6cee.npy +02691156-97d662e5e6345b46bd46d022fd7d80aa.npy +02828884-1e039c5d86b061a593ebeeedbff73b.npy +04090263-48d29b4a2d749776e2e5bc9806debc17.npy +02691156-d06105ee2a2ae27c51008e496c6cfd2e.npy +02958343-7611c8605cb47d74b11647ffa4306609.npy +04401088-2a6d70bc7ac6db391d4136675e1527dd.npy +02876657-3b26c9021d9e31a7ad8912880b776dcf.npy +04090263-5707b3eb79f78b5fb9dd291f5235c28e.npy +03001627-2d44744a7ea0bf724b3c42e318f3affc.npy +04530566-9114091d7dce55242e5cac9166d7a1f5.npy +02992529-7dd788cca7df768495b1245be456cdf5.npy +04379243-c966a18da154da2c467289cae69b100f.npy +04256520-645aa5c32b9fe34014038d588fd1342f.npy +02924116-3caed8944366a746c8f372fe11149a91.npy +04090263-9397ae7d40c327044da9f09deacee7d4.npy +02933112-98003a902555e73adc6a693174c70feb.npy +03938244-950f71d6c271cbf47676dfce60793e46.npy +02691156-cd9f07bc1e5087b7f33a09c02bab9cc.npy +02933112-a6abf531780014f890a1391b3fdfda26.npy +04379243-beebc267ea0c16a5c7f6a57f6f73d8a6.npy +04256520-c722e02b37ec324463d444e16188727b.npy +03207941-3ca503ae899826e88bb4434d620302e3.npy +03001627-3ab2563609476e089868adf0764f7fd9.npy +03001627-4f5639e943b60edc600515ec9ccc96a4.npy +03001627-d1b03eeb33fd441d8189e5e3786f2290.npy +04225987-4473c1e89500747b5cc36f190f62c41.npy +04379243-67ec09f7e7cd6f059f2349486c570dd4.npy +03001627-17b558e72a4d76ef8517036a5ca6b1c7.npy +04256520-fd2449fd2aa8b142febad4f49b26ec52.npy +04530566-e0ddb444604f573d48260190ec06324e.npy +03337140-640b94d5aa88d61e4c3aee8e9d3a6ffa.npy +04530566-dace99ad1144747eaec7ac3c7340a2f9.npy +03636649-1499133658ea746d713f2e93cbeac35d.npy +02773838-4a1f62dbe8b091eabc49cae1a831a9e.npy +03001627-3024deb09ba519c517089ab023f65eee.npy +04379243-12a73c63681d65587a0f32fa630f6a0e.npy +04256520-105849baff12c6fc2bf2dcc31ba1713.npy +02828884-7def648b4fd4d1e419eeae21e79bb898.npy +02958343-c6762641f741acc2a19bced881c9e641.npy +03046257-217b47212a5a521ec6870dc41f78676b.npy +04379243-61fafe333f8c79c78716341f2dff4249.npy +02691156-4bf0b3df529d5093551df482db927edc.npy +02691156-29192f8c96264e3435fc197bbabcd5bd.npy +04256520-16cc2e83a7ed73b7789a00cfce0c4a8b.npy +03797390-336122c3105440d193e42e2720468bf0.npy +02691156-551635d89144da64299a59bfd8e7d284.npy +02828884-f200a8b5882be096d104df3d337858a6.npy +02691156-296d0aa10bd7ddd87965b154b2af39d4.npy +02876657-518f6867e5d38301fd3bf7a5792372cb.npy +03642806-6f1d1ad1d8238e84957b6a4f3924d982.npy +02933112-97c6b3099a406960d3dad974dc098fa1.npy +04379243-c5ded58bf0e362eaef9f898cda0ff409.npy +04379243-a251543112f3a452fc5718d28351c534.npy +03593526-a722038146f27d9550e02ef26f47fe02.npy +02691156-ba7d272a0ef0f06cd165fddf32a925f6.npy +03001627-ff167d9f25fb6ede2419ec0765e66c90.npy +04379243-d20562f6f18add5c7dcd20e7ddd78bc8.npy +04256520-9ba5f57133b048f771e087d4163df51e.npy +04090263-487330fd2ba7d55f97020a1f4453e3a4.npy +03325088-14dfa201e54c7aa0b362845c6edb57fc.npy +04379243-ad0082e4bc0b5ecd2058afcc28d23393.npy +04379243-6739b7952f7e53a7ee462e7a3aa014c7.npy +03211117-cfdd661f4521ae0e331bde3212dc4d8.npy +03636649-6a044fab6905fb1a145fa6babc33219e.npy +02691156-efbb9337b9bd3cab56ed1d365b05390d.npy +03001627-ed3e73a2609bf304377b9297f3055210.npy +04379243-b87c155d6c95c768668ae11a7db5e82a.npy +03636649-bd234f132e160fad8f045e3f1e9c8518.npy +04090263-c7e84421af16e48eadfdd35441a4b4ea.npy +03001627-ae9e1ff1ae0b0a8f6ee473575a9f31bd.npy +03948459-5a2bb05af1dedd91e641b9ab504917bf.npy +04379243-2f9c9357bfb89ac1d38913e96bbf2a5d.npy +03046257-56303474bcea6fea3b48a711df82173e.npy +04401088-a857d9e7cd90163e10bc2436075f6a52.npy +04379243-d3030c8698bc2f874c4c693a60456ebf.npy +02691156-62a72a5afc84ed54faa7ec7d870d2e09.npy +02828884-6150a9e7c5534dec50cdeffe12411e9e.npy +03636649-78b7adf1f72ad31a841a2fa612410176.npy +04401088-dc2c4f42a5715d0a6d1ffe1a45470ad7.npy +02924116-4e4402d72896357d1cd228cf70713a1.npy +04256520-953707e41b518f631125768e50c51e2a.npy +03593526-de948c52437de4d2a57b3bec78e5d1b3.npy +03001627-1e92f53f3a191323d42b9650f19dd425.npy +03636649-da4fe1c3d5b1eb6ab2b4f8bf5db83688.npy +02933112-12b0773858754105c59350d819542ec7.npy +04379243-16802a946bd714e819fb4103277a6b93.npy +03001627-d9346fab44b6308f40ef1c8b63a628f9.npy +03001627-79f86911bc86222a4e5aa1f8c960ae63.npy +03001627-aa6f5bed94640d81c20bf61cb7d8cc34.npy +02747177-11d2b7d8c377632bd4d8765e3910f617.npy +03085013-f24f90cb00b51c2ec8c3ac9bcbcd9687.npy +03337140-53a2e3a87300241c195ae0b4bee7180e.npy +02992529-693fba444859fb7d54c65e829609f393.npy +04401088-9f56c8a7cb64f4c36c87ee6c360661c8.npy +04379243-589599503c7b88129a87002a4eeaf610.npy +03691459-a6cd2be54bb9297d53c8f7a04cc7057b.npy +03636649-13ba3fbe8fbc53f3ef3a2c64cef919d0.npy +03928116-e92073bfdd7d3004f8ce064c0d1d8055.npy +04256520-e921afccfbc7137c5a95bb8b37106cdd.npy +03001627-8d40dbf5ada2f6f662e4024c69de065d.npy +04379243-c4202200cd2ff878489ea1c28ddd58f0.npy +03325088-1bec5441a4a0fc3d6af014d294c0e7c5.npy +04256520-ee5631d8abed7e69b06dae6f40c44a8.npy +04379243-304ff1fce32b5bdfadccd0ac21fd007a.npy +04256520-9f47842c7fbca0be593ebeeedbff73b.npy +02828884-81d5dd006f418712f4fb4dee5181bee.npy +04379243-ce88f6aa0e43bf8811099baf02792d0b.npy +03624134-a496cafc5238575291687e259c21528d.npy +03467517-c8acdfaec5008118343b0b12983b9982.npy +04090263-fb686ac45c8e545c8d1265a14954deda.npy +04090263-b2f4f17f6d59c6a53e1cebf83f3f1bdb.npy +04379243-b14cec4ece246fb75b937c87a8810c08.npy +03928116-59da3017ec277bb92cf5a6ed6299d488.npy +04379243-127d935d17cb36c8b0a3f25f5d8cb0f8.npy +02933112-3bb80aa0267a12bed00bff798ed59ff5.npy +02747177-b729214e49af571bf155d75bbf62b80.npy +03001627-ea281c9e968757dc351f7b956f3bf26a.npy +02958343-3d0308da43d52e3ef56f8ea3d9016e55.npy +02828884-6a2c354ed5212c77d2b12aa6a0f050b3.npy +02958343-a8f2c3adc0671c15c64e95fc6a597455.npy +03636649-ab8afd0f2f10be4f3443b22038d340.npy +04256520-b1b9c6c7b55d5bf845ed290334fca9ad.npy +02828884-18a3d4fa8abccfa7ff8d4c5a7727a428.npy +03001627-584ce0f244158b37de2b9bba503c21f.npy +03691459-a47b1e6d492bb68e8dcbd53cc631ab.npy +03467517-eadc5e7826fa778939257bd6adf678.npy +03001627-cf0d80feb2f6f71d9df508b37e4a3518.npy +02828884-4504e203b67dd8e473f10e6caaeca56.npy +04460130-17e229dbb42786e6b164f257e05e5435.npy +02933112-d6a58b80b6f1a4f9a14bb1d7e401bf06.npy +03001627-55192bc667582ebb83d21872be197422.npy +04379243-fc3d26aebbd75ed01e112f5fb42394ff.npy +04379243-cde57c6c75d1453a372bb05ca908b13.npy +04379243-a075004f2659de5a797e3338b16ee6ad.npy +03948459-115aa37af1a07d24a5a88312547ed863.npy +02958343-247de29743ed24c5e61b9ff60b1be412.npy +03046257-fb0dbe220131e28f6402b8f491cd92c7.npy +03001627-645022ea9ce898648b442b160bcfb7fd.npy +03593526-807620fed80ead9672160feea2b67fe8.npy +02691156-396312e9bec88c2590b1d6deb98feec6.npy +02958343-d4d7d596cf08754e2dfac2620a0cf07b.npy +03325088-6975759bc0f32b912f9e27b3b2a34f3b.npy +03001627-9e39c4ea1d69b2f19b1e9677d6cddea0.npy +04379243-ab8644ffc94a2f2dc746cacb18b4d81a.npy +03642806-8e13c7ff206a424fd52bc338a86e79b1.npy +03211117-d7ab9503d7f6dac6b4382097c3e8bcf7.npy +02992529-9f56c8a7cb64f4c36c87ee6c360661c8.npy +02808440-a4c022ea469ffc054416e513daf6e560.npy +03928116-7d4429c2b65ab0dcc05cc8f408623292.npy +03636649-9fdaafde365beafc37f7ce56c66316ea.npy +03691459-60a7df9bf00844735e7cf7bd2b19c869.npy +02933112-8fcaa6e3a07bcf5038169f16cecf9bd.npy +04530566-55da76d97620d111e3ecd2d9271dad4c.npy +04379243-9a066882ba79738fe3767a60a4ba1ba5.npy +03001627-1eed5ebb2af372cb5438b83aba42ca46.npy +04379243-924ea50a921ac1e032fe69ab8bb2a7c3.npy +02691156-228478022f30a2bef1f87579d4dedbb4.npy +04530566-eba55caf770565989c063286c702ba92.npy +03691459-4a124e8015bc6122778ed5a91adef178.npy +04256520-836d2a7bc26d1b75ec195f2cc52f3287.npy +04379243-25bc205f6de491f4ccde40b1205ec7ff.npy +02958343-e39215e03ab8e65e68428aabd2c41ee8.npy +04379243-bc6aee7279114dff428a5246ba7de3fc.npy +04004475-43ce5d7525f1e7cabd349f2c5e600fd6.npy +03636649-7eadde33d9f9d8b272e526c4f21dfca4.npy +04379243-4e9a4060a7fb0dd230bbd4cddd04c77b.npy +03001627-be7897b96b04a5d12aca5d156344f8d3.npy +03467517-a3aa87664655c03b276c3d558130f8b4.npy +02933112-ab870b99f869186fd523772c66ed5bc5.npy +03001627-a5d21835219c8fed19fb4103277a6b93.npy +02958343-75221b7668e145b549415f1fb7067088.npy +02691156-973df01cea43c7f690b1d6deb98feec6.npy +02828884-4d24a0d4ed77db9f4b3c42e318f3affc.npy +04090263-d88c106c00384130fb5c1b0f759e2bc1.npy +03001627-1b7ba5484399d36bc5e50b867ca2d0b9.npy +02691156-8ce12b6b3b451b8ad0671652a4c42f7b.npy +02958343-a5b7cc1a5ab2828b28b0b7b876595fb8.npy +04530566-fc15175b34b5e47ec57b4b6e80796be3.npy +02691156-e4d902abdf9481558caa71b1fbf7fb98.npy +04090263-39ad36394c9b7267e2043871148f79a.npy +03593526-abf5f73c5440f78c20d37e3fe8c3f09.npy +02992529-9911b2ee8470d6dab2098fa3046754f.npy +03325088-59d8bc2a9d837719b362845c6edb57fc.npy +04401088-1bff7e425c06b65af431996b7f8b435b.npy +03001627-50c446295496eca73542594e05cedc89.npy +03636649-78b95abd1d1158ffef3a2c64cef919d0.npy +04379243-2181ecc9b382a7a873fdbe4b39ff4036.npy +02933112-76fa5df01e82242c684b7bc3f8a9aa55.npy +03001627-df84087fe057385019e48122ff512ea5.npy +04530566-90e6c6083fcd47833e45dd2f173cbf9b.npy +02992529-d7ed913a3888696d289b03e5721252f3.npy +04379243-6606f65226a75c2e34fe19fa8681ba9e.npy +02691156-fc5ca618ae253663d13ef00338ba8c52.npy +02958343-642b4f6a2ce0e388284432ce2f42f498.npy +03790512-45b69ab448b01056267aabe46d1527a0.npy +04379243-636fb360173b08e788dcbe86402c7c15.npy +03001627-3270016f24001d9f3149bb9ed65c73b1.npy +02691156-6aa1ef13aebb1935ebdda919ac927e5e.npy +04379243-8a12ba383cbda72b91829b477862aff6.npy +02933112-850bd3a9b96e3ac67d3aa3bae1f7b494.npy +04379243-6daed91ae491c9cbe22ea6d770699e4b.npy +02924116-8d52b124e1c9ca6720d6874a38819f38.npy +02958343-c683e8e57b20ceeab927782fc69a1fbb.npy +02691156-a777672f17d3641f1aa9d8d95b6740cc.npy +04256520-157ed8452a7edab161412053ff521f64.npy +04401088-8ec3b148b8c608a0562c671ec5000f23.npy +03790512-8cf5bd117e04da6d6a3456c0ab5674a9.npy +04090263-f6d74e48206fca39a6e43b878d5b335.npy +03790512-97bb8c467f0efadaf2b5d20b1742ee75.npy +03790512-6ce7a58297a6fa5c8249f134aca4c817.npy +04090263-98ed5fe737e80b11eab5ee569c9de1b1.npy +04530566-6abd7ebbc9020871bfbc6e788697e036.npy +03948459-8a071ea65e9057a1c7c8ce3bef5c2aa9.npy +03636649-55b002ebe262df5cba0a7d54f5c0d947.npy +02958343-365af82203c96fbca92a4cdad802b45.npy +03991062-d246fc3587cda5787c6842d93e448798.npy +03325088-994f4a915885dcadc36fb70296e45483.npy +02958343-d6f8cfdb1659142814fccfc8a25361e.npy +02808440-9177eb193eac94dbbdcdba9491bb75f8.npy +03642806-9cb17f33ba3c057255d5baa5be4ca05.npy +04379243-7a0280b9d2fbc2244cbbac005f3700ba.npy +04074963-c99bbef1b2c514a81b22d29e47ec3f2.npy +03001627-108238b535eb293cd79b19c7c4f0e293.npy +04379243-2ef899e67eecef65190a91fd9a6f7d55.npy +03325088-4d8b953c08a287c26eb5b970490a0d07.npy +04530566-a8f225774d1bc8d0b7002bddf0942f8e.npy +02747177-a2e813b6032aa494a1b95b258b5f7139.npy +03001627-815f436a40c28da51f56aa11cd5e0c3e.npy +04379243-ec0d4fc8d4c29e7a7ff6ace05b36a5.npy +03797390-387b695db51190d3be276203d0b1a33f.npy +02876657-5e896bc124bc0af9fd590443d27a974e.npy +03691459-16a8c851009d6786887e8faf8f33b0c5.npy +03636649-3397952c22be7309796c584ff1fcf56d.npy +04256520-ee63182f95899a7419fb4103277a6b93.npy +02958343-dce6f59b6ab987d4bc863bdef4e7bdac.npy +02933112-5b112266c93a711b824662341ce2b233.npy +03001627-61f71cc002f6da561c81652b127a0ec9.npy +03001627-9c700bfbe8730e6db8f4af915220b65b.npy +04256520-34fe095ab6fbf3a09c0b027ae5b223d6.npy +03001627-79ef569979791f136f10b4c199f4a16d.npy +04379243-82b5a7823990ff0f48964aae007fabd0.npy +03325088-f6b1ca2df0be11bdb362845c6edb57fc.npy +03593526-b362273df5596c7e7f095f36ba0999f4.npy +04256520-32b6c232154f2f35550644042dd119da.npy +03790512-a9399a50fcb25209429f1c522640e6f0.npy +03001627-41fd861b4f4b8baf3adc3470b30138f3.npy +03001627-9a35f15e924e19db637adadafee6f182.npy +02933112-18d94e539b0ed30d105e720ebc569399.npy +04530566-1d8b27e78b2f326480d90033321f5c09.npy +02691156-6db040a8d5c1d5c14d210d9468aedaf2.npy +04256520-fd4285c2c5050ff7e8bb25231731c25d.npy +03761084-4b896032652578d8b5d95a89c22ce403.npy +04379243-8db7935008158509b55b46d261fe0021.npy +04090263-a8eae38e77cabdbd873aebd175ac6f11.npy +03001627-326a0c5116e410cfe6c1a071a4e8216c.npy +02958343-188621bbfc7d9477ce27281f3b76d1f5.npy +04379243-81271aca364735e4e6c5cd45aa112726.npy +03636649-b11c3bda15930ee7bba5aaac798c64af.npy +03467517-93519f396ef3cb23a00521ba9447845b.npy +04090263-eb6e7e6241c20448a3fb48700889ab3a.npy +04379243-6e8d22c6e069b71965b77a565916c7f.npy +04379243-86745eb914ded54c4ddda47ee90d6a21.npy +04530566-c2d6e8710215b74c82689dfa8a7d7e7f.npy +03001627-8cfc69d79fca89223a4a5c95fa1b0032.npy +03636649-893d9bdf1d7efe71bb5bd941c6665c21.npy +04530566-698f399e6c578386b64d3e1832079349.npy +04379243-aca97b802b08e220ee36f204dec02883.npy +04379243-575ac593154b95b6dae7645f889ddcf0.npy +03797390-a3cd44bbd3ba5b019a4cbf5d3b79df06.npy +04530566-29bff2fc529f82d676051c4eae3f0a9.npy +03001627-b2c838917b9f0fb68a40e1421d6a3cbf.npy +03001627-af28dbdce6ed8cea19fb4103277a6b93.npy +04379243-608af07bd357d605f155d75bbf62b80.npy +03513137-13f607a462bd1ea83b13741399690655.npy +04379243-e8689b8b1610bf2841bb8a7ba579a58.npy +04379243-a5d6b025b4c7239df1c7a32d97b27a4f.npy +04256520-aec403bcd87487b5b3aef1eb2166205f.npy +04379243-62d51d3d505aec1e5ca3dca3292dd1f.npy +02924116-35b752db6bccf0be5f0b5ee0fb357b4c.npy +03797390-fd1f9e8add1fcbd123c841f9d5051936.npy +03261776-a5a29c03bca0ff22908c261630fec33.npy +04379243-96b17bfa556f57e29d2be74cfb51ade1.npy +03001627-d487d3b9579762cb5dd170fd3a296ebf.npy +04379243-8dd8370dcaa8d770ea5682a3b818969a.npy +04379243-44bc2b9ceba25f8555f46d55537192b6.npy +04225987-97a1800db9a625bc28044fe9244db50a.npy +02933112-283bf988df376b9786ac7f2dceaa530.npy +03001627-4527cc19d2f09853a718067b9ac932e1.npy +04256520-9b73921863beef532d1fcd5297483645.npy +04256520-7d6453e00288991c61bf0ba277ea473b.npy +03001627-a564c8a43f6a7ba5199f2eca998ded6d.npy +04379243-3e6e16cc5a4f26da30bbd4cddd04c77b.npy +02946921-baaa4b9538caa7f06e20028ed3cb196e.npy +02924116-e0b2e30ffdabf5d4473f10e6caaeca56.npy +03001627-5c2b9c31cf63b0b93724abdc4106b950.npy +03046257-4e5b4341af6bd97368baccb6cef7077.npy +03467517-a42d7ee49607640176d05024fabfa1e5.npy +02691156-320e639572e8b9ceca504cdc40c452de.npy +03636649-a9d554c5d9d09405fcb8d8c6d4df8143.npy +03001627-81628a0b5f7f9ad7ba94feecf6f7a200.npy +03001627-efa83c67ce47bfca304edcf7c4314468.npy +04256520-224ccf9ba2b786d953353c404519f02f.npy +04379243-283e6da77ada4d65d42225b7548c8765.npy +04530566-89f52a2a136ce55728ba119bc0e1c878.npy +03636649-611f9690f6eb4da79a6a8a8f3fa61f11.npy +03636649-3ab3e07e432b0afb6b1c0c9b30aea3d.npy +02924116-ee8d5ded331cfb76c0100ca2e1097f90.npy +02828884-7ecd49fc95f8eafaf4fb4dee5181bee.npy +02691156-ad546b049b2246bd609e2d916fa0da27.npy +03001627-58620941b03e46b6e718b2093cc8d7b1.npy +03211117-8ce9fa1075039c8c63f4b01b3d592bed.npy +04379243-eed2fa156d662c79b26e384cea2f274e.npy +04530566-a8976b06101853deb4d272023dce0149.npy +02958343-e624da8cd22f6d289bc0c5b67eaafbc.npy +04530566-ec779915957e5361ce000b0a5d25ebdd.npy +03636649-53af1ea051d78e799904d527fb5485ad.npy +02924116-152d5e60eb9c72abbab671af2c92e476.npy +03325088-77c6367c2d0b0c9e29d75ea275a1cb4e.npy +04530566-65f78142a6c33a89ea7dce1646d86149.npy +04379243-9e42bbdbfe36680391e4d6c585a697a.npy +04530566-5aaec5938224841f36cf5f476d32636f.npy +03001627-8b0174afa05ed3c2dcadbd99efe6967.npy +04379243-5237a2e80c68f90abf7421909bb3502.npy +03636649-3b64d5033c580d2ef76898f881b76a.npy +02828884-ca04a1b1ff6701f8ad5067eac75a07f7.npy +04090263-e27f87039008855a341b8a806253912c.npy +02691156-af73d05ac86369bf4ce863ea27e2b897.npy +02691156-68c61d42222863682296d88107d065f6.npy +02958343-7015c7c8ee74f69313ded1857c15b5b6.npy +02691156-e0385af10bddc6a0ca8607f540cc62ba.npy +03636649-d52bcf6a2c75ced5fcb8d8c6d4df8143.npy +02808440-5c06133aac3e8fab3321831d2245cf06.npy +03085013-72d5aad0fbca8996ef04aec0d9ffcd31.npy +03624134-b5090018439903e0202be79d8b285c1e.npy +03691459-ea7d44b28bd22258f5ec01c1dd7b80e.npy +02933112-4dc45b86bdce7d96d37a1bae74ee50a2.npy +03001627-78bb9f39d4251624a502e035aafd3af8.npy +03261776-5acf58974a81ba7ea7b482715d4b6103.npy +04401088-996fd7ccc0567c3c6b2ba76eab0d2b1c.npy +03001627-7d1a9d6a3297ab853e02e5116c35dcd3.npy +03467517-853a5832f15461c9e8f705eb96ba3376.npy +03001627-c47bcffe3e74391af3c9c1464e55d580.npy +02808440-200c5297948bf57f6b448b8aaebb705c.npy +04379243-b8425a23b0525ccf004563556ddb36.npy +02871439-84fcc00a222163cd2f353d2ea8863d32.npy +02691156-bd8c9f9442124cab5e64c90e34fc13b8.npy +03001627-7f73cc6c1c9121a9b9f2eb77f5e247e.npy +02818832-970fff8bef63e40bb138abea28057850.npy +04530566-3a4c31888d291859f8e1db0ba8b72d09.npy +03001627-2c4719f6aa7b2c8a5a9f35e635b7e48b.npy +02954340-a0fc32a763b57b85f0d11ae402ef940e.npy +03991062-f2aa612d6ab76bc1a2c59a4d90e63212.npy +03636649-5f9edd0b9cdc77ded49b2e04785f8492.npy +04256520-4180d98246089cf014038d588fd1342f.npy +03938244-4c617e5be0596ee2685998681d42efb8.npy +02691156-1659db64bbf46bcdc1955ee4b5680e91.npy +04379243-aa41c42a9a79070de4a490bdf2c3ee62.npy +03691459-f4290921bda21901caf9cf929ed6f71c.npy +03001627-d0c6af0d44cc068523c1b1df1d480bd3.npy +03001627-7309610420ae20c930ddb6ead95f49cc.npy +02691156-cabce3320f119855a5131d38588a62b.npy +04530566-daa1781b81a74852bddd6eea3463dff0.npy +03790512-2c6e2d1e743b93b67f44d6925c8a069.npy +02691156-9c7268dd8ec3a3bb590874dcd9dc8481.npy +04379243-66378f0a068a111e57211f5bbbd90b35.npy +02958343-3134927c492c39e241d7734b73edc062.npy +04379243-e1d7b48449559549303c85804d402599.npy +03046257-3699e4ac78eb732866a92e3fe9fdc71d.npy +02924116-ea80f7a2a3b97d2e8f3f2979f302c57.npy +03001627-8eb33e21e03b8f84db039d8689a74349.npy +03046257-15cccdfb473dae1799f30106e678cab1.npy +04379243-6c2e919b70c335f240ef1c8b63a628f9.npy +03636649-c961e64a930680bb900a91cbf836390b.npy +03593526-244399287185e74d8ca4aeb5e3b33af7.npy +03337140-94453745e0faafe2fd938442e7c3fbc3.npy +03636649-748e643d7982fab3fbdebca9f6788597.npy +04530566-522614512d74a2f8c5f391634c2a5ade.npy +03325088-990ca49fe2a40eee5c19b45944d27e3b.npy +04530566-64ceb6b8d122c2b3c9b5311300e82c12.npy +02691156-e0df54a0990000035dde10d3d9d6a06.npy +04225987-563569e15313d7eb89e13811ad04f53f.npy +03691459-f57c5e8f460e659f395ea88528a634f.npy +02691156-2d01483c696c0a1688be2a30dd556a09.npy +04090263-37cc0262192286c2e4235a2d12e58a2.npy +03211117-87b093f1fa5495968cb623bbd4140197.npy +03636649-b36bfbbc98cb45431735ea0e092a805a.npy +04379243-f1323a66816293be29ae2bc03882456f.npy +02958343-109567d7d55b8fe515a520abec2f04dd.npy +02691156-d1119217281b8475fe755e3418b63110.npy +02818832-a224f207c639eeaf8d704b7b9cbe87.npy +04090263-58613784e5ff705aa74a2c673ce55a44.npy +02958343-d2776550e240c0d642fb51f57882f419.npy +04379243-af71e4dcd477656f9cd431573238602d.npy +04379243-aa615f385b320782eb57f2e4f0583f2c.npy +04379243-8abb8d75987c92144417a5312cf9d851.npy +02958343-90917495a9603208c368040825ed335.npy +03593526-c7bb8b9685f0378307f509cdf07ef62.npy +03207941-6e5bf008a9259e95fa80fb391ee7ccee.npy +04090263-734c46fe71b6021416b34c3751bc447d.npy +03636649-72bc0272ab1ce5a3f8d6a4359d6a181b.npy +04379243-706dbdfc48b19b0f423f1f7d60608f89.npy +04256520-8d69121ec9f174cb4db79ead79f57b22.npy +03001627-2db6c88145049555e6c5cd45aa112726.npy +04530566-da4003977c998e81f74f6fb7142d37cb.npy +04379243-2e5ac0552fa296c43bbab77a66bc3671.npy +03211117-f1d77e0f4a2adc2bb305a938e0ed1b48.npy +02691156-800ce26e517769dcb87697d3904b168b.npy +04379243-9ee005b0d0cf88a0e7e684d25d4dcaf0.npy +03636649-379b2a19deff9954f51f77a6d7299806.npy +04379243-fd09a960ef86fecfc515407725a6e525.npy +02958343-a89dd60aadccd84be04e0c24d5a9d818.npy +02818832-ba1eaf2862426015b345c23c11c95b7a.npy +04460130-149f13db5c358ecfde1c31612629d3dc.npy +04256520-2e1563209d3318b2d544b90b3a170602.npy +02958343-841d9f6bbe50ec6f122568beab222093.npy +02958343-9752827fb7788c2d5c893a899536502e.npy +03636649-f3a9cc3060fd6b0e6e4f8fc909e0d34e.npy +04379243-2486659a274a6400ff07dc9cc50c993b.npy +02933112-5f2f90d83db6bcafe7e684d25d4dcaf0.npy +02933112-3d2870c83ad35dfe86d53ab0fe94e911.npy +02691156-3029b9f2174da4b0bbf3143b1cb6076a.npy +03624134-e2cd287563f26e3eef1f81f15fbe736c.npy +03797390-f99e19b8c4a729353deb88581ea8417a.npy +04530566-6b2fb8cbc5365f5c8cfe472915a175bb.npy +02992529-3dd3ed204c56943389e13811ad04f53f.npy +03467517-22760e2b45e67d724d88968940783b69.npy +04090263-47d871d9a3b5553cff790997f2048517.npy +02924116-800d1ff96ae2af8059a2046f98794106.npy +03046257-3b19d7b7f975a08abffc4b354a59e33a.npy +03001627-ff034050f7ca727ea64c9c407ff9dbfa.npy +03593526-e15fc6c148793ebca6508ea9c3850f4c.npy +02691156-fe82a9934a38997866cf1b4a8fc3914e.npy +02691156-d8a037897d5d5b108130971b27e95927.npy +02958343-77d884ef56bc97a8b7ddd670a53fb311.npy +03636649-405e760fb406d96c2cd3f16bd931920d.npy +03467517-7701180906a0aa156a7ae841f1f88f87.npy +03001627-4e3cc3f6d2c25b904addf6a5f8726274.npy +02958343-e9bdc6c0a9e4675bbecf71e2e014ff6f.npy +03467517-9943ae38cd844c91082f2ea630bf69e.npy +03001627-bace9433ae54fcb3290d57214c8512a4.npy +04379243-fad834ac9ebf8d5595b7b91db37ae400.npy +04256520-bd98ff55306cdd592c509b30860f3d1f.npy +03593526-7037b6266188af53197a35146ee825cd.npy +04379243-55547d2fae0e3dc21705bfd3afcd10e.npy +03211117-252640ae350a1e53f119712971a6882c.npy +04379243-ed6e26db873ded9573e85324169605dc.npy +03211117-25a09a149d018bdcaa95bf474e195f02.npy +04379243-1011e1c9812b84d2a9ed7bb5b55809f8.npy +02691156-688930b9d0e06ead9a6e43b878d5b335.npy +04379243-29b57f226644c696e921ee447a9e7b42.npy +02958343-6fcd4ab4d968a975715e04edb8af9c53.npy +02808440-cf9814ecd52f9dcafe52ffd0e748a1ab.npy +03636649-a0858fbc08ec5e34e7e684d25d4dcaf0.npy +02691156-c6d39a3c52f8beaf7f6c3adc89eef8e6.npy +03642806-10f18b49ae496b0109eaabd919821b8.npy +03636649-b2f18bebf6566bcc97554b6bd947feea.npy +02691156-a8773829298f492cbcb9a99298d16322.npy +03467517-a7ddf2e5b9dc278293f0194265a9746c.npy +04401088-9d021614c39c53dabee972a203aaf80.npy +04090263-14fa15f31d713b7153b838b6058a8d95.npy +02808440-28f7f68307ad843944221bef0fa3c36b.npy +02828884-107eb4f1731b2466780bc2708a85ba9a.npy +04379243-a83bee7cfe190a1dc26fa198e521610a.npy +03001627-7710ecf956701938b40f0ac0fb9a650d.npy +04530566-812c1a3dacdce93ab4b5d7d0cd89b504.npy +04379243-9c1b0058dfe027cbf519adc9991b5f11.npy +02808440-fbbe1f77590ae6771a3b39b07e4b3d0f.npy +03001627-a1dbdff3da83425f3eec26c23f5bc80b.npy +03001627-72bc27a22e5f516e8aee1b6cfa0c3234.npy +04090263-a3c96f18e2aaf2efcdd76170a7089b09.npy +03046257-9f51f591d698445a5fa2d7ce8c99e4e6.npy +04004475-f8bc97b503ea024c4fb4be49c5910c7.npy +03642806-bb33d26f324d19d94845e0946708405d.npy +04256520-26caab5f69ebc9693eec26c23f5bc80b.npy +02954340-3dec0d851cba045fbf444790f25ea3db.npy +03636649-86d556273aa5075aaa660c42e675c161.npy +02808440-a3fb3caf38b63d06ccd0340812259a39.npy +02691156-1f672d2fd5e3f4e78026abe712c1ab05.npy +04379243-fc7d921df59e86e6beedb4c8fd29e2d1.npy +03513137-30c9fc79edc88adf438fdee28ab485d3.npy +03710193-580f93299ad002c2949ea1574c63d947.npy +04090263-52102b24df4b0e09fe75cc28d6fccb4e.npy +02691156-d7f3d0503ee4ee1cc34b900bb2492e.npy +04379243-8d5dafee7c2e89aa4cbf9a02e3342127.npy +02958343-2cc4573bb9441493d12568d09c2fba02.npy +03001627-e0154380de563d2cd81aa8b56a36ec8.npy +02933112-1b6e680e76d452a097144612c70a9099.npy +03001627-f5fdaff0ac02f106e8f8c11a24c52ebb.npy +02880940-e16e27d3670853b12d4e6b2984840098.npy +02691156-f71028dac9b396fe80288501d9901d7b.npy +03467517-4110ce992cd45b83d3270fc46b08e35e.npy +04256520-c9276f00529396bb35836c728d324152.npy +04225987-7a8b7d5d288742546fee3d712d650ac2.npy +02808440-e5a1ff704398c55ede9471c962dd6ba.npy +03691459-4e06e2b59a83bb6229cd1f0bcc30f82c.npy +04401088-6a0c0c55f355cc23a0eb5a85db887292.npy +02880940-1fbb9f70d081630e638b4be15b07b442.npy +04379243-a86969194537bd5a3a602af85160c9b5.npy +03211117-c356866299f4451cd3563af8dc07cd64.npy +03691459-192fd6e662d89b62dbf53b03c847b004.npy +03928116-bd586b69c27f05c8fcb3c6c0ffedec6.npy +03001627-9b8c50f5b9e67dec35836c728d324152.npy +04401088-81ad8af206d6b21b89b367279b017ccc.npy +04379243-1482036d8ce3b51ffc0035da39bd5e1.npy +02691156-14161a05a21cbd6f62b600da24e0965.npy +02871439-777785bf709e10ccffba1ef7a9b50ff2.npy +04379243-db2d4f781756e687d8864caa856253b.npy +04090263-ed9e0161c72f98d5def607f4d4140edc.npy +02992529-cfc5fce3c76610e3634fff5505144a5.npy +02691156-2a06adfb446c85c9f9d3f977c7090b2a.npy +03691459-e66e2202b11cb7122d563c85edb49108.npy +02958343-d28d00d6488ad1a78079d5a13e411210.npy +04530566-2fe634902b6ba945b4e4ece897f04daa.npy +03593526-41391118c374e765ff3ef8f363b2cc43.npy +03001627-5510d5af1ab5714b3c42e318f3affc.npy +02958343-dda0d7e01642f399d4118745f38eac76.npy +03691459-d8f6aaa777f0cd4f5a31d91ec836a511.npy +03001627-88cb38c612cf60dfab50b8ae6c38666.npy +04090263-d254cbd6f2e319ced348fc2382f06377.npy +03211117-64f6ac23636c5c2c8a17805dbfb751e2.npy +03636649-6c4c45af95f811e479414e04132a8bef.npy +02958343-b790d70257a8191a29984c4afd2e98a4.npy +03642806-5eefc8f2d755c843614c1d5b48350fb.npy +04256520-1476ee6116538beb1d0e6f3a33226a84.npy +04530566-80439bf303734b76ff37346ffc41ec74.npy +03636649-7f5bc32085dfbbb88e7662971dc736f.npy +03337140-16345185248d057d2b352e2703063a3.npy +04379243-8497e2cce58a0ab46827eb366939da8b.npy +04090263-f5a561a38af6b829b3066d9a2ba0c7c3.npy +02876657-8cf1cc180de4ecd0a826d25a0acb0476.npy +02958343-da92c8d35fabe4093a67185d75524e9c.npy +04379243-a1c04a11d0e20691fa3982b18d6e7664.npy +04379243-f58e58ad9952e174d058858de40fec33.npy +04379243-7f2d4ff98dec893094210977e5394f26.npy +02933112-a6565be9e3fb8e1095bea7c29e873d16.npy +04256520-4106b3d95b6dc95caacb7aee27fab780.npy +02691156-65278860c7d0f3704f59c2a67aa8473b.npy +03001627-1e276a016b664e424d678187b8261d95.npy +02942699-15e72ce7a8a328d1fd9cfa6c7f5305bc.npy +03325088-f403e37ca7831479b362845c6edb57fc.npy +04379243-1c38f1631efaf9fbaccd05bb6a369505.npy +02818832-1619aa637cbb6e131ba2f806cba87b47.npy +04256520-9500ae0f745fc9efe5b815c86e529aab.npy +04530566-ecbfa1faba336185bc33bb3e21836dd7.npy +03001627-e425c1db44d1ec8ac73ddf48fc777dc.npy +04468005-bd06d7b322a2c65147367565b9fdaec5.npy +04256520-38fd2710b8fd5eceeffcc073d8ec38f6.npy +04379243-a65dd1088e44917b93edb2fe34609efb.npy +03636649-c99eaaeb9b941af62ebeb1e6a8111f53.npy +04379243-2889aae96f0b236e27790b0ec8671f7.npy +03211117-decec5d8e1f9f54e1a5295d0078b5d60.npy +02992529-953a952a18e389e4eb386a4e845c05f5.npy +03001627-a5a5d118118eb760fee31d33418a3c16.npy +03001627-c1e03281b9f179c7620365f6656fe3.npy +02876657-542223f09a872e973858be97087c26ec.npy +02808440-b3af478264146f6ad9b53420a5458c53.npy +02691156-cc6041868bf2913312b981fe5abe4a07.npy +04379243-11ff78cc42de92ca597976c675750537.npy +03593526-3a6e1c3f0755d58d774ba10f0bcc178a.npy +02958343-f2b28cd6e6eaa9679393793f9cf3dbea.npy +02933112-7aac04fa0361f0da2f8bc0d6e7c6775.npy +02958343-5057c9dbf72e0352728fa2df514c65d4.npy +02691156-43ddfbedbd6721fa828204947d78b9af.npy +03636649-bfd36d77ecdb0c9de76bc197b3a3ffc0.npy +03691459-88842eadd96e5cab570b6bda9783c8ba.npy +04256520-81018f492277b7649f13e3294f6a3574.npy +03001627-b3e4c494a862986b9226550f5173ae53.npy +03467517-f3500593f65d37e5817f6c88302b2a8d.npy +04225987-98222a1e5f59f2098745e78dbc45802e.npy +02958343-8aa9a549372e44143765ee7ffdfef49f.npy +02958343-687253f72301b508c9c0a46cc4ca6589.npy +03001627-46c6d2fb8c92cba419fb4103277a6b93.npy +04379243-be06e77602ee4d089c0ca344f487323e.npy +02958343-4e9a489d830e285b59139efcde1fedcb.npy +03928116-7ab2295c441170a967aad4e7f685c416.npy +03790512-88950eedce83a11ad4fea43a014cf734.npy +04090263-65aab903355c7abeb4cdad9a5bf52dd5.npy +04090263-54b68b9a4c40e86b3da3f9c40ebeed54.npy +04256520-899a328f7c0292c5998b2b87439f61bf.npy +02933112-1b212b67e5eb90f4da5feafe6f1c8fc.npy +04530566-7a9ad733a68b93bbb1bb46d2556ba67d.npy +03001627-44c25bfcff4a4a4e4dea158f05aae320.npy +03593526-569b55cfce8c4d15b136b011ae1ece0c.npy +04090263-191f8debadb867fbc24d00518a3dd6ec.npy +04401088-e11ff7bea65e8545c3f912172873d52f.npy +03001627-a7aafe44f64dd04dfc6afbc561d74a4e.npy +04401088-c5188dbebddbad3597cfb99c9c9efbb5.npy +02691156-5e124107cb94b90218ad244e2cb2c6cb.npy +04379243-c7d36b8a4b79f89dc963b248f3fa9d25.npy +04530566-bffc229892a3d301c8bb4876165f947c.npy +03928116-479f9b6c9cbdea649a957a60b2bcc479.npy +02828884-b9eb4b3d3ed564142427332fd13e1534.npy +03642806-d8ef2a8a3ccff3fa5cad2ceae48f2da5.npy +03948459-800cf19b2f7ce07e1ee14c0944aebb52.npy +03001627-cd9812c163ddfb3e83bcab979449e28e.npy +04401088-4dfc1e4efd7fbf083cdba96133f0c38f.npy +03001627-f4a36a5ae5a596942d19175e7d19b7cb.npy +04379243-89142ab0273740f221bdbc0445d9f748.npy +03467517-ee7d5c8cd074b18992eedbdd14b936d.npy +03691459-c2024c0fa0906fc724abfaa350249967.npy +02691156-ade0163327c8c7f5847335355bf4459e.npy +04256520-7e550e32d80421aa19fb4103277a6b93.npy +04256520-1e678fabd0622a1119fb4103277a6b93.npy +03001627-d7ba3ad07551c886a2c9d2062eb4aba4.npy +02992529-759c984fa6831ad7bf0defeaa770e93b.npy +02880940-f44387d8cb8d2e4ebaedc225f2279ecf.npy +02958343-5130947e5f18e73a8321b7d65a99d2a.npy +02801938-7b407dedd933e3812f59b845f0db2ab3.npy +02958343-f374adc8c35b9a0b3eb5f91920765edb.npy +02992529-9dc1088c4f5de29ac78df40cf2e9097a.npy +02808440-40d7753fce9bec3c3321831d2245cf06.npy +04004475-83b080e6ea2a46242974cfd5336a9b09.npy +02876657-8707d78855e8cce1ed51290fb4dc2857.npy +03624134-5aaec976445f88662b994aa4e028ede1.npy +03642806-24721e62300a3c4f98be7382d7a678c3.npy +02808440-3e2b33cffce8fc632dda19453ee07c6b.npy +04256520-8258954eb7929aa13542091189dc62b5.npy +03211117-c0c1c344c3bcea10c0a5099af057718f.npy +02924116-2f77c7fc777f8b11665c5daec82c51b2.npy +04090263-60efcea872fa7e52341b8a806253912c.npy +04379243-5aa1db3eb76c53aeb660da28fa2f03da.npy +04530566-3e5147f0fcca2ed7c2920de4c5efc2ee.npy +04256520-de91f9457052646eb658faecaae06eb0.npy +04379243-307bdd2a06137694a10ff7fd5e43a633.npy +02691156-d2815b419e61dbb0b87697d3904b168b.npy +04256520-526b961864b9cb0ca81116f5456ee312.npy +02691156-5cd68dfe309e1f8317e5bbee411fa5d0.npy +02924116-7031bbf89b4c551b66cdb417aa9cef4a.npy +02958343-67a3dfa9fb2d1f2bbda733a39f84326d.npy +02691156-ab399dca637174fb9a4a28ef635593ce.npy +03636649-18ed152bad2c123b4b3c42e318f3affc.npy +02958343-1399eab8ad7262eb7f3efc94c2d31dc5.npy +03636649-65f23d07991128e3fbb8cbddab1c2002.npy +04468005-f12ab466f3c74189b1112c737944f1b6.npy +03467517-e45f323ce7ecab8393f0194265a9746c.npy +04379243-3fa4ca95ea2c3d4649a734174fea032e.npy +03001627-75b1bcb68c8344261a648655355dc699.npy +03593526-d5ffa68a7be137ab157d60b585b8fb6e.npy +03211117-52387a90d9aa2fb019945cdf27c7de1b.npy +04256520-4fbadccbdd689b18b8708912bd92e115.npy +04379243-e8632c8830944cfe422be95e44ce930.npy +02691156-3a7e89dc355faac111f5789deac2dcac.npy +04379243-8e66fc32d49732c4eff311703ed2e9b.npy +03636649-2cba43cc26f174a8f9a65dcd8ee605f.npy +02808440-42d7c051c1e771ba3956bf2322987dd4.npy +04099429-beec19e75ba3999a46f4fa69a8f7f711.npy +03001627-c31a206ddb92909e84f0c4075db76b7c.npy +02992529-504c453471faee3ee304974abc9afad9.npy +02958343-45186c083231f2207b5338996083748c.npy +03636649-27910c314eadb1109998b4eb812699dd.npy +02992529-937b3450c8976f3393078ad6013586e7.npy +04379243-1e3871159daf135370bc652a18e29c3d.npy +02808440-8634d5d3fbd559c8c49077a31b9f504a.npy +03636649-4242398ccded25abd3ba76930e17ffc8.npy +02691156-82a472004d00b288b4d569aa61960548.npy +02924116-5b04b836924fe955dab8f5f5224d1d8a.npy +03636649-1e0bf9701623f02014038d588fd1342f.npy +04401088-b87251d1d4f4b7ab2c216c5e0f221195.npy +02954340-6c607b6b3d6fc1cdf0d11ae402ef940e.npy +03325088-270123ec327ec824c36fb70296e45483.npy +02958343-7f2b01a53684e72154b49557f8ea8b42.npy +04256520-9c0c2110a58e15febc48810968735439.npy +04530566-fcb92e30085a580d9c6645849b3b7d65.npy +02828884-7c335945340c674cefacb264ebf1ec75.npy +03636649-f46d1e234c05fa4e62635f8519c19a80.npy +03593526-e51ccd45d54c9f4225e65d4b5f3b6456.npy +04530566-397f37249263000990960087ed86644.npy +02691156-c14ffb40a37074ed26360e1e29a956c7.npy +02958343-e2d98e5fa33b5b0daf8a2e210ebd5168.npy +02808440-686dd1bdc574ebd152b20f433bf30081.npy +02691156-7feab568d879270dd8d90babf3c5509a.npy +02808440-ceba3a37ceb3f3cf798df87163b1956c.npy +04401088-b8555009f82af5da8c3645155d02fccc.npy +03001627-6015aaa9ef170d9bfdef1c01cbd4ae0c.npy +03797390-daee5cf285b8d210eeb8d422649e5f2b.npy +02691156-e08574959d2cb7c8f6cabb305f7d6d18.npy +03001627-c0c823f094d972c94b3c42e318f3affc.npy +03948459-d76b953813ea5024dd3adf3090c701f7.npy +03636649-24927157e3a53c1f91cb6b6c47a03f13.npy +03001627-1e7bc7fd20c61944f51f77a6d7299806.npy +02933112-70eddd0ddf5c9ba21c1b3b2ed8d13bf8.npy +03001627-a81795209ce65006ee0f4a6e5ea1d8c.npy +04379243-901eb5d8bab4bbe48fe31aea3727611.npy +02958343-572edac8bce600c56f2b832ee4c8c232.npy +04256520-b5b77de7a8a05ab4f09df371fae9d63d.npy +04379243-28fb3bc8ab9f518035836c728d324152.npy +04379243-51d196f6b12a84ddac594abb03ff6297.npy +02958343-abbd90920a240df2ed3696d854eee1ec.npy +03790512-acd49452b452cf2f3ab3dfa44f5fab01.npy +03593526-595e22f425839eac2d4b0854f7611ed6.npy +04379243-e9a38d17361a5f20af268f6180933aa3.npy +04090263-e42d10c193cce254719aed4531d5366b.npy +03467517-b6d2d35747549a5b93f0194265a9746c.npy +03001627-475cf49d3764f04ecc8bd7a04c9659f1.npy +04256520-b1db7a545796dfedce59ea70152320fa.npy +04256520-2358a67773472af0826fc8d57346a2e4.npy +03691459-3187862d922b0ce96583871b5c274818.npy +04256520-c40adbdd817cdb7a14038d588fd1342f.npy +02691156-e5c98b67c146cd61e816c75152573ee0.npy +03691459-945805d18c0de73ae3e30e20ce3a5bf5.npy +02691156-a80a6ec94928f7dfe87d0cb113e517d2.npy +02828884-6b47fc9f533618719c8ccc4e539799af.npy +02958343-2696ef55dc264b8cbba9b483d5f3874e.npy +03991062-1b10d9cfe0211e8dd31520fd3c5602c7.npy +02691156-645b2bf682e865ab9a6e43b878d5b335.npy +03211117-ff2664a07ecb6edceacb155f400b9076.npy +02828884-46b3e857b7faab0117f92404d4be5d8.npy +02958343-21205bdb7ca9be1d977e464a4b82757d.npy +04379243-ee43ed656acaf774f4b6538438a0b930.npy +04379243-7ef03c6cfa3621f8ae46e333ff78e5b2.npy +02933112-21ffe8bb21951feb5c8adc541f88498.npy +04530566-a49537b465965537fe3128d27fad4d2.npy +04530566-3750fdd9ef7f941d2173755309fd0db7.npy +02691156-2b0a2bb1556c96b94f762cd8ae1b1c4b.npy +04379243-121a3040c28295829e4b5aa807bb4e7.npy +02933112-25d7aeb2970030371733347bc72de5f9.npy +02933112-4d690cd9d3b41f46ce5d6e9371bb5c33.npy +03001627-26908ca3183b5a4223500a5b036df62e.npy +03211117-31512a50c12258726ca2b6e5474aad11.npy +02933112-169d64acd930adb12871cc0b3cc1a485.npy +02958343-ae9b244f9bee122ba35db63c2ad6fc71.npy +04379243-3a85ef469535f0542cc8fcd230a7f687.npy +03001627-2d8f0977b9c6592ffebad4f49b26ec52.npy +02871439-4b9c35238db89e93464280042b597d.npy +02691156-45a4ec99ed13ed773c2498c4c2f13ca.npy +04256520-f8ccc92a6a5d20875eea3e3d89293379.npy +04530566-31a41e6a73c5d019efffdb45d12d0585.npy +02818832-642a38b553a520c03f7f3ed2c3c690fe.npy +03001627-2b70fe0b5669985c100bd20b85b3554.npy +04530566-65b75158bb049f5af647317afa6ffdd4.npy +04090263-fd2435673c53179dd1a62290a53cce98.npy +02933112-5edc6766196953a28f62bdf4e9082924.npy +04530566-f91e712b124915514b6c44ccda750d2e.npy +02691156-a39880327ac8815e62b600da24e0965.npy +04090263-465746159129abc7c0d38eeb2893c7a.npy +02924116-317907b3d4830c6db7e4d3ed6e9e6394.npy +02828884-84e0619bd80f5455880e561fa6db53d8.npy +03001627-46743849f0b01b1ca72559fc4f86f700.npy +02992529-128bb46234d7250721844676433a0aca.npy +03001627-c04c5b7d68b4e6481a68dda91fe5259.npy +04379243-bbdc08f4f00c484f310af74324aae27f.npy +03001627-95d082c78ea0b1befe52ffd0e748a1ab.npy +03325088-7832af11012adbe7b229726a165222c0.npy +02992529-313e9b124e421a4efa9922db9b6aab31.npy +04090263-7bb85cdfb1794a5712b38b1d99376c0b.npy +02828884-1f239e55de52bb63eefaf3e79e3e3454.npy +03991062-67bc9bec05f78850f9e08161aea27d2f.npy +02691156-e1be99a614c85c3e2016648502c798bf.npy +03001627-e9c99b6af129c22cf91663a74ccd2338.npy +02808440-f8d0cc0680f502e98eb3bc6c6d15f9bf.npy +04379243-b878329d1c965d195f9efc5cadcb44d7.npy +04530566-7ee49cd8ad72bfd2c620cf302459a7d3.npy +04256520-eaff5688bb49f845ba41eea807f5d3c.npy +04379243-c3135e3b21b42e132449009b96f8a6ed.npy +04256520-e5b0d8cabce54f524b3c42e318f3affc.npy +02942699-6d036fd1c70e5a5849493d905c02fa86.npy +02958343-3bd66fc2782bd2019766e05e7d6c9088.npy +02958343-e128a506f2e29a6796cceb824e3c56b0.npy +02958343-ef77d2e622786026d32bfc7a837f790.npy +03001627-8becb5888c900f3a610c2a68437007d6.npy +04256520-a3604a6631bdd53b593ebeeedbff73b.npy +03991062-3de068a04b96e3a3bc5996932c1238cd.npy +04379243-6d31e827bea8e970f198b94f669bca91.npy +02808440-7e8cc52fa74c26b4eb1f243bab39fb29.npy +04379243-6a613281bac861a49dbf2f762a644724.npy +03325088-1bc3c767ecc9323c3321831d2245cf06.npy +03001627-fc99c80f588bc88d5a6be9e325f087ce.npy +04379243-c76d9d9756b8bbf2a86b2405ab6de30d.npy +03001627-5a80c5a35dc1634db87028a4b477349f.npy +02808440-d51e086b0af8815d412deb0d2b0f3dcd.npy +04379243-4c7faca525777be32f7524c98ee0fc42.npy +03691459-23907d5a2bec2ba6ce029fab54b6cfbd.npy +04379243-9c4afb731e910d3723500a5b036df62e.npy +03636649-e7287ee25156053773ab7b7128d466a2.npy +04379243-28ce06aa6f25b39f2d19175e7d19b7cb.npy +04530566-1d6bcf04874000a9ea96bfd37cd8bdfb.npy +03001627-9225e57e34334ee019cb07ecb5b4102.npy +04256520-f20e7a860fca9179d57c8a5f8e280cfb.npy +03001627-e325f573905ff945b8183a4a81361b94.npy +02942699-e85debbd554525d198494085d68ad6a0.npy +03948459-d84c25bf4f0cb029537e3f6cd50ed63c.npy +04379243-accdf18e9eea0dc31191025061735ea3.npy +02958343-8c346443d2feeaf916abce8cb03e7794.npy +03636649-ddb951343304bf1f351d9ca36f76b95.npy +03001627-c8f5189b54fb3fcc6c518c577d808035.npy +04379243-7543553927036b0352b7768d51b257d9.npy +03001627-7d0e6a5c10d2f97c62e682c9809bff14.npy +04004475-a8c41f725d1dcb8ec8bb35fae3b41809.npy +03001627-4a9d3ce54c09a2da696b74614952b2d0.npy +04379243-d5402158d5fb9fa8c283ca2c9df7372d.npy +04379243-ef62dad7755794a47558b47f7ba0b0c.npy +03211117-f3004c5b38bbc0e445804144dab4dd66.npy +04530566-5a2bdc97e9d6683077f1d7a36adeef7b.npy +03325088-5068487242356027b362845c6edb57fc.npy +04379243-89975eeeb0a1313e4b3c42e318f3affc.npy +03001627-90d35ca55b35d56dd5883ca9b41ac387.npy +02992529-b1d1d6a5f46a30894884e1105772427c.npy +03001627-1c9d7e56ae8c90c87ac6ce513ae497d3.npy +03636649-e1c49baf0a79732a7eeca6709b6a824e.npy +03691459-11c1c970e9cae04183ef95920b2c145d.npy +04379243-978a4869d7fafca74b3c42e318f3affc.npy +03207941-687c09af50c2e5f5db2f7e7d8b44c8fa.npy +04379243-8af35280574ac141bf7ea2059cd7e422.npy +04379243-8f7d16c0303d8cf4593ebeeedbff73b.npy +02828884-5bb40ee2f4893358d4d8765e3910f617.npy +03636649-527212b174a5313fdd5616230e7f3c5c.npy +03642806-6b61ef17b4f45050b598e8984f11eb0c.npy +04379243-fe22668b577f0cbe88e99eda7bb1ee8e.npy +02958343-f2e433cab0ddc755ca3ba83abff10be.npy +03001627-d66fe5dc263064a2bc38fb3cb9934c71.npy +04379243-e3b585b15506fa7113f96345312df593.npy +02933112-36853ef4167300c86e5b9257c4084ca2.npy +02992529-4157af4a11fda8ebdd3d821abaa89276.npy +04379243-4e8d9f4bebd6a97670553da2430bcd98.npy +03642806-1ce688d90a2010a69718283200011d2a.npy +04379243-12c8ea55000707be8ea4cedb988ff461.npy +03691459-f88ff1c46ccace6d5392678120123c42.npy +02954340-dd2d95b294a7a8b4fa5b6212657ae4a4.npy +02828884-c97683ce5dcea25ad1d789f3b2120d0.npy +02933112-31de44d559904485f51f77a6d7299806.npy +04379243-f5d6579b3a1f5a879d2be74cfb51ade1.npy +04379243-79d5aff74dbfa0c2307557ffe40d48d7.npy +04090263-9c8e406a5e198529282dd3b430ec2654.npy +02691156-86c8e75179f00b725b7d3d0361fc611b.npy +02871439-bf961e64ff78bc7e664b3b9b23ddfcbc.npy +03928116-e963ffa0699ae9e45e244aa0433fda37.npy +04379243-92dccb2a3e6445d5c790d7efcdfb5239.npy +02992529-bd7b84ae3b88bd5cd2dd279a9538db3c.npy +04379243-586edb4eba5c3c7557ab4b593540354.npy +04379243-c827c0d4ef212f2b30cb1fe6fdc7d605.npy +02958343-355e2c8d8d10e8227541c0a826e78e18.npy +02924116-bb292224e499052641cefd10ce5d6cc0.npy +02691156-10af5de930178a161596c26b5af806fe.npy +04090263-5bb02bd49d2ce6e590b94f57d8818348.npy +03593526-1dde51480f0c5474a38859fd71bee28c.npy +04256520-48acfed2c1f2d42cbd16d4490a10a752.npy +02924116-a2859adca84473da892e7ae844e0da5.npy +03001627-19319101e064eb1019fb4103277a6b93.npy +03691459-c1ad8720fcc7246a1fb294203c64a4b3.npy +02691156-a726f95306ce6e1071616ead796bdece.npy +02942699-b22e56fdf18e2eb8968b65a7871de463.npy +03001627-ba9ce924d452795f519259b5fe9bdf5d.npy +03211117-7b0327ed7286487623ab4519e0263310.npy +04379243-87af702a9a5370aceea6a5a0ebf81e97.npy +02691156-75fd28838e0fc8cf5b1edf5d4f643136.npy +02828884-85ab526dead09ffd398e68bb81784a80.npy +03001627-8757370fa33bc4e9419786e9c37fabbe.npy +04379243-50c9d436169103249cd431573238602d.npy +04379243-74c3d551e32a1cca664b3b9b23ddfcbc.npy +02691156-5aca1a2ca9143638b129901f80d24b7b.npy +02691156-d353b227b279804190b1d6deb98feec6.npy +02691156-af6cf1d2b6c00b1233de69c9cd670995.npy +04256520-1bb6224360321002b8bd10c3418cc648.npy +04530566-5f7c0e4368784e795dbfbfcedb83d61.npy +02691156-521eab9363fdc2a07209009cfb89d4bd.npy +02958343-e5aae7748aac94086228d448ae07dd2b.npy +04090263-206b4a7aff5ae78ecf61781659594ce4.npy +02924116-dabf9de698fe00716464444786faa32c.npy +04379243-dc3a90ee32e36cad43dbb6421d614c0d.npy +02933112-4cede87a6ca6bb876a485daf2a997e28.npy +02924116-193572f57626a97c65e6a15e0a997e5c.npy +03001627-ef45086ec881cb657288e3849fb636ff.npy +04379243-45c5ee611c73b90a509330ce00eb0b20.npy +03938244-c13de90da6f6744736902d83e4cc385.npy +04256520-19b9fb3d3763cd1e4c4a4dca0a101f1c.npy +02691156-7fedb48b457ee9f31629b98cc1b1b992.npy +04090263-70871551850d47c2823acdd521e722d.npy +03001627-e9effe5159dc66673b93a3cd851adcaa.npy +04256520-2715a63f41552d6c19fb4103277a6b93.npy +03001627-ff8921eb06e95b9cfebad4f49b26ec52.npy +02958343-346917af7c9659e3814085552234c955.npy +02876657-f47cbefc9aa5b6a918431871c8e05789.npy +03001627-4c3f655507cc6aecdbe9c90af547c85d.npy +02828884-1b0463c11f3cc1b3601104cd2d998272.npy +02691156-8e2846178e2976fab96212c8f6cd06e.npy +03467517-81bd0c7a35a147988cc3ae4061da3bb0.npy +04379243-9d9d1a2c33b32c2078aeec4d01b034df.npy +02747177-64393896dc4403c0e88c1d6fc3580355.npy +02958343-64f940ade3f61f976a106c3e1a10b659.npy +02691156-e9ddadf335adac52e025e00c738da634.npy +03001627-c9dd1e508be23628d0176f9a144100cd.npy +02801938-6d21c75bbe308322513c73fd461b230a.npy +04379243-5fc0812f8673249aa6a7b6e78d8d5bcb.npy +03467517-73368b2f443e51661082f2ea630bf69e.npy +04401088-ec39e26f8c0829b3413ef77469a0f9cf.npy +03710193-2008a48636a98f0d4f25f5ffbc4463cd.npy +02808440-519390da89f5cdc83321831d2245cf06.npy +03761084-d5739ed3034fd2551d5c138748955e00.npy +04256520-c4a70ab37043efeb14038d588fd1342f.npy +04379243-47164255adb1efd5fc54b7f07479f415.npy +04379243-12a2733fc5f6b31ef8574543281e850f.npy +04401088-54539e30a59cce413864ee650d9e9c5c.npy +03691459-5787e7156ddf7a2adfa0db1c1e10ab1a.npy +03761084-bf6914cf309077cc575f4e5007488531.npy +02958343-c8ab7f11ecdbf873921cb81cb1632a5e.npy +03593526-7b97f7b6ba604173fec8ec00010848b3.npy +04530566-927c8ab9d2603aec2d4fe9f5177af0.npy +03691459-4c43241d7b30eee379e6d136097a1329.npy +04090263-2ec617c22f8a1c7d96f12bf103d650c8.npy +02933112-6723be3b8435e27bb6146c7a77e1b943.npy +03001627-5e94fe6e318670d310da6117f2797a4c.npy +04256520-716eba8ec4825ecb19fb4103277a6b93.npy +02828884-9ddf92e8ab113b77a98ec10fab84d714.npy +04468005-5ceb4a6a1e9c2378fef210d199fabae3.npy +03001627-39ba09c13d784741dcfbbf65ff959eb1.npy +03636649-cf280bbec8017c26655715f3c8480da5.npy +02808440-5d403d56f762fab7b362845c6edb57fc.npy +02691156-7ce6c64ab3a45504dcc75fd1795fa3a5.npy +02992529-3a3fb2919b1bd92658c2dcb60645f75c.npy +03624134-de69d6441bbf8d39230a4d129580843a.npy +02958343-ba817f535c2668081f757787330d376f.npy +02871439-bbddf00c2dda43a2f21cf17406f1f25.npy +03001627-b58b8a4646d14b7c202339ec5396045d.npy +03467517-a591dc6d2760a4654177e158c403ccd5.npy +04379243-5f32ce6996fadc96b3f49378110b01ba.npy +03001627-4bc064672eb85023d84a8130bee3aae8.npy +03636649-19171a11ad8bd9d5411a00390d1cd315.npy +03624134-8592840d350b7cd4b9282c90175ec706.npy +03636649-13c127aad3fc8e6af51fa0238791f5dc.npy +03001627-2463439444134401815b2b467e8e2eac.npy +04379243-8381dcc6adaa7752b7d9d23574a480ae.npy +02954340-3957332e2d23ff61ce2704286124606b.npy +03001627-e2c16ac7606317b3e85a21e38833ddcd.npy +03046257-8c274f1ac64c21afd820bb9763a8af96.npy +02958343-3ef0d561be7aeb3080275d4a88484513.npy +04090263-383bd13aeb390df0f8edafa0d47e47db.npy +04379243-cf24f0128755080569080f7eaa8f3e1d.npy +04379243-ca56e6241a3c762a391c070c9832629.npy +02828884-76958ab9aa25d309c9eed7651b77d0f.npy +02924116-d2be14011f8c99231e06124bec25a766.npy +03513137-59c1f0cc533e57a7d44412b02a9868.npy +02942699-147183af1ba4e97b8a94168388287ad5.npy +04530566-a492984be2c03294213a43a25cd73264.npy +04379243-f444ea9df9132a3616a2b5862518c93.npy +02828884-b272113ac712ca012055e892b9798352.npy +04256520-c22b660349b21edb246c4171f2c393b.npy +02924116-d6779395045f32b5822461519ed909c.npy +03001627-9d961de6d462a7619fb4103277a6b93.npy +02924116-5862a13f9639f1ba44f19502064e0a74.npy +04379243-fa0ee25a0c8109639f5f9b9f432d1ba0.npy +04468005-42e786d44eae54dd52470de2774d6099.npy +04401088-b575152bd96a4dc4adf82b2748b1cb62.npy +02691156-e06d3e6c1fb4b208cb7c15fd62c3982e.npy +04256520-9dc28627bd03a2201e606a18cee01990.npy +03948459-cc84594ad18e16bf154ac598883c344a.npy +02691156-9d65814e1b252fb01636caafca838500.npy +04379243-94f83fc24106e39f782f27684f3b650c.npy +02691156-bf57639c6735626282b3aeca5b3e7150.npy +02691156-b5130ad12f6db8d0c83b9fdce4d2e0e7.npy +03001627-f4427ee23d4d51fabbf98dcec5f11066.npy +03636649-2a52bd01472ec7e1589ec67c01f5c1a7.npy +02828884-8ec231441abe44a05e276f6574cfbdbd.npy +03691459-67b63929a6fc3804dc7d80effd6f43c0.npy +02992529-e13a5d5b3f7581cbecf207e73a787c06.npy +04530566-e3e2bf1879ec9298c711893477336d39.npy +04379243-5d819ba4e21208ac2b5fb024f65f6da.npy +04379243-fe130356df1977499c2a886f3b75f1ff.npy +04379243-f5ad10e6a938aa80e85c7a030ebdf69a.npy +04379243-c71fa66202239b58d6de1645a30c4052.npy +02880940-4967063fc3673caa47fe6b02985fbd0.npy +02828884-41e1774c1ad94df4ad5067eac75a07f7.npy +04256520-337f25da3cdae83bc7660a81296c2300.npy +03691459-81a096b49d138bca1125e131b6efeea1.npy +02871439-a79a38419ae817fb3d2900ab7b1f5d81.npy +04256520-a15be5686c875d703201317d7803c43e.npy +04379243-26ab5349a902d570d42b9650f19dd425.npy +04379243-e49636394d4b0189523e5ffab409f73.npy +02958343-8c1b20c4c37dc679301fa882a9655049.npy +03325088-a695ea6dcd5e85b03321831d2245cf06.npy +04225987-99aef9f6486d3d90b267718342f3f316.npy +04379243-d20dbb223dc5e26e6e4d44229ea605db.npy +03211117-f84f6c14852ddad1d06e6be4f8954ac.npy +04256520-6a5f98654b75a18c593ebeeedbff73b.npy +02691156-6420a3ff5e526d59e16519c843f95ce0.npy +02843684-76ea6ce7dd6c1298805346b85ff6b7a.npy +04090263-cbe8debb3fa41f716e96d446ae30c673.npy +02933112-3b307c9b473270a1c59350d819542ec7.npy +02691156-5f9707e5f6b820275823df672991ed66.npy +04256520-8ead2b6ac2726710707cdefe012d0353.npy +04256520-fd181390f71ec72478ae896933c670d1.npy +04401088-722acb5e8ccd39391e5d846d206adf3d.npy +03691459-dfc0bd9721814628a4eccbbe9e05e638.npy +04379243-3b0625a3d623a7decfbec6fc6446a041.npy +04401088-4b96f974453ef59ea2c7c5886f4bbc93.npy +02933112-f6d2550b82c208b012de5317fe5b354f.npy +03325088-1a5586fc147de3214b35a7d7cea7130.npy +03001627-3dc252fd90d82b18c9be65dfbd21428b.npy +03691459-c3233311a94b7b968a0181490cb73cbc.npy +03001627-bdd57499bf64fab6bf80985a99195eb8.npy +04379243-6a436b27484166629f9a7ffc9bd1e3fe.npy +03928116-23cb522f8c3dc4b15375aed1ce49c448.npy +04379243-12e2dcbdc199f0ef8fbd401ebc04b5b4.npy +02924116-741f329be4ac607c63c2b7a67ee8957c.npy +03001627-6beb16fbb2337f65936c7265c890fef.npy +03790512-5de5e9abd5f49ad7468bac13e007a6e9.npy +02958343-7203130a35ab20a4b1bb46d2556ba67d.npy +04379243-f2743fb608c502abfffc97a61124b1a9.npy +02958343-4cce557de0c31a0e70a43c2d978e502e.npy +04379243-b31a613e7f289c8bf5f6997e99549136.npy +04090263-2229f60c2819cccda50ef3fc203c6ba0.npy +02958343-471673f3f062abd473f10e6caaeca56.npy +04379243-5d93e285b2006520ab610b0c94236463.npy +04256520-40a6ac0c94ae686e8dd711af5650bdcf.npy +02946921-e532d6bd597d4e91e3e4737f6033f0f8.npy +04379243-4cfe758f926fbdf2f51fa0238791f5dc.npy +03001627-2f20894566c681e5922309b37ed10e7a.npy +04379243-60c931dcc6d0982944bda2555d37e46.npy +04379243-85d5a731ea4865c1e258f9dd9d42f6c9.npy +03211117-bdf3dbf43ef2637f578d107c71db28ac.npy +04379243-8b612b06a3d668eb67dc575d3328bcb2.npy +04530566-1e3400a7a099823371feee345701e9eb.npy +02871439-e48a1bc3ed228765664b3b9b23ddfcbc.npy +02691156-c581942f40cbb60819ba010ddb4974fe.npy +04530566-65e21949247e36a541db137505613210.npy +02691156-e94ad5f8e53a255a8fc2d09ac4aa4e78.npy +02958343-1ad321f067ffbe7e51a95aaa6caba1d3.npy +04256520-3946ab8df54210ef1789afaa92d90146.npy +02958343-7b2dcc7c4c879e9116f7ad0d1093bd39.npy +03211117-3fcd048b1daedbdeac22ae9309c09ec.npy +02933112-9f88eb11fd20541b4f759a9b042055cc.npy +03991062-aee91e867dd2be3ea2c59a4d90e63212.npy +04379243-3ebb9bfa2afb2f8c9db5a91069a42c6a.npy +03001627-19c8189116dd7cd3e95c611687989498.npy +03691459-d46c71be46696b1d41ba258440d3e234.npy +03991062-1163604f205da98d7df9613e629232fc.npy +02958343-5721c147ce05684d613dc416ee51531e.npy +04379243-c05033de978da9dd5de04aad18bd94c3.npy +04256520-a8db9db73bb5a4dbf51f77a6d7299806.npy +03467517-cb5b2e3f499e4fdecc571cd3cf8f17a1.npy +04530566-2b58ca08b8f93769c5408f4f799fe72.npy +02828884-59cb1f3c7476a5712056b4bd5d870b47.npy +02958343-de1564379b1315a3efadfa67efa023c.npy +02992529-d406eebe0342fa8373acc74b15c67e07.npy +04379243-eece94f60e91c3d819fb4103277a6b93.npy +02808440-89eec42ca751ce883321831d2245cf06.npy +02691156-6a9b8fd1f4ddd87f152be1f5910e33df.npy +04379243-84a3c87bba5a472af51f77a6d7299806.npy +04401088-52494d36a6d136f6b34ae4286be3d813.npy +04256520-7ab84ec80e11d03fe8daab4fe9011efe.npy +03790512-e9c34796e3c9e46939e8ef80333dae6.npy +03691459-f6d6ab4f49238452b45df535caecae62.npy +03001627-e6b77b99ea085896c862eec8232fff1e.npy +04530566-bca8b526924310bae8d6be23f236225a.npy +03624134-db7be6ac02bf5e48e2bb19fbad3e4596.npy +02946921-10c9a321485711a88051229d056d81db.npy +02808440-7d4c5f150ed81e3054d7082b34825ef0.npy +02933112-c00edc704ff4b133da27ece6ae88fff.npy +02958343-5efb2b4cda03da10e047028ded406033.npy +03691459-11f5f6311449da7ebb01628f533af3ce.npy +04530566-358bac5415f0773941d6cd38228b9631.npy +03001627-92d87019793c97c636c8b9bf2576aca2.npy +02808440-b08eb2a2c20e681af51a9050d9136192.npy +04379243-227308a94bc7b231e5490ac94fb8e485.npy +03991062-ad58ba1e4c6dec3b5d8d4d8a3cf8b294.npy +04090263-62fea07f4f7a6bfc673a614c45f3afe4.npy +03001627-24b5d56b254cb1958b424343280aeccb.npy +03691459-d17192339d28af3234140f5d5f70bb2c.npy +02933112-74126116f42f09e2e6e130a30b5ed875.npy +02992529-c6ad139da5e0799c712cb59213324f9d.npy +03001627-fd9c60e969f83e6086debb0a33c851f8.npy +04379243-1a442af63ca5159d86478bfcc70b1bc5.npy +04530566-83d2a7a4cd616008e19ccaf2c9aa161d.npy +02691156-e005d8b297850d483a99ba0078ef7bd1.npy +03001627-ea8ace071a8ffc2a50a1e454933067.npy +03624134-4a0ef45e02210e47914c738e92faad58.npy +03928116-b7b54152e58fdee6bb4d99f9abe880cc.npy +02992529-237b8445c70b1749ce2eca356a0e3474.npy +04379243-375652536313a1c2278f90ef85162deb.npy +02958343-9aec898631a69b6b5da1f915cad9a74.npy +04379243-aeba3a81cac0687abf3f8e8aa5b07c2a.npy +02958343-fe61764c0552c837d76439fb95cdd2ed.npy +02876657-e56e77c6eb21d9bdf577ff4de1ac394c.npy +03001627-a631fb1b054697dcfd8aaf214a1df4be.npy +03211117-79f26b0be635b891631d57ce83092826.npy +03001627-eaa4ea82bc814005e6fe3612af521500.npy +02691156-dea43c46fdbe84511adbb4c4e06ad649.npy +02691156-ce1d767436d9b289e8ac6b4e1f12f978.npy +04468005-734a3e7a655fe3afeb34db531a289b8e.npy +02828884-71ab9fd8db7ee09a59cbde03ded257fd.npy +03691459-4a1ffed169f04f5fd084cd4069686980.npy +04379243-9e068a0ec94cb7dbf51f77a6d7299806.npy +02933112-11f59587596e3bf1a9958063063ce065.npy +04379243-9f3d4541c2754cc2a516ad65be981ae.npy +02958343-b3047118a9b0d7b7e858db1dc3499392.npy +03001627-78386cc102c6dbb03430d3d86b335afc.npy +03636649-b401155fbc54313330f6e0ede20c4525.npy +03001627-711d131beebd279cf0102d4d10f82457.npy +03001627-86b6e539e72be6d46fa0ab61d9f9d96d.npy +02933112-90c2b07e831f5e7fc75178c2e93f5b68.npy +04379243-a4eb161a000b159e2ddaf02885ddf74b.npy +04530566-ba1b46458170afa57ae1c9ca63d5fd92.npy +03624134-7b492f2baa1dc710cc34b900bb2492e.npy +03001627-37cbc18323826bfb19fb4103277a6b93.npy +02691156-b19927db257219bb26360e1e29a956c7.npy +03790512-543ccc442390ac8ad3e27012e0feb9f.npy +03001627-bf3c02f71de0260a8dfc31d0ab372d9c.npy +02924116-6f92698b7e495df56b61c956066f9ade.npy +03636649-2df234af39ae991afbd43c84cd4013f4.npy +03991062-cf1dabebeaf02912a2c59a4d90e63212.npy +03467517-c40f68a092baacd133d89feae811d3a1.npy +02828884-84d3224312b9630465826cf0dd1f6a6c.npy +02992529-6bd7f7a17a7bbd2d68acf22a03600648.npy +03001627-b197d9b353a923cfdbbc9440457e303e.npy +03991062-dc39b65c9ed54544debefefb2e8c0245.npy +02691156-3e8fc3155bbc4225c1ccec171a275967.npy +04379243-cd4357aae286fb57c5f48f9175316bec.npy +04379243-9e58589d9f3dc4f24b3c42e318f3affc.npy +02958343-efd9059d23b9c01f46f8ee02bd8f9824.npy +03467517-464c2b11e7c9ae87241535bd4c40391e.npy +03691459-508e66670fb3830c2cd6a352b52d97b9.npy +02958343-d80658a2f50c753cf1335b4fef92b83f.npy +04090263-7da59289cc7eddf7c92cdb7e63a33179.npy +02958343-8402d2237afac94a1cf6f8e565096a1e.npy +03001627-1028b32dc1873c2afe26a3ac360dbd4.npy +03790512-6e1397773a4d15db429f1c522640e6f0.npy +04554684-8103431c1feeedcd42163310d48ef535.npy +04379243-7421abad75caa60a299938728adfdc7a.npy +02773838-10a885f5971d9d4ce858db1dc3499392.npy +04401088-e55ef720305bfcac284432ce2f42f498.npy +04401088-79912d77eb2866af4e964633a1b1c39c.npy +02818832-73d8ed364821a2701a6208c41cfe5c77.npy +04530566-4cff5eb82cac0f56b7b1411b0ad3bd0d.npy +04401088-b73398902d1c267b5eed8c8b1cd54386.npy +02808440-5015f03078bd60f8e219859c1bc1bea1.npy +03636649-8c8ab9d274bf85bd7054f829b1ba8eb5.npy +03001627-956063d67b939431f56aa11cd5e0c3e.npy +03001627-6bcabd23a81dd790e386ecf78eadd61c.npy +04379243-63e37e8a29ee34bab277610811e28cd.npy +03001627-3a1b54325b3565e72ca4b544d68c52.npy +04401088-41f5caf37dafdecc5dcb6feb4bf8ce13.npy +03642806-d91a3191d427bf0467710679e532af1.npy +03325088-67525c6f3d27609f4091462be8a295b5.npy +02818832-dc5a7937cf3d5ce2d6547ce8d3c3ea11.npy +04379243-6f835f3532151c25c2a21be00e77ae82.npy +03001627-408631c881e3b33cefb90719a33cc920.npy +02808440-882ea3f99bb9e7703321831d2245cf06.npy +04379243-f8e3ed6b09b50d1d7f890f73fae19325.npy +04379243-b606da9c4be6e6106cbce046ef0f1d8f.npy +02933112-1700d057c9e0c88cc59350d819542ec7.npy +04379243-299ff1bf2618a4b584b039efed4b32d7.npy +03337140-7969fbbc3d46b46e4c3aee8e9d3a6ffa.npy +03636649-374ee0d01fb25ecc9bad7d7f6ef7bb21.npy +04256520-bf01483d8b58f0819767624530e7fce3.npy +03624134-8bd5c4f395695ebdf40d02cc9d84a93a.npy +04379243-9a6ab25d91c92a5a35acfdef2ece21c0.npy +03001627-3f36e261cc87648ac3bd24f986301745.npy +04530566-ab52de94b627af794c0b957b7129452a.npy +04225987-36aaae334d636ec28043db94fbc8c982.npy +04379243-575b467b6ebb2f234eaa3180e8182d9e.npy +02933112-cc9194f94951cd934da5feafe6f1c8fc.npy +03991062-f15c66948002dec0d7f470ee20dce9e0.npy +03001627-6601d179e754149e2f710dc8afceb40e.npy +03001627-a07b5b7014264e0330e06a011e63236a.npy +02992529-c7fef6ae7f7f91814a0be3d856af9ad.npy +03691459-6a864ca4b19aca77645b6a2a45925e6.npy +04379243-5555cf0638339605f0fb3e3d2a0d34c9.npy +03001627-1ef99f4e735ceabad97996b11dc03f35.npy +02747177-c18e807ff9858a51fb016d9401ff3e29.npy +04530566-294283d06ca9a9abfe755e3418b63110.npy +03001627-3c02356c918f7365b82b2bbc752d3ebb.npy +03790512-48bd19f7d6a20c5c52ee90e577613070.npy +04379243-7f531dece49aceeb4d1bf4af7e44abf.npy +03211117-350da53c8b5dddcde2313f5ca29127ab.npy +03001627-732ee6a49bd6db06aed393947b9cb125.npy +04530566-3e03e3d547d6fd9e4ca65624f18b38a2.npy +03691459-b6d83532d5479753bdcc14b36549ecc3.npy +04468005-2733ac1f2b34bf4b0b2e6e63122009.npy +03636649-6c96c1bcd2579c259b12350e98805eb9.npy +04379243-1e4a2ed85bc9608d99138ce6d9b8fa3a.npy +03001627-4a636d555b4f9492e27790b0ec8671f7.npy +02958343-d4512a374073ae95199f3841b86452c3.npy +04256520-b2c62e5b20b34fad5844a4d0ab925627.npy +03211117-74a99b32b562fcea7fa29a3ea424473.npy +03636649-e94273de8e52f9f896a3517f50eeb9f4.npy +03211117-2f1975216fc24c5e572bfae97b5793b0.npy +03636649-72099a83e9a058ace715cd506e17332.npy +04256520-2abe8d5b5d29ff52f7628281ecb18112.npy +03325088-3beb681d384c32a076d20e73c57c9a03.npy +04530566-8e4fbd72746ed71c20d966555ebf57d2.npy +03001627-79fd9633635ab7f6490ad276cd2af3a4.npy +03001627-efe76021aa616a41f51fa0238791f5dc.npy +03467517-798c7b38b096e7cbeccd82bb51193a7f.npy +03325088-f48e5d5d88b9ece98a1a0260fe4e4cb9.npy +03001627-baa8760ca5fbbc4840b559ef47048b86.npy +02808440-b0d95b98cc9ced8bf82d285b0703fe12.npy +04530566-5a8c1f3f0ff3e5a87bb222726cf5a84c.npy +02958343-719487aa97fd9af513345bcbe0ee623d.npy +04379243-3b334febd0aa9ba7b20aa91e9e90c311.npy +03001627-fee248777c9c4807f8bc1f8036e08e44.npy +03710193-f8ebd72bdd49a43b8ad4a36593b38a9e.npy +03001627-8cca53295cb61e878d3e8783b997c75.npy +04379243-3ee0a3bc5e7af23d1bb088904f7cb154.npy +02958343-f55e967e8617484fe565b03326f48ebc.npy +03467517-38eb9bf1f02d192259b584008b480e22.npy +03001627-f14a2e78a93c559b253b862f13dd465.npy +03001627-4e0beb356493c9cbc862eec8232fff1e.npy +02958343-ebe05fb264a56628d7ef29ade0716b6c.npy +02992529-2eafc16c78c43b35d9f7ce5b19e46227.npy +03624134-1a1a5facf2b73e534e23e9314af9ae57.npy +03001627-64d5bd4a6af3da16327289c00b6dc9ca.npy +04379243-e8ba9621aef9395a3019620286259e2c.npy +03790512-b179e7e416edc37086b7427eea4d0f22.npy +02691156-7826147390af0f9d1fbc781ac25c5c7a.npy +03325088-a515d60008ac9cd5175c399a4380a866.npy +03513137-a452a0857cb46b5226eabe1cca3e850.npy +03636649-91c55497aeec1fc55e29ce2c9d37b952.npy +02958343-13d090612aec3d80ca92a4cdad802b45.npy +03624134-79505790e5d8365f4948b6ede15604a1.npy +02933112-663cf5c8c88a187b6fa3ef67a69ab460.npy +02691156-a1c3287d5e847f866b7bd17e458d0dcb.npy +02958343-5bb7b111a3835592531e940de4b7770d.npy +02924116-f490a8ccde2449b4e0361fcb3204da3b.npy +04379243-8a1f9d4a36baf4fdc563fcc2752ece39.npy +03211117-a4dd6c69ac130db6795284068bb430b2.npy +03991062-10de406de3078873a2c59a4d90e63212.npy +02691156-1f9b49f320eeb2f5d0226d12d397045.npy +04379243-4ffb8579bf17a5a7df253edc1fde0322.npy +02773838-d3bd250ca3cb8e29976855a35549333.npy +03691459-3a0747975c07896f1ad88f716ea80910.npy +04379243-1e202e618d6375052945e400e1430726.npy +03001627-1b5ae67e2ffb387341fbc1e2da054acb.npy +02933112-4b6c7f81adcc5f7e4b8710a3469971b1.npy +02958343-344eb3613a1100634591011e8f7af9ba.npy +02828884-3ecf8f8f3b24350bbd17a7d75b77705d.npy +03046257-d76b2c36bcbf8fd7ef76898f881b76a.npy +02691156-d281db2c631c0170991ade27bbcf967d.npy +03790512-d8ee11cff3188479e7299bc85dbe3a65.npy +04379243-fe82d64b0268ba75febad4f49b26ec52.npy +04379243-4292e4bc1f783b399c409b26b1e9e946.npy +04379243-7dee34ea0b8cefe8668ae11a7db5e82a.npy +04379243-4eb3c0cffaf389fac3bd24f986301745.npy +04256520-c6956d32c9748c746c7c6307622a722f.npy +03001627-200324d0bafb1c2e19fb4103277a6b93.npy +04379243-f77643cf323921d7c6542d86974f9497.npy +04379243-dd8693cd2fbb5a0c7d0efae8dc996b9e.npy +04379243-212476fd8bf012b1e3ecbdfbb6709c74.npy +04090263-908d00034bfb9a8d5d30f6c8adea5674.npy +04256520-a627a11941892ada3707a503164f0d91.npy +03691459-ec9938becbd706dc8dcc38f589890f0.npy +04401088-5fea05a3cdcc05756dba92a4e2177102.npy +02933112-147e9d3591cb190829a50a2b3c5e5b6.npy +03325088-4befbb7f5548a835fe1bdd3c0c9e9c3c.npy +03325088-f988ec7ece669319b362845c6edb57fc.npy +03636649-5f0c4dd6cfa0def2e59f529cd1b6faa8.npy +04379243-9d4b8c8d26c3be06d269116c7276660.npy +03636649-f40c7b19234b07c2c8687ff9b0b4e4ac.npy +04256520-7b5e46d1cbe7c2de7d92b0739e572d9.npy +02958343-ade5514c578e4bc27dc9e02a5c320eb.npy +04379243-39f30c279e085ae41683a1f2bb7ab319.npy +02808440-304346a133b9153379d57ee14f8ee702.npy +04256520-7eeb7a4c2f3f1a0505babec7f39a63c.npy +02924116-646785d05ef7921d75dadc997718614d.npy +03001627-b971b6c16dded4fd44db5bc086b2ea47.npy +03001627-b021f7d705c4113ac7bed72580dc30f.npy +03211117-c9a56fbe2d5d735f9daa2bf0c68f794f.npy +02958343-1a1de15e572e039df085b75b20c2db33.npy +04256520-4aba95b774b2cc2233ea3991d83e660a.npy +02958343-363ddd7ab72bd485be40bb45ea25a041.npy +03624134-3837fb44d414845630dd2b88f7efae34.npy +04256520-f653f39d443ac6af15c0ed29be4328d5.npy +02691156-971ef250f2d0cb389a6e43b878d5b335.npy +02691156-d8452d4fe51f2bab3554ccf8c30febe7.npy +02924116-f1d9503cdec875fa876becae6fda7069.npy +02818832-8dc13611a04e2be9deeb06780e8a81ea.npy +02691156-c6c525a71215dd5a459f73e379ceb540.npy +04379243-bf77a1c8a520eb6deb0fe7d6b5545a1a.npy +04379243-bf886e6f28740776f1783a44a88d6274.npy +03001627-98a1d709dc51ba87870894bef54d428.npy +04379243-19c8ff25264b77666716685cf333d2c1.npy +03001627-41b90d1977ef7672b9b8f177284f45fc.npy +03211117-dd6c708c87d7160fac6198958b06e897.npy +04256520-1579af0fd3cb306154b2f0044ac86c5f.npy +03001627-18005751014e6ee9747c474f2e537e26.npy +03001627-d5e1c6d3e6ce16ca8f5bf896c08c419f.npy +02691156-2e468cc6afe2da70bc0909d98a1ff2b4.npy +03636649-5830c288acd8dbc5f71f6713526f9507.npy +02691156-f8647af0b1ad01445de04aad18bd94c3.npy +03001627-5ab7fb2f11d26c1c291743ae4bc47673.npy +04379243-74ca743e2ba959f56623a58a6d7bc060.npy +04256520-33db94c3b6edf1efc3bd24f986301745.npy +02992529-68ffa3cd161114cf55f5bce8dd67399d.npy +04256520-fc3350236b25f198f2b841e334abcf20.npy +02958343-fb97ee1707f495bbdcff2899f073ea9d.npy +02933112-2950d1baed4dbd78c59350d819542ec7.npy +03001627-79397634d362eaded96cac5d008c9fc3.npy +04379243-6661ae18418d7cb28965f16c5573871b.npy +03211117-87d4b97120598dc54e6185a07ec22996.npy +03001627-4a2766bf63caa24a4abd5da3f5ea2512.npy +02958343-27d42437168ccd7ddd75f724c0ccbe00.npy +03001627-45828c176099f3c3d2f92ecc75b4cb66.npy +03211117-8a4cbeb489904fe3083b551ec2a5aa3.npy +02801938-547b9fbe28ffae9d5f9a06467b1259de.npy +04468005-51ea5a8f915a9dab8050d454347bac2a.npy +04554684-9b50ed5a7b980dea4572fbc715b752ca.npy +04379243-8256e81768151f74d931803ebb8c8c44.npy +04401088-d7ed512f7a7daf63772afc88105fa679.npy +03001627-8c1c53ff86f59a97d2f33aaf794b5932.npy +02958343-dadcc1200b43a12be8b7f81712644c1e.npy +03790512-b91b7ff8ff1b59c6a88e8cb97b773125.npy +03636649-17fb3b85fb6bf1d74888a07f79e95b66.npy +03001627-ecb53ab8eeeb43d31246538126da07a8.npy +03691459-5e9e7b6cd01eb0edbdeac9f0a8ab72fc.npy +04090263-206d81abdbdbbb5c63d83c622f45f33.npy +04379243-3b7fcc7c030ecd496062e86c1d0c60f8.npy +02828884-89e2eaeb437cd42f85e40cb3507a0145.npy +03691459-e5a6dfbc6e89ba42bbdf3c5f28fe5d98.npy +04379243-812665596d6c13b1adeb1694faeea26.npy +02924116-bf187619d212dd102d42c1e28ea24b6e.npy +02691156-444a58c4c6bfcd6c7a571401e6605fc2.npy +03624134-427139e42c842b4fe931b9a85fdc07c.npy +03207941-36b0dc42fe805430991a1c802df98c78.npy +04530566-a74f3cc7adbdaad2a072c5ad67cebc91.npy +02828884-c03e7f08edefc17a5b28ac1273e4dac5.npy +03211117-717d3ef4c7000c5917a27c3fa1d3566d.npy +02933112-b4e35d962847fb8e86d53ab0fe94e911.npy +04379243-bf9674274a0581bb11632b225817c709.npy +04379243-2633f011b236a8979070b65ce7b4b532.npy +04379243-fb3816ce98c668157e22078abbbc121d.npy +02933112-9a24860d7ea8d54f109097154427f779.npy +04090263-2a70089aa6561ce216cf8b1cd2155e02.npy +03636649-7324c25be8ff5cd74725f67267e31c89.npy +03636649-44bcb1ec762af23b8880edc6251fa529.npy +04379243-40a7ed7ce8ba70fa4ddda47ee90d6a21.npy +03001627-2fa4a8a5848f9223a10fbdfc2fa57509.npy +02958343-dd5eceae670f164ca134736201a79843.npy +04256520-68ae06512cfbf4f95fc186cfb5f359d1.npy +04530566-5a6439bde2204588fc3f5f3afbd6c5df.npy +04530566-aa05992294efaa26a47eca0fafc43370.npy +03001627-f4e5698718f3d4494311a07b696e63e3.npy +04379243-e41da371550711697062f2d72cde5c95.npy +03636649-2967944ae64112c11952fef39dab6347.npy +03001627-39de90c34ab1dd3f327289c00b6dc9ca.npy +03001627-75ceda9606ede8d2ea98d69e91ba870.npy +03467517-4bd2492d56d6b8c537b5646da91e9ed0.npy +03636649-a3c6ef6078045515ea9f23f235ccc6.npy +03001627-a8b5f5b6bf0cb2d6876b399a99a15c0f.npy +03467517-6d60470e9e402861f18228781f85571d.npy +04379243-e758e1b760f185e2593ebeeedbff73b.npy +04530566-7fb484e04409f7323f3cc56bc9bfcde3.npy +03325088-b7c6df3b5836ea6a76d20e73c57c9a03.npy +03691459-6751b5616193e6908219b633b364ca6a.npy +03001627-374bec02e71fe06528b4c5ec471dc963.npy +04379243-e87136a7996cc5c82d6b4fb79c7b302b.npy +04379243-56a57ef7c3385c9f2f38c0d2792fb5e.npy +03948459-e318098b6a42cba14968c6db52a4c95d.npy +02933112-544fbd4d4c1d445498a4820926b2a786.npy +04256520-cf571875efbd60fd3d2617f9171b5ccb.npy +02958343-e4cd5b3cbe9082f536699018d15f07da.npy +02992529-fd1dd7c841cd9cf51f05b3da5aad55f7.npy +03636649-92c8a795e0dbe340145fa6babc33219e.npy +04090263-8f5da7a2501f1018ae1a1b4c30d8ff9b.npy +04530566-f8ec76f3861f7c68b76982957f05710f.npy +03001627-2dd729a07206d1f5746cec00e236149d.npy +04530566-2722150ea003017d7fa575e221973fef.npy +04090263-8d1cddda904b6f363a842af7a220e7d.npy +04379243-2edf007c0f4542554fa8d6439169bda4.npy +02933112-8b63c8e0d3959c961e1dc6d433ab6c3.npy +04379243-b34afa23c47c80db7422d2e1b1d40882.npy +02801938-29880fedb8770d6ce51e3cd2b72fbf02.npy +04090263-f7cf0e4395996803ed901abec3fdcc06.npy +04256520-160887408a65f88f67903707764646db.npy +03636649-86d7a728dc35d634f800b597bc1c1eb5.npy +02691156-5763ed16cc79ce63dc0a4f5bab755bb6.npy +04379243-34c0ef1a944d5443e2f1733877da1c63.npy +04554684-3f60bb32239ffa303bf7bae2651d2cf.npy +02747177-2ee841537921cf87ad5067eac75a07f7.npy +03001627-51ee5a84b4afc40be45ef4135c266a12.npy +04256520-dd9a138fd557c44f4a6b6d001599a1e5.npy +04379243-4960515bed0e76c403c7d0cd70738a3.npy +03691459-5a115cf7e21d34d249d7025d277c28a1.npy +03046257-a939cbfae7bb05effeb1e532f4bae7f6.npy +03636649-d47f0a026f66e2f24b3c42e318f3affc.npy +03001627-d1852e622204dbb0f4b6538438a0b930.npy +02958343-7478c015f1814c0728ccbb4eb8965b05.npy +03991062-f04a8c4946e7941ad0d7efee165f0a98.npy +02691156-fb402a36e91ab1b44e7761521d3c6953.npy +02958343-8b74a58c28cac774753d1d86ac1bdfce.npy +02958343-721dfe60b48849ec7ac8cd969c3298ce.npy +02691156-a73be4c48272735df64801ad2940cdd5.npy +04379243-10cd74fb0af8021fbf7cf6012a0af9fc.npy +02691156-751b1e75fcd7f1deffb814dfce3ab22e.npy +04379243-e62c51fc96e9394a647d4fd8d921152a.npy +04379243-e17121f04e884edde480eba094ece03b.npy +04090263-c5874d1a3b616a641703868bb196594b.npy +03636649-da64c56e36024add5b903ba10d2ec446.npy +02691156-4ba7b11cd496e3be69176f0174b7620c.npy +02880940-6118da3aa071921b664b3b9b23ddfcbc.npy +04530566-e93a47089f5c03fb7220891f188bc420.npy +02828884-60287e7894707cf9fd074351be80913b.npy +03636649-e333f7f89b74575e9a5046bc3786ad19.npy +03761084-67e4d0cf70b87600ddf024f7de40d58f.npy +02828884-7dd37767a253f98d56f6fc4b4ce1db04.npy +02958343-5ec7fa8170eee943713e820becfd99b.npy +02691156-b8ce3803485b620b2c674305897e1782.npy +03337140-5dd48360dcb573d291c352d02061b3f7.npy +02958343-d8f813278a49463db203f960004c7382.npy +04530566-64ccd647293ba2a75e73d168e741c7c8.npy +03001627-4b01dfb6fa24eb4c4b3c42e318f3affc.npy +03938244-c898517ee2fab5ace3f7a74e12a274ef.npy +02691156-23cb6abc0705de4ba5a118bd15e6e34f.npy +03797390-71ca4fc9c8c29fa8d5abaf84513415a2.npy +02747177-91d6f4726d1a169d924bf081da6f024c.npy +03001627-411291d56a967d9fe8b2b8dc0c816caf.npy +03001627-56e194146b9e584b3321831d2245cf06.npy +03691459-8f920f26ead4d592cf66d96a8426fc6.npy +03001627-4ad06cdc2f8929f44733824eae5cd9ae.npy +02871439-b7474ed0e4ac46cc3599bb3238bd1beb.npy +04256520-8d15fdb921ba675af592707fed2e148d.npy +03001627-a50cf70c56091637e6fe3612af521500.npy +02691156-a0bca89b37e69d349f66d5781c13189.npy +02691156-519f1ddcbf942a76a71b0c9b506dc672.npy +04256520-785ba264dfcf722bf284a86ef67b13e6.npy +02828884-1bdfb8796887adf92056b4bd5d870b47.npy +03691459-8080831f18e0cbe1b22b2ae1c9a24291.npy +03467517-c951a1ad8a90e3c344cbf4f97fe3744b.npy +03001627-fc7e2126419f5a4cb84959963148f2a2.npy +04530566-9c4ae8501ef74e82cffae3eeba6126e6.npy +02691156-76b492b77a03882d431e5b4ad135fb8.npy +04379243-1bba8d173012111f5fceaa39a8353bde.npy +02880940-9dcfab1fab6232003bec56bff764ba78.npy +02992529-7ab7f36fa3523a1a33c7b6ed91d531bc.npy +04256520-9e4cbc2bb68878b57984fb9ec7e40829.npy +03593526-5d636123af31f735e76bc197b3a3ffc0.npy +02933112-aac3c6db20d3248579cea75b38cb7ce.npy +04379243-d5a7ae84e93368c28b015826dff11d35.npy +02958343-b2e36774150b580e21f6e2b0f75cf9c4.npy +03001627-91b8fe4616208bd4cf752e9bed38184f.npy +04468005-4a5c80895fecf3b3c51d8e07a45cfa0e.npy +03636649-a2f760540b18eac2dbde8847d3101230.npy +03636649-9f07035e2ff0e5946ef2faffa907bc32.npy +02691156-cb744ec78dd320efd2c2bfa672ed621f.npy +02933112-9029a5f19440d04e6b19a27bc4c01b1d.npy +02691156-7db10020f24a3232abf03860b8d62488.npy +03001627-30e8b5402898334ef4b6538438a0b930.npy +02691156-676e568ab8e286ad67c54439d6177032.npy +02808440-575c40e0d9d3f2d75ac2d26bd5b040e2.npy +02828884-92e7ed09c8d265e5cb2a965e75be701c.npy +03001627-632a722f9edbaf607b11ae648ea92233.npy +03624134-2071c9e5fe60e5886ba5f56f5d8b6131.npy +02691156-62ebe2dd7bceccd097f28f82dd9c77a2.npy +04379243-9826f7752703d7bd58cf2448c6d2934c.npy +03790512-d94a099c6a1ca8def4cddc55888e6926.npy +04099429-b333cc1b0f35943228eba1f0b7744e9.npy +02691156-1ea8a685cdc71effb8494b55ada518dc.npy +03046257-160f24d660e3183235836c728d324152.npy +03211117-d1ff5895420a205dba1a3bdff265e174.npy +03991062-3d377597d4ae8f38a3b06ba374e12b77.npy +04256520-2b1f1929a6a5a6517b431cae0dd70ed.npy +03001627-a16b8de490656d03713decb1a0563b12.npy +02691156-a1ca5014ee1048081e06124bec25a766.npy +04256520-e1e2ab3bc1d604752b4aa1e18549d620.npy +03636649-b5b728ebd7c0833530f6e0ede20c4525.npy +04256520-f0e243acfc5605bdcadbe66b40c67b2a.npy +04256520-cbd547bfb6b7d8e54b50faf1a96496ef.npy +04379243-4b548d4f399066e1c2f0a1a44c64aad4.npy +03001627-91be45a6b74f2fa283b00891f680579.npy +03991062-f012c87f43047ac015d2b72e86737c92.npy +04379243-696482ce58cced1044b0115560181a7a.npy +04379243-dd468c350fc655eafebad4f49b26ec52.npy +04379243-a8d59c4b6577b9eb37a0eda928b574d2.npy +04379243-a25141a07c77c25467de2aaf749e5256.npy +04379243-6c27a2a85e8d512ce6c5cd45aa112726.npy +04530566-3283111173c12947622984b5941cfb8.npy +02946921-eac30c41aad2ff27c0ca8d7a07be3be.npy +02691156-d2f8a99bbdc387c8c5552bebbfa48bd7.npy +04256520-b251364a878eb5fca192483aa282f8e5.npy +03001627-5faa205b9355a66579ae41e1ea899b06.npy +02691156-47821cd2309d5a3990b1d6deb98feec6.npy +04379243-14d8555f9a21f341edf3b24dfcb75e6c.npy +04379243-6a4bbd1a2d533741849f98fb0b88a16a.npy +02691156-7279a912e89a6f00adcbeb54f3d014e9.npy +04530566-f7b13135feabfbbd91347c63d1dae43c.npy +03325088-458b641a644595ecb362845c6edb57fc.npy +03001627-e4b0814cb9a34107efb405803527fdbb.npy +04256520-a930d381392ff51140b559ef47048b86.npy +03001627-98ec1c46805977c33b48a711df82173e.npy +03790512-f4da1640ad370ce2468bac13e007a6e9.npy +04256520-45fb33cc152121a97b8f528a5a7a471d.npy +02933112-6c6e14968b5e951de7e684d25d4dcaf0.npy +02691156-7eff60e0d72800b8ca8607f540cc62ba.npy +03636649-31d93627f2fbf86dfcb8d8c6d4df8143.npy +04379243-b34982af1d6e18736b4393ff6e4e0f88.npy +04401088-198557f515ecfe73f3c5246a46375579.npy +04256520-70be13428e2a6eb1a789fd2e20dfbbd.npy +04090263-8a0a85f55ffa4a13269c192b79bdefe.npy +02992529-bcbf0ce42d2b0f91abae9246594d3f7d.npy +02958343-90c4864afa329be1fac5c51be36c9fa6.npy +02958343-75c4085b3315688aca92a4cdad802b45.npy +02808440-202920053729ecd1ccd0340812259a39.npy +02933112-cae4ad6aa7d0e49df160c00ab31497df.npy +04256520-a2bd385c411aa690c795085b4d203932.npy +04256520-222ee8debd39d5fedebd258f4352e626.npy +03001627-67c866143e633daaa6fee8e2140acec9.npy +02992529-8ef2182a6f91e71e7877a964f5722626.npy +04379243-3c079f540fafa7e13b3db95ce254f64d.npy +02691156-61159c0458d41ac8e341b5704aa568bd.npy +03001627-861251082f0935c6990561fc34164364.npy +02828884-82071d0daa90cc15ed98cca8f0ccd5f7.npy +02691156-57937c7ab42260ebf119374ee5d5f944.npy +02871439-d4d6afa83861d9c9201432a6a5e88038.npy +03001627-a8f21e581e687c0fa329355bc8cbc0b5.npy +04379243-b7bb5f021d40ae59f7b4b759a0c02e4a.npy +03467517-653405d4777d063351c29c30f86deb78.npy +03001627-2a8554af80cfa5e719fb4103277a6b93.npy +03691459-8d5064233fdf0624b6d9c2cee7f2f72b.npy +02691156-26210ec84a9c1c6eb1bb46d2556ba67d.npy +03001627-72d0cbe861a7de2de4f382dec07f365b.npy +04554684-5e04ab0e24e0882272a5adfd0bef5d10.npy +02808440-e3da3660529c4986ccd0340812259a39.npy +04379243-b9cdd373211c1d406349f6b5431fb3d1.npy +03001627-86c4bc3f46e1bf7bad179769eda42205.npy +04379243-3bfc7947fb8abec5d925b06c8689bfe2.npy +02876657-ac79fd7f10f274aba2c59a4d90e63212.npy +04090263-209b87f6aa188df0bce41980429512ac.npy +02747177-84ade133b55dbde550da8b99982a3057.npy +04379243-dfe0eb3f446059d0500cffceffd2bd2b.npy +03046257-896f36a9b765fabb504721639e19f609.npy +02691156-a60569e3e80d24939bff604afc480b65.npy +03467517-f182545f81b6273f92d73a7cb82eabc7.npy +04090263-9b2cead73808a61a508db6f63303da32.npy +02958343-c6dbb4874805a2c6c2998c73c3c35adb.npy +04468005-b1ab911647c2e39d510791503ab90b79.npy +03467517-d63a56ed4f0bb9aedb43638841a7895e.npy +02691156-c8a7eab796be432d5de04aad18bd94c3.npy +04530566-51b25c88fd90ae2b57c58fd0f9b1d74.npy +02828884-c65b1fe1cb4ec230262cc3347c0f3889.npy +04460130-8ceb7f6e170f793f38cd8eb23853c009.npy +04530566-de010f7468ceefc6fcfb3ae2df2f7efd.npy +04379243-f9f9d2fda27c310b266b42a2f1bdd7cf.npy +03001627-9a5b54e835c762e4f51f77a6d7299806.npy +02958343-605be4facdcdfb194dcb1867559ba976.npy +02933112-a65df9374a1492d7fff2ea4466fc1c5e.npy +02818832-5e930124cbecf7091da03d263d0d0387.npy +04090263-afab3cfa9a8ad5f55dec35fda9dd6781.npy +03991062-ae33867e3c5e1703f155d75bbf62b80.npy +02691156-5d1594f792f3641583a1f09b027e5462.npy +03001627-fc7d038dc7fe2911a75d03186a0409e2.npy +02818832-b8d3510487f019a76bdcd672c2b17215.npy +02958343-f66a6fe34a80b0fbe7540f431cab4686.npy +03211117-97870c19256a95acf5f79806bd65844f.npy +04256520-c1b8d982d97e337f19fb4103277a6b93.npy +04256520-7c92e64a328f1b968f6cc6fefa15515a.npy +03001627-8ecb9191ec41785b351d9ca36f76b95.npy +02828884-7836a7015159442980360680c1602c7d.npy +02958343-3bf15c48eb9110d16abce8cb03e7794.npy +02828884-5cbffd78e4cefc3038330212e10bdbc0.npy +03636649-3deedc86a83bbf23f647dc544bb0ab61.npy +04379243-438f44f223f116e3c2a9901441a2941b.npy +04090263-7da8e9ece43c210e44b4519fba3aa36.npy +02924116-41a74616fe8dab5f88b61e9125676b2.npy +04530566-1994120ab63fd4fa3df8f4ac45647158.npy +03593526-2fc5fff977ac930050b92125e5fcb8ac.npy +03001627-94e289c89059106bd8f74b0004a598cd.npy +03211117-602570deed9cebea66ae7844c5fcdd1f.npy +02958343-a077e24f8983d3d3476c231adfa21265.npy +02933112-92c111f0456557c14da5feafe6f1c8fc.npy +04379243-febbc5702f304c16f51fa0238791f5dc.npy +02871439-a372136702c46b0250a059086f5706fb.npy +04530566-ecdd85e25c18ea404d73ca91c97c0cb3.npy +04530566-b1ed34ab6779919510f652915f26dbdd.npy +02924116-498d3ec19a132718bda733a39f84326d.npy +03211117-afda884544124320642ac1f4cab4f5b.npy +04379243-b8ffc016a4e080a6d2e5fdcf2bc010e2.npy +02958343-6b79cfceb6f614527e7afb83f93db294.npy +03636649-fbcd17479bc96e0a899bad344dc01f2f.npy +02828884-ec4733130fe285d03d23022ce06f940d.npy +03001627-7263fe53bb4601efa37f3fc191551700.npy +04090263-1345ba2c3b27ba786bb9681d4604e123.npy +04379243-7f7d80803ccc727137b816e68e48019c.npy +04090263-75368dfd449ea1d729712ea5520175b6.npy +02871439-f7eaf1291613f3932ade7345ab5b0cf6.npy +03636649-ebd783f677be6825b5495e8609a528b6.npy +02691156-56c79a936f57ef3f7b164268a44f7712.npy +03691459-f6954ca2e4c2b03c67b2ae8c967fcba0.npy +02958343-714d3c11eaa39f106e28ffc6e1f368fe.npy +03001627-3e5e00868a2dfffa7a31dd5af93fdb5c.npy +04090263-18598beeeedb20729a6e43b878d5b335.npy +02691156-a3a3a3d2ccc590eeaef99de91a3e555.npy +04090263-69e884912b10faa880c2e60c312b0f09.npy +02924116-3080d86e8424187d4d44f5db04bf14b8.npy +04256520-9d54e00d9428c07e76e9713f57a5fcb6.npy +04379243-69689176b53be82df51f77a6d7299806.npy +02924116-6ad564360b6d18e814d1291d9f969ff8.npy +04256520-3d0aea03fdbcbcc1dad4c6b86f1850a6.npy +04401088-e8d826158072a6bf1455397a420729a1.npy +04379243-a072caf10178224ad038992c6975ea76.npy +02958343-aa41aa1837c809e1e12eceaa46673a5d.npy +03636649-16258409337ee2914a200f5f1797d729.npy +02933112-4427e5eac495c14e40a7c7e360f68f9b.npy +03001627-7380789e95676518e7c7920f6a65a54d.npy +02958343-6471b4eccdbba210ba9a2870774c1424.npy +04256520-117c47d75798788a5506ead0b132904c.npy +02933112-a64be5342dd3c9f782ef94da039e491f.npy +03325088-908bae8a91cc3af72a38aae7db90ad57.npy +03211117-8f032c701a2d1de772167aadb6db5f77.npy +04530566-4a523f749fd08ffa698137c717c4ad11.npy +04379243-1b0dadf0e60a563b3671949e4f99cc76.npy +03001627-b5b77de7a8a05ab4f09df371fae9d63d.npy +04379243-6e29841d23d6a8a06cee93ad801259bf.npy +04379243-9f286ec40676d24e3dfc74c6ca03fa25.npy +03636649-d2c124b8c6a888fedc7a10bd316015b2.npy +04090263-e66332d7d5d35ad1871adec4b4ff0fcb.npy +03636649-635a3e20af086ce8c0a31f7b214b7805.npy +03991062-d30095f634231fda2c59a4d90e63212.npy +04379243-fd7a4cdd680495c7dbe9c90af547c85d.npy +02691156-7aac10eb5b285098774a720fca15e35b.npy +02958343-5c29bf38845b4ecbea0f3fb9c87b9c6a.npy +02691156-bc2deb55a1c952beca9f0727e23831d9.npy +03691459-54047a2d59ac5eae3ef7ad0f5cedb0e3.npy +03636649-9fde9f07e6217b7490c2e24416edfe5b.npy +04379243-e6b3255eb51908a53c99073e1068144.npy +03001627-5d6a45296fa6c1ff7c21c7b1e8b3e343.npy +03001627-7fcde5fc8e023dd2a6fee8e2140acec9.npy +03948459-76e10c1cb25e814fe7d6f3ee02d4059f.npy +03046257-e78af014ac35bc68f546596ce7364503.npy +03948459-1660ef4b3f20b1e2a94b922b533051b7.npy +04379243-34105c5e1e64f66b23eb3ad3d378722a.npy +03001627-bc523df998d94c7223ac0bd64c9cb255.npy +03001627-66de742ac6ee931390a9ce3e4b15521e.npy +02958343-110ab054cfc351f46a2345809e2bb169.npy +02691156-177fadcfa6b4a8346aa3bf023a2b42a5.npy +04379243-52c2b3f2ee5b3519febad4f49b26ec52.npy +03691459-ed981b60651d5ad8265d1076b4b6c5c.npy +02958343-79febc9d103c4d1c247a5be450795511.npy +02828884-aef0765eabe46794d2b12aa6a0f050b3.npy +04379243-41eda879e1b7eee2dec2e3fb3c73544.npy +04225987-ae28ad55a38200ff1c5f9eddd7cde6be.npy +02691156-a20db17555286e06f5e83e93ffcfd3f0.npy +02958343-d569a1b7066ce775b738b317b28286f9.npy +03001627-3a885865c614a5a35510d59f3ab1ed64.npy +02818832-f388c768c0511cdff72f7a2cfcd9c0f3.npy +04379243-23d4170c7a0a2a014b3c42e318f3affc.npy +03928116-7aa18769bd5d996934d6aa31914c287d.npy +03636649-e97ef0ba839e1e915412c66cb6f267da.npy +03001627-beae73bea87f36a8f797b840852566c8.npy +03325088-60a6cd1194397b4bd3acd54d47e688e9.npy +04379243-2a0676c50108be8842d09291b1705b96.npy +02958343-1cf17a1e1841d10c9e6a3356df3f3d9a.npy +04090263-df2cec0219c10e0ddae3730658b53fef.npy +04379243-a9504a750945231f91bed99343331f7c.npy +04256520-96e21b275c9bd83bec7cbf3284585a40.npy +03001627-80dabf9ddbdc92f681806e3880250dff.npy +02828884-84bb6a30b1c5a87be008ebe8273a693f.npy +03001627-98ef942e35e90be3de8d5f2cba401802.npy +04379243-c6591f825c72dc6553a2cae48abaea7d.npy +04090263-8caf6dcbdebba2221326f2506129299b.npy +04530566-bd04c982ef479f160014fe834c82238.npy +03691459-ab79e12684746d0273e1b2d018c0512.npy +03467517-5238adec0790595930c206f77b5cb4d0.npy +03001627-33c4f94e97c3fefd19fb4103277a6b93.npy +04379243-1e60953829fa7e0530bbd4cddd04c77b.npy +03325088-21c83317b5617925b48d1e811c2d60b8.npy +02933112-9524af09747661fbe0f91080da8431d7.npy +02958343-cb0bffd770644cebcfd826dd468a5497.npy +03797390-1c9f9e25c654cbca3c71bf3f4dd78475.npy +03593526-546025d656c166562887a88b1b446ef8.npy +04256520-13b60f5be9af777cc3bd24f986301745.npy +04090263-35f61b951ad15590d2a0074bc2b80d37.npy +03207941-6f006ce5ec9c41029a8ef44e1d2c5b75.npy +04379243-775b3e38da839158ecab93c7630e9242.npy +02933112-caa4f65053f07a64548804f91c2c5c3d.npy +03991062-19042f85f93a8b239f7e329438453d00.npy +03211117-93e260150e7788ab574b5684eaec43e9.npy +04379243-aec823460d983866d23df9ad1134a651.npy +02808440-fda9e9a38854dcb72101dcac4ed75d3.npy +02871439-97bd21b29826854a23500a5b036df62e.npy +04379243-cb7114df1c8ad743af04c22d77ac98f.npy +04379243-41d9b3064aca3c74e7d71bdc5700ff8b.npy +04401088-c1c23c7a80e4bf388c34a8518a7b6811.npy +03211117-dbfc22d7d096f66d5f1b26547b9ff327.npy +03001627-46363a10e242999c69d8d5b35c38db0d.npy +04379243-50323d86b68db6fbc35131da26f8061a.npy +03593526-e6a47ba0a8cca8a14725f67267e31c89.npy +02691156-2269715ca42c218fe3921ab5df3d2707.npy +04379243-6b6ea2e841e2f00b60eb699207aa149d.npy +04379243-5b51e63726f21bb6a75d03186a0409e2.npy +04379243-1fcc1a3a879b2a037d43e094da89ace.npy +03636649-8464de18cd5d14e138435fc2a8dffe1b.npy +04379243-5aa08289fc85d4d2ee51e40b76ccdf20.npy +04256520-c943da3efba4955d3ed66fc182459935.npy +03001627-937bea562c1db4fe5ba41eea807f5d3c.npy +04379243-7bbd4240f837e20a6716685cf333d2c1.npy +03636649-23a8eaabd1343badfcb8d8c6d4df8143.npy +04401088-f973c91a4c239da9dd14866f469b6370.npy +03001627-374fe2584abb594da094848ea4d06501.npy +03001627-9ab690ed709e7131b1b2ecd73d1717a3.npy +04379243-43a7d89c62a2fa86a5aee46eeae32d13.npy +04090263-f2b4650a52cca500b4cdad9a5bf52dd5.npy +02958343-4d52395f788af7e5a413908c0e169330.npy +04379243-4fad9f5ab1d22ea95445fd9f27a38098.npy +03691459-ba56fb3205a34768d4b4ae2ff4c58b57.npy +04468005-5eac87cfbf9188cc1aa15c8505e5645.npy +03642806-6008f256f3beafd9988abef1fd117e7.npy +02801938-2056cbd13e92764a61b3b6f2928a81b2.npy +03636649-c81470e576e437a495f1c4bba38e85d.npy +04530566-b91c482da95cf3055f41c9ba4474959f.npy +04379243-c011010ac01b73c78e43a810a63361f0.npy +03001627-8b39b501c9fa4d349b9f2eb77f5e247e.npy +03211117-882619bc31c4e4c88091986dc5b9a01e.npy +04090263-390d25757d6532d5dd8e6e2fb6475d03.npy +02958343-a5d32daf96820ca5f63ee8a34069b7c5.npy +03001627-1da9942b2ab7082b2ba1fdc12ecb5c9e.npy +02808440-84c48592fa2c0d82b73e9e930f636032.npy +04530566-767e561fa1214fb83651bb31f42d2f80.npy +03001627-f10263256eeb840b732c9e6120e90cf8.npy +02691156-bc33901245943313d6d949577c389a84.npy +04401088-fcd923f9bcf1e859e2a1e51fbada37b3.npy +03001627-34722e50142652e53a5e6305a3a7adee.npy +02828884-f80f3251391f3cfccbfa849e0f7f0b10.npy +02876657-fd0ccd09330865277602de57eab5e08f.npy +03636649-787bd789cf2aab676e0185e256a599cc.npy +02958343-3339caa48a18e4c358db0ef36af1d3c5.npy +04379243-68a6c680b48dbed292a0bc4ecc8b2ed9.npy +04090263-a2570eec88282cb3d8569d1a6c25406f.npy +03691459-2f41de1a2faf854d860e5e56395d4d1b.npy +03636649-29985e44b73051d923500a5b036df62e.npy +04256520-61ce96ea92a12f402e0ec510458499fa.npy +04379243-2a6010074025d1d85dc3653f8341633a.npy +02876657-b1271f402910cf05cfdfe3f21f42a111.npy +02958343-792a93f2b8dcfe7116abce8cb03e7794.npy +03001627-336ec0b3142fec15aaf0ad030fc37d94.npy +02958343-1acfbda4ce0ec524bedced414fad522f.npy +04401088-85a94f368a791343985b19765176f4ab.npy +02992529-c56262f4a6a7fbe5fcae16e8230396f7.npy +02992529-39cd15c429c6007e2826f529d0b74d3a.npy +04090263-365589510c76c7cee603a5ccfc8229e4.npy +04379243-f9bac9ba3b878cf23a6e0d0a575f76a3.npy +02801938-2ae75c0f4bf43142e76bc197b3a3ffc0.npy +02691156-f1295a30fd857249224c86fc0bbbbedc.npy +03001627-47dcabdd8618e5c4b3c9a4ebefe3bae0.npy +04379243-63fedc0334f5552dbec3a71604e140e3.npy +03001627-b46ad21b7126049842ca7cc070f21ed3.npy +03691459-90120bf8e84315de6873d49607c1f87.npy +03642806-ac3ca8ae5e3203117f2411014f221968.npy +04530566-4be2461bad10aa82a875c848d0fb1664.npy +02691156-72fcc9dfb927311935fc197bbabcd5bd.npy +04379243-bc842e548e68a3cbb48513409ae7c51d.npy +03467517-d50d06b159363b1693f0194265a9746c.npy +04530566-e687e0074b0dc5bc470938161c06eb7d.npy +04401088-58c6118bd15ca3b48dd025faf4cea27d.npy +04379243-21c58ff6f87b750cb9a0f5d18f1ce54c.npy +03710193-e79cc4e58f69eadc5bee258e658f9767.npy +03991062-87d72b1c98c0f8548c159f8d5e761b17.npy +03001627-308ba1f8c1eed4fbbf80985a99195eb8.npy +04090263-aa47591498e4eb615dd9d441afd49974.npy +02992529-82aeb34ab6fa282766148e8aa85ea356.npy +04530566-988e1d7106b705d692336765b86c93d9.npy +02958343-8c0fd2f204d6008da1b543d55837199.npy +04256520-76e0b10288997462c51b240dc7b068a0.npy +03325088-28568aa9e333a421c36fb70296e45483.npy +03636649-185b2436cc0404096ef2faffa907bc32.npy +04379243-e94b1ab02a3264c89eaa55bb236fb6e1.npy +03593526-ea4b33d425d8535047efcaa87d68903f.npy +03211117-a151ea6f6bf27e2c9a7c2b8fd801b3e8.npy +04379243-7478ed7307756ccba10ff7fd5e43a633.npy +03211117-751f46191d0baf99f541411dc07303c.npy +03001627-ffd3064cff5757695ecd29875b6f0d44.npy +02747177-46e777a46aa76681f4fb4dee5181bee.npy +03001627-32284e0d1700dc55e7c7920f6a65a54d.npy +04074963-25182f6e03375c9e7b6fd5468f603b31.npy +02691156-3ee352a759364cdfbd46d022fd7d80aa.npy +03001627-e0df9f745fe38b389bac1502ed0eb150.npy +03593526-86fc09510df14f9d9f53fb212867331e.npy +03001627-e5f405ad8aeca327d9b53420a5458c53.npy +04401088-8ce0fff87979560bed1f9cd2184d7b73.npy +02958343-6dbb3c5d7ce105243afcf7df86a03c60.npy +02924116-a0e5a36bcb4e2298e1da81584e31b667.npy +02933112-cafb0ae07b0e2fb055f46d55537192b6.npy +03691459-4a10811da56f40a989542bab68e6843.npy +03046257-1ca3587bf68d70d571810a8e7ede71b3.npy +04379243-75e3cbf4b1ef0df971a782a4379556c7.npy +04256520-ac5a9b215a7d5be123448769dbb64afa.npy +04256520-d47eb4149fbcd0c7907a5a34fd8df2f1.npy +02691156-e413c15ded9ba57a23fc69eefd95e6d3.npy +04256520-2a310d5bb9e5b1ec162227055a96104e.npy +04256520-b922bbdf49b4100659f8e31ca87c470e.npy +04530566-fe7362e8a02d00072e4aadf908a27d12.npy +04379243-79b7bd0c910e833ba5dde908aa701435.npy +02828884-367e5ca5d5791739d4d8765e3910f617.npy +03938244-68316f18573e3449622179425ac4ebe9.npy +03001627-29cd7fbcf6c7c33df51f77a6d7299806.npy +04379243-b4cc6b735f911fefcfff181817262617.npy +02808440-9c1664de95b39e30ccd0340812259a39.npy +04379243-c6fc2ce48ae9867d688ad7d3969cd02a.npy +04379243-fc2ae302325d2c796820bd77cbfc18d6.npy +02992529-b442b550e827cbcc8ea897fbf75dc392.npy +02808440-3b4a28f7e078ac063321831d2245cf06.npy +02958343-30d360f644e8cd472eff38f357a7b528.npy +02691156-39fce052e13f97a57a10aa3eec436422.npy +02958343-1feeeaeb8b56e46d2dfaf88f42097063.npy +02691156-b738666a0403a7fa6818e4a1f2613507.npy +02958343-139718b631cbca546a36136419d55d5c.npy +03593526-8c45ab7f96998dc0feb02b0cb8b196e3.npy +02924116-2852577a7f4a67216f03051f81ab06b7.npy +03211117-118083b82350b53cb23e7e4bd2944793.npy +02818832-698ef3d1a8c0c829c580fdeb5460f6d6.npy +04530566-9f34d1dbf06b4d989330265a9fff38de.npy +03001627-ccd5e24c9b96febd5208aab875b932bc.npy +03001627-4a329240c6a9d2547b11ae648ea92233.npy +04090263-bd7b5781568afa0f46177b6d1ecbf989.npy +04530566-1039c49d2976eb87d5faf4905977884.npy +03467517-83b2ecf5caced214e313875ff213ee10.npy +04379243-30ddc80e5fd46bbef51fa0238791f5dc.npy +03467517-8465e902e1aa1686e52028751701a83.npy +03001627-d0d786244fc2d7a9ecf03af5e7a1277b.npy +02691156-228fcd24cea34febc0909d98a1ff2b4.npy +03467517-f146c58eaa06f5e4d57700c05b1862d8.npy +03691459-e6ac4bf60e270a6512da48a027621f2b.npy +03001627-e1ab1f421891fb01f302352a74d4e413.npy +04401088-5d1652fdd7cd46d0dbb1de10c9529bf7.npy +04379243-40f8588bf78172a129e4b5aa807bb4e7.npy +03001627-d64c618e8b0c7db73ded7580b6cd3bad.npy +03001627-f1dac1909107c0eef51f77a6d7299806.npy +04401088-a3193340929f4bdd146def56c5fc9b3a.npy +02871439-32c3e3a86698a175a7942170a4965f4.npy +04379243-97d1c4b5a82891e33002761e7a3ba3bd.npy +03593526-7c1303d3a19a1cef51f77a6d7299806.npy +02828884-a762de549efd8f2899d9a264095450d7.npy +02924116-350d4061f4cd94b9a855be96518ce9f0.npy +03001627-5bba0c3a964662a6881e525dd6501111.npy +03636649-7527ef1898765c09fcb8d8c6d4df8143.npy +04379243-34c00f5a77147ac6b041f249f731e3da.npy +04256520-64ee5d22281ef431de03ab2a27ba7531.npy +02958343-6c22203e5ed35df9ca4aeb694e04f8df.npy +03001627-f9dcf630e370f7d5a320e34dad7c78bd.npy +02992529-a698b67778c02fcb5a0a15c8380e928f.npy +02933112-227d258c1045acbe9e4965f0106e00d9.npy +02691156-5f46f3c62e353c7bb4f5fdc59ce06e88.npy +04530566-a7f5b96f138649c6bc30e923e47d8bd4.npy +04090263-c4d201c44ab9b1f3e1f2a1daf140ac9f.npy +04256520-33eaa3a6a05575ab14038d588fd1342f.npy +02691156-6193ca8f5b4419bfd86ebdaa02a63c4b.npy +02828884-57afec727772346f30bbd4cddd04c77b.npy +03001627-8b4b176d9393676d5e1f306d831137e1.npy +04379243-3838d78a4b4a76282027cee422df2aa3.npy +03001627-fca55be264355b1ac30ba10ebbf8ea21.npy +04530566-ccf527bf6ea742f0afe1d4530f4c6e24.npy +02876657-e8b48d395d3d8744e53e6e0633163da8.npy +04401088-e4a8822c5faa386fa9976d676758bbee.npy +02808440-6e4a0d8f65be087458da1271ffd33120.npy +03636649-e0aa085dfdb0ac03ef3a2c64cef919d0.npy +02747177-2c09ad6e78554a6ead5067eac75a07f7.npy +02933112-29c7cd661bce3e50c59350d819542ec7.npy +02691156-ef26ad836cd29010f2acf00738ce9d0d.npy +03001627-a750f7309fcc4b0473672ae855b8c82f.npy +04256520-628f7a321ce4f90fcf01bc59d215f0.npy +04379243-27a0e85f8fd0c7a819fb4103277a6b93.npy +03691459-3fd4d9909c72fe47dc4f6934317af74.npy +04401088-8b11b38e035143ddb007a3ad40c5add6.npy +03001627-f36e83dff72cba53ba9ae5e8f97b3d4.npy +03928116-4e370af4ed086e088b3c4b6eb338e363.npy +04090263-80432cdae538023ef13eed41b64dddca.npy +02691156-33faf711ed54a4d3db22b838c125a50b.npy +02933112-2df3eafe6c699c1a6baba085b51d97.npy +02958343-b659b096b9cd0de093532d4a06abe81.npy +03001627-d4f38e40aedc67f779368d1198f406e7.npy +04379243-3eef676eb5cb9db4e56bf1253ce74bd.npy +04379243-f835366205ba8afd9b678eaf6920cd86.npy +02691156-7117ac29aef4f1c4951971f8370d9050.npy +02958343-ab7b5025c9e9c1921cb81cb1632a5e.npy +02808440-2426e758dc1d2681ccd0340812259a39.npy +04256520-d3425554004d834f6dbc9d74bad392c.npy +04379243-c9ab6dcc7e4606adf00f0216ab99ff30.npy +03046257-a39bd192df9ec7475e6e4a5422e31446.npy +04256520-9aef63feacf65dd9cc3e9831f31c9164.npy +03593526-9c60d16fa781095fb866188bf6825255.npy +03211117-4d74d8c3df7a85051d225d751745cd28.npy +02691156-a9dff753cf97f9c5354ab1decf4fe605.npy +03325088-804cdf67685d7e592efffaf8e146c9c.npy +02747177-59aba635f6d79bd72bcd3c046a99811e.npy +03593526-4a53c4af240c562537048583edf8ef2c.npy +03691459-b648f6cd54d07a1023e70120ea31089.npy +02876657-32074e5642bad0e12c16495e79df12c1.npy +02958343-fe16b8e790f23ab8c6fcb4b4f04936c2.npy +04090263-ae1a6e01d2ea5d2cc75e2dd4efaea578.npy +04530566-6fd0071445c70e9297e6e890ac2fb198.npy +04379243-4e76319c1489ee71f4a4c7b91852bb65.npy +04090263-f50efdafb9e486f4519f927f2bf92da9.npy +02992529-2098a0f7cef1e593f6c5597dd1efe723.npy +04090263-6e23faad8bff1e12f7bd077790d66b82.npy +02876657-4301fe10764677dcdf0266d76aa42ba.npy +03046257-dcd8f3705e7ebf7fb2f671e673cf292b.npy +04401088-1d9169471bf9223423e378ba27e11ea6.npy +04256520-98e6845fd0c59edef1a8499ee563cb43.npy +03938244-86bcb4eb29d5effe157f5033576317e1.npy +04090263-70928b07af4272df2d07d103eb3a7540.npy +04530566-14fff3ebab1e144d6b77971fd22cc80d.npy +02828884-25f916e08a803ad5067eac75a07f7.npy +03046257-845f1b53ad2e0d53b87e0c7ed53711c.npy +03337140-38c55928e088fe1b47f6dcad69d89980.npy +02958343-854bb96a96a4d1b338acbabdc1252e2f.npy +03593526-be4e86198d0b8d438edb5be732846826.npy +02924116-f4f5bc6fc08ca19962ea3c59193a008.npy +03001627-e3eb5422bda98fa12764cfba57a5de73.npy +03636649-4deef34d95367b58c0d95250e682f6ee.npy +02691156-e6d6e9544e353f9f75e49fe23848bbe5.npy +04090263-c4d31507a1c0f7b7c3972dbee3e8d0f9.npy +04379243-e1b3412d67d2c18c59f8e31ca87c470e.npy +03325088-1d584bae2bb2ff963ca0c4be71e7b721.npy +04256520-5c9b1a32f54b12cf81f667e2a25e0619.npy +04530566-4f513b39cfce2d269eddf484109e2999.npy +03001627-5609756359a6dd2c1933ffef19678834.npy +04379243-5ec15b09dedf4dfe961b3f02493c4f73.npy +02691156-8d54e30dea0e2508bbf3143b1cb6076a.npy +02992529-5d1652fdd7cd46d0dbb1de10c9529bf7.npy +02958343-72ad8ebcd7dfbc87368990af61c704f7.npy +03337140-3c519e2bb9f20e284c3aee8e9d3a6ffa.npy +03691459-3b55f9d0fecbc561de9a8c37f2997f.npy +02828884-c83b3192c338527a2056b4bd5d870b47.npy +04090263-639b18f1cbf26228e666ec68139b7ff7.npy +04090263-a4051a1e8a1b78003940cfb719120315.npy +02828884-c3d4204f6f0613b1959f51f2c68b3ef.npy +02818832-b928b7904901c8849abd6ac8761170b2.npy +04379243-4d43a00b356701d914f14c67f445762b.npy +02933112-b4d82c9706931d29d1d193a59606317a.npy +02691156-c47a2cb459ab849c493ab0b98cb45d3.npy +02876657-3a9516eb02206108e0c8359faeb78bbe.npy +02828884-3db1d3904f058b574a9ca2c84bced0dd.npy +03001627-111720e8cd4c613492d9da2668ec34c.npy +03790512-6819949f5625ca12d0f568c31c1cd62a.npy +04379243-845c77d01efe2f2e425fe98d8cc1c2c.npy +03001627-64871dc28a21843ad504e40666187f4e.npy +02933112-14dff09acf069b63c59350d819542ec7.npy +03001627-ebed17a73a2e9e981882515d09f3979e.npy +02958343-985763be7e2b18ec16abce8cb03e7794.npy +02958343-b9c0f9dbfb5a1c0f99684c8184952917.npy +04379243-a4e595d77097b224e2b372d25f6c9482.npy +03001627-8da6959dc59296c9f2f43e6f841bd32b.npy +02958343-e1a694f11100ace082d20fd7268a10a.npy +02924116-607d400470141f8d8f8940e918ad4591.npy +04379243-a55454529b463a1eec56aed2da084563.npy +03636649-907fd296708ae71dd5fab5deb286066.npy +02808440-cdc30ab10100ed23fc4743bde9e89079.npy +03001627-90129d2f4a5cb57799982a4d6320875e.npy +03593526-cf184ee375cf827eeee0d5e82f0b9cab.npy +04379243-e6cb56c84042891b201e82f29479384c.npy +03991062-c1abad416a011faa2c59a4d90e63212.npy +04379243-20647984dbeb990ea6c03a53cf0a14c9.npy +02691156-29120728132e5dce42a2048a31b7df8c.npy +03710193-85935473b4685e24769119a7d27b495b.npy +02691156-2d9a7863dcfb5663d208f79049825a82.npy +03211117-3209637ef61547c040feea836646b66e.npy +04090263-c4f73b23f4fa46364785ea41f043d735.npy +02924116-58017ca7c738b89dbd69e36f5d4705c8.npy +03001627-92bad575037b0552d7bf6fb68df7f786.npy +04099429-651f56b608143df0cfb3f4d4e98ee41e.npy +02691156-e02485f093835f45c1b64d86df61366a.npy +04256520-8f5c8cdc0fc4d84aaa4296a266fbc9c0.npy +03790512-c8d62fbab07d49a7e398c671c3b93e96.npy +03001627-d7dfcd99197d6ae7b6dbfb7eb145012e.npy +04379243-9b42cb91ccead6d42f6d10c5d1d56320.npy +04090263-2b997d20df6ec1b7e290ca81b042ebb4.npy +02933112-3a2afbdc240a7f073fe047712e43e185.npy +03001627-360b02dcfeabe768492d9da2668ec34c.npy +03001627-8e2b44ec14701d057c2b071b8bda1b69.npy +03593526-1c47c52b9f57f348e44d45504b29e834.npy +03636649-9459660f359235abd9010e2a1af5e34e.npy +03001627-450d40600ed92c7de9ad5e44c87685c0.npy +02933112-5a5e9a046d79bcc7859a7164d38b0d13.npy +04379243-f64138f5515e5031f785f45147f3e474.npy +04530566-583ef94812afcd26e025e00c738da634.npy +02691156-e6ed2c677e158daa1059f490634fcf62.npy +04379243-72010b2aabc328ba2d1beed6f591ab11.npy +04379243-fcc3a9a4e880b5f35966c5a46a5a6ec8.npy +03001627-9b42dd8043ba84f7492d9da2668ec34c.npy +02958343-12796524ffbadb755400f0dc3171dfcd.npy +03001627-b4371c352f96c4d5a6fee8e2140acec9.npy +03207941-e5aea3a902e5cb8e2116f4e646b32073.npy +02933112-2726971c1ed929eaa733727fd41bdb33.npy +02691156-d3198154076f49a86f0778e65d2e88ad.npy +02691156-341f5b3c74970a618d0dbc7502fb16f2.npy +04379243-a6a7ea033ff20abac133e11c42c6f6f4.npy +04379243-fd7ed06e2ceb26d766c55b7c01b230bc.npy +04379243-4a47ff44cd2f024635cf289fa8ad7115.npy +03761084-eb7dd094761f3647fcfa1e01912deb2c.npy +03001627-e71d05f223d527a5f91663a74ccd2338.npy +04090263-7713f61fc0b829f3e196b48bc93a41a.npy +03001627-8117c55b8bbdbbc54c5c5c89015f1980.npy +02691156-1a6ad7a24bb89733f412783097373bdc.npy +04090263-7ffa338b2693aef651cfdb4c9f126c12.npy +04379243-57fbb082f660c4f7716b680dedf77108.npy +04379243-98412ad8301f965210c709fd84118ff1.npy +03991062-386b99b2357ba64aa2c59a4d90e63212.npy +04401088-1a0fab14a11b39d1a5295d0078b5d60.npy +04379243-37d500b1bf8b3a5beedb4c8fd29e2d1.npy +03001627-e31d71ed32273fede42ac999db581f5e.npy +03593526-fa9e6aa9d67d5329e5c3c7284848bbfe.npy +03001627-373089aa7a44565b7215a1e3ffbff428.npy +02871439-46df0d838e68cedbd42b9650f19dd425.npy +02871439-a74ce03cd895bf07316bfcab702f4c34.npy +02747177-8026b11c2f66d77ed5a4ff0c97164231.npy +02691156-d2bf5f39131584c0a8cba409c4409ba9.npy +03691459-46ec6741dbbe69bdbc052c28a9e28ccd.npy +02958343-d2592adba4e8e62648368c1a2f71c5f3.npy +03211117-2d828dc0e75a47ab760433abc0037bf6.npy +03636649-28793511c46b4fa030f6e0ede20c4525.npy +02958343-c4ee4b9fc4501a9380c4d64ac66d8b56.npy +04379243-6e3a2f1de25bcde5ed6c51d5b9c713e3.npy +04379243-c527f1e7ae2c7b8a4f7482420c2e91df.npy +04379243-6b678921222e3375f9395f1ee40f845e.npy +03001627-622552cb1f5670a614038d588fd1342f.npy +02958343-c12424d1cb48ce0fd0a4f72b67c7f064.npy +03001627-1953d62a63721f17df6cfab91d65bb91.npy +04379243-6159304c015c2d54bd7b3ab3cb320beb.npy +02933112-63c195f60442eb5a32cdc35a3ef7141.npy +04090263-d2f505aca92ee65fbdb8512730b99253.npy +03001627-6621723f7af35f2dcd344c2b2cefcda6.npy +02808440-cdf47d95ba14768d48ad5e70a514c4da.npy +04379243-f62766dc071eb88472f944a50941537.npy +02958343-98a1a92a94a025aed28935fb3c99dc7e.npy +02828884-6c8d7faebd2ca60ef3b7873c9ffd02fd.npy +03211117-8bf89a26f5e7824a8eb91f418e60b82e.npy +04379243-94be8cf5e1538257f51fa0238791f5dc.npy +04379243-81ece5ee42a4f814d384177e3e0b693c.npy +02992529-d2636f3af00fb3e2538f655e65b0b57.npy +02958343-fdd3f02c294518341944f01d3ab2091b.npy +03691459-f07c69a33e0a1f54b6c84941dc90c1d2.npy +02992529-44d7b5d87c26896944608b3255ca1886.npy +03636649-a801be11157a7f243d39d8012919dd25.npy +04256520-df19f437c753b93a72814c9aa90ee14e.npy +04401088-ef2b505068cf120efe48f52a0ccc160d.npy +02691156-2f3bef6d679273d062b600da24e0965.npy +02691156-74a5f937c22aa08a3e70653c1b3170b5.npy +02933112-6f03b6ab474c04a243e5ff23b077c03a.npy +03797390-6faf1f04bde838e477f883dde7397db2.npy +04468005-2a56202ffe3cedde53a3d395d3382ee.npy +02828884-1d6150ae91a07cf6f4fb4dee5181bee.npy +02808440-cc98d2d5157aab693321831d2245cf06.npy +04379243-fcf216336b414bfd2ea86336b05b146a.npy +03001627-600f028f0bd5e7c2c8e0227722a7d821.npy +03467517-375ef808d47a832684097c4f3f6953fd.npy +03636649-9a98a0088ac6d37a2c5b2f528cea9dd6.npy +03001627-d3f4ce51467fb777525211e12d56c55f.npy +04468005-eecbec1d6360c2c77b4c98ce79dd9c8f.npy +04090263-3722e5b8425d025895f22290198b089.npy +03636649-7c8d71334a6bbe8eb3d57d6094a92e4e.npy +04090263-42b231fa5ac25f7dbac3a27910198725.npy +04530566-217966c23fe43ab83bde759c61eecdb6.npy +04090263-ce38b5d04d546346f27eb335b754fdaa.npy +03948459-12eedf28d9a948556c1cd53dbc9f7b8e.npy +02933112-4116f2d56897d9ec1bc4df4f6291380a.npy +02958343-150f2cf6e9c54d08c24a350006d347c.npy +03001627-c4c598c29a542a5f150539b40d03634f.npy +03337140-ef16caeae076c1a530bbd4cddd04c77b.npy +04090263-259edfd9a26c68104c16ba0acd861632.npy +02880940-3152c7a0e8ee4356314eed4e88b74a21.npy +04379243-d497f192ea400165da22561748cba914.npy +04379243-73ce68f6021be015122dab9909481e14.npy +04256520-42f33746d7f0a8a24d3485a4d7c3a3ee.npy +03691459-93900698e7d9ff4d104831d5b063e54b.npy +04401088-5e6ee0c5d155d2298b13932a0c28e98b.npy +02808440-800da11834a991da3321831d2245cf06.npy +02773838-5afe31025e8574ea8d6e12c39b2d5023.npy +04256520-33ee49115aa7125ddc37657f7fe19edb.npy +03001627-9d36bf414dde2f1a93a28cbb4bfc693b.npy +02942699-4700873107186c6e2203f435e9e6785.npy +03001627-4719c75b8ce30de84b3c42e318f3affc.npy +04530566-2fb7d918e4a738fd97556ba76bc2663.npy +04379243-553c416f33c5e5e18b9b51ae4415d5aa.npy +03691459-943e9abfee56144fc194eaff7ea54233.npy +02958343-283d78cf3eebff5e9aae70753d127b0b.npy +03001627-2787a03f47ffb80360cc99f89622808e.npy +03636649-5488a4df2e78fa1eb184155425111e9f.npy +04090263-c146b0aa5541bc1fc0f919a9a9f1e7fc.npy +02691156-3794aa3159c10929da116749c2415b0f.npy +04379243-6db3d1818431bf97e785ff1b79dea9cb.npy +04468005-296497a4bd7466f3bf5d6261979dd437.npy +02958343-41f087af6d5af9e1c05a03162270a7ea.npy +02992529-4a60039ed657d838fe5c7c47101442e0.npy +04256520-7e2d1762fba4c38112ad7c55c944504a.npy +04530566-6c00d47d1c8b81fb90142192ec795d.npy +03211117-21ad9636dfcc9578c78df40cf2e9097a.npy +02828884-17a7a1a4761e9aa1d4bf2d5f775ffe5e.npy +03691459-1a14b00578f19b1f5c38e15d823f1476.npy +04530566-d9e771ae62f0bebd28642b2f4910862d.npy +02958343-a56dca5eab44489ca7fd25564c2e888e.npy +03938244-68131b4f51579263f7b57f419ab26207.npy +03325088-944985ecba6082483792c04fd8184496.npy +03636649-11194326770b1225d49b2e04785f8492.npy +04379243-b66ea953531a8d78f0c92c2dfba3cdce.npy +04379243-9323cd461b771e8ecb503f63ed915ed2.npy +04379243-229b99c5f07fc657798b7aa9a1ef8938.npy +03001627-5fe6b94dce63fc59d4589db494f55afa.npy +03467517-4d10edebb598202263e148e250c0340d.npy +03001627-4c668aab2c49f9ac9bf4d6e8e41d9e5b.npy +04530566-f8d3af1d1a20123c249ba97ee36ba54.npy +04256520-82460a80f6e9cd8bb0851ce87f32a267.npy +04379243-bcac0b4a07a61efed498ea2919be2102.npy +03691459-e12178cbc10606bbb48374d47d81a219.npy +04530566-203d75b8112369d66a4afad911312b2b.npy +04379243-4f9bfdae2b76536b3212177d8262e8ae.npy +04379243-10ff43e8fb49af1719fb4103277a6b93.npy +03001627-af30cef615a3338599426e1733531ba.npy +04379243-8ad1486390608fb936da5f8a6c22b2dd.npy +02992529-a86eec9735db06a8226bc3b9ce9ff2a1.npy +04530566-f61eeef9235a776073fab9f1733a68f6.npy +02871439-3285b8271f126ea84767450bcb30e5f2.npy +03636649-b0871c4ac8505d9c3d39d8012919dd25.npy +03001627-8a232028c2b2cfad43649af30eba8304.npy +02924116-6f50c339a2fb88cdf0ef31d4eb6dabb7.npy +04379243-52bc4d1cdb3789407ff6ace05b36a5.npy +04379243-6351840a6f3b29d0a15e691028c09e34.npy +04379243-6146dea482c1e5eaf713a1a6bbd3da86.npy +04256520-e8840d7ef11fc9d4a54b9afa882a89ed.npy +02876657-2f4ec01bad6cd5ac488017d48a7f7eb4.npy +04554684-6bb98df3d7f7d3e1e5bd38daa40d76f8.npy +04090263-418439dbd9a2e674a81ccece899902be.npy +03046257-6da867f9fd8aefebc26e81144f3196d5.npy +03642806-662bff93f075e8f29a4b8c8271f09050.npy +02924116-6082930ceabb5ccee0b240915f388193.npy +03211117-bdea41fb7dc360b57639b23a4f342494.npy +04379243-16570d98a47c9907bd1aeba6ff85928a.npy +02924116-8ad16d5986708c0ec98c13d6112727de.npy +03001627-94b39e206f1bd77c69e31bb722067900.npy +02958343-74cf231265731c2f8a1aed4fb5fe5280.npy +04379243-ec59bd4b5288991e9bb952e15a37e248.npy +02828884-9bf1e702777f4f5292694c864c93195e.npy +03001627-c44413bb705968bb71a782a4379556c7.npy +03790512-bc1a3e925e6da7a97bf525c97f9f490c.npy +03467517-5c569af400d756335e98dae1ae7ba143.npy +03691459-eda3d466ae38e9112a40b4a3ef70af61.npy +02828884-86ab9c42f10767d8eddca7e2450ee088.npy +03001627-dab5b7b9df65d2e2cf0bcb121cf32b53.npy +02828884-6d23e04807a5c840307005544420ecd4.npy +04530566-4c433697f371db56459e601c4b110252.npy +03593526-84a8a8a36901d3c4500158c23c4c5a8e.npy +04090263-57dab7fa939cb30d9f703ae3d7bd0308.npy +02808440-abb5f87e6c6705e1d43b13ed5ceb051e.npy +04379243-75ddfe6d71b14184134155606601dcb2.npy +03207941-9112f0ee6b1cdf5082ec48ff3a4fe07c.npy +03624134-d5167211e757e79f012465c621a63e3.npy +03928116-f4849c546734104a5fcfbea90545e502.npy +03211117-93d0756b41670e89ce2fdea99c5936e8.npy +03001627-98f42a66467c264377fe1aa9b41a89c5.npy +02691156-7078ad51c3c30972b310347ab50a9dea.npy +04379243-82e5309809e455d5f15fed2243deb166.npy +03636649-f7c52d5d91e5ffbfbf82a0d508a096d3.npy +02992529-e14de927fca30e267a351c9c1f605db0.npy +03991062-380af31bb5f03b12a2c59a4d90e63212.npy +03001627-c993ac723dbaf479a4929a32e32d23f3.npy +03691459-b68e0b294c799771ebc9199df8e5ab6.npy +03467517-e2dd8689a41a4eb7a62113f6bf783f69.npy +04530566-46fefa9e95b353f4b1bb46d2556ba67d.npy +04554684-cb6febe6334cbf7791219aad82abc053.npy +03001627-5c61d56d4147e55d5213cec267286d18.npy +02808440-25d3c9f5d30682ec1562059f17dc3c45.npy +03001627-f3573756e64259f2b29d280b4e59c527.npy +03991062-c20d0e4ebd8d85fb97b54645ed3317a2.npy +04256520-60ad8be4124fda92408442c6701ebe92.npy +04256520-6b036756d21b6d8548eb521885c87e13.npy +03938244-343e3dedabdb067193e60794f9200b7.npy +03636649-df31746077d19233448e1c9934d83117.npy +03001627-7824cba870f915ba2922dc9c4df31134.npy +03593526-718d999b71ac3d28c33cda78d407d98a.npy +04256520-9e2a48a4263b77a06f37a8be59c15bbb.npy +04379243-56c627c74e9c78c65ed9439580e8c076.npy +03790512-269bfe1b994ac28617798af67b81f2f.npy +02958343-6c39e401487c95e9ee897525d11b0599.npy +03325088-9406afb358319bdf1aac9a952ec41bdd.npy +04379243-aec39c7f691c2ad15a824ea0c4d9b625.npy +03001627-6678f63c9b584a549d9e5580ae9f8738.npy +03624134-7048d3ea565fad8da737721d7c8987b.npy +04090263-f5b35e6452c2138de1f2a1daf140ac9f.npy +04090263-9168d4697d83cb9215bec5c0df04f3.npy +03207941-a62b6a19d2093bc91cbd656f2f1bc2ff.npy +04379243-904141878e75b065f48f3ef41449c816.npy +04401088-ff8676e76a0fd471fc115be4ff5cfb9e.npy +04256520-d53620b3769bcbd664518692a46d31bd.npy +04554684-6b056e83f0ae99f3792911e05e8927e7.npy +03211117-286a7629b62426b5427c20e7fc0367ac.npy +02691156-c5e04f903e3472c31883411175051361.npy +02924116-3e1860cc19efb87df6cf361e85e34a53.npy +03636649-ced76fc046191db3fe5c8ffd0f5eba47.npy +03001627-5ffc415d0cd8bf1d86db7993cf8d36e1.npy +02958343-6edcd628ecd0142b4f2f12fbdc4e6f1.npy +04379243-68ae56275d366ed6cea003eff0268278.npy +02691156-8e47730a471abb7f43afdb9c81ff2967.npy +02691156-37d2da0de056f5045bb2b764fed1d166.npy +02933112-cb70b087e5bc5e9522e46d8e163c0f81.npy +04256520-921a1610397b62a7db03e4f5c01cf109.npy +03761084-c35fb15786c7622cdf3a1b0d597ce76e.npy +03325088-2712bb3da10799b150da8b99982a3057.npy +04379243-a334f2d3eeebaccab40f0ac0fb9a650d.npy +02691156-29c81ffc84f2f7ba1adbb4c4e06ad649.npy +04379243-b04e9713af0d7048ce87696fce7b6aee.npy +02992529-cfdd44745ba101bc714ce1441b585593.npy +04256520-80ae351dff2476fd1fa9db366c777d84.npy +04530566-11e101e938688081d3b936925082270f.npy +02933112-bd0a87c4356e53d4630bc2b026b477b8.npy +02933112-1fe25f0be8d71d6ce2e1a0e8b25f573f.npy +04225987-484a49065ab1430624256fd51423318f.npy +03001627-c61e3ca5004f3e8667816b64852d28f.npy +03001627-271012d5de261d08101accd22c701b9.npy +03636649-26d761549dcc3c61a1b5ceeca96f6fbc.npy +04530566-7edda9af5147eeb25fc186cfb5f359d1.npy +04379243-b0ee655c0c84e70be03211c8d614b25a.npy +04379243-54a0067eb07dad5ad1a59a9e9888beb8.npy +04401088-7dc461c63f3aa4a3a2c7c5886f4bbc93.npy +02924116-3a3904d55b7a6c9bd8636d0a91468281.npy +04256520-e0f30a6af7bb75b8265d1076b4b6c5c.npy +04256520-48e31e3a3e2aa5c0cabc196a7f35f1aa.npy +03001627-6498a5053d12addb91a2a5174703986b.npy +03001627-5987ae6521cfcc53877929062720130b.npy +03325088-580ee100add1c4d854d7082b34825ef0.npy +02933112-71aaeb4dc7a7d41ef51f77a6d7299806.npy +04256520-f87682301c61288c25a12159dbc477b5.npy +04379243-96ede227209cde474042244fe2d8ace9.npy +02691156-76eaa5ea5f272c2f5986032c1ed37f74.npy +02992529-3bdd569911660da81229c79e4cce736a.npy +03928116-8775d936d5f3f38176145360ae4439bd.npy +02691156-70d9304de59792a9515d73fcb34092fc.npy +03001627-6714df9bb34178e4f51f77a6d7299806.npy +03928116-6a96d703d058790fa6491c91cd8d7770.npy +02828884-7ec901eb9f5204739a6c869309041adb.npy +03991062-efee3fed1b8bdda0d95c2d5388ec1aa8.npy +02871439-20e2da108eb42b52c16a7f7cb5642902.npy +04530566-954c459bc6762abc24f2ecb72410a6d9.npy +03624134-3d2cb9d291ec39dc58a42593b26221da.npy +03211117-44f363137d006f3cf7fe2bde3ab894f.npy +04379243-54317236f4b56413002761e7a3ba3bd.npy +03001627-b1add8182311f2a9f71e06115e9c3b3e.npy +03948459-bb71588fb21e67f67ed475464ab76870.npy +02958343-a990f6d75c669f4351a95aaa6caba1d3.npy +04379243-8141866ff4665b814038d588fd1342f.npy +03001627-ce935c8e977b8c58aa53a70b14c57bcb.npy +03325088-22f10b1903b8f285b362845c6edb57fc.npy +04256520-150da8f39b055ad0b827fae7748988f.npy +02691156-94d3a666d2dbc4385ff3feb917a6004b.npy +02691156-6b84749eaca0e657f37f38dedb2f1219.npy +04530566-8fb16643e061a3bd82b5804533e545b1.npy +04090263-30d2c5e8e703abe3f6503cf22f39c9c4.npy +02933112-61905b24b17eee756aea2f18ee404fd5.npy +03001627-b0f35e0dbfd5d75620fc2acf581b444e.npy +02933112-b45bae45ccfdd7b9824080f516909671.npy +03001627-9635dbdc4e34b7efffcd08faf4fccd0f.npy +03211117-462ba756d3337b475f16c469ffeb982e.npy +03046257-7504532221badbe449c9c494c2fb14ce.npy +02691156-f110a2ce31dee1b3c16ef5c633c71b56.npy +04090263-1939215162425a252bf06c32262648ff.npy +04090263-a95a7781d89f271a6ecdf20adf3e54ce.npy +04090263-e62ccd699b99b48a58dc97820d1d9537.npy +02880940-446583d7bf857dced5cb6d178687b980.npy +02828884-76976adc8a170036ae23680cee12f145.npy +04530566-8185d9e558f822c177cb090a86675a1a.npy +04379243-57a50a7bca63cd91e03b4418ed1a4f3.npy +04554684-ea961e30236b2b76a0ea52c7b90036b2.npy +04379243-2c9f91ed0b0584e196a3517f50eeb9f4.npy +04256520-39b0b5513ce0af42cb25d116843b43a4.npy +04379243-89478118c3618b353e615cf0ba033d62.npy +02958343-cdef1867e841d4bfafdee870abc9eca.npy +02691156-4dfe2199fdd333d09837a3d08a6a1966.npy +03001627-6ad86f428cd45b5b258d4ef9a9977ede.npy +04256520-6a6228e06f53e31b63c49003cfba744b.npy +04379243-8416d97c1e7b4ab323eb3ad3d378722a.npy +03691459-2af99551fe3644504798316286c07255.npy +03991062-7ce5fa012d569b576ea1c514a0de6d2d.npy +03636649-d190d56a1e6213e420ebca9c2a65e97d.npy +04090263-a5f7776b13c11e3194deaa9fff391d41.npy +03691459-4fef29cfa7ff1498442ed26ceeb35a60.npy +03046257-89b1770087ea083cc082c344e4f1192c.npy +03797390-e9499e4a9f632725d6e865157050a80e.npy +02933112-3084dcbd0a28399170ad2e9733c71638.npy +03337140-5bf29b17ff338ef4c3aee8e9d3a6ffa.npy +03790512-c90d74aa63043e5ad0f568c31c1cd62a.npy +02808440-ec906d77906e85d53af30a3946d92feb.npy +02992529-d41b332b9e6efddaa0eb5a85db887292.npy +02958343-a5464210795a915f9aa6f213afdff14d.npy +03001627-69a6407f21509325a04c9785f6d4e317.npy +04225987-380433d04091e04d3270ed754ff7ec06.npy +04379243-34121f5cc12135148c1cf3f7d7f0373.npy +02818832-f49119184f72bbb0b868f531409e0fc4.npy +04379243-992c967b4b1535f5f5346848b67e4cad.npy +03642806-bfd92b43d97b6d27f2b46e2da97eabda.npy +03001627-1e1b70bdfafb9d22df2fa7eaa812363c.npy +03001627-7786f1205337093d6051d49e4b21b83c.npy +03001627-9bbccaed652a88d0ad4feb1e0e9b77d9.npy +02992529-556b1ebe82977992c51777c7f8bdea09.npy +04090263-dda8e93517cb8c0ac9e18dbb8de06b45.npy +03325088-c20df659d0b79497f235ab3c41aeb5b6.npy +02933112-45342795c9bf86d94b8710a3469971b1.npy +04379243-59f04ddbd896f4f5430644dfe647c381.npy +04379243-476e60bceae151e768f8796d69d0c486.npy +04090263-2616ad4d3e8f3ab88af39b443dc477ce.npy +02828884-2d238b5250ab9eb3c55f85313e3bbc89.npy +04530566-c386c703e0f06a9b3a980283f1a7085f.npy +02691156-5958285db82a82cbc0909d98a1ff2b4.npy +04090263-47a5a10a047f2c2582950cbf0fcd4d4f.npy +04379243-a34afa94c100e8e2a45e8d2f28a9ea98.npy +02958343-bbca0e2391217de71e95a82bd2f5907a.npy +04379243-6f87ef47500b9d20768660cf080d12.npy +03001627-c7c7079b7555bf075e994da5ba753c34.npy +04225987-d4abd88611997d2cc4647061c0a60dc9.npy +02933112-181cfc93cd44af805a0e5699b3040a35.npy +04379243-6a4a9790706a558c2f84a7804aae667f.npy +03001627-58919c88a1b5b0b65cc7bfbb0ffaa52.npy +03691459-e031b24fd58c84c12633ff66beb9cf31.npy +03001627-a99be8e57aea8592a38859fd71bee28c.npy +03001627-c045514b5d4e4407b0ea0348afc5cb87.npy +04090263-efa6700a7609d9a59c4feb3f1af9fe7a.npy +02828884-2220c6ade811851cc13e020d985215e3.npy +02958343-d4e7286d53a7236374b5e1a654a4b1fc.npy +04256520-51142db12ba0b421997d55757516b24b.npy +04090263-9db0f94cbc2ada72847c4fc4f8c08820.npy +03593526-ee3b373aee74624ef228e31b813ebbce.npy +03001627-288143f68d5b9f7462acff507939719.npy +03636649-35e76406291b06dd66c1e3622e549d2f.npy +02691156-240fd3c1fd804ec1b8cf782e8c539948.npy +04401088-a2b921dea6df33765282621e4b0cea7.npy +03325088-3a30f6f46c4f1774e4e346ee2650d150.npy +04090263-57d7f154da3864e951dc50bfb39cd6f5.npy +03636649-ec639d4850ba9aa6fcb8d8c6d4df8143.npy +03691459-f982748287ef2c7ace029fab54b6cfbd.npy +04401088-4534e6754bcc38f78bc584bb94b0b13b.npy +03211117-79c623657fc683a54112e839a470cf05.npy +03001627-2a9cac5daa8e99cbd9b53420a5458c53.npy +02828884-d7d7a6bada0ba7705fceaa39a8353bde.npy +04379243-b99ad68ca697301a88386fe1512ed26f.npy +03948459-aa858f23b682f5616314c3b6a3a65519.npy +03636649-55f607d043cb587d5c10b08ea69398c3.npy +03325088-61df07c03d2b6836b362845c6edb57fc.npy +04090263-26516d0ce97296dd49352dd33f95cb9e.npy +03001627-ed72205562ef8407d7f7a4c4609b0913.npy +02871439-b8eb9918623a90fe14b86d5282eb8301.npy +03337140-3b8c6261122fbbeebe35466fcaf1ce30.npy +04256520-1ea101b73352ccd9822a33e080d0e71c.npy +03046257-9e059e591d0daaba3ad3591a780fa12b.npy +04379243-9611888ee0db1ecaf7d4d3ced798ad90.npy +03928116-204c770e23ba19adf42eaa666c73e416.npy +04256520-92447fe6aa69f89fd25437aef1f56568.npy +04379243-431340a089f0b3f5f320b5d9bf24e8e9.npy +03211117-9994c527e9c39bc5b50d0c6a0c254040.npy +03001627-5a643c0c638fc2c3ff3a3ae710d23d1e.npy +02691156-266ba93989037e6d48e8405d6c51a908.npy +03001627-d298e7f6e0e335a0e4197c3ebc03326f.npy +04401088-d56bca3888d3a595e93f5e23021ef900.npy +02691156-7af9fcb4a2c4079b873ec74c119307b9.npy +03325088-6ff015e04892ffee7adc0d0db36f4fc8.npy +02958343-65ea0311528b1e5f16abce8cb03e7794.npy +04256520-1aaee46102b4bab3998b2b87439f61bf.npy +03337140-92d05d86fa641a91820018801b237b3d.npy +03046257-7af418de6847137d2ea98d69e91ba870.npy +04379243-58f6e2538ba750008223f9660fdfaf1.npy +04530566-5fa144c3a8cb5234379339ae6512a12.npy +04004475-bd95856a16347f45242f8291aafac22.npy +03001627-b360f2264526521f1dee989d1177ef4e.npy +03636649-4604090264ab99ba6c1400a7733f9e62.npy +04256520-4f2fc9895ecc6a858032f428909bd170.npy +04530566-429dea3aadb0c3bdc753f4f2b4288d6.npy +03325088-9b827d4c19232237b7a867e9b35a1295.npy +03001627-47caca00f993bc4e4b3c42e318f3affc.npy +04530566-1a9bc7dd64da10f344ebbc705ad8c07.npy +04379243-cca18c7f8636606f51f77a6d7299806.npy +04256520-7a82cfb4878d1162986fdea3c9eacb1.npy +03207941-195c883e2d5e63c76621db2c3226f08.npy +02828884-57ded7ea16600342639efb65b33fee62.npy +04379243-ea093e60ddd1c7467afee304cce81d6f.npy +02958343-83fb99fe62dab5308b55a52bfd1cce7a.npy +04401088-d809653bf5a21f10e5b8860dcdb97aaa.npy +04256520-2e04a6dedc7cc5334b3c42e318f3affc.npy +04530566-5810aaf1a0818553b05dfc874f00d5f3.npy +02691156-f771c5a1b9bbac21f4fb6842b3610149.npy +02933112-c0d2f9960e0db8957ed335507280450f.npy +04379243-56ffb40d5f85f46f1a72c98fc69f22ac.npy +04256520-857c44dca7247e5757baa11b83badc8f.npy +04530566-30f5a0395aa8ce14d152039c9a3ad601.npy +03467517-d84d2877bd385d9c69da8e7f9a803d12.npy +04379243-9aff0e9f8722f063c0169cd3bf2650a0.npy +03001627-a59a49a0f9e8f4cda249f8489bc060dd.npy +03691459-c90cbb0458648665da49a3feeb6532eb.npy +02958343-bf8c14637ee36251ae3e053f6a533410.npy +03325088-f1be1113f7ac9625b362845c6edb57fc.npy +02828884-dbb5cc73da4780feed98cca8f0ccd5f7.npy +02691156-1a74b169a76e651ebc0909d98a1ff2b4.npy +04090263-ed1e56bac79b13df0e1c0df18936d05.npy +04090263-c6cd0f7ad931ca7c997b5c86bd7c8962.npy +02958343-3a7e096d05d688548413778731d6cd28.npy +04225987-a6d560508fb2fe2858dda0079c7c30f2.npy +03636649-417039be1c492fd4212785a561e3d296.npy +04379243-b4e22060a8aa48c9b1b2ecd73d1717a3.npy +04379243-42c231c89dcc0f115213cec267286d18.npy +02801938-52ef27eb43134d5150da8b99982a3057.npy +02942699-a9408583f2c4d6acad8a06dbee1d115.npy +03001627-d06c9ea39c0dade1d6b5d21cd4e3fbc.npy +03001627-3dc79f23cd284bd8ece416489129c313.npy +03593526-e9462bac4a8f334369df8a5173959bca.npy +04379243-c793946b036d1a9caa53a70b14c57bcb.npy +03001627-288837a47f55c0e9d8d964adc0b6502a.npy +02808440-fb269f5b1fec0b94d2285085273a3475.npy +03636649-713fa0e1076c99c1763bbfff01efee31.npy +03211117-1a98ee5b62f49c95f64616b54f9ba882.npy +03636649-43fce04e5e4e22bbba9ea396e14c59f2.npy +04530566-78c2790d999b0f9c1403af6fa4ab17f0.npy +03691459-b6ff46015b57bde9abacd1c615a34b0.npy +04379243-499be58242407271391e4d6c585a697a.npy +02992529-ca2e71c5e101797fa524f6bfc21eae12.npy +02871439-32da870ada4f6ef3aa2b654345545ea.npy +04379243-747f4ccdbbe2e4452099d3739c2967d6.npy +03001627-88ef1cc314d8dc0423500a5b036df62e.npy +03636649-b46eea8a6ed035279c92366a6d55d37.npy +03938244-359576c82de003cf96907985b34a7ba3.npy +04004475-9718d7c7af5d3a377eb1cef1676cbcb7.npy +03636649-544f2afb57934bbeffb8dd272bf2a810.npy +04256520-107bce22d72f322eedf1bb0b62653056.npy +04530566-cfa697be9ee40b5357018179649e2bb7.npy +02691156-ffd13ca14b85fec66cf1b4a8fc3914e.npy +04256520-e68758f3775f700df1783a44a88d6274.npy +03691459-8956eaafa0afdc142633ff66beb9cf31.npy +03046257-bdc3be534ccf65e09ce47e8a833eec11.npy +04401088-b7049148a4ffa22fdfe197f9f37aa72d.npy +04090263-94510c7e5c40166d1fabf3cbd0fc77bc.npy +03691459-faeb2f5501c8618ae47833b310955a9f.npy +03211117-6afc906811e9b40421d7ca6ede0e9373.npy +02828884-31375f94c8739fdbb043c7d18f748c2e.npy +04530566-cd4240b8246555df54102e7ecaeb1c5.npy +03691459-b544aafb047ec5014c40f34de8f3bdb8.npy +04256520-543eaf7f7a9885d57cbbb0dbdf037373.npy +04379243-e34d1be103e9d88145a1bc3ecd3d162f.npy +04090263-455a8f48d4b305bdc70a7659d08b7b72.npy +03046257-14556ed62cba8483365bd0790b72f2a1.npy +02828884-665eb42db0c44bdc81faebbdea6bd9be.npy +02992529-af3c1e4367942543264e721f309fb873.npy +02958343-dbe0b25edb8508babcf922304761e55e.npy +02958343-870086475e8af25bae57d337a2e5e53.npy +04256520-986f6fb4a7e513614e4975e87c20ce53.npy +04379243-2b564ff0989caf58ab610b0c94236463.npy +04379243-4282180ccf703ca59ccce4c6d5bb195f.npy +04379243-8cabaa720e1fe52723eb3ad3d378722a.npy +03207941-3f1e8fffc2e33a4b66e9ca8568fd3989.npy +04379243-b41f2b0ec15892e3153afb488ead2325.npy +02958343-4fc276424133528cf04f0bf74eec9639.npy +04256520-ff02fa8cfce2d39113dd6eafe1477be1.npy +02924116-9803debfea832718a3ae38981e422be7.npy +04090263-d35379324caf0e7380c2e60c312b0f09.npy +04090263-418f388062cce47ab2b92fdc09121c9.npy +03325088-71fa90c64528cd58b362845c6edb57fc.npy +03691459-3b1a3eee64e3412b6aa8ee471986facb.npy +04090263-64559ac87f100d517246c79258663695.npy +03046257-5b85d1cd4b278549a506c8b68491bf64.npy +03001627-239bb149aa17d0ddc1c43efc967e5428.npy +02871439-93ea6a4c9068dd65ba5b64592e406eca.npy +03211117-e7b9c172059d23a6f12f3a2695789ca4.npy +04090263-5d667fb09f0ad799c2e0257dfc41d300.npy +04090263-c8b20ee08253136b77b7d0d4764c121d.npy +03001627-6409f917fdae612f492d9da2668ec34c.npy +03001627-e6b80e51ceb5c2771a782a4379556c7.npy +04401088-e33124aa016bd1f19c1db271ad9472a7.npy +02933112-24c781a3aa6310a44da5feafe6f1c8fc.npy +03991062-433fedbf96f140fb25ebd1cd0b422e32.npy +02880940-6494761a8a0461777cba8364368aa1d.npy +03001627-716eba8ec4825ecb19fb4103277a6b93.npy +04379243-e3d7cdd0224a4fedd810b14a81e12eca.npy +04379243-bb201d4811ab271ecf5469d07a8db811.npy +04379243-17ceee4f264733871dfa540c3e10c55d.npy +02933112-493593c78a647030cbb5746221d658f3.npy +02958343-c72e9ce6c6f16bb83b8642d7bb5bef13.npy +04090263-29c57a599a25868f57c012eda7b00ebc.npy +02958343-db45ce3926c3ac69e8d8ad3bdef6aca2.npy +03001627-cd06d0034224a701fb7c76304cb719f8.npy +02933112-fe8c34a5275804d451f8aaa850306632.npy +03691459-b4d4338a36711ccdb113389b677f57ff.npy +03797390-5582a89be131867846ebf4f1147c3f0f.npy +02958343-9d400df8825de9a62514ed2901e978de.npy +02958343-707dd25fa8ebe7b73a6cc070f17a46d7.npy +04090263-e0824487f2bc4502e9acddb06da3928e.npy +04379243-8acbc1b934489d6fefe244bf6a6a9769.npy +03337140-373fa1f12ba203de4bf3cfb743192941.npy +04530566-3e408017d8b03ec5a5e52d43f595c657.npy +03001627-ce60636e30770f9d8193714e438a24d5.npy +02691156-2590dff7d8f19797bd46d022fd7d80aa.npy +02958343-8aeeed96e4597ca6853c6f214c15e60f.npy +04090263-d2b09323f863db7a71ed4e55cca1417d.npy +04379243-29b55c6cc05c37606e066e11deddab75.npy +03624134-c141abaec55e87e691687e259c21528d.npy +03636649-dba95c4ca95048982d9c07d3b9171829.npy +03211117-de66399eb8aaaad44913c6e8e05bb2fb.npy +03636649-5077728a780b5873f8d6a4359d6a181b.npy +04379243-71a782bd942c4b0147d5777b892afbf7.npy +04099429-b094ce5268143b1f28eba1f0b7744e9.npy +03636649-71c61e41a85671c91b82f1530fe53352.npy +02992529-aa833540c3f2d77e2915acf4d1de24fe.npy +04401088-3ef278f78ddb1db52a39b1d7ef8834b0.npy +03467517-a0b6f040538d26e3ac61a2f8346a8f.npy +03001627-43f222e3b4b0952c1a4cdca72ed38d39.npy +03691459-20b0ddd49c8cda71eef785963bb59c49.npy +02691156-eae54f8d47cf07c0aeec93871310e650.npy +02747177-e7de8a24dfc385d92715de3ea7b582d7.npy +02958343-189cffefcdd5cb071a126804ae24042.npy +04256520-dd7dc4e40e7d015c19fb4103277a6b93.npy +04530566-6436ddeaa11efffdcdd34f38f87d26cf.npy +04256520-8920c0e0737409e29f2349486c570dd4.npy +02828884-8a6f07f3d357fbfd2b12aa6a0f050b3.npy +04225987-39edba395f3d860c5a96bae7b017a6d9.npy +03001627-e4274fc2b9e4a5511882515d09f3979e.npy +02992529-70fe91a7bc072c39cf81faac56233ce6.npy +02992529-9028fceed53a144e10bc2436075f6a52.npy +04256520-94699d5b8a8682067ff6ace05b36a5.npy +03001627-e5a65fb8c660ef96dbbc9440457e303e.npy +04256520-bda4b8e6a69e1fc63f07ca1042ba5dfc.npy +03001627-55e6d1251fc63e1f71a782a4379556c7.npy +02691156-4bf2c942aafb4a2cbd46d022fd7d80aa.npy +03001627-85d0d147adcb6318b8e1b99345a5afd4.npy +02747177-b689aed9b7017c49f155d75bbf62b80.npy +03624134-444e269649312fa20005c20ac894a3b.npy +03001627-d045654d572bc46f19fb4103277a6b93.npy +04379243-9dfe5cbbb78cd26c9ccce4c6d5bb195f.npy +04530566-9b87bdd824e68950f4a06efdbafdd7ea.npy +04401088-b1537f1eabb7f5009f7477e2986c440f.npy +04379243-6bfb122ded9082de7ff6ace05b36a5.npy +02828884-bbf019371f76366b8fb2c146d92deb96.npy +04379243-1c431bd426e880e24719088c8e42c6ab.npy +03948459-d68f31ea513d3a5d6a816b111e5f1b47.npy +02691156-8682729ee0259ceaca8607f540cc62ba.npy +03467517-d0fee35bc3efa83367a66e84fcbfe789.npy +04090263-19035d7059eaa5b1a27aa199c0989017.npy +03991062-f1f7ec7a146470a272652f4081ec5a77.npy +03046257-a41444ea20bb2ea6e105ed0a3d82ba.npy +02958343-2d4ccc24a821360f8acb0ff76f4aec7d.npy +04379243-a15a936f2949d518a6fee8e2140acec9.npy +02933112-6352c69907b70c0480fa521a9c7198a.npy +04090263-3d8bab78941943f7cfe6670bda9305bc.npy +02691156-84b396dde837c81994445a3e8b9de59d.npy +02958343-c5bdc334a3df466e8e1630a4c009bdc0.npy +02933112-7aee2d4c1e70d27c921dd903dd0b8b17.npy +02801938-bcc429595319716b726dbbf7bc5e4df3.npy +04379243-f6e14672ef1ca30130aad3a2f98e3b63.npy +02880940-dd15ee7374954827c5be64abd4416cc9.npy +02828884-9c95f498f2726883bdc8e7e780fbaa21.npy +02924116-83cb38ac1fdc5f97a8aca93a0ba06ca2.npy +04379243-f9f122b492c3f1273084c5a9cbef5cd.npy +04379243-19c9beb4e4a5ea352c79b4f0fac9a79d.npy +04530566-ce5db5f4082b56b2eb2c303a0e0d287b.npy +04530566-1378b7d4dc05adba9069b3c9aa123329.npy +03001627-d6e5a8e9e0d5dfedb0957d845ac33749.npy +02747177-9f4bf5a25f85d12ead5067eac75a07f7.npy +04401088-f649a5368586aa77eecb4e0df212ad9.npy +02958343-8361aa7ae1f7dcb582ea71649733f2a6.npy +02924116-2f5f986070ea126996db382b382d7132.npy +02691156-c9063c31d7b42fa564ed556128c71bda.npy +03211117-854a48e0d902d97f9ba2cfdf95405270.npy +03001627-af7331f7b96ebed663b2acb037dfbcde.npy +03691459-168150439eb31ea1ab5fa92a7378b5c0.npy +04256520-6226851e0bf7fca877b7247857f4c82f.npy +02691156-84b07419645a3418bbf3143b1cb6076a.npy +02691156-b9e1ba3782922bab6ad6a28101cd3ecd.npy +02933112-5a639987ce024c8223dd83e725809894.npy +02828884-21e7b25522c63209cb2a965e75be701c.npy +02828884-60757e398b7d51c5c143e86eb74c3988.npy +03636649-a885ba00108cbb63e49675db0062ac74.npy +02808440-537205d65f040f701b9d8cf5b1327a12.npy +04256520-a995c3e90cc656e0c81bdfff91c7f69.npy +04379243-83120585ebf07ee93002761e7a3ba3bd.npy +03467517-fd277b425390a46ba059f9af4d1abb14.npy +02828884-272a4cf3cfff3eb1e173cee47fbaa88.npy +03001627-280d49c0833e2dcecbdbd70308cc5247.npy +04379243-f28a91c02b1f32c7126e8f891cf24099.npy +02933112-d599d283cc1d2615a7547743355554a7.npy +03325088-eea4dfd9dc2a08c3979c556124bee033.npy +02691156-b3fbc7a0b0e3a821fd279055f27928f7.npy +03691459-b4bc7d540893226c507038fac66e20d6.npy +02691156-4d6ec762d1583ded46555ee25941a22e.npy +04401088-15bc36a3ce59163bce8584f8b28da0ba.npy +03991062-6998db7278a59310beedb4c8fd29e2d1.npy +03046257-b43d328f4acf10464b3c42e318f3affc.npy +04379243-657aad273d665f5dd9823f45c4411583.npy +03211117-f7a5ed426a6195d97c8d48014e04ccd1.npy +03593526-e0bf4bf06f17f07a8f5635ac8b18fdb9.npy +04379243-6d1416c57e8a875b214a15a5a42c49c0.npy +04379243-37f8726074a5bbf42979546ca769ba4d.npy +02691156-654a5b26c59c12e5d2c4ce8118ff5045.npy +04379243-81808dc89c4461bd9a3d6682397a3947.npy +04379243-952da8ad85350267b9b072e1f62798f5.npy +03001627-a08870dc5fc0c8aca19799a9cde9e06f.npy +02933112-676bf8a039a5937eeab2bd7322386ffd.npy +03642806-b28638f8c153b9333639bdeac6c4cb9a.npy +02871439-8951258ea1dcbb6eb66213207f46bee7.npy +03991062-eb8d2e7e18906c7f25ebd1cd0b422e32.npy +04379243-83fa3b7b8c9d388144f6e9c2368992d3.npy +03001627-3799a4d787d31c0bc580fdeb5460f6d6.npy +04530566-88ba72c3f33343ae9e6f7dedb7e5f584.npy +02958343-2f1001870f90e06bc48492b454f1615a.npy +02933112-433082675f5505c3c59350d819542ec7.npy +04379243-e630732939f6188957f5e6dcbb0b7930.npy +04379243-93d6b4ad8a164927febad4f49b26ec52.npy +02808440-bc98f11895cecfeb3321831d2245cf06.npy +04530566-693272dde72519813cee85b510079413.npy +02958343-96ca20dd7caff0bb851f021b9ed69c58.npy +03001627-85ce56c719ed2a1df30b232143ef026b.npy +03636649-176c8eee2d45e5d0535a7b6b7a43b6cd.npy +04090263-989b655cb51914dde423072102e0bc5.npy +04379243-88dbdfd6e8cccf1ca9f547acc5e1dd79.npy +04379243-1f05e080ea6e8b64ffcd08faf4fccd0f.npy +02828884-3dec9b1439c42797815b2b467e8e2eac.npy +03928116-93a3f5462dbad13b678c55004ea7d7ee.npy +02880940-32f9c710e264388e2150a45ec52bcbd7.npy +03928116-eb4787175e2f4b2bb55155963a8c9e1c.npy +02691156-952c5b41a44f6f3166cf1b4a8fc3914e.npy +02828884-59c914e55665b02cf24b3c783ba45ac1.npy +03636649-4d61bb37c5edb2903f7bd0762436c545.npy +03636649-935a5b22007014838047317417e6f5d7.npy +03001627-d1af84d4d2af1181c442c1fbb1afe9c5.npy +03001627-eac5ffc4c4a7da80b13f3ad708be4bf6.npy +04379243-f6df49d754e3adfa29e4b5aa807bb4e7.npy +04256520-996265f3d98601ea3bec56bff764ba78.npy +03691459-560a626f93c664ff9069c2d361390698.npy +04379243-6f530fe373def431a6fd617b2ff5d2d.npy +02876657-ab5ca2f648a9daa1b5ad628041310f96.npy +02691156-b785b39d10c33b5de9f07d25f575b2d4.npy +03593526-9e03b1cd20644a638c37cfe791015e2f.npy +03001627-d1c2afb3c53dc7c8c563fcc2752ece39.npy +04256520-c8e37189356e5d1249655ac7c771b113.npy +04530566-2212bb44240a9f0b57cf4c4836e6df44.npy +03691459-f1fbb16afaac70231ad88f716ea80910.npy +03001627-2f6b0ddf12d1311795bea7c29e873d16.npy +02691156-f31be358cb57dffffe198fc7b510f52f.npy +02747177-b537facfbab18da781faebbdea6bd9be.npy +03001627-536dcddf1ca6cd76d7f81f50826c13f0.npy +02958343-2468ceab72b4be041d9cc9d194c8533.npy +03710193-be7157be54725e76cf105027cea05a42.npy +02933112-9e53d5b34c4b403841b765d3dbd065f7.npy +04004475-422e02def4efcfd7175eaa02afd87c2f.npy +02691156-a1d2c8b24476c8ee70d98a97e17b4da3.npy +02828884-3d92cb6fe0abdf9c4ab121f03cb11a77.npy +03790512-ff1fb5a9dd255b059036436a751dc6c2.npy +02933112-ac2f35da065a451c72ddb537ecda2719.npy +03001627-a10370a1cf036ef82d4725b469da72d.npy +02801938-a8943da1522d056650da8b99982a3057.npy +04379243-e9038664b7d35e6b436e6787c76ef3f0.npy +03642806-b210db4bca21536ed6daca3908cc94ab.npy +02958343-e885df5686133eeef43db49cede9f847.npy +02747177-30a637a211d5c2f66e181e3da8402358.npy +04090263-c740e2cadab236e56423adc2e6f1b28d.npy +02828884-427df0fbd51ba54560f140e76bfa752a.npy +04530566-94a0345790869eace074faa875b76f82.npy +02691156-7a57a9b261f60dcb2296d88107d065f6.npy +04530566-b1c2fda8665fa9b19a6e43b878d5b335.npy +04256520-5171a910435f4c949a502993c14408e4.npy +04379243-520fad3fdb9cba4f1f335cc23d448de8.npy +02876657-dc2c07ff617d1da0197a35146ee825cd.npy +02828884-f39401db6cc45a3ae3e15116d1de599a.npy +03001627-56cb679a49a3568998d5fc0473d00a1c.npy +02992529-67c6c3db87a1d72b7b8e0bea6a77fb50.npy +02958343-bd188c1db4c52a2ac35f22936e5aea5c.npy +03001627-cb6ddcf169bb7a0aa9bdc22a1e02e82.npy +02933112-760d765845cfb99b770ba9dfcb1fabed.npy +02992529-ba21b515df2f8a8f19db431d2a67219.npy +03636649-4aba50849f4d24d7581fd19c35a5c8c.npy +04530566-e16e0925ab21f2d3a45eddb1d745bdff.npy +04379243-7d3fc73ccd968863e40d907aaaf9adfd.npy +03991062-28d39c9673775f601a3b47d6d0918049.npy +02933112-1f610516a159e0ce8916d0991ded06e.npy +02691156-383d7574448bf7f235fc197bbabcd5bd.npy +04379243-8662bfcaec06798ac46037df6c915494.npy +02958343-523673c5b3c12ffcf2c89d2df097ef4.npy +02691156-9f5dda6f01bbe29bf810506e9ae2dcc2.npy +04379243-afa91ef326c0309768966ba896bb15dd.npy +02871439-ad4ca1e6d178dedfbdc5348d65406054.npy +02691156-cc630f80fc235ab360c9b6e4c75a092a.npy +03001627-de3e16703bf6581df050758b903e6054.npy +04401088-fabcaa4858df16e35817e30de1dabac4.npy +03001627-9c7b2ed3770d1a6ea6fee8e2140acec9.npy +03046257-9f47c0e99e0edbc8868fb986bc092533.npy +03636649-4c62e3c4f9e46d015da963e90d88cb74.npy +04530566-1d451877c6270d97fe755e3418b63110.npy +03046257-93b1f050ac34adaa7dfe817feb27b203.npy +03046257-8d59e5ca3852b37e4b3c42e318f3affc.npy +03001627-ae1650cc10002a69d65a961d7336a090.npy +03001627-9040047cab148e55e8f8c11a24c52ebb.npy +02691156-b4f41b2faeb528fbf37f38dedb2f1219.npy +04401088-6449223cebdb2dc9c8c3ac9bcbcd9687.npy +02876657-97179a870ed9f12da452d8ffbbc0126.npy +04090263-6454206429467056cfe6670bda9305bc.npy +04090263-78eef5df96ad0496e7c0ece95532142d.npy +03636649-21bca6a33809c7f26f2deb6dd348d3c7.npy +03636649-ff08713d837d87edf2098a9f7fc86999.npy +02876657-f35f3a1ce31850e8b9ca8a85614dd727.npy +04530566-48a037d4699261d3b274bf54d5e89093.npy +03001627-2f4fe1db48f0cac1db573653825dd010.npy +04379243-f856245a7a9485deeb2d738c3fe5867f.npy +03001627-720fd0a6c8cf65e772ee08e78374a212.npy +03001627-e488826128fe3854b300c4ca2f51c01b.npy +04379243-8709ac2f3822955de650492e45fb14f.npy +02954340-a1494210f6774b87b3e0e60b857dde8f.npy +04379243-cca695e66b222f6214038d588fd1342f.npy +03467517-a02ea7bcabae6de39b54ba41102517c4.npy +02691156-b2509e9f52a19466c1006ed55bc1a3fc.npy +04379243-1eab315da8b2588d285aa2b556211c86.npy +04256520-a49f6cfce3d854c7dbbc9440457e303e.npy +04379243-74f407ed9d20d799df0d738d0f301367.npy +03001627-675e25ef07ef717cc8bd7a04c9659f1.npy +03001627-9d7a3b2b7dad91fd611b2c263b5df599.npy +04256520-f125875fefd6a02af487e71bd57b6e0c.npy +04401088-9b91faa0835a0287db45a112fe2d5592.npy +03467517-148ac4fc49e8d965b48e9ff3519bfb40.npy +04554684-38ff66fecee0d18f4f782ac57aea97b.npy +03001627-6b94ccd432d37555fc1390934d948e09.npy +02747177-afe2cc6a31c13eff2b8e1e034cf1c1a9.npy +03001627-5ad4512976afc746564eaedaeaa04f28.npy +03001627-13b6648bdc843b767b5f4d129cc2873d.npy +03001627-b36ec4a65d474384629bdb3bad305eb4.npy +02933112-718f8fe82bc186a086d53ab0fe94e911.npy +03691459-4f53602d946e024af7617b7ba3f8e259.npy +03691459-95268fb7d50ddf77f398d0c5832df00e.npy +04256520-8d61836ca7137a07291d22c7a0bd7119.npy +02691156-73f6ccf1468de18d381fd507da445af6.npy +02691156-89a697d339c01c19452b96e716decae1.npy +02828884-31615e201e29cc11c7f46e918e672933.npy +03001627-fdd8b499294575175f1548797747d63.npy +03211117-55ee60e04ea3816e94accef64b26a3ff.npy +02958343-85f0d4c31c765f33ab91fe0bf146bca2.npy +03467517-c0dc0328e787d4795c0be177939e290.npy +04256520-4bdfbfa1871f2ca114038d588fd1342f.npy +04379243-bd10eeed8d8190ccb041f249f731e3da.npy +02691156-74334440119b4225951971f8370d9050.npy +03593526-e750ae0bc277c1d8afbf399e6f6c09e3.npy +02828884-6ee844357bbc5bddd4d8765e3910f617.npy +04379243-ac7280f9774cd16432bb5d496e1304f7.npy +03001627-8c90c2739c56c5f0327289c00b6dc9ca.npy +03636649-87254ebbd9e57bb84dd6c3274cd9823.npy +04530566-a99574a44a78208981f422b7e55b97ef.npy +03001627-bced50190a0b63cf19fb4103277a6b93.npy +02691156-3baa3ca477d17e1a61f1ef59130c405d.npy +04379243-b2da5c4c116c40a241b160b9adc112fd.npy +02808440-45dbfd115089e0665d107d8487108589.npy +03691459-4b29063d6237b062eabe53d90550c4a6.npy +04379243-242055fadd675e626bf0788e630e3deb.npy +04256520-58d4563bd1114e6a76e9713f57a5fcb6.npy +04256520-656ebb911f3963a81a291b1dd4baf49.npy +04379243-f9d9ef770e04c5772b3242897b354191.npy +03790512-744ab910c5fa999fa036c9ce469c98ce.npy +03691459-84cabb92bca7c3fdf2198539cbd3b69c.npy +02992529-ed52bccead5926dfa9fe1734a6086750.npy +02828884-d0c8a593361ab77d5c3d5e3801c5ac29.npy +02828884-b6ed4377ece0567c78cf4e63fa47661.npy +03691459-eb2545337b85fb987695b38431695f3.npy +03325088-76824ba9aa51eca28ca4aeb5e3b33af7.npy +02808440-56e2c0a605db987e28baeef8b0265e92.npy +02992529-2c1cf34eb46756c1aa8ee930afa0ad31.npy +02691156-f894972de285088da0896c4491cb3db6.npy +02924116-8843d862a7545d0d96db382b382d7132.npy +02992529-610a9f79a2f2faacc43c9f60fcc79b4c.npy +03691459-71c5756cce7bdf8cd6317d54cfc1018f.npy +02958343-35155f8cacf6d72471fc7d1bbf34b979.npy +03593526-6db6c54e6967dfea3481efcd727db3ad.npy +03948459-1c5d487fd6ab7ee88be2a30dd556a09.npy +04256520-16632d002fc0eec9917b96045c9b6dea.npy +04530566-2b7ce6a0492cb7818c0e3fdb2a94c91d.npy +02946921-d3e24e7712e1e82dece466fd8a3f2b40.npy +02958343-37a049a9e32c17b2afe1d4530f4c6e24.npy +02958343-6782126a676ca77d7a04ba129c539b64.npy +03593526-32dc55c3e945384dbc5e533ab711fd24.npy +03797390-1305b9266d38eb4d9f818dd0aa1a251.npy +02876657-f1ae9b2eb551ba466dc523ea4bf73f1c.npy +04090263-57cd6329f163043a551f49d4582a8d17.npy +04379243-487bdb1274b8942ab8e1b99345a5afd4.npy +02958343-eea7f5d02088d49dfdb3c05088c091ae.npy +04256520-932be91adcd83bcf1336f52415aa0825.npy +04530566-3bf976118908886611b5f34c8a675124.npy +02933112-622dadb90004f49fb84959963148f2a2.npy +03001627-701300d51960efc8932a5c2746cd09a4.npy +02924116-6ecb28d595b0afdfd6bb28faf86cc36f.npy +04379243-ab7b56ba63f481af9cd431573238602d.npy +03691459-92658be9ec3307545f7109466a688ac.npy +03636649-d91cf049fa961ccb59f8e31ca87c470e.npy +04379243-e86e665af1e1cae8c2f0a1a44c64aad4.npy +03636649-ce3b5fdadd2b73216aea2f18ee404fd5.npy +04379243-5b5f613742a2d960aec74bea859ea8a3.npy +04256520-1faa4c299b93a3e5593ebeeedbff73b.npy +04256520-388aebe52bbe88757143b902ce4e435d.npy +04379243-817b41f37bc9f022812e3ecbeaae3980.npy +03211117-909bd886fceb080a6facfc0053fedfbe.npy +04256520-d97b919139287ace7842a9c47d0b96c6.npy +02828884-eb7cc5c0c5f8a289d2b12aa6a0f050b3.npy +02924116-43754b18fa7421c57b4161cc118e61c0.npy +02958343-3db034e1e5651f6e6a2345809e2bb169.npy +04379243-5fed2b96d705323b8bec49a2a30e37ed.npy +03691459-b2705ec086216be91a68031139d740d.npy +04554684-62e22f4d1846d8c1fdc6c1669e5c540.npy +04379243-d6410c33772aa719dcafa176d8811639.npy +04256520-6c4e0987896fc5df30c7f4adc2c33ad6.npy +03642806-6ab94ae2ac08a1ff100b1bd8b508fdbe.npy +02808440-569401dd38ba970a45bb0997ddc5cc23.npy +04090263-c80a831394e5fd78f0fea2ee98610322.npy +04530566-a2e82524f7920e12d3ded2945a65f23f.npy +03467517-80f912aac9b3be34e1f2a1daf140ac9f.npy +02691156-df6aae66a8c378ae9029a69fa5fc9ad.npy +03001627-cd939609247df917d9d3572bbd9cf789.npy +03636649-1a3127ade9d7eca4fde8830b9596d8b9.npy +02924116-e4a59aeca9c4b2cbd214cfa3887b8972.npy +02958343-15cc37ac9b3b756acfd826dd468a5497.npy +04379243-831c0e0316d51292df562efe672dd5.npy +04530566-30dcb4eb8ae2163792e235fb0f1931f3.npy +04379243-15985d08df01b47bf0bb193323cf7c6b.npy +03211117-63d4e03c4effa06d6845a0762dd07baf.npy +03001627-8d18fba375d0545edbbc9440457e303e.npy +02942699-a8961c59576972cb57682b709eb0ab19.npy +02924116-ab4c69b08f7fde0d24ac9431afe675b9.npy +04379243-56210576a4afb9cf88d13d4705fa91f.npy +03928116-b3b6d2d1a9ac4032403974271f1920d3.npy +02828884-7c1cf879c84904a4e82028a475156419.npy +03001627-cd9702520ad57689bbc7a6acbd8f058b.npy +03001627-a9422478728741108e21d20fbef78328.npy +02871439-644db4b15b8d63ee62e6dfe993b22a3c.npy +03593526-8da5db60ba2c5f9318694f1cc6fb1f8.npy +04379243-dd0377d3a40b57c360885f79b3a5579a.npy +02958343-616279642d73621812f039db97ce1ef.npy +04379243-5362db12d934a50719fb4103277a6b93.npy +04379243-d5978095ef90e63375dc74e2f2f50364.npy +03691459-a50af511d8cbc8df520f563b6d5bc71a.npy +03991062-31d6283d08bbee76c8a7d034483a2972.npy +02958343-6b896508bdd231887c3c6f82a395b347.npy +02933112-3eddbe968ac08030c59350d819542ec7.npy +04256520-8d98a04f7217d91ad85fd2587ec5bc19.npy +04379243-c621493100ff715f80d6227ff9b21190.npy +04554684-d0960395317be024543213f6b2e6b4ac.npy +03636649-703b4edd4d407a10f8ddacb75f806b29.npy +03001627-18052e6175456b9e7984fb9ec7e40829.npy +03636649-6e2ccf5c1b61a09b6e56ccb2c92c79c.npy +04090263-efb99da78fea81e3534b1adc2aa1709.npy +04379243-98079c9fb39bc736f287ec53a469521.npy +02958343-4024c9fccd9fce80bda733a39f84326d.npy +03046257-374814b7c9a221d6c5f11660af3a01a8.npy +02958343-4fd5c18c1536d65be129fc90649e41d3.npy +04090263-cd60840ecdb0138e4b787ba27f895fbc.npy +04530566-54b6788d413eb45bf6b4f9d652536b82.npy +02691156-ddfbeb997ef83cab884a857d19f7439f.npy +02933112-2a5535f9e24338c7107bd4405fb99a1b.npy +03001627-eee08ec7de613898567232766992241d.npy +02876657-7446fa250adf49c5e7ef9fff09638f8e.npy +04225987-4f409f31b182075511b6d7dda2bf041e.npy +02933112-36bd3f2daa4ed31a921dd903dd0b8b17.npy +04401088-34e36249166b8c6bc3f912172873d52f.npy +04379243-938c5e8ec8703d5f7ff6ace05b36a5.npy +04090263-b8137473d975e1a23111ffeb58c3d257.npy +04379243-c5fc106c1c426fd1db63c1c69fa4f81f.npy +03691459-1e82e94cf9f6bda8fe893ed5dfb6041d.npy +04379243-e7169243daef074dc82dc2efb3363de1.npy +04379243-b96a360ca5a86bcbc48d90eef8384210.npy +04379243-63b6ffe53e027e83aa49ce7283f547d9.npy +03325088-6a8665f6cac2eaf73321831d2245cf06.npy +02933112-1715965e2e1e33e1c59350d819542ec7.npy +02691156-b19771099e1d3cd4d86ebdaa02a63c4b.npy +04379243-9d7a8d4c013bdc8321cf7471b191cb89.npy +03001627-6a254cc3d81881c91a3b39b07e4b3d0f.npy +04256520-a3ec914d44cd2bd8498bd5a555c21b1c.npy +02828884-c0976144b3ec94381076bdfcbbc20a9d.npy +04379243-fefd88656d9d0d2d82e6c3a4e742651d.npy +03691459-63c4583afc2b82237f299e32f8ffced9.npy +03928116-417deddb98e00babb1c932b2548fb93a.npy +02958343-164c8597d8eae2f6f21c3b61f0b564c4.npy +03001627-33334eb57a9d7bbba19d006f28e25379.npy +03211117-e85041124d09cb07318461dc09ee739c.npy +04379243-f4f168b88686872f785f45147f3e474.npy +03001627-2b7335c083d04862ca9c7c1ff5a28926.npy +04379243-77f6685f2df21522bc31aa2bac13542b.npy +02691156-513c955bb46d739683651cbc8e49e4f.npy +03691459-da2fdf0220908ca42744bf8869518694.npy +03001627-2f7a68f4a75dabd41c8c7b57a94dbb2e.npy +03001627-55eeb952519ceb87c3bd24f986301745.npy +04379243-9768599990ec4b54575fb26548334725.npy +04379243-a44a0a014b0c1d60609fb05dbd8681bd.npy +03001627-6534f04a1c349a3c8c6540fe6bc16d6f.npy +02933112-86838c0e4486ee7a8369c37b40e82efa.npy +03001627-65122866840aaccce3d8061f5c8a6fca.npy +04379243-3822df9afd06c2d875a82b88fe6e733f.npy +02691156-8c344cf05ad1bcb7709f5d258bc9a906.npy +02946921-637006720b7886e0c7a50f701fe65efe.npy +04401088-3dac1f92b3e13977d19f91734fdc72ea.npy +04379243-fd5c4da3a081cf115ec69be1b6d2571.npy +04379243-62be982d61ccf61d92e675672199574.npy +02828884-e9a9c499e74c2989d4d8765e3910f617.npy +04379243-d5deca423faade89bb814dc1a3fcda86.npy +03467517-2295ad16efd16ef5fd5758ca36056ece.npy +03593526-c8d8974642d4e88e906c240b881af04f.npy +03001627-e6a8f28b36533f8239b3360f500ac52a.npy +04379243-8504c3823e5485f8951c1fffab4f5807.npy +04379243-88e9d1f8c3f988e62f21cf17406f1f25.npy +03001627-8754831d577cca437c23ad67f25bcfd0.npy +04530566-bf0084fbcc74d5632754043d4b10740c.npy +03001627-d8f3c4bf9266150a579147ba03140821.npy +03001627-8b3619396de4df10db8860d0872e9c55.npy +04379243-2b7fd6106236d935b516de42b9c9697a.npy +02828884-b5b52ba71f6c3c67ad5067eac75a07f7.npy +03001627-401e07ff01b1bfe64d85e9aeb23ad69a.npy +04379243-ed2d5ed8ad10f323593ebeeedbff73b.npy +03691459-115354ddf0cea683c9603934b9e8f5dc.npy +02691156-1ce5b9a79420e946bff7790df3158906.npy +02691156-b3d034788411421019ba010ddb4974fe.npy +03797390-414772162ef70ec29109ad7f9c200d62.npy +03624134-13bf5728b1f3b6cfadd1691b2083e9e7.npy +02828884-6b262d977ea93d23ba6cf6cbb9f4c2bb.npy +03593526-af4c5fab6584a6ead5cc6270d226b60d.npy +03636649-5115f9a3af3470ddfcb8d8c6d4df8143.npy +02958343-ca85286b0ff3b33b16abce8cb03e7794.npy +03001627-38e672f611588c0546863a778f871cc.npy +03642806-22367d72d95e021aa458f8df8b43cd95.npy +03691459-85bbc49aa67149c531baa3c9ee4148cd.npy +04379243-2fd962562b9f0370339797c21e8801b1.npy +04090263-65cc9c9436e0b2c8a50ef3fc203c6ba0.npy +02828884-a31ae6a0f58526af2056b4bd5d870b47.npy +04090263-6acc9c34a79f98d0ff790997f2048517.npy +03001627-3d697c411b8bf8a0df6cfab91d65bb91.npy +02818832-734d564442cc75472b0c00d36a59e875.npy +03691459-da706fc7141b22ece029fab54b6cfbd.npy +03046257-5586a1f6745126e25e0d2ab0e6ad9dae.npy +03928116-3e7cc9b8333865239ff9560d055ab12.npy +03001627-db812fdfacf4db8df51f77a6d7299806.npy +02880940-538db91266f2829bc0f7e0e05bae6131.npy +02828884-9c1a78d3846b8137d839166e2dcdb427.npy +04090263-bc82cf27b55cdf2ed735fa1ab17311ec.npy +04256520-5ec9b56623d25cf1e7d9f0fed41b005f.npy +04379243-d722d42dd739e2a35e0bc0e32d71e297.npy +03710193-e4300f07c82ba3e9d5cb6d178687b980.npy +04379243-d6b61af7935d36a6f0aeabfdcb4e1dd9.npy +04530566-9a6b9049576b97649bbc565383eee97c.npy +02933112-3761d6523fb9d7a73f7e27638e63d848.npy +02691156-1998ee1bf3806b05818b286e41cc1a3f.npy +04401088-177a44b5e36fe9856e10bfa9f3e32b96.npy +03691459-556eebe71c16acc9e17b9e33c097dbff.npy +04090263-8c0e6b3a8ff3e1e75427d4172e3eb61f.npy +04379243-b11f985f0b3aa23379368d1198f406e7.npy +02954340-89717260f663fe13a9d8b37b5c73935c.npy +03211117-6dab3e32b5cb52f1d67173c00f9e1676.npy +04379243-2afb64e4868b6dcb8775a2d8ffff3881.npy +02933112-401960cb8526894f4b8710a3469971b1.npy +04401088-63e84b82309bae535b6795b7faa3170f.npy +03636649-b3ee8dcfd2d814253e793fd9530521a8.npy +02924116-7143a7cb46facddbe550942ea36e5443.npy +03928116-ad905de0c46408bd6e4af8307559a06.npy +03001627-e6daa4f9485362aa37ecff2686b754f4.npy +04401088-b140bdd32b0287a64a21fc95f845c2fa.npy +04256520-d7220a39bcedbb89a14c5748cc240cc2.npy +04401088-521fa79c95f4d3e26d9f55fbf45cc0c.npy +03001627-f68b7c3a1ed7506bedd9ab1253e1a9c4.npy +03642806-5be7aff08cd8dc37253cd18ba2e1c61e.npy +03642806-1d1947a3104bdbf4752cca7e96f0bf86.npy +02871439-702b30de33018393e3c9c743e6bdf782.npy +02958343-4836466e85175a462c4cef95ae3d6c50.npy +02691156-1c798f3e8bcaaed6f34c3a85e57ba71c.npy +03001627-99c8513bc738a21d440d6814caa3115e.npy +03211117-1f6cf74de609bae7f5542066243014cb.npy +03001627-de2bb45b7e200d6916d102513d0383c0.npy +03046257-6e67cbc95bade487603bf63caa67eee0.npy +02924116-b9e51da09e8bac24fd9cfa6c7f5305bc.npy +03001627-4c86a55673764f05597976c675750537.npy +03001627-eeef39917dd113e053624ac0db0f7e5b.npy +04379243-57c935da692d6e4c27c29012942420f.npy +04256520-81afa90f6229e7b456cbf78e1e89022.npy +04401088-136ef91c95ca5c2d4b9a4e1a888c5f59.npy +04256520-9abd7abc15a5f7893eb520ff7cd241f0.npy +04379243-5ad5b050fdf84825ec7962e39e3d3af9.npy +02828884-f48b666e87f0c31f43cda5120584006e.npy +04379243-a42a58b3fae9ce5054f5039bed03ee12.npy +03046257-d8e27d8d60a9a0c091aca0a9b5efd2ce.npy +04530566-df73ce22935c8081b04c44c0f84a941e.npy +03001627-77d71ae4116844e02025d98fb9de28cb.npy +04256520-e3d3c8dfcb19d920cc3e9831f31c9164.npy +04090263-49a566dd82ea542af026df30a0cc38a9.npy +03636649-df908dc58159c82b1b3ffe2c05ec7aca.npy +02958343-6a758f23f6dbf27923978edad4629e6d.npy +04256520-a126dacc76977e063755f577b497208.npy +04256520-543e257122d8fcfacdea6af8dfcc2b18.npy +03642806-78f6f380548e0f7d3fd8284eaee3b0fd.npy +02818832-d61eeba48577fcd511891d07929500ae.npy +03636649-221e2caf85f9bc5a2f9aa70de681f2c4.npy +02828884-22c5aed5cfd1ef997666aea996e0bd15.npy +02828884-abcb5dc91337f47682db9fca4b68095.npy +03001627-681b792d7bc9fdf8305e886266e302e1.npy +02828884-683ddfb4cf9c8f2883f21c04f5e0acd2.npy +02828884-a2678cebeac0a8c9cb2a965e75be701c.npy +02691156-2a966a7e0b07a5239a6e43b878d5b335.npy +02747177-5f2cdda3d519b5a25e96e67cce8b41a9.npy +04530566-73e6d10ad309d831ddb86907b4b5f05d.npy +03001627-9e15b5ae461fe0318fcdb0fca07ec8af.npy +03046257-354a0b83e35282843aab6d48f7ec1b67.npy +04256520-f100212c5848f7d3898b4cd86bfa936c.npy +02958343-8aa1b368270797bdca92a4cdad802b45.npy +02958343-654bf6800566c8ed95b02c654da6c998.npy +02828884-b3b8b909ff02f03ead5067eac75a07f7.npy +04379243-eddd80bdb6f6c8b48bfc6c6704f4dffd.npy +04256520-852abac2613701ed7de67b59dfb031b.npy +02933112-5feaee9848b44d44824662341ce2b233.npy +04256520-e74d866f44f857e77b5d58e18a4bdcae.npy +03790512-a2ee365a26f7ec623228b702032404a6.npy +02691156-72985b83dd9c31955dcafa83e2819ac7.npy +04554684-91cec7275a9b3266a6eaed098287ffd3.npy +03001627-690f208bc221e05d6c891822a43c9279.npy +02691156-cdd4dc06cea48b5faae529ab4a75c4af.npy +04256520-c708f4b2649d5b2c3070413801574f.npy +03624134-3851471620390fd4f43b696124fb3bf.npy +04379243-c0de139953efa6ea2b151d8b52c53b90.npy +03001627-2d4efb02b4369af2473f10e6caaeca56.npy +02933112-aa249df1e594036f730fe631274bee9c.npy +04379243-db09ccbc677e2afc9f60147421585c0d.npy +04379243-a656b27fafb027dbaab26ebe15e9175a.npy +03046257-471eff2ad3d20a6f329dc8ba1de916ab.npy +02871439-e517dc5a967361c3a570c6c691c987a8.npy +02691156-4bd5f77521e76e6a2e690fa6dfd5d610.npy +04530566-25f20d56a125b4028d8e8d98cb30b332.npy +04379243-b48d333e39b8aa1c663191fd557d3a61.npy +03211117-7185d52bc9a5425e2f84cb7932f866fd.npy +02958343-3f18c23d7628966848368c1a2f71c5f3.npy +04379243-18635aca8099ec5a3eec26c23f5bc80b.npy +03001627-6d3081bce72521e088e9c1fdc7b9075c.npy +02946921-a087f6b5ea424ccc785f06f424b9d06.npy +02691156-fe0c4db38fb6399990b1d6deb98feec6.npy +02924116-88520c248bb0d53841cefd10ce5d6cc0.npy +02828884-f264c4d430891732d97248c4337f8439.npy +03991062-c16542905741bce9a2c59a4d90e63212.npy +04379243-17e773bf0007544ce76bc197b3a3ffc0.npy +03467517-93744e9777361d001082f2ea630bf69e.npy +04401088-f75cac5b112f14002c32dcd0becbedb7.npy +04379243-7fa4f9f5b204af31e95cd0dc8c2f0e83.npy +04256520-b69fd1046deab785b3a010e5a9dcf3a8.npy +04256520-59c32d74e6de63643d41bddf307a46a8.npy +04379243-f73cc62cf8ca9d954c7384dbb75cab0d.npy +02801938-6dc3773e131f8001e76bc197b3a3ffc0.npy +03624134-d3ba7967cea5550405f236096897d.npy +02958343-718c595ae03a78208b58723318e7adc2.npy +03636649-4c757abf44253f8360ad823977adaa23.npy +03636649-16ae2568c9e62681f8b8d4a282992be4.npy +03325088-51c0b5604dfebf537fededae3a8b5db1.npy +04401088-7f5b9c8fdb46cf7c562c8e1ac545ef78.npy +04090263-d3fa347a5df7d6207969ab08647690bc.npy +03001627-8538245c2d93c60864c85287e21825c4.npy +02924116-6bba759a037998851bc2b9eaeed055b5.npy +04090263-9b8eb0dfb6dee992572dba079470b351.npy +02828884-1da4abf560002490391b7a189305050.npy +03991062-57202d9819dc44c67d8ecc181daf1385.npy +04090263-173476ce3541392d735fa1ab17311ec.npy +03001627-6c25ec1178e9bab6e545858398955dd1.npy +03624134-be91489dcbb0ce3f1acb5c3b0f893db.npy +02958343-c5758de60af178a11922758510ef0672.npy +04090263-d0eac7ba7e964d72cc34b900bb2492e.npy +03636649-64fe64c30ac05282443f70ad172f4dd5.npy +03337140-ec6fefa43577c689670bb97cf787128f.npy +03636649-13badfc11837c16cc01e0156f398b4d2.npy +02876657-2d912be96504cb8cd5473a45f1da0225.npy +03046257-e5b583b0cf478984d781754d41e2576e.npy +03624134-2fc5036e98cbdf4953cea6a99b7d6232.npy +03636649-efedd8c990f9926c48d945252c13120a.npy +02933112-568a719ffacc4e12f648065fbcc749bc.npy +03636649-69429d8ffb5009a82060e7309fc3fc6.npy +02747177-1d3a7ed6ff0dfc9e63b2acb037dfbcde.npy +03948459-3a8478c9f2c1c043eb81825856d1297f.npy +03636649-923c324c530e9fc412060d1ff2024b3.npy +03948459-a7a340a901d63486260a770f90456bf7.npy +02958343-633dd9755319ce369dfd5136ef0f2af.npy +03001627-e32ee21232d2d5604747ada1cb39a749.npy +03636649-377df6e7a3d84edfa123ce0dff5bf4e6.npy +04401088-eb58b011745519194fde46457697d80.npy +03001627-7905bbf9abc0c264f3443b22038d340.npy +02958343-6026684ab31d567328044fe9244db50a.npy +02958343-b40436b4639e80b8d61b6a34f3fd808c.npy +03001627-ac03fd26e5c499eafbe6ed8d24e16d28.npy +03948459-ed29dd43ad28f042d1987c07c912c6e1.npy +04379243-9d1f337286e7a4d39aabd1d2b22d025.npy +04379243-2e2894138df855b26f88aa1b7f7cc6c6.npy +04090263-8b5cb45c763602a73a70335e147b440b.npy +02958343-453164c9199ebec7e80b7eb39c475065.npy +03001627-4fa8eaacaaad472819fb4103277a6b93.npy +02933112-2d13507d53d201cfc59350d819542ec7.npy +03467517-648a820e550bdfd093f0194265a9746c.npy +04379243-5d59c0f64642450911794406b17d66b.npy +03001627-606bd97f7337bf39b40f0ac0fb9a650d.npy +04379243-7b356bbece2dd658278d386bfa54545.npy +02958343-4a536a6a685e08ea678026e3eac5bb0a.npy +03790512-9f9de88a95b56660b37378f3c85478b4.npy +04379243-1cf7bee4c0dad464c3bd24f986301745.npy +03001627-b10798977605fd017a4de8972b988aa.npy +02828884-ff8f8d280de66226d2b12aa6a0f050b3.npy +03691459-b4cd1e4296c3e9b55ed2ad7d2e018058.npy +02924116-4233caa4bda5d30f481aa8b5531c68a9.npy +04379243-8cb6a2e9ba365c94593ebeeedbff73b.npy +03001627-797b37d3462592b9c8687ff9b0b4e4ac.npy +03001627-5a5b11daa1b5344fb516c05d046e8e45.npy +03001627-2433f576edbb538aae8c9d3b8c4b9bc3.npy +02958343-b09376c77d8fe18eeaa60d48e24f18e0.npy +03001627-3925bf96c05c49d362e682c9809bff14.npy +04379243-50b6c4c7681aa3fcbaf2e78ed413860a.npy +03001627-3c8362c1e57c30d7e6c5cd45aa112726.npy +04401088-d72b00ba0cbe10a1157f4a560c24391b.npy +03636649-ee9cb649ef64105b62095c48c7bd5960.npy +04379243-aee3dc454d9b5af0dccf03d91dc58d38.npy +02828884-e01f988796268414ad5067eac75a07f7.npy +03001627-66c9a5aa7b4e528a290d57214c8512a4.npy +03467517-5b7fcd85ce6fd1931377689fa4e4b2d6.npy +04379243-725f69c0f29b712e8c6540fe6bc16d6f.npy +04256520-fd124209f0bc1222f34e56d1d9ad8c65.npy +03001627-fa89a0401873e5a6bbc7a6acbd8f058b.npy +04256520-a513bc9521717f2593ebeeedbff73b.npy +03642806-5508b5ce2820e4c36efcef06c0770d26.npy +04379243-af53fe05e692a7ea2e09703471e30fff.npy +04379243-87ca3e8e37367054dcabaa2ad147fa73.npy +04379243-400393a56fc243c442c39a4fb8d01418.npy +03001627-43c99f65e19e5c657746f1e767f87dbb.npy +03691459-c58d1c25553a224ad9d271f9da38313c.npy +04256520-7d532887fcd3aef82ddd352288e7672d.npy +02691156-9e57a7d6a7f488dfbd46d022fd7d80aa.npy +02828884-1d9270d0708fb8a1262707c3863d044.npy +03948459-52a1ca1d9bd900ba3ffeeaac0d1e84d4.npy +04090263-5a86afb38048ecc6b2c8bb96250e4a0.npy +03691459-72da46839789175eb6ba1e8b5cf30e.npy +02691156-a5639c976e677ce6e719b5362fe06bbb.npy +02933112-54cbe81983534dc153b10fab8d9d7b30.npy +04379243-2d96d4929d945740b1e23c7675c49239.npy +04379243-ddbcb5a22a0c3aab35de8f8daf95ff3e.npy +03001627-8f668f18d84a6960b27c368aa9b96968.npy +03001627-48f2c6ee2c8ea7538cb22acd3160c793.npy +02691156-c9ad8451915ebe6bbd46d022fd7d80aa.npy +04401088-7bf76e92b684d32671ab0d8014490a7d.npy +02747177-60b4017e16fd9c4f2056b4bd5d870b47.npy +03928116-35732cb2a41f413f645da737acb3ce13.npy +04401088-a9d358ce2d54d95e54c7ab6aa5674ccc.npy +03325088-efac508cef643820979c556124bee033.npy +03001627-55b00797abf243c3cce5160f0c502ac3.npy +03636649-53bac55dfe78177282889f551cb32a81.npy +02828884-27eb79ddf26fd7ac7898580cb9d16864.npy +03001627-893bc32a68f387b0b675b353faa5a26.npy +03211117-1df7bf502e4b0e8647dd811b692e315a.npy +02828884-8bb2354519a2ca276d9eb2ed02ef01ed.npy +02933112-19492e2263ea82e4da5feafe6f1c8fc.npy +04379243-1eece111c9bc0a126172e4028919692e.npy +04379243-31551fca6e4c5d8e80ab58c152cb7c44.npy +03636649-b6d6a772087d456a3dfad56d2a4eefcd.npy +04379243-b36ee7cbb41ad82c9b11da89c22111dd.npy +03001627-8cebf6dde257cfc591a2a5174703986b.npy +04379243-2c6dcfd1c08950554b3c42e318f3affc.npy +02691156-337e7f2c3745e07789d7e2c40a194e8.npy +02876657-d4a8a5243b976630e3eacec6011567b3.npy +03085013-6cbd981e310a0f09a8107a4c74d58321.npy +03790512-40d84e407c46e8d8b31e74d456742c7.npy +04379243-b117aac2e13630bb5d23c9bbb429abf9.npy +03001627-cbf18927a23084bd4a62dd9e5e4067d1.npy +02691156-95e589163afd0a7a609e2d916fa0da27.npy +03001627-bcc73b8ff332b4df3d25ee35360a1f4d.npy +03001627-cace287f0d784f1be6fe3612af521500.npy +04379243-58595b39bcad6b2fad5067eac75a07f7.npy +03001627-ee5ee3f6759aabacf2f43e6f841bd32b.npy +02933112-3b5d7b7fb89b178d50711e66b0db6ed.npy +02933112-b235be00006f3c03e6513d84422cefc4.npy +03001627-fb22d2e3174ed0519fb4103277a6b93.npy +04379243-6c413dd8728bc004d22730b0728b2fc9.npy +02691156-945b33ed9d6844591596c26b5af806fe.npy +04379243-26d174935d283cfd4ea7ef03cbe21992.npy +04379243-130d574de3f9d7e4c3bd24f986301745.npy +03001627-ae02a5d77184ae2638449598167b268b.npy +02958343-34211d29d94cbd52b7c4f0665aafbacd.npy +02933112-95bda55d633ca1824da5feafe6f1c8fc.npy +02691156-dfed744828fceb4d28cd0e56fe42c08.npy +03636649-2a39d5ec8856dba0fcb8d8c6d4df8143.npy +03691459-5bd42cdbb91db055f7e08add4085d009.npy +02691156-194098fb0aefc4a0666bd6da67d3abc2.npy +04379243-7f1edef2e2fe5aee33ed950c745c5ef8.npy +02946921-19fa6044dd31aa8e9487fa707cec1558.npy +04401088-a2dedd1d1369d4ae25bdb70a4d3731d4.npy +02691156-4e66465abe540ee326ccedfb0470de8f.npy +02946921-ac66fb0ff0d50368ced499bff9a86355.npy +03001627-63687e533c0b16b6868fb986bc092533.npy +04401088-7c134eee62290ae7fd130953acb6f543.npy +03001627-1b5e876f3559c231532a8e162f399205.npy +02958343-edbace6013d1c12ae9e1016860f17753.npy +02691156-4cb164f1fce7849762b600da24e0965.npy +04379243-40ff8ae39ad13d014a873bbe35452b88.npy +02691156-46c259e87609c54fafc0cc47720c0ef4.npy +03691459-40efb91680a2a39476ec75ad1a6d21e9.npy +03928116-45166dc50bbf0315ed1c1c47436c7974.npy +04090263-fb38cf43741e1189396ce275998d65f5.npy +04379243-b94ea1b7a715f5052b151d8b52c53b90.npy +03001627-b78fb2778adeba267c26dd76207404f5.npy +03001627-8cbf3d97df981d511fc6bd4aed49cc41.npy +03691459-c8018ed73c5f4087eb927391bdd6c8e8.npy +03046257-636e572331f872e3e7c7920f6a65a54d.npy +04379243-cd6f5c39cdf1b57a93bf4c26a8803fd4.npy +03046257-dcfc273d2a1fd128890f8f44c05e7d8b.npy +02958343-dfa6e60e478d5053705278f93079331.npy +04090263-b266dfc3d3d3606dd281b302c458427.npy +04379243-85a20e4f7fc9256eba9cbc5d66bac4b8.npy +04379243-b3cf5b09372826af658d908a2254f194.npy +03046257-a157e9b6449d763bab2f5d1a742ca172.npy +03001627-b8e4dfe08a43badabaed5cf8a752d243.npy +03325088-1f833904413559adc837473125b7231e.npy +04379243-da3e68c20b832c47a3b06ba374e12b77.npy +03948459-c693ffa50f62a2825fca1d021553f9e4.npy +03624134-d6e9e4e07bafca0fa37f3fc191551700.npy +02828884-c273ce2890d74ae18cca710901c2e97b.npy +04379243-9c44b336e78684647523c0c037b61ec6.npy +02691156-a828cbaf4b3bd253e163b5a191403a0f.npy +02828884-9fc5473602fe0f595896bab37ddebe7.npy +02828884-c2b940127ae286832d07d128adae16ff.npy +03001627-671a43756d51eb613d4c64859ad102f7.npy +04256520-a3970706133f033861b5428f30b376d.npy +04379243-5d63f11757a433b914038d588fd1342f.npy +02691156-66493aa4ae7dbe40b6b87e72ead132ed.npy +02958343-324434f8eea2839bf63ee8a34069b7c5.npy +04256520-c43bb99091f5a02cfd60059ad8523f1a.npy +02691156-30acfedb688a62e72ce638efd383ace8.npy +03001627-bbef7baa438869dd52bee19dc0453f5e.npy +03790512-329e47988e39df1b8c1912cd8631ab82.npy +02933112-275b26f0555e85acf858430284b28022.npy +02958343-7fd2f1d8342aa0acf3aaed7e86215c7b.npy +04090263-73e0ab2e1d0ea752bc6e84bc30e573cd.npy +02828884-616833ef9cfdacba583f5c4be082f8f6.npy +04379243-3e0ae5d25ad60ea285d624cfcd9a37a7.npy +04379243-10c0eecb17d1bac64b3c42e318f3affc.npy +03211117-99ab7f145618ec841a1272c8e47f5670.npy +02691156-4b0f44a76ef66ec9491bc6c980bcf9e4.npy +02691156-8f4416cb67c3807bcf155ddc002a8f77.npy +02958343-eb1d1ac801d6bafbf949c235bf4afe6e.npy +04379243-b11e0feb428f61edf008d8a3590fb522.npy +04379243-83dcf79646ad3f0cf4b6538438a0b930.npy +02924116-a23ee9c160122941193d7855ecfc1bd3.npy +04090263-2bab6ea5f35db3a4aca4b8a57632be04.npy +03001627-2e079c4e7bb26dce9d1cedd9b694fb2.npy +04379243-e52f7c8abd860fb923fe3501bb9e7193.npy +03001627-20ae4b27e86521a32efc7fb40a53aaac.npy +04379243-44295d4ec0d1e1ae4eb7315d59c5142c.npy +02828884-ee50d76492226837926fe0a4cdbf03.npy +04090263-3919b70a16c630f9d735fa1ab17311ec.npy +03001627-4c9b6e0823be25ae52bee19dc0453f5e.npy +03001627-4c6c3346b5d0f071f4b6538438a0b930.npy +04074963-58156300ed442f981047874d2f3335a.npy +03001627-5aa2a53207ff556d473f10e6caaeca56.npy +03636649-292f1f97a543d735dedf3c967c85981a.npy +02958343-487ccd6e9af920e7a7fd25564c2e888e.npy +04379243-11103f4da22fe6604b3c42e318f3affc.npy +03642806-8a4c725dc347e1106ec6e4721582ad38.npy +03001627-b68180bfde45f5a7e450a02d8032dbb0.npy +04379243-8502520f19688aaee12186cc8c5022c7.npy +04401088-2d5f1105a92045c8af0fa49592cf7bc7.npy +04379243-89552ce12717e70d40ef1c8b63a628f9.npy +02924116-a4ea8e5a6c096784b129901f80d24b7b.npy +03001627-6e46e4cce527abc114d449899f34bd9d.npy +04401088-638695025ca04d351d57a73214dd2a04.npy +04379243-72e0f3f2f8f8fcf12f788f981151c5d5.npy +03691459-83f72a05685b80bdc7c51d4ea74651a7.npy +04379243-dbb5de72508efbbbcad4c3cef7575bef.npy +04256520-4c1ac8bd57beb2a9ce59ea70152320fa.npy +04256520-ed6704f132eebc3ef13ce777d031b4b2.npy +04379243-437d7550e95cdf39c0ca344f487323e.npy +04256520-47da08d9c7cd7e104b3c42e318f3affc.npy +02946921-d801d5b05f7d872341d8650f1ad40eb1.npy +02958343-61251733434b9b0c15a23f2b45e10de5.npy +03001627-72da26fc9b49ecd3c3bd24f986301745.npy +03001627-b98b73f29673d7fb6da16f7df2c9a5b0.npy +03001627-914c92a6b9d8e7956160139444912022.npy +03928116-6c084236171a186dcf9cbd6252de4730.npy +04379243-d45385e0a60f71e1427fcd6e404d0cf5.npy +04256520-d5931526b56b157cab610b0c94236463.npy +03636649-efc262f7c8bc9fe66b1291e0cfc0c93d.npy +02958343-b47070a91102db1abe40bb45ea25a041.npy +04256520-8b3b675ddd2305b98eca6e74f79ccd04.npy +02691156-a2712db5540766cdf6a602e459585636.npy +02747177-6f77d79dd74a31fa56f6fc4b4ce1db04.npy +03001627-cd9e22cfd389e5d9d330ae3d046a415c.npy +03001627-5ef4db0419932fe12e5ebb32d8476df8.npy +04379243-f563e9cd92a0dbe5a07b1c1d0ca9cf45.npy +03691459-22e37482f8499fa53a081cb8ab2c8e61.npy +03001627-6d5c6eee9e25b314b3c42e318f3affc.npy +04379243-9ebaa0f7c3a7229be1fb37eefa671b59.npy +03001627-4a5332f5aaa3144836b0f2a1430e993a.npy +03046257-ac4a052a9d8f0985276206fae5d3c473.npy +02933112-2d7bad601f84c83686d53ab0fe94e911.npy +03211117-9b1362da6b7eef2b290d7f93e1252a27.npy +03691459-b5a2b8202014ae157a3d98bc650d077e.npy +04379243-c8cf1c77bbb79d214719088c8e42c6ab.npy +04256520-6b25476464cb4934e039576a17a0737d.npy +02691156-e037cb87e6cdcd76df39601c41fbe0ba.npy +03001627-8590bac753fbcccb203a669367e5b2a.npy +02691156-2026699e25ba56c5fd6b49391fda17.npy +03337140-89595cf7ef0acc6d57f3bb43ed044708.npy +02958343-e00fde4225d166b1ce929ad7e848003e.npy +03797390-d46b98f63a017578ea456f4bbbc96af9.npy +04379243-dbe17b86d79a24f1ae96150e4aa362f9.npy +04090263-8c7f0954c7bde4edc8a5aac636aa172.npy +04090263-5a420b1aff4cbaddeeda694c82280de.npy +02958343-a750b467d629df3e2268f50ab9844c64.npy +03691459-460d5cc9d09ec59eb34ed614d2670aca.npy +03001627-8363376d07da8aebb76e29c9c43bc7aa.npy +02924116-728bbdd6880278e51894d116f1c652.npy +04379243-221812e480905c5464810cc21086da42.npy +03001627-858e98a193f0d82f1a5838237ecfb290.npy +03001627-28fad854838ac444e9920dbaf13176cb.npy +02958343-f655d1adac9c96d53b05c2ad25b4380f.npy +02801938-d5ec4fb3e3a5ff31dd84b16d3edceb0b.npy +02958343-202648a87dd6ad2573e10a7135e947fe.npy +03001627-590d04438aeffbb58f447453fccbd9d3.npy +04090263-608d83aab75edf3c48a76f6e8e0499a6.npy +03001627-bc184c3cbe3349b19fb4103277a6b93.npy +02924116-2060f00f9a4f3d7437277701a400254a.npy +03691459-d97a4771b9d796a22d1a40e420084a6.npy +02691156-572d374ddb49e77a828204947d78b9af.npy +04090263-1c2fb199540516e2b30eb7cfb209da0e.npy +02828884-3b2ef85bafb7669d35382c4d59d1fdb6.npy +03636649-58483a0c6c6dc7056b1291e0cfc0c93d.npy +04379243-51a2b4db530f383339797c21e8801b1.npy +03001627-30f4c4d94f4fcffaf51f77a6d7299806.npy +04379243-ecdcc12d56c119c5a67f11eba80d4fdd.npy +04379243-b9089b8cf70c95e1f4b6538438a0b930.npy +03001627-554f63beeeaa1ca81acd2074f8939f43.npy +03948459-57b571c990cea8a8e1f2a1daf140ac9f.npy +02691156-2c9331f57865a9d2bd34bbc5253f83f8.npy +02828884-7a9a3abadf052b3bbc2f63672224bac8.npy +03001627-8b45782142fe42b02314deb821327685.npy +03001627-364a43c9f94f315496db593b49da23e5.npy +03001627-a5a2d09e5384237869513d0907f19c8f.npy +04256520-fa563ce2209de1961f98c0761af40e04.npy +03001627-b6e744f896a202c119fb4103277a6b93.npy +03636649-6a6fac314f0f295047a478fc5fc970de.npy +02691156-4f8952ff04d33784f64801ad2940cdd5.npy +04379243-2823fa4b1076324dbe0367f0d905ee09.npy +03948459-2625d5e4ee0a349844608b3255ca1886.npy +02691156-d8719b491412ea0bb1cb87d703a74b6f.npy +03991062-2ac7173684edbb4a6d33c50a0ba3f8df.npy +03001627-d9dc32f36e03d9f5ea65a95e759e03d9.npy +02691156-c2f3e3a227aee9ecca8607f540cc62ba.npy +02828884-afaaadcde1146dc2ad5067eac75a07f7.npy +04379243-4380ce2f9c06f92744175b4dddf5be08.npy +03691459-be5e0dbd5a8a589ca04f967bd94443cb.npy +02828884-646caeea9d317c9581faebbdea6bd9be.npy +02828884-abc01ead2541d73f97485073216729ca.npy +04379243-e39bfe8848fbf76540a98a90bd0efcca.npy +04256520-c67a9bc21455b0d9c018b720578a03bd.npy +04256520-ff99fb65f116dc1b24e1cdbdc9a22905.npy +03001627-d8edf163d5f87b055369e32fb818f337.npy +03001627-24fdf6e5090bc3442370db05a58bf9c6.npy +02958343-40e7559b88089f4ba7fd25564c2e888e.npy +03001627-dae6ba7440a71e5152470de2774d6099.npy +03991062-4a53c4af240c562537048583edf8ef2c.npy +02691156-7196ea15821ad2fdd8ff6111270336a9.npy +03211117-6a5ff378aeb44691a3fc5ccb0f902d07.npy +04256520-e7eb561c782fd92163d467b618e97922.npy +03001627-8f248770aa0b4d41e6fe3612af521500.npy +02691156-e3aff5ae3e8f2a7c4c2c88971423d0be.npy +04379243-69adc52c58477affe074517a246f1e65.npy +04090263-ffe08785458e09666314c3b6a3a65519.npy +03001627-8af802214afcb014bd15bdbf03199e85.npy +02691156-b58058567bfe6976b30e3fbc7205ab54.npy +02691156-c2352a98200942e5b39b85af85a55aef.npy +04090263-8d5354101880490994deaa9fff391d41.npy +03001627-7af12c69626b5c1814038d588fd1342f.npy +03691459-93c5159d17de18f02899849b3f61c3c5.npy +04256520-2b49c5bb1f8f8e50febad4f49b26ec52.npy +04379243-96c2ac95683fa21d80a13a8344996270.npy +04379243-70f90f5959de7752c0f947750540fb22.npy +03001627-5e44499940fc3dbe57a847db7547c1f3.npy +03991062-81591729f0bac11821fbc1a8044f930b.npy +04379243-54af9e8e80a0030c42c28aee4f9d8a89.npy +03001627-6f764c190cdf1629307776da88d1350f.npy +04256520-c805dab667ee341ca3ee83e6cad78356.npy +03001627-f294980dc63731dcd0ad32b8d8cec005.npy +03001627-74b3e4fa65510952e6fe3612af521500.npy +03948459-6119e9b1c0566e749f433921788191f3.npy +03001627-798fc5fd5faf3a0580067e3fdc6db24c.npy +02691156-ebb5a048015c13cd35fc197bbabcd5bd.npy +03001627-31dbef39a3c46b07bb8e07e9ebf0b9cb.npy +03211117-2ddb8a9c6a81f7c1be7e1d42d63ca9f0.npy +02876657-d8021dc9fc9109b130612f5c0ef21eb8.npy +03001627-37b6df64a97a5c29369151623ac3890b.npy +03636649-699a8b91af86f5a782db9fca4b68095.npy +02933112-1a9fa73ca819aa994da5feafe6f1c8fc.npy +04256520-9e18b198e803af3513f0322d0d7e53c7.npy +04256520-3415f252bd71495649920492438878e5.npy +04379243-739a2551d3826d5ad25ca1a27cf9bdec.npy +02876657-109d55a137c042f5760315ac3bf2c13e.npy +03991062-df754d2e9170be3581faebbdea6bd9be.npy +02691156-2ba980d080f89581ab2a0ebad7754fba.npy +04090263-a718521e2963077fc24d00518a3dd6ec.npy +03624134-ec1eb959cc203f1de5a365227cfe63ec.npy +02691156-4ce24828099fdb5e744ca709c13b7abe.npy +02773838-774fcae246e7ad25c8724d5673a063a6.npy +03001627-96419956c44757fe71a782a4379556c7.npy +03001627-53316b8bdd729c87a516ad65be981ae.npy +02691156-2ce02b8bb91ecd05c503a3776fc280fe.npy +03325088-64b7cc23f9fe4196b7a867e9b35a1295.npy +02691156-f4453381943f6039eba96cf317eae721.npy +02828884-7de0323af143c38bd4d8765e3910f617.npy +03046257-c527589d3b5780d11217e9f9630541c3.npy +02691156-795894b9a1105df34d210d9468aedaf2.npy +04379243-c017ca698294d3143d27d1af90f27023.npy +02958343-4856ef1e80d356d111f983eb293b51a.npy +02691156-67b7039f53759e92f4fb6842b3610149.npy +04379243-277e13392e16006557183d3afb0a522.npy +04090263-47db3b9c4b94ed61223d66e29bde9a55.npy +04379243-1a42167b30554eb8f5a6c82f073f291b.npy +02691156-caf80ecbad22a7384e1799d9d4d697c3.npy +03001627-6d6a92847f46d8e27b57eb4fc830f67b.npy +02958343-7f42d57ca7041f2df43d27ed950b5659.npy +04379243-32760b2e81bd4deac67fbc2559fd3fde.npy +02958343-b866d7e1b0336aff7c719d2d87c850d8.npy +04379243-4ccb70092f002d124212ff51b27f0221.npy +04090263-da6ec2d5f4d750303d7c323cf1653143.npy +04379243-720024ff80f13fd16fcd22503aabbe.npy +03211117-d0792c5556bdca56d1f6a4fe2f47b311.npy +03691459-c51823c76ebc7f6e464e6423c0222f3b.npy +02828884-3dd362593be47490ad5067eac75a07f7.npy +03001627-8affc6302970a589febad4f49b26ec52.npy +04379243-35f6b25bc7e016228cbb8bac2032149c.npy +03001627-591e310f3cea35a6d6134c153bee8ea0.npy +04379243-f3f6e3dc8c3b0eaf97b6421ec010dd0d.npy +04379243-bda99c11fd261f1ffc980c1b685e9930.npy +04256520-4faad33041ab0f80dd8479d78721b157.npy +04379243-171a3677999c79b32c8109e73b98d509.npy +02691156-a1f740e10229b43a82401bb74114a99.npy +02958343-9698778dc63d5874eee70745894f83bc.npy +04256520-356ee11c9803f1d2fa6df2d54fa43ce.npy +04379243-c4388c59f863de596edd3f7982f0bf26.npy +04379243-ce6e4aa17c710b3cd6d67789347621.npy +02691156-cb5fe2eaa25b2518afd477f714c68df9.npy +03001627-51439579ad42e9cdb52d092517b6bea6.npy +02691156-a271ac76b0e6bbbbb87697d3904b168b.npy +02958343-52f2a2472411fe2e6b418c7d9fedcaa9.npy +03211117-73c5898bf63748ff110eeb6ed2bcbbc.npy +03001627-307b8798217c08579e392c6acd0dd9b0.npy +03691459-79c3e029d9ffbccbe58eb6a4fe5a2344.npy +03046257-2124dd3d1d47f3873f6e4e0af3a53c1b.npy +03211117-1a4216ac5ffbf1e89c7ce4b816b39bd0.npy +04379243-f73fe719094a76ef62e5325f0ce7656f.npy +03046257-69d16120042e134f6cff9b44fdf0517e.npy +03211117-98a4d71b85b581fec92f2f0063445de9.npy +04379243-afbb16b9771a020d123691872d565e10.npy +04090263-347c9ad6b867bf885d0dded52efeb4fd.npy +02691156-45145c5e7924dca8e991cc67fb9c11f.npy +02946921-7e9ea6ccb5a1689a3299d37e620d2f2.npy +03691459-ca5fe10073293be01de55fee5ac2c5c2.npy +02691156-f9cd8293c30f1aaab87697d3904b168b.npy +04379243-132bfde1fabe9ab771a782a4379556c7.npy +02958343-35e4f3bca48aad294361eef216dfeaa6.npy +03046257-60fce7b1ddafa0c0435b6c388b558e5e.npy +04256520-33bd97e462ad2a851b17743c18fb63dc.npy +04256520-3946d23c7716c30d91857b3d2399f830.npy +03691459-375b903579b795abe3917427ea7a0e20.npy +04379243-91c2adae3b942b60d1f4836ba5ad2863.npy +04090263-cd157c59d1caa30b1d9b004d9d8d2781.npy +02958343-38ddc240001c3bd147a34c33abd32f7e.npy +02942699-a59cbd50ecf38a1be2dc67b821479cc4.npy +04090263-a5335cd2243b2d8312b38b1d99376c0b.npy +03046257-e80493545791aa9215bef14ca5ac3fd1.npy +04379243-5fcf8f8ae6c226b03002761e7a3ba3bd.npy +04379243-e2cc21f9d13d06e6a0ab1d82ef09f78f.npy +03001627-41396db6d7b550a411f7226d5cab1e9.npy +04379243-7c71421a06cee4eb85718c281d7fdf61.npy +02691156-e28e5714139535e7a9b2becd26dc2fc1.npy +04256520-f37c09d7ebf82cd642ac3369eef7a7b2.npy +04379243-5b5095b6d5612d298877c667ba5c2021.npy +02958343-d3f0b077f7134654e20af544ce47dd47.npy +03636649-80d86a40527fd0a7edd4171cd40b3feb.npy +04090263-7231363d3ec4da1c9a6e43b878d5b335.npy +02958343-6f7ba033fc5c0784468bac13e007a6e9.npy +03001627-8cc5a1e56c814d86c3cbab763f583b3.npy +04379243-c7f57e76cc1ac45d1ee2805756841071.npy +04379243-34b7b563f09f3e937848af3cb674ead1.npy +02691156-4ff50b9f815c58acca8607f540cc62ba.npy +02958343-8cbc8e27e885eb763ffe0e5069bf1eb5.npy +02958343-5a5b0e1cbb38bdb12d08a76380360b3b.npy +03001627-597cb92a5bfb580eed98cca8f0ccd5f7.npy +03325088-d9e07672c0ee46cc3321831d2245cf06.npy +03001627-41d9bd662687cf503ca22f17e86bab24.npy +04379243-7a488c92c601f83c821340ef6a9a830d.npy +02942699-82819e1201d2dc583a3e53900c6cbba.npy +03691459-52e827d2f969a2b61f2b6130e0fe93a6.npy +04379243-2437cb5665522ae3e329950ec40f6dd.npy +04379243-ba48c686c1070c63f37af16b2893f1d4.npy +03085013-b4795b53530c26c58b13932a0c28e98b.npy +03001627-9531ea3018e8bc70f81c330016997d42.npy +04256520-2fc5cf498b0fa6de1525e8c8552c3a9c.npy +02876657-dc0926ce09d6ce78eb8e919b102c6c08.npy +02773838-151d033af5381fd4c1e1e64c8ea306ea.npy +03211117-2d0b890161ac04b4a4d9f38918617d27.npy +04256520-6d25000aa000a97919fb4103277a6b93.npy +02747177-6a79fcbbe8eb1ec0162da3dc7be329d5.npy +04090263-dffd6f18fbc4f7ec4bd9916dfc5dd6c7.npy +04256520-da07e1f3d336532c2346f81928a3e5eb.npy +02801938-b37a77cec9643bae5257c4bca2a1f0.npy +02828884-943dde2754ddc7822e8ff3556a90169.npy +03948459-282153d65f0f1d3ff913329f55a53c5.npy +04379243-f7d4a0beda480047448174f83c9a5f1f.npy +04256520-a5d1e07789845c85a5aa2898f4de80a0.npy +03001627-5f7615668d2a7b313b8d5c0ebdd194c8.npy +03001627-8c4dd9891dc997b75a627be422951096.npy +03001627-ffa1e25f499e586694e98ee4fdfd7464.npy +03001627-917707ebea9dc26d7ee217c21e683487.npy +02828884-d9de3b770e53a41d5b7bc62e486d578c.npy +04256520-b56d901b6dd62332813204830fbed813.npy +04379243-691b01b959200d20e44c4b5687d5d5c8.npy +04256520-21bf3888008b7aced6d2e576c4ef3bde.npy +04379243-4c804ebc195b99d3f0b45b4b4c7e33b7.npy +03001627-1937193cf5079b623eec26c23f5bc80b.npy +02691156-f067fb1b12badf2b732bda87f2718525.npy +02691156-56c7e0b6f27cc498f3ad4b0977199f23.npy +04256520-fd7aa76019f0149b6626d14151ce40bf.npy +04379243-28f3a48bdca643e22b151d8b52c53b90.npy +04379243-8885e21ea12d6fc2b41f1e9ce6f64e36.npy +04256520-e62ed35d1643a56dc9f016d57db96408.npy +04379243-273f79cbdf5d793c6d5053bb66ea65ce.npy +03001627-294f11afc4b60827d3ddd69b7fa8d158.npy +03948459-70459a553f42c300f85b811e02bb4272.npy +04379243-4da850645da27913a82a6374374c9dbf.npy +02880940-1f910faf81555f8e664b3b9b23ddfcbc.npy +04379243-e0aec1747c4d7c11f24f0645d0949356.npy +03691459-481705a12fb7d10a20363e2561dd589a.npy +03636649-20118bc320eac59890c2e24416edfe5b.npy +02958343-9ec59185338edfde4cb9bf7caeb24dd3.npy +03928116-7bab2683b90d3f5a28f880349b6f36d.npy +03001627-e287403fb2f4234560b08e5f4e1f1a8f.npy +04379243-711d3e719d7655adb8183a4a81361b94.npy +04379243-a70f937b5c1a26e68962005ce0e986db.npy +02828884-f100d0524db0b12c2c031fa3f6d7bfc7.npy +03001627-40f1e0c4aa317c4d492d9da2668ec34c.npy +02958343-85abcf26aa761e9b21e570d3da54bf9d.npy +02691156-c9a6dcf87d1f15bca8607f540cc62ba.npy +04379243-9c21b194e13b84bff51f77a6d7299806.npy +02828884-2c8435941798069d35580c572d992e6.npy +04379243-a6cadf8f6d6e5d26f12d7184a2ad3430.npy +04256520-daf0e2193c5d1096540b442e651b7ad2.npy +04379243-a069fa41fb01fd06ac88fc1a919bbb85.npy +04379243-95e2a1ebabfa741cead99961c8c0ca99.npy +04256520-4c395a8a8fb634d5febad4f49b26ec52.npy +04256520-49a60133d6b05b8d19fb4103277a6b93.npy +02691156-e2116e0b34db656dfca1f1143bb6bc17.npy +03001627-f609378d4f5c755c9df2fbafa78e52d9.npy +02691156-1adb40469ec3636c3d64e724106730cf.npy +03636649-2e18c1bd23e4d89dbb6d3a4b6666d91.npy +04379243-f21154a95d49ca29e6c5cd45aa112726.npy +04379243-c0470c413b0a260979368d1198f406e7.npy +04090263-8e36f1a160e0b98c93cea328065cbce9.npy +04090263-7bd5d9982d9bde427b34e94db5d1bebb.npy +02876657-5f369e223697e7d11901008155be15ef.npy +04090263-3360456861b9f22020a8bc477aad122c.npy +04256520-9f5fd43df32187739f2349486c570dd4.npy +02828884-e9bf24b026df9624ef9a8aedf51bb497.npy +02880940-4cf18594e8851a3d3a5e6305a3a7adee.npy +03691459-fff40d102ca88fdb52648dc23b25b1d.npy +04379243-aff5771db62fa63d2406c215cad9df09.npy +04379243-a0f2dfdf0d8be7ae8a543abce4efe920.npy +03001627-9d9a0d778da758b043e03cfc9885bfb3.npy +02691156-c48af98d47f76002deed0e4a55ad5dd6.npy +03001627-28e147166eb68b2763ed57e35c972b4b.npy +02876657-9eccbc942fc8c0011ee059e8e1a2ee9.npy +02691156-a63e9d5df0c56b3f099bfb561edad43.npy +02958343-af0a12fa33b063ee38ceb1581969287d.npy +04256520-cc32fde4ca022cdf965e01bcaa1587c5.npy +04256520-b0a46e739da332985beab21ea89ae12d.npy +02818832-e354524c42b86792b4c1312ce8c8f69e.npy +02691156-ac3336c2f47b17d5acf77e718d93f3e1.npy +03001627-9f6a7ac15495575f6672e04a03e08d1.npy +04090263-6a7ee4fa2412e0c48c4d70537b8cc0a9.npy +04379243-b22bf7aa80627ee61ded04ad3995fc44.npy +03211117-3dd60d646dc8a3da988b29896df44cd8.npy +04379243-a75a5570ba1571447e1dc03b595bd36c.npy +03001627-86199aed92fa1f68fd60059ad8523f1a.npy +02691156-5b76fbabde77889c99399ee63318a21b.npy +03211117-fb1ca7e50ec3013b493a838ac2ced544.npy +03691459-afa628c3dd7558be89367e7bd925ea7c.npy +02828884-f713433b5702975aad5067eac75a07f7.npy +03001627-110ad013a9ae7a1ab0f4eaf0533e82bb.npy +03211117-9297e108b9780fe7da0ccb8671dd235b.npy +04379243-5d90d0c150935fe6a564497a1c91b4a.npy +02958343-8e39ba11949027ce14914b7641b2fd67.npy +03211117-4a21927379f965a9e4b68d3b17c43658.npy +02818832-b7a13b04910ac53415dd7d7985e749c1.npy +03001627-b058cc77e628ac01c433ba3e0e025e8c.npy +02691156-d99ddce71988c822475045ea78b20eb7.npy +03636649-b5012f398c4e62a330f6e0ede20c4525.npy +03001627-934ad9821e964219c3cf9ae716575390.npy +03790512-5bd41c7d3e158ac93ff4d2f5a7608a24.npy +03636649-732a2b4f7626ca61d197f67767b32741.npy +03636649-ea9721231b1369c93ffd072b23bde58.npy +04256520-e70e0e198e8de08dd23e51328875746a.npy +02691156-b17142a2f2fee3d4e2c19eec35e842ff.npy +03001627-c9817f6e253b7a93a5ac563ee2a0cd75.npy +03001627-bb8d64bab582c3f324e55bc028ee0805.npy +03211117-d96ab618ee698f008eaad608e74402f5.npy +03001627-33442081ed6e32c4504af6e1321617aa.npy +04379243-de96be0a27fe1610d40c07d3c15cc681.npy +04379243-ce7a0aaab23c9317a71c812e027f94d9.npy +02691156-204f4e737fa14aef33ba31f6ad43c835.npy +03325088-d7616893b24c10a2f6f4bab4c9f7b677.npy +03001627-b39ebd5957397e6a5dca6305fb9f97ca.npy +04090263-8145a8a2b974f4df8ae8d8f46e8d6c0.npy +04379243-7b023a0954a15f6b37b9035bdec8f884.npy +03001627-29827b7059783559febad4f49b26ec52.npy +03325088-e179aecff91323b8f538e468c975fa84.npy +02958343-28093822cc7fe487ed3696d854eee1ec.npy +02876657-be16ada66829940a451786f3cbfd6769.npy +03636649-236e0f8f6e74578ccbc9e602dbf6a4a.npy +02958343-924e1a54fad65f4de74f89cd7bde93ef.npy +03691459-5015233bfd8fee3f3e066187e0f408fb.npy +02828884-c70b020a21a7b2de67f2cdc0901bfcfe.npy +04379243-2c6d08c15a19891079dea5ba5d13aa5e.npy +02876657-35ad544a3a4b25b122de9a89c84a71b7.npy +04379243-bd7b7927d8e36c38c563fcc2752ece39.npy +04256520-e9821fb7af7db92b26f6c8b5b75f0ee9.npy +04379243-2199d0e64187366629d8eecf3827c486.npy +02691156-fc7387d630c84bb9c863ab010b80d9ed.npy +03001627-b2bfe0be6956fe34f51f77a6d7299806.npy +04090263-8f520b668fe5212e9f433921788191f3.npy +03797390-9880097f723c98a9bd8c6965c4665b41.npy +02691156-166c9abfb0f5256bbf46baa68c6e37d4.npy +03001627-ee1c0e545ab8dce862b3a719b353f115.npy +03636649-aa34fbd699f88094e5c7ea227b17d897.npy +03001627-41852b57b492559eb36178084a593098.npy +03948459-f377665c5b17d0ce61b636d79e46a7e9.npy +02958343-d9034b15c7f295551a46c391b387480b.npy +03001627-4fdcd44fd622400a97fe55e7ac43b9fd.npy +04090263-2eb8897f028d20bda27aa199c0989017.npy +04256520-2a56ff0143d4e69fe6fe3612af521500.npy +02691156-794fe891e20800d37bbc9fbc6d1fd31d.npy +02691156-117830993cc5887726587cb13c78fb9b.npy +03001627-7ae007a84e6e616d5781796ac0b9d597.npy +04379243-6122a22d4275acc796fcae44a3024b7b.npy +04256520-a11d94a5675bc703265c64fa53bf2c02.npy +02828884-7462c18d6934c5a3a83826e22c7812a6.npy +02958343-25bd9f423333c691f606d4ef0b8dbe5b.npy +02958343-47716b1acaae5b8083653a771e25099b.npy +03691459-c1fd0e8de18620ba27e7754e513f7fef.npy +02958343-c76c5d215cfd21cdee10575a68c30871.npy +03211117-4230f614a9d9a13625acf8f19a51a492.npy +03001627-9a41550ba7dd31e3bf80985a99195eb8.npy +04090263-38d7ad99e308ddc334c4a8f12da88608.npy +02958343-1eae4fcec701c176e742b0b5e87bec54.npy +04256520-33d6c09be1a1a88a48fda83c10428379.npy +02958343-e19292592dd67f1f5400f0dc3171dfcd.npy +02958343-aebaeaf0dfeb9fbe13ded1857c15b5b6.npy +03636649-d582dce8cd58bc57899bad344dc01f2f.npy +02880940-f2ef5e5b49f2bb8340dfb1e6c8f5a333.npy +02958343-96e3179460185d889130d420a26edb84.npy +04379243-cb4cd38679773e6aa1fdf150cebcb587.npy +03790512-b649be9c09e2b332429f1c522640e6f0.npy +04379243-1b82432d7a959b8dfebad4f49b26ec52.npy +04256520-e9e5da988215f06513292732a7b1ed9a.npy +04379243-5a7039feb89ab32f5e6d4b8e7c0423c1.npy +02691156-2da62d609cc59f9a10b920f84a47c477.npy +02876657-940b9e91a4a32a4130612f5c0ef21eb8.npy +04090263-82ed6ca9d8f6e80ba46487e924d32c5c.npy +03790512-94a021f2078cab18da3e5772fc0cd087.npy +03991062-10e72272bc46378a2c59a4d90e63212.npy +03691459-eb7b66a6557a05a4ab7f9d2da6fc61cf.npy +03991062-3167747de7918463ea0d2b3f25b232bb.npy +03636649-f8ca4809b68d1ad6157d629c9921fc15.npy +04379243-3f63afde3842a73affccbd0b169a39.npy +04090263-b6799bf6047f717e7f3efc94c2d31dc5.npy +03046257-c867f47e2bae884fc86d37abb4719793.npy +02691156-cbe8994d1dea1bcb4c3a35cee92bb95b.npy +04379243-6d9d1411a046934418b5d5fe1f3ec412.npy +02691156-a0fd595fdbd3a85113a96c178eda1cb8.npy +02801938-4fcb0ea751f75df936b0f2a1430e993a.npy +02958343-3469d3ab2d353da43a3afd30f2e86bd7.npy +02691156-cc80380c511ec8e2c91a9d486db717.npy +03928116-72f4c5af69cbae5df4e0e15368c84346.npy +04379243-8616d1bc989f83ef2df099df387d2211.npy +03624134-a9a091c148dcd07a156edd8a0a2b1378.npy +04379243-1377448893b499a5a8e4e5c9426fb9cb.npy +02691156-236932c4f4b2f557f5c7319b71bdce6e.npy +04379243-f61d6422de7447bc4c772d26a83f790c.npy +03211117-f4a259b4778a77b37b2bb75885cfc44.npy +02958343-3397f15757f51279e55e3ad998a1ecb4.npy +03001627-17352867f5661212c8687ff9b0b4e4ac.npy +04379243-155a08c8e150e7008c4f202fffc87396.npy +04090263-1b7f1ca21e6ab9cecc34b900bb2492e.npy +04256520-608d9d8434e52a71eaf14273fa406ffc.npy +02958343-ac6977ed53e041392b03387fa8b1d3d5.npy +03636649-5dd2f4d3b253058dd554ab0a45f30de7.npy +02876657-592f62e338fcac1eb0be98650cd7fb6f.npy +03001627-2de1c5525d24c1c988dcbe86402c7c15.npy +03325088-8bff3a6cc3208b86b7a867e9b35a1295.npy +03991062-43890c1681acdb96192cb9598e6d5392.npy +03001627-64ac9e029c4c9eb1671565dae7014737.npy +04256520-e0fd6cc8f2e62ed6d1151897037aebc.npy +04090263-604f91e5b306393fa884e15a61a5f4a2.npy +04256520-1e6d5797be45c5a4443764597a072223.npy +04379243-811a7be3be14bd2b62103e4bff47b4cd.npy +03001627-40e73a326cf95d0361c93c4994c91bd1.npy +03001627-3968956c7bccc24c203eb08a0c3b4355.npy +03691459-e3a37b904381c61a46407779dbd69b2d.npy +03636649-a34db84654a9685f54386f3e4b944407.npy +03624134-ae66cb2b08eb34c0e887497dd1ca4081.npy +03790512-c62066c1ff268bcb9624f6cadda65407.npy +02958343-354274e1c27653a318d9ca1acf6633f6.npy +03001627-89d510c94145f0e0f7628281ecb18112.npy +02958343-bd29875d6aa7be1b2a80b185a779af6c.npy +03797390-c34718bd10e378186c6c61abcbd83e5a.npy +02691156-a95734cb8f7511cb46ed10e8f7fe336e.npy +02958343-27495a8836ead3d55c5dd9508493909b.npy +03001627-a8dd9990ecd74c45435897641a7ee684.npy +03001627-bbe71bb58b7f8f74f51f77a6d7299806.npy +04379243-77daa3ded63dc634d83e8d4109d37961.npy +04090263-108c7545e089109c9838402e8211bd73.npy +04090263-78a0c4ff75258ecf16b34c3751bc447d.npy +03001627-c763d59c0b5c73394925bc492489de9c.npy +03001627-6033c5fa61cb7b79b50d0c6a0c254040.npy +04256520-bc5a26c2915a592091a3aa674c7ec1a3.npy +04379243-25eefc5a3c7b30e1f103d473de33521a.npy +03001627-c3c159a5a56614aad7b20fded0142d7a.npy +03991062-e3fcf5ec83e5fdc54b3c42e318f3affc.npy +04379243-6f052c8606dd3ac3de03ab2a27ba7531.npy +04379243-9b10ca8fefd82fad5c10b08ea69398c3.npy +02801938-cebf28243694a6136aea2f18ee404fd5.npy +04090263-85d730adf18e0c43a06a81572261e82e.npy +02691156-bc7ead8b45952ab8822054a0a020bf4a.npy +04379243-e0194110e31c999aa91c75874136f43d.npy +04256520-4b86c8d86e181ed8f51f77a6d7299806.npy +03001627-5e191b9696ff301e821a29f3de4d7cce.npy +02691156-f6f5efa1554038ce2154ead1f7ab03aa.npy +03001627-445d6cef46b853ee713decb1a0563b12.npy +04090263-166508e16d31488a6a34aa94ca8a3355.npy +02801938-b852202f803c3dfe90c794d3b20112e6.npy +03636649-c5b6259812704f11e3ebe8b18779c486.npy +04379243-8c8690ed4cd0a297e4bbc5bb7fd2afa.npy +03948459-8c9e592c95f95e7c9a6e43b878d5b335.npy +03991062-fe897824c2edaf4fffc6e457221b9271.npy +03046257-6c436e74fedfb0d54fa6e466c3dafd05.npy +04379243-dd528cd176c8d99686de8d6734d81fc9.npy +02691156-d60ec60e091e9d7ade125dc914c4bb9c.npy +03624134-1483e2654c791dbe9f647b36386f24ae.npy +04256520-218a7b0cfc87312925a3aaf903a41c90.npy +04379243-ab08125b4f53c1779595137b79304890.npy +03624134-e31978ce34a288461b22d29e47ec3f2.npy +03928116-fd6034ddb67af9615b39a37797d4a0c4.npy +03636649-5d97be0e2414bfe0a8930422448288ea.npy +04379243-d40ba4b29c5ae69dae14646a8c8ddd34.npy +03001627-30d2d3c887f9592551ae1a6e89264401.npy +04256520-54f81ca969051442e9362c2e21d265df.npy +02691156-4a3950ebb6fe6aca8afca43ae0909988.npy +03001627-cee98619dbdb0e34c5fc2b846c38d941.npy +03991062-93aa00349b151dd37df4feb40f08ca17.npy +04256520-f1e174f8ac0f5254490ad276cd2af3a4.npy +04090263-a7b088a849fdd41c25975e984b0e050b.npy +04090263-e57483ce26ca69b08f70fa6e7b12c70.npy +04379243-6a3ee73d42228f8581654cb17c02fd.npy +02958343-42f45d024ab3309eff673973a435017f.npy +02828884-22da6d7559e28ac9d2b12aa6a0f050b3.npy +03636649-85f0a7c268fd095cfcb8d8c6d4df8143.npy +04090263-eca245f9c180e7c71d9b004d9d8d2781.npy +02958343-1e54527efa629c37a047cd0a07d473f1.npy +02828884-49989a15860936d6601104cd2d998272.npy +04379243-180c5218bb39d31f5510d59f3ab1ed64.npy +03001627-756487465c12a5332165c54dcecaacb4.npy +04379243-14e9f568cd3309dd75becd8a4c3f1866.npy +04379243-b5fe80b6cbb9f5d1a6c03a53cf0a14c9.npy +04379243-a48e4c2930d39f289d297e74104d3ac3.npy +03046257-fdb5537f0899ced0744fc85fe0d3e26e.npy +02958343-b38361e0d9eace2fcf2b292150d31034.npy +04256520-4f5611a5b8b1362e73800789ccff9705.npy +04090263-796816a563f04373c24d00518a3dd6ec.npy +02828884-2e5b449d584725dead5067eac75a07f7.npy +04090263-24ba1a3b18e25e46a3a714c763a6fafd.npy +04256520-ff35b2519455b6577b76a7024ccebf5.npy +03001627-5ca5e3357e5a6d9b45c6cb69e0968783.npy +04090263-a02f13c708f259f97ed475464ab76870.npy +03636649-255dd61372b3509a41657e31b569b105.npy +03325088-3805c03602ebf679c36fb70296e45483.npy +02691156-49e21b81565a51e6493c5f51f14398c7.npy +03691459-bc7938b4fc00ff71984102bc982dc4a5.npy +03691459-28b5a90b428358e173e1b2d018c0512.npy +02691156-b224e74c6de1185a6f498c6206a06582.npy +04379243-3fc5f57053b75b5a91cd5c82dce55c17.npy +03001627-d67d52783e2ef9b76179a6634d17b74.npy +02691156-3b95867a47a8afafe593bc205a118b49.npy +04090263-22063ea2a9d53b569628553cade61af2.npy +03636649-a721beef2162858ca2331382fbc36f94.npy +03001627-5874e2ea2c2b71471b356ab8b24c147.npy +03691459-231104a34a7b7a52c67a971de046381d.npy +03636649-d4bbd93c0d85e77d7934a0d24a61231.npy +02828884-dd56a9259a0eb458f155d75bbf62b80.npy +03790512-2f32164c5a422fe8b44d82a74ebc14c0.npy +04090263-20cbbde170e264f320152153c3a56171.npy +02958343-3cad25b218e0cd506436916a86a90ed7.npy +03001627-ea628b4568d4eb527085b4353236aad.npy +02691156-59043812c2139ea8bbf3143b1cb6076a.npy +02876657-e23f62bb4794ee6a7fdd0518ed16e820.npy +03001627-6534de9a07438b52ee3907b60a74e8f8.npy +03001627-f1f40596ca140cc89cfc48dba5c0e481.npy +02828884-8ff44d4849eeb577ad5067eac75a07f7.npy +03001627-f52c7425a47ff55f79c8c47a54f30eb.npy +02691156-7201e35e5062683571d03b466c72ce41.npy +03001627-6b70334926f7dac3f91663a74ccd2338.npy +03001627-8aa597e8f5498bb0165de6c381540e39.npy +03691459-d414b33288a735c955b62c3398327a83.npy +02958343-30e84a2b779b0e89473f10e6caaeca56.npy +03691459-3fa75b15090b5139ec507a9b4c133ee1.npy +03001627-79c5542f068830463002bb98777d6df5.npy +02958343-62b14fc115d98999f0776ca5816850f0.npy +03948459-f2ab639004ccdb749a6e43b878d5b335.npy +04074963-e739278e9039922dff7f69173a1ae6d4.npy +03636649-3343296bb39a9e679410a04d09c14d1a.npy +02691156-6f8e17cf5180fa96a911ef3962f7cae2.npy +03001627-cb68461343aa852772dadd9292b51ceb.npy +04090263-d805bfbfee78282e6b2c8bb96250e4a0.npy +03001627-609cfbe0dd76c64042e1bb4fe264125f.npy +04090263-3d76e67762cacc714b49cd65dfcc3a9a.npy +03636649-ba3f51c0e1e0adef4cc30865d6337b9c.npy +03325088-dda2fa1732a011278b63cb6175467ac9.npy +03691459-1d4bb07ac73996182339c28050e32573.npy +03636649-213d911cc489c352b5db3f95d706a0c9.npy +03624134-3ef87a241213eb129f30f02514717f00.npy +03691459-29c140fb4eba078c7909eb62c64c0070.npy +04225987-55f0e38a64ba2c2d813b65629a36678.npy +03325088-c4b98fbd29336c5276c18e71fd49c4dc.npy +03624134-b0079bce8ea7d247d647ce6a3f0800a0.npy +02828884-7bbd4d3fed3c4255626d7e3d07da8352.npy +02828884-9ff0e30c911ef3a3cb2a965e75be701c.npy +02691156-32e7224d196e5866bd564bd76cf3cbec.npy +02828884-7540e6df58bf00ff13eaf3e3f6d466d9.npy +03001627-a1e6226c3a23ec808a653a9f65a410f6.npy +03001627-93e72cd3140b32513b5ed5cb2d36de1e.npy +02942699-ff74c4d2e710df3401a67448bf8fe08.npy +03691459-519b0f5581c72a25db30e42459dcb06f.npy +02691156-1eb3af39d93c8bf2ddea2f4a0e0f0d2e.npy +03691459-1db62b6137f51cee8ae98a75d7488e57.npy +03001627-7e433512ef8beb51b17743c18fb63dc.npy +03991062-127b3453b1f73505a2c59a4d90e63212.npy +03691459-370ab315439047cba2fc84df67c2df42.npy +03001627-38f87e02e850d3bd1d5ccc40b510e4bd.npy +03948459-686be742e65eab7816cf8b1cd2155e02.npy +02958343-3f16d6ac013aa946977e464a4b82757d.npy +02691156-f66bf1a9b6d2d109a34fb3db6a11a22d.npy +03001627-198bd40d94930950df6cfab91d65bb91.npy +03991062-4eedf4a65907a4c7a2c59a4d90e63212.npy +03001627-96885d760de5c5e174335c2737ecf4d.npy +03691459-132257fddbebc02ff14235268cca03a3.npy +02691156-66c37aeffd6e73f284306f3bf0a1f2d7.npy +03624134-ca430e94c7e2e3ad8e40258f05c88f27.npy +04090263-4a4387ccf5b0b4a6589c07868201b17e.npy +02691156-a805c30d4b09f11f62347b4731688b0f.npy +02691156-fb2e4eb19ba19bde5fe6cff21a9e8496.npy +03211117-9972709345d24fd31ee6305032661052.npy +02958343-80cae0cc66dcb8a88acb0ff76f4aec7d.npy +02958343-e213d976734431773a3afd30f2e86bd7.npy +02958343-3df6230b2382ec12473f10e6caaeca56.npy +03001627-9c8685c65403dfba2f134420f7b0d7e6.npy +04090263-f8af5b4ded94bfcb9905a3939c890ad2.npy +02958343-30964e51b5218487577fbd27130e143.npy +04090263-bf6268d9d4bd22d89cd99d3d15a8756e.npy +03001627-a23e9e5ace917aa350ff3fe5a0fcba13.npy +03001627-c1d4fcbf5bb6ad11c5beea20858a99d5.npy +04099429-c3f7e3b188f6fe139a6e43b878d5b335.npy +02691156-975c00ab85218a05430355e13bc86b4e.npy +02958343-31055873d40dc262c7477eb29831a699.npy +02691156-de519752147a225032387cdb9b2a84d5.npy +02880940-754634abeb7bffc32977b68653eb2e1e.npy +02691156-4c07126c6ecf5436b7bd17e458d0dcb.npy +03691459-64ba67a67d83811c2b688d771932c023.npy +02691156-707cc578bfec0f671aa9d8d95b6740cc.npy +03211117-bb870360cda15433e441f5bb6f88ca61.npy +02691156-3f387e8586f92b6b7d3b11085e75c7ad.npy +03325088-61c12f5b031b80beb362845c6edb57fc.npy +02691156-e2a6bed8b8920586c7a2c209f9742f15.npy +03636649-6650c1c61c8aefc782db9fca4b68095.npy +03001627-e2809feb8c0b535686c701087a194026.npy +02876657-738d7eb5c8800842f8060bac8721179.npy +02691156-62bc07e9813d75ead46f37bdc1dd4b45.npy +02958343-6ee6fa5c8d664f1349314ffcec1f2f7f.npy +04090263-ad209c1cf7e2cd6249352dd33f95cb9e.npy +02958343-1be075751d7cfbf9ee8e9bd690a19ec1.npy +03636649-402f7ce2b87e7d1ac066b9622c005c53.npy +04090263-ade16e09e79526d487ec12cf5e4563a4.npy +03991062-5dbe8e5eef057cdf17395ba6d552088a.npy +03691459-5b6ffc53d44363b57f2a00f370c25e25.npy +03001627-da264a41dd8fdd655357c338ec9641.npy +04090263-59aee3729d8ae9a6a8304814541fbf2c.npy +03636649-9f5c3ea9f8254b8bd42b9650f19dd425.npy +02958343-b370e4c0d05df8eaf48062edccab3fbd.npy +03624134-3ffc61a3380f4104823590ed8a67d74b.npy +02958343-61645b21c344e22a65dc1e664bdf2e6b.npy +03948459-dd549fdfd38ce511fc43d5b32fa230f.npy +03636649-7eaa7d0cadf48bbfa9bdc22a1e02e82.npy +02958343-222cfde10e0f62e04b00d8f4cd3fae63.npy +02880940-bb7586ebee0dc2be4e346ee2650d150.npy +02958343-b2e13c37cfaba983321ad52c1815971d.npy +03636649-4b6ba211c9731d334c614ad0ec154eb5.npy +02958343-2f839e1e2072a11be55e3ad998a1ecb4.npy +04090263-4407c14eb6e7ba83160ce3b5a19029bc.npy +02691156-d4a8134b2463a8bca8607f540cc62ba.npy +03991062-c045cdd855fdec2b7b6fd5468f603b31.npy +02843684-ef5c972369cdd9bef953ec7f4b3cdf4b.npy +02691156-2efa2cfc42f2ff481b27cd1681a3d0e7.npy +03636649-87d8b99b8a43e2f930f6e0ede20c4525.npy +02691156-845d7718879d26f9a45fa73059b12336.npy +03636649-8581a3ae1f77319ac066b9622c005c53.npy +04090263-193520be26b57b77a5f9d279e263a051.npy +03991062-fab65459e5a9e94ad4d8765e3910f617.npy +04090263-2f86138fadf4e2f5af56497f051566ab.npy +02828884-b023f42464e9591867c8e42cd3ac65ef.npy +02828884-77c2f1b7a7c0a4d15ca1f314f1afc186.npy +03207941-4a4f0713fbabb6e514b35a7d7cea7130.npy +02876657-2976131e4621231655bf395569b6fd5.npy +02691156-dc344ae06e26aa55615ba7bf3620290d.npy +02958343-36cf21268838ce6011718baa6d4afc0b.npy +02828884-778ad8517a34927d2056b4bd5d870b47.npy +02828884-359c7abaf431a05181faebbdea6bd9be.npy +02958343-57ce5193c3ecd067c05c2f3d0d461abf.npy +02691156-5a399ad6696d587d5e37076261ed63.npy +03337140-d879a859aa635c4b91c352d02061b3f7.npy +04090263-fc6bb157d603772d81eae2a60736179d.npy +04090263-e1fd9153928081d93b80701afa3beec5.npy +03991062-7d45da94216b4056a05876905ab3aec3.npy +02828884-44085381e0708de48ee8b7b79b7a0cdc.npy +03624134-e355bd01c8bacaa53630ed68aee4bf94.npy +03207941-37fde5302327d2594a44340bf227e40.npy +03991062-5562563aa6a2f57ec8995c27271d380.npy +02958343-1f5e1b0661b340fc81dcc09cafd93d2e.npy +03337140-b29dbf1f80164b31ebf17edfda20712b.npy +03325088-9599bd738a7a178d76c18e71fd49c4dc.npy +03337140-40129bba38f40b4c4c3aee8e9d3a6ffa.npy +03325088-c7480d5acf4527c5979c556124bee033.npy +02958343-85bb9748c3836e566f81b21e2305c824.npy +03624134-5e515b18ed17a418b056c98b2e5e5e4e.npy +02828884-73a6a42f5e45b3e7a3879b7d5fe7c612.npy +03948459-db78bea32b311c1f873aebd175ac6f11.npy +02958343-b990ae1858bb82c133f84f942f9a2bf5.npy +02691156-8615ac14d65e76efbde09007ce74853c.npy +02828884-ba363a93cf76f9a12056b4bd5d870b47.npy +04090263-cca52c1d48b777b227be842e82df28b3.npy +02828884-b60b9fe791be0f4b1191025061735ea3.npy +04090263-b7e7192d2b8686fb418bdc8c2bd0fb7c.npy +02828884-51197dd964f598fdcb2a965e75be701c.npy +03207941-aa4ad2f41efb815cb022c94235bc8601.npy +03948459-49e379dd689f01258dc97820d1d9537.npy +03325088-bc25edce4945567776c18e71fd49c4dc.npy +02801938-d9f0f7cff584b60d826faebfb5cddf3c.npy +02801938-33a623a68ac3a6541c8c7b57a94dbb2e.npy +02880940-519f07b4ecb0b82ed82a7d8f544ae151.npy +04090263-3b3839d2a22ffe94c5a12959f98a115.npy +02828884-4f9e40b167665d793a0ed7b4771fe31.npy +02828884-e82eace9941d82f34ff3e3166b80bde9.npy +03325088-6412b168fb8b4a66c36fb70296e45483.npy +02828884-2d1dda55020a0c4bad5067eac75a07f7.npy +03991062-64de833b09fd52c3a324047aa5b1f068.npy +03710193-c0a7a35c64ca731aff8240d22dfd73.npy +03325088-677080f1736892d7de9f0235251bc840.npy +04090263-469fe5d0ea2bba70650d38f01656985e.npy +03211117-c4a41bdc2246d79743b1666db9daca7c.npy +03207941-ff421b871c104dabf37a318b55c6a3c.npy +04090263-d11b1767a70922edb99f5bb707709184.npy +03790512-6a9db96b3ed76f956dc3fd80522499a5.npy +03710193-13867ae4ccb3bd627369dcfc2ed54ea4.npy +03928116-804adfb0fa907adc238ec815c61acb8.npy +02828884-7f218ef91e835a90b515d1675be6b5d3.npy +03991062-152ecc698f56f89de499b3a7593b4ee7.npy +02801938-b3b341fb9a2e406e36b0f2a1430e993a.npy +03991062-785bc2c44f44cb1cad250fed8c7992ab.npy +03325088-110a839cc3fbc8013321831d2245cf06.npy +03211117-24f34f582f9072eedc3e7f8ad872247f.npy +03211117-14c9e39b05dd2cf2a07f2e5419bb2c4.npy +04090263-de5438deca7f9f0712b38b1d99376c0b.npy +03211117-58426d216f393034d24e3068806a8c67.npy +03325088-32d86098142a1662842514f9336b4377.npy +02843684-5af661f12389edb3ed772ffb17600448.npy +03325088-1a3a4611409e306c1a832e2972cd1e0d.npy +03211117-dce03c1f0b8365c335f8aa71d1d146bc.npy +03211117-7706cc4ddbc96d4975d665dad1b6a18e.npy +03948459-e6017a1e15095b4e6314c3b6a3a65519.npy +03337140-f44029207e03c4be4c3aee8e9d3a6ffa.npy +04090263-84f068d182437e65b7266db39263f546.npy +03928116-156c4207af6d2c8f1fdc97905708b8ea.npy +04090263-48620fb309184d4bc5e86946f2168706.npy +04090263-48cd9104129535283623b64770edb4be.npy +03207941-3bee2133518d4a2c1f3168043fdd9df6.npy +02876657-134c723696216addedee8d59893c8633.npy +03337140-3faf894d55e26f434c3aee8e9d3a6ffa.npy +03624134-a6efcf0b80f3bc836da16f7df2c9a5b0.npy +03211117-cc5e011d644edf395eae7316b4dfcbbe.npy +03624134-2676cb39be54c6e1bafba8433f5e7ea2.npy +03211117-a20887f46f9974d9a23949c21eddef76.npy +03337140-1d77e77d4324fbd3ce5d6e9371bb5c33.npy +03624134-6f8b660661269406504c6b6d62466c67.npy +03325088-b7758e9c5ce71e1b488d970db5b03bc1.npy +03085013-277e8f771b0aa88a6c71abf53b20bc9c.npy +03928116-a5aa3c091202411a7af9c4121d4bb913.npy +03991062-7bbbae0f1cc9778968423e46bb192f69.npy +03948459-ed051e6c8ac281facb14d3281c3904f0.npy +03211117-2bbf7f77d43b74338a331b18e58c6914.npy +03624134-e79481b2fde3a3ab340fbf70397ab69a.npy +03337140-c3881ea3a2cc38af4c3aee8e9d3a6ffa.npy +03337140-885b945da192390c4bf3cfb743192941.npy +03710193-e7c766dcfb8ed0164b0fc5c705797d05.npy +03710193-985e3c90320c7088d4f2f5e5cacbfd3c.npy +03337140-7ea3fc2b73ab02a91c352d02061b3f7.npy +03948459-263afcd618780865bbace5122b1001f5.npy +03337140-7ae9a738d4a6976991c352d02061b3f7.npy +03325088-4f9b778e5bc6e251a8f6851a5d3f13b6.npy +03325088-dd98f4c4066ad773792c04fd8184496.npy +03325088-5ded149f15be08af526fd4dfffaede08.npy +03991062-c2e11c90827c10a559f9892433e1b1f4.npy +03790512-6b6cf38ed305dc11ab13c10f92a32fc1.npy +03325088-d49e9fdb4246026ed93768e7b9b1eabf.npy +03337140-1a0995936b34c17367aa983983f9bf36.npy +03325088-be5925e681268f3b3321831d2245cf06.npy +03325088-4a9a49b9d5b267d4b7a867e9b35a1295.npy +03325088-c94828ee293222faf38c4a12750d961b.npy +03991062-aa391239edea23a16ba14bfd91a75020.npy +03207941-cbc2eab86b38a9f0275d003e423c59ba.npy +02801938-f0c2ecb032e4230c50da8b99982a3057.npy +03991062-932b6e28eac69cf8ffc6e457221b9271.npy +03991062-abad49fcabe9a8ddec6aad92a03b8466.npy +03991062-ca5fafe57c8c28f8f7a5ccfc89bfeff1.npy +03928116-42911b5824d49af774cbf1cd482c6ca0.npy +03991062-a16d89d5ca6c73aae88c1d6fc3580355.npy +03948459-8fa0dd437e6b8a819f433921788191f3.npy +03624134-9746101f20473d346bbd83c2bc4c3b2e.npy +03991062-415acc982c4a05179d4753b107dff904.npy +03948459-7e868c7ec96377df86ac88920b2701aa.npy +03337140-8aa227e32612e2137f45370489ca3156.npy +03337140-aab0358ff3aaa39691c352d02061b3f7.npy +03624134-df1d7bc513c304c3196b7bf084026530.npy +03624134-db13421379091e50e0b68f51ad1c0011.npy +03991062-55d7d4f52d9eeb2a6727079394e24d70.npy +03624134-3fb80a70e65eff5dd65ee87f16099336.npy +03991062-1732f2d2119b9adc72652f4081ec5a77.npy +04074963-b1a97d944c1b3fa2357f57aad9e1b3cc.npy +03085013-477b37c996a9ae6b61b37d2f08c1bc03.npy +03948459-f5462fcbf5366bd03571d7763ba5a413.npy +03337140-c387da71c07332b13542091189dc62b5.npy +03624134-cf8fe702232541376e5c3f959847ffe.npy +03991062-937e900f03934af4d24a2477b5d154a7.npy +03207941-4bca315fd61741797fb96900a295055a.npy +03991062-44aca0de3323a7adfb0f1b7266d79466.npy +03337140-db11905ab6f06469412dfc90452742c7.npy +03948459-f2e592962a9df3de1d27f57617a4976d.npy +03207941-fb15942e4096d8f0263a7f81856f9708.npy +03991062-dc5f68b4e89c7af3cdca8f9aeee8cb4e.npy +03991062-a66d993b9ced28d843e5f2a8f5f1723a.npy +03991062-e81a175e6b8fb1e1eee538eef7a50e4d.npy +03624134-5da842254c99b0379d40dc50674e6347.npy +03991062-6c9a25f120cdcacc25ebd1cd0b422e32.npy +03991062-3ac8ac4f319e5c0c785f06f424b9d06.npy +03991062-819795e285ea031625ebd1cd0b422e32.npy +03624134-3ca548ca4f557a4cda3cc9549ae4a7d3.npy +02843684-c9a3538b8408c66a33f19716eab42752.npy +04074963-b2c79f7add7cb56ac03df0bb156692e3.npy +03624134-7568cd60cd4d4f143f4deb9ad19fc17.npy +03991062-4f45d2e31a724df4f8d5100b5d851ce4.npy +04074963-259539bd48513e3410d32c800df6e3dd.npy +04074963-6411d7e5e038534c13b3690b5eeccc36.npy +03207941-38a5c62d5c03ae0992270dc2e45328b.npy +03085013-c680be5b4715de9cde3e0c162cb2b41b.npy +03085013-bde7724c6a2c984d4c7427583b874cf1.npy diff --git a/zoo/PointBERT/segmentation/data/shapenet_synset_dict.json b/zoo/PointBERT/segmentation/data/shapenet_synset_dict.json new file mode 100644 index 0000000..712903d --- /dev/null +++ b/zoo/PointBERT/segmentation/data/shapenet_synset_dict.json @@ -0,0 +1 @@ +{"02691156": "airplane", "02747177": "trash bin", "02773838": "bag", "02801938": "basket", "02808440": "bathtub", "02818832": "bed", "02828884": "bench", "02843684": "birdhouse", "02871439": "bookshelf", "02876657": "bottle", "02880940": "bowl", "02924116": "bus", "02933112": "cabinet", "02942699": "camera", "02946921": "can", "02954340": "cap", "02958343": "car", "02992529": "cellphone", "03001627": "chair", "03046257": "clock", "03085013": "keyboard", "03207941": "dishwasher", "03211117": "display", "03261776": "earphone", "03325088": "faucet", "03337140": "file cabinet", "03467517": "guitar", "03513137": "helmet", "03593526": "jar", "03624134": "knife", "03636649": "lamp", "03642806": "laptop", "03691459": "loudspeaker", "03710193": "mailbox", "03759954": "microphone", "03761084": "microwaves", "03790512": "motorbike", "03797390": "mug", "03928116": "piano", "03938244": "pillow", "03948459": "pistol", "03991062": "flowerpot", "04004475": "printer", "04074963": "remote", "04090263": "rifle", "04099429": "rocket", "04225987": "skateboard", "04256520": "sofa", "04330267": "stove", "04379243": "table", "04401088": "telephone", "04460130": "tower", "04468005": "train", "04530566": "watercraft", "04554684": "washer"} \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/data_utils/ShapeNetDataLoader.py b/zoo/PointBERT/segmentation/data_utils/ShapeNetDataLoader.py new file mode 100644 index 0000000..22cdb02 --- /dev/null +++ b/zoo/PointBERT/segmentation/data_utils/ShapeNetDataLoader.py @@ -0,0 +1,271 @@ +# *_*coding:utf-8 *_* +import os +import json +import warnings +import numpy as np +from torch.utils.data import Dataset +import glob +import h5py +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +class PartNormalDataset(Dataset): + def __init__(self,root = './data/shapenetcore_partanno_segmentation_benchmark_v0_normal', npoints=2500, split='train', class_choice=None, normal_channel=False): + self.npoints = npoints + self.root = root + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.normal_channel = normal_channel + + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k: v for k, v in self.cat.items()} + self.classes_original = dict(zip(self.cat, range(len(self.cat)))) + + if not class_choice is None: + self.cat = {k:v for k,v in self.cat.items() if k in class_choice} + # print(self.cat) + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + # print('category', item) + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + # print(fns[0][0:-4]) + if split == 'trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split == 'train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split == 'val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split == 'test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..' % (split)) + exit(-1) + + # print(os.path.basename(fns)) + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = {} + for i in self.cat.keys(): + self.classes[i] = self.classes_original[i] + + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + # for cat in sorted(self.seg_classes.keys()): + # print(cat, self.seg_classes[cat]) + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + + def __getitem__(self, index): + if index in self.cache: + point_set, cls, seg = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + if not self.normal_channel: + point_set = data[:, 0:3] + else: + point_set = data[:, 0:6] + seg = data[:, -1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls, seg) + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + # resample + point_set = point_set[choice, :] + seg = seg[choice] + + return point_set, cls, seg + + def __len__(self): + return len(self.datapath) + + + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = { + 'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15 + } + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + +class ShapeNetC(Dataset): + def __init__(self, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = { + 'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15 + } + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] # number of parts for each category + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + seg = self.seg[item] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + + +DATA_DIR = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' +SHAPENET_C_DIR = '/mnt/lustre/share/jwren/to_kld/shapenet_c' + +def load_data_partseg(partition, sub=None): + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + elif partition == 'shapenet-c': + file = os.path.join(SHAPENET_C_DIR, '%s.h5'%sub) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + + + if partition == 'shapenet-c': + # for h5_name in file: + # f = h5py.File(h5_name, 'r+') + f = h5py.File(file, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') # part seg label + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + else: + for h5_name in file: + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +def rotate_pointcloud(pointcloud): + theta = np.pi*2 * np.random.uniform() + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + pointcloud[:,[0,2]] = pointcloud[:,[0,2]].dot(rotation_matrix) # random rotation (x,z) + return pointcloud \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/data_utils/__pycache__/ShapeNetDataLoader.cpython-37.pyc b/zoo/PointBERT/segmentation/data_utils/__pycache__/ShapeNetDataLoader.cpython-37.pyc new file mode 100644 index 0000000..709da45 Binary files /dev/null and b/zoo/PointBERT/segmentation/data_utils/__pycache__/ShapeNetDataLoader.cpython-37.pyc differ diff --git a/zoo/PointBERT/segmentation/env.sh b/zoo/PointBERT/segmentation/env.sh new file mode 100644 index 0000000..1351ef5 --- /dev/null +++ b/zoo/PointBERT/segmentation/env.sh @@ -0,0 +1,7 @@ +export PATH="/mnt/lustre/share/cuda-10.0/bin:/mnt/lustre/share/gcc/gcc-5.3.0/bin:$PATH" +export LD_LIBRARY_PATH="/mnt/lustre/share/cuda-10.0/lib64:/mnt/lustre/share/gcc/mpc-0.8.1/lib:/mnt/lustre/share/gcc/mpfr-2.4.2/lib:/mnt/lustre/share/gcc/gmp-4.3.2/lib:/mnt/lustre/jwren/anaconda3/lib:$LD_LIBRARY_PATH" + +export CC=/mnt/lustre/share/gcc/gcc-5.3.0/bin/gcc +export CXX=/mnt/lustre/share/gcc/gcc-5.3.0/bin/c++ + +conda activate point-mae \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/models/PointTransformer.py b/zoo/PointBERT/segmentation/models/PointTransformer.py new file mode 100644 index 0000000..3a27442 --- /dev/null +++ b/zoo/PointBERT/segmentation/models/PointTransformer.py @@ -0,0 +1,398 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from timm.models.layers import DropPath, trunc_normal_ +from utils import get_missing_parameters_message, get_unexpected_parameters_message + +from pointnet2_ops import pointnet2_utils +from knn_cuda import KNN + +def fps(data, number): + ''' + data B N 3 + number int + ''' + fps_idx = pointnet2_utils.furthest_point_sample(data, number) + fps_data = pointnet2_utils.gather_operation(data.transpose(1, 2).contiguous(), fps_idx).transpose(1,2).contiguous() + return fps_data + +class Group(nn.Module): + def __init__(self, num_group, group_size): + super().__init__() + self.num_group = num_group + self.group_size = group_size + self.knn = KNN(k=self.group_size, transpose_mode=True) + + + def forward(self, xyz): + ''' + input: B N 3 + --------------------------- + output: B G M 3 + center : B G 3 + ''' + batch_size, num_points, _ = xyz.shape + # fps the centers out + center = fps(xyz, self.num_group) # B G 3 + # knn to get the neighborhood + _, idx = self.knn(xyz, center) # B G M + assert idx.size(1) == self.num_group + assert idx.size(2) == self.group_size + idx_base = torch.arange(0, batch_size, device=xyz.device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.view(-1) + neighborhood = xyz.view(batch_size * num_points, -1)[idx, :] + neighborhood = neighborhood.view(batch_size, self.num_group, self.group_size, 3).contiguous() + # normalize + neighborhood = neighborhood - center.unsqueeze(2) + return neighborhood, center + +class Encoder(nn.Module): + def __init__(self, encoder_channel): + super().__init__() + self.encoder_channel = encoder_channel + self.first_conv = nn.Sequential( + nn.Conv1d(3, 128, 1), + nn.BatchNorm1d(128), + nn.ReLU(inplace=True), + nn.Conv1d(128, 256, 1) + ) + self.second_conv = nn.Sequential( + nn.Conv1d(512, 512, 1), + nn.BatchNorm1d(512), + nn.ReLU(inplace=True), + nn.Conv1d(512, self.encoder_channel, 1) + ) + def forward(self, point_groups): + ''' + point_groups : B G N 3 + ----------------- + feature_global : B G C + ''' + bs, g, n , _ = point_groups.shape + point_groups = point_groups.reshape(bs * g, n, 3) + # encoder + feature = self.first_conv(point_groups.transpose(2,1)) # BG 256 n + feature_global = torch.max(feature,dim=2,keepdim=True)[0] # BG 256 1 + feature = torch.cat([feature_global.expand(-1,-1,n), feature], dim=1)# BG 512 n + feature = self.second_conv(feature) # BG 1024 n + feature_global = torch.max(feature, dim=2, keepdim=False)[0] # BG 1024 + return feature_global.reshape(bs, g, self.encoder_channel) + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + 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] # make torchscript happy (cannot use tensor as tuple) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + 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 + +class Block(nn.Module): + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + +class TransformerEncoder(nn.Module): + """ Transformer Encoder without hierarchical structure + """ + def __init__(self, embed_dim=768, depth=4, num_heads=12, mlp_ratio=4., qkv_bias=False, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.): + super().__init__() + + self.blocks = nn.ModuleList([ + Block( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path = drop_path_rate[i] if isinstance(drop_path_rate, list) else drop_path_rate + ) + for i in range(depth)]) + + def forward(self, x, pos): + feature_list = [] + fetch_idx = [3, 7, 11] + for i, block in enumerate(self.blocks): + x = block(x + pos) + if i in fetch_idx: + feature_list.append(x) + return feature_list + + +from models.pointnet2_utils import PointNetFeaturePropagation +class DGCNN_Propagation(nn.Module): + def __init__(self, k = 16): + super().__init__() + ''' + K has to be 16 + ''' + # print('using group version 2') + self.k = k + self.knn = KNN(k=k, transpose_mode=False) + + self.layer1 = nn.Sequential(nn.Conv2d(768, 512, kernel_size=1, bias=False), + nn.GroupNorm(4, 512), + nn.LeakyReLU(negative_slope=0.2) + ) + + self.layer2 = nn.Sequential(nn.Conv2d(1024, 384, kernel_size=1, bias=False), + nn.GroupNorm(4, 384), + nn.LeakyReLU(negative_slope=0.2) + ) + + @staticmethod + def fps_downsample(coor, x, num_group): + xyz = coor.transpose(1, 2).contiguous() # b, n, 3 + fps_idx = pointnet2_utils.furthest_point_sample(xyz, num_group) + + combined_x = torch.cat([coor, x], dim=1) + + new_combined_x = ( + pointnet2_utils.gather_operation( + combined_x, fps_idx + ) + ) + + new_coor = new_combined_x[:, :3] + new_x = new_combined_x[:, 3:] + + return new_coor, new_x + + def get_graph_feature(self, coor_q, x_q, coor_k, x_k): + + # coor: bs, 3, np, x: bs, c, np + + k = self.k + batch_size = x_k.size(0) + num_points_k = x_k.size(2) + num_points_q = x_q.size(2) + + with torch.no_grad(): + _, idx = self.knn(coor_k, coor_q) # bs k np + assert idx.shape[1] == k + idx_base = torch.arange(0, batch_size, device=x_q.device).view(-1, 1, 1) * num_points_k + idx = idx + idx_base + idx = idx.view(-1) + num_dims = x_k.size(1) + x_k = x_k.transpose(2, 1).contiguous() + feature = x_k.view(batch_size * num_points_k, -1)[idx, :] + feature = feature.view(batch_size, k, num_points_q, num_dims).permute(0, 3, 2, 1).contiguous() + x_q = x_q.view(batch_size, num_dims, num_points_q, 1).expand(-1, -1, -1, k) + feature = torch.cat((feature - x_q, x_q), dim=1) + return feature + + def forward(self, coor, f, coor_q, f_q): + """ coor, f : B 3 G ; B C G + coor_q, f_q : B 3 N; B 3 N + """ + # dgcnn upsample + f_q = self.get_graph_feature(coor_q, f_q, coor, f) + f_q = self.layer1(f_q) + f_q = f_q.max(dim=-1, keepdim=False)[0] + + f_q = self.get_graph_feature(coor_q, f_q, coor_q, f_q) + f_q = self.layer2(f_q) + f_q = f_q.max(dim=-1, keepdim=False)[0] + + return f_q + + + + +class get_model(nn.Module): + def __init__(self, config, **kwargs): + super().__init__() + self.config = config + + self.trans_dim = config.trans_dim + self.depth = config.depth + self.drop_path_rate = config.drop_path_rate + self.cls_dim = config.cls_dim + self.num_heads = config.num_heads + + self.group_size = config.group_size + self.num_group = config.num_group + # grouper + self.group_divider = Group(num_group = self.num_group, group_size = self.group_size) + # define the encoder + self.encoder_dims = config.encoder_dims + self.encoder = Encoder(encoder_channel = self.encoder_dims) + # bridge encoder and transformer + self.reduce_dim = nn.Linear(self.encoder_dims, self.trans_dim) + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.trans_dim)) + self.cls_pos = nn.Parameter(torch.randn(1, 1, self.trans_dim)) + + self.pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim) + ) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] + self.blocks = TransformerEncoder( + embed_dim = self.trans_dim, + depth = self.depth, + drop_path_rate = dpr, + num_heads = self.num_heads + ) + + self.norm = nn.LayerNorm(self.trans_dim) + + self.propagation_2 = PointNetFeaturePropagation(in_channel= self.trans_dim + 3, mlp = [self.trans_dim * 4, self.trans_dim]) + self.propagation_1= PointNetFeaturePropagation(in_channel= self.trans_dim + 3, mlp = [self.trans_dim * 4, self.trans_dim]) + self.propagation_0 = PointNetFeaturePropagation(in_channel= self.trans_dim + 3 + 16, mlp = [self.trans_dim * 4, self.trans_dim]) + self.dgcnn_pro_1 = DGCNN_Propagation(k = 4) + self.dgcnn_pro_2 = DGCNN_Propagation(k = 4) + + self.conv1 = nn.Conv1d(self.trans_dim, 128, 1) + self.bn1 = nn.BatchNorm1d(128) + self.drop1 = nn.Dropout(0.5) + self.conv2 = nn.Conv1d(128, self.cls_dim, 1) + + self.build_loss_func() + + def build_loss_func(self): + self.loss_ce = nn.CrossEntropyLoss() + + def get_loss_acc(self, ret, gt): + loss = self.loss_ce(ret, gt.long()) + pred = ret.argmax(-1) + acc = (pred == gt).sum() / float(gt.size(0)) + return loss, acc * 100 + + def load_model_from_ckpt(self, bert_ckpt_path): + ckpt = torch.load(bert_ckpt_path) + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + for k in list(base_ckpt.keys()): + if k.startswith('transformer_q') and not k.startswith('transformer_q.cls_head'): + base_ckpt[k[len('transformer_q.'):]] = base_ckpt[k] + elif k.startswith('base_model'): + base_ckpt[k[len('base_model.'):]] = base_ckpt[k] + del base_ckpt[k] + + incompatible = self.load_state_dict(base_ckpt, strict=False) + + if incompatible.missing_keys: + print('missing_keys') + print( + get_missing_parameters_message(incompatible.missing_keys) + ) + if incompatible.unexpected_keys: + print('unexpected_keys') + print( + get_unexpected_parameters_message(incompatible.unexpected_keys) + ) + + print(f'[PointTransformer] Successful Loading the ckpt from {bert_ckpt_path}') + + + def forward(self, pts, cls_label): + B,C,N = pts.shape + pts = pts.transpose(-1, -2) # B N 3 + # divide the point clo ud in the same form. This is important + neighborhood, center = self.group_divider(pts) + # # generate mask + # bool_masked_pos = self._mask_center(center, no_mask = False) # B G + # encoder the input cloud blocks + group_input_tokens = self.encoder(neighborhood) # B G N + group_input_tokens = self.reduce_dim(group_input_tokens) + # prepare cls + cls_tokens = self.cls_token.expand(group_input_tokens.size(0), -1, -1) + cls_pos = self.cls_pos.expand(group_input_tokens.size(0), -1, -1) + # add pos embedding + pos = self.pos_embed(center) + # final input + x = torch.cat((cls_tokens, group_input_tokens), dim=1) + pos = torch.cat((cls_pos, pos), dim=1) + # transformer + feature_list = self.blocks(x, pos) + feature_list = [self.norm(x)[:,1:].transpose(-1, -2).contiguous() for x in feature_list] + + cls_label_one_hot = cls_label.view(B, 16, 1).repeat(1, 1, N) + center_level_0 = pts.transpose(-1, -2).contiguous() + f_level_0 = torch.cat([cls_label_one_hot, center_level_0], 1) + + center_level_1 = fps(pts, 512).transpose(-1, -2).contiguous() + f_level_1 = center_level_1 + center_level_2 = fps(pts, 256).transpose(-1, -2).contiguous() + f_level_2 = center_level_2 + center_level_3 = center.transpose(-1, -2).contiguous() + + # init the feature by 3nn propagation + f_level_3 = feature_list[2] + f_level_2 = self.propagation_2(center_level_2, center_level_3, f_level_2, feature_list[1]) + f_level_1 = self.propagation_1(center_level_1, center_level_3, f_level_1, feature_list[0]) + + # bottom up + f_level_2 = self.dgcnn_pro_2(center_level_3, f_level_3, center_level_2, f_level_2) + f_level_1 = self.dgcnn_pro_1(center_level_2, f_level_2, center_level_1, f_level_1) + f_level_0 = self.propagation_0(center_level_0, center_level_1, f_level_0, f_level_1) + + # FC layers + feat = F.relu(self.bn1(self.conv1(f_level_0))) + x = self.drop1(feat) + x = self.conv2(x) + x = F.log_softmax(x, dim=1) + x = x.permute(0, 2, 1) + return x, f_level_3 + + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + def forward(self, pred, target, trans_feat): + total_loss = F.nll_loss(pred, target) + + return total_loss \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/models/pointnet2_utils.py b/zoo/PointBERT/segmentation/models/pointnet2_utils.py new file mode 100644 index 0000000..d13986e --- /dev/null +++ b/zoo/PointBERT/segmentation/models/pointnet2_utils.py @@ -0,0 +1,316 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from time import time +import numpy as np + +def timeit(tag, t): + print("{}: {}s".format(tag, time() - t)) + return time() + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + dist += torch.sum(src ** 2, -1).view(B, N, 1) + dist += torch.sum(dst ** 2, -1).view(B, 1, M) + return dist + + +def index_points(points, idx): + """ + + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S] + Return: + new_points:, indexed points data, [B, S, C] + """ + device = points.device + B = points.shape[0] + view_shape = list(idx.shape) + view_shape[1:] = [1] * (len(view_shape) - 1) + repeat_shape = list(idx.shape) + repeat_shape[0] = 1 + batch_indices = torch.arange(B, dtype=torch.long).to(device).view(view_shape).repeat(repeat_shape) + new_points = points[batch_indices, idx, :] + return new_points + + +def farthest_point_sample(xyz, npoint): + """ + Input: + xyz: pointcloud data, [B, N, 3] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [B, npoint] + """ + device = xyz.device + B, N, C = xyz.shape + centroids = torch.zeros(B, npoint, dtype=torch.long).to(device) + distance = torch.ones(B, N).to(device) * 1e10 + farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device) + batch_indices = torch.arange(B, dtype=torch.long).to(device) + for i in range(npoint): + centroids[:, i] = farthest + centroid = xyz[batch_indices, farthest, :].view(B, 1, 3) + dist = torch.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = torch.max(distance, -1)[1] + return centroids + + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + + +def sample_and_group(npoint, radius, nsample, xyz, points, returnfps=False): + """ + Input: + npoint: + radius: + nsample: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, npoint, nsample, 3] + new_points: sampled points data, [B, npoint, nsample, 3+D] + """ + B, N, C = xyz.shape + S = npoint + fps_idx = farthest_point_sample(xyz, npoint) # [B, npoint, C] + new_xyz = index_points(xyz, fps_idx) + idx = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = index_points(xyz, idx) # [B, npoint, nsample, C] + grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C) + + if points is not None: + grouped_points = index_points(points, idx) + new_points = torch.cat([grouped_xyz_norm, grouped_points], dim=-1) # [B, npoint, nsample, C+D] + else: + new_points = grouped_xyz_norm + if returnfps: + return new_xyz, new_points, grouped_xyz, fps_idx + else: + return new_xyz, new_points + + +def sample_and_group_all(xyz, points): + """ + Input: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, 1, 3] + new_points: sampled points data, [B, 1, N, 3+D] + """ + device = xyz.device + B, N, C = xyz.shape + new_xyz = torch.zeros(B, 1, C).to(device) + grouped_xyz = xyz.view(B, 1, N, C) + if points is not None: + new_points = torch.cat([grouped_xyz, points.view(B, 1, N, -1)], dim=-1) + else: + new_points = grouped_xyz + return new_xyz, new_points + + +class PointNetSetAbstraction(nn.Module): + def __init__(self, npoint, radius, nsample, in_channel, mlp, group_all): + super(PointNetSetAbstraction, self).__init__() + self.npoint = npoint + self.radius = radius + self.nsample = nsample + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv2d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.group_all = group_all + + def forward(self, xyz, points): + """ + Input: + xyz: input points position data, [B, C, N] + points: input points data, [B, D, N] + Return: + new_xyz: sampled points position data, [B, C, S] + new_points_concat: sample points feature data, [B, D', S] + """ + xyz = xyz.permute(0, 2, 1) + if points is not None: + points = points.permute(0, 2, 1) + + if self.group_all: + new_xyz, new_points = sample_and_group_all(xyz, points) + else: + new_xyz, new_points = sample_and_group(self.npoint, self.radius, self.nsample, xyz, points) + # new_xyz: sampled points position data, [B, npoint, C] + # new_points: sampled points data, [B, npoint, nsample, C+D] + new_points = new_points.permute(0, 3, 2, 1) # [B, C+D, nsample,npoint] + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + + new_points = torch.max(new_points, 2)[0] + new_xyz = new_xyz.permute(0, 2, 1) + return new_xyz, new_points + + +class PointNetSetAbstractionMsg(nn.Module): + def __init__(self, npoint, radius_list, nsample_list, in_channel, mlp_list): + super(PointNetSetAbstractionMsg, self).__init__() + self.npoint = npoint + self.radius_list = radius_list + self.nsample_list = nsample_list + self.conv_blocks = nn.ModuleList() + self.bn_blocks = nn.ModuleList() + for i in range(len(mlp_list)): + convs = nn.ModuleList() + bns = nn.ModuleList() + last_channel = in_channel + 3 + for out_channel in mlp_list[i]: + convs.append(nn.Conv2d(last_channel, out_channel, 1)) + bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.conv_blocks.append(convs) + self.bn_blocks.append(bns) + + def forward(self, xyz, points): + """ + Input: + xyz: input points position data, [B, C, N] + points: input points data, [B, D, N] + Return: + new_xyz: sampled points position data, [B, C, S] + new_points_concat: sample points feature data, [B, D', S] + """ + xyz = xyz.permute(0, 2, 1) + if points is not None: + points = points.permute(0, 2, 1) + + B, N, C = xyz.shape + S = self.npoint + new_xyz = index_points(xyz, farthest_point_sample(xyz, S)) + new_points_list = [] + for i, radius in enumerate(self.radius_list): + K = self.nsample_list[i] + group_idx = query_ball_point(radius, K, xyz, new_xyz) + grouped_xyz = index_points(xyz, group_idx) + grouped_xyz -= new_xyz.view(B, S, 1, C) + if points is not None: + grouped_points = index_points(points, group_idx) + grouped_points = torch.cat([grouped_points, grouped_xyz], dim=-1) + else: + grouped_points = grouped_xyz + + grouped_points = grouped_points.permute(0, 3, 2, 1) # [B, D, K, S] + for j in range(len(self.conv_blocks[i])): + conv = self.conv_blocks[i][j] + bn = self.bn_blocks[i][j] + grouped_points = F.relu(bn(conv(grouped_points))) + new_points = torch.max(grouped_points, 2)[0] # [B, D', S] + new_points_list.append(new_points) + + new_xyz = new_xyz.permute(0, 2, 1) + new_points_concat = torch.cat(new_points_list, dim=1) + return new_xyz, new_points_concat + + +class PointNetFeaturePropagation(nn.Module): + def __init__(self, in_channel, mlp): + super(PointNetFeaturePropagation, self).__init__() + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv1d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm1d(out_channel)) + last_channel = out_channel + + def forward(self, xyz1, xyz2, points1, points2): + """ + Input: + xyz1: input points position data, [B, C, N] + xyz2: sampled input points position data, [B, C, S] + points1: input points data, [B, D, N] + points2: input points data, [B, D, S] + Return: + new_points: upsampled points data, [B, D', N] + """ + xyz1 = xyz1.permute(0, 2, 1) + xyz2 = xyz2.permute(0, 2, 1) + + points2 = points2.permute(0, 2, 1) + B, N, C = xyz1.shape + _, S, _ = xyz2.shape + + if S == 1: + interpolated_points = points2.repeat(1, N, 1) + else: + dists = square_distance(xyz1, xyz2) + dists, idx = dists.sort(dim=-1) + dists, idx = dists[:, :, :3], idx[:, :, :3] # [B, N, 3] + + dist_recip = 1.0 / (dists + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_points = torch.sum(index_points(points2, idx) * weight.view(B, N, 3, 1), dim=2) + + if points1 is not None: + points1 = points1.permute(0, 2, 1) + new_points = torch.cat([points1, interpolated_points], dim=-1) + else: + new_points = interpolated_points + + new_points = new_points.permute(0, 2, 1) + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + return new_points + diff --git a/zoo/PointBERT/segmentation/models/utils.py b/zoo/PointBERT/segmentation/models/utils.py new file mode 100644 index 0000000..41dc456 --- /dev/null +++ b/zoo/PointBERT/segmentation/models/utils.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import copy +import logging +import os +from collections import defaultdict +import torch +import torch.nn as nn + +from typing import Any +from typing import Optional, List, Dict, NamedTuple, Tuple, Iterable + +from termcolor import colored + +def get_missing_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the model but not found in a checkpoint. + Args: + keys (list[str]): List of keys that were not found in the checkpoint. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "Some model parameters or buffers are not found in the checkpoint:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "blue") for k, v in groups.items() + ) + return msg + + +def get_unexpected_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the checkpoint but not found in the model. + Args: + keys (list[str]): List of keys that were not found in the model. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "The checkpoint state_dict contains keys that are not used by the model:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "magenta") for k, v in groups.items() + ) + return msg + + +def _strip_prefix_if_present(state_dict: Dict[str, Any], prefix: str) -> None: + """ + Strip the prefix in metadata, if any. + Args: + state_dict (OrderedDict): a state-dict to be loaded to the model. + prefix (str): prefix. + """ + keys = sorted(state_dict.keys()) + if not all(len(key) == 0 or key.startswith(prefix) for key in keys): + return + + for key in keys: + newkey = key[len(prefix):] + state_dict[newkey] = state_dict.pop(key) + + # also strip the prefix in metadata, if any.. + try: + metadata = state_dict._metadata # pyre-ignore + except AttributeError: + pass + else: + for key in list(metadata.keys()): + # for the metadata dict, the key can be: + # '': for the DDP module, which we want to remove. + # 'module': for the actual model. + # 'module.xx.xx': for the rest. + + if len(key) == 0: + continue + newkey = key[len(prefix):] + metadata[newkey] = metadata.pop(key) + + +def _group_checkpoint_keys(keys: List[str]) -> Dict[str, List[str]]: + """ + Group keys based on common prefixes. A prefix is the string up to the final + "." in each key. + Args: + keys (list[str]): list of parameter names, i.e. keys in the model + checkpoint dict. + Returns: + dict[list]: keys with common prefixes are grouped into lists. + """ + groups = defaultdict(list) + for key in keys: + pos = key.rfind(".") + if pos >= 0: + head, tail = key[:pos], [key[pos + 1:]] + else: + head, tail = key, [] + groups[head].extend(tail) + return groups + + +def _group_to_str(group: List[str]) -> str: + """ + Format a group of parameter name suffixes into a loggable string. + Args: + group (list[str]): list of parameter name suffixes. + Returns: + str: formated string. + """ + if len(group) == 0: + return "" + + if len(group) == 1: + return "." + group[0] + + return ".{" + ", ".join(group) + "}" + + +def _named_modules_with_dup( + model: nn.Module, prefix: str = "" +) -> Iterable[Tuple[str, nn.Module]]: + """ + The same as `model.named_modules()`, except that it includes + duplicated modules that have more than one name. + """ + yield prefix, model + for name, module in model._modules.items(): # pyre-ignore + if module is None: + continue + submodule_prefix = prefix + ("." if prefix else "") + name + yield from _named_modules_with_dup(module, submodule_prefix) \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/provider.py b/zoo/PointBERT/segmentation/provider.py new file mode 100644 index 0000000..5604691 --- /dev/null +++ b/zoo/PointBERT/segmentation/provider.py @@ -0,0 +1,251 @@ +import numpy as np + +def normalize_data(batch_data): + """ Normalize the batch data, use coordinates of the block centered at origin, + Input: + BxNxC array + Output: + BxNxC array + """ + B, N, C = batch_data.shape + normal_data = np.zeros((B, N, C)) + for b in range(B): + pc = batch_data[b] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + normal_data[b] = pc + return normal_data + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + + diff --git a/zoo/PointBERT/segmentation/test.sh b/zoo/PointBERT/segmentation/test.sh new file mode 100644 index 0000000..4e3b748 --- /dev/null +++ b/zoo/PointBERT/segmentation/test.sh @@ -0,0 +1,3 @@ +python test_partseg.py \ + --log_dir exp_run2 \ + --gpu 6 \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/test_partseg.py b/zoo/PointBERT/segmentation/test_partseg.py new file mode 100644 index 0000000..add478d --- /dev/null +++ b/zoo/PointBERT/segmentation/test_partseg.py @@ -0,0 +1,186 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +from data_utils.ShapeNetDataLoader import ShapeNetC +import torch +import logging +import sys +import importlib +from tqdm import tqdm +import numpy as np + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} + +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def parse_args(): + '''PARAMETERS''' + parser = argparse.ArgumentParser('PointNet') + parser.add_argument('--batch_size', type=int, default=24, help='batch size in testing') + parser.add_argument('--gpu', type=str, default='0', help='specify gpu device') + parser.add_argument('--num_point', type=int, default=2048, help='point Number') + parser.add_argument('--log_dir', type=str, required=True, help='experiment root') + parser.add_argument('--normal', action='store_true', default=False, help='use normals') + parser.add_argument('--num_votes', type=int, default=3, help='aggregate segmentation scores with voting') + return parser.parse_args() + + +def main(args): + # def log_string(str): + # logger.info(str) + # print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + experiment_dir = 'log/part_seg/' + args.log_dir + + '''LOG''' + # args = parse_args() + # logger = logging.getLogger("Model") + # logger.setLevel(logging.INFO) + # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # file_handler = logging.FileHandler('%s/eval.txt' % experiment_dir) + # file_handler.setLevel(logging.INFO) + # file_handler.setFormatter(formatter) + # logger.addHandler(file_handler) + # log_string('PARAMETER ...') + # log_string(args) + + # root = 'data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.num_point, split='test', normal_channel=args.normal) + # testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + TEST_DATASET = ShapeNetC(partition='shapenet-c', sub='dropout_local_4', class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + print("The number of test data is: %d" % len(TEST_DATASET)) + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + model_name = os.listdir(experiment_dir + '/logs')[0].split('.')[0] + MODEL = importlib.import_module(model_name) + + from easydict import EasyDict + model_config = EasyDict( + trans_dim= 384, + depth= 12, + drop_path_rate= 0.1, + cls_dim= 50, + num_heads= 6, + group_size= 32, + num_group= 128, + encoder_dims= 256, + ) + + # classifier = MODEL.get_model(num_part, normal_channel=args.normal).cuda() + classifier = MODEL.get_model(model_config).cuda() + checkpoint = torch.load(str(experiment_dir) + '/checkpoints/best_model.pth') + classifier.load_state_dict(checkpoint['model_state_dict']) + + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + batchsize, num_point, _ = points.size() + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + vote_pool = torch.zeros(target.size()[0], target.size()[1], num_part).cuda() + + for _ in range(args.num_votes): + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + vote_pool += seg_pred + + seg_pred = vote_pool / args.num_votes + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): # part is not present, no prediction as well + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + print('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + print('Accuracy is: %.5f' % test_metrics['accuracy']) + print('Class avg accuracy is: %.5f' % test_metrics['class_avg_accuracy']) + print('Class avg mIOU is: %.5f' % test_metrics['class_avg_iou']) + print('Inctance avg mIOU is: %.5f' % test_metrics['inctance_avg_iou']) + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/PointBERT/segmentation/train.py b/zoo/PointBERT/segmentation/train.py new file mode 100644 index 0000000..a3f17eb --- /dev/null +++ b/zoo/PointBERT/segmentation/train.py @@ -0,0 +1,323 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +import torch +import datetime +import logging +import sys +import importlib +import shutil +import provider +import numpy as np +from timm.scheduler import CosineLRScheduler +from pathlib import Path +from tqdm import tqdm +from data_utils.ShapeNetDataLoader import ShapeNetPart + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--model', type=str, default='pointnet_part_seg', help='model name') + parser.add_argument('--batch_size', type=int, default=32, help='batch Size during training') + parser.add_argument('--epoch', default=300, type=int, help='epoch to run') + parser.add_argument('--learning_rate', default=0.0005, type=float, help='initial learning rate') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + parser.add_argument('--optimizer', type=str, default='Adam', help='Adam or SGD') + parser.add_argument('--log_dir', type=str, default=None, help='log path') + parser.add_argument('--decay_rate', type=float, default=5e-2, help='weight decay') + parser.add_argument('--npoint', type=int, default=2048, help='point Number') + parser.add_argument('--normal', action='store_true', default=False, help='use normals') + parser.add_argument('--step_size', type=int, default=20, help='decay step for lr decay') + parser.add_argument('--lr_decay', type=float, default=0.5, help='decay rate for lr decay') + parser.add_argument('--pretrain_weight', type=str, default='', help='weight') + + return parser.parse_args() + + +def main(args): + def log_string(str): + logger.info(str) + print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + '''CREATE DIR''' + timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + exp_dir = Path('./log/') + exp_dir.mkdir(exist_ok=True) + exp_dir = exp_dir.joinpath('part_seg') + exp_dir.mkdir(exist_ok=True) + if args.log_dir is None: + exp_dir = exp_dir.joinpath(timestr) + else: + exp_dir = exp_dir.joinpath(args.log_dir) + exp_dir.mkdir(exist_ok=True) + checkpoints_dir = exp_dir.joinpath('checkpoints/') + checkpoints_dir.mkdir(exist_ok=True) + log_dir = exp_dir.joinpath('logs/') + log_dir.mkdir(exist_ok=True) + + '''LOG''' + args = parse_args() + logger = logging.getLogger("Model") + logger.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler('%s/%s.txt' % (log_dir, args.model)) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + log_string('PARAMETER ...') + log_string(args) + + # root = 'data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' + + # TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='trainval', normal_channel=args.normal) + # trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, drop_last=True) + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='test', normal_channel=args.normal) + # testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=10) + TRAIN_DATASET = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, pin_memory=True, drop_last=True) + + TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + log_string("The number of training data is: %d" % len(TRAIN_DATASET)) + log_string("The number of test data is: %d" % len(TEST_DATASET)) + + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + shutil.copy('models/%s.py' % args.model, str(exp_dir)) + shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + from easydict import EasyDict + model_config = EasyDict( + trans_dim= 384, + depth= 12, + drop_path_rate= 0.1, + cls_dim= 50, + num_heads= 6, + group_size= 32, + num_group= 128, + encoder_dims= 256, + ) + + classifier = MODEL.get_model(model_config).cuda() + criterion = MODEL.get_loss().cuda() + classifier.apply(inplace_relu) + if args.pretrain_weight: + classifier.load_model_from_ckpt(args.pretrain_weight) + + start_epoch = 0 + + def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + decay = [] + no_decay = [] + for name, param in model.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # print(name) + no_decay.append(param) + else: + decay.append(param) + return [ + {'params': no_decay, 'weight_decay': 0.}, + {'params': decay, 'weight_decay': weight_decay}] + param_groups = add_weight_decay(classifier, weight_decay=args.decay_rate) + optimizer = torch.optim.AdamW(param_groups, lr = args.learning_rate, weight_decay=args.decay_rate) + + scheduler = CosineLRScheduler(optimizer, + t_initial=args.epoch, + t_mul=1, + lr_min=1e-6, + decay_rate=0.1, + warmup_lr_init=1e-6, + warmup_t=10, + cycle_limit=1, + t_in_epochs=True) + + + def bn_momentum_adjust(m, momentum): + if isinstance(m, torch.nn.BatchNorm2d) or isinstance(m, torch.nn.BatchNorm1d): + m.momentum = momentum + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECCAY = 0.5 + MOMENTUM_DECCAY_STEP = args.step_size + + best_acc = 0 + global_epoch = 0 + best_class_avg_iou = 0 + best_inctance_avg_iou = 0 + + for epoch in range(start_epoch, args.epoch): + mean_correct = [] + + log_string('Epoch %d (%d/%s):' % (global_epoch + 1, epoch + 1, args.epoch)) + '''Adjust learning rate and BN momentum''' + log_string('Learning rate:%f' % optimizer.param_groups[0]['lr']) + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECCAY ** (epoch // MOMENTUM_DECCAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + classifier = classifier.train() + + '''learning one epoch''' + for i, (points, label, target) in tqdm(enumerate(trainDataLoader), total=len(trainDataLoader), smoothing=0.9): + optimizer.zero_grad() + + points = points.data.numpy() + points[:, :, 0:3] = provider.random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, 0:3] = provider.shift_point_cloud(points[:, :, 0:3]) + points = torch.Tensor(points) + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + + seg_pred, trans_feat = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + + correct = pred_choice.eq(target.data).cpu().sum() + mean_correct.append(correct.item() / (args.batch_size * args.npoint)) + loss = criterion(seg_pred, target, trans_feat) + loss.backward() + optimizer.step() + train_instance_acc = np.mean(mean_correct) + log_string('Train accuracy is: %.5f lr = %.6f' % (train_instance_acc, optimizer.param_groups[0]['lr'])) + scheduler.step(epoch) + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + log_string('Epoch %d test Accuracy: %f Class avg mIOU: %f Inctance avg mIOU: %f' % ( + epoch + 1, test_metrics['accuracy'], test_metrics['class_avg_iou'], test_metrics['inctance_avg_iou'])) + if (test_metrics['inctance_avg_iou'] >= best_inctance_avg_iou): + logger.info('Save model...') + savepath = str(checkpoints_dir) + '/best_model.pth' + log_string('Saving at %s' % savepath) + state = { + 'epoch': epoch, + 'train_acc': train_instance_acc, + 'test_acc': test_metrics['accuracy'], + 'class_avg_iou': test_metrics['class_avg_iou'], + 'inctance_avg_iou': test_metrics['inctance_avg_iou'], + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, savepath) + log_string('Saving model....') + + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + if test_metrics['class_avg_iou'] > best_class_avg_iou: + best_class_avg_iou = test_metrics['class_avg_iou'] + if test_metrics['inctance_avg_iou'] > best_inctance_avg_iou: + best_inctance_avg_iou = test_metrics['inctance_avg_iou'] + log_string('Best accuracy is: %.5f' % best_acc) + log_string('Best class avg mIOU is: %.5f' % best_class_avg_iou) + log_string('Best inctance avg mIOU is: %.5f' % best_inctance_avg_iou) + global_epoch += 1 + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/PointBERT/segmentation/train.sh b/zoo/PointBERT/segmentation/train.sh new file mode 100644 index 0000000..0a2b10b --- /dev/null +++ b/zoo/PointBERT/segmentation/train.sh @@ -0,0 +1,5 @@ +python train.py \ + --model PointTransformer \ + --gpu 6 \ + --pretrain_weight /mnt/lustre/ldkong/models/Point-BERT/segmentation/models/Point-BERT.pth \ + --log_dir exp_run2 \ No newline at end of file diff --git a/zoo/PointBERT/segmentation/train_partseg.py b/zoo/PointBERT/segmentation/train_partseg.py new file mode 100644 index 0000000..0ecc28d --- /dev/null +++ b/zoo/PointBERT/segmentation/train_partseg.py @@ -0,0 +1,317 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +import torch +import datetime +import logging +import sys +import importlib +import shutil +import provider +import numpy as np +from timm.scheduler import CosineLRScheduler +from pathlib import Path +from tqdm import tqdm +from data_utils.ShapeNetDataLoader import PartNormalDataset + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--model', type=str, default='pointnet_part_seg', help='model name') + parser.add_argument('--batch_size', type=int, default=16, help='batch Size during training') + parser.add_argument('--epoch', default=300, type=int, help='epoch to run') + parser.add_argument('--learning_rate', default=0.0005, type=float, help='initial learning rate') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + parser.add_argument('--optimizer', type=str, default='Adam', help='Adam or SGD') + parser.add_argument('--log_dir', type=str, default=None, help='log path') + parser.add_argument('--decay_rate', type=float, default=5e-2, help='weight decay') + parser.add_argument('--npoint', type=int, default=2048, help='point Number') + parser.add_argument('--normal', action='store_true', default=False, help='use normals') + parser.add_argument('--step_size', type=int, default=20, help='decay step for lr decay') + parser.add_argument('--lr_decay', type=float, default=0.5, help='decay rate for lr decay') + parser.add_argument('--pretrain_weight', type=str, default='', help='weight') + + return parser.parse_args() + + +def main(args): + def log_string(str): + logger.info(str) + print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + '''CREATE DIR''' + timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + exp_dir = Path('./log/') + exp_dir.mkdir(exist_ok=True) + exp_dir = exp_dir.joinpath('part_seg') + exp_dir.mkdir(exist_ok=True) + if args.log_dir is None: + exp_dir = exp_dir.joinpath(timestr) + else: + exp_dir = exp_dir.joinpath(args.log_dir) + exp_dir.mkdir(exist_ok=True) + checkpoints_dir = exp_dir.joinpath('checkpoints/') + checkpoints_dir.mkdir(exist_ok=True) + log_dir = exp_dir.joinpath('logs/') + log_dir.mkdir(exist_ok=True) + + '''LOG''' + args = parse_args() + logger = logging.getLogger("Model") + logger.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler('%s/%s.txt' % (log_dir, args.model)) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + log_string('PARAMETER ...') + log_string(args) + + root = 'data/shapenetcore_partanno_segmentation_benchmark_v0_normal/' + + TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='trainval', normal_channel=args.normal) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, drop_last=True) + TEST_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='test', normal_channel=args.normal) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=10) + log_string("The number of training data is: %d" % len(TRAIN_DATASET)) + log_string("The number of test data is: %d" % len(TEST_DATASET)) + + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + shutil.copy('models/%s.py' % args.model, str(exp_dir)) + shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + from easydict import EasyDict + model_config = EasyDict( + trans_dim= 384, + depth= 12, + drop_path_rate= 0.1, + cls_dim= 50, + num_heads= 6, + group_size= 32, + num_group= 128, + encoder_dims= 256, + ) + + classifier = MODEL.get_model(model_config).cuda() + criterion = MODEL.get_loss().cuda() + classifier.apply(inplace_relu) + if args.pretrain_weight: + classifier.load_model_from_ckpt(args.pretrain_weight) + + start_epoch = 0 + + def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + decay = [] + no_decay = [] + for name, param in model.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # print(name) + no_decay.append(param) + else: + decay.append(param) + return [ + {'params': no_decay, 'weight_decay': 0.}, + {'params': decay, 'weight_decay': weight_decay}] + param_groups = add_weight_decay(classifier, weight_decay=args.decay_rate) + optimizer = torch.optim.AdamW(param_groups, lr = args.learning_rate, weight_decay=args.decay_rate) + + scheduler = CosineLRScheduler(optimizer, + t_initial=args.epoch, + t_mul=1, + lr_min=1e-6, + decay_rate=0.1, + warmup_lr_init=1e-6, + warmup_t=10, + cycle_limit=1, + t_in_epochs=True) + + + def bn_momentum_adjust(m, momentum): + if isinstance(m, torch.nn.BatchNorm2d) or isinstance(m, torch.nn.BatchNorm1d): + m.momentum = momentum + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECCAY = 0.5 + MOMENTUM_DECCAY_STEP = args.step_size + + best_acc = 0 + global_epoch = 0 + best_class_avg_iou = 0 + best_inctance_avg_iou = 0 + + for epoch in range(start_epoch, args.epoch): + mean_correct = [] + + log_string('Epoch %d (%d/%s):' % (global_epoch + 1, epoch + 1, args.epoch)) + '''Adjust learning rate and BN momentum''' + log_string('Learning rate:%f' % optimizer.param_groups[0]['lr']) + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECCAY ** (epoch // MOMENTUM_DECCAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + classifier = classifier.train() + + '''learning one epoch''' + for i, (points, label, target) in tqdm(enumerate(trainDataLoader), total=len(trainDataLoader), smoothing=0.9): + optimizer.zero_grad() + + points = points.data.numpy() + points[:, :, 0:3] = provider.random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, 0:3] = provider.shift_point_cloud(points[:, :, 0:3]) + points = torch.Tensor(points) + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + + seg_pred, trans_feat = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + + correct = pred_choice.eq(target.data).cpu().sum() + mean_correct.append(correct.item() / (args.batch_size * args.npoint)) + loss = criterion(seg_pred, target, trans_feat) + loss.backward() + optimizer.step() + train_instance_acc = np.mean(mean_correct) + log_string('Train accuracy is: %.5f lr = %.6f' % (train_instance_acc, optimizer.param_groups[0]['lr'])) + scheduler.step(epoch) + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + seg_pred, _ = classifier(points, to_categorical(label, num_classes)) + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + log_string('Epoch %d test Accuracy: %f Class avg mIOU: %f Inctance avg mIOU: %f' % ( + epoch + 1, test_metrics['accuracy'], test_metrics['class_avg_iou'], test_metrics['inctance_avg_iou'])) + if (test_metrics['inctance_avg_iou'] >= best_inctance_avg_iou): + logger.info('Save model...') + savepath = str(checkpoints_dir) + '/best_model.pth' + log_string('Saving at %s' % savepath) + state = { + 'epoch': epoch, + 'train_acc': train_instance_acc, + 'test_acc': test_metrics['accuracy'], + 'class_avg_iou': test_metrics['class_avg_iou'], + 'inctance_avg_iou': test_metrics['inctance_avg_iou'], + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, savepath) + log_string('Saving model....') + + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + if test_metrics['class_avg_iou'] > best_class_avg_iou: + best_class_avg_iou = test_metrics['class_avg_iou'] + if test_metrics['inctance_avg_iou'] > best_inctance_avg_iou: + best_inctance_avg_iou = test_metrics['inctance_avg_iou'] + log_string('Best accuracy is: %.5f' % best_acc) + log_string('Best class avg mIOU is: %.5f' % best_class_avg_iou) + log_string('Best inctance avg mIOU is: %.5f' % best_inctance_avg_iou) + global_epoch += 1 + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/zoo/PointBERT/tools/__init__.py b/zoo/PointBERT/tools/__init__.py new file mode 100644 index 0000000..7841e51 --- /dev/null +++ b/zoo/PointBERT/tools/__init__.py @@ -0,0 +1,5 @@ +from .runner import run_net +from .runner import test_net +from .runner_BERT_pretrain import run_net as BERT_pretrain_run_net +from .runner_BERT_finetune import run_net as BERT_finetune_run_net +from .runner_BERT_finetune import test_net as BERT_test_run_net \ No newline at end of file diff --git a/zoo/PointBERT/tools/builder.py b/zoo/PointBERT/tools/builder.py new file mode 100644 index 0000000..fac1d87 --- /dev/null +++ b/zoo/PointBERT/tools/builder.py @@ -0,0 +1,164 @@ +import os, sys +# online package +import torch +# optimizer +import torch.optim as optim +# dataloader +from datasets import build_dataset_from_cfg +from models import build_model_from_cfg +# utils +from utils.logger import * +from utils.misc import * +from timm.scheduler import CosineLRScheduler + +def dataset_builder(args, config): + dataset = build_dataset_from_cfg(config._base_, config.others) + shuffle = config.others.subset == 'train' + if args.distributed: + sampler = torch.utils.data.distributed.DistributedSampler(dataset, shuffle = shuffle) + dataloader = torch.utils.data.DataLoader(dataset, batch_size = config.others.bs, + num_workers = int(args.num_workers), + drop_last = config.others.subset == 'train', + worker_init_fn = worker_init_fn, + sampler = sampler) + else: + sampler = None + dataloader = torch.utils.data.DataLoader(dataset, batch_size=config.others.bs, + shuffle = shuffle, + drop_last = config.others.subset == 'train', + num_workers = int(args.num_workers), + worker_init_fn=worker_init_fn) + return sampler, dataloader + +def model_builder(config): + model = build_model_from_cfg(config) + return model + +def build_opti_sche(base_model, config): + opti_config = config.optimizer + if opti_config.type == 'AdamW': + def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + decay = [] + no_decay = [] + for name, param in model.module.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # print(name) + no_decay.append(param) + else: + decay.append(param) + return [ + {'params': no_decay, 'weight_decay': 0.}, + {'params': decay, 'weight_decay': weight_decay}] + param_groups = add_weight_decay(base_model, weight_decay=opti_config.kwargs.weight_decay) + optimizer = optim.AdamW(param_groups, **opti_config.kwargs) + elif opti_config.type == 'Adam': + optimizer = optim.Adam(base_model.parameters(), **opti_config.kwargs) + elif opti_config.type == 'SGD': + optimizer = optim.SGD(base_model.parameters(), nesterov=True, **opti_config.kwargs) + else: + raise NotImplementedError() + + sche_config = config.scheduler + if sche_config.type == 'LambdaLR': + scheduler = build_lambda_sche(optimizer, sche_config.kwargs) # misc.py + elif sche_config.type == 'CosLR': + scheduler = CosineLRScheduler(optimizer, + t_initial=sche_config.kwargs.epochs, + t_mul=1, + lr_min=1e-6, + decay_rate=0.1, + warmup_lr_init=1e-6, + warmup_t=sche_config.kwargs.initial_epochs, + cycle_limit=1, + t_in_epochs=True) + elif sche_config.type == 'StepLR': + scheduler = torch.optim.lr_scheduler.StepLR(optimizer, **sche_config.kwargs) + elif sche_config.type == 'function': + scheduler = None + else: + raise NotImplementedError() + + if config.get('bnmscheduler') is not None: + bnsche_config = config.bnmscheduler + if bnsche_config.type == 'Lambda': + bnscheduler = build_lambda_bnsche(base_model, bnsche_config.kwargs) # misc.py + scheduler = [scheduler, bnscheduler] + + return optimizer, scheduler + +def resume_model(base_model, args, logger = None): + ckpt_path = os.path.join(args.experiment_path, 'ckpt-last.pth') + if not os.path.exists(ckpt_path): + print_log(f'[RESUME INFO] no checkpoint file from path {ckpt_path}...', logger = logger) + return 0, 0 + print_log(f'[RESUME INFO] Loading model weights from {ckpt_path}...', logger = logger ) + + # load state dict + map_location = {'cuda:%d' % 0: 'cuda:%d' % args.local_rank} + state_dict = torch.load(ckpt_path, map_location=map_location) + # parameter resume of base model + # if args.local_rank == 0: + base_ckpt = {k.replace("module.", ""): v for k, v in state_dict['base_model'].items()} + base_model.load_state_dict(base_ckpt, strict = True) + + # parameter + start_epoch = state_dict['epoch'] + 1 + best_metrics = state_dict['best_metrics'] + if not isinstance(best_metrics, dict): + best_metrics = best_metrics.state_dict() + # print(best_metrics) + + print_log(f'[RESUME INFO] resume ckpts @ {start_epoch - 1} epoch( best_metrics = {str(best_metrics):s})', logger = logger) + return start_epoch, best_metrics + +def resume_optimizer(optimizer, args, logger = None): + ckpt_path = os.path.join(args.experiment_path, 'ckpt-last.pth') + if not os.path.exists(ckpt_path): + print_log(f'[RESUME INFO] no checkpoint file from path {ckpt_path}...', logger = logger) + return 0, 0, 0 + print_log(f'[RESUME INFO] Loading optimizer from {ckpt_path}...', logger = logger ) + # load state dict + state_dict = torch.load(ckpt_path, map_location='cpu') + # optimizer + optimizer.load_state_dict(state_dict['optimizer']) + +def save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, prefix, args, logger = None): + if args.local_rank == 0: + torch.save({ + 'base_model' : base_model.module.state_dict() if args.distributed else base_model.state_dict(), + 'optimizer' : optimizer.state_dict(), + 'epoch' : epoch, + 'metrics' : metrics.state_dict() if metrics is not None else dict(), + 'best_metrics' : best_metrics.state_dict() if best_metrics is not None else dict(), + }, os.path.join(args.experiment_path, prefix + '.pth')) + print_log(f"Save checkpoint at {os.path.join(args.experiment_path, prefix + '.pth')}", logger = logger) + +def load_model(base_model, ckpt_path, logger = None): + if not os.path.exists(ckpt_path): + raise NotImplementedError('no checkpoint file from path %s...' % ckpt_path) + print_log(f'Loading weights from {ckpt_path}...', logger = logger ) + + # load state dict + state_dict = torch.load(ckpt_path, map_location='cpu') + # parameter resume of base model + if state_dict.get('model') is not None: + base_ckpt = {k.replace("module.", ""): v for k, v in state_dict['model'].items()} + elif state_dict.get('base_model') is not None: + base_ckpt = {k.replace("module.", ""): v for k, v in state_dict['base_model'].items()} + else: + raise RuntimeError('mismatch of ckpt weight') + base_model.load_state_dict(base_ckpt, strict = True) + + epoch = -1 + if state_dict.get('epoch') is not None: + epoch = state_dict['epoch'] + if state_dict.get('metrics') is not None: + metrics = state_dict['metrics'] + if not isinstance(metrics, dict): + metrics = metrics.state_dict() + else: + metrics = 'No Metrics' + print_log(f'ckpts @ {epoch} epoch( performance = {str(metrics):s})', logger = logger) + return \ No newline at end of file diff --git a/zoo/PointBERT/tools/runner.py b/zoo/PointBERT/tools/runner.py new file mode 100644 index 0000000..71930a2 --- /dev/null +++ b/zoo/PointBERT/tools/runner.py @@ -0,0 +1,380 @@ +import torch +import torch.nn as nn +import os +import json +from tools import builder +from utils import misc, dist_utils +import time +from utils.logger import * +from utils.AverageMeter import AverageMeter +from utils.metrics import Metrics +from extensions.chamfer_dist import ChamferDistanceL1, ChamferDistanceL2 +import math +import cv2 +import numpy as np + +def compute_loss(loss_1, loss_2, config, niter, train_writer): + ''' + compute the final loss for optimization + For dVAE: loss_1 : reconstruction loss, loss_2 : kld loss + ''' + start = config.kldweight.start + target = config.kldweight.target + ntime = config.kldweight.ntime + + _niter = niter - 10000 + if _niter > ntime: + kld_weight = target + elif _niter < 0: + kld_weight = 0. + else: + kld_weight = target + (start - target) * (1. + math.cos(math.pi * float(_niter) / ntime)) / 2. + + if train_writer is not None: + train_writer.add_scalar('Loss/Batch/KLD_Weight', kld_weight, niter) + + loss = loss_1 + kld_weight * loss_2 + + return loss + +def get_temp(config, niter): + if config.get('temp') is not None: + start = config.temp.start + target = config.temp.target + ntime = config.temp.ntime + if niter > ntime: + return target + else: + temp = target + (start - target) * (1. + math.cos(math.pi * float(niter) / ntime)) / 2. + return temp + else: + return 0 + +def run_net(args, config, train_writer=None, val_writer=None): + logger = get_logger(args.log_name) + # build dataset + (train_sampler, train_dataloader), (_, test_dataloader) = builder.dataset_builder(args, config.dataset.train), \ + builder.dataset_builder(args, config.dataset.val) + # build model + base_model = builder.model_builder(config.model) + if args.use_gpu: + base_model.to(args.local_rank) + + # parameter setting + start_epoch = 0 + best_metrics = None + metrics = None + + # resume ckpts + if args.resume: + start_epoch, best_metrics = builder.resume_model(base_model, args, logger = logger) + best_metrics = Metrics(config.consider_metric, best_metrics) + elif args.start_ckpts is not None: + builder.load_model(base_model, args.start_ckpts, logger = logger) + + # DDP + if args.distributed: + # Sync BN + if args.sync_bn: + base_model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(base_model) + print_log('Using Synchronized BatchNorm ...', logger = logger) + base_model = nn.parallel.DistributedDataParallel(base_model, device_ids=[args.local_rank % torch.cuda.device_count()]) + print_log('Using Distributed Data parallel ...' , logger = logger) + else: + print_log('Using Data parallel ...' , logger = logger) + base_model = nn.DataParallel(base_model).cuda() + # optimizer & scheduler + optimizer, scheduler = builder.build_opti_sche(base_model, config) + + # Criterion + ChamferDisL1 = ChamferDistanceL1() + ChamferDisL2 = ChamferDistanceL2() + + + if args.resume: + builder.resume_optimizer(optimizer, args, logger = logger) + + # trainval + # training + base_model.zero_grad() + for epoch in range(start_epoch, config.max_epoch + 1): + if args.distributed: + train_sampler.set_epoch(epoch) + base_model.train() + + epoch_start_time = time.time() + batch_start_time = time.time() + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter(['Loss1', 'Loss2']) + + num_iter = 0 + + base_model.train() # set model to training mode + n_batches = len(train_dataloader) + for idx, (taxonomy_ids, model_ids, data) in enumerate(train_dataloader): + num_iter += 1 + n_itr = epoch * n_batches + idx + + data_time.update(time.time() - batch_start_time) + npoints = config.dataset.train._base_.N_POINTS + dataset_name = config.dataset.train._base_.NAME + if dataset_name == 'ShapeNet': + points = data.cuda() + else: + raise NotImplementedError(f'Train phase do not support {dataset_name}') + + temp = get_temp(config, n_itr) + + + ret = base_model(points, temperature = temp, hard = False) + + loss_1, loss_2 = base_model.module.get_loss(ret, points) + + _loss = compute_loss(loss_1, loss_2, config, n_itr, train_writer) + + _loss.backward() + + # forward + if num_iter == config.step_per_update: + num_iter = 0 + optimizer.step() + base_model.zero_grad() + + if args.distributed: + loss_1 = dist_utils.reduce_tensor(loss_1, args) + loss_2 = dist_utils.reduce_tensor(loss_2, args) + losses.update([loss_1.item() * 1000, loss_2.item() * 1000]) + else: + losses.update([loss_1.item() * 1000, loss_2.item() * 1000]) + + + if args.distributed: + torch.cuda.synchronize() + + + if train_writer is not None: + train_writer.add_scalar('Loss/Batch/Loss_1', loss_1.item() * 1000, n_itr) + train_writer.add_scalar('Loss/Batch/Loss_2', loss_2.item() * 1000, n_itr) + train_writer.add_scalar('Loss/Batch/Temperature', temp, n_itr) + train_writer.add_scalar('Loss/Batch/LR', optimizer.param_groups[0]['lr'], n_itr) + + + batch_time.update(time.time() - batch_start_time) + batch_start_time = time.time() + + if idx % 20 == 0: + print_log('[Epoch %d/%d][Batch %d/%d] BatchTime = %.3f (s) DataTime = %.3f (s) Losses = %s lr = %.6f' % + (epoch, config.max_epoch, idx + 1, n_batches, batch_time.val(), data_time.val(), + ['%.4f' % l for l in losses.val()], optimizer.param_groups[0]['lr']), logger = logger) + if config.scheduler.type != 'function': + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + epoch_end_time = time.time() + + if train_writer is not None: + train_writer.add_scalar('Loss/Epoch/Loss_1', losses.avg(0), epoch) + train_writer.add_scalar('Loss/Epoch/Loss_2', losses.avg(1), epoch) + + print_log('[Training] EPOCH: %d EpochTime = %.3f (s) Losses = %s' % + (epoch, epoch_end_time - epoch_start_time, ['%.4f' % l for l in losses.avg()]), logger = logger) + + if epoch % args.val_freq == 0 and epoch != 0: + # Validate the current model + metrics = validate(base_model, test_dataloader, epoch, ChamferDisL1, ChamferDisL2, val_writer, args, config, logger=logger) + + # Save ckeckpoints + if metrics.better_than(best_metrics): + best_metrics = metrics + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-best', args, logger = logger) + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-last', args, logger = logger) + if (config.max_epoch - epoch) < 5: + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, f'ckpt-epoch-{epoch:03d}', args, logger = logger) + if train_writer is not None: + train_writer.close() + if val_writer is not None: + val_writer.close() + +def validate(base_model, test_dataloader, epoch, ChamferDisL1, ChamferDisL2, val_writer, args, config, logger = None): + print_log(f"[VALIDATION] Start validating epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_losses = AverageMeter(['SparseLossL1', 'SparseLossL2', 'DenseLossL1', 'DenseLossL2']) + test_metrics = AverageMeter(Metrics.names()) + category_metrics = dict() + n_samples = len(test_dataloader) # bs is 1 + + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + taxonomy_id = taxonomy_ids[0] if isinstance(taxonomy_ids[0], str) else taxonomy_ids[0].item() + model_id = model_ids[0] + + npoints = config.dataset.val._base_.N_POINTS + dataset_name = config.dataset.val._base_.NAME + if dataset_name == 'ShapeNet': + points = data.cuda() + else: + raise NotImplementedError(f'Train phase do not support {dataset_name}') + + ret = base_model(inp = points, hard=True, eval=True) + coarse_points = ret[0] + dense_points = ret[1] + + sparse_loss_l1 = ChamferDisL1(coarse_points, points) + sparse_loss_l2 = ChamferDisL2(coarse_points, points) + dense_loss_l1 = ChamferDisL1(dense_points, points) + dense_loss_l2 = ChamferDisL2(dense_points, points) + + if args.distributed: + sparse_loss_l1 = dist_utils.reduce_tensor(sparse_loss_l1, args) + sparse_loss_l2 = dist_utils.reduce_tensor(sparse_loss_l2, args) + dense_loss_l1 = dist_utils.reduce_tensor(dense_loss_l1, args) + dense_loss_l2 = dist_utils.reduce_tensor(dense_loss_l2, args) + + test_losses.update([sparse_loss_l1.item() * 1000, sparse_loss_l2.item() * 1000, dense_loss_l1.item() * 1000, dense_loss_l2.item() * 1000]) + + _metrics = Metrics.get(dense_points, points) + + if taxonomy_id not in category_metrics: + category_metrics[taxonomy_id] = AverageMeter(Metrics.names()) + category_metrics[taxonomy_id].update(_metrics) + + vis_list = [0, 1000, 1600, 1800, 2400, 3400] + if val_writer is not None and idx in vis_list: #% 200 == 0: + input_pc = points.squeeze().detach().cpu().numpy() + input_pc = misc.get_ptcloud_img(input_pc) + val_writer.add_image('Model%02d/Input'% idx , input_pc, epoch, dataformats='HWC') + + sparse = coarse_points.squeeze().cpu().numpy() + sparse_img = misc.get_ptcloud_img(sparse) + val_writer.add_image('Model%02d/Sparse' % idx, sparse_img, epoch, dataformats='HWC') + + dense = dense_points.squeeze().cpu().numpy() + dense_img = misc.get_ptcloud_img(dense) + val_writer.add_image('Model%02d/Dense' % idx, dense_img, epoch, dataformats='HWC') + + + if (idx+1) % 2000 == 0: + print_log('Test[%d/%d] Taxonomy = %s Sample = %s Losses = %s Metrics = %s' % + (idx + 1, n_samples, taxonomy_id, model_id, ['%.4f' % l for l in test_losses.val()], + ['%.4f' % m for m in _metrics]), logger=logger) + for _,v in category_metrics.items(): + test_metrics.update(v.avg()) + print_log('[Validation] EPOCH: %d Metrics = %s' % (epoch, ['%.4f' % m for m in test_metrics.avg()]), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Print testing results + shapenet_dict = json.load(open('./data/shapenet_synset_dict.json', 'r')) + print_log('============================ TEST RESULTS ============================',logger=logger) + msg = '' + msg += 'Taxonomy\t' + msg += '#Sample\t' + for metric in test_metrics.items: + msg += metric + '\t' + msg += '#ModelName\t' + print_log(msg, logger=logger) + + for taxonomy_id in category_metrics: + msg = '' + msg += (taxonomy_id + '\t') + msg += (str(category_metrics[taxonomy_id].count(0)) + '\t') + for value in category_metrics[taxonomy_id].avg(): + msg += '%.3f \t' % value + msg += shapenet_dict[taxonomy_id] + '\t' + print_log(msg, logger=logger) + + msg = '' + msg += 'Overall\t\t' + for value in test_metrics.avg(): + msg += '%.3f \t' % value + print_log(msg, logger=logger) + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Loss/Epoch/Sparse', test_losses.avg(0), epoch) + val_writer.add_scalar('Loss/Epoch/Dense', test_losses.avg(2), epoch) + for i, metric in enumerate(test_metrics.items): + val_writer.add_scalar('Metric/%s' % metric, test_metrics.avg(i), epoch) + + return Metrics(config.consider_metric, test_metrics.avg()) + +def test_net(args, config): + logger = get_logger(args.log_name) + print_log('Tester start ... ', logger = logger) + _, test_dataloader = builder.dataset_builder(args, config.dataset.test) + + base_model = builder.model_builder(config.model) + builder.load_model(base_model, args.ckpts, logger = logger) + + if args.use_gpu: + base_model.to(args.local_rank) + + # DDP + if args.distributed: + raise NotImplementedError() + + test(base_model, test_dataloader, args, config, logger=logger) + +def test(base_model, test_dataloader, args, config, logger = None): + + base_model.eval() # set model to eval mode + target = './vis' + useful_cate = [ + "02691156", + "02818832", + "04379243", + "04099429", + "03948459", + "03790512", + "03642806", + "03467517", + "03261776", + "03001627", + "02958343", + "03759954" + ] + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + # import pdb; pdb.set_trace() + if taxonomy_ids[0] not in useful_cate: + continue + + dataset_name = config.dataset.test._base_.NAME + if dataset_name == 'ShapeNet': + points = data.cuda() + else: + raise NotImplementedError(f'Train phase do not support {dataset_name}') + + + ret = base_model(inp = points, hard=True, eval=True) + dense_points = ret[1] + + final_image = [] + + data_path = f'./vis/{taxonomy_ids[0]}_{idx}' + if not os.path.exists(data_path): + os.makedirs(data_path) + + points = points.squeeze().detach().cpu().numpy() + np.savetxt(os.path.join(data_path,'gt.txt'), points, delimiter=';') + points = misc.get_ptcloud_img(points) + final_image.append(points) + + dense_points = dense_points.squeeze().detach().cpu().numpy() + np.savetxt(os.path.join(data_path,'dense_points.txt'), dense_points, delimiter=';') + dense_points = misc.get_ptcloud_img(dense_points) + final_image.append(dense_points) + + img = np.concatenate(final_image, axis=1) + img_path = os.path.join(data_path, f'plot.jpg') + cv2.imwrite(img_path, img) + + if idx > 1000: + break + + return diff --git a/zoo/PointBERT/tools/runner_BERT_finetune.py b/zoo/PointBERT/tools/runner_BERT_finetune.py new file mode 100644 index 0000000..7aaa71e --- /dev/null +++ b/zoo/PointBERT/tools/runner_BERT_finetune.py @@ -0,0 +1,451 @@ +import torch +import torch.nn as nn +from tools import builder +from utils import misc, dist_utils +import time +from utils.logger import * +from utils.AverageMeter import AverageMeter + +import numpy as np +from datasets import data_transforms +from pointnet2_ops import pointnet2_utils +from torchvision import transforms + + +train_transforms = transforms.Compose( + [ + data_transforms.PointcloudScaleAndTranslate(), + ] +) + +test_transforms = transforms.Compose( + [ + data_transforms.PointcloudScaleAndTranslate(), + ] +) + + +class Acc_Metric: + def __init__(self, acc = 0.): + if type(acc).__name__ == 'dict': + self.acc = acc['acc'] + elif type(acc).__name__ == 'Acc_Metric': + self.acc = acc.acc + else: + self.acc = acc + + def better_than(self, other): + if self.acc > other.acc: + return True + else: + return False + + def state_dict(self): + _dict = dict() + _dict['acc'] = self.acc + return _dict + +def run_net(args, config, train_writer=None, val_writer=None): + logger = get_logger(args.log_name) + # build dataset + (train_sampler, train_dataloader), (_, test_dataloader),= builder.dataset_builder(args, config.dataset.train), \ + builder.dataset_builder(args, config.dataset.val) + # build model + base_model = builder.model_builder(config.model) + + # parameter setting + start_epoch = 0 + best_metrics = Acc_Metric(0.) + best_metrics_vote = Acc_Metric(0.) + metrics = Acc_Metric(0.) + + # resume ckpts + if args.resume: + start_epoch, best_metric = builder.resume_model(base_model, args, logger = logger) + best_metrics = Acc_Metric(best_metrics) + else: + if args.ckpts is not None: + base_model.load_model_from_ckpt(args.ckpts) + else: + print_log('Training from scratch', logger = logger) + + if args.use_gpu: + base_model.to(args.local_rank) + # DDP + if args.distributed: + # Sync BN + if args.sync_bn: + base_model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(base_model) + print_log('Using Synchronized BatchNorm ...', logger = logger) + base_model = nn.parallel.DistributedDataParallel(base_model, device_ids=[args.local_rank % torch.cuda.device_count()]) + print_log('Using Distributed Data parallel ...' , logger = logger) + else: + print_log('Using Data parallel ...' , logger = logger) + base_model = nn.DataParallel(base_model).cuda() + # optimizer & scheduler + optimizer, scheduler = builder.build_opti_sche(base_model, config) + + if args.resume: + builder.resume_optimizer(optimizer, args, logger = logger) + + # trainval + # training + base_model.zero_grad() + for epoch in range(start_epoch, config.max_epoch + 1): + if args.distributed: + train_sampler.set_epoch(epoch) + base_model.train() + + epoch_start_time = time.time() + batch_start_time = time.time() + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter(['loss', 'acc']) + num_iter = 0 + base_model.train() # set model to training mode + n_batches = len(train_dataloader) + + npoints = config.npoints + for idx, (taxonomy_ids, model_ids, data) in enumerate(train_dataloader): + num_iter += 1 + n_itr = epoch * n_batches + idx + + data_time.update(time.time() - batch_start_time) + + points = data[0].cuda() + label = data[1].cuda() + + if npoints == 1024: + point_all = 1200 + elif npoints == 2048: + point_all = 2400 + elif npoints == 4096: + point_all = 4800 + elif npoints == 8192: + point_all = 8192 + else: + raise NotImplementedError() + + if points.size(1) < point_all: + point_all = points.size(1) + + fps_idx = pointnet2_utils.furthest_point_sample(points, point_all) # (B, npoint) + fps_idx = fps_idx[:, np.random.choice(point_all, npoints, False)] + points = pointnet2_utils.gather_operation(points.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + # import pdb; pdb.set_trace() + points = train_transforms(points) + + ret = base_model(points) + + # loss, acc = base_model.module.get_loss_acc(ret, label) + loss, acc = base_model.module.get_loss_acc(ret, label, smoothing=args.label_smoothing) + + _loss = loss + + _loss.backward() + + # forward + if num_iter == config.step_per_update: + if config.get('grad_norm_clip') is not None: + torch.nn.utils.clip_grad_norm_(base_model.parameters(), config.grad_norm_clip, norm_type=2) + num_iter = 0 + optimizer.step() + base_model.zero_grad() + + if args.distributed: + loss = dist_utils.reduce_tensor(loss, args) + acc = dist_utils.reduce_tensor(acc, args) + losses.update([loss.item(), acc.item()]) + else: + losses.update([loss.item(), acc.item()]) + + + if args.distributed: + torch.cuda.synchronize() + + + if train_writer is not None: + train_writer.add_scalar('Loss/Batch/Loss', loss.item(), n_itr) + train_writer.add_scalar('Loss/Batch/TrainAcc', acc.item(), n_itr) + train_writer.add_scalar('Loss/Batch/LR', optimizer.param_groups[0]['lr'], n_itr) + + + batch_time.update(time.time() - batch_start_time) + batch_start_time = time.time() + + if idx % 10 == 0: + print_log('[Epoch %d/%d][Batch %d/%d] BatchTime = %.3f (s) DataTime = %.3f (s) Loss+Acc = %s lr = %.6f' % + (epoch, config.max_epoch, idx + 1, n_batches, batch_time.val(), data_time.val(), + ['%.4f' % l for l in losses.val()], optimizer.param_groups[0]['lr']), logger = logger) + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + epoch_end_time = time.time() + + if train_writer is not None: + train_writer.add_scalar('Loss/Epoch/Loss_1', losses.avg(0), epoch) + train_writer.add_scalar('Loss/Epoch/Loss_2', losses.avg(1), epoch) + + print_log('[Training] EPOCH: %d EpochTime = %.3f (s) Losses = %s' % + (epoch, epoch_end_time - epoch_start_time, ['%.4f' % l for l in losses.avg()]), logger = logger) + + if epoch % args.val_freq == 0 and epoch != 0: + # Validate the current model + metrics = validate(base_model, test_dataloader, epoch, val_writer, args, config, logger=logger) + + better = metrics.better_than(best_metrics) + # Save ckeckpoints + if better: + best_metrics = metrics + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-best', args, logger = logger) + if metrics.acc > 91.5 or (better and metrics.acc > 90): + metrics_vote = validate_vote(base_model, test_dataloader, epoch, val_writer, args, config, logger=logger) + if metrics_vote.better_than(best_metrics_vote): + best_metrics_vote = metrics_vote + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics_vote, 'ckpt-best_vote', args, logger = logger) + + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-last', args, logger = logger) + if (config.max_epoch - epoch) < 10: + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, f'ckpt-epoch-{epoch:03d}', args, logger = logger) + if train_writer is not None: + train_writer.close() + if val_writer is not None: + val_writer.close() + +def validate(base_model, test_dataloader, epoch, val_writer, args, config, logger = None): + print_log(f"[VALIDATION] Start validating epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + + logits = base_model(points) + target = label.view(-1) + + pred = logits.argmax(-1).view(-1) + + test_pred.append(pred.detach()) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + print_log('[Validation] EPOCH: %d acc = %.4f' % (epoch, acc), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC', acc, epoch) + + return Acc_Metric(acc) + + +def validate_vote(base_model, test_dataloader, epoch, val_writer, args, config, logger = None, times = 10): + print_log(f"[VALIDATION_VOTE] epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points_raw = data[0].cuda() + label = data[1].cuda() + if npoints == 1024: + point_all = 1200 + elif npoints == 2048: + point_all = 2400 + elif npoints == 4096: + point_all = 4800 + elif npoints == 8192: + point_all = 8192 + else: + raise NotImplementedError() + + if points_raw.size(1) < point_all: + point_all = points_raw.size(1) + + fps_idx_raw = pointnet2_utils.furthest_point_sample(points_raw, point_all) # (B, npoint) + local_pred = [] + + for kk in range(times): + fps_idx = fps_idx_raw[:, np.random.choice(point_all, npoints, False)] + points = pointnet2_utils.gather_operation(points_raw.transpose(1, 2).contiguous(), + fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + + points = test_transforms(points) + + logits = base_model(points) + target = label.view(-1) + + local_pred.append(logits.detach().unsqueeze(0)) + + pred = torch.cat(local_pred, dim=0).mean(0) + _, pred_choice = torch.max(pred, -1) + + + test_pred.append(pred_choice) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + print_log('[Validation_vote] EPOCH: %d acc_vote = %.4f' % (epoch, acc), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC_vote', acc, epoch) + + return Acc_Metric(acc) + + + +def test_net(args, config): + logger = get_logger(args.log_name) + print_log('Tester start ... ', logger = logger) + _, test_dataloader = builder.dataset_builder(args, config.dataset.test) + base_model = builder.model_builder(config.model) + # load checkpoints + builder.load_model(base_model, args.ckpts, logger = logger) # for finetuned transformer + # base_model.load_model_from_ckpt(args.ckpts) # for BERT + if args.use_gpu: + base_model.to(args.local_rank) + + # DDP + if args.distributed: + raise NotImplementedError() + + test(base_model, test_dataloader, args, config, logger=logger) + +def test(base_model, test_dataloader, args, config, logger = None): + + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + + logits = base_model(points) + target = label.view(-1) + + pred = logits.argmax(-1).view(-1) + + test_pred.append(pred.detach()) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + print_log('[TEST] acc = %.4f' % acc, logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + print_log(f"[TEST_VOTE]", logger = logger) + acc = 0. + for time in range(1, 10): + this_acc = test_vote(base_model, test_dataloader, 1, None, args, config, logger=logger, times=time) + if acc < this_acc: + acc = this_acc + + print_log('[TEST_VOTE] acc = %.4f' % acc, logger=logger) + +def test_vote(base_model, test_dataloader, epoch, val_writer, args, config, logger = None, times = 10): + + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points_raw = data[0].cuda() + label = data[1].cuda() + if npoints == 1024: + point_all = 1200 + elif npoints == 4096: + point_all = 4800 + elif npoints == 8192: + point_all = 8192 + else: + raise NotImplementedError() + + if points_raw.size(1) < point_all: + point_all = points_raw.size(1) + + fps_idx_raw = pointnet2_utils.furthest_point_sample(points_raw, point_all) # (B, npoint) + local_pred = [] + + for kk in range(times): + fps_idx = fps_idx_raw[:, np.random.choice(point_all, npoints, False)] + points = pointnet2_utils.gather_operation(points_raw.transpose(1, 2).contiguous(), + fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + + points = test_transforms(points) + + logits = base_model(points) + target = label.view(-1) + + local_pred.append(logits.detach().unsqueeze(0)) + + pred = torch.cat(local_pred, dim=0).mean(0) + _, pred_choice = torch.max(pred, -1) + + + test_pred.append(pred_choice) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC_vote', acc, epoch) + print_log('[TEST] acc = %.4f' % acc, logger=logger) + + return acc diff --git a/zoo/PointBERT/tools/runner_BERT_pretrain.py b/zoo/PointBERT/tools/runner_BERT_pretrain.py new file mode 100644 index 0000000..dd38abe --- /dev/null +++ b/zoo/PointBERT/tools/runner_BERT_pretrain.py @@ -0,0 +1,258 @@ +import torch +import torch.nn as nn +import os +import json +from tools import builder +from utils import misc, dist_utils +import time +from utils.logger import * +from utils.AverageMeter import AverageMeter +from utils.metrics import Metrics +from extensions.chamfer_dist import ChamferDistanceL1, ChamferDistanceL2 +import math +from sklearn.svm import LinearSVC +import numpy as np +from torchvision import transforms +from datasets import data_transforms +from pointnet2_ops import pointnet2_utils + +train_transforms = transforms.Compose( + [ + data_transforms.PointcloudScaleAndTranslate(), + ] +) + +class Acc_Metric: + def __init__(self, acc = 0.): + if type(acc).__name__ == 'dict': + self.acc = acc['acc'] + else: + self.acc = acc + + def better_than(self, other): + if self.acc > other.acc: + return True + else: + return False + + def state_dict(self): + _dict = dict() + _dict['acc'] = self.acc + return _dict + + +def evaluate_svm(train_features, train_labels, test_features, test_labels): + clf = LinearSVC() + clf.fit(train_features, train_labels) + pred = clf.predict(test_features) + return np.sum(test_labels == pred) * 1. / pred.shape[0] + +def run_net(args, config, train_writer=None, val_writer=None): + logger = get_logger(args.log_name) + # build dataset + (train_sampler, train_dataloader), (_, test_dataloader),= builder.dataset_builder(args, config.dataset.train), \ + builder.dataset_builder(args, config.dataset.val) + (_, extra_train_dataloader) = builder.dataset_builder(args, config.dataset.extra_train) if config.dataset.get('extra_train') else (None, None) + # build model + base_model = builder.model_builder(config.model) + if args.use_gpu: + base_model.to(args.local_rank) + + # from IPython import embed; embed() + + # parameter setting + start_epoch = 0 + best_metrics = Acc_Metric(0.) + metrics = Acc_Metric(0.) + + # resume ckpts + if args.resume: + start_epoch, best_metric = builder.resume_model(base_model, args, logger = logger) + best_metrics = Acc_Metric(best_metric) + elif args.start_ckpts is not None: + builder.load_model(base_model, args.start_ckpts, logger = logger) + + # DDP + if args.distributed: + # Sync BN + if args.sync_bn: + base_model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(base_model) + print_log('Using Synchronized BatchNorm ...', logger = logger) + base_model = nn.parallel.DistributedDataParallel(base_model, device_ids=[args.local_rank % torch.cuda.device_count()], find_unused_parameters=True) + print_log('Using Distributed Data parallel ...' , logger = logger) + else: + print_log('Using Data parallel ...' , logger = logger) + base_model = nn.DataParallel(base_model).cuda() + # optimizer & scheduler + optimizer, scheduler = builder.build_opti_sche(base_model, config) + + if args.resume: + builder.resume_optimizer(optimizer, args, logger = logger) + + # trainval + # training + base_model.zero_grad() + for epoch in range(start_epoch, config.max_epoch + 1): + if args.distributed: + train_sampler.set_epoch(epoch) + base_model.train() + + epoch_start_time = time.time() + batch_start_time = time.time() + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter(['Loss1', 'Loss2']) + + num_iter = 0 + + base_model.train() # set model to training mode + n_batches = len(train_dataloader) + for idx, (taxonomy_ids, model_ids, data) in enumerate(train_dataloader): + num_iter += 1 + n_itr = epoch * n_batches + idx + + data_time.update(time.time() - batch_start_time) + npoints = config.dataset.train.others.npoints + dataset_name = config.dataset.train._base_.NAME + if dataset_name == 'ShapeNet': + points = data.cuda() + elif dataset_name == 'ModelNet': + points = data[0].cuda() + points = misc.fps(points, npoints) + else: + raise NotImplementedError(f'Train phase do not support {dataset_name}') + + assert points.size(1) == npoints + points = train_transforms(points) + + loss_1, loss_2 = base_model(points) + + _loss = loss_1 + loss_2 + + _loss.backward() + + # forward + if num_iter == config.step_per_update: + num_iter = 0 + optimizer.step() + base_model.zero_grad() + + if args.distributed: + loss_1 = dist_utils.reduce_tensor(loss_1, args) + loss_2 = dist_utils.reduce_tensor(loss_2, args) + losses.update([loss_1.item(), loss_2.item()]) + else: + losses.update([loss_1.item(), loss_2.item()]) + + + if args.distributed: + torch.cuda.synchronize() + + + if train_writer is not None: + train_writer.add_scalar('Loss/Batch/Loss_1', loss_1.item(), n_itr) + train_writer.add_scalar('Loss/Batch/Loss_2', loss_2.item(), n_itr) + train_writer.add_scalar('Loss/Batch/LR', optimizer.param_groups[0]['lr'], n_itr) + + + batch_time.update(time.time() - batch_start_time) + batch_start_time = time.time() + + if idx % 20 == 0: + print_log('[Epoch %d/%d][Batch %d/%d] BatchTime = %.3f (s) DataTime = %.3f (s) Losses = %s lr = %.6f' % + (epoch, config.max_epoch, idx + 1, n_batches, batch_time.val(), data_time.val(), + ['%.4f' % l for l in losses.val()], optimizer.param_groups[0]['lr']), logger = logger) + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + epoch_end_time = time.time() + + if train_writer is not None: + train_writer.add_scalar('Loss/Epoch/Loss_1', losses.avg(0), epoch) + train_writer.add_scalar('Loss/Epoch/Loss_2', losses.avg(1), epoch) + + print_log('[Training] EPOCH: %d EpochTime = %.3f (s) Losses = %s' % + (epoch, epoch_end_time - epoch_start_time, ['%.4f' % l for l in losses.avg()]), logger = logger) + + if epoch % args.val_freq == 0 and epoch != 0: + # Validate the current model + metrics = validate(base_model, extra_train_dataloader, test_dataloader, epoch, val_writer, args, config, logger=logger) + + # Save ckeckpoints + if metrics.better_than(best_metrics): + best_metrics = metrics + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-best', args, logger = logger) + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-last', args, logger = logger) + if (config.max_epoch - epoch) < 10: + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, f'ckpt-epoch-{epoch:03d}', args, logger = logger) + if train_writer is not None: + train_writer.close() + if val_writer is not None: + val_writer.close() + +def validate(base_model, extra_train_dataloader, test_dataloader, epoch, val_writer, args, config, logger = None): + print_log(f"[VALIDATION] Start validating epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_features = [] + test_label = [] + + train_features = [] + train_label = [] + npoints = config.dataset.train.others.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(extra_train_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + + assert points.size(1) == npoints + feature = base_model(points, noaug=True) + target = label.view(-1) + + train_features.append(feature.detach()) + train_label.append(target.detach()) + + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + assert points.size(1) == npoints + feature = base_model(points, noaug=True) + target = label.view(-1) + + test_features.append(feature.detach()) + test_label.append(target.detach()) + + + train_features = torch.cat(train_features, dim=0) + train_label = torch.cat(train_label, dim=0) + test_features = torch.cat(test_features, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + train_features = dist_utils.gather_tensor(train_features, args) + train_label = dist_utils.gather_tensor(train_label, args) + test_features = dist_utils.gather_tensor(test_features, args) + test_label = dist_utils.gather_tensor(test_label, args) + + svm_acc = evaluate_svm(train_features.data.cpu().numpy(), train_label.data.cpu().numpy(), test_features.data.cpu().numpy(), test_label.data.cpu().numpy()) + + print_log('[Validation] EPOCH: %d acc = %.4f' % (epoch,svm_acc), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC', svm_acc, epoch) + + return Acc_Metric(svm_acc) + + +def test_net(): + pass \ No newline at end of file diff --git a/zoo/PointBERT/utils/AverageMeter.py b/zoo/PointBERT/utils/AverageMeter.py new file mode 100644 index 0000000..5118f43 --- /dev/null +++ b/zoo/PointBERT/utils/AverageMeter.py @@ -0,0 +1,42 @@ + +class AverageMeter(object): + def __init__(self, items=None): + self.items = items + self.n_items = 1 if items is None else len(items) + self.reset() + + def reset(self): + self._val = [0] * self.n_items + self._sum = [0] * self.n_items + self._count = [0] * self.n_items + + def update(self, values): + if type(values).__name__ == 'list': + for idx, v in enumerate(values): + self._val[idx] = v + self._sum[idx] += v + self._count[idx] += 1 + else: + self._val[0] = values + self._sum[0] += values + self._count[0] += 1 + + def val(self, idx=None): + if idx is None: + return self._val[0] if self.items is None else [self._val[i] for i in range(self.n_items)] + else: + return self._val[idx] + + def count(self, idx=None): + if idx is None: + return self._count[0] if self.items is None else [self._count[i] for i in range(self.n_items)] + else: + return self._count[idx] + + def avg(self, idx=None): + if idx is None: + return self._sum[0] / self._count[0] if self.items is None else [ + self._sum[i] / self._count[i] for i in range(self.n_items) + ] + else: + return self._sum[idx] / self._count[idx] \ No newline at end of file diff --git a/zoo/PointBERT/utils/checkpoint.py b/zoo/PointBERT/utils/checkpoint.py new file mode 100644 index 0000000..41dc456 --- /dev/null +++ b/zoo/PointBERT/utils/checkpoint.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import copy +import logging +import os +from collections import defaultdict +import torch +import torch.nn as nn + +from typing import Any +from typing import Optional, List, Dict, NamedTuple, Tuple, Iterable + +from termcolor import colored + +def get_missing_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the model but not found in a checkpoint. + Args: + keys (list[str]): List of keys that were not found in the checkpoint. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "Some model parameters or buffers are not found in the checkpoint:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "blue") for k, v in groups.items() + ) + return msg + + +def get_unexpected_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the checkpoint but not found in the model. + Args: + keys (list[str]): List of keys that were not found in the model. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "The checkpoint state_dict contains keys that are not used by the model:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "magenta") for k, v in groups.items() + ) + return msg + + +def _strip_prefix_if_present(state_dict: Dict[str, Any], prefix: str) -> None: + """ + Strip the prefix in metadata, if any. + Args: + state_dict (OrderedDict): a state-dict to be loaded to the model. + prefix (str): prefix. + """ + keys = sorted(state_dict.keys()) + if not all(len(key) == 0 or key.startswith(prefix) for key in keys): + return + + for key in keys: + newkey = key[len(prefix):] + state_dict[newkey] = state_dict.pop(key) + + # also strip the prefix in metadata, if any.. + try: + metadata = state_dict._metadata # pyre-ignore + except AttributeError: + pass + else: + for key in list(metadata.keys()): + # for the metadata dict, the key can be: + # '': for the DDP module, which we want to remove. + # 'module': for the actual model. + # 'module.xx.xx': for the rest. + + if len(key) == 0: + continue + newkey = key[len(prefix):] + metadata[newkey] = metadata.pop(key) + + +def _group_checkpoint_keys(keys: List[str]) -> Dict[str, List[str]]: + """ + Group keys based on common prefixes. A prefix is the string up to the final + "." in each key. + Args: + keys (list[str]): list of parameter names, i.e. keys in the model + checkpoint dict. + Returns: + dict[list]: keys with common prefixes are grouped into lists. + """ + groups = defaultdict(list) + for key in keys: + pos = key.rfind(".") + if pos >= 0: + head, tail = key[:pos], [key[pos + 1:]] + else: + head, tail = key, [] + groups[head].extend(tail) + return groups + + +def _group_to_str(group: List[str]) -> str: + """ + Format a group of parameter name suffixes into a loggable string. + Args: + group (list[str]): list of parameter name suffixes. + Returns: + str: formated string. + """ + if len(group) == 0: + return "" + + if len(group) == 1: + return "." + group[0] + + return ".{" + ", ".join(group) + "}" + + +def _named_modules_with_dup( + model: nn.Module, prefix: str = "" +) -> Iterable[Tuple[str, nn.Module]]: + """ + The same as `model.named_modules()`, except that it includes + duplicated modules that have more than one name. + """ + yield prefix, model + for name, module in model._modules.items(): # pyre-ignore + if module is None: + continue + submodule_prefix = prefix + ("." if prefix else "") + name + yield from _named_modules_with_dup(module, submodule_prefix) \ No newline at end of file diff --git a/zoo/PointBERT/utils/config.py b/zoo/PointBERT/utils/config.py new file mode 100644 index 0000000..8c86d76 --- /dev/null +++ b/zoo/PointBERT/utils/config.py @@ -0,0 +1,63 @@ +import yaml +from easydict import EasyDict +import os +from .logger import print_log + +def log_args_to_file(args, pre='args', logger=None): + for key, val in args.__dict__.items(): + print_log(f'{pre}.{key} : {val}', logger = logger) + +def log_config_to_file(cfg, pre='cfg', logger=None): + for key, val in cfg.items(): + if isinstance(cfg[key], EasyDict): + print_log(f'{pre}.{key} = edict()', logger = logger) + log_config_to_file(cfg[key], pre=pre + '.' + key, logger=logger) + continue + print_log(f'{pre}.{key} : {val}', logger = logger) + +def merge_new_config(config, new_config): + for key, val in new_config.items(): + if not isinstance(val, dict): + if key == '_base_': + with open(new_config['_base_'], 'r') as f: + try: + val = yaml.load(f, Loader=yaml.FullLoader) + except: + val = yaml.load(f) + config[key] = EasyDict() + merge_new_config(config[key], val) + else: + config[key] = val + continue + if key not in config: + config[key] = EasyDict() + merge_new_config(config[key], val) + return config + +def cfg_from_yaml_file(cfg_file): + config = EasyDict() + with open(cfg_file, 'r') as f: + try: + new_config = yaml.load(f, Loader=yaml.FullLoader) + except: + new_config = yaml.load(f) + merge_new_config(config=config, new_config=new_config) + return config + +def get_config(args, logger=None): + if args.resume: + cfg_path = os.path.join(args.experiment_path, 'config.yaml') + if not os.path.exists(cfg_path): + print_log("Failed to resume", logger = logger) + raise FileNotFoundError() + print_log(f'Resume yaml from {cfg_path}', logger = logger) + args.config = cfg_path + config = cfg_from_yaml_file(args.config) + if not args.resume and args.local_rank == 0: + save_experiment_config(args, config, logger) + return config + +def save_experiment_config(args, config, logger = None): + config_path = os.path.join(args.experiment_path, 'config.yaml') + os.system('cp %s %s' % (args.config, config_path)) + print_log(f'Copy the Config file from {args.config} to {config_path}',logger = logger ) \ No newline at end of file diff --git a/zoo/PointBERT/utils/dist_utils.py b/zoo/PointBERT/utils/dist_utils.py new file mode 100644 index 0000000..d870fec --- /dev/null +++ b/zoo/PointBERT/utils/dist_utils.py @@ -0,0 +1,54 @@ +import os + +import torch +import torch.multiprocessing as mp +from torch import distributed as dist + + + +def init_dist(launcher, backend='nccl', **kwargs): + if mp.get_start_method(allow_none=True) is None: + mp.set_start_method('spawn') + if launcher == 'pytorch': + _init_dist_pytorch(backend, **kwargs) + else: + raise ValueError(f'Invalid launcher type: {launcher}') + + +def _init_dist_pytorch(backend, **kwargs): + # TODO: use local_rank instead of rank % num_gpus + rank = int(os.environ['RANK']) + num_gpus = torch.cuda.device_count() + torch.cuda.set_device(rank % num_gpus) + dist.init_process_group(backend=backend, **kwargs) + print(f'init distributed in rank {torch.distributed.get_rank()}') + + +def get_dist_info(): + if dist.is_available(): + initialized = dist.is_initialized() + else: + initialized = False + if initialized: + rank = dist.get_rank() + world_size = dist.get_world_size() + else: + rank = 0 + world_size = 1 + return rank, world_size + + +def reduce_tensor(tensor, args): + ''' + for acc kind, get the mean in each gpu + ''' + rt = tensor.clone() + torch.distributed.all_reduce(rt, op=torch.distributed.ReduceOp.SUM) + rt /= args.world_size + return rt + +def gather_tensor(tensor, args): + output_tensors = [tensor.clone() for _ in range(args.world_size)] + torch.distributed.all_gather(output_tensors, tensor) + concat = torch.cat(output_tensors, dim=0) + return concat diff --git a/zoo/PointBERT/utils/logger.py b/zoo/PointBERT/utils/logger.py new file mode 100644 index 0000000..847c1c7 --- /dev/null +++ b/zoo/PointBERT/utils/logger.py @@ -0,0 +1,127 @@ +import logging +import torch.distributed as dist + +logger_initialized = {} + +def get_root_logger(log_file=None, log_level=logging.INFO, name='main'): + """Get root logger and add a keyword filter to it. + 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., "mmdet3d". + Args: + log_file (str, optional): File path of log. Defaults to None. + log_level (int, optional): The level of logger. + Defaults to logging.INFO. + name (str, optional): The name of the root logger, also used as a + filter keyword. Defaults to 'mmdet3d'. + Returns: + :obj:`logging.Logger`: The obtained logger + """ + logger = get_logger(name=name, log_file=log_file, log_level=log_level) + # add a logging filter + logging_filter = logging.Filter(name) + logging_filter.filter = lambda record: record.find(name) != -1 + + return logger + + +def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): + """Initialize and get a logger by name. + If the logger has not been initialized, this method will initialize the + logger by adding one or two handlers, otherwise the initialized logger will + be directly returned. During initialization, a StreamHandler will always be + added. If `log_file` is specified and the process rank is 0, a FileHandler + will also be added. + Args: + name (str): Logger name. + log_file (str | None): The log filename. If specified, a FileHandler + will be added to the logger. + log_level (int): The logger level. Note that only the process of + rank 0 is affected, and other processes will set the level to + "Error" thus be silent most of the time. + file_mode (str): The file mode used in opening log file. + Defaults to 'w'. + Returns: + logging.Logger: The expected logger. + """ + logger = logging.getLogger(name) + if name in logger_initialized: + return logger + # handle hierarchical names + # e.g., logger "a" is initialized, then logger "a.b" will skip the + # initialization since it is a child of "a". + for logger_name in logger_initialized: + if name.startswith(logger_name): + return logger + + # handle duplicate logs to the console + # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler (NOTSET) + # to the root logger. As logger.propagate is True by default, this root + # level handler causes logging messages from rank>0 processes to + # unexpectedly show up on the console, creating much unwanted clutter. + # To fix this issue, we set the root logger's StreamHandler, if any, to log + # at the ERROR level. + for handler in logger.root.handlers: + if type(handler) is logging.StreamHandler: + handler.setLevel(logging.ERROR) + + stream_handler = logging.StreamHandler() + handlers = [stream_handler] + + if dist.is_available() and dist.is_initialized(): + rank = dist.get_rank() + else: + rank = 0 + + # only rank 0 will add a FileHandler + if rank == 0 and log_file is not None: + # Here, the default behaviour of the official logger is 'a'. Thus, we + # provide an interface to change the file mode to the default + # behaviour. + file_handler = logging.FileHandler(log_file, file_mode) + handlers.append(file_handler) + + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + for handler in handlers: + handler.setFormatter(formatter) + handler.setLevel(log_level) + logger.addHandler(handler) + + if rank == 0: + logger.setLevel(log_level) + else: + logger.setLevel(logging.ERROR) + + logger_initialized[name] = True + + + return logger + + +def print_log(msg, logger=None, level=logging.INFO): + """Print a log message. + Args: + msg (str): The message to be logged. + logger (logging.Logger | str | None): The logger to be used. + Some special loggers are: + - "silent": no message will be printed. + - other str: the logger obtained with `get_root_logger(logger)`. + - None: The `print()` method will be used to print log messages. + level (int): Logging level. Only available when `logger` is a Logger + object or "root". + """ + if logger is None: + print(msg) + elif isinstance(logger, logging.Logger): + logger.log(level, msg) + elif logger == 'silent': + pass + elif isinstance(logger, str): + _logger = get_logger(logger) + _logger.log(level, msg) + else: + raise TypeError( + 'logger should be either a logging.Logger object, str, ' + f'"silent" or None, but got {type(logger)}') \ No newline at end of file diff --git a/zoo/PointBERT/utils/metrics.py b/zoo/PointBERT/utils/metrics.py new file mode 100644 index 0000000..4733793 --- /dev/null +++ b/zoo/PointBERT/utils/metrics.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# @Author: Haozhe Xie +# @Date: 2019-08-08 14:31:30 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2020-05-25 09:13:32 +# @Email: cshzxie@gmail.com + +import logging +import open3d + +from extensions.chamfer_dist import ChamferDistanceL1, ChamferDistanceL2 + + +class Metrics(object): + ITEMS = [{ + 'name': 'F-Score', + 'enabled': True, + 'eval_func': 'cls._get_f_score', + 'is_greater_better': True, + 'init_value': 0 + }, { + 'name': 'CDL1', + 'enabled': True, + 'eval_func': 'cls._get_chamfer_distancel1', + 'eval_object': ChamferDistanceL1(ignore_zeros=True), + 'is_greater_better': False, + 'init_value': 32767 + }, { + 'name': 'CDL2', + 'enabled': True, + 'eval_func': 'cls._get_chamfer_distancel2', + 'eval_object': ChamferDistanceL2(ignore_zeros=True), + 'is_greater_better': False, + 'init_value': 32767 + }] + + @classmethod + def get(cls, pred, gt): + _items = cls.items() + _values = [0] * len(_items) + for i, item in enumerate(_items): + eval_func = eval(item['eval_func']) + _values[i] = eval_func(pred, gt) + + return _values + + @classmethod + def items(cls): + return [i for i in cls.ITEMS if i['enabled']] + + @classmethod + def names(cls): + _items = cls.items() + return [i['name'] for i in _items] + + @classmethod + def _get_f_score(cls, pred, gt, th=0.01): + + """References: https://github.com/lmb-freiburg/what3d/blob/master/util.py""" + b = pred.size(0) + assert pred.size(0) == gt.size(0) + if b != 1: + f_score_list = [] + for idx in range(b): + f_score_list.append(cls._get_f_score(pred[idx:idx+1], gt[idx:idx+1])) + return sum(f_score_list)/len(f_score_list) + else: + pred = cls._get_open3d_ptcloud(pred) + gt = cls._get_open3d_ptcloud(gt) + + dist1 = pred.compute_point_cloud_distance(gt) + dist2 = gt.compute_point_cloud_distance(pred) + + recall = float(sum(d < th for d in dist2)) / float(len(dist2)) + precision = float(sum(d < th for d in dist1)) / float(len(dist1)) + return 2 * recall * precision / (recall + precision) if recall + precision else 0 + + @classmethod + def _get_open3d_ptcloud(cls, tensor): + """pred and gt bs is 1""" + tensor = tensor.squeeze().cpu().numpy() + ptcloud = open3d.geometry.PointCloud() + ptcloud.points = open3d.utility.Vector3dVector(tensor) + + return ptcloud + + @classmethod + def _get_chamfer_distancel1(cls, pred, gt): + chamfer_distance = cls.ITEMS[1]['eval_object'] + return chamfer_distance(pred, gt).item() * 1000 + + @classmethod + def _get_chamfer_distancel2(cls, pred, gt): + chamfer_distance = cls.ITEMS[2]['eval_object'] + return chamfer_distance(pred, gt).item() * 1000 + + def __init__(self, metric_name, values): + self._items = Metrics.items() + self._values = [item['init_value'] for item in self._items] + self.metric_name = metric_name + + if type(values).__name__ == 'list': + self._values = values + elif type(values).__name__ == 'dict': + metric_indexes = {} + for idx, item in enumerate(self._items): + item_name = item['name'] + metric_indexes[item_name] = idx + for k, v in values.items(): + if k not in metric_indexes: + logging.warn('Ignore Metric[Name=%s] due to disability.' % k) + continue + self._values[metric_indexes[k]] = v + else: + raise Exception('Unsupported value type: %s' % type(values)) + + def state_dict(self): + _dict = dict() + for i in range(len(self._items)): + item = self._items[i]['name'] + value = self._values[i] + _dict[item] = value + + return _dict + + def __repr__(self): + return str(self.state_dict()) + + def better_than(self, other): + if other is None: + return True + + _index = -1 + for i, _item in enumerate(self._items): + if _item['name'] == self.metric_name: + _index = i + break + if _index == -1: + raise Exception('Invalid metric name to compare.') + + _metric = self._items[i] + _value = self._values[_index] + other_value = other._values[_index] + return _value > other_value if _metric['is_greater_better'] else _value < other_value diff --git a/zoo/PointBERT/utils/misc.py b/zoo/PointBERT/utils/misc.py new file mode 100644 index 0000000..1102762 --- /dev/null +++ b/zoo/PointBERT/utils/misc.py @@ -0,0 +1,248 @@ +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +import random +import torch +import torch.nn as nn +import torch.nn.functional as F +import os +from collections import abc +from pointnet2_ops import pointnet2_utils + + +def fps(data, number): + ''' + data B N 3 + number int + ''' + fps_idx = pointnet2_utils.furthest_point_sample(data, number) + fps_data = pointnet2_utils.gather_operation(data.transpose(1, 2).contiguous(), fps_idx).transpose(1,2).contiguous() + return fps_data + + +def worker_init_fn(worker_id): + np.random.seed(np.random.get_state()[1][0] + worker_id) + +def build_lambda_sche(opti, config): + if config.get('decay_step') is not None: + lr_lbmd = lambda e: max(config.lr_decay ** (e / config.decay_step), config.lowest_decay) + scheduler = torch.optim.lr_scheduler.LambdaLR(opti, lr_lbmd) + else: + raise NotImplementedError() + return scheduler + +def build_lambda_bnsche(model, config): + if config.get('decay_step') is not None: + bnm_lmbd = lambda e: max(config.bn_momentum * config.bn_decay ** (e / config.decay_step), config.lowest_decay) + bnm_scheduler = BNMomentumScheduler(model, bnm_lmbd) + else: + raise NotImplementedError() + return bnm_scheduler + +def set_random_seed(seed, deterministic=False): + """Set random seed. + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + + # Speed-reproducibility tradeoff https://pytorch.org/docs/stable/notes/randomness.html + if cuda_deterministic: # slower, more reproducible + cudnn.deterministic = True + cudnn.benchmark = False + else: # faster, less reproducible + cudnn.deterministic = False + cudnn.benchmark = True + + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def is_seq_of(seq, expected_type, seq_type=None): + """Check whether it is a sequence of some type. + Args: + seq (Sequence): The sequence to be checked. + expected_type (type): Expected type of sequence items. + seq_type (type, optional): Expected sequence type. + Returns: + bool: Whether the sequence is valid. + """ + if seq_type is None: + exp_seq_type = abc.Sequence + else: + assert isinstance(seq_type, type) + exp_seq_type = seq_type + if not isinstance(seq, exp_seq_type): + return False + for item in seq: + if not isinstance(item, expected_type): + return False + return True + + +def set_bn_momentum_default(bn_momentum): + def fn(m): + if isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d)): + m.momentum = bn_momentum + return fn + +class BNMomentumScheduler(object): + + def __init__( + self, model, bn_lambda, last_epoch=-1, + setter=set_bn_momentum_default + ): + if not isinstance(model, nn.Module): + raise RuntimeError( + "Class '{}' is not a PyTorch nn Module".format( + type(model).__name__ + ) + ) + + self.model = model + self.setter = setter + self.lmbd = bn_lambda + + self.step(last_epoch + 1) + self.last_epoch = last_epoch + + def step(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + + self.last_epoch = epoch + self.model.apply(self.setter(self.lmbd(epoch))) + + def get_momentum(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + return self.lmbd(epoch) + + + +def seprate_point_cloud(xyz, num_points, crop, fixed_points = None, padding_zeros = False): + ''' + seprate point cloud: usage : using to generate the incomplete point cloud with a setted number. + ''' + _,n,c = xyz.shape + + assert n == num_points + assert c == 3 + if crop == num_points: + return xyz, None + + INPUT = [] + CROP = [] + for points in xyz: + if isinstance(crop,list): + num_crop = random.randint(crop[0],crop[1]) + else: + num_crop = crop + + points = points.unsqueeze(0) + + if fixed_points is None: + center = F.normalize(torch.randn(1,1,3),p=2,dim=-1).cuda() + else: + if isinstance(fixed_points,list): + fixed_point = random.sample(fixed_points,1)[0] + else: + fixed_point = fixed_points + center = fixed_point.reshape(1,1,3).cuda() + + distance_matrix = torch.norm(center.unsqueeze(2) - points.unsqueeze(1), p =2 ,dim = -1) # 1 1 2048 + + idx = torch.argsort(distance_matrix,dim=-1, descending=False)[0,0] # 2048 + + if padding_zeros: + input_data = points.clone() + input_data[0, idx[:num_crop]] = input_data[0,idx[:num_crop]] * 0 + + else: + input_data = points.clone()[0, idx[num_crop:]].unsqueeze(0) # 1 N 3 + + crop_data = points.clone()[0, idx[:num_crop]].unsqueeze(0) + + if isinstance(crop,list): + INPUT.append(fps(input_data,2048)) + CROP.append(fps(crop_data,2048)) + else: + INPUT.append(input_data) + CROP.append(crop_data) + + input_data = torch.cat(INPUT,dim=0)# B N 3 + crop_data = torch.cat(CROP,dim=0)# B M 3 + + return input_data.contiguous(), crop_data.contiguous() + +def get_ptcloud_img(ptcloud): + fig = plt.figure(figsize=(8, 8)) + + x, z, y = ptcloud.transpose(1, 0) + ax = fig.gca(projection=Axes3D.name, adjustable='box') + ax.axis('off') + # ax.axis('scaled') + ax.view_init(30, 45) + max, min = np.max(ptcloud), np.min(ptcloud) + ax.set_xbound(min, max) + ax.set_ybound(min, max) + ax.set_zbound(min, max) + ax.scatter(x, y, z, zdir='z', c=x, cmap='jet') + + fig.canvas.draw() + img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + img = img.reshape(fig.canvas.get_width_height()[::-1] + (3, )) + return img + + + +def visualize_KITTI(path, data_list, titles = ['input','pred'], cmap=['bwr','autumn'], zdir='y', + xlim=(-1, 1), ylim=(-1, 1), zlim=(-1, 1) ): + fig = plt.figure(figsize=(6*len(data_list),6)) + cmax = data_list[-1][:,0].max() + + for i in range(len(data_list)): + data = data_list[i][:-2048] if i == 1 else data_list[i] + color = data[:,0] /cmax + ax = fig.add_subplot(1, len(data_list) , i + 1, projection='3d') + ax.view_init(30, -120) + b = ax.scatter(data[:, 0], data[:, 1], data[:, 2], zdir=zdir, c=color,vmin=-1,vmax=1 ,cmap = cmap[0],s=4,linewidth=0.05, edgecolors = 'black') + ax.set_title(titles[i]) + + ax.set_axis_off() + ax.set_xlim(xlim) + ax.set_ylim(ylim) + ax.set_zlim(zlim) + plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0.2, hspace=0) + if not os.path.exists(path): + os.makedirs(path) + + pic_path = path + '.png' + fig.savefig(pic_path) + + np.save(os.path.join(path, 'input.npy'), data_list[0].numpy()) + np.save(os.path.join(path, 'pred.npy'), data_list[1].numpy()) + plt.close(fig) + + +def random_dropping(pc, e): + up_num = max(64, 768 // (e//50 + 1)) + pc = pc + random_num = torch.randint(1, up_num, (1,1))[0,0] + pc = fps(pc, random_num) + padding = torch.zeros(pc.size(0), 2048 - pc.size(1), 3).to(pc.device) + pc = torch.cat([pc, padding], dim = 1) + return pc + + +def random_scale(partial, scale_range=[0.8, 1.2]): + scale = torch.rand(1).cuda() * (scale_range[1] - scale_range[0]) + scale_range[0] + return partial * scale diff --git a/zoo/PointBERT/utils/parser.py b/zoo/PointBERT/utils/parser.py new file mode 100644 index 0000000..397ef85 --- /dev/null +++ b/zoo/PointBERT/utils/parser.py @@ -0,0 +1,110 @@ +import os +import argparse +from pathlib import Path + +def get_args(): + parser = argparse.ArgumentParser() + parser.add_argument( + '--config', + type = str, + help = 'yaml config file') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + parser.add_argument('--num_workers', type=int, default=4) + # seed + parser.add_argument('--seed', type=int, default=0, help='random seed') + parser.add_argument( + '--deterministic', + action='store_true', + help='whether to set deterministic options for CUDNN backend.') + # bn + parser.add_argument( + '--sync_bn', + action='store_true', + default=False, + help='whether to use sync bn') + # some args + parser.add_argument('--exp_name', type = str, default='default', help = 'experiment name') + parser.add_argument('--start_ckpts', type = str, default=None, help = 'reload used ckpt path') + parser.add_argument('--ckpts', type = str, default=None, help = 'test used ckpt path') + parser.add_argument('--val_freq', type = int, default=1, help = 'test freq') + parser.add_argument( + '--resume', + action='store_true', + default=False, + help = 'autoresume training (interrupted by accident)') + parser.add_argument( + '--test', + action='store_true', + default=False, + help = 'test mode for certain ckpt') + parser.add_argument( + '--finetune_model', + action='store_true', + default=False, + help = 'finetune modelnet with pretrained weight') + parser.add_argument( + '--scratch_model', + action='store_true', + default=False, + help = 'training modelnet from scratch') + parser.add_argument( + '--label_smoothing', + action='store_true', + default=False, + help = 'use label smoothing loss trick') + parser.add_argument( + '--mode', + choices=['easy', 'median', 'hard', None], + default=None, + help = 'difficulty mode for shapenet') + parser.add_argument( + '--way', type=int, default=-1) + parser.add_argument( + '--shot', type=int, default=-1) + parser.add_argument( + '--fold', type=int, default=-1) + + args = parser.parse_args() + + if args.test and args.resume: + raise ValueError( + '--test and --resume cannot be both activate') + + if args.resume and args.start_ckpts is not None: + raise ValueError( + '--resume and --start_ckpts cannot be both activate') + + if args.test and args.ckpts is None: + raise ValueError( + 'ckpts shouldnt be None while test mode') + + if args.finetune_model and args.ckpts is None: + raise ValueError( + 'ckpts shouldnt be None while finetune_model mode') + + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + if args.test: + args.exp_name = 'test_' + args.exp_name + if args.mode is not None: + args.exp_name = args.exp_name + '_' +args.mode + args.experiment_path = os.path.join('./experiments', Path(args.config).stem, Path(args.config).parent.stem, args.exp_name) + args.tfboard_path = os.path.join('./experiments', Path(args.config).stem, Path(args.config).parent.stem,'TFBoard' ,args.exp_name) + args.log_name = Path(args.config).stem + create_experiment_dir(args) + return args + +def create_experiment_dir(args): + if not os.path.exists(args.experiment_path): + os.makedirs(args.experiment_path) + print('Create experiment path successfully at %s' % args.experiment_path) + if not os.path.exists(args.tfboard_path): + os.makedirs(args.tfboard_path) + print('Create TFBoard path successfully at %s' % args.tfboard_path) + diff --git a/zoo/PointBERT/utils/registry.py b/zoo/PointBERT/utils/registry.py new file mode 100644 index 0000000..025e4ee --- /dev/null +++ b/zoo/PointBERT/utils/registry.py @@ -0,0 +1,288 @@ +import inspect +import warnings +from functools import partial +from utils import config + +class Registry: + """A registry to map strings to classes. + Registered object could be built from registry. + Example: + >>> MODELS = Registry('models') + >>> @MODELS.register_module() + >>> class ResNet: + >>> pass + >>> resnet = MODELS.build(dict(NAME='ResNet')) + Please refer to https://mmcv.readthedocs.io/en/latest/registry.html for + advanced useage. + Args: + name (str): Registry name. + build_func(func, optional): Build function to construct instance from + Registry, func:`build_from_cfg` is used if neither ``parent`` or + ``build_func`` is specified. If ``parent`` is specified and + ``build_func`` is not given, ``build_func`` will be inherited + from ``parent``. Default: None. + parent (Registry, optional): Parent registry. The class registered in + children registry could be built from parent. Default: None. + scope (str, optional): The scope of registry. It is the key to search + for children registry. If not specified, scope will be the name of + the package where class is defined, e.g. mmdet, mmcls, mmseg. + Default: None. + """ + + def __init__(self, name, build_func=None, parent=None, scope=None): + self._name = name + self._module_dict = dict() + self._children = dict() + self._scope = self.infer_scope() if scope is None else scope + + # self.build_func will be set with the following priority: + # 1. build_func + # 2. parent.build_func + # 3. build_from_cfg + if build_func is None: + if parent is not None: + self.build_func = parent.build_func + else: + self.build_func = build_from_cfg + else: + self.build_func = build_func + if parent is not None: + assert isinstance(parent, Registry) + parent._add_children(self) + self.parent = parent + else: + self.parent = None + + def __len__(self): + return len(self._module_dict) + + def __contains__(self, key): + return self.get(key) is not None + + def __repr__(self): + format_str = self.__class__.__name__ + \ + f'(name={self._name}, ' \ + f'items={self._module_dict})' + return format_str + + @staticmethod + def infer_scope(): + """Infer the scope of registry. + The name of the package where registry is defined will be returned. + Example: + # in mmdet/models/backbone/resnet.py + >>> MODELS = Registry('models') + >>> @MODELS.register_module() + >>> class ResNet: + >>> pass + The scope of ``ResNet`` will be ``mmdet``. + Returns: + scope (str): The inferred scope name. + """ + # inspect.stack() trace where this function is called, the index-2 + # indicates the frame where `infer_scope()` is called + filename = inspect.getmodule(inspect.stack()[2][0]).__name__ + split_filename = filename.split('.') + return split_filename[0] + + @staticmethod + def split_scope_key(key): + """Split scope and key. + The first scope will be split from key. + Examples: + >>> Registry.split_scope_key('mmdet.ResNet') + 'mmdet', 'ResNet' + >>> Registry.split_scope_key('ResNet') + None, 'ResNet' + Return: + scope (str, None): The first scope. + key (str): The remaining key. + """ + split_index = key.find('.') + if split_index != -1: + return key[:split_index], key[split_index + 1:] + else: + return None, key + + @property + def name(self): + return self._name + + @property + def scope(self): + return self._scope + + @property + def module_dict(self): + return self._module_dict + + @property + def children(self): + return self._children + + def get(self, key): + """Get the registry record. + Args: + key (str): The class name in string format. + Returns: + class: The corresponding class. + """ + scope, real_key = self.split_scope_key(key) + if scope is None or scope == self._scope: + # get from self + if real_key in self._module_dict: + return self._module_dict[real_key] + else: + # get from self._children + if scope in self._children: + return self._children[scope].get(real_key) + else: + # goto root + parent = self.parent + while parent.parent is not None: + parent = parent.parent + return parent.get(key) + + def build(self, *args, **kwargs): + return self.build_func(*args, **kwargs, registry=self) + + def _add_children(self, registry): + """Add children for a registry. + The ``registry`` will be added as children based on its scope. + The parent registry could build objects from children registry. + Example: + >>> models = Registry('models') + >>> mmdet_models = Registry('models', parent=models) + >>> @mmdet_models.register_module() + >>> class ResNet: + >>> pass + >>> resnet = models.build(dict(NAME='mmdet.ResNet')) + """ + + assert isinstance(registry, Registry) + assert registry.scope is not None + assert registry.scope not in self.children, \ + f'scope {registry.scope} exists in {self.name} registry' + self.children[registry.scope] = registry + + def _register_module(self, module_class, module_name=None, force=False): + if not inspect.isclass(module_class): + raise TypeError('module must be a class, ' + f'but got {type(module_class)}') + + if module_name is None: + module_name = module_class.__name__ + if isinstance(module_name, str): + module_name = [module_name] + for name in module_name: + if not force and name in self._module_dict: + raise KeyError(f'{name} is already registered ' + f'in {self.name}') + self._module_dict[name] = module_class + + def deprecated_register_module(self, cls=None, force=False): + warnings.warn( + 'The old API of register_module(module, force=False) ' + 'is deprecated and will be removed, please use the new API ' + 'register_module(name=None, force=False, module=None) instead.') + if cls is None: + return partial(self.deprecated_register_module, force=force) + self._register_module(cls, force=force) + return cls + + def register_module(self, name=None, force=False, module=None): + """Register a module. + A record will be added to `self._module_dict`, whose key is the class + name or the specified name, and value is the class itself. + It can be used as a decorator or a normal function. + Example: + >>> backbones = Registry('backbone') + >>> @backbones.register_module() + >>> class ResNet: + >>> pass + >>> backbones = Registry('backbone') + >>> @backbones.register_module(name='mnet') + >>> class MobileNet: + >>> pass + >>> backbones = Registry('backbone') + >>> class ResNet: + >>> pass + >>> backbones.register_module(ResNet) + Args: + name (str | None): The module name to be registered. If not + specified, the class name will be used. + force (bool, optional): Whether to override an existing class with + the same name. Default: False. + module (type): Module class to be registered. + """ + if not isinstance(force, bool): + raise TypeError(f'force must be a boolean, but got {type(force)}') + # NOTE: This is a walkaround to be compatible with the old api, + # while it may introduce unexpected bugs. + if isinstance(name, type): + return self.deprecated_register_module(name, force=force) + + # raise the error ahead of time + if not (name is None or isinstance(name, str) or misc.is_seq_of(name, str)): + raise TypeError( + 'name must be either of None, an instance of str or a sequence' + f' of str, but got {type(name)}') + + # use it as a normal method: x.register_module(module=SomeClass) + if module is not None: + self._register_module( + module_class=module, module_name=name, force=force) + return module + + # use it as a decorator: @x.register_module() + def _register(cls): + self._register_module( + module_class=cls, module_name=name, force=force) + return cls + + return _register + + +def build_from_cfg(cfg, registry, default_args=None): + """Build a module from config dict. + Args: + cfg (edict): Config dict. It should at least contain the key "NAME". + registry (:obj:`Registry`): The registry to search the type from. + Returns: + object: The constructed object. + """ + if not isinstance(cfg, dict): + raise TypeError(f'cfg must be a dict, but got {type(cfg)}') + if 'NAME' not in cfg: + if default_args is None or 'NAME' not in default_args: + raise KeyError( + '`cfg` or `default_args` must contain the key "NAME", ' + f'but got {cfg}\n{default_args}') + if not isinstance(registry, Registry): + raise TypeError('registry must be an mmcv.Registry object, ' + f'but got {type(registry)}') + + if not (isinstance(default_args, dict) or default_args is None): + raise TypeError('default_args must be a dict or None, ' + f'but got {type(default_args)}') + + if default_args is not None: + cfg = config.merge_new_config(cfg, default_args) + + obj_type = cfg.get('NAME') + + if isinstance(obj_type, str): + obj_cls = registry.get(obj_type) + if obj_cls is None: + raise KeyError( + f'{obj_type} is not in the {registry.name} registry') + elif inspect.isclass(obj_type): + obj_cls = obj_type + else: + raise TypeError( + f'type must be a str or valid type, but got {type(obj_type)}') + try: + return obj_cls(cfg) + except Exception as e: + # Normal TypeError does not print class name. + raise type(e)(f'{obj_cls.__name__}: {e}') diff --git a/zoo/PointMAE/DATASET.md b/zoo/PointMAE/DATASET.md new file mode 100644 index 0000000..a132aaa --- /dev/null +++ b/zoo/PointMAE/DATASET.md @@ -0,0 +1,88 @@ +## Dataset + +The overall directory structure should be: +``` +β”‚Point-MAE/ +β”œβ”€β”€cfgs/ +β”œβ”€β”€data/ +β”‚ β”œβ”€β”€ModelNet/ +β”‚ β”œβ”€β”€ModelNetFewshot/ +β”‚ β”œβ”€β”€ScanObjectNN/ +β”‚ β”œβ”€β”€ShapeNet55-34/ +β”‚ β”œβ”€β”€shapenetcore_partanno_segmentation_benchmark_v0_normal/ +β”œβ”€β”€datasets/ +β”œβ”€β”€....... +``` + +### ModelNet40 Dataset: + +``` +β”‚ModelNet/ +β”œβ”€β”€modelnet40_normal_resampled/ +β”‚ β”œβ”€β”€ modelnet40_shape_names.txt +β”‚ β”œβ”€β”€ modelnet40_train.txt +β”‚ β”œβ”€β”€ modelnet40_test.txt +β”‚ β”œβ”€β”€ modelnet40_train_8192pts_fps.dat +β”‚ β”œβ”€β”€ modelnet40_test_8192pts_fps.dat +``` +Download: You can download the processed data from [Point-BERT repo](https://github.com/lulutang0608/Point-BERT/blob/49e2c7407d351ce8fe65764bbddd5d9c0e0a4c52/DATASET.md), or download from the [official website](https://modelnet.cs.princeton.edu/#) and process it by yourself. + +### ModelNet Few-shot Dataset: +``` +β”‚ModelNetFewshot/ +β”œβ”€β”€5way10shot/ +β”‚ β”œβ”€β”€ 0.pkl +β”‚ β”œβ”€β”€ ... +β”‚ β”œβ”€β”€ 9.pkl +β”œβ”€β”€5way20shot/ +β”‚ β”œβ”€β”€ ... +β”œβ”€β”€10way10shot/ +β”‚ β”œβ”€β”€ ... +β”œβ”€β”€10way20shot/ +β”‚ β”œβ”€β”€ ... +``` + +Download: Please download the data from [Point-BERT repo](https://github.com/lulutang0608/Point-BERT/blob/49e2c7407d351ce8fe65764bbddd5d9c0e0a4c52/DATASET.md). We use the same data split as theirs. + +### ScanObjectNN Dataset: +``` +β”‚ScanObjectNN/ +β”œβ”€β”€main_split/ +β”‚ β”œβ”€β”€ training_objectdataset_augmentedrot_scale75.h5 +β”‚ β”œβ”€β”€ test_objectdataset_augmentedrot_scale75.h5 +β”‚ β”œβ”€β”€ training_objectdataset.h5 +β”‚ β”œβ”€β”€ test_objectdataset.h5 +β”œβ”€β”€main_split_nobg/ +β”‚ β”œβ”€β”€ training_objectdataset.h5 +β”‚ β”œβ”€β”€ test_objectdataset.h5 +``` +Download: Please download the data from the [official website](https://hkust-vgd.github.io/scanobjectnn/). + +### ShapeNet55/34 Dataset: + +``` +β”‚ShapeNet55-34/ +β”œβ”€β”€shapenet_pc/ +β”‚ β”œβ”€β”€ 02691156-1a04e3eab45ca15dd86060f189eb133.npy +β”‚ β”œβ”€β”€ 02691156-1a6ad7a24bb89733f412783097373bdc.npy +β”‚ β”œβ”€β”€ ....... +β”œβ”€β”€ShapeNet-55/ +β”‚ β”œβ”€β”€ train.txt +β”‚ └── test.txt +``` + +Download: Please download the data from [Point-BERT repo](https://github.com/lulutang0608/Point-BERT/blob/49e2c7407d351ce8fe65764bbddd5d9c0e0a4c52/DATASET.md). + +### ShapeNetPart Dataset: + +``` +|shapenetcore_partanno_segmentation_benchmark_v0_normal/ +β”œβ”€β”€02691156/ +β”‚ β”œβ”€β”€ 1a04e3eab45ca15dd86060f189eb133.txt +β”‚ β”œβ”€β”€ ....... +│── ....... +│──train_test_split/ +│──synsetoffset2category.txt +``` + +Download: Please download the data from [here](https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip). diff --git a/zoo/PointMAE/LICENSE b/zoo/PointMAE/LICENSE new file mode 100644 index 0000000..f868a80 --- /dev/null +++ b/zoo/PointMAE/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 PANG-Yatian, YUAN-Li + +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/zoo/PointMAE/README.md b/zoo/PointMAE/README.md new file mode 100644 index 0000000..be4f2f2 --- /dev/null +++ b/zoo/PointMAE/README.md @@ -0,0 +1,117 @@ +# Point-MAE + +## Masked Autoencoders for Point Cloud Self-supervised Learning, [arxiv](https://arxiv.org/abs/2203.06604) + +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/masked-autoencoders-for-point-cloud-self/3d-point-cloud-classification-on-scanobjectnn)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-scanobjectnn?p=masked-autoencoders-for-point-cloud-self) +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/masked-autoencoders-for-point-cloud-self/3d-point-cloud-classification-on-modelnet40)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-modelnet40?p=masked-autoencoders-for-point-cloud-self) + +In this work, we present a novel scheme of masked autoencoders for point cloud self-supervised learning, termed as Point-MAE. Our Point-MAE is neat and efficient, with minimal modifications based on the properties of the point cloud. In classification tasks, Point-MAE outperforms all the other self-supervised learning methods on ScanObjectNN and ModelNet40. Point-MAE also advances state-of-the-art accuracies by 1.5%-2.3% in the few-shot learning on ModelNet40. + +
+ +
+ +## 1. Requirements +PyTorch >= 1.7.0; +python >= 3.7; +CUDA >= 9.0; +GCC >= 4.9; +torchvision; + +``` +pip install -r requirements.txt +``` + +``` +# Chamfer Distance & emd +cd ./extensions/chamfer_dist +python setup.py install --user +cd ./extensions/emd +python setup.py install --user +# PointNet++ +pip install "git+git://github.com/erikwijmans/Pointnet2_PyTorch.git#egg=pointnet2_ops&subdirectory=pointnet2_ops_lib" +# GPU kNN +pip install --upgrade https://github.com/unlimblue/KNN_CUDA/releases/download/0.2/KNN_CUDA-0.2-py3-none-any.whl +``` + +## 2. Datasets + +We use ShapeNet, ScanObjectNN, ModelNet40 and ShapeNetPart in this work. See [DATASET.md](./DATASET.md) for details. + +## 3. Point-MAE Models +| Task | Dataset | Config | Acc.| Download| +| ----- | ----- |-----| -----| -----| +| Pre-training | ShapeNet |[pretrain.yaml](./cfgs/pretrain.yaml)| N.A. | [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/pretrain.pth) | +| Classification | ScanObjectNN |[finetune_scan_hardest.yaml](./cfgs/finetune_scan_hardest.yaml)| 84.52%| [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/scan_hardest.pth) | +| Classification | ScanObjectNN |[finetune_scan_objbg.yaml](./cfgs/finetune_scan_objbg.yaml)| 88.29%| [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/scan_objbg.pth) | +| Classification | ScanObjectNN |[finetune_scan_objonly.yaml](./cfgs/finetune_scan_objonly.yaml)| 90.01%| [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/scan_objonly.pth) | +| Classification | ModelNet40(1k) |[finetune_modelnet.yaml](./cfgs/finetune_modelnet.yaml)| 93.80%| [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/modelnet_1k.pth) | +| Classification | ModelNet40(8k) |[finetune_modelnet_8k.yaml](./cfgs/finetune_modelnet_8k.yaml)| 94.04%| [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/modelnet_8k.pth) | +| Part segmentation| ShapeNetPart| [segmentation](./segmentation)| 86.1% mIoU| [here](https://github.com/Pang-Yatian/Point-MAE/releases/download/main/part_seg.pth) | + +| Task | Dataset | Config | 5w10s Acc. (%)| 5w20s Acc. (%)| 10w10s Acc. (%)| 10w20s Acc. (%)| +| ----- | ----- |-----| -----| -----|-----|-----| +| Few-shot learning | ModelNet40 |[fewshot.yaml](./cfgs/fewshot.yaml)| 96.3 Β± 2.5| 97.8 Β± 1.8| 92.6 Β± 4.1| 95.0 Β± 3.0| + +## 4. Point-MAE Pre-training +To pretrain Point-MAE on ShapeNet training set, run the following command. If you want to try different models or masking ratios etc., first create a new config file, and pass its path to --config. + +``` +CUDA_VISIBLE_DEVICES= python main.py --config cfgs/pretrain.yaml --exp_name +``` +## 5. Point-MAE Fine-tuning + +Fine-tuning on ScanObjectNN, run: +``` +CUDA_VISIBLE_DEVICES= python main.py --config cfgs/finetune_scan_hardest.yaml \ +--finetune_model --exp_name --ckpts +``` +Fine-tuning on ModelNet40, run: +``` +CUDA_VISIBLE_DEVICES= python main.py --config cfgs/finetune_modelnet.yaml \ +--finetune_model --exp_name --ckpts +``` +Voting on ModelNet40, run: +``` +CUDA_VISIBLE_DEVICES= python main.py --test --config cfgs/finetune_modelnet.yaml \ +--exp_name --ckpts +``` +Few-shot learning, run: +``` +CUDA_VISIBLE_DEVICES= python main.py --config cfgs/fewshot.yaml --finetune_model \ +--ckpts --exp_name --way <5 or 10> --shot <10 or 20> --fold <0-9> +``` +Part segmentation on ShapeNetPart, run: +``` +cd segmentation +python main.py --ckpts --root path/to/data --learning_rate 0.0002 --epoch 300 +``` + +## 6. Visualization + +Visulization of pre-trained model on ShapeNet validation set, run: + +``` +python main_vis.py --test --ckpts --config cfgs/pretrain.yaml --exp_name +``` + +
+ +
+ +## Acknowledgements + +Our codes are built upon [Point-BERT](https://github.com/lulutang0608/Point-BERT), [Pointnet2_PyTorch](https://github.com/erikwijmans/Pointnet2_PyTorch) and [Pointnet_Pointnet2_pytorch](https://github.com/yanx27/Pointnet_Pointnet2_pytorch) + +## Reference + +``` +@misc{pang2022masked, + title={Masked Autoencoders for Point Cloud Self-supervised Learning}, + author={Yatian Pang and Wenxiao Wang and Francis E. H. Tay and Wei Liu and Yonghong Tian and Li Yuan}, + year={2022}, + eprint={2203.06604}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/zoo/PointMAE/cfgs/dataset_configs/ModelNet40.yaml b/zoo/PointMAE/cfgs/dataset_configs/ModelNet40.yaml new file mode 100644 index 0000000..f5da9db --- /dev/null +++ b/zoo/PointMAE/cfgs/dataset_configs/ModelNet40.yaml @@ -0,0 +1,5 @@ +NAME: ModelNet +DATA_PATH: data/ModelNet/modelnet40_normal_resampled +N_POINTS: 8192 +NUM_CATEGORY: 40 +USE_NORMALS: FALSE \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/dataset_configs/ModelNet40FewShot.yaml b/zoo/PointMAE/cfgs/dataset_configs/ModelNet40FewShot.yaml new file mode 100644 index 0000000..479f215 --- /dev/null +++ b/zoo/PointMAE/cfgs/dataset_configs/ModelNet40FewShot.yaml @@ -0,0 +1,5 @@ +NAME: ModelNetFewShot +DATA_PATH: data/ModelNetFewshot +N_POINTS: 8192 +NUM_CATEGORY: 40 +USE_NORMALS: FALSE \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_hardest.yaml b/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_hardest.yaml new file mode 100644 index 0000000..c8ec020 --- /dev/null +++ b/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_hardest.yaml @@ -0,0 +1,2 @@ +NAME: ScanObjectNN_hardest +ROOT: data/ScanObjectNN/main_split \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_objectbg.yaml b/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_objectbg.yaml new file mode 100644 index 0000000..cbaa4b6 --- /dev/null +++ b/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_objectbg.yaml @@ -0,0 +1,2 @@ +NAME: ScanObjectNN +ROOT: data/ScanObjectNN/main_split \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_objectonly.yaml b/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_objectonly.yaml new file mode 100644 index 0000000..0d0f86c --- /dev/null +++ b/zoo/PointMAE/cfgs/dataset_configs/ScanObjectNN_objectonly.yaml @@ -0,0 +1,2 @@ +NAME: ScanObjectNN +ROOT: data/ScanObjectNN/main_split_nobg \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/dataset_configs/ShapeNet-55.yaml b/zoo/PointMAE/cfgs/dataset_configs/ShapeNet-55.yaml new file mode 100644 index 0000000..9d7403c --- /dev/null +++ b/zoo/PointMAE/cfgs/dataset_configs/ShapeNet-55.yaml @@ -0,0 +1,4 @@ +NAME: ShapeNet +DATA_PATH: data/ShapeNet55-34/ShapeNet-55 +N_POINTS: 8192 +PC_PATH: data/ShapeNet55-34/shapenet_pc \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/fewshot.yaml b/zoo/PointMAE/cfgs/fewshot.yaml new file mode 100644 index 0000000..838b1d8 --- /dev/null +++ b/zoo/PointMAE/cfgs/fewshot.yaml @@ -0,0 +1,39 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 150, + initial_epochs : 10 +}} + + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40FewShot.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40FewShot.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 384, +} + +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 150 +grad_norm_clip : 10 diff --git a/zoo/PointMAE/cfgs/finetune_modelnet.yaml b/zoo/PointMAE/cfgs/finetune_modelnet.yaml new file mode 100644 index 0000000..810e56c --- /dev/null +++ b/zoo/PointMAE/cfgs/finetune_modelnet.yaml @@ -0,0 +1,39 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 64, + encoder_dims: 384, +} + + +npoints: 1024 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/finetune_modelnet_8k.yaml b/zoo/PointMAE/cfgs/finetune_modelnet_8k.yaml new file mode 100644 index 0000000..3ec45ca --- /dev/null +++ b/zoo/PointMAE/cfgs/finetune_modelnet_8k.yaml @@ -0,0 +1,39 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ModelNet40.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 40, + num_heads: 6, + group_size: 32, + num_group: 512, + encoder_dims: 384, +} + + +npoints: 8192 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/finetune_scan_hardest.yaml b/zoo/PointMAE/cfgs/finetune_scan_hardest.yaml new file mode 100644 index 0000000..24a0f60 --- /dev/null +++ b/zoo/PointMAE/cfgs/finetune_scan_hardest.yaml @@ -0,0 +1,39 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 200, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ScanObjectNN_hardest.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ScanObjectNN_hardest.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ScanObjectNN_hardest.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 15, + num_heads: 6, + group_size: 32, + num_group: 128, + encoder_dims: 384, +} + + +npoints: 2048 +total_bs : 32 +step_per_update : 1 +max_epoch : 200 +grad_norm_clip : 10 \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/finetune_scan_objbg.yaml b/zoo/PointMAE/cfgs/finetune_scan_objbg.yaml new file mode 100644 index 0000000..d37f876 --- /dev/null +++ b/zoo/PointMAE/cfgs/finetune_scan_objbg.yaml @@ -0,0 +1,39 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ScanObjectNN_objectbg.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ScanObjectNN_objectbg.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ScanObjectNN_objectbg.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 15, + num_heads: 6, + group_size: 32, + num_group: 128, + encoder_dims: 384, +} + + +npoints: 2048 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/finetune_scan_objonly.yaml b/zoo/PointMAE/cfgs/finetune_scan_objonly.yaml new file mode 100644 index 0000000..b9abf2d --- /dev/null +++ b/zoo/PointMAE/cfgs/finetune_scan_objonly.yaml @@ -0,0 +1,39 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.0005, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ScanObjectNN_objectonly.yaml, + others: {subset: 'train'}}, + val : { _base_: cfgs/dataset_configs/ScanObjectNN_objectonly.yaml, + others: {subset: 'test'}}, + test : { _base_: cfgs/dataset_configs/ScanObjectNN_objectonly.yaml, + others: {subset: 'test'}}} +model : { + NAME: PointTransformer, + trans_dim: 384, + depth: 12, + drop_path_rate: 0.1, + cls_dim: 15, + num_heads: 6, + group_size: 32, + num_group: 128, + encoder_dims: 384, +} + + +npoints: 2048 +total_bs : 32 +step_per_update : 1 +max_epoch : 300 +grad_norm_clip : 10 \ No newline at end of file diff --git a/zoo/PointMAE/cfgs/pretrain.yaml b/zoo/PointMAE/cfgs/pretrain.yaml new file mode 100644 index 0000000..ecc2019 --- /dev/null +++ b/zoo/PointMAE/cfgs/pretrain.yaml @@ -0,0 +1,44 @@ +optimizer : { + type: AdamW, + kwargs: { + lr : 0.001, + weight_decay : 0.05 +}} + +scheduler: { + type: CosLR, + kwargs: { + epochs: 300, + initial_epochs : 10 +}} + +dataset : { + train : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'train', npoints: 1024}}, + val : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'test', npoints: 1024}}, + test : { _base_: cfgs/dataset_configs/ShapeNet-55.yaml, + others: {subset: 'test', npoints: 1024}}} + +model : { + NAME: Point_MAE, + group_size: 32, + num_group: 64, + loss: cdl2, + transformer_config: { + mask_ratio: 0.6, + mask_type: 'rand', + trans_dim: 384, + encoder_dims: 384, + depth: 12, + drop_path_rate: 0.1, + num_heads: 6, + decoder_depth: 4, + decoder_num_heads: 6, + }, + } + +npoints: 1024 +total_bs : 128 +step_per_update : 1 +max_epoch : 300 \ No newline at end of file diff --git a/zoo/PointMAE/datasets/ModelNetDataset.py b/zoo/PointMAE/datasets/ModelNetDataset.py new file mode 100644 index 0000000..5b14c4d --- /dev/null +++ b/zoo/PointMAE/datasets/ModelNetDataset.py @@ -0,0 +1,149 @@ +''' +@author: Xu Yan +@file: ModelNet.py +@time: 2021/3/19 15:51 +''' +import os +import numpy as np +import warnings +import pickle + +from tqdm import tqdm +from torch.utils.data import Dataset +from .build import DATASETS +from utils.logger import * +import torch + +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + + + +def farthest_point_sample(point, npoint): + """ + Input: + xyz: pointcloud data, [N, D] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [npoint, D] + """ + N, D = point.shape + xyz = point[:,:3] + centroids = np.zeros((npoint,)) + distance = np.ones((N,)) * 1e10 + farthest = np.random.randint(0, N) + for i in range(npoint): + centroids[i] = farthest + centroid = xyz[farthest, :] + dist = np.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = np.argmax(distance, -1) + point = point[centroids.astype(np.int32)] + return point + +@DATASETS.register_module() +class ModelNet(Dataset): + def __init__(self, config): + self.root = config.DATA_PATH + self.npoints = config.N_POINTS + self.use_normals = config.USE_NORMALS + self.num_category = config.NUM_CATEGORY + self.process_data = True + self.uniform = True + split = config.subset + self.subset = config.subset + + if self.num_category == 10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + + shape_ids = {} + if self.num_category == 10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + + assert (split == 'train' or split == 'test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i]) + '.txt') for i + in range(len(shape_ids[split]))] + print_log('The size of %s data is %d' % (split, len(self.datapath)), logger = 'ModelNet') + + if self.uniform: + self.save_path = os.path.join(self.root, 'modelnet%d_%s_%dpts_fps.dat' % (self.num_category, split, self.npoints)) + else: + self.save_path = os.path.join(self.root, 'modelnet%d_%s_%dpts.dat' % (self.num_category, split, self.npoints)) + + if self.process_data: + if not os.path.exists(self.save_path): + print_log('Processing data %s (only running in the first time)...' % self.save_path, logger = 'ModelNet') + self.list_of_points = [None] * len(self.datapath) + self.list_of_labels = [None] * len(self.datapath) + + for index in tqdm(range(len(self.datapath)), total=len(self.datapath)): + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints, :] + + self.list_of_points[index] = point_set + self.list_of_labels[index] = cls + + with open(self.save_path, 'wb') as f: + pickle.dump([self.list_of_points, self.list_of_labels], f) + else: + print_log('Load processed data from %s...' % self.save_path, logger = 'ModelNet') + with open(self.save_path, 'rb') as f: + self.list_of_points, self.list_of_labels = pickle.load(f) + + def __len__(self): + return len(self.datapath) + + def _get_item(self, index): + if self.process_data: + point_set, label = self.list_of_points[index], self.list_of_labels[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + label = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints, :] + + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + if not self.use_normals: + point_set = point_set[:, 0:3] + + return point_set, label[0] + + + def __getitem__(self, index): + points, label = self._get_item(index) + pt_idxs = np.arange(0, points.shape[0]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + current_points = points[pt_idxs].copy() + current_points = torch.from_numpy(current_points).float() + return 'ModelNet', 'sample', (current_points, label) diff --git a/zoo/PointMAE/datasets/ModelNetDatasetFewShot.py b/zoo/PointMAE/datasets/ModelNetDatasetFewShot.py new file mode 100644 index 0000000..8b55880 --- /dev/null +++ b/zoo/PointMAE/datasets/ModelNetDatasetFewShot.py @@ -0,0 +1,71 @@ +''' +@author: Xu Yan +@file: ModelNet.py +@time: 2021/3/19 15:51 +''' +import os +import numpy as np +import warnings +import pickle + +from tqdm import tqdm +from torch.utils.data import Dataset +from .build import DATASETS +from utils.logger import * +import torch +import random + +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +@DATASETS.register_module() +class ModelNetFewShot(Dataset): + def __init__(self, config): + self.root = config.DATA_PATH + self.npoints = config.N_POINTS + self.use_normals = config.USE_NORMALS + self.num_category = config.NUM_CATEGORY + self.process_data = True + self.uniform = True + split = config.subset + self.subset = config.subset + + self.way = config.way + self.shot = config.shot + self.fold = config.fold + if self.way == -1 or self.shot == -1 or self.fold == -1: + raise RuntimeError() + + self.pickle_path = os.path.join(self.root, f'{self.way}way_{self.shot}shot', f'{self.fold}.pkl') + + + print_log('Load processed data from %s...' % self.pickle_path, logger = 'ModelNetFewShot') + + with open(self.pickle_path, 'rb') as f: + self.dataset = pickle.load(f)[self.subset] + + print_log('The size of %s data is %d' % (split, len(self.dataset)), logger = 'ModelNetFewShot') + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, index): + points, label, _ = self.dataset[index] + + points[:, 0:3] = pc_normalize(points[:, 0:3]) + if not self.use_normals: + points = points[:, 0:3] + + pt_idxs = np.arange(0, points.shape[0]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + current_points = points[pt_idxs].copy() + current_points = torch.from_numpy(current_points).float() + return 'ModelNet', 'sample', (current_points, label) \ No newline at end of file diff --git a/zoo/PointMAE/datasets/ScanObjectNNDataset.py b/zoo/PointMAE/datasets/ScanObjectNNDataset.py new file mode 100644 index 0000000..36e1efd --- /dev/null +++ b/zoo/PointMAE/datasets/ScanObjectNNDataset.py @@ -0,0 +1,87 @@ +import numpy as np +import os, sys, h5py +from torch.utils.data import Dataset +import torch +from .build import DATASETS +from utils.logger import * + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +@DATASETS.register_module() +class ScanObjectNN(Dataset): + def __init__(self, config, **kwargs): + super().__init__() + self.subset = config.subset + self.root = config.ROOT + + if self.subset == 'train': + h5 = h5py.File(os.path.join(self.root, 'training_objectdataset.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + elif self.subset == 'test': + h5 = h5py.File(os.path.join(self.root, 'test_objectdataset.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + else: + raise NotImplementedError() + + print(f'Successfully load ScanObjectNN shape of {self.points.shape}') + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.points.shape[1]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + + current_points = self.points[idx, pt_idxs].copy() + + + current_points = torch.from_numpy(current_points).float() + label = self.labels[idx] + + return 'ScanObjectNN', 'sample', (current_points, label) + + def __len__(self): + return self.points.shape[0] + + + +@DATASETS.register_module() +class ScanObjectNN_hardest(Dataset): + def __init__(self, config, **kwargs): + super().__init__() + self.subset = config.subset + self.root = config.ROOT + + if self.subset == 'train': + h5 = h5py.File(os.path.join(self.root, 'training_objectdataset_augmentedrot_scale75.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + elif self.subset == 'test': + h5 = h5py.File(os.path.join(self.root, 'test_objectdataset_augmentedrot_scale75.h5'), 'r') + self.points = np.array(h5['data']).astype(np.float32) + self.labels = np.array(h5['label']).astype(int) + h5.close() + else: + raise NotImplementedError() + + print(f'Successfully load ScanObjectNN shape of {self.points.shape}') + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.points.shape[1]) # 2048 + if self.subset == 'train': + np.random.shuffle(pt_idxs) + + current_points = self.points[idx, pt_idxs].copy() + + + current_points = torch.from_numpy(current_points).float() + label = self.labels[idx] + + return 'ScanObjectNN', 'sample', (current_points, label) + + def __len__(self): + return self.points.shape[0] \ No newline at end of file diff --git a/zoo/PointMAE/datasets/ShapeNet55Dataset.py b/zoo/PointMAE/datasets/ShapeNet55Dataset.py new file mode 100644 index 0000000..4ee1f3c --- /dev/null +++ b/zoo/PointMAE/datasets/ShapeNet55Dataset.py @@ -0,0 +1,70 @@ +import os +import torch +import numpy as np +import torch.utils.data as data +from .io import IO +from .build import DATASETS +from utils.logger import * + +@DATASETS.register_module() +class ShapeNet(data.Dataset): + def __init__(self, config): + self.data_root = config.DATA_PATH + self.pc_path = config.PC_PATH + self.subset = config.subset + self.npoints = config.N_POINTS + + self.data_list_file = os.path.join(self.data_root, f'{self.subset}.txt') + test_data_list_file = os.path.join(self.data_root, 'test.txt') + + self.sample_points_num = config.npoints + self.whole = config.get('whole') + + print_log(f'[DATASET] sample out {self.sample_points_num} points', logger = 'ShapeNet-55') + print_log(f'[DATASET] Open file {self.data_list_file}', logger = 'ShapeNet-55') + with open(self.data_list_file, 'r') as f: + lines = f.readlines() + if self.whole: + with open(test_data_list_file, 'r') as f: + test_lines = f.readlines() + print_log(f'[DATASET] Open file {test_data_list_file}', logger = 'ShapeNet-55') + lines = test_lines + lines + self.file_list = [] + for line in lines: + line = line.strip() + taxonomy_id = line.split('-')[0] + model_id = line.split('-')[1].split('.')[0] + self.file_list.append({ + 'taxonomy_id': taxonomy_id, + 'model_id': model_id, + 'file_path': line + }) + print_log(f'[DATASET] {len(self.file_list)} instances were loaded', logger = 'ShapeNet-55') + + self.permutation = np.arange(self.npoints) + def pc_norm(self, pc): + """ pc: NxC, return NxC """ + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + + + def random_sample(self, pc, num): + np.random.shuffle(self.permutation) + pc = pc[self.permutation[:num]] + return pc + + def __getitem__(self, idx): + sample = self.file_list[idx] + + data = IO.get(os.path.join(self.pc_path, sample['file_path'])).astype(np.float32) + + data = self.random_sample(data, self.sample_points_num) + data = self.pc_norm(data) + data = torch.from_numpy(data).float() + return sample['taxonomy_id'], sample['model_id'], data + + def __len__(self): + return len(self.file_list) \ No newline at end of file diff --git a/zoo/PointMAE/datasets/__init__.py b/zoo/PointMAE/datasets/__init__.py new file mode 100644 index 0000000..5a37c28 --- /dev/null +++ b/zoo/PointMAE/datasets/__init__.py @@ -0,0 +1,5 @@ +from .build import build_dataset_from_cfg +import datasets.ShapeNet55Dataset +import datasets.ModelNetDataset +import datasets.ModelNetDatasetFewShot +import datasets.ScanObjectNNDataset \ No newline at end of file diff --git a/zoo/PointMAE/datasets/build.py b/zoo/PointMAE/datasets/build.py new file mode 100644 index 0000000..db9c4be --- /dev/null +++ b/zoo/PointMAE/datasets/build.py @@ -0,0 +1,17 @@ +from utils import registry + + +DATASETS = registry.Registry('dataset') + + +def build_dataset_from_cfg(cfg, default_args = None): + """ + Build a dataset, defined by `dataset_name`. + Args: + cfg (eDICT): + Returns: + Dataset: a constructed dataset specified by dataset_name. + """ + return DATASETS.build(cfg, default_args = default_args) + + diff --git a/zoo/PointMAE/datasets/data_transforms.py b/zoo/PointMAE/datasets/data_transforms.py new file mode 100644 index 0000000..edb0608 --- /dev/null +++ b/zoo/PointMAE/datasets/data_transforms.py @@ -0,0 +1,117 @@ +import numpy as np +import torch +import random + + +class PointcloudRotate(object): + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + R = torch.from_numpy(rotation_matrix.astype(np.float32)).to(pc.device) + pc[i, :, :] = torch.matmul(pc[i], R) + return pc + +class PointcloudScaleAndTranslate(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2., translate_range=0.2): + self.scale_low = scale_low + self.scale_high = scale_high + self.translate_range = translate_range + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + torch.from_numpy(xyz2).float().cuda() + + return pc + +class PointcloudJitter(object): + def __init__(self, std=0.01, clip=0.05): + self.std, self.clip = std, clip + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + jittered_data = pc.new(pc.size(1), 3).normal_( + mean=0.0, std=self.std + ).clamp_(-self.clip, self.clip) + pc[i, :, 0:3] += jittered_data + + return pc + +class PointcloudScale(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2.): + self.scale_low = scale_low + self.scale_high = scale_high + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + + return pc + +class PointcloudTranslate(object): + def __init__(self, translate_range=0.2): + self.translate_range = translate_range + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + + pc[i, :, 0:3] = pc[i, :, 0:3] + torch.from_numpy(xyz2).float().cuda() + + return pc + + +class PointcloudRandomInputDropout(object): + def __init__(self, max_dropout_ratio=0.5): + assert max_dropout_ratio >= 0 and max_dropout_ratio < 1 + self.max_dropout_ratio = max_dropout_ratio + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + dropout_ratio = np.random.random() * self.max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((pc.size()[1])) <= dropout_ratio)[0] + if len(drop_idx) > 0: + cur_pc = pc[i, :, :] + cur_pc[drop_idx.tolist(), 0:3] = cur_pc[0, 0:3].repeat(len(drop_idx), 1) # set to the first point + pc[i, :, :] = cur_pc + + return pc + +class RandomHorizontalFlip(object): + + + def __init__(self, upright_axis = 'z', is_temporal=False): + """ + upright_axis: axis index among x,y,z, i.e. 2 for z + """ + self.is_temporal = is_temporal + self.D = 4 if is_temporal else 3 + self.upright_axis = {'x': 0, 'y': 1, 'z': 2}[upright_axis.lower()] + # Use the rest of axes for flipping. + self.horz_axes = set(range(self.D)) - set([self.upright_axis]) + + + def __call__(self, coords): + bsize = coords.size()[0] + for i in range(bsize): + if random.random() < 0.95: + for curr_ax in self.horz_axes: + if random.random() < 0.5: + coord_max = torch.max(coords[i, :, curr_ax]) + coords[i, :, curr_ax] = coord_max - coords[i, :, curr_ax] + return coords \ No newline at end of file diff --git a/zoo/PointMAE/datasets/generate_few_shot_data.py b/zoo/PointMAE/datasets/generate_few_shot_data.py new file mode 100644 index 0000000..ad15664 --- /dev/null +++ b/zoo/PointMAE/datasets/generate_few_shot_data.py @@ -0,0 +1,76 @@ +import pickle +import numpy as np +import random +import os + +root = '../data/ModelNet/modelnet40_normal_resampled' +target = '../data/ModelNetFewshot' + +train_data_path = os.path.join(root, 'modelnet40_train_8192pts_fps.dat') +test_data_path = os.path.join(root, 'modelnet40_test_8192pts_fps.dat') +# train +with open(train_data_path, 'rb') as f: + train_list_of_points, train_list_of_labels = pickle.load(f) +with open(test_data_path, 'rb') as f: + test_list_of_points, test_list_of_labels = pickle.load(f) + +# list_of_points = train_list_of_points + test_list_of_points +# list_of_labels = train_list_of_labels + test_list_of_labels + +def generate_fewshot_data(way, shot, prefix_ind, eval_sample=20): + train_cls_dataset = {} + test_cls_dataset = {} + train_dataset = [] + test_dataset = [] + # build a dict containing different class + for point, label in zip(train_list_of_points, train_list_of_labels): + label = label[0] + if train_cls_dataset.get(label) is None: + train_cls_dataset[label] = [] + train_cls_dataset[label].append(point) + # build a dict containing different class + for point, label in zip(test_list_of_points, test_list_of_labels): + label = label[0] + if test_cls_dataset.get(label) is None: + test_cls_dataset[label] = [] + test_cls_dataset[label].append(point) + print(sum([train_cls_dataset[i].__len__() for i in range(40)])) + print(sum([test_cls_dataset[i].__len__() for i in range(40)])) + # import pdb; pdb.set_trace() + keys = list(train_cls_dataset.keys()) + random.shuffle(keys) + + for i, key in enumerate(keys[:way]): + train_data_list = train_cls_dataset[key] + random.shuffle(train_data_list) + assert len(train_data_list) > shot + for data in train_data_list[:shot]: + train_dataset.append((data, i, key)) + + test_data_list = test_cls_dataset[key] + random.shuffle(test_data_list) + # import pdb; pdb.set_trace() + assert len(test_data_list) >= eval_sample + for data in test_data_list[:eval_sample]: + test_dataset.append((data, i, key)) + + random.shuffle(train_dataset) + random.shuffle(test_dataset) + dataset = { + 'train': train_dataset, + 'test' : test_dataset + } + save_path = os.path.join(target, f'{way}way_{shot}shot') + if not os.path.exists(save_path): + os.makedirs(save_path) + with open(os.path.join(save_path, f'{prefix_ind}.pkl'), 'wb') as f: + pickle.dump(dataset, f) + + +if __name__ == '__main__': + ways = [5, 10] + shots = [10, 20] + for way in ways: + for shot in shots: + for i in range(10): + generate_fewshot_data(way = way, shot = shot, prefix_ind = i) \ No newline at end of file diff --git a/zoo/PointMAE/datasets/io.py b/zoo/PointMAE/datasets/io.py new file mode 100644 index 0000000..44ccb95 --- /dev/null +++ b/zoo/PointMAE/datasets/io.py @@ -0,0 +1,42 @@ +import h5py +import numpy as np +# import open3d +import os + +class IO: + @classmethod + def get(cls, file_path): + _, file_extension = os.path.splitext(file_path) + + if file_extension in ['.npy']: + return cls._read_npy(file_path) + # elif file_extension in ['.pcd']: + # return cls._read_pcd(file_path) + elif file_extension in ['.h5']: + return cls._read_h5(file_path) + elif file_extension in ['.txt']: + return cls._read_txt(file_path) + else: + raise Exception('Unsupported file extension: %s' % file_extension) + + # References: https://github.com/numpy/numpy/blob/master/numpy/lib/format.py + @classmethod + def _read_npy(cls, file_path): + return np.load(file_path) + + # References: https://github.com/dimatura/pypcd/blob/master/pypcd/pypcd.py#L275 + # Support PCD files without compression ONLY! + # @classmethod + # def _read_pcd(cls, file_path): + # pc = open3d.io.read_point_cloud(file_path) + # ptcloud = np.array(pc.points) + # return ptcloud + + @classmethod + def _read_txt(cls, file_path): + return np.loadtxt(file_path) + + @classmethod + def _read_h5(cls, file_path): + f = h5py.File(file_path, 'r') + return f['data'][()] \ No newline at end of file diff --git a/zoo/PointMAE/extensions/chamfer_dist/__init__.py b/zoo/PointMAE/extensions/chamfer_dist/__init__.py new file mode 100644 index 0000000..8b4f53c --- /dev/null +++ b/zoo/PointMAE/extensions/chamfer_dist/__init__.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# @Author: Thibault GROUEIX +# @Date: 2019-08-07 20:54:24 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2019-12-18 15:06:25 +# @Email: cshzxie@gmail.com + +import torch + +import chamfer + + +class ChamferFunction(torch.autograd.Function): + @staticmethod + def forward(ctx, xyz1, xyz2): + dist1, dist2, idx1, idx2 = chamfer.forward(xyz1, xyz2) + ctx.save_for_backward(xyz1, xyz2, idx1, idx2) + + return dist1, dist2 + + @staticmethod + def backward(ctx, grad_dist1, grad_dist2): + xyz1, xyz2, idx1, idx2 = ctx.saved_tensors + grad_xyz1, grad_xyz2 = chamfer.backward(xyz1, xyz2, idx1, idx2, grad_dist1, grad_dist2) + return grad_xyz1, grad_xyz2 + + +class ChamferDistanceL2(torch.nn.Module): + f''' Chamder Distance L2 + ''' + def __init__(self, ignore_zeros=False): + super().__init__() + self.ignore_zeros = ignore_zeros + + def forward(self, xyz1, xyz2): + batch_size = xyz1.size(0) + if batch_size == 1 and self.ignore_zeros: + non_zeros1 = torch.sum(xyz1, dim=2).ne(0) + non_zeros2 = torch.sum(xyz2, dim=2).ne(0) + xyz1 = xyz1[non_zeros1].unsqueeze(dim=0) + xyz2 = xyz2[non_zeros2].unsqueeze(dim=0) + + dist1, dist2 = ChamferFunction.apply(xyz1, xyz2) + return torch.mean(dist1) + torch.mean(dist2) + +class ChamferDistanceL2_split(torch.nn.Module): + f''' Chamder Distance L2 + ''' + def __init__(self, ignore_zeros=False): + super().__init__() + self.ignore_zeros = ignore_zeros + + def forward(self, xyz1, xyz2): + batch_size = xyz1.size(0) + if batch_size == 1 and self.ignore_zeros: + non_zeros1 = torch.sum(xyz1, dim=2).ne(0) + non_zeros2 = torch.sum(xyz2, dim=2).ne(0) + xyz1 = xyz1[non_zeros1].unsqueeze(dim=0) + xyz2 = xyz2[non_zeros2].unsqueeze(dim=0) + + dist1, dist2 = ChamferFunction.apply(xyz1, xyz2) + return torch.mean(dist1), torch.mean(dist2) + +class ChamferDistanceL1(torch.nn.Module): + f''' Chamder Distance L1 + ''' + def __init__(self, ignore_zeros=False): + super().__init__() + self.ignore_zeros = ignore_zeros + + def forward(self, xyz1, xyz2): + batch_size = xyz1.size(0) + if batch_size == 1 and self.ignore_zeros: + non_zeros1 = torch.sum(xyz1, dim=2).ne(0) + non_zeros2 = torch.sum(xyz2, dim=2).ne(0) + xyz1 = xyz1[non_zeros1].unsqueeze(dim=0) + xyz2 = xyz2[non_zeros2].unsqueeze(dim=0) + + dist1, dist2 = ChamferFunction.apply(xyz1, xyz2) + # import pdb + # pdb.set_trace() + dist1 = torch.sqrt(dist1) + dist2 = torch.sqrt(dist2) + return (torch.mean(dist1) + torch.mean(dist2))/2 + diff --git a/zoo/PointMAE/extensions/chamfer_dist/chamfer.cu b/zoo/PointMAE/extensions/chamfer_dist/chamfer.cu new file mode 100644 index 0000000..4bde058 --- /dev/null +++ b/zoo/PointMAE/extensions/chamfer_dist/chamfer.cu @@ -0,0 +1,229 @@ +/* + * @Author: Haozhe Xie + * @Date: 2019-08-07 20:54:24 + * @Last Modified by: Haozhe Xie + * @Last Modified time: 2020-06-17 14:58:55 + * @Email: cshzxie@gmail.com + */ + +#include +#include +#include + +#include + +__global__ void chamfer_dist_kernel(int batch_size, + int n, + const float* xyz1, + int m, + const float* xyz2, + float* dist, + int* indexes) { + const int batch = 512; + __shared__ float buf[batch * 3]; + for (int i = blockIdx.x; i < batch_size; i += gridDim.x) { + for (int k2 = 0; k2 < m; k2 += batch) { + int end_k = min(m, k2 + batch) - k2; + for (int j = threadIdx.x; j < end_k * 3; j += blockDim.x) { + buf[j] = xyz2[(i * m + k2) * 3 + j]; + } + __syncthreads(); + for (int j = threadIdx.x + blockIdx.y * blockDim.x; j < n; + j += blockDim.x * gridDim.y) { + float x1 = xyz1[(i * n + j) * 3 + 0]; + float y1 = xyz1[(i * n + j) * 3 + 1]; + float z1 = xyz1[(i * n + j) * 3 + 2]; + float best_dist = 0; + int best_dist_index = 0; + int end_ka = end_k - (end_k & 3); + if (end_ka == batch) { + for (int k = 0; k < batch; k += 4) { + { + float x2 = buf[k * 3 + 0] - x1; + float y2 = buf[k * 3 + 1] - y1; + float z2 = buf[k * 3 + 2] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + + if (k == 0 || dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2; + } + } + { + float x2 = buf[k * 3 + 3] - x1; + float y2 = buf[k * 3 + 4] - y1; + float z2 = buf[k * 3 + 5] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 1; + } + } + { + float x2 = buf[k * 3 + 6] - x1; + float y2 = buf[k * 3 + 7] - y1; + float z2 = buf[k * 3 + 8] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 2; + } + } + { + float x2 = buf[k * 3 + 9] - x1; + float y2 = buf[k * 3 + 10] - y1; + float z2 = buf[k * 3 + 11] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 3; + } + } + } + } else { + for (int k = 0; k < end_ka; k += 4) { + { + float x2 = buf[k * 3 + 0] - x1; + float y2 = buf[k * 3 + 1] - y1; + float z2 = buf[k * 3 + 2] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (k == 0 || dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2; + } + } + { + float x2 = buf[k * 3 + 3] - x1; + float y2 = buf[k * 3 + 4] - y1; + float z2 = buf[k * 3 + 5] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 1; + } + } + { + float x2 = buf[k * 3 + 6] - x1; + float y2 = buf[k * 3 + 7] - y1; + float z2 = buf[k * 3 + 8] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 2; + } + } + { + float x2 = buf[k * 3 + 9] - x1; + float y2 = buf[k * 3 + 10] - y1; + float z2 = buf[k * 3 + 11] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2 + 3; + } + } + } + } + for (int k = end_ka; k < end_k; k++) { + float x2 = buf[k * 3 + 0] - x1; + float y2 = buf[k * 3 + 1] - y1; + float z2 = buf[k * 3 + 2] - z1; + float dist = x2 * x2 + y2 * y2 + z2 * z2; + if (k == 0 || dist < best_dist) { + best_dist = dist; + best_dist_index = k + k2; + } + } + if (k2 == 0 || dist[(i * n + j)] > best_dist) { + dist[(i * n + j)] = best_dist; + indexes[(i * n + j)] = best_dist_index; + } + } + __syncthreads(); + } + } +} + +std::vector chamfer_cuda_forward(torch::Tensor xyz1, + torch::Tensor xyz2) { + const int batch_size = xyz1.size(0); + const int n = xyz1.size(1); // num_points point cloud A + const int m = xyz2.size(1); // num_points point cloud B + torch::Tensor dist1 = + torch::zeros({batch_size, n}, torch::CUDA(torch::kFloat)); + torch::Tensor dist2 = + torch::zeros({batch_size, m}, torch::CUDA(torch::kFloat)); + torch::Tensor idx1 = torch::zeros({batch_size, n}, torch::CUDA(torch::kInt)); + torch::Tensor idx2 = torch::zeros({batch_size, m}, torch::CUDA(torch::kInt)); + + chamfer_dist_kernel<<>>( + batch_size, n, xyz1.data_ptr(), m, xyz2.data_ptr(), + dist1.data_ptr(), idx1.data_ptr()); + chamfer_dist_kernel<<>>( + batch_size, m, xyz2.data_ptr(), n, xyz1.data_ptr(), + dist2.data_ptr(), idx2.data_ptr()); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("Error in chamfer_cuda_forward: %s\n", cudaGetErrorString(err)); + } + return {dist1, dist2, idx1, idx2}; +} + +__global__ void chamfer_dist_grad_kernel(int b, + int n, + const float* xyz1, + int m, + const float* xyz2, + const float* grad_dist1, + const int* idx1, + float* grad_xyz1, + float* grad_xyz2) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int j = threadIdx.x + blockIdx.y * blockDim.x; j < n; + j += blockDim.x * gridDim.y) { + float x1 = xyz1[(i * n + j) * 3 + 0]; + float y1 = xyz1[(i * n + j) * 3 + 1]; + float z1 = xyz1[(i * n + j) * 3 + 2]; + int j2 = idx1[i * n + j]; + float x2 = xyz2[(i * m + j2) * 3 + 0]; + float y2 = xyz2[(i * m + j2) * 3 + 1]; + float z2 = xyz2[(i * m + j2) * 3 + 2]; + float g = grad_dist1[i * n + j] * 2; + atomicAdd(&(grad_xyz1[(i * n + j) * 3 + 0]), g * (x1 - x2)); + atomicAdd(&(grad_xyz1[(i * n + j) * 3 + 1]), g * (y1 - y2)); + atomicAdd(&(grad_xyz1[(i * n + j) * 3 + 2]), g * (z1 - z2)); + atomicAdd(&(grad_xyz2[(i * m + j2) * 3 + 0]), -(g * (x1 - x2))); + atomicAdd(&(grad_xyz2[(i * m + j2) * 3 + 1]), -(g * (y1 - y2))); + atomicAdd(&(grad_xyz2[(i * m + j2) * 3 + 2]), -(g * (z1 - z2))); + } + } +} + +std::vector chamfer_cuda_backward(torch::Tensor xyz1, + torch::Tensor xyz2, + torch::Tensor idx1, + torch::Tensor idx2, + torch::Tensor grad_dist1, + torch::Tensor grad_dist2) { + const int batch_size = xyz1.size(0); + const int n = xyz1.size(1); // num_points point cloud A + const int m = xyz2.size(1); // num_points point cloud B + torch::Tensor grad_xyz1 = torch::zeros_like(xyz1, torch::CUDA(torch::kFloat)); + torch::Tensor grad_xyz2 = torch::zeros_like(xyz2, torch::CUDA(torch::kFloat)); + + chamfer_dist_grad_kernel<<>>( + batch_size, n, xyz1.data_ptr(), m, xyz2.data_ptr(), + grad_dist1.data_ptr(), idx1.data_ptr(), + grad_xyz1.data_ptr(), grad_xyz2.data_ptr()); + chamfer_dist_grad_kernel<<>>( + batch_size, m, xyz2.data_ptr(), n, xyz1.data_ptr(), + grad_dist2.data_ptr(), idx2.data_ptr(), + grad_xyz2.data_ptr(), grad_xyz1.data_ptr()); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("Error in chamfer_cuda_backward: %s\n", cudaGetErrorString(err)); + } + return {grad_xyz1, grad_xyz2}; +} diff --git a/zoo/PointMAE/extensions/chamfer_dist/chamfer_cuda.cpp b/zoo/PointMAE/extensions/chamfer_dist/chamfer_cuda.cpp new file mode 100644 index 0000000..9fca161 --- /dev/null +++ b/zoo/PointMAE/extensions/chamfer_dist/chamfer_cuda.cpp @@ -0,0 +1,39 @@ +/* + * @Author: Haozhe Xie + * @Date: 2019-08-07 20:54:24 + * @Last Modified by: Haozhe Xie + * @Last Modified time: 2019-12-10 10:33:50 + * @Email: cshzxie@gmail.com + */ + +#include +#include + +std::vector chamfer_cuda_forward(torch::Tensor xyz1, + torch::Tensor xyz2); + +std::vector chamfer_cuda_backward(torch::Tensor xyz1, + torch::Tensor xyz2, + torch::Tensor idx1, + torch::Tensor idx2, + torch::Tensor grad_dist1, + torch::Tensor grad_dist2); + +std::vector chamfer_forward(torch::Tensor xyz1, + torch::Tensor xyz2) { + return chamfer_cuda_forward(xyz1, xyz2); +} + +std::vector chamfer_backward(torch::Tensor xyz1, + torch::Tensor xyz2, + torch::Tensor idx1, + torch::Tensor idx2, + torch::Tensor grad_dist1, + torch::Tensor grad_dist2) { + return chamfer_cuda_backward(xyz1, xyz2, idx1, idx2, grad_dist1, grad_dist2); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &chamfer_forward, "Chamfer forward (CUDA)"); + m.def("backward", &chamfer_backward, "Chamfer backward (CUDA)"); +} diff --git a/zoo/PointMAE/extensions/chamfer_dist/setup.py b/zoo/PointMAE/extensions/chamfer_dist/setup.py new file mode 100644 index 0000000..04c6589 --- /dev/null +++ b/zoo/PointMAE/extensions/chamfer_dist/setup.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# @Author: Haozhe Xie +# @Date: 2019-08-07 20:54:24 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2019-12-10 10:04:25 +# @Email: cshzxie@gmail.com + +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + +setup(name='chamfer', + version='2.0.0', + ext_modules=[ + CUDAExtension('chamfer', [ + 'chamfer_cuda.cpp', + 'chamfer.cu', + ]), + ], + cmdclass={'build_ext': BuildExtension}) diff --git a/zoo/PointMAE/extensions/chamfer_dist/test.py b/zoo/PointMAE/extensions/chamfer_dist/test.py new file mode 100644 index 0000000..0ece5d2 --- /dev/null +++ b/zoo/PointMAE/extensions/chamfer_dist/test.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# @Author: Haozhe Xie +# @Date: 2019-12-10 10:38:01 +# @Last Modified by: Haozhe Xie +# @Last Modified time: 2019-12-26 14:21:36 +# @Email: cshzxie@gmail.com +# +# Note: +# - Replace float -> double, kFloat -> kDouble in chamfer.cu + +import os +import sys +import torch +import unittest + + +from torch.autograd import gradcheck + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))) +from extensions.chamfer_dist import ChamferFunction + + +class ChamferDistanceTestCase(unittest.TestCase): + def test_chamfer_dist(self): + x = torch.rand(4, 64, 3).double() + y = torch.rand(4, 128, 3).double() + x.requires_grad = True + y.requires_grad = True + print(gradcheck(ChamferFunction.apply, [x.cuda(), y.cuda()])) + + + +if __name__ == '__main__': + # unittest.main() + import pdb + x = torch.rand(32,128,3) + y = torch.rand(32,128,3) + pdb.set_trace() diff --git a/zoo/PointMAE/extensions/emd/.gitignore b/zoo/PointMAE/extensions/emd/.gitignore new file mode 100644 index 0000000..8400d00 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +build +dist +emd_ext.egg-info +*.so diff --git a/zoo/PointMAE/extensions/emd/README.md b/zoo/PointMAE/extensions/emd/README.md new file mode 100644 index 0000000..8165a45 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/README.md @@ -0,0 +1,31 @@ +# PyTorch Wrapper for Point-cloud Earth-Mover-Distance (EMD) + +## Dependency + +The code has been tested on Ubuntu 16.04, PyTorch 1.1.0, CUDA 9.0. + +## Usage + +First compile using + + python setup.py install + +Then, copy the lib file out to the main directory, + + cp build/lib.linux-x86_64-3.6/emd_cuda.cpython-36m-x86_64-linux-gnu.so . + +Then, you can use it by simply + + from emd import earth_mover_distance + d = earth_mover_distance(p1, p2, transpose=False) # p1: B x N1 x 3, p2: B x N2 x 3 + +Check `test_emd_loss.py` for example. + +## Author + +The cuda code is originally written by Haoqiang Fan. The PyTorch wrapper is written by Kaichun Mo. Also, Jiayuan Gu provided helps. + +## License + +MIT + diff --git a/zoo/PointMAE/extensions/emd/__init__.py b/zoo/PointMAE/extensions/emd/__init__.py new file mode 100644 index 0000000..430da75 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/__init__.py @@ -0,0 +1,3 @@ +from .emd import earth_mover_distance as emd + +__all__ = ['emd'] \ No newline at end of file diff --git a/zoo/PointMAE/extensions/emd/cuda/emd.cpp b/zoo/PointMAE/extensions/emd/cuda/emd.cpp new file mode 100644 index 0000000..b94db14 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/cuda/emd.cpp @@ -0,0 +1,29 @@ +#ifndef _EMD +#define _EMD + +#include +#include + +//CUDA declarations +at::Tensor ApproxMatchForward( + const at::Tensor xyz1, + const at::Tensor xyz2); + +at::Tensor MatchCostForward( + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match); + +std::vector MatchCostBackward( + const at::Tensor grad_cost, + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match); + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("approxmatch_forward", &ApproxMatchForward,"ApproxMatch forward (CUDA)"); + m.def("matchcost_forward", &MatchCostForward,"MatchCost forward (CUDA)"); + m.def("matchcost_backward", &MatchCostBackward,"MatchCost backward (CUDA)"); +} + +#endif diff --git a/zoo/PointMAE/extensions/emd/cuda/emd_kernel.cu b/zoo/PointMAE/extensions/emd/cuda/emd_kernel.cu new file mode 100644 index 0000000..4744a81 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/cuda/emd_kernel.cu @@ -0,0 +1,400 @@ +/********************************** + * Original Author: Haoqiang Fan + * Modified by: Kaichun Mo + *********************************/ + +#ifndef _EMD_KERNEL +#define _EMD_KERNEL + +#include +#include + +#include +#include // at::cuda::getApplyGrid +#include + +#define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous") +#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) + + +/******************************** +* Forward kernel for approxmatch +*********************************/ + +template +__global__ void approxmatch(int b,int n,int m,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,scalar_t * __restrict__ match,scalar_t * temp){ + scalar_t * remainL=temp+blockIdx.x*(n+m)*2, * remainR=temp+blockIdx.x*(n+m)*2+n,*ratioL=temp+blockIdx.x*(n+m)*2+n+m,*ratioR=temp+blockIdx.x*(n+m)*2+n+m+n; + scalar_t multiL,multiR; + if (n>=m){ + multiL=1; + multiR=n/m; + }else{ + multiL=m/n; + multiR=1; + } + const int Block=1024; + __shared__ scalar_t buf[Block*4]; + for (int i=blockIdx.x;i=-2;j--){ + scalar_t level=-powf(4.0f,j); + if (j==-2){ + level=0; + } + for (int k0=0;k0>>(b,n,m,xyz1,xyz2,match,temp); +//} + +/* ApproxMatch forward interface +Input: + xyz1: (B, N1, 3) # dataset_points + xyz2: (B, N2, 3) # query_points +Output: + match: (B, N2, N1) +*/ +at::Tensor ApproxMatchForward( + const at::Tensor xyz1, + const at::Tensor xyz2){ + const auto b = xyz1.size(0); + const auto n = xyz1.size(1); + const auto m = xyz2.size(1); + + CHECK_EQ(xyz2.size(0), b); + CHECK_EQ(xyz1.size(2), 3); + CHECK_EQ(xyz2.size(2), 3); + CHECK_INPUT(xyz1); + CHECK_INPUT(xyz2); + + auto match = at::zeros({b, m, n}, xyz1.type()); + auto temp = at::zeros({b, (n+m)*2}, xyz1.type()); + + AT_DISPATCH_FLOATING_TYPES(xyz1.scalar_type(), "ApproxMatchForward", ([&] { + approxmatch<<<32,512>>>(b, n, m, xyz1.data(), xyz2.data(), match.data(), temp.data()); + })); + THCudaCheck(cudaGetLastError()); + + return match; +} + + +/******************************** +* Forward kernel for matchcost +*********************************/ + +template +__global__ void matchcost(int b,int n,int m,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,const scalar_t * __restrict__ match,scalar_t * __restrict__ out){ + __shared__ scalar_t allsum[512]; + const int Block=1024; + __shared__ scalar_t buf[Block*3]; + for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,out); +//} + +/* MatchCost forward interface +Input: + xyz1: (B, N1, 3) # dataset_points + xyz2: (B, N2, 3) # query_points + match: (B, N2, N1) +Output: + cost: (B) +*/ +at::Tensor MatchCostForward( + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match){ + const auto b = xyz1.size(0); + const auto n = xyz1.size(1); + const auto m = xyz2.size(1); + + CHECK_EQ(xyz2.size(0), b); + CHECK_EQ(xyz1.size(2), 3); + CHECK_EQ(xyz2.size(2), 3); + CHECK_INPUT(xyz1); + CHECK_INPUT(xyz2); + + auto cost = at::zeros({b}, xyz1.type()); + + AT_DISPATCH_FLOATING_TYPES(xyz1.scalar_type(), "MatchCostForward", ([&] { + matchcost<<<32,512>>>(b, n, m, xyz1.data(), xyz2.data(), match.data(), cost.data()); + })); + THCudaCheck(cudaGetLastError()); + + return cost; +} + + +/******************************** +* matchcostgrad2 kernel +*********************************/ + +template +__global__ void matchcostgrad2(int b,int n,int m,const scalar_t * __restrict__ grad_cost,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,const scalar_t * __restrict__ match,scalar_t * __restrict__ grad2){ + __shared__ scalar_t sum_grad[256*3]; + for (int i=blockIdx.x;i +__global__ void matchcostgrad1(int b,int n,int m,const scalar_t * __restrict__ grad_cost,const scalar_t * __restrict__ xyz1,const scalar_t * __restrict__ xyz2,const scalar_t * __restrict__ match,scalar_t * __restrict__ grad1){ + for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,grad1); +// matchcostgrad2<<>>(b,n,m,xyz1,xyz2,match,grad2); +//} + + +/* MatchCost backward interface +Input: + grad_cost: (B) # gradients on cost + xyz1: (B, N1, 3) # dataset_points + xyz2: (B, N2, 3) # query_points + match: (B, N2, N1) +Output: + grad1: (B, N1, 3) + grad2: (B, N2, 3) +*/ +std::vector MatchCostBackward( + const at::Tensor grad_cost, + const at::Tensor xyz1, + const at::Tensor xyz2, + const at::Tensor match){ + const auto b = xyz1.size(0); + const auto n = xyz1.size(1); + const auto m = xyz2.size(1); + + CHECK_EQ(xyz2.size(0), b); + CHECK_EQ(xyz1.size(2), 3); + CHECK_EQ(xyz2.size(2), 3); + CHECK_INPUT(xyz1); + CHECK_INPUT(xyz2); + + auto grad1 = at::zeros({b, n, 3}, xyz1.type()); + auto grad2 = at::zeros({b, m, 3}, xyz1.type()); + + AT_DISPATCH_FLOATING_TYPES(xyz1.scalar_type(), "MatchCostBackward", ([&] { + matchcostgrad1<<<32,512>>>(b, n, m, grad_cost.data(), xyz1.data(), xyz2.data(), match.data(), grad1.data()); + matchcostgrad2<<>>(b, n, m, grad_cost.data(), xyz1.data(), xyz2.data(), match.data(), grad2.data()); + })); + THCudaCheck(cudaGetLastError()); + + return std::vector({grad1, grad2}); +} + +#endif diff --git a/zoo/PointMAE/extensions/emd/emd.py b/zoo/PointMAE/extensions/emd/emd.py new file mode 100644 index 0000000..1776306 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/emd.py @@ -0,0 +1,72 @@ +import torch +import emd_cuda + + +class EarthMoverDistanceFunction(torch.autograd.Function): + @staticmethod + def forward(ctx, xyz1, xyz2): + xyz1 = xyz1.contiguous() + xyz2 = xyz2.contiguous() + assert xyz1.is_cuda and xyz2.is_cuda, "Only support cuda currently." + match = emd_cuda.approxmatch_forward(xyz1, xyz2) + cost = emd_cuda.matchcost_forward(xyz1, xyz2, match) + ctx.save_for_backward(xyz1, xyz2, match) + return cost + + @staticmethod + def backward(ctx, grad_cost): + xyz1, xyz2, match = ctx.saved_tensors + grad_cost = grad_cost.contiguous() + grad_xyz1, grad_xyz2 = emd_cuda.matchcost_backward(grad_cost, xyz1, xyz2, match) + return grad_xyz1, grad_xyz2 + + + + +class earth_mover_distance(torch.nn.Module): + f''' emd + ''' + def __init__(self): + super().__init__() + + def forward(self, xyz1, xyz2, transpose=False): + """Earth Mover Distance (Approx) + + Args: + xyz1 (torch.Tensor): (b, n1, 3) + xyz2 (torch.Tensor): (b, n2, 3) + transpose (bool): whether to transpose inputs as it might be BCN format. + Extensions only support BNC format. + + Returns: + cost (torch.Tensor): (b) + + """ + + cost = EarthMoverDistanceFunction.apply(xyz1, xyz2) + cost = cost / xyz1.size(1) + + return cost.mean() +# def earth_mover_distance(xyz1, xyz2, transpose=True): +# """Earth Mover Distance (Approx) + +# Args: +# xyz1 (torch.Tensor): (b, 3, n1) +# xyz2 (torch.Tensor): (b, 3, n1) +# transpose (bool): whether to transpose inputs as it might be BCN format. +# Extensions only support BNC format. + +# Returns: +# cost (torch.Tensor): (b) + +# """ +# if xyz1.dim() == 2: +# xyz1 = xyz1.unsqueeze(0) +# if xyz2.dim() == 2: +# xyz2 = xyz2.unsqueeze(0) +# if transpose: +# xyz1 = xyz1.transpose(1, 2) +# xyz2 = xyz2.transpose(1, 2) +# cost = EarthMoverDistanceFunction.apply(xyz1, xyz2) +# return cost + diff --git a/zoo/PointMAE/extensions/emd/setup.py b/zoo/PointMAE/extensions/emd/setup.py new file mode 100644 index 0000000..f648c3e --- /dev/null +++ b/zoo/PointMAE/extensions/emd/setup.py @@ -0,0 +1,27 @@ +"""Setup extension + +Notes: + If extra_compile_args is provided, you need to provide different instances for different extensions. + Refer to https://github.com/pytorch/pytorch/issues/20169 + +""" + +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + + +setup( + name='emd_ext', + ext_modules=[ + CUDAExtension( + name='emd_cuda', + sources=[ + 'cuda/emd.cpp', + 'cuda/emd_kernel.cu', + ], + extra_compile_args={'cxx': ['-g'], 'nvcc': ['-O2']} + ), + ], + cmdclass={ + 'build_ext': BuildExtension + }) diff --git a/zoo/PointMAE/extensions/emd/test_emd_loss.py b/zoo/PointMAE/extensions/emd/test_emd_loss.py new file mode 100644 index 0000000..20dfa02 --- /dev/null +++ b/zoo/PointMAE/extensions/emd/test_emd_loss.py @@ -0,0 +1,45 @@ +import torch +import numpy as np +import time +from emd import earth_mover_distance + +# gt +p1 = torch.from_numpy(np.array([[[1.7, -0.1, 0.1], [0.1, 1.2, 0.3]]], dtype=np.float32)).cuda() +p1 = p1.repeat(3, 1, 1) +p2 = torch.from_numpy(np.array([[[0.3, 1.8, 0.2], [1.2, -0.2, 0.3]]], dtype=np.float32)).cuda() +p2 = p2.repeat(3, 1, 1) +print(p1) +print(p2) +print(p1.shape) +p1.requires_grad = True +p2.requires_grad = True + +gt_dist = (((p1[0, 0] - p2[0, 1])**2).sum() + ((p1[0, 1] - p2[0, 0])**2).sum()) / 2 + \ + (((p1[1, 0] - p2[1, 1])**2).sum() + ((p1[1, 1] - p2[1, 0])**2).sum()) * 2 + \ + (((p1[2, 0] - p2[2, 1])**2).sum() + ((p1[2, 1] - p2[2, 0])**2).sum()) / 3 +print('gt_dist: ', gt_dist) + +gt_dist.backward() +print(p1.grad) +print(p2.grad) + +# emd +p1 = torch.from_numpy(np.array([[[1.7, -0.1, 0.1], [0.1, 1.2, 0.3]]], dtype=np.float32)).cuda() +p1 = p1.repeat(3, 1, 1) +p2 = torch.from_numpy(np.array([[[0.3, 1.8, 0.2], [1.2, -0.2, 0.3]]], dtype=np.float32)).cuda() +p2 = p2.repeat(3, 1, 1) +print(p1) +print(p2) +p1.requires_grad = True +p2.requires_grad = True + +d = earth_mover_distance(p1, p2, transpose=False) +print(d) + +loss = d[0] / 2 + d[1] * 2 + d[2] / 3 +print(loss) + +loss.backward() +print(p1.grad) +print(p2.grad) + diff --git a/zoo/PointMAE/figure/net.jpg b/zoo/PointMAE/figure/net.jpg new file mode 100644 index 0000000..cec224a Binary files /dev/null and b/zoo/PointMAE/figure/net.jpg differ diff --git a/zoo/PointMAE/figure/vvv.jpg b/zoo/PointMAE/figure/vvv.jpg new file mode 100644 index 0000000..18e324f Binary files /dev/null and b/zoo/PointMAE/figure/vvv.jpg differ diff --git a/zoo/PointMAE/main.py b/zoo/PointMAE/main.py new file mode 100644 index 0000000..509eca7 --- /dev/null +++ b/zoo/PointMAE/main.py @@ -0,0 +1,90 @@ +from tools import pretrain_run_net as pretrain +from tools import finetune_run_net as finetune +from tools import test_run_net as test_net +from utils import parser, dist_utils, misc +from utils.logger import * +from utils.config import * +import time +import os +import torch +from tensorboardX import SummaryWriter + +def main(): + # args + args = parser.get_args() + # CUDA + args.use_gpu = torch.cuda.is_available() + if args.use_gpu: + torch.backends.cudnn.benchmark = True + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + args.distributed = False + else: + args.distributed = True + dist_utils.init_dist(args.launcher) + # re-set gpu_ids with distributed training mode + _, world_size = dist_utils.get_dist_info() + args.world_size = world_size + # logger + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = os.path.join(args.experiment_path, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, name=args.log_name) + # define the tensorboard writer + if not args.test: + if args.local_rank == 0: + train_writer = SummaryWriter(os.path.join(args.tfboard_path, 'train')) + val_writer = SummaryWriter(os.path.join(args.tfboard_path, 'test')) + else: + train_writer = None + val_writer = None + # config + config = get_config(args, logger = logger) + # batch size + if args.distributed: + assert config.total_bs % world_size == 0 + config.dataset.train.others.bs = config.total_bs // world_size + if config.dataset.get('extra_train'): + config.dataset.extra_train.others.bs = config.total_bs // world_size * 2 + config.dataset.val.others.bs = config.total_bs // world_size * 2 + if config.dataset.get('test'): + config.dataset.test.others.bs = config.total_bs // world_size + else: + config.dataset.train.others.bs = config.total_bs + if config.dataset.get('extra_train'): + config.dataset.extra_train.others.bs = config.total_bs * 2 + config.dataset.val.others.bs = config.total_bs * 2 + if config.dataset.get('test'): + config.dataset.test.others.bs = config.total_bs + # log + log_args_to_file(args, 'args', logger = logger) + log_config_to_file(config, 'config', logger = logger) + # exit() + logger.info(f'Distributed training: {args.distributed}') + # set random seeds + if args.seed is not None: + logger.info(f'Set random seed to {args.seed}, ' + f'deterministic: {args.deterministic}') + misc.set_random_seed(args.seed + args.local_rank, deterministic=args.deterministic) # seed + rank, for augmentation + if args.distributed: + assert args.local_rank == torch.distributed.get_rank() + + if args.shot != -1: + config.dataset.train.others.shot = args.shot + config.dataset.train.others.way = args.way + config.dataset.train.others.fold = args.fold + config.dataset.val.others.shot = args.shot + config.dataset.val.others.way = args.way + config.dataset.val.others.fold = args.fold + + # run + if args.test: + test_net(args, config) + else: + if args.finetune_model or args.scratch_model: + finetune(args, config, train_writer, val_writer) + else: + pretrain(args, config, train_writer, val_writer) + + +if __name__ == '__main__': + main() diff --git a/zoo/PointMAE/main_vis.py b/zoo/PointMAE/main_vis.py new file mode 100644 index 0000000..cd097a4 --- /dev/null +++ b/zoo/PointMAE/main_vis.py @@ -0,0 +1,73 @@ +# from tools import run_net +from tools import test_net +from utils import parser, dist_utils, misc +from utils.logger import * +from utils.config import * +import time +import os +import torch +from tensorboardX import SummaryWriter + +def main(): + # args + args = parser.get_args() + # CUDA + args.use_gpu = torch.cuda.is_available() + if args.use_gpu: + torch.backends.cudnn.benchmark = True + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + args.distributed = False + else: + args.distributed = True + dist_utils.init_dist(args.launcher) + # re-set gpu_ids with distributed training mode + _, world_size = dist_utils.get_dist_info() + args.world_size = world_size + # logger + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = os.path.join(args.experiment_path, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, name=args.log_name) + # define the tensorboard writer + if not args.test: + if args.local_rank == 0: + train_writer = SummaryWriter(os.path.join(args.tfboard_path, 'train')) + val_writer = SummaryWriter(os.path.join(args.tfboard_path, 'test')) + else: + train_writer = None + val_writer = None + # config + config = get_config(args, logger = logger) + # batch size + if args.distributed: + assert config.total_bs % world_size == 0 + config.dataset.train.others.bs = config.total_bs // world_size + config.dataset.val.others.bs = 1 + config.dataset.test.others.bs = 1 + else: + config.dataset.train.others.bs = config.total_bs + config.dataset.val.others.bs = 1 + config.dataset.test.others.bs = 1 + # log + log_args_to_file(args, 'args', logger = logger) + log_config_to_file(config, 'config', logger = logger) + # exit() + logger.info(f'Distributed training: {args.distributed}') + # set random seeds + if args.seed is not None: + logger.info(f'Set random seed to {args.seed}, ' + f'deterministic: {args.deterministic}') + misc.set_random_seed(args.seed + args.local_rank, deterministic=args.deterministic) # seed + rank, for augmentation + if args.distributed: + assert args.local_rank == torch.distributed.get_rank() + + # run + if args.test: + test_net(args, config) + else: + # run_net(args, config, train_writer, val_writer) + raise NotImplementedError + + +if __name__ == '__main__': + main() diff --git a/zoo/PointMAE/models/Point_MAE.py b/zoo/PointMAE/models/Point_MAE.py new file mode 100644 index 0000000..21de0fb --- /dev/null +++ b/zoo/PointMAE/models/Point_MAE.py @@ -0,0 +1,548 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import timm +from timm.models.layers import DropPath, trunc_normal_ +import numpy as np +from .build import MODELS +from utils import misc +from utils.checkpoint import get_missing_parameters_message, get_unexpected_parameters_message +from utils.logger import * +import random +from knn_cuda import KNN +from extensions.chamfer_dist import ChamferDistanceL1, ChamferDistanceL2 + + +class Encoder(nn.Module): ## Embedding module + def __init__(self, encoder_channel): + super().__init__() + self.encoder_channel = encoder_channel + self.first_conv = nn.Sequential( + nn.Conv1d(3, 128, 1), + nn.BatchNorm1d(128), + nn.ReLU(inplace=True), + nn.Conv1d(128, 256, 1) + ) + self.second_conv = nn.Sequential( + nn.Conv1d(512, 512, 1), + nn.BatchNorm1d(512), + nn.ReLU(inplace=True), + nn.Conv1d(512, self.encoder_channel, 1) + ) + + def forward(self, point_groups): + ''' + point_groups : B G N 3 + ----------------- + feature_global : B G C + ''' + bs, g, n , _ = point_groups.shape + point_groups = point_groups.reshape(bs * g, n, 3) + # encoder + feature = self.first_conv(point_groups.transpose(2,1)) # BG 256 n + feature_global = torch.max(feature,dim=2,keepdim=True)[0] # BG 256 1 + feature = torch.cat([feature_global.expand(-1,-1,n), feature], dim=1)# BG 512 n + feature = self.second_conv(feature) # BG 1024 n + feature_global = torch.max(feature, dim=2, keepdim=False)[0] # BG 1024 + return feature_global.reshape(bs, g, self.encoder_channel) + + +class Group(nn.Module): # FPS + KNN + def __init__(self, num_group, group_size): + super().__init__() + self.num_group = num_group + self.group_size = group_size + self.knn = KNN(k=self.group_size, transpose_mode=True) + + def forward(self, xyz): + ''' + input: B N 3 + --------------------------- + output: B G M 3 + center : B G 3 + ''' + batch_size, num_points, _ = xyz.shape + # fps the centers out + center = misc.fps(xyz, self.num_group) # B G 3 + # knn to get the neighborhood + _, idx = self.knn(xyz, center) # B G M + assert idx.size(1) == self.num_group + assert idx.size(2) == self.group_size + idx_base = torch.arange(0, batch_size, device=xyz.device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.view(-1) + neighborhood = xyz.view(batch_size * num_points, -1)[idx, :] + neighborhood = neighborhood.view(batch_size, self.num_group, self.group_size, 3).contiguous() + # normalize + neighborhood = neighborhood - center.unsqueeze(2) + return neighborhood, center + + +## Transformers +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + 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] # make torchscript happy (cannot use tensor as tuple) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + 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 + + +class Block(nn.Module): + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class TransformerEncoder(nn.Module): + def __init__(self, embed_dim=768, depth=4, num_heads=12, mlp_ratio=4., qkv_bias=False, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.): + super().__init__() + + self.blocks = nn.ModuleList([ + Block( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path = drop_path_rate[i] if isinstance(drop_path_rate, list) else drop_path_rate + ) + for i in range(depth)]) + + def forward(self, x, pos): + for _, block in enumerate(self.blocks): + x = block(x + pos) + return x + + +class TransformerDecoder(nn.Module): + def __init__(self, embed_dim=384, depth=4, num_heads=6, mlp_ratio=4., qkv_bias=False, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.1, norm_layer=nn.LayerNorm): + super().__init__() + self.blocks = nn.ModuleList([ + Block( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path=drop_path_rate[i] if isinstance(drop_path_rate, list) else drop_path_rate + ) + for i in range(depth)]) + self.norm = norm_layer(embed_dim) + self.head = nn.Identity() + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + nn.init.xavier_uniform_(m.weight) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + def forward(self, x, pos, return_token_num): + for _, block in enumerate(self.blocks): + x = block(x + pos) + + x = self.head(self.norm(x[:, -return_token_num:])) # only return the mask tokens predict pixel + return x + + +# Pretrain model +class MaskTransformer(nn.Module): + def __init__(self, config, **kwargs): + super().__init__() + self.config = config + # define the transformer argparse + self.mask_ratio = config.transformer_config.mask_ratio + self.trans_dim = config.transformer_config.trans_dim + self.depth = config.transformer_config.depth + self.drop_path_rate = config.transformer_config.drop_path_rate + self.num_heads = config.transformer_config.num_heads + print_log(f'[args] {config.transformer_config}', logger = 'Transformer') + # embedding + self.encoder_dims = config.transformer_config.encoder_dims + self.encoder = Encoder(encoder_channel = self.encoder_dims) + + self.mask_type = config.transformer_config.mask_type + + self.pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim), + ) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] + self.blocks = TransformerEncoder( + embed_dim = self.trans_dim, + depth = self.depth, + drop_path_rate = dpr, + num_heads = self.num_heads, + ) + + self.norm = nn.LayerNorm(self.trans_dim) + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv1d): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + def _mask_center_block(self, center, noaug=False): + ''' + center : B G 3 + -------------- + mask : B G (bool) + ''' + # skip the mask + if noaug or self.mask_ratio == 0: + return torch.zeros(center.shape[:2]).bool() + # mask a continuous part + mask_idx = [] + for points in center: + # G 3 + points = points.unsqueeze(0) # 1 G 3 + index = random.randint(0, points.size(1) - 1) + distance_matrix = torch.norm(points[:, index].reshape(1, 1, 3) - points, p=2, + dim=-1) # 1 1 3 - 1 G 3 -> 1 G + + idx = torch.argsort(distance_matrix, dim=-1, descending=False)[0] # G + ratio = self.mask_ratio + mask_num = int(ratio * len(idx)) + mask = torch.zeros(len(idx)) + mask[idx[:mask_num]] = 1 + mask_idx.append(mask.bool()) + + bool_masked_pos = torch.stack(mask_idx).to(center.device) # B G + + return bool_masked_pos + + def _mask_center_rand(self, center, noaug = False): + ''' + center : B G 3 + -------------- + mask : B G (bool) + ''' + B, G, _ = center.shape + # skip the mask + if noaug or self.mask_ratio == 0: + return torch.zeros(center.shape[:2]).bool() + + self.num_mask = int(self.mask_ratio * G) + + overall_mask = np.zeros([B, G]) + for i in range(B): + mask = np.hstack([ + np.zeros(G-self.num_mask), + np.ones(self.num_mask), + ]) + np.random.shuffle(mask) + overall_mask[i, :] = mask + overall_mask = torch.from_numpy(overall_mask).to(torch.bool) + + return overall_mask.to(center.device) # B G + + def forward(self, neighborhood, center, noaug = False): + # generate mask + if self.mask_type == 'rand': + bool_masked_pos = self._mask_center_rand(center, noaug = noaug) # B G + else: + bool_masked_pos = self._mask_center_block(center, noaug = noaug) + + group_input_tokens = self.encoder(neighborhood) # B G C + + batch_size, seq_len, C = group_input_tokens.size() + + x_vis = group_input_tokens[~bool_masked_pos].reshape(batch_size, -1, C) + # add pos embedding + # mask pos center + masked_center = center[~bool_masked_pos].reshape(batch_size, -1, 3) + pos = self.pos_embed(masked_center) + + # transformer + x_vis = self.blocks(x_vis, pos) + x_vis = self.norm(x_vis) + + return x_vis, bool_masked_pos + + +@MODELS.register_module() +class Point_MAE(nn.Module): + def __init__(self, config): + super().__init__() + print_log(f'[Point_MAE] ', logger ='Point_MAE') + self.config = config + self.trans_dim = config.transformer_config.trans_dim + self.MAE_encoder = MaskTransformer(config) + self.group_size = config.group_size + self.num_group = config.num_group + self.drop_path_rate = config.transformer_config.drop_path_rate + self.mask_token = nn.Parameter(torch.zeros(1, 1, self.trans_dim)) + self.decoder_pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim) + ) + + self.decoder_depth = config.transformer_config.decoder_depth + self.decoder_num_heads = config.transformer_config.decoder_num_heads + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.decoder_depth)] + self.MAE_decoder = TransformerDecoder( + embed_dim=self.trans_dim, + depth=self.decoder_depth, + drop_path_rate=dpr, + num_heads=self.decoder_num_heads, + ) + + print_log(f'[Point_MAE] divide point cloud into G{self.num_group} x S{self.group_size} points ...', logger ='Point_MAE') + self.group_divider = Group(num_group = self.num_group, group_size = self.group_size) + + # prediction head + self.increase_dim = nn.Sequential( + # nn.Conv1d(self.trans_dim, 1024, 1), + # nn.BatchNorm1d(1024), + # nn.LeakyReLU(negative_slope=0.2), + nn.Conv1d(self.trans_dim, 3*self.group_size, 1) + ) + + trunc_normal_(self.mask_token, std=.02) + self.loss = config.loss + # loss + self.build_loss_func(self.loss) + + def build_loss_func(self, loss_type): + if loss_type == "cdl1": + self.loss_func = ChamferDistanceL1().cuda() + elif loss_type =='cdl2': + self.loss_func = ChamferDistanceL2().cuda() + else: + raise NotImplementedError + # self.loss_func = emd().cuda() + + + def forward(self, pts, vis = False, **kwargs): + neighborhood, center = self.group_divider(pts) + + x_vis, mask = self.MAE_encoder(neighborhood, center) + B,_,C = x_vis.shape # B VIS C + + pos_emd_vis = self.decoder_pos_embed(center[~mask]).reshape(B, -1, C) + + pos_emd_mask = self.decoder_pos_embed(center[mask]).reshape(B, -1, C) + + _,N,_ = pos_emd_mask.shape + mask_token = self.mask_token.expand(B, N, -1) + x_full = torch.cat([x_vis, mask_token], dim=1) + pos_full = torch.cat([pos_emd_vis, pos_emd_mask], dim=1) + + x_rec = self.MAE_decoder(x_full, pos_full, N) + + B, M, C = x_rec.shape + rebuild_points = self.increase_dim(x_rec.transpose(1, 2)).transpose(1, 2).reshape(B * M, -1, 3) # B M 1024 + + gt_points = neighborhood[mask].reshape(B*M,-1,3) + loss1 = self.loss_func(rebuild_points, gt_points) + + if vis: #visualization + vis_points = neighborhood[~mask].reshape(B * (self.num_group - M), -1, 3) + full_vis = vis_points + center[~mask].unsqueeze(1) + full_rebuild = rebuild_points + center[mask].unsqueeze(1) + full = torch.cat([full_vis, full_rebuild], dim=0) + # full_points = torch.cat([rebuild_points,vis_points], dim=0) + full_center = torch.cat([center[mask], center[~mask]], dim=0) + # full = full_points + full_center.unsqueeze(1) + ret2 = full_vis.reshape(-1, 3).unsqueeze(0) + ret1 = full.reshape(-1, 3).unsqueeze(0) + # return ret1, ret2 + return ret1, ret2, full_center + else: + return loss1 + +# finetune model +@MODELS.register_module() +class PointTransformer(nn.Module): + def __init__(self, config, **kwargs): + super().__init__() + self.config = config + + self.trans_dim = config.trans_dim + self.depth = config.depth + self.drop_path_rate = config.drop_path_rate + self.cls_dim = config.cls_dim + self.num_heads = config.num_heads + + self.group_size = config.group_size + self.num_group = config.num_group + self.encoder_dims = config.encoder_dims + + self.group_divider = Group(num_group=self.num_group, group_size=self.group_size) + + self.encoder = Encoder(encoder_channel=self.encoder_dims) + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.trans_dim)) + self.cls_pos = nn.Parameter(torch.randn(1, 1, self.trans_dim)) + + self.pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim) + ) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] + self.blocks = TransformerEncoder( + embed_dim=self.trans_dim, + depth=self.depth, + drop_path_rate=dpr, + num_heads=self.num_heads, + ) + + self.norm = nn.LayerNorm(self.trans_dim) + + self.cls_head_finetune = nn.Sequential( + nn.Linear(self.trans_dim * 2, 256), + nn.BatchNorm1d(256), + nn.ReLU(inplace=True), + nn.Dropout(0.5), + nn.Linear(256, 256), + nn.BatchNorm1d(256), + nn.ReLU(inplace=True), + nn.Dropout(0.5), + nn.Linear(256, self.cls_dim) + ) + + self.build_loss_func() + + trunc_normal_(self.cls_token, std=.02) + trunc_normal_(self.cls_pos, std=.02) + + def build_loss_func(self): + self.loss_ce = nn.CrossEntropyLoss() + + def get_loss_acc(self, ret, gt): + loss = self.loss_ce(ret, gt.long()) + pred = ret.argmax(-1) + acc = (pred == gt).sum() / float(gt.size(0)) + return loss, acc * 100 + + def load_model_from_ckpt(self, bert_ckpt_path): + if bert_ckpt_path is not None: + ckpt = torch.load(bert_ckpt_path) + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + + for k in list(base_ckpt.keys()): + if k.startswith('MAE_encoder') : + base_ckpt[k[len('MAE_encoder.'):]] = base_ckpt[k] + del base_ckpt[k] + elif k.startswith('base_model'): + base_ckpt[k[len('base_model.'):]] = base_ckpt[k] + del base_ckpt[k] + + incompatible = self.load_state_dict(base_ckpt, strict=False) + + if incompatible.missing_keys: + print_log('missing_keys', logger='Transformer') + print_log( + get_missing_parameters_message(incompatible.missing_keys), + logger='Transformer' + ) + if incompatible.unexpected_keys: + print_log('unexpected_keys', logger='Transformer') + print_log( + get_unexpected_parameters_message(incompatible.unexpected_keys), + logger='Transformer' + ) + + print_log(f'[Transformer] Successful Loading the ckpt from {bert_ckpt_path}', logger='Transformer') + else: + print_log('Training from scratch!!!', logger='Transformer') + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv1d): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + def forward(self, pts): + + neighborhood, center = self.group_divider(pts) + group_input_tokens = self.encoder(neighborhood) # B G N + + cls_tokens = self.cls_token.expand(group_input_tokens.size(0), -1, -1) + cls_pos = self.cls_pos.expand(group_input_tokens.size(0), -1, -1) + + pos = self.pos_embed(center) + + x = torch.cat((cls_tokens, group_input_tokens), dim=1) + pos = torch.cat((cls_pos, pos), dim=1) + # transformer + x = self.blocks(x, pos) + x = self.norm(x) + concat_f = torch.cat([x[:, 0], x[:, 1:].max(1)[0]], dim=-1) + ret = self.cls_head_finetune(concat_f) + return ret diff --git a/zoo/PointMAE/models/__init__.py b/zoo/PointMAE/models/__init__.py new file mode 100644 index 0000000..1027cf7 --- /dev/null +++ b/zoo/PointMAE/models/__init__.py @@ -0,0 +1,2 @@ +from .build import build_model_from_cfg +import models.Point_MAE \ No newline at end of file diff --git a/zoo/PointMAE/models/build.py b/zoo/PointMAE/models/build.py new file mode 100644 index 0000000..d0c8f59 --- /dev/null +++ b/zoo/PointMAE/models/build.py @@ -0,0 +1,17 @@ +from utils import registry + + +MODELS = registry.Registry('models') + + +def build_model_from_cfg(cfg, **kwargs): + """ + Build a dataset, defined by `dataset_name`. + Args: + cfg (eDICT): + Returns: + Dataset: a constructed dataset specified by dataset_name. + """ + return MODELS.build(cfg, **kwargs) + + diff --git a/zoo/PointMAE/requirements.txt b/zoo/PointMAE/requirements.txt new file mode 100644 index 0000000..666dc7a --- /dev/null +++ b/zoo/PointMAE/requirements.txt @@ -0,0 +1,14 @@ +argparse +easydict +h5py +matplotlib +numpy +open3d==0.9 +opencv-python +pyyaml +scipy +tensorboardX +timm==0.4.5 +tqdm +transforms3d +termcolor \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/__init__.py b/zoo/PointMAE/segmentation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PointMAE/segmentation/dataset.py b/zoo/PointMAE/segmentation/dataset.py new file mode 100644 index 0000000..908a9e9 --- /dev/null +++ b/zoo/PointMAE/segmentation/dataset.py @@ -0,0 +1,270 @@ +import numpy as np +import os +from torch.utils.data import Dataset +import torch +# from pointnet_util import pc_normalize +import json +import glob +import h5py + + + +# class PartNormalDataset(Dataset): +# def __init__(self, root='/mnt/lustre/share/ldkong/data/sets/ShapeNetPart', npoints=2500, split='train', class_choice=None, normal_channel=False): +# self.npoints = npoints +# self.root = root +# # self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') +# self.catfile = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart/synsetoffset2category.txt' +# self.cat = {} +# self.normal_channel = normal_channel + +# with open(self.catfile, 'r') as f: +# for line in f: +# ls = line.strip().split() +# self.cat[ls[0]] = ls[1] +# self.cat = {k: v for k, v in self.cat.items()} +# self.classes_original = dict(zip(self.cat, range(len(self.cat)))) + +# if not class_choice is None: +# self.cat = {k:v for k,v in self.cat.items() if k in class_choice} +# # print(self.cat) + +# self.meta = {} +# with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: +# train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) +# with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: +# val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) +# with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: +# test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) +# for item in self.cat: +# # print('category', item) +# self.meta[item] = [] +# dir_point = os.path.join(self.root, self.cat[item]) +# fns = sorted(os.listdir(dir_point)) +# # print(fns[0][0:-4]) +# if split == 'trainval': +# fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] +# elif split == 'train': +# fns = [fn for fn in fns if fn[0:-4] in train_ids] +# elif split == 'val': +# fns = [fn for fn in fns if fn[0:-4] in val_ids] +# elif split == 'test': +# fns = [fn for fn in fns if fn[0:-4] in test_ids] +# else: +# print('Unknown split: %s. Exiting..' % (split)) +# exit(-1) + +# # print(os.path.basename(fns)) +# for fn in fns: +# token = (os.path.splitext(os.path.basename(fn))[0]) +# self.meta[item].append(os.path.join(dir_point, token + '.txt')) + +# self.datapath = [] +# for item in self.cat: +# for fn in self.meta[item]: +# self.datapath.append((item, fn)) + +# self.classes = {} +# for i in self.cat.keys(): +# self.classes[i] = self.classes_original[i] + +# # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels +# self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], +# 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], +# 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], +# 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], +# 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + +# # for cat in sorted(self.seg_classes.keys()): +# # print(cat, self.seg_classes[cat]) + +# self.cache = {} # from index to (point_set, cls, seg) tuple +# self.cache_size = 20000 + + +# def __getitem__(self, index): +# if index in self.cache: +# point_set, cls, seg = self.cache[index] +# else: +# fn = self.datapath[index] +# cat = self.datapath[index][0] +# cls = self.classes[cat] +# cls = np.array([cls]).astype(np.int32) +# data = np.loadtxt(fn[1]).astype(np.float32) +# if not self.normal_channel: +# point_set = data[:, 0:3] +# else: +# point_set = data[:, 0:6] +# seg = data[:, -1].astype(np.int32) +# if len(self.cache) < self.cache_size: +# self.cache[index] = (point_set, cls, seg) +# point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + +# choice = np.random.choice(len(seg), self.npoints, replace=True) +# # resample +# point_set = point_set[choice, :] +# seg = seg[choice] + +# return point_set, cls, seg + +# def __len__(self): +# return len(self.datapath) + + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = { + 'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15 + } + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + +class ShapeNetC(Dataset): + def __init__(self, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = { + 'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15 + } + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] # number of parts for each category + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + seg = self.seg[item] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + + +DATA_DIR = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' +SHAPENET_C_DIR = '/mnt/lustre/share/jwren/to_kld/shapenet_c' + +def load_data_partseg(partition, sub=None): + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + elif partition == 'shapenet-c': + file = os.path.join(SHAPENET_C_DIR, '%s.h5'%sub) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + + + if partition == 'shapenet-c': + # for h5_name in file: + # f = h5py.File(h5_name, 'r+') + f = h5py.File(file, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') # part seg label + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + else: + for h5_name in file: + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +def rotate_pointcloud(pointcloud): + theta = np.pi*2 * np.random.uniform() + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + pointcloud[:,[0,2]] = pointcloud[:,[0,2]].dot(rotation_matrix) # random rotation (x,z) + return pointcloud + + +# if __name__ == '__main__': +# data = ModelNetDataLoader('modelnet40_normal_resampled/', split='train', uniform=False, normal_channel=True) +# DataLoader = torch.utils.data.DataLoader(data, batch_size=12, shuffle=True) +# for point,label in DataLoader: +# print(point.shape) +# print(label.shape) \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/env.sh b/zoo/PointMAE/segmentation/env.sh new file mode 100644 index 0000000..1351ef5 --- /dev/null +++ b/zoo/PointMAE/segmentation/env.sh @@ -0,0 +1,7 @@ +export PATH="/mnt/lustre/share/cuda-10.0/bin:/mnt/lustre/share/gcc/gcc-5.3.0/bin:$PATH" +export LD_LIBRARY_PATH="/mnt/lustre/share/cuda-10.0/lib64:/mnt/lustre/share/gcc/mpc-0.8.1/lib:/mnt/lustre/share/gcc/mpfr-2.4.2/lib:/mnt/lustre/share/gcc/gmp-4.3.2/lib:/mnt/lustre/jwren/anaconda3/lib:$LD_LIBRARY_PATH" + +export CC=/mnt/lustre/share/gcc/gcc-5.3.0/bin/gcc +export CXX=/mnt/lustre/share/gcc/gcc-5.3.0/bin/c++ + +conda activate point-mae \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/logger.py b/zoo/PointMAE/segmentation/logger.py new file mode 100644 index 0000000..9a7250e --- /dev/null +++ b/zoo/PointMAE/segmentation/logger.py @@ -0,0 +1,258 @@ +import logging +import torch.distributed as dist + +import copy +import logging +import os +from collections import defaultdict +import torch +import torch.nn as nn + +from typing import Any +from typing import Optional, List, Dict, NamedTuple, Tuple, Iterable + +from termcolor import colored + +logger_initialized = {} + +def get_root_logger(log_file=None, log_level=logging.INFO, name='main'): + """Get root logger and add a keyword filter to it. + 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., "mmdet3d". + Args: + log_file (str, optional): File path of log. Defaults to None. + log_level (int, optional): The level of logger. + Defaults to logging.INFO. + name (str, optional): The name of the root logger, also used as a + filter keyword. Defaults to 'mmdet3d'. + Returns: + :obj:`logging.Logger`: The obtained logger + """ + logger = get_logger(name=name, log_file=log_file, log_level=log_level) + # add a logging filter + logging_filter = logging.Filter(name) + logging_filter.filter = lambda record: record.find(name) != -1 + + return logger + + +def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): + """Initialize and get a logger by name. + If the logger has not been initialized, this method will initialize the + logger by adding one or two handlers, otherwise the initialized logger will + be directly returned. During initialization, a StreamHandler will always be + added. If `log_file` is specified and the process rank is 0, a FileHandler + will also be added. + Args: + name (str): Logger name. + log_file (str | None): The log filename. If specified, a FileHandler + will be added to the logger. + log_level (int): The logger level. Note that only the process of + rank 0 is affected, and other processes will set the level to + "Error" thus be silent most of the time. + file_mode (str): The file mode used in opening log file. + Defaults to 'w'. + Returns: + logging.Logger: The expected logger. + """ + logger = logging.getLogger(name) + if name in logger_initialized: + return logger + # handle hierarchical names + # e.g., logger "a" is initialized, then logger "a.b" will skip the + # initialization since it is a child of "a". + for logger_name in logger_initialized: + if name.startswith(logger_name): + return logger + + # handle duplicate logs to the console + # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler (NOTSET) + # to the root logger. As logger.propagate is True by default, this root + # level handler causes logging messages from rank>0 processes to + # unexpectedly show up on the console, creating much unwanted clutter. + # To fix this issue, we set the root logger's StreamHandler, if any, to log + # at the ERROR level. + for handler in logger.root.handlers: + if type(handler) is logging.StreamHandler: + handler.setLevel(logging.ERROR) + + stream_handler = logging.StreamHandler() + handlers = [stream_handler] + + if dist.is_available() and dist.is_initialized(): + rank = dist.get_rank() + else: + rank = 0 + + # only rank 0 will add a FileHandler + if rank == 0 and log_file is not None: + # Here, the default behaviour of the official logger is 'a'. Thus, we + # provide an interface to change the file mode to the default + # behaviour. + file_handler = logging.FileHandler(log_file, file_mode) + handlers.append(file_handler) + + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + for handler in handlers: + handler.setFormatter(formatter) + handler.setLevel(log_level) + logger.addHandler(handler) + + if rank == 0: + logger.setLevel(log_level) + else: + logger.setLevel(logging.ERROR) + + logger_initialized[name] = True + + + return logger + + +def print_log(msg, logger=None, level=logging.INFO): + """Print a log message. + Args: + msg (str): The message to be logged. + logger (logging.Logger | str | None): The logger to be used. + Some special loggers are: + - "silent": no message will be printed. + - other str: the logger obtained with `get_root_logger(logger)`. + - None: The `print()` method will be used to print log messages. + level (int): Logging level. Only available when `logger` is a Logger + object or "root". + """ + if logger is None: + print(msg) + elif isinstance(logger, logging.Logger): + logger.log(level, msg) + elif logger == 'silent': + pass + elif isinstance(logger, str): + _logger = get_logger(logger) + _logger.log(level, msg) + else: + raise TypeError( + 'logger should be either a logging.Logger object, str, ' + f'"silent" or None, but got {type(logger)}') + +def get_missing_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the model but not found in a checkpoint. + Args: + keys (list[str]): List of keys that were not found in the checkpoint. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "Some model parameters or buffers are not found in the checkpoint:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "blue") for k, v in groups.items() + ) + return msg + + +def get_unexpected_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the checkpoint but not found in the model. + Args: + keys (list[str]): List of keys that were not found in the model. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "The checkpoint state_dict contains keys that are not used by the model:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "magenta") for k, v in groups.items() + ) + return msg + + +def _strip_prefix_if_present(state_dict: Dict[str, Any], prefix: str) -> None: + """ + Strip the prefix in metadata, if any. + Args: + state_dict (OrderedDict): a state-dict to be loaded to the model. + prefix (str): prefix. + """ + keys = sorted(state_dict.keys()) + if not all(len(key) == 0 or key.startswith(prefix) for key in keys): + return + + for key in keys: + newkey = key[len(prefix):] + state_dict[newkey] = state_dict.pop(key) + + # also strip the prefix in metadata, if any.. + try: + metadata = state_dict._metadata # pyre-ignore + except AttributeError: + pass + else: + for key in list(metadata.keys()): + # for the metadata dict, the key can be: + # '': for the DDP module, which we want to remove. + # 'module': for the actual model. + # 'module.xx.xx': for the rest. + + if len(key) == 0: + continue + newkey = key[len(prefix):] + metadata[newkey] = metadata.pop(key) + + +def _group_checkpoint_keys(keys: List[str]) -> Dict[str, List[str]]: + """ + Group keys based on common prefixes. A prefix is the string up to the final + "." in each key. + Args: + keys (list[str]): list of parameter names, i.e. keys in the model + checkpoint dict. + Returns: + dict[list]: keys with common prefixes are grouped into lists. + """ + groups = defaultdict(list) + for key in keys: + pos = key.rfind(".") + if pos >= 0: + head, tail = key[:pos], [key[pos + 1:]] + else: + head, tail = key, [] + groups[head].extend(tail) + return groups + + +def _group_to_str(group: List[str]) -> str: + """ + Format a group of parameter name suffixes into a loggable string. + Args: + group (list[str]): list of parameter name suffixes. + Returns: + str: formated string. + """ + if len(group) == 0: + return "" + + if len(group) == 1: + return "." + group[0] + + return ".{" + ", ".join(group) + "}" + + +def _named_modules_with_dup( + model: nn.Module, prefix: str = "" +) -> Iterable[Tuple[str, nn.Module]]: + """ + The same as `model.named_modules()`, except that it includes + duplicated modules that have more than one name. + """ + yield prefix, model + for name, module in model._modules.items(): # pyre-ignore + if module is None: + continue + submodule_prefix = prefix + ("." if prefix else "") + name + yield from _named_modules_with_dup(module, submodule_prefix) \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/main.py b/zoo/PointMAE/segmentation/main.py new file mode 100644 index 0000000..c95d94d --- /dev/null +++ b/zoo/PointMAE/segmentation/main.py @@ -0,0 +1,315 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +import torch +import datetime +import logging +import sys +import importlib +import shutil +import provider +import numpy as np +import torch.optim as optim +from timm.scheduler import CosineLRScheduler +from pathlib import Path +from tqdm import tqdm +from dataset import PartNormalDataset + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--model', type=str, default='pt', help='model name') + parser.add_argument('--batch_size', type=int, default=16, help='batch Size during training') + parser.add_argument('--epoch', default=300, type=int, help='epoch to run') + parser.add_argument('--warmup_epoch', default=10, type=int, help='warmup epoch') + parser.add_argument('--learning_rate', default=0.0002, type=float, help='initial learning rate') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + # parser.add_argument('--optimizer', type=str, default='AdamW', help='Adam or SGD') + parser.add_argument('--log_dir', type=str, default='./exp', help='log path') + # parser.add_argument('--decay_rate', type=float, default=1e-4, help='weight decay') + parser.add_argument('--npoint', type=int, default=2048, help='point Number') + parser.add_argument('--normal', action='store_true', default=False, help='use normals') + # parser.add_argument('--step_size', type=int, default=20, help='decay step for lr decay') + # parser.add_argument('--lr_decay', type=float, default=0.5, help='decay rate for lr decay') + parser.add_argument('--ckpts', type=str, default='../best/pretrain/m0.6R_1_pretrain300.pth', help='ckpts') + parser.add_argument('--root', type=str, default='../data/shapenetcore_partanno_segmentation_benchmark_v0_normal/', help='data root') + return parser.parse_args() + + +def main(args): + def log_string(str): + logger.info(str) + print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + '''CREATE DIR''' + timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + exp_dir = Path('./log/') + exp_dir.mkdir(exist_ok=True) + exp_dir = exp_dir.joinpath('part_seg') + exp_dir.mkdir(exist_ok=True) + if args.log_dir is None: + exp_dir = exp_dir.joinpath(timestr) + else: + exp_dir = exp_dir.joinpath(args.log_dir) + exp_dir.mkdir(exist_ok=True) + checkpoints_dir = exp_dir.joinpath('checkpoints/') + checkpoints_dir.mkdir(exist_ok=True) + log_dir = exp_dir.joinpath('logs/') + log_dir.mkdir(exist_ok=True) + + '''LOG''' + args = parse_args() + logger = logging.getLogger("Model") + logger.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler('%s/%s.txt' % (log_dir, args.model)) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + log_string('PARAMETER ...') + log_string(args) + + root = args.root + + TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='trainval', normal_channel=args.normal) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, drop_last=True) + + TEST_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='test', normal_channel=args.normal) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=10) + + log_string("The number of training data is: %d" % len(TRAIN_DATASET)) + log_string("The number of test data is: %d" % len(TEST_DATASET)) + + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + shutil.copy('models/%s.py' % args.model, str(exp_dir)) + # shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + classifier = MODEL.get_model(num_part).cuda() + criterion = MODEL.get_loss().cuda() + classifier.apply(inplace_relu) + print('# generator parameters:', sum(param.numel() for param in classifier.parameters())) + start_epoch = 0 + + if args.ckpts is not None: + classifier.load_model_from_ckpt(args.ckpts) + +## we use adamw and cosine scheduler + def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + decay = [] + no_decay = [] + for name, param in model.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # print(name) + no_decay.append(param) + else: + decay.append(param) + return [ + {'params': no_decay, 'weight_decay': 0.}, + {'params': decay, 'weight_decay': weight_decay}] + + param_groups = add_weight_decay(classifier, weight_decay=0.05) + optimizer = optim.AdamW(param_groups, lr= args.learning_rate, weight_decay=0.05 ) + + scheduler = CosineLRScheduler(optimizer, + t_initial=args.epoch, + t_mul=1, + lr_min=1e-6, + decay_rate=0.1, + warmup_lr_init=1e-6, + warmup_t=args.warmup_epoch, + cycle_limit=1, + t_in_epochs=True) + + best_acc = 0 + global_epoch = 0 + best_class_avg_iou = 0 + best_inctance_avg_iou = 0 + + classifier.zero_grad() + for epoch in range(start_epoch, args.epoch): + mean_correct = [] + + log_string('Epoch %d (%d/%s):' % (global_epoch + 1, epoch + 1, args.epoch)) + '''Adjust learning rate and BN momentum''' + + classifier = classifier.train() + loss_batch = [] + num_iter = 0 + '''learning one epoch''' + for i, (points, label, target) in tqdm(enumerate(trainDataLoader), total=len(trainDataLoader), smoothing=0.9): + num_iter += 1 + points = points.data.numpy() + points[:, :, 0:3] = provider.random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, 0:3] = provider.shift_point_cloud(points[:, :, 0:3]) + points = torch.Tensor(points) + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + + seg_pred = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + + correct = pred_choice.eq(target.data).cpu().sum() + mean_correct.append(correct.item() / (args.batch_size * args.npoint)) + loss = criterion(seg_pred, target) + loss.backward() + optimizer.step() + loss_batch.append(loss.detach().cpu()) + + if num_iter == 1: + + torch.nn.utils.clip_grad_norm_(classifier.parameters(), 10, norm_type=2) + num_iter = 0 + optimizer.step() + classifier.zero_grad() + + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + + train_instance_acc = np.mean(mean_correct) + loss1 = np.mean(loss_batch) + log_string('Train accuracy is: %.5f' % train_instance_acc) + log_string('Train loss: %.5f' % loss1) + log_string('lr: %.6f' % optimizer.param_groups[0]['lr']) + + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + seg_pred = classifier(points, to_categorical(label, num_classes)) + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): # part is not present, no prediction as well + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + log_string('Epoch %d test Accuracy: %f Class avg mIOU: %f Inctance avg mIOU: %f' % ( + epoch + 1, test_metrics['accuracy'], test_metrics['class_avg_iou'], test_metrics['inctance_avg_iou'])) + if (test_metrics['inctance_avg_iou'] >= best_inctance_avg_iou): + logger.info('Save model...') + savepath = str(checkpoints_dir) + '/best_model.pth' + log_string('Saving at %s' % savepath) + state = { + 'epoch': epoch, + 'train_acc': train_instance_acc, + 'test_acc': test_metrics['accuracy'], + 'class_avg_iou': test_metrics['class_avg_iou'], + 'inctance_avg_iou': test_metrics['inctance_avg_iou'], + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, savepath) + log_string('Saving model....') + + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + if test_metrics['class_avg_iou'] > best_class_avg_iou: + best_class_avg_iou = test_metrics['class_avg_iou'] + if test_metrics['inctance_avg_iou'] > best_inctance_avg_iou: + best_inctance_avg_iou = test_metrics['inctance_avg_iou'] + log_string('Best accuracy is: %.5f' % best_acc) + log_string('Best class avg mIOU is: %.5f' % best_class_avg_iou) + log_string('Best inctance avg mIOU is: %.5f' % best_inctance_avg_iou) + global_epoch += 1 + + +if __name__ == '__main__': + args = parse_args() + main(args) \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/misc.py b/zoo/PointMAE/segmentation/misc.py new file mode 100644 index 0000000..5c0e6fc --- /dev/null +++ b/zoo/PointMAE/segmentation/misc.py @@ -0,0 +1,253 @@ +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +import random +import torch +import torch.nn as nn +import torch.nn.functional as F +import os +from collections import abc +from pointnet2_ops import pointnet2_utils + + +def fps(data, number): + ''' + data B N 3 + number int + ''' + fps_idx = pointnet2_utils.furthest_point_sample(data, number) + fps_data = pointnet2_utils.gather_operation(data.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() + return fps_data + + +def worker_init_fn(worker_id): + np.random.seed(np.random.get_state()[1][0] + worker_id) + + +def build_lambda_sche(opti, config): + if config.get('decay_step') is not None: + lr_lbmd = lambda e: max(config.lr_decay ** (e / config.decay_step), config.lowest_decay) + scheduler = torch.optim.lr_scheduler.LambdaLR(opti, lr_lbmd) + else: + raise NotImplementedError() + return scheduler + + +def build_lambda_bnsche(model, config): + if config.get('decay_step') is not None: + bnm_lmbd = lambda e: max(config.bn_momentum * config.bn_decay ** (e / config.decay_step), config.lowest_decay) + bnm_scheduler = BNMomentumScheduler(model, bnm_lmbd) + else: + raise NotImplementedError() + return bnm_scheduler + + +def set_random_seed(seed, deterministic=False): + """Set random seed. + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + + # Speed-reproducibility tradeoff https://pytorch.org/docs/stable/notes/randomness.html + if cuda_deterministic: # slower, more reproducible + cudnn.deterministic = True + cudnn.benchmark = False + else: # faster, less reproducible + cudnn.deterministic = False + cudnn.benchmark = True + + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def is_seq_of(seq, expected_type, seq_type=None): + """Check whether it is a sequence of some type. + Args: + seq (Sequence): The sequence to be checked. + expected_type (type): Expected type of sequence items. + seq_type (type, optional): Expected sequence type. + Returns: + bool: Whether the sequence is valid. + """ + if seq_type is None: + exp_seq_type = abc.Sequence + else: + assert isinstance(seq_type, type) + exp_seq_type = seq_type + if not isinstance(seq, exp_seq_type): + return False + for item in seq: + if not isinstance(item, expected_type): + return False + return True + + +def set_bn_momentum_default(bn_momentum): + def fn(m): + if isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d)): + m.momentum = bn_momentum + + return fn + + +class BNMomentumScheduler(object): + + def __init__( + self, model, bn_lambda, last_epoch=-1, + setter=set_bn_momentum_default + ): + if not isinstance(model, nn.Module): + raise RuntimeError( + "Class '{}' is not a PyTorch nn Module".format( + type(model).__name__ + ) + ) + + self.model = model + self.setter = setter + self.lmbd = bn_lambda + + self.step(last_epoch + 1) + self.last_epoch = last_epoch + + def step(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + + self.last_epoch = epoch + self.model.apply(self.setter(self.lmbd(epoch))) + + def get_momentum(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + return self.lmbd(epoch) + + +def seprate_point_cloud(xyz, num_points, crop, fixed_points=None, padding_zeros=False): + ''' + seprate point cloud: usage : using to generate the incomplete point cloud with a setted number. + ''' + _, n, c = xyz.shape + + assert n == num_points + assert c == 3 + if crop == num_points: + return xyz, None + + INPUT = [] + CROP = [] + for points in xyz: + if isinstance(crop, list): + num_crop = random.randint(crop[0], crop[1]) + else: + num_crop = crop + + points = points.unsqueeze(0) + + if fixed_points is None: + center = F.normalize(torch.randn(1, 1, 3), p=2, dim=-1).cuda() + else: + if isinstance(fixed_points, list): + fixed_point = random.sample(fixed_points, 1)[0] + else: + fixed_point = fixed_points + center = fixed_point.reshape(1, 1, 3).cuda() + + distance_matrix = torch.norm(center.unsqueeze(2) - points.unsqueeze(1), p=2, dim=-1) # 1 1 2048 + + idx = torch.argsort(distance_matrix, dim=-1, descending=False)[0, 0] # 2048 + + if padding_zeros: + input_data = points.clone() + input_data[0, idx[:num_crop]] = input_data[0, idx[:num_crop]] * 0 + + else: + input_data = points.clone()[0, idx[num_crop:]].unsqueeze(0) # 1 N 3 + + crop_data = points.clone()[0, idx[:num_crop]].unsqueeze(0) + + if isinstance(crop, list): + INPUT.append(fps(input_data, 2048)) + CROP.append(fps(crop_data, 2048)) + else: + INPUT.append(input_data) + CROP.append(crop_data) + + input_data = torch.cat(INPUT, dim=0) # B N 3 + crop_data = torch.cat(CROP, dim=0) # B M 3 + + return input_data.contiguous(), crop_data.contiguous() + + +def get_ptcloud_img(ptcloud): + fig = plt.figure(figsize=(8, 8)) + + x, z, y = ptcloud.transpose(1, 0) + ax = fig.gca(projection=Axes3D.name, adjustable='box') + ax.axis('off') + # ax.axis('scaled') + ax.view_init(90, 45) + max, min = np.max(ptcloud), np.min(ptcloud) + ax.set_xbound(min, max) + ax.set_ybound(min, max) + ax.set_zbound(min, max) + ax.scatter(x, y, z, zdir='z', c=y, cmap='jet') + + fig.canvas.draw() + img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + return img + + +def visualize_KITTI(path, data_list, titles=['input', 'pred'], cmap=['bwr', 'autumn'], zdir='y', + xlim=(-1, 1), ylim=(-1, 1), zlim=(-1, 1)): + fig = plt.figure(figsize=(6 * len(data_list), 6)) + cmax = data_list[-1][:, 0].max() + + for i in range(len(data_list)): + data = data_list[i][:-2048] if i == 1 else data_list[i] + color = data[:, 0] / cmax + ax = fig.add_subplot(1, len(data_list), i + 1, projection='3d') + ax.view_init(30, -120) + b = ax.scatter(data[:, 0], data[:, 1], data[:, 2], zdir=zdir, c=color, vmin=-1, vmax=1, cmap=cmap[0], s=4, + linewidth=0.05, edgecolors='black') + ax.set_title(titles[i]) + + ax.set_axis_off() + ax.set_xlim(xlim) + ax.set_ylim(ylim) + ax.set_zlim(zlim) + plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0.2, hspace=0) + if not os.path.exists(path): + os.makedirs(path) + + pic_path = path + '.png' + fig.savefig(pic_path) + + np.save(os.path.join(path, 'input.npy'), data_list[0].numpy()) + np.save(os.path.join(path, 'pred.npy'), data_list[1].numpy()) + plt.close(fig) + + +def random_dropping(pc, e): + up_num = max(64, 768 // (e // 50 + 1)) + pc = pc + random_num = torch.randint(1, up_num, (1, 1))[0, 0] + pc = fps(pc, random_num) + padding = torch.zeros(pc.size(0), 2048 - pc.size(1), 3).to(pc.device) + pc = torch.cat([pc, padding], dim=1) + return pc + + +def random_scale(partial, scale_range=[0.8, 1.2]): + scale = torch.rand(1).cuda() * (scale_range[1] - scale_range[0]) + scale_range[0] + return partial * scale diff --git a/zoo/PointMAE/segmentation/models/__init__.py b/zoo/PointMAE/segmentation/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/PointMAE/segmentation/models/pointnet2_utils.py b/zoo/PointMAE/segmentation/models/pointnet2_utils.py new file mode 100644 index 0000000..2ac60e4 --- /dev/null +++ b/zoo/PointMAE/segmentation/models/pointnet2_utils.py @@ -0,0 +1,312 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from time import time +import numpy as np + +def timeit(tag, t): + print("{}: {}s".format(tag, time() - t)) + return time() + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + dist += torch.sum(src ** 2, -1).view(B, N, 1) + dist += torch.sum(dst ** 2, -1).view(B, 1, M) + return dist + + +def index_points(points, idx): + """ + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S] + Return: + new_points:, indexed points data, [B, S, C] + """ + device = points.device + B = points.shape[0] + view_shape = list(idx.shape) + view_shape[1:] = [1] * (len(view_shape) - 1) + repeat_shape = list(idx.shape) + repeat_shape[0] = 1 + batch_indices = torch.arange(B, dtype=torch.long).to(device).view(view_shape).repeat(repeat_shape) + new_points = points[batch_indices, idx, :] + return new_points + + +def farthest_point_sample(xyz, npoint): + """ + Input: + xyz: pointcloud data, [B, N, 3] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [B, npoint] + """ + device = xyz.device + B, N, C = xyz.shape + centroids = torch.zeros(B, npoint, dtype=torch.long).to(device) + distance = torch.ones(B, N).to(device) * 1e10 + farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device) + batch_indices = torch.arange(B, dtype=torch.long).to(device) + for i in range(npoint): + centroids[:, i] = farthest + centroid = xyz[batch_indices, farthest, :].view(B, 1, 3) + dist = torch.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = torch.max(distance, -1)[1] + return centroids + + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + + +def sample_and_group(npoint, radius, nsample, xyz, points, returnfps=False): + """ + Input: + npoint: + radius: + nsample: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, npoint, nsample, 3] + new_points: sampled points data, [B, npoint, nsample, 3+D] + """ + B, N, C = xyz.shape + S = npoint + fps_idx = farthest_point_sample(xyz, npoint) # [B, npoint, C] + new_xyz = index_points(xyz, fps_idx) + idx = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = index_points(xyz, idx) # [B, npoint, nsample, C] + grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C) + + if points is not None: + grouped_points = index_points(points, idx) + new_points = torch.cat([grouped_xyz_norm, grouped_points], dim=-1) # [B, npoint, nsample, C+D] + else: + new_points = grouped_xyz_norm + if returnfps: + return new_xyz, new_points, grouped_xyz, fps_idx + else: + return new_xyz, new_points + + +def sample_and_group_all(xyz, points): + """ + Input: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, 1, 3] + new_points: sampled points data, [B, 1, N, 3+D] + """ + device = xyz.device + B, N, C = xyz.shape + new_xyz = torch.zeros(B, 1, C).to(device) + grouped_xyz = xyz.view(B, 1, N, C) + if points is not None: + new_points = torch.cat([grouped_xyz, points.view(B, 1, N, -1)], dim=-1) + else: + new_points = grouped_xyz + return new_xyz, new_points + + +class PointNetSetAbstraction(nn.Module): + def __init__(self, npoint, radius, nsample, in_channel, mlp, group_all): + super(PointNetSetAbstraction, self).__init__() + self.npoint = npoint + self.radius = radius + self.nsample = nsample + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv2d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.group_all = group_all + + def forward(self, xyz, points): + """ + Input: + xyz: input points position data, [B, C, N] + points: input points data, [B, D, N] + Return: + new_xyz: sampled points position data, [B, C, S] + new_points_concat: sample points feature data, [B, D', S] + """ + xyz = xyz.permute(0, 2, 1) + if points is not None: + points = points.permute(0, 2, 1) + + if self.group_all: + new_xyz, new_points = sample_and_group_all(xyz, points) + else: + new_xyz, new_points = sample_and_group(self.npoint, self.radius, self.nsample, xyz, points) + # new_xyz: sampled points position data, [B, npoint, C] + # new_points: sampled points data, [B, npoint, nsample, C+D] + new_points = new_points.permute(0, 3, 2, 1) # [B, C+D, nsample,npoint] + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + + new_points = torch.max(new_points, 2)[0] + new_xyz = new_xyz.permute(0, 2, 1) + return new_xyz, new_points + + +class PointNetSetAbstractionMsg(nn.Module): + def __init__(self, npoint, radius_list, nsample_list, in_channel, mlp_list): + super(PointNetSetAbstractionMsg, self).__init__() + self.npoint = npoint + self.radius_list = radius_list + self.nsample_list = nsample_list + self.conv_blocks = nn.ModuleList() + self.bn_blocks = nn.ModuleList() + for i in range(len(mlp_list)): + convs = nn.ModuleList() + bns = nn.ModuleList() + last_channel = in_channel + 3 + for out_channel in mlp_list[i]: + convs.append(nn.Conv2d(last_channel, out_channel, 1)) + bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.conv_blocks.append(convs) + self.bn_blocks.append(bns) + + def forward(self, xyz, points): + """ + Input: + xyz: input points position data, [B, C, N] + points: input points data, [B, D, N] + Return: + new_xyz: sampled points position data, [B, C, S] + new_points_concat: sample points feature data, [B, D', S] + """ + xyz = xyz.permute(0, 2, 1) + if points is not None: + points = points.permute(0, 2, 1) + + B, N, C = xyz.shape + S = self.npoint + new_xyz = index_points(xyz, farthest_point_sample(xyz, S)) + new_points_list = [] + for i, radius in enumerate(self.radius_list): + K = self.nsample_list[i] + group_idx = query_ball_point(radius, K, xyz, new_xyz) + grouped_xyz = index_points(xyz, group_idx) + grouped_xyz -= new_xyz.view(B, S, 1, C) + if points is not None: + grouped_points = index_points(points, group_idx) + grouped_points = torch.cat([grouped_points, grouped_xyz], dim=-1) + else: + grouped_points = grouped_xyz + + grouped_points = grouped_points.permute(0, 3, 2, 1) # [B, D, K, S] + for j in range(len(self.conv_blocks[i])): + conv = self.conv_blocks[i][j] + bn = self.bn_blocks[i][j] + grouped_points = F.relu(bn(conv(grouped_points))) + new_points = torch.max(grouped_points, 2)[0] # [B, D', S] + new_points_list.append(new_points) + + new_xyz = new_xyz.permute(0, 2, 1) + new_points_concat = torch.cat(new_points_list, dim=1) + return new_xyz, new_points_concat + + +class PointNetFeaturePropagation(nn.Module): + def __init__(self, in_channel, mlp): + super(PointNetFeaturePropagation, self).__init__() + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv1d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm1d(out_channel)) + last_channel = out_channel + + def forward(self, xyz1, xyz2, points1, points2): + """ + Input: + xyz1: input points position data, [B, C, N] + xyz2: sampled input points position data, [B, C, S] + points1: input points data, [B, D, N] + points2: input points data, [B, D, S] + Return: + new_points: upsampled points data, [B, D', N] + """ + xyz1 = xyz1.permute(0, 2, 1) + xyz2 = xyz2.permute(0, 2, 1) + + points2 = points2.permute(0, 2, 1) + B, N, C = xyz1.shape + _, S, _ = xyz2.shape + + if S == 1: + interpolated_points = points2.repeat(1, N, 1) + else: + dists = square_distance(xyz1, xyz2) + dists, idx = dists.sort(dim=-1) + dists, idx = dists[:, :, :3], idx[:, :, :3] # [B, N, 3] + + dist_recip = 1.0 / (dists + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_points = torch.sum(index_points(points2, idx) * weight.view(B, N, 3, 1), dim=2) + + if points1 is not None: + points1 = points1.permute(0, 2, 1) + new_points = torch.cat([points1, interpolated_points], dim=-1) + else: + new_points = interpolated_points + + new_points = new_points.permute(0, 2, 1) + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + return new_points \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/models/pt.py b/zoo/PointMAE/segmentation/models/pt.py new file mode 100644 index 0000000..72ba2fa --- /dev/null +++ b/zoo/PointMAE/segmentation/models/pt.py @@ -0,0 +1,337 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from timm.models.layers import DropPath, trunc_normal_ +from logger import get_missing_parameters_message, get_unexpected_parameters_message + +from pointnet2_ops import pointnet2_utils +from knn_cuda import KNN +from pointnet2_utils import PointNetFeaturePropagation + + +def fps(data, number): + ''' + data B N 3 + number int + ''' + fps_idx = pointnet2_utils.furthest_point_sample(data, number) + fps_data = pointnet2_utils.gather_operation(data.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() + # fps_idx = furthest_point_sample(data, number) + # fps_data = gather_operation(data.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() + return fps_data + + +class Group(nn.Module): + def __init__(self, num_group, group_size): + super().__init__() + self.num_group = num_group + self.group_size = group_size + self.knn = KNN(k=self.group_size, transpose_mode=True) + + def forward(self, xyz): + ''' + input: B N 3 + --------------------------- + output: B G M 3 + center : B G 3 + ''' + batch_size, num_points, _ = xyz.shape + # fps the centers out + center = fps(xyz, self.num_group) # B G 3 + # knn to get the neighborhood + _, idx = self.knn(xyz, center) # B G M + assert idx.size(1) == self.num_group + assert idx.size(2) == self.group_size + idx_base = torch.arange(0, batch_size, device=xyz.device).view(-1, 1, 1) * num_points + idx = idx + idx_base + idx = idx.view(-1) + neighborhood = xyz.view(batch_size * num_points, -1)[idx, :] + neighborhood = neighborhood.view(batch_size, self.num_group, self.group_size, 3).contiguous() + # normalize + neighborhood = neighborhood - center.unsqueeze(2) + return neighborhood, center + + +class Encoder(nn.Module): + def __init__(self, encoder_channel): + super().__init__() + self.encoder_channel = encoder_channel + self.first_conv = nn.Sequential( + nn.Conv1d(3, 128, 1), + nn.BatchNorm1d(128), + nn.ReLU(inplace=True), + nn.Conv1d(128, 256, 1) + ) + self.second_conv = nn.Sequential( + nn.Conv1d(512, 512, 1), + nn.BatchNorm1d(512), + nn.ReLU(inplace=True), + nn.Conv1d(512, self.encoder_channel, 1) + ) + + def forward(self, point_groups): + ''' + point_groups : B G N 3 + ----------------- + feature_global : B G C + ''' + bs, g, n, _ = point_groups.shape + point_groups = point_groups.reshape(bs * g, n, 3) + # encoder + feature = self.first_conv(point_groups.transpose(2, 1)) + feature_global = torch.max(feature, dim=2, keepdim=True)[0] + feature = torch.cat([feature_global.expand(-1, -1, n), feature], dim=1) + feature = self.second_conv(feature) + feature_global = torch.max(feature, dim=2, keepdim=False)[0] + return feature_global.reshape(bs, g, self.encoder_channel) + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + 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] # make torchscript happy (cannot use tensor as tuple) + + attn = (q * self.scale) @ k.transpose(-2, -1) + attn = attn.softmax(dim=-1) + 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 + + +class Block(nn.Module): + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class TransformerEncoder(nn.Module): + """ Transformer Encoder without hierarchical structure + """ + + def __init__(self, embed_dim=768, depth=4, num_heads=12, mlp_ratio=4., qkv_bias=False, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.): + super().__init__() + + self.blocks = nn.ModuleList([ + Block( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path=drop_path_rate[i] if isinstance(drop_path_rate, list) else drop_path_rate + ) + for i in range(depth)]) + + def forward(self, x, pos): + feature_list = [] + fetch_idx = [3, 7, 11] + for i, block in enumerate(self.blocks): + x = block(x + pos) + if i in fetch_idx: + feature_list.append(x) + return feature_list + + +class get_model(nn.Module): + def __init__(self, cls_dim): + super().__init__() + + self.trans_dim = 384 + self.depth = 12 + self.drop_path_rate = 0.1 + self.cls_dim = cls_dim + self.num_heads = 6 + + self.group_size = 32 + self.num_group = 128 + # grouper + self.group_divider = Group(num_group=self.num_group, group_size=self.group_size) + # define the encoder + self.encoder_dims = 384 + self.encoder = Encoder(encoder_channel=self.encoder_dims) + # bridge encoder and transformer + + self.pos_embed = nn.Sequential( + nn.Linear(3, 128), + nn.GELU(), + nn.Linear(128, self.trans_dim) + ) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] + self.blocks = TransformerEncoder( + embed_dim=self.trans_dim, + depth=self.depth, + drop_path_rate=dpr, + num_heads=self.num_heads + ) + + self.norm = nn.LayerNorm(self.trans_dim) + + self.label_conv = nn.Sequential( + nn.Conv1d(16, 64, kernel_size=1, bias=False), + nn.BatchNorm1d(64), + nn.LeakyReLU(0.2) + ) + + self.propagation_0 = PointNetFeaturePropagation(in_channel=1152 + 3, mlp=[self.trans_dim * 4, 1024]) + + self.convs1 = nn.Conv1d(3392, 512, 1) + self.dp1 = nn.Dropout(0.5) + self.convs2 = nn.Conv1d(512, 256, 1) + self.convs3 = nn.Conv1d(256, self.cls_dim, 1) + self.bns1 = nn.BatchNorm1d(512) + self.bns2 = nn.BatchNorm1d(256) + + self.relu = nn.ReLU() + + def get_loss_acc(self, ret, gt): + loss = self.loss_ce(ret, gt.long()) + pred = ret.argmax(-1) + acc = (pred == gt).sum() / float(gt.size(0)) + return loss, acc * 100 + + def load_model_from_ckpt(self, bert_ckpt_path): + if bert_ckpt_path is not None: + ckpt = torch.load(bert_ckpt_path) + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + + for k in list(base_ckpt.keys()): + if k.startswith('MAE_encoder'): + base_ckpt[k[len('MAE_encoder.'):]] = base_ckpt[k] + del base_ckpt[k] + elif k.startswith('base_model'): + base_ckpt[k[len('base_model.'):]] = base_ckpt[k] + del base_ckpt[k] + + incompatible = self.load_state_dict(base_ckpt, strict=False) + + if incompatible.missing_keys: + print('missing_keys') + print( + get_missing_parameters_message(incompatible.missing_keys) + ) + if incompatible.unexpected_keys: + print('unexpected_keys') + print( + get_unexpected_parameters_message(incompatible.unexpected_keys) + + ) + + print(f'[Transformer] Successful Loading the ckpt from {bert_ckpt_path}') + + def load_model_from_ckpt_test(self, bert_ckpt_path): + if bert_ckpt_path is not None: + ckpt = torch.load(bert_ckpt_path) + # base_ckpt = {k.replace("module.", ""): v for k, v in ckpt['base_model'].items()} + base_ckpt = {k.replace("module.", ""): v for k, v in ckpt["model_state_dict"].items()} + + for k in list(base_ckpt.keys()): + if k.startswith('MAE_encoder'): + base_ckpt[k[len('MAE_encoder.'):]] = base_ckpt[k] + del base_ckpt[k] + elif k.startswith('base_model'): + base_ckpt[k[len('base_model.'):]] = base_ckpt[k] + del base_ckpt[k] + + incompatible = self.load_state_dict(base_ckpt, strict=False) + + if incompatible.missing_keys: + print('missing_keys') + print( + get_missing_parameters_message(incompatible.missing_keys) + ) + if incompatible.unexpected_keys: + print('unexpected_keys') + print( + get_unexpected_parameters_message(incompatible.unexpected_keys) + + ) + + print(f'[Transformer] Successful Loading the ckpt from {bert_ckpt_path}') + + def forward(self, pts, cls_label): + B, C, N = pts.shape + pts = pts.transpose(-1, -2) # B N 3 + # divide the point clo ud in the same form. This is important + neighborhood, center = self.group_divider(pts) + + group_input_tokens = self.encoder(neighborhood) # B G N + + pos = self.pos_embed(center) + # final input + x = group_input_tokens + # transformer + feature_list = self.blocks(x, pos) + feature_list = [self.norm(x).transpose(-1, -2).contiguous() for x in feature_list] + x = torch.cat((feature_list[0],feature_list[1],feature_list[2]), dim=1) #1152 + x_max = torch.max(x,2)[0] + x_avg = torch.mean(x,2) + x_max_feature = x_max.view(B, -1).unsqueeze(-1).repeat(1, 1, N) + x_avg_feature = x_avg.view(B, -1).unsqueeze(-1).repeat(1, 1, N) + cls_label_one_hot = cls_label.view(B, 16, 1) + cls_label_feature = self.label_conv(cls_label_one_hot).repeat(1, 1, N) + x_global_feature = torch.cat((x_max_feature, x_avg_feature, cls_label_feature), 1) #1152*2 + 64 + + f_level_0 = self.propagation_0(pts.transpose(-1, -2), center.transpose(-1, -2), pts.transpose(-1, -2), x) + + x = torch.cat((f_level_0,x_global_feature), 1) + x = self.relu(self.bns1(self.convs1(x))) + x = self.dp1(x) + x = self.relu(self.bns2(self.convs2(x))) + x = self.convs3(x) + x = F.log_softmax(x, dim=1) + x = x.permute(0, 2, 1) + return x + +class get_loss(nn.Module): + def __init__(self): + super(get_loss, self).__init__() + + def forward(self, pred, target): + total_loss = F.nll_loss(pred, target) + return total_loss \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/pointnet_util.py b/zoo/PointMAE/segmentation/pointnet_util.py new file mode 100644 index 0000000..6bac6a5 --- /dev/null +++ b/zoo/PointMAE/segmentation/pointnet_util.py @@ -0,0 +1,312 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from time import time +import numpy as np + + +# reference https://github.com/yanx27/Pointnet_Pointnet2_pytorch, modified by Yang You + + +def timeit(tag, t): + print("{}: {}s".format(tag, time() - t)) + return time() + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + return torch.sum((src[:, :, None] - dst[:, None]) ** 2, dim=-1) + + +def index_points(points, idx): + """ + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S, [K]] + Return: + new_points:, indexed points data, [B, S, [K], C] + """ + raw_size = idx.size() + idx = idx.reshape(raw_size[0], -1) + res = torch.gather(points, 1, idx[..., None].expand(-1, -1, points.size(-1))) + return res.reshape(*raw_size, -1) + + +def farthest_point_sample(xyz, npoint): + """ + Input: + xyz: pointcloud data, [B, N, 3] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [B, npoint] + """ + device = xyz.device + B, N, C = xyz.shape + centroids = torch.zeros(B, npoint, dtype=torch.long).to(device) + distance = torch.ones(B, N).to(device) * 1e10 + farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device) + batch_indices = torch.arange(B, dtype=torch.long).to(device) + for i in range(npoint): + centroids[:, i] = farthest + centroid = xyz[batch_indices, farthest, :].view(B, 1, 3) + dist = torch.sum((xyz - centroid) ** 2, -1) + distance = torch.min(distance, dist) + farthest = torch.max(distance, -1)[1] + return centroids + + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + + +def sample_and_group(npoint, radius, nsample, xyz, points, returnfps=False, knn=False): + """ + Input: + npoint: + radius: + nsample: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, npoint, nsample, 3] + new_points: sampled points data, [B, npoint, nsample, 3+D] + """ + B, N, C = xyz.shape + S = npoint + fps_idx = farthest_point_sample(xyz, npoint) # [B, npoint] + torch.cuda.empty_cache() + new_xyz = index_points(xyz, fps_idx) + torch.cuda.empty_cache() + if knn: + dists = square_distance(new_xyz, xyz) # B x npoint x N + idx = dists.argsort()[:, :, :nsample] # B x npoint x K + else: + idx = query_ball_point(radius, nsample, xyz, new_xyz) + torch.cuda.empty_cache() + grouped_xyz = index_points(xyz, idx) # [B, npoint, nsample, C] + torch.cuda.empty_cache() + grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C) + torch.cuda.empty_cache() + + if points is not None: + grouped_points = index_points(points, idx) + new_points = torch.cat([grouped_xyz_norm, grouped_points], dim=-1) # [B, npoint, nsample, C+D] + else: + new_points = grouped_xyz_norm + if returnfps: + return new_xyz, new_points, grouped_xyz, fps_idx + else: + return new_xyz, new_points + + +def sample_and_group_all(xyz, points): + """ + Input: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, 1, 3] + new_points: sampled points data, [B, 1, N, 3+D] + """ + device = xyz.device + B, N, C = xyz.shape + new_xyz = torch.zeros(B, 1, C).to(device) + grouped_xyz = xyz.view(B, 1, N, C) + if points is not None: + new_points = torch.cat([grouped_xyz, points.view(B, 1, N, -1)], dim=-1) + else: + new_points = grouped_xyz + return new_xyz, new_points + + +class PointNetSetAbstraction(nn.Module): + def __init__(self, npoint, radius, nsample, in_channel, mlp, group_all, knn=False): + super(PointNetSetAbstraction, self).__init__() + self.npoint = npoint + self.radius = radius + self.nsample = nsample + self.knn = knn + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv2d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.group_all = group_all + + def forward(self, xyz, points): + """ + Input: + xyz: input points position data, [B, N, C] + points: input points data, [B, N, C] + Return: + new_xyz: sampled points position data, [B, S, C] + new_points_concat: sample points feature data, [B, S, D'] + """ + if self.group_all: + new_xyz, new_points = sample_and_group_all(xyz, points) + else: + new_xyz, new_points = sample_and_group(self.npoint, self.radius, self.nsample, xyz, points, knn=self.knn) + # new_xyz: sampled points position data, [B, npoint, C] + # new_points: sampled points data, [B, npoint, nsample, C+D] + new_points = new_points.permute(0, 3, 2, 1) # [B, C+D, nsample,npoint] + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + + new_points = torch.max(new_points, 2)[0].transpose(1, 2) + return new_xyz, new_points + + +class PointNetSetAbstractionMsg(nn.Module): + def __init__(self, npoint, radius_list, nsample_list, in_channel, mlp_list, knn=False): + super(PointNetSetAbstractionMsg, self).__init__() + self.npoint = npoint + self.radius_list = radius_list + self.nsample_list = nsample_list + self.knn = knn + self.conv_blocks = nn.ModuleList() + self.bn_blocks = nn.ModuleList() + for i in range(len(mlp_list)): + convs = nn.ModuleList() + bns = nn.ModuleList() + last_channel = in_channel + 3 + for out_channel in mlp_list[i]: + convs.append(nn.Conv2d(last_channel, out_channel, 1)) + bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.conv_blocks.append(convs) + self.bn_blocks.append(bns) + + def forward(self, xyz, points, seed_idx=None): + """ + Input: + xyz: input points position data, [B, C, N] + points: input points data, [B, D, N] + Return: + new_xyz: sampled points position data, [B, C, S] + new_points_concat: sample points feature data, [B, D', S] + """ + + B, N, C = xyz.shape + S = self.npoint + new_xyz = index_points(xyz, farthest_point_sample(xyz, S) if seed_idx is None else seed_idx) + new_points_list = [] + for i, radius in enumerate(self.radius_list): + K = self.nsample_list[i] + if self.knn: + dists = square_distance(new_xyz, xyz) # B x npoint x N + group_idx = dists.argsort()[:, :, :K] # B x npoint x K + else: + group_idx = query_ball_point(radius, K, xyz, new_xyz) + grouped_xyz = index_points(xyz, group_idx) + grouped_xyz -= new_xyz.view(B, S, 1, C) + if points is not None: + grouped_points = index_points(points, group_idx) + grouped_points = torch.cat([grouped_points, grouped_xyz], dim=-1) + else: + grouped_points = grouped_xyz + + grouped_points = grouped_points.permute(0, 3, 2, 1) # [B, D, K, S] + for j in range(len(self.conv_blocks[i])): + conv = self.conv_blocks[i][j] + bn = self.bn_blocks[i][j] + grouped_points = F.relu(bn(conv(grouped_points))) + new_points = torch.max(grouped_points, 2)[0] # [B, D', S] + new_points_list.append(new_points) + + new_points_concat = torch.cat(new_points_list, dim=1).transpose(1, 2) + return new_xyz, new_points_concat + + +# NoteL this function swaps N and C +class PointNetFeaturePropagation(nn.Module): + def __init__(self, in_channel, mlp): + super(PointNetFeaturePropagation, self).__init__() + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv1d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm1d(out_channel)) + last_channel = out_channel + + def forward(self, xyz1, xyz2, points1, points2): + """ + Input: + xyz1: input points position data, [B, C, N] + xyz2: sampled input points position data, [B, C, S] + points1: input points data, [B, D, N] + points2: input points data, [B, D, S] + Return: + new_points: upsampled points data, [B, D', N] + """ + xyz1 = xyz1.permute(0, 2, 1) + xyz2 = xyz2.permute(0, 2, 1) + + points2 = points2.permute(0, 2, 1) + B, N, C = xyz1.shape + _, S, _ = xyz2.shape + + if S == 1: + interpolated_points = points2.repeat(1, N, 1) + else: + dists = square_distance(xyz1, xyz2) + dists, idx = dists.sort(dim=-1) + dists, idx = dists[:, :, :3], idx[:, :, :3] # [B, N, 3] + + dist_recip = 1.0 / (dists + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_points = torch.sum(index_points(points2, idx) * weight.view(B, N, 3, 1), dim=2) + + if points1 is not None: + points1 = points1.permute(0, 2, 1) + new_points = torch.cat([points1, interpolated_points], dim=-1) + else: + new_points = interpolated_points + + new_points = new_points.permute(0, 2, 1) + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + return new_points + diff --git a/zoo/PointMAE/segmentation/provider.py b/zoo/PointMAE/segmentation/provider.py new file mode 100644 index 0000000..9ec6c9c --- /dev/null +++ b/zoo/PointMAE/segmentation/provider.py @@ -0,0 +1,248 @@ +import numpy as np + +def normalize_data(batch_data): + """ Normalize the batch data, use coordinates of the block centered at origin, + Input: + BxNxC array + Output: + BxNxC array + """ + B, N, C = batch_data.shape + normal_data = np.zeros((B, N, C)) + for b in range(B): + pc = batch_data[b] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + normal_data[b] = pc + return normal_data + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc diff --git a/zoo/PointMAE/segmentation/test.py b/zoo/PointMAE/segmentation/test.py new file mode 100644 index 0000000..1848730 --- /dev/null +++ b/zoo/PointMAE/segmentation/test.py @@ -0,0 +1,233 @@ +import argparse +import os +import torch +import sys +import importlib +import numpy as np +from tqdm import tqdm +from dataset import ShapeNetC + +from collections import defaultdict +from torch.autograd import Variable + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--model', type=str, default='pt', help='model name') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + parser.add_argument('--ckpts', type=str, help='ckpts') + return parser.parse_args() + + +def main(args): + # def log_string(str): + # logger.info(str) + # print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + '''CREATE DIR''' + # timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + # exp_dir = Path('./log/') + # exp_dir.mkdir(exist_ok=True) + # exp_dir = exp_dir.joinpath('part_seg') + # exp_dir.mkdir(exist_ok=True) + # if args.log_dir is None: + # exp_dir = exp_dir.joinpath(timestr) + # else: + # exp_dir = exp_dir.joinpath(args.log_dir) + # exp_dir.mkdir(exist_ok=True) + # checkpoints_dir = exp_dir.joinpath('checkpoints/') + # checkpoints_dir.mkdir(exist_ok=True) + # log_dir = exp_dir.joinpath('logs/') + # log_dir.mkdir(exist_ok=True) + + '''LOG''' + # args = parse_args() + # logger = logging.getLogger("Model") + # logger.setLevel(logging.INFO) + # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # file_handler = logging.FileHandler('%s/%s.txt' % (log_dir, args.model)) + # file_handler.setLevel(logging.INFO) + # file_handler.setFormatter(formatter) + # logger.addHandler(file_handler) + # log_string('PARAMETER ...') + # log_string(args) + + # root = args.root + + # TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='trainval', normal_channel=args.normal) + # TRAIN_DATASET = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + # trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, pin_memory=True, drop_last=True) + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='test', normal_channel=args.normal) + # TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + TEST_DATASET = ShapeNetC(partition='shapenet-c', sub='add_local_4', class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + # log_string("The number of training data is: %d" % len(TRAIN_DATASET)) + print("The number of test data is: %d" % len(TEST_DATASET)) + + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + # shutil.copy('models/%s.py' % args.model, str(exp_dir)) + # shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + classifier = MODEL.get_model(num_part).cuda() + classifier.apply(inplace_relu) + print('# generator parameters:', sum(param.numel() for param in classifier.parameters())) + + if args.ckpts is not None: + classifier.load_model_from_ckpt_test(args.ckpts) + # classifier.load_state_dict(torch.load(args.ckpts)) + +## we use adamw and cosine scheduler + # def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + # decay = [] + # no_decay = [] + # for name, param in model.named_parameters(): + # if not param.requires_grad: + # continue # frozen weights + # if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # # print(name) + # no_decay.append(param) + # else: + # decay.append(param) + # return [ + # {'params': no_decay, 'weight_decay': 0.}, + # {'params': decay, 'weight_decay': weight_decay}] + + # param_groups = add_weight_decay(classifier, weight_decay=0.05) + # optimizer = optim.AdamW(param_groups, lr= args.learning_rate, weight_decay=0.05 ) + + # scheduler = CosineLRScheduler( + # optimizer, + # t_initial=args.epoch, + # t_mul=1, + # lr_min=1e-6, + # decay_rate=0.1, + # warmup_lr_init=1e-6, + # warmup_t=args.warmup_epoch, + # cycle_limit=1, + # t_in_epochs=True + # ) + + # best_acc = 0 + # global_epoch = 0 + # best_class_avg_iou = 0 + # best_inctance_avg_iou = 0 + + # classifier.zero_grad() + + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = classifier(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + print(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + print(outstr) + + + +if __name__ == '__main__': + args = parse_args() + main(args) \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/test.sh b/zoo/PointMAE/segmentation/test.sh new file mode 100644 index 0000000..3eb06a5 --- /dev/null +++ b/zoo/PointMAE/segmentation/test.sh @@ -0,0 +1,2 @@ +CUDA_VISIBLE_DEVICES=1 python test.py \ + --ckpts /mnt/lustre/ldkong/models/Point-MAE/segmentation/log/part_seg/exp_run3/checkpoints/best_model.pth \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/train.py b/zoo/PointMAE/segmentation/train.py new file mode 100644 index 0000000..71ebd4a --- /dev/null +++ b/zoo/PointMAE/segmentation/train.py @@ -0,0 +1,322 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +import torch +import datetime +import logging +import sys +import importlib +import shutil +import provider +import numpy as np +import torch.optim as optim +from timm.scheduler import CosineLRScheduler +from pathlib import Path +from tqdm import tqdm +from dataset import ShapeNetPart + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'models')) + +seg_classes = { + 'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23] +} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +def parse_args(): + parser = argparse.ArgumentParser('Model') + parser.add_argument('--model', type=str, default='pt', help='model name') + parser.add_argument('--batch_size', type=int, default=16, help='batch Size during training') + parser.add_argument('--epoch', default=300, type=int, help='epoch to run') + parser.add_argument('--warmup_epoch', default=10, type=int, help='warmup epoch') + parser.add_argument('--learning_rate', default=0.0002, type=float, help='initial learning rate') + parser.add_argument('--gpu', type=str, default='0', help='specify GPU devices') + # parser.add_argument('--optimizer', type=str, default='AdamW', help='Adam or SGD') + parser.add_argument('--log_dir', type=str, default='./exp_run3', help='log path') + # parser.add_argument('--decay_rate', type=float, default=1e-4, help='weight decay') + parser.add_argument('--npoint', type=int, default=2048, help='point Number') + parser.add_argument('--normal', action='store_true', default=False, help='use normals') + # parser.add_argument('--step_size', type=int, default=20, help='decay step for lr decay') + # parser.add_argument('--lr_decay', type=float, default=0.5, help='decay rate for lr decay') + parser.add_argument('--ckpts', type=str, default='../best/pretrain/m0.6R_1_pretrain300.pth', help='ckpts') + parser.add_argument('--root', type=str, default='../data/shapenetcore_partanno_segmentation_benchmark_v0_normal/', help='data root') + return parser.parse_args() + + +def main(args): + def log_string(str): + logger.info(str) + print(str) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + '''CREATE DIR''' + timestr = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) + exp_dir = Path('./log/') + exp_dir.mkdir(exist_ok=True) + exp_dir = exp_dir.joinpath('part_seg') + exp_dir.mkdir(exist_ok=True) + if args.log_dir is None: + exp_dir = exp_dir.joinpath(timestr) + else: + exp_dir = exp_dir.joinpath(args.log_dir) + exp_dir.mkdir(exist_ok=True) + checkpoints_dir = exp_dir.joinpath('checkpoints/') + checkpoints_dir.mkdir(exist_ok=True) + log_dir = exp_dir.joinpath('logs/') + log_dir.mkdir(exist_ok=True) + + '''LOG''' + args = parse_args() + logger = logging.getLogger("Model") + logger.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler('%s/%s.txt' % (log_dir, args.model)) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + log_string('PARAMETER ...') + log_string(args) + + root = args.root + + # TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='trainval', normal_channel=args.normal) + TRAIN_DATASET = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, pin_memory=True, drop_last=True) + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.npoint, split='test', normal_channel=args.normal) + TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, pin_memory=True, drop_last=False) + + log_string("The number of training data is: %d" % len(TRAIN_DATASET)) + log_string("The number of test data is: %d" % len(TEST_DATASET)) + + num_classes = 16 + num_part = 50 + + '''MODEL LOADING''' + MODEL = importlib.import_module(args.model) + shutil.copy('models/%s.py' % args.model, str(exp_dir)) + # shutil.copy('models/pointnet2_utils.py', str(exp_dir)) + + classifier = MODEL.get_model(num_part).cuda() + criterion = MODEL.get_loss().cuda() + classifier.apply(inplace_relu) + print('# generator parameters:', sum(param.numel() for param in classifier.parameters())) + start_epoch = 0 + + if args.ckpts is not None: + classifier.load_model_from_ckpt(args.ckpts) + +## we use adamw and cosine scheduler + def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + decay = [] + no_decay = [] + for name, param in model.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # print(name) + no_decay.append(param) + else: + decay.append(param) + return [ + {'params': no_decay, 'weight_decay': 0.}, + {'params': decay, 'weight_decay': weight_decay}] + + param_groups = add_weight_decay(classifier, weight_decay=0.05) + optimizer = optim.AdamW(param_groups, lr= args.learning_rate, weight_decay=0.05 ) + + scheduler = CosineLRScheduler( + optimizer, + t_initial=args.epoch, + t_mul=1, + lr_min=1e-6, + decay_rate=0.1, + warmup_lr_init=1e-6, + warmup_t=args.warmup_epoch, + cycle_limit=1, + t_in_epochs=True + ) + + best_acc = 0 + global_epoch = 0 + best_class_avg_iou = 0 + best_inctance_avg_iou = 0 + + classifier.zero_grad() + for epoch in range(start_epoch, args.epoch): + mean_correct = [] + + log_string('Epoch %d (%d/%s):' % (global_epoch + 1, epoch + 1, args.epoch)) + '''Adjust learning rate and BN momentum''' + + classifier = classifier.train() + loss_batch = [] + num_iter = 0 + '''learning one epoch''' + for i, (points, label, target) in tqdm(enumerate(trainDataLoader), total=len(trainDataLoader), smoothing=0.9): + num_iter += 1 + points = points.data.numpy() + points[:, :, 0:3] = provider.random_scale_point_cloud(points[:, :, 0:3]) + points[:, :, 0:3] = provider.shift_point_cloud(points[:, :, 0:3]) + points = torch.Tensor(points) + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + + seg_pred = classifier(points, to_categorical(label, num_classes)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + + correct = pred_choice.eq(target.data).cpu().sum() + mean_correct.append(correct.item() / (args.batch_size * args.npoint)) + loss = criterion(seg_pred, target) + loss.backward() + optimizer.step() + loss_batch.append(loss.detach().cpu()) + + if num_iter == 1: + + torch.nn.utils.clip_grad_norm_(classifier.parameters(), 10, norm_type=2) + num_iter = 0 + optimizer.step() + classifier.zero_grad() + + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + + train_instance_acc = np.mean(mean_correct) + loss1 = np.mean(loss_batch) + log_string('Train accuracy is: %.5f' % train_instance_acc) + log_string('Train loss: %.5f' % loss1) + log_string('lr: %.6f' % optimizer.param_groups[0]['lr']) + + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + points = points.transpose(2, 1) + seg_pred = classifier(points, to_categorical(label, num_classes)) + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): # part is not present, no prediction as well + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + log_string('Epoch %d test Accuracy: %f Class avg mIOU: %f Inctance avg mIOU: %f' % ( + epoch + 1, test_metrics['accuracy'], test_metrics['class_avg_iou'], test_metrics['inctance_avg_iou'])) + if (test_metrics['inctance_avg_iou'] >= best_inctance_avg_iou): + logger.info('Save model...') + savepath = str(checkpoints_dir) + '/best_model.pth' + log_string('Saving at %s' % savepath) + state = { + 'epoch': epoch, + 'train_acc': train_instance_acc, + 'test_acc': test_metrics['accuracy'], + 'class_avg_iou': test_metrics['class_avg_iou'], + 'inctance_avg_iou': test_metrics['inctance_avg_iou'], + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, savepath) + log_string('Saving model....') + + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + if test_metrics['class_avg_iou'] > best_class_avg_iou: + best_class_avg_iou = test_metrics['class_avg_iou'] + if test_metrics['inctance_avg_iou'] > best_inctance_avg_iou: + best_inctance_avg_iou = test_metrics['inctance_avg_iou'] + log_string('Best accuracy is: %.5f' % best_acc) + log_string('Best class avg mIOU is: %.5f' % best_class_avg_iou) + log_string('Best inctance avg mIOU is: %.5f' % best_inctance_avg_iou) + global_epoch += 1 + + +if __name__ == '__main__': + args = parse_args() + main(args) \ No newline at end of file diff --git a/zoo/PointMAE/segmentation/train.sh b/zoo/PointMAE/segmentation/train.sh new file mode 100644 index 0000000..b3e34d3 --- /dev/null +++ b/zoo/PointMAE/segmentation/train.sh @@ -0,0 +1,6 @@ +CUDA_VISIBLE_DEVICES=4 python train.py \ + --ckpts /mnt/lustre/ldkong/models/Point-MAE/segmentation/models/pretrain.pth \ + --root path/to/data \ + --learning_rate 0.0002 \ + --epoch 300 \ + --gpu 4 \ No newline at end of file diff --git a/zoo/PointMAE/tools/__init__.py b/zoo/PointMAE/tools/__init__.py new file mode 100644 index 0000000..1d79153 --- /dev/null +++ b/zoo/PointMAE/tools/__init__.py @@ -0,0 +1,5 @@ +# from .runner import run_net +from .runner import test_net +from .runner_pretrain import run_net as pretrain_run_net +from .runner_finetune import run_net as finetune_run_net +from .runner_finetune import test_net as test_run_net \ No newline at end of file diff --git a/zoo/PointMAE/tools/builder.py b/zoo/PointMAE/tools/builder.py new file mode 100644 index 0000000..fac1d87 --- /dev/null +++ b/zoo/PointMAE/tools/builder.py @@ -0,0 +1,164 @@ +import os, sys +# online package +import torch +# optimizer +import torch.optim as optim +# dataloader +from datasets import build_dataset_from_cfg +from models import build_model_from_cfg +# utils +from utils.logger import * +from utils.misc import * +from timm.scheduler import CosineLRScheduler + +def dataset_builder(args, config): + dataset = build_dataset_from_cfg(config._base_, config.others) + shuffle = config.others.subset == 'train' + if args.distributed: + sampler = torch.utils.data.distributed.DistributedSampler(dataset, shuffle = shuffle) + dataloader = torch.utils.data.DataLoader(dataset, batch_size = config.others.bs, + num_workers = int(args.num_workers), + drop_last = config.others.subset == 'train', + worker_init_fn = worker_init_fn, + sampler = sampler) + else: + sampler = None + dataloader = torch.utils.data.DataLoader(dataset, batch_size=config.others.bs, + shuffle = shuffle, + drop_last = config.others.subset == 'train', + num_workers = int(args.num_workers), + worker_init_fn=worker_init_fn) + return sampler, dataloader + +def model_builder(config): + model = build_model_from_cfg(config) + return model + +def build_opti_sche(base_model, config): + opti_config = config.optimizer + if opti_config.type == 'AdamW': + def add_weight_decay(model, weight_decay=1e-5, skip_list=()): + decay = [] + no_decay = [] + for name, param in model.module.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith(".bias") or 'token' in name or name in skip_list: + # print(name) + no_decay.append(param) + else: + decay.append(param) + return [ + {'params': no_decay, 'weight_decay': 0.}, + {'params': decay, 'weight_decay': weight_decay}] + param_groups = add_weight_decay(base_model, weight_decay=opti_config.kwargs.weight_decay) + optimizer = optim.AdamW(param_groups, **opti_config.kwargs) + elif opti_config.type == 'Adam': + optimizer = optim.Adam(base_model.parameters(), **opti_config.kwargs) + elif opti_config.type == 'SGD': + optimizer = optim.SGD(base_model.parameters(), nesterov=True, **opti_config.kwargs) + else: + raise NotImplementedError() + + sche_config = config.scheduler + if sche_config.type == 'LambdaLR': + scheduler = build_lambda_sche(optimizer, sche_config.kwargs) # misc.py + elif sche_config.type == 'CosLR': + scheduler = CosineLRScheduler(optimizer, + t_initial=sche_config.kwargs.epochs, + t_mul=1, + lr_min=1e-6, + decay_rate=0.1, + warmup_lr_init=1e-6, + warmup_t=sche_config.kwargs.initial_epochs, + cycle_limit=1, + t_in_epochs=True) + elif sche_config.type == 'StepLR': + scheduler = torch.optim.lr_scheduler.StepLR(optimizer, **sche_config.kwargs) + elif sche_config.type == 'function': + scheduler = None + else: + raise NotImplementedError() + + if config.get('bnmscheduler') is not None: + bnsche_config = config.bnmscheduler + if bnsche_config.type == 'Lambda': + bnscheduler = build_lambda_bnsche(base_model, bnsche_config.kwargs) # misc.py + scheduler = [scheduler, bnscheduler] + + return optimizer, scheduler + +def resume_model(base_model, args, logger = None): + ckpt_path = os.path.join(args.experiment_path, 'ckpt-last.pth') + if not os.path.exists(ckpt_path): + print_log(f'[RESUME INFO] no checkpoint file from path {ckpt_path}...', logger = logger) + return 0, 0 + print_log(f'[RESUME INFO] Loading model weights from {ckpt_path}...', logger = logger ) + + # load state dict + map_location = {'cuda:%d' % 0: 'cuda:%d' % args.local_rank} + state_dict = torch.load(ckpt_path, map_location=map_location) + # parameter resume of base model + # if args.local_rank == 0: + base_ckpt = {k.replace("module.", ""): v for k, v in state_dict['base_model'].items()} + base_model.load_state_dict(base_ckpt, strict = True) + + # parameter + start_epoch = state_dict['epoch'] + 1 + best_metrics = state_dict['best_metrics'] + if not isinstance(best_metrics, dict): + best_metrics = best_metrics.state_dict() + # print(best_metrics) + + print_log(f'[RESUME INFO] resume ckpts @ {start_epoch - 1} epoch( best_metrics = {str(best_metrics):s})', logger = logger) + return start_epoch, best_metrics + +def resume_optimizer(optimizer, args, logger = None): + ckpt_path = os.path.join(args.experiment_path, 'ckpt-last.pth') + if not os.path.exists(ckpt_path): + print_log(f'[RESUME INFO] no checkpoint file from path {ckpt_path}...', logger = logger) + return 0, 0, 0 + print_log(f'[RESUME INFO] Loading optimizer from {ckpt_path}...', logger = logger ) + # load state dict + state_dict = torch.load(ckpt_path, map_location='cpu') + # optimizer + optimizer.load_state_dict(state_dict['optimizer']) + +def save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, prefix, args, logger = None): + if args.local_rank == 0: + torch.save({ + 'base_model' : base_model.module.state_dict() if args.distributed else base_model.state_dict(), + 'optimizer' : optimizer.state_dict(), + 'epoch' : epoch, + 'metrics' : metrics.state_dict() if metrics is not None else dict(), + 'best_metrics' : best_metrics.state_dict() if best_metrics is not None else dict(), + }, os.path.join(args.experiment_path, prefix + '.pth')) + print_log(f"Save checkpoint at {os.path.join(args.experiment_path, prefix + '.pth')}", logger = logger) + +def load_model(base_model, ckpt_path, logger = None): + if not os.path.exists(ckpt_path): + raise NotImplementedError('no checkpoint file from path %s...' % ckpt_path) + print_log(f'Loading weights from {ckpt_path}...', logger = logger ) + + # load state dict + state_dict = torch.load(ckpt_path, map_location='cpu') + # parameter resume of base model + if state_dict.get('model') is not None: + base_ckpt = {k.replace("module.", ""): v for k, v in state_dict['model'].items()} + elif state_dict.get('base_model') is not None: + base_ckpt = {k.replace("module.", ""): v for k, v in state_dict['base_model'].items()} + else: + raise RuntimeError('mismatch of ckpt weight') + base_model.load_state_dict(base_ckpt, strict = True) + + epoch = -1 + if state_dict.get('epoch') is not None: + epoch = state_dict['epoch'] + if state_dict.get('metrics') is not None: + metrics = state_dict['metrics'] + if not isinstance(metrics, dict): + metrics = metrics.state_dict() + else: + metrics = 'No Metrics' + print_log(f'ckpts @ {epoch} epoch( performance = {str(metrics):s})', logger = logger) + return \ No newline at end of file diff --git a/zoo/PointMAE/tools/runner.py b/zoo/PointMAE/tools/runner.py new file mode 100644 index 0000000..9048298 --- /dev/null +++ b/zoo/PointMAE/tools/runner.py @@ -0,0 +1,113 @@ +import torch +import torch.nn as nn +import os +import json +from tools import builder +from utils import misc, dist_utils +import time +from utils.logger import * + +import cv2 +import numpy as np + + +def test_net(args, config): + logger = get_logger(args.log_name) + print_log('Tester start ... ', logger = logger) + _, test_dataloader = builder.dataset_builder(args, config.dataset.test) + + base_model = builder.model_builder(config.model) + # base_model.load_model_from_ckpt(args.ckpts) + builder.load_model(base_model, args.ckpts, logger = logger) + + if args.use_gpu: + base_model.to(args.local_rank) + + # DDP + if args.distributed: + raise NotImplementedError() + + test(base_model, test_dataloader, args, config, logger=logger) + + +# visualization +def test(base_model, test_dataloader, args, config, logger = None): + + base_model.eval() # set model to eval mode + target = './vis' + useful_cate = [ + "02691156", #plane + "04379243", #table + "03790512", #motorbike + "03948459", #pistol + "03642806", #laptop + "03467517", #guitar + "03261776", #earphone + "03001627", #chair + "02958343", #car + "04090263", #rifle + "03759954", # microphone + ] + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + # import pdb; pdb.set_trace() + if taxonomy_ids[0] not in useful_cate: + continue + if taxonomy_ids[0] == "02691156": + a, b= 90, 135 + elif taxonomy_ids[0] == "04379243": + a, b = 30, 30 + elif taxonomy_ids[0] == "03642806": + a, b = 30, -45 + elif taxonomy_ids[0] == "03467517": + a, b = 0, 90 + elif taxonomy_ids[0] == "03261776": + a, b = 0, 75 + elif taxonomy_ids[0] == "03001627": + a, b = 30, -45 + else: + a, b = 0, 0 + + + dataset_name = config.dataset.test._base_.NAME + if dataset_name == 'ShapeNet': + points = data.cuda() + else: + raise NotImplementedError(f'Train phase do not support {dataset_name}') + + # dense_points, vis_points = base_model(points, vis=True) + dense_points, vis_points, centers= base_model(points, vis=True) + final_image = [] + data_path = f'./vis/{taxonomy_ids[0]}_{idx}' + if not os.path.exists(data_path): + os.makedirs(data_path) + + points = points.squeeze().detach().cpu().numpy() + np.savetxt(os.path.join(data_path,'gt.txt'), points, delimiter=';') + points = misc.get_ptcloud_img(points,a,b) + final_image.append(points[150:650,150:675,:]) + + # centers = centers.squeeze().detach().cpu().numpy() + # np.savetxt(os.path.join(data_path,'center.txt'), centers, delimiter=';') + # centers = misc.get_ptcloud_img(centers) + # final_image.append(centers) + + vis_points = vis_points.squeeze().detach().cpu().numpy() + np.savetxt(os.path.join(data_path, 'vis.txt'), vis_points, delimiter=';') + vis_points = misc.get_ptcloud_img(vis_points,a,b) + + final_image.append(vis_points[150:650,150:675,:]) + + dense_points = dense_points.squeeze().detach().cpu().numpy() + np.savetxt(os.path.join(data_path,'dense_points.txt'), dense_points, delimiter=';') + dense_points = misc.get_ptcloud_img(dense_points,a,b) + final_image.append(dense_points[150:650,150:675,:]) + + img = np.concatenate(final_image, axis=1) + img_path = os.path.join(data_path, f'plot.jpg') + cv2.imwrite(img_path, img) + + if idx > 1500: + break + + return diff --git a/zoo/PointMAE/tools/runner_finetune.py b/zoo/PointMAE/tools/runner_finetune.py new file mode 100644 index 0000000..fc9a115 --- /dev/null +++ b/zoo/PointMAE/tools/runner_finetune.py @@ -0,0 +1,461 @@ +import torch +import torch.nn as nn +from tools import builder +from utils import misc, dist_utils +import time +from utils.logger import * +from utils.AverageMeter import AverageMeter + +import numpy as np +from datasets import data_transforms +from pointnet2_ops import pointnet2_utils +from torchvision import transforms + + +train_transforms = transforms.Compose( + [ + # data_transforms.PointcloudScale(), + # data_transforms.PointcloudRotate(), + # data_transforms.PointcloudTranslate(), + # data_transforms.PointcloudJitter(), + # data_transforms.PointcloudRandomInputDropout(), + # data_transforms.RandomHorizontalFlip(), + data_transforms.PointcloudScaleAndTranslate(), + ] +) + +test_transforms = transforms.Compose( + [ + # data_transforms.PointcloudScale(), + # data_transforms.PointcloudRotate(), + # data_transforms.PointcloudTranslate(), + data_transforms.PointcloudScaleAndTranslate(), + ] +) + + +class Acc_Metric: + def __init__(self, acc = 0.): + if type(acc).__name__ == 'dict': + self.acc = acc['acc'] + elif type(acc).__name__ == 'Acc_Metric': + self.acc = acc.acc + else: + self.acc = acc + + def better_than(self, other): + if self.acc > other.acc: + return True + else: + return False + + def state_dict(self): + _dict = dict() + _dict['acc'] = self.acc + return _dict + +def run_net(args, config, train_writer=None, val_writer=None): + logger = get_logger(args.log_name) + # build dataset + (train_sampler, train_dataloader), (_, test_dataloader),= builder.dataset_builder(args, config.dataset.train), \ + builder.dataset_builder(args, config.dataset.val) + # build model + base_model = builder.model_builder(config.model) + + # parameter setting + start_epoch = 0 + best_metrics = Acc_Metric(0.) + best_metrics_vote = Acc_Metric(0.) + metrics = Acc_Metric(0.) + + # resume ckpts + if args.resume: + start_epoch, best_metric = builder.resume_model(base_model, args, logger = logger) + best_metrics = Acc_Metric(best_metrics) + else: + if args.ckpts is not None: + base_model.load_model_from_ckpt(args.ckpts) + else: + print_log('Training from scratch', logger = logger) + + if args.use_gpu: + base_model.to(args.local_rank) + # DDP + if args.distributed: + # Sync BN + if args.sync_bn: + base_model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(base_model) + print_log('Using Synchronized BatchNorm ...', logger = logger) + base_model = nn.parallel.DistributedDataParallel(base_model, device_ids=[args.local_rank % torch.cuda.device_count()]) + print_log('Using Distributed Data parallel ...' , logger = logger) + else: + print_log('Using Data parallel ...' , logger = logger) + base_model = nn.DataParallel(base_model).cuda() + # optimizer & scheduler + optimizer, scheduler = builder.build_opti_sche(base_model, config) + + if args.resume: + builder.resume_optimizer(optimizer, args, logger = logger) + + # trainval + # training + base_model.zero_grad() + for epoch in range(start_epoch, config.max_epoch + 1): + if args.distributed: + train_sampler.set_epoch(epoch) + base_model.train() + + epoch_start_time = time.time() + batch_start_time = time.time() + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter(['loss', 'acc']) + num_iter = 0 + base_model.train() # set model to training mode + n_batches = len(train_dataloader) + + npoints = config.npoints + for idx, (taxonomy_ids, model_ids, data) in enumerate(train_dataloader): + num_iter += 1 + n_itr = epoch * n_batches + idx + + data_time.update(time.time() - batch_start_time) + + points = data[0].cuda() + label = data[1].cuda() + + if npoints == 1024: + point_all = 1200 + elif npoints == 2048: + point_all = 2400 + elif npoints == 4096: + point_all = 4800 + elif npoints == 8192: + point_all = 8192 + else: + raise NotImplementedError() + + if points.size(1) < point_all: + point_all = points.size(1) + + fps_idx = pointnet2_utils.furthest_point_sample(points, point_all) # (B, npoint) + fps_idx = fps_idx[:, np.random.choice(point_all, npoints, False)] + points = pointnet2_utils.gather_operation(points.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + # import pdb; pdb.set_trace() + points = train_transforms(points) + + ret = base_model(points) + + loss, acc = base_model.module.get_loss_acc(ret, label) + + _loss = loss + + _loss.backward() + + # forward + if num_iter == config.step_per_update: + if config.get('grad_norm_clip') is not None: + torch.nn.utils.clip_grad_norm_(base_model.parameters(), config.grad_norm_clip, norm_type=2) + num_iter = 0 + optimizer.step() + base_model.zero_grad() + + if args.distributed: + loss = dist_utils.reduce_tensor(loss, args) + acc = dist_utils.reduce_tensor(acc, args) + losses.update([loss.item(), acc.item()]) + else: + losses.update([loss.item(), acc.item()]) + + + if args.distributed: + torch.cuda.synchronize() + + + if train_writer is not None: + train_writer.add_scalar('Loss/Batch/Loss', loss.item(), n_itr) + train_writer.add_scalar('Loss/Batch/TrainAcc', acc.item(), n_itr) + train_writer.add_scalar('Loss/Batch/LR', optimizer.param_groups[0]['lr'], n_itr) + + + batch_time.update(time.time() - batch_start_time) + batch_start_time = time.time() + + # if idx % 10 == 0: + # print_log('[Epoch %d/%d][Batch %d/%d] BatchTime = %.3f (s) DataTime = %.3f (s) Loss+Acc = %s lr = %.6f' % + # (epoch, config.max_epoch, idx + 1, n_batches, batch_time.val(), data_time.val(), + # ['%.4f' % l for l in losses.val()], optimizer.param_groups[0]['lr']), logger = logger) + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + epoch_end_time = time.time() + + if train_writer is not None: + train_writer.add_scalar('Loss/Epoch/Loss', losses.avg(0), epoch) + + print_log('[Training] EPOCH: %d EpochTime = %.3f (s) Losses = %s lr = %.6f' % + (epoch, epoch_end_time - epoch_start_time, ['%.4f' % l for l in losses.avg()],optimizer.param_groups[0]['lr']), logger = logger) + + if epoch % args.val_freq == 0 and epoch != 0: + # Validate the current model + metrics = validate(base_model, test_dataloader, epoch, val_writer, args, config, logger=logger) + + better = metrics.better_than(best_metrics) + # Save ckeckpoints + if better: + best_metrics = metrics + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-best', args, logger = logger) + print_log("--------------------------------------------------------------------------------------------", logger=logger) + if args.vote: + if metrics.acc > 92.1 or (better and metrics.acc > 91): + metrics_vote = validate_vote(base_model, test_dataloader, epoch, val_writer, args, config, logger=logger) + if metrics_vote.better_than(best_metrics_vote): + best_metrics_vote = metrics_vote + print_log( + "****************************************************************************************", + logger=logger) + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics_vote, 'ckpt-best_vote', args, logger = logger) + + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-last', args, logger = logger) + # if (config.max_epoch - epoch) < 10: + # builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, f'ckpt-epoch-{epoch:03d}', args, logger = logger) + if train_writer is not None: + train_writer.close() + if val_writer is not None: + val_writer.close() + +def validate(base_model, test_dataloader, epoch, val_writer, args, config, logger = None): + # print_log(f"[VALIDATION] Start validating epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + + logits = base_model(points) + target = label.view(-1) + + pred = logits.argmax(-1).view(-1) + + test_pred.append(pred.detach()) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + print_log('[Validation] EPOCH: %d acc = %.4f' % (epoch, acc), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC', acc, epoch) + + return Acc_Metric(acc) + + +def validate_vote(base_model, test_dataloader, epoch, val_writer, args, config, logger = None, times = 10): + print_log(f"[VALIDATION_VOTE] epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points_raw = data[0].cuda() + label = data[1].cuda() + if npoints == 1024: + point_all = 1200 + elif npoints == 4096: + point_all = 4800 + elif npoints == 8192: + point_all = 8192 + else: + raise NotImplementedError() + + if points_raw.size(1) < point_all: + point_all = points_raw.size(1) + + fps_idx_raw = pointnet2_utils.furthest_point_sample(points_raw, point_all) # (B, npoint) + local_pred = [] + + for kk in range(times): + fps_idx = fps_idx_raw[:, np.random.choice(point_all, npoints, False)] + points = pointnet2_utils.gather_operation(points_raw.transpose(1, 2).contiguous(), + fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + + points = test_transforms(points) + + logits = base_model(points) + target = label.view(-1) + + local_pred.append(logits.detach().unsqueeze(0)) + + pred = torch.cat(local_pred, dim=0).mean(0) + _, pred_choice = torch.max(pred, -1) + + + test_pred.append(pred_choice) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + print_log('[Validation_vote] EPOCH: %d acc_vote = %.4f' % (epoch, acc), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC_vote', acc, epoch) + + return Acc_Metric(acc) + + + +def test_net(args, config): + logger = get_logger(args.log_name) + print_log('Tester start ... ', logger = logger) + _, test_dataloader = builder.dataset_builder(args, config.dataset.test) + base_model = builder.model_builder(config.model) + # load checkpoints + builder.load_model(base_model, args.ckpts, logger = logger) # for finetuned transformer + # base_model.load_model_from_ckpt(args.ckpts) # for BERT + if args.use_gpu: + base_model.to(args.local_rank) + + # DDP + if args.distributed: + raise NotImplementedError() + + test(base_model, test_dataloader, args, config, logger=logger) + +def test(base_model, test_dataloader, args, config, logger = None): + + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + + logits = base_model(points) + target = label.view(-1) + + pred = logits.argmax(-1).view(-1) + + test_pred.append(pred.detach()) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + print_log('[TEST] acc = %.4f' % acc, logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + print_log(f"[TEST_VOTE]", logger = logger) + acc = 0. + for time in range(1, 300): + this_acc = test_vote(base_model, test_dataloader, 1, None, args, config, logger=logger, times=10) + if acc < this_acc: + acc = this_acc + print_log('[TEST_VOTE_time %d] acc = %.4f, best acc = %.4f' % (time, this_acc, acc), logger=logger) + print_log('[TEST_VOTE] acc = %.4f' % acc, logger=logger) + +def test_vote(base_model, test_dataloader, epoch, val_writer, args, config, logger = None, times = 10): + + base_model.eval() # set model to eval mode + + test_pred = [] + test_label = [] + npoints = config.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points_raw = data[0].cuda() + label = data[1].cuda() + if npoints == 1024: + point_all = 1200 + elif npoints == 4096: + point_all = 4800 + elif npoints == 8192: + point_all = 8192 + else: + raise NotImplementedError() + + if points_raw.size(1) < point_all: + point_all = points_raw.size(1) + + fps_idx_raw = pointnet2_utils.furthest_point_sample(points_raw, point_all) # (B, npoint) + local_pred = [] + + for kk in range(times): + fps_idx = fps_idx_raw[:, np.random.choice(point_all, npoints, False)] + points = pointnet2_utils.gather_operation(points_raw.transpose(1, 2).contiguous(), + fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + + points = test_transforms(points) + + logits = base_model(points) + target = label.view(-1) + + local_pred.append(logits.detach().unsqueeze(0)) + + pred = torch.cat(local_pred, dim=0).mean(0) + _, pred_choice = torch.max(pred, -1) + + + test_pred.append(pred_choice) + test_label.append(target.detach()) + + test_pred = torch.cat(test_pred, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + test_pred = dist_utils.gather_tensor(test_pred, args) + test_label = dist_utils.gather_tensor(test_label, args) + + acc = (test_pred == test_label).sum() / float(test_label.size(0)) * 100. + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC_vote', acc, epoch) + # print_log('[TEST] acc = %.4f' % acc, logger=logger) + + return acc diff --git a/zoo/PointMAE/tools/runner_pretrain.py b/zoo/PointMAE/tools/runner_pretrain.py new file mode 100644 index 0000000..25853fd --- /dev/null +++ b/zoo/PointMAE/tools/runner_pretrain.py @@ -0,0 +1,264 @@ +import torch +import torch.nn as nn +import os +import json +from tools import builder +from utils import misc, dist_utils +import time +from utils.logger import * +from utils.AverageMeter import AverageMeter + +from sklearn.svm import LinearSVC +import numpy as np +from torchvision import transforms +from datasets import data_transforms +from pointnet2_ops import pointnet2_utils + +train_transforms = transforms.Compose( + [ + # data_transforms.PointcloudScale(), + # data_transforms.PointcloudRotate(), + # data_transforms.PointcloudRotatePerturbation(), + # data_transforms.PointcloudTranslate(), + # data_transforms.PointcloudJitter(), + # data_transforms.PointcloudRandomInputDropout(), + data_transforms.PointcloudScaleAndTranslate(), + ] +) + +class Acc_Metric: + def __init__(self, acc = 0.): + if type(acc).__name__ == 'dict': + self.acc = acc['acc'] + else: + self.acc = acc + + def better_than(self, other): + if self.acc > other.acc: + return True + else: + return False + + def state_dict(self): + _dict = dict() + _dict['acc'] = self.acc + return _dict + + +def evaluate_svm(train_features, train_labels, test_features, test_labels): + clf = LinearSVC() + clf.fit(train_features, train_labels) + pred = clf.predict(test_features) + return np.sum(test_labels == pred) * 1. / pred.shape[0] + +def run_net(args, config, train_writer=None, val_writer=None): + logger = get_logger(args.log_name) + # build dataset + (train_sampler, train_dataloader), (_, test_dataloader),= builder.dataset_builder(args, config.dataset.train), \ + builder.dataset_builder(args, config.dataset.val) + (_, extra_train_dataloader) = builder.dataset_builder(args, config.dataset.extra_train) if config.dataset.get('extra_train') else (None, None) + # build model + base_model = builder.model_builder(config.model) + if args.use_gpu: + base_model.to(args.local_rank) + + # from IPython import embed; embed() + + # parameter setting + start_epoch = 0 + best_metrics = Acc_Metric(0.) + metrics = Acc_Metric(0.) + + # resume ckpts + if args.resume: + start_epoch, best_metric = builder.resume_model(base_model, args, logger = logger) + best_metrics = Acc_Metric(best_metric) + elif args.start_ckpts is not None: + builder.load_model(base_model, args.start_ckpts, logger = logger) + + # DDP + if args.distributed: + # Sync BN + if args.sync_bn: + base_model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(base_model) + print_log('Using Synchronized BatchNorm ...', logger = logger) + base_model = nn.parallel.DistributedDataParallel(base_model, device_ids=[args.local_rank % torch.cuda.device_count()], find_unused_parameters=True) + print_log('Using Distributed Data parallel ...' , logger = logger) + else: + print_log('Using Data parallel ...' , logger = logger) + base_model = nn.DataParallel(base_model).cuda() + # optimizer & scheduler + optimizer, scheduler = builder.build_opti_sche(base_model, config) + + if args.resume: + builder.resume_optimizer(optimizer, args, logger = logger) + + # trainval + # training + base_model.zero_grad() + for epoch in range(start_epoch, config.max_epoch + 1): + if args.distributed: + train_sampler.set_epoch(epoch) + base_model.train() + + epoch_start_time = time.time() + batch_start_time = time.time() + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter(['Loss']) + + num_iter = 0 + + base_model.train() # set model to training mode + n_batches = len(train_dataloader) + for idx, (taxonomy_ids, model_ids, data) in enumerate(train_dataloader): + num_iter += 1 + n_itr = epoch * n_batches + idx + + data_time.update(time.time() - batch_start_time) + npoints = config.dataset.train.others.npoints + dataset_name = config.dataset.train._base_.NAME + if dataset_name == 'ShapeNet': + points = data.cuda() + elif dataset_name == 'ModelNet': + points = data[0].cuda() + points = misc.fps(points, npoints) + else: + raise NotImplementedError(f'Train phase do not support {dataset_name}') + + assert points.size(1) == npoints + points = train_transforms(points) + loss = base_model(points) + try: + loss.backward() + # print("Using one GPU") + except: + loss = loss.mean() + loss.backward() + # print("Using multi GPUs") + + # forward + if num_iter == config.step_per_update: + num_iter = 0 + optimizer.step() + base_model.zero_grad() + + if args.distributed: + loss = dist_utils.reduce_tensor(loss, args) + losses.update([loss.item()*1000]) + else: + losses.update([loss.item()*1000]) + + + if args.distributed: + torch.cuda.synchronize() + + + if train_writer is not None: + train_writer.add_scalar('Loss/Batch/Loss', loss.item(), n_itr) + train_writer.add_scalar('Loss/Batch/LR', optimizer.param_groups[0]['lr'], n_itr) + + + batch_time.update(time.time() - batch_start_time) + batch_start_time = time.time() + + if idx % 20 == 0: + print_log('[Epoch %d/%d][Batch %d/%d] BatchTime = %.3f (s) DataTime = %.3f (s) Losses = %s lr = %.6f' % + (epoch, config.max_epoch, idx + 1, n_batches, batch_time.val(), data_time.val(), + ['%.4f' % l for l in losses.val()], optimizer.param_groups[0]['lr']), logger = logger) + if isinstance(scheduler, list): + for item in scheduler: + item.step(epoch) + else: + scheduler.step(epoch) + epoch_end_time = time.time() + + if train_writer is not None: + train_writer.add_scalar('Loss/Epoch/Loss_1', losses.avg(0), epoch) + print_log('[Training] EPOCH: %d EpochTime = %.3f (s) Losses = %s lr = %.6f' % + (epoch, epoch_end_time - epoch_start_time, ['%.4f' % l for l in losses.avg()], + optimizer.param_groups[0]['lr']), logger = logger) + + # if epoch % args.val_freq == 0 and epoch != 0: + # # Validate the current model + # metrics = validate(base_model, extra_train_dataloader, test_dataloader, epoch, val_writer, args, config, logger=logger) + # + # # Save ckeckpoints + # if metrics.better_than(best_metrics): + # best_metrics = metrics + # builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-best', args, logger = logger) + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, 'ckpt-last', args, logger = logger) + if epoch % 25 ==0 and epoch >=250: + builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, f'ckpt-epoch-{epoch:03d}', args, + logger=logger) + # if (config.max_epoch - epoch) < 10: + # builder.save_checkpoint(base_model, optimizer, epoch, metrics, best_metrics, f'ckpt-epoch-{epoch:03d}', args, logger = logger) + if train_writer is not None: + train_writer.close() + if val_writer is not None: + val_writer.close() + +def validate(base_model, extra_train_dataloader, test_dataloader, epoch, val_writer, args, config, logger = None): + print_log(f"[VALIDATION] Start validating epoch {epoch}", logger = logger) + base_model.eval() # set model to eval mode + + test_features = [] + test_label = [] + + train_features = [] + train_label = [] + npoints = config.dataset.train.others.npoints + with torch.no_grad(): + for idx, (taxonomy_ids, model_ids, data) in enumerate(extra_train_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + + assert points.size(1) == npoints + feature = base_model(points, noaug=True) + target = label.view(-1) + + train_features.append(feature.detach()) + train_label.append(target.detach()) + + for idx, (taxonomy_ids, model_ids, data) in enumerate(test_dataloader): + points = data[0].cuda() + label = data[1].cuda() + + points = misc.fps(points, npoints) + assert points.size(1) == npoints + feature = base_model(points, noaug=True) + target = label.view(-1) + + test_features.append(feature.detach()) + test_label.append(target.detach()) + + + train_features = torch.cat(train_features, dim=0) + train_label = torch.cat(train_label, dim=0) + test_features = torch.cat(test_features, dim=0) + test_label = torch.cat(test_label, dim=0) + + if args.distributed: + train_features = dist_utils.gather_tensor(train_features, args) + train_label = dist_utils.gather_tensor(train_label, args) + test_features = dist_utils.gather_tensor(test_features, args) + test_label = dist_utils.gather_tensor(test_label, args) + + svm_acc = evaluate_svm(train_features.data.cpu().numpy(), train_label.data.cpu().numpy(), test_features.data.cpu().numpy(), test_label.data.cpu().numpy()) + + print_log('[Validation] EPOCH: %d acc = %.4f' % (epoch,svm_acc), logger=logger) + + if args.distributed: + torch.cuda.synchronize() + + # Add testing results to TensorBoard + if val_writer is not None: + val_writer.add_scalar('Metric/ACC', svm_acc, epoch) + + return Acc_Metric(svm_acc) + + +def test_net(): + pass \ No newline at end of file diff --git a/zoo/PointMAE/utils/AverageMeter.py b/zoo/PointMAE/utils/AverageMeter.py new file mode 100644 index 0000000..5118f43 --- /dev/null +++ b/zoo/PointMAE/utils/AverageMeter.py @@ -0,0 +1,42 @@ + +class AverageMeter(object): + def __init__(self, items=None): + self.items = items + self.n_items = 1 if items is None else len(items) + self.reset() + + def reset(self): + self._val = [0] * self.n_items + self._sum = [0] * self.n_items + self._count = [0] * self.n_items + + def update(self, values): + if type(values).__name__ == 'list': + for idx, v in enumerate(values): + self._val[idx] = v + self._sum[idx] += v + self._count[idx] += 1 + else: + self._val[0] = values + self._sum[0] += values + self._count[0] += 1 + + def val(self, idx=None): + if idx is None: + return self._val[0] if self.items is None else [self._val[i] for i in range(self.n_items)] + else: + return self._val[idx] + + def count(self, idx=None): + if idx is None: + return self._count[0] if self.items is None else [self._count[i] for i in range(self.n_items)] + else: + return self._count[idx] + + def avg(self, idx=None): + if idx is None: + return self._sum[0] / self._count[0] if self.items is None else [ + self._sum[i] / self._count[i] for i in range(self.n_items) + ] + else: + return self._sum[idx] / self._count[idx] \ No newline at end of file diff --git a/zoo/PointMAE/utils/checkpoint.py b/zoo/PointMAE/utils/checkpoint.py new file mode 100644 index 0000000..41dc456 --- /dev/null +++ b/zoo/PointMAE/utils/checkpoint.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import copy +import logging +import os +from collections import defaultdict +import torch +import torch.nn as nn + +from typing import Any +from typing import Optional, List, Dict, NamedTuple, Tuple, Iterable + +from termcolor import colored + +def get_missing_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the model but not found in a checkpoint. + Args: + keys (list[str]): List of keys that were not found in the checkpoint. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "Some model parameters or buffers are not found in the checkpoint:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "blue") for k, v in groups.items() + ) + return msg + + +def get_unexpected_parameters_message(keys: List[str]) -> str: + """ + Get a logging-friendly message to report parameter names (keys) that are in + the checkpoint but not found in the model. + Args: + keys (list[str]): List of keys that were not found in the model. + Returns: + str: message. + """ + groups = _group_checkpoint_keys(keys) + msg = "The checkpoint state_dict contains keys that are not used by the model:\n" + msg += "\n".join( + " " + colored(k + _group_to_str(v), "magenta") for k, v in groups.items() + ) + return msg + + +def _strip_prefix_if_present(state_dict: Dict[str, Any], prefix: str) -> None: + """ + Strip the prefix in metadata, if any. + Args: + state_dict (OrderedDict): a state-dict to be loaded to the model. + prefix (str): prefix. + """ + keys = sorted(state_dict.keys()) + if not all(len(key) == 0 or key.startswith(prefix) for key in keys): + return + + for key in keys: + newkey = key[len(prefix):] + state_dict[newkey] = state_dict.pop(key) + + # also strip the prefix in metadata, if any.. + try: + metadata = state_dict._metadata # pyre-ignore + except AttributeError: + pass + else: + for key in list(metadata.keys()): + # for the metadata dict, the key can be: + # '': for the DDP module, which we want to remove. + # 'module': for the actual model. + # 'module.xx.xx': for the rest. + + if len(key) == 0: + continue + newkey = key[len(prefix):] + metadata[newkey] = metadata.pop(key) + + +def _group_checkpoint_keys(keys: List[str]) -> Dict[str, List[str]]: + """ + Group keys based on common prefixes. A prefix is the string up to the final + "." in each key. + Args: + keys (list[str]): list of parameter names, i.e. keys in the model + checkpoint dict. + Returns: + dict[list]: keys with common prefixes are grouped into lists. + """ + groups = defaultdict(list) + for key in keys: + pos = key.rfind(".") + if pos >= 0: + head, tail = key[:pos], [key[pos + 1:]] + else: + head, tail = key, [] + groups[head].extend(tail) + return groups + + +def _group_to_str(group: List[str]) -> str: + """ + Format a group of parameter name suffixes into a loggable string. + Args: + group (list[str]): list of parameter name suffixes. + Returns: + str: formated string. + """ + if len(group) == 0: + return "" + + if len(group) == 1: + return "." + group[0] + + return ".{" + ", ".join(group) + "}" + + +def _named_modules_with_dup( + model: nn.Module, prefix: str = "" +) -> Iterable[Tuple[str, nn.Module]]: + """ + The same as `model.named_modules()`, except that it includes + duplicated modules that have more than one name. + """ + yield prefix, model + for name, module in model._modules.items(): # pyre-ignore + if module is None: + continue + submodule_prefix = prefix + ("." if prefix else "") + name + yield from _named_modules_with_dup(module, submodule_prefix) \ No newline at end of file diff --git a/zoo/PointMAE/utils/config.py b/zoo/PointMAE/utils/config.py new file mode 100644 index 0000000..8c86d76 --- /dev/null +++ b/zoo/PointMAE/utils/config.py @@ -0,0 +1,63 @@ +import yaml +from easydict import EasyDict +import os +from .logger import print_log + +def log_args_to_file(args, pre='args', logger=None): + for key, val in args.__dict__.items(): + print_log(f'{pre}.{key} : {val}', logger = logger) + +def log_config_to_file(cfg, pre='cfg', logger=None): + for key, val in cfg.items(): + if isinstance(cfg[key], EasyDict): + print_log(f'{pre}.{key} = edict()', logger = logger) + log_config_to_file(cfg[key], pre=pre + '.' + key, logger=logger) + continue + print_log(f'{pre}.{key} : {val}', logger = logger) + +def merge_new_config(config, new_config): + for key, val in new_config.items(): + if not isinstance(val, dict): + if key == '_base_': + with open(new_config['_base_'], 'r') as f: + try: + val = yaml.load(f, Loader=yaml.FullLoader) + except: + val = yaml.load(f) + config[key] = EasyDict() + merge_new_config(config[key], val) + else: + config[key] = val + continue + if key not in config: + config[key] = EasyDict() + merge_new_config(config[key], val) + return config + +def cfg_from_yaml_file(cfg_file): + config = EasyDict() + with open(cfg_file, 'r') as f: + try: + new_config = yaml.load(f, Loader=yaml.FullLoader) + except: + new_config = yaml.load(f) + merge_new_config(config=config, new_config=new_config) + return config + +def get_config(args, logger=None): + if args.resume: + cfg_path = os.path.join(args.experiment_path, 'config.yaml') + if not os.path.exists(cfg_path): + print_log("Failed to resume", logger = logger) + raise FileNotFoundError() + print_log(f'Resume yaml from {cfg_path}', logger = logger) + args.config = cfg_path + config = cfg_from_yaml_file(args.config) + if not args.resume and args.local_rank == 0: + save_experiment_config(args, config, logger) + return config + +def save_experiment_config(args, config, logger = None): + config_path = os.path.join(args.experiment_path, 'config.yaml') + os.system('cp %s %s' % (args.config, config_path)) + print_log(f'Copy the Config file from {args.config} to {config_path}',logger = logger ) \ No newline at end of file diff --git a/zoo/PointMAE/utils/dist_utils.py b/zoo/PointMAE/utils/dist_utils.py new file mode 100644 index 0000000..d870fec --- /dev/null +++ b/zoo/PointMAE/utils/dist_utils.py @@ -0,0 +1,54 @@ +import os + +import torch +import torch.multiprocessing as mp +from torch import distributed as dist + + + +def init_dist(launcher, backend='nccl', **kwargs): + if mp.get_start_method(allow_none=True) is None: + mp.set_start_method('spawn') + if launcher == 'pytorch': + _init_dist_pytorch(backend, **kwargs) + else: + raise ValueError(f'Invalid launcher type: {launcher}') + + +def _init_dist_pytorch(backend, **kwargs): + # TODO: use local_rank instead of rank % num_gpus + rank = int(os.environ['RANK']) + num_gpus = torch.cuda.device_count() + torch.cuda.set_device(rank % num_gpus) + dist.init_process_group(backend=backend, **kwargs) + print(f'init distributed in rank {torch.distributed.get_rank()}') + + +def get_dist_info(): + if dist.is_available(): + initialized = dist.is_initialized() + else: + initialized = False + if initialized: + rank = dist.get_rank() + world_size = dist.get_world_size() + else: + rank = 0 + world_size = 1 + return rank, world_size + + +def reduce_tensor(tensor, args): + ''' + for acc kind, get the mean in each gpu + ''' + rt = tensor.clone() + torch.distributed.all_reduce(rt, op=torch.distributed.ReduceOp.SUM) + rt /= args.world_size + return rt + +def gather_tensor(tensor, args): + output_tensors = [tensor.clone() for _ in range(args.world_size)] + torch.distributed.all_gather(output_tensors, tensor) + concat = torch.cat(output_tensors, dim=0) + return concat diff --git a/zoo/PointMAE/utils/logger.py b/zoo/PointMAE/utils/logger.py new file mode 100644 index 0000000..847c1c7 --- /dev/null +++ b/zoo/PointMAE/utils/logger.py @@ -0,0 +1,127 @@ +import logging +import torch.distributed as dist + +logger_initialized = {} + +def get_root_logger(log_file=None, log_level=logging.INFO, name='main'): + """Get root logger and add a keyword filter to it. + 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., "mmdet3d". + Args: + log_file (str, optional): File path of log. Defaults to None. + log_level (int, optional): The level of logger. + Defaults to logging.INFO. + name (str, optional): The name of the root logger, also used as a + filter keyword. Defaults to 'mmdet3d'. + Returns: + :obj:`logging.Logger`: The obtained logger + """ + logger = get_logger(name=name, log_file=log_file, log_level=log_level) + # add a logging filter + logging_filter = logging.Filter(name) + logging_filter.filter = lambda record: record.find(name) != -1 + + return logger + + +def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): + """Initialize and get a logger by name. + If the logger has not been initialized, this method will initialize the + logger by adding one or two handlers, otherwise the initialized logger will + be directly returned. During initialization, a StreamHandler will always be + added. If `log_file` is specified and the process rank is 0, a FileHandler + will also be added. + Args: + name (str): Logger name. + log_file (str | None): The log filename. If specified, a FileHandler + will be added to the logger. + log_level (int): The logger level. Note that only the process of + rank 0 is affected, and other processes will set the level to + "Error" thus be silent most of the time. + file_mode (str): The file mode used in opening log file. + Defaults to 'w'. + Returns: + logging.Logger: The expected logger. + """ + logger = logging.getLogger(name) + if name in logger_initialized: + return logger + # handle hierarchical names + # e.g., logger "a" is initialized, then logger "a.b" will skip the + # initialization since it is a child of "a". + for logger_name in logger_initialized: + if name.startswith(logger_name): + return logger + + # handle duplicate logs to the console + # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler (NOTSET) + # to the root logger. As logger.propagate is True by default, this root + # level handler causes logging messages from rank>0 processes to + # unexpectedly show up on the console, creating much unwanted clutter. + # To fix this issue, we set the root logger's StreamHandler, if any, to log + # at the ERROR level. + for handler in logger.root.handlers: + if type(handler) is logging.StreamHandler: + handler.setLevel(logging.ERROR) + + stream_handler = logging.StreamHandler() + handlers = [stream_handler] + + if dist.is_available() and dist.is_initialized(): + rank = dist.get_rank() + else: + rank = 0 + + # only rank 0 will add a FileHandler + if rank == 0 and log_file is not None: + # Here, the default behaviour of the official logger is 'a'. Thus, we + # provide an interface to change the file mode to the default + # behaviour. + file_handler = logging.FileHandler(log_file, file_mode) + handlers.append(file_handler) + + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + for handler in handlers: + handler.setFormatter(formatter) + handler.setLevel(log_level) + logger.addHandler(handler) + + if rank == 0: + logger.setLevel(log_level) + else: + logger.setLevel(logging.ERROR) + + logger_initialized[name] = True + + + return logger + + +def print_log(msg, logger=None, level=logging.INFO): + """Print a log message. + Args: + msg (str): The message to be logged. + logger (logging.Logger | str | None): The logger to be used. + Some special loggers are: + - "silent": no message will be printed. + - other str: the logger obtained with `get_root_logger(logger)`. + - None: The `print()` method will be used to print log messages. + level (int): Logging level. Only available when `logger` is a Logger + object or "root". + """ + if logger is None: + print(msg) + elif isinstance(logger, logging.Logger): + logger.log(level, msg) + elif logger == 'silent': + pass + elif isinstance(logger, str): + _logger = get_logger(logger) + _logger.log(level, msg) + else: + raise TypeError( + 'logger should be either a logging.Logger object, str, ' + f'"silent" or None, but got {type(logger)}') \ No newline at end of file diff --git a/zoo/PointMAE/utils/misc.py b/zoo/PointMAE/utils/misc.py new file mode 100644 index 0000000..6cf8acb --- /dev/null +++ b/zoo/PointMAE/utils/misc.py @@ -0,0 +1,248 @@ +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +import random +import torch +import torch.nn as nn +import torch.nn.functional as F +import os +from collections import abc +from pointnet2_ops import pointnet2_utils + + +def fps(data, number): + ''' + data B N 3 + number int + ''' + fps_idx = pointnet2_utils.furthest_point_sample(data, number) + fps_data = pointnet2_utils.gather_operation(data.transpose(1, 2).contiguous(), fps_idx).transpose(1,2).contiguous() + return fps_data + + +def worker_init_fn(worker_id): + np.random.seed(np.random.get_state()[1][0] + worker_id) + +def build_lambda_sche(opti, config): + if config.get('decay_step') is not None: + lr_lbmd = lambda e: max(config.lr_decay ** (e / config.decay_step), config.lowest_decay) + scheduler = torch.optim.lr_scheduler.LambdaLR(opti, lr_lbmd) + else: + raise NotImplementedError() + return scheduler + +def build_lambda_bnsche(model, config): + if config.get('decay_step') is not None: + bnm_lmbd = lambda e: max(config.bn_momentum * config.bn_decay ** (e / config.decay_step), config.lowest_decay) + bnm_scheduler = BNMomentumScheduler(model, bnm_lmbd) + else: + raise NotImplementedError() + return bnm_scheduler + +def set_random_seed(seed, deterministic=False): + """Set random seed. + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + + # Speed-reproducibility tradeoff https://pytorch.org/docs/stable/notes/randomness.html + if cuda_deterministic: # slower, more reproducible + cudnn.deterministic = True + cudnn.benchmark = False + else: # faster, less reproducible + cudnn.deterministic = False + cudnn.benchmark = True + + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def is_seq_of(seq, expected_type, seq_type=None): + """Check whether it is a sequence of some type. + Args: + seq (Sequence): The sequence to be checked. + expected_type (type): Expected type of sequence items. + seq_type (type, optional): Expected sequence type. + Returns: + bool: Whether the sequence is valid. + """ + if seq_type is None: + exp_seq_type = abc.Sequence + else: + assert isinstance(seq_type, type) + exp_seq_type = seq_type + if not isinstance(seq, exp_seq_type): + return False + for item in seq: + if not isinstance(item, expected_type): + return False + return True + + +def set_bn_momentum_default(bn_momentum): + def fn(m): + if isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d)): + m.momentum = bn_momentum + return fn + +class BNMomentumScheduler(object): + + def __init__( + self, model, bn_lambda, last_epoch=-1, + setter=set_bn_momentum_default + ): + if not isinstance(model, nn.Module): + raise RuntimeError( + "Class '{}' is not a PyTorch nn Module".format( + type(model).__name__ + ) + ) + + self.model = model + self.setter = setter + self.lmbd = bn_lambda + + self.step(last_epoch + 1) + self.last_epoch = last_epoch + + def step(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + + self.last_epoch = epoch + self.model.apply(self.setter(self.lmbd(epoch))) + + def get_momentum(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + return self.lmbd(epoch) + + + +def seprate_point_cloud(xyz, num_points, crop, fixed_points = None, padding_zeros = False): + ''' + seprate point cloud: usage : using to generate the incomplete point cloud with a setted number. + ''' + _,n,c = xyz.shape + + assert n == num_points + assert c == 3 + if crop == num_points: + return xyz, None + + INPUT = [] + CROP = [] + for points in xyz: + if isinstance(crop,list): + num_crop = random.randint(crop[0],crop[1]) + else: + num_crop = crop + + points = points.unsqueeze(0) + + if fixed_points is None: + center = F.normalize(torch.randn(1,1,3),p=2,dim=-1).cuda() + else: + if isinstance(fixed_points,list): + fixed_point = random.sample(fixed_points,1)[0] + else: + fixed_point = fixed_points + center = fixed_point.reshape(1,1,3).cuda() + + distance_matrix = torch.norm(center.unsqueeze(2) - points.unsqueeze(1), p =2 ,dim = -1) # 1 1 2048 + + idx = torch.argsort(distance_matrix,dim=-1, descending=False)[0,0] # 2048 + + if padding_zeros: + input_data = points.clone() + input_data[0, idx[:num_crop]] = input_data[0,idx[:num_crop]] * 0 + + else: + input_data = points.clone()[0, idx[num_crop:]].unsqueeze(0) # 1 N 3 + + crop_data = points.clone()[0, idx[:num_crop]].unsqueeze(0) + + if isinstance(crop,list): + INPUT.append(fps(input_data,2048)) + CROP.append(fps(crop_data,2048)) + else: + INPUT.append(input_data) + CROP.append(crop_data) + + input_data = torch.cat(INPUT,dim=0)# B N 3 + crop_data = torch.cat(CROP,dim=0)# B M 3 + + return input_data.contiguous(), crop_data.contiguous() + +def get_ptcloud_img(ptcloud,roll,pitch): + fig = plt.figure(figsize=(8, 8)) + + x, z, y = ptcloud.transpose(1, 0) + ax = fig.gca(projection=Axes3D.name, adjustable='box') + ax.axis('off') + # ax.axis('scaled') + ax.view_init(roll,pitch) + max, min = np.max(ptcloud), np.min(ptcloud) + ax.set_xbound(min, max) + ax.set_ybound(min, max) + ax.set_zbound(min, max) + ax.scatter(x, y, z, zdir='z', c=y, cmap='jet') + + fig.canvas.draw() + img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + img = img.reshape(fig.canvas.get_width_height()[::-1] + (3, )) + return img + + + +def visualize_KITTI(path, data_list, titles = ['input','pred'], cmap=['bwr','autumn'], zdir='y', + xlim=(-1, 1), ylim=(-1, 1), zlim=(-1, 1) ): + fig = plt.figure(figsize=(6*len(data_list),6)) + cmax = data_list[-1][:,0].max() + + for i in range(len(data_list)): + data = data_list[i][:-2048] if i == 1 else data_list[i] + color = data[:,0] /cmax + ax = fig.add_subplot(1, len(data_list) , i + 1, projection='3d') + ax.view_init(30, -120) + b = ax.scatter(data[:, 0], data[:, 1], data[:, 2], zdir=zdir, c=color,vmin=-1,vmax=1 ,cmap = cmap[0],s=4,linewidth=0.05, edgecolors = 'black') + ax.set_title(titles[i]) + + ax.set_axis_off() + ax.set_xlim(xlim) + ax.set_ylim(ylim) + ax.set_zlim(zlim) + plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0.2, hspace=0) + if not os.path.exists(path): + os.makedirs(path) + + pic_path = path + '.png' + fig.savefig(pic_path) + + np.save(os.path.join(path, 'input.npy'), data_list[0].numpy()) + np.save(os.path.join(path, 'pred.npy'), data_list[1].numpy()) + plt.close(fig) + + +def random_dropping(pc, e): + up_num = max(64, 768 // (e//50 + 1)) + pc = pc + random_num = torch.randint(1, up_num, (1,1))[0,0] + pc = fps(pc, random_num) + padding = torch.zeros(pc.size(0), 2048 - pc.size(1), 3).to(pc.device) + pc = torch.cat([pc, padding], dim = 1) + return pc + + +def random_scale(partial, scale_range=[0.8, 1.2]): + scale = torch.rand(1).cuda() * (scale_range[1] - scale_range[0]) + scale_range[0] + return partial * scale diff --git a/zoo/PointMAE/utils/parser.py b/zoo/PointMAE/utils/parser.py new file mode 100644 index 0000000..a5fbe23 --- /dev/null +++ b/zoo/PointMAE/utils/parser.py @@ -0,0 +1,111 @@ +import os +import argparse +from pathlib import Path + +def get_args(): + parser = argparse.ArgumentParser() + parser.add_argument( + '--config', + type = str, + help = 'yaml config file') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + parser.add_argument('--num_workers', type=int, default=8) + # seed + parser.add_argument('--seed', type=int, default=0, help='random seed') + parser.add_argument( + '--deterministic', + action='store_true', + help='whether to set deterministic options for CUDNN backend.') + # bn + parser.add_argument( + '--sync_bn', + action='store_true', + default=False, + help='whether to use sync bn') + # some args + parser.add_argument('--exp_name', type = str, default='default', help = 'experiment name') + parser.add_argument('--loss', type=str, default='cd1', help='loss name') + parser.add_argument('--start_ckpts', type = str, default=None, help = 'reload used ckpt path') + parser.add_argument('--ckpts', type = str, default=None, help = 'test used ckpt path') + parser.add_argument('--val_freq', type = int, default=1, help = 'test freq') + parser.add_argument( + '--vote', + action='store_true', + default=False, + help = 'vote acc') + parser.add_argument( + '--resume', + action='store_true', + default=False, + help = 'autoresume training (interrupted by accident)') + parser.add_argument( + '--test', + action='store_true', + default=False, + help = 'test mode for certain ckpt') + parser.add_argument( + '--finetune_model', + action='store_true', + default=False, + help = 'finetune modelnet with pretrained weight') + parser.add_argument( + '--scratch_model', + action='store_true', + default=False, + help = 'training modelnet from scratch') + parser.add_argument( + '--mode', + choices=['easy', 'median', 'hard', None], + default=None, + help = 'difficulty mode for shapenet') + parser.add_argument( + '--way', type=int, default=-1) + parser.add_argument( + '--shot', type=int, default=-1) + parser.add_argument( + '--fold', type=int, default=-1) + + args = parser.parse_args() + + if args.test and args.resume: + raise ValueError( + '--test and --resume cannot be both activate') + + if args.resume and args.start_ckpts is not None: + raise ValueError( + '--resume and --start_ckpts cannot be both activate') + + if args.test and args.ckpts is None: + raise ValueError( + 'ckpts shouldnt be None while test mode') + + if args.finetune_model and args.ckpts is None: + print( + 'training from scratch') + + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + if args.test: + args.exp_name = 'test_' + args.exp_name + if args.mode is not None: + args.exp_name = args.exp_name + '_' +args.mode + args.experiment_path = os.path.join('./experiments', Path(args.config).stem, Path(args.config).parent.stem, args.exp_name) + args.tfboard_path = os.path.join('./experiments', Path(args.config).stem, Path(args.config).parent.stem,'TFBoard' ,args.exp_name) + args.log_name = Path(args.config).stem + create_experiment_dir(args) + return args + +def create_experiment_dir(args): + if not os.path.exists(args.experiment_path): + os.makedirs(args.experiment_path) + print('Create experiment path successfully at %s' % args.experiment_path) + if not os.path.exists(args.tfboard_path): + os.makedirs(args.tfboard_path) + print('Create TFBoard path successfully at %s' % args.tfboard_path) + diff --git a/zoo/PointMAE/utils/registry.py b/zoo/PointMAE/utils/registry.py new file mode 100644 index 0000000..025e4ee --- /dev/null +++ b/zoo/PointMAE/utils/registry.py @@ -0,0 +1,288 @@ +import inspect +import warnings +from functools import partial +from utils import config + +class Registry: + """A registry to map strings to classes. + Registered object could be built from registry. + Example: + >>> MODELS = Registry('models') + >>> @MODELS.register_module() + >>> class ResNet: + >>> pass + >>> resnet = MODELS.build(dict(NAME='ResNet')) + Please refer to https://mmcv.readthedocs.io/en/latest/registry.html for + advanced useage. + Args: + name (str): Registry name. + build_func(func, optional): Build function to construct instance from + Registry, func:`build_from_cfg` is used if neither ``parent`` or + ``build_func`` is specified. If ``parent`` is specified and + ``build_func`` is not given, ``build_func`` will be inherited + from ``parent``. Default: None. + parent (Registry, optional): Parent registry. The class registered in + children registry could be built from parent. Default: None. + scope (str, optional): The scope of registry. It is the key to search + for children registry. If not specified, scope will be the name of + the package where class is defined, e.g. mmdet, mmcls, mmseg. + Default: None. + """ + + def __init__(self, name, build_func=None, parent=None, scope=None): + self._name = name + self._module_dict = dict() + self._children = dict() + self._scope = self.infer_scope() if scope is None else scope + + # self.build_func will be set with the following priority: + # 1. build_func + # 2. parent.build_func + # 3. build_from_cfg + if build_func is None: + if parent is not None: + self.build_func = parent.build_func + else: + self.build_func = build_from_cfg + else: + self.build_func = build_func + if parent is not None: + assert isinstance(parent, Registry) + parent._add_children(self) + self.parent = parent + else: + self.parent = None + + def __len__(self): + return len(self._module_dict) + + def __contains__(self, key): + return self.get(key) is not None + + def __repr__(self): + format_str = self.__class__.__name__ + \ + f'(name={self._name}, ' \ + f'items={self._module_dict})' + return format_str + + @staticmethod + def infer_scope(): + """Infer the scope of registry. + The name of the package where registry is defined will be returned. + Example: + # in mmdet/models/backbone/resnet.py + >>> MODELS = Registry('models') + >>> @MODELS.register_module() + >>> class ResNet: + >>> pass + The scope of ``ResNet`` will be ``mmdet``. + Returns: + scope (str): The inferred scope name. + """ + # inspect.stack() trace where this function is called, the index-2 + # indicates the frame where `infer_scope()` is called + filename = inspect.getmodule(inspect.stack()[2][0]).__name__ + split_filename = filename.split('.') + return split_filename[0] + + @staticmethod + def split_scope_key(key): + """Split scope and key. + The first scope will be split from key. + Examples: + >>> Registry.split_scope_key('mmdet.ResNet') + 'mmdet', 'ResNet' + >>> Registry.split_scope_key('ResNet') + None, 'ResNet' + Return: + scope (str, None): The first scope. + key (str): The remaining key. + """ + split_index = key.find('.') + if split_index != -1: + return key[:split_index], key[split_index + 1:] + else: + return None, key + + @property + def name(self): + return self._name + + @property + def scope(self): + return self._scope + + @property + def module_dict(self): + return self._module_dict + + @property + def children(self): + return self._children + + def get(self, key): + """Get the registry record. + Args: + key (str): The class name in string format. + Returns: + class: The corresponding class. + """ + scope, real_key = self.split_scope_key(key) + if scope is None or scope == self._scope: + # get from self + if real_key in self._module_dict: + return self._module_dict[real_key] + else: + # get from self._children + if scope in self._children: + return self._children[scope].get(real_key) + else: + # goto root + parent = self.parent + while parent.parent is not None: + parent = parent.parent + return parent.get(key) + + def build(self, *args, **kwargs): + return self.build_func(*args, **kwargs, registry=self) + + def _add_children(self, registry): + """Add children for a registry. + The ``registry`` will be added as children based on its scope. + The parent registry could build objects from children registry. + Example: + >>> models = Registry('models') + >>> mmdet_models = Registry('models', parent=models) + >>> @mmdet_models.register_module() + >>> class ResNet: + >>> pass + >>> resnet = models.build(dict(NAME='mmdet.ResNet')) + """ + + assert isinstance(registry, Registry) + assert registry.scope is not None + assert registry.scope not in self.children, \ + f'scope {registry.scope} exists in {self.name} registry' + self.children[registry.scope] = registry + + def _register_module(self, module_class, module_name=None, force=False): + if not inspect.isclass(module_class): + raise TypeError('module must be a class, ' + f'but got {type(module_class)}') + + if module_name is None: + module_name = module_class.__name__ + if isinstance(module_name, str): + module_name = [module_name] + for name in module_name: + if not force and name in self._module_dict: + raise KeyError(f'{name} is already registered ' + f'in {self.name}') + self._module_dict[name] = module_class + + def deprecated_register_module(self, cls=None, force=False): + warnings.warn( + 'The old API of register_module(module, force=False) ' + 'is deprecated and will be removed, please use the new API ' + 'register_module(name=None, force=False, module=None) instead.') + if cls is None: + return partial(self.deprecated_register_module, force=force) + self._register_module(cls, force=force) + return cls + + def register_module(self, name=None, force=False, module=None): + """Register a module. + A record will be added to `self._module_dict`, whose key is the class + name or the specified name, and value is the class itself. + It can be used as a decorator or a normal function. + Example: + >>> backbones = Registry('backbone') + >>> @backbones.register_module() + >>> class ResNet: + >>> pass + >>> backbones = Registry('backbone') + >>> @backbones.register_module(name='mnet') + >>> class MobileNet: + >>> pass + >>> backbones = Registry('backbone') + >>> class ResNet: + >>> pass + >>> backbones.register_module(ResNet) + Args: + name (str | None): The module name to be registered. If not + specified, the class name will be used. + force (bool, optional): Whether to override an existing class with + the same name. Default: False. + module (type): Module class to be registered. + """ + if not isinstance(force, bool): + raise TypeError(f'force must be a boolean, but got {type(force)}') + # NOTE: This is a walkaround to be compatible with the old api, + # while it may introduce unexpected bugs. + if isinstance(name, type): + return self.deprecated_register_module(name, force=force) + + # raise the error ahead of time + if not (name is None or isinstance(name, str) or misc.is_seq_of(name, str)): + raise TypeError( + 'name must be either of None, an instance of str or a sequence' + f' of str, but got {type(name)}') + + # use it as a normal method: x.register_module(module=SomeClass) + if module is not None: + self._register_module( + module_class=module, module_name=name, force=force) + return module + + # use it as a decorator: @x.register_module() + def _register(cls): + self._register_module( + module_class=cls, module_name=name, force=force) + return cls + + return _register + + +def build_from_cfg(cfg, registry, default_args=None): + """Build a module from config dict. + Args: + cfg (edict): Config dict. It should at least contain the key "NAME". + registry (:obj:`Registry`): The registry to search the type from. + Returns: + object: The constructed object. + """ + if not isinstance(cfg, dict): + raise TypeError(f'cfg must be a dict, but got {type(cfg)}') + if 'NAME' not in cfg: + if default_args is None or 'NAME' not in default_args: + raise KeyError( + '`cfg` or `default_args` must contain the key "NAME", ' + f'but got {cfg}\n{default_args}') + if not isinstance(registry, Registry): + raise TypeError('registry must be an mmcv.Registry object, ' + f'but got {type(registry)}') + + if not (isinstance(default_args, dict) or default_args is None): + raise TypeError('default_args must be a dict or None, ' + f'but got {type(default_args)}') + + if default_args is not None: + cfg = config.merge_new_config(cfg, default_args) + + obj_type = cfg.get('NAME') + + if isinstance(obj_type, str): + obj_cls = registry.get(obj_type) + if obj_cls is None: + raise KeyError( + f'{obj_type} is not in the {registry.name} registry') + elif inspect.isclass(obj_type): + obj_cls = obj_type + else: + raise TypeError( + f'type must be a str or valid type, but got {type(obj_type)}') + try: + return obj_cls(cfg) + except Exception as e: + # Normal TypeError does not print class name. + raise type(e)(f'{obj_cls.__name__}: {e}') diff --git a/zoo/PointMLP/LICENSE b/zoo/PointMLP/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/zoo/PointMLP/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/zoo/PointMLP/README.md b/zoo/PointMLP/README.md new file mode 100644 index 0000000..0734c48 --- /dev/null +++ b/zoo/PointMLP/README.md @@ -0,0 +1,150 @@ +# Rethinking Network Design and Local Geometry in Point Cloud: A Simple Residual MLP Framework (ICLR 2022οΌ‰ + + + +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rethinking-network-design-and-local-geometry-1/3d-point-cloud-classification-on-modelnet40)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-modelnet40?p=rethinking-network-design-and-local-geometry-1) +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rethinking-network-design-and-local-geometry-1/3d-point-cloud-classification-on-scanobjectnn)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-scanobjectnn?p=rethinking-network-design-and-local-geometry-1) + + +
+ + + +
+ +[Project Sites]() | [arXiv](https://arxiv.org/abs/2202.07123) | Primary contact: [Xu Ma](mailto:ma.xu1@northeastern.edu) + +
+ +
+ +Overview of one stage in PointMLP. Given an input point cloud, PointMLP progressively extract local features using residual point MLP blocks. In each stage, we first transform local point using a geometric affine module, then local points are are extracted before and after aggregation respectively. By repeating multiple stages, PointMLP progressively enlarge the receptive field and model entire point cloud geometric information. + + +## BibTeX + + @inproceedings{ + ma2022rethinking, + title={Rethinking Network Design and Local Geometry in Point Cloud: A Simple Residual {MLP} Framework}, + author={Xu Ma and Can Qin and Haoxuan You and Haoxi Ran and Yun Fu}, + booktitle={International Conference on Learning Representations}, + year={2022}, + url={https://openreview.net/forum?id=3Pbra-_u76D} + } + +## Model Zoo +- The codes/models/logs for submission version (without bug fixed) can be found here [commit:d2b8dbaa](http://github.com/13952522076/pointMLP-pytorch/tree/d2b8dbaa06eb6176b222dcf2ad248f8438582026). + +- On ModelNet40, fixed pointMLP achieves a result of **91.5% mAcc** and **94.1% OA** without voting, logs and pretrained models can be found [[here]](https://web.northeastern.edu/smilelab/xuma/pointMLP/checkpoints/fixstd/modelnet40/pointMLP-20220209053148-404/). +- On ScanObjectNN, fixed pointMLP achieves a result of **84.4% mAcc** and **86.1% OA** without voting, logs and pretrained models can be found [[here]](https://web.northeastern.edu/smilelab/xuma/pointMLP/checkpoints/fixstd/scanobjectnn/pointMLP-20220204021453/). Fixed pointMLP-elite achieves a result of **81.7% mAcc** and **84.1% OA** without voting, logs and pretrained models can be found [[here]](https://web.northeastern.edu/smilelab/xuma/pointMLP/checkpoints/fixstd/scanobjectnn/model313Elite-20220220015842-2956/). +- Stay tuned. More elite versions and voting results will be uploaded. + + + +## News & Updates: + +- [ ] updated more pretrained models +- [ ] double check the part seg utils +- [ ] project page +- [x] update std bug (unstable testing in previous version) +- [x] paper/codes release + +:point_right::point_right::point_right:**NOTE:** The codes/models/logs for submission version (without bug fixed) can be found here [commit:d2b8dbaa](http://github.com/13952522076/pointMLP-pytorch/tree/d2b8dbaa06eb6176b222dcf2ad248f8438582026). + + + + +## Install + +```bash +# 1. clone this repo +git clone https://github.com/ma-xu/pointMLP-pytorch.git +cd pointMLP-pytorch + +# 2. create a conda virtual environment and activate it +conda create -n pointmlp python=3.7 -y +conda activate pointmlp + +# 3. install required libs, pytorch 1.8.1, torchvision 0.9.1, etc. +pip install -r requirements.txt + +# 4. install CUDA kernels +pip install pointnet2_ops_lib/. +``` + + +## Useage + +### Classification ModelNet40 +**Train**: The dataset will be automatically downloaded, run following command to train. + +By default, it will create a fold named "checkpoints/{modelName}-{msg}-{randomseed}", which includes args.txt, best_checkpoint.pth, last_checkpoint.pth, log.txt, out.txt. +```bash +cd pointMLP-pytorch/classification_ModelNet40 +# train pointMLP +python main.py --model pointMLP +# train pointMLP-elite +python main.py --model pointMLPElite +# please add other paramemters as you wish. +``` + + +To conduct voting testing, run +```bash +# please modify the msg accrodingly +python voting.py --model pointMLP --msg demo +``` + + +### Classification ScanObjectNN + +The dataset will be automatically downloaded + +- Train pointMLP/pointMLPElite +```bash +# train pointMLP +python main.py --model pointMLP +# train pointMLP-elite +python main.py --model pointMLPElite +# please add other paramemters as you wish. +``` +By default, it will create a fold named "checkpoints/{modelName}-{msg}-{randomseed}", which includes args.txt, best_checkpoint.pth, last_checkpoint.pth, log.txt, out.txt. + + +### Part segmentation + +- Make data folder and download the dataset +```bash +cd pointMLP-pytorch/part_segmentation +mkdir data +cd data +wget https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip --no-check-certificate +unzip shapenetcore_partanno_segmentation_benchmark_v0_normal.zip +``` + +- Train pointMLP +```bash +# train pointMLP +python main.py --model pointMLP +# please add other paramemters as you wish. +``` + + +## Acknowledgment + +Our implementation is mainly based on the following codebases. We gratefully thank the authors for their wonderful works. + +[CurveNet](https://github.com/tiangexiang/CurveNet), +[PAConv](https://github.com/CVMI-Lab/PAConv), +[GDANet](https://github.com/mutianxu/GDANet), +[Pointnet2_PyTorch](https://github.com/erikwijmans/Pointnet2_PyTorch) + +## LICENSE +PointMLP is under the Apache-2.0 license. +Please contact the authors for commercial use. + + + + + + diff --git a/zoo/PointMLP/data.py b/zoo/PointMLP/data.py new file mode 100644 index 0000000..a8fb553 --- /dev/null +++ b/zoo/PointMLP/data.py @@ -0,0 +1,185 @@ + + +import os +import sys +import glob +import h5py +import numpy as np +import torch +from torch.utils.data import Dataset + + +# change this to your data root +DATA_DIR = 'data/' +os.environ["HDF5_USE_FILE_LOCKING"] = "FALSE" + +def download_modelnet40(): + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + os.mkdir(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')) + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s --no-check-certificate; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def download_shapenetpart(): + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR)): + os.mkdir(os.path.join(DATA_DIR)) + www = 'https://shapenet.cs.stanford.edu/media/shapenet_part_seg_hdf5_data.zip' + zipfile = os.path.basename(www) + os.system('wget %s --no-check-certificate; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], os.path.join(DATA_DIR))) + os.system('rm %s' % (zipfile)) + + +def load_data_normal(partition): + f = h5py.File(os.path.join(DATA_DIR, 'modelnet40_normal', 'normal_%s.h5'%partition), 'r+') + data = f['xyz'][:].astype('float32') + label = f['normal'][:].astype('float32') + f.close() + return data, label + + +def load_data_cls(partition): + download_modelnet40() + all_data = [] + all_label = [] + for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40*hdf5_2048', '*%s*.h5'%partition)): + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def load_data_partseg(partition): + download_shapenetpart() + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'part_segmentation_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'part_segmentation_data', '*val*.h5')) + else: + file = glob.glob(os.path.join(DATA_DIR, 'part_segmentation_data', '*%s*.h5'%partition)) + for h5_name in file: + f = h5py.File(h5_name, 'r+') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +def rotate_pointcloud(pointcloud): + theta = np.pi*2 * np.random.uniform() + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + pointcloud[:,[0,2]] = pointcloud[:,[0,2]].dot(rotation_matrix) # random rotation (x,z) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, num_points, partition='train'): + self.data, self.label = load_data_cls(partition) + self.num_points = num_points + self.partition = partition + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + if self.partition == 'train': + pointcloud = translate_pointcloud(pointcloud) + #pointcloud = rotate_pointcloud(pointcloud) + np.random.shuffle(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + +class ModelNetNormal(Dataset): + def __init__(self, num_points, partition='train'): + self.data, self.label = load_data_normal(partition) + self.num_points = num_points + self.partition = partition + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item][:self.num_points] + if self.partition == 'train': + #pointcloud = translate_pointcloud(pointcloud) + idx = np.arange(0, pointcloud.shape[0], dtype=np.int64) + np.random.shuffle(idx) + pointcloud = self.data[item][idx] + label = self.label[item][idx] + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None): + self.data, self.label, self.seg = load_data_partseg(partition) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] diff --git a/zoo/PointMLP/data_util.py b/zoo/PointMLP/data_util.py new file mode 100644 index 0000000..01d5b77 --- /dev/null +++ b/zoo/PointMLP/data_util.py @@ -0,0 +1,281 @@ +import cv2 +import glob +import h5py + +import os +import json +import warnings +import numpy as np +from torch.utils.data import Dataset +warnings.filterwarnings('ignore') + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + return pc + + +class PartNormalDataset(Dataset): + def __init__(self, npoints=2500, split='train', normalize=False): + self.npoints = npoints + self.root = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.normalize = normalize + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k: v for k, v in self.cat.items()} + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + + if split == 'trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split == 'train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split == 'val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split == 'test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..' % (split)) + exit(-1) + + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + def __getitem__(self, index): + if index in self.cache: + point_set, normal, seg, cls = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + point_set = data[:, 0:3] + normal = data[:, 3:6] + seg = data[:, -1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, normal, seg, cls) + + if self.normalize: + point_set = pc_normalize(point_set) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + + # resample + # note that the number of points in some points clouds is less than 2048, thus use random.choice + # remember to use the same seed during train and test for a getting stable result + point_set = point_set[choice, :] + seg = seg[choice] + normal = normal[choice, :] + + # return point_set, cls, seg, normal + return point_set, cls, seg + + def __len__(self): + return len(self.datapath) + + + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + + +class ShapeNetC(Dataset): + def __init__(self, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] # number of parts for each category + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.partition = partition + self.class_choice = class_choice + # self.partseg_colors = load_color_partseg() + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + seg = self.seg[item] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + +DATA_DIR = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' +SHAPENET_C_DIR = '/mnt/lustre/share/jwren/to_kld/shapenet_c' +def load_data_partseg(partition, sub=None): + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + elif partition == 'shapenet-c': + file = os.path.join(SHAPENET_C_DIR, '%s.h5'%sub) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + + if partition == 'shapenet-c': + # for h5_name in file: + # f = h5py.File(h5_name, 'r+') + f = h5py.File(file, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') # part seg label + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + else: + for h5_name in file: + f = h5py.File(h5_name, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def load_color_partseg(): + colors = [] + labels = [] + f = open("prepare_data/meta/partseg_colors.txt") + for line in json.load(f): + colors.append(line['color']) + labels.append(line['label']) + partseg_colors = np.array(colors) + partseg_colors = partseg_colors[:, [2, 1, 0]] + partseg_labels = np.array(labels) + font = cv2.FONT_HERSHEY_SIMPLEX + img_size = 1350 + img = np.zeros((1350, 1890, 3), dtype="uint8") + cv2.rectangle(img, (0, 0), (1900, 1900), [255, 255, 255], thickness=-1) + column_numbers = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + column_gaps = [320, 320, 300, 300, 285, 285] + color_size = 64 + color_index = 0 + label_index = 0 + row_index = 16 + for row in range(0, img_size): + column_index = 32 + for column in range(0, img_size): + color = partseg_colors[color_index] + label = partseg_labels[label_index] + length = len(str(label)) + cv2.rectangle(img, (column_index, row_index), (column_index + color_size, row_index + color_size), color=(int(color[0]), int(color[1]), int(color[2])), thickness=-1) + img = cv2.putText(img, label, (column_index + int(color_size * 1.15), row_index + int(color_size / 2)), font, 0.76, (0, 0, 0), 2) + column_index = column_index + column_gaps[column] + color_index = color_index + 1 + label_index = label_index + 1 + if color_index >= 50: + cv2.imwrite("prepare_data/meta/partseg_colors.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) + return np.array(colors) + elif (column + 1 >= column_numbers[row]): + break + row_index = row_index + int(color_size * 1.3) + if (row_index >= img_size): + break + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud diff --git a/zoo/PointMLP/main.py b/zoo/PointMLP/main.py new file mode 100644 index 0000000..d504a45 --- /dev/null +++ b/zoo/PointMLP/main.py @@ -0,0 +1,440 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from util.data_util import PartNormalDataset +import torch.nn.functional as F +import torch.nn as nn +import model as models +import numpy as np +from torch.utils.data import DataLoader +from util.util import to_categorical, compute_overall_iou, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(args, io): + + # ============= Model =================== + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = models.__dict__[args.model](num_part).to(device) + io.cprint(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + '''Resume or not''' + if args.resume: + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, + map_location=torch.device('cpu'))['model'] + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + model.load_state_dict(state_dict) + + print("Resume training model...") + print(torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name).keys()) + else: + print("Training from scratch...") + + # =========== Dataloader ================= + train_data = PartNormalDataset(npoints=2048, split='trainval', normalize=False) + print("The number of training data is:%d", len(train_data)) + + test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + print("The number of test data is:%d", len(test_data)) + + train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True, num_workers=args.workers, + drop_last=True) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=args.workers, + drop_last=False) + + # ============= Optimizer ================ + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=0) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=0) + + if args.scheduler == 'cos': + print("Use CosLR") + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr if args.use_sgd else args.lr / 100) + else: + print("Use StepLR") + scheduler = StepLR(opt, step_size=args.step, gamma=0.5) + + # ============= Training ================= + best_acc = 0 + best_class_iou = 0 + best_instance_iou = 0 + num_part = 50 + num_classes = 16 + + for epoch in range(args.epochs): + + train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io) + + test_metrics, total_per_cat_iou = test_epoch(test_loader, model, epoch, num_part, num_classes, io) + + # 1. when get the best accuracy, save the model: + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + io.cprint('Max Acc:%.5f' % best_acc) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_acc': best_acc} + torch.save(state, 'checkpoints/%s/best_acc_model.pth' % args.exp_name) + + # 2. when get the best instance_iou, save the model: + if test_metrics['shape_avg_iou'] > best_instance_iou: + best_instance_iou = test_metrics['shape_avg_iou'] + io.cprint('Max instance iou:%.5f' % best_instance_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_instance_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/best_insiou_model.pth' % args.exp_name) + + # 3. when get the best class_iou, save the model: + # first we need to calculate the average per-class iou + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + avg_class_iou = class_iou / 16 + if avg_class_iou > best_class_iou: + best_class_iou = avg_class_iou + # print the iou of each class: + for cat_idx in range(16): + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) + io.cprint('Max class iou:%.5f' % best_class_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_class_iou': best_class_iou} + torch.save(state, 'checkpoints/%s/best_clsiou_model.pth' % args.exp_name) + + # report best acc, ins_iou, cls_iou + io.cprint('Final Max Acc:%.5f' % best_acc) + io.cprint('Final Max instance iou:%.5f' % best_instance_iou) + io.cprint('Final Max class iou:%.5f' % best_class_iou) + # save last model + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': args.epochs - 1, 'test_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/model_ep%d.pth' % (args.exp_name, args.epochs)) + + +def train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io): + train_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + metrics = defaultdict(lambda: list()) + model.train() + + for batch_id, (points, label, target, norm_plt) in tqdm(enumerate(train_loader), total=len(train_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target, norm_plt = Variable(points.float()), Variable(label.long()), Variable(target.long()), \ + Variable(norm_plt.float()) + points = points.transpose(2, 1) + norm_plt = norm_plt.transpose(2, 1) + points, label, target, norm_plt = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), \ + target.cuda(non_blocking=True), norm_plt.cuda(non_blocking=True) + # target: b,n + seg_pred = model(points, norm_plt, to_categorical(label, num_classes)) # seg_pred: b,n,50 + loss = F.nll_loss(seg_pred.contiguous().view(-1, num_part), target.view(-1, 1)[:, 0]) + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # list of of current batch_iou:[iou1,iou2,...,iou#b_size] + # total iou of current batch in each process: + batch_shapeious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # Loss backward + loss = torch.mean(loss) + opt.zero_grad() + loss.backward() + opt.step() + + # accuracy + seg_pred = seg_pred.contiguous().view(-1, num_part) # b*n,50 + target = target.view(-1, 1)[:, 0] # b*n + pred_choice = seg_pred.contiguous().data.max(1)[1] # b*n + correct = pred_choice.eq(target.contiguous().data).sum() # torch.int64: total number of correct-predict pts + + # sum + shape_ious += batch_shapeious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + train_loss += loss.item() * batch_size + accuracy.append(correct.item()/(batch_size * num_point)) # append the accuracy of each iteration + + # Note: We do not need to calculate per_class iou during training + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 0.9e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 0.9e-5: + for param_group in opt.param_groups: + param_group['lr'] = 0.9e-5 + io.cprint('Learning rate: %f' % opt.param_groups[0]['lr']) + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Train %d, loss: %f, train acc: %f, train ins_iou: %f' % (epoch+1, train_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + io.cprint(outstr) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target, norm_plt) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target, norm_plt = Variable(points.float()), Variable(label.long()), Variable(target.long()), \ + Variable(norm_plt.float()) + points = points.transpose(2, 1) + norm_plt = norm_plt.transpose(2, 1) + points, label, target, norm_plt = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), \ + target.cuda(non_blocking=True), norm_plt.cuda(non_blocking=True) + seg_pred = model(points, norm_plt, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=args.workers, + drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = models.__dict__[args.model](num_part).to(device) + io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target, norm_plt) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target, norm_plt = Variable(points.float()), Variable(label.long()), Variable(target.long()), Variable(norm_plt.float()) + points = points.transpose(2, 1) + norm_plt = norm_plt.transpose(2, 1) + points, label, target, norm_plt = points.cuda(non_blocking=True), label.squeeze().cuda( + non_blocking=True), target.cuda(non_blocking=True), norm_plt.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, norm_plt, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--model', type=str, default='PointMLP1') + parser.add_argument('--exp_name', type=str, default='demo1', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=False, + help='Use SGD') + parser.add_argument('--scheduler', type=str, default='step', + help='lr scheduler') + parser.add_argument('--step', type=int, default=40, + help='lr decay step') + parser.add_argument('--lr', type=float, default=0.003, metavar='LR', + help='learning rate') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--manual_seed', type=int, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=2048, + help='num of points to use') + parser.add_argument('--workers', type=int, default=12) + parser.add_argument('--resume', type=bool, default=False, + help='Resume training or not') + parser.add_argument('--model_type', type=str, default='insiou', + help='choose to test the best insiou/clsiou/acc model (options: insiou, clsiou, acc)') + + args = parser.parse_args() + args.exp_name = args.model+"_"+args.exp_name + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + test(args, io) diff --git a/zoo/PointMLP/models/__init__.py b/zoo/PointMLP/models/__init__.py new file mode 100644 index 0000000..83a619e --- /dev/null +++ b/zoo/PointMLP/models/__init__.py @@ -0,0 +1,2 @@ +from __future__ import absolute_import +from .pointMLP import pointMLP diff --git a/zoo/PointMLP/models/pointMLP.py b/zoo/PointMLP/models/pointMLP.py new file mode 100644 index 0000000..8b0db78 --- /dev/null +++ b/zoo/PointMLP/models/pointMLP.py @@ -0,0 +1,465 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import einsum +from einops import rearrange, repeat +from pointnet2_ops import pointnet2_utils + + +def get_activation(activation): + if activation.lower() == 'gelu': + return nn.GELU() + elif activation.lower() == 'rrelu': + return nn.RReLU(inplace=True) + elif activation.lower() == 'selu': + return nn.SELU(inplace=True) + elif activation.lower() == 'silu': + return nn.SiLU(inplace=True) + elif activation.lower() == 'hardswish': + return nn.Hardswish(inplace=True) + elif activation.lower() == 'leakyrelu': + return nn.LeakyReLU(inplace=True) + elif activation.lower() == 'leakyrelu0.2': + return nn.LeakyReLU(negative_slope=0.2, inplace=True) + else: + return nn.ReLU(inplace=True) + + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + dist += torch.sum(src ** 2, -1).view(B, N, 1) + dist += torch.sum(dst ** 2, -1).view(B, 1, M) + return dist + + +def index_points(points, idx): + """ + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S] + Return: + new_points:, indexed points data, [B, S, C] + """ + device = points.device + B = points.shape[0] + view_shape = list(idx.shape) + view_shape[1:] = [1] * (len(view_shape) - 1) + repeat_shape = list(idx.shape) + repeat_shape[0] = 1 + batch_indices = torch.arange(B, dtype=torch.long).to(device).view(view_shape).repeat(repeat_shape) + new_points = points[batch_indices, idx, :] + return new_points + + +def farthest_point_sample(xyz, npoint): + """ + Input: + xyz: pointcloud data, [B, N, 3] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [B, npoint] + """ + device = xyz.device + B, N, C = xyz.shape + centroids = torch.zeros(B, npoint, dtype=torch.long).to(device) + distance = torch.ones(B, N).to(device) * 1e10 + farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device) + batch_indices = torch.arange(B, dtype=torch.long).to(device) + for i in range(npoint): + centroids[:, i] = farthest + centroid = xyz[batch_indices, farthest, :].view(B, 1, 3) + dist = torch.sum((xyz - centroid) ** 2, -1) + distance = torch.min(distance, dist) + farthest = torch.max(distance, -1)[1] + return centroids + + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + + +def knn_point(nsample, xyz, new_xyz): + """ + Input: + nsample: max sample number in local region + xyz: all points, [B, N, C] + new_xyz: query points, [B, S, C] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + sqrdists = square_distance(new_xyz, xyz) + _, group_idx = torch.topk(sqrdists, nsample, dim=-1, largest=False, sorted=False) + return group_idx + + +class LocalGrouper(nn.Module): + def __init__(self, channel, groups, kneighbors, use_xyz=True, normalize="anchor", **kwargs): + """ + Give xyz[b,p,3] and fea[b,p,d], return new_xyz[b,g,3] and new_fea[b,g,k,d] + :param groups: groups number + :param kneighbors: k-nerighbors + :param kwargs: others + """ + super(LocalGrouper, self).__init__() + self.groups = groups + self.kneighbors = kneighbors + self.use_xyz = use_xyz + if normalize is not None: + self.normalize = normalize.lower() + else: + self.normalize = None + if self.normalize not in ["center", "anchor"]: + print(f"Unrecognized normalize parameter (self.normalize), set to None. Should be one of [center, anchor].") + self.normalize = None + if self.normalize is not None: + add_channel=3 if self.use_xyz else 0 + self.affine_alpha = nn.Parameter(torch.ones([1,1,1,channel + add_channel])) + self.affine_beta = nn.Parameter(torch.zeros([1, 1, 1, channel + add_channel])) + + def forward(self, xyz, points): + B, N, C = xyz.shape + S = self.groups + xyz = xyz.contiguous() # xyz [btach, points, xyz] + + # fps_idx = torch.multinomial(torch.linspace(0, N - 1, steps=N).repeat(B, 1).to(xyz.device), num_samples=self.groups, replacement=False).long() + # fps_idx = farthest_point_sample(xyz, self.groups).long() + fps_idx = pointnet2_utils.furthest_point_sample(xyz, self.groups).long() # [B, npoint] + new_xyz = index_points(xyz, fps_idx) # [B, npoint, 3] + new_points = index_points(points, fps_idx) # [B, npoint, d] + + idx = knn_point(self.kneighbors, xyz, new_xyz) + # idx = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = index_points(xyz, idx) # [B, npoint, k, 3] + grouped_points = index_points(points, idx) # [B, npoint, k, d] + if self.use_xyz: + grouped_points = torch.cat([grouped_points, grouped_xyz],dim=-1) # [B, npoint, k, d+3] + if self.normalize is not None: + if self.normalize =="center": + mean = torch.mean(grouped_points, dim=2, keepdim=True) + if self.normalize =="anchor": + mean = torch.cat([new_points, new_xyz],dim=-1) if self.use_xyz else new_points + mean = mean.unsqueeze(dim=-2) # [B, npoint, 1, d+3] + std = torch.std((grouped_points-mean).reshape(B,-1),dim=-1,keepdim=True).unsqueeze(dim=-1).unsqueeze(dim=-1) + grouped_points = (grouped_points-mean)/(std + 1e-5) + grouped_points = self.affine_alpha*grouped_points + self.affine_beta + + new_points = torch.cat([grouped_points, new_points.view(B, S, 1, -1).repeat(1, 1, self.kneighbors, 1)], dim=-1) + return new_xyz, new_points + + +class ConvBNReLU1D(nn.Module): + def __init__(self, in_channels, out_channels, kernel_size=1, bias=True, activation='relu'): + super(ConvBNReLU1D, self).__init__() + self.act = get_activation(activation) + self.net = nn.Sequential( + nn.Conv1d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, bias=bias), + nn.BatchNorm1d(out_channels), + self.act + ) + + def forward(self, x): + return self.net(x) + + +class ConvBNReLURes1D(nn.Module): + def __init__(self, channel, kernel_size=1, groups=1, res_expansion=1.0, bias=True, activation='relu'): + super(ConvBNReLURes1D, self).__init__() + self.act = get_activation(activation) + self.net1 = nn.Sequential( + nn.Conv1d(in_channels=channel, out_channels=int(channel * res_expansion), + kernel_size=kernel_size, groups=groups, bias=bias), + nn.BatchNorm1d(int(channel * res_expansion)), + self.act + ) + if groups > 1: + self.net2 = nn.Sequential( + nn.Conv1d(in_channels=int(channel * res_expansion), out_channels=channel, + kernel_size=kernel_size, groups=groups, bias=bias), + nn.BatchNorm1d(channel), + self.act, + nn.Conv1d(in_channels=channel, out_channels=channel, + kernel_size=kernel_size, bias=bias), + nn.BatchNorm1d(channel), + ) + else: + self.net2 = nn.Sequential( + nn.Conv1d(in_channels=int(channel * res_expansion), out_channels=channel, + kernel_size=kernel_size, bias=bias), + nn.BatchNorm1d(channel) + ) + + def forward(self, x): + return self.act(self.net2(self.net1(x)) + x) + + +class PreExtraction(nn.Module): + def __init__(self, channels, out_channels, blocks=1, groups=1, res_expansion=1, bias=True, + activation='relu', use_xyz=True): + """ + input: [b,g,k,d]: output:[b,d,g] + :param channels: + :param blocks: + """ + super(PreExtraction, self).__init__() + in_channels = 3+2*channels if use_xyz else 2*channels + self.transfer = ConvBNReLU1D(in_channels, out_channels, bias=bias, activation=activation) + operation = [] + for _ in range(blocks): + operation.append( + ConvBNReLURes1D(out_channels, groups=groups, res_expansion=res_expansion, + bias=bias, activation=activation) + ) + self.operation = nn.Sequential(*operation) + + def forward(self, x): + b, n, s, d = x.size() # torch.Size([32, 512, 32, 6]) + x = x.permute(0, 1, 3, 2) + x = x.reshape(-1, d, s) + x = self.transfer(x) + batch_size, _, _ = x.size() + x = self.operation(x) # [b, d, k] + x = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x = x.reshape(b, n, -1).permute(0, 2, 1) + return x + + +class PosExtraction(nn.Module): + def __init__(self, channels, blocks=1, groups=1, res_expansion=1, bias=True, activation='relu'): + """ + input[b,d,g]; output[b,d,g] + :param channels: + :param blocks: + """ + super(PosExtraction, self).__init__() + operation = [] + for _ in range(blocks): + operation.append( + ConvBNReLURes1D(channels, groups=groups, res_expansion=res_expansion, bias=bias, activation=activation) + ) + self.operation = nn.Sequential(*operation) + + def forward(self, x): # [b, d, g] + return self.operation(x) + + +class PointNetFeaturePropagation(nn.Module): + def __init__(self, in_channel, out_channel, blocks=1, groups=1, res_expansion=1.0, bias=True, activation='relu'): + super(PointNetFeaturePropagation, self).__init__() + self.fuse = ConvBNReLU1D(in_channel, out_channel, 1, bias=bias) + self.extraction = PosExtraction(out_channel, blocks, groups=groups, + res_expansion=res_expansion, bias=bias, activation=activation) + + + def forward(self, xyz1, xyz2, points1, points2): + """ + Input: + xyz1: input points position data, [B, N, 3] + xyz2: sampled input points position data, [B, S, 3] + points1: input points data, [B, D', N] + points2: input points data, [B, D'', S] + Return: + new_points: upsampled points data, [B, D''', N] + """ + # xyz1 = xyz1.permute(0, 2, 1) + # xyz2 = xyz2.permute(0, 2, 1) + + points2 = points2.permute(0, 2, 1) + B, N, C = xyz1.shape + _, S, _ = xyz2.shape + + if S == 1: + interpolated_points = points2.repeat(1, N, 1) + else: + dists = square_distance(xyz1, xyz2) + dists, idx = dists.sort(dim=-1) + dists, idx = dists[:, :, :3], idx[:, :, :3] # [B, N, 3] + + dist_recip = 1.0 / (dists + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_points = torch.sum(index_points(points2, idx) * weight.view(B, N, 3, 1), dim=2) + + if points1 is not None: + points1 = points1.permute(0, 2, 1) + new_points = torch.cat([points1, interpolated_points], dim=-1) + else: + new_points = interpolated_points + + new_points = new_points.permute(0, 2, 1) + new_points = self.fuse(new_points) + new_points = self.extraction(new_points) + return new_points + + + + +class PointMLP(nn.Module): + def __init__(self, num_classes=50,points=2048, embed_dim=64, groups=1, res_expansion=1.0, + activation="relu", bias=True, use_xyz=True, normalize="anchor", + dim_expansion=[2, 2, 2, 2], pre_blocks=[2, 2, 2, 2], pos_blocks=[2, 2, 2, 2], + k_neighbors=[32, 32, 32, 32], reducers=[4, 4, 4, 4], + de_dims=[512, 256, 128, 128], de_blocks=[2,2,2,2], + gmp_dim=64,cls_dim=64, **kwargs): + super(PointMLP, self).__init__() + self.stages = len(pre_blocks) + self.class_num = num_classes + self.points = points + self.embedding = ConvBNReLU1D(3, embed_dim, bias=bias, activation=activation) + assert len(pre_blocks) == len(k_neighbors) == len(reducers) == len(pos_blocks) == len(dim_expansion), \ + "Please check stage number consistent for pre_blocks, pos_blocks k_neighbors, reducers." + self.local_grouper_list = nn.ModuleList() + self.pre_blocks_list = nn.ModuleList() + self.pos_blocks_list = nn.ModuleList() + last_channel = embed_dim + anchor_points = self.points + en_dims = [last_channel] + ### Building Encoder ##### + for i in range(len(pre_blocks)): + out_channel = last_channel * dim_expansion[i] + pre_block_num = pre_blocks[i] + pos_block_num = pos_blocks[i] + kneighbor = k_neighbors[i] + reduce = reducers[i] + anchor_points = anchor_points // reduce + # append local_grouper_list + local_grouper = LocalGrouper(last_channel, anchor_points, kneighbor, use_xyz, normalize) # [b,g,k,d] + self.local_grouper_list.append(local_grouper) + # append pre_block_list + pre_block_module = PreExtraction(last_channel, out_channel, pre_block_num, groups=groups, + res_expansion=res_expansion, + bias=bias, activation=activation, use_xyz=use_xyz) + self.pre_blocks_list.append(pre_block_module) + # append pos_block_list + pos_block_module = PosExtraction(out_channel, pos_block_num, groups=groups, + res_expansion=res_expansion, bias=bias, activation=activation) + self.pos_blocks_list.append(pos_block_module) + + last_channel = out_channel + en_dims.append(last_channel) + + + ### Building Decoder ##### + self.decode_list = nn.ModuleList() + en_dims.reverse() + de_dims.insert(0,en_dims[0]) + assert len(en_dims) ==len(de_dims) == len(de_blocks)+1 + for i in range(len(en_dims)-1): + self.decode_list.append( + PointNetFeaturePropagation(de_dims[i]+en_dims[i+1], de_dims[i+1], + blocks=de_blocks[i], groups=groups, res_expansion=res_expansion, + bias=bias, activation=activation) + ) + + self.act = get_activation(activation) + + # class label mapping + self.cls_map = nn.Sequential( + ConvBNReLU1D(16, cls_dim, bias=bias, activation=activation), + ConvBNReLU1D(cls_dim, cls_dim, bias=bias, activation=activation) + ) + # global max pooling mapping + self.gmp_map_list = nn.ModuleList() + for en_dim in en_dims: + self.gmp_map_list.append(ConvBNReLU1D(en_dim, gmp_dim, bias=bias, activation=activation)) + self.gmp_map_end = ConvBNReLU1D(gmp_dim*len(en_dims), gmp_dim, bias=bias, activation=activation) + + # classifier + self.classifier = nn.Sequential( + nn.Conv1d(gmp_dim+cls_dim+de_dims[-1], 128, 1, bias=bias), + nn.BatchNorm1d(128), + self.act, + nn.Dropout(), + nn.Conv1d(128, num_classes, 1, bias=bias) + ) + self.en_dims = en_dims + + def forward(self, x, cls_label): + xyz = x.permute(0, 2, 1) + x = self.embedding(x) # B,D,N + + xyz_list = [xyz] # [B, N, 3] + x_list = [x] # [B, D, N] + + # here is the encoder + for i in range(self.stages): + # Give xyz[b, p, 3] and fea[b, p, d], return new_xyz[b, g, 3] and new_fea[b, g, k, d] + xyz, x = self.local_grouper_list[i](xyz, x.permute(0, 2, 1)) # [b,g,3] [b,g,k,d] + x = self.pre_blocks_list[i](x) # [b,d,g] + x = self.pos_blocks_list[i](x) # [b,d,g] + xyz_list.append(xyz) + x_list.append(x) + + # here is the decoder + xyz_list.reverse() + x_list.reverse() + x = x_list[0] + for i in range(len(self.decode_list)): + x = self.decode_list[i](xyz_list[i+1], xyz_list[i], x_list[i+1],x) + + # here is the global context + gmp_list = [] + for i in range(len(x_list)): + gmp_list.append(F.adaptive_max_pool1d(self.gmp_map_list[i](x_list[i]), 1)) + global_context = self.gmp_map_end(torch.cat(gmp_list, dim=1)) # [b, gmp_dim, 1] + + #here is the cls_token + cls_token = self.cls_map(cls_label.unsqueeze(dim=-1)) # [b, cls_dim, 1] + x = torch.cat([x, global_context.repeat([1, 1, x.shape[-1]]), cls_token.repeat([1, 1, x.shape[-1]])], dim=1) + x = self.classifier(x) + x = F.log_softmax(x, dim=1) + x = x.permute(0, 2, 1) + return x + + +def pointMLP(num_classes=50, **kwargs) -> PointMLP: + return PointMLP(num_classes=num_classes, points=2048, embed_dim=64, groups=1, res_expansion=1.0, + activation="relu", bias=True, use_xyz=True, normalize="anchor", + dim_expansion=[2, 2, 2, 2], pre_blocks=[2, 2, 2, 2], pos_blocks=[2, 2, 2, 2], + k_neighbors=[32, 32, 32, 32], reducers=[4, 4, 4, 4], + de_dims=[512, 256, 128, 128], de_blocks=[4,4,4,4], + gmp_dim=64,cls_dim=64, **kwargs) + + +if __name__ == '__main__': + data = torch.rand(2, 3, 2048) + norm = torch.rand(2, 3, 2048) + cls_label = torch.rand([2, 16]) + print("===> testing modelD ...") + # model = model31G(50) + model = pointMLP() + out = model(data, cls_label) # [2,2048,50] + print(out.shape) diff --git a/zoo/PointMLP/pointnet2_ops/__init__.py b/zoo/PointMLP/pointnet2_ops/__init__.py new file mode 100644 index 0000000..5fd361f --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/__init__.py @@ -0,0 +1,3 @@ +import pointnet2_ops.pointnet2_modules +import pointnet2_ops.pointnet2_utils +from pointnet2_ops._version import __version__ diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/include/ball_query.h b/zoo/PointMLP/pointnet2_ops/_ext-src/include/ball_query.h new file mode 100644 index 0000000..1bbc638 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/include/ball_query.h @@ -0,0 +1,5 @@ +#pragma once +#include + +at::Tensor ball_query(at::Tensor new_xyz, at::Tensor xyz, const float radius, + const int nsample); diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/include/cuda_utils.h b/zoo/PointMLP/pointnet2_ops/_ext-src/include/cuda_utils.h new file mode 100644 index 0000000..0fd5b6e --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/include/cuda_utils.h @@ -0,0 +1,41 @@ +#ifndef _CUDA_UTILS_H +#define _CUDA_UTILS_H + +#include +#include +#include + +#include +#include + +#include + +#define TOTAL_THREADS 512 + +inline int opt_n_threads(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + + return max(min(1 << pow_2, TOTAL_THREADS), 1); +} + +inline dim3 opt_block_config(int x, int y) { + const int x_threads = opt_n_threads(x); + const int y_threads = + max(min(opt_n_threads(y), TOTAL_THREADS / x_threads), 1); + dim3 block_config(x_threads, y_threads, 1); + + return block_config; +} + +#define CUDA_CHECK_ERRORS() \ + do { \ + cudaError_t err = cudaGetLastError(); \ + if (cudaSuccess != err) { \ + fprintf(stderr, "CUDA kernel failed : %s\n%s at L:%d in %s\n", \ + cudaGetErrorString(err), __PRETTY_FUNCTION__, __LINE__, \ + __FILE__); \ + exit(-1); \ + } \ + } while (0) + +#endif diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/include/group_points.h b/zoo/PointMLP/pointnet2_ops/_ext-src/include/group_points.h new file mode 100644 index 0000000..ad20cda --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/include/group_points.h @@ -0,0 +1,5 @@ +#pragma once +#include + +at::Tensor group_points(at::Tensor points, at::Tensor idx); +at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n); diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/include/interpolate.h b/zoo/PointMLP/pointnet2_ops/_ext-src/include/interpolate.h new file mode 100644 index 0000000..26b3464 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/include/interpolate.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +std::vector three_nn(at::Tensor unknowns, at::Tensor knows); +at::Tensor three_interpolate(at::Tensor points, at::Tensor idx, + at::Tensor weight); +at::Tensor three_interpolate_grad(at::Tensor grad_out, at::Tensor idx, + at::Tensor weight, const int m); diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/include/sampling.h b/zoo/PointMLP/pointnet2_ops/_ext-src/include/sampling.h new file mode 100644 index 0000000..d795271 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/include/sampling.h @@ -0,0 +1,6 @@ +#pragma once +#include + +at::Tensor gather_points(at::Tensor points, at::Tensor idx); +at::Tensor gather_points_grad(at::Tensor grad_out, at::Tensor idx, const int n); +at::Tensor furthest_point_sampling(at::Tensor points, const int nsamples); diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/include/utils.h b/zoo/PointMLP/pointnet2_ops/_ext-src/include/utils.h new file mode 100644 index 0000000..5f080ed --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/include/utils.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include + +#define CHECK_CUDA(x) \ + do { \ + AT_ASSERT(x.is_cuda(), #x " must be a CUDA tensor"); \ + } while (0) + +#define CHECK_CONTIGUOUS(x) \ + do { \ + AT_ASSERT(x.is_contiguous(), #x " must be a contiguous tensor"); \ + } while (0) + +#define CHECK_IS_INT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Int, \ + #x " must be an int tensor"); \ + } while (0) + +#define CHECK_IS_FLOAT(x) \ + do { \ + AT_ASSERT(x.scalar_type() == at::ScalarType::Float, \ + #x " must be a float tensor"); \ + } while (0) diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/ball_query.cpp b/zoo/PointMLP/pointnet2_ops/_ext-src/src/ball_query.cpp new file mode 100644 index 0000000..b1797c1 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/ball_query.cpp @@ -0,0 +1,32 @@ +#include "ball_query.h" +#include "utils.h" + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, int *idx); + +at::Tensor ball_query(at::Tensor new_xyz, at::Tensor xyz, const float radius, + const int nsample) { + CHECK_CONTIGUOUS(new_xyz); + CHECK_CONTIGUOUS(xyz); + CHECK_IS_FLOAT(new_xyz); + CHECK_IS_FLOAT(xyz); + + if (new_xyz.is_cuda()) { + CHECK_CUDA(xyz); + } + + at::Tensor idx = + torch::zeros({new_xyz.size(0), new_xyz.size(1), nsample}, + at::device(new_xyz.device()).dtype(at::ScalarType::Int)); + + if (new_xyz.is_cuda()) { + query_ball_point_kernel_wrapper(xyz.size(0), xyz.size(1), new_xyz.size(1), + radius, nsample, new_xyz.data_ptr(), + xyz.data_ptr(), idx.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return idx; +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/ball_query_gpu.cu b/zoo/PointMLP/pointnet2_ops/_ext-src/src/ball_query_gpu.cu new file mode 100644 index 0000000..559aef9 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/ball_query_gpu.cu @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "cuda_utils.h" + +// input: new_xyz(b, m, 3) xyz(b, n, 3) +// output: idx(b, m, nsample) +__global__ void query_ball_point_kernel(int b, int n, int m, float radius, + int nsample, + const float *__restrict__ new_xyz, + const float *__restrict__ xyz, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + xyz += batch_index * n * 3; + new_xyz += batch_index * m * 3; + idx += m * nsample * batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float radius2 = radius * radius; + for (int j = index; j < m; j += stride) { + float new_x = new_xyz[j * 3 + 0]; + float new_y = new_xyz[j * 3 + 1]; + float new_z = new_xyz[j * 3 + 2]; + for (int k = 0, cnt = 0; k < n && cnt < nsample; ++k) { + float x = xyz[k * 3 + 0]; + float y = xyz[k * 3 + 1]; + float z = xyz[k * 3 + 2]; + float d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 < radius2) { + if (cnt == 0) { + for (int l = 0; l < nsample; ++l) { + idx[j * nsample + l] = k; + } + } + idx[j * nsample + cnt] = k; + ++cnt; + } + } + } +} + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, int *idx) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + query_ball_point_kernel<<>>( + b, n, m, radius, nsample, new_xyz, xyz, idx); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/bindings.cpp b/zoo/PointMLP/pointnet2_ops/_ext-src/src/bindings.cpp new file mode 100644 index 0000000..d1916ce --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/bindings.cpp @@ -0,0 +1,19 @@ +#include "ball_query.h" +#include "group_points.h" +#include "interpolate.h" +#include "sampling.h" + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("gather_points", &gather_points); + m.def("gather_points_grad", &gather_points_grad); + m.def("furthest_point_sampling", &furthest_point_sampling); + + m.def("three_nn", &three_nn); + m.def("three_interpolate", &three_interpolate); + m.def("three_interpolate_grad", &three_interpolate_grad); + + m.def("ball_query", &ball_query); + + m.def("group_points", &group_points); + m.def("group_points_grad", &group_points_grad); +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/group_points.cpp b/zoo/PointMLP/pointnet2_ops/_ext-src/src/group_points.cpp new file mode 100644 index 0000000..285a4bd --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/group_points.cpp @@ -0,0 +1,62 @@ +#include "group_points.h" +#include "utils.h" + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out); + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points); + +at::Tensor group_points(at::Tensor points, at::Tensor idx) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + + if (points.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1), idx.size(2)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + group_points_kernel_wrapper(points.size(0), points.size(1), points.size(2), + idx.size(1), idx.size(2), + points.data_ptr(), idx.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} + +at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + + if (grad_out.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), n}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.is_cuda()) { + group_points_grad_kernel_wrapper( + grad_out.size(0), grad_out.size(1), n, idx.size(1), idx.size(2), + grad_out.data_ptr(), idx.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/group_points_gpu.cu b/zoo/PointMLP/pointnet2_ops/_ext-src/src/group_points_gpu.cu new file mode 100644 index 0000000..57c2b1b --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/group_points_gpu.cu @@ -0,0 +1,75 @@ +#include +#include + +#include "cuda_utils.h" + +// input: points(b, c, n) idx(b, npoints, nsample) +// output: out(b, c, npoints, nsample) +__global__ void group_points_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * n * c; + idx += batch_index * npoints * nsample; + out += batch_index * npoints * nsample * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + out[(l * npoints + j) * nsample + k] = points[l * n + ii]; + } + } +} + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + group_points_kernel<<>>( + b, c, n, npoints, nsample, points, idx, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, npoints, nsample), idx(b, npoints, nsample) +// output: grad_points(b, c, n) +__global__ void group_points_grad_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * npoints * nsample * c; + idx += batch_index * npoints * nsample; + grad_points += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + atomicAdd(grad_points + l * n + ii, + grad_out[(l * npoints + j) * nsample + k]); + } + } +} + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + group_points_grad_kernel<<>>( + b, c, n, npoints, nsample, grad_out, idx, grad_points); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/interpolate.cpp b/zoo/PointMLP/pointnet2_ops/_ext-src/src/interpolate.cpp new file mode 100644 index 0000000..cdee31c --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/interpolate.cpp @@ -0,0 +1,99 @@ +#include "interpolate.h" +#include "utils.h" + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx); +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out); +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points); + +std::vector three_nn(at::Tensor unknowns, at::Tensor knows) { + CHECK_CONTIGUOUS(unknowns); + CHECK_CONTIGUOUS(knows); + CHECK_IS_FLOAT(unknowns); + CHECK_IS_FLOAT(knows); + + if (unknowns.is_cuda()) { + CHECK_CUDA(knows); + } + + at::Tensor idx = + torch::zeros({unknowns.size(0), unknowns.size(1), 3}, + at::device(unknowns.device()).dtype(at::ScalarType::Int)); + at::Tensor dist2 = + torch::zeros({unknowns.size(0), unknowns.size(1), 3}, + at::device(unknowns.device()).dtype(at::ScalarType::Float)); + + if (unknowns.is_cuda()) { + three_nn_kernel_wrapper(unknowns.size(0), unknowns.size(1), knows.size(1), + unknowns.data_ptr(), knows.data_ptr(), + dist2.data_ptr(), idx.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return {dist2, idx}; +} + +at::Tensor three_interpolate(at::Tensor points, at::Tensor idx, + at::Tensor weight) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_CONTIGUOUS(weight); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + CHECK_IS_FLOAT(weight); + + if (points.is_cuda()) { + CHECK_CUDA(idx); + CHECK_CUDA(weight); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + three_interpolate_kernel_wrapper( + points.size(0), points.size(1), points.size(2), idx.size(1), + points.data_ptr(), idx.data_ptr(), weight.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} +at::Tensor three_interpolate_grad(at::Tensor grad_out, at::Tensor idx, + at::Tensor weight, const int m) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_CONTIGUOUS(weight); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + CHECK_IS_FLOAT(weight); + + if (grad_out.is_cuda()) { + CHECK_CUDA(idx); + CHECK_CUDA(weight); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), m}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.is_cuda()) { + three_interpolate_grad_kernel_wrapper( + grad_out.size(0), grad_out.size(1), grad_out.size(2), m, + grad_out.data_ptr(), idx.data_ptr(), + weight.data_ptr(), output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/interpolate_gpu.cu b/zoo/PointMLP/pointnet2_ops/_ext-src/src/interpolate_gpu.cu new file mode 100644 index 0000000..81c5548 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/interpolate_gpu.cu @@ -0,0 +1,154 @@ +#include +#include +#include + +#include "cuda_utils.h" + +// input: unknown(b, n, 3) known(b, m, 3) +// output: dist2(b, n, 3), idx(b, n, 3) +__global__ void three_nn_kernel(int b, int n, int m, + const float *__restrict__ unknown, + const float *__restrict__ known, + float *__restrict__ dist2, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + unknown += batch_index * n * 3; + known += batch_index * m * 3; + dist2 += batch_index * n * 3; + idx += batch_index * n * 3; + + int index = threadIdx.x; + int stride = blockDim.x; + for (int j = index; j < n; j += stride) { + float ux = unknown[j * 3 + 0]; + float uy = unknown[j * 3 + 1]; + float uz = unknown[j * 3 + 2]; + + double best1 = 1e40, best2 = 1e40, best3 = 1e40; + int besti1 = 0, besti2 = 0, besti3 = 0; + for (int k = 0; k < m; ++k) { + float x = known[k * 3 + 0]; + float y = known[k * 3 + 1]; + float z = known[k * 3 + 2]; + float d = (ux - x) * (ux - x) + (uy - y) * (uy - y) + (uz - z) * (uz - z); + if (d < best1) { + best3 = best2; + besti3 = besti2; + best2 = best1; + besti2 = besti1; + best1 = d; + besti1 = k; + } else if (d < best2) { + best3 = best2; + besti3 = besti2; + best2 = d; + besti2 = k; + } else if (d < best3) { + best3 = d; + besti3 = k; + } + } + dist2[j * 3 + 0] = best1; + dist2[j * 3 + 1] = best2; + dist2[j * 3 + 2] = best3; + + idx[j * 3 + 0] = besti1; + idx[j * 3 + 1] = besti2; + idx[j * 3 + 2] = besti3; + } +} + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_nn_kernel<<>>(b, n, m, unknown, known, + dist2, idx); + + CUDA_CHECK_ERRORS(); +} + +// input: points(b, c, m), idx(b, n, 3), weight(b, n, 3) +// output: out(b, c, n) +__global__ void three_interpolate_kernel(int b, int c, int m, int n, + const float *__restrict__ points, + const int *__restrict__ idx, + const float *__restrict__ weight, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * m * c; + + idx += batch_index * n * 3; + weight += batch_index * n * 3; + + out += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + out[i] = points[l * m + i1] * w1 + points[l * m + i2] * w2 + + points[l * m + i3] * w3; + } +} + +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_interpolate_kernel<<>>( + b, c, m, n, points, idx, weight, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, n), idx(b, n, 3), weight(b, n, 3) +// output: grad_points(b, c, m) + +__global__ void three_interpolate_grad_kernel( + int b, int c, int n, int m, const float *__restrict__ grad_out, + const int *__restrict__ idx, const float *__restrict__ weight, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * n * c; + idx += batch_index * n * 3; + weight += batch_index * n * 3; + grad_points += batch_index * m * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + atomicAdd(grad_points + l * m + i1, grad_out[i] * w1); + atomicAdd(grad_points + l * m + i2, grad_out[i] * w2); + atomicAdd(grad_points + l * m + i3, grad_out[i] * w3); + } +} + +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_interpolate_grad_kernel<<>>( + b, c, n, m, grad_out, idx, weight, grad_points); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/sampling.cpp b/zoo/PointMLP/pointnet2_ops/_ext-src/src/sampling.cpp new file mode 100644 index 0000000..ddbdc11 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/sampling.cpp @@ -0,0 +1,87 @@ +#include "sampling.h" +#include "utils.h" + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out); +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points); + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs); + +at::Tensor gather_points(at::Tensor points, at::Tensor idx) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + + if (points.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + gather_points_kernel_wrapper(points.size(0), points.size(1), points.size(2), + idx.size(1), points.data_ptr(), + idx.data_ptr(), output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} + +at::Tensor gather_points_grad(at::Tensor grad_out, at::Tensor idx, + const int n) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + + if (grad_out.is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), n}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.is_cuda()) { + gather_points_grad_kernel_wrapper(grad_out.size(0), grad_out.size(1), n, + idx.size(1), grad_out.data_ptr(), + idx.data_ptr(), + output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} +at::Tensor furthest_point_sampling(at::Tensor points, const int nsamples) { + CHECK_CONTIGUOUS(points); + CHECK_IS_FLOAT(points); + + at::Tensor output = + torch::zeros({points.size(0), nsamples}, + at::device(points.device()).dtype(at::ScalarType::Int)); + + at::Tensor tmp = + torch::full({points.size(0), points.size(1)}, 1e10, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.is_cuda()) { + furthest_point_sampling_kernel_wrapper( + points.size(0), points.size(1), nsamples, points.data_ptr(), + tmp.data_ptr(), output.data_ptr()); + } else { + AT_ASSERT(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/PointMLP/pointnet2_ops/_ext-src/src/sampling_gpu.cu b/zoo/PointMLP/pointnet2_ops/_ext-src/src/sampling_gpu.cu new file mode 100644 index 0000000..fc573f0 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_ext-src/src/sampling_gpu.cu @@ -0,0 +1,229 @@ +#include +#include + +#include "cuda_utils.h" + +// input: points(b, c, n) idx(b, m) +// output: out(b, c, m) +__global__ void gather_points_kernel(int b, int c, int n, int m, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + out[(i * c + l) * m + j] = points[(i * c + l) * n + a]; + } + } + } +} + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out) { + gather_points_kernel<<>>(b, c, n, npoints, + points, idx, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, m) idx(b, m) +// output: grad_points(b, c, n) +__global__ void gather_points_grad_kernel(int b, int c, int n, int m, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + atomicAdd(grad_points + (i * c + l) * n + a, + grad_out[(i * c + l) * m + j]); + } + } + } +} + +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points) { + gather_points_grad_kernel<<>>( + b, c, n, npoints, grad_out, idx, grad_points); + + CUDA_CHECK_ERRORS(); +} + +__device__ void __update(float *__restrict__ dists, int *__restrict__ dists_i, + int idx1, int idx2) { + const float v1 = dists[idx1], v2 = dists[idx2]; + const int i1 = dists_i[idx1], i2 = dists_i[idx2]; + dists[idx1] = max(v1, v2); + dists_i[idx1] = v2 > v1 ? i2 : i1; +} + +// Input dataset: (b, n, 3), tmp: (b, n) +// Ouput idxs (b, m) +template +__global__ void furthest_point_sampling_kernel( + int b, int n, int m, const float *__restrict__ dataset, + float *__restrict__ temp, int *__restrict__ idxs) { + if (m <= 0) return; + __shared__ float dists[block_size]; + __shared__ int dists_i[block_size]; + + int batch_index = blockIdx.x; + dataset += batch_index * n * 3; + temp += batch_index * n; + idxs += batch_index * m; + + int tid = threadIdx.x; + const int stride = block_size; + + int old = 0; + if (threadIdx.x == 0) idxs[0] = old; + + __syncthreads(); + for (int j = 1; j < m; j++) { + int besti = 0; + float best = -1; + float x1 = dataset[old * 3 + 0]; + float y1 = dataset[old * 3 + 1]; + float z1 = dataset[old * 3 + 2]; + for (int k = tid; k < n; k += stride) { + float x2, y2, z2; + x2 = dataset[k * 3 + 0]; + y2 = dataset[k * 3 + 1]; + z2 = dataset[k * 3 + 2]; + float mag = (x2 * x2) + (y2 * y2) + (z2 * z2); + if (mag <= 1e-3) continue; + + float d = + (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1); + + float d2 = min(d, temp[k]); + temp[k] = d2; + besti = d2 > best ? k : besti; + best = d2 > best ? d2 : best; + } + dists[tid] = best; + dists_i[tid] = besti; + __syncthreads(); + + if (block_size >= 512) { + if (tid < 256) { + __update(dists, dists_i, tid, tid + 256); + } + __syncthreads(); + } + if (block_size >= 256) { + if (tid < 128) { + __update(dists, dists_i, tid, tid + 128); + } + __syncthreads(); + } + if (block_size >= 128) { + if (tid < 64) { + __update(dists, dists_i, tid, tid + 64); + } + __syncthreads(); + } + if (block_size >= 64) { + if (tid < 32) { + __update(dists, dists_i, tid, tid + 32); + } + __syncthreads(); + } + if (block_size >= 32) { + if (tid < 16) { + __update(dists, dists_i, tid, tid + 16); + } + __syncthreads(); + } + if (block_size >= 16) { + if (tid < 8) { + __update(dists, dists_i, tid, tid + 8); + } + __syncthreads(); + } + if (block_size >= 8) { + if (tid < 4) { + __update(dists, dists_i, tid, tid + 4); + } + __syncthreads(); + } + if (block_size >= 4) { + if (tid < 2) { + __update(dists, dists_i, tid, tid + 2); + } + __syncthreads(); + } + if (block_size >= 2) { + if (tid < 1) { + __update(dists, dists_i, tid, tid + 1); + } + __syncthreads(); + } + + old = dists_i[0]; + if (tid == 0) idxs[j] = old; + } +} + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs) { + unsigned int n_threads = opt_n_threads(n); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + switch (n_threads) { + case 512: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 256: + furthest_point_sampling_kernel<256> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 128: + furthest_point_sampling_kernel<128> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 64: + furthest_point_sampling_kernel<64> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 32: + furthest_point_sampling_kernel<32> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 16: + furthest_point_sampling_kernel<16> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 8: + furthest_point_sampling_kernel<8> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 4: + furthest_point_sampling_kernel<4> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 2: + furthest_point_sampling_kernel<2> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 1: + furthest_point_sampling_kernel<1> + <<>>(b, n, m, dataset, temp, idxs); + break; + default: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + } + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/PointMLP/pointnet2_ops/_version.py b/zoo/PointMLP/pointnet2_ops/_version.py new file mode 100644 index 0000000..528787c --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/_version.py @@ -0,0 +1 @@ +__version__ = "3.0.0" diff --git a/zoo/PointMLP/pointnet2_ops/pointnet2_modules.py b/zoo/PointMLP/pointnet2_ops/pointnet2_modules.py new file mode 100644 index 0000000..a0ad4f6 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/pointnet2_modules.py @@ -0,0 +1,209 @@ +from typing import List, Optional, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from pointnet2_ops import pointnet2_utils + + +def build_shared_mlp(mlp_spec: List[int], bn: bool = True): + layers = [] + for i in range(1, len(mlp_spec)): + layers.append( + nn.Conv2d(mlp_spec[i - 1], mlp_spec[i], kernel_size=1, bias=not bn) + ) + if bn: + layers.append(nn.BatchNorm2d(mlp_spec[i])) + layers.append(nn.ReLU(True)) + + return nn.Sequential(*layers) + + +class _PointnetSAModuleBase(nn.Module): + def __init__(self): + super(_PointnetSAModuleBase, self).__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward( + self, xyz: torch.Tensor, features: Optional[torch.Tensor] + ) -> Tuple[torch.Tensor, torch.Tensor]: + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor of the xyz coordinates of the features + features : torch.Tensor + (B, C, N) tensor of the descriptors of the the features + + Returns + ------- + new_xyz : torch.Tensor + (B, npoint, 3) tensor of the new features' xyz + new_features : torch.Tensor + (B, \sum_k(mlps[k][-1]), npoint) tensor of the new_features descriptors + """ + + new_features_list = [] + + xyz_flipped = xyz.transpose(1, 2).contiguous() + new_xyz = ( + pointnet2_utils.gather_operation( + xyz_flipped, pointnet2_utils.furthest_point_sample(xyz, self.npoint) + ) + .transpose(1, 2) + .contiguous() + if self.npoint is not None + else None + ) + + for i in range(len(self.groupers)): + new_features = self.groupers[i]( + xyz, new_xyz, features + ) # (B, C, npoint, nsample) + + new_features = self.mlps[i](new_features) # (B, mlp[-1], npoint, nsample) + new_features = F.max_pool2d( + new_features, kernel_size=[1, new_features.size(3)] + ) # (B, mlp[-1], npoint, 1) + new_features = new_features.squeeze(-1) # (B, mlp[-1], npoint) + + new_features_list.append(new_features) + + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointnetSAModuleMSG(_PointnetSAModuleBase): + r"""Pointnet set abstrction layer with multiscale grouping + + Parameters + ---------- + npoint : int + Number of features + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet before the global max_pool for each scale + bn : bool + Use batchnorm + """ + + def __init__(self, npoint, radii, nsamples, mlps, bn=True, use_xyz=True): + # type: (PointnetSAModuleMSG, int, List[float], List[int], List[List[int]], bool, bool) -> None + super(PointnetSAModuleMSG, self).__init__() + + assert len(radii) == len(nsamples) == len(mlps) + + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + pointnet2_utils.QueryAndGroup(radius, nsample, use_xyz=use_xyz) + if npoint is not None + else pointnet2_utils.GroupAll(use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + + self.mlps.append(build_shared_mlp(mlp_spec, bn)) + + +class PointnetSAModule(PointnetSAModuleMSG): + r"""Pointnet set abstrction layer + + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet before the global max_pool + bn : bool + Use batchnorm + """ + + def __init__( + self, mlp, npoint=None, radius=None, nsample=None, bn=True, use_xyz=True + ): + # type: (PointnetSAModule, List[int], int, float, int, bool, bool) -> None + super(PointnetSAModule, self).__init__( + mlps=[mlp], + npoint=npoint, + radii=[radius], + nsamples=[nsample], + bn=bn, + use_xyz=use_xyz, + ) + + +class PointnetFPModule(nn.Module): + r"""Propigates the features of one set to another + + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + + def __init__(self, mlp, bn=True): + # type: (PointnetFPModule, List[int], bool) -> None + super(PointnetFPModule, self).__init__() + self.mlp = build_shared_mlp(mlp, bn=bn) + + def forward(self, unknown, known, unknow_feats, known_feats): + # type: (PointnetFPModule, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + if known is not None: + dist, idx = pointnet2_utils.three_nn(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + + interpolated_feats = pointnet2_utils.three_interpolate( + known_feats, idx, weight + ) + else: + interpolated_feats = known_feats.expand( + *(known_feats.size()[0:2] + [unknown.size(1)]) + ) + + if unknow_feats is not None: + new_features = torch.cat( + [interpolated_feats, unknow_feats], dim=1 + ) # (B, C2 + C1, n) + else: + new_features = interpolated_feats + + new_features = new_features.unsqueeze(-1) + new_features = self.mlp(new_features) + + return new_features.squeeze(-1) diff --git a/zoo/PointMLP/pointnet2_ops/pointnet2_utils.py b/zoo/PointMLP/pointnet2_ops/pointnet2_utils.py new file mode 100644 index 0000000..150fccc --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops/pointnet2_utils.py @@ -0,0 +1,379 @@ +import torch +import torch.nn as nn +import warnings +from torch.autograd import Function +from typing import * + +try: + import pointnet2_ops._ext as _ext +except ImportError: + from torch.utils.cpp_extension import load + import glob + import os.path as osp + import os + + warnings.warn("Unable to load pointnet2_ops cpp extension. JIT Compiling.") + + _ext_src_root = osp.join(osp.dirname(__file__), "_ext-src") + _ext_sources = glob.glob(osp.join(_ext_src_root, "src", "*.cpp")) + glob.glob( + osp.join(_ext_src_root, "src", "*.cu") + ) + _ext_headers = glob.glob(osp.join(_ext_src_root, "include", "*")) + + os.environ["TORCH_CUDA_ARCH_LIST"] = "3.7+PTX;5.0;6.0;6.1;6.2;7.0;7.5" + _ext = load( + "_ext", + sources=_ext_sources, + extra_include_paths=[osp.join(_ext_src_root, "include")], + extra_cflags=["-O3"], + extra_cuda_cflags=["-O3", "-Xfatbin", "-compress-all"], + with_cuda=True, + ) + + +class FurthestPointSampling(Function): + @staticmethod + def forward(ctx, xyz, npoint): + # type: (Any, torch.Tensor, int) -> torch.Tensor + r""" + Uses iterative furthest point sampling to select a set of npoint features that have the largest + minimum distance + + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor where N > npoint + npoint : int32 + number of features in the sampled set + + Returns + ------- + torch.Tensor + (B, npoint) tensor containing the set + """ + out = _ext.furthest_point_sampling(xyz, npoint) + + ctx.mark_non_differentiable(out) + + return out + + @staticmethod + def backward(ctx, grad_out): + return () + + +furthest_point_sample = FurthestPointSampling.apply + + +class GatherOperation(Function): + @staticmethod + def forward(ctx, features, idx): + # type: (Any, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor + + idx : torch.Tensor + (B, npoint) tensor of the features to gather + + Returns + ------- + torch.Tensor + (B, C, npoint) tensor + """ + + ctx.save_for_backward(idx, features) + + return _ext.gather_points(features, idx) + + @staticmethod + def backward(ctx, grad_out): + idx, features = ctx.saved_tensors + N = features.size(2) + + grad_features = _ext.gather_points_grad(grad_out.contiguous(), idx, N) + return grad_features, None + + +gather_operation = GatherOperation.apply + + +class ThreeNN(Function): + @staticmethod + def forward(ctx, unknown, known): + # type: (Any, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + Find the three nearest neighbors of unknown in known + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of known features + known : torch.Tensor + (B, m, 3) tensor of unknown features + + Returns + ------- + dist : torch.Tensor + (B, n, 3) l2 distance to the three nearest neighbors + idx : torch.Tensor + (B, n, 3) index of 3 nearest neighbors + """ + dist2, idx = _ext.three_nn(unknown, known) + dist = torch.sqrt(dist2) + + ctx.mark_non_differentiable(dist, idx) + + return dist, idx + + @staticmethod + def backward(ctx, grad_dist, grad_idx): + return () + + +three_nn = ThreeNN.apply + + +class ThreeInterpolate(Function): + @staticmethod + def forward(ctx, features, idx, weight): + # type(Any, torch.Tensor, torch.Tensor, torch.Tensor) -> Torch.Tensor + r""" + Performs weight linear interpolation on 3 features + Parameters + ---------- + features : torch.Tensor + (B, c, m) Features descriptors to be interpolated from + idx : torch.Tensor + (B, n, 3) three nearest neighbors of the target features in features + weight : torch.Tensor + (B, n, 3) weights + + Returns + ------- + torch.Tensor + (B, c, n) tensor of the interpolated features + """ + ctx.save_for_backward(idx, weight, features) + + return _ext.three_interpolate(features, idx, weight) + + @staticmethod + def backward(ctx, grad_out): + # type: (Any, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor] + r""" + Parameters + ---------- + grad_out : torch.Tensor + (B, c, n) tensor with gradients of ouputs + + Returns + ------- + grad_features : torch.Tensor + (B, c, m) tensor with gradients of features + + None + + None + """ + idx, weight, features = ctx.saved_tensors + m = features.size(2) + + grad_features = _ext.three_interpolate_grad( + grad_out.contiguous(), idx, weight, m + ) + + return grad_features, torch.zeros_like(idx), torch.zeros_like(weight) + + +three_interpolate = ThreeInterpolate.apply + + +class GroupingOperation(Function): + @staticmethod + def forward(ctx, features, idx): + # type: (Any, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor of features to group + idx : torch.Tensor + (B, npoint, nsample) tensor containing the indicies of features to group with + + Returns + ------- + torch.Tensor + (B, C, npoint, nsample) tensor + """ + ctx.save_for_backward(idx, features) + + return _ext.group_points(features, idx) + + @staticmethod + def backward(ctx, grad_out): + # type: (Any, torch.tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + + Parameters + ---------- + grad_out : torch.Tensor + (B, C, npoint, nsample) tensor of the gradients of the output from forward + + Returns + ------- + torch.Tensor + (B, C, N) gradient of the features + None + """ + idx, features = ctx.saved_tensors + N = features.size(2) + + grad_features = _ext.group_points_grad(grad_out.contiguous(), idx, N) + + return grad_features, torch.zeros_like(idx) + + +grouping_operation = GroupingOperation.apply + + +class BallQuery(Function): + @staticmethod + def forward(ctx, radius, nsample, xyz, new_xyz): + # type: (Any, float, int, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + radius : float + radius of the balls + nsample : int + maximum number of features in the balls + xyz : torch.Tensor + (B, N, 3) xyz coordinates of the features + new_xyz : torch.Tensor + (B, npoint, 3) centers of the ball query + + Returns + ------- + torch.Tensor + (B, npoint, nsample) tensor with the indicies of the features that form the query balls + """ + output = _ext.ball_query(new_xyz, xyz, radius, nsample) + + ctx.mark_non_differentiable(output) + + return output + + @staticmethod + def backward(ctx, grad_out): + return () + + +ball_query = BallQuery.apply + + +class QueryAndGroup(nn.Module): + r""" + Groups with a ball query of radius + + Parameters + --------- + radius : float32 + Radius of ball + nsample : int32 + Maximum number of features to gather in the ball + """ + + def __init__(self, radius, nsample, use_xyz=True): + # type: (QueryAndGroup, float, int, bool) -> None + super(QueryAndGroup, self).__init__() + self.radius, self.nsample, self.use_xyz = radius, nsample, use_xyz + + def forward(self, xyz, new_xyz, features=None): + # type: (QueryAndGroup, torch.Tensor. torch.Tensor, torch.Tensor) -> Tuple[Torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + centriods (B, npoint, 3) + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, 3 + C, npoint, nsample) tensor + """ + + idx = ball_query(self.radius, self.nsample, xyz, new_xyz) + xyz_trans = xyz.transpose(1, 2).contiguous() + grouped_xyz = grouping_operation(xyz_trans, idx) # (B, 3, npoint, nsample) + grouped_xyz -= new_xyz.transpose(1, 2).unsqueeze(-1) + + if features is not None: + grouped_features = grouping_operation(features, idx) + if self.use_xyz: + new_features = torch.cat( + [grouped_xyz, grouped_features], dim=1 + ) # (B, C + 3, npoint, nsample) + else: + new_features = grouped_features + else: + assert ( + self.use_xyz + ), "Cannot have not features and not use xyz as a feature!" + new_features = grouped_xyz + + return new_features + + +class GroupAll(nn.Module): + r""" + Groups all features + + Parameters + --------- + """ + + def __init__(self, use_xyz=True): + # type: (GroupAll, bool) -> None + super(GroupAll, self).__init__() + self.use_xyz = use_xyz + + def forward(self, xyz, new_xyz, features=None): + # type: (GroupAll, torch.Tensor, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + Ignored + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, C + 3, 1, N) tensor + """ + + grouped_xyz = xyz.transpose(1, 2).unsqueeze(2) + if features is not None: + grouped_features = features.unsqueeze(2) + if self.use_xyz: + new_features = torch.cat( + [grouped_xyz, grouped_features], dim=1 + ) # (B, 3 + C, 1, N) + else: + new_features = grouped_features + else: + new_features = grouped_xyz + + return new_features diff --git a/zoo/PointMLP/pointnet2_ops_lib/MANIFEST.in b/zoo/PointMLP/pointnet2_ops_lib/MANIFEST.in new file mode 100644 index 0000000..a4eb5de --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops_lib/MANIFEST.in @@ -0,0 +1 @@ +graft pointnet2_ops/_ext-src diff --git a/zoo/PointMLP/pointnet2_ops_lib/setup.py b/zoo/PointMLP/pointnet2_ops_lib/setup.py new file mode 100644 index 0000000..faf7154 --- /dev/null +++ b/zoo/PointMLP/pointnet2_ops_lib/setup.py @@ -0,0 +1,39 @@ +import glob +import os +import os.path as osp + +from setuptools import find_packages, setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + +this_dir = osp.dirname(osp.abspath(__file__)) +_ext_src_root = osp.join("pointnet2_ops", "_ext-src") +_ext_sources = glob.glob(osp.join(_ext_src_root, "src", "*.cpp")) + glob.glob( + osp.join(_ext_src_root, "src", "*.cu") +) +_ext_headers = glob.glob(osp.join(_ext_src_root, "include", "*")) + +requirements = ["torch>=1.4"] + +exec(open(osp.join("pointnet2_ops", "_version.py")).read()) + +os.environ["TORCH_CUDA_ARCH_LIST"] = "3.7+PTX;5.0;6.0;6.1;6.2;7.0;7.5" +setup( + name="pointnet2_ops", + version=__version__, + author="Erik Wijmans", + packages=find_packages(), + install_requires=requirements, + ext_modules=[ + CUDAExtension( + name="pointnet2_ops._ext", + sources=_ext_sources, + extra_compile_args={ + "cxx": ["-O3"], + "nvcc": ["-O3", "-Xfatbin", "-compress-all"], + }, + include_dirs=[osp.join(this_dir, _ext_src_root, "include")], + ) + ], + cmdclass={"build_ext": BuildExtension}, + include_package_data=True, +) diff --git a/zoo/PointMLP/requirements.txt b/zoo/PointMLP/requirements.txt new file mode 100644 index 0000000..3c44c85 --- /dev/null +++ b/zoo/PointMLP/requirements.txt @@ -0,0 +1,13 @@ +cudatoolkit=10.2.89 +cycler=0.10.0 +einops=0.3.0 +h5py=3.2.1 +matplotlib=3.4.2 +numpy=1.20.2 +numpy-base=1.20.2 +pytorch=1.8.1 +pyyaml=5.4.1 +scikit-learn=0.24.2 +scipy=1.6.3 +torchvision=0.9.1 +tqdm=4.61.1 diff --git a/zoo/PointMLP/test.py b/zoo/PointMLP/test.py new file mode 100644 index 0000000..6806a8a --- /dev/null +++ b/zoo/PointMLP/test.py @@ -0,0 +1,235 @@ +from __future__ import print_function +import os +import argparse +import torch +from data_util import ShapeNetC +import torch.nn.functional as F +import models as models +import numpy as np +from torch.utils.data import DataLoader +from util import to_categorical, compute_overall_iou, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + if not args.eval: # backup the running files + os.system('cp main_cls.py checkpoints' + '/' + args.exp_name + '/' + 'main.py.backup') + os.system('cp model/GDANet_ptseg.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_ptseg.py.backup') + os.system('cp util.GDANet_util.py checkpoints' + '/' + args.exp_name + '/' + 'GDANet_util.py.backup') + os.system('cp util.data_util.py checkpoints' + '/' + args.exp_name + '/' + 'data_util.py.backup') + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetC(partition='shapenet-c', sub='add_global_4', class_choice=None) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=6, drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = models.__dict__[args.model](num_part).to(device) + # io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("/mnt/lustre/ldkong/models/pointMLP-pytorch/checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--model', type=str, default='pointMLP') + parser.add_argument('--exp_name', type=str, default='GDANet', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=64, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=False, + help='Use SGD') + parser.add_argument('--scheduler', type=str, default='step', + help='lr scheduler') + parser.add_argument('--step', type=int, default=40, + help='lr decay step') + parser.add_argument('--lr', type=float, default=0.003, metavar='LR', + help='learning rate') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--manual_seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=2048, + help='num of points to use') + parser.add_argument('--resume', type=bool, default=False, + help='Resume training or not') + parser.add_argument('--model_type', type=str, default='insiou', + help='choose to test the best insiou/clsiou/acc model (options: insiou, clsiou, acc)') + + args = parser.parse_args() + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + # train(args, io) + pass + else: + test(args, io) + diff --git a/zoo/PointMLP/test.sh b/zoo/PointMLP/test.sh new file mode 100644 index 0000000..6687063 --- /dev/null +++ b/zoo/PointMLP/test.sh @@ -0,0 +1,5 @@ +CUDA_VISIBLE_DEVICES=7 python test.py \ + --eval True \ + --exp_name pointMLP_train1 \ + --model_type insiou \ + --test_batch_size 16 \ No newline at end of file diff --git a/zoo/PointMLP/train.py b/zoo/PointMLP/train.py new file mode 100644 index 0000000..c8524a0 --- /dev/null +++ b/zoo/PointMLP/train.py @@ -0,0 +1,432 @@ +from __future__ import print_function +import os +import argparse +import torch +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR +from data_util import PartNormalDataset, ShapeNetPart +import torch.nn.functional as F +import torch.nn as nn +import models as models +import numpy as np +from torch.utils.data import DataLoader +from util import to_categorical, compute_overall_iou, IOStream +from tqdm import tqdm +from collections import defaultdict +from torch.autograd import Variable +import random + + +classes_str = ['aero','bag','cap','car','chair','ear','guitar','knife','lamp','lapt','moto','mug','Pistol','rock','stake','table'] + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/' + args.exp_name): + os.makedirs('checkpoints/' + args.exp_name) + + +def weight_init(m): + if isinstance(m, torch.nn.Linear): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.Conv1d): + torch.nn.init.xavier_normal_(m.weight) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm2d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + elif isinstance(m, torch.nn.BatchNorm1d): + torch.nn.init.constant_(m.weight, 1) + torch.nn.init.constant_(m.bias, 0) + + +def train(args, io): + + # ============= Model =================== + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = models.__dict__[args.model](num_part).to(device) + io.cprint(str(model)) + + model.apply(weight_init) + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + '''Resume or not''' + if args.resume: + state_dict = torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name, + map_location=torch.device('cpu'))['model'] + for k in state_dict.keys(): + if 'module' not in k: + from collections import OrderedDict + new_state_dict = OrderedDict() + for k in state_dict: + new_state_dict['module.' + k] = state_dict[k] + state_dict = new_state_dict + break + model.load_state_dict(state_dict) + + print("Resume training model...") + print(torch.load("checkpoints/%s/best_insiou_model.pth" % args.exp_name).keys()) + else: + print("Training from scratch...") + + # =========== Dataloader ================= + # train_data = PartNormalDataset(npoints=2048, split='trainval', normalize=False) + train_data = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + print("The number of training data is:%d", len(train_data)) + + # test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + test_data = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + print("The number of test data is:%d", len(test_data)) + + train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True, num_workers=args.workers, drop_last=True) + + test_loader = DataLoader(test_data, batch_size=16, shuffle=False, num_workers=args.workers, drop_last=False) + + # ============= Optimizer ================ + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=0) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=0) + + if args.scheduler == 'cos': + print("Use CosLR") + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr if args.use_sgd else args.lr / 100) + else: + print("Use StepLR") + scheduler = StepLR(opt, step_size=args.step, gamma=0.5) + + # ============= Training ================= + best_acc = 0 + best_class_iou = 0 + best_instance_iou = 0 + num_part = 50 + num_classes = 16 + + for epoch in range(args.epochs): + + train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io) + + test_metrics, total_per_cat_iou = test_epoch(test_loader, model, epoch, num_part, num_classes, io) + + # 1. when get the best accuracy, save the model: + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + io.cprint('Max Acc:%.5f' % best_acc) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_acc': best_acc} + torch.save(state, 'checkpoints/%s/best_acc_model.pth' % args.exp_name) + + # 2. when get the best instance_iou, save the model: + if test_metrics['shape_avg_iou'] > best_instance_iou: + best_instance_iou = test_metrics['shape_avg_iou'] + io.cprint('Max instance iou:%.5f' % best_instance_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_instance_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/best_insiou_model.pth' % args.exp_name) + + # 3. when get the best class_iou, save the model: + # first we need to calculate the average per-class iou + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + avg_class_iou = class_iou / 16 + if avg_class_iou > best_class_iou: + best_class_iou = avg_class_iou + # print the iou of each class: + for cat_idx in range(16): + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) + io.cprint('Max class iou:%.5f' % best_class_iou) + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': epoch, 'test_class_iou': best_class_iou} + torch.save(state, 'checkpoints/%s/best_clsiou_model.pth' % args.exp_name) + + # report best acc, ins_iou, cls_iou + io.cprint('Final Max Acc:%.5f' % best_acc) + io.cprint('Final Max instance iou:%.5f' % best_instance_iou) + io.cprint('Final Max class iou:%.5f' % best_class_iou) + # save last model + state = { + 'model': model.module.state_dict() if torch.cuda.device_count() > 1 else model.state_dict(), + 'optimizer': opt.state_dict(), 'epoch': args.epochs - 1, 'test_iou': best_instance_iou} + torch.save(state, 'checkpoints/%s/model_ep%d.pth' % (args.exp_name, args.epochs)) + + +def train_epoch(train_loader, model, opt, scheduler, epoch, num_part, num_classes, io): + train_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + metrics = defaultdict(lambda: list()) + model.train() + + for batch_id, (points, label, target) in tqdm(enumerate(train_loader), total=len(train_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + # target: b,n + seg_pred = model(points, to_categorical(label, num_classes)) # seg_pred: b,n,50 + loss = F.nll_loss(seg_pred.contiguous().view(-1, num_part), target.view(-1, 1)[:, 0]) + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # list of of current batch_iou:[iou1,iou2,...,iou#b_size] + # total iou of current batch in each process: + batch_shapeious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # Loss backward + loss = torch.mean(loss) + opt.zero_grad() + loss.backward() + opt.step() + + # accuracy + seg_pred = seg_pred.contiguous().view(-1, num_part) # b*n,50 + target = target.view(-1, 1)[:, 0] # b*n + pred_choice = seg_pred.contiguous().data.max(1)[1] # b*n + correct = pred_choice.eq(target.contiguous().data).sum() # torch.int64: total number of correct-predict pts + + # sum + shape_ious += batch_shapeious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + train_loss += loss.item() * batch_size + accuracy.append(correct.item()/(batch_size * num_point)) # append the accuracy of each iteration + + # Note: We do not need to calculate per_class iou during training + + if args.scheduler == 'cos': + scheduler.step() + elif args.scheduler == 'step': + if opt.param_groups[0]['lr'] > 0.9e-5: + scheduler.step() + if opt.param_groups[0]['lr'] < 0.9e-5: + for param_group in opt.param_groups: + param_group['lr'] = 0.9e-5 + io.cprint('Learning rate: %f' % opt.param_groups[0]['lr']) + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Train %d, loss: %f, train acc: %f, train ins_iou: %f' % (epoch+1, train_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + io.cprint(outstr) + + +def test_epoch(test_loader, model, epoch, num_part, num_classes, io): + test_loss = 0.0 + count = 0.0 + accuracy = [] + shape_ious = 0.0 + final_total_per_cat_iou = np.zeros(16).astype(np.float32) + final_total_per_cat_seen = np.zeros(16).astype(np.int32) + metrics = defaultdict(lambda: list()) + model.eval() + + # label_size: b, means each sample has one corresponding class + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze(1).cuda(non_blocking=True), target.cuda(non_blocking=True) + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + # per category iou at each batch_size: + + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx], denotes current sample belongs to which cat + final_total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] # add the iou belongs to this cat + final_total_per_cat_seen[cur_gt_label] += 1 # count the number of this cat is chosen + + # total iou of current batch in each process: + batch_ious = seg_pred.new_tensor([np.sum(batch_shapeious)], dtype=torch.float64) # same device with seg_pred!!! + + # prepare seg_pred and target for later calculating loss and acc: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + # Loss + loss = F.nll_loss(seg_pred.contiguous(), target.contiguous()) + + # accuracy: + pred_choice = seg_pred.data.max(1)[1] # b*n + correct = pred_choice.eq(target.data).sum() # torch.int64: total number of correct-predict pts + + loss = torch.mean(loss) + shape_ious += batch_ious.item() # count the sum of ious in each iteration + count += batch_size # count the total number of samples in each iteration + test_loss += loss.item() * batch_size + accuracy.append(correct.item() / (batch_size * num_point)) # append the accuracy of each iteration + + for cat_idx in range(16): + if final_total_per_cat_seen[cat_idx] > 0: # indicating this cat is included during previous iou appending + final_total_per_cat_iou[cat_idx] = final_total_per_cat_iou[cat_idx] / final_total_per_cat_seen[cat_idx] # avg class iou across all samples + + metrics['accuracy'] = np.mean(accuracy) + metrics['shape_avg_iou'] = shape_ious * 1.0 / count + + outstr = 'Test %d, loss: %f, test acc: %f test ins_iou: %f' % (epoch + 1, test_loss * 1.0 / count, + metrics['accuracy'], metrics['shape_avg_iou']) + + io.cprint(outstr) + + return metrics, final_total_per_cat_iou + + +def test(args, io): + # Dataloader + test_data = PartNormalDataset(npoints=2048, split='test', normalize=False) + print("The number of test data is:%d", len(test_data)) + + test_loader = DataLoader(test_data, batch_size=args.test_batch_size, shuffle=False, num_workers=args.workers, + drop_last=False) + + # Try to load models + num_part = 50 + device = torch.device("cuda" if args.cuda else "cpu") + + model = models.__dict__[args.model](num_part).to(device) + io.cprint(str(model)) + + from collections import OrderedDict + state_dict = torch.load("checkpoints/%s/best_%s_model.pth" % (args.exp_name, args.model_type), + map_location=torch.device('cpu'))['model'] + + new_state_dict = OrderedDict() + for layer in state_dict: + new_state_dict[layer.replace('module.', '')] = state_dict[layer] + model.load_state_dict(new_state_dict) + + model.eval() + num_part = 50 + num_classes = 16 + metrics = defaultdict(lambda: list()) + hist_acc = [] + shape_ious = [] + total_per_cat_iou = np.zeros((16)).astype(np.float32) + total_per_cat_seen = np.zeros((16)).astype(np.int32) + + for batch_id, (points, label, target) in tqdm(enumerate(test_loader), total=len(test_loader), smoothing=0.9): + batch_size, num_point, _ = points.size() + points, label, target = Variable(points.float()), Variable(label.long()), Variable(target.long()) + points = points.transpose(2, 1) + points, label, target = points.cuda(non_blocking=True), label.squeeze().cuda(non_blocking=True), target.cuda(non_blocking=True) + + with torch.no_grad(): + seg_pred = model(points, to_categorical(label, num_classes)) # b,n,50 + + # instance iou without considering the class average at each batch_size: + batch_shapeious = compute_overall_iou(seg_pred, target, num_part) # [b] + shape_ious += batch_shapeious # iou +=, equals to .append + + # per category iou at each batch_size: + for shape_idx in range(seg_pred.size(0)): # sample_idx + cur_gt_label = label[shape_idx] # label[sample_idx] + total_per_cat_iou[cur_gt_label] += batch_shapeious[shape_idx] + total_per_cat_seen[cur_gt_label] += 1 + + # accuracy: + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + metrics['accuracy'].append(correct.item() / (batch_size * num_point)) + + hist_acc += metrics['accuracy'] + metrics['accuracy'] = np.mean(hist_acc) + metrics['shape_avg_iou'] = np.mean(shape_ious) + for cat_idx in range(16): + if total_per_cat_seen[cat_idx] > 0: + total_per_cat_iou[cat_idx] = total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx] + + # First we need to calculate the iou of each class and the avg class iou: + class_iou = 0 + for cat_idx in range(16): + class_iou += total_per_cat_iou[cat_idx] + io.cprint(classes_str[cat_idx] + ' iou: ' + str(total_per_cat_iou[cat_idx])) # print the iou of each class + avg_class_iou = class_iou / 16 + outstr = 'Test :: test acc: %f test class mIOU: %f, test instance mIOU: %f' % (metrics['accuracy'], avg_class_iou, metrics['shape_avg_iou']) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='3D Shape Part Segmentation') + parser.add_argument('--model', type=str, default='PointMLP1') + parser.add_argument('--exp_name', type=str, default='train1', metavar='N', + help='Name of the experiment') + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=350, metavar='N', + help='number of episode to train') + parser.add_argument('--use_sgd', type=bool, default=False, + help='Use SGD') + parser.add_argument('--scheduler', type=str, default='step', + help='lr scheduler') + parser.add_argument('--step', type=int, default=40, + help='lr decay step') + parser.add_argument('--lr', type=float, default=0.003, metavar='LR', + help='learning rate') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--manual_seed', type=int, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=2048, + help='num of points to use') + parser.add_argument('--workers', type=int, default=4) + parser.add_argument('--resume', type=bool, default=False, + help='Resume training or not') + parser.add_argument('--model_type', type=str, default='insiou', + help='choose to test the best insiou/clsiou/acc model (options: insiou, clsiou, acc)') + + args = parser.parse_args() + args.exp_name = args.model+"_"+args.exp_name + + _init_() + + if not args.eval: + io = IOStream('checkpoints/' + args.exp_name + '/%s_train.log' % (args.exp_name)) + else: + io = IOStream('checkpoints/' + args.exp_name + '/%s_test.log' % (args.exp_name)) + io.cprint(str(args)) + + if args.manual_seed is not None: + random.seed(args.manual_seed) + np.random.seed(args.manual_seed) + torch.manual_seed(args.manual_seed) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + if args.cuda: + io.cprint('Using GPU') + if args.manual_seed is not None: + torch.cuda.manual_seed(args.manual_seed) + torch.cuda.manual_seed_all(args.manual_seed) + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + test(args, io) diff --git a/zoo/PointMLP/train.sh b/zoo/PointMLP/train.sh new file mode 100644 index 0000000..89d8399 --- /dev/null +++ b/zoo/PointMLP/train.sh @@ -0,0 +1,3 @@ +CUDA_VISIBLE_DEVICES=2 python train.py \ + --model pointMLP \ + --exp_name train1 \ No newline at end of file diff --git a/zoo/PointMLP/util.py b/zoo/PointMLP/util.py new file mode 100644 index 0000000..0b4ffe3 --- /dev/null +++ b/zoo/PointMLP/util.py @@ -0,0 +1,274 @@ +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda(non_blocking=True) + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] + + + +# create a file and write the text into it +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + + +# ----------------------------------------------------------------------------- +# Functions for parsing args +# ----------------------------------------------------------------------------- +import yaml +import os +from ast import literal_eval +import copy + + +class CfgNode(dict): + """ + CfgNode represents an internal node in the configuration tree. It's a simple + dict-like container that allows for attribute-based access to keys. + """ + + def __init__(self, init_dict=None, key_list=None, new_allowed=False): + # Recursively convert nested dictionaries in init_dict into CfgNodes + init_dict = {} if init_dict is None else init_dict + key_list = [] if key_list is None else key_list + for k, v in init_dict.items(): + if type(v) is dict: + # Convert dict to CfgNode + init_dict[k] = CfgNode(v, key_list=key_list + [k]) + super(CfgNode, self).__init__(init_dict) + + def __getattr__(self, name): + if name in self: + return self[name] + else: + raise AttributeError(name) + + def __setattr__(self, name, value): + self[name] = value + + def __str__(self): + def _indent(s_, num_spaces): + s = s_.split("\n") + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(num_spaces * " ") + line for line in s] + s = "\n".join(s) + s = first + "\n" + s + return s + + r = "" + s = [] + for k, v in sorted(self.items()): + seperator = "\n" if isinstance(v, CfgNode) else " " + attr_str = "{}:{}{}".format(str(k), seperator, str(v)) + attr_str = _indent(attr_str, 2) + s.append(attr_str) + r += "\n".join(s) + return r + + def __repr__(self): + return "{}({})".format(self.__class__.__name__, super(CfgNode, self).__repr__()) + + +def load_cfg_from_cfg_file(file): + cfg = {} + assert os.path.isfile(file) and file.endswith('.yaml'), \ + '{} is not a yaml file'.format(file) + + with open(file, 'r') as f: + cfg_from_file = yaml.safe_load(f) + + for key in cfg_from_file: + for k, v in cfg_from_file[key].items(): + cfg[k] = v + + cfg = CfgNode(cfg) + return cfg + + +def merge_cfg_from_list(cfg, cfg_list): + new_cfg = copy.deepcopy(cfg) + assert len(cfg_list) % 2 == 0 + for full_key, v in zip(cfg_list[0::2], cfg_list[1::2]): + subkey = full_key.split('.')[-1] + assert subkey in cfg, 'Non-existent key: {}'.format(full_key) + value = _decode_cfg_value(v) + value = _check_and_coerce_cfg_value_type( + value, cfg[subkey], subkey, full_key + ) + setattr(new_cfg, subkey, value) + + return new_cfg + + +def _decode_cfg_value(v): + """Decodes a raw config value (e.g., from a yaml config files or command + line argument) into a Python object. + """ + # All remaining processing is only applied to strings + if not isinstance(v, str): + return v + # Try to interpret `v` as a: + # string, number, tuple, list, dict, boolean, or None + try: + v = literal_eval(v) + # The following two excepts allow v to pass through when it represents a + # string. + # + # Longer explanation: + # The type of v is always a string (before calling literal_eval), but + # sometimes it *represents* a string and other times a data structure, like + # a list. In the case that v represents a string, what we got back from the + # yaml parser is 'foo' *without quotes* (so, not '"foo"'). literal_eval is + # ok with '"foo"', but will raise a ValueError if given 'foo'. In other + # cases, like paths (v = 'foo/bar' and not v = '"foo/bar"'), literal_eval + # will raise a SyntaxError. + except ValueError: + pass + except SyntaxError: + pass + return v + + +def _check_and_coerce_cfg_value_type(replacement, original, key, full_key): + """Checks that `replacement`, which is intended to replace `original` is of + the right type. The type is correct if it matches exactly or is one of a few + cases in which the type can be easily coerced. + """ + original_type = type(original) + replacement_type = type(replacement) + + # The types must match (with some exceptions) + if replacement_type == original_type: + return replacement + + # Cast replacement from from_type to to_type if the replacement and original + # types match from_type and to_type + def conditional_cast(from_type, to_type): + if replacement_type == from_type and original_type == to_type: + return True, to_type(replacement) + else: + return False, None + + # Conditionally casts + # list <-> tuple + casts = [(tuple, list), (list, tuple)] + # For py2: allow converting from str (bytes) to a unicode string + try: + casts.append((str, unicode)) # noqa: F821 + except Exception: + pass + + for (from_type, to_type) in casts: + converted, converted_value = conditional_cast(from_type, to_type) + if converted: + return converted_value + + raise ValueError( + "Type mismatch ({} vs. {}) with values ({} vs. {}) for config " + "key: {}".format( + original_type, replacement_type, original, replacement, full_key + ) + ) + + + +def find_free_port(): + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Binding to port 0 will cause the OS to find an available port for us + sock.bind(("", 0)) + port = sock.getsockname()[1] + sock.close() + # NOTE: there is still a chance the port could be taken by other processes. + return port + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() diff --git a/zoo/PointMLP/util/PAConv_util.py b/zoo/PointMLP/util/PAConv_util.py new file mode 100644 index 0000000..d5700a0 --- /dev/null +++ b/zoo/PointMLP/util/PAConv_util.py @@ -0,0 +1,143 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def knn(x, k): + B, _, N = x.size() + inner = -2 * torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x ** 2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + _, idx = pairwise_distance.topk(k=k, dim=-1) # (batch_size, num_points, k) + + return idx, pairwise_distance + + +def get_graph_feature(x, k, idx): + """original function in DGCNN""" + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + idx_base = torch.arange(0, batch_size, device=x.device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((neighbor - x, neighbor), dim=3) # (xj-xi, xj): b,n,k,2c + + return feature + + +def get_ed(x, y): + """calculate the Euclidean distance between two points""" + ed = torch.norm(x - y, dim=-1).reshape(x.shape[0], 1) + return ed + + +def get_scorenet_input(x, k, idx): + """xyz=(center, neighbor, neighbor-center, ed)""" + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1) * num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() + + neighbor = x.view(batch_size * num_points, -1)[idx, :] + + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + x1 = x.view(batch_size * num_points * k, -1) # x1 only for calculating Euclidean distance + ed = get_ed(x1, neighbor).view(batch_size, num_points, k, 1) + + neighbor = neighbor.view(batch_size, num_points, k, num_dims) + + xyz = torch.cat((x, neighbor, neighbor - x, ed), dim=3).permute(0, 3, 1, 2) # b,10,n,k + + return xyz + + +def feat_trans_dgcnn(point_input, kernel, m): + """transforming features using weight matrices""" + # following get_graph_feature in DGCNN: torch.cat((neighbor - center, neighbor), dim=3) + B, _, N = point_input.size() # b, 2cin, n + point_output = torch.matmul(point_input.permute(0, 2, 1).repeat(1, 1, 2), kernel).view(B, N, m, -1) # b,n,m,cout + center_output = torch.matmul(point_input.permute(0, 2, 1), kernel[:point_input.size(1)]).view(B, N, m, -1) # b,n,m,cout + return point_output, center_output + + +class ScoreNet(nn.Module): + + def __init__(self, in_channel, out_channel, hidden_unit=[16], last_bn=False): + super(ScoreNet, self).__init__() + self.hidden_unit = hidden_unit + self.last_bn = last_bn + self.mlp_convs_hidden = nn.ModuleList() + self.mlp_bns_hidden = nn.ModuleList() + + if hidden_unit is None or len(hidden_unit) == 0: + self.mlp_convs_nohidden = nn.Conv2d(in_channel, out_channel, 1, bias=not last_bn) + if self.last_bn: + self.mlp_bns_nohidden = nn.BatchNorm2d(out_channel) + + else: + self.mlp_convs_hidden.append(nn.Conv2d(in_channel, hidden_unit[0], 1, bias=False)) # from in_channel to first hidden + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[0])) + for i in range(1, len(hidden_unit)): # from 2nd hidden to next hidden to last hidden + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[i - 1], hidden_unit[i], 1, bias=False)) + self.mlp_bns_hidden.append(nn.BatchNorm2d(hidden_unit[i])) + self.mlp_convs_hidden.append(nn.Conv2d(hidden_unit[-1], out_channel, 1, bias=not last_bn)) # from last hidden to out_channel + self.mlp_bns_hidden.append(nn.BatchNorm2d(out_channel)) + + def forward(self, xyz, calc_scores='softmax', bias=0): + B, _, N, K = xyz.size() + scores = xyz + + if self.hidden_unit is None or len(self.hidden_unit) == 0: + if self.last_bn: + scores = self.mlp_bns_nohidden(self.mlp_convs_nohidden(scores)) + else: + scores = self.mlp_convs_nohidden(scores) + + else: + for i, conv in enumerate(self.mlp_convs_hidden): + if i == len(self.mlp_convs_hidden)-1: # if the output layer, no ReLU + if self.last_bn: + bn = self.mlp_bns_hidden[i] + scores = bn(conv(scores)) + else: + scores = conv(scores) + else: + bn = self.mlp_bns_hidden[i] + scores = F.relu(bn(conv(scores))) + + if calc_scores == 'softmax': + scores = F.softmax(scores, dim=1)+bias # B*m*N*K + elif calc_scores == 'sigmoid': + scores = torch.sigmoid(scores)+bias # B*m*N*K + else: + raise ValueError('Not Implemented!') + + return scores.permute(0, 2, 3, 1) # B*N*K*m diff --git a/zoo/PointMLP/util/util.py b/zoo/PointMLP/util/util.py new file mode 100644 index 0000000..7164efc --- /dev/null +++ b/zoo/PointMLP/util/util.py @@ -0,0 +1,277 @@ +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda(non_blocking=True) + return new_y + + +def compute_overall_iou(pred, target, num_classes): + shape_ious = [] + pred = pred.max(dim=2)[1] # (batch_size, num_points) the pred_class_idx of each point in each sample + pred_np = pred.cpu().data.numpy() + + target_np = target.cpu().data.numpy() + for shape_idx in range(pred.size(0)): # sample_idx + part_ious = [] + for part in range(num_classes): # class_idx! no matter which category, only consider all part_classes of all categories, check all 50 classes + # for target, each point has a class no matter which category owns this point! also 50 classes!!! + # only return 1 when both belongs to this class, which means correct: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + # always return 1 when either is belongs to this class: + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + + F = np.sum(target_np[shape_idx] == part) + + if F != 0: + iou = I / float(U) # iou across all points for this class + part_ious.append(iou) # append the iou of this class + shape_ious.append(np.mean(part_ious)) # each time append an average iou across all classes of this sample (sample_level!) + return shape_ious # [batch_size] + + +# create a file and write the text into it +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() + + +# ----------------------------------------------------------------------------- +# Functions for parsing args +# ----------------------------------------------------------------------------- +import yaml +import os +from ast import literal_eval +import copy + + +class CfgNode(dict): + """ + CfgNode represents an internal node in the configuration tree. It's a simple + dict-like container that allows for attribute-based access to keys. + """ + + def __init__(self, init_dict=None, key_list=None, new_allowed=False): + # Recursively convert nested dictionaries in init_dict into CfgNodes + init_dict = {} if init_dict is None else init_dict + key_list = [] if key_list is None else key_list + for k, v in init_dict.items(): + if type(v) is dict: + # Convert dict to CfgNode + init_dict[k] = CfgNode(v, key_list=key_list + [k]) + super(CfgNode, self).__init__(init_dict) + + def __getattr__(self, name): + if name in self: + return self[name] + else: + raise AttributeError(name) + + def __setattr__(self, name, value): + self[name] = value + + def __str__(self): + def _indent(s_, num_spaces): + s = s_.split("\n") + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(num_spaces * " ") + line for line in s] + s = "\n".join(s) + s = first + "\n" + s + return s + + r = "" + s = [] + for k, v in sorted(self.items()): + seperator = "\n" if isinstance(v, CfgNode) else " " + attr_str = "{}:{}{}".format(str(k), seperator, str(v)) + attr_str = _indent(attr_str, 2) + s.append(attr_str) + r += "\n".join(s) + return r + + def __repr__(self): + return "{}({})".format(self.__class__.__name__, super(CfgNode, self).__repr__()) + + +def load_cfg_from_cfg_file(file): + cfg = {} + assert os.path.isfile(file) and file.endswith('.yaml'), \ + '{} is not a yaml file'.format(file) + + with open(file, 'r') as f: + cfg_from_file = yaml.safe_load(f) + + for key in cfg_from_file: + for k, v in cfg_from_file[key].items(): + cfg[k] = v + + cfg = CfgNode(cfg) + return cfg + + +def merge_cfg_from_list(cfg, cfg_list): + new_cfg = copy.deepcopy(cfg) + assert len(cfg_list) % 2 == 0 + for full_key, v in zip(cfg_list[0::2], cfg_list[1::2]): + subkey = full_key.split('.')[-1] + assert subkey in cfg, 'Non-existent key: {}'.format(full_key) + value = _decode_cfg_value(v) + value = _check_and_coerce_cfg_value_type( + value, cfg[subkey], subkey, full_key + ) + setattr(new_cfg, subkey, value) + + return new_cfg + + +def _decode_cfg_value(v): + """Decodes a raw config value (e.g., from a yaml config files or command + line argument) into a Python object. + """ + # All remaining processing is only applied to strings + if not isinstance(v, str): + return v + # Try to interpret `v` as a: + # string, number, tuple, list, dict, boolean, or None + try: + v = literal_eval(v) + # The following two excepts allow v to pass through when it represents a + # string. + # + # Longer explanation: + # The type of v is always a string (before calling literal_eval), but + # sometimes it *represents* a string and other times a data structure, like + # a list. In the case that v represents a string, what we got back from the + # yaml parser is 'foo' *without quotes* (so, not '"foo"'). literal_eval is + # ok with '"foo"', but will raise a ValueError if given 'foo'. In other + # cases, like paths (v = 'foo/bar' and not v = '"foo/bar"'), literal_eval + # will raise a SyntaxError. + except ValueError: + pass + except SyntaxError: + pass + return v + + +def _check_and_coerce_cfg_value_type(replacement, original, key, full_key): + """Checks that `replacement`, which is intended to replace `original` is of + the right type. The type is correct if it matches exactly or is one of a few + cases in which the type can be easily coerced. + """ + original_type = type(original) + replacement_type = type(replacement) + + # The types must match (with some exceptions) + if replacement_type == original_type: + return replacement + + # Cast replacement from from_type to to_type if the replacement and original + # types match from_type and to_type + def conditional_cast(from_type, to_type): + if replacement_type == from_type and original_type == to_type: + return True, to_type(replacement) + else: + return False, None + + # Conditionally casts + # list <-> tuple + casts = [(tuple, list), (list, tuple)] + # For py2: allow converting from str (bytes) to a unicode string + try: + casts.append((str, unicode)) # noqa: F821 + except Exception: + pass + + for (from_type, to_type) in casts: + converted, converted_value = conditional_cast(from_type, to_type) + if converted: + return converted_value + + raise ValueError( + "Type mismatch ({} vs. {}) with values ({} vs. {}) for config " + "key: {}".format( + original_type, replacement_type, original, replacement, full_key + ) + ) + +def _assert_with_logging(cond, msg): + if not cond: + logger.debug(msg) + assert cond, msg + + +def find_free_port(): + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Binding to port 0 will cause the OS to find an available port for us + sock.bind(("", 0)) + port = sock.getsockname()[1] + sock.close() + # NOTE: there is still a chance the port could be taken by other processes. + return port + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() diff --git a/zoo/PointTransformers/README.md b/zoo/PointTransformers/README.md new file mode 100644 index 0000000..4a63fc5 --- /dev/null +++ b/zoo/PointTransformers/README.md @@ -0,0 +1,39 @@ +# Pytorch Implementation of Various Point Transformers + +Recently, various methods applied transformers to point clouds: [PCT: Point Cloud Transformer (Meng-Hao Guo et al.)](https://arxiv.org/abs/2012.09688), [Point Transformer (Nico Engel et al.)](https://arxiv.org/abs/2011.00931), [Point Transformer (Hengshuang Zhao et al.)](https://arxiv.org/abs/2012.09164). This repo is a pytorch implementation for these methods and aims to compare them under a fair setting. Currently, all three methods are implemented, while tuning their hyperparameters. + + +## Classification +### Data Preparation +Download alignment **ModelNet** [here](https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip) and save in `modelnet40_normal_resampled`. + +### Run +Change which method to use in `config/cls.yaml` and run +``` +python train_cls.py +``` +### Results +Using Adam with learning rate decay 0.3 for every 50 epochs, train for 200 epochs; data augmentation follows [this repo](https://github.com/yanx27/Pointnet_Pointnet2_pytorch). For Hengshuang and Nico, initial LR is 1e-3 (I would appreciate if someone could fine-tune these hyper-paramters); for Menghao, initial LR is 1e-4, as suggested by the [author](https://github.com/MenghaoGuo). ModelNet40 classification results (instance average) are listed below: +| Model | Accuracy | +|--|--| +| Hengshuang | 91.7 | +| Menghao | 92.6 | +| Nico | 85.5 | + + +## Part Segmentation +### Data Preparation +Download alignment **ShapeNet** [here](https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip) and save in `data/shapenetcore_partanno_segmentation_benchmark_v0_normal`. + +### Run +Change which method to use in `config/partseg.yaml` and run +``` +python train_partseg.py +``` +### Results +Currently only Hengshuang's method is implemented. + +### Miscellaneous +Some code and training settings are borrowed from https://github.com/yanx27/Pointnet_Pointnet2_pytorch. +Code for [PCT: Point Cloud Transformer (Meng-Hao Guo et al.)](https://arxiv.org/abs/2012.09688) is adapted from the author's Jittor implementation https://github.com/MenghaoGuo/PCT. + diff --git a/zoo/PointTransformers/config/cls.yaml b/zoo/PointTransformers/config/cls.yaml new file mode 100644 index 0000000..1d7783d --- /dev/null +++ b/zoo/PointTransformers/config/cls.yaml @@ -0,0 +1,19 @@ +batch_size: 16 +epoch: 200 +learning_rate: 1e-3 +gpu: 1 +num_point: 1024 +optimizer: Adam +weight_decay: 1e-4 +normal: True + +defaults: + - model: Menghao + +hydra: + run: + dir: log/cls/${model.name} + + sweep: + dir: log/cls + subdir: ${model.name} \ No newline at end of file diff --git a/zoo/PointTransformers/config/model/Hengshuang.yaml b/zoo/PointTransformers/config/model/Hengshuang.yaml new file mode 100644 index 0000000..f3cd12e --- /dev/null +++ b/zoo/PointTransformers/config/model/Hengshuang.yaml @@ -0,0 +1,5 @@ +# @package _group_ +nneighbor: 16 +nblocks: 4 +transformer_dim: 512 +name: Hengshuang \ No newline at end of file diff --git a/zoo/PointTransformers/config/model/Menghao.yaml b/zoo/PointTransformers/config/model/Menghao.yaml new file mode 100644 index 0000000..fea1a80 --- /dev/null +++ b/zoo/PointTransformers/config/model/Menghao.yaml @@ -0,0 +1,2 @@ +# @package _group_ +name: Menghao \ No newline at end of file diff --git a/zoo/PointTransformers/config/model/Nico.yaml b/zoo/PointTransformers/config/model/Nico.yaml new file mode 100644 index 0000000..9fd6b2e --- /dev/null +++ b/zoo/PointTransformers/config/model/Nico.yaml @@ -0,0 +1,9 @@ +# @package _group_ +n_head: 8 +m: 4 +k: 64 +global_k: 128 +global_dim: 512 +local_dim: 256 +reduce_dim: 64 +name: Nico \ No newline at end of file diff --git a/zoo/PointTransformers/config/partseg.yaml b/zoo/PointTransformers/config/partseg.yaml new file mode 100644 index 0000000..32d6a37 --- /dev/null +++ b/zoo/PointTransformers/config/partseg.yaml @@ -0,0 +1,21 @@ +batch_size: 12 +epoch: 200 +learning_rate: 1e-3 +gpu: 7 +num_point: 2048 +optimizer: Adam +weight_decay: 1e-4 +normal: False +lr_decay: 0.5 +step_size: 20 + +defaults: + - model: Hengshuang + +hydra: + run: + dir: log/partseg5/${model.name} + + sweep: + dir: log/partseg5 + subdir: ${model.name} \ No newline at end of file diff --git a/zoo/PointTransformers/config/partseg_test.yaml b/zoo/PointTransformers/config/partseg_test.yaml new file mode 100644 index 0000000..7457fd9 --- /dev/null +++ b/zoo/PointTransformers/config/partseg_test.yaml @@ -0,0 +1,21 @@ +batch_size: 16 +epoch: 200 +learning_rate: 1e-3 +gpu: 4 +num_point: 2048 +optimizer: Adam +weight_decay: 1e-4 +normal: False +lr_decay: 0.5 +step_size: 20 + +defaults: + - model: Hengshuang + +hydra: + run: + dir: log/partseg_test/${model.name} + + sweep: + dir: log/partseg_test + subdir: ${model.name} \ No newline at end of file diff --git a/zoo/PointTransformers/dataset.py b/zoo/PointTransformers/dataset.py new file mode 100644 index 0000000..60cd49e --- /dev/null +++ b/zoo/PointTransformers/dataset.py @@ -0,0 +1,347 @@ +import imp +import numpy as np +import os +from torch.utils.data import Dataset +import torch +from pointnet_util import farthest_point_sample, pc_normalize +import json +import cv2 +import glob +import h5py + + +class ModelNetDataLoader(Dataset): + def __init__(self, root, npoint=1024, split='train', uniform=False, normal_channel=True, cache_size=15000): + self.root = root + self.npoints = npoint + self.uniform = uniform + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {} + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + + assert (split == 'train' or split == 'test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i]) + '.txt') for i + in range(len(shape_ids[split]))] + print('The size of %s data is %d'%(split,len(self.datapath))) + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + def __len__(self): + return len(self.datapath) + + def _get_item(self, index): + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints,:] + + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + + if not self.normal_channel: + point_set = point_set[:, 0:3] + + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + +class PartNormalDataset(Dataset): + def __init__(self, root='./data/shapenetcore_partanno_segmentation_benchmark_v0_normal', npoints=2500, split='train', class_choice=None, normal_channel=False): + self.npoints = npoints + self.root = root + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.normal_channel = normal_channel + + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k: v for k, v in self.cat.items()} + self.classes_original = dict(zip(self.cat, range(len(self.cat)))) + + if not class_choice is None: + self.cat = {k:v for k,v in self.cat.items() if k in class_choice} + # print(self.cat) + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + # print('category', item) + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + # print(fns[0][0:-4]) + if split == 'trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split == 'train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split == 'val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split == 'test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..' % (split)) + exit(-1) + + # print(os.path.basename(fns)) + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = {} + for i in self.cat.keys(): + self.classes[i] = self.classes_original[i] + + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], + 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], + 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], + 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + # for cat in sorted(self.seg_classes.keys()): + # print(cat, self.seg_classes[cat]) + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + + def __getitem__(self, index): + if index in self.cache: + point_set, cls, seg = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + if not self.normal_channel: + point_set = data[:, 0:3] + else: + point_set = data[:, 0:6] + seg = data[:, -1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls, seg) + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + # resample + point_set = point_set[choice, :] + seg = seg[choice] + + return point_set, cls, seg + + def __len__(self): + return len(self.datapath) + + + +class ShapeNetPart(Dataset): + def __init__(self, num_points=2048, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.num_points = num_points + self.partition = partition + self.class_choice = class_choice + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + seg = self.seg[item][:self.num_points] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + + +class ShapeNetC(Dataset): + def __init__(self, partition='train', class_choice=None, sub=None): + self.data, self.label, self.seg = load_data_partseg(partition, sub) + self.cat2id = {'airplane': 0, 'bag': 1, 'cap': 2, 'car': 3, 'chair': 4, + 'earphone': 5, 'guitar': 6, 'knife': 7, 'lamp': 8, 'laptop': 9, + 'motor': 10, 'mug': 11, 'pistol': 12, 'rocket': 13, 'skateboard': 14, 'table': 15} + self.seg_num = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] # number of parts for each category + self.index_start = [0, 4, 6, 8, 12, 16, 19, 22, 24, 28, 30, 36, 38, 41, 44, 47] + self.partition = partition + self.class_choice = class_choice + # self.partseg_colors = load_color_partseg() + + if self.class_choice != None: + id_choice = self.cat2id[self.class_choice] + indices = (self.label == id_choice).squeeze() + self.data = self.data[indices] + self.label = self.label[indices] + self.seg = self.seg[indices] + self.seg_num_all = self.seg_num[id_choice] + self.seg_start_index = self.index_start[id_choice] + else: + self.seg_num_all = 50 + self.seg_start_index = 0 + + def __getitem__(self, item): + pointcloud = self.data[item] + label = self.label[item] + seg = self.seg[item] # part seg label + if self.partition == 'trainval': + pointcloud = translate_pointcloud(pointcloud) + indices = list(range(pointcloud.shape[0])) + np.random.shuffle(indices) + pointcloud = pointcloud[indices] + seg = seg[indices] + return pointcloud, label, seg + + def __len__(self): + return self.data.shape[0] + + +DATA_DIR = '/mnt/lustre/share/ldkong/data/sets/ShapeNetPart' +SHAPENET_C_DIR = '/mnt/lustre/share/jwren/to_kld/shapenet_c' +def load_data_partseg(partition, sub=None): + all_data = [] + all_label = [] + all_seg = [] + if partition == 'trainval': + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*train*.h5')) \ + + glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*val*.h5')) + elif partition == 'shapenet-c': + file = os.path.join(SHAPENET_C_DIR, '%s.h5'%sub) + else: + file = glob.glob(os.path.join(DATA_DIR, 'shapenet_part_seg_hdf5_data', 'hdf5_data', '*%s*.h5'%partition)) + + if partition == 'shapenet-c': + # for h5_name in file: + # f = h5py.File(h5_name, 'r+') + f = h5py.File(file, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') # part seg label + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + else: + for h5_name in file: + f = h5py.File(h5_name, 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + seg = f['pid'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_seg.append(seg) + + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + all_seg = np.concatenate(all_seg, axis=0) + return all_data, all_label, all_seg + + +def load_color_partseg(): + colors = [] + labels = [] + f = open("prepare_data/meta/partseg_colors.txt") + for line in json.load(f): + colors.append(line['color']) + labels.append(line['label']) + partseg_colors = np.array(colors) + partseg_colors = partseg_colors[:, [2, 1, 0]] + partseg_labels = np.array(labels) + font = cv2.FONT_HERSHEY_SIMPLEX + img_size = 1350 + img = np.zeros((1350, 1890, 3), dtype="uint8") + cv2.rectangle(img, (0, 0), (1900, 1900), [255, 255, 255], thickness=-1) + column_numbers = [4, 2, 2, 4, 4, 3, 3, 2, 4, 2, 6, 2, 3, 3, 3, 3] + column_gaps = [320, 320, 300, 300, 285, 285] + color_size = 64 + color_index = 0 + label_index = 0 + row_index = 16 + for row in range(0, img_size): + column_index = 32 + for column in range(0, img_size): + color = partseg_colors[color_index] + label = partseg_labels[label_index] + length = len(str(label)) + cv2.rectangle(img, (column_index, row_index), (column_index + color_size, row_index + color_size), color=(int(color[0]), int(color[1]), int(color[2])), thickness=-1) + img = cv2.putText(img, label, (column_index + int(color_size * 1.15), row_index + int(color_size / 2)), font, 0.76, (0, 0, 0), 2) + column_index = column_index + column_gaps[column] + color_index = color_index + 1 + label_index = label_index + 1 + if color_index >= 50: + cv2.imwrite("prepare_data/meta/partseg_colors.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) + return np.array(colors) + elif (column + 1 >= column_numbers[row]): + break + row_index = row_index + int(color_size * 1.3) + if (row_index >= img_size): + break + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + + +if __name__ == '__main__': + data = ModelNetDataLoader('modelnet40_normal_resampled/', split='train', uniform=False, normal_channel=True) + DataLoader = torch.utils.data.DataLoader(data, batch_size=12, shuffle=True) + for point,label in DataLoader: + print(point.shape) + print(label.shape) \ No newline at end of file diff --git a/zoo/PointTransformers/models/Hengshuang/model.py b/zoo/PointTransformers/models/Hengshuang/model.py new file mode 100644 index 0000000..161d7bc --- /dev/null +++ b/zoo/PointTransformers/models/Hengshuang/model.py @@ -0,0 +1,141 @@ +import torch +import torch.nn as nn +from pointnet_util import PointNetFeaturePropagation, PointNetSetAbstraction +from .transformer import TransformerBlock + + +class TransitionDown(nn.Module): + def __init__(self, k, nneighbor, channels): + super().__init__() + self.sa = PointNetSetAbstraction(k, 0, nneighbor, channels[0], channels[1:], group_all=False, knn=True) + + def forward(self, xyz, points): + return self.sa(xyz, points) + + +class TransitionUp(nn.Module): + def __init__(self, dim1, dim2, dim_out): + class SwapAxes(nn.Module): + def __init__(self): + super().__init__() + + def forward(self, x): + return x.transpose(1, 2) + + super().__init__() + self.fc1 = nn.Sequential( + nn.Linear(dim1, dim_out), + SwapAxes(), + nn.BatchNorm1d(dim_out), # TODO + SwapAxes(), + nn.ReLU(), + ) + self.fc2 = nn.Sequential( + nn.Linear(dim2, dim_out), + SwapAxes(), + nn.BatchNorm1d(dim_out), # TODO + SwapAxes(), + nn.ReLU(), + ) + self.fp = PointNetFeaturePropagation(-1, []) + + def forward(self, xyz1, points1, xyz2, points2): + feats1 = self.fc1(points1) + feats2 = self.fc2(points2) + feats1 = self.fp(xyz2.transpose(1, 2), xyz1.transpose(1, 2), None, feats1.transpose(1, 2)).transpose(1, 2) + return feats1 + feats2 + + +class Backbone(nn.Module): + def __init__(self, cfg): + super().__init__() + npoints, nblocks, nneighbor, n_c, d_points = cfg.num_point, cfg.model.nblocks, cfg.model.nneighbor, cfg.num_class, cfg.input_dim + self.fc1 = nn.Sequential( + nn.Linear(d_points, 32), + nn.ReLU(), + nn.Linear(32, 32) + ) + self.transformer1 = TransformerBlock(32, cfg.model.transformer_dim, nneighbor) + self.transition_downs = nn.ModuleList() + self.transformers = nn.ModuleList() + for i in range(nblocks): + channel = 32 * 2 ** (i + 1) + self.transition_downs.append(TransitionDown(npoints // 4 ** (i + 1), nneighbor, [channel // 2 + 3, channel, channel])) + self.transformers.append(TransformerBlock(channel, cfg.model.transformer_dim, nneighbor)) + self.nblocks = nblocks + + def forward(self, x): + xyz = x[..., :3] + points = self.transformer1(xyz, self.fc1(x))[0] + + xyz_and_feats = [(xyz, points)] + for i in range(self.nblocks): + xyz, points = self.transition_downs[i](xyz, points) + points = self.transformers[i](xyz, points)[0] + xyz_and_feats.append((xyz, points)) + return points, xyz_and_feats + + +class PointTransformerCls(nn.Module): + def __init__(self, cfg): + super().__init__() + self.backbone = Backbone(cfg) + npoints, nblocks, nneighbor, n_c, d_points = cfg.num_point, cfg.model.nblocks, cfg.model.nneighbor, cfg.num_class, cfg.input_dim + self.fc2 = nn.Sequential( + nn.Linear(32 * 2 ** nblocks, 256), + nn.ReLU(), + nn.Linear(256, 64), + nn.ReLU(), + nn.Linear(64, n_c) + ) + self.nblocks = nblocks + + def forward(self, x): + points, _ = self.backbone(x) + res = self.fc2(points.mean(1)) + return res + + +class PointTransformerSeg(nn.Module): + def __init__(self, cfg): + super().__init__() + self.backbone = Backbone(cfg) + npoints, nblocks, nneighbor, n_c, d_points = cfg.num_point, cfg.model.nblocks, cfg.model.nneighbor, cfg.num_class, cfg.input_dim + self.fc2 = nn.Sequential( + nn.Linear(32 * 2 ** nblocks, 512), + nn.ReLU(), + nn.Linear(512, 512), + nn.ReLU(), + nn.Linear(512, 32 * 2 ** nblocks) + ) + self.transformer2 = TransformerBlock(32 * 2 ** nblocks, cfg.model.transformer_dim, nneighbor) + self.nblocks = nblocks + self.transition_ups = nn.ModuleList() + self.transformers = nn.ModuleList() + for i in reversed(range(nblocks)): + channel = 32 * 2 ** i + self.transition_ups.append(TransitionUp(channel * 2, channel, channel)) + self.transformers.append(TransformerBlock(channel, cfg.model.transformer_dim, nneighbor)) + + self.fc3 = nn.Sequential( + nn.Linear(32, 64), + nn.ReLU(), + nn.Linear(64, 64), + nn.ReLU(), + nn.Linear(64, n_c) + ) + + def forward(self, x): + points, xyz_and_feats = self.backbone(x) + xyz = xyz_and_feats[-1][0] + points = self.transformer2(xyz, self.fc2(points))[0] + + for i in range(self.nblocks): + points = self.transition_ups[i](xyz, points, xyz_and_feats[- i - 2][0], xyz_and_feats[- i - 2][1]) + xyz = xyz_and_feats[- i - 2][0] + points = self.transformers[i](xyz, points)[0] + + return self.fc3(points) + + + \ No newline at end of file diff --git a/zoo/PointTransformers/models/Hengshuang/transformer.py b/zoo/PointTransformers/models/Hengshuang/transformer.py new file mode 100644 index 0000000..942fb55 --- /dev/null +++ b/zoo/PointTransformers/models/Hengshuang/transformer.py @@ -0,0 +1,45 @@ +from pointnet_util import index_points, square_distance +import torch +import torch.nn as nn +import torch.nn.functional as F +import numpy as np + +class TransformerBlock(nn.Module): + def __init__(self, d_points, d_model, k) -> None: + super().__init__() + self.fc1 = nn.Linear(d_points, d_model) + self.fc2 = nn.Linear(d_model, d_points) + self.fc_delta = nn.Sequential( + nn.Linear(3, d_model), + nn.ReLU(), + nn.Linear(d_model, d_model) + ) + self.fc_gamma = nn.Sequential( + nn.Linear(d_model, d_model), + nn.ReLU(), + nn.Linear(d_model, d_model) + ) + self.w_qs = nn.Linear(d_model, d_model, bias=False) + self.w_ks = nn.Linear(d_model, d_model, bias=False) + self.w_vs = nn.Linear(d_model, d_model, bias=False) + self.k = k + + # xyz: b x n x 3, features: b x n x f + def forward(self, xyz, features): + dists = square_distance(xyz, xyz) + knn_idx = dists.argsort()[:, :, :self.k] # b x n x k + knn_xyz = index_points(xyz, knn_idx) + + pre = features + x = self.fc1(features) + q, k, v = self.w_qs(x), index_points(self.w_ks(x), knn_idx), index_points(self.w_vs(x), knn_idx) + + pos_enc = self.fc_delta(xyz[:, :, None] - knn_xyz) # b x n x k x f + + attn = self.fc_gamma(q[:, :, None] - k + pos_enc) + attn = F.softmax(attn / np.sqrt(k.size(-1)), dim=-2) # b x n x k x f + + res = torch.einsum('bmnf,bmnf->bmf', attn, v + pos_enc) + res = self.fc2(res) + pre + return res, attn + \ No newline at end of file diff --git a/zoo/PointTransformers/models/Menghao/model.py b/zoo/PointTransformers/models/Menghao/model.py new file mode 100644 index 0000000..f60f606 --- /dev/null +++ b/zoo/PointTransformers/models/Menghao/model.py @@ -0,0 +1,159 @@ +import torch +import torch.nn as nn +from pointnet_util import farthest_point_sample, index_points, square_distance + + +def sample_and_group(npoint, nsample, xyz, points): + B, N, C = xyz.shape + S = npoint + + fps_idx = farthest_point_sample(xyz, npoint) # [B, npoint] + + new_xyz = index_points(xyz, fps_idx) + new_points = index_points(points, fps_idx) + + dists = square_distance(new_xyz, xyz) # B x npoint x N + idx = dists.argsort()[:, :, :nsample] # B x npoint x K + + grouped_points = index_points(points, idx) + grouped_points_norm = grouped_points - new_points.view(B, S, 1, -1) + new_points = torch.cat([grouped_points_norm, new_points.view(B, S, 1, -1).repeat(1, 1, nsample, 1)], dim=-1) + return new_xyz, new_points + + +class Local_op(nn.Module): + def __init__(self, in_channels, out_channels): + super().__init__() + self.conv1 = nn.Conv1d(in_channels, out_channels, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(out_channels, out_channels, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(out_channels) + self.bn2 = nn.BatchNorm1d(out_channels) + self.relu = nn.ReLU() + + def forward(self, x): + b, n, s, d = x.size() # torch.Size([32, 512, 32, 6]) + x = x.permute(0, 1, 3, 2) + x = x.reshape(-1, d, s) + batch_size, _, N = x.size() + x = self.relu(self.bn1(self.conv1(x))) # B, D, N + x = self.relu(self.bn2(self.conv2(x))) # B, D, N + x = torch.max(x, 2)[0] + x = x.view(batch_size, -1) + x = x.reshape(b, n, -1).permute(0, 2, 1) + return x + + +class SA_Layer(nn.Module): + def __init__(self, channels): + super().__init__() + self.q_conv = nn.Conv1d(channels, channels // 4, 1, bias=False) + self.k_conv = nn.Conv1d(channels, channels // 4, 1, bias=False) + self.q_conv.weight = self.k_conv.weight + self.v_conv = nn.Conv1d(channels, channels, 1) + self.trans_conv = nn.Conv1d(channels, channels, 1) + self.after_norm = nn.BatchNorm1d(channels) + self.act = nn.ReLU() + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + x_q = self.q_conv(x).permute(0, 2, 1) # b, n, c + x_k = self.k_conv(x)# b, c, n + x_v = self.v_conv(x) + energy = x_q @ x_k # b, n, n + attention = self.softmax(energy) + attention = attention / (1e-9 + attention.sum(dim=1, keepdims=True)) + x_r = x_v @ attention # b, c, n + x_r = self.act(self.after_norm(self.trans_conv(x - x_r))) + x = x + x_r + return x + + +class StackedAttention(nn.Module): + def __init__(self, channels=256): + super().__init__() + self.conv1 = nn.Conv1d(channels, channels, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(channels, channels, kernel_size=1, bias=False) + + self.bn1 = nn.BatchNorm1d(channels) + self.bn2 = nn.BatchNorm1d(channels) + + self.sa1 = SA_Layer(channels) + self.sa2 = SA_Layer(channels) + self.sa3 = SA_Layer(channels) + self.sa4 = SA_Layer(channels) + + self.relu = nn.ReLU() + + def forward(self, x): + # + # b, 3, npoint, nsample + # conv2d 3 -> 128 channels 1, 1 + # b * npoint, c, nsample + # permute reshape + batch_size, _, N = x.size() + + x = self.relu(self.bn1(self.conv1(x))) # B, D, N + x = self.relu(self.bn2(self.conv2(x))) + + x1 = self.sa1(x) + x2 = self.sa2(x1) + x3 = self.sa3(x2) + x4 = self.sa4(x3) + + x = torch.cat((x1, x2, x3, x4), dim=1) + + return x + + +class PointTransformerCls(nn.Module): + def __init__(self, cfg): + super().__init__() + output_channels = cfg.num_class + d_points = cfg.input_dim + self.conv1 = nn.Conv1d(d_points, 64, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.gather_local_0 = Local_op(in_channels=128, out_channels=128) + self.gather_local_1 = Local_op(in_channels=256, out_channels=256) + self.pt_last = StackedAttention() + + self.relu = nn.ReLU() + self.conv_fuse = nn.Sequential(nn.Conv1d(1280, 1024, kernel_size=1, bias=False), + nn.BatchNorm1d(1024), + nn.LeakyReLU(negative_slope=0.2)) + + self.linear1 = nn.Linear(1024, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=0.5) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=0.5) + self.linear3 = nn.Linear(256, output_channels) + + def forward(self, x): + xyz = x[..., :3] + x = x.permute(0, 2, 1) + batch_size, _, _ = x.size() + x = self.relu(self.bn1(self.conv1(x))) # B, D, N + x = self.relu(self.bn2(self.conv2(x))) # B, D, N + x = x.permute(0, 2, 1) + new_xyz, new_feature = sample_and_group(npoint=512, nsample=32, xyz=xyz, points=x) + feature_0 = self.gather_local_0(new_feature) + feature = feature_0.permute(0, 2, 1) + new_xyz, new_feature = sample_and_group(npoint=256, nsample=32, xyz=new_xyz, points=feature) + feature_1 = self.gather_local_1(new_feature) + + x = self.pt_last(feature_1) + x = torch.cat([x, feature_1], dim=1) + x = self.conv_fuse(x) + x = torch.max(x, 2)[0] + x = x.view(batch_size, -1) + + x = self.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = self.relu(self.bn7(self.linear2(x))) + x = self.dp2(x) + x = self.linear3(x) + + return x \ No newline at end of file diff --git a/zoo/PointTransformers/models/Nico/model.py b/zoo/PointTransformers/models/Nico/model.py new file mode 100644 index 0000000..d619679 --- /dev/null +++ b/zoo/PointTransformers/models/Nico/model.py @@ -0,0 +1,117 @@ +import torch +import torch.nn as nn +from pointnet_util import PointNetSetAbstractionMsg +from .transformer import MultiHeadAttention + + +class SortNet(nn.Module): + def __init__(self, d_model, d_points=6, k=64): + super().__init__() + self.fc = nn.Sequential( + nn.Linear(d_model, 256), + nn.ReLU(), + nn.Linear(256, 64), + nn.ReLU(), + nn.Linear(64, 1) + ) + self.sa = PointNetSetAbstractionMsg(k, [0.1, 0.2, 0.4], [16, 32, 128], d_model, [[32, 32, 64], [64, 64, 128], [64, 96, 128]]) + self.fc_agg = nn.Sequential( + nn.Linear(64 + 128 + 128, 256), + nn.ReLU(), + nn.Linear(256, 256), + nn.ReLU(), + nn.Linear(256, d_model - 1 - d_points), + ) + self.k = k + self.d_points = d_points + + def forward(self, points, features): + score = self.fc(features) + topk_idx = torch.topk(score[..., 0], self.k, 1)[1] + features_abs = self.sa(points[..., :3], features, topk_idx)[1] + res = torch.cat((self.fc_agg(features_abs), + torch.gather(score, 1, topk_idx[..., None].expand(-1, -1, score.size(-1))), + torch.gather(points, 1, topk_idx[..., None].expand(-1, -1, points.size(-1)))), -1) + return res + + +class LocalFeatureGeneration(nn.Module): + def __init__(self, d_model, m, k, d_points=6, n_head=4): + super().__init__() + self.fc = nn.Sequential( + nn.Linear(d_points, 64), + nn.ReLU(), + nn.Linear(64, 256), + nn.ReLU(), + nn.Linear(256, d_model) + ) + self.sortnets = nn.ModuleList([SortNet(d_model, k=k) for _ in range(m)]) + self.att = MultiHeadAttention(n_head, d_model, d_model, d_model // n_head, d_model // n_head) + + def forward(self, points): + x = self.fc(points) + x, _ = self.att(x, x, x) + out = torch.cat([sortnet(points, x) for sortnet in self.sortnets], 1) + return out, x + + +class GlobalFeatureGeneration(nn.Module): + def __init__(self, d_model, k, d_points=6, n_head=4): + super().__init__() + self.fc = nn.Sequential( + nn.Linear(d_points, 64), + nn.ReLU(), + nn.Linear(64, 256), + nn.ReLU(), + nn.Linear(256, d_model) + ) + self.sa = PointNetSetAbstractionMsg(k, [0.1, 0.2, 0.4], [16, 32, 128], d_model, [[32, 32, 64], [64, 64, 128], [64, 96, 128]]) + self.att = MultiHeadAttention(n_head, d_model, d_model, d_model // n_head, d_model // n_head) + self.fc_agg = nn.Sequential( + nn.Linear(64 + 128 + 128, 256), + nn.ReLU(), + nn.Linear(256, 256), + nn.ReLU(), + nn.Linear(256, d_model), + ) + + def forward(self, points): + x = self.fc(points) + x, _ = self.att(x, x, x) + out = self.fc_agg(self.sa(points[..., :3], x)[1]) + return out, x + + +class PointTransformerCls(nn.Module): + def __init__(self, cfg): + super().__init__() + d_model_l, d_model_g, d_reduce, m, k, n_c, d_points, n_head \ + = cfg.model.global_dim, cfg.model.local_dim, cfg.model.reduce_dim, cfg.model.m, cfg.model.k, cfg.num_class, cfg.input_dim, cfg.model.n_head + self.lfg = LocalFeatureGeneration(d_model=d_model_l, m=m, k=k, d_points=d_points) + self.gfg = GlobalFeatureGeneration(d_model=d_model_g, k=cfg.model.global_k, d_points=d_points) + self.lg_att = MultiHeadAttention(n_head, d_model_l, d_model_g, d_model_l // n_head, d_model_l // n_head) + self.fc = nn.Sequential( + nn.Linear(d_model_l, 256), + nn.ReLU(), + nn.Linear(256, 256), + nn.ReLU(), + nn.Linear(256, d_reduce), + ) + self.fc_cls = nn.Sequential( + nn.Linear(k * m * d_reduce, 1024), + nn.ReLU(), + nn.Linear(1024, 256), + nn.ReLU(), + nn.Linear(256, 64), + nn.ReLU(), + nn.Linear(64, n_c) + ) + + def forward(self, points): + local_features = self.lfg(points)[0] + global_features = self.gfg(points)[0] + lg_features = self.lg_att(local_features, global_features, global_features)[0] + x = self.fc(lg_features).reshape(points.size(0), -1) + out = self.fc_cls(x) + return out + diff --git a/zoo/PointTransformers/models/Nico/transformer.py b/zoo/PointTransformers/models/Nico/transformer.py new file mode 100644 index 0000000..6153cad --- /dev/null +++ b/zoo/PointTransformers/models/Nico/transformer.py @@ -0,0 +1,65 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import numpy as np + + +# reference https://github.com/jadore801120/attention-is-all-you-need-pytorch + +class Attention(nn.Module): + def __init__(self): + super().__init__() + + def forward(self, q, k, v): + attn = q @ k.transpose(-1, -2) + attn = F.softmax(attn / np.sqrt(k.size(-1)), dim=-1) + output = attn @ v + + return output, attn + + +class MultiHeadAttention(nn.Module): + ''' Multi-Head Attention module ''' + + def __init__(self, n_head, d_model_q, d_model_kv, d_k, d_v): + super().__init__() + + self.n_head = n_head + self.d_k = d_k + self.d_v = d_v + + self.w_qs = nn.Linear(d_model_q, n_head * d_k, bias=False) + self.w_ks = nn.Linear(d_model_kv, n_head * d_k, bias=False) + self.w_vs = nn.Linear(d_model_kv, n_head * d_v, bias=False) + self.fc = nn.Linear(n_head * d_v, d_model_q, bias=False) + + self.attention = Attention() + + self.layer_norm1 = nn.LayerNorm(n_head * d_v, eps=1e-6) + self.layer_norm2 = nn.LayerNorm(d_model_q, eps=1e-6) + + + def forward(self, q, k, v): + + d_k, d_v, n_head = self.d_k, self.d_v, self.n_head + b_size, n_q, n_k = q.size(0), q.size(1), k.size(1) + + residual = q + + # Pass through the pre-attention projection: b x k x (n*dv) + # Separate different heads: b x k x n x dv + q = self.w_qs(q).view(-1, n_q, n_head, d_k) + k = self.w_ks(k).view(-1, n_k, n_head, d_k) + v = self.w_vs(v).view(-1, n_k, n_head, d_v) + + q, k, v = q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2) + + # get b x n x k x dv + q, attn = self.attention(q, k, v) + + # b x k x ndv + q = q.transpose(1, 2).contiguous().view(b_size, n_q, -1) + s = self.layer_norm1(residual + q) + res = self.layer_norm2(s + self.fc(s)) + + return res, attn \ No newline at end of file diff --git a/zoo/PointTransformers/pointnet_util.py b/zoo/PointTransformers/pointnet_util.py new file mode 100644 index 0000000..8e042a9 --- /dev/null +++ b/zoo/PointTransformers/pointnet_util.py @@ -0,0 +1,311 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from time import time +import numpy as np + + +# reference https://github.com/yanx27/Pointnet_Pointnet2_pytorch, modified by Yang You + + +def timeit(tag, t): + print("{}: {}s".format(tag, time() - t)) + return time() + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + return torch.sum((src[:, :, None] - dst[:, None]) ** 2, dim=-1) + + +def index_points(points, idx): + """ + Input: + points: input points data, [B, N, C] + idx: sample index data, [B, S, [K]] + Return: + new_points:, indexed points data, [B, S, [K], C] + """ + raw_size = idx.size() + idx = idx.reshape(raw_size[0], -1) + res = torch.gather(points, 1, idx[..., None].expand(-1, -1, points.size(-1))) + return res.reshape(*raw_size, -1) + + +def farthest_point_sample(xyz, npoint): + """ + Input: + xyz: pointcloud data, [B, N, 3] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [B, npoint] + """ + device = xyz.device + B, N, C = xyz.shape + centroids = torch.zeros(B, npoint, dtype=torch.long).to(device) + distance = torch.ones(B, N).to(device) * 1e10 + farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device) + batch_indices = torch.arange(B, dtype=torch.long).to(device) + for i in range(npoint): + centroids[:, i] = farthest + centroid = xyz[batch_indices, farthest, :].view(B, 1, 3) + dist = torch.sum((xyz - centroid) ** 2, -1) + distance = torch.min(distance, dist) + farthest = torch.max(distance, -1)[1] + return centroids + + +def query_ball_point(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample] + """ + device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] + group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + + +def sample_and_group(npoint, radius, nsample, xyz, points, returnfps=False, knn=False): + """ + Input: + npoint: + radius: + nsample: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, npoint, nsample, 3] + new_points: sampled points data, [B, npoint, nsample, 3+D] + """ + B, N, C = xyz.shape + S = npoint + fps_idx = farthest_point_sample(xyz, npoint) # [B, npoint] + torch.cuda.empty_cache() + new_xyz = index_points(xyz, fps_idx) + torch.cuda.empty_cache() + if knn: + dists = square_distance(new_xyz, xyz) # B x npoint x N + idx = dists.argsort()[:, :, :nsample] # B x npoint x K + else: + idx = query_ball_point(radius, nsample, xyz, new_xyz) + torch.cuda.empty_cache() + grouped_xyz = index_points(xyz, idx) # [B, npoint, nsample, C] + torch.cuda.empty_cache() + grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C) + torch.cuda.empty_cache() + + if points is not None: + grouped_points = index_points(points, idx) + new_points = torch.cat([grouped_xyz_norm, grouped_points], dim=-1) # [B, npoint, nsample, C+D] + else: + new_points = grouped_xyz_norm + if returnfps: + return new_xyz, new_points, grouped_xyz, fps_idx + else: + return new_xyz, new_points + + +def sample_and_group_all(xyz, points): + """ + Input: + xyz: input points position data, [B, N, 3] + points: input points data, [B, N, D] + Return: + new_xyz: sampled points position data, [B, 1, 3] + new_points: sampled points data, [B, 1, N, 3+D] + """ + device = xyz.device + B, N, C = xyz.shape + new_xyz = torch.zeros(B, 1, C).to(device) + grouped_xyz = xyz.view(B, 1, N, C) + if points is not None: + new_points = torch.cat([grouped_xyz, points.view(B, 1, N, -1)], dim=-1) + else: + new_points = grouped_xyz + return new_xyz, new_points + + +class PointNetSetAbstraction(nn.Module): + def __init__(self, npoint, radius, nsample, in_channel, mlp, group_all, knn=False): + super(PointNetSetAbstraction, self).__init__() + self.npoint = npoint + self.radius = radius + self.nsample = nsample + self.knn = knn + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv2d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.group_all = group_all + + def forward(self, xyz, points): + """ + Input: + xyz: input points position data, [B, N, C] + points: input points data, [B, N, C] + Return: + new_xyz: sampled points position data, [B, S, C] + new_points_concat: sample points feature data, [B, S, D'] + """ + if self.group_all: + new_xyz, new_points = sample_and_group_all(xyz, points) + else: + new_xyz, new_points = sample_and_group(self.npoint, self.radius, self.nsample, xyz, points, knn=self.knn) + # new_xyz: sampled points position data, [B, npoint, C] + # new_points: sampled points data, [B, npoint, nsample, C+D] + new_points = new_points.permute(0, 3, 2, 1) # [B, C+D, nsample,npoint] + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + + new_points = torch.max(new_points, 2)[0].transpose(1, 2) + return new_xyz, new_points + + +class PointNetSetAbstractionMsg(nn.Module): + def __init__(self, npoint, radius_list, nsample_list, in_channel, mlp_list, knn=False): + super(PointNetSetAbstractionMsg, self).__init__() + self.npoint = npoint + self.radius_list = radius_list + self.nsample_list = nsample_list + self.knn = knn + self.conv_blocks = nn.ModuleList() + self.bn_blocks = nn.ModuleList() + for i in range(len(mlp_list)): + convs = nn.ModuleList() + bns = nn.ModuleList() + last_channel = in_channel + 3 + for out_channel in mlp_list[i]: + convs.append(nn.Conv2d(last_channel, out_channel, 1)) + bns.append(nn.BatchNorm2d(out_channel)) + last_channel = out_channel + self.conv_blocks.append(convs) + self.bn_blocks.append(bns) + + def forward(self, xyz, points, seed_idx=None): + """ + Input: + xyz: input points position data, [B, C, N] + points: input points data, [B, D, N] + Return: + new_xyz: sampled points position data, [B, C, S] + new_points_concat: sample points feature data, [B, D', S] + """ + + B, N, C = xyz.shape + S = self.npoint + new_xyz = index_points(xyz, farthest_point_sample(xyz, S) if seed_idx is None else seed_idx) + new_points_list = [] + for i, radius in enumerate(self.radius_list): + K = self.nsample_list[i] + if self.knn: + dists = square_distance(new_xyz, xyz) # B x npoint x N + group_idx = dists.argsort()[:, :, :K] # B x npoint x K + else: + group_idx = query_ball_point(radius, K, xyz, new_xyz) + grouped_xyz = index_points(xyz, group_idx) + grouped_xyz -= new_xyz.view(B, S, 1, C) + if points is not None: + grouped_points = index_points(points, group_idx) + grouped_points = torch.cat([grouped_points, grouped_xyz], dim=-1) + else: + grouped_points = grouped_xyz + + grouped_points = grouped_points.permute(0, 3, 2, 1) # [B, D, K, S] + for j in range(len(self.conv_blocks[i])): + conv = self.conv_blocks[i][j] + bn = self.bn_blocks[i][j] + grouped_points = F.relu(bn(conv(grouped_points))) + new_points = torch.max(grouped_points, 2)[0] # [B, D', S] + new_points_list.append(new_points) + + new_points_concat = torch.cat(new_points_list, dim=1).transpose(1, 2) + return new_xyz, new_points_concat + + +# NoteL this function swaps N and C +class PointNetFeaturePropagation(nn.Module): + def __init__(self, in_channel, mlp): + super(PointNetFeaturePropagation, self).__init__() + self.mlp_convs = nn.ModuleList() + self.mlp_bns = nn.ModuleList() + last_channel = in_channel + for out_channel in mlp: + self.mlp_convs.append(nn.Conv1d(last_channel, out_channel, 1)) + self.mlp_bns.append(nn.BatchNorm1d(out_channel)) + last_channel = out_channel + + def forward(self, xyz1, xyz2, points1, points2): + """ + Input: + xyz1: input points position data, [B, C, N] + xyz2: sampled input points position data, [B, C, S] + points1: input points data, [B, D, N] + points2: input points data, [B, D, S] + Return: + new_points: upsampled points data, [B, D', N] + """ + xyz1 = xyz1.permute(0, 2, 1) + xyz2 = xyz2.permute(0, 2, 1) + + points2 = points2.permute(0, 2, 1) + B, N, C = xyz1.shape + _, S, _ = xyz2.shape + + if S == 1: + interpolated_points = points2.repeat(1, N, 1) + else: + dists = square_distance(xyz1, xyz2) + dists, idx = dists.sort(dim=-1) + dists, idx = dists[:, :, :3], idx[:, :, :3] # [B, N, 3] + + dist_recip = 1.0 / (dists + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + interpolated_points = torch.sum(index_points(points2, idx) * weight.view(B, N, 3, 1), dim=2) + + if points1 is not None: + points1 = points1.permute(0, 2, 1) + new_points = torch.cat([points1, interpolated_points], dim=-1) + else: + new_points = interpolated_points + + new_points = new_points.permute(0, 2, 1) + for i, conv in enumerate(self.mlp_convs): + bn = self.mlp_bns[i] + new_points = F.relu(bn(conv(new_points))) + return new_points \ No newline at end of file diff --git a/zoo/PointTransformers/provider.py b/zoo/PointTransformers/provider.py new file mode 100644 index 0000000..fe0270f --- /dev/null +++ b/zoo/PointTransformers/provider.py @@ -0,0 +1,250 @@ +import numpy as np + +def normalize_data(batch_data): + """ Normalize the batch data, use coordinates of the block centered at origin, + Input: + BxNxC array + Output: + BxNxC array + """ + B, N, C = batch_data.shape + normal_data = np.zeros((B, N, C)) + for b in range(B): + pc = batch_data[b] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) + pc = pc / m + normal_data[b] = pc + return normal_data + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + diff --git a/zoo/PointTransformers/test.py b/zoo/PointTransformers/test.py new file mode 100644 index 0000000..2365705 --- /dev/null +++ b/zoo/PointTransformers/test.py @@ -0,0 +1,130 @@ +import torch +import importlib +import numpy as np +from tqdm import tqdm +from dataset import ShapeNetC +import hydra +import omegaconf + + +seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + + +@hydra.main(config_path='config', config_name='partseg_test') +def main(args): + omegaconf.OmegaConf.set_struct(args, False) + + '''HYPER PARAMETER''' + normal = False + restore_from = '/mnt/lustre/ldkong/models/Point-Transformers/log/partseg4/Hengshuang/best_model.pth' + + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.num_point, split='test', normal_channel=args.normal) + # TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + TEST_DATASET = ShapeNetC(partition='shapenet-c', sub='add_global_4', class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=4, drop_last=False) + + '''MODEL LOADING''' + args.input_dim = (6 if normal else 3) + 16 + args.num_class = 50 + num_category = 16 + num_part = args.num_class + + classifier = getattr(importlib.import_module('models.{}.model'.format('Hengshuang')), 'PointTransformerSeg')(args).cuda() + + checkpoint = torch.load(restore_from) + classifier.load_state_dict(checkpoint['model_state_dict']) + print('Use pretrain model') + + + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + seg_pred = classifier(torch.cat([points, to_categorical(label, num_category).repeat(1, points.shape[1], 1)], -1)) + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): # part is not present, no prediction as well + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + print('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + print('test Accuracy: %f Class avg mIOU: %f Inctance avg mIOU: %f' % (test_metrics['accuracy'], test_metrics['class_avg_iou'], test_metrics['inctance_avg_iou'])) + + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/zoo/PointTransformers/test.sh b/zoo/PointTransformers/test.sh new file mode 100644 index 0000000..86d385d --- /dev/null +++ b/zoo/PointTransformers/test.sh @@ -0,0 +1 @@ +CUDA_VISIBLE_DEVICES=6 HYDRA_FULL_ERROR=1 python test.py \ No newline at end of file diff --git a/zoo/PointTransformers/train.sh b/zoo/PointTransformers/train.sh new file mode 100644 index 0000000..3a3c85b --- /dev/null +++ b/zoo/PointTransformers/train.sh @@ -0,0 +1 @@ +CUDA_VISIBLE_DEVICES=7 HYDRA_FULL_ERROR=1 python train_partseg.py \ No newline at end of file diff --git a/zoo/PointTransformers/train_cls.py b/zoo/PointTransformers/train_cls.py new file mode 100644 index 0000000..22e8200 --- /dev/null +++ b/zoo/PointTransformers/train_cls.py @@ -0,0 +1,162 @@ +""" +Author: Benny +Date: Nov 2019 +""" +from dataset import ModelNetDataLoader +import argparse +import numpy as np +import os +import torch +import datetime +import logging +from pathlib import Path +from tqdm import tqdm +import sys +import provider +import importlib +import shutil +import hydra +import omegaconf + + +def test(model, loader, num_class=40): + mean_correct = [] + class_acc = np.zeros((num_class,3)) + for j, data in tqdm(enumerate(loader), total=len(loader)): + points, target = data + target = target[:, 0] + points, target = points.cuda(), target.cuda() + classifier = model.eval() + pred = classifier(points) + pred_choice = pred.data.max(1)[1] + for cat in np.unique(target.cpu()): + classacc = pred_choice[target==cat].eq(target[target==cat].long().data).cpu().sum() + class_acc[cat,0]+= classacc.item()/float(points[target==cat].size()[0]) + class_acc[cat,1]+=1 + correct = pred_choice.eq(target.long().data).cpu().sum() + mean_correct.append(correct.item()/float(points.size()[0])) + class_acc[:,2] = class_acc[:,0]/ class_acc[:,1] + class_acc = np.mean(class_acc[:,2]) + instance_acc = np.mean(mean_correct) + return instance_acc, class_acc + + +@hydra.main(config_path='config', config_name='cls') +def main(args): + omegaconf.OmegaConf.set_struct(args, False) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = str(args.gpu) + logger = logging.getLogger(__name__) + + print(args.pretty()) + + '''DATA LOADING''' + logger.info('Load dataset ...') + DATA_PATH = hydra.utils.to_absolute_path('modelnet40_normal_resampled/') + + TRAIN_DATASET = ModelNetDataLoader(root=DATA_PATH, npoint=args.num_point, split='train', normal_channel=args.normal) + TEST_DATASET = ModelNetDataLoader(root=DATA_PATH, npoint=args.num_point, split='test', normal_channel=args.normal) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=4) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=args.batch_size, shuffle=False, num_workers=4) + + '''MODEL LOADING''' + args.num_class = 40 + args.input_dim = 6 if args.normal else 3 + shutil.copy(hydra.utils.to_absolute_path('models/{}/model.py'.format(args.model.name)), '.') + + classifier = getattr(importlib.import_module('models.{}.model'.format(args.model.name)), 'PointTransformerCls')(args).cuda() + criterion = torch.nn.CrossEntropyLoss() + + try: + checkpoint = torch.load('best_model.pth') + start_epoch = checkpoint['epoch'] + classifier.load_state_dict(checkpoint['model_state_dict']) + logger.info('Use pretrain model') + except: + logger.info('No existing model, starting training from scratch...') + start_epoch = 0 + + + if args.optimizer == 'Adam': + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.learning_rate, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=args.weight_decay + ) + else: + optimizer = torch.optim.SGD(classifier.parameters(), lr=0.01, momentum=0.9) + + scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.3) + global_epoch = 0 + global_step = 0 + best_instance_acc = 0.0 + best_class_acc = 0.0 + best_epoch = 0 + mean_correct = [] + + '''TRANING''' + logger.info('Start training...') + for epoch in range(start_epoch,args.epoch): + logger.info('Epoch %d (%d/%s):' % (global_epoch + 1, epoch + 1, args.epoch)) + + classifier.train() + for batch_id, data in tqdm(enumerate(trainDataLoader, 0), total=len(trainDataLoader), smoothing=0.9): + points, target = data + points = points.data.numpy() + points = provider.random_point_dropout(points) + points[:,:, 0:3] = provider.random_scale_point_cloud(points[:,:, 0:3]) + points[:,:, 0:3] = provider.shift_point_cloud(points[:,:, 0:3]) + points = torch.Tensor(points) + target = target[:, 0] + + points, target = points.cuda(), target.cuda() + optimizer.zero_grad() + + pred = classifier(points) + loss = criterion(pred, target.long()) + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.long().data).cpu().sum() + mean_correct.append(correct.item() / float(points.size()[0])) + loss.backward() + optimizer.step() + global_step += 1 + + scheduler.step() + + train_instance_acc = np.mean(mean_correct) + logger.info('Train Instance Accuracy: %f' % train_instance_acc) + + + with torch.no_grad(): + instance_acc, class_acc = test(classifier.eval(), testDataLoader) + + if (instance_acc >= best_instance_acc): + best_instance_acc = instance_acc + best_epoch = epoch + 1 + + if (class_acc >= best_class_acc): + best_class_acc = class_acc + logger.info('Test Instance Accuracy: %f, Class Accuracy: %f'% (instance_acc, class_acc)) + logger.info('Best Instance Accuracy: %f, Class Accuracy: %f'% (best_instance_acc, best_class_acc)) + + if (instance_acc >= best_instance_acc): + logger.info('Save model...') + savepath = 'best_model.pth' + logger.info('Saving at %s'% savepath) + state = { + 'epoch': best_epoch, + 'instance_acc': instance_acc, + 'class_acc': class_acc, + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, savepath) + global_epoch += 1 + + logger.info('End of training...') + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/zoo/PointTransformers/train_partseg.py b/zoo/PointTransformers/train_partseg.py new file mode 100644 index 0000000..0840dae --- /dev/null +++ b/zoo/PointTransformers/train_partseg.py @@ -0,0 +1,245 @@ +""" +Author: Benny +Date: Nov 2019 +""" +import argparse +import os +import torch +import datetime +import logging +import sys +import importlib +import shutil +import provider +import numpy as np + +from pathlib import Path +from tqdm import tqdm +from dataset import ShapeNetPart +import hydra +import omegaconf + + +seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], + 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], + 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], + 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} +seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} +for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + +def inplace_relu(m): + classname = m.__class__.__name__ + if classname.find('ReLU') != -1: + m.inplace=True + +def to_categorical(y, num_classes): + """ 1-hot encodes a tensor """ + new_y = torch.eye(num_classes)[y.cpu().data.numpy(),] + if (y.is_cuda): + return new_y.cuda() + return new_y + +@hydra.main(config_path='config', config_name='partseg') +def main(args): + omegaconf.OmegaConf.set_struct(args, False) + + '''HYPER PARAMETER''' + os.environ["CUDA_VISIBLE_DEVICES"] = str(args.gpu) + logger = logging.getLogger(__name__) + + # print(args.pretty()) + + # root = hydra.utils.to_absolute_path('data/shapenetcore_partanno_segmentation_benchmark_v0_normal/') + + # TRAIN_DATASET = PartNormalDataset(root=root, npoints=args.num_point, split='trainval', normal_channel=args.normal) + TRAIN_DATASET = ShapeNetPart(partition='trainval', num_points=2048, class_choice=None) + trainDataLoader = torch.utils.data.DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=10, drop_last=True) + + # TEST_DATASET = PartNormalDataset(root=root, npoints=args.num_point, split='test', normal_channel=args.normal) + TEST_DATASET = ShapeNetPart(partition='test', num_points=2048, class_choice=None) + testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=16, shuffle=False, num_workers=10, drop_last=False) + + '''MODEL LOADING''' + args.input_dim = (6 if args.normal else 3) + 16 + args.num_class = 50 + num_category = 16 + num_part = args.num_class + shutil.copy(hydra.utils.to_absolute_path('models/{}/model.py'.format(args.model.name)), '.') + + classifier = getattr(importlib.import_module('models.{}.model'.format(args.model.name)), 'PointTransformerSeg')(args).cuda() + criterion = torch.nn.CrossEntropyLoss() + + try: + checkpoint = torch.load('best_model.pth') + start_epoch = checkpoint['epoch'] + classifier.load_state_dict(checkpoint['model_state_dict']) + logger.info('Use pretrain model') + except: + logger.info('No existing model, starting training from scratch...') + start_epoch = 0 + + if args.optimizer == 'Adam': + optimizer = torch.optim.Adam( + classifier.parameters(), + lr=args.learning_rate, + betas=(0.9, 0.999), + eps=1e-08, + weight_decay=args.weight_decay + ) + else: + optimizer = torch.optim.SGD(classifier.parameters(), lr=args.learning_rate, momentum=0.9) + + def bn_momentum_adjust(m, momentum): + if isinstance(m, torch.nn.BatchNorm2d) or isinstance(m, torch.nn.BatchNorm1d): + m.momentum = momentum + + LEARNING_RATE_CLIP = 1e-5 + MOMENTUM_ORIGINAL = 0.1 + MOMENTUM_DECCAY = 0.5 + MOMENTUM_DECCAY_STEP = args.step_size + + best_acc = 0 + global_epoch = 0 + best_class_avg_iou = 0 + best_inctance_avg_iou = 0 + + for epoch in range(start_epoch, args.epoch): + mean_correct = [] + + logger.info('Epoch %d (%d/%s):' % (global_epoch + 1, epoch + 1, args.epoch)) + '''Adjust learning rate and BN momentum''' + lr = max(args.learning_rate * (args.lr_decay ** (epoch // args.step_size)), LEARNING_RATE_CLIP) + logger.info('Learning rate:%f' % lr) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECCAY ** (epoch // MOMENTUM_DECCAY_STEP)) + if momentum < 0.01: + momentum = 0.01 + print('BN momentum updated to: %f' % momentum) + classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) + classifier = classifier.train() + + '''learning one epoch''' + for i, (points, label, target) in tqdm(enumerate(trainDataLoader), total=len(trainDataLoader), smoothing=0.9): + # points = points.data.numpy() + # points[:, :, 0:3] = provider.random_scale_point_cloud(points[:, :, 0:3]) + # points[:, :, 0:3] = provider.shift_point_cloud(points[:, :, 0:3]) + # points = torch.Tensor(points) + + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + optimizer.zero_grad() + + seg_pred = classifier(torch.cat([points, to_categorical(label, num_category).repeat(1, points.shape[1], 1)], -1)) + seg_pred = seg_pred.contiguous().view(-1, num_part) + target = target.view(-1, 1)[:, 0] + pred_choice = seg_pred.data.max(1)[1] + + correct = pred_choice.eq(target.data).cpu().sum() + mean_correct.append(correct.item() / (args.batch_size * args.num_point)) + loss = criterion(seg_pred, target) + loss.backward() + optimizer.step() + + train_instance_acc = np.mean(mean_correct) + logger.info('Train accuracy is: %.5f' % train_instance_acc) + + with torch.no_grad(): + test_metrics = {} + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(num_part)] + total_correct_class = [0 for _ in range(num_part)] + shape_ious = {cat: [] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + classifier = classifier.eval() + + for batch_id, (points, label, target) in tqdm(enumerate(testDataLoader), total=len(testDataLoader), smoothing=0.9): + cur_batch_size, NUM_POINT, _ = points.size() + points, label, target = points.float().cuda(), label.long().cuda(), target.long().cuda() + seg_pred = classifier(torch.cat([points, to_categorical(label, num_category).repeat(1, points.shape[1], 1)], -1)) + cur_pred_val = seg_pred.cpu().data.numpy() + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + target = target.cpu().data.numpy() + + for i in range(cur_batch_size): + cat = seg_label_to_cat[target[i, 0]] + logits = cur_pred_val_logits[i, :, :] + cur_pred_val[i, :] = np.argmax(logits[:, seg_classes[cat]], 1) + seg_classes[cat][0] + + correct = np.sum(cur_pred_val == target) + total_correct += correct + total_seen += (cur_batch_size * NUM_POINT) + + for l in range(num_part): + total_seen_class[l] += np.sum(target == l) + total_correct_class[l] += (np.sum((cur_pred_val == l) & (target == l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i, :] + segl = target[i, :] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl == l) == 0) and ( + np.sum(segp == l) == 0): # part is not present, no prediction as well + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = np.sum((segl == l) & (segp == l)) / float( + np.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(list(shape_ious.values())) + test_metrics['accuracy'] = total_correct / float(total_seen) + test_metrics['class_avg_accuracy'] = np.mean( + np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float)) + for cat in sorted(shape_ious.keys()): + logger.info('eval mIoU of %s %f' % (cat + ' ' * (14 - len(cat)), shape_ious[cat])) + test_metrics['class_avg_iou'] = mean_shape_ious + test_metrics['inctance_avg_iou'] = np.mean(all_shape_ious) + + logger.info('Epoch %d test Accuracy: %f Class avg mIOU: %f Inctance avg mIOU: %f' % ( + epoch + 1, test_metrics['accuracy'], test_metrics['class_avg_iou'], test_metrics['inctance_avg_iou'])) + if (test_metrics['inctance_avg_iou'] >= best_inctance_avg_iou): + logger.info('Save model...') + savepath = 'best_model.pth' + logger.info('Saving at %s' % savepath) + state = { + 'epoch': epoch, + 'train_acc': train_instance_acc, + 'test_acc': test_metrics['accuracy'], + 'class_avg_iou': test_metrics['class_avg_iou'], + 'inctance_avg_iou': test_metrics['inctance_avg_iou'], + 'model_state_dict': classifier.state_dict(), + 'optimizer_state_dict': optimizer.state_dict(), + } + torch.save(state, savepath) + logger.info('Saving model....') + + if test_metrics['accuracy'] > best_acc: + best_acc = test_metrics['accuracy'] + if test_metrics['class_avg_iou'] > best_class_avg_iou: + best_class_avg_iou = test_metrics['class_avg_iou'] + if test_metrics['inctance_avg_iou'] > best_inctance_avg_iou: + best_inctance_avg_iou = test_metrics['inctance_avg_iou'] + logger.info('Best accuracy is: %.5f' % best_acc) + logger.info('Best class avg mIOU is: %.5f' % best_class_avg_iou) + logger.info('Best inctance avg mIOU is: %.5f' % best_inctance_avg_iou) + global_epoch += 1 + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/zoo/PointWOLF/.gitignore b/zoo/PointWOLF/.gitignore new file mode 100644 index 0000000..ae358e9 --- /dev/null +++ b/zoo/PointWOLF/.gitignore @@ -0,0 +1,3 @@ +data/ +__pycache__/ +checkpoints/ diff --git a/zoo/PointWOLF/LICENSE b/zoo/PointWOLF/LICENSE new file mode 100644 index 0000000..b591b8e --- /dev/null +++ b/zoo/PointWOLF/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 MLV Lab (Machine Learning and Vision Lab at Korea University) + +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/zoo/PointWOLF/PointWOLF.py b/zoo/PointWOLF/PointWOLF.py new file mode 100644 index 0000000..e864ac7 --- /dev/null +++ b/zoo/PointWOLF/PointWOLF.py @@ -0,0 +1,171 @@ +""" +@origin : PointWOLF.py by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@Time: 2021.09.30 +""" + +import torch +import torch.nn as nn +import numpy as np + +class PointWOLF(object): + def __init__(self, args): + self.num_anchor = args.w_num_anchor + self.sample_type = args.w_sample_type + self.sigma = args.w_sigma + + self.R_range = (-abs(args.w_R_range), abs(args.w_R_range)) + self.S_range = (1., args.w_S_range) + self.T_range = (-abs(args.w_T_range), abs(args.w_T_range)) + + + def __call__(self, pos): + """ + input : + pos([N,3]) + + output : + pos([N,3]) : original pointcloud + pos_new([N,3]) : Pointcloud augmneted by PointWOLF + """ + M=self.num_anchor #(Mx3) + N, _=pos.shape #(N) + + if self.sample_type == 'random': + idx = np.random.choice(N,M)#(M) + elif self.sample_type == 'fps': + idx = self.fps(pos, M) #(M) + + pos_anchor = pos[idx] #(M,3), anchor point + + pos_repeat = np.expand_dims(pos,0).repeat(M, axis=0)#(M,N,3) + pos_normalize = np.zeros_like(pos_repeat, dtype=pos.dtype) #(M,N,3) + + #Move to canonical space + pos_normalize = pos_repeat - pos_anchor.reshape(M,-1,3) + + #Local transformation at anchor point + pos_transformed = self.local_transformaton(pos_normalize) #(M,N,3) + + #Move to origin space + pos_transformed = pos_transformed + pos_anchor.reshape(M,-1,3) #(M,N,3) + + pos_new = self.kernel_regression(pos, pos_anchor, pos_transformed) + pos_new = self.normalize(pos_new) + + return pos.astype('float32'), pos_new.astype('float32') + + + def kernel_regression(self, pos, pos_anchor, pos_transformed): + """ + input : + pos([N,3]) + pos_anchor([M,3]) + pos_transformed([M,N,3]) + + output : + pos_new([N,3]) : Pointcloud after weighted local transformation + """ + M, N, _ = pos_transformed.shape + + #Distance between anchor points & entire points + sub = np.expand_dims(pos_anchor,1).repeat(N, axis=1) - np.expand_dims(pos,0).repeat(M, axis=0) #(M,N,3), d + + project_axis = self.get_random_axis(1) + + projection = np.expand_dims(project_axis, axis=1)*np.eye(3)#(1,3,3) + + #Project distance + sub = sub @ projection # (M,N,3) + sub = np.sqrt(((sub) ** 2).sum(2)) #(M,N) + + #Kernel regression + weight = np.exp(-0.5 * (sub ** 2) / (self.sigma ** 2)) #(M,N) + pos_new = (np.expand_dims(weight,2).repeat(3, axis=-1) * pos_transformed).sum(0) #(N,3) + pos_new = (pos_new / weight.sum(0, keepdims=True).T) # normalize by weight + return pos_new + + + def fps(self, pos, npoint): + """ + input : + pos([N,3]) + npoint(int) + + output : + centroids([npoints]) : index list for fps + """ + N, _ = pos.shape + centroids = np.zeros(npoint, dtype=np.int_) #(M) + distance = np.ones(N, dtype=np.float64) * 1e10 #(N) + farthest = np.random.randint(0, N, (1,), dtype=np.int_) + for i in range(npoint): + centroids[i] = farthest + centroid = pos[farthest, :] + dist = ((pos - centroid)**2).sum(-1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = distance.argmax() + return centroids + + def local_transformaton(self, pos_normalize): + """ + input : + pos([N,3]) + pos_normalize([M,N,3]) + + output : + pos_normalize([M,N,3]) : Pointclouds after local transformation centered at M anchor points. + """ + M,N,_ = pos_normalize.shape + transformation_dropout = np.random.binomial(1, 0.5, (M,3)) #(M,3) + transformation_axis =self.get_random_axis(M) #(M,3) + + degree = np.pi * np.random.uniform(*self.R_range, size=(M,3)) / 180.0 * transformation_dropout[:,0:1] #(M,3), sampling from (-R_range, R_range) + + scale = np.random.uniform(*self.S_range, size=(M,3)) * transformation_dropout[:,1:2] #(M,3), sampling from (1, S_range) + scale = scale*transformation_axis + scale = scale + 1*(scale==0) #Scaling factor must be larger than 1 + + trl = np.random.uniform(*self.T_range, size=(M,3)) * transformation_dropout[:,2:3] #(M,3), sampling from (1, T_range) + trl = trl*transformation_axis + + #Scaling Matrix + S = np.expand_dims(scale, axis=1)*np.eye(3) # scailing factor to diagonal matrix (M,3) -> (M,3,3) + #Rotation Matrix + sin = np.sin(degree) + cos = np.cos(degree) + sx, sy, sz = sin[:,0], sin[:,1], sin[:,2] + cx, cy, cz = cos[:,0], cos[:,1], cos[:,2] + R = np.stack([cz*cy, cz*sy*sx - sz*cx, cz*sy*cx + sz*sx, + sz*cy, sz*sy*sx + cz*cy, sz*sy*cx - cz*sx, + -sy, cy*sx, cy*cx], axis=1).reshape(M,3,3) + + pos_normalize = pos_normalize@R@S + trl.reshape(M,1,3) + return pos_normalize + + def get_random_axis(self, n_axis): + """ + input : + n_axis(int) + + output : + axis([n_axis,3]) : projection axis + """ + axis = np.random.randint(1,8, (n_axis)) # 1(001):z, 2(010):y, 3(011):yz, 4(100):x, 5(101):xz, 6(110):xy, 7(111):xyz + m = 3 + axis = (((axis[:,None] & (1 << np.arange(m)))) > 0).astype(int) + return axis + + def normalize(self, pos): + """ + input : + pos([N,3]) + + output : + pos([N,3]) : normalized Pointcloud + """ + pos = pos - pos.mean(axis=-2, keepdims=True) + scale = (1 / np.sqrt((pos ** 2).sum(1)).max()) * 0.999999 + pos = scale * pos + return pos diff --git a/zoo/PointWOLF/README.md b/zoo/PointWOLF/README.md new file mode 100644 index 0000000..1931509 --- /dev/null +++ b/zoo/PointWOLF/README.md @@ -0,0 +1,79 @@ +# PointWOLF: Point Cloud Augmentation with Weighted Local Transformations + +This repository is the implementation of [PointWOLF](https://openaccess.thecvf.com/content/ICCV2021/html/Kim_Point_Cloud_Augmentation_With_Weighted_Local_Transformations_ICCV_2021_paper.html). + +> Sihyeon Kim1*, Sanghyeok Lee1*, Dasol Hwang1, Jaewon Lee1, Seong Jae Hwang2, Hyunwoo J. Kim1†, Point Cloud Augmentation with Weighted Local Transformations (ICCV 2021). +> 1Korea University 2University of Pittsburgh + +![PointWOLF_main](assets/PointWOLF_main.png) + +# Installation +## Dependencies +- CUDA 10.2 +- Python 3.7.1 +- torch 1.7.0 +- packages : sklearn, numpy, h5py, glob + +## Download +**Clone repository** + +``` +$ git clone https://github.com/mlvlab/PointWOLF.git +``` + +**Download ModelNet40** + +**Notes** : When you run the `main.py`, ModelNet40 is automatically downloaded at `.../PointWOLF/data/`. +If you want to download dataset on your `${PATH}`, see below. + +``` +$ cd ${PATH} +$ wget https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip --no-check-certificate +$ unzip modelnet40_ply_hdf5_2048.zip +$ rm modelnet40_ply_hdf5_2048.zip +``` + +# Runnig the code + +**train** + +- Run the training without PointWOLF & AugTune: +``` +$ python main.py --exp_name=origin --model=dgcnn --num_points=1024 --k=20 --use_sgd=True +``` + +- Run the training with **PointWOLF**: +``` +$ python main.py --exp_name=PointWOLF --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --PointWOLF +``` + +- Run the training with **PointWOLF** & **AugTune**: +``` +$ python main.py --exp_name=PointWOLF_AugTune --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --PointWOLF --AugTune +``` + + +**eval** + +- Run the evaluation with trained model located at `${PATH}`: +``` +$ python main.py --exp_name=eval --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval=True --model_path=${PATH} +``` + +# Citation +``` +@InProceedings{Kim_2021_ICCV, + author = {Kim, Sihyeon and Lee, Sanghyeok and Hwang, Dasol and Lee, Jaewon and Hwang, Seong Jae and Kim, Hyunwoo J.}, + title = {Point Cloud Augmentation With Weighted Local Transformations}, + booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2021}, + pages = {548-557} +} +``` + +# License +[MIT License](https://github.com/mlvlab/PointWOLF/blob/master/LICENSE) + +# Acknowledgement +The structure of this codebase is borrowed from [DGCNN](https://github.com/WangYueFt/dgcnn). diff --git a/zoo/PointWOLF/assets/PointWOLF_main.png b/zoo/PointWOLF/assets/PointWOLF_main.png new file mode 100644 index 0000000..f295a1d Binary files /dev/null and b/zoo/PointWOLF/assets/PointWOLF_main.png differ diff --git a/zoo/PointWOLF/data.py b/zoo/PointWOLF/data.py new file mode 100644 index 0000000..1286374 --- /dev/null +++ b/zoo/PointWOLF/data.py @@ -0,0 +1,99 @@ +""" +@Origin : data.py by Yue Wang +@Contact: yuewangx@mit.edu +@Time: 2018/10/13 6:21 PM + +modified by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@File: data.py +@Time: 2021.09.30 +""" + +import os +import sys +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset + +from PointWOLF import PointWOLF + + +def download(): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, 'data') + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s --no-check-certificate; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def load_data(partition): + download() + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, 'data') + all_data = [] + all_label = [] + for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048', 'ply_data_%s*.h5'%partition)): + f = h5py.File(h5_name) + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, args, partition='train'): + self.data, self.label = load_data(partition) + self.num_points = args.num_points + self.partition = partition + self.PointWOLF = PointWOLF(args) if args.PointWOLF else None + self.AugTune = args.AugTune + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] #(1024,3) + label = self.label[item] + if self.partition == 'train': + np.random.shuffle(pointcloud) + + if self.PointWOLF is not None: + origin, pointcloud = self.PointWOLF(pointcloud) + if self.AugTune: + #When AugTune used, we conduct CDA after AugTune. + return origin, pointcloud, label + + pointcloud = translate_pointcloud(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + + +if __name__ == '__main__': + train = ModelNet40(1024) + test = ModelNet40(1024, 'test') + for data, label in train: + print(data.shape) + print(label.shape) diff --git a/zoo/PointWOLF/main.py b/zoo/PointWOLF/main.py new file mode 100644 index 0000000..b7a6ba7 --- /dev/null +++ b/zoo/PointWOLF/main.py @@ -0,0 +1,119 @@ +""" +@Origin : main.py by Yue Wang +@Contact: yuewangx@mit.edu +@Time: 2018/10/13 10:39 PM + +modified by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@File: main.py +@Time: 2021.09.30 +""" + + +from __future__ import print_function +import os +import argparse +import torch + +from util import IOStream +from train import train_vanilla, train_AugTune, test, test_all_corruption + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/'+args.exp_name): + os.makedirs('checkpoints/'+args.exp_name) + if not os.path.exists('checkpoints/'+args.exp_name+'/'+'models'): + os.makedirs('checkpoints/'+args.exp_name+'/'+'models') + os.system('cp main.py checkpoints'+'/'+args.exp_name+'/'+'main.py.backup') + os.system('cp model.py checkpoints' + '/' + args.exp_name + '/' + 'model.py.backup') + os.system('cp util.py checkpoints' + '/' + args.exp_name + '/' + 'util.py.backup') + os.system('cp data.py checkpoints' + '/' + args.exp_name + '/' + 'data.py.backup') + os.system('cp PointWOLF.py checkpoints' + '/' + args.exp_name + '/' + 'PointWOLF.py.backup') + os.system('cp train.py checkpoints' + '/' + args.exp_name + '/' + 'train.py.backup') + + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Recognition') + parser.add_argument('--exp_name', type=str, default='exp_PointWOLF', metavar='N', + help='Name of the experiment') + parser.add_argument('--model', type=str, default='dgcnn', metavar='N', + choices=['pointnet', 'dgcnn'], + help='Model to use, [pointnet, dgcnn]') + parser.add_argument('--dataset', type=str, default='modelnet40', metavar='N', + choices=['modelnet40']) + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=250, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.001, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--eval_corrupt', type=bool, default=False, + help='evaluate the model under corruption') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--dropout', type=float, default=0.5, + help='dropout rate') + parser.add_argument('--emb_dims', type=int, default=1024, metavar='N', + help='Dimension of embeddings') + parser.add_argument('--k', type=int, default=20, metavar='N', + help='Num of nearest neighbors to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + + # PointWOLF settings + parser.add_argument('--PointWOLF', action='store_true', help='Use PointWOLF') + + parser.add_argument('--w_num_anchor', type=int, default=4, help='Num of anchor point' ) + parser.add_argument('--w_sample_type', type=str, default='fps', help='Sampling method for anchor point, option : (fps, random)') + parser.add_argument('--w_sigma', type=float, default=0.5, help='Kernel bandwidth') + + parser.add_argument('--w_R_range', type=float, default=10, help='Maximum rotation range of local transformation') + parser.add_argument('--w_S_range', type=float, default=3, help='Maximum scailing range of local transformation') + parser.add_argument('--w_T_range', type=float, default=0.25, help='Maximum translation range of local transformation') + + # AugTune settings + parser.add_argument('--AugTune', action='store_true', help='Use AugTune') + parser.add_argument('--l', type=float, default=0.1, help='Difficulty parameter lambda') + + args = parser.parse_args() + + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + + torch.manual_seed(args.seed) + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + torch.cuda.manual_seed(args.seed) + else: + io.cprint('Using CPU') + + if not args.eval and not args.eval_corrupt: + if args.AugTune: + train_AugTune(args, io) + else: + train_vanilla(args, io) + elif args.eval: + test(args, io) + elif args.eval_corrupt: + test_all_corruption(args) + diff --git a/zoo/PointWOLF/model.py b/zoo/PointWOLF/model.py new file mode 100644 index 0000000..a053b07 --- /dev/null +++ b/zoo/PointWOLF/model.py @@ -0,0 +1,157 @@ +""" +@Origin : model.py by Yue Wang +@Contact: yuewangx@mit.edu +@Time: 2018/10/13 6:35 PM + +modified by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@File: model.py +@Time: 2021.09.30 +""" + + +import os +import sys +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def knn(x, k): + inner = -2*torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx + + +def get_graph_feature(x, k=20, idx=None): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + if idx is None: + idx = knn(x, k=k) # (batch_size, num_points, k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1)*num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() # (batch_size, num_points, num_dims) -> (batch_size*num_points, num_dims) # batch_size * num_points * k + range(0, batch_size*num_points) + feature = x.view(batch_size*num_points, -1)[idx, :] + feature = feature.view(batch_size, num_points, k, num_dims) + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((feature-x, x), dim=3).permute(0, 3, 1, 2).contiguous() + + return feature + + +class PointNet(nn.Module): + def __init__(self, args, output_channels=40): + super(PointNet, self).__init__() + self.args = args + self.conv1 = nn.Conv1d(3, 64, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.conv3 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.conv4 = nn.Conv1d(64, 128, kernel_size=1, bias=False) + self.conv5 = nn.Conv1d(128, args.emb_dims, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.bn3 = nn.BatchNorm1d(64) + self.bn4 = nn.BatchNorm1d(128) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + self.linear1 = nn.Linear(args.emb_dims, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout() + self.linear2 = nn.Linear(512, output_channels) + + def forward(self, x): + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = F.relu(self.bn4(self.conv4(x))) + x = F.relu(self.bn5(self.conv5(x))) + x = F.adaptive_max_pool1d(x, 1).squeeze() + x = F.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = self.linear2(x) + return x + + +class DGCNN(nn.Module): + def __init__(self, args, output_channels=40): + super(DGCNN, self).__init__() + self.args = args + self.k = args.k + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(128) + self.bn4 = nn.BatchNorm2d(256) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 128, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(128*2, 256, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv1d(512, args.emb_dims, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + self.linear1 = nn.Linear(args.emb_dims*2, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, output_channels) + + def forward(self, x): + batch_size = x.size(0) + x = get_graph_feature(x, k=self.k) + x = self.conv1(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.k) + x = self.conv2(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.k) + x = self.conv3(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x3, k=self.k) + x = self.conv4(x) + x4 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3, x4), dim=1) + + x = self.conv5(x) + x1 = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x2 = F.adaptive_avg_pool1d(x, 1).view(batch_size, -1) + x = torch.cat((x1, x2), 1) + + x = F.leaky_relu(self.bn6(self.linear1(x)), negative_slope=0.2) + x = self.dp1(x) + x = F.leaky_relu(self.bn7(self.linear2(x)), negative_slope=0.2) + x = self.dp2(x) + x = self.linear3(x) + + x=F.log_softmax(x, dim=1) + + return x diff --git a/zoo/PointWOLF/train.py b/zoo/PointWOLF/train.py new file mode 100644 index 0000000..62af542 --- /dev/null +++ b/zoo/PointWOLF/train.py @@ -0,0 +1,330 @@ +""" +@Origin : main.py by Yue Wang +@Contact: yuewangx@mit.edu +@Time: 2018/10/13 10:39 PM + +modified by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@File: train.py +@Time: 2021.09.29 +""" + +import torch +import torch.nn as nn +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR +import numpy as np +from torch.utils.data import DataLoader +import sklearn.metrics as metrics +import torch.nn.functional as F + +from data import ModelNet40 +from model import PointNet, DGCNN +from util import cal_loss +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC + +def train_vanilla(args, io): + train_loader = DataLoader(ModelNet40(args, partition='train'), num_workers=8, + batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(args, partition='test'), num_workers=8, + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + #Try to load models + if args.model == 'pointnet': + model = PointNet(args).to(device) + elif args.model == 'dgcnn': + model = DGCNN(args).to(device) + else: + raise Exception("Not implemented") + print(str(model)) + + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr) + criterion = cal_loss + best_test_acc = 0 + + for epoch in range(args.epochs): + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for data, label in train_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + loss.backward() + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + + scheduler.step() + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f' % (epoch, + train_loss*1.0/count, + metrics.accuracy_score( + train_true, train_pred), + metrics.balanced_accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f' % (epoch, + test_loss*1.0/count, + test_acc, + avg_per_class_acc) + io.cprint(outstr) + if test_acc >= best_test_acc: + best_test_acc = test_acc + torch.save(model.state_dict(), 'checkpoints/%s/models/model.t7' % args.exp_name) + + +def train_AugTune(args, io): + train_loader = DataLoader(ModelNet40(args, partition='train'), num_workers=8, + batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(args, partition='test'), num_workers=8, + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + #Try to load models + if args.model == 'pointnet': + model = PointNet(args).to(device) + elif args.model == 'dgcnn': + model = DGCNN(args).to(device) + else: + raise Exception("Not implemented") + print(str(model)) + + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr) + criterion = cal_loss + best_test_acc = 0 + + for epoch in range(args.epochs): + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for origin, data, label in train_loader: + origin, data, label = origin.to(device), data.to(device), label.to(device).squeeze() + origin = origin.permute(0, 2, 1) + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + + #Forward original & augmented sample to get confidence score + with torch.no_grad(): + pred_origin = model(origin) + pred_data = model(data) + c_origin = (pred_origin.exp() * F.one_hot(label, pred_origin.shape[-1])).sum(1) #(B) + c_data = (pred_data.exp() * F.one_hot(label, pred_data.shape[-1])).sum(1) #(B) + + #Calculate Target Confidence Score + c_target = torch.max((1-args.l) * c_origin, c_data) #(B) + alpha = ((c_target-c_data)/(c_origin-c_data + 1e-4)).unsqueeze(1) + alpha = torch.clamp(alpha, min=0, max=1).reshape(-1,1,1) + + #Tune the Sample with alpha + data = alpha * origin + (1-alpha) * data + #Re-normalize Tuned Sample + data = normalize_point_cloud_batch(data) + #CDA + data = translate_pointcloud_batch(data) + + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + + loss.backward() + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + + scheduler.step() + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f' % (epoch, + train_loss*1.0/count, + metrics.accuracy_score( + train_true, train_pred), + metrics.balanced_accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f' % (epoch, + test_loss*1.0/count, + test_acc, + avg_per_class_acc) + io.cprint(outstr) + if test_acc >= best_test_acc: + best_test_acc = test_acc + torch.save(model.state_dict(), 'checkpoints/%s/models/model.t7' % args.exp_name) + + +def test(args, io): + test_loader = DataLoader(ModelNet40(args, partition='test'), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + model = DGCNN(args).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + test_acc = 0.0 + count = 0.0 + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f'%(test_acc, avg_per_class_acc) + io.cprint(outstr) + + +def test_all_corruption(args): + device = torch.device("cuda" if args.cuda else "cpu") + model = DGCNN(args).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + + def test_corrupt(args, split, model): + test_loader = DataLoader(ModelNetC(split=split), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + return {'acc': test_acc, 'avg_per_class_acc': avg_per_class_acc} + + eval_corrupt_wrapper(model, test_corrupt, {'args': args}) + +def normalize_point_cloud_batch(pointcloud): + """ + input : + pointcloud([B,3,N]) + + output : + pointcloud([B,3,N]) : Normalized Pointclouds + """ + pointcloud = pointcloud - pointcloud.mean(dim=-1, keepdim=True) #(B,3,N) + scale = 1/torch.sqrt((pointcloud**2).sum(1)).max(axis=1)[0]*0.999999 # (B) + pointcloud = scale.view(-1, 1, 1) * pointcloud + return pointcloud + + +def translate_pointcloud_batch(pointcloud): + """ + input : + pointcloud([B,3,N]) + + output : + translated_pointcloud([B,3,N]) : Pointclouds after CDA + """ + B, _, _ = pointcloud.shape + + xyz1 = torch.FloatTensor(B,3,1).uniform_(2./3., 3./2.).to(pointcloud.device) + xyz2 = torch.FloatTensor(B,3,1).uniform_(-0.2, 0.2).to(pointcloud.device) + + translated_pointcloud = xyz1 * pointcloud + xyz2 + return translated_pointcloud \ No newline at end of file diff --git a/zoo/PointWOLF/util.py b/zoo/PointWOLF/util.py new file mode 100644 index 0000000..9880aae --- /dev/null +++ b/zoo/PointWOLF/util.py @@ -0,0 +1,50 @@ +""" +@Origin : util.py by Yue Wang +@Contact: yuewangx@mit.edu +@Time: 4/5/19 3:47 PM + +modified by {Sanghyeok Lee, Sihyeon Kim} +@Contact: {cat0626, sh_bs15}@korea.ac.kr +@File: util.py +@Time: 2021.09.29 +""" + + +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + + #Move to model.py + #log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * pred).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() diff --git a/zoo/RSMix/LICENSE b/zoo/RSMix/LICENSE new file mode 100644 index 0000000..5384c78 --- /dev/null +++ b/zoo/RSMix/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 dogyoonlee + +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/zoo/RSMix/README.md b/zoo/RSMix/README.md new file mode 100644 index 0000000..929d8dd --- /dev/null +++ b/zoo/RSMix/README.md @@ -0,0 +1,46 @@ +## Regularization Strategy for Point Cloud via Rigidly Mixed Sample (CVPR 2021) + +We propose a novel data augmentation method for point cloud, **Rigid Subset Mix (RSMix)**. +Our model is implemented based on **PointNet+++** and **DGCNN**, which are widely used point-wise deep neural networks. + +[[arXiv version paper link]](https://arxiv.org/pdf/2102.01929.pdf) + +## Overview + +`RSMix` generates the virtual sample from each part of the two point cloud samples by mixing them without shape distortion. It effectively generalize the deep neural network model and achieve remarkable performance for shape classification. + + + +## Implementation + +### RSMix on PointNet++ + +- [RSMix-PointNet++(TensorFlow)](./pointnet2_rsmix) + +### RSMix on DGCNN + +- [RSMix-DGCNN(PyTorch)](./dgcnn_rsmix) + +## License + +MIT License + +## Acknowledgement + +The structure of this codebase is borrowed from +[PointNet++](https://github.com/charlesq34/pointnet2/) and [DGCNN-PyTorch](https://github.com/WangYueFt/dgcnn/tree/master/pytorch). + +### Citation + +If you find our work useful in your research, please consider citing: + +``` +arXiv: + +@article{lee2021regularization, + title={Regularization Strategy for Point Cloud via Rigidly Mixed Sample}, + author={Lee, Dogyoon and Lee, Jaeha and Lee, Junhyeop and Lee, Hyeongmin and Lee, Minhyeok and Woo, Sungmin and Lee, Sangyoun}, + journal={arXiv preprint arXiv:2102.01929}, + year={2021} +} +``` diff --git a/zoo/RSMix/dgcnn_rsmix/ModelNetDataLoader.py b/zoo/RSMix/dgcnn_rsmix/ModelNetDataLoader.py new file mode 100644 index 0000000..f1e701f --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/ModelNetDataLoader.py @@ -0,0 +1,111 @@ +import numpy as np +import warnings +import os +from torch.utils.data import Dataset +warnings.filterwarnings('ignore') + + + +def pc_normalize(pc): + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def farthest_point_sample(point, npoint): + """ + Input: + xyz: pointcloud data, [N, D] + npoint: number of samples + Return: + centroids: sampled pointcloud index, [npoint, D] + """ + N, D = point.shape + xyz = point[:,:3] + centroids = np.zeros((npoint,)) + distance = np.ones((N,)) * 1e10 + farthest = np.random.randint(0, N) + for i in range(npoint): + centroids[i] = farthest + centroid = xyz[farthest, :] + dist = np.sum((xyz - centroid) ** 2, -1) + mask = dist < distance + distance[mask] = dist[mask] + farthest = np.argmax(distance, -1) + point = point[centroids.astype(np.int32)] + return point + +class ModelNetDataLoader(Dataset): + def __init__(self, root, npoint=1024, split='train', uniform=False, normal_channel=True, cache_size=15000, modelnet10=False): + self.root = root + self.npoints = npoint + self.uniform = uniform + if modelnet10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {} + if modelnet10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + + assert (split == 'train' or split == 'test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i]) + '.txt') for i + in range(len(shape_ids[split]))] + print('The size of %s data is %d'%(split,len(self.datapath))) + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + def __len__(self): + return len(self.datapath) + + def _get_item(self, index): + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + # cls = np.array([cls]).astype(np.int32) + cls = np.array([cls]).astype(np.int64) + point_set = np.loadtxt(fn[1], delimiter=',').astype(np.float32) + if self.uniform: + point_set = farthest_point_sample(point_set, self.npoints) + else: + point_set = point_set[0:self.npoints,:] + + point_set[:, 0:3] = pc_normalize(point_set[:, 0:3]) + + if not self.normal_channel: + point_set = point_set[:, 0:3] + + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + + + +if __name__ == '__main__': + import torch + + data = ModelNetDataLoader('/data/modelnet40_normal_resampled/',split='train', uniform=False, normal_channel=True,) + DataLoader = torch.utils.data.DataLoader(data, batch_size=12, shuffle=True) + for point,label in DataLoader: + print(point.shape) + print(label.shape) \ No newline at end of file diff --git a/zoo/RSMix/dgcnn_rsmix/README.md b/zoo/RSMix/dgcnn_rsmix/README.md new file mode 100644 index 0000000..4a4003c --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/README.md @@ -0,0 +1,86 @@ +# RSMix for DGCNN(PyTorch) +We utilize the original released codes of [DGCNN](https://github.com/WangYueFt/dgcnn/tree/master/pytorch), which is implemented with PyTorch. + +* RSMix is implemented in `rsmix_provider.py`. + +## Prepare Dataset +* You can get sampled point clouds of ModelNet40 (XYZ and normal from mesh, 10k points per shape) here (1.6GB). + +Move the uncompressed data folder or create symbolic link to `data/modelnet40_normal_resampled`. + +* You can also get sampled point clouds of ModelNet40 (XYZ and normal from mesh, 10k points per shape) as hdf5 format here (435MB). + +Move the uncompressed data folder or create symbolic link to `data/modelnet40_ply_hdf5_2048`. + +## Environment +Follow the environment setting of original `DGCNN` code. + +[[DGCNN PyTorch]](https://github.com/WangYueFt/dgcnn) + + +## Point Cloud Classification +### Training +#### Run the training script(epoch=500): + +* 1024 points +``` +python main.py --exp_name=rsmix_dgcnn_1024 --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --beta 1.0 --epochs 500 +``` + +* 2048 points +``` +python main.py --exp_name=rsmix_dgcnn_2048 --model=dgcnn --num_points=2048 --k=40 --use_sgd=True --beta 1.0 --epochs 500 +``` + +Note: if you want to test the combinations of augmentations with RSMix, + +you can selectively input the augmentation-related arguments from one of the follow arguments. + +* conventional data agumentation arguments: + +`--shuffle` : Random shuffle augmentation + +`--jitter` : Jitter augmentation + +`--rot` : Random Rotation augmentation + +`--rdscale` : Random Scaling augmentation + +`--shift` : Random Shif augmentation + +* RandDrop augmentation argument: + +`--rddrop` : RandDrop augmentation + +Additionally, if you want to test with ModelNet10, please input the argument `--modelnet10`. +Default dataset is ModelNet40. + + +### Evaluation + +#### Run the evaluation script after training finished: + +* 1024 points +``` +python main.py --exp_name=rsmix_dgcnn_1024_eval --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval=True --model_path=checkpoints/rsmix_dgcnn_1024/models/model.t7 +``` + +* 2048 points +``` +python main.py --exp_name=rsmix_dgcnn_2048_eval --model=dgcnn --num_points=2048 --k=40 --use_sgd=True --eval=True --model_path=checkpoints/rsmix_dgcnn_2048/models/model.t7 +``` + + + +### Evaluation with pretrained model +#### Run the evaluation script with pretrained models: + +* 1024 points +``` +python main.py --exp_name=rsmix_dgcnn_1024_eval --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval=True --model_path=pretrained/model.1024.t7 +``` + +* 2048 points +``` +python main.py --exp_name=rsmix_dgcnn_2048_eval --model=dgcnn --num_points=2048 --k=40 --use_sgd=True --eval=True --model_path=pretrained/model.2048.t7 +``` diff --git a/zoo/RSMix/dgcnn_rsmix/data.py b/zoo/RSMix/dgcnn_rsmix/data.py new file mode 100644 index 0000000..8ebc76a --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/data.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +RSMix: +@Author: Dogyoon Lee +@Contact: dogyoonlee@gmail.com +@File: data.py +@Time: 2020/11/23 13:46 PM + +DGCNN: +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: data.py +@Time: 2018/10/13 6:21 PM +""" + + +import os +import sys +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset + +def download(): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, 'data') + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def load_data(partition): + download() + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, 'data') + all_data = [] + all_label = [] + for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048', 'ply_data_%s*.h5'%partition)): + f = h5py.File(h5_name) + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, num_points, partition='train'): + self.data, self.label = load_data(partition) + self.num_points = num_points + self.partition = partition + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + # if self.partition == 'train': + # pointcloud = translate_pointcloud(pointcloud) + # np.random.shuffle(pointcloud) + ''' + for point_mix implement + and random drop implement + additionally, rotation may be should be implemented + ''' + # for batch data process, we implement augmentation method on train process in main.py file + ''' + to here + ''' + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + + +if __name__ == '__main__': + train = ModelNet40(1024) + test = ModelNet40(1024, 'test') + for data, label in train: + print(data.shape) + print(label.shape) diff --git a/zoo/RSMix/dgcnn_rsmix/main.py b/zoo/RSMix/dgcnn_rsmix/main.py new file mode 100644 index 0000000..b5f23c7 --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/main.py @@ -0,0 +1,401 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +RSMix: +@Author: Dogyoon Lee +@Contact: dogyoonlee@gmail.com +@File: main.py +@Time: 2020/11/23 13:46 PM + +DGCNN: +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: main.py +@Time: 2018/10/13 10:39 PM +""" + + +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR +from data import ModelNet40 +from model import PointNet, DGCNN +import numpy as np +from torch.utils.data import DataLoader +from util import cal_loss, IOStream +import sklearn.metrics as metrics +import time +from datetime import datetime +import provider +import rsmix_provider +from ModelNetDataLoader import ModelNetDataLoader +from modelnetc_utils import eval_corrupt_wrapper, ModelNetC + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/'+args.exp_name): + os.makedirs('checkpoints/'+args.exp_name) + if not os.path.exists('checkpoints/'+args.exp_name+'/'+'models'): + os.makedirs('checkpoints/'+args.exp_name+'/'+'models') + os.system('cp main.py checkpoints'+'/'+args.exp_name+'/'+'main.py.backup') + os.system('cp model.py checkpoints' + '/' + args.exp_name + '/' + 'model.py.backup') + os.system('cp util.py checkpoints' + '/' + args.exp_name + '/' + 'util.py.backup') + os.system('cp data.py checkpoints' + '/' + args.exp_name + '/' + 'data.py.backup') + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def train(args, io): + if args.modelnet10: + TRAIN_DATASET = ModelNetDataLoader(root=args.data_path, npoint=args.num_points, split='train', normal_channel=args.normal, modelnet10=True) + TEST_DATASET = ModelNetDataLoader(root=args.data_path, npoint=args.num_points, split='test', normal_channel=args.normal, modelnet10=True) + train_loader = DataLoader(TRAIN_DATASET, batch_size=args.batch_size, shuffle=True, num_workers=8, drop_last=True) + test_loader = DataLoader(TEST_DATASET, batch_size=args.test_batch_size, shuffle=False, num_workers=8, drop_last=False) + num_class = 10 + + else: + train_loader = DataLoader(ModelNet40(partition='train', num_points=args.num_points), num_workers=8, + batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), num_workers=8, + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + num_class = 40 + # drop last : don't use the last batch if the size of it is different to the other ones(when its True) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + if args.model == 'pointnet': + model = PointNet(args).to(device) + elif args.model == 'dgcnn': + model = DGCNN(args, output_channels=num_class).to(device) + else: + raise Exception("Not implemented") + print(str(model)) + + model = nn.DataParallel(model) # for multi-gpu + print("Let's use", torch.cuda.device_count(), "GPUs!") + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr) + + criterion = cal_loss + + best_test_acc = 0 + best_avg_class_acc = 0 + conv_epoch = 0 + for epoch in range(args.epochs): + log_string(str(datetime.now())) + log_string('**** EPOCH %03d ****' % (epoch)) + scheduler.step() + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for data, label in train_loader: + ''' + implement augmentation + ''' + rsmix = False + # for new augmentation code, remove squeeze because it will be applied after augmentation. + # default from baseline model, scale, shift, shuffle was default augmentation + if args.rot or args.rdscale or args.shift or args.jitter or args.shuffle or args.rddrop or (args.beta is not 0.0): + data = data.cpu().numpy() + if args.rot: + data = provider.rotate_point_cloud(data) + data = provider.rotate_perturbation_point_cloud(data) + if args.rdscale: + tmp_data = provider.random_scale_point_cloud(data[:,:,0:3]) + data[:,:,0:3] = tmp_data + if args.shift: + tmp_data = provider.shift_point_cloud(data[:,:,0:3]) + data[:,:,0:3] = tmp_data + if args.jitter: + tmp_data = provider.jitter_point_cloud(data[:,:,0:3]) + data[:,:,0:3] = tmp_data + if args.rddrop: + data = provider.random_point_dropout(data) + if args.shuffle: + data = provider.shuffle_points(data) + r = np.random.rand(1) + if args.beta > 0 and r < args.rsmix_prob: + rsmix = True + data, lam, label, label_b = rsmix_provider.rsmix(data, label, beta=args.beta, n_sample=args.nsample, KNN=args.knn) + if args.rot or args.rdscale or args.shift or args.jitter or args.shuffle or args.rddrop or (args.beta is not 0.0): + data = torch.FloatTensor(data) + if rsmix: + lam = torch.FloatTensor(lam) + lam, label_b = lam.to(device), label_b.to(device).squeeze() + data, label = data.to(device), label.to(device).squeeze() + + if rsmix: + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + + loss = 0 + for i in range(batch_size): + loss_tmp = criterion(logits[i].unsqueeze(0), label[i].unsqueeze(0).long())*(1-lam[i]) \ + + criterion(logits[i].unsqueeze(0), label_b[i].unsqueeze(0).long())*lam[i] + loss += loss_tmp + loss = loss/batch_size + + else: + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + + ''' + from above to here + ''' + # data = data.permute(0, 2, 1) + # batch_size = data.size()[0] + # opt.zero_grad() + # logits = model(data) + # loss = criterion(logits, label) + + loss.backward() + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + train_acc = metrics.accuracy_score(train_true, train_pred) + outstr = 'Train epoch %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f' % (epoch, + train_loss*1.0/count, + train_acc, + metrics.balanced_accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + + LOG_FOUT.write(outstr+'\n') + LOG_FOUT.flush() + + #################### + # Test + #################### + log_string('---- EPOCH %03d EVALUATION ----'%(epoch)) + + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test epoch %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f' % (epoch, + test_loss*1.0/count, + test_acc, + avg_per_class_acc) + io.cprint(outstr) + + LOG_FOUT.write(outstr+'\n') + LOG_FOUT.flush() + + if test_acc >= best_test_acc: + best_test_acc = test_acc + conv_epoch = epoch + torch.save(model.state_dict(), 'checkpoints/%s/models/model.t7' % args.exp_name) + log_string('Model saved in file : checkpoints/%s/models/model.t7' %(args.exp_name)) + # if avg_per_class_acc >= best_avg_class_acc: + best_avg_class_acc = avg_per_class_acc + # torch.save(model.state_dict(), 'checkpoints/%s/models/model.t7' % args.exp_name) + # log_string('Model class_acc saved in file : checkpoints/%s/models/model_class_acc.t7' %(args.exp_name)) + log_string('*** best accuracy *** - %f' %(best_test_acc)) + log_string('*** at then, best class accuracy *** - %f' %(best_avg_class_acc)) + + execution_time = time.time()-start_time + hour = execution_time//3600 + minute = (execution_time-hour*3600)//60 + second = execution_time-hour*3600-minute*60 + log_string('... End of the Training ...') + log_string("trainig time : %.2f sec, %d min, %d hour" %(float(second), int(minute), int(hour))) + log_string('*** training accuracy when best accuracy *** - %f' %(train_acc)) + log_string('*** best accuracy *** - %f' %(best_test_acc)) + log_string('*** at then, best class accuracy *** - %f' %(best_avg_class_acc)) + log_string('*** conv epoch *** - %d' %(conv_epoch)) + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + model = DGCNN(args).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + test_acc = 0.0 + count = 0.0 + test_true = [] + test_pred = [] + for data, label in test_loader: + + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f'%(test_acc, avg_per_class_acc) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Recognition') + parser.add_argument('--exp_name', type=str, default='exp', metavar='N', + help='Name of the experiment') + parser.add_argument('--model', type=str, default='dgcnn', metavar='N', + choices=['pointnet', 'dgcnn'], + help='Model to use, [pointnet, dgcnn]') + parser.add_argument('--dataset', type=str, default='modelnet40', metavar='N', + choices=['modelnet40']) + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=250, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.001, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--eval_corrupt', type=bool, default=False, + help='evaluate the model under corruption') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--dropout', type=float, default=0.5, + help='dropout rate') + parser.add_argument('--emb_dims', type=int, default=1024, metavar='N', + help='Dimension of embeddings') + parser.add_argument('--k', type=int, default=20, metavar='N', + help='Num of nearest neighbors to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + # added arguments + parser.add_argument('--rdscale', action='store_true', help='random scaling data augmentation') + parser.add_argument('--shift', action='store_true', help='random shift data augmentation') + parser.add_argument('--shuffle', action='store_true', help='random shuffle data augmentation') + parser.add_argument('--rot', action='store_true', help='random rotation augmentation') + parser.add_argument('--jitter', action='store_true', help='jitter augmentation') + parser.add_argument('--rddrop', action='store_true', help='random point drop data augmentation') + parser.add_argument('--rsmix_prob', type=float, default=0.5, help='rsmix probability') + parser.add_argument('--beta', type=float, default=0.0, help='scalar value for beta function') + parser.add_argument('--nsample', type=float, default=512, help='default max sample number of the erased or added points in rsmix') + parser.add_argument('--modelnet10', action='store_true', help='use modelnet10') + parser.add_argument('--normal', action='store_true', help='use normal') + parser.add_argument('--knn', action='store_true', help='use knn instead ball-query function') + parser.add_argument('--data_path', type=str, default='./data/modelnet40_normal_resampled', help='dataset path') + + + args = parser.parse_args() + + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + torch.manual_seed(args.seed) + + if not os.path.exists('./log'): os.mkdir('./log') + LOG_DIR = os.path.join('./log',args.exp_name) + if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) + LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') + LOG_FOUT.write(str(args)+'\n') + + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + torch.cuda.manual_seed(args.seed) + else: + io.cprint('Using CPU') + + start_time = time.time() + + if not args.eval and not args.eval_corrupt: + train(args, io) + elif args.eval: + test(args, io) + elif args.eval_corrupt: + device = torch.device("cuda" if args.cuda else "cpu") + model = DGCNN(args).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + + def test_corrupt(args, split, model): + test_loader = DataLoader(ModelNetC(split=split), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + test_true = [] + test_pred = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + return {'acc': test_acc, 'avg_per_class_acc': avg_per_class_acc} + eval_corrupt_wrapper(model, test_corrupt, {'args': args}) + + LOG_FOUT.close() + diff --git a/zoo/RSMix/dgcnn_rsmix/model.py b/zoo/RSMix/dgcnn_rsmix/model.py new file mode 100644 index 0000000..7bfe5bb --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/model.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +RSMix: +@Author: Dogyoon Lee +@Contact: dogyoonlee@gmail.com +@File: model.py +@Time: 2020/11/23 13:46 PM + +DGCNN: +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: model.py +@Time: 2018/10/13 6:35 PM +""" + + +import os +import sys +import copy +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def knn(x, k): + inner = -2*torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx + + +def get_graph_feature(x, k=20, idx=None): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + if idx is None: + idx = knn(x, k=k) # (batch_size, num_points, k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1)*num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() # (batch_size, num_points, num_dims) -> (batch_size*num_points, num_dims) # batch_size * num_points * k + range(0, batch_size*num_points) + feature = x.view(batch_size*num_points, -1)[idx, :] + feature = feature.view(batch_size, num_points, k, num_dims) + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((feature-x, x), dim=3).permute(0, 3, 1, 2).contiguous() + + return feature + + +class PointNet(nn.Module): + def __init__(self, args, output_channels=40): + super(PointNet, self).__init__() + self.args = args + self.conv1 = nn.Conv1d(3, 64, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.conv3 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.conv4 = nn.Conv1d(64, 128, kernel_size=1, bias=False) + self.conv5 = nn.Conv1d(128, args.emb_dims, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.bn3 = nn.BatchNorm1d(64) + self.bn4 = nn.BatchNorm1d(128) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + self.linear1 = nn.Linear(args.emb_dims, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout() + self.linear2 = nn.Linear(512, output_channels) + + def forward(self, x): + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = F.relu(self.bn4(self.conv4(x))) + x = F.relu(self.bn5(self.conv5(x))) + x = F.adaptive_max_pool1d(x, 1).squeeze() + x = F.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = self.linear2(x) + return x + + +class DGCNN(nn.Module): + def __init__(self, args, output_channels=40): + super(DGCNN, self).__init__() + self.args = args + self.k = args.k + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(128) + self.bn4 = nn.BatchNorm2d(256) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=False), + self.bn1, + nn.LeakyReLU(negative_slope=0.2)) + self.conv2 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn2, + nn.LeakyReLU(negative_slope=0.2)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 128, kernel_size=1, bias=False), + self.bn3, + nn.LeakyReLU(negative_slope=0.2)) + self.conv4 = nn.Sequential(nn.Conv2d(128*2, 256, kernel_size=1, bias=False), + self.bn4, + nn.LeakyReLU(negative_slope=0.2)) + self.conv5 = nn.Sequential(nn.Conv1d(512, args.emb_dims, kernel_size=1, bias=False), + self.bn5, + nn.LeakyReLU(negative_slope=0.2)) + self.linear1 = nn.Linear(args.emb_dims*2, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, output_channels) + + def forward(self, x): + batch_size = x.size(0) + x = get_graph_feature(x, k=self.k) + x = self.conv1(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.k) + x = self.conv2(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.k) + x = self.conv3(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x3, k=self.k) + x = self.conv4(x) + x4 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3, x4), dim=1) + + x = self.conv5(x) + x1 = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x2 = F.adaptive_avg_pool1d(x, 1).view(batch_size, -1) + x = torch.cat((x1, x2), 1) + + x = F.leaky_relu(self.bn6(self.linear1(x)), negative_slope=0.2) + x = self.dp1(x) + x = F.leaky_relu(self.bn7(self.linear2(x)), negative_slope=0.2) + x = self.dp2(x) + x = self.linear3(x) + return x diff --git a/zoo/RSMix/dgcnn_rsmix/provider.py b/zoo/RSMix/dgcnn_rsmix/provider.py new file mode 100644 index 0000000..e51c73f --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/provider.py @@ -0,0 +1,466 @@ +''' +RSMix: +@Author: Dogyoon Lee +@Contact: dogyoonlee@gmail.com +@File: provider.py +@Time: 2020/11/23 13:46 PM +''' + + +import os +import sys +import numpy as np +import h5py +# import tensorflow as tf +import random + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# def set_random_seed(seed=1): +# # set random_seed +# random.seed(seed) +# np.random.seed(seed) +# tf.set_random_seed(seed) + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +# def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.02): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +# def shift_point_cloud(batch_data, shift_range=0.1): +def shift_point_cloud(batch_data, shift_range=0.2): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +# def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): +def random_scale_point_cloud(batch_data, scale_low=2./3., scale_high=3./2.): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def knn_points(k, xyz, query, nsample=512): + B, N, C = xyz.shape + _, S, _ = query.shape # S=1 + + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + sqrdists = square_distance(query, xyz) # Bx1,N #제곱거리 + tmp = np.sort(sqrdists, axis=2) + knn_dist = np.zeros((B,1)) + for i in range(B): + knn_dist[i][0] = tmp[i][0][k] + group_idx[i][sqrdists[i]>knn_dist[i][0]]=N + # group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def cut_points_knn(data_batch, idx, radius, nsample=512, k=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = knn_points(k=k, xyz=data_batch[:,:,:3], query=query_points[:,:,:3], nsample=nsample) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512, KNN=False): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + if KNN: + knn_para = min(int(np.ceil(cut_rad*n_sample)),n_sample) + pts_erase_idx, query_point_1 = cut_points_knn(data_batch, rand_idx_1, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points_knn(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_2 x 3(or 6) + else: + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed, lam, label_a, label_b + diff --git a/zoo/RSMix/dgcnn_rsmix/rsmix_provider.py b/zoo/RSMix/dgcnn_rsmix/rsmix_provider.py new file mode 100644 index 0000000..1e0091b --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/rsmix_provider.py @@ -0,0 +1,208 @@ + +import os +import sys +import numpy as np +import h5py +# import tensorflow as tf +import random + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def knn_points(k, xyz, query, nsample=512): + B, N, C = xyz.shape + _, S, _ = query.shape # S=1 + + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + sqrdists = square_distance(query, xyz) # Bx1,N #제곱거리 + tmp = np.sort(sqrdists, axis=2) + knn_dist = np.zeros((B,1)) + for i in range(B): + knn_dist[i][0] = tmp[i][0][k] + group_idx[i][sqrdists[i]>knn_dist[i][0]]=N + # group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def cut_points_knn(data_batch, idx, radius, nsample=512, k=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = knn_points(k=k, xyz=data_batch[:,:,:3], query=query_points[:,:,:3], nsample=nsample) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512, KNN=False): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + if KNN: + knn_para = min(int(np.ceil(cut_rad*n_sample)),n_sample) + pts_erase_idx, query_point_1 = cut_points_knn(data_batch, rand_idx_1, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points_knn(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample, k=knn_para) # B x num_points_in_radius_2 x 3(or 6) + else: + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed, lam, label_a, label_b + diff --git a/zoo/RSMix/dgcnn_rsmix/util.py b/zoo/RSMix/dgcnn_rsmix/util.py new file mode 100644 index 0000000..dd323ff --- /dev/null +++ b/zoo/RSMix/dgcnn_rsmix/util.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +RSMix: +@Author: Dogyoon Lee +@Contact: dogyoonlee@gmail.com +@File: util.py +@Time: 2020/11/23 13:46 PM + +DGCNN: +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: util +@Time: 4/5/19 3:47 PM +""" + + +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() diff --git a/zoo/RSMix/pointnet2_rsmix/README.md b/zoo/RSMix/pointnet2_rsmix/README.md new file mode 100644 index 0000000..b5f35d3 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/README.md @@ -0,0 +1,123 @@ +# RSMix for PointNet++(TensorFlow) +We utilize the original released codes of [PointNet++](https://github.com/charlesq34/pointnet2/), which is implemented with TensorFlow. + +* RSMix is implemented in `rsmix_provider.py`. + +## Prepare Dataset +* You can get sampled point clouds of ModelNet40 (XYZ and normal from mesh, 10k points per shape) here (1.6GB). + +Move the uncompressed data folder or create symbolic link to `data/modelnet40_normal_resampled`. + +* You can also get sampled point clouds of ModelNet40 (XYZ and normal from mesh, 10k points per shape) as hdf5 format here (435MB). + +Move the uncompressed data folder or create symbolic link to `data/modelnet40_ply_hdf5_2048`. + +## Environment +Follow the environment setting of original `PointNet++` code. + +[[PointNet++ Environment setting]](https://github.com/charlesq34/pointnet2/blob/master/README.md) + +## Point Cloud Classification +### Training +#### Run the training script: + +``` +python train.py --model pointnet2_cls_ssg --log_dir ./log/$exp_name $conventional_data_augmentation_arguements $dataset_arguments --beta 1.0 +``` +--> `--beta 1.0` : RSMix argument + +* conventional data agumentation arguments: + +(if you use these arguments, input the argument `--convda` in advance) + +`--shuffle` : Random shuffle augmentation + +`--jitter` : Jitter augmentation + +`--rot` : Random Rotation augmentation + +`--rdscale` : Random Scaling augmentation + +`--shift` : Random Shif augmentation + +* RandDrop augmentation argument: + +`--rddrop` : RandDrop augmentation + +* Dataset_argument: + +(Default dataset: modelnet40) + +`--modelnet10`: modelnet10 argument + +* For PointNet training: + +replace the model name as `pointnet_cls_rsmix` + + + +### Evaluation + +#### Run the evaluation script: + +**PointNet++** + +For ModelNet40 evaluation, + +- Single-view evaluation: +``` +python evaluate.py --num_votes 1 --model_path ./log/$exp_name/model.ckpt +``` + +- Multi-view evaluation: +``` +python evaluate.py --num_votes 12 --model_path ./log/$exp_name/model.ckpt +``` + +For ModelNet10 evaluation, + +- Single-view evaluation: +``` +python evaluate_modelnet10.py --num_votes 1 --model_path ./log/$exp_name/model.ckpt +``` + +- Multi-view evaluation: +``` +python evaluate_modelnet10.py --num_votes 12 --model_path ./log/$exp_name/model.ckpt +``` + + +**PointNet** + +For ModelNet40 Evaluation, + +- Single-view evaluation: +``` +python evaluate.py --num_votes 1 --model pointnet_cls_basic --model_path ./log/$exp_name/model.ckpt +``` + +- Multi-view evaluation: +``` +python evaluate.py --num_votes 12 --model pointnet_cls_basic --model_path ./log/$exp_name/model.ckpt +``` + + + + + +### Save and Visualize Samples + +You can input additional arguments related to the other augmentations if you want. + +- Save mixed samples: +``` +python train_data_mix_save.py --model pointnet2_cls_ssg --log_dir $log_dir --mixed_data_dir ./data_mix --mixed_data_save --beta 1.0 $additional_augmentation_arguments +``` + +- Visualize Samples: +``` +python ./utils/show3d_balls_rsmix.py --background_white --ball_mix(if you want knn visualize, use --knn_mix) --path $mixed_data +``` +We utilize the viusalization tool in released code of [PointNet++](https://github.com/charlesq34/pointnet2/). + +The original code for visualization is here \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/evaluate.py b/zoo/RSMix/pointnet2_rsmix/evaluate.py new file mode 100644 index 0000000..ecbeb56 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/evaluate.py @@ -0,0 +1,185 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +# import modelnet_h5_dataset +import modelnet_h5_dataset_origin as modelnet_h5_dataset + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg_origin', help='Model name. [default: pointnet2_cls_ssg]') +# parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump', help='dump folder path [dump]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=12, help='Aggregate classification scores from multiple rotations [default: 1]') +FLAGS = parser.parse_args() + + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir + +exp_name = FLAGS.model_path.split('/')[-2] +dump_exp_dir = os.path.join(DUMP_DIR, exp_name) + +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +exp_i = 2 +l = 0 +while os.path.exists(dump_exp_dir): + if l > 0: + dump_exp_dir = dump_exp_dir[:-7] + dump_exp_dir = dump_exp_dir+'_eval_'+str(exp_i) + exp_i += 1 + l += 1 +if not os.path.exists(dump_exp_dir): os.mkdir(dump_exp_dir) + +LOG_FOUT = open(os.path.join(dump_exp_dir, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +# LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +# LOG_FOUT.write(str(FLAGS)+'\n') + +NUM_CLASSES = 40 +SHAPE_NAMES = [line.rstrip() for line in \ + open(os.path.join(ROOT_DIR, 'data/modelnet40_ply_hdf5_2048/shape_names.txt'))] + +HOSTNAME = socket.gethostname() + +# Shapenet official train/test split +if FLAGS.normal: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + while TEST_DATASET.has_next_batch(): + batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + print('Batch: %03d, batch size: %d'%(batch_idx, bsize)) + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + batch_pred_sum = np.zeros((BATCH_SIZE, NUM_CLASSES)) # score for classes + for vote_idx in range(num_votes): + # Shuffle point order to achieve different farthest samplings + shuffled_indices = np.arange(NUM_POINT) + np.random.shuffle(shuffled_indices) + if FLAGS.normal: + rotated_data = provider.rotate_point_cloud_by_angle_with_normal(cur_batch_data[:, shuffled_indices, :], + vote_idx/float(num_votes) * np.pi * 2) + else: + rotated_data = provider.rotate_point_cloud_by_angle(cur_batch_data[:, shuffled_indices, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], feed_dict=feed_dict) + batch_pred_sum += pred_val + pred_val = np.argmax(batch_pred_sum, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/RSMix/pointnet2_rsmix/evaluate_modelnet10.py b/zoo/RSMix/pointnet2_rsmix/evaluate_modelnet10.py new file mode 100644 index 0000000..372f4cc --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/evaluate_modelnet10.py @@ -0,0 +1,194 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset_origin as modelnet_dataset +# import modelnet_h5_dataset +import modelnet_h5_dataset_origin as modelnet_h5_dataset + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg_origin_modelnet10', help='Model name. [default: pointnet2_cls_ssg]') +# parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump', help='dump folder path [dump]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=12, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--modelnet10', action='store_true', help='use modelnet10') +FLAGS = parser.parse_args() + + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +# MODELNET10 = FLAGS.modelnet10 +MODELNET10 = True + +exp_name = FLAGS.model_path.split('/')[-2] +dump_exp_dir = os.path.join(DUMP_DIR, exp_name) + +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +exp_i = 2 +l=0 +while os.path.exists(dump_exp_dir): + if l > 0: + dump_exp_dir = dump_exp_dir[:-7] + dump_exp_dir = dump_exp_dir+'_eval_'+str(exp_i) + exp_i += 1 + l += 1 +if not os.path.exists(dump_exp_dir): os.mkdir(dump_exp_dir) + +LOG_FOUT = open(os.path.join(dump_exp_dir, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +# if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +# LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +# LOG_FOUT.write(str(FLAGS)+'\n') + + +NUM_CLASSES = 10 + +SHAPE_NAMES = [line.rstrip() for line in \ + open(os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled/modelnet10_shape_names.txt'))] + +# for i, name in enumerate(SHAPE_NAMES): + # print('%10s:\t%0.3f' % (name, i)) + +HOSTNAME = socket.gethostname() + +# Shapenet official train/test split +if FLAGS.normal or MODELNET10: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE, modelnet10=MODELNET10) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE, modelnet10=MODELNET10) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, class_num=NUM_CLASSES) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + while TEST_DATASET.has_next_batch(): + batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + print('Batch: %03d, batch size: %d'%(batch_idx, bsize)) + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + batch_pred_sum = np.zeros((BATCH_SIZE, NUM_CLASSES)) # score for classes + for vote_idx in range(num_votes): + # Shuffle point order to achieve different farthest samplings + shuffled_indices = np.arange(NUM_POINT) + np.random.shuffle(shuffled_indices) + if FLAGS.normal: + rotated_data = provider.rotate_point_cloud_by_angle_with_normal(cur_batch_data[:, shuffled_indices, :], + vote_idx/float(num_votes) * np.pi * 2) + else: + rotated_data = provider.rotate_point_cloud_by_angle(cur_batch_data[:, shuffled_indices, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], feed_dict=feed_dict) + batch_pred_sum += pred_val + pred_val = np.argmax(batch_pred_sum, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet40_label_names.yml b/zoo/RSMix/pointnet2_rsmix/modelnet40_label_names.yml new file mode 100644 index 0000000..9c4d933 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet40_label_names.yml @@ -0,0 +1,41 @@ + label_to_names = {0: 'airplane', + 1: 'bathtub', + 2: 'bed', + 3: 'bench', + 4: 'bookshelf', + 5: 'bottle', + 6: 'bowl', + 7: 'car', + 8: 'chair', + 9: 'cone', + 10: 'cup', + 11: 'curtain', + 12: 'desk', + 13: 'door', + 14: 'dresser', + 15: 'flower_pot', + 16: 'glass_box', + 17: 'guitar', + 18: 'keyboard', + 19: 'lamp', + 20: 'laptop', + 21: 'mantel', + 22: 'monitor', + 23: 'night_stand', + 24: 'person', + 25: 'piano', + 26: 'plant', + 27: 'radio', + 28: 'range_hood', + 29: 'sink', + 30: 'sofa', + 31: 'stairs', + 32: 'stool', + 33: 'table', + 34: 'tent', + 35: 'toilet', + 36: 'tv_stand', + 37: 'vase', + 38: 'wardrobe', + 39: 'xbox'} + diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet_dataset.py b/zoo/RSMix/pointnet2_rsmix/modelnet_dataset.py new file mode 100644 index 0000000..9732bd3 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet_dataset.py @@ -0,0 +1,191 @@ +''' + ModelNet dataset. Support ModelNet40, ModelNet10, XYZ and normal channels. Up to 10000 points. +''' + +import os +import os.path +import json +import numpy as np +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import rsmix_provider + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class ModelNetDataset(): + def __init__(self, root, batch_size = 32, npoints = 1024, split='train', normalize=True, normal_channel=False, modelnet10=False, cache_size=15000, shuffle=None): + self.root = root + self.batch_size = batch_size + self.npoints = npoints + self.normalize = normalize + if modelnet10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {} + if modelnet10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + assert(split=='train' or split=='test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i])+'.txt') for i in range(len(shape_ids[split]))] + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + if shuffle is None: + if split == 'train': self.shuffle = True + else: self.shuffle = False + else: + self.shuffle = shuffle + + self.reset() + + def _augment_batch_data(self, batch_data, shuffle=False, jitter=False, rot=False, rdscale=False, shift=False): + # if self.normal_channel: + # rotated_data = provider.rotate_point_cloud_with_normal(batch_data) + # rotated_data = provider.rotate_perturbation_point_cloud_with_normal(rotated_data) + # else: + # rotated_data = provider.rotate_point_cloud(batch_data) + # rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + + # jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + # jittered_data = provider.shift_point_cloud(jittered_data) + # jittered_data = provider.jitter_point_cloud(jittered_data) + # rotated_data[:,:,0:3] = jittered_data + # return provider.shuffle_points(rotated_data) + ''' + revise + ''' + if rot: + if self.normal_channel: + rotated_data = provider.rotate_point_cloud_with_normal(batch_data) + batch_data = provider.rotate_perturbation_point_cloud_with_normal(rotated_data) + else: + rotated_data = provider.rotate_point_cloud(batch_data) + batch_data = provider.rotate_perturbation_point_cloud(rotated_data) + if rdscale: + tmp_data = provider.random_scale_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if shift: + tmp_data = provider.shift_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if jitter: + tmp_data = provider.jitter_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if shuffle: + batch_data = provider.shuffle_points(batch_data) + return batch_data + ''' + to here + ''' + def _rddrop_batch_data(self, data_batch): + return provider.random_point_dropout(data_batch) + + def _rsmix_batch_data(self, batch_data, label_batch, beta=0.0, n_sample=512): + return rsmix_provider.rsmix(batch_data, label_batch, beta=beta, n_sample=512) + + def _get_item(self, index): # load 1 data. + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1],delimiter=',').astype(np.float32) + # Take the first npoints + point_set = point_set[0:self.npoints,:] + if self.normalize: + point_set[:,0:3] = pc_normalize(point_set[:,0:3]) + if not self.normal_channel: + point_set = point_set[:,0:3] + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + def __len__(self): + return len(self.datapath) + + def num_channel(self): + if self.normal_channel: + return 6 + else: + return 3 + + def reset(self): + self.idxs = np.arange(0, len(self.datapath)) + if self.shuffle: + np.random.shuffle(self.idxs) + self.num_batches = (len(self.datapath)+self.batch_size-1) // self.batch_size + self.batch_idx = 0 + + def has_next_batch(self): + return self.batch_idx < self.num_batches + + def next_batch(self, augment=False, convda=False, rddrop=False, rsmix_prob=0.5, beta=0.0, + n_sample=512, shuffle=False, jitter=False, rot=False, rdscale=False, shift=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, len(self.datapath)) + bsize = end_idx - start_idx + batch_data = np.zeros((bsize, self.npoints, self.num_channel())) + batch_label = np.zeros((bsize), dtype=np.int32) + for i in range(bsize): + ps,cls = self._get_item(self.idxs[i+start_idx]) + batch_data[i] = ps + batch_label[i] = cls + self.batch_idx += 1 + # if augment: batch_data = self._augment_batch_data(batch_data) + # return batch_data, batch_label + ''' + revised from + ''' + lam = np.zeros(batch_data.shape[0],dtype=float) + batch_label_b = batch_label + if augment: + r = np.random.rand(1) + # r = 0.1 # for debug + if convda: batch_data = self._augment_batch_data(batch_data, shuffle=shuffle, jitter=jitter, rot=rot, rdscale=rdscale, shift=shift) + if rddrop: batch_data = self._rddrop_batch_data(batch_data) + if beta > 0 and r < rsmix_prob: + batch_data, lam, batch_label, batch_label_b = self._rsmix_batch_data(batch_data, batch_label, beta=beta, n_sample=512) + ''' + to here + ''' + return batch_data, batch_label, lam, batch_label_b + +if __name__ == '__main__': + d = ModelNetDataset(root = 'data/modelnet40_normal_resampled', split='test') + print(d.shuffle) + print(len(d)) + import time + tic = time.time() + for i in range(10): + ps, cls = d[i] + print(time.time() - tic) + print(ps.shape, type(ps), cls) + + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet_dataset_for_eval.py b/zoo/RSMix/pointnet2_rsmix/modelnet_dataset_for_eval.py new file mode 100644 index 0000000..f1688e9 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet_dataset_for_eval.py @@ -0,0 +1,150 @@ +''' + ModelNet dataset. Support ModelNet40, ModelNet10, XYZ and normal channels. Up to 10000 points. +''' + +import os +import os.path +import json +import numpy as np +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import rsmix_provider + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class ModelNetDataset(): + def __init__(self, root, batch_size = 32, npoints = 1024, split='train', normalize=True, normal_channel=False, modelnet10=False, cache_size=15000, shuffle=None): + self.root = root + self.batch_size = batch_size + self.npoints = npoints + self.normalize = normalize + if modelnet10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {} + if modelnet10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + assert(split=='train' or split=='test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i])+'.txt') for i in range(len(shape_ids[split]))] + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + if shuffle is None: + if split == 'train': self.shuffle = True + else: self.shuffle = False + else: + self.shuffle = shuffle + + self.reset() + + def _augment_batch_data(self, batch_data): + if self.normal_channel: + rotated_data = provider.rotate_point_cloud_with_normal(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud_with_normal(rotated_data) + else: + rotated_data = provider.rotate_point_cloud(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + + jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + jittered_data = provider.shift_point_cloud(jittered_data) + jittered_data = provider.jitter_point_cloud(jittered_data) + rotated_data[:,:,0:3] = jittered_data + return provider.shuffle_points(rotated_data) + + def _rddrop_batch_data(self, data_batch): + return provider.random_point_dropout(data_batch) + + def _rsmix_batch_data(self, batch_data, label_batch, beta=0.0, n_sample=512): + return rsmix_provider.rsmix(batch_data, label_batch, beta=beta, n_sample=512) + + def _get_item(self, index): # load 1 data. + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1],delimiter=',').astype(np.float32) + # Take the first npoints + point_set = point_set[0:self.npoints,:] + if self.normalize: + point_set[:,0:3] = pc_normalize(point_set[:,0:3]) + if not self.normal_channel: + point_set = point_set[:,0:3] + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + def __len__(self): + return len(self.datapath) + + def num_channel(self): + if self.normal_channel: + return 6 + else: + return 3 + + def reset(self): + self.idxs = np.arange(0, len(self.datapath)) + if self.shuffle: + np.random.shuffle(self.idxs) + self.num_batches = (len(self.datapath)+self.batch_size-1) // self.batch_size + self.batch_idx = 0 + + def has_next_batch(self): + return self.batch_idx < self.num_batches + + def next_batch(self, augment=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, len(self.datapath)) + bsize = end_idx - start_idx + batch_data = np.zeros((bsize, self.npoints, self.num_channel())) + batch_label = np.zeros((bsize), dtype=np.int32) + for i in range(bsize): + ps,cls = self._get_item(self.idxs[i+start_idx]) + batch_data[i] = ps + batch_label[i] = cls + self.batch_idx += 1 + if augment: batch_data = self._augment_batch_data(batch_data) + return batch_data, batch_label + +if __name__ == '__main__': + d = ModelNetDataset(root = 'data/modelnet40_normal_resampled', split='test') + print(d.shuffle) + print(len(d)) + import time + tic = time.time() + for i in range(10): + ps, cls = d[i] + print(time.time() - tic) + print(ps.shape, type(ps), cls) + + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet_dataset_origin.py b/zoo/RSMix/pointnet2_rsmix/modelnet_dataset_origin.py new file mode 100644 index 0000000..bafb24d --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet_dataset_origin.py @@ -0,0 +1,149 @@ +''' + ModelNet dataset. Support ModelNet40, ModelNet10, XYZ and normal channels. Up to 10000 points. +''' + +import os +import os.path +import json +import numpy as np +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class ModelNetDataset(): + def __init__(self, root, batch_size = 32, npoints = 1024, split='train', normalize=True, normal_channel=False, modelnet10=False, cache_size=15000, shuffle=None): + self.root = root + self.batch_size = batch_size + self.npoints = npoints + self.normalize = normalize + if modelnet10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'modelnet40_shape_names.txt') + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {} + if modelnet10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + assert(split=='train' or split=='test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i])+'.txt') for i in range(len(shape_ids[split]))] + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + if shuffle is None: + if split == 'train': self.shuffle = True + else: self.shuffle = False + else: + self.shuffle = shuffle + + self.reset() + + def _augment_batch_data(self, batch_data): + if self.normal_channel: + rotated_data = provider.rotate_point_cloud_with_normal(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud_with_normal(rotated_data) + else: + rotated_data = provider.rotate_point_cloud(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + + jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + jittered_data = provider.shift_point_cloud(jittered_data) + jittered_data = provider.jitter_point_cloud(jittered_data) + rotated_data[:,:,0:3] = jittered_data + return provider.shuffle_points(rotated_data) + + def _rddrop_batch_data(self, data_batch): + return provider.random_point_dropout(data_batch) + + def _point_mix_batch_data(self, batch_data, label_batch, beta=0.0, n_sample=512): + return provider.point_mix(batch_data, label_batch, beta=beta, n_sample=512) + + def _get_item(self, index): # load 1 data. + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1],delimiter=',').astype(np.float32) + # Take the first npoints + point_set = point_set[0:self.npoints,:] + if self.normalize: + point_set[:,0:3] = pc_normalize(point_set[:,0:3]) + if not self.normal_channel: + point_set = point_set[:,0:3] + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + def __len__(self): + return len(self.datapath) + + def num_channel(self): + if self.normal_channel: + return 6 + else: + return 3 + + def reset(self): + self.idxs = np.arange(0, len(self.datapath)) + if self.shuffle: + np.random.shuffle(self.idxs) + self.num_batches = (len(self.datapath)+self.batch_size-1) // self.batch_size + self.batch_idx = 0 + + def has_next_batch(self): + return self.batch_idx < self.num_batches + + def next_batch(self, augment=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, len(self.datapath)) + bsize = end_idx - start_idx + batch_data = np.zeros((bsize, self.npoints, self.num_channel())) + batch_label = np.zeros((bsize), dtype=np.int32) + for i in range(bsize): + ps,cls = self._get_item(self.idxs[i+start_idx]) + batch_data[i] = ps + batch_label[i] = cls + self.batch_idx += 1 + if augment: batch_data = self._augment_batch_data(batch_data) + return batch_data, batch_label + +if __name__ == '__main__': + d = ModelNetDataset(root = 'data/modelnet40_normal_resampled', split='test') + print(d.shuffle) + print(len(d)) + import time + tic = time.time() + for i in range(10): + ps, cls = d[i] + print(time.time() - tic) + print(ps.shape, type(ps), cls) + + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset.py b/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset.py new file mode 100644 index 0000000..38dc018 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset.py @@ -0,0 +1,163 @@ +''' + ModelNet dataset. Support ModelNet40, XYZ channels. Up to 2048 points. + Faster IO than ModelNetDataset in the first epoch. +''' + +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import rsmix_provider + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(ROOT_DIR, 'data') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +class ModelNetH5Dataset(object): + def __init__(self, list_filename, batch_size = 32, npoints = 1024, shuffle=True): + self.list_filename = list_filename + self.batch_size = batch_size + self.npoints = npoints + self.shuffle = shuffle + self.h5_files = getDataFiles(self.list_filename) + self.reset() + + def reset(self): + ''' reset order of h5 files ''' + self.file_idxs = np.arange(0, len(self.h5_files)) + if self.shuffle: np.random.shuffle(self.file_idxs) + self.current_data = None + self.current_label = None + self.current_file_idx = 0 + self.batch_idx = 0 + + def _augment_batch_data(self, batch_data, shuffle=False, jitter=False, rot=False, rdscale=False, shift=False): + # rotated_data = provider.rotate_point_cloud(batch_data) + # rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + # jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + # jittered_data = provider.shift_point_cloud(jittered_data) + # jittered_data = provider.jitter_point_cloud(jittered_data) + # rotated_data[:,:,0:3] = jittered_data + # return provider.shuffle_points(rotated_data) + if rot: + batch_data = provider.rotate_point_cloud(batch_data) + batch_data = provider.rotate_perturbation_point_cloud(batch_data) + if rdscale: + tmp_data = provider.random_scale_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if shift: + tmp_data = provider.shift_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if jitter: + tmp_data = provider.jitter_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if shuffle: + batch_data = provider.shuffle_points(batch_data) + return batch_data + + def _rddrop_batch_data(self, data_batch): + return provider.random_point_dropout(data_batch) + + def _rsmix_batch_data(self, batch_data, label_batch, beta=0.0, n_sample=512): + return rsmix_provider.rsmix(batch_data, label_batch, beta=beta, n_sample=512) + + def _get_data_filename(self): + return self.h5_files[self.file_idxs[self.current_file_idx]] + + def _load_data_file(self, filename): + self.current_data,self.current_label = load_h5(filename) + self.current_label = np.squeeze(self.current_label) + self.batch_idx = 0 + if self.shuffle: + self.current_data, self.current_label, _ = shuffle_data(self.current_data,self.current_label) + + def _has_next_batch_in_file(self): + return self.batch_idx*self.batch_size < self.current_data.shape[0] + + def num_channel(self): + return 3 + + def has_next_batch(self): + # TODO: add backend thread to load data + if (self.current_data is None) or (not self._has_next_batch_in_file()): + if self.current_file_idx >= len(self.h5_files): + return False + self._load_data_file(self._get_data_filename()) + self.batch_idx = 0 + self.current_file_idx += 1 + return self._has_next_batch_in_file() + + def next_batch(self, augment=False, convda=False, rddrop=False, p_mix_prob=0.5, beta=0.0, + n_sample=512, shuffle=False, jitter=False, rot=False, rdscale=False, shift=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, self.current_data.shape[0]) + bsize = end_idx - start_idx + batch_label = np.zeros((bsize), dtype=np.int32) + data_batch = self.current_data[start_idx:end_idx, 0:self.npoints, :].copy() + label_batch = self.current_label[start_idx:end_idx].copy() + self.batch_idx += 1 + # if augment: data_batch = self._augment_batch_data(data_batch) + ''' + revised from + ''' + lam = np.zeros(data_batch.shape[0],dtype=float) + label_batch_b = label_batch + cut_rad = 0.0 + if augment: + r = np.random.rand(1) + # r = 0.1 # for debug + if convda: data_batch = self._augment_batch_data(data_batch, shuffle=shuffle, jitter=jitter, rot=rot, rdscale=rdscale, shift=shift) + if rddrop: data_batch = self._rddrop_batch_data(data_batch) + if beta > 0 and r < p_mix_prob: + data_batch, lam, label_batch, label_batch_b = self._rsmix_batch_data(data_batch, label_batch, beta=beta, n_sample=512) + ''' + to here + ''' + return data_batch, label_batch, lam, label_batch_b + +if __name__=='__main__': + d = ModelNetH5Dataset('data/modelnet40_ply_hdf5_2048/train_files.txt') + print(d.shuffle) + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset_data_mix_save.py b/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset_data_mix_save.py new file mode 100644 index 0000000..5f1db1d --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset_data_mix_save.py @@ -0,0 +1,180 @@ +''' + ModelNet dataset. Support ModelNet40, XYZ channels. Up to 2048 points. + Faster IO than ModelNetDataset in the first epoch. +''' + +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import utils.provider_save as provider + + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(ROOT_DIR, 'data') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +class ModelNetH5Dataset(object): + def __init__(self, list_filename, batch_size = 32, npoints = 1024, shuffle=True): + self.list_filename = list_filename + self.batch_size = batch_size + self.npoints = npoints + self.shuffle = shuffle + self.h5_files = getDataFiles(self.list_filename) + self.reset() + + def reset(self): + ''' reset order of h5 files ''' + self.file_idxs = np.arange(0, len(self.h5_files)) + if self.shuffle: np.random.shuffle(self.file_idxs) + self.current_data = None + self.current_label = None + self.current_file_idx = 0 + self.batch_idx = 0 + + def _augment_batch_data(self, batch_data, shuffle=False, jitter=False, rot=False, rdscale=False, shift=False): + # rotated_data = provider.rotate_point_cloud(batch_data) + # rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + # jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + # jittered_data = provider.shift_point_cloud(jittered_data) + # jittered_data = provider.jitter_point_cloud(jittered_data) + # rotated_data[:,:,0:3] = jittered_data + # return provider.shuffle_points(rotated_data) + if rot: + batch_data = provider.rotate_point_cloud(batch_data) + batch_data = provider.rotate_perturbation_point_cloud(batch_data) + if rdscale: + tmp_data = provider.random_scale_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if shift: + tmp_data = provider.shift_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if jitter: + tmp_data = provider.jitter_point_cloud(batch_data[:,:,0:3]) + batch_data[:,:,0:3] = tmp_data + if shuffle: + batch_data = provider.shuffle_points(batch_data) + return batch_data + + def _rddrop_batch_data(self, data_batch): + return provider.random_point_dropout(data_batch) + + def _rsmix_batch_data(self, batch_data, label_batch, beta=0.0, n_sample=512): + return provider.rsmix_for_save(batch_data, label_batch, beta=beta, n_sample=512) + + def _get_data_filename(self): + return self.h5_files[self.file_idxs[self.current_file_idx]] + + def _load_data_file(self, filename): + self.current_data,self.current_label = load_h5(filename) + self.current_label = np.squeeze(self.current_label) + self.batch_idx = 0 + if self.shuffle: + self.current_data, self.current_label, _ = shuffle_data(self.current_data,self.current_label) + + def _has_next_batch_in_file(self): + return self.batch_idx*self.batch_size < self.current_data.shape[0] + + def num_channel(self): + return 3 + + def has_next_batch(self): + # TODO: add backend thread to load data + if (self.current_data is None) or (not self._has_next_batch_in_file()): + if self.current_file_idx >= len(self.h5_files): + return False + self._load_data_file(self._get_data_filename()) + self.batch_idx = 0 + self.current_file_idx += 1 + return self._has_next_batch_in_file() + + def next_batch(self, augment=False, convda=False, rddrop=False, rsmix_prob=0.5, beta=0.0, + n_sample=512, shuffle=False, jitter=False, rot=False, rdscale=False, shift=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, self.current_data.shape[0]) + bsize = end_idx - start_idx + batch_label = np.zeros((bsize), dtype=np.int32) + data_batch = self.current_data[start_idx:end_idx, 0:self.npoints, :].copy() + label_batch = self.current_label[start_idx:end_idx].copy() + self.batch_idx += 1 + # if augment: data_batch = self._augment_batch_data(data_batch) + ''' + revised from + ''' + # TODO : Original data -> copy 둜 λ°”κΎΈκΈ°? + data_original_batch = data_batch + lam = np.zeros(data_batch.shape[0],dtype=float) + label_batch_b = label_batch + data_batch_a_mask = data_batch + data_batch_b_mask = data_batch + len_a_idx = np.ones(data_batch.shape[0],dtype=int)*1024 + len_b_idx = np.ones(data_batch.shape[0],dtype=int)*1024 + ###---KNN + data_batch_2 = data_batch + knn_data_batch_mixed = data_batch + knn_lam = np.zeros(data_batch.shape[0],dtype=float) + knn_data_batch_a_mask = data_batch + knn_data_batch_b_mask = data_batch + knn_len_a_idx = np.ones(data_batch.shape[0],dtype=int)*1024 + knn_len_b_idx = np.ones(data_batch.shape[0],dtype=int)*1024 + ### + cut_rad = 0.0 + if augment: + r = np.random.rand(1) + # r = 0.1 # for debug + if convda: data_batch = self._augment_batch_data(data_batch, shuffle=shuffle, jitter=jitter, rot=rot, rdscale=rdscale, shift=shift) + if rddrop: data_batch = self._rddrop_batch_data(data_batch) + if beta > 0 and r < rsmix_prob: + data_batch, lam, label_batch, label_batch_b, cut_rad, data_batch_a_mask, data_batch_b_mask, len_a_idx, len_b_idx, data_batch_2,\ + knn_data_batch_mixed, knn_lam, knn_data_batch_a_mask, knn_data_batch_b_mask, knn_len_a_idx, knn_len_b_idx = self._rsmix_batch_data(data_batch, label_batch, beta=beta, n_sample=512) + ''' + to here + ''' + return data_batch, label_batch, lam, label_batch_b, data_original_batch, cut_rad, data_batch_a_mask, data_batch_b_mask, len_a_idx, len_b_idx, data_batch_2,\ + knn_data_batch_mixed, knn_lam, knn_data_batch_a_mask, knn_data_batch_b_mask, knn_len_a_idx, knn_len_b_idx + +if __name__=='__main__': + d = ModelNetH5Dataset('data/modelnet40_ply_hdf5_2048/train_files.txt') + print(d.shuffle) + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset_origin.py b/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset_origin.py new file mode 100644 index 0000000..7944e44 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/modelnet_h5_dataset_origin.py @@ -0,0 +1,126 @@ +''' + ModelNet dataset. Support ModelNet40, XYZ channels. Up to 2048 points. + Faster IO than ModelNetDataset in the first epoch. +''' + +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider + + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(ROOT_DIR, 'data') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +class ModelNetH5Dataset(object): + def __init__(self, list_filename, batch_size = 32, npoints = 1024, shuffle=True): + self.list_filename = list_filename + self.batch_size = batch_size + self.npoints = npoints + self.shuffle = shuffle + self.h5_files = getDataFiles(self.list_filename) + self.reset() + + def reset(self): + ''' reset order of h5 files ''' + self.file_idxs = np.arange(0, len(self.h5_files)) + if self.shuffle: np.random.shuffle(self.file_idxs) + self.current_data = None + self.current_label = None + self.current_file_idx = 0 + self.batch_idx = 0 + + def _augment_batch_data(self, batch_data): + rotated_data = provider.rotate_point_cloud(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + jittered_data = provider.shift_point_cloud(jittered_data) + jittered_data = provider.jitter_point_cloud(jittered_data) + rotated_data[:,:,0:3] = jittered_data + return provider.shuffle_points(rotated_data) + + + def _get_data_filename(self): + return self.h5_files[self.file_idxs[self.current_file_idx]] + + def _load_data_file(self, filename): + self.current_data,self.current_label = load_h5(filename) + self.current_label = np.squeeze(self.current_label) + self.batch_idx = 0 + if self.shuffle: + self.current_data, self.current_label, _ = shuffle_data(self.current_data,self.current_label) + + def _has_next_batch_in_file(self): + return self.batch_idx*self.batch_size < self.current_data.shape[0] + + def num_channel(self): + return 3 + + def has_next_batch(self): + # TODO: add backend thread to load data + if (self.current_data is None) or (not self._has_next_batch_in_file()): + if self.current_file_idx >= len(self.h5_files): + return False + self._load_data_file(self._get_data_filename()) + self.batch_idx = 0 + self.current_file_idx += 1 + return self._has_next_batch_in_file() + + def next_batch(self, augment=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, self.current_data.shape[0]) + bsize = end_idx - start_idx + batch_label = np.zeros((bsize), dtype=np.int32) + data_batch = self.current_data[start_idx:end_idx, 0:self.npoints, :].copy() + label_batch = self.current_label[start_idx:end_idx].copy() + self.batch_idx += 1 + if augment: data_batch = self._augment_batch_data(data_batch) + return data_batch, label_batch + +if __name__=='__main__': + d = ModelNetH5Dataset('data/modelnet40_ply_hdf5_2048/train_files.txt') + print(d.shuffle) + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_msg.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_msg.py new file mode 100644 index 0000000..3d66941 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_msg.py @@ -0,0 +1,83 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_sa_module_msg + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + # return pointclouds_pl, labels_pl + ''' + revise + ''' + labels_pl_b = tf.placeholder(tf.int32, shape=(batch_size)) + lam = tf.placeholder(tf.float32, shape=(batch_size)) + return pointclouds_pl, labels_pl, labels_pl_b, lam + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + + l0_xyz = point_cloud + l0_points = None + + # Set abstraction layers + l1_xyz, l1_points = pointnet_sa_module_msg(l0_xyz, l0_points, 512, [0.1,0.2,0.4], [16,32,128], [[32,32,64], [64,64,128], [64,96,128]], is_training, bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points = pointnet_sa_module_msg(l1_xyz, l1_points, 128, [0.2,0.4,0.8], [32,64,128], [[64,64,128], [128,128,256], [128,128,256]], is_training, bn_decay, scope='layer2') + l3_xyz, l3_points, _ = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.4, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.4, is_training=is_training, scope='dp2') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +# def get_loss(pred, label, end_points): +def get_loss(pred, label, end_points, label_b, lam): + + """ pred: B*NUM_CLASSES, + label: B, """ + # loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + # classify_loss = tf.reduce_mean(loss) + # tf.summary.scalar('classify loss', classify_loss) + # tf.add_to_collection('losses', classify_loss) + + ''' + from here + ''' + loss_a = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + loss_b = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label_b) + loss_a_lam = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label)*(1-lam) + loss_b_lam = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label_b)*lam + loss_sum = tf.add(loss_a_lam, loss_b_lam) + + classify_loss = tf.reduce_mean(loss_sum) + + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + ''' + to here + ''' + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg.py new file mode 100644 index 0000000..76e7d52 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg.py @@ -0,0 +1,86 @@ +""" + PointNet++ Model for point clouds classification +""" + +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + labels_pl_b = tf.placeholder(tf.int32, shape=(batch_size)) + lam = tf.placeholder(tf.float32, shape=(batch_size)) + return pointclouds_pl, labels_pl, labels_pl_b, lam + +def get_model(point_cloud, is_training, bn_decay=None, class_num=40): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Set abstraction layers + # Note: When using NCHW for layer 2, we see increased GPU memory usage (in TF1.4). + # So we only use NCHW for layer 1 until this issue can be resolved. + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp2') + if class_num==10: + net = tf_util.fully_connected(net, 10, activation_fn=None, scope='fc3') # for ModelNet10 + else: + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points, label_b, lam): + """ pred: B*NUM_CLASSES, + label: B, """ + # loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + # classify_loss = tf.reduce_mean(loss) + # tf.summary.scalar('classify loss', classify_loss) + # tf.add_to_collection('losses', classify_loss) + ''' + from here + ''' + + # loss_a = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + # loss_b = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label_b) + loss_a_lam = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label)*(1-lam) + loss_b_lam = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label_b)*lam + loss_sum = tf.add(loss_a_lam, loss_b_lam) + + classify_loss = tf.reduce_mean(loss_sum) + + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + ''' + to here + ''' + # return classify_loss, loss_a, loss_b, loss_a_lam, loss_b_lam + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + output, _ = get_model(inputs, tf.constant(True)) + print(output) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg_origin.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg_origin.py new file mode 100644 index 0000000..03ef5ef --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg_origin.py @@ -0,0 +1,62 @@ + +""" + PointNet++ Model for point clouds classification +""" + +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Set abstraction layers + # Note: When using NCHW for layer 2, we see increased GPU memory usage (in TF1.4). + # So we only use NCHW for layer 1 until this issue can be resolved. + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp2') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + output, _ = get_model(inputs, tf.constant(True)) + print(output) \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg_origin_modelnet10.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg_origin_modelnet10.py new file mode 100644 index 0000000..de43fbc --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_cls_ssg_origin_modelnet10.py @@ -0,0 +1,62 @@ + +""" + PointNet++ Model for point clouds classification +""" + +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + +def get_model(point_cloud, is_training, bn_decay=None, class_num=10): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Set abstraction layers + # Note: When using NCHW for layer 2, we see increased GPU memory usage (in TF1.4). + # So we only use NCHW for layer 1 until this issue can be resolved. + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp2') + net = tf_util.fully_connected(net, 10, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + output, _ = get_model(inputs, tf.constant(True)) + print(output) \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg.py new file mode 100644 index 0000000..bcb79a7 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg.py @@ -0,0 +1,59 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 6)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Part segmentation PointNet, input is BxNx6 (XYZ NormalX NormalY NormalZ), output Bx50 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = tf.slice(point_cloud, [0,0,3], [-1,-1,3]) + + # Set Abstraction layers + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=64, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Feature Propagation layers + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, tf.concat([l0_xyz,l0_points],axis=-1), l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer3') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, 50, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label): + """ pred: BxNxC, + label: BxN, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg_msg_one_hot.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg_msg_one_hot.py new file mode 100644 index 0000000..6d7fbd8 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg_msg_one_hot.py @@ -0,0 +1,68 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_sa_module_msg, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 6)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + cls_labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl, cls_labels_pl + +NUM_CATEGORIES = 16 + +def get_model(point_cloud, cls_label, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = tf.slice(point_cloud, [0,0,3], [-1,-1,3]) + + # Set abstraction layers + l1_xyz, l1_points = pointnet_sa_module_msg(l0_xyz, l0_points, 512, [0.1,0.2,0.4], [32,64,128], [[32,32,64], [64,64,128], [64,96,128]], is_training, bn_decay, scope='layer1') + l2_xyz, l2_points = pointnet_sa_module_msg(l1_xyz, l1_points, 128, [0.4,0.8], [64,128], [[128,128,256],[128,196,256]], is_training, bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Feature propagation layers + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + + cls_label_one_hot = tf.one_hot(cls_label, depth=NUM_CATEGORIES, on_value=1.0, off_value=0.0) + cls_label_one_hot = tf.reshape(cls_label_one_hot, [batch_size, 1, NUM_CATEGORIES]) + cls_label_one_hot = tf.tile(cls_label_one_hot, [1,num_point,1]) + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, tf.concat([cls_label_one_hot, l0_xyz, l0_points],axis=-1), l1_points, [128,128], is_training, bn_decay, scope='fp_layer3') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, 50, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label): + """ pred: BxNxC, + label: BxN, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + cls_labels = tf.zeros((32),dtype=tf.int32) + output, ep = get_model(inputs, cls_labels, tf.constant(True)) + print(output) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg_rsmix.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg_rsmix.py new file mode 100644 index 0000000..bcb79a7 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_part_seg_rsmix.py @@ -0,0 +1,59 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 6)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Part segmentation PointNet, input is BxNx6 (XYZ NormalX NormalY NormalZ), output Bx50 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = tf.slice(point_cloud, [0,0,3], [-1,-1,3]) + + # Set Abstraction layers + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=64, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Feature Propagation layers + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, tf.concat([l0_xyz,l0_points],axis=-1), l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer3') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, 50, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label): + """ pred: BxNxC, + label: BxN, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet2_sem_seg.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_sem_seg.py new file mode 100644 index 0000000..f33213e --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet2_sem_seg.py @@ -0,0 +1,63 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + smpws_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, smpws_pl + + +def get_model(point_cloud, is_training, num_class, bn_decay=None): + """ Semantic segmentation PointNet, input is BxNx3, output Bxnum_class """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Layer 1 + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=1024, radius=0.1, nsample=32, mlp=[32,32,64], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=256, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=64, radius=0.4, nsample=32, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer3') + l4_xyz, l4_points, l4_indices = pointnet_sa_module(l3_xyz, l3_points, npoint=16, radius=0.8, nsample=32, mlp=[256,256,512], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer4') + + # Feature Propagation layers + l3_points = pointnet_fp_module(l3_xyz, l4_xyz, l3_points, l4_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer2') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer3') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, l0_points, l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer4') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, num_class, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label, smpw): + """ pred: BxNxC, + label: BxN, + smpw: BxN """ + classify_loss = tf.losses.sparse_softmax_cross_entropy(labels=label, logits=pred, weights=smpw) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,3)) + net, _ = get_model(inputs, tf.constant(True), 10) + print(net) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet_cls_basic.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet_cls_basic.py new file mode 100644 index 0000000..2a89b7f --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet_cls_basic.py @@ -0,0 +1,83 @@ +''' + PointNet version 1 Model + Reference: https://github.com/charlesq34/pointnet +''' +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + input_image = tf.expand_dims(point_cloud, -1) + + # Point functions (MLP implemented as conv2d) + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + + # Symmetric function: max pooling + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + + # MLP on global point cloud vector + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/RSMix/pointnet2_rsmix/models/pointnet_cls_rsmix.py b/zoo/RSMix/pointnet2_rsmix/models/pointnet_cls_rsmix.py new file mode 100644 index 0000000..5febd43 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/models/pointnet_cls_rsmix.py @@ -0,0 +1,96 @@ +''' + PointNet version 1 Model + Reference: https://github.com/charlesq34/pointnet +''' +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + labels_pl_b = tf.placeholder(tf.int32, shape=(batch_size)) + lam = tf.placeholder(tf.float32, shape=(batch_size)) + return pointclouds_pl, labels_pl, labels_pl_b, lam + + +def get_model(point_cloud, is_training, bn_decay=None, class_num=40): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + input_image = tf.expand_dims(point_cloud, -1) + + # Point functions (MLP implemented as conv2d) + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + + # Symmetric function: max pooling + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + + # MLP on global point cloud vector + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + if class_num==10: + net = tf_util.fully_connected(net, 10, activation_fn=None, scope='fc3') # for ModelNet10 + else: + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points, label_b, lam): + """ pred: B*NUM_CLASSES, + label: B, """ + # loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + # classify_loss = tf.reduce_mean(loss) + # tf.summary.scalar('classify loss', classify_loss) + # tf.add_to_collection('losses', classify_loss) + loss_a_lam = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label)*(1-lam) + loss_b_lam = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label_b)*lam + loss_sum = tf.add(loss_a_lam, loss_b_lam) + + classify_loss = tf.reduce_mean(loss_sum) + + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/RSMix/pointnet2_rsmix/predict_cls.py b/zoo/RSMix/pointnet2_rsmix/predict_cls.py new file mode 100644 index 0000000..3a445dd --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/predict_cls.py @@ -0,0 +1,134 @@ +''' + Predict class of single pointcloud data. +''' +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import argparse +import importlib +import os +import sys + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) + +import provider + +from pprint import pprint + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump', help='dump folder path [dump]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('-v', '--visualize', action='store_true', help='Visualize input pointcloud data') +parser.add_argument('--path', help='Path of pointcloud txt') + +FLAGS = parser.parse_args() + +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +VISUALIZE = FLAGS.visualize +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +NUM_CLASSES = 40 +SHAPE_NAMES = [line.rstrip() for line in \ + open(os.path.join(ROOT_DIR, 'data/modelnet40_ply_hdf5_2048/shape_names.txt'))] + + +PC_PATH = FLAGS.path +# Get first n dimensions, must change with normal flag +npoints = 3 + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(): + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(1, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred + } + + # Load pointcloud data from txt file + point_set = np.loadtxt(PC_PATH, delimiter=',').astype(np.float32) + # Get indexes for random points from pointcloud + random_idx = np.random.randint(point_set.shape[0], size=1024) + + #point_set = point_set[random_idx,0:npoints] + point_set = point_set[:NUM_POINT, 0:npoints] + point_set = np.array([point_set]) + + pred_one(sess, ops, point_set) + +def pred_one(sess, ops, pointcloud_data): + is_training = False + num_votes = FLAGS.num_votes + + pred_val_sum = np.zeros((1, NUM_CLASSES)) + + for vote_idx in range(num_votes): + + rotation = vote_idx/float(num_votes) * np.pi * 2 + rotated_data = provider.rotate_point_cloud_by_angle(pointcloud_data, rotation) + + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['is_training_pl']: is_training} + + pred_val = sess.run([ops['pred']], feed_dict=feed_dict)[0] + pred_val_sum += pred_val + idx = np.argmax(pred_val) + + print("Predicted shape as: '{}' with rotation: {}".format(SHAPE_NAMES[idx], np.degrees(rotation)) ) + + final_idx = np.argmax(pred_val_sum) + print("Final prediction:", SHAPE_NAMES[final_idx]) + + if VISUALIZE: + from show3d_balls import showpoints + + showpoints(pointcloud_data[0]) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate() + LOG_FOUT.close() + diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/interpolate.cpp b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/interpolate.cpp new file mode 100644 index 0000000..b7d0dd0 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/interpolate.cpp @@ -0,0 +1,169 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +using namespace tensorflow; + +REGISTER_OP("ThreeNN") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("dist: float32") + .Output("idx: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolate") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // (b,m,c) + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // (b,n,3) + c->WithRank(c->input(1), 3, &dims2); + // (b,n,c) + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolateGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;iinput(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,n,3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,m,3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *dist_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,n,3}, &dist_tensor)); + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,n,3}, &idx_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto dist_flat = dist_tensor->flat(); + float *dist = &(dist_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + threenn_cpu(b,n,m,xyz1,xyz2,dist,idx); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeNN").Device(DEVICE_CPU), ThreeNNOp); + + + +class ThreeInterpolateOp: public OpKernel{ + public: + explicit ThreeInterpolateOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolate expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b && idx_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) weight shape")); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + threeinterpolate_cpu(b,m,c,n,points,idx,weight,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolate").Device(DEVICE_CPU),ThreeInterpolateOp); + + +class ThreeInterpolateGradOp: public OpKernel{ + public: + explicit ThreeInterpolateGradOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) weight shape")); + + const Tensor& grad_out_tensor=context->input(3); + OP_REQUIRES(context,grad_out_tensor.dims()==3 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==n && grad_out_tensor.shape().dim_size(2)==c, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,c) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + memset(grad_points, 0, sizeof(float)*b*m*c); + threeinterpolate_grad_cpu(b,n,c,m,grad_out,idx,weight,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolateGrad").Device(DEVICE_CPU),ThreeInterpolateGradOp); + + diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate.py b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate.py new file mode 100644 index 0000000..4696cac --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate.py @@ -0,0 +1,61 @@ +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +interpolate_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_interpolate_so.so')) +def three_nn(xyz1, xyz2): + ''' + Input: + xyz1: (b,n,3) float32 array, unknown points + xyz2: (b,m,3) float32 array, known points + Output: + dist: (b,n,3) float32 array, distances to known points + idx: (b,n,3) int32 array, indices to known points + ''' + return interpolate_module.three_nn(xyz1, xyz2) +ops.NoGradient('ThreeNN') +def three_interpolate(points, idx, weight): + ''' + Input: + points: (b,m,c) float32 array, known points + idx: (b,n,3) int32 array, indices to known points + weight: (b,n,3) float32 array, weights on known points + Output: + out: (b,n,c) float32 array, interpolated point values + ''' + return interpolate_module.three_interpolate(points, idx, weight) +@tf.RegisterGradient('ThreeInterpolate') +def _three_interpolate_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + weight = op.inputs[2] + return [interpolate_module.three_interpolate_grad(points, idx, weight, grad_out), None, None] + +if __name__=='__main__': + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,128,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/cpu:0'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(interpolated_points) + print( time.time() - now ) + print( ret.shape, ret.dtype ) + #print ret + + + diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate_compile.sh b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate_compile.sh new file mode 100644 index 0000000..166051d --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate_compile.sh @@ -0,0 +1,18 @@ +#TF_INC=/home/vcortex/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow_core/include +#TF_LIB=/home/vcortex/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow_core +#TF_LIB=/home/vcortex/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow_core/ + +TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())') +TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())') + +# TF1.2 +#g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +#g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + + + + +# g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I $TF_INC -I /usr/local/cuda/include -I $TF_INC/external/nsync/public -lcudart -L /usr/local/cuda/lib64/ -L$TF_LIB -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate_op_test.py b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate_op_test.py new file mode 100644 index 0000000..65ff02d --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/tf_interpolate_op_test.py @@ -0,0 +1,26 @@ +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +from tf_interpolate import three_nn, three_interpolate + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with self.test_session(): + points = tf.constant(np.random.random((1,8,16)).astype('float32')) + print(points) + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + print(interpolated_points) + err = tf.test.compute_gradient_error(points, (1,8,16), interpolated_points, (1,128,16)) + print(err) + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/visu_interpolation.py b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/visu_interpolation.py new file mode 100644 index 0000000..a6e2737 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/3d_interpolation/visu_interpolation.py @@ -0,0 +1,46 @@ +''' Visualize part segmentation ''' +import os +import sys +ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append('/home/rqi/Projects/toolkits/visualization') +from show3d_balls import showpoints +import numpy as np +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() + + +pts2 = np.array([[0,0,1],[1,0,0],[0,1,0],[1,1,0]]).astype('float32') +xyz1 = np.random.random((100,3)).astype('float32') +xyz2 = np.array([[0,0,0],[1,0,0],[0,1,0],[1,1,1]]).astype('float32') + +def fun(xyz1,xyz2,pts2): + with tf.device('/cpu:0'): + points = tf.constant(np.expand_dims(pts2,0)) + xyz1 = tf.constant(np.expand_dims(xyz1,0)) + xyz2 = tf.constant(np.expand_dims(xyz2,0)) + dist, idx = three_nn(xyz1, xyz2) + #weight = tf.ones_like(dist)/3.0 + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm, [1,1,3]) + print( norm ) + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + tmp,pts1,d,w = sess.run([xyz1, interpolated_points, dist, weight]) + #print w + pts1 = pts1.squeeze() + return pts1 + +pts1 = fun(xyz1,xyz2,pts2) +all_pts = np.zeros((104,3)) +all_pts[0:100,:] = pts1 +all_pts[100:,:] = pts2 +all_xyz = np.zeros((104,3)) +all_xyz[0:100,:]=xyz1 +all_xyz[100:,:]=xyz2 +showpoints(xyz2, pts2, ballradius=8) +showpoints(xyz1, pts1, ballradius=8) +showpoints(all_xyz, all_pts, ballradius=8) diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/.gitignore b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/.gitignore new file mode 100644 index 0000000..2f08276 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/.gitignore @@ -0,0 +1,10 @@ +a.out +query_ball_point +query_ball_point_block +query_ball_point_cuda +query_ball_point_grid +tf_grouping_g.cu.o +tf_grouping_so.so +selection_sort +selection_sort_cuda +selection_sort_const_cuda diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/compile.sh b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/compile.sh new file mode 100644 index 0000000..e1824dd --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/compile.sh @@ -0,0 +1,6 @@ +g++ query_ball_point.cpp -o query_ball_point +nvcc query_ball_point.cu -o query_ball_point_cuda +nvcc query_ball_point_block.cu -o query_ball_point_block +nvcc query_ball_point_grid.cu -o query_ball_point_grid +g++ -Wall selection_sort.cpp -o selection_sort +nvcc selection_sort.cu -o selection_sort_cuda diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point.cpp b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point.cpp new file mode 100644 index 0000000..4e28051 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point.cpp @@ -0,0 +1,119 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +void query_ball_point_cpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,1>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point_block.cu b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point_block.cu new file mode 100644 index 0000000..477fb3b --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point_block.cu @@ -0,0 +1,134 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int index = threadIdx.x; + xyz1 += n*3*index; + xyz2 += m*3*index; + idx += m*nsample*index; + + for (int j=0;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,b>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,b>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point_grid.cu b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point_grid.cu new file mode 100644 index 0000000..dcfadba --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/query_ball_point_grid.cu @@ -0,0 +1,144 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/selection_sort.cpp b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/selection_sort.cpp new file mode 100644 index 0000000..6f0839e --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/selection_sort.cpp @@ -0,0 +1,94 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), val (b,m,n) +void selection_sort_cpu(int b, int n, int m, int k, const float *dist, int *idx, float *val) { + float *p_dist; + float tmp; + int tmpi; + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,k), val (b,m,k) +__global__ void selection_sort_gpu(int b, int n, int m, int k, float *dist, int *idx, float *val) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + idx+=m*k*batch_index; + val+=m*k*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float *p_dist; + for (int j=index;j>>(b,n,m,k,dist,idx,val); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + return 0; +} diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/selection_sort_const.cu b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/selection_sort_const.cu new file mode 100644 index 0000000..9666849 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/test/selection_sort_const.cu @@ -0,0 +1,92 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), dist_out (b,m,n) +__global__ void selection_sort_gpu(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + outi+=m*n*batch_index; + out+=m*n*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + // copy from dist to dist_out + for (int j=index;j>>(b,n,m,k,dist,idx,dist_out); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + //for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include +using namespace tensorflow; + +REGISTER_OP("QueryBallPoint") + .Attr("radius: float") + .Attr("nsample: int") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("idx: int32") + .Output("pts_cnt: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoint * 3 + c->WithRank(c->input(1), 3, &dims2); + int nsample; + TF_RETURN_IF_ERROR(c->GetAttr("nsample", &nsample)); + ::tensorflow::shape_inference::ShapeHandle output1 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), nsample}); + c->set_output(0, output1); + ::tensorflow::shape_inference::ShapeHandle output2 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(1, output2); + return Status::OK(); + }); +REGISTER_OP("SelectionSort") + .Attr("k: int") + .Input("dist: float32") + .Output("outi: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("GroupPoint") + .Input("points: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * channels + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints * nsample + c->WithRank(c->input(1), 3, &dims2); + // batch_size * npoints * nsample * channels + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), c->Dim(dims2, 2), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GroupPointGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + + +void queryBallPointLauncher(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt); +class QueryBallPointGpuOp : public OpKernel { + public: + explicit QueryBallPointGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("radius", &radius_)); + OP_REQUIRES(context, radius_ > 0, errors::InvalidArgument("QueryBallPoint expects positive radius")); + + OP_REQUIRES_OK(context, context->GetAttr("nsample", &nsample_)); + OP_REQUIRES(context, nsample_ > 0, errors::InvalidArgument("QueryBallPoint expects positive nsample")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& xyz1_tensor = context->input(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, ndataset, 3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, npoint, 3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,nsample_}, &idx_tensor)); + Tensor *pts_cnt_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m}, &pts_cnt_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + auto pts_cnt_flat = pts_cnt_tensor->flat(); + int *pts_cnt = &(pts_cnt_flat(0)); + queryBallPointLauncher(b,n,m,radius_,nsample_,xyz1,xyz2,idx,pts_cnt); + } + private: + float radius_; + int nsample_; +}; +REGISTER_KERNEL_BUILDER(Name("QueryBallPoint").Device(DEVICE_GPU), QueryBallPointGpuOp); + +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out); +class SelectionSortGpuOp : public OpKernel { + public: + explicit SelectionSortGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("k", &k_)); + OP_REQUIRES(context, k_ > 0, errors::InvalidArgument("SelectionSort expects positive k")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& dist_tensor = context->input(0); + OP_REQUIRES(context, dist_tensor.dims()==3, errors::InvalidArgument("SelectionSort expects (b,m,n) dist shape.")); + int b = dist_tensor.shape().dim_size(0); + int m = dist_tensor.shape().dim_size(1); + int n = dist_tensor.shape().dim_size(2); + + Tensor *outi_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,n}, &outi_tensor)); + Tensor *out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m,n}, &out_tensor)); + + auto dist_flat = dist_tensor.flat(); + const float *dist = &(dist_flat(0)); + auto outi_flat = outi_tensor->flat(); + int *outi = &(outi_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + selectionSortLauncher(b,n,m,k_,dist,outi,out); + } + private: + int k_; +}; +REGISTER_KERNEL_BUILDER(Name("SelectionSort").Device(DEVICE_GPU), SelectionSortGpuOp); + + +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out); +class GroupPointGpuOp: public OpKernel{ + public: + explicit GroupPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPoint expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPoint expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,nsample,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + groupPointLauncher(b,n,c,m,nsample,points,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPoint").Device(DEVICE_GPU),GroupPointGpuOp); + +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points); +class GroupPointGradGpuOp: public OpKernel{ + public: + explicit GroupPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPointGrad expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + const Tensor& grad_out_tensor=context->input(2); + OP_REQUIRES(context,grad_out_tensor.dims()==4 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==m && grad_out_tensor.shape().dim_size(2)==nsample && grad_out_tensor.shape().dim_size(3)==c, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample, channel) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + cudaMemset(grad_points, 0, sizeof(float)*b*n*c); + groupPointGradLauncher(b,n,c,m,nsample,grad_out,idx,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPointGrad").Device(DEVICE_GPU),GroupPointGradGpuOp); + + diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping.py b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping.py new file mode 100644 index 0000000..6c350d3 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping.py @@ -0,0 +1,105 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +grouping_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_grouping_so.so')) +def query_ball_point(radius, nsample, xyz1, xyz2): + ''' + Input: + radius: float32, ball search radius + nsample: int32, number of points selected in each ball region + xyz1: (batch_size, ndataset, 3) float32 array, input points + xyz2: (batch_size, npoint, 3) float32 array, query points + Output: + idx: (batch_size, npoint, nsample) int32 array, indices to input points + pts_cnt: (batch_size, npoint) int32 array, number of unique points in each local region + ''' + #return grouping_module.query_ball_point(radius, nsample, xyz1, xyz2) + return grouping_module.query_ball_point(xyz1, xyz2, radius, nsample) +ops.NoGradient('QueryBallPoint') +def select_top_k(k, dist): + ''' + Input: + k: int32, number of k SMALLEST elements selected + dist: (b,m,n) float32 array, distance matrix, m query points, n dataset points + Output: + idx: (b,m,n) int32 array, first k in n are indices to the top k + dist_out: (b,m,n) float32 array, first k in n are the top k + ''' + return grouping_module.selection_sort(dist, k) +ops.NoGradient('SelectionSort') +def group_point(points, idx): + ''' + Input: + points: (batch_size, ndataset, channel) float32 array, points to sample from + idx: (batch_size, npoint, nsample) int32 array, indices to points + Output: + out: (batch_size, npoint, nsample, channel) float32 array, values sampled from points + ''' + return grouping_module.group_point(points, idx) +@tf.RegisterGradient('GroupPoint') +def _group_point_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + return [grouping_module.group_point_grad(points, idx, grad_out), None] + +def knn_point(k, xyz1, xyz2): + ''' + Input: + k: int32, number of k in k-nn search + xyz1: (batch_size, ndataset, c) float32 array, input points + xyz2: (batch_size, npoint, c) float32 array, query points + Output: + val: (batch_size, npoint, k) float32 array, L2 distances + idx: (batch_size, npoint, k) int32 array, indices to input points + ''' + b = xyz1.get_shape()[0].value + n = xyz1.get_shape()[1].value + c = xyz1.get_shape()[2].value + m = xyz2.get_shape()[1].value + print( b, n, c, m ) + print( xyz1, (b,1,n,c) ) + xyz1 = tf.tile(tf.reshape(xyz1, (b,1,n,c)), [1,m,1,1]) + xyz2 = tf.tile(tf.reshape(xyz2, (b,m,1,c)), [1,1,n,1]) + dist = tf.reduce_sum((xyz1-xyz2)**2, -1) + print (dist, k) + outi, out = select_top_k(k, dist) + idx = tf.slice(outi, [0,0,0], [-1,-1,k]) + val = tf.slice(out, [0,0,0], [-1,-1,k]) + print(idx, val) + #val, idx = tf.nn.top_k(-dist, k=k) # ONLY SUPPORT CPU + return val, idx + +if __name__=='__main__': + knn=True + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,512,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/gpu:1'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + radius = 0.1 + nsample = 64 + if knn: + _, idx = knn_point(nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + else: + idx, _ = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + #grouped_points_grad = tf.ones_like(grouped_points) + #points_grad = tf.gradients(grouped_points, points, grouped_points_grad) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(grouped_points) + print(time.time() - now) + print( ret.shape, ret.dtype) + print( ret) + + diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_compile.sh b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_compile.sh new file mode 100644 index 0000000..22aa187 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_compile.sh @@ -0,0 +1,22 @@ +#/bin/bash +/usr/local/cuda-8.0/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC +# /usr/local/cuda/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + + +#TF_INC=/home/vcortex/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_core/include +#TF_LIB=/home/vcortex/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_core + +TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())') +TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())') + +# TF1.2 +#g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +#g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + + + + +# g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I $TF_INC -I /usr/local/cuda/include -I $TF_INC/external/nsync/public -lcudart -L /usr/local/cuda/lib64/ -L$TF_LIB -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_g.cu b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_g.cu new file mode 100644 index 0000000..578330d --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_g.cu @@ -0,0 +1,141 @@ +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample), pts_cnt (b,m) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + pts_cnt += m*batch_index; // counting how many unique points selected in local region + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx,pts_cnt); + //cudaDeviceSynchronize(); +} +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + selection_sort_gpu<<>>(b,n,m,k,dist,outi,out); + //cudaDeviceSynchronize(); +} +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out){ + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + //cudaDeviceSynchronize(); +} +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points){ + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //cudaDeviceSynchronize(); +} diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_op_test.py b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_op_test.py new file mode 100644 index 0000000..fd3143f --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/grouping/tf_grouping_op_test.py @@ -0,0 +1,30 @@ +# import tensorflow as tf +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() +import numpy as np +from tf_grouping import query_ball_point, group_point + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with tf.device('/gpu:0'): + points = tf.constant(np.random.random((1,128,16)).astype('float32')) + print(points) + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + radius = 0.3 + nsample = 32 + idx, pts_cnt = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + print(grouped_points) + + with self.test_session(): + print("---- Going to compute gradient error") + err = tf.test.compute_gradient_error(points, (1,128,16), grouped_points, (1,8,32,16)) + print(err) + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/.gitignore b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/.gitignore new file mode 100644 index 0000000..9d22eb4 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/.gitignore @@ -0,0 +1,2 @@ +*.o +*.so diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling.cpp b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling.cpp new file mode 100644 index 0000000..fb3dd28 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling.cpp @@ -0,0 +1,179 @@ +/* Furthest point sampling + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include + +using namespace tensorflow; + +REGISTER_OP("ProbSample") + .Input("inp: float32") + .Input("inpr: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ncategory + c->WithRank(c->input(0), 2, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("FarthestPointSample") + .Attr("npoint: int") + .Input("inp: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * npoint * 3 + c->WithRank(c->input(0), 3, &dims1); + int npoint; + TF_RETURN_IF_ERROR(c->GetAttr("npoint", &npoint)); + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), npoint}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPoint") + .Input("inp: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * 3 + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints * 3 + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPointGrad") + .Input("inp: float32") + .Input("idx: int32") + .Input("out_g: float32") + .Output("inp_g: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out); +class ProbSampleGpuOp: public OpKernel{ + public: + explicit ProbSampleGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + const Tensor& inpr_tensor=context->input(1); + auto inp_flat=inp_tensor.flat(); + auto inpr_flat=inpr_tensor.flat(); + const float * inp=&(inp_flat(0)); + const float * inpr=&(inpr_flat(0)); + OP_REQUIRES(context,inp_tensor.dims()==2,errors::InvalidArgument("ProbSample expects (batch_size,num_choices) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + OP_REQUIRES(context,inpr_tensor.dims()==2 && inpr_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ProbSample expects (batch_size,num_points) inpr shape")); + int m=inpr_tensor.shape().dim_size(1); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + probsampleLauncher(b,n,m,inp,inpr,temp,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ProbSample").Device(DEVICE_GPU), ProbSampleGpuOp); + +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out); +class FarthestPointSampleGpuOp: public OpKernel{ + public: + explicit FarthestPointSampleGpuOp(OpKernelConstruction* context):OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("npoint", &npoint_)); + OP_REQUIRES(context, npoint_ > 0, errors::InvalidArgument("FarthestPointSample expects positive npoint")); + } + void Compute(OpKernelContext * context)override{ + int m = npoint_; + + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("FarthestPointSample expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + Tensor * out_tensor; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{32,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + farthestpointsamplingLauncher(b,n,m,inp,temp,out); + } + private: + int npoint_; +}; +REGISTER_KERNEL_BUILDER(Name("FarthestPointSample").Device(DEVICE_GPU),FarthestPointSampleGpuOp); + +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out); +class GatherPointGpuOp: public OpKernel{ + public: + explicit GatherPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPoint expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPoint expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,3},&out_tensor)); + auto out_flat=out_tensor->flat(); + float * out=&(out_flat(0)); + gatherpointLauncher(b,n,m,inp,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPoint").Device(DEVICE_GPU),GatherPointGpuOp); + +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g); +class GatherPointGradGpuOp: public OpKernel{ + public: + explicit GatherPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_points,3) inp")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + const Tensor& out_g_tensor=context->input(2); + OP_REQUIRES(context,out_g_tensor.dims()==3 && out_g_tensor.shape().dim_size(0)==b && out_g_tensor.shape().dim_size(1)==m && out_g_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result,3) out_g shape")); + auto out_g_flat=out_g_tensor.flat(); + const float * out_g=&(out_g_flat(0)); + Tensor * inp_g_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&inp_g_tensor)); + auto inp_g_flat=inp_g_tensor->flat(); + float * inp_g=&(inp_g_flat(0)); + cudaMemset(inp_g,0,b*n*3*4); + scatteraddpointLauncher(b,n,m,out_g,idx,inp_g); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPointGrad").Device(DEVICE_GPU),GatherPointGradGpuOp); + diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling.py b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling.py new file mode 100644 index 0000000..54f99e2 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling.py @@ -0,0 +1,92 @@ +''' Furthest point sampling +Original author: Haoqiang Fan +Modified by Charles R. Qi +All Rights Reserved. 2017. +''' +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sampling_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_sampling_so.so')) +def prob_sample(inp,inpr): + ''' +input: + batch_size * ncategory float32 + batch_size * npoints float32 +returns: + batch_size * npoints int32 + ''' + return sampling_module.prob_sample(inp,inpr) +ops.NoGradient('ProbSample') +# TF1.0 API requires set shape in C++ +#@tf.RegisterShape('ProbSample') +#def _prob_sample_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(2) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape2.dims[0],shape2.dims[1]])] +def gather_point(inp,idx): + ''' +input: + batch_size * ndataset * 3 float32 + batch_size * npoints int32 +returns: + batch_size * npoints * 3 float32 + ''' + return sampling_module.gather_point(inp,idx) +#@tf.RegisterShape('GatherPoint') +#def _gather_point_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(3) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape1.dims[0],shape2.dims[1],shape1.dims[2]])] +@tf.RegisterGradient('GatherPoint') +def _gather_point_grad(op,out_g): + inp=op.inputs[0] + idx=op.inputs[1] + return [sampling_module.gather_point_grad(inp,idx,out_g),None] +def farthest_point_sample(npoint,inp): + ''' +input: + int32 + batch_size * ndataset * 3 float32 +returns: + batch_size * npoint int32 + ''' + return sampling_module.farthest_point_sample(inp, npoint) +ops.NoGradient('FarthestPointSample') + + +if __name__=='__main__': + import numpy as np + np.random.seed(100) + triangles=np.random.rand(1,5,3,3).astype('float32') + with tf.device('/gpu:1'): + inp=tf.constant(triangles) + tria=inp[:,:,0,:] + trib=inp[:,:,1,:] + tric=inp[:,:,2,:] + areas=tf.sqrt(tf.reduce_sum(tf.cross(trib-tria,tric-tria)**2,2)+1e-9) + randomnumbers=tf.random_uniform((1,8192)) + triids=prob_sample(areas,randomnumbers) + tria_sample=gather_point(tria,triids) + trib_sample=gather_point(trib,triids) + tric_sample=gather_point(tric,triids) + us=tf.random_uniform((1,8192)) + vs=tf.random_uniform((1,8192)) + uplusv=1-tf.abs(us+vs-1) + uminusv=us-vs + us=(uplusv+uminusv)*0.5 + vs=(uplusv-uminusv)*0.5 + pt_sample=tria_sample+(trib_sample-tria_sample)*tf.expand_dims(us,-1)+(tric_sample-tria_sample)*tf.expand_dims(vs,-1) + print('pt_sample: ', pt_sample) + reduced_sample=gather_point(pt_sample,farthest_point_sample(1024,pt_sample)) + print(reduced_sample) + with tf.Session('') as sess: + ret=sess.run(reduced_sample) + print(ret.shape,ret.dtype) + + import cPickle as pickle + pickle.dump(ret ,open('1.pkl','wb'), -1) diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling_compile.sh b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling_compile.sh new file mode 100644 index 0000000..c067b29 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling_compile.sh @@ -0,0 +1,24 @@ +#/bin/bash +/usr/local/cuda-8.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# /usr/local/cuda/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())') +TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())') + +#TF_INC=/home/vcortex/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_core/include +#TF_LIB=/home/vcortex/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_core + +#/home/vcortex/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_core/libtensorflow_framework.so.1 + +# TF1.2 +#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/opt/anaconda3/envs/p_mix_tf1_4/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + + + + +# g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I $TF_INC -I /usr/local/cuda/include -I $TF_INC/external/nsync/public -lcudart -L /usr/local/cuda/lib64/ -L$TF_LIB -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling_g.cu b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling_g.cu new file mode 100644 index 0000000..6e28bc7 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/tf_ops/sampling/tf_sampling_g.cu @@ -0,0 +1,212 @@ +/* Furthest point sampling GPU implementation + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ + +__global__ void cumsumKernel(int b,int n,const float * __restrict__ inp,float * __restrict__ out){ + const int BlockSize=2048; + const int paddingLevel=5; + __shared__ float buffer4[BlockSize*4]; + __shared__ float buffer[BlockSize+(BlockSize>>paddingLevel)]; + for (int i=blockIdx.x;i>2; + for (int k=threadIdx.x*4;k>2)+(k>>(2+paddingLevel))]=v4; + }else{ + float v=0; + for (int k2=k;k2>2)+(k>>(2+paddingLevel))]=v; + } + } + int u=0; + for (;(2<>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+2)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + u--; + for (;u>=0;u--){ + __syncthreads(); + for (int k=threadIdx.x;k>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+3)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + __syncthreads(); + for (int k=threadIdx.x*4;k>2)-1)+(((k>>2)-1)>>paddingLevel); + buffer4[k]+=buffer[k2]; + buffer4[k+1]+=buffer[k2]; + buffer4[k+2]+=buffer[k2]; + buffer4[k+3]+=buffer[k2]; + } + } + __syncthreads(); + for (int k=threadIdx.x;k>paddingLevel)]+runningsum2; + float r2=runningsum+t; + runningsum2=t-(r2-runningsum); + runningsum=r2; + __syncthreads(); + } + } +} + +__global__ void binarysearchKernel(int b,int n,int m,const float * __restrict__ dataset,const float * __restrict__ query, int * __restrict__ result){ + int base=1; + while (base=1;k>>=1) + if (r>=k && dataset[i*n+r-k]>=q) + r-=k; + result[i*m+j]=r; + } + } +} +__global__ void farthestpointsamplingKernel(int b,int n,int m,const float * __restrict__ dataset,float * __restrict__ temp,int * __restrict__ idxs){ + if (m<=0) + return; + const int BlockSize=512; + __shared__ float dists[BlockSize]; + __shared__ int dists_i[BlockSize]; + const int BufferSize=3072; + __shared__ float buf[BufferSize*3]; + for (int i=blockIdx.x;ibest){ + best=d2; + besti=k; + } + } + dists[threadIdx.x]=best; + dists_i[threadIdx.x]=besti; + for (int u=0;(1<>(u+1))){ + int i1=(threadIdx.x*2)<>>(b,n,inp,out); +} +//require b*n working space +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out){ + cumsumKernel<<<32,512>>>(b,n,inp_p,temp); + binarysearchKernel<<>>(b,n,m,temp,inp_r,out); +} +//require 32*n working space +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out){ + farthestpointsamplingKernel<<<32,512>>>(b,n,m,inp,temp,out); +} +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out){ + gatherpointKernel<<>>(b,n,m,inp,idx,out); +} +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g){ + scatteraddpointKernel<<>>(b,n,m,out_g,idx,inp_g); +} + diff --git a/zoo/RSMix/pointnet2_rsmix/train.py b/zoo/RSMix/pointnet2_rsmix/train.py new file mode 100644 index 0000000..fbc40ad --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/train.py @@ -0,0 +1,398 @@ +''' + Single-GPU training. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import modelnet_dataset +import modelnet_h5_dataset +import time + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name [default: pointnet2_cls_ssg]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=251, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') + +# add argument +parser.add_argument('--seed', type=int, default=1, help='seed for experiment [default: 1]') +parser.add_argument('--rsmix_prob', type=float, default=0.5, help='point mix probability') +parser.add_argument('--beta', type=float, default=0.0, help='scalar value for beta function') +parser.add_argument('--convda', action='store_true', help='conventional data augmentation') +parser.add_argument('--rddrop', action='store_true', help='random point drop data augmentation') +parser.add_argument('--n_sample', type=int, default=512, help='max sample for point mix [default: 512]') +parser.add_argument('--shuffle', action='store_true', help='shuffle data augmentation') +parser.add_argument('--jitter', action='store_true', help='jitter data augmentation') +parser.add_argument('--rot', action='store_true', help='rot data augmentation') +parser.add_argument('--rdscale', action='store_true', help='rdscale data augmentation') +parser.add_argument('--shift', action='store_true', help='shift data augmentation') +parser.add_argument('--modelnet10', action='store_true', help='use modelnet10') + + +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +# NUM_CLASSES = 40 + +CONVDA=FLAGS.convda +RDDROP=FLAGS.rddrop +RSMIX_PROB=FLAGS.rsmix_prob +BETA=FLAGS.beta +N_SAMPLE=FLAGS.n_sample + +SHUFFLE=FLAGS.shuffle +JITTER=FLAGS.jitter +ROT=FLAGS.rot +RDSCALE=FLAGS.rdscale +SHIFT=FLAGS.shift + +MODELNET10=FLAGS.modelnet10 +if MODELNET10: + NUM_CLASSES=10 +else: + NUM_CLASSES=40 + + +SEED = FLAGS.seed +provider.set_random_seed(SEED) + + +# Shapenet official train/test split +if FLAGS.normal or MODELNET10: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE, modelnet10=MODELNET10) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE, modelnet10=MODELNET10) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, labels_pl_b, lam = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, class_num=NUM_CLASSES) + # _, loss_a, loss_b, loss_a_lam, loss_b_lam = MODEL.get_loss(pred, labels_pl, end_points, labels_pl_b, lam) + MODEL.get_loss(pred, labels_pl, end_points, labels_pl_b, lam) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + tf.summary.scalar('total_loss', total_loss) + for l in losses + [total_loss]: + tf.summary.scalar(l.op.name, l) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + print("--- Get training operator") + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points, + 'labels_pl_b': labels_pl_b, + 'lam': lam} + + best_acc = -1 + best_class_acc = -1 + conv_epoch = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + # train_one_epoch(sess, ops, train_writer, loss_a, loss_b, loss_a_lam, loss_b_lam) + train_one_epoch(sess, ops, train_writer) + eval_accuracy, eval_class_accuracy = eval_one_epoch(sess, ops, test_writer) + + # # Save the variables to disk. + # if epoch % 10 == 0: + # save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + # log_string("Model saved in file: %s" % save_path) + + # Save the best model + if best_acc < eval_accuracy: + best_acc = eval_accuracy + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + conv_epoch = epoch + # if best_clss_acc < eval_class_accuracy: + best_class_acc = eval_class_accuracy + # save_path_class = saver.save(sess, os.path.join(LOG_DIR, "model_class_acc.ckpt")) + # log_string("Model class_acc saved in file: %s" % save_path_class) + log_string('>>> best accuracy : %f' %(best_acc)) + log_string('>>> at that time, best class accuracy : %f' %(best_class_acc)) + + # measure the execution time + execution_time = time.time()-start_time + hour = execution_time//3600 + minute = (execution_time-hour*3600)//60 + second = execution_time-hour*3600-minute*60 + log_string('... End of the Training ...') + log_string("trainig time : %.2f sec, %d min, %d hour" %(float(second), int(minute), int(hour))) + log_string('*** best accuracy *** - %f' %(best_acc)) + log_string('*** at that time, best class accuracy *** - %f' %(best_class_acc)) + log_string('*** conv epoch *** - %d' %(conv_epoch)) + + + +# def train_one_epoch(sess, ops, train_writer, loss_a, loss_b, loss_a_lam, loss_b_lam): +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TRAIN_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_batch_label_b = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_lam = np.zeros((BATCH_SIZE), dtype=np.float32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + data_save_loop=0 + while TRAIN_DATASET.has_next_batch(): + batch_data, batch_label, lam, batch_label_b = TRAIN_DATASET.next_batch(augment=True, + convda=CONVDA, rddrop=RDDROP, + rsmix_prob=RSMIX_PROB, beta=BETA, + n_sample=N_SAMPLE, shuffle=SHUFFLE, + jitter=JITTER, rot=ROT, + rdscale=RDSCALE, shift=SHIFT) + #batch_data = provider.random_point_dropout(batch_data) + bsize = batch_data.shape[0] + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + cur_batch_label_b[0:bsize] = batch_label_b + cur_lam[0:bsize] = lam + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['labels_pl_b']: cur_batch_label_b, + ops['is_training_pl']: is_training, + ops['lam']: cur_lam} + # summary, step, _, loss_val, pred_val, loss_val_a, loss_val_b, loss_val_a_lam, loss_val_b_lam = sess.run([ops['merged'], ops['step'], + # ops['train_op'], ops['loss'], ops['pred'], loss_a, loss_b, loss_a_lam, loss_b_lam], feed_dict=feed_dict) + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + # print("loss_val_a : ",loss_val_a) + # print("loss_val_b : ",loss_val_b) + # print("lamda : ", lam) + # print("loss_val_a_lam : ",loss_val_a_lam) + # print("loss_val_b_lam : ",loss_val_b_lam) + # print("loss_val : ", loss_val) + # exit() + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + if (batch_idx+1)%50 == 0: + log_string(' ---- batch: %03d ----' % (batch_idx+1)) + log_string('mean loss: %f' % (loss_sum / 50)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx += 1 + + TRAIN_DATASET.reset() + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_batch_label_b = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_lam = np.zeros((BATCH_SIZE), dtype=np.float32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + while TEST_DATASET.has_next_batch(): + # batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + batch_data, batch_label, lam, batch_label_b = TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + cur_batch_label_b[0:bsize] = batch_label_b + cur_lam[0:bsize] = lam + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['labels_pl_b']: cur_batch_label_b, + ops['is_training_pl']: is_training, + ops['lam']: cur_lam} + # try: + # summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + # ops['loss'], ops['pred']], feed_dict=feed_dict) + # except: + # import pdb; pdb.set_trace() + + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(0, bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + eval_accuracy = total_correct/float(total_seen) + eval_class_accuracy = np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)) + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (eval_accuracy)) + log_string('eval avg class acc: %f' % (eval_class_accuracy)) + EPOCH_CNT += 1 + + TEST_DATASET.reset() + # return total_correct/float(total_seen) + return eval_accuracy, eval_class_accuracy + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + start_time = time.time() + train() + LOG_FOUT.close() diff --git a/zoo/RSMix/pointnet2_rsmix/train_data_mix_save.py b/zoo/RSMix/pointnet2_rsmix/train_data_mix_save.py new file mode 100644 index 0000000..8c534b2 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/train_data_mix_save.py @@ -0,0 +1,486 @@ +''' + Single-GPU training. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import modelnet_dataset +# from modelnet_h5_dataset_data_mix_save import * +import modelnet_h5_dataset_data_mix_save as modelnet_h5_dataset +# import modelnet_h5_dataset +import time + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name [default: pointnet2_cls_ssg]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=251, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') + +# add argument +parser.add_argument('--seed', type=int, default=1, help='seed for experiment [default: 1]') +parser.add_argument('--rsmix_prob', type=float, default=0.5, help='point mix probability') +parser.add_argument('--beta', type=float, default=0.0, help='scalar value for beta function') +parser.add_argument('--convda', action='store_true', help='conventional data augmentation') +parser.add_argument('--rddrop', action='store_true', help='random point drop data augmentation') +parser.add_argument('--n_sample', type=int, default=512, help='max sample for point mix [default: 512]') +parser.add_argument('--shuffle', action='store_true', help='shuffle data augmentation') +parser.add_argument('--jitter', action='store_true', help='jitter data augmentation') +parser.add_argument('--rot', action='store_true', help='rot data augmentation') +parser.add_argument('--rdscale', action='store_true', help='rdscale data augmentation') +parser.add_argument('--shift', action='store_true', help='shift data augmentation') +parser.add_argument('--modelnet10', action='store_true', help='use modelnet10') +parser.add_argument('--mixed_data_dir', default='./data_mixed', help='mixed data dir [default: ./data_mixed]') +parser.add_argument('--mixed_data_save', action='store_true', help='mix_data_save') + + +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +# NUM_CLASSES = 40 + +CONVDA=FLAGS.convda +RDDROP=FLAGS.rddrop +RSMIX_PROB=FLAGS.rsmix_prob +BETA=FLAGS.beta +N_SAMPLE=FLAGS.n_sample + +SHUFFLE=FLAGS.shuffle +JITTER=FLAGS.jitter +ROT=FLAGS.rot +RDSCALE=FLAGS.rdscale +SHIFT=FLAGS.shift + +MODELNET10=FLAGS.modelnet10 +if MODELNET10: + NUM_CLASSES=10 +else: + NUM_CLASSES=40 + + +SEED = FLAGS.seed +provider.set_random_seed(SEED) + + +MIXED_DATA_DIR=FLAGS.mixed_data_dir +MIXED_DATA_SAVE=FLAGS.mixed_data_save + +EXP_NAME = LOG_DIR.split('/')[2] +if MIXED_DATA_SAVE: + MIXED_SAVE_DIR = os.path.join(MIXED_DATA_DIR,EXP_NAME) +else: + MIXED_SAVE_DIR = './data_mixed' + + +if not os.path.exists(MIXED_SAVE_DIR): + if not os.path.exists(MIXED_DATA_DIR): + os.mkdir(MIXED_DATA_DIR) + os.mkdir(MIXED_SAVE_DIR) + + +# Shapenet official train/test split +if FLAGS.normal or MODELNET10: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE, modelnet10=MODELNET10) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE, modelnet10=MODELNET10) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, labels_pl_b, lam = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, class_num=NUM_CLASSES) + # _, loss_a, loss_b, loss_a_lam, loss_b_lam = MODEL.get_loss(pred, labels_pl, end_points, labels_pl_b, lam) + MODEL.get_loss(pred, labels_pl, end_points, labels_pl_b, lam) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + tf.summary.scalar('total_loss', total_loss) + for l in losses + [total_loss]: + tf.summary.scalar(l.op.name, l) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + print("--- Get training operator") + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points, + 'labels_pl_b': labels_pl_b, + 'lam': lam} + + best_acc = -1 + best_clss_acc = -1 + conv_epoch = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + # train_one_epoch(sess, ops, train_writer, loss_a, loss_b, loss_a_lam, loss_b_lam) + train_one_epoch(sess, ops, train_writer, epoch, MIXED_SAVE_DIR, MIXED_DATA_SAVE) + eval_accuracy, eval_class_accuracy = eval_one_epoch(sess, ops, test_writer) + + # # Save the variables to disk. + # if epoch % 10 == 0: + # save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + # log_string("Model saved in file: %s" % save_path) + + # Save the best model + if best_acc < eval_accuracy: + best_acc = eval_accuracy + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + conv_epoch = epoch + # if best_clss_acc < eval_class_accuracy: + best_class_acc = eval_class_accuracy + # save_path_class = saver.save(sess, os.path.join(LOG_DIR, "model_class_acc.ckpt")) + # log_string("Model class_acc saved in file: %s" % save_path_class) + log_string('>>> best accuracy : %f' %(best_acc)) + log_string('>>> at that time, best class accuracy : %f' %(best_class_acc)) + + # measure the execution time + execution_time = time.time()-start_time + hour = execution_time//3600 + minute = (execution_time-hour*3600)//60 + second = execution_time-hour*3600-minute*60 + log_string('... End of the Training ...') + log_string("trainig time : %.2f sec, %d min, %d hour" %(float(second), int(minute), int(hour))) + log_string('*** best accuracy *** - %f' %(best_acc)) + log_string('*** at that time, best class accuracy *** - %f' %(best_class_acc)) + log_string('*** conv epoch *** - %d' %(conv_epoch)) + + + +# def train_one_epoch(sess, ops, train_writer, loss_a, loss_b, loss_a_lam, loss_b_lam): +def train_one_epoch(sess, ops, train_writer, epoch, MIXED_SAVE_DIR, MIXED_DATA_SAVE): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TRAIN_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_batch_label_b = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_lam = np.zeros((BATCH_SIZE), dtype=np.float32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + data_save_loop=0 + while TRAIN_DATASET.has_next_batch(): + batch_data, batch_label, lam, batch_label_b, data_original_batch, cut_rad, data_batch_a_mask, data_batch_b_mask, len_a_idx, len_b_idx, data_batch_2,\ + knn_data_batch_mixed, knn_lam, knn_data_batch_a_mask, knn_data_batch_b_mask, knn_len_a_idx, knn_len_b_idx = TRAIN_DATASET.next_batch(augment=True, + convda=CONVDA, rddrop=RDDROP, + rsmix_prob=RSMIX_PROB, beta=BETA, + n_sample=N_SAMPLE, shuffle=SHUFFLE, + jitter=JITTER, rot=ROT, + rdscale=RDSCALE, shift=SHIFT) + ''' + for saving mixed data + ''' + if MIXED_DATA_SAVE: + loop_dir = os.path.join(MIXED_SAVE_DIR, 'loop_'+str(data_save_loop)) + if not os.path.exists(loop_dir): + os.mkdir(loop_dir) + if BETA > 0 and epoch%100==0: + for i, data_original in enumerate(data_original_batch): # original data + filename = 'data_{:d}_loop_{:d}_idx_{:d}_label_{:d}_original.txt'.format(epoch, data_save_loop, i, batch_label[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data_original, fmt='%.6f', delimiter=',') + + for i, data_original in enumerate(data_batch_2): # original_2 data + filename = 'data_{:d}_loop_{:d}_idx_{:d}_label_{:d}_original_2.txt'.format(epoch, data_save_loop, i, batch_label_b[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data_original, fmt='%.6f', delimiter=',') + + for i, data in enumerate(batch_data): # mix data with lam, ==> part a, part b 도 보여쀄 수 있음 + filename = 'data_{:d}_loop_{:d}_idx_{:d}_label_{:d}_label_b_{:d}_radius_{:.3f}_mixed_lam_{}.txt'.format(epoch, data_save_loop, i, + batch_label[i], batch_label_b[i], + cut_rad, lam[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data, fmt='%.6f', delimiter=',') + + for i, data in enumerate(data_batch_a_mask): # mask a λ₯Ό 보여주어야 함 ==> part a λ³Ό 수 μž‡μŒ + filename = 'datamaska_{:d}_loop_{:d}_idx_{:d}_lenidx_{:d}_label_{:d}_radius_{:.3f}_mixed_lam_{}.txt'.format(epoch, data_save_loop, i, + len_a_idx[i], batch_label[i], + cut_rad, lam[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data, fmt='%.6f', delimiter=',') + + for i, data in enumerate(data_batch_b_mask): # mask b λ₯Ό 보여주어야 함 ==> part b λ³Ό 수 μž‡μŒ + filename = 'datamaskb_{:d}_loop_{:d}_idx_{:d}_lenidx_{:d}_label_b_{:d}_radius_{:.3f}_mixed_lam_{}.txt'.format(epoch, data_save_loop, i, + len_b_idx[i], batch_label_b[i], + cut_rad, lam[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data, fmt='%.6f', delimiter=',') + + + ###----KNN-------------------------------------------------------------------------------- + for i, data in enumerate(knn_data_batch_mixed): # mix data knn with lam, ==> part a, part b 도 보여쀄 수 있음 + filename = 'dataknn_{:d}_loop_{:d}_idx_{:d}_label_{:d}_label_b_{:d}_radius_{:.3f}_mixed_lam_{}.txt'.format(epoch, data_save_loop, i, + batch_label[i], batch_label_b[i], + cut_rad, knn_lam[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data, fmt='%.6f', delimiter=',') + + for i, data in enumerate(knn_data_batch_a_mask): # mask a λ₯Ό 보여주어야 함 + filename = 'datamaskaknn_{:d}_loop_{:d}_idx_{:d}_lenidx_{:d}_label_{:d}_radius_{:.3f}_mixed_lam_{}.txt'.format(epoch, data_save_loop, i, + knn_len_a_idx[i], batch_label[i], + cut_rad, knn_lam[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data, fmt='%.6f', delimiter=',') + + for i, data in enumerate(knn_data_batch_b_mask): # mask b λ₯Ό 보여주어야 함 + filename = 'datamaskbknn_{:d}_loop_{:d}_idx_{:d}_lenidx_{:d}_label_b_{:d}_radius_{:.3f}_mixed_lam_{}.txt'.format(epoch, data_save_loop, i, + knn_len_b_idx[i], batch_label_b[i], + cut_rad, knn_lam[i]) + save_file_path = os.path.join(loop_dir,filename) + np.savetxt(save_file_path, data, fmt='%.6f', delimiter=',') + ###-------------------------------------------------------------------------------- + data_save_loop +=1 + if epoch==1: + exit() + ''' + ''' + #batch_data = provider.random_point_dropout(batch_data) + bsize = batch_data.shape[0] + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + cur_batch_label_b[0:bsize] = batch_label_b + cur_lam[0:bsize] = lam + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['labels_pl_b']: cur_batch_label_b, + ops['is_training_pl']: is_training, + ops['lam']: cur_lam} + # summary, step, _, loss_val, pred_val, loss_val_a, loss_val_b, loss_val_a_lam, loss_val_b_lam = sess.run([ops['merged'], ops['step'], + # ops['train_op'], ops['loss'], ops['pred'], loss_a, loss_b, loss_a_lam, loss_b_lam], feed_dict=feed_dict) + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + # print("loss_val_a : ",loss_val_a) + # print("loss_val_b : ",loss_val_b) + # print("lamda : ", lam) + # print("loss_val_a_lam : ",loss_val_a_lam) + # print("loss_val_b_lam : ",loss_val_b_lam) + # print("loss_val : ", loss_val) + # exit() + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + if (batch_idx+1)%50 == 0: + log_string(' ---- batch: %03d ----' % (batch_idx+1)) + log_string('mean loss: %f' % (loss_sum / 50)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx += 1 + + TRAIN_DATASET.reset() + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_batch_label_b = np.zeros((BATCH_SIZE), dtype=np.int32) + cur_lam = np.zeros((BATCH_SIZE), dtype=np.float32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + while TEST_DATASET.has_next_batch(): + # batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + batch_data, batch_label, lam, batch_label_b, _, _, _, _, _, _, _, _, _, _, _, _, _= TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + cur_batch_label_b[0:bsize] = batch_label_b + cur_lam[0:bsize] = lam + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['labels_pl_b']: cur_batch_label_b, + ops['is_training_pl']: is_training, + ops['lam']: cur_lam} + # try: + # summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + # ops['loss'], ops['pred']], feed_dict=feed_dict) + # except: + # import pdb; pdb.set_trace() + + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(0, bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + eval_accuracy = total_correct/float(total_seen) + eval_class_accuracy = np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)) + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (eval_accuracy)) + log_string('eval avg class acc: %f' % (eval_class_accuracy)) + EPOCH_CNT += 1 + + TEST_DATASET.reset() + # return total_correct/float(total_seen) + return eval_accuracy, eval_class_accuracy + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + start_time = time.time() + train() + LOG_FOUT.close() diff --git a/zoo/RSMix/pointnet2_rsmix/utils/README.md b/zoo/RSMix/pointnet2_rsmix/utils/README.md new file mode 100644 index 0000000..6d2bfad --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/README.md @@ -0,0 +1,6 @@ +## Utilility Functions for 3D Point Cloud Deep Learning + +### visualization tool + + sh compile_render_balls_so.sh + python show3d_balls.py diff --git a/zoo/RSMix/pointnet2_rsmix/utils/compile_render_balls_so.sh b/zoo/RSMix/pointnet2_rsmix/utils/compile_render_balls_so.sh new file mode 100644 index 0000000..dc493f6 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/compile_render_balls_so.sh @@ -0,0 +1,2 @@ +g++ -std=c++11 render_balls_so.cpp -o render_balls_so.so -shared -fPIC -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + diff --git a/zoo/RSMix/pointnet2_rsmix/utils/pc_util.py b/zoo/RSMix/pointnet2_rsmix/utils/pc_util.py new file mode 100644 index 0000000..81f63d8 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/pc_util.py @@ -0,0 +1,315 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +def point_cloud_to_volume_v2_batch(point_clouds, vsize=12, radius=1.0, num_sample=128): + """ Input is BxNx3 a batch of point cloud + Output is BxVxVxVxnum_samplex3 + Added on Feb 19 + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume_v2(point_clouds[b,:,:], vsize, radius, num_sample) + vol_list.append(np.expand_dims(vol, 0)) + return np.concatenate(vol_list, 0) + +def point_cloud_to_volume_v2(points, vsize, radius=1.0, num_sample=128): + """ input is Nx3 points + output is vsize*vsize*vsize*num_sample*3 + assumes points are in range [-radius, radius] + samples num_sample points in each voxel, if there are less than + num_sample points, replicate the points + Added on Feb 19 + """ + vol = np.zeros((vsize,vsize,vsize,num_sample,3)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + loc2pc = {} + for n in range(points.shape[0]): + loc = tuple(locations[n,:]) + if loc not in loc2pc: + loc2pc[loc] = [] + loc2pc[loc].append(points[n,:]) + #print loc2pc + + for i in range(vsize): + for j in range(vsize): + for k in range(vsize): + if (i,j,k) not in loc2pc: + vol[i,j,k,:,:] = np.zeros((num_sample,3)) + else: + pc = loc2pc[(i,j,k)] # a list of (3,) arrays + pc = np.vstack(pc) # kx3 + # Sample/pad to num_sample points + if pc.shape[0]>num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0]num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0] 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + from PIL import Image + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + import matplotlib.pyplot as plt + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) + +def write_ply_color(points, labels, out_filename, num_classes=None): + """ Color (N,3) points with labels (N) within range 0 ~ num_classes-1 as OBJ file """ + import matplotlib.pyplot as pyplot + labels = labels.astype(int) + N = points.shape[0] + if num_classes is None: + num_classes = np.max(labels)+1 + else: + assert(num_classes>np.max(labels)) + fout = open(out_filename, 'w') + #colors = [pyplot.cm.hsv(i/float(num_classes)) for i in range(num_classes)] + colors = [pyplot.cm.jet(i/float(num_classes)) for i in range(num_classes)] + for i in range(N): + c = colors[labels[i]] + c = [int(x*255) for x in c] + fout.write('v %f %f %f %d %d %d\n' % (points[i,0],points[i,1],points[i,2],c[0],c[1],c[2])) + fout.close() diff --git a/zoo/RSMix/pointnet2_rsmix/utils/pointnet_util.py b/zoo/RSMix/pointnet2_rsmix/utils/pointnet_util.py new file mode 100644 index 0000000..95881dc --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/pointnet_util.py @@ -0,0 +1,231 @@ +""" PointNet++ Layers + +Author: Charles R. Qi +Date: November 2017 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/sampling')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/grouping')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/3d_interpolation')) +from tf_sampling import farthest_point_sample, gather_point +from tf_grouping import query_ball_point, group_point, knn_point +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +import numpy as np +import tf_util + +def sample_and_group(npoint, radius, nsample, xyz, points, knn=False, use_xyz=True): + ''' + Input: + npoint: int32 + radius: float32 + nsample: int32 + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points + knn: bool, if True use kNN instead of radius search + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + Output: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, nsample, 3+channel) TF tensor + idx: (batch_size, npoint, nsample) TF tensor, indices of local points as in ndataset points + grouped_xyz: (batch_size, npoint, nsample, 3) TF tensor, normalized point XYZs + (subtracted by seed point XYZ) in local regions + ''' + + new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) # (batch_size, npoint, 3) + if knn: + _,idx = knn_point(nsample, xyz, new_xyz) + else: + idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = group_point(xyz, idx) # (batch_size, npoint, nsample, 3) + grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) # translation normalization + if points is not None: + grouped_points = group_point(points, idx) # (batch_size, npoint, nsample, channel) + if use_xyz: + new_points = tf.concat([grouped_xyz, grouped_points], axis=-1) # (batch_size, npoint, nample, 3+channel) + else: + new_points = grouped_points + else: + new_points = grouped_xyz + + return new_xyz, new_points, idx, grouped_xyz + + +def sample_and_group_all(xyz, points, use_xyz=True): + ''' + Inputs: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + Outputs: + new_xyz: (batch_size, 1, 3) as (0,0,0) + new_points: (batch_size, 1, ndataset, 3+channel) TF tensor + Note: + Equivalent to sample_and_group with npoint=1, radius=inf, use (0,0,0) as the centroid + ''' + batch_size = xyz.get_shape()[0].value + nsample = xyz.get_shape()[1].value + new_xyz = tf.constant(np.tile(np.array([0,0,0]).reshape((1,1,3)), (batch_size,1,1)),dtype=tf.float32) # (batch_size, 1, 3) + idx = tf.constant(np.tile(np.array(range(nsample)).reshape((1,1,nsample)), (batch_size,1,1))) + grouped_xyz = tf.reshape(xyz, (batch_size, 1, nsample, 3)) # (batch_size, npoint=1, nsample, 3) + if points is not None: + if use_xyz: + new_points = tf.concat([xyz, points], axis=2) # (batch_size, 16, 259) + else: + new_points = points + new_points = tf.expand_dims(new_points, 1) # (batch_size, 1, 16, 259) + else: + new_points = grouped_xyz + return new_xyz, new_points, idx, grouped_xyz + + +def pointnet_sa_module(xyz, points, npoint, radius, nsample, mlp, mlp2, group_all, is_training, bn_decay, scope, bn=True, pooling='max', knn=False, use_xyz=True, use_nchw=False): + ''' PointNet Set Abstraction (SA) Module + Input: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor + npoint: int32 -- #points sampled in farthest point sampling + radius: float32 -- search radius in local region + nsample: int32 -- how many points in each local region + mlp: list of int32 -- output size for MLP on each point + mlp2: list of int32 -- output size for MLP on each region + group_all: bool -- group all points into one PC if set true, OVERRIDE + npoint, radius and nsample settings + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + use_nchw: bool, if True, use NCHW data format for conv2d, which is usually faster than NHWC format + Return: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, mlp[-1] or mlp2[-1]) TF tensor + idx: (batch_size, npoint, nsample) int32 -- indices for local regions + ''' + data_format = 'NCHW' if use_nchw else 'NHWC' + with tf.variable_scope(scope) as sc: + # Sample and Grouping + if group_all: + nsample = xyz.get_shape()[1].value + new_xyz, new_points, idx, grouped_xyz = sample_and_group_all(xyz, points, use_xyz) + else: + new_xyz, new_points, idx, grouped_xyz = sample_and_group(npoint, radius, nsample, xyz, points, knn, use_xyz) + + # Point Feature Embedding + if use_nchw: new_points = tf.transpose(new_points, [0,3,1,2]) + for i, num_out_channel in enumerate(mlp): + new_points = tf_util.conv2d(new_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv%d'%(i), bn_decay=bn_decay, + data_format=data_format) + if use_nchw: new_points = tf.transpose(new_points, [0,2,3,1]) + + # Pooling in Local Regions + if pooling=='max': + new_points = tf.reduce_max(new_points, axis=[2], keep_dims=True, name='maxpool') + elif pooling=='avg': + new_points = tf.reduce_mean(new_points, axis=[2], keep_dims=True, name='avgpool') + elif pooling=='weighted_avg': + with tf.variable_scope('weighted_avg'): + dists = tf.norm(grouped_xyz,axis=-1,ord=2,keep_dims=True) + exp_dists = tf.exp(-dists * 5) + weights = exp_dists/tf.reduce_sum(exp_dists,axis=2,keep_dims=True) # (batch_size, npoint, nsample, 1) + new_points *= weights # (batch_size, npoint, nsample, mlp[-1]) + new_points = tf.reduce_sum(new_points, axis=2, keep_dims=True) + elif pooling=='max_and_avg': + max_points = tf.reduce_max(new_points, axis=[2], keep_dims=True, name='maxpool') + avg_points = tf.reduce_mean(new_points, axis=[2], keep_dims=True, name='avgpool') + new_points = tf.concat([avg_points, max_points], axis=-1) + + # [Optional] Further Processing + if mlp2 is not None: + if use_nchw: new_points = tf.transpose(new_points, [0,3,1,2]) + for i, num_out_channel in enumerate(mlp2): + new_points = tf_util.conv2d(new_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv_post_%d'%(i), bn_decay=bn_decay, + data_format=data_format) + if use_nchw: new_points = tf.transpose(new_points, [0,2,3,1]) + + new_points = tf.squeeze(new_points, [2]) # (batch_size, npoints, mlp2[-1]) + return new_xyz, new_points, idx + +def pointnet_sa_module_msg(xyz, points, npoint, radius_list, nsample_list, mlp_list, is_training, bn_decay, scope, bn=True, use_xyz=True, use_nchw=False): + ''' PointNet Set Abstraction (SA) module with Multi-Scale Grouping (MSG) + Input: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor + npoint: int32 -- #points sampled in farthest point sampling + radius: list of float32 -- search radius in local region + nsample: list of int32 -- how many points in each local region + mlp: list of list of int32 -- output size for MLP on each point + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + use_nchw: bool, if True, use NCHW data format for conv2d, which is usually faster than NHWC format + Return: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, \sum_k{mlp[k][-1]}) TF tensor + ''' + data_format = 'NCHW' if use_nchw else 'NHWC' + with tf.variable_scope(scope) as sc: + new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) + new_points_list = [] + for i in range(len(radius_list)): + radius = radius_list[i] + nsample = nsample_list[i] + idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = group_point(xyz, idx) + grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) + if points is not None: + grouped_points = group_point(points, idx) + if use_xyz: + grouped_points = tf.concat([grouped_points, grouped_xyz], axis=-1) + else: + grouped_points = grouped_xyz + if use_nchw: grouped_points = tf.transpose(grouped_points, [0,3,1,2]) + for j,num_out_channel in enumerate(mlp_list[i]): + grouped_points = tf_util.conv2d(grouped_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], bn=bn, is_training=is_training, + scope='conv%d_%d'%(i,j), bn_decay=bn_decay) + if use_nchw: grouped_points = tf.transpose(grouped_points, [0,2,3,1]) + new_points = tf.reduce_max(grouped_points, axis=[2]) + new_points_list.append(new_points) + new_points_concat = tf.concat(new_points_list, axis=-1) + return new_xyz, new_points_concat + + +def pointnet_fp_module(xyz1, xyz2, points1, points2, mlp, is_training, bn_decay, scope, bn=True): + ''' PointNet Feature Propogation (FP) Module + Input: + xyz1: (batch_size, ndataset1, 3) TF tensor + xyz2: (batch_size, ndataset2, 3) TF tensor, sparser than xyz1 + points1: (batch_size, ndataset1, nchannel1) TF tensor + points2: (batch_size, ndataset2, nchannel2) TF tensor + mlp: list of int32 -- output size for MLP on each point + Return: + new_points: (batch_size, ndataset1, mlp[-1]) TF tensor + ''' + with tf.variable_scope(scope) as sc: + dist, idx = three_nn(xyz1, xyz2) + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm,[1,1,3]) + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points2, idx, weight) + + if points1 is not None: + new_points1 = tf.concat(axis=2, values=[interpolated_points, points1]) # B,ndataset1,nchannel1+nchannel2 + else: + new_points1 = interpolated_points + new_points1 = tf.expand_dims(new_points1, 2) + for i, num_out_channel in enumerate(mlp): + new_points1 = tf_util.conv2d(new_points1, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv_%d'%(i), bn_decay=bn_decay) + new_points1 = tf.squeeze(new_points1, [2]) # B,ndataset1,mlp[-1] + return new_points1 diff --git a/zoo/RSMix/pointnet2_rsmix/utils/provider.py b/zoo/RSMix/pointnet2_rsmix/utils/provider.py new file mode 100644 index 0000000..9d8d355 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/provider.py @@ -0,0 +1,593 @@ +import os +import sys +import numpy as np +import h5py +import tensorflow as tf +import random +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/grouping')) +from tf_grouping import knn_point + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +def set_random_seed(seed=1): + # set random_seed + random.seed(seed) + np.random.seed(seed) + tf.set_random_seed(seed) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + +################## + +def rotate_point_cloud_with_normal_for_part_seg(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + seg_label = batch_xyz_normal[k,:,6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,6] = seg_label + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal_for_part_seg(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + seg_label = batch_data[k,:,6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + rotated_data[k,:,6] = seg_label + return rotated_data +################## +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + # print("group idx init : \n",group_idx) + # print("group idx init shape : ",group_idx.shape) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512): + n_sample = int(np.around(data_batch.shape[1]/2)) + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + # return data_batch_mixed, lam, label_a, label_b, cut_rad + return data_batch_mixed, lam, label_a, label_b + + +def rsmix_for_part_seg(data_batch, beta=1.0, n_sample=1024): + # n_sample = int(np.around(data_batch.shape[1]/2)) + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + # lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + # lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + # lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + # lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed + +def rsmix_knn(data_batch, label_batch, beta=1.0, n_sample=512): + n_sample = int(np.around(data_batch.shape[1]/2)) + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + query_point_1 = np.zeros((data_batch.shape[0],1,data_batch.shape[2])) + query_point_2 = np.zeros((data_batch.shape[0],1,data_batch.shape[2])) + # print("idx : \n",idx) + for i in range(data_batch.shape[0]): + query_point_1[i][0]=data_batch[i][rand_idx_1[i][0]] # Bx1x3(=6 with normal) + query_point_2[i][0]=data_batch[i][rand_idx_2[i][0]] # Bx1x3(=6 with normal) + + k_para = np.randint(n_sample) + + _, pts_erase_idx = knn_point(k_para, xyz1=data_batch, xyz2=query_point_1) + _, pts_add_idx = knn_point(k_para, xyz1=data_batch_rand, xyz2=query_point_2) + # pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + # pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + # if pts_erase_idx[i][0][0]==data_batch.shape[1]: + if k_para == 0: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + # elif pts_add_idx[i][0][0]==data_batch.shape[1]: + # pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + # tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + # tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + # lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + # return data_batch_mixed, lam, label_a, label_b, cut_rad + return data_batch_mixed, lam, label_a, label_b \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/utils/provider_save.py b/zoo/RSMix/pointnet2_rsmix/utils/provider_save.py new file mode 100644 index 0000000..f337770 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/provider_save.py @@ -0,0 +1,611 @@ +import os +import sys +import numpy as np +import h5py +import tensorflow as tf +import random + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +def set_random_seed(seed=1): + # set random_seed + random.seed(seed) + np.random.seed(seed) + tf.set_random_seed(seed) + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in list(range(batch_data.shape[0])): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +# for rsmix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +def knn_points(k, xyz, query, nsample=512): + B, N, C = xyz.shape + _, S, _ = query.shape # S=1 + + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + sqrdists = square_distance(query, xyz) # Bx1,N #제곱거리 + tmp = np.sort(sqrdists, axis=2) + knn_dist = np.zeros((B,1)) + for i in range(B): + knn_dist[i][0] = tmp[i][0][k] + group_idx[i][sqrdists[i]>knn_dist[i][0]]=N + # group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def cut_points(data_batch, idx, radius, nsample=512): + """ + input + points : BxNx3(=6 with normal) + idx : Bx1 one scalar(int) between 0~len(points) + + output + idx : Bxn_sample + """ + B, N, C = data_batch.shape + B, S = idx.shape + query_points = np.zeros((B,1,C)) + # print("idx : \n",idx) + for i in range(B): + query_points[i][0]=data_batch[i][idx[i][0]] # Bx1x3(=6 with normal) + # B x n_sample + group_idx = query_ball_point_for_rsmix(radius, nsample, data_batch[:,:,:3], query_points[:,:,:3]) + return group_idx, query_points # group_idx: 16x?x6, query_points: 16x1x6 + + +def query_ball_point_for_rsmix(radius, nsample, xyz, new_xyz): + """ + Input: + radius: local region radius + nsample: max sample number in local region + xyz: all points, [B, N, 3] + new_xyz: query points, [B, S, 3] + Return: + group_idx: grouped points index, [B, S, nsample], S=1 + """ + # device = xyz.device + B, N, C = xyz.shape + _, S, _ = new_xyz.shape + # group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1]) + tmp_idx = np.arange(N) + group_idx = np.repeat(tmp_idx[np.newaxis,np.newaxis,:], B, axis=0) + # print("group idx init : \n",group_idx) + # print("group idx init shape : ",group_idx.shape) + sqrdists = square_distance(new_xyz, xyz) + group_idx[sqrdists > radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + # return data_batch_mixed, lam, label_a, label_b, cut_rad + return data_batch_mixed, lam, label_a, label_b, cut_rad + + +def rsmix_for_save(data_batch, label_batch, beta=1.0, n_sample=512): + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + ###---KNN------------------------------------------------------------------------------------------------------------ + knn_para = min(int(np.ceil(cut_rad*n_sample)),n_sample) + # _, knn_pts_erase_idx = knn_point(knn_para, tf.convert_to_tensor(data_batch, dtype=tf.float32), tf.convert_to_tensor(query_point_1, dtype=tf.float32)) # B x num_points_in_radius_1 x 3(or 6) + # _, knn_pts_add_idx = knn_point(knn_para, tf.convert_to_tensor(data_batch_rand, dtype=tf.float32), tf.convert_to_tensor(query_point_2, dtype=tf.float32)) # B x num_points_in_radius_2 x 3(or 6) + knn_pts_erase_idx = knn_points(knn_para, data_batch, query_point_1, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + knn_pts_add_idx = knn_points(knn_para, data_batch_rand, query_point_2, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + ###--------------------------------------------------------------------------------------------------------------- + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + data_batch_a_mask = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + data_batch_b_mask = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + len_a_idx = np.zeros(data_batch.shape[0],dtype=int) + len_b_idx = np.zeros(data_batch.shape[0],dtype=int) + ###----KNN----------------------------------------------------------------------------------------------------------- + knn_pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + knn_data_batch_a_mask = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + knn_data_batch_b_mask = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + knn_lam = np.zeros(data_batch.shape[0],dtype=float) + knn_len_a_idx = np.zeros(data_batch.shape[0],dtype=int) + knn_len_b_idx = np.zeros(data_batch.shape[0],dtype=int) + ###--------------------------------------------------------------------------------------------------------------- + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + len_a_idx_tmp=1024 + len_b_idx_tmp=0 + ###-KNN-------------------------------------------------------------------------------------------------------------- + knn_tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + knn_lam_tmp = 0 + knn_len_a_idx_tmp=1024 + knn_len_b_idx_tmp=0 + ###--------------------------------------------------------------------------------------------------------------- + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + len_a_idx_tmp=1024 + len_b_idx_tmp=0 + ###-KNN--------------------------------------------------------------------------------------------------------------- + knn_pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + knn_tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + knn_dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + knn_tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + knn_lam_tmp = 0 + knn_len_a_idx_tmp=1024 + knn_len_b_idx_tmp=0 + ###--------------------------------------------------------------------------------------------------------------- + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + ''' + from + ''' + tmp_pts_to_add_a = np.take(data_batch[i], pts_erase_idx_tmp, axis=0) + tmp_pts_erased_b = np.delete(data_batch_rand[i], pts_add_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + tmp_pts_to_add_b = np.take(data_batch_rand[i], pts_add_idx_tmp, axis=0) + ''' + to + ''' + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + ''' + from + ''' + data_batch_a_mask_tmp = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add_a)), axis=0) + data_batch_b_mask_tmp = np.expand_dims(np.vstack((tmp_pts_erased_b,tmp_pts_to_add_b)), axis=0) + ''' + to + ''' + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + len_a_idx_tmp = len(tmp_pts_erased) + len_b_idx_tmp = len(tmp_pts_erased_b) + + ### KNN--------------------------------------------------------------------------------------------------------------- + knn_pts_erase_idx_tmp = np.unique(knn_pts_erase_idx[i].reshape(n_sample,),axis=0) + knn_pts_add_idx_tmp = np.unique(knn_pts_add_idx[i].reshape(n_sample,),axis=0) + knn_pts_add_idx_ctrled_tmp = pts_num_ctrl(knn_pts_erase_idx_tmp,knn_pts_add_idx_tmp) + knn_tmp_pts_erased = np.delete(data_batch[i], knn_pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + knn_tmp_pts_to_add = np.take(data_batch_rand[i], knn_pts_add_idx_ctrled_tmp, axis=0) + ''' + from + ''' + knn_tmp_pts_to_add_a = np.take(data_batch[i], knn_pts_erase_idx_tmp, axis=0) + knn_tmp_pts_erased_b = np.delete(data_batch_rand[i], knn_pts_add_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + knn_tmp_pts_to_add_b = np.take(data_batch_rand[i], knn_pts_add_idx_tmp, axis=0) + ''' + to + ''' + knn_tmp_pts_to_add[:,:3] = query_dist[i]+knn_tmp_pts_to_add[:,:3] + + knn_tmp_pts_replaced = np.expand_dims(np.vstack((knn_tmp_pts_erased,knn_tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + ''' + from + ''' + knn_data_batch_a_mask_tmp = np.expand_dims(np.vstack((knn_tmp_pts_erased,knn_tmp_pts_to_add_a)), axis=0) + knn_data_batch_b_mask_tmp = np.expand_dims(np.vstack((knn_tmp_pts_erased_b,knn_tmp_pts_to_add_b)), axis=0) + ''' + to + ''' + knn_lam_tmp = len(knn_pts_add_idx_ctrled_tmp)/(len(knn_pts_add_idx_ctrled_tmp)+len(knn_tmp_pts_erased)) + knn_len_a_idx_tmp = len(knn_tmp_pts_erased) + knn_len_b_idx_tmp = len(knn_tmp_pts_erased_b) + ###--------------------------------------------------------------------------------------------------------------- + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + data_batch_a_mask = np.concatenate((data_batch_a_mask, data_batch_a_mask_tmp),axis=0) + data_batch_b_mask = np.concatenate((data_batch_b_mask, data_batch_b_mask_tmp),axis=0) + + lam[i] = lam_tmp + len_a_idx[i] = len_a_idx_tmp + len_b_idx[i] = len_b_idx_tmp + + ###-KNN-------------------------------------------------------------------------------------------------------------- + knn_pts_replaced = np.concatenate((knn_pts_replaced, knn_tmp_pts_replaced),axis=0) + knn_data_batch_a_mask = np.concatenate((knn_data_batch_a_mask, knn_data_batch_a_mask_tmp),axis=0) + knn_data_batch_b_mask = np.concatenate((knn_data_batch_b_mask, knn_data_batch_b_mask_tmp),axis=0) + + knn_lam[i] = knn_lam_tmp + knn_len_a_idx[i] = knn_len_a_idx_tmp + knn_len_b_idx[i] = knn_len_b_idx_tmp + ###--------------------------------------------------------------------------------------------------------------- + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + data_batch_a_mask = np.delete(data_batch_a_mask, [0], axis=0) + data_batch_b_mask = np.delete(data_batch_b_mask, [0], axis=0) + + ###-KNN-------------------------------------------------------------------------------------------------------------- + knn_data_batch_mixed = np.delete(knn_pts_replaced, [0], axis=0) + knn_data_batch_a_mask = np.delete(knn_data_batch_a_mask, [0], axis=0) + knn_data_batch_b_mask = np.delete(knn_data_batch_b_mask, [0], axis=0) + ###--------------------------------------------------------------------------------------------------------------- + + # return data_batch_mixed, lam, label_a, label_b, cut_rad + return data_batch_mixed, lam, label_a, label_b, cut_rad, data_batch_a_mask, data_batch_b_mask, len_a_idx, len_b_idx, data_batch_rand,\ + knn_data_batch_mixed, knn_lam, knn_data_batch_a_mask, knn_data_batch_b_mask, knn_len_a_idx, knn_len_b_idx + diff --git a/zoo/RSMix/pointnet2_rsmix/utils/render_balls_so.cpp b/zoo/RSMix/pointnet2_rsmix/utils/render_balls_so.cpp new file mode 100644 index 0000000..e95aeba --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/render_balls_so.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +using namespace std; + +struct PointInfo{ + int x,y,z; + float r,g,b; +}; + +extern "C"{ + +void render_ball(int h,int w,unsigned char * show,int n,int * xyzs,float * c0,float * c1,float * c2,int r){ + r=max(r,1); + vector depth(h*w,-2100000000); + vector pattern; + for (int dx=-r;dx<=r;dx++) + for (int dy=-r;dy<=r;dy++) + if (dx*dx+dy*dy=h || y2<0 || y2>=w) && depth[x2*w+y2] radius ** 2] = N + # print("group idx : \n",group_idx) + # group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample] # for torch.tensor + group_idx = np.sort(group_idx, axis=2)[:, :, :nsample] + # group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample]) + tmp_idx = group_idx[:,:,0] + group_first = np.repeat(tmp_idx[:,np.newaxis,:], nsample, axis=2) + # repeat the first value of the idx in each batch + mask = group_idx == N + group_idx[mask] = group_first[mask] + return group_idx + +def square_distance(src, dst): + """ + Calculate Euclid distance between each two points. + + src^T * dst = xn * xm + yn * ym + zn * zmοΌ› + sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn; + sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm; + dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2 + = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst + + Input: + src: source points, [B, N, C] + dst: target points, [B, M, C] + Output: + dist: per-point square distance, [B, N, M] + """ + B, N, _ = src.shape + _, M, _ = dst.shape + # dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)) + # dist += torch.sum(src ** 2, -1).view(B, N, 1) + # dist += torch.sum(dst ** 2, -1).view(B, 1, M) + dist = -2 * np.matmul(src, dst.transpose(0, 2, 1)) + dist += np.sum(src ** 2, -1).reshape(B, N, 1) + dist += np.sum(dst ** 2, -1).reshape(B, 1, M) + return dist + + +def pts_num_ctrl(pts_erase_idx, pts_add_idx): + ''' + input : pts - to erase + pts - to add + output :pts - to add (number controled) + ''' + if len(pts_erase_idx)>=len(pts_add_idx): + num_diff = len(pts_erase_idx)-len(pts_add_idx) + if num_diff == 0: + pts_add_idx_ctrled = pts_add_idx + else: + pts_add_idx_ctrled = np.append(pts_add_idx, pts_add_idx[np.random.randint(0, len(pts_add_idx), size=num_diff)]) + else: + pts_add_idx_ctrled = np.sort(np.random.choice(pts_add_idx, size=len(pts_erase_idx), replace=False)) + return pts_add_idx_ctrled + + +def rsmix(data_batch, label_batch, beta=1.0, n_sample=512): + n_sample = int(np.around(data_batch.shape[1]/2)) + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + # return data_batch_mixed, lam, label_a, label_b, cut_rad + return data_batch_mixed, lam, label_a, label_b + + +def rsmix_for_part_seg(data_batch, beta=1.0, n_sample=1024): + # n_sample = int(np.around(data_batch.shape[1]/2)) + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + # lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + if pts_erase_idx[i][0][0]==data_batch.shape[1]: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + # lam_tmp = 0 + elif pts_add_idx[i][0][0]==data_batch.shape[1]: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + # lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + # lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + return data_batch_mixed + +def rsmix_knn(data_batch, label_batch, beta=1.0, n_sample=512): + n_sample = int(np.around(data_batch.shape[1]/2)) + cut_rad = np.random.beta(beta, beta) + rand_index = np.random.choice(data_batch.shape[0],data_batch.shape[0], replace=False) # label dim : (16,) for model + + if len(label_batch.shape) is 1: + label_batch = np.expand_dims(label_batch, axis=1) + + label_a = label_batch[:,0] + label_b = label_batch[rand_index][:,0] + + data_batch_rand = data_batch[rand_index] # BxNx3(with normal=6) + rand_idx_1 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + rand_idx_2 = np.random.randint(0,data_batch.shape[1], (data_batch.shape[0],1)) + + query_point_1 = np.zeros((data_batch.shape[0],1,data_batch.shape[2])) + query_point_2 = np.zeros((data_batch.shape[0],1,data_batch.shape[2])) + # print("idx : \n",idx) + for i in range(data_batch.shape[0]): + query_point_1[i][0]=data_batch[i][rand_idx_1[i][0]] # Bx1x3(=6 with normal) + query_point_2[i][0]=data_batch[i][rand_idx_2[i][0]] # Bx1x3(=6 with normal) + + k_para = np.randint(n_sample) + + _, pts_erase_idx = knn_point(k_para, xyz1=data_batch, xyz2=query_point_1) + _, pts_add_idx = knn_point(k_para, xyz1=data_batch_rand, xyz2=query_point_2) + # pts_erase_idx, query_point_1 = cut_points(data_batch, rand_idx_1, cut_rad, nsample=n_sample) # B x num_points_in_radius_1 x 3(or 6) + # pts_add_idx, query_point_2 = cut_points(data_batch_rand, rand_idx_2, cut_rad, nsample=n_sample) # B x num_points_in_radius_2 x 3(or 6) + + query_dist = query_point_1[:,:,:3] - query_point_2[:,:,:3] + + pts_replaced = np.zeros((1,data_batch.shape[1],data_batch.shape[2])) + lam = np.zeros(data_batch.shape[0],dtype=float) + + for i in range(data_batch.shape[0]): + # if pts_erase_idx[i][0][0]==data_batch.shape[1]: + if k_para == 0: + tmp_pts_replaced = np.expand_dims(data_batch[i], axis=0) + lam_tmp = 0 + # elif pts_add_idx[i][0][0]==data_batch.shape[1]: + # pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + # tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # dup_points_idx = np.random.randint(0,len(tmp_pts_erased), size=len(pts_erase_idx_tmp)) + # tmp_pts_replaced = np.expand_dims(np.concatenate((tmp_pts_erased, data_batch[i][dup_points_idx]), axis=0), axis=0) + # lam_tmp = 0 + else: + pts_erase_idx_tmp = np.unique(pts_erase_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_tmp = np.unique(pts_add_idx[i].reshape(n_sample,),axis=0) + pts_add_idx_ctrled_tmp = pts_num_ctrl(pts_erase_idx_tmp,pts_add_idx_tmp) + tmp_pts_erased = np.delete(data_batch[i], pts_erase_idx_tmp, axis=0) # B x N-num_rad_1 x 3(or 6) + # input("INPUT : ") + tmp_pts_to_add = np.take(data_batch_rand[i], pts_add_idx_ctrled_tmp, axis=0) + tmp_pts_to_add[:,:3] = query_dist[i]+tmp_pts_to_add[:,:3] + + tmp_pts_replaced = np.expand_dims(np.vstack((tmp_pts_erased,tmp_pts_to_add)), axis=0) + # lam is ratio of replaced data in generated sample + # if len(pts_add_idx_tmp) >= len(pts_add_idx_ctrled_tmp): + # lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + # else: + # lam_tmp = len(pts_add_idx_tmp)/(len(pts_add_idx_tmp)+len(tmp_pts_erased)) + lam_tmp = len(pts_add_idx_ctrled_tmp)/(len(pts_add_idx_ctrled_tmp)+len(tmp_pts_erased)) + + pts_replaced = np.concatenate((pts_replaced, tmp_pts_replaced),axis=0) + lam[i] = lam_tmp + + data_batch_mixed = np.delete(pts_replaced, [0], axis=0) + + + # return data_batch_mixed, lam, label_a, label_b, cut_rad + return data_batch_mixed, lam, label_a, label_b \ No newline at end of file diff --git a/zoo/RSMix/pointnet2_rsmix/utils/show3d_balls.py b/zoo/RSMix/pointnet2_rsmix/utils/show3d_balls.py new file mode 100644 index 0000000..d9e79e7 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/show3d_balls.py @@ -0,0 +1,312 @@ +""" Original Author: Haoqiang Fan """ +import numpy as np +import ctypes as ct +import cv2 +import sys +import os +from pprint import pprint +import argparse +from datetime import datetime + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +showsz=800 +mousex,mousey=0.5,0.5 +zoom=1.0 +changed=True +def onmouse(*args): + global mousex,mousey,changed + y=args[1] + x=args[2] + mousex=x/float(showsz) + mousey=y/float(showsz) + changed=True +cv2.namedWindow('show3d') +cv2.moveWindow('show3d',0,0) +cv2.setMouseCallback('show3d',onmouse) + +dll=np.ctypeslib.load_library(os.path.join(BASE_DIR, 'render_balls_so'),'.') + +# data_0_loop_1_idx_0_label_5_label_b_8_radius_0.149_mixed_lam_0.0263671875 +# data_0_loop_1_idx_0_label_5_original +# data_0_loop_1_idx_0_label_8_original_2 +# dataknn_0_loop_1_idx_0_label_5_label_b_8_radius_0.149_mixed_lam_0.150390625 +# datamaska_0_loop_1_idx_0_lenidx_997_label_5_radius_0.149_mixed_lam_0.0263671875 +# datamaskaknn_0_loop_1_idx_0_lenidx_870_label_5_radius_0.149_mixed_lam_0.150390625 +# datamaskb_0_loop_1_idx_0_lenidx_989_label_b_8_radius_0.149_mixed_lam_0.0263671875 +# datamaskbknn_0_loop_1_idx_0_lenidx_870_label_b_8_radius_0.149_mixed_lam_0.150390625 + +def showpoints(xyz,c_gt=None, c_pred = None ,waittime=0,showrot=False,magnifyBlue=0, + freezerot=False,background=(0,0,0),normalizecolor=True, ballradius=10, mixed_color=False, lam=0.0, save_name='_'): + global showsz,mousex,mousey,zoom,changed + xyz=xyz-xyz.mean(axis=0) + radius=((xyz**2).sum(axis=-1)**0.5).max() + xyz/=(radius*2.2)/showsz + # if c_gt is None: + # c0=np.zeros((len(xyz),),dtype='float32')+255 # Green + # c1=np.zeros((len(xyz),),dtype='float32')+255 # Red + # c2=np.zeros((len(xyz),),dtype='float32')+255 # Blue + # else: + # c0=c_gt[:,0] + # c1=c_gt[:,1] + # c2=c_gt[:,2] + ''' + For mask, part, etc visualize from here + ''' + # print("len xyz : ",len(xyz)) + # print("lam - show point : ",lam) + # print("len(xyz)*lam) : ",len(xyz)*lam) + # print("np.around(len(xyz)*lam) : ",np.around(len(xyz)*lam)) + # print("int(np.around(len(xyz)*lam)) : ",int(np.around(len(xyz)*lam))) + # if args.ball_mix: # mix, part_a, part_b from ball + # if args.mask_a or args.mask_b: + # if args.mask_a: + # elif args.mask_b: + # else: + # if args.part_a: + # elif args.part_b: + + # elif args.origin: # original a + + # elif args.origin_2: # original b + + # elif args.knn_mix: # mask_a, mask_b from knn, part_a, part_b from knn + # if args.mask_a: + # elif args.mask_b: + # if args.part_a: + # elif args.part_b: + # else: + # raise ValueError('Invalid arguments. Please input args to notice what kind of view.') + ''' + To here + ''' + if mixed_color: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + original_point_num = len(xyz)-int(np.around(len(xyz)*lam)) + c0[:original_point_num] += 255 + c0[original_point_num:] += 0 + c1[:original_point_num] += 0 + c1[original_point_num:] += 255 + c2[:original_point_num] += 0 + c2[original_point_num:] += 0 + else: + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 # Green + c1=np.zeros((len(xyz),),dtype='float32')+255 # Red + c2=np.zeros((len(xyz),),dtype='float32')+255 # Blue + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + ###------------------------------------------------------------ + if normalizecolor: + c0/=(c0.max()+1e-14)/255.0 + c1/=(c1.max()+1e-14)/255.0 + c2/=(c2.max()+1e-14)/255.0 + + c0=np.require(c0,'float32','C') + c1=np.require(c1,'float32','C') + c2=np.require(c2,'float32','C') + + show=np.zeros((showsz,showsz,3),dtype='uint8') + def render(): + rotmat=np.eye(3) + if not freezerot: + xangle=(mousey-0.5)*np.pi*1.2 + else: + xangle=0 + rotmat=rotmat.dot(np.array([ + [1.0,0.0,0.0], + [0.0,np.cos(xangle),-np.sin(xangle)], + [0.0,np.sin(xangle),np.cos(xangle)], + ])) + if not freezerot: + yangle=(mousex-0.5)*np.pi*1.2 + else: + yangle=0 + rotmat=rotmat.dot(np.array([ + [np.cos(yangle),0.0,-np.sin(yangle)], + [0.0,1.0,0.0], + [np.sin(yangle),0.0,np.cos(yangle)], + ])) + rotmat*=zoom + nxyz=xyz.dot(rotmat)+[showsz/2,showsz/2,0] + + ixyz=nxyz.astype('int32') + show[:]=background + dll.render_ball( + ct.c_int(show.shape[0]), + ct.c_int(show.shape[1]), + show.ctypes.data_as(ct.c_void_p), + ct.c_int(ixyz.shape[0]), + ixyz.ctypes.data_as(ct.c_void_p), + c0.ctypes.data_as(ct.c_void_p), + c1.ctypes.data_as(ct.c_void_p), + c2.ctypes.data_as(ct.c_void_p), + ct.c_int(ballradius) + ) + + if magnifyBlue>0: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=0)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=0)) + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=1)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=1)) + if showrot: + cv2.putText(show,'xangle %d'%(int(xangle/np.pi*180)),(30,showsz-30),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'yangle %d'%(int(yangle/np.pi*180)),(30,showsz-50),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'zoom %d%%'%(int(zoom*100)),(30,showsz-70),0,0.5,cv2.cv.CV_RGB(255,0,0)) + changed=True + while True: + if changed: + render() + changed=False + cv2.imshow('show3d',show) + if waittime==0: + cmd=cv2.waitKey(10) % 256 + else: + cmd=cv2.waitKey(waittime) % 256 + if cmd==ord('q'): + break + elif cmd==ord('Q'): + sys.exit(0) + + if cmd==ord('t') or cmd == ord('p'): + if cmd == ord('t'): + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + else: + if c_pred is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_pred[:,0] + c1=c_pred[:,1] + c2=c_pred[:,2] + if normalizecolor: + c0/=(c0.max()+1e-14)/255.0 + c1/=(c1.max()+1e-14)/255.0 + c2/=(c2.max()+1e-14)/255.0 + c0=np.require(c0,'float32','C') + c1=np.require(c1,'float32','C') + c2=np.require(c2,'float32','C') + changed = True + + + + if cmd==ord('n'): + zoom*=1.1 + changed=True + elif cmd==ord('m'): + zoom/=1.1 + changed=True + elif cmd==ord('r'): + zoom=1.0 + changed=True + elif cmd==ord('s'): + img_name = str(datetime.now())+'_'+save_name+'.png' + cv2.imwrite(img_name,show) + # cv2.imwrite('show3d.png',show) + if waittime!=0: + break + return cmd +if __name__=='__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--ball_radius', type=int, default=10, help='Initial learning rate [default: 0.001]') + parser.add_argument('--path', default='./data_mixed', help='mixed data dir [default: ./data_mixed]') + parser.add_argument('--show_rot', action='store_true', help='mix_data_save') + parser.add_argument('--freeze_rot', action='store_true', help='mix_data_save') + parser.add_argument('--not_normalize_color', action='store_false', help='mix_data_save') + parser.add_argument('--background_white', action='store_true', help='mix_data_save') + parser.add_argument('--mixed_color', action='store_true', help='mix_data_save') + parser.add_argument('--ball_mix', action='store_true', help='mix_data_save') + parser.add_argument('--knn_mix', action='store_true', help='mix_data_save') + parser.add_argument('--mask_a', action='store_true', help='mask_view') + parser.add_argument('--mask_b', action='store_true', help='mask_view') + parser.add_argument('--part_a', action='store_true', help='part_view') + parser.add_argument('--part_b', action='store_true', help='part_view') + parser.add_argument('--origin', action='store_true', help='origin') + parser.add_argument('--origin_2', action='store_true', help='origin') + + + args = parser.parse_args() + + np.random.seed(100) + # if len(sys.argv) < 2: + # exit('Enter pointcloud path') + # path = sys.argv[1] + print("path : ",args.path) + if args.ball_mix: # mix, part_a, part_b from ball + if args.mask_a or args.mask_b: + lam = float(os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[-1]) + print("lam : ",lam) + lenidx = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[9] + if args.mask_a: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_a_ball' + elif args.mask_b: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_b_ball' + else: + lam = float(os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[-1]) + print("lam : ",lam) + filename_label_a = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label_b = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[10] + filename = 'label_a_'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_mix_ball' + if args.part_a: + filename = 'label_a_'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_part_a_ball' + elif args.part_b: + filename = 'label_a_'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_part_b_ball' + + elif args.origin: # original a + lam = 0.0 + filename_label_a = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename = 'label_a_'+filename_label_a+'_original' + + elif args.origin_2: # original b + lam = 0.0 + filename_label_b = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename = 'label_b_'+filename_label_b+'_original_2' + + elif args.knn_mix: # mask_a, mask_b from knn, part_a, part_b from knn + lam = float(os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[-1]) + print("lam : ",lam) + lenidx = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[9] + if args.mask_a: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_a_knn' + elif args.mask_b: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_b_knn' + if args.part_a: + filename = 'lenidx_'+lenidx+'_label_b_'+filename_label+'_lam_'+str(lam)+'_part_a_knn' + elif args.part_b: + filename = 'lenidx_'+lenidx+'_label_b_'+filename_label+'_lam_'+str(lam)+'_part_b_knn' + else: + raise ValueError('Invalid arguments. Please input args to notice what kind of view.') + + point_set = np.loadtxt(args.path ,delimiter=',').astype(np.float32) + random_idx = np.random.randint(point_set.shape[0], size=1024) + print("point set shape : ",point_set.shape) + point_set = point_set[0:1024,0:3] + + #point_set = point_set[random_idx,0:3] + #pprint(point_set) + #pprint(np.random.randn(2500,3)) + if args.background_white: + c_background = (255, 255, 255) + else: + c_background = (0, 0, 0) + #showpoints(np.random.randn(2500,3)) + showpoints(point_set, showrot=args.show_rot, freezerot=args.freeze_rot,background=c_background, + normalizecolor=args.not_normalize_color,ballradius=args.ball_radius, mixed_color=args.mixed_color, lam=lam, save_name=filename) + + diff --git a/zoo/RSMix/pointnet2_rsmix/utils/show3d_balls_rsmix.py b/zoo/RSMix/pointnet2_rsmix/utils/show3d_balls_rsmix.py new file mode 100644 index 0000000..b770bf5 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/show3d_balls_rsmix.py @@ -0,0 +1,506 @@ +""" Original Author: Haoqiang Fan """ +import numpy as np +import ctypes as ct +import cv2 +import sys +import os +from pprint import pprint +import argparse +from datetime import datetime + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +showsz=800 +mousex,mousey=0.5,0.5 +zoom=1.0 +changed=True +def onmouse(*args): + global mousex,mousey,changed + y=args[1] + x=args[2] + mousex=x/float(showsz) + mousey=y/float(showsz) + changed=True +cv2.namedWindow('show3d') +cv2.moveWindow('show3d',0,0) +cv2.setMouseCallback('show3d',onmouse) + +dll=np.ctypeslib.load_library(os.path.join(BASE_DIR, 'render_balls_so'),'.') + +# data_0_loop_1_idx_0_label_5_label_b_8_radius_0.149_mixed_lam_0.0263671875 +# data_0_loop_1_idx_0_label_5_original +# data_0_loop_1_idx_0_label_8_original_2 +# dataknn_0_loop_1_idx_0_label_5_label_b_8_radius_0.149_mixed_lam_0.150390625 +# datamaska_0_loop_1_idx_0_lenidx_997_label_5_radius_0.149_mixed_lam_0.0263671875 +# datamaskaknn_0_loop_1_idx_0_lenidx_870_label_5_radius_0.149_mixed_lam_0.150390625 +# datamaskb_0_loop_1_idx_0_lenidx_989_label_b_8_radius_0.149_mixed_lam_0.0263671875 +# datamaskbknn_0_loop_1_idx_0_lenidx_870_label_b_8_radius_0.149_mixed_lam_0.150390625 + +def showpoints(xyz,c_gt=None, c_pred = None ,waittime=0,showrot=False,magnifyBlue=0, + freezerot=False,background=(0,0,0),normalizecolor=True, ballradius=10, mixed_color=False, + lam=0.0, save_name='_', lenidx=1024, mixed_gray=False, mask_a=False, mask_b=False, + part_a=False, part_b=False, save_path='./'): + global showsz,mousex,mousey,zoom,changed + xyz=xyz-xyz.mean(axis=0) + radius=((xyz**2).sum(axis=-1)**0.5).max() + xyz/=(radius*2.2)/showsz + # if c_gt is None: + # c0=np.zeros((len(xyz),),dtype='float32')+255 # Green + # c1=np.zeros((len(xyz),),dtype='float32')+255 # Red + # c2=np.zeros((len(xyz),),dtype='float32')+255 # Blue + # else: + # c0=c_gt[:,0] + # c1=c_gt[:,1] + # c2=c_gt[:,2] + ''' + For mask, part, etc visualize from here + ''' + print("lenidx : ",lenidx) + print("len xyz : ",len(xyz)) + print("lam - show point : ",lam) + print("xyz shape : ",xyz.shape) + print("len(xyz)*lam) : ",len(xyz)*lam) + print("np.around(len(xyz)*lam) : ",np.around(len(xyz)*lam)) + print("int(np.around(len(xyz)*lam)) : ",int(np.around(len(xyz)*lam))) + if args.ball_mix: # mix, part_a, part_b from ball + if args.mask_a or args.mask_b: # mask a mask b + if args.mask_a: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + mask_a = lenidx + c0[:mask_a] += 200 + c0[mask_a:] += 200 + c1[:mask_a] += 200 + c1[mask_a:] += 200 + c2[:mask_a] += 0 + c2[mask_a:] += 200 + elif args.mask_b: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + mask_b = lenidx + # c0[:mask_b] += 200 # purple + # c0[mask_b:] += 0 + # c1[:mask_b] += 200 + # c1[mask_b:] += 200 + # c2[:mask_b] += 200 + # c2[mask_b:] += 200 + c0[:mask_b] += 200 # yellow + c0[mask_b:] += 200 + c1[:mask_b] += 200 + c1[mask_b:] += 200 + c2[:mask_b] += 200 + c2[mask_b:] += 0 + else: # mixed + if args.part_a: # part a + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + c0[:] += 255 + # c0[original_point_num:] += 255 + c1[:] += 0 + # c1[original_point_num:] += 255 + c2[:] += 0 + # c2[original_point_num:] += 255 + elif args.part_b: # part + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + # c0[:original_point_num] += 255 + c0[:] += 0 + # c1[:original_point_num] += 255 + c1[:] += 255 + # c2[:original_point_num] += 255 + c2[:] += 0 + else: + if mixed_gray: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + original_point_num = len(xyz)-int(np.around(len(xyz)*lam)) + c0[:original_point_num] += 200 + c0[original_point_num:] += 200 + c1[:original_point_num] += 200 + c1[original_point_num:] += 200 + c2[:original_point_num] += 200 + c2[original_point_num:] += 200 + else: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + original_point_num = len(xyz)-int(np.around(len(xyz)*lam)) + c0[:original_point_num] += 255 + c0[original_point_num:] += 0 + c1[:original_point_num] += 0 + c1[original_point_num:] += 255 + c2[:original_point_num] += 0 + c2[original_point_num:] += 0 + + elif args.ori: # original a + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 # Green + c1=np.zeros((len(xyz),),dtype='float32')+255 # Red + c2=np.zeros((len(xyz),),dtype='float32')+255 # Blue ==> White with 3 + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + + elif args.ori2: # original b + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 # Green + c1=np.zeros((len(xyz),),dtype='float32')+255 # Red + c2=np.zeros((len(xyz),),dtype='float32')+255 # Blue ==> White with 3 + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + + elif args.knn_mix: # mask_a, mask_b from knn, part_a, part_b from knn + if args.mask_a: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + mask_a = lenidx + c0[:mask_a] += 200 + c0[mask_a:] += 255 + c1[:mask_a] += 100 + c1[mask_a:] += 255 + c2[:mask_a] += 200 + c2[mask_a:] += 255 + elif args.mask_b: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + mask_b = lenidx + c0[:mask_b] += 255 + c0[mask_b:] += 150 + c1[:mask_b] += 255 + c1[mask_b:] += 250 + c2[:mask_b] += 255 + c2[mask_b:] += 150 + if args.part_a: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + # mask_a = lenidx + c0[:] += 190 + # c0[mask_a:] += 255 + c1[:] += 0 + # c1[mask_a:] += 255 + c2[:] += 130 + # c2[mask_a:] += 255 + elif args.part_b: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + # mask_b = lenidx + # c0[:mask_b] += 255 + c0[:] += 130 + # c1[:mask_b] += 255 + c1[:] += 190 + # c2[:mask_b] += 255 + c2[:] += 0 + else: + if mixed_gray: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + original_point_num = len(xyz)-int(np.around(len(xyz)*lam)) + c0[:original_point_num] += 200 + c0[original_point_num:] += 200 + c1[:original_point_num] += 200 + c1[original_point_num:] += 200 + c2[:original_point_num] += 200 + c2[original_point_num:] += 200 + else: + c0 = np.zeros((len(xyz),),dtype='float32') + c1=np.zeros((len(xyz),),dtype='float32') + c2=np.zeros((len(xyz),),dtype='float32') + # green and red example + mask_a = lenidx + c0[:mask_a] += 190 + c0[mask_a:] += 130 + c1[:mask_a] += 0 + c1[mask_a:] += 190 + c2[:mask_a] += 130 + c2[mask_a:] += 0 + else: + raise ValueError('Invalid arguments. Please input args to notice what kind of view.') + # ''' + # To here + # ''' + # if mixed_color: + # c0 = np.zeros((len(xyz),),dtype='float32') + # c1=np.zeros((len(xyz),),dtype='float32') + # c2=np.zeros((len(xyz),),dtype='float32') + # # green and red example + # original_point_num = len(xyz)-int(np.around(len(xyz)*lam)) + # c0[:original_point_num] += 255 + # c0[original_point_num:] += 0 + # c1[:original_point_num] += 0 + # c1[original_point_num:] += 255 + # c2[:original_point_num] += 0 + # c2[original_point_num:] += 0 + ###------------------------------------------------------------ + if normalizecolor: + c0/=(c0.max()+1e-14)/255.0 + c1/=(c1.max()+1e-14)/255.0 + c2/=(c2.max()+1e-14)/255.0 + + c0=np.require(c0,'float32','C') + c1=np.require(c1,'float32','C') + c2=np.require(c2,'float32','C') + + show=np.zeros((showsz,showsz,3),dtype='uint8') + def render(): + rotmat=np.eye(3) + if not freezerot: + xangle=(mousey-0.5)*np.pi*1.2 + else: + xangle=0 + rotmat=rotmat.dot(np.array([ + [1.0,0.0,0.0], + [0.0,np.cos(xangle),-np.sin(xangle)], + [0.0,np.sin(xangle),np.cos(xangle)], + ])) + if not freezerot: + yangle=(mousex-0.5)*np.pi*1.2 + else: + yangle=0 + rotmat=rotmat.dot(np.array([ + [np.cos(yangle),0.0,-np.sin(yangle)], + [0.0,1.0,0.0], + [np.sin(yangle),0.0,np.cos(yangle)], + ])) + rotmat*=zoom + nxyz=xyz.dot(rotmat)+[showsz/2,showsz/2,0] + + ixyz=nxyz.astype('int32') + show[:]=background + dll.render_ball( + ct.c_int(show.shape[0]), + ct.c_int(show.shape[1]), + show.ctypes.data_as(ct.c_void_p), + ct.c_int(ixyz.shape[0]), + ixyz.ctypes.data_as(ct.c_void_p), + c0.ctypes.data_as(ct.c_void_p), + c1.ctypes.data_as(ct.c_void_p), + c2.ctypes.data_as(ct.c_void_p), + ct.c_int(ballradius) + ) + + if magnifyBlue>0: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=0)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=0)) + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=1)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=1)) + if showrot: + cv2.putText(show,'xangle %d'%(int(xangle/np.pi*180)),(30,showsz-30),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'yangle %d'%(int(yangle/np.pi*180)),(30,showsz-50),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'zoom %d%%'%(int(zoom*100)),(30,showsz-70),0,0.5,cv2.cv.CV_RGB(255,0,0)) + changed=True + while True: + if changed: + render() + changed=False + cv2.imshow('show3d',show) + if waittime==0: + cmd=cv2.waitKey(10) % 256 + else: + cmd=cv2.waitKey(waittime) % 256 + if cmd==ord('q'): + break + elif cmd==ord('Q'): + sys.exit(0) + + if cmd==ord('t') or cmd == ord('p'): + if cmd == ord('t'): + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + else: + if c_pred is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_pred[:,0] + c1=c_pred[:,1] + c2=c_pred[:,2] + if normalizecolor: + c0/=(c0.max()+1e-14)/255.0 + c1/=(c1.max()+1e-14)/255.0 + c2/=(c2.max()+1e-14)/255.0 + c0=np.require(c0,'float32','C') + c1=np.require(c1,'float32','C') + c2=np.require(c2,'float32','C') + changed = True + + + + if cmd==ord('n'): + zoom*=1.1 + changed=True + elif cmd==ord('m'): + zoom/=1.1 + changed=True + elif cmd==ord('r'): + zoom=1.0 + changed=True + elif cmd==ord('s'): + # img_name = str(datetime.now())+'_'+save_name+'.png' + img_name = os.path.join(save_path,str(datetime.now())+'_'+save_name+'.png') + cv2.imwrite(img_name,show) + # cv2.imwrite('show3d.png',show) + if waittime!=0: + break + return cmd +if __name__=='__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--ball_radius', type=int, default=10, help='Initial learning rate [default: 0.001]') + parser.add_argument('--path', default='./data_mixed', help='mixed data dir [default: ./data_mixed]') + parser.add_argument('--show_rot', action='store_true', help='mix_data_save') + parser.add_argument('--freeze_rot', action='store_true', help='mix_data_save') + parser.add_argument('--not_normalize_color', action='store_false', help='mix_data_save') + parser.add_argument('--background_white', action='store_true', help='mix_data_save') + parser.add_argument('--mixed_color', action='store_true', help='mix_data_save') + parser.add_argument('--ball_mix', action='store_true', help='mix_data_save') + parser.add_argument('--knn_mix', action='store_true', help='mix_data_save') + parser.add_argument('--mask_a', action='store_true', help='mask_view') + parser.add_argument('--mask_b', action='store_true', help='mask_view') + parser.add_argument('--part_a', action='store_true', help='part_view') + parser.add_argument('--part_b', action='store_true', help='part_view') + parser.add_argument('--ori', action='store_true', help='origin') + parser.add_argument('--ori2', action='store_true', help='origin') + parser.add_argument('--gray', action='store_true', help='origin') + parser.add_argument('--save_path', default='./', help='mixed data dir [default: ./data_mixed]') + + +# data_0_loop_1_idx_0_label_5_label_b_8_radius_0.149_mixed_lam_0.0263671875 +# data_0_loop_1_idx_0_label_5_original +# data_0_loop_1_idx_0_label_8_original_2 +# dataknn_0_loop_1_idx_0_label_5_label_b_8_radius_0.149_mixed_lam_0.150390625 +# datamaska_0_loop_1_idx_0_lenidx_997_label_5_radius_0.149_mixed_lam_0.0263671875 +# datamaskaknn_0_loop_1_idx_0_lenidx_870_label_5_radius_0.149_mixed_lam_0.150390625 +# datamaskb_0_loop_1_idx_0_lenidx_989_label_b_8_radius_0.149_mixed_lam_0.0263671875 +# datamaskbknn_0_loop_1_idx_0_lenidx_870_label_b_8_radius_0.149_mixed_lam_0.150390625 + + + args = parser.parse_args() + + np.random.seed(100) + # if len(sys.argv) < 2: + # exit('Enter pointcloud path') + # path = sys.argv[1] + print("path : ",args.path) + if args.ball_mix: # mix, part_a, part_b from ball + if args.mask_a or args.mask_b: + lam = float(os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[-1]) + print("lam : ",lam) + lenidx = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[9] + if args.mask_a: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_a_ball' + elif args.mask_b: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_b_ball' + else: + lenidx = 1024 + lam = float(os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[-1]) + print("lam : ",lam) + filename_label_a = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label_b = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[10] + filename = 'label_a_'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_mix_ball' + if args.part_a: + filename = 'label_a_'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_part_a_ball' + elif args.part_b: + filename = 'label_a_'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_part_b_ball' + + elif args.ori: # original a + lam = 0.0 + lenidx = 1024 + filename_label_a = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename = 'label_a_'+filename_label_a+'_original' + + elif args.ori2: # original b + lam = 0.0 + lenidx = 1024 + filename_label_b = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename = 'label_b_'+filename_label_b+'_original_2' + + elif args.knn_mix: # mask_a, mask_b from knn, part_a, part_b from knn + lam = float(os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[-1]) + print("lam : ",lam) + lenidx = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[9] + if args.mask_a: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_a_knn' + elif args.mask_b: + filename = 'lenidx_'+lenidx+'_label_'+filename_label+'_lam_'+str(lam)+'_mask_b_knn' + if args.part_a: + filename = 'lenidx_'+lenidx+'_label_b_'+filename_label+'_lam_'+str(lam)+'_part_a_knn' + elif args.part_b: + filename = 'lenidx_'+lenidx+'_label_b_'+filename_label+'_lam_'+str(lam)+'_part_b_knn' + else: + filename_label_a = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[7] + filename_label_b = os.path.basename(os.path.splitext(args.path.split('/')[-1])[0]).split('_')[10] + lenidx = int(np.trunc(1024*(1-lam))) + filename = 'label_a'+filename_label_a+'_label_b_'+filename_label_b+'_lam_'+str(lam)+'_lendix_'+str(lenidx)+'_mix_knn' + + else: + raise ValueError('Invalid arguments. Please input args to notice what kind of view.') + + lenidx = int(lenidx) + point_set = np.loadtxt(args.path ,delimiter=',').astype(np.float32) + # random_idx = np.random.randint(point_set.shape[0], size=1024) + print("point set shape : ",point_set.shape) + if args.ball_mix: + part_len_b = int(np.around(len(point_set)*lam)) + part_len_a = len(point_set)-part_len_b + if args.part_a: + point_set = point_set[0:part_len_a,0:3] + elif args.part_b: + point_set = point_set[part_len_a:,0:3] + else: + point_set = point_set[0:1024,0:3] + elif args.knn_mix: + if args.part_a: + point_set = point_set[0:lenidx,0:3] + elif args.part_b: + point_set = point_set[lenidx:,0:3] + else: + point_set = point_set[0:1024,0:3] + else: + point_set = point_set[0:1024,0:3] + + #point_set = point_set[random_idx,0:3] + #pprint(point_set) + #pprint(np.random.randn(2500,3)) + if args.background_white: + c_background = (255, 255, 255) + else: + c_background = (0, 0, 0) + #showpoints(np.random.randn(2500,3)) + showpoints(point_set, showrot=args.show_rot, freezerot=args.freeze_rot,background=c_background, + normalizecolor=args.not_normalize_color,ballradius=args.ball_radius, mixed_color=args.mixed_color, lam=lam, save_name=filename, lenidx=lenidx, mixed_gray=args.gray, + mask_a=args.mask_a, mask_b=args.mask_b, part_a=args.part_a, part_b=args.part_b, save_path=args.save_path) + + diff --git a/zoo/RSMix/pointnet2_rsmix/utils/tf_util.py b/zoo/RSMix/pointnet2_rsmix/utils/tf_util.py new file mode 100644 index 0000000..f2af322 --- /dev/null +++ b/zoo/RSMix/pointnet2_rsmix/utils/tf_util.py @@ -0,0 +1,640 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2017 +""" + +import numpy as np +import tensorflow as tf +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() +# import tensorflow.compat.v2 as tf2 +# import keras +# import tensorflow as tf2 + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device("/cpu:0"): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + + # for tensor >=2.0 + # if use_xavier: + # var = tf.Variable(tf2.initializers.GlorotUniform()(shape=shape)) + # else: + # initializer = tf.truncated_normal_initializer(stddev=stddev) + # var = _variable_on_cpu(name, shape, initializer) + + + # if use_xavier: + # initializer = tf.keras.initializers.glorot_normal + # else: + # initializer = tf.truncated_normal_initializer(stddev=stddev) + # var = _variable_on_cpu(name, shape, initializer) + + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + data_format='NHWC', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + data_format: 'NHWC' or 'NCHW' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + assert(data_format=='NHWC' or data_format=='NCHW') + if data_format == 'NHWC': + num_in_channels = inputs.get_shape()[-1].value + elif data_format=='NCHW': + num_in_channels = inputs.get_shape()[1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding, + data_format=data_format) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases, data_format=data_format) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn', + data_format=data_format) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + data_format='NHWC', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + data_format: 'NHWC' or 'NCHW' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + assert(data_format=='NHWC' or data_format=='NCHW') + if data_format == 'NHWC': + num_in_channels = inputs.get_shape()[-1].value + elif data_format=='NCHW': + num_in_channels = inputs.get_shape()[1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding, + data_format=data_format) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases, data_format=data_format) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', + data_format=data_format) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def batch_norm_template_unused(inputs, is_training, scope, moments_dims, bn_decay): + """ NOTE: this is older version of the util func. it is deprecated. + Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = _variable_on_cpu(name='beta',shape=[num_channels], + initializer=tf.constant_initializer(0)) + gamma = _variable_on_cpu(name='gamma',shape=[num_channels], + initializer=tf.constant_initializer(1.0)) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + # Need to set reuse=False, otherwise if reuse, will see moments_1/mean/ExponentialMovingAverage/ does not exist + # https://github.com/shekkizh/WassersteinGAN.tensorflow/issues/3 + with tf.variable_scope(tf.get_variable_scope(), reuse=False): + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_template(inputs, is_training, scope, moments_dims_unused, bn_decay, data_format='NHWC'): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + + bn_decay = bn_decay if bn_decay is not None else 0.9 + return tf.contrib.layers.batch_norm(inputs, + center=True, scale=True, + is_training=is_training, decay=bn_decay,updates_collections=None, + scope=scope, + data_format=data_format) + # return tf2.keras.layers.BatchNormalization(momentum=bn_decay, + # center=True, scale=True)(inputs, training=is_training) + # return keras.layers.BatchNormalization(momentum=bn_decay, + # center=True, scale=True)(inputs, training=is_training) + # return tf.layers.batch_normalization(inputs, center=True, scale=True, training=is_training, momentum=bn_decay) + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope, data_format): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1], bn_decay, data_format) + + + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope, data_format): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2], bn_decay, data_format) + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs diff --git a/zoo/RSMix/rsmix_pipeline.png b/zoo/RSMix/rsmix_pipeline.png new file mode 100644 index 0000000..55843db Binary files /dev/null and b/zoo/RSMix/rsmix_pipeline.png differ diff --git a/zoo/SimpleView/.gitignore b/zoo/SimpleView/.gitignore new file mode 100644 index 0000000..63c2c3f --- /dev/null +++ b/zoo/SimpleView/.gitignore @@ -0,0 +1,3 @@ +*__pycache__/ +data/modelnet40_ply_hdf5_2048 +runs/ diff --git a/zoo/SimpleView/LICENSE b/zoo/SimpleView/LICENSE new file mode 100644 index 0000000..7b8b3e0 --- /dev/null +++ b/zoo/SimpleView/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021, Princeton University +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zoo/SimpleView/README.md b/zoo/SimpleView/README.md new file mode 100644 index 0000000..cfa7dd1 --- /dev/null +++ b/zoo/SimpleView/README.md @@ -0,0 +1,124 @@ +[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/revisiting-point-cloud-classification-with-a/3d-point-cloud-classification-on-scanobjectnn)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-scanobjectnn?p=revisiting-point-cloud-classification-with-a)[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/revisiting-point-cloud-classification-with-a/3d-point-cloud-classification-on-modelnet40)](https://paperswithcode.com/sota/3d-point-cloud-classification-on-modelnet40?p=revisiting-point-cloud-classification-with-a) + + + +[**Revisiting Point Cloud Shape Classification with a Simple and Effective Baseline**](https://arxiv.org/pdf/2106.05304v1.pdf)
+[Ankit Goyal](http://imankgoyal.github.io), [Hei Law](https://heilaw.github.io/), Bowei Liu, [Alejandro Newell](https://www.alejandronewell.com/), [Jia Deng](https://www.cs.princeton.edu/~jiadeng/)
+***International Conference on Machine Learning (ICML), 2021*** + + +If you find our work useful in your research, please consider citing: +``` +@article{goyal2021revisiting, + title={Revisiting Point Cloud Shape Classification with a Simple and Effective Baseline}, + author={Goyal, Ankit and Law, Hei and Liu, Bowei and Newell, Alejandro and Deng, Jia}, + journal={International Conference on Machine Learning}, + year={2021} +} +``` + +## Getting Started + +First clone the repository. We would refer to the directory containing the code as `SimpleView`. + +``` +git clone git@github.com:princeton-vl/SimpleView.git +``` + +#### Requirements +The code is tested on Linux OS with Python version **3.7.5**, CUDA version **10.0**, CuDNN version **7.6** and GCC version **5.4**. We recommend using these versions especially for installing [pointnet++ custom CUDA modules](https://github.com/erikwijmans/Pointnet2_PyTorch/tree/22e8cf527b696b63b66f3873d80ae5f93744bdef). + +#### Install Libraries +We recommend you first install [Anaconda](https://anaconda.org/) and create a virtual environment. +``` +conda create --name simpleview python=3.7.5 +``` + +Activate the virtual environment and install the libraries. Make sure you are in `SimpleView`. +``` +conda activate simpleview +pip install -r requirements.txt +conda install sed # for downloading data and pretrained models +``` + +For PointNet++, we need to install custom CUDA modules. Make sure you have access to a GPU during this step. You might need to set the appropriate `TORCH_CUDA_ARCH_LIST` environment variable depending on your GPU model. The following command should work for most cases `export TORCH_CUDA_ARCH_LIST="6.0;6.1;6.2;7.0;7.5"`. However, if the install fails, check if `TORCH_CUDA_ARCH_LIST` is correctly set. More details could be found [here](https://en.wikipedia.org/wiki/CUDA#GPUs_supported). +``` +cd pointnet2_pyt && pip install -e . && cd .. +``` + +#### Download Datasets and Pre-trained Models +Make sure you are in `SimpleView`. `download.sh` script can be used for downloading all the data and the pretrained models. It also places them at the correct locations. First, use the following command to provide execute permission to the `download.sh` script. +``` +chmod +x download.sh +``` + +To download ModelNet40 execute the following command. This will download the ModelNet40 point cloud dataset released with pointnet++ as well as the validation splits used in our work. +``` +./download.sh modelnet40 +``` + +To download the pretrained models, execute the following command. +``` +./download.sh pretrained +``` + +## Code Organization +- `SimpleView/models`: Code for various models in PyTorch. +- `SimpleView/configs`: Configuration files for various models. +- `SimpleView/main.py`: Training and testing any models. +- `SimpleView/configs.py`: Hyperparameters for different models and dataloader. +- `SimpleView/dataloader.py`: Code for different variants of the dataloader. +- `SimpleView/*_utils.py`: Code for various utility functions. + +## ScanObjectNN +The code for our experiments on `ScanObjectNN` can be found in `ScanObjectNN/SimpleView` of this repo. Please refer to `README.md` in `ScanObjectNN/SimpleView` for more details. + +## Running Experiments + +#### Training and Config files +To train or test any model, we use the `main.py` script. The format for running this script is as follows. +``` +python main.py --exp-config +``` + +The config files are named as `_<_extra>_run_.yaml` (` ∈ [dgcnn, pointnet2, rscnn]`; ` ∈ [dgcnn, pointnet2, rscnn, pointnet, simpleview]`; `<_extra> ∈ ['',valid,0.5,0.25]` ). For example, the config file to run an experiment for PointNet++ in DGCNN protocol with seed 1 `dgcnn_pointnet2_run_1.yaml`. To run a new experiment with a different seed, you need to change the `SEED` parameter in the config file. For all our experiments (including on the validation set) we do 4 runs with different seeds. + +As discussed in the paper for the PointNet++ and SimpleView protocols, we need to first run an experiment to tune the number of epochs on the validation set. This could be done by first running the experiment `__valid_run_.yaml` and then running the experiment `__run_.yaml`. Based on the number of epochs achieving the best performance on the validation set, one could use the model trained on the complete training set to get the final test performance. + +To train models on the partial training set (Table 7), use the configs named as `dgcnn__valid_<0.25/0.5>_run_.yaml` and `__<0.25/0.5>_run_.yaml`. + +***Even with the same SEED the results could vary slightly because of the randomization introduced for faster cuDNN operations. More details could be found [here](https://pytorch.org/docs/stable/notes/randomness.html)*** + +##### SimpleView Protocol +To run an experiment in the SimpleView protocol, there are two stages. +- First tune the number of epochs on the validation set. This is done using configs `dgcnn__valid_run_.yaml`. Find the best number of epochs on the validation set, evaluated at every 25th epoch. +- Train the model on the complete training set using configs `dgcnn__run_.yaml`. Use the performance on the test set at the fine-tuned number of epochs as the final performance. + + +#### Evaluate a pretrained model +We provide pretrained models. They can be downloaded using the `./download pretrained` command and are stored in the `SimpleView/pretrained` folder. To test a pretrained model, the command is of the following format. + +``` +python main.py --entry --model-path pretrained//.pth --exp-config configs/.yaml +``` + +We list the evaluation commands in the `eval_models.sh` script. For example to evaluate models on the SimpleView protocol, use the commands [here](eval_models.sh#L2-L6). Note that for the SimpleView and the Pointnet2 protocols, the model path has names in the format `model_.pth`. Here `epoch_id` represents the number of epochs tuned on the validation set. + + +#### Performance of the released pretrained models on ModelNet40 + +| Protocol → | DGCNN - Smooth | DCGNN - CE. | RSCNN - No Vote | PointNet - No Vote | SimpleView | +|-------- |:--------------:|:--------------:|:---------------:|:------------------:|:--------------:| +| Method↓ |(Tab. 2, Col. 7)|(Tab. 2, Col. 6)| (Tab. 2, Col. 5)| (Tab. 2, Col. 2) | (Tab. 4, Col. 2)| +|SimpleView|93.9|93.2|92.7|90.8|93.3| +|PointNet++|93.0|92.8|92.6|89.7|92.6| +|DGCNN|92.6|91.8|92.2|89.5|92.0| +|RSCNN|92.3|92.0|92.2|89.4|91.6| +|PointNet|90.7|90.0|89.7| 88.8|90.1| + +## Acknowlegements +We would like to thank the authors of the following reposities for sharing their code. +- PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation: [1](https://github.com/charlesq34/pointnet), [2](https://github.com/fxia22/pointnet.pytorch) +- PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space: [1](https://github.com/charlesq34/pointnet2), [2](https://github.com/erikwijmans/Pointnet2_PyTorch) +- Relation-Shape Convolutional Neural Network for Point Cloud Analysis: [1](https://github.com/Yochengliu/Relation-Shape-CNN) +- Dynamic Graph CNN for Learning on Point Clouds: [1](https://github.com/WangYueFt/dgcnn) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/draw_cmat.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/draw_cmat.py new file mode 100644 index 0000000..93fec35 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/draw_cmat.py @@ -0,0 +1,259 @@ +import os +import sys +import numpy as np + +import importlib +import argparse +import tensorflow as tf +import socket +import pickle +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import tf_util +import provider +import utils +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +NUM_CLASSES = 15 + +augment_rotation, augment_scale, augment_translation, augment_jitter, augment_outlier = (False, True, True, True, False) + +parser = argparse.ArgumentParser() +#Parameters for learning +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='3dmfv_net_cls', help='Model name [default: 3dmfv_net_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='confusion_matrix/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = False, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +# Parameters for GMM +parser.add_argument('--gmm_type', default='grid', help='type of gmm [grid/learn], learn uses expectation maximization algorithm (EM) [default: grid]') +parser.add_argument('--num_gaussians', type=int , default=5, help='number of gaussians for gmm, if grid specify subdivisions, if learned specify actual number[default: 5, for grid it means 125 gaussians]') +parser.add_argument('--gmm_variance', type=float, default=0.04, help='variance for grid gmm, relevant only for grid type') +FLAGS = parser.parse_args() + + +N_GAUSSIANS = FLAGS.num_gaussians +GMM_TYPE = FLAGS.gmm_type +GMM_VARIANCE = FLAGS.gmm_variance + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def evaluate(gmm, num_votes=1): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + points_pl, labels_pl, w_pl, mu_pl, sigma_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, gmm ) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Get model and loss + pred, fv = MODEL.get_model(points_pl, w_pl, mu_pl, sigma_pl, is_training_pl, num_classes=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': points_pl, + 'labels_pl': labels_pl, + 'w_pl': w_pl, + 'mu_pl': mu_pl, + 'sigma_pl': sigma_pl, + 'is_training_pl': is_training_pl, + 'fv': fv, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, gmm, num_votes) + + +def eval_one_epoch(sess, ops, gmm, num_votes): + """ ops: dict mapping from string to tf ops """ + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['w_pl']: gmm.weights_, + ops['mu_pl']: gmm.means_, + ops['sigma_pl']: np.sqrt(gmm.covariances_), + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + current_pred.append(pred_val[i-start_idx]) + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + #Plot confusion matrix + current_pred = np.array(current_pred) + groundtruth = current_label.flatten() + predictions = current_pred.flatten() + + mat = confusion_matrix(groundtruth, predictions) + + plt.style.use('seaborn-paper') + plt.rcParams["figure.figsize"] = (10,10) + ax = plt.subplot(111) + cmap = plt.cm.Reds + mat = mat.astype('float') / mat.sum(axis=1)[:, np.newaxis] + mat = np.nan_to_num(mat, copy=True) + + plt.imshow(mat, interpolation='nearest', cmap=cmap) + # cbar = plt.colorbar(fraction=0.03, pad=0.05, aspect=30) + # cbar.ax.tick_params(labelsize=10) + tick_marks = np.arange(len(SHAPE_NAMES)) + plt.xticks(tick_marks, SHAPE_NAMES, rotation=90) + plt.yticks(tick_marks, SHAPE_NAMES) + + plt.ylabel('Ground truth') + plt.xlabel('Prediction') + + for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] + + ax.get_xticklabels() + ax.get_yticklabels()): + item.set_fontsize(36) + + plt.tight_layout() + plt.savefig(os.path.join(DUMP_DIR,'matrix.pdf')) + plt.show() + + +if __name__ == "__main__": + + gmm = utils.get_3d_grid_gmm(subdivisions=[N_GAUSSIANS, N_GAUSSIANS, N_GAUSSIANS], variance=GMM_VARIANCE) + LOG_DIR = MODEL_PATH[:MODEL_PATH.rfind('/')] + gmm = pickle.load(open(os.path.join(LOG_DIR,'gmm.p'), "rb")) + evaluate(gmm, num_votes=1) + #export_visualizations(gmm, LOG_DIR,n_model_limit=None) + + LOG_FOUT.close() + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_real_trained_on_synthetic.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_real_trained_on_synthetic.py new file mode 100644 index 0000000..125ed99 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_real_trained_on_synthetic.py @@ -0,0 +1,272 @@ +import os +import sys +import numpy as np + +import importlib +import argparse +import tensorflow as tf +import socket +import pickle +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import tf_util +import provider +import utils +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +augment_rotation, augment_scale, augment_translation, augment_jitter, augment_outlier = (False, True, True, True, False) + +parser = argparse.ArgumentParser() +#Parameters for learning +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='3dmfv_net_cls', help='Model name [default: 3dmfv_net_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_real_trained_on_synthetic/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 40, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +# Parameters for GMM +parser.add_argument('--gmm_type', default='grid', help='type of gmm [grid/learn], learn uses expectation maximization algorithm (EM) [default: grid]') +parser.add_argument('--num_gaussians', type=int , default=5, help='number of gaussians for gmm, if grid specify subdivisions, if learned specify actual number[default: 5, for grid it means 125 gaussians]') +parser.add_argument('--gmm_variance', type=float, default=0.04, help='variance for grid gmm, relevant only for grid type') +FLAGS = parser.parse_args() + + +N_GAUSSIANS = FLAGS.num_gaussians +GMM_TYPE = FLAGS.gmm_type +GMM_VARIANCE = FLAGS.gmm_variance + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def evaluate(gmm, num_votes=1): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + points_pl, labels_pl, w_pl, mu_pl, sigma_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, gmm ) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Get model and loss + pred, fv = MODEL.get_model(points_pl, w_pl, mu_pl, sigma_pl, is_training_pl, num_classes=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': points_pl, + 'labels_pl': labels_pl, + 'w_pl': w_pl, + 'mu_pl': mu_pl, + 'sigma_pl': sigma_pl, + 'is_training_pl': is_training_pl, + 'fv': fv, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, gmm, num_votes) + + +def eval_one_epoch(sess, ops, gmm, num_votes): + """ ops: dict mapping from string to tf ops """ + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(15)] + total_correct_class = [0 for _ in range(15)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in OBJECTDATASET_TO_MODELNET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 40)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 40)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['w_pl']: gmm.weights_, + ops['mu_pl']: gmm.means_, + ops['sigma_pl']: np.sqrt(gmm.covariances_), + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen +=1 + if (pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET.keys()): + continue + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + # if (pred_val[i-start_idx] == current_label[i]): + if (pred == current_label[i]): + total_correct +=1 + + for i in range(start_idx, end_idx): + + l = current_label[i] + total_seen_class[l] += 1 + + if pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET: + pred_label = "NA" + else: + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + total_correct_class[l] += (pred == l) + + pred_label = SHAPE_NAMES[pred] + + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[l] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + + +if __name__ == "__main__": + + gmm = utils.get_3d_grid_gmm(subdivisions=[N_GAUSSIANS, N_GAUSSIANS, N_GAUSSIANS], variance=GMM_VARIANCE) + LOG_DIR = MODEL_PATH[:MODEL_PATH.rfind('/')] + gmm = pickle.load(open(os.path.join(LOG_DIR,'gmm.p'), "rb")) + evaluate(gmm, num_votes=1) + #export_visualizations(gmm, LOG_DIR,n_model_limit=None) + + LOG_FOUT.close() + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_scenennobjects.py new file mode 100644 index 0000000..71e408d --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_scenennobjects.py @@ -0,0 +1,236 @@ +import os +import sys +import numpy as np + +import importlib +import argparse +import tensorflow as tf +import socket +import pickle +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import tf_util +import provider +import utils +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +augment_rotation, augment_scale, augment_translation, augment_jitter, augment_outlier = (False, True, True, True, False) + +parser = argparse.ArgumentParser() +#Parameters for learning +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='3dmfv_net_cls', help='Model name [default: 3dmfv_net_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') + +# Parameters for GMM +parser.add_argument('--gmm_type', default='grid', help='type of gmm [grid/learn], learn uses expectation maximization algorithm (EM) [default: grid]') +parser.add_argument('--num_gaussians', type=int , default=5, help='number of gaussians for gmm, if grid specify subdivisions, if learned specify actual number[default: 5, for grid it means 125 gaussians]') +parser.add_argument('--gmm_variance', type=float, default=0.04, help='variance for grid gmm, relevant only for grid type') +FLAGS = parser.parse_args() + + +N_GAUSSIANS = FLAGS.num_gaussians +GMM_TYPE = FLAGS.gmm_type +GMM_VARIANCE = FLAGS.gmm_variance + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = FLAGS.num_class +if (NUM_CLASSES==11): + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_combined.txt')] +else: + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] +print("Number of Classes: "+str(NUM_CLASSES)) + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def evaluate(gmm, num_votes=1): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + points_pl, labels_pl, w_pl, mu_pl, sigma_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, gmm ) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Get model and loss + pred, fv = MODEL.get_model(points_pl, w_pl, mu_pl, sigma_pl, is_training_pl, num_classes=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': points_pl, + 'labels_pl': labels_pl, + 'w_pl': w_pl, + 'mu_pl': mu_pl, + 'sigma_pl': sigma_pl, + 'is_training_pl': is_training_pl, + 'fv': fv, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, gmm, num_votes) + + +def eval_one_epoch(sess, ops, gmm, num_votes): + """ ops: dict mapping from string to tf ops """ + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['w_pl']: gmm.weights_, + ops['mu_pl']: gmm.means_, + ops['sigma_pl']: np.sqrt(gmm.covariances_), + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__ == "__main__": + + gmm = utils.get_3d_grid_gmm(subdivisions=[N_GAUSSIANS, N_GAUSSIANS, N_GAUSSIANS], variance=GMM_VARIANCE) + LOG_DIR = MODEL_PATH[:MODEL_PATH.rfind('/')] + gmm = pickle.load(open(os.path.join(LOG_DIR,'gmm.p'), "rb")) + evaluate(gmm, num_votes=1) + #export_visualizations(gmm, LOG_DIR,n_model_limit=None) + + LOG_FOUT.close() + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_synthetic_trained_on_real.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_synthetic_trained_on_real.py new file mode 100644 index 0000000..b97aae9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/evaluate_synthetic_trained_on_real.py @@ -0,0 +1,264 @@ +import os +import sys +import numpy as np + +import importlib +import argparse +import tensorflow as tf +import socket +import pickle +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import tf_util +import provider +import utils +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +NUM_CLASSES = 15 + +augment_rotation, augment_scale, augment_translation, augment_jitter, augment_outlier = (False, True, True, True, False) + +parser = argparse.ArgumentParser() +#Parameters for learning +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='3dmfv_net_cls', help='Model name [default: 3dmfv_net_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_synthetic_trained_on_real/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'modelnet/modelnet_test.h5', help='Location of test file') + +# Parameters for GMM +parser.add_argument('--gmm_type', default='grid', help='type of gmm [grid/learn], learn uses expectation maximization algorithm (EM) [default: grid]') +parser.add_argument('--num_gaussians', type=int , default=5, help='number of gaussians for gmm, if grid specify subdivisions, if learned specify actual number[default: 5, for grid it means 125 gaussians]') +parser.add_argument('--gmm_variance', type=float, default=0.04, help='variance for grid gmm, relevant only for grid type') +FLAGS = parser.parse_args() + + +N_GAUSSIANS = FLAGS.num_gaussians +GMM_TYPE = FLAGS.gmm_type +GMM_VARIANCE = FLAGS.gmm_variance + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def evaluate(gmm, num_votes=1): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + points_pl, labels_pl, w_pl, mu_pl, sigma_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, gmm ) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Get model and loss + pred, fv = MODEL.get_model(points_pl, w_pl, mu_pl, sigma_pl, is_training_pl, num_classes=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': points_pl, + 'labels_pl': labels_pl, + 'w_pl': w_pl, + 'mu_pl': mu_pl, + 'sigma_pl': sigma_pl, + 'is_training_pl': is_training_pl, + 'fv': fv, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, gmm, num_votes) + + +def eval_one_epoch(sess, ops, gmm, num_votes): + """ ops: dict mapping from string to tf ops """ + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in MODELNET_TO_OBJECTDATASET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['w_pl']: gmm.weights_, + ops['mu_pl']: gmm.means_, + ops['sigma_pl']: np.sqrt(gmm.covariances_), + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen += 1 + if (pred_val[i-start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (current_label[i] in possible_label): + total_correct +=1 + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + if (pred_val[i-start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (l in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + + pred_label = SHAPE_NAMES[pred_val[i-start_idx]] + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + +if __name__ == "__main__": + + gmm = utils.get_3d_grid_gmm(subdivisions=[N_GAUSSIANS, N_GAUSSIANS, N_GAUSSIANS], variance=GMM_VARIANCE) + LOG_DIR = MODEL_PATH[:MODEL_PATH.rfind('/')] + gmm = pickle.load(open(os.path.join(LOG_DIR,'gmm.p'), "rb")) + evaluate(gmm, num_votes=1) + #export_visualizations(gmm, LOG_DIR,n_model_limit=None) + + LOG_FOUT.close() + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/models/3dmfv_net_cls.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/models/3dmfv_net_cls.py new file mode 100644 index 0000000..55ab264 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/models/3dmfv_net_cls.py @@ -0,0 +1,121 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + + +def placeholder_inputs(batch_size, n_points, gmm): + + #Placeholders for the data + n_gaussians = gmm.means_.shape[0] + D = gmm.means_.shape[1] + + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + + w_pl = tf.placeholder(tf.float32, shape=(n_gaussians)) + mu_pl = tf.placeholder(tf.float32, shape=(n_gaussians, D)) + sigma_pl = tf.placeholder(tf.float32, shape=(n_gaussians, D)) # diagonal + points_pl = tf.placeholder(tf.float32, shape=(batch_size, n_points, D)) + + return points_pl, labels_pl, w_pl, mu_pl, sigma_pl + + +def get_model(points, w, mu, sigma, is_training, bn_decay=None, weigth_decay=0.005, add_noise=False, num_classes=40): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = points.get_shape()[0].value + n_points = points.get_shape()[1].value + n_gaussians = w.shape[0].value + res = int(np.round(np.power(n_gaussians,1.0/3.0))) + + + fv = tf_util.get_3dmfv(points, w, mu, sigma, flatten=False) + + if add_noise: + noise = tf.cond(is_training, + lambda: tf.random_normal(shape=tf.shape(fv), mean=0.0, stddev=0.01, dtype=tf.float32), + lambda: tf.zeros(shape=tf.shape(fv))) + #noise = tf.random_normal(shape=tf.shape(fv), mean=0.0, stddev=0.01, dtype=tf.float32) + fv = fv + noise + + + grid_fisher = tf.reshape(fv,[batch_size,-1,res,res,res]) + grid_fisher = tf.transpose(grid_fisher, [0, 2, 3, 4, 1]) + + + # Inception + layer = 1 + net = inception_module(grid_fisher, n_filters=64,kernel_sizes=[3,5], is_training=is_training, bn_decay=bn_decay, scope='inception'+str(layer)) + layer = layer + 1 + net = inception_module(net, n_filters=128,kernel_sizes=[3, 5], is_training=is_training, bn_decay=bn_decay, scope='inception'+str(layer)) + layer = layer + 1 + net = inception_module(net, n_filters=256,kernel_sizes=[3, 5], is_training=is_training, bn_decay=bn_decay, scope='inception'+str(layer)) + layer = layer + 1 + net = tf_util.max_pool3d(net, [2, 2, 2], scope='maxpool'+str(layer), stride=[2, 2, 2], padding='SAME') + layer = layer + 1 + net = inception_module(net, n_filters=256,kernel_sizes=[3,5], is_training=is_training, bn_decay=bn_decay, scope='inception'+str(layer)) + layer = layer + 1 + net = inception_module(net, n_filters=512,kernel_sizes=[3,5], is_training=is_training, bn_decay=bn_decay, scope='inception'+str(layer)) + layer = layer + 1 + net = tf_util.max_pool3d(net, [2, 2, 2], scope='maxpool'+str(layer), stride=[2, 2, 2], padding='SAME') + + net = tf.reshape(net,[batch_size, -1]) + + #Classifier + net = tf_util.fully_connected(net, 1024, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay, weigth_decay=weigth_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay, weigth_decay=weigth_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp2') + net = tf_util.fully_connected(net, 128, bn=True, is_training=is_training, + scope='fc3', bn_decay=bn_decay, weigth_decay=weigth_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp3') + net = tf_util.fully_connected(net, num_classes, activation_fn=None, scope='fc4', is_training=is_training, weigth_decay=weigth_decay) + + return net, fv + +def inception_module(input, n_filters=64, kernel_sizes=[3,5], is_training=None, bn_decay=None, scope='inception'): + one_by_one = tf_util.conv3d(input, n_filters, [1,1,1], scope= scope + '_conv1', + stride=[1, 1, 1], padding='SAME', bn=True, + bn_decay=bn_decay, is_training=is_training) + three_by_three = tf_util.conv3d(one_by_one, int(n_filters/2), [kernel_sizes[0], kernel_sizes[0], kernel_sizes[0]], scope= scope + '_conv2', + stride=[1, 1, 1], padding='SAME', bn=True, + bn_decay=bn_decay, is_training=is_training) + five_by_five = tf_util.conv3d(one_by_one, int(n_filters/2), [kernel_sizes[1], kernel_sizes[1], kernel_sizes[1]], scope=scope + '_conv3', + stride=[1, 1, 1], padding='SAME', bn=True, + bn_decay=bn_decay, is_training=is_training) + average_pooling = tf_util.avg_pool3d(input, [kernel_sizes[0], kernel_sizes[0], kernel_sizes[0]], scope=scope+'_avg_pool', stride=[1, 1, 1], padding='SAME') + average_pooling = tf_util.conv3d(average_pooling, n_filters, [1,1,1], scope= scope + '_conv4', + stride=[1, 1, 1], padding='SAME', bn=True, + bn_decay=bn_decay, is_training=is_training) + + output = tf.concat([ one_by_one, three_by_three, five_by_five, average_pooling], axis=4) + return output + + + +def get_loss(pred, label): + """ pred: B*NUM_CLASSES, + label: B, """ + + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + + return classify_loss + +if __name__ == '__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32, 1024, 3)) + outputs = get_model(inputs, tf.constant(True)) + print (outputs) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/provider.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/provider.py new file mode 100644 index 0000000..96566a1 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/provider.py @@ -0,0 +1,321 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +import tensorflow as tf +from sklearn.neighbors import KDTree +import random + +# Download dataset for point cloud classification +# DATA_DIR = os.path.join(BASE_DIR, 'data') +# if not os.path.exists(DATA_DIR): +# os.mkdir(DATA_DIR) +# if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): +# www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' +# zipfile = os.path.basename(www) +# os.system('wget %s; unzip %s' % (www, zipfile)) +# os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) +# os.system('rm %s' % (zipfile)) + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def translate_point_cloud(batch_data, tval = 0.2): + """ Randomly translate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, translated batch of point clouds + """ + n_batches = batch_data.shape[0] + n_points = batch_data.shape[1] + translation = np.random.uniform(-tval, tval, size=[n_batches,3]) + translation = np.tile(np.expand_dims(translation,1),[1,n_points,1]) + batch_data = batch_data + translation + # for k in xrange(n_batches): + # batch_data[k, ...] = batch_data[k, ...] + translation[k] + return batch_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 128 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_x_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along x direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 128 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[1, 0, 0], + [0, cosval, -sinval], + [0, sinval, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def scale_point_cloud(batch_data, smin = 0.66, smax = 1.5): + """ Randomly scale the point clouds to augument the dataset + scale is per shape + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + scaled = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + sx = np.random.uniform(smin, smax) + sy = np.random.uniform(smin, smax) + sz = np.random.uniform(smin, smax) + scale_matrix = np.array([[sx, 0, 0], + [0, sy, 0], + [0, 0, sz]]) + shape_pc = batch_data[k, ...] + scaled[k, ...] = np.dot(shape_pc.reshape((-1, 3)), scale_matrix) + return scaled + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def insert_outliers_to_point_cloud(batch_data, outlier_ratio=0.05): + """ inserts log_noise Randomly distributed in the unit sphere + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, batch of point clouds with log_noise + """ + B, N, C = batch_data.shape + outliers = np.random.uniform(-1, 1, [B, int(np.floor(outlier_ratio * N)), C]) + points_idx = np.random.choice(range(0, N), int(np.ceil(N * (1 - outlier_ratio)))) + outlier_data = np.concatenate([batch_data[:, points_idx, :], outliers], axis=1) + return outlier_data + + +def occlude_point_cloud(batch_data, occlusion_ratio): + """ Randomly k remove points (number of points defined by the ratio. + Input: + BxNx3 array, original batch of point clouds + Return: + Bx(N-k)x3 array, occluded batch of point clouds + """ + B, N, C = batch_data.shape + k = int(np.round(N*occlusion_ratio)) + occluded_batch_point_cloud = [] + for i in range(B): + point_cloud = batch_data[i, :, :] + kdt = KDTree(point_cloud, leaf_size=30, metric='euclidean') + center_of_occlusion = random.choice(point_cloud) + #occluded_points_idx = kdt.query_radius(center_of_occlusion.reshape(1, -1), r=occlusion_radius) + _, occluded_points_idx = kdt.query(center_of_occlusion.reshape(1, -1), k=k) + point_cloud = np.delete(point_cloud, occluded_points_idx, axis=0) + occluded_batch_point_cloud.append(point_cloud) + return np.array(occluded_batch_point_cloud) + + + +def starve_gaussians(batch_data, gmm, starv_coef=0.6, n_points=1024): + """ sample points from a point cloud with specific sparse regions (defined by the gmm gaussians) + Input: + batch_data: BxNx3 array, original batch of point clouds + gmm: gausian mixture model + Return: + BxNx3 array, jittered batch of point clouds + """ + + B, N, D = batch_data.shape + n_gaussians = len(gmm.weights_) + choices = [1, starv_coef] + mu = gmm.means_ + #find a gaussian for each point + mu = np.tile(np.expand_dims(np.expand_dims(mu,0),0),[B,N,1,1]) #B X N X n_gaussians X D + batch_data_per_gaussian = np.tile(np.expand_dims(batch_data,-2),[1, 1, n_gaussians, 1] ) + d = np.sum(np.power(batch_data_per_gaussian-mu,2), -1) + idx = np.argmin(d, axis=2) + + #compute servival probability + rx = np.random.rand(B, N) + sk = np.random.choice(choices, n_gaussians) + p = sk[idx] * rx + starved_points = [] + for i in range(B): + topmostidx = np.argsort(p[i,:])[::-1][:n_points] + starved_points.append(batch_data[i,topmostidx,:]) + return np.asarray(starved_points) + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename, compensate=False, unify=False): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + + if compensate == True: + # compensate for problematic cases + increase_classes = [33, 24, 15] #table, night_stand, plant + percentage = 3 + idxs = np.squeeze(np.where(np.squeeze(label) == increase_classes)) + n_models = len(idxs) + if n_models >0: + n_models_to_add = np.maximum(int(np.round(n_models * (1 + percentage))) - n_models, 1) + idxs = np.random.choice(idxs, n_models_to_add) + data = np.concatenate([data, data[idxs,:]]) + label = np.concatenate([label, label[idxs]]) + if unify: + problem_classes = [33, 23, 15] # table, night_stand, plant + alternative_classes = [12, 14, 26] #desk, dresser, flower_pot + label = replace_labels(np.squeeze(label), problem_classes, alternative_classes) + label = np.expand_dims(label,-1) + return (data, label) + +def replace_labels(numbers, problem_numbers, alternative_numbers): + # Replace values + problem_numbers = np.asarray(problem_numbers) + alternative_numbers = np.asarray(alternative_numbers) + n_min, n_max = numbers.min(), numbers.max() + replacer = np.arange(n_min, n_max + 1) + mask = problem_numbers <= n_max # Discard replacements out of range + replacer[problem_numbers[mask] - n_min] = alternative_numbers[mask] + numbers = replacer[numbers - n_min] + return numbers + + +def loadDataFile(filename, compensate=False, unify=False): + return load_h5(filename, compensate, unify) + +def load_single_model(model_idx = 0,test_train = 'train', file_idxs=0, num_points = 1024): + + if test_train == 'train': + FILES = getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt')) + else: + FILES = getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt')) + all_models_points, all_models_labels = loadDataFile(FILES[file_idxs]) + points = all_models_points[model_idx, 0:num_points,:] + labels = all_models_labels[model_idx] + return np.squeeze(points), labels + +def load_single_model_class(clas = 'table',ind=0,test_train = 'train', file_idxs=0, num_points = 1024, n_classes=40): + + shape_names = getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet' + str(n_classes) + '_ply_hdf5_2048/shape_names.txt')) + shape_dict = {shape_names[i]: i for i in range(len(shape_names))} + + if test_train == 'train': + FILES = getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt')) + else: + FILES = getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt')) + all_models_points, all_models_labels = loadDataFile(FILES[file_idxs]) + if isinstance(clas,basestring): + idxs = np.squeeze(np.where(np.squeeze(all_models_labels) == shape_dict[clas])) + else: + idxs = np.squeeze(np.where(np.squeeze(all_models_labels) == clas)) + + if not idxs.size: + raise ValueError("No such class in this file") + else: + idx = idxs[ind] + + points = all_models_points[idx, 0:num_points,:] + return np.squeeze(points) + +def load_dataset(num_points = 1024): + + files = ['train', 'test'] + + for test_train in files: + FILES = getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/' + test_train + '_files.txt')) + + for fn in range(len(FILES)): + all_models_points, labels = loadDataFile(FILES[fn]) + + if test_train == 'train': + train_points = all_models_points[:, 0:num_points,:] if fn==0 else np.concatenate([train_points, all_models_points[:, 0:num_points,:]]) + train_labels = labels if fn == 0 else np.concatenate([train_labels, labels]) + else: + test_points = all_models_points[:, 0:num_points, :] if fn == 0 else np.concatenate( + [test_points, all_models_points[:, 0:num_points, :]]) + test_labels = labels if fn == 0 else np.concatenate([test_labels, labels]) + + return train_points, np.squeeze(train_labels), test_points, np.squeeze(test_labels) + +def loadDataFile_with_seg(filename): + return load_h5_data_label_seg(filename) + +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/train.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/train.py new file mode 100644 index 0000000..bd2577a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/train.py @@ -0,0 +1,441 @@ +import os +import sys +import numpy as np + +import matplotlib +matplotlib.use('pdf') +# import matplotlib.pyplot as plt +import importlib +import argparse +import tensorflow as tf +import pickle +import socket + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import tf_util +# import visualization +import provider +import utils +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +augment_rotation, augment_scale, augment_translation, augment_jitter, augment_outlier = (False, True, True, True, False) + +parser = argparse.ArgumentParser() +#Parameters for learning +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='3dmfv_net_cls', help='Model name [default: 3dmfv_net_cls]') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=200, help='Epoch to run [default: 200]') +parser.add_argument('--batch_size', type=int, default=64, help='Batch Size during training [default: 64]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--weight_decay', type=float, default=0.0, help='weight decay coef [default: 0.0]') + +# Parameters for GMM +parser.add_argument('--gmm_type', default='grid', help='type of gmm [grid/learn], learn uses expectation maximization algorithm (EM) [default: grid]') +parser.add_argument('--num_gaussians', type=int , default=5, help='number of gaussians for gmm, if grid specify subdivisions, if learned specify actual number[default: 5, for grid it means 125 gaussians]') +parser.add_argument('--gmm_variance', type=float, default=0.04, help='variance for grid gmm, relevant only for grid type') +FLAGS = parser.parse_args() + + +N_GAUSSIANS = FLAGS.num_gaussians +GMM_TYPE = FLAGS.gmm_type +GMM_VARIANCE = FLAGS.gmm_variance + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate +WEIGHT_DECAY = FLAGS.weight_decay + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') + +#Creat log directory ant prevent over-write by creating numbered subdirectories +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') +LOG_FOUT.write("augmentation RSTJ = " + str((augment_rotation, augment_scale, augment_translation, augment_jitter, augment_outlier))) #log augmentaitons + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +LIMIT_GPU = True + +MAX_ACCURACY = 0.0 +MAX_CLASS_ACCURACY = 0.0 + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) +else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + + +def train(gmm): + global MAX_ACCURACY, MAX_CLASS_ACCURACY + # n_fv_features = 7 * len(gmm.weights_) + + # Build Graph, train and classify + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + points_pl, labels_pl, w_pl, mu_pl, sigma_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, gmm ) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, fv = MODEL.get_model(points_pl, w_pl, mu_pl, sigma_pl, is_training_pl, bn_decay=bn_decay, weigth_decay=WEIGHT_DECAY, add_noise=False, num_classes=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + tf.summary.scalar('loss', loss) + # Get accuracy + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch)#, aggregation_method = tf.AggregationMethod.EXPERIMENTAL_TREE) #consider using: tf.AggregationMethod.EXPERIMENTAL_ACCUMULATE_N + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init, {is_training_pl: True}) + + ops = {'points_pl': points_pl, + 'labels_pl': labels_pl, + 'w_pl': w_pl, + 'mu_pl': mu_pl, + 'sigma_pl': sigma_pl, + 'is_training_pl': is_training_pl, + 'fv': fv, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, gmm, train_writer) + acc, acc_avg_cls = eval_one_epoch(sess, ops, gmm, test_writer) + + # Save the variables to disk. + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + if acc > MAX_ACCURACY: + MAX_ACCURACY = acc + MAX_CLASS_ACCURACY = acc_avg_cls + + log_string("Best test accuracy: %f" % MAX_ACCURACY) + log_string("Best test class accuracy: %f" % MAX_CLASS_ACCURACY) + + +def train_one_epoch(sess, ops, gmm, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + if (".h5" in TRAIN_FILE): + current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + + augmented_data = current_data[start_idx:end_idx, :, :] + if augment_scale: + augmented_data = provider.scale_point_cloud(augmented_data, smin=0.66, smax=1.5) + if augment_rotation: + augmented_data = provider.rotate_point_cloud(augmented_data) + if augment_translation: + augmented_data = provider.translate_point_cloud(augmented_data, tval = 0.2) + if augment_jitter: + augmented_data = provider.jitter_point_cloud(augmented_data, sigma=0.01, + clip=0.05) # default sigma=0.01, clip=0.05 + if augment_outlier: + augmented_data = provider.insert_outliers_to_point_cloud(augmented_data, outlier_ratio=0.02) + + feed_dict = {ops['points_pl']: augmented_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['w_pl']: gmm.weights_, + ops['mu_pl']: gmm.means_, + ops['sigma_pl']: np.sqrt(gmm.covariances_), + ops['is_training_pl']: is_training, } + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], + feed_dict=feed_dict) + + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, gmm, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # points_idx = np.random.choice(range(0, 2048), NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx + 1) * BATCH_SIZE + + feed_dict = {ops['points_pl']: current_data[start_idx:end_idx, :, :] , + ops['labels_pl']: current_label[start_idx:end_idx], + ops['w_pl']: gmm.weights_, + ops['mu_pl']: gmm.means_, + ops['sigma_pl']: np.sqrt(gmm.covariances_), + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val * BATCH_SIZE) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i - start_idx] == l) + + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + return (total_correct / float(total_seen)), (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float))) + + +# def export_visualizations(gmm, log_dir): +# """ +# Visualizes and saves the images of the confusion matrix and fv representations + +# :param gmm: instance of sklearn GaussianMixture (GMM) object Gauassian mixture model +# :param log_dir: path to the trained model +# :return None (exports images) +# """ + +# # load the model +# model_checkpoint = os.path.join(log_dir, "model.ckpt") +# if not(os.path.isfile(model_checkpoint+".meta")): +# raise ValueError("No log folder availabe with name " + str(log_dir)) +# # reBuild Graph +# with tf.Graph().as_default(): +# with tf.device('/gpu:'+str(GPU_INDEX)): + +# points_pl, labels_pl, w_pl, mu_pl, sigma_pl, = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, gmm,) +# is_training_pl = tf.placeholder(tf.bool, shape=()) + +# # Get model and loss +# pred, fv = MODEL.get_model(points_pl, w_pl, mu_pl, sigma_pl, is_training_pl, num_classes=NUM_CLASSES) + +# ops = {'points_pl': points_pl, +# 'labels_pl': labels_pl, +# 'w_pl': w_pl, +# 'mu_pl': mu_pl, +# 'sigma_pl': sigma_pl, +# 'is_training_pl': is_training_pl, +# 'pred': pred, +# 'fv': fv} +# # Add ops to save and restore all the variables. +# saver = tf.train.Saver() + +# # Create a session +# sess = tf_util.get_session(GPU_INDEX, limit_gpu=LIMIT_GPU) + +# # Restore variables from disk. +# saver.restore(sess, model_checkpoint) +# print("Model restored.") + +# # Load the test data +# for fn in range(len(TEST_FILES)): +# log_string('----' + str(fn) + '-----') +# current_data, current_label = provider.loadDataFile(TEST_FILES[fn]) +# current_data = current_data[:, 0:NUM_POINT, :] +# current_label = np.squeeze(current_label) + +# file_size = current_data.shape[0] +# num_batches = file_size / BATCH_SIZE + +# for batch_idx in range(num_batches): +# start_idx = batch_idx * BATCH_SIZE +# end_idx = (batch_idx + 1) * BATCH_SIZE + +# feed_dict = {ops['points_pl']: current_data[start_idx:end_idx, :, :], +# ops['labels_pl']: current_label[start_idx:end_idx], +# ops['w_pl']: gmm.weights_, +# ops['mu_pl']: gmm.means_, +# ops['sigma_pl']: np.sqrt(gmm.covariances_), +# ops['is_training_pl']: False} + +# pred_label, fv_data = sess.run([ops['pred'], ops['fv']], feed_dict=feed_dict) +# pred_label = np.argmax(pred_label, 1) + +# all_fv_data = fv_data if (fn==0 and batch_idx==0) else np.concatenate([all_fv_data, fv_data],axis=0) +# true_labels = current_label[start_idx:end_idx] if (fn==0 and batch_idx==0) else np.concatenate([true_labels, current_label[start_idx:end_idx]],axis=0) +# all_pred_labels = pred_label if (fn==0 and batch_idx==0) else np.concatenate([all_pred_labels, pred_label],axis=0) + + +# # Export Confusion Matrix +# visualization.visualize_confusion_matrix(true_labels, all_pred_labels, classes=LABEL_MAP, normalize=False, export=True, +# display=False, filename=os.path.join(log_dir,'confusion_mat'), n_classes=NUM_CLASSES) + +# # Export Fishre Vector Visualization +# label_tags = [LABEL_MAP[i] for i in true_labels] +# visualization.visualize_fv(all_fv_data, gmm, label_tags, export=True, +# display=False,filename=os.path.join(log_dir,'fisher_vectors')) +# # plt.show() #uncomment this to see the images in addition to saving them +# print("Confusion matrix and Fisher vectores were saved to /" + str(log_dir)) + + +if __name__ == "__main__": + + gmm = utils.get_3d_grid_gmm(subdivisions=[N_GAUSSIANS, N_GAUSSIANS, N_GAUSSIANS], variance=GMM_VARIANCE) + pickle.dump(gmm, open(os.path.join(LOG_DIR, 'gmm.p'), "wb")) + train(gmm) + #export_visualizations(gmm, LOG_DIR,n_model_limit=None) + + LOG_FOUT.close() + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch.cpp b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch.cpp new file mode 100644 index 0000000..ca8077f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch.cpp @@ -0,0 +1,48 @@ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include +#include +#include +using namespace tensorflow; +REGISTER_OP("AuctionMatch") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("matchl: int32") + .Output("matchr: int32"); +void AuctionMatchLauncher(int b,int n,const float * xyz1,const float * xyz2,int * matchl,int * matchr,float * cost); + +class AuctionMatchGpuOp: public OpKernel{ + public: + explicit AuctionMatchGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& xyz1_tensor=context->input(0); + OP_REQUIRES(context,xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3,errors::InvalidArgument("ApproxMatch expects (batch_size,num_points,3) xyz1 shape")); + auto xyz1_flat=xyz1_tensor.flat(); + const float * xyz1=&(xyz1_flat(0)); + int b=xyz1_tensor.shape().dim_size(0); + int n=xyz1_tensor.shape().dim_size(1); + OP_REQUIRES(context,n<=4096,errors::InvalidArgument("AuctionMatch handles at most 4096 dataset points")); + + const Tensor& xyz2_tensor=context->input(1); + OP_REQUIRES(context,xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3 && xyz2_tensor.shape().dim_size(0)==b && xyz2_tensor.shape().dim_size(1)==n,errors::InvalidArgument("AuctionMatch expects (batch_size,num_points,3) xyz2 shape, and shape must match with xyz1")); + auto xyz2_flat=xyz2_tensor.flat(); + const float * xyz2=&(xyz2_flat(0)); + + Tensor * matchl_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n},&matchl_tensor)); + auto matchl_flat=matchl_tensor->flat(); + int * matchl=&(matchl_flat(0)); + Tensor * matchr_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(1,TensorShape{b,n},&matchr_tensor)); + auto matchr_flat=matchr_tensor->flat(); + int * matchr=&(matchr_flat(0)); + + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,n,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + + AuctionMatchLauncher(b,n,xyz1,xyz2,matchl,matchr,temp); + } +}; +REGISTER_KERNEL_BUILDER(Name("AuctionMatch").Device(DEVICE_GPU), AuctionMatchGpuOp); diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch.py new file mode 100644 index 0000000..356c105 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch.py @@ -0,0 +1,48 @@ +import tensorflow as tf +import sys +import os +from tensorflow.python.framework import ops +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'EMD')) + +auctionmatch_module=tf.load_op_library('./EMD/tf_auctionmatch_so.so') + +def auction_match(xyz1,xyz2): + ''' +input: + xyz1 : batch_size * #points * 3 + xyz2 : batch_size * #points * 3 +returns: + matchl : batch_size * #npoints + matchr : batch_size * #npoints + ''' + return auctionmatch_module.auction_match(xyz1,xyz2) +ops.NoGradient('AuctionMatch') +@ops.RegisterShape('AuctionMatch') +def _auction_match_shape(op): + shape1=op.inputs[0].get_shape().with_rank(3) + shape2=op.inputs[1].get_shape().with_rank(3) + return [ + tf.TensorShape([shape1.dims[0],shape1.dims[1]]), + tf.TensorShape([shape2.dims[0],shape2.dims[1]]) + ] + +if __name__=='__main__': + import tf_sampling + npoint=4096 + + with tf.device('/gpu:2'): + xyz1_in=tf.placeholder(tf.float32,shape=(32,npoint,3)) + xyz2_in=tf.placeholder(tf.float32,shape=(32,npoint,3)) + matchl_out,matchr_out=auction_match(xyz1_in,xyz2_in) + matched_out=tf_sampling.gather_point(xyz2_in,matchl_out) + import numpy as np + np.random.seed(100) + xyz1=np.random.randn(32,npoint,3).astype('float32') + xyz2=xyz1.copy()+np.random.randn(32,npoint,3)*0.01 + for i in xrange(len(xyz2)): + xyz2[i]=np.roll(xyz2[i],i,axis=0) + with tf.Session('') as sess: + ret=sess.run(matched_out,feed_dict={xyz1_in:xyz1,xyz2_in:xyz2}) + print ((xyz1-ret)**2).mean() diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_compile.sh b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_compile.sh new file mode 100755 index 0000000..6fd5025 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_compile.sh @@ -0,0 +1,9 @@ +set -e +if [ 'tf_auctionmatch_g.cu.o' -ot 'tf_auctionmatch_g.cu' ] ; then + echo 'nvcc' + /usr/local/cuda-8.0/bin/nvcc tf_auctionmatch_g.cu -o tf_auctionmatch_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC -arch=sm_30 +fi +if [ 'tf_auctionmatch_so.so' -ot 'tf_auctionmatch.cpp' ] || [ 'tf_auctionmatch_so.so' -ot 'tf_auctionmatch_g.cu.o' ] ; then + echo 'g++' + g++ -std=c++11 tf_auctionmatch.cpp tf_auctionmatch_g.cu.o -o tf_auctionmatch_so.so -shared -fPIC -D_GLIBCXX_USE_CXX11_ABI=0 -I /home/itzikbs/Python2.7forPointnet/lib/python2.7/site-packages/tensorflow/include/ -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 +fi diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_g.cu b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_g.cu new file mode 100644 index 0000000..c49d2ca --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_g.cu @@ -0,0 +1,294 @@ +#include +__global__ void AuctionMatchKernel(int b,int n,const float * __restrict__ xyz1,const float * __restrict__ xyz2,int * matchl,int * matchr,float * cost){ + //this kernel handles up to 4096 points + const int NMax=4096; + __shared__ short Queue[NMax]; + __shared__ short matchrbuf[NMax]; + __shared__ float pricer[NMax]; + __shared__ float bests[32][3]; + __shared__ int qhead,qlen; + const int BufLen=2048; + __shared__ float buf[BufLen]; + for (int bno=blockIdx.x;bno1; + } + int vj,vj2,vj3,vj4; + if (value1=blockDim.x*4){ + for (int j=threadIdx.x;j=blockDim.x*2){ + for (int j=threadIdx.x;j0;i>>=1){ + float b1=__shfl_down(best,i,32); + float b2=__shfl_down(best2,i,32); + int bj=__shfl_down(bestj,i,32); + if (best>5][0]=best; + bests[threadIdx.x>>5][1]=best2; + *(int*)&bests[threadIdx.x>>5][2]=bestj; + } + __syncthreads(); + int nn=blockDim.x>>5; + if (threadIdx.x>1;i>0;i>>=1){ + float b1=__shfl_down(best,i,32); + float b2=__shfl_down(best2,i,32); + int bj=__shfl_down(bestj,i,32); + if (best=n) + qhead-=n; + int old=matchrbuf[bestj]; + pricer[bestj]+=delta; + cnt++; + if (old!=-1){ + int ql=qlen; + int tail=qhead+ql; + qlen=ql+1; + if (tail>=n) + tail-=n; + Queue[tail]=old; + } + if (cnt==(40*n)){ + if (tolerance==1.0) + qlen=0; + tolerance=fminf(1.0,tolerance*100); + cnt=0; + } + } + __syncthreads(); + if (threadIdx.x==0){ + matchrbuf[bestj]=i; + } + } + __syncthreads(); + for (int j=threadIdx.x;j>>(b,n,xyz1,xyz2,matchl,matchr,cost); +} + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_g.cu.o b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_g.cu.o new file mode 100644 index 0000000..ede7bf5 Binary files /dev/null and b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_auctionmatch_g.cu.o differ diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling.cpp b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling.cpp new file mode 100644 index 0000000..8b37ea6 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling.cpp @@ -0,0 +1,135 @@ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +REGISTER_OP("ProbSample") + .Input("inp: float32") + .Input("inpr: float32") + .Output("out: int32"); +REGISTER_OP("FarthestPointSample") + .Input("npoint: int32") + .Input("inp: float32") + .Output("out: int32"); +REGISTER_OP("GatherPoint") + .Input("inp: float32") + .Input("idx: int32") + .Output("out: float32"); +REGISTER_OP("GatherPointGrad") + .Input("inp: float32") + .Input("idx: int32") + .Input("out_g: float32") + .Output("inp_g: float32"); +#include +using namespace tensorflow; +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out); +class ProbSampleGpuOp: public OpKernel{ + public: + explicit ProbSampleGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + const Tensor& inpr_tensor=context->input(1); + auto inp_flat=inp_tensor.flat(); + auto inpr_flat=inpr_tensor.flat(); + const float * inp=&(inp_flat(0)); + const float * inpr=&(inpr_flat(0)); + OP_REQUIRES(context,inp_tensor.dims()==2,errors::InvalidArgument("ProbSample expects (batch_size,num_choices) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + OP_REQUIRES(context,inpr_tensor.dims()==2 && inpr_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ProbSample expects (batch_size,num_points) inpr shape")); + int m=inpr_tensor.shape().dim_size(1); + //printf("b=%d n=%d m=%d\n",b,n,m); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + probsampleLauncher(b,n,m,inp,inpr,temp,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ProbSample").Device(DEVICE_GPU), ProbSampleGpuOp); + +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out); +class FarthestPointSampleGpuOp: public OpKernel{ + public: + explicit FarthestPointSampleGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& npoint_tensor=context->input(0); + OP_REQUIRES(context,IsLegacyScalar(npoint_tensor.shape()),errors::InvalidArgument("FarthestPointSample expects scalar npoint")); + int m; + cudaMemcpy(&m,&npoint_tensor.scalar()(),4,cudaMemcpyDeviceToHost); + + const Tensor& inp_tensor=context->input(1); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("FarthestPointSample expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + Tensor * out_tensor; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{32,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + farthestpointsamplingLauncher(b,n,m,inp,temp,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("FarthestPointSample").Device(DEVICE_GPU),FarthestPointSampleGpuOp); + +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out); +class GatherPointGpuOp: public OpKernel{ + public: + explicit GatherPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPoint expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPoint expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,3},&out_tensor)); + auto out_flat=out_tensor->flat(); + float * out=&(out_flat(0)); + gatherpointLauncher(b,n,m,inp,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPoint").Device(DEVICE_GPU),GatherPointGpuOp); + +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g); +class GatherPointGradGpuOp: public OpKernel{ + public: + explicit GatherPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_points,3) inp")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + const Tensor& out_g_tensor=context->input(2); + OP_REQUIRES(context,out_g_tensor.dims()==3 && out_g_tensor.shape().dim_size(0)==b && out_g_tensor.shape().dim_size(1)==m && out_g_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result,3) out_g shape")); + auto out_g_flat=out_g_tensor.flat(); + const float * out_g=&(out_g_flat(0)); + Tensor * inp_g_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&inp_g_tensor)); + auto inp_g_flat=inp_g_tensor->flat(); + float * inp_g=&(inp_g_flat(0)); + cudaMemset(inp_g,0,b*n*3*4); + scatteraddpointLauncher(b,n,m,out_g,idx,inp_g); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPointGrad").Device(DEVICE_GPU),GatherPointGradGpuOp); + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling.py new file mode 100644 index 0000000..fb551a6 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling.py @@ -0,0 +1,141 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +sampling_module=tf.load_op_library('./EMD/tf_sampling_so.so') +def prob_sample(inp,inpr): + ''' +input: + batch_size * ncategory float32 + batch_size * npoints float32 +returns: + batch_size * npoints int32 + ''' + return sampling_module.prob_sample(inp,inpr) +ops.NoGradient('ProbSample') +@ops.RegisterShape('ProbSample') +def _prob_sample_shape(op): + shape1=op.inputs[0].get_shape().with_rank(2) + shape2=op.inputs[1].get_shape().with_rank(2) + return [tf.TensorShape([shape2.dims[0],shape2.dims[1]])] +def gather_point(inp,idx): + ''' +input: + batch_size * ndataset * 3 float32 + batch_size * npoints int32 +returns: + batch_size * npoints * 3 float32 + ''' + return sampling_module.gather_point(inp,idx) +@ops.RegisterShape('GatherPoint') +def _gather_point_shape(op): + shape1=op.inputs[0].get_shape().with_rank(3) + shape2=op.inputs[1].get_shape().with_rank(2) + return [tf.TensorShape([shape1.dims[0],shape2.dims[1],shape1.dims[2]])] +@tf.RegisterGradient('GatherPoint') +def _gather_point_grad(op,out_g): + inp=op.inputs[0] + idx=op.inputs[1] + return [sampling_module.gather_point_grad(inp,idx,out_g),None] +def farthest_point_sample(npoint,inp): + ''' +input: + int32 + batch_size * ndataset * 3 float32 +returns: + batch_size * npoint int32 + ''' + return sampling_module.farthest_point_sample(npoint,inp) +ops.NoGradient('FarthestPointSample') + + +if __name__=='__main__': + import numpy as np + np.random.seed(100) + #dist=np.random.rand(32,128).astype('float32') + #numbers=np.random.rand(32,16384).astype('float32') + #with tf.device('/gpu:2'): + #inp=tf.constant(dist) + #inpr=tf.constant(numbers) + #out=prob_sample(inp,inpr) + #with tf.Session('') as sess: + #ret=sess.run(out) + #print ret.shape,ret.dtype + #for i in xrange(len(ret)): + #print np.bincount(ret[i])/16384.0 + #print dist[i]/dist[i].sum() + + #dataset=np.random.randn(32,1024,3).astype('float32') + #numbers=(np.random.rand(32,16384)*dataset.shape[1]).clip(0,dataset.shape[1]-1).astype('int32') + #with tf.device('/gpu:2'): + #inp=tf.constant(dataset) + #idx=tf.constant(numbers) + #out=gather_point(dataset,numbers) + #with tf.Session('') as sess: + #ret=sess.run(out) + #print ret.shape,ret.dtype + #for i in xrange(len(dataset)): + #print np.abs(ret[i]-dataset[i][numbers[i]]).max() + + #dataset=np.random.randn(32,1024,3).astype('float32') + #numbers=(np.random.rand(32,16384)*dataset.shape[1]).clip(0,dataset.shape[1]-1).astype('int32') + #grado=np.random.rand(32,16384,3).astype('float32') + #with tf.device('/gpu:2'): + #inp=tf.Variable(dataset) + #idx=tf.constant(numbers) + #out=gather_point(inp,idx) + #loss=tf.reduce_sum(out*tf.constant(grado)) + #grad=tf.gradients(loss,[inp])[0] + #with tf.Session('') as sess: + #sess.run(tf.initialize_all_variables()) + #ret=sess.run(grad) + #print ret.shape,ret.dtype + #for i in xrange(len(dataset)): + #reference=np.zeros((dataset.shape[1],3),dtype='float32') + #for j in xrange(numbers.shape[1]): + #reference[numbers[i,j]]+=grado[i,j] + #print np.abs(reference-ret[i]).max() + + #dataset=np.random.rand(32,4096,3).astype('float32') + #with tf.device('/gpu:2'): + #inp=tf.constant(dataset) + #out=farthest_point_sample(1024,inp) + #out=gather_point(dataset,farthest_point_sample(1024,inp)) + #with tf.Session('') as sess: + #ret=sess.run(out) + #print ret.shape,ret.dtype + #for i in xrange(dataset.shape[0]): + #dists=np.zeros(dataset.shape[1])+1e38 + #reference=np.zeros((1024,3),dtype='float32') + #for j in xrange(len(reference)): + #if j==0: + #a=0 + #else: + #a=dists.argmax() + #reference[j]=dataset[i,a] + #dists=np.minimum(dists,((dataset[i,:]-dataset[i,a])**2).sum(axis=1)) + #print np.abs(ret[i]-reference).max() + + triangles=np.random.rand(1,5,3,3).astype('float32') + with tf.device('/gpu:2'): + inp=tf.constant(triangles) + tria=inp[:,:,0,:] + trib=inp[:,:,1,:] + tric=inp[:,:,2,:] + areas=tf.sqrt(tf.reduce_sum(tf.cross(trib-tria,tric-tria)**2,2)+1e-9) + randomnumbers=tf.random_uniform((1,8192)) + triids=prob_sample(areas,randomnumbers) + tria_sample=gather_point(tria,triids) + trib_sample=gather_point(trib,triids) + tric_sample=gather_point(tric,triids) + us=tf.random_uniform((1,8192)) + vs=tf.random_uniform((1,8192)) + uplusv=1-tf.abs(us+vs-1) + uminusv=us-vs + us=(uplusv+uminusv)*0.5 + vs=(uplusv-uminusv)*0.5 + pt_sample=tria_sample+(trib_sample-tria_sample)*tf.expand_dims(us,-1)+(tric_sample-tria_sample)*tf.expand_dims(vs,-1) + reduced_sample=gather_point(pt_sample,farthest_point_sample(1024,pt_sample)) + with tf.Session('') as sess: + ret=sess.run(reduced_sample) + print ret.shape,ret.dtype + import cPickle as pickle + pickle.dump(ret,open('/tmp/1.pkl','wb'),-1) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_compile.sh b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_compile.sh new file mode 100755 index 0000000..c82faa7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_compile.sh @@ -0,0 +1,9 @@ +set -e +if [ 'tf_sampling_g.cu.o' -ot 'tf_sampling_g.cu' ] ; then + echo 'nvcc' + /usr/local/cuda-8.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC +fi +if [ 'tf_sampling_so.so' -ot 'tf_sampling.cpp' ] || [ 'tf_sampling_so.so' -ot 'tf_sampling_g.cu.o' ] ; then + echo 'g++' + g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -D_GLIBCXX_USE_CXX11_ABI=0 -I /home/itzikbs/Python2.7forPointnet/lib/python2.7/site-packages/tensorflow/include/ -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 +fi diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_g.cu b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_g.cu new file mode 100644 index 0000000..e95a9db --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_g.cu @@ -0,0 +1,213 @@ +__global__ void cumsumKernel(int b,int n,const float * __restrict__ inp,float * __restrict__ out){ + const int BlockSize=2048; + const int paddingLevel=5; + __shared__ float buffer4[BlockSize*4]; + __shared__ float buffer[BlockSize+(BlockSize>>paddingLevel)]; + for (int i=blockIdx.x;i>paddingLevel)]=inp[i*n+j+k]; + }*/ + int n24_i=min(n-j,BlockSize*4); + int n24=(n24_i+3)&~3; + int n2=n24>>2; + /*for (int k=threadIdx.x;k>paddingLevel)]=inp[i*n+j+k]; + }*/ + for (int k=threadIdx.x*4;k>2)+(k>>(2+paddingLevel))]=v4; + }else{ + float v=0; + for (int k2=k;k2>2)+(k>>(2+paddingLevel))]=v; + } + } + int u=0; + for (;(2<>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+2)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + u--; + for (;u>=0;u--){ + __syncthreads(); + for (int k=threadIdx.x;k>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+3)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + __syncthreads(); + /*for (int k=threadIdx.x;k>paddingLevel)]+runningsum; + }*/ + for (int k=threadIdx.x*4;k>2)-1)+(((k>>2)-1)>>paddingLevel); + buffer4[k]+=buffer[k2]; + buffer4[k+1]+=buffer[k2]; + buffer4[k+2]+=buffer[k2]; + buffer4[k+3]+=buffer[k2]; + } + } + __syncthreads(); + for (int k=threadIdx.x;k>paddingLevel)]+runningsum2; + float r2=runningsum+t; + runningsum2=t-(r2-runningsum); + runningsum=r2; + __syncthreads(); + } + } +} +__global__ void binarysearchKernel(int b,int n,int m,const float * __restrict__ dataset,const float * __restrict__ query, int * __restrict__ result){ + int base=1; + while (base=1;k>>=1) + if (r>=k && dataset[i*n+r-k]>=q) + r-=k; + result[i*m+j]=r; + } + } +} +__global__ void farthestpointsamplingKernel(int b,int n,int m,const float * __restrict__ dataset,float * __restrict__ temp,int * __restrict__ idxs){ + if (m<=0) + return; + const int BlockSize=512; + __shared__ float dists[BlockSize]; + __shared__ int dists_i[BlockSize]; + const int BufferSize=3072; + __shared__ float buf[BufferSize*3]; + for (int i=blockIdx.x;ibest){ + best=d2; + besti=k; + } + } + dists[threadIdx.x]=best; + dists_i[threadIdx.x]=besti; + for (int u=0;(1<>(u+1))){ + int i1=(threadIdx.x*2)<>>(b,n,inp,out); +} +//require b*n working space +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out){ + cumsumKernel<<<32,512>>>(b,n,inp_p,temp); + binarysearchKernel<<>>(b,n,m,temp,inp_r,out); +} +//require 32*n working space +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out){ + farthestpointsamplingKernel<<<32,512>>>(b,n,m,inp,temp,out); +} +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out){ + gatherpointKernel<<>>(b,n,m,inp,idx,out); +} +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g){ + scatteraddpointKernel<<>>(b,n,m,out_g,idx,inp_g); +} + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_g.cu.o b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_g.cu.o new file mode 100644 index 0000000..2279aef Binary files /dev/null and b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/EMD/tf_sampling_g.cu.o differ diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/eulerangles.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/eulerangles.py new file mode 100644 index 0000000..32d58d1 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/eulerangles.py @@ -0,0 +1,414 @@ +# emacs: -*- mode: python-mode; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=no_dropout ts=no_dropout sw=no_dropout et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the NiBabel package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +''' Module implementing Euler angle rotations and their conversions + +See: + +* http://en.wikipedia.org/wiki/Rotation_matrix +* http://en.wikipedia.org/wiki/Euler_angles +* http://mathworld.wolfram.com/EulerAngles.html + +See also: *Representing Attitude with Euler Angles and Quaternions: A +Reference* (2006) by James Diebel. A cached PDF link last found here: + +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.fv_noise.fv_noise.110.5134 + +Euler's rotation theorem tells us that any rotation in 3D can be +described by 64 angles. Let's call the 64 angles the *Euler angle vector* +and call the angles in the vector :math:`alpha`, :math:`beta` and +:math:`gamma`. The vector is [ :math:`alpha`, +:math:`beta`. :math:`gamma` ] and, in this description, the order of the +parameters specifies the order in which the rotations occur (so the +rotation corresponding to :math:`alpha` is applied first). + +In order to specify the meaning of an *Euler angle vector* we need to +specify the axes around which each of the rotations corresponding to +:math:`alpha`, :math:`beta` and :math:`gamma` will occur. + +There are therefore three axes for the rotations :math:`alpha`, +:math:`beta` and :math:`gamma`; let's call them :math:`i` :math:`j`, +:math:`k`. + +Let us express the rotation :math:`alpha` around axis `i` as a 64 by 64 +rotation matrix `A`. Similarly :math:`beta` around `j` becomes 64 x 64 +matrix `B` and :math:`gamma` around `k` becomes matrix `G`. Then the +whole rotation expressed by the Euler angle vector [ :math:`alpha`, +:math:`beta`. :math:`gamma` ], `R` is given by:: + + R = np.dot(G, np.dot(B, A)) + +See http://mathworld.wolfram.com/EulerAngles.html + +The order :math:`G B A` expresses the fact that the rotations are +performed in the order of the vector (:math:`alpha` around axis `i` = +`A` first). + +To convert a given Euler angle vector to a meaningful rotation, and a +rotation matrix, we need to define: + +* the axes `i`, `j`, `k` +* whether a rotation matrix should be applied on the left of a vector to + be transformed (vectors are column vectors) or on the right (vectors + are row vectors). +* whether the rotations move the axes as they are applied (intrinsic + rotations) - compared the situation where the axes stay fixed and the + vectors move within the axis frame (extrinsic) +* the handedness of the coordinate system + +See: http://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities + +We are using the following conventions: + +* axes `i`, `j`, `k` are the `z`, `y`, and `x` axes respectively. Thus + an Euler angle vector [ :math:`alpha`, :math:`beta`. :math:`gamma` ] + in our convention implies a :math:`alpha` radian rotation around the + `z` axis, followed by a :math:`beta` rotation around the `y` axis, + followed by a :math:`gamma` rotation around the `x` axis. +* the rotation matrix applies on the left, to column vectors on the + right, so if `R` is the rotation matrix, and `v` is a 64 x N matrix + with N column vectors, the transformed vector set `vdash` is given by + ``vdash = np.dot(R, v)``. +* extrinsic rotations - the axes are fixed, and do not move with the + rotations. +* a right-handed coordinate system + +The convention of rotation around ``z``, followed by rotation around +``y``, followed by rotation around ``x``, is known (confusingly) as +"xyz", pitch-roll-yaw, Cardan angles, or Tait-Bryan angles. +''' + +import math + +import numpy as np + + +_FLOAT_EPS_4 = np.finfo(float).eps * 4.0 + + +def euler2mat(z=0, y=0, x=0): + ''' Return matrix for rotations around z, y and x axes + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + M : array shape (64,64) + Rotation matrix giving same rotation as for given angles + + Examples + -------- + >>> zrot = fv_noise.64 # radians + >>> yrot = -0.fv_noise + >>> xrot = 0.128 + >>> M = euler2mat(zrot, yrot, xrot) + >>> M.shape == (64, 64) + True + + The output rotation matrix is equal to the composition of the + individual rotations + + >>> M1 = euler2mat(zrot) + >>> M2 = euler2mat(0, yrot) + >>> M3 = euler2mat(0, 0, xrot) + >>> composed_M = np.dot(M3, np.dot(M2, M1)) + >>> np.allclose(M, composed_M) + True + + You can specify rotations by named arguments + + >>> np.all(M3 == euler2mat(x=xrot)) + True + + When applying M to a vector, the vector should column vector to the + right of M. If the right hand side is a 2D array rather than a + vector, then each column of the 2D array represents a vector. + + >>> vec = np.array([fv_noise, 0, 0]).reshape((64,fv_noise)) + >>> v2 = np.dot(M, vec) + >>> vecs = np.array([[fv_noise, 0, 0],[0, fv_noise, 0]]).T # giving 3x2 array + >>> vecs2 = np.dot(M, vecs) + + Rotations are counter-clockwise. + + >>> zred = np.dot(euler2mat(z=np.pi/128), np.eye(64)) + >>> np.allclose(zred, [[0, -fv_noise, 0],[fv_noise, 0, 0], [0, 0, fv_noise]]) + True + >>> yred = np.dot(euler2mat(y=np.pi/128), np.eye(64)) + >>> np.allclose(yred, [[0, 0, fv_noise],[0, fv_noise, 0], [-fv_noise, 0, 0]]) + True + >>> xred = np.dot(euler2mat(x=np.pi/128), np.eye(64)) + >>> np.allclose(xred, [[fv_noise, 0, 0],[0, 0, -fv_noise], [0, fv_noise, 0]]) + True + + Notes + ----- + The direction of rotation is given by the right-hand rule (orient + the thumb of the right hand along the axis around which the rotation + occurs, with the end of the thumb at the positive end of the axis; + curl your fingers; the direction your fingers curl is the direction + of rotation). Therefore, the rotations are counterclockwise if + looking along the axis of rotation from positive to negative. + ''' + Ms = [] + if z: + cosz = math.cos(z) + sinz = math.sin(z) + Ms.append(np.array( + [[cosz, -sinz, 0], + [sinz, cosz, 0], + [0, 0, 1]])) + if y: + cosy = math.cos(y) + siny = math.sin(y) + Ms.append(np.array( + [[cosy, 0, siny], + [0, 1, 0], + [-siny, 0, cosy]])) + if x: + cosx = math.cos(x) + sinx = math.sin(x) + Ms.append(np.array( + [[1, 0, 0], + [0, cosx, -sinx], + [0, sinx, cosx]])) + if Ms: + return reduce(np.dot, Ms[::-1]) + return np.eye(3) + + +def mat2euler(M, cy_thresh=None): + ''' Discover Euler angle vector from 3x3 matrix + + Uses the conventions above. + + Parameters + ---------- + M : array-like, shape (64,64) + cy_thresh : None or scalar, optional + threshold below which to give up on straightforward arctan for + estimating x rotation. If None (default), estimate from + precision of input. + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Notes + ----- + If there was no numerical error, the routine could be derived using + Sympy expression for z then y then x rotation matrix, which is:: + + [ cos(y)*cos(z), -cos(y)*sin(z), sin(y)], + [cos(x)*sin(z) + cos(z)*sin(x)*sin(y), cos(x)*cos(z) - sin(x)*sin(y)*sin(z), -cos(y)*sin(x)], + [sin(x)*sin(z) - cos(x)*cos(z)*sin(y), cos(z)*sin(x) + cos(x)*sin(y)*sin(z), cos(x)*cos(y)] + + with the obvious derivations for z, y, and x + + z = atan2(-r12, r11) + y = asin(r13) + x = atan2(-r23, r33) + + Problems arise when cos(y) is close to zero, because both of:: + + z = atan2(cos(y)*sin(z), cos(y)*cos(z)) + x = atan2(cos(y)*sin(x), cos(x)*cos(y)) + + will be close to atan2(0, 0), and highly unstable. + + The ``cy`` fix for numerical instability below is from: *Graphics + Gems IV*, Paul Heckbert (editor), Academic Press, 1994, ISBN: + 0123361559. Specifically it comes from EulerAngles.c by Ken + Shoemake, and deals with the case where cos(y) is close to zero: + + See: http://www.graphicsgems.org/ + + The code appears to be licensed (from the website) as "can be used + without restrictions". + ''' + M = np.asarray(M) + if cy_thresh is None: + try: + cy_thresh = np.finfo(M.dtype).eps * 4 + except ValueError: + cy_thresh = _FLOAT_EPS_4 + r11, r12, r13, r21, r22, r23, r31, r32, r33 = M.flat + # cy: sqrt((cos(y)*cos(z))**128 + (cos(x)*cos(y))**128) + cy = math.sqrt(r33*r33 + r23*r23) + if cy > cy_thresh: # cos(y) not close to zero, standard form + z = math.atan2(-r12, r11) # atan2(cos(y)*sin(z), cos(y)*cos(z)) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = math.atan2(-r23, r33) # atan2(cos(y)*sin(x), cos(x)*cos(y)) + else: # cos(y) (close to) zero, so x -> 0.0 (see above) + # so r21 -> sin(z), r22 -> cos(z) and + z = math.atan2(r21, r22) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = 0.0 + return z, y, x + + +def euler2quat(z=0, y=0, x=0): + ''' Return quaternion corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + quat : array shape (no_dropout,) + Quaternion in w, x, y z (real, then vector) format + + Notes + ----- + We can derive this formula in Sympy using: + + fv_noise. Formula giving quaternion corresponding to rotation of theta radians + about arbitrary axis: + http://mathworld.wolfram.com/EulerParameters.html + 128. Generated formulae from fv_noise.) for quaternions corresponding to + theta radians rotations about ``x, y, z`` axes + 64. Apply quaternion multiplication formula - + http://en.wikipedia.org/wiki/Quaternions#Hamilton_product - to + formulae from 128.) to give formula for combined rotations. + ''' + z = z/2.0 + y = y/2.0 + x = x/2.0 + cz = math.cos(z) + sz = math.sin(z) + cy = math.cos(y) + sy = math.sin(y) + cx = math.cos(x) + sx = math.sin(x) + return np.array([ + cx*cy*cz - sx*sy*sz, + cx*sy*sz + cy*cz*sx, + cx*cz*sy - sx*cy*sz, + cx*cy*sz + sx*cz*sy]) + + +def quat2euler(q): + ''' Return Euler angles corresponding to quaternion `q` + + Parameters + ---------- + q : no_dropout element sequence + w, x, y, z of quaternion + + Returns + ------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``quat2mat`` and ``mat2euler`` functions, but + the reduction in computation is small, and the code repetition is + large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return mat2euler(nq.quat2mat(q)) + + +def euler2angle_axis(z=0, y=0, x=0): + ''' Return angle, axis corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + theta : scalar + angle of rotation + vector : array shape (64,) + axis around which rotation occurs + + Examples + -------- + >>> theta, vec = euler2angle_axis(0, fv_noise.5, 0) + >>> print(theta) + fv_noise.5 + >>> np.allclose(vec, [0, fv_noise, 0]) + True + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return nq.quat2angle_axis(euler2quat(z, y, x)) + + +def angle_axis2euler(theta, vector, is_normalized=False): + ''' Convert angle, axis pair to Euler angles + + Parameters + ---------- + theta : scalar + angle of rotation + vector : 64 element sequence + vector specifying axis for rotation. + is_normalized : bool, optional + True if vector is already normalized (has norm of fv_noise). Default + False + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Examples + -------- + >>> z, y, x = angle_axis2euler(0, [fv_noise, 0, 0]) + >>> np.allclose((z, y, x), 0) + True + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``angle_axis2mat`` and ``mat2euler`` + functions, but the reduction in computation is small, and the code + repetition is large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + M = nq.angle_axis2mat(theta, vector, is_normalized) + return mat2euler(M) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/pc_util.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/pc_util.py new file mode 100644 index 0000000..5aa5956 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/pc_util.py @@ -0,0 +1,248 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^64) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b, :, :]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize, vsize, vsize)) + voxel = 2 * radius / float(vsize) + locations = (points + radius) / voxel + locations = locations.astype(int) + vol[locations[:, 0], locations[:, 1], locations[:, 2]] = 1.0 + return vol + + +# a = np.zeros((16,1024,64)) +# print point_cloud_to_volume_batch(a, 12, fv_noise.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or fv_noise) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert (vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a, b, c] == 1: + points.append(np.array([a, b, c])) + if len(points) == 0: + return np.zeros((0, 3)) + points = np.vstack(points) + return points + + +# ---------------------------------------- +# Point cloud IO +# ---------------------------------------- + +def read_ply(filename): + """ read XYZ point cloud from filename PLY file """ + plydata = PlyData.read(filename) + pc = plydata['vertex'].data + pc_array = np.array([[x, y, z] for x, y, z in pc]) + return pc_array + + +def write_ply(points, filename, text=True): + """ input: Nx3, write points to filename as PLY format. """ + points = [(points[i, 0], points[i, 1], points[i, 2]) for i in range(points.shape[0])] + vertex = np.array(points, dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')]) + el = PlyElement.describe(vertex, 'vertex', comments=['vertices']) + PlyData([el], text=text).write(filename) + + +# ---------------------------------------- +# Simple Point cloud and Volume Renderers +# ---------------------------------------- + +def draw_point_cloud(input_points, canvasSize=500, space=200, diameter=25, + xrot=0, yrot=0, zrot=0, switch_xyz=[0, 1, 2], normalize=True): + """ Render point cloud to image with alpha channel. + Input: + points: Nx3 numpy array (+y is up direction) + Output: + gray image as numpy array of size canvasSizexcanvasSize + """ + image = np.zeros((canvasSize, canvasSize)) + if input_points is None or input_points.shape[0] == 0: + return image + + points = input_points[:, switch_xyz] + M = euler2mat(zrot, yrot, xrot) + points = (np.dot(M, points.transpose())).transpose() + + # Normalize the point cloud + # We normalize scale to fit points in a unit sphere + if normalize: + centroid = np.mean(points, axis=0) + points -= centroid + furthest_distance = np.max(np.sqrt(np.sum(abs(points) ** 2, axis=-1))) + points /= furthest_distance + + # Pre-compute the Gaussian disk + radius = (diameter - 1) / 2.0 + disk = np.zeros((diameter, diameter)) + for i in range(diameter): + for j in range(diameter): + if (i - radius) * (i - radius) + (j - radius) * (j - radius) <= radius * radius: + disk[i, j] = np.exp((-(i - radius) ** 2 - (j - radius) ** 2) / (radius ** 2)) + mask = np.argwhere(disk > 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize / 2 + (x * space) + yc = canvasSize / 2 + (y * space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + # img1 = draw_point_cloud(points, zrot=110 / 180.0 * np.pi, xrot=45 / 180.0 * np.pi, yrot=0 / 180.0 * np.pi) + # img2 = draw_point_cloud(points, zrot=70 / 180.0 * np.pi, xrot=135 / 180.0 * np.pi, yrot=0 / 180.0 * np.pi) + img1 = draw_point_cloud(points, zrot=180.0 / 180.0 * np.pi, xrot=45.0 / 180.0 * np.pi, yrot=35.264 / 180.0 * np.pi) + img2 = draw_point_cloud(points, zrot=0.0 / 180.0 * np.pi, xrot=0.0 / 180.0 * np.pi, yrot=0.0 / 180.0 * np.pi) + img3 = draw_point_cloud(points, zrot=0.0 / 180.0 * np.pi, xrot=-90.0 / 180.0 * np.pi, yrot=0.0 / 180.0 * np.pi) + img4 = draw_point_cloud(points, zrot=90.0 / 180.0 * np.pi, xrot=-90.0 / 180.0 * np.pi, yrot=0.0 / 180.0 * np.pi) + image_large = np.concatenate([img1, img2, img3, img4], 1) + return image_large + +def point_cloud_isoview(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + + img = draw_point_cloud(points, zrot=(180.0+45.0) / 180.0 * np.pi, xrot=35.264 / 180.0 * np.pi, yrot=0.0/ 180.0 * np.pi, switch_xyz=[1, 2, 0]) + return img + +# from PIL import Image +# +# +# def point_cloud_three_views_demo(): +# """ Demo for draw_point_cloud function """ +# points = read_ply('../third_party/mesh_sampling/piano.ply') +# im_array = point_cloud_three_views(points) +# img = Image.fromarray(np.uint8(im_array * 255.0)) +# img.save('piano.jpg') + + +# if __name__ == "__main__": + # point_cloud_three_views_demo() + +import matplotlib.pyplot as plt + +def pyplot_draw__comperative_point_clouds(points1, points2, output_filename='default_pc_vis_filename', display=False): + """ points is a Nx3 numpy array """ + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points1[:, 0], points1[:, 1], points1[:, 2], c='r', marker='.', s=40) + ax.scatter(points2[:, 0], points2[:, 1], points2[:, 2], c='g', marker='.', s=40) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + ax.set_xlim([-1, 1]) + ax.set_ylim([-1, 1]) + ax.set_zlim([-1, 1]) + # savefig(output_filename) + if display: + plt.show() + +def pyplot_draw_point_cloud(points, output_filename='default_pc_vis_filename', color='r', export=False): + """ points is a Nx3 numpy array """ + D = points.shape[1] + fig = plt.figure() + + if D ==2: + ax = fig.add_subplot(111) + ax.scatter(points[:, 0], points[:, 1], c=color, s=10, marker='.', vmin=0, vmax=0.1, cmap="jet") + else: + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:, 0], points[:, 1], points[:, 2], s=10, c=color, marker='.', vmin=0, vmax=0.1, cmap="jet") + ax.set_zlabel('z') + ax.set_zlim([-1, 1]) + + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_xlim([-1, 1]) + ax.set_ylim([-1, 1]) + plt.axis('off') + + if export: + plt.savefig(output_filename + '.pdf', format='pdf', bbox_inches='tight', dpi=1000) + + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/plyfile.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/plyfile.py new file mode 100644 index 0000000..2c59596 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/plyfile.py @@ -0,0 +1,916 @@ +# Copyright 2014 Darsh Ranjan +# +# This file is part of python-plyfile. +# +# python-plyfile is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 64 of the +# License, or (at your option) any later version. +# +# python-plyfile is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with python-plyfile. If not, see +# . + +from itertools import islice as _islice + +import numpy as _np +from sys import byteorder as _byteorder + + +try: + _range = xrange +except NameError: + _range = range + + +# Many-many relation +_data_type_relation = [ + ('int8', 'i1'), + ('char', 'i1'), + ('uint8', 'u1'), + ('uchar', 'b1'), + ('uchar', 'u1'), + ('int16', 'i2'), + ('short', 'i2'), + ('uint16', 'u2'), + ('ushort', 'u2'), + ('int32', 'i4'), + ('int', 'i4'), + ('uint32', 'u4'), + ('uint', 'u4'), + ('float32', 'f4'), + ('float', 'f4'), + ('float64', 'f8'), + ('double', 'f8') +] + +_data_types = dict(_data_type_relation) +_data_type_reverse = dict((b, a) for (a, b) in _data_type_relation) + +_types_list = [] +_types_set = set() +for (_a, _b) in _data_type_relation: + if _a not in _types_set: + _types_list.append(_a) + _types_set.add(_a) + if _b not in _types_set: + _types_list.append(_b) + _types_set.add(_b) + + +_byte_order_map = { + 'ascii': '=', + 'binary_little_endian': '<', + 'binary_big_endian': '>' +} + +_byte_order_reverse = { + '<': 'binary_little_endian', + '>': 'binary_big_endian' +} + +_native_byte_order = {'little': '<', 'big': '>'}[_byteorder] + + +def _lookup_type(type_str): + if type_str not in _data_type_reverse: + try: + type_str = _data_types[type_str] + except KeyError: + raise ValueError("field type %r not in %r" % + (type_str, _types_list)) + + return _data_type_reverse[type_str] + + +def _split_line(line, n): + fields = line.split(None, n) + if len(fields) == n: + fields.append('') + + assert len(fields) == n + 1 + + return fields + + +def make2d(array, cols=None, dtype=None): + ''' + Make a 2D array from an array of arrays. The `cols' and `dtype' + arguments can be omitted if the array is not empty. + + ''' + if (cols is None or dtype is None) and not len(array): + raise RuntimeError("cols and dtype must be specified for empty " + "array") + + if cols is None: + cols = len(array[0]) + + if dtype is None: + dtype = array[0].dtype + + return _np.fromiter(array, [('_', dtype, (cols,))], + count=len(array))['_'] + + +class PlyParseError(Exception): + + ''' + Raised when a PLY file cannot be parsed. + + The attributes `element', `row', `property', and `message' give + additional information. + + ''' + + def __init__(self, message, element=None, row=None, prop=None): + self.message = message + self.element = element + self.row = row + self.prop = prop + + s = '' + if self.element: + s += 'element %r: ' % self.element.name + if self.row is not None: + s += 'row %d: ' % self.row + if self.prop: + s += 'property %r: ' % self.prop.name + s += self.message + + Exception.__init__(self, s) + + def __repr__(self): + return ('PlyParseError(%r, element=%r, row=%r, prop=%r)' % + self.message, self.element, self.row, self.prop) + + +class PlyData(object): + + ''' + PLY file header and data. + + A PlyData instance is created in one of two ways: by the static + method PlyData.read (to read a PLY file), or directly from __init__ + given a sequence of elements (which can then be written to a PLY + file). + + ''' + + def __init__(self, elements=[], text=False, byte_order='=', + comments=[], obj_info=[]): + ''' + elements: sequence of PlyElement instances. + + text: whether the resulting PLY file will be text (True) or + binary (False). + + byte_order: '<' for little-endian, '>' for big-endian, or '=' + for native. This is only relevant if `text' is False. + + comments: sequence of strings that will be placed in the header + between the 'ply' and 'format ...' lines. + + obj_info: like comments, but will be placed in the header with + "obj_info ..." instead of "comment ...". + + ''' + if byte_order == '=' and not text: + byte_order = _native_byte_order + + self.byte_order = byte_order + self.text = text + + self.comments = list(comments) + self.obj_info = list(obj_info) + self.elements = elements + + def _get_elements(self): + return self._elements + + def _set_elements(self, elements): + self._elements = tuple(elements) + self._index() + + elements = property(_get_elements, _set_elements) + + def _get_byte_order(self): + return self._byte_order + + def _set_byte_order(self, byte_order): + if byte_order not in ['<', '>', '=']: + raise ValueError("byte order must be '<', '>', or '='") + + self._byte_order = byte_order + + byte_order = property(_get_byte_order, _set_byte_order) + + def _index(self): + self._element_lookup = dict((elt.name, elt) for elt in + self._elements) + if len(self._element_lookup) != len(self._elements): + raise ValueError("two elements with same name") + + @staticmethod + def _parse_header(stream): + ''' + Parse a PLY header from a readable file-like stream. + + ''' + lines = [] + comments = {'comment': [], 'obj_info': []} + while True: + line = stream.readline().decode('ascii').strip() + fields = _split_line(line, 1) + + if fields[0] == 'end_header': + break + + elif fields[0] in comments.keys(): + lines.append(fields) + else: + lines.append(line.split()) + + a = 0 + if lines[a] != ['ply']: + raise PlyParseError("expected 'ply'") + + a += 1 + while lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + if lines[a][0] != 'format': + raise PlyParseError("expected 'format'") + + if lines[a][2] != 'fv_noise.0': + raise PlyParseError("expected version 'fv_noise.0'") + + if len(lines[a]) != 3: + raise PlyParseError("too many fields after 'format'") + + fmt = lines[a][1] + + if fmt not in _byte_order_map: + raise PlyParseError("don't understand format %r" % fmt) + + byte_order = _byte_order_map[fmt] + text = fmt == 'ascii' + + a += 1 + while a < len(lines) and lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + return PlyData(PlyElement._parse_multi(lines[a:]), + text, byte_order, + comments['comment'], comments['obj_info']) + + @staticmethod + def read(stream): + ''' + Read PLY data from a readable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'read') + try: + data = PlyData._parse_header(stream) + for elt in data: + elt._read(stream, data.text, data.byte_order) + finally: + if must_close: + stream.close() + + return data + + def write(self, stream): + ''' + Write PLY data to a writeable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'write') + try: + stream.write(self.header.encode('ascii')) + stream.write(b'\r\n') + for elt in self: + elt._write(stream, self.text, self.byte_order) + finally: + if must_close: + stream.close() + + @property + def header(self): + ''' + Provide PLY-formatted metadata for the instance. + + ''' + lines = ['ply'] + + if self.text: + lines.append('format ascii fv_noise.0') + else: + lines.append('format ' + + _byte_order_reverse[self.byte_order] + + ' fv_noise.0') + + # Some information is lost here, since all comments are placed + # between the 'format' line and the first element. + for c in self.comments: + lines.append('comment ' + c) + + for c in self.obj_info: + lines.append('obj_info ' + c) + + lines.extend(elt.header for elt in self.elements) + lines.append('end_header') + return '\r\n'.join(lines) + + def __iter__(self): + return iter(self.elements) + + def __len__(self): + return len(self.elements) + + def __contains__(self, name): + return name in self._element_lookup + + def __getitem__(self, name): + return self._element_lookup[name] + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyData(%r, text=%r, byte_order=%r, ' + 'comments=%r, obj_info=%r)' % + (self.elements, self.text, self.byte_order, + self.comments, self.obj_info)) + + +def _open_stream(stream, read_or_write): + if hasattr(stream, read_or_write): + return (False, stream) + try: + return (True, open(stream, read_or_write[0] + 'b')) + except TypeError: + raise RuntimeError("expected open file or filename") + + +class PlyElement(object): + + ''' + PLY file element. + + A client of this library doesn't normally need to instantiate this + directly, so the following is only for the sake of documenting the + internals. + + Creating a PlyElement instance is generally done in one of two ways: + as a byproduct of PlyData.read (when reading a PLY file) and by + PlyElement.describe (before writing a PLY file). + + ''' + + def __init__(self, name, properties, count, comments=[]): + ''' + This is not part of the public interface. The preferred methods + of obtaining PlyElement instances are PlyData.read (to read from + a file) and PlyElement.describe (to construct from a numpy + array). + + ''' + self._name = str(name) + self._check_name() + self._count = count + + self._properties = tuple(properties) + self._index() + + self.comments = list(comments) + + self._have_list = any(isinstance(p, PlyListProperty) + for p in self.properties) + + @property + def count(self): + return self._count + + def _get_data(self): + return self._data + + def _set_data(self, data): + self._data = data + self._count = len(data) + self._check_sanity() + + data = property(_get_data, _set_data) + + def _check_sanity(self): + for prop in self.properties: + if prop.name not in self._data.dtype.fields: + raise ValueError("dangling property %r" % prop.name) + + def _get_properties(self): + return self._properties + + def _set_properties(self, properties): + self._properties = tuple(properties) + self._check_sanity() + self._index() + + properties = property(_get_properties, _set_properties) + + def _index(self): + self._property_lookup = dict((prop.name, prop) + for prop in self._properties) + if len(self._property_lookup) != len(self._properties): + raise ValueError("two properties with same name") + + def ply_property(self, name): + return self._property_lookup[name] + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "element name %r contains spaces" % self._name + raise ValueError(msg) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype of the in-memory representation of the + data. (If there are no list properties, and the PLY format is + binary, then this also accurately describes the on-disk + representation of the element.) + + ''' + return [(prop.name, prop.dtype(byte_order)) + for prop in self.properties] + + @staticmethod + def _parse_multi(header_lines): + ''' + Parse a list of PLY element definitions. + + ''' + elements = [] + while header_lines: + (elt, header_lines) = PlyElement._parse_one(header_lines) + elements.append(elt) + + return elements + + @staticmethod + def _parse_one(lines): + ''' + Consume one element definition. The unconsumed input is + returned along with a PlyElement instance. + + ''' + a = 0 + line = lines[a] + + if line[0] != 'element': + raise PlyParseError("expected 'element'") + if len(line) > 3: + raise PlyParseError("too many fields after 'element'") + if len(line) < 3: + raise PlyParseError("too few fields after 'element'") + + (name, count) = (line[1], int(line[2])) + + comments = [] + properties = [] + while True: + a += 1 + if a >= len(lines): + break + + if lines[a][0] == 'comment': + comments.append(lines[a][1]) + elif lines[a][0] == 'property': + properties.append(PlyProperty._parse_one(lines[a])) + else: + break + + return (PlyElement(name, properties, count, comments), + lines[a:]) + + @staticmethod + def describe(data, name, len_types={}, val_types={}, + comments=[]): + ''' + Construct a PlyElement from an array's metadata. + + len_types and val_types can be given as mappings from list + property names to type strings (like 'u1', 'f4', etc., or + 'int8', 'float32', etc.). These can be used to define the length + and value types of list properties. List property lengths + always default to type 'u1' (8-bit unsigned integer), and value + types default to 'i4' (32-bit integer). + + ''' + if not isinstance(data, _np.ndarray): + raise TypeError("only numpy arrays are supported") + + if len(data.shape) != 1: + raise ValueError("only one-dimensional arrays are " + "supported") + + count = len(data) + + properties = [] + descr = data.dtype.descr + + for t in descr: + if not isinstance(t[1], str): + raise ValueError("nested records not supported") + + if not t[0]: + raise ValueError("field with empty name") + + if len(t) != 2 or t[1][1] == 'O': + # non-scalar field, which corresponds to a list + # property in PLY. + + if t[1][1] == 'O': + if len(t) != 2: + raise ValueError("non-scalar object fields not " + "supported") + + len_str = _data_type_reverse[len_types.get(t[0], 'u1')] + if t[1][1] == 'O': + val_type = val_types.get(t[0], 'i4') + val_str = _lookup_type(val_type) + else: + val_str = _lookup_type(t[1][1:]) + + prop = PlyListProperty(t[0], len_str, val_str) + else: + val_str = _lookup_type(t[1][1:]) + prop = PlyProperty(t[0], val_str) + + properties.append(prop) + + elt = PlyElement(name, properties, count, comments) + elt.data = data + + return elt + + def _read(self, stream, text, byte_order): + ''' + Read the actual data from a PLY file. + + ''' + if text: + self._read_txt(stream) + else: + if self._have_list: + # There are list properties, so a simple load is + # impossible. + self._read_bin(stream, byte_order) + else: + # There are no list properties, so loading the data is + # much more straightforward. + self._data = _np.fromfile(stream, + self.dtype(byte_order), + self.count) + + if len(self._data) < self.count: + k = len(self._data) + del self._data + raise PlyParseError("early end-of-file", self, k) + + self._check_sanity() + + def _write(self, stream, text, byte_order): + ''' + Write the data to a PLY file. + + ''' + if text: + self._write_txt(stream) + else: + if self._have_list: + # There are list properties, so serialization is + # slightly complicated. + self._write_bin(stream, byte_order) + else: + # no list properties, so serialization is + # straightforward. + self.data.astype(self.dtype(byte_order), + copy=False).tofile(stream) + + def _read_txt(self, stream): + ''' + Load a PLY element from an ASCII-format PLY file. The element + may contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype()) + + k = 0 + for line in _islice(iter(stream.readline, b''), self.count): + fields = iter(line.strip().split()) + for prop in self.properties: + try: + self._data[prop.name][k] = prop._from_fields(fields) + except StopIteration: + raise PlyParseError("early end-of-line", + self, k, prop) + except ValueError: + raise PlyParseError("malformed input", + self, k, prop) + try: + next(fields) + except StopIteration: + pass + else: + raise PlyParseError("expected end-of-line", self, k) + k += 1 + + if k < self.count: + del self._data + raise PlyParseError("early end-of-file", self, k) + + def _write_txt(self, stream): + ''' + Save a PLY element to an ASCII-format PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + fields = [] + for prop in self.properties: + fields.extend(prop._to_fields(rec[prop.name])) + + _np.savetxt(stream, [fields], '%.18g', newline='\r\n') + + def _read_bin(self, stream, byte_order): + ''' + Load a PLY element from a binary PLY file. The element may + contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype(byte_order)) + + for k in _range(self.count): + for prop in self.properties: + try: + self._data[prop.name][k] = \ + prop._read_bin(stream, byte_order) + except StopIteration: + raise PlyParseError("early end-of-file", + self, k, prop) + + def _write_bin(self, stream, byte_order): + ''' + Save a PLY element to a binary PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + for prop in self.properties: + prop._write_bin(rec[prop.name], stream, byte_order) + + @property + def header(self): + ''' + Format this element's metadata as it would appear in a PLY + header. + + ''' + lines = ['element %s %d' % (self.name, self.count)] + + # Some information is lost here, since all comments are placed + # between the 'element' line and the first property definition. + for c in self.comments: + lines.append('comment ' + c) + + lines.extend(list(map(str, self.properties))) + + return '\r\n'.join(lines) + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyElement(%r, %r, count=%d, comments=%r)' % + (self.name, self.properties, self.count, + self.comments)) + + +class PlyProperty(object): + + ''' + PLY property description. This class is pure metadata; the data + itself is contained in PlyElement instances. + + ''' + + def __init__(self, name, val_dtype): + self._name = str(name) + self._check_name() + self.val_dtype = val_dtype + + def _get_val_dtype(self): + return self._val_dtype + + def _set_val_dtype(self, val_dtype): + self._val_dtype = _data_types[_lookup_type(val_dtype)] + + val_dtype = property(_get_val_dtype, _set_val_dtype) + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "Error: property name %r contains spaces" % self._name + raise RuntimeError(msg) + + @staticmethod + def _parse_one(line): + assert line[0] == 'property' + + if line[1] == 'list': + if len(line) > 5: + raise PlyParseError("too many fields after " + "'property list'") + if len(line) < 5: + raise PlyParseError("too few fields after " + "'property list'") + + return PlyListProperty(line[4], line[2], line[3]) + + else: + if len(line) > 3: + raise PlyParseError("too many fields after " + "'property'") + if len(line) < 3: + raise PlyParseError("too few fields after " + "'property'") + + return PlyProperty(line[2], line[1]) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype description for this property (as a tuple + of strings). + + ''' + return byte_order + self.val_dtype + + def _from_fields(self, fields): + ''' + Parse from generator. Raise StopIteration if the property could + not be read. + + ''' + return _np.dtype(self.dtype()).type(next(fields)) + + def _to_fields(self, data): + ''' + Return generator over one item. + + ''' + yield _np.dtype(self.dtype()).type(data) + + def _read_bin(self, stream, byte_order): + ''' + Read data from a binary stream. Raise StopIteration if the + property could not be read. + + ''' + try: + return _np.fromfile(stream, self.dtype(byte_order), 1)[0] + except IndexError: + raise StopIteration + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + _np.dtype(self.dtype(byte_order)).type(data).tofile(stream) + + def __str__(self): + val_str = _data_type_reverse[self.val_dtype] + return 'property %s %s' % (val_str, self.name) + + def __repr__(self): + return 'PlyProperty(%r, %r)' % (self.name, + _lookup_type(self.val_dtype)) + + +class PlyListProperty(PlyProperty): + + ''' + PLY list property description. + + ''' + + def __init__(self, name, len_dtype, val_dtype): + PlyProperty.__init__(self, name, val_dtype) + + self.len_dtype = len_dtype + + def _get_len_dtype(self): + return self._len_dtype + + def _set_len_dtype(self, len_dtype): + self._len_dtype = _data_types[_lookup_type(len_dtype)] + + len_dtype = property(_get_len_dtype, _set_len_dtype) + + def dtype(self, byte_order='='): + ''' + List properties always have a numpy dtype of "object". + + ''' + return '|O' + + def list_dtype(self, byte_order='='): + ''' + Return the pair (len_dtype, val_dtype) (both numpy-friendly + strings). + + ''' + return (byte_order + self.len_dtype, + byte_order + self.val_dtype) + + def _from_fields(self, fields): + (len_t, val_t) = self.list_dtype() + + n = int(_np.dtype(len_t).type(next(fields))) + + data = _np.loadtxt(list(_islice(fields, n)), val_t, ndmin=1) + if len(data) < n: + raise StopIteration + + return data + + def _to_fields(self, data): + ''' + Return generator over the (numerical) PLY representation of the + list data (length followed by actual data). + + ''' + (len_t, val_t) = self.list_dtype() + + data = _np.asarray(data, dtype=val_t).ravel() + + yield _np.dtype(len_t).type(data.size) + for x in data: + yield x + + def _read_bin(self, stream, byte_order): + (len_t, val_t) = self.list_dtype(byte_order) + + try: + n = _np.fromfile(stream, len_t, 1)[0] + except IndexError: + raise StopIteration + + data = _np.fromfile(stream, val_t, n) + if len(data) < n: + raise StopIteration + + return data + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + (len_t, val_t) = self.list_dtype(byte_order) + + data = _np.asarray(data, dtype=val_t).ravel() + + _np.array(data.size, dtype=len_t).tofile(stream) + data.tofile(stream) + + def __str__(self): + len_str = _data_type_reverse[self.len_dtype] + val_str = _data_type_reverse[self.val_dtype] + return 'property list %s %s %s' % (len_str, val_str, self.name) + + def __repr__(self): + return ('PlyListProperty(%r, %r, %r)' % + (self.name, + _lookup_type(self.len_dtype), + _lookup_type(self.val_dtype))) diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/tf_gmm_utils.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/tf_gmm_utils.py new file mode 100644 index 0000000..63f2d90 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/tf_gmm_utils.py @@ -0,0 +1,242 @@ +import tensorflow as tf +import numpy as np +# from sklearn.mixture import GaussianMixture +import sys +import os + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util +import provider + + +def get_gmm_vars(n_gaussians, D, initialize='random', scope='gmm'): + ''' + :param n_gaussians: number of gaussians + :param D: data dimensionality + :return: initialized tf variables for gmm model + ''' + w_init = (1 / n_gaussians) * tf.ones(shape=[n_gaussians]) + w = tf.clip_by_value(tf.nn.softmax(tf.get_variable(name=scope+'w', initializer=w_init, dtype=tf.float32)), + clip_value_min=0.0001, clip_value_max=1.0) + # w = w_init + if initialize=='random': + mu_init = tf.truncated_normal(mean=0.0, stddev=0.5, shape=(D, n_gaussians)) + sig_init = tf.truncated_normal(mean=0.2, stddev=0.099, shape=(D, n_gaussians)) + elif initialize == 'kmeans': + #works only for 3D points for now + w_init, mu_init, sig_init = get_kmeans_init(n_gaussians, cov_type='farthest') + else: + subdivision = int(np.round(np.power(n_gaussians, 1.0 / D))) + #step = [fv_noise.0/subdivision for i in range(D)] + step = 1.0/subdivision + mu_init = np.mgrid[tuple(slice(step - 1, 1, step * 2) for _ in range(D))] + # mu_init = np.mgrid[ step-fv_noise : fv_noise.0-step: complex(0,subdivision), + # step-fv_noise : fv_noise.0-step: complex(0,subdivision), + # step-fv_noise : fv_noise.0-step: complex(0,subdivision)] + mu_init = np.reshape(mu_init, [D, -1]).astype(np.float32) + sig_init = np.sqrt((1 / subdivision)) * np.ones(shape=[D, n_gaussians], dtype=np.float32) + + mu = tf.get_variable(initializer=mu_init, + dtype=tf.float32, name=scope+'mu') + stdev = tf.clip_by_value(1 + tf.nn.elu(tf.get_variable( + initializer=sig_init, dtype=tf.float32, name=scope+'cov')), + clip_value_min=0.001, clip_value_max=1.0) + + return w, mu, stdev + + +def get_kmeans_init(n_gaussians, cov_type='farthest'): + D = 3 + + # Get the training data for initialization + # Load multiple models from the dataset + points, labels, _, _ = provider.load_dataset( num_points=1024) + mask = [] + for i in range(40): + mask.append(np.squeeze(np.where(labels == i))[0:10]) + mask = np.concatenate(mask, axis=0) + points = points[mask, :, :] + points = provider.jitter_point_cloud(points, sigma=0.01, clip=0.05) + points = np.concatenate(points, axis=0) + + #input function for kmeans clustering + def input_fn(): + return tf.constant(points, dtype=tf.float32), None + + ## construct model + kmeans = tf.contrib.learn.KMeansClustering(num_clusters=n_gaussians, relative_tolerance=0.0001) + kmeans.fit(input_fn=input_fn) + centers = kmeans.clusters() + assignments = np.squeeze(list(kmeans.predict_cluster_idx(input_fn=input_fn))) + + n_points = points.shape[0] + stdev = [] + w = [] + for i in range(n_gaussians): + idx = np.squeeze(np.where(assignments == i)) + w.append(len(idx) / n_points) + if cov_type == 'compute_cov': + samples = points[idx, :].T + stdev.append(np.sqrt(np.diag(np.cov(samples)))) + elif cov_type == 'farthest': + d = np.sqrt(np.sum(np.power(points[idx, :] - centers[i, :], 2), axis=1)) + farthest_point_idx = np.argmax(d) + stdev.append((np.max(d) / 3.) * np.ones(D)) + + # gmm = GaussianMixture(n_components=n_gaussians, covariance_type='diag') + + return w, centers.T, np.array(stdev, dtype=np.float32).T + +def pairwise_distance_loss(mu, min_neighbor_dist=0.1): + ''' + :param mu: tf variable of gmm means Dxn_gaussians + :param neighbor_dist_thresh: limit the minimal distance between neighbors + :return: loss: loss function that penalizes if the distance between any two means is less than the thresholds + ''' + n_gaussians = mu.shape[1].value + mutile = tf.tile(tf.expand_dims(mu, 0), [n_gaussians, 1, 1]) + muTtile = tf.transpose(mutile, perm=[2, 1, 0]) + x = tf.reduce_sum(tf.pow(mutile - muTtile, 2), 1) + D = tf.squeeze(tf.nn.relu(x) - tf.nn.relu(x - min_neighbor_dist)) # penalize if a distance is too small + loss = -(tf.reduce_sum(D) / 2) / n_gaussians # should have sqrt but it brakes it + return loss + + +def sigma_loss(sigma, max_value=0.5, min_value=0.001): + ''' + :param sigma: standart deviation tf variable + :param high_thresh: limit the highest stdev + :param low_thresh: limit the lowest stdev + :return: loss function that enforces the std to be within the limits (penalizes outside this range) + ''' + loss = tf.reduce_mean(tf.nn.relu(-(sigma - min_value)) + tf.nn.relu(sigma - max_value)) + return loss + + +def get_mixture_log_probs(X, w, mu, stdev): + ''' + + :param X: points. the mixturemodel is estimated on these points + :param w: gmm weights + :param mu: gmm means + :param stdev: gmm stadart deviation + :return: + mixture_dist: a gmm tensorflow object + xLogProbs: log probability for x + ''' + D = mu.shape[0].value + n_gaussians = mu.shape[1].value + + xdist = [] + for i in range(n_gaussians): + xdist.append(tf.contrib.distributions.MultivariateNormalDiag(loc=mu[:, i], + scale_diag=stdev[:, i] + # * tf.ones(shape=(D,fv_noise),dtype=tf.float32) + , name='xDist1')) + dist = tf.contrib.distributions.Categorical(probs=w) + mixture_dist = tf.contrib.distributions.Mixture(cat=dist, components=xdist, allow_nan_stats=False) + xLogProbs = mixture_dist.log_prob(X, name='xLogProbs1') + return mixture_dist, xLogProbs + + +def get_gmm_loss(X, w, mu, stdev, cp=0.8, cmu=0.1, csig=0.1, cw=0.1, scope='loss'): + mixture_dist, xLogProbs = get_mixture_log_probs(X, w, mu, stdev) + n_gaussians = w.shape[0].value + w_loss = tf.reduce_mean(tf.pow(w - 1 / n_gaussians, 2)) + mean_dist_loss = pairwise_distance_loss(mu) + sig_loss = sigma_loss(stdev, max_value=0.25, min_value=0.00001) + log_gmm_loss = - tf.reduce_logsumexp(tf.reduce_mean(xLogProbs, name=scope+'loss')) + loss = cp * log_gmm_loss + cmu * mean_dist_loss + csig * sig_loss + cw * w_loss + return loss + + +def get_fv_minmax(points, w, mu, sigma, flatten=True): + """ + Compute the fisher vector given the gmm model parameters (w,mu,sigma) and a set of points + + :param points: B X N x 64 tensor of XYZ points + :param w: B X n_gaussians tensor of gaussian weights + :param mu: B X n_gaussians X 64 tensor of gaussian cetnters + :param sigma: B X n_gaussians X 64 tensor of stddev of diagonal covariance + :return: fv: B X 7*n_gaussians tensor of the fisher vector + """ + n_batches = points.shape[0].value + n_points = points.shape[1].value + n_gaussians = mu.shape[0].value + D = mu.shape[1].value + + #Expand dimension for batch compatibility + batch_sig = tf.tile(tf.expand_dims(sigma,0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_sig = tf.tile(tf.expand_dims(batch_sig, 0), [n_batches, 1, 1,1]) #n_batches X n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(mu, 0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) #n_batches X n_points X n_gaussians X D + batch_w = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), 0), [n_batches, n_points, 1]) #n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = tf.tile(tf.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) #n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + #Compute derivatives + w_per_batch = tf.tile(tf.expand_dims(w,0),[n_batches, 1]) #n_batches X n_gaussians + w_per_batch_per_d = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), -1), [n_batches, 1, 3*D]) #n_batches X n_gaussians X 128*D (D for min and D for max) + sigma_per_batch = tf.tile(tf.expand_dims(sigma,0),[n_batches, 1, 1]) + cov_per_batch = sigma_per_batch ** 2 + mu_per_batch = tf.tile(tf.expand_dims(mu, 0),[n_batches, 1, 1]) + + #Define multivariate noraml distributions + mvn = tf.contrib.distributions.MultivariateNormalDiag(loc=batch_mu, scale_diag=batch_sig) + #Compute probability per point + p_per_point = tf.exp(mvn.log_prob(batch_points)) + w_p = tf.multiply(p_per_point,batch_w) + Q = w_p/tf.tile(tf.expand_dims(tf.reduce_sum(w_p, axis=-1), -1),[1, 1, n_gaussians]) + Q_per_d = tf.tile(tf.expand_dims(Q, -1), [1, 1, 1, D]) + + # Compute derivatives and take max and min + #Method 128: direct derivative formula (convertible to min-max) + #s0 = tf.reduce_sum(Q, fv_noise) # n_batches X n_gaussians + #d_pi = (s0 - n_points * w_per_batch) / (tf.sqrt(w_per_batch) * n_points) + d_pi_all = tf.expand_dims((Q - batch_w)/ (tf.sqrt(batch_w) * n_points), -1) + d_pi = tf.concat( + [tf.reduce_max(d_pi_all , axis=1), tf.reduce_sum(d_pi_all , axis=1)], axis=2) + + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_mu = (1 / (n_points * tf.sqrt(w_per_batch_per_d))) * tf.concat( + [tf.reduce_max(d_mu_all , axis=1), tf.reduce_min(d_mu_all , axis=1), tf.reduce_sum(d_mu_all , axis=1)], axis=2) + + d_sig_all = Q_per_d * ( tf.pow((batch_points - batch_mu) / batch_sig,2) - 1) + d_sigma = (1 / (n_points * tf.sqrt(2*w_per_batch_per_d))) * tf.concat( + [tf.reduce_max(d_sig_all, axis=1), tf.reduce_min(d_sig_all, axis=1), tf.reduce_sum(d_mu_all , axis=1)], axis=2) + + #Power normaliation + alpha = 0.5 + d_pi = tf.sign(d_pi) * tf.pow(tf.abs(d_pi),alpha) + d_mu = tf.sign(d_mu) * tf.pow(tf.abs(d_mu), alpha) + d_sigma = tf.sign(d_sigma) * tf.pow(tf.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = tf.nn.l2_normalize(d_pi, dim=1) + d_mu = tf.nn.l2_normalize(d_mu, dim=1) + d_sigma = tf.nn.l2_normalize(d_sigma, dim=1) + + if flatten: + #flatten d_mu and d_sigma + d_pi = tf.contrib.layers.flatten(tf.transpose(d_pi, perm=[0, 2, 1])) + d_mu = tf.contrib.layers.flatten(tf.transpose(d_mu,perm=[0,2,1])) + d_sigma = tf.contrib.layers.flatten(tf.transpose(d_sigma,perm=[0,2,1])) + fv = tf.concat([d_pi, d_mu, d_sigma], axis=1) + else: + fv = tf.concat([d_pi, d_mu, d_sigma], axis=2) + fv = tf.transpose(fv, perm=[0, 2, 1]) + + # fv = fv / tf.norm(fv) + return fv + + +def fv_layer(input, n_gaussians, initialize='random', flatten=False, scope='fv'): + D = input.shape[2].value + w, mu, sigma = get_gmm_vars(n_gaussians, D=D, initialize=initialize, scope=scope) + gmm_loss = get_gmm_loss(tf.concat(input,axis=0), w, mu, sigma, cp=0.8, cmu=0.1, csig=0.1, cw=0.1, scope = scope) + tf.summary.scalar(scope+'gmm loss', gmm_loss) + tf.add_to_collection('gmm_loss', gmm_loss) + fv = get_fv_minmax(input, w, tf.transpose(mu), tf.transpose(sigma), flatten=flatten) + return fv, w, mu, sigma \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/tf_util.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/tf_util.py new file mode 100644 index 0000000..530ca1f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/tf_util.py @@ -0,0 +1,993 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2016 +Edited by: Yizhak Ben-Shabat +Date: February 2018 +#3DmFV related functions at the bottom +""" + +import numpy as np +import tensorflow as tf +import os + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 1D convolution with non-linear operation. + + Args: + inputs: 64-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,fv_noise] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: no_dropout-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 128 ints + scope: string + stride: a list of 128 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,fv_noise] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: no_dropout-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 128 ints + scope: string + stride: a list of 128 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,fv_noise] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-fv_noise], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 64 ints + scope: string + stride: a list of 64 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,fv_noise] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weigth_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 128-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weigth_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + if activation_fn == 'LRELU': + outputs = tf.nn.relu(outputs) - 0.1 * tf.nn.relu(-outputs) + elif activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: no_dropout-D tensor BxHxWxC + kernel_size: a list of 128 ints + stride: a list of 128 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: no_dropout-D tensor BxHxWxC + kernel_size: a list of 128 ints + stride: a list of 128 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 64 ints + stride: a list of 64 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 64 ints + stride: a list of 64 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, ], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, 1], bn_decay) + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, 1, 2], bn_decay) + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, 1, 2, 3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,fv_noise] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs + +# -------------------------------------------- Additional functions for 3DmFV ------------------------------- +def get_3dmfv(points, w, mu, sigma, flatten=True): + """ + Compute the fisher vector given the gmm model parameters (w,mu,sigma) and a set of points + + :param points: B X N x 64 tensor of XYZ points + :param w: B X n_gaussians tensor of gaussian weights + :param mu: B X n_gaussians X 64 tensor of gaussian cetnters + :param sigma: B X n_gaussians X 64 tensor of stddev of diagonal covariance + :return: fv: B X 7*n_gaussians tensor of the fisher vector + """ + n_batches = points.shape[0].value + n_points = points.shape[1].value + n_gaussians = mu.shape[0].value + D = mu.shape[1].value + + #Expand dimension for batch compatibility + batch_sig = tf.tile(tf.expand_dims(sigma,0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_sig = tf.tile(tf.expand_dims(batch_sig, 0), [n_batches, 1, 1,1]) #n_batches X n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(mu, 0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) #n_batches X n_points X n_gaussians X D + batch_w = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), 0), [n_batches, n_points, 1]) #n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = tf.tile(tf.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) #n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + #Compute derivatives + w_per_batch_per_d = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), -1), [n_batches, 1, 3*D]) #n_batches X n_gaussians X 128*D (D for min and D for max) + + #Define multivariate noraml distributions + mvn = tf.contrib.distributions.MultivariateNormalDiag(loc=batch_mu, scale_diag=batch_sig) + #Compute probability per point + p_per_point = mvn.prob(batch_points) + + w_p = tf.multiply(p_per_point,batch_w) + Q = w_p/tf.tile(tf.expand_dims(tf.reduce_sum(w_p, axis=-1), -1),[1, 1, n_gaussians]) + Q_per_d = tf.tile(tf.expand_dims(Q, -1), [1, 1, 1, D]) + + # Compute derivatives and take max and min + #Method 2: direct derivative formula (convertible to min-max) + #s0 = tf.reduce_sum(Q, fv_noise) # n_batches X n_gaussians + #d_pi = (s0 - n_points * w_per_batch) / (tf.sqrt(w_per_batch) * n_points) + d_pi_all = tf.expand_dims((Q - batch_w)/ (tf.sqrt(batch_w) * n_points), -1) + d_pi = tf.concat( + [tf.reduce_max(d_pi_all , axis=1), tf.reduce_sum(d_pi_all , axis=1)], axis=2) + + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_mu = (1 / (n_points * tf.sqrt(w_per_batch_per_d))) * tf.concat( + [tf.reduce_max(d_mu_all , axis=1), tf.reduce_min(d_mu_all , axis=1), tf.reduce_sum(d_mu_all , axis=1)], axis=2) + + d_sig_all = Q_per_d * ( tf.pow((batch_points - batch_mu) / batch_sig,2) - 1) + d_sigma = (1 / (n_points * tf.sqrt(2*w_per_batch_per_d))) * tf.concat( + [tf.reduce_max(d_sig_all, axis=1), tf.reduce_min(d_sig_all, axis=1), tf.reduce_sum(d_sig_all , axis=1)], axis=2) + + #Power normaliation + alpha = 0.5 + d_pi = tf.sign(d_pi) * tf.pow(tf.abs(d_pi),alpha) + d_mu = tf.sign(d_mu) * tf.pow(tf.abs(d_mu), alpha) + d_sigma = tf.sign(d_sigma) * tf.pow(tf.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = tf.nn.l2_normalize(d_pi, dim=1) + d_mu = tf.nn.l2_normalize(d_mu, dim=1) + d_sigma = tf.nn.l2_normalize(d_sigma, dim=1) + + + if flatten: + #flatten d_mu and d_sigma + d_pi = tf.contrib.layers.flatten(tf.transpose(d_pi, perm=[0, 2, 1])) + d_mu = tf.contrib.layers.flatten(tf.transpose(d_mu,perm=[0,2,1])) + d_sigma = tf.contrib.layers.flatten(tf.transpose(d_sigma,perm=[0,2,1])) + fv = tf.concat([d_pi, d_mu, d_sigma], axis=1) + else: + fv = tf.concat([d_pi, d_mu, d_sigma], axis=2) + fv = tf.transpose(fv, perm=[0, 2, 1]) + + return fv + + +def get_3dmfv_sym(points, w, mu, sigma, sym_type='max', flatten=True): + """ + Compute the 3d modified fisher vector (on the gpu using tf) given the gmm model parameters (w,mu,sigma) and a set of points for classification network + modify to use a symmetric function ( min, max, ss) function instead of sum. + Input: + points: B X N x 3 tensor of XYZ points + w: B X n_gaussians tensor of gaussian weights + mu: B X n_gaussians X 63 tensor of gaussian cetnters + sigma: B X n_gaussians X 3 tensor of stddev of diagonal covariance + Output: + fv: B X 7*n_gaussians tensor of the fisher vector + sym_type: string 'max' or 'min', or 'ss' + """ + n_batches = points.shape[0].value + n_points = points.shape[1].value + n_gaussians = mu.shape[0].value + D = mu.shape[1].value + + #Expand dimension for batch compatibility + batch_sig = tf.tile(tf.expand_dims(sigma,0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_sig = tf.tile(tf.expand_dims(batch_sig, 0), [n_batches, 1, 1,1]) #n_batches X n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(mu, 0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) #n_batches X n_points X n_gaussians X D + batch_w = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), 0), [n_batches, n_points, 1]) #n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = tf.tile(tf.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) #n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + #Compute derivatives + w_per_batch_per_d = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), -1), [n_batches, 1, D]) #n_batches X n_gaussians X 128*D (D for min and D for max) + + #Define multivariate noraml distributions + mvn = tf.contrib.distributions.MultivariateNormalDiag(loc=batch_mu, scale_diag=batch_sig) + #Compute probability per point + p_per_point = mvn.prob(batch_points) + w_p = tf.multiply(p_per_point,batch_w) + Q = w_p/tf.tile(tf.expand_dims(tf.reduce_sum(w_p, axis=-1), -1),[1, 1, n_gaussians]) + Q_per_d = tf.tile(tf.expand_dims(Q, -1), [1, 1, 1, D]) + + # Compute derivatives and take max and min + #Method 128: direct derivative formula (convertible to min-max) + #s0 = tf.reduce_sum(Q, fv_noise) # n_batches X n_gaussians + #d_pi = (s0 - n_points * w_per_batch) / (tf.sqrt(w_per_batch) * n_points) + d_pi_all = tf.expand_dims((Q - batch_w)/ (tf.sqrt(batch_w) * n_points), -1) + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_sig_all = Q_per_d * (tf.pow((batch_points - batch_mu) / batch_sig, 2) - 1) + if sym_type == 'max': + d_pi = tf.reduce_max(d_pi_all , axis=1) + d_mu = (1 / (n_points * tf.sqrt(w_per_batch_per_d))) * tf.reduce_max(d_mu_all , axis=1) + d_sigma = (1 / (n_points * tf.sqrt(2*w_per_batch_per_d))) * tf.reduce_max(d_sig_all, axis=1) + elif sym_type == 'min': + d_pi = tf.reduce_min(d_pi_all , axis=1) + d_mu = (1 / (n_points * tf.sqrt(w_per_batch_per_d))) * tf.reduce_min(d_mu_all , axis=1) + d_sigma = (1 / (n_points * tf.sqrt(2*w_per_batch_per_d))) * tf.reduce_min(d_sig_all, axis=1) + elif sym_type == 'ss': + d_pi = tf.reduce_sum(tf.square(d_pi_all), axis=1) + d_mu = (1 / (n_points * tf.sqrt(w_per_batch_per_d))) * tf.reduce_sum(tf.square(d_mu_all), axis=1) + d_sigma = (1 / (n_points * tf.sqrt(2 * w_per_batch_per_d))) * tf.reduce_sum(tf.square(d_sig_all), axis=1) + + #Power normaliation + alpha = 0.5 + d_pi = tf.sign(d_pi) * tf.pow(tf.abs(d_pi),alpha) + d_mu = tf.sign(d_mu) * tf.pow(tf.abs(d_mu), alpha) + d_sigma = tf.sign(d_sigma) * tf.pow(tf.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = tf.nn.l2_normalize(d_pi, dim=1) + d_mu = tf.nn.l2_normalize(d_mu, dim=1) + d_sigma = tf.nn.l2_normalize(d_sigma, dim=1) + + + if flatten: + #flatten d_mu and d_sigma + d_pi = tf.contrib.layers.flatten(tf.transpose(d_pi, perm=[0, 2, 1])) + d_mu = tf.contrib.layers.flatten(tf.transpose(d_mu,perm=[0,2,1])) + d_sigma = tf.contrib.layers.flatten(tf.transpose(d_sigma,perm=[0,2,1])) + fv = tf.concat([d_pi, d_mu, d_sigma], axis=1) + else: + fv = tf.concat([d_pi, d_mu, d_sigma], axis=2) + fv = tf.transpose(fv, perm=[0, 2, 1]) + + return fv + + +def get_fv_tf(points, w, mu, sigma, flatten=True, normalize=True): + """ + Compute the fisher vector (on the gpu using tf) given the gmm model parameters (w,mu,sigma) and a set of points for classification network + Input: + points: B X N x 3 tensor of XYZ points + w: B X n_gaussians tensor of gaussian weights + mu: B X n_gaussians X 63 tensor of gaussian cetnters + sigma: B X n_gaussians X 3 tensor of stddev of diagonal covariance + Output: + fv: B X 7*n_gaussians tensor of the fisher vector + """ + n_batches = points.shape[0].value + n_points = points.shape[1].value + n_gaussians = mu.shape[0].value + D = mu.shape[1].value + + #Expand dimension for batch compatibility + batch_sig = tf.tile(tf.expand_dims(sigma,0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_sig = tf.tile(tf.expand_dims(batch_sig, 0), [n_batches, 1, 1,1]) #n_batches X n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(mu, 0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) #n_batches X n_points X n_gaussians X D + batch_w = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), 0), [n_batches, n_points, 1]) #n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = tf.tile(tf.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) #n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + #Compute derivatives + w_per_batch_per_d = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), -1), [n_batches, 1, D]) #n_batches X n_gaussians X 128*D (D for min and D for max) + + #Define multivariate noraml distributions + mvn = tf.contrib.distributions.MultivariateNormalDiag(loc=batch_mu, scale_diag=batch_sig) + #Compute probability per point + p_per_point = mvn.prob(batch_points) + + w_p = tf.multiply(p_per_point,batch_w) + Q = w_p/tf.tile(tf.expand_dims(tf.reduce_sum(w_p, axis=-1), -1),[1, 1, n_gaussians]) + Q_per_d = tf.tile(tf.expand_dims(Q, -1), [1, 1, 1, D]) + + # Compute derivatives and take max and min + d_pi_all = tf.expand_dims((Q - batch_w)/ (tf.sqrt(batch_w) * n_points), -1) + d_pi = tf.reduce_sum(d_pi_all , axis=1) + + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_mu = (1 / (n_points * tf.sqrt(w_per_batch_per_d))) * tf.reduce_sum(d_mu_all , axis=1) + + d_sig_all = Q_per_d * ( tf.pow((batch_points - batch_mu) / batch_sig,2) - 1) + d_sigma = (1 / (n_points * tf.sqrt(2*w_per_batch_per_d))) * tf.reduce_sum(d_sig_all , axis=1) + + if normalize: + #Power normaliation + alpha = 0.5 + d_pi = tf.sign(d_pi) * tf.pow(tf.abs(d_pi),alpha) + d_mu = tf.sign(d_mu) * tf.pow(tf.abs(d_mu), alpha) + d_sigma = tf.sign(d_sigma) * tf.pow(tf.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = tf.nn.l2_normalize(d_pi, dim=1) + d_mu = tf.nn.l2_normalize(d_mu, dim=1) + d_sigma = tf.nn.l2_normalize(d_sigma, dim=1) + + if flatten: + #flatten d_mu and d_sigma + d_pi = tf.contrib.layers.flatten(tf.transpose(d_pi, perm=[0, 2, 1])) + d_mu = tf.contrib.layers.flatten(tf.transpose(d_mu,perm=[0,2,1])) + d_sigma = tf.contrib.layers.flatten(tf.transpose(d_sigma,perm=[0,2,1])) + fv = tf.concat([d_pi, d_mu, d_sigma], axis=1) + else: + fv = tf.concat([d_pi, d_mu, d_sigma], axis=2) + fv = tf.transpose(fv, perm=[0, 2, 1]) + + # fv = fv / tf.norm(fv) + return fv + + +def get_fv_tf_no_mvn(points, w, mu, sigma, flatten=True, normalize=True): + """ + Compute the fisher vector (on the gpu using tf without using the mvn class) given the gmm model parameters (w,mu,sigma) and a set of points for classification network + Input: + points: B X N x 3 tensor of XYZ points + w: B X n_gaussians tensor of gaussian weights + mu: B X n_gaussians X 63 tensor of gaussian cetnters + sigma: B X n_gaussians X 3 tensor of stddev of diagonal covariance + Output: + fv: B X 7*n_gaussians tensor of the fisher vector + """ + n_batches = points.shape[0].value + n_points = points.shape[1].value + n_gaussians = mu.shape[0].value + D = mu.shape[1].value + + #Expand dimension for batch compatibility + batch_sig = tf.tile(tf.expand_dims(sigma,0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_sig = tf.tile(tf.expand_dims(batch_sig, 0), [n_batches, 1, 1,1]) #n_batches X n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(mu, 0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) #n_batches X n_points X n_gaussians X D + batch_w = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), 0), [n_batches, n_points, 1]) #n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = tf.tile(tf.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) #n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + #Compute derivatives + w_per_batch_per_d = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), -1), [n_batches, 1, D]) #n_batches X n_gaussians X 128*D (D for min and D for max) + + #Define multivariate noraml distributions + # mvn = tf.contrib.distributions.MultivariateNormalDiag(loc=batch_mu, scale_diag=batch_sig) + #Compute probability per point + # p_per_point = mvn.prob(batch_points) + p_per_point = (1.0/(tf.pow(2.0*np.pi, D/2.0) * tf.pow(batch_sig[:,:,:,0],D))) * tf.exp(-0.5 * tf.reduce_sum(tf.square((batch_points - batch_mu) / batch_sig) , axis = 3)) + w_p = tf.multiply(p_per_point,batch_w) + Q = w_p/tf.tile(tf.expand_dims(tf.reduce_sum(w_p, axis=-1), -1),[1, 1, n_gaussians]) + Q_per_d = tf.tile(tf.expand_dims(Q, -1), [1, 1, 1, D]) + + # Compute derivatives and take max and min + + d_pi_all = tf.expand_dims((Q - batch_w)/ (tf.sqrt(batch_w) ), -1) + d_pi = tf.reduce_sum(d_pi_all , axis=1) + + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_mu = (1 / ( tf.sqrt(w_per_batch_per_d))) * tf.reduce_sum(d_mu_all , axis=1) + + d_sig_all = Q_per_d * ( tf.square((batch_points - batch_mu) / batch_sig) - 1) + d_sigma = (1 / ( tf.sqrt(2*w_per_batch_per_d))) * tf.reduce_sum(d_sig_all , axis=1) + + # number of points normaliation + d_pi = d_pi / n_points + d_mu = d_mu / n_points + d_sigma = d_sigma / n_points + + if normalize: + #Power normaliation + alpha = 0.5 + d_pi = tf.sign(d_pi) * tf.pow(tf.abs(d_pi),alpha) + d_mu = tf.sign(d_mu) * tf.pow(tf.abs(d_mu), alpha) + d_sigma = tf.sign(d_sigma) * tf.pow(tf.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = tf.nn.l2_normalize(d_pi, dim=1) + d_mu = tf.nn.l2_normalize(d_mu, dim=1) + d_sigma = tf.nn.l2_normalize(d_sigma, dim=1) + + if flatten: + #flatten d_mu and d_sigma + d_pi = tf.contrib.layers.flatten(tf.transpose(d_pi, perm=[0, 2, 1])) + d_mu = tf.contrib.layers.flatten(tf.transpose(d_mu,perm=[0,2,1])) + d_sigma = tf.contrib.layers.flatten(tf.transpose(d_sigma,perm=[0,2,1])) + fv = tf.concat([d_pi, d_mu, d_sigma], axis=1) + else: + fv = tf.concat([d_pi, d_mu, d_sigma], axis=2) + fv = tf.transpose(fv, perm=[0, 2, 1]) + + return fv + + +def get_3dmfv_seg(points, w, mu, sigma, flatten=True, original_n_points=None): + """ + Compute the fisher vector (on the gpu using tf) given the gmm model parameters (w,mu,sigma) and a set of points for segmentation network + Input: + points: B X N x 3 tensor of XYZ points + w: B X n_gaussians tensor of gaussian weights + mu: B X n_gaussians X 3 tensor of gaussian cetnters + sigma: B X n_gaussians X 3 tensor of stddev of diagonal covariance + Output: + fv: B X 20*n_gaussians tensor of the fisher vector + fv_per_point: B X N X 20*n_gaussians tensor of the fisher vector + """ + n_gaussians = mu.shape[0].value + D = mu.shape[1].value + n_batches = points.shape[0].value + + if original_n_points is None: + n_points = points.shape[1].value + else: + n_points = original_n_points + + #Expand dimension for batch compatibility + batch_sig = tf.tile(tf.expand_dims(sigma,0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_sig = tf.tile(tf.expand_dims(batch_sig, 0), [n_batches, 1, 1,1]) #n_batches X n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(mu, 0),[n_points, 1, 1]) #n_points X n_gaussians X D + batch_mu = tf.tile(tf.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) #n_batches X n_points X n_gaussians X D + batch_w = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), 0), [n_batches, n_points, 1]) #n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = tf.tile(tf.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) #n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + #Compute derivatives + w_per_batch_per_d = tf.tile(tf.expand_dims(tf.expand_dims(w, 0), -1), [n_batches, 1, 3*D]) #n_batches X n_gaussians X 128*D (D for min and D for max) + + + #Define multivariate noraml distributions + mvn = tf.contrib.distributions.MultivariateNormalDiag(loc=batch_mu, scale_diag=batch_sig) + #Compute probability per point + p_per_point = mvn.prob(batch_points) + + w_p = tf.multiply(p_per_point,batch_w) + Q = w_p/tf.tile(tf.expand_dims(tf.reduce_sum(w_p, axis=-1), -1),[1, 1, n_gaussians]) + Q_per_d = tf.tile(tf.expand_dims(Q, -1), [1, 1, 1, D]) + + # Compute derivatives and take max and min + d_pi_all = tf.expand_dims((Q - batch_w)/ (tf.sqrt(batch_w) * tf.cast(original_n_points, tf.float32)), -1) + d_pi = tf.concat( + [tf.reduce_max(d_pi_all , axis=1), tf.reduce_sum(d_pi_all , axis=1)], axis=2) + + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_mu = (1 / (tf.cast(original_n_points, tf.float32) * tf.sqrt(w_per_batch_per_d))) * tf.concat( + [tf.reduce_max(d_mu_all , axis=1), tf.reduce_min(d_mu_all , axis=1), tf.reduce_sum(d_mu_all , axis=1)], axis=2) + + d_sig_all = Q_per_d * ( tf.pow((batch_points - batch_mu) / batch_sig,2) - 1) + d_sigma = (1 / (tf.cast(original_n_points, tf.float32) * tf.sqrt(2*w_per_batch_per_d))) * tf.concat( + [tf.reduce_max(d_sig_all, axis=1), tf.reduce_min(d_sig_all, axis=1), tf.reduce_sum(d_sig_all , axis=1)], axis=2) + + #Power normaliation + alpha = 0.5 + d_pi = tf.sign(d_pi) * tf.pow(tf.abs(d_pi),alpha) + d_mu = tf.sign(d_mu) * tf.pow(tf.abs(d_mu), alpha) + d_sigma = tf.sign(d_sigma) * tf.pow(tf.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = tf.nn.l2_normalize(d_pi, dim=1) + d_mu = tf.nn.l2_normalize(d_mu, dim=1) + d_sigma = tf.nn.l2_normalize(d_sigma, dim=1) + + + if flatten: + #flatten d_mu and d_sigma + d_pi = tf.contrib.layers.flatten(tf.transpose(d_pi, perm=[0, 2, 1])) + d_mu = tf.contrib.layers.flatten(tf.transpose(d_mu,perm=[0,2,1])) + d_sigma = tf.contrib.layers.flatten(tf.transpose(d_sigma,perm=[0,2,1])) + fv = tf.concat([d_pi, d_mu, d_sigma], axis=1) + else: + fv = tf.concat([d_pi, d_mu, d_sigma], axis=2) + fv = tf.transpose(fv, perm=[0, 2, 1]) + fv_per_point = tf.concat([d_pi_all, d_mu_all, d_sig_all], axis=3) + fv_per_point = tf.reshape(fv_per_point,[n_batches, n_points, n_gaussians * 7]) + return fv, fv_per_point + + +def get_session(gpu_idx, limit_gpu=True): + ''' + Creates a session while limiting GPU usage + Input: + gpu_idx: Index of GPU to run the session on + limit_gpu: boolean if to limit the gpu usage or not + Output: + sess: a tensorflow session + ''' + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + if limit_gpu: + gpu_idx = str(gpu_idx) + os.environ["CUDA_VISIBLE_DEVICES"] = gpu_idx + else: + os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1, 2, 3" # Change according to your setup + sess = tf.Session(config=config) + return sess + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/utils.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/utils.py new file mode 100644 index 0000000..c47f97c --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/utils.py @@ -0,0 +1,340 @@ +from sklearn.mixture import GaussianMixture +from sklearn.preprocessing import normalize +import os +import pickle +import numpy as np + +import provider + + +def get_gmm(points, n_gaussians, NUM_POINT, type='grid', variance=0.05, n_scales=3, D=3): + """ + Compute weights, means and covariances for a gmm with two possible types 'grid' (2D/3D) and 'learned' + + :param points: num_points_per_model*nummodels X 3 - xyz coordinates + :param n_gaussians: scalar of number of gaussians / number of subdivisions for grid type + :param NUM_POINT: number of points per model + :param type: 'grid' / 'leared' toggle between gmm methods + :param variance: gaussian variance for grid type gmm + :return gmm: gmm: instance of sklearn GaussianMixture (GMM) object Gauassian mixture model + """ + if type == 'grid': + #Generate gaussians on a grid - supports only axis equal subdivisions + if n_gaussians >= 32: + print('Warning: You have set a very large number of subdivisions.') + if not(isinstance(n_gaussians, list)): + if D == 2: + gmm = get_2d_grid_gmm(subdivisions=[n_gaussians, n_gaussians], variance=variance) + elif D == 3: + gmm = get_3d_grid_gmm(subdivisions=[n_gaussians, n_gaussians, n_gaussians], variance=variance) + else: + ValueError('Wrong dimension. This supports either D=2 or D=3') + + elif type == 'learn': + #learn the gmm from given data and save to gmm.p file, if already learned then load it from existing gmm.p file for speed + if isinstance(n_gaussians, list): + raise ValueError('Wrong number of gaussians: non-grid value must be a scalar') + print("Computing GMM from data - this may take a while...") + info_str = "g" + str(n_gaussians) + "_N" + str(len(points)) + "_M" + str(len(points) / NUM_POINT) + gmm_dir = "gmms" + if not os.path.exists(gmm_dir): + os.mkdir(gmm_dir) + filename = gmm_dir + "/gmm_" + info_str + ".p" + if os.path.isfile(filename): + gmm = pickle.load(open(filename, "rb")) + else: + gmm = get_learned_gmm(points, n_gaussians, covariance_type='diag') + pickle.dump(gmm, open( filename, "wb")) + else: + ValueError('Wrong type of GMM [grid/learn]') + + return gmm + + +def get_learned_gmm(points, n_gaussians, covariance_type='diag'): + """ + Learn weights, means and covariances for a gmm based on input data using sklearn EM algorithm + + :param points: num_points_per_model*nummodels X 3 - xyz coordinates + :param n_gaussians: scalar of number of gaussians / 3 element list of number of subdivisions for grid type + :param covariance_type: Specify the type of covariance mmatrix : 'diag', 'full','tied', 'spherical' (Note that the Fisher Vector method relies on diagonal covariance matrix) + See sklearn documentation : http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html + :return gmm: gmm: instance of sklearn GaussianMixture (GMM) object Gauassian mixture model + """ + gmm = GaussianMixture(n_components = n_gaussians, covariance_type=covariance_type) + gmm.fit(points.astype(np.float64)) + return gmm + + +def get_3d_grid_gmm(subdivisions=[5,5,5], variance=0.04): + """ + Compute the weight, mean and covariance of a gmm placed on a 3D grid + :param subdivisions: 2 element list of number of subdivisions of the 3D space in each axes to form the grid + :param variance: scalar for spherical gmm.p + :return gmm: gmm: instance of sklearn GaussianMixture (GMM) object Gauassian mixture model + """ + # n_gaussians = reduce(lambda x, y: x*y,subdivisions) + n_gaussians = np.prod(np.array(subdivisions)) + step = [1.0/(subdivisions[0]), 1.0/(subdivisions[1]), 1.0/(subdivisions[2])] + + means = np.mgrid[ step[0]-1: 1.0-step[0]: complex(0, subdivisions[0]), + step[1]-1: 1.0-step[1]: complex(0, subdivisions[1]), + step[2]-1: 1.0-step[2]: complex(0, subdivisions[2])] + means = np.reshape(means, [3, -1]).T + covariances = variance*np.ones_like(means) + weights = (1.0/n_gaussians)*np.ones(n_gaussians) + gmm = GaussianMixture(n_components=n_gaussians, covariance_type='diag') + gmm.weights_ = weights + gmm.covariances_ = covariances + gmm.means_ = means + from sklearn.mixture.gaussian_mixture import _compute_precision_cholesky + gmm.precisions_cholesky_ = _compute_precision_cholesky(covariances, 'diag') + return gmm + + +def get_2d_grid_gmm(subdivisions=[5, 5], variance=0.04): + """ + Compute the weight, mean and covariance of a 2D gmm placed on a 2D grid + + :param subdivisions: 2 element list of number of subdivisions of the 2D space in each axes to form the grid + :param variance: scalar for spherical gmm.p + :return gmm: gmm: instance of sklearn GaussianMixture (GMM) object Gauassian mixture model + """ + # n_gaussians = reduce(lambda x, y: x*y,subdivisions) + n_gaussians = np.prod(np.array(subdivisions)) + step = [1.0/(subdivisions[0]), 1.0/(subdivisions[1])] + + means = np.mgrid[step[0]-1: 1.0-step[0]: complex(0, subdivisions[0]), + step[1]-1: 1.0-step[1]: complex(0, subdivisions[1])] + means = np.reshape(means, [2,-1]).T + covariances = variance*np.ones_like(means) + weights = (1.0/n_gaussians)*np.ones(n_gaussians) + gmm = GaussianMixture(n_components=n_gaussians, covariance_type='diag') + gmm.weights_ = weights + gmm.covariances_ = covariances + gmm.means_ = means + from sklearn.mixture.gaussian_mixture import _compute_precision_cholesky + gmm.precisions_cholesky_ = _compute_precision_cholesky(covariances, 'diag') + return gmm + + +def get_fisher_vectors(points,gmm, normalization=True): + """ + Compute the fisher vector representation of a point cloud or a batch of point clouds + + :param points: n_points x 3 / B x n_points x 3 + :param gmm: sklearn MixtureModel class containing the gmm.p parameters.p + :return: fisher vector representation for a single point cloud or a batch of point clouds + """ + + if len(points.shape) == 2: + # single point cloud + fv = fisher_vector(points, gmm, normalization=normalization) + else: + # Batch of point clouds + fv = [] + n_models = points.shape[0] + for i in range(n_models): + fv.append(fisher_vector(points[i], gmm, normalization=True)) + fv = np.array(fv) + return fv + + +def fisher_vector(xx, gmm, normalization=True): + """ + Computes the Fisher vector on a set of descriptors. + code from : https://gist.github.cnsom/danoneata/9927923 + Parameters + ---------- + xx: array_like, shape (N, D) or (D, ) + The set of descriptors + + gmm: instance of sklearn mixture.GMM object + Gauassian mixture model of the descriptors. + + Returns + ------- + fv: array_like, shape (K + 128 * D * K, ) + Fisher vector (derivatives with respect to the mixing weights, means + and variances) of the given descriptors. + + Reference + --------- + Sanchez, J., Perronnin, F., Mensink, T., & Verbeek, J. (2013). + Image classification with the fisher vector: Theory and practice. International journal of computer vision, 105(64), 222-245. + https://hal.inria.fr/hal-00830491/file/journal.pdf + + """ + xx = np.atleast_2d(xx) + n_points = xx.shape[0] + D = gmm.means_.shape[1] + tiled_weights = np.tile(np.expand_dims(gmm.weights_, axis=-1), [1, D]) + + #start = time.time() + # Compute posterior probabilities. + Q = gmm.predict_proba(xx) # NxK + #mid = time.time() + #print("Computing the probabilities took ", str(mid-start)) + #Compute Derivatives + + # Compute the sufficient statistics of descriptors. + s0 = np.sum(Q, 0)[:, np.newaxis] / n_points + s1 = np.dot(Q.T, xx) / n_points + s2 = np.dot(Q.T, xx ** 2) / n_points + + d_pi = (s0.squeeze() - n_points * gmm.weights_) / np.sqrt(gmm.weights_) + d_mu = (s1 - gmm.means_ * s0 ) / np.sqrt(tiled_weights*gmm.covariances_) + d_sigma = ( + + s2 + - 2 * s1 * gmm.means_ + + s0 * gmm.means_ ** 2 + - s0 * gmm.covariances_ + ) / (np.sqrt(2*tiled_weights)*gmm.covariances_) + + #Power normaliation + alpha = 0.5 + d_pi = np.sign(d_pi) * np.power(np.absolute(d_pi),alpha) + d_mu = np.sign(d_mu) * np.power(np.absolute(d_mu), alpha) + d_sigma = np.sign(d_sigma) * np.power(np.absolute(d_sigma), alpha) + + if normalization == True: + d_pi = normalize(d_pi[:,np.newaxis], axis=0).ravel() + d_mu = normalize(d_mu, axis=0) + d_sigma = normalize(d_sigma, axis=0) + # Merge derivatives into a vector. + + #print("comnputing the derivatives took ", str(time.time()-mid)) + + return np.hstack((d_pi, d_mu.flatten(), d_sigma.flatten())) + + +def fisher_vector_per_point( xx, gmm): + """ + see notes for above function - performs operations per point + + :param xx: array_like, shape (N, D) or (D, )- The set of descriptors + :param gmm: instance of sklearn mixture.GMM object - Gauassian mixture model of the descriptors. + :return: fv_per_point : fisher vector per point (derivative by w, derivative by mu, derivative by sigma) + """ + xx = np.atleast_2d(xx) + n_points = xx.shape[0] + n_gaussians = gmm.means_.shape[0] + D = gmm.means_.shape[1] + + sig2 = np.array([gmm.covariances_.T[0, :], gmm.covariances_.T[1, :], gmm.covariances_.T[2,:]]).T + sig2_tiled = np.tile(np.expand_dims(sig2, axis=0), [n_points, 1, 1]) + + # Compute derivativees per point and then sum. + Q = gmm.predict_proba(xx) # NxK + tiled_weights = np.tile(np.expand_dims(gmm.weights_, axis=-1), [1, D]) + sqrt_w = np.sqrt(tiled_weights) + + d_pi = (Q - np.tile(np.expand_dims(gmm.weights_, 0), [n_points, 1])) / np.sqrt(np.tile(np.expand_dims(gmm.weights_, 0), [n_points, 1])) + x_mu = np.tile( np.expand_dims(xx, axis=2), [1, 1, n_gaussians]) - np.tile(np.expand_dims(gmm.means_.T, axis=0), [n_points, 1, 1]) + x_mu = np.swapaxes(x_mu, 1, 2) + d_mu = (np.tile(np.expand_dims(Q, -1), D) * x_mu) / (np.sqrt(sig2_tiled) * sqrt_w) + + d_sigma = np.tile(np.expand_dims(Q, -1), 3)*((np.power(x_mu,2)/sig2_tiled)-1)/(np.sqrt(2)*sqrt_w) + + fv_per_point = (d_pi, d_mu, d_sigma) + return fv_per_point + + +def l2_normalize(v, dim=1): + """ + Normalize a vector along a dimension + + :param v: a vector or matrix to normalize + :param dim: the dimension along which to normalize + :return: normalized v along dim + """ + norm = np.linalg.norm(v, axis=dim) + if norm.all() == 0: + return v + return v / norm + + +def get_3DmFV(points, w, mu, sigma, normalize=True): + """ + Compute the 3D modified fisher vectors given the gmm model parameters (w,mu,sigma) and a set of points + For faster performance (large batches) use the tensorflow version + + :param points: B X N x 3 tensor of XYZ points + :param w: B X n_gaussians tensor of gaussian weights + :param mu: B X n_gaussians X 3 tensor of gaussian cetnters + :param sigma: B X n_gaussians X 3 tensor of stddev of diagonal covariance + :return: fv: B X 20*n_gaussians tensor of the fisher vector + """ + n_batches = points.shape[0] + n_points = points.shape[1] + n_gaussians = mu.shape[0] + D = mu.shape[1] + + # Expand dimension for batch compatibility + batch_sig = np.tile(np.expand_dims(sigma, 0), [n_points, 1, 1]) # n_points X n_gaussians X D + batch_sig = np.tile(np.expand_dims(batch_sig, 0), [n_batches, 1, 1, 1]) # n_batches X n_points X n_gaussians X D + batch_mu = np.tile(np.expand_dims(mu, 0), [n_points, 1, 1]) # n_points X n_gaussians X D + batch_mu = np.tile(np.expand_dims(batch_mu, 0), [n_batches, 1, 1, 1]) # n_batches X n_points X n_gaussians X D + batch_w = np.tile(np.expand_dims(np.expand_dims(w, 0), 0), [n_batches, n_points, + 1]) # n_batches X n_points X n_guassians X D - should check what happens when weights change + batch_points = np.tile(np.expand_dims(points, -2), [1, 1, n_gaussians, + 1]) # n_batchesXn_pointsXn_gaussians_D # Generating the number of points for each gaussian for separate computation + + # Compute derivatives + w_per_batch_per_d = np.tile(np.expand_dims(np.expand_dims(w, 0), -1), + [n_batches, 1, 3*D]) # n_batches X n_gaussians X 3*D (D for min and D for max) + + # Define multivariate noraml distributions + # Compute probability per point + p_per_point = (1.0 / (np.power(2.0 * np.pi, D / 2.0) * np.power(batch_sig[:, :, :, 0], D))) * np.exp( + -0.5 * np.sum(np.square((batch_points - batch_mu) / batch_sig), axis=3)) + + w_p = p_per_point + Q = w_p # enforcing the assumption that the sum is 1 + Q_per_d = np.tile(np.expand_dims(Q, -1), [1, 1, 1, D]) + + d_pi_all = np.expand_dims((Q - batch_w) / (np.sqrt(batch_w)), -1) + d_pi = np.concatenate([np.max(d_pi_all, axis=1), np.sum(d_pi_all, axis=1)], axis=2) + + d_mu_all = Q_per_d * (batch_points - batch_mu) / batch_sig + d_mu = (1 / (np.sqrt(w_per_batch_per_d))) * np.concatenate([np.max(d_mu_all, axis=1), np.min(d_mu_all, axis=1), np.sum(d_mu_all, axis=1)], axis=2) + + d_sig_all = Q_per_d * (np.square((batch_points - batch_mu) / batch_sig) - 1) + d_sigma = (1 / (np.sqrt(2 * w_per_batch_per_d))) * np.concatenate([np.max(d_sig_all, axis=1), np.min(d_sig_all, axis=1), np.sum(d_sig_all, axis=1)], axis=2) + + # number of points normaliation + d_pi = d_pi / n_points + d_mu = d_mu / n_points + d_sigma =d_sigma / n_points + + if normalize: + # Power normaliation + alpha = 0.5 + d_pi = np.sign(d_pi) * np.power(np.abs(d_pi), alpha) + d_mu = np.sign(d_mu) * np.power(np.abs(d_mu), alpha) + d_sigma = np.sign(d_sigma) * np.power(np.abs(d_sigma), alpha) + + # L2 normaliation + d_pi = np.array([l2_normalize(d_pi[i, :, :], dim=0) for i in range(n_batches)]) + d_mu = np.array([l2_normalize(d_mu[i, :, :], dim=0) for i in range(n_batches)]) + d_sigma = np.array([l2_normalize(d_sigma[i, :, :], dim=0) for i in range(n_batches)]) + + + fv = np.concatenate([d_pi, d_mu, d_sigma], axis=2) + fv = np.transpose(fv, axes=[0, 2, 1]) + + return fv + + +if __name__ == "__main__": + + model_idx = 0 + num_points = 1024 + gmm = get_3d_grid_gmm(subdivisions=[5, 5, 5], variance=0.04) + points = provider.load_single_model(model_idx=model_idx, train_file_idxs=0, num_points=num_points) + points = np.tile(np.expand_dims(points, 0), [128, 1, 1]) + + fv_gpu = get_fisher_vectors(points, gmm, normalization=True) + + + diff --git a/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/visualization.py b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/visualization.py new file mode 100644 index 0000000..73f981b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/3DmFV-Net/utils/visualization.py @@ -0,0 +1,694 @@ +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.cm as cm +import sklearn.metrics +import itertools +import os +import sys +import pickle +import tensorflow as tf + +import provider +import utils +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'utils/')) +import pc_util +import tf_util +from skimage.transform import rescale, resize, downscale_local_mean +import matplotlib.colors as mcolors +import matplotlib.image as mpimg +from mpl_toolkits.axes_grid1 import AxesGrid +from mpl_toolkits.mplot3d import proj3d + +def axisEqual3D(ax): + extents = np.array([getattr(ax, 'get_{}lim'.format(dim))() for dim in 'xyz']) + sz = extents[:,1] - extents[:,0] + centers = np.mean(extents, axis=1) + maxsize = max(abs(sz)) + r = maxsize/2 + for ctr, dim in zip(centers, 'xyz'): + getattr(ax, 'set_{}lim'.format(dim))(ctr - r, ctr + r) + +def orthogonal_proj(zfront, zback): + a = (zfront+zback)/(zfront-zback) + b = -2*(zfront*zback)/(zfront-zback) + return np.array([[1,0,0,0], + [0,1,0,0], + [0,0,a,b], + [0,0,0,zback]]) + + +def draw_point_cloud(points, output_filename='default_output_name', display=False, ax='none', color='b', vmin=0, vmax=1): + """ points is a Nx3 numpy array """ + if ax=='none': + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2], marker='.', color=color, vmin=vmin,vmax=vmax) + + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + + ax.set_xlim([-1,1]) + ax.set_ylim([-1, 1]) + ax.set_zlim([-1, 1]) + #savefig(output_filename) + if display: + plt.show() + + return ax + + +def draw_gaussians(gmm, ax='none',display=False, mappables=None, thresh=0): + # gmm.p.weights_, gmm.p.means_, gmm.p.covars_ + if mappables is None: + mappables=gmm.weights_ + if ax=='none': + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.view_init(0,0) + set_ax_props(ax) + #proj3d.persp_transformation = orthogonal_proj + + x, y, z = sphere(subdev=20) + n_gaussians = len(gmm.weights_) + for i in range(n_gaussians): + X = x*np.sqrt(gmm.covariances_[i][0]) + gmm.means_[i][0] + Y = y*np.sqrt(gmm.covariances_[i][1]) + gmm.means_[i][1] + Z = z*np.sqrt(gmm.covariances_[i][2]) + gmm.means_[i][2] + cmap = cm.ScalarMappable() + cmap.set_cmap('jet') + cmap.set_clim(np.min(mappables),np.max(mappables)) + c = cmap.to_rgba( mappables[i]) + if mappables[i] > thresh: + ax.plot_surface(X, Y, Z, color=c, alpha=0.3, linewidth=1) + + if display: + plt.show() + return ax + +def draw_gaussian_points(points, g_points, gmm, idx=1, ax=None, display=False, color_val = 0, title=None, vmin=-1,vmax=1, colormap_type='jet'): + if g_points.size==0: + print('No points in this gaussian forthe given threshold...') + return None + if ax==None: + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax = set_ax_props(ax) + if title is not None: + ax.set_title(title) + + + x, y, z = sphere() + n_gaussians = len(gmm.weights_) + + X = x*np.sqrt(gmm.covariances_[idx][0]) + gmm.means_[idx][0] + Y = y*np.sqrt(gmm.covariances_[idx][1]) + gmm.means_[idx][1] + Z = z*np.sqrt(gmm.covariances_[idx][2]) + gmm.means_[idx][2] + + ax.plot_surface(X, Y, Z, alpha=0.4, linewidth=1) + + + cmap = cm.ScalarMappable() + cmap.set_cmap(colormap_type) + cmap.set_clim(vmin, vmax) + c = cmap.to_rgba(color_val) + + #ax = draw_point_cloud(points, ax=ax) + ax = draw_point_cloud(g_points, points, ax=ax, color=c, vmin=vmin, vmax=vmax) + + + + if display: plt.show() + return ax + + +def visualize_fv(fv, gmm, label_title='none', max_n_images=5, normalization=True, export=False, display=False, filename='fisher_vectors',n_scales=1, type='generic', fig_title='Figure'): + """ visualizes the fisher vector representation as an image + INPUT: fv - n_gaussians*7 / B x n_gaussians*7 - fisher vector representation + gmm.p - sklearn GaussianMixture object containing the information about the gmm.p that created the fv + label_title - list of string labels for each model + max_n_images - scalar int limiting the number of images toplot + OUTPUT: None (opens a window and draws the axes) + """ + cmap = "seismic" + scalefactor= 1 if normalization==True else 0.05 + vmin = -1 * scalefactor + vmax = 1 * scalefactor + + n_gaussians = len(gmm.means_) + + if type == 'generic': + derivatives = ["d_pi", "d_mu1", "d_mu2", "d_mu3", "d_sig1", "d_sig2", "d_sig3"] + elif type == 'minmax': + derivatives = ["d_pi_max","d_pi_sum", + "d_mu1_max", "d_mu2_max", "d_mu3_max", + "d_mu1_min", "d_mu2_min", "d_mu3_min", + "d_mu1_sum", "d_mu2_sum", "d_mu3_sum", + "d_sig1_max", "d_sig2_max", "d_sig3_max", + "d_sig1_min", "d_sig2_min", "d_sig3_min", + "d_sig1_sum", "d_sig2_sum", "d_sig3_sum"] + else: + derivatives=[] + + tick_marks = np.arange(len(derivatives)) + + if len(fv.shape) == 1: + # #Single fv + # d_pi = np.expand_dims(fv[0][0:n_gaussians],axis=0) + # d_mu = np.reshape(fv[0][n_gaussians:n_gaussians*(n_features+fv_noise)],[n_features, n_gaussians]) + # d_sigma = np.reshape(fv[0][n_gaussians*(n_features+fv_noise):n_gaussians*(n_covariances + n_features+fv_noise)],[n_covariances, n_gaussians]) + # fv_mat = np.concatenate([d_pi,d_mu,d_sigma], axis=0) + fig = plt.figure() + fv_mat = np.reshape(fv,(-1,int(np.round(n_gaussians/n_scales)))) + plt.imshow(fv_mat, cmap=cmap, vmin=vmin, vmax=vmax) + ax = plt.gca() + ax.set_title(label_title) + ax.set_yticks(tick_marks) + ax.set_yticklabels(derivatives) + + else: + #Batch fv + n_models = fv.shape[0] + if n_models > max_n_images: + n_models = max_n_images #Limit the number of images + f, ax = plt.subplots(n_models, squeeze=False) + f.canvas.set_window_title(fig_title) + for i in range(n_models): + + if len(fv.shape) == 2: + # flattened + fv_mat = np.reshape(fv[i,:], (-1, int(np.round(n_gaussians/n_scales)))) + else: + fv_mat = fv[i,:,:] + + ax[i, 0].imshow(fv_mat, cmap=cmap, vmin=vmin,vmax=vmax) + ax[i, 0].set_title(label_title[i]) + ax[i, 0].set_xticks([]) + ax[i, 0].set_yticks([]) + #ax[i, 0].axis('off') + ax[i, 0].set_yticks(tick_marks) + ax[i, 0].set_yticklabels(derivatives) + ax[i, 0].tick_params(labelsize=3) + + + plt.subplots_adjust(hspace=0.5) + + if export: + plt.savefig(filename + '.pdf',format='pdf', bbox_inches='tight', dpi=1000) + if display: + plt.show() + +def visualize_pc_seg(points, seg, color_map, label_title=None, fig_title='figure', export=False, filename='seg', format='png' ): + """ visualizes the point cloud with color coded segmentation as an image + INPUT: points - XYZ coordinates BXn_pointsx3 + seg - color coded segmentation + OUTPUT: None - exports the image to a file + """ + n_colors = len(color_map) + + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + points = provider.rotate_x_point_cloud_by_angle(points, -0.5*np.pi) + mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', color_map, N=n_colors) + ax.scatter(points[:, 0], points[:, 1], points[:, 2], c=seg, cmap=mycmap, marker='.', vmin=0, vmax=n_colors, edgecolors='none') + ax.view_init(elev=35.264, azim=45) + axisEqual3D(ax) + ax.axis('off') + # plt.show() + + if export: + if format=='png': + plt.savefig(filename + '.png', format='png', bbox_inches='tight', dpi=300) + else: + plt.savefig(filename + '.pdf', format='pdf', bbox_inches='tight', dpi=300) + plt.close() + +def visualize_pc_seg_diff(points, seg_gt, seg_pred, color_map, label_title=None, fig_title='figure', export=False, filename='seg', format='png' ): + """ visualizes the point cloud with red and blut color coding the difference of the prediction from the ground truth + INPUT: + OUTPUT: + """ + + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + points = provider.rotate_x_point_cloud_by_angle(points, -0.5*np.pi) + mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', [[1.0, 0.0, 0.0],[0.0, 0.0, 1.0]], N=2) + diff_idx = np.int32(seg_gt == seg_pred) + + ax.scatter(points[:, 0], points[:, 1], points[:, 2], c=diff_idx, cmap=mycmap, marker='.', vmin=0, vmax=1, edgecolors='none') + ax.view_init(elev=35.264, azim=45) + axisEqual3D(ax) + ax.axis('off') + # plt.show() + + if export: + if format=='png': + plt.savefig(filename + '.png', format='png', bbox_inches='tight', dpi=300) + else: + plt.savefig(filename + '.pdf', format='pdf', bbox_inches='tight', dpi=300) + plt.close() + +def make_segmentation_triplets_for_paper(path, cls='Chair', export=False): + + image_types = ['/gt/', '/pred/', '/diff/'] + output_dir = path + '/triplet_images' + + if cls == 'all': + hdf5_data_dir = os.path.join(BASE_DIR, './hdf5_data') + all_obj_cat_file = os.path.join(hdf5_data_dir, 'all_object_categories.txt') + fin = open(all_obj_cat_file, 'r') + lines = [line.rstrip() for line in fin.readlines()] + objnames = [line.split()[0] for line in lines] + n_objects = len(objnames) + filename = output_dir + '/' + 'all' + else: + n_objects = 1 + filename = output_dir + '/' + cls.title() + objnames = [cls.title()] + + fig = plt.figure() + ax = AxesGrid(fig, 111, nrows_ncols=(n_objects, 3), axes_pad=0.0) + for i, obj in enumerate(objnames): + cls_file_path = path+'/images/' + obj + for j, img_type in enumerate(image_types): + file_names = [os.path.join(cls_file_path + img_type, f) for f in os.listdir(cls_file_path + img_type)] + file_names.sort() + img = mpimg.imread(file_names[0]) + w = img.shape[1] + h = img.shape[0] + x0 = int(np.round(w * 0.25)) + y0 = int(np.round(h * 0.1)) + cropped_img = img[y0:y0+int(0.7*h),x0:x0+int(0.5*w),:] + ax[3*i+j].axis('off') + ax[3*i+j].imshow(cropped_img) + + #Visualize and export + if not os.path.exists(output_dir): + os.mkdir(output_dir) + if export: + plt.savefig(filename + '.png', format='png', bbox_inches='tight', dpi=600) + else: + plt.show() + + +def visualize_pc(points, label_title=None, fig_title='figure', export=False, filename='fv_pc', display=False): + """ visualizes the point cloud representation as an image + INPUT: + OUTPUT: + """ + + f = plt.figure() + ax = plt.axes() + f.canvas.set_window_title(fig_title) + + # plt.get_current_fig_manager().window.wm_geometry(str(pos[0]) + "x" + str(pos[128]) + "+"+str(pos[256])+"+"+str(pos[512])) + + image = pc_util.point_cloud_isoview(points[0,:,:]) + image = np.ma.masked_where(image < 0.0005, image) + cmap = plt.cm.rainbow + cmap.set_bad(color='white') + + ax.imshow(image, cmap=cmap) + ax.get_xaxis().set_visible(False) + ax.get_yaxis().set_visible(False) + ax.set_title(label_title) + #ax.axis('off') + + + if export: + plt.savefig(filename + '.pdf', format='pdf', bbox_inches='tight', dpi=1000) + if display: + plt.show() + + +def visualize_fv_with_pc(fv, points, label_title=None, fig_title='figure', type='minmax', pos=[750,800,0,0], export=False, filename='fv_pc'): + """ visualizes the fisher vector representation as an image + INPUT: fv - B X n_gaussians X n_components - fisher vector representation + points B X n_points X 64 + OUTPUT: None (opens a window and draws the axes) + """ + + n_models = fv.shape[0] + scalefactor = 1 + vmin = -1 * scalefactor + vmax = 1 * scalefactor + + if type == 'generic': + derivatives = ["d_pi", "d_mu1", "d_mu2", "d_mu3", "d_sig1", "d_sig2", "d_sig3"] + elif type == 'minmax': + derivatives = ["d_pi_max","d_pi_sum", + "d_mu1_max", "d_mu2_max", "d_mu3_max", + "d_mu1_min", "d_mu2_min", "d_mu3_min", + "d_mu1_sum", "d_mu2_sum", "d_mu3_sum", + "d_sig1_max", "d_sig2_max", "d_sig3_max", + "d_sig1_min", "d_sig2_min", "d_sig3_min", + "d_sig1_sum", "d_sig2_sum", "d_sig3_sum"] + else: + derivatives = [] + tick_marks = np.arange(len(derivatives)) + + f, ax = plt.subplots(n_models, 2, squeeze=False) + f.canvas.set_window_title(fig_title) + + plt.get_current_fig_manager().window.wm_geometry(str(pos[0]) + "x" + str(pos[1]) + "+"+str(pos[2])+"+"+str(pos[3])) + + for i in range(n_models): + cmap = "seismic" + ax[i, 0].imshow(fv[i, :, :], cmap=cmap, vmin=vmin, vmax=vmax) + ax[i, 0].set_title(label_title[i]) + ax[i, 0].set_xticks([]) + ax[i, 0].set_yticks([]) + # ax[i, 0].axis('off') + ax[i, 0].set_yticks(tick_marks) + ax[i, 0].set_yticklabels(derivatives) + ax[i, 0].tick_params(labelsize=3) + + #image = pc_util.point_cloud_three_views(points[i, :, :]) + image = pc_util.point_cloud_isoview(points[i, :, :]) + image = np.ma.masked_where(image < 0.0005, image) + cmap = plt.cm.rainbow + cmap.set_bad(color='white') + + + ax[i, 1].imshow(image, cmap=cmap) + ax[i, 1].get_xaxis().set_visible(False) + ax[i, 1].get_yaxis().set_visible(False) + + + if export: + plt.savefig(filename + '.pdf', format='pdf', bbox_inches='tight', dpi=1000) + +def visualize_single_fv_with_pc(fv, points, label_title=None, fig_title='figure', type='minmax', pos=[750,800,0,0], export=False, filename='fv_pc'): + """ visualizes the fisher vector representation as an image + INPUT: fv - B X n_gaussians X n_components - fisher vector representation + points B X n_points X 64 + OUTPUT: None (opens a window and draws the axes) + """ + + n_models = fv.shape[0] + cmap = "seismic" + scalefactor = 1 + vmin = -1 * scalefactor + vmax = 1 * scalefactor + + if type == 'generic': + derivatives = ["d_pi", "d_mu1", "d_mu2", "d_mu3", "d_sig1", "d_sig2", "d_sig3"] + elif type == 'minmax': + derivatives = ["d_pi_max","d_pi_sum", + "d_mu1_max", "d_mu2_max", "d_mu3_max", + "d_mu1_min", "d_mu2_min", "d_mu3_min", + "d_mu1_sum", "d_mu2_sum", "d_mu3_sum", + "d_sig1_max", "d_sig2_max", "d_sig3_max", + "d_sig1_min", "d_sig2_min", "d_sig3_min", + "d_sig1_sum", "d_sig2_sum", "d_sig3_sum"] + else: + derivatives = [] + tick_marks = np.arange(len(derivatives)) + + f = plt.figure() + f.canvas.set_window_title(fig_title) + ax1 = plt.axes([0.05, 0.5, 0.45, 0.2]) + ax2 = plt.axes([0.5, 0.5, 0.3, 0.3]) + #plt.get_current_fig_manager().window.wm_geometry(str(pos[0]) + "x" + str(pos[128]) + "+"+str(pos[256])+"+"+str(pos[512])) + + #for i in range(n_models): + ax1.imshow(fv[0,:,:], cmap=cmap, vmin=vmin, vmax=vmax) + ax1.set_title(label_title) + ax1.set_xticks([]) + ax1.set_yticks([]) + # ax[i, 0].axis('off') + ax2.set_yticks(tick_marks) + ax2.set_yticklabels(derivatives) + ax2.tick_params(labelsize=3) + + #image = pc_util.point_cloud_three_views(points[i, :, :]) + image = pc_util.point_cloud_isoview(points[0,:,:]) + image = np.ma.masked_where(image < 0.0005, image) + cmap = plt.cm.rainbow + cmap.set_bad(color='white') + + ax2.imshow(image, cmap=cmap) + ax2.get_xaxis().set_visible(False) + ax2.get_yaxis().set_visible(False) + #fig.patch.set_visible(False) + ax2.axis('off') + + + if export: + plt.savefig(filename + '.pdf', format='pdf', bbox_inches='tight', dpi=1000) + +def visualize_confusion_matrix(y_true, y_pred, classes=None, normalize=False, cmap=cm.jet, export=False, display=False, filename='confusion_mat', n_classes=40): + """ + plots the confusion matrix as and image + :param y_true: list of the GT label of the models + :param y_pred: List of the predicted label of the models + :param classes: List of strings containing the label tags + :param normalize: bool indicating if to normalize the confusion matrix + :param cmap: colormap to use for plotting + :return: None (just plots) + """ + conf_mat = sklearn.metrics.confusion_matrix(y_true, y_pred, labels=range(0,n_classes)) + if normalize: + conf_mat = conf_mat.astype('float') / conf_mat.sum(axis=1)[:, np.newaxis] + + fig = plt.figure() + plt.imshow(conf_mat, cmap=cmap) + ax = plt.gca() + ax.set_title('Confusion Matrix') + + #Write the labels for each row and column + if classes is not None: + tick_marks = np.arange(len(classes)) + plt.xticks(tick_marks, classes, rotation=90, fontsize=5) + plt.yticks(tick_marks, classes, fontsize=5) + + #Write the values in the center of the cell + thresh = conf_mat.max() / 2. + for i, j in itertools.product(range(conf_mat.shape[0]), range(conf_mat.shape[1])): + plt.text(j, i, conf_mat[i, j], + horizontalalignment="center", fontsize=3, + color="white" if conf_mat[i, j] > thresh else "black") + + plt.tight_layout() + plt.ylabel('True label') + plt.xlabel('Predicted label') + + if export: + plt.savefig(filename +'.pdf',format='pdf', bbox_inches='tight', dpi=1000) + if display: + plt.show() + + +def sphere(subdev=10): + #helper function to compute the coordinates of a unit sphere centered at 0,0,0 + # Create a sphere + r = 1 + pi = np.pi + cos = np.cos + sin = np.sin + phi, theta = np.mgrid[0.0:pi:complex(0,subdev), 0.0:2.0 * pi:complex(0,subdev)] + x = r * sin(phi) * cos(theta) + y = r * sin(phi) * sin(theta) + z = r * cos(phi) + return (x,y,z) + + +def set_ax_props(ax): + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + + ax.set_xlim([-1, 1]) + ax.set_ylim([-1, 1]) + ax.set_zlim([-1, 1]) + return ax + + +def visualize_derivatives(points, gmm, gaussian_index,per_point_d_pi, per_point_d_mu, per_point_d_sigma): + + + fig = plt.figure() + # plt.rc('text', usetex=True) + # plt.rc('font', family='serif') + ax1 = fig.add_subplot(131, projection='3d') + ax1 = set_ax_props(ax1) + ax1.view_init(0, 90) + ax2 = fig.add_subplot(132, projection='3d') + ax2 = set_ax_props(ax2) + ax2.view_init(0, 0) + ax3 = fig.add_subplot(133, projection='3d') + ax3 = set_ax_props(ax3) + ax3.view_init(0, 0) + + point_d_mux = per_point_d_mu[:, gaussian_index, 0] + point_d_muy = per_point_d_mu[:, gaussian_index, 1] + point_d_muz = per_point_d_mu[:, gaussian_index, 2] + + d_mu_range = [-1,1] + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax1, display=False, color_val=point_d_mux, + title='mu_x',vmin=d_mu_range[0], vmax=d_mu_range[1], colormap_type='seismic') + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax2, display=False, color_val=point_d_muy, + title='mu_y',vmin=d_mu_range[0], vmax=d_mu_range[1], colormap_type='seismic') + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax3, display=False, color_val=point_d_muz, + title='mu_z',vmin=d_mu_range[0], vmax=d_mu_range[1], colormap_type='seismic') + + fig = plt.figure() + # plt.rc('text', usetex=True) + # plt.rc('font', family='serif') + ax1 = fig.add_subplot(131, projection='3d') + ax1 = set_ax_props(ax1) + ax1.view_init(0, 90) + ax2 = fig.add_subplot(132, projection='3d') + ax2 = set_ax_props(ax2) + ax2.view_init(0, 0) + ax3 = fig.add_subplot(133, projection='3d') + ax3 = set_ax_props(ax3) + ax3.view_init(0, 0) + + point_d_sigx = per_point_d_sigma[:, gaussian_index, 0] + point_d_sigy = per_point_d_sigma[:, gaussian_index, 1] + point_d_sigz = per_point_d_sigma[:, gaussian_index, 2] + + d_sig_range = [-1, 1] + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax1, display=False, color_val=point_d_sigx, + title='sig_x',vmin=d_sig_range[0], vmax=d_sig_range[1], colormap_type='seismic') + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax2, display=False, color_val=point_d_sigy, + title='sig_y',vmin=d_sig_range[0], vmax=d_sig_range[1], colormap_type='seismic') + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax3, display=False, color_val=point_d_sigz, + title='sig_z',vmin=d_sig_range[0], vmax=d_sig_range[1], colormap_type='seismic') + + fig = plt.figure() + # plt.rc('text', usetex=True) + # plt.rc('font', family='serif') + d_pi_range = [-1, 1] + ax_pi = fig.add_subplot(111, projection='3d') + ax_pi = set_ax_props(ax_pi) + draw_gaussian_points(points, points, gmm, idx=gaussian_index, ax=ax_pi, display=False, color_val=per_point_d_pi[:, gaussian_index], + title='d_pi',vmin=d_pi_range[0], vmax=d_pi_range[1], colormap_type='seismic') + + plt.show() + + +def visualize_fv_pc_clas(): + num_points = 1024 + n_classes = 40 + clas = 'person' + #Create new gaussian + subdev = 5 + variance = 0.04 + export = False + display = True + exp_path = '/home/itzikbs/PycharmProjects/fisherpointnet/paper_images/' + + shape_names = provider.getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet' + str(n_classes) + '_ply_hdf5_2048/shape_names.txt')) + shape_dict = {shape_names[i]: i for i in range(len(shape_names))} + + gmm = utils.get_grid_gmm(subdivisions=[subdev, subdev, subdev], variance=variance) + # compute fv + w = tf.constant(gmm.weights_, dtype=tf.float32) + mu = tf.constant(gmm.means_, dtype=tf.float32) + sigma = tf.constant(gmm.covariances_, dtype=tf.float32) + + for clas in shape_dict: + points = provider.load_single_model_class(clas=clas, ind=0, test_train='train', file_idxs=0, num_points=1024, + n_classes=n_classes) + points = np.expand_dims(points,0) + + points_tensor = tf.constant(points, dtype=tf.float32) # convert points into a tensor + fv_tensor = tf_util.get_fv_minmax(points_tensor, w, mu, sigma, flatten=False) + + sess = tf_util.get_session(2) + with sess: + fv = fv_tensor.eval() + # + # visualize_single_fv_with_pc(fv_train, points, label_title=clas, + # fig_title='fv_pc', type='paper', pos=[750, 800, 0, 0], export=export, + # filename=BASE_DIR + '/paper_images/fv_pc_' + clas) + + visualize_fv(fv, gmm, label_title=[clas], max_n_images=5, normalization=True, export=export, display=display, + filename=exp_path + clas+'_fv', n_scales=1, type='none', fig_title='Figure') + visualize_pc(points, label_title=clas, fig_title='figure', export=export, filename=exp_path +clas+'_pc') + plt.close('all') + + #plt.show() + +def visualize_pc_with_svd(): + num_points = 1024 + model_idx = 5 + gpu_idx = 0 + + original_points, _ = provider.load_single_model(model_idx=model_idx, test_train='train', file_idxs=0, num_points=num_points) + original_points = provider.rotate_point_cloud_by_angle(original_points, np.pi/2) + + # #Simple plane sanity check + # original_points = np.concatenate([np.random.rand(2, 1024), np.zeros([1, 1024])],axis=0) + # R = np.array([[0.7071, 0, 0.7071], + # [0, 1, 0], + # [-0.7071, 0, 0.7071]]) + # original_points = np.transpose(np.dot(R ,original_points)) + + original_points = np.expand_dims(original_points,0) + pc_util.pyplot_draw_point_cloud(original_points[0,:,:]) + + sess = tf_util.get_session(gpu_idx, limit_gpu=True) + points_pl = tf.placeholder(tf.float32, shape=(1, num_points, 3)) + svd_op = tf_util.pc_svd(points_pl) + rotated_points = sess.run(svd_op, feed_dict={points_pl:original_points}) + + pc_util.pyplot_draw_point_cloud(rotated_points[0,:,:]) + plt.show() + +def main(): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + sys.path.append(BASE_DIR+'/visualization') + log_dir = 'log_fisher_grid5_nonlinear' + + #Load gaussians + # gmm_filename = os.path.join(log_dir,'gmm.p') + # gmm = pickle.load(open(gmm_filename, "rb")) + # parameters_filename = os.path.join(log_dir,'parameters.p') + # PARAMETERS = pickle.load(open(parameters_filename, "rb")) + + #Create new gaussian + subdev = 10 + variance = 0.01 + gmm = utils.get_grid_gmm(subdivisions=[subdev, subdev, subdev], variance=variance) + + class helper_struct(): + def __init__(self): + self.num_gaussians = subdev + self.gmm_type = 'grid' + + PARAMETERS = helper_struct() + + gaussian_index = 740 + num_points = 1024 + model_idx = 0 + n_gaussians = np.power(PARAMETERS.num_gaussians, 3) if PARAMETERS.gmm_type == 'grid' else PARAMETERS.num_gaussians + points,_ = provider.load_single_model(model_idx = model_idx,test_train = 'train', file_idxs=0, num_points = num_points) + + g_pts, g_probs = utils.get_gaussian_points(points, gmm, idx=gaussian_index, thresh=0.01) + #draw_gaussian_points(points, g_pts, gmm, idx=gaussian_index, ax=None, display=True, color_val=g_probs) + + #fv = utils.fisher_vector(points, gmm, normalization=True) + # d_pi = fv[0:n_gaussians] + # mean_d_pi = 0.02 + # ax=draw_point_cloud(points) + # draw_gaussians(gmm, ax=ax, display=True, mappables=d_pi, thresh=mean_d_pi) + + per_point_dpi,per_point_d_mu, per_point_d_sigma = utils.fisher_vector_per_point( points, gmm) + visualize_derivatives(points, gmm,gaussian_index,per_point_dpi, per_point_d_mu, per_point_d_sigma) + + + +if __name__ == "__main__": + #main() + visualize_fv_pc_clas() + # path_to_test_results = '/home/itzikbs/PycharmProjects/fisherpointnet/log_seg/test_results' + # make_segmentation_triplets_for_paper(path_to_test_results, cls='all', export = True) + # visualize_pc_with_svd() \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/LICENSE b/zoo/SimpleView/ScanObjectNN/LICENSE new file mode 100644 index 0000000..50e29cd --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Vision & Graphics Group, HKUST + +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/zoo/SimpleView/ScanObjectNN/PointCNN/draw_cmat.py b/zoo/SimpleView/ScanObjectNN/PointCNN/draw_cmat.py new file mode 100644 index 0000000..9b47636 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/draw_cmat.py @@ -0,0 +1,269 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, '../utils')) +import provider +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import pointfly as pf + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointcnn_cls', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='/home/mikacuy/Desktop/trained_models/split4_models/PointCNN/log_objectdataset_augmentedrot_scale75_norm_split4/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='confusion_matrix/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = False, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = '/home/mikacuy/object_dataset/split4/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--setting', '-x', default = 'modelnet_x3_l4', help='Setting to use') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +setting_path = os.path.join(os.path.dirname(__file__), FLAGS.model) +sys.path.append(setting_path) +setting = importlib.import_module(FLAGS.setting) +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter_val = setting.jitter_val + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3), name='data_train') + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE), name='label_train') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = MODEL.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + # net = MODEL.Net(points=pointclouds_pl, features=None, is_training=is_training_pl, setting=setting) + logits = net.logits + probs = tf.nn.softmax(logits, name='probs') + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(logits)[1]), name='labels_tile') + loss_op = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=logits)) + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'loss': loss_op, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + + xforms_np, rotations_np = pf.get_xforms(BATCH_SIZE, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + # pred_val = np.argmax(pred_val, 1) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + current_pred.append(pred_val[i-start_idx]) + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + #Plot confusion matrix + current_pred = np.array(current_pred) + groundtruth = current_label.flatten() + predictions = current_pred.flatten() + + mat = confusion_matrix(groundtruth, predictions) + + plt.style.use('seaborn-paper') + plt.rcParams["figure.figsize"] = (10,10) + ax = plt.subplot(111) + cmap = plt.cm.Reds + mat = mat.astype('float') / mat.sum(axis=1)[:, np.newaxis] + mat = np.nan_to_num(mat, copy=True) + + plt.imshow(mat, interpolation='nearest', cmap=cmap) + # cbar = plt.colorbar(fraction=0.03, pad=0.05, aspect=30) + # cbar.ax.tick_params(labelsize=10) + tick_marks = np.arange(len(SHAPE_NAMES)) + plt.xticks(tick_marks, SHAPE_NAMES, rotation=90) + plt.yticks(tick_marks, SHAPE_NAMES) + + plt.ylabel('Ground truth') + plt.xlabel('Prediction') + + for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] + + ax.get_xticklabels() + ax.get_yticklabels()): + item.set_fontsize(36) + + plt.tight_layout() + plt.savefig(os.path.join(DUMP_DIR,'matrix.pdf')) + plt.show() + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_real_trained_on_synthetic.py b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_real_trained_on_synthetic.py new file mode 100644 index 0000000..bb855a2 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_real_trained_on_synthetic.py @@ -0,0 +1,293 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, '../utils')) +import provider +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import pointfly as pf +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointcnn_cls', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_real_trained_on_synthetic/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--setting', '-x', default = 'modelnet40_expt', help='Setting to use') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +setting_path = os.path.join(os.path.dirname(__file__), FLAGS.model) +sys.path.append(setting_path) +setting = importlib.import_module(FLAGS.setting) +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter_val = setting.jitter_val + +# NUM_CLASSES = 10 +# SHAPE_NAMES = [line.rstrip() for line in \ +# open( '../training_data/shape_names.txt')] + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3), name='data_train') + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE), name='label_train') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = MODEL.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + # net = MODEL.Net(points=pointclouds_pl, features=None, is_training=is_training_pl, setting=setting) + logits = net.logits + probs = tf.nn.softmax(logits, name='probs') + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(logits)[1]), name='labels_tile') + loss_op = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=logits)) + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'loss': loss_op, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in OBJECTDATASET_TO_MODELNET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 40)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 40)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + + xforms_np, rotations_np = pf.get_xforms(BATCH_SIZE, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + # pred_val = np.argmax(pred_val, 1) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen +=1 + if (pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET.keys()): + continue + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + # if (pred_val[i-start_idx] == current_label[i]): + if (pred == current_label[i]): + total_correct +=1 + + for i in range(start_idx, end_idx): + + l = current_label[i] + total_seen_class[l] += 1 + + if pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET: + pred_label = "NA" + else: + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + total_correct_class[l] += (pred == l) + + pred_label = SHAPE_NAMES[pred] + + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[l] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, groundtruth_label, + pred_label) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, + pred_label) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_scenennobjects.py new file mode 100644 index 0000000..00470c4 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_scenennobjects.py @@ -0,0 +1,273 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, '../utils')) +import provider +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import pointfly as pf + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointcnn_cls', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--setting', '-x', default = 'modelnet_x3_l4', help='Setting to use') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +setting_path = os.path.join(os.path.dirname(__file__), FLAGS.model) +sys.path.append(setting_path) +setting = importlib.import_module(FLAGS.setting) +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter_val = setting.jitter_val + +NUM_CLASSES = FLAGS.num_class +if (NUM_CLASSES==11): + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_combined.txt')] +else: + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] +print("Number of Classes: "+str(NUM_CLASSES)) + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def corrupt(batch_data): + output = [] + for i in range(batch_data.shape[0]): + pc = batch_data[i,:,:] + pc = pc[pc[:,2]> THRESH,:] + output.append(pc) + + if (pc.shape[0]<1024): + print("Few points") + + return output + +def collect_points(pc): + if (pc.shape[0]>=NUM_POINT): + return pc[:NUM_POINT,:] + else: + # print(pc.shape) + # print(pc[0:NUM_POINT-pc.shape[0],:].shape) + # print(np.concatenate((np.array(pc), np.array(pc[0:NUM_POINT-pc.shape[0],:])), axis=0).shape) + # exit() + return np.concatenate((np.array(pc), np.array(pc[0:NUM_POINT-pc.shape[0],:])), axis=0) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3), name='data_train') + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE), name='label_train') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = MODEL.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + # net = MODEL.Net(points=pointclouds_pl, features=None, is_training=is_training_pl, setting=setting) + logits = net.logits + probs = tf.nn.softmax(logits, name='probs') + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(logits)[1]), name='labels_tile') + loss_op = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=logits)) + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'loss': loss_op, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + + xforms_np, rotations_np = pf.get_xforms(BATCH_SIZE, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + # pred_val = np.argmax(pred_val, 1) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_seg_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_seg_scenennobjects.py new file mode 100644 index 0000000..b7838a8 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_seg_scenennobjects.py @@ -0,0 +1,317 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, '../utils')) +import provider +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import pointfly as pf +import h5py + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointcnn_seg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--visu_mask', default = False, help='Whether to dump mask [default: False]') +parser.add_argument('--setting', '-x', default = 'object_dataset_x3', help='Setting to use') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +setting_path = os.path.join(os.path.dirname(__file__), FLAGS.model) +sys.path.append(setting_path) +setting = importlib.import_module(FLAGS.setting) +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter_val = setting.jitter_val + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3), name='data') + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE), name='label') + masks_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE, NUM_POINT), name='mask') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = MODEL.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + classification_logits = net.classification_logits + segmentation_logits = net.segmentation_logits + probs = tf.nn.softmax(classification_logits, name='probs') + + ##classification loss + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(classification_logits)[1]), name='labels_tile') + classify_loss = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=classification_logits)) + + ##segmentation loss + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=segmentation_logits, labels=masks_pl), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + loss_op = (1-SEG_WEIGHT)*classify_loss + SEG_WEIGHT*seg_loss + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'seg_pred': segmentation_logits, + 'classify_loss': classify_loss, + 'seg_loss': seg_loss, + 'loss': loss_op, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_seg_sum = np.zeros((cur_batch_size, NUM_POINT, 2)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + + xforms_np, rotations_np = pf.get_xforms(BATCH_SIZE, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], + feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + # pred_val = np.argmax(pred_val, 1) + + batch_pred_sum += pred_val + batch_seg_sum += seg_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + + seg_val = np.argmax(batch_seg_sum, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + gt_mask = current_mask[i] + pred_mask = seg_val[i-start_idx] + + pred_mask_idx = np.where(pred_mask==1)[0] + gt_mask_idx = np.where(gt_mask==1)[0] + correct_obj_mask = np.where((pred_mask==gt_mask) & (pred_mask==1))[0] + + if (len(correct_obj_mask)==1): + continue + + if (i%20==0 and FLAGS.visu_mask): + ###1) + img_filename = '%d_label_%s_pred_%s_gtmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, gt_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s_gtmask.ply' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, gt_mask_idx, :]),ply_filename) + + ###2) + img_filename = '%d_label_%s_pred_%s_predmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, pred_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s_predmask.ply' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, pred_mask_idx, :]),ply_filename) + + ###3) + img_filename = '%d_label_%s_pred_%s_correctpredmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, correct_obj_mask, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s_correctpredmask.ply' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, correct_obj_mask, :]),ply_filename) + + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_synthetic_trained_on_real.py b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_synthetic_trained_on_real.py new file mode 100644 index 0000000..3ecbe09 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/evaluate_synthetic_trained_on_real.py @@ -0,0 +1,297 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, '../utils')) +import provider +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import pointfly as pf +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointcnn_cls', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_synthetic_trained_on_real/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'modelnet/modelnet_test.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--setting', '-x', default = 'modelnet_x3_l4', help='Setting to use') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +setting_path = os.path.join(os.path.dirname(__file__), FLAGS.model) +sys.path.append(setting_path) +setting = importlib.import_module(FLAGS.setting) +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter_val = setting.jitter_val + +# NUM_CLASSES = 10 +# SHAPE_NAMES = [line.rstrip() for line in \ +# open( '../training_data/shape_names.txt')] + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3), name='data_train') + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE), name='label_train') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = MODEL.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + # net = MODEL.Net(points=pointclouds_pl, features=None, is_training=is_training_pl, setting=setting) + logits = net.logits + probs = tf.nn.softmax(logits, name='probs') + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(logits)[1]), name='labels_tile') + loss_op = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=logits)) + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'loss': loss_op, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in MODELNET_TO_OBJECTDATASET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 15)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 15)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + + xforms_np, rotations_np = pf.get_xforms(BATCH_SIZE, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + # pred_val = np.argmax(pred_val, 1) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen += 1 + if (pred_val[i-start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (current_label[i] in possible_label): + total_correct +=1 + + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + # total_correct += correct + # total_seen += cur_batch_size + + # loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + if (pred_val[i-start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (l in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + + pred_label = SHAPE_NAMES[pred_val[i-start_idx]] + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, groundtruth_label, + pred_label) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, + pred_label) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn.py new file mode 100644 index 0000000..d4074cc --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn.py @@ -0,0 +1,277 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import pointfly as pf +import tensorflow as tf + + +def xconv(pts, fts, qrs, tag, N, K, D, P, C, C_pts_fts, is_training, with_X_transformation, depth_multiplier, + sorting_method=None, with_global=False): + _, indices_dilated = pf.knn_indices_general(qrs, pts, K * D, True) + indices = indices_dilated[:, :, ::D, :] + + if sorting_method is not None: + indices = pf.sort_points(pts, indices, sorting_method) + + nn_pts = tf.gather_nd(pts, indices, name=tag + 'nn_pts') # (N, P, K, 3) + nn_pts_center = tf.expand_dims(qrs, axis=2, name=tag + 'nn_pts_center') # (N, P, 1, 3) + nn_pts_local = tf.subtract(nn_pts, nn_pts_center, name=tag + 'nn_pts_local') # (N, P, K, 3) + + # Prepare features to be transformed + nn_fts_from_pts_0 = pf.dense(nn_pts_local, C_pts_fts, tag + 'nn_fts_from_pts_0', is_training) + nn_fts_from_pts = pf.dense(nn_fts_from_pts_0, C_pts_fts, tag + 'nn_fts_from_pts', is_training) + if fts is None: + nn_fts_input = nn_fts_from_pts + else: + nn_fts_from_prev = tf.gather_nd(fts, indices, name=tag + 'nn_fts_from_prev') + nn_fts_input = tf.concat([nn_fts_from_pts, nn_fts_from_prev], axis=-1, name=tag + 'nn_fts_input') + + if with_X_transformation: + ######################## X-transformation ######################### + X_0 = pf.conv2d(nn_pts_local, K * K, tag + 'X_0', is_training, (1, K)) + X_0_KK = tf.reshape(X_0, (N, P, K, K), name=tag + 'X_0_KK') + X_1 = pf.depthwise_conv2d(X_0_KK, K, tag + 'X_1', is_training, (1, K)) + X_1_KK = tf.reshape(X_1, (N, P, K, K), name=tag + 'X_1_KK') + X_2 = pf.depthwise_conv2d(X_1_KK, K, tag + 'X_2', is_training, (1, K), activation=None) + X_2_KK = tf.reshape(X_2, (N, P, K, K), name=tag + 'X_2_KK') + fts_X = tf.matmul(X_2_KK, nn_fts_input, name=tag + 'fts_X') + ################################################################### + else: + fts_X = nn_fts_input + + fts_conv = pf.separable_conv2d(fts_X, C, tag + 'fts_conv', is_training, (1, K), depth_multiplier=depth_multiplier) + fts_conv_3d = tf.squeeze(fts_conv, axis=2, name=tag + 'fts_conv_3d') + + if with_global: + fts_global_0 = pf.dense(qrs, C // 4, tag + 'fts_global_0', is_training) + fts_global = pf.dense(fts_global_0, C // 4, tag + 'fts_global', is_training) + return tf.concat([fts_global, fts_conv_3d], axis=-1, name=tag + 'fts_conv_3d_with_global') + else: + return fts_conv_3d + + +class PointCNN: + def __init__(self, points, features, is_training, setting): + xconv_params = setting.xconv_params + fc_params = setting.fc_params + with_X_transformation = setting.with_X_transformation + sorting_method = setting.sorting_method + N = tf.shape(points)[0] + + if setting.sampling == 'fps': + from sampling import tf_sampling + + self.layer_pts = [points] + if features is None: + self.layer_fts = [features] + else: + features = tf.reshape(features, (N, -1, setting.data_dim - 3), name='features_reshape') + C_fts = xconv_params[0]['C'] // 2 + features_hd = pf.dense(features, C_fts, 'features_hd', is_training) + self.layer_fts = [features_hd] + + for layer_idx, layer_param in enumerate(xconv_params): + tag = 'xconv_' + str(layer_idx + 1) + '_' + K = layer_param['K'] + D = layer_param['D'] + P = layer_param['P'] + C = layer_param['C'] + links = layer_param['links'] + if setting.sampling != 'random' and links: + print('Error: flexible links are supported only when random sampling is used!') + exit() + + # get k-nearest points + pts = self.layer_pts[-1] + fts = self.layer_fts[-1] + if P == -1 or (layer_idx > 0 and P == xconv_params[layer_idx - 1]['P']): + qrs = self.layer_pts[-1] + else: + if setting.sampling == 'fps': + fps_indices = tf_sampling.farthest_point_sample(P, pts) + batch_indices = tf.tile(tf.reshape(tf.range(N), (-1, 1, 1)), (1, P, 1)) + indices = tf.concat([batch_indices, tf.expand_dims(fps_indices,-1)], axis=-1) + qrs = tf.gather_nd(pts, indices, name= tag + 'qrs') # (N, P, 3) + elif setting.sampling == 'ids': + indices = pf.inverse_density_sampling(pts, K, P) + qrs = tf.gather_nd(pts, indices) + elif setting.sampling == 'random': + qrs = tf.slice(pts, (0, 0, 0), (-1, P, -1), name=tag + 'qrs') # (N, P, 3) + else: + print('Unknown sampling method!') + exit() + self.layer_pts.append(qrs) + + if layer_idx == 0: + C_pts_fts = C // 2 if fts is None else C // 4 + depth_multiplier = 4 + else: + C_prev = xconv_params[layer_idx - 1]['C'] + C_pts_fts = C_prev // 4 + depth_multiplier = math.ceil(C / C_prev) + with_global = (setting.with_global and layer_idx == len(xconv_params) - 1) + fts_xconv = xconv(pts, fts, qrs, tag, N, K, D, P, C, C_pts_fts, is_training, with_X_transformation, + depth_multiplier, sorting_method, with_global) + fts_list = [] + for link in links: + fts_from_link = self.layer_fts[link] + if fts_from_link is not None: + fts_slice = tf.slice(fts_from_link, (0, 0, 0), (-1, P, -1), name=tag + 'fts_slice_' + str(-link)) + fts_list.append(fts_slice) + if fts_list: + fts_list.append(fts_xconv) + self.layer_fts.append(tf.concat(fts_list, axis=-1, name=tag + 'fts_list_concat')) + else: + self.layer_fts.append(fts_xconv) + + if hasattr(setting, 'xdconv_params'): + for layer_idx, layer_param in enumerate(setting.xdconv_params): + tag = 'xdconv_' + str(layer_idx + 1) + '_' + K = layer_param['K'] + D = layer_param['D'] + pts_layer_idx = layer_param['pts_layer_idx'] + qrs_layer_idx = layer_param['qrs_layer_idx'] + + pts = self.layer_pts[pts_layer_idx + 1] + fts = self.layer_fts[pts_layer_idx + 1] if layer_idx == 0 else self.layer_fts[-1] + qrs = self.layer_pts[qrs_layer_idx + 1] + fts_qrs = self.layer_fts[qrs_layer_idx + 1] + P = xconv_params[qrs_layer_idx]['P'] + C = xconv_params[qrs_layer_idx]['C'] + C_prev = xconv_params[pts_layer_idx]['C'] + C_pts_fts = C_prev // 4 + depth_multiplier = 1 + fts_xdconv = xconv(pts, fts, qrs, tag, N, K, D, P, C, C_pts_fts, is_training, with_X_transformation, + depth_multiplier, sorting_method) + fts_concat = tf.concat([fts_xdconv, fts_qrs], axis=-1, name=tag + 'fts_concat') + fts_fuse = pf.dense(fts_concat, C, tag + 'fts_fuse', is_training) + self.layer_pts.append(qrs) + self.layer_fts.append(fts_fuse) + + self.fc_layers = [self.layer_fts[-1]] + for layer_idx, layer_param in enumerate(fc_params): + C = layer_param['C'] + dropout_rate = layer_param['dropout_rate'] + fc = pf.dense(self.fc_layers[-1], C, 'fc{:d}'.format(layer_idx), is_training) + fc_drop = tf.layers.dropout(fc, dropout_rate, training=is_training, name='fc{:d}_drop'.format(layer_idx)) + self.fc_layers.append(fc_drop) + +class PointCNN_SEG: + def __init__(self, points, features, is_training, setting): + xconv_params = setting.xconv_params + fc_params_classification = setting.fc_params_classification + fc_params_segmentation = setting.fc_params_segmentation + with_X_transformation = setting.with_X_transformation + sorting_method = setting.sorting_method + N = tf.shape(points)[0] + + if setting.sampling == 'fps': + from sampling import tf_sampling + + self.layer_pts = [points] + if features is None: + self.layer_fts = [features] + else: + features = tf.reshape(features, (N, -1, setting.data_dim - 3), name='features_reshape') + C_fts = xconv_params[0]['C'] // 2 + features_hd = pf.dense(features, C_fts, 'features_hd', is_training) + self.layer_fts = [features_hd] + + for layer_idx, layer_param in enumerate(xconv_params): + tag = 'xconv_' + str(layer_idx + 1) + '_' + K = layer_param['K'] + D = layer_param['D'] + P = layer_param['P'] + C = layer_param['C'] + links = layer_param['links'] + if setting.sampling != 'random' and links: + print('Error: flexible links are supported only when random sampling is used!') + exit() + + # get k-nearest points + pts = self.layer_pts[-1] + fts = self.layer_fts[-1] + if P == -1 or (layer_idx > 0 and P == xconv_params[layer_idx - 1]['P']): + qrs = self.layer_pts[-1] + else: + if setting.sampling == 'fps': + fps_indices = tf_sampling.farthest_point_sample(P, pts) + batch_indices = tf.tile(tf.reshape(tf.range(N), (-1, 1, 1)), (1, P, 1)) + indices = tf.concat([batch_indices, tf.expand_dims(fps_indices,-1)], axis=-1) + qrs = tf.gather_nd(pts, indices, name= tag + 'qrs') # (N, P, 3) + elif setting.sampling == 'ids': + indices = pf.inverse_density_sampling(pts, K, P) + qrs = tf.gather_nd(pts, indices) + elif setting.sampling == 'random': + qrs = tf.slice(pts, (0, 0, 0), (-1, P, -1), name=tag + 'qrs') # (N, P, 3) + else: + print('Unknown sampling method!') + exit() + self.layer_pts.append(qrs) + + if layer_idx == 0: + C_pts_fts = C // 2 if fts is None else C // 4 + depth_multiplier = 4 + else: + C_prev = xconv_params[layer_idx - 1]['C'] + C_pts_fts = C_prev // 4 + depth_multiplier = math.ceil(C / C_prev) + with_global = (setting.with_global and layer_idx == len(xconv_params) - 1) + fts_xconv = xconv(pts, fts, qrs, tag, N, K, D, P, C, C_pts_fts, is_training, with_X_transformation, + depth_multiplier, sorting_method, with_global) + fts_list = [] + for link in links: + fts_from_link = self.layer_fts[link] + if fts_from_link is not None: + fts_slice = tf.slice(fts_from_link, (0, 0, 0), (-1, P, -1), name=tag + 'fts_slice_' + str(-link)) + fts_list.append(fts_slice) + if fts_list: + fts_list.append(fts_xconv) + self.layer_fts.append(tf.concat(fts_list, axis=-1, name=tag + 'fts_list_concat')) + else: + self.layer_fts.append(fts_xconv) + + #######Classification Branch + self.fc_layers_classification = [self.layer_fts[-1]] + for layer_idx, layer_param in enumerate(fc_params_classification): + C = layer_param['C'] + dropout_rate = layer_param['dropout_rate'] + fc = pf.dense(self.fc_layers_classification[-1], C, 'fc_class_{:d}'.format(layer_idx), is_training) + fc_drop = tf.layers.dropout(fc, dropout_rate, training=is_training, name='fc_class_{:d}_drop'.format(layer_idx)) + self.fc_layers_classification.append(fc_drop) + + + #######Segmentation Branch + if hasattr(setting, 'xdconv_params'): + for layer_idx, layer_param in enumerate(setting.xdconv_params): + tag = 'xdconv_' + str(layer_idx + 1) + '_' + K = layer_param['K'] + D = layer_param['D'] + pts_layer_idx = layer_param['pts_layer_idx'] + qrs_layer_idx = layer_param['qrs_layer_idx'] + + pts = self.layer_pts[pts_layer_idx + 1] + fts = self.layer_fts[pts_layer_idx + 1] if layer_idx == 0 else self.layer_fts[-1] + qrs = self.layer_pts[qrs_layer_idx + 1] + fts_qrs = self.layer_fts[qrs_layer_idx + 1] + P = xconv_params[qrs_layer_idx]['P'] + C = xconv_params[qrs_layer_idx]['C'] + C_prev = xconv_params[pts_layer_idx]['C'] + C_pts_fts = C_prev // 4 + depth_multiplier = 1 + fts_xdconv = xconv(pts, fts, qrs, tag, N, K, D, P, C, C_pts_fts, is_training, with_X_transformation, + depth_multiplier, sorting_method) + fts_concat = tf.concat([fts_xdconv, fts_qrs], axis=-1, name=tag + 'fts_concat') + fts_fuse = pf.dense(fts_concat, C, tag + 'fts_fuse', is_training) + self.layer_pts.append(qrs) + self.layer_fts.append(fts_fuse) + + self.fc_layers_segmentation = [self.layer_fts[-1]] + for layer_idx, layer_param in enumerate(fc_params_segmentation): + C = layer_param['C'] + dropout_rate = layer_param['dropout_rate'] + fc = pf.dense(self.fc_layers_segmentation[-1], C, 'fc_seg_{:d}'.format(layer_idx), is_training) + fc_drop = tf.layers.dropout(fc, dropout_rate, training=is_training, name='fc_seg_{:d}_drop'.format(layer_idx)) + self.fc_layers_segmentation.append(fc_drop) \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls.py new file mode 100644 index 0000000..0c41b5a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls.py @@ -0,0 +1,16 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import pointfly as pf +import tensorflow as tf +from pointcnn import PointCNN + + +class Net(PointCNN): + def __init__(self, points, features, is_training, setting): + PointCNN.__init__(self, points, features, is_training, setting) + fc_mean = tf.reduce_mean(self.fc_layers[-1], axis=1, keep_dims=True, name='fc_mean') + self.fc_layers[-1] = tf.cond(is_training, lambda: self.fc_layers[-1], lambda: fc_mean) + self.logits = pf.dense(self.fc_layers[-1], setting.num_class, 'logits', + is_training, with_bn=False, activation=None) \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls/modelnet40_expt.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls/modelnet40_expt.py new file mode 100644 index 0000000..b01c7b3 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls/modelnet40_expt.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 + +import os +import sys +import math + +# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# import data_utils + +# load_fn = data_utils.load_cls_train_val +balance_fn = None +map_fn = None +keep_remainder = True +save_ply_fn = None + +#For ModelNet40 model +num_class = 40 + +# #For ScanObjectNN +# num_class = 15 + +sample_num = 1024 + +# batch_size = 128 +batch_size = 32 + +# num_epochs = 1024 +num_epochs = 400 + +step_val = 500 + +learning_rate_base = 0.01 +decay_steps = 8000 +decay_rate = 0.5 +learning_rate_min = 1e-6 + +weight_decay = 1e-5 + +jitter = 0.0 +jitter_val = 0.0 + +rotation_range = [0, math.pi, 0, 'u'] +rotation_range_val = [0, 0, 0, 'u'] +rotation_order = 'rxyz' + +scaling_range = [0.1, 0.1, 0.1, 'g'] +scaling_range_val = [0, 0, 0, 'u'] + +sample_num_variance = 1 // 8 +sample_num_clip = 1 // 4 + +x = 3 + +xconv_param_name = ('K', 'D', 'P', 'C', 'links') +xconv_params = [dict(zip(xconv_param_name, xconv_param)) for xconv_param in + [(8, 1, -1, 16 * x, []), + (12, 2, 384, 32 * x, []), + (16, 2, 128, 64 * x, []), + (16, 3, 128, 128 * x, [])]] + +with_global = True + +fc_param_name = ('C', 'dropout_rate') +fc_params = [dict(zip(fc_param_name, fc_param)) for fc_param in + [(128 * x, 0.0), + (64 * x, 0.8)]] + +sampling = 'random' + +optimizer = 'adam' +epsilon = 1e-2 + +data_dim = 6 +use_extra_features = False +with_X_transformation = True +sorting_method = None diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls/modelnet_x3_l4.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls/modelnet_x3_l4.py new file mode 100644 index 0000000..e0b6abb --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_cls/modelnet_x3_l4.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 + +import os +import sys +import math + +# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# import data_utils + +# load_fn = data_utils.load_cls_train_val +balance_fn = None +map_fn = None +keep_remainder = True +save_ply_fn = None + +#For ModelNet40 model +# num_class = 40 + +#For ScanObjectNN +num_class = 15 + +sample_num = 1024 + +# batch_size = 128 +batch_size = 32 + +# num_epochs = 1024 +num_epochs = 400 + +step_val = 500 + +learning_rate_base = 0.01 +decay_steps = 8000 +decay_rate = 0.5 +learning_rate_min = 1e-6 + +weight_decay = 1e-5 + +jitter = 0.0 +jitter_val = 0.0 + +rotation_range = [0, math.pi, 0, 'u'] +rotation_range_val = [0, 0, 0, 'u'] +rotation_order = 'rxyz' + +scaling_range = [0.1, 0.1, 0.1, 'g'] +scaling_range_val = [0, 0, 0, 'u'] + +sample_num_variance = 1 // 8 +sample_num_clip = 1 // 4 + +x = 3 + +xconv_param_name = ('K', 'D', 'P', 'C', 'links') +xconv_params = [dict(zip(xconv_param_name, xconv_param)) for xconv_param in + [(8, 1, -1, 16 * x, []), + (12, 2, 384, 32 * x, []), + (16, 2, 128, 64 * x, []), + (16, 3, 128, 128 * x, [])]] + +with_global = True + +fc_param_name = ('C', 'dropout_rate') +fc_params = [dict(zip(fc_param_name, fc_param)) for fc_param in + [(128 * x, 0.0), + (64 * x, 0.8)]] + +sampling = 'random' + +optimizer = 'adam' +epsilon = 1e-2 + +data_dim = 6 +use_extra_features = False +with_X_transformation = True +sorting_method = None diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_seg.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_seg.py new file mode 100644 index 0000000..91601ce --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_seg.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import pointfly as pf +from pointcnn import PointCNN_SEG + + +class Net(PointCNN_SEG): + def __init__(self, points, features, is_training, setting): + PointCNN_SEG.__init__(self, points, features, is_training, setting) + + ###Classification + self.classification_logits = pf.dense(self.fc_layers_classification[-1], setting.num_class, 'logits_classification', + is_training, with_bn=False, activation=None) + + ###Segmentation Mask + self.segmentation_logits = pf.dense(self.fc_layers_segmentation[-1], 2, 'logits_segmentation', + is_training, with_bn=False, activation=None) \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_seg/object_dataset_x3.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_seg/object_dataset_x3.py new file mode 100644 index 0000000..1bab7c7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointcnn_seg/object_dataset_x3.py @@ -0,0 +1,83 @@ +#!/usr/bin/python3 + +import os +import sys +import math + +# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# import data_utils + +# load_fn = data_utils.load_cls_train_val +balance_fn = None +map_fn = None +keep_remainder = True +save_ply_fn = None + +# num_class = 40 +num_class = 15 + +sample_num = 1024 + +batch_size = 32 + +num_epochs = 400 + +step_val = 500 + +learning_rate_base = 0.01 +decay_steps = 8000 +decay_rate = 0.5 +learning_rate_min = 1e-6 + +weight_decay = 1e-5 + +jitter = 0.0 +jitter_val = 0.0 + +rotation_range = [0, math.pi, 0, 'u'] +rotation_range_val = [0, 0, 0, 'u'] +rotation_order = 'rxyz' + +scaling_range = [0.1, 0.1, 0.1, 'g'] +scaling_range_val = [0, 0, 0, 'u'] + +sample_num_variance = 1 // 8 +sample_num_clip = 1 // 4 + +x = 3 + +xconv_param_name = ('K', 'D', 'P', 'C', 'links') +xconv_params = [dict(zip(xconv_param_name, xconv_param)) for xconv_param in + [(8, 1, -1, 16 * x, []), + (12, 2, 384, 32 * x, []), + (16, 2, 128, 64 * x, []), + (16, 3, 128, 128 * x, [])]] + +with_global = True + +xdconv_param_name = ('K', 'D', 'pts_layer_idx', 'qrs_layer_idx') +xdconv_params = [dict(zip(xdconv_param_name, xdconv_param)) for xdconv_param in + [(16, 6, 3, 3), + (16, 6, 3, 2), + (12, 6, 2, 1), + (8, 6, 1, 0), + (8, 4, 0, 0)]] + +fc_param_name = ('C', 'dropout_rate') +fc_params_classification = [dict(zip(fc_param_name, fc_param)) for fc_param in + [(128 * x, 0.0), + (64 * x, 0.8)]] + +fc_params_segmentation = [dict(zip(fc_param_name, fc_param)) for fc_param in + [(32 * x, 0.0), + (32 * x, 0.5)]] + +sampling = 'random' + +optimizer = 'adam' +epsilon = 1e-2 + +data_dim = 3 +use_extra_features = False +with_X_transformation = True +sorting_method = None diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/pointfly.py b/zoo/SimpleView/ScanObjectNN/PointCNN/pointfly.py new file mode 100644 index 0000000..73dfedb --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/pointfly.py @@ -0,0 +1,347 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import random +import numpy as np +import tensorflow as tf +from transforms3d.euler import euler2mat + + +# the returned indices will be used by tf.gather_nd +def get_indices(batch_size, sample_num, point_num, pool_setting=None): + if not isinstance(point_num, np.ndarray): + point_nums = np.full((batch_size), point_num) + else: + point_nums = point_num + + indices = [] + for i in range(batch_size): + pt_num = point_nums[i] + if pool_setting is None: + pool_size = pt_num + else: + if isinstance(pool_setting, int): + pool_size = min(pool_setting, pt_num) + elif isinstance(pool_setting, tuple): + pool_size = min(random.randrange(pool_setting[0], pool_setting[1]+1), pt_num) + if pool_size > sample_num: + choices = np.random.choice(pool_size, sample_num, replace=False) + else: + choices = np.concatenate((np.random.choice(pool_size, pool_size, replace=False), + np.random.choice(pool_size, sample_num - pool_size, replace=True))) + if pool_size < pt_num: + choices_pool = np.random.choice(pt_num, pool_size, replace=False) + choices = choices_pool[choices] + choices = np.expand_dims(choices, axis=1) + choices_2d = np.concatenate((np.full_like(choices, i), choices), axis=1) + indices.append(choices_2d) + return np.stack(indices) + + +def gauss_clip(mu, sigma, clip): + v = random.gauss(mu, sigma) + v = max(min(v, mu + clip * sigma), mu - clip * sigma) + return v + + +def uniform(bound): + return bound * (2 * random.random() - 1) + + +def scaling_factor(scaling_param, method): + try: + scaling_list = list(scaling_param) + return random.choice(scaling_list) + except: + if method == 'g': + return gauss_clip(1.0, scaling_param, 3) + elif method == 'u': + return 1.0 + uniform(scaling_param) + + +def rotation_angle(rotation_param, method): + try: + rotation_list = list(rotation_param) + return random.choice(rotation_list) + except: + if method == 'g': + return gauss_clip(0.0, rotation_param, 3) + elif method == 'u': + return uniform(rotation_param) + + +def get_xforms(xform_num, rotation_range=(0, 0, 0, 'u'), scaling_range=(0.0, 0.0, 0.0, 'u'), order='rxyz'): + xforms = np.empty(shape=(xform_num, 3, 3)) + rotations = np.empty(shape=(xform_num, 3, 3)) + for i in range(xform_num): + rx = rotation_angle(rotation_range[0], rotation_range[3]) + ry = rotation_angle(rotation_range[1], rotation_range[3]) + rz = rotation_angle(rotation_range[2], rotation_range[3]) + rotation = euler2mat(rx, ry, rz, order) + + sx = scaling_factor(scaling_range[0], scaling_range[3]) + sy = scaling_factor(scaling_range[1], scaling_range[3]) + sz = scaling_factor(scaling_range[2], scaling_range[3]) + scaling = np.diag([sx, sy, sz]) + + xforms[i, :] = scaling * rotation + rotations[i, :] = rotation + return xforms, rotations + + +def augment(points, xforms, range=None): + points_xformed = tf.matmul(points, xforms, name='points_xformed') + if range is None: + return points_xformed + + jitter_data = range * tf.random_normal(tf.shape(points_xformed), name='jitter_data') + jitter_clipped = tf.clip_by_value(jitter_data, -5 * range, 5 * range, name='jitter_clipped') + return points_xformed + jitter_clipped + + +# A shape is (N, C) +def distance_matrix(A): + r = tf.reduce_sum(A * A, 1, keep_dims=True) + m = tf.matmul(A, tf.transpose(A)) + D = r - 2 * m + tf.transpose(r) + return D + + +# A shape is (N, P, C) +def batch_distance_matrix(A): + r = tf.reduce_sum(A * A, axis=2, keep_dims=True) + m = tf.matmul(A, tf.transpose(A, perm=(0, 2, 1))) + D = r - 2 * m + tf.transpose(r, perm=(0, 2, 1)) + return D + + +# A shape is (N, P_A, C), B shape is (N, P_B, C) +# D shape is (N, P_A, P_B) +def batch_distance_matrix_general(A, B): + r_A = tf.reduce_sum(A * A, axis=2, keep_dims=True) + r_B = tf.reduce_sum(B * B, axis=2, keep_dims=True) + m = tf.matmul(A, tf.transpose(B, perm=(0, 2, 1))) + D = r_A - 2 * m + tf.transpose(r_B, perm=(0, 2, 1)) + return D + + +# A shape is (N, P, C) +def find_duplicate_columns(A): + N = A.shape[0] + P = A.shape[1] + indices_duplicated = np.fill((N, 1, P), 1, dtype=np.int32) + for idx in range(N): + _, indices = np.unique(A[idx], return_index=True, axis=0) + indices_duplicated[idx, :, indices] = 0 + return indices_duplicated + + +# add a big value to duplicate columns +def prepare_for_unique_top_k(D, A): + indices_duplicated = tf.py_func(find_duplicate_columns, [A], tf.int32) + D += tf.reduce_max(D)*tf.cast(indices_duplicated, tf.float32) + + +# return shape is (N, P, K, 2) +def knn_indices(points, k, sort=True, unique=True): + points_shape = tf.shape(points) + batch_size = points_shape[0] + point_num = points_shape[1] + + D = batch_distance_matrix(points) + if unique: + prepare_for_unique_top_k(D, points) + distances, point_indices = tf.nn.top_k(-D, k=k, sorted=sort) + batch_indices = tf.tile(tf.reshape(tf.range(batch_size), (-1, 1, 1, 1)), (1, point_num, k, 1)) + indices = tf.concat([batch_indices, tf.expand_dims(point_indices, axis=3)], axis=3) + return -distances, indices + + +# return shape is (N, P, K, 2) +def knn_indices_general(queries, points, k, sort=True, unique=True): + queries_shape = tf.shape(queries) + batch_size = queries_shape[0] + point_num = queries_shape[1] + + D = batch_distance_matrix_general(queries, points) + if unique: + prepare_for_unique_top_k(D, points) + distances, point_indices = tf.nn.top_k(-D, k=k, sorted=sort) # (N, P, K) + batch_indices = tf.tile(tf.reshape(tf.range(batch_size), (-1, 1, 1, 1)), (1, point_num, k, 1)) + indices = tf.concat([batch_indices, tf.expand_dims(point_indices, axis=3)], axis=3) + return -distances, indices + + +# indices is (N, P, K, 2) +# return shape is (N, P, K, 2) +def sort_points(points, indices, sorting_method): + indices_shape = tf.shape(indices) + batch_size = indices_shape[0] + point_num = indices_shape[1] + k = indices_shape[2] + + nn_pts = tf.gather_nd(points, indices) # (N, P, K, 3) + if sorting_method.startswith('c'): + if ''.join(sorted(sorting_method[1:])) != 'xyz': + print('Unknown sorting method!') + exit() + epsilon = 1e-8 + nn_pts_min = tf.reduce_min(nn_pts, axis=2, keep_dims=True) + nn_pts_max = tf.reduce_max(nn_pts, axis=2, keep_dims=True) + nn_pts_normalized = (nn_pts - nn_pts_min) / (nn_pts_max - nn_pts_min + epsilon) # (N, P, K, 3) + scaling_factors = [math.pow(100.0, 3 - sorting_method.find('x')), + math.pow(100.0, 3 - sorting_method.find('y')), + math.pow(100.0, 3 - sorting_method.find('z'))] + scaling = tf.constant(scaling_factors, shape=(1, 1, 1, 3)) + sorting_data = tf.reduce_sum(nn_pts_normalized * scaling, axis=-1) # (N, P, K) + sorting_data = tf.concat([tf.zeros((batch_size, point_num, 1)), sorting_data[:, :, 1:]], axis=-1) + elif sorting_method == 'l2': + nn_pts_center = tf.reduce_mean(nn_pts, axis=2, keep_dims=True) # (N, P, 1, 3) + nn_pts_local = tf.subtract(nn_pts, nn_pts_center) # (N, P, K, 3) + sorting_data = tf.norm(nn_pts_local, axis=-1) # (N, P, K) + else: + print('Unknown sorting method!') + exit() + _, k_indices = tf.nn.top_k(sorting_data, k=k, sorted=True) # (N, P, K) + batch_indices = tf.tile(tf.reshape(tf.range(batch_size), (-1, 1, 1, 1)), (1, point_num, k, 1)) + point_indices = tf.tile(tf.reshape(tf.range(point_num), (1, -1, 1, 1)), (batch_size, 1, k, 1)) + k_indices_4d = tf.expand_dims(k_indices, axis=3) + sorting_indices = tf.concat([batch_indices, point_indices, k_indices_4d], axis=3) # (N, P, K, 3) + return tf.gather_nd(indices, sorting_indices) + + +# a b c +# d e f +# g h i +# a(ei βˆ’ fh) βˆ’ b(di βˆ’ fg) + c(dh βˆ’ eg) +def compute_determinant(A): + return A[..., 0, 0] * (A[..., 1, 1] * A[..., 2, 2] - A[..., 1, 2] * A[..., 2, 1]) \ + - A[..., 0, 1] * (A[..., 1, 0] * A[..., 2, 2] - A[..., 1, 2] * A[..., 2, 0]) \ + + A[..., 0, 2] * (A[..., 1, 0] * A[..., 2, 1] - A[..., 1, 1] * A[..., 2, 0]) + + +# A shape is (N, P, 3, 3) +# return shape is (N, P, 3) +def compute_eigenvals(A): + A_11 = A[:, :, 0, 0] # (N, P) + A_12 = A[:, :, 0, 1] + A_13 = A[:, :, 0, 2] + A_22 = A[:, :, 1, 1] + A_23 = A[:, :, 1, 2] + A_33 = A[:, :, 2, 2] + I = tf.eye(3) + p1 = tf.square(A_12) + tf.square(A_13) + tf.square(A_23) # (N, P) + q = tf.trace(A) / 3 # (N, P) + p2 = tf.square(A_11 - q) + tf.square(A_22 - q) + tf.square(A_33 - q) + 2 * p1 # (N, P) + p = tf.sqrt(p2 / 6) + 1e-8 # (N, P) + N = tf.shape(A)[0] + q_4d = tf.reshape(q, (N, -1, 1, 1)) # (N, P, 1, 1) + p_4d = tf.reshape(p, (N, -1, 1, 1)) + B = (1 / p_4d) * (A - q_4d * I) # (N, P, 3, 3) + r = tf.clip_by_value(compute_determinant(B) / 2, -1, 1) # (N, P) + phi = tf.acos(r) / 3 # (N, P) + eig1 = q + 2 * p * tf.cos(phi) # (N, P) + eig3 = q + 2 * p * tf.cos(phi + (2 * math.pi / 3)) + eig2 = 3 * q - eig1 - eig3 + return tf.abs(tf.stack([eig1, eig2, eig3], axis=2)) # (N, P, 3) + + +# P shape is (N, P, 3), N shape is (N, P, K, 3) +# return shape is (N, P) +def compute_curvature(nn_pts): + nn_pts_mean = tf.reduce_mean(nn_pts, axis=2, keep_dims=True) # (N, P, 1, 3) + nn_pts_demean = nn_pts - nn_pts_mean # (N, P, K, 3) + nn_pts_NPK31 = tf.expand_dims(nn_pts_demean, axis=-1) + covariance_matrix = tf.matmul(nn_pts_NPK31, nn_pts_NPK31, transpose_b=True) # (N, P, K, 3, 3) + covariance_matrix_mean = tf.reduce_mean(covariance_matrix, axis=2) # (N, P, 3, 3) + eigvals = compute_eigenvals(covariance_matrix_mean) # (N, P, 3) + curvature = tf.reduce_min(eigvals, axis=-1) / (tf.reduce_sum(eigvals, axis=-1) + 1e-8) + return curvature + + +def curvature_based_sample(nn_pts, k): + curvature = compute_curvature(nn_pts) + _, point_indices = tf.nn.top_k(curvature, k=k, sorted=False) + + pts_shape = tf.shape(nn_pts) + batch_size = pts_shape[0] + batch_indices = tf.tile(tf.reshape(tf.range(batch_size), (-1, 1, 1)), (1, k, 1)) + indices = tf.concat([batch_indices, tf.expand_dims(point_indices, axis=2)], axis=2) + return indices + + +def random_choice_2d(size, prob_matrix): + n_row = prob_matrix.shape[0] + n_col = prob_matrix.shape[1] + choices = np.ones((n_row, size), dtype=np.int32) + for idx_row in range(n_row): + choices[idx_row] = np.random.choice(n_col, size=size, replace=False, p=prob_matrix[idx_row]) + return choices + + +def inverse_density_sampling(points, k, sample_num): + D = batch_distance_matrix(points) + distances, _ = tf.nn.top_k(-D, k=k, sorted=False) + distances_avg = tf.abs(tf.reduce_mean(distances, axis=-1)) + 1e-8 + prob_matrix = distances_avg / tf.reduce_sum(distances_avg, axis=-1, keep_dims=True) + point_indices = tf.py_func(random_choice_2d, [sample_num, prob_matrix], tf.int32) + point_indices.set_shape([points.get_shape()[0], sample_num]) + + batch_size = tf.shape(points)[0] + batch_indices = tf.tile(tf.reshape(tf.range(batch_size), (-1, 1, 1)), (1, sample_num, 1)) + indices = tf.concat([batch_indices, tf.expand_dims(point_indices, axis=2)], axis=2) + return indices + + +def batch_normalization(data, is_training, name, reuse=None): + return tf.layers.batch_normalization(data, momentum=0.99, training=is_training, + beta_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + gamma_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + reuse=reuse, name=name) + + +def separable_conv2d(input, output, name, is_training, kernel_size, depth_multiplier=1, + reuse=None, with_bn=True, activation=tf.nn.elu): + conv2d = tf.layers.separable_conv2d(input, output, kernel_size=kernel_size, strides=(1, 1), padding='VALID', + activation=activation, + depth_multiplier=depth_multiplier, + depthwise_initializer=tf.glorot_normal_initializer(), + pointwise_initializer=tf.glorot_normal_initializer(), + depthwise_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + pointwise_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + reuse=reuse, name=name, use_bias=not with_bn) + return batch_normalization(conv2d, is_training, name + '_bn', reuse) if with_bn else conv2d + + +def depthwise_conv2d(input, depth_multiplier, name, is_training, kernel_size, + reuse=None, with_bn=True, activation=tf.nn.elu): + conv2d = tf.contrib.layers.separable_conv2d(input, num_outputs=None, kernel_size=kernel_size, padding='VALID', + activation_fn=activation, + depth_multiplier=depth_multiplier, + weights_initializer=tf.glorot_normal_initializer(), + weights_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + biases_initializer=None if with_bn else tf.zeros_initializer(), + biases_regularizer=None if with_bn else tf.contrib.layers.l2_regularizer( + scale=1.0), + reuse=reuse, scope=name) + return batch_normalization(conv2d, is_training, name + '_bn', reuse) if with_bn else conv2d + + +def conv2d(input, output, name, is_training, kernel_size, + reuse=None, with_bn=True, activation=tf.nn.elu): + conv2d = tf.layers.conv2d(input, output, kernel_size=kernel_size, strides=(1, 1), padding='VALID', + activation=activation, + kernel_initializer=tf.glorot_normal_initializer(), + kernel_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + reuse=reuse, name=name, use_bias=not with_bn) + return batch_normalization(conv2d, is_training, name + '_bn', reuse) if with_bn else conv2d + + +def dense(input, output, name, is_training, reuse=None, with_bn=True, activation=tf.nn.elu): + dense = tf.layers.dense(input, units=output, activation=activation, + kernel_initializer=tf.glorot_normal_initializer(), + kernel_regularizer=tf.contrib.layers.l2_regularizer(scale=1.0), + reuse=reuse, name=name, use_bias=not with_bn) + return batch_normalization(dense, is_training, name + '_bn', reuse) if with_bn else dense diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/provider.py b/zoo/SimpleView/ScanObjectNN/PointCNN/provider.py new file mode 100644 index 0000000..a4f2c12 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/provider.py @@ -0,0 +1,160 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +if not os.path.exists(os.path.join(DATA_DIR, 'data/modelnet40_ply_hdf5_2048')): + print("Data path does not exists") + print(os.path.join(DATA_DIR, 'data/modelnet40_ply_hdf5_2048')) + exit() + + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(os.path.join(DATA_DIR,filename)) + + +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] # (2048, 2048, 3) + label = f['label'][:] # (2048, 1) + seg = f['pid'][:] # (2048, 2048) + return (data, label, seg) diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/train.py b/zoo/SimpleView/ScanObjectNN/PointCNN/train.py new file mode 100644 index 0000000..ff8f66a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/train.py @@ -0,0 +1,340 @@ +#!/usr/bin/python3 +"""Training and Validation On Classification Task.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import math +import random +import shutil +import argparse +import importlib +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(BASE_DIR, '..')) +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +import data_utils +import numpy as np +import pointfly as pf +import tensorflow as tf +from datetime import datetime +import provider +import h5py + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--load_ckpt', '-l', help='Path to a check point file for load') + +parser.add_argument('--log_dir', '-s', default='log/', help='Path to folder for saving check points and summary') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--model', '-m', default = 'pointcnn_cls', help='Model to use') +parser.add_argument('--setting', '-x', default = 'modelnet_x3_l4', help='Setting to use') +parser.add_argument('--epochs', help='Number of training epochs (default defined in setting)', type=int) +parser.add_argument('--batch_size', help='Batch size (default defined in setting)', type=int) +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') + +args = parser.parse_args() + + +GPU_INDEX = args.gpu + +time_string = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') +root_folder = args.log_dir +if not os.path.exists(root_folder): + os.makedirs(root_folder) + +WITH_BG = args.with_bg +NORMALIZED = args.norm +TRAIN_FILE = args.train_file +TEST_FILE = args.test_file +CENTER_DATA = args.center_data + +LOG_FOUT = open(os.path.join(root_folder, 'log_train.txt'), 'w') +LOG_FOUT.write(str(args)+'\n') + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +model = importlib.import_module(args.model) +setting_path = os.path.join(os.path.dirname(__file__), args.model) +sys.path.append(setting_path) +setting = importlib.import_module(args.setting) + +num_epochs = args.epochs or setting.num_epochs +batch_size = args.batch_size or setting.batch_size +sample_num = args.num_point +step_val = setting.step_val +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter = setting.jitter +jitter_val = setting.jitter_val +pool_setting_val = None if not hasattr(setting, 'pool_setting_val') else setting.pool_setting_val +pool_setting_train = None if not hasattr(setting, 'pool_setting_train') else setting.pool_setting_train + +# Prepare inputs +log_string('{}-Preparing datasets...'.format(datetime.now())) + +NUM_CLASSES = args.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) +else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, sample_num, with_bg_pl = WITH_BG) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, sample_num, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +num_train = len(TRAIN_DATA) +num_val = len(TEST_DATA) +print('{}-{:d}/{:d} training/validation samples.'.format(datetime.now(), num_train, num_val)) + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + # Placeholders + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, sample_num, 3), name='data_train') + labels_pl = tf.placeholder(tf.int32, shape=(batch_size), name='label_train') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = model.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + logits = net.logits + probs = tf.nn.softmax(logits, name='probs') + predictions = tf.argmax(probs, axis=-1, name='predictions') + + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(logits)[1]), name='labels_tile') + loss_op = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=logits)) + + tf.summary.scalar('loss', loss_op) + # with tf.name_scope('metrics'): + # loss_mean_op, loss_mean_update_op = tf.metrics.mean(loss_op) + # t_1_acc_op, t_1_acc_update_op = tf.metrics.accuracy(labels_tile, predictions) + # t_1_per_class_acc_op, t_1_per_class_acc_update_op = tf.metrics.mean_per_class_accuracy(labels_tile, + # predictions, + # setting.num_class) + # reset_metrics_op = tf.variables_initializer([var for var in tf.local_variables() + # if var.name.split('/')[0] == 'metrics']) + + # _ = tf.summary.scalar('loss/train', tensor=loss_mean_op, collections=['train']) + # _ = tf.summary.scalar('t_1_acc/train', tensor=t_1_acc_op, collections=['train']) + # _ = tf.summary.scalar('t_1_per_class_acc/train', tensor=t_1_per_class_acc_op, collections=['train']) + + # _ = tf.summary.scalar('loss/val', tensor=loss_mean_op, collections=['val']) + # _ = tf.summary.scalar('t_1_acc/val', tensor=t_1_acc_op, collections=['val']) + # _ = tf.summary.scalar('t_1_per_class_acc/val', tensor=t_1_per_class_acc_op, collections=['val']) + + lr_exp_op = tf.train.exponential_decay(setting.learning_rate_base, global_step, setting.decay_steps, + setting.decay_rate, staircase=True) + lr_clip_op = tf.maximum(lr_exp_op, setting.learning_rate_min) + _ = tf.summary.scalar('learning_rate', tensor=lr_clip_op, collections=['train']) + reg_loss = setting.weight_decay * tf.losses.get_regularization_loss() + if setting.optimizer == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate=lr_clip_op, epsilon=setting.epsilon) + elif setting.optimizer == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate=lr_clip_op, momentum=setting.momentum, use_nesterov=True) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + with tf.control_dependencies(update_ops): + train_op = optimizer.minimize(loss_op + reg_loss, global_step=global_step) + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) + + saver = tf.train.Saver(max_to_keep=None) + + # backup all code + # code_folder = os.path.abspath(os.path.dirname(__file__)) + # shutil.copytree(code_folder, os.path.join(root_folder) + + folder_ckpt = root_folder + # if not os.path.exists(folder_ckpt): + # os.makedirs(folder_ckpt) + + folder_summary = os.path.join(root_folder, 'summary') + if not os.path.exists(folder_summary): + os.makedirs(folder_summary) + + parameter_num = np.sum([np.prod(v.shape.as_list()) for v in tf.trainable_variables()]) + print('{}-Parameter number: {:d}.'.format(datetime.now(), parameter_num)) + + sess.run(init_op) + + # saver.restore(sess, os.path.join(folder_ckpt, "model.ckpt")) + # log_string("Model restored.") + + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(folder_summary, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(folder_summary, 'test')) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'loss': loss_op, + 'train_op': train_op, + 'merged': merged, + 'step': global_step, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + for epoch in range(num_epochs): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + # if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(folder_ckpt, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + +def train_one_epoch(sess, ops, train_writer): + is_training = True + + #get current data, shuffle and set to numpy array with desired num_points + # current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, sample_num) + # current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, sample_num) + if (".h5" in TRAIN_FILE): + current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, sample_num) + else: + current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, sample_num) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//batch_size + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * batch_size + end_idx = (batch_idx+1) * batch_size + + xforms_np, rotations_np = pf.get_xforms(batch_size, + rotation_range=rotation_range, + scaling_range=scaling_range, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter])} + + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + + train_writer.add_summary(summary, step) + pred_val = np.sum(pred_val, axis=1) + pred_val = np.argmax(pred_val, 1) + # print(pred_val) + # print(current_label[start_idx:end_idx]) + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += batch_size + loss_sum += loss_val + + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + +def eval_one_epoch(sess, ops, test_writer): + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, sample_num) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, sample_num) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, sample_num) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, sample_num) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//batch_size + + for batch_idx in range(num_batches): + start_idx = batch_idx * batch_size + end_idx = (batch_idx+1) * batch_size + + xforms_np, rotations_np = pf.get_xforms(batch_size, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += batch_size + loss_sum += (loss_val*batch_size) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + +if __name__ == '__main__': + train() diff --git a/zoo/SimpleView/ScanObjectNN/PointCNN/train_seg.py b/zoo/SimpleView/ScanObjectNN/PointCNN/train_seg.py new file mode 100644 index 0000000..1a776a3 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/PointCNN/train_seg.py @@ -0,0 +1,353 @@ +#!/usr/bin/python3 +"""Training and Validation On Classification Task.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import math +import random +import shutil +import argparse +import importlib +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(BASE_DIR, '..')) +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +import data_utils +import numpy as np +import pointfly as pf +import tensorflow as tf +from datetime import datetime +import provider +import h5py + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--load_ckpt', '-l', help='Path to a check point file for load') + +parser.add_argument('--log_dir', '-s', default='log/', help='Path to folder for saving check points and summary') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--model', '-m', default = 'pointcnn_seg', help='Model to use') +parser.add_argument('--setting', '-x', default = 'object_dataset_x3', help='Setting to use') +parser.add_argument('--epochs', help='Number of training epochs (default defined in setting)', type=int) +parser.add_argument('--batch_size', help='Batch size (default defined in setting)', type=int) +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') + +args = parser.parse_args() + +GPU_INDEX = args.gpu + +time_string = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') +root_folder = args.log_dir +if not os.path.exists(root_folder): + os.makedirs(root_folder) + +WITH_BG = args.with_bg +NORMALIZED = args.norm +TRAIN_FILE = args.train_file +TEST_FILE = args.test_file +CENTER_DATA = args.center_data +SEG_WEIGHT = args.seg_weight + +LOG_FOUT = open(os.path.join(root_folder, 'log_train.txt'), 'w') +LOG_FOUT.write(str(args)+'\n') + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +model = importlib.import_module(args.model) +setting_path = os.path.join(os.path.dirname(__file__), args.model) +sys.path.append(setting_path) +setting = importlib.import_module(args.setting) + +num_epochs = args.epochs or setting.num_epochs +batch_size = args.batch_size or setting.batch_size +sample_num = args.num_point +step_val = setting.step_val +rotation_range = setting.rotation_range +rotation_range_val = setting.rotation_range_val +scaling_range = setting.scaling_range +scaling_range_val = setting.scaling_range_val +jitter = setting.jitter +jitter_val = setting.jitter_val +pool_setting_val = None if not hasattr(setting, 'pool_setting_val') else setting.pool_setting_val +pool_setting_train = None if not hasattr(setting, 'pool_setting_train') else setting.pool_setting_train + +# Prepare inputs +log_string('{}-Preparing datasets...'.format(datetime.now())) + +NUM_CLASSES = 15 + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS = data_utils.load_withmask_h5(TRAIN_FILE) +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TRAIN_MASKS = data_utils.convert_to_binary_mask(TRAIN_MASKS) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +num_train = len(TRAIN_DATA) +num_val = len(TEST_DATA) +print('{}-{:d}/{:d} training/validation samples.'.format(datetime.now(), num_train, num_val)) + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + # Placeholders + xforms = tf.placeholder(tf.float32, shape=(None, 3, 3), name="xforms") + rotations = tf.placeholder(tf.float32, shape=(None, 3, 3), name="rotations") + jitter_range = tf.placeholder(tf.float32, shape=(1), name="jitter_range") + global_step = tf.Variable(0, trainable=False, name='global_step') + is_training_pl = tf.placeholder(tf.bool, name='is_training') + + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, sample_num, 3), name='data') + labels_pl = tf.placeholder(tf.int32, shape=(batch_size), name='label') + masks_pl = tf.placeholder(tf.int32, shape=(batch_size, sample_num), name='mask') + + points_augmented = pf.augment(pointclouds_pl, xforms, jitter_range) + net = model.Net(points=points_augmented, features=None, is_training=is_training_pl, setting=setting) + classification_logits = net.classification_logits + segmentation_logits = net.segmentation_logits + + + probs = tf.nn.softmax(classification_logits, name='probs') + predictions = tf.argmax(probs, axis=-1, name='predictions') + + ##classification loss + labels_2d = tf.expand_dims(labels_pl, axis=-1, name='labels_2d') + labels_tile = tf.tile(labels_2d, (1, tf.shape(classification_logits)[1]), name='labels_tile') + classify_loss = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(labels=labels_tile, logits=classification_logits)) + + ##segmentation loss + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=segmentation_logits, labels=masks_pl), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + loss_op = (1-SEG_WEIGHT)*classify_loss + SEG_WEIGHT*seg_loss + + tf.summary.scalar('total loss', loss_op) + tf.summary.scalar('classify_loss', classify_loss) + tf.summary.scalar('seg_loss', seg_loss) + + lr_exp_op = tf.train.exponential_decay(setting.learning_rate_base, global_step, setting.decay_steps, + setting.decay_rate, staircase=True) + lr_clip_op = tf.maximum(lr_exp_op, setting.learning_rate_min) + _ = tf.summary.scalar('learning_rate', tensor=lr_clip_op, collections=['train']) + reg_loss = setting.weight_decay * tf.losses.get_regularization_loss() + if setting.optimizer == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate=lr_clip_op, epsilon=setting.epsilon) + elif setting.optimizer == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate=lr_clip_op, momentum=setting.momentum, use_nesterov=True) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + with tf.control_dependencies(update_ops): + train_op = optimizer.minimize(loss_op + reg_loss, global_step=global_step) + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) + + saver = tf.train.Saver(max_to_keep=None) + + # backup all code + # code_folder = os.path.abspath(os.path.dirname(__file__)) + # shutil.copytree(code_folder, os.path.join(root_folder) + + folder_ckpt = root_folder + # if not os.path.exists(folder_ckpt): + # os.makedirs(folder_ckpt) + + folder_summary = os.path.join(root_folder, 'summary') + if not os.path.exists(folder_summary): + os.makedirs(folder_summary) + + parameter_num = np.sum([np.prod(v.shape.as_list()) for v in tf.trainable_variables()]) + print('{}-Parameter number: {:d}.'.format(datetime.now(), parameter_num)) + + sess.run(init_op) + + # saver.restore(sess, os.path.join(folder_ckpt, "model.ckpt")) + # log_string("Model restored.") + + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(folder_summary, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(folder_summary, 'test')) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': probs, + 'seg_pred': segmentation_logits, + 'loss': loss_op, + 'classify_loss': classify_loss, + 'seg_loss': seg_loss, + 'train_op': train_op, + 'merged': merged, + 'step': global_step, + 'xforms': xforms, + 'rotations': rotations, + 'jitter_range': jitter_range} + + for epoch in range(num_epochs): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + # if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(folder_ckpt, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + +def train_one_epoch(sess, ops, train_writer): + is_training = True + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS, sample_num) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//batch_size + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * batch_size + end_idx = (batch_idx+1) * batch_size + + xforms_np, rotations_np = pf.get_xforms(batch_size, + rotation_range=rotation_range, + scaling_range=scaling_range, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter])} + + summary, step, _, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + + train_writer.add_summary(summary, step) + pred_val = np.sum(pred_val, axis=1) + pred_val = np.argmax(pred_val, 1) + # print(pred_val) + # print(current_label[start_idx:end_idx]) + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_correct += correct + total_seen += batch_size + loss_sum += loss_val + classify_loss_sum += classify_loss + seg_loss_sum += seg_loss + + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('classify mean loss: %f' % (classify_loss_sum / float(num_batches))) + log_string('seg mean loss: %f' % (seg_loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*sample_num))) + +def eval_one_epoch(sess, ops, test_writer): + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + total_correct_seg = 0 + + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, sample_num) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//batch_size + + for batch_idx in range(num_batches): + start_idx = batch_idx * batch_size + end_idx = (batch_idx+1) * batch_size + + xforms_np, rotations_np = pf.get_xforms(batch_size, + rotation_range=rotation_range_val, + scaling_range=scaling_range_val, + order=setting.rotation_order) + + # Augment batched point clouds by rotation and jittering + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training, + ops['xforms']: xforms_np, + ops['rotations']: rotations_np, + ops['jitter_range']: np.array([jitter_val])} + + summary, step, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + + pred_val = np.sum(pred_val, axis=1) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + total_correct += correct + total_seen += batch_size + loss_sum += (loss_val*batch_size) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*sample_num))) + +if __name__ == '__main__': + train() diff --git a/zoo/SimpleView/ScanObjectNN/README.md b/zoo/SimpleView/ScanObjectNN/README.md new file mode 100644 index 0000000..fc4db55 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/README.md @@ -0,0 +1,129 @@ +# Revisiting Point Cloud Classification: A New Benchmark Dataset and Classification Model on Real-World Data +**[Revisiting Point Cloud Classification: A New Benchmark Dataset and Classification Model on Real-World Data](https://hkust-vgd.github.io/scanobjectnn/)** + +Mikaela Angelina Uy, Quang-Hieu Pham, Binh-Son Hua, Duc Thanh Nguyen and Sai-Kit Yeung + +ICCV 2019 Oral Presentation + +![pic-network](objects_teaser.png) + +## Introduction +This work revisits the problem of point cloud classification but on real world scans as opposed to synthetic models such as ModelNet40 that were studied in other recent works. We introduce **ScanObjectNN**, a new benchmark dataset containing ~15,000 object that are categorized into 15 categories with 2902 unique object instances. The raw objects are represented by a list of points with global and local coordinates, normals, colors attributes and semantic labels. We also provide part annotations, which to the best of our knowledge is the first on real-world data. From our comprehensive benchmark, we show that our dataset poses great challenges to existing point cloud classification techniques as objects from real-world scans are often cluttered with background and/or are partial due to occlusions. Our project page can be found [here](https://hkust-vgd.github.io/scanobjectnn/), and the arXiv version of our paper can be found [here](https://arxiv.org/abs/1908.04616). +``` +@inproceedings{uy-scanobjectnn-iccv19, + title = {Revisiting Point Cloud Classification: A New Benchmark Dataset and Classification Model on Real-World Data}, + author = {Mikaela Angelina Uy and Quang-Hieu Pham and Binh-Son Hua and Duc Thanh Nguyen and Sai-Kit Yeung}, + booktitle = {International Conference on Computer Vision (ICCV)}, + year = {2019} + } +``` + +## ScanObjectNN Dataset + We provide different variants of our scan dataset namely: OBJ_BG, PB_T25, PB_T25_R, PB_T50_R and PB_T50_RS as described in our paper. We released both the processed .h5 files and the raw .bin objects as described below. + +### h5 files +* Download the **h5_files.zipped** to obtained all the h5 files. Main split was used for the experiments in the [main paper](https://arxiv.org/pdf/1908.04616.pdf), while splits 1-4 are the additional training/test splits reported in our [supplementary material](https://hkust-vgd.github.io/scanobjectnn/assets/iccv19_supp.pdf). +* The pre-processed h5 files can be directly used by deep learning frameworks, containing fields: + 1. **data**: Nx3 point cloud + 2. **label**: class label + 3. **mask**: indicator whether each point is part of the object instance or the background. +* Each object contained 2048 points, where each point is represented by its x, y, z coordinates. +* We first ensured that a data sample had at least 2048 object instance points (excluding the background) before 2048 points were randomly selected (including the background points) and included into the h5 file. For the \*_nobg h5 files, background points were first filtered out before the random selection. +* Naming convention: Prefixes are *training_** and *test_** for training set and test set, respectively. + * **OBJ_BG** / **OBJ_ONLY**: *\*objectdataset.h5* + * **PB_T25**: *\*objectdataset_augmented25_norot.h5* + * **PB_T25_R**: *\*objectdataset_augmented25rot.h5* + * **PB_T50_R**: *\*objectdataset_augmentedrot.h5* + * **PB_T50_RS**: *\*objectdataset_augmentedrot_scale75.h5* + +### Raw files +We release all the raw object files of our ScanObjectNN dataset including all its variants. +* To obtain the files, download the zipped files of each corresponding variant. *object_dataset.zip* refers to the unaugmented variant (OBJ_BG). +* The list of all objects can be found at *training_data/object_labels.txt*. The format per line is (separated by '\t'): + ``` + scene_folder object_id object_class object_instance_label + ``` +* The object .bin files are located at **[object_class]/[scene_folder]_[object_id].bin** in the dataset folder. +* Each .bin file is a series of *float32*. The first float represents the total number of points in the object instance. Then every succeeding set of 11 floats represent the attributes of each point. (ie if there are m points in the point cloud, then there are (11m + 1) floats in the .bin file) +* The attributes of each point are listed in the following order: + ``` + x y z nx ny nz r g b instance_label semantic_label + ``` +* We generated training and test split files located in *training_data/*, where 't' in each line of the text file indicates that the object is part of the test split. + +Parts: +* V0 of the raw files with complete parts can be found in *object_dataset_complete_with_parts.zip*. Corresponding part labels can be found in the xml files located in *training_data/part_labels/*. + +## Code +### Installation +Pre-requisites: +* python +* cuda +* tensorflow +* h5py +* scipy +* sklearn + +This code has been tested with Python 3.5, Tensorflow 1.10 and CUDA 9.0 on Ubuntu 16.04. Please follow instructions in [PointNet++](https://github.com/charlesq34/pointnet2) to compile tf_ops in *pointnet2/* and *SpiderCNN/* subfolders. + +### Usage +#### Training +To train the benchmark classification models, run the following commands: +``` +cd [method_folder] +python train.py +``` +To see optional arguments, run: +``` +cd [method_folder] +python train.py -h +``` +To train using our BGA models, run: +``` +cd [dgcnn or pointnet2] +python train_seg.py +``` +The model files are pointnet2_cls_bga.py and dgcnn_bga.py. + +#### Evaluation +To evaluate the benchmark classification models, run the following commands: +``` +cd [method_folder] +python evaluate_scenennobjects.py +``` +To evaluate our BGA models, run: +``` +cd [dgcnn or pointnet2] +python evaluate_seg_scenennobjects.py +``` + +#### Generalization of real vs synthetic +To evaluate on ScanObjectNN when trained on ModelNet, run: +``` +cd [method_folder] +python evaluate_real_trained_on_synthetic.py +``` +To evaluate on ModelNet when trained on ScanObjectNN, run: +``` +cd [method_folder] +python evaluate_synthetic_trained_on_real.py +``` +The class mapping file can be found at *mapping2.py*, details can be found in our supplementary material. Before running these experiments, please make sure you have the trained model files and a single .h5 file for the ModelNet data. The arguments need to be specified accordingly. + +## Pre-trained Models +Pre-trained models can be downloaded [here](https://drive.google.com/open?id=1somhNuzwEnJB7J6ESGuW_6ZryW8emW6u). + +## FAQ +Some commonly asked questions regarding our dataset and project can be found [here](https://github.com/hkust-vgd/scanobjectnn/tree/master/training_data). For any other inquiries, feel free to post a github issue. + +## References +Our released code heavily based on each methods original repositories as cited below: +* PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation by Qi et al. (CVPR 2017). +* PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space by Qi et al. (NIPS 2017). +* Dynamic Graph CNN for Learning on Point Clouds by Wang et al. (TOG 2019). +* PointCNN: Convolution On X-Transformed Points by Li et al. (NIPS 2018). +* SpiderCNN: Deep Learning on Point Sets with Parameterized Convolutional Filters by Xu et al. (ECCV 2018). +* 3DmFV : Three-Dimensional Point Cloud Classification in Real-Time using Convolutional Neural Networks by Ben-Shabat et al. (RA-L 2018). + +## License +This repository is released under MIT License (see LICENSE file for details). diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/README.md b/zoo/SimpleView/ScanObjectNN/SimpleView/README.md new file mode 100644 index 0000000..df80345 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/README.md @@ -0,0 +1,113 @@ + + +[**Revisiting Point Cloud Shape Classification with a Simple and Effective Baseline**](https://arxiv.org/pdf/2106.05304v1.pdf)
+[Ankit Goyal](http://imankgoyal.github.io), [Hei Law](https://heilaw.github.io/), Bowei Liu, [Alejandro Newell](https://www.alejandronewell.com/), [Jia Deng](https://www.cs.princeton.edu/~jiadeng/)
+***International Conference on Machine Learning (ICML), 2021*** + +**Note: This contains the code for SimpleView on ScanObjectNN. It reproduces the results of Table 5 in the paper. For other experiments, please use the code [here](https://github.com/princeton-vl/SimpleView)** + + +If you find our work useful in your research, please consider citing: +``` +@article{goyal2021revisiting, + title={Revisiting Point Cloud Shape Classification with a Simple and Effective Baseline}, + author={Goyal, Ankit and Law, Hei and Liu, Bowei and Newell, Alejandro and Deng, Jia}, + journal={International Conference on Machine Learning}, + year={2021} +} +``` + +## Getting Started +We would refer to the directory containing the code as `ScanObjectNN`. + +#### Requirements +The code is tested on Linux with Python version **3.7**, CUDA version **10.0**, CuDNN version **7.6** and GCC version **5.4**. + +#### Install Libraries +We recommend you first install [Anaconda](https://anaconda.org/) and create a virtual environment. +``` +conda create --name simpleview_sonn python=3.7 +``` + +Activate the virtual environment and install the libraries. Make sure you are in `ScanObjectNN`. +``` +conda activate simpleview_sonn +pip install -r requirements.txt +``` + +#### Download Datasets and Pre-trained Models +Make sure you are in `ScanObjectNN`. `download.sh` script can be used for downloading ModelNet40 and the pretrained models. It also stores them at the correct locations. + +To download ScanObjectNN, you will need to contact the authors of ScanObjectNN (mikacuy@gmail.com) to obtain a download link. After you download ScanObjectNN, unzip it under `../data`. + +To download ModelNet40, run: +``` +./download.sh modelnet40 +``` + +To download the pretrained models, run: +``` +./download.sh pretrained +``` + +## Running Experiments + +#### Training and Evaluation +We provide bash scripts to train and evaluate our SimpleView model on ScanObjectNN and ModelNet40. + +To train SimpleView on ScanObjectNN, run: +``` +bash scripts/train_scanobjnn.sh +``` + +To train SimpleView on ModelNet40, run: +``` +bash scripts/train_modelnet.sh +``` + +In our experiments, we do multiple runs and report the average accruacy of the model. You can train the network multiple times by substituing `` with different numbers and the final model will be saved to different directories. + +To evaluate SimpleView on ScanObjectNN, run: +``` +bash scripts/test_scanobjnn.sh +``` + +This will load the model from run `` and evaluate it on ScanObjectNN. Due to the randomness in the ScanObjectNN data loading code, this script evaluates a run 10 times to better estimate the performance of a model. + +To test the generalizability of our model, we also provide scripts for cross evaluation where we train our model on either ScanObjectNN or ModelNet40, and evaluate it on the other dataset. + +To evaluate a model trained on ScanObjectNN on ModelNet40, run: +``` +bash scripts/test_scanobjnn_on_modelnet40.sh +``` + +To evaluate a model trained on ModelNet40 on ScanObjectNN, run: +``` +bash scripts/test_modelnet40_on_scanobjnn.sh +``` + +If you get the following error when you train or evaluate the model: +``` +ValueError: Attr 'num_split' of 'Split' Op passed 0 less than minimum 1. +``` + +It means that TensforFlow cannot find the cuDNN library on your machine. You need to download the cuDNN library from NVIDIA to your machine and run the following command before running the scripts: +``` +export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/path/to/cudnn/lib64" +``` + + +#### Evaluate a pretrained model +Pretrained models of 4 different runs can be downloaded using the `./download pretrained` command and are stored in the `log` folder. To evaluate a model, you can use the above command and replace `` with a number between 1 and 4. + +For example, to evaluate a model trained on ScanObjectNN from run 3 on ScanObjectNN, run: +``` +bash scripts/test_scanobjnn.sh 3 +``` + +#### Performance of the released pretrained models +
ArchitectureTrain: ScanObjectNN
Test: ScanObjectNN
Train: ModelNet40
Test: ScanObjectNN
Train: ScanObjectNN
Test: ModelNet40
3DmFV63.024.951.5
PointNet68.231.150.9
SpiderCNN73.730.946.6
PointNet++77.932.047.4
DGCNN78.136.854.7
PointCNN78.524.649.2
SimpleView79.5 +/- 0.540.5 +/- 1.457.9 +/- 2.1
+ +## Acknowlegements +We would like to thank the authors of the following reposities for sharing their code. +- Revisiting Point Cloud Classification: A New Benchmark Dataset and Classification Model on Real-World Data: [1](https://github.com/hkust-vgd/scanobjectnn.git) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/data_aug.py b/zoo/SimpleView/ScanObjectNN/SimpleView/data_aug.py new file mode 100644 index 0000000..07cd049 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/data_aug.py @@ -0,0 +1,90 @@ +import tensorflow as tf + +import numpy as np +import matplotlib.pyplot as plt + +def plot_images(dataset, n_images, samples_per_image): + output = np.zeros((32 * n_images, 32 * samples_per_image, 1)) + + row = 0 + for images in dataset.repeat(samples_per_image).batch(n_images): + output[:, row * 32:(row + 1) * 32] = np.vstack(images.numpy()) + row += 1 + + plt.figure() + plt.imshow(output) + plt.show() + +def flip(x: tf.Tensor) -> tf.Tensor: + """Flip augmentation + + Args: + x: Image to flip + + Returns: + Augmented image + """ + x = tf.image.random_flip_left_right(x) + return x + +def color(x: tf.Tensor) -> tf.Tensor: + """Color augmentation + + Args: + x: Image + + Returns: + Augmented image + """ + x = tf.image.random_hue(x, 0.08) + x = tf.image.random_saturation(x, 0.6, 1.6) + x = tf.image.random_brightness(x, 0.05) + x = tf.image.random_contrast(x, 0.7, 1.3) + return x + +def jitter(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter images. jittering is per pixel. + Input: + BxNxNx1 array, original batch of images + Return: + BxNxNx1 array, jittered batch of images + """ + assert(clip > 0) + mask = tf.equal(batch_data, 0.0) + r = tf.clip_by_value(sigma * tf.random.normal(tf.shape(batch_data), dtype=tf.float32), -1 * clip, clip) + add = tf.add_n([batch_data, r]) + targets = tf.where(mask, batch_data, add) + return targets + +def rotate(x: tf.Tensor) -> tf.Tensor: + """Rotation augmentation + + Args: + x: Image + + Returns: + Augmented image + """ + + return tf.image.rot90(x, tf.random.uniform(shape=[], minval=0, maxval=4, dtype=tf.int32)) + +def zoom(x: tf.Tensor, batch: int, resolution: int, ratio=0.2, extrapolation_value=0) -> tf.Tensor: + """Zoom augmentation + + Args: + x: Image + + Returns: + Augmented image + """ + if extrapolation_value == 0: + print("WARNING: using 0 for the extrapolated value") + + boxes = np.concatenate((np.zeros((batch, 2)), np.ones((batch, 2))), axis=1) + ind = np.arange(0, batch, 1) + num = tf.random.uniform(shape=[batch, 4], minval=-ratio, maxval=ratio, dtype=tf.dtypes.float32) + boxes = tf.add(tf.constant(boxes, dtype=tf.float32), num) + return tf.image.crop_and_resize( + x, boxes=boxes, box_ind=ind, crop_size=(resolution, resolution), method='nearest', + extrapolation_value=extrapolation_value + ) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/download.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/download.sh new file mode 100755 index 0000000..08439ff --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/download.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +wgetgdrive(){ + # $1 = file ID + # $2 = file name + + URL="https://docs.google.com/uc?export=download&id=$1" + + wget --load-cookies ./cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate $URL -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=$1" -O $2 && rm -f ./cookies.txt +} + +key="$1" +case $key in + pretrained) + wgetgdrive 13azeEzByxIw-Q_1A4EzlVtUuTHUOWCi6 pretrained.tar + tar -xvf pretrained.tar + ;; + modelnet40) + wget --no-check-certificate https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip + + unzip modelnet40_ply_hdf5_2048.zip + + mkdir ../data + mv modelnet40_ply_hdf5_2048 ../data + ;; + *) + echo "unknow argument $1" # unknown argument + ;; +esac diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/gpu.py b/zoo/SimpleView/ScanObjectNN/SimpleView/gpu.py new file mode 100644 index 0000000..9a8d90f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/gpu.py @@ -0,0 +1,136 @@ +import tensorflow as tf + +PS_OPS = [ + 'Variable', 'VariableV2', 'AutoReloadVariable', 'MutableHashTable', + 'MutableHashTableOfTensors', 'MutableDenseHashTable' +] + +# see https://github.com/tensorflow/tensorflow/issues/9517 +def assign_to_device(device, ps_device): + """Returns a function to place variables on the ps_device. + + Args: + device: Device for everything but variables + ps_device: Device to put the variables on. Example values are /GPU:0 and /CPU:0. + + If ps_device is not set then the variables will be placed on the device. + The best device for shared varibles depends on the platform as well as the + model. Start with CPU:0 and then test GPU:0 to see if there is an + improvement. + """ + def _assign(op): + node_def = op if isinstance(op, tf.NodeDef) else op.node_def + if node_def.op in PS_OPS: + return ps_device + else: + return device + return _assign + + +def create_parallel_optimization(model_fn, devices, is_training_pl, bn_decay, optimizer, loss_filter_fn, weight_decay, controller="/cpu:0", **kwargs): + # This function is defined below; it returns a list of device ids like + # `['/gpu:0', '/gpu:1']` + + # This list keeps track of the gradients per tower and the losses + tower_grads = [] + losses = [] + total_pred = [] + total_start = [] + + in_splits = {} + for k, v in kwargs.items(): + in_splits[k] = tf.split(v, len(devices)) + + # Get the current variable scope so we can reuse all variables we need once we get + # to the second iteration of the loop below + with tf.variable_scope(tf.get_variable_scope()) as outer_scope: + for i, id in enumerate(devices): + # tf.cond(tf.equal(i, len(devices) - 1), input_fn.reset, lambda: 1) + name = 'tower_{}'.format(i) + # Use the assign_to_device function to ensure that variables are created on the + # controller. + with tf.device(assign_to_device(id, controller)), tf.name_scope(name): + # Compute loss and gradients, but don't apply them yet + loss, pred, start = model_fn(is_training_pl, bn_decay, tf.constant(i), **{k: v[i] for k, v in in_splits.items()}) + + with tf.name_scope("compute_gradients"): + grads = optimizer.compute_gradients(loss) + tower_grads.append(grads) + + losses.append(loss) + total_pred.append(pred) + total_start.append(start) + + # After the first iteration, we want to reuse the variables. + outer_scope.reuse_variables() + + # Apply the gradients on the controlling device + with tf.name_scope("apply_gradients"), tf.device(controller): + # Note that what we are doing here mathematically is equivalent to returning the + # average loss over the towers and compute the gradients relative to that. + # Unfortunately, this would place all gradient-computations on one device, which is + # why we had to compute the gradients above per tower and need to average them here. + + # This function is defined below; it takes the list of (gradient, variable) lists + # and turns it into a single (gradient, variables) list. + total_pred = tf.concat(total_pred, axis=0) + total_start = tf.stack(total_start, axis=0) + gradients = average_gradients(tower_grads) + global_step = tf.train.get_or_create_global_step() + update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) + with tf.control_dependencies(update_ops): + apply_gradient_op = optimizer.apply_gradients(gradients, global_step) + avg_loss = tf.reduce_mean(losses) + tf.summary.scalar('avg_loss', avg_loss) + return apply_gradient_op, total_pred, avg_loss, total_start + + +# see https://stackoverflow.com/questions/38559755/how-to-get-current-available-gpus-in-tensorflow +def get_available_gpus(): + """ + Returns a list of the identifiers of all visible GPUs. + """ + from tensorflow.python.client import device_lib + local_device_protos = device_lib.list_local_devices() + return [x.name for x in local_device_protos if x.device_type == 'GPU'] + + +def average_gradients(tower_grads): + """Calculate the average gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list ranges + over the devices. The inner list ranges over the different variables. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [g for g, _ in grad_and_vars] + grad = tf.reduce_mean(grads, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + + +def do_training(update_op, loss): + with tf.Session() as sess: + try: + step = 0 + while True: + _, loss_value = sess.run((update_op, loss)) + if step % 100 == 0: + print('Step {} with loss {}'.format(step, loss_value)) + step += 1 + except tf.errors.OutOfRangeError: + pass + print('Final loss: {}'.format(loss_value)) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/img/simpleview.png b/zoo/SimpleView/ScanObjectNN/SimpleView/img/simpleview.png new file mode 100644 index 0000000..0d0379a Binary files /dev/null and b/zoo/SimpleView/ScanObjectNN/SimpleView/img/simpleview.png differ diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/models/multi_res.py b/zoo/SimpleView/ScanObjectNN/SimpleView/models/multi_res.py new file mode 100644 index 0000000..b1bd7a4 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/models/multi_res.py @@ -0,0 +1,146 @@ +import tensorflow as tf +import sys +import os +import tf_util +import multi_model as resnet_model + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) + + +def placeholder_inputs(batch_size, num_point, resolution, views, devices): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size * views * len(devices), resolution, resolution, 1)) + labels_pl = tf.placeholder(tf.int32, shape=batch_size * len(devices)) + return pointclouds_pl, labels_pl + +def _get_block_sizes(resnet_size): + """Retrieve the size of each block_layer in the ResNet model. + The number of block layers used for the Resnet model varies according + to the size of the model. This helper grabs the layer set we want, throwing + an error if a non-standard size has been selected. + Args: + resnet_size: The number of convolutional layers needed in the model. + Returns: + A list of block sizes to use in building the model. + Raises: + KeyError: if invalid resnet_size is received. + """ + choices = { + 9: [2, 2], + 18: [2, 2, 2, 2], + 34: [3, 4, 6, 3], + 50: [3, 4, 6, 3], + 101: [3, 4, 23, 3], + 152: [3, 8, 36, 3], + 200: [3, 24, 36, 3] + } + + try: + return choices[resnet_size] + except KeyError: + err = ( + 'Could not find layers for selected Resnet size.\n' + 'Size received: {}; sizes allowed: {}.'.format(resnet_size, choices.keys()) + ) + raise ValueError(err) + + +def get_model(images, batch, views, is_training, bn_decay, num_classes=15, bn=True, resnet_size=18, kernel_size=7, + conv_stride=2, first_pool_size=3, first_pool_stride=2): + """ Classification Resnet, input is (BxV)XRXRX1, output Bx40 """ + resnet_version = 2 + data_format = None + dtype = resnet_model.DEFAULT_DTYPE + print(resnet_size) + block_strides = [1, 2] if resnet_size == 9 else [1, 2, 2, 2] + model = resnet_model.Model( + resnet_size=resnet_size, + bottleneck=False, + num_classes=num_classes, + num_filters=16, + kernel_size=kernel_size, + conv_stride=conv_stride, + first_pool_size=first_pool_size, + first_pool_stride=first_pool_stride, + block_sizes=_get_block_sizes(resnet_size), + block_strides=block_strides, + bn_decay=bn_decay, + resnet_version=resnet_version, + data_format=data_format, + dtype=dtype, + bn=bn + ) + + print(f"kernel_size: {kernel_size}") + print(f"conv_stride: {conv_stride}") + print(f"first_pool_size: {first_pool_size}") + print(f"first_pool_stride: {first_pool_stride}") + + features = model(images, training=is_training) # (BXV)XF + with tf.compat.v1.variable_scope("extract", reuse=tf.compat.v1.AUTO_REUSE): + if views != 1: + out = tf.reshape(features, [batch * views, -1, 1, 1]) + out = tf_util.batch_norm_for_conv2d(out, is_training, bn_decay, scope="bn1") + out = tf.reshape(out, [batch, views, -1]) + out = tf_util.dropout(out, is_training, scope="dp1") + out = tf.reshape(out, [batch, -1]) + out = tf_util.fully_connected(out, 128, scope="fc1", is_training=is_training, bn=bn, bn_decay=bn_decay) + out = tf_util.dropout(out, is_training, scope="dp2") + else: + out = features + out = tf_util.fully_connected(out, num_classes, activation_fn=None, scope='fc3') # BXnum_classes + end_points = {} + return out, end_points + +def get_loss(pred, label, weight_decay, end_points, loss_filter_fn=None, num_classes=15): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + + # If no loss_filter_fn is passed, assume we want the default behavior, + # which is that batch_normalization variables are excluded from loss. + def exclude_batch_norm(v): + tf.summary.scalar(v.name, tf.nn.l2_loss(tf.cast(v, tf.float32))) + return 'batch_normalization' not in v.name + + loss_filter_fn = loss_filter_fn or exclude_batch_norm + print(loss_filter_fn) + + # Add weight decay to the loss. + l2_loss = weight_decay * tf.add_n( + # loss is computed using fp32 for numerical stability. + [ + tf.nn.l2_loss(tf.cast(v, tf.float32)) + for v in tf.compat.v1.trainable_variables() + if loss_filter_fn(v) + ]) + + tf.summary.scalar('l2_loss', l2_loss) + loss = classify_loss + l2_loss + return loss + +def parameters(): + total_parameters = 0 + for variable in tf.trainable_variables(): + # shape is an array of tf.Dimension + shape = variable.get_shape() + print(shape) + print(len(shape)) + variable_parameters = 1 + for dim in shape: + print(dim) + variable_parameters *= dim.value + print(variable_parameters) + total_parameters += variable_parameters + print(total_parameters) + return total_parameters + + +if __name__ == '__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32, 1024, 3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/multi_model.py b/zoo/SimpleView/ScanObjectNN/SimpleView/multi_model.py new file mode 100644 index 0000000..61c18de --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/multi_model.py @@ -0,0 +1,588 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for Residual Networks. + +Residual networks ('v1' ResNets) were originally proposed in: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +The full preactivation 'v2' ResNet variant was introduced by: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The key difference of the full preactivation 'v2' variant compared to the +'v1' variant in [1] is the use of batch normalization before every weight layer +rather than after. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +_BATCH_NORM_DECAY = 0.997 +_BATCH_NORM_EPSILON = 1e-5 +DEFAULT_VERSION = 2 +DEFAULT_DTYPE = tf.float32 +CASTABLE_TYPES = (tf.float16,) +ALLOWED_TYPES = (DEFAULT_DTYPE,) + CASTABLE_TYPES + + +################################################################################ +# Convenience functions for building the ResNet model. +################################################################################ +def batch_norm(inputs, training, data_format): + """Performs a batch normalization using a standard set of parameters.""" + # We set fused=True for a significant performance boost. See + # https://www.tensorflow.org/performance/performance_guide#common_fused_ops + print(_BATCH_NORM_DECAY) + return tf.compat.v1.layers.batch_normalization( + inputs=inputs, axis=1 if data_format == 'channels_first' else 3, + momentum=_BATCH_NORM_DECAY, + epsilon=_BATCH_NORM_EPSILON, + center=True, + scale=True, + training=training, + fused=True + ) + + +def fixed_padding(inputs, kernel_size, data_format): + """Pads the input along the spatial dimensions independently of input size. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + kernel_size: The kernel to be used in the conv2d or max_pool2d operation. + Should be a positive integer. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + A tensor with the same format as the input with the data either intact + (if kernel_size == 1) or padded (if kernel_size > 1). + """ + pad_total = kernel_size - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + + if data_format == 'channels_first': + padded_inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [0, 0], [pad_beg, pad_end], + [pad_beg, pad_end]] + ) + else: + padded_inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [pad_beg, pad_end], + [pad_beg, pad_end], [0, 0]] + ) + return padded_inputs + + +def conv2d_fixed_padding(inputs, filters, kernel_size, strides, data_format): + """Strided 2-D convolution with explicit padding.""" + # The padding is consistent and is based only on `kernel_size`, not on the + # dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone). + if strides > 1: + inputs = fixed_padding(inputs, kernel_size, data_format) + + return tf.compat.v1.layers.conv2d( + inputs=inputs, filters=filters, kernel_size=kernel_size, strides=strides, + padding=('SAME' if strides == 1 else 'VALID'), use_bias=False, + kernel_initializer=tf.compat.v1.variance_scaling_initializer(distribution='uniform'), + data_format=data_format + ) + + +################################################################################ +# ResNet block definitions. +################################################################################ +def _building_block_v1(inputs, filters, training, projection_shortcut, strides, data_format, bn): + """A single block for ResNet v1, without a bottleneck. + + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + if bn: + shortcut = batch_norm( + inputs=shortcut, training=training, + data_format=data_format + ) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format + ) + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1, + data_format=data_format + ) + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs += shortcut + inputs = tf.nn.relu(inputs) + + return inputs + + +def _building_block_v2(inputs, filters, training, projection_shortcut, strides, data_format, bn): + """A single block for ResNet v2, without a bottleneck. + + Batch normalization then ReLu then convolution as described by: + Identity Mappings in Deep Residual Networks + https://arxiv.org/pdf/1603.05027.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + # The projection shortcut should come after the first batch norm and ReLU + # since it performs a 1x1 convolution. + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format + ) + + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1, + data_format=data_format + ) + + return inputs + shortcut + + +def _bottleneck_block_v1(inputs, filters, training, projection_shortcut, strides, data_format, bn): + """A single block for ResNet v1, with a bottleneck. + + Similar to _building_block_v1(), except using the "bottleneck" blocks + described in: + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + if bn: + shortcut = batch_norm( + inputs=shortcut, training=training, + data_format=data_format + ) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1, + data_format=data_format + ) + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format + ) + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1, + data_format=data_format + ) + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs += shortcut + inputs = tf.nn.relu(inputs) + + return inputs + + +def _bottleneck_block_v2(inputs, filters, training, projection_shortcut, strides, data_format, bn): + """A single block for ResNet v2, with a bottleneck. + + Similar to _building_block_v2(), except using the "bottleneck" blocks + described in: + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Adapted to the ordering conventions of: + Batch normalization then ReLu then convolution as described by: + Identity Mappings in Deep Residual Networks + https://arxiv.org/pdf/1603.05027.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + # The projection shortcut should come after the first batch norm and ReLU + # since it performs a 1x1 convolution. + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1, + data_format=data_format + ) + + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format + ) + + if bn: + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1, + data_format=data_format + ) + + return inputs + shortcut + + +def block_layer(inputs, filters, bottleneck, block_fn, blocks, strides, training, name, data_format, bn): + """Creates one layer of blocks for the ResNet model. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the first convolution of the layer. + bottleneck: Is the block created a bottleneck block. + block_fn: The block to use within the model, either `building_block` or + `bottleneck_block`. + blocks: The number of blocks contained in the layer. + strides: The stride to use for the first convolution of the layer. If + greater than 1, this layer will ultimately downsample the input. + training: Either True or False, whether we are currently training the + model. Needed for batch norm. + name: A string name for the tensor output of the block layer. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block layer. + """ + + # Bottleneck blocks end with 4x the number of filters as they start with + filters_out = filters * 4 if bottleneck else filters + + def projection_shortcut(inputs): + return conv2d_fixed_padding( + inputs=inputs, filters=filters_out, kernel_size=1, strides=strides, + data_format=data_format + ) + + # Only the first block per block_layer uses projection_shortcut and strides + inputs = block_fn(inputs, filters, training, projection_shortcut, strides, data_format, bn) + + for _ in range(1, blocks): + inputs = block_fn(inputs, filters, training, None, 1, data_format, bn) + + return tf.identity(inputs, name) + + +class Model(object): + """Base class for building the Resnet Model.""" + + def __init__( + self, resnet_size, bottleneck, num_classes, num_filters, + kernel_size, conv_stride, first_pool_size, first_pool_stride, + block_sizes, block_strides, bn_decay, + resnet_version=DEFAULT_VERSION, data_format=None, + dtype=DEFAULT_DTYPE, bn=True + ): + """Creates a model for classifying an image. + + Args: + resnet_size: A single integer for the size of the ResNet model. + bottleneck: Use regular blocks or bottleneck blocks. + num_classes: The number of classes used as labels. + num_filters: The number of filters to use for the first block layer + of the model. This number is then doubled for each subsequent block + layer. + kernel_size: The kernel size to use for convolution. + conv_stride: stride size for the initial convolutional layer + first_pool_size: Pool size to be used for the first pooling layer. + If none, the first pooling layer is skipped. + first_pool_stride: stride size for the first pooling layer. Not used + if first_pool_size is None. + block_sizes: A list containing n values, where n is the number of sets of + block layers desired. Each value should be the number of blocks in the + i-th set. + block_strides: List of integers representing the desired stride size for + each of the sets of block layers. Should be same length as block_sizes. + resnet_version: Integer representing which version of the ResNet network + to use. See README for details. Valid values: [1, 2] + data_format: Input format ('channels_last', 'channels_first', or None). + If set to None, the format is dependent on whether a GPU is available. + dtype: The TensorFlow dtype to use for calculations. If not specified + tf.float32 is used. + + Raises: + ValueError: if invalid version is selected. + """ + self.resnet_size = resnet_size + self.bn = bn + + if not data_format: + data_format = ('channels_first' if tf.test.is_built_with_cuda() else 'channels_last') + + self.resnet_version = resnet_version + if resnet_version not in (1, 2): + raise ValueError('Resnet version should be 1 or 2. See README for citations.') + + self.bottleneck = bottleneck + if bottleneck: + if resnet_version == 1: + self.block_fn = _bottleneck_block_v1 + else: + self.block_fn = _bottleneck_block_v2 + else: + if resnet_version == 1: + self.block_fn = _building_block_v1 + else: + self.block_fn = _building_block_v2 + + if dtype not in ALLOWED_TYPES: + raise ValueError('dtype must be one of: {}'.format(ALLOWED_TYPES)) + + self.data_format = data_format + self.num_classes = num_classes + self.num_filters = num_filters + self.kernel_size = kernel_size + self.conv_stride = conv_stride + self.first_pool_size = first_pool_size + self.first_pool_stride = first_pool_stride + self.block_sizes = block_sizes + self.block_strides = block_strides + self.dtype = dtype + self.pre_activation = resnet_version == 2 + global _BATCH_NORM_DECAY + _BATCH_NORM_DECAY = bn_decay + + def _custom_dtype_getter(self, getter, name, shape=None, dtype=DEFAULT_DTYPE, *args, **kwargs): + """Creates variables in fp32, then casts to fp16 if necessary. + + This function is a custom getter. A custom getter is a function with the + same signature as tf.get_variable, except it has an additional getter + parameter. Custom getters can be passed as the `custom_getter` parameter of + tf.variable_scope. Then, tf.get_variable will call the custom getter, + instead of directly getting a variable itself. This can be used to change + the types of variables that are retrieved with tf.get_variable. + The `getter` parameter is the underlying variable getter, that would have + been called if no custom getter was used. Custom getters typically get a + variable with `getter`, then modify it in some way. + + This custom getter will create an fp32 variable. If a low precision + (e.g. float16) variable was requested it will then cast the variable to the + requested dtype. The reason we do not directly create variables in low + precision dtypes is that applying small gradients to such variables may + cause the variable not to change. + + Args: + getter: The underlying variable getter, that has the same signature as + tf.get_variable and returns a variable. + name: The name of the variable to get. + shape: The shape of the variable to get. + dtype: The dtype of the variable to get. Note that if this is a low + precision dtype, the variable will be created as a tf.float32 variable, + then cast to the appropriate dtype + *args: Additional arguments to pass unmodified to getter. + **kwargs: Additional keyword arguments to pass unmodified to getter. + + Returns: + A variable which is cast to fp16 if necessary. + """ + + if dtype in CASTABLE_TYPES: + var = getter(name, shape, tf.float32, *args, **kwargs) + return tf.cast(var, dtype=dtype, name=name + '_cast') + else: + return getter(name, shape, dtype, *args, **kwargs) + + def _model_variable_scope(self): + """Returns a variable scope that the model should be created under. + + If self.dtype is a castable type, model variable will be created in fp32 + then cast to self.dtype before being used. + + Returns: + A variable scope for the model. + """ + + return tf.compat.v1.variable_scope( + 'resnet_model', custom_getter=self._custom_dtype_getter, reuse=tf.compat.v1.AUTO_REUSE + ) + + def __call__(self, inputs, training): + """Add operations to classify a batch of input images. + + Args: + inputs: A Tensor representing a batch of input images. + training: A boolean. Set to True to add operations required only when + training the classifier. + + Returns: + A logits Tensor with shape [, self.num_classes]. + """ + + with self._model_variable_scope(): + if self.data_format == 'channels_first': + # Convert the inputs from channels_last (NHWC) to channels_first (NCHW). + # This provides a large performance boost on GPU. See + # https://www.tensorflow.org/performance/performance_guide#data_formats + inputs = tf.transpose(a=inputs, perm=[0, 3, 1, 2]) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=self.num_filters, kernel_size=self.kernel_size, + strides=self.conv_stride, data_format=self.data_format + ) + inputs = tf.identity(inputs, 'initial_conv') + + # We do not include batch normalization or activation functions in V2 + # for the initial conv1 because the first ResNet unit will perform these + # for both the shortcut and non-shortcut paths as part of the first + # block's projection. Cf. Appendix of [2]. + if self.resnet_version == 1: + if self.bn: + inputs = batch_norm(inputs, training, self.data_format) + inputs = tf.nn.relu(inputs) + + if self.first_pool_size: + inputs = tf.compat.v1.layers.max_pooling2d( + inputs=inputs, pool_size=self.first_pool_size, + strides=self.first_pool_stride, padding='SAME', + data_format=self.data_format + ) + inputs = tf.identity(inputs, 'initial_max_pool') + + for i, num_blocks in enumerate(self.block_sizes): + num_filters = self.num_filters * (2**i) + inputs = block_layer( + inputs=inputs, filters=num_filters, bottleneck=self.bottleneck, + block_fn=self.block_fn, blocks=num_blocks, + strides=self.block_strides[i], training=training, + name='block_layer{}'.format(i + 1), data_format=self.data_format, bn=self.bn + ) + + # Only apply the BN and ReLU for model that does pre_activation in each + # building/bottleneck block, eg resnet V2. + if self.pre_activation: + if self.bn: + inputs = batch_norm(inputs, training, self.data_format) + inputs = tf.nn.relu(inputs) + + # The current top layer has shape + # `batch_size x pool_size x pool_size x final_size`. + # ResNet does an Average Pooling layer over pool_size, + # but that is the same as doing a reduce_mean. We do a reduce_mean + # here because it performs better than AveragePooling2D. + axes = [2, 3] if self.data_format == 'channels_first' else [1, 2] + inputs = tf.reduce_mean(input_tensor=inputs, axis=axes, keepdims=True) + inputs = tf.identity(inputs, 'final_reduce_mean') + + inputs = tf.squeeze(inputs, axes) + # inputs = tf.compat.v1.layers.dense(inputs=inputs, units=self.num_classes) + # inputs = tf.identity(inputs, 'final_dense') + return inputs diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/provider.py b/zoo/SimpleView/ScanObjectNN/SimpleView/provider.py new file mode 100644 index 0000000..c530107 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/provider.py @@ -0,0 +1,201 @@ +import os +import sys +import numpy as np +import h5py +import torch + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(ROOT_DIR, '../') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'data/modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1 * clip, clip) + jittered_data += batch_data + return jittered_data + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + with h5py.File(h5_filename, 'r') as f: + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(os.path.join(DATA_DIR, filename)) + +def load_h5_data_label_seg(h5_filename): + with h5py.File(h5_filename, 'r') as f: + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) + + +def loadDataFile_with_seg(filename): + return load_h5_data_label_seg(filename) + +def euler2mat(angle): + """Convert euler angles to rotation matrix. + :param angle: [3] or [b, 3] + :return + rotmat: [3] or [b, 3, 3] + Reference: # source https://github.com/ClementPinard/SfmLearner-Pytorch/blob/master/inverse_warp.py + """ + + if len(angle.size()) == 1: + x, y, z = angle[0], angle[1], angle[2] + _dim = 0 + _view = [3, 3] + elif len(angle.size()) == 2: + b, _ = angle.size() + x, y, z = angle[:, 0], angle[:, 1], angle[:, 2] + _dim = 1 + _view = [b, 3, 3] + + else: + assert False + + cosz = torch.cos(z) + sinz = torch.sin(z) + + zero = z.detach() * 0 + one = zero.detach() + 1 + zmat = torch.stack([ + cosz, -sinz, zero, + sinz, cosz, zero, + zero, zero, one + ], dim=_dim).reshape(_view) + + cosy = torch.cos(y) + siny = torch.sin(y) + + ymat = torch.stack([ + cosy, zero, siny, + zero, one, zero, + -siny, zero, cosy + ], dim=_dim).reshape(_view) + + cosx = torch.cos(x) + sinx = torch.sin(x) + + xmat = torch.stack([ + one, zero, zero, + zero, cosx, -sinx, + zero, sinx, cosx + ], dim=_dim).reshape(_view) + + rot_mat = xmat @ ymat @ zmat + return rot_mat + + +def point_transform(points, angle, translation): + """ + :param points: [batch, height*width, 3] + :param angle: [3] or [batch, 3] + :param translation: [3] or [batch, 3] + :return: + """ + + rot_mat = euler2mat(angle) + rot_mat = rot_mat.to(points.device) + + if len(angle.size()) == 1: + points = torch.matmul(points, torch.transpose(rot_mat, 0, 1)) + else: + points = torch.matmul(points, torch.transpose(rot_mat, 1, 2)) + + translation = translation.to(points.device) + if len(angle.size()) == 2: + translation = translation.unsqueeze(1) + points = points - translation + return points + + +def get_modelnet_data(file_name, rel_path="../"): + with open(file_name) as file: + files = [rel_path + line.rstrip() for line in file] + + total_data = np.array([]).reshape((0, 2048, 3)) + total_labels = np.array([]).reshape((0, 1)) + for i in range(len(files)): + data, labels = load_h5(files[i]) + total_data = np.concatenate((total_data, data)) + total_labels = np.concatenate((total_labels, labels)) + total_labels = total_labels.astype(int) + + return total_data, total_labels diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/requirements.txt b/zoo/SimpleView/ScanObjectNN/SimpleView/requirements.txt new file mode 100644 index 0000000..b4ce709 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/requirements.txt @@ -0,0 +1,45 @@ +absl-py==0.12.0 +astor==0.8.1 +awscli==1.19.16 +botocore==1.20.16 +boundaries==0.0.0 +cached-property==1.5.2 +certifi==2021.5.30 +chardet==3.0.4 +cpools==0.0.0 +cudnn-convolution==0.0.0 +cycler==0.10.0 +dynamic-mem==0.0.0 +gast==0.2.2 +google-pasta==0.2.0 +grpcio==1.38.0 +h5py==3.2.1 +idna==2.8 +importlib-metadata==4.5.0 +Keras-Applications==1.0.8 +Keras-Preprocessing==1.1.2 +kiwisolver==1.3.1 +Markdown==3.3.4 +matplotlib==3.4.2 +numpy==1.20.3 +opt-einsum==3.3.0 +Pillow==8.2.0 +protobuf==3.17.3 +pyparsing==2.4.7 +python-dateutil==2.8.1 +pytorchcv==0.0.47 +requests==2.22.0 +s3transfer==0.3.4 +scipy==1.6.3 +six==1.16.0 +tensorboard==1.15.0 +tensorflow-estimator==1.15.1 +tensorflow-gpu==1.15.0 +termcolor==1.1.0 +torch==1.8.1+cu111 +torchaudio==0.8.1 +torchvision==0.9.1+cu111 +typing-extensions==3.10.0.0 +Werkzeug==2.0.1 +wrapt==1.12.1 +zipp==3.4.1 diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_modelnet40_on_scanobjnn.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_modelnet40_on_scanobjnn.sh new file mode 100755 index 0000000..ada7f8c --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_modelnet40_on_scanobjnn.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -x +set -e + +export PYTHONUNBUFFERED="True" +LOG="log_txt/test_modelnet40_on_scanobjnn.txt.$(date +'%Y-%m-%d_%H-%M-%S')" +exec &> >(tee -a "${LOG}") + +run="${1}" + +python train.py \ + --resolution 128 \ + --views 6 \ + --weight_decay 0 \ + --batch_size 60 \ + --aug \ + --sigma 0.01 \ + --clip 0.05 \ + --ratio 0.35 \ + --learning_rate 0.001 \ + --decay_rate 0.7 \ + --size 1 \ + --learning_rate_clip 0 \ + --resnet_size 18 \ + --train_file ../data/modelnet40_ply_hdf5_2048/train_files.txt \ + --test_file ../data/modelnet40_ply_hdf5_2048/test_files.txt \ + --num_class 40 \ + --kernel_size 3 \ + --conv_stride 1 \ + --first_pool_size 0 \ + --first_pool_stride 0 \ + --max_epoch 300 \ + --record_file ../records/modelnet40_run_${run}_eval.csv \ + --log_dir log/modelnet40_run_${run}_eval \ + --file_dir log/modelnet40_run_${run} \ + --cross_file ../data/h5_files/main_split_nobg/test_objectdataset_augmentedrot_scale75.h5 \ + --eval \ + --cross_eval diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_scanobjnn.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_scanobjnn.sh new file mode 100755 index 0000000..f05c8e0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_scanobjnn.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -x +set -e + +export PYTHONUNBUFFERED="True" +LOG="log_txt/test_scanobjnn.txt.$(date +'%Y-%m-%d_%H-%M-%S')" +exec &> >(tee -a "${LOG}") + +run="${1}" + +python train.py \ + --resolution 128 \ + --views 6 \ + --weight_decay 0 \ + --batch_size 60 \ + --aug \ + --sigma 0.01 \ + --clip 0.05 \ + --ratio 0.35 \ + --learning_rate 0.001 \ + --decay_rate 0.7 \ + --size 1 \ + --learning_rate_clip 0 \ + --num_class 15 \ + --kernel_size 3 \ + --conv_stride 1 \ + --first_pool_size 0 \ + --first_pool_stride 0 \ + --max_epoch 300 \ + --record_file ../records/scanobjnn_run_${run}_eval.csv \ + --log_dir log/scanobjnn_run_${run}_eval \ + --file_dir log/scanobjnn_run_${run} \ + --train_file ../data/h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5 \ + --test_file ../data/h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5 \ + --eval diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_scanobjnn_on_modelnet40.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_scanobjnn_on_modelnet40.sh new file mode 100755 index 0000000..8234a3a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/test_scanobjnn_on_modelnet40.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -x +set -e + +export PYTHONUNBUFFERED="True" +LOG="log_txt/test_scanobjnn_on_modelnet40.txt.$(date +'%Y-%m-%d_%H-%M-%S')" +exec &> >(tee -a "${LOG}") + +run="${1}" + +python train.py \ + --resolution 128 \ + --views 6 \ + --weight_decay 0 \ + --batch_size 60 \ + --aug \ + --sigma 0.01 \ + --clip 0.05 \ + --ratio 0.35 \ + --learning_rate 0.001 \ + --decay_rate 0.7 \ + --size 1 \ + --learning_rate_clip 0 \ + --num_class 15 \ + --kernel_size 3 \ + --conv_stride 1 \ + --first_pool_size 0 \ + --first_pool_stride 0 \ + --max_epoch 300 \ + --record_file ../records/scanobjnn_modelnet40_run_${run}_eval.csv \ + --log_dir log/scanobjnn_modelnet40_run_${run}_eval \ + --file_dir log/scanobjnn_run_${run} \ + --train_file ../data/h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5 \ + --test_file ../data/h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5 \ + --cross_file ../data/modelnet40_ply_hdf5_2048/test_files.txt \ + --eval \ + --cross_eval diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/train_modelnet40.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/train_modelnet40.sh new file mode 100755 index 0000000..7490fdc --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/train_modelnet40.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +set -x +set -e + +export PYTHONUNBUFFERED="True" +LOG="log_txt/train_modelnet40.txt.$(date +'%Y-%m-%d_%H-%M-%S')" +exec &> >(tee -a "${LOG}") + +run="${1}" + +python train.py \ + --resolution 128 \ + --views 6 \ + --weight_decay 0 \ + --batch_size 60 \ + --aug \ + --sigma 0.01 \ + --clip 0.05 \ + --ratio 0.35 \ + --learning_rate 0.001 \ + --decay_rate 0.7 \ + --size 1 \ + --learning_rate_clip 0 \ + --resnet_size 18 \ + --train_file ../data/modelnet40_ply_hdf5_2048/train_files.txt \ + --test_file ../data/modelnet40_ply_hdf5_2048/test_files.txt \ + --num_class 40 \ + --kernel_size 3 \ + --conv_stride 1 \ + --first_pool_size 0 \ + --first_pool_stride 0 \ + --max_epoch 300 \ + --record_file ../records/modelnet40_run_${run}.csv \ + --log_dir log/modelnet40_run_${run} diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/train_scanobjnn.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/train_scanobjnn.sh new file mode 100755 index 0000000..d0e5cf7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/train_scanobjnn.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -x +set -e + +export PYTHONUNBUFFERED="True" +LOG="log_txt/train_scanobjnn.txt.$(date +'%Y-%m-%d_%H-%M-%S')" +exec &> >(tee -a "${LOG}") + +run="${1}" + +python train.py \ + --resolution 128 \ + --views 6 \ + --weight_decay 0 \ + --batch_size 60 \ + --aug \ + --sigma 0.01 \ + --clip 0.05 \ + --ratio 0.35 \ + --learning_rate 0.001 \ + --decay_rate 0.7 \ + --size 1 \ + --learning_rate_clip 0 \ + --num_class 15 \ + --kernel_size 3 \ + --conv_stride 1 \ + --first_pool_size 0 \ + --first_pool_stride 0 \ + --max_epoch 300 \ + --record_file ../records/scanobjnn_run_${run}.csv \ + --log_dir log/scanobjnn_run_${run} \ + --train_file ../data/h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5 \ + --test_file ../data/h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5 diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/utils.sh b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/utils.sh new file mode 100644 index 0000000..d6869b0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/scripts/utils.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +function press_to_continue() { + read -n 1 -s -r -p $'\e[32mPress any key to continue\e[0m' + echo "" +} diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/shape_names_ext.txt b/zoo/SimpleView/ScanObjectNN/SimpleView/shape_names_ext.txt new file mode 100644 index 0000000..1dbfdb7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/shape_names_ext.txt @@ -0,0 +1,15 @@ +bag +bin +box +cabinet +chair +desk +display +door +shelf +table +bed +pillow +sink +sofa +toilet \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/shape_names_modelnet.txt b/zoo/SimpleView/ScanObjectNN/SimpleView/shape_names_modelnet.txt new file mode 100644 index 0000000..1b2a397 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/shape_names_modelnet.txt @@ -0,0 +1,40 @@ +airplane +bathtub +bed +bench +bookshelf +bottle +bowl +car +chair +cone +cup +curtain +desk +door +dresser +flower_pot +glass_box +guitar +keyboard +lamp +laptop +mantel +monitor +night_stand +person +piano +plant +radio +range_hood +sink +sofa +stairs +stool +table +tent +toilet +tv_stand +vase +wardrobe +xbox diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/train.py b/zoo/SimpleView/ScanObjectNN/SimpleView/train.py new file mode 100644 index 0000000..046b6ab --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/train.py @@ -0,0 +1,872 @@ +import argparse +import socket +import importlib +import os +import sys +import time +import numpy as np +import tensorflow as tf +from math import sqrt + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +sys.path.append(os.path.join(BASE_DIR, '..')) + +import provider +import data_utils + +from data_aug import zoom +from gpu import get_available_gpus, create_parallel_optimization +from mv_utils import PCViews +from mapping2 import OBJECTDATASET_TO_MODELNET, MODELNET_TO_OBJECTDATASET +from utils import RecordExp, get_mv_mean_var + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='multi_res', help='Model name: multi_res') +parser.add_argument('--log_dir', default='./../logs/exp', help='Log dir [default: log]') +parser.add_argument('--file_dir', default='./../logs/exp', help='File dir [default: exp]') +parser.add_argument('--with_bg', default=True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default=True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--no_norm', action="store_true", default=False) +parser.add_argument('--center_data', default=True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default=15, help='Number of classes to classify.') +parser.add_argument('--train_file', + default='./../data/h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', + help='Location of training file') +parser.add_argument('--test_file', + default='./../data/h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', + help='Location of test file') +parser.add_argument('--cross_file', + default='./../data/modelnet40_ply_hdf5_2048/test_files.txt', + help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=300, help='Epoch to run [default: 300]') +parser.add_argument('--batch_size', type=int, default=60, help='Batch Size during training [default: 60]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--learning_rate_clip', type=float, default=1e-5, help='Where to clip the lr') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +parser.add_argument('--resolution', type=int, default=512, help='Resolution for image [default: 512]') +parser.add_argument('--size', type=int, default=4, help='Size for points2depth [default: 4]') +parser.add_argument('--trans', type=float, default=-1.4, help='Z-axis translation for point_transform [default: -1.4]') +parser.add_argument('--weight_decay', type=float, default=1e-4, help='Weight decay factor [default: 1e-4]') +parser.add_argument('--np2d', action="store_false", default=True, + help='Whether to use point2depth or not [default: True]') +parser.add_argument('--aug', action="store_true", default=False, + help='Whether to use data augmentation or not [default: False]') +parser.add_argument('--reg_bn', action="store_true", default=False, + help='Whether to use regulate bn parameters or not [default: False]') +parser.add_argument('--norm_img', action="store_true", default=False, + help='Whether to normalize pictures in p2d or not [default: False]') +parser.add_argument('--nbn', action="store_false", default=True, help='Whether to use bn [default: True]') +parser.add_argument('--resnet_size', type=int, default=18, help='Resnet size [default: 18]') +parser.add_argument('--views', type=int, default=3, help='Num of views [default: 3]') +parser.add_argument('--ratio', type=float, default=0.2, help='Ratio in zoom [default: 0.2]') +parser.add_argument('--sigma', type=float, default=0.01, help='Sigma in jitter [default: 0.01]') +parser.add_argument('--clip', type=float, default=0.05, help='Clip in jitter [default: 0.05]') +parser.add_argument('--no_rot_aug', action="store_true", default=False, help='Rotate dataset [default: False]') +parser.add_argument('--visu', action="store_true", default=False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--eval', action="store_true", default=False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--cross_eval', action="store_true", default=False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--no_shuffle', action="store_true", default=False, help="Whether to shuffle the point clouds") +# Resnet parameters +parser.add_argument('--kernel_size', type=int, default=7) +parser.add_argument('--conv_stride', type=int, default=2) +parser.add_argument('--first_pool_size', type=int, default=3) +parser.add_argument('--first_pool_stride', type=int, default=2) +parser.add_argument('--record_file', type=str) + +FLAGS = parser.parse_args() + +EXP = RecordExp(FLAGS.record_file) +EXP.record_param(vars(FLAGS)) +_BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate +RESOLUTION = FLAGS.resolution +SIZE = FLAGS.size +TRANS = FLAGS.trans +WEIGHT_DECAY = FLAGS.weight_decay +P2D = FLAGS.np2d +AUG = FLAGS.aug +REG_BN = FLAGS.reg_bn +NORM_IMG = FLAGS.norm_img +VIEWS = FLAGS.views +BN = FLAGS.nbn +RESNET_SIZE = FLAGS.resnet_size +RATIO = FLAGS.ratio +SIGMA = FLAGS.sigma +CLIP = FLAGS.clip +CROSS_FILE = FLAGS.cross_file +EVAL = FLAGS.eval +FILE_DIR = FLAGS.file_dir +# Resnet parameters +KERNEL_SIZE = FLAGS.kernel_size +CONV_STRIDE = FLAGS.conv_stride +FIRST_POOL_SIZE = None if FLAGS.first_pool_size == 0 else FLAGS.first_pool_size +FIRST_POOL_STRIDE = None if FLAGS.first_pool_size == 0 else FLAGS.first_pool_stride +NO_ROT_AUG = FLAGS.no_rot_aug +SHUFFLE = not FLAGS.no_shuffle +CROSS_EVAL = FLAGS.cross_eval + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +if FLAGS.no_norm: + NORMALIZED = False +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +IMG_MEAN, IMG_VAR = get_mv_mean_var( + ( + ('dataset', "modelnet" if "modelnet" in FLAGS.train_file else "object"), + ('views', VIEWS), + ('resolution', RESOLUTION), + ('trans', TRANS), + ('size', SIZE), + ('normalize', NORM_IMG), + ('norm_pc', NORMALIZED), + ) +) +GET_IMG = PCViews().get_img + +if VIEWS == 62: + BATCH_SIZE = _BATCH_SIZE // 6 +else: + BATCH_SIZE = _BATCH_SIZE // VIEWS + + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model + '.py') +LOG_DIR = FLAGS.log_dir + +if not os.path.exists(LOG_DIR): + os.mkdir(LOG_DIR) + +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +os.system('cp data_aug.py %s' % (LOG_DIR)) # bkp of data aug +os.system('cp multi_model.py %s' % (LOG_DIR)) # bkp of multi model +os.system('cp gpu.py %s' % (LOG_DIR)) # bkp of gpu +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS) + '\n') + +NUM_CLASSES = FLAGS.num_class + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +views = VIEWS +if VIEWS == 62: + views = 6 + +print("Number of Classes: " + str(NUM_CLASSES)) +print("Normalized: " + str(NORMALIZED)) +print("Center Data: " + str(CENTER_DATA)) + + +def get_data_labels(files): + total_data = np.array([]).reshape((0, 2048, 3)) + total_labels = np.array([]).reshape((0, 1)) + for i in range(len(files)): + data, labels = data_utils.load_h5(files[i]) + total_data = np.concatenate((total_data, data)) + total_labels = np.concatenate((total_labels, labels)) + total_labels = total_labels.astype(int) + return total_data, total_labels + + +MODELNET = True if "modelnet" in TRAIN_FILE else False +############################################################################################### +# Data loading for cross dataset evaluation +if not MODELNET: + NUM_C = 15 + SHAPE_NAMES = [line.rstrip() for line in open('./shape_names_ext.txt')] +else: + NUM_C = 40 + SHAPE_NAMES = [line.rstrip() for line in open('./shape_names_modelnet.txt')] + +if "modelnet" in CROSS_FILE: + cross_files = ["../" + line.rstrip() for line in open(CROSS_FILE)] + CROSS_DATA, CROSS_LABELS = get_data_labels(cross_files) +else: + if (".h5" in CROSS_FILE): + CROSS_DATA, CROSS_LABELS = data_utils.load_h5(CROSS_FILE) + else: + CROSS_DATA, CROSS_LABELS = data_utils.load_data(CROSS_FILE, NUM_POINT, with_bg_pl=WITH_BG) +################################################################################################## + +if "modelnet" in TRAIN_FILE: + TRAIN_DATA, TRAIN_LABELS = provider.get_modelnet_data(TRAIN_FILE) + TEST_DATA, TEST_LABELS = provider.get_modelnet_data(TEST_FILE) +else: + if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) + else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, NUM_POINT, with_bg_pl=WITH_BG) + if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) + else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl=WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + CROSS_DATA = data_utils.center_data(CROSS_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + CROSS_DATA = data_utils.normalize_data(CROSS_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) +print(len(CROSS_DATA)) + +DEVICES = get_available_gpus() + + +def log_string(out_str): + LOG_FOUT.write(out_str + '\n') + LOG_FOUT.flush() + print(out_str) + + +def log_array(array): + for i in range(len(array)): + log_string(str(i) + ' ' + str(array[i])) + + +log_string('Normalize in p2d: ' + str(NORM_IMG)) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, FLAGS.learning_rate_clip) # CLIP THE LEARNING RATE! + return learning_rate + + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch * BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + + +def aug(images): + images = zoom( + images, BATCH_SIZE * views, RESOLUTION, ratio=RATIO, + extrapolation_value=((0 - IMG_MEAN) / sqrt(IMG_VAR)) + ) + return images + + +def transform_to_images(points): + images = GET_IMG(points, SIZE) + return images + + +def loss_filter_fn(v): + tf.summary.scalar(v.name, tf.nn.l2_loss(tf.cast(v, tf.float32))) + return True + + +if REG_BN: + print('reg_bn') + loss_filter = loss_filter_fn +else: + loss_filter = None + + +# Get model and loss +def training_model(is_training_pl, bn_decay, start, images, labels_pl): + # Data augmentation + if AUG: + images = tf.cond( + is_training_pl, true_fn=lambda: aug(images), false_fn=lambda: images + ) + + pred, end_points = MODEL.get_model( + images, + batch=BATCH_SIZE, + views=views, + is_training=is_training_pl, + num_classes=NUM_CLASSES, + bn=BN, + resnet_size=RESNET_SIZE, + kernel_size=KERNEL_SIZE, + conv_stride=CONV_STRIDE, + first_pool_size=FIRST_POOL_SIZE, + first_pool_stride=FIRST_POOL_STRIDE, + bn_decay=bn_decay, + ) + + loss = MODEL.get_loss( + pred, labels_pl, weight_decay=WEIGHT_DECAY, + end_points=end_points, loss_filter_fn=loss_filter, + num_classes=NUM_CLASSES + ) + return loss, pred, start + + +def train(): + with tf.Graph().as_default(): + images_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, RESOLUTION, views, DEVICES) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Get training operator + global_step = tf.train.get_or_create_global_step() + learning_rate = get_learning_rate(global_step) # TODO: which step should I use? + bn_decay = get_bn_decay(global_step) + tf.summary.scalar('learning_rate', learning_rate) + + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + + print(f"DEVICES: {DEVICES}") + update_op, pred, loss, start = create_parallel_optimization( + model_fn=training_model, + devices=DEVICES, + is_training_pl=is_training_pl, + bn_decay=bn_decay, + optimizer=optimizer, + loss_filter_fn=loss_filter, + weight_decay=WEIGHT_DECAY, + controller="/cpu:0", + images=images_pl, + labels_pl=labels_pl + ) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + # config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + sess.run(init, {is_training_pl: True}) + + ops = { + 'images': images_pl, + 'labels': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'start': start, + 'train_op': update_op, + 'merged': merged, + 'step': global_step + } + + best_eval_acc = -1 + best_eval_avg_acc = -1 + best_train_acc = -1 + best_train_eval_acc = -1 + + eval_acc, eval_avg_acc, _ = eval_one_epoch(sess, ops, test_writer, test_data=True) + print(f"Initial Performance: {eval_acc}") + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_acc = train_one_epoch(sess, ops, train_writer) + eval_acc, eval_avg_acc, _ = eval_one_epoch(sess, ops, test_writer, test_data=True) + if (epoch % 10) == 9: + train_eval_acc, train_eval_avg_acc, _ = eval_one_epoch(sess, ops, train_writer, test_data=False) + if train_eval_acc > best_train_eval_acc: + best_train_acc = train_eval_acc + + if eval_acc > best_eval_acc: + best_eval_acc = eval_acc + best_eval_avg_acc = eval_avg_acc + best_epoch = epoch + save_path = saver.save(sess, os.path.join(LOG_DIR, "best_eval.ckpt")) + log_string("Model saved in file: %s" % save_path) + + if train_acc > best_train_acc: + best_train_acc = train_acc + + # Add ops to save and restore all the variables. + if epoch % 10 == 9: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + log_string("**** Evaluate Cross **** %s" % epoch) + + EXP.record_result({ + "final_train_acc": train_acc, + "best_train_acc": best_train_acc, + "final_train_eval_acc": train_eval_acc, + "best_train_eval_acc": best_train_eval_acc, + "best_epoch": best_epoch, + "final_eval_acc": eval_acc, + "best_eval_acc": best_eval_acc, + "best_eval_avg_acc": best_eval_avg_acc + }) + + LOG_FOUT.close() + +def evaluate(): + with tf.Graph().as_default(): + images_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT, RESOLUTION, views, DEVICES) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Get training operator + global_step = tf.train.get_or_create_global_step() + learning_rate = get_learning_rate(global_step) # TODO: which step should I use? + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + bn_decay = get_bn_decay(global_step) + update_op, pred, loss, start = create_parallel_optimization( + model_fn=training_model, + devices=DEVICES, + is_training_pl=is_training_pl, + bn_decay=bn_decay, + optimizer=optimizer, + loss_filter_fn=loss_filter, + weight_decay=WEIGHT_DECAY, + controller="/cpu:0", + images=images_pl, + labels_pl=labels_pl + ) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + # config.log_device_placement = False + sess = tf.Session(config=config) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init, {is_training_pl: False}) + + # Load checkpoint + saver.restore(sess, os.path.join(FILE_DIR, 'model.ckpt')) + log_string("Model restored.") + + ops = {'images': images_pl, + 'labels': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + avg_accuracies, avg_cls_accuracies = [], [] + cls_accuracies = [] + + num_evaluations = 10 if SHUFFLE else 1 + for _ in range(num_evaluations): + if not CROSS_EVAL: + avg_acc, avg_cls_acc, cls_acc = eval_one_epoch(sess, ops, None) + else: + avg_acc, avg_cls_acc, cls_acc = eval_cross(sess, ops, shuffle=True) + avg_accuracies.append(avg_acc) + avg_cls_accuracies.append(avg_cls_acc) + cls_accuracies.append(cls_acc) + + cls_accuracies = np.stack(cls_accuracies) + for i, name in enumerate(SHAPE_NAMES): + print('{}: {}'.format(name, cls_accuracies[:, i].tolist())) + + print('accuracies: {}'.format(avg_accuracies)) + print('cls_accuracies: {}'.format(avg_cls_accuracies)) + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + current_data, current_label = data_utils.get_current_data_h5( + TRAIN_DATA, TRAIN_LABELS, NUM_POINT + ) + current_label = np.squeeze(current_label) + + start_time = time.time() + # Augment batched point clouds by rotation and jittering + if not NO_ROT_AUG: + rotated_data = provider.rotate_point_cloud(current_data) + else: + rotated_data = current_data + jittered_data = provider.jitter_point_cloud(rotated_data) + end_time = time.time() + print(f"Calculating transforms: {end_time - start_time}") + + total_batch_size = BATCH_SIZE * len(DEVICES) + if len(DEVICES) == 0: + total_batch_size = BATCH_SIZE + num_batches = current_data.shape[0] // total_batch_size + + img_total_time = 0 + model_total_time = 0 + for batch_idx in range(num_batches): + start_time = time.time() + + start_idx = batch_idx * total_batch_size + end_idx = start_idx + total_batch_size + + images = transform_to_images(jittered_data[start_idx:end_idx]) + + images = (images - IMG_MEAN) / sqrt(IMG_VAR) + # print(np.mean(images), np.var(images)) + end_time = time.time() + img_total_time += (end_time - start_time) + + feed_dict = { + ops['images']: images, + ops['labels']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training + } + + start_time = time.time() + summary, step, _, loss_val, pred_val, start = sess.run([ + ops['merged'], ops['step'], ops['train_op'], + ops['loss'], ops['pred'], ops['start'] + ], feed_dict=feed_dict) + end_time = time.time() + model_total_time += (end_time - start_time) + + try: + assert len(pred_val) == len(current_data[start_idx:end_idx]) + except AssertionError: + print('batch_idx ' + str(batch_idx)) + print('pred ' + str(len(pred_val))) + print('original ' + str(len(current_data[start_idx:end_idx]))) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += total_batch_size + loss_sum += loss_val + + print(f"Image time: {img_total_time}") + print(f"Model time: {model_total_time}") + + acc = (total_correct / float(total_seen)) + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % acc) + + return acc + +def eval_one_epoch(sess, ops, test_writer, test_data=True): + """ ops: dict mapping from string to tf ops """ + + if test_data: + current_data, current_label = data_utils.get_current_data_h5( + TEST_DATA, TEST_LABELS, NUM_POINT + ) + else: + print("WARNING: Evaluating on train data") + current_data, current_label = data_utils.get_current_data_h5( + TRAIN_DATA, TRAIN_LABELS, NUM_POINT + ) + + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + current_label = np.squeeze(current_label) + total_batch_size = BATCH_SIZE * len(DEVICES) + num_batches = current_data.shape[0] // total_batch_size + + for batch_idx in range(num_batches + 1): + if batch_idx == num_batches: + if current_data.shape[0] % total_batch_size == 0: + pass + start_idx = current_data.shape[0] - total_batch_size + end_idx = current_data.shape[0] + else: + start_idx = batch_idx * total_batch_size + end_idx = (batch_idx + 1) * total_batch_size + + images = transform_to_images(current_data[start_idx:end_idx]) + + images = (images - IMG_MEAN) / sqrt(IMG_VAR) + + feed_dict = {ops['images']: images, + ops['labels']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + + if test_writer is not None: + summary, step, loss_val, pred_val, start = sess.run([ + ops['merged'], ops['step'], ops['loss'], ops['pred'], ops['start'] + ], feed_dict=feed_dict) + else: + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], feed_dict=feed_dict) + + try: + assert len(pred_val) == len(current_data[start_idx:end_idx]) + except AssertionError: + print('pred ' + str(len(pred_val))) + print('original ' + str(len(current_data[start_idx:end_idx]))) + + if test_writer is not None: + test_writer.add_summary(summary, step) + + pred_val = np.argmax(pred_val, 1) + if batch_idx == num_batches: + start_idx = num_batches * total_batch_size + current_start = total_batch_size - current_data.shape[0] % total_batch_size + try: + assert pred_val[current_start:].shape[0] == end_idx - start_idx + except AssertionError: + log_string('start_index: ' + start_idx) + pred_val = pred_val[current_start:] + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += (end_idx - start_idx) + loss_sum += loss_val * (end_idx - start_idx) + else: + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += total_batch_size + loss_sum += (loss_val * total_batch_size) + for i in range(start_idx, end_idx): + label = current_label[i] + total_seen_class[label] += 1 + total_correct_class[label] += (pred_val[i - start_idx] == label) + + eval_acc = (total_correct / float(total_seen)) + eval_cls_acc = np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float) + eval_avg_acc = (np.mean(eval_cls_acc)) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % eval_acc) + log_string('eval avg class acc: %f' % eval_avg_acc) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i] / float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + return eval_acc, eval_avg_acc, eval_cls_acc + + +def eval_cross(sess, ops, num_votes=1, topk=1, shuffle=False): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + truth_prediction = [[0 for _ in range(NUM_C)] for _ in range(NUM_C)] + fout = open(os.path.join(LOG_DIR, 'pred_label.txt'), 'w') + + current_data, current_label = data_utils.get_current_data_h5( + CROSS_DATA, CROSS_LABELS, NUM_POINT + ) + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + modelnet = False if "modelnet" in CROSS_FILE else True + diction = OBJECTDATASET_TO_MODELNET if modelnet else MODELNET_TO_OBJECTDATASET + if (current_label[i] in diction.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i, :]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + total_batch_size = BATCH_SIZE * len(DEVICES) + num_batches = current_data.shape[0] // total_batch_size + for batch_idx in range(num_batches + 1): + if batch_idx == num_batches: + if current_data.shape[0] % total_batch_size == 0: + pass + start_idx = current_data.shape[0] - total_batch_size + end_idx = current_data.shape[0] + else: + start_idx = batch_idx * total_batch_size + end_idx = (batch_idx + 1) * total_batch_size + cur_batch_size = end_idx - start_idx + if batch_idx == num_batches: + cur_batch_size = end_idx - num_batches * total_batch_size + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + num = 15 if not modelnet else 40 + batch_pred_sum = np.zeros((cur_batch_size, num)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, num)) # 0/1 for classes + for vote_idx in range(num_votes): + images = transform_to_images(current_data[start_idx:end_idx]) + images = (images - IMG_MEAN) / sqrt(IMG_VAR) + feed_dict = { + ops['images']: images, + ops['labels']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training + } + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], feed_dict=feed_dict) + + if batch_idx == num_batches: + start_idx = num_batches * total_batch_size + current_start = total_batch_size - current_data.shape[0] % total_batch_size + try: + assert pred_val[current_start:].shape[0] == end_idx - start_idx + except AssertionError: + log_string('start_index: ' + start_idx) + pred_val = pred_val[current_start:] + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + if modelnet: + total_seen += 1 + if (pred_val[i - start_idx] not in MODELNET_TO_OBJECTDATASET.keys()): + continue + pred = MODELNET_TO_OBJECTDATASET[pred_val[i - start_idx]] + if (pred == current_label[i]): + total_correct += 1 + else: + total_seen += 1 + if (pred_val[i - start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i - start_idx]] + if (current_label[i] in possible_label): + total_correct += 1 + + for i in range(start_idx, end_idx): + if modelnet: + label = current_label[i] + total_seen_class[label] += 1 + + if pred_val[i - start_idx] not in MODELNET_TO_OBJECTDATASET: + pred_label = "NA" + else: + pred = MODELNET_TO_OBJECTDATASET[pred_val[i - start_idx]] + total_correct_class[label] += (pred == label) + truth_prediction[label][pred] += 1 + + pred_label = SHAPE_NAMES[pred] + + groundtruth_label = SHAPE_NAMES[label] + else: + label = current_label[i] + total_seen_class[diction[label]] += 1 + + if (pred_val[i - start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i - start_idx]] + if (label in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[label]] += 1 + truth_prediction[MODELNET_TO_OBJECTDATASET[label]][pred_val[i - start_idx]] += 1 + + pred_label = SHAPE_NAMES[pred_val[i - start_idx]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[label]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i - start_idx] != label and FLAGS.visu: # ERROR CASE, DUMP! + # save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, pred_label) + data_utils.save_ply(np.squeeze(current_data[i, :, :]), ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0: + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % ( + np.mean(np.array(seen_correct_class) / np.array(seen_class_accuracies, dtype=np.float)))) + + seen_correct_class = np.array(seen_correct_class) + seen_class_accuracies = np.array(seen_class_accuracies) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i] / float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + avg_acc = total_correct / float(total_seen) + cls_avg_acc = np.mean(seen_correct_class / seen_class_accuracies) + + total_correct_class = np.array(total_correct_class) + total_seen_class = np.array(total_seen_class) + unseen_class = (total_seen_class == 0) + total_correct_class[unseen_class] = -1 + total_seen_class[unseen_class] = 1 + + return avg_acc, cls_avg_acc, total_correct_class / total_seen_class + + +if __name__ == "__main__": + if EVAL: + evaluate() + else: + train() diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/utils/eulerangles.py b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/eulerangles.py new file mode 100644 index 0000000..87bd605 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/eulerangles.py @@ -0,0 +1,418 @@ +# emacs: -*- mode: python-mode; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the NiBabel package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +''' Module implementing Euler angle rotations and their conversions + +See: + +* http://en.wikipedia.org/wiki/Rotation_matrix +* http://en.wikipedia.org/wiki/Euler_angles +* http://mathworld.wolfram.com/EulerAngles.html + +See also: *Representing Attitude with Euler Angles and Quaternions: A +Reference* (2006) by James Diebel. A cached PDF link last found here: + +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.110.5134 + +Euler's rotation theorem tells us that any rotation in 3D can be +described by 3 angles. Let's call the 3 angles the *Euler angle vector* +and call the angles in the vector :math:`alpha`, :math:`beta` and +:math:`gamma`. The vector is [ :math:`alpha`, +:math:`beta`. :math:`gamma` ] and, in this description, the order of the +parameters specifies the order in which the rotations occur (so the +rotation corresponding to :math:`alpha` is applied first). + +In order to specify the meaning of an *Euler angle vector* we need to +specify the axes around which each of the rotations corresponding to +:math:`alpha`, :math:`beta` and :math:`gamma` will occur. + +There are therefore three axes for the rotations :math:`alpha`, +:math:`beta` and :math:`gamma`; let's call them :math:`i` :math:`j`, +:math:`k`. + +Let us express the rotation :math:`alpha` around axis `i` as a 3 by 3 +rotation matrix `A`. Similarly :math:`beta` around `j` becomes 3 x 3 +matrix `B` and :math:`gamma` around `k` becomes matrix `G`. Then the +whole rotation expressed by the Euler angle vector [ :math:`alpha`, +:math:`beta`. :math:`gamma` ], `R` is given by:: + + R = np.dot(G, np.dot(B, A)) + +See http://mathworld.wolfram.com/EulerAngles.html + +The order :math:`G B A` expresses the fact that the rotations are +performed in the order of the vector (:math:`alpha` around axis `i` = +`A` first). + +To convert a given Euler angle vector to a meaningful rotation, and a +rotation matrix, we need to define: + +* the axes `i`, `j`, `k` +* whether a rotation matrix should be applied on the left of a vector to + be transformed (vectors are column vectors) or on the right (vectors + are row vectors). +* whether the rotations move the axes as they are applied (intrinsic + rotations) - compared the situation where the axes stay fixed and the + vectors move within the axis frame (extrinsic) +* the handedness of the coordinate system + +See: http://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities + +We are using the following conventions: + +* axes `i`, `j`, `k` are the `z`, `y`, and `x` axes respectively. Thus + an Euler angle vector [ :math:`alpha`, :math:`beta`. :math:`gamma` ] + in our convention implies a :math:`alpha` radian rotation around the + `z` axis, followed by a :math:`beta` rotation around the `y` axis, + followed by a :math:`gamma` rotation around the `x` axis. +* the rotation matrix applies on the left, to column vectors on the + right, so if `R` is the rotation matrix, and `v` is a 3 x N matrix + with N column vectors, the transformed vector set `vdash` is given by + ``vdash = np.dot(R, v)``. +* extrinsic rotations - the axes are fixed, and do not move with the + rotations. +* a right-handed coordinate system + +The convention of rotation around ``z``, followed by rotation around +``y``, followed by rotation around ``x``, is known (confusingly) as +"xyz", pitch-roll-yaw, Cardan angles, or Tait-Bryan angles. +''' + +import math + +import sys +if sys.version_info >= (3,0): + from functools import reduce + +import numpy as np + + +_FLOAT_EPS_4 = np.finfo(float).eps * 4.0 + + +def euler2mat(z=0, y=0, x=0): + ''' Return matrix for rotations around z, y and x axes + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + M : array shape (3,3) + Rotation matrix giving same rotation as for given angles + + Examples + -------- + >>> zrot = 1.3 # radians + >>> yrot = -0.1 + >>> xrot = 0.2 + >>> M = euler2mat(zrot, yrot, xrot) + >>> M.shape == (3, 3) + True + + The output rotation matrix is equal to the composition of the + individual rotations + + >>> M1 = euler2mat(zrot) + >>> M2 = euler2mat(0, yrot) + >>> M3 = euler2mat(0, 0, xrot) + >>> composed_M = np.dot(M3, np.dot(M2, M1)) + >>> np.allclose(M, composed_M) + True + + You can specify rotations by named arguments + + >>> np.all(M3 == euler2mat(x=xrot)) + True + + When applying M to a vector, the vector should column vector to the + right of M. If the right hand side is a 2D array rather than a + vector, then each column of the 2D array represents a vector. + + >>> vec = np.array([1, 0, 0]).reshape((3,1)) + >>> v2 = np.dot(M, vec) + >>> vecs = np.array([[1, 0, 0],[0, 1, 0]]).T # giving 3x2 array + >>> vecs2 = np.dot(M, vecs) + + Rotations are counter-clockwise. + + >>> zred = np.dot(euler2mat(z=np.pi/2), np.eye(3)) + >>> np.allclose(zred, [[0, -1, 0],[1, 0, 0], [0, 0, 1]]) + True + >>> yred = np.dot(euler2mat(y=np.pi/2), np.eye(3)) + >>> np.allclose(yred, [[0, 0, 1],[0, 1, 0], [-1, 0, 0]]) + True + >>> xred = np.dot(euler2mat(x=np.pi/2), np.eye(3)) + >>> np.allclose(xred, [[1, 0, 0],[0, 0, -1], [0, 1, 0]]) + True + + Notes + ----- + The direction of rotation is given by the right-hand rule (orient + the thumb of the right hand along the axis around which the rotation + occurs, with the end of the thumb at the positive end of the axis; + curl your fingers; the direction your fingers curl is the direction + of rotation). Therefore, the rotations are counterclockwise if + looking along the axis of rotation from positive to negative. + ''' + Ms = [] + if z: + cosz = math.cos(z) + sinz = math.sin(z) + Ms.append(np.array( + [[cosz, -sinz, 0], + [sinz, cosz, 0], + [0, 0, 1]])) + if y: + cosy = math.cos(y) + siny = math.sin(y) + Ms.append(np.array( + [[cosy, 0, siny], + [0, 1, 0], + [-siny, 0, cosy]])) + if x: + cosx = math.cos(x) + sinx = math.sin(x) + Ms.append(np.array( + [[1, 0, 0], + [0, cosx, -sinx], + [0, sinx, cosx]])) + if Ms: + return reduce(np.dot, Ms[::-1]) + return np.eye(3) + + +def mat2euler(M, cy_thresh=None): + ''' Discover Euler angle vector from 3x3 matrix + + Uses the conventions above. + + Parameters + ---------- + M : array-like, shape (3,3) + cy_thresh : None or scalar, optional + threshold below which to give up on straightforward arctan for + estimating x rotation. If None (default), estimate from + precision of input. + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Notes + ----- + If there was no numerical error, the routine could be derived using + Sympy expression for z then y then x rotation matrix, which is:: + + [ cos(y)*cos(z), -cos(y)*sin(z), sin(y)], + [cos(x)*sin(z) + cos(z)*sin(x)*sin(y), cos(x)*cos(z) - sin(x)*sin(y)*sin(z), -cos(y)*sin(x)], + [sin(x)*sin(z) - cos(x)*cos(z)*sin(y), cos(z)*sin(x) + cos(x)*sin(y)*sin(z), cos(x)*cos(y)] + + with the obvious derivations for z, y, and x + + z = atan2(-r12, r11) + y = asin(r13) + x = atan2(-r23, r33) + + Problems arise when cos(y) is close to zero, because both of:: + + z = atan2(cos(y)*sin(z), cos(y)*cos(z)) + x = atan2(cos(y)*sin(x), cos(x)*cos(y)) + + will be close to atan2(0, 0), and highly unstable. + + The ``cy`` fix for numerical instability below is from: *Graphics + Gems IV*, Paul Heckbert (editor), Academic Press, 1994, ISBN: + 0123361559. Specifically it comes from EulerAngles.c by Ken + Shoemake, and deals with the case where cos(y) is close to zero: + + See: http://www.graphicsgems.org/ + + The code appears to be licensed (from the website) as "can be used + without restrictions". + ''' + M = np.asarray(M) + if cy_thresh is None: + try: + cy_thresh = np.finfo(M.dtype).eps * 4 + except ValueError: + cy_thresh = _FLOAT_EPS_4 + r11, r12, r13, r21, r22, r23, r31, r32, r33 = M.flat + # cy: sqrt((cos(y)*cos(z))**2 + (cos(x)*cos(y))**2) + cy = math.sqrt(r33*r33 + r23*r23) + if cy > cy_thresh: # cos(y) not close to zero, standard form + z = math.atan2(-r12, r11) # atan2(cos(y)*sin(z), cos(y)*cos(z)) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = math.atan2(-r23, r33) # atan2(cos(y)*sin(x), cos(x)*cos(y)) + else: # cos(y) (close to) zero, so x -> 0.0 (see above) + # so r21 -> sin(z), r22 -> cos(z) and + z = math.atan2(r21, r22) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = 0.0 + return z, y, x + + +def euler2quat(z=0, y=0, x=0): + ''' Return quaternion corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + quat : array shape (4,) + Quaternion in w, x, y z (real, then vector) format + + Notes + ----- + We can derive this formula in Sympy using: + + 1. Formula giving quaternion corresponding to rotation of theta radians + about arbitrary axis: + http://mathworld.wolfram.com/EulerParameters.html + 2. Generated formulae from 1.) for quaternions corresponding to + theta radians rotations about ``x, y, z`` axes + 3. Apply quaternion multiplication formula - + http://en.wikipedia.org/wiki/Quaternions#Hamilton_product - to + formulae from 2.) to give formula for combined rotations. + ''' + z = z/2.0 + y = y/2.0 + x = x/2.0 + cz = math.cos(z) + sz = math.sin(z) + cy = math.cos(y) + sy = math.sin(y) + cx = math.cos(x) + sx = math.sin(x) + return np.array([ + cx*cy*cz - sx*sy*sz, + cx*sy*sz + cy*cz*sx, + cx*cz*sy - sx*cy*sz, + cx*cy*sz + sx*cz*sy]) + + +def quat2euler(q): + ''' Return Euler angles corresponding to quaternion `q` + + Parameters + ---------- + q : 4 element sequence + w, x, y, z of quaternion + + Returns + ------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``quat2mat`` and ``mat2euler`` functions, but + the reduction in computation is small, and the code repetition is + large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return mat2euler(nq.quat2mat(q)) + + +def euler2angle_axis(z=0, y=0, x=0): + ''' Return angle, axis corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + theta : scalar + angle of rotation + vector : array shape (3,) + axis around which rotation occurs + + Examples + -------- + >>> theta, vec = euler2angle_axis(0, 1.5, 0) + >>> print(theta) + 1.5 + >>> np.allclose(vec, [0, 1, 0]) + True + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return nq.quat2angle_axis(euler2quat(z, y, x)) + + +def angle_axis2euler(theta, vector, is_normalized=False): + ''' Convert angle, axis pair to Euler angles + + Parameters + ---------- + theta : scalar + angle of rotation + vector : 3 element sequence + vector specifying axis for rotation. + is_normalized : bool, optional + True if vector is already normalized (has norm of 1). Default + False + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Examples + -------- + >>> z, y, x = angle_axis2euler(0, [1, 0, 0]) + >>> np.allclose((z, y, x), 0) + True + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``angle_axis2mat`` and ``mat2euler`` + functions, but the reduction in computation is small, and the code + repetition is large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + M = nq.angle_axis2mat(theta, vector, is_normalized) + return mat2euler(M) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/utils/mv_utils.py b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/mv_utils.py new file mode 100644 index 0000000..85a2fd9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/mv_utils.py @@ -0,0 +1,292 @@ +import numpy as np +import torch + +RESOLUTION = 128 +TRANS = -1.4 + +def euler2mat(angle): + """Convert euler angles to rotation matrix. + :param angle: [3] or [b, 3] + :return + rotmat: [3] or [b, 3, 3] + source + https://github.com/ClementPinard/SfmLearner-Pytorch/blob/master/inverse_warp.py + """ + + if len(angle.size()) == 1: + x, y, z = angle[0], angle[1], angle[2] + _dim = 0 + _view = [3, 3] + elif len(angle.size()) == 2: + b, _ = angle.size() + x, y, z = angle[:, 0], angle[:, 1], angle[:, 2] + _dim = 1 + _view = [b, 3, 3] + + else: + assert False + + cosz = torch.cos(z) + sinz = torch.sin(z) + + # zero = torch.zeros([b], requires_grad=False, device=angle.device)[0] + # one = torch.ones([b], requires_grad=False, device=angle.device)[0] + zero = z.detach()*0 + one = zero.detach()+1 + zmat = torch.stack([cosz, -sinz, zero, + sinz, cosz, zero, + zero, zero, one], dim=_dim).reshape(_view) + + cosy = torch.cos(y) + siny = torch.sin(y) + + ymat = torch.stack([cosy, zero, siny, + zero, one, zero, + -siny, zero, cosy], dim=_dim).reshape(_view) + + cosx = torch.cos(x) + sinx = torch.sin(x) + + xmat = torch.stack([one, zero, zero, + zero, cosx, -sinx, + zero, sinx, cosx], dim=_dim).reshape(_view) + + rot_mat = xmat @ ymat @ zmat + # print(rot_mat) + return rot_mat + + +def distribute(depth, _x, _y, size_x, size_y, image_height, image_width): + """ + Distributes the depth associated with each point to the discrete coordinates (image_height, image_width) in a region + of size (size_x, size_y). + :param depth: + :param _x: + :param _y: + :param size_x: + :param size_y: + :param image_height: + :param image_width: + :return: + """ + + assert size_x % 2 == 0 or size_x == 1 + assert size_y % 2 == 0 or size_y == 1 + batch, _ = depth.size() + epsilon = torch.tensor([1e-12], requires_grad=False, device=depth.device) + _i = torch.linspace(-size_x / 2, (size_x / 2) - 1, size_x, requires_grad=False, device=depth.device) + _j = torch.linspace(-size_y / 2, (size_y / 2) - 1, size_y, requires_grad=False, device=depth.device) + + extended_x = _x.unsqueeze(2).repeat([1, 1, size_x]) + _i # [batch, num_points, size_x] + extended_y = _y.unsqueeze(2).repeat([1, 1, size_y]) + _j # [batch, num_points, size_y] + + extended_x = extended_x.unsqueeze(3).repeat([1, 1, 1, size_y]) # [batch, num_points, size_x, size_y] + extended_y = extended_y.unsqueeze(2).repeat([1, 1, size_x, 1]) # [batch, num_points, size_x, size_y] + + extended_x.ceil_() + extended_y.ceil_() + + value = depth.unsqueeze(2).unsqueeze(3).repeat([1, 1, size_x, size_y]) # [batch, num_points, size_x, size_y] + + # all points that will be finally used + masked_points = ((extended_x >= 0) + * (extended_x <= image_height - 1) + * (extended_y >= 0) + * (extended_y <= image_width - 1) + * (value >= 0)) + + true_extended_x = extended_x + true_extended_y = extended_y + + # to prevent error + extended_x = (extended_x % image_height) + extended_y = (extended_y % image_width) + + # [batch, num_points, size_x, size_y] + distance = torch.abs((extended_x - _x.unsqueeze(2).unsqueeze(3)) + * (extended_y - _y.unsqueeze(2).unsqueeze(3))) + weight = (masked_points.float() + * (1 / (value + epsilon))) # [batch, num_points, size_x, size_y] + weighted_value = value * weight + + weight = weight.view([batch, -1]) + weighted_value = weighted_value.view([batch, -1]) + + coordinates = (extended_x.view([batch, -1]) * image_width) + extended_y.view( + [batch, -1]) + coord_max = image_height * image_width + true_coordinates = (true_extended_x.view([batch, -1]) * image_width) + true_extended_y.view( + [batch, -1]) + true_coordinates[~masked_points.view([batch, -1])] = coord_max + weight_scattered = torch.zeros( + [batch, image_width * image_height], + device=depth.device).scatter_add(1, coordinates.long(), weight) + + masked_zero_weight_scattered = (weight_scattered == 0.0) + weight_scattered += masked_zero_weight_scattered.float() + + weighed_value_scattered = torch.zeros( + [batch, image_width * image_height], + device=depth.device).scatter_add(1, coordinates.long(), weighted_value) + + return weighed_value_scattered, weight_scattered + + +def points2depth(points, image_height, image_width, size_x=4, size_y=4): + """ + :param points: [B, num_points, 3] + :param image_width: + :param image_height: + :param size_x: + :param size_y: + :return: + depth_recovered: [B, image_width, image_height] + """ + + epsilon = torch.tensor([1e-12], requires_grad=False, device=points.device) + # epsilon not needed, kept here to ensure exact replication of old version + coord_x = (points[:, :, 0] / (points[:, :, 2] + epsilon)) * (image_width / image_height) # [batch, num_points] + coord_y = (points[:, :, 1] / (points[:, :, 2] + epsilon)) # [batch, num_points] + + batch, total_points, _ = points.size() + depth = points[:, :, 2] # [batch, num_points] + # pdb.set_trace() + _x = ((coord_x + 1) * image_height) / 2 + _y = ((coord_y + 1) * image_width) / 2 + + weighed_value_scattered, weight_scattered = distribute( + depth=depth, + _x=_x, + _y=_y, + size_x=size_x, + size_y=size_y, + image_height=image_height, + image_width=image_width) + + depth_recovered = (weighed_value_scattered / weight_scattered).view([ + batch, image_height, image_width + ]) + + return depth_recovered + + +# source: https://discuss.pytorch.org/t/batched-index-select/9115/6 +def batched_index_select(inp, dim, index): + """ + input: B x * x ... x * + dim: 0 < scalar + index: B x M + """ + views = [inp.shape[0]] + \ + [1 if i != dim else -1 for i in range(1, len(inp.shape))] + expanse = list(inp.shape) + expanse[0] = -1 + expanse[dim] = -1 + index = index.view(views).expand(expanse) + return torch.gather(inp, dim, index) + + +def point_fea_img_fea(point_fea, point_coo, h, w): + """ + each point_coo is of the form (x*w + h). points not in the canvas are removed + :param point_fea: [batch_size, num_points, feat_size] + :param point_coo: [batch_size, num_points] + :return: + """ + assert len(point_fea.shape) == 3 + assert len(point_coo.shape) == 2 + assert point_fea.shape[0:2] == point_coo.shape + + coo_max = ((h - 1) * w) + (w - 1) + mask_point_coo = (point_coo >= 0) * (point_coo <= coo_max) + point_coo *= mask_point_coo.float() + point_fea *= mask_point_coo.float().unsqueeze(-1) + + bs, _, fs = point_fea.shape + point_coo = point_coo.unsqueeze(2).repeat([1, 1, fs]) + img_fea = torch.zeros([bs, h * w, fs], device=point_fea.device).scatter_add(1, point_coo.long(), point_fea) + + return img_fea + + +def distribute_img_fea_points(img_fea, point_coord): + """ + :param img_fea: [B, C, H, W] + :param point_coord: [B, num_points], each coordinate is a scalar value given by (x * W) + y + :return + point_fea: [B, num_points, C], for points with coordinates outside the image, we return 0 + """ + B, C, H, W = list(img_fea.size()) + img_fea = img_fea.permute(0, 2, 3, 1).view([B, H*W, C]) + + coord_max = ((H - 1) * W) + (W - 1) + mask_point_coord = (point_coord >= 0) * (point_coord <= coord_max) + mask_point_coord = mask_point_coord.float() + point_coord = mask_point_coord * point_coord + point_fea = batched_index_select( + inp=img_fea, + dim=1, + index=point_coord.long()) + point_fea = mask_point_coord.unsqueeze(-1) * point_fea + return point_fea + + +class PCViews: + """For creating images from PC based on the view information. Faster as the + repeated operations are done only once whie initialization. + """ + + def __init__(self): + _views = np.asarray([ + [[0 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[1 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[2 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[3 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[0, -np.pi / 2, np.pi / 2], [0, 0, TRANS]], + [[0, np.pi / 2, np.pi / 2], [0, 0, TRANS]]]) + self.num_views = 6 + angle = torch.tensor(_views[:, 0, :]).float() + self.rot_mat = euler2mat(angle).transpose(1, 2) + self.translation = torch.tensor(_views[:, 1, :]).float() + self.translation = self.translation.unsqueeze(1) + + def get_img(self, points, size=1): + """Get image based on the prespecified specifications. + + Args: + points (torch.tensor): of size [B, _, 3] + Returns: + img (torch.tensor): of size [B * self.num_views, RESOLUTION, + RESOLUTION] + """ + b, _, _ = points.shape + v = self.translation.shape[0] + + points = torch.tensor(points).float() + + _points = self.point_transform( + points=torch.repeat_interleave(points, v, dim=0), + rot_mat=self.rot_mat.repeat(b, 1, 1), + translation=self.translation.repeat(b, 1, 1)) + + img = points2depth( + points=_points, + image_height=RESOLUTION, + image_width=RESOLUTION, + size_x=size, + size_y=size, + ) + return np.expand_dims(img, axis=3) + + @staticmethod + def point_transform(points, rot_mat, translation): + """ + :param points: [batch, num_points, 3] + :param rot_mat: [batch, 3] + :param translation: [batch, 1, 3] + :return: + """ + + points = torch.matmul(points, rot_mat) + points = points - translation + return points diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/utils/pc_util.py b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/pc_util.py new file mode 100644 index 0000000..4913231 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/pc_util.py @@ -0,0 +1,198 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +# ---------------------------------------- +# Point cloud IO +# ---------------------------------------- + +def read_ply(filename): + """ read XYZ point cloud from filename PLY file """ + plydata = PlyData.read(filename) + pc = plydata['vertex'].data + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + + +def write_ply(points, filename, text=True): + """ input: Nx3, write points to filename as PLY format. """ + points = [(points[i,0], points[i,1], points[i,2]) for i in range(points.shape[0])] + vertex = np.array(points, dtype=[('x', 'f4'), ('y', 'f4'),('z', 'f4')]) + el = PlyElement.describe(vertex, 'vertex', comments=['vertices']) + PlyData([el], text=text).write(filename) + + +# ---------------------------------------- +# Simple Point cloud and Volume Renderers +# ---------------------------------------- + +def draw_point_cloud(input_points, canvasSize=500, space=200, diameter=25, + xrot=0, yrot=0, zrot=0, switch_xyz=[0,1,2], normalize=True): + """ Render point cloud to image with alpha channel. + Input: + points: Nx3 numpy array (+y is up direction) + Output: + gray image as numpy array of size canvasSizexcanvasSize + """ + image = np.zeros((canvasSize, canvasSize)) + if input_points is None or input_points.shape[0] == 0: + return image + + points = input_points[:, switch_xyz] + M = euler2mat(zrot, yrot, xrot) + points = (np.dot(M, points.transpose())).transpose() + + # Normalize the point cloud + # We normalize scale to fit points in a unit sphere + if normalize: + centroid = np.mean(points, axis=0) + points -= centroid + furthest_distance = np.max(np.sqrt(np.sum(abs(points)**2,axis=-1))) + points /= furthest_distance + + # Pre-compute the Gaussian disk + radius = (diameter-1)/2.0 + disk = np.zeros((diameter, diameter)) + for i in range(diameter): + for j in range(diameter): + if (i - radius) * (i-radius) + (j-radius) * (j-radius) <= radius * radius: + disk[i, j] = np.exp((-(i-radius)**2 - (j-radius)**2)/(radius**2)) + mask = np.argwhere(disk > 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +from PIL import Image +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +import matplotlib.pyplot as plt +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/utils/plyfile.py b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/plyfile.py new file mode 100644 index 0000000..4de8184 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/plyfile.py @@ -0,0 +1,914 @@ +# Copyright 2014 Darsh Ranjan +# +# This file is part of python-plyfile. +# +# python-plyfile is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# python-plyfile is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with python-plyfile. If not, see +# . + +from itertools import islice as _islice + +import numpy as _np +from sys import byteorder as _byteorder + + +try: + _range = xrange +except NameError: + _range = range + + +# Many-many relation +_data_type_relation = [ + ('int8', 'i1'), + ('char', 'i1'), + ('uint8', 'u1'), + ('uchar', 'b1'), + ('uchar', 'u1'), + ('int16', 'i2'), + ('short', 'i2'), + ('uint16', 'u2'), + ('ushort', 'u2'), + ('int32', 'i4'), + ('int', 'i4'), + ('uint32', 'u4'), + ('uint', 'u4'), + ('float32', 'f4'), + ('float', 'f4'), + ('float64', 'f8'), + ('double', 'f8') +] + +_data_types = dict(_data_type_relation) +_data_type_reverse = dict((b, a) for (a, b) in _data_type_relation) + +_types_list = [] +_types_set = set() +for (_a, _b) in _data_type_relation: + if _a not in _types_set: + _types_list.append(_a) + _types_set.add(_a) + if _b not in _types_set: + _types_list.append(_b) + _types_set.add(_b) + + +_byte_order_map = { + 'ascii': '=', + 'binary_little_endian': '<', + 'binary_big_endian': '>' +} + +_byte_order_reverse = { + '<': 'binary_little_endian', + '>': 'binary_big_endian' +} + +_native_byte_order = {'little': '<', 'big': '>'}[_byteorder] + + +def _lookup_type(type_str): + if type_str not in _data_type_reverse: + try: + type_str = _data_types[type_str] + except KeyError: + raise ValueError("field type %r not in %r" % + (type_str, _types_list)) + + return _data_type_reverse[type_str] + + +def _split_line(line, n): + fields = line.split(None, n) + if len(fields) == n: + fields.append('') + + assert len(fields) == n + 1 + + return fields + + +def make2d(array, cols=None, dtype=None): + ''' + Make a 2D array from an array of arrays. The `cols' and `dtype' + arguments can be omitted if the array is not empty. + + ''' + if (cols is None or dtype is None) and not len(array): + raise RuntimeError("cols and dtype must be specified for empty " + "array") + + if cols is None: + cols = len(array[0]) + + if dtype is None: + dtype = array[0].dtype + + return _np.fromiter(array, [('_', dtype, (cols,))], + count=len(array))['_'] + + +class PlyParseError(Exception): + + ''' + Raised when a PLY file cannot be parsed. + + The attributes `element', `row', `property', and `message' give + additional information. + + ''' + + def __init__(self, message, element=None, row=None, prop=None): + self.message = message + self.element = element + self.row = row + self.prop = prop + + s = '' + if self.element: + s += 'element %r: ' % self.element.name + if self.row is not None: + s += 'row %d: ' % self.row + if self.prop: + s += 'property %r: ' % self.prop.name + s += self.message + + Exception.__init__(self, s) + + def __repr__(self): + return ('PlyParseError(%r, element=%r, row=%r, prop=%r)' % + self.message, self.element, self.row, self.prop) + + +class PlyData(object): + + ''' + PLY file header and data. + + A PlyData instance is created in one of two ways: by the static + method PlyData.read (to read a PLY file), or directly from __init__ + given a sequence of elements (which can then be written to a PLY + file). + + ''' + + def __init__(self, elements=[], text=False, byte_order='=', + comments=[], obj_info=[]): + ''' + elements: sequence of PlyElement instances. + + text: whether the resulting PLY file will be text (True) or + binary (False). + + byte_order: '<' for little-endian, '>' for big-endian, or '=' + for native. This is only relevant if `text' is False. + + comments: sequence of strings that will be placed in the header + between the 'ply' and 'format ...' lines. + + obj_info: like comments, but will be placed in the header with + "obj_info ..." instead of "comment ...". + + ''' + if byte_order == '=' and not text: + byte_order = _native_byte_order + + self.byte_order = byte_order + self.text = text + + self.comments = list(comments) + self.obj_info = list(obj_info) + self.elements = elements + + def _get_elements(self): + return self._elements + + def _set_elements(self, elements): + self._elements = tuple(elements) + self._index() + + elements = property(_get_elements, _set_elements) + + def _get_byte_order(self): + return self._byte_order + + def _set_byte_order(self, byte_order): + if byte_order not in ['<', '>', '=']: + raise ValueError("byte order must be '<', '>', or '='") + + self._byte_order = byte_order + + byte_order = property(_get_byte_order, _set_byte_order) + + def _index(self): + self._element_lookup = dict((elt.name, elt) for elt in + self._elements) + if len(self._element_lookup) != len(self._elements): + raise ValueError("two elements with same name") + + @staticmethod + def _parse_header(stream): + ''' + Parse a PLY header from a readable file-like stream. + + ''' + lines = [] + comments = {'comment': [], 'obj_info': []} + while True: + line = stream.readline().decode('ascii').strip() + fields = _split_line(line, 1) + + if fields[0] == 'end_header': + break + + elif fields[0] in comments.keys(): + lines.append(fields) + else: + lines.append(line.split()) + + a = 0 + if lines[a] != ['ply']: + raise PlyParseError("expected 'ply'") + + a += 1 + while lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + if lines[a][0] != 'format': + raise PlyParseError("expected 'format'") + + if lines[a][2] != '1.0': + raise PlyParseError("expected version '1.0'") + + if len(lines[a]) != 3: + raise PlyParseError("too many fields after 'format'") + + fmt = lines[a][1] + + if fmt not in _byte_order_map: + raise PlyParseError("don't understand format %r" % fmt) + + byte_order = _byte_order_map[fmt] + text = fmt == 'ascii' + + a += 1 + while a < len(lines) and lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + return PlyData(PlyElement._parse_multi(lines[a:]), + text, byte_order, + comments['comment'], comments['obj_info']) + + @staticmethod + def read(stream): + ''' + Read PLY data from a readable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'read') + try: + data = PlyData._parse_header(stream) + for elt in data: + elt._read(stream, data.text, data.byte_order) + finally: + if must_close: + stream.close() + + return data + + def write(self, stream): + ''' + Write PLY data to a writeable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'write') + try: + stream.write(self.header.encode('ascii')) + stream.write(b'\r\n') + for elt in self: + elt._write(stream, self.text, self.byte_order) + finally: + if must_close: + stream.close() + + @property + def header(self): + ''' + Provide PLY-formatted metadata for the instance. + + ''' + lines = ['ply'] + + if self.text: + lines.append('format ascii 1.0') + else: + lines.append('format ' + _byte_order_reverse[self.byte_order] + ' 1.0') + + # Some information is lost here, since all comments are placed + # between the 'format' line and the first element. + for c in self.comments: + lines.append('comment ' + c) + + for c in self.obj_info: + lines.append('obj_info ' + c) + + lines.extend(elt.header for elt in self.elements) + lines.append('end_header') + return '\r\n'.join(lines) + + def __iter__(self): + return iter(self.elements) + + def __len__(self): + return len(self.elements) + + def __contains__(self, name): + return name in self._element_lookup + + def __getitem__(self, name): + return self._element_lookup[name] + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyData(%r, text=%r, byte_order=%r, ' + 'comments=%r, obj_info=%r)' % + (self.elements, self.text, self.byte_order, + self.comments, self.obj_info)) + + +def _open_stream(stream, read_or_write): + if hasattr(stream, read_or_write): + return (False, stream) + try: + return (True, open(stream, read_or_write[0] + 'b')) + except TypeError: + raise RuntimeError("expected open file or filename") + + +class PlyElement(object): + + ''' + PLY file element. + + A client of this library doesn't normally need to instantiate this + directly, so the following is only for the sake of documenting the + internals. + + Creating a PlyElement instance is generally done in one of two ways: + as a byproduct of PlyData.read (when reading a PLY file) and by + PlyElement.describe (before writing a PLY file). + + ''' + + def __init__(self, name, properties, count, comments=[]): + ''' + This is not part of the public interface. The preferred methods + of obtaining PlyElement instances are PlyData.read (to read from + a file) and PlyElement.describe (to construct from a numpy + array). + + ''' + self._name = str(name) + self._check_name() + self._count = count + + self._properties = tuple(properties) + self._index() + + self.comments = list(comments) + + self._have_list = any(isinstance(p, PlyListProperty) + for p in self.properties) + + @property + def count(self): + return self._count + + def _get_data(self): + return self._data + + def _set_data(self, data): + self._data = data + self._count = len(data) + self._check_sanity() + + data = property(_get_data, _set_data) + + def _check_sanity(self): + for prop in self.properties: + if prop.name not in self._data.dtype.fields: + raise ValueError("dangling property %r" % prop.name) + + def _get_properties(self): + return self._properties + + def _set_properties(self, properties): + self._properties = tuple(properties) + self._check_sanity() + self._index() + + properties = property(_get_properties, _set_properties) + + def _index(self): + self._property_lookup = dict((prop.name, prop) + for prop in self._properties) + if len(self._property_lookup) != len(self._properties): + raise ValueError("two properties with same name") + + def ply_property(self, name): + return self._property_lookup[name] + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "element name %r contains spaces" % self._name + raise ValueError(msg) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype of the in-memory representation of the + data. (If there are no list properties, and the PLY format is + binary, then this also accurately describes the on-disk + representation of the element.) + + ''' + return [(prop.name, prop.dtype(byte_order)) + for prop in self.properties] + + @staticmethod + def _parse_multi(header_lines): + ''' + Parse a list of PLY element definitions. + + ''' + elements = [] + while header_lines: + (elt, header_lines) = PlyElement._parse_one(header_lines) + elements.append(elt) + + return elements + + @staticmethod + def _parse_one(lines): + ''' + Consume one element definition. The unconsumed input is + returned along with a PlyElement instance. + + ''' + a = 0 + line = lines[a] + + if line[0] != 'element': + raise PlyParseError("expected 'element'") + if len(line) > 3: + raise PlyParseError("too many fields after 'element'") + if len(line) < 3: + raise PlyParseError("too few fields after 'element'") + + (name, count) = (line[1], int(line[2])) + + comments = [] + properties = [] + while True: + a += 1 + if a >= len(lines): + break + + if lines[a][0] == 'comment': + comments.append(lines[a][1]) + elif lines[a][0] == 'property': + properties.append(PlyProperty._parse_one(lines[a])) + else: + break + + return (PlyElement(name, properties, count, comments), + lines[a:]) + + @staticmethod + def describe(data, name, len_types={}, val_types={}, + comments=[]): + ''' + Construct a PlyElement from an array's metadata. + + len_types and val_types can be given as mappings from list + property names to type strings (like 'u1', 'f4', etc., or + 'int8', 'float32', etc.). These can be used to define the length + and value types of list properties. List property lengths + always default to type 'u1' (8-bit unsigned integer), and value + types default to 'i4' (32-bit integer). + + ''' + if not isinstance(data, _np.ndarray): + raise TypeError("only numpy arrays are supported") + + if len(data.shape) != 1: + raise ValueError("only one-dimensional arrays are " + "supported") + + count = len(data) + + properties = [] + descr = data.dtype.descr + + for t in descr: + if not isinstance(t[1], str): + raise ValueError("nested records not supported") + + if not t[0]: + raise ValueError("field with empty name") + + if len(t) != 2 or t[1][1] == 'O': + # non-scalar field, which corresponds to a list + # property in PLY. + + if t[1][1] == 'O': + if len(t) != 2: + raise ValueError("non-scalar object fields not " + "supported") + + len_str = _data_type_reverse[len_types.get(t[0], 'u1')] + if t[1][1] == 'O': + val_type = val_types.get(t[0], 'i4') + val_str = _lookup_type(val_type) + else: + val_str = _lookup_type(t[1][1:]) + + prop = PlyListProperty(t[0], len_str, val_str) + else: + val_str = _lookup_type(t[1][1:]) + prop = PlyProperty(t[0], val_str) + + properties.append(prop) + + elt = PlyElement(name, properties, count, comments) + elt.data = data + + return elt + + def _read(self, stream, text, byte_order): + ''' + Read the actual data from a PLY file. + + ''' + if text: + self._read_txt(stream) + else: + if self._have_list: + # There are list properties, so a simple load is + # impossible. + self._read_bin(stream, byte_order) + else: + # There are no list properties, so loading the data is + # much more straightforward. + self._data = _np.fromfile(stream, + self.dtype(byte_order), + self.count) + + if len(self._data) < self.count: + k = len(self._data) + del self._data + raise PlyParseError("early end-of-file", self, k) + + self._check_sanity() + + def _write(self, stream, text, byte_order): + ''' + Write the data to a PLY file. + + ''' + if text: + self._write_txt(stream) + else: + if self._have_list: + # There are list properties, so serialization is + # slightly complicated. + self._write_bin(stream, byte_order) + else: + # no list properties, so serialization is + # straightforward. + self.data.astype(self.dtype(byte_order), + copy=False).tofile(stream) + + def _read_txt(self, stream): + ''' + Load a PLY element from an ASCII-format PLY file. The element + may contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype()) + + k = 0 + for line in _islice(iter(stream.readline, b''), self.count): + fields = iter(line.strip().split()) + for prop in self.properties: + try: + self._data[prop.name][k] = prop._from_fields(fields) + except StopIteration: + raise PlyParseError("early end-of-line", + self, k, prop) + except ValueError: + raise PlyParseError("malformed input", + self, k, prop) + try: + next(fields) + except StopIteration: + pass + else: + raise PlyParseError("expected end-of-line", self, k) + k += 1 + + if k < self.count: + del self._data + raise PlyParseError("early end-of-file", self, k) + + def _write_txt(self, stream): + ''' + Save a PLY element to an ASCII-format PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + fields = [] + for prop in self.properties: + fields.extend(prop._to_fields(rec[prop.name])) + + _np.savetxt(stream, [fields], '%.18g', newline='\r\n') + + def _read_bin(self, stream, byte_order): + ''' + Load a PLY element from a binary PLY file. The element may + contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype(byte_order)) + + for k in _range(self.count): + for prop in self.properties: + try: + self._data[prop.name][k] = \ + prop._read_bin(stream, byte_order) + except StopIteration: + raise PlyParseError("early end-of-file", + self, k, prop) + + def _write_bin(self, stream, byte_order): + ''' + Save a PLY element to a binary PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + for prop in self.properties: + prop._write_bin(rec[prop.name], stream, byte_order) + + @property + def header(self): + ''' + Format this element's metadata as it would appear in a PLY + header. + + ''' + lines = ['element %s %d' % (self.name, self.count)] + + # Some information is lost here, since all comments are placed + # between the 'element' line and the first property definition. + for c in self.comments: + lines.append('comment ' + c) + + lines.extend(list(map(str, self.properties))) + + return '\r\n'.join(lines) + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyElement(%r, %r, count=%d, comments=%r)' % + (self.name, self.properties, self.count, + self.comments)) + + +class PlyProperty(object): + + ''' + PLY property description. This class is pure metadata; the data + itself is contained in PlyElement instances. + + ''' + + def __init__(self, name, val_dtype): + self._name = str(name) + self._check_name() + self.val_dtype = val_dtype + + def _get_val_dtype(self): + return self._val_dtype + + def _set_val_dtype(self, val_dtype): + self._val_dtype = _data_types[_lookup_type(val_dtype)] + + val_dtype = property(_get_val_dtype, _set_val_dtype) + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "Error: property name %r contains spaces" % self._name + raise RuntimeError(msg) + + @staticmethod + def _parse_one(line): + assert line[0] == 'property' + + if line[1] == 'list': + if len(line) > 5: + raise PlyParseError("too many fields after " + "'property list'") + if len(line) < 5: + raise PlyParseError("too few fields after " + "'property list'") + + return PlyListProperty(line[4], line[2], line[3]) + + else: + if len(line) > 3: + raise PlyParseError("too many fields after " + "'property'") + if len(line) < 3: + raise PlyParseError("too few fields after " + "'property'") + + return PlyProperty(line[2], line[1]) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype description for this property (as a tuple + of strings). + + ''' + return byte_order + self.val_dtype + + def _from_fields(self, fields): + ''' + Parse from generator. Raise StopIteration if the property could + not be read. + + ''' + return _np.dtype(self.dtype()).type(next(fields)) + + def _to_fields(self, data): + ''' + Return generator over one item. + + ''' + yield _np.dtype(self.dtype()).type(data) + + def _read_bin(self, stream, byte_order): + ''' + Read data from a binary stream. Raise StopIteration if the + property could not be read. + + ''' + try: + return _np.fromfile(stream, self.dtype(byte_order), 1)[0] + except IndexError: + raise StopIteration + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + _np.dtype(self.dtype(byte_order)).type(data).tofile(stream) + + def __str__(self): + val_str = _data_type_reverse[self.val_dtype] + return 'property %s %s' % (val_str, self.name) + + def __repr__(self): + return 'PlyProperty(%r, %r)' % (self.name, + _lookup_type(self.val_dtype)) + + +class PlyListProperty(PlyProperty): + + ''' + PLY list property description. + + ''' + + def __init__(self, name, len_dtype, val_dtype): + PlyProperty.__init__(self, name, val_dtype) + + self.len_dtype = len_dtype + + def _get_len_dtype(self): + return self._len_dtype + + def _set_len_dtype(self, len_dtype): + self._len_dtype = _data_types[_lookup_type(len_dtype)] + + len_dtype = property(_get_len_dtype, _set_len_dtype) + + def dtype(self, byte_order='='): + ''' + List properties always have a numpy dtype of "object". + + ''' + return '|O' + + def list_dtype(self, byte_order='='): + ''' + Return the pair (len_dtype, val_dtype) (both numpy-friendly + strings). + + ''' + return (byte_order + self.len_dtype, + byte_order + self.val_dtype) + + def _from_fields(self, fields): + (len_t, val_t) = self.list_dtype() + + n = int(_np.dtype(len_t).type(next(fields))) + + data = _np.loadtxt(list(_islice(fields, n)), val_t, ndmin=1) + if len(data) < n: + raise StopIteration + + return data + + def _to_fields(self, data): + ''' + Return generator over the (numerical) PLY representation of the + list data (length followed by actual data). + + ''' + (len_t, val_t) = self.list_dtype() + + data = _np.asarray(data, dtype=val_t).ravel() + + yield _np.dtype(len_t).type(data.size) + for x in data: + yield x + + def _read_bin(self, stream, byte_order): + (len_t, val_t) = self.list_dtype(byte_order) + + try: + n = _np.fromfile(stream, len_t, 1)[0] + except IndexError: + raise StopIteration + + data = _np.fromfile(stream, val_t, n) + if len(data) < n: + raise StopIteration + + return data + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + (len_t, val_t) = self.list_dtype(byte_order) + + data = _np.asarray(data, dtype=val_t).ravel() + + _np.array(data.size, dtype=len_t).tofile(stream) + data.tofile(stream) + + def __str__(self): + len_str = _data_type_reverse[self.len_dtype] + val_str = _data_type_reverse[self.val_dtype] + return 'property list %s %s %s' % (len_str, val_str, self.name) + + def __repr__(self): + return ('PlyListProperty(%r, %r, %r)' % + (self.name, + _lookup_type(self.len_dtype), + _lookup_type(self.val_dtype))) diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/utils/tf_util.py b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/tf_util.py new file mode 100644 index 0000000..c6653d2 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/tf_util.py @@ -0,0 +1,577 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2016 +""" + +import tensorflow as tf + + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + Use batch norm in multi_model.py + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + # outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + outputs = tf.compat.v1.layers.batch_normalization( + inputs=outputs, axis=1, momentum=0.997, + center=True, epsilon=1e-5, + scale=True, training=is_training, fused=True) + # multi_model.batch_norm(outputs, is_training, 'channels_first') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, ], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, 1], bn_decay) + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, 1, 2], bn_decay) + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0, 1, 2, 3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs diff --git a/zoo/SimpleView/ScanObjectNN/SimpleView/utils/utils.py b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/utils.py new file mode 100644 index 0000000..00d7c93 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SimpleView/utils/utils.py @@ -0,0 +1,97 @@ +import csv +import os + +class RecordExp: + def __init__(self, file_name): + self.file_name = file_name + self.param_recorded = False + self.result_recorded = False + self.param_dict = {} + + def record_param(self, param_dict): + """ + all parameters must be given at the same time. parameters must be given before the results + :return: + """ + assert not self.param_recorded + self.param_recorded = True + self.param_dict = param_dict + + def record_result(self, result_dict): + """ + all results must be given at the same time + :return: + """ + assert self.param_recorded + assert not self.result_recorded + self.result_recorded = True + assert len(set(result_dict.keys()) & set(self.param_dict.keys())) == 0 + + if os.path.exists(self.file_name): + with open(self.file_name, 'r') as csv_file: + reader = csv.reader(csv_file) + fields = next(reader) + else: + print("This is the first record of the experiment") + fields = list(self.param_dict.keys()) + list(result_dict.keys()) + with open(self.file_name, "w") as csv_file: + writer = csv.writer(csv_file, delimiter=',') + writer.writerow(fields) + + self.param_dict.update(result_dict) + + values = [] + for field in fields: + if field in self.param_dict: + values.append(self.param_dict[field]) + else: + values.append("") + + with open(self.file_name, "a") as csv_file: + writer = csv.writer(csv_file, delimiter=',') + writer.writerow(values) + + +def get_mv_mean_var(param_tuple): + """ + :param param_tuple: should be of the following form + ('dataset', "modelnet), ('views', 1), ('resolution', 128), ('trans', -1.4), ('size', 4), ('normalize', False) + :return: + """ + data = { + ( + ('dataset', 'object'), + ('views', 6), + ('resolution', 128), + ('trans', -1.4), + ('size', 1), + ('normalize', False), + ('norm_pc', True) + ): [ + (0.04440825, 0.0615424), + (0.04496584, 0.06237658), + (0.044289585, 0.061655156), + (0.044222, 0.061538428) + ], + ( + ('dataset', 'modelnet'), + ('views', 6), + ('resolution', 128), + ('trans', -1.4), + ('size', 1), + ('normalize', False), + ('norm_pc', True) + ): [ + (0.06295275, 0.086910926), + (0.06327734, 0.087433286), + (0.06296529, 0.08695659), + (0.062923886, 0.086918436) + ], + } + + mean_var_list = data[param_tuple] + mean_list = [x for x, y in mean_var_list] + var_list = [y for x, y in mean_var_list] + mean = sum(mean_list) / len(mean_list) + var = sum(var_list) / len(var_list) + return mean, var diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/draw_cmat.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/draw_cmat.py new file mode 100644 index 0000000..f7e9747 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/draw_cmat.py @@ -0,0 +1,229 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='spidercnn_cls_xyz', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='confusion_matrix/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = False, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +FLAGS = parser.parse_args() + + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE)) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred = MODEL.get_model(pointclouds_pl, is_training_pl) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + current_pred.append(pred_val[i-start_idx]) + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + #Plot confusion matrix + current_pred = np.array(current_pred) + groundtruth = current_label.flatten() + predictions = current_pred.flatten() + + mat = confusion_matrix(groundtruth, predictions) + + plt.style.use('seaborn-paper') + plt.rcParams["figure.figsize"] = (10,10) + ax = plt.subplot(111) + cmap = plt.cm.Reds + mat = mat.astype('float') / mat.sum(axis=1)[:, np.newaxis] + mat = np.nan_to_num(mat, copy=True) + + plt.imshow(mat, interpolation='nearest', cmap=cmap) + # cbar = plt.colorbar(fraction=0.03, pad=0.05, aspect=30) + # cbar.ax.tick_params(labelsize=10) + tick_marks = np.arange(len(SHAPE_NAMES)) + plt.xticks(tick_marks, SHAPE_NAMES, rotation=90) + plt.yticks(tick_marks, SHAPE_NAMES) + + plt.ylabel('Ground truth') + plt.xlabel('Prediction') + + for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] + + ax.get_xticklabels() + ax.get_yticklabels()): + item.set_fontsize(36) + + plt.tight_layout() + plt.savefig(os.path.join(DUMP_DIR,'matrix.pdf')) + plt.show() + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_real_trained_on_synthetic.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_real_trained_on_synthetic.py new file mode 100644 index 0000000..0cb640f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_real_trained_on_synthetic.py @@ -0,0 +1,239 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='spidercnn_cls_xyz', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--num_class', type=int, default = 40, help='Number of classes to classify.') + +parser.add_argument('--model_path', default='log/model_max.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_real_trained_on_synthetic/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +FLAGS = parser.parse_args() + + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE)) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in OBJECTDATASET_TO_MODELNET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 40)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 40)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen +=1 + if (pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET.keys()): + continue + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + # if (pred_val[i-start_idx] == current_label[i]): + if (pred == current_label[i]): + total_correct +=1 + + for i in range(start_idx, end_idx): + + l = current_label[i] + total_seen_class[l] += 1 + + if pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET: + pred_label = "NA" + else: + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + total_correct_class[l] += (pred == l) + + pred_label = SHAPE_NAMES[pred] + + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[l] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_scenennobjects.py new file mode 100644 index 0000000..8332da0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_scenennobjects.py @@ -0,0 +1,209 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='spidercnn_cls_xyz', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = FLAGS.num_class +if (NUM_CLASSES==11): + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_combined.txt')] +else: + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] +print("Number of Classes: "+str(NUM_CLASSES)) + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE)) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_synthetic_trained_on_real.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_synthetic_trained_on_real.py new file mode 100644 index 0000000..c63f651 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/evaluate_synthetic_trained_on_real.py @@ -0,0 +1,237 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='spidercnn_cls_xyz', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_synthetic_trained_on_real/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = False, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'modelnet/modelnet_test.h5', help='Location of test file') + +FLAGS = parser.parse_args() + + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE)) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in MODELNET_TO_OBJECTDATASET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen += 1 + if (pred_val[i-start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (current_label[i] in possible_label): + total_correct +=1 + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + if (pred_val[i-start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (l in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + + pred_label = SHAPE_NAMES[pred_val[i-start_idx]] + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/models/spidercnn_cls_xyz.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/models/spidercnn_cls_xyz.py new file mode 100644 index 0000000..3cbbc01 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/models/spidercnn_cls_xyz.py @@ -0,0 +1,86 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append(os.path.join(BASE_DIR, '../tf_ops/sampling')) +sys.path.append(os.path.join(BASE_DIR, '../tf_ops/grouping')) + +import tf_util +from tf_grouping import query_ball_point, group_point, knn_point +from tf_sampling import farthest_point_sample, gather_point + +NUM_CLASSES = 15 +# NUM_CLASSES = 40 + +def get_model(xyz, is_training, bn_decay=None, num_class=NUM_CLASSES): + batch_size = xyz.get_shape()[0].value + num_point = xyz.get_shape()[1].value + + nsample = 20 + G = 16 + taylor_channel = 5 + + with tf.variable_scope('delta') as sc: + _, idx = knn_point(nsample, xyz, xyz) + + grouped_xyz = group_point(xyz, idx) + point_cloud_tile = tf.expand_dims(xyz, [2]) + point_cloud_tile = tf.tile(point_cloud_tile, [1, 1, nsample, 1]) + delta = grouped_xyz - point_cloud_tile + + with tf.variable_scope('fanConv1') as sc: + feat_1 = tf_util.spiderConv(xyz, idx, delta, 32, taylor_channel = taylor_channel, + gn=True, G=G, is_multi_GPU=True) + + with tf.variable_scope('fanConv2') as sc: + feat_2 = tf_util.spiderConv(feat_1, idx, delta, 64, taylor_channel = taylor_channel, + gn=True, G=G, is_multi_GPU=True) + + with tf.variable_scope('fanConv3') as sc: + feat_3 = tf_util.spiderConv(feat_2, idx, delta, 128, taylor_channel = taylor_channel, + gn=True, G=G, is_multi_GPU=True) + + with tf.variable_scope('fanConv4') as sc: + feat_4 = tf_util.spiderConv(feat_3, idx, delta, 256, taylor_channel = taylor_channel, + gn=True, G=G, is_multi_GPU=True) + + + feat = tf.concat([feat_1, feat_2, feat_3, feat_4], 2) + + #top-k pooling + net = tf_util.topk_pool(feat, k = 2, scope='topk_pool') + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 1024, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay, is_multi_GPU=True) + net = tf_util.dropout(net, keep_prob=0.3, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay, is_multi_GPU=True) + net = tf_util.dropout(net, keep_prob=0.3, is_training=is_training, + scope='dp2') + net = tf_util.fully_connected(net, num_class, activation_fn=None, scope='fc3') + + return net + + +def get_loss(pred, label): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/interpolate.cpp b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/interpolate.cpp new file mode 100644 index 0000000..b7d0dd0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/interpolate.cpp @@ -0,0 +1,169 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +using namespace tensorflow; + +REGISTER_OP("ThreeNN") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("dist: float32") + .Output("idx: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolate") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // (b,m,c) + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // (b,n,3) + c->WithRank(c->input(1), 3, &dims2); + // (b,n,c) + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolateGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;iinput(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,n,3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,m,3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *dist_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,n,3}, &dist_tensor)); + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,n,3}, &idx_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto dist_flat = dist_tensor->flat(); + float *dist = &(dist_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + threenn_cpu(b,n,m,xyz1,xyz2,dist,idx); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeNN").Device(DEVICE_CPU), ThreeNNOp); + + + +class ThreeInterpolateOp: public OpKernel{ + public: + explicit ThreeInterpolateOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolate expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b && idx_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) weight shape")); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + threeinterpolate_cpu(b,m,c,n,points,idx,weight,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolate").Device(DEVICE_CPU),ThreeInterpolateOp); + + +class ThreeInterpolateGradOp: public OpKernel{ + public: + explicit ThreeInterpolateGradOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) weight shape")); + + const Tensor& grad_out_tensor=context->input(3); + OP_REQUIRES(context,grad_out_tensor.dims()==3 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==n && grad_out_tensor.shape().dim_size(2)==c, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,c) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + memset(grad_points, 0, sizeof(float)*b*m*c); + threeinterpolate_grad_cpu(b,n,c,m,grad_out,idx,weight,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolateGrad").Device(DEVICE_CPU),ThreeInterpolateGradOp); + + diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate.py new file mode 100644 index 0000000..12ad124 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate.py @@ -0,0 +1,60 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +# interpolate_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_interpolate_so.so')) +interpolate_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_interpolate_so_hk.so')) +def three_nn(xyz1, xyz2): + ''' + Input: + xyz1: (b,n,3) float32 array, unknown points + xyz2: (b,m,3) float32 array, known points + Output: + dist: (b,n,3) float32 array, distances to known points + idx: (b,n,3) int32 array, indices to known points + ''' + return interpolate_module.three_nn(xyz1, xyz2) +ops.NoGradient('ThreeNN') +def three_interpolate(points, idx, weight): + ''' + Input: + points: (b,m,c) float32 array, known points + idx: (b,n,3) int32 array, indices to known points + weight: (b,n,3) float32 array, weights on known points + Output: + out: (b,n,c) float32 array, interpolated point values + ''' + return interpolate_module.three_interpolate(points, idx, weight) +@tf.RegisterGradient('ThreeInterpolate') +def _three_interpolate_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + weight = op.inputs[2] + return [interpolate_module.three_interpolate_grad(points, idx, weight, grad_out), None, None] + +if __name__=='__main__': + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,128,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/cpu:0'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(interpolated_points) + print(time.time() - now) + print(ret.shape, ret.dtype) + #print ret + + + diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate_compile.sh b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate_compile.sh new file mode 100755 index 0000000..7c2ce3b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate_compile.sh @@ -0,0 +1,5 @@ +# TF1.2 +#g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so_hk.so -shared -fPIC -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate_op_test.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate_op_test.py new file mode 100644 index 0000000..b1c244f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/tf_interpolate_op_test.py @@ -0,0 +1,24 @@ +import tensorflow as tf +import numpy as np +from tf_interpolate import three_nn, three_interpolate + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with self.test_session(): + points = tf.constant(np.random.random((1,8,16)).astype('float32')) + print points + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + print interpolated_points + err = tf.test.compute_gradient_error(points, (1,8,16), interpolated_points, (1,128,16)) + print err + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/visu_interpolation.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/visu_interpolation.py new file mode 100644 index 0000000..5b5836e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/3d_interpolation/visu_interpolation.py @@ -0,0 +1,44 @@ +''' Visualize part segmentation ''' +import os +import sys +ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append('/home/rqi/Projects/toolkits/visualization') +from show3d_balls import showpoints +import numpy as np +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf + + +pts2 = np.array([[0,0,1],[1,0,0],[0,1,0],[1,1,0]]).astype('float32') +xyz1 = np.random.random((100,3)).astype('float32') +xyz2 = np.array([[0,0,0],[1,0,0],[0,1,0],[1,1,1]]).astype('float32') + +def fun(xyz1,xyz2,pts2): + with tf.device('/cpu:0'): + points = tf.constant(np.expand_dims(pts2,0)) + xyz1 = tf.constant(np.expand_dims(xyz1,0)) + xyz2 = tf.constant(np.expand_dims(xyz2,0)) + dist, idx = three_nn(xyz1, xyz2) + #weight = tf.ones_like(dist)/3.0 + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm, [1,1,3]) + print norm + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + tmp,pts1,d,w = sess.run([xyz1, interpolated_points, dist, weight]) + #print w + pts1 = pts1.squeeze() + return pts1 + +pts1 = fun(xyz1,xyz2,pts2) +all_pts = np.zeros((104,3)) +all_pts[0:100,:] = pts1 +all_pts[100:,:] = pts2 +all_xyz = np.zeros((104,3)) +all_xyz[0:100,:]=xyz1 +all_xyz[100:,:]=xyz2 +showpoints(xyz2, pts2, ballradius=8) +showpoints(xyz1, pts1, ballradius=8) +showpoints(all_xyz, all_pts, ballradius=8) diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/.gitignore b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/.gitignore new file mode 100644 index 0000000..2f08276 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/.gitignore @@ -0,0 +1,10 @@ +a.out +query_ball_point +query_ball_point_block +query_ball_point_cuda +query_ball_point_grid +tf_grouping_g.cu.o +tf_grouping_so.so +selection_sort +selection_sort_cuda +selection_sort_const_cuda diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/compile.sh b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/compile.sh new file mode 100644 index 0000000..e1824dd --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/compile.sh @@ -0,0 +1,6 @@ +g++ query_ball_point.cpp -o query_ball_point +nvcc query_ball_point.cu -o query_ball_point_cuda +nvcc query_ball_point_block.cu -o query_ball_point_block +nvcc query_ball_point_grid.cu -o query_ball_point_grid +g++ -Wall selection_sort.cpp -o selection_sort +nvcc selection_sort.cu -o selection_sort_cuda diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point.cpp b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point.cpp new file mode 100644 index 0000000..4e28051 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point.cpp @@ -0,0 +1,119 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +void query_ball_point_cpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,1>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point_block.cu b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point_block.cu new file mode 100644 index 0000000..477fb3b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point_block.cu @@ -0,0 +1,134 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int index = threadIdx.x; + xyz1 += n*3*index; + xyz2 += m*3*index; + idx += m*nsample*index; + + for (int j=0;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,b>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,b>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point_grid.cu b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point_grid.cu new file mode 100644 index 0000000..dcfadba --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/query_ball_point_grid.cu @@ -0,0 +1,144 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/selection_sort.cpp b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/selection_sort.cpp new file mode 100644 index 0000000..6f0839e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/selection_sort.cpp @@ -0,0 +1,94 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), val (b,m,n) +void selection_sort_cpu(int b, int n, int m, int k, const float *dist, int *idx, float *val) { + float *p_dist; + float tmp; + int tmpi; + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,k), val (b,m,k) +__global__ void selection_sort_gpu(int b, int n, int m, int k, float *dist, int *idx, float *val) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + idx+=m*k*batch_index; + val+=m*k*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float *p_dist; + for (int j=index;j>>(b,n,m,k,dist,idx,val); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/selection_sort_const.cu b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/selection_sort_const.cu new file mode 100644 index 0000000..9666849 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/test/selection_sort_const.cu @@ -0,0 +1,92 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), dist_out (b,m,n) +__global__ void selection_sort_gpu(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + outi+=m*n*batch_index; + out+=m*n*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + // copy from dist to dist_out + for (int j=index;j>>(b,n,m,k,dist,idx,dist_out); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + //for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include +using namespace tensorflow; + +REGISTER_OP("QueryBallPoint") + .Attr("radius: float") + .Attr("nsample: int") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("idx: int32") + .Output("pts_cnt: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoint * 3 + c->WithRank(c->input(1), 3, &dims2); + int nsample; + TF_RETURN_IF_ERROR(c->GetAttr("nsample", &nsample)); + ::tensorflow::shape_inference::ShapeHandle output1 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), nsample}); + c->set_output(0, output1); + ::tensorflow::shape_inference::ShapeHandle output2 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(1, output2); + return Status::OK(); + }); +REGISTER_OP("SelectionSort") + .Attr("k: int") + .Input("dist: float32") + .Output("outi: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("GroupPoint") + .Input("points: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * channels + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints * nsample + c->WithRank(c->input(1), 3, &dims2); + // batch_size * npoints * nsample * channels + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), c->Dim(dims2, 2), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GroupPointGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + + +void queryBallPointLauncher(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt); +class QueryBallPointGpuOp : public OpKernel { + public: + explicit QueryBallPointGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("radius", &radius_)); + OP_REQUIRES(context, radius_ > 0, errors::InvalidArgument("QueryBallPoint expects positive radius")); + + OP_REQUIRES_OK(context, context->GetAttr("nsample", &nsample_)); + OP_REQUIRES(context, nsample_ > 0, errors::InvalidArgument("QueryBallPoint expects positive nsample")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& xyz1_tensor = context->input(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, ndataset, 3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, npoint, 3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,nsample_}, &idx_tensor)); + Tensor *pts_cnt_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m}, &pts_cnt_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + auto pts_cnt_flat = pts_cnt_tensor->flat(); + int *pts_cnt = &(pts_cnt_flat(0)); + queryBallPointLauncher(b,n,m,radius_,nsample_,xyz1,xyz2,idx,pts_cnt); + } + private: + float radius_; + int nsample_; +}; +REGISTER_KERNEL_BUILDER(Name("QueryBallPoint").Device(DEVICE_GPU), QueryBallPointGpuOp); + +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out); +class SelectionSortGpuOp : public OpKernel { + public: + explicit SelectionSortGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("k", &k_)); + OP_REQUIRES(context, k_ > 0, errors::InvalidArgument("SelectionSort expects positive k")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& dist_tensor = context->input(0); + OP_REQUIRES(context, dist_tensor.dims()==3, errors::InvalidArgument("SelectionSort expects (b,m,n) dist shape.")); + int b = dist_tensor.shape().dim_size(0); + int m = dist_tensor.shape().dim_size(1); + int n = dist_tensor.shape().dim_size(2); + + Tensor *outi_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,n}, &outi_tensor)); + Tensor *out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m,n}, &out_tensor)); + + auto dist_flat = dist_tensor.flat(); + const float *dist = &(dist_flat(0)); + auto outi_flat = outi_tensor->flat(); + int *outi = &(outi_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + selectionSortLauncher(b,n,m,k_,dist,outi,out); + } + private: + int k_; +}; +REGISTER_KERNEL_BUILDER(Name("SelectionSort").Device(DEVICE_GPU), SelectionSortGpuOp); + + +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out); +class GroupPointGpuOp: public OpKernel{ + public: + explicit GroupPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPoint expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPoint expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,nsample,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + groupPointLauncher(b,n,c,m,nsample,points,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPoint").Device(DEVICE_GPU),GroupPointGpuOp); + +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points); +class GroupPointGradGpuOp: public OpKernel{ + public: + explicit GroupPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPointGrad expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + const Tensor& grad_out_tensor=context->input(2); + OP_REQUIRES(context,grad_out_tensor.dims()==4 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==m && grad_out_tensor.shape().dim_size(2)==nsample && grad_out_tensor.shape().dim_size(3)==c, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample, channel) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + cudaMemset(grad_points, 0, sizeof(float)*b*n*c); + groupPointGradLauncher(b,n,c,m,nsample,grad_out,idx,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPointGrad").Device(DEVICE_GPU),GroupPointGradGpuOp); + + diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping.py new file mode 100644 index 0000000..a822e15 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping.py @@ -0,0 +1,106 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +# grouping_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_grouping_so.so')) +grouping_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_grouping_so_hk.so')) +def query_ball_point(radius, nsample, xyz1, xyz2): + ''' + Input: + radius: float32, ball search radius + nsample: int32, number of points selected in each ball region + xyz1: (batch_size, ndataset, 3) float32 array, input points + xyz2: (batch_size, npoint, 3) float32 array, query points + Output: + idx: (batch_size, npoint, nsample) int32 array, indices to input points + pts_cnt: (batch_size, npoint) int32 array, number of unique points in each local region + ''' + #return grouping_module.query_ball_point(radius, nsample, xyz1, xyz2) + return grouping_module.query_ball_point(xyz1, xyz2, radius, nsample) +ops.NoGradient('QueryBallPoint') +def select_top_k(k, dist): + ''' + Input: + k: int32, number of k SMALLEST elements selected + dist: (b,m,n) float32 array, distance matrix, m query points, n dataset points + Output: + idx: (b,m,n) int32 array, first k in n are indices to the top k + dist_out: (b,m,n) float32 array, first k in n are the top k + ''' + return grouping_module.selection_sort(dist, k) +ops.NoGradient('SelectionSort') +def group_point(points, idx): + ''' + Input: + points: (batch_size, ndataset, channel) float32 array, points to sample from + idx: (batch_size, npoint, nsample) int32 array, indices to points + Output: + out: (batch_size, npoint, nsample, channel) float32 array, values sampled from points + ''' + return grouping_module.group_point(points, idx) +@tf.RegisterGradient('GroupPoint') +def _group_point_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + return [grouping_module.group_point_grad(points, idx, grad_out), None] + +def knn_point(k, xyz1, xyz2): + ''' + Input: + k: int32, number of k in k-nn search + xyz1: (batch_size, ndataset, c) float32 array, input points + xyz2: (batch_size, npoint, c) float32 array, query points + Output: + val: (batch_size, npoint, k) float32 array, L2 distances + idx: (batch_size, npoint, k) int32 array, indices to input points + ''' + b = xyz1.get_shape()[0].value + n = xyz1.get_shape()[1].value + c = xyz1.get_shape()[2].value + m = xyz2.get_shape()[1].value + print(b, n, c, m) + print(xyz1, (b,1,n,c)) + xyz1 = tf.tile(tf.reshape(xyz1, (b,1,n,c)), [1,m,1,1]) + xyz2 = tf.tile(tf.reshape(xyz2, (b,m,1,c)), [1,1,n,1]) + dist = tf.reduce_sum((xyz1-xyz2)**2, -1) + print(dist, k) + outi, out = select_top_k(k, dist) + idx = tf.slice(outi, [0,0,0], [-1,-1,k]) + val = tf.slice(out, [0,0,0], [-1,-1,k]) + print(idx, val) + #val, idx = tf.nn.top_k(-dist, k=k) # ONLY SUPPORT CPU + return(val, idx) + +if __name__=='__main__': + knn=True + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,512,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/gpu:1'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + radius = 0.1 + nsample = 64 + if knn: + _, idx = knn_point(nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + else: + idx, _ = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + #grouped_points_grad = tf.ones_like(grouped_points) + #points_grad = tf.gradients(grouped_points, points, grouped_points_grad) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(grouped_points) + print(time.time() - now) + print(ret.shape, ret.dtype) + print(ret) + + diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_compile.sh b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_compile.sh new file mode 100755 index 0000000..ecab6e9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_compile.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/local/cuda-9.0/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# TF1.2 +#g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so_hk.so -shared -fPIC -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_g.cu b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_g.cu new file mode 100644 index 0000000..578330d --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_g.cu @@ -0,0 +1,141 @@ +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample), pts_cnt (b,m) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + pts_cnt += m*batch_index; // counting how many unique points selected in local region + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx,pts_cnt); + //cudaDeviceSynchronize(); +} +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + selection_sort_gpu<<>>(b,n,m,k,dist,outi,out); + //cudaDeviceSynchronize(); +} +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out){ + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + //cudaDeviceSynchronize(); +} +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points){ + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //cudaDeviceSynchronize(); +} diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_op_test.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_op_test.py new file mode 100644 index 0000000..4f30a3e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/grouping/tf_grouping_op_test.py @@ -0,0 +1,28 @@ +import tensorflow as tf +import numpy as np +from tf_grouping import query_ball_point, group_point + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with tf.device('/gpu:0'): + points = tf.constant(np.random.random((1,128,16)).astype('float32')) + print points + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + radius = 0.3 + nsample = 32 + idx, pts_cnt = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + print grouped_points + + with self.test_session(): + print "---- Going to compute gradient error" + err = tf.test.compute_gradient_error(points, (1,128,16), grouped_points, (1,8,32,16)) + print err + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/.gitignore b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/.gitignore new file mode 100644 index 0000000..9d22eb4 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/.gitignore @@ -0,0 +1,2 @@ +*.o +*.so diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling.cpp b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling.cpp new file mode 100644 index 0000000..fb3dd28 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling.cpp @@ -0,0 +1,179 @@ +/* Furthest point sampling + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include + +using namespace tensorflow; + +REGISTER_OP("ProbSample") + .Input("inp: float32") + .Input("inpr: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ncategory + c->WithRank(c->input(0), 2, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("FarthestPointSample") + .Attr("npoint: int") + .Input("inp: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * npoint * 3 + c->WithRank(c->input(0), 3, &dims1); + int npoint; + TF_RETURN_IF_ERROR(c->GetAttr("npoint", &npoint)); + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), npoint}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPoint") + .Input("inp: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * 3 + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints * 3 + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPointGrad") + .Input("inp: float32") + .Input("idx: int32") + .Input("out_g: float32") + .Output("inp_g: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out); +class ProbSampleGpuOp: public OpKernel{ + public: + explicit ProbSampleGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + const Tensor& inpr_tensor=context->input(1); + auto inp_flat=inp_tensor.flat(); + auto inpr_flat=inpr_tensor.flat(); + const float * inp=&(inp_flat(0)); + const float * inpr=&(inpr_flat(0)); + OP_REQUIRES(context,inp_tensor.dims()==2,errors::InvalidArgument("ProbSample expects (batch_size,num_choices) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + OP_REQUIRES(context,inpr_tensor.dims()==2 && inpr_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ProbSample expects (batch_size,num_points) inpr shape")); + int m=inpr_tensor.shape().dim_size(1); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + probsampleLauncher(b,n,m,inp,inpr,temp,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ProbSample").Device(DEVICE_GPU), ProbSampleGpuOp); + +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out); +class FarthestPointSampleGpuOp: public OpKernel{ + public: + explicit FarthestPointSampleGpuOp(OpKernelConstruction* context):OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("npoint", &npoint_)); + OP_REQUIRES(context, npoint_ > 0, errors::InvalidArgument("FarthestPointSample expects positive npoint")); + } + void Compute(OpKernelContext * context)override{ + int m = npoint_; + + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("FarthestPointSample expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + Tensor * out_tensor; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{32,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + farthestpointsamplingLauncher(b,n,m,inp,temp,out); + } + private: + int npoint_; +}; +REGISTER_KERNEL_BUILDER(Name("FarthestPointSample").Device(DEVICE_GPU),FarthestPointSampleGpuOp); + +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out); +class GatherPointGpuOp: public OpKernel{ + public: + explicit GatherPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPoint expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPoint expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,3},&out_tensor)); + auto out_flat=out_tensor->flat(); + float * out=&(out_flat(0)); + gatherpointLauncher(b,n,m,inp,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPoint").Device(DEVICE_GPU),GatherPointGpuOp); + +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g); +class GatherPointGradGpuOp: public OpKernel{ + public: + explicit GatherPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_points,3) inp")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + const Tensor& out_g_tensor=context->input(2); + OP_REQUIRES(context,out_g_tensor.dims()==3 && out_g_tensor.shape().dim_size(0)==b && out_g_tensor.shape().dim_size(1)==m && out_g_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result,3) out_g shape")); + auto out_g_flat=out_g_tensor.flat(); + const float * out_g=&(out_g_flat(0)); + Tensor * inp_g_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&inp_g_tensor)); + auto inp_g_flat=inp_g_tensor->flat(); + float * inp_g=&(inp_g_flat(0)); + cudaMemset(inp_g,0,b*n*3*4); + scatteraddpointLauncher(b,n,m,out_g,idx,inp_g); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPointGrad").Device(DEVICE_GPU),GatherPointGradGpuOp); + diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling.py new file mode 100644 index 0000000..eed283c --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling.py @@ -0,0 +1,90 @@ +''' Furthest point sampling +Original author: Haoqiang Fan +Modified by Charles R. Qi +All Rights Reserved. 2017. +''' +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +# sampling_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_sampling_so.so')) +sampling_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_sampling_so_hk.so')) +def prob_sample(inp,inpr): + ''' +input: + batch_size * ncategory float32 + batch_size * npoints float32 +returns: + batch_size * npoints int32 + ''' + return sampling_module.prob_sample(inp,inpr) +ops.NoGradient('ProbSample') +# TF1.0 API requires set shape in C++ +#@tf.RegisterShape('ProbSample') +#def _prob_sample_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(2) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape2.dims[0],shape2.dims[1]])] +def gather_point(inp,idx): + ''' +input: + batch_size * ndataset * 3 float32 + batch_size * npoints int32 +returns: + batch_size * npoints * 3 float32 + ''' + return sampling_module.gather_point(inp,idx) +#@tf.RegisterShape('GatherPoint') +#def _gather_point_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(3) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape1.dims[0],shape2.dims[1],shape1.dims[2]])] +@tf.RegisterGradient('GatherPoint') +def _gather_point_grad(op,out_g): + inp=op.inputs[0] + idx=op.inputs[1] + return [sampling_module.gather_point_grad(inp,idx,out_g),None] +def farthest_point_sample(npoint,inp): + ''' +input: + int32 + batch_size * ndataset * 3 float32 +returns: + batch_size * npoint int32 + ''' + return sampling_module.farthest_point_sample(inp, npoint) +ops.NoGradient('FarthestPointSample') + + +if __name__=='__main__': + import numpy as np + np.random.seed(100) + triangles=np.random.rand(1,5,3,3).astype('float32') + with tf.device('/gpu:1'): + inp=tf.constant(triangles) + tria=inp[:,:,0,:] + trib=inp[:,:,1,:] + tric=inp[:,:,2,:] + areas=tf.sqrt(tf.reduce_sum(tf.cross(trib-tria,tric-tria)**2,2)+1e-9) + randomnumbers=tf.random_uniform((1,8192)) + triids=prob_sample(areas,randomnumbers) + tria_sample=gather_point(tria,triids) + trib_sample=gather_point(trib,triids) + tric_sample=gather_point(tric,triids) + us=tf.random_uniform((1,8192)) + vs=tf.random_uniform((1,8192)) + uplusv=1-tf.abs(us+vs-1) + uminusv=us-vs + us=(uplusv+uminusv)*0.5 + vs=(uplusv-uminusv)*0.5 + pt_sample=tria_sample+(trib_sample-tria_sample)*tf.expand_dims(us,-1)+(tric_sample-tria_sample)*tf.expand_dims(vs,-1) + print('pt_sample: ', pt_sample) + reduced_sample=gather_point(pt_sample,farthest_point_sample(1024,pt_sample)) + print(reduced_sample) + with tf.Session('') as sess: + ret=sess.run(reduced_sample) + print(ret.shape,ret.dtype) + import cPickle as pickle + pickle.dump(ret,open('1.pkl','wb'),-1) diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling_compile.sh b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling_compile.sh new file mode 100755 index 0000000..8a8fae7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling_compile.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/local/cuda-9.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# TF1.2 +#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so_hk.so -shared -fPIC -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L/home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling_g.cu b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling_g.cu new file mode 100644 index 0000000..6e28bc7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/tf_ops/sampling/tf_sampling_g.cu @@ -0,0 +1,212 @@ +/* Furthest point sampling GPU implementation + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ + +__global__ void cumsumKernel(int b,int n,const float * __restrict__ inp,float * __restrict__ out){ + const int BlockSize=2048; + const int paddingLevel=5; + __shared__ float buffer4[BlockSize*4]; + __shared__ float buffer[BlockSize+(BlockSize>>paddingLevel)]; + for (int i=blockIdx.x;i>2; + for (int k=threadIdx.x*4;k>2)+(k>>(2+paddingLevel))]=v4; + }else{ + float v=0; + for (int k2=k;k2>2)+(k>>(2+paddingLevel))]=v; + } + } + int u=0; + for (;(2<>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+2)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + u--; + for (;u>=0;u--){ + __syncthreads(); + for (int k=threadIdx.x;k>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+3)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + __syncthreads(); + for (int k=threadIdx.x*4;k>2)-1)+(((k>>2)-1)>>paddingLevel); + buffer4[k]+=buffer[k2]; + buffer4[k+1]+=buffer[k2]; + buffer4[k+2]+=buffer[k2]; + buffer4[k+3]+=buffer[k2]; + } + } + __syncthreads(); + for (int k=threadIdx.x;k>paddingLevel)]+runningsum2; + float r2=runningsum+t; + runningsum2=t-(r2-runningsum); + runningsum=r2; + __syncthreads(); + } + } +} + +__global__ void binarysearchKernel(int b,int n,int m,const float * __restrict__ dataset,const float * __restrict__ query, int * __restrict__ result){ + int base=1; + while (base=1;k>>=1) + if (r>=k && dataset[i*n+r-k]>=q) + r-=k; + result[i*m+j]=r; + } + } +} +__global__ void farthestpointsamplingKernel(int b,int n,int m,const float * __restrict__ dataset,float * __restrict__ temp,int * __restrict__ idxs){ + if (m<=0) + return; + const int BlockSize=512; + __shared__ float dists[BlockSize]; + __shared__ int dists_i[BlockSize]; + const int BufferSize=3072; + __shared__ float buf[BufferSize*3]; + for (int i=blockIdx.x;ibest){ + best=d2; + besti=k; + } + } + dists[threadIdx.x]=best; + dists_i[threadIdx.x]=besti; + for (int u=0;(1<>(u+1))){ + int i1=(threadIdx.x*2)<>>(b,n,inp,out); +} +//require b*n working space +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out){ + cumsumKernel<<<32,512>>>(b,n,inp_p,temp); + binarysearchKernel<<>>(b,n,m,temp,inp_r,out); +} +//require 32*n working space +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out){ + farthestpointsamplingKernel<<<32,512>>>(b,n,m,inp,temp,out); +} +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out){ + gatherpointKernel<<>>(b,n,m,inp,idx,out); +} +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g){ + scatteraddpointKernel<<>>(b,n,m,out_g,idx,inp_g); +} + diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/train.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/train.py new file mode 100644 index 0000000..28b8b72 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/train.py @@ -0,0 +1,294 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='spidercnn_cls_xyz', help='Model name: spidercnn [default: spidercnn]') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) +else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_POINT, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE)) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + #merged = tf.merge_all_summaries() + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + eval_acc_max = 0 + maxAcc_epoch = 0 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_acc = eval_one_epoch(sess, ops, test_writer) + + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + if (".h5" in TRAIN_FILE): + current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + return (total_correct / float(total_seen)) + + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/eulerangles.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/eulerangles.py new file mode 100644 index 0000000..87bd605 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/eulerangles.py @@ -0,0 +1,418 @@ +# emacs: -*- mode: python-mode; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the NiBabel package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +''' Module implementing Euler angle rotations and their conversions + +See: + +* http://en.wikipedia.org/wiki/Rotation_matrix +* http://en.wikipedia.org/wiki/Euler_angles +* http://mathworld.wolfram.com/EulerAngles.html + +See also: *Representing Attitude with Euler Angles and Quaternions: A +Reference* (2006) by James Diebel. A cached PDF link last found here: + +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.110.5134 + +Euler's rotation theorem tells us that any rotation in 3D can be +described by 3 angles. Let's call the 3 angles the *Euler angle vector* +and call the angles in the vector :math:`alpha`, :math:`beta` and +:math:`gamma`. The vector is [ :math:`alpha`, +:math:`beta`. :math:`gamma` ] and, in this description, the order of the +parameters specifies the order in which the rotations occur (so the +rotation corresponding to :math:`alpha` is applied first). + +In order to specify the meaning of an *Euler angle vector* we need to +specify the axes around which each of the rotations corresponding to +:math:`alpha`, :math:`beta` and :math:`gamma` will occur. + +There are therefore three axes for the rotations :math:`alpha`, +:math:`beta` and :math:`gamma`; let's call them :math:`i` :math:`j`, +:math:`k`. + +Let us express the rotation :math:`alpha` around axis `i` as a 3 by 3 +rotation matrix `A`. Similarly :math:`beta` around `j` becomes 3 x 3 +matrix `B` and :math:`gamma` around `k` becomes matrix `G`. Then the +whole rotation expressed by the Euler angle vector [ :math:`alpha`, +:math:`beta`. :math:`gamma` ], `R` is given by:: + + R = np.dot(G, np.dot(B, A)) + +See http://mathworld.wolfram.com/EulerAngles.html + +The order :math:`G B A` expresses the fact that the rotations are +performed in the order of the vector (:math:`alpha` around axis `i` = +`A` first). + +To convert a given Euler angle vector to a meaningful rotation, and a +rotation matrix, we need to define: + +* the axes `i`, `j`, `k` +* whether a rotation matrix should be applied on the left of a vector to + be transformed (vectors are column vectors) or on the right (vectors + are row vectors). +* whether the rotations move the axes as they are applied (intrinsic + rotations) - compared the situation where the axes stay fixed and the + vectors move within the axis frame (extrinsic) +* the handedness of the coordinate system + +See: http://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities + +We are using the following conventions: + +* axes `i`, `j`, `k` are the `z`, `y`, and `x` axes respectively. Thus + an Euler angle vector [ :math:`alpha`, :math:`beta`. :math:`gamma` ] + in our convention implies a :math:`alpha` radian rotation around the + `z` axis, followed by a :math:`beta` rotation around the `y` axis, + followed by a :math:`gamma` rotation around the `x` axis. +* the rotation matrix applies on the left, to column vectors on the + right, so if `R` is the rotation matrix, and `v` is a 3 x N matrix + with N column vectors, the transformed vector set `vdash` is given by + ``vdash = np.dot(R, v)``. +* extrinsic rotations - the axes are fixed, and do not move with the + rotations. +* a right-handed coordinate system + +The convention of rotation around ``z``, followed by rotation around +``y``, followed by rotation around ``x``, is known (confusingly) as +"xyz", pitch-roll-yaw, Cardan angles, or Tait-Bryan angles. +''' + +import math + +import sys +if sys.version_info >= (3,0): + from functools import reduce + +import numpy as np + + +_FLOAT_EPS_4 = np.finfo(float).eps * 4.0 + + +def euler2mat(z=0, y=0, x=0): + ''' Return matrix for rotations around z, y and x axes + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + M : array shape (3,3) + Rotation matrix giving same rotation as for given angles + + Examples + -------- + >>> zrot = 1.3 # radians + >>> yrot = -0.1 + >>> xrot = 0.2 + >>> M = euler2mat(zrot, yrot, xrot) + >>> M.shape == (3, 3) + True + + The output rotation matrix is equal to the composition of the + individual rotations + + >>> M1 = euler2mat(zrot) + >>> M2 = euler2mat(0, yrot) + >>> M3 = euler2mat(0, 0, xrot) + >>> composed_M = np.dot(M3, np.dot(M2, M1)) + >>> np.allclose(M, composed_M) + True + + You can specify rotations by named arguments + + >>> np.all(M3 == euler2mat(x=xrot)) + True + + When applying M to a vector, the vector should column vector to the + right of M. If the right hand side is a 2D array rather than a + vector, then each column of the 2D array represents a vector. + + >>> vec = np.array([1, 0, 0]).reshape((3,1)) + >>> v2 = np.dot(M, vec) + >>> vecs = np.array([[1, 0, 0],[0, 1, 0]]).T # giving 3x2 array + >>> vecs2 = np.dot(M, vecs) + + Rotations are counter-clockwise. + + >>> zred = np.dot(euler2mat(z=np.pi/2), np.eye(3)) + >>> np.allclose(zred, [[0, -1, 0],[1, 0, 0], [0, 0, 1]]) + True + >>> yred = np.dot(euler2mat(y=np.pi/2), np.eye(3)) + >>> np.allclose(yred, [[0, 0, 1],[0, 1, 0], [-1, 0, 0]]) + True + >>> xred = np.dot(euler2mat(x=np.pi/2), np.eye(3)) + >>> np.allclose(xred, [[1, 0, 0],[0, 0, -1], [0, 1, 0]]) + True + + Notes + ----- + The direction of rotation is given by the right-hand rule (orient + the thumb of the right hand along the axis around which the rotation + occurs, with the end of the thumb at the positive end of the axis; + curl your fingers; the direction your fingers curl is the direction + of rotation). Therefore, the rotations are counterclockwise if + looking along the axis of rotation from positive to negative. + ''' + Ms = [] + if z: + cosz = math.cos(z) + sinz = math.sin(z) + Ms.append(np.array( + [[cosz, -sinz, 0], + [sinz, cosz, 0], + [0, 0, 1]])) + if y: + cosy = math.cos(y) + siny = math.sin(y) + Ms.append(np.array( + [[cosy, 0, siny], + [0, 1, 0], + [-siny, 0, cosy]])) + if x: + cosx = math.cos(x) + sinx = math.sin(x) + Ms.append(np.array( + [[1, 0, 0], + [0, cosx, -sinx], + [0, sinx, cosx]])) + if Ms: + return reduce(np.dot, Ms[::-1]) + return np.eye(3) + + +def mat2euler(M, cy_thresh=None): + ''' Discover Euler angle vector from 3x3 matrix + + Uses the conventions above. + + Parameters + ---------- + M : array-like, shape (3,3) + cy_thresh : None or scalar, optional + threshold below which to give up on straightforward arctan for + estimating x rotation. If None (default), estimate from + precision of input. + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Notes + ----- + If there was no numerical error, the routine could be derived using + Sympy expression for z then y then x rotation matrix, which is:: + + [ cos(y)*cos(z), -cos(y)*sin(z), sin(y)], + [cos(x)*sin(z) + cos(z)*sin(x)*sin(y), cos(x)*cos(z) - sin(x)*sin(y)*sin(z), -cos(y)*sin(x)], + [sin(x)*sin(z) - cos(x)*cos(z)*sin(y), cos(z)*sin(x) + cos(x)*sin(y)*sin(z), cos(x)*cos(y)] + + with the obvious derivations for z, y, and x + + z = atan2(-r12, r11) + y = asin(r13) + x = atan2(-r23, r33) + + Problems arise when cos(y) is close to zero, because both of:: + + z = atan2(cos(y)*sin(z), cos(y)*cos(z)) + x = atan2(cos(y)*sin(x), cos(x)*cos(y)) + + will be close to atan2(0, 0), and highly unstable. + + The ``cy`` fix for numerical instability below is from: *Graphics + Gems IV*, Paul Heckbert (editor), Academic Press, 1994, ISBN: + 0123361559. Specifically it comes from EulerAngles.c by Ken + Shoemake, and deals with the case where cos(y) is close to zero: + + See: http://www.graphicsgems.org/ + + The code appears to be licensed (from the website) as "can be used + without restrictions". + ''' + M = np.asarray(M) + if cy_thresh is None: + try: + cy_thresh = np.finfo(M.dtype).eps * 4 + except ValueError: + cy_thresh = _FLOAT_EPS_4 + r11, r12, r13, r21, r22, r23, r31, r32, r33 = M.flat + # cy: sqrt((cos(y)*cos(z))**2 + (cos(x)*cos(y))**2) + cy = math.sqrt(r33*r33 + r23*r23) + if cy > cy_thresh: # cos(y) not close to zero, standard form + z = math.atan2(-r12, r11) # atan2(cos(y)*sin(z), cos(y)*cos(z)) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = math.atan2(-r23, r33) # atan2(cos(y)*sin(x), cos(x)*cos(y)) + else: # cos(y) (close to) zero, so x -> 0.0 (see above) + # so r21 -> sin(z), r22 -> cos(z) and + z = math.atan2(r21, r22) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = 0.0 + return z, y, x + + +def euler2quat(z=0, y=0, x=0): + ''' Return quaternion corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + quat : array shape (4,) + Quaternion in w, x, y z (real, then vector) format + + Notes + ----- + We can derive this formula in Sympy using: + + 1. Formula giving quaternion corresponding to rotation of theta radians + about arbitrary axis: + http://mathworld.wolfram.com/EulerParameters.html + 2. Generated formulae from 1.) for quaternions corresponding to + theta radians rotations about ``x, y, z`` axes + 3. Apply quaternion multiplication formula - + http://en.wikipedia.org/wiki/Quaternions#Hamilton_product - to + formulae from 2.) to give formula for combined rotations. + ''' + z = z/2.0 + y = y/2.0 + x = x/2.0 + cz = math.cos(z) + sz = math.sin(z) + cy = math.cos(y) + sy = math.sin(y) + cx = math.cos(x) + sx = math.sin(x) + return np.array([ + cx*cy*cz - sx*sy*sz, + cx*sy*sz + cy*cz*sx, + cx*cz*sy - sx*cy*sz, + cx*cy*sz + sx*cz*sy]) + + +def quat2euler(q): + ''' Return Euler angles corresponding to quaternion `q` + + Parameters + ---------- + q : 4 element sequence + w, x, y, z of quaternion + + Returns + ------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``quat2mat`` and ``mat2euler`` functions, but + the reduction in computation is small, and the code repetition is + large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return mat2euler(nq.quat2mat(q)) + + +def euler2angle_axis(z=0, y=0, x=0): + ''' Return angle, axis corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + theta : scalar + angle of rotation + vector : array shape (3,) + axis around which rotation occurs + + Examples + -------- + >>> theta, vec = euler2angle_axis(0, 1.5, 0) + >>> print(theta) + 1.5 + >>> np.allclose(vec, [0, 1, 0]) + True + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return nq.quat2angle_axis(euler2quat(z, y, x)) + + +def angle_axis2euler(theta, vector, is_normalized=False): + ''' Convert angle, axis pair to Euler angles + + Parameters + ---------- + theta : scalar + angle of rotation + vector : 3 element sequence + vector specifying axis for rotation. + is_normalized : bool, optional + True if vector is already normalized (has norm of 1). Default + False + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Examples + -------- + >>> z, y, x = angle_axis2euler(0, [1, 0, 0]) + >>> np.allclose((z, y, x), 0) + True + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``angle_axis2mat`` and ``mat2euler`` + functions, but the reduction in computation is small, and the code + repetition is large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + M = nq.angle_axis2mat(theta, vector, is_normalized) + return mat2euler(M) diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/pc_util.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/pc_util.py new file mode 100644 index 0000000..4913231 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/pc_util.py @@ -0,0 +1,198 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +# ---------------------------------------- +# Point cloud IO +# ---------------------------------------- + +def read_ply(filename): + """ read XYZ point cloud from filename PLY file """ + plydata = PlyData.read(filename) + pc = plydata['vertex'].data + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + + +def write_ply(points, filename, text=True): + """ input: Nx3, write points to filename as PLY format. """ + points = [(points[i,0], points[i,1], points[i,2]) for i in range(points.shape[0])] + vertex = np.array(points, dtype=[('x', 'f4'), ('y', 'f4'),('z', 'f4')]) + el = PlyElement.describe(vertex, 'vertex', comments=['vertices']) + PlyData([el], text=text).write(filename) + + +# ---------------------------------------- +# Simple Point cloud and Volume Renderers +# ---------------------------------------- + +def draw_point_cloud(input_points, canvasSize=500, space=200, diameter=25, + xrot=0, yrot=0, zrot=0, switch_xyz=[0,1,2], normalize=True): + """ Render point cloud to image with alpha channel. + Input: + points: Nx3 numpy array (+y is up direction) + Output: + gray image as numpy array of size canvasSizexcanvasSize + """ + image = np.zeros((canvasSize, canvasSize)) + if input_points is None or input_points.shape[0] == 0: + return image + + points = input_points[:, switch_xyz] + M = euler2mat(zrot, yrot, xrot) + points = (np.dot(M, points.transpose())).transpose() + + # Normalize the point cloud + # We normalize scale to fit points in a unit sphere + if normalize: + centroid = np.mean(points, axis=0) + points -= centroid + furthest_distance = np.max(np.sqrt(np.sum(abs(points)**2,axis=-1))) + points /= furthest_distance + + # Pre-compute the Gaussian disk + radius = (diameter-1)/2.0 + disk = np.zeros((diameter, diameter)) + for i in range(diameter): + for j in range(diameter): + if (i - radius) * (i-radius) + (j-radius) * (j-radius) <= radius * radius: + disk[i, j] = np.exp((-(i-radius)**2 - (j-radius)**2)/(radius**2)) + mask = np.argwhere(disk > 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +from PIL import Image +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +import matplotlib.pyplot as plt +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/provider.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/provider.py new file mode 100644 index 0000000..ddc370b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/provider.py @@ -0,0 +1,150 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(BASE_DIR, 'data') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_with_normal(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + pointcloud_data = batch_data[:, :, 0:3] + normal_data = batch_data[:, :, 3:6] + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + rotated_data_pc = np.zeros(pointcloud_data.shape, dtype=np.float32) + rotated_data_nor = np.zeros(normal_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = pointcloud_data[k, ...] + shape_nor = normal_data[k, ...] + rotated_data_pc[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data_nor[k, ...] = np.dot(shape_nor.reshape((-1, 3)), rotation_matrix) + rotated_data = np.concatenate((rotated_data_pc, rotated_data_nor), 2) + return rotated_data + + + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) + + +def loadDataFile_with_seg(filename): + return load_h5_data_label_seg(filename) + + +def loadDataFile_with_normal(filename): + f = h5py.File(filename) + data = f['data'][:] + label = f['label'][:] + normal = f['normal'][:] + return (data, label, normal) diff --git a/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/tf_util.py b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/tf_util.py new file mode 100644 index 0000000..f95fd17 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/SpiderCNN/utils/tf_util.py @@ -0,0 +1,536 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/sampling')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/grouping')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/3d_interpolation')) +from tf_sampling import farthest_point_sample, gather_point +from tf_grouping import query_ball_point, group_point, knn_point +from tf_interpolate import three_nn, three_interpolate +import numpy as np +import tensorflow as tf + + + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_multi_GPU=False, + gn=False, + G=32): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + is_multi_GPU: bool, whether to use multi GPU + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + if is_multi_GPU: + outputs = batch_norm_template_multiGPU(outputs, is_training, + 'bn', [0,1,2], bn_decay) + else: + outputs = batch_norm_template(outputs, is_training, + 'bn', [0,1,2], bn_decay) + if gn: + outputs = group_norm_for_conv(outputs, G=G, scope='gn') + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def spiderConv(feat, + idx, + delta, + num_conv, + taylor_channel, + bn=False, + is_training=None, + bn_decay=None, + gn=False, + G=32, + is_multi_GPU=False, + activation_fn=tf.nn.relu, + scope='taylor'): + """ 2D convolution with non-linear operation. + + Args: + feat: 3-D tensor variable BxNxC + idx: 3-D tensor variable BxNxk + delta: 4-D tensor variable BxNxkx3 + num_conv: int + taylor_channel: int + bn: bool, whether to use batch norm + is_training: bool Tensor variable + bn_decay: float or float tensor variable in [0,1] + gn: bool, whether to use group norm + G: int + is_multi_GPU: bool, whether to use multi GPU + activation_fn: function + scope: string + + + Returns: + feat: 3-D tensor variable BxNxC + """ + with tf.variable_scope(scope) as sc: + grouped_points = group_point(feat, idx) + + batch_size = grouped_points.get_shape()[0].value + num_point = grouped_points.get_shape()[1].value + K_knn = grouped_points.get_shape()[2].value + in_channels = grouped_points.get_shape()[3].value + shape = [1, 1, 1, taylor_channel] + + X = delta[:, :, :, 0] + Y = delta[:, :, :, 1] + Z = delta[:, :, :, 2] + + X = tf.expand_dims(X, -1) + Y = tf.expand_dims(Y, -1) + Z = tf.expand_dims(Z, -1) + + #initialize + initializer = tf.contrib.layers.xavier_initializer() + + w_x = tf.tile(_variable_on_cpu('weight_x', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_y = tf.tile(_variable_on_cpu('weight_y', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_z = tf.tile(_variable_on_cpu('weight_z', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_xyz = tf.tile(_variable_on_cpu('weight_xyz', shape, initializer), [batch_size, num_point, K_knn, 1]) + + w_xy = tf.tile(_variable_on_cpu('weight_xy', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_yz = tf.tile(_variable_on_cpu('weight_yz', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_xz = tf.tile(_variable_on_cpu('weight_xz', shape, initializer), [batch_size, num_point, K_knn, 1]) + biases = tf.tile(_variable_on_cpu('biases', shape, + tf.constant_initializer(0.0)), [batch_size, num_point, K_knn, 1]) + + w_xx = tf.tile(_variable_on_cpu('weight_xx', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_yy = tf.tile(_variable_on_cpu('weight_yy', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_zz = tf.tile(_variable_on_cpu('weight_zz', shape, initializer), [batch_size, num_point, K_knn, 1]) + + w_xxy = tf.tile(_variable_on_cpu('weight_xxy', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_xyy = tf.tile(_variable_on_cpu('weight_xyy', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_xxz = tf.tile(_variable_on_cpu('weight_xxz', shape, initializer), [batch_size, num_point, K_knn, 1]) + + w_xzz = tf.tile(_variable_on_cpu('weight_xzz', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_yyz = tf.tile(_variable_on_cpu('weight_yyz', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_yzz = tf.tile(_variable_on_cpu('weight_yzz', shape, initializer), [batch_size, num_point, K_knn, 1]) + + + w_xxx = tf.tile(_variable_on_cpu('weight_xxx', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_yyy = tf.tile(_variable_on_cpu('weight_yyy', shape, initializer), [batch_size, num_point, K_knn, 1]) + w_zzz = tf.tile(_variable_on_cpu('weight_zzz', shape, initializer), [batch_size, num_point, K_knn, 1]) + + + g1 = w_x * X + w_y * Y + w_z * Z + w_xyz * X * Y * Z + g2 = w_xy * X * Y + w_yz * Y * Z + w_xz * X * Z + biases + g3 = w_xx * X * X + w_yy * Y * Y + w_zz * Z * Z + g4 = w_xxy * X * X * Y + w_xyy * X * Y * Y + w_xxz * X * X * Z + g5 = w_xzz * X * Z * Z + w_yyz * Y * Y * Z + w_yzz * Y * Z * Z + g6 = w_xxx * X * X * X + w_yyy * Y * Y * Y + w_zzz * Z * Z * Z + g_d = g1 + g2 + g3 + g4 + g5 + g6 + + + grouped_points = tf.expand_dims(grouped_points, -1) + g_d = tf.expand_dims(g_d, 3) + g_d = tf.tile(g_d, [1, 1, 1, in_channels, 1]) + grouped_points = grouped_points * g_d + grouped_points = tf.reshape(grouped_points, [batch_size, num_point, K_knn, in_channels*taylor_channel]) + + feat = conv2d(grouped_points, num_conv, [1,K_knn], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv', bn_decay=bn_decay, + gn=gn, G=G, is_multi_GPU=is_multi_GPU, + activation_fn=activation_fn) + + + feat = tf.squeeze(feat, axis=[2]) + + return feat + +def pc_sampling(xyz, + feat, + nsample, + num_point, + scope='sampling'): + """ Fully connected layer with non-linear operation. + + Args: + xyz: 3-D tensor B x N x 3 + nsample: k + num_point: N2 + feat: 3-D tensor B x N x C + + Returns: + feat_sample: 3-D tensor B x N2 x C + """ + with tf.variable_scope(scope) as sc: + xyz_new = gather_point(xyz, farthest_point_sample(num_point, xyz)) + _, idx_pooling = knn_point(nsample, xyz, xyz_new) + + grouped_points = group_point(feat, idx_pooling) + feat_sample = tf.nn.max_pool(grouped_points, [1,1,nsample,1], [1,1,1,1], + padding='VALID', data_format='NHWC', name="MAX_POOLING") + feat_sample = tf.squeeze(feat_sample, axis=[2]) + + return feat_sample, xyz_new + +def pc_upsampling(xyz_upsample, + xyz, + feat, + scope='upsampling'): + """ Fully connected layer with non-linear operation. + + Args: + xyz_upsample: 3-D tensor B x N2 x 3 + xyz: 3-D tensor B x N x 3 + feat: 3-D tensor B x N x C + + Returns: + feat_upsample: 3-D tensor B x N2 x C + """ + with tf.variable_scope(scope) as sc: + dist, idx_de = three_nn(xyz_upsample, xyz) + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm,[1,1,3]) + weight = (1.0/dist) / norm + feat_upsample = three_interpolate(feat, idx_de, weight) + + return feat_upsample + + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_multi_GPU=False, + gn=False, + G=32): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + if is_multi_GPU: + outputs = batch_norm_template_multiGPU(outputs, is_training, + 'bn', [0,], bn_decay) + else: + outputs = batch_norm_template(outputs, is_training, + 'bn', [0,], bn_decay) + if gn: + outputs = group_norm_for_fc(outputs, G=G, scope='gn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def topk_pool(inputs, + scope, + k = 2): + """ top-k pooling. + + Args: + inputs: 4-D tensor BxHxWxC + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + inputs = tf.transpose(inputs, perm=[0, 2, 1]) + outputs, i_topk = tf.nn.top_k(inputs, k = k, name = sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + + + +def group_norm_for_conv(x, G=32, esp=1e-6, scope='gn'): + with tf.variable_scope(scope) as sc: + # normalize + # tranpose: [bs, h, w, c] to [bs, c, h, w] following the paper + x = tf.transpose(x, [0, 3, 1, 2]) + N, C, H, W = x.get_shape().as_list() + G = min(G, C) + x = tf.reshape(x, [N, G, C // G, H, W]) + mean, var = tf.nn.moments(x, [2, 3, 4], keep_dims=True) + x = (x - mean) / tf.sqrt(var + esp) + # per channel gamma and beta + gamma = tf.get_variable('gamma', [C], + initializer=tf.constant_initializer(1.0)) + beta = tf.get_variable('beta', [C], + initializer=tf.constant_initializer(0.0)) + gamma = tf.reshape(gamma, [1, C, 1, 1]) + beta = tf.reshape(beta, [1, C, 1, 1]) + + output = tf.reshape(x, [N, C, H, W]) * gamma + beta + # tranpose: [bs, c, h, w, c] to [bs, h, w, c] following the paper + output = tf.transpose(output, [0, 2, 3, 1]) + + return output + +def group_norm_for_fc(x, G=32, esp=1e-6, scope='gn'): + with tf.variable_scope(scope) as sc: + # normalize + # tranpose: [bs, h, w, c] to [bs, c, h, w] following the paper + N, C = x.get_shape().as_list() + G = min(G, C) + x = tf.reshape(x, [N, G, C // G]) + mean, var = tf.nn.moments(x, [2], keep_dims=True) + x = (x - mean) / tf.sqrt(var + esp) + # per channel gamma and beta + gamma = tf.get_variable('gamma', [C], + initializer=tf.constant_initializer(1.0)) + beta = tf.get_variable('beta', [C], + initializer=tf.constant_initializer(0.0)) + gamma = tf.reshape(gamma, [1, C]) + beta = tf.reshape(beta, [1, C]) + + output = tf.reshape(x, [N, C]) * gamma + beta + + return output + + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + +def batch_norm_template_multiGPU(inputs, is_training, scope, moments_dims_unused, bn_decay, data_format='NHWC'): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + bn_decay = bn_decay if bn_decay is not None else 0.9 + return tf.contrib.layers.batch_norm(inputs, + center=True, scale=True, + is_training=is_training, decay=bn_decay,updates_collections=None, + scope=scope, + data_format=data_format) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs diff --git a/zoo/SimpleView/ScanObjectNN/data_utils.py b/zoo/SimpleView/ScanObjectNN/data_utils.py new file mode 100644 index 0000000..6c63013 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/data_utils.py @@ -0,0 +1,295 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import numpy as np +import pc_util +import scipy.misc +import string +import pickle +import plyfile +import h5py + +# DATA_PATH = '/media/mikacuy/6TB_HDD/object_dataset_v1_fixed/' + +def save_ply(points, filename, colors=None, normals=None): + vertex = np.core.records.fromarrays(points.transpose(), names='x, y, z', formats='f4, f4, f4') + n = len(vertex) + desc = vertex.dtype.descr + + if normals is not None: + vertex_normal = np.core.records.fromarrays(normals.transpose(), names='nx, ny, nz', formats='f4, f4, f4') + assert len(vertex_normal) == n + desc = desc + vertex_normal.dtype.descr + + if colors is not None: + vertex_color = np.core.records.fromarrays(colors.transpose() * 255, names='red, green, blue', + formats='u1, u1, u1') + assert len(vertex_color) == n + desc = desc + vertex_color.dtype.descr + + vertex_all = np.empty(n, dtype=desc) + + for prop in vertex.dtype.names: + vertex_all[prop] = vertex[prop] + + if normals is not None: + for prop in vertex_normal.dtype.names: + vertex_all[prop] = vertex_normal[prop] + + if colors is not None: + for prop in vertex_color.dtype.names: + vertex_all[prop] = vertex_color[prop] + + ply = plyfile.PlyData([plyfile.PlyElement.describe(vertex_all, 'vertex')], text=False) + #if not os.path.exists(os.path.dirname(filename)): + # os.makedirs(os.path.dirname(filename)) + ply.write(filename) + +def load_pc_file(filename, suncg = False, with_bg = True): + #load bin file + # pc=np.fromfile(filename, dtype=np.float32) + pc=np.fromfile(os.path.join(DATA_PATH, filename), dtype=np.float32) + + #first entry is the number of points + #then x, y, z, nx, ny, nz, r, g, b, label, nyu_label + if(suncg): + pc = pc[1:].reshape((-1,3)) + else: + pc = pc[1:].reshape((-1,11)) + + #only use x, y, z for now + if with_bg: + pc = np.array(pc[:,0:3]) + return pc + + else: + ##To remove backgorund points + ##filter unwanted class + filtered_idx = np.intersect1d(np.intersect1d(np.where(pc[:,-1]!=0)[0],np.where(pc[:,-1]!=1)[0]), np.where(pc[:,-1]!=2)[0]) + (values, counts) = np.unique(pc[filtered_idx,-1], return_counts=True) + max_ind = np.argmax(counts) + idx = np.where(pc[:,-1]==values[max_ind])[0] + pc = np.array(pc[idx,0:3]) + return pc + +def load_data(filename, num_points=1024, suncg_pl = False, with_bg_pl = True): + with open(filename, 'rb') as handle: + data = pickle.load(handle) + print("Data loaded.") + + pcs = [] + labels = [] + + print("With BG: "+str(with_bg_pl)) + for i in range(len(data)): + entry = data[i] + filename = entry["filename"].replace('objects_bin/','') + pc = load_pc_file(filename, suncg = suncg_pl, with_bg = with_bg_pl) + label = entry['label'] + + if (pc.shape[0] THRESH,:] + output.append(pc) + + if (pc.shape[0]<1024): + print("Few points") + + return output + +def collect_points(pc): + if (pc.shape[0]>=NUM_POINT): + return pc[:NUM_POINT,:] + else: + # print(pc.shape) + # print(pc[0:NUM_POINT-pc.shape[0],:].shape) + # print(np.concatenate((np.array(pc), np.array(pc[0:NUM_POINT-pc.shape[0],:])), axis=0).shape) + # exit() + return np.concatenate((np.array(pc), np.array(pc[0:NUM_POINT-pc.shape[0],:])), axis=0) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points, num_class=NUM_CLASSES) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/evaluate_seg_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/dgcnn/evaluate_seg_scenennobjects.py new file mode 100644 index 0000000..8490034 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/evaluate_seg_scenennobjects.py @@ -0,0 +1,334 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import json + + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='dgcnn_bga', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +##use all 2048 for visualization +# parser.add_argument('--num_point', type=int, default=2048, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--model_path', default='BGA_DGCNN/log_objectdataset_seg2/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--visu_mask', default = False, help='Whether to dump mask [default: False]') +FLAGS = parser.parse_args() + + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(10) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +color_map_file = '../part_color_mapping.json' +color_map = json.load(open(color_map_file, 'r')) +def output_color_point_cloud(data, seg, out_file): + with open(out_file, 'w') as f: + l = len(seg) + for i in range(l): + color = color_map[int(seg[i])] + f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) + +def save_binfiles(pc, parts, fname): + print(pc.shape) + num_vertices = pc.shape[0] + print(num_vertices) + pc = pc.flatten() + + object_bin = [] + object_bin.append(num_vertices) + + for i in range(pc.shape[0]): + object_bin.append(pc[i]) + if i%3==2: + ##insert dummy colors, normal nyu and label + for j in range(8): + object_bin.append(1.0) + + # object_bin.append(parts[int((i-2)/3)]) + + object_bin = np.array(object_bin) + print(object_bin.shape) + + object_bin.astype('float32').tofile(fname+'.bin') + # exit() + + ##output parts_bin + parts_bin = [] + parts_bin.append(num_vertices) + for i in range(parts.shape[0]): + parts_bin.append(parts[i]) + parts_bin.append(parts[i]) + + parts_bin = np.array(parts_bin) + print(parts_bin.shape) + parts_bin.astype('float32').tofile(fname+'_part.bin') + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, masks_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + class_pred, seg_pred = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + total_loss, classify_loss, seg_loss = MODEL.get_loss(class_pred, seg_pred, labels_pl, masks_pl, seg_weight=SEG_WEIGHT) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': class_pred, + 'seg_pred': seg_pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + total_correct_seg = 0 + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_seg_sum = np.zeros((cur_batch_size, NUM_POINT, 2)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val, seg_val = sess.run([ops['loss'], ops['pred'],ops['seg_pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_seg_sum += seg_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + seg_val = np.argmax(batch_seg_sum, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + current_pred.append(pred_val[i-start_idx]) + + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + gt_mask = current_mask[i] + pred_mask = seg_val[i-start_idx] + + pred_mask_idx = np.where(pred_mask==1)[0] + gt_mask_idx = np.where(gt_mask==1)[0] + correct_obj_mask = np.where((pred_mask==gt_mask) & (pred_mask==1))[0] + + if (len(correct_obj_mask)==1): + continue + + if (FLAGS.visu_mask and pred_val[i-start_idx] != l): + # fname = str(start_idx)+'_gt' + # fname = os.path.join(DUMP_DIR, fname) + # save_binfiles(current_data[start_idx,:,:], gt_mask,fname) + + # fname = str(start_idx)+'_pred' + # fname = os.path.join(DUMP_DIR, fname) + # save_binfiles(current_data[start_idx,:,:], pred_mask,fname) + + fname = str(start_idx)+'_pred.obj' + fname = os.path.join(DUMP_DIR, fname) + output_color_point_cloud(current_data[start_idx,:,:], pred_mask,fname) + + fname = str(start_idx)+'_gt.obj' + fname = os.path.join(DUMP_DIR, fname) + output_color_point_cloud(current_data[start_idx,:,:], gt_mask,fname) + + ###1) + img_filename = '%d_label_%s_pred_%s_gtmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, gt_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + # #save ply + # ply_filename = '%d_label_%s_pred_%s_gtmask.ply' % (i, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, gt_mask_idx, :]),ply_filename) + + ###2) + img_filename = '%d_label_%s_pred_%s_predmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, pred_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + # #save ply + # ply_filename = '%d_label_%s_pred_%s_predmask.ply' % (i, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, pred_mask_idx, :]),ply_filename) + + ###3) + img_filename = '%d_label_%s_pred_%s_correctpredmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, correct_obj_mask, :])) + scipy.misc.imsave(img_filename, output_img) + + # #save ply + # ply_filename = '%d_label_%s_pred_%s_correctpredmask.ply' % (i, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, correct_obj_mask, :]),ply_filename) + + # if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + # img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # img_filename = os.path.join(DUMP_DIR, img_filename) + # output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + # scipy.misc.imsave(img_filename, output_img) + # #save ply + # ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + # error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/evaluate_synthetic_trained_on_real.py b/zoo/SimpleView/ScanObjectNN/dgcnn/evaluate_synthetic_trained_on_real.py new file mode 100644 index 0000000..6f68563 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/evaluate_synthetic_trained_on_real.py @@ -0,0 +1,227 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='dgcnn', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_synthetic_trained_on_real/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'modelnet/modelnet_test.h5', help='Location of test file') + +FLAGS = parser.parse_args() + + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + + +np.random.seed(0) +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points, num_class=NUM_CLASSES) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in MODELNET_TO_OBJECTDATASET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen += 1 + if (pred_val[i-start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (current_label[i] in possible_label): + total_correct +=1 + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + if (pred_val[i-start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (l in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + + pred_label = SHAPE_NAMES[pred_val[i-start_idx]] + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/models/dgcnn.py b/zoo/SimpleView/ScanObjectNN/dgcnn/models/dgcnn.py new file mode 100644 index 0000000..460e1a8 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/models/dgcnn.py @@ -0,0 +1,154 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append(os.path.join(BASE_DIR, '../../utils')) +import tf_util +from transform_nets import input_transform_net + +# NUM_CLASSES = 20 +# NUM_CLASSES = 10 +NUM_CLASSES = 15 +# NUM_CLASSES = 40 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None, num_class=NUM_CLASSES): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + k = 20 + + adj_matrix = tf_util.pairwise_distance(point_cloud) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(point_cloud, nn_idx=nn_idx, k=k) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(edge_feature, is_training, bn_decay, K=3) + + point_cloud_transformed = tf.matmul(point_cloud, transform) + adj_matrix = tf_util.pairwise_distance(point_cloud_transformed) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(point_cloud_transformed, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn1', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net1 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn2', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net2 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn3', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net3 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn4', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net4 = net + + net = tf_util.conv2d(tf.concat([net1, net2, net3, net4], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='agg', bn_decay=bn_decay) + + net = tf.reduce_max(net, axis=1, keep_dims=True) + + # MLP on global point cloud vector + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, + scope='dp2') + net = tf_util.fully_connected(net, num_class, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points, num_class=NUM_CLASSES): + """ pred: B*NUM_CLASSES, + label: B, """ + labels = tf.one_hot(indices=label, depth=num_class) + loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=pred, label_smoothing=0.2) + classify_loss = tf.reduce_mean(loss) + return classify_loss + + +if __name__=='__main__': + batch_size = 2 + num_pt = 124 + pos_dim = 3 + + input_feed = np.random.rand(batch_size, num_pt, pos_dim) + label_feed = np.random.rand(batch_size) + label_feed[label_feed>=0.5] = 1 + label_feed[label_feed<0.5] = 0 + label_feed = label_feed.astype(np.int32) + + # # np.save('./debug/input_feed.npy', input_feed) + # input_feed = np.load('./debug/input_feed.npy') + # print input_feed + + with tf.Graph().as_default(): + input_pl, label_pl = placeholder_inputs(batch_size, num_pt) + pos, ftr = get_model(input_pl, tf.constant(True)) + # loss = get_loss(logits, label_pl, None) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + feed_dict = {input_pl: input_feed, label_pl: label_feed} + res1, res2 = sess.run([pos, ftr], feed_dict=feed_dict) + print (res1.shape) + print (res1) + + print (res2.shape) + print (res2) + + + + + + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/models/dgcnn_bga.py b/zoo/SimpleView/ScanObjectNN/dgcnn/models/dgcnn_bga.py new file mode 100644 index 0000000..3c15632 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/models/dgcnn_bga.py @@ -0,0 +1,164 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append(os.path.join(BASE_DIR, '../../utils')) +import tf_util +from transform_nets import input_transform_net + +# NUM_CLASSES = 20 +# NUM_CLASSES = 10 +# NUM_CLASSES = 15 +# NUM_CLASSES = 40 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, + shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + mask_pl = tf.placeholder(tf.int32, + shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, mask_pl + + +def get_model(point_cloud, is_training, bn_decay=None, num_class=NUM_CLASSES): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + k = 20 + + adj_matrix = tf_util.pairwise_distance(point_cloud) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(point_cloud, nn_idx=nn_idx, k=k) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(edge_feature, is_training, bn_decay, K=3) + + point_cloud_transformed = tf.matmul(point_cloud, transform) + adj_matrix = tf_util.pairwise_distance(point_cloud_transformed) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(point_cloud_transformed, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn1', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net1 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn2', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net2 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn3', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net3 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn4', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net4 = net + + net = tf_util.conv2d(tf.concat([net1, net2, net3, net4], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='agg', bn_decay=bn_decay) + + #For segmentation branch + out_max = tf_util.max_pool2d(net, [num_point,1], padding='VALID', scope='maxpool') + print("Out Max") + print(out_max.shape) + expand = tf.tile(out_max, [1, num_point, 1, 1]) + print("Out Max expanded") + print(expand.shape) + + net = tf.reduce_max(net, axis=1, keep_dims=True) + + ## CLASSIFICATION BRANCH + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + + class_vector = tf.expand_dims(net, axis = 1) + class_vector = tf.expand_dims(class_vector, axis = 1) + + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, + scope='dp2') + class_pred = tf_util.fully_connected(net, num_class, activation_fn=None, scope='fc3') + + ## SEGMENTATION BRANCH + print("Class Vector") + print(class_vector.shape) + # exit() + + class_vector_expanded = tf.tile(class_vector, [1, num_point, 1, 1]) + + concat = tf.concat([class_vector_expanded, expand, net1, net2, net3, net4], axis=-1) + net = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], + bn=True, is_training=is_training, scope='seg/conv1', is_dist=True) + net = tf_util.conv2d(net, 256, [1,1], padding='VALID', stride=[1,1], + bn=True, is_training=is_training, scope='seg/conv2', is_dist=True) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, scope='dp1') + net = tf_util.conv2d(net, 2, [1,1], padding='VALID', stride=[1,1], + activation_fn=None, scope='seg/conv3', is_dist=True) + seg_pred = tf.squeeze(net, [2]) + + return class_pred, seg_pred + + +def get_loss(class_pred, seg_pred, gt_label, gt_mask, seg_weight = 0.5): + """ pred: BxNxC, + label: BxN, """ + batch_size = gt_mask.shape[0] + num_point = gt_mask.shape[1] + + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_pred, labels=gt_label) + classify_loss = tf.reduce_mean(loss) + + #mask loss + ###convert mask to binary mask + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_mask), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + total_loss = (1-seg_weight)*classify_loss + seg_weight*seg_loss + + return total_loss, classify_loss, seg_loss + + + + + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/models/transform_nets.py b/zoo/SimpleView/ScanObjectNN/dgcnn/models/transform_nets.py new file mode 100644 index 0000000..b4ef59e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/models/transform_nets.py @@ -0,0 +1,56 @@ +import tensorflow as tf +import numpy as np +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def input_transform_net(edge_feature, is_training, bn_decay=None, K=3, is_dist=False): + """ Input (XYZ) Transform Net, input is BxNx3 gray image + Return: + Transformation matrix of size 3xK """ + batch_size = edge_feature.get_shape()[0].value + num_point = edge_feature.get_shape()[1].value + + # input_image = tf.expand_dims(point_cloud, -1) + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay, is_dist=is_dist) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay, is_dist=is_dist) + + net = tf.reduce_max(net, axis=-2, keep_dims=True) + + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay, is_dist=is_dist) + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay,is_dist=is_dist) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay,is_dist=is_dist) + + with tf.variable_scope('transform_XYZ') as sc: + # assert(K==3) + with tf.device('/cpu:0'): + weights = tf.get_variable('weights', [256, K*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [K*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant(np.eye(K).flatten(), dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, K, K]) + return transform \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/provider.py b/zoo/SimpleView/ScanObjectNN/dgcnn/provider.py new file mode 100644 index 0000000..028d643 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/provider.py @@ -0,0 +1,158 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) + +# # Download dataset for point cloud classification +# DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +# if not os.path.exists(DATA_DIR): +# os.mkdir(DATA_DIR) +# if not os.path.exists(os.path.join(DATA_DIR, 'data/modelnet40_ply_hdf5_2048')): +# www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' +# zipfile = os.path.basename(www) +# os.system('wget %s; unzip %s' % (www, zipfile)) +# os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) +# os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(os.path.join(DATA_DIR,filename)) + + +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] # (2048, 2048, 3) + label = f['label'][:] # (2048, 1) + seg = f['pid'][:] # (2048, 2048) + return (data, label, seg) diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/train.py b/zoo/SimpleView/ScanObjectNN/dgcnn/train.py new file mode 100644 index 0000000..e3ba8c3 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/train.py @@ -0,0 +1,376 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='dgcnn', help='Model name: dgcnn') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = FLAGS.num_class + +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) +else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points, num_class=NUM_CLASSES) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + #merged = tf.merge_all_summaries() + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + #Shuffle data + # data_utils.shuffle_points(TRAIN_DATA) + + #get current data, shuffle and set to numpy array with desired num_point + # current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + if (".h5" in TRAIN_FILE): + current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + # # Shuffle train files + # train_file_idxs = np.arange(0, len(TRAIN_FILES)) + # np.random.shuffle(train_file_idxs) + + # for fn in range(len(TRAIN_FILES)): + # log_string('----' + str(fn) + '-----') + # current_data, current_label = provider.loadDataFile(TRAIN_FILES[train_file_idxs[fn]]) + # current_data = current_data[:,0:NUM_POINT,:] + # current_data, current_label, _ = provider.shuffle_data(current_data, np.squeeze(current_label)) + # current_label = np.squeeze(current_label) + + # file_size = current_data.shape[0] + # num_batches = file_size // BATCH_SIZE + + # total_correct = 0 + # total_seen = 0 + # loss_sum = 0 + + # for batch_idx in range(num_batches): + # start_idx = batch_idx * BATCH_SIZE + # end_idx = (batch_idx+1) * BATCH_SIZE + + # # Augment batched point clouds by rotation and jittering + # rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + # jittered_data = provider.jitter_point_cloud(rotated_data) + # jittered_data = provider.random_scale_point_cloud(jittered_data) + # jittered_data = provider.rotate_perturbation_point_cloud(jittered_data) + # jittered_data = provider.shift_point_cloud(jittered_data) + + # feed_dict = {ops['pointclouds_pl']: jittered_data, + # ops['labels_pl']: current_label[start_idx:end_idx], + # ops['is_training_pl']: is_training,} + # summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + # ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + # train_writer.add_summary(summary, step) + # pred_val = np.argmax(pred_val, 1) + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # total_correct += correct + # total_seen += BATCH_SIZE + # loss_sum += loss_val + + # log_string('mean loss: %f' % (loss_sum / float(num_batches))) + # log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # data_utils.shuffle_points(TEST_DATA) + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + # for fn in range(len(TEST_FILES)): + # log_string('----' + str(fn) + '-----') + # current_data, current_label = provider.loadDataFile(TEST_FILES[fn]) + # current_data = current_data[:,0:NUM_POINT,:] + # current_label = np.squeeze(current_label) + + # file_size = current_data.shape[0] + # num_batches = file_size // BATCH_SIZE + + # for batch_idx in range(num_batches): + # start_idx = batch_idx * BATCH_SIZE + # end_idx = (batch_idx+1) * BATCH_SIZE + + # feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + # ops['labels_pl']: current_label[start_idx:end_idx], + # ops['is_training_pl']: is_training} + # summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + # ops['loss'], ops['pred']], feed_dict=feed_dict) + # pred_val = np.argmax(pred_val, 1) + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # total_correct += correct + # total_seen += BATCH_SIZE + # loss_sum += (loss_val*BATCH_SIZE) + # for i in range(start_idx, end_idx): + # l = current_label[i] + # total_seen_class[l] += 1 + # total_correct_class[l] += (pred_val[i-start_idx] == l) + + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + # log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + # log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/train_seg.py b/zoo/SimpleView/ScanObjectNN/dgcnn/train_seg.py new file mode 100644 index 0000000..1e0b2f5 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/train_seg.py @@ -0,0 +1,319 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='dgcnn_bga', help='Model name: dgcnn') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of test file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = FLAGS.num_class + +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS = data_utils.load_withmask_h5(TRAIN_FILE) +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TRAIN_MASKS = data_utils.convert_to_binary_mask(TRAIN_MASKS) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, masks_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + class_pred, seg_pred = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, num_class=NUM_CLASSES) + total_loss, classify_loss, seg_loss = MODEL.get_loss(class_pred, seg_pred, labels_pl, masks_pl, seg_weight=SEG_WEIGHT) + + tf.summary.scalar('total_loss', total_loss) + tf.summary.scalar('classify_loss', classify_loss) + tf.summary.scalar('seg_loss', seg_loss) + + correct = tf.equal(tf.argmax(class_pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + seg_correct = tf.equal(tf.argmax(seg_pred, 2), tf.to_int64(masks_pl)) + seg_accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / (float(BATCH_SIZE)*NUM_POINT) + tf.summary.scalar('seg_accuracy', seg_accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': class_pred, + 'seg_pred': seg_pred, + 'loss': total_loss, + 'classify_loss': classify_loss, + 'seg_loss': seg_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + classify_loss_sum += classify_loss + seg_loss_sum += seg_loss + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('classify mean loss: %f' % (classify_loss_sum / float(num_batches))) + log_string('seg mean loss: %f' % (seg_loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + total_correct_seg = 0 + + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + classify_loss_sum += classify_loss*BATCH_SIZE + seg_loss_sum += seg_loss*BATCH_SIZE + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/utils/data_prep_util.py b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/data_prep_util.py new file mode 100644 index 0000000..53d32f1 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/data_prep_util.py @@ -0,0 +1,145 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +from plyfile import (PlyData, PlyElement, make2d, PlyParseError, PlyProperty) +import numpy as np +import h5py + +SAMPLING_BIN = os.path.join(BASE_DIR, 'third_party/mesh_sampling/build/pcsample') + +SAMPLING_POINT_NUM = 2048 +SAMPLING_LEAF_SIZE = 0.005 + +MODELNET40_PATH = '../datasets/modelnet40' +def export_ply(pc, filename): + vertex = np.zeros(pc.shape[0], dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')]) + for i in range(pc.shape[0]): + vertex[i] = (pc[i][0], pc[i][1], pc[i][2]) + ply_out = PlyData([PlyElement.describe(vertex, 'vertex', comments=['vertices'])]) + ply_out.write(filename) + +# Sample points on the obj shape +def get_sampling_command(obj_filename, ply_filename): + cmd = SAMPLING_BIN + ' ' + obj_filename + cmd += ' ' + ply_filename + cmd += ' -n_samples %d ' % SAMPLING_POINT_NUM + cmd += ' -leaf_size %f ' % SAMPLING_LEAF_SIZE + return cmd + +# -------------------------------------------------------------- +# Following are the helper functions to load MODELNET40 shapes +# -------------------------------------------------------------- + +# Read in the list of categories in MODELNET40 +def get_category_names(): + shape_names_file = os.path.join(MODELNET40_PATH, 'shape_names.txt') + shape_names = [line.rstrip() for line in open(shape_names_file)] + return shape_names + +# Return all the filepaths for the shapes in MODELNET40 +def get_obj_filenames(): + obj_filelist_file = os.path.join(MODELNET40_PATH, 'filelist.txt') + obj_filenames = [os.path.join(MODELNET40_PATH, line.rstrip()) for line in open(obj_filelist_file)] + print('Got %d obj files in modelnet40.' % len(obj_filenames)) + return obj_filenames + +# Helper function to create the father folder and all subdir folders if not exist +def batch_mkdir(output_folder, subdir_list): + if not os.path.exists(output_folder): + os.mkdir(output_folder) + for subdir in subdir_list: + if not os.path.exists(os.path.join(output_folder, subdir)): + os.mkdir(os.path.join(output_folder, subdir)) + +# ---------------------------------------------------------------- +# Following are the helper functions to load save/load HDF5 files +# ---------------------------------------------------------------- + +# Write numpy array data and label to h5_filename +def save_h5_data_label_normal(h5_filename, data, label, normal, + data_dtype='float32', label_dtype='uint8', noral_dtype='float32'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + 'data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + 'normal', data=normal, + compression='gzip', compression_opts=4, + dtype=normal_dtype) + h5_fout.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + + +# Write numpy array data and label to h5_filename +def save_h5(h5_filename, data, label, data_dtype='uint8', label_dtype='uint8'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + 'data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + +# Read numpy array data and label from h5_filename +def load_h5_data_label_normal(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + normal = f['normal'][:] + return (data, label, normal) + +# Read numpy array data and label from h5_filename +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) + +# Read numpy array data and label from h5_filename +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +# ---------------------------------------------------------------- +# Following are the helper functions to load save/load PLY files +# ---------------------------------------------------------------- + +# Load PLY file +def load_ply_data(filename, point_num): + plydata = PlyData.read(filename) + pc = plydata['vertex'].data[:point_num] + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + +# Load PLY file +def load_ply_normal(filename, point_num): + plydata = PlyData.read(filename) + pc = plydata['normal'].data[:point_num] + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + +# Make up rows for Nxk array +# Input Pad is 'edge' or 'constant' +def pad_arr_rows(arr, row, pad='edge'): + assert(len(arr.shape) == 2) + assert(arr.shape[0] <= row) + assert(pad == 'edge' or pad == 'constant') + if arr.shape[0] == row: + return arr + if pad == 'edge': + return np.lib.pad(arr, ((0, row-arr.shape[0]), (0, 0)), 'edge') + if pad == 'constant': + return np.lib.pad(arr, ((0, row-arr.shape[0]), (0, 0)), 'constant', (0, 0)) + + diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/utils/eulerangles.py b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/eulerangles.py new file mode 100644 index 0000000..87bd605 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/eulerangles.py @@ -0,0 +1,418 @@ +# emacs: -*- mode: python-mode; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the NiBabel package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +''' Module implementing Euler angle rotations and their conversions + +See: + +* http://en.wikipedia.org/wiki/Rotation_matrix +* http://en.wikipedia.org/wiki/Euler_angles +* http://mathworld.wolfram.com/EulerAngles.html + +See also: *Representing Attitude with Euler Angles and Quaternions: A +Reference* (2006) by James Diebel. A cached PDF link last found here: + +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.110.5134 + +Euler's rotation theorem tells us that any rotation in 3D can be +described by 3 angles. Let's call the 3 angles the *Euler angle vector* +and call the angles in the vector :math:`alpha`, :math:`beta` and +:math:`gamma`. The vector is [ :math:`alpha`, +:math:`beta`. :math:`gamma` ] and, in this description, the order of the +parameters specifies the order in which the rotations occur (so the +rotation corresponding to :math:`alpha` is applied first). + +In order to specify the meaning of an *Euler angle vector* we need to +specify the axes around which each of the rotations corresponding to +:math:`alpha`, :math:`beta` and :math:`gamma` will occur. + +There are therefore three axes for the rotations :math:`alpha`, +:math:`beta` and :math:`gamma`; let's call them :math:`i` :math:`j`, +:math:`k`. + +Let us express the rotation :math:`alpha` around axis `i` as a 3 by 3 +rotation matrix `A`. Similarly :math:`beta` around `j` becomes 3 x 3 +matrix `B` and :math:`gamma` around `k` becomes matrix `G`. Then the +whole rotation expressed by the Euler angle vector [ :math:`alpha`, +:math:`beta`. :math:`gamma` ], `R` is given by:: + + R = np.dot(G, np.dot(B, A)) + +See http://mathworld.wolfram.com/EulerAngles.html + +The order :math:`G B A` expresses the fact that the rotations are +performed in the order of the vector (:math:`alpha` around axis `i` = +`A` first). + +To convert a given Euler angle vector to a meaningful rotation, and a +rotation matrix, we need to define: + +* the axes `i`, `j`, `k` +* whether a rotation matrix should be applied on the left of a vector to + be transformed (vectors are column vectors) or on the right (vectors + are row vectors). +* whether the rotations move the axes as they are applied (intrinsic + rotations) - compared the situation where the axes stay fixed and the + vectors move within the axis frame (extrinsic) +* the handedness of the coordinate system + +See: http://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities + +We are using the following conventions: + +* axes `i`, `j`, `k` are the `z`, `y`, and `x` axes respectively. Thus + an Euler angle vector [ :math:`alpha`, :math:`beta`. :math:`gamma` ] + in our convention implies a :math:`alpha` radian rotation around the + `z` axis, followed by a :math:`beta` rotation around the `y` axis, + followed by a :math:`gamma` rotation around the `x` axis. +* the rotation matrix applies on the left, to column vectors on the + right, so if `R` is the rotation matrix, and `v` is a 3 x N matrix + with N column vectors, the transformed vector set `vdash` is given by + ``vdash = np.dot(R, v)``. +* extrinsic rotations - the axes are fixed, and do not move with the + rotations. +* a right-handed coordinate system + +The convention of rotation around ``z``, followed by rotation around +``y``, followed by rotation around ``x``, is known (confusingly) as +"xyz", pitch-roll-yaw, Cardan angles, or Tait-Bryan angles. +''' + +import math + +import sys +if sys.version_info >= (3,0): + from functools import reduce + +import numpy as np + + +_FLOAT_EPS_4 = np.finfo(float).eps * 4.0 + + +def euler2mat(z=0, y=0, x=0): + ''' Return matrix for rotations around z, y and x axes + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + M : array shape (3,3) + Rotation matrix giving same rotation as for given angles + + Examples + -------- + >>> zrot = 1.3 # radians + >>> yrot = -0.1 + >>> xrot = 0.2 + >>> M = euler2mat(zrot, yrot, xrot) + >>> M.shape == (3, 3) + True + + The output rotation matrix is equal to the composition of the + individual rotations + + >>> M1 = euler2mat(zrot) + >>> M2 = euler2mat(0, yrot) + >>> M3 = euler2mat(0, 0, xrot) + >>> composed_M = np.dot(M3, np.dot(M2, M1)) + >>> np.allclose(M, composed_M) + True + + You can specify rotations by named arguments + + >>> np.all(M3 == euler2mat(x=xrot)) + True + + When applying M to a vector, the vector should column vector to the + right of M. If the right hand side is a 2D array rather than a + vector, then each column of the 2D array represents a vector. + + >>> vec = np.array([1, 0, 0]).reshape((3,1)) + >>> v2 = np.dot(M, vec) + >>> vecs = np.array([[1, 0, 0],[0, 1, 0]]).T # giving 3x2 array + >>> vecs2 = np.dot(M, vecs) + + Rotations are counter-clockwise. + + >>> zred = np.dot(euler2mat(z=np.pi/2), np.eye(3)) + >>> np.allclose(zred, [[0, -1, 0],[1, 0, 0], [0, 0, 1]]) + True + >>> yred = np.dot(euler2mat(y=np.pi/2), np.eye(3)) + >>> np.allclose(yred, [[0, 0, 1],[0, 1, 0], [-1, 0, 0]]) + True + >>> xred = np.dot(euler2mat(x=np.pi/2), np.eye(3)) + >>> np.allclose(xred, [[1, 0, 0],[0, 0, -1], [0, 1, 0]]) + True + + Notes + ----- + The direction of rotation is given by the right-hand rule (orient + the thumb of the right hand along the axis around which the rotation + occurs, with the end of the thumb at the positive end of the axis; + curl your fingers; the direction your fingers curl is the direction + of rotation). Therefore, the rotations are counterclockwise if + looking along the axis of rotation from positive to negative. + ''' + Ms = [] + if z: + cosz = math.cos(z) + sinz = math.sin(z) + Ms.append(np.array( + [[cosz, -sinz, 0], + [sinz, cosz, 0], + [0, 0, 1]])) + if y: + cosy = math.cos(y) + siny = math.sin(y) + Ms.append(np.array( + [[cosy, 0, siny], + [0, 1, 0], + [-siny, 0, cosy]])) + if x: + cosx = math.cos(x) + sinx = math.sin(x) + Ms.append(np.array( + [[1, 0, 0], + [0, cosx, -sinx], + [0, sinx, cosx]])) + if Ms: + return reduce(np.dot, Ms[::-1]) + return np.eye(3) + + +def mat2euler(M, cy_thresh=None): + ''' Discover Euler angle vector from 3x3 matrix + + Uses the conventions above. + + Parameters + ---------- + M : array-like, shape (3,3) + cy_thresh : None or scalar, optional + threshold below which to give up on straightforward arctan for + estimating x rotation. If None (default), estimate from + precision of input. + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Notes + ----- + If there was no numerical error, the routine could be derived using + Sympy expression for z then y then x rotation matrix, which is:: + + [ cos(y)*cos(z), -cos(y)*sin(z), sin(y)], + [cos(x)*sin(z) + cos(z)*sin(x)*sin(y), cos(x)*cos(z) - sin(x)*sin(y)*sin(z), -cos(y)*sin(x)], + [sin(x)*sin(z) - cos(x)*cos(z)*sin(y), cos(z)*sin(x) + cos(x)*sin(y)*sin(z), cos(x)*cos(y)] + + with the obvious derivations for z, y, and x + + z = atan2(-r12, r11) + y = asin(r13) + x = atan2(-r23, r33) + + Problems arise when cos(y) is close to zero, because both of:: + + z = atan2(cos(y)*sin(z), cos(y)*cos(z)) + x = atan2(cos(y)*sin(x), cos(x)*cos(y)) + + will be close to atan2(0, 0), and highly unstable. + + The ``cy`` fix for numerical instability below is from: *Graphics + Gems IV*, Paul Heckbert (editor), Academic Press, 1994, ISBN: + 0123361559. Specifically it comes from EulerAngles.c by Ken + Shoemake, and deals with the case where cos(y) is close to zero: + + See: http://www.graphicsgems.org/ + + The code appears to be licensed (from the website) as "can be used + without restrictions". + ''' + M = np.asarray(M) + if cy_thresh is None: + try: + cy_thresh = np.finfo(M.dtype).eps * 4 + except ValueError: + cy_thresh = _FLOAT_EPS_4 + r11, r12, r13, r21, r22, r23, r31, r32, r33 = M.flat + # cy: sqrt((cos(y)*cos(z))**2 + (cos(x)*cos(y))**2) + cy = math.sqrt(r33*r33 + r23*r23) + if cy > cy_thresh: # cos(y) not close to zero, standard form + z = math.atan2(-r12, r11) # atan2(cos(y)*sin(z), cos(y)*cos(z)) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = math.atan2(-r23, r33) # atan2(cos(y)*sin(x), cos(x)*cos(y)) + else: # cos(y) (close to) zero, so x -> 0.0 (see above) + # so r21 -> sin(z), r22 -> cos(z) and + z = math.atan2(r21, r22) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = 0.0 + return z, y, x + + +def euler2quat(z=0, y=0, x=0): + ''' Return quaternion corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + quat : array shape (4,) + Quaternion in w, x, y z (real, then vector) format + + Notes + ----- + We can derive this formula in Sympy using: + + 1. Formula giving quaternion corresponding to rotation of theta radians + about arbitrary axis: + http://mathworld.wolfram.com/EulerParameters.html + 2. Generated formulae from 1.) for quaternions corresponding to + theta radians rotations about ``x, y, z`` axes + 3. Apply quaternion multiplication formula - + http://en.wikipedia.org/wiki/Quaternions#Hamilton_product - to + formulae from 2.) to give formula for combined rotations. + ''' + z = z/2.0 + y = y/2.0 + x = x/2.0 + cz = math.cos(z) + sz = math.sin(z) + cy = math.cos(y) + sy = math.sin(y) + cx = math.cos(x) + sx = math.sin(x) + return np.array([ + cx*cy*cz - sx*sy*sz, + cx*sy*sz + cy*cz*sx, + cx*cz*sy - sx*cy*sz, + cx*cy*sz + sx*cz*sy]) + + +def quat2euler(q): + ''' Return Euler angles corresponding to quaternion `q` + + Parameters + ---------- + q : 4 element sequence + w, x, y, z of quaternion + + Returns + ------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``quat2mat`` and ``mat2euler`` functions, but + the reduction in computation is small, and the code repetition is + large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return mat2euler(nq.quat2mat(q)) + + +def euler2angle_axis(z=0, y=0, x=0): + ''' Return angle, axis corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + theta : scalar + angle of rotation + vector : array shape (3,) + axis around which rotation occurs + + Examples + -------- + >>> theta, vec = euler2angle_axis(0, 1.5, 0) + >>> print(theta) + 1.5 + >>> np.allclose(vec, [0, 1, 0]) + True + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return nq.quat2angle_axis(euler2quat(z, y, x)) + + +def angle_axis2euler(theta, vector, is_normalized=False): + ''' Convert angle, axis pair to Euler angles + + Parameters + ---------- + theta : scalar + angle of rotation + vector : 3 element sequence + vector specifying axis for rotation. + is_normalized : bool, optional + True if vector is already normalized (has norm of 1). Default + False + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Examples + -------- + >>> z, y, x = angle_axis2euler(0, [1, 0, 0]) + >>> np.allclose((z, y, x), 0) + True + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``angle_axis2mat`` and ``mat2euler`` + functions, but the reduction in computation is small, and the code + repetition is large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + M = nq.angle_axis2mat(theta, vector, is_normalized) + return mat2euler(M) diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/utils/pc_util.py b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/pc_util.py new file mode 100644 index 0000000..4913231 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/pc_util.py @@ -0,0 +1,198 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +# ---------------------------------------- +# Point cloud IO +# ---------------------------------------- + +def read_ply(filename): + """ read XYZ point cloud from filename PLY file """ + plydata = PlyData.read(filename) + pc = plydata['vertex'].data + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + + +def write_ply(points, filename, text=True): + """ input: Nx3, write points to filename as PLY format. """ + points = [(points[i,0], points[i,1], points[i,2]) for i in range(points.shape[0])] + vertex = np.array(points, dtype=[('x', 'f4'), ('y', 'f4'),('z', 'f4')]) + el = PlyElement.describe(vertex, 'vertex', comments=['vertices']) + PlyData([el], text=text).write(filename) + + +# ---------------------------------------- +# Simple Point cloud and Volume Renderers +# ---------------------------------------- + +def draw_point_cloud(input_points, canvasSize=500, space=200, diameter=25, + xrot=0, yrot=0, zrot=0, switch_xyz=[0,1,2], normalize=True): + """ Render point cloud to image with alpha channel. + Input: + points: Nx3 numpy array (+y is up direction) + Output: + gray image as numpy array of size canvasSizexcanvasSize + """ + image = np.zeros((canvasSize, canvasSize)) + if input_points is None or input_points.shape[0] == 0: + return image + + points = input_points[:, switch_xyz] + M = euler2mat(zrot, yrot, xrot) + points = (np.dot(M, points.transpose())).transpose() + + # Normalize the point cloud + # We normalize scale to fit points in a unit sphere + if normalize: + centroid = np.mean(points, axis=0) + points -= centroid + furthest_distance = np.max(np.sqrt(np.sum(abs(points)**2,axis=-1))) + points /= furthest_distance + + # Pre-compute the Gaussian disk + radius = (diameter-1)/2.0 + disk = np.zeros((diameter, diameter)) + for i in range(diameter): + for j in range(diameter): + if (i - radius) * (i-radius) + (j-radius) * (j-radius) <= radius * radius: + disk[i, j] = np.exp((-(i-radius)**2 - (j-radius)**2)/(radius**2)) + mask = np.argwhere(disk > 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +from PIL import Image +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +import matplotlib.pyplot as plt +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/utils/plyfile.py b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/plyfile.py new file mode 100644 index 0000000..69c2aa9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/plyfile.py @@ -0,0 +1,916 @@ +# Copyright 2014 Darsh Ranjan +# +# This file is part of python-plyfile. +# +# python-plyfile is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# python-plyfile is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with python-plyfile. If not, see +# . + +from itertools import islice as _islice + +import numpy as _np +from sys import byteorder as _byteorder + + +try: + _range = xrange +except NameError: + _range = range + + +# Many-many relation +_data_type_relation = [ + ('int8', 'i1'), + ('char', 'i1'), + ('uint8', 'u1'), + ('uchar', 'b1'), + ('uchar', 'u1'), + ('int16', 'i2'), + ('short', 'i2'), + ('uint16', 'u2'), + ('ushort', 'u2'), + ('int32', 'i4'), + ('int', 'i4'), + ('uint32', 'u4'), + ('uint', 'u4'), + ('float32', 'f4'), + ('float', 'f4'), + ('float64', 'f8'), + ('double', 'f8') +] + +_data_types = dict(_data_type_relation) +_data_type_reverse = dict((b, a) for (a, b) in _data_type_relation) + +_types_list = [] +_types_set = set() +for (_a, _b) in _data_type_relation: + if _a not in _types_set: + _types_list.append(_a) + _types_set.add(_a) + if _b not in _types_set: + _types_list.append(_b) + _types_set.add(_b) + + +_byte_order_map = { + 'ascii': '=', + 'binary_little_endian': '<', + 'binary_big_endian': '>' +} + +_byte_order_reverse = { + '<': 'binary_little_endian', + '>': 'binary_big_endian' +} + +_native_byte_order = {'little': '<', 'big': '>'}[_byteorder] + + +def _lookup_type(type_str): + if type_str not in _data_type_reverse: + try: + type_str = _data_types[type_str] + except KeyError: + raise ValueError("field type %r not in %r" % + (type_str, _types_list)) + + return _data_type_reverse[type_str] + + +def _split_line(line, n): + fields = line.split(None, n) + if len(fields) == n: + fields.append('') + + assert len(fields) == n + 1 + + return fields + + +def make2d(array, cols=None, dtype=None): + ''' + Make a 2D array from an array of arrays. The `cols' and `dtype' + arguments can be omitted if the array is not empty. + + ''' + if (cols is None or dtype is None) and not len(array): + raise RuntimeError("cols and dtype must be specified for empty " + "array") + + if cols is None: + cols = len(array[0]) + + if dtype is None: + dtype = array[0].dtype + + return _np.fromiter(array, [('_', dtype, (cols,))], + count=len(array))['_'] + + +class PlyParseError(Exception): + + ''' + Raised when a PLY file cannot be parsed. + + The attributes `element', `row', `property', and `message' give + additional information. + + ''' + + def __init__(self, message, element=None, row=None, prop=None): + self.message = message + self.element = element + self.row = row + self.prop = prop + + s = '' + if self.element: + s += 'element %r: ' % self.element.name + if self.row is not None: + s += 'row %d: ' % self.row + if self.prop: + s += 'property %r: ' % self.prop.name + s += self.message + + Exception.__init__(self, s) + + def __repr__(self): + return ('PlyParseError(%r, element=%r, row=%r, prop=%r)' % + self.message, self.element, self.row, self.prop) + + +class PlyData(object): + + ''' + PLY file header and data. + + A PlyData instance is created in one of two ways: by the static + method PlyData.read (to read a PLY file), or directly from __init__ + given a sequence of elements (which can then be written to a PLY + file). + + ''' + + def __init__(self, elements=[], text=False, byte_order='=', + comments=[], obj_info=[]): + ''' + elements: sequence of PlyElement instances. + + text: whether the resulting PLY file will be text (True) or + binary (False). + + byte_order: '<' for little-endian, '>' for big-endian, or '=' + for native. This is only relevant if `text' is False. + + comments: sequence of strings that will be placed in the header + between the 'ply' and 'format ...' lines. + + obj_info: like comments, but will be placed in the header with + "obj_info ..." instead of "comment ...". + + ''' + if byte_order == '=' and not text: + byte_order = _native_byte_order + + self.byte_order = byte_order + self.text = text + + self.comments = list(comments) + self.obj_info = list(obj_info) + self.elements = elements + + def _get_elements(self): + return self._elements + + def _set_elements(self, elements): + self._elements = tuple(elements) + self._index() + + elements = property(_get_elements, _set_elements) + + def _get_byte_order(self): + return self._byte_order + + def _set_byte_order(self, byte_order): + if byte_order not in ['<', '>', '=']: + raise ValueError("byte order must be '<', '>', or '='") + + self._byte_order = byte_order + + byte_order = property(_get_byte_order, _set_byte_order) + + def _index(self): + self._element_lookup = dict((elt.name, elt) for elt in + self._elements) + if len(self._element_lookup) != len(self._elements): + raise ValueError("two elements with same name") + + @staticmethod + def _parse_header(stream): + ''' + Parse a PLY header from a readable file-like stream. + + ''' + lines = [] + comments = {'comment': [], 'obj_info': []} + while True: + line = stream.readline().decode('ascii').strip() + fields = _split_line(line, 1) + + if fields[0] == 'end_header': + break + + elif fields[0] in comments.keys(): + lines.append(fields) + else: + lines.append(line.split()) + + a = 0 + if lines[a] != ['ply']: + raise PlyParseError("expected 'ply'") + + a += 1 + while lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + if lines[a][0] != 'format': + raise PlyParseError("expected 'format'") + + if lines[a][2] != '1.0': + raise PlyParseError("expected version '1.0'") + + if len(lines[a]) != 3: + raise PlyParseError("too many fields after 'format'") + + fmt = lines[a][1] + + if fmt not in _byte_order_map: + raise PlyParseError("don't understand format %r" % fmt) + + byte_order = _byte_order_map[fmt] + text = fmt == 'ascii' + + a += 1 + while a < len(lines) and lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + return PlyData(PlyElement._parse_multi(lines[a:]), + text, byte_order, + comments['comment'], comments['obj_info']) + + @staticmethod + def read(stream): + ''' + Read PLY data from a readable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'read') + try: + data = PlyData._parse_header(stream) + for elt in data: + elt._read(stream, data.text, data.byte_order) + finally: + if must_close: + stream.close() + + return data + + def write(self, stream): + ''' + Write PLY data to a writeable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'write') + try: + stream.write(self.header.encode('ascii')) + stream.write(b'\r\n') + for elt in self: + elt._write(stream, self.text, self.byte_order) + finally: + if must_close: + stream.close() + + @property + def header(self): + ''' + Provide PLY-formatted metadata for the instance. + + ''' + lines = ['ply'] + + if self.text: + lines.append('format ascii 1.0') + else: + lines.append('format ' + + _byte_order_reverse[self.byte_order] + + ' 1.0') + + # Some information is lost here, since all comments are placed + # between the 'format' line and the first element. + for c in self.comments: + lines.append('comment ' + c) + + for c in self.obj_info: + lines.append('obj_info ' + c) + + lines.extend(elt.header for elt in self.elements) + lines.append('end_header') + return '\r\n'.join(lines) + + def __iter__(self): + return iter(self.elements) + + def __len__(self): + return len(self.elements) + + def __contains__(self, name): + return name in self._element_lookup + + def __getitem__(self, name): + return self._element_lookup[name] + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyData(%r, text=%r, byte_order=%r, ' + 'comments=%r, obj_info=%r)' % + (self.elements, self.text, self.byte_order, + self.comments, self.obj_info)) + + +def _open_stream(stream, read_or_write): + if hasattr(stream, read_or_write): + return (False, stream) + try: + return (True, open(stream, read_or_write[0] + 'b')) + except TypeError: + raise RuntimeError("expected open file or filename") + + +class PlyElement(object): + + ''' + PLY file element. + + A client of this library doesn't normally need to instantiate this + directly, so the following is only for the sake of documenting the + internals. + + Creating a PlyElement instance is generally done in one of two ways: + as a byproduct of PlyData.read (when reading a PLY file) and by + PlyElement.describe (before writing a PLY file). + + ''' + + def __init__(self, name, properties, count, comments=[]): + ''' + This is not part of the public interface. The preferred methods + of obtaining PlyElement instances are PlyData.read (to read from + a file) and PlyElement.describe (to construct from a numpy + array). + + ''' + self._name = str(name) + self._check_name() + self._count = count + + self._properties = tuple(properties) + self._index() + + self.comments = list(comments) + + self._have_list = any(isinstance(p, PlyListProperty) + for p in self.properties) + + @property + def count(self): + return self._count + + def _get_data(self): + return self._data + + def _set_data(self, data): + self._data = data + self._count = len(data) + self._check_sanity() + + data = property(_get_data, _set_data) + + def _check_sanity(self): + for prop in self.properties: + if prop.name not in self._data.dtype.fields: + raise ValueError("dangling property %r" % prop.name) + + def _get_properties(self): + return self._properties + + def _set_properties(self, properties): + self._properties = tuple(properties) + self._check_sanity() + self._index() + + properties = property(_get_properties, _set_properties) + + def _index(self): + self._property_lookup = dict((prop.name, prop) + for prop in self._properties) + if len(self._property_lookup) != len(self._properties): + raise ValueError("two properties with same name") + + def ply_property(self, name): + return self._property_lookup[name] + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "element name %r contains spaces" % self._name + raise ValueError(msg) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype of the in-memory representation of the + data. (If there are no list properties, and the PLY format is + binary, then this also accurately describes the on-disk + representation of the element.) + + ''' + return [(prop.name, prop.dtype(byte_order)) + for prop in self.properties] + + @staticmethod + def _parse_multi(header_lines): + ''' + Parse a list of PLY element definitions. + + ''' + elements = [] + while header_lines: + (elt, header_lines) = PlyElement._parse_one(header_lines) + elements.append(elt) + + return elements + + @staticmethod + def _parse_one(lines): + ''' + Consume one element definition. The unconsumed input is + returned along with a PlyElement instance. + + ''' + a = 0 + line = lines[a] + + if line[0] != 'element': + raise PlyParseError("expected 'element'") + if len(line) > 3: + raise PlyParseError("too many fields after 'element'") + if len(line) < 3: + raise PlyParseError("too few fields after 'element'") + + (name, count) = (line[1], int(line[2])) + + comments = [] + properties = [] + while True: + a += 1 + if a >= len(lines): + break + + if lines[a][0] == 'comment': + comments.append(lines[a][1]) + elif lines[a][0] == 'property': + properties.append(PlyProperty._parse_one(lines[a])) + else: + break + + return (PlyElement(name, properties, count, comments), + lines[a:]) + + @staticmethod + def describe(data, name, len_types={}, val_types={}, + comments=[]): + ''' + Construct a PlyElement from an array's metadata. + + len_types and val_types can be given as mappings from list + property names to type strings (like 'u1', 'f4', etc., or + 'int8', 'float32', etc.). These can be used to define the length + and value types of list properties. List property lengths + always default to type 'u1' (8-bit unsigned integer), and value + types default to 'i4' (32-bit integer). + + ''' + if not isinstance(data, _np.ndarray): + raise TypeError("only numpy arrays are supported") + + if len(data.shape) != 1: + raise ValueError("only one-dimensional arrays are " + "supported") + + count = len(data) + + properties = [] + descr = data.dtype.descr + + for t in descr: + if not isinstance(t[1], str): + raise ValueError("nested records not supported") + + if not t[0]: + raise ValueError("field with empty name") + + if len(t) != 2 or t[1][1] == 'O': + # non-scalar field, which corresponds to a list + # property in PLY. + + if t[1][1] == 'O': + if len(t) != 2: + raise ValueError("non-scalar object fields not " + "supported") + + len_str = _data_type_reverse[len_types.get(t[0], 'u1')] + if t[1][1] == 'O': + val_type = val_types.get(t[0], 'i4') + val_str = _lookup_type(val_type) + else: + val_str = _lookup_type(t[1][1:]) + + prop = PlyListProperty(t[0], len_str, val_str) + else: + val_str = _lookup_type(t[1][1:]) + prop = PlyProperty(t[0], val_str) + + properties.append(prop) + + elt = PlyElement(name, properties, count, comments) + elt.data = data + + return elt + + def _read(self, stream, text, byte_order): + ''' + Read the actual data from a PLY file. + + ''' + if text: + self._read_txt(stream) + else: + if self._have_list: + # There are list properties, so a simple load is + # impossible. + self._read_bin(stream, byte_order) + else: + # There are no list properties, so loading the data is + # much more straightforward. + self._data = _np.fromfile(stream, + self.dtype(byte_order), + self.count) + + if len(self._data) < self.count: + k = len(self._data) + del self._data + raise PlyParseError("early end-of-file", self, k) + + self._check_sanity() + + def _write(self, stream, text, byte_order): + ''' + Write the data to a PLY file. + + ''' + if text: + self._write_txt(stream) + else: + if self._have_list: + # There are list properties, so serialization is + # slightly complicated. + self._write_bin(stream, byte_order) + else: + # no list properties, so serialization is + # straightforward. + self.data.astype(self.dtype(byte_order), + copy=False).tofile(stream) + + def _read_txt(self, stream): + ''' + Load a PLY element from an ASCII-format PLY file. The element + may contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype()) + + k = 0 + for line in _islice(iter(stream.readline, b''), self.count): + fields = iter(line.strip().split()) + for prop in self.properties: + try: + self._data[prop.name][k] = prop._from_fields(fields) + except StopIteration: + raise PlyParseError("early end-of-line", + self, k, prop) + except ValueError: + raise PlyParseError("malformed input", + self, k, prop) + try: + next(fields) + except StopIteration: + pass + else: + raise PlyParseError("expected end-of-line", self, k) + k += 1 + + if k < self.count: + del self._data + raise PlyParseError("early end-of-file", self, k) + + def _write_txt(self, stream): + ''' + Save a PLY element to an ASCII-format PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + fields = [] + for prop in self.properties: + fields.extend(prop._to_fields(rec[prop.name])) + + _np.savetxt(stream, [fields], '%.18g', newline='\r\n') + + def _read_bin(self, stream, byte_order): + ''' + Load a PLY element from a binary PLY file. The element may + contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype(byte_order)) + + for k in _range(self.count): + for prop in self.properties: + try: + self._data[prop.name][k] = \ + prop._read_bin(stream, byte_order) + except StopIteration: + raise PlyParseError("early end-of-file", + self, k, prop) + + def _write_bin(self, stream, byte_order): + ''' + Save a PLY element to a binary PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + for prop in self.properties: + prop._write_bin(rec[prop.name], stream, byte_order) + + @property + def header(self): + ''' + Format this element's metadata as it would appear in a PLY + header. + + ''' + lines = ['element %s %d' % (self.name, self.count)] + + # Some information is lost here, since all comments are placed + # between the 'element' line and the first property definition. + for c in self.comments: + lines.append('comment ' + c) + + lines.extend(list(map(str, self.properties))) + + return '\r\n'.join(lines) + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyElement(%r, %r, count=%d, comments=%r)' % + (self.name, self.properties, self.count, + self.comments)) + + +class PlyProperty(object): + + ''' + PLY property description. This class is pure metadata; the data + itself is contained in PlyElement instances. + + ''' + + def __init__(self, name, val_dtype): + self._name = str(name) + self._check_name() + self.val_dtype = val_dtype + + def _get_val_dtype(self): + return self._val_dtype + + def _set_val_dtype(self, val_dtype): + self._val_dtype = _data_types[_lookup_type(val_dtype)] + + val_dtype = property(_get_val_dtype, _set_val_dtype) + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "Error: property name %r contains spaces" % self._name + raise RuntimeError(msg) + + @staticmethod + def _parse_one(line): + assert line[0] == 'property' + + if line[1] == 'list': + if len(line) > 5: + raise PlyParseError("too many fields after " + "'property list'") + if len(line) < 5: + raise PlyParseError("too few fields after " + "'property list'") + + return PlyListProperty(line[4], line[2], line[3]) + + else: + if len(line) > 3: + raise PlyParseError("too many fields after " + "'property'") + if len(line) < 3: + raise PlyParseError("too few fields after " + "'property'") + + return PlyProperty(line[2], line[1]) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype description for this property (as a tuple + of strings). + + ''' + return byte_order + self.val_dtype + + def _from_fields(self, fields): + ''' + Parse from generator. Raise StopIteration if the property could + not be read. + + ''' + return _np.dtype(self.dtype()).type(next(fields)) + + def _to_fields(self, data): + ''' + Return generator over one item. + + ''' + yield _np.dtype(self.dtype()).type(data) + + def _read_bin(self, stream, byte_order): + ''' + Read data from a binary stream. Raise StopIteration if the + property could not be read. + + ''' + try: + return _np.fromfile(stream, self.dtype(byte_order), 1)[0] + except IndexError: + raise StopIteration + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + _np.dtype(self.dtype(byte_order)).type(data).tofile(stream) + + def __str__(self): + val_str = _data_type_reverse[self.val_dtype] + return 'property %s %s' % (val_str, self.name) + + def __repr__(self): + return 'PlyProperty(%r, %r)' % (self.name, + _lookup_type(self.val_dtype)) + + +class PlyListProperty(PlyProperty): + + ''' + PLY list property description. + + ''' + + def __init__(self, name, len_dtype, val_dtype): + PlyProperty.__init__(self, name, val_dtype) + + self.len_dtype = len_dtype + + def _get_len_dtype(self): + return self._len_dtype + + def _set_len_dtype(self, len_dtype): + self._len_dtype = _data_types[_lookup_type(len_dtype)] + + len_dtype = property(_get_len_dtype, _set_len_dtype) + + def dtype(self, byte_order='='): + ''' + List properties always have a numpy dtype of "object". + + ''' + return '|O' + + def list_dtype(self, byte_order='='): + ''' + Return the pair (len_dtype, val_dtype) (both numpy-friendly + strings). + + ''' + return (byte_order + self.len_dtype, + byte_order + self.val_dtype) + + def _from_fields(self, fields): + (len_t, val_t) = self.list_dtype() + + n = int(_np.dtype(len_t).type(next(fields))) + + data = _np.loadtxt(list(_islice(fields, n)), val_t, ndmin=1) + if len(data) < n: + raise StopIteration + + return data + + def _to_fields(self, data): + ''' + Return generator over the (numerical) PLY representation of the + list data (length followed by actual data). + + ''' + (len_t, val_t) = self.list_dtype() + + data = _np.asarray(data, dtype=val_t).ravel() + + yield _np.dtype(len_t).type(data.size) + for x in data: + yield x + + def _read_bin(self, stream, byte_order): + (len_t, val_t) = self.list_dtype(byte_order) + + try: + n = _np.fromfile(stream, len_t, 1)[0] + except IndexError: + raise StopIteration + + data = _np.fromfile(stream, val_t, n) + if len(data) < n: + raise StopIteration + + return data + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + (len_t, val_t) = self.list_dtype(byte_order) + + data = _np.asarray(data, dtype=val_t).ravel() + + _np.array(data.size, dtype=len_t).tofile(stream) + data.tofile(stream) + + def __str__(self): + len_str = _data_type_reverse[self.len_dtype] + val_str = _data_type_reverse[self.val_dtype] + return 'property list %s %s %s' % (len_str, val_str, self.name) + + def __repr__(self): + return ('PlyListProperty(%r, %r, %r)' % + (self.name, + _lookup_type(self.len_dtype), + _lookup_type(self.val_dtype))) diff --git a/zoo/SimpleView/ScanObjectNN/dgcnn/utils/tf_util.py b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/tf_util.py new file mode 100644 index 0000000..22ef62c --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/dgcnn/utils/tf_util.py @@ -0,0 +1,706 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2016 + +Upadted by Yue Wang and Yongbin Sun +""" + +import numpy as np +import tensorflow as tf + +def _variable_on_cpu(name, shape, initializer, use_fp16=False, trainable=True): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype, trainable=trainable) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + + + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_dist_template(inputs, is_training, scope, moments_dims, bn_decay): + """ The batch normalization for distributed training. + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = _variable_on_cpu('beta', [num_channels], initializer=tf.zeros_initializer()) + gamma = _variable_on_cpu('gamma', [num_channels], initializer=tf.ones_initializer()) + + pop_mean = _variable_on_cpu('pop_mean', [num_channels], initializer=tf.zeros_initializer(), trainable=False) + pop_var = _variable_on_cpu('pop_var', [num_channels], initializer=tf.ones_initializer(), trainable=False) + + def train_bn_op(): + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + train_mean = tf.assign(pop_mean, pop_mean * decay + batch_mean * (1 - decay)) + train_var = tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay)) + with tf.control_dependencies([train_mean, train_var]): + return tf.nn.batch_normalization(inputs, batch_mean, batch_var, beta, gamma, 1e-3) + + def test_bn_op(): + return tf.nn.batch_normalization(inputs, pop_mean, pop_var, beta, gamma, 1e-3) + + normed = tf.cond(is_training, + train_bn_op, + test_bn_op) + return normed + + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,1], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,1], bn_decay) + + + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,1,2], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,1,2], bn_decay) + + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs + + +def pairwise_distance(point_cloud): + """Compute pairwise distance of a point cloud. + + Args: + point_cloud: tensor (batch_size, num_points, num_dims) + + Returns: + pairwise distance: (batch_size, num_points, num_points) + """ + og_batch_size = point_cloud.get_shape().as_list()[0] + point_cloud = tf.squeeze(point_cloud) + if og_batch_size == 1: + point_cloud = tf.expand_dims(point_cloud, 0) + + point_cloud_transpose = tf.transpose(point_cloud, perm=[0, 2, 1]) + point_cloud_inner = tf.matmul(point_cloud, point_cloud_transpose) + point_cloud_inner = -2*point_cloud_inner + point_cloud_square = tf.reduce_sum(tf.square(point_cloud), axis=-1, keep_dims=True) + point_cloud_square_tranpose = tf.transpose(point_cloud_square, perm=[0, 2, 1]) + return point_cloud_square + point_cloud_inner + point_cloud_square_tranpose + + +def knn(adj_matrix, k=20): + """Get KNN based on the pairwise distance. + Args: + pairwise distance: (batch_size, num_points, num_points) + k: int + + Returns: + nearest neighbors: (batch_size, num_points, k) + """ + neg_adj = -adj_matrix + _, nn_idx = tf.nn.top_k(neg_adj, k=k) + return nn_idx + + +def get_edge_feature(point_cloud, nn_idx, k=20): + """Construct edge feature for each point + Args: + point_cloud: (batch_size, num_points, 1, num_dims) + nn_idx: (batch_size, num_points, k) + k: int + + Returns: + edge features: (batch_size, num_points, k, num_dims) + """ + og_batch_size = point_cloud.get_shape().as_list()[0] + point_cloud = tf.squeeze(point_cloud) + if og_batch_size == 1: + point_cloud = tf.expand_dims(point_cloud, 0) + + point_cloud_central = point_cloud + + point_cloud_shape = point_cloud.get_shape() + batch_size = point_cloud_shape[0].value + num_points = point_cloud_shape[1].value + num_dims = point_cloud_shape[2].value + + idx_ = tf.range(batch_size) * num_points + idx_ = tf.reshape(idx_, [batch_size, 1, 1]) + + point_cloud_flat = tf.reshape(point_cloud, [-1, num_dims]) + point_cloud_neighbors = tf.gather(point_cloud_flat, nn_idx+idx_) + point_cloud_central = tf.expand_dims(point_cloud_central, axis=-2) + + point_cloud_central = tf.tile(point_cloud_central, [1, 1, k, 1]) + + edge_feature = tf.concat([point_cloud_central, point_cloud_neighbors-point_cloud_central], axis=-1) + return edge_feature diff --git a/zoo/SimpleView/ScanObjectNN/mapping2.py b/zoo/SimpleView/ScanObjectNN/mapping2.py new file mode 100644 index 0000000..52a96df --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/mapping2.py @@ -0,0 +1,38 @@ +MODELNET_TO_OBJECTDATASET = {2:10, + 4:8, + 8:4, + 12:5, + 13:7, + 14:3, + 22:6, + 3:4, + 29:12, + 30:13, + 32:4, + 33:9, + 35:14, + 38:3} + +OBJECTDATASET_TO_MODELNET = {10:[2], + 8:[4], + 4:[8,32,3], + 5:[12], + 7:[13], + 3:[14,38], + 6:[22], + 12:[29], + 13:[30], + 9:[33], + 14:[35]} + +OBJECTDATASET_TO_COMBINED = {3:0, + 4:1, + 5:2, + 6:3, + 7:4, + 8:5, + 9:6, + 10:7, + 12:8, + 13:9, + 14:10} \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/objects_teaser.png b/zoo/SimpleView/ScanObjectNN/objects_teaser.png new file mode 100644 index 0000000..73bb691 Binary files /dev/null and b/zoo/SimpleView/ScanObjectNN/objects_teaser.png differ diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/draw_cmat.py b/zoo/SimpleView/ScanObjectNN/pointnet/draw_cmat.py new file mode 100644 index 0000000..af39f1e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/draw_cmat.py @@ -0,0 +1,233 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_cls', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='confusion_matrix/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + loss = MODEL.get_loss(pred, labels_pl, end_points) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + current_pred.append(pred_val[i-start_idx]) + + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + # print(current_pred.shape) + # print(current_label.shape) + # exit() + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + #Plot confusion matrix + current_pred = np.array(current_pred) + groundtruth = current_label.flatten() + predictions = current_pred.flatten() + + mat = confusion_matrix(groundtruth, predictions) + + plt.style.use('seaborn-paper') + plt.rcParams["figure.figsize"] = (10,10) + ax = plt.subplot(111) + cmap = plt.cm.Reds + mat = mat.astype('float') / mat.sum(axis=1)[:, np.newaxis] + mat = np.nan_to_num(mat, copy=True) + + plt.imshow(mat, interpolation='nearest', cmap=cmap) + # cbar = plt.colorbar(fraction=0.03, pad=0.05, aspect=30) + # cbar.ax.tick_params(labelsize=18) + tick_marks = np.arange(len(SHAPE_NAMES)) + plt.xticks(tick_marks, SHAPE_NAMES, rotation=90) + plt.yticks(tick_marks, SHAPE_NAMES) + + plt.ylabel('Ground truth') + plt.xlabel('Prediction') + + for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] + + ax.get_xticklabels() + ax.get_yticklabels()): + item.set_fontsize(36) + + plt.tight_layout() + plt.savefig(os.path.join(DUMP_DIR,'matrix.pdf')) + plt.show() + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_partseg.py b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_partseg.py new file mode 100644 index 0000000..6befa17 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_partseg.py @@ -0,0 +1,199 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_partseg', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='../../../../pointnet/log_partseg_augmented25_norot/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_partseg_augmented25_norot/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=1.0, help='Segmentation weight in loss') + +# parser.add_argument('--test_file', default = '../training_data/test_objectdataset_v1.pickle', help='Location of test file') +parser.add_argument('--test_file', default = '/home/vgd/object_dataset/parts/test_objectdataset_augmented25_norot.h5', help='Location of test file') + +parser.add_argument('--visu_mask', default = False, help='Whether to dump mask [default: False]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +NUM_CLASSES = 6 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/chair_parts.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TEST_DATA, TEST_LABELS, TEST_PARTS = data_utils.load_parts_h5(TEST_FILE) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, parts_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + seg_pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + total_loss = MODEL.get_loss(seg_pred, parts_pl, end_points) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'parts_pl': parts_pl, + 'is_training_pl': is_training_pl, + 'seg_pred': seg_pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + total_correct_seg = 0 + + current_data, current_label, current_parts = data_utils.get_current_data_parts_h5(TEST_DATA, TEST_LABELS, TEST_PARTS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_parts = np.squeeze(current_parts) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_seg_sum = np.zeros((cur_batch_size, NUM_POINT, NUM_CLASSES)) # score for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['parts_pl']: current_parts[start_idx:end_idx], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, seg_val = sess.run([ops['loss'], ops['seg_pred']], + feed_dict=feed_dict) + + batch_seg_sum += seg_val + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + # Aggregating END + seg_val = np.argmax(batch_seg_sum, 2) + seg_correct = np.sum(seg_val == current_parts[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + parts = current_parts[i] + for j in range(len(parts)): + part = parts[j] + + total_seen_class[part] += 1 + total_correct_class[part] += (seg_val[i-start_idx][j] == part) + + total_parts_seen = 0 + cum_sum = 0 + part_accs = [] + for i in range(NUM_CLASSES): + if (total_seen_class[i]==0): + part_accs.append(-1.0) + continue + part_acc = float(total_correct_class[i])/float(total_seen_class[i]) + cum_sum += part_acc + part_accs.append(part_acc) + total_parts_seen +=1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + log_string('eval avg class acc: %f' % (cum_sum/float(total_parts_seen))) + + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, part_accs[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_real_trained_on_synthetic.py b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_real_trained_on_synthetic.py new file mode 100644 index 0000000..c39a1c0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_real_trained_on_synthetic.py @@ -0,0 +1,261 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_cls', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_real_trained_on_synthetic/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 40, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +# NUM_CLASSES = 10 +# SHAPE_NAMES = [line.rstrip() for line in \ +# open( '../training_data/shape_names.txt')] + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in OBJECTDATASET_TO_MODELNET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 40)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 40)) # 0/1 for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen +=1 + if (pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET.keys()): + continue + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + # if (pred_val[i-start_idx] == current_label[i]): + if (pred == current_label[i]): + total_correct +=1 + + for i in range(start_idx, end_idx): + + l = current_label[i] + total_seen_class[l] += 1 + + if pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET: + pred_label = "NA" + else: + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + total_correct_class[l] += (pred == l) + + pred_label = SHAPE_NAMES[pred] + + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[l] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, groundtruth_label, + pred_label) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, + pred_label) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_scenennobjects.py new file mode 100644 index 0000000..e36490f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_scenennobjects.py @@ -0,0 +1,208 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_cls', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = FLAGS.num_class +if (NUM_CLASSES==11): + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_combined.txt')] +else: + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] +print("Number of Classes: "+str(NUM_CLASSES)) + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_seg_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_seg_scenennobjects.py new file mode 100644 index 0000000..3481a73 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_seg_scenennobjects.py @@ -0,0 +1,264 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_seg', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--visu_mask', default = False, help='Whether to dump mask [default: False]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, masks_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + class_pred, seg_pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + total_loss, classify_loss, seg_loss = MODEL.get_loss(class_pred, seg_pred, labels_pl, masks_pl, end_points, seg_weight=SEG_WEIGHT) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': class_pred, + 'seg_pred': seg_pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + total_correct_seg = 0 + + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_seg_sum = np.zeros((cur_batch_size, NUM_POINT, 2)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val, seg_val = sess.run([ops['loss'], ops['pred'],ops['seg_pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_seg_sum += seg_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + seg_val = np.argmax(batch_seg_sum, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + gt_mask = current_mask[i] + pred_mask = seg_val[i-start_idx] + + pred_mask_idx = np.where(pred_mask==1)[0] + gt_mask_idx = np.where(gt_mask==1)[0] + correct_obj_mask = np.where((pred_mask==gt_mask) & (pred_mask==1))[0] + + if (len(correct_obj_mask)==1): + continue + + if (i%20==0 and FLAGS.visu_mask): + ###1) + img_filename = '%d_label_%s_pred_%s_gtmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, gt_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s_gtmask.ply' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, gt_mask_idx, :]),ply_filename) + + ###2) + img_filename = '%d_label_%s_pred_%s_predmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, pred_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s_predmask.ply' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, pred_mask_idx, :]),ply_filename) + + ###3) + img_filename = '%d_label_%s_pred_%s_correctpredmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, correct_obj_mask, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s_correctpredmask.ply' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, correct_obj_mask, :]),ply_filename) + + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_synthetic_trained_on_real.py b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_synthetic_trained_on_real.py new file mode 100644 index 0000000..60a28a2 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/evaluate_synthetic_trained_on_real.py @@ -0,0 +1,264 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_cls', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_synthetic_trained_on_real/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'modelnet/modelnet_test.h5', help='Location of test file') + +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +# NUM_CLASSES = 10 +# SHAPE_NAMES = [line.rstrip() for line in \ +# open( '../training_data/shape_names.txt')] + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in MODELNET_TO_OBJECTDATASET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 15)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 15)) # 0/1 for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen += 1 + if (pred_val[i-start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (current_label[i] in possible_label): + total_correct +=1 + + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + # total_correct += correct + # total_seen += cur_batch_size + + # loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + if (pred_val[i-start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (l in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + + pred_label = SHAPE_NAMES[pred_val[i-start_idx]] + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, groundtruth_label, + pred_label) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, + pred_label) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_cls.py b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_cls.py new file mode 100644 index 0000000..63f83dc --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_cls.py @@ -0,0 +1,100 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util +from transform_nets import input_transform_net, feature_transform_net + +#NUM_CLASSES = 40 +NUM_CLASSES = 15 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None, num_class=NUM_CLASSES): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(point_cloud, is_training, bn_decay, K=3) + point_cloud_transformed = tf.matmul(point_cloud, transform) + input_image = tf.expand_dims(point_cloud_transformed, -1) + + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + + with tf.variable_scope('transform_net2') as sc: + transform = feature_transform_net(net, is_training, bn_decay, K=64) + end_points['transform'] = transform + net_transformed = tf.matmul(tf.squeeze(net, axis=[2]), transform) + net_transformed = tf.expand_dims(net_transformed, [2]) + + net = tf_util.conv2d(net_transformed, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + + # Symmetric function: max pooling + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp2') + net = tf_util.fully_connected(net, num_class, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points, reg_weight=0.001): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + + # Enforce the transformation as orthogonal matrix + transform = end_points['transform'] # BxKxK + K = transform.get_shape()[1].value + mat_diff = tf.matmul(transform, tf.transpose(transform, perm=[0,2,1])) + mat_diff -= tf.constant(np.eye(K), dtype=tf.float32) + mat_diff_loss = tf.nn.l2_loss(mat_diff) + tf.summary.scalar('mat loss', mat_diff_loss) + + return classify_loss + mat_diff_loss * reg_weight + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_cls_basic.py b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_cls_basic.py new file mode 100644 index 0000000..345f66a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_cls_basic.py @@ -0,0 +1,76 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + input_image = tf.expand_dims(point_cloud, -1) + + # Point functions (MLP implemented as conv2d) + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + + # Symmetric function: max pooling + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + + # MLP on global point cloud vector + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_partseg.py b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_partseg.py new file mode 100644 index 0000000..8805c35 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_partseg.py @@ -0,0 +1,131 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util +from transform_nets import input_transform_net, feature_transform_net + +NUM_CLASSES = 6 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, + shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + seg_pl = tf.placeholder(tf.int32, + shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, seg_pl + + +def get_model(point_cloud, is_training, bn_decay=None, num_class = NUM_CLASSES): + """ Classification PointNet, input is BxNx3, output BxNx50 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(point_cloud, is_training, bn_decay, K=3) + point_cloud_transformed = tf.matmul(point_cloud, transform) + input_image = tf.expand_dims(point_cloud_transformed, -1) + + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + + with tf.variable_scope('transform_net2') as sc: + transform = feature_transform_net(net, is_training, bn_decay, K=64) + end_points['transform'] = transform + net_transformed = tf.matmul(tf.squeeze(net, axis=[2]), transform) + point_feat = tf.expand_dims(net_transformed, [2]) + print(point_feat) + + net = tf_util.conv2d(point_feat, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + global_feat = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + + #for part_segmentation + global_feat_expand = tf.tile(global_feat, [1, num_point, 1, 1]) + concat_feat = tf.concat([point_feat, global_feat_expand], 3) + print(concat_feat) + + net = tf_util.conv2d(concat_feat, 512, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv6', bn_decay=bn_decay) + net = tf_util.conv2d(net, 256, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv7', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv8', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv9', bn_decay=bn_decay) + + net = tf_util.conv2d(net, num_class, [1,1], + padding='VALID', stride=[1,1], activation_fn=None, + scope='conv10') + + seg_pred = tf.squeeze(net, [2]) # BxNxC + + return seg_pred, end_points + + +def get_loss(seg_pred, gt_seg, end_points, reg_weight=0.001): + """ pred: BxNxC, + label: BxN, """ + batch_size = gt_seg.shape[0] + num_point = gt_seg.shape[1] + + #mask loss + ###convert mask to binary mask + ##try weighted loss + # labels_one_hot = tf.one_hot(gt_seg, 6, on_value=1.0, off_value=0.0) + # class_weights = [1.0, 3.0, 3.0, 3.0, 3.0, 3.0] + # weights = tf.reduce_sum(class_weights*labels_one_hot, axis=-1) + # unweighted_loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_seg) + # seg_loss = tf.reduce_mean(weights*unweighted_loss) + + + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_seg), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + # Enforce the transformation as orthogonal matrix + transform = end_points['transform'] # BxKxK + K = transform.get_shape()[1].value + mat_diff = tf.matmul(transform, tf.transpose(transform, perm=[0,2,1])) + mat_diff -= tf.constant(np.eye(K), dtype=tf.float32) + mat_diff_loss = tf.nn.l2_loss(mat_diff) + + total_loss = seg_loss + mat_diff_loss * reg_weight + + return total_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_seg.py b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_seg.py new file mode 100644 index 0000000..b375b2b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/models/pointnet_seg.py @@ -0,0 +1,141 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util +from transform_nets import input_transform_net, feature_transform_net + +NUM_CLASSES = 15 +BACKGROUND_CLASS = -1 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, + shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + mask_pl = tf.placeholder(tf.int32, + shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, mask_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output BxNx50 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(point_cloud, is_training, bn_decay, K=3) + point_cloud_transformed = tf.matmul(point_cloud, transform) + input_image = tf.expand_dims(point_cloud_transformed, -1) + + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + + with tf.variable_scope('transform_net2') as sc: + transform = feature_transform_net(net, is_training, bn_decay, K=64) + end_points['transform'] = transform + net_transformed = tf.matmul(tf.squeeze(net, axis=[2]), transform) + point_feat = tf.expand_dims(net_transformed, [2]) + print(point_feat) + + net = tf_util.conv2d(point_feat, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + global_feat = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + print(global_feat) + + #branch for obj label + net = tf.reshape(global_feat, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp2') + class_pred = tf_util.fully_connected(net, NUM_CLASSES, activation_fn=None, scope='fc3') + + + #for mask segmentation + global_feat_expand = tf.tile(global_feat, [1, num_point, 1, 1]) + concat_feat = tf.concat([point_feat, global_feat_expand], 3) + print(concat_feat) + + net = tf_util.conv2d(concat_feat, 512, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv6', bn_decay=bn_decay) + net = tf_util.conv2d(net, 256, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv7', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv8', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv9', bn_decay=bn_decay) + + #for mask + net = tf_util.conv2d(net, 2, [1,1], + padding='VALID', stride=[1,1], activation_fn=None, + scope='conv10') + seg_pred = tf.squeeze(net, [2]) # BxNxC + + return class_pred, seg_pred, end_points + + +def get_loss(class_pred, seg_pred, gt_label, gt_mask, end_points, seg_weight = 0.5, reg_weight=0.001): + """ pred: BxNxC, + label: BxN, """ + batch_size = gt_mask.shape[0] + num_point = gt_mask.shape[1] + + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_pred, labels=gt_label) + classify_loss = tf.reduce_mean(loss) + + #mask loss + ###convert mask to binary mask + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_mask), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + # Enforce the transformation as orthogonal matrix + transform = end_points['transform'] # BxKxK + K = transform.get_shape()[1].value + mat_diff = tf.matmul(transform, tf.transpose(transform, perm=[0,2,1])) + mat_diff -= tf.constant(np.eye(K), dtype=tf.float32) + mat_diff_loss = tf.nn.l2_loss(mat_diff) + + total_loss = (1-seg_weight)*classify_loss + seg_weight*seg_loss + mat_diff_loss * reg_weight + + return total_loss, classify_loss, seg_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/models/transform_nets.py b/zoo/SimpleView/ScanObjectNN/pointnet/models/transform_nets.py new file mode 100644 index 0000000..c2a90cb --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/models/transform_nets.py @@ -0,0 +1,95 @@ +import tensorflow as tf +import numpy as np +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def input_transform_net(point_cloud, is_training, bn_decay=None, K=3): + """ Input (XYZ) Transform Net, input is BxNx3 gray image + Return: + Transformation matrix of size 3xK """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + + input_image = tf.expand_dims(point_cloud, -1) + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay) + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay) + + with tf.variable_scope('transform_XYZ') as sc: + assert(K==3) + weights = tf.get_variable('weights', [256, 3*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [3*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant([1,0,0,0,1,0,0,0,1], dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, 3, K]) + return transform + + +def feature_transform_net(inputs, is_training, bn_decay=None, K=64): + """ Feature Transform Net, input is BxNx1xK + Return: + Transformation matrix of size KxK """ + batch_size = inputs.get_shape()[0].value + num_point = inputs.get_shape()[1].value + + net = tf_util.conv2d(inputs, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay) + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay) + + with tf.variable_scope('transform_feat') as sc: + weights = tf.get_variable('weights', [256, K*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [K*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant(np.eye(K).flatten(), dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, K, K]) + return transform diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/provider.py b/zoo/SimpleView/ScanObjectNN/pointnet/provider.py new file mode 100644 index 0000000..dbb2470 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/provider.py @@ -0,0 +1,109 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'data/modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(os.path.join(DATA_DIR,filename)) + +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) + + +def loadDataFile_with_seg(filename): + return load_h5_data_label_seg(filename) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/train.py b/zoo/SimpleView/ScanObjectNN/pointnet/train.py new file mode 100644 index 0000000..9e1fef8 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/train.py @@ -0,0 +1,379 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_cls', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir + +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +NUM_CLASSES = FLAGS.num_class + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) +else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, num_class=NUM_CLASSES) + loss = MODEL.get_loss(pred, labels_pl, end_points) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + #merged = tf.merge_all_summaries() + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + #Load checkpoint + # saver.restore(sess, os.path.join(LOG_DIR,'model.ckpt')) + # log_string("Model restored.") + + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + #Shuffle data + # data_utils.shuffle_points(TRAIN_DATA) + + #get current data, shuffle and set to numpy array with desired num_points + # current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + if (".h5" in TRAIN_FILE): + current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + + # # Shuffle train files + # train_file_idxs = np.arange(0, len(TRAIN_FILES)) + + # for fn in range(len(TRAIN_FILES)): + # log_string('----' + str(fn) + '-----') + # current_data, current_label = provider.loadDataFile(TRAIN_FILES[train_file_idxs[fn]]) + # current_data = current_data[:,0:NUM_POINT,:] + # current_data, current_label, _ = provider.shuffle_data(current_data, np.squeeze(current_label)) + # current_label = np.squeeze(current_label) + + # file_size = current_data.shape[0] + # num_batches = file_size // BATCH_SIZE + + # total_correct = 0 + # total_seen = 0 + # loss_sum = 0 + + # for batch_idx in range(num_batches): + # start_idx = batch_idx * BATCH_SIZE + # end_idx = (batch_idx+1) * BATCH_SIZE + + # # Augment batched point clouds by rotation and jittering + # rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + # jittered_data = provider.jitter_point_cloud(rotated_data) + # feed_dict = {ops['pointclouds_pl']: jittered_data, + # ops['labels_pl']: current_label[start_idx:end_idx], + # ops['is_training_pl']: is_training,} + # summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + # ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + # train_writer.add_summary(summary, step) + # pred_val = np.argmax(pred_val, 1) + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # total_correct += correct + # total_seen += BATCH_SIZE + # loss_sum += loss_val + + # log_string('mean loss: %f' % (loss_sum / float(num_batches))) + # log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # data_utils.shuffle_points(TEST_DATA) + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + # for fn in range(len(TEST_FILES)): + # log_string('----' + str(fn) + '-----') + # current_data, current_label = provider.loadDataFile(TEST_FILES[fn]) + # current_data = current_data[:,0:NUM_POINT,:] + # current_label = np.squeeze(current_label) + + # file_size = current_data.shape[0] + # num_batches = file_size // BATCH_SIZE + + # for batch_idx in range(num_batches): + # start_idx = batch_idx * BATCH_SIZE + # end_idx = (batch_idx+1) * BATCH_SIZE + + # feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + # ops['labels_pl']: current_label[start_idx:end_idx], + # ops['is_training_pl']: is_training} + # summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + # ops['loss'], ops['pred']], feed_dict=feed_dict) + # pred_val = np.argmax(pred_val, 1) + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # total_correct += correct + # total_seen += BATCH_SIZE + # loss_sum += (loss_val*BATCH_SIZE) + # for i in range(start_idx, end_idx): + # l = current_label[i] + # total_seen_class[l] += 1 + # total_correct_class[l] += (pred_val[i-start_idx] == l) + + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + # log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + # log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/train_partseg.py b/zoo/SimpleView/ScanObjectNN/pointnet/train_partseg.py new file mode 100644 index 0000000..aeaf70e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/train_partseg.py @@ -0,0 +1,304 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_partseg', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') + +parser.add_argument('--log_dir', default='../../../../pointnet/log_partseg_augmented25rot/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=1.0, help='Segmentation weight in loss') + +parser.add_argument('--train_file', default = '/home/vgd/object_dataset/parts/training_objectdataset_augmented25rot.h5', help='Location of training file') +parser.add_argument('--test_file', default = '/home/vgd/object_dataset/parts/test_objectdataset_augmented25rot.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir + +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +NUM_CLASSES = 6 + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + + +TRAIN_DATA, TRAIN_LABELS, TRAIN_PARTS = data_utils.load_parts_h5(TRAIN_FILE) +TEST_DATA, TEST_LABELS, TEST_PARTS = data_utils.load_parts_h5(TEST_FILE) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, parts_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + seg_pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + total_loss = MODEL.get_loss(seg_pred, parts_pl, end_points) + tf.summary.scalar('loss', total_loss) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + #merged = tf.merge_all_summaries() + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + #Load checkpoint + # saver.restore(sess, os.path.join(LOG_DIR,'model.ckpt')) + # log_string("Model restored.") + + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'parts_pl': parts_pl, + 'is_training_pl': is_training_pl, + 'seg_pred': seg_pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + # if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + current_data, current_label, current_parts = data_utils.get_current_data_parts_h5(TRAIN_DATA, TRAIN_LABELS, TRAIN_PARTS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_parts = np.squeeze(current_parts) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['parts_pl']: current_parts[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, seg_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['seg_pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_parts[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_seen += BATCH_SIZE + loss_sum += loss_val + + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + current_data, current_label, current_parts = data_utils.get_current_data_parts_h5(TEST_DATA, TEST_LABELS, TEST_PARTS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_parts = np.squeeze(current_parts) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['parts_pl']: current_parts[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, seg_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['seg_pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_parts[start_idx:end_idx]) + total_correct_seg += seg_correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + + for i in range(start_idx, end_idx): + parts = current_parts[i] + for j in range(len(parts)): + part = parts[j] + + total_seen_class[part] += 1 + total_correct_class[part] += (seg_val[i-start_idx][j] == part) + + total_parts_seen = 0 + cum_sum = 0 + for i in range(NUM_CLASSES): + if (total_seen_class[i]==0): + continue + part_acc = float(total_correct_class[i])/float(total_seen_class[i]) + cum_sum += part_acc + total_parts_seen +=1 + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + log_string('eval avg class acc: %f' % (cum_sum/float(total_parts_seen))) + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/train_seg.py b/zoo/SimpleView/ScanObjectNN/pointnet/train_seg.py new file mode 100644 index 0000000..d50ecd8 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/train_seg.py @@ -0,0 +1,334 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet_seg', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir + +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +# MAX_NUM_POINT = 2048 +# NUM_CLASSES = 40 +# NUM_CLASSES = 20 +# NUM_CLASSES = 10 +NUM_CLASSES = 15 + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + + +TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS = data_utils.load_withmask_h5(TRAIN_FILE) +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +TRAIN_MASKS = data_utils.convert_to_binary_mask(TRAIN_MASKS) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, masks_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + class_pred, seg_pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + total_loss, classify_loss, seg_loss = MODEL.get_loss(class_pred, seg_pred, labels_pl, masks_pl, end_points, seg_weight=SEG_WEIGHT) + tf.summary.scalar('loss', total_loss) + tf.summary.scalar('classify_loss', classify_loss) + tf.summary.scalar('seg_loss', seg_loss) + + correct = tf.equal(tf.argmax(class_pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + seg_correct = tf.equal(tf.argmax(seg_pred, 2), tf.to_int64(masks_pl)) + seg_accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / (float(BATCH_SIZE)*NUM_POINT) + tf.summary.scalar('seg_accuracy', seg_accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + #merged = tf.merge_all_summaries() + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + #Load checkpoint + # saver.restore(sess, os.path.join(LOG_DIR,'model.ckpt')) + # log_string("Model restored.") + + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': class_pred, + 'seg_pred': seg_pred, + 'loss': total_loss, + 'classify_loss': classify_loss, + 'seg_loss': seg_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + classify_loss_sum += classify_loss + seg_loss_sum += seg_loss + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('classify mean loss: %f' % (classify_loss_sum / float(num_batches))) + log_string('seg mean loss: %f' % (seg_loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + total_correct_seg = 0 + + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # data_utils.shuffle_points(TEST_DATA) + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + classify_loss_sum += classify_loss*BATCH_SIZE + seg_loss_sum += seg_loss*BATCH_SIZE + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval classify mean loss: %f' % (classify_loss_sum / float(total_seen))) + log_string('eval seg mean loss: %f' % (seg_loss_sum / float(total_seen))) + + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/utils/data_prep_util.py b/zoo/SimpleView/ScanObjectNN/pointnet/utils/data_prep_util.py new file mode 100644 index 0000000..53d32f1 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/utils/data_prep_util.py @@ -0,0 +1,145 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +from plyfile import (PlyData, PlyElement, make2d, PlyParseError, PlyProperty) +import numpy as np +import h5py + +SAMPLING_BIN = os.path.join(BASE_DIR, 'third_party/mesh_sampling/build/pcsample') + +SAMPLING_POINT_NUM = 2048 +SAMPLING_LEAF_SIZE = 0.005 + +MODELNET40_PATH = '../datasets/modelnet40' +def export_ply(pc, filename): + vertex = np.zeros(pc.shape[0], dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')]) + for i in range(pc.shape[0]): + vertex[i] = (pc[i][0], pc[i][1], pc[i][2]) + ply_out = PlyData([PlyElement.describe(vertex, 'vertex', comments=['vertices'])]) + ply_out.write(filename) + +# Sample points on the obj shape +def get_sampling_command(obj_filename, ply_filename): + cmd = SAMPLING_BIN + ' ' + obj_filename + cmd += ' ' + ply_filename + cmd += ' -n_samples %d ' % SAMPLING_POINT_NUM + cmd += ' -leaf_size %f ' % SAMPLING_LEAF_SIZE + return cmd + +# -------------------------------------------------------------- +# Following are the helper functions to load MODELNET40 shapes +# -------------------------------------------------------------- + +# Read in the list of categories in MODELNET40 +def get_category_names(): + shape_names_file = os.path.join(MODELNET40_PATH, 'shape_names.txt') + shape_names = [line.rstrip() for line in open(shape_names_file)] + return shape_names + +# Return all the filepaths for the shapes in MODELNET40 +def get_obj_filenames(): + obj_filelist_file = os.path.join(MODELNET40_PATH, 'filelist.txt') + obj_filenames = [os.path.join(MODELNET40_PATH, line.rstrip()) for line in open(obj_filelist_file)] + print('Got %d obj files in modelnet40.' % len(obj_filenames)) + return obj_filenames + +# Helper function to create the father folder and all subdir folders if not exist +def batch_mkdir(output_folder, subdir_list): + if not os.path.exists(output_folder): + os.mkdir(output_folder) + for subdir in subdir_list: + if not os.path.exists(os.path.join(output_folder, subdir)): + os.mkdir(os.path.join(output_folder, subdir)) + +# ---------------------------------------------------------------- +# Following are the helper functions to load save/load HDF5 files +# ---------------------------------------------------------------- + +# Write numpy array data and label to h5_filename +def save_h5_data_label_normal(h5_filename, data, label, normal, + data_dtype='float32', label_dtype='uint8', noral_dtype='float32'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + 'data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + 'normal', data=normal, + compression='gzip', compression_opts=4, + dtype=normal_dtype) + h5_fout.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + + +# Write numpy array data and label to h5_filename +def save_h5(h5_filename, data, label, data_dtype='uint8', label_dtype='uint8'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + 'data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + +# Read numpy array data and label from h5_filename +def load_h5_data_label_normal(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + normal = f['normal'][:] + return (data, label, normal) + +# Read numpy array data and label from h5_filename +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) + +# Read numpy array data and label from h5_filename +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +# ---------------------------------------------------------------- +# Following are the helper functions to load save/load PLY files +# ---------------------------------------------------------------- + +# Load PLY file +def load_ply_data(filename, point_num): + plydata = PlyData.read(filename) + pc = plydata['vertex'].data[:point_num] + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + +# Load PLY file +def load_ply_normal(filename, point_num): + plydata = PlyData.read(filename) + pc = plydata['normal'].data[:point_num] + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + +# Make up rows for Nxk array +# Input Pad is 'edge' or 'constant' +def pad_arr_rows(arr, row, pad='edge'): + assert(len(arr.shape) == 2) + assert(arr.shape[0] <= row) + assert(pad == 'edge' or pad == 'constant') + if arr.shape[0] == row: + return arr + if pad == 'edge': + return np.lib.pad(arr, ((0, row-arr.shape[0]), (0, 0)), 'edge') + if pad == 'constant': + return np.lib.pad(arr, ((0, row-arr.shape[0]), (0, 0)), 'constant', (0, 0)) + + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/utils/eulerangles.py b/zoo/SimpleView/ScanObjectNN/pointnet/utils/eulerangles.py new file mode 100644 index 0000000..87bd605 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/utils/eulerangles.py @@ -0,0 +1,418 @@ +# emacs: -*- mode: python-mode; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the NiBabel package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +''' Module implementing Euler angle rotations and their conversions + +See: + +* http://en.wikipedia.org/wiki/Rotation_matrix +* http://en.wikipedia.org/wiki/Euler_angles +* http://mathworld.wolfram.com/EulerAngles.html + +See also: *Representing Attitude with Euler Angles and Quaternions: A +Reference* (2006) by James Diebel. A cached PDF link last found here: + +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.110.5134 + +Euler's rotation theorem tells us that any rotation in 3D can be +described by 3 angles. Let's call the 3 angles the *Euler angle vector* +and call the angles in the vector :math:`alpha`, :math:`beta` and +:math:`gamma`. The vector is [ :math:`alpha`, +:math:`beta`. :math:`gamma` ] and, in this description, the order of the +parameters specifies the order in which the rotations occur (so the +rotation corresponding to :math:`alpha` is applied first). + +In order to specify the meaning of an *Euler angle vector* we need to +specify the axes around which each of the rotations corresponding to +:math:`alpha`, :math:`beta` and :math:`gamma` will occur. + +There are therefore three axes for the rotations :math:`alpha`, +:math:`beta` and :math:`gamma`; let's call them :math:`i` :math:`j`, +:math:`k`. + +Let us express the rotation :math:`alpha` around axis `i` as a 3 by 3 +rotation matrix `A`. Similarly :math:`beta` around `j` becomes 3 x 3 +matrix `B` and :math:`gamma` around `k` becomes matrix `G`. Then the +whole rotation expressed by the Euler angle vector [ :math:`alpha`, +:math:`beta`. :math:`gamma` ], `R` is given by:: + + R = np.dot(G, np.dot(B, A)) + +See http://mathworld.wolfram.com/EulerAngles.html + +The order :math:`G B A` expresses the fact that the rotations are +performed in the order of the vector (:math:`alpha` around axis `i` = +`A` first). + +To convert a given Euler angle vector to a meaningful rotation, and a +rotation matrix, we need to define: + +* the axes `i`, `j`, `k` +* whether a rotation matrix should be applied on the left of a vector to + be transformed (vectors are column vectors) or on the right (vectors + are row vectors). +* whether the rotations move the axes as they are applied (intrinsic + rotations) - compared the situation where the axes stay fixed and the + vectors move within the axis frame (extrinsic) +* the handedness of the coordinate system + +See: http://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities + +We are using the following conventions: + +* axes `i`, `j`, `k` are the `z`, `y`, and `x` axes respectively. Thus + an Euler angle vector [ :math:`alpha`, :math:`beta`. :math:`gamma` ] + in our convention implies a :math:`alpha` radian rotation around the + `z` axis, followed by a :math:`beta` rotation around the `y` axis, + followed by a :math:`gamma` rotation around the `x` axis. +* the rotation matrix applies on the left, to column vectors on the + right, so if `R` is the rotation matrix, and `v` is a 3 x N matrix + with N column vectors, the transformed vector set `vdash` is given by + ``vdash = np.dot(R, v)``. +* extrinsic rotations - the axes are fixed, and do not move with the + rotations. +* a right-handed coordinate system + +The convention of rotation around ``z``, followed by rotation around +``y``, followed by rotation around ``x``, is known (confusingly) as +"xyz", pitch-roll-yaw, Cardan angles, or Tait-Bryan angles. +''' + +import math + +import sys +if sys.version_info >= (3,0): + from functools import reduce + +import numpy as np + + +_FLOAT_EPS_4 = np.finfo(float).eps * 4.0 + + +def euler2mat(z=0, y=0, x=0): + ''' Return matrix for rotations around z, y and x axes + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + M : array shape (3,3) + Rotation matrix giving same rotation as for given angles + + Examples + -------- + >>> zrot = 1.3 # radians + >>> yrot = -0.1 + >>> xrot = 0.2 + >>> M = euler2mat(zrot, yrot, xrot) + >>> M.shape == (3, 3) + True + + The output rotation matrix is equal to the composition of the + individual rotations + + >>> M1 = euler2mat(zrot) + >>> M2 = euler2mat(0, yrot) + >>> M3 = euler2mat(0, 0, xrot) + >>> composed_M = np.dot(M3, np.dot(M2, M1)) + >>> np.allclose(M, composed_M) + True + + You can specify rotations by named arguments + + >>> np.all(M3 == euler2mat(x=xrot)) + True + + When applying M to a vector, the vector should column vector to the + right of M. If the right hand side is a 2D array rather than a + vector, then each column of the 2D array represents a vector. + + >>> vec = np.array([1, 0, 0]).reshape((3,1)) + >>> v2 = np.dot(M, vec) + >>> vecs = np.array([[1, 0, 0],[0, 1, 0]]).T # giving 3x2 array + >>> vecs2 = np.dot(M, vecs) + + Rotations are counter-clockwise. + + >>> zred = np.dot(euler2mat(z=np.pi/2), np.eye(3)) + >>> np.allclose(zred, [[0, -1, 0],[1, 0, 0], [0, 0, 1]]) + True + >>> yred = np.dot(euler2mat(y=np.pi/2), np.eye(3)) + >>> np.allclose(yred, [[0, 0, 1],[0, 1, 0], [-1, 0, 0]]) + True + >>> xred = np.dot(euler2mat(x=np.pi/2), np.eye(3)) + >>> np.allclose(xred, [[1, 0, 0],[0, 0, -1], [0, 1, 0]]) + True + + Notes + ----- + The direction of rotation is given by the right-hand rule (orient + the thumb of the right hand along the axis around which the rotation + occurs, with the end of the thumb at the positive end of the axis; + curl your fingers; the direction your fingers curl is the direction + of rotation). Therefore, the rotations are counterclockwise if + looking along the axis of rotation from positive to negative. + ''' + Ms = [] + if z: + cosz = math.cos(z) + sinz = math.sin(z) + Ms.append(np.array( + [[cosz, -sinz, 0], + [sinz, cosz, 0], + [0, 0, 1]])) + if y: + cosy = math.cos(y) + siny = math.sin(y) + Ms.append(np.array( + [[cosy, 0, siny], + [0, 1, 0], + [-siny, 0, cosy]])) + if x: + cosx = math.cos(x) + sinx = math.sin(x) + Ms.append(np.array( + [[1, 0, 0], + [0, cosx, -sinx], + [0, sinx, cosx]])) + if Ms: + return reduce(np.dot, Ms[::-1]) + return np.eye(3) + + +def mat2euler(M, cy_thresh=None): + ''' Discover Euler angle vector from 3x3 matrix + + Uses the conventions above. + + Parameters + ---------- + M : array-like, shape (3,3) + cy_thresh : None or scalar, optional + threshold below which to give up on straightforward arctan for + estimating x rotation. If None (default), estimate from + precision of input. + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Notes + ----- + If there was no numerical error, the routine could be derived using + Sympy expression for z then y then x rotation matrix, which is:: + + [ cos(y)*cos(z), -cos(y)*sin(z), sin(y)], + [cos(x)*sin(z) + cos(z)*sin(x)*sin(y), cos(x)*cos(z) - sin(x)*sin(y)*sin(z), -cos(y)*sin(x)], + [sin(x)*sin(z) - cos(x)*cos(z)*sin(y), cos(z)*sin(x) + cos(x)*sin(y)*sin(z), cos(x)*cos(y)] + + with the obvious derivations for z, y, and x + + z = atan2(-r12, r11) + y = asin(r13) + x = atan2(-r23, r33) + + Problems arise when cos(y) is close to zero, because both of:: + + z = atan2(cos(y)*sin(z), cos(y)*cos(z)) + x = atan2(cos(y)*sin(x), cos(x)*cos(y)) + + will be close to atan2(0, 0), and highly unstable. + + The ``cy`` fix for numerical instability below is from: *Graphics + Gems IV*, Paul Heckbert (editor), Academic Press, 1994, ISBN: + 0123361559. Specifically it comes from EulerAngles.c by Ken + Shoemake, and deals with the case where cos(y) is close to zero: + + See: http://www.graphicsgems.org/ + + The code appears to be licensed (from the website) as "can be used + without restrictions". + ''' + M = np.asarray(M) + if cy_thresh is None: + try: + cy_thresh = np.finfo(M.dtype).eps * 4 + except ValueError: + cy_thresh = _FLOAT_EPS_4 + r11, r12, r13, r21, r22, r23, r31, r32, r33 = M.flat + # cy: sqrt((cos(y)*cos(z))**2 + (cos(x)*cos(y))**2) + cy = math.sqrt(r33*r33 + r23*r23) + if cy > cy_thresh: # cos(y) not close to zero, standard form + z = math.atan2(-r12, r11) # atan2(cos(y)*sin(z), cos(y)*cos(z)) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = math.atan2(-r23, r33) # atan2(cos(y)*sin(x), cos(x)*cos(y)) + else: # cos(y) (close to) zero, so x -> 0.0 (see above) + # so r21 -> sin(z), r22 -> cos(z) and + z = math.atan2(r21, r22) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = 0.0 + return z, y, x + + +def euler2quat(z=0, y=0, x=0): + ''' Return quaternion corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + quat : array shape (4,) + Quaternion in w, x, y z (real, then vector) format + + Notes + ----- + We can derive this formula in Sympy using: + + 1. Formula giving quaternion corresponding to rotation of theta radians + about arbitrary axis: + http://mathworld.wolfram.com/EulerParameters.html + 2. Generated formulae from 1.) for quaternions corresponding to + theta radians rotations about ``x, y, z`` axes + 3. Apply quaternion multiplication formula - + http://en.wikipedia.org/wiki/Quaternions#Hamilton_product - to + formulae from 2.) to give formula for combined rotations. + ''' + z = z/2.0 + y = y/2.0 + x = x/2.0 + cz = math.cos(z) + sz = math.sin(z) + cy = math.cos(y) + sy = math.sin(y) + cx = math.cos(x) + sx = math.sin(x) + return np.array([ + cx*cy*cz - sx*sy*sz, + cx*sy*sz + cy*cz*sx, + cx*cz*sy - sx*cy*sz, + cx*cy*sz + sx*cz*sy]) + + +def quat2euler(q): + ''' Return Euler angles corresponding to quaternion `q` + + Parameters + ---------- + q : 4 element sequence + w, x, y, z of quaternion + + Returns + ------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``quat2mat`` and ``mat2euler`` functions, but + the reduction in computation is small, and the code repetition is + large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return mat2euler(nq.quat2mat(q)) + + +def euler2angle_axis(z=0, y=0, x=0): + ''' Return angle, axis corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + theta : scalar + angle of rotation + vector : array shape (3,) + axis around which rotation occurs + + Examples + -------- + >>> theta, vec = euler2angle_axis(0, 1.5, 0) + >>> print(theta) + 1.5 + >>> np.allclose(vec, [0, 1, 0]) + True + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return nq.quat2angle_axis(euler2quat(z, y, x)) + + +def angle_axis2euler(theta, vector, is_normalized=False): + ''' Convert angle, axis pair to Euler angles + + Parameters + ---------- + theta : scalar + angle of rotation + vector : 3 element sequence + vector specifying axis for rotation. + is_normalized : bool, optional + True if vector is already normalized (has norm of 1). Default + False + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Examples + -------- + >>> z, y, x = angle_axis2euler(0, [1, 0, 0]) + >>> np.allclose((z, y, x), 0) + True + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``angle_axis2mat`` and ``mat2euler`` + functions, but the reduction in computation is small, and the code + repetition is large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + M = nq.angle_axis2mat(theta, vector, is_normalized) + return mat2euler(M) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/utils/pc_util.py b/zoo/SimpleView/ScanObjectNN/pointnet/utils/pc_util.py new file mode 100644 index 0000000..4913231 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/utils/pc_util.py @@ -0,0 +1,198 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +# ---------------------------------------- +# Point cloud IO +# ---------------------------------------- + +def read_ply(filename): + """ read XYZ point cloud from filename PLY file """ + plydata = PlyData.read(filename) + pc = plydata['vertex'].data + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + + +def write_ply(points, filename, text=True): + """ input: Nx3, write points to filename as PLY format. """ + points = [(points[i,0], points[i,1], points[i,2]) for i in range(points.shape[0])] + vertex = np.array(points, dtype=[('x', 'f4'), ('y', 'f4'),('z', 'f4')]) + el = PlyElement.describe(vertex, 'vertex', comments=['vertices']) + PlyData([el], text=text).write(filename) + + +# ---------------------------------------- +# Simple Point cloud and Volume Renderers +# ---------------------------------------- + +def draw_point_cloud(input_points, canvasSize=500, space=200, diameter=25, + xrot=0, yrot=0, zrot=0, switch_xyz=[0,1,2], normalize=True): + """ Render point cloud to image with alpha channel. + Input: + points: Nx3 numpy array (+y is up direction) + Output: + gray image as numpy array of size canvasSizexcanvasSize + """ + image = np.zeros((canvasSize, canvasSize)) + if input_points is None or input_points.shape[0] == 0: + return image + + points = input_points[:, switch_xyz] + M = euler2mat(zrot, yrot, xrot) + points = (np.dot(M, points.transpose())).transpose() + + # Normalize the point cloud + # We normalize scale to fit points in a unit sphere + if normalize: + centroid = np.mean(points, axis=0) + points -= centroid + furthest_distance = np.max(np.sqrt(np.sum(abs(points)**2,axis=-1))) + points /= furthest_distance + + # Pre-compute the Gaussian disk + radius = (diameter-1)/2.0 + disk = np.zeros((diameter, diameter)) + for i in range(diameter): + for j in range(diameter): + if (i - radius) * (i-radius) + (j-radius) * (j-radius) <= radius * radius: + disk[i, j] = np.exp((-(i-radius)**2 - (j-radius)**2)/(radius**2)) + mask = np.argwhere(disk > 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +from PIL import Image +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +import matplotlib.pyplot as plt +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/utils/plyfile.py b/zoo/SimpleView/ScanObjectNN/pointnet/utils/plyfile.py new file mode 100644 index 0000000..69c2aa9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/utils/plyfile.py @@ -0,0 +1,916 @@ +# Copyright 2014 Darsh Ranjan +# +# This file is part of python-plyfile. +# +# python-plyfile is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# python-plyfile is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with python-plyfile. If not, see +# . + +from itertools import islice as _islice + +import numpy as _np +from sys import byteorder as _byteorder + + +try: + _range = xrange +except NameError: + _range = range + + +# Many-many relation +_data_type_relation = [ + ('int8', 'i1'), + ('char', 'i1'), + ('uint8', 'u1'), + ('uchar', 'b1'), + ('uchar', 'u1'), + ('int16', 'i2'), + ('short', 'i2'), + ('uint16', 'u2'), + ('ushort', 'u2'), + ('int32', 'i4'), + ('int', 'i4'), + ('uint32', 'u4'), + ('uint', 'u4'), + ('float32', 'f4'), + ('float', 'f4'), + ('float64', 'f8'), + ('double', 'f8') +] + +_data_types = dict(_data_type_relation) +_data_type_reverse = dict((b, a) for (a, b) in _data_type_relation) + +_types_list = [] +_types_set = set() +for (_a, _b) in _data_type_relation: + if _a not in _types_set: + _types_list.append(_a) + _types_set.add(_a) + if _b not in _types_set: + _types_list.append(_b) + _types_set.add(_b) + + +_byte_order_map = { + 'ascii': '=', + 'binary_little_endian': '<', + 'binary_big_endian': '>' +} + +_byte_order_reverse = { + '<': 'binary_little_endian', + '>': 'binary_big_endian' +} + +_native_byte_order = {'little': '<', 'big': '>'}[_byteorder] + + +def _lookup_type(type_str): + if type_str not in _data_type_reverse: + try: + type_str = _data_types[type_str] + except KeyError: + raise ValueError("field type %r not in %r" % + (type_str, _types_list)) + + return _data_type_reverse[type_str] + + +def _split_line(line, n): + fields = line.split(None, n) + if len(fields) == n: + fields.append('') + + assert len(fields) == n + 1 + + return fields + + +def make2d(array, cols=None, dtype=None): + ''' + Make a 2D array from an array of arrays. The `cols' and `dtype' + arguments can be omitted if the array is not empty. + + ''' + if (cols is None or dtype is None) and not len(array): + raise RuntimeError("cols and dtype must be specified for empty " + "array") + + if cols is None: + cols = len(array[0]) + + if dtype is None: + dtype = array[0].dtype + + return _np.fromiter(array, [('_', dtype, (cols,))], + count=len(array))['_'] + + +class PlyParseError(Exception): + + ''' + Raised when a PLY file cannot be parsed. + + The attributes `element', `row', `property', and `message' give + additional information. + + ''' + + def __init__(self, message, element=None, row=None, prop=None): + self.message = message + self.element = element + self.row = row + self.prop = prop + + s = '' + if self.element: + s += 'element %r: ' % self.element.name + if self.row is not None: + s += 'row %d: ' % self.row + if self.prop: + s += 'property %r: ' % self.prop.name + s += self.message + + Exception.__init__(self, s) + + def __repr__(self): + return ('PlyParseError(%r, element=%r, row=%r, prop=%r)' % + self.message, self.element, self.row, self.prop) + + +class PlyData(object): + + ''' + PLY file header and data. + + A PlyData instance is created in one of two ways: by the static + method PlyData.read (to read a PLY file), or directly from __init__ + given a sequence of elements (which can then be written to a PLY + file). + + ''' + + def __init__(self, elements=[], text=False, byte_order='=', + comments=[], obj_info=[]): + ''' + elements: sequence of PlyElement instances. + + text: whether the resulting PLY file will be text (True) or + binary (False). + + byte_order: '<' for little-endian, '>' for big-endian, or '=' + for native. This is only relevant if `text' is False. + + comments: sequence of strings that will be placed in the header + between the 'ply' and 'format ...' lines. + + obj_info: like comments, but will be placed in the header with + "obj_info ..." instead of "comment ...". + + ''' + if byte_order == '=' and not text: + byte_order = _native_byte_order + + self.byte_order = byte_order + self.text = text + + self.comments = list(comments) + self.obj_info = list(obj_info) + self.elements = elements + + def _get_elements(self): + return self._elements + + def _set_elements(self, elements): + self._elements = tuple(elements) + self._index() + + elements = property(_get_elements, _set_elements) + + def _get_byte_order(self): + return self._byte_order + + def _set_byte_order(self, byte_order): + if byte_order not in ['<', '>', '=']: + raise ValueError("byte order must be '<', '>', or '='") + + self._byte_order = byte_order + + byte_order = property(_get_byte_order, _set_byte_order) + + def _index(self): + self._element_lookup = dict((elt.name, elt) for elt in + self._elements) + if len(self._element_lookup) != len(self._elements): + raise ValueError("two elements with same name") + + @staticmethod + def _parse_header(stream): + ''' + Parse a PLY header from a readable file-like stream. + + ''' + lines = [] + comments = {'comment': [], 'obj_info': []} + while True: + line = stream.readline().decode('ascii').strip() + fields = _split_line(line, 1) + + if fields[0] == 'end_header': + break + + elif fields[0] in comments.keys(): + lines.append(fields) + else: + lines.append(line.split()) + + a = 0 + if lines[a] != ['ply']: + raise PlyParseError("expected 'ply'") + + a += 1 + while lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + if lines[a][0] != 'format': + raise PlyParseError("expected 'format'") + + if lines[a][2] != '1.0': + raise PlyParseError("expected version '1.0'") + + if len(lines[a]) != 3: + raise PlyParseError("too many fields after 'format'") + + fmt = lines[a][1] + + if fmt not in _byte_order_map: + raise PlyParseError("don't understand format %r" % fmt) + + byte_order = _byte_order_map[fmt] + text = fmt == 'ascii' + + a += 1 + while a < len(lines) and lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + return PlyData(PlyElement._parse_multi(lines[a:]), + text, byte_order, + comments['comment'], comments['obj_info']) + + @staticmethod + def read(stream): + ''' + Read PLY data from a readable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'read') + try: + data = PlyData._parse_header(stream) + for elt in data: + elt._read(stream, data.text, data.byte_order) + finally: + if must_close: + stream.close() + + return data + + def write(self, stream): + ''' + Write PLY data to a writeable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'write') + try: + stream.write(self.header.encode('ascii')) + stream.write(b'\r\n') + for elt in self: + elt._write(stream, self.text, self.byte_order) + finally: + if must_close: + stream.close() + + @property + def header(self): + ''' + Provide PLY-formatted metadata for the instance. + + ''' + lines = ['ply'] + + if self.text: + lines.append('format ascii 1.0') + else: + lines.append('format ' + + _byte_order_reverse[self.byte_order] + + ' 1.0') + + # Some information is lost here, since all comments are placed + # between the 'format' line and the first element. + for c in self.comments: + lines.append('comment ' + c) + + for c in self.obj_info: + lines.append('obj_info ' + c) + + lines.extend(elt.header for elt in self.elements) + lines.append('end_header') + return '\r\n'.join(lines) + + def __iter__(self): + return iter(self.elements) + + def __len__(self): + return len(self.elements) + + def __contains__(self, name): + return name in self._element_lookup + + def __getitem__(self, name): + return self._element_lookup[name] + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyData(%r, text=%r, byte_order=%r, ' + 'comments=%r, obj_info=%r)' % + (self.elements, self.text, self.byte_order, + self.comments, self.obj_info)) + + +def _open_stream(stream, read_or_write): + if hasattr(stream, read_or_write): + return (False, stream) + try: + return (True, open(stream, read_or_write[0] + 'b')) + except TypeError: + raise RuntimeError("expected open file or filename") + + +class PlyElement(object): + + ''' + PLY file element. + + A client of this library doesn't normally need to instantiate this + directly, so the following is only for the sake of documenting the + internals. + + Creating a PlyElement instance is generally done in one of two ways: + as a byproduct of PlyData.read (when reading a PLY file) and by + PlyElement.describe (before writing a PLY file). + + ''' + + def __init__(self, name, properties, count, comments=[]): + ''' + This is not part of the public interface. The preferred methods + of obtaining PlyElement instances are PlyData.read (to read from + a file) and PlyElement.describe (to construct from a numpy + array). + + ''' + self._name = str(name) + self._check_name() + self._count = count + + self._properties = tuple(properties) + self._index() + + self.comments = list(comments) + + self._have_list = any(isinstance(p, PlyListProperty) + for p in self.properties) + + @property + def count(self): + return self._count + + def _get_data(self): + return self._data + + def _set_data(self, data): + self._data = data + self._count = len(data) + self._check_sanity() + + data = property(_get_data, _set_data) + + def _check_sanity(self): + for prop in self.properties: + if prop.name not in self._data.dtype.fields: + raise ValueError("dangling property %r" % prop.name) + + def _get_properties(self): + return self._properties + + def _set_properties(self, properties): + self._properties = tuple(properties) + self._check_sanity() + self._index() + + properties = property(_get_properties, _set_properties) + + def _index(self): + self._property_lookup = dict((prop.name, prop) + for prop in self._properties) + if len(self._property_lookup) != len(self._properties): + raise ValueError("two properties with same name") + + def ply_property(self, name): + return self._property_lookup[name] + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "element name %r contains spaces" % self._name + raise ValueError(msg) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype of the in-memory representation of the + data. (If there are no list properties, and the PLY format is + binary, then this also accurately describes the on-disk + representation of the element.) + + ''' + return [(prop.name, prop.dtype(byte_order)) + for prop in self.properties] + + @staticmethod + def _parse_multi(header_lines): + ''' + Parse a list of PLY element definitions. + + ''' + elements = [] + while header_lines: + (elt, header_lines) = PlyElement._parse_one(header_lines) + elements.append(elt) + + return elements + + @staticmethod + def _parse_one(lines): + ''' + Consume one element definition. The unconsumed input is + returned along with a PlyElement instance. + + ''' + a = 0 + line = lines[a] + + if line[0] != 'element': + raise PlyParseError("expected 'element'") + if len(line) > 3: + raise PlyParseError("too many fields after 'element'") + if len(line) < 3: + raise PlyParseError("too few fields after 'element'") + + (name, count) = (line[1], int(line[2])) + + comments = [] + properties = [] + while True: + a += 1 + if a >= len(lines): + break + + if lines[a][0] == 'comment': + comments.append(lines[a][1]) + elif lines[a][0] == 'property': + properties.append(PlyProperty._parse_one(lines[a])) + else: + break + + return (PlyElement(name, properties, count, comments), + lines[a:]) + + @staticmethod + def describe(data, name, len_types={}, val_types={}, + comments=[]): + ''' + Construct a PlyElement from an array's metadata. + + len_types and val_types can be given as mappings from list + property names to type strings (like 'u1', 'f4', etc., or + 'int8', 'float32', etc.). These can be used to define the length + and value types of list properties. List property lengths + always default to type 'u1' (8-bit unsigned integer), and value + types default to 'i4' (32-bit integer). + + ''' + if not isinstance(data, _np.ndarray): + raise TypeError("only numpy arrays are supported") + + if len(data.shape) != 1: + raise ValueError("only one-dimensional arrays are " + "supported") + + count = len(data) + + properties = [] + descr = data.dtype.descr + + for t in descr: + if not isinstance(t[1], str): + raise ValueError("nested records not supported") + + if not t[0]: + raise ValueError("field with empty name") + + if len(t) != 2 or t[1][1] == 'O': + # non-scalar field, which corresponds to a list + # property in PLY. + + if t[1][1] == 'O': + if len(t) != 2: + raise ValueError("non-scalar object fields not " + "supported") + + len_str = _data_type_reverse[len_types.get(t[0], 'u1')] + if t[1][1] == 'O': + val_type = val_types.get(t[0], 'i4') + val_str = _lookup_type(val_type) + else: + val_str = _lookup_type(t[1][1:]) + + prop = PlyListProperty(t[0], len_str, val_str) + else: + val_str = _lookup_type(t[1][1:]) + prop = PlyProperty(t[0], val_str) + + properties.append(prop) + + elt = PlyElement(name, properties, count, comments) + elt.data = data + + return elt + + def _read(self, stream, text, byte_order): + ''' + Read the actual data from a PLY file. + + ''' + if text: + self._read_txt(stream) + else: + if self._have_list: + # There are list properties, so a simple load is + # impossible. + self._read_bin(stream, byte_order) + else: + # There are no list properties, so loading the data is + # much more straightforward. + self._data = _np.fromfile(stream, + self.dtype(byte_order), + self.count) + + if len(self._data) < self.count: + k = len(self._data) + del self._data + raise PlyParseError("early end-of-file", self, k) + + self._check_sanity() + + def _write(self, stream, text, byte_order): + ''' + Write the data to a PLY file. + + ''' + if text: + self._write_txt(stream) + else: + if self._have_list: + # There are list properties, so serialization is + # slightly complicated. + self._write_bin(stream, byte_order) + else: + # no list properties, so serialization is + # straightforward. + self.data.astype(self.dtype(byte_order), + copy=False).tofile(stream) + + def _read_txt(self, stream): + ''' + Load a PLY element from an ASCII-format PLY file. The element + may contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype()) + + k = 0 + for line in _islice(iter(stream.readline, b''), self.count): + fields = iter(line.strip().split()) + for prop in self.properties: + try: + self._data[prop.name][k] = prop._from_fields(fields) + except StopIteration: + raise PlyParseError("early end-of-line", + self, k, prop) + except ValueError: + raise PlyParseError("malformed input", + self, k, prop) + try: + next(fields) + except StopIteration: + pass + else: + raise PlyParseError("expected end-of-line", self, k) + k += 1 + + if k < self.count: + del self._data + raise PlyParseError("early end-of-file", self, k) + + def _write_txt(self, stream): + ''' + Save a PLY element to an ASCII-format PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + fields = [] + for prop in self.properties: + fields.extend(prop._to_fields(rec[prop.name])) + + _np.savetxt(stream, [fields], '%.18g', newline='\r\n') + + def _read_bin(self, stream, byte_order): + ''' + Load a PLY element from a binary PLY file. The element may + contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype(byte_order)) + + for k in _range(self.count): + for prop in self.properties: + try: + self._data[prop.name][k] = \ + prop._read_bin(stream, byte_order) + except StopIteration: + raise PlyParseError("early end-of-file", + self, k, prop) + + def _write_bin(self, stream, byte_order): + ''' + Save a PLY element to a binary PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + for prop in self.properties: + prop._write_bin(rec[prop.name], stream, byte_order) + + @property + def header(self): + ''' + Format this element's metadata as it would appear in a PLY + header. + + ''' + lines = ['element %s %d' % (self.name, self.count)] + + # Some information is lost here, since all comments are placed + # between the 'element' line and the first property definition. + for c in self.comments: + lines.append('comment ' + c) + + lines.extend(list(map(str, self.properties))) + + return '\r\n'.join(lines) + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyElement(%r, %r, count=%d, comments=%r)' % + (self.name, self.properties, self.count, + self.comments)) + + +class PlyProperty(object): + + ''' + PLY property description. This class is pure metadata; the data + itself is contained in PlyElement instances. + + ''' + + def __init__(self, name, val_dtype): + self._name = str(name) + self._check_name() + self.val_dtype = val_dtype + + def _get_val_dtype(self): + return self._val_dtype + + def _set_val_dtype(self, val_dtype): + self._val_dtype = _data_types[_lookup_type(val_dtype)] + + val_dtype = property(_get_val_dtype, _set_val_dtype) + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "Error: property name %r contains spaces" % self._name + raise RuntimeError(msg) + + @staticmethod + def _parse_one(line): + assert line[0] == 'property' + + if line[1] == 'list': + if len(line) > 5: + raise PlyParseError("too many fields after " + "'property list'") + if len(line) < 5: + raise PlyParseError("too few fields after " + "'property list'") + + return PlyListProperty(line[4], line[2], line[3]) + + else: + if len(line) > 3: + raise PlyParseError("too many fields after " + "'property'") + if len(line) < 3: + raise PlyParseError("too few fields after " + "'property'") + + return PlyProperty(line[2], line[1]) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype description for this property (as a tuple + of strings). + + ''' + return byte_order + self.val_dtype + + def _from_fields(self, fields): + ''' + Parse from generator. Raise StopIteration if the property could + not be read. + + ''' + return _np.dtype(self.dtype()).type(next(fields)) + + def _to_fields(self, data): + ''' + Return generator over one item. + + ''' + yield _np.dtype(self.dtype()).type(data) + + def _read_bin(self, stream, byte_order): + ''' + Read data from a binary stream. Raise StopIteration if the + property could not be read. + + ''' + try: + return _np.fromfile(stream, self.dtype(byte_order), 1)[0] + except IndexError: + raise StopIteration + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + _np.dtype(self.dtype(byte_order)).type(data).tofile(stream) + + def __str__(self): + val_str = _data_type_reverse[self.val_dtype] + return 'property %s %s' % (val_str, self.name) + + def __repr__(self): + return 'PlyProperty(%r, %r)' % (self.name, + _lookup_type(self.val_dtype)) + + +class PlyListProperty(PlyProperty): + + ''' + PLY list property description. + + ''' + + def __init__(self, name, len_dtype, val_dtype): + PlyProperty.__init__(self, name, val_dtype) + + self.len_dtype = len_dtype + + def _get_len_dtype(self): + return self._len_dtype + + def _set_len_dtype(self, len_dtype): + self._len_dtype = _data_types[_lookup_type(len_dtype)] + + len_dtype = property(_get_len_dtype, _set_len_dtype) + + def dtype(self, byte_order='='): + ''' + List properties always have a numpy dtype of "object". + + ''' + return '|O' + + def list_dtype(self, byte_order='='): + ''' + Return the pair (len_dtype, val_dtype) (both numpy-friendly + strings). + + ''' + return (byte_order + self.len_dtype, + byte_order + self.val_dtype) + + def _from_fields(self, fields): + (len_t, val_t) = self.list_dtype() + + n = int(_np.dtype(len_t).type(next(fields))) + + data = _np.loadtxt(list(_islice(fields, n)), val_t, ndmin=1) + if len(data) < n: + raise StopIteration + + return data + + def _to_fields(self, data): + ''' + Return generator over the (numerical) PLY representation of the + list data (length followed by actual data). + + ''' + (len_t, val_t) = self.list_dtype() + + data = _np.asarray(data, dtype=val_t).ravel() + + yield _np.dtype(len_t).type(data.size) + for x in data: + yield x + + def _read_bin(self, stream, byte_order): + (len_t, val_t) = self.list_dtype(byte_order) + + try: + n = _np.fromfile(stream, len_t, 1)[0] + except IndexError: + raise StopIteration + + data = _np.fromfile(stream, val_t, n) + if len(data) < n: + raise StopIteration + + return data + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + (len_t, val_t) = self.list_dtype(byte_order) + + data = _np.asarray(data, dtype=val_t).ravel() + + _np.array(data.size, dtype=len_t).tofile(stream) + data.tofile(stream) + + def __str__(self): + len_str = _data_type_reverse[self.len_dtype] + val_str = _data_type_reverse[self.val_dtype] + return 'property list %s %s %s' % (len_str, val_str, self.name) + + def __repr__(self): + return ('PlyListProperty(%r, %r, %r)' % + (self.name, + _lookup_type(self.len_dtype), + _lookup_type(self.val_dtype))) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet/utils/tf_util.py b/zoo/SimpleView/ScanObjectNN/pointnet/utils/tf_util.py new file mode 100644 index 0000000..4276efa --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet/utils/tf_util.py @@ -0,0 +1,575 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2016 +""" + +import numpy as np +import tensorflow as tf + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + + + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1], bn_decay) + + + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2], bn_decay) + + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/draw_cmat.py b/zoo/SimpleView/ScanObjectNN/pointnet2/draw_cmat.py new file mode 100644 index 0000000..ef09773 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/draw_cmat.py @@ -0,0 +1,234 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='confusion_matrix/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + current_pred.append(pred_val[i-start_idx]) + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + #Plot confusion matrix + current_pred = np.array(current_pred) + groundtruth = current_label.flatten() + predictions = current_pred.flatten() + + mat = confusion_matrix(groundtruth, predictions) + + plt.style.use('seaborn-paper') + plt.rcParams["figure.figsize"] = (10,10) + ax = plt.subplot(111) + cmap = plt.cm.Reds + mat = mat.astype('float') / mat.sum(axis=1)[:, np.newaxis] + mat = np.nan_to_num(mat, copy=True) + + plt.imshow(mat, interpolation='nearest', cmap=cmap) + # cbar = plt.colorbar(fraction=0.03, pad=0.05, aspect=30) + # cbar.ax.tick_params(labelsize=10) + tick_marks = np.arange(len(SHAPE_NAMES)) + plt.xticks(tick_marks, SHAPE_NAMES, rotation=90) + plt.yticks(tick_marks, SHAPE_NAMES) + + plt.ylabel('Ground truth') + plt.xlabel('Prediction') + + for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] + + ax.get_xticklabels() + ax.get_yticklabels()): + item.set_fontsize(36) + + plt.tight_layout() + plt.savefig(os.path.join(DUMP_DIR,'matrix.pdf')) + plt.show() + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_partseg.py b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_partseg.py new file mode 100644 index 0000000..2c01261 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_partseg.py @@ -0,0 +1,278 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import json + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_partseg', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=2048, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='../../../../pointnet2/log_partseg_chairs_augmented25rot/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_partseg_augmented25rot/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=1.0, help='Segmentation weight in loss') + +# parser.add_argument('--test_file', default = '../training_data/test_objectdataset_v1.pickle', help='Location of test file') +parser.add_argument('--test_file', default = '/home/vgd/object_dataset/parts/test_objectdataset_augmented25rot.h5', help='Location of test file') + +parser.add_argument('--visu_mask', default = False, help='Whether to dump mask [default: False]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +NUM_CLASSES = 6 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/chair_parts.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TEST_DATA, TEST_LABELS, TEST_PARTS = data_utils.load_parts_h5(TEST_FILE) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +color_map_file = '../part_color_mapping.json' +color_map = json.load(open(color_map_file, 'r')) +def output_color_point_cloud(data, seg, out_file): + with open(out_file, 'w') as f: + l = len(seg) + for i in range(l): + color = color_map[seg[i]] + f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) + +def save_binfiles(pc, parts, fname): + print(pc.shape) + num_vertices = pc.shape[0] + print(num_vertices) + pc = pc.flatten() + + object_bin = [] + object_bin.append(num_vertices) + + for i in range(pc.shape[0]): + object_bin.append(pc[i]) + if i%3==2: + ##insert dummy colors, normal nyu and label + for j in range(8): + object_bin.append(1.0) + + # object_bin.append(parts[int((i-2)/3)]) + + object_bin = np.array(object_bin) + print(object_bin.shape) + + object_bin.astype('float32').tofile(fname+'.bin') + # exit() + + ##output parts_bin + parts_bin = [] + parts_bin.append(num_vertices) + for i in range(parts.shape[0]): + parts_bin.append(parts[i]) + parts_bin.append(parts[i]) + + parts_bin = np.array(parts_bin) + print(parts_bin.shape) + parts_bin.astype('float32').tofile(fname+'_part.bin') + + # print(parts_bin) + # print(np.unique(parts_bin)) + # exit() + +# for i in range(len(TEST_DATA)): +# fname = str(i)+'_gt_debug.obj' +# output_color_point_cloud(TEST_DATA[i], TEST_PARTS[i],fname) +# # save_binfiles(TEST_DATA[i], TEST_PARTS[i],fname) +# exit() + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, parts_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + seg_pred = MODEL.get_model(pointclouds_pl, is_training_pl) + total_loss = MODEL.get_loss(seg_pred, parts_pl) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'parts_pl': parts_pl, + 'is_training_pl': is_training_pl, + 'seg_pred': seg_pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + total_correct_seg = 0 + + current_data, current_label, current_parts = data_utils.get_current_data_parts_h5(TEST_DATA, TEST_LABELS, TEST_PARTS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_parts = np.squeeze(current_parts) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_seg_sum = np.zeros((cur_batch_size, NUM_POINT, NUM_CLASSES)) # score for classes + for vote_idx in range(num_votes): + # rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + # vote_idx/float(num_votes) * np.pi * 2) + rotated_data = current_data[start_idx:end_idx, :, :] + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['parts_pl']: current_parts[start_idx:end_idx], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, seg_val = sess.run([ops['loss'], ops['seg_pred']], + feed_dict=feed_dict) + + batch_seg_sum += seg_val + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + # Aggregating END + seg_val = np.argmax(batch_seg_sum, 2) + seg_correct = np.sum(seg_val == current_parts[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + parts = current_parts[i] + for j in range(len(parts)): + part = parts[j] + + total_seen_class[part] += 1 + total_correct_class[part] += (seg_val[i-start_idx][j] == part) + + total_parts_seen = 0 + cum_sum = 0 + part_accs = [] + + # fname = str(start_idx)+'_gt' + # fname = os.path.join(DUMP_DIR, fname) + # save_binfiles(current_data[start_idx,:,:], current_parts[start_idx],fname) + + # fname = str(start_idx)+'_pred' + # fname = os.path.join(DUMP_DIR, fname) + # save_binfiles(current_data[start_idx,:,:], seg_val[0],fname) + + # fname = str(start_idx)+'_pred.obj' + # fname = os.path.join(DUMP_DIR, fname) + # output_color_point_cloud(current_data[start_idx,:,:], seg_val[0],fname) + + # fname = str(start_idx)+'_gt.obj' + # fname = os.path.join(DUMP_DIR, fname) + # output_color_point_cloud(current_data[start_idx,:,:], current_parts[start_idx],fname) + + for i in range(NUM_CLASSES): + if (total_seen_class[i]==0): + part_accs.append(-1.0) + continue + part_acc = float(total_correct_class[i])/float(total_seen_class[i]) + cum_sum += part_acc + part_accs.append(part_acc) + total_parts_seen +=1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + log_string('eval avg class acc: %f' % (cum_sum/float(total_parts_seen))) + + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, part_accs[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=1) + LOG_FOUT.close() + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_real_trained_on_synthetic.py b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_real_trained_on_synthetic.py new file mode 100644 index 0000000..6d9c7ed --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_real_trained_on_synthetic.py @@ -0,0 +1,264 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_real_trained_on_synthetic/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 40, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +# NUM_CLASSES = 10 +# SHAPE_NAMES = [line.rstrip() for line in \ +# open( '../training_data/shape_names.txt')] + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in OBJECTDATASET_TO_MODELNET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 40)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 40)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen +=1 + if (pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET.keys()): + continue + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + # if (pred_val[i-start_idx] == current_label[i]): + if (pred == current_label[i]): + total_correct +=1 + + for i in range(start_idx, end_idx): + + l = current_label[i] + total_seen_class[l] += 1 + + if pred_val[i-start_idx] not in MODELNET_TO_OBJECTDATASET: + pred_label = "NA" + else: + pred = MODELNET_TO_OBJECTDATASET[pred_val[i-start_idx]] + total_correct_class[l] += (pred == l) + + pred_label = SHAPE_NAMES[pred] + + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[l] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, groundtruth_label, + pred_label) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, + pred_label) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_scenennobjects.py new file mode 100644 index 0000000..6a28730 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_scenennobjects.py @@ -0,0 +1,237 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') + +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = FLAGS.num_class +if (NUM_CLASSES==11): + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_combined.txt')] +else: + SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] +print("Number of Classes: "+str(NUM_CLASSES)) + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def corrupt(batch_data): + output = [] + for i in range(batch_data.shape[0]): + pc = batch_data[i,:,:] + pc = pc[pc[:,2]> THRESH,:] + output.append(pc) + + if (pc.shape[0]<1024): + print("Few points") + + return output + +def collect_points(pc): + if (pc.shape[0]>=NUM_POINT): + return pc[:NUM_POINT,:] + else: + # print(pc.shape) + # print(pc[0:NUM_POINT-pc.shape[0],:].shape) + # print(np.concatenate((np.array(pc), np.array(pc[0:NUM_POINT-pc.shape[0],:])), axis=0).shape) + # exit() + return np.concatenate((np.array(pc), np.array(pc[0:NUM_POINT-pc.shape[0],:])), axis=0) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + ply_filename = os.path.join(DUMP_DIR, ply_filename) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_seg_scenennobjects.py b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_seg_scenennobjects.py new file mode 100644 index 0000000..93666b9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_seg_scenennobjects.py @@ -0,0 +1,378 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +import json + +import itertools +import scipy.stats as stats +import matplotlib as mpl +import matplotlib.pyplot as plt +from sklearn.metrics import confusion_matrix + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_bga', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +# ##use all 2048 for visualization +# parser.add_argument('--num_point', type=int, default=2048, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--model_path', default='BGA_PN2/log_PBT50RS_seg2_v2/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') + +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +parser.add_argument('--visu_mask', default = True, help='Whether to dump mask [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +SEG_WEIGHT = FLAGS.seg_weight +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +NUM_CLASSES = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(2468) + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +color_map_file = '../part_color_mapping.json' +color_map = json.load(open(color_map_file, 'r')) +def output_color_point_cloud(data, seg, out_file): + with open(out_file, 'w') as f: + l = len(seg) + for i in range(l): + color = color_map[int(seg[i])] + f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) + +def save_binfiles(pc, parts, fname): + print(pc.shape) + num_vertices = pc.shape[0] + print(num_vertices) + pc = pc.flatten() + + object_bin = [] + object_bin.append(num_vertices) + + for i in range(pc.shape[0]): + object_bin.append(pc[i]) + if i%3==2: + ##insert dummy colors, normal nyu and label + for j in range(8): + object_bin.append(1.0) + + # object_bin.append(parts[int((i-2)/3)]) + + object_bin = np.array(object_bin) + print(object_bin.shape) + + object_bin.astype('float32').tofile(fname+'.bin') + # exit() + + ##output parts_bin + parts_bin = [] + parts_bin.append(num_vertices) + for i in range(parts.shape[0]): + parts_bin.append(parts[i]) + parts_bin.append(parts[i]) + + parts_bin = np.array(parts_bin) + print(parts_bin.shape) + parts_bin.astype('float32').tofile(fname+'_part.bin') + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, masks_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + class_pred, seg_pred = MODEL.get_model(pointclouds_pl, is_training_pl) + total_loss, classify_loss, seg_loss = MODEL.get_loss(class_pred, seg_pred, labels_pl, masks_pl, seg_weight=SEG_WEIGHT) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': class_pred, + 'seg_pred': seg_pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + total_correct_seg = 0 + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT, shuffle=False) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + current_pred = [] + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_seg_sum = np.zeros((cur_batch_size, NUM_POINT, 2)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val, seg_val = sess.run([ops['loss'], ops['pred'],ops['seg_pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_seg_sum += seg_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + seg_val = np.argmax(batch_seg_sum, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + current_pred.append(pred_val[i-start_idx]) + + fout.write('%s, %s\n' % (SHAPE_NAMES[pred_val[i-start_idx]], SHAPE_NAMES[l])) + + gt_mask = current_mask[i] + pred_mask = seg_val[i-start_idx] + + pred_mask_idx = np.where(pred_mask==1)[0] + gt_mask_idx = np.where(gt_mask==1)[0] + correct_obj_mask = np.where((pred_mask==gt_mask) & (pred_mask==1))[0] + + if (len(correct_obj_mask)==1): + continue + + if (FLAGS.visu_mask and pred_val[i-start_idx] == l): + fname = str(start_idx)+'_gt' + fname = os.path.join(DUMP_DIR, fname) + save_binfiles(current_data[start_idx,:,:], gt_mask,fname) + + fname = str(start_idx)+'_pred' + fname = os.path.join(DUMP_DIR, fname) + save_binfiles(current_data[start_idx,:,:], pred_mask,fname) + + fname = str(start_idx)+'_pred.obj' + fname = os.path.join(DUMP_DIR, fname) + output_color_point_cloud(current_data[start_idx,:,:], pred_mask,fname) + + fname = str(start_idx)+'_gt.obj' + fname = os.path.join(DUMP_DIR, fname) + output_color_point_cloud(current_data[start_idx,:,:], gt_mask,fname) + + ###1) + img_filename = '%d_label_%s_pred_%s_gtmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, gt_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + # #save ply + # ply_filename = '%d_label_%s_pred_%s_gtmask.ply' % (i, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, gt_mask_idx, :]),ply_filename) + + ###2) + img_filename = '%d_label_%s_pred_%s_predmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, pred_mask_idx, :])) + scipy.misc.imsave(img_filename, output_img) + + # #save ply + # ply_filename = '%d_label_%s_pred_%s_predmask.ply' % (i, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, pred_mask_idx, :]),ply_filename) + + ###3) + img_filename = '%d_label_%s_pred_%s_correctpredmask.jpg' % (i, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, correct_obj_mask, :])) + scipy.misc.imsave(img_filename, output_img) + + # #save ply + # ply_filename = '%d_label_%s_pred_%s_correctpredmask.ply' % (i, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, correct_obj_mask, :]),ply_filename) + + # if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + # img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # img_filename = os.path.join(DUMP_DIR, img_filename) + # output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + # scipy.misc.imsave(img_filename, output_img) + # #save ply + # ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, SHAPE_NAMES[l], + # SHAPE_NAMES[pred_val[i-start_idx]]) + # ply_filename = os.path.join(DUMP_DIR, ply_filename) + # data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + # error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + # #Plot confusion matrix + # current_pred = np.array(current_pred) + # groundtruth = current_label.flatten() + # predictions = current_pred.flatten() + + # mat = confusion_matrix(groundtruth, predictions) + + # plt.style.use('seaborn-paper') + # plt.rcParams["figure.figsize"] = (10,10) + # ax = plt.subplot(111) + # cmap = plt.cm.Reds + # mat = mat.astype('float') / mat.sum(axis=1)[:, np.newaxis] + # mat = np.nan_to_num(mat, copy=True) + + # plt.imshow(mat, interpolation='nearest', cmap=cmap) + # cbar = plt.colorbar(fraction=0.03, pad=0.05, aspect=30) + # cbar.ax.tick_params(labelsize=10) + # tick_marks = np.arange(len(SHAPE_NAMES)) + # plt.xticks(tick_marks, SHAPE_NAMES, rotation=90) + # plt.yticks(tick_marks, SHAPE_NAMES) + + # plt.ylabel('Ground truth') + # plt.xlabel('Prediction') + + # for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] + + # ax.get_xticklabels() + ax.get_yticklabels()): + # item.set_fontsize(10) + + # plt.tight_layout() + # plt.savefig(os.path.join(DUMP_DIR,'matrix.pdf')) + # plt.show() + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_synthetic_trained_on_real.py b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_synthetic_trained_on_real.py new file mode 100644 index 0000000..70455b4 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/evaluate_synthetic_trained_on_real.py @@ -0,0 +1,268 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils +import pc_util +from mapping2 import * + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') + +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump_synthetic_trained_on_real/', help='dump folder path [dump]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--test_file', default = 'modelnet/modelnet_test.h5', help='Location of test file') + +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +parser.add_argument('--visu', default = False, help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +# NUM_CLASSES = 10 +# SHAPE_NAMES = [line.rstrip() for line in \ +# open( '../training_data/shape_names.txt')] + +NUM_C = 15 +SHAPE_NAMES = [line.rstrip() for line in \ + open( '../training_data/shape_names_ext.txt')] + +HOSTNAME = socket.gethostname() + +np.random.seed(0) + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, num_class=NUM_CLASSES) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_C)] + total_correct_class = [0 for _ in range(NUM_C)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + + # data_utils.shuffle_points(TEST_DATA) + + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + # current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + #################################################### + print(current_data.shape) + print(current_label.shape) + + filtered_data = [] + filtered_label = [] + for i in range(current_label.shape[0]): + if (current_label[i] in MODELNET_TO_OBJECTDATASET.keys()): + filtered_label.append(current_label[i]) + filtered_data.append(current_data[i,:]) + + filtered_data = np.array(filtered_data) + filtered_label = np.array(filtered_label) + print(filtered_data.shape) + print(filtered_label.shape) + + current_data = filtered_data + current_label = filtered_label + ################################################### + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, 15)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, 15)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + for i in range(start_idx, end_idx): + total_seen += 1 + if (pred_val[i-start_idx] not in OBJECTDATASET_TO_MODELNET.keys()): + continue + else: + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (current_label[i] in possible_label): + total_correct +=1 + + # correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + # total_correct += correct + # total_seen += cur_batch_size + + # loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + if (pred_val[i-start_idx] in OBJECTDATASET_TO_MODELNET.keys()): + possible_label = OBJECTDATASET_TO_MODELNET[pred_val[i-start_idx]] + if (l in possible_label): + total_correct_class[MODELNET_TO_OBJECTDATASET[l]] += 1 + + + pred_label = SHAPE_NAMES[pred_val[i-start_idx]] + # groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + groundtruth_label = SHAPE_NAMES[MODELNET_TO_OBJECTDATASET[l]] + + fout.write('%s, %s\n' % (pred_label, groundtruth_label)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, groundtruth_label, + pred_label) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + + #save ply + ply_filename = '%d_label_%s_pred_%s.ply' % (error_cnt, groundtruth_label, + pred_label) + data_utils.save_ply(np.squeeze(current_data[i, :, :]),ply_filename) + error_cnt += 1 + + log_string('total seen: %d' % (total_seen)) + # log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + seen_class_accuracies = [] + seen_correct_class = [] + for i in range(len(total_seen_class)): + if total_seen_class[i] != 0 : + seen_class_accuracies.append(total_seen_class[i]) + seen_correct_class.append(total_correct_class[i]) + log_string('eval avg class acc: %f' % (np.mean(np.array(seen_correct_class)/np.array(seen_class_accuracies,dtype=np.float)))) + + for i, name in enumerate(SHAPE_NAMES): + if (total_seen_class[i] == 0): + accuracy = -1 + else: + accuracy = total_correct_class[i]/float(total_seen_class[i]) + log_string('%10s:\t%0.3f' % (name, accuracy)) + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_bga.py b/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_bga.py new file mode 100644 index 0000000..0acec2b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_bga.py @@ -0,0 +1,99 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +NUM_CLASSES = 15 +BACKGROUND_CLASS = -1 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + mask_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, mask_pl + + +def get_model(point_cloud, is_training, bn_decay=None, num_class=NUM_CLASSES): + """ Part segmentation PointNet, input is BxNx3 (XYZ) """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = None + + # Set Abstraction layers + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=64, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + ###########CLASSIFICATION BRANCH + # print(l3_xyz.shape) + # print(l3_points.shape) + net = tf.reshape(l3_points, [batch_size, -1]) + # print(net.shape) + # print() + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + + # print("Classification feature vector") + class_vector = tf.expand_dims(net, axis=1) + # print(class_vector.shape) + # print() + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp2') + class_pred = tf_util.fully_connected(net, num_class, activation_fn=None, scope='fc3') + + ###########SEGMENTATION BRANCH + # Feature Propagation layers + l3_points_concat = tf.concat([l3_points, class_vector], axis=2) + + # l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points_concat, [256,256], is_training, bn_decay, scope='fa_layer1') + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, class_vector, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, l0_points, l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer3') + + # FC layers + # print(l0_points.shape) + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='seg_fc1', bn_decay=bn_decay) + # print(net.shape) + # print() + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='seg_dp1') + seg_pred = tf_util.conv1d(net, 2, 1, padding='VALID', activation_fn=None, scope='seg_fc2') + # print(seg_pred.shape) + # exit() + + # print(class_pred.shape) + # print(seg_pred.shape) + # exit() + + return class_pred, seg_pred + + +def get_loss(class_pred, seg_pred, gt_label, gt_mask, seg_weight = 0.5): + """ pred: BxNxC, + label: BxN, """ + batch_size = gt_mask.shape[0] + num_point = gt_mask.shape[1] + + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_pred, labels=gt_label) + classify_loss = tf.reduce_mean(loss) + + #mask loss + ###convert mask to binary mask + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_mask), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + total_loss = (1-seg_weight)*classify_loss + seg_weight*seg_loss + return total_loss, classify_loss, seg_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_partseg.py b/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_partseg.py new file mode 100644 index 0000000..82327b7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_partseg.py @@ -0,0 +1,93 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +NUM_CLASSES = 6 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + mask_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, mask_pl + + +def get_model(point_cloud, is_training, bn_decay=None, num_class = NUM_CLASSES): + """ Part segmentation PointNet, input is BxNx3 (XYZ) """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = None + + # Set Abstraction layers + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=64, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + ###########SEGMENTATION BRANCH + # Feature Propagation layers + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, l0_points, l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer3') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='seg_fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='seg_dp1') + seg_pred = tf_util.conv1d(net, num_class, 1, padding='VALID', activation_fn=None, scope='seg_fc2') + + return seg_pred + +def tf_count(t, val): + elements_equal_to_value = tf.equal(t, val) + as_ints = tf.cast(elements_equal_to_value, tf.int32) + count = tf.reduce_sum(as_ints) + + return count + +def get_loss(seg_pred, gt_seg): + """ pred: BxNxC, + label: BxN, """ + batch_size = gt_seg.shape[0] + num_point = gt_seg.shape[1] + + # ##try adaptive weights + # count_0 = tf.cast(tf_count(gt_seg, 0), tf.float32) + # count_2 = tf.cast(tf_count(gt_seg, 2), tf.float32) + # count_3 = tf.cast(tf_count(gt_seg, 3), tf.float32) + # count_4 = tf.cast(tf_count(gt_seg, 4), tf.float32) + # count_5 = tf.cast(tf_count(gt_seg, 5), tf.float32) + # total_count = tf.cast(count_0 + count_2 + count_3 + count_4 + count_5, tf.float32) + # labels_one_hot = tf.one_hot(gt_seg, 6, on_value=1.0, off_value=0.0) + # class_weights = [total_count/count_0, 1.0, total_count/count_2, total_count/count_3, total_count/count_4, total_count/count_5] + + # weights = tf.reduce_sum(class_weights*labels_one_hot, axis=-1) + # unweighted_loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_seg) + # seg_loss = tf.reduce_mean(weights*unweighted_loss) + + ##try weighted loss + # labels_one_hot = tf.one_hot(gt_seg, 6, on_value=1.0, off_value=0.0) + # # class_weights = [1.0, 1.0, 10.0, 40.0, 30.0, 10.0] + # class_weights = [1.0, 3.0, 3.0, 3.0, 3.0, 3.0] + # weights = tf.reduce_sum(class_weights*labels_one_hot, axis=-1) + # unweighted_loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_seg) + # seg_loss = tf.reduce_mean(weights*unweighted_loss) + + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=gt_seg), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + + total_loss = seg_loss + + return total_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_ssg.py b/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_ssg.py new file mode 100644 index 0000000..8f0609a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/models/pointnet2_cls_ssg.py @@ -0,0 +1,64 @@ +""" + PointNet++ Model for point clouds classification +""" + +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module + +# NUM_CLASSES = 40 +NUM_CLASSES = 15 + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + +def get_model(point_cloud, is_training, bn_decay=None, num_class=NUM_CLASSES): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Set abstraction layers + # Note: When using NCHW for layer 2, we see increased GPU memory usage (in TF1.4). + # So we only use NCHW for layer 1 until this issue can be resolved. + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp2') + net = tf_util.fully_connected(net, num_class, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + output, _ = get_model(inputs, tf.constant(True)) + print(output) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/interpolate.cpp b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/interpolate.cpp new file mode 100644 index 0000000..b7d0dd0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/interpolate.cpp @@ -0,0 +1,169 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +using namespace tensorflow; + +REGISTER_OP("ThreeNN") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("dist: float32") + .Output("idx: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolate") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // (b,m,c) + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // (b,n,3) + c->WithRank(c->input(1), 3, &dims2); + // (b,n,c) + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolateGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;iinput(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,n,3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,m,3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *dist_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,n,3}, &dist_tensor)); + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,n,3}, &idx_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto dist_flat = dist_tensor->flat(); + float *dist = &(dist_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + threenn_cpu(b,n,m,xyz1,xyz2,dist,idx); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeNN").Device(DEVICE_CPU), ThreeNNOp); + + + +class ThreeInterpolateOp: public OpKernel{ + public: + explicit ThreeInterpolateOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolate expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b && idx_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) weight shape")); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + threeinterpolate_cpu(b,m,c,n,points,idx,weight,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolate").Device(DEVICE_CPU),ThreeInterpolateOp); + + +class ThreeInterpolateGradOp: public OpKernel{ + public: + explicit ThreeInterpolateGradOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) weight shape")); + + const Tensor& grad_out_tensor=context->input(3); + OP_REQUIRES(context,grad_out_tensor.dims()==3 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==n && grad_out_tensor.shape().dim_size(2)==c, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,c) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + memset(grad_points, 0, sizeof(float)*b*m*c); + threeinterpolate_grad_cpu(b,n,c,m,grad_out,idx,weight,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolateGrad").Device(DEVICE_CPU),ThreeInterpolateGradOp); + + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate.py b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate.py new file mode 100644 index 0000000..15531fd --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate.py @@ -0,0 +1,60 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +#interpolate_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_interpolate_so.so')) +interpolate_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_interpolate_so_hk.so')) +def three_nn(xyz1, xyz2): + ''' + Input: + xyz1: (b,n,3) float32 array, unknown points + xyz2: (b,m,3) float32 array, known points + Output: + dist: (b,n,3) float32 array, distances to known points + idx: (b,n,3) int32 array, indices to known points + ''' + return interpolate_module.three_nn(xyz1, xyz2) +ops.NoGradient('ThreeNN') +def three_interpolate(points, idx, weight): + ''' + Input: + points: (b,m,c) float32 array, known points + idx: (b,n,3) int32 array, indices to known points + weight: (b,n,3) float32 array, weights on known points + Output: + out: (b,n,c) float32 array, interpolated point values + ''' + return interpolate_module.three_interpolate(points, idx, weight) +@tf.RegisterGradient('ThreeInterpolate') +def _three_interpolate_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + weight = op.inputs[2] + return [interpolate_module.three_interpolate_grad(points, idx, weight, grad_out), None, None] + +if __name__=='__main__': + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,128,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/cpu:0'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(interpolated_points) + print(time.time() - now) + print(ret.shape, ret.dtype) + #print ret + + + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate_compile.sh b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate_compile.sh new file mode 100755 index 0000000..7c2ce3b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate_compile.sh @@ -0,0 +1,5 @@ +# TF1.2 +#g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so_hk.so -shared -fPIC -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate_op_test.py b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate_op_test.py new file mode 100644 index 0000000..b1c244f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/tf_interpolate_op_test.py @@ -0,0 +1,24 @@ +import tensorflow as tf +import numpy as np +from tf_interpolate import three_nn, three_interpolate + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with self.test_session(): + points = tf.constant(np.random.random((1,8,16)).astype('float32')) + print points + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + print interpolated_points + err = tf.test.compute_gradient_error(points, (1,8,16), interpolated_points, (1,128,16)) + print err + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/visu_interpolation.py b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/visu_interpolation.py new file mode 100644 index 0000000..5b5836e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/3d_interpolation/visu_interpolation.py @@ -0,0 +1,44 @@ +''' Visualize part segmentation ''' +import os +import sys +ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append('/home/rqi/Projects/toolkits/visualization') +from show3d_balls import showpoints +import numpy as np +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf + + +pts2 = np.array([[0,0,1],[1,0,0],[0,1,0],[1,1,0]]).astype('float32') +xyz1 = np.random.random((100,3)).astype('float32') +xyz2 = np.array([[0,0,0],[1,0,0],[0,1,0],[1,1,1]]).astype('float32') + +def fun(xyz1,xyz2,pts2): + with tf.device('/cpu:0'): + points = tf.constant(np.expand_dims(pts2,0)) + xyz1 = tf.constant(np.expand_dims(xyz1,0)) + xyz2 = tf.constant(np.expand_dims(xyz2,0)) + dist, idx = three_nn(xyz1, xyz2) + #weight = tf.ones_like(dist)/3.0 + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm, [1,1,3]) + print norm + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + tmp,pts1,d,w = sess.run([xyz1, interpolated_points, dist, weight]) + #print w + pts1 = pts1.squeeze() + return pts1 + +pts1 = fun(xyz1,xyz2,pts2) +all_pts = np.zeros((104,3)) +all_pts[0:100,:] = pts1 +all_pts[100:,:] = pts2 +all_xyz = np.zeros((104,3)) +all_xyz[0:100,:]=xyz1 +all_xyz[100:,:]=xyz2 +showpoints(xyz2, pts2, ballradius=8) +showpoints(xyz1, pts1, ballradius=8) +showpoints(all_xyz, all_pts, ballradius=8) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/.gitignore b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/.gitignore new file mode 100644 index 0000000..2f08276 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/.gitignore @@ -0,0 +1,10 @@ +a.out +query_ball_point +query_ball_point_block +query_ball_point_cuda +query_ball_point_grid +tf_grouping_g.cu.o +tf_grouping_so.so +selection_sort +selection_sort_cuda +selection_sort_const_cuda diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/compile.sh b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/compile.sh new file mode 100644 index 0000000..e1824dd --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/compile.sh @@ -0,0 +1,6 @@ +g++ query_ball_point.cpp -o query_ball_point +nvcc query_ball_point.cu -o query_ball_point_cuda +nvcc query_ball_point_block.cu -o query_ball_point_block +nvcc query_ball_point_grid.cu -o query_ball_point_grid +g++ -Wall selection_sort.cpp -o selection_sort +nvcc selection_sort.cu -o selection_sort_cuda diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point.cpp b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point.cpp new file mode 100644 index 0000000..4e28051 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point.cpp @@ -0,0 +1,119 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +void query_ball_point_cpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,1>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point_block.cu b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point_block.cu new file mode 100644 index 0000000..477fb3b --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point_block.cu @@ -0,0 +1,134 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int index = threadIdx.x; + xyz1 += n*3*index; + xyz2 += m*3*index; + idx += m*nsample*index; + + for (int j=0;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,b>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,b>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point_grid.cu b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point_grid.cu new file mode 100644 index 0000000..dcfadba --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/query_ball_point_grid.cu @@ -0,0 +1,144 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/selection_sort.cpp b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/selection_sort.cpp new file mode 100644 index 0000000..6f0839e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/selection_sort.cpp @@ -0,0 +1,94 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), val (b,m,n) +void selection_sort_cpu(int b, int n, int m, int k, const float *dist, int *idx, float *val) { + float *p_dist; + float tmp; + int tmpi; + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,k), val (b,m,k) +__global__ void selection_sort_gpu(int b, int n, int m, int k, float *dist, int *idx, float *val) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + idx+=m*k*batch_index; + val+=m*k*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float *p_dist; + for (int j=index;j>>(b,n,m,k,dist,idx,val); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + return 0; +} diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/selection_sort_const.cu b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/selection_sort_const.cu new file mode 100644 index 0000000..9666849 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/test/selection_sort_const.cu @@ -0,0 +1,92 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), dist_out (b,m,n) +__global__ void selection_sort_gpu(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + outi+=m*n*batch_index; + out+=m*n*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + // copy from dist to dist_out + for (int j=index;j>>(b,n,m,k,dist,idx,dist_out); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + //for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include +using namespace tensorflow; + +REGISTER_OP("QueryBallPoint") + .Attr("radius: float") + .Attr("nsample: int") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("idx: int32") + .Output("pts_cnt: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoint * 3 + c->WithRank(c->input(1), 3, &dims2); + int nsample; + TF_RETURN_IF_ERROR(c->GetAttr("nsample", &nsample)); + ::tensorflow::shape_inference::ShapeHandle output1 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), nsample}); + c->set_output(0, output1); + ::tensorflow::shape_inference::ShapeHandle output2 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(1, output2); + return Status::OK(); + }); +REGISTER_OP("SelectionSort") + .Attr("k: int") + .Input("dist: float32") + .Output("outi: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("GroupPoint") + .Input("points: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * channels + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints * nsample + c->WithRank(c->input(1), 3, &dims2); + // batch_size * npoints * nsample * channels + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), c->Dim(dims2, 2), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GroupPointGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + + +void queryBallPointLauncher(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt); +class QueryBallPointGpuOp : public OpKernel { + public: + explicit QueryBallPointGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("radius", &radius_)); + OP_REQUIRES(context, radius_ > 0, errors::InvalidArgument("QueryBallPoint expects positive radius")); + + OP_REQUIRES_OK(context, context->GetAttr("nsample", &nsample_)); + OP_REQUIRES(context, nsample_ > 0, errors::InvalidArgument("QueryBallPoint expects positive nsample")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& xyz1_tensor = context->input(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, ndataset, 3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, npoint, 3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,nsample_}, &idx_tensor)); + Tensor *pts_cnt_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m}, &pts_cnt_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + auto pts_cnt_flat = pts_cnt_tensor->flat(); + int *pts_cnt = &(pts_cnt_flat(0)); + queryBallPointLauncher(b,n,m,radius_,nsample_,xyz1,xyz2,idx,pts_cnt); + } + private: + float radius_; + int nsample_; +}; +REGISTER_KERNEL_BUILDER(Name("QueryBallPoint").Device(DEVICE_GPU), QueryBallPointGpuOp); + +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out); +class SelectionSortGpuOp : public OpKernel { + public: + explicit SelectionSortGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("k", &k_)); + OP_REQUIRES(context, k_ > 0, errors::InvalidArgument("SelectionSort expects positive k")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& dist_tensor = context->input(0); + OP_REQUIRES(context, dist_tensor.dims()==3, errors::InvalidArgument("SelectionSort expects (b,m,n) dist shape.")); + int b = dist_tensor.shape().dim_size(0); + int m = dist_tensor.shape().dim_size(1); + int n = dist_tensor.shape().dim_size(2); + + Tensor *outi_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,n}, &outi_tensor)); + Tensor *out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m,n}, &out_tensor)); + + auto dist_flat = dist_tensor.flat(); + const float *dist = &(dist_flat(0)); + auto outi_flat = outi_tensor->flat(); + int *outi = &(outi_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + selectionSortLauncher(b,n,m,k_,dist,outi,out); + } + private: + int k_; +}; +REGISTER_KERNEL_BUILDER(Name("SelectionSort").Device(DEVICE_GPU), SelectionSortGpuOp); + + +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out); +class GroupPointGpuOp: public OpKernel{ + public: + explicit GroupPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPoint expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPoint expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,nsample,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + groupPointLauncher(b,n,c,m,nsample,points,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPoint").Device(DEVICE_GPU),GroupPointGpuOp); + +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points); +class GroupPointGradGpuOp: public OpKernel{ + public: + explicit GroupPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPointGrad expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + const Tensor& grad_out_tensor=context->input(2); + OP_REQUIRES(context,grad_out_tensor.dims()==4 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==m && grad_out_tensor.shape().dim_size(2)==nsample && grad_out_tensor.shape().dim_size(3)==c, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample, channel) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + cudaMemset(grad_points, 0, sizeof(float)*b*n*c); + groupPointGradLauncher(b,n,c,m,nsample,grad_out,idx,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPointGrad").Device(DEVICE_GPU),GroupPointGradGpuOp); + + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping.py b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping.py new file mode 100644 index 0000000..7fd504f --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping.py @@ -0,0 +1,106 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +#grouping_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_grouping_so.so')) +grouping_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_grouping_so_hk.so')) +def query_ball_point(radius, nsample, xyz1, xyz2): + ''' + Input: + radius: float32, ball search radius + nsample: int32, number of points selected in each ball region + xyz1: (batch_size, ndataset, 3) float32 array, input points + xyz2: (batch_size, npoint, 3) float32 array, query points + Output: + idx: (batch_size, npoint, nsample) int32 array, indices to input points + pts_cnt: (batch_size, npoint) int32 array, number of unique points in each local region + ''' + #return grouping_module.query_ball_point(radius, nsample, xyz1, xyz2) + return grouping_module.query_ball_point(xyz1, xyz2, radius, nsample) +ops.NoGradient('QueryBallPoint') +def select_top_k(k, dist): + ''' + Input: + k: int32, number of k SMALLEST elements selected + dist: (b,m,n) float32 array, distance matrix, m query points, n dataset points + Output: + idx: (b,m,n) int32 array, first k in n are indices to the top k + dist_out: (b,m,n) float32 array, first k in n are the top k + ''' + return grouping_module.selection_sort(dist, k) +ops.NoGradient('SelectionSort') +def group_point(points, idx): + ''' + Input: + points: (batch_size, ndataset, channel) float32 array, points to sample from + idx: (batch_size, npoint, nsample) int32 array, indices to points + Output: + out: (batch_size, npoint, nsample, channel) float32 array, values sampled from points + ''' + return grouping_module.group_point(points, idx) +@tf.RegisterGradient('GroupPoint') +def _group_point_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + return [grouping_module.group_point_grad(points, idx, grad_out), None] + +def knn_point(k, xyz1, xyz2): + ''' + Input: + k: int32, number of k in k-nn search + xyz1: (batch_size, ndataset, c) float32 array, input points + xyz2: (batch_size, npoint, c) float32 array, query points + Output: + val: (batch_size, npoint, k) float32 array, L2 distances + idx: (batch_size, npoint, k) int32 array, indices to input points + ''' + b = xyz1.get_shape()[0].value + n = xyz1.get_shape()[1].value + c = xyz1.get_shape()[2].value + m = xyz2.get_shape()[1].value + print(b, n, c, m) + print(xyz1, (b,1,n,c)) + xyz1 = tf.tile(tf.reshape(xyz1, (b,1,n,c)), [1,m,1,1]) + xyz2 = tf.tile(tf.reshape(xyz2, (b,m,1,c)), [1,1,n,1]) + dist = tf.reduce_sum((xyz1-xyz2)**2, -1) + print(dist, k) + outi, out = select_top_k(k, dist) + idx = tf.slice(outi, [0,0,0], [-1,-1,k]) + val = tf.slice(out, [0,0,0], [-1,-1,k]) + print(idx, val) + #val, idx = tf.nn.top_k(-dist, k=k) # ONLY SUPPORT CPU + return(val, idx) + +if __name__=='__main__': + knn=True + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,512,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/gpu:1'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + radius = 0.1 + nsample = 64 + if knn: + _, idx = knn_point(nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + else: + idx, _ = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + #grouped_points_grad = tf.ones_like(grouped_points) + #points_grad = tf.gradients(grouped_points, points, grouped_points_grad) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(grouped_points) + print(time.time() - now) + print(ret.shape, ret.dtype) + print(ret) + + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_compile.sh b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_compile.sh new file mode 100755 index 0000000..ecab6e9 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_compile.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/local/cuda-9.0/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# TF1.2 +#g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so_hk.so -shared -fPIC -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_g.cu b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_g.cu new file mode 100644 index 0000000..578330d --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_g.cu @@ -0,0 +1,141 @@ +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample), pts_cnt (b,m) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + pts_cnt += m*batch_index; // counting how many unique points selected in local region + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx,pts_cnt); + //cudaDeviceSynchronize(); +} +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + selection_sort_gpu<<>>(b,n,m,k,dist,outi,out); + //cudaDeviceSynchronize(); +} +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out){ + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + //cudaDeviceSynchronize(); +} +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points){ + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //cudaDeviceSynchronize(); +} diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_op_test.py b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_op_test.py new file mode 100644 index 0000000..4f30a3e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/grouping/tf_grouping_op_test.py @@ -0,0 +1,28 @@ +import tensorflow as tf +import numpy as np +from tf_grouping import query_ball_point, group_point + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with tf.device('/gpu:0'): + points = tf.constant(np.random.random((1,128,16)).astype('float32')) + print points + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + radius = 0.3 + nsample = 32 + idx, pts_cnt = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + print grouped_points + + with self.test_session(): + print "---- Going to compute gradient error" + err = tf.test.compute_gradient_error(points, (1,128,16), grouped_points, (1,8,32,16)) + print err + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/.gitignore b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/.gitignore new file mode 100644 index 0000000..9d22eb4 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/.gitignore @@ -0,0 +1,2 @@ +*.o +*.so diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling.cpp b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling.cpp new file mode 100644 index 0000000..fb3dd28 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling.cpp @@ -0,0 +1,179 @@ +/* Furthest point sampling + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include + +using namespace tensorflow; + +REGISTER_OP("ProbSample") + .Input("inp: float32") + .Input("inpr: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ncategory + c->WithRank(c->input(0), 2, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("FarthestPointSample") + .Attr("npoint: int") + .Input("inp: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * npoint * 3 + c->WithRank(c->input(0), 3, &dims1); + int npoint; + TF_RETURN_IF_ERROR(c->GetAttr("npoint", &npoint)); + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), npoint}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPoint") + .Input("inp: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * 3 + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints * 3 + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPointGrad") + .Input("inp: float32") + .Input("idx: int32") + .Input("out_g: float32") + .Output("inp_g: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out); +class ProbSampleGpuOp: public OpKernel{ + public: + explicit ProbSampleGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + const Tensor& inpr_tensor=context->input(1); + auto inp_flat=inp_tensor.flat(); + auto inpr_flat=inpr_tensor.flat(); + const float * inp=&(inp_flat(0)); + const float * inpr=&(inpr_flat(0)); + OP_REQUIRES(context,inp_tensor.dims()==2,errors::InvalidArgument("ProbSample expects (batch_size,num_choices) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + OP_REQUIRES(context,inpr_tensor.dims()==2 && inpr_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ProbSample expects (batch_size,num_points) inpr shape")); + int m=inpr_tensor.shape().dim_size(1); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + probsampleLauncher(b,n,m,inp,inpr,temp,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ProbSample").Device(DEVICE_GPU), ProbSampleGpuOp); + +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out); +class FarthestPointSampleGpuOp: public OpKernel{ + public: + explicit FarthestPointSampleGpuOp(OpKernelConstruction* context):OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("npoint", &npoint_)); + OP_REQUIRES(context, npoint_ > 0, errors::InvalidArgument("FarthestPointSample expects positive npoint")); + } + void Compute(OpKernelContext * context)override{ + int m = npoint_; + + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("FarthestPointSample expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + Tensor * out_tensor; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{32,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + farthestpointsamplingLauncher(b,n,m,inp,temp,out); + } + private: + int npoint_; +}; +REGISTER_KERNEL_BUILDER(Name("FarthestPointSample").Device(DEVICE_GPU),FarthestPointSampleGpuOp); + +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out); +class GatherPointGpuOp: public OpKernel{ + public: + explicit GatherPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPoint expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPoint expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,3},&out_tensor)); + auto out_flat=out_tensor->flat(); + float * out=&(out_flat(0)); + gatherpointLauncher(b,n,m,inp,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPoint").Device(DEVICE_GPU),GatherPointGpuOp); + +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g); +class GatherPointGradGpuOp: public OpKernel{ + public: + explicit GatherPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_points,3) inp")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + const Tensor& out_g_tensor=context->input(2); + OP_REQUIRES(context,out_g_tensor.dims()==3 && out_g_tensor.shape().dim_size(0)==b && out_g_tensor.shape().dim_size(1)==m && out_g_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result,3) out_g shape")); + auto out_g_flat=out_g_tensor.flat(); + const float * out_g=&(out_g_flat(0)); + Tensor * inp_g_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&inp_g_tensor)); + auto inp_g_flat=inp_g_tensor->flat(); + float * inp_g=&(inp_g_flat(0)); + cudaMemset(inp_g,0,b*n*3*4); + scatteraddpointLauncher(b,n,m,out_g,idx,inp_g); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPointGrad").Device(DEVICE_GPU),GatherPointGradGpuOp); + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling.py b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling.py new file mode 100644 index 0000000..e0a94b5 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling.py @@ -0,0 +1,90 @@ +''' Furthest point sampling +Original author: Haoqiang Fan +Modified by Charles R. Qi +All Rights Reserved. 2017. +''' +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +#sampling_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_sampling_so.so')) +sampling_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_sampling_so_hk.so')) +def prob_sample(inp,inpr): + ''' +input: + batch_size * ncategory float32 + batch_size * npoints float32 +returns: + batch_size * npoints int32 + ''' + return sampling_module.prob_sample(inp,inpr) +ops.NoGradient('ProbSample') +# TF1.0 API requires set shape in C++ +#@tf.RegisterShape('ProbSample') +#def _prob_sample_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(2) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape2.dims[0],shape2.dims[1]])] +def gather_point(inp,idx): + ''' +input: + batch_size * ndataset * 3 float32 + batch_size * npoints int32 +returns: + batch_size * npoints * 3 float32 + ''' + return sampling_module.gather_point(inp,idx) +#@tf.RegisterShape('GatherPoint') +#def _gather_point_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(3) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape1.dims[0],shape2.dims[1],shape1.dims[2]])] +@tf.RegisterGradient('GatherPoint') +def _gather_point_grad(op,out_g): + inp=op.inputs[0] + idx=op.inputs[1] + return [sampling_module.gather_point_grad(inp,idx,out_g),None] +def farthest_point_sample(npoint,inp): + ''' +input: + int32 + batch_size * ndataset * 3 float32 +returns: + batch_size * npoint int32 + ''' + return sampling_module.farthest_point_sample(inp, npoint) +ops.NoGradient('FarthestPointSample') + + +if __name__=='__main__': + import numpy as np + np.random.seed(100) + triangles=np.random.rand(1,5,3,3).astype('float32') + with tf.device('/gpu:1'): + inp=tf.constant(triangles) + tria=inp[:,:,0,:] + trib=inp[:,:,1,:] + tric=inp[:,:,2,:] + areas=tf.sqrt(tf.reduce_sum(tf.cross(trib-tria,tric-tria)**2,2)+1e-9) + randomnumbers=tf.random_uniform((1,8192)) + triids=prob_sample(areas,randomnumbers) + tria_sample=gather_point(tria,triids) + trib_sample=gather_point(trib,triids) + tric_sample=gather_point(tric,triids) + us=tf.random_uniform((1,8192)) + vs=tf.random_uniform((1,8192)) + uplusv=1-tf.abs(us+vs-1) + uminusv=us-vs + us=(uplusv+uminusv)*0.5 + vs=(uplusv-uminusv)*0.5 + pt_sample=tria_sample+(trib_sample-tria_sample)*tf.expand_dims(us,-1)+(tric_sample-tria_sample)*tf.expand_dims(vs,-1) + print('pt_sample: ', pt_sample) + reduced_sample=gather_point(pt_sample,farthest_point_sample(1024,pt_sample)) + print(reduced_sample) + with tf.Session('') as sess: + ret=sess.run(reduced_sample) + print(ret.shape,ret.dtype) + import cPickle as pickle + pickle.dump(ret,open('1.pkl','wb'),-1) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling_compile.sh b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling_compile.sh new file mode 100755 index 0000000..8a8fae7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling_compile.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/local/cuda-9.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# TF1.2 +#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so_hk.so -shared -fPIC -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L/home/mikacuy/virtual_env/tensorflow/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling_g.cu b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling_g.cu new file mode 100644 index 0000000..6e28bc7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/tf_ops/sampling/tf_sampling_g.cu @@ -0,0 +1,212 @@ +/* Furthest point sampling GPU implementation + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ + +__global__ void cumsumKernel(int b,int n,const float * __restrict__ inp,float * __restrict__ out){ + const int BlockSize=2048; + const int paddingLevel=5; + __shared__ float buffer4[BlockSize*4]; + __shared__ float buffer[BlockSize+(BlockSize>>paddingLevel)]; + for (int i=blockIdx.x;i>2; + for (int k=threadIdx.x*4;k>2)+(k>>(2+paddingLevel))]=v4; + }else{ + float v=0; + for (int k2=k;k2>2)+(k>>(2+paddingLevel))]=v; + } + } + int u=0; + for (;(2<>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+2)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + u--; + for (;u>=0;u--){ + __syncthreads(); + for (int k=threadIdx.x;k>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+3)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + __syncthreads(); + for (int k=threadIdx.x*4;k>2)-1)+(((k>>2)-1)>>paddingLevel); + buffer4[k]+=buffer[k2]; + buffer4[k+1]+=buffer[k2]; + buffer4[k+2]+=buffer[k2]; + buffer4[k+3]+=buffer[k2]; + } + } + __syncthreads(); + for (int k=threadIdx.x;k>paddingLevel)]+runningsum2; + float r2=runningsum+t; + runningsum2=t-(r2-runningsum); + runningsum=r2; + __syncthreads(); + } + } +} + +__global__ void binarysearchKernel(int b,int n,int m,const float * __restrict__ dataset,const float * __restrict__ query, int * __restrict__ result){ + int base=1; + while (base=1;k>>=1) + if (r>=k && dataset[i*n+r-k]>=q) + r-=k; + result[i*m+j]=r; + } + } +} +__global__ void farthestpointsamplingKernel(int b,int n,int m,const float * __restrict__ dataset,float * __restrict__ temp,int * __restrict__ idxs){ + if (m<=0) + return; + const int BlockSize=512; + __shared__ float dists[BlockSize]; + __shared__ int dists_i[BlockSize]; + const int BufferSize=3072; + __shared__ float buf[BufferSize*3]; + for (int i=blockIdx.x;ibest){ + best=d2; + besti=k; + } + } + dists[threadIdx.x]=best; + dists_i[threadIdx.x]=besti; + for (int u=0;(1<>(u+1))){ + int i1=(threadIdx.x*2)<>>(b,n,inp,out); +} +//require b*n working space +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out){ + cumsumKernel<<<32,512>>>(b,n,inp_p,temp); + binarysearchKernel<<>>(b,n,m,temp,inp_r,out); +} +//require 32*n working space +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out){ + farthestpointsamplingKernel<<<32,512>>>(b,n,m,inp,temp,out); +} +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out){ + gatherpointKernel<<>>(b,n,m,inp,idx,out); +} +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g){ + scatteraddpointKernel<<>>(b,n,m,out_g,idx,inp_g); +} + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/train.py b/zoo/SimpleView/ScanObjectNN/pointnet2/train.py new file mode 100644 index 0000000..fab3fdb --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/train.py @@ -0,0 +1,310 @@ +''' + Single-GPU training. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=1, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name [default: pointnet2_cls_ssg]') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--num_class', type=int, default = 15, help='Number of classes to classify.') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of training file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = FLAGS.num_class +print("Number of Classes: "+str(NUM_CLASSES)) +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +if (".h5" in TRAIN_FILE): + TRAIN_DATA, TRAIN_LABELS = data_utils.load_h5(TRAIN_FILE) +else: + TRAIN_DATA, TRAIN_LABELS = data_utils.load_data(TRAIN_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (".h5" in TEST_FILE): + TEST_DATA, TEST_LABELS = data_utils.load_h5(TEST_FILE) +else: + TEST_DATA, TEST_LABELS = data_utils.load_data(TEST_FILE, NUM_POINT, with_bg_pl = WITH_BG) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay, num_class=NUM_CLASSES) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + tf.summary.scalar('total_loss', total_loss) + for l in losses + [total_loss]: + tf.summary.scalar(l.op.name, l) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + print ("--- Get training operator") + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + # saver.restore(sess, os.path.join(LOG_DIR,'model.ckpt')) + # log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + # if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + #Shuffle data + # data_utils.shuffle_points(TRAIN_DATA) + + #get current data, shuffle and set to numpy array with desired num_point + # current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + if (".h5" in TRAIN_FILE): + current_data, current_label = data_utils.get_current_data_h5(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TRAIN_DATA, TRAIN_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # data_utils.shuffle_points(TEST_DATA) + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + if (".h5" in TEST_FILE): + current_data, current_label = data_utils.get_current_data_h5(TEST_DATA, TEST_LABELS, NUM_POINT) + else: + current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + + current_label = np.squeeze(current_label) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/train_partseg.py b/zoo/SimpleView/ScanObjectNN/pointnet2/train_partseg.py new file mode 100644 index 0000000..4596b11 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/train_partseg.py @@ -0,0 +1,307 @@ +''' + Single-GPU training. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +# import modelnet_dataset +# import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_partseg', help='Model name [default: pointnet2_cls_ssg]') + +parser.add_argument('--log_dir', default='../../../../pointnet2/log_partseg_chairs_augmentedrot/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=1.0, help='Segmentation weight in loss') + +parser.add_argument('--train_file', default = '/home/mikacuy/object_dataset/parts/training_objectdataset_augmentedrot.h5', help='Location of training file') +parser.add_argument('--test_file', default = '/home/mikacuy/object_dataset/parts/test_objectdataset_augmentedrot.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=8, help='Batch Size during training [default: 16]') +parser.add_argument('--learning_rate', type=float, default=0.0001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train_seg.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 6 + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TRAIN_DATA, TRAIN_LABELS, TRAIN_PARTS = data_utils.load_parts_h5(TRAIN_FILE) +TEST_DATA, TEST_LABELS, TEST_PARTS = data_utils.load_parts_h5(TEST_FILE) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, parts_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + seg_pred = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + total_loss = MODEL.get_loss(seg_pred, parts_pl) + tf.summary.scalar('loss', total_loss) + + print ("--- Get training operator") + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + # saver.restore(sess, os.path.join(LOG_DIR,'model.ckpt')) + # log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'parts_pl': parts_pl, + 'is_training_pl': is_training_pl, + 'seg_pred': seg_pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + # if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + current_data, current_label, current_parts = data_utils.get_current_data_parts_h5(TRAIN_DATA, TRAIN_LABELS, TRAIN_PARTS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_parts = np.squeeze(current_parts) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['parts_pl']: current_parts[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, seg_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['seg_pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_parts[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_seen += BATCH_SIZE + loss_sum += loss_val + + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + current_data, current_label, current_parts = data_utils.get_current_data_parts_h5(TEST_DATA, TEST_LABELS, TEST_PARTS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_parts = np.squeeze(current_parts) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['parts_pl']: current_parts[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, seg_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['seg_pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_parts[start_idx:end_idx]) + total_correct_seg += seg_correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + + for i in range(start_idx, end_idx): + parts = current_parts[i] + for j in range(len(parts)): + part = parts[j] + + total_seen_class[part] += 1 + total_correct_class[part] += (seg_val[i-start_idx][j] == part) + + total_parts_seen = 0 + cum_sum = 0 + for i in range(NUM_CLASSES): + if (total_seen_class[i]==0): + continue + part_acc = float(total_correct_class[i])/float(total_seen_class[i]) + cum_sum += part_acc + total_parts_seen +=1 + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + log_string('eval avg class acc: %f' % (cum_sum/float(total_parts_seen))) + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/train_seg.py b/zoo/SimpleView/ScanObjectNN/pointnet2/train_seg.py new file mode 100644 index 0000000..282b131 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/train_seg.py @@ -0,0 +1,330 @@ +''' + Single-GPU training. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +# import modelnet_dataset +# import modelnet_h5_dataset +sys.path.append(os.path.join(BASE_DIR, '..')) +import data_utils + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_bga', help='Model name [default: pointnet2_cls_ssg]') + +parser.add_argument('--log_dir', default='log/', help='Log dir [default: log]') +parser.add_argument('--with_bg', default = True, help='Whether to have background or not [default: True]') +parser.add_argument('--norm', default = True, help='Whether to normalize data or not [default: False]') +parser.add_argument('--center_data', default = True, help='Whether to explicitly center the data [default: False]') +parser.add_argument('--seg_weight', type=int, default=0.5, help='Segmentation weight in loss') + +parser.add_argument('--train_file', default = 'h5_files/main_split/training_objectdataset_augmentedrot_scale75.h5', help='Location of test file') +parser.add_argument('--test_file', default = 'h5_files/main_split/test_objectdataset_augmentedrot_scale75.h5', help='Location of test file') + +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +WITH_BG = FLAGS.with_bg +NORMALIZED = FLAGS.norm +TRAIN_FILE = FLAGS.train_file +TEST_FILE = FLAGS.test_file +CENTER_DATA = FLAGS.center_data +SEG_WEIGHT = FLAGS.seg_weight + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train_seg.py %s' % (LOG_DIR)) # bkp of train procedure +os.system('cp ../data_utils.py %s' % (LOG_DIR)) # bkp of data utils +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 15 + +print("Normalized: "+str(NORMALIZED)) +print("Center Data: "+str(CENTER_DATA)) + +TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS = data_utils.load_withmask_h5(TRAIN_FILE) +TEST_DATA, TEST_LABELS, TEST_MASKS = data_utils.load_withmask_h5(TEST_FILE) +TRAIN_MASKS = data_utils.convert_to_binary_mask(TRAIN_MASKS) +TEST_MASKS = data_utils.convert_to_binary_mask(TEST_MASKS) + +if (CENTER_DATA): + TRAIN_DATA = data_utils.center_data(TRAIN_DATA) + TEST_DATA = data_utils.center_data(TEST_DATA) + +if (NORMALIZED): + TRAIN_DATA = data_utils.normalize_data(TRAIN_DATA) + TEST_DATA = data_utils.normalize_data(TEST_DATA) + +print(len(TRAIN_DATA)) +print(len(TEST_DATA)) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, masks_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + class_pred, seg_pred = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + total_loss, classify_loss, seg_loss = MODEL.get_loss(class_pred, seg_pred, labels_pl, masks_pl, seg_weight=SEG_WEIGHT) + + tf.summary.scalar('total_loss', total_loss) + tf.summary.scalar('classify_loss', classify_loss) + tf.summary.scalar('seg_loss', seg_loss) + + correct = tf.equal(tf.argmax(class_pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + seg_correct = tf.equal(tf.argmax(seg_pred, 2), tf.to_int64(masks_pl)) + seg_accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / (float(BATCH_SIZE)*NUM_POINT) + tf.summary.scalar('seg_accuracy', seg_accuracy) + + print ("--- Get training operator") + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + # saver.restore(sess, os.path.join(LOG_DIR,'model.ckpt')) + # log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'masks_pl': masks_pl, + 'is_training_pl': is_training_pl, + 'pred': class_pred, + 'seg_pred': seg_pred, + 'loss': total_loss, + 'classify_loss': classify_loss, + 'seg_loss': seg_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + # if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TRAIN_DATA, TRAIN_LABELS, TRAIN_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_correct_seg = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + classify_loss_sum += classify_loss + seg_loss_sum += seg_loss + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('classify mean loss: %f' % (classify_loss_sum / float(num_batches))) + log_string('seg mean loss: %f' % (seg_loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + log_string('seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + classify_loss_sum = 0 + seg_loss_sum = 0 + total_correct_seg = 0 + + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + # data_utils.shuffle_points(TEST_DATA) + # current_data, current_label = data_utils.get_current_data(TEST_DATA, TEST_LABELS, NUM_POINT) + current_data, current_label, current_mask = data_utils.get_current_data_withmask_h5(TEST_DATA, TEST_LABELS, TEST_MASKS, NUM_POINT) + + current_label = np.squeeze(current_label) + current_mask = np.squeeze(current_mask) + + num_batches = current_data.shape[0]//BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['masks_pl']: current_mask[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val, seg_val, classify_loss, seg_loss = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred'], ops['seg_pred'], ops['classify_loss'], ops['seg_loss']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + seg_val = np.argmax(seg_val, 2) + seg_correct = np.sum(seg_val == current_mask[start_idx:end_idx]) + total_correct_seg += seg_correct + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + classify_loss_sum += classify_loss*BATCH_SIZE + seg_loss_sum += seg_loss*BATCH_SIZE + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + log_string('eval seg accuracy: %f' % (total_correct_seg / (float(total_seen)*NUM_POINT))) + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/README.md b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/README.md new file mode 100644 index 0000000..6d2bfad --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/README.md @@ -0,0 +1,6 @@ +## Utilility Functions for 3D Point Cloud Deep Learning + +### visualization tool + + sh compile_render_balls_so.sh + python show3d_balls.py diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/compile_render_balls_so.sh b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/compile_render_balls_so.sh new file mode 100644 index 0000000..dc493f6 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/compile_render_balls_so.sh @@ -0,0 +1,2 @@ +g++ -std=c++11 render_balls_so.cpp -o render_balls_so.so -shared -fPIC -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/pc_util.py b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/pc_util.py new file mode 100644 index 0000000..81f63d8 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/pc_util.py @@ -0,0 +1,315 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +def point_cloud_to_volume_v2_batch(point_clouds, vsize=12, radius=1.0, num_sample=128): + """ Input is BxNx3 a batch of point cloud + Output is BxVxVxVxnum_samplex3 + Added on Feb 19 + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume_v2(point_clouds[b,:,:], vsize, radius, num_sample) + vol_list.append(np.expand_dims(vol, 0)) + return np.concatenate(vol_list, 0) + +def point_cloud_to_volume_v2(points, vsize, radius=1.0, num_sample=128): + """ input is Nx3 points + output is vsize*vsize*vsize*num_sample*3 + assumes points are in range [-radius, radius] + samples num_sample points in each voxel, if there are less than + num_sample points, replicate the points + Added on Feb 19 + """ + vol = np.zeros((vsize,vsize,vsize,num_sample,3)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + loc2pc = {} + for n in range(points.shape[0]): + loc = tuple(locations[n,:]) + if loc not in loc2pc: + loc2pc[loc] = [] + loc2pc[loc].append(points[n,:]) + #print loc2pc + + for i in range(vsize): + for j in range(vsize): + for k in range(vsize): + if (i,j,k) not in loc2pc: + vol[i,j,k,:,:] = np.zeros((num_sample,3)) + else: + pc = loc2pc[(i,j,k)] # a list of (3,) arrays + pc = np.vstack(pc) # kx3 + # Sample/pad to num_sample points + if pc.shape[0]>num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0]num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0] 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + from PIL import Image + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + import matplotlib.pyplot as plt + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) + +def write_ply_color(points, labels, out_filename, num_classes=None): + """ Color (N,3) points with labels (N) within range 0 ~ num_classes-1 as OBJ file """ + import matplotlib.pyplot as pyplot + labels = labels.astype(int) + N = points.shape[0] + if num_classes is None: + num_classes = np.max(labels)+1 + else: + assert(num_classes>np.max(labels)) + fout = open(out_filename, 'w') + #colors = [pyplot.cm.hsv(i/float(num_classes)) for i in range(num_classes)] + colors = [pyplot.cm.jet(i/float(num_classes)) for i in range(num_classes)] + for i in range(N): + c = colors[labels[i]] + c = [int(x*255) for x in c] + fout.write('v %f %f %f %d %d %d\n' % (points[i,0],points[i,1],points[i,2],c[0],c[1],c[2])) + fout.close() diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/pointnet_util.py b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/pointnet_util.py new file mode 100644 index 0000000..6e1e046 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/pointnet_util.py @@ -0,0 +1,229 @@ +""" PointNet++ Layers + +Author: Charles R. Qi +Date: November 2017 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/sampling')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/grouping')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/3d_interpolation')) +from tf_sampling import farthest_point_sample, gather_point +from tf_grouping import query_ball_point, group_point, knn_point +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf +import numpy as np +import tf_util + +def sample_and_group(npoint, radius, nsample, xyz, points, knn=False, use_xyz=True): + ''' + Input: + npoint: int32 + radius: float32 + nsample: int32 + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points + knn: bool, if True use kNN instead of radius search + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + Output: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, nsample, 3+channel) TF tensor + idx: (batch_size, npoint, nsample) TF tensor, indices of local points as in ndataset points + grouped_xyz: (batch_size, npoint, nsample, 3) TF tensor, normalized point XYZs + (subtracted by seed point XYZ) in local regions + ''' + + new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) # (batch_size, npoint, 3) + if knn: + _,idx = knn_point(nsample, xyz, new_xyz) + else: + idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = group_point(xyz, idx) # (batch_size, npoint, nsample, 3) + grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) # translation normalization + if points is not None: + grouped_points = group_point(points, idx) # (batch_size, npoint, nsample, channel) + if use_xyz: + new_points = tf.concat([grouped_xyz, grouped_points], axis=-1) # (batch_size, npoint, nample, 3+channel) + else: + new_points = grouped_points + else: + new_points = grouped_xyz + + return new_xyz, new_points, idx, grouped_xyz + + +def sample_and_group_all(xyz, points, use_xyz=True): + ''' + Inputs: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + Outputs: + new_xyz: (batch_size, 1, 3) as (0,0,0) + new_points: (batch_size, 1, ndataset, 3+channel) TF tensor + Note: + Equivalent to sample_and_group with npoint=1, radius=inf, use (0,0,0) as the centroid + ''' + batch_size = xyz.get_shape()[0].value + nsample = xyz.get_shape()[1].value + new_xyz = tf.constant(np.tile(np.array([0,0,0]).reshape((1,1,3)), (batch_size,1,1)),dtype=tf.float32) # (batch_size, 1, 3) + idx = tf.constant(np.tile(np.array(range(nsample)).reshape((1,1,nsample)), (batch_size,1,1))) + grouped_xyz = tf.reshape(xyz, (batch_size, 1, nsample, 3)) # (batch_size, npoint=1, nsample, 3) + if points is not None: + if use_xyz: + new_points = tf.concat([xyz, points], axis=2) # (batch_size, 16, 259) + else: + new_points = points + new_points = tf.expand_dims(new_points, 1) # (batch_size, 1, 16, 259) + else: + new_points = grouped_xyz + return new_xyz, new_points, idx, grouped_xyz + + +def pointnet_sa_module(xyz, points, npoint, radius, nsample, mlp, mlp2, group_all, is_training, bn_decay, scope, bn=True, pooling='max', knn=False, use_xyz=True, use_nchw=False): + ''' PointNet Set Abstraction (SA) Module + Input: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor + npoint: int32 -- #points sampled in farthest point sampling + radius: float32 -- search radius in local region + nsample: int32 -- how many points in each local region + mlp: list of int32 -- output size for MLP on each point + mlp2: list of int32 -- output size for MLP on each region + group_all: bool -- group all points into one PC if set true, OVERRIDE + npoint, radius and nsample settings + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + use_nchw: bool, if True, use NCHW data format for conv2d, which is usually faster than NHWC format + Return: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, mlp[-1] or mlp2[-1]) TF tensor + idx: (batch_size, npoint, nsample) int32 -- indices for local regions + ''' + data_format = 'NCHW' if use_nchw else 'NHWC' + with tf.variable_scope(scope) as sc: + # Sample and Grouping + if group_all: + nsample = xyz.get_shape()[1].value + new_xyz, new_points, idx, grouped_xyz = sample_and_group_all(xyz, points, use_xyz) + else: + new_xyz, new_points, idx, grouped_xyz = sample_and_group(npoint, radius, nsample, xyz, points, knn, use_xyz) + + # Point Feature Embedding + if use_nchw: new_points = tf.transpose(new_points, [0,3,1,2]) + for i, num_out_channel in enumerate(mlp): + new_points = tf_util.conv2d(new_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv%d'%(i), bn_decay=bn_decay, + data_format=data_format) + if use_nchw: new_points = tf.transpose(new_points, [0,2,3,1]) + + # Pooling in Local Regions + if pooling=='max': + new_points = tf.reduce_max(new_points, axis=[2], keep_dims=True, name='maxpool') + elif pooling=='avg': + new_points = tf.reduce_mean(new_points, axis=[2], keep_dims=True, name='avgpool') + elif pooling=='weighted_avg': + with tf.variable_scope('weighted_avg'): + dists = tf.norm(grouped_xyz,axis=-1,ord=2,keep_dims=True) + exp_dists = tf.exp(-dists * 5) + weights = exp_dists/tf.reduce_sum(exp_dists,axis=2,keep_dims=True) # (batch_size, npoint, nsample, 1) + new_points *= weights # (batch_size, npoint, nsample, mlp[-1]) + new_points = tf.reduce_sum(new_points, axis=2, keep_dims=True) + elif pooling=='max_and_avg': + max_points = tf.reduce_max(new_points, axis=[2], keep_dims=True, name='maxpool') + avg_points = tf.reduce_mean(new_points, axis=[2], keep_dims=True, name='avgpool') + new_points = tf.concat([avg_points, max_points], axis=-1) + + # [Optional] Further Processing + if mlp2 is not None: + if use_nchw: new_points = tf.transpose(new_points, [0,3,1,2]) + for i, num_out_channel in enumerate(mlp2): + new_points = tf_util.conv2d(new_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv_post_%d'%(i), bn_decay=bn_decay, + data_format=data_format) + if use_nchw: new_points = tf.transpose(new_points, [0,2,3,1]) + + new_points = tf.squeeze(new_points, [2]) # (batch_size, npoints, mlp2[-1]) + return new_xyz, new_points, idx + +def pointnet_sa_module_msg(xyz, points, npoint, radius_list, nsample_list, mlp_list, is_training, bn_decay, scope, bn=True, use_xyz=True, use_nchw=False): + ''' PointNet Set Abstraction (SA) module with Multi-Scale Grouping (MSG) + Input: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor + npoint: int32 -- #points sampled in farthest point sampling + radius: list of float32 -- search radius in local region + nsample: list of int32 -- how many points in each local region + mlp: list of list of int32 -- output size for MLP on each point + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + use_nchw: bool, if True, use NCHW data format for conv2d, which is usually faster than NHWC format + Return: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, sum_k{mlp[k][-1]}) TF tensor + ''' + data_format = 'NCHW' if use_nchw else 'NHWC' + with tf.variable_scope(scope) as sc: + new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) + new_points_list = [] + for i in range(len(radius_list)): + radius = radius_list[i] + nsample = nsample_list[i] + idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = group_point(xyz, idx) + grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) + if points is not None: + grouped_points = group_point(points, idx) + if use_xyz: + grouped_points = tf.concat([grouped_points, grouped_xyz], axis=-1) + else: + grouped_points = grouped_xyz + if use_nchw: grouped_points = tf.transpose(grouped_points, [0,3,1,2]) + for j,num_out_channel in enumerate(mlp_list[i]): + grouped_points = tf_util.conv2d(grouped_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], bn=bn, is_training=is_training, + scope='conv%d_%d'%(i,j), bn_decay=bn_decay) + if use_nchw: grouped_points = tf.transpose(grouped_points, [0,2,3,1]) + new_points = tf.reduce_max(grouped_points, axis=[2]) + new_points_list.append(new_points) + new_points_concat = tf.concat(new_points_list, axis=-1) + return new_xyz, new_points_concat + + +def pointnet_fp_module(xyz1, xyz2, points1, points2, mlp, is_training, bn_decay, scope, bn=True): + ''' PointNet Feature Propogation (FP) Module + Input: + xyz1: (batch_size, ndataset1, 3) TF tensor + xyz2: (batch_size, ndataset2, 3) TF tensor, sparser than xyz1 + points1: (batch_size, ndataset1, nchannel1) TF tensor + points2: (batch_size, ndataset2, nchannel2) TF tensor + mlp: list of int32 -- output size for MLP on each point + Return: + new_points: (batch_size, ndataset1, mlp[-1]) TF tensor + ''' + with tf.variable_scope(scope) as sc: + dist, idx = three_nn(xyz1, xyz2) + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm,[1,1,3]) + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points2, idx, weight) + + if points1 is not None: + new_points1 = tf.concat(axis=2, values=[interpolated_points, points1]) # B,ndataset1,nchannel1+nchannel2 + else: + new_points1 = interpolated_points + new_points1 = tf.expand_dims(new_points1, 2) + for i, num_out_channel in enumerate(mlp): + new_points1 = tf_util.conv2d(new_points1, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv_%d'%(i), bn_decay=bn_decay) + new_points1 = tf.squeeze(new_points1, [2]) # B,ndataset1,mlp[-1] + return new_points1 diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/provider.py b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/provider.py new file mode 100644 index 0000000..5fda8b2 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/provider.py @@ -0,0 +1,249 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) + +DATA_DIR = os.path.join(ROOT_DIR, '../../../../') +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(os.path.join(DATA_DIR, filename)) diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/render_balls_so.cpp b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/render_balls_so.cpp new file mode 100644 index 0000000..e95aeba --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/render_balls_so.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +using namespace std; + +struct PointInfo{ + int x,y,z; + float r,g,b; +}; + +extern "C"{ + +void render_ball(int h,int w,unsigned char * show,int n,int * xyzs,float * c0,float * c1,float * c2,int r){ + r=max(r,1); + vector depth(h*w,-2100000000); + vector pattern; + for (int dx=-r;dx<=r;dx++) + for (int dy=-r;dy<=r;dy++) + if (dx*dx+dy*dy=h || y2<0 || y2>=w) && depth[x2*w+y2]0: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=0)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=0)) + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=1)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=1)) + if showrot: + cv2.putText(show,'xangle %d'%(int(xangle/np.pi*180)),(30,showsz-30),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'yangle %d'%(int(yangle/np.pi*180)),(30,showsz-50),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'zoom %d%%'%(int(zoom*100)),(30,showsz-70),0,0.5,cv2.cv.CV_RGB(255,0,0)) + changed=True + while True: + if changed: + render() + changed=False + cv2.imshow('show3d',show) + if waittime==0: + cmd=cv2.waitKey(10)%256 + else: + cmd=cv2.waitKey(waittime)%256 + if cmd==ord('q'): + break + elif cmd==ord('Q'): + sys.exit(0) + + if cmd==ord('t') or cmd == ord('p'): + if cmd == ord('t'): + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + else: + if c_pred is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_pred[:,0] + c1=c_pred[:,1] + c2=c_pred[:,2] + if normalizecolor: + c0/=(c0.max()+1e-14)/255.0 + c1/=(c1.max()+1e-14)/255.0 + c2/=(c2.max()+1e-14)/255.0 + c0=np.require(c0,'float32','C') + c1=np.require(c1,'float32','C') + c2=np.require(c2,'float32','C') + changed = True + + + + if cmd==ord('n'): + zoom*=1.1 + changed=True + elif cmd==ord('m'): + zoom/=1.1 + changed=True + elif cmd==ord('r'): + zoom=1.0 + changed=True + elif cmd==ord('s'): + cv2.imwrite('show3d.png',show) + if waittime!=0: + break + return cmd +if __name__=='__main__': + np.random.seed(100) + showpoints(np.random.randn(2500,3)) + diff --git a/zoo/SimpleView/ScanObjectNN/pointnet2/utils/tf_util.py b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/tf_util.py new file mode 100644 index 0000000..4a8ffb7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/pointnet2/utils/tf_util.py @@ -0,0 +1,615 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2017 +""" + +import numpy as np +import tensorflow as tf + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device("/cpu:0"): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + data_format='NHWC', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + data_format: 'NHWC' or 'NCHW' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + assert(data_format=='NHWC' or data_format=='NCHW') + if data_format == 'NHWC': + num_in_channels = inputs.get_shape()[-1].value + elif data_format=='NCHW': + num_in_channels = inputs.get_shape()[1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding, + data_format=data_format) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases, data_format=data_format) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn', + data_format=data_format) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + data_format='NHWC', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + data_format: 'NHWC' or 'NCHW' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + assert(data_format=='NHWC' or data_format=='NCHW') + if data_format == 'NHWC': + num_in_channels = inputs.get_shape()[-1].value + elif data_format=='NCHW': + num_in_channels = inputs.get_shape()[1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding, + data_format=data_format) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases, data_format=data_format) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', + data_format=data_format) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def batch_norm_template_unused(inputs, is_training, scope, moments_dims, bn_decay): + """ NOTE: this is older version of the util func. it is deprecated. + Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = _variable_on_cpu(name='beta',shape=[num_channels], + initializer=tf.constant_initializer(0)) + gamma = _variable_on_cpu(name='gamma',shape=[num_channels], + initializer=tf.constant_initializer(1.0)) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + # Need to set reuse=False, otherwise if reuse, will see moments_1/mean/ExponentialMovingAverage/ does not exist + # https://github.com/shekkizh/WassersteinGAN.tensorflow/issues/3 + with tf.variable_scope(tf.get_variable_scope(), reuse=False): + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_template(inputs, is_training, scope, moments_dims_unused, bn_decay, data_format='NHWC'): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + bn_decay = bn_decay if bn_decay is not None else 0.9 + return tf.contrib.layers.batch_norm(inputs, + center=True, scale=True, + is_training=is_training, decay=bn_decay,updates_collections=None, + scope=scope, + data_format=data_format) + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope, data_format): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1], bn_decay, data_format) + + + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope, data_format): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2], bn_decay, data_format) + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs diff --git a/zoo/SimpleView/ScanObjectNN/training_data/README.md b/zoo/SimpleView/ScanObjectNN/training_data/README.md new file mode 100644 index 0000000..523a84c --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/README.md @@ -0,0 +1,14 @@ +# FAQ +1. Do you have other download sources? + + * We are currently tidying up the data for public release, if you need an early access for academic purposes, please send an email to mikacuy@gmail.com. +2. How to evaluate on scanobjectnn with model trained on ModelNet40? + * Please see the file "evaluate_real_trained_on_synthetic.py". You can see the class mapping file in "mapping2.py". +3. What is the difference between main_split,split1,split2,split3 and split4? + * "Main_split" was used for the experiments in our main paper, while the other splits (1-4) are additional splits that we reported in our supplementary materials. +4. H5 labels: Can you confirm me that the label-integer correspondence (in h5 splits) is the one from 'shape_names_ext.txt' in ascending order and starting from zero? +e.g. +{bag: 0, bin: 1, box: 2, cabinet: 3, chair: 4, desk: 5, display: 6, door: 7, shelf: 8, table: 9, bed: 10, pillow: 11, sink: 12, sofa: 13, toilet: 14} + * Yes, that is correct. +5. I want to assure that you use -1 to denote background in the mask. + * Yes, that's right. diff --git a/zoo/SimpleView/ScanObjectNN/training_data/main_split.txt b/zoo/SimpleView/ScanObjectNN/training_data/main_split.txt new file mode 100644 index 0000000..95b9378 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/main_split.txt @@ -0,0 +1,2902 @@ +005_00020.bin 0 +014_00018.bin 0 t +025_00011.bin 0 +038_00032.bin 0 +041_00028.bin 0 t +041_00052.bin 0 t +043_00018.bin 0 +054_00026.bin 0 +073_00014.bin 0 +080_00015.bin 0 +082_00020.bin 0 t +084_00012.bin 0 +086_00015.bin 0 +086_00020.bin 0 +093_00019.bin 0 t +096_00016.bin 0 +096_00020.bin 0 +098_00007.bin 0 +202_00002.bin 0 +205_00007.bin 0 +205_00009.bin 0 +209_00013.bin 0 +209_00019.bin 0 +213_00025.bin 0 t +223_00012.bin 0 t +227_00012.bin 0 +234_00012.bin 0 +237_00011.bin 0 +237_00014.bin 0 +240_00009.bin 0 +246_00014.bin 0 +251_00015.bin 0 +251_00018.bin 0 +273_00010.bin 0 t +614_00005.bin 0 +700_00012.bin 0 +005_00015.bin 1 +005_00017.bin 1 +014_00016.bin 1 +021_00014.bin 1 +021_00021.bin 1 +032_00015.bin 1 t +041_00042.bin 1 +043_00014.bin 1 +045_00018.bin 1 +047_00019.bin 1 +047_00023.bin 1 +049_00007.bin 1 +052_00012.bin 1 +062_00009.bin 1 t +065_00013.bin 1 t +069_00009.bin 1 +076_00045.bin 1 +080_00013.bin 1 t +086_00011.bin 1 +086_00016.bin 1 +089_00010.bin 1 +093_00014.bin 1 t +093_00016.bin 1 t +109_00008.bin 1 +109_00016.bin 1 +205_00008.bin 1 +207_00005.bin 1 +207_00010.bin 1 +209_00014.bin 1 +213_00015.bin 1 t +213_00026.bin 1 t +231_00019.bin 1 +237_00009.bin 1 +237_00010.bin 1 +246_00008.bin 1 +251_00014.bin 1 +252_00013.bin 1 +252_00014.bin 1 +255_00003.bin 1 +255_00006.bin 1 +265_00010.bin 1 +265_00024.bin 1 +265_00030.bin 1 +270_00007.bin 1 +270_00012.bin 1 +273_00007.bin 1 +276_00010.bin 1 +279_00012.bin 1 +322_00014.bin 1 t +700_00006.bin 1 +700_00008.bin 1 +005_00021.bin 2 +011_00010.bin 2 +036_00021.bin 2 +041_00038.bin 2 +043_00016.bin 2 t +045_00012.bin 2 +045_00017.bin 2 +047_00021.bin 2 t +047_00022.bin 2 t +047_00026.bin 2 t +054_00019.bin 2 +054_00050.bin 2 +074_00005.bin 2 +074_00012.bin 2 +074_00016.bin 2 +074_00018.bin 2 +074_00020.bin 2 +074_00021.bin 2 +074_00029.bin 2 +078_00005.bin 2 +082_00018.bin 2 +082_00024.bin 2 +082_00026.bin 2 +084_00009.bin 2 +084_00011.bin 2 +086_00009.bin 2 t +086_00018.bin 2 t +087_00007.bin 2 +087_00008.bin 2 +087_00009.bin 2 +087_00012.bin 2 +087_00017.bin 2 +087_00028.bin 2 +089_00013.bin 2 +089_00021.bin 2 +093_00018.bin 2 +093_00022.bin 2 +093_00023.bin 2 +093_00032.bin 2 +109_00012.bin 2 +209_00022.bin 2 +209_00029.bin 2 +209_00032.bin 2 +213_00011.bin 2 t +225_00016.bin 2 +231_00031.bin 2 +234_00008.bin 2 +246_00012.bin 2 +251_00003.bin 2 t +251_00007.bin 2 t +251_00008.bin 2 t +255_00008.bin 2 +260_00012.bin 2 t +263_00025.bin 2 +265_00011.bin 2 t +265_00028.bin 2 t +265_00035.bin 2 t +265_00038.bin 2 t +265_00040.bin 2 t +265_00042.bin 2 t +272_00027.bin 2 t +272_00041.bin 2 t +276_00007.bin 2 +279_00011.bin 2 +623_00008.bin 2 +015_00008.bin 3 +025_00006.bin 3 t +041_00012.bin 3 t +047_00008.bin 3 +047_00011.bin 3 +049_00006.bin 3 +052_00007.bin 3 +062_00008.bin 3 +065_00002.bin 3 +076_00010.bin 3 +082_00007.bin 3 +082_00008.bin 3 +084_00002.bin 3 t +086_00006.bin 3 +086_00007.bin 3 +087_00005.bin 3 +093_00009.bin 3 +098_00002.bin 3 +201_00001.bin 3 +201_00004.bin 3 +207_00002.bin 3 t +209_00001.bin 3 +213_00003.bin 3 +213_00006.bin 3 +217_00013.bin 3 +225_00004.bin 3 t +225_00005.bin 3 t +225_00007.bin 3 t +227_00007.bin 3 +243_00002.bin 3 +243_00004.bin 3 +249_00002.bin 3 +252_00002.bin 3 +252_00007.bin 3 +255_00002.bin 3 +260_00000.bin 3 t +260_00003.bin 3 t +260_00005.bin 3 t +260_00007.bin 3 t +260_00008.bin 3 t +265_00006.bin 3 +276_00000.bin 3 t +276_00006.bin 3 t +276_00008.bin 3 t +279_00004.bin 3 +700_00001.bin 3 +700_00004.bin 3 +700_00005.bin 3 +700_00009.bin 3 +700_00010.bin 3 +005_00008.bin 4 +014_00009.bin 4 +021_00011.bin 4 +025_00003.bin 4 +025_00007.bin 4 +030_00008.bin 4 +030_00012.bin 4 +030_00013.bin 4 +030_00014.bin 4 +032_00007.bin 4 t +032_00008.bin 4 t +032_00009.bin 4 t +036_00009.bin 4 +036_00010.bin 4 +036_00011.bin 4 +036_00013.bin 4 +038_00011.bin 4 +038_00012.bin 4 +038_00014.bin 4 +038_00015.bin 4 +038_00016.bin 4 +041_00010.bin 4 +041_00013.bin 4 +041_00015.bin 4 +043_00010.bin 4 +043_00011.bin 4 +045_00009.bin 4 +045_00011.bin 4 +045_00013.bin 4 +045_00014.bin 4 +045_00016.bin 4 +047_00006.bin 4 +047_00007.bin 4 +047_00009.bin 4 +047_00010.bin 4 +049_00003.bin 4 t +049_00004.bin 4 t +052_00008.bin 4 t +054_00006.bin 4 +054_00007.bin 4 +054_00009.bin 4 +054_00012.bin 4 +054_00013.bin 4 +054_00014.bin 4 +054_00016.bin 4 +054_00017.bin 4 +054_00018.bin 4 +057_00007.bin 4 t +065_00006.bin 4 +065_00007.bin 4 +065_00009.bin 4 +065_00011.bin 4 +069_00010.bin 4 t +073_00005.bin 4 +073_00013.bin 4 +074_00009.bin 4 t +076_00012.bin 4 t +076_00013.bin 4 t +076_00016.bin 4 t +076_00017.bin 4 t +076_00018.bin 4 t +076_00019.bin 4 t +076_00021.bin 4 t +076_00022.bin 4 t +076_00023.bin 4 t +076_00028.bin 4 t +076_00029.bin 4 t +076_00031.bin 4 t +076_00034.bin 4 t +076_00037.bin 4 t +078_00010.bin 4 +080_00005.bin 4 +080_00006.bin 4 +080_00007.bin 4 +082_00009.bin 4 +082_00011.bin 4 +082_00014.bin 4 +084_00004.bin 4 +084_00008.bin 4 +086_00001.bin 4 +086_00008.bin 4 +087_00001.bin 4 +087_00003.bin 4 +087_00004.bin 4 +087_00011.bin 4 +093_00006.bin 4 t +096_00008.bin 4 +109_00007.bin 4 +201_00009.bin 4 +201_00010.bin 4 +201_00013.bin 4 +201_00015.bin 4 +201_00021.bin 4 +202_00003.bin 4 +202_00004.bin 4 +202_00005.bin 4 +202_00007.bin 4 +202_00008.bin 4 +202_00009.bin 4 +202_00010.bin 4 +202_00011.bin 4 +202_00012.bin 4 +202_00013.bin 4 +202_00015.bin 4 +202_00016.bin 4 +202_00017.bin 4 +202_00020.bin 4 +205_00005.bin 4 +205_00006.bin 4 +205_00010.bin 4 +206_00007.bin 4 +206_00008.bin 4 +206_00010.bin 4 +206_00011.bin 4 +206_00013.bin 4 +206_00014.bin 4 +206_00015.bin 4 +206_00016.bin 4 +206_00018.bin 4 +206_00019.bin 4 +206_00020.bin 4 +206_00021.bin 4 +206_00022.bin 4 +206_00024.bin 4 +206_00027.bin 4 +209_00006.bin 4 t +213_00012.bin 4 +213_00014.bin 4 +213_00018.bin 4 +223_00003.bin 4 +223_00004.bin 4 +223_00006.bin 4 +223_00007.bin 4 +227_00008.bin 4 +227_00009.bin 4 +231_00005.bin 4 +231_00006.bin 4 +231_00007.bin 4 +231_00008.bin 4 +234_00007.bin 4 +237_00004.bin 4 +237_00005.bin 4 +246_00004.bin 4 +246_00006.bin 4 +246_00011.bin 4 +251_00006.bin 4 +251_00011.bin 4 +251_00013.bin 4 +251_00017.bin 4 +251_00019.bin 4 +263_00011.bin 4 +263_00014.bin 4 +270_00006.bin 4 +272_00006.bin 4 +272_00008.bin 4 +272_00009.bin 4 +272_00010.bin 4 +273_00004.bin 4 +279_00007.bin 4 +279_00008.bin 4 +308_00011.bin 4 +308_00012.bin 4 +308_00013.bin 4 +308_00015.bin 4 +308_00017.bin 4 +322_00009.bin 4 +322_00011.bin 4 +322_00012.bin 4 +522_00005.bin 4 +609_00004.bin 4 t +609_00005.bin 4 t +609_00006.bin 4 t +609_00007.bin 4 t +609_00008.bin 4 t +609_00009.bin 4 t +609_00010.bin 4 t +609_00011.bin 4 t +609_00012.bin 4 t +609_00014.bin 4 t +609_00016.bin 4 t +609_00018.bin 4 t +609_00019.bin 4 t +609_00020.bin 4 t +609_00021.bin 4 t +613_00000.bin 4 +613_00001.bin 4 +613_00002.bin 4 +613_00004.bin 4 +613_00005.bin 4 +613_00007.bin 4 +613_00010.bin 4 +614_00004.bin 4 t +621_00001.bin 4 +621_00005.bin 4 +621_00006.bin 4 +621_00007.bin 4 +621_00009.bin 4 +621_00010.bin 4 +621_00011.bin 4 +621_00012.bin 4 +621_00013.bin 4 +623_00002.bin 4 +623_00004.bin 4 +623_00005.bin 4 +005_00005.bin 5 +011_00001.bin 5 t +021_00006.bin 5 +030_00005.bin 5 +032_00004.bin 5 t +036_00002.bin 5 +036_00004.bin 5 +036_00005.bin 5 +036_00006.bin 5 +038_00005.bin 5 +038_00006.bin 5 +038_00008.bin 5 +038_00009.bin 5 +038_00010.bin 5 +038_00013.bin 5 +041_00005.bin 5 +041_00006.bin 5 +041_00009.bin 5 +041_00011.bin 5 +043_00007.bin 5 +045_00005.bin 5 +047_00000.bin 5 +047_00001.bin 5 +047_00002.bin 5 +049_00005.bin 5 t +054_00001.bin 5 +054_00002.bin 5 +054_00003.bin 5 +054_00011.bin 5 +057_00002.bin 5 +057_00003.bin 5 +062_00006.bin 5 +076_00006.bin 5 t +076_00009.bin 5 t +076_00015.bin 5 t +076_00036.bin 5 t +080_00002.bin 5 +080_00004.bin 5 +082_00005.bin 5 +084_00001.bin 5 +086_00000.bin 5 +109_00005.bin 5 +201_00003.bin 5 +201_00005.bin 5 +201_00006.bin 5 +206_00005.bin 5 +227_00006.bin 5 +231_00004.bin 5 +231_00009.bin 5 +234_00003.bin 5 +234_00004.bin 5 +246_00002.bin 5 +272_00003.bin 5 +308_00004.bin 5 t +522_00001.bin 5 +014_00004.bin 6 +014_00013.bin 6 +015_00009.bin 6 +021_00018.bin 6 +025_00009.bin 6 +030_00026.bin 6 t +030_00027.bin 6 t +036_00018.bin 6 t +036_00022.bin 6 t +036_00024.bin 6 t +036_00028.bin 6 t +036_00033.bin 6 t +036_00034.bin 6 t +038_00019.bin 6 t +038_00021.bin 6 t +038_00029.bin 6 t +038_00030.bin 6 t +038_00034.bin 6 t +038_00035.bin 6 t +038_00037.bin 6 t +038_00038.bin 6 t +041_00019.bin 6 +041_00021.bin 6 +041_00025.bin 6 +041_00029.bin 6 +041_00031.bin 6 +041_00032.bin 6 +041_00033.bin 6 +041_00035.bin 6 +043_00013.bin 6 +047_00017.bin 6 +047_00018.bin 6 +047_00025.bin 6 +049_00009.bin 6 +052_00011.bin 6 +054_00025.bin 6 +054_00028.bin 6 +054_00032.bin 6 +054_00036.bin 6 +057_00011.bin 6 +057_00014.bin 6 +057_00015.bin 6 +057_00016.bin 6 +065_00008.bin 6 t +069_00012.bin 6 +069_00014.bin 6 +069_00015.bin 6 +069_00016.bin 6 +069_00017.bin 6 +071_00006.bin 6 +073_00010.bin 6 +073_00016.bin 6 +074_00025.bin 6 +076_00038.bin 6 +076_00039.bin 6 +076_00040.bin 6 +076_00041.bin 6 +076_00042.bin 6 +076_00043.bin 6 +078_00013.bin 6 +078_00014.bin 6 +080_00009.bin 6 t +080_00018.bin 6 t +086_00021.bin 6 +086_00023.bin 6 +086_00027.bin 6 +089_00018.bin 6 t +093_00015.bin 6 t +096_00018.bin 6 t +098_00005.bin 6 +201_00007.bin 6 +201_00008.bin 6 +201_00018.bin 6 +201_00026.bin 6 +206_00030.bin 6 +206_00031.bin 6 +209_00015.bin 6 t +209_00025.bin 6 t +217_00015.bin 6 +231_00016.bin 6 +231_00017.bin 6 +231_00021.bin 6 +231_00023.bin 6 +231_00026.bin 6 +231_00027.bin 6 +231_00029.bin 6 +237_00012.bin 6 +246_00016.bin 6 +263_00015.bin 6 +265_00020.bin 6 +272_00011.bin 6 +522_00006.bin 6 t +005_00004.bin 7 +005_00006.bin 7 +014_00002.bin 7 +021_00008.bin 7 +032_00005.bin 7 +038_00004.bin 7 +043_00008.bin 7 +047_00004.bin 7 +074_00001.bin 7 t +076_00005.bin 7 +082_00006.bin 7 +089_00004.bin 7 t +096_00002.bin 7 t +096_00004.bin 7 t +096_00005.bin 7 t +096_00007.bin 7 t +109_00004.bin 7 +207_00003.bin 7 +213_00004.bin 7 +213_00008.bin 7 +225_00003.bin 7 +234_00002.bin 7 +234_00006.bin 7 +237_00003.bin 7 +246_00001.bin 7 +246_00003.bin 7 +246_00007.bin 7 +251_00002.bin 7 +251_00004.bin 7 +252_00003.bin 7 +263_00004.bin 7 +265_00001.bin 7 t +273_00003.bin 7 t +276_00002.bin 7 t +279_00005.bin 7 +700_00002.bin 7 +014_00001.bin 8 +014_00003.bin 8 +021_00007.bin 8 +025_00005.bin 8 +041_00003.bin 8 +041_00004.bin 8 +045_00004.bin 8 +047_00005.bin 8 +047_00012.bin 8 +047_00013.bin 8 +049_00012.bin 8 t +054_00010.bin 8 +073_00006.bin 8 +074_00004.bin 8 t +074_00006.bin 8 t +074_00007.bin 8 t +076_00002.bin 8 +076_00033.bin 8 +082_00013.bin 8 +086_00003.bin 8 t +086_00017.bin 8 t +089_00005.bin 8 t +096_00003.bin 8 t +096_00011.bin 8 t +096_00012.bin 8 t +201_00002.bin 8 +201_00012.bin 8 +201_00016.bin 8 +201_00017.bin 8 +201_00019.bin 8 +201_00022.bin 8 +201_00023.bin 8 +201_00025.bin 8 +206_00006.bin 8 t +209_00010.bin 8 +217_00004.bin 8 t +217_00008.bin 8 t +231_00028.bin 8 +237_00002.bin 8 +240_00006.bin 8 t +246_00005.bin 8 +249_00004.bin 8 +251_00001.bin 8 +263_00012.bin 8 t +265_00015.bin 8 +272_00001.bin 8 +272_00007.bin 8 +276_00005.bin 8 +308_00003.bin 8 +308_00006.bin 8 +322_00002.bin 8 +614_00001.bin 8 +014_00007.bin 9 +021_00012.bin 9 +025_00004.bin 9 +030_00021.bin 9 +032_00011.bin 9 +032_00013.bin 9 +045_00007.bin 9 t +049_00002.bin 9 +054_00008.bin 9 +061_00006.bin 9 +061_00007.bin 9 +062_00007.bin 9 +065_00001.bin 9 +069_00003.bin 9 +069_00004.bin 9 +069_00007.bin 9 +071_00002.bin 9 +071_00003.bin 9 +073_00003.bin 9 +074_00002.bin 9 t +076_00026.bin 9 t +076_00027.bin 9 t +076_00032.bin 9 t +076_00035.bin 9 t +078_00004.bin 9 t +082_00016.bin 9 +089_00002.bin 9 +089_00003.bin 9 +093_00007.bin 9 t +096_00037.bin 9 +202_00000.bin 9 +205_00002.bin 9 +205_00003.bin 9 +205_00004.bin 9 +206_00003.bin 9 +206_00004.bin 9 +207_00009.bin 9 +209_00004.bin 9 +213_00007.bin 9 t +213_00017.bin 9 t +217_00003.bin 9 +217_00007.bin 9 +223_00005.bin 9 +223_00017.bin 9 +240_00008.bin 9 +246_00010.bin 9 t +249_00003.bin 9 +251_00012.bin 9 t +252_00004.bin 9 +252_00005.bin 9 +263_00023.bin 9 +265_00012.bin 9 +270_00005.bin 9 +272_00013.bin 9 +273_00001.bin 9 +286_00005.bin 9 +294_00005.bin 9 +308_00001.bin 9 +308_00005.bin 9 +308_00008.bin 9 +322_00008.bin 9 +609_00001.bin 9 +609_00017.bin 9 +613_00008.bin 9 t +613_00009.bin 9 t +613_00011.bin 9 t +614_00002.bin 9 +623_00003.bin 9 +014_00014.bin 0 t +036_00019.bin 0 +047_00015.bin 0 +087_00018.bin 0 +089_00015.bin 0 +206_00029.bin 0 +231_00018.bin 0 +246_00015.bin 0 +252_00011.bin 0 +005_00012.bin 1 +057_00012.bin 1 +065_00015.bin 1 t +080_00016.bin 1 t +092_00008.bin 1 +096_00015.bin 1 +206_00028.bin 1 +209_00017.bin 1 +240_00010.bin 1 +255_00007.bin 1 +032_00014.bin 2 t +041_00047.bin 2 +047_00020.bin 2 t +073_00008.bin 2 +074_00019.bin 2 +078_00009.bin 2 +086_00012.bin 2 t +087_00002.bin 2 +087_00015.bin 2 +093_00026.bin 2 +096_00027.bin 2 +209_00026.bin 2 +213_00020.bin 2 t +223_00009.bin 2 +251_00010.bin 2 t +005_00010.bin 3 +052_00004.bin 3 +065_00004.bin 3 +084_00003.bin 3 t +086_00010.bin 3 +089_00009.bin 3 +213_00009.bin 3 +237_00007.bin 3 t +255_00001.bin 3 +265_00003.bin 3 +005_00007.bin 4 +011_00007.bin 4 +030_00020.bin 4 +032_00010.bin 4 t +036_00015.bin 4 +041_00008.bin 4 +041_00014.bin 4 +045_00010.bin 4 +052_00009.bin 4 t +057_00005.bin 4 t +074_00008.bin 4 t +076_00014.bin 4 t +076_00020.bin 4 t +076_00025.bin 4 t +078_00008.bin 4 +084_00006.bin 4 +096_00010.bin 4 +201_00014.bin 4 +202_00006.bin 4 +206_00009.bin 4 +206_00012.bin 4 +209_00003.bin 4 t +213_00013.bin 4 +231_00010.bin 4 +249_00005.bin 4 +252_00008.bin 4 +322_00010.bin 4 +609_00015.bin 4 t +613_00003.bin 4 +621_00008.bin 4 +623_00006.bin 4 +005_00001.bin 5 +025_00000.bin 5 +036_00007.bin 5 +038_00007.bin 5 +041_00001.bin 5 +041_00017.bin 5 +052_00002.bin 5 +054_00004.bin 5 +076_00008.bin 5 t +078_00002.bin 5 +084_00000.bin 5 +096_00006.bin 5 +209_00002.bin 5 +231_00001.bin 5 +237_00006.bin 5 +005_00016.bin 6 +025_00008.bin 6 +032_00012.bin 6 +036_00030.bin 6 t +038_00025.bin 6 t +041_00026.bin 6 +041_00034.bin 6 +052_00010.bin 6 +057_00013.bin 6 +069_00013.bin 6 +071_00007.bin 6 +082_00015.bin 6 +096_00009.bin 6 t +209_00008.bin 6 t +231_00025.bin 6 +005_00003.bin 7 +011_00003.bin 7 +073_00001.bin 7 t +089_00006.bin 7 t +225_00002.bin 7 +240_00002.bin 7 t +249_00001.bin 7 +251_00005.bin 7 +276_00004.bin 7 t +005_00002.bin 8 +025_00002.bin 8 +047_00016.bin 8 +054_00000.bin 8 +074_00003.bin 8 t +078_00001.bin 8 +093_00004.bin 8 +217_00001.bin 8 t +234_00001.bin 8 +272_00002.bin 8 +030_00007.bin 9 +036_00012.bin 9 +052_00006.bin 9 +066_00002.bin 9 +069_00005.bin 9 +076_00003.bin 9 t +087_00000.bin 9 +093_00012.bin 9 t +206_00002.bin 9 +217_00012.bin 9 +251_00000.bin 9 t +272_00004.bin 9 +279_00006.bin 9 +609_00002.bin 9 +621_00002.bin 9 +005_00000.bin 10 +014_00000.bin 10 +016_00000.bin 10 +021_00005.bin 10 t +049_00000.bin 10 +089_00001.bin 10 +093_00001.bin 10 t +096_00001.bin 10 +109_00002.bin 10 +227_00005.bin 10 +234_00000.bin 10 +237_00000.bin 10 +240_00001.bin 10 +246_00000.bin 10 +249_00000.bin 10 +252_00000.bin 10 t +265_00004.bin 10 +273_00000.bin 10 +014_00006.bin 13 +015_00003.bin 13 +015_00007.bin 13 +016_00005.bin 13 t +030_00006.bin 13 t +036_00003.bin 13 +041_00000.bin 13 t +061_00000.bin 13 +076_00001.bin 13 t +076_00004.bin 13 t +080_00003.bin 13 t +098_00001.bin 13 +098_00003.bin 13 +098_00004.bin 13 +206_00001.bin 13 +263_00000.bin 13 +263_00001.bin 13 +272_00000.bin 13 +286_00000.bin 13 +286_00001.bin 13 +286_00002.bin 13 +286_00003.bin 13 +286_00004.bin 13 +286_00006.bin 13 +286_00008.bin 13 +286_00009.bin 13 +294_00001.bin 13 +294_00002.bin 13 +294_00003.bin 13 +294_00004.bin 13 +065_00014.bin 12 +207_00007.bin 12 +260_00009.bin 12 +700_00011.bin 12 +014_00012.bin 11 t +014_00015.bin 11 t +015_00013.bin 11 +016_00009.bin 11 +016_00010.bin 11 +016_00011.bin 11 +016_00013.bin 11 +021_00016.bin 11 +036_00027.bin 11 +036_00036.bin 11 +049_00015.bin 11 +089_00012.bin 11 +089_00014.bin 11 +096_00013.bin 11 +227_00011.bin 11 t +240_00011.bin 11 t +246_00013.bin 11 +263_00019.bin 11 +263_00020.bin 11 +263_00022.bin 11 +272_00021.bin 11 +272_00024.bin 11 +272_00025.bin 11 +272_00031.bin 11 +272_00035.bin 11 +273_00006.bin 11 +scene0000_00_00032.bin 4 +scene0000_00_00034.bin 4 +scene0000_00_00042.bin 4 +scene0000_00_00043.bin 4 +scene0002_00_00012.bin 4 +scene0002_00_00013.bin 4 +scene0004_00_00008.bin 4 t +scene0006_00_00007.bin 4 t +scene0006_00_00009.bin 4 t +scene0008_00_00005.bin 13 t +scene0010_00_00009.bin 4 t +scene0012_00_00004.bin 4 +scene0012_00_00005.bin 4 +scene0012_00_00006.bin 4 +scene0012_00_00008.bin 4 +scene0013_00_00002.bin 13 +scene0013_00_00003.bin 13 +scene0013_00_00004.bin 13 +scene0015_00_00016.bin 4 +scene0017_00_00014.bin 4 +scene0021_00_00002.bin 13 +scene0021_00_00003.bin 13 +scene0021_00_00004.bin 13 +scene0021_00_00007.bin 13 +scene0024_00_00005.bin 13 +scene0024_00_00010.bin 4 +scene0028_00_00006.bin 13 +scene0028_00_00007.bin 13 +scene0028_00_00009.bin 13 +scene0028_00_00011.bin 13 +scene0030_00_00008.bin 13 +scene0030_00_00020.bin 4 +scene0030_00_00023.bin 4 +scene0030_00_00027.bin 4 +scene0033_00_00002.bin 13 +scene0033_00_00003.bin 13 +scene0033_00_00006.bin 13 +scene0033_00_00007.bin 13 +scene0033_00_00008.bin 13 +scene0033_00_00009.bin 13 +scene0033_00_00011.bin 13 +scene0038_00_00004.bin 4 +scene0038_00_00005.bin 4 +scene0038_00_00006.bin 4 +scene0038_00_00009.bin 4 +scene0038_00_00013.bin 4 +scene0038_00_00016.bin 4 +scene0043_00_00005.bin 4 +scene0046_00_00008.bin 4 t +scene0048_00_00004.bin 4 +scene0049_00_00007.bin 13 +scene0050_00_00008.bin 13 +scene0050_00_00012.bin 4 +scene0054_00_00032.bin 4 +scene0056_00_00013.bin 4 +scene0056_00_00015.bin 4 +scene0056_00_00016.bin 4 +scene0056_00_00017.bin 4 +scene0056_00_00021.bin 4 +scene0056_00_00022.bin 4 +scene0057_00_00009.bin 4 +scene0058_00_00007.bin 4 +scene0059_00_00008.bin 4 t +scene0059_00_00011.bin 4 t +scene0059_00_00013.bin 4 t +scene0059_00_00014.bin 4 t +scene0059_00_00016.bin 4 t +scene0059_00_00019.bin 13 +scene0059_00_00020.bin 4 t +scene0063_00_00011.bin 4 +scene0064_00_00002.bin 13 +scene0066_00_00007.bin 4 +scene0066_00_00008.bin 4 +scene0066_00_00009.bin 4 +scene0066_00_00012.bin 4 +scene0066_00_00013.bin 4 +scene0066_00_00014.bin 4 +scene0070_00_00007.bin 4 +scene0075_00_00005.bin 4 +scene0076_00_00008.bin 4 +scene0076_00_00010.bin 4 +scene0079_00_00011.bin 4 t +scene0079_00_00012.bin 4 t +scene0079_00_00014.bin 4 t +scene0082_00_00005.bin 4 +scene0085_00_00009.bin 4 +scene0087_00_00009.bin 9 +scene0088_00_00004.bin 4 +scene0088_00_00006.bin 4 +scene0088_00_00009.bin 4 +scene0088_00_00010.bin 4 +scene0088_00_00011.bin 4 +scene0088_00_00013.bin 4 +scene0088_00_00016.bin 4 +scene0088_00_00021.bin 4 +scene0089_00_00006.bin 4 t +scene0095_00_00007.bin 4 +scene0098_00_00009.bin 4 +scene0098_00_00010.bin 4 +scene0101_00_00020.bin 4 +scene0103_00_00006.bin 4 +scene0103_00_00008.bin 4 +scene0103_00_00010.bin 4 +scene0106_00_00015.bin 4 +scene0107_00_00005.bin 13 +scene0108_00_00008.bin 4 +scene0114_00_00010.bin 4 +scene0114_00_00011.bin 4 +scene0114_00_00012.bin 4 +scene0122_00_00005.bin 4 +scene0122_00_00006.bin 4 +scene0122_00_00007.bin 4 +scene0126_00_00005.bin 4 +scene0126_00_00007.bin 4 +scene0126_00_00010.bin 4 +scene0129_00_00005.bin 13 +scene0129_00_00006.bin 13 +scene0131_00_00010.bin 4 +scene0131_00_00012.bin 4 +scene0132_00_00007.bin 4 +scene0132_00_00010.bin 4 +scene0132_00_00013.bin 13 t +scene0132_00_00014.bin 4 +scene0132_00_00015.bin 4 +scene0133_00_00002.bin 4 +scene0133_00_00003.bin 4 +scene0133_00_00004.bin 4 +scene0133_00_00005.bin 4 +scene0134_00_00005.bin 4 +scene0134_00_00007.bin 4 +scene0134_00_00008.bin 4 +scene0138_00_00014.bin 4 +scene0138_00_00016.bin 4 +scene0138_00_00018.bin 4 +scene0138_00_00024.bin 4 +scene0140_00_00011.bin 4 +scene0140_00_00014.bin 4 +scene0140_00_00017.bin 4 +scene0140_00_00018.bin 4 +scene0140_00_00019.bin 4 +scene0140_00_00020.bin 4 +scene0140_00_00021.bin 4 +scene0140_00_00022.bin 4 +scene0140_00_00023.bin 4 +scene0140_00_00024.bin 4 +scene0140_00_00025.bin 4 +scene0140_00_00026.bin 4 +scene0140_00_00028.bin 4 +scene0140_00_00029.bin 4 +scene0140_00_00030.bin 4 +scene0140_00_00031.bin 4 +scene0140_00_00032.bin 4 +scene0140_00_00034.bin 4 +scene0141_00_00010.bin 4 t +scene0141_00_00011.bin 4 t +scene0141_00_00013.bin 4 t +scene0143_00_00004.bin 13 +scene0144_00_00011.bin 4 t +scene0144_00_00012.bin 4 t +scene0145_00_00007.bin 4 +scene0149_00_00015.bin 4 +scene0150_00_00004.bin 4 +scene0152_00_00011.bin 4 +scene0152_00_00012.bin 4 +scene0152_00_00015.bin 4 +scene0152_00_00017.bin 4 +scene0155_00_00009.bin 4 +scene0155_00_00010.bin 4 +scene0155_00_00011.bin 4 +scene0155_00_00012.bin 4 +scene0156_00_00010.bin 4 +scene0156_00_00011.bin 4 +scene0159_00_00006.bin 4 t +scene0160_00_00006.bin 4 +scene0161_00_00004.bin 4 t +scene0163_00_00004.bin 4 t +scene0163_00_00005.bin 4 t +scene0163_00_00007.bin 4 t +scene0163_00_00008.bin 4 t +scene0163_00_00010.bin 4 t +scene0165_00_00003.bin 13 +scene0165_00_00004.bin 13 +scene0168_00_00015.bin 4 t +scene0171_00_00005.bin 4 +scene0171_00_00006.bin 4 +scene0171_00_00007.bin 4 +scene0171_00_00008.bin 4 +scene0171_00_00009.bin 4 +scene0171_00_00010.bin 4 +scene0177_00_00009.bin 4 +scene0177_00_00010.bin 4 +scene0178_00_00011.bin 4 +scene0001_00_00012.bin 9 +scene0001_00_00016.bin 9 +scene0001_00_00019.bin 9 +scene0002_00_00024.bin 9 +scene0013_00_00005.bin 9 +scene0022_00_00003.bin 9 +scene0022_00_00005.bin 9 +scene0022_00_00006.bin 9 +scene0024_00_00004.bin 9 +scene0035_00_00008.bin 9 +scene0038_00_00003.bin 9 +scene0050_00_00007.bin 5 +scene0053_00_00005.bin 9 +scene0054_00_00046.bin 9 +scene0064_00_00003.bin 9 t +scene0082_00_00001.bin 9 +scene0082_00_00002.bin 9 +scene0091_00_00004.bin 9 +scene0101_00_00016.bin 9 +scene0102_00_00004.bin 9 +scene0106_00_00009.bin 9 +scene0106_00_00012.bin 9 +scene0111_00_00008.bin 9 +scene0127_00_00017.bin 9 +scene0129_00_00007.bin 9 +scene0132_00_00009.bin 4 +scene0136_00_00010.bin 3 t +scene0137_00_00007.bin 9 t +scene0138_00_00006.bin 9 t +scene0140_00_00004.bin 9 t +scene0151_00_00007.bin 9 +scene0152_00_00010.bin 9 +scene0152_00_00014.bin 9 +scene0155_00_00003.bin 9 +scene0155_00_00004.bin 9 +scene0155_00_00008.bin 9 +scene0155_00_00013.bin 9 +scene0155_00_00015.bin 9 +scene0157_00_00007.bin 9 +scene0162_00_00006.bin 9 +scene0163_00_00002.bin 9 t +scene0178_00_00007.bin 9 +scene0181_00_00018.bin 9 +scene0181_00_00025.bin 9 +scene0187_00_00004.bin 9 +scene0187_00_00005.bin 9 +scene0187_00_00008.bin 9 +scene0199_00_00004.bin 9 t +scene0203_00_00011.bin 9 +scene0203_00_00014.bin 9 +scene0205_00_00005.bin 9 +scene0209_00_00010.bin 9 +scene0212_00_00003.bin 9 +scene0213_00_00010.bin 9 +scene0213_00_00015.bin 9 +scene0226_00_00007.bin 9 +scene0226_00_00011.bin 9 +scene0230_00_00008.bin 9 +scene0235_00_00013.bin 9 +scene0235_00_00021.bin 9 +scene0239_00_00007.bin 9 +scene0246_00_00008.bin 9 t +scene0246_00_00018.bin 9 t +scene0251_00_00005.bin 9 +scene0251_00_00006.bin 9 +scene0259_00_00008.bin 9 +scene0266_00_00004.bin 9 +scene0266_00_00005.bin 9 +scene0267_00_00002.bin 9 +scene0270_00_00010.bin 9 +scene0272_00_00009.bin 9 +scene0276_00_00009.bin 9 t +scene0276_00_00015.bin 9 t +scene0279_00_00012.bin 9 +scene0279_00_00021.bin 9 +scene0281_00_00006.bin 9 +scene0288_00_00007.bin 9 +scene0295_00_00006.bin 9 t +scene0295_00_00007.bin 9 t +scene0297_00_00006.bin 3 +scene0297_00_00008.bin 9 +scene0300_00_00002.bin 9 t +scene0300_00_00003.bin 9 t +scene0301_00_00006.bin 9 +scene0307_00_00009.bin 8 +scene0309_00_00004.bin 5 +scene0315_00_00013.bin 9 +scene0315_00_00025.bin 9 +scene0317_00_00010.bin 9 +scene0322_00_00002.bin 9 +scene0324_00_00003.bin 9 +scene0336_00_00004.bin 5 +scene0340_00_00011.bin 9 +scene0342_00_00005.bin 9 +scene0355_00_00007.bin 9 t +scene0355_00_00008.bin 9 t +scene0357_00_00013.bin 9 t +scene0358_00_00003.bin 9 +scene0358_00_00020.bin 9 +scene0362_00_00012.bin 9 +scene0363_00_00013.bin 9 +scene0370_00_00017.bin 9 t +scene0385_00_00006.bin 3 +scene0386_00_00008.bin 9 t +scene0387_00_00009.bin 9 t +scene0389_00_00008.bin 9 +scene0390_00_00002.bin 9 +scene0404_00_00006.bin 9 +scene0407_00_00006.bin 9 +scene0418_00_00010.bin 3 +scene0424_00_00005.bin 5 +scene0430_00_00002.bin 9 t +scene0432_00_00003.bin 9 +scene0451_00_00007.bin 9 +scene0455_00_00005.bin 9 t +scene0461_00_00005.bin 9 +scene0465_00_00006.bin 9 +scene0472_00_00009.bin 9 +scene0476_00_00008.bin 9 +scene0477_00_00020.bin 9 +scene0481_00_00005.bin 9 +scene0481_00_00006.bin 9 +scene0481_00_00007.bin 9 +scene0481_00_00011.bin 9 +scene0487_00_00017.bin 9 +scene0487_00_00019.bin 9 +scene0495_00_00001.bin 9 +scene0495_00_00002.bin 9 +scene0499_00_00006.bin 9 +scene0499_00_00016.bin 9 +scene0500_00_00008.bin 9 +scene0507_00_00005.bin 9 +scene0514_00_00007.bin 9 +scene0518_00_00004.bin 9 t +scene0529_00_00016.bin 9 t +scene0537_00_00004.bin 9 +scene0542_00_00006.bin 9 +scene0547_00_00013.bin 9 +scene0549_00_00009.bin 9 t +scene0549_00_00010.bin 9 t +scene0549_00_00012.bin 9 t +scene0549_00_00013.bin 9 t +scene0558_00_00011.bin 9 t +scene0572_00_00004.bin 9 +scene0574_00_00005.bin 9 +scene0588_00_00016.bin 9 +scene0588_00_00017.bin 9 +scene0588_00_00018.bin 9 +scene0588_00_00021.bin 9 +scene0598_00_00003.bin 9 +scene0599_00_00003.bin 9 t +scene0601_00_00010.bin 9 +scene0603_00_00007.bin 9 +scene0603_00_00009.bin 5 +scene0603_00_00016.bin 9 +scene0617_00_00007.bin 9 +scene0622_00_00001.bin 9 +scene0626_00_00003.bin 9 +scene0627_00_00002.bin 9 +scene0638_00_00001.bin 9 +scene0640_00_00006.bin 9 +scene0641_00_00008.bin 9 +scene0646_00_00009.bin 9 t +scene0646_00_00017.bin 9 t +scene0000_00_00019.bin 5 t +scene0006_00_00005.bin 5 +scene0032_00_00005.bin 5 +scene0035_00_00005.bin 5 +scene0040_00_00003.bin 5 t +scene0043_00_00003.bin 5 +scene0050_00_00022.bin 5 +scene0055_00_00002.bin 5 +scene0078_00_00002.bin 5 +scene0089_00_00004.bin 5 +scene0091_00_00005.bin 5 +scene0094_00_00006.bin 5 +scene0101_00_00006.bin 5 +scene0108_00_00003.bin 5 +scene0108_00_00005.bin 5 +scene0110_00_00006.bin 5 +scene0123_00_00002.bin 9 t +scene0123_00_00003.bin 9 t +scene0123_00_00004.bin 9 t +scene0123_00_00005.bin 9 t +scene0126_00_00004.bin 5 +scene0127_00_00008.bin 5 +scene0127_00_00009.bin 5 +scene0155_00_00002.bin 5 +scene0166_00_00005.bin 5 +scene0174_00_00006.bin 5 +scene0193_00_00003.bin 5 +scene0207_00_00005.bin 5 +scene0211_00_00004.bin 5 +scene0217_00_00006.bin 5 t +scene0217_00_00008.bin 5 t +scene0222_00_00003.bin 5 t +scene0222_00_00004.bin 5 t +scene0231_00_00015.bin 5 +scene0233_00_00005.bin 5 +scene0266_00_00002.bin 5 t +scene0266_00_00006.bin 5 t +scene0266_00_00009.bin 5 t +scene0266_00_00018.bin 9 +scene0272_00_00007.bin 5 +scene0287_00_00003.bin 5 +scene0293_00_00000.bin 5 +scene0320_00_00004.bin 5 t +scene0333_00_00002.bin 5 +scene0336_00_00006.bin 5 +scene0341_00_00003.bin 5 +scene0353_00_00007.bin 5 t +scene0370_00_00003.bin 5 +scene0376_00_00004.bin 5 t +scene0378_00_00005.bin 5 +scene0378_00_00007.bin 5 +scene0378_00_00010.bin 5 +scene0383_00_00006.bin 5 +scene0398_00_00004.bin 5 +scene0398_00_00007.bin 5 +scene0400_00_00005.bin 5 t +scene0425_00_00004.bin 5 t +scene0440_00_00007.bin 5 t +scene0440_00_00009.bin 5 t +scene0443_00_00005.bin 5 +scene0443_00_00009.bin 5 +scene0468_00_00006.bin 5 +scene0468_00_00008.bin 5 +scene0474_00_00005.bin 5 +scene0489_00_00003.bin 5 +scene0505_00_00002.bin 5 t +scene0506_00_00004.bin 5 +scene0515_00_00011.bin 5 t +scene0517_00_00009.bin 5 +scene0517_00_00011.bin 5 +scene0547_00_00008.bin 5 +scene0554_00_00010.bin 5 +scene0620_00_00004.bin 5 +scene0643_00_00006.bin 5 t +scene0643_00_00007.bin 5 t +scene0643_00_00008.bin 5 t +scene0000_00_00041.bin 0 +scene0043_00_00007.bin 0 t +scene0050_00_00017.bin 0 +scene0054_00_00041.bin 0 t +scene0054_00_00049.bin 0 t +scene0108_00_00016.bin 0 t +scene0130_00_00006.bin 0 +scene0141_00_00017.bin 0 +scene0174_00_00008.bin 0 +scene0187_00_00013.bin 0 +scene0198_00_00011.bin 0 +scene0217_00_00016.bin 0 +scene0239_00_00008.bin 0 +scene0242_00_00007.bin 0 +scene0358_00_00018.bin 0 t +scene0372_00_00013.bin 0 +scene0388_00_00008.bin 0 +scene0425_00_00016.bin 0 +scene0426_00_00022.bin 0 +scene0430_00_00022.bin 0 +scene0433_00_00013.bin 0 +scene0456_00_00010.bin 0 +scene0473_00_00008.bin 0 t +scene0493_00_00009.bin 0 +scene0508_00_00016.bin 0 +scene0517_00_00023.bin 0 t +scene0517_00_00027.bin 0 t +scene0517_00_00030.bin 0 t +scene0558_00_00009.bin 0 +scene0580_00_00010.bin 0 +scene0580_00_00011.bin 0 +scene0615_00_00021.bin 0 +scene0627_00_00037.bin 0 +scene0000_00_00012.bin 3 +scene0000_00_00014.bin 3 +scene0000_00_00022.bin 3 +scene0000_00_00023.bin 3 +scene0000_00_00028.bin 3 +scene0000_00_00033.bin 3 +scene0002_00_00004.bin 3 +scene0002_00_00015.bin 8 +scene0002_00_00018.bin 8 +scene0003_00_00003.bin 3 +scene0003_00_00004.bin 3 +scene0003_00_00005.bin 3 +scene0003_00_00007.bin 3 +scene0003_00_00008.bin 3 +scene0003_00_00011.bin 3 +scene0007_00_00001.bin 3 +scene0010_00_00008.bin 5 +scene0014_00_00005.bin 12 t +scene0018_00_00006.bin 3 t +scene0024_00_00009.bin 3 t +scene0026_00_00009.bin 12 +scene0034_00_00006.bin 3 +scene0035_00_00006.bin 3 t +scene0040_00_00014.bin 3 t +scene0046_00_00004.bin 3 +scene0047_00_00004.bin 3 t +scene0047_00_00009.bin 3 t +scene0049_00_00006.bin 3 +scene0051_00_00006.bin 3 +scene0054_00_00030.bin 3 +scene0063_00_00006.bin 3 +scene0063_00_00008.bin 3 +scene0063_00_00017.bin 3 +scene0068_00_00004.bin 3 +scene0072_00_00002.bin 3 +scene0073_00_00005.bin 3 +scene0076_00_00005.bin 3 +scene0080_00_00003.bin 3 +scene0090_00_00004.bin 14 +scene0090_00_00005.bin 14 +scene0090_00_00006.bin 14 +scene0091_00_00008.bin 3 +scene0092_00_00005.bin 3 +scene0092_00_00008.bin 1 +scene0094_00_00003.bin 5 +scene0095_00_00004.bin 3 t +scene0097_00_00004.bin 3 +scene0097_00_00005.bin 3 +scene0097_00_00006.bin 3 +scene0097_00_00014.bin 3 +scene0100_00_00002.bin 3 +scene0101_00_00012.bin 3 +scene0104_00_00006.bin 3 +scene0108_00_00004.bin 8 +scene0108_00_00007.bin 8 +scene0109_00_00003.bin 3 +scene0110_00_00003.bin 3 +scene0114_00_00002.bin 3 t +scene0114_00_00003.bin 3 t +scene0114_00_00006.bin 3 t +scene0114_00_00014.bin 3 t +scene0114_00_00015.bin 3 t +scene0114_00_00017.bin 3 t +scene0114_00_00021.bin 3 t +scene0117_00_00002.bin 3 +scene0117_00_00004.bin 3 +scene0117_00_00005.bin 3 +scene0117_00_00010.bin 3 +scene0121_00_00005.bin 3 t +scene0124_00_00005.bin 14 +scene0124_00_00006.bin 3 +scene0126_00_00008.bin 8 +scene0127_00_00004.bin 3 +scene0127_00_00006.bin 3 +scene0131_00_00014.bin 3 +scene0147_00_00004.bin 3 +scene0147_00_00007.bin 3 +scene0147_00_00009.bin 3 +scene0147_00_00010.bin 3 +scene0147_00_00012.bin 3 +scene0147_00_00016.bin 3 +scene0149_00_00005.bin 3 +scene0149_00_00009.bin 3 +scene0149_00_00011.bin 3 +scene0149_00_00017.bin 3 +scene0153_00_00005.bin 3 +scene0157_00_00004.bin 3 +scene0158_00_00002.bin 3 +scene0158_00_00003.bin 3 +scene0158_00_00006.bin 3 +scene0158_00_00007.bin 3 +scene0162_00_00007.bin 8 +scene0164_00_00003.bin 3 +scene0164_00_00008.bin 3 +scene0164_00_00010.bin 3 +scene0164_00_00012.bin 3 +scene0164_00_00017.bin 3 +scene0172_00_00003.bin 3 t +scene0175_00_00006.bin 3 +scene0181_00_00004.bin 3 +scene0184_00_00003.bin 3 +scene0186_00_00004.bin 3 t +scene0186_00_00012.bin 3 t +scene0188_00_00007.bin 3 +scene0195_00_00006.bin 3 +scene0200_00_00003.bin 3 +scene0201_00_00007.bin 3 +scene0204_00_00003.bin 3 +scene0205_00_00002.bin 3 +scene0205_00_00008.bin 3 +scene0207_00_00008.bin 8 t +scene0210_00_00003.bin 3 t +scene0211_00_00005.bin 3 t +scene0211_00_00006.bin 3 t +scene0214_00_00004.bin 3 +scene0214_00_00006.bin 8 +scene0214_00_00011.bin 3 +scene0215_00_00004.bin 3 +scene0217_00_00004.bin 3 +scene0221_00_00007.bin 3 +scene0221_00_00009.bin 3 +scene0223_00_00002.bin 3 +scene0223_00_00009.bin 5 +scene0224_00_00010.bin 3 +scene0225_00_00006.bin 3 +scene0225_00_00007.bin 3 +scene0225_00_00008.bin 3 +scene0231_00_00013.bin 3 +scene0232_00_00006.bin 3 +scene0232_00_00009.bin 3 +scene0233_00_00003.bin 3 +scene0233_00_00010.bin 3 +scene0233_00_00011.bin 3 +scene0233_00_00012.bin 3 +scene0236_00_00006.bin 3 +scene0240_00_00003.bin 3 +scene0240_00_00004.bin 3 +scene0240_00_00013.bin 3 +scene0246_00_00006.bin 3 +scene0247_00_00006.bin 3 t +scene0247_00_00008.bin 3 t +scene0247_00_00014.bin 3 t +scene0247_00_00019.bin 3 t +scene0250_00_00006.bin 3 +scene0253_00_00002.bin 3 t +scene0255_00_00006.bin 3 +scene0255_00_00008.bin 3 +scene0259_00_00004.bin 8 +scene0270_00_00011.bin 3 +scene0271_00_00012.bin 3 +scene0272_00_00008.bin 3 +scene0276_00_00005.bin 3 +scene0276_00_00006.bin 3 +scene0276_00_00013.bin 3 +scene0278_00_00003.bin 3 +scene0278_00_00004.bin 3 +scene0279_00_00010.bin 3 +scene0280_00_00010.bin 3 +scene0282_00_00006.bin 3 t +scene0286_00_00009.bin 3 +scene0295_00_00004.bin 3 +scene0295_00_00010.bin 3 +scene0296_00_00010.bin 3 +scene0303_00_00006.bin 3 t +scene0304_00_00005.bin 3 +scene0305_00_00010.bin 3 +scene0309_00_00008.bin 3 +scene0310_00_00002.bin 3 +scene0310_00_00003.bin 3 +scene0311_00_00001.bin 3 +scene0327_00_00007.bin 3 +scene0327_00_00009.bin 3 +scene0335_00_00002.bin 3 +scene0335_00_00007.bin 3 +scene0335_00_00011.bin 3 +scene0335_00_00012.bin 3 +scene0335_00_00023.bin 3 +scene0336_00_00008.bin 3 t +scene0337_00_00001.bin 3 t +scene0338_00_00002.bin 3 +scene0338_00_00005.bin 3 +scene0345_00_00006.bin 3 +scene0348_00_00003.bin 3 +scene0348_00_00004.bin 3 +scene0348_00_00005.bin 3 +scene0350_00_00007.bin 8 +scene0352_00_00009.bin 3 t +scene0353_00_00018.bin 3 +scene0356_00_00005.bin 3 +scene0357_00_00002.bin 3 +scene0357_00_00015.bin 3 +scene0361_00_00006.bin 8 +scene0364_00_00004.bin 3 +scene0364_00_00007.bin 3 +scene0364_00_00010.bin 3 +scene0366_00_00002.bin 3 +scene0369_00_00007.bin 3 +scene0369_00_00008.bin 3 +scene0376_00_00005.bin 3 t +scene0378_00_00008.bin 8 +scene0378_00_00019.bin 3 t +scene0379_00_00004.bin 8 +scene0379_00_00014.bin 3 +scene0379_00_00028.bin 3 +scene0390_00_00005.bin 3 +scene0392_00_00011.bin 3 +scene0392_00_00013.bin 3 +scene0392_00_00014.bin 3 +scene0394_00_00015.bin 3 +scene0395_00_00008.bin 3 +scene0398_00_00013.bin 3 +scene0400_00_00007.bin 3 +scene0409_00_00003.bin 3 +scene0414_00_00006.bin 3 +scene0419_00_00006.bin 3 +scene0425_00_00002.bin 3 +scene0426_00_00005.bin 3 +scene0431_00_00003.bin 3 +scene0431_00_00004.bin 3 +scene0431_00_00007.bin 3 +scene0431_00_00011.bin 3 +scene0431_00_00012.bin 3 +scene0431_00_00014.bin 3 +scene0438_00_00007.bin 3 +scene0439_00_00002.bin 3 t +scene0439_00_00003.bin 3 t +scene0439_00_00004.bin 3 t +scene0439_00_00011.bin 3 t +scene0439_00_00012.bin 3 t +scene0440_00_00002.bin 3 t +scene0440_00_00013.bin 3 t +scene0444_00_00000.bin 8 +scene0447_00_00003.bin 3 +scene0447_00_00011.bin 12 t +scene0449_00_00004.bin 8 +scene0449_00_00006.bin 12 +scene0465_00_00011.bin 3 +scene0467_00_00011.bin 3 +scene0472_00_00004.bin 3 +scene0472_00_00010.bin 12 +scene0472_00_00018.bin 3 +scene0476_00_00004.bin 3 +scene0477_00_00007.bin 3 t +scene0477_00_00008.bin 3 t +scene0477_00_00021.bin 3 t +scene0478_00_00002.bin 3 +scene0479_00_00002.bin 3 +scene0479_00_00003.bin 3 +scene0479_00_00012.bin 3 +scene0482_00_00002.bin 3 +scene0487_00_00022.bin 3 +scene0488_00_00003.bin 3 t +scene0488_00_00004.bin 3 t +scene0488_00_00005.bin 3 t +scene0488_00_00008.bin 3 t +scene0488_00_00011.bin 3 t +scene0491_00_00002.bin 3 +scene0492_00_00005.bin 12 +scene0498_00_00010.bin 3 +scene0504_00_00021.bin 3 +scene0505_00_00014.bin 3 +scene0505_00_00018.bin 3 +scene0505_00_00021.bin 3 +scene0506_00_00005.bin 3 +scene0506_00_00009.bin 3 +scene0510_00_00003.bin 12 t +scene0511_00_00005.bin 3 t +scene0515_00_00010.bin 3 t +scene0517_00_00001.bin 3 +scene0517_00_00013.bin 3 +scene0517_00_00014.bin 3 +scene0517_00_00022.bin 3 +scene0519_00_00003.bin 12 +scene0521_00_00005.bin 3 +scene0521_00_00013.bin 3 +scene0525_00_00005.bin 3 +scene0529_00_00003.bin 3 t +scene0529_00_00009.bin 3 t +scene0529_00_00013.bin 12 t +scene0532_00_00014.bin 3 +scene0540_00_00011.bin 3 t +scene0541_00_00007.bin 3 +scene0541_00_00008.bin 3 +scene0542_00_00003.bin 3 +scene0546_00_00010.bin 3 +scene0547_00_00003.bin 3 t +scene0548_00_00009.bin 3 +scene0556_00_00005.bin 3 +scene0570_00_00005.bin 12 +scene0573_00_00006.bin 3 +scene0577_00_00006.bin 3 +scene0577_00_00007.bin 3 +scene0577_00_00008.bin 3 +scene0580_00_00007.bin 3 +scene0584_00_00005.bin 3 +scene0589_00_00003.bin 3 +scene0589_00_00005.bin 3 +scene0590_00_00009.bin 3 +scene0590_00_00016.bin 3 +scene0591_00_00004.bin 3 +scene0603_00_00008.bin 8 +scene0607_00_00003.bin 3 t +scene0614_00_00009.bin 3 +scene0615_00_00008.bin 3 +scene0620_00_00005.bin 3 +scene0620_00_00006.bin 3 +scene0623_00_00011.bin 3 +scene0629_00_00004.bin 3 +scene0631_00_00002.bin 3 +scene0632_00_00003.bin 3 +scene0633_00_00007.bin 3 +scene0642_00_00008.bin 3 t +scene0642_00_00020.bin 3 t +scene0646_00_00019.bin 8 +scene0005_00_00008.bin 8 +scene0012_00_00003.bin 8 +scene0020_00_00002.bin 8 +scene0020_00_00008.bin 8 +scene0025_00_00007.bin 8 +scene0028_00_00004.bin 8 +scene0028_00_00008.bin 8 +scene0028_00_00013.bin 8 +scene0028_00_00014.bin 8 +scene0028_00_00019.bin 8 +scene0030_00_00001.bin 8 +scene0030_00_00014.bin 8 +scene0030_00_00022.bin 8 +scene0032_00_00003.bin 8 t +scene0037_00_00002.bin 8 +scene0037_00_00003.bin 8 +scene0040_00_00002.bin 8 +scene0040_00_00011.bin 8 +scene0049_00_00005.bin 8 +scene0050_00_00014.bin 8 +scene0051_00_00005.bin 8 +scene0054_00_00003.bin 8 +scene0054_00_00005.bin 8 +scene0054_00_00011.bin 8 +scene0054_00_00014.bin 8 +scene0054_00_00039.bin 8 +scene0072_00_00013.bin 8 t +scene0077_00_00001.bin 8 +scene0077_00_00011.bin 8 +scene0079_00_00003.bin 8 +scene0079_00_00004.bin 8 +scene0079_00_00005.bin 8 +scene0079_00_00006.bin 8 +scene0079_00_00007.bin 8 +scene0079_00_00010.bin 8 +scene0092_00_00004.bin 8 +scene0094_00_00005.bin 8 +scene0098_00_00004.bin 8 t +scene0098_00_00011.bin 8 t +scene0108_00_00012.bin 8 +scene0109_00_00006.bin 8 +scene0131_00_00008.bin 8 +scene0144_00_00013.bin 8 +scene0154_00_00004.bin 8 +scene0168_00_00020.bin 8 +scene0168_00_00021.bin 8 +scene0177_00_00002.bin 8 +scene0177_00_00004.bin 8 +scene0177_00_00007.bin 8 +scene0181_00_00013.bin 8 +scene0181_00_00014.bin 8 +scene0186_00_00005.bin 8 +scene0186_00_00009.bin 8 +scene0186_00_00015.bin 8 +scene0190_00_00002.bin 8 +scene0190_00_00004.bin 8 +scene0191_00_00001.bin 8 +scene0194_00_00005.bin 8 +scene0197_00_00002.bin 8 +scene0203_00_00003.bin 8 +scene0203_00_00009.bin 8 +scene0207_00_00019.bin 8 t +scene0208_00_00002.bin 8 +scene0208_00_00005.bin 8 +scene0208_00_00006.bin 8 +scene0208_00_00007.bin 8 +scene0208_00_00008.bin 8 +scene0208_00_00009.bin 8 +scene0211_00_00007.bin 8 +scene0217_00_00005.bin 8 t +scene0217_00_00009.bin 8 t +scene0218_00_00002.bin 8 t +scene0223_00_00008.bin 8 t +scene0223_00_00010.bin 8 t +scene0224_00_00005.bin 8 +scene0231_00_00006.bin 8 t +scene0233_00_00007.bin 8 +scene0233_00_00008.bin 8 +scene0236_00_00005.bin 8 +scene0236_00_00010.bin 8 +scene0240_00_00006.bin 8 +scene0241_00_00005.bin 8 +scene0246_00_00011.bin 8 +scene0253_00_00009.bin 8 +scene0259_00_00013.bin 8 +scene0262_00_00003.bin 8 +scene0272_00_00002.bin 8 +scene0272_00_00006.bin 8 +scene0286_00_00019.bin 3 +scene0293_00_00003.bin 8 +scene0295_00_00005.bin 8 +scene0301_00_00017.bin 8 t +scene0303_00_00003.bin 8 t +scene0305_00_00006.bin 8 +scene0305_00_00008.bin 8 +scene0305_00_00009.bin 8 +scene0305_00_00013.bin 8 +scene0309_00_00007.bin 8 +scene0325_00_00003.bin 8 t +scene0325_00_00004.bin 8 t +scene0332_00_00008.bin 8 +scene0349_00_00004.bin 8 +scene0353_00_00006.bin 8 +scene0353_00_00008.bin 8 +scene0361_00_00002.bin 8 +scene0361_00_00004.bin 8 +scene0377_00_00002.bin 8 +scene0377_00_00004.bin 8 +scene0378_00_00003.bin 8 +scene0378_00_00004.bin 8 +scene0379_00_00006.bin 8 +scene0379_00_00009.bin 8 +scene0382_00_00005.bin 8 t +scene0383_00_00003.bin 8 t +scene0392_00_00009.bin 8 +scene0393_00_00003.bin 8 +scene0395_00_00013.bin 8 +scene0398_00_00012.bin 8 t +scene0400_00_00003.bin 8 +scene0404_00_00001.bin 8 +scene0404_00_00005.bin 8 +scene0407_00_00004.bin 8 +scene0408_00_00004.bin 8 +scene0422_00_00009.bin 1 +scene0424_00_00003.bin 8 +scene0425_00_00006.bin 8 t +scene0425_00_00022.bin 8 t +scene0440_00_00005.bin 8 +scene0440_00_00008.bin 8 +scene0443_00_00008.bin 8 +scene0443_00_00010.bin 8 +scene0444_00_00002.bin 8 +scene0451_00_00009.bin 3 +scene0464_00_00004.bin 8 +scene0465_00_00018.bin 8 +scene0467_00_00003.bin 8 t +scene0467_00_00006.bin 8 t +scene0467_00_00010.bin 8 t +scene0474_00_00006.bin 8 +scene0474_00_00011.bin 8 +scene0481_00_00002.bin 8 t +scene0504_00_00003.bin 8 +scene0505_00_00004.bin 8 +scene0506_00_00006.bin 8 +scene0506_00_00007.bin 8 +scene0514_00_00009.bin 8 t +scene0515_00_00012.bin 8 +scene0518_00_00001.bin 8 +scene0521_00_00004.bin 8 t +scene0534_00_00003.bin 8 +scene0534_00_00004.bin 8 +scene0542_00_00008.bin 8 t +scene0545_00_00003.bin 8 +scene0547_00_00005.bin 8 +scene0554_00_00007.bin 8 t +scene0558_00_00002.bin 8 +scene0565_00_00006.bin 8 +scene0565_00_00008.bin 8 +scene0576_00_00008.bin 8 +scene0577_00_00003.bin 8 +scene0580_00_00006.bin 8 +scene0582_00_00004.bin 8 t +scene0582_00_00014.bin 8 t +scene0585_00_00002.bin 8 +scene0585_00_00005.bin 8 +scene0585_00_00007.bin 8 +scene0589_00_00002.bin 8 +scene0591_00_00005.bin 8 +scene0591_00_00010.bin 8 +scene0593_00_00003.bin 8 +scene0598_00_00002.bin 8 +scene0603_00_00002.bin 8 +scene0603_00_00012.bin 8 +scene0603_00_00019.bin 8 +scene0613_00_00004.bin 8 +scene0613_00_00006.bin 8 +scene0614_00_00002.bin 8 +scene0614_00_00003.bin 8 +scene0614_00_00018.bin 3 +scene0614_00_00020.bin 8 +scene0619_00_00003.bin 8 t +scene0630_00_00002.bin 8 +scene0632_00_00004.bin 8 +scene0635_00_00003.bin 8 +scene0643_00_00009.bin 8 +scene0643_00_00010.bin 8 +scene0644_00_00003.bin 8 +scene0645_00_00025.bin 8 +scene0646_00_00013.bin 8 +scene0646_00_00018.bin 8 +scene0646_00_00025.bin 8 +scene0010_00_00020.bin 6 t +scene0010_00_00024.bin 6 t +scene0010_00_00031.bin 6 t +scene0017_00_00016.bin 6 +scene0025_00_00015.bin 6 +scene0025_00_00016.bin 6 +scene0040_00_00016.bin 6 t +scene0040_00_00017.bin 6 t +scene0056_00_00014.bin 6 +scene0056_00_00020.bin 6 +scene0070_00_00013.bin 6 +scene0085_00_00011.bin 6 t +scene0095_00_00010.bin 6 +scene0095_00_00011.bin 6 +scene0095_00_00012.bin 6 +scene0095_00_00015.bin 6 +scene0131_00_00022.bin 6 +scene0137_00_00012.bin 6 +scene0138_00_00017.bin 6 +scene0138_00_00021.bin 6 +scene0147_00_00018.bin 6 +scene0166_00_00010.bin 6 +scene0168_00_00022.bin 6 +scene0168_00_00025.bin 6 +scene0177_00_00008.bin 6 t +scene0177_00_00015.bin 6 t +scene0184_00_00005.bin 6 +scene0206_00_00020.bin 6 t +scene0209_00_00015.bin 6 +scene0211_00_00012.bin 6 +scene0238_00_00010.bin 6 +scene0263_00_00016.bin 6 +scene0264_00_00007.bin 6 +scene0279_00_00020.bin 6 t +scene0289_00_00012.bin 6 +scene0296_00_00025.bin 6 +scene0305_00_00016.bin 6 +scene0305_00_00018.bin 6 +scene0305_00_00021.bin 6 +scene0314_00_00008.bin 6 t +scene0320_00_00016.bin 6 +scene0362_00_00011.bin 6 +scene0378_00_00018.bin 6 +scene0385_00_00012.bin 6 +scene0389_00_00011.bin 6 +scene0395_00_00011.bin 6 +scene0416_00_00017.bin 6 +scene0424_00_00015.bin 6 +scene0424_00_00018.bin 6 +scene0424_00_00019.bin 6 +scene0426_00_00010.bin 6 +scene0480_00_00006.bin 6 +scene0489_00_00011.bin 6 +scene0489_00_00012.bin 6 +scene0502_00_00002.bin 6 +scene0568_00_00005.bin 6 +scene0569_00_00015.bin 6 +scene0582_00_00007.bin 6 +scene0582_00_00012.bin 6 +scene0582_00_00013.bin 6 +scene0590_00_00017.bin 6 +scene0598_00_00010.bin 6 +scene0598_00_00011.bin 6 +scene0599_00_00007.bin 6 t +scene0603_00_00013.bin 6 +scene0604_00_00009.bin 6 +scene0608_00_00008.bin 6 +scene0614_00_00021.bin 6 +scene0617_00_00004.bin 6 +scene0623_00_00008.bin 6 +scene0642_00_00018.bin 6 +scene0643_00_00022.bin 6 +scene0643_00_00024.bin 6 +scene0646_00_00031.bin 6 t +scene0000_00_00024.bin 7 +scene0002_00_00006.bin 7 +scene0002_00_00009.bin 7 +scene0002_00_00010.bin 7 +scene0010_00_00007.bin 7 +scene0017_00_00006.bin 7 t +scene0019_00_00008.bin 7 +scene0025_00_00004.bin 7 +scene0026_00_00008.bin 7 +scene0026_00_00010.bin 7 +scene0029_00_00003.bin 7 +scene0030_00_00009.bin 7 +scene0032_00_00006.bin 7 +scene0040_00_00008.bin 7 +scene0042_00_00005.bin 7 +scene0044_00_00003.bin 7 +scene0047_00_00007.bin 7 +scene0050_00_00011.bin 7 +scene0050_00_00013.bin 7 +scene0051_00_00008.bin 7 +scene0051_00_00010.bin 7 +scene0054_00_00007.bin 7 +scene0054_00_00010.bin 7 +scene0054_00_00012.bin 7 +scene0054_00_00019.bin 7 +scene0056_00_00006.bin 7 +scene0062_00_00003.bin 7 t +scene0065_00_00003.bin 7 +scene0071_00_00002.bin 7 +scene0072_00_00007.bin 7 +scene0073_00_00006.bin 7 t +scene0078_00_00004.bin 7 +scene0084_00_00006.bin 7 +scene0085_00_00007.bin 7 +scene0086_00_00002.bin 7 +scene0096_00_00007.bin 7 +scene0096_00_00009.bin 7 +scene0097_00_00003.bin 7 t +scene0098_00_00015.bin 7 +scene0110_00_00005.bin 7 +scene0115_00_00003.bin 7 t +scene0118_00_00003.bin 7 +scene0118_00_00004.bin 7 +scene0121_00_00006.bin 7 t +scene0122_00_00003.bin 7 t +scene0124_00_00002.bin 7 +scene0124_00_00003.bin 7 +scene0126_00_00006.bin 7 +scene0127_00_00005.bin 7 +scene0140_00_00008.bin 7 +scene0142_00_00003.bin 7 +scene0144_00_00009.bin 7 +scene0153_00_00004.bin 7 +scene0159_00_00009.bin 7 +scene0162_00_00004.bin 7 t +scene0174_00_00004.bin 7 +scene0175_00_00007.bin 7 +scene0177_00_00005.bin 7 +scene0178_00_00006.bin 7 +scene0184_00_00004.bin 7 t +scene0186_00_00020.bin 7 +scene0191_00_00006.bin 7 t +scene0195_00_00004.bin 7 t +scene0196_00_00004.bin 7 +scene0197_00_00004.bin 7 t +scene0198_00_00005.bin 7 +scene0198_00_00006.bin 7 +scene0204_00_00004.bin 7 +scene0210_00_00006.bin 7 +scene0214_00_00007.bin 7 +scene0217_00_00007.bin 7 +scene0220_00_00009.bin 7 +scene0232_00_00004.bin 7 +scene0233_00_00006.bin 7 +scene0240_00_00005.bin 7 t +scene0241_00_00003.bin 7 t +scene0242_00_00002.bin 7 t +scene0242_00_00003.bin 7 t +scene0250_00_00005.bin 7 t +scene0251_00_00009.bin 7 t +scene0259_00_00006.bin 7 t +scene0261_00_00006.bin 7 +scene0261_00_00007.bin 7 +scene0265_00_00007.bin 12 +scene0267_00_00007.bin 7 +scene0268_00_00006.bin 7 +scene0276_00_00011.bin 7 +scene0279_00_00007.bin 7 +scene0286_00_00005.bin 7 +scene0290_00_00008.bin 7 +scene0290_00_00011.bin 7 +scene0290_00_00012.bin 7 +scene0296_00_00009.bin 7 +scene0303_00_00005.bin 7 +scene0304_00_00006.bin 7 +scene0305_00_00011.bin 7 +scene0307_00_00006.bin 7 +scene0308_00_00006.bin 7 +scene0327_00_00006.bin 7 +scene0327_00_00008.bin 7 +scene0329_00_00007.bin 7 +scene0329_00_00008.bin 7 +scene0329_00_00012.bin 7 +scene0332_00_00005.bin 7 +scene0335_00_00005.bin 7 t +scene0346_00_00004.bin 7 +scene0350_00_00005.bin 7 +scene0352_00_00004.bin 7 +scene0357_00_00005.bin 7 +scene0358_00_00005.bin 7 +scene0360_00_00003.bin 7 +scene0364_00_00006.bin 7 +scene0375_00_00002.bin 7 +scene0378_00_00006.bin 7 +scene0383_00_00005.bin 7 +scene0384_00_00003.bin 7 +scene0389_00_00005.bin 7 +scene0396_00_00005.bin 7 +scene0398_00_00005.bin 7 +scene0410_00_00002.bin 7 +scene0415_00_00004.bin 7 +scene0419_00_00019.bin 7 +scene0421_00_00005.bin 7 +scene0424_00_00007.bin 7 t +scene0425_00_00005.bin 7 +scene0434_00_00005.bin 7 +scene0438_00_00008.bin 7 +scene0446_00_00004.bin 7 +scene0447_00_00007.bin 7 +scene0448_00_00004.bin 7 +scene0449_00_00008.bin 7 +scene0465_00_00010.bin 7 +scene0470_00_00002.bin 7 +scene0473_00_00002.bin 7 +scene0473_00_00004.bin 7 +scene0474_00_00007.bin 7 t +scene0479_00_00004.bin 7 +scene0487_00_00006.bin 7 +scene0498_00_00004.bin 7 +scene0499_00_00018.bin 7 +scene0501_00_00003.bin 7 +scene0524_00_00007.bin 7 +scene0525_00_00008.bin 7 +scene0527_00_00004.bin 7 t +scene0530_00_00006.bin 7 +scene0532_00_00004.bin 7 +scene0534_00_00006.bin 7 +scene0538_00_00004.bin 7 +scene0539_00_00006.bin 7 t +scene0541_00_00009.bin 7 +scene0547_00_00007.bin 7 t +scene0548_00_00007.bin 7 +scene0550_00_00005.bin 7 +scene0554_00_00005.bin 7 +scene0560_00_00004.bin 7 +scene0561_00_00003.bin 7 +scene0561_00_00004.bin 7 +scene0561_00_00006.bin 7 +scene0561_00_00007.bin 7 +scene0561_00_00008.bin 7 +scene0564_00_00002.bin 7 +scene0571_00_00005.bin 7 +scene0574_00_00003.bin 7 +scene0581_00_00006.bin 7 +scene0583_00_00005.bin 7 +scene0599_00_00005.bin 7 +scene0613_00_00008.bin 7 t +scene0615_00_00004.bin 7 +scene0623_00_00006.bin 7 +scene0625_00_00003.bin 7 +scene0628_00_00005.bin 7 +scene0629_00_00011.bin 7 +scene0635_00_00006.bin 7 +scene0642_00_00026.bin 7 t +scene0643_00_00005.bin 7 t +scene0645_00_00012.bin 7 t +scene0646_00_00007.bin 7 +scene0000_00_00038.bin 1 +scene0000_00_00039.bin 1 +scene0000_00_00046.bin 1 +scene0002_00_00029.bin 1 t +scene0002_00_00035.bin 1 t +scene0003_00_00009.bin 1 +scene0009_00_00006.bin 1 +scene0014_00_00007.bin 1 +scene0017_00_00015.bin 1 t +scene0018_00_00009.bin 1 +scene0018_00_00013.bin 1 +scene0026_00_00016.bin 1 t +scene0029_00_00007.bin 1 +scene0036_00_00005.bin 1 +scene0043_00_00006.bin 1 +scene0058_00_00011.bin 1 +scene0060_00_00007.bin 1 +scene0086_00_00009.bin 1 t +scene0089_00_00007.bin 1 +scene0089_00_00008.bin 1 +scene0100_00_00009.bin 1 t +scene0104_00_00008.bin 1 +scene0108_00_00021.bin 1 +scene0109_00_00007.bin 1 +scene0111_00_00011.bin 1 +scene0120_00_00006.bin 1 +scene0127_00_00016.bin 1 t +scene0136_00_00005.bin 1 +scene0136_00_00008.bin 1 +scene0140_00_00027.bin 1 +scene0140_00_00035.bin 1 +scene0155_00_00019.bin 1 +scene0178_00_00016.bin 1 t +scene0193_00_00006.bin 1 +scene0195_00_00009.bin 1 +scene0197_00_00007.bin 1 +scene0217_00_00014.bin 1 +scene0217_00_00015.bin 1 +scene0220_00_00016.bin 1 +scene0222_00_00011.bin 1 t +scene0222_00_00012.bin 1 t +scene0225_00_00013.bin 1 +scene0225_00_00020.bin 1 +scene0225_00_00023.bin 1 +scene0230_00_00012.bin 1 +scene0233_00_00017.bin 1 +scene0233_00_00019.bin 1 +scene0233_00_00024.bin 1 +scene0240_00_00009.bin 1 +scene0240_00_00011.bin 1 +scene0249_00_00014.bin 1 t +scene0251_00_00012.bin 1 t +scene0251_00_00015.bin 1 t +scene0251_00_00016.bin 1 t +scene0251_00_00017.bin 1 t +scene0251_00_00018.bin 1 t +scene0255_00_00011.bin 1 +scene0260_00_00010.bin 1 +scene0263_00_00015.bin 1 +scene0264_00_00011.bin 1 +scene0265_00_00009.bin 1 +scene0267_00_00011.bin 1 +scene0267_00_00012.bin 1 +scene0274_00_00006.bin 1 +scene0289_00_00016.bin 1 t +scene0329_00_00018.bin 1 +scene0340_00_00017.bin 1 +scene0347_00_00006.bin 1 +scene0348_00_00011.bin 1 +scene0349_00_00008.bin 1 t +scene0353_00_00016.bin 1 +scene0358_00_00014.bin 1 +scene0360_00_00002.bin 1 +scene0360_00_00005.bin 1 +scene0370_00_00012.bin 1 +scene0371_00_00008.bin 1 +scene0373_00_00006.bin 1 +scene0377_00_00005.bin 1 t +scene0377_00_00008.bin 1 t +scene0378_00_00015.bin 1 +scene0383_00_00009.bin 1 t +scene0394_00_00024.bin 1 +scene0398_00_00008.bin 1 t +scene0400_00_00010.bin 1 +scene0402_00_00010.bin 1 t +scene0403_00_00005.bin 1 +scene0405_00_00002.bin 1 +scene0405_00_00003.bin 1 +scene0405_00_00004.bin 1 +scene0405_00_00005.bin 1 +scene0405_00_00006.bin 1 +scene0405_00_00007.bin 1 +scene0405_00_00008.bin 1 +scene0405_00_00009.bin 1 +scene0406_00_00008.bin 1 +scene0415_00_00012.bin 1 +scene0422_00_00005.bin 1 +scene0431_00_00013.bin 1 +scene0434_00_00008.bin 1 +scene0436_00_00003.bin 1 +scene0436_00_00004.bin 1 +scene0436_00_00006.bin 1 +scene0445_00_00005.bin 1 t +scene0445_00_00006.bin 1 t +scene0456_00_00013.bin 1 +scene0464_00_00015.bin 1 +scene0469_00_00012.bin 1 +scene0470_00_00009.bin 1 +scene0476_00_00009.bin 1 +scene0486_00_00007.bin 1 +scene0486_00_00008.bin 1 +scene0487_00_00025.bin 1 +scene0498_00_00008.bin 1 +scene0508_00_00013.bin 1 +scene0510_00_00007.bin 1 +scene0510_00_00009.bin 1 +scene0511_00_00006.bin 1 +scene0517_00_00029.bin 1 +scene0519_00_00005.bin 1 +scene0523_00_00006.bin 1 +scene0528_00_00009.bin 1 +scene0530_00_00010.bin 1 t +scene0544_00_00006.bin 1 +scene0552_00_00015.bin 1 +scene0565_00_00013.bin 1 t +scene0574_00_00007.bin 1 +scene0575_00_00014.bin 1 t +scene0579_00_00004.bin 1 +scene0579_00_00005.bin 1 +scene0585_00_00012.bin 1 +scene0585_00_00013.bin 1 +scene0585_00_00015.bin 1 +scene0586_00_00010.bin 1 +scene0593_00_00006.bin 1 +scene0600_00_00007.bin 1 t +scene0610_00_00007.bin 1 +scene0616_00_00014.bin 1 +scene0644_00_00016.bin 1 +scene0030_00_00033.bin 2 +scene0030_00_00036.bin 2 +scene0030_00_00043.bin 2 +scene0030_00_00051.bin 2 +scene0030_00_00052.bin 2 +scene0054_00_00052.bin 2 +scene0077_00_00012.bin 2 +scene0098_00_00008.bin 2 +scene0104_00_00009.bin 2 +scene0108_00_00015.bin 2 +scene0120_00_00007.bin 2 +scene0120_00_00008.bin 2 +scene0164_00_00013.bin 2 +scene0174_00_00009.bin 2 +scene0206_00_00019.bin 2 +scene0256_00_00004.bin 2 +scene0256_00_00005.bin 2 +scene0263_00_00005.bin 2 +scene0291_00_00026.bin 2 +scene0301_00_00016.bin 2 +scene0315_00_00010.bin 2 +scene0325_00_00013.bin 2 +scene0357_00_00016.bin 2 t +scene0379_00_00021.bin 2 t +scene0384_00_00009.bin 2 t +scene0384_00_00017.bin 2 t +scene0384_00_00018.bin 2 t +scene0384_00_00023.bin 2 t +scene0384_00_00025.bin 2 t +scene0384_00_00039.bin 2 t +scene0404_00_00008.bin 2 +scene0419_00_00013.bin 2 +scene0421_00_00009.bin 2 +scene0421_00_00011.bin 2 +scene0421_00_00013.bin 2 +scene0426_00_00008.bin 2 +scene0426_00_00013.bin 2 +scene0426_00_00020.bin 2 +scene0479_00_00017.bin 2 +scene0479_00_00019.bin 2 +scene0487_00_00023.bin 2 +scene0565_00_00007.bin 2 +scene0565_00_00009.bin 2 +scene0592_00_00028.bin 2 t +scene0636_00_00001.bin 2 +scene0646_00_00030.bin 2 +scene0000_00_00005.bin 10 t +scene0006_00_00002.bin 10 +scene0006_00_00003.bin 10 +scene0032_00_00002.bin 10 +scene0035_00_00002.bin 10 +scene0039_00_00002.bin 10 +scene0046_00_00003.bin 10 +scene0055_00_00006.bin 10 +scene0070_00_00005.bin 10 t +scene0072_00_00005.bin 10 +scene0073_00_00003.bin 10 +scene0078_00_00003.bin 10 t +scene0085_00_00003.bin 10 +scene0085_00_00005.bin 10 +scene0092_00_00002.bin 10 +scene0101_00_00004.bin 10 +scene0107_00_00003.bin 10 +scene0127_00_00003.bin 10 +scene0127_00_00007.bin 10 +scene0127_00_00010.bin 10 +scene0137_00_00003.bin 10 +scene0137_00_00004.bin 10 +scene0143_00_00000.bin 10 t +scene0144_00_00002.bin 10 t +scene0147_00_00001.bin 10 +scene0148_00_00003.bin 10 t +scene0178_00_00003.bin 10 +scene0178_00_00004.bin 10 +scene0178_00_00018.bin 10 +scene0184_00_00002.bin 10 +scene0193_00_00002.bin 10 +scene0207_00_00003.bin 10 +scene0209_00_00005.bin 10 +scene0209_00_00006.bin 10 +scene0217_00_00002.bin 10 +scene0217_00_00003.bin 10 +scene0219_00_00001.bin 10 +scene0221_00_00003.bin 10 +scene0221_00_00004.bin 10 +scene0222_00_00005.bin 10 +scene0222_00_00006.bin 10 +scene0223_00_00007.bin 10 +scene0233_00_00004.bin 10 +scene0233_00_00009.bin 10 +scene0235_00_00004.bin 10 t +scene0236_00_00001.bin 10 +scene0246_00_00004.bin 10 t +scene0259_00_00003.bin 10 +scene0270_00_00003.bin 10 +scene0270_00_00004.bin 10 +scene0271_00_00003.bin 10 +scene0276_00_00003.bin 10 +scene0277_00_00005.bin 10 +scene0279_00_00004.bin 10 +scene0280_00_00008.bin 10 +scene0282_00_00004.bin 10 +scene0286_00_00003.bin 10 +scene0287_00_00002.bin 10 t +scene0295_00_00002.bin 10 +scene0296_00_00002.bin 10 +scene0296_00_00004.bin 10 +scene0298_00_00002.bin 10 t +scene0308_00_00003.bin 10 +scene0321_00_00002.bin 10 t +scene0340_00_00004.bin 10 +scene0340_00_00005.bin 10 +scene0356_00_00003.bin 10 +scene0356_00_00009.bin 10 +scene0359_00_00003.bin 10 +scene0364_00_00003.bin 10 t +scene0376_00_00003.bin 10 +scene0389_00_00004.bin 10 +scene0392_00_00007.bin 10 +scene0394_00_00003.bin 10 +scene0398_00_00002.bin 10 +scene0398_00_00003.bin 10 +scene0400_00_00004.bin 10 +scene0416_00_00004.bin 10 +scene0416_00_00005.bin 10 +scene0418_00_00002.bin 10 +scene0426_00_00002.bin 10 +scene0435_00_00003.bin 10 +scene0435_00_00004.bin 10 +scene0438_00_00001.bin 10 +scene0440_00_00003.bin 10 +scene0440_00_00004.bin 10 +scene0445_00_00002.bin 10 +scene0457_00_00002.bin 10 t +scene0468_00_00005.bin 10 +scene0472_00_00003.bin 10 +scene0477_00_00003.bin 10 +scene0477_00_00004.bin 10 +scene0506_00_00003.bin 10 t +scene0515_00_00006.bin 10 t +scene0521_00_00003.bin 10 +scene0541_00_00005.bin 10 t +scene0545_00_00002.bin 10 +scene0548_00_00004.bin 10 +scene0556_00_00003.bin 10 +scene0556_00_00004.bin 10 +scene0557_00_00002.bin 10 +scene0560_00_00002.bin 10 +scene0567_00_00002.bin 10 +scene0576_00_00003.bin 10 t +scene0577_00_00004.bin 10 t +scene0580_00_00004.bin 10 +scene0589_00_00006.bin 10 +scene0590_00_00003.bin 10 +scene0600_00_00002.bin 10 +scene0604_00_00003.bin 10 t +scene0613_00_00001.bin 10 +scene0615_00_00003.bin 10 +scene0620_00_00002.bin 10 +scene0640_00_00004.bin 10 +scene0642_00_00005.bin 10 +scene0645_00_00003.bin 10 +scene0645_00_00004.bin 10 +scene0000_00_00003.bin 13 +scene0001_00_00002.bin 13 t +scene0001_00_00003.bin 13 t +scene0001_00_00004.bin 13 t +scene0002_00_00005.bin 13 +scene0008_00_00003.bin 13 t +scene0008_00_00004.bin 13 t +scene0025_00_00005.bin 13 +scene0025_00_00006.bin 13 +scene0027_00_00002.bin 13 t +scene0031_00_00005.bin 13 +scene0031_00_00007.bin 13 +scene0031_00_00008.bin 13 +scene0031_00_00009.bin 13 +scene0031_00_00011.bin 13 +scene0031_00_00012.bin 13 +scene0031_00_00014.bin 13 +scene0036_00_00002.bin 13 +scene0036_00_00003.bin 13 +scene0040_00_00007.bin 13 +scene0049_00_00003.bin 13 +scene0050_00_00003.bin 13 +scene0053_00_00001.bin 13 +scene0053_00_00003.bin 13 +scene0054_00_00004.bin 13 +scene0059_00_00005.bin 13 +scene0061_00_00001.bin 13 t +scene0064_00_00005.bin 13 +scene0087_00_00003.bin 13 +scene0087_00_00006.bin 13 +scene0091_00_00002.bin 13 t +scene0106_00_00003.bin 13 +scene0106_00_00004.bin 13 +scene0113_00_00002.bin 13 +scene0113_00_00003.bin 13 +scene0113_00_00004.bin 13 +scene0125_00_00003.bin 13 +scene0128_00_00001.bin 13 +scene0137_00_00005.bin 13 t +scene0144_00_00005.bin 13 +scene0145_00_00003.bin 13 +scene0151_00_00003.bin 13 +scene0160_00_00001.bin 13 +scene0160_00_00004.bin 13 +scene0160_00_00005.bin 13 +scene0162_00_00003.bin 13 +scene0166_00_00006.bin 13 t +scene0167_00_00003.bin 13 +scene0167_00_00004.bin 13 +scene0177_00_00006.bin 13 t +scene0181_00_00005.bin 13 +scene0187_00_00006.bin 13 t +scene0187_00_00011.bin 13 t +scene0194_00_00001.bin 13 +scene0199_00_00002.bin 13 +scene0203_00_00006.bin 13 t +scene0207_00_00006.bin 13 +scene0209_00_00009.bin 13 +scene0213_00_00004.bin 13 +scene0213_00_00005.bin 13 +scene0213_00_00008.bin 13 +scene0213_00_00012.bin 13 +scene0218_00_00003.bin 13 +scene0218_00_00004.bin 13 +scene0224_00_00003.bin 13 +scene0226_00_00003.bin 13 +scene0226_00_00004.bin 13 +scene0226_00_00005.bin 13 +scene0226_00_00006.bin 13 +scene0231_00_00011.bin 13 +scene0231_00_00014.bin 13 +scene0235_00_00008.bin 13 +scene0239_00_00004.bin 13 +scene0247_00_00003.bin 13 +scene0247_00_00004.bin 13 +scene0247_00_00015.bin 13 +scene0269_00_00001.bin 13 +scene0269_00_00002.bin 13 +scene0273_00_00006.bin 13 +scene0276_00_00004.bin 13 +scene0279_00_00006.bin 13 +scene0281_00_00003.bin 13 t +scene0281_00_00004.bin 13 t +scene0288_00_00005.bin 13 +scene0294_00_00002.bin 13 +scene0294_00_00003.bin 13 +scene0297_00_00003.bin 13 t +scene0297_00_00004.bin 13 t +scene0301_00_00002.bin 13 +scene0309_00_00019.bin 13 +scene0312_00_00002.bin 13 +scene0312_00_00003.bin 13 +scene0312_00_00004.bin 13 +scene0315_00_00003.bin 13 t +scene0315_00_00005.bin 13 t +scene0316_00_00005.bin 13 +scene0317_00_00005.bin 13 +scene0319_00_00003.bin 13 t +scene0319_00_00004.bin 13 t +scene0319_00_00005.bin 13 t +scene0326_00_00001.bin 13 +scene0327_00_00005.bin 13 +scene0327_00_00015.bin 3 +scene0329_00_00003.bin 13 +scene0329_00_00004.bin 13 +scene0334_00_00002.bin 13 +scene0334_00_00003.bin 13 +scene0339_00_00003.bin 13 +scene0339_00_00005.bin 13 +scene0339_00_00006.bin 13 +scene0339_00_00007.bin 13 +scene0341_00_00002.bin 13 +scene0352_00_00003.bin 13 +scene0353_00_00005.bin 13 +scene0362_00_00004.bin 13 +scene0363_00_00004.bin 13 +scene0363_00_00006.bin 13 +scene0363_00_00007.bin 13 +scene0363_00_00008.bin 13 +scene0363_00_00009.bin 13 +scene0363_00_00010.bin 13 +scene0367_00_00004.bin 13 +scene0367_00_00006.bin 13 +scene0368_00_00006.bin 13 +scene0368_00_00009.bin 13 +scene0368_00_00010.bin 13 +scene0368_00_00034.bin 13 +scene0374_00_00002.bin 13 t +scene0381_00_00002.bin 13 +scene0385_00_00004.bin 13 +scene0386_00_00003.bin 13 +scene0386_00_00005.bin 13 +scene0392_00_00008.bin 13 +scene0394_00_00012.bin 13 +scene0395_00_00005.bin 13 +scene0407_00_00002.bin 13 +scene0424_00_00006.bin 13 t +scene0450_00_00006.bin 13 +scene0451_00_00005.bin 13 +scene0461_00_00002.bin 13 +scene0461_00_00003.bin 13 +scene0467_00_00002.bin 13 +scene0474_00_00004.bin 13 +scene0480_00_00002.bin 13 +scene0484_00_00002.bin 13 t +scene0484_00_00003.bin 13 t +scene0487_00_00008.bin 13 +scene0487_00_00012.bin 13 +scene0499_00_00008.bin 13 +scene0499_00_00009.bin 13 +scene0503_00_00002.bin 13 +scene0504_00_00004.bin 13 +scene0504_00_00017.bin 13 +scene0505_00_00008.bin 13 +scene0514_00_00004.bin 13 t +scene0515_00_00009.bin 13 +scene0517_00_00006.bin 13 +scene0520_00_00001.bin 13 t +scene0520_00_00003.bin 13 t +scene0520_00_00005.bin 13 t +scene0529_00_00004.bin 13 +scene0533_00_00002.bin 13 +scene0533_00_00005.bin 13 +scene0536_00_00002.bin 13 t +scene0537_00_00003.bin 13 t +scene0549_00_00002.bin 13 +scene0549_00_00004.bin 13 +scene0559_00_00002.bin 13 +scene0568_00_00003.bin 13 +scene0587_00_00002.bin 13 +scene0588_00_00004.bin 13 +scene0588_00_00006.bin 13 +scene0588_00_00007.bin 13 +scene0588_00_00008.bin 13 +scene0588_00_00009.bin 13 +scene0588_00_00010.bin 13 +scene0588_00_00011.bin 13 +scene0588_00_00012.bin 13 +scene0588_00_00013.bin 13 +scene0588_00_00014.bin 13 +scene0590_00_00006.bin 13 +scene0593_00_00005.bin 13 +scene0601_00_00008.bin 13 +scene0601_00_00012.bin 13 +scene0603_00_00004.bin 13 +scene0603_00_00005.bin 13 +scene0604_00_00004.bin 13 t +scene0623_00_00003.bin 13 +scene0626_00_00002.bin 13 +scene0641_00_00003.bin 13 +scene0641_00_00005.bin 13 +scene0641_00_00006.bin 13 +scene0645_00_00005.bin 13 +scene0000_00_00035.bin 12 +scene0003_00_00013.bin 12 +scene0009_00_00009.bin 12 +scene0009_00_00011.bin 12 +scene0009_00_00012.bin 12 +scene0009_00_00013.bin 12 +scene0009_00_00014.bin 12 +scene0009_00_00017.bin 12 +scene0014_00_00009.bin 12 t +scene0014_00_00010.bin 12 t +scene0026_00_00017.bin 12 +scene0026_00_00020.bin 12 +scene0034_00_00011.bin 12 t +scene0042_00_00006.bin 12 +scene0051_00_00011.bin 12 t +scene0054_00_00028.bin 12 +scene0065_00_00006.bin 12 +scene0067_00_00006.bin 12 t +scene0068_00_00006.bin 12 +scene0083_00_00004.bin 12 +scene0084_00_00004.bin 12 +scene0086_00_00010.bin 12 +scene0086_00_00011.bin 12 +scene0096_00_00016.bin 12 t +scene0100_00_00008.bin 12 +scene0101_00_00011.bin 12 +scene0116_00_00004.bin 12 +scene0119_00_00005.bin 12 +scene0146_00_00003.bin 12 +scene0170_00_00006.bin 12 +scene0195_00_00015.bin 12 +scene0197_00_00009.bin 12 +scene0207_00_00014.bin 12 +scene0207_00_00017.bin 12 +scene0214_00_00005.bin 12 +scene0232_00_00010.bin 12 +scene0237_00_00003.bin 12 t +scene0246_00_00016.bin 12 +scene0247_00_00025.bin 12 +scene0260_00_00008.bin 12 t +scene0261_00_00005.bin 12 +scene0265_00_00011.bin 12 +scene0268_00_00004.bin 12 +scene0276_00_00016.bin 12 +scene0307_00_00008.bin 12 +scene0348_00_00008.bin 12 +scene0349_00_00003.bin 12 t +scene0349_00_00006.bin 12 t +scene0350_00_00009.bin 12 +scene0366_00_00008.bin 12 +scene0366_00_00009.bin 12 +scene0375_00_00008.bin 12 +scene0394_00_00016.bin 12 t +scene0394_00_00023.bin 12 t +scene0396_00_00008.bin 12 +scene0399_00_00002.bin 12 +scene0406_00_00006.bin 12 +scene0415_00_00003.bin 12 +scene0429_00_00006.bin 12 t +scene0434_00_00010.bin 12 +scene0435_00_00011.bin 12 +scene0439_00_00014.bin 12 t +scene0441_00_00010.bin 12 +scene0446_00_00005.bin 12 +scene0447_00_00005.bin 12 t +scene0448_00_00008.bin 12 +scene0449_00_00012.bin 12 +scene0458_00_00012.bin 12 +scene0460_00_00002.bin 12 +scene0486_00_00009.bin 12 +scene0501_00_00007.bin 12 +scene0516_00_00019.bin 12 t +scene0517_00_00024.bin 12 +scene0519_00_00006.bin 12 +scene0521_00_00011.bin 12 +scene0523_00_00004.bin 12 +scene0527_00_00005.bin 12 +scene0527_00_00006.bin 12 +scene0538_00_00005.bin 12 +scene0542_00_00010.bin 12 +scene0546_00_00008.bin 12 +scene0547_00_00017.bin 12 +scene0553_00_00003.bin 12 t +scene0564_00_00005.bin 12 t +scene0564_00_00006.bin 12 t +scene0574_00_00004.bin 12 +scene0574_00_00009.bin 12 +scene0579_00_00006.bin 12 +scene0579_00_00007.bin 12 +scene0579_00_00008.bin 12 +scene0579_00_00009.bin 12 +scene0581_00_00010.bin 12 +scene0583_00_00006.bin 12 +scene0586_00_00013.bin 12 +scene0602_00_00002.bin 12 t +scene0612_00_00007.bin 12 +scene0631_00_00008.bin 12 +scene0631_00_00009.bin 12 +scene0639_00_00002.bin 12 +scene0639_00_00008.bin 12 +scene0642_00_00010.bin 12 +scene0642_00_00028.bin 12 +scene0645_00_00014.bin 12 +scene0000_00_00036.bin 11 +scene0002_00_00027.bin 11 +scene0002_00_00028.bin 11 +scene0002_00_00034.bin 11 +scene0002_00_00039.bin 11 +scene0016_00_00009.bin 11 +scene0016_00_00012.bin 11 +scene0021_00_00006.bin 11 +scene0025_00_00017.bin 11 t +scene0049_00_00010.bin 11 +scene0049_00_00013.bin 11 +scene0049_00_00014.bin 11 +scene0070_00_00012.bin 11 +scene0072_00_00011.bin 11 +scene0074_00_00004.bin 11 t +scene0137_00_00011.bin 11 +scene0147_00_00017.bin 11 +scene0147_00_00022.bin 11 +scene0147_00_00023.bin 11 +scene0177_00_00011.bin 11 +scene0182_00_00007.bin 11 +scene0194_00_00011.bin 11 +scene0209_00_00017.bin 11 +scene0209_00_00018.bin 11 +scene0209_00_00019.bin 11 +scene0209_00_00020.bin 11 +scene0219_00_00003.bin 11 +scene0222_00_00016.bin 11 +scene0222_00_00017.bin 11 +scene0224_00_00009.bin 11 +scene0235_00_00012.bin 11 +scene0270_00_00013.bin 11 t +scene0270_00_00016.bin 11 t +scene0270_00_00017.bin 11 t +scene0270_00_00018.bin 11 t +scene0270_00_00019.bin 11 t +scene0271_00_00019.bin 11 +scene0296_00_00013.bin 11 +scene0296_00_00015.bin 11 +scene0296_00_00026.bin 11 +scene0308_00_00009.bin 11 +scene0317_00_00016.bin 11 +scene0319_00_00007.bin 11 +scene0319_00_00009.bin 11 +scene0326_00_00006.bin 11 t +scene0331_00_00010.bin 11 +scene0338_00_00006.bin 2 +scene0340_00_00012.bin 11 +scene0340_00_00015.bin 11 +scene0340_00_00016.bin 11 +scene0362_00_00010.bin 11 +scene0385_00_00014.bin 11 +scene0385_00_00015.bin 11 +scene0394_00_00019.bin 11 t +scene0394_00_00022.bin 11 t +scene0394_00_00027.bin 11 t +scene0397_00_00006.bin 11 +scene0407_00_00009.bin 11 +scene0425_00_00012.bin 11 +scene0438_00_00009.bin 11 +scene0467_00_00015.bin 11 +scene0477_00_00012.bin 11 t +scene0477_00_00016.bin 11 t +scene0480_00_00008.bin 11 +scene0507_00_00003.bin 11 +scene0507_00_00004.bin 11 +scene0507_00_00006.bin 11 +scene0518_00_00012.bin 11 t +scene0536_00_00006.bin 11 +scene0548_00_00010.bin 11 +scene0554_00_00017.bin 11 +scene0567_00_00008.bin 11 t +scene0577_00_00016.bin 11 +scene0589_00_00007.bin 11 +scene0590_00_00007.bin 11 t +scene0591_00_00013.bin 11 t +scene0615_00_00016.bin 11 +scene0642_00_00014.bin 11 +scene0642_00_00015.bin 11 +scene0645_00_00022.bin 11 +scene0000_00_00031.bin 14 t +scene0014_00_00006.bin 14 t +scene0026_00_00011.bin 14 +scene0026_00_00012.bin 14 +scene0029_00_00005.bin 14 +scene0034_00_00008.bin 14 +scene0042_00_00007.bin 14 t +scene0051_00_00012.bin 14 t +scene0054_00_00035.bin 14 +scene0062_00_00006.bin 14 +scene0065_00_00008.bin 14 +scene0067_00_00004.bin 14 +scene0083_00_00003.bin 14 +scene0084_00_00005.bin 14 t +scene0086_00_00008.bin 14 t +scene0086_00_00014.bin 14 t +scene0100_00_00006.bin 14 +scene0101_00_00014.bin 14 +scene0112_00_00002.bin 14 +scene0116_00_00005.bin 14 +scene0119_00_00009.bin 14 +scene0135_00_00005.bin 14 t +scene0146_00_00002.bin 14 +scene0153_00_00006.bin 14 +scene0175_00_00010.bin 14 +scene0195_00_00007.bin 14 t +scene0207_00_00011.bin 14 t +scene0214_00_00010.bin 14 +scene0232_00_00008.bin 14 +scene0246_00_00014.bin 14 +scene0250_00_00008.bin 14 +scene0254_00_00008.bin 14 +scene0254_00_00010.bin 14 +scene0260_00_00006.bin 14 t +scene0261_00_00012.bin 14 +scene0265_00_00004.bin 14 +scene0276_00_00014.bin 14 +scene0365_00_00005.bin 14 +scene0366_00_00005.bin 14 +scene0396_00_00007.bin 14 +scene0399_00_00003.bin 14 t +scene0406_00_00005.bin 14 +scene0410_00_00004.bin 14 +scene0429_00_00008.bin 14 t +scene0434_00_00007.bin 14 +scene0435_00_00012.bin 14 +scene0446_00_00007.bin 14 +scene0447_00_00006.bin 14 +scene0448_00_00007.bin 14 +scene0449_00_00005.bin 14 +scene0458_00_00007.bin 14 t +scene0471_00_00005.bin 14 +scene0492_00_00013.bin 14 +scene0501_00_00009.bin 14 +scene0510_00_00004.bin 14 t +scene0510_00_00008.bin 14 t +scene0515_00_00018.bin 14 t +scene0516_00_00020.bin 14 +scene0521_00_00014.bin 14 +scene0523_00_00003.bin 14 +scene0538_00_00006.bin 14 +scene0539_00_00007.bin 14 +scene0546_00_00009.bin 14 +scene0550_00_00009.bin 14 +scene0553_00_00004.bin 14 +scene0564_00_00004.bin 14 +scene0570_00_00006.bin 14 +scene0571_00_00006.bin 14 +scene0581_00_00009.bin 14 +scene0583_00_00008.bin 14 +scene0602_00_00003.bin 14 +scene0610_00_00005.bin 14 +scene0612_00_00003.bin 14 +scene0625_00_00005.bin 14 +scene0631_00_00005.bin 14 +scene0639_00_00006.bin 14 +scene0642_00_00012.bin 14 +scene0645_00_00015.bin 14 diff --git a/zoo/SimpleView/ScanObjectNN/training_data/object_labels.txt b/zoo/SimpleView/ScanObjectNN/training_data/object_labels.txt new file mode 100755 index 0000000..5aaae8e --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/object_labels.txt @@ -0,0 +1,2902 @@ +255 00001 cabinet 363650 +255 00002 cabinet 230216 +255 00003 bin 622825 +255 00006 bin 720908 +255 00007 bin 700110 +255 00008 box 200362 +011 00001 desk 432756 +011 00003 door 1004135 +011 00007 chair 400209 +011 00010 box 625614 +016 00000 bed 285 +016 00005 sofa 268 +016 00009 pillow 163135 +016 00010 pillow 339 +016 00011 pillow 329 +016 00013 pillow 361 +scene0000_00 00003 sofa 32 +scene0000_00 00005 bed 37 +scene0000_00 00012 cabinet 38 +scene0000_00 00014 cabinet 39 +scene0000_00 00019 desk 7 +scene0000_00 00022 cabinet 43 +scene0000_00 00023 cabinet 42 +scene0000_00 00024 door 54 +scene0000_00 00028 cabinet 41 +scene0000_00 00031 toilet 36 +scene0000_00 00032 chair 28 +scene0000_00 00033 cabinet 40 +scene0000_00 00034 chair 29 +scene0000_00 00035 sink 10 +scene0000_00 00036 pillow 16 +scene0000_00 00038 bin 46 +scene0000_00 00039 bin 13 +scene0000_00 00041 bag 18 +scene0000_00 00042 chair 30 +scene0000_00 00043 chair 31 +scene0000_00 00046 bin 12 +061 00000 sofa 990696 +061 00006 table 514183 +061 00007 table 990106 +078 00001 shelf 842960 +078 00002 desk 316895 +078 00004 table 1403410 +078 00005 box 1135748 +078 00008 chair 982877 +078 00009 box 1448653 +078 00010 chair 968823 +078 00013 display 279633 +078 00014 display 1300674 +scene0001_00 00002 sofa 16 +scene0001_00 00003 sofa 17 +scene0001_00 00004 sofa 18 +scene0001_00 00012 table 5 +scene0001_00 00016 table 9 +scene0001_00 00019 table 11 +086 00000 desk 8004 +086 00001 chair 25266 +086 00003 shelf 928534 +086 00006 cabinet 13447 +086 00007 cabinet 24581 +086 00008 chair 28922 +086 00009 box 4318 +086 00010 cabinet 967670 +086 00011 bin 37173 +086 00012 box 18866 +086 00015 bag 36615 +086 00016 bin 36344 +086 00017 shelf 243205 +086 00018 box 35997 +086 00020 bag 36064 +086 00021 display 14528 +086 00023 display 23770 +086 00027 display 29016 +089 00001 bed 2567236 +089 00002 table 1761363 +089 00003 table 2396445 +089 00004 door 723916 +089 00005 shelf 1925200 +089 00006 door 108225 +089 00009 cabinet 2489215 +089 00010 bin 211672 +089 00012 pillow 2339110 +089 00013 box 2615352 +089 00014 pillow 2377904 +089 00015 bag 1980136 +089 00018 display 1688435 +089 00021 box 2435752 +096 00001 bed 710477 +096 00002 door 533756 +096 00003 shelf 336277 +096 00004 door 1593514 +096 00005 door 560309 +096 00006 desk 1342411 +096 00007 door 279277 +096 00008 chair 2077383 +096 00009 display 1095257 +096 00010 chair 2127045 +096 00011 shelf 1206533 +096 00012 shelf 658386 +096 00013 pillow 682583 +096 00015 bin 1758503 +096 00016 bag 1684574 +096 00018 display 1954062 +096 00020 bag 1702458 +096 00027 box 2112094 +096 00037 table 380036 +scene0002_00 00004 cabinet 27 +scene0002_00 00005 sofa 49 +scene0002_00 00006 door 1 +scene0002_00 00009 door 3 +scene0002_00 00010 door 2 +scene0002_00 00012 chair 8 +scene0002_00 00013 chair 9 +scene0002_00 00015 shelf 23 +scene0002_00 00018 shelf 24 +scene0002_00 00024 table 41 +scene0002_00 00027 pillow 17 +scene0002_00 00028 pillow 15 +scene0002_00 00029 bin 13 +scene0002_00 00034 pillow 18 +scene0002_00 00035 bin 14 +scene0002_00 00039 pillow 16 +098 00001 sofa 975703 +098 00002 cabinet 1591147 +098 00003 sofa 1302802 +098 00004 sofa 332274 +098 00005 display 1303801 +098 00007 bag 1606786 +scene0003_00 00003 cabinet 3 +scene0003_00 00004 cabinet 1 +scene0003_00 00005 cabinet 4 +scene0003_00 00007 cabinet 5 +scene0003_00 00008 cabinet 6 +scene0003_00 00009 bin 11 +scene0003_00 00011 cabinet 2 +scene0003_00 00013 sink 13 +206 00001 sofa 3436767 +206 00002 table 1927412 +206 00003 table 2758118 +206 00004 table 770528 +206 00005 desk 1060312 +206 00006 shelf 2180335 +206 00007 chair 1183995 +206 00008 chair 2650685 +206 00009 chair 1123209 +206 00010 chair 887173 +206 00011 chair 3055770 +206 00012 chair 1149228 +206 00013 chair 2476117 +206 00014 chair 2906924 +206 00015 chair 706608 +206 00016 chair 2184905 +206 00018 chair 2852209 +206 00019 chair 2271912 +206 00020 chair 1975258 +206 00021 chair 242315 +206 00022 chair 242410 +206 00024 chair 2535681 +206 00027 chair 1943418 +206 00028 bin 2368372 +206 00029 bag 3441280 +206 00030 display 894803 +206 00031 display 908277 +scene0004_00 00008 chair 6 +207 00002 cabinet 12901 +207 00003 door 12860 +207 00005 bin 11139 +207 00007 sink 22284 +207 00009 table 5247 +207 00010 bin 26820 +213 00003 cabinet 567043 +213 00004 door 29778 +213 00006 cabinet 1511574 +213 00007 table 13862 +213 00008 door 37174 +213 00009 cabinet 46107 +213 00011 box 24434 +213 00012 chair 22487 +213 00013 chair 15443 +213 00014 chair 47213 +213 00015 bin 54799 +213 00017 table 37323 +213 00018 chair 32657 +213 00020 box 37223 +213 00025 bag 33593 +213 00026 bin 20568 +scene0005_00 00008 shelf 1 +223 00003 chair 801775 +223 00004 chair 806693 +223 00005 table 741093 +223 00006 chair 901757 +223 00007 chair 265279 +223 00009 box 422794 +223 00012 bag 217839 +223 00017 table 1030954 +231 00001 desk 461427 +231 00004 desk 837363 +231 00005 chair 1286755 +231 00006 chair 431103 +231 00007 chair 510846 +231 00008 chair 897213 +231 00009 desk 864356 +231 00010 chair 1525182 +231 00016 display 462422 +231 00017 display 1202167 +231 00018 bag 934338 +231 00019 bin 1644844 +231 00021 display 1191101 +231 00023 display 823918 +231 00025 display 280286 +231 00026 display 296981 +231 00027 display 822746 +231 00028 shelf 1098541 +231 00029 display 1189474 +231 00031 box 832885 +243 00002 cabinet 587652 +243 00004 cabinet 610006 +scene0006_00 00002 bed 3 +scene0006_00 00003 bed 2 +scene0006_00 00005 desk 5 +scene0006_00 00007 chair 6 +scene0006_00 00009 chair 7 +scene0007_00 00001 cabinet 5 +272 00000 sofa 1658152 +272 00001 shelf 2452376 +272 00002 shelf 2359312 +272 00003 desk 601153 +272 00004 table 2455751 +272 00006 chair 828499 +272 00007 shelf 2660046 +272 00008 chair 696723 +272 00009 chair 809041 +272 00010 chair 797720 +272 00011 display 2323840 +272 00013 table 1476276 +272 00021 pillow 1563794 +272 00024 pillow 750224 +272 00025 pillow 1594376 +272 00027 box 2264162 +272 00031 pillow 1609348 +272 00035 pillow 807431 +272 00041 box 2322813 +021 00005 bed 286 +021 00006 desk 275 +021 00007 shelf 336 +021 00008 door 289 +021 00011 chair 386 +021 00012 table 304 +021 00014 bin 270 +021 00016 pillow 236608 +021 00018 display 342 +021 00021 bin 297 +032 00004 desk 1313150 +032 00005 door 483 +032 00007 chair 547 +032 00008 chair 485 +032 00009 chair 468 +032 00010 chair 556 +032 00011 table 322 +032 00012 display 407 +032 00013 table 1479001 +032 00014 box 82442 +032 00015 bin 332 +scene0008_00 00003 sofa 2 +scene0008_00 00004 sofa 3 +scene0008_00 00005 sofa 13 +036 00002 desk 2342318 +036 00003 sofa 906 +036 00004 desk 1146291 +036 00005 desk 883076 +036 00006 desk 1152991 +036 00007 desk 2514070 +036 00009 chair 415 +036 00010 chair 2546943 +036 00011 chair 529 +036 00012 table 273 +036 00013 chair 882 +036 00015 chair 787 +036 00018 display 457 +036 00019 bag 567 +036 00021 box 659 +036 00022 display 432 +036 00024 display 570 +036 00027 pillow 546 +036 00028 display 518 +036 00030 display 700426 +036 00033 display 856 +036 00034 display 427 +036 00036 pillow 533 +scene0009_00 00006 bin 24 +scene0009_00 00009 sink 9 +scene0009_00 00011 sink 10 +scene0009_00 00012 sink 19 +scene0009_00 00013 sink 18 +scene0009_00 00014 sink 11 +scene0009_00 00017 sink 12 +038 00004 door 717 +038 00005 desk 619 +038 00006 desk 635 +038 00007 desk 865179 +038 00008 desk 1827498 +038 00009 desk 1736241 +038 00010 desk 1902597 +038 00011 chair 540 +038 00012 chair 372 +038 00013 desk 331 +038 00014 chair 434 +038 00015 chair 707 +038 00016 chair 683 +038 00019 display 1714601 +038 00021 display 404 +038 00025 display 410 +038 00029 display 654 +038 00030 display 452 +038 00032 bag 375 +038 00034 display 159543 +038 00035 display 371 +038 00037 display 499 +038 00038 display 825 +scene0010_00 00007 door 41 +scene0010_00 00008 desk 35 +scene0010_00 00009 chair 7 +scene0010_00 00020 display 43 +scene0010_00 00024 display 42 +scene0010_00 00031 display 44 +041 00000 sofa 2418969 +041 00001 desk 1446271 +041 00003 shelf 1056709 +041 00004 shelf 1940594 +041 00005 desk 2247782 +041 00006 desk 440770 +041 00008 chair 530375 +041 00009 desk 519003 +041 00010 chair 2369776 +041 00011 desk 1127009 +041 00012 cabinet 2336768 +041 00013 chair 1534839 +041 00014 chair 1539818 +041 00015 chair 2274638 +041 00017 desk 1448528 +041 00019 display 409557 +041 00021 display 1091975 +041 00025 display 605558 +041 00026 display 2020231 +041 00028 bag 925049 +041 00029 display 1109451 +041 00031 display 1296859 +041 00032 display 1332672 +041 00033 display 1338861 +041 00034 display 2171386 +041 00035 display 2014257 +041 00038 box 181311 +041 00042 bin 809134 +041 00047 box 1314662 +041 00052 bag 2272273 +052 00002 desk 549143 +052 00004 cabinet 375929 +052 00006 table 1676369 +052 00007 cabinet 1666662 +052 00008 chair 1194383 +052 00009 chair 763979 +052 00010 display 596082 +052 00011 display 536455 +052 00012 bin 1912775 +062 00006 desk 266 +062 00007 table 273 +062 00008 cabinet 903046 +062 00009 bin 359 +066 00002 table 256 +069 00003 table 531644 +069 00004 table 116802 +069 00005 table 7020 +069 00007 table 556825 +069 00009 bin 5787 +069 00010 chair 24981 +069 00012 display 5257 +069 00013 display 76563 +069 00014 display 17591 +069 00015 display 2588 +069 00016 display 1080 +069 00017 display 17651 +005 00000 bed 610041 +005 00001 desk 945706 +005 00002 shelf 112312 +005 00003 door 1018438 +005 00004 door 1547362 +005 00005 desk 1411977 +005 00006 door 1348911 +005 00007 chair 1495681 +005 00008 chair 884857 +005 00010 cabinet 1513254 +005 00012 bin 300780 +005 00015 bin 1098327 +005 00016 display 1395496 +005 00017 bin 1051359 +005 00020 bag 1078561 +005 00021 box 1302642 +014 00000 bed 311327 +014 00001 shelf 517553 +014 00002 door 814659 +014 00003 shelf 852139 +014 00004 display 745473 +014 00006 sofa 800223 +014 00007 table 450127 +014 00009 chair 333239 +014 00012 pillow 255149 +014 00013 display 196828 +014 00014 bag 192324 +014 00015 pillow 679906 +014 00016 bin 364561 +014 00018 bag 220109 +015 00003 sofa 1100424 +015 00007 sofa 953909 +015 00008 cabinet 622267 +015 00009 display 567440 +015 00013 pillow 162285 +scene0012_00 00003 shelf 9 +scene0012_00 00004 chair 4 +scene0012_00 00005 chair 6 +scene0012_00 00006 chair 5 +scene0012_00 00008 chair 7 +025 00000 desk 569772 +025 00002 shelf 469961 +025 00003 chair 1046150 +025 00004 table 1062709 +025 00005 shelf 215140 +025 00006 cabinet 425139 +025 00007 chair 497856 +025 00008 display 361847 +025 00009 display 354144 +025 00011 bag 1151952 +scene0013_00 00002 sofa 3 +scene0013_00 00003 sofa 1 +scene0013_00 00004 sofa 2 +scene0013_00 00005 table 5 +045 00004 shelf 359 +045 00005 desk 296 +045 00007 table 540 +045 00009 chair 260 +045 00010 chair 334 +045 00011 chair 568 +045 00012 box 319 +045 00013 chair 572 +045 00014 chair 513 +045 00016 chair 520 +045 00017 box 603 +045 00018 bin 407 +scene0014_00 00005 sink 8 +scene0014_00 00006 toilet 5 +scene0014_00 00007 bin 9 +scene0014_00 00009 sink 13 +scene0014_00 00010 sink 12 +047 00000 desk 800689 +047 00001 desk 1757162 +047 00002 desk 940086 +047 00004 door 228160 +047 00005 shelf 1681691 +047 00006 chair 1967551 +047 00007 chair 277798 +047 00008 cabinet 1591253 +047 00009 chair 1881840 +047 00010 chair 1705029 +047 00011 cabinet 1690836 +047 00012 shelf 1481374 +047 00013 shelf 1433736 +047 00015 bag 1960892 +047 00016 shelf 395688 +047 00017 display 1465896 +047 00018 display 1620636 +047 00019 bin 740030 +047 00020 box 1748904 +047 00021 box 1821115 +047 00022 box 2012936 +047 00023 bin 628556 +047 00025 display 839119 +047 00026 box 622577 +049 00000 bed 1751497 +049 00002 table 927235 +049 00003 chair 1095956 +049 00004 chair 1352430 +049 00005 desk 989737 +049 00006 cabinet 1954309 +049 00007 bin 1960464 +049 00009 display 761532 +049 00012 shelf 1907226 +049 00015 pillow 187593 +scene0015_00 00016 chair 6 +054 00000 shelf 1937772 +054 00001 desk 2009060 +054 00002 desk 2455851 +054 00003 desk 1211073 +054 00004 desk 1004478 +054 00006 chair 1063528 +054 00007 chair 2573565 +054 00008 table 2707751 +054 00009 chair 2689951 +054 00010 shelf 822900 +054 00011 desk 1106403 +054 00012 chair 3194884 +054 00013 chair 1973300 +054 00014 chair 3198750 +054 00016 chair 1157022 +054 00017 chair 2674732 +054 00018 chair 1240239 +054 00019 box 3179566 +054 00025 display 890861 +054 00026 bag 1981594 +054 00028 display 1913801 +054 00032 display 2426427 +054 00036 display 871853 +054 00050 box 1753004 +scene0016_00 00009 pillow 14 +scene0016_00 00012 pillow 15 +057 00002 desk 499727 +057 00003 desk 113102 +057 00005 chair 574691 +057 00007 chair 259929 +057 00011 display 536281 +057 00012 bin 645956 +057 00013 display 509336 +057 00014 display 87013 +057 00015 display 483912 +057 00016 display 59005 +065 00001 table 1539616 +065 00002 cabinet 1576027 +065 00004 cabinet 1249008 +065 00006 chair 1249074 +065 00007 chair 1639774 +065 00008 display 989018 +065 00009 chair 649059 +065 00011 chair 377132 +065 00013 bin 1691285 +065 00014 sink 1559136 +065 00015 bin 1759299 +scene0017_00 00006 door 13 +scene0017_00 00014 chair 5 +scene0017_00 00015 bin 24 +scene0017_00 00016 display 18 +071 00002 table 859609 +071 00003 table 117872 +071 00006 display 27069 +071 00007 display 18911 +073 00001 door 445 +073 00003 table 287 +073 00005 chair 262 +073 00006 shelf 356 +073 00008 box 263 +073 00010 display 361 +073 00013 chair 467 +073 00014 bag 443 +073 00016 display 413 +scene0018_00 00006 cabinet 11 +scene0018_00 00009 bin 4 +scene0018_00 00013 bin 9 +074 00001 door 501 +074 00002 table 261 +074 00003 shelf 889 +074 00004 shelf 366 +074 00005 box 1249573 +074 00006 shelf 717470 +074 00007 shelf 598624 +074 00008 chair 269 +074 00009 chair 716 +074 00012 box 858 +074 00016 box 1274662 +074 00018 box 881 +074 00019 box 707 +074 00020 box 1340179 +074 00021 box 429 +074 00025 display 472 +074 00029 box 506 +scene0019_00 00008 door 12 +076 00001 sofa 2172405 +076 00002 shelf 2934800 +076 00003 table 3682830 +076 00004 sofa 4862749 +076 00005 door 2634931 +076 00006 desk 4843584 +076 00008 desk 303279 +076 00009 desk 1108277 +076 00010 cabinet 270353 +076 00012 chair 578517 +076 00013 chair 1367306 +076 00014 chair 4277172 +076 00015 desk 3383951 +076 00016 chair 3665968 +076 00017 chair 958638 +076 00018 chair 906757 +076 00019 chair 3841354 +076 00020 chair 659162 +076 00021 chair 3868829 +076 00022 chair 3591474 +076 00023 chair 3827640 +076 00025 chair 1121434 +076 00026 table 4003374 +076 00027 table 3999602 +076 00028 chair 3670280 +076 00029 chair 4365631 +076 00031 chair 1436982 +076 00032 table 4778833 +076 00033 shelf 1872995 +076 00034 chair 3665881 +076 00035 table 2258373 +076 00036 desk 3717792 +076 00037 chair 3589634 +076 00038 display 3392201 +076 00039 display 3411439 +076 00040 display 3301121 +076 00041 display 613022 +076 00042 display 1332176 +076 00043 display 648760 +076 00045 bin 1128808 +scene0020_00 00002 shelf 20 +scene0020_00 00008 shelf 21 +080 00002 desk 550 +080 00003 sofa 1428300 +080 00004 desk 525 +080 00005 chair 521 +080 00006 chair 377 +080 00007 chair 333 +080 00009 display 658 +080 00013 bin 515 +080 00015 bag 466 +080 00016 bin 463 +080 00018 display 556 +082 00005 desk 588 +082 00006 door 284 +082 00007 cabinet 331 +082 00008 cabinet 1345532 +082 00009 chair 468 +082 00011 chair 292 +082 00013 shelf 370 +082 00014 chair 448 +082 00015 display 587 +082 00016 table 634 +082 00018 box 294 +082 00020 bag 275 +082 00024 box 247916 +082 00026 box 250123 +scene0021_00 00002 sofa 3 +scene0021_00 00003 sofa 4 +scene0021_00 00004 sofa 5 +scene0021_00 00006 pillow 7 +scene0021_00 00007 sofa 6 +084 00000 desk 930616 +084 00001 desk 1387406 +084 00002 cabinet 665836 +084 00003 cabinet 268320 +084 00004 chair 1842292 +084 00006 chair 641307 +084 00008 chair 1184848 +084 00009 box 533860 +084 00011 box 401613 +084 00012 bag 983485 +087 00000 table 1923114 +087 00001 chair 1845118 +087 00002 box 2427648 +087 00003 chair 523502 +087 00004 chair 2030820 +087 00005 cabinet 2044341 +087 00007 box 2515216 +087 00008 box 2005619 +087 00009 box 1866763 +087 00011 chair 602539 +087 00012 box 2470539 +087 00015 box 1978320 +087 00017 box 1788817 +087 00018 bag 1373249 +087 00028 box 630224 +scene0022_00 00003 table 10 +scene0022_00 00005 table 9 +scene0022_00 00006 table 8 +092 00008 bin 816381 +093 00001 bed 17296 +093 00004 shelf 10374 +093 00006 chair 20532 +093 00007 table 561768 +093 00009 cabinet 46009 +093 00012 table 1046 +093 00014 bin 40871 +093 00015 display 45105 +093 00016 bin 45594 +093 00018 box 16805 +093 00019 bag 16789 +093 00022 box 29065 +093 00023 box 25093 +093 00026 box 27875 +093 00032 box 28478 +109 00002 bed 5155 +109 00004 door 3852 +109 00005 desk 4917 +109 00007 chair 8705 +109 00008 bin 5587 +109 00012 box 1500 +109 00016 bin 5812 +201 00001 cabinet 37059 +201 00002 shelf 42339 +201 00003 desk 301611 +201 00004 cabinet 11156 +201 00005 desk 33982 +201 00006 desk 1241911 +201 00007 display 40455 +201 00008 display 32456 +201 00009 chair 17651 +201 00010 chair 41593 +201 00012 shelf 1564340 +201 00013 chair 64548 +201 00014 chair 46302 +201 00015 chair 36747 +201 00016 shelf 1013837 +201 00017 shelf 36651 +201 00018 display 18179 +201 00019 shelf 184261 +201 00021 chair 2667 +201 00022 shelf 51842 +201 00023 shelf 42902 +201 00025 shelf 126809 +201 00026 display 1062299 +202 00000 table 1803747 +202 00002 bag 1944789 +202 00003 chair 1326315 +202 00004 chair 2028157 +202 00005 chair 1337667 +202 00006 chair 1991298 +202 00007 chair 334485 +202 00008 chair 870973 +202 00009 chair 1885183 +202 00010 chair 1364915 +202 00011 chair 1238774 +202 00012 chair 153062 +202 00013 chair 1383581 +202 00015 chair 899192 +202 00016 chair 368664 +202 00017 chair 237512 +202 00020 chair 1002884 +scene0024_00 00004 table 16 +scene0024_00 00005 sofa 10 +scene0024_00 00009 cabinet 15 +scene0024_00 00010 chair 11 +209 00001 cabinet 40711 +209 00002 desk 53374 +209 00003 chair 53791 +209 00004 table 60113 +209 00006 chair 10482 +209 00008 display 57130 +209 00010 shelf 28226 +209 00013 bag 60990 +209 00014 bin 25377 +209 00015 display 19006 +209 00017 bin 7416 +209 00019 bag 41025 +209 00022 box 51028 +209 00025 display 57866 +209 00026 box 8791 +209 00029 box 30428 +209 00032 box 7259 +217 00001 shelf 31880 +217 00003 table 32284 +217 00004 shelf 40749 +217 00007 table 1434280 +217 00008 shelf 51797 +217 00012 table 22726 +217 00013 cabinet 2129547 +217 00015 display 44053 +225 00002 door 153525 +225 00003 door 1329270 +225 00004 cabinet 1045783 +225 00005 cabinet 1284873 +225 00007 cabinet 204459 +225 00016 box 121021 +scene0025_00 00004 door 8 +scene0025_00 00005 sofa 4 +scene0025_00 00006 sofa 5 +scene0025_00 00007 shelf 12 +scene0025_00 00015 display 1 +scene0025_00 00016 display 2 +scene0025_00 00017 pillow 3 +227 00005 bed 841576 +227 00006 desk 544251 +227 00007 cabinet 193143 +227 00008 chair 305482 +227 00009 chair 458187 +227 00011 pillow 273783 +227 00012 bag 784928 +234 00000 bed 441833 +234 00001 shelf 1006690 +234 00002 door 716505 +234 00003 desk 164622 +234 00004 desk 428428 +234 00006 door 808683 +234 00007 chair 133385 +234 00008 box 481980 +234 00012 bag 226618 +237 00000 bed 598117 +237 00002 shelf 126850 +237 00003 door 1305878 +237 00004 chair 1253175 +237 00005 chair 895661 +237 00006 desk 288011 +237 00007 cabinet 1388072 +237 00009 bin 396710 +237 00010 bin 377902 +237 00011 bag 1361778 +237 00012 display 842604 +237 00014 bag 1010818 +scene0026_00 00008 door 9 +scene0026_00 00009 sink 5 +scene0026_00 00010 door 10 +scene0026_00 00011 toilet 12 +scene0026_00 00012 toilet 11 +scene0026_00 00016 bin 18 +scene0026_00 00017 sink 16 +scene0026_00 00020 sink 17 +240 00001 bed 476052 +240 00002 door 883792 +240 00006 shelf 297854 +240 00008 table 808125 +240 00009 bag 841781 +240 00010 bin 1273883 +240 00011 pillow 696231 +246 00000 bed 831206 +246 00001 door 1107814 +246 00002 desk 1249977 +246 00003 door 679739 +246 00004 chair 858075 +246 00005 shelf 191341 +246 00006 chair 762699 +246 00007 door 104147 +246 00008 bin 929332 +246 00010 table 431617 +246 00011 chair 1291639 +246 00012 box 1321411 +246 00013 pillow 1236276 +246 00014 bag 1075118 +246 00015 bag 669997 +246 00016 display 1209502 +249 00000 bed 818466 +249 00001 door 889447 +249 00002 cabinet 156277 +249 00003 table 480368 +249 00004 shelf 483930 +249 00005 chair 505618 +scene0027_00 00002 sofa 2 +251 00000 table 1489230 +251 00001 shelf 1203948 +251 00002 door 1613108 +251 00003 box 836969 +251 00004 door 99316 +251 00005 door 961453 +251 00006 chair 1486150 +251 00007 box 468691 +251 00008 box 380275 +251 00010 box 386839 +251 00011 chair 916521 +251 00012 table 913412 +251 00013 chair 346262 +251 00014 bin 841282 +251 00015 bag 768829 +251 00017 chair 201993 +251 00018 bag 205595 +251 00019 chair 1381232 +252 00000 bed 1251673 +252 00002 cabinet 685925 +252 00003 door 1273105 +252 00004 table 262235 +252 00005 table 1219777 +252 00007 cabinet 1181474 +252 00008 chair 318913 +252 00011 bag 1258690 +252 00013 bin 361520 +252 00014 bin 1433657 +260 00000 cabinet 611092 +260 00003 cabinet 568970 +260 00005 cabinet 1134359 +260 00007 cabinet 508240 +260 00008 cabinet 492356 +260 00009 sink 1292569 +260 00012 box 1734523 +scene0028_00 00004 shelf 5 +scene0028_00 00006 sofa 12 +scene0028_00 00007 sofa 13 +scene0028_00 00008 shelf 20 +scene0028_00 00009 sofa 16 +scene0028_00 00011 sofa 17 +scene0028_00 00013 shelf 6 +scene0028_00 00014 shelf 22 +scene0028_00 00019 shelf 7 +263 00000 sofa 1411477 +263 00001 sofa 1976872 +263 00004 door 1298927 +263 00011 chair 314189 +263 00012 shelf 1163703 +263 00014 chair 260273 +263 00015 display 236965 +263 00019 pillow 1891258 +263 00020 pillow 1879678 +263 00022 pillow 1530192 +263 00023 table 654428 +263 00025 box 1081955 +scene0029_00 00003 door 9 +scene0029_00 00005 toilet 10 +scene0029_00 00007 bin 7 +265 00001 door 1180214 +265 00003 cabinet 1222449 +265 00004 bed 358734 +265 00006 cabinet 1153038 +265 00010 bin 1200490 +265 00011 box 751202 +265 00012 table 387654 +265 00015 shelf 1473665 +265 00020 display 641909 +265 00024 bin 1436088 +265 00028 box 714000 +265 00030 bin 1510388 +265 00035 box 152542 +265 00038 box 1382618 +265 00040 box 1402564 +265 00042 box 1401885 +270 00005 table 613921 +270 00006 chair 427980 +270 00007 bin 1171359 +270 00012 bin 1324001 +273 00000 bed 473241 +273 00001 table 986526 +273 00003 door 107842 +273 00004 chair 1006480 +273 00006 pillow 970577 +273 00007 bin 838567 +273 00010 bag 571055 +276 00000 cabinet 925143 +276 00002 door 767591 +276 00004 door 237753 +276 00005 shelf 1431264 +276 00006 cabinet 265207 +276 00007 box 520193 +276 00008 cabinet 549249 +276 00010 bin 1541973 +scene0030_00 00001 shelf 20 +scene0030_00 00008 sofa 56 +scene0030_00 00009 door 57 +scene0030_00 00014 shelf 22 +scene0030_00 00020 chair 4 +scene0030_00 00022 shelf 23 +scene0030_00 00023 chair 5 +scene0030_00 00027 chair 10 +scene0030_00 00033 box 36 +scene0030_00 00036 box 41 +scene0030_00 00043 box 43 +scene0030_00 00051 box 44 +scene0030_00 00052 box 47 +279 00004 cabinet 1879476 +279 00005 door 1443816 +279 00006 table 534980 +279 00007 chair 425210 +279 00008 chair 1137383 +279 00011 box 1312423 +279 00012 bin 1191545 +286 00000 sofa 224114 +286 00001 sofa 817503 +286 00002 sofa 423116 +286 00003 sofa 425309 +286 00004 sofa 93674 +286 00005 table 650556 +286 00006 sofa 1034276 +286 00008 sofa 442626 +286 00009 sofa 490475 +294 00001 sofa 585504 +294 00002 sofa 1066411 +294 00003 sofa 410971 +294 00004 sofa 1511740 +294 00005 table 1019585 +308 00001 table 58697 +308 00003 shelf 9802 +308 00004 desk 8383 +308 00005 table 47873 +308 00006 shelf 44903 +308 00008 table 55500 +308 00011 chair 8713 +308 00012 chair 15811 +308 00013 chair 42308 +308 00015 chair 45293 +308 00017 chair 50906 +scene0031_00 00005 sofa 8 +scene0031_00 00007 sofa 7 +scene0031_00 00008 sofa 9 +scene0031_00 00009 sofa 13 +scene0031_00 00011 sofa 10 +scene0031_00 00012 sofa 11 +scene0031_00 00014 sofa 12 +522 00001 desk 222098 +522 00005 chair 220834 +522 00006 display 116797 +scene0032_00 00002 bed 7 +scene0032_00 00003 shelf 1 +scene0032_00 00005 desk 4 +scene0032_00 00006 door 8 +609 00001 table 851437 +609 00002 table 65825 +609 00004 chair 1727992 +609 00005 chair 862427 +609 00006 chair 49032 +609 00007 chair 640072 +609 00008 chair 542960 +609 00009 chair 396919 +609 00010 chair 102388 +609 00011 chair 771664 +609 00012 chair 1012957 +609 00014 chair 395257 +609 00015 chair 612303 +609 00016 chair 103815 +609 00017 table 1812834 +609 00018 chair 963907 +609 00019 chair 1789827 +609 00020 chair 596794 +609 00021 chair 406427 +613 00000 chair 413517 +613 00001 chair 1080142 +613 00002 chair 60995 +613 00003 chair 761276 +613 00004 chair 683043 +613 00005 chair 178334 +613 00007 chair 794389 +613 00008 table 17231 +613 00009 table 611998 +613 00010 chair 91019 +613 00011 table 29345 +614 00001 shelf 272843 +614 00002 table 447722 +614 00004 chair 540324 +614 00005 bag 564719 +scene0033_00 00002 sofa 6 +scene0033_00 00003 sofa 9 +scene0033_00 00006 sofa 3 +scene0033_00 00007 sofa 5 +scene0033_00 00008 sofa 4 +scene0033_00 00009 sofa 10 +scene0033_00 00011 sofa 8 +621 00001 chair 1210692 +621 00002 table 1124399 +621 00005 chair 1299575 +621 00006 chair 1187089 +621 00007 chair 1127396 +621 00008 chair 153515 +621 00009 chair 1095561 +621 00010 chair 1016260 +621 00011 chair 124981 +621 00012 chair 1158169 +621 00013 chair 1171865 +scene0034_00 00006 cabinet 9 +scene0034_00 00008 toilet 1 +scene0034_00 00011 sink 13 +623 00002 chair 680525 +623 00003 table 2098304 +623 00004 chair 574363 +623 00005 chair 2832457 +623 00006 chair 2119302 +623 00008 box 331678 +scene0035_00 00002 bed 2 +scene0035_00 00005 desk 5 +scene0035_00 00006 cabinet 8 +scene0035_00 00008 table 10 +700 00001 cabinet 1586275 +700 00002 door 292231 +700 00004 cabinet 1458330 +700 00005 cabinet 130091 +700 00006 bin 563149 +700 00008 bin 1668206 +700 00009 cabinet 1110954 +700 00010 cabinet 1514297 +700 00011 sink 1549018 +700 00012 bag 1604875 +scene0036_00 00002 sofa 3 +scene0036_00 00003 sofa 2 +scene0036_00 00005 bin 4 +scene0037_00 00002 shelf 2 +scene0037_00 00003 shelf 3 +scene0038_00 00003 table 1 +scene0038_00 00004 chair 6 +scene0038_00 00005 chair 8 +scene0038_00 00006 chair 9 +scene0038_00 00009 chair 11 +scene0038_00 00013 chair 17 +scene0038_00 00016 chair 18 +scene0039_00 00002 bed 9 +scene0040_00 00002 shelf 13 +scene0040_00 00003 desk 9 +scene0040_00 00007 sofa 3 +scene0040_00 00008 door 19 +scene0040_00 00011 shelf 15 +scene0040_00 00014 cabinet 20 +scene0040_00 00016 display 2 +scene0040_00 00017 display 1 +scene0042_00 00005 door 2 +scene0042_00 00006 sink 7 +scene0042_00 00007 toilet 1 +scene0043_00 00003 desk 6 +scene0043_00 00005 chair 3 +scene0043_00 00006 bin 7 +scene0043_00 00007 bag 8 +scene0044_00 00003 door 1 +scene0046_00 00003 bed 5 +scene0046_00 00004 cabinet 6 +scene0046_00 00008 chair 3 +scene0047_00 00004 cabinet 10 +scene0047_00 00007 door 11 +scene0047_00 00009 cabinet 2 +scene0048_00 00004 chair 1 +scene0049_00 00003 sofa 13 +scene0049_00 00005 shelf 15 +scene0049_00 00006 cabinet 24 +scene0049_00 00007 sofa 18 +scene0049_00 00010 pillow 20 +scene0049_00 00013 pillow 19 +scene0049_00 00014 pillow 21 +scene0050_00 00003 sofa 16 +scene0050_00 00007 desk 6 +scene0050_00 00008 sofa 4 +scene0050_00 00011 door 12 +scene0050_00 00012 chair 5 +scene0050_00 00013 door 11 +scene0050_00 00014 shelf 21 +scene0050_00 00017 bag 23 +scene0050_00 00022 desk 25 +scene0051_00 00005 shelf 9 +scene0051_00 00006 cabinet 7 +scene0051_00 00008 door 2 +scene0051_00 00010 door 1 +scene0051_00 00011 sink 12 +scene0051_00 00012 toilet 3 +scene0053_00 00001 sofa 8 +scene0053_00 00003 sofa 9 +scene0053_00 00005 table 10 +scene0054_00 00003 shelf 40 +scene0054_00 00004 sofa 42 +scene0054_00 00005 shelf 37 +scene0054_00 00007 door 17 +scene0054_00 00010 door 19 +scene0054_00 00011 shelf 41 +scene0054_00 00012 door 20 +scene0054_00 00014 shelf 38 +scene0054_00 00019 door 22 +scene0054_00 00028 sink 35 +scene0054_00 00030 cabinet 24 +scene0054_00 00032 chair 45 +scene0054_00 00035 toilet 12 +scene0054_00 00039 shelf 44 +scene0054_00 00041 bag 48 +scene0054_00 00046 table 53 +scene0054_00 00049 bag 54 +scene0054_00 00052 box 56 +scene0055_00 00002 desk 7 +scene0055_00 00006 bed 10 +scene0056_00 00006 door 21 +scene0056_00 00013 chair 5 +scene0056_00 00014 display 15 +scene0056_00 00015 chair 6 +scene0056_00 00016 chair 23 +scene0056_00 00017 chair 8 +scene0056_00 00020 display 16 +scene0056_00 00021 chair 3 +scene0056_00 00022 chair 11 +scene0057_00 00009 chair 7 +scene0058_00 00007 chair 18 +scene0058_00 00011 bin 5 +scene0059_00 00005 sofa 1 +scene0059_00 00008 chair 17 +scene0059_00 00011 chair 11 +scene0059_00 00013 chair 18 +scene0059_00 00014 chair 19 +scene0059_00 00016 chair 13 +scene0059_00 00019 sofa 23 +scene0059_00 00020 chair 22 +scene0060_00 00007 bin 12 +scene0061_00 00001 sofa 9 +scene0062_00 00003 door 20 +scene0062_00 00006 toilet 12 +scene0063_00 00006 cabinet 13 +scene0063_00 00008 cabinet 14 +scene0063_00 00011 chair 4 +scene0063_00 00017 cabinet 19 +scene0064_00 00002 sofa 9 +scene0064_00 00003 table 3 +scene0064_00 00005 sofa 5 +scene0065_00 00003 door 3 +scene0065_00 00006 sink 7 +scene0065_00 00008 toilet 2 +scene0066_00 00007 chair 9 +scene0066_00 00008 chair 7 +scene0066_00 00009 chair 16 +scene0066_00 00012 chair 17 +scene0066_00 00013 chair 26 +scene0066_00 00014 chair 19 +scene0067_00 00004 toilet 1 +scene0067_00 00006 sink 3 +scene0068_00 00004 cabinet 5 +scene0068_00 00006 sink 12 +scene0070_00 00005 bed 6 +scene0070_00 00007 chair 15 +scene0070_00 00012 pillow 8 +scene0070_00 00013 display 16 +scene0071_00 00002 door 6 +scene0072_00 00002 cabinet 21 +scene0072_00 00005 bed 27 +scene0072_00 00007 door 4 +scene0072_00 00011 pillow 22 +scene0072_00 00013 shelf 18 +scene0073_00 00003 bed 1 +scene0073_00 00005 cabinet 9 +scene0073_00 00006 door 10 +scene0074_00 00004 pillow 7 +scene0075_00 00005 chair 8 +scene0076_00 00005 cabinet 21 +scene0076_00 00008 chair 7 +scene0076_00 00010 chair 13 +scene0077_00 00001 shelf 11 +scene0077_00 00011 shelf 15 +scene0077_00 00012 box 6 +scene0078_00 00002 desk 3 +scene0078_00 00003 bed 9 +scene0078_00 00004 door 5 +scene0079_00 00003 shelf 4 +scene0079_00 00004 shelf 3 +scene0079_00 00005 shelf 1 +scene0079_00 00006 shelf 2 +scene0079_00 00007 shelf 6 +scene0079_00 00010 shelf 5 +scene0079_00 00011 chair 14 +scene0079_00 00012 chair 12 +scene0079_00 00014 chair 13 +scene0080_00 00003 cabinet 2 +scene0082_00 00001 table 9 +scene0082_00 00002 table 8 +scene0082_00 00005 chair 4 +scene0083_00 00003 toilet 4 +scene0083_00 00004 sink 7 +scene0084_00 00004 sink 9 +scene0084_00 00005 toilet 7 +scene0084_00 00006 door 8 +scene0085_00 00003 bed 11 +scene0085_00 00005 bed 12 +scene0085_00 00007 door 9 +scene0085_00 00009 chair 16 +scene0085_00 00011 display 14 +scene0086_00 00002 door 9 +scene0086_00 00008 toilet 7 +scene0086_00 00009 bin 15 +scene0086_00 00010 sink 22 +scene0086_00 00011 sink 23 +scene0086_00 00014 toilet 8 +scene0087_00 00003 sofa 3 +scene0087_00 00006 sofa 4 +scene0087_00 00009 table 8 +scene0088_00 00004 chair 5 +scene0088_00 00006 chair 6 +scene0088_00 00009 chair 10 +scene0088_00 00010 chair 9 +scene0088_00 00011 chair 3 +scene0088_00 00013 chair 7 +scene0088_00 00016 chair 17 +scene0088_00 00021 chair 14 +scene0089_00 00004 desk 4 +scene0089_00 00006 chair 6 +scene0089_00 00007 bin 12 +scene0089_00 00008 bin 13 +scene0090_00 00004 toilet 4 +scene0090_00 00005 toilet 3 +scene0090_00 00006 toilet 5 +scene0091_00 00002 sofa 5 +scene0091_00 00004 table 7 +scene0091_00 00005 desk 9 +scene0091_00 00008 cabinet 8 +scene0092_00 00002 bed 7 +scene0092_00 00004 shelf 8 +scene0092_00 00005 cabinet 10 +scene0092_00 00008 bin 4 +scene0094_00 00003 desk 9 +scene0094_00 00005 shelf 5 +scene0094_00 00006 desk 12 +scene0095_00 00004 cabinet 19 +scene0095_00 00007 chair 12 +scene0095_00 00010 display 4 +scene0095_00 00011 display 10 +scene0095_00 00012 display 7 +scene0095_00 00015 display 8 +scene0096_00 00007 door 28 +scene0096_00 00009 door 27 +scene0096_00 00016 sink 19 +scene0097_00 00003 door 4 +scene0097_00 00004 cabinet 7 +scene0097_00 00005 cabinet 9 +scene0097_00 00006 cabinet 8 +scene0097_00 00014 cabinet 3 +scene0098_00 00004 shelf 6 +scene0098_00 00008 box 15 +scene0098_00 00009 chair 11 +scene0098_00 00010 chair 12 +scene0098_00 00011 shelf 7 +scene0098_00 00015 door 4 +scene0100_00 00002 cabinet 4 +scene0100_00 00006 toilet 7 +scene0100_00 00008 sink 2 +scene0100_00 00009 bin 16 +scene0101_00 00004 bed 13 +scene0101_00 00006 desk 22 +scene0101_00 00011 sink 24 +scene0101_00 00012 cabinet 26 +scene0101_00 00014 toilet 11 +scene0101_00 00016 table 8 +scene0101_00 00020 chair 14 +scene0102_00 00004 table 14 +scene0103_00 00006 chair 9 +scene0103_00 00008 chair 1 +scene0103_00 00010 chair 2 +scene0104_00 00006 cabinet 1 +scene0104_00 00008 bin 10 +scene0104_00 00009 box 3 +scene0106_00 00003 sofa 8 +scene0106_00 00004 sofa 9 +scene0106_00 00009 table 4 +scene0106_00 00012 table 3 +scene0106_00 00015 chair 15 +scene0107_00 00003 bed 6 +scene0107_00 00005 sofa 5 +scene0108_00 00003 desk 4 +scene0108_00 00004 shelf 2 +scene0108_00 00005 desk 5 +scene0108_00 00007 shelf 3 +scene0108_00 00008 chair 9 +scene0108_00 00012 shelf 1 +scene0108_00 00015 box 17 +scene0108_00 00016 bag 23 +scene0108_00 00021 bin 22 +scene0109_00 00003 cabinet 8 +scene0109_00 00006 shelf 6 +scene0109_00 00007 bin 10 +scene0110_00 00003 cabinet 3 +scene0110_00 00005 door 4 +scene0110_00 00006 desk 10 +scene0111_00 00008 table 14 +scene0111_00 00011 bin 7 +scene0112_00 00002 toilet 4 +scene0113_00 00002 sofa 3 +scene0113_00 00003 sofa 4 +scene0113_00 00004 sofa 2 +scene0114_00 00002 cabinet 18 +scene0114_00 00003 cabinet 12 +scene0114_00 00006 cabinet 13 +scene0114_00 00010 chair 4 +scene0114_00 00011 chair 3 +scene0114_00 00012 chair 5 +scene0114_00 00014 cabinet 11 +scene0114_00 00015 cabinet 9 +scene0114_00 00017 cabinet 14 +scene0114_00 00021 cabinet 10 +scene0115_00 00003 door 4 +scene0116_00 00004 sink 5 +scene0116_00 00005 toilet 8 +scene0117_00 00002 cabinet 3 +scene0117_00 00004 cabinet 5 +scene0117_00 00005 cabinet 4 +scene0117_00 00010 cabinet 8 +scene0118_00 00003 door 4 +scene0118_00 00004 door 3 +scene0119_00 00005 sink 12 +scene0119_00 00009 toilet 11 +scene0120_00 00006 bin 10 +scene0120_00 00007 box 3 +scene0120_00 00008 box 4 +scene0121_00 00005 cabinet 5 +scene0121_00 00006 door 1 +scene0122_00 00003 door 6 +scene0122_00 00005 chair 2 +scene0122_00 00006 chair 1 +scene0122_00 00007 chair 3 +scene0123_00 00002 table 19 +scene0123_00 00003 table 20 +scene0123_00 00004 table 21 +scene0123_00 00005 table 18 +scene0124_00 00002 door 1 +scene0124_00 00003 door 2 +scene0124_00 00005 toilet 6 +scene0124_00 00006 cabinet 12 +scene0125_00 00003 sofa 1 +scene0126_00 00004 desk 17 +scene0126_00 00005 chair 5 +scene0126_00 00006 door 11 +scene0126_00 00007 chair 6 +scene0126_00 00008 shelf 1 +scene0126_00 00010 chair 4 +scene0127_00 00003 bed 7 +scene0127_00 00004 cabinet 13 +scene0127_00 00005 door 11 +scene0127_00 00006 cabinet 12 +scene0127_00 00007 bed 10 +scene0127_00 00008 desk 19 +scene0127_00 00009 desk 18 +scene0127_00 00010 bed 9 +scene0127_00 00016 bin 16 +scene0127_00 00017 table 23 +scene0128_00 00001 sofa 3 +scene0129_00 00005 sofa 8 +scene0129_00 00006 sofa 9 +scene0129_00 00007 table 1 +scene0130_00 00006 bag 13 +scene0131_00 00008 shelf 1 +scene0131_00 00010 chair 3 +scene0131_00 00012 chair 6 +scene0131_00 00014 cabinet 29 +scene0131_00 00022 display 14 +scene0132_00 00007 chair 14 +scene0132_00 00009 chair 17 +scene0132_00 00010 chair 12 +scene0132_00 00013 sofa 7 +scene0132_00 00014 chair 6 +scene0132_00 00015 chair 9 +scene0133_00 00002 chair 3 +scene0133_00 00003 chair 2 +scene0133_00 00004 chair 4 +scene0133_00 00005 chair 5 +scene0134_00 00005 chair 9 +scene0134_00 00007 chair 8 +scene0134_00 00008 chair 7 +scene0135_00 00005 toilet 5 +scene0136_00 00005 bin 10 +scene0136_00 00008 bin 11 +scene0136_00 00010 cabinet 14 +scene0137_00 00003 bed 1 +scene0137_00 00004 bed 2 +scene0137_00 00005 sofa 13 +scene0137_00 00007 table 5 +scene0137_00 00011 pillow 9 +scene0137_00 00012 display 7 +scene0138_00 00006 table 11 +scene0138_00 00014 chair 14 +scene0138_00 00016 chair 18 +scene0138_00 00017 display 1 +scene0138_00 00018 chair 17 +scene0138_00 00021 display 2 +scene0138_00 00024 chair 20 +scene0140_00 00004 table 2 +scene0140_00 00008 door 1 +scene0140_00 00011 chair 7 +scene0140_00 00014 chair 12 +scene0140_00 00017 chair 11 +scene0140_00 00018 chair 10 +scene0140_00 00019 chair 21 +scene0140_00 00020 chair 13 +scene0140_00 00021 chair 8 +scene0140_00 00022 chair 18 +scene0140_00 00023 chair 16 +scene0140_00 00024 chair 20 +scene0140_00 00025 chair 17 +scene0140_00 00026 chair 26 +scene0140_00 00027 bin 33 +scene0140_00 00028 chair 15 +scene0140_00 00029 chair 23 +scene0140_00 00030 chair 19 +scene0140_00 00031 chair 27 +scene0140_00 00032 chair 24 +scene0140_00 00034 chair 22 +scene0140_00 00035 bin 34 +scene0141_00 00010 chair 7 +scene0141_00 00011 chair 8 +scene0141_00 00013 chair 6 +scene0141_00 00017 bag 19 +scene0142_00 00003 door 13 +scene0143_00 00000 bed 5 +scene0143_00 00004 sofa 11 +scene0144_00 00002 bed 9 +scene0144_00 00005 sofa 3 +scene0144_00 00009 door 16 +scene0144_00 00011 chair 12 +scene0144_00 00012 chair 13 +scene0144_00 00013 shelf 15 +scene0145_00 00003 sofa 11 +scene0145_00 00007 chair 6 +scene0146_00 00002 toilet 7 +scene0146_00 00003 sink 8 +scene0147_00 00001 bed 21 +scene0147_00 00004 cabinet 26 +scene0147_00 00007 cabinet 25 +scene0147_00 00009 cabinet 6 +scene0147_00 00010 cabinet 8 +scene0147_00 00012 cabinet 9 +scene0147_00 00016 cabinet 7 +scene0147_00 00017 pillow 2 +scene0147_00 00018 display 5 +scene0147_00 00022 pillow 3 +scene0147_00 00023 pillow 4 +scene0148_00 00003 bed 5 +scene0149_00 00005 cabinet 20 +scene0149_00 00009 cabinet 19 +scene0149_00 00011 cabinet 13 +scene0149_00 00015 chair 25 +scene0149_00 00017 cabinet 11 +scene0150_00 00004 chair 2 +scene0151_00 00003 sofa 8 +scene0151_00 00007 table 17 +scene0152_00 00010 table 17 +scene0152_00 00011 chair 7 +scene0152_00 00012 chair 8 +scene0152_00 00014 table 18 +scene0152_00 00015 chair 5 +scene0152_00 00017 chair 9 +scene0153_00 00004 door 6 +scene0153_00 00005 cabinet 2 +scene0153_00 00006 toilet 7 +scene0154_00 00004 shelf 7 +scene0155_00 00002 desk 24 +scene0155_00 00003 table 3 +scene0155_00 00004 table 5 +scene0155_00 00008 table 6 +scene0155_00 00009 chair 15 +scene0155_00 00010 chair 14 +scene0155_00 00011 chair 13 +scene0155_00 00012 chair 16 +scene0155_00 00013 table 4 +scene0155_00 00015 table 7 +scene0155_00 00019 bin 25 +scene0156_00 00010 chair 5 +scene0156_00 00011 chair 10 +scene0157_00 00004 cabinet 7 +scene0157_00 00007 table 2 +scene0158_00 00002 cabinet 3 +scene0158_00 00003 cabinet 4 +scene0158_00 00006 cabinet 6 +scene0158_00 00007 cabinet 5 +scene0159_00 00006 chair 4 +scene0159_00 00009 door 9 +scene0160_00 00001 sofa 8 +scene0160_00 00004 sofa 10 +scene0160_00 00005 sofa 9 +scene0160_00 00006 chair 11 +scene0161_00 00004 chair 3 +scene0162_00 00003 sofa 6 +scene0162_00 00004 door 12 +scene0162_00 00006 table 13 +scene0162_00 00007 shelf 16 +scene0163_00 00002 table 11 +scene0163_00 00004 chair 4 +scene0163_00 00005 chair 2 +scene0163_00 00007 chair 3 +scene0163_00 00008 chair 1 +scene0163_00 00010 chair 5 +scene0164_00 00003 cabinet 20 +scene0164_00 00008 cabinet 21 +scene0164_00 00010 cabinet 22 +scene0164_00 00012 cabinet 24 +scene0164_00 00013 box 37 +scene0164_00 00017 cabinet 25 +scene0165_00 00003 sofa 4 +scene0165_00 00004 sofa 5 +scene0166_00 00005 desk 1 +scene0166_00 00006 sofa 7 +scene0166_00 00010 display 13 +scene0167_00 00003 sofa 5 +scene0167_00 00004 sofa 6 +scene0168_00 00015 chair 31 +scene0168_00 00020 shelf 21 +scene0168_00 00021 shelf 40 +scene0168_00 00022 display 12 +scene0168_00 00025 display 10 +scene0170_00 00006 sink 5 +scene0171_00 00005 chair 5 +scene0171_00 00006 chair 6 +scene0171_00 00007 chair 9 +scene0171_00 00008 chair 8 +scene0171_00 00009 chair 4 +scene0171_00 00010 chair 10 +scene0172_00 00003 cabinet 4 +scene0174_00 00004 door 9 +scene0174_00 00006 desk 5 +scene0174_00 00008 bag 8 +scene0174_00 00009 box 17 +scene0175_00 00006 cabinet 9 +scene0175_00 00007 door 11 +scene0175_00 00010 toilet 13 +scene0177_00 00002 shelf 1 +scene0177_00 00004 shelf 2 +scene0177_00 00005 door 8 +scene0177_00 00006 sofa 6 +scene0177_00 00007 shelf 15 +scene0177_00 00008 display 3 +scene0177_00 00009 chair 10 +scene0177_00 00010 chair 11 +scene0177_00 00011 pillow 13 +scene0177_00 00015 display 5 +scene0178_00 00003 bed 16 +scene0178_00 00004 bed 15 +scene0178_00 00006 door 12 +scene0178_00 00007 table 8 +scene0178_00 00011 chair 4 +scene0178_00 00016 bin 19 +scene0178_00 00018 bed 17 +scene0181_00 00004 cabinet 22 +scene0181_00 00005 sofa 29 +scene0181_00 00013 shelf 20 +scene0181_00 00014 shelf 19 +scene0181_00 00018 table 27 +scene0181_00 00025 table 28 +scene0182_00 00007 pillow 9 +scene0184_00 00002 bed 1 +scene0184_00 00003 cabinet 6 +scene0184_00 00004 door 2 +scene0184_00 00005 display 7 +scene0186_00 00004 cabinet 10 +scene0186_00 00005 shelf 14 +scene0186_00 00009 shelf 15 +scene0186_00 00012 cabinet 13 +scene0186_00 00015 shelf 16 +scene0186_00 00020 door 22 +scene0187_00 00004 table 7 +scene0187_00 00005 table 8 +scene0187_00 00006 sofa 13 +scene0187_00 00008 table 6 +scene0187_00 00011 sofa 14 +scene0187_00 00013 bag 4 +scene0188_00 00007 cabinet 17 +scene0190_00 00002 shelf 2 +scene0190_00 00004 shelf 3 +scene0191_00 00001 shelf 1 +scene0191_00 00006 door 6 +scene0193_00 00002 bed 7 +scene0193_00 00003 desk 8 +scene0193_00 00006 bin 6 +scene0194_00 00001 sofa 6 +scene0194_00 00005 shelf 11 +scene0194_00 00011 pillow 12 +scene0195_00 00004 door 5 +scene0195_00 00006 cabinet 19 +scene0195_00 00007 toilet 6 +scene0195_00 00009 bin 16 +scene0195_00 00015 sink 23 +scene0196_00 00004 door 7 +scene0197_00 00002 shelf 1 +scene0197_00 00004 door 4 +scene0197_00 00007 bin 11 +scene0197_00 00009 sink 2 +scene0198_00 00005 door 16 +scene0198_00 00006 door 15 +scene0198_00 00011 bag 8 +scene0199_00 00002 sofa 2 +scene0199_00 00004 table 3 +scene0200_00 00003 cabinet 7 +scene0201_00 00007 cabinet 4 +scene0203_00 00003 shelf 6 +scene0203_00 00006 sofa 3 +scene0203_00 00009 shelf 7 +scene0203_00 00011 table 5 +scene0203_00 00014 table 14 +scene0204_00 00003 cabinet 20 +scene0204_00 00004 door 18 +scene0205_00 00002 cabinet 5 +scene0205_00 00005 table 7 +scene0205_00 00008 cabinet 6 +scene0206_00 00019 box 24 +scene0206_00 00020 display 25 +scene0207_00 00003 bed 7 +scene0207_00 00005 desk 17 +scene0207_00 00006 sofa 1 +scene0207_00 00008 shelf 16 +scene0207_00 00011 toilet 23 +scene0207_00 00014 sink 21 +scene0207_00 00017 sink 22 +scene0207_00 00019 shelf 20 +scene0208_00 00002 shelf 10 +scene0208_00 00005 shelf 12 +scene0208_00 00006 shelf 14 +scene0208_00 00007 shelf 11 +scene0208_00 00008 shelf 13 +scene0208_00 00009 shelf 15 +scene0209_00 00005 bed 19 +scene0209_00 00006 bed 20 +scene0209_00 00009 sofa 2 +scene0209_00 00010 table 18 +scene0209_00 00015 display 11 +scene0209_00 00017 pillow 13 +scene0209_00 00018 pillow 14 +scene0209_00 00019 pillow 15 +scene0209_00 00020 pillow 12 +scene0210_00 00003 cabinet 4 +scene0210_00 00006 door 9 +scene0211_00 00004 desk 12 +scene0211_00 00005 cabinet 15 +scene0211_00 00006 cabinet 14 +scene0211_00 00007 shelf 11 +scene0211_00 00012 display 16 +scene0212_00 00003 table 14 +scene0213_00 00004 sofa 14 +scene0213_00 00005 sofa 16 +scene0213_00 00008 sofa 15 +scene0213_00 00010 table 19 +scene0213_00 00012 sofa 17 +scene0213_00 00015 table 4 +scene0214_00 00004 cabinet 20 +scene0214_00 00005 sink 12 +scene0214_00 00006 shelf 16 +scene0214_00 00007 door 5 +scene0214_00 00010 toilet 19 +scene0214_00 00011 cabinet 17 +scene0215_00 00004 cabinet 22 +scene0217_00 00002 bed 6 +scene0217_00 00003 bed 7 +scene0217_00 00004 cabinet 10 +scene0217_00 00005 shelf 8 +scene0217_00 00006 desk 4 +scene0217_00 00007 door 22 +scene0217_00 00008 desk 5 +scene0217_00 00009 shelf 9 +scene0217_00 00014 bin 17 +scene0217_00 00015 bin 19 +scene0217_00 00016 bag 21 +scene0218_00 00002 shelf 2 +scene0218_00 00003 sofa 45 +scene0218_00 00004 sofa 44 +scene0219_00 00001 bed 1 +scene0219_00 00003 pillow 5 +scene0220_00 00009 door 13 +scene0220_00 00016 bin 20 +scene0221_00 00003 bed 10 +scene0221_00 00004 bed 9 +scene0221_00 00007 cabinet 16 +scene0221_00 00009 cabinet 12 +scene0222_00 00003 desk 19 +scene0222_00 00004 desk 20 +scene0222_00 00005 bed 7 +scene0222_00 00006 bed 6 +scene0222_00 00011 bin 25 +scene0222_00 00012 bin 21 +scene0222_00 00016 pillow 27 +scene0222_00 00017 pillow 26 +scene0223_00 00002 cabinet 6 +scene0223_00 00007 bed 12 +scene0223_00 00008 shelf 3 +scene0223_00 00009 desk 7 +scene0223_00 00010 shelf 13 +scene0224_00 00003 sofa 4 +scene0224_00 00005 shelf 10 +scene0224_00 00009 pillow 12 +scene0224_00 00010 cabinet 13 +scene0225_00 00006 cabinet 27 +scene0225_00 00007 cabinet 25 +scene0225_00 00008 cabinet 26 +scene0225_00 00013 bin 1 +scene0225_00 00020 bin 2 +scene0225_00 00023 bin 3 +scene0226_00 00003 sofa 5 +scene0226_00 00004 sofa 3 +scene0226_00 00005 sofa 4 +scene0226_00 00006 sofa 6 +scene0226_00 00007 table 17 +scene0226_00 00011 table 16 +scene0230_00 00008 table 13 +scene0230_00 00012 bin 16 +scene0231_00 00006 shelf 6 +scene0231_00 00011 sofa 1 +scene0231_00 00013 cabinet 10 +scene0231_00 00014 sofa 2 +scene0231_00 00015 desk 16 +scene0232_00 00004 door 7 +scene0232_00 00006 cabinet 10 +scene0232_00 00008 toilet 8 +scene0232_00 00009 cabinet 11 +scene0232_00 00010 sink 12 +scene0233_00 00003 cabinet 8 +scene0233_00 00004 bed 16 +scene0233_00 00005 desk 24 +scene0233_00 00006 door 3 +scene0233_00 00007 shelf 11 +scene0233_00 00008 shelf 10 +scene0233_00 00009 bed 17 +scene0233_00 00010 cabinet 9 +scene0233_00 00011 cabinet 21 +scene0233_00 00012 cabinet 22 +scene0233_00 00017 bin 6 +scene0233_00 00019 bin 26 +scene0233_00 00024 bin 27 +scene0235_00 00004 bed 20 +scene0235_00 00008 sofa 22 +scene0235_00 00012 pillow 18 +scene0235_00 00013 table 15 +scene0235_00 00021 table 16 +scene0236_00 00001 bed 9 +scene0236_00 00005 shelf 7 +scene0236_00 00006 cabinet 10 +scene0236_00 00010 shelf 13 +scene0237_00 00003 sink 1 +scene0238_00 00010 display 1 +scene0239_00 00004 sofa 1 +scene0239_00 00007 table 8 +scene0239_00 00008 bag 5 +scene0240_00 00003 cabinet 3 +scene0240_00 00004 cabinet 4 +scene0240_00 00005 door 5 +scene0240_00 00006 shelf 2 +scene0240_00 00009 bin 9 +scene0240_00 00011 bin 10 +scene0240_00 00013 cabinet 1 +scene0241_00 00003 door 15 +scene0241_00 00005 shelf 13 +scene0242_00 00002 door 5 +scene0242_00 00003 door 6 +scene0242_00 00007 bag 7 +scene0246_00 00004 bed 15 +scene0246_00 00006 cabinet 12 +scene0246_00 00008 table 4 +scene0246_00 00011 shelf 18 +scene0246_00 00014 toilet 7 +scene0246_00 00016 sink 21 +scene0246_00 00018 table 20 +scene0247_00 00003 sofa 5 +scene0247_00 00004 sofa 4 +scene0247_00 00006 cabinet 31 +scene0247_00 00008 cabinet 29 +scene0247_00 00014 cabinet 28 +scene0247_00 00015 sofa 6 +scene0247_00 00019 cabinet 30 +scene0247_00 00025 sink 35 +scene0250_00 00005 door 26 +scene0250_00 00006 cabinet 21 +scene0250_00 00008 toilet 35 +scene0251_00 00005 table 18 +scene0251_00 00006 table 19 +scene0251_00 00009 door 16 +scene0251_00 00012 bin 10 +scene0251_00 00015 bin 11 +scene0251_00 00016 bin 14 +scene0251_00 00017 bin 12 +scene0251_00 00018 bin 13 +scene0253_00 00002 cabinet 5 +scene0253_00 00009 shelf 4 +scene0254_00 00008 toilet 14 +scene0254_00 00010 toilet 15 +scene0255_00 00006 cabinet 1 +scene0255_00 00008 cabinet 2 +scene0255_00 00011 bin 6 +scene0256_00 00004 box 3 +scene0256_00 00005 box 4 +scene0259_00 00003 bed 6 +scene0259_00 00004 shelf 11 +scene0259_00 00006 door 10 +scene0259_00 00008 table 7 +scene0259_00 00013 shelf 18 +scene0260_00 00006 toilet 8 +scene0260_00 00008 sink 9 +scene0260_00 00010 bin 16 +scene0261_00 00005 sink 13 +scene0261_00 00006 door 6 +scene0261_00 00007 door 4 +scene0261_00 00012 toilet 3 +scene0262_00 00003 shelf 17 +scene0263_00 00005 box 2 +scene0263_00 00015 bin 26 +scene0263_00 00016 display 27 +scene0264_00 00007 display 1 +scene0264_00 00011 bin 27 +scene0265_00 00004 toilet 10 +scene0265_00 00007 sink 11 +scene0265_00 00009 bin 14 +scene0265_00 00011 sink 13 +scene0266_00 00002 desk 16 +scene0266_00 00004 table 12 +scene0266_00 00005 table 13 +scene0266_00 00006 desk 15 +scene0266_00 00009 desk 17 +scene0266_00 00018 table 19 +scene0267_00 00002 table 22 +scene0267_00 00007 door 16 +scene0267_00 00011 bin 5 +scene0267_00 00012 bin 6 +scene0268_00 00004 sink 2 +scene0268_00 00006 door 1 +scene0269_00 00001 sofa 0 +scene0269_00 00002 sofa 1 +scene0270_00 00003 bed 4 +scene0270_00 00004 bed 5 +scene0270_00 00010 table 21 +scene0270_00 00011 cabinet 16 +scene0270_00 00013 pillow 9 +scene0270_00 00016 pillow 13 +scene0270_00 00017 pillow 10 +scene0270_00 00018 pillow 14 +scene0270_00 00019 pillow 12 +scene0271_00 00003 bed 13 +scene0271_00 00012 cabinet 14 +scene0271_00 00019 pillow 24 +scene0272_00 00002 shelf 3 +scene0272_00 00006 shelf 12 +scene0272_00 00007 desk 2 +scene0272_00 00008 cabinet 10 +scene0272_00 00009 table 13 +scene0273_00 00006 sofa 1 +scene0274_00 00006 bin 6 +scene0276_00 00003 bed 4 +scene0276_00 00004 sofa 13 +scene0276_00 00005 cabinet 3 +scene0276_00 00006 cabinet 6 +scene0276_00 00009 table 9 +scene0276_00 00011 door 15 +scene0276_00 00013 cabinet 14 +scene0276_00 00014 toilet 11 +scene0276_00 00015 table 10 +scene0276_00 00016 sink 12 +scene0277_00 00005 bed 2 +scene0278_00 00003 cabinet 8 +scene0278_00 00004 cabinet 7 +scene0279_00 00004 bed 16 +scene0279_00 00006 sofa 3 +scene0279_00 00007 door 14 +scene0279_00 00010 cabinet 25 +scene0279_00 00012 table 5 +scene0279_00 00020 display 22 +scene0279_00 00021 table 6 +scene0280_00 00008 bed 1 +scene0280_00 00010 cabinet 14 +scene0281_00 00003 sofa 3 +scene0281_00 00004 sofa 4 +scene0281_00 00006 table 15 +scene0282_00 00004 bed 7 +scene0282_00 00006 cabinet 6 +scene0286_00 00003 bed 1 +scene0286_00 00005 door 2 +scene0286_00 00009 cabinet 17 +scene0286_00 00019 cabinet 20 +scene0287_00 00002 bed 5 +scene0287_00 00003 desk 8 +scene0288_00 00005 sofa 2 +scene0288_00 00007 table 5 +scene0289_00 00012 display 25 +scene0289_00 00016 bin 23 +scene0290_00 00008 door 2 +scene0290_00 00011 door 3 +scene0290_00 00012 door 4 +scene0291_00 00026 box 49 +scene0293_00 00000 desk 3 +scene0293_00 00003 shelf 2 +scene0294_00 00002 sofa 2 +scene0294_00 00003 sofa 1 +scene0295_00 00002 bed 10 +scene0295_00 00004 cabinet 8 +scene0295_00 00005 shelf 1 +scene0295_00 00006 table 7 +scene0295_00 00007 table 4 +scene0295_00 00010 cabinet 9 +scene0296_00 00002 bed 14 +scene0296_00 00004 bed 13 +scene0296_00 00009 door 40 +scene0296_00 00010 cabinet 17 +scene0296_00 00013 pillow 25 +scene0296_00 00015 pillow 26 +scene0296_00 00025 display 29 +scene0296_00 00026 pillow 28 +scene0297_00 00003 sofa 5 +scene0297_00 00004 sofa 6 +scene0297_00 00006 cabinet 15 +scene0297_00 00008 table 7 +scene0298_00 00002 bed 5 +scene0300_00 00002 table 5 +scene0300_00 00003 table 6 +scene0301_00 00002 sofa 1 +scene0301_00 00006 table 15 +scene0301_00 00016 box 2 +scene0301_00 00017 shelf 23 +scene0303_00 00003 shelf 5 +scene0303_00 00005 door 8 +scene0303_00 00006 cabinet 4 +scene0304_00 00005 cabinet 12 +scene0304_00 00006 door 8 +scene0305_00 00006 shelf 15 +scene0305_00 00008 shelf 11 +scene0305_00 00009 shelf 16 +scene0305_00 00010 cabinet 14 +scene0305_00 00011 door 20 +scene0305_00 00013 shelf 12 +scene0305_00 00016 display 1 +scene0305_00 00018 display 2 +scene0305_00 00021 display 3 +scene0307_00 00006 door 16 +scene0307_00 00008 sink 4 +scene0307_00 00009 shelf 8 +scene0308_00 00003 bed 3 +scene0308_00 00006 door 13 +scene0308_00 00009 pillow 7 +scene0309_00 00004 desk 18 +scene0309_00 00007 shelf 35 +scene0309_00 00008 cabinet 25 +scene0309_00 00019 sofa 30 +scene0310_00 00002 cabinet 4 +scene0310_00 00003 cabinet 5 +scene0311_00 00001 cabinet 5 +scene0312_00 00002 sofa 2 +scene0312_00 00003 sofa 3 +scene0312_00 00004 sofa 4 +scene0314_00 00008 display 2 +scene0315_00 00003 sofa 9 +scene0315_00 00005 sofa 10 +scene0315_00 00010 box 12 +scene0315_00 00013 table 3 +scene0315_00 00025 table 14 +scene0316_00 00005 sofa 3 +scene0317_00 00005 sofa 1 +scene0317_00 00010 table 20 +scene0317_00 00016 pillow 19 +scene0319_00 00003 sofa 2 +scene0319_00 00004 sofa 4 +scene0319_00 00005 sofa 3 +scene0319_00 00007 pillow 6 +scene0319_00 00009 pillow 7 +scene0320_00 00004 desk 11 +scene0320_00 00016 display 23 +scene0321_00 00002 bed 6 +scene0322_00 00002 table 9 +scene0324_00 00003 table 1 +scene0325_00 00003 shelf 8 +scene0325_00 00004 shelf 4 +scene0325_00 00013 box 23 +scene0326_00 00001 sofa 6 +scene0326_00 00006 pillow 10 +scene0327_00 00005 sofa 3 +scene0327_00 00006 door 24 +scene0327_00 00007 cabinet 21 +scene0327_00 00008 door 25 +scene0327_00 00009 cabinet 18 +scene0327_00 00015 cabinet 4 +scene0329_00 00003 sofa 1 +scene0329_00 00004 sofa 2 +scene0329_00 00007 door 8 +scene0329_00 00008 door 7 +scene0329_00 00012 door 9 +scene0329_00 00018 bin 21 +scene0331_00 00010 pillow 12 +scene0332_00 00005 door 11 +scene0332_00 00008 shelf 15 +scene0333_00 00002 desk 5 +scene0334_00 00002 sofa 2 +scene0334_00 00003 sofa 3 +scene0335_00 00002 cabinet 5 +scene0335_00 00005 door 3 +scene0335_00 00007 cabinet 9 +scene0335_00 00011 cabinet 7 +scene0335_00 00012 cabinet 33 +scene0335_00 00023 cabinet 10 +scene0336_00 00004 desk 25 +scene0336_00 00006 desk 9 +scene0336_00 00008 cabinet 28 +scene0337_00 00001 cabinet 3 +scene0338_00 00002 cabinet 2 +scene0338_00 00005 cabinet 8 +scene0338_00 00006 box 6 +scene0339_00 00003 sofa 2 +scene0339_00 00005 sofa 4 +scene0339_00 00006 sofa 3 +scene0339_00 00007 sofa 5 +scene0340_00 00004 bed 16 +scene0340_00 00005 bed 17 +scene0340_00 00011 table 15 +scene0340_00 00012 pillow 10 +scene0340_00 00015 pillow 12 +scene0340_00 00016 pillow 11 +scene0340_00 00017 bin 14 +scene0341_00 00002 sofa 4 +scene0341_00 00003 desk 5 +scene0342_00 00005 table 7 +scene0345_00 00006 cabinet 36 +scene0346_00 00004 door 10 +scene0347_00 00006 bin 1 +scene0348_00 00003 cabinet 4 +scene0348_00 00004 cabinet 3 +scene0348_00 00005 cabinet 5 +scene0348_00 00008 sink 17 +scene0348_00 00011 bin 26 +scene0349_00 00003 sink 3 +scene0349_00 00004 shelf 4 +scene0349_00 00006 sink 13 +scene0349_00 00008 bin 7 +scene0350_00 00005 door 6 +scene0350_00 00007 shelf 11 +scene0350_00 00009 sink 16 +scene0352_00 00003 sofa 5 +scene0352_00 00004 door 8 +scene0352_00 00009 cabinet 9 +scene0353_00 00005 sofa 22 +scene0353_00 00006 shelf 18 +scene0353_00 00007 desk 14 +scene0353_00 00008 shelf 19 +scene0353_00 00016 bin 32 +scene0353_00 00018 cabinet 20 +scene0355_00 00007 table 17 +scene0355_00 00008 table 16 +scene0356_00 00003 bed 12 +scene0356_00 00005 cabinet 19 +scene0356_00 00009 bed 11 +scene0357_00 00002 cabinet 13 +scene0357_00 00005 door 15 +scene0357_00 00013 table 11 +scene0357_00 00015 cabinet 16 +scene0357_00 00016 box 1 +scene0358_00 00003 table 4 +scene0358_00 00005 door 3 +scene0358_00 00014 bin 20 +scene0358_00 00018 bag 19 +scene0358_00 00020 table 5 +scene0359_00 00003 bed 3 +scene0360_00 00002 bin 2 +scene0360_00 00003 door 8 +scene0360_00 00005 bin 3 +scene0361_00 00002 shelf 3 +scene0361_00 00004 shelf 2 +scene0361_00 00006 shelf 9 +scene0362_00 00004 sofa 5 +scene0362_00 00010 pillow 2 +scene0362_00 00011 display 14 +scene0362_00 00012 table 13 +scene0363_00 00004 sofa 7 +scene0363_00 00006 sofa 6 +scene0363_00 00007 sofa 8 +scene0363_00 00008 sofa 9 +scene0363_00 00009 sofa 10 +scene0363_00 00010 sofa 11 +scene0363_00 00013 table 14 +scene0364_00 00003 bed 8 +scene0364_00 00004 cabinet 9 +scene0364_00 00006 door 10 +scene0364_00 00007 cabinet 11 +scene0364_00 00010 cabinet 12 +scene0365_00 00005 toilet 5 +scene0366_00 00002 cabinet 11 +scene0366_00 00005 toilet 7 +scene0366_00 00008 sink 8 +scene0366_00 00009 sink 9 +scene0367_00 00004 sofa 1 +scene0367_00 00006 sofa 2 +scene0368_00 00006 sofa 15 +scene0368_00 00009 sofa 17 +scene0368_00 00010 sofa 18 +scene0368_00 00034 sofa 31 +scene0369_00 00007 cabinet 16 +scene0369_00 00008 cabinet 17 +scene0370_00 00003 desk 11 +scene0370_00 00012 bin 19 +scene0370_00 00017 table 22 +scene0371_00 00008 bin 12 +scene0372_00 00013 bag 18 +scene0373_00 00006 bin 7 +scene0374_00 00002 sofa 17 +scene0375_00 00002 door 11 +scene0375_00 00008 sink 19 +scene0376_00 00003 bed 4 +scene0376_00 00004 desk 6 +scene0376_00 00005 cabinet 7 +scene0377_00 00002 shelf 3 +scene0377_00 00004 shelf 4 +scene0377_00 00005 bin 11 +scene0377_00 00008 bin 13 +scene0378_00 00003 shelf 2 +scene0378_00 00004 shelf 3 +scene0378_00 00005 desk 15 +scene0378_00 00006 door 17 +scene0378_00 00007 desk 14 +scene0378_00 00008 shelf 10 +scene0378_00 00010 desk 13 +scene0378_00 00015 bin 20 +scene0378_00 00018 display 19 +scene0378_00 00019 cabinet 23 +scene0379_00 00004 shelf 4 +scene0379_00 00006 shelf 20 +scene0379_00 00009 shelf 8 +scene0379_00 00014 cabinet 6 +scene0379_00 00021 box 18 +scene0379_00 00028 cabinet 7 +scene0381_00 00002 sofa 2 +scene0382_00 00005 shelf 3 +scene0383_00 00003 shelf 6 +scene0383_00 00005 door 7 +scene0383_00 00006 desk 5 +scene0383_00 00009 bin 11 +scene0384_00 00003 door 61 +scene0384_00 00009 box 4 +scene0384_00 00017 box 18 +scene0384_00 00018 box 15 +scene0384_00 00023 box 21 +scene0384_00 00025 box 14 +scene0384_00 00039 box 27 +scene0385_00 00004 sofa 4 +scene0385_00 00006 cabinet 11 +scene0385_00 00012 display 14 +scene0385_00 00014 pillow 18 +scene0385_00 00015 pillow 16 +scene0386_00 00003 sofa 2 +scene0386_00 00005 sofa 3 +scene0386_00 00008 table 18 +scene0387_00 00009 table 20 +scene0388_00 00008 bag 14 +scene0389_00 00004 bed 7 +scene0389_00 00005 door 11 +scene0389_00 00008 table 12 +scene0389_00 00011 display 13 +scene0390_00 00002 table 4 +scene0390_00 00005 cabinet 2 +scene0392_00 00007 bed 12 +scene0392_00 00008 sofa 4 +scene0392_00 00009 shelf 6 +scene0392_00 00011 cabinet 5 +scene0392_00 00013 cabinet 13 +scene0392_00 00014 cabinet 8 +scene0393_00 00003 shelf 2 +scene0394_00 00003 bed 11 +scene0394_00 00012 sofa 30 +scene0394_00 00015 cabinet 23 +scene0394_00 00016 sink 28 +scene0394_00 00019 pillow 12 +scene0394_00 00022 pillow 26 +scene0394_00 00023 sink 29 +scene0394_00 00024 bin 14 +scene0394_00 00027 pillow 27 +scene0395_00 00005 sofa 8 +scene0395_00 00008 cabinet 3 +scene0395_00 00011 display 7 +scene0395_00 00013 shelf 5 +scene0396_00 00005 door 6 +scene0396_00 00007 toilet 7 +scene0396_00 00008 sink 9 +scene0397_00 00006 pillow 12 +scene0398_00 00002 bed 12 +scene0398_00 00003 bed 11 +scene0398_00 00004 desk 6 +scene0398_00 00005 door 15 +scene0398_00 00007 desk 7 +scene0398_00 00008 bin 10 +scene0398_00 00012 shelf 14 +scene0398_00 00013 cabinet 9 +scene0399_00 00002 sink 4 +scene0399_00 00003 toilet 5 +scene0400_00 00003 shelf 5 +scene0400_00 00004 bed 10 +scene0400_00 00005 desk 1 +scene0400_00 00007 cabinet 8 +scene0400_00 00010 bin 9 +scene0402_00 00010 bin 16 +scene0403_00 00005 bin 4 +scene0404_00 00001 shelf 3 +scene0404_00 00005 shelf 4 +scene0404_00 00006 table 8 +scene0404_00 00008 box 10 +scene0405_00 00002 bin 1 +scene0405_00 00003 bin 3 +scene0405_00 00004 bin 5 +scene0405_00 00005 bin 2 +scene0405_00 00006 bin 4 +scene0405_00 00007 bin 6 +scene0405_00 00008 bin 8 +scene0405_00 00009 bin 7 +scene0406_00 00005 toilet 3 +scene0406_00 00006 sink 6 +scene0406_00 00008 bin 7 +scene0407_00 00002 sofa 2 +scene0407_00 00004 shelf 8 +scene0407_00 00006 table 1 +scene0407_00 00009 pillow 11 +scene0408_00 00004 shelf 10 +scene0409_00 00003 cabinet 1 +scene0410_00 00002 door 6 +scene0410_00 00004 toilet 7 +scene0414_00 00006 cabinet 24 +scene0415_00 00003 sink 8 +scene0415_00 00004 door 3 +scene0415_00 00012 bin 15 +scene0416_00 00004 bed 1 +scene0416_00 00005 bed 2 +scene0416_00 00017 display 16 +scene0418_00 00002 bed 11 +scene0418_00 00010 cabinet 7 +scene0419_00 00006 cabinet 16 +scene0419_00 00013 box 2 +scene0419_00 00019 door 13 +scene0421_00 00005 door 33 +scene0421_00 00009 box 20 +scene0421_00 00011 box 22 +scene0421_00 00013 box 23 +scene0422_00 00005 bin 9 +scene0422_00 00009 bin 12 +scene0424_00 00003 shelf 16 +scene0424_00 00005 desk 12 +scene0424_00 00006 sofa 1 +scene0424_00 00007 door 19 +scene0424_00 00015 display 22 +scene0424_00 00018 display 21 +scene0424_00 00019 display 20 +scene0425_00 00002 cabinet 31 +scene0425_00 00004 desk 13 +scene0425_00 00005 door 8 +scene0425_00 00006 shelf 16 +scene0425_00 00012 pillow 20 +scene0425_00 00016 bag 11 +scene0425_00 00022 shelf 25 +scene0426_00 00002 bed 6 +scene0426_00 00005 cabinet 28 +scene0426_00 00008 box 2 +scene0426_00 00010 display 13 +scene0426_00 00013 box 1 +scene0426_00 00020 box 3 +scene0426_00 00022 bag 12 +scene0429_00 00006 sink 6 +scene0429_00 00008 toilet 4 +scene0430_00 00002 table 20 +scene0430_00 00022 bag 24 +scene0431_00 00003 cabinet 15 +scene0431_00 00004 cabinet 14 +scene0431_00 00007 cabinet 10 +scene0431_00 00011 cabinet 12 +scene0431_00 00012 cabinet 13 +scene0431_00 00013 bin 17 +scene0431_00 00014 cabinet 11 +scene0432_00 00003 table 5 +scene0433_00 00013 bag 28 +scene0434_00 00005 door 10 +scene0434_00 00007 toilet 3 +scene0434_00 00008 bin 14 +scene0434_00 00010 sink 18 +scene0435_00 00003 bed 11 +scene0435_00 00004 bed 10 +scene0435_00 00011 sink 8 +scene0435_00 00012 toilet 12 +scene0436_00 00003 bin 3 +scene0436_00 00004 bin 2 +scene0436_00 00006 bin 4 +scene0438_00 00001 bed 6 +scene0438_00 00007 cabinet 5 +scene0438_00 00008 door 9 +scene0438_00 00009 pillow 13 +scene0439_00 00002 cabinet 9 +scene0439_00 00003 cabinet 8 +scene0439_00 00004 cabinet 11 +scene0439_00 00011 cabinet 10 +scene0439_00 00012 cabinet 12 +scene0439_00 00014 sink 7 +scene0440_00 00002 cabinet 6 +scene0440_00 00003 bed 17 +scene0440_00 00004 bed 18 +scene0440_00 00005 shelf 13 +scene0440_00 00007 desk 5 +scene0440_00 00008 shelf 14 +scene0440_00 00009 desk 4 +scene0440_00 00013 cabinet 19 +scene0441_00 00010 sink 15 +scene0443_00 00005 desk 18 +scene0443_00 00008 shelf 19 +scene0443_00 00009 desk 17 +scene0443_00 00010 shelf 20 +scene0444_00 00000 shelf 0 +scene0444_00 00002 shelf 1 +scene0445_00 00002 bed 5 +scene0445_00 00005 bin 7 +scene0445_00 00006 bin 8 +scene0446_00 00004 door 6 +scene0446_00 00005 sink 10 +scene0446_00 00007 toilet 25 +scene0447_00 00003 cabinet 4 +scene0447_00 00005 sink 3 +scene0447_00 00006 toilet 10 +scene0447_00 00007 door 14 +scene0447_00 00011 sink 11 +scene0448_00 00004 door 7 +scene0448_00 00007 toilet 13 +scene0448_00 00008 sink 11 +scene0449_00 00004 shelf 1 +scene0449_00 00005 toilet 12 +scene0449_00 00006 sink 2 +scene0449_00 00008 door 11 +scene0449_00 00012 sink 13 +scene0450_00 00006 sofa 10 +scene0451_00 00005 sofa 12 +scene0451_00 00007 table 19 +scene0451_00 00009 cabinet 2 +scene0455_00 00005 table 1 +scene0456_00 00010 bag 11 +scene0456_00 00013 bin 12 +scene0457_00 00002 bed 2 +scene0458_00 00007 toilet 12 +scene0458_00 00012 sink 17 +scene0460_00 00002 sink 7 +scene0461_00 00002 sofa 1 +scene0461_00 00003 sofa 2 +scene0461_00 00005 table 4 +scene0464_00 00004 shelf 10 +scene0464_00 00015 bin 24 +scene0465_00 00006 table 22 +scene0465_00 00010 door 20 +scene0465_00 00011 cabinet 3 +scene0465_00 00018 shelf 13 +scene0467_00 00002 sofa 9 +scene0467_00 00003 shelf 10 +scene0467_00 00006 shelf 11 +scene0467_00 00010 shelf 13 +scene0467_00 00011 cabinet 22 +scene0467_00 00015 pillow 5 +scene0468_00 00005 bed 1 +scene0468_00 00006 desk 3 +scene0468_00 00008 desk 4 +scene0469_00 00012 bin 26 +scene0470_00 00002 door 12 +scene0470_00 00009 bin 14 +scene0471_00 00005 toilet 11 +scene0472_00 00003 bed 13 +scene0472_00 00004 cabinet 17 +scene0472_00 00009 table 4 +scene0472_00 00010 sink 10 +scene0472_00 00018 cabinet 18 +scene0473_00 00002 door 4 +scene0473_00 00004 door 5 +scene0473_00 00008 bag 9 +scene0474_00 00004 sofa 4 +scene0474_00 00005 desk 21 +scene0474_00 00006 shelf 8 +scene0474_00 00007 door 24 +scene0474_00 00011 shelf 9 +scene0476_00 00004 cabinet 2 +scene0476_00 00008 table 9 +scene0476_00 00009 bin 10 +scene0477_00 00003 bed 6 +scene0477_00 00004 bed 7 +scene0477_00 00007 cabinet 27 +scene0477_00 00008 cabinet 25 +scene0477_00 00012 pillow 21 +scene0477_00 00016 pillow 22 +scene0477_00 00020 table 20 +scene0477_00 00021 cabinet 30 +scene0478_00 00002 cabinet 9 +scene0479_00 00002 cabinet 6 +scene0479_00 00003 cabinet 7 +scene0479_00 00004 door 26 +scene0479_00 00012 cabinet 22 +scene0479_00 00017 box 19 +scene0479_00 00019 box 18 +scene0480_00 00002 sofa 1 +scene0480_00 00006 display 9 +scene0480_00 00008 pillow 8 +scene0481_00 00002 shelf 15 +scene0481_00 00005 table 9 +scene0481_00 00006 table 10 +scene0481_00 00007 table 12 +scene0481_00 00011 table 11 +scene0482_00 00002 cabinet 5 +scene0484_00 00002 sofa 3 +scene0484_00 00003 sofa 2 +scene0486_00 00007 bin 4 +scene0486_00 00008 bin 5 +scene0486_00 00009 sink 8 +scene0487_00 00006 door 15 +scene0487_00 00008 sofa 1 +scene0487_00 00012 sofa 2 +scene0487_00 00017 table 10 +scene0487_00 00019 table 12 +scene0487_00 00022 cabinet 17 +scene0487_00 00023 box 3 +scene0487_00 00025 bin 29 +scene0488_00 00003 cabinet 10 +scene0488_00 00004 cabinet 6 +scene0488_00 00005 cabinet 7 +scene0488_00 00008 cabinet 12 +scene0488_00 00011 cabinet 5 +scene0489_00 00003 desk 14 +scene0489_00 00011 display 9 +scene0489_00 00012 display 8 +scene0491_00 00002 cabinet 6 +scene0492_00 00005 sink 9 +scene0492_00 00013 toilet 16 +scene0493_00 00009 bag 7 +scene0495_00 00001 table 39 +scene0495_00 00002 table 40 +scene0498_00 00004 door 8 +scene0498_00 00008 bin 14 +scene0498_00 00010 cabinet 15 +scene0499_00 00006 table 19 +scene0499_00 00008 sofa 11 +scene0499_00 00009 sofa 12 +scene0499_00 00016 table 20 +scene0499_00 00018 door 10 +scene0500_00 00008 table 23 +scene0501_00 00003 door 7 +scene0501_00 00007 sink 8 +scene0501_00 00009 toilet 6 +scene0502_00 00002 display 6 +scene0503_00 00002 sofa 1 +scene0504_00 00003 shelf 4 +scene0504_00 00004 sofa 8 +scene0504_00 00017 sofa 9 +scene0504_00 00021 cabinet 22 +scene0505_00 00002 desk 2 +scene0505_00 00004 shelf 13 +scene0505_00 00008 sofa 35 +scene0505_00 00014 cabinet 24 +scene0505_00 00018 cabinet 25 +scene0505_00 00021 cabinet 26 +scene0506_00 00003 bed 4 +scene0506_00 00004 desk 9 +scene0506_00 00005 cabinet 8 +scene0506_00 00006 shelf 6 +scene0506_00 00007 shelf 7 +scene0506_00 00009 cabinet 10 +scene0507_00 00003 pillow 5 +scene0507_00 00004 pillow 6 +scene0507_00 00005 table 1 +scene0507_00 00006 pillow 7 +scene0508_00 00013 bin 19 +scene0508_00 00016 bag 20 +scene0510_00 00003 sink 9 +scene0510_00 00004 toilet 6 +scene0510_00 00007 bin 5 +scene0510_00 00008 toilet 7 +scene0510_00 00009 bin 10 +scene0511_00 00005 cabinet 9 +scene0511_00 00006 bin 10 +scene0514_00 00004 sofa 8 +scene0514_00 00007 table 2 +scene0514_00 00009 shelf 1 +scene0515_00 00006 bed 10 +scene0515_00 00009 sofa 18 +scene0515_00 00010 cabinet 16 +scene0515_00 00011 desk 14 +scene0515_00 00012 shelf 1 +scene0515_00 00018 toilet 13 +scene0516_00 00019 sink 25 +scene0516_00 00020 toilet 24 +scene0517_00 00001 cabinet 24 +scene0517_00 00006 sofa 25 +scene0517_00 00009 desk 22 +scene0517_00 00011 desk 21 +scene0517_00 00013 cabinet 27 +scene0517_00 00014 cabinet 29 +scene0517_00 00022 cabinet 23 +scene0517_00 00023 bag 15 +scene0517_00 00024 sink 26 +scene0517_00 00027 bag 17 +scene0517_00 00029 bin 14 +scene0517_00 00030 bag 16 +scene0518_00 00001 shelf 2 +scene0518_00 00004 table 10 +scene0518_00 00012 pillow 11 +scene0519_00 00003 sink 6 +scene0519_00 00005 bin 4 +scene0519_00 00006 sink 2 +scene0520_00 00001 sofa 3 +scene0520_00 00003 sofa 2 +scene0520_00 00005 sofa 4 +scene0521_00 00003 bed 5 +scene0521_00 00004 shelf 4 +scene0521_00 00005 cabinet 14 +scene0521_00 00011 sink 11 +scene0521_00 00013 cabinet 13 +scene0521_00 00014 toilet 16 +scene0523_00 00003 toilet 1 +scene0523_00 00004 sink 4 +scene0523_00 00006 bin 7 +scene0524_00 00007 door 8 +scene0525_00 00005 cabinet 42 +scene0525_00 00008 door 46 +scene0527_00 00004 door 19 +scene0527_00 00005 sink 11 +scene0527_00 00006 sink 10 +scene0528_00 00009 bin 9 +scene0529_00 00003 cabinet 13 +scene0529_00 00004 sofa 23 +scene0529_00 00009 cabinet 14 +scene0529_00 00013 sink 7 +scene0529_00 00016 table 18 +scene0530_00 00006 door 10 +scene0530_00 00010 bin 15 +scene0532_00 00004 door 3 +scene0532_00 00014 cabinet 17 +scene0533_00 00002 sofa 11 +scene0533_00 00005 sofa 12 +scene0534_00 00003 shelf 5 +scene0534_00 00004 shelf 6 +scene0534_00 00006 door 10 +scene0536_00 00002 sofa 1 +scene0536_00 00006 pillow 2 +scene0537_00 00003 sofa 3 +scene0537_00 00004 table 8 +scene0538_00 00004 door 4 +scene0538_00 00005 sink 10 +scene0538_00 00006 toilet 6 +scene0539_00 00006 door 14 +scene0539_00 00007 toilet 12 +scene0540_00 00011 cabinet 2 +scene0541_00 00005 bed 9 +scene0541_00 00007 cabinet 12 +scene0541_00 00008 cabinet 10 +scene0541_00 00009 door 8 +scene0542_00 00003 cabinet 2 +scene0542_00 00006 table 15 +scene0542_00 00008 shelf 5 +scene0542_00 00010 sink 4 +scene0544_00 00006 bin 2 +scene0545_00 00002 bed 7 +scene0545_00 00003 shelf 11 +scene0546_00 00008 sink 12 +scene0546_00 00009 toilet 10 +scene0546_00 00010 cabinet 11 +scene0547_00 00003 cabinet 9 +scene0547_00 00005 shelf 10 +scene0547_00 00007 door 18 +scene0547_00 00008 desk 6 +scene0547_00 00013 table 13 +scene0547_00 00017 sink 14 +scene0548_00 00004 bed 4 +scene0548_00 00007 door 17 +scene0548_00 00009 cabinet 15 +scene0548_00 00010 pillow 7 +scene0549_00 00002 sofa 2 +scene0549_00 00004 sofa 1 +scene0549_00 00009 table 3 +scene0549_00 00010 table 4 +scene0549_00 00012 table 6 +scene0549_00 00013 table 7 +scene0550_00 00005 door 7 +scene0550_00 00009 toilet 8 +scene0552_00 00015 bin 16 +scene0553_00 00003 sink 6 +scene0553_00 00004 toilet 2 +scene0554_00 00005 door 20 +scene0554_00 00007 shelf 31 +scene0554_00 00010 desk 38 +scene0554_00 00017 pillow 34 +scene0556_00 00003 bed 12 +scene0556_00 00004 bed 13 +scene0556_00 00005 cabinet 14 +scene0557_00 00002 bed 8 +scene0558_00 00002 shelf 5 +scene0558_00 00009 bag 12 +scene0558_00 00011 table 15 +scene0559_00 00002 sofa 3 +scene0560_00 00002 bed 2 +scene0560_00 00004 door 4 +scene0561_00 00003 door 6 +scene0561_00 00004 door 5 +scene0561_00 00006 door 9 +scene0561_00 00007 door 10 +scene0561_00 00008 door 7 +scene0564_00 00002 door 1 +scene0564_00 00004 toilet 3 +scene0564_00 00005 sink 9 +scene0564_00 00006 sink 10 +scene0565_00 00006 shelf 25 +scene0565_00 00007 box 6 +scene0565_00 00008 shelf 26 +scene0565_00 00009 box 7 +scene0565_00 00013 bin 19 +scene0567_00 00002 bed 11 +scene0567_00 00008 pillow 14 +scene0568_00 00003 sofa 4 +scene0568_00 00005 display 11 +scene0569_00 00015 display 18 +scene0570_00 00005 sink 4 +scene0570_00 00006 toilet 6 +scene0571_00 00005 door 10 +scene0571_00 00006 toilet 7 +scene0572_00 00004 table 7 +scene0573_00 00006 cabinet 15 +scene0574_00 00003 door 10 +scene0574_00 00004 sink 7 +scene0574_00 00005 table 2 +scene0574_00 00007 bin 15 +scene0574_00 00009 sink 12 +scene0575_00 00014 bin 12 +scene0576_00 00003 bed 11 +scene0576_00 00008 shelf 3 +scene0577_00 00003 shelf 10 +scene0577_00 00004 bed 8 +scene0577_00 00006 cabinet 14 +scene0577_00 00007 cabinet 13 +scene0577_00 00008 cabinet 6 +scene0577_00 00016 pillow 16 +scene0579_00 00004 bin 3 +scene0579_00 00005 bin 4 +scene0579_00 00006 sink 7 +scene0579_00 00007 sink 8 +scene0579_00 00008 sink 5 +scene0579_00 00009 sink 6 +scene0580_00 00004 bed 8 +scene0580_00 00006 shelf 3 +scene0580_00 00007 cabinet 13 +scene0580_00 00010 bag 11 +scene0580_00 00011 bag 10 +scene0581_00 00006 door 7 +scene0581_00 00009 toilet 6 +scene0581_00 00010 sink 1 +scene0582_00 00004 shelf 20 +scene0582_00 00007 display 23 +scene0582_00 00012 display 24 +scene0582_00 00013 display 25 +scene0582_00 00014 shelf 13 +scene0583_00 00005 door 1 +scene0583_00 00006 sink 10 +scene0583_00 00008 toilet 2 +scene0584_00 00005 cabinet 15 +scene0585_00 00002 shelf 1 +scene0585_00 00005 shelf 2 +scene0585_00 00007 shelf 4 +scene0585_00 00012 bin 14 +scene0585_00 00013 bin 15 +scene0585_00 00015 bin 16 +scene0586_00 00010 bin 17 +scene0586_00 00013 sink 18 +scene0587_00 00002 sofa 2 +scene0588_00 00004 sofa 4 +scene0588_00 00006 sofa 3 +scene0588_00 00007 sofa 2 +scene0588_00 00008 sofa 9 +scene0588_00 00009 sofa 8 +scene0588_00 00010 sofa 5 +scene0588_00 00011 sofa 10 +scene0588_00 00012 sofa 13 +scene0588_00 00013 sofa 12 +scene0588_00 00014 sofa 11 +scene0588_00 00016 table 16 +scene0588_00 00017 table 17 +scene0588_00 00018 table 18 +scene0588_00 00021 table 21 +scene0589_00 00002 shelf 2 +scene0589_00 00003 cabinet 3 +scene0589_00 00005 cabinet 9 +scene0589_00 00006 bed 4 +scene0589_00 00007 pillow 14 +scene0590_00 00003 bed 15 +scene0590_00 00006 sofa 7 +scene0590_00 00007 pillow 20 +scene0590_00 00009 cabinet 12 +scene0590_00 00016 cabinet 14 +scene0590_00 00017 display 6 +scene0591_00 00004 cabinet 7 +scene0591_00 00005 shelf 15 +scene0591_00 00010 shelf 12 +scene0591_00 00013 pillow 17 +scene0592_00 00028 box 5 +scene0593_00 00003 shelf 2 +scene0593_00 00005 sofa 8 +scene0593_00 00006 bin 9 +scene0598_00 00002 shelf 4 +scene0598_00 00003 table 13 +scene0598_00 00010 display 3 +scene0598_00 00011 display 2 +scene0599_00 00003 table 6 +scene0599_00 00005 door 7 +scene0599_00 00007 display 2 +scene0600_00 00002 bed 5 +scene0600_00 00007 bin 7 +scene0601_00 00008 sofa 10 +scene0601_00 00010 table 19 +scene0601_00 00012 sofa 11 +scene0602_00 00002 sink 7 +scene0602_00 00003 toilet 12 +scene0603_00 00002 shelf 16 +scene0603_00 00004 sofa 9 +scene0603_00 00005 sofa 7 +scene0603_00 00007 table 19 +scene0603_00 00008 shelf 22 +scene0603_00 00009 desk 20 +scene0603_00 00012 shelf 15 +scene0603_00 00013 display 14 +scene0603_00 00016 table 21 +scene0603_00 00019 shelf 17 +scene0604_00 00003 bed 6 +scene0604_00 00004 sofa 1 +scene0604_00 00009 display 12 +scene0607_00 00003 cabinet 4 +scene0608_00 00008 display 25 +scene0610_00 00005 toilet 12 +scene0610_00 00007 bin 11 +scene0612_00 00003 toilet 5 +scene0612_00 00007 sink 2 +scene0613_00 00001 bed 6 +scene0613_00 00004 shelf 8 +scene0613_00 00006 shelf 9 +scene0613_00 00008 door 11 +scene0614_00 00002 shelf 16 +scene0614_00 00003 shelf 21 +scene0614_00 00009 cabinet 33 +scene0614_00 00018 cabinet 22 +scene0614_00 00020 shelf 17 +scene0614_00 00021 display 27 +scene0615_00 00003 bed 1 +scene0615_00 00004 door 19 +scene0615_00 00008 cabinet 17 +scene0615_00 00016 pillow 2 +scene0615_00 00021 bag 4 +scene0616_00 00014 bin 1 +scene0617_00 00004 display 7 +scene0617_00 00007 table 6 +scene0619_00 00003 shelf 5 +scene0620_00 00002 bed 8 +scene0620_00 00004 desk 5 +scene0620_00 00005 cabinet 9 +scene0620_00 00006 cabinet 10 +scene0622_00 00001 table 8 +scene0623_00 00003 sofa 16 +scene0623_00 00006 door 11 +scene0623_00 00008 display 18 +scene0623_00 00011 cabinet 9 +scene0625_00 00003 door 8 +scene0625_00 00005 toilet 7 +scene0626_00 00002 sofa 1 +scene0626_00 00003 table 7 +scene0627_00 00002 table 64 +scene0627_00 00037 bag 68 +scene0628_00 00005 door 13 +scene0629_00 00004 cabinet 14 +scene0629_00 00011 door 9 +scene0630_00 00002 shelf 1 +scene0631_00 00002 cabinet 7 +scene0631_00 00005 toilet 11 +scene0631_00 00008 sink 9 +scene0631_00 00009 sink 8 +scene0632_00 00003 cabinet 6 +scene0632_00 00004 shelf 2 +scene0633_00 00007 cabinet 15 +scene0635_00 00003 shelf 5 +scene0635_00 00006 door 9 +scene0636_00 00001 box 2 +scene0638_00 00001 table 4 +scene0639_00 00002 sink 8 +scene0639_00 00006 toilet 1 +scene0639_00 00008 sink 9 +scene0640_00 00004 bed 4 +scene0640_00 00006 table 11 +scene0641_00 00003 sofa 1 +scene0641_00 00005 sofa 2 +scene0641_00 00006 sofa 3 +scene0641_00 00008 table 8 +scene0642_00 00005 bed 1 +scene0642_00 00008 cabinet 28 +scene0642_00 00010 sink 21 +scene0642_00 00012 toilet 25 +scene0642_00 00014 pillow 16 +scene0642_00 00015 pillow 17 +scene0642_00 00018 display 15 +scene0642_00 00020 cabinet 30 +scene0642_00 00026 door 13 +scene0642_00 00028 sink 27 +scene0643_00 00005 door 24 +scene0643_00 00006 desk 4 +scene0643_00 00007 desk 3 +scene0643_00 00008 desk 6 +scene0643_00 00009 shelf 1 +scene0643_00 00010 shelf 2 +scene0643_00 00022 display 26 +scene0643_00 00024 display 25 +scene0644_00 00003 shelf 11 +scene0644_00 00016 bin 31 +scene0645_00 00003 bed 9 +scene0645_00 00004 bed 10 +scene0645_00 00005 sofa 33 +scene0645_00 00012 door 38 +scene0645_00 00014 sink 39 +scene0645_00 00015 toilet 26 +scene0645_00 00022 pillow 16 +scene0645_00 00025 shelf 44 +scene0646_00 00007 door 39 +scene0646_00 00009 table 22 +scene0646_00 00013 shelf 41 +scene0646_00 00017 table 24 +scene0646_00 00018 shelf 36 +scene0646_00 00019 shelf 20 +scene0646_00 00025 shelf 37 +scene0646_00 00030 box 2 +scene0646_00 00031 display 42 +scene0249_00 00014 bin 31 +030 00005 desk 322263 +030 00006 sofa 355991 +030 00007 table 1090415 +030 00008 chair 1435016 +030 00012 chair 1154857 +030 00013 chair 369705 +030 00014 chair 358548 +030 00020 chair 1626360 +030 00021 table 1046554 +030 00026 display 1070275 +030 00027 display 589771 +322 00002 shelf 17696 +322 00008 table 28875 +322 00009 chair 3209 +322 00010 chair 1408 +322 00011 chair 5748 +322 00012 chair 14611 +322 00014 bin 19543 +205 00002 table 32311 +205 00003 table 1448290 +205 00004 table 56679 +205 00005 chair 58686 +205 00006 chair 49241 +205 00007 bag 46479 +205 00008 bin 18108 +205 00009 bag 48386 +205 00010 chair 44637 +043 00007 desk 620 +043 00008 door 611 +043 00010 chair 550 +043 00011 chair 487 +043 00013 display 223615 +043 00014 bin 315 +043 00016 box 276 +043 00018 bag 522 diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bag_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bag_meta.xml new file mode 100755 index 0000000..37bc740 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bag_meta.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bed_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bed_meta.xml new file mode 100755 index 0000000..0858ed6 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bed_meta.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bin_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bin_meta.xml new file mode 100755 index 0000000..87ff414 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/bin_meta.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/box_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/box_meta.xml new file mode 100755 index 0000000..4278208 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/box_meta.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/cabinet_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/cabinet_meta.xml new file mode 100755 index 0000000..428a292 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/cabinet_meta.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/chair_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/chair_meta.xml new file mode 100755 index 0000000..0de02ef --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/chair_meta.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/chair_parts.txt b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/chair_parts.txt new file mode 100644 index 0000000..b3f0977 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/chair_parts.txt @@ -0,0 +1,6 @@ +background +head +back +arm +base +seat diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/desk_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/desk_meta.xml new file mode 100755 index 0000000..30fa579 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/desk_meta.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/display_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/display_meta.xml new file mode 100755 index 0000000..f5fe749 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/display_meta.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/door_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/door_meta.xml new file mode 100755 index 0000000..cbb0d78 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/door_meta.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/pillow_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/pillow_meta.xml new file mode 100755 index 0000000..6e1c047 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/pillow_meta.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/shelf_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/shelf_meta.xml new file mode 100755 index 0000000..2bcc147 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/shelf_meta.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/sink_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/sink_meta.xml new file mode 100755 index 0000000..1239f97 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/sink_meta.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/sofa_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/sofa_meta.xml new file mode 100755 index 0000000..3f05c1a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/sofa_meta.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/table_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/table_meta.xml new file mode 100755 index 0000000..f0e4194 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/table_meta.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/part_labels/toilet_meta.xml b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/toilet_meta.xml new file mode 100755 index 0000000..67328e0 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/part_labels/toilet_meta.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/zoo/SimpleView/ScanObjectNN/training_data/shape_names_ext.txt b/zoo/SimpleView/ScanObjectNN/training_data/shape_names_ext.txt new file mode 100644 index 0000000..1dbfdb7 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/shape_names_ext.txt @@ -0,0 +1,15 @@ +bag +bin +box +cabinet +chair +desk +display +door +shelf +table +bed +pillow +sink +sofa +toilet \ No newline at end of file diff --git a/zoo/SimpleView/ScanObjectNN/training_data/shape_names_modelnet.txt b/zoo/SimpleView/ScanObjectNN/training_data/shape_names_modelnet.txt new file mode 100644 index 0000000..1b2a397 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/shape_names_modelnet.txt @@ -0,0 +1,40 @@ +airplane +bathtub +bed +bench +bookshelf +bottle +bowl +car +chair +cone +cup +curtain +desk +door +dresser +flower_pot +glass_box +guitar +keyboard +lamp +laptop +mantel +monitor +night_stand +person +piano +plant +radio +range_hood +sink +sofa +stairs +stool +table +tent +toilet +tv_stand +vase +wardrobe +xbox diff --git a/zoo/SimpleView/ScanObjectNN/training_data/split1.txt b/zoo/SimpleView/ScanObjectNN/training_data/split1.txt new file mode 100755 index 0000000..2a9ed20 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/split1.txt @@ -0,0 +1,2902 @@ +005_00020.bin 0 t +014_00018.bin 0 +025_00011.bin 0 +038_00032.bin 0 t +041_00028.bin 0 +041_00052.bin 0 +043_00018.bin 0 +054_00026.bin 0 t +073_00014.bin 0 +080_00015.bin 0 +082_00020.bin 0 +084_00012.bin 0 +086_00015.bin 0 +086_00020.bin 0 +093_00019.bin 0 +096_00016.bin 0 +096_00020.bin 0 +098_00007.bin 0 +202_00002.bin 0 +205_00007.bin 0 +205_00009.bin 0 +209_00013.bin 0 +209_00019.bin 0 +213_00025.bin 0 +223_00012.bin 0 +227_00012.bin 0 t +234_00012.bin 0 +237_00011.bin 0 +237_00014.bin 0 +240_00009.bin 0 +246_00014.bin 0 t +251_00015.bin 0 +251_00018.bin 0 +273_00010.bin 0 +614_00005.bin 0 +700_00012.bin 0 +005_00015.bin 1 +005_00017.bin 1 +014_00016.bin 1 +021_00014.bin 1 +021_00021.bin 1 +032_00015.bin 1 t +041_00042.bin 1 +043_00014.bin 1 +045_00018.bin 1 +047_00019.bin 1 +047_00023.bin 1 +049_00007.bin 1 +052_00012.bin 1 +062_00009.bin 1 +065_00013.bin 1 +069_00009.bin 1 t +076_00045.bin 1 +080_00013.bin 1 +086_00011.bin 1 +086_00016.bin 1 +089_00010.bin 1 +093_00014.bin 1 +093_00016.bin 1 +109_00008.bin 1 +109_00016.bin 1 +205_00008.bin 1 +207_00005.bin 1 +207_00010.bin 1 +209_00014.bin 1 t +213_00015.bin 1 t +213_00026.bin 1 t +231_00019.bin 1 +237_00009.bin 1 +237_00010.bin 1 +246_00008.bin 1 +251_00014.bin 1 +252_00013.bin 1 +252_00014.bin 1 +255_00003.bin 1 +255_00006.bin 1 +265_00010.bin 1 t +265_00024.bin 1 t +265_00030.bin 1 t +270_00007.bin 1 +270_00012.bin 1 +273_00007.bin 1 +276_00010.bin 1 +279_00012.bin 1 +322_00014.bin 1 +700_00006.bin 1 +700_00008.bin 1 +005_00021.bin 2 +011_00010.bin 2 t +036_00021.bin 2 +041_00038.bin 2 t +043_00016.bin 2 t +045_00012.bin 2 t +045_00017.bin 2 t +047_00021.bin 2 +047_00022.bin 2 +047_00026.bin 2 +054_00019.bin 2 +054_00050.bin 2 +074_00005.bin 2 +074_00012.bin 2 +074_00016.bin 2 +074_00018.bin 2 +074_00020.bin 2 +074_00021.bin 2 +074_00029.bin 2 +078_00005.bin 2 +082_00018.bin 2 +082_00024.bin 2 +082_00026.bin 2 +084_00009.bin 2 +084_00011.bin 2 +086_00009.bin 2 +086_00018.bin 2 +087_00007.bin 2 +087_00008.bin 2 +087_00009.bin 2 +087_00012.bin 2 +087_00017.bin 2 +087_00028.bin 2 +089_00013.bin 2 +089_00021.bin 2 +093_00018.bin 2 +093_00022.bin 2 +093_00023.bin 2 +093_00032.bin 2 +109_00012.bin 2 +209_00022.bin 2 +209_00029.bin 2 +209_00032.bin 2 +213_00011.bin 2 +225_00016.bin 2 t +231_00031.bin 2 +234_00008.bin 2 t +246_00012.bin 2 t +251_00003.bin 2 +251_00007.bin 2 +251_00008.bin 2 +255_00008.bin 2 +260_00012.bin 2 +263_00025.bin 2 +265_00011.bin 2 t +265_00028.bin 2 t +265_00035.bin 2 t +265_00038.bin 2 t +265_00040.bin 2 t +265_00042.bin 2 t +272_00027.bin 2 +272_00041.bin 2 +276_00007.bin 2 +279_00011.bin 2 +623_00008.bin 2 +015_00008.bin 3 +025_00006.bin 3 +041_00012.bin 3 t +047_00008.bin 3 +047_00011.bin 3 +049_00006.bin 3 +052_00007.bin 3 +062_00008.bin 3 +065_00002.bin 3 +076_00010.bin 3 +082_00007.bin 3 t +082_00008.bin 3 t +084_00002.bin 3 +086_00006.bin 3 t +086_00007.bin 3 t +087_00005.bin 3 t +093_00009.bin 3 +098_00002.bin 3 +201_00001.bin 3 t +201_00004.bin 3 t +207_00002.bin 3 +209_00001.bin 3 +213_00003.bin 3 t +213_00006.bin 3 t +217_00013.bin 3 +225_00004.bin 3 +225_00005.bin 3 +225_00007.bin 3 +227_00007.bin 3 +243_00002.bin 3 +243_00004.bin 3 +249_00002.bin 3 +252_00002.bin 3 +252_00007.bin 3 +255_00002.bin 3 t +260_00000.bin 3 +260_00003.bin 3 +260_00005.bin 3 +260_00007.bin 3 +260_00008.bin 3 +265_00006.bin 3 +276_00000.bin 3 +276_00006.bin 3 +276_00008.bin 3 +279_00004.bin 3 +700_00001.bin 3 +700_00004.bin 3 +700_00005.bin 3 +700_00009.bin 3 +700_00010.bin 3 +005_00008.bin 4 +014_00009.bin 4 t +021_00011.bin 4 t +025_00003.bin 4 +025_00007.bin 4 +030_00008.bin 4 t +030_00012.bin 4 t +030_00013.bin 4 t +030_00014.bin 4 t +032_00007.bin 4 t +032_00008.bin 4 t +032_00009.bin 4 t +036_00009.bin 4 +036_00010.bin 4 +036_00011.bin 4 +036_00013.bin 4 +038_00011.bin 4 t +038_00012.bin 4 t +038_00014.bin 4 t +038_00015.bin 4 t +038_00016.bin 4 t +041_00010.bin 4 +041_00013.bin 4 +041_00015.bin 4 +043_00010.bin 4 +043_00011.bin 4 +045_00009.bin 4 +045_00011.bin 4 +045_00013.bin 4 +045_00014.bin 4 +045_00016.bin 4 +047_00006.bin 4 +047_00007.bin 4 +047_00009.bin 4 +047_00010.bin 4 +049_00003.bin 4 t +049_00004.bin 4 t +052_00008.bin 4 +054_00006.bin 4 +054_00007.bin 4 +054_00009.bin 4 +054_00012.bin 4 +054_00013.bin 4 +054_00014.bin 4 +054_00016.bin 4 +054_00017.bin 4 +054_00018.bin 4 +057_00007.bin 4 t +065_00006.bin 4 +065_00007.bin 4 +065_00009.bin 4 +065_00011.bin 4 +069_00010.bin 4 +073_00005.bin 4 +073_00013.bin 4 +074_00009.bin 4 t +076_00012.bin 4 +076_00013.bin 4 +076_00016.bin 4 +076_00017.bin 4 +076_00018.bin 4 +076_00019.bin 4 +076_00021.bin 4 +076_00022.bin 4 +076_00023.bin 4 +076_00028.bin 4 +076_00029.bin 4 +076_00031.bin 4 +076_00034.bin 4 +076_00037.bin 4 +078_00010.bin 4 +080_00005.bin 4 +080_00006.bin 4 +080_00007.bin 4 +082_00009.bin 4 +082_00011.bin 4 +082_00014.bin 4 +084_00004.bin 4 +084_00008.bin 4 +086_00001.bin 4 +086_00008.bin 4 +087_00001.bin 4 +087_00003.bin 4 +087_00004.bin 4 +087_00011.bin 4 +093_00006.bin 4 +096_00008.bin 4 +109_00007.bin 4 +201_00009.bin 4 +201_00010.bin 4 +201_00013.bin 4 +201_00015.bin 4 +201_00021.bin 4 +202_00003.bin 4 +202_00004.bin 4 +202_00005.bin 4 +202_00007.bin 4 +202_00008.bin 4 +202_00009.bin 4 +202_00010.bin 4 +202_00011.bin 4 +202_00012.bin 4 +202_00013.bin 4 +202_00015.bin 4 +202_00016.bin 4 +202_00017.bin 4 +202_00020.bin 4 +205_00005.bin 4 +205_00006.bin 4 +205_00010.bin 4 +206_00007.bin 4 t +206_00008.bin 4 t +206_00010.bin 4 t +206_00011.bin 4 t +206_00013.bin 4 t +206_00014.bin 4 t +206_00015.bin 4 t +206_00016.bin 4 t +206_00018.bin 4 t +206_00019.bin 4 t +206_00020.bin 4 t +206_00021.bin 4 t +206_00022.bin 4 t +206_00024.bin 4 t +206_00027.bin 4 t +209_00006.bin 4 +213_00012.bin 4 +213_00014.bin 4 +213_00018.bin 4 +223_00003.bin 4 +223_00004.bin 4 +223_00006.bin 4 +223_00007.bin 4 +227_00008.bin 4 t +227_00009.bin 4 t +231_00005.bin 4 +231_00006.bin 4 +231_00007.bin 4 +231_00008.bin 4 +234_00007.bin 4 +237_00004.bin 4 t +237_00005.bin 4 t +246_00004.bin 4 +246_00006.bin 4 +246_00011.bin 4 +251_00006.bin 4 +251_00011.bin 4 +251_00013.bin 4 +251_00017.bin 4 +251_00019.bin 4 +263_00011.bin 4 +263_00014.bin 4 +270_00006.bin 4 +272_00006.bin 4 +272_00008.bin 4 +272_00009.bin 4 +272_00010.bin 4 +273_00004.bin 4 +279_00007.bin 4 +279_00008.bin 4 +308_00011.bin 4 +308_00012.bin 4 +308_00013.bin 4 +308_00015.bin 4 +308_00017.bin 4 +322_00009.bin 4 +322_00011.bin 4 +322_00012.bin 4 +522_00005.bin 4 +609_00004.bin 4 t +609_00005.bin 4 t +609_00006.bin 4 t +609_00007.bin 4 t +609_00008.bin 4 t +609_00009.bin 4 t +609_00010.bin 4 t +609_00011.bin 4 t +609_00012.bin 4 t +609_00014.bin 4 t +609_00016.bin 4 t +609_00018.bin 4 t +609_00019.bin 4 t +609_00020.bin 4 t +609_00021.bin 4 t +613_00000.bin 4 t +613_00001.bin 4 t +613_00002.bin 4 t +613_00004.bin 4 t +613_00005.bin 4 t +613_00007.bin 4 t +613_00010.bin 4 t +614_00004.bin 4 +621_00001.bin 4 +621_00005.bin 4 +621_00006.bin 4 +621_00007.bin 4 +621_00009.bin 4 +621_00010.bin 4 +621_00011.bin 4 +621_00012.bin 4 +621_00013.bin 4 +623_00002.bin 4 +623_00004.bin 4 +623_00005.bin 4 +005_00005.bin 5 +011_00001.bin 5 +021_00006.bin 5 +030_00005.bin 5 +032_00004.bin 5 t +036_00002.bin 5 +036_00004.bin 5 +036_00005.bin 5 +036_00006.bin 5 +038_00005.bin 5 t +038_00006.bin 5 t +038_00008.bin 5 t +038_00009.bin 5 t +038_00010.bin 5 t +038_00013.bin 5 t +041_00005.bin 5 +041_00006.bin 5 +041_00009.bin 5 +041_00011.bin 5 +043_00007.bin 5 t +045_00005.bin 5 +047_00000.bin 5 +047_00001.bin 5 +047_00002.bin 5 +049_00005.bin 5 +054_00001.bin 5 +054_00002.bin 5 +054_00003.bin 5 +054_00011.bin 5 +057_00002.bin 5 +057_00003.bin 5 +062_00006.bin 5 t +076_00006.bin 5 +076_00009.bin 5 +076_00015.bin 5 +076_00036.bin 5 +080_00002.bin 5 t +080_00004.bin 5 t +082_00005.bin 5 +084_00001.bin 5 +086_00000.bin 5 +109_00005.bin 5 t +201_00003.bin 5 t +201_00005.bin 5 t +201_00006.bin 5 t +206_00005.bin 5 +227_00006.bin 5 +231_00004.bin 5 +231_00009.bin 5 +234_00003.bin 5 t +234_00004.bin 5 t +246_00002.bin 5 +272_00003.bin 5 +308_00004.bin 5 +522_00001.bin 5 +014_00004.bin 6 +014_00013.bin 6 +015_00009.bin 6 +021_00018.bin 6 +025_00009.bin 6 +030_00026.bin 6 +030_00027.bin 6 +036_00018.bin 6 +036_00022.bin 6 +036_00024.bin 6 +036_00028.bin 6 +036_00033.bin 6 +036_00034.bin 6 +038_00019.bin 6 +038_00021.bin 6 +038_00029.bin 6 +038_00030.bin 6 +038_00034.bin 6 +038_00035.bin 6 +038_00037.bin 6 +038_00038.bin 6 +041_00019.bin 6 +041_00021.bin 6 +041_00025.bin 6 +041_00029.bin 6 +041_00031.bin 6 +041_00032.bin 6 +041_00033.bin 6 +041_00035.bin 6 +043_00013.bin 6 +047_00017.bin 6 +047_00018.bin 6 +047_00025.bin 6 +049_00009.bin 6 +052_00011.bin 6 +054_00025.bin 6 +054_00028.bin 6 +054_00032.bin 6 +054_00036.bin 6 +057_00011.bin 6 +057_00014.bin 6 +057_00015.bin 6 +057_00016.bin 6 +065_00008.bin 6 t +069_00012.bin 6 +069_00014.bin 6 +069_00015.bin 6 +069_00016.bin 6 +069_00017.bin 6 +071_00006.bin 6 +073_00010.bin 6 t +073_00016.bin 6 t +074_00025.bin 6 +076_00038.bin 6 +076_00039.bin 6 +076_00040.bin 6 +076_00041.bin 6 +076_00042.bin 6 +076_00043.bin 6 +078_00013.bin 6 +078_00014.bin 6 +080_00009.bin 6 t +080_00018.bin 6 t +086_00021.bin 6 +086_00023.bin 6 +086_00027.bin 6 +089_00018.bin 6 +093_00015.bin 6 +096_00018.bin 6 +098_00005.bin 6 +201_00007.bin 6 +201_00008.bin 6 +201_00018.bin 6 +201_00026.bin 6 +206_00030.bin 6 +206_00031.bin 6 +209_00015.bin 6 t +209_00025.bin 6 t +217_00015.bin 6 +231_00016.bin 6 +231_00017.bin 6 +231_00021.bin 6 +231_00023.bin 6 +231_00026.bin 6 +231_00027.bin 6 +231_00029.bin 6 +237_00012.bin 6 +246_00016.bin 6 +263_00015.bin 6 t +265_00020.bin 6 +272_00011.bin 6 +522_00006.bin 6 +005_00004.bin 7 +005_00006.bin 7 +014_00002.bin 7 +021_00008.bin 7 +032_00005.bin 7 +038_00004.bin 7 t +043_00008.bin 7 +047_00004.bin 7 +074_00001.bin 7 +076_00005.bin 7 t +082_00006.bin 7 +089_00004.bin 7 +096_00002.bin 7 +096_00004.bin 7 +096_00005.bin 7 +096_00007.bin 7 +109_00004.bin 7 +207_00003.bin 7 +213_00004.bin 7 +213_00008.bin 7 +225_00003.bin 7 +234_00002.bin 7 +234_00006.bin 7 +237_00003.bin 7 t +246_00001.bin 7 t +246_00003.bin 7 t +246_00007.bin 7 t +251_00002.bin 7 +251_00004.bin 7 +252_00003.bin 7 +263_00004.bin 7 t +265_00001.bin 7 +273_00003.bin 7 +276_00002.bin 7 +279_00005.bin 7 +700_00002.bin 7 +014_00001.bin 8 +014_00003.bin 8 +021_00007.bin 8 +025_00005.bin 8 +041_00003.bin 8 +041_00004.bin 8 +045_00004.bin 8 +047_00005.bin 8 +047_00012.bin 8 +047_00013.bin 8 +049_00012.bin 8 +054_00010.bin 8 +073_00006.bin 8 +074_00004.bin 8 +074_00006.bin 8 +074_00007.bin 8 +076_00002.bin 8 +076_00033.bin 8 +082_00013.bin 8 t +086_00003.bin 8 t +086_00017.bin 8 t +089_00005.bin 8 +096_00003.bin 8 +096_00011.bin 8 +096_00012.bin 8 +201_00002.bin 8 +201_00012.bin 8 +201_00016.bin 8 +201_00017.bin 8 +201_00019.bin 8 +201_00022.bin 8 +201_00023.bin 8 +201_00025.bin 8 +206_00006.bin 8 t +209_00010.bin 8 +217_00004.bin 8 +217_00008.bin 8 +231_00028.bin 8 +237_00002.bin 8 +240_00006.bin 8 +246_00005.bin 8 +249_00004.bin 8 +251_00001.bin 8 +263_00012.bin 8 +265_00015.bin 8 +272_00001.bin 8 +272_00007.bin 8 +276_00005.bin 8 +308_00003.bin 8 +308_00006.bin 8 +322_00002.bin 8 +614_00001.bin 8 +014_00007.bin 9 +021_00012.bin 9 +025_00004.bin 9 +030_00021.bin 9 +032_00011.bin 9 +032_00013.bin 9 +045_00007.bin 9 +049_00002.bin 9 +054_00008.bin 9 +061_00006.bin 9 +061_00007.bin 9 +062_00007.bin 9 +065_00001.bin 9 +069_00003.bin 9 +069_00004.bin 9 +069_00007.bin 9 +071_00002.bin 9 +071_00003.bin 9 +073_00003.bin 9 t +074_00002.bin 9 t +076_00026.bin 9 t +076_00027.bin 9 t +076_00032.bin 9 t +076_00035.bin 9 t +078_00004.bin 9 +082_00016.bin 9 +089_00002.bin 9 t +089_00003.bin 9 t +093_00007.bin 9 +096_00037.bin 9 +202_00000.bin 9 +205_00002.bin 9 +205_00003.bin 9 +205_00004.bin 9 +206_00003.bin 9 +206_00004.bin 9 +207_00009.bin 9 t +209_00004.bin 9 t +213_00007.bin 9 +213_00017.bin 9 +217_00003.bin 9 +217_00007.bin 9 +223_00005.bin 9 t +223_00017.bin 9 t +240_00008.bin 9 +246_00010.bin 9 +249_00003.bin 9 +251_00012.bin 9 +252_00004.bin 9 +252_00005.bin 9 +263_00023.bin 9 t +265_00012.bin 9 +270_00005.bin 9 +272_00013.bin 9 +273_00001.bin 9 +286_00005.bin 9 +294_00005.bin 9 +308_00001.bin 9 +308_00005.bin 9 +308_00008.bin 9 +322_00008.bin 9 +609_00001.bin 9 t +609_00017.bin 9 t +613_00008.bin 9 +613_00009.bin 9 +613_00011.bin 9 +614_00002.bin 9 +623_00003.bin 9 t +014_00014.bin 0 +036_00019.bin 0 +047_00015.bin 0 +087_00018.bin 0 +089_00015.bin 0 +206_00029.bin 0 +231_00018.bin 0 +246_00015.bin 0 t +252_00011.bin 0 +005_00012.bin 1 +057_00012.bin 1 +065_00015.bin 1 +080_00016.bin 1 +092_00008.bin 1 +096_00015.bin 1 t +206_00028.bin 1 +209_00017.bin 1 t +240_00010.bin 1 +255_00007.bin 1 +032_00014.bin 2 +041_00047.bin 2 t +047_00020.bin 2 +073_00008.bin 2 +074_00019.bin 2 +078_00009.bin 2 +086_00012.bin 2 +087_00002.bin 2 +087_00015.bin 2 +093_00026.bin 2 +096_00027.bin 2 t +209_00026.bin 2 +213_00020.bin 2 +223_00009.bin 2 +251_00010.bin 2 +005_00010.bin 3 +052_00004.bin 3 +065_00004.bin 3 +084_00003.bin 3 +086_00010.bin 3 t +089_00009.bin 3 +213_00009.bin 3 t +237_00007.bin 3 t +255_00001.bin 3 t +265_00003.bin 3 +005_00007.bin 4 +011_00007.bin 4 +030_00020.bin 4 t +032_00010.bin 4 t +036_00015.bin 4 +041_00008.bin 4 +041_00014.bin 4 +045_00010.bin 4 +052_00009.bin 4 +057_00005.bin 4 t +074_00008.bin 4 t +076_00014.bin 4 +076_00020.bin 4 +076_00025.bin 4 +078_00008.bin 4 +084_00006.bin 4 +096_00010.bin 4 +201_00014.bin 4 +202_00006.bin 4 +206_00009.bin 4 t +206_00012.bin 4 t +209_00003.bin 4 +213_00013.bin 4 +231_00010.bin 4 +249_00005.bin 4 +252_00008.bin 4 +322_00010.bin 4 +609_00015.bin 4 t +613_00003.bin 4 t +621_00008.bin 4 +623_00006.bin 4 +005_00001.bin 5 +025_00000.bin 5 +036_00007.bin 5 +038_00007.bin 5 t +041_00001.bin 5 +041_00017.bin 5 +052_00002.bin 5 +054_00004.bin 5 +076_00008.bin 5 +078_00002.bin 5 +084_00000.bin 5 +096_00006.bin 5 +209_00002.bin 5 +231_00001.bin 5 +237_00006.bin 5 +005_00016.bin 6 t +025_00008.bin 6 +032_00012.bin 6 +036_00030.bin 6 +038_00025.bin 6 +041_00026.bin 6 +041_00034.bin 6 +052_00010.bin 6 +057_00013.bin 6 +069_00013.bin 6 +071_00007.bin 6 +082_00015.bin 6 +096_00009.bin 6 +209_00008.bin 6 t +231_00025.bin 6 +005_00003.bin 7 +011_00003.bin 7 +073_00001.bin 7 +089_00006.bin 7 +225_00002.bin 7 +240_00002.bin 7 t +249_00001.bin 7 +251_00005.bin 7 +276_00004.bin 7 +005_00002.bin 8 +025_00002.bin 8 +047_00016.bin 8 +054_00000.bin 8 +074_00003.bin 8 +078_00001.bin 8 t +093_00004.bin 8 +217_00001.bin 8 +234_00001.bin 8 t +272_00002.bin 8 +030_00007.bin 9 +036_00012.bin 9 +052_00006.bin 9 +066_00002.bin 9 +069_00005.bin 9 +076_00003.bin 9 t +087_00000.bin 9 +093_00012.bin 9 +206_00002.bin 9 +217_00012.bin 9 +251_00000.bin 9 +272_00004.bin 9 +279_00006.bin 9 +609_00002.bin 9 t +621_00002.bin 9 +005_00000.bin 10 +014_00000.bin 10 t +016_00000.bin 10 +021_00005.bin 10 t +049_00000.bin 10 +089_00001.bin 10 +093_00001.bin 10 +096_00001.bin 10 +109_00002.bin 10 +227_00005.bin 10 +234_00000.bin 10 +237_00000.bin 10 +240_00001.bin 10 t +246_00000.bin 10 t +249_00000.bin 10 t +252_00000.bin 10 +265_00004.bin 10 +273_00000.bin 10 +014_00006.bin 13 t +015_00003.bin 13 +015_00007.bin 13 +016_00005.bin 13 t +030_00006.bin 13 +036_00003.bin 13 t +041_00000.bin 13 +061_00000.bin 13 +076_00001.bin 13 +076_00004.bin 13 +080_00003.bin 13 +098_00001.bin 13 +098_00003.bin 13 +098_00004.bin 13 +206_00001.bin 13 +263_00000.bin 13 t +263_00001.bin 13 t +272_00000.bin 13 +286_00000.bin 13 +286_00001.bin 13 +286_00002.bin 13 +286_00003.bin 13 +286_00004.bin 13 +286_00006.bin 13 +286_00008.bin 13 +286_00009.bin 13 +294_00001.bin 13 +294_00002.bin 13 +294_00003.bin 13 +294_00004.bin 13 +065_00014.bin 12 +207_00007.bin 12 +260_00009.bin 12 +700_00011.bin 12 +014_00012.bin 11 t +014_00015.bin 11 t +015_00013.bin 11 +016_00009.bin 11 +016_00010.bin 11 +016_00011.bin 11 +016_00013.bin 11 +021_00016.bin 11 +036_00027.bin 11 +036_00036.bin 11 +049_00015.bin 11 +089_00012.bin 11 +089_00014.bin 11 +096_00013.bin 11 t +227_00011.bin 11 +240_00011.bin 11 +246_00013.bin 11 +263_00019.bin 11 +263_00020.bin 11 +263_00022.bin 11 +272_00021.bin 11 +272_00024.bin 11 +272_00025.bin 11 +272_00031.bin 11 +272_00035.bin 11 +273_00006.bin 11 +scene0000_00_00032.bin 4 +scene0000_00_00034.bin 4 +scene0000_00_00042.bin 4 +scene0000_00_00043.bin 4 +scene0002_00_00012.bin 4 +scene0002_00_00013.bin 4 +scene0004_00_00008.bin 4 +scene0006_00_00007.bin 4 +scene0006_00_00009.bin 4 +scene0008_00_00005.bin 13 +scene0010_00_00009.bin 4 +scene0012_00_00004.bin 4 +scene0012_00_00005.bin 4 +scene0012_00_00006.bin 4 +scene0012_00_00008.bin 4 +scene0013_00_00002.bin 13 +scene0013_00_00003.bin 13 +scene0013_00_00004.bin 13 +scene0015_00_00016.bin 4 t +scene0017_00_00014.bin 4 +scene0021_00_00002.bin 13 +scene0021_00_00003.bin 13 +scene0021_00_00004.bin 13 +scene0021_00_00007.bin 13 +scene0024_00_00005.bin 13 +scene0024_00_00010.bin 4 t +scene0028_00_00006.bin 13 +scene0028_00_00007.bin 13 +scene0028_00_00009.bin 13 +scene0028_00_00011.bin 13 +scene0030_00_00008.bin 13 +scene0030_00_00020.bin 4 +scene0030_00_00023.bin 4 +scene0030_00_00027.bin 4 +scene0033_00_00002.bin 13 +scene0033_00_00003.bin 13 +scene0033_00_00006.bin 13 +scene0033_00_00007.bin 13 +scene0033_00_00008.bin 13 +scene0033_00_00009.bin 13 +scene0033_00_00011.bin 13 +scene0038_00_00004.bin 4 +scene0038_00_00005.bin 4 +scene0038_00_00006.bin 4 +scene0038_00_00009.bin 4 +scene0038_00_00013.bin 4 +scene0038_00_00016.bin 4 +scene0043_00_00005.bin 4 +scene0046_00_00008.bin 4 +scene0048_00_00004.bin 4 +scene0049_00_00007.bin 13 +scene0050_00_00008.bin 13 +scene0050_00_00012.bin 4 +scene0054_00_00032.bin 4 +scene0056_00_00013.bin 4 +scene0056_00_00015.bin 4 +scene0056_00_00016.bin 4 +scene0056_00_00017.bin 4 +scene0056_00_00021.bin 4 +scene0056_00_00022.bin 4 +scene0057_00_00009.bin 4 +scene0058_00_00007.bin 4 +scene0059_00_00008.bin 4 +scene0059_00_00011.bin 4 +scene0059_00_00013.bin 4 +scene0059_00_00014.bin 4 +scene0059_00_00016.bin 4 +scene0059_00_00019.bin 13 +scene0059_00_00020.bin 4 +scene0063_00_00011.bin 4 +scene0064_00_00002.bin 13 +scene0066_00_00007.bin 4 +scene0066_00_00008.bin 4 +scene0066_00_00009.bin 4 +scene0066_00_00012.bin 4 +scene0066_00_00013.bin 4 +scene0066_00_00014.bin 4 +scene0070_00_00007.bin 4 t +scene0075_00_00005.bin 4 +scene0076_00_00008.bin 4 +scene0076_00_00010.bin 4 +scene0079_00_00011.bin 4 +scene0079_00_00012.bin 4 +scene0079_00_00014.bin 4 +scene0082_00_00005.bin 4 +scene0085_00_00009.bin 4 +scene0087_00_00009.bin 9 +scene0088_00_00004.bin 4 +scene0088_00_00006.bin 4 +scene0088_00_00009.bin 4 +scene0088_00_00010.bin 4 +scene0088_00_00011.bin 4 +scene0088_00_00013.bin 4 +scene0088_00_00016.bin 4 +scene0088_00_00021.bin 4 +scene0089_00_00006.bin 4 +scene0095_00_00007.bin 4 +scene0098_00_00009.bin 4 +scene0098_00_00010.bin 4 +scene0101_00_00020.bin 4 +scene0103_00_00006.bin 4 +scene0103_00_00008.bin 4 +scene0103_00_00010.bin 4 +scene0106_00_00015.bin 4 t +scene0107_00_00005.bin 13 +scene0108_00_00008.bin 4 +scene0114_00_00010.bin 4 +scene0114_00_00011.bin 4 +scene0114_00_00012.bin 4 +scene0122_00_00005.bin 4 t +scene0122_00_00006.bin 4 t +scene0122_00_00007.bin 4 t +scene0126_00_00005.bin 4 +scene0126_00_00007.bin 4 +scene0126_00_00010.bin 4 +scene0129_00_00005.bin 13 +scene0129_00_00006.bin 13 +scene0131_00_00010.bin 4 +scene0131_00_00012.bin 4 +scene0132_00_00007.bin 4 t +scene0132_00_00010.bin 4 t +scene0132_00_00013.bin 13 +scene0132_00_00014.bin 4 t +scene0132_00_00015.bin 4 t +scene0133_00_00002.bin 4 +scene0133_00_00003.bin 4 +scene0133_00_00004.bin 4 +scene0133_00_00005.bin 4 +scene0134_00_00005.bin 4 +scene0134_00_00007.bin 4 +scene0134_00_00008.bin 4 +scene0138_00_00014.bin 4 t +scene0138_00_00016.bin 4 t +scene0138_00_00018.bin 4 t +scene0138_00_00024.bin 4 t +scene0140_00_00011.bin 4 t +scene0140_00_00014.bin 4 t +scene0140_00_00017.bin 4 t +scene0140_00_00018.bin 4 t +scene0140_00_00019.bin 4 t +scene0140_00_00020.bin 4 t +scene0140_00_00021.bin 4 t +scene0140_00_00022.bin 4 t +scene0140_00_00023.bin 4 t +scene0140_00_00024.bin 4 t +scene0140_00_00025.bin 4 t +scene0140_00_00026.bin 4 t +scene0140_00_00028.bin 4 t +scene0140_00_00029.bin 4 t +scene0140_00_00030.bin 4 t +scene0140_00_00031.bin 4 t +scene0140_00_00032.bin 4 t +scene0140_00_00034.bin 4 t +scene0141_00_00010.bin 4 +scene0141_00_00011.bin 4 +scene0141_00_00013.bin 4 +scene0143_00_00004.bin 13 +scene0144_00_00011.bin 4 +scene0144_00_00012.bin 4 +scene0145_00_00007.bin 4 t +scene0149_00_00015.bin 4 +scene0150_00_00004.bin 4 +scene0152_00_00011.bin 4 +scene0152_00_00012.bin 4 +scene0152_00_00015.bin 4 +scene0152_00_00017.bin 4 +scene0155_00_00009.bin 4 +scene0155_00_00010.bin 4 +scene0155_00_00011.bin 4 +scene0155_00_00012.bin 4 +scene0156_00_00010.bin 4 +scene0156_00_00011.bin 4 +scene0159_00_00006.bin 4 +scene0160_00_00006.bin 4 +scene0161_00_00004.bin 4 +scene0163_00_00004.bin 4 t +scene0163_00_00005.bin 4 t +scene0163_00_00007.bin 4 t +scene0163_00_00008.bin 4 t +scene0163_00_00010.bin 4 t +scene0165_00_00003.bin 13 +scene0165_00_00004.bin 13 +scene0168_00_00015.bin 4 +scene0171_00_00005.bin 4 +scene0171_00_00006.bin 4 +scene0171_00_00007.bin 4 +scene0171_00_00008.bin 4 +scene0171_00_00009.bin 4 +scene0171_00_00010.bin 4 +scene0177_00_00009.bin 4 t +scene0177_00_00010.bin 4 t +scene0178_00_00011.bin 4 +scene0001_00_00012.bin 9 +scene0001_00_00016.bin 9 +scene0001_00_00019.bin 9 +scene0002_00_00024.bin 9 +scene0013_00_00005.bin 9 +scene0022_00_00003.bin 9 +scene0022_00_00005.bin 9 +scene0022_00_00006.bin 9 +scene0024_00_00004.bin 9 t +scene0035_00_00008.bin 9 +scene0038_00_00003.bin 9 +scene0050_00_00007.bin 5 +scene0053_00_00005.bin 9 +scene0054_00_00046.bin 9 t +scene0064_00_00003.bin 9 +scene0082_00_00001.bin 9 +scene0082_00_00002.bin 9 +scene0091_00_00004.bin 9 +scene0101_00_00016.bin 9 t +scene0102_00_00004.bin 9 t +scene0106_00_00009.bin 9 +scene0106_00_00012.bin 9 +scene0111_00_00008.bin 9 +scene0127_00_00017.bin 9 +scene0129_00_00007.bin 9 +scene0132_00_00009.bin 4 t +scene0136_00_00010.bin 3 +scene0137_00_00007.bin 9 +scene0138_00_00006.bin 9 +scene0140_00_00004.bin 9 +scene0151_00_00007.bin 9 t +scene0152_00_00010.bin 9 +scene0152_00_00014.bin 9 +scene0155_00_00003.bin 9 +scene0155_00_00004.bin 9 +scene0155_00_00008.bin 9 +scene0155_00_00013.bin 9 +scene0155_00_00015.bin 9 +scene0157_00_00007.bin 9 t +scene0162_00_00006.bin 9 +scene0163_00_00002.bin 9 +scene0178_00_00007.bin 9 +scene0181_00_00018.bin 9 +scene0181_00_00025.bin 9 +scene0187_00_00004.bin 9 +scene0187_00_00005.bin 9 +scene0187_00_00008.bin 9 +scene0199_00_00004.bin 9 +scene0203_00_00011.bin 9 t +scene0203_00_00014.bin 9 t +scene0205_00_00005.bin 9 +scene0209_00_00010.bin 9 t +scene0212_00_00003.bin 9 +scene0213_00_00010.bin 9 +scene0213_00_00015.bin 9 +scene0226_00_00007.bin 9 +scene0226_00_00011.bin 9 +scene0230_00_00008.bin 9 +scene0235_00_00013.bin 9 t +scene0235_00_00021.bin 9 t +scene0239_00_00007.bin 9 +scene0246_00_00008.bin 9 +scene0246_00_00018.bin 9 +scene0251_00_00005.bin 9 +scene0251_00_00006.bin 9 +scene0259_00_00008.bin 9 t +scene0266_00_00004.bin 9 +scene0266_00_00005.bin 9 +scene0267_00_00002.bin 9 t +scene0270_00_00010.bin 9 +scene0272_00_00009.bin 9 +scene0276_00_00009.bin 9 +scene0276_00_00015.bin 9 +scene0279_00_00012.bin 9 +scene0279_00_00021.bin 9 +scene0281_00_00006.bin 9 t +scene0288_00_00007.bin 9 +scene0295_00_00006.bin 9 +scene0295_00_00007.bin 9 +scene0297_00_00006.bin 3 +scene0297_00_00008.bin 9 +scene0300_00_00002.bin 9 +scene0300_00_00003.bin 9 +scene0301_00_00006.bin 9 +scene0307_00_00009.bin 8 +scene0309_00_00004.bin 5 +scene0315_00_00013.bin 9 +scene0315_00_00025.bin 9 +scene0317_00_00010.bin 9 t +scene0322_00_00002.bin 9 +scene0324_00_00003.bin 9 t +scene0336_00_00004.bin 5 +scene0340_00_00011.bin 9 +scene0342_00_00005.bin 9 +scene0355_00_00007.bin 9 +scene0355_00_00008.bin 9 +scene0357_00_00013.bin 9 +scene0358_00_00003.bin 9 t +scene0358_00_00020.bin 9 t +scene0362_00_00012.bin 9 +scene0363_00_00013.bin 9 +scene0370_00_00017.bin 9 +scene0385_00_00006.bin 3 +scene0386_00_00008.bin 9 +scene0387_00_00009.bin 9 +scene0389_00_00008.bin 9 t +scene0390_00_00002.bin 9 +scene0404_00_00006.bin 9 +scene0407_00_00006.bin 9 t +scene0418_00_00010.bin 3 +scene0424_00_00005.bin 5 +scene0430_00_00002.bin 9 +scene0432_00_00003.bin 9 t +scene0451_00_00007.bin 9 +scene0455_00_00005.bin 9 t +scene0461_00_00005.bin 9 +scene0465_00_00006.bin 9 +scene0472_00_00009.bin 9 +scene0476_00_00008.bin 9 +scene0477_00_00020.bin 9 +scene0481_00_00005.bin 9 +scene0481_00_00006.bin 9 +scene0481_00_00007.bin 9 +scene0481_00_00011.bin 9 +scene0487_00_00017.bin 9 +scene0487_00_00019.bin 9 +scene0495_00_00001.bin 9 +scene0495_00_00002.bin 9 +scene0499_00_00006.bin 9 +scene0499_00_00016.bin 9 +scene0500_00_00008.bin 9 +scene0507_00_00005.bin 9 +scene0514_00_00007.bin 9 +scene0518_00_00004.bin 9 t +scene0529_00_00016.bin 9 t +scene0537_00_00004.bin 9 +scene0542_00_00006.bin 9 t +scene0547_00_00013.bin 9 +scene0549_00_00009.bin 9 +scene0549_00_00010.bin 9 +scene0549_00_00012.bin 9 +scene0549_00_00013.bin 9 +scene0558_00_00011.bin 9 +scene0572_00_00004.bin 9 +scene0574_00_00005.bin 9 +scene0588_00_00016.bin 9 +scene0588_00_00017.bin 9 +scene0588_00_00018.bin 9 +scene0588_00_00021.bin 9 +scene0598_00_00003.bin 9 +scene0599_00_00003.bin 9 +scene0601_00_00010.bin 9 +scene0603_00_00007.bin 9 +scene0603_00_00009.bin 5 t +scene0603_00_00016.bin 9 +scene0617_00_00007.bin 9 +scene0622_00_00001.bin 9 +scene0626_00_00003.bin 9 +scene0627_00_00002.bin 9 t +scene0638_00_00001.bin 9 +scene0640_00_00006.bin 9 +scene0641_00_00008.bin 9 +scene0646_00_00009.bin 9 +scene0646_00_00017.bin 9 +scene0000_00_00019.bin 5 t +scene0006_00_00005.bin 5 +scene0032_00_00005.bin 5 t +scene0035_00_00005.bin 5 +scene0040_00_00003.bin 5 +scene0043_00_00003.bin 5 +scene0050_00_00022.bin 5 +scene0055_00_00002.bin 5 +scene0078_00_00002.bin 5 t +scene0089_00_00004.bin 5 +scene0091_00_00005.bin 5 +scene0094_00_00006.bin 5 +scene0101_00_00006.bin 5 +scene0108_00_00003.bin 5 +scene0108_00_00005.bin 5 +scene0110_00_00006.bin 5 t +scene0123_00_00002.bin 9 +scene0123_00_00003.bin 9 +scene0123_00_00004.bin 9 +scene0123_00_00005.bin 9 +scene0126_00_00004.bin 5 +scene0127_00_00008.bin 5 +scene0127_00_00009.bin 5 +scene0155_00_00002.bin 5 +scene0166_00_00005.bin 5 +scene0174_00_00006.bin 5 +scene0193_00_00003.bin 5 t +scene0207_00_00005.bin 5 +scene0211_00_00004.bin 5 +scene0217_00_00006.bin 5 +scene0217_00_00008.bin 5 +scene0222_00_00003.bin 5 +scene0222_00_00004.bin 5 +scene0231_00_00015.bin 5 +scene0233_00_00005.bin 5 +scene0266_00_00002.bin 5 +scene0266_00_00006.bin 5 +scene0266_00_00009.bin 5 +scene0266_00_00018.bin 9 +scene0272_00_00007.bin 5 +scene0287_00_00003.bin 5 +scene0293_00_00000.bin 5 +scene0320_00_00004.bin 5 +scene0333_00_00002.bin 5 +scene0336_00_00006.bin 5 +scene0341_00_00003.bin 5 +scene0353_00_00007.bin 5 +scene0370_00_00003.bin 5 +scene0376_00_00004.bin 5 +scene0378_00_00005.bin 5 t +scene0378_00_00007.bin 5 t +scene0378_00_00010.bin 5 t +scene0383_00_00006.bin 5 +scene0398_00_00004.bin 5 +scene0398_00_00007.bin 5 +scene0400_00_00005.bin 5 +scene0425_00_00004.bin 5 +scene0440_00_00007.bin 5 +scene0440_00_00009.bin 5 +scene0443_00_00005.bin 5 +scene0443_00_00009.bin 5 +scene0468_00_00006.bin 5 +scene0468_00_00008.bin 5 +scene0474_00_00005.bin 5 +scene0489_00_00003.bin 5 +scene0505_00_00002.bin 5 +scene0506_00_00004.bin 5 +scene0515_00_00011.bin 5 +scene0517_00_00009.bin 5 t +scene0517_00_00011.bin 5 t +scene0547_00_00008.bin 5 t +scene0554_00_00010.bin 5 +scene0620_00_00004.bin 5 t +scene0643_00_00006.bin 5 t +scene0643_00_00007.bin 5 t +scene0643_00_00008.bin 5 t +scene0000_00_00041.bin 0 +scene0043_00_00007.bin 0 +scene0050_00_00017.bin 0 t +scene0054_00_00041.bin 0 +scene0054_00_00049.bin 0 +scene0108_00_00016.bin 0 +scene0130_00_00006.bin 0 +scene0141_00_00017.bin 0 t +scene0174_00_00008.bin 0 +scene0187_00_00013.bin 0 +scene0198_00_00011.bin 0 +scene0217_00_00016.bin 0 +scene0239_00_00008.bin 0 +scene0242_00_00007.bin 0 t +scene0358_00_00018.bin 0 t +scene0372_00_00013.bin 0 +scene0388_00_00008.bin 0 +scene0425_00_00016.bin 0 +scene0426_00_00022.bin 0 +scene0430_00_00022.bin 0 +scene0433_00_00013.bin 0 +scene0456_00_00010.bin 0 t +scene0473_00_00008.bin 0 t +scene0493_00_00009.bin 0 t +scene0508_00_00016.bin 0 +scene0517_00_00023.bin 0 +scene0517_00_00027.bin 0 +scene0517_00_00030.bin 0 +scene0558_00_00009.bin 0 t +scene0580_00_00010.bin 0 +scene0580_00_00011.bin 0 +scene0615_00_00021.bin 0 +scene0627_00_00037.bin 0 +scene0000_00_00012.bin 3 +scene0000_00_00014.bin 3 +scene0000_00_00022.bin 3 +scene0000_00_00023.bin 3 +scene0000_00_00028.bin 3 +scene0000_00_00033.bin 3 +scene0002_00_00004.bin 3 t +scene0002_00_00015.bin 8 +scene0002_00_00018.bin 8 +scene0003_00_00003.bin 3 t +scene0003_00_00004.bin 3 t +scene0003_00_00005.bin 3 t +scene0003_00_00007.bin 3 t +scene0003_00_00008.bin 3 t +scene0003_00_00011.bin 3 t +scene0007_00_00001.bin 3 +scene0010_00_00008.bin 5 +scene0014_00_00005.bin 12 +scene0018_00_00006.bin 3 +scene0024_00_00009.bin 3 +scene0026_00_00009.bin 12 +scene0034_00_00006.bin 3 +scene0035_00_00006.bin 3 +scene0040_00_00014.bin 3 t +scene0046_00_00004.bin 3 t +scene0047_00_00004.bin 3 +scene0047_00_00009.bin 3 +scene0049_00_00006.bin 3 +scene0051_00_00006.bin 3 +scene0054_00_00030.bin 3 +scene0063_00_00006.bin 3 +scene0063_00_00008.bin 3 +scene0063_00_00017.bin 3 +scene0068_00_00004.bin 3 t +scene0072_00_00002.bin 3 t +scene0073_00_00005.bin 3 +scene0076_00_00005.bin 3 +scene0080_00_00003.bin 3 t +scene0090_00_00004.bin 14 t +scene0090_00_00005.bin 14 t +scene0090_00_00006.bin 14 t +scene0091_00_00008.bin 3 +scene0092_00_00005.bin 3 +scene0092_00_00008.bin 1 +scene0094_00_00003.bin 5 +scene0095_00_00004.bin 3 +scene0097_00_00004.bin 3 +scene0097_00_00005.bin 3 +scene0097_00_00006.bin 3 +scene0097_00_00014.bin 3 +scene0100_00_00002.bin 3 +scene0101_00_00012.bin 3 +scene0104_00_00006.bin 3 t +scene0108_00_00004.bin 8 +scene0108_00_00007.bin 8 +scene0109_00_00003.bin 3 +scene0110_00_00003.bin 3 +scene0114_00_00002.bin 3 +scene0114_00_00003.bin 3 +scene0114_00_00006.bin 3 +scene0114_00_00014.bin 3 +scene0114_00_00015.bin 3 +scene0114_00_00017.bin 3 +scene0114_00_00021.bin 3 +scene0117_00_00002.bin 3 t +scene0117_00_00004.bin 3 t +scene0117_00_00005.bin 3 t +scene0117_00_00010.bin 3 t +scene0121_00_00005.bin 3 +scene0124_00_00005.bin 14 +scene0124_00_00006.bin 3 +scene0126_00_00008.bin 8 +scene0127_00_00004.bin 3 +scene0127_00_00006.bin 3 +scene0131_00_00014.bin 3 t +scene0147_00_00004.bin 3 +scene0147_00_00007.bin 3 +scene0147_00_00009.bin 3 +scene0147_00_00010.bin 3 +scene0147_00_00012.bin 3 +scene0147_00_00016.bin 3 +scene0149_00_00005.bin 3 +scene0149_00_00009.bin 3 +scene0149_00_00011.bin 3 +scene0149_00_00017.bin 3 +scene0153_00_00005.bin 3 t +scene0157_00_00004.bin 3 +scene0158_00_00002.bin 3 +scene0158_00_00003.bin 3 +scene0158_00_00006.bin 3 +scene0158_00_00007.bin 3 +scene0162_00_00007.bin 8 +scene0164_00_00003.bin 3 +scene0164_00_00008.bin 3 +scene0164_00_00010.bin 3 +scene0164_00_00012.bin 3 +scene0164_00_00017.bin 3 +scene0172_00_00003.bin 3 +scene0175_00_00006.bin 3 +scene0181_00_00004.bin 3 +scene0184_00_00003.bin 3 +scene0186_00_00004.bin 3 +scene0186_00_00012.bin 3 +scene0188_00_00007.bin 3 t +scene0195_00_00006.bin 3 +scene0200_00_00003.bin 3 t +scene0201_00_00007.bin 3 +scene0204_00_00003.bin 3 +scene0205_00_00002.bin 3 +scene0205_00_00008.bin 3 +scene0207_00_00008.bin 8 t +scene0210_00_00003.bin 3 +scene0211_00_00005.bin 3 +scene0211_00_00006.bin 3 +scene0214_00_00004.bin 3 +scene0214_00_00006.bin 8 +scene0214_00_00011.bin 3 +scene0215_00_00004.bin 3 +scene0217_00_00004.bin 3 +scene0221_00_00007.bin 3 +scene0221_00_00009.bin 3 +scene0223_00_00002.bin 3 +scene0223_00_00009.bin 5 +scene0224_00_00010.bin 3 +scene0225_00_00006.bin 3 +scene0225_00_00007.bin 3 +scene0225_00_00008.bin 3 +scene0231_00_00013.bin 3 t +scene0232_00_00006.bin 3 +scene0232_00_00009.bin 3 +scene0233_00_00003.bin 3 +scene0233_00_00010.bin 3 +scene0233_00_00011.bin 3 +scene0233_00_00012.bin 3 +scene0236_00_00006.bin 3 +scene0240_00_00003.bin 3 +scene0240_00_00004.bin 3 +scene0240_00_00013.bin 3 +scene0246_00_00006.bin 3 +scene0247_00_00006.bin 3 +scene0247_00_00008.bin 3 +scene0247_00_00014.bin 3 +scene0247_00_00019.bin 3 +scene0250_00_00006.bin 3 +scene0253_00_00002.bin 3 +scene0255_00_00006.bin 3 t +scene0255_00_00008.bin 3 t +scene0259_00_00004.bin 8 +scene0270_00_00011.bin 3 +scene0271_00_00012.bin 3 +scene0272_00_00008.bin 3 t +scene0276_00_00005.bin 3 +scene0276_00_00006.bin 3 +scene0276_00_00013.bin 3 +scene0278_00_00003.bin 3 +scene0278_00_00004.bin 3 +scene0279_00_00010.bin 3 +scene0280_00_00010.bin 3 +scene0282_00_00006.bin 3 t +scene0286_00_00009.bin 3 t +scene0295_00_00004.bin 3 +scene0295_00_00010.bin 3 +scene0296_00_00010.bin 3 +scene0303_00_00006.bin 3 +scene0304_00_00005.bin 3 +scene0305_00_00010.bin 3 +scene0309_00_00008.bin 3 +scene0310_00_00002.bin 3 t +scene0310_00_00003.bin 3 t +scene0311_00_00001.bin 3 +scene0327_00_00007.bin 3 t +scene0327_00_00009.bin 3 t +scene0335_00_00002.bin 3 t +scene0335_00_00007.bin 3 t +scene0335_00_00011.bin 3 t +scene0335_00_00012.bin 3 t +scene0335_00_00023.bin 3 t +scene0336_00_00008.bin 3 +scene0337_00_00001.bin 3 +scene0338_00_00002.bin 3 +scene0338_00_00005.bin 3 +scene0345_00_00006.bin 3 +scene0348_00_00003.bin 3 +scene0348_00_00004.bin 3 +scene0348_00_00005.bin 3 +scene0350_00_00007.bin 8 +scene0352_00_00009.bin 3 +scene0353_00_00018.bin 3 +scene0356_00_00005.bin 3 +scene0357_00_00002.bin 3 +scene0357_00_00015.bin 3 +scene0361_00_00006.bin 8 +scene0364_00_00004.bin 3 +scene0364_00_00007.bin 3 +scene0364_00_00010.bin 3 +scene0366_00_00002.bin 3 +scene0369_00_00007.bin 3 t +scene0369_00_00008.bin 3 t +scene0376_00_00005.bin 3 t +scene0378_00_00008.bin 8 +scene0378_00_00019.bin 3 +scene0379_00_00004.bin 8 +scene0379_00_00014.bin 3 +scene0379_00_00028.bin 3 +scene0390_00_00005.bin 3 +scene0392_00_00011.bin 3 +scene0392_00_00013.bin 3 +scene0392_00_00014.bin 3 +scene0394_00_00015.bin 3 +scene0395_00_00008.bin 3 +scene0398_00_00013.bin 3 +scene0400_00_00007.bin 3 +scene0409_00_00003.bin 3 +scene0414_00_00006.bin 3 t +scene0419_00_00006.bin 3 +scene0425_00_00002.bin 3 +scene0426_00_00005.bin 3 t +scene0431_00_00003.bin 3 +scene0431_00_00004.bin 3 +scene0431_00_00007.bin 3 +scene0431_00_00011.bin 3 +scene0431_00_00012.bin 3 +scene0431_00_00014.bin 3 +scene0438_00_00007.bin 3 t +scene0439_00_00002.bin 3 +scene0439_00_00003.bin 3 +scene0439_00_00004.bin 3 +scene0439_00_00011.bin 3 +scene0439_00_00012.bin 3 +scene0440_00_00002.bin 3 +scene0440_00_00013.bin 3 +scene0444_00_00000.bin 8 +scene0447_00_00003.bin 3 t +scene0447_00_00011.bin 12 +scene0449_00_00004.bin 8 +scene0449_00_00006.bin 12 +scene0465_00_00011.bin 3 +scene0467_00_00011.bin 3 t +scene0472_00_00004.bin 3 +scene0472_00_00010.bin 12 +scene0472_00_00018.bin 3 +scene0476_00_00004.bin 3 +scene0477_00_00007.bin 3 +scene0477_00_00008.bin 3 +scene0477_00_00021.bin 3 +scene0478_00_00002.bin 3 +scene0479_00_00002.bin 3 +scene0479_00_00003.bin 3 +scene0479_00_00012.bin 3 +scene0482_00_00002.bin 3 +scene0487_00_00022.bin 3 +scene0488_00_00003.bin 3 +scene0488_00_00004.bin 3 +scene0488_00_00005.bin 3 +scene0488_00_00008.bin 3 +scene0488_00_00011.bin 3 +scene0491_00_00002.bin 3 +scene0492_00_00005.bin 12 t +scene0498_00_00010.bin 3 +scene0504_00_00021.bin 3 +scene0505_00_00014.bin 3 +scene0505_00_00018.bin 3 +scene0505_00_00021.bin 3 +scene0506_00_00005.bin 3 t +scene0506_00_00009.bin 3 t +scene0510_00_00003.bin 12 +scene0511_00_00005.bin 3 t +scene0515_00_00010.bin 3 +scene0517_00_00001.bin 3 +scene0517_00_00013.bin 3 +scene0517_00_00014.bin 3 +scene0517_00_00022.bin 3 +scene0519_00_00003.bin 12 t +scene0521_00_00005.bin 3 +scene0521_00_00013.bin 3 +scene0525_00_00005.bin 3 +scene0529_00_00003.bin 3 +scene0529_00_00009.bin 3 +scene0529_00_00013.bin 12 +scene0532_00_00014.bin 3 t +scene0540_00_00011.bin 3 +scene0541_00_00007.bin 3 +scene0541_00_00008.bin 3 +scene0542_00_00003.bin 3 +scene0546_00_00010.bin 3 +scene0547_00_00003.bin 3 +scene0548_00_00009.bin 3 +scene0556_00_00005.bin 3 +scene0570_00_00005.bin 12 +scene0573_00_00006.bin 3 +scene0577_00_00006.bin 3 +scene0577_00_00007.bin 3 +scene0577_00_00008.bin 3 +scene0580_00_00007.bin 3 +scene0584_00_00005.bin 3 +scene0589_00_00003.bin 3 t +scene0589_00_00005.bin 3 t +scene0590_00_00009.bin 3 +scene0590_00_00016.bin 3 +scene0591_00_00004.bin 3 t +scene0603_00_00008.bin 8 t +scene0607_00_00003.bin 3 +scene0614_00_00009.bin 3 +scene0615_00_00008.bin 3 +scene0620_00_00005.bin 3 +scene0620_00_00006.bin 3 +scene0623_00_00011.bin 3 +scene0629_00_00004.bin 3 +scene0631_00_00002.bin 3 +scene0632_00_00003.bin 3 +scene0633_00_00007.bin 3 +scene0642_00_00008.bin 3 +scene0642_00_00020.bin 3 +scene0646_00_00019.bin 8 +scene0005_00_00008.bin 8 t +scene0012_00_00003.bin 8 t +scene0020_00_00002.bin 8 t +scene0020_00_00008.bin 8 t +scene0025_00_00007.bin 8 +scene0028_00_00004.bin 8 t +scene0028_00_00008.bin 8 t +scene0028_00_00013.bin 8 t +scene0028_00_00014.bin 8 t +scene0028_00_00019.bin 8 t +scene0030_00_00001.bin 8 +scene0030_00_00014.bin 8 +scene0030_00_00022.bin 8 +scene0032_00_00003.bin 8 +scene0037_00_00002.bin 8 +scene0037_00_00003.bin 8 +scene0040_00_00002.bin 8 +scene0040_00_00011.bin 8 +scene0049_00_00005.bin 8 +scene0050_00_00014.bin 8 +scene0051_00_00005.bin 8 t +scene0054_00_00003.bin 8 t +scene0054_00_00005.bin 8 t +scene0054_00_00011.bin 8 t +scene0054_00_00014.bin 8 t +scene0054_00_00039.bin 8 t +scene0072_00_00013.bin 8 +scene0077_00_00001.bin 8 t +scene0077_00_00011.bin 8 t +scene0079_00_00003.bin 8 +scene0079_00_00004.bin 8 +scene0079_00_00005.bin 8 +scene0079_00_00006.bin 8 +scene0079_00_00007.bin 8 +scene0079_00_00010.bin 8 +scene0092_00_00004.bin 8 t +scene0094_00_00005.bin 8 +scene0098_00_00004.bin 8 +scene0098_00_00011.bin 8 +scene0108_00_00012.bin 8 +scene0109_00_00006.bin 8 t +scene0131_00_00008.bin 8 t +scene0144_00_00013.bin 8 +scene0154_00_00004.bin 8 +scene0168_00_00020.bin 8 +scene0168_00_00021.bin 8 +scene0177_00_00002.bin 8 +scene0177_00_00004.bin 8 +scene0177_00_00007.bin 8 +scene0181_00_00013.bin 8 +scene0181_00_00014.bin 8 +scene0186_00_00005.bin 8 +scene0186_00_00009.bin 8 +scene0186_00_00015.bin 8 +scene0190_00_00002.bin 8 +scene0190_00_00004.bin 8 +scene0191_00_00001.bin 8 +scene0194_00_00005.bin 8 t +scene0197_00_00002.bin 8 +scene0203_00_00003.bin 8 +scene0203_00_00009.bin 8 +scene0207_00_00019.bin 8 t +scene0208_00_00002.bin 8 +scene0208_00_00005.bin 8 +scene0208_00_00006.bin 8 +scene0208_00_00007.bin 8 +scene0208_00_00008.bin 8 +scene0208_00_00009.bin 8 +scene0211_00_00007.bin 8 +scene0217_00_00005.bin 8 +scene0217_00_00009.bin 8 +scene0218_00_00002.bin 8 +scene0223_00_00008.bin 8 +scene0223_00_00010.bin 8 +scene0224_00_00005.bin 8 +scene0231_00_00006.bin 8 +scene0233_00_00007.bin 8 +scene0233_00_00008.bin 8 +scene0236_00_00005.bin 8 +scene0236_00_00010.bin 8 +scene0240_00_00006.bin 8 +scene0241_00_00005.bin 8 +scene0246_00_00011.bin 8 +scene0253_00_00009.bin 8 +scene0259_00_00013.bin 8 +scene0262_00_00003.bin 8 +scene0272_00_00002.bin 8 +scene0272_00_00006.bin 8 +scene0286_00_00019.bin 3 t +scene0293_00_00003.bin 8 +scene0295_00_00005.bin 8 +scene0301_00_00017.bin 8 +scene0303_00_00003.bin 8 +scene0305_00_00006.bin 8 t +scene0305_00_00008.bin 8 t +scene0305_00_00009.bin 8 t +scene0305_00_00013.bin 8 t +scene0309_00_00007.bin 8 t +scene0325_00_00003.bin 8 +scene0325_00_00004.bin 8 +scene0332_00_00008.bin 8 +scene0349_00_00004.bin 8 +scene0353_00_00006.bin 8 +scene0353_00_00008.bin 8 +scene0361_00_00002.bin 8 +scene0361_00_00004.bin 8 +scene0377_00_00002.bin 8 +scene0377_00_00004.bin 8 +scene0378_00_00003.bin 8 +scene0378_00_00004.bin 8 +scene0379_00_00006.bin 8 +scene0379_00_00009.bin 8 +scene0382_00_00005.bin 8 +scene0383_00_00003.bin 8 t +scene0392_00_00009.bin 8 t +scene0393_00_00003.bin 8 +scene0395_00_00013.bin 8 +scene0398_00_00012.bin 8 +scene0400_00_00003.bin 8 +scene0404_00_00001.bin 8 +scene0404_00_00005.bin 8 +scene0407_00_00004.bin 8 +scene0408_00_00004.bin 8 +scene0422_00_00009.bin 1 +scene0424_00_00003.bin 8 +scene0425_00_00006.bin 8 +scene0425_00_00022.bin 8 +scene0440_00_00005.bin 8 +scene0440_00_00008.bin 8 +scene0443_00_00008.bin 8 t +scene0443_00_00010.bin 8 t +scene0444_00_00002.bin 8 +scene0451_00_00009.bin 3 +scene0464_00_00004.bin 8 +scene0465_00_00018.bin 8 +scene0467_00_00003.bin 8 +scene0467_00_00006.bin 8 +scene0467_00_00010.bin 8 +scene0474_00_00006.bin 8 t +scene0474_00_00011.bin 8 t +scene0481_00_00002.bin 8 +scene0504_00_00003.bin 8 +scene0505_00_00004.bin 8 t +scene0506_00_00006.bin 8 t +scene0506_00_00007.bin 8 t +scene0514_00_00009.bin 8 +scene0515_00_00012.bin 8 +scene0518_00_00001.bin 8 +scene0521_00_00004.bin 8 +scene0534_00_00003.bin 8 t +scene0534_00_00004.bin 8 t +scene0542_00_00008.bin 8 t +scene0545_00_00003.bin 8 +scene0547_00_00005.bin 8 +scene0554_00_00007.bin 8 +scene0558_00_00002.bin 8 +scene0565_00_00006.bin 8 t +scene0565_00_00008.bin 8 t +scene0576_00_00008.bin 8 +scene0577_00_00003.bin 8 +scene0580_00_00006.bin 8 +scene0582_00_00004.bin 8 +scene0582_00_00014.bin 8 +scene0585_00_00002.bin 8 +scene0585_00_00005.bin 8 +scene0585_00_00007.bin 8 +scene0589_00_00002.bin 8 +scene0591_00_00005.bin 8 t +scene0591_00_00010.bin 8 t +scene0593_00_00003.bin 8 +scene0598_00_00002.bin 8 t +scene0603_00_00002.bin 8 t +scene0603_00_00012.bin 8 t +scene0603_00_00019.bin 8 t +scene0613_00_00004.bin 8 +scene0613_00_00006.bin 8 +scene0614_00_00002.bin 8 +scene0614_00_00003.bin 8 +scene0614_00_00018.bin 3 +scene0614_00_00020.bin 8 +scene0619_00_00003.bin 8 +scene0630_00_00002.bin 8 +scene0632_00_00004.bin 8 +scene0635_00_00003.bin 8 +scene0643_00_00009.bin 8 t +scene0643_00_00010.bin 8 t +scene0644_00_00003.bin 8 +scene0645_00_00025.bin 8 +scene0646_00_00013.bin 8 +scene0646_00_00018.bin 8 +scene0646_00_00025.bin 8 +scene0010_00_00020.bin 6 t +scene0010_00_00024.bin 6 t +scene0010_00_00031.bin 6 t +scene0017_00_00016.bin 6 t +scene0025_00_00015.bin 6 +scene0025_00_00016.bin 6 +scene0040_00_00016.bin 6 t +scene0040_00_00017.bin 6 t +scene0056_00_00014.bin 6 +scene0056_00_00020.bin 6 +scene0070_00_00013.bin 6 +scene0085_00_00011.bin 6 +scene0095_00_00010.bin 6 +scene0095_00_00011.bin 6 +scene0095_00_00012.bin 6 +scene0095_00_00015.bin 6 +scene0131_00_00022.bin 6 +scene0137_00_00012.bin 6 t +scene0138_00_00017.bin 6 t +scene0138_00_00021.bin 6 t +scene0147_00_00018.bin 6 +scene0166_00_00010.bin 6 +scene0168_00_00022.bin 6 +scene0168_00_00025.bin 6 +scene0177_00_00008.bin 6 +scene0177_00_00015.bin 6 +scene0184_00_00005.bin 6 +scene0206_00_00020.bin 6 +scene0209_00_00015.bin 6 t +scene0211_00_00012.bin 6 +scene0238_00_00010.bin 6 +scene0263_00_00016.bin 6 +scene0264_00_00007.bin 6 +scene0279_00_00020.bin 6 +scene0289_00_00012.bin 6 t +scene0296_00_00025.bin 6 +scene0305_00_00016.bin 6 +scene0305_00_00018.bin 6 +scene0305_00_00021.bin 6 +scene0314_00_00008.bin 6 +scene0320_00_00016.bin 6 +scene0362_00_00011.bin 6 +scene0378_00_00018.bin 6 +scene0385_00_00012.bin 6 +scene0389_00_00011.bin 6 +scene0395_00_00011.bin 6 t +scene0416_00_00017.bin 6 +scene0424_00_00015.bin 6 +scene0424_00_00018.bin 6 +scene0424_00_00019.bin 6 +scene0426_00_00010.bin 6 +scene0480_00_00006.bin 6 +scene0489_00_00011.bin 6 +scene0489_00_00012.bin 6 +scene0502_00_00002.bin 6 t +scene0568_00_00005.bin 6 +scene0569_00_00015.bin 6 +scene0582_00_00007.bin 6 +scene0582_00_00012.bin 6 +scene0582_00_00013.bin 6 +scene0590_00_00017.bin 6 t +scene0598_00_00010.bin 6 +scene0598_00_00011.bin 6 +scene0599_00_00007.bin 6 t +scene0603_00_00013.bin 6 +scene0604_00_00009.bin 6 t +scene0608_00_00008.bin 6 +scene0614_00_00021.bin 6 +scene0617_00_00004.bin 6 +scene0623_00_00008.bin 6 +scene0642_00_00018.bin 6 t +scene0643_00_00022.bin 6 +scene0643_00_00024.bin 6 +scene0646_00_00031.bin 6 +scene0000_00_00024.bin 7 +scene0002_00_00006.bin 7 +scene0002_00_00009.bin 7 +scene0002_00_00010.bin 7 +scene0010_00_00007.bin 7 t +scene0017_00_00006.bin 7 t +scene0019_00_00008.bin 7 +scene0025_00_00004.bin 7 +scene0026_00_00008.bin 7 +scene0026_00_00010.bin 7 +scene0029_00_00003.bin 7 +scene0030_00_00009.bin 7 +scene0032_00_00006.bin 7 +scene0040_00_00008.bin 7 t +scene0042_00_00005.bin 7 t +scene0044_00_00003.bin 7 +scene0047_00_00007.bin 7 t +scene0050_00_00011.bin 7 +scene0050_00_00013.bin 7 +scene0051_00_00008.bin 7 t +scene0051_00_00010.bin 7 t +scene0054_00_00007.bin 7 +scene0054_00_00010.bin 7 +scene0054_00_00012.bin 7 +scene0054_00_00019.bin 7 +scene0056_00_00006.bin 7 t +scene0062_00_00003.bin 7 +scene0065_00_00003.bin 7 +scene0071_00_00002.bin 7 +scene0072_00_00007.bin 7 +scene0073_00_00006.bin 7 +scene0078_00_00004.bin 7 +scene0084_00_00006.bin 7 t +scene0085_00_00007.bin 7 +scene0086_00_00002.bin 7 t +scene0096_00_00007.bin 7 t +scene0096_00_00009.bin 7 t +scene0097_00_00003.bin 7 +scene0098_00_00015.bin 7 +scene0110_00_00005.bin 7 +scene0115_00_00003.bin 7 t +scene0118_00_00003.bin 7 +scene0118_00_00004.bin 7 +scene0121_00_00006.bin 7 +scene0122_00_00003.bin 7 +scene0124_00_00002.bin 7 +scene0124_00_00003.bin 7 +scene0126_00_00006.bin 7 t +scene0127_00_00005.bin 7 t +scene0140_00_00008.bin 7 +scene0142_00_00003.bin 7 +scene0144_00_00009.bin 7 +scene0153_00_00004.bin 7 +scene0159_00_00009.bin 7 +scene0162_00_00004.bin 7 t +scene0174_00_00004.bin 7 +scene0175_00_00007.bin 7 +scene0177_00_00005.bin 7 +scene0178_00_00006.bin 7 +scene0184_00_00004.bin 7 +scene0186_00_00020.bin 7 +scene0191_00_00006.bin 7 +scene0195_00_00004.bin 7 +scene0196_00_00004.bin 7 +scene0197_00_00004.bin 7 +scene0198_00_00005.bin 7 +scene0198_00_00006.bin 7 +scene0204_00_00004.bin 7 +scene0210_00_00006.bin 7 +scene0214_00_00007.bin 7 +scene0217_00_00007.bin 7 t +scene0220_00_00009.bin 7 +scene0232_00_00004.bin 7 +scene0233_00_00006.bin 7 t +scene0240_00_00005.bin 7 +scene0241_00_00003.bin 7 +scene0242_00_00002.bin 7 +scene0242_00_00003.bin 7 +scene0250_00_00005.bin 7 +scene0251_00_00009.bin 7 +scene0259_00_00006.bin 7 t +scene0261_00_00006.bin 7 +scene0261_00_00007.bin 7 +scene0265_00_00007.bin 12 +scene0267_00_00007.bin 7 t +scene0268_00_00006.bin 7 +scene0276_00_00011.bin 7 +scene0279_00_00007.bin 7 +scene0286_00_00005.bin 7 t +scene0290_00_00008.bin 7 +scene0290_00_00011.bin 7 +scene0290_00_00012.bin 7 +scene0296_00_00009.bin 7 t +scene0303_00_00005.bin 7 t +scene0304_00_00006.bin 7 +scene0305_00_00011.bin 7 t +scene0307_00_00006.bin 7 t +scene0308_00_00006.bin 7 +scene0327_00_00006.bin 7 t +scene0327_00_00008.bin 7 t +scene0329_00_00007.bin 7 +scene0329_00_00008.bin 7 +scene0329_00_00012.bin 7 +scene0332_00_00005.bin 7 +scene0335_00_00005.bin 7 +scene0346_00_00004.bin 7 t +scene0350_00_00005.bin 7 +scene0352_00_00004.bin 7 +scene0357_00_00005.bin 7 +scene0358_00_00005.bin 7 +scene0360_00_00003.bin 7 +scene0364_00_00006.bin 7 t +scene0375_00_00002.bin 7 +scene0378_00_00006.bin 7 t +scene0383_00_00005.bin 7 +scene0384_00_00003.bin 7 +scene0389_00_00005.bin 7 +scene0396_00_00005.bin 7 +scene0398_00_00005.bin 7 +scene0410_00_00002.bin 7 +scene0415_00_00004.bin 7 +scene0419_00_00019.bin 7 t +scene0421_00_00005.bin 7 +scene0424_00_00007.bin 7 +scene0425_00_00005.bin 7 +scene0434_00_00005.bin 7 +scene0438_00_00008.bin 7 +scene0446_00_00004.bin 7 +scene0447_00_00007.bin 7 +scene0448_00_00004.bin 7 +scene0449_00_00008.bin 7 +scene0465_00_00010.bin 7 +scene0470_00_00002.bin 7 +scene0473_00_00002.bin 7 +scene0473_00_00004.bin 7 +scene0474_00_00007.bin 7 +scene0479_00_00004.bin 7 +scene0487_00_00006.bin 7 +scene0498_00_00004.bin 7 +scene0499_00_00018.bin 7 +scene0501_00_00003.bin 7 +scene0524_00_00007.bin 7 +scene0525_00_00008.bin 7 +scene0527_00_00004.bin 7 +scene0530_00_00006.bin 7 +scene0532_00_00004.bin 7 +scene0534_00_00006.bin 7 +scene0538_00_00004.bin 7 t +scene0539_00_00006.bin 7 +scene0541_00_00009.bin 7 +scene0547_00_00007.bin 7 +scene0548_00_00007.bin 7 +scene0550_00_00005.bin 7 +scene0554_00_00005.bin 7 +scene0560_00_00004.bin 7 t +scene0561_00_00003.bin 7 +scene0561_00_00004.bin 7 +scene0561_00_00006.bin 7 +scene0561_00_00007.bin 7 +scene0561_00_00008.bin 7 +scene0564_00_00002.bin 7 +scene0571_00_00005.bin 7 +scene0574_00_00003.bin 7 +scene0581_00_00006.bin 7 +scene0583_00_00005.bin 7 +scene0599_00_00005.bin 7 +scene0613_00_00008.bin 7 +scene0615_00_00004.bin 7 +scene0623_00_00006.bin 7 +scene0625_00_00003.bin 7 +scene0628_00_00005.bin 7 +scene0629_00_00011.bin 7 +scene0635_00_00006.bin 7 +scene0642_00_00026.bin 7 +scene0643_00_00005.bin 7 +scene0645_00_00012.bin 7 +scene0646_00_00007.bin 7 +scene0000_00_00038.bin 1 t +scene0000_00_00039.bin 1 t +scene0000_00_00046.bin 1 t +scene0002_00_00029.bin 1 +scene0002_00_00035.bin 1 +scene0003_00_00009.bin 1 +scene0009_00_00006.bin 1 +scene0014_00_00007.bin 1 +scene0017_00_00015.bin 1 +scene0018_00_00009.bin 1 +scene0018_00_00013.bin 1 +scene0026_00_00016.bin 1 +scene0029_00_00007.bin 1 +scene0036_00_00005.bin 1 t +scene0043_00_00006.bin 1 +scene0058_00_00011.bin 1 +scene0060_00_00007.bin 1 t +scene0086_00_00009.bin 1 +scene0089_00_00007.bin 1 +scene0089_00_00008.bin 1 +scene0100_00_00009.bin 1 +scene0104_00_00008.bin 1 +scene0108_00_00021.bin 1 +scene0109_00_00007.bin 1 +scene0111_00_00011.bin 1 t +scene0120_00_00006.bin 1 +scene0127_00_00016.bin 1 +scene0136_00_00005.bin 1 +scene0136_00_00008.bin 1 +scene0140_00_00027.bin 1 +scene0140_00_00035.bin 1 +scene0155_00_00019.bin 1 +scene0178_00_00016.bin 1 +scene0193_00_00006.bin 1 +scene0195_00_00009.bin 1 +scene0197_00_00007.bin 1 +scene0217_00_00014.bin 1 +scene0217_00_00015.bin 1 +scene0220_00_00016.bin 1 +scene0222_00_00011.bin 1 t +scene0222_00_00012.bin 1 t +scene0225_00_00013.bin 1 +scene0225_00_00020.bin 1 +scene0225_00_00023.bin 1 +scene0230_00_00012.bin 1 +scene0233_00_00017.bin 1 t +scene0233_00_00019.bin 1 t +scene0233_00_00024.bin 1 t +scene0240_00_00009.bin 1 +scene0240_00_00011.bin 1 +scene0249_00_00014.bin 1 +scene0251_00_00012.bin 1 t +scene0251_00_00015.bin 1 t +scene0251_00_00016.bin 1 t +scene0251_00_00017.bin 1 t +scene0251_00_00018.bin 1 t +scene0255_00_00011.bin 1 +scene0260_00_00010.bin 1 t +scene0263_00_00015.bin 1 +scene0264_00_00011.bin 1 +scene0265_00_00009.bin 1 +scene0267_00_00011.bin 1 +scene0267_00_00012.bin 1 +scene0274_00_00006.bin 1 t +scene0289_00_00016.bin 1 +scene0329_00_00018.bin 1 +scene0340_00_00017.bin 1 t +scene0347_00_00006.bin 1 +scene0348_00_00011.bin 1 +scene0349_00_00008.bin 1 t +scene0353_00_00016.bin 1 +scene0358_00_00014.bin 1 +scene0360_00_00002.bin 1 +scene0360_00_00005.bin 1 +scene0370_00_00012.bin 1 +scene0371_00_00008.bin 1 +scene0373_00_00006.bin 1 +scene0377_00_00005.bin 1 t +scene0377_00_00008.bin 1 t +scene0378_00_00015.bin 1 +scene0383_00_00009.bin 1 +scene0394_00_00024.bin 1 +scene0398_00_00008.bin 1 +scene0400_00_00010.bin 1 +scene0402_00_00010.bin 1 t +scene0403_00_00005.bin 1 +scene0405_00_00002.bin 1 +scene0405_00_00003.bin 1 +scene0405_00_00004.bin 1 +scene0405_00_00005.bin 1 +scene0405_00_00006.bin 1 +scene0405_00_00007.bin 1 +scene0405_00_00008.bin 1 +scene0405_00_00009.bin 1 +scene0406_00_00008.bin 1 +scene0415_00_00012.bin 1 +scene0422_00_00005.bin 1 +scene0431_00_00013.bin 1 +scene0434_00_00008.bin 1 +scene0436_00_00003.bin 1 +scene0436_00_00004.bin 1 +scene0436_00_00006.bin 1 +scene0445_00_00005.bin 1 t +scene0445_00_00006.bin 1 t +scene0456_00_00013.bin 1 +scene0464_00_00015.bin 1 +scene0469_00_00012.bin 1 +scene0470_00_00009.bin 1 +scene0476_00_00009.bin 1 +scene0486_00_00007.bin 1 +scene0486_00_00008.bin 1 +scene0487_00_00025.bin 1 t +scene0498_00_00008.bin 1 +scene0508_00_00013.bin 1 +scene0510_00_00007.bin 1 +scene0510_00_00009.bin 1 +scene0511_00_00006.bin 1 +scene0517_00_00029.bin 1 +scene0519_00_00005.bin 1 t +scene0523_00_00006.bin 1 +scene0528_00_00009.bin 1 +scene0530_00_00010.bin 1 t +scene0544_00_00006.bin 1 t +scene0552_00_00015.bin 1 t +scene0565_00_00013.bin 1 t +scene0574_00_00007.bin 1 +scene0575_00_00014.bin 1 +scene0579_00_00004.bin 1 +scene0579_00_00005.bin 1 +scene0585_00_00012.bin 1 t +scene0585_00_00013.bin 1 t +scene0585_00_00015.bin 1 t +scene0586_00_00010.bin 1 +scene0593_00_00006.bin 1 +scene0600_00_00007.bin 1 +scene0610_00_00007.bin 1 +scene0616_00_00014.bin 1 +scene0644_00_00016.bin 1 t +scene0030_00_00033.bin 2 +scene0030_00_00036.bin 2 +scene0030_00_00043.bin 2 +scene0030_00_00051.bin 2 +scene0030_00_00052.bin 2 +scene0054_00_00052.bin 2 +scene0077_00_00012.bin 2 +scene0098_00_00008.bin 2 +scene0104_00_00009.bin 2 +scene0108_00_00015.bin 2 +scene0120_00_00007.bin 2 +scene0120_00_00008.bin 2 +scene0164_00_00013.bin 2 +scene0174_00_00009.bin 2 +scene0206_00_00019.bin 2 t +scene0256_00_00004.bin 2 +scene0256_00_00005.bin 2 +scene0263_00_00005.bin 2 +scene0291_00_00026.bin 2 +scene0301_00_00016.bin 2 +scene0315_00_00010.bin 2 +scene0325_00_00013.bin 2 t +scene0357_00_00016.bin 2 +scene0379_00_00021.bin 2 +scene0384_00_00009.bin 2 +scene0384_00_00017.bin 2 +scene0384_00_00018.bin 2 +scene0384_00_00023.bin 2 +scene0384_00_00025.bin 2 +scene0384_00_00039.bin 2 +scene0404_00_00008.bin 2 t +scene0419_00_00013.bin 2 +scene0421_00_00009.bin 2 +scene0421_00_00011.bin 2 +scene0421_00_00013.bin 2 +scene0426_00_00008.bin 2 +scene0426_00_00013.bin 2 +scene0426_00_00020.bin 2 +scene0479_00_00017.bin 2 +scene0479_00_00019.bin 2 +scene0487_00_00023.bin 2 +scene0565_00_00007.bin 2 +scene0565_00_00009.bin 2 +scene0592_00_00028.bin 2 +scene0636_00_00001.bin 2 +scene0646_00_00030.bin 2 t +scene0000_00_00005.bin 10 +scene0006_00_00002.bin 10 +scene0006_00_00003.bin 10 +scene0032_00_00002.bin 10 +scene0035_00_00002.bin 10 +scene0039_00_00002.bin 10 t +scene0046_00_00003.bin 10 +scene0055_00_00006.bin 10 t +scene0070_00_00005.bin 10 +scene0072_00_00005.bin 10 +scene0073_00_00003.bin 10 +scene0078_00_00003.bin 10 +scene0085_00_00003.bin 10 +scene0085_00_00005.bin 10 +scene0092_00_00002.bin 10 +scene0101_00_00004.bin 10 +scene0107_00_00003.bin 10 +scene0127_00_00003.bin 10 t +scene0127_00_00007.bin 10 t +scene0127_00_00010.bin 10 t +scene0137_00_00003.bin 10 +scene0137_00_00004.bin 10 +scene0143_00_00000.bin 10 +scene0144_00_00002.bin 10 +scene0147_00_00001.bin 10 +scene0148_00_00003.bin 10 t +scene0178_00_00003.bin 10 +scene0178_00_00004.bin 10 +scene0178_00_00018.bin 10 +scene0184_00_00002.bin 10 +scene0193_00_00002.bin 10 +scene0207_00_00003.bin 10 +scene0209_00_00005.bin 10 +scene0209_00_00006.bin 10 +scene0217_00_00002.bin 10 +scene0217_00_00003.bin 10 +scene0219_00_00001.bin 10 +scene0221_00_00003.bin 10 +scene0221_00_00004.bin 10 +scene0222_00_00005.bin 10 +scene0222_00_00006.bin 10 +scene0223_00_00007.bin 10 +scene0233_00_00004.bin 10 +scene0233_00_00009.bin 10 +scene0235_00_00004.bin 10 +scene0236_00_00001.bin 10 +scene0246_00_00004.bin 10 +scene0259_00_00003.bin 10 t +scene0270_00_00003.bin 10 t +scene0270_00_00004.bin 10 t +scene0271_00_00003.bin 10 +scene0276_00_00003.bin 10 t +scene0277_00_00005.bin 10 +scene0279_00_00004.bin 10 +scene0280_00_00008.bin 10 +scene0282_00_00004.bin 10 +scene0286_00_00003.bin 10 t +scene0287_00_00002.bin 10 t +scene0295_00_00002.bin 10 +scene0296_00_00002.bin 10 +scene0296_00_00004.bin 10 +scene0298_00_00002.bin 10 t +scene0308_00_00003.bin 10 +scene0321_00_00002.bin 10 t +scene0340_00_00004.bin 10 +scene0340_00_00005.bin 10 +scene0356_00_00003.bin 10 +scene0356_00_00009.bin 10 +scene0359_00_00003.bin 10 +scene0364_00_00003.bin 10 +scene0376_00_00003.bin 10 +scene0389_00_00004.bin 10 +scene0392_00_00007.bin 10 +scene0394_00_00003.bin 10 t +scene0398_00_00002.bin 10 +scene0398_00_00003.bin 10 +scene0400_00_00004.bin 10 +scene0416_00_00004.bin 10 +scene0416_00_00005.bin 10 +scene0418_00_00002.bin 10 +scene0426_00_00002.bin 10 +scene0435_00_00003.bin 10 +scene0435_00_00004.bin 10 +scene0438_00_00001.bin 10 +scene0440_00_00003.bin 10 +scene0440_00_00004.bin 10 +scene0445_00_00002.bin 10 +scene0457_00_00002.bin 10 +scene0468_00_00005.bin 10 +scene0472_00_00003.bin 10 +scene0477_00_00003.bin 10 t +scene0477_00_00004.bin 10 t +scene0506_00_00003.bin 10 +scene0515_00_00006.bin 10 +scene0521_00_00003.bin 10 +scene0541_00_00005.bin 10 +scene0545_00_00002.bin 10 +scene0548_00_00004.bin 10 +scene0556_00_00003.bin 10 +scene0556_00_00004.bin 10 +scene0557_00_00002.bin 10 +scene0560_00_00002.bin 10 +scene0567_00_00002.bin 10 +scene0576_00_00003.bin 10 +scene0577_00_00004.bin 10 +scene0580_00_00004.bin 10 t +scene0589_00_00006.bin 10 +scene0590_00_00003.bin 10 t +scene0600_00_00002.bin 10 t +scene0604_00_00003.bin 10 +scene0613_00_00001.bin 10 +scene0615_00_00003.bin 10 +scene0620_00_00002.bin 10 +scene0640_00_00004.bin 10 t +scene0642_00_00005.bin 10 +scene0645_00_00003.bin 10 +scene0645_00_00004.bin 10 +scene0000_00_00003.bin 13 +scene0001_00_00002.bin 13 +scene0001_00_00003.bin 13 +scene0001_00_00004.bin 13 +scene0002_00_00005.bin 13 +scene0008_00_00003.bin 13 +scene0008_00_00004.bin 13 +scene0025_00_00005.bin 13 +scene0025_00_00006.bin 13 +scene0027_00_00002.bin 13 t +scene0031_00_00005.bin 13 +scene0031_00_00007.bin 13 +scene0031_00_00008.bin 13 +scene0031_00_00009.bin 13 +scene0031_00_00011.bin 13 +scene0031_00_00012.bin 13 +scene0031_00_00014.bin 13 +scene0036_00_00002.bin 13 +scene0036_00_00003.bin 13 +scene0040_00_00007.bin 13 +scene0049_00_00003.bin 13 +scene0050_00_00003.bin 13 +scene0053_00_00001.bin 13 t +scene0053_00_00003.bin 13 t +scene0054_00_00004.bin 13 +scene0059_00_00005.bin 13 +scene0061_00_00001.bin 13 +scene0064_00_00005.bin 13 +scene0087_00_00003.bin 13 +scene0087_00_00006.bin 13 +scene0091_00_00002.bin 13 +scene0106_00_00003.bin 13 +scene0106_00_00004.bin 13 +scene0113_00_00002.bin 13 t +scene0113_00_00003.bin 13 t +scene0113_00_00004.bin 13 t +scene0125_00_00003.bin 13 +scene0128_00_00001.bin 13 +scene0137_00_00005.bin 13 +scene0144_00_00005.bin 13 t +scene0145_00_00003.bin 13 +scene0151_00_00003.bin 13 +scene0160_00_00001.bin 13 t +scene0160_00_00004.bin 13 t +scene0160_00_00005.bin 13 t +scene0162_00_00003.bin 13 t +scene0166_00_00006.bin 13 +scene0167_00_00003.bin 13 +scene0167_00_00004.bin 13 +scene0177_00_00006.bin 13 t +scene0181_00_00005.bin 13 +scene0187_00_00006.bin 13 +scene0187_00_00011.bin 13 +scene0194_00_00001.bin 13 +scene0199_00_00002.bin 13 t +scene0203_00_00006.bin 13 t +scene0207_00_00006.bin 13 +scene0209_00_00009.bin 13 t +scene0213_00_00004.bin 13 +scene0213_00_00005.bin 13 +scene0213_00_00008.bin 13 +scene0213_00_00012.bin 13 +scene0218_00_00003.bin 13 t +scene0218_00_00004.bin 13 t +scene0224_00_00003.bin 13 t +scene0226_00_00003.bin 13 +scene0226_00_00004.bin 13 +scene0226_00_00005.bin 13 +scene0226_00_00006.bin 13 +scene0231_00_00011.bin 13 t +scene0231_00_00014.bin 13 t +scene0235_00_00008.bin 13 t +scene0239_00_00004.bin 13 +scene0247_00_00003.bin 13 t +scene0247_00_00004.bin 13 t +scene0247_00_00015.bin 13 t +scene0269_00_00001.bin 13 +scene0269_00_00002.bin 13 +scene0273_00_00006.bin 13 +scene0276_00_00004.bin 13 +scene0279_00_00006.bin 13 +scene0281_00_00003.bin 13 +scene0281_00_00004.bin 13 +scene0288_00_00005.bin 13 +scene0294_00_00002.bin 13 +scene0294_00_00003.bin 13 +scene0297_00_00003.bin 13 +scene0297_00_00004.bin 13 +scene0301_00_00002.bin 13 +scene0309_00_00019.bin 13 +scene0312_00_00002.bin 13 +scene0312_00_00003.bin 13 +scene0312_00_00004.bin 13 +scene0315_00_00003.bin 13 t +scene0315_00_00005.bin 13 t +scene0316_00_00005.bin 13 +scene0317_00_00005.bin 13 +scene0319_00_00003.bin 13 +scene0319_00_00004.bin 13 +scene0319_00_00005.bin 13 +scene0326_00_00001.bin 13 t +scene0327_00_00005.bin 13 t +scene0327_00_00015.bin 3 t +scene0329_00_00003.bin 13 t +scene0329_00_00004.bin 13 t +scene0334_00_00002.bin 13 +scene0334_00_00003.bin 13 +scene0339_00_00003.bin 13 +scene0339_00_00005.bin 13 +scene0339_00_00006.bin 13 +scene0339_00_00007.bin 13 +scene0341_00_00002.bin 13 +scene0352_00_00003.bin 13 t +scene0353_00_00005.bin 13 +scene0362_00_00004.bin 13 +scene0363_00_00004.bin 13 +scene0363_00_00006.bin 13 +scene0363_00_00007.bin 13 +scene0363_00_00008.bin 13 +scene0363_00_00009.bin 13 +scene0363_00_00010.bin 13 +scene0367_00_00004.bin 13 +scene0367_00_00006.bin 13 +scene0368_00_00006.bin 13 +scene0368_00_00009.bin 13 +scene0368_00_00010.bin 13 +scene0368_00_00034.bin 13 +scene0374_00_00002.bin 13 +scene0381_00_00002.bin 13 +scene0385_00_00004.bin 13 +scene0386_00_00003.bin 13 +scene0386_00_00005.bin 13 +scene0392_00_00008.bin 13 +scene0394_00_00012.bin 13 +scene0395_00_00005.bin 13 +scene0407_00_00002.bin 13 +scene0424_00_00006.bin 13 +scene0450_00_00006.bin 13 +scene0451_00_00005.bin 13 t +scene0461_00_00002.bin 13 +scene0461_00_00003.bin 13 +scene0467_00_00002.bin 13 +scene0474_00_00004.bin 13 +scene0480_00_00002.bin 13 +scene0484_00_00002.bin 13 +scene0484_00_00003.bin 13 +scene0487_00_00008.bin 13 +scene0487_00_00012.bin 13 +scene0499_00_00008.bin 13 +scene0499_00_00009.bin 13 +scene0503_00_00002.bin 13 +scene0504_00_00004.bin 13 +scene0504_00_00017.bin 13 +scene0505_00_00008.bin 13 +scene0514_00_00004.bin 13 +scene0515_00_00009.bin 13 +scene0517_00_00006.bin 13 t +scene0520_00_00001.bin 13 +scene0520_00_00003.bin 13 +scene0520_00_00005.bin 13 +scene0529_00_00004.bin 13 +scene0533_00_00002.bin 13 +scene0533_00_00005.bin 13 +scene0536_00_00002.bin 13 t +scene0537_00_00003.bin 13 t +scene0549_00_00002.bin 13 +scene0549_00_00004.bin 13 +scene0559_00_00002.bin 13 +scene0568_00_00003.bin 13 +scene0587_00_00002.bin 13 +scene0588_00_00004.bin 13 +scene0588_00_00006.bin 13 +scene0588_00_00007.bin 13 +scene0588_00_00008.bin 13 +scene0588_00_00009.bin 13 +scene0588_00_00010.bin 13 +scene0588_00_00011.bin 13 +scene0588_00_00012.bin 13 +scene0588_00_00013.bin 13 +scene0588_00_00014.bin 13 +scene0590_00_00006.bin 13 +scene0593_00_00005.bin 13 +scene0601_00_00008.bin 13 +scene0601_00_00012.bin 13 +scene0603_00_00004.bin 13 +scene0603_00_00005.bin 13 +scene0604_00_00004.bin 13 +scene0623_00_00003.bin 13 +scene0626_00_00002.bin 13 +scene0641_00_00003.bin 13 +scene0641_00_00005.bin 13 +scene0641_00_00006.bin 13 +scene0645_00_00005.bin 13 +scene0000_00_00035.bin 12 +scene0003_00_00013.bin 12 t +scene0009_00_00009.bin 12 +scene0009_00_00011.bin 12 +scene0009_00_00012.bin 12 +scene0009_00_00013.bin 12 +scene0009_00_00014.bin 12 +scene0009_00_00017.bin 12 +scene0014_00_00009.bin 12 +scene0014_00_00010.bin 12 +scene0026_00_00017.bin 12 +scene0026_00_00020.bin 12 +scene0034_00_00011.bin 12 +scene0042_00_00006.bin 12 +scene0051_00_00011.bin 12 t +scene0054_00_00028.bin 12 +scene0065_00_00006.bin 12 t +scene0067_00_00006.bin 12 +scene0068_00_00006.bin 12 t +scene0083_00_00004.bin 12 +scene0084_00_00004.bin 12 t +scene0086_00_00010.bin 12 +scene0086_00_00011.bin 12 +scene0096_00_00016.bin 12 +scene0100_00_00008.bin 12 t +scene0101_00_00011.bin 12 +scene0116_00_00004.bin 12 +scene0119_00_00005.bin 12 +scene0146_00_00003.bin 12 +scene0170_00_00006.bin 12 +scene0195_00_00015.bin 12 t +scene0197_00_00009.bin 12 t +scene0207_00_00014.bin 12 +scene0207_00_00017.bin 12 +scene0214_00_00005.bin 12 +scene0232_00_00010.bin 12 +scene0237_00_00003.bin 12 +scene0246_00_00016.bin 12 +scene0247_00_00025.bin 12 +scene0260_00_00008.bin 12 +scene0261_00_00005.bin 12 t +scene0265_00_00011.bin 12 +scene0268_00_00004.bin 12 +scene0276_00_00016.bin 12 +scene0307_00_00008.bin 12 +scene0348_00_00008.bin 12 +scene0349_00_00003.bin 12 +scene0349_00_00006.bin 12 +scene0350_00_00009.bin 12 +scene0366_00_00008.bin 12 +scene0366_00_00009.bin 12 +scene0375_00_00008.bin 12 t +scene0394_00_00016.bin 12 +scene0394_00_00023.bin 12 +scene0396_00_00008.bin 12 +scene0399_00_00002.bin 12 t +scene0406_00_00006.bin 12 +scene0415_00_00003.bin 12 +scene0429_00_00006.bin 12 t +scene0434_00_00010.bin 12 +scene0435_00_00011.bin 12 +scene0439_00_00014.bin 12 +scene0441_00_00010.bin 12 +scene0446_00_00005.bin 12 +scene0447_00_00005.bin 12 +scene0448_00_00008.bin 12 t +scene0449_00_00012.bin 12 +scene0458_00_00012.bin 12 +scene0460_00_00002.bin 12 +scene0486_00_00009.bin 12 +scene0501_00_00007.bin 12 +scene0516_00_00019.bin 12 +scene0517_00_00024.bin 12 +scene0519_00_00006.bin 12 t +scene0521_00_00011.bin 12 +scene0523_00_00004.bin 12 t +scene0527_00_00005.bin 12 +scene0527_00_00006.bin 12 +scene0538_00_00005.bin 12 +scene0542_00_00010.bin 12 +scene0546_00_00008.bin 12 +scene0547_00_00017.bin 12 +scene0553_00_00003.bin 12 +scene0564_00_00005.bin 12 t +scene0564_00_00006.bin 12 t +scene0574_00_00004.bin 12 +scene0574_00_00009.bin 12 +scene0579_00_00006.bin 12 +scene0579_00_00007.bin 12 +scene0579_00_00008.bin 12 +scene0579_00_00009.bin 12 +scene0581_00_00010.bin 12 +scene0583_00_00006.bin 12 +scene0586_00_00013.bin 12 +scene0602_00_00002.bin 12 +scene0612_00_00007.bin 12 +scene0631_00_00008.bin 12 t +scene0631_00_00009.bin 12 t +scene0639_00_00002.bin 12 +scene0639_00_00008.bin 12 +scene0642_00_00010.bin 12 +scene0642_00_00028.bin 12 +scene0645_00_00014.bin 12 +scene0000_00_00036.bin 11 +scene0002_00_00027.bin 11 +scene0002_00_00028.bin 11 +scene0002_00_00034.bin 11 +scene0002_00_00039.bin 11 +scene0016_00_00009.bin 11 t +scene0016_00_00012.bin 11 t +scene0021_00_00006.bin 11 +scene0025_00_00017.bin 11 +scene0049_00_00010.bin 11 +scene0049_00_00013.bin 11 +scene0049_00_00014.bin 11 +scene0070_00_00012.bin 11 t +scene0072_00_00011.bin 11 +scene0074_00_00004.bin 11 +scene0137_00_00011.bin 11 +scene0147_00_00017.bin 11 +scene0147_00_00022.bin 11 +scene0147_00_00023.bin 11 +scene0177_00_00011.bin 11 t +scene0182_00_00007.bin 11 +scene0194_00_00011.bin 11 +scene0209_00_00017.bin 11 +scene0209_00_00018.bin 11 +scene0209_00_00019.bin 11 +scene0209_00_00020.bin 11 +scene0219_00_00003.bin 11 t +scene0222_00_00016.bin 11 +scene0222_00_00017.bin 11 +scene0224_00_00009.bin 11 +scene0235_00_00012.bin 11 +scene0270_00_00013.bin 11 +scene0270_00_00016.bin 11 +scene0270_00_00017.bin 11 +scene0270_00_00018.bin 11 +scene0270_00_00019.bin 11 +scene0271_00_00019.bin 11 +scene0296_00_00013.bin 11 +scene0296_00_00015.bin 11 +scene0296_00_00026.bin 11 +scene0308_00_00009.bin 11 +scene0317_00_00016.bin 11 +scene0319_00_00007.bin 11 t +scene0319_00_00009.bin 11 t +scene0326_00_00006.bin 11 +scene0331_00_00010.bin 11 +scene0338_00_00006.bin 2 +scene0340_00_00012.bin 11 +scene0340_00_00015.bin 11 +scene0340_00_00016.bin 11 +scene0362_00_00010.bin 11 t +scene0385_00_00014.bin 11 t +scene0385_00_00015.bin 11 t +scene0394_00_00019.bin 11 +scene0394_00_00022.bin 11 +scene0394_00_00027.bin 11 +scene0397_00_00006.bin 11 +scene0407_00_00009.bin 11 +scene0425_00_00012.bin 11 t +scene0438_00_00009.bin 11 +scene0467_00_00015.bin 11 +scene0477_00_00012.bin 11 t +scene0477_00_00016.bin 11 t +scene0480_00_00008.bin 11 +scene0507_00_00003.bin 11 t +scene0507_00_00004.bin 11 t +scene0507_00_00006.bin 11 t +scene0518_00_00012.bin 11 +scene0536_00_00006.bin 11 +scene0548_00_00010.bin 11 +scene0554_00_00017.bin 11 +scene0567_00_00008.bin 11 +scene0577_00_00016.bin 11 +scene0589_00_00007.bin 11 +scene0590_00_00007.bin 11 +scene0591_00_00013.bin 11 +scene0615_00_00016.bin 11 t +scene0642_00_00014.bin 11 +scene0642_00_00015.bin 11 +scene0645_00_00022.bin 11 +scene0000_00_00031.bin 14 +scene0014_00_00006.bin 14 +scene0026_00_00011.bin 14 +scene0026_00_00012.bin 14 +scene0029_00_00005.bin 14 +scene0034_00_00008.bin 14 +scene0042_00_00007.bin 14 t +scene0051_00_00012.bin 14 +scene0054_00_00035.bin 14 +scene0062_00_00006.bin 14 +scene0065_00_00008.bin 14 +scene0067_00_00004.bin 14 t +scene0083_00_00003.bin 14 +scene0084_00_00005.bin 14 t +scene0086_00_00008.bin 14 +scene0086_00_00014.bin 14 +scene0100_00_00006.bin 14 +scene0101_00_00014.bin 14 +scene0112_00_00002.bin 14 +scene0116_00_00005.bin 14 +scene0119_00_00009.bin 14 +scene0135_00_00005.bin 14 t +scene0146_00_00002.bin 14 +scene0153_00_00006.bin 14 +scene0175_00_00010.bin 14 +scene0195_00_00007.bin 14 t +scene0207_00_00011.bin 14 t +scene0214_00_00010.bin 14 +scene0232_00_00008.bin 14 +scene0246_00_00014.bin 14 +scene0250_00_00008.bin 14 t +scene0254_00_00008.bin 14 +scene0254_00_00010.bin 14 +scene0260_00_00006.bin 14 +scene0261_00_00012.bin 14 +scene0265_00_00004.bin 14 +scene0276_00_00014.bin 14 +scene0365_00_00005.bin 14 +scene0366_00_00005.bin 14 +scene0396_00_00007.bin 14 +scene0399_00_00003.bin 14 +scene0406_00_00005.bin 14 +scene0410_00_00004.bin 14 +scene0429_00_00008.bin 14 +scene0434_00_00007.bin 14 +scene0435_00_00012.bin 14 +scene0446_00_00007.bin 14 +scene0447_00_00006.bin 14 +scene0448_00_00007.bin 14 t +scene0449_00_00005.bin 14 +scene0458_00_00007.bin 14 +scene0471_00_00005.bin 14 +scene0492_00_00013.bin 14 +scene0501_00_00009.bin 14 t +scene0510_00_00004.bin 14 +scene0510_00_00008.bin 14 +scene0515_00_00018.bin 14 +scene0516_00_00020.bin 14 +scene0521_00_00014.bin 14 +scene0523_00_00003.bin 14 +scene0538_00_00006.bin 14 t +scene0539_00_00007.bin 14 +scene0546_00_00009.bin 14 +scene0550_00_00009.bin 14 t +scene0553_00_00004.bin 14 t +scene0564_00_00004.bin 14 +scene0570_00_00006.bin 14 t +scene0571_00_00006.bin 14 +scene0581_00_00009.bin 14 +scene0583_00_00008.bin 14 t +scene0602_00_00003.bin 14 +scene0610_00_00005.bin 14 +scene0612_00_00003.bin 14 +scene0625_00_00005.bin 14 +scene0631_00_00005.bin 14 +scene0639_00_00006.bin 14 +scene0642_00_00012.bin 14 +scene0645_00_00015.bin 14 diff --git a/zoo/SimpleView/ScanObjectNN/training_data/split2.txt b/zoo/SimpleView/ScanObjectNN/training_data/split2.txt new file mode 100644 index 0000000..e69c68a --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/split2.txt @@ -0,0 +1,2902 @@ +005_00020.bin 0 +014_00018.bin 0 +025_00011.bin 0 t +038_00032.bin 0 +041_00028.bin 0 +041_00052.bin 0 +043_00018.bin 0 +054_00026.bin 0 +073_00014.bin 0 +080_00015.bin 0 +082_00020.bin 0 +084_00012.bin 0 t +086_00015.bin 0 +086_00020.bin 0 +093_00019.bin 0 +096_00016.bin 0 t +096_00020.bin 0 t +098_00007.bin 0 +202_00002.bin 0 +205_00007.bin 0 +205_00009.bin 0 +209_00013.bin 0 t +209_00019.bin 0 t +213_00025.bin 0 +223_00012.bin 0 +227_00012.bin 0 +234_00012.bin 0 t +237_00011.bin 0 t +237_00014.bin 0 t +240_00009.bin 0 +246_00014.bin 0 t +251_00015.bin 0 +251_00018.bin 0 +273_00010.bin 0 +614_00005.bin 0 +700_00012.bin 0 +005_00015.bin 1 t +005_00017.bin 1 t +014_00016.bin 1 +021_00014.bin 1 +021_00021.bin 1 +032_00015.bin 1 +041_00042.bin 1 +043_00014.bin 1 t +045_00018.bin 1 +047_00019.bin 1 +047_00023.bin 1 +049_00007.bin 1 +052_00012.bin 1 +062_00009.bin 1 t +065_00013.bin 1 +069_00009.bin 1 +076_00045.bin 1 t +080_00013.bin 1 +086_00011.bin 1 +086_00016.bin 1 +089_00010.bin 1 +093_00014.bin 1 +093_00016.bin 1 +109_00008.bin 1 t +109_00016.bin 1 t +205_00008.bin 1 +207_00005.bin 1 +207_00010.bin 1 +209_00014.bin 1 +213_00015.bin 1 +213_00026.bin 1 +231_00019.bin 1 +237_00009.bin 1 +237_00010.bin 1 +246_00008.bin 1 +251_00014.bin 1 +252_00013.bin 1 +252_00014.bin 1 +255_00003.bin 1 +255_00006.bin 1 +265_00010.bin 1 +265_00024.bin 1 +265_00030.bin 1 +270_00007.bin 1 t +270_00012.bin 1 t +273_00007.bin 1 +276_00010.bin 1 t +279_00012.bin 1 +322_00014.bin 1 t +700_00006.bin 1 +700_00008.bin 1 +005_00021.bin 2 t +011_00010.bin 2 +036_00021.bin 2 +041_00038.bin 2 +043_00016.bin 2 +045_00012.bin 2 +045_00017.bin 2 +047_00021.bin 2 +047_00022.bin 2 +047_00026.bin 2 +054_00019.bin 2 +054_00050.bin 2 +074_00005.bin 2 +074_00012.bin 2 +074_00016.bin 2 +074_00018.bin 2 +074_00020.bin 2 +074_00021.bin 2 +074_00029.bin 2 +078_00005.bin 2 +082_00018.bin 2 t +082_00024.bin 2 t +082_00026.bin 2 t +084_00009.bin 2 +084_00011.bin 2 +086_00009.bin 2 +086_00018.bin 2 +087_00007.bin 2 t +087_00008.bin 2 t +087_00009.bin 2 t +087_00012.bin 2 t +087_00017.bin 2 t +087_00028.bin 2 t +089_00013.bin 2 +089_00021.bin 2 +093_00018.bin 2 +093_00022.bin 2 +093_00023.bin 2 +093_00032.bin 2 +109_00012.bin 2 +209_00022.bin 2 t +209_00029.bin 2 t +209_00032.bin 2 t +213_00011.bin 2 t +225_00016.bin 2 t +231_00031.bin 2 t +234_00008.bin 2 +246_00012.bin 2 +251_00003.bin 2 +251_00007.bin 2 +251_00008.bin 2 +255_00008.bin 2 +260_00012.bin 2 t +263_00025.bin 2 +265_00011.bin 2 +265_00028.bin 2 +265_00035.bin 2 +265_00038.bin 2 +265_00040.bin 2 +265_00042.bin 2 +272_00027.bin 2 t +272_00041.bin 2 t +276_00007.bin 2 +279_00011.bin 2 +623_00008.bin 2 +015_00008.bin 3 +025_00006.bin 3 +041_00012.bin 3 +047_00008.bin 3 +047_00011.bin 3 +049_00006.bin 3 t +052_00007.bin 3 t +062_00008.bin 3 +065_00002.bin 3 +076_00010.bin 3 t +082_00007.bin 3 +082_00008.bin 3 +084_00002.bin 3 +086_00006.bin 3 +086_00007.bin 3 +087_00005.bin 3 +093_00009.bin 3 +098_00002.bin 3 +201_00001.bin 3 +201_00004.bin 3 +207_00002.bin 3 +209_00001.bin 3 +213_00003.bin 3 +213_00006.bin 3 +217_00013.bin 3 +225_00004.bin 3 +225_00005.bin 3 +225_00007.bin 3 +227_00007.bin 3 t +243_00002.bin 3 +243_00004.bin 3 +249_00002.bin 3 t +252_00002.bin 3 t +252_00007.bin 3 t +255_00002.bin 3 t +260_00000.bin 3 t +260_00003.bin 3 t +260_00005.bin 3 t +260_00007.bin 3 t +260_00008.bin 3 t +265_00006.bin 3 +276_00000.bin 3 +276_00006.bin 3 +276_00008.bin 3 +279_00004.bin 3 +700_00001.bin 3 t +700_00004.bin 3 t +700_00005.bin 3 t +700_00009.bin 3 t +700_00010.bin 3 t +005_00008.bin 4 +014_00009.bin 4 +021_00011.bin 4 +025_00003.bin 4 +025_00007.bin 4 +030_00008.bin 4 +030_00012.bin 4 +030_00013.bin 4 +030_00014.bin 4 +032_00007.bin 4 +032_00008.bin 4 +032_00009.bin 4 +036_00009.bin 4 +036_00010.bin 4 +036_00011.bin 4 +036_00013.bin 4 +038_00011.bin 4 +038_00012.bin 4 +038_00014.bin 4 +038_00015.bin 4 +038_00016.bin 4 +041_00010.bin 4 t +041_00013.bin 4 t +041_00015.bin 4 t +043_00010.bin 4 t +043_00011.bin 4 t +045_00009.bin 4 +045_00011.bin 4 +045_00013.bin 4 +045_00014.bin 4 +045_00016.bin 4 +047_00006.bin 4 +047_00007.bin 4 +047_00009.bin 4 +047_00010.bin 4 +049_00003.bin 4 +049_00004.bin 4 +052_00008.bin 4 +054_00006.bin 4 +054_00007.bin 4 +054_00009.bin 4 +054_00012.bin 4 +054_00013.bin 4 +054_00014.bin 4 +054_00016.bin 4 +054_00017.bin 4 +054_00018.bin 4 +057_00007.bin 4 +065_00006.bin 4 +065_00007.bin 4 +065_00009.bin 4 +065_00011.bin 4 +069_00010.bin 4 +073_00005.bin 4 +073_00013.bin 4 +074_00009.bin 4 +076_00012.bin 4 +076_00013.bin 4 +076_00016.bin 4 +076_00017.bin 4 +076_00018.bin 4 +076_00019.bin 4 +076_00021.bin 4 +076_00022.bin 4 +076_00023.bin 4 +076_00028.bin 4 +076_00029.bin 4 +076_00031.bin 4 +076_00034.bin 4 +076_00037.bin 4 +078_00010.bin 4 +080_00005.bin 4 +080_00006.bin 4 +080_00007.bin 4 +082_00009.bin 4 t +082_00011.bin 4 t +082_00014.bin 4 t +084_00004.bin 4 +084_00008.bin 4 +086_00001.bin 4 +086_00008.bin 4 +087_00001.bin 4 t +087_00003.bin 4 t +087_00004.bin 4 t +087_00011.bin 4 t +093_00006.bin 4 +096_00008.bin 4 t +109_00007.bin 4 +201_00009.bin 4 +201_00010.bin 4 +201_00013.bin 4 +201_00015.bin 4 +201_00021.bin 4 +202_00003.bin 4 +202_00004.bin 4 +202_00005.bin 4 +202_00007.bin 4 +202_00008.bin 4 +202_00009.bin 4 +202_00010.bin 4 +202_00011.bin 4 +202_00012.bin 4 +202_00013.bin 4 +202_00015.bin 4 +202_00016.bin 4 +202_00017.bin 4 +202_00020.bin 4 +205_00005.bin 4 +205_00006.bin 4 +205_00010.bin 4 +206_00007.bin 4 +206_00008.bin 4 +206_00010.bin 4 +206_00011.bin 4 +206_00013.bin 4 +206_00014.bin 4 +206_00015.bin 4 +206_00016.bin 4 +206_00018.bin 4 +206_00019.bin 4 +206_00020.bin 4 +206_00021.bin 4 +206_00022.bin 4 +206_00024.bin 4 +206_00027.bin 4 +209_00006.bin 4 +213_00012.bin 4 +213_00014.bin 4 +213_00018.bin 4 +223_00003.bin 4 +223_00004.bin 4 +223_00006.bin 4 +223_00007.bin 4 +227_00008.bin 4 +227_00009.bin 4 +231_00005.bin 4 +231_00006.bin 4 +231_00007.bin 4 +231_00008.bin 4 +234_00007.bin 4 +237_00004.bin 4 +237_00005.bin 4 +246_00004.bin 4 +246_00006.bin 4 +246_00011.bin 4 +251_00006.bin 4 +251_00011.bin 4 +251_00013.bin 4 +251_00017.bin 4 +251_00019.bin 4 +263_00011.bin 4 +263_00014.bin 4 +270_00006.bin 4 +272_00006.bin 4 +272_00008.bin 4 +272_00009.bin 4 +272_00010.bin 4 +273_00004.bin 4 +279_00007.bin 4 +279_00008.bin 4 +308_00011.bin 4 +308_00012.bin 4 +308_00013.bin 4 +308_00015.bin 4 +308_00017.bin 4 +322_00009.bin 4 +322_00011.bin 4 +322_00012.bin 4 +522_00005.bin 4 +609_00004.bin 4 +609_00005.bin 4 +609_00006.bin 4 +609_00007.bin 4 +609_00008.bin 4 +609_00009.bin 4 +609_00010.bin 4 +609_00011.bin 4 +609_00012.bin 4 +609_00014.bin 4 +609_00016.bin 4 +609_00018.bin 4 +609_00019.bin 4 +609_00020.bin 4 +609_00021.bin 4 +613_00000.bin 4 t +613_00001.bin 4 t +613_00002.bin 4 t +613_00004.bin 4 t +613_00005.bin 4 t +613_00007.bin 4 t +613_00010.bin 4 t +614_00004.bin 4 +621_00001.bin 4 t +621_00005.bin 4 t +621_00006.bin 4 t +621_00007.bin 4 t +621_00009.bin 4 t +621_00010.bin 4 t +621_00011.bin 4 t +621_00012.bin 4 t +621_00013.bin 4 t +623_00002.bin 4 +623_00004.bin 4 +623_00005.bin 4 +005_00005.bin 5 t +011_00001.bin 5 t +021_00006.bin 5 t +030_00005.bin 5 +032_00004.bin 5 +036_00002.bin 5 +036_00004.bin 5 +036_00005.bin 5 +036_00006.bin 5 +038_00005.bin 5 t +038_00006.bin 5 t +038_00008.bin 5 t +038_00009.bin 5 t +038_00010.bin 5 t +038_00013.bin 5 t +041_00005.bin 5 +041_00006.bin 5 +041_00009.bin 5 +041_00011.bin 5 +043_00007.bin 5 +045_00005.bin 5 +047_00000.bin 5 +047_00001.bin 5 +047_00002.bin 5 +049_00005.bin 5 +054_00001.bin 5 t +054_00002.bin 5 t +054_00003.bin 5 t +054_00011.bin 5 t +057_00002.bin 5 +057_00003.bin 5 +062_00006.bin 5 +076_00006.bin 5 +076_00009.bin 5 +076_00015.bin 5 +076_00036.bin 5 +080_00002.bin 5 +080_00004.bin 5 +082_00005.bin 5 t +084_00001.bin 5 +086_00000.bin 5 t +109_00005.bin 5 t +201_00003.bin 5 t +201_00005.bin 5 t +201_00006.bin 5 t +206_00005.bin 5 +227_00006.bin 5 +231_00004.bin 5 +231_00009.bin 5 +234_00003.bin 5 +234_00004.bin 5 +246_00002.bin 5 +272_00003.bin 5 +308_00004.bin 5 t +522_00001.bin 5 t +014_00004.bin 6 +014_00013.bin 6 +015_00009.bin 6 +021_00018.bin 6 +025_00009.bin 6 +030_00026.bin 6 +030_00027.bin 6 +036_00018.bin 6 t +036_00022.bin 6 t +036_00024.bin 6 t +036_00028.bin 6 t +036_00033.bin 6 t +036_00034.bin 6 t +038_00019.bin 6 +038_00021.bin 6 +038_00029.bin 6 +038_00030.bin 6 +038_00034.bin 6 +038_00035.bin 6 +038_00037.bin 6 +038_00038.bin 6 +041_00019.bin 6 +041_00021.bin 6 +041_00025.bin 6 +041_00029.bin 6 +041_00031.bin 6 +041_00032.bin 6 +041_00033.bin 6 +041_00035.bin 6 +043_00013.bin 6 t +047_00017.bin 6 +047_00018.bin 6 +047_00025.bin 6 +049_00009.bin 6 +052_00011.bin 6 +054_00025.bin 6 +054_00028.bin 6 +054_00032.bin 6 +054_00036.bin 6 +057_00011.bin 6 +057_00014.bin 6 +057_00015.bin 6 +057_00016.bin 6 +065_00008.bin 6 +069_00012.bin 6 t +069_00014.bin 6 t +069_00015.bin 6 t +069_00016.bin 6 t +069_00017.bin 6 t +071_00006.bin 6 t +073_00010.bin 6 +073_00016.bin 6 +074_00025.bin 6 +076_00038.bin 6 +076_00039.bin 6 +076_00040.bin 6 +076_00041.bin 6 +076_00042.bin 6 +076_00043.bin 6 +078_00013.bin 6 +078_00014.bin 6 +080_00009.bin 6 +080_00018.bin 6 +086_00021.bin 6 +086_00023.bin 6 +086_00027.bin 6 +089_00018.bin 6 t +093_00015.bin 6 +096_00018.bin 6 +098_00005.bin 6 t +201_00007.bin 6 +201_00008.bin 6 +201_00018.bin 6 +201_00026.bin 6 +206_00030.bin 6 +206_00031.bin 6 +209_00015.bin 6 +209_00025.bin 6 +217_00015.bin 6 +231_00016.bin 6 +231_00017.bin 6 +231_00021.bin 6 +231_00023.bin 6 +231_00026.bin 6 +231_00027.bin 6 +231_00029.bin 6 +237_00012.bin 6 +246_00016.bin 6 +263_00015.bin 6 +265_00020.bin 6 +272_00011.bin 6 +522_00006.bin 6 +005_00004.bin 7 +005_00006.bin 7 +014_00002.bin 7 +021_00008.bin 7 t +032_00005.bin 7 +038_00004.bin 7 +043_00008.bin 7 +047_00004.bin 7 +074_00001.bin 7 t +076_00005.bin 7 +082_00006.bin 7 +089_00004.bin 7 +096_00002.bin 7 +096_00004.bin 7 +096_00005.bin 7 +096_00007.bin 7 +109_00004.bin 7 t +207_00003.bin 7 +213_00004.bin 7 +213_00008.bin 7 +225_00003.bin 7 +234_00002.bin 7 +234_00006.bin 7 +237_00003.bin 7 t +246_00001.bin 7 +246_00003.bin 7 +246_00007.bin 7 +251_00002.bin 7 +251_00004.bin 7 +252_00003.bin 7 t +263_00004.bin 7 t +265_00001.bin 7 +273_00003.bin 7 +276_00002.bin 7 +279_00005.bin 7 +700_00002.bin 7 t +014_00001.bin 8 +014_00003.bin 8 +021_00007.bin 8 +025_00005.bin 8 +041_00003.bin 8 t +041_00004.bin 8 t +045_00004.bin 8 +047_00005.bin 8 t +047_00012.bin 8 t +047_00013.bin 8 t +049_00012.bin 8 t +054_00010.bin 8 +073_00006.bin 8 +074_00004.bin 8 +074_00006.bin 8 +074_00007.bin 8 +076_00002.bin 8 t +076_00033.bin 8 t +082_00013.bin 8 +086_00003.bin 8 +086_00017.bin 8 +089_00005.bin 8 +096_00003.bin 8 +096_00011.bin 8 +096_00012.bin 8 +201_00002.bin 8 +201_00012.bin 8 +201_00016.bin 8 +201_00017.bin 8 +201_00019.bin 8 +201_00022.bin 8 +201_00023.bin 8 +201_00025.bin 8 +206_00006.bin 8 +209_00010.bin 8 +217_00004.bin 8 +217_00008.bin 8 +231_00028.bin 8 +237_00002.bin 8 t +240_00006.bin 8 +246_00005.bin 8 +249_00004.bin 8 t +251_00001.bin 8 t +263_00012.bin 8 +265_00015.bin 8 t +272_00001.bin 8 +272_00007.bin 8 +276_00005.bin 8 +308_00003.bin 8 t +308_00006.bin 8 t +322_00002.bin 8 t +614_00001.bin 8 +014_00007.bin 9 t +021_00012.bin 9 +025_00004.bin 9 +030_00021.bin 9 +032_00011.bin 9 +032_00013.bin 9 +045_00007.bin 9 +049_00002.bin 9 t +054_00008.bin 9 +061_00006.bin 9 +061_00007.bin 9 +062_00007.bin 9 +065_00001.bin 9 t +069_00003.bin 9 t +069_00004.bin 9 t +069_00007.bin 9 t +071_00002.bin 9 t +071_00003.bin 9 t +073_00003.bin 9 +074_00002.bin 9 t +076_00026.bin 9 +076_00027.bin 9 +076_00032.bin 9 +076_00035.bin 9 +078_00004.bin 9 +082_00016.bin 9 +089_00002.bin 9 +089_00003.bin 9 +093_00007.bin 9 +096_00037.bin 9 +202_00000.bin 9 +205_00002.bin 9 +205_00003.bin 9 +205_00004.bin 9 +206_00003.bin 9 +206_00004.bin 9 +207_00009.bin 9 +209_00004.bin 9 +213_00007.bin 9 +213_00017.bin 9 +217_00003.bin 9 +217_00007.bin 9 +223_00005.bin 9 +223_00017.bin 9 +240_00008.bin 9 t +246_00010.bin 9 +249_00003.bin 9 +251_00012.bin 9 +252_00004.bin 9 t +252_00005.bin 9 t +263_00023.bin 9 t +265_00012.bin 9 t +270_00005.bin 9 +272_00013.bin 9 +273_00001.bin 9 +286_00005.bin 9 +294_00005.bin 9 +308_00001.bin 9 +308_00005.bin 9 +308_00008.bin 9 +322_00008.bin 9 +609_00001.bin 9 +609_00017.bin 9 +613_00008.bin 9 t +613_00009.bin 9 t +613_00011.bin 9 t +614_00002.bin 9 +623_00003.bin 9 +014_00014.bin 0 +036_00019.bin 0 +047_00015.bin 0 +087_00018.bin 0 +089_00015.bin 0 +206_00029.bin 0 +231_00018.bin 0 +246_00015.bin 0 t +252_00011.bin 0 +005_00012.bin 1 t +057_00012.bin 1 t +065_00015.bin 1 +080_00016.bin 1 +092_00008.bin 1 +096_00015.bin 1 +206_00028.bin 1 +209_00017.bin 1 +240_00010.bin 1 +255_00007.bin 1 +032_00014.bin 2 +041_00047.bin 2 +047_00020.bin 2 +073_00008.bin 2 +074_00019.bin 2 +078_00009.bin 2 +086_00012.bin 2 +087_00002.bin 2 t +087_00015.bin 2 t +093_00026.bin 2 +096_00027.bin 2 +209_00026.bin 2 t +213_00020.bin 2 t +223_00009.bin 2 +251_00010.bin 2 +005_00010.bin 3 +052_00004.bin 3 t +065_00004.bin 3 +084_00003.bin 3 +086_00010.bin 3 +089_00009.bin 3 +213_00009.bin 3 +237_00007.bin 3 +255_00001.bin 3 t +265_00003.bin 3 +005_00007.bin 4 +011_00007.bin 4 +030_00020.bin 4 +032_00010.bin 4 +036_00015.bin 4 +041_00008.bin 4 t +041_00014.bin 4 t +045_00010.bin 4 +052_00009.bin 4 +057_00005.bin 4 +074_00008.bin 4 +076_00014.bin 4 +076_00020.bin 4 +076_00025.bin 4 +078_00008.bin 4 +084_00006.bin 4 +096_00010.bin 4 t +201_00014.bin 4 +202_00006.bin 4 +206_00009.bin 4 +206_00012.bin 4 +209_00003.bin 4 +213_00013.bin 4 +231_00010.bin 4 +249_00005.bin 4 +252_00008.bin 4 +322_00010.bin 4 +609_00015.bin 4 +613_00003.bin 4 t +621_00008.bin 4 t +623_00006.bin 4 +005_00001.bin 5 t +025_00000.bin 5 +036_00007.bin 5 +038_00007.bin 5 t +041_00001.bin 5 +041_00017.bin 5 +052_00002.bin 5 +054_00004.bin 5 t +076_00008.bin 5 +078_00002.bin 5 +084_00000.bin 5 +096_00006.bin 5 +209_00002.bin 5 +231_00001.bin 5 +237_00006.bin 5 +005_00016.bin 6 t +025_00008.bin 6 +032_00012.bin 6 +036_00030.bin 6 t +038_00025.bin 6 +041_00026.bin 6 +041_00034.bin 6 +052_00010.bin 6 +057_00013.bin 6 +069_00013.bin 6 t +071_00007.bin 6 t +082_00015.bin 6 +096_00009.bin 6 +209_00008.bin 6 +231_00025.bin 6 +005_00003.bin 7 +011_00003.bin 7 +073_00001.bin 7 +089_00006.bin 7 +225_00002.bin 7 +240_00002.bin 7 t +249_00001.bin 7 +251_00005.bin 7 +276_00004.bin 7 +005_00002.bin 8 +025_00002.bin 8 +047_00016.bin 8 t +054_00000.bin 8 +074_00003.bin 8 +078_00001.bin 8 +093_00004.bin 8 +217_00001.bin 8 +234_00001.bin 8 t +272_00002.bin 8 +030_00007.bin 9 +036_00012.bin 9 +052_00006.bin 9 +066_00002.bin 9 +069_00005.bin 9 t +076_00003.bin 9 +087_00000.bin 9 +093_00012.bin 9 +206_00002.bin 9 +217_00012.bin 9 +251_00000.bin 9 +272_00004.bin 9 +279_00006.bin 9 +609_00002.bin 9 +621_00002.bin 9 t +005_00000.bin 10 +014_00000.bin 10 +016_00000.bin 10 t +021_00005.bin 10 +049_00000.bin 10 +089_00001.bin 10 +093_00001.bin 10 +096_00001.bin 10 +109_00002.bin 10 t +227_00005.bin 10 +234_00000.bin 10 +237_00000.bin 10 t +240_00001.bin 10 t +246_00000.bin 10 +249_00000.bin 10 +252_00000.bin 10 +265_00004.bin 10 +273_00000.bin 10 +014_00006.bin 13 +015_00003.bin 13 +015_00007.bin 13 +016_00005.bin 13 +030_00006.bin 13 +036_00003.bin 13 +041_00000.bin 13 +061_00000.bin 13 t +076_00001.bin 13 +076_00004.bin 13 +080_00003.bin 13 +098_00001.bin 13 t +098_00003.bin 13 t +098_00004.bin 13 t +206_00001.bin 13 t +263_00000.bin 13 +263_00001.bin 13 +272_00000.bin 13 +286_00000.bin 13 +286_00001.bin 13 +286_00002.bin 13 +286_00003.bin 13 +286_00004.bin 13 +286_00006.bin 13 +286_00008.bin 13 +286_00009.bin 13 +294_00001.bin 13 +294_00002.bin 13 +294_00003.bin 13 +294_00004.bin 13 +065_00014.bin 12 +207_00007.bin 12 +260_00009.bin 12 +700_00011.bin 12 t +014_00012.bin 11 +014_00015.bin 11 +015_00013.bin 11 +016_00009.bin 11 +016_00010.bin 11 +016_00011.bin 11 +016_00013.bin 11 +021_00016.bin 11 +036_00027.bin 11 +036_00036.bin 11 +049_00015.bin 11 +089_00012.bin 11 +089_00014.bin 11 +096_00013.bin 11 t +227_00011.bin 11 +240_00011.bin 11 +246_00013.bin 11 +263_00019.bin 11 t +263_00020.bin 11 t +263_00022.bin 11 t +272_00021.bin 11 +272_00024.bin 11 +272_00025.bin 11 +272_00031.bin 11 +272_00035.bin 11 +273_00006.bin 11 +scene0000_00_00032.bin 4 t +scene0000_00_00034.bin 4 t +scene0000_00_00042.bin 4 t +scene0000_00_00043.bin 4 t +scene0002_00_00012.bin 4 t +scene0002_00_00013.bin 4 t +scene0004_00_00008.bin 4 +scene0006_00_00007.bin 4 t +scene0006_00_00009.bin 4 t +scene0008_00_00005.bin 13 +scene0010_00_00009.bin 4 t +scene0012_00_00004.bin 4 +scene0012_00_00005.bin 4 +scene0012_00_00006.bin 4 +scene0012_00_00008.bin 4 +scene0013_00_00002.bin 13 +scene0013_00_00003.bin 13 +scene0013_00_00004.bin 13 +scene0015_00_00016.bin 4 +scene0017_00_00014.bin 4 +scene0021_00_00002.bin 13 +scene0021_00_00003.bin 13 +scene0021_00_00004.bin 13 +scene0021_00_00007.bin 13 +scene0024_00_00005.bin 13 t +scene0024_00_00010.bin 4 +scene0028_00_00006.bin 13 t +scene0028_00_00007.bin 13 t +scene0028_00_00009.bin 13 t +scene0028_00_00011.bin 13 t +scene0030_00_00008.bin 13 t +scene0030_00_00020.bin 4 +scene0030_00_00023.bin 4 +scene0030_00_00027.bin 4 +scene0033_00_00002.bin 13 +scene0033_00_00003.bin 13 +scene0033_00_00006.bin 13 +scene0033_00_00007.bin 13 +scene0033_00_00008.bin 13 +scene0033_00_00009.bin 13 +scene0033_00_00011.bin 13 +scene0038_00_00004.bin 4 +scene0038_00_00005.bin 4 +scene0038_00_00006.bin 4 +scene0038_00_00009.bin 4 +scene0038_00_00013.bin 4 +scene0038_00_00016.bin 4 +scene0043_00_00005.bin 4 t +scene0046_00_00008.bin 4 +scene0048_00_00004.bin 4 +scene0049_00_00007.bin 13 +scene0050_00_00008.bin 13 +scene0050_00_00012.bin 4 +scene0054_00_00032.bin 4 +scene0056_00_00013.bin 4 +scene0056_00_00015.bin 4 +scene0056_00_00016.bin 4 +scene0056_00_00017.bin 4 +scene0056_00_00021.bin 4 +scene0056_00_00022.bin 4 +scene0057_00_00009.bin 4 +scene0058_00_00007.bin 4 t +scene0059_00_00008.bin 4 +scene0059_00_00011.bin 4 +scene0059_00_00013.bin 4 +scene0059_00_00014.bin 4 +scene0059_00_00016.bin 4 +scene0059_00_00019.bin 13 +scene0059_00_00020.bin 4 +scene0063_00_00011.bin 4 t +scene0064_00_00002.bin 13 +scene0066_00_00007.bin 4 +scene0066_00_00008.bin 4 +scene0066_00_00009.bin 4 +scene0066_00_00012.bin 4 +scene0066_00_00013.bin 4 +scene0066_00_00014.bin 4 +scene0070_00_00007.bin 4 +scene0075_00_00005.bin 4 +scene0076_00_00008.bin 4 +scene0076_00_00010.bin 4 +scene0079_00_00011.bin 4 +scene0079_00_00012.bin 4 +scene0079_00_00014.bin 4 +scene0082_00_00005.bin 4 +scene0085_00_00009.bin 4 +scene0087_00_00009.bin 9 +scene0088_00_00004.bin 4 +scene0088_00_00006.bin 4 +scene0088_00_00009.bin 4 +scene0088_00_00010.bin 4 +scene0088_00_00011.bin 4 +scene0088_00_00013.bin 4 +scene0088_00_00016.bin 4 +scene0088_00_00021.bin 4 +scene0089_00_00006.bin 4 +scene0095_00_00007.bin 4 t +scene0098_00_00009.bin 4 +scene0098_00_00010.bin 4 +scene0101_00_00020.bin 4 +scene0103_00_00006.bin 4 +scene0103_00_00008.bin 4 +scene0103_00_00010.bin 4 +scene0106_00_00015.bin 4 +scene0107_00_00005.bin 13 t +scene0108_00_00008.bin 4 +scene0114_00_00010.bin 4 t +scene0114_00_00011.bin 4 t +scene0114_00_00012.bin 4 t +scene0122_00_00005.bin 4 +scene0122_00_00006.bin 4 +scene0122_00_00007.bin 4 +scene0126_00_00005.bin 4 +scene0126_00_00007.bin 4 +scene0126_00_00010.bin 4 +scene0129_00_00005.bin 13 +scene0129_00_00006.bin 13 +scene0131_00_00010.bin 4 +scene0131_00_00012.bin 4 +scene0132_00_00007.bin 4 t +scene0132_00_00010.bin 4 t +scene0132_00_00013.bin 13 +scene0132_00_00014.bin 4 t +scene0132_00_00015.bin 4 t +scene0133_00_00002.bin 4 +scene0133_00_00003.bin 4 +scene0133_00_00004.bin 4 +scene0133_00_00005.bin 4 +scene0134_00_00005.bin 4 +scene0134_00_00007.bin 4 +scene0134_00_00008.bin 4 +scene0138_00_00014.bin 4 +scene0138_00_00016.bin 4 +scene0138_00_00018.bin 4 +scene0138_00_00024.bin 4 +scene0140_00_00011.bin 4 +scene0140_00_00014.bin 4 +scene0140_00_00017.bin 4 +scene0140_00_00018.bin 4 +scene0140_00_00019.bin 4 +scene0140_00_00020.bin 4 +scene0140_00_00021.bin 4 +scene0140_00_00022.bin 4 +scene0140_00_00023.bin 4 +scene0140_00_00024.bin 4 +scene0140_00_00025.bin 4 +scene0140_00_00026.bin 4 +scene0140_00_00028.bin 4 +scene0140_00_00029.bin 4 +scene0140_00_00030.bin 4 +scene0140_00_00031.bin 4 +scene0140_00_00032.bin 4 +scene0140_00_00034.bin 4 +scene0141_00_00010.bin 4 +scene0141_00_00011.bin 4 +scene0141_00_00013.bin 4 +scene0143_00_00004.bin 13 +scene0144_00_00011.bin 4 +scene0144_00_00012.bin 4 +scene0145_00_00007.bin 4 t +scene0149_00_00015.bin 4 +scene0150_00_00004.bin 4 t +scene0152_00_00011.bin 4 +scene0152_00_00012.bin 4 +scene0152_00_00015.bin 4 +scene0152_00_00017.bin 4 +scene0155_00_00009.bin 4 +scene0155_00_00010.bin 4 +scene0155_00_00011.bin 4 +scene0155_00_00012.bin 4 +scene0156_00_00010.bin 4 t +scene0156_00_00011.bin 4 t +scene0159_00_00006.bin 4 +scene0160_00_00006.bin 4 t +scene0161_00_00004.bin 4 +scene0163_00_00004.bin 4 t +scene0163_00_00005.bin 4 t +scene0163_00_00007.bin 4 t +scene0163_00_00008.bin 4 t +scene0163_00_00010.bin 4 t +scene0165_00_00003.bin 13 +scene0165_00_00004.bin 13 +scene0168_00_00015.bin 4 t +scene0171_00_00005.bin 4 +scene0171_00_00006.bin 4 +scene0171_00_00007.bin 4 +scene0171_00_00008.bin 4 +scene0171_00_00009.bin 4 +scene0171_00_00010.bin 4 +scene0177_00_00009.bin 4 t +scene0177_00_00010.bin 4 t +scene0178_00_00011.bin 4 +scene0001_00_00012.bin 9 t +scene0001_00_00016.bin 9 t +scene0001_00_00019.bin 9 t +scene0002_00_00024.bin 9 +scene0013_00_00005.bin 9 t +scene0022_00_00003.bin 9 +scene0022_00_00005.bin 9 +scene0022_00_00006.bin 9 +scene0024_00_00004.bin 9 +scene0035_00_00008.bin 9 +scene0038_00_00003.bin 9 +scene0050_00_00007.bin 5 +scene0053_00_00005.bin 9 +scene0054_00_00046.bin 9 +scene0064_00_00003.bin 9 +scene0082_00_00001.bin 9 +scene0082_00_00002.bin 9 +scene0091_00_00004.bin 9 +scene0101_00_00016.bin 9 +scene0102_00_00004.bin 9 +scene0106_00_00009.bin 9 t +scene0106_00_00012.bin 9 t +scene0111_00_00008.bin 9 +scene0127_00_00017.bin 9 +scene0129_00_00007.bin 9 t +scene0132_00_00009.bin 4 t +scene0136_00_00010.bin 3 t +scene0137_00_00007.bin 9 +scene0138_00_00006.bin 9 +scene0140_00_00004.bin 9 +scene0151_00_00007.bin 9 +scene0152_00_00010.bin 9 +scene0152_00_00014.bin 9 +scene0155_00_00003.bin 9 +scene0155_00_00004.bin 9 +scene0155_00_00008.bin 9 +scene0155_00_00013.bin 9 +scene0155_00_00015.bin 9 +scene0157_00_00007.bin 9 t +scene0162_00_00006.bin 9 +scene0163_00_00002.bin 9 +scene0178_00_00007.bin 9 +scene0181_00_00018.bin 9 t +scene0181_00_00025.bin 9 t +scene0187_00_00004.bin 9 +scene0187_00_00005.bin 9 +scene0187_00_00008.bin 9 +scene0199_00_00004.bin 9 +scene0203_00_00011.bin 9 +scene0203_00_00014.bin 9 +scene0205_00_00005.bin 9 +scene0209_00_00010.bin 9 t +scene0212_00_00003.bin 9 t +scene0213_00_00010.bin 9 +scene0213_00_00015.bin 9 +scene0226_00_00007.bin 9 +scene0226_00_00011.bin 9 +scene0230_00_00008.bin 9 +scene0235_00_00013.bin 9 +scene0235_00_00021.bin 9 +scene0239_00_00007.bin 9 +scene0246_00_00008.bin 9 +scene0246_00_00018.bin 9 +scene0251_00_00005.bin 9 t +scene0251_00_00006.bin 9 t +scene0259_00_00008.bin 9 t +scene0266_00_00004.bin 9 +scene0266_00_00005.bin 9 +scene0267_00_00002.bin 9 +scene0270_00_00010.bin 9 t +scene0272_00_00009.bin 9 +scene0276_00_00009.bin 9 +scene0276_00_00015.bin 9 +scene0279_00_00012.bin 9 +scene0279_00_00021.bin 9 +scene0281_00_00006.bin 9 t +scene0288_00_00007.bin 9 +scene0295_00_00006.bin 9 +scene0295_00_00007.bin 9 +scene0297_00_00006.bin 3 +scene0297_00_00008.bin 9 +scene0300_00_00002.bin 9 +scene0300_00_00003.bin 9 +scene0301_00_00006.bin 9 +scene0307_00_00009.bin 8 +scene0309_00_00004.bin 5 +scene0315_00_00013.bin 9 +scene0315_00_00025.bin 9 +scene0317_00_00010.bin 9 t +scene0322_00_00002.bin 9 +scene0324_00_00003.bin 9 +scene0336_00_00004.bin 5 +scene0340_00_00011.bin 9 +scene0342_00_00005.bin 9 +scene0355_00_00007.bin 9 t +scene0355_00_00008.bin 9 t +scene0357_00_00013.bin 9 +scene0358_00_00003.bin 9 +scene0358_00_00020.bin 9 +scene0362_00_00012.bin 9 +scene0363_00_00013.bin 9 t +scene0370_00_00017.bin 9 t +scene0385_00_00006.bin 3 +scene0386_00_00008.bin 9 +scene0387_00_00009.bin 9 +scene0389_00_00008.bin 9 +scene0390_00_00002.bin 9 +scene0404_00_00006.bin 9 +scene0407_00_00006.bin 9 +scene0418_00_00010.bin 3 +scene0424_00_00005.bin 5 +scene0430_00_00002.bin 9 +scene0432_00_00003.bin 9 +scene0451_00_00007.bin 9 +scene0455_00_00005.bin 9 +scene0461_00_00005.bin 9 +scene0465_00_00006.bin 9 +scene0472_00_00009.bin 9 +scene0476_00_00008.bin 9 +scene0477_00_00020.bin 9 t +scene0481_00_00005.bin 9 +scene0481_00_00006.bin 9 +scene0481_00_00007.bin 9 +scene0481_00_00011.bin 9 +scene0487_00_00017.bin 9 +scene0487_00_00019.bin 9 +scene0495_00_00001.bin 9 t +scene0495_00_00002.bin 9 t +scene0499_00_00006.bin 9 +scene0499_00_00016.bin 9 +scene0500_00_00008.bin 9 t +scene0507_00_00005.bin 9 +scene0514_00_00007.bin 9 +scene0518_00_00004.bin 9 +scene0529_00_00016.bin 9 +scene0537_00_00004.bin 9 +scene0542_00_00006.bin 9 +scene0547_00_00013.bin 9 t +scene0549_00_00009.bin 9 +scene0549_00_00010.bin 9 +scene0549_00_00012.bin 9 +scene0549_00_00013.bin 9 +scene0558_00_00011.bin 9 +scene0572_00_00004.bin 9 +scene0574_00_00005.bin 9 +scene0588_00_00016.bin 9 +scene0588_00_00017.bin 9 +scene0588_00_00018.bin 9 +scene0588_00_00021.bin 9 +scene0598_00_00003.bin 9 +scene0599_00_00003.bin 9 +scene0601_00_00010.bin 9 +scene0603_00_00007.bin 9 +scene0603_00_00009.bin 5 +scene0603_00_00016.bin 9 +scene0617_00_00007.bin 9 +scene0622_00_00001.bin 9 t +scene0626_00_00003.bin 9 +scene0627_00_00002.bin 9 +scene0638_00_00001.bin 9 +scene0640_00_00006.bin 9 +scene0641_00_00008.bin 9 +scene0646_00_00009.bin 9 +scene0646_00_00017.bin 9 +scene0000_00_00019.bin 5 +scene0006_00_00005.bin 5 +scene0032_00_00005.bin 5 +scene0035_00_00005.bin 5 +scene0040_00_00003.bin 5 +scene0043_00_00003.bin 5 +scene0050_00_00022.bin 5 +scene0055_00_00002.bin 5 t +scene0078_00_00002.bin 5 +scene0089_00_00004.bin 5 +scene0091_00_00005.bin 5 t +scene0094_00_00006.bin 5 +scene0101_00_00006.bin 5 +scene0108_00_00003.bin 5 +scene0108_00_00005.bin 5 +scene0110_00_00006.bin 5 +scene0123_00_00002.bin 9 +scene0123_00_00003.bin 9 +scene0123_00_00004.bin 9 +scene0123_00_00005.bin 9 +scene0126_00_00004.bin 5 +scene0127_00_00008.bin 5 +scene0127_00_00009.bin 5 +scene0155_00_00002.bin 5 +scene0166_00_00005.bin 5 +scene0174_00_00006.bin 5 +scene0193_00_00003.bin 5 +scene0207_00_00005.bin 5 t +scene0211_00_00004.bin 5 +scene0217_00_00006.bin 5 +scene0217_00_00008.bin 5 +scene0222_00_00003.bin 5 +scene0222_00_00004.bin 5 +scene0231_00_00015.bin 5 +scene0233_00_00005.bin 5 +scene0266_00_00002.bin 5 +scene0266_00_00006.bin 5 +scene0266_00_00009.bin 5 +scene0266_00_00018.bin 9 +scene0272_00_00007.bin 5 +scene0287_00_00003.bin 5 +scene0293_00_00000.bin 5 +scene0320_00_00004.bin 5 +scene0333_00_00002.bin 5 +scene0336_00_00006.bin 5 +scene0341_00_00003.bin 5 t +scene0353_00_00007.bin 5 +scene0370_00_00003.bin 5 +scene0376_00_00004.bin 5 +scene0378_00_00005.bin 5 +scene0378_00_00007.bin 5 +scene0378_00_00010.bin 5 +scene0383_00_00006.bin 5 +scene0398_00_00004.bin 5 +scene0398_00_00007.bin 5 +scene0400_00_00005.bin 5 t +scene0425_00_00004.bin 5 t +scene0440_00_00007.bin 5 +scene0440_00_00009.bin 5 +scene0443_00_00005.bin 5 +scene0443_00_00009.bin 5 +scene0468_00_00006.bin 5 +scene0468_00_00008.bin 5 +scene0474_00_00005.bin 5 +scene0489_00_00003.bin 5 +scene0505_00_00002.bin 5 +scene0506_00_00004.bin 5 t +scene0515_00_00011.bin 5 +scene0517_00_00009.bin 5 t +scene0517_00_00011.bin 5 t +scene0547_00_00008.bin 5 +scene0554_00_00010.bin 5 +scene0620_00_00004.bin 5 +scene0643_00_00006.bin 5 +scene0643_00_00007.bin 5 +scene0643_00_00008.bin 5 +scene0000_00_00041.bin 0 +scene0043_00_00007.bin 0 +scene0050_00_00017.bin 0 +scene0054_00_00041.bin 0 t +scene0054_00_00049.bin 0 t +scene0108_00_00016.bin 0 +scene0130_00_00006.bin 0 +scene0141_00_00017.bin 0 t +scene0174_00_00008.bin 0 +scene0187_00_00013.bin 0 +scene0198_00_00011.bin 0 +scene0217_00_00016.bin 0 +scene0239_00_00008.bin 0 +scene0242_00_00007.bin 0 t +scene0358_00_00018.bin 0 +scene0372_00_00013.bin 0 +scene0388_00_00008.bin 0 +scene0425_00_00016.bin 0 +scene0426_00_00022.bin 0 +scene0430_00_00022.bin 0 t +scene0433_00_00013.bin 0 +scene0456_00_00010.bin 0 +scene0473_00_00008.bin 0 t +scene0493_00_00009.bin 0 +scene0508_00_00016.bin 0 +scene0517_00_00023.bin 0 t +scene0517_00_00027.bin 0 t +scene0517_00_00030.bin 0 t +scene0558_00_00009.bin 0 +scene0580_00_00010.bin 0 +scene0580_00_00011.bin 0 +scene0615_00_00021.bin 0 +scene0627_00_00037.bin 0 +scene0000_00_00012.bin 3 +scene0000_00_00014.bin 3 +scene0000_00_00022.bin 3 +scene0000_00_00023.bin 3 +scene0000_00_00028.bin 3 +scene0000_00_00033.bin 3 +scene0002_00_00004.bin 3 +scene0002_00_00015.bin 8 t +scene0002_00_00018.bin 8 t +scene0003_00_00003.bin 3 +scene0003_00_00004.bin 3 +scene0003_00_00005.bin 3 +scene0003_00_00007.bin 3 +scene0003_00_00008.bin 3 +scene0003_00_00011.bin 3 +scene0007_00_00001.bin 3 +scene0010_00_00008.bin 5 +scene0014_00_00005.bin 12 t +scene0018_00_00006.bin 3 +scene0024_00_00009.bin 3 +scene0026_00_00009.bin 12 +scene0034_00_00006.bin 3 +scene0035_00_00006.bin 3 +scene0040_00_00014.bin 3 +scene0046_00_00004.bin 3 +scene0047_00_00004.bin 3 +scene0047_00_00009.bin 3 +scene0049_00_00006.bin 3 +scene0051_00_00006.bin 3 +scene0054_00_00030.bin 3 +scene0063_00_00006.bin 3 +scene0063_00_00008.bin 3 +scene0063_00_00017.bin 3 +scene0068_00_00004.bin 3 +scene0072_00_00002.bin 3 +scene0073_00_00005.bin 3 +scene0076_00_00005.bin 3 +scene0080_00_00003.bin 3 +scene0090_00_00004.bin 14 +scene0090_00_00005.bin 14 +scene0090_00_00006.bin 14 +scene0091_00_00008.bin 3 +scene0092_00_00005.bin 3 +scene0092_00_00008.bin 1 +scene0094_00_00003.bin 5 +scene0095_00_00004.bin 3 +scene0097_00_00004.bin 3 +scene0097_00_00005.bin 3 +scene0097_00_00006.bin 3 +scene0097_00_00014.bin 3 +scene0100_00_00002.bin 3 +scene0101_00_00012.bin 3 t +scene0104_00_00006.bin 3 t +scene0108_00_00004.bin 8 +scene0108_00_00007.bin 8 +scene0109_00_00003.bin 3 +scene0110_00_00003.bin 3 +scene0114_00_00002.bin 3 +scene0114_00_00003.bin 3 +scene0114_00_00006.bin 3 +scene0114_00_00014.bin 3 +scene0114_00_00015.bin 3 +scene0114_00_00017.bin 3 +scene0114_00_00021.bin 3 +scene0117_00_00002.bin 3 +scene0117_00_00004.bin 3 +scene0117_00_00005.bin 3 +scene0117_00_00010.bin 3 +scene0121_00_00005.bin 3 +scene0124_00_00005.bin 14 +scene0124_00_00006.bin 3 t +scene0126_00_00008.bin 8 +scene0127_00_00004.bin 3 +scene0127_00_00006.bin 3 +scene0131_00_00014.bin 3 t +scene0147_00_00004.bin 3 +scene0147_00_00007.bin 3 +scene0147_00_00009.bin 3 +scene0147_00_00010.bin 3 +scene0147_00_00012.bin 3 +scene0147_00_00016.bin 3 +scene0149_00_00005.bin 3 +scene0149_00_00009.bin 3 +scene0149_00_00011.bin 3 +scene0149_00_00017.bin 3 +scene0153_00_00005.bin 3 +scene0157_00_00004.bin 3 +scene0158_00_00002.bin 3 t +scene0158_00_00003.bin 3 t +scene0158_00_00006.bin 3 t +scene0158_00_00007.bin 3 t +scene0162_00_00007.bin 8 +scene0164_00_00003.bin 3 t +scene0164_00_00008.bin 3 t +scene0164_00_00010.bin 3 t +scene0164_00_00012.bin 3 t +scene0164_00_00017.bin 3 t +scene0172_00_00003.bin 3 +scene0175_00_00006.bin 3 +scene0181_00_00004.bin 3 t +scene0184_00_00003.bin 3 t +scene0186_00_00004.bin 3 +scene0186_00_00012.bin 3 +scene0188_00_00007.bin 3 t +scene0195_00_00006.bin 3 +scene0200_00_00003.bin 3 t +scene0201_00_00007.bin 3 +scene0204_00_00003.bin 3 t +scene0205_00_00002.bin 3 +scene0205_00_00008.bin 3 +scene0207_00_00008.bin 8 +scene0210_00_00003.bin 3 +scene0211_00_00005.bin 3 +scene0211_00_00006.bin 3 +scene0214_00_00004.bin 3 +scene0214_00_00006.bin 8 +scene0214_00_00011.bin 3 +scene0215_00_00004.bin 3 t +scene0217_00_00004.bin 3 +scene0221_00_00007.bin 3 +scene0221_00_00009.bin 3 +scene0223_00_00002.bin 3 +scene0223_00_00009.bin 5 +scene0224_00_00010.bin 3 +scene0225_00_00006.bin 3 t +scene0225_00_00007.bin 3 t +scene0225_00_00008.bin 3 t +scene0231_00_00013.bin 3 t +scene0232_00_00006.bin 3 +scene0232_00_00009.bin 3 +scene0233_00_00003.bin 3 +scene0233_00_00010.bin 3 +scene0233_00_00011.bin 3 +scene0233_00_00012.bin 3 +scene0236_00_00006.bin 3 +scene0240_00_00003.bin 3 +scene0240_00_00004.bin 3 +scene0240_00_00013.bin 3 +scene0246_00_00006.bin 3 +scene0247_00_00006.bin 3 +scene0247_00_00008.bin 3 +scene0247_00_00014.bin 3 +scene0247_00_00019.bin 3 +scene0250_00_00006.bin 3 +scene0253_00_00002.bin 3 +scene0255_00_00006.bin 3 +scene0255_00_00008.bin 3 +scene0259_00_00004.bin 8 +scene0270_00_00011.bin 3 +scene0271_00_00012.bin 3 +scene0272_00_00008.bin 3 +scene0276_00_00005.bin 3 +scene0276_00_00006.bin 3 +scene0276_00_00013.bin 3 +scene0278_00_00003.bin 3 +scene0278_00_00004.bin 3 +scene0279_00_00010.bin 3 +scene0280_00_00010.bin 3 +scene0282_00_00006.bin 3 +scene0286_00_00009.bin 3 +scene0295_00_00004.bin 3 +scene0295_00_00010.bin 3 +scene0296_00_00010.bin 3 +scene0303_00_00006.bin 3 +scene0304_00_00005.bin 3 +scene0305_00_00010.bin 3 t +scene0309_00_00008.bin 3 t +scene0310_00_00002.bin 3 t +scene0310_00_00003.bin 3 t +scene0311_00_00001.bin 3 +scene0327_00_00007.bin 3 +scene0327_00_00009.bin 3 +scene0335_00_00002.bin 3 +scene0335_00_00007.bin 3 +scene0335_00_00011.bin 3 +scene0335_00_00012.bin 3 +scene0335_00_00023.bin 3 +scene0336_00_00008.bin 3 +scene0337_00_00001.bin 3 +scene0338_00_00002.bin 3 t +scene0338_00_00005.bin 3 t +scene0345_00_00006.bin 3 +scene0348_00_00003.bin 3 +scene0348_00_00004.bin 3 +scene0348_00_00005.bin 3 +scene0350_00_00007.bin 8 +scene0352_00_00009.bin 3 +scene0353_00_00018.bin 3 +scene0356_00_00005.bin 3 +scene0357_00_00002.bin 3 +scene0357_00_00015.bin 3 +scene0361_00_00006.bin 8 +scene0364_00_00004.bin 3 +scene0364_00_00007.bin 3 +scene0364_00_00010.bin 3 +scene0366_00_00002.bin 3 +scene0369_00_00007.bin 3 +scene0369_00_00008.bin 3 +scene0376_00_00005.bin 3 +scene0378_00_00008.bin 8 +scene0378_00_00019.bin 3 +scene0379_00_00004.bin 8 +scene0379_00_00014.bin 3 +scene0379_00_00028.bin 3 +scene0390_00_00005.bin 3 +scene0392_00_00011.bin 3 t +scene0392_00_00013.bin 3 t +scene0392_00_00014.bin 3 t +scene0394_00_00015.bin 3 +scene0395_00_00008.bin 3 +scene0398_00_00013.bin 3 +scene0400_00_00007.bin 3 t +scene0409_00_00003.bin 3 +scene0414_00_00006.bin 3 +scene0419_00_00006.bin 3 +scene0425_00_00002.bin 3 +scene0426_00_00005.bin 3 +scene0431_00_00003.bin 3 +scene0431_00_00004.bin 3 +scene0431_00_00007.bin 3 +scene0431_00_00011.bin 3 +scene0431_00_00012.bin 3 +scene0431_00_00014.bin 3 +scene0438_00_00007.bin 3 +scene0439_00_00002.bin 3 t +scene0439_00_00003.bin 3 t +scene0439_00_00004.bin 3 t +scene0439_00_00011.bin 3 t +scene0439_00_00012.bin 3 t +scene0440_00_00002.bin 3 t +scene0440_00_00013.bin 3 t +scene0444_00_00000.bin 8 +scene0447_00_00003.bin 3 +scene0447_00_00011.bin 12 +scene0449_00_00004.bin 8 +scene0449_00_00006.bin 12 +scene0465_00_00011.bin 3 +scene0467_00_00011.bin 3 +scene0472_00_00004.bin 3 t +scene0472_00_00010.bin 12 +scene0472_00_00018.bin 3 t +scene0476_00_00004.bin 3 t +scene0477_00_00007.bin 3 t +scene0477_00_00008.bin 3 t +scene0477_00_00021.bin 3 t +scene0478_00_00002.bin 3 +scene0479_00_00002.bin 3 +scene0479_00_00003.bin 3 +scene0479_00_00012.bin 3 +scene0482_00_00002.bin 3 +scene0487_00_00022.bin 3 t +scene0488_00_00003.bin 3 +scene0488_00_00004.bin 3 +scene0488_00_00005.bin 3 +scene0488_00_00008.bin 3 +scene0488_00_00011.bin 3 +scene0491_00_00002.bin 3 +scene0492_00_00005.bin 12 +scene0498_00_00010.bin 3 +scene0504_00_00021.bin 3 +scene0505_00_00014.bin 3 +scene0505_00_00018.bin 3 +scene0505_00_00021.bin 3 +scene0506_00_00005.bin 3 +scene0506_00_00009.bin 3 +scene0510_00_00003.bin 12 +scene0511_00_00005.bin 3 +scene0515_00_00010.bin 3 t +scene0517_00_00001.bin 3 +scene0517_00_00013.bin 3 +scene0517_00_00014.bin 3 +scene0517_00_00022.bin 3 +scene0519_00_00003.bin 12 t +scene0521_00_00005.bin 3 +scene0521_00_00013.bin 3 +scene0525_00_00005.bin 3 t +scene0529_00_00003.bin 3 +scene0529_00_00009.bin 3 +scene0529_00_00013.bin 12 +scene0532_00_00014.bin 3 +scene0540_00_00011.bin 3 +scene0541_00_00007.bin 3 +scene0541_00_00008.bin 3 +scene0542_00_00003.bin 3 +scene0546_00_00010.bin 3 +scene0547_00_00003.bin 3 +scene0548_00_00009.bin 3 +scene0556_00_00005.bin 3 +scene0570_00_00005.bin 12 +scene0573_00_00006.bin 3 +scene0577_00_00006.bin 3 +scene0577_00_00007.bin 3 +scene0577_00_00008.bin 3 +scene0580_00_00007.bin 3 +scene0584_00_00005.bin 3 +scene0589_00_00003.bin 3 +scene0589_00_00005.bin 3 +scene0590_00_00009.bin 3 +scene0590_00_00016.bin 3 +scene0591_00_00004.bin 3 t +scene0603_00_00008.bin 8 t +scene0607_00_00003.bin 3 +scene0614_00_00009.bin 3 +scene0615_00_00008.bin 3 +scene0620_00_00005.bin 3 +scene0620_00_00006.bin 3 +scene0623_00_00011.bin 3 +scene0629_00_00004.bin 3 t +scene0631_00_00002.bin 3 +scene0632_00_00003.bin 3 +scene0633_00_00007.bin 3 +scene0642_00_00008.bin 3 +scene0642_00_00020.bin 3 +scene0646_00_00019.bin 8 +scene0005_00_00008.bin 8 +scene0012_00_00003.bin 8 +scene0020_00_00002.bin 8 +scene0020_00_00008.bin 8 +scene0025_00_00007.bin 8 +scene0028_00_00004.bin 8 +scene0028_00_00008.bin 8 +scene0028_00_00013.bin 8 +scene0028_00_00014.bin 8 +scene0028_00_00019.bin 8 +scene0030_00_00001.bin 8 +scene0030_00_00014.bin 8 +scene0030_00_00022.bin 8 +scene0032_00_00003.bin 8 +scene0037_00_00002.bin 8 +scene0037_00_00003.bin 8 +scene0040_00_00002.bin 8 +scene0040_00_00011.bin 8 +scene0049_00_00005.bin 8 +scene0050_00_00014.bin 8 t +scene0051_00_00005.bin 8 +scene0054_00_00003.bin 8 +scene0054_00_00005.bin 8 +scene0054_00_00011.bin 8 +scene0054_00_00014.bin 8 +scene0054_00_00039.bin 8 +scene0072_00_00013.bin 8 +scene0077_00_00001.bin 8 +scene0077_00_00011.bin 8 +scene0079_00_00003.bin 8 +scene0079_00_00004.bin 8 +scene0079_00_00005.bin 8 +scene0079_00_00006.bin 8 +scene0079_00_00007.bin 8 +scene0079_00_00010.bin 8 +scene0092_00_00004.bin 8 +scene0094_00_00005.bin 8 +scene0098_00_00004.bin 8 +scene0098_00_00011.bin 8 +scene0108_00_00012.bin 8 +scene0109_00_00006.bin 8 +scene0131_00_00008.bin 8 +scene0144_00_00013.bin 8 +scene0154_00_00004.bin 8 t +scene0168_00_00020.bin 8 +scene0168_00_00021.bin 8 +scene0177_00_00002.bin 8 +scene0177_00_00004.bin 8 +scene0177_00_00007.bin 8 +scene0181_00_00013.bin 8 +scene0181_00_00014.bin 8 +scene0186_00_00005.bin 8 +scene0186_00_00009.bin 8 +scene0186_00_00015.bin 8 +scene0190_00_00002.bin 8 +scene0190_00_00004.bin 8 +scene0191_00_00001.bin 8 t +scene0194_00_00005.bin 8 +scene0197_00_00002.bin 8 +scene0203_00_00003.bin 8 +scene0203_00_00009.bin 8 +scene0207_00_00019.bin 8 +scene0208_00_00002.bin 8 +scene0208_00_00005.bin 8 +scene0208_00_00006.bin 8 +scene0208_00_00007.bin 8 +scene0208_00_00008.bin 8 +scene0208_00_00009.bin 8 +scene0211_00_00007.bin 8 +scene0217_00_00005.bin 8 +scene0217_00_00009.bin 8 +scene0218_00_00002.bin 8 +scene0223_00_00008.bin 8 +scene0223_00_00010.bin 8 +scene0224_00_00005.bin 8 +scene0231_00_00006.bin 8 t +scene0233_00_00007.bin 8 +scene0233_00_00008.bin 8 +scene0236_00_00005.bin 8 t +scene0236_00_00010.bin 8 t +scene0240_00_00006.bin 8 +scene0241_00_00005.bin 8 +scene0246_00_00011.bin 8 t +scene0253_00_00009.bin 8 t +scene0259_00_00013.bin 8 +scene0262_00_00003.bin 8 +scene0272_00_00002.bin 8 +scene0272_00_00006.bin 8 +scene0286_00_00019.bin 3 +scene0293_00_00003.bin 8 +scene0295_00_00005.bin 8 +scene0301_00_00017.bin 8 +scene0303_00_00003.bin 8 +scene0305_00_00006.bin 8 +scene0305_00_00008.bin 8 +scene0305_00_00009.bin 8 +scene0305_00_00013.bin 8 +scene0309_00_00007.bin 8 +scene0325_00_00003.bin 8 +scene0325_00_00004.bin 8 +scene0332_00_00008.bin 8 +scene0349_00_00004.bin 8 +scene0353_00_00006.bin 8 +scene0353_00_00008.bin 8 +scene0361_00_00002.bin 8 +scene0361_00_00004.bin 8 +scene0377_00_00002.bin 8 +scene0377_00_00004.bin 8 +scene0378_00_00003.bin 8 +scene0378_00_00004.bin 8 +scene0379_00_00006.bin 8 +scene0379_00_00009.bin 8 +scene0382_00_00005.bin 8 t +scene0383_00_00003.bin 8 +scene0392_00_00009.bin 8 +scene0393_00_00003.bin 8 +scene0395_00_00013.bin 8 +scene0398_00_00012.bin 8 +scene0400_00_00003.bin 8 t +scene0404_00_00001.bin 8 +scene0404_00_00005.bin 8 +scene0407_00_00004.bin 8 t +scene0408_00_00004.bin 8 t +scene0422_00_00009.bin 1 +scene0424_00_00003.bin 8 t +scene0425_00_00006.bin 8 +scene0425_00_00022.bin 8 +scene0440_00_00005.bin 8 +scene0440_00_00008.bin 8 +scene0443_00_00008.bin 8 t +scene0443_00_00010.bin 8 t +scene0444_00_00002.bin 8 +scene0451_00_00009.bin 3 t +scene0464_00_00004.bin 8 +scene0465_00_00018.bin 8 +scene0467_00_00003.bin 8 +scene0467_00_00006.bin 8 +scene0467_00_00010.bin 8 +scene0474_00_00006.bin 8 +scene0474_00_00011.bin 8 +scene0481_00_00002.bin 8 +scene0504_00_00003.bin 8 +scene0505_00_00004.bin 8 +scene0506_00_00006.bin 8 +scene0506_00_00007.bin 8 +scene0514_00_00009.bin 8 +scene0515_00_00012.bin 8 t +scene0518_00_00001.bin 8 +scene0521_00_00004.bin 8 +scene0534_00_00003.bin 8 +scene0534_00_00004.bin 8 +scene0542_00_00008.bin 8 +scene0545_00_00003.bin 8 +scene0547_00_00005.bin 8 +scene0554_00_00007.bin 8 t +scene0558_00_00002.bin 8 +scene0565_00_00006.bin 8 +scene0565_00_00008.bin 8 +scene0576_00_00008.bin 8 +scene0577_00_00003.bin 8 +scene0580_00_00006.bin 8 +scene0582_00_00004.bin 8 +scene0582_00_00014.bin 8 +scene0585_00_00002.bin 8 +scene0585_00_00005.bin 8 +scene0585_00_00007.bin 8 +scene0589_00_00002.bin 8 +scene0591_00_00005.bin 8 +scene0591_00_00010.bin 8 +scene0593_00_00003.bin 8 t +scene0598_00_00002.bin 8 +scene0603_00_00002.bin 8 t +scene0603_00_00012.bin 8 t +scene0603_00_00019.bin 8 t +scene0613_00_00004.bin 8 +scene0613_00_00006.bin 8 +scene0614_00_00002.bin 8 +scene0614_00_00003.bin 8 +scene0614_00_00018.bin 3 +scene0614_00_00020.bin 8 +scene0619_00_00003.bin 8 +scene0630_00_00002.bin 8 t +scene0632_00_00004.bin 8 t +scene0635_00_00003.bin 8 +scene0643_00_00009.bin 8 t +scene0643_00_00010.bin 8 t +scene0644_00_00003.bin 8 +scene0645_00_00025.bin 8 +scene0646_00_00013.bin 8 +scene0646_00_00018.bin 8 +scene0646_00_00025.bin 8 +scene0010_00_00020.bin 6 +scene0010_00_00024.bin 6 +scene0010_00_00031.bin 6 +scene0017_00_00016.bin 6 +scene0025_00_00015.bin 6 +scene0025_00_00016.bin 6 +scene0040_00_00016.bin 6 +scene0040_00_00017.bin 6 +scene0056_00_00014.bin 6 t +scene0056_00_00020.bin 6 t +scene0070_00_00013.bin 6 t +scene0085_00_00011.bin 6 +scene0095_00_00010.bin 6 +scene0095_00_00011.bin 6 +scene0095_00_00012.bin 6 +scene0095_00_00015.bin 6 +scene0131_00_00022.bin 6 +scene0137_00_00012.bin 6 +scene0138_00_00017.bin 6 t +scene0138_00_00021.bin 6 t +scene0147_00_00018.bin 6 t +scene0166_00_00010.bin 6 +scene0168_00_00022.bin 6 +scene0168_00_00025.bin 6 +scene0177_00_00008.bin 6 t +scene0177_00_00015.bin 6 t +scene0184_00_00005.bin 6 +scene0206_00_00020.bin 6 t +scene0209_00_00015.bin 6 +scene0211_00_00012.bin 6 +scene0238_00_00010.bin 6 t +scene0263_00_00016.bin 6 +scene0264_00_00007.bin 6 t +scene0279_00_00020.bin 6 +scene0289_00_00012.bin 6 +scene0296_00_00025.bin 6 +scene0305_00_00016.bin 6 t +scene0305_00_00018.bin 6 t +scene0305_00_00021.bin 6 t +scene0314_00_00008.bin 6 t +scene0320_00_00016.bin 6 +scene0362_00_00011.bin 6 +scene0378_00_00018.bin 6 +scene0385_00_00012.bin 6 +scene0389_00_00011.bin 6 +scene0395_00_00011.bin 6 t +scene0416_00_00017.bin 6 +scene0424_00_00015.bin 6 +scene0424_00_00018.bin 6 +scene0424_00_00019.bin 6 +scene0426_00_00010.bin 6 +scene0480_00_00006.bin 6 +scene0489_00_00011.bin 6 +scene0489_00_00012.bin 6 +scene0502_00_00002.bin 6 +scene0568_00_00005.bin 6 +scene0569_00_00015.bin 6 +scene0582_00_00007.bin 6 +scene0582_00_00012.bin 6 +scene0582_00_00013.bin 6 +scene0590_00_00017.bin 6 +scene0598_00_00010.bin 6 +scene0598_00_00011.bin 6 +scene0599_00_00007.bin 6 +scene0603_00_00013.bin 6 +scene0604_00_00009.bin 6 +scene0608_00_00008.bin 6 t +scene0614_00_00021.bin 6 +scene0617_00_00004.bin 6 +scene0623_00_00008.bin 6 +scene0642_00_00018.bin 6 +scene0643_00_00022.bin 6 +scene0643_00_00024.bin 6 +scene0646_00_00031.bin 6 +scene0000_00_00024.bin 7 +scene0002_00_00006.bin 7 t +scene0002_00_00009.bin 7 t +scene0002_00_00010.bin 7 t +scene0010_00_00007.bin 7 +scene0017_00_00006.bin 7 +scene0019_00_00008.bin 7 +scene0025_00_00004.bin 7 t +scene0026_00_00008.bin 7 t +scene0026_00_00010.bin 7 t +scene0029_00_00003.bin 7 +scene0030_00_00009.bin 7 t +scene0032_00_00006.bin 7 +scene0040_00_00008.bin 7 +scene0042_00_00005.bin 7 +scene0044_00_00003.bin 7 +scene0047_00_00007.bin 7 +scene0050_00_00011.bin 7 +scene0050_00_00013.bin 7 +scene0051_00_00008.bin 7 t +scene0051_00_00010.bin 7 t +scene0054_00_00007.bin 7 +scene0054_00_00010.bin 7 +scene0054_00_00012.bin 7 +scene0054_00_00019.bin 7 +scene0056_00_00006.bin 7 t +scene0062_00_00003.bin 7 +scene0065_00_00003.bin 7 +scene0071_00_00002.bin 7 +scene0072_00_00007.bin 7 +scene0073_00_00006.bin 7 +scene0078_00_00004.bin 7 +scene0084_00_00006.bin 7 +scene0085_00_00007.bin 7 +scene0086_00_00002.bin 7 +scene0096_00_00007.bin 7 +scene0096_00_00009.bin 7 +scene0097_00_00003.bin 7 +scene0098_00_00015.bin 7 +scene0110_00_00005.bin 7 +scene0115_00_00003.bin 7 +scene0118_00_00003.bin 7 +scene0118_00_00004.bin 7 +scene0121_00_00006.bin 7 +scene0122_00_00003.bin 7 t +scene0124_00_00002.bin 7 +scene0124_00_00003.bin 7 +scene0126_00_00006.bin 7 t +scene0127_00_00005.bin 7 t +scene0140_00_00008.bin 7 +scene0142_00_00003.bin 7 +scene0144_00_00009.bin 7 +scene0153_00_00004.bin 7 +scene0159_00_00009.bin 7 +scene0162_00_00004.bin 7 +scene0174_00_00004.bin 7 +scene0175_00_00007.bin 7 +scene0177_00_00005.bin 7 +scene0178_00_00006.bin 7 +scene0184_00_00004.bin 7 +scene0186_00_00020.bin 7 t +scene0191_00_00006.bin 7 +scene0195_00_00004.bin 7 t +scene0196_00_00004.bin 7 +scene0197_00_00004.bin 7 +scene0198_00_00005.bin 7 +scene0198_00_00006.bin 7 +scene0204_00_00004.bin 7 +scene0210_00_00006.bin 7 +scene0214_00_00007.bin 7 +scene0217_00_00007.bin 7 t +scene0220_00_00009.bin 7 +scene0232_00_00004.bin 7 t +scene0233_00_00006.bin 7 +scene0240_00_00005.bin 7 +scene0241_00_00003.bin 7 t +scene0242_00_00002.bin 7 +scene0242_00_00003.bin 7 +scene0250_00_00005.bin 7 +scene0251_00_00009.bin 7 t +scene0259_00_00006.bin 7 +scene0261_00_00006.bin 7 +scene0261_00_00007.bin 7 +scene0265_00_00007.bin 12 t +scene0267_00_00007.bin 7 +scene0268_00_00006.bin 7 t +scene0276_00_00011.bin 7 +scene0279_00_00007.bin 7 t +scene0286_00_00005.bin 7 +scene0290_00_00008.bin 7 +scene0290_00_00011.bin 7 +scene0290_00_00012.bin 7 +scene0296_00_00009.bin 7 +scene0303_00_00005.bin 7 +scene0304_00_00006.bin 7 +scene0305_00_00011.bin 7 +scene0307_00_00006.bin 7 +scene0308_00_00006.bin 7 +scene0327_00_00006.bin 7 +scene0327_00_00008.bin 7 +scene0329_00_00007.bin 7 +scene0329_00_00008.bin 7 +scene0329_00_00012.bin 7 +scene0332_00_00005.bin 7 +scene0335_00_00005.bin 7 t +scene0346_00_00004.bin 7 t +scene0350_00_00005.bin 7 t +scene0352_00_00004.bin 7 t +scene0357_00_00005.bin 7 +scene0358_00_00005.bin 7 +scene0360_00_00003.bin 7 +scene0364_00_00006.bin 7 +scene0375_00_00002.bin 7 +scene0378_00_00006.bin 7 +scene0383_00_00005.bin 7 +scene0384_00_00003.bin 7 +scene0389_00_00005.bin 7 +scene0396_00_00005.bin 7 +scene0398_00_00005.bin 7 +scene0410_00_00002.bin 7 +scene0415_00_00004.bin 7 +scene0419_00_00019.bin 7 t +scene0421_00_00005.bin 7 +scene0424_00_00007.bin 7 +scene0425_00_00005.bin 7 t +scene0434_00_00005.bin 7 +scene0438_00_00008.bin 7 +scene0446_00_00004.bin 7 +scene0447_00_00007.bin 7 +scene0448_00_00004.bin 7 +scene0449_00_00008.bin 7 +scene0465_00_00010.bin 7 +scene0470_00_00002.bin 7 t +scene0473_00_00002.bin 7 +scene0473_00_00004.bin 7 +scene0474_00_00007.bin 7 +scene0479_00_00004.bin 7 +scene0487_00_00006.bin 7 +scene0498_00_00004.bin 7 +scene0499_00_00018.bin 7 +scene0501_00_00003.bin 7 +scene0524_00_00007.bin 7 +scene0525_00_00008.bin 7 t +scene0527_00_00004.bin 7 +scene0530_00_00006.bin 7 +scene0532_00_00004.bin 7 t +scene0534_00_00006.bin 7 +scene0538_00_00004.bin 7 +scene0539_00_00006.bin 7 +scene0541_00_00009.bin 7 +scene0547_00_00007.bin 7 +scene0548_00_00007.bin 7 +scene0550_00_00005.bin 7 t +scene0554_00_00005.bin 7 +scene0560_00_00004.bin 7 +scene0561_00_00003.bin 7 +scene0561_00_00004.bin 7 +scene0561_00_00006.bin 7 +scene0561_00_00007.bin 7 +scene0561_00_00008.bin 7 +scene0564_00_00002.bin 7 +scene0571_00_00005.bin 7 +scene0574_00_00003.bin 7 +scene0581_00_00006.bin 7 +scene0583_00_00005.bin 7 t +scene0599_00_00005.bin 7 +scene0613_00_00008.bin 7 +scene0615_00_00004.bin 7 +scene0623_00_00006.bin 7 +scene0625_00_00003.bin 7 +scene0628_00_00005.bin 7 +scene0629_00_00011.bin 7 +scene0635_00_00006.bin 7 +scene0642_00_00026.bin 7 +scene0643_00_00005.bin 7 +scene0645_00_00012.bin 7 +scene0646_00_00007.bin 7 +scene0000_00_00038.bin 1 t +scene0000_00_00039.bin 1 t +scene0000_00_00046.bin 1 t +scene0002_00_00029.bin 1 +scene0002_00_00035.bin 1 +scene0003_00_00009.bin 1 +scene0009_00_00006.bin 1 +scene0014_00_00007.bin 1 t +scene0017_00_00015.bin 1 +scene0018_00_00009.bin 1 t +scene0018_00_00013.bin 1 t +scene0026_00_00016.bin 1 +scene0029_00_00007.bin 1 t +scene0036_00_00005.bin 1 +scene0043_00_00006.bin 1 +scene0058_00_00011.bin 1 +scene0060_00_00007.bin 1 +scene0086_00_00009.bin 1 +scene0089_00_00007.bin 1 +scene0089_00_00008.bin 1 +scene0100_00_00009.bin 1 +scene0104_00_00008.bin 1 t +scene0108_00_00021.bin 1 +scene0109_00_00007.bin 1 t +scene0111_00_00011.bin 1 t +scene0120_00_00006.bin 1 +scene0127_00_00016.bin 1 +scene0136_00_00005.bin 1 +scene0136_00_00008.bin 1 +scene0140_00_00027.bin 1 +scene0140_00_00035.bin 1 +scene0155_00_00019.bin 1 +scene0178_00_00016.bin 1 +scene0193_00_00006.bin 1 +scene0195_00_00009.bin 1 +scene0197_00_00007.bin 1 +scene0217_00_00014.bin 1 +scene0217_00_00015.bin 1 +scene0220_00_00016.bin 1 t +scene0222_00_00011.bin 1 +scene0222_00_00012.bin 1 +scene0225_00_00013.bin 1 +scene0225_00_00020.bin 1 +scene0225_00_00023.bin 1 +scene0230_00_00012.bin 1 +scene0233_00_00017.bin 1 +scene0233_00_00019.bin 1 +scene0233_00_00024.bin 1 +scene0240_00_00009.bin 1 +scene0240_00_00011.bin 1 +scene0249_00_00014.bin 1 +scene0251_00_00012.bin 1 +scene0251_00_00015.bin 1 +scene0251_00_00016.bin 1 +scene0251_00_00017.bin 1 +scene0251_00_00018.bin 1 +scene0255_00_00011.bin 1 t +scene0260_00_00010.bin 1 +scene0263_00_00015.bin 1 +scene0264_00_00011.bin 1 +scene0265_00_00009.bin 1 +scene0267_00_00011.bin 1 +scene0267_00_00012.bin 1 +scene0274_00_00006.bin 1 +scene0289_00_00016.bin 1 t +scene0329_00_00018.bin 1 +scene0340_00_00017.bin 1 +scene0347_00_00006.bin 1 +scene0348_00_00011.bin 1 +scene0349_00_00008.bin 1 t +scene0353_00_00016.bin 1 t +scene0358_00_00014.bin 1 +scene0360_00_00002.bin 1 +scene0360_00_00005.bin 1 +scene0370_00_00012.bin 1 +scene0371_00_00008.bin 1 t +scene0373_00_00006.bin 1 +scene0377_00_00005.bin 1 +scene0377_00_00008.bin 1 +scene0378_00_00015.bin 1 t +scene0383_00_00009.bin 1 +scene0394_00_00024.bin 1 +scene0398_00_00008.bin 1 +scene0400_00_00010.bin 1 +scene0402_00_00010.bin 1 +scene0403_00_00005.bin 1 +scene0405_00_00002.bin 1 +scene0405_00_00003.bin 1 +scene0405_00_00004.bin 1 +scene0405_00_00005.bin 1 +scene0405_00_00006.bin 1 +scene0405_00_00007.bin 1 +scene0405_00_00008.bin 1 +scene0405_00_00009.bin 1 +scene0406_00_00008.bin 1 +scene0415_00_00012.bin 1 +scene0422_00_00005.bin 1 +scene0431_00_00013.bin 1 t +scene0434_00_00008.bin 1 +scene0436_00_00003.bin 1 +scene0436_00_00004.bin 1 +scene0436_00_00006.bin 1 +scene0445_00_00005.bin 1 +scene0445_00_00006.bin 1 +scene0456_00_00013.bin 1 +scene0464_00_00015.bin 1 +scene0469_00_00012.bin 1 +scene0470_00_00009.bin 1 +scene0476_00_00009.bin 1 +scene0486_00_00007.bin 1 +scene0486_00_00008.bin 1 +scene0487_00_00025.bin 1 +scene0498_00_00008.bin 1 +scene0508_00_00013.bin 1 +scene0510_00_00007.bin 1 t +scene0510_00_00009.bin 1 t +scene0511_00_00006.bin 1 +scene0517_00_00029.bin 1 +scene0519_00_00005.bin 1 +scene0523_00_00006.bin 1 +scene0528_00_00009.bin 1 +scene0530_00_00010.bin 1 +scene0544_00_00006.bin 1 +scene0552_00_00015.bin 1 +scene0565_00_00013.bin 1 +scene0574_00_00007.bin 1 +scene0575_00_00014.bin 1 t +scene0579_00_00004.bin 1 +scene0579_00_00005.bin 1 +scene0585_00_00012.bin 1 +scene0585_00_00013.bin 1 +scene0585_00_00015.bin 1 +scene0586_00_00010.bin 1 +scene0593_00_00006.bin 1 +scene0600_00_00007.bin 1 +scene0610_00_00007.bin 1 t +scene0616_00_00014.bin 1 +scene0644_00_00016.bin 1 t +scene0030_00_00033.bin 2 +scene0030_00_00036.bin 2 +scene0030_00_00043.bin 2 +scene0030_00_00051.bin 2 +scene0030_00_00052.bin 2 +scene0054_00_00052.bin 2 +scene0077_00_00012.bin 2 +scene0098_00_00008.bin 2 +scene0104_00_00009.bin 2 +scene0108_00_00015.bin 2 +scene0120_00_00007.bin 2 +scene0120_00_00008.bin 2 +scene0164_00_00013.bin 2 +scene0174_00_00009.bin 2 +scene0206_00_00019.bin 2 +scene0256_00_00004.bin 2 +scene0256_00_00005.bin 2 +scene0263_00_00005.bin 2 +scene0291_00_00026.bin 2 t +scene0301_00_00016.bin 2 t +scene0315_00_00010.bin 2 +scene0325_00_00013.bin 2 +scene0357_00_00016.bin 2 +scene0379_00_00021.bin 2 +scene0384_00_00009.bin 2 +scene0384_00_00017.bin 2 +scene0384_00_00018.bin 2 +scene0384_00_00023.bin 2 +scene0384_00_00025.bin 2 +scene0384_00_00039.bin 2 +scene0404_00_00008.bin 2 +scene0419_00_00013.bin 2 +scene0421_00_00009.bin 2 +scene0421_00_00011.bin 2 +scene0421_00_00013.bin 2 +scene0426_00_00008.bin 2 +scene0426_00_00013.bin 2 +scene0426_00_00020.bin 2 +scene0479_00_00017.bin 2 +scene0479_00_00019.bin 2 +scene0487_00_00023.bin 2 t +scene0565_00_00007.bin 2 +scene0565_00_00009.bin 2 +scene0592_00_00028.bin 2 +scene0636_00_00001.bin 2 t +scene0646_00_00030.bin 2 +scene0000_00_00005.bin 10 +scene0006_00_00002.bin 10 +scene0006_00_00003.bin 10 +scene0032_00_00002.bin 10 +scene0035_00_00002.bin 10 +scene0039_00_00002.bin 10 t +scene0046_00_00003.bin 10 +scene0055_00_00006.bin 10 +scene0070_00_00005.bin 10 +scene0072_00_00005.bin 10 +scene0073_00_00003.bin 10 +scene0078_00_00003.bin 10 t +scene0085_00_00003.bin 10 +scene0085_00_00005.bin 10 +scene0092_00_00002.bin 10 +scene0101_00_00004.bin 10 +scene0107_00_00003.bin 10 +scene0127_00_00003.bin 10 +scene0127_00_00007.bin 10 +scene0127_00_00010.bin 10 +scene0137_00_00003.bin 10 +scene0137_00_00004.bin 10 +scene0143_00_00000.bin 10 +scene0144_00_00002.bin 10 +scene0147_00_00001.bin 10 +scene0148_00_00003.bin 10 +scene0178_00_00003.bin 10 +scene0178_00_00004.bin 10 +scene0178_00_00018.bin 10 +scene0184_00_00002.bin 10 t +scene0193_00_00002.bin 10 t +scene0207_00_00003.bin 10 +scene0209_00_00005.bin 10 t +scene0209_00_00006.bin 10 t +scene0217_00_00002.bin 10 +scene0217_00_00003.bin 10 +scene0219_00_00001.bin 10 t +scene0221_00_00003.bin 10 +scene0221_00_00004.bin 10 +scene0222_00_00005.bin 10 +scene0222_00_00006.bin 10 +scene0223_00_00007.bin 10 +scene0233_00_00004.bin 10 +scene0233_00_00009.bin 10 +scene0235_00_00004.bin 10 +scene0236_00_00001.bin 10 +scene0246_00_00004.bin 10 +scene0259_00_00003.bin 10 +scene0270_00_00003.bin 10 +scene0270_00_00004.bin 10 +scene0271_00_00003.bin 10 +scene0276_00_00003.bin 10 t +scene0277_00_00005.bin 10 +scene0279_00_00004.bin 10 t +scene0280_00_00008.bin 10 +scene0282_00_00004.bin 10 +scene0286_00_00003.bin 10 +scene0287_00_00002.bin 10 +scene0295_00_00002.bin 10 +scene0296_00_00002.bin 10 +scene0296_00_00004.bin 10 +scene0298_00_00002.bin 10 +scene0308_00_00003.bin 10 +scene0321_00_00002.bin 10 t +scene0340_00_00004.bin 10 +scene0340_00_00005.bin 10 +scene0356_00_00003.bin 10 +scene0356_00_00009.bin 10 +scene0359_00_00003.bin 10 +scene0364_00_00003.bin 10 t +scene0376_00_00003.bin 10 +scene0389_00_00004.bin 10 +scene0392_00_00007.bin 10 +scene0394_00_00003.bin 10 +scene0398_00_00002.bin 10 +scene0398_00_00003.bin 10 +scene0400_00_00004.bin 10 +scene0416_00_00004.bin 10 +scene0416_00_00005.bin 10 +scene0418_00_00002.bin 10 +scene0426_00_00002.bin 10 t +scene0435_00_00003.bin 10 +scene0435_00_00004.bin 10 +scene0438_00_00001.bin 10 t +scene0440_00_00003.bin 10 +scene0440_00_00004.bin 10 +scene0445_00_00002.bin 10 +scene0457_00_00002.bin 10 +scene0468_00_00005.bin 10 +scene0472_00_00003.bin 10 t +scene0477_00_00003.bin 10 +scene0477_00_00004.bin 10 +scene0506_00_00003.bin 10 +scene0515_00_00006.bin 10 +scene0521_00_00003.bin 10 +scene0541_00_00005.bin 10 +scene0545_00_00002.bin 10 +scene0548_00_00004.bin 10 +scene0556_00_00003.bin 10 +scene0556_00_00004.bin 10 +scene0557_00_00002.bin 10 +scene0560_00_00002.bin 10 +scene0567_00_00002.bin 10 t +scene0576_00_00003.bin 10 +scene0577_00_00004.bin 10 +scene0580_00_00004.bin 10 t +scene0589_00_00006.bin 10 +scene0590_00_00003.bin 10 +scene0600_00_00002.bin 10 +scene0604_00_00003.bin 10 t +scene0613_00_00001.bin 10 +scene0615_00_00003.bin 10 +scene0620_00_00002.bin 10 t +scene0640_00_00004.bin 10 +scene0642_00_00005.bin 10 t +scene0645_00_00003.bin 10 +scene0645_00_00004.bin 10 +scene0000_00_00003.bin 13 +scene0001_00_00002.bin 13 +scene0001_00_00003.bin 13 +scene0001_00_00004.bin 13 +scene0002_00_00005.bin 13 +scene0008_00_00003.bin 13 +scene0008_00_00004.bin 13 +scene0025_00_00005.bin 13 t +scene0025_00_00006.bin 13 t +scene0027_00_00002.bin 13 +scene0031_00_00005.bin 13 +scene0031_00_00007.bin 13 +scene0031_00_00008.bin 13 +scene0031_00_00009.bin 13 +scene0031_00_00011.bin 13 +scene0031_00_00012.bin 13 +scene0031_00_00014.bin 13 +scene0036_00_00002.bin 13 +scene0036_00_00003.bin 13 +scene0040_00_00007.bin 13 +scene0049_00_00003.bin 13 +scene0050_00_00003.bin 13 +scene0053_00_00001.bin 13 +scene0053_00_00003.bin 13 +scene0054_00_00004.bin 13 +scene0059_00_00005.bin 13 +scene0061_00_00001.bin 13 t +scene0064_00_00005.bin 13 +scene0087_00_00003.bin 13 +scene0087_00_00006.bin 13 +scene0091_00_00002.bin 13 +scene0106_00_00003.bin 13 +scene0106_00_00004.bin 13 +scene0113_00_00002.bin 13 +scene0113_00_00003.bin 13 +scene0113_00_00004.bin 13 +scene0125_00_00003.bin 13 t +scene0128_00_00001.bin 13 t +scene0137_00_00005.bin 13 +scene0144_00_00005.bin 13 +scene0145_00_00003.bin 13 +scene0151_00_00003.bin 13 +scene0160_00_00001.bin 13 +scene0160_00_00004.bin 13 +scene0160_00_00005.bin 13 +scene0162_00_00003.bin 13 +scene0166_00_00006.bin 13 +scene0167_00_00003.bin 13 +scene0167_00_00004.bin 13 +scene0177_00_00006.bin 13 +scene0181_00_00005.bin 13 +scene0187_00_00006.bin 13 t +scene0187_00_00011.bin 13 t +scene0194_00_00001.bin 13 +scene0199_00_00002.bin 13 +scene0203_00_00006.bin 13 +scene0207_00_00006.bin 13 +scene0209_00_00009.bin 13 +scene0213_00_00004.bin 13 +scene0213_00_00005.bin 13 +scene0213_00_00008.bin 13 +scene0213_00_00012.bin 13 +scene0218_00_00003.bin 13 t +scene0218_00_00004.bin 13 t +scene0224_00_00003.bin 13 t +scene0226_00_00003.bin 13 +scene0226_00_00004.bin 13 +scene0226_00_00005.bin 13 +scene0226_00_00006.bin 13 +scene0231_00_00011.bin 13 +scene0231_00_00014.bin 13 +scene0235_00_00008.bin 13 +scene0239_00_00004.bin 13 +scene0247_00_00003.bin 13 +scene0247_00_00004.bin 13 +scene0247_00_00015.bin 13 +scene0269_00_00001.bin 13 +scene0269_00_00002.bin 13 +scene0273_00_00006.bin 13 +scene0276_00_00004.bin 13 t +scene0279_00_00006.bin 13 +scene0281_00_00003.bin 13 t +scene0281_00_00004.bin 13 t +scene0288_00_00005.bin 13 t +scene0294_00_00002.bin 13 +scene0294_00_00003.bin 13 +scene0297_00_00003.bin 13 +scene0297_00_00004.bin 13 +scene0301_00_00002.bin 13 +scene0309_00_00019.bin 13 +scene0312_00_00002.bin 13 +scene0312_00_00003.bin 13 +scene0312_00_00004.bin 13 +scene0315_00_00003.bin 13 +scene0315_00_00005.bin 13 +scene0316_00_00005.bin 13 t +scene0317_00_00005.bin 13 +scene0319_00_00003.bin 13 +scene0319_00_00004.bin 13 +scene0319_00_00005.bin 13 +scene0326_00_00001.bin 13 +scene0327_00_00005.bin 13 +scene0327_00_00015.bin 3 +scene0329_00_00003.bin 13 t +scene0329_00_00004.bin 13 t +scene0334_00_00002.bin 13 +scene0334_00_00003.bin 13 +scene0339_00_00003.bin 13 t +scene0339_00_00005.bin 13 t +scene0339_00_00006.bin 13 t +scene0339_00_00007.bin 13 t +scene0341_00_00002.bin 13 +scene0352_00_00003.bin 13 +scene0353_00_00005.bin 13 +scene0362_00_00004.bin 13 +scene0363_00_00004.bin 13 t +scene0363_00_00006.bin 13 t +scene0363_00_00007.bin 13 t +scene0363_00_00008.bin 13 t +scene0363_00_00009.bin 13 t +scene0363_00_00010.bin 13 t +scene0367_00_00004.bin 13 +scene0367_00_00006.bin 13 +scene0368_00_00006.bin 13 +scene0368_00_00009.bin 13 +scene0368_00_00010.bin 13 +scene0368_00_00034.bin 13 +scene0374_00_00002.bin 13 +scene0381_00_00002.bin 13 +scene0385_00_00004.bin 13 +scene0386_00_00003.bin 13 +scene0386_00_00005.bin 13 +scene0392_00_00008.bin 13 +scene0394_00_00012.bin 13 +scene0395_00_00005.bin 13 +scene0407_00_00002.bin 13 +scene0424_00_00006.bin 13 +scene0450_00_00006.bin 13 t +scene0451_00_00005.bin 13 +scene0461_00_00002.bin 13 +scene0461_00_00003.bin 13 +scene0467_00_00002.bin 13 +scene0474_00_00004.bin 13 +scene0480_00_00002.bin 13 +scene0484_00_00002.bin 13 +scene0484_00_00003.bin 13 +scene0487_00_00008.bin 13 +scene0487_00_00012.bin 13 +scene0499_00_00008.bin 13 +scene0499_00_00009.bin 13 +scene0503_00_00002.bin 13 +scene0504_00_00004.bin 13 +scene0504_00_00017.bin 13 +scene0505_00_00008.bin 13 +scene0514_00_00004.bin 13 +scene0515_00_00009.bin 13 +scene0517_00_00006.bin 13 t +scene0520_00_00001.bin 13 +scene0520_00_00003.bin 13 +scene0520_00_00005.bin 13 +scene0529_00_00004.bin 13 +scene0533_00_00002.bin 13 +scene0533_00_00005.bin 13 +scene0536_00_00002.bin 13 t +scene0537_00_00003.bin 13 +scene0549_00_00002.bin 13 +scene0549_00_00004.bin 13 +scene0559_00_00002.bin 13 t +scene0568_00_00003.bin 13 t +scene0587_00_00002.bin 13 +scene0588_00_00004.bin 13 +scene0588_00_00006.bin 13 +scene0588_00_00007.bin 13 +scene0588_00_00008.bin 13 +scene0588_00_00009.bin 13 +scene0588_00_00010.bin 13 +scene0588_00_00011.bin 13 +scene0588_00_00012.bin 13 +scene0588_00_00013.bin 13 +scene0588_00_00014.bin 13 +scene0590_00_00006.bin 13 +scene0593_00_00005.bin 13 +scene0601_00_00008.bin 13 +scene0601_00_00012.bin 13 +scene0603_00_00004.bin 13 t +scene0603_00_00005.bin 13 t +scene0604_00_00004.bin 13 t +scene0623_00_00003.bin 13 +scene0626_00_00002.bin 13 +scene0641_00_00003.bin 13 +scene0641_00_00005.bin 13 +scene0641_00_00006.bin 13 +scene0645_00_00005.bin 13 +scene0000_00_00035.bin 12 +scene0003_00_00013.bin 12 t +scene0009_00_00009.bin 12 +scene0009_00_00011.bin 12 +scene0009_00_00012.bin 12 +scene0009_00_00013.bin 12 +scene0009_00_00014.bin 12 +scene0009_00_00017.bin 12 +scene0014_00_00009.bin 12 t +scene0014_00_00010.bin 12 t +scene0026_00_00017.bin 12 +scene0026_00_00020.bin 12 +scene0034_00_00011.bin 12 +scene0042_00_00006.bin 12 +scene0051_00_00011.bin 12 +scene0054_00_00028.bin 12 t +scene0065_00_00006.bin 12 +scene0067_00_00006.bin 12 +scene0068_00_00006.bin 12 +scene0083_00_00004.bin 12 +scene0084_00_00004.bin 12 +scene0086_00_00010.bin 12 +scene0086_00_00011.bin 12 +scene0096_00_00016.bin 12 t +scene0100_00_00008.bin 12 +scene0101_00_00011.bin 12 +scene0116_00_00004.bin 12 t +scene0119_00_00005.bin 12 t +scene0146_00_00003.bin 12 +scene0170_00_00006.bin 12 +scene0195_00_00015.bin 12 t +scene0197_00_00009.bin 12 +scene0207_00_00014.bin 12 +scene0207_00_00017.bin 12 +scene0214_00_00005.bin 12 t +scene0232_00_00010.bin 12 +scene0237_00_00003.bin 12 +scene0246_00_00016.bin 12 +scene0247_00_00025.bin 12 +scene0260_00_00008.bin 12 +scene0261_00_00005.bin 12 t +scene0265_00_00011.bin 12 t +scene0268_00_00004.bin 12 +scene0276_00_00016.bin 12 +scene0307_00_00008.bin 12 +scene0348_00_00008.bin 12 +scene0349_00_00003.bin 12 +scene0349_00_00006.bin 12 +scene0350_00_00009.bin 12 +scene0366_00_00008.bin 12 +scene0366_00_00009.bin 12 +scene0375_00_00008.bin 12 t +scene0394_00_00016.bin 12 +scene0394_00_00023.bin 12 +scene0396_00_00008.bin 12 +scene0399_00_00002.bin 12 +scene0406_00_00006.bin 12 +scene0415_00_00003.bin 12 +scene0429_00_00006.bin 12 +scene0434_00_00010.bin 12 +scene0435_00_00011.bin 12 t +scene0439_00_00014.bin 12 +scene0441_00_00010.bin 12 +scene0446_00_00005.bin 12 +scene0447_00_00005.bin 12 +scene0448_00_00008.bin 12 +scene0449_00_00012.bin 12 +scene0458_00_00012.bin 12 +scene0460_00_00002.bin 12 +scene0486_00_00009.bin 12 +scene0501_00_00007.bin 12 +scene0516_00_00019.bin 12 t +scene0517_00_00024.bin 12 +scene0519_00_00006.bin 12 t +scene0521_00_00011.bin 12 t +scene0523_00_00004.bin 12 +scene0527_00_00005.bin 12 +scene0527_00_00006.bin 12 +scene0538_00_00005.bin 12 +scene0542_00_00010.bin 12 +scene0546_00_00008.bin 12 t +scene0547_00_00017.bin 12 +scene0553_00_00003.bin 12 +scene0564_00_00005.bin 12 +scene0564_00_00006.bin 12 +scene0574_00_00004.bin 12 +scene0574_00_00009.bin 12 +scene0579_00_00006.bin 12 +scene0579_00_00007.bin 12 +scene0579_00_00008.bin 12 +scene0579_00_00009.bin 12 +scene0581_00_00010.bin 12 +scene0583_00_00006.bin 12 +scene0586_00_00013.bin 12 +scene0602_00_00002.bin 12 +scene0612_00_00007.bin 12 +scene0631_00_00008.bin 12 t +scene0631_00_00009.bin 12 t +scene0639_00_00002.bin 12 +scene0639_00_00008.bin 12 +scene0642_00_00010.bin 12 +scene0642_00_00028.bin 12 +scene0645_00_00014.bin 12 +scene0000_00_00036.bin 11 +scene0002_00_00027.bin 11 +scene0002_00_00028.bin 11 +scene0002_00_00034.bin 11 +scene0002_00_00039.bin 11 +scene0016_00_00009.bin 11 t +scene0016_00_00012.bin 11 t +scene0021_00_00006.bin 11 +scene0025_00_00017.bin 11 t +scene0049_00_00010.bin 11 t +scene0049_00_00013.bin 11 t +scene0049_00_00014.bin 11 t +scene0070_00_00012.bin 11 +scene0072_00_00011.bin 11 +scene0074_00_00004.bin 11 +scene0137_00_00011.bin 11 +scene0147_00_00017.bin 11 +scene0147_00_00022.bin 11 +scene0147_00_00023.bin 11 +scene0177_00_00011.bin 11 +scene0182_00_00007.bin 11 +scene0194_00_00011.bin 11 +scene0209_00_00017.bin 11 +scene0209_00_00018.bin 11 +scene0209_00_00019.bin 11 +scene0209_00_00020.bin 11 +scene0219_00_00003.bin 11 +scene0222_00_00016.bin 11 t +scene0222_00_00017.bin 11 t +scene0224_00_00009.bin 11 +scene0235_00_00012.bin 11 +scene0270_00_00013.bin 11 t +scene0270_00_00016.bin 11 t +scene0270_00_00017.bin 11 t +scene0270_00_00018.bin 11 t +scene0270_00_00019.bin 11 t +scene0271_00_00019.bin 11 +scene0296_00_00013.bin 11 t +scene0296_00_00015.bin 11 t +scene0296_00_00026.bin 11 t +scene0308_00_00009.bin 11 +scene0317_00_00016.bin 11 +scene0319_00_00007.bin 11 +scene0319_00_00009.bin 11 +scene0326_00_00006.bin 11 +scene0331_00_00010.bin 11 +scene0338_00_00006.bin 2 +scene0340_00_00012.bin 11 +scene0340_00_00015.bin 11 +scene0340_00_00016.bin 11 +scene0362_00_00010.bin 11 +scene0385_00_00014.bin 11 +scene0385_00_00015.bin 11 +scene0394_00_00019.bin 11 +scene0394_00_00022.bin 11 +scene0394_00_00027.bin 11 +scene0397_00_00006.bin 11 +scene0407_00_00009.bin 11 +scene0425_00_00012.bin 11 +scene0438_00_00009.bin 11 +scene0467_00_00015.bin 11 t +scene0477_00_00012.bin 11 +scene0477_00_00016.bin 11 +scene0480_00_00008.bin 11 +scene0507_00_00003.bin 11 +scene0507_00_00004.bin 11 +scene0507_00_00006.bin 11 +scene0518_00_00012.bin 11 +scene0536_00_00006.bin 11 +scene0548_00_00010.bin 11 t +scene0554_00_00017.bin 11 +scene0567_00_00008.bin 11 +scene0577_00_00016.bin 11 +scene0589_00_00007.bin 11 t +scene0590_00_00007.bin 11 t +scene0591_00_00013.bin 11 +scene0615_00_00016.bin 11 t +scene0642_00_00014.bin 11 +scene0642_00_00015.bin 11 +scene0645_00_00022.bin 11 +scene0000_00_00031.bin 14 +scene0014_00_00006.bin 14 +scene0026_00_00011.bin 14 +scene0026_00_00012.bin 14 +scene0029_00_00005.bin 14 +scene0034_00_00008.bin 14 t +scene0042_00_00007.bin 14 +scene0051_00_00012.bin 14 +scene0054_00_00035.bin 14 +scene0062_00_00006.bin 14 +scene0065_00_00008.bin 14 +scene0067_00_00004.bin 14 +scene0083_00_00003.bin 14 +scene0084_00_00005.bin 14 t +scene0086_00_00008.bin 14 +scene0086_00_00014.bin 14 +scene0100_00_00006.bin 14 +scene0101_00_00014.bin 14 t +scene0112_00_00002.bin 14 +scene0116_00_00005.bin 14 +scene0119_00_00009.bin 14 +scene0135_00_00005.bin 14 t +scene0146_00_00002.bin 14 +scene0153_00_00006.bin 14 t +scene0175_00_00010.bin 14 t +scene0195_00_00007.bin 14 +scene0207_00_00011.bin 14 +scene0214_00_00010.bin 14 +scene0232_00_00008.bin 14 t +scene0246_00_00014.bin 14 +scene0250_00_00008.bin 14 t +scene0254_00_00008.bin 14 +scene0254_00_00010.bin 14 +scene0260_00_00006.bin 14 t +scene0261_00_00012.bin 14 +scene0265_00_00004.bin 14 +scene0276_00_00014.bin 14 +scene0365_00_00005.bin 14 +scene0366_00_00005.bin 14 +scene0396_00_00007.bin 14 +scene0399_00_00003.bin 14 +scene0406_00_00005.bin 14 +scene0410_00_00004.bin 14 +scene0429_00_00008.bin 14 +scene0434_00_00007.bin 14 +scene0435_00_00012.bin 14 +scene0446_00_00007.bin 14 t +scene0447_00_00006.bin 14 +scene0448_00_00007.bin 14 +scene0449_00_00005.bin 14 +scene0458_00_00007.bin 14 +scene0471_00_00005.bin 14 t +scene0492_00_00013.bin 14 +scene0501_00_00009.bin 14 +scene0510_00_00004.bin 14 +scene0510_00_00008.bin 14 +scene0515_00_00018.bin 14 +scene0516_00_00020.bin 14 +scene0521_00_00014.bin 14 +scene0523_00_00003.bin 14 t +scene0538_00_00006.bin 14 +scene0539_00_00007.bin 14 +scene0546_00_00009.bin 14 +scene0550_00_00009.bin 14 +scene0553_00_00004.bin 14 +scene0564_00_00004.bin 14 +scene0570_00_00006.bin 14 t +scene0571_00_00006.bin 14 t +scene0581_00_00009.bin 14 +scene0583_00_00008.bin 14 +scene0602_00_00003.bin 14 +scene0610_00_00005.bin 14 +scene0612_00_00003.bin 14 t +scene0625_00_00005.bin 14 +scene0631_00_00005.bin 14 +scene0639_00_00006.bin 14 +scene0642_00_00012.bin 14 +scene0645_00_00015.bin 14 diff --git a/zoo/SimpleView/ScanObjectNN/training_data/split3.txt b/zoo/SimpleView/ScanObjectNN/training_data/split3.txt new file mode 100644 index 0000000..a93cae1 --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/split3.txt @@ -0,0 +1,2902 @@ +005_00020.bin 0 +014_00018.bin 0 +025_00011.bin 0 +038_00032.bin 0 +041_00028.bin 0 +041_00052.bin 0 +043_00018.bin 0 +054_00026.bin 0 +073_00014.bin 0 +080_00015.bin 0 t +082_00020.bin 0 +084_00012.bin 0 +086_00015.bin 0 t +086_00020.bin 0 t +093_00019.bin 0 +096_00016.bin 0 +096_00020.bin 0 +098_00007.bin 0 +202_00002.bin 0 +205_00007.bin 0 +205_00009.bin 0 +209_00013.bin 0 t +209_00019.bin 0 t +213_00025.bin 0 +223_00012.bin 0 +227_00012.bin 0 +234_00012.bin 0 +237_00011.bin 0 +237_00014.bin 0 +240_00009.bin 0 +246_00014.bin 0 +251_00015.bin 0 +251_00018.bin 0 +273_00010.bin 0 +614_00005.bin 0 +700_00012.bin 0 +005_00015.bin 1 +005_00017.bin 1 +014_00016.bin 1 +021_00014.bin 1 +021_00021.bin 1 +032_00015.bin 1 +041_00042.bin 1 +043_00014.bin 1 +045_00018.bin 1 +047_00019.bin 1 +047_00023.bin 1 +049_00007.bin 1 t +052_00012.bin 1 +062_00009.bin 1 t +065_00013.bin 1 +069_00009.bin 1 t +076_00045.bin 1 +080_00013.bin 1 +086_00011.bin 1 t +086_00016.bin 1 t +089_00010.bin 1 +093_00014.bin 1 +093_00016.bin 1 +109_00008.bin 1 t +109_00016.bin 1 t +205_00008.bin 1 +207_00005.bin 1 +207_00010.bin 1 +209_00014.bin 1 +213_00015.bin 1 +213_00026.bin 1 +231_00019.bin 1 +237_00009.bin 1 +237_00010.bin 1 +246_00008.bin 1 +251_00014.bin 1 +252_00013.bin 1 +252_00014.bin 1 +255_00003.bin 1 +255_00006.bin 1 +265_00010.bin 1 +265_00024.bin 1 +265_00030.bin 1 +270_00007.bin 1 +270_00012.bin 1 +273_00007.bin 1 +276_00010.bin 1 +279_00012.bin 1 t +322_00014.bin 1 t +700_00006.bin 1 +700_00008.bin 1 +005_00021.bin 2 t +011_00010.bin 2 +036_00021.bin 2 +041_00038.bin 2 t +043_00016.bin 2 +045_00012.bin 2 +045_00017.bin 2 +047_00021.bin 2 +047_00022.bin 2 +047_00026.bin 2 +054_00019.bin 2 +054_00050.bin 2 +074_00005.bin 2 +074_00012.bin 2 +074_00016.bin 2 +074_00018.bin 2 +074_00020.bin 2 +074_00021.bin 2 +074_00029.bin 2 +078_00005.bin 2 +082_00018.bin 2 t +082_00024.bin 2 t +082_00026.bin 2 t +084_00009.bin 2 +084_00011.bin 2 +086_00009.bin 2 +086_00018.bin 2 +087_00007.bin 2 +087_00008.bin 2 +087_00009.bin 2 +087_00012.bin 2 +087_00017.bin 2 +087_00028.bin 2 +089_00013.bin 2 +089_00021.bin 2 +093_00018.bin 2 +093_00022.bin 2 +093_00023.bin 2 +093_00032.bin 2 +109_00012.bin 2 +209_00022.bin 2 +209_00029.bin 2 +209_00032.bin 2 +213_00011.bin 2 +225_00016.bin 2 +231_00031.bin 2 t +234_00008.bin 2 +246_00012.bin 2 +251_00003.bin 2 +251_00007.bin 2 +251_00008.bin 2 +255_00008.bin 2 +260_00012.bin 2 +263_00025.bin 2 +265_00011.bin 2 +265_00028.bin 2 +265_00035.bin 2 +265_00038.bin 2 +265_00040.bin 2 +265_00042.bin 2 +272_00027.bin 2 t +272_00041.bin 2 t +276_00007.bin 2 +279_00011.bin 2 +623_00008.bin 2 +015_00008.bin 3 +025_00006.bin 3 +041_00012.bin 3 +047_00008.bin 3 +047_00011.bin 3 +049_00006.bin 3 +052_00007.bin 3 +062_00008.bin 3 +065_00002.bin 3 t +076_00010.bin 3 +082_00007.bin 3 +082_00008.bin 3 +084_00002.bin 3 +086_00006.bin 3 +086_00007.bin 3 +087_00005.bin 3 t +093_00009.bin 3 +098_00002.bin 3 +201_00001.bin 3 +201_00004.bin 3 +207_00002.bin 3 +209_00001.bin 3 +213_00003.bin 3 +213_00006.bin 3 +217_00013.bin 3 t +225_00004.bin 3 +225_00005.bin 3 +225_00007.bin 3 +227_00007.bin 3 +243_00002.bin 3 +243_00004.bin 3 +249_00002.bin 3 +252_00002.bin 3 +252_00007.bin 3 +255_00002.bin 3 +260_00000.bin 3 +260_00003.bin 3 +260_00005.bin 3 +260_00007.bin 3 +260_00008.bin 3 +265_00006.bin 3 +276_00000.bin 3 +276_00006.bin 3 +276_00008.bin 3 +279_00004.bin 3 t +700_00001.bin 3 +700_00004.bin 3 +700_00005.bin 3 +700_00009.bin 3 +700_00010.bin 3 +005_00008.bin 4 +014_00009.bin 4 +021_00011.bin 4 +025_00003.bin 4 +025_00007.bin 4 +030_00008.bin 4 +030_00012.bin 4 +030_00013.bin 4 +030_00014.bin 4 +032_00007.bin 4 t +032_00008.bin 4 t +032_00009.bin 4 t +036_00009.bin 4 +036_00010.bin 4 +036_00011.bin 4 +036_00013.bin 4 +038_00011.bin 4 +038_00012.bin 4 +038_00014.bin 4 +038_00015.bin 4 +038_00016.bin 4 +041_00010.bin 4 +041_00013.bin 4 +041_00015.bin 4 +043_00010.bin 4 +043_00011.bin 4 +045_00009.bin 4 +045_00011.bin 4 +045_00013.bin 4 +045_00014.bin 4 +045_00016.bin 4 +047_00006.bin 4 +047_00007.bin 4 +047_00009.bin 4 +047_00010.bin 4 +049_00003.bin 4 +049_00004.bin 4 +052_00008.bin 4 +054_00006.bin 4 +054_00007.bin 4 +054_00009.bin 4 +054_00012.bin 4 +054_00013.bin 4 +054_00014.bin 4 +054_00016.bin 4 +054_00017.bin 4 +054_00018.bin 4 +057_00007.bin 4 +065_00006.bin 4 +065_00007.bin 4 +065_00009.bin 4 +065_00011.bin 4 +069_00010.bin 4 +073_00005.bin 4 +073_00013.bin 4 +074_00009.bin 4 t +076_00012.bin 4 +076_00013.bin 4 +076_00016.bin 4 +076_00017.bin 4 +076_00018.bin 4 +076_00019.bin 4 +076_00021.bin 4 +076_00022.bin 4 +076_00023.bin 4 +076_00028.bin 4 +076_00029.bin 4 +076_00031.bin 4 +076_00034.bin 4 +076_00037.bin 4 +078_00010.bin 4 +080_00005.bin 4 +080_00006.bin 4 +080_00007.bin 4 +082_00009.bin 4 +082_00011.bin 4 +082_00014.bin 4 +084_00004.bin 4 +084_00008.bin 4 +086_00001.bin 4 t +086_00008.bin 4 t +087_00001.bin 4 +087_00003.bin 4 +087_00004.bin 4 +087_00011.bin 4 +093_00006.bin 4 +096_00008.bin 4 +109_00007.bin 4 +201_00009.bin 4 +201_00010.bin 4 +201_00013.bin 4 +201_00015.bin 4 +201_00021.bin 4 +202_00003.bin 4 +202_00004.bin 4 +202_00005.bin 4 +202_00007.bin 4 +202_00008.bin 4 +202_00009.bin 4 +202_00010.bin 4 +202_00011.bin 4 +202_00012.bin 4 +202_00013.bin 4 +202_00015.bin 4 +202_00016.bin 4 +202_00017.bin 4 +202_00020.bin 4 +205_00005.bin 4 +205_00006.bin 4 +205_00010.bin 4 +206_00007.bin 4 +206_00008.bin 4 +206_00010.bin 4 +206_00011.bin 4 +206_00013.bin 4 +206_00014.bin 4 +206_00015.bin 4 +206_00016.bin 4 +206_00018.bin 4 +206_00019.bin 4 +206_00020.bin 4 +206_00021.bin 4 +206_00022.bin 4 +206_00024.bin 4 +206_00027.bin 4 +209_00006.bin 4 +213_00012.bin 4 t +213_00014.bin 4 t +213_00018.bin 4 t +223_00003.bin 4 +223_00004.bin 4 +223_00006.bin 4 +223_00007.bin 4 +227_00008.bin 4 +227_00009.bin 4 +231_00005.bin 4 +231_00006.bin 4 +231_00007.bin 4 +231_00008.bin 4 +234_00007.bin 4 +237_00004.bin 4 +237_00005.bin 4 +246_00004.bin 4 t +246_00006.bin 4 t +246_00011.bin 4 t +251_00006.bin 4 t +251_00011.bin 4 t +251_00013.bin 4 t +251_00017.bin 4 t +251_00019.bin 4 t +263_00011.bin 4 t +263_00014.bin 4 t +270_00006.bin 4 +272_00006.bin 4 +272_00008.bin 4 +272_00009.bin 4 +272_00010.bin 4 +273_00004.bin 4 +279_00007.bin 4 +279_00008.bin 4 +308_00011.bin 4 +308_00012.bin 4 +308_00013.bin 4 +308_00015.bin 4 +308_00017.bin 4 +322_00009.bin 4 +322_00011.bin 4 +322_00012.bin 4 +522_00005.bin 4 t +609_00004.bin 4 t +609_00005.bin 4 t +609_00006.bin 4 t +609_00007.bin 4 t +609_00008.bin 4 t +609_00009.bin 4 t +609_00010.bin 4 t +609_00011.bin 4 t +609_00012.bin 4 t +609_00014.bin 4 t +609_00016.bin 4 t +609_00018.bin 4 t +609_00019.bin 4 t +609_00020.bin 4 t +609_00021.bin 4 t +613_00000.bin 4 +613_00001.bin 4 +613_00002.bin 4 +613_00004.bin 4 +613_00005.bin 4 +613_00007.bin 4 +613_00010.bin 4 +614_00004.bin 4 t +621_00001.bin 4 +621_00005.bin 4 +621_00006.bin 4 +621_00007.bin 4 +621_00009.bin 4 +621_00010.bin 4 +621_00011.bin 4 +621_00012.bin 4 +621_00013.bin 4 +623_00002.bin 4 +623_00004.bin 4 +623_00005.bin 4 +005_00005.bin 5 t +011_00001.bin 5 +021_00006.bin 5 +030_00005.bin 5 +032_00004.bin 5 +036_00002.bin 5 +036_00004.bin 5 +036_00005.bin 5 +036_00006.bin 5 +038_00005.bin 5 +038_00006.bin 5 +038_00008.bin 5 +038_00009.bin 5 +038_00010.bin 5 +038_00013.bin 5 +041_00005.bin 5 t +041_00006.bin 5 t +041_00009.bin 5 t +041_00011.bin 5 t +043_00007.bin 5 +045_00005.bin 5 +047_00000.bin 5 +047_00001.bin 5 +047_00002.bin 5 +049_00005.bin 5 +054_00001.bin 5 +054_00002.bin 5 +054_00003.bin 5 +054_00011.bin 5 +057_00002.bin 5 +057_00003.bin 5 +062_00006.bin 5 +076_00006.bin 5 +076_00009.bin 5 +076_00015.bin 5 +076_00036.bin 5 +080_00002.bin 5 +080_00004.bin 5 +082_00005.bin 5 +084_00001.bin 5 t +086_00000.bin 5 t +109_00005.bin 5 t +201_00003.bin 5 +201_00005.bin 5 +201_00006.bin 5 +206_00005.bin 5 t +227_00006.bin 5 +231_00004.bin 5 t +231_00009.bin 5 t +234_00003.bin 5 +234_00004.bin 5 +246_00002.bin 5 +272_00003.bin 5 t +308_00004.bin 5 +522_00001.bin 5 +014_00004.bin 6 t +014_00013.bin 6 t +015_00009.bin 6 +021_00018.bin 6 t +025_00009.bin 6 t +030_00026.bin 6 +030_00027.bin 6 +036_00018.bin 6 +036_00022.bin 6 +036_00024.bin 6 +036_00028.bin 6 +036_00033.bin 6 +036_00034.bin 6 +038_00019.bin 6 +038_00021.bin 6 +038_00029.bin 6 +038_00030.bin 6 +038_00034.bin 6 +038_00035.bin 6 +038_00037.bin 6 +038_00038.bin 6 +041_00019.bin 6 +041_00021.bin 6 +041_00025.bin 6 +041_00029.bin 6 +041_00031.bin 6 +041_00032.bin 6 +041_00033.bin 6 +041_00035.bin 6 +043_00013.bin 6 t +047_00017.bin 6 +047_00018.bin 6 +047_00025.bin 6 +049_00009.bin 6 +052_00011.bin 6 +054_00025.bin 6 t +054_00028.bin 6 t +054_00032.bin 6 t +054_00036.bin 6 t +057_00011.bin 6 +057_00014.bin 6 +057_00015.bin 6 +057_00016.bin 6 +065_00008.bin 6 +069_00012.bin 6 +069_00014.bin 6 +069_00015.bin 6 +069_00016.bin 6 +069_00017.bin 6 +071_00006.bin 6 +073_00010.bin 6 t +073_00016.bin 6 t +074_00025.bin 6 +076_00038.bin 6 +076_00039.bin 6 +076_00040.bin 6 +076_00041.bin 6 +076_00042.bin 6 +076_00043.bin 6 +078_00013.bin 6 +078_00014.bin 6 +080_00009.bin 6 +080_00018.bin 6 +086_00021.bin 6 t +086_00023.bin 6 t +086_00027.bin 6 t +089_00018.bin 6 +093_00015.bin 6 +096_00018.bin 6 +098_00005.bin 6 t +201_00007.bin 6 +201_00008.bin 6 +201_00018.bin 6 +201_00026.bin 6 +206_00030.bin 6 t +206_00031.bin 6 t +209_00015.bin 6 +209_00025.bin 6 +217_00015.bin 6 +231_00016.bin 6 t +231_00017.bin 6 t +231_00021.bin 6 t +231_00023.bin 6 t +231_00026.bin 6 t +231_00027.bin 6 t +231_00029.bin 6 t +237_00012.bin 6 +246_00016.bin 6 +263_00015.bin 6 +265_00020.bin 6 +272_00011.bin 6 +522_00006.bin 6 t +005_00004.bin 7 +005_00006.bin 7 +014_00002.bin 7 +021_00008.bin 7 +032_00005.bin 7 +038_00004.bin 7 +043_00008.bin 7 t +047_00004.bin 7 t +074_00001.bin 7 +076_00005.bin 7 +082_00006.bin 7 +089_00004.bin 7 +096_00002.bin 7 +096_00004.bin 7 +096_00005.bin 7 +096_00007.bin 7 +109_00004.bin 7 +207_00003.bin 7 +213_00004.bin 7 +213_00008.bin 7 +225_00003.bin 7 +234_00002.bin 7 +234_00006.bin 7 +237_00003.bin 7 +246_00001.bin 7 +246_00003.bin 7 +246_00007.bin 7 +251_00002.bin 7 +251_00004.bin 7 +252_00003.bin 7 +263_00004.bin 7 t +265_00001.bin 7 +273_00003.bin 7 t +276_00002.bin 7 +279_00005.bin 7 t +700_00002.bin 7 +014_00001.bin 8 +014_00003.bin 8 +021_00007.bin 8 +025_00005.bin 8 +041_00003.bin 8 t +041_00004.bin 8 t +045_00004.bin 8 +047_00005.bin 8 +047_00012.bin 8 +047_00013.bin 8 +049_00012.bin 8 +054_00010.bin 8 +073_00006.bin 8 +074_00004.bin 8 +074_00006.bin 8 +074_00007.bin 8 +076_00002.bin 8 +076_00033.bin 8 +082_00013.bin 8 +086_00003.bin 8 +086_00017.bin 8 +089_00005.bin 8 t +096_00003.bin 8 +096_00011.bin 8 +096_00012.bin 8 +201_00002.bin 8 +201_00012.bin 8 +201_00016.bin 8 +201_00017.bin 8 +201_00019.bin 8 +201_00022.bin 8 +201_00023.bin 8 +201_00025.bin 8 +206_00006.bin 8 +209_00010.bin 8 +217_00004.bin 8 +217_00008.bin 8 +231_00028.bin 8 +237_00002.bin 8 +240_00006.bin 8 +246_00005.bin 8 +249_00004.bin 8 +251_00001.bin 8 +263_00012.bin 8 +265_00015.bin 8 +272_00001.bin 8 +272_00007.bin 8 +276_00005.bin 8 +308_00003.bin 8 +308_00006.bin 8 +322_00002.bin 8 +614_00001.bin 8 t +014_00007.bin 9 +021_00012.bin 9 +025_00004.bin 9 +030_00021.bin 9 +032_00011.bin 9 +032_00013.bin 9 +045_00007.bin 9 +049_00002.bin 9 +054_00008.bin 9 +061_00006.bin 9 +061_00007.bin 9 +062_00007.bin 9 +065_00001.bin 9 +069_00003.bin 9 +069_00004.bin 9 +069_00007.bin 9 +071_00002.bin 9 +071_00003.bin 9 +073_00003.bin 9 +074_00002.bin 9 +076_00026.bin 9 +076_00027.bin 9 +076_00032.bin 9 +076_00035.bin 9 +078_00004.bin 9 +082_00016.bin 9 +089_00002.bin 9 +089_00003.bin 9 +093_00007.bin 9 t +096_00037.bin 9 t +202_00000.bin 9 +205_00002.bin 9 +205_00003.bin 9 +205_00004.bin 9 +206_00003.bin 9 +206_00004.bin 9 +207_00009.bin 9 +209_00004.bin 9 +213_00007.bin 9 +213_00017.bin 9 +217_00003.bin 9 +217_00007.bin 9 +223_00005.bin 9 +223_00017.bin 9 +240_00008.bin 9 +246_00010.bin 9 +249_00003.bin 9 t +251_00012.bin 9 t +252_00004.bin 9 t +252_00005.bin 9 t +263_00023.bin 9 +265_00012.bin 9 +270_00005.bin 9 +272_00013.bin 9 t +273_00001.bin 9 +286_00005.bin 9 +294_00005.bin 9 +308_00001.bin 9 t +308_00005.bin 9 t +308_00008.bin 9 t +322_00008.bin 9 +609_00001.bin 9 +609_00017.bin 9 +613_00008.bin 9 +613_00009.bin 9 +613_00011.bin 9 +614_00002.bin 9 +623_00003.bin 9 +014_00014.bin 0 +036_00019.bin 0 +047_00015.bin 0 +087_00018.bin 0 +089_00015.bin 0 +206_00029.bin 0 t +231_00018.bin 0 +246_00015.bin 0 +252_00011.bin 0 +005_00012.bin 1 +057_00012.bin 1 +065_00015.bin 1 +080_00016.bin 1 +092_00008.bin 1 t +096_00015.bin 1 +206_00028.bin 1 +209_00017.bin 1 +240_00010.bin 1 +255_00007.bin 1 +032_00014.bin 2 t +041_00047.bin 2 t +047_00020.bin 2 +073_00008.bin 2 +074_00019.bin 2 +078_00009.bin 2 +086_00012.bin 2 +087_00002.bin 2 +087_00015.bin 2 +093_00026.bin 2 +096_00027.bin 2 t +209_00026.bin 2 +213_00020.bin 2 +223_00009.bin 2 t +251_00010.bin 2 +005_00010.bin 3 t +052_00004.bin 3 +065_00004.bin 3 t +084_00003.bin 3 +086_00010.bin 3 +089_00009.bin 3 +213_00009.bin 3 +237_00007.bin 3 t +255_00001.bin 3 +265_00003.bin 3 +005_00007.bin 4 +011_00007.bin 4 +030_00020.bin 4 +032_00010.bin 4 t +036_00015.bin 4 +041_00008.bin 4 +041_00014.bin 4 +045_00010.bin 4 +052_00009.bin 4 +057_00005.bin 4 +074_00008.bin 4 t +076_00014.bin 4 +076_00020.bin 4 +076_00025.bin 4 +078_00008.bin 4 +084_00006.bin 4 +096_00010.bin 4 +201_00014.bin 4 +202_00006.bin 4 +206_00009.bin 4 +206_00012.bin 4 +209_00003.bin 4 +213_00013.bin 4 t +231_00010.bin 4 +249_00005.bin 4 +252_00008.bin 4 +322_00010.bin 4 +609_00015.bin 4 t +613_00003.bin 4 +621_00008.bin 4 +623_00006.bin 4 +005_00001.bin 5 t +025_00000.bin 5 +036_00007.bin 5 +038_00007.bin 5 +041_00001.bin 5 t +041_00017.bin 5 t +052_00002.bin 5 +054_00004.bin 5 +076_00008.bin 5 +078_00002.bin 5 +084_00000.bin 5 t +096_00006.bin 5 +209_00002.bin 5 +231_00001.bin 5 t +237_00006.bin 5 t +005_00016.bin 6 +025_00008.bin 6 t +032_00012.bin 6 +036_00030.bin 6 +038_00025.bin 6 +041_00026.bin 6 +041_00034.bin 6 +052_00010.bin 6 +057_00013.bin 6 +069_00013.bin 6 +071_00007.bin 6 +082_00015.bin 6 +096_00009.bin 6 +209_00008.bin 6 +231_00025.bin 6 t +005_00003.bin 7 +011_00003.bin 7 +073_00001.bin 7 +089_00006.bin 7 +225_00002.bin 7 +240_00002.bin 7 t +249_00001.bin 7 +251_00005.bin 7 +276_00004.bin 7 +005_00002.bin 8 +025_00002.bin 8 +047_00016.bin 8 +054_00000.bin 8 +074_00003.bin 8 +078_00001.bin 8 +093_00004.bin 8 +217_00001.bin 8 +234_00001.bin 8 t +272_00002.bin 8 +030_00007.bin 9 +036_00012.bin 9 t +052_00006.bin 9 +066_00002.bin 9 +069_00005.bin 9 +076_00003.bin 9 +087_00000.bin 9 +093_00012.bin 9 t +206_00002.bin 9 +217_00012.bin 9 +251_00000.bin 9 t +272_00004.bin 9 t +279_00006.bin 9 +609_00002.bin 9 +621_00002.bin 9 +005_00000.bin 10 +014_00000.bin 10 +016_00000.bin 10 t +021_00005.bin 10 +049_00000.bin 10 +089_00001.bin 10 +093_00001.bin 10 +096_00001.bin 10 +109_00002.bin 10 +227_00005.bin 10 t +234_00000.bin 10 +237_00000.bin 10 +240_00001.bin 10 +246_00000.bin 10 +249_00000.bin 10 +252_00000.bin 10 +265_00004.bin 10 +273_00000.bin 10 +014_00006.bin 13 +015_00003.bin 13 +015_00007.bin 13 +016_00005.bin 13 +030_00006.bin 13 +036_00003.bin 13 +041_00000.bin 13 +061_00000.bin 13 t +076_00001.bin 13 +076_00004.bin 13 +080_00003.bin 13 +098_00001.bin 13 +098_00003.bin 13 +098_00004.bin 13 +206_00001.bin 13 +263_00000.bin 13 +263_00001.bin 13 +272_00000.bin 13 +286_00000.bin 13 +286_00001.bin 13 +286_00002.bin 13 +286_00003.bin 13 +286_00004.bin 13 +286_00006.bin 13 +286_00008.bin 13 +286_00009.bin 13 +294_00001.bin 13 +294_00002.bin 13 +294_00003.bin 13 +294_00004.bin 13 +065_00014.bin 12 +207_00007.bin 12 +260_00009.bin 12 t +700_00011.bin 12 +014_00012.bin 11 +014_00015.bin 11 +015_00013.bin 11 +016_00009.bin 11 +016_00010.bin 11 +016_00011.bin 11 +016_00013.bin 11 +021_00016.bin 11 +036_00027.bin 11 +036_00036.bin 11 +049_00015.bin 11 t +089_00012.bin 11 +089_00014.bin 11 +096_00013.bin 11 +227_00011.bin 11 t +240_00011.bin 11 +246_00013.bin 11 +263_00019.bin 11 t +263_00020.bin 11 t +263_00022.bin 11 t +272_00021.bin 11 +272_00024.bin 11 +272_00025.bin 11 +272_00031.bin 11 +272_00035.bin 11 +273_00006.bin 11 +scene0000_00_00032.bin 4 +scene0000_00_00034.bin 4 +scene0000_00_00042.bin 4 +scene0000_00_00043.bin 4 +scene0002_00_00012.bin 4 t +scene0002_00_00013.bin 4 t +scene0004_00_00008.bin 4 +scene0006_00_00007.bin 4 +scene0006_00_00009.bin 4 +scene0008_00_00005.bin 13 +scene0010_00_00009.bin 4 t +scene0012_00_00004.bin 4 +scene0012_00_00005.bin 4 +scene0012_00_00006.bin 4 +scene0012_00_00008.bin 4 +scene0013_00_00002.bin 13 +scene0013_00_00003.bin 13 +scene0013_00_00004.bin 13 +scene0015_00_00016.bin 4 +scene0017_00_00014.bin 4 +scene0021_00_00002.bin 13 +scene0021_00_00003.bin 13 +scene0021_00_00004.bin 13 +scene0021_00_00007.bin 13 +scene0024_00_00005.bin 13 +scene0024_00_00010.bin 4 +scene0028_00_00006.bin 13 +scene0028_00_00007.bin 13 +scene0028_00_00009.bin 13 +scene0028_00_00011.bin 13 +scene0030_00_00008.bin 13 +scene0030_00_00020.bin 4 +scene0030_00_00023.bin 4 +scene0030_00_00027.bin 4 +scene0033_00_00002.bin 13 +scene0033_00_00003.bin 13 +scene0033_00_00006.bin 13 +scene0033_00_00007.bin 13 +scene0033_00_00008.bin 13 +scene0033_00_00009.bin 13 +scene0033_00_00011.bin 13 +scene0038_00_00004.bin 4 +scene0038_00_00005.bin 4 +scene0038_00_00006.bin 4 +scene0038_00_00009.bin 4 +scene0038_00_00013.bin 4 +scene0038_00_00016.bin 4 +scene0043_00_00005.bin 4 +scene0046_00_00008.bin 4 +scene0048_00_00004.bin 4 +scene0049_00_00007.bin 13 +scene0050_00_00008.bin 13 +scene0050_00_00012.bin 4 +scene0054_00_00032.bin 4 +scene0056_00_00013.bin 4 +scene0056_00_00015.bin 4 +scene0056_00_00016.bin 4 +scene0056_00_00017.bin 4 +scene0056_00_00021.bin 4 +scene0056_00_00022.bin 4 +scene0057_00_00009.bin 4 +scene0058_00_00007.bin 4 +scene0059_00_00008.bin 4 +scene0059_00_00011.bin 4 +scene0059_00_00013.bin 4 +scene0059_00_00014.bin 4 +scene0059_00_00016.bin 4 +scene0059_00_00019.bin 13 +scene0059_00_00020.bin 4 +scene0063_00_00011.bin 4 +scene0064_00_00002.bin 13 +scene0066_00_00007.bin 4 +scene0066_00_00008.bin 4 +scene0066_00_00009.bin 4 +scene0066_00_00012.bin 4 +scene0066_00_00013.bin 4 +scene0066_00_00014.bin 4 +scene0070_00_00007.bin 4 +scene0075_00_00005.bin 4 +scene0076_00_00008.bin 4 +scene0076_00_00010.bin 4 +scene0079_00_00011.bin 4 +scene0079_00_00012.bin 4 +scene0079_00_00014.bin 4 +scene0082_00_00005.bin 4 +scene0085_00_00009.bin 4 t +scene0087_00_00009.bin 9 t +scene0088_00_00004.bin 4 +scene0088_00_00006.bin 4 +scene0088_00_00009.bin 4 +scene0088_00_00010.bin 4 +scene0088_00_00011.bin 4 +scene0088_00_00013.bin 4 +scene0088_00_00016.bin 4 +scene0088_00_00021.bin 4 +scene0089_00_00006.bin 4 t +scene0095_00_00007.bin 4 +scene0098_00_00009.bin 4 +scene0098_00_00010.bin 4 +scene0101_00_00020.bin 4 t +scene0103_00_00006.bin 4 +scene0103_00_00008.bin 4 +scene0103_00_00010.bin 4 +scene0106_00_00015.bin 4 +scene0107_00_00005.bin 13 +scene0108_00_00008.bin 4 +scene0114_00_00010.bin 4 +scene0114_00_00011.bin 4 +scene0114_00_00012.bin 4 +scene0122_00_00005.bin 4 +scene0122_00_00006.bin 4 +scene0122_00_00007.bin 4 +scene0126_00_00005.bin 4 +scene0126_00_00007.bin 4 +scene0126_00_00010.bin 4 +scene0129_00_00005.bin 13 +scene0129_00_00006.bin 13 +scene0131_00_00010.bin 4 +scene0131_00_00012.bin 4 +scene0132_00_00007.bin 4 t +scene0132_00_00010.bin 4 t +scene0132_00_00013.bin 13 +scene0132_00_00014.bin 4 t +scene0132_00_00015.bin 4 t +scene0133_00_00002.bin 4 t +scene0133_00_00003.bin 4 t +scene0133_00_00004.bin 4 t +scene0133_00_00005.bin 4 t +scene0134_00_00005.bin 4 t +scene0134_00_00007.bin 4 t +scene0134_00_00008.bin 4 t +scene0138_00_00014.bin 4 +scene0138_00_00016.bin 4 +scene0138_00_00018.bin 4 +scene0138_00_00024.bin 4 +scene0140_00_00011.bin 4 +scene0140_00_00014.bin 4 +scene0140_00_00017.bin 4 +scene0140_00_00018.bin 4 +scene0140_00_00019.bin 4 +scene0140_00_00020.bin 4 +scene0140_00_00021.bin 4 +scene0140_00_00022.bin 4 +scene0140_00_00023.bin 4 +scene0140_00_00024.bin 4 +scene0140_00_00025.bin 4 +scene0140_00_00026.bin 4 +scene0140_00_00028.bin 4 +scene0140_00_00029.bin 4 +scene0140_00_00030.bin 4 +scene0140_00_00031.bin 4 +scene0140_00_00032.bin 4 +scene0140_00_00034.bin 4 +scene0141_00_00010.bin 4 t +scene0141_00_00011.bin 4 t +scene0141_00_00013.bin 4 t +scene0143_00_00004.bin 13 +scene0144_00_00011.bin 4 +scene0144_00_00012.bin 4 +scene0145_00_00007.bin 4 t +scene0149_00_00015.bin 4 +scene0150_00_00004.bin 4 +scene0152_00_00011.bin 4 +scene0152_00_00012.bin 4 +scene0152_00_00015.bin 4 +scene0152_00_00017.bin 4 +scene0155_00_00009.bin 4 t +scene0155_00_00010.bin 4 t +scene0155_00_00011.bin 4 t +scene0155_00_00012.bin 4 t +scene0156_00_00010.bin 4 +scene0156_00_00011.bin 4 +scene0159_00_00006.bin 4 t +scene0160_00_00006.bin 4 +scene0161_00_00004.bin 4 +scene0163_00_00004.bin 4 t +scene0163_00_00005.bin 4 t +scene0163_00_00007.bin 4 t +scene0163_00_00008.bin 4 t +scene0163_00_00010.bin 4 t +scene0165_00_00003.bin 13 +scene0165_00_00004.bin 13 +scene0168_00_00015.bin 4 +scene0171_00_00005.bin 4 t +scene0171_00_00006.bin 4 t +scene0171_00_00007.bin 4 t +scene0171_00_00008.bin 4 t +scene0171_00_00009.bin 4 t +scene0171_00_00010.bin 4 t +scene0177_00_00009.bin 4 +scene0177_00_00010.bin 4 +scene0178_00_00011.bin 4 +scene0001_00_00012.bin 9 +scene0001_00_00016.bin 9 +scene0001_00_00019.bin 9 +scene0002_00_00024.bin 9 +scene0013_00_00005.bin 9 +scene0022_00_00003.bin 9 +scene0022_00_00005.bin 9 +scene0022_00_00006.bin 9 +scene0024_00_00004.bin 9 t +scene0035_00_00008.bin 9 t +scene0038_00_00003.bin 9 +scene0050_00_00007.bin 5 +scene0053_00_00005.bin 9 +scene0054_00_00046.bin 9 +scene0064_00_00003.bin 9 +scene0082_00_00001.bin 9 +scene0082_00_00002.bin 9 +scene0091_00_00004.bin 9 +scene0101_00_00016.bin 9 t +scene0102_00_00004.bin 9 +scene0106_00_00009.bin 9 +scene0106_00_00012.bin 9 +scene0111_00_00008.bin 9 +scene0127_00_00017.bin 9 t +scene0129_00_00007.bin 9 t +scene0132_00_00009.bin 4 t +scene0136_00_00010.bin 3 t +scene0137_00_00007.bin 9 +scene0138_00_00006.bin 9 t +scene0140_00_00004.bin 9 +scene0151_00_00007.bin 9 +scene0152_00_00010.bin 9 +scene0152_00_00014.bin 9 +scene0155_00_00003.bin 9 +scene0155_00_00004.bin 9 +scene0155_00_00008.bin 9 +scene0155_00_00013.bin 9 +scene0155_00_00015.bin 9 +scene0157_00_00007.bin 9 +scene0162_00_00006.bin 9 +scene0163_00_00002.bin 9 +scene0178_00_00007.bin 9 +scene0181_00_00018.bin 9 +scene0181_00_00025.bin 9 +scene0187_00_00004.bin 9 +scene0187_00_00005.bin 9 +scene0187_00_00008.bin 9 +scene0199_00_00004.bin 9 +scene0203_00_00011.bin 9 t +scene0203_00_00014.bin 9 t +scene0205_00_00005.bin 9 t +scene0209_00_00010.bin 9 +scene0212_00_00003.bin 9 +scene0213_00_00010.bin 9 +scene0213_00_00015.bin 9 +scene0226_00_00007.bin 9 +scene0226_00_00011.bin 9 +scene0230_00_00008.bin 9 +scene0235_00_00013.bin 9 t +scene0235_00_00021.bin 9 t +scene0239_00_00007.bin 9 +scene0246_00_00008.bin 9 t +scene0246_00_00018.bin 9 t +scene0251_00_00005.bin 9 +scene0251_00_00006.bin 9 +scene0259_00_00008.bin 9 +scene0266_00_00004.bin 9 +scene0266_00_00005.bin 9 +scene0267_00_00002.bin 9 t +scene0270_00_00010.bin 9 +scene0272_00_00009.bin 9 t +scene0276_00_00009.bin 9 +scene0276_00_00015.bin 9 +scene0279_00_00012.bin 9 +scene0279_00_00021.bin 9 +scene0281_00_00006.bin 9 +scene0288_00_00007.bin 9 +scene0295_00_00006.bin 9 +scene0295_00_00007.bin 9 +scene0297_00_00006.bin 3 +scene0297_00_00008.bin 9 +scene0300_00_00002.bin 9 t +scene0300_00_00003.bin 9 t +scene0301_00_00006.bin 9 +scene0307_00_00009.bin 8 +scene0309_00_00004.bin 5 +scene0315_00_00013.bin 9 t +scene0315_00_00025.bin 9 t +scene0317_00_00010.bin 9 +scene0322_00_00002.bin 9 +scene0324_00_00003.bin 9 +scene0336_00_00004.bin 5 +scene0340_00_00011.bin 9 +scene0342_00_00005.bin 9 t +scene0355_00_00007.bin 9 +scene0355_00_00008.bin 9 +scene0357_00_00013.bin 9 +scene0358_00_00003.bin 9 +scene0358_00_00020.bin 9 +scene0362_00_00012.bin 9 +scene0363_00_00013.bin 9 +scene0370_00_00017.bin 9 +scene0385_00_00006.bin 3 +scene0386_00_00008.bin 9 +scene0387_00_00009.bin 9 +scene0389_00_00008.bin 9 t +scene0390_00_00002.bin 9 +scene0404_00_00006.bin 9 +scene0407_00_00006.bin 9 +scene0418_00_00010.bin 3 +scene0424_00_00005.bin 5 +scene0430_00_00002.bin 9 +scene0432_00_00003.bin 9 +scene0451_00_00007.bin 9 +scene0455_00_00005.bin 9 +scene0461_00_00005.bin 9 +scene0465_00_00006.bin 9 +scene0472_00_00009.bin 9 +scene0476_00_00008.bin 9 +scene0477_00_00020.bin 9 +scene0481_00_00005.bin 9 +scene0481_00_00006.bin 9 +scene0481_00_00007.bin 9 +scene0481_00_00011.bin 9 +scene0487_00_00017.bin 9 +scene0487_00_00019.bin 9 +scene0495_00_00001.bin 9 t +scene0495_00_00002.bin 9 t +scene0499_00_00006.bin 9 +scene0499_00_00016.bin 9 +scene0500_00_00008.bin 9 +scene0507_00_00005.bin 9 t +scene0514_00_00007.bin 9 +scene0518_00_00004.bin 9 +scene0529_00_00016.bin 9 t +scene0537_00_00004.bin 9 +scene0542_00_00006.bin 9 +scene0547_00_00013.bin 9 t +scene0549_00_00009.bin 9 +scene0549_00_00010.bin 9 +scene0549_00_00012.bin 9 +scene0549_00_00013.bin 9 +scene0558_00_00011.bin 9 +scene0572_00_00004.bin 9 +scene0574_00_00005.bin 9 t +scene0588_00_00016.bin 9 +scene0588_00_00017.bin 9 +scene0588_00_00018.bin 9 +scene0588_00_00021.bin 9 +scene0598_00_00003.bin 9 +scene0599_00_00003.bin 9 +scene0601_00_00010.bin 9 +scene0603_00_00007.bin 9 t +scene0603_00_00009.bin 5 +scene0603_00_00016.bin 9 t +scene0617_00_00007.bin 9 +scene0622_00_00001.bin 9 t +scene0626_00_00003.bin 9 +scene0627_00_00002.bin 9 +scene0638_00_00001.bin 9 +scene0640_00_00006.bin 9 +scene0641_00_00008.bin 9 t +scene0646_00_00009.bin 9 +scene0646_00_00017.bin 9 +scene0000_00_00019.bin 5 t +scene0006_00_00005.bin 5 +scene0032_00_00005.bin 5 +scene0035_00_00005.bin 5 +scene0040_00_00003.bin 5 +scene0043_00_00003.bin 5 t +scene0050_00_00022.bin 5 +scene0055_00_00002.bin 5 +scene0078_00_00002.bin 5 +scene0089_00_00004.bin 5 +scene0091_00_00005.bin 5 +scene0094_00_00006.bin 5 +scene0101_00_00006.bin 5 t +scene0108_00_00003.bin 5 +scene0108_00_00005.bin 5 +scene0110_00_00006.bin 5 t +scene0123_00_00002.bin 9 +scene0123_00_00003.bin 9 +scene0123_00_00004.bin 9 +scene0123_00_00005.bin 9 +scene0126_00_00004.bin 5 +scene0127_00_00008.bin 5 +scene0127_00_00009.bin 5 +scene0155_00_00002.bin 5 +scene0166_00_00005.bin 5 +scene0174_00_00006.bin 5 +scene0193_00_00003.bin 5 +scene0207_00_00005.bin 5 +scene0211_00_00004.bin 5 +scene0217_00_00006.bin 5 +scene0217_00_00008.bin 5 +scene0222_00_00003.bin 5 +scene0222_00_00004.bin 5 +scene0231_00_00015.bin 5 +scene0233_00_00005.bin 5 +scene0266_00_00002.bin 5 +scene0266_00_00006.bin 5 +scene0266_00_00009.bin 5 +scene0266_00_00018.bin 9 +scene0272_00_00007.bin 5 +scene0287_00_00003.bin 5 +scene0293_00_00000.bin 5 +scene0320_00_00004.bin 5 t +scene0333_00_00002.bin 5 +scene0336_00_00006.bin 5 +scene0341_00_00003.bin 5 t +scene0353_00_00007.bin 5 t +scene0370_00_00003.bin 5 +scene0376_00_00004.bin 5 +scene0378_00_00005.bin 5 +scene0378_00_00007.bin 5 +scene0378_00_00010.bin 5 +scene0383_00_00006.bin 5 +scene0398_00_00004.bin 5 +scene0398_00_00007.bin 5 +scene0400_00_00005.bin 5 +scene0425_00_00004.bin 5 +scene0440_00_00007.bin 5 t +scene0440_00_00009.bin 5 t +scene0443_00_00005.bin 5 +scene0443_00_00009.bin 5 +scene0468_00_00006.bin 5 +scene0468_00_00008.bin 5 +scene0474_00_00005.bin 5 +scene0489_00_00003.bin 5 +scene0505_00_00002.bin 5 t +scene0506_00_00004.bin 5 +scene0515_00_00011.bin 5 +scene0517_00_00009.bin 5 +scene0517_00_00011.bin 5 +scene0547_00_00008.bin 5 +scene0554_00_00010.bin 5 +scene0620_00_00004.bin 5 +scene0643_00_00006.bin 5 t +scene0643_00_00007.bin 5 t +scene0643_00_00008.bin 5 t +scene0000_00_00041.bin 0 t +scene0043_00_00007.bin 0 +scene0050_00_00017.bin 0 +scene0054_00_00041.bin 0 +scene0054_00_00049.bin 0 +scene0108_00_00016.bin 0 +scene0130_00_00006.bin 0 +scene0141_00_00017.bin 0 t +scene0174_00_00008.bin 0 t +scene0187_00_00013.bin 0 +scene0198_00_00011.bin 0 +scene0217_00_00016.bin 0 +scene0239_00_00008.bin 0 t +scene0242_00_00007.bin 0 t +scene0358_00_00018.bin 0 +scene0372_00_00013.bin 0 t +scene0388_00_00008.bin 0 +scene0425_00_00016.bin 0 +scene0426_00_00022.bin 0 +scene0430_00_00022.bin 0 +scene0433_00_00013.bin 0 +scene0456_00_00010.bin 0 t +scene0473_00_00008.bin 0 +scene0493_00_00009.bin 0 +scene0508_00_00016.bin 0 t +scene0517_00_00023.bin 0 +scene0517_00_00027.bin 0 +scene0517_00_00030.bin 0 +scene0558_00_00009.bin 0 +scene0580_00_00010.bin 0 +scene0580_00_00011.bin 0 +scene0615_00_00021.bin 0 t +scene0627_00_00037.bin 0 +scene0000_00_00012.bin 3 +scene0000_00_00014.bin 3 +scene0000_00_00022.bin 3 +scene0000_00_00023.bin 3 +scene0000_00_00028.bin 3 +scene0000_00_00033.bin 3 +scene0002_00_00004.bin 3 +scene0002_00_00015.bin 8 +scene0002_00_00018.bin 8 +scene0003_00_00003.bin 3 +scene0003_00_00004.bin 3 +scene0003_00_00005.bin 3 +scene0003_00_00007.bin 3 +scene0003_00_00008.bin 3 +scene0003_00_00011.bin 3 +scene0007_00_00001.bin 3 +scene0010_00_00008.bin 5 +scene0014_00_00005.bin 12 +scene0018_00_00006.bin 3 +scene0024_00_00009.bin 3 +scene0026_00_00009.bin 12 +scene0034_00_00006.bin 3 +scene0035_00_00006.bin 3 +scene0040_00_00014.bin 3 t +scene0046_00_00004.bin 3 +scene0047_00_00004.bin 3 +scene0047_00_00009.bin 3 +scene0049_00_00006.bin 3 +scene0051_00_00006.bin 3 +scene0054_00_00030.bin 3 t +scene0063_00_00006.bin 3 +scene0063_00_00008.bin 3 +scene0063_00_00017.bin 3 +scene0068_00_00004.bin 3 +scene0072_00_00002.bin 3 +scene0073_00_00005.bin 3 +scene0076_00_00005.bin 3 +scene0080_00_00003.bin 3 t +scene0090_00_00004.bin 14 +scene0090_00_00005.bin 14 +scene0090_00_00006.bin 14 +scene0091_00_00008.bin 3 +scene0092_00_00005.bin 3 t +scene0092_00_00008.bin 1 +scene0094_00_00003.bin 5 +scene0095_00_00004.bin 3 t +scene0097_00_00004.bin 3 +scene0097_00_00005.bin 3 +scene0097_00_00006.bin 3 +scene0097_00_00014.bin 3 +scene0100_00_00002.bin 3 +scene0101_00_00012.bin 3 +scene0104_00_00006.bin 3 +scene0108_00_00004.bin 8 +scene0108_00_00007.bin 8 +scene0109_00_00003.bin 3 +scene0110_00_00003.bin 3 +scene0114_00_00002.bin 3 +scene0114_00_00003.bin 3 +scene0114_00_00006.bin 3 +scene0114_00_00014.bin 3 +scene0114_00_00015.bin 3 +scene0114_00_00017.bin 3 +scene0114_00_00021.bin 3 +scene0117_00_00002.bin 3 t +scene0117_00_00004.bin 3 t +scene0117_00_00005.bin 3 t +scene0117_00_00010.bin 3 t +scene0121_00_00005.bin 3 +scene0124_00_00005.bin 14 +scene0124_00_00006.bin 3 +scene0126_00_00008.bin 8 t +scene0127_00_00004.bin 3 +scene0127_00_00006.bin 3 +scene0131_00_00014.bin 3 +scene0147_00_00004.bin 3 +scene0147_00_00007.bin 3 +scene0147_00_00009.bin 3 +scene0147_00_00010.bin 3 +scene0147_00_00012.bin 3 +scene0147_00_00016.bin 3 +scene0149_00_00005.bin 3 +scene0149_00_00009.bin 3 +scene0149_00_00011.bin 3 +scene0149_00_00017.bin 3 +scene0153_00_00005.bin 3 +scene0157_00_00004.bin 3 +scene0158_00_00002.bin 3 t +scene0158_00_00003.bin 3 t +scene0158_00_00006.bin 3 t +scene0158_00_00007.bin 3 t +scene0162_00_00007.bin 8 +scene0164_00_00003.bin 3 +scene0164_00_00008.bin 3 +scene0164_00_00010.bin 3 +scene0164_00_00012.bin 3 +scene0164_00_00017.bin 3 +scene0172_00_00003.bin 3 +scene0175_00_00006.bin 3 +scene0181_00_00004.bin 3 +scene0184_00_00003.bin 3 +scene0186_00_00004.bin 3 +scene0186_00_00012.bin 3 +scene0188_00_00007.bin 3 +scene0195_00_00006.bin 3 +scene0200_00_00003.bin 3 +scene0201_00_00007.bin 3 +scene0204_00_00003.bin 3 +scene0205_00_00002.bin 3 +scene0205_00_00008.bin 3 +scene0207_00_00008.bin 8 +scene0210_00_00003.bin 3 +scene0211_00_00005.bin 3 +scene0211_00_00006.bin 3 +scene0214_00_00004.bin 3 +scene0214_00_00006.bin 8 +scene0214_00_00011.bin 3 +scene0215_00_00004.bin 3 +scene0217_00_00004.bin 3 t +scene0221_00_00007.bin 3 t +scene0221_00_00009.bin 3 t +scene0223_00_00002.bin 3 +scene0223_00_00009.bin 5 +scene0224_00_00010.bin 3 +scene0225_00_00006.bin 3 +scene0225_00_00007.bin 3 +scene0225_00_00008.bin 3 +scene0231_00_00013.bin 3 +scene0232_00_00006.bin 3 t +scene0232_00_00009.bin 3 t +scene0233_00_00003.bin 3 t +scene0233_00_00010.bin 3 t +scene0233_00_00011.bin 3 t +scene0233_00_00012.bin 3 t +scene0236_00_00006.bin 3 +scene0240_00_00003.bin 3 +scene0240_00_00004.bin 3 +scene0240_00_00013.bin 3 +scene0246_00_00006.bin 3 +scene0247_00_00006.bin 3 +scene0247_00_00008.bin 3 +scene0247_00_00014.bin 3 +scene0247_00_00019.bin 3 +scene0250_00_00006.bin 3 +scene0253_00_00002.bin 3 t +scene0255_00_00006.bin 3 t +scene0255_00_00008.bin 3 t +scene0259_00_00004.bin 8 +scene0270_00_00011.bin 3 +scene0271_00_00012.bin 3 +scene0272_00_00008.bin 3 +scene0276_00_00005.bin 3 t +scene0276_00_00006.bin 3 t +scene0276_00_00013.bin 3 t +scene0278_00_00003.bin 3 +scene0278_00_00004.bin 3 +scene0279_00_00010.bin 3 +scene0280_00_00010.bin 3 t +scene0282_00_00006.bin 3 +scene0286_00_00009.bin 3 +scene0295_00_00004.bin 3 t +scene0295_00_00010.bin 3 t +scene0296_00_00010.bin 3 +scene0303_00_00006.bin 3 +scene0304_00_00005.bin 3 +scene0305_00_00010.bin 3 +scene0309_00_00008.bin 3 +scene0310_00_00002.bin 3 +scene0310_00_00003.bin 3 +scene0311_00_00001.bin 3 +scene0327_00_00007.bin 3 +scene0327_00_00009.bin 3 +scene0335_00_00002.bin 3 +scene0335_00_00007.bin 3 +scene0335_00_00011.bin 3 +scene0335_00_00012.bin 3 +scene0335_00_00023.bin 3 +scene0336_00_00008.bin 3 +scene0337_00_00001.bin 3 +scene0338_00_00002.bin 3 +scene0338_00_00005.bin 3 +scene0345_00_00006.bin 3 +scene0348_00_00003.bin 3 t +scene0348_00_00004.bin 3 t +scene0348_00_00005.bin 3 t +scene0350_00_00007.bin 8 +scene0352_00_00009.bin 3 t +scene0353_00_00018.bin 3 +scene0356_00_00005.bin 3 +scene0357_00_00002.bin 3 t +scene0357_00_00015.bin 3 t +scene0361_00_00006.bin 8 +scene0364_00_00004.bin 3 +scene0364_00_00007.bin 3 +scene0364_00_00010.bin 3 +scene0366_00_00002.bin 3 +scene0369_00_00007.bin 3 +scene0369_00_00008.bin 3 +scene0376_00_00005.bin 3 +scene0378_00_00008.bin 8 +scene0378_00_00019.bin 3 t +scene0379_00_00004.bin 8 +scene0379_00_00014.bin 3 +scene0379_00_00028.bin 3 +scene0390_00_00005.bin 3 t +scene0392_00_00011.bin 3 +scene0392_00_00013.bin 3 +scene0392_00_00014.bin 3 +scene0394_00_00015.bin 3 +scene0395_00_00008.bin 3 +scene0398_00_00013.bin 3 t +scene0400_00_00007.bin 3 +scene0409_00_00003.bin 3 t +scene0414_00_00006.bin 3 +scene0419_00_00006.bin 3 +scene0425_00_00002.bin 3 +scene0426_00_00005.bin 3 t +scene0431_00_00003.bin 3 +scene0431_00_00004.bin 3 +scene0431_00_00007.bin 3 +scene0431_00_00011.bin 3 +scene0431_00_00012.bin 3 +scene0431_00_00014.bin 3 +scene0438_00_00007.bin 3 t +scene0439_00_00002.bin 3 +scene0439_00_00003.bin 3 +scene0439_00_00004.bin 3 +scene0439_00_00011.bin 3 +scene0439_00_00012.bin 3 +scene0440_00_00002.bin 3 +scene0440_00_00013.bin 3 +scene0444_00_00000.bin 8 +scene0447_00_00003.bin 3 +scene0447_00_00011.bin 12 +scene0449_00_00004.bin 8 +scene0449_00_00006.bin 12 +scene0465_00_00011.bin 3 +scene0467_00_00011.bin 3 +scene0472_00_00004.bin 3 +scene0472_00_00010.bin 12 +scene0472_00_00018.bin 3 +scene0476_00_00004.bin 3 +scene0477_00_00007.bin 3 +scene0477_00_00008.bin 3 +scene0477_00_00021.bin 3 +scene0478_00_00002.bin 3 +scene0479_00_00002.bin 3 t +scene0479_00_00003.bin 3 t +scene0479_00_00012.bin 3 t +scene0482_00_00002.bin 3 t +scene0487_00_00022.bin 3 +scene0488_00_00003.bin 3 +scene0488_00_00004.bin 3 +scene0488_00_00005.bin 3 +scene0488_00_00008.bin 3 +scene0488_00_00011.bin 3 +scene0491_00_00002.bin 3 +scene0492_00_00005.bin 12 +scene0498_00_00010.bin 3 +scene0504_00_00021.bin 3 +scene0505_00_00014.bin 3 t +scene0505_00_00018.bin 3 t +scene0505_00_00021.bin 3 t +scene0506_00_00005.bin 3 +scene0506_00_00009.bin 3 +scene0510_00_00003.bin 12 +scene0511_00_00005.bin 3 +scene0515_00_00010.bin 3 +scene0517_00_00001.bin 3 +scene0517_00_00013.bin 3 +scene0517_00_00014.bin 3 +scene0517_00_00022.bin 3 +scene0519_00_00003.bin 12 t +scene0521_00_00005.bin 3 +scene0521_00_00013.bin 3 +scene0525_00_00005.bin 3 +scene0529_00_00003.bin 3 t +scene0529_00_00009.bin 3 t +scene0529_00_00013.bin 12 +scene0532_00_00014.bin 3 +scene0540_00_00011.bin 3 +scene0541_00_00007.bin 3 +scene0541_00_00008.bin 3 +scene0542_00_00003.bin 3 +scene0546_00_00010.bin 3 +scene0547_00_00003.bin 3 +scene0548_00_00009.bin 3 +scene0556_00_00005.bin 3 +scene0570_00_00005.bin 12 +scene0573_00_00006.bin 3 t +scene0577_00_00006.bin 3 +scene0577_00_00007.bin 3 +scene0577_00_00008.bin 3 +scene0580_00_00007.bin 3 +scene0584_00_00005.bin 3 +scene0589_00_00003.bin 3 +scene0589_00_00005.bin 3 +scene0590_00_00009.bin 3 +scene0590_00_00016.bin 3 +scene0591_00_00004.bin 3 t +scene0603_00_00008.bin 8 t +scene0607_00_00003.bin 3 +scene0614_00_00009.bin 3 +scene0615_00_00008.bin 3 +scene0620_00_00005.bin 3 +scene0620_00_00006.bin 3 +scene0623_00_00011.bin 3 t +scene0629_00_00004.bin 3 +scene0631_00_00002.bin 3 +scene0632_00_00003.bin 3 t +scene0633_00_00007.bin 3 t +scene0642_00_00008.bin 3 +scene0642_00_00020.bin 3 +scene0646_00_00019.bin 8 +scene0005_00_00008.bin 8 +scene0012_00_00003.bin 8 +scene0020_00_00002.bin 8 +scene0020_00_00008.bin 8 +scene0025_00_00007.bin 8 +scene0028_00_00004.bin 8 +scene0028_00_00008.bin 8 +scene0028_00_00013.bin 8 +scene0028_00_00014.bin 8 +scene0028_00_00019.bin 8 +scene0030_00_00001.bin 8 +scene0030_00_00014.bin 8 +scene0030_00_00022.bin 8 +scene0032_00_00003.bin 8 +scene0037_00_00002.bin 8 +scene0037_00_00003.bin 8 +scene0040_00_00002.bin 8 +scene0040_00_00011.bin 8 +scene0049_00_00005.bin 8 +scene0050_00_00014.bin 8 +scene0051_00_00005.bin 8 t +scene0054_00_00003.bin 8 +scene0054_00_00005.bin 8 +scene0054_00_00011.bin 8 +scene0054_00_00014.bin 8 +scene0054_00_00039.bin 8 +scene0072_00_00013.bin 8 t +scene0077_00_00001.bin 8 +scene0077_00_00011.bin 8 +scene0079_00_00003.bin 8 +scene0079_00_00004.bin 8 +scene0079_00_00005.bin 8 +scene0079_00_00006.bin 8 +scene0079_00_00007.bin 8 +scene0079_00_00010.bin 8 +scene0092_00_00004.bin 8 +scene0094_00_00005.bin 8 +scene0098_00_00004.bin 8 +scene0098_00_00011.bin 8 +scene0108_00_00012.bin 8 +scene0109_00_00006.bin 8 t +scene0131_00_00008.bin 8 t +scene0144_00_00013.bin 8 +scene0154_00_00004.bin 8 +scene0168_00_00020.bin 8 +scene0168_00_00021.bin 8 +scene0177_00_00002.bin 8 +scene0177_00_00004.bin 8 +scene0177_00_00007.bin 8 +scene0181_00_00013.bin 8 +scene0181_00_00014.bin 8 +scene0186_00_00005.bin 8 +scene0186_00_00009.bin 8 +scene0186_00_00015.bin 8 +scene0190_00_00002.bin 8 t +scene0190_00_00004.bin 8 t +scene0191_00_00001.bin 8 +scene0194_00_00005.bin 8 +scene0197_00_00002.bin 8 +scene0203_00_00003.bin 8 +scene0203_00_00009.bin 8 +scene0207_00_00019.bin 8 +scene0208_00_00002.bin 8 +scene0208_00_00005.bin 8 +scene0208_00_00006.bin 8 +scene0208_00_00007.bin 8 +scene0208_00_00008.bin 8 +scene0208_00_00009.bin 8 +scene0211_00_00007.bin 8 +scene0217_00_00005.bin 8 +scene0217_00_00009.bin 8 +scene0218_00_00002.bin 8 t +scene0223_00_00008.bin 8 +scene0223_00_00010.bin 8 +scene0224_00_00005.bin 8 t +scene0231_00_00006.bin 8 +scene0233_00_00007.bin 8 +scene0233_00_00008.bin 8 +scene0236_00_00005.bin 8 t +scene0236_00_00010.bin 8 t +scene0240_00_00006.bin 8 +scene0241_00_00005.bin 8 +scene0246_00_00011.bin 8 +scene0253_00_00009.bin 8 +scene0259_00_00013.bin 8 +scene0262_00_00003.bin 8 +scene0272_00_00002.bin 8 t +scene0272_00_00006.bin 8 t +scene0286_00_00019.bin 3 +scene0293_00_00003.bin 8 +scene0295_00_00005.bin 8 +scene0301_00_00017.bin 8 +scene0303_00_00003.bin 8 +scene0305_00_00006.bin 8 +scene0305_00_00008.bin 8 +scene0305_00_00009.bin 8 +scene0305_00_00013.bin 8 +scene0309_00_00007.bin 8 +scene0325_00_00003.bin 8 +scene0325_00_00004.bin 8 +scene0332_00_00008.bin 8 +scene0349_00_00004.bin 8 +scene0353_00_00006.bin 8 +scene0353_00_00008.bin 8 +scene0361_00_00002.bin 8 +scene0361_00_00004.bin 8 +scene0377_00_00002.bin 8 +scene0377_00_00004.bin 8 +scene0378_00_00003.bin 8 +scene0378_00_00004.bin 8 +scene0379_00_00006.bin 8 +scene0379_00_00009.bin 8 +scene0382_00_00005.bin 8 +scene0383_00_00003.bin 8 t +scene0392_00_00009.bin 8 +scene0393_00_00003.bin 8 +scene0395_00_00013.bin 8 +scene0398_00_00012.bin 8 t +scene0400_00_00003.bin 8 t +scene0404_00_00001.bin 8 +scene0404_00_00005.bin 8 +scene0407_00_00004.bin 8 +scene0408_00_00004.bin 8 t +scene0422_00_00009.bin 1 t +scene0424_00_00003.bin 8 +scene0425_00_00006.bin 8 t +scene0425_00_00022.bin 8 t +scene0440_00_00005.bin 8 +scene0440_00_00008.bin 8 +scene0443_00_00008.bin 8 +scene0443_00_00010.bin 8 +scene0444_00_00002.bin 8 +scene0451_00_00009.bin 3 +scene0464_00_00004.bin 8 t +scene0465_00_00018.bin 8 +scene0467_00_00003.bin 8 t +scene0467_00_00006.bin 8 t +scene0467_00_00010.bin 8 t +scene0474_00_00006.bin 8 t +scene0474_00_00011.bin 8 t +scene0481_00_00002.bin 8 +scene0504_00_00003.bin 8 +scene0505_00_00004.bin 8 +scene0506_00_00006.bin 8 t +scene0506_00_00007.bin 8 t +scene0514_00_00009.bin 8 +scene0515_00_00012.bin 8 +scene0518_00_00001.bin 8 +scene0521_00_00004.bin 8 t +scene0534_00_00003.bin 8 +scene0534_00_00004.bin 8 +scene0542_00_00008.bin 8 +scene0545_00_00003.bin 8 +scene0547_00_00005.bin 8 +scene0554_00_00007.bin 8 +scene0558_00_00002.bin 8 +scene0565_00_00006.bin 8 t +scene0565_00_00008.bin 8 t +scene0576_00_00008.bin 8 +scene0577_00_00003.bin 8 t +scene0580_00_00006.bin 8 t +scene0582_00_00004.bin 8 +scene0582_00_00014.bin 8 +scene0585_00_00002.bin 8 t +scene0585_00_00005.bin 8 t +scene0585_00_00007.bin 8 t +scene0589_00_00002.bin 8 +scene0591_00_00005.bin 8 +scene0591_00_00010.bin 8 +scene0593_00_00003.bin 8 +scene0598_00_00002.bin 8 t +scene0603_00_00002.bin 8 t +scene0603_00_00012.bin 8 t +scene0603_00_00019.bin 8 t +scene0613_00_00004.bin 8 +scene0613_00_00006.bin 8 +scene0614_00_00002.bin 8 t +scene0614_00_00003.bin 8 t +scene0614_00_00018.bin 3 +scene0614_00_00020.bin 8 t +scene0619_00_00003.bin 8 +scene0630_00_00002.bin 8 +scene0632_00_00004.bin 8 +scene0635_00_00003.bin 8 +scene0643_00_00009.bin 8 +scene0643_00_00010.bin 8 +scene0644_00_00003.bin 8 t +scene0645_00_00025.bin 8 +scene0646_00_00013.bin 8 +scene0646_00_00018.bin 8 +scene0646_00_00025.bin 8 +scene0010_00_00020.bin 6 t +scene0010_00_00024.bin 6 t +scene0010_00_00031.bin 6 t +scene0017_00_00016.bin 6 t +scene0025_00_00015.bin 6 +scene0025_00_00016.bin 6 +scene0040_00_00016.bin 6 +scene0040_00_00017.bin 6 +scene0056_00_00014.bin 6 +scene0056_00_00020.bin 6 +scene0070_00_00013.bin 6 t +scene0085_00_00011.bin 6 +scene0095_00_00010.bin 6 +scene0095_00_00011.bin 6 +scene0095_00_00012.bin 6 +scene0095_00_00015.bin 6 +scene0131_00_00022.bin 6 +scene0137_00_00012.bin 6 +scene0138_00_00017.bin 6 t +scene0138_00_00021.bin 6 t +scene0147_00_00018.bin 6 +scene0166_00_00010.bin 6 t +scene0168_00_00022.bin 6 +scene0168_00_00025.bin 6 +scene0177_00_00008.bin 6 +scene0177_00_00015.bin 6 +scene0184_00_00005.bin 6 t +scene0206_00_00020.bin 6 +scene0209_00_00015.bin 6 +scene0211_00_00012.bin 6 +scene0238_00_00010.bin 6 +scene0263_00_00016.bin 6 +scene0264_00_00007.bin 6 +scene0279_00_00020.bin 6 +scene0289_00_00012.bin 6 +scene0296_00_00025.bin 6 +scene0305_00_00016.bin 6 +scene0305_00_00018.bin 6 +scene0305_00_00021.bin 6 +scene0314_00_00008.bin 6 +scene0320_00_00016.bin 6 +scene0362_00_00011.bin 6 +scene0378_00_00018.bin 6 +scene0385_00_00012.bin 6 +scene0389_00_00011.bin 6 t +scene0395_00_00011.bin 6 +scene0416_00_00017.bin 6 +scene0424_00_00015.bin 6 +scene0424_00_00018.bin 6 +scene0424_00_00019.bin 6 +scene0426_00_00010.bin 6 t +scene0480_00_00006.bin 6 +scene0489_00_00011.bin 6 +scene0489_00_00012.bin 6 +scene0502_00_00002.bin 6 +scene0568_00_00005.bin 6 +scene0569_00_00015.bin 6 +scene0582_00_00007.bin 6 +scene0582_00_00012.bin 6 +scene0582_00_00013.bin 6 +scene0590_00_00017.bin 6 +scene0598_00_00010.bin 6 +scene0598_00_00011.bin 6 +scene0599_00_00007.bin 6 +scene0603_00_00013.bin 6 +scene0604_00_00009.bin 6 +scene0608_00_00008.bin 6 +scene0614_00_00021.bin 6 +scene0617_00_00004.bin 6 +scene0623_00_00008.bin 6 +scene0642_00_00018.bin 6 +scene0643_00_00022.bin 6 +scene0643_00_00024.bin 6 +scene0646_00_00031.bin 6 +scene0000_00_00024.bin 7 t +scene0002_00_00006.bin 7 +scene0002_00_00009.bin 7 +scene0002_00_00010.bin 7 +scene0010_00_00007.bin 7 +scene0017_00_00006.bin 7 +scene0019_00_00008.bin 7 +scene0025_00_00004.bin 7 +scene0026_00_00008.bin 7 +scene0026_00_00010.bin 7 +scene0029_00_00003.bin 7 +scene0030_00_00009.bin 7 +scene0032_00_00006.bin 7 +scene0040_00_00008.bin 7 +scene0042_00_00005.bin 7 t +scene0044_00_00003.bin 7 +scene0047_00_00007.bin 7 t +scene0050_00_00011.bin 7 +scene0050_00_00013.bin 7 +scene0051_00_00008.bin 7 +scene0051_00_00010.bin 7 +scene0054_00_00007.bin 7 +scene0054_00_00010.bin 7 +scene0054_00_00012.bin 7 +scene0054_00_00019.bin 7 +scene0056_00_00006.bin 7 +scene0062_00_00003.bin 7 +scene0065_00_00003.bin 7 +scene0071_00_00002.bin 7 +scene0072_00_00007.bin 7 +scene0073_00_00006.bin 7 +scene0078_00_00004.bin 7 +scene0084_00_00006.bin 7 +scene0085_00_00007.bin 7 +scene0086_00_00002.bin 7 +scene0096_00_00007.bin 7 +scene0096_00_00009.bin 7 +scene0097_00_00003.bin 7 +scene0098_00_00015.bin 7 +scene0110_00_00005.bin 7 t +scene0115_00_00003.bin 7 +scene0118_00_00003.bin 7 +scene0118_00_00004.bin 7 +scene0121_00_00006.bin 7 +scene0122_00_00003.bin 7 +scene0124_00_00002.bin 7 +scene0124_00_00003.bin 7 +scene0126_00_00006.bin 7 t +scene0127_00_00005.bin 7 +scene0140_00_00008.bin 7 t +scene0142_00_00003.bin 7 t +scene0144_00_00009.bin 7 +scene0153_00_00004.bin 7 +scene0159_00_00009.bin 7 +scene0162_00_00004.bin 7 +scene0174_00_00004.bin 7 +scene0175_00_00007.bin 7 +scene0177_00_00005.bin 7 +scene0178_00_00006.bin 7 +scene0184_00_00004.bin 7 t +scene0186_00_00020.bin 7 +scene0191_00_00006.bin 7 t +scene0195_00_00004.bin 7 t +scene0196_00_00004.bin 7 +scene0197_00_00004.bin 7 +scene0198_00_00005.bin 7 +scene0198_00_00006.bin 7 +scene0204_00_00004.bin 7 t +scene0210_00_00006.bin 7 t +scene0214_00_00007.bin 7 +scene0217_00_00007.bin 7 t +scene0220_00_00009.bin 7 +scene0232_00_00004.bin 7 +scene0233_00_00006.bin 7 t +scene0240_00_00005.bin 7 +scene0241_00_00003.bin 7 t +scene0242_00_00002.bin 7 +scene0242_00_00003.bin 7 +scene0250_00_00005.bin 7 +scene0251_00_00009.bin 7 +scene0259_00_00006.bin 7 t +scene0261_00_00006.bin 7 +scene0261_00_00007.bin 7 +scene0265_00_00007.bin 12 +scene0267_00_00007.bin 7 +scene0268_00_00006.bin 7 +scene0276_00_00011.bin 7 +scene0279_00_00007.bin 7 +scene0286_00_00005.bin 7 +scene0290_00_00008.bin 7 t +scene0290_00_00011.bin 7 t +scene0290_00_00012.bin 7 t +scene0296_00_00009.bin 7 +scene0303_00_00005.bin 7 +scene0304_00_00006.bin 7 t +scene0305_00_00011.bin 7 +scene0307_00_00006.bin 7 t +scene0308_00_00006.bin 7 +scene0327_00_00006.bin 7 +scene0327_00_00008.bin 7 +scene0329_00_00007.bin 7 +scene0329_00_00008.bin 7 +scene0329_00_00012.bin 7 +scene0332_00_00005.bin 7 +scene0335_00_00005.bin 7 +scene0346_00_00004.bin 7 +scene0350_00_00005.bin 7 t +scene0352_00_00004.bin 7 +scene0357_00_00005.bin 7 +scene0358_00_00005.bin 7 +scene0360_00_00003.bin 7 +scene0364_00_00006.bin 7 +scene0375_00_00002.bin 7 t +scene0378_00_00006.bin 7 +scene0383_00_00005.bin 7 t +scene0384_00_00003.bin 7 +scene0389_00_00005.bin 7 +scene0396_00_00005.bin 7 +scene0398_00_00005.bin 7 +scene0410_00_00002.bin 7 +scene0415_00_00004.bin 7 +scene0419_00_00019.bin 7 +scene0421_00_00005.bin 7 +scene0424_00_00007.bin 7 +scene0425_00_00005.bin 7 +scene0434_00_00005.bin 7 +scene0438_00_00008.bin 7 +scene0446_00_00004.bin 7 +scene0447_00_00007.bin 7 +scene0448_00_00004.bin 7 +scene0449_00_00008.bin 7 +scene0465_00_00010.bin 7 +scene0470_00_00002.bin 7 +scene0473_00_00002.bin 7 +scene0473_00_00004.bin 7 +scene0474_00_00007.bin 7 t +scene0479_00_00004.bin 7 +scene0487_00_00006.bin 7 +scene0498_00_00004.bin 7 +scene0499_00_00018.bin 7 +scene0501_00_00003.bin 7 +scene0524_00_00007.bin 7 +scene0525_00_00008.bin 7 +scene0527_00_00004.bin 7 +scene0530_00_00006.bin 7 +scene0532_00_00004.bin 7 +scene0534_00_00006.bin 7 +scene0538_00_00004.bin 7 t +scene0539_00_00006.bin 7 +scene0541_00_00009.bin 7 +scene0547_00_00007.bin 7 +scene0548_00_00007.bin 7 +scene0550_00_00005.bin 7 +scene0554_00_00005.bin 7 +scene0560_00_00004.bin 7 +scene0561_00_00003.bin 7 +scene0561_00_00004.bin 7 +scene0561_00_00006.bin 7 +scene0561_00_00007.bin 7 +scene0561_00_00008.bin 7 +scene0564_00_00002.bin 7 t +scene0571_00_00005.bin 7 +scene0574_00_00003.bin 7 t +scene0581_00_00006.bin 7 t +scene0583_00_00005.bin 7 +scene0599_00_00005.bin 7 +scene0613_00_00008.bin 7 t +scene0615_00_00004.bin 7 +scene0623_00_00006.bin 7 t +scene0625_00_00003.bin 7 +scene0628_00_00005.bin 7 +scene0629_00_00011.bin 7 +scene0635_00_00006.bin 7 +scene0642_00_00026.bin 7 t +scene0643_00_00005.bin 7 +scene0645_00_00012.bin 7 +scene0646_00_00007.bin 7 +scene0000_00_00038.bin 1 t +scene0000_00_00039.bin 1 t +scene0000_00_00046.bin 1 t +scene0002_00_00029.bin 1 t +scene0002_00_00035.bin 1 t +scene0003_00_00009.bin 1 t +scene0009_00_00006.bin 1 t +scene0014_00_00007.bin 1 +scene0017_00_00015.bin 1 +scene0018_00_00009.bin 1 +scene0018_00_00013.bin 1 +scene0026_00_00016.bin 1 +scene0029_00_00007.bin 1 +scene0036_00_00005.bin 1 +scene0043_00_00006.bin 1 +scene0058_00_00011.bin 1 +scene0060_00_00007.bin 1 +scene0086_00_00009.bin 1 +scene0089_00_00007.bin 1 +scene0089_00_00008.bin 1 +scene0100_00_00009.bin 1 +scene0104_00_00008.bin 1 +scene0108_00_00021.bin 1 t +scene0109_00_00007.bin 1 +scene0111_00_00011.bin 1 +scene0120_00_00006.bin 1 +scene0127_00_00016.bin 1 t +scene0136_00_00005.bin 1 +scene0136_00_00008.bin 1 +scene0140_00_00027.bin 1 +scene0140_00_00035.bin 1 +scene0155_00_00019.bin 1 +scene0178_00_00016.bin 1 +scene0193_00_00006.bin 1 +scene0195_00_00009.bin 1 +scene0197_00_00007.bin 1 +scene0217_00_00014.bin 1 t +scene0217_00_00015.bin 1 t +scene0220_00_00016.bin 1 t +scene0222_00_00011.bin 1 +scene0222_00_00012.bin 1 +scene0225_00_00013.bin 1 +scene0225_00_00020.bin 1 +scene0225_00_00023.bin 1 +scene0230_00_00012.bin 1 +scene0233_00_00017.bin 1 +scene0233_00_00019.bin 1 +scene0233_00_00024.bin 1 +scene0240_00_00009.bin 1 +scene0240_00_00011.bin 1 +scene0249_00_00014.bin 1 +scene0251_00_00012.bin 1 t +scene0251_00_00015.bin 1 t +scene0251_00_00016.bin 1 t +scene0251_00_00017.bin 1 t +scene0251_00_00018.bin 1 t +scene0255_00_00011.bin 1 +scene0260_00_00010.bin 1 +scene0263_00_00015.bin 1 +scene0264_00_00011.bin 1 +scene0265_00_00009.bin 1 +scene0267_00_00011.bin 1 +scene0267_00_00012.bin 1 +scene0274_00_00006.bin 1 +scene0289_00_00016.bin 1 +scene0329_00_00018.bin 1 +scene0340_00_00017.bin 1 t +scene0347_00_00006.bin 1 +scene0348_00_00011.bin 1 +scene0349_00_00008.bin 1 +scene0353_00_00016.bin 1 +scene0358_00_00014.bin 1 +scene0360_00_00002.bin 1 +scene0360_00_00005.bin 1 +scene0370_00_00012.bin 1 +scene0371_00_00008.bin 1 +scene0373_00_00006.bin 1 +scene0377_00_00005.bin 1 +scene0377_00_00008.bin 1 +scene0378_00_00015.bin 1 +scene0383_00_00009.bin 1 +scene0394_00_00024.bin 1 t +scene0398_00_00008.bin 1 +scene0400_00_00010.bin 1 t +scene0402_00_00010.bin 1 +scene0403_00_00005.bin 1 t +scene0405_00_00002.bin 1 +scene0405_00_00003.bin 1 +scene0405_00_00004.bin 1 +scene0405_00_00005.bin 1 +scene0405_00_00006.bin 1 +scene0405_00_00007.bin 1 +scene0405_00_00008.bin 1 +scene0405_00_00009.bin 1 +scene0406_00_00008.bin 1 +scene0415_00_00012.bin 1 t +scene0422_00_00005.bin 1 t +scene0431_00_00013.bin 1 +scene0434_00_00008.bin 1 +scene0436_00_00003.bin 1 +scene0436_00_00004.bin 1 +scene0436_00_00006.bin 1 +scene0445_00_00005.bin 1 +scene0445_00_00006.bin 1 +scene0456_00_00013.bin 1 +scene0464_00_00015.bin 1 t +scene0469_00_00012.bin 1 +scene0470_00_00009.bin 1 t +scene0476_00_00009.bin 1 +scene0486_00_00007.bin 1 +scene0486_00_00008.bin 1 +scene0487_00_00025.bin 1 +scene0498_00_00008.bin 1 +scene0508_00_00013.bin 1 t +scene0510_00_00007.bin 1 +scene0510_00_00009.bin 1 +scene0511_00_00006.bin 1 +scene0517_00_00029.bin 1 +scene0519_00_00005.bin 1 +scene0523_00_00006.bin 1 +scene0528_00_00009.bin 1 +scene0530_00_00010.bin 1 +scene0544_00_00006.bin 1 +scene0552_00_00015.bin 1 +scene0565_00_00013.bin 1 +scene0574_00_00007.bin 1 t +scene0575_00_00014.bin 1 +scene0579_00_00004.bin 1 +scene0579_00_00005.bin 1 +scene0585_00_00012.bin 1 +scene0585_00_00013.bin 1 +scene0585_00_00015.bin 1 +scene0586_00_00010.bin 1 +scene0593_00_00006.bin 1 +scene0600_00_00007.bin 1 +scene0610_00_00007.bin 1 t +scene0616_00_00014.bin 1 +scene0644_00_00016.bin 1 +scene0030_00_00033.bin 2 +scene0030_00_00036.bin 2 +scene0030_00_00043.bin 2 +scene0030_00_00051.bin 2 +scene0030_00_00052.bin 2 +scene0054_00_00052.bin 2 +scene0077_00_00012.bin 2 +scene0098_00_00008.bin 2 +scene0104_00_00009.bin 2 +scene0108_00_00015.bin 2 +scene0120_00_00007.bin 2 t +scene0120_00_00008.bin 2 t +scene0164_00_00013.bin 2 +scene0174_00_00009.bin 2 +scene0206_00_00019.bin 2 +scene0256_00_00004.bin 2 +scene0256_00_00005.bin 2 +scene0263_00_00005.bin 2 +scene0291_00_00026.bin 2 +scene0301_00_00016.bin 2 +scene0315_00_00010.bin 2 +scene0325_00_00013.bin 2 t +scene0357_00_00016.bin 2 t +scene0379_00_00021.bin 2 +scene0384_00_00009.bin 2 +scene0384_00_00017.bin 2 +scene0384_00_00018.bin 2 +scene0384_00_00023.bin 2 +scene0384_00_00025.bin 2 +scene0384_00_00039.bin 2 +scene0404_00_00008.bin 2 t +scene0419_00_00013.bin 2 +scene0421_00_00009.bin 2 +scene0421_00_00011.bin 2 +scene0421_00_00013.bin 2 +scene0426_00_00008.bin 2 +scene0426_00_00013.bin 2 +scene0426_00_00020.bin 2 +scene0479_00_00017.bin 2 +scene0479_00_00019.bin 2 +scene0487_00_00023.bin 2 +scene0565_00_00007.bin 2 +scene0565_00_00009.bin 2 +scene0592_00_00028.bin 2 +scene0636_00_00001.bin 2 t +scene0646_00_00030.bin 2 +scene0000_00_00005.bin 10 t +scene0006_00_00002.bin 10 +scene0006_00_00003.bin 10 +scene0032_00_00002.bin 10 t +scene0035_00_00002.bin 10 +scene0039_00_00002.bin 10 +scene0046_00_00003.bin 10 +scene0055_00_00006.bin 10 +scene0070_00_00005.bin 10 +scene0072_00_00005.bin 10 +scene0073_00_00003.bin 10 +scene0078_00_00003.bin 10 +scene0085_00_00003.bin 10 +scene0085_00_00005.bin 10 +scene0092_00_00002.bin 10 +scene0101_00_00004.bin 10 +scene0107_00_00003.bin 10 +scene0127_00_00003.bin 10 t +scene0127_00_00007.bin 10 t +scene0127_00_00010.bin 10 t +scene0137_00_00003.bin 10 +scene0137_00_00004.bin 10 +scene0143_00_00000.bin 10 t +scene0144_00_00002.bin 10 +scene0147_00_00001.bin 10 t +scene0148_00_00003.bin 10 +scene0178_00_00003.bin 10 +scene0178_00_00004.bin 10 +scene0178_00_00018.bin 10 +scene0184_00_00002.bin 10 t +scene0193_00_00002.bin 10 +scene0207_00_00003.bin 10 +scene0209_00_00005.bin 10 +scene0209_00_00006.bin 10 +scene0217_00_00002.bin 10 t +scene0217_00_00003.bin 10 t +scene0219_00_00001.bin 10 t +scene0221_00_00003.bin 10 +scene0221_00_00004.bin 10 +scene0222_00_00005.bin 10 +scene0222_00_00006.bin 10 +scene0223_00_00007.bin 10 +scene0233_00_00004.bin 10 +scene0233_00_00009.bin 10 +scene0235_00_00004.bin 10 +scene0236_00_00001.bin 10 +scene0246_00_00004.bin 10 +scene0259_00_00003.bin 10 +scene0270_00_00003.bin 10 +scene0270_00_00004.bin 10 +scene0271_00_00003.bin 10 +scene0276_00_00003.bin 10 +scene0277_00_00005.bin 10 +scene0279_00_00004.bin 10 +scene0280_00_00008.bin 10 t +scene0282_00_00004.bin 10 +scene0286_00_00003.bin 10 +scene0287_00_00002.bin 10 +scene0295_00_00002.bin 10 +scene0296_00_00002.bin 10 t +scene0296_00_00004.bin 10 t +scene0298_00_00002.bin 10 +scene0308_00_00003.bin 10 +scene0321_00_00002.bin 10 +scene0340_00_00004.bin 10 +scene0340_00_00005.bin 10 +scene0356_00_00003.bin 10 +scene0356_00_00009.bin 10 +scene0359_00_00003.bin 10 t +scene0364_00_00003.bin 10 +scene0376_00_00003.bin 10 +scene0389_00_00004.bin 10 +scene0392_00_00007.bin 10 +scene0394_00_00003.bin 10 +scene0398_00_00002.bin 10 +scene0398_00_00003.bin 10 +scene0400_00_00004.bin 10 +scene0416_00_00004.bin 10 t +scene0416_00_00005.bin 10 t +scene0418_00_00002.bin 10 t +scene0426_00_00002.bin 10 +scene0435_00_00003.bin 10 +scene0435_00_00004.bin 10 +scene0438_00_00001.bin 10 t +scene0440_00_00003.bin 10 +scene0440_00_00004.bin 10 +scene0445_00_00002.bin 10 +scene0457_00_00002.bin 10 t +scene0468_00_00005.bin 10 t +scene0472_00_00003.bin 10 +scene0477_00_00003.bin 10 t +scene0477_00_00004.bin 10 t +scene0506_00_00003.bin 10 t +scene0515_00_00006.bin 10 +scene0521_00_00003.bin 10 +scene0541_00_00005.bin 10 +scene0545_00_00002.bin 10 t +scene0548_00_00004.bin 10 +scene0556_00_00003.bin 10 +scene0556_00_00004.bin 10 +scene0557_00_00002.bin 10 +scene0560_00_00002.bin 10 +scene0567_00_00002.bin 10 +scene0576_00_00003.bin 10 +scene0577_00_00004.bin 10 +scene0580_00_00004.bin 10 t +scene0589_00_00006.bin 10 +scene0590_00_00003.bin 10 +scene0600_00_00002.bin 10 +scene0604_00_00003.bin 10 +scene0613_00_00001.bin 10 +scene0615_00_00003.bin 10 +scene0620_00_00002.bin 10 +scene0640_00_00004.bin 10 +scene0642_00_00005.bin 10 +scene0645_00_00003.bin 10 +scene0645_00_00004.bin 10 +scene0000_00_00003.bin 13 +scene0001_00_00002.bin 13 +scene0001_00_00003.bin 13 +scene0001_00_00004.bin 13 +scene0002_00_00005.bin 13 +scene0008_00_00003.bin 13 +scene0008_00_00004.bin 13 +scene0025_00_00005.bin 13 t +scene0025_00_00006.bin 13 t +scene0027_00_00002.bin 13 t +scene0031_00_00005.bin 13 +scene0031_00_00007.bin 13 +scene0031_00_00008.bin 13 +scene0031_00_00009.bin 13 +scene0031_00_00011.bin 13 +scene0031_00_00012.bin 13 +scene0031_00_00014.bin 13 +scene0036_00_00002.bin 13 +scene0036_00_00003.bin 13 +scene0040_00_00007.bin 13 +scene0049_00_00003.bin 13 +scene0050_00_00003.bin 13 +scene0053_00_00001.bin 13 t +scene0053_00_00003.bin 13 t +scene0054_00_00004.bin 13 t +scene0059_00_00005.bin 13 +scene0061_00_00001.bin 13 +scene0064_00_00005.bin 13 +scene0087_00_00003.bin 13 +scene0087_00_00006.bin 13 +scene0091_00_00002.bin 13 +scene0106_00_00003.bin 13 +scene0106_00_00004.bin 13 +scene0113_00_00002.bin 13 +scene0113_00_00003.bin 13 +scene0113_00_00004.bin 13 +scene0125_00_00003.bin 13 t +scene0128_00_00001.bin 13 +scene0137_00_00005.bin 13 +scene0144_00_00005.bin 13 t +scene0145_00_00003.bin 13 +scene0151_00_00003.bin 13 +scene0160_00_00001.bin 13 t +scene0160_00_00004.bin 13 t +scene0160_00_00005.bin 13 t +scene0162_00_00003.bin 13 +scene0166_00_00006.bin 13 t +scene0167_00_00003.bin 13 +scene0167_00_00004.bin 13 +scene0177_00_00006.bin 13 +scene0181_00_00005.bin 13 t +scene0187_00_00006.bin 13 +scene0187_00_00011.bin 13 +scene0194_00_00001.bin 13 +scene0199_00_00002.bin 13 t +scene0203_00_00006.bin 13 +scene0207_00_00006.bin 13 +scene0209_00_00009.bin 13 +scene0213_00_00004.bin 13 +scene0213_00_00005.bin 13 +scene0213_00_00008.bin 13 +scene0213_00_00012.bin 13 +scene0218_00_00003.bin 13 +scene0218_00_00004.bin 13 +scene0224_00_00003.bin 13 t +scene0226_00_00003.bin 13 +scene0226_00_00004.bin 13 +scene0226_00_00005.bin 13 +scene0226_00_00006.bin 13 +scene0231_00_00011.bin 13 +scene0231_00_00014.bin 13 +scene0235_00_00008.bin 13 +scene0239_00_00004.bin 13 +scene0247_00_00003.bin 13 +scene0247_00_00004.bin 13 +scene0247_00_00015.bin 13 +scene0269_00_00001.bin 13 +scene0269_00_00002.bin 13 +scene0273_00_00006.bin 13 +scene0276_00_00004.bin 13 t +scene0279_00_00006.bin 13 +scene0281_00_00003.bin 13 t +scene0281_00_00004.bin 13 t +scene0288_00_00005.bin 13 +scene0294_00_00002.bin 13 t +scene0294_00_00003.bin 13 t +scene0297_00_00003.bin 13 +scene0297_00_00004.bin 13 +scene0301_00_00002.bin 13 t +scene0309_00_00019.bin 13 t +scene0312_00_00002.bin 13 +scene0312_00_00003.bin 13 +scene0312_00_00004.bin 13 +scene0315_00_00003.bin 13 +scene0315_00_00005.bin 13 +scene0316_00_00005.bin 13 +scene0317_00_00005.bin 13 +scene0319_00_00003.bin 13 +scene0319_00_00004.bin 13 +scene0319_00_00005.bin 13 +scene0326_00_00001.bin 13 +scene0327_00_00005.bin 13 t +scene0327_00_00015.bin 3 +scene0329_00_00003.bin 13 +scene0329_00_00004.bin 13 +scene0334_00_00002.bin 13 +scene0334_00_00003.bin 13 +scene0339_00_00003.bin 13 +scene0339_00_00005.bin 13 +scene0339_00_00006.bin 13 +scene0339_00_00007.bin 13 +scene0341_00_00002.bin 13 +scene0352_00_00003.bin 13 +scene0353_00_00005.bin 13 +scene0362_00_00004.bin 13 +scene0363_00_00004.bin 13 t +scene0363_00_00006.bin 13 t +scene0363_00_00007.bin 13 t +scene0363_00_00008.bin 13 t +scene0363_00_00009.bin 13 t +scene0363_00_00010.bin 13 t +scene0367_00_00004.bin 13 t +scene0367_00_00006.bin 13 t +scene0368_00_00006.bin 13 +scene0368_00_00009.bin 13 +scene0368_00_00010.bin 13 +scene0368_00_00034.bin 13 +scene0374_00_00002.bin 13 +scene0381_00_00002.bin 13 +scene0385_00_00004.bin 13 +scene0386_00_00003.bin 13 t +scene0386_00_00005.bin 13 t +scene0392_00_00008.bin 13 +scene0394_00_00012.bin 13 +scene0395_00_00005.bin 13 +scene0407_00_00002.bin 13 +scene0424_00_00006.bin 13 +scene0450_00_00006.bin 13 +scene0451_00_00005.bin 13 t +scene0461_00_00002.bin 13 +scene0461_00_00003.bin 13 +scene0467_00_00002.bin 13 t +scene0474_00_00004.bin 13 t +scene0480_00_00002.bin 13 +scene0484_00_00002.bin 13 +scene0484_00_00003.bin 13 +scene0487_00_00008.bin 13 +scene0487_00_00012.bin 13 +scene0499_00_00008.bin 13 +scene0499_00_00009.bin 13 +scene0503_00_00002.bin 13 +scene0504_00_00004.bin 13 +scene0504_00_00017.bin 13 +scene0505_00_00008.bin 13 +scene0514_00_00004.bin 13 +scene0515_00_00009.bin 13 +scene0517_00_00006.bin 13 +scene0520_00_00001.bin 13 +scene0520_00_00003.bin 13 +scene0520_00_00005.bin 13 +scene0529_00_00004.bin 13 +scene0533_00_00002.bin 13 t +scene0533_00_00005.bin 13 t +scene0536_00_00002.bin 13 +scene0537_00_00003.bin 13 +scene0549_00_00002.bin 13 +scene0549_00_00004.bin 13 +scene0559_00_00002.bin 13 +scene0568_00_00003.bin 13 t +scene0587_00_00002.bin 13 +scene0588_00_00004.bin 13 +scene0588_00_00006.bin 13 +scene0588_00_00007.bin 13 +scene0588_00_00008.bin 13 +scene0588_00_00009.bin 13 +scene0588_00_00010.bin 13 +scene0588_00_00011.bin 13 +scene0588_00_00012.bin 13 +scene0588_00_00013.bin 13 +scene0588_00_00014.bin 13 +scene0590_00_00006.bin 13 +scene0593_00_00005.bin 13 t +scene0601_00_00008.bin 13 +scene0601_00_00012.bin 13 +scene0603_00_00004.bin 13 +scene0603_00_00005.bin 13 +scene0604_00_00004.bin 13 +scene0623_00_00003.bin 13 t +scene0626_00_00002.bin 13 +scene0641_00_00003.bin 13 +scene0641_00_00005.bin 13 +scene0641_00_00006.bin 13 +scene0645_00_00005.bin 13 +scene0000_00_00035.bin 12 +scene0003_00_00013.bin 12 +scene0009_00_00009.bin 12 +scene0009_00_00011.bin 12 +scene0009_00_00012.bin 12 +scene0009_00_00013.bin 12 +scene0009_00_00014.bin 12 +scene0009_00_00017.bin 12 +scene0014_00_00009.bin 12 +scene0014_00_00010.bin 12 +scene0026_00_00017.bin 12 +scene0026_00_00020.bin 12 +scene0034_00_00011.bin 12 +scene0042_00_00006.bin 12 +scene0051_00_00011.bin 12 +scene0054_00_00028.bin 12 +scene0065_00_00006.bin 12 +scene0067_00_00006.bin 12 +scene0068_00_00006.bin 12 +scene0083_00_00004.bin 12 +scene0084_00_00004.bin 12 +scene0086_00_00010.bin 12 t +scene0086_00_00011.bin 12 t +scene0096_00_00016.bin 12 +scene0100_00_00008.bin 12 +scene0101_00_00011.bin 12 +scene0116_00_00004.bin 12 +scene0119_00_00005.bin 12 t +scene0146_00_00003.bin 12 t +scene0170_00_00006.bin 12 +scene0195_00_00015.bin 12 +scene0197_00_00009.bin 12 t +scene0207_00_00014.bin 12 +scene0207_00_00017.bin 12 +scene0214_00_00005.bin 12 +scene0232_00_00010.bin 12 +scene0237_00_00003.bin 12 +scene0246_00_00016.bin 12 +scene0247_00_00025.bin 12 t +scene0260_00_00008.bin 12 +scene0261_00_00005.bin 12 +scene0265_00_00011.bin 12 +scene0268_00_00004.bin 12 +scene0276_00_00016.bin 12 t +scene0307_00_00008.bin 12 +scene0348_00_00008.bin 12 +scene0349_00_00003.bin 12 t +scene0349_00_00006.bin 12 t +scene0350_00_00009.bin 12 +scene0366_00_00008.bin 12 +scene0366_00_00009.bin 12 +scene0375_00_00008.bin 12 +scene0394_00_00016.bin 12 +scene0394_00_00023.bin 12 +scene0396_00_00008.bin 12 t +scene0399_00_00002.bin 12 t +scene0406_00_00006.bin 12 +scene0415_00_00003.bin 12 +scene0429_00_00006.bin 12 +scene0434_00_00010.bin 12 +scene0435_00_00011.bin 12 +scene0439_00_00014.bin 12 +scene0441_00_00010.bin 12 +scene0446_00_00005.bin 12 +scene0447_00_00005.bin 12 +scene0448_00_00008.bin 12 +scene0449_00_00012.bin 12 +scene0458_00_00012.bin 12 +scene0460_00_00002.bin 12 +scene0486_00_00009.bin 12 +scene0501_00_00007.bin 12 +scene0516_00_00019.bin 12 +scene0517_00_00024.bin 12 t +scene0519_00_00006.bin 12 t +scene0521_00_00011.bin 12 t +scene0523_00_00004.bin 12 +scene0527_00_00005.bin 12 +scene0527_00_00006.bin 12 +scene0538_00_00005.bin 12 +scene0542_00_00010.bin 12 +scene0546_00_00008.bin 12 +scene0547_00_00017.bin 12 t +scene0553_00_00003.bin 12 +scene0564_00_00005.bin 12 t +scene0564_00_00006.bin 12 t +scene0574_00_00004.bin 12 +scene0574_00_00009.bin 12 +scene0579_00_00006.bin 12 +scene0579_00_00007.bin 12 +scene0579_00_00008.bin 12 +scene0579_00_00009.bin 12 +scene0581_00_00010.bin 12 t +scene0583_00_00006.bin 12 +scene0586_00_00013.bin 12 +scene0602_00_00002.bin 12 +scene0612_00_00007.bin 12 +scene0631_00_00008.bin 12 +scene0631_00_00009.bin 12 +scene0639_00_00002.bin 12 t +scene0639_00_00008.bin 12 t +scene0642_00_00010.bin 12 t +scene0642_00_00028.bin 12 t +scene0645_00_00014.bin 12 +scene0000_00_00036.bin 11 t +scene0002_00_00027.bin 11 +scene0002_00_00028.bin 11 +scene0002_00_00034.bin 11 +scene0002_00_00039.bin 11 +scene0016_00_00009.bin 11 +scene0016_00_00012.bin 11 +scene0021_00_00006.bin 11 t +scene0025_00_00017.bin 11 +scene0049_00_00010.bin 11 +scene0049_00_00013.bin 11 +scene0049_00_00014.bin 11 +scene0070_00_00012.bin 11 +scene0072_00_00011.bin 11 +scene0074_00_00004.bin 11 +scene0137_00_00011.bin 11 +scene0147_00_00017.bin 11 +scene0147_00_00022.bin 11 +scene0147_00_00023.bin 11 +scene0177_00_00011.bin 11 +scene0182_00_00007.bin 11 +scene0194_00_00011.bin 11 +scene0209_00_00017.bin 11 +scene0209_00_00018.bin 11 +scene0209_00_00019.bin 11 +scene0209_00_00020.bin 11 +scene0219_00_00003.bin 11 +scene0222_00_00016.bin 11 t +scene0222_00_00017.bin 11 t +scene0224_00_00009.bin 11 +scene0235_00_00012.bin 11 +scene0270_00_00013.bin 11 +scene0270_00_00016.bin 11 +scene0270_00_00017.bin 11 +scene0270_00_00018.bin 11 +scene0270_00_00019.bin 11 +scene0271_00_00019.bin 11 t +scene0296_00_00013.bin 11 +scene0296_00_00015.bin 11 +scene0296_00_00026.bin 11 +scene0308_00_00009.bin 11 +scene0317_00_00016.bin 11 +scene0319_00_00007.bin 11 t +scene0319_00_00009.bin 11 t +scene0326_00_00006.bin 11 +scene0331_00_00010.bin 11 t +scene0338_00_00006.bin 2 +scene0340_00_00012.bin 11 +scene0340_00_00015.bin 11 +scene0340_00_00016.bin 11 +scene0362_00_00010.bin 11 +scene0385_00_00014.bin 11 t +scene0385_00_00015.bin 11 t +scene0394_00_00019.bin 11 +scene0394_00_00022.bin 11 +scene0394_00_00027.bin 11 +scene0397_00_00006.bin 11 +scene0407_00_00009.bin 11 +scene0425_00_00012.bin 11 +scene0438_00_00009.bin 11 +scene0467_00_00015.bin 11 +scene0477_00_00012.bin 11 +scene0477_00_00016.bin 11 +scene0480_00_00008.bin 11 t +scene0507_00_00003.bin 11 +scene0507_00_00004.bin 11 +scene0507_00_00006.bin 11 +scene0518_00_00012.bin 11 +scene0536_00_00006.bin 11 +scene0548_00_00010.bin 11 t +scene0554_00_00017.bin 11 +scene0567_00_00008.bin 11 t +scene0577_00_00016.bin 11 +scene0589_00_00007.bin 11 +scene0590_00_00007.bin 11 +scene0591_00_00013.bin 11 +scene0615_00_00016.bin 11 +scene0642_00_00014.bin 11 +scene0642_00_00015.bin 11 +scene0645_00_00022.bin 11 +scene0000_00_00031.bin 14 +scene0014_00_00006.bin 14 +scene0026_00_00011.bin 14 +scene0026_00_00012.bin 14 +scene0029_00_00005.bin 14 +scene0034_00_00008.bin 14 +scene0042_00_00007.bin 14 t +scene0051_00_00012.bin 14 +scene0054_00_00035.bin 14 +scene0062_00_00006.bin 14 +scene0065_00_00008.bin 14 +scene0067_00_00004.bin 14 +scene0083_00_00003.bin 14 +scene0084_00_00005.bin 14 +scene0086_00_00008.bin 14 +scene0086_00_00014.bin 14 +scene0100_00_00006.bin 14 +scene0101_00_00014.bin 14 +scene0112_00_00002.bin 14 +scene0116_00_00005.bin 14 +scene0119_00_00009.bin 14 +scene0135_00_00005.bin 14 t +scene0146_00_00002.bin 14 +scene0153_00_00006.bin 14 +scene0175_00_00010.bin 14 +scene0195_00_00007.bin 14 +scene0207_00_00011.bin 14 +scene0214_00_00010.bin 14 +scene0232_00_00008.bin 14 +scene0246_00_00014.bin 14 +scene0250_00_00008.bin 14 +scene0254_00_00008.bin 14 +scene0254_00_00010.bin 14 +scene0260_00_00006.bin 14 +scene0261_00_00012.bin 14 t +scene0265_00_00004.bin 14 +scene0276_00_00014.bin 14 +scene0365_00_00005.bin 14 t +scene0366_00_00005.bin 14 +scene0396_00_00007.bin 14 t +scene0399_00_00003.bin 14 +scene0406_00_00005.bin 14 +scene0410_00_00004.bin 14 +scene0429_00_00008.bin 14 +scene0434_00_00007.bin 14 t +scene0435_00_00012.bin 14 t +scene0446_00_00007.bin 14 +scene0447_00_00006.bin 14 t +scene0448_00_00007.bin 14 t +scene0449_00_00005.bin 14 +scene0458_00_00007.bin 14 +scene0471_00_00005.bin 14 t +scene0492_00_00013.bin 14 +scene0501_00_00009.bin 14 t +scene0510_00_00004.bin 14 t +scene0510_00_00008.bin 14 t +scene0515_00_00018.bin 14 +scene0516_00_00020.bin 14 +scene0521_00_00014.bin 14 +scene0523_00_00003.bin 14 +scene0538_00_00006.bin 14 +scene0539_00_00007.bin 14 +scene0546_00_00009.bin 14 +scene0550_00_00009.bin 14 +scene0553_00_00004.bin 14 +scene0564_00_00004.bin 14 t +scene0570_00_00006.bin 14 +scene0571_00_00006.bin 14 t +scene0581_00_00009.bin 14 +scene0583_00_00008.bin 14 +scene0602_00_00003.bin 14 +scene0610_00_00005.bin 14 t +scene0612_00_00003.bin 14 +scene0625_00_00005.bin 14 +scene0631_00_00005.bin 14 +scene0639_00_00006.bin 14 +scene0642_00_00012.bin 14 +scene0645_00_00015.bin 14 diff --git a/zoo/SimpleView/ScanObjectNN/training_data/split4.txt b/zoo/SimpleView/ScanObjectNN/training_data/split4.txt new file mode 100644 index 0000000..e32e8fb --- /dev/null +++ b/zoo/SimpleView/ScanObjectNN/training_data/split4.txt @@ -0,0 +1,2902 @@ +005_00020.bin 0 +014_00018.bin 0 +025_00011.bin 0 +038_00032.bin 0 +041_00028.bin 0 +041_00052.bin 0 +043_00018.bin 0 t +054_00026.bin 0 +073_00014.bin 0 +080_00015.bin 0 +082_00020.bin 0 +084_00012.bin 0 t +086_00015.bin 0 t +086_00020.bin 0 t +093_00019.bin 0 +096_00016.bin 0 +096_00020.bin 0 +098_00007.bin 0 +202_00002.bin 0 +205_00007.bin 0 +205_00009.bin 0 +209_00013.bin 0 +209_00019.bin 0 +213_00025.bin 0 t +223_00012.bin 0 +227_00012.bin 0 +234_00012.bin 0 +237_00011.bin 0 +237_00014.bin 0 +240_00009.bin 0 +246_00014.bin 0 +251_00015.bin 0 +251_00018.bin 0 +273_00010.bin 0 +614_00005.bin 0 +700_00012.bin 0 +005_00015.bin 1 +005_00017.bin 1 +014_00016.bin 1 +021_00014.bin 1 +021_00021.bin 1 +032_00015.bin 1 +041_00042.bin 1 t +043_00014.bin 1 t +045_00018.bin 1 +047_00019.bin 1 +047_00023.bin 1 +049_00007.bin 1 +052_00012.bin 1 +062_00009.bin 1 +065_00013.bin 1 +069_00009.bin 1 +076_00045.bin 1 +080_00013.bin 1 +086_00011.bin 1 +086_00016.bin 1 +089_00010.bin 1 +093_00014.bin 1 +093_00016.bin 1 +109_00008.bin 1 t +109_00016.bin 1 t +205_00008.bin 1 +207_00005.bin 1 +207_00010.bin 1 +209_00014.bin 1 +213_00015.bin 1 +213_00026.bin 1 +231_00019.bin 1 +237_00009.bin 1 +237_00010.bin 1 +246_00008.bin 1 +251_00014.bin 1 +252_00013.bin 1 t +252_00014.bin 1 t +255_00003.bin 1 +255_00006.bin 1 +265_00010.bin 1 +265_00024.bin 1 +265_00030.bin 1 +270_00007.bin 1 +270_00012.bin 1 +273_00007.bin 1 +276_00010.bin 1 t +279_00012.bin 1 +322_00014.bin 1 +700_00006.bin 1 +700_00008.bin 1 +005_00021.bin 2 t +011_00010.bin 2 +036_00021.bin 2 +041_00038.bin 2 +043_00016.bin 2 +045_00012.bin 2 +045_00017.bin 2 +047_00021.bin 2 t +047_00022.bin 2 t +047_00026.bin 2 t +054_00019.bin 2 +054_00050.bin 2 +074_00005.bin 2 +074_00012.bin 2 +074_00016.bin 2 +074_00018.bin 2 +074_00020.bin 2 +074_00021.bin 2 +074_00029.bin 2 +078_00005.bin 2 +082_00018.bin 2 +082_00024.bin 2 +082_00026.bin 2 +084_00009.bin 2 t +084_00011.bin 2 t +086_00009.bin 2 +086_00018.bin 2 +087_00007.bin 2 +087_00008.bin 2 +087_00009.bin 2 +087_00012.bin 2 +087_00017.bin 2 +087_00028.bin 2 +089_00013.bin 2 t +089_00021.bin 2 t +093_00018.bin 2 +093_00022.bin 2 +093_00023.bin 2 +093_00032.bin 2 +109_00012.bin 2 +209_00022.bin 2 t +209_00029.bin 2 t +209_00032.bin 2 t +213_00011.bin 2 +225_00016.bin 2 +231_00031.bin 2 +234_00008.bin 2 t +246_00012.bin 2 +251_00003.bin 2 +251_00007.bin 2 +251_00008.bin 2 +255_00008.bin 2 +260_00012.bin 2 +263_00025.bin 2 t +265_00011.bin 2 +265_00028.bin 2 +265_00035.bin 2 +265_00038.bin 2 +265_00040.bin 2 +265_00042.bin 2 +272_00027.bin 2 t +272_00041.bin 2 t +276_00007.bin 2 +279_00011.bin 2 +623_00008.bin 2 t +015_00008.bin 3 +025_00006.bin 3 +041_00012.bin 3 +047_00008.bin 3 +047_00011.bin 3 +049_00006.bin 3 +052_00007.bin 3 +062_00008.bin 3 t +065_00002.bin 3 +076_00010.bin 3 +082_00007.bin 3 +082_00008.bin 3 +084_00002.bin 3 t +086_00006.bin 3 +086_00007.bin 3 +087_00005.bin 3 +093_00009.bin 3 +098_00002.bin 3 +201_00001.bin 3 t +201_00004.bin 3 t +207_00002.bin 3 +209_00001.bin 3 t +213_00003.bin 3 +213_00006.bin 3 +217_00013.bin 3 t +225_00004.bin 3 +225_00005.bin 3 +225_00007.bin 3 +227_00007.bin 3 +243_00002.bin 3 +243_00004.bin 3 +249_00002.bin 3 +252_00002.bin 3 +252_00007.bin 3 +255_00002.bin 3 +260_00000.bin 3 +260_00003.bin 3 +260_00005.bin 3 +260_00007.bin 3 +260_00008.bin 3 +265_00006.bin 3 +276_00000.bin 3 +276_00006.bin 3 +276_00008.bin 3 +279_00004.bin 3 +700_00001.bin 3 t +700_00004.bin 3 t +700_00005.bin 3 t +700_00009.bin 3 t +700_00010.bin 3 t +005_00008.bin 4 +014_00009.bin 4 +021_00011.bin 4 t +025_00003.bin 4 +025_00007.bin 4 +030_00008.bin 4 +030_00012.bin 4 +030_00013.bin 4 +030_00014.bin 4 +032_00007.bin 4 +032_00008.bin 4 +032_00009.bin 4 +036_00009.bin 4 +036_00010.bin 4 +036_00011.bin 4 +036_00013.bin 4 +038_00011.bin 4 t +038_00012.bin 4 t +038_00014.bin 4 t +038_00015.bin 4 t +038_00016.bin 4 t +041_00010.bin 4 +041_00013.bin 4 +041_00015.bin 4 +043_00010.bin 4 t +043_00011.bin 4 t +045_00009.bin 4 +045_00011.bin 4 +045_00013.bin 4 +045_00014.bin 4 +045_00016.bin 4 +047_00006.bin 4 t +047_00007.bin 4 t +047_00009.bin 4 t +047_00010.bin 4 t +049_00003.bin 4 t +049_00004.bin 4 t +052_00008.bin 4 +054_00006.bin 4 t +054_00007.bin 4 t +054_00009.bin 4 t +054_00012.bin 4 t +054_00013.bin 4 t +054_00014.bin 4 t +054_00016.bin 4 t +054_00017.bin 4 t +054_00018.bin 4 t +057_00007.bin 4 +065_00006.bin 4 +065_00007.bin 4 +065_00009.bin 4 +065_00011.bin 4 +069_00010.bin 4 t +073_00005.bin 4 +073_00013.bin 4 +074_00009.bin 4 +076_00012.bin 4 +076_00013.bin 4 +076_00016.bin 4 +076_00017.bin 4 +076_00018.bin 4 +076_00019.bin 4 +076_00021.bin 4 +076_00022.bin 4 +076_00023.bin 4 +076_00028.bin 4 +076_00029.bin 4 +076_00031.bin 4 +076_00034.bin 4 +076_00037.bin 4 +078_00010.bin 4 +080_00005.bin 4 +080_00006.bin 4 +080_00007.bin 4 +082_00009.bin 4 +082_00011.bin 4 +082_00014.bin 4 +084_00004.bin 4 +084_00008.bin 4 +086_00001.bin 4 t +086_00008.bin 4 t +087_00001.bin 4 t +087_00003.bin 4 t +087_00004.bin 4 t +087_00011.bin 4 t +093_00006.bin 4 +096_00008.bin 4 +109_00007.bin 4 +201_00009.bin 4 +201_00010.bin 4 +201_00013.bin 4 +201_00015.bin 4 +201_00021.bin 4 +202_00003.bin 4 +202_00004.bin 4 +202_00005.bin 4 +202_00007.bin 4 +202_00008.bin 4 +202_00009.bin 4 +202_00010.bin 4 +202_00011.bin 4 +202_00012.bin 4 +202_00013.bin 4 +202_00015.bin 4 +202_00016.bin 4 +202_00017.bin 4 +202_00020.bin 4 +205_00005.bin 4 +205_00006.bin 4 +205_00010.bin 4 +206_00007.bin 4 +206_00008.bin 4 +206_00010.bin 4 +206_00011.bin 4 +206_00013.bin 4 +206_00014.bin 4 +206_00015.bin 4 +206_00016.bin 4 +206_00018.bin 4 +206_00019.bin 4 +206_00020.bin 4 +206_00021.bin 4 +206_00022.bin 4 +206_00024.bin 4 +206_00027.bin 4 +209_00006.bin 4 t +213_00012.bin 4 t +213_00014.bin 4 t +213_00018.bin 4 t +223_00003.bin 4 +223_00004.bin 4 +223_00006.bin 4 +223_00007.bin 4 +227_00008.bin 4 +227_00009.bin 4 +231_00005.bin 4 +231_00006.bin 4 +231_00007.bin 4 +231_00008.bin 4 +234_00007.bin 4 +237_00004.bin 4 t +237_00005.bin 4 t +246_00004.bin 4 +246_00006.bin 4 +246_00011.bin 4 +251_00006.bin 4 +251_00011.bin 4 +251_00013.bin 4 +251_00017.bin 4 +251_00019.bin 4 +263_00011.bin 4 +263_00014.bin 4 +270_00006.bin 4 +272_00006.bin 4 +272_00008.bin 4 +272_00009.bin 4 +272_00010.bin 4 +273_00004.bin 4 t +279_00007.bin 4 +279_00008.bin 4 +308_00011.bin 4 +308_00012.bin 4 +308_00013.bin 4 +308_00015.bin 4 +308_00017.bin 4 +322_00009.bin 4 +322_00011.bin 4 +322_00012.bin 4 +522_00005.bin 4 +609_00004.bin 4 +609_00005.bin 4 +609_00006.bin 4 +609_00007.bin 4 +609_00008.bin 4 +609_00009.bin 4 +609_00010.bin 4 +609_00011.bin 4 +609_00012.bin 4 +609_00014.bin 4 +609_00016.bin 4 +609_00018.bin 4 +609_00019.bin 4 +609_00020.bin 4 +609_00021.bin 4 +613_00000.bin 4 +613_00001.bin 4 +613_00002.bin 4 +613_00004.bin 4 +613_00005.bin 4 +613_00007.bin 4 +613_00010.bin 4 +614_00004.bin 4 t +621_00001.bin 4 +621_00005.bin 4 +621_00006.bin 4 +621_00007.bin 4 +621_00009.bin 4 +621_00010.bin 4 +621_00011.bin 4 +621_00012.bin 4 +621_00013.bin 4 +623_00002.bin 4 +623_00004.bin 4 +623_00005.bin 4 +005_00005.bin 5 t +011_00001.bin 5 +021_00006.bin 5 +030_00005.bin 5 +032_00004.bin 5 +036_00002.bin 5 +036_00004.bin 5 +036_00005.bin 5 +036_00006.bin 5 +038_00005.bin 5 +038_00006.bin 5 +038_00008.bin 5 +038_00009.bin 5 +038_00010.bin 5 +038_00013.bin 5 +041_00005.bin 5 +041_00006.bin 5 +041_00009.bin 5 +041_00011.bin 5 +043_00007.bin 5 +045_00005.bin 5 t +047_00000.bin 5 +047_00001.bin 5 +047_00002.bin 5 +049_00005.bin 5 +054_00001.bin 5 +054_00002.bin 5 +054_00003.bin 5 +054_00011.bin 5 +057_00002.bin 5 +057_00003.bin 5 +062_00006.bin 5 +076_00006.bin 5 +076_00009.bin 5 +076_00015.bin 5 +076_00036.bin 5 +080_00002.bin 5 +080_00004.bin 5 +082_00005.bin 5 +084_00001.bin 5 +086_00000.bin 5 t +109_00005.bin 5 +201_00003.bin 5 +201_00005.bin 5 +201_00006.bin 5 +206_00005.bin 5 +227_00006.bin 5 +231_00004.bin 5 +231_00009.bin 5 +234_00003.bin 5 +234_00004.bin 5 +246_00002.bin 5 +272_00003.bin 5 +308_00004.bin 5 +522_00001.bin 5 +014_00004.bin 6 +014_00013.bin 6 +015_00009.bin 6 +021_00018.bin 6 +025_00009.bin 6 +030_00026.bin 6 t +030_00027.bin 6 t +036_00018.bin 6 +036_00022.bin 6 +036_00024.bin 6 +036_00028.bin 6 +036_00033.bin 6 +036_00034.bin 6 +038_00019.bin 6 t +038_00021.bin 6 t +038_00029.bin 6 t +038_00030.bin 6 t +038_00034.bin 6 t +038_00035.bin 6 t +038_00037.bin 6 t +038_00038.bin 6 t +041_00019.bin 6 +041_00021.bin 6 +041_00025.bin 6 +041_00029.bin 6 +041_00031.bin 6 +041_00032.bin 6 +041_00033.bin 6 +041_00035.bin 6 +043_00013.bin 6 +047_00017.bin 6 t +047_00018.bin 6 t +047_00025.bin 6 t +049_00009.bin 6 t +052_00011.bin 6 +054_00025.bin 6 +054_00028.bin 6 +054_00032.bin 6 +054_00036.bin 6 +057_00011.bin 6 +057_00014.bin 6 +057_00015.bin 6 +057_00016.bin 6 +065_00008.bin 6 t +069_00012.bin 6 t +069_00014.bin 6 t +069_00015.bin 6 t +069_00016.bin 6 t +069_00017.bin 6 t +071_00006.bin 6 t +073_00010.bin 6 +073_00016.bin 6 +074_00025.bin 6 +076_00038.bin 6 +076_00039.bin 6 +076_00040.bin 6 +076_00041.bin 6 +076_00042.bin 6 +076_00043.bin 6 +078_00013.bin 6 t +078_00014.bin 6 t +080_00009.bin 6 t +080_00018.bin 6 t +086_00021.bin 6 +086_00023.bin 6 +086_00027.bin 6 +089_00018.bin 6 +093_00015.bin 6 +096_00018.bin 6 t +098_00005.bin 6 +201_00007.bin 6 +201_00008.bin 6 +201_00018.bin 6 +201_00026.bin 6 +206_00030.bin 6 t +206_00031.bin 6 t +209_00015.bin 6 t +209_00025.bin 6 t +217_00015.bin 6 +231_00016.bin 6 t +231_00017.bin 6 t +231_00021.bin 6 t +231_00023.bin 6 t +231_00026.bin 6 t +231_00027.bin 6 t +231_00029.bin 6 t +237_00012.bin 6 +246_00016.bin 6 +263_00015.bin 6 t +265_00020.bin 6 +272_00011.bin 6 +522_00006.bin 6 +005_00004.bin 7 +005_00006.bin 7 +014_00002.bin 7 +021_00008.bin 7 +032_00005.bin 7 +038_00004.bin 7 +043_00008.bin 7 +047_00004.bin 7 +074_00001.bin 7 +076_00005.bin 7 +082_00006.bin 7 t +089_00004.bin 7 +096_00002.bin 7 +096_00004.bin 7 +096_00005.bin 7 +096_00007.bin 7 +109_00004.bin 7 +207_00003.bin 7 t +213_00004.bin 7 +213_00008.bin 7 +225_00003.bin 7 +234_00002.bin 7 +234_00006.bin 7 +237_00003.bin 7 t +246_00001.bin 7 +246_00003.bin 7 +246_00007.bin 7 +251_00002.bin 7 +251_00004.bin 7 +252_00003.bin 7 +263_00004.bin 7 +265_00001.bin 7 +273_00003.bin 7 +276_00002.bin 7 +279_00005.bin 7 +700_00002.bin 7 +014_00001.bin 8 t +014_00003.bin 8 t +021_00007.bin 8 +025_00005.bin 8 +041_00003.bin 8 t +041_00004.bin 8 t +045_00004.bin 8 +047_00005.bin 8 +047_00012.bin 8 +047_00013.bin 8 +049_00012.bin 8 +054_00010.bin 8 +073_00006.bin 8 +074_00004.bin 8 +074_00006.bin 8 +074_00007.bin 8 +076_00002.bin 8 +076_00033.bin 8 +082_00013.bin 8 +086_00003.bin 8 +086_00017.bin 8 +089_00005.bin 8 +096_00003.bin 8 +096_00011.bin 8 +096_00012.bin 8 +201_00002.bin 8 +201_00012.bin 8 +201_00016.bin 8 +201_00017.bin 8 +201_00019.bin 8 +201_00022.bin 8 +201_00023.bin 8 +201_00025.bin 8 +206_00006.bin 8 +209_00010.bin 8 t +217_00004.bin 8 +217_00008.bin 8 +231_00028.bin 8 +237_00002.bin 8 +240_00006.bin 8 t +246_00005.bin 8 +249_00004.bin 8 +251_00001.bin 8 +263_00012.bin 8 +265_00015.bin 8 +272_00001.bin 8 +272_00007.bin 8 +276_00005.bin 8 +308_00003.bin 8 +308_00006.bin 8 +322_00002.bin 8 t +614_00001.bin 8 +014_00007.bin 9 +021_00012.bin 9 +025_00004.bin 9 +030_00021.bin 9 +032_00011.bin 9 +032_00013.bin 9 +045_00007.bin 9 +049_00002.bin 9 t +054_00008.bin 9 +061_00006.bin 9 +061_00007.bin 9 +062_00007.bin 9 t +065_00001.bin 9 +069_00003.bin 9 t +069_00004.bin 9 t +069_00007.bin 9 t +071_00002.bin 9 +071_00003.bin 9 +073_00003.bin 9 t +074_00002.bin 9 +076_00026.bin 9 +076_00027.bin 9 +076_00032.bin 9 +076_00035.bin 9 +078_00004.bin 9 +082_00016.bin 9 +089_00002.bin 9 +089_00003.bin 9 +093_00007.bin 9 t +096_00037.bin 9 +202_00000.bin 9 +205_00002.bin 9 +205_00003.bin 9 +205_00004.bin 9 +206_00003.bin 9 +206_00004.bin 9 +207_00009.bin 9 +209_00004.bin 9 +213_00007.bin 9 +213_00017.bin 9 +217_00003.bin 9 +217_00007.bin 9 +223_00005.bin 9 t +223_00017.bin 9 t +240_00008.bin 9 +246_00010.bin 9 t +249_00003.bin 9 t +251_00012.bin 9 +252_00004.bin 9 +252_00005.bin 9 +263_00023.bin 9 +265_00012.bin 9 +270_00005.bin 9 +272_00013.bin 9 t +273_00001.bin 9 +286_00005.bin 9 +294_00005.bin 9 t +308_00001.bin 9 t +308_00005.bin 9 t +308_00008.bin 9 t +322_00008.bin 9 +609_00001.bin 9 +609_00017.bin 9 +613_00008.bin 9 t +613_00009.bin 9 t +613_00011.bin 9 t +614_00002.bin 9 +623_00003.bin 9 +014_00014.bin 0 +036_00019.bin 0 +047_00015.bin 0 +087_00018.bin 0 +089_00015.bin 0 t +206_00029.bin 0 +231_00018.bin 0 +246_00015.bin 0 +252_00011.bin 0 +005_00012.bin 1 +057_00012.bin 1 t +065_00015.bin 1 +080_00016.bin 1 +092_00008.bin 1 +096_00015.bin 1 +206_00028.bin 1 t +209_00017.bin 1 +240_00010.bin 1 t +255_00007.bin 1 +032_00014.bin 2 +041_00047.bin 2 +047_00020.bin 2 t +073_00008.bin 2 +074_00019.bin 2 +078_00009.bin 2 +086_00012.bin 2 +087_00002.bin 2 +087_00015.bin 2 +093_00026.bin 2 +096_00027.bin 2 +209_00026.bin 2 t +213_00020.bin 2 +223_00009.bin 2 +251_00010.bin 2 +005_00010.bin 3 t +052_00004.bin 3 +065_00004.bin 3 +084_00003.bin 3 t +086_00010.bin 3 +089_00009.bin 3 t +213_00009.bin 3 +237_00007.bin 3 +255_00001.bin 3 +265_00003.bin 3 +005_00007.bin 4 +011_00007.bin 4 t +030_00020.bin 4 +032_00010.bin 4 +036_00015.bin 4 +041_00008.bin 4 +041_00014.bin 4 +045_00010.bin 4 +052_00009.bin 4 +057_00005.bin 4 +074_00008.bin 4 +076_00014.bin 4 +076_00020.bin 4 +076_00025.bin 4 +078_00008.bin 4 +084_00006.bin 4 +096_00010.bin 4 +201_00014.bin 4 +202_00006.bin 4 +206_00009.bin 4 +206_00012.bin 4 +209_00003.bin 4 t +213_00013.bin 4 t +231_00010.bin 4 +249_00005.bin 4 +252_00008.bin 4 +322_00010.bin 4 +609_00015.bin 4 +613_00003.bin 4 +621_00008.bin 4 +623_00006.bin 4 +005_00001.bin 5 t +025_00000.bin 5 +036_00007.bin 5 +038_00007.bin 5 +041_00001.bin 5 +041_00017.bin 5 +052_00002.bin 5 +054_00004.bin 5 +076_00008.bin 5 +078_00002.bin 5 +084_00000.bin 5 +096_00006.bin 5 +209_00002.bin 5 t +231_00001.bin 5 +237_00006.bin 5 +005_00016.bin 6 +025_00008.bin 6 +032_00012.bin 6 +036_00030.bin 6 +038_00025.bin 6 t +041_00026.bin 6 +041_00034.bin 6 +052_00010.bin 6 +057_00013.bin 6 +069_00013.bin 6 t +071_00007.bin 6 t +082_00015.bin 6 +096_00009.bin 6 t +209_00008.bin 6 t +231_00025.bin 6 t +005_00003.bin 7 +011_00003.bin 7 +073_00001.bin 7 +089_00006.bin 7 +225_00002.bin 7 +240_00002.bin 7 t +249_00001.bin 7 +251_00005.bin 7 +276_00004.bin 7 +005_00002.bin 8 +025_00002.bin 8 +047_00016.bin 8 +054_00000.bin 8 +074_00003.bin 8 +078_00001.bin 8 t +093_00004.bin 8 +217_00001.bin 8 +234_00001.bin 8 +272_00002.bin 8 +030_00007.bin 9 +036_00012.bin 9 +052_00006.bin 9 t +066_00002.bin 9 +069_00005.bin 9 t +076_00003.bin 9 +087_00000.bin 9 +093_00012.bin 9 t +206_00002.bin 9 +217_00012.bin 9 +251_00000.bin 9 +272_00004.bin 9 t +279_00006.bin 9 +609_00002.bin 9 +621_00002.bin 9 t +005_00000.bin 10 +014_00000.bin 10 +016_00000.bin 10 +021_00005.bin 10 +049_00000.bin 10 +089_00001.bin 10 +093_00001.bin 10 +096_00001.bin 10 +109_00002.bin 10 +227_00005.bin 10 t +234_00000.bin 10 +237_00000.bin 10 +240_00001.bin 10 t +246_00000.bin 10 +249_00000.bin 10 +252_00000.bin 10 +265_00004.bin 10 +273_00000.bin 10 t +014_00006.bin 13 +015_00003.bin 13 +015_00007.bin 13 +016_00005.bin 13 +030_00006.bin 13 +036_00003.bin 13 t +041_00000.bin 13 +061_00000.bin 13 +076_00001.bin 13 +076_00004.bin 13 +080_00003.bin 13 +098_00001.bin 13 +098_00003.bin 13 +098_00004.bin 13 +206_00001.bin 13 +263_00000.bin 13 +263_00001.bin 13 +272_00000.bin 13 +286_00000.bin 13 +286_00001.bin 13 +286_00002.bin 13 +286_00003.bin 13 +286_00004.bin 13 +286_00006.bin 13 +286_00008.bin 13 +286_00009.bin 13 +294_00001.bin 13 +294_00002.bin 13 +294_00003.bin 13 +294_00004.bin 13 +065_00014.bin 12 t +207_00007.bin 12 +260_00009.bin 12 +700_00011.bin 12 +014_00012.bin 11 +014_00015.bin 11 +015_00013.bin 11 +016_00009.bin 11 +016_00010.bin 11 +016_00011.bin 11 +016_00013.bin 11 +021_00016.bin 11 t +036_00027.bin 11 +036_00036.bin 11 +049_00015.bin 11 +089_00012.bin 11 t +089_00014.bin 11 t +096_00013.bin 11 +227_00011.bin 11 +240_00011.bin 11 +246_00013.bin 11 +263_00019.bin 11 t +263_00020.bin 11 t +263_00022.bin 11 t +272_00021.bin 11 +272_00024.bin 11 +272_00025.bin 11 +272_00031.bin 11 +272_00035.bin 11 +273_00006.bin 11 +scene0000_00_00032.bin 4 +scene0000_00_00034.bin 4 +scene0000_00_00042.bin 4 +scene0000_00_00043.bin 4 +scene0002_00_00012.bin 4 +scene0002_00_00013.bin 4 +scene0004_00_00008.bin 4 +scene0006_00_00007.bin 4 +scene0006_00_00009.bin 4 +scene0008_00_00005.bin 13 t +scene0010_00_00009.bin 4 t +scene0012_00_00004.bin 4 +scene0012_00_00005.bin 4 +scene0012_00_00006.bin 4 +scene0012_00_00008.bin 4 +scene0013_00_00002.bin 13 +scene0013_00_00003.bin 13 +scene0013_00_00004.bin 13 +scene0015_00_00016.bin 4 t +scene0017_00_00014.bin 4 +scene0021_00_00002.bin 13 +scene0021_00_00003.bin 13 +scene0021_00_00004.bin 13 +scene0021_00_00007.bin 13 +scene0024_00_00005.bin 13 t +scene0024_00_00010.bin 4 +scene0028_00_00006.bin 13 +scene0028_00_00007.bin 13 +scene0028_00_00009.bin 13 +scene0028_00_00011.bin 13 +scene0030_00_00008.bin 13 +scene0030_00_00020.bin 4 t +scene0030_00_00023.bin 4 t +scene0030_00_00027.bin 4 t +scene0033_00_00002.bin 13 +scene0033_00_00003.bin 13 +scene0033_00_00006.bin 13 +scene0033_00_00007.bin 13 +scene0033_00_00008.bin 13 +scene0033_00_00009.bin 13 +scene0033_00_00011.bin 13 +scene0038_00_00004.bin 4 +scene0038_00_00005.bin 4 +scene0038_00_00006.bin 4 +scene0038_00_00009.bin 4 +scene0038_00_00013.bin 4 +scene0038_00_00016.bin 4 +scene0043_00_00005.bin 4 t +scene0046_00_00008.bin 4 +scene0048_00_00004.bin 4 +scene0049_00_00007.bin 13 +scene0050_00_00008.bin 13 +scene0050_00_00012.bin 4 +scene0054_00_00032.bin 4 t +scene0056_00_00013.bin 4 +scene0056_00_00015.bin 4 +scene0056_00_00016.bin 4 +scene0056_00_00017.bin 4 +scene0056_00_00021.bin 4 +scene0056_00_00022.bin 4 +scene0057_00_00009.bin 4 +scene0058_00_00007.bin 4 +scene0059_00_00008.bin 4 +scene0059_00_00011.bin 4 +scene0059_00_00013.bin 4 +scene0059_00_00014.bin 4 +scene0059_00_00016.bin 4 +scene0059_00_00019.bin 13 +scene0059_00_00020.bin 4 +scene0063_00_00011.bin 4 +scene0064_00_00002.bin 13 +scene0066_00_00007.bin 4 +scene0066_00_00008.bin 4 +scene0066_00_00009.bin 4 +scene0066_00_00012.bin 4 +scene0066_00_00013.bin 4 +scene0066_00_00014.bin 4 +scene0070_00_00007.bin 4 t +scene0075_00_00005.bin 4 +scene0076_00_00008.bin 4 +scene0076_00_00010.bin 4 +scene0079_00_00011.bin 4 +scene0079_00_00012.bin 4 +scene0079_00_00014.bin 4 +scene0082_00_00005.bin 4 +scene0085_00_00009.bin 4 +scene0087_00_00009.bin 9 +scene0088_00_00004.bin 4 +scene0088_00_00006.bin 4 +scene0088_00_00009.bin 4 +scene0088_00_00010.bin 4 +scene0088_00_00011.bin 4 +scene0088_00_00013.bin 4 +scene0088_00_00016.bin 4 +scene0088_00_00021.bin 4 +scene0089_00_00006.bin 4 +scene0095_00_00007.bin 4 +scene0098_00_00009.bin 4 +scene0098_00_00010.bin 4 +scene0101_00_00020.bin 4 +scene0103_00_00006.bin 4 t +scene0103_00_00008.bin 4 t +scene0103_00_00010.bin 4 t +scene0106_00_00015.bin 4 +scene0107_00_00005.bin 13 t +scene0108_00_00008.bin 4 +scene0114_00_00010.bin 4 +scene0114_00_00011.bin 4 +scene0114_00_00012.bin 4 +scene0122_00_00005.bin 4 t +scene0122_00_00006.bin 4 t +scene0122_00_00007.bin 4 t +scene0126_00_00005.bin 4 +scene0126_00_00007.bin 4 +scene0126_00_00010.bin 4 +scene0129_00_00005.bin 13 +scene0129_00_00006.bin 13 +scene0131_00_00010.bin 4 +scene0131_00_00012.bin 4 +scene0132_00_00007.bin 4 +scene0132_00_00010.bin 4 +scene0132_00_00013.bin 13 +scene0132_00_00014.bin 4 +scene0132_00_00015.bin 4 +scene0133_00_00002.bin 4 +scene0133_00_00003.bin 4 +scene0133_00_00004.bin 4 +scene0133_00_00005.bin 4 +scene0134_00_00005.bin 4 +scene0134_00_00007.bin 4 +scene0134_00_00008.bin 4 +scene0138_00_00014.bin 4 +scene0138_00_00016.bin 4 +scene0138_00_00018.bin 4 +scene0138_00_00024.bin 4 +scene0140_00_00011.bin 4 +scene0140_00_00014.bin 4 +scene0140_00_00017.bin 4 +scene0140_00_00018.bin 4 +scene0140_00_00019.bin 4 +scene0140_00_00020.bin 4 +scene0140_00_00021.bin 4 +scene0140_00_00022.bin 4 +scene0140_00_00023.bin 4 +scene0140_00_00024.bin 4 +scene0140_00_00025.bin 4 +scene0140_00_00026.bin 4 +scene0140_00_00028.bin 4 +scene0140_00_00029.bin 4 +scene0140_00_00030.bin 4 +scene0140_00_00031.bin 4 +scene0140_00_00032.bin 4 +scene0140_00_00034.bin 4 +scene0141_00_00010.bin 4 t +scene0141_00_00011.bin 4 t +scene0141_00_00013.bin 4 t +scene0143_00_00004.bin 13 t +scene0144_00_00011.bin 4 +scene0144_00_00012.bin 4 +scene0145_00_00007.bin 4 +scene0149_00_00015.bin 4 +scene0150_00_00004.bin 4 +scene0152_00_00011.bin 4 +scene0152_00_00012.bin 4 +scene0152_00_00015.bin 4 +scene0152_00_00017.bin 4 +scene0155_00_00009.bin 4 +scene0155_00_00010.bin 4 +scene0155_00_00011.bin 4 +scene0155_00_00012.bin 4 +scene0156_00_00010.bin 4 +scene0156_00_00011.bin 4 +scene0159_00_00006.bin 4 +scene0160_00_00006.bin 4 +scene0161_00_00004.bin 4 +scene0163_00_00004.bin 4 +scene0163_00_00005.bin 4 +scene0163_00_00007.bin 4 +scene0163_00_00008.bin 4 +scene0163_00_00010.bin 4 +scene0165_00_00003.bin 13 +scene0165_00_00004.bin 13 +scene0168_00_00015.bin 4 +scene0171_00_00005.bin 4 +scene0171_00_00006.bin 4 +scene0171_00_00007.bin 4 +scene0171_00_00008.bin 4 +scene0171_00_00009.bin 4 +scene0171_00_00010.bin 4 +scene0177_00_00009.bin 4 +scene0177_00_00010.bin 4 +scene0178_00_00011.bin 4 +scene0001_00_00012.bin 9 +scene0001_00_00016.bin 9 +scene0001_00_00019.bin 9 +scene0002_00_00024.bin 9 +scene0013_00_00005.bin 9 +scene0022_00_00003.bin 9 t +scene0022_00_00005.bin 9 t +scene0022_00_00006.bin 9 t +scene0024_00_00004.bin 9 +scene0035_00_00008.bin 9 +scene0038_00_00003.bin 9 t +scene0050_00_00007.bin 5 +scene0053_00_00005.bin 9 +scene0054_00_00046.bin 9 +scene0064_00_00003.bin 9 +scene0082_00_00001.bin 9 +scene0082_00_00002.bin 9 +scene0091_00_00004.bin 9 +scene0101_00_00016.bin 9 t +scene0102_00_00004.bin 9 +scene0106_00_00009.bin 9 +scene0106_00_00012.bin 9 +scene0111_00_00008.bin 9 +scene0127_00_00017.bin 9 +scene0129_00_00007.bin 9 +scene0132_00_00009.bin 4 +scene0136_00_00010.bin 3 +scene0137_00_00007.bin 9 +scene0138_00_00006.bin 9 t +scene0140_00_00004.bin 9 +scene0151_00_00007.bin 9 +scene0152_00_00010.bin 9 t +scene0152_00_00014.bin 9 t +scene0155_00_00003.bin 9 t +scene0155_00_00004.bin 9 t +scene0155_00_00008.bin 9 t +scene0155_00_00013.bin 9 t +scene0155_00_00015.bin 9 t +scene0157_00_00007.bin 9 t +scene0162_00_00006.bin 9 t +scene0163_00_00002.bin 9 +scene0178_00_00007.bin 9 +scene0181_00_00018.bin 9 +scene0181_00_00025.bin 9 +scene0187_00_00004.bin 9 +scene0187_00_00005.bin 9 +scene0187_00_00008.bin 9 +scene0199_00_00004.bin 9 +scene0203_00_00011.bin 9 +scene0203_00_00014.bin 9 +scene0205_00_00005.bin 9 +scene0209_00_00010.bin 9 +scene0212_00_00003.bin 9 +scene0213_00_00010.bin 9 +scene0213_00_00015.bin 9 +scene0226_00_00007.bin 9 +scene0226_00_00011.bin 9 +scene0230_00_00008.bin 9 t +scene0235_00_00013.bin 9 +scene0235_00_00021.bin 9 +scene0239_00_00007.bin 9 +scene0246_00_00008.bin 9 +scene0246_00_00018.bin 9 +scene0251_00_00005.bin 9 +scene0251_00_00006.bin 9 +scene0259_00_00008.bin 9 t +scene0266_00_00004.bin 9 +scene0266_00_00005.bin 9 +scene0267_00_00002.bin 9 +scene0270_00_00010.bin 9 +scene0272_00_00009.bin 9 +scene0276_00_00009.bin 9 +scene0276_00_00015.bin 9 +scene0279_00_00012.bin 9 +scene0279_00_00021.bin 9 +scene0281_00_00006.bin 9 +scene0288_00_00007.bin 9 +scene0295_00_00006.bin 9 +scene0295_00_00007.bin 9 +scene0297_00_00006.bin 3 +scene0297_00_00008.bin 9 +scene0300_00_00002.bin 9 +scene0300_00_00003.bin 9 +scene0301_00_00006.bin 9 t +scene0307_00_00009.bin 8 +scene0309_00_00004.bin 5 +scene0315_00_00013.bin 9 +scene0315_00_00025.bin 9 +scene0317_00_00010.bin 9 +scene0322_00_00002.bin 9 t +scene0324_00_00003.bin 9 +scene0336_00_00004.bin 5 +scene0340_00_00011.bin 9 +scene0342_00_00005.bin 9 +scene0355_00_00007.bin 9 t +scene0355_00_00008.bin 9 t +scene0357_00_00013.bin 9 t +scene0358_00_00003.bin 9 +scene0358_00_00020.bin 9 +scene0362_00_00012.bin 9 +scene0363_00_00013.bin 9 +scene0370_00_00017.bin 9 +scene0385_00_00006.bin 3 +scene0386_00_00008.bin 9 +scene0387_00_00009.bin 9 +scene0389_00_00008.bin 9 t +scene0390_00_00002.bin 9 +scene0404_00_00006.bin 9 +scene0407_00_00006.bin 9 +scene0418_00_00010.bin 3 +scene0424_00_00005.bin 5 +scene0430_00_00002.bin 9 +scene0432_00_00003.bin 9 +scene0451_00_00007.bin 9 +scene0455_00_00005.bin 9 +scene0461_00_00005.bin 9 +scene0465_00_00006.bin 9 +scene0472_00_00009.bin 9 +scene0476_00_00008.bin 9 +scene0477_00_00020.bin 9 +scene0481_00_00005.bin 9 +scene0481_00_00006.bin 9 +scene0481_00_00007.bin 9 +scene0481_00_00011.bin 9 +scene0487_00_00017.bin 9 +scene0487_00_00019.bin 9 +scene0495_00_00001.bin 9 +scene0495_00_00002.bin 9 +scene0499_00_00006.bin 9 +scene0499_00_00016.bin 9 +scene0500_00_00008.bin 9 +scene0507_00_00005.bin 9 t +scene0514_00_00007.bin 9 +scene0518_00_00004.bin 9 +scene0529_00_00016.bin 9 +scene0537_00_00004.bin 9 +scene0542_00_00006.bin 9 +scene0547_00_00013.bin 9 +scene0549_00_00009.bin 9 +scene0549_00_00010.bin 9 +scene0549_00_00012.bin 9 +scene0549_00_00013.bin 9 +scene0558_00_00011.bin 9 +scene0572_00_00004.bin 9 +scene0574_00_00005.bin 9 +scene0588_00_00016.bin 9 +scene0588_00_00017.bin 9 +scene0588_00_00018.bin 9 +scene0588_00_00021.bin 9 +scene0598_00_00003.bin 9 +scene0599_00_00003.bin 9 +scene0601_00_00010.bin 9 t +scene0603_00_00007.bin 9 +scene0603_00_00009.bin 5 +scene0603_00_00016.bin 9 +scene0617_00_00007.bin 9 +scene0622_00_00001.bin 9 +scene0626_00_00003.bin 9 +scene0627_00_00002.bin 9 +scene0638_00_00001.bin 9 +scene0640_00_00006.bin 9 t +scene0641_00_00008.bin 9 +scene0646_00_00009.bin 9 +scene0646_00_00017.bin 9 +scene0000_00_00019.bin 5 +scene0006_00_00005.bin 5 t +scene0032_00_00005.bin 5 +scene0035_00_00005.bin 5 +scene0040_00_00003.bin 5 t +scene0043_00_00003.bin 5 +scene0050_00_00022.bin 5 +scene0055_00_00002.bin 5 +scene0078_00_00002.bin 5 +scene0089_00_00004.bin 5 +scene0091_00_00005.bin 5 +scene0094_00_00006.bin 5 t +scene0101_00_00006.bin 5 t +scene0108_00_00003.bin 5 +scene0108_00_00005.bin 5 +scene0110_00_00006.bin 5 t +scene0123_00_00002.bin 9 t +scene0123_00_00003.bin 9 t +scene0123_00_00004.bin 9 t +scene0123_00_00005.bin 9 t +scene0126_00_00004.bin 5 +scene0127_00_00008.bin 5 +scene0127_00_00009.bin 5 +scene0155_00_00002.bin 5 +scene0166_00_00005.bin 5 t +scene0174_00_00006.bin 5 +scene0193_00_00003.bin 5 t +scene0207_00_00005.bin 5 +scene0211_00_00004.bin 5 +scene0217_00_00006.bin 5 +scene0217_00_00008.bin 5 +scene0222_00_00003.bin 5 t +scene0222_00_00004.bin 5 t +scene0231_00_00015.bin 5 +scene0233_00_00005.bin 5 +scene0266_00_00002.bin 5 t +scene0266_00_00006.bin 5 t +scene0266_00_00009.bin 5 t +scene0266_00_00018.bin 9 +scene0272_00_00007.bin 5 +scene0287_00_00003.bin 5 +scene0293_00_00000.bin 5 +scene0320_00_00004.bin 5 t +scene0333_00_00002.bin 5 +scene0336_00_00006.bin 5 +scene0341_00_00003.bin 5 t +scene0353_00_00007.bin 5 +scene0370_00_00003.bin 5 +scene0376_00_00004.bin 5 +scene0378_00_00005.bin 5 +scene0378_00_00007.bin 5 +scene0378_00_00010.bin 5 +scene0383_00_00006.bin 5 +scene0398_00_00004.bin 5 +scene0398_00_00007.bin 5 +scene0400_00_00005.bin 5 +scene0425_00_00004.bin 5 +scene0440_00_00007.bin 5 +scene0440_00_00009.bin 5 +scene0443_00_00005.bin 5 +scene0443_00_00009.bin 5 +scene0468_00_00006.bin 5 +scene0468_00_00008.bin 5 +scene0474_00_00005.bin 5 t +scene0489_00_00003.bin 5 +scene0505_00_00002.bin 5 t +scene0506_00_00004.bin 5 +scene0515_00_00011.bin 5 t +scene0517_00_00009.bin 5 +scene0517_00_00011.bin 5 +scene0547_00_00008.bin 5 +scene0554_00_00010.bin 5 +scene0620_00_00004.bin 5 +scene0643_00_00006.bin 5 t +scene0643_00_00007.bin 5 t +scene0643_00_00008.bin 5 t +scene0000_00_00041.bin 0 +scene0043_00_00007.bin 0 t +scene0050_00_00017.bin 0 t +scene0054_00_00041.bin 0 +scene0054_00_00049.bin 0 +scene0108_00_00016.bin 0 +scene0130_00_00006.bin 0 +scene0141_00_00017.bin 0 +scene0174_00_00008.bin 0 +scene0187_00_00013.bin 0 +scene0198_00_00011.bin 0 t +scene0217_00_00016.bin 0 +scene0239_00_00008.bin 0 +scene0242_00_00007.bin 0 +scene0358_00_00018.bin 0 +scene0372_00_00013.bin 0 t +scene0388_00_00008.bin 0 t +scene0425_00_00016.bin 0 +scene0426_00_00022.bin 0 t +scene0430_00_00022.bin 0 +scene0433_00_00013.bin 0 +scene0456_00_00010.bin 0 +scene0473_00_00008.bin 0 +scene0493_00_00009.bin 0 +scene0508_00_00016.bin 0 t +scene0517_00_00023.bin 0 t +scene0517_00_00027.bin 0 t +scene0517_00_00030.bin 0 t +scene0558_00_00009.bin 0 +scene0580_00_00010.bin 0 +scene0580_00_00011.bin 0 +scene0615_00_00021.bin 0 +scene0627_00_00037.bin 0 +scene0000_00_00012.bin 3 +scene0000_00_00014.bin 3 +scene0000_00_00022.bin 3 +scene0000_00_00023.bin 3 +scene0000_00_00028.bin 3 +scene0000_00_00033.bin 3 +scene0002_00_00004.bin 3 +scene0002_00_00015.bin 8 +scene0002_00_00018.bin 8 +scene0003_00_00003.bin 3 +scene0003_00_00004.bin 3 +scene0003_00_00005.bin 3 +scene0003_00_00007.bin 3 +scene0003_00_00008.bin 3 +scene0003_00_00011.bin 3 +scene0007_00_00001.bin 3 +scene0010_00_00008.bin 5 +scene0014_00_00005.bin 12 +scene0018_00_00006.bin 3 +scene0024_00_00009.bin 3 +scene0026_00_00009.bin 12 +scene0034_00_00006.bin 3 +scene0035_00_00006.bin 3 +scene0040_00_00014.bin 3 +scene0046_00_00004.bin 3 +scene0047_00_00004.bin 3 t +scene0047_00_00009.bin 3 t +scene0049_00_00006.bin 3 t +scene0051_00_00006.bin 3 +scene0054_00_00030.bin 3 t +scene0063_00_00006.bin 3 +scene0063_00_00008.bin 3 +scene0063_00_00017.bin 3 +scene0068_00_00004.bin 3 +scene0072_00_00002.bin 3 +scene0073_00_00005.bin 3 +scene0076_00_00005.bin 3 t +scene0080_00_00003.bin 3 t +scene0090_00_00004.bin 14 +scene0090_00_00005.bin 14 +scene0090_00_00006.bin 14 +scene0091_00_00008.bin 3 +scene0092_00_00005.bin 3 +scene0092_00_00008.bin 1 t +scene0094_00_00003.bin 5 t +scene0095_00_00004.bin 3 +scene0097_00_00004.bin 3 +scene0097_00_00005.bin 3 +scene0097_00_00006.bin 3 +scene0097_00_00014.bin 3 +scene0100_00_00002.bin 3 +scene0101_00_00012.bin 3 +scene0104_00_00006.bin 3 +scene0108_00_00004.bin 8 +scene0108_00_00007.bin 8 +scene0109_00_00003.bin 3 +scene0110_00_00003.bin 3 +scene0114_00_00002.bin 3 +scene0114_00_00003.bin 3 +scene0114_00_00006.bin 3 +scene0114_00_00014.bin 3 +scene0114_00_00015.bin 3 +scene0114_00_00017.bin 3 +scene0114_00_00021.bin 3 +scene0117_00_00002.bin 3 +scene0117_00_00004.bin 3 +scene0117_00_00005.bin 3 +scene0117_00_00010.bin 3 +scene0121_00_00005.bin 3 +scene0124_00_00005.bin 14 +scene0124_00_00006.bin 3 t +scene0126_00_00008.bin 8 +scene0127_00_00004.bin 3 +scene0127_00_00006.bin 3 +scene0131_00_00014.bin 3 +scene0147_00_00004.bin 3 +scene0147_00_00007.bin 3 +scene0147_00_00009.bin 3 +scene0147_00_00010.bin 3 +scene0147_00_00012.bin 3 +scene0147_00_00016.bin 3 +scene0149_00_00005.bin 3 +scene0149_00_00009.bin 3 +scene0149_00_00011.bin 3 +scene0149_00_00017.bin 3 +scene0153_00_00005.bin 3 +scene0157_00_00004.bin 3 +scene0158_00_00002.bin 3 +scene0158_00_00003.bin 3 +scene0158_00_00006.bin 3 +scene0158_00_00007.bin 3 +scene0162_00_00007.bin 8 +scene0164_00_00003.bin 3 t +scene0164_00_00008.bin 3 t +scene0164_00_00010.bin 3 t +scene0164_00_00012.bin 3 t +scene0164_00_00017.bin 3 t +scene0172_00_00003.bin 3 +scene0175_00_00006.bin 3 +scene0181_00_00004.bin 3 +scene0184_00_00003.bin 3 +scene0186_00_00004.bin 3 +scene0186_00_00012.bin 3 +scene0188_00_00007.bin 3 +scene0195_00_00006.bin 3 +scene0200_00_00003.bin 3 +scene0201_00_00007.bin 3 +scene0204_00_00003.bin 3 t +scene0205_00_00002.bin 3 +scene0205_00_00008.bin 3 +scene0207_00_00008.bin 8 t +scene0210_00_00003.bin 3 t +scene0211_00_00005.bin 3 +scene0211_00_00006.bin 3 +scene0214_00_00004.bin 3 +scene0214_00_00006.bin 8 +scene0214_00_00011.bin 3 +scene0215_00_00004.bin 3 +scene0217_00_00004.bin 3 +scene0221_00_00007.bin 3 t +scene0221_00_00009.bin 3 t +scene0223_00_00002.bin 3 t +scene0223_00_00009.bin 5 +scene0224_00_00010.bin 3 +scene0225_00_00006.bin 3 +scene0225_00_00007.bin 3 +scene0225_00_00008.bin 3 +scene0231_00_00013.bin 3 t +scene0232_00_00006.bin 3 +scene0232_00_00009.bin 3 +scene0233_00_00003.bin 3 +scene0233_00_00010.bin 3 +scene0233_00_00011.bin 3 +scene0233_00_00012.bin 3 +scene0236_00_00006.bin 3 +scene0240_00_00003.bin 3 +scene0240_00_00004.bin 3 +scene0240_00_00013.bin 3 +scene0246_00_00006.bin 3 +scene0247_00_00006.bin 3 +scene0247_00_00008.bin 3 +scene0247_00_00014.bin 3 +scene0247_00_00019.bin 3 +scene0250_00_00006.bin 3 +scene0253_00_00002.bin 3 +scene0255_00_00006.bin 3 t +scene0255_00_00008.bin 3 t +scene0259_00_00004.bin 8 +scene0270_00_00011.bin 3 +scene0271_00_00012.bin 3 +scene0272_00_00008.bin 3 +scene0276_00_00005.bin 3 +scene0276_00_00006.bin 3 +scene0276_00_00013.bin 3 +scene0278_00_00003.bin 3 +scene0278_00_00004.bin 3 +scene0279_00_00010.bin 3 +scene0280_00_00010.bin 3 +scene0282_00_00006.bin 3 +scene0286_00_00009.bin 3 +scene0295_00_00004.bin 3 +scene0295_00_00010.bin 3 +scene0296_00_00010.bin 3 t +scene0303_00_00006.bin 3 +scene0304_00_00005.bin 3 +scene0305_00_00010.bin 3 t +scene0309_00_00008.bin 3 +scene0310_00_00002.bin 3 +scene0310_00_00003.bin 3 +scene0311_00_00001.bin 3 t +scene0327_00_00007.bin 3 +scene0327_00_00009.bin 3 +scene0335_00_00002.bin 3 +scene0335_00_00007.bin 3 +scene0335_00_00011.bin 3 +scene0335_00_00012.bin 3 +scene0335_00_00023.bin 3 +scene0336_00_00008.bin 3 t +scene0337_00_00001.bin 3 +scene0338_00_00002.bin 3 +scene0338_00_00005.bin 3 +scene0345_00_00006.bin 3 +scene0348_00_00003.bin 3 +scene0348_00_00004.bin 3 +scene0348_00_00005.bin 3 +scene0350_00_00007.bin 8 +scene0352_00_00009.bin 3 +scene0353_00_00018.bin 3 t +scene0356_00_00005.bin 3 t +scene0357_00_00002.bin 3 +scene0357_00_00015.bin 3 +scene0361_00_00006.bin 8 +scene0364_00_00004.bin 3 t +scene0364_00_00007.bin 3 t +scene0364_00_00010.bin 3 t +scene0366_00_00002.bin 3 +scene0369_00_00007.bin 3 +scene0369_00_00008.bin 3 +scene0376_00_00005.bin 3 +scene0378_00_00008.bin 8 +scene0378_00_00019.bin 3 +scene0379_00_00004.bin 8 +scene0379_00_00014.bin 3 +scene0379_00_00028.bin 3 +scene0390_00_00005.bin 3 +scene0392_00_00011.bin 3 +scene0392_00_00013.bin 3 +scene0392_00_00014.bin 3 +scene0394_00_00015.bin 3 +scene0395_00_00008.bin 3 +scene0398_00_00013.bin 3 t +scene0400_00_00007.bin 3 +scene0409_00_00003.bin 3 +scene0414_00_00006.bin 3 +scene0419_00_00006.bin 3 t +scene0425_00_00002.bin 3 +scene0426_00_00005.bin 3 t +scene0431_00_00003.bin 3 +scene0431_00_00004.bin 3 +scene0431_00_00007.bin 3 +scene0431_00_00011.bin 3 +scene0431_00_00012.bin 3 +scene0431_00_00014.bin 3 +scene0438_00_00007.bin 3 +scene0439_00_00002.bin 3 +scene0439_00_00003.bin 3 +scene0439_00_00004.bin 3 +scene0439_00_00011.bin 3 +scene0439_00_00012.bin 3 +scene0440_00_00002.bin 3 +scene0440_00_00013.bin 3 +scene0444_00_00000.bin 8 t +scene0447_00_00003.bin 3 +scene0447_00_00011.bin 12 +scene0449_00_00004.bin 8 +scene0449_00_00006.bin 12 +scene0465_00_00011.bin 3 t +scene0467_00_00011.bin 3 t +scene0472_00_00004.bin 3 +scene0472_00_00010.bin 12 t +scene0472_00_00018.bin 3 +scene0476_00_00004.bin 3 +scene0477_00_00007.bin 3 +scene0477_00_00008.bin 3 +scene0477_00_00021.bin 3 +scene0478_00_00002.bin 3 +scene0479_00_00002.bin 3 +scene0479_00_00003.bin 3 +scene0479_00_00012.bin 3 +scene0482_00_00002.bin 3 +scene0487_00_00022.bin 3 +scene0488_00_00003.bin 3 t +scene0488_00_00004.bin 3 t +scene0488_00_00005.bin 3 t +scene0488_00_00008.bin 3 t +scene0488_00_00011.bin 3 t +scene0491_00_00002.bin 3 t +scene0492_00_00005.bin 12 +scene0498_00_00010.bin 3 +scene0504_00_00021.bin 3 +scene0505_00_00014.bin 3 +scene0505_00_00018.bin 3 +scene0505_00_00021.bin 3 +scene0506_00_00005.bin 3 +scene0506_00_00009.bin 3 +scene0510_00_00003.bin 12 +scene0511_00_00005.bin 3 +scene0515_00_00010.bin 3 +scene0517_00_00001.bin 3 t +scene0517_00_00013.bin 3 t +scene0517_00_00014.bin 3 t +scene0517_00_00022.bin 3 t +scene0519_00_00003.bin 12 t +scene0521_00_00005.bin 3 +scene0521_00_00013.bin 3 +scene0525_00_00005.bin 3 +scene0529_00_00003.bin 3 t +scene0529_00_00009.bin 3 t +scene0529_00_00013.bin 12 t +scene0532_00_00014.bin 3 +scene0540_00_00011.bin 3 +scene0541_00_00007.bin 3 t +scene0541_00_00008.bin 3 t +scene0542_00_00003.bin 3 +scene0546_00_00010.bin 3 t +scene0547_00_00003.bin 3 +scene0548_00_00009.bin 3 +scene0556_00_00005.bin 3 +scene0570_00_00005.bin 12 +scene0573_00_00006.bin 3 +scene0577_00_00006.bin 3 +scene0577_00_00007.bin 3 +scene0577_00_00008.bin 3 +scene0580_00_00007.bin 3 +scene0584_00_00005.bin 3 +scene0589_00_00003.bin 3 +scene0589_00_00005.bin 3 +scene0590_00_00009.bin 3 +scene0590_00_00016.bin 3 +scene0591_00_00004.bin 3 +scene0603_00_00008.bin 8 +scene0607_00_00003.bin 3 +scene0614_00_00009.bin 3 t +scene0615_00_00008.bin 3 +scene0620_00_00005.bin 3 +scene0620_00_00006.bin 3 +scene0623_00_00011.bin 3 +scene0629_00_00004.bin 3 +scene0631_00_00002.bin 3 +scene0632_00_00003.bin 3 +scene0633_00_00007.bin 3 +scene0642_00_00008.bin 3 +scene0642_00_00020.bin 3 +scene0646_00_00019.bin 8 +scene0005_00_00008.bin 8 +scene0012_00_00003.bin 8 t +scene0020_00_00002.bin 8 +scene0020_00_00008.bin 8 +scene0025_00_00007.bin 8 +scene0028_00_00004.bin 8 +scene0028_00_00008.bin 8 +scene0028_00_00013.bin 8 +scene0028_00_00014.bin 8 +scene0028_00_00019.bin 8 +scene0030_00_00001.bin 8 +scene0030_00_00014.bin 8 +scene0030_00_00022.bin 8 +scene0032_00_00003.bin 8 +scene0037_00_00002.bin 8 +scene0037_00_00003.bin 8 +scene0040_00_00002.bin 8 +scene0040_00_00011.bin 8 +scene0049_00_00005.bin 8 +scene0050_00_00014.bin 8 +scene0051_00_00005.bin 8 +scene0054_00_00003.bin 8 +scene0054_00_00005.bin 8 +scene0054_00_00011.bin 8 +scene0054_00_00014.bin 8 +scene0054_00_00039.bin 8 +scene0072_00_00013.bin 8 +scene0077_00_00001.bin 8 +scene0077_00_00011.bin 8 +scene0079_00_00003.bin 8 t +scene0079_00_00004.bin 8 t +scene0079_00_00005.bin 8 t +scene0079_00_00006.bin 8 t +scene0079_00_00007.bin 8 t +scene0079_00_00010.bin 8 t +scene0092_00_00004.bin 8 t +scene0094_00_00005.bin 8 +scene0098_00_00004.bin 8 +scene0098_00_00011.bin 8 +scene0108_00_00012.bin 8 +scene0109_00_00006.bin 8 +scene0131_00_00008.bin 8 +scene0144_00_00013.bin 8 +scene0154_00_00004.bin 8 t +scene0168_00_00020.bin 8 +scene0168_00_00021.bin 8 +scene0177_00_00002.bin 8 +scene0177_00_00004.bin 8 +scene0177_00_00007.bin 8 +scene0181_00_00013.bin 8 +scene0181_00_00014.bin 8 +scene0186_00_00005.bin 8 t +scene0186_00_00009.bin 8 t +scene0186_00_00015.bin 8 t +scene0190_00_00002.bin 8 t +scene0190_00_00004.bin 8 t +scene0191_00_00001.bin 8 +scene0194_00_00005.bin 8 +scene0197_00_00002.bin 8 t +scene0203_00_00003.bin 8 t +scene0203_00_00009.bin 8 t +scene0207_00_00019.bin 8 t +scene0208_00_00002.bin 8 t +scene0208_00_00005.bin 8 t +scene0208_00_00006.bin 8 t +scene0208_00_00007.bin 8 t +scene0208_00_00008.bin 8 t +scene0208_00_00009.bin 8 t +scene0211_00_00007.bin 8 t +scene0217_00_00005.bin 8 t +scene0217_00_00009.bin 8 t +scene0218_00_00002.bin 8 +scene0223_00_00008.bin 8 +scene0223_00_00010.bin 8 +scene0224_00_00005.bin 8 t +scene0231_00_00006.bin 8 +scene0233_00_00007.bin 8 +scene0233_00_00008.bin 8 +scene0236_00_00005.bin 8 +scene0236_00_00010.bin 8 +scene0240_00_00006.bin 8 t +scene0241_00_00005.bin 8 +scene0246_00_00011.bin 8 +scene0253_00_00009.bin 8 +scene0259_00_00013.bin 8 +scene0262_00_00003.bin 8 +scene0272_00_00002.bin 8 +scene0272_00_00006.bin 8 +scene0286_00_00019.bin 3 +scene0293_00_00003.bin 8 +scene0295_00_00005.bin 8 +scene0301_00_00017.bin 8 +scene0303_00_00003.bin 8 +scene0305_00_00006.bin 8 +scene0305_00_00008.bin 8 +scene0305_00_00009.bin 8 +scene0305_00_00013.bin 8 +scene0309_00_00007.bin 8 +scene0325_00_00003.bin 8 +scene0325_00_00004.bin 8 +scene0332_00_00008.bin 8 +scene0349_00_00004.bin 8 +scene0353_00_00006.bin 8 +scene0353_00_00008.bin 8 +scene0361_00_00002.bin 8 +scene0361_00_00004.bin 8 +scene0377_00_00002.bin 8 +scene0377_00_00004.bin 8 +scene0378_00_00003.bin 8 +scene0378_00_00004.bin 8 +scene0379_00_00006.bin 8 +scene0379_00_00009.bin 8 +scene0382_00_00005.bin 8 +scene0383_00_00003.bin 8 +scene0392_00_00009.bin 8 +scene0393_00_00003.bin 8 +scene0395_00_00013.bin 8 t +scene0398_00_00012.bin 8 +scene0400_00_00003.bin 8 +scene0404_00_00001.bin 8 t +scene0404_00_00005.bin 8 t +scene0407_00_00004.bin 8 +scene0408_00_00004.bin 8 +scene0422_00_00009.bin 1 +scene0424_00_00003.bin 8 +scene0425_00_00006.bin 8 +scene0425_00_00022.bin 8 +scene0440_00_00005.bin 8 +scene0440_00_00008.bin 8 +scene0443_00_00008.bin 8 t +scene0443_00_00010.bin 8 t +scene0444_00_00002.bin 8 t +scene0451_00_00009.bin 3 t +scene0464_00_00004.bin 8 +scene0465_00_00018.bin 8 t +scene0467_00_00003.bin 8 +scene0467_00_00006.bin 8 +scene0467_00_00010.bin 8 +scene0474_00_00006.bin 8 t +scene0474_00_00011.bin 8 t +scene0481_00_00002.bin 8 +scene0504_00_00003.bin 8 +scene0505_00_00004.bin 8 +scene0506_00_00006.bin 8 t +scene0506_00_00007.bin 8 t +scene0514_00_00009.bin 8 +scene0515_00_00012.bin 8 +scene0518_00_00001.bin 8 t +scene0521_00_00004.bin 8 +scene0534_00_00003.bin 8 t +scene0534_00_00004.bin 8 t +scene0542_00_00008.bin 8 +scene0545_00_00003.bin 8 +scene0547_00_00005.bin 8 +scene0554_00_00007.bin 8 +scene0558_00_00002.bin 8 +scene0565_00_00006.bin 8 +scene0565_00_00008.bin 8 +scene0576_00_00008.bin 8 +scene0577_00_00003.bin 8 t +scene0580_00_00006.bin 8 t +scene0582_00_00004.bin 8 +scene0582_00_00014.bin 8 +scene0585_00_00002.bin 8 +scene0585_00_00005.bin 8 +scene0585_00_00007.bin 8 +scene0589_00_00002.bin 8 +scene0591_00_00005.bin 8 +scene0591_00_00010.bin 8 +scene0593_00_00003.bin 8 +scene0598_00_00002.bin 8 +scene0603_00_00002.bin 8 +scene0603_00_00012.bin 8 +scene0603_00_00019.bin 8 +scene0613_00_00004.bin 8 +scene0613_00_00006.bin 8 +scene0614_00_00002.bin 8 +scene0614_00_00003.bin 8 +scene0614_00_00018.bin 3 t +scene0614_00_00020.bin 8 +scene0619_00_00003.bin 8 +scene0630_00_00002.bin 8 +scene0632_00_00004.bin 8 t +scene0635_00_00003.bin 8 +scene0643_00_00009.bin 8 +scene0643_00_00010.bin 8 +scene0644_00_00003.bin 8 +scene0645_00_00025.bin 8 +scene0646_00_00013.bin 8 +scene0646_00_00018.bin 8 +scene0646_00_00025.bin 8 +scene0010_00_00020.bin 6 +scene0010_00_00024.bin 6 +scene0010_00_00031.bin 6 +scene0017_00_00016.bin 6 +scene0025_00_00015.bin 6 +scene0025_00_00016.bin 6 +scene0040_00_00016.bin 6 +scene0040_00_00017.bin 6 +scene0056_00_00014.bin 6 +scene0056_00_00020.bin 6 +scene0070_00_00013.bin 6 t +scene0085_00_00011.bin 6 +scene0095_00_00010.bin 6 +scene0095_00_00011.bin 6 +scene0095_00_00012.bin 6 +scene0095_00_00015.bin 6 +scene0131_00_00022.bin 6 +scene0137_00_00012.bin 6 +scene0138_00_00017.bin 6 +scene0138_00_00021.bin 6 +scene0147_00_00018.bin 6 t +scene0166_00_00010.bin 6 +scene0168_00_00022.bin 6 +scene0168_00_00025.bin 6 +scene0177_00_00008.bin 6 +scene0177_00_00015.bin 6 +scene0184_00_00005.bin 6 +scene0206_00_00020.bin 6 +scene0209_00_00015.bin 6 +scene0211_00_00012.bin 6 +scene0238_00_00010.bin 6 +scene0263_00_00016.bin 6 +scene0264_00_00007.bin 6 +scene0279_00_00020.bin 6 +scene0289_00_00012.bin 6 +scene0296_00_00025.bin 6 +scene0305_00_00016.bin 6 +scene0305_00_00018.bin 6 +scene0305_00_00021.bin 6 +scene0314_00_00008.bin 6 +scene0320_00_00016.bin 6 t +scene0362_00_00011.bin 6 +scene0378_00_00018.bin 6 +scene0385_00_00012.bin 6 +scene0389_00_00011.bin 6 +scene0395_00_00011.bin 6 t +scene0416_00_00017.bin 6 +scene0424_00_00015.bin 6 +scene0424_00_00018.bin 6 +scene0424_00_00019.bin 6 +scene0426_00_00010.bin 6 t +scene0480_00_00006.bin 6 +scene0489_00_00011.bin 6 +scene0489_00_00012.bin 6 +scene0502_00_00002.bin 6 +scene0568_00_00005.bin 6 +scene0569_00_00015.bin 6 +scene0582_00_00007.bin 6 +scene0582_00_00012.bin 6 +scene0582_00_00013.bin 6 +scene0590_00_00017.bin 6 +scene0598_00_00010.bin 6 +scene0598_00_00011.bin 6 +scene0599_00_00007.bin 6 +scene0603_00_00013.bin 6 +scene0604_00_00009.bin 6 +scene0608_00_00008.bin 6 +scene0614_00_00021.bin 6 +scene0617_00_00004.bin 6 +scene0623_00_00008.bin 6 +scene0642_00_00018.bin 6 +scene0643_00_00022.bin 6 +scene0643_00_00024.bin 6 +scene0646_00_00031.bin 6 +scene0000_00_00024.bin 7 +scene0002_00_00006.bin 7 +scene0002_00_00009.bin 7 +scene0002_00_00010.bin 7 +scene0010_00_00007.bin 7 +scene0017_00_00006.bin 7 +scene0019_00_00008.bin 7 +scene0025_00_00004.bin 7 +scene0026_00_00008.bin 7 t +scene0026_00_00010.bin 7 t +scene0029_00_00003.bin 7 +scene0030_00_00009.bin 7 +scene0032_00_00006.bin 7 t +scene0040_00_00008.bin 7 +scene0042_00_00005.bin 7 +scene0044_00_00003.bin 7 +scene0047_00_00007.bin 7 +scene0050_00_00011.bin 7 +scene0050_00_00013.bin 7 +scene0051_00_00008.bin 7 +scene0051_00_00010.bin 7 +scene0054_00_00007.bin 7 +scene0054_00_00010.bin 7 +scene0054_00_00012.bin 7 +scene0054_00_00019.bin 7 +scene0056_00_00006.bin 7 +scene0062_00_00003.bin 7 t +scene0065_00_00003.bin 7 t +scene0071_00_00002.bin 7 +scene0072_00_00007.bin 7 +scene0073_00_00006.bin 7 +scene0078_00_00004.bin 7 +scene0084_00_00006.bin 7 +scene0085_00_00007.bin 7 +scene0086_00_00002.bin 7 +scene0096_00_00007.bin 7 t +scene0096_00_00009.bin 7 t +scene0097_00_00003.bin 7 +scene0098_00_00015.bin 7 +scene0110_00_00005.bin 7 +scene0115_00_00003.bin 7 +scene0118_00_00003.bin 7 +scene0118_00_00004.bin 7 +scene0121_00_00006.bin 7 +scene0122_00_00003.bin 7 +scene0124_00_00002.bin 7 t +scene0124_00_00003.bin 7 t +scene0126_00_00006.bin 7 +scene0127_00_00005.bin 7 t +scene0140_00_00008.bin 7 +scene0142_00_00003.bin 7 +scene0144_00_00009.bin 7 +scene0153_00_00004.bin 7 +scene0159_00_00009.bin 7 t +scene0162_00_00004.bin 7 +scene0174_00_00004.bin 7 t +scene0175_00_00007.bin 7 +scene0177_00_00005.bin 7 +scene0178_00_00006.bin 7 +scene0184_00_00004.bin 7 +scene0186_00_00020.bin 7 t +scene0191_00_00006.bin 7 +scene0195_00_00004.bin 7 +scene0196_00_00004.bin 7 +scene0197_00_00004.bin 7 +scene0198_00_00005.bin 7 +scene0198_00_00006.bin 7 +scene0204_00_00004.bin 7 +scene0210_00_00006.bin 7 +scene0214_00_00007.bin 7 +scene0217_00_00007.bin 7 +scene0220_00_00009.bin 7 +scene0232_00_00004.bin 7 +scene0233_00_00006.bin 7 +scene0240_00_00005.bin 7 +scene0241_00_00003.bin 7 +scene0242_00_00002.bin 7 t +scene0242_00_00003.bin 7 t +scene0250_00_00005.bin 7 +scene0251_00_00009.bin 7 +scene0259_00_00006.bin 7 +scene0261_00_00006.bin 7 t +scene0261_00_00007.bin 7 t +scene0265_00_00007.bin 12 +scene0267_00_00007.bin 7 +scene0268_00_00006.bin 7 +scene0276_00_00011.bin 7 +scene0279_00_00007.bin 7 t +scene0286_00_00005.bin 7 +scene0290_00_00008.bin 7 +scene0290_00_00011.bin 7 +scene0290_00_00012.bin 7 +scene0296_00_00009.bin 7 +scene0303_00_00005.bin 7 +scene0304_00_00006.bin 7 +scene0305_00_00011.bin 7 +scene0307_00_00006.bin 7 +scene0308_00_00006.bin 7 +scene0327_00_00006.bin 7 +scene0327_00_00008.bin 7 +scene0329_00_00007.bin 7 +scene0329_00_00008.bin 7 +scene0329_00_00012.bin 7 +scene0332_00_00005.bin 7 +scene0335_00_00005.bin 7 t +scene0346_00_00004.bin 7 t +scene0350_00_00005.bin 7 +scene0352_00_00004.bin 7 +scene0357_00_00005.bin 7 +scene0358_00_00005.bin 7 +scene0360_00_00003.bin 7 t +scene0364_00_00006.bin 7 t +scene0375_00_00002.bin 7 +scene0378_00_00006.bin 7 +scene0383_00_00005.bin 7 t +scene0384_00_00003.bin 7 +scene0389_00_00005.bin 7 t +scene0396_00_00005.bin 7 +scene0398_00_00005.bin 7 t +scene0410_00_00002.bin 7 +scene0415_00_00004.bin 7 +scene0419_00_00019.bin 7 +scene0421_00_00005.bin 7 t +scene0424_00_00007.bin 7 +scene0425_00_00005.bin 7 +scene0434_00_00005.bin 7 +scene0438_00_00008.bin 7 +scene0446_00_00004.bin 7 +scene0447_00_00007.bin 7 +scene0448_00_00004.bin 7 +scene0449_00_00008.bin 7 t +scene0465_00_00010.bin 7 t +scene0470_00_00002.bin 7 +scene0473_00_00002.bin 7 +scene0473_00_00004.bin 7 +scene0474_00_00007.bin 7 +scene0479_00_00004.bin 7 +scene0487_00_00006.bin 7 +scene0498_00_00004.bin 7 +scene0499_00_00018.bin 7 t +scene0501_00_00003.bin 7 +scene0524_00_00007.bin 7 t +scene0525_00_00008.bin 7 +scene0527_00_00004.bin 7 t +scene0530_00_00006.bin 7 t +scene0532_00_00004.bin 7 +scene0534_00_00006.bin 7 +scene0538_00_00004.bin 7 +scene0539_00_00006.bin 7 +scene0541_00_00009.bin 7 +scene0547_00_00007.bin 7 t +scene0548_00_00007.bin 7 +scene0550_00_00005.bin 7 +scene0554_00_00005.bin 7 +scene0560_00_00004.bin 7 +scene0561_00_00003.bin 7 t +scene0561_00_00004.bin 7 t +scene0561_00_00006.bin 7 t +scene0561_00_00007.bin 7 t +scene0561_00_00008.bin 7 t +scene0564_00_00002.bin 7 +scene0571_00_00005.bin 7 +scene0574_00_00003.bin 7 +scene0581_00_00006.bin 7 +scene0583_00_00005.bin 7 +scene0599_00_00005.bin 7 +scene0613_00_00008.bin 7 +scene0615_00_00004.bin 7 +scene0623_00_00006.bin 7 t +scene0625_00_00003.bin 7 t +scene0628_00_00005.bin 7 +scene0629_00_00011.bin 7 +scene0635_00_00006.bin 7 +scene0642_00_00026.bin 7 +scene0643_00_00005.bin 7 t +scene0645_00_00012.bin 7 +scene0646_00_00007.bin 7 +scene0000_00_00038.bin 1 +scene0000_00_00039.bin 1 +scene0000_00_00046.bin 1 +scene0002_00_00029.bin 1 +scene0002_00_00035.bin 1 +scene0003_00_00009.bin 1 +scene0009_00_00006.bin 1 t +scene0014_00_00007.bin 1 +scene0017_00_00015.bin 1 t +scene0018_00_00009.bin 1 +scene0018_00_00013.bin 1 +scene0026_00_00016.bin 1 +scene0029_00_00007.bin 1 +scene0036_00_00005.bin 1 +scene0043_00_00006.bin 1 +scene0058_00_00011.bin 1 +scene0060_00_00007.bin 1 t +scene0086_00_00009.bin 1 +scene0089_00_00007.bin 1 t +scene0089_00_00008.bin 1 t +scene0100_00_00009.bin 1 +scene0104_00_00008.bin 1 +scene0108_00_00021.bin 1 +scene0109_00_00007.bin 1 +scene0111_00_00011.bin 1 +scene0120_00_00006.bin 1 +scene0127_00_00016.bin 1 t +scene0136_00_00005.bin 1 +scene0136_00_00008.bin 1 +scene0140_00_00027.bin 1 +scene0140_00_00035.bin 1 +scene0155_00_00019.bin 1 +scene0178_00_00016.bin 1 +scene0193_00_00006.bin 1 +scene0195_00_00009.bin 1 +scene0197_00_00007.bin 1 +scene0217_00_00014.bin 1 t +scene0217_00_00015.bin 1 t +scene0220_00_00016.bin 1 +scene0222_00_00011.bin 1 t +scene0222_00_00012.bin 1 t +scene0225_00_00013.bin 1 +scene0225_00_00020.bin 1 +scene0225_00_00023.bin 1 +scene0230_00_00012.bin 1 +scene0233_00_00017.bin 1 t +scene0233_00_00019.bin 1 t +scene0233_00_00024.bin 1 t +scene0240_00_00009.bin 1 +scene0240_00_00011.bin 1 +scene0249_00_00014.bin 1 +scene0251_00_00012.bin 1 t +scene0251_00_00015.bin 1 t +scene0251_00_00016.bin 1 t +scene0251_00_00017.bin 1 t +scene0251_00_00018.bin 1 t +scene0255_00_00011.bin 1 +scene0260_00_00010.bin 1 +scene0263_00_00015.bin 1 +scene0264_00_00011.bin 1 +scene0265_00_00009.bin 1 +scene0267_00_00011.bin 1 +scene0267_00_00012.bin 1 +scene0274_00_00006.bin 1 +scene0289_00_00016.bin 1 +scene0329_00_00018.bin 1 +scene0340_00_00017.bin 1 +scene0347_00_00006.bin 1 t +scene0348_00_00011.bin 1 +scene0349_00_00008.bin 1 +scene0353_00_00016.bin 1 +scene0358_00_00014.bin 1 +scene0360_00_00002.bin 1 +scene0360_00_00005.bin 1 +scene0370_00_00012.bin 1 +scene0371_00_00008.bin 1 +scene0373_00_00006.bin 1 +scene0377_00_00005.bin 1 t +scene0377_00_00008.bin 1 t +scene0378_00_00015.bin 1 t +scene0383_00_00009.bin 1 +scene0394_00_00024.bin 1 +scene0398_00_00008.bin 1 +scene0400_00_00010.bin 1 +scene0402_00_00010.bin 1 +scene0403_00_00005.bin 1 +scene0405_00_00002.bin 1 +scene0405_00_00003.bin 1 +scene0405_00_00004.bin 1 +scene0405_00_00005.bin 1 +scene0405_00_00006.bin 1 +scene0405_00_00007.bin 1 +scene0405_00_00008.bin 1 +scene0405_00_00009.bin 1 +scene0406_00_00008.bin 1 +scene0415_00_00012.bin 1 +scene0422_00_00005.bin 1 +scene0431_00_00013.bin 1 +scene0434_00_00008.bin 1 +scene0436_00_00003.bin 1 +scene0436_00_00004.bin 1 +scene0436_00_00006.bin 1 +scene0445_00_00005.bin 1 +scene0445_00_00006.bin 1 +scene0456_00_00013.bin 1 +scene0464_00_00015.bin 1 +scene0469_00_00012.bin 1 +scene0470_00_00009.bin 1 +scene0476_00_00009.bin 1 +scene0486_00_00007.bin 1 t +scene0486_00_00008.bin 1 t +scene0487_00_00025.bin 1 t +scene0498_00_00008.bin 1 t +scene0508_00_00013.bin 1 +scene0510_00_00007.bin 1 +scene0510_00_00009.bin 1 +scene0511_00_00006.bin 1 +scene0517_00_00029.bin 1 +scene0519_00_00005.bin 1 +scene0523_00_00006.bin 1 +scene0528_00_00009.bin 1 +scene0530_00_00010.bin 1 +scene0544_00_00006.bin 1 +scene0552_00_00015.bin 1 t +scene0565_00_00013.bin 1 +scene0574_00_00007.bin 1 t +scene0575_00_00014.bin 1 +scene0579_00_00004.bin 1 +scene0579_00_00005.bin 1 +scene0585_00_00012.bin 1 +scene0585_00_00013.bin 1 +scene0585_00_00015.bin 1 +scene0586_00_00010.bin 1 +scene0593_00_00006.bin 1 +scene0600_00_00007.bin 1 +scene0610_00_00007.bin 1 t +scene0616_00_00014.bin 1 t +scene0644_00_00016.bin 1 +scene0030_00_00033.bin 2 +scene0030_00_00036.bin 2 +scene0030_00_00043.bin 2 +scene0030_00_00051.bin 2 +scene0030_00_00052.bin 2 +scene0054_00_00052.bin 2 +scene0077_00_00012.bin 2 +scene0098_00_00008.bin 2 +scene0104_00_00009.bin 2 t +scene0108_00_00015.bin 2 +scene0120_00_00007.bin 2 +scene0120_00_00008.bin 2 +scene0164_00_00013.bin 2 +scene0174_00_00009.bin 2 t +scene0206_00_00019.bin 2 +scene0256_00_00004.bin 2 +scene0256_00_00005.bin 2 +scene0263_00_00005.bin 2 t +scene0291_00_00026.bin 2 +scene0301_00_00016.bin 2 +scene0315_00_00010.bin 2 +scene0325_00_00013.bin 2 +scene0357_00_00016.bin 2 +scene0379_00_00021.bin 2 +scene0384_00_00009.bin 2 +scene0384_00_00017.bin 2 +scene0384_00_00018.bin 2 +scene0384_00_00023.bin 2 +scene0384_00_00025.bin 2 +scene0384_00_00039.bin 2 +scene0404_00_00008.bin 2 +scene0419_00_00013.bin 2 +scene0421_00_00009.bin 2 +scene0421_00_00011.bin 2 +scene0421_00_00013.bin 2 +scene0426_00_00008.bin 2 +scene0426_00_00013.bin 2 +scene0426_00_00020.bin 2 +scene0479_00_00017.bin 2 +scene0479_00_00019.bin 2 +scene0487_00_00023.bin 2 t +scene0565_00_00007.bin 2 +scene0565_00_00009.bin 2 +scene0592_00_00028.bin 2 +scene0636_00_00001.bin 2 +scene0646_00_00030.bin 2 +scene0000_00_00005.bin 10 +scene0006_00_00002.bin 10 t +scene0006_00_00003.bin 10 t +scene0032_00_00002.bin 10 +scene0035_00_00002.bin 10 +scene0039_00_00002.bin 10 t +scene0046_00_00003.bin 10 +scene0055_00_00006.bin 10 +scene0070_00_00005.bin 10 +scene0072_00_00005.bin 10 t +scene0073_00_00003.bin 10 +scene0078_00_00003.bin 10 +scene0085_00_00003.bin 10 +scene0085_00_00005.bin 10 +scene0092_00_00002.bin 10 +scene0101_00_00004.bin 10 +scene0107_00_00003.bin 10 +scene0127_00_00003.bin 10 +scene0127_00_00007.bin 10 +scene0127_00_00010.bin 10 +scene0137_00_00003.bin 10 +scene0137_00_00004.bin 10 +scene0143_00_00000.bin 10 +scene0144_00_00002.bin 10 +scene0147_00_00001.bin 10 t +scene0148_00_00003.bin 10 +scene0178_00_00003.bin 10 t +scene0178_00_00004.bin 10 t +scene0178_00_00018.bin 10 t +scene0184_00_00002.bin 10 +scene0193_00_00002.bin 10 +scene0207_00_00003.bin 10 +scene0209_00_00005.bin 10 +scene0209_00_00006.bin 10 +scene0217_00_00002.bin 10 +scene0217_00_00003.bin 10 +scene0219_00_00001.bin 10 +scene0221_00_00003.bin 10 +scene0221_00_00004.bin 10 +scene0222_00_00005.bin 10 +scene0222_00_00006.bin 10 +scene0223_00_00007.bin 10 +scene0233_00_00004.bin 10 +scene0233_00_00009.bin 10 +scene0235_00_00004.bin 10 +scene0236_00_00001.bin 10 +scene0246_00_00004.bin 10 t +scene0259_00_00003.bin 10 +scene0270_00_00003.bin 10 t +scene0270_00_00004.bin 10 t +scene0271_00_00003.bin 10 +scene0276_00_00003.bin 10 t +scene0277_00_00005.bin 10 t +scene0279_00_00004.bin 10 +scene0280_00_00008.bin 10 +scene0282_00_00004.bin 10 +scene0286_00_00003.bin 10 +scene0287_00_00002.bin 10 +scene0295_00_00002.bin 10 +scene0296_00_00002.bin 10 +scene0296_00_00004.bin 10 +scene0298_00_00002.bin 10 +scene0308_00_00003.bin 10 +scene0321_00_00002.bin 10 +scene0340_00_00004.bin 10 +scene0340_00_00005.bin 10 +scene0356_00_00003.bin 10 +scene0356_00_00009.bin 10 +scene0359_00_00003.bin 10 +scene0364_00_00003.bin 10 t +scene0376_00_00003.bin 10 +scene0389_00_00004.bin 10 +scene0392_00_00007.bin 10 t +scene0394_00_00003.bin 10 +scene0398_00_00002.bin 10 +scene0398_00_00003.bin 10 +scene0400_00_00004.bin 10 +scene0416_00_00004.bin 10 +scene0416_00_00005.bin 10 +scene0418_00_00002.bin 10 +scene0426_00_00002.bin 10 +scene0435_00_00003.bin 10 +scene0435_00_00004.bin 10 +scene0438_00_00001.bin 10 +scene0440_00_00003.bin 10 t +scene0440_00_00004.bin 10 t +scene0445_00_00002.bin 10 +scene0457_00_00002.bin 10 +scene0468_00_00005.bin 10 +scene0472_00_00003.bin 10 t +scene0477_00_00003.bin 10 +scene0477_00_00004.bin 10 +scene0506_00_00003.bin 10 +scene0515_00_00006.bin 10 +scene0521_00_00003.bin 10 +scene0541_00_00005.bin 10 t +scene0545_00_00002.bin 10 +scene0548_00_00004.bin 10 +scene0556_00_00003.bin 10 +scene0556_00_00004.bin 10 +scene0557_00_00002.bin 10 +scene0560_00_00002.bin 10 t +scene0567_00_00002.bin 10 t +scene0576_00_00003.bin 10 +scene0577_00_00004.bin 10 t +scene0580_00_00004.bin 10 +scene0589_00_00006.bin 10 +scene0590_00_00003.bin 10 +scene0600_00_00002.bin 10 t +scene0604_00_00003.bin 10 +scene0613_00_00001.bin 10 +scene0615_00_00003.bin 10 t +scene0620_00_00002.bin 10 +scene0640_00_00004.bin 10 +scene0642_00_00005.bin 10 +scene0645_00_00003.bin 10 +scene0645_00_00004.bin 10 +scene0000_00_00003.bin 13 +scene0001_00_00002.bin 13 +scene0001_00_00003.bin 13 +scene0001_00_00004.bin 13 +scene0002_00_00005.bin 13 t +scene0008_00_00003.bin 13 t +scene0008_00_00004.bin 13 t +scene0025_00_00005.bin 13 +scene0025_00_00006.bin 13 +scene0027_00_00002.bin 13 +scene0031_00_00005.bin 13 +scene0031_00_00007.bin 13 +scene0031_00_00008.bin 13 +scene0031_00_00009.bin 13 +scene0031_00_00011.bin 13 +scene0031_00_00012.bin 13 +scene0031_00_00014.bin 13 +scene0036_00_00002.bin 13 +scene0036_00_00003.bin 13 +scene0040_00_00007.bin 13 +scene0049_00_00003.bin 13 +scene0050_00_00003.bin 13 +scene0053_00_00001.bin 13 +scene0053_00_00003.bin 13 +scene0054_00_00004.bin 13 t +scene0059_00_00005.bin 13 +scene0061_00_00001.bin 13 +scene0064_00_00005.bin 13 +scene0087_00_00003.bin 13 +scene0087_00_00006.bin 13 +scene0091_00_00002.bin 13 +scene0106_00_00003.bin 13 t +scene0106_00_00004.bin 13 t +scene0113_00_00002.bin 13 +scene0113_00_00003.bin 13 +scene0113_00_00004.bin 13 +scene0125_00_00003.bin 13 +scene0128_00_00001.bin 13 t +scene0137_00_00005.bin 13 +scene0144_00_00005.bin 13 t +scene0145_00_00003.bin 13 +scene0151_00_00003.bin 13 +scene0160_00_00001.bin 13 +scene0160_00_00004.bin 13 +scene0160_00_00005.bin 13 +scene0162_00_00003.bin 13 t +scene0166_00_00006.bin 13 +scene0167_00_00003.bin 13 +scene0167_00_00004.bin 13 +scene0177_00_00006.bin 13 t +scene0181_00_00005.bin 13 t +scene0187_00_00006.bin 13 +scene0187_00_00011.bin 13 +scene0194_00_00001.bin 13 +scene0199_00_00002.bin 13 +scene0203_00_00006.bin 13 +scene0207_00_00006.bin 13 +scene0209_00_00009.bin 13 +scene0213_00_00004.bin 13 +scene0213_00_00005.bin 13 +scene0213_00_00008.bin 13 +scene0213_00_00012.bin 13 +scene0218_00_00003.bin 13 +scene0218_00_00004.bin 13 +scene0224_00_00003.bin 13 +scene0226_00_00003.bin 13 +scene0226_00_00004.bin 13 +scene0226_00_00005.bin 13 +scene0226_00_00006.bin 13 +scene0231_00_00011.bin 13 t +scene0231_00_00014.bin 13 t +scene0235_00_00008.bin 13 +scene0239_00_00004.bin 13 +scene0247_00_00003.bin 13 +scene0247_00_00004.bin 13 +scene0247_00_00015.bin 13 +scene0269_00_00001.bin 13 +scene0269_00_00002.bin 13 +scene0273_00_00006.bin 13 t +scene0276_00_00004.bin 13 +scene0279_00_00006.bin 13 t +scene0281_00_00003.bin 13 +scene0281_00_00004.bin 13 +scene0288_00_00005.bin 13 +scene0294_00_00002.bin 13 +scene0294_00_00003.bin 13 +scene0297_00_00003.bin 13 t +scene0297_00_00004.bin 13 t +scene0301_00_00002.bin 13 t +scene0309_00_00019.bin 13 t +scene0312_00_00002.bin 13 +scene0312_00_00003.bin 13 +scene0312_00_00004.bin 13 +scene0315_00_00003.bin 13 +scene0315_00_00005.bin 13 +scene0316_00_00005.bin 13 +scene0317_00_00005.bin 13 +scene0319_00_00003.bin 13 +scene0319_00_00004.bin 13 +scene0319_00_00005.bin 13 +scene0326_00_00001.bin 13 +scene0327_00_00005.bin 13 +scene0327_00_00015.bin 3 +scene0329_00_00003.bin 13 +scene0329_00_00004.bin 13 +scene0334_00_00002.bin 13 +scene0334_00_00003.bin 13 +scene0339_00_00003.bin 13 +scene0339_00_00005.bin 13 +scene0339_00_00006.bin 13 +scene0339_00_00007.bin 13 +scene0341_00_00002.bin 13 +scene0352_00_00003.bin 13 +scene0353_00_00005.bin 13 +scene0362_00_00004.bin 13 t +scene0363_00_00004.bin 13 +scene0363_00_00006.bin 13 +scene0363_00_00007.bin 13 +scene0363_00_00008.bin 13 +scene0363_00_00009.bin 13 +scene0363_00_00010.bin 13 +scene0367_00_00004.bin 13 +scene0367_00_00006.bin 13 +scene0368_00_00006.bin 13 +scene0368_00_00009.bin 13 +scene0368_00_00010.bin 13 +scene0368_00_00034.bin 13 +scene0374_00_00002.bin 13 +scene0381_00_00002.bin 13 +scene0385_00_00004.bin 13 t +scene0386_00_00003.bin 13 +scene0386_00_00005.bin 13 +scene0392_00_00008.bin 13 +scene0394_00_00012.bin 13 +scene0395_00_00005.bin 13 +scene0407_00_00002.bin 13 +scene0424_00_00006.bin 13 +scene0450_00_00006.bin 13 t +scene0451_00_00005.bin 13 t +scene0461_00_00002.bin 13 t +scene0461_00_00003.bin 13 t +scene0467_00_00002.bin 13 +scene0474_00_00004.bin 13 +scene0480_00_00002.bin 13 +scene0484_00_00002.bin 13 +scene0484_00_00003.bin 13 +scene0487_00_00008.bin 13 +scene0487_00_00012.bin 13 +scene0499_00_00008.bin 13 +scene0499_00_00009.bin 13 +scene0503_00_00002.bin 13 +scene0504_00_00004.bin 13 +scene0504_00_00017.bin 13 +scene0505_00_00008.bin 13 +scene0514_00_00004.bin 13 +scene0515_00_00009.bin 13 +scene0517_00_00006.bin 13 +scene0520_00_00001.bin 13 +scene0520_00_00003.bin 13 +scene0520_00_00005.bin 13 +scene0529_00_00004.bin 13 +scene0533_00_00002.bin 13 t +scene0533_00_00005.bin 13 t +scene0536_00_00002.bin 13 +scene0537_00_00003.bin 13 +scene0549_00_00002.bin 13 +scene0549_00_00004.bin 13 +scene0559_00_00002.bin 13 +scene0568_00_00003.bin 13 +scene0587_00_00002.bin 13 t +scene0588_00_00004.bin 13 +scene0588_00_00006.bin 13 +scene0588_00_00007.bin 13 +scene0588_00_00008.bin 13 +scene0588_00_00009.bin 13 +scene0588_00_00010.bin 13 +scene0588_00_00011.bin 13 +scene0588_00_00012.bin 13 +scene0588_00_00013.bin 13 +scene0588_00_00014.bin 13 +scene0590_00_00006.bin 13 +scene0593_00_00005.bin 13 +scene0601_00_00008.bin 13 +scene0601_00_00012.bin 13 +scene0603_00_00004.bin 13 +scene0603_00_00005.bin 13 +scene0604_00_00004.bin 13 +scene0623_00_00003.bin 13 t +scene0626_00_00002.bin 13 +scene0641_00_00003.bin 13 +scene0641_00_00005.bin 13 +scene0641_00_00006.bin 13 +scene0645_00_00005.bin 13 t +scene0000_00_00035.bin 12 +scene0003_00_00013.bin 12 t +scene0009_00_00009.bin 12 +scene0009_00_00011.bin 12 +scene0009_00_00012.bin 12 +scene0009_00_00013.bin 12 +scene0009_00_00014.bin 12 +scene0009_00_00017.bin 12 +scene0014_00_00009.bin 12 +scene0014_00_00010.bin 12 +scene0026_00_00017.bin 12 +scene0026_00_00020.bin 12 +scene0034_00_00011.bin 12 +scene0042_00_00006.bin 12 +scene0051_00_00011.bin 12 t +scene0054_00_00028.bin 12 +scene0065_00_00006.bin 12 t +scene0067_00_00006.bin 12 +scene0068_00_00006.bin 12 +scene0083_00_00004.bin 12 +scene0084_00_00004.bin 12 +scene0086_00_00010.bin 12 +scene0086_00_00011.bin 12 +scene0096_00_00016.bin 12 +scene0100_00_00008.bin 12 +scene0101_00_00011.bin 12 +scene0116_00_00004.bin 12 +scene0119_00_00005.bin 12 +scene0146_00_00003.bin 12 +scene0170_00_00006.bin 12 +scene0195_00_00015.bin 12 t +scene0197_00_00009.bin 12 +scene0207_00_00014.bin 12 +scene0207_00_00017.bin 12 +scene0214_00_00005.bin 12 +scene0232_00_00010.bin 12 +scene0237_00_00003.bin 12 t +scene0246_00_00016.bin 12 +scene0247_00_00025.bin 12 +scene0260_00_00008.bin 12 +scene0261_00_00005.bin 12 +scene0265_00_00011.bin 12 +scene0268_00_00004.bin 12 +scene0276_00_00016.bin 12 +scene0307_00_00008.bin 12 +scene0348_00_00008.bin 12 t +scene0349_00_00003.bin 12 +scene0349_00_00006.bin 12 +scene0350_00_00009.bin 12 +scene0366_00_00008.bin 12 +scene0366_00_00009.bin 12 +scene0375_00_00008.bin 12 +scene0394_00_00016.bin 12 +scene0394_00_00023.bin 12 +scene0396_00_00008.bin 12 +scene0399_00_00002.bin 12 +scene0406_00_00006.bin 12 +scene0415_00_00003.bin 12 +scene0429_00_00006.bin 12 +scene0434_00_00010.bin 12 +scene0435_00_00011.bin 12 +scene0439_00_00014.bin 12 +scene0441_00_00010.bin 12 t +scene0446_00_00005.bin 12 +scene0447_00_00005.bin 12 +scene0448_00_00008.bin 12 t +scene0449_00_00012.bin 12 +scene0458_00_00012.bin 12 +scene0460_00_00002.bin 12 +scene0486_00_00009.bin 12 t +scene0501_00_00007.bin 12 t +scene0516_00_00019.bin 12 +scene0517_00_00024.bin 12 +scene0519_00_00006.bin 12 t +scene0521_00_00011.bin 12 +scene0523_00_00004.bin 12 t +scene0527_00_00005.bin 12 +scene0527_00_00006.bin 12 +scene0538_00_00005.bin 12 +scene0542_00_00010.bin 12 +scene0546_00_00008.bin 12 t +scene0547_00_00017.bin 12 +scene0553_00_00003.bin 12 +scene0564_00_00005.bin 12 +scene0564_00_00006.bin 12 +scene0574_00_00004.bin 12 +scene0574_00_00009.bin 12 +scene0579_00_00006.bin 12 t +scene0579_00_00007.bin 12 t +scene0579_00_00008.bin 12 t +scene0579_00_00009.bin 12 t +scene0581_00_00010.bin 12 t +scene0583_00_00006.bin 12 +scene0586_00_00013.bin 12 +scene0602_00_00002.bin 12 +scene0612_00_00007.bin 12 +scene0631_00_00008.bin 12 +scene0631_00_00009.bin 12 +scene0639_00_00002.bin 12 +scene0639_00_00008.bin 12 +scene0642_00_00010.bin 12 +scene0642_00_00028.bin 12 +scene0645_00_00014.bin 12 +scene0000_00_00036.bin 11 +scene0002_00_00027.bin 11 t +scene0002_00_00028.bin 11 t +scene0002_00_00034.bin 11 t +scene0002_00_00039.bin 11 t +scene0016_00_00009.bin 11 +scene0016_00_00012.bin 11 +scene0021_00_00006.bin 11 +scene0025_00_00017.bin 11 t +scene0049_00_00010.bin 11 +scene0049_00_00013.bin 11 +scene0049_00_00014.bin 11 +scene0070_00_00012.bin 11 +scene0072_00_00011.bin 11 +scene0074_00_00004.bin 11 +scene0137_00_00011.bin 11 +scene0147_00_00017.bin 11 +scene0147_00_00022.bin 11 +scene0147_00_00023.bin 11 +scene0177_00_00011.bin 11 +scene0182_00_00007.bin 11 +scene0194_00_00011.bin 11 +scene0209_00_00017.bin 11 +scene0209_00_00018.bin 11 +scene0209_00_00019.bin 11 +scene0209_00_00020.bin 11 +scene0219_00_00003.bin 11 +scene0222_00_00016.bin 11 t +scene0222_00_00017.bin 11 t +scene0224_00_00009.bin 11 t +scene0235_00_00012.bin 11 +scene0270_00_00013.bin 11 +scene0270_00_00016.bin 11 +scene0270_00_00017.bin 11 +scene0270_00_00018.bin 11 +scene0270_00_00019.bin 11 +scene0271_00_00019.bin 11 +scene0296_00_00013.bin 11 t +scene0296_00_00015.bin 11 t +scene0296_00_00026.bin 11 t +scene0308_00_00009.bin 11 +scene0317_00_00016.bin 11 +scene0319_00_00007.bin 11 +scene0319_00_00009.bin 11 +scene0326_00_00006.bin 11 t +scene0331_00_00010.bin 11 +scene0338_00_00006.bin 2 +scene0340_00_00012.bin 11 +scene0340_00_00015.bin 11 +scene0340_00_00016.bin 11 +scene0362_00_00010.bin 11 +scene0385_00_00014.bin 11 +scene0385_00_00015.bin 11 +scene0394_00_00019.bin 11 t +scene0394_00_00022.bin 11 t +scene0394_00_00027.bin 11 t +scene0397_00_00006.bin 11 +scene0407_00_00009.bin 11 +scene0425_00_00012.bin 11 +scene0438_00_00009.bin 11 +scene0467_00_00015.bin 11 +scene0477_00_00012.bin 11 +scene0477_00_00016.bin 11 +scene0480_00_00008.bin 11 +scene0507_00_00003.bin 11 +scene0507_00_00004.bin 11 +scene0507_00_00006.bin 11 +scene0518_00_00012.bin 11 t +scene0536_00_00006.bin 11 t +scene0548_00_00010.bin 11 +scene0554_00_00017.bin 11 t +scene0567_00_00008.bin 11 +scene0577_00_00016.bin 11 +scene0589_00_00007.bin 11 +scene0590_00_00007.bin 11 +scene0591_00_00013.bin 11 +scene0615_00_00016.bin 11 +scene0642_00_00014.bin 11 +scene0642_00_00015.bin 11 +scene0645_00_00022.bin 11 +scene0000_00_00031.bin 14 +scene0014_00_00006.bin 14 +scene0026_00_00011.bin 14 +scene0026_00_00012.bin 14 +scene0029_00_00005.bin 14 +scene0034_00_00008.bin 14 +scene0042_00_00007.bin 14 +scene0051_00_00012.bin 14 t +scene0054_00_00035.bin 14 +scene0062_00_00006.bin 14 +scene0065_00_00008.bin 14 t +scene0067_00_00004.bin 14 +scene0083_00_00003.bin 14 +scene0084_00_00005.bin 14 t +scene0086_00_00008.bin 14 +scene0086_00_00014.bin 14 +scene0100_00_00006.bin 14 +scene0101_00_00014.bin 14 +scene0112_00_00002.bin 14 +scene0116_00_00005.bin 14 +scene0119_00_00009.bin 14 +scene0135_00_00005.bin 14 +scene0146_00_00002.bin 14 +scene0153_00_00006.bin 14 +scene0175_00_00010.bin 14 +scene0195_00_00007.bin 14 +scene0207_00_00011.bin 14 t +scene0214_00_00010.bin 14 +scene0232_00_00008.bin 14 +scene0246_00_00014.bin 14 +scene0250_00_00008.bin 14 +scene0254_00_00008.bin 14 +scene0254_00_00010.bin 14 +scene0260_00_00006.bin 14 +scene0261_00_00012.bin 14 +scene0265_00_00004.bin 14 t +scene0276_00_00014.bin 14 t +scene0365_00_00005.bin 14 +scene0366_00_00005.bin 14 +scene0396_00_00007.bin 14 +scene0399_00_00003.bin 14 +scene0406_00_00005.bin 14 +scene0410_00_00004.bin 14 +scene0429_00_00008.bin 14 +scene0434_00_00007.bin 14 t +scene0435_00_00012.bin 14 +scene0446_00_00007.bin 14 +scene0447_00_00006.bin 14 t +scene0448_00_00007.bin 14 +scene0449_00_00005.bin 14 +scene0458_00_00007.bin 14 +scene0471_00_00005.bin 14 +scene0492_00_00013.bin 14 +scene0501_00_00009.bin 14 +scene0510_00_00004.bin 14 +scene0510_00_00008.bin 14 +scene0515_00_00018.bin 14 +scene0516_00_00020.bin 14 +scene0521_00_00014.bin 14 t +scene0523_00_00003.bin 14 +scene0538_00_00006.bin 14 +scene0539_00_00007.bin 14 +scene0546_00_00009.bin 14 +scene0550_00_00009.bin 14 +scene0553_00_00004.bin 14 t +scene0564_00_00004.bin 14 +scene0570_00_00006.bin 14 +scene0571_00_00006.bin 14 +scene0581_00_00009.bin 14 +scene0583_00_00008.bin 14 +scene0602_00_00003.bin 14 +scene0610_00_00005.bin 14 t +scene0612_00_00003.bin 14 +scene0625_00_00005.bin 14 t +scene0631_00_00005.bin 14 t +scene0639_00_00006.bin 14 t +scene0642_00_00012.bin 14 +scene0645_00_00015.bin 14 t diff --git a/zoo/SimpleView/all_utils.py b/zoo/SimpleView/all_utils.py new file mode 100644 index 0000000..805beae --- /dev/null +++ b/zoo/SimpleView/all_utils.py @@ -0,0 +1,342 @@ +import tensorboardX +import pdb +import sys +from collections import MutableMapping, Hashable +import csv +import os +import torch +import torch.nn.functional as F +import numpy as np +from progressbar import ProgressBar +import sys + + +# Additional information that might be necessary to get the model +DATASET_NUM_CLASS = { + 'modelnet40': 40, + 'modelnet40_rscnn': 40, + 'modelnet40_pn2': 40, + 'modelnet40_dgcnn': 40, + 'modelnet_c': 40, +} + +class TensorboardManager: + def __init__(self, path): + self.writer = tensorboardX.SummaryWriter(path) + + def update(self, split, step, vals): + for k, v in vals.items(): + self.writer.add_scalar('%s_%s' % (split, k), v, step) + + def close(self): + self.writer.flush() + self.writer.close() + + +class TrackTrain: + def __init__(self, early_stop_patience): + self.early_stop_patience = early_stop_patience + self.counter = -1 + self.best_epoch_val = -1 + self.best_epoch_train = -1 + self.best_epoch_test = -1 + self.best_val = float("-inf") + self.best_test = float("-inf") + self.best_train = float("-inf") + self.test_best_val = float("-inf") + + def record_epoch(self, epoch_id, train_metric, val_metric, test_metric): + assert epoch_id == (self.counter + 1) + self.counter += 1 + + if val_metric >= self.best_val: + self.best_val = val_metric + self.best_epoch_val = epoch_id + self.test_best_val = test_metric + + if test_metric >= self.best_test: + self.best_test = test_metric + self.best_epoch_test = epoch_id + + if train_metric >= self.best_train: + self.best_train = train_metric + self.best_epoch_train = epoch_id + + + def save_model(self, epoch_id, split): + """ + Whether to save the current model or not + :param epoch_id: + :param split: + :return: + """ + assert epoch_id == self.counter + if split == 'val': + if self.best_epoch_val == epoch_id: + _save_model = True + else: + _save_model = False + elif split == 'test': + if self.best_epoch_test == epoch_id: + _save_model = True + else: + _save_model = False + elif split == 'train': + if self.best_epoch_train == epoch_id: + _save_model = True + else: + _save_model = False + else: + assert False + + return _save_model + + def early_stop(self, epoch_id): + assert epoch_id == self.counter + if (epoch_id - self.best_epoch_val) > self.early_stop_patience: + return True + else: + return False + + +class PerfTrackVal: + """ + Records epoch wise performance for validation + """ + def __init__(self, task, extra_param=None): + self.task = task + if task in ['cls', 'cls_trans']: + assert extra_param is None + self.all = [] + self.class_seen = None + self.class_corr = None + else: + assert False + def update(self, data_batch, out): + if self.task in ['cls', 'cls_trans']: + correct = self.get_correct_list(out['logit'], data_batch['label']) + self.all.extend(correct) + self.update_class_see_corr(out['logit'], data_batch['label']) + else: + assert False + def agg(self): + if self.task in ['cls', 'cls_trans']: + perf = { + 'acc': self.get_avg_list(self.all), + 'class_acc': np.mean(np.array(self.class_corr) / np.array(self.class_seen,dtype=np.float)) + } + else: + assert False + return perf + + def update_class_see_corr(self, logit, label): + if self.class_seen is None: + num_class = logit.shape[1] + self.class_seen = [0] * num_class + self.class_corr = [0] * num_class + + pred_label = logit.argmax(axis=1).to('cpu').tolist() + for _pred_label, _label in zip(pred_label, label): + self.class_seen[_label] += 1 + if _pred_label == _label: + self.class_corr[_pred_label] += 1 + + @staticmethod + def get_correct_list(logit, label): + label = label.to(logit.device) + pred_class = logit.argmax(axis=1) + return (label == pred_class).to('cpu').tolist() + @staticmethod + def get_avg_list(all_list): + for x in all_list: + assert isinstance(x, bool) + return sum(all_list) / len(all_list) + + +class PerfTrackTrain(PerfTrackVal): + """ + Records epoch wise performance during training + """ + def __init__(self, task, extra_param=None): + super().__init__(task, extra_param) + # add a list to track loss + self.all_loss = [] + + def update_loss(self, loss): + self.all_loss.append(loss.item()) + + def agg_loss(self): + # print(self.all_loss) + return sum(self.all_loss) / len(self.all_loss) + + def update_all(self, data_batch, out, loss): + self.update(data_batch, out) + self.update_loss(loss) + + +# source: https://github.com/WangYueFt/dgcnn/blob/master/pytorch/util.py +def smooth_loss(pred, gold): + eps = 0.2 + + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + + return loss + + +def rscnn_voting_evaluate_cls(loader, model, data_batch_to_points_target, + points_to_inp, out_to_prob, log_file): + """ + :param loader: + :param model: + :param data_batch_to_points_target: + :param points_to_inp: transform the points to input for the particular model + that is evaluated + :param out_to_prob: + :return: + """ + import rs_cnn.data.data_utils as d_utils + import pointnet2.utils.pointnet2_utils as pointnet2_utils + import numpy as np + + terminal = sys.stdout + log = open(log_file, "w") + + NUM_REPEAT = 300 + NUM_VOTE = 10 + PointcloudScale = d_utils.PointcloudScale() # initialize random scaling + + def data_aug(vote_id, pc): + # furthest point sampling + # (B, npoint) + fps_idx = pointnet2_utils.furthest_point_sample(points, 1200) + new_fps_idx = fps_idx[:, np.random.choice(1200, num_points, False)] + new_points = pointnet2_utils.gather_operation(points.transpose(1, 2).contiguous(), new_fps_idx).transpose(1, 2).contiguous() + if vote_id > 0: + pc_out = PointcloudScale(new_points) + else: + pc_out = pc + return pc_out + print(f"RSCNN EVALUATE, NUM_REPEAT {NUM_REPEAT}, NUM_VOTE {NUM_VOTE}") + + num_points = loader.dataset.num_points + print(f"Number of points {num_points}") + + # evaluate + sys.stdout.flush() + PointcloudScale = d_utils.PointcloudScale() # initialize random scaling + model.eval() + global_acc = 0 + with torch.no_grad(): + for i in range(NUM_REPEAT): + preds = [] + labels = [] + for j, data in enumerate(loader, 0): + points, target = data_batch_to_points_target(data) + points, target = points.cuda(), target.cuda() + pred = 0 + for v in range(NUM_VOTE): + new_points = data_aug(v, points) + inp = points_to_inp(new_points) + out = model(**inp) + prob = out_to_prob(out) + pred += prob + # pred += F.softmax(model(**inp), dim = 1) + + pred /= NUM_VOTE + target = target.view(-1) + _, pred_choice = torch.max(pred.data, -1) + + preds.append(pred_choice) + labels.append(target.data) + + preds = torch.cat(preds, 0) + labels = torch.cat(labels, 0) + acc = (preds == labels).sum().float() / labels.numel() + if acc > global_acc: + global_acc = acc + message1 = 'Repeat %3d \t Acc: %0.6f' % (i + 1, acc) + message2 = '\nBest voting till now, acc: %0.6f' % (global_acc) + message = f'{message1} \n {message2}' + terminal.write(message) + log.write(message) + + message = '\nBest voting acc: %0.6f' % (global_acc) + terminal.write(message) + log.write(message) + + return global_acc + + +# https://github.com/charlesq34/pointnet2/blob/master/evaluate.py +# https://github.com/charlesq34/pointnet2/issues/8 +# we try to keep the variables names similar to the original implementation +def pn2_vote_evaluate_cls(dataloader, model, log_file, num_votes=[12]): + from pointnet2_tf.utils import provider + model.eval() + + terminal = sys.stdout + log = open(log_file, "w") + + if isinstance(num_votes, list): + pass + else: + num_votes = [num_votes] + + for _num_votes in num_votes: + print(f"num_votes: {_num_votes}") + + NUM_CLASSES = DATASET_NUM_CLASS[dataloader.dataset.dataset_name] + SHAPE_NAMES = [line.rstrip() for line in + open('./data/modelnet40_ply_hdf5_2048/shape_names.txt')] + + total_correct = 0 + total_seen = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + with torch.no_grad(): + for _batch_data in dataloader: + # based on https://github.com/charlesq34/pointnet2/blob/master/evaluate.py#L125-L150 + batch_data, batch_label = np.array(_batch_data['pc'].cpu()), np.array(_batch_data['label'].cpu()) + bsize = batch_data.shape[0] + BATCH_SIZE = batch_data.shape[0] + NUM_POINT = batch_data.shape[1] + + batch_pred_sum = np.zeros((BATCH_SIZE, NUM_CLASSES)) # score for classes + for vote_idx in range(_num_votes): + # Shuffle point order to achieve different farthest samplings + shuffled_indices = np.arange(NUM_POINT) + np.random.shuffle(shuffled_indices) + rotated_data = provider.rotate_point_cloud_by_angle( + batch_data[:, shuffled_indices, :], vote_idx/float(_num_votes) * np.pi * 2) + + inp = {'pc': torch.tensor(rotated_data)} + out = model(**inp) + pred_val = np.array(out['logit'].cpu()) + batch_pred_sum += pred_val + + pred_val = np.argmax(batch_pred_sum, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + + for i in range(bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + message = "" + for i, name in enumerate(SHAPE_NAMES): + message += f"\n {'%10s: %0.3f' % (name, class_accuracies[i])}" + message += f"\n {'eval accuracy: %f'% (total_correct / float(total_seen))}" + message += f"\n {'eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))}" + terminal.write(message) + log.write(message) diff --git a/zoo/SimpleView/configs.py b/zoo/SimpleView/configs.py new file mode 100644 index 0000000..5c0eeeb --- /dev/null +++ b/zoo/SimpleView/configs.py @@ -0,0 +1,96 @@ +from yacs.config import CfgNode as CN + +_C = CN() +# ----------------------------------------------------------------------------- +# EXPERIMENT +# ----------------------------------------------------------------------------- +_C.EXP = CN() +_C.EXP.EXP_ID = "" +_C.EXP.SEED = 0 +_C.EXP.TASK = 'cls' +_C.EXP.DATASET = 'modelnet40' +_C.EXP.MODEL_NAME = 'mv' +_C.EXP.LOSS_NAME = 'cross_entropy' +_C.EXP.OPTIMIZER = 'vanilla' +_C.EXP.METRIC = 'acc' +#------------------------------------------------------------------------------ +# Extra Experiment Parameters +#------------------------------------------------------------------------------ +_C.EXP_EXTRA = CN() +_C.EXP_EXTRA.no_val = True +_C.EXP_EXTRA.no_test = False +_C.EXP_EXTRA.val_eval_freq = 1 +_C.EXP_EXTRA.test_eval_freq = 1 +_C.EXP_EXTRA.save_ckp = 25 +# ----------------------------------------------------------------------------- +# DATALOADER (contains things common across the datasets) +# ----------------------------------------------------------------------------- +_C.DATALOADER = CN() +_C.DATALOADER.batch_size = 60 +_C.DATALOADER.num_workers = 0 +# ----------------------------------------------------------------------------- +# TRAINING DETAILS (contains things common across the training) +# ----------------------------------------------------------------------------- +_C.TRAIN = CN() +_C.TRAIN.num_epochs = 1000 +_C.TRAIN.learning_rate = 1e-3 +_C.TRAIN.lr_decay_factor = 0.5 +_C.TRAIN.lr_reduce_patience = 10 +_C.TRAIN.l2 = 0.0 +_C.TRAIN.early_stop = 1000 +_C.TRAIN.lr_clip = 0.00001 +#----------------------------------------------------------------------------- +# MODELNET40_RSCNN +#----------------------------------------------------------------------------- +_C.DATALOADER.MODELNET40_RSCNN = CN() +_C.DATALOADER.MODELNET40_RSCNN.data_path = './data/' +_C.DATALOADER.MODELNET40_RSCNN.train_data_path = 'train_files.txt' +_C.DATALOADER.MODELNET40_RSCNN.valid_data_path = 'train_files.txt' +_C.DATALOADER.MODELNET40_RSCNN.test_data_path = 'test_files.txt' +_C.DATALOADER.MODELNET40_RSCNN.num_points = 1024 +#----------------------------------------------------------------------------- +# MODELNET40_PN2 +#----------------------------------------------------------------------------- +_C.DATALOADER.MODELNET40_PN2 = CN() +_C.DATALOADER.MODELNET40_PN2.train_data_path = './data/modelnet40_ply_hdf5_2048/train_files.txt' +_C.DATALOADER.MODELNET40_PN2.valid_data_path = './data/modelnet40_ply_hdf5_2048/train_files.txt' +_C.DATALOADER.MODELNET40_PN2.test_data_path = './data/modelnet40_ply_hdf5_2048/test_files.txt' +_C.DATALOADER.MODELNET40_PN2.num_points = 1024 +#----------------------------------------------------------------------------- +# MODELNET40_DGCNN +#----------------------------------------------------------------------------- +_C.DATALOADER.MODELNET40_DGCNN = CN() +_C.DATALOADER.MODELNET40_DGCNN.train_data_path = './data/modelnet40_ply_hdf5_2048/train_files.txt' +_C.DATALOADER.MODELNET40_DGCNN.valid_data_path = './data/modelnet40_ply_hdf5_2048/train_files.txt' +_C.DATALOADER.MODELNET40_DGCNN.test_data_path = './data/modelnet40_ply_hdf5_2048/test_files.txt' +_C.DATALOADER.MODELNET40_DGCNN.num_points = 1024 +#----------------------------------------------------------------------------- +# MODELNET-C +#----------------------------------------------------------------------------- +_C.DATALOADER.MODELNET_C = CN() +# ---------------------------------------------------------------------------- +# MODEL +# ----------------------------------------------------------------------------- +_C.MODEL = CN() +# ----------------------------------------------------------------------------- +# MV MODEL +# ----------------------------------------------------------------------------- +_C.MODEL.MV = CN() +_C.MODEL.MV.backbone = 'resnet18' +_C.MODEL.MV.feat_size = 16 +# ----------------------------------------------------------------------------- +# RSCNN MODEL +# ----------------------------------------------------------------------------- +_C.MODEL.RSCNN = CN() +_C.MODEL.RSCNN.ssn_or_msn = True +# ----------------------------------------------------------------------------- +# PN2 MODEL +# ----------------------------------------------------------------------------- +_C.MODEL.PN2 = CN() +_C.MODEL.PN2.version_cls = 1.0 + +def get_cfg_defaults(): + """Get a yacs CfgNode object with default values for my_project.""" + # Return a clone so that the defaults will not be altered + # This is for the "local variable" use pattern + return _C.clone() diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_0.25_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_0.25_run_1.yaml new file mode 100644 index 0000000..39b70f3 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_0.25_run_1.yaml @@ -0,0 +1,15 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_0.25_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_0.25_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_0.25_valid_run_1.yaml new file mode 100644 index 0000000..bc0a99d --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_0.25_valid_run_1.yaml @@ -0,0 +1,20 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_0.25_valid_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_0.5_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_0.5_run_1.yaml new file mode 100644 index 0000000..1d28630 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_0.5_run_1.yaml @@ -0,0 +1,15 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_0.5_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_0.5_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_0.5_valid_run_1.yaml new file mode 100644 index 0000000..ce91f3e --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_0.5_valid_run_1.yaml @@ -0,0 +1,20 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_0.5_valid_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_ce_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_ce_run_1.yaml new file mode 100644 index 0000000..dafb70d --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_ce_run_1.yaml @@ -0,0 +1,13 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_ce_run_1 + LOSS_NAME: cross_entropy + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_ce_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_ce_valid_run_1.yaml new file mode 100644 index 0000000..71b0ce5 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_ce_valid_run_1.yaml @@ -0,0 +1,20 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_ce_valid_run_1 + LOSS_NAME: cross_entropy + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_run_1.yaml new file mode 100644 index 0000000..fd2cc4f --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_run_1.yaml @@ -0,0 +1,13 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/dgcnn_dgcnn_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_dgcnn_valid_run_1.yaml new file mode 100644 index 0000000..22f2349 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_dgcnn_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_dgcnn_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0001 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_0.25_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_0.25_run_1.yaml new file mode 100644 index 0000000..f4071b4 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_0.25_run_1.yaml @@ -0,0 +1,15 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_0.25_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_0.25_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_0.25_valid_run_1.yaml new file mode 100644 index 0000000..eb0f565 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_0.25_valid_run_1.yaml @@ -0,0 +1,20 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_0.25_valid_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_0.5_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_0.5_run_1.yaml new file mode 100644 index 0000000..ebc0285 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_0.5_run_1.yaml @@ -0,0 +1,15 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_0.5_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_0.5_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_0.5_valid_run_1.yaml new file mode 100644 index 0000000..bef95f0 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_0.5_valid_run_1.yaml @@ -0,0 +1,20 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_0.5_valid_run_1 + LOSS_NAME: smooth + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_ce_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_ce_run_1.yaml new file mode 100644 index 0000000..2fd082f --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_ce_run_1.yaml @@ -0,0 +1,13 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_ce_run_1 + LOSS_NAME: cross_entropy + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_ce_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_ce_valid_run_1.yaml new file mode 100644 index 0000000..9488378 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_ce_valid_run_1.yaml @@ -0,0 +1,20 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_ce_valid_run_1 + LOSS_NAME: cross_entropy + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_run_1.yaml new file mode 100644 index 0000000..f6f7e36 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet2_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet2_valid_run_1.yaml new file mode 100644 index 0000000..fab35e5 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet2_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet2_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_0.25_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_0.25_run_1.yaml new file mode 100644 index 0000000..5430b19 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_0.25_run_1.yaml @@ -0,0 +1,14 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_0.25_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_0.25_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_0.25_valid_run_1.yaml new file mode 100644 index 0000000..caf450b --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_0.25_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_0.25_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_0.5_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_0.5_run_1.yaml new file mode 100644 index 0000000..8f2410e --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_0.5_run_1.yaml @@ -0,0 +1,14 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_0.5_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_0.5_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_0.5_valid_run_1.yaml new file mode 100644 index 0000000..69feb43 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_0.5_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_0.5_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_ce_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_ce_run_1.yaml new file mode 100644 index 0000000..bfdfc85 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_ce_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_ce_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_ce_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_ce_valid_run_1.yaml new file mode 100644 index 0000000..c2ae197 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_ce_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_ce_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_run_1.yaml new file mode 100644 index 0000000..de7e9f9 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_pointnet_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_pointnet_valid_run_1.yaml new file mode 100644 index 0000000..f498f3c --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_pointnet_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_pointnet_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_0.25_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_0.25_run_1.yaml new file mode 100644 index 0000000..f1005f7 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_0.25_run_1.yaml @@ -0,0 +1,14 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_0.25_run_1 + LOSS_NAME: smooth + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_0.25_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_0.25_valid_run_1.yaml new file mode 100644 index 0000000..cfce9c9 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_0.25_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_0.25_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_0.5_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_0.5_run_1.yaml new file mode 100644 index 0000000..4812f38 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_0.5_run_1.yaml @@ -0,0 +1,14 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_0.5_run_1 + LOSS_NAME: smooth + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_0.5_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_0.5_valid_run_1.yaml new file mode 100644 index 0000000..4c5cb7a --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_0.5_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_0.5_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_ce_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_ce_run_1.yaml new file mode 100644 index 0000000..8f76a89 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_ce_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_ce_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_ce_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_ce_valid_run_1.yaml new file mode 100644 index 0000000..d8c8d00 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_ce_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_ce_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_run_1.yaml new file mode 100644 index 0000000..f152d1b --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_run_1 + LOSS_NAME: smooth + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_rscnn_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_rscnn_valid_run_1.yaml new file mode 100644 index 0000000..d307159 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_rscnn_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_rscnn_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_0.25_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_0.25_run_1.yaml new file mode 100644 index 0000000..2c42891 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_0.25_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_0.25_run_1 + LOSS_NAME: smooth + MODEL_NAME: simpleview + SEED: 1 + TASK: cls diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_0.25_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_0.25_valid_run_1.yaml new file mode 100644 index 0000000..85031ea --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_0.25_valid_run_1.yaml @@ -0,0 +1,17 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.3125_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_0.25_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: simpleview + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_0.5_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_0.5_run_1.yaml new file mode 100644 index 0000000..e31de91 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_0.5_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_0.5_run_1 + LOSS_NAME: smooth + MODEL_NAME: simpleview + SEED: 1 + TASK: cls diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_0.5_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_0.5_valid_run_1.yaml new file mode 100644 index 0000000..e84f35d --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_0.5_valid_run_1.yaml @@ -0,0 +1,17 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_split_0.625_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_0.5_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: simpleview + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_ce_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_ce_run_1.yaml new file mode 100644 index 0000000..72d9c1f --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_ce_run_1.yaml @@ -0,0 +1,10 @@ +DATALOADER: + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_ce_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: simpleview + SEED: 1 + TASK: cls diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_ce_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_ce_valid_run_1.yaml new file mode 100644 index 0000000..02dac1b --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_ce_valid_run_1.yaml @@ -0,0 +1,17 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_ce_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: simpleview + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_run_1.yaml new file mode 100644 index 0000000..9acb4fb --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_run_1.yaml @@ -0,0 +1,10 @@ +DATALOADER: + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_run_1 + LOSS_NAME: smooth + MODEL_NAME: simpleview + SEED: 1 + TASK: cls diff --git a/zoo/SimpleView/configs/dgcnn_simpleview_valid_run_1.yaml b/zoo/SimpleView/configs/dgcnn_simpleview_valid_run_1.yaml new file mode 100644 index 0000000..26f00e6 --- /dev/null +++ b/zoo/SimpleView/configs/dgcnn_simpleview_valid_run_1.yaml @@ -0,0 +1,17 @@ +DATALOADER: + MODELNET40_DGCNN: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_dgcnn + EXP_ID: dgcnn_simpleview_valid_run_1 + LOSS_NAME: smooth + MODEL_NAME: simpleview + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 diff --git a/zoo/SimpleView/configs/pointnet2_dgcnn_run_1.yaml b/zoo/SimpleView/configs/pointnet2_dgcnn_run_1.yaml new file mode 100644 index 0000000..3faf665 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_dgcnn_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_dgcnn_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0001 diff --git a/zoo/SimpleView/configs/pointnet2_dgcnn_valid_run_1.yaml b/zoo/SimpleView/configs/pointnet2_dgcnn_valid_run_1.yaml new file mode 100644 index 0000000..5f208a9 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_dgcnn_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_PN2: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_dgcnn_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0001 diff --git a/zoo/SimpleView/configs/pointnet2_pointnet2_run_1.yaml b/zoo/SimpleView/configs/pointnet2_pointnet2_run_1.yaml new file mode 100644 index 0000000..7f6f79c --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_pointnet2_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_pointnet2_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/pointnet2_pointnet2_valid_run_1.yaml b/zoo/SimpleView/configs/pointnet2_pointnet2_valid_run_1.yaml new file mode 100644 index 0000000..c330fac --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_pointnet2_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_PN2: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_pointnet2_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/pointnet2_pointnet_run_1.yaml b/zoo/SimpleView/configs/pointnet2_pointnet_run_1.yaml new file mode 100644 index 0000000..1294530 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_pointnet_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_pointnet_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/pointnet2_pointnet_valid_run_1.yaml b/zoo/SimpleView/configs/pointnet2_pointnet_valid_run_1.yaml new file mode 100644 index 0000000..95c4c71 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_pointnet_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_PN2: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_pointnet_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/pointnet2_rscnn_run_1.yaml b/zoo/SimpleView/configs/pointnet2_rscnn_run_1.yaml new file mode 100644 index 0000000..605cf53 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_rscnn_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_rscnn_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/pointnet2_rscnn_valid_run_1.yaml b/zoo/SimpleView/configs/pointnet2_rscnn_valid_run_1.yaml new file mode 100644 index 0000000..0bc05ad --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_rscnn_valid_run_1.yaml @@ -0,0 +1,19 @@ +DATALOADER: + MODELNET40_PN2: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_rscnn_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/pointnet2_simpleview_run_1.yaml b/zoo/SimpleView/configs/pointnet2_simpleview_run_1.yaml new file mode 100644 index 0000000..4f170d6 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_simpleview_run_1.yaml @@ -0,0 +1,10 @@ +DATALOADER: + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_simpleview_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: simpleview + SEED: 1 + TASK: cls diff --git a/zoo/SimpleView/configs/pointnet2_simpleview_valid_run_1.yaml b/zoo/SimpleView/configs/pointnet2_simpleview_valid_run_1.yaml new file mode 100644 index 0000000..970aa13 --- /dev/null +++ b/zoo/SimpleView/configs/pointnet2_simpleview_valid_run_1.yaml @@ -0,0 +1,17 @@ +DATALOADER: + MODELNET40_PN2: + train_data_path: ./data/modelnet40_ply_hdf5_2048/train_minus_valid_files.txt + valid_data_path: ./data/modelnet40_ply_hdf5_2048/valid_files.txt + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_pn2 + EXP_ID: pointnet2_simpleview_valid_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: simpleview + SEED: 1 + TASK: cls +EXP_EXTRA: + no_test: true + no_val: false + val_eval_freq: 25 diff --git a/zoo/SimpleView/configs/rscnn_dgcnn_run_1.yaml b/zoo/SimpleView/configs/rscnn_dgcnn_run_1.yaml new file mode 100644 index 0000000..504afb1 --- /dev/null +++ b/zoo/SimpleView/configs/rscnn_dgcnn_run_1.yaml @@ -0,0 +1,13 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_rscnn + EXP_ID: rscnn_dgcnn_run_1 + LOSS_NAME: cross_entropy + METRIC: acc + MODEL_NAME: dgcnn + SEED: 1 + TASK: cls +TRAIN: + l2: 1e-4 diff --git a/zoo/SimpleView/configs/rscnn_pointnet2_run_1.yaml b/zoo/SimpleView/configs/rscnn_pointnet2_run_1.yaml new file mode 100644 index 0000000..c3758f3 --- /dev/null +++ b/zoo/SimpleView/configs/rscnn_pointnet2_run_1.yaml @@ -0,0 +1,13 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_rscnn + EXP_ID: rscnn_pointnet2_run_1 + LOSS_NAME: cross_entropy + METRIC: acc + MODEL_NAME: pointnet2 + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/rscnn_pointnet_run_1.yaml b/zoo/SimpleView/configs/rscnn_pointnet_run_1.yaml new file mode 100644 index 0000000..a8cc2bf --- /dev/null +++ b/zoo/SimpleView/configs/rscnn_pointnet_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_rscnn + EXP_ID: rscnn_pointnet_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: pointnet + SEED: 1 + TASK: cls_trans +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/rscnn_rscnn_run_1.yaml b/zoo/SimpleView/configs/rscnn_rscnn_run_1.yaml new file mode 100644 index 0000000..570b4d9 --- /dev/null +++ b/zoo/SimpleView/configs/rscnn_rscnn_run_1.yaml @@ -0,0 +1,12 @@ +DATALOADER: + batch_size: 32 + num_workers: 0 +EXP: + DATASET: modelnet40_rscnn + EXP_ID: rscnn_rscnn_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: rscnn + SEED: 1 + TASK: cls +TRAIN: + l2: 0.0 diff --git a/zoo/SimpleView/configs/rscnn_simpleview_run_1.yaml b/zoo/SimpleView/configs/rscnn_simpleview_run_1.yaml new file mode 100644 index 0000000..ea07d6b --- /dev/null +++ b/zoo/SimpleView/configs/rscnn_simpleview_run_1.yaml @@ -0,0 +1,10 @@ +DATALOADER: + batch_size: 18 + num_workers: 0 +EXP: + DATASET: modelnet40_rscnn + EXP_ID: rscnn_simpleview_run_1 + LOSS_NAME: cross_entropy + MODEL_NAME: simpleview + SEED: 1 + TASK: cls diff --git a/zoo/SimpleView/data/create_modelnet40_small.py b/zoo/SimpleView/data/create_modelnet40_small.py new file mode 100644 index 0000000..b28d3dd --- /dev/null +++ b/zoo/SimpleView/data/create_modelnet40_small.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +import os +import h5py +import numpy as np + +np.random.seed(123) + + +def main(split_size): + modelnet40_dir = "./data/modelnet40_ply_hdf5_2048/" + + modelnet40_train_file = os.path.join( + modelnet40_dir, "train_minus_valid_files.txt") + + modelnet40_train_split_file = os.path.join( + modelnet40_dir, f"train_minus_valid_split_{split_size}_files.txt") + + modelnet40_train_split_path = f"ply_data_trainminusval_split_{split_size}.h5" + + with open(modelnet40_train_file, "r") as f: + modelnet40_train_paths = [l.strip() for l in f.readlines()] + + data = [] + labels = [] + for modelnet40_train_path in modelnet40_train_paths: + train_h5 = h5py.File(modelnet40_train_path, "r") + + data.append(train_h5["data"][:]) + labels.append(train_h5["label"][:]) + + data = np.concatenate(data) + labels = np.concatenate(labels) + + train_data = [] + train_label = [] + for i in range(40): + cls_inds = np.where(labels == i)[0] + num_objs = len(cls_inds) + num_train = int(num_objs * split_size) + cls_data = data[cls_inds] + + np.random.shuffle(cls_data) + + train_data.append(cls_data[:num_train]) + train_label += [i] * num_train + + train_data = np.concatenate(train_data) + train_label = np.array(train_label).reshape(-1, 1) + + with open(modelnet40_train_split_file, "w") as f: + f.write(os.path.join(modelnet40_dir, + modelnet40_train_split_path) + "\n") + + with h5py.File( + os.path.join(modelnet40_dir, modelnet40_train_split_path), + "w") as f: + f.create_dataset("data", data=train_data) + f.create_dataset("label", data=train_label) + + print('data: {}'.format(data.shape)) + print('train data: {}'.format(train_data.shape)) + print('min_label: {}'.format(labels.min())) + print('max_label: {}'.format(labels.max())) + + +if __name__ == "__main__": + main(0.5 / 0.8) + main(0.25 / 0.8) diff --git a/zoo/SimpleView/data/create_modelnet40_valid.py b/zoo/SimpleView/data/create_modelnet40_valid.py new file mode 100755 index 0000000..34a07b5 --- /dev/null +++ b/zoo/SimpleView/data/create_modelnet40_valid.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +import os +import h5py +import numpy as np + +np.random.seed(123) +def main(): + modelnet40_dir = "./data/modelnet40_ply_hdf5_2048/" + + modelnet40_train_minus_valid_path = "ply_data_trainminusval.h5" + modelnet40_valid_path = "ply_data_valid.h5" + + modelnet40_train_minus_valid_file = os.path.join(modelnet40_dir, "train_minus_valid_files.txt") + modelnet40_valid_file = os.path.join(modelnet40_dir, "valid_files.txt") + + modelnet40_train_file = os.path.join(modelnet40_dir, "train_files.txt") + with open(modelnet40_train_file, "r") as f: + modelnet40_train_paths = [l.strip() for l in f.readlines()] + + data = [] + labels = [] + for modelnet40_train_path in modelnet40_train_paths: + train_h5 = h5py.File(modelnet40_train_path, "r") + + data.append(train_h5["data"][:]) + labels.append(train_h5["label"][:]) + + data = np.concatenate(data) + labels = np.concatenate(labels) + + train_data = [] + train_label = [] + valid_data = [] + valid_label = [] + for i in range(40): + cls_inds = np.where(labels == i)[0] + num_objs = len(cls_inds) + num_train = int(num_objs * 0.8) + num_valid = num_objs - num_train + cls_data = data[cls_inds] + + np.random.shuffle(cls_data) + + train_data.append(cls_data[:num_train]) + valid_data.append(cls_data[num_train:]) + + train_label += [i] * num_train + valid_label += [i] * num_valid + + train_data = np.concatenate(train_data) + valid_data = np.concatenate(valid_data) + train_label = np.array(train_label).reshape(-1, 1) + valid_label = np.array(valid_label).reshape(-1, 1) + + with open(modelnet40_train_minus_valid_file, "w") as f: + f.write(os.path.join(modelnet40_dir, modelnet40_train_minus_valid_path) + "\n") + + with open(modelnet40_valid_file, "w") as f: + f.write(os.path.join(modelnet40_dir, modelnet40_valid_path) + "\n") + + with h5py.File(os.path.join(modelnet40_dir, modelnet40_train_minus_valid_path), "w") as f: + f.create_dataset("data", data=train_data) + f.create_dataset("label", data=train_label) + + with h5py.File(os.path.join(modelnet40_dir, modelnet40_valid_path), "w") as f: + f.create_dataset("data", data=valid_data) + f.create_dataset("label", data=valid_label) + + print('data: {}'.format(data.shape)) + print('min_label: {}'.format(labels.min())) + print('max_label: {}'.format(labels.max())) + +if __name__ == "__main__": + main() diff --git a/zoo/SimpleView/dataloader.py b/zoo/SimpleView/dataloader.py new file mode 100644 index 0000000..9fe1b31 --- /dev/null +++ b/zoo/SimpleView/dataloader.py @@ -0,0 +1,199 @@ +import os +import numpy as np +import torch +from torch.utils.data import Dataset, DataLoader +from torchvision import transforms + +from pc_utils import (rotate_point_cloud, PointcloudScaleAndTranslate) +import rs_cnn.data.data_utils as rscnn_d_utils +from rs_cnn.data.ModelNet40Loader import ModelNet40Cls as rscnn_ModelNet40Cls +import pointnet2.utils.pointnet2_utils as pointnet2_utils +from pointnet2_tf.modelnet_h5_dataset import ModelNetH5Dataset as pointnet2_ModelNetH5Dataset +from dgcnn.pytorch.data import ModelNet40 as dgcnn_ModelNet40 +from modelnetc_utils import ModelNetC as dgcnn_ModelNetC + + +# distilled from the following sources: +# https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/data/ModelNet40Loader.py +# https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/train_cls.py +class ModelNet40Rscnn(Dataset): + def __init__(self, split, data_path, train_data_path, + valid_data_path, test_data_path, num_points): + + self.split = split + self.num_points = num_points + _transforms = transforms.Compose([rscnn_d_utils.PointcloudToTensor()]) + rscnn_params = { + 'num_points': 1024, # although it does not matter + 'root': data_path, + 'transforms': _transforms, + 'train': (split in ["train", "valid"]), + 'data_file': { + 'train': train_data_path, + 'valid': valid_data_path, + 'test': test_data_path + }[self.split] + } + self.rscnn_dataset = rscnn_ModelNet40Cls(**rscnn_params) + self.PointcloudScaleAndTranslate = PointcloudScaleAndTranslate() + + def __len__(self): + return self.rscnn_dataset.__len__() + + def __getitem__(self, idx): + point, label = self.rscnn_dataset.__getitem__(idx) + # for compatibility with the overall code + point = np.array(point) + label = label[0].item() + + return {'pc': point, 'label': label} + + def batch_proc(self, data_batch, device): + point = data_batch['pc'].to(device) + if self.split == "train": + # (B, npoint) + fps_idx = pointnet2_utils.furthest_point_sample(point, 1200) + fps_idx = fps_idx[:, np.random.choice(1200, self.num_points, + False)] + point = pointnet2_utils.gather_operation( + point.transpose(1, 2).contiguous(), + fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + point.data = self.PointcloudScaleAndTranslate(point.data) + else: + fps_idx = pointnet2_utils.furthest_point_sample( + point, self.num_points) # (B, npoint) + point = pointnet2_utils.gather_operation( + point.transpose(1, 2).contiguous(), + fps_idx).transpose(1, 2).contiguous() + # to maintain compatibility + point = point.cpu() + return {'pc': point, 'label': data_batch['label']} + + +# distilled from the following sources: +# https://github.com/charlesq34/pointnet2/blob/7961e26e31d0ba5a72020635cee03aac5d0e754a/modelnet_h5_dataset.py +# https://github.com/charlesq34/pointnet2/blob/7961e26e31d0ba5a72020635cee03aac5d0e754a/train.py +class ModelNet40PN2(Dataset): + def __init__(self, split, train_data_path, + valid_data_path, test_data_path, num_points): + self.split = split + self.dataset_name = 'modelnet40_pn2' + data_path = { + "train": train_data_path, + "valid": valid_data_path, + "test": test_data_path + }[self.split] + pointnet2_params = { + 'list_filename': data_path, + # this has nothing to do with actual dataloader batch size + 'batch_size': 32, + 'npoints': num_points, + 'shuffle': False + } + + # loading all the pointnet2data + self._dataset = pointnet2_ModelNetH5Dataset(**pointnet2_params) + all_pc = [] + all_label = [] + while self._dataset.has_next_batch(): + # augmentation here has nothing to do with actual data_augmentation + pc, label = self._dataset.next_batch(augment=False) + all_pc.append(pc) + all_label.append(label) + self.all_pc = np.concatenate(all_pc) + self.all_label = np.concatenate(all_label) + + def __len__(self): + return self.all_pc.shape[0] + + def __getitem__(self, idx): + return {'pc': self.all_pc[idx], 'label': np.int64(self.all_label[idx])} + + def batch_proc(self, data_batch, device): + if self.split == "train": + point = np.array(data_batch['pc']) + point = self._dataset._augment_batch_data(point) + # converted to tensor to maintain compatibility with the other code + data_batch['pc'] = torch.tensor(point) + else: + pass + + return data_batch + + +class ModelNet40Dgcnn(Dataset): + def __init__(self, split, train_data_path, + valid_data_path, test_data_path, num_points): + self.split = split + self.data_path = { + "train": train_data_path, + "valid": valid_data_path, + "test": test_data_path + }[self.split] + + dgcnn_params = { + 'partition': 'train' if split in ['train', 'valid'] else 'test', + 'num_points': num_points, + "data_path": self.data_path + } + self.dataset = dgcnn_ModelNet40(**dgcnn_params) + + def __len__(self): + return self.dataset.__len__() + + def __getitem__(self, idx): + pc, label = self.dataset.__getitem__(idx) + return {'pc': pc, 'label': label.item()} + + +class ModelNetC(Dataset): + def __init__(self, split): + dgcnn_params = { + "split": split + } + self.dataset = dgcnn_ModelNetC(**dgcnn_params) + + def __len__(self): + return self.dataset.__len__() + + def __getitem__(self, idx): + pc, label = self.dataset.__getitem__(idx) + return {'pc': pc, 'label': label.item()} + + +def create_dataloader(split, cfg): + num_workers = cfg.DATALOADER.num_workers + batch_size = cfg.DATALOADER.batch_size + dataset_args = { + "split": split + } + + if cfg.EXP.DATASET == "modelnet40_rscnn": + dataset_args.update(dict(**cfg.DATALOADER.MODELNET40_RSCNN)) + # augmentation directly done in the code so that + # it is as similar to the vanilla code as possible + dataset = ModelNet40Rscnn(**dataset_args) + elif cfg.EXP.DATASET == "modelnet40_pn2": + dataset_args.update(dict(**cfg.DATALOADER.MODELNET40_PN2)) + dataset = ModelNet40PN2(**dataset_args) + elif cfg.EXP.DATASET == "modelnet40_dgcnn": + dataset_args.update(dict(**cfg.DATALOADER.MODELNET40_DGCNN)) + dataset = ModelNet40Dgcnn(**dataset_args) + elif cfg.EXP.DATASET == "modelnet_c": + dataset_args.update(dict(**cfg.DATALOADER.MODELNET_C)) + dataset = ModelNetC(**dataset_args) + else: + assert False + + if "batch_proc" not in dir(dataset): + dataset.batch_proc = None + + return DataLoader( + dataset, + batch_size, + num_workers=num_workers, + shuffle=(split == "train"), + drop_last=(split == "train"), + pin_memory=(torch.cuda.is_available()) and (not num_workers) + ) + diff --git a/zoo/SimpleView/dgcnn/.gitignore b/zoo/SimpleView/dgcnn/.gitignore new file mode 100644 index 0000000..eb15b4f --- /dev/null +++ b/zoo/SimpleView/dgcnn/.gitignore @@ -0,0 +1,8 @@ +data/ +log/ +*.pyc +.DS_Store +pytorch/pretrained/ +pytorch/checkpoints/ +tensorflow/part_seg/train_results/ + diff --git a/zoo/SimpleView/dgcnn/README.md b/zoo/SimpleView/dgcnn/README.md new file mode 100644 index 0000000..3bb47f4 --- /dev/null +++ b/zoo/SimpleView/dgcnn/README.md @@ -0,0 +1,39 @@ +# Dynamic Graph CNN for Learning on Point Clouds +We propose a new neural network module dubbed EdgeConv suitable for CNN-based high-level tasks on point clouds including classification and segmentation. EdgeConv is differentiable and can be plugged into existing architectures. + +[[Project]](https://liuziwei7.github.io/projects/DGCNN) [[Paper]](https://arxiv.org/abs/1801.07829) + +## Overview +`DGCNN` is the author's re-implementation of Dynamic Graph CNN, which achieves state-of-the-art performance on point-cloud-related high-level tasks including category classification, semantic segmentation and part segmentation. + + + +Further information please contact [Yue Wang](https://www.csail.mit.edu/person/yue-wang) and [Yongbin Sun](https://autoid.mit.edu/people-2). + +## Author's Implementations + +The classification experiments in our paper are done with the pytorch implementation. + +* [tensorflow-dgcnn](./tensorflow) +* [pytorch-dgcnn](./pytorch) + +## Other Implementations +* [pytorch-geometric](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.nn.conv.EdgeConv) +* [pytorch-dgcnn](https://github.com/AnTao97/dgcnn.pytorch) (This implementation on S3DIS achieves significant better results than our tensorflow implementation) + + +## Citation +Please cite this paper if you want to use it in your work, + + @article{dgcnn, + title={Dynamic Graph CNN for Learning on Point Clouds}, + author={Wang, Yue and Sun, Yongbin and Liu, Ziwei and Sarma, Sanjay E. and Bronstein, Michael M. and Solomon, Justin M.}, + journal={ACM Transactions on Graphics (TOG)}, + year={2019} + } + +## License +MIT License + +## Acknowledgement +The structure of this codebase is borrowed from [PointNet](https://github.com/charlesq34/pointnet). diff --git a/zoo/SimpleView/dgcnn/pytorch/README.md b/zoo/SimpleView/dgcnn/pytorch/README.md new file mode 100644 index 0000000..5352c6a --- /dev/null +++ b/zoo/SimpleView/dgcnn/pytorch/README.md @@ -0,0 +1,33 @@ +# Dynamic Graph CNN for Learning on Point Clouds (PyTorch) + +## Point Cloud Classification +* Run the training script: + + +``` 1024 points +python main.py --exp_name=dgcnn_1024 --model=dgcnn --num_points=1024 --k=20 --use_sgd=True +``` + +``` 2048 points +python main.py --exp_name=dgcnn_2048 --model=dgcnn --num_points=2048 --k=40 --use_sgd=True +``` + +* Run the evaluation script after training finished: + +``` 1024 points +python main.py --exp_name=dgcnn_1024_eval --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval=True --model_path=checkpoints/dgcnn_1024/models/model.t7 +``` + +``` 2048 points +python main.py --exp_name=dgcnn_2048_eval --model=dgcnn --num_points=2048 --k=40 --use_sgd=True --eval=True --model_path=checkpoints/dgcnn_2048/models/model.t7 +``` + +* Run the evaluation script with pretrained models: + +``` 1024 points +python main.py --exp_name=dgcnn_1024_eval --model=dgcnn --num_points=1024 --k=20 --use_sgd=True --eval=True --model_path=pretrained/model.1024.t7 +``` + +``` 2048 points +python main.py --exp_name=dgcnn_2048_eval --model=dgcnn --num_points=2048 --k=40 --use_sgd=True --eval=True --model_path=pretrained/model.2048.t7 +``` diff --git a/zoo/SimpleView/dgcnn/pytorch/data.py b/zoo/SimpleView/dgcnn/pytorch/data.py new file mode 100644 index 0000000..14ba1c5 --- /dev/null +++ b/zoo/SimpleView/dgcnn/pytorch/data.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: data.py +@Time: 2018/10/13 6:21 PM +""" + + +import os +import sys +import glob +import h5py +import numpy as np +from torch.utils.data import Dataset + + +def download(): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, '../../data') + if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) + if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def load_data(data_path): + download() + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATA_DIR = os.path.join(BASE_DIR, '../../data') + all_data = [] + all_label = [] + with open(data_path, "r") as f: + # for h5_name in glob.glob(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048', 'ply_data_%s*.h5'%partition)): + for h5_name in f.readlines(): + # h5_name = os.path.join(BASE_DIR, "../../", h5_name.strip()) + f = h5py.File(h5_name.strip(), 'r') + data = f['data'][:].astype('float32') + label = f['label'][:].astype('int64') + f.close() + all_data.append(data) + all_label.append(label) + all_data = np.concatenate(all_data, axis=0) + all_label = np.concatenate(all_label, axis=0) + return all_data, all_label + + +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + + +def jitter_pointcloud(pointcloud, sigma=0.01, clip=0.02): + N, C = pointcloud.shape + pointcloud += np.clip(sigma * np.random.randn(N, C), -1*clip, clip) + return pointcloud + + +class ModelNet40(Dataset): + def __init__(self, num_points, data_path, partition='train'): + self.data, self.label = load_data(data_path) + self.num_points = num_points + self.partition = partition + + def __getitem__(self, item): + pointcloud = self.data[item][:self.num_points] + label = self.label[item] + if self.partition == 'train': + pointcloud = translate_pointcloud(pointcloud) + np.random.shuffle(pointcloud) + return pointcloud, label + + def __len__(self): + return self.data.shape[0] + + +if __name__ == '__main__': + train = ModelNet40(1024) + test = ModelNet40(1024, 'test') + for data, label in train: + print(data.shape) + print(label.shape) diff --git a/zoo/SimpleView/dgcnn/pytorch/main.py b/zoo/SimpleView/dgcnn/pytorch/main.py new file mode 100644 index 0000000..2096d99 --- /dev/null +++ b/zoo/SimpleView/dgcnn/pytorch/main.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: main.py +@Time: 2018/10/13 10:39 PM +""" + + +from __future__ import print_function +import os +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.optim.lr_scheduler import CosineAnnealingLR +from data import ModelNet40 +from model import PointNet, DGCNN +import numpy as np +from torch.utils.data import DataLoader +from util import cal_loss, IOStream +import sklearn.metrics as metrics + + +def _init_(): + if not os.path.exists('checkpoints'): + os.makedirs('checkpoints') + if not os.path.exists('checkpoints/'+args.exp_name): + os.makedirs('checkpoints/'+args.exp_name) + if not os.path.exists('checkpoints/'+args.exp_name+'/'+'models'): + os.makedirs('checkpoints/'+args.exp_name+'/'+'models') + os.system('cp main.py checkpoints'+'/'+args.exp_name+'/'+'main.py.backup') + os.system('cp model.py checkpoints' + '/' + args.exp_name + '/' + 'model.py.backup') + os.system('cp util.py checkpoints' + '/' + args.exp_name + '/' + 'util.py.backup') + os.system('cp data.py checkpoints' + '/' + args.exp_name + '/' + 'data.py.backup') + +def train(args, io): + train_loader = DataLoader(ModelNet40(partition='train', num_points=args.num_points), num_workers=8, + batch_size=args.batch_size, shuffle=True, drop_last=True) + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), num_workers=8, + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + if args.model == 'pointnet': + model = PointNet(args).to(device) + elif args.model == 'dgcnn': + model = DGCNN(args).to(device) + else: + raise Exception("Not implemented") + print(str(model)) + + model = nn.DataParallel(model) + print("Let's use", torch.cuda.device_count(), "GPUs!") + + if args.use_sgd: + print("Use SGD") + opt = optim.SGD(model.parameters(), lr=args.lr*100, momentum=args.momentum, weight_decay=1e-4) + else: + print("Use Adam") + opt = optim.Adam(model.parameters(), lr=args.lr, weight_decay=1e-4) + + scheduler = CosineAnnealingLR(opt, args.epochs, eta_min=args.lr) + + print(f"Using the smoothing loss {bool(args.smoothing)}") + criterion = lambda x,y: cal_loss(x, y, bool(args.smoothing)) + + best_test_acc = 0 + for epoch in range(args.epochs): + scheduler.step() + #################### + # Train + #################### + train_loss = 0.0 + count = 0.0 + model.train() + train_pred = [] + train_true = [] + for data, label in train_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + opt.zero_grad() + logits = model(data) + loss = criterion(logits, label) + loss.backward() + opt.step() + preds = logits.max(dim=1)[1] + count += batch_size + train_loss += loss.item() * batch_size + train_true.append(label.cpu().numpy()) + train_pred.append(preds.detach().cpu().numpy()) + train_true = np.concatenate(train_true) + train_pred = np.concatenate(train_pred) + outstr = 'Train %d, loss: %.6f, train acc: %.6f, train avg acc: %.6f' % (epoch, + train_loss*1.0/count, + metrics.accuracy_score( + train_true, train_pred), + metrics.balanced_accuracy_score( + train_true, train_pred)) + io.cprint(outstr) + + #################### + # Test + #################### + test_loss = 0.0 + count = 0.0 + model.eval() + test_pred = [] + test_true = [] + for data, label in test_loader: + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + loss = criterion(logits, label) + preds = logits.max(dim=1)[1] + count += batch_size + test_loss += loss.item() * batch_size + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test %d, loss: %.6f, test acc: %.6f, test avg acc: %.6f' % (epoch, + test_loss*1.0/count, + test_acc, + avg_per_class_acc) + io.cprint(outstr) + if test_acc >= best_test_acc: + best_test_acc = test_acc + torch.save(model.state_dict(), 'checkpoints/%s/models/model.t7' % args.exp_name) + + +def test(args, io): + test_loader = DataLoader(ModelNet40(partition='test', num_points=args.num_points), + batch_size=args.test_batch_size, shuffle=True, drop_last=False) + + device = torch.device("cuda" if args.cuda else "cpu") + + #Try to load models + model = DGCNN(args).to(device) + model = nn.DataParallel(model) + model.load_state_dict(torch.load(args.model_path)) + model = model.eval() + test_acc = 0.0 + count = 0.0 + test_true = [] + test_pred = [] + for data, label in test_loader: + + data, label = data.to(device), label.to(device).squeeze() + data = data.permute(0, 2, 1) + batch_size = data.size()[0] + logits = model(data) + preds = logits.max(dim=1)[1] + test_true.append(label.cpu().numpy()) + test_pred.append(preds.detach().cpu().numpy()) + test_true = np.concatenate(test_true) + test_pred = np.concatenate(test_pred) + test_acc = metrics.accuracy_score(test_true, test_pred) + avg_per_class_acc = metrics.balanced_accuracy_score(test_true, test_pred) + outstr = 'Test :: test acc: %.6f, test avg acc: %.6f'%(test_acc, avg_per_class_acc) + io.cprint(outstr) + + +if __name__ == "__main__": + # Training settings + parser = argparse.ArgumentParser(description='Point Cloud Recognition') + parser.add_argument('--exp_name', type=str, default='exp', metavar='N', + help='Name of the experiment') + parser.add_argument('--model', type=str, default='dgcnn', metavar='N', + choices=['pointnet', 'dgcnn'], + help='Model to use, [pointnet, dgcnn]') + parser.add_argument('--dataset', type=str, default='modelnet40', metavar='N', + choices=['modelnet40']) + parser.add_argument('--batch_size', type=int, default=32, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--test_batch_size', type=int, default=16, metavar='batch_size', + help='Size of batch)') + parser.add_argument('--epochs', type=int, default=250, metavar='N', + help='number of episode to train ') + parser.add_argument('--use_sgd', type=bool, default=True, + help='Use SGD') + parser.add_argument('--lr', type=float, default=0.001, metavar='LR', + help='learning rate (default: 0.001, 0.1 if using sgd)') + parser.add_argument('--momentum', type=float, default=0.9, metavar='M', + help='SGD momentum (default: 0.9)') + parser.add_argument('--no_cuda', type=bool, default=False, + help='enables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--eval', type=bool, default=False, + help='evaluate the model') + parser.add_argument('--num_points', type=int, default=1024, + help='num of points to use') + parser.add_argument('--dropout', type=float, default=0.5, + help='dropout rate') + parser.add_argument('--emb_dims', type=int, default=1024, metavar='N', + help='Dimension of embeddings') + parser.add_argument('--k', type=int, default=20, metavar='N', + help='Num of nearest neighbors to use') + parser.add_argument('--model_path', type=str, default='', metavar='N', + help='Pretrained model path') + parser.add_argument('--smoothing', type=int, default=1, + help='Whether to use smoothing in the loss') + parser.add_argument('--leaky_relu', type=int, default=1, + help='Whether to use leaky_relu') + args = parser.parse_args() + + _init_() + + io = IOStream('checkpoints/' + args.exp_name + '/run.log') + io.cprint(str(args)) + + args.cuda = not args.no_cuda and torch.cuda.is_available() + torch.manual_seed(args.seed) + if args.cuda: + io.cprint( + 'Using GPU : ' + str(torch.cuda.current_device()) + ' from ' + str(torch.cuda.device_count()) + ' devices') + torch.cuda.manual_seed(args.seed) + else: + io.cprint('Using CPU') + + if not args.eval: + train(args, io) + else: + test(args, io) diff --git a/zoo/SimpleView/dgcnn/pytorch/model.py b/zoo/SimpleView/dgcnn/pytorch/model.py new file mode 100644 index 0000000..dd8dbb0 --- /dev/null +++ b/zoo/SimpleView/dgcnn/pytorch/model.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: model.py +@Time: 2018/10/13 6:35 PM +""" + + +import os +import sys +import copy +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def knn(x, k): + inner = -2*torch.matmul(x.transpose(2, 1), x) + xx = torch.sum(x**2, dim=1, keepdim=True) + pairwise_distance = -xx - inner - xx.transpose(2, 1) + + idx = pairwise_distance.topk(k=k, dim=-1)[1] # (batch_size, num_points, k) + return idx + + +def get_graph_feature(x, k=20, idx=None): + batch_size = x.size(0) + num_points = x.size(2) + x = x.view(batch_size, -1, num_points) + if idx is None: + idx = knn(x, k=k) # (batch_size, num_points, k) + device = torch.device('cuda') + + idx_base = torch.arange(0, batch_size, device=device).view(-1, 1, 1)*num_points + + idx = idx + idx_base + + idx = idx.view(-1) + + _, num_dims, _ = x.size() + + x = x.transpose(2, 1).contiguous() # (batch_size, num_points, num_dims) -> (batch_size*num_points, num_dims) # batch_size * num_points * k + range(0, batch_size*num_points) + feature = x.view(batch_size*num_points, -1)[idx, :] + feature = feature.view(batch_size, num_points, k, num_dims) + x = x.view(batch_size, num_points, 1, num_dims).repeat(1, 1, k, 1) + + feature = torch.cat((feature-x, x), dim=3).permute(0, 3, 1, 2).contiguous() + + return feature + + +class PointNet(nn.Module): + def __init__(self, args, output_channels=40): + super(PointNet, self).__init__() + self.args = args + self.conv1 = nn.Conv1d(3, 64, kernel_size=1, bias=False) + self.conv2 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.conv3 = nn.Conv1d(64, 64, kernel_size=1, bias=False) + self.conv4 = nn.Conv1d(64, 128, kernel_size=1, bias=False) + self.conv5 = nn.Conv1d(128, args.emb_dims, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(64) + self.bn3 = nn.BatchNorm1d(64) + self.bn4 = nn.BatchNorm1d(128) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + self.linear1 = nn.Linear(args.emb_dims, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout() + self.linear2 = nn.Linear(512, output_channels) + + def forward(self, x): + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = F.relu(self.bn4(self.conv4(x))) + x = F.relu(self.bn5(self.conv5(x))) + x = F.adaptive_max_pool1d(x, 1).squeeze() + x = F.relu(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = self.linear2(x) + return x + + +class DGCNN(nn.Module): + def __init__(self, args, output_channels=40): + super(DGCNN, self).__init__() + self.args = args + self.k = args.k + self.leaky_relu = bool(args.leaky_relu) + + self.bn1 = nn.BatchNorm2d(64) + self.bn2 = nn.BatchNorm2d(64) + self.bn3 = nn.BatchNorm2d(128) + self.bn4 = nn.BatchNorm2d(256) + self.bn5 = nn.BatchNorm1d(args.emb_dims) + + if self.leaky_relu: + act_mod = nn.LeakyReLU + act_mod_args = {'negative_slope': 0.2} + else: + act_mod = nn.ReLU + act_mod_args = {} + + self.conv1 = nn.Sequential(nn.Conv2d(6, 64, kernel_size=1, bias=False), + self.bn1, + act_mod(**act_mod_args)) + self.conv2 = nn.Sequential(nn.Conv2d(64*2, 64, kernel_size=1, bias=False), + self.bn2, + act_mod(**act_mod_args)) + self.conv3 = nn.Sequential(nn.Conv2d(64*2, 128, kernel_size=1, bias=False), + self.bn3, + act_mod(**act_mod_args)) + self.conv4 = nn.Sequential(nn.Conv2d(128*2, 256, kernel_size=1, bias=False), + self.bn4, + act_mod(**act_mod_args)) + self.conv5 = nn.Sequential(nn.Conv1d(512, args.emb_dims, kernel_size=1, bias=False), + self.bn5, + act_mod(**act_mod_args)) + self.linear1 = nn.Linear(args.emb_dims*2, 512, bias=False) + self.bn6 = nn.BatchNorm1d(512) + self.dp1 = nn.Dropout(p=args.dropout) + self.linear2 = nn.Linear(512, 256) + self.bn7 = nn.BatchNorm1d(256) + self.dp2 = nn.Dropout(p=args.dropout) + self.linear3 = nn.Linear(256, output_channels) + + def forward(self, x): + batch_size = x.size(0) + x = get_graph_feature(x, k=self.k) + x = self.conv1(x) + x1 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x1, k=self.k) + x = self.conv2(x) + x2 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x2, k=self.k) + x = self.conv3(x) + x3 = x.max(dim=-1, keepdim=False)[0] + + x = get_graph_feature(x3, k=self.k) + x = self.conv4(x) + x4 = x.max(dim=-1, keepdim=False)[0] + + x = torch.cat((x1, x2, x3, x4), dim=1) + + x = self.conv5(x) + x1 = F.adaptive_max_pool1d(x, 1).view(batch_size, -1) + x2 = F.adaptive_avg_pool1d(x, 1).view(batch_size, -1) + x = torch.cat((x1, x2), 1) + + if self.leaky_relu: + act = lambda y: F.leaky_relu(y, negative_slope=0.2) + else: + act = F.relu + + x = act(self.bn6(self.linear1(x))) + x = self.dp1(x) + x = act(self.bn7(self.linear2(x))) + x = self.dp2(x) + x = self.linear3(x) + return x diff --git a/zoo/SimpleView/dgcnn/pytorch/util.py b/zoo/SimpleView/dgcnn/pytorch/util.py new file mode 100644 index 0000000..6875176 --- /dev/null +++ b/zoo/SimpleView/dgcnn/pytorch/util.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Author: Yue Wang +@Contact: yuewangx@mit.edu +@File: util +@Time: 4/5/19 3:47 PM +""" + + +import numpy as np +import torch +import torch.nn.functional as F + + +def cal_loss(pred, gold, smoothing=True): + ''' Calculate cross entropy loss, apply label smoothing if needed. ''' + + gold = gold.contiguous().view(-1) + + if smoothing: + eps = 0.2 + n_class = pred.size(1) + + one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1) + one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1) + log_prb = F.log_softmax(pred, dim=1) + + loss = -(one_hot * log_prb).sum(dim=1).mean() + else: + loss = F.cross_entropy(pred, gold, reduction='mean') + + return loss + + +class IOStream(): + def __init__(self, path): + self.f = open(path, 'a') + + def cprint(self, text): + print(text) + self.f.write(text+'\n') + self.f.flush() + + def close(self): + self.f.close() diff --git a/zoo/SimpleView/dgcnn/tensorflow/README.md b/zoo/SimpleView/dgcnn/tensorflow/README.md new file mode 100644 index 0000000..a2381bb --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/README.md @@ -0,0 +1,15 @@ +# Dynamic Graph CNN for Learning on Point Clouds (TensorFlow) + +## Point Cloud Classification +* Run the training script: + +``` bash +python train.py +``` + +* Run the evaluation script after training finished: + +``` bash +python evalutate.py + +``` diff --git a/zoo/SimpleView/dgcnn/tensorflow/evaluate.py b/zoo/SimpleView/dgcnn/tensorflow/evaluate.py new file mode 100644 index 0000000..531f44b --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/evaluate.py @@ -0,0 +1,170 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import pc_util + + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='dgcnn', help='Model name: dgcnn [default: dgcnn]') +parser.add_argument('--batch_size', type=int, default=4, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump', help='dump folder path [dump]') +parser.add_argument('--visu', action='store_true', help='Whether to dump image for error case [default: False]') +FLAGS = parser.parse_args() + + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +NUM_CLASSES = 40 +SHAPE_NAMES = [line.rstrip() for line in \ + open(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/shape_names.txt'))] + +HOSTNAME = socket.gethostname() + +# ModelNet40 official train/test split +TRAIN_FILES = provider.getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt')) +TEST_FILES = provider.getDataFiles(\ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt')) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + loss = MODEL.get_loss(pred, labels_pl, end_points) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = True + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops, num_votes) + + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + fout = open(os.path.join(DUMP_DIR, 'pred_label.txt'), 'w') + for fn in range(len(TEST_FILES)): + log_string('----'+str(fn)+'----') + current_data, current_label = provider.loadDataFile(TEST_FILES[fn]) + current_data = current_data[:,0:NUM_POINT,:] + current_label = np.squeeze(current_label) + print(current_data.shape) + + file_size = current_data.shape[0] + num_batches = file_size // BATCH_SIZE + print(file_size) + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + # Aggregating BEG + batch_loss_sum = 0 # sum of losses for the batch + batch_pred_sum = np.zeros((cur_batch_size, NUM_CLASSES)) # score for classes + batch_pred_classes = np.zeros((cur_batch_size, NUM_CLASSES)) # 0/1 for classes + for vote_idx in range(num_votes): + rotated_data = provider.rotate_point_cloud_by_angle(current_data[start_idx:end_idx, :, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], + feed_dict=feed_dict) + batch_pred_sum += pred_val + batch_pred_val = np.argmax(pred_val, 1) + for el_idx in range(cur_batch_size): + batch_pred_classes[el_idx, batch_pred_val[el_idx]] += 1 + batch_loss_sum += (loss_val * cur_batch_size / float(num_votes)) + # pred_val_topk = np.argsort(batch_pred_sum, axis=-1)[:,-1*np.array(range(topk))-1] + # pred_val = np.argmax(batch_pred_classes, 1) + pred_val = np.argmax(batch_pred_sum, 1) + # Aggregating END + + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + # correct = np.sum(pred_val_topk[:,0:topk] == label_val) + total_correct += correct + total_seen += cur_batch_size + loss_sum += batch_loss_sum + + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + fout.write('%d, %d\n' % (pred_val[i-start_idx], l)) + + if pred_val[i-start_idx] != l and FLAGS.visu: # ERROR CASE, DUMP! + img_filename = '%d_label_%s_pred_%s.jpg' % (error_cnt, SHAPE_NAMES[l], + SHAPE_NAMES[pred_val[i-start_idx]]) + img_filename = os.path.join(DUMP_DIR, img_filename) + output_img = pc_util.point_cloud_three_views(np.squeeze(current_data[i, :, :])) + scipy.misc.imsave(img_filename, output_img) + error_cnt += 1 + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f' % (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=12) + LOG_FOUT.close() diff --git a/zoo/SimpleView/dgcnn/tensorflow/misc/demo_teaser.png b/zoo/SimpleView/dgcnn/tensorflow/misc/demo_teaser.png new file mode 100644 index 0000000..ffbdbac Binary files /dev/null and b/zoo/SimpleView/dgcnn/tensorflow/misc/demo_teaser.png differ diff --git a/zoo/SimpleView/dgcnn/tensorflow/models/dgcnn.py b/zoo/SimpleView/dgcnn/tensorflow/models/dgcnn.py new file mode 100644 index 0000000..5b768ea --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/models/dgcnn.py @@ -0,0 +1,150 @@ +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append(os.path.join(BASE_DIR, '../../utils')) +import tf_util +from transform_nets import input_transform_net + + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + k = 20 + + adj_matrix = tf_util.pairwise_distance(point_cloud) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(point_cloud, nn_idx=nn_idx, k=k) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(edge_feature, is_training, bn_decay, K=3) + + point_cloud_transformed = tf.matmul(point_cloud, transform) + adj_matrix = tf_util.pairwise_distance(point_cloud_transformed) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(point_cloud_transformed, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn1', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net1 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn2', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net2 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn3', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net3 = net + + adj_matrix = tf_util.pairwise_distance(net) + nn_idx = tf_util.knn(adj_matrix, k=k) + edge_feature = tf_util.get_edge_feature(net, nn_idx=nn_idx, k=k) + + net = tf_util.conv2d(edge_feature, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='dgcnn4', bn_decay=bn_decay) + net = tf.reduce_max(net, axis=-2, keep_dims=True) + net4 = net + + net = tf_util.conv2d(tf.concat([net1, net2, net3, net4], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='agg', bn_decay=bn_decay) + + net = tf.reduce_max(net, axis=1, keep_dims=True) + + # MLP on global point cloud vector + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, + scope='dp2') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + labels = tf.one_hot(indices=label, depth=40) + loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=pred, label_smoothing=0.2) + classify_loss = tf.reduce_mean(loss) + return classify_loss + + +if __name__=='__main__': + batch_size = 2 + num_pt = 124 + pos_dim = 3 + + input_feed = np.random.rand(batch_size, num_pt, pos_dim) + label_feed = np.random.rand(batch_size) + label_feed[label_feed>=0.5] = 1 + label_feed[label_feed<0.5] = 0 + label_feed = label_feed.astype(np.int32) + + # # np.save('./debug/input_feed.npy', input_feed) + # input_feed = np.load('./debug/input_feed.npy') + # print input_feed + + with tf.Graph().as_default(): + input_pl, label_pl = placeholder_inputs(batch_size, num_pt) + pos, ftr = get_model(input_pl, tf.constant(True)) + # loss = get_loss(logits, label_pl, None) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + feed_dict = {input_pl: input_feed, label_pl: label_feed} + res1, res2 = sess.run([pos, ftr], feed_dict=feed_dict) + print res1.shape + print res1 + + print res2.shape + print res2 + + + + + + + + + + + + diff --git a/zoo/SimpleView/dgcnn/tensorflow/models/transform_nets.py b/zoo/SimpleView/dgcnn/tensorflow/models/transform_nets.py new file mode 100644 index 0000000..b4ef59e --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/models/transform_nets.py @@ -0,0 +1,56 @@ +import tensorflow as tf +import numpy as np +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def input_transform_net(edge_feature, is_training, bn_decay=None, K=3, is_dist=False): + """ Input (XYZ) Transform Net, input is BxNx3 gray image + Return: + Transformation matrix of size 3xK """ + batch_size = edge_feature.get_shape()[0].value + num_point = edge_feature.get_shape()[1].value + + # input_image = tf.expand_dims(point_cloud, -1) + net = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv1', bn_decay=bn_decay, is_dist=is_dist) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv2', bn_decay=bn_decay, is_dist=is_dist) + + net = tf.reduce_max(net, axis=-2, keep_dims=True) + + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='tconv3', bn_decay=bn_decay, is_dist=is_dist) + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='tmaxpool') + + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='tfc1', bn_decay=bn_decay,is_dist=is_dist) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='tfc2', bn_decay=bn_decay,is_dist=is_dist) + + with tf.variable_scope('transform_XYZ') as sc: + # assert(K==3) + with tf.device('/cpu:0'): + weights = tf.get_variable('weights', [256, K*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases = tf.get_variable('biases', [K*K], + initializer=tf.constant_initializer(0.0), + dtype=tf.float32) + biases += tf.constant(np.eye(K).flatten(), dtype=tf.float32) + transform = tf.matmul(net, weights) + transform = tf.nn.bias_add(transform, biases) + + transform = tf.reshape(transform, [batch_size, K, K]) + return transform \ No newline at end of file diff --git a/zoo/SimpleView/dgcnn/tensorflow/part_seg/README.md b/zoo/SimpleView/dgcnn/tensorflow/part_seg/README.md new file mode 100644 index 0000000..959ee18 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/part_seg/README.md @@ -0,0 +1,33 @@ +## Part segmentation + +### Dataset + +Load the data for part segmentation. + +``` +sh +x download_data.sh +``` + +### Train + +Train the model on 2 GPUs, each with 12 GB memeory. + +``` +python train_multi_gpu.py +``` + +Model parameters are saved every 5 epochs in "train_results/trained_models/". + +### Evaluation + +To evaluate the model saved after epoch n, + +``` +python test.py --model_path train_results/trained_models/epoch_n.ckpt +``` + +For example, if we want to test the model saved after 175 epochs (provided), + +``` +python test.py --model_path train_results/trained_models/epoch_175.ckpt +``` diff --git a/zoo/SimpleView/dgcnn/tensorflow/part_seg/download_data.sh b/zoo/SimpleView/dgcnn/tensorflow/part_seg/download_data.sh new file mode 100644 index 0000000..79ccf66 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/part_seg/download_data.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Download original ShapeNetPart dataset (around 1GB) ['PartAnnotation'] +wget https://shapenet.cs.stanford.edu/ericyi/shapenetcore_partanno_v0.zip +unzip shapenetcore_partanno_v0.zip +rm shapenetcore_partanno_v0.zip + +# Download HDF5 for ShapeNet Part segmentation (around 346MB) ['hdf5_data'] +wget https://shapenet.cs.stanford.edu/media/shapenet_part_seg_hdf5_data.zip +unzip shapenet_part_seg_hdf5_data.zip +rm shapenet_part_seg_hdf5_data.zip diff --git a/zoo/SimpleView/dgcnn/tensorflow/part_seg/part_seg_model.py b/zoo/SimpleView/dgcnn/tensorflow/part_seg/part_seg_model.py new file mode 100644 index 0000000..227f9a6 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/part_seg/part_seg_model.py @@ -0,0 +1,129 @@ +import tensorflow as tf +import numpy as np +import math +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(os.path.dirname(BASE_DIR)) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +sys.path.append(os.path.join(BASE_DIR, '../models')) +sys.path.append(os.path.join(BASE_DIR, '../')) +import tf_util +from transform_nets import input_transform_net + +def get_model(point_cloud, input_label, is_training, cat_num, part_num, \ + batch_size, num_point, weight_decay, bn_decay=None): + + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + input_image = tf.expand_dims(point_cloud, -1) + + k = 20 + + adj = tf_util.pairwise_distance(point_cloud) + nn_idx = tf_util.knn(adj, k=k) + edge_feature = tf_util.get_edge_feature(input_image, nn_idx=nn_idx, k=k) + + with tf.variable_scope('transform_net1') as sc: + transform = input_transform_net(edge_feature, is_training, bn_decay, K=3, is_dist=True) + point_cloud_transformed = tf.matmul(point_cloud, transform) + + input_image = tf.expand_dims(point_cloud_transformed, -1) + adj = tf_util.pairwise_distance(point_cloud_transformed) + nn_idx = tf_util.knn(adj, k=k) + edge_feature = tf_util.get_edge_feature(input_image, nn_idx=nn_idx, k=k) + + out1 = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv1', bn_decay=bn_decay, is_dist=True) + + out2 = tf_util.conv2d(out1, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv2', bn_decay=bn_decay, is_dist=True) + + net_1 = tf.reduce_max(out2, axis=-2, keep_dims=True) + + + + adj = tf_util.pairwise_distance(net_1) + nn_idx = tf_util.knn(adj, k=k) + edge_feature = tf_util.get_edge_feature(net_1, nn_idx=nn_idx, k=k) + + out3 = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv3', bn_decay=bn_decay, is_dist=True) + + out4 = tf_util.conv2d(out3, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv4', bn_decay=bn_decay, is_dist=True) + + net_2 = tf.reduce_max(out4, axis=-2, keep_dims=True) + + + + adj = tf_util.pairwise_distance(net_2) + nn_idx = tf_util.knn(adj, k=k) + edge_feature = tf_util.get_edge_feature(net_2, nn_idx=nn_idx, k=k) + + out5 = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv5', bn_decay=bn_decay, is_dist=True) + + # out6 = tf_util.conv2d(out5, 64, [1,1], + # padding='VALID', stride=[1,1], + # bn=True, is_training=is_training, weight_decay=weight_decay, + # scope='adj_conv6', bn_decay=bn_decay, is_dist=True) + + net_3 = tf.reduce_max(out5, axis=-2, keep_dims=True) + + + + out7 = tf_util.conv2d(tf.concat([net_1, net_2, net_3], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='adj_conv7', bn_decay=bn_decay, is_dist=True) + + out_max = tf_util.max_pool2d(out7, [num_point, 1], padding='VALID', scope='maxpool') + + + one_hot_label_expand = tf.reshape(input_label, [batch_size, 1, 1, cat_num]) + one_hot_label_expand = tf_util.conv2d(one_hot_label_expand, 64, [1, 1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='one_hot_label_expand', bn_decay=bn_decay, is_dist=True) + out_max = tf.concat(axis=3, values=[out_max, one_hot_label_expand]) + expand = tf.tile(out_max, [1, num_point, 1, 1]) + + concat = tf.concat(axis=3, values=[expand, + net_1, + net_2, + net_3]) + + net2 = tf_util.conv2d(concat, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, + bn=True, is_training=is_training, scope='seg/conv1', weight_decay=weight_decay, is_dist=True) + net2 = tf_util.dropout(net2, keep_prob=0.6, is_training=is_training, scope='seg/dp1') + net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, + bn=True, is_training=is_training, scope='seg/conv2', weight_decay=weight_decay, is_dist=True) + net2 = tf_util.dropout(net2, keep_prob=0.6, is_training=is_training, scope='seg/dp2') + net2 = tf_util.conv2d(net2, 128, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, + bn=True, is_training=is_training, scope='seg/conv3', weight_decay=weight_decay, is_dist=True) + net2 = tf_util.conv2d(net2, part_num, [1,1], padding='VALID', stride=[1,1], activation_fn=None, + bn=False, scope='seg/conv4', weight_decay=weight_decay, is_dist=True) + + net2 = tf.reshape(net2, [batch_size, num_point, part_num]) + + return net2 + + +def get_loss(seg_pred, seg): + per_instance_seg_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=seg_pred, labels=seg), axis=1) + seg_loss = tf.reduce_mean(per_instance_seg_loss) + per_instance_seg_pred_res = tf.argmax(seg_pred, 2) + + return seg_loss, per_instance_seg_loss, per_instance_seg_pred_res + diff --git a/zoo/SimpleView/dgcnn/tensorflow/part_seg/test.py b/zoo/SimpleView/dgcnn/tensorflow/part_seg/test.py new file mode 100644 index 0000000..ade8590 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/part_seg/test.py @@ -0,0 +1,256 @@ +import argparse +import tensorflow as tf +import json +import numpy as np +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.dirname(BASE_DIR)) +import provider +import part_seg_model as model + +parser = argparse.ArgumentParser() +parser.add_argument('--model_path', default='train_results/trained_models/epoch_160.ckpt', help='Model checkpoint path') +FLAGS = parser.parse_args() + +# DEFAULT SETTINGS +pretrained_model_path = FLAGS.model_path +hdf5_data_dir = os.path.join(BASE_DIR, './hdf5_data') +ply_data_dir = os.path.join(BASE_DIR, './PartAnnotation') +gpu_to_use = 0 +output_dir = os.path.join(BASE_DIR, './test_results') +output_verbose = False + +# MAIN SCRIPT +point_num = 3000 +batch_size = 1 + +test_file_list = os.path.join(BASE_DIR, 'testing_ply_file_list.txt') + +oid2cpid = json.load(open(os.path.join(hdf5_data_dir, 'overallid_to_catid_partid.json'), 'r')) + +object2setofoid = {} +for idx in range(len(oid2cpid)): + objid, pid = oid2cpid[idx] + if not objid in object2setofoid.keys(): + object2setofoid[objid] = [] + object2setofoid[objid].append(idx) + +all_obj_cat_file = os.path.join(hdf5_data_dir, 'all_object_categories.txt') +fin = open(all_obj_cat_file, 'r') +lines = [line.rstrip() for line in fin.readlines()] +objcats = [line.split()[1] for line in lines] +objnames = [line.split()[0] for line in lines] +on2oid = {objcats[i]:i for i in range(len(objcats))} +fin.close() + +color_map_file = os.path.join(hdf5_data_dir, 'part_color_mapping.json') +color_map = json.load(open(color_map_file, 'r')) + +NUM_OBJ_CATS = 16 +NUM_PART_CATS = 50 + +cpid2oid = json.load(open(os.path.join(hdf5_data_dir, 'catid_partid_to_overallid.json'), 'r')) + +def printout(flog, data): + print(data) + flog.write(data + '\n') + +def output_color_point_cloud(data, seg, out_file): + with open(out_file, 'w') as f: + l = len(seg) + for i in range(l): + color = color_map[seg[i]] + f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) + +def output_color_point_cloud_red_blue(data, seg, out_file): + with open(out_file, 'w') as f: + l = len(seg) + for i in range(l): + if seg[i] == 1: + color = [0, 0, 1] + elif seg[i] == 0: + color = [1, 0, 0] + else: + color = [0, 0, 0] + + f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) + + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +def placeholder_inputs(): + pointclouds_ph = tf.placeholder(tf.float32, shape=(batch_size, point_num, 3)) + input_label_ph = tf.placeholder(tf.float32, shape=(batch_size, NUM_OBJ_CATS)) + return pointclouds_ph, input_label_ph + +def output_color_point_cloud(data, seg, out_file): + with open(out_file, 'w') as f: + l = len(seg) + for i in range(l): + color = color_map[seg[i]] + f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) + +def load_pts_seg_files(pts_file, seg_file, catid): + with open(pts_file, 'r') as f: + pts_str = [item.rstrip() for item in f.readlines()] + pts = np.array([np.float32(s.split()) for s in pts_str], dtype=np.float32) + with open(seg_file, 'r') as f: + part_ids = np.array([int(item.rstrip()) for item in f.readlines()], dtype=np.uint8) + seg = np.array([cpid2oid[catid+'_'+str(x)] for x in part_ids]) + return pts, seg + +def pc_augment_to_point_num(pts, pn): + assert(pts.shape[0] <= pn) + cur_len = pts.shape[0] + res = np.array(pts) + while cur_len < pn: + res = np.concatenate((res, pts)) + cur_len += pts.shape[0] + return res[:pn, :] + +def convert_label_to_one_hot(labels): + label_one_hot = np.zeros((labels.shape[0], NUM_OBJ_CATS)) + for idx in range(labels.shape[0]): + label_one_hot[idx, labels[idx]] = 1 + return label_one_hot + +def predict(): + is_training = False + + with tf.device('/gpu:'+str(gpu_to_use)): + pointclouds_ph, input_label_ph = placeholder_inputs() + is_training_ph = tf.placeholder(tf.bool, shape=()) + + seg_pred = model.get_model(pointclouds_ph, input_label_ph, \ + cat_num=NUM_OBJ_CATS, part_num=NUM_PART_CATS, is_training=is_training_ph, \ + batch_size=batch_size, num_point=point_num, weight_decay=0.0, bn_decay=None) + + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + + with tf.Session(config=config) as sess: + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + flog = open(os.path.join(output_dir, 'log.txt'), 'a') + + printout(flog, 'Loading model %s' % pretrained_model_path) + saver.restore(sess, pretrained_model_path) + printout(flog, 'Model restored.') + + batch_data = np.zeros([batch_size, point_num, 3]).astype(np.float32) + + total_acc = 0.0 + total_seen = 0 + total_acc_iou = 0.0 + + total_per_cat_acc = np.zeros((NUM_OBJ_CATS)).astype(np.float32) + total_per_cat_iou = np.zeros((NUM_OBJ_CATS)).astype(np.float32) + total_per_cat_seen = np.zeros((NUM_OBJ_CATS)).astype(np.int32) + + ffiles = open(test_file_list, 'r') + lines = [line.rstrip() for line in ffiles.readlines()] + pts_files = [line.split()[0] for line in lines] + seg_files = [line.split()[1] for line in lines] + labels = [line.split()[2] for line in lines] + ffiles.close() + + len_pts_files = len(pts_files) + for shape_idx in range(len_pts_files): + if shape_idx % 100 == 0: + printout(flog, '%d/%d ...' % (shape_idx, len_pts_files)) + + cur_gt_label = on2oid[labels[shape_idx]] # 0/1/.../15 + + cur_label_one_hot = np.zeros((1, NUM_OBJ_CATS), dtype=np.float32) + cur_label_one_hot[0, cur_gt_label] = 1 + + pts_file_to_load = os.path.join(ply_data_dir, pts_files[shape_idx]) + seg_file_to_load = os.path.join(ply_data_dir, seg_files[shape_idx]) + + pts, seg = load_pts_seg_files(pts_file_to_load, seg_file_to_load, objcats[cur_gt_label]) + ori_point_num = len(seg) + + batch_data[0, ...] = pc_augment_to_point_num(pc_normalize(pts), point_num) + + seg_pred_res = sess.run(seg_pred, feed_dict={ + pointclouds_ph: batch_data, + input_label_ph: cur_label_one_hot, + is_training_ph: is_training}) + + seg_pred_res = seg_pred_res[0, ...] + + iou_oids = object2setofoid[objcats[cur_gt_label]] + non_cat_labels = list(set(np.arange(NUM_PART_CATS)).difference(set(iou_oids))) + + mini = np.min(seg_pred_res) + seg_pred_res[:, non_cat_labels] = mini - 1000 + + seg_pred_val = np.argmax(seg_pred_res, axis=1)[:ori_point_num] + + seg_acc = np.mean(seg_pred_val == seg) + + total_acc += seg_acc + total_seen += 1 + + total_per_cat_seen[cur_gt_label] += 1 + total_per_cat_acc[cur_gt_label] += seg_acc + + mask = np.int32(seg_pred_val == seg) + + total_iou = 0.0 + iou_log = '' + for oid in iou_oids: + n_pred = np.sum(seg_pred_val == oid) + n_gt = np.sum(seg == oid) + n_intersect = np.sum(np.int32(seg == oid) * mask) + n_union = n_pred + n_gt - n_intersect + iou_log += '_' + str(n_pred)+'_'+str(n_gt)+'_'+str(n_intersect)+'_'+str(n_union)+'_' + if n_union == 0: + total_iou += 1 + iou_log += '_1\n' + else: + total_iou += n_intersect * 1.0 / n_union + iou_log += '_'+str(n_intersect * 1.0 / n_union)+'\n' + + avg_iou = total_iou / len(iou_oids) + total_acc_iou += avg_iou + total_per_cat_iou[cur_gt_label] += avg_iou + + if output_verbose: + output_color_point_cloud(pts, seg, os.path.join(output_dir, str(shape_idx)+'_gt.obj')) + output_color_point_cloud(pts, seg_pred_val, os.path.join(output_dir, str(shape_idx)+'_pred.obj')) + output_color_point_cloud_red_blue(pts, np.int32(seg == seg_pred_val), + os.path.join(output_dir, str(shape_idx)+'_diff.obj')) + + with open(os.path.join(output_dir, str(shape_idx)+'.log'), 'w') as fout: + fout.write('Total Point: %d\n\n' % ori_point_num) + fout.write('Ground Truth: %s\n' % objnames[cur_gt_label]) + fout.write('Accuracy: %f\n' % seg_acc) + fout.write('IoU: %f\n\n' % avg_iou) + fout.write('IoU details: %s\n' % iou_log) + + printout(flog, 'Accuracy: %f' % (total_acc / total_seen)) + printout(flog, 'IoU: %f' % (total_acc_iou / total_seen)) + + for cat_idx in range(NUM_OBJ_CATS): + printout(flog, '\t ' + objcats[cat_idx] + ' Total Number: ' + str(total_per_cat_seen[cat_idx])) + if total_per_cat_seen[cat_idx] > 0: + printout(flog, '\t ' + objcats[cat_idx] + ' Accuracy: ' + \ + str(total_per_cat_acc[cat_idx] / total_per_cat_seen[cat_idx])) + printout(flog, '\t ' + objcats[cat_idx] + ' IoU: '+ \ + str(total_per_cat_iou[cat_idx] / total_per_cat_seen[cat_idx])) + +with tf.Graph().as_default(): + predict() diff --git a/zoo/SimpleView/dgcnn/tensorflow/part_seg/testing_ply_file_list.txt b/zoo/SimpleView/dgcnn/tensorflow/part_seg/testing_ply_file_list.txt new file mode 100644 index 0000000..876a443 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/part_seg/testing_ply_file_list.txt @@ -0,0 +1,2874 @@ +03001627/points/355fa0f35b61fdd7aa74a6b5ee13e775.pts 03001627/expert_verified/points_label/355fa0f35b61fdd7aa74a6b5ee13e775.seg 03001627 +04379243/points/408c3db9b4ee6be2e9f3e9c758fef992.pts 04379243/expert_verified/points_label/408c3db9b4ee6be2e9f3e9c758fef992.seg 04379243 +02691156/points/a1708ad923f3b51abbf3143b1cb6076a.pts 02691156/expert_verified/points_label/a1708ad923f3b51abbf3143b1cb6076a.seg 02691156 +03001627/points/2783a969fa42cdecbe31379a5751d820.pts 03001627/expert_verified/points_label/2783a969fa42cdecbe31379a5751d820.seg 03001627 +03001627/points/ed56af61297594bf1c4300651205adf3.pts 03001627/expert_verified/points_label/ed56af61297594bf1c4300651205adf3.seg 03001627 +03001627/points/c0857de5101f704f3c5e1addd9922bf2.pts 03001627/expert_verified/points_label/c0857de5101f704f3c5e1addd9922bf2.seg 03001627 +02691156/points/b72804a8bd3dbbaca8607f540cc62ba.pts 02691156/expert_verified/points_label/b72804a8bd3dbbaca8607f540cc62ba.seg 02691156 +03001627/points/df609533cd186278398c7598b0d2e5d5.pts 03001627/expert_verified/points_label/df609533cd186278398c7598b0d2e5d5.seg 03001627 +04379243/points/c24b7a315dbf2f3178ab7c8b395efbfe.pts 04379243/expert_verified/points_label/c24b7a315dbf2f3178ab7c8b395efbfe.seg 04379243 +03636649/points/b8c87ad9d4930983a8d82fc8a3e54728.pts 03636649/expert_verified/points_label/b8c87ad9d4930983a8d82fc8a3e54728.seg 03636649 +02691156/points/8add45a11c9fcb446eb5821e78d8898a.pts 02691156/expert_verified/points_label/8add45a11c9fcb446eb5821e78d8898a.seg 02691156 +04379243/points/94d6518cf1e00eaac013a7bed5288654.pts 04379243/expert_verified/points_label/94d6518cf1e00eaac013a7bed5288654.seg 04379243 +04379243/points/1dbb8fd083f96ad279b3e1be3524f72f.pts 04379243/expert_verified/points_label/1dbb8fd083f96ad279b3e1be3524f72f.seg 04379243 +03001627/points/452115e132539be4daaaeef365d8f6e5.pts 03001627/expert_verified/points_label/452115e132539be4daaaeef365d8f6e5.seg 03001627 +04379243/points/bd25dfa62c3c2cf772bd03149507655d.pts 04379243/expert_verified/points_label/bd25dfa62c3c2cf772bd03149507655d.seg 04379243 +03948459/points/b1bbe535a833635d91f9af3df5b0c8fc.pts 03948459/expert_verified/points_label/b1bbe535a833635d91f9af3df5b0c8fc.seg 03948459 +04379243/points/d41c8af82fe98a019fb4103277a6b93.pts 04379243/expert_verified/points_label/d41c8af82fe98a019fb4103277a6b93.seg 04379243 +03001627/points/3109a0b9f9bc5fecb4cd1bd556007aed.pts 03001627/expert_verified/points_label/3109a0b9f9bc5fecb4cd1bd556007aed.seg 03001627 +03001627/points/d38129a3301d31350b1fc43ca5e85e.pts 03001627/expert_verified/points_label/d38129a3301d31350b1fc43ca5e85e.seg 03001627 +03636649/points/495af808806f1727a753b1b88fff4abb.pts 03636649/expert_verified/points_label/495af808806f1727a753b1b88fff4abb.seg 03636649 +04379243/points/4d3cc502d4444c848cbb8bac2032149c.pts 04379243/expert_verified/points_label/4d3cc502d4444c848cbb8bac2032149c.seg 04379243 +02691156/points/ed7e1a38fe33830b87697d3904b168b.pts 02691156/expert_verified/points_label/ed7e1a38fe33830b87697d3904b168b.seg 02691156 +04379243/points/cf076ced8264a480cce90f0d61ed7a70.pts 04379243/expert_verified/points_label/cf076ced8264a480cce90f0d61ed7a70.seg 04379243 +04379243/points/c04b363fd824528bd42b9650f19dd425.pts 04379243/expert_verified/points_label/c04b363fd824528bd42b9650f19dd425.seg 04379243 +04379243/points/9705c2610980d0fdb2d0500bdfc28f70.pts 04379243/expert_verified/points_label/9705c2610980d0fdb2d0500bdfc28f70.seg 04379243 +02691156/points/de29a1335c332a5ef7bc9a344bb7bae5.pts 02691156/expert_verified/points_label/de29a1335c332a5ef7bc9a344bb7bae5.seg 02691156 +03001627/points/75d0664363f418efe461a9a9741d9415.pts 03001627/expert_verified/points_label/75d0664363f418efe461a9a9741d9415.seg 03001627 +03001627/points/3421ad5a45b85f7a4b3c42e318f3affc.pts 03001627/expert_verified/points_label/3421ad5a45b85f7a4b3c42e318f3affc.seg 03001627 +03001627/points/c67a255a26e30abb6b9f3980da0b1dff.pts 03001627/expert_verified/points_label/c67a255a26e30abb6b9f3980da0b1dff.seg 03001627 +04379243/points/6791c92944c99c029f1deb04fb8ae481.pts 04379243/expert_verified/points_label/6791c92944c99c029f1deb04fb8ae481.seg 04379243 +04379243/points/4b5536d2e9c5b9b7febad4f49b26ec52.pts 04379243/expert_verified/points_label/4b5536d2e9c5b9b7febad4f49b26ec52.seg 04379243 +04379243/points/c5fc6c1e0d446d37acce1c6e70b58979.pts 04379243/expert_verified/points_label/c5fc6c1e0d446d37acce1c6e70b58979.seg 04379243 +03001627/points/9c8d3c5779871705d22218517e73100.pts 03001627/expert_verified/points_label/9c8d3c5779871705d22218517e73100.seg 03001627 +04379243/points/4f70d14dc276a9539a83764a2641fc5c.pts 04379243/expert_verified/points_label/4f70d14dc276a9539a83764a2641fc5c.seg 04379243 +04379243/points/9d8f0444a8c09adff0d4c8f4dd125299.pts 04379243/expert_verified/points_label/9d8f0444a8c09adff0d4c8f4dd125299.seg 04379243 +04379243/points/57fbb082f660c4f7716b680dedf77108.pts 04379243/expert_verified/points_label/57fbb082f660c4f7716b680dedf77108.seg 04379243 +02958343/points/cb19594e73992a3d51008e496c6cfd2e.pts 02958343/expert_verified/points_label/cb19594e73992a3d51008e496c6cfd2e.seg 02958343 +03624134/points/9d424831d05d363d870906b5178d97bd.pts 03624134/expert_verified/points_label/9d424831d05d363d870906b5178d97bd.seg 03624134 +03001627/points/b884ff155c4117a7508dd48e67ad44bc.pts 03001627/expert_verified/points_label/b884ff155c4117a7508dd48e67ad44bc.seg 03001627 +02958343/points/7a5eba46ba4cfac35aa429db266f0c30.pts 02958343/expert_verified/points_label/7a5eba46ba4cfac35aa429db266f0c30.seg 02958343 +02691156/points/4def53f149137451b0009f08a96f38a9.pts 02691156/expert_verified/points_label/4def53f149137451b0009f08a96f38a9.seg 02691156 +03001627/points/fa8f7c225d3b9f1def4a09e7eb872bd9.pts 03001627/expert_verified/points_label/fa8f7c225d3b9f1def4a09e7eb872bd9.seg 03001627 +04225987/points/f5d7698b5a57d61226e0640b67de606.pts 04225987/expert_verified/points_label/f5d7698b5a57d61226e0640b67de606.seg 04225987 +03001627/points/9aece6c6436cde6fd9ac1bf1eddffd24.pts 03001627/expert_verified/points_label/9aece6c6436cde6fd9ac1bf1eddffd24.seg 03001627 +04099429/points/15474cf9caa757a528eba1f0b7744e9.pts 04099429/expert_verified/points_label/15474cf9caa757a528eba1f0b7744e9.seg 04099429 +02691156/points/571cfb1da3d5b3704b5910188444efc8.pts 02691156/expert_verified/points_label/571cfb1da3d5b3704b5910188444efc8.seg 02691156 +03636649/points/5d97be0e2414bfe0a8930422448288ea.pts 03636649/expert_verified/points_label/5d97be0e2414bfe0a8930422448288ea.seg 03636649 +02958343/points/648ceaad362345518a6cf8c6b92417f2.pts 02958343/expert_verified/points_label/648ceaad362345518a6cf8c6b92417f2.seg 02958343 +03001627/points/8a845bb67ee8486d6199d6fe090be061.pts 03001627/expert_verified/points_label/8a845bb67ee8486d6199d6fe090be061.seg 03001627 +04379243/points/3645a90e02d16f0584aa8fa8b66ba302.pts 04379243/expert_verified/points_label/3645a90e02d16f0584aa8fa8b66ba302.seg 04379243 +04379243/points/ecf3d40b14300d3c0c26b04b6b8e17a.pts 04379243/expert_verified/points_label/ecf3d40b14300d3c0c26b04b6b8e17a.seg 04379243 +04379243/points/a860e5edcaec268e615bcf72f8385966.pts 04379243/expert_verified/points_label/a860e5edcaec268e615bcf72f8385966.seg 04379243 +03001627/points/5edfec789343e0c3319f1c1eee46f332.pts 03001627/expert_verified/points_label/5edfec789343e0c3319f1c1eee46f332.seg 03001627 +02691156/points/92fb0d6a866fe7aca8607f540cc62ba.pts 02691156/expert_verified/points_label/92fb0d6a866fe7aca8607f540cc62ba.seg 02691156 +02958343/points/e4886a4d0c6ea960fe21694bd5f519d1.pts 02958343/expert_verified/points_label/e4886a4d0c6ea960fe21694bd5f519d1.seg 02958343 +03636649/points/e3ee6b31e54e95b7d42b9650f19dd425.pts 03636649/expert_verified/points_label/e3ee6b31e54e95b7d42b9650f19dd425.seg 03636649 +03467517/points/d546e034a6c659a425cd348738a8052a.pts 03467517/expert_verified/points_label/d546e034a6c659a425cd348738a8052a.seg 03467517 +03001627/points/26a6ce644504c5fa22963ea1e168015d.pts 03001627/expert_verified/points_label/26a6ce644504c5fa22963ea1e168015d.seg 03001627 +02691156/points/b2b1c1d5c757af8a7209009cfb89d4bd.pts 02691156/expert_verified/points_label/b2b1c1d5c757af8a7209009cfb89d4bd.seg 02691156 +03467517/points/4bd2492d56d6b8c537b5646da91e9ed0.pts 03467517/expert_verified/points_label/4bd2492d56d6b8c537b5646da91e9ed0.seg 03467517 +04379243/points/92ed9344484dd026dfd21203bf8b4b46.pts 04379243/expert_verified/points_label/92ed9344484dd026dfd21203bf8b4b46.seg 04379243 +04379243/points/2d1d8a2f976387bd3145205f02ff9fc5.pts 04379243/expert_verified/points_label/2d1d8a2f976387bd3145205f02ff9fc5.seg 04379243 +03467517/points/5b7fcd85ce6fd1931377689fa4e4b2d6.pts 03467517/expert_verified/points_label/5b7fcd85ce6fd1931377689fa4e4b2d6.seg 03467517 +02691156/points/4cee36a2e8dd3b24b87697d3904b168b.pts 02691156/expert_verified/points_label/4cee36a2e8dd3b24b87697d3904b168b.seg 02691156 +03001627/points/f23c1bb951fa8909bc01640b1b5116e7.pts 03001627/expert_verified/points_label/f23c1bb951fa8909bc01640b1b5116e7.seg 03001627 +04379243/points/370b45eeeb9b11416f04d49e4de95b59.pts 04379243/expert_verified/points_label/370b45eeeb9b11416f04d49e4de95b59.seg 04379243 +03001627/points/3885255ca5d75e69da2260dc4a1fc2c6.pts 03001627/expert_verified/points_label/3885255ca5d75e69da2260dc4a1fc2c6.seg 03001627 +02691156/points/452c18f8997c53741adbb4c4e06ad649.pts 02691156/expert_verified/points_label/452c18f8997c53741adbb4c4e06ad649.seg 02691156 +03001627/points/8b39b501c9fa4d349b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/8b39b501c9fa4d349b9f2eb77f5e247e.seg 03001627 +04379243/points/94966aa8a7a6f540f6807434c358ea12.pts 04379243/expert_verified/points_label/94966aa8a7a6f540f6807434c358ea12.seg 04379243 +03001627/points/9b6f17ce2db29c4c9ae35d137ece64f9.pts 03001627/expert_verified/points_label/9b6f17ce2db29c4c9ae35d137ece64f9.seg 03001627 +03467517/points/85bef84a26a91bff9ce363b13bdd195d.pts 03467517/expert_verified/points_label/85bef84a26a91bff9ce363b13bdd195d.seg 03467517 +03624134/points/e98bc872371c852e15b040d25222e627.pts 03624134/expert_verified/points_label/e98bc872371c852e15b040d25222e627.seg 03624134 +04379243/points/5dff67091a2f7ef1ab988fe471b1bd06.pts 04379243/expert_verified/points_label/5dff67091a2f7ef1ab988fe471b1bd06.seg 04379243 +03001627/points/e6f37dff25ec4ca4f815ebdb2df45512.pts 03001627/expert_verified/points_label/e6f37dff25ec4ca4f815ebdb2df45512.seg 03001627 +02691156/points/85a15c26a6e9921ae008cc4902bfe3cd.pts 02691156/expert_verified/points_label/85a15c26a6e9921ae008cc4902bfe3cd.seg 02691156 +03001627/points/94371ddd6d62f7b762ec387b772e9e1.pts 03001627/expert_verified/points_label/94371ddd6d62f7b762ec387b772e9e1.seg 03001627 +02691156/points/4374a3b4b98e247b398db3ebdf468ed7.pts 02691156/expert_verified/points_label/4374a3b4b98e247b398db3ebdf468ed7.seg 02691156 +03948459/points/8fa02aab7237289667fdfbdf64f19325.pts 03948459/expert_verified/points_label/8fa02aab7237289667fdfbdf64f19325.seg 03948459 +04379243/points/9f1fcee83cacf964f4b6538438a0b930.pts 04379243/expert_verified/points_label/9f1fcee83cacf964f4b6538438a0b930.seg 04379243 +04225987/points/f5643778dbcd653655a834a7aafb0236.pts 04225987/expert_verified/points_label/f5643778dbcd653655a834a7aafb0236.seg 04225987 +03636649/points/cdbe11124dbf418167ac0fa90111fad0.pts 03636649/expert_verified/points_label/cdbe11124dbf418167ac0fa90111fad0.seg 03636649 +03001627/points/e3d23dc47ddd9620c9be65dfbd21428b.pts 03001627/expert_verified/points_label/e3d23dc47ddd9620c9be65dfbd21428b.seg 03001627 +03001627/points/efd0411eaf2396c4de7ed732f5aeea4.pts 03001627/expert_verified/points_label/efd0411eaf2396c4de7ed732f5aeea4.seg 03001627 +03636649/points/7ad15667f654fc08664b3b9b23ddfcbc.pts 03636649/expert_verified/points_label/7ad15667f654fc08664b3b9b23ddfcbc.seg 03636649 +04379243/points/55d5fce641343449d42b9650f19dd425.pts 04379243/expert_verified/points_label/55d5fce641343449d42b9650f19dd425.seg 04379243 +03467517/points/a31ef3a8c70b789b93f0194265a9746c.pts 03467517/expert_verified/points_label/a31ef3a8c70b789b93f0194265a9746c.seg 03467517 +03001627/points/ccfc857f35c138ede785b88cc9024b2a.pts 03001627/expert_verified/points_label/ccfc857f35c138ede785b88cc9024b2a.seg 03001627 +02691156/points/e3fd510add7b1aa3c19eb6ab3736de88.pts 02691156/expert_verified/points_label/e3fd510add7b1aa3c19eb6ab3736de88.seg 02691156 +03636649/points/213d911cc489c352b5db3f95d706a0c9.pts 03636649/expert_verified/points_label/213d911cc489c352b5db3f95d706a0c9.seg 03636649 +04225987/points/c171d90db4c4ba56cdb1768065dafd0c.pts 04225987/expert_verified/points_label/c171d90db4c4ba56cdb1768065dafd0c.seg 04225987 +03797390/points/10f6e09036350e92b3f21f1137c3c347.pts 03797390/expert_verified/points_label/10f6e09036350e92b3f21f1137c3c347.seg 03797390 +02691156/points/a374b0448461438ef3d4cc10d9776c62.pts 02691156/expert_verified/points_label/a374b0448461438ef3d4cc10d9776c62.seg 02691156 +03001627/points/b6457a76f24de9f67aa6f8353fce2005.pts 03001627/expert_verified/points_label/b6457a76f24de9f67aa6f8353fce2005.seg 03001627 +03001627/points/7fe08cd7a9b76c1dcbde89e0c48a01bf.pts 03001627/expert_verified/points_label/7fe08cd7a9b76c1dcbde89e0c48a01bf.seg 03001627 +03001627/points/58867a00409c47c0813a1237d2827540.pts 03001627/expert_verified/points_label/58867a00409c47c0813a1237d2827540.seg 03001627 +02958343/points/65e3e2893669a09cc7b48e36e31209b9.pts 02958343/expert_verified/points_label/65e3e2893669a09cc7b48e36e31209b9.seg 02958343 +03948459/points/edec08542b9312b712b38b1d99376c0b.pts 03948459/expert_verified/points_label/edec08542b9312b712b38b1d99376c0b.seg 03948459 +03636649/points/cd80cc92cf732e8d8a17805dbfb751e2.pts 03636649/expert_verified/points_label/cd80cc92cf732e8d8a17805dbfb751e2.seg 03636649 +03467517/points/87650e8ff3d85672381b7fbf79296afb.pts 03467517/expert_verified/points_label/87650e8ff3d85672381b7fbf79296afb.seg 03467517 +03636649/points/1e91664763d371937dd73da65dc0e6a7.pts 03636649/expert_verified/points_label/1e91664763d371937dd73da65dc0e6a7.seg 03636649 +04379243/points/104c8e90ecf0e5351ed672982b7954af.pts 04379243/expert_verified/points_label/104c8e90ecf0e5351ed672982b7954af.seg 04379243 +04379243/points/1834fac2f46a26f91933ffef19678834.pts 04379243/expert_verified/points_label/1834fac2f46a26f91933ffef19678834.seg 04379243 +04379243/points/ed0be8928caab4bdab610b0c94236463.pts 04379243/expert_verified/points_label/ed0be8928caab4bdab610b0c94236463.seg 04379243 +04379243/points/105f53a6471f3ceb4a420e3c1b966720.pts 04379243/expert_verified/points_label/105f53a6471f3ceb4a420e3c1b966720.seg 04379243 +04379243/points/7bf5f689da285153583ff8a5fc7c1869.pts 04379243/expert_verified/points_label/7bf5f689da285153583ff8a5fc7c1869.seg 04379243 +02958343/points/eface8341d001e9ceb01ae4a4788bd4f.pts 02958343/expert_verified/points_label/eface8341d001e9ceb01ae4a4788bd4f.seg 02958343 +03001627/points/517880899d26080471a782a4379556c7.pts 03001627/expert_verified/points_label/517880899d26080471a782a4379556c7.seg 03001627 +03001627/points/5ef3e4abd4386c8871bc6030acc85f1e.pts 03001627/expert_verified/points_label/5ef3e4abd4386c8871bc6030acc85f1e.seg 03001627 +03001627/points/3eb60e6679d1df1dde7eedbb2790491b.pts 03001627/expert_verified/points_label/3eb60e6679d1df1dde7eedbb2790491b.seg 03001627 +03001627/points/4702e6196503ff84f1c0e03f321d0b20.pts 03001627/expert_verified/points_label/4702e6196503ff84f1c0e03f321d0b20.seg 03001627 +02958343/points/b0a7789537663f7ba1ff2929b2f5cf19.pts 02958343/expert_verified/points_label/b0a7789537663f7ba1ff2929b2f5cf19.seg 02958343 +03636649/points/2ce7732982343c1d9792f6094a78f8d5.pts 03636649/expert_verified/points_label/2ce7732982343c1d9792f6094a78f8d5.seg 03636649 +03467517/points/78a75ce8dc8dc197dc2b574e941c815b.pts 03467517/expert_verified/points_label/78a75ce8dc8dc197dc2b574e941c815b.seg 03467517 +03636649/points/348d6ddf9e02cbddf647dc544bb0ab61.pts 03636649/expert_verified/points_label/348d6ddf9e02cbddf647dc544bb0ab61.seg 03636649 +03001627/points/e56087cd55cce8b4f41a4361d0ca9bc8.pts 03001627/expert_verified/points_label/e56087cd55cce8b4f41a4361d0ca9bc8.seg 03001627 +03642806/points/4d3dde22f529195bc887d5d9a11f3155.pts 03642806/expert_verified/points_label/4d3dde22f529195bc887d5d9a11f3155.seg 03642806 +03001627/points/78e1977bc5f0f4041552c6ecbda964b.pts 03001627/expert_verified/points_label/78e1977bc5f0f4041552c6ecbda964b.seg 03001627 +04379243/points/44360c91a7e91098d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/44360c91a7e91098d93768e7b9b1eabf.seg 04379243 +02691156/points/52ca6970fb09b561f9f7510373841dd9.pts 02691156/expert_verified/points_label/52ca6970fb09b561f9f7510373841dd9.seg 02691156 +02958343/points/383f8d508b6f25f565d21723f535417.pts 02958343/expert_verified/points_label/383f8d508b6f25f565d21723f535417.seg 02958343 +03001627/points/d6da5457b0682e24696b74614952b2d0.pts 03001627/expert_verified/points_label/d6da5457b0682e24696b74614952b2d0.seg 03001627 +02691156/points/9f5dda6f01bbe29bf810506e9ae2dcc2.pts 02691156/expert_verified/points_label/9f5dda6f01bbe29bf810506e9ae2dcc2.seg 02691156 +03467517/points/35e77edd3ae6ad4993f0194265a9746c.pts 03467517/expert_verified/points_label/35e77edd3ae6ad4993f0194265a9746c.seg 03467517 +03001627/points/590d04438aeffbb58f447453fccbd9d3.pts 03001627/expert_verified/points_label/590d04438aeffbb58f447453fccbd9d3.seg 03001627 +03001627/points/cdfa898eadf316122056b4bd5d870b47.pts 03001627/expert_verified/points_label/cdfa898eadf316122056b4bd5d870b47.seg 03001627 +03001627/points/8e678a54f2ee4e5e492d9da2668ec34c.pts 03001627/expert_verified/points_label/8e678a54f2ee4e5e492d9da2668ec34c.seg 03001627 +04379243/points/1804dd6f5c827c1a4bf8d5f43e57b138.pts 04379243/expert_verified/points_label/1804dd6f5c827c1a4bf8d5f43e57b138.seg 04379243 +02691156/points/23eed87ac79f1b152f9c405cf0817830.pts 02691156/expert_verified/points_label/23eed87ac79f1b152f9c405cf0817830.seg 02691156 +02691156/points/97bc5fffde64178f43afdb9c81ff2967.pts 02691156/expert_verified/points_label/97bc5fffde64178f43afdb9c81ff2967.seg 02691156 +03001627/points/3b1f1913f2bc0dc171dbe96559c7bcae.pts 03001627/expert_verified/points_label/3b1f1913f2bc0dc171dbe96559c7bcae.seg 03001627 +04379243/points/82e1c0b874b0a9e035cd53a06b1d2317.pts 04379243/expert_verified/points_label/82e1c0b874b0a9e035cd53a06b1d2317.seg 04379243 +03001627/points/e0a0d5c2ba6fdca215b55266697a17be.pts 03001627/expert_verified/points_label/e0a0d5c2ba6fdca215b55266697a17be.seg 03001627 +03636649/points/9b558be5e2b60e3eb09f0ca9c143fdfd.pts 03636649/expert_verified/points_label/9b558be5e2b60e3eb09f0ca9c143fdfd.seg 03636649 +03001627/points/813be9a8485050571563f0911e3e5fc0.pts 03001627/expert_verified/points_label/813be9a8485050571563f0911e3e5fc0.seg 03001627 +02958343/points/6ca9967adcf862a461c6c61410fc904b.pts 02958343/expert_verified/points_label/6ca9967adcf862a461c6c61410fc904b.seg 02958343 +03624134/points/5663637633c938d1395331ebe4786cd.pts 03624134/expert_verified/points_label/5663637633c938d1395331ebe4786cd.seg 03624134 +03636649/points/ec8dc2311d381a9e3d39d8012919dd25.pts 03636649/expert_verified/points_label/ec8dc2311d381a9e3d39d8012919dd25.seg 03636649 +04379243/points/b685208ccf38786a6f1e07a56c129dfc.pts 04379243/expert_verified/points_label/b685208ccf38786a6f1e07a56c129dfc.seg 04379243 +03636649/points/ce621e6df1ab9ae35d2cdb96c1afe34.pts 03636649/expert_verified/points_label/ce621e6df1ab9ae35d2cdb96c1afe34.seg 03636649 +02691156/points/b092d523bdd320e4ca8607f540cc62ba.pts 02691156/expert_verified/points_label/b092d523bdd320e4ca8607f540cc62ba.seg 02691156 +04379243/points/401fe961ec7b0cb5dcfcef693e7ec696.pts 04379243/expert_verified/points_label/401fe961ec7b0cb5dcfcef693e7ec696.seg 04379243 +04225987/points/1e5fd1de723cc66cbb1ed6d4d8526a19.pts 04225987/expert_verified/points_label/1e5fd1de723cc66cbb1ed6d4d8526a19.seg 04225987 +03001627/points/b987a2ca54c6ddecb74697ced5978572.pts 03001627/expert_verified/points_label/b987a2ca54c6ddecb74697ced5978572.seg 03001627 +04379243/points/3e42e3386f4aea9277cf3bb06f394ad.pts 04379243/expert_verified/points_label/3e42e3386f4aea9277cf3bb06f394ad.seg 04379243 +02958343/points/1198255e3d20d2f323f3ca54768fe2ee.pts 02958343/expert_verified/points_label/1198255e3d20d2f323f3ca54768fe2ee.seg 02958343 +04379243/points/2b564ff0989caf58ab610b0c94236463.pts 04379243/expert_verified/points_label/2b564ff0989caf58ab610b0c94236463.seg 04379243 +03636649/points/941271c5d9b192eaccd8f9b9403fd602.pts 03636649/expert_verified/points_label/941271c5d9b192eaccd8f9b9403fd602.seg 03636649 +02691156/points/6aeae52e38f892a7e0091ae06332b2d5.pts 02691156/expert_verified/points_label/6aeae52e38f892a7e0091ae06332b2d5.seg 02691156 +04379243/points/4cdfd605352adcb0da13974b3533fb59.pts 04379243/expert_verified/points_label/4cdfd605352adcb0da13974b3533fb59.seg 04379243 +04379243/points/7c24e4f8778e224799a5e8f6c5baa224.pts 04379243/expert_verified/points_label/7c24e4f8778e224799a5e8f6c5baa224.seg 04379243 +03001627/points/6272c21e439e0205c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/6272c21e439e0205c8687ff9b0b4e4ac.seg 03001627 +02691156/points/acd8f367c36a3d84fc7a6d75b3d807ff.pts 02691156/expert_verified/points_label/acd8f367c36a3d84fc7a6d75b3d807ff.seg 02691156 +04379243/points/d58bdda16e6bba6f796740c80be6053.pts 04379243/expert_verified/points_label/d58bdda16e6bba6f796740c80be6053.seg 04379243 +03636649/points/f97506704760741b460fa882e24b7e4a.pts 03636649/expert_verified/points_label/f97506704760741b460fa882e24b7e4a.seg 03636649 +03636649/points/9f5c3ea9f8254b8bd42b9650f19dd425.pts 03636649/expert_verified/points_label/9f5c3ea9f8254b8bd42b9650f19dd425.seg 03636649 +03797390/points/79e673336e836d1333becb3a9550cbb1.pts 03797390/expert_verified/points_label/79e673336e836d1333becb3a9550cbb1.seg 03797390 +03948459/points/2d573d37cce5b48b9f433921788191f3.pts 03948459/expert_verified/points_label/2d573d37cce5b48b9f433921788191f3.seg 03948459 +04379243/points/7aaad1c5c2be8c24a9ed7bb5b55809f8.pts 04379243/expert_verified/points_label/7aaad1c5c2be8c24a9ed7bb5b55809f8.seg 04379243 +04379243/points/c6c412c771ab0ae015a34fa27bdf3d03.pts 04379243/expert_verified/points_label/c6c412c771ab0ae015a34fa27bdf3d03.seg 04379243 +03467517/points/819251e11b46438ff6ff9bebca919581.pts 03467517/expert_verified/points_label/819251e11b46438ff6ff9bebca919581.seg 03467517 +03001627/points/51f4ea68be319fe8990e5087098e19c.pts 03001627/expert_verified/points_label/51f4ea68be319fe8990e5087098e19c.seg 03001627 +03467517/points/66b24797480ba515d57700c05b1862d8.pts 03467517/expert_verified/points_label/66b24797480ba515d57700c05b1862d8.seg 03467517 +03790512/points/9d3b07f4475d501e8249f134aca4c817.pts 03790512/expert_verified/points_label/9d3b07f4475d501e8249f134aca4c817.seg 03790512 +04379243/points/72cfb60a075369ab7252c133a7e17d94.pts 04379243/expert_verified/points_label/72cfb60a075369ab7252c133a7e17d94.seg 04379243 +04379243/points/12a2733fc5f6b31ef8574543281e850f.pts 04379243/expert_verified/points_label/12a2733fc5f6b31ef8574543281e850f.seg 04379243 +03636649/points/aed950102f1e9c7a659dda512294c744.pts 03636649/expert_verified/points_label/aed950102f1e9c7a659dda512294c744.seg 03636649 +03001627/points/3126c6e9277b775b245ac1812a4e4d0c.pts 03001627/expert_verified/points_label/3126c6e9277b775b245ac1812a4e4d0c.seg 03001627 +02958343/points/8decf42b145f98d148d2ba4615e03b21.pts 02958343/expert_verified/points_label/8decf42b145f98d148d2ba4615e03b21.seg 02958343 +03467517/points/2f9bd6e61e038d8fd4b4ae2ff4c58b57.pts 03467517/expert_verified/points_label/2f9bd6e61e038d8fd4b4ae2ff4c58b57.seg 03467517 +03467517/points/6a983b2ff1b8a42e1285d7bfa3e922e4.pts 03467517/expert_verified/points_label/6a983b2ff1b8a42e1285d7bfa3e922e4.seg 03467517 +03261776/points/e33d6e8e39a75268957b6a4f3924d982.pts 03261776/expert_verified/points_label/e33d6e8e39a75268957b6a4f3924d982.seg 03261776 +04379243/points/fe2f2b120d84ed909b896cf832106977.pts 04379243/expert_verified/points_label/fe2f2b120d84ed909b896cf832106977.seg 04379243 +02958343/points/1328a95d69cefe32f200a72c9245aee7.pts 02958343/expert_verified/points_label/1328a95d69cefe32f200a72c9245aee7.seg 02958343 +03001627/points/58409b308683d908ca2bec46a3b47519.pts 03001627/expert_verified/points_label/58409b308683d908ca2bec46a3b47519.seg 03001627 +03001627/points/507a5070cde81fd867936ca58e67cec6.pts 03001627/expert_verified/points_label/507a5070cde81fd867936ca58e67cec6.seg 03001627 +04379243/points/ec68e1edbb7e9bc7e93cebb6ba9ca43e.pts 04379243/expert_verified/points_label/ec68e1edbb7e9bc7e93cebb6ba9ca43e.seg 04379243 +03001627/points/7facccfa81369078a8930422448288ea.pts 03001627/expert_verified/points_label/7facccfa81369078a8930422448288ea.seg 03001627 +03001627/points/be0c5a0e91c99e804e1a714ee619465a.pts 03001627/expert_verified/points_label/be0c5a0e91c99e804e1a714ee619465a.seg 03001627 +03001627/points/d73e46e07bdb3fe75fe4ecea39e8bd40.pts 03001627/expert_verified/points_label/d73e46e07bdb3fe75fe4ecea39e8bd40.seg 03001627 +03636649/points/122fb7bfa09c184ca249f8489bc060dd.pts 03636649/expert_verified/points_label/122fb7bfa09c184ca249f8489bc060dd.seg 03636649 +03001627/points/9ef3323c6ced7dfef313a0fb5fd4d79.pts 03001627/expert_verified/points_label/9ef3323c6ced7dfef313a0fb5fd4d79.seg 03001627 +02691156/points/d8452d4fe51f2bab3554ccf8c30febe7.pts 02691156/expert_verified/points_label/d8452d4fe51f2bab3554ccf8c30febe7.seg 02691156 +02691156/points/d59d75f52ac9b241ae0d772a1c85134a.pts 02691156/expert_verified/points_label/d59d75f52ac9b241ae0d772a1c85134a.seg 02691156 +02691156/points/f9e80ce23d9536623fddedb0bf24c68a.pts 02691156/expert_verified/points_label/f9e80ce23d9536623fddedb0bf24c68a.seg 02691156 +02691156/points/e69631d34410f99ac4f72bf08dc79a6.pts 02691156/expert_verified/points_label/e69631d34410f99ac4f72bf08dc79a6.seg 02691156 +04379243/points/f7196ec7d732af5166decb1b3cdc5557.pts 04379243/expert_verified/points_label/f7196ec7d732af5166decb1b3cdc5557.seg 04379243 +03261776/points/c5e47b627cb7818f17e22b7299bb7bc6.pts 03261776/expert_verified/points_label/c5e47b627cb7818f17e22b7299bb7bc6.seg 03261776 +03001627/points/5a60c649a221293d72ed554eb3baedcc.pts 03001627/expert_verified/points_label/5a60c649a221293d72ed554eb3baedcc.seg 03001627 +04379243/points/b117aac2e13630bb5d23c9bbb429abf9.pts 04379243/expert_verified/points_label/b117aac2e13630bb5d23c9bbb429abf9.seg 04379243 +03642806/points/e4c34c87ed1bc2191ef7a71d6e01357e.pts 03642806/expert_verified/points_label/e4c34c87ed1bc2191ef7a71d6e01357e.seg 03642806 +02691156/points/3fb7ceab42d7b17219ba010ddb4974fe.pts 02691156/expert_verified/points_label/3fb7ceab42d7b17219ba010ddb4974fe.seg 02691156 +04379243/points/fc472163ea149f8e19fb4103277a6b93.pts 04379243/expert_verified/points_label/fc472163ea149f8e19fb4103277a6b93.seg 04379243 +03001627/points/5ef73c9bee1b4adcd019a8a03d4a2a3.pts 03001627/expert_verified/points_label/5ef73c9bee1b4adcd019a8a03d4a2a3.seg 03001627 +02691156/points/384e72f69e6f24404cb288947cda4a2c.pts 02691156/expert_verified/points_label/384e72f69e6f24404cb288947cda4a2c.seg 02691156 +03636649/points/3fca250636e2b47a8d0fc77aab7a8d33.pts 03636649/expert_verified/points_label/3fca250636e2b47a8d0fc77aab7a8d33.seg 03636649 +04379243/points/46957ba752c3554bd42b9650f19dd425.pts 04379243/expert_verified/points_label/46957ba752c3554bd42b9650f19dd425.seg 04379243 +03001627/points/bce7ff621a5440bb34ee5c94ebdf7f1d.pts 03001627/expert_verified/points_label/bce7ff621a5440bb34ee5c94ebdf7f1d.seg 03001627 +02691156/points/66ae19841350ac2d4ba2821676102936.pts 02691156/expert_verified/points_label/66ae19841350ac2d4ba2821676102936.seg 02691156 +03001627/points/e53b07b648e8d041107a17cfae0b6df6.pts 03001627/expert_verified/points_label/e53b07b648e8d041107a17cfae0b6df6.seg 03001627 +03624134/points/d1c757548ead4a4d8d03ca4865da5b6.pts 03624134/expert_verified/points_label/d1c757548ead4a4d8d03ca4865da5b6.seg 03624134 +04379243/points/d19b4bde0766723c9b3bb0ef2a08be04.pts 04379243/expert_verified/points_label/d19b4bde0766723c9b3bb0ef2a08be04.seg 04379243 +03001627/points/6ecec258a1b6fe2a6fee8e2140acec9.pts 03001627/expert_verified/points_label/6ecec258a1b6fe2a6fee8e2140acec9.seg 03001627 +02691156/points/ab95a4e7f2d3cf9ca8607f540cc62ba.pts 02691156/expert_verified/points_label/ab95a4e7f2d3cf9ca8607f540cc62ba.seg 02691156 +03624134/points/b61c9b5f29ad581c860a45e027159a9a.pts 03624134/expert_verified/points_label/b61c9b5f29ad581c860a45e027159a9a.seg 03624134 +03001627/points/c7da2d72f9927f1881dff5c2e57ad46e.pts 03001627/expert_verified/points_label/c7da2d72f9927f1881dff5c2e57ad46e.seg 03001627 +04379243/points/b9886dd3c4a651f3664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/b9886dd3c4a651f3664b3b9b23ddfcbc.seg 04379243 +02691156/points/abc465975af79827dfb86dddee1d6ac3.pts 02691156/expert_verified/points_label/abc465975af79827dfb86dddee1d6ac3.seg 02691156 +03636649/points/7be01530bf43f2ed8a83637b92bdc7.pts 03636649/expert_verified/points_label/7be01530bf43f2ed8a83637b92bdc7.seg 03636649 +02691156/points/b81339a2f1dbc0de9598ceb95c7f0752.pts 02691156/expert_verified/points_label/b81339a2f1dbc0de9598ceb95c7f0752.seg 02691156 +03001627/points/69709cb300ae3784ee72e5c46412e9a7.pts 03001627/expert_verified/points_label/69709cb300ae3784ee72e5c46412e9a7.seg 03001627 +03001627/points/ec25a41ca233ed096e5a467428553af2.pts 03001627/expert_verified/points_label/ec25a41ca233ed096e5a467428553af2.seg 03001627 +04379243/points/4e9394f9f64859aef4ef86403cccc399.pts 04379243/expert_verified/points_label/4e9394f9f64859aef4ef86403cccc399.seg 04379243 +04379243/points/c477235c02413bfc44d2ca62bee212a0.pts 04379243/expert_verified/points_label/c477235c02413bfc44d2ca62bee212a0.seg 04379243 +04379243/points/41b0491fdb14d41bd25ca1a27cf9bdec.pts 04379243/expert_verified/points_label/41b0491fdb14d41bd25ca1a27cf9bdec.seg 04379243 +02691156/points/59eecc0a983a27a8130cc35407fba74a.pts 02691156/expert_verified/points_label/59eecc0a983a27a8130cc35407fba74a.seg 02691156 +03467517/points/22129fab1497437cc3f912172873d52f.pts 03467517/expert_verified/points_label/22129fab1497437cc3f912172873d52f.seg 03467517 +04379243/points/6365205d2324234fc8a1efeb4b91d393.pts 04379243/expert_verified/points_label/6365205d2324234fc8a1efeb4b91d393.seg 04379243 +03001627/points/2a75b2bb82d7f77c3f9d6e0ade5188b0.pts 03001627/expert_verified/points_label/2a75b2bb82d7f77c3f9d6e0ade5188b0.seg 03001627 +03001627/points/8f226d6b3089d3b7bca860dd9b04c52c.pts 03001627/expert_verified/points_label/8f226d6b3089d3b7bca860dd9b04c52c.seg 03001627 +03624134/points/5e515b18ed17a418b056c98b2e5e5e4e.pts 03624134/expert_verified/points_label/5e515b18ed17a418b056c98b2e5e5e4e.seg 03624134 +02691156/points/5bc41589eba11a4e15477d594f1fbd99.pts 02691156/expert_verified/points_label/5bc41589eba11a4e15477d594f1fbd99.seg 02691156 +03001627/points/2bbf00f0c583fd8a4b3c42e318f3affc.pts 03001627/expert_verified/points_label/2bbf00f0c583fd8a4b3c42e318f3affc.seg 03001627 +03790512/points/9e9300a6e1caec217395d58407f193ba.pts 03790512/expert_verified/points_label/9e9300a6e1caec217395d58407f193ba.seg 03790512 +03636649/points/81894e0739e3fea9d49b2e04785f8492.pts 03636649/expert_verified/points_label/81894e0739e3fea9d49b2e04785f8492.seg 03636649 +02958343/points/cdc8453c63ffc13e20f29d4da2b76f7a.pts 02958343/expert_verified/points_label/cdc8453c63ffc13e20f29d4da2b76f7a.seg 02958343 +04379243/points/7a0b6685a30298fb8ae8d7de284e7d2.pts 04379243/expert_verified/points_label/7a0b6685a30298fb8ae8d7de284e7d2.seg 04379243 +03001627/points/c5ee6b77f9f84adeed52100e321c9f3e.pts 03001627/expert_verified/points_label/c5ee6b77f9f84adeed52100e321c9f3e.seg 03001627 +04379243/points/4e87db85d5dab96822339a4b4aacca6b.pts 04379243/expert_verified/points_label/4e87db85d5dab96822339a4b4aacca6b.seg 04379243 +02958343/points/6dbae14e481e8fb9333e0bf0b765fa12.pts 02958343/expert_verified/points_label/6dbae14e481e8fb9333e0bf0b765fa12.seg 02958343 +03467517/points/bad8978268948ea3d3eb77b119df6d.pts 03467517/expert_verified/points_label/bad8978268948ea3d3eb77b119df6d.seg 03467517 +03001627/points/c552529c54b0612e53041c49040be3d5.pts 03001627/expert_verified/points_label/c552529c54b0612e53041c49040be3d5.seg 03001627 +02958343/points/dca8ed788347b28c171cf359a50c99bc.pts 02958343/expert_verified/points_label/dca8ed788347b28c171cf359a50c99bc.seg 02958343 +04379243/points/99720647e210078beaf288f952624966.pts 04379243/expert_verified/points_label/99720647e210078beaf288f952624966.seg 04379243 +03001627/points/b1f4b2c32f8a2fa77ee217c21e683487.pts 03001627/expert_verified/points_label/b1f4b2c32f8a2fa77ee217c21e683487.seg 03001627 +04379243/points/41cdb5b619790d5a74eb542502c2205f.pts 04379243/expert_verified/points_label/41cdb5b619790d5a74eb542502c2205f.seg 04379243 +04379243/points/a25141a07c77c25467de2aaf749e5256.pts 04379243/expert_verified/points_label/a25141a07c77c25467de2aaf749e5256.seg 04379243 +04379243/points/e9c3a3aa2278608bec15b38012222fa8.pts 04379243/expert_verified/points_label/e9c3a3aa2278608bec15b38012222fa8.seg 04379243 +03636649/points/8e025c4aa0b0201a81a172d69c52a28a.pts 03636649/expert_verified/points_label/8e025c4aa0b0201a81a172d69c52a28a.seg 03636649 +03001627/points/e175bc785390e8f6c05575120a46cd3b.pts 03001627/expert_verified/points_label/e175bc785390e8f6c05575120a46cd3b.seg 03001627 +02691156/points/ecb4ae05d7dd135a619550d2af0b6117.pts 02691156/expert_verified/points_label/ecb4ae05d7dd135a619550d2af0b6117.seg 02691156 +02691156/points/87069f21b11c180799a771d197c7b487.pts 02691156/expert_verified/points_label/87069f21b11c180799a771d197c7b487.seg 02691156 +02691156/points/ca11efc8928c10908b96ae1a0a8b84ec.pts 02691156/expert_verified/points_label/ca11efc8928c10908b96ae1a0a8b84ec.seg 02691156 +03790512/points/365c1f92a54c8cb52a45a87054fa7272.pts 03790512/expert_verified/points_label/365c1f92a54c8cb52a45a87054fa7272.seg 03790512 +03636649/points/23040992da19679aaa7cb30470f3273c.pts 03636649/expert_verified/points_label/23040992da19679aaa7cb30470f3273c.seg 03636649 +02691156/points/9441549e323552f2f001dddaf44c449b.pts 02691156/expert_verified/points_label/9441549e323552f2f001dddaf44c449b.seg 02691156 +02958343/points/17bfc66c6bc0a99d68c415156b102065.pts 02958343/expert_verified/points_label/17bfc66c6bc0a99d68c415156b102065.seg 02958343 +03001627/points/671d34c27cc0f1bf2deeb5ec76cf103b.pts 03001627/expert_verified/points_label/671d34c27cc0f1bf2deeb5ec76cf103b.seg 03001627 +03642806/points/464edfe14e9fa45c3394926146371698.pts 03642806/expert_verified/points_label/464edfe14e9fa45c3394926146371698.seg 03642806 +04379243/points/279c8601278e827dab610b0c94236463.pts 04379243/expert_verified/points_label/279c8601278e827dab610b0c94236463.seg 04379243 +04379243/points/29d9c6d84c6a126917b431cae0dd70ed.pts 04379243/expert_verified/points_label/29d9c6d84c6a126917b431cae0dd70ed.seg 04379243 +04379243/points/5d3d902051858e56ed1397afd2317e5b.pts 04379243/expert_verified/points_label/5d3d902051858e56ed1397afd2317e5b.seg 04379243 +02958343/points/aa78d4465ae18312711f9e3a79a13dcf.pts 02958343/expert_verified/points_label/aa78d4465ae18312711f9e3a79a13dcf.seg 02958343 +03001627/points/d561ff6788ab46517b016084e2ae95e.pts 03001627/expert_verified/points_label/d561ff6788ab46517b016084e2ae95e.seg 03001627 +03001627/points/b24ed89d85b74771216fff6094e6695c.pts 03001627/expert_verified/points_label/b24ed89d85b74771216fff6094e6695c.seg 03001627 +03636649/points/f6eeb5d67c32616648fda83c10428379.pts 03636649/expert_verified/points_label/f6eeb5d67c32616648fda83c10428379.seg 03636649 +03001627/points/3b3a9f4e3aa9f2f4d39a194653571dfc.pts 03001627/expert_verified/points_label/3b3a9f4e3aa9f2f4d39a194653571dfc.seg 03001627 +03001627/points/bd0b06e158bcee8ac0d89fc15154c9a2.pts 03001627/expert_verified/points_label/bd0b06e158bcee8ac0d89fc15154c9a2.seg 03001627 +04379243/points/89251f322490e7047e38640a31d0bc3.pts 04379243/expert_verified/points_label/89251f322490e7047e38640a31d0bc3.seg 04379243 +03001627/points/935f5e58e9e15231febad4f49b26ec52.pts 03001627/expert_verified/points_label/935f5e58e9e15231febad4f49b26ec52.seg 03001627 +03467517/points/8f59fee745f1e37ea5c8e9fc8b2242fd.pts 03467517/expert_verified/points_label/8f59fee745f1e37ea5c8e9fc8b2242fd.seg 03467517 +02691156/points/fddcb2b3d45ce98e641c309f1fd7e183.pts 02691156/expert_verified/points_label/fddcb2b3d45ce98e641c309f1fd7e183.seg 02691156 +03001627/points/d915d2f1664bf76e71a70be9f12ce8b0.pts 03001627/expert_verified/points_label/d915d2f1664bf76e71a70be9f12ce8b0.seg 03001627 +02958343/points/1ae9732840a315afab2c2809513f396e.pts 02958343/expert_verified/points_label/1ae9732840a315afab2c2809513f396e.seg 02958343 +04379243/points/b658e507c84d6202610c2a68437007d6.pts 04379243/expert_verified/points_label/b658e507c84d6202610c2a68437007d6.seg 04379243 +02958343/points/707d1e19b465d075adbfb30d8d1b297e.pts 02958343/expert_verified/points_label/707d1e19b465d075adbfb30d8d1b297e.seg 02958343 +04379243/points/5b74412eba257e5182b796aa5845e185.pts 04379243/expert_verified/points_label/5b74412eba257e5182b796aa5845e185.seg 04379243 +03636649/points/a801be11157a7f243d39d8012919dd25.pts 03636649/expert_verified/points_label/a801be11157a7f243d39d8012919dd25.seg 03636649 +02691156/points/26e10058cf9835aaca8607f540cc62ba.pts 02691156/expert_verified/points_label/26e10058cf9835aaca8607f540cc62ba.seg 02691156 +03636649/points/bc704db7b62582e5d1cbf3e52b9b6237.pts 03636649/expert_verified/points_label/bc704db7b62582e5d1cbf3e52b9b6237.seg 03636649 +02691156/points/d2e2e23f5be557e2d1ab3b031c100cb1.pts 02691156/expert_verified/points_label/d2e2e23f5be557e2d1ab3b031c100cb1.seg 02691156 +03001627/points/920af478601258e24762da3a3017ade.pts 03001627/expert_verified/points_label/920af478601258e24762da3a3017ade.seg 03001627 +03001627/points/3ffd794e5100258483bc207d8a5912e3.pts 03001627/expert_verified/points_label/3ffd794e5100258483bc207d8a5912e3.seg 03001627 +04379243/points/69c536d9e450cb79436e6787c76ef3f0.pts 04379243/expert_verified/points_label/69c536d9e450cb79436e6787c76ef3f0.seg 04379243 +04379243/points/6cf6a546e2ecbffe815a7efb12912.pts 04379243/expert_verified/points_label/6cf6a546e2ecbffe815a7efb12912.seg 04379243 +03001627/points/815f436a40c28da51f56aa11cd5e0c3e.pts 03001627/expert_verified/points_label/815f436a40c28da51f56aa11cd5e0c3e.seg 03001627 +03642806/points/4504a4d244d05ddbf5f79806bd65844f.pts 03642806/expert_verified/points_label/4504a4d244d05ddbf5f79806bd65844f.seg 03642806 +04379243/points/8ad9868947e7391113625562b56161f0.pts 04379243/expert_verified/points_label/8ad9868947e7391113625562b56161f0.seg 04379243 +03001627/points/6b9c3d42724275cf7a5c8cd74a7bc29a.pts 03001627/expert_verified/points_label/6b9c3d42724275cf7a5c8cd74a7bc29a.seg 03001627 +04379243/points/67e32538a35a5011a0ab1d82ef09f78f.pts 04379243/expert_verified/points_label/67e32538a35a5011a0ab1d82ef09f78f.seg 04379243 +03624134/points/2743e37a65e198d51592d7a04a86fa53.pts 03624134/expert_verified/points_label/2743e37a65e198d51592d7a04a86fa53.seg 03624134 +04379243/points/12df5c215f4364b7fe388cf6c4c3705d.pts 04379243/expert_verified/points_label/12df5c215f4364b7fe388cf6c4c3705d.seg 04379243 +02958343/points/55e0897c0ac089a6da5cb3be8feeaadc.pts 02958343/expert_verified/points_label/55e0897c0ac089a6da5cb3be8feeaadc.seg 02958343 +02773838/points/4e4fcfffec161ecaed13f430b2941481.pts 02773838/expert_verified/points_label/4e4fcfffec161ecaed13f430b2941481.seg 02773838 +04379243/points/8ce70dead5119191cc3492a06e9bd850.pts 04379243/expert_verified/points_label/8ce70dead5119191cc3492a06e9bd850.seg 04379243 +02691156/points/e033b6ad34586a86cc1c9e8218bfe7fc.pts 02691156/expert_verified/points_label/e033b6ad34586a86cc1c9e8218bfe7fc.seg 02691156 +03636649/points/600b2f00113ad714e2367b9e27f16a71.pts 03636649/expert_verified/points_label/600b2f00113ad714e2367b9e27f16a71.seg 03636649 +04379243/points/a74cad1781afed87dcfcef693e7ec696.pts 04379243/expert_verified/points_label/a74cad1781afed87dcfcef693e7ec696.seg 04379243 +03001627/points/5402eecc67e489502fa77440dcb93214.pts 03001627/expert_verified/points_label/5402eecc67e489502fa77440dcb93214.seg 03001627 +03001627/points/d5bd6ea417eba6ce456cbf78e1e89022.pts 03001627/expert_verified/points_label/d5bd6ea417eba6ce456cbf78e1e89022.seg 03001627 +03001627/points/d4edd167061dac5f52a3901fa1436b1a.pts 03001627/expert_verified/points_label/d4edd167061dac5f52a3901fa1436b1a.seg 03001627 +03636649/points/9fc3ddc511f4ef62dced62abd38a02b0.pts 03636649/expert_verified/points_label/9fc3ddc511f4ef62dced62abd38a02b0.seg 03636649 +02691156/points/92a83ecaa10e8d3f78e919a72d9a39e7.pts 02691156/expert_verified/points_label/92a83ecaa10e8d3f78e919a72d9a39e7.seg 02691156 +03001627/points/fee36ec8c8ae503fc68456e8da5b9a30.pts 03001627/expert_verified/points_label/fee36ec8c8ae503fc68456e8da5b9a30.seg 03001627 +04379243/points/1df409cfefbb51658b9b51ae4415d5aa.pts 04379243/expert_verified/points_label/1df409cfefbb51658b9b51ae4415d5aa.seg 04379243 +03001627/points/76283716a2c6586e266d673a6188bf4c.pts 03001627/expert_verified/points_label/76283716a2c6586e266d673a6188bf4c.seg 03001627 +04379243/points/29b2aaca87d19a3c5759f4335ff2e408.pts 04379243/expert_verified/points_label/29b2aaca87d19a3c5759f4335ff2e408.seg 04379243 +04379243/points/21ca4d36a0f6fa69b937d98d58545fa.pts 04379243/expert_verified/points_label/21ca4d36a0f6fa69b937d98d58545fa.seg 04379243 +02691156/points/da1acb401541235be4d2773f0358b43b.pts 02691156/expert_verified/points_label/da1acb401541235be4d2773f0358b43b.seg 02691156 +04379243/points/553c416f33c5e5e18b9b51ae4415d5aa.pts 04379243/expert_verified/points_label/553c416f33c5e5e18b9b51ae4415d5aa.seg 04379243 +04379243/points/174832b73cd6d91c9856fa70a578baeb.pts 04379243/expert_verified/points_label/174832b73cd6d91c9856fa70a578baeb.seg 04379243 +02691156/points/1c2e9dedbcf511e616a077c4c0fc1181.pts 02691156/expert_verified/points_label/1c2e9dedbcf511e616a077c4c0fc1181.seg 02691156 +03001627/points/893c689b192bbe33ebadcdfba7971b71.pts 03001627/expert_verified/points_label/893c689b192bbe33ebadcdfba7971b71.seg 03001627 +04379243/points/52037005fbff92d08fa35606145b47dc.pts 04379243/expert_verified/points_label/52037005fbff92d08fa35606145b47dc.seg 04379243 +04225987/points/e38a4e6fb32b51a1bebb1fbb949ea955.pts 04225987/expert_verified/points_label/e38a4e6fb32b51a1bebb1fbb949ea955.seg 04225987 +03636649/points/42bc0dce81734d892610e2a20d7c4b61.pts 03636649/expert_verified/points_label/42bc0dce81734d892610e2a20d7c4b61.seg 03636649 +04379243/points/cb7ebc943b1b424988386fe1512ed26f.pts 04379243/expert_verified/points_label/cb7ebc943b1b424988386fe1512ed26f.seg 04379243 +03624134/points/2d6e9b23e171760c3e332fb3cb6ebe50.pts 03624134/expert_verified/points_label/2d6e9b23e171760c3e332fb3cb6ebe50.seg 03624134 +04379243/points/d05ff7b47febe58a656db3f863b4b796.pts 04379243/expert_verified/points_label/d05ff7b47febe58a656db3f863b4b796.seg 04379243 +03636649/points/e178ab3b967c7fddc901d9dddb735c9f.pts 03636649/expert_verified/points_label/e178ab3b967c7fddc901d9dddb735c9f.seg 03636649 +04379243/points/527b2d1e964f056383be1aa5a5ab0c80.pts 04379243/expert_verified/points_label/527b2d1e964f056383be1aa5a5ab0c80.seg 04379243 +03001627/points/f1a1bb6ad29d703078d928ba1c4a6f75.pts 03001627/expert_verified/points_label/f1a1bb6ad29d703078d928ba1c4a6f75.seg 03001627 +04379243/points/ed9dc0937009dc031311158f08f2982a.pts 04379243/expert_verified/points_label/ed9dc0937009dc031311158f08f2982a.seg 04379243 +02691156/points/e41c5719ad09055f1b880c747ee1f83.pts 02691156/expert_verified/points_label/e41c5719ad09055f1b880c747ee1f83.seg 02691156 +04379243/points/34bbe284f7499df071a782a4379556c7.pts 04379243/expert_verified/points_label/34bbe284f7499df071a782a4379556c7.seg 04379243 +02691156/points/973df01cea43c7f690b1d6deb98feec6.pts 02691156/expert_verified/points_label/973df01cea43c7f690b1d6deb98feec6.seg 02691156 +03001627/points/ed97d1c954fca49851ceffe90913a32.pts 03001627/expert_verified/points_label/ed97d1c954fca49851ceffe90913a32.seg 03001627 +03001627/points/3a74e3d5172ee94fdef1c01cbd4ae0c.pts 03001627/expert_verified/points_label/3a74e3d5172ee94fdef1c01cbd4ae0c.seg 03001627 +04379243/points/194b279c7e892a2d15fa8082e5524f79.pts 04379243/expert_verified/points_label/194b279c7e892a2d15fa8082e5524f79.seg 04379243 +04379243/points/23ece3bf871619366ff454af1e8947f3.pts 04379243/expert_verified/points_label/23ece3bf871619366ff454af1e8947f3.seg 04379243 +02691156/points/7de379891610f5feaf7dd1bfd65143a9.pts 02691156/expert_verified/points_label/7de379891610f5feaf7dd1bfd65143a9.seg 02691156 +04379243/points/54ba7e77a2bf5fe3158b7df020486ff2.pts 04379243/expert_verified/points_label/54ba7e77a2bf5fe3158b7df020486ff2.seg 04379243 +03001627/points/39825fb4341ebd1ccb002c1e2b5fc68b.pts 03001627/expert_verified/points_label/39825fb4341ebd1ccb002c1e2b5fc68b.seg 03001627 +03001627/points/a32febea4a0ac30171a782a4379556c7.pts 03001627/expert_verified/points_label/a32febea4a0ac30171a782a4379556c7.seg 03001627 +02691156/points/b9ba988dd9a6cf426e8b6dd39a855b69.pts 02691156/expert_verified/points_label/b9ba988dd9a6cf426e8b6dd39a855b69.seg 02691156 +02691156/points/37b1f7f02c4b87dbca8607f540cc62ba.pts 02691156/expert_verified/points_label/37b1f7f02c4b87dbca8607f540cc62ba.seg 02691156 +04379243/points/8ce538a671c6e684d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/8ce538a671c6e684d93768e7b9b1eabf.seg 04379243 +04225987/points/48bf45bffab55d7cf14c37b285d25cdf.pts 04225987/expert_verified/points_label/48bf45bffab55d7cf14c37b285d25cdf.seg 04225987 +02691156/points/820ba20e5da8325f19ba010ddb4974fe.pts 02691156/expert_verified/points_label/820ba20e5da8325f19ba010ddb4974fe.seg 02691156 +02691156/points/ff52c059efaca3c1ca8607f540cc62ba.pts 02691156/expert_verified/points_label/ff52c059efaca3c1ca8607f540cc62ba.seg 02691156 +04379243/points/99737ff619cae25d6effbd64ad6b71b8.pts 04379243/expert_verified/points_label/99737ff619cae25d6effbd64ad6b71b8.seg 04379243 +04379243/points/e3b7fbed310c2c397c8d78b9aede742.pts 04379243/expert_verified/points_label/e3b7fbed310c2c397c8d78b9aede742.seg 04379243 +03001627/points/e8eedd37cb054e37b59d74a7c956bd18.pts 03001627/expert_verified/points_label/e8eedd37cb054e37b59d74a7c956bd18.seg 03001627 +03790512/points/8134a965cc0b134bb37378f3c85478b4.pts 03790512/expert_verified/points_label/8134a965cc0b134bb37378f3c85478b4.seg 03790512 +03636649/points/da5f13f4048dbd72fcb8d8c6d4df8143.pts 03636649/expert_verified/points_label/da5f13f4048dbd72fcb8d8c6d4df8143.seg 03636649 +03001627/points/f5d8dd0309401ebac47a35332c17cce2.pts 03001627/expert_verified/points_label/f5d8dd0309401ebac47a35332c17cce2.seg 03001627 +02691156/points/521eab9363fdc2a07209009cfb89d4bd.pts 02691156/expert_verified/points_label/521eab9363fdc2a07209009cfb89d4bd.seg 02691156 +03636649/points/b1e552b454366a9d7787152e5befb05b.pts 03636649/expert_verified/points_label/b1e552b454366a9d7787152e5befb05b.seg 03636649 +02958343/points/8590a6c8270375e34b5a812ecf553410.pts 02958343/expert_verified/points_label/8590a6c8270375e34b5a812ecf553410.seg 02958343 +04379243/points/d46537f513283d6cdcfcef693e7ec696.pts 04379243/expert_verified/points_label/d46537f513283d6cdcfcef693e7ec696.seg 04379243 +03001627/points/60a5795c905f3bb157f5033576317e1.pts 03001627/expert_verified/points_label/60a5795c905f3bb157f5033576317e1.seg 03001627 +02691156/points/8996445c6d2407c0fb5c1b0f759e2bc1.pts 02691156/expert_verified/points_label/8996445c6d2407c0fb5c1b0f759e2bc1.seg 02691156 +03624134/points/5e15d63317014f30ceea8802f71596b5.pts 03624134/expert_verified/points_label/5e15d63317014f30ceea8802f71596b5.seg 03624134 +03642806/points/9d48ab8c41174e60888cad7f6c0e6001.pts 03642806/expert_verified/points_label/9d48ab8c41174e60888cad7f6c0e6001.seg 03642806 +04379243/points/4cd35d6ec155d39633207e4c3ac155a4.pts 04379243/expert_verified/points_label/4cd35d6ec155d39633207e4c3ac155a4.seg 04379243 +04379243/points/884d2cc0d3aa8a72640e544a5d67c33a.pts 04379243/expert_verified/points_label/884d2cc0d3aa8a72640e544a5d67c33a.seg 04379243 +03001627/points/8191bad981637a71b356ab8b24c147.pts 03001627/expert_verified/points_label/8191bad981637a71b356ab8b24c147.seg 03001627 +03261776/points/de3b9b253e8f1aaf8b15c58b209760b5.pts 03261776/expert_verified/points_label/de3b9b253e8f1aaf8b15c58b209760b5.seg 03261776 +03636649/points/5b744ac897fe8bc557f40ff86fe708ff.pts 03636649/expert_verified/points_label/5b744ac897fe8bc557f40ff86fe708ff.seg 03636649 +04379243/points/6cd84ff61583805c85e2af9bf984f0b5.pts 04379243/expert_verified/points_label/6cd84ff61583805c85e2af9bf984f0b5.seg 04379243 +04379243/points/e65066d6b0b83719c3bd24f986301745.pts 04379243/expert_verified/points_label/e65066d6b0b83719c3bd24f986301745.seg 04379243 +04379243/points/f3efcbd9745da90619fb4103277a6b93.pts 04379243/expert_verified/points_label/f3efcbd9745da90619fb4103277a6b93.seg 04379243 +04379243/points/8ac4d93e65b9d58d9b937d98d58545fa.pts 04379243/expert_verified/points_label/8ac4d93e65b9d58d9b937d98d58545fa.seg 04379243 +03636649/points/b69c3a0a46b932e3d3c1fbbc2200e255.pts 03636649/expert_verified/points_label/b69c3a0a46b932e3d3c1fbbc2200e255.seg 03636649 +03636649/points/5c7965b0835a1a241de9bf5a9c22fde.pts 03636649/expert_verified/points_label/5c7965b0835a1a241de9bf5a9c22fde.seg 03636649 +03001627/points/27ea798c55699b6d2c528d33bca1ac2.pts 03001627/expert_verified/points_label/27ea798c55699b6d2c528d33bca1ac2.seg 03001627 +03467517/points/dc623742d6d1518e19959b248340fafd.pts 03467517/expert_verified/points_label/dc623742d6d1518e19959b248340fafd.seg 03467517 +03001627/points/c6cb59e7645dd14d661ff085a0f14b7.pts 03001627/expert_verified/points_label/c6cb59e7645dd14d661ff085a0f14b7.seg 03001627 +03948459/points/a3679104af613021912d826efe946a9f.pts 03948459/expert_verified/points_label/a3679104af613021912d826efe946a9f.seg 03948459 +03467517/points/b6d2d35747549a5b93f0194265a9746c.pts 03467517/expert_verified/points_label/b6d2d35747549a5b93f0194265a9746c.seg 03467517 +02691156/points/2c1fff0653854166e7a636089598229.pts 02691156/expert_verified/points_label/2c1fff0653854166e7a636089598229.seg 02691156 +04379243/points/1040cd764facf6981190e285a2cbc9c.pts 04379243/expert_verified/points_label/1040cd764facf6981190e285a2cbc9c.seg 04379243 +03001627/points/485831d92925bf03f3d7c13662c10792.pts 03001627/expert_verified/points_label/485831d92925bf03f3d7c13662c10792.seg 03001627 +03636649/points/284986b4c72d624abd73284bc3c3cbac.pts 03636649/expert_verified/points_label/284986b4c72d624abd73284bc3c3cbac.seg 03636649 +02691156/points/4c008f39378be18bc0909d98a1ff2b4.pts 02691156/expert_verified/points_label/4c008f39378be18bc0909d98a1ff2b4.seg 02691156 +04379243/points/9611888ee0db1ecaf7d4d3ced798ad90.pts 04379243/expert_verified/points_label/9611888ee0db1ecaf7d4d3ced798ad90.seg 04379243 +03467517/points/12e30808350dd945f4b498e11fb60a4b.pts 03467517/expert_verified/points_label/12e30808350dd945f4b498e11fb60a4b.seg 03467517 +03467517/points/3243edb05f5e8803ac61a2f8346a8f.pts 03467517/expert_verified/points_label/3243edb05f5e8803ac61a2f8346a8f.seg 03467517 +04379243/points/ec4675f62f6946118cbb8bac2032149c.pts 04379243/expert_verified/points_label/ec4675f62f6946118cbb8bac2032149c.seg 04379243 +04379243/points/eb00a4e8b33d257cad16260d4d73b56.pts 04379243/expert_verified/points_label/eb00a4e8b33d257cad16260d4d73b56.seg 04379243 +03001627/points/5607b02869c1f8a019fb4103277a6b93.pts 03001627/expert_verified/points_label/5607b02869c1f8a019fb4103277a6b93.seg 03001627 +03636649/points/d456beea1501f278f70220cd6be776f7.pts 03636649/expert_verified/points_label/d456beea1501f278f70220cd6be776f7.seg 03636649 +02691156/points/3feeb5f8ecbfcb4ba8f0518e94fcfb22.pts 02691156/expert_verified/points_label/3feeb5f8ecbfcb4ba8f0518e94fcfb22.seg 02691156 +04379243/points/fe130356df1977499c2a886f3b75f1ff.pts 04379243/expert_verified/points_label/fe130356df1977499c2a886f3b75f1ff.seg 04379243 +02958343/points/aa7f127bb8cd9db73755eb267a6f3b6b.pts 02958343/expert_verified/points_label/aa7f127bb8cd9db73755eb267a6f3b6b.seg 02958343 +04379243/points/84a3c87bba5a472af51f77a6d7299806.pts 04379243/expert_verified/points_label/84a3c87bba5a472af51f77a6d7299806.seg 04379243 +04099429/points/2de8ee55ff69502863098049d14fe32f.pts 04099429/expert_verified/points_label/2de8ee55ff69502863098049d14fe32f.seg 04099429 +03624134/points/539ff9b2a7a0329e759e4c424bcdaafe.pts 03624134/expert_verified/points_label/539ff9b2a7a0329e759e4c424bcdaafe.seg 03624134 +03948459/points/f3f6678898938575575e33965575974.pts 03948459/expert_verified/points_label/f3f6678898938575575e33965575974.seg 03948459 +04379243/points/c26dfd3453d81bf7788eb1f5e7ba6e7b.pts 04379243/expert_verified/points_label/c26dfd3453d81bf7788eb1f5e7ba6e7b.seg 04379243 +03001627/points/8117c55b8bbdbbc54c5c5c89015f1980.pts 03001627/expert_verified/points_label/8117c55b8bbdbbc54c5c5c89015f1980.seg 03001627 +03624134/points/40ccb8ac250e0ea5880595487ba7a30b.pts 03624134/expert_verified/points_label/40ccb8ac250e0ea5880595487ba7a30b.seg 03624134 +04379243/points/a0d2754011acdcc9d8a0e410093d6619.pts 04379243/expert_verified/points_label/a0d2754011acdcc9d8a0e410093d6619.seg 04379243 +03790512/points/5bd41c7d3e158ac93ff4d2f5a7608a24.pts 03790512/expert_verified/points_label/5bd41c7d3e158ac93ff4d2f5a7608a24.seg 03790512 +04379243/points/8f440a7c0e2af79f3ed0ffd59feeec00.pts 04379243/expert_verified/points_label/8f440a7c0e2af79f3ed0ffd59feeec00.seg 04379243 +03001627/points/734ac9809aada180d18df440db206fb1.pts 03001627/expert_verified/points_label/734ac9809aada180d18df440db206fb1.seg 03001627 +03001627/points/54f33a7cb3621d5ced98cca8f0ccd5f7.pts 03001627/expert_verified/points_label/54f33a7cb3621d5ced98cca8f0ccd5f7.seg 03001627 +03001627/points/d274fc14092387c1e17e1cb731e2fa4f.pts 03001627/expert_verified/points_label/d274fc14092387c1e17e1cb731e2fa4f.seg 03001627 +03636649/points/6ccb43088eda061dbfc838749f053cf9.pts 03636649/expert_verified/points_label/6ccb43088eda061dbfc838749f053cf9.seg 03636649 +02773838/points/1b9ef45fefefa35ed13f430b2941481.pts 02773838/expert_verified/points_label/1b9ef45fefefa35ed13f430b2941481.seg 02773838 +03001627/points/35053caa62eea36c116cc4e115d5fd2.pts 03001627/expert_verified/points_label/35053caa62eea36c116cc4e115d5fd2.seg 03001627 +04379243/points/b893c20bfb5d718371a782a4379556c7.pts 04379243/expert_verified/points_label/b893c20bfb5d718371a782a4379556c7.seg 04379243 +04379243/points/1a5062241d7903076f88aa1b7f7cc6c6.pts 04379243/expert_verified/points_label/1a5062241d7903076f88aa1b7f7cc6c6.seg 04379243 +02958343/points/add26d8f4f91ba04c84b95bddf75b22d.pts 02958343/expert_verified/points_label/add26d8f4f91ba04c84b95bddf75b22d.seg 02958343 +03636649/points/f85f26c5a807b22312bea13341a54c3f.pts 03636649/expert_verified/points_label/f85f26c5a807b22312bea13341a54c3f.seg 03636649 +03001627/points/8a232028c2b2cfad43649af30eba8304.pts 03001627/expert_verified/points_label/8a232028c2b2cfad43649af30eba8304.seg 03001627 +03636649/points/3a5a0f4c78e17b284f0c4075db76b7c.pts 03636649/expert_verified/points_label/3a5a0f4c78e17b284f0c4075db76b7c.seg 03636649 +04379243/points/df811f7a858750875634c21965ee6bab.pts 04379243/expert_verified/points_label/df811f7a858750875634c21965ee6bab.seg 04379243 +02691156/points/48706d323b9041d5438a95791ca4064d.pts 02691156/expert_verified/points_label/48706d323b9041d5438a95791ca4064d.seg 02691156 +03790512/points/170cfc531a4fd09fe6905ba5363784c3.pts 03790512/expert_verified/points_label/170cfc531a4fd09fe6905ba5363784c3.seg 03790512 +03467517/points/d4b2ddb52e8dcd3593f0194265a9746c.pts 03467517/expert_verified/points_label/d4b2ddb52e8dcd3593f0194265a9746c.seg 03467517 +03636649/points/2af78c0b040634e5881cd5e2fd8f0f3b.pts 03636649/expert_verified/points_label/2af78c0b040634e5881cd5e2fd8f0f3b.seg 03636649 +04379243/points/90cd6a48cf2789a9b430d97a45d5824.pts 04379243/expert_verified/points_label/90cd6a48cf2789a9b430d97a45d5824.seg 04379243 +03001627/points/43290694390ad1adfc735c9ceab0161a.pts 03001627/expert_verified/points_label/43290694390ad1adfc735c9ceab0161a.seg 03001627 +03636649/points/ed57181b9e7644a3f51f77a6d7299806.pts 03636649/expert_verified/points_label/ed57181b9e7644a3f51f77a6d7299806.seg 03636649 +03261776/points/a9661a8bb610d902957b6a4f3924d982.pts 03261776/expert_verified/points_label/a9661a8bb610d902957b6a4f3924d982.seg 03261776 +02691156/points/b31bbc50a0d3a4366cf1b4a8fc3914e.pts 02691156/expert_verified/points_label/b31bbc50a0d3a4366cf1b4a8fc3914e.seg 02691156 +03001627/points/cd5ad4afabaed0d3e762624dc3c8fa2a.pts 03001627/expert_verified/points_label/cd5ad4afabaed0d3e762624dc3c8fa2a.seg 03001627 +02958343/points/d2e1dc21db9b45df6436916a86a90ed7.pts 02958343/expert_verified/points_label/d2e1dc21db9b45df6436916a86a90ed7.seg 02958343 +02691156/points/de9e093bb17848c3b2bd4a92202f8700.pts 02691156/expert_verified/points_label/de9e093bb17848c3b2bd4a92202f8700.seg 02691156 +03467517/points/40cd2cafde62ff7ca24eeca91f583600.pts 03467517/expert_verified/points_label/40cd2cafde62ff7ca24eeca91f583600.seg 03467517 +02958343/points/56e0fef0632aed0f1d27be7764701cfe.pts 02958343/expert_verified/points_label/56e0fef0632aed0f1d27be7764701cfe.seg 02958343 +04379243/points/a4d149a48607de3d92f4c88fd91c6b1b.pts 04379243/expert_verified/points_label/a4d149a48607de3d92f4c88fd91c6b1b.seg 04379243 +03636649/points/45f11cb4099c9c87bbc7a6acbd8f058b.pts 03636649/expert_verified/points_label/45f11cb4099c9c87bbc7a6acbd8f058b.seg 03636649 +04379243/points/3558aeeb9698722acf19858fd1963d10.pts 04379243/expert_verified/points_label/3558aeeb9698722acf19858fd1963d10.seg 04379243 +03636649/points/2a52bd01472ec7e1589ec67c01f5c1a7.pts 03636649/expert_verified/points_label/2a52bd01472ec7e1589ec67c01f5c1a7.seg 03636649 +03467517/points/58bb21c325f021088f01c8e793a6e062.pts 03467517/expert_verified/points_label/58bb21c325f021088f01c8e793a6e062.seg 03467517 +04379243/points/3997cdee934a9b238eb3bc6c6d15f9bf.pts 04379243/expert_verified/points_label/3997cdee934a9b238eb3bc6c6d15f9bf.seg 04379243 +03001627/points/c4cab2a416a4537e2871cc0b3cc1a485.pts 03001627/expert_verified/points_label/c4cab2a416a4537e2871cc0b3cc1a485.seg 03001627 +04379243/points/6aaa78b81528f4846674ff79eed6185a.pts 04379243/expert_verified/points_label/6aaa78b81528f4846674ff79eed6185a.seg 04379243 +03636649/points/fd5f6ab819910a66dc7f95a5a82e36f7.pts 03636649/expert_verified/points_label/fd5f6ab819910a66dc7f95a5a82e36f7.seg 03636649 +04379243/points/8e3303cae6cc104bad4f8ccb153c24e.pts 04379243/expert_verified/points_label/8e3303cae6cc104bad4f8ccb153c24e.seg 04379243 +03001627/points/2f0318b23d899a84493f17f4fe9b9eb2.pts 03001627/expert_verified/points_label/2f0318b23d899a84493f17f4fe9b9eb2.seg 03001627 +04379243/points/2406cdcd4c60c84132884c4c87a2e061.pts 04379243/expert_verified/points_label/2406cdcd4c60c84132884c4c87a2e061.seg 04379243 +03790512/points/55caf44a43f2c04d468bac13e007a6e9.pts 03790512/expert_verified/points_label/55caf44a43f2c04d468bac13e007a6e9.seg 03790512 +03001627/points/ee665ce6679ac8cfb502ac2eb9128f9a.pts 03001627/expert_verified/points_label/ee665ce6679ac8cfb502ac2eb9128f9a.seg 03001627 +02691156/points/32edb6ba5788dc12d8ff6111270336a9.pts 02691156/expert_verified/points_label/32edb6ba5788dc12d8ff6111270336a9.seg 02691156 +03636649/points/d0fde1daedab10365240248232b90795.pts 03636649/expert_verified/points_label/d0fde1daedab10365240248232b90795.seg 03636649 +04379243/points/61b88b501933ebae8f7068c66465c4d6.pts 04379243/expert_verified/points_label/61b88b501933ebae8f7068c66465c4d6.seg 04379243 +03001627/points/93556cf01e19f638bf80985a99195eb8.pts 03001627/expert_verified/points_label/93556cf01e19f638bf80985a99195eb8.seg 03001627 +04379243/points/f3b8c91c5dd1cb6b8722573b29f0d6d8.pts 04379243/expert_verified/points_label/f3b8c91c5dd1cb6b8722573b29f0d6d8.seg 04379243 +04379243/points/eae36b396f6b5f97664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/eae36b396f6b5f97664b3b9b23ddfcbc.seg 04379243 +03624134/points/8bd5c4f395695ebdf40d02cc9d84a93a.pts 03624134/expert_verified/points_label/8bd5c4f395695ebdf40d02cc9d84a93a.seg 03624134 +03001627/points/8c81ff18e04584547f409062bafc8e2.pts 03001627/expert_verified/points_label/8c81ff18e04584547f409062bafc8e2.seg 03001627 +03001627/points/77e7660d71c6f3befebad4f49b26ec52.pts 03001627/expert_verified/points_label/77e7660d71c6f3befebad4f49b26ec52.seg 03001627 +03261776/points/bc404e52bfcd2038538cf6df9faa9b65.pts 03261776/expert_verified/points_label/bc404e52bfcd2038538cf6df9faa9b65.seg 03261776 +03001627/points/f09af71bebd4bea8a2651abaf391628e.pts 03001627/expert_verified/points_label/f09af71bebd4bea8a2651abaf391628e.seg 03001627 +03001627/points/8c8efbe62a1547942b90a0fb76278f6f.pts 03001627/expert_verified/points_label/8c8efbe62a1547942b90a0fb76278f6f.seg 03001627 +04379243/points/aed5697ff59e3d3035478a6869a3602d.pts 04379243/expert_verified/points_label/aed5697ff59e3d3035478a6869a3602d.seg 04379243 +02691156/points/5ac00867c7d78b1690b1d6deb98feec6.pts 02691156/expert_verified/points_label/5ac00867c7d78b1690b1d6deb98feec6.seg 02691156 +03001627/points/c709aa613431c0538a653a9f65a410f6.pts 03001627/expert_verified/points_label/c709aa613431c0538a653a9f65a410f6.seg 03001627 +03624134/points/8facbe9d9f4da233d15a5887ec2183c9.pts 03624134/expert_verified/points_label/8facbe9d9f4da233d15a5887ec2183c9.seg 03624134 +03642806/points/dbcd5a88a9d4f1d7579cfe4420588034.pts 03642806/expert_verified/points_label/dbcd5a88a9d4f1d7579cfe4420588034.seg 03642806 +03636649/points/f29a94f969dd55ffc35131da26f8061a.pts 03636649/expert_verified/points_label/f29a94f969dd55ffc35131da26f8061a.seg 03636649 +02958343/points/5e014eb2bd03daab9fbe97de4a41d527.pts 02958343/expert_verified/points_label/5e014eb2bd03daab9fbe97de4a41d527.seg 02958343 +04379243/points/7105bd044f464358beedb4c8fd29e2d1.pts 04379243/expert_verified/points_label/7105bd044f464358beedb4c8fd29e2d1.seg 04379243 +04379243/points/c827c0d4ef212f2b30cb1fe6fdc7d605.pts 04379243/expert_verified/points_label/c827c0d4ef212f2b30cb1fe6fdc7d605.seg 04379243 +04379243/points/19bc9c781df1da46824080f516909671.pts 04379243/expert_verified/points_label/19bc9c781df1da46824080f516909671.seg 04379243 +03001627/points/71b53a5f441d45b742b7e4c0136bdb7e.pts 03001627/expert_verified/points_label/71b53a5f441d45b742b7e4c0136bdb7e.seg 03001627 +02958343/points/e7e94f8dbbe8c1e9784da3853aae78cd.pts 02958343/expert_verified/points_label/e7e94f8dbbe8c1e9784da3853aae78cd.seg 02958343 +03790512/points/832c4a316c419228b37378f3c85478b4.pts 03790512/expert_verified/points_label/832c4a316c419228b37378f3c85478b4.seg 03790512 +02954340/points/c7122c44495a5ac6aceb0fa31f18f016.pts 02954340/expert_verified/points_label/c7122c44495a5ac6aceb0fa31f18f016.seg 02954340 +03001627/points/6b32d3a9198f8b03d1dcc55e36186e4e.pts 03001627/expert_verified/points_label/6b32d3a9198f8b03d1dcc55e36186e4e.seg 03001627 +03636649/points/7893d0b50a7b6a768ec45924afa4ac91.pts 03636649/expert_verified/points_label/7893d0b50a7b6a768ec45924afa4ac91.seg 03636649 +02691156/points/befcb95d80e0e49119ba010ddb4974fe.pts 02691156/expert_verified/points_label/befcb95d80e0e49119ba010ddb4974fe.seg 02691156 +03001627/points/b70600293bab55c0593ebeeedbff73b.pts 03001627/expert_verified/points_label/b70600293bab55c0593ebeeedbff73b.seg 03001627 +02691156/points/7fedb48b457ee9f31629b98cc1b1b992.pts 02691156/expert_verified/points_label/7fedb48b457ee9f31629b98cc1b1b992.seg 02691156 +04099429/points/e04bda8655d9e606ebcdf982796b4fa.pts 04099429/expert_verified/points_label/e04bda8655d9e606ebcdf982796b4fa.seg 04099429 +04379243/points/25bcea593e4314c3436e6787c76ef3f0.pts 04379243/expert_verified/points_label/25bcea593e4314c3436e6787c76ef3f0.seg 04379243 +03636649/points/f3a9cc3060fd6b0e6e4f8fc909e0d34e.pts 03636649/expert_verified/points_label/f3a9cc3060fd6b0e6e4f8fc909e0d34e.seg 03636649 +04379243/points/516928532093f765bababe11fcea8796.pts 04379243/expert_verified/points_label/516928532093f765bababe11fcea8796.seg 04379243 +03001627/points/31569815c88e79de4458bae25a4e518a.pts 03001627/expert_verified/points_label/31569815c88e79de4458bae25a4e518a.seg 03001627 +03001627/points/a08ad49c281128ea53615647c93fc704.pts 03001627/expert_verified/points_label/a08ad49c281128ea53615647c93fc704.seg 03001627 +03642806/points/f5fc954736b06be15fd06491ae919ea3.pts 03642806/expert_verified/points_label/f5fc954736b06be15fd06491ae919ea3.seg 03642806 +04379243/points/15b495c101881d96e2367b9e27f16a71.pts 04379243/expert_verified/points_label/15b495c101881d96e2367b9e27f16a71.seg 04379243 +02691156/points/ebd991666f177f8f575bf8a4b14be4f4.pts 02691156/expert_verified/points_label/ebd991666f177f8f575bf8a4b14be4f4.seg 02691156 +02691156/points/f7739764eb1c78a053f370d353cea84.pts 02691156/expert_verified/points_label/f7739764eb1c78a053f370d353cea84.seg 02691156 +03636649/points/8a6d770e6b4942c5ef3a2c64cef919d0.pts 03636649/expert_verified/points_label/8a6d770e6b4942c5ef3a2c64cef919d0.seg 03636649 +04379243/points/2fcc875b28c5557dcfcef693e7ec696.pts 04379243/expert_verified/points_label/2fcc875b28c5557dcfcef693e7ec696.seg 04379243 +03636649/points/896abd405c79547086485c798787f66b.pts 03636649/expert_verified/points_label/896abd405c79547086485c798787f66b.seg 03636649 +02691156/points/356a633ea047c549ca8607f540cc62ba.pts 02691156/expert_verified/points_label/356a633ea047c549ca8607f540cc62ba.seg 02691156 +03001627/points/c983108db7fcfa3619fb4103277a6b93.pts 03001627/expert_verified/points_label/c983108db7fcfa3619fb4103277a6b93.seg 03001627 +04225987/points/97f85bc59f09a9f455c660e6cd8e92b.pts 04225987/expert_verified/points_label/97f85bc59f09a9f455c660e6cd8e92b.seg 04225987 +03636649/points/69a708be7245f4c9786e8e92cc08146.pts 03636649/expert_verified/points_label/69a708be7245f4c9786e8e92cc08146.seg 03636649 +04379243/points/f71296c0a7e93ec282db9fca4b68095.pts 04379243/expert_verified/points_label/f71296c0a7e93ec282db9fca4b68095.seg 04379243 +02691156/points/33faf711ed54a4d3db22b838c125a50b.pts 02691156/expert_verified/points_label/33faf711ed54a4d3db22b838c125a50b.seg 02691156 +03642806/points/5d544ee4b094c6606436916a86a90ed7.pts 03642806/expert_verified/points_label/5d544ee4b094c6606436916a86a90ed7.seg 03642806 +02691156/points/a0d63ee7fd87f93619ba010ddb4974fe.pts 02691156/expert_verified/points_label/a0d63ee7fd87f93619ba010ddb4974fe.seg 02691156 +03001627/points/e30b412be565a1026efe57da6d3d385e.pts 03001627/expert_verified/points_label/e30b412be565a1026efe57da6d3d385e.seg 03001627 +04379243/points/fe5e1df0653804d6ce4670b160b81e9.pts 04379243/expert_verified/points_label/fe5e1df0653804d6ce4670b160b81e9.seg 04379243 +02691156/points/fd41d04f1aabbaea3fddedb0bf24c68a.pts 02691156/expert_verified/points_label/fd41d04f1aabbaea3fddedb0bf24c68a.seg 02691156 +03624134/points/e79481b2fde3a3ab340fbf70397ab69a.pts 03624134/expert_verified/points_label/e79481b2fde3a3ab340fbf70397ab69a.seg 03624134 +04379243/points/d06d27bc9ad1faabd7bf6fb68df7f786.pts 04379243/expert_verified/points_label/d06d27bc9ad1faabd7bf6fb68df7f786.seg 04379243 +03001627/points/e4931ffa06d7b05cb04cb542e2c50eb4.pts 03001627/expert_verified/points_label/e4931ffa06d7b05cb04cb542e2c50eb4.seg 03001627 +03001627/points/d4b5f8edc72b4676f4175ee3a177350a.pts 03001627/expert_verified/points_label/d4b5f8edc72b4676f4175ee3a177350a.seg 03001627 +03636649/points/4f16fffbe480b835276206fae5d3c473.pts 03636649/expert_verified/points_label/4f16fffbe480b835276206fae5d3c473.seg 03636649 +03001627/points/8ade914cd21b6e49656f29b05c68d39f.pts 03001627/expert_verified/points_label/8ade914cd21b6e49656f29b05c68d39f.seg 03001627 +03001627/points/1e304b967d5253d5dd079f8cece51712.pts 03001627/expert_verified/points_label/1e304b967d5253d5dd079f8cece51712.seg 03001627 +04379243/points/6d0ef6312f8af87a53e946fb2184f0c4.pts 04379243/expert_verified/points_label/6d0ef6312f8af87a53e946fb2184f0c4.seg 04379243 +03948459/points/79c0cac016998c7cf7ba4a82f8032357.pts 03948459/expert_verified/points_label/79c0cac016998c7cf7ba4a82f8032357.seg 03948459 +03642806/points/b51683c6285fa0f69067ac5c9d4ee692.pts 03642806/expert_verified/points_label/b51683c6285fa0f69067ac5c9d4ee692.seg 03642806 +04379243/points/93cdfd14889492dd91a4fd87fee47737.pts 04379243/expert_verified/points_label/93cdfd14889492dd91a4fd87fee47737.seg 04379243 +03636649/points/da8141b45da808199a06a7de97b096dc.pts 03636649/expert_verified/points_label/da8141b45da808199a06a7de97b096dc.seg 03636649 +04379243/points/7d22cd72bf2762b19a4b266ed4d507c9.pts 04379243/expert_verified/points_label/7d22cd72bf2762b19a4b266ed4d507c9.seg 04379243 +04225987/points/aa886bed91a13113d5498a74ca9ca78b.pts 04225987/expert_verified/points_label/aa886bed91a13113d5498a74ca9ca78b.seg 04225987 +04379243/points/55547d2fae0e3dc21705bfd3afcd10e.pts 04379243/expert_verified/points_label/55547d2fae0e3dc21705bfd3afcd10e.seg 04379243 +04379243/points/222c56ff9cddbaf4139eb23f7c8036f.pts 04379243/expert_verified/points_label/222c56ff9cddbaf4139eb23f7c8036f.seg 04379243 +03636649/points/292f1f97a543d735dedf3c967c85981a.pts 03636649/expert_verified/points_label/292f1f97a543d735dedf3c967c85981a.seg 03636649 +04379243/points/9e2318099f77d3df3527ecfeb345775f.pts 04379243/expert_verified/points_label/9e2318099f77d3df3527ecfeb345775f.seg 04379243 +04379243/points/6ace903899706a5819fb4103277a6b93.pts 04379243/expert_verified/points_label/6ace903899706a5819fb4103277a6b93.seg 04379243 +03636649/points/c080aefc6cbff8c81185ac82ed4da80d.pts 03636649/expert_verified/points_label/c080aefc6cbff8c81185ac82ed4da80d.seg 03636649 +03790512/points/9dd4ae1c34af4766b4f2746c8140d6d6.pts 03790512/expert_verified/points_label/9dd4ae1c34af4766b4f2746c8140d6d6.seg 03790512 +03001627/points/e199b1f6a70c9f56df44d20a516c07b3.pts 03001627/expert_verified/points_label/e199b1f6a70c9f56df44d20a516c07b3.seg 03001627 +04379243/points/8129d4c51abc3356bababe11fcea8796.pts 04379243/expert_verified/points_label/8129d4c51abc3356bababe11fcea8796.seg 04379243 +03001627/points/c9d8573a048c0e959c0ca344f487323e.pts 03001627/expert_verified/points_label/c9d8573a048c0e959c0ca344f487323e.seg 03001627 +04379243/points/25eefc5a3c7b30e1f103d473de33521a.pts 04379243/expert_verified/points_label/25eefc5a3c7b30e1f103d473de33521a.seg 04379243 +03624134/points/c20cca071ea58e3ef2c542131520d62e.pts 03624134/expert_verified/points_label/c20cca071ea58e3ef2c542131520d62e.seg 03624134 +03001627/points/c86cfe147872280463626070a93463cf.pts 03001627/expert_verified/points_label/c86cfe147872280463626070a93463cf.seg 03001627 +03001627/points/3853339519aca1bdfcd4910413c446d9.pts 03001627/expert_verified/points_label/3853339519aca1bdfcd4910413c446d9.seg 03001627 +03001627/points/8cb44a50906b827615e7ec87bf4cc5ab.pts 03001627/expert_verified/points_label/8cb44a50906b827615e7ec87bf4cc5ab.seg 03001627 +02691156/points/fd9f1cdaa381599bca8607f540cc62ba.pts 02691156/expert_verified/points_label/fd9f1cdaa381599bca8607f540cc62ba.seg 02691156 +03001627/points/80dabf9ddbdc92f681806e3880250dff.pts 03001627/expert_verified/points_label/80dabf9ddbdc92f681806e3880250dff.seg 03001627 +04379243/points/5919dea71f3bcb071d54ab02e78bef2.pts 04379243/expert_verified/points_label/5919dea71f3bcb071d54ab02e78bef2.seg 04379243 +03636649/points/292ba732e002629e68c2f5eb1dd4dfaa.pts 03636649/expert_verified/points_label/292ba732e002629e68c2f5eb1dd4dfaa.seg 03636649 +04379243/points/5d77e8f6ad3741a0c30ab36bf7b0552.pts 04379243/expert_verified/points_label/5d77e8f6ad3741a0c30ab36bf7b0552.seg 04379243 +03467517/points/21a517abc4729e6e352e5d4d2615db5b.pts 03467517/expert_verified/points_label/21a517abc4729e6e352e5d4d2615db5b.seg 03467517 +03467517/points/6554f6429eb7b67585e3c97721f726e4.pts 03467517/expert_verified/points_label/6554f6429eb7b67585e3c97721f726e4.seg 03467517 +02958343/points/f84ba2039d0a4ec5afe717997470b28d.pts 02958343/expert_verified/points_label/f84ba2039d0a4ec5afe717997470b28d.seg 02958343 +02691156/points/29fd29045703ff18b4a8b7176ed97248.pts 02691156/expert_verified/points_label/29fd29045703ff18b4a8b7176ed97248.seg 02691156 +03467517/points/a7f449a1f2cd1f1693f0194265a9746c.pts 03467517/expert_verified/points_label/a7f449a1f2cd1f1693f0194265a9746c.seg 03467517 +03790512/points/7fcee59a33976221a88e8cb97b773125.pts 03790512/expert_verified/points_label/7fcee59a33976221a88e8cb97b773125.seg 03790512 +04099429/points/2407c2684ee757e89c4176ab56cb612.pts 04099429/expert_verified/points_label/2407c2684ee757e89c4176ab56cb612.seg 04099429 +04379243/points/f621e2ad900ad48535836c728d324152.pts 04379243/expert_verified/points_label/f621e2ad900ad48535836c728d324152.seg 04379243 +03001627/points/9a54daea9071a536bf80985a99195eb8.pts 03001627/expert_verified/points_label/9a54daea9071a536bf80985a99195eb8.seg 03001627 +03001627/points/fd9e909b082d8175d319c38340319ae4.pts 03001627/expert_verified/points_label/fd9e909b082d8175d319c38340319ae4.seg 03001627 +03001627/points/a8dd9990ecd74c45435897641a7ee684.pts 03001627/expert_verified/points_label/a8dd9990ecd74c45435897641a7ee684.seg 03001627 +03636649/points/c6424950ca9447627d8864caa856253b.pts 03636649/expert_verified/points_label/c6424950ca9447627d8864caa856253b.seg 03636649 +03948459/points/7f3ec97cfaea31137504cc74f24f0eee.pts 03948459/expert_verified/points_label/7f3ec97cfaea31137504cc74f24f0eee.seg 03948459 +02691156/points/43abe330362164e99be82ec29531a70f.pts 02691156/expert_verified/points_label/43abe330362164e99be82ec29531a70f.seg 02691156 +03001627/points/499c4b519c708ae84cd08aa7c510fb85.pts 03001627/expert_verified/points_label/499c4b519c708ae84cd08aa7c510fb85.seg 03001627 +04379243/points/4c7931492b41f960d50eef20e0914a48.pts 04379243/expert_verified/points_label/4c7931492b41f960d50eef20e0914a48.seg 04379243 +03001627/points/3f36e261cc87648ac3bd24f986301745.pts 03001627/expert_verified/points_label/3f36e261cc87648ac3bd24f986301745.seg 03001627 +03001627/points/a09a88c11d0b27368821ad3452f1c8c9.pts 03001627/expert_verified/points_label/a09a88c11d0b27368821ad3452f1c8c9.seg 03001627 +04379243/points/89cc879f005dcf50f1f50f6a678fb494.pts 04379243/expert_verified/points_label/89cc879f005dcf50f1f50f6a678fb494.seg 04379243 +02958343/points/d34b0494fc4d756ab927782fc69a1fbb.pts 02958343/expert_verified/points_label/d34b0494fc4d756ab927782fc69a1fbb.seg 02958343 +02958343/points/705840df46a582e2ac826a3c82da491.pts 02958343/expert_verified/points_label/705840df46a582e2ac826a3c82da491.seg 02958343 +02691156/points/74a5f937c22aa08a3e70653c1b3170b5.pts 02691156/expert_verified/points_label/74a5f937c22aa08a3e70653c1b3170b5.seg 02691156 +03948459/points/a0a1633186261a031274aa253a241db2.pts 03948459/expert_verified/points_label/a0a1633186261a031274aa253a241db2.seg 03948459 +03001627/points/2de04227fae28e70b6eb6f056d511fe1.pts 03001627/expert_verified/points_label/2de04227fae28e70b6eb6f056d511fe1.seg 03001627 +02691156/points/1e9ef313876bfba7d02c6d35cc802839.pts 02691156/expert_verified/points_label/1e9ef313876bfba7d02c6d35cc802839.seg 02691156 +03636649/points/e99793b871d27333d42b9650f19dd425.pts 03636649/expert_verified/points_label/e99793b871d27333d42b9650f19dd425.seg 03636649 +03001627/points/7228d43e00af4c1e2746490e2236e9a8.pts 03001627/expert_verified/points_label/7228d43e00af4c1e2746490e2236e9a8.seg 03001627 +03636649/points/66111d2c7a23b0feb404555b84577afb.pts 03636649/expert_verified/points_label/66111d2c7a23b0feb404555b84577afb.seg 03636649 +03001627/points/2499541ace317cbb8cb5d9909aeb1309.pts 03001627/expert_verified/points_label/2499541ace317cbb8cb5d9909aeb1309.seg 03001627 +04379243/points/d151d9f45d8b14536cd661fb5fd95741.pts 04379243/expert_verified/points_label/d151d9f45d8b14536cd661fb5fd95741.seg 04379243 +03001627/points/ea7be2b97e78d5b35a4480134e0cdd21.pts 03001627/expert_verified/points_label/ea7be2b97e78d5b35a4480134e0cdd21.seg 03001627 +02958343/points/9c35f00f81110738783854950b26f0d3.pts 02958343/expert_verified/points_label/9c35f00f81110738783854950b26f0d3.seg 02958343 +03001627/points/e30bd575bbd6c68c9710e093c764abec.pts 03001627/expert_verified/points_label/e30bd575bbd6c68c9710e093c764abec.seg 03001627 +03790512/points/61b17f12bec91d057395d58407f193ba.pts 03790512/expert_verified/points_label/61b17f12bec91d057395d58407f193ba.seg 03790512 +04379243/points/cd895c35fff495cdd0b93fa304cfa755.pts 04379243/expert_verified/points_label/cd895c35fff495cdd0b93fa304cfa755.seg 04379243 +02958343/points/b70d970f8020c25dd141480e2c154d3.pts 02958343/expert_verified/points_label/b70d970f8020c25dd141480e2c154d3.seg 02958343 +04379243/points/2642d805c53e243d629f73b53bd7a234.pts 04379243/expert_verified/points_label/2642d805c53e243d629f73b53bd7a234.seg 04379243 +04379243/points/1bce2f4937d36446a32c566d71fa585c.pts 04379243/expert_verified/points_label/1bce2f4937d36446a32c566d71fa585c.seg 04379243 +04379243/points/7c1bcea89b0037a2d67bd369ec608dad.pts 04379243/expert_verified/points_label/7c1bcea89b0037a2d67bd369ec608dad.seg 04379243 +04379243/points/3154c61c595bd600e56ddd87eb888f65.pts 04379243/expert_verified/points_label/3154c61c595bd600e56ddd87eb888f65.seg 04379243 +03001627/points/7a1de77ca204eaf28a514cac7cb18507.pts 03001627/expert_verified/points_label/7a1de77ca204eaf28a514cac7cb18507.seg 03001627 +04379243/points/77ecc55547840f06d42b9650f19dd425.pts 04379243/expert_verified/points_label/77ecc55547840f06d42b9650f19dd425.seg 04379243 +02691156/points/9a8aecab136ce50db7ef47444625afb2.pts 02691156/expert_verified/points_label/9a8aecab136ce50db7ef47444625afb2.seg 02691156 +02958343/points/24866846d728484e1d1a964dea8a7aab.pts 02958343/expert_verified/points_label/24866846d728484e1d1a964dea8a7aab.seg 02958343 +04099429/points/9b75297c580ff937b61ce5beb9f92726.pts 04099429/expert_verified/points_label/9b75297c580ff937b61ce5beb9f92726.seg 04099429 +04225987/points/90dbe261a4d56dcf1082f2ea630bf69e.pts 04225987/expert_verified/points_label/90dbe261a4d56dcf1082f2ea630bf69e.seg 04225987 +03001627/points/81b27636162e148bb3fb065fa3089331.pts 03001627/expert_verified/points_label/81b27636162e148bb3fb065fa3089331.seg 03001627 +03642806/points/66d47a84a3d522dc9311bf79d4774e73.pts 03642806/expert_verified/points_label/66d47a84a3d522dc9311bf79d4774e73.seg 03642806 +03001627/points/2a05ae00b701fda36567137a59cb1a56.pts 03001627/expert_verified/points_label/2a05ae00b701fda36567137a59cb1a56.seg 03001627 +04379243/points/79df23303a3192c1cdf1dfd78f33901b.pts 04379243/expert_verified/points_label/79df23303a3192c1cdf1dfd78f33901b.seg 04379243 +04379243/points/bf17779bec6abccf161bc5243aab8ea4.pts 04379243/expert_verified/points_label/bf17779bec6abccf161bc5243aab8ea4.seg 04379243 +03001627/points/ece1a921c1bfd44947f5e245ee376525.pts 03001627/expert_verified/points_label/ece1a921c1bfd44947f5e245ee376525.seg 03001627 +03636649/points/15c51ecb58bf304fef3a2c64cef919d0.pts 03636649/expert_verified/points_label/15c51ecb58bf304fef3a2c64cef919d0.seg 03636649 +04379243/points/5d93e285b2006520ab610b0c94236463.pts 04379243/expert_verified/points_label/5d93e285b2006520ab610b0c94236463.seg 04379243 +03636649/points/b2d5929e66044aeac7db9c21ccfbc4a1.pts 03636649/expert_verified/points_label/b2d5929e66044aeac7db9c21ccfbc4a1.seg 03636649 +04379243/points/f3164e1781a296597f6f00dc967c386.pts 04379243/expert_verified/points_label/f3164e1781a296597f6f00dc967c386.seg 04379243 +04379243/points/798a07e42d76013582695d8aaeacccc5.pts 04379243/expert_verified/points_label/798a07e42d76013582695d8aaeacccc5.seg 04379243 +03948459/points/cc014e78b5cd9e7ed957eaf7f4edb205.pts 03948459/expert_verified/points_label/cc014e78b5cd9e7ed957eaf7f4edb205.seg 03948459 +03636649/points/b3a98808fb1ccd892a5041fadf25a502.pts 03636649/expert_verified/points_label/b3a98808fb1ccd892a5041fadf25a502.seg 03636649 +04379243/points/9472c006a5d35b9ab606ece4189242ff.pts 04379243/expert_verified/points_label/9472c006a5d35b9ab606ece4189242ff.seg 04379243 +03001627/points/3f04adffb69b5ebee95cd0dc8c2f0e83.pts 03001627/expert_verified/points_label/3f04adffb69b5ebee95cd0dc8c2f0e83.seg 03001627 +03001627/points/26aa22bd1da8b8c5b1a5c6ecbc81953c.pts 03001627/expert_verified/points_label/26aa22bd1da8b8c5b1a5c6ecbc81953c.seg 03001627 +03001627/points/f68ecc9ec512915f36d8dd30a594b2af.pts 03001627/expert_verified/points_label/f68ecc9ec512915f36d8dd30a594b2af.seg 03001627 +03642806/points/6489453e322cdb53f9f3c6290096f50f.pts 03642806/expert_verified/points_label/6489453e322cdb53f9f3c6290096f50f.seg 03642806 +03001627/points/c53fa6829ec9a947d13b7d13ee32497.pts 03001627/expert_verified/points_label/c53fa6829ec9a947d13b7d13ee32497.seg 03001627 +04379243/points/7f1bd688960e2c1b97f2016c3d6097c9.pts 04379243/expert_verified/points_label/7f1bd688960e2c1b97f2016c3d6097c9.seg 04379243 +02958343/points/edb2ab8a1d7e20f36436916a86a90ed7.pts 02958343/expert_verified/points_label/edb2ab8a1d7e20f36436916a86a90ed7.seg 02958343 +04379243/points/159a2a760327ca5bababe11fcea8796.pts 04379243/expert_verified/points_label/159a2a760327ca5bababe11fcea8796.seg 04379243 +02958343/points/988108a7536d686824065b218dc1b5b9.pts 02958343/expert_verified/points_label/988108a7536d686824065b218dc1b5b9.seg 02958343 +03636649/points/c695408a86062c4d242ea50288b3f64.pts 03636649/expert_verified/points_label/c695408a86062c4d242ea50288b3f64.seg 03636649 +04379243/points/2e7cb2cbfbbb4d002ee19ebe356c2dcb.pts 04379243/expert_verified/points_label/2e7cb2cbfbbb4d002ee19ebe356c2dcb.seg 04379243 +02691156/points/3d23703a618ce7df1e569ed4e4cfe84.pts 02691156/expert_verified/points_label/3d23703a618ce7df1e569ed4e4cfe84.seg 02691156 +03636649/points/97b7d9aabe38f91df11c97be803c47d.pts 03636649/expert_verified/points_label/97b7d9aabe38f91df11c97be803c47d.seg 03636649 +04379243/points/5be1589df948b227c955e5ed03ef3a2f.pts 04379243/expert_verified/points_label/5be1589df948b227c955e5ed03ef3a2f.seg 04379243 +04379243/points/8ea7ca2c8b48eb68ab610b0c94236463.pts 04379243/expert_verified/points_label/8ea7ca2c8b48eb68ab610b0c94236463.seg 04379243 +02958343/points/eb56379e243b0e2090da6b3e2ed8b49d.pts 02958343/expert_verified/points_label/eb56379e243b0e2090da6b3e2ed8b49d.seg 02958343 +03001627/points/cc30a723aeba69a139e0f39f5249b0ba.pts 03001627/expert_verified/points_label/cc30a723aeba69a139e0f39f5249b0ba.seg 03001627 +03001627/points/ff8efd10f5e6c5c7c6c0380e62f2644.pts 03001627/expert_verified/points_label/ff8efd10f5e6c5c7c6c0380e62f2644.seg 03001627 +02691156/points/d0ee4253d406b3f05e9e2656aff7dd5b.pts 02691156/expert_verified/points_label/d0ee4253d406b3f05e9e2656aff7dd5b.seg 02691156 +02691156/points/9afe827a622d8ca28699933784576e73.pts 02691156/expert_verified/points_label/9afe827a622d8ca28699933784576e73.seg 02691156 +03467517/points/d82fc6db200cdf6ea24eeca91f583600.pts 03467517/expert_verified/points_label/d82fc6db200cdf6ea24eeca91f583600.seg 03467517 +03642806/points/6123321e3af0b6328204b359ccd3949e.pts 03642806/expert_verified/points_label/6123321e3af0b6328204b359ccd3949e.seg 03642806 +03636649/points/e15defcb3dd448094fffb007974c9976.pts 03636649/expert_verified/points_label/e15defcb3dd448094fffb007974c9976.seg 03636649 +03001627/points/c7fe45610d10cb108ad3a7d07aac2767.pts 03001627/expert_verified/points_label/c7fe45610d10cb108ad3a7d07aac2767.seg 03001627 +04379243/points/bfaa1c23d2622422ad16260d4d73b56.pts 04379243/expert_verified/points_label/bfaa1c23d2622422ad16260d4d73b56.seg 04379243 +04379243/points/8e3fc5f1f8e9658ce8b2b8dc0c816caf.pts 04379243/expert_verified/points_label/8e3fc5f1f8e9658ce8b2b8dc0c816caf.seg 04379243 +03467517/points/1a96f73d0929bd4793f0194265a9746c.pts 03467517/expert_verified/points_label/1a96f73d0929bd4793f0194265a9746c.seg 03467517 +02691156/points/86b11ae736659136ca8607f540cc62ba.pts 02691156/expert_verified/points_label/86b11ae736659136ca8607f540cc62ba.seg 02691156 +04379243/points/4c4c719ac4b61d8f812c9aaa38f9a422.pts 04379243/expert_verified/points_label/4c4c719ac4b61d8f812c9aaa38f9a422.seg 04379243 +04379243/points/443eca86041e57ab1e99b149cff6a230.pts 04379243/expert_verified/points_label/443eca86041e57ab1e99b149cff6a230.seg 04379243 +03948459/points/6b2d89a7f2b173f0d9deb3f829cc2475.pts 03948459/expert_verified/points_label/6b2d89a7f2b173f0d9deb3f829cc2475.seg 03948459 +04379243/points/8d84471c4af977d917271868b642acd3.pts 04379243/expert_verified/points_label/8d84471c4af977d917271868b642acd3.seg 04379243 +03636649/points/b78bef16d4f44844931e98da3a93e73e.pts 03636649/expert_verified/points_label/b78bef16d4f44844931e98da3a93e73e.seg 03636649 +03636649/points/29985e44b73051d923500a5b036df62e.pts 03636649/expert_verified/points_label/29985e44b73051d923500a5b036df62e.seg 03636649 +03642806/points/4f3575df3821e08c466909b3e9553909.pts 03642806/expert_verified/points_label/4f3575df3821e08c466909b3e9553909.seg 03642806 +03001627/points/3774a2b8c71e70b9f18a36d57b7cced0.pts 03001627/expert_verified/points_label/3774a2b8c71e70b9f18a36d57b7cced0.seg 03001627 +03001627/points/3ea40a75f22515557dcf230d8b7d162e.pts 03001627/expert_verified/points_label/3ea40a75f22515557dcf230d8b7d162e.seg 03001627 +03001627/points/33c4f94e97c3fefd19fb4103277a6b93.pts 03001627/expert_verified/points_label/33c4f94e97c3fefd19fb4103277a6b93.seg 03001627 +03636649/points/d7760d5f9e1e6a622cd2160e449d45ae.pts 03636649/expert_verified/points_label/d7760d5f9e1e6a622cd2160e449d45ae.seg 03636649 +02954340/points/7f9ddfff396634f17790cd6f6e8952aa.pts 02954340/expert_verified/points_label/7f9ddfff396634f17790cd6f6e8952aa.seg 02954340 +03001627/points/5e706e87ca60bd19ecb01bc908e8cea6.pts 03001627/expert_verified/points_label/5e706e87ca60bd19ecb01bc908e8cea6.seg 03001627 +04379243/points/90c19c729cabdb864b8710a3469971b1.pts 04379243/expert_verified/points_label/90c19c729cabdb864b8710a3469971b1.seg 04379243 +02691156/points/d08471df3e76602427743256ca3834f.pts 02691156/expert_verified/points_label/d08471df3e76602427743256ca3834f.seg 02691156 +02958343/points/67c229c70e64a25e69c2e0a91b39f742.pts 02958343/expert_verified/points_label/67c229c70e64a25e69c2e0a91b39f742.seg 02958343 +04379243/points/1011e1c9812b84d2a9ed7bb5b55809f8.pts 04379243/expert_verified/points_label/1011e1c9812b84d2a9ed7bb5b55809f8.seg 04379243 +03636649/points/3e2d51c40b37c9c086052e834fbd2c4a.pts 03636649/expert_verified/points_label/3e2d51c40b37c9c086052e834fbd2c4a.seg 03636649 +03001627/points/6b385a32489bab4abbc7a6acbd8f058b.pts 03001627/expert_verified/points_label/6b385a32489bab4abbc7a6acbd8f058b.seg 03001627 +03001627/points/61d29e8133da0b58d1fd43e2bf80195.pts 03001627/expert_verified/points_label/61d29e8133da0b58d1fd43e2bf80195.seg 03001627 +04379243/points/d5f2968e4b7254ccf4104961857ca9c.pts 04379243/expert_verified/points_label/d5f2968e4b7254ccf4104961857ca9c.seg 04379243 +04379243/points/30c9865cfc4294a7ad16260d4d73b56.pts 04379243/expert_verified/points_label/30c9865cfc4294a7ad16260d4d73b56.seg 04379243 +03001627/points/76919a456a23b9779368d1198f406e7.pts 03001627/expert_verified/points_label/76919a456a23b9779368d1198f406e7.seg 03001627 +03001627/points/c12da8acb2c7973597e755dddca14449.pts 03001627/expert_verified/points_label/c12da8acb2c7973597e755dddca14449.seg 03001627 +02958343/points/a5dcd1196a1ffa9739f20966eb25504f.pts 02958343/expert_verified/points_label/a5dcd1196a1ffa9739f20966eb25504f.seg 02958343 +02691156/points/1deb997079e0b3cd6c1cd53dbc9f7b8e.pts 02691156/expert_verified/points_label/1deb997079e0b3cd6c1cd53dbc9f7b8e.seg 02691156 +03636649/points/afb7cc3bbc3595a4e9b3dff83c7ff715.pts 03636649/expert_verified/points_label/afb7cc3bbc3595a4e9b3dff83c7ff715.seg 03636649 +03636649/points/b4aee889d5e2a826f6747912091f1965.pts 03636649/expert_verified/points_label/b4aee889d5e2a826f6747912091f1965.seg 03636649 +03636649/points/ea71ba1d8d8c8e5888a1de3dc61bfeef.pts 03636649/expert_verified/points_label/ea71ba1d8d8c8e5888a1de3dc61bfeef.seg 03636649 +02958343/points/b0c2225ab347e28f1a48cf85d161a723.pts 02958343/expert_verified/points_label/b0c2225ab347e28f1a48cf85d161a723.seg 02958343 +03001627/points/1ab8a3b55c14a7b27eaeab1f0c9120b7.pts 03001627/expert_verified/points_label/1ab8a3b55c14a7b27eaeab1f0c9120b7.seg 03001627 +03261776/points/c6d19db35f69bae7b6d9c2cee7f2f72b.pts 03261776/expert_verified/points_label/c6d19db35f69bae7b6d9c2cee7f2f72b.seg 03261776 +03001627/points/6d6e634ff34bd350c511e6b9b3b344f3.pts 03001627/expert_verified/points_label/6d6e634ff34bd350c511e6b9b3b344f3.seg 03001627 +02691156/points/ce682d7a2bbf77b6fc4b92d3d335214a.pts 02691156/expert_verified/points_label/ce682d7a2bbf77b6fc4b92d3d335214a.seg 02691156 +03261776/points/943048e64cc2bc980a070963925e308.pts 03261776/expert_verified/points_label/943048e64cc2bc980a070963925e308.seg 03261776 +03642806/points/5a63c5f29f0bc0eb12d8efb2f101da03.pts 03642806/expert_verified/points_label/5a63c5f29f0bc0eb12d8efb2f101da03.seg 03642806 +04379243/points/19678fdb9bc926505e4b35ff1ea95f37.pts 04379243/expert_verified/points_label/19678fdb9bc926505e4b35ff1ea95f37.seg 04379243 +02958343/points/52f2a2472411fe2e6b418c7d9fedcaa9.pts 02958343/expert_verified/points_label/52f2a2472411fe2e6b418c7d9fedcaa9.seg 02958343 +03001627/points/1ee92a9d78cccbda98d2e7dbe701ca48.pts 03001627/expert_verified/points_label/1ee92a9d78cccbda98d2e7dbe701ca48.seg 03001627 +03001627/points/795f38ce5d8519938077cafed2bb8242.pts 03001627/expert_verified/points_label/795f38ce5d8519938077cafed2bb8242.seg 03001627 +03001627/points/5e5121cc58c4fea78ce66f12ba927a2b.pts 03001627/expert_verified/points_label/5e5121cc58c4fea78ce66f12ba927a2b.seg 03001627 +03001627/points/b998016472e9dd7a9b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/b998016472e9dd7a9b9f2eb77f5e247e.seg 03001627 +04379243/points/30b506e5e1fc282afdfcfddf24fb29ec.pts 04379243/expert_verified/points_label/30b506e5e1fc282afdfcfddf24fb29ec.seg 04379243 +03624134/points/bcd7ed830358dbd6d58ea69ee1ced10e.pts 03624134/expert_verified/points_label/bcd7ed830358dbd6d58ea69ee1ced10e.seg 03624134 +03001627/points/40d202afdcc49c6d35836c728d324152.pts 03001627/expert_verified/points_label/40d202afdcc49c6d35836c728d324152.seg 03001627 +03467517/points/fdb74c27462dfd837c481698bd5233b4.pts 03467517/expert_verified/points_label/fdb74c27462dfd837c481698bd5233b4.seg 03467517 +02691156/points/dc7c5d12854b9467b96212c8f6cd06e.pts 02691156/expert_verified/points_label/dc7c5d12854b9467b96212c8f6cd06e.seg 02691156 +02691156/points/48e9c61de4db838d84b83051fa0ae5d2.pts 02691156/expert_verified/points_label/48e9c61de4db838d84b83051fa0ae5d2.seg 02691156 +04379243/points/d187561a6b0cbd0acaed5ce7390f30b7.pts 04379243/expert_verified/points_label/d187561a6b0cbd0acaed5ce7390f30b7.seg 04379243 +04379243/points/ae9e04d050f5cba1492d9da2668ec34c.pts 04379243/expert_verified/points_label/ae9e04d050f5cba1492d9da2668ec34c.seg 04379243 +04379243/points/72c884f3b9b9119966f379f51753f72b.pts 04379243/expert_verified/points_label/72c884f3b9b9119966f379f51753f72b.seg 04379243 +02691156/points/917694a71164f2148e8405d6c51a908.pts 02691156/expert_verified/points_label/917694a71164f2148e8405d6c51a908.seg 02691156 +03001627/points/a2441f03fed7c13def31f91fe6afc8fa.pts 03001627/expert_verified/points_label/a2441f03fed7c13def31f91fe6afc8fa.seg 03001627 +03001627/points/49c955a80749d2e1a5ffdf44ff86b795.pts 03001627/expert_verified/points_label/49c955a80749d2e1a5ffdf44ff86b795.seg 03001627 +03636649/points/c43c89d862e10552b24ecc319936dfe2.pts 03636649/expert_verified/points_label/c43c89d862e10552b24ecc319936dfe2.seg 03636649 +03636649/points/e5ff9311bee487f5ca4aaad7dc0e3a16.pts 03636649/expert_verified/points_label/e5ff9311bee487f5ca4aaad7dc0e3a16.seg 03636649 +02958343/points/ba0ac1d1e25d3fad63f2c3a55558a78f.pts 02958343/expert_verified/points_label/ba0ac1d1e25d3fad63f2c3a55558a78f.seg 02958343 +04379243/points/2f58b1ca8634a6b48b9b51ae4415d5aa.pts 04379243/expert_verified/points_label/2f58b1ca8634a6b48b9b51ae4415d5aa.seg 04379243 +03001627/points/c585ee093bfd52af6512b7b24f3d84.pts 03001627/expert_verified/points_label/c585ee093bfd52af6512b7b24f3d84.seg 03001627 +03001627/points/46f6a6e0f239282fc8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/46f6a6e0f239282fc8687ff9b0b4e4ac.seg 03001627 +03642806/points/f72dc1ffeae0168aadcfd37206a0d18b.pts 03642806/expert_verified/points_label/f72dc1ffeae0168aadcfd37206a0d18b.seg 03642806 +03948459/points/1e83ef6ed5d0b78b7efb854782e23566.pts 03948459/expert_verified/points_label/1e83ef6ed5d0b78b7efb854782e23566.seg 03948459 +03001627/points/95e5f6e550761aefe65b629e4a22f51e.pts 03001627/expert_verified/points_label/95e5f6e550761aefe65b629e4a22f51e.seg 03001627 +03001627/points/b38d05caee69c7ac8fc6229eb64e56a.pts 03001627/expert_verified/points_label/b38d05caee69c7ac8fc6229eb64e56a.seg 03001627 +02691156/points/4ff50b9f815c58acca8607f540cc62ba.pts 02691156/expert_verified/points_label/4ff50b9f815c58acca8607f540cc62ba.seg 02691156 +03636649/points/78a11c0b8e964c9b41657e31b569b105.pts 03636649/expert_verified/points_label/78a11c0b8e964c9b41657e31b569b105.seg 03636649 +02958343/points/b1f75a8e8b9e921a8a6cf8c6b92417f2.pts 02958343/expert_verified/points_label/b1f75a8e8b9e921a8a6cf8c6b92417f2.seg 02958343 +02958343/points/a836fc66c01eccca58c27e607f6e2d4c.pts 02958343/expert_verified/points_label/a836fc66c01eccca58c27e607f6e2d4c.seg 02958343 +02691156/points/fac4af109beb0108b4f192eea1889928.pts 02691156/expert_verified/points_label/fac4af109beb0108b4f192eea1889928.seg 02691156 +03467517/points/b9c10bf6fc2095f93f0194265a9746c.pts 03467517/expert_verified/points_label/b9c10bf6fc2095f93f0194265a9746c.seg 03467517 +02691156/points/b976a48c015d6ced5e9e2656aff7dd5b.pts 02691156/expert_verified/points_label/b976a48c015d6ced5e9e2656aff7dd5b.seg 02691156 +04379243/points/889f48aa85accd2ee73947fdf756a329.pts 04379243/expert_verified/points_label/889f48aa85accd2ee73947fdf756a329.seg 04379243 +02691156/points/b6d61068ef2bf2d46059aeb39e538eb2.pts 02691156/expert_verified/points_label/b6d61068ef2bf2d46059aeb39e538eb2.seg 02691156 +04379243/points/d94de64641651a2079b3e1be3524f72f.pts 04379243/expert_verified/points_label/d94de64641651a2079b3e1be3524f72f.seg 04379243 +03001627/points/117bd6da01905949a81116f5456ee312.pts 03001627/expert_verified/points_label/117bd6da01905949a81116f5456ee312.seg 03001627 +03636649/points/845542d0f578a9db1ec48bc3c478566d.pts 03636649/expert_verified/points_label/845542d0f578a9db1ec48bc3c478566d.seg 03636649 +04379243/points/9391dcc782fa7f6bfdad344760a9dafd.pts 04379243/expert_verified/points_label/9391dcc782fa7f6bfdad344760a9dafd.seg 04379243 +04379243/points/fe99a1127734f7852b70eac6546e93fd.pts 04379243/expert_verified/points_label/fe99a1127734f7852b70eac6546e93fd.seg 04379243 +03001627/points/4e358c2dc0513971f98c0761af40e04.pts 03001627/expert_verified/points_label/4e358c2dc0513971f98c0761af40e04.seg 03001627 +03636649/points/53afad2e573b26b141657e31b569b105.pts 03636649/expert_verified/points_label/53afad2e573b26b141657e31b569b105.seg 03636649 +04379243/points/3e51742cb382aa1f79b3e1be3524f72f.pts 04379243/expert_verified/points_label/3e51742cb382aa1f79b3e1be3524f72f.seg 04379243 +02958343/points/4f17af1ca7ae689d409b2c4484d833cc.pts 02958343/expert_verified/points_label/4f17af1ca7ae689d409b2c4484d833cc.seg 02958343 +03467517/points/c739664436ac5237aa0c867d5b070a5d.pts 03467517/expert_verified/points_label/c739664436ac5237aa0c867d5b070a5d.seg 03467517 +03797390/points/61c10dccfa8e508e2d66cbf6a91063.pts 03797390/expert_verified/points_label/61c10dccfa8e508e2d66cbf6a91063.seg 03797390 +03467517/points/aa86d20d03b2303593f0194265a9746c.pts 03467517/expert_verified/points_label/aa86d20d03b2303593f0194265a9746c.seg 03467517 +04379243/points/2f98d5e721e84debaa8081a7009091db.pts 04379243/expert_verified/points_label/2f98d5e721e84debaa8081a7009091db.seg 04379243 +04379243/points/2a0f853dadd841f96f1e07a56c129dfc.pts 04379243/expert_verified/points_label/2a0f853dadd841f96f1e07a56c129dfc.seg 04379243 +03001627/points/8031478c3fe31ddcc337647acafe65f0.pts 03001627/expert_verified/points_label/8031478c3fe31ddcc337647acafe65f0.seg 03001627 +03636649/points/a53112591be182b9d93768e7b9b1eabf.pts 03636649/expert_verified/points_label/a53112591be182b9d93768e7b9b1eabf.seg 03636649 +03001627/points/5bc916f8b9d0a7c6b40f0ac0fb9a650d.pts 03001627/expert_verified/points_label/5bc916f8b9d0a7c6b40f0ac0fb9a650d.seg 03001627 +02691156/points/f2d4b8440d4bde5330afbcb38d77d0c3.pts 02691156/expert_verified/points_label/f2d4b8440d4bde5330afbcb38d77d0c3.seg 02691156 +03001627/points/e4274fc2b9e4a5511882515d09f3979e.pts 03001627/expert_verified/points_label/e4274fc2b9e4a5511882515d09f3979e.seg 03001627 +03001627/points/9ab18a33335373b2659dda512294c744.pts 03001627/expert_verified/points_label/9ab18a33335373b2659dda512294c744.seg 03001627 +04379243/points/32ea6609eb659a2cec3367bccf60e518.pts 04379243/expert_verified/points_label/32ea6609eb659a2cec3367bccf60e518.seg 04379243 +04379243/points/759cb93134fd5efde76bc197b3a3ffc0.pts 04379243/expert_verified/points_label/759cb93134fd5efde76bc197b3a3ffc0.seg 04379243 +03001627/points/b8b5e172ee58899df2d9e72ba502035.pts 03001627/expert_verified/points_label/b8b5e172ee58899df2d9e72ba502035.seg 03001627 +03001627/points/1886b3e3f3d4af3ace522e6dda26fb51.pts 03001627/expert_verified/points_label/1886b3e3f3d4af3ace522e6dda26fb51.seg 03001627 +03948459/points/3f5f657bec9a21814ce6ac98dc4781fe.pts 03948459/expert_verified/points_label/3f5f657bec9a21814ce6ac98dc4781fe.seg 03948459 +04379243/points/5adf5a7173e588ad76e9713f57a5fcb6.pts 04379243/expert_verified/points_label/5adf5a7173e588ad76e9713f57a5fcb6.seg 04379243 +03001627/points/f33b6f791e9d64387d01b77e04a0bc7b.pts 03001627/expert_verified/points_label/f33b6f791e9d64387d01b77e04a0bc7b.seg 03001627 +04379243/points/4e928377ae98ed8d99e8bf807e902261.pts 04379243/expert_verified/points_label/4e928377ae98ed8d99e8bf807e902261.seg 04379243 +03001627/points/d7867d215f52107ba5e8cf3aa1686d66.pts 03001627/expert_verified/points_label/d7867d215f52107ba5e8cf3aa1686d66.seg 03001627 +02691156/points/bddc2c1a4fae008947a1dbf5fd48a4dd.pts 02691156/expert_verified/points_label/bddc2c1a4fae008947a1dbf5fd48a4dd.seg 02691156 +02958343/points/bafacc7f28509d4157abc6fa0d632bc7.pts 02958343/expert_verified/points_label/bafacc7f28509d4157abc6fa0d632bc7.seg 02958343 +02691156/points/a14b262838529c2c81e1d9f6b27f1a92.pts 02691156/expert_verified/points_label/a14b262838529c2c81e1d9f6b27f1a92.seg 02691156 +03001627/points/38afa26a419ea3abed040525648fc6d7.pts 03001627/expert_verified/points_label/38afa26a419ea3abed040525648fc6d7.seg 03001627 +04379243/points/79f63a1564928af071a782a4379556c7.pts 04379243/expert_verified/points_label/79f63a1564928af071a782a4379556c7.seg 04379243 +04379243/points/cbd1cd9b5423f890beedb4c8fd29e2d1.pts 04379243/expert_verified/points_label/cbd1cd9b5423f890beedb4c8fd29e2d1.seg 04379243 +02691156/points/d74767519393a937f73e5bc170b7e2be.pts 02691156/expert_verified/points_label/d74767519393a937f73e5bc170b7e2be.seg 02691156 +03001627/points/9a82269e56737217e16571f1d370cad9.pts 03001627/expert_verified/points_label/9a82269e56737217e16571f1d370cad9.seg 03001627 +03001627/points/6e1e73e14637a28da1c367d7a459a9b7.pts 03001627/expert_verified/points_label/6e1e73e14637a28da1c367d7a459a9b7.seg 03001627 +03797390/points/eecb13f61a93b4048f58d8b19de93f99.pts 03797390/expert_verified/points_label/eecb13f61a93b4048f58d8b19de93f99.seg 03797390 +03001627/points/4f7523a3d276bfae4b3c42e318f3affc.pts 03001627/expert_verified/points_label/4f7523a3d276bfae4b3c42e318f3affc.seg 03001627 +03624134/points/f19fe19693937db1cb03b57fca000b1f.pts 03624134/expert_verified/points_label/f19fe19693937db1cb03b57fca000b1f.seg 03624134 +02958343/points/c3858a8b73dcb137e3bdba9430565083.pts 02958343/expert_verified/points_label/c3858a8b73dcb137e3bdba9430565083.seg 02958343 +04379243/points/3ce930bb150aef8a69fb38085fbc320c.pts 04379243/expert_verified/points_label/3ce930bb150aef8a69fb38085fbc320c.seg 04379243 +04379243/points/75e3cbf4b1ef0df971a782a4379556c7.pts 04379243/expert_verified/points_label/75e3cbf4b1ef0df971a782a4379556c7.seg 04379243 +04379243/points/5040f8f3e2293db448e116352760c52d.pts 04379243/expert_verified/points_label/5040f8f3e2293db448e116352760c52d.seg 04379243 +04379243/points/edaf24be15738ea2c5d1c45cadcaa3eb.pts 04379243/expert_verified/points_label/edaf24be15738ea2c5d1c45cadcaa3eb.seg 04379243 +04379243/points/6fb52c296531dc17beedb4c8fd29e2d1.pts 04379243/expert_verified/points_label/6fb52c296531dc17beedb4c8fd29e2d1.seg 04379243 +04379243/points/e777df6ffb40e3a1853d412328e7e7a6.pts 04379243/expert_verified/points_label/e777df6ffb40e3a1853d412328e7e7a6.seg 04379243 +03001627/points/9c103621101bcf9919fb4103277a6b93.pts 03001627/expert_verified/points_label/9c103621101bcf9919fb4103277a6b93.seg 03001627 +03001627/points/5d20adaf6d8f89fa2f1c10544d7d6f.pts 03001627/expert_verified/points_label/5d20adaf6d8f89fa2f1c10544d7d6f.seg 03001627 +02691156/points/b80bd34ab330babbc8727b27ee96a4b7.pts 02691156/expert_verified/points_label/b80bd34ab330babbc8727b27ee96a4b7.seg 02691156 +04379243/points/50d898f6d1c05cee2d99129afd32edf4.pts 04379243/expert_verified/points_label/50d898f6d1c05cee2d99129afd32edf4.seg 04379243 +04379243/points/c0c836c630cdb4bb664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/c0c836c630cdb4bb664b3b9b23ddfcbc.seg 04379243 +03790512/points/a1553e0bb7897a7ace0bf41e5f45753d.pts 03790512/expert_verified/points_label/a1553e0bb7897a7ace0bf41e5f45753d.seg 03790512 +03467517/points/7701180906a0aa156a7ae841f1f88f87.pts 03467517/expert_verified/points_label/7701180906a0aa156a7ae841f1f88f87.seg 03467517 +03467517/points/3ef569c13f4ab5f83ac61a2f8346a8f.pts 03467517/expert_verified/points_label/3ef569c13f4ab5f83ac61a2f8346a8f.seg 03467517 +03636649/points/3834d7f376879c03eca29403b7226aa1.pts 03636649/expert_verified/points_label/3834d7f376879c03eca29403b7226aa1.seg 03636649 +02958343/points/34ab29cea66952f16f48edd113a40fce.pts 02958343/expert_verified/points_label/34ab29cea66952f16f48edd113a40fce.seg 02958343 +02958343/points/e24f388736f4e6fd2cdd250493632937.pts 02958343/expert_verified/points_label/e24f388736f4e6fd2cdd250493632937.seg 02958343 +03001627/points/3ae022522800685c610195e4fb10d1de.pts 03001627/expert_verified/points_label/3ae022522800685c610195e4fb10d1de.seg 03001627 +02691156/points/49660fd24e5c2fbab87697d3904b168b.pts 02691156/expert_verified/points_label/49660fd24e5c2fbab87697d3904b168b.seg 02691156 +03642806/points/2d5d4d79cd464298566636e42679cc7f.pts 03642806/expert_verified/points_label/2d5d4d79cd464298566636e42679cc7f.seg 03642806 +04379243/points/7988dedacce42552ab610b0c94236463.pts 04379243/expert_verified/points_label/7988dedacce42552ab610b0c94236463.seg 04379243 +04379243/points/91ed62f2b3fd5919f12d7184a2ad3430.pts 04379243/expert_verified/points_label/91ed62f2b3fd5919f12d7184a2ad3430.seg 04379243 +03001627/points/a5898fefb1733333a82b0d8d157287f5.pts 03001627/expert_verified/points_label/a5898fefb1733333a82b0d8d157287f5.seg 03001627 +04379243/points/b4ef1de99422b08768661782af60b711.pts 04379243/expert_verified/points_label/b4ef1de99422b08768661782af60b711.seg 04379243 +03001627/points/df2b7e697ab6ca0f155d75bbf62b80.pts 03001627/expert_verified/points_label/df2b7e697ab6ca0f155d75bbf62b80.seg 03001627 +03467517/points/408a8e1b51266b9ccc34b900bb2492e.pts 03467517/expert_verified/points_label/408a8e1b51266b9ccc34b900bb2492e.seg 03467517 +03001627/points/597f2b2153af0c544aabcf2a7cb640f9.pts 03001627/expert_verified/points_label/597f2b2153af0c544aabcf2a7cb640f9.seg 03001627 +03001627/points/6870fbd4a7b733b0674f1c30a8cad95a.pts 03001627/expert_verified/points_label/6870fbd4a7b733b0674f1c30a8cad95a.seg 03001627 +03001627/points/e35d7d19dcdc9e5c30e06a011e63236a.pts 03001627/expert_verified/points_label/e35d7d19dcdc9e5c30e06a011e63236a.seg 03001627 +04225987/points/58ade10f7f87edc6e860048d7ced02e3.pts 04225987/expert_verified/points_label/58ade10f7f87edc6e860048d7ced02e3.seg 04225987 +04379243/points/39cf5ae2b497715a84253b2030fab070.pts 04379243/expert_verified/points_label/39cf5ae2b497715a84253b2030fab070.seg 04379243 +04379243/points/ab7b0db92f96381f8cbb8bac2032149c.pts 04379243/expert_verified/points_label/ab7b0db92f96381f8cbb8bac2032149c.seg 04379243 +03001627/points/b117b01ab380362db8134b0fbf68257d.pts 03001627/expert_verified/points_label/b117b01ab380362db8134b0fbf68257d.seg 03001627 +03467517/points/913f3c90f5b78256e98e318d424a4bb9.pts 03467517/expert_verified/points_label/913f3c90f5b78256e98e318d424a4bb9.seg 03467517 +04379243/points/831985fb385a5b2a9ae2d75b4fc35b7.pts 04379243/expert_verified/points_label/831985fb385a5b2a9ae2d75b4fc35b7.seg 04379243 +03467517/points/482b8b9a225b6ca1d57700c05b1862d8.pts 03467517/expert_verified/points_label/482b8b9a225b6ca1d57700c05b1862d8.seg 03467517 +03001627/points/93a6876247c7a015d84b8ba651dfb8ac.pts 03001627/expert_verified/points_label/93a6876247c7a015d84b8ba651dfb8ac.seg 03001627 +04379243/points/a78273aa10b2dfb0bc8d334f99e7f52.pts 04379243/expert_verified/points_label/a78273aa10b2dfb0bc8d334f99e7f52.seg 04379243 +04379243/points/3c686ac317c496f9a71c812e027f94d9.pts 04379243/expert_verified/points_label/3c686ac317c496f9a71c812e027f94d9.seg 04379243 +02691156/points/50755e616df58fe566cf1b4a8fc3914e.pts 02691156/expert_verified/points_label/50755e616df58fe566cf1b4a8fc3914e.seg 02691156 +03001627/points/8cedc8e684d60ff42a06d8c81262ef96.pts 03001627/expert_verified/points_label/8cedc8e684d60ff42a06d8c81262ef96.seg 03001627 +04379243/points/f74c321042dbc8e684d78f017ff73fd6.pts 04379243/expert_verified/points_label/f74c321042dbc8e684d78f017ff73fd6.seg 04379243 +02958343/points/5130947e5f18e73a8321b7d65a99d2a.pts 02958343/expert_verified/points_label/5130947e5f18e73a8321b7d65a99d2a.seg 02958343 +03261776/points/f5d210ff14ca9d29b6d9c2cee7f2f72b.pts 03261776/expert_verified/points_label/f5d210ff14ca9d29b6d9c2cee7f2f72b.seg 03261776 +03001627/points/d36de0f850783d8fd6b3090036b71698.pts 03001627/expert_verified/points_label/d36de0f850783d8fd6b3090036b71698.seg 03001627 +03001627/points/6897c2665267cca39eea64ae4d2b4158.pts 03001627/expert_verified/points_label/6897c2665267cca39eea64ae4d2b4158.seg 03001627 +03001627/points/6e98c5d61e008b4c2871cc0b3cc1a485.pts 03001627/expert_verified/points_label/6e98c5d61e008b4c2871cc0b3cc1a485.seg 03001627 +02958343/points/92f697d036addb55ed576c2966428f.pts 02958343/expert_verified/points_label/92f697d036addb55ed576c2966428f.seg 02958343 +04379243/points/f3fd419f725aa894ba5342d638d0c267.pts 04379243/expert_verified/points_label/f3fd419f725aa894ba5342d638d0c267.seg 04379243 +04379243/points/62eff79cf2e75bc2765ee729adbdf968.pts 04379243/expert_verified/points_label/62eff79cf2e75bc2765ee729adbdf968.seg 04379243 +03001627/points/98a1f8651c962402492d9da2668ec34c.pts 03001627/expert_verified/points_label/98a1f8651c962402492d9da2668ec34c.seg 03001627 +03636649/points/d90639e69c82f864eb2d9895648d1206.pts 03636649/expert_verified/points_label/d90639e69c82f864eb2d9895648d1206.seg 03636649 +02954340/points/a1494210f6774b87b3e0e60b857dde8f.pts 02954340/expert_verified/points_label/a1494210f6774b87b3e0e60b857dde8f.seg 02954340 +03467517/points/d528407fe43b5df193f0194265a9746c.pts 03467517/expert_verified/points_label/d528407fe43b5df193f0194265a9746c.seg 03467517 +03636649/points/776e4b38023091002cd2160e449d45ae.pts 03636649/expert_verified/points_label/776e4b38023091002cd2160e449d45ae.seg 03636649 +04379243/points/91df49ec00f2c5ce73f1ca2ca101a20d.pts 04379243/expert_verified/points_label/91df49ec00f2c5ce73f1ca2ca101a20d.seg 04379243 +04379243/points/47f25d5b367326ceaaf15b62af6b513f.pts 04379243/expert_verified/points_label/47f25d5b367326ceaaf15b62af6b513f.seg 04379243 +04379243/points/f5d6579b3a1f5a879d2be74cfb51ade1.pts 04379243/expert_verified/points_label/f5d6579b3a1f5a879d2be74cfb51ade1.seg 04379243 +02691156/points/f6ea6663b48bf78261f1ef59130c405d.pts 02691156/expert_verified/points_label/f6ea6663b48bf78261f1ef59130c405d.seg 02691156 +03001627/points/63da17eda9d415b5319c5e90e9cc9126.pts 03001627/expert_verified/points_label/63da17eda9d415b5319c5e90e9cc9126.seg 03001627 +02691156/points/9fb60716f0f5a2b84408eb298433d643.pts 02691156/expert_verified/points_label/9fb60716f0f5a2b84408eb298433d643.seg 02691156 +02773838/points/5161d9adede671d6edc32c5c9ec9f827.pts 02773838/expert_verified/points_label/5161d9adede671d6edc32c5c9ec9f827.seg 02773838 +04379243/points/696beb1883be838cc955e5ed03ef3a2f.pts 04379243/expert_verified/points_label/696beb1883be838cc955e5ed03ef3a2f.seg 04379243 +03001627/points/bc184c3cbe3349b19fb4103277a6b93.pts 03001627/expert_verified/points_label/bc184c3cbe3349b19fb4103277a6b93.seg 03001627 +03642806/points/28fbfd8b8c9c6f16e1e44e2fc05361d9.pts 03642806/expert_verified/points_label/28fbfd8b8c9c6f16e1e44e2fc05361d9.seg 03642806 +04379243/points/506e4e67efe1794c1dacbc3d67b5a11a.pts 04379243/expert_verified/points_label/506e4e67efe1794c1dacbc3d67b5a11a.seg 04379243 +02691156/points/a48676cfe44fd9bee40acb87a6be88b3.pts 02691156/expert_verified/points_label/a48676cfe44fd9bee40acb87a6be88b3.seg 02691156 +04379243/points/9e5926bfdc7f01749e65a3d2929a9516.pts 04379243/expert_verified/points_label/9e5926bfdc7f01749e65a3d2929a9516.seg 04379243 +04379243/points/dc47d49db6ac670635d498476a30ff0e.pts 04379243/expert_verified/points_label/dc47d49db6ac670635d498476a30ff0e.seg 04379243 +04379243/points/33c6e3b21a67b750e78d7b497732dce1.pts 04379243/expert_verified/points_label/33c6e3b21a67b750e78d7b497732dce1.seg 04379243 +04379243/points/27295a6f585b7817febad4f49b26ec52.pts 04379243/expert_verified/points_label/27295a6f585b7817febad4f49b26ec52.seg 04379243 +03624134/points/6f8b660661269406504c6b6d62466c67.pts 03624134/expert_verified/points_label/6f8b660661269406504c6b6d62466c67.seg 03624134 +03642806/points/dbc61cbed5f7f2b33c1abb78f1519c49.pts 03642806/expert_verified/points_label/dbc61cbed5f7f2b33c1abb78f1519c49.seg 03642806 +03001627/points/374bec02e71fe06528b4c5ec471dc963.pts 03001627/expert_verified/points_label/374bec02e71fe06528b4c5ec471dc963.seg 03001627 +03001627/points/b41aaea5754adae0444b41d6d7f557fa.pts 03001627/expert_verified/points_label/b41aaea5754adae0444b41d6d7f557fa.seg 03001627 +03001627/points/7f4f73ad1b3f882ba14472becb07b261.pts 03001627/expert_verified/points_label/7f4f73ad1b3f882ba14472becb07b261.seg 03001627 +03001627/points/b80122c3a0543a7b7eaeab1f0c9120b7.pts 03001627/expert_verified/points_label/b80122c3a0543a7b7eaeab1f0c9120b7.seg 03001627 +04379243/points/2e4fbab46e264616d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/2e4fbab46e264616d93768e7b9b1eabf.seg 04379243 +03001627/points/4a12589099b05c51e13b3410f3683610.pts 03001627/expert_verified/points_label/4a12589099b05c51e13b3410f3683610.seg 03001627 +03001627/points/bc523df998d94c7223ac0bd64c9cb255.pts 03001627/expert_verified/points_label/bc523df998d94c7223ac0bd64c9cb255.seg 03001627 +02691156/points/218caa58819e10d1fe40308d822f996c.pts 02691156/expert_verified/points_label/218caa58819e10d1fe40308d822f996c.seg 02691156 +04379243/points/a5e951c9d7a9a93f8cbb8bac2032149c.pts 04379243/expert_verified/points_label/a5e951c9d7a9a93f8cbb8bac2032149c.seg 04379243 +03636649/points/f228f6cd86162beb659dda512294c744.pts 03636649/expert_verified/points_label/f228f6cd86162beb659dda512294c744.seg 03636649 +03467517/points/648a820e550bdfd093f0194265a9746c.pts 03467517/expert_verified/points_label/648a820e550bdfd093f0194265a9746c.seg 03467517 +03624134/points/8f61777bf6b57fedc13545c5b1a2e607.pts 03624134/expert_verified/points_label/8f61777bf6b57fedc13545c5b1a2e607.seg 03624134 +03001627/points/bb9efb4912a018b3c329e2758ab09ecb.pts 03001627/expert_verified/points_label/bb9efb4912a018b3c329e2758ab09ecb.seg 03001627 +03001627/points/fdac1f9c0b030841c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/fdac1f9c0b030841c8687ff9b0b4e4ac.seg 03001627 +02691156/points/8ac8c21b63ff535fca8607f540cc62ba.pts 02691156/expert_verified/points_label/8ac8c21b63ff535fca8607f540cc62ba.seg 02691156 +03467517/points/4e4d180e78d8b52a93f0194265a9746c.pts 03467517/expert_verified/points_label/4e4d180e78d8b52a93f0194265a9746c.seg 03467517 +03636649/points/7bc1b202ebf000625949e084b65603cf.pts 03636649/expert_verified/points_label/7bc1b202ebf000625949e084b65603cf.seg 03636649 +03001627/points/3c8362c1e57c30d7e6c5cd45aa112726.pts 03001627/expert_verified/points_label/3c8362c1e57c30d7e6c5cd45aa112726.seg 03001627 +03001627/points/5510d5af1ab5714b3c42e318f3affc.pts 03001627/expert_verified/points_label/5510d5af1ab5714b3c42e318f3affc.seg 03001627 +04379243/points/4d393b562df7cfad9a16b095d67f7209.pts 04379243/expert_verified/points_label/4d393b562df7cfad9a16b095d67f7209.seg 04379243 +03797390/points/e984fd7e97c2be347eaeab1f0c9120b7.pts 03797390/expert_verified/points_label/e984fd7e97c2be347eaeab1f0c9120b7.seg 03797390 +03001627/points/483d22dbbee32ee54e5c7d89bdfc49a3.pts 03001627/expert_verified/points_label/483d22dbbee32ee54e5c7d89bdfc49a3.seg 03001627 +02691156/points/a5cd14be786fc8175e9e2656aff7dd5b.pts 02691156/expert_verified/points_label/a5cd14be786fc8175e9e2656aff7dd5b.seg 02691156 +03636649/points/d4bbd93c0d85e77d7934a0d24a61231.pts 03636649/expert_verified/points_label/d4bbd93c0d85e77d7934a0d24a61231.seg 03636649 +03467517/points/7027bc171baae1d663e148e250c0340d.pts 03467517/expert_verified/points_label/7027bc171baae1d663e148e250c0340d.seg 03467517 +03636649/points/1a44dd6ee873d443da13974b3533fb59.pts 03636649/expert_verified/points_label/1a44dd6ee873d443da13974b3533fb59.seg 03636649 +04379243/points/2e3037a285fd8b5c1be2a853ec4f9e8.pts 04379243/expert_verified/points_label/2e3037a285fd8b5c1be2a853ec4f9e8.seg 04379243 +04379243/points/e3b585b15506fa7113f96345312df593.pts 04379243/expert_verified/points_label/e3b585b15506fa7113f96345312df593.seg 04379243 +02958343/points/ee1d28a50a2b71e129348d14ca881f7d.pts 02958343/expert_verified/points_label/ee1d28a50a2b71e129348d14ca881f7d.seg 02958343 +03001627/points/22af872ac796ed26ff8d7c1096fae070.pts 03001627/expert_verified/points_label/22af872ac796ed26ff8d7c1096fae070.seg 03001627 +03642806/points/9b4ab67eb448c49c11ced4a54f2e6229.pts 03642806/expert_verified/points_label/9b4ab67eb448c49c11ced4a54f2e6229.seg 03642806 +03624134/points/1640911b9dc0ef0da95c6095f89cd899.pts 03624134/expert_verified/points_label/1640911b9dc0ef0da95c6095f89cd899.seg 03624134 +03001627/points/f6810de4042cc5ce57bd4bc6eae9b341.pts 03001627/expert_verified/points_label/f6810de4042cc5ce57bd4bc6eae9b341.seg 03001627 +03001627/points/c46eb7460be602b6bf80985a99195eb8.pts 03001627/expert_verified/points_label/c46eb7460be602b6bf80985a99195eb8.seg 03001627 +03624134/points/debbbf239d59d8724662dc124dd336ed.pts 03624134/expert_verified/points_label/debbbf239d59d8724662dc124dd336ed.seg 03624134 +04379243/points/5b51e63726f21bb6a75d03186a0409e2.pts 04379243/expert_verified/points_label/5b51e63726f21bb6a75d03186a0409e2.seg 04379243 +02691156/points/b59a7cab8e95f6eaf3a7414a84b5637.pts 02691156/expert_verified/points_label/b59a7cab8e95f6eaf3a7414a84b5637.seg 02691156 +03001627/points/52c32b187590e8f3bba5aaac798c64af.pts 03001627/expert_verified/points_label/52c32b187590e8f3bba5aaac798c64af.seg 03001627 +03001627/points/1c173d970e21e9a8be95ff480950e9ef.pts 03001627/expert_verified/points_label/1c173d970e21e9a8be95ff480950e9ef.seg 03001627 +03624134/points/7238d0009faeacb5fd770de1635caa0.pts 03624134/expert_verified/points_label/7238d0009faeacb5fd770de1635caa0.seg 03624134 +04379243/points/cc554812025dc498e7ed5b5b11f935c9.pts 04379243/expert_verified/points_label/cc554812025dc498e7ed5b5b11f935c9.seg 04379243 +04379243/points/fff492e352c8cb336240c88cd4684446.pts 04379243/expert_verified/points_label/fff492e352c8cb336240c88cd4684446.seg 04379243 +03636649/points/e0a2948797cc33b2e19a0cc107ada7cd.pts 03636649/expert_verified/points_label/e0a2948797cc33b2e19a0cc107ada7cd.seg 03636649 +03636649/points/fe02f6594ed8b96ae85a3dc26b76b2ae.pts 03636649/expert_verified/points_label/fe02f6594ed8b96ae85a3dc26b76b2ae.seg 03636649 +04379243/points/d4a7a1dc0f1a51986f15d61c214769af.pts 04379243/expert_verified/points_label/d4a7a1dc0f1a51986f15d61c214769af.seg 04379243 +03624134/points/3dbda789bc59a5f99246ea0301684d80.pts 03624134/expert_verified/points_label/3dbda789bc59a5f99246ea0301684d80.seg 03624134 +04379243/points/b82e068c2c18cd67b09f0ca9c143fdfd.pts 04379243/expert_verified/points_label/b82e068c2c18cd67b09f0ca9c143fdfd.seg 04379243 +03001627/points/b360f2264526521f1dee989d1177ef4e.pts 03001627/expert_verified/points_label/b360f2264526521f1dee989d1177ef4e.seg 03001627 +02691156/points/8ff8f3c845e7ae8443afdb9c81ff2967.pts 02691156/expert_verified/points_label/8ff8f3c845e7ae8443afdb9c81ff2967.seg 02691156 +03001627/points/ea87765cf9dbe2fe55f46d55537192b6.pts 03001627/expert_verified/points_label/ea87765cf9dbe2fe55f46d55537192b6.seg 03001627 +03001627/points/df23ca11080bb439676c272956dad3c2.pts 03001627/expert_verified/points_label/df23ca11080bb439676c272956dad3c2.seg 03001627 +03790512/points/a3dfeae5bced3533b37378f3c85478b4.pts 03790512/expert_verified/points_label/a3dfeae5bced3533b37378f3c85478b4.seg 03790512 +04379243/points/9af7a071bbd432baa5526f91aecc0c37.pts 04379243/expert_verified/points_label/9af7a071bbd432baa5526f91aecc0c37.seg 04379243 +03001627/points/a8b5f5b6bf0cb2d6876b399a99a15c0f.pts 03001627/expert_verified/points_label/a8b5f5b6bf0cb2d6876b399a99a15c0f.seg 03001627 +03001627/points/c7e590c0390e8d5debe67d9b32c3ddf8.pts 03001627/expert_verified/points_label/c7e590c0390e8d5debe67d9b32c3ddf8.seg 03001627 +03790512/points/4f30742005b7c20e883158c0007ed9ba.pts 03790512/expert_verified/points_label/4f30742005b7c20e883158c0007ed9ba.seg 03790512 +04379243/points/40b632472f8e69a7664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/40b632472f8e69a7664b3b9b23ddfcbc.seg 04379243 +03467517/points/d71c17b4d1ffa131f10a27cbb87f3a5.pts 03467517/expert_verified/points_label/d71c17b4d1ffa131f10a27cbb87f3a5.seg 03467517 +04379243/points/f563e9cd92a0dbe5a07b1c1d0ca9cf45.pts 04379243/expert_verified/points_label/f563e9cd92a0dbe5a07b1c1d0ca9cf45.seg 04379243 +03797390/points/1a97f3c83016abca21d0de04f408950f.pts 03797390/expert_verified/points_label/1a97f3c83016abca21d0de04f408950f.seg 03797390 +04379243/points/c3135e3b21b42e132449009b96f8a6ed.pts 04379243/expert_verified/points_label/c3135e3b21b42e132449009b96f8a6ed.seg 04379243 +03636649/points/89b168160388c29da996f5a90dae9cac.pts 03636649/expert_verified/points_label/89b168160388c29da996f5a90dae9cac.seg 03636649 +02958343/points/8bbbfdbec9251733ace5721ccacba16.pts 02958343/expert_verified/points_label/8bbbfdbec9251733ace5721ccacba16.seg 02958343 +04379243/points/db5a895ae7358c97b66213207f46bee7.pts 04379243/expert_verified/points_label/db5a895ae7358c97b66213207f46bee7.seg 04379243 +03001627/points/6a28919186eb55ecf69d0cf4fdc89b12.pts 03001627/expert_verified/points_label/6a28919186eb55ecf69d0cf4fdc89b12.seg 03001627 +04379243/points/e7169243daef074dc82dc2efb3363de1.pts 04379243/expert_verified/points_label/e7169243daef074dc82dc2efb3363de1.seg 04379243 +03467517/points/4ae5a491c3ffb473462c6cdd250c26bb.pts 03467517/expert_verified/points_label/4ae5a491c3ffb473462c6cdd250c26bb.seg 03467517 +04379243/points/e1a8e9e2059f4792fbb8cbddab1c2002.pts 04379243/expert_verified/points_label/e1a8e9e2059f4792fbb8cbddab1c2002.seg 04379243 +03467517/points/364f85832427992343820c03f9f59458.pts 03467517/expert_verified/points_label/364f85832427992343820c03f9f59458.seg 03467517 +02958343/points/4822076e48b366371f0d59cde6139796.pts 02958343/expert_verified/points_label/4822076e48b366371f0d59cde6139796.seg 02958343 +03636649/points/d34a10201a5448a253cf897b7fc1d12.pts 03636649/expert_verified/points_label/d34a10201a5448a253cf897b7fc1d12.seg 03636649 +03467517/points/77095861248c816693f0194265a9746c.pts 03467517/expert_verified/points_label/77095861248c816693f0194265a9746c.seg 03467517 +04379243/points/dacde6546ca2e07f66dc6ea1ac82d91f.pts 04379243/expert_verified/points_label/dacde6546ca2e07f66dc6ea1ac82d91f.seg 04379243 +03636649/points/670ad2964ad5a98c9f1a71e46bbde97c.pts 03636649/expert_verified/points_label/670ad2964ad5a98c9f1a71e46bbde97c.seg 03636649 +02691156/points/77c9fd0f0c6b0e9fca8607f540cc62ba.pts 02691156/expert_verified/points_label/77c9fd0f0c6b0e9fca8607f540cc62ba.seg 02691156 +03001627/points/5fc6b04623ae6a9963ed57e35c972b4b.pts 03001627/expert_verified/points_label/5fc6b04623ae6a9963ed57e35c972b4b.seg 03001627 +02958343/points/f18093ac0242d439f500cc506a763c18.pts 02958343/expert_verified/points_label/f18093ac0242d439f500cc506a763c18.seg 02958343 +03001627/points/2fed64c67552aa689c1db271ad9472a7.pts 03001627/expert_verified/points_label/2fed64c67552aa689c1db271ad9472a7.seg 03001627 +03001627/points/bf7e8e0dc4f4038cc2567be77cb7ab45.pts 03001627/expert_verified/points_label/bf7e8e0dc4f4038cc2567be77cb7ab45.seg 03001627 +04379243/points/690e073a4000c7ae540e292bd26f307a.pts 04379243/expert_verified/points_label/690e073a4000c7ae540e292bd26f307a.seg 04379243 +03467517/points/5fc56e6d220d775e381b7fbf79296afb.pts 03467517/expert_verified/points_label/5fc56e6d220d775e381b7fbf79296afb.seg 03467517 +04379243/points/8af3fd230ea7ac6518101790733ed6b2.pts 04379243/expert_verified/points_label/8af3fd230ea7ac6518101790733ed6b2.seg 04379243 +03636649/points/80436dff2a30721849655ac7c771b113.pts 03636649/expert_verified/points_label/80436dff2a30721849655ac7c771b113.seg 03636649 +03790512/points/b767982d38b5171e429f1c522640e6f0.pts 03790512/expert_verified/points_label/b767982d38b5171e429f1c522640e6f0.seg 03790512 +03001627/points/40e6fb27aeb9c9ab44f999802029a79a.pts 03001627/expert_verified/points_label/40e6fb27aeb9c9ab44f999802029a79a.seg 03001627 +04379243/points/59e1afdec89de9442b70eac6546e93fd.pts 04379243/expert_verified/points_label/59e1afdec89de9442b70eac6546e93fd.seg 04379243 +02691156/points/43d8125d940bb2ae850f318836ee7512.pts 02691156/expert_verified/points_label/43d8125d940bb2ae850f318836ee7512.seg 02691156 +02691156/points/cbc9d6ae9d22fcc57f3efc94c2d31dc5.pts 02691156/expert_verified/points_label/cbc9d6ae9d22fcc57f3efc94c2d31dc5.seg 02691156 +04379243/points/f585560965413925d706ecb3379aa341.pts 04379243/expert_verified/points_label/f585560965413925d706ecb3379aa341.seg 04379243 +04379243/points/adee49b8f5251efeaade78cbbf8fad3b.pts 04379243/expert_verified/points_label/adee49b8f5251efeaade78cbbf8fad3b.seg 04379243 +03261776/points/ccf84f2cbd3ebeb247ba1bc05b9a0f37.pts 03261776/expert_verified/points_label/ccf84f2cbd3ebeb247ba1bc05b9a0f37.seg 03261776 +03001627/points/2343e2c4fa69f33a2ff834514c92e8fd.pts 03001627/expert_verified/points_label/2343e2c4fa69f33a2ff834514c92e8fd.seg 03001627 +03636649/points/1d89da4ac1538ada9c949ae6274aa016.pts 03636649/expert_verified/points_label/1d89da4ac1538ada9c949ae6274aa016.seg 03636649 +03001627/points/51e14c516e45ec3b18ed59365c9648a7.pts 03001627/expert_verified/points_label/51e14c516e45ec3b18ed59365c9648a7.seg 03001627 +03001627/points/1e276a016b664e424d678187b8261d95.pts 03001627/expert_verified/points_label/1e276a016b664e424d678187b8261d95.seg 03001627 +03636649/points/4deef34d95367b58c0d95250e682f6ee.pts 03636649/expert_verified/points_label/4deef34d95367b58c0d95250e682f6ee.seg 03636649 +03001627/points/5d3eff6a1b9a119da011ccf7cbabf68e.pts 03001627/expert_verified/points_label/5d3eff6a1b9a119da011ccf7cbabf68e.seg 03001627 +04379243/points/9afaf5ab87a889f67acae9ce58893de5.pts 04379243/expert_verified/points_label/9afaf5ab87a889f67acae9ce58893de5.seg 04379243 +04379243/points/5431993203dfcf797ec12e029bc725db.pts 04379243/expert_verified/points_label/5431993203dfcf797ec12e029bc725db.seg 04379243 +03001627/points/6a01eed3a575987211e48e4bcdc4a2a3.pts 03001627/expert_verified/points_label/6a01eed3a575987211e48e4bcdc4a2a3.seg 03001627 +02958343/points/a8f2c3adc0671c15c64e95fc6a597455.pts 02958343/expert_verified/points_label/a8f2c3adc0671c15c64e95fc6a597455.seg 02958343 +04379243/points/f60960ae4dc8e293c8ce22a41ea48e48.pts 04379243/expert_verified/points_label/f60960ae4dc8e293c8ce22a41ea48e48.seg 04379243 +03624134/points/3a4f0118a57093cbf7c4ed45ce654123.pts 03624134/expert_verified/points_label/3a4f0118a57093cbf7c4ed45ce654123.seg 03624134 +03636649/points/52783aa89adf06f3250c527721570ba0.pts 03636649/expert_verified/points_label/52783aa89adf06f3250c527721570ba0.seg 03636649 +03001627/points/b13a4df698183bf9afb6676a5cd782b6.pts 03001627/expert_verified/points_label/b13a4df698183bf9afb6676a5cd782b6.seg 03001627 +03636649/points/26f725bb6578936cd247b9308cd5c441.pts 03636649/expert_verified/points_label/26f725bb6578936cd247b9308cd5c441.seg 03636649 +03001627/points/6df1ecffaa0abdbf327289c00b6dc9ca.pts 03001627/expert_verified/points_label/6df1ecffaa0abdbf327289c00b6dc9ca.seg 03001627 +04379243/points/3c475d9f0433a7eaad2650d014e970a5.pts 04379243/expert_verified/points_label/3c475d9f0433a7eaad2650d014e970a5.seg 04379243 +02958343/points/fee1c13922c07e8711b978ff9450f61b.pts 02958343/expert_verified/points_label/fee1c13922c07e8711b978ff9450f61b.seg 02958343 +04379243/points/6bc941dbd290c7f21acdac000802e11c.pts 04379243/expert_verified/points_label/6bc941dbd290c7f21acdac000802e11c.seg 04379243 +02958343/points/6333b9c777384ad14362be10a3fc8255.pts 02958343/expert_verified/points_label/6333b9c777384ad14362be10a3fc8255.seg 02958343 +03001627/points/9a35f15e924e19db637adadafee6f182.pts 03001627/expert_verified/points_label/9a35f15e924e19db637adadafee6f182.seg 03001627 +03001627/points/b0531a0d44fc22144224ee0743294f79.pts 03001627/expert_verified/points_label/b0531a0d44fc22144224ee0743294f79.seg 03001627 +03636649/points/913ff6452d0ea43c9d62807daf4a2134.pts 03636649/expert_verified/points_label/913ff6452d0ea43c9d62807daf4a2134.seg 03636649 +03467517/points/e45f323ce7ecab8393f0194265a9746c.pts 03467517/expert_verified/points_label/e45f323ce7ecab8393f0194265a9746c.seg 03467517 +02691156/points/aa2af754642256c08699933784576e73.pts 02691156/expert_verified/points_label/aa2af754642256c08699933784576e73.seg 02691156 +04379243/points/75b308ba45762ad499e8bf807e902261.pts 04379243/expert_verified/points_label/75b308ba45762ad499e8bf807e902261.seg 04379243 +03001627/points/3622d983fd6d7b98e3a73d090627e9ba.pts 03001627/expert_verified/points_label/3622d983fd6d7b98e3a73d090627e9ba.seg 03001627 +04225987/points/db4c8bf323465e4c537d393009a79347.pts 04225987/expert_verified/points_label/db4c8bf323465e4c537d393009a79347.seg 04225987 +04379243/points/132bfde1fabe9ab771a782a4379556c7.pts 04379243/expert_verified/points_label/132bfde1fabe9ab771a782a4379556c7.seg 04379243 +03001627/points/3dc8243b17bc790620768660cf080d12.pts 03001627/expert_verified/points_label/3dc8243b17bc790620768660cf080d12.seg 03001627 +04379243/points/ccb96ea5f047c97f278d386bfa54545.pts 04379243/expert_verified/points_label/ccb96ea5f047c97f278d386bfa54545.seg 04379243 +04379243/points/14ae5631e7dfa10430bbd4cddd04c77b.pts 04379243/expert_verified/points_label/14ae5631e7dfa10430bbd4cddd04c77b.seg 04379243 +04379243/points/78a81cbd2a5720d93a938fdd57fac3b4.pts 04379243/expert_verified/points_label/78a81cbd2a5720d93a938fdd57fac3b4.seg 04379243 +04379243/points/307bdd2a06137694a10ff7fd5e43a633.pts 04379243/expert_verified/points_label/307bdd2a06137694a10ff7fd5e43a633.seg 04379243 +03001627/points/f3573756e64259f2b29d280b4e59c527.pts 03001627/expert_verified/points_label/f3573756e64259f2b29d280b4e59c527.seg 03001627 +04379243/points/1815c6431b06dfb4f008d8a3590fb522.pts 04379243/expert_verified/points_label/1815c6431b06dfb4f008d8a3590fb522.seg 04379243 +04379243/points/7fda06ada2d897baadab4c26397edfab.pts 04379243/expert_verified/points_label/7fda06ada2d897baadab4c26397edfab.seg 04379243 +04379243/points/86b48365b2bd587e61830bc1b4d6c5ea.pts 04379243/expert_verified/points_label/86b48365b2bd587e61830bc1b4d6c5ea.seg 04379243 +03948459/points/6aae44dd39fb9476f059c10da31213ea.pts 03948459/expert_verified/points_label/6aae44dd39fb9476f059c10da31213ea.seg 03948459 +04379243/points/424c77a1f39ac41620dd2dd4d7d7656c.pts 04379243/expert_verified/points_label/424c77a1f39ac41620dd2dd4d7d7656c.seg 04379243 +03001627/points/8778c23fd21bdebf8a80d99ff4e76c20.pts 03001627/expert_verified/points_label/8778c23fd21bdebf8a80d99ff4e76c20.seg 03001627 +03001627/points/257deb231ce652169f2349486c570dd4.pts 03001627/expert_verified/points_label/257deb231ce652169f2349486c570dd4.seg 03001627 +03642806/points/e5559cd005d5c4942a7b0c74c5f22fc4.pts 03642806/expert_verified/points_label/e5559cd005d5c4942a7b0c74c5f22fc4.seg 03642806 +03001627/points/986e49bd8314d7424addf6a5f8726274.pts 03001627/expert_verified/points_label/986e49bd8314d7424addf6a5f8726274.seg 03001627 +04379243/points/b3fc5247186936f1dcfcef693e7ec696.pts 04379243/expert_verified/points_label/b3fc5247186936f1dcfcef693e7ec696.seg 04379243 +02691156/points/da9d111e1175d318bbf3143b1cb6076a.pts 02691156/expert_verified/points_label/da9d111e1175d318bbf3143b1cb6076a.seg 02691156 +04379243/points/54b26954e478b1a34ea8d5f5f27d7ce3.pts 04379243/expert_verified/points_label/54b26954e478b1a34ea8d5f5f27d7ce3.seg 04379243 +03001627/points/2d44744a7ea0bf724b3c42e318f3affc.pts 03001627/expert_verified/points_label/2d44744a7ea0bf724b3c42e318f3affc.seg 03001627 +04379243/points/9dd63148e5b0a4f79eaa55bb236fb6e1.pts 04379243/expert_verified/points_label/9dd63148e5b0a4f79eaa55bb236fb6e1.seg 04379243 +04379243/points/6ab7ebf9b94176456f1e07a56c129dfc.pts 04379243/expert_verified/points_label/6ab7ebf9b94176456f1e07a56c129dfc.seg 04379243 +03001627/points/6aaa9bd6e835eb0f9b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/6aaa9bd6e835eb0f9b9f2eb77f5e247e.seg 03001627 +03636649/points/34020466b4342812218c9f1216abefd.pts 03636649/expert_verified/points_label/34020466b4342812218c9f1216abefd.seg 03636649 +03001627/points/df7735e2bce09a511f98c0761af40e04.pts 03001627/expert_verified/points_label/df7735e2bce09a511f98c0761af40e04.seg 03001627 +03636649/points/1d963d5c54613202b0aa15078ea6f391.pts 03636649/expert_verified/points_label/1d963d5c54613202b0aa15078ea6f391.seg 03636649 +03636649/points/5a9e0dd068e2436bd7ebac63aa51083.pts 03636649/expert_verified/points_label/5a9e0dd068e2436bd7ebac63aa51083.seg 03636649 +03001627/points/b1f50d8d41a8c53b6197fd390b16d14d.pts 03001627/expert_verified/points_label/b1f50d8d41a8c53b6197fd390b16d14d.seg 03001627 +03001627/points/285931af369b12c2ccd42a2d6eea63ed.pts 03001627/expert_verified/points_label/285931af369b12c2ccd42a2d6eea63ed.seg 03001627 +03636649/points/69429d8ffb5009a82060e7309fc3fc6.pts 03636649/expert_verified/points_label/69429d8ffb5009a82060e7309fc3fc6.seg 03636649 +04379243/points/63b53646b3562677d395837145ded71.pts 04379243/expert_verified/points_label/63b53646b3562677d395837145ded71.seg 04379243 +03001627/points/ee5ee3f6759aabacf2f43e6f841bd32b.pts 03001627/expert_verified/points_label/ee5ee3f6759aabacf2f43e6f841bd32b.seg 03001627 +02691156/points/bdfbf1c555dacd9d325212819caa597d.pts 02691156/expert_verified/points_label/bdfbf1c555dacd9d325212819caa597d.seg 02691156 +04379243/points/9f321f05a7808719ab610b0c94236463.pts 04379243/expert_verified/points_label/9f321f05a7808719ab610b0c94236463.seg 04379243 +03624134/points/fb1f385d487d13d7aa0079d6fb0f853c.pts 03624134/expert_verified/points_label/fb1f385d487d13d7aa0079d6fb0f853c.seg 03624134 +04379243/points/109738784a0a6129a02c88fe01f2b9c1.pts 04379243/expert_verified/points_label/109738784a0a6129a02c88fe01f2b9c1.seg 04379243 +03467517/points/65e3bdc247b3ce3d4de904d1abbce016.pts 03467517/expert_verified/points_label/65e3bdc247b3ce3d4de904d1abbce016.seg 03467517 +02691156/points/94ce3a5ad2576e73a5cac89017eae8d1.pts 02691156/expert_verified/points_label/94ce3a5ad2576e73a5cac89017eae8d1.seg 02691156 +03001627/points/80fab0c55a60abb7dafb0be26f6b45d5.pts 03001627/expert_verified/points_label/80fab0c55a60abb7dafb0be26f6b45d5.seg 03001627 +04379243/points/e6ee101d3cb13bdd16a2b5862518c93.pts 04379243/expert_verified/points_label/e6ee101d3cb13bdd16a2b5862518c93.seg 04379243 +04379243/points/6f2ffe8c014a6a458af30108ea9ccb6c.pts 04379243/expert_verified/points_label/6f2ffe8c014a6a458af30108ea9ccb6c.seg 04379243 +02958343/points/504793ed2da6cf7eba3e2415e22cd45c.pts 02958343/expert_verified/points_label/504793ed2da6cf7eba3e2415e22cd45c.seg 02958343 +03467517/points/9e26dcbac33f056c343b0b12983b9982.pts 03467517/expert_verified/points_label/9e26dcbac33f056c343b0b12983b9982.seg 03467517 +03467517/points/a92cd0b5d559075daa9518d76daaca23.pts 03467517/expert_verified/points_label/a92cd0b5d559075daa9518d76daaca23.seg 03467517 +03636649/points/b6989c99bba1226539b3360f500ac52a.pts 03636649/expert_verified/points_label/b6989c99bba1226539b3360f500ac52a.seg 03636649 +03624134/points/cc38f97557029b2a2b5fd8277662be97.pts 03624134/expert_verified/points_label/cc38f97557029b2a2b5fd8277662be97.seg 03624134 +03790512/points/41cc9674e700c3fdb37378f3c85478b4.pts 03790512/expert_verified/points_label/41cc9674e700c3fdb37378f3c85478b4.seg 03790512 +03001627/points/56b171b1f1521d27291d12adef12641b.pts 03001627/expert_verified/points_label/56b171b1f1521d27291d12adef12641b.seg 03001627 +03636649/points/ddc2d39dac6e84506c5b8009db95f66f.pts 03636649/expert_verified/points_label/ddc2d39dac6e84506c5b8009db95f66f.seg 03636649 +02691156/points/edc185566c1df89c35fc197bbabcd5bd.pts 02691156/expert_verified/points_label/edc185566c1df89c35fc197bbabcd5bd.seg 02691156 +04379243/points/fb5e8a6361262c26acf7920879052e93.pts 04379243/expert_verified/points_label/fb5e8a6361262c26acf7920879052e93.seg 04379243 +04379243/points/8862cddf90fddb3119fb4103277a6b93.pts 04379243/expert_verified/points_label/8862cddf90fddb3119fb4103277a6b93.seg 04379243 +02691156/points/d5a94c9f09d238c4c3a35cee92bb95b.pts 02691156/expert_verified/points_label/d5a94c9f09d238c4c3a35cee92bb95b.seg 02691156 +03636649/points/1682d4404196cf127588e2ca59b15f8.pts 03636649/expert_verified/points_label/1682d4404196cf127588e2ca59b15f8.seg 03636649 +04379243/points/2f33abdfe147813e44949d7685cb63ea.pts 04379243/expert_verified/points_label/2f33abdfe147813e44949d7685cb63ea.seg 04379243 +03001627/points/e158f7ba6828db5c654ea6737b0d3597.pts 03001627/expert_verified/points_label/e158f7ba6828db5c654ea6737b0d3597.seg 03001627 +04379243/points/564474f25a4400c5dc20930e6fc85682.pts 04379243/expert_verified/points_label/564474f25a4400c5dc20930e6fc85682.seg 04379243 +04379243/points/eb379b2b95e76502e258d1c3e7302e7b.pts 04379243/expert_verified/points_label/eb379b2b95e76502e258d1c3e7302e7b.seg 04379243 +03001627/points/3a1b54325b3565e72ca4b544d68c52.pts 03001627/expert_verified/points_label/3a1b54325b3565e72ca4b544d68c52.seg 03001627 +04225987/points/393ca71bd734f3071082f2ea630bf69e.pts 04225987/expert_verified/points_label/393ca71bd734f3071082f2ea630bf69e.seg 04225987 +03636649/points/bd1cbcb990375022b45fed2806c331ab.pts 03636649/expert_verified/points_label/bd1cbcb990375022b45fed2806c331ab.seg 03636649 +03001627/points/6a9dce6566cd61652b339ec555ba3bfc.pts 03001627/expert_verified/points_label/6a9dce6566cd61652b339ec555ba3bfc.seg 03001627 +02691156/points/94379090010cd6bb874c9ce092a813ef.pts 02691156/expert_verified/points_label/94379090010cd6bb874c9ce092a813ef.seg 02691156 +02773838/points/d3bd250ca3cb8e29976855a35549333.pts 02773838/expert_verified/points_label/d3bd250ca3cb8e29976855a35549333.seg 02773838 +03001627/points/36cb782fbc164ac312591a3ac05fadf1.pts 03001627/expert_verified/points_label/36cb782fbc164ac312591a3ac05fadf1.seg 03001627 +03642806/points/2211a40cc77a085362c091e763f81d3.pts 03642806/expert_verified/points_label/2211a40cc77a085362c091e763f81d3.seg 03642806 +04379243/points/5cbd726c3ffd8fc49b458816be7a3962.pts 04379243/expert_verified/points_label/5cbd726c3ffd8fc49b458816be7a3962.seg 04379243 +02691156/points/72aee7d0e998a68aca8607f540cc62ba.pts 02691156/expert_verified/points_label/72aee7d0e998a68aca8607f540cc62ba.seg 02691156 +04379243/points/1c3310f4c05ce1f6a192483aa282f8e5.pts 04379243/expert_verified/points_label/1c3310f4c05ce1f6a192483aa282f8e5.seg 04379243 +04379243/points/4ced745f960f7439b91767277279ac70.pts 04379243/expert_verified/points_label/4ced745f960f7439b91767277279ac70.seg 04379243 +03642806/points/8d70fb6adc63e21eb7e0383b9609fa5.pts 03642806/expert_verified/points_label/8d70fb6adc63e21eb7e0383b9609fa5.seg 03642806 +03001627/points/2bd6800d64c01d677721fafb59ea099.pts 03001627/expert_verified/points_label/2bd6800d64c01d677721fafb59ea099.seg 03001627 +03467517/points/1abe78447898821e93f0194265a9746c.pts 03467517/expert_verified/points_label/1abe78447898821e93f0194265a9746c.seg 03467517 +02691156/points/9bf3c126d5918c41f5c7319b71bdce6e.pts 02691156/expert_verified/points_label/9bf3c126d5918c41f5c7319b71bdce6e.seg 02691156 +03642806/points/1312ea502b4e9b51701c1f58e22b85e8.pts 03642806/expert_verified/points_label/1312ea502b4e9b51701c1f58e22b85e8.seg 03642806 +04379243/points/a9cc8112fb8c4ed5dfd21203bf8b4b46.pts 04379243/expert_verified/points_label/a9cc8112fb8c4ed5dfd21203bf8b4b46.seg 04379243 +03642806/points/62b25a5e3119b8409023147b38c03c9f.pts 03642806/expert_verified/points_label/62b25a5e3119b8409023147b38c03c9f.seg 03642806 +04379243/points/a4fcd8afe8b6de585beaf00da5b709c2.pts 04379243/expert_verified/points_label/a4fcd8afe8b6de585beaf00da5b709c2.seg 04379243 +03636649/points/907fd296708ae71dd5fab5deb286066.pts 03636649/expert_verified/points_label/907fd296708ae71dd5fab5deb286066.seg 03636649 +04379243/points/c5ae96124c15c734e6c5cd45aa112726.pts 04379243/expert_verified/points_label/c5ae96124c15c734e6c5cd45aa112726.seg 04379243 +03642806/points/ef6d43add46d0cae4e07b09c086cc5c4.pts 03642806/expert_verified/points_label/ef6d43add46d0cae4e07b09c086cc5c4.seg 03642806 +04379243/points/8d07df2bf706cda58c5591114064d173.pts 04379243/expert_verified/points_label/8d07df2bf706cda58c5591114064d173.seg 04379243 +02958343/points/5316fab78a6732f0428df271ebc70bc0.pts 02958343/expert_verified/points_label/5316fab78a6732f0428df271ebc70bc0.seg 02958343 +03467517/points/7946e354e342f560c5a468097fc791e4.pts 03467517/expert_verified/points_label/7946e354e342f560c5a468097fc791e4.seg 03467517 +03467517/points/d3684d071dcb6bffd3193ed047bef161.pts 03467517/expert_verified/points_label/d3684d071dcb6bffd3193ed047bef161.seg 03467517 +04379243/points/33b081062b2195e71771ee930e861b13.pts 04379243/expert_verified/points_label/33b081062b2195e71771ee930e861b13.seg 04379243 +02958343/points/511962626501e4abf500cc506a763c18.pts 02958343/expert_verified/points_label/511962626501e4abf500cc506a763c18.seg 02958343 +03797390/points/c82b9f1b98f044fc15cf6e5ad80f2da.pts 03797390/expert_verified/points_label/c82b9f1b98f044fc15cf6e5ad80f2da.seg 03797390 +04379243/points/49f625856c796254d249abd69334079c.pts 04379243/expert_verified/points_label/49f625856c796254d249abd69334079c.seg 04379243 +03001627/points/ca4900c42b8016ef8397cd720acaa508.pts 03001627/expert_verified/points_label/ca4900c42b8016ef8397cd720acaa508.seg 03001627 +03636649/points/31a15957bd4f32f87eedf2c7d21f7cfa.pts 03636649/expert_verified/points_label/31a15957bd4f32f87eedf2c7d21f7cfa.seg 03636649 +03797390/points/928a383f79698c3fb6d9bc28c8d8a2c4.pts 03797390/expert_verified/points_label/928a383f79698c3fb6d9bc28c8d8a2c4.seg 03797390 +04379243/points/17e5a64889ca085fa5526f91aecc0c37.pts 04379243/expert_verified/points_label/17e5a64889ca085fa5526f91aecc0c37.seg 04379243 +02958343/points/cbe2dc469c47bb80425b2c354eccabaf.pts 02958343/expert_verified/points_label/cbe2dc469c47bb80425b2c354eccabaf.seg 02958343 +03001627/points/19c8189116dd7cd3e95c611687989498.pts 03001627/expert_verified/points_label/19c8189116dd7cd3e95c611687989498.seg 03001627 +03636649/points/7f518fe982aae1b5940c8a2639c8747.pts 03636649/expert_verified/points_label/7f518fe982aae1b5940c8a2639c8747.seg 03636649 +03636649/points/7b1fef0071908d4bd93768e7b9b1eabf.pts 03636649/expert_verified/points_label/7b1fef0071908d4bd93768e7b9b1eabf.seg 03636649 +03001627/points/475e2c8f7a2c1bbd9acf9a86c283d1a2.pts 03001627/expert_verified/points_label/475e2c8f7a2c1bbd9acf9a86c283d1a2.seg 03001627 +03467517/points/5c805aca7aa8bdd3ac61a2f8346a8f.pts 03467517/expert_verified/points_label/5c805aca7aa8bdd3ac61a2f8346a8f.seg 03467517 +03790512/points/8032295bd3851d75468bac13e007a6e9.pts 03790512/expert_verified/points_label/8032295bd3851d75468bac13e007a6e9.seg 03790512 +02691156/points/3e0561d70c7fd4f51c6e4e20f2b76086.pts 02691156/expert_verified/points_label/3e0561d70c7fd4f51c6e4e20f2b76086.seg 02691156 +02691156/points/e5610bbacaf098508b96ae1a0a8b84ec.pts 02691156/expert_verified/points_label/e5610bbacaf098508b96ae1a0a8b84ec.seg 02691156 +03467517/points/97e8ee1b6df404bd57700c05b1862d8.pts 03467517/expert_verified/points_label/97e8ee1b6df404bd57700c05b1862d8.seg 03467517 +03636649/points/981b55897cee64403c8d0fdfb1cc2535.pts 03636649/expert_verified/points_label/981b55897cee64403c8d0fdfb1cc2535.seg 03636649 +04379243/points/204d9ecc196990ebe8479ad2eabcbab4.pts 04379243/expert_verified/points_label/204d9ecc196990ebe8479ad2eabcbab4.seg 04379243 +04379243/points/9d039675f4d51869f3edd695842c6d58.pts 04379243/expert_verified/points_label/9d039675f4d51869f3edd695842c6d58.seg 04379243 +03467517/points/cb5b2e3f499e4fdecc571cd3cf8f17a1.pts 03467517/expert_verified/points_label/cb5b2e3f499e4fdecc571cd3cf8f17a1.seg 03467517 +04379243/points/5243b5491a4f8a16a2b5862518c93.pts 04379243/expert_verified/points_label/5243b5491a4f8a16a2b5862518c93.seg 04379243 +04379243/points/efbf0d75648b7c7d5792b99b8245d225.pts 04379243/expert_verified/points_label/efbf0d75648b7c7d5792b99b8245d225.seg 04379243 +03001627/points/c8265e04c94bcb5a1346e336f65f96f6.pts 03001627/expert_verified/points_label/c8265e04c94bcb5a1346e336f65f96f6.seg 03001627 +02958343/points/94cfcfb74e246f938acb0ff76f4aec7d.pts 02958343/expert_verified/points_label/94cfcfb74e246f938acb0ff76f4aec7d.seg 02958343 +03467517/points/a0b6f040538d26e3ac61a2f8346a8f.pts 03467517/expert_verified/points_label/a0b6f040538d26e3ac61a2f8346a8f.seg 03467517 +03001627/points/70f1f85d47c970bb78dd615a59de5f05.pts 03001627/expert_verified/points_label/70f1f85d47c970bb78dd615a59de5f05.seg 03001627 +04379243/points/f4976e80b8533bcf85518f8659f21d56.pts 04379243/expert_verified/points_label/f4976e80b8533bcf85518f8659f21d56.seg 04379243 +03636649/points/9fdaafde365beafc37f7ce56c66316ea.pts 03636649/expert_verified/points_label/9fdaafde365beafc37f7ce56c66316ea.seg 03636649 +03467517/points/22033c6d7e5a90f193f0194265a9746c.pts 03467517/expert_verified/points_label/22033c6d7e5a90f193f0194265a9746c.seg 03467517 +02691156/points/c1b5dc92221bcdad5fc84bf2b9ef981.pts 02691156/expert_verified/points_label/c1b5dc92221bcdad5fc84bf2b9ef981.seg 02691156 +04379243/points/79d0985603f7ff3be6c5cd45aa112726.pts 04379243/expert_verified/points_label/79d0985603f7ff3be6c5cd45aa112726.seg 04379243 +03467517/points/5d6c1516b83dec8663e148e250c0340d.pts 03467517/expert_verified/points_label/5d6c1516b83dec8663e148e250c0340d.seg 03467517 +04379243/points/79c5df613523a462d42b9650f19dd425.pts 04379243/expert_verified/points_label/79c5df613523a462d42b9650f19dd425.seg 04379243 +03001627/points/f19e8da9d8f369c531e63f1270e2b445.pts 03001627/expert_verified/points_label/f19e8da9d8f369c531e63f1270e2b445.seg 03001627 +03001627/points/9a711bb7070ae88de948e3d64826c640.pts 03001627/expert_verified/points_label/9a711bb7070ae88de948e3d64826c640.seg 03001627 +03467517/points/2adbf6c3f8f2d9ca7fe36b1f0a632ed8.pts 03467517/expert_verified/points_label/2adbf6c3f8f2d9ca7fe36b1f0a632ed8.seg 03467517 +03001627/points/837ba605a4ab4a4f19fb4103277a6b93.pts 03001627/expert_verified/points_label/837ba605a4ab4a4f19fb4103277a6b93.seg 03001627 +03001627/points/807f08096308af5e28c0cecb7de2397a.pts 03001627/expert_verified/points_label/807f08096308af5e28c0cecb7de2397a.seg 03001627 +03467517/points/275c4f98ef07f2b393f0194265a9746c.pts 03467517/expert_verified/points_label/275c4f98ef07f2b393f0194265a9746c.seg 03467517 +04379243/points/57afaabf994feb305512673aa47c7e3d.pts 04379243/expert_verified/points_label/57afaabf994feb305512673aa47c7e3d.seg 04379243 +03001627/points/d9156f5552178de2713decb1a0563b12.pts 03001627/expert_verified/points_label/d9156f5552178de2713decb1a0563b12.seg 03001627 +03948459/points/fe62130ce6fcd9b77754fed890b42399.pts 03948459/expert_verified/points_label/fe62130ce6fcd9b77754fed890b42399.seg 03948459 +03261776/points/1757fe64e76a9630fc176230c2f2d294.pts 03261776/expert_verified/points_label/1757fe64e76a9630fc176230c2f2d294.seg 03261776 +03790512/points/3fd1bff496b369f71765540024eb9fef.pts 03790512/expert_verified/points_label/3fd1bff496b369f71765540024eb9fef.seg 03790512 +02958343/points/a6d494af391a97686436916a86a90ed7.pts 02958343/expert_verified/points_label/a6d494af391a97686436916a86a90ed7.seg 02958343 +04099429/points/59389aac7b1ea9b09b28f5f9cf8893b5.pts 04099429/expert_verified/points_label/59389aac7b1ea9b09b28f5f9cf8893b5.seg 04099429 +04379243/points/c399ed276ed35cb9a6ce08f0d82ba063.pts 04379243/expert_verified/points_label/c399ed276ed35cb9a6ce08f0d82ba063.seg 04379243 +03624134/points/e4f610f36ba3c6f69246ea0301684d80.pts 03624134/expert_verified/points_label/e4f610f36ba3c6f69246ea0301684d80.seg 03624134 +03636649/points/90b0f9a1ac2e54ecbc7f58784fda27b5.pts 03636649/expert_verified/points_label/90b0f9a1ac2e54ecbc7f58784fda27b5.seg 03636649 +03636649/points/e5e9ff118631c2a3ee088de33038f12a.pts 03636649/expert_verified/points_label/e5e9ff118631c2a3ee088de33038f12a.seg 03636649 +04099429/points/4936716925b1cd6428eba1f0b7744e9.pts 04099429/expert_verified/points_label/4936716925b1cd6428eba1f0b7744e9.seg 04099429 +04379243/points/6e446bb5adf14b0b6121178eafd002fd.pts 04379243/expert_verified/points_label/6e446bb5adf14b0b6121178eafd002fd.seg 04379243 +03001627/points/7ea38c936513f5df3772b104757a4809.pts 03001627/expert_verified/points_label/7ea38c936513f5df3772b104757a4809.seg 03001627 +04379243/points/23d68e01b77089ae76ad4f5e7c7020eb.pts 04379243/expert_verified/points_label/23d68e01b77089ae76ad4f5e7c7020eb.seg 04379243 +03636649/points/4d6bced89943df73b4edf02c99e16daa.pts 03636649/expert_verified/points_label/4d6bced89943df73b4edf02c99e16daa.seg 03636649 +04379243/points/3459eec8eb56fa312bac236fe109e385.pts 04379243/expert_verified/points_label/3459eec8eb56fa312bac236fe109e385.seg 04379243 +03261776/points/1a5e2a7cddc8e46aa681aea7976a4565.pts 03261776/expert_verified/points_label/1a5e2a7cddc8e46aa681aea7976a4565.seg 03261776 +03001627/points/ed0d65c68a1fa5c485e2f8b1d3a373fe.pts 03001627/expert_verified/points_label/ed0d65c68a1fa5c485e2f8b1d3a373fe.seg 03001627 +03636649/points/7b005e23eae2768eb08c032bedc99529.pts 03636649/expert_verified/points_label/7b005e23eae2768eb08c032bedc99529.seg 03636649 +04379243/points/3f2e9c14ab1d26a0ebead06af665220.pts 04379243/expert_verified/points_label/3f2e9c14ab1d26a0ebead06af665220.seg 04379243 +03001627/points/383ab6330284af461fc4ae93e00c18e5.pts 03001627/expert_verified/points_label/383ab6330284af461fc4ae93e00c18e5.seg 03001627 +02691156/points/fc7387d630c84bb9c863ab010b80d9ed.pts 02691156/expert_verified/points_label/fc7387d630c84bb9c863ab010b80d9ed.seg 02691156 +04225987/points/344e9402d06bd94031145076011658c5.pts 04225987/expert_verified/points_label/344e9402d06bd94031145076011658c5.seg 04225987 +04379243/points/745a2b060d0f692bf4b6538438a0b930.pts 04379243/expert_verified/points_label/745a2b060d0f692bf4b6538438a0b930.seg 04379243 +04379243/points/928ea87878a7bbe26cf876b69450cd4e.pts 04379243/expert_verified/points_label/928ea87878a7bbe26cf876b69450cd4e.seg 04379243 +03001627/points/5fe56a4a9d5508c3b2373df00b89e5d.pts 03001627/expert_verified/points_label/5fe56a4a9d5508c3b2373df00b89e5d.seg 03001627 +02691156/points/6a75658fb8242b9c590874dcd9dc8481.pts 02691156/expert_verified/points_label/6a75658fb8242b9c590874dcd9dc8481.seg 02691156 +03948459/points/f377665c5b17d0ce61b636d79e46a7e9.pts 03948459/expert_verified/points_label/f377665c5b17d0ce61b636d79e46a7e9.seg 03948459 +03642806/points/ab21f75b97d6b1054f22ce0a3592d5.pts 03642806/expert_verified/points_label/ab21f75b97d6b1054f22ce0a3592d5.seg 03642806 +04379243/points/a2baf45f001e118e2c79f7f31759bfa7.pts 04379243/expert_verified/points_label/a2baf45f001e118e2c79f7f31759bfa7.seg 04379243 +02691156/points/19ff8fce1658f864ca8607f540cc62ba.pts 02691156/expert_verified/points_label/19ff8fce1658f864ca8607f540cc62ba.seg 02691156 +04379243/points/8bb3a7e1cb24fe6febad4f49b26ec52.pts 04379243/expert_verified/points_label/8bb3a7e1cb24fe6febad4f49b26ec52.seg 04379243 +04379243/points/dbc5a4d1dc3a6e8271a782a4379556c7.pts 04379243/expert_verified/points_label/dbc5a4d1dc3a6e8271a782a4379556c7.seg 04379243 +03001627/points/e6c11fed9469141ace8fba09dd640742.pts 03001627/expert_verified/points_label/e6c11fed9469141ace8fba09dd640742.seg 03001627 +03797390/points/f99e19b8c4a729353deb88581ea8417a.pts 03797390/expert_verified/points_label/f99e19b8c4a729353deb88581ea8417a.seg 03797390 +03001627/points/d454f99b99248bf337c99625b0c170be.pts 03001627/expert_verified/points_label/d454f99b99248bf337c99625b0c170be.seg 03001627 +03636649/points/7c23362b39f318cbb18d6f615cb18bdd.pts 03636649/expert_verified/points_label/7c23362b39f318cbb18d6f615cb18bdd.seg 03636649 +03001627/points/d8e2e2a923b372731cf97e154cc62f43.pts 03001627/expert_verified/points_label/d8e2e2a923b372731cf97e154cc62f43.seg 03001627 +03642806/points/621882a4afd2a126369873c1090720a1.pts 03642806/expert_verified/points_label/621882a4afd2a126369873c1090720a1.seg 03642806 +04379243/points/d5d1e750bb492dd5391e4d6c585a697a.pts 04379243/expert_verified/points_label/d5d1e750bb492dd5391e4d6c585a697a.seg 04379243 +03467517/points/42f3172b8770d2fd2200c35bfa7099ee.pts 03467517/expert_verified/points_label/42f3172b8770d2fd2200c35bfa7099ee.seg 03467517 +03624134/points/a2288d5f3a44233bc40c6b891c4913bd.pts 03624134/expert_verified/points_label/a2288d5f3a44233bc40c6b891c4913bd.seg 03624134 +02691156/points/90612205109d7458e84aab2e1d454e3c.pts 02691156/expert_verified/points_label/90612205109d7458e84aab2e1d454e3c.seg 02691156 +03001627/points/2c03bcb2a133ce28bb6caad47eee6580.pts 03001627/expert_verified/points_label/2c03bcb2a133ce28bb6caad47eee6580.seg 03001627 +03001627/points/f23d3a85baabd7ae32d9baba75737e72.pts 03001627/expert_verified/points_label/f23d3a85baabd7ae32d9baba75737e72.seg 03001627 +04379243/points/90be5de0faef91ef3f7e27638e63d848.pts 04379243/expert_verified/points_label/90be5de0faef91ef3f7e27638e63d848.seg 04379243 +02691156/points/d5f01e2aa54bbf28ca8607f540cc62ba.pts 02691156/expert_verified/points_label/d5f01e2aa54bbf28ca8607f540cc62ba.seg 02691156 +02691156/points/4f0bf26c62bb7c8b7e1c97634acf0214.pts 02691156/expert_verified/points_label/4f0bf26c62bb7c8b7e1c97634acf0214.seg 02691156 +03001627/points/4246c8c293c56ea34b3c42e318f3affc.pts 03001627/expert_verified/points_label/4246c8c293c56ea34b3c42e318f3affc.seg 03001627 +04379243/points/9b42cb91ccead6d42f6d10c5d1d56320.pts 04379243/expert_verified/points_label/9b42cb91ccead6d42f6d10c5d1d56320.seg 04379243 +03001627/points/c67b7b62e529295dfc30525e763ef5eb.pts 03001627/expert_verified/points_label/c67b7b62e529295dfc30525e763ef5eb.seg 03001627 +04379243/points/394c63a5658ef759b515d1675be6b5d3.pts 04379243/expert_verified/points_label/394c63a5658ef759b515d1675be6b5d3.seg 04379243 +03636649/points/13ba3fbe8fbc53f3ef3a2c64cef919d0.pts 03636649/expert_verified/points_label/13ba3fbe8fbc53f3ef3a2c64cef919d0.seg 03636649 +04379243/points/cb860d60db8f3d18febad4f49b26ec52.pts 04379243/expert_verified/points_label/cb860d60db8f3d18febad4f49b26ec52.seg 04379243 +04379243/points/657aad273d665f5dd9823f45c4411583.pts 04379243/expert_verified/points_label/657aad273d665f5dd9823f45c4411583.seg 04379243 +03001627/points/64fcd1ba0df5d54d79b3e1be3524f72f.pts 03001627/expert_verified/points_label/64fcd1ba0df5d54d79b3e1be3524f72f.seg 03001627 +03642806/points/8489cb783d249651b674654e7bbe623d.pts 03642806/expert_verified/points_label/8489cb783d249651b674654e7bbe623d.seg 03642806 +03467517/points/3824a2336972d144a24eeca91f583600.pts 03467517/expert_verified/points_label/3824a2336972d144a24eeca91f583600.seg 03467517 +03797390/points/99eaa69cf6fe8811dec712af445786fe.pts 03797390/expert_verified/points_label/99eaa69cf6fe8811dec712af445786fe.seg 03797390 +03001627/points/e31d71ed32273fede42ac999db581f5e.pts 03001627/expert_verified/points_label/e31d71ed32273fede42ac999db581f5e.seg 03001627 +03001627/points/9a42cff883cbd358106f706dac6c58f0.pts 03001627/expert_verified/points_label/9a42cff883cbd358106f706dac6c58f0.seg 03001627 +04379243/points/b515a107aa3a3fd0e3dff0d5ebb43915.pts 04379243/expert_verified/points_label/b515a107aa3a3fd0e3dff0d5ebb43915.seg 04379243 +03001627/points/bd6a8b133fa4d269491d6cee03fef2a9.pts 03001627/expert_verified/points_label/bd6a8b133fa4d269491d6cee03fef2a9.seg 03001627 +03001627/points/51c8f249e778e84a5bae8923b29985ad.pts 03001627/expert_verified/points_label/51c8f249e778e84a5bae8923b29985ad.seg 03001627 +02691156/points/f12eefbbefabe566ca8607f540cc62ba.pts 02691156/expert_verified/points_label/f12eefbbefabe566ca8607f540cc62ba.seg 02691156 +02691156/points/ad6e93a1db3e1da5977e4bb19a62128e.pts 02691156/expert_verified/points_label/ad6e93a1db3e1da5977e4bb19a62128e.seg 02691156 +03001627/points/efa83c67ce47bfca304edcf7c4314468.pts 03001627/expert_verified/points_label/efa83c67ce47bfca304edcf7c4314468.seg 03001627 +03624134/points/d6e9e4e07bafca0fa37f3fc191551700.pts 03624134/expert_verified/points_label/d6e9e4e07bafca0fa37f3fc191551700.seg 03624134 +03642806/points/e083105e9c2a28bb0c3a03d0a1f182f.pts 03642806/expert_verified/points_label/e083105e9c2a28bb0c3a03d0a1f182f.seg 03642806 +03001627/points/d2992fd5e6715bad3bbf93f83cbaf271.pts 03001627/expert_verified/points_label/d2992fd5e6715bad3bbf93f83cbaf271.seg 03001627 +04379243/points/4a27cb9384782ce33e95c55cb020b7e6.pts 04379243/expert_verified/points_label/4a27cb9384782ce33e95c55cb020b7e6.seg 04379243 +04379243/points/cf046edeff204b81cdf7280ff8af6720.pts 04379243/expert_verified/points_label/cf046edeff204b81cdf7280ff8af6720.seg 04379243 +03001627/points/6534f04a1c349a3c8c6540fe6bc16d6f.pts 03001627/expert_verified/points_label/6534f04a1c349a3c8c6540fe6bc16d6f.seg 03001627 +03636649/points/1917888a2b6901091735ea0e092a805a.pts 03636649/expert_verified/points_label/1917888a2b6901091735ea0e092a805a.seg 03636649 +03636649/points/b37e07ac31fa4f311735ea0e092a805a.pts 03636649/expert_verified/points_label/b37e07ac31fa4f311735ea0e092a805a.seg 03636649 +03636649/points/2f6f1fe66631572c6c5b8009db95f66f.pts 03636649/expert_verified/points_label/2f6f1fe66631572c6c5b8009db95f66f.seg 03636649 +03467517/points/feab270427cee00a24eeca91f583600.pts 03467517/expert_verified/points_label/feab270427cee00a24eeca91f583600.seg 03467517 +02691156/points/e30e25fe047ce1ea10b08ceced9a0113.pts 02691156/expert_verified/points_label/e30e25fe047ce1ea10b08ceced9a0113.seg 02691156 +03636649/points/b2347fe81bd2db6a4b3c42e318f3affc.pts 03636649/expert_verified/points_label/b2347fe81bd2db6a4b3c42e318f3affc.seg 03636649 +03001627/points/bb7755090f984ba85dd1bba5b1310523.pts 03001627/expert_verified/points_label/bb7755090f984ba85dd1bba5b1310523.seg 03001627 +02691156/points/bc7ead8b45952ab8822054a0a020bf4a.pts 02691156/expert_verified/points_label/bc7ead8b45952ab8822054a0a020bf4a.seg 02691156 +02691156/points/5a1d4af1f417d28566cf1b4a8fc3914e.pts 02691156/expert_verified/points_label/5a1d4af1f417d28566cf1b4a8fc3914e.seg 02691156 +02691156/points/a6cbada42d1a30d0f5c7319b71bdce6e.pts 02691156/expert_verified/points_label/a6cbada42d1a30d0f5c7319b71bdce6e.seg 02691156 +02691156/points/b785b39d10c33b5de9f07d25f575b2d4.pts 02691156/expert_verified/points_label/b785b39d10c33b5de9f07d25f575b2d4.seg 02691156 +03001627/points/2df8d2af1bc4b9972056b4bd5d870b47.pts 03001627/expert_verified/points_label/2df8d2af1bc4b9972056b4bd5d870b47.seg 03001627 +03797390/points/d46b98f63a017578ea456f4bbbc96af9.pts 03797390/expert_verified/points_label/d46b98f63a017578ea456f4bbbc96af9.seg 03797390 +04379243/points/1adf96850963550f19fb4103277a6b93.pts 04379243/expert_verified/points_label/1adf96850963550f19fb4103277a6b93.seg 04379243 +03001627/points/cb7a4324fdfa690e96dd43aa0ec847c9.pts 03001627/expert_verified/points_label/cb7a4324fdfa690e96dd43aa0ec847c9.seg 03001627 +03624134/points/c19088b4c32c0f1d22b38218e60be05.pts 03624134/expert_verified/points_label/c19088b4c32c0f1d22b38218e60be05.seg 03624134 +04379243/points/1acf7b0939f3eea2eafdf94e5032b200.pts 04379243/expert_verified/points_label/1acf7b0939f3eea2eafdf94e5032b200.seg 04379243 +03467517/points/d50d06b159363b1693f0194265a9746c.pts 03467517/expert_verified/points_label/d50d06b159363b1693f0194265a9746c.seg 03467517 +02691156/points/dacb447d7820e7f7ca8607f540cc62ba.pts 02691156/expert_verified/points_label/dacb447d7820e7f7ca8607f540cc62ba.seg 02691156 +04379243/points/c3a9dc47c5bf10aac3bd24f986301745.pts 04379243/expert_verified/points_label/c3a9dc47c5bf10aac3bd24f986301745.seg 04379243 +04379243/points/4791914b3bcaf57efebad4f49b26ec52.pts 04379243/expert_verified/points_label/4791914b3bcaf57efebad4f49b26ec52.seg 04379243 +03001627/points/bf3f14225e8f899db62f9fb4b7f0626.pts 03001627/expert_verified/points_label/bf3f14225e8f899db62f9fb4b7f0626.seg 03001627 +04379243/points/4f5c111a89b3fd27aa29e9f0529e8ef7.pts 04379243/expert_verified/points_label/4f5c111a89b3fd27aa29e9f0529e8ef7.seg 04379243 +03001627/points/6af8d7bfa508b8d23759750e8db40476.pts 03001627/expert_verified/points_label/6af8d7bfa508b8d23759750e8db40476.seg 03001627 +02691156/points/427030abcc0f11a8947bbeb9022263b8.pts 02691156/expert_verified/points_label/427030abcc0f11a8947bbeb9022263b8.seg 02691156 +03642806/points/367fbaea8743ec1cc98452c8fce6b43.pts 03642806/expert_verified/points_label/367fbaea8743ec1cc98452c8fce6b43.seg 03642806 +04379243/points/419412b927d11c7d8312881285c04cb3.pts 04379243/expert_verified/points_label/419412b927d11c7d8312881285c04cb3.seg 04379243 +03001627/points/56cc047440e7c999a23949c21eddef76.pts 03001627/expert_verified/points_label/56cc047440e7c999a23949c21eddef76.seg 03001627 +03790512/points/fdb6223c286cb653cc9e7530f9d8e186.pts 03790512/expert_verified/points_label/fdb6223c286cb653cc9e7530f9d8e186.seg 03790512 +03636649/points/6b2a590446ad5794b10e111f2d30684d.pts 03636649/expert_verified/points_label/6b2a590446ad5794b10e111f2d30684d.seg 03636649 +03001627/points/a3ce9ba74ab50352e6fe3612af521500.pts 03001627/expert_verified/points_label/a3ce9ba74ab50352e6fe3612af521500.seg 03001627 +02958343/points/9986dd19b2c459152470de2774d6099.pts 02958343/expert_verified/points_label/9986dd19b2c459152470de2774d6099.seg 02958343 +03642806/points/b806daf849a5dba289c212008d2a390e.pts 03642806/expert_verified/points_label/b806daf849a5dba289c212008d2a390e.seg 03642806 +04379243/points/2eb503dde3cc027d86c701087a194026.pts 04379243/expert_verified/points_label/2eb503dde3cc027d86c701087a194026.seg 04379243 +03001627/points/c4a4710012ee39bd19f4b416b31c46e0.pts 03001627/expert_verified/points_label/c4a4710012ee39bd19f4b416b31c46e0.seg 03001627 +02958343/points/bd8654fbca233e41ddb8f37b1865d989.pts 02958343/expert_verified/points_label/bd8654fbca233e41ddb8f37b1865d989.seg 02958343 +03001627/points/6fd485a2345c3dd69233bf560301e53.pts 03001627/expert_verified/points_label/6fd485a2345c3dd69233bf560301e53.seg 03001627 +02691156/points/aebc4c46b3cb7c3bca8607f540cc62ba.pts 02691156/expert_verified/points_label/aebc4c46b3cb7c3bca8607f540cc62ba.seg 02691156 +03001627/points/9343df9a7ed6cbba1923501fcdd899bb.pts 03001627/expert_verified/points_label/9343df9a7ed6cbba1923501fcdd899bb.seg 03001627 +04379243/points/7fadae39394c5622c3bd24f986301745.pts 04379243/expert_verified/points_label/7fadae39394c5622c3bd24f986301745.seg 04379243 +03001627/points/d619fd50c4d0fb46dea83bbf303af433.pts 03001627/expert_verified/points_label/d619fd50c4d0fb46dea83bbf303af433.seg 03001627 +04379243/points/ef02c88a34b3888a1b1a00a31bfed97b.pts 04379243/expert_verified/points_label/ef02c88a34b3888a1b1a00a31bfed97b.seg 04379243 +03467517/points/71d0016078dea05a94ca7929d4ba6d2d.pts 03467517/expert_verified/points_label/71d0016078dea05a94ca7929d4ba6d2d.seg 03467517 +03001627/points/5623d0ec9efedbc9d4da89766e80607a.pts 03001627/expert_verified/points_label/5623d0ec9efedbc9d4da89766e80607a.seg 03001627 +04379243/points/21486e6d0bd896ad5cca18918d24f6cd.pts 04379243/expert_verified/points_label/21486e6d0bd896ad5cca18918d24f6cd.seg 04379243 +03636649/points/978df83c1cee012729a60d6ab40898d.pts 03636649/expert_verified/points_label/978df83c1cee012729a60d6ab40898d.seg 03636649 +02691156/points/350d12f5290908c7f446f92b52bbd82a.pts 02691156/expert_verified/points_label/350d12f5290908c7f446f92b52bbd82a.seg 02691156 +03636649/points/86d7a728dc35d634f800b597bc1c1eb5.pts 03636649/expert_verified/points_label/86d7a728dc35d634f800b597bc1c1eb5.seg 03636649 +03001627/points/3b4292989394ba62f51f77a6d7299806.pts 03001627/expert_verified/points_label/3b4292989394ba62f51f77a6d7299806.seg 03001627 +03001627/points/f5f18fccf9e16800dbd185de408ea209.pts 03001627/expert_verified/points_label/f5f18fccf9e16800dbd185de408ea209.seg 03001627 +04379243/points/4d873bf1a658dcd523eb3ad3d378722a.pts 04379243/expert_verified/points_label/4d873bf1a658dcd523eb3ad3d378722a.seg 04379243 +03001627/points/a3e4639ff201f69b22a3043dcd383f68.pts 03001627/expert_verified/points_label/a3e4639ff201f69b22a3043dcd383f68.seg 03001627 +04379243/points/8d247c6f6aaf805a2530bfb25087f2b0.pts 04379243/expert_verified/points_label/8d247c6f6aaf805a2530bfb25087f2b0.seg 04379243 +03467517/points/511fc5ccf4f1c857a24eeca91f583600.pts 03467517/expert_verified/points_label/511fc5ccf4f1c857a24eeca91f583600.seg 03467517 +02691156/points/4635326bc4fdc3e9297cd7e2ef7dfa80.pts 02691156/expert_verified/points_label/4635326bc4fdc3e9297cd7e2ef7dfa80.seg 02691156 +03001627/points/525776b59266140381dff5c2e57ad46e.pts 03001627/expert_verified/points_label/525776b59266140381dff5c2e57ad46e.seg 03001627 +03001627/points/f1d6552ca66b2e37713decb1a0563b12.pts 03001627/expert_verified/points_label/f1d6552ca66b2e37713decb1a0563b12.seg 03001627 +04379243/points/40ff8ae39ad13d014a873bbe35452b88.pts 04379243/expert_verified/points_label/40ff8ae39ad13d014a873bbe35452b88.seg 04379243 +02691156/points/59f258b7aa7c1f7aa7d0c1e4eb8db7dc.pts 02691156/expert_verified/points_label/59f258b7aa7c1f7aa7d0c1e4eb8db7dc.seg 02691156 +04379243/points/63aa14915f59ed8671a782a4379556c7.pts 04379243/expert_verified/points_label/63aa14915f59ed8671a782a4379556c7.seg 04379243 +02691156/points/e16f9cc7dedcacdb9b0435532743fd43.pts 02691156/expert_verified/points_label/e16f9cc7dedcacdb9b0435532743fd43.seg 02691156 +04379243/points/c5b83c681c085f2195493ccf8f26ab2c.pts 04379243/expert_verified/points_label/c5b83c681c085f2195493ccf8f26ab2c.seg 04379243 +03001627/points/b2ba1569509cdb439451566a8c6563ed.pts 03001627/expert_verified/points_label/b2ba1569509cdb439451566a8c6563ed.seg 03001627 +02691156/points/265f5348ab2320b2148672750a1a335.pts 02691156/expert_verified/points_label/265f5348ab2320b2148672750a1a335.seg 02691156 +03001627/points/47da08d9c7cd7e104b3c42e318f3affc.pts 03001627/expert_verified/points_label/47da08d9c7cd7e104b3c42e318f3affc.seg 03001627 +03001627/points/458356b9c5a8d7bd7cc86734cb2f5062.pts 03001627/expert_verified/points_label/458356b9c5a8d7bd7cc86734cb2f5062.seg 03001627 +02691156/points/d20e3ed9b3430672bbf3143b1cb6076a.pts 02691156/expert_verified/points_label/d20e3ed9b3430672bbf3143b1cb6076a.seg 02691156 +04379243/points/c45e6ceae72c7a97be8908669c476d49.pts 04379243/expert_verified/points_label/c45e6ceae72c7a97be8908669c476d49.seg 04379243 +03001627/points/d9bbd1a1eaf6d2259d3ea1c6b57a0095.pts 03001627/expert_verified/points_label/d9bbd1a1eaf6d2259d3ea1c6b57a0095.seg 03001627 +02958343/points/8242b114695b68286f522b2bb8ded829.pts 02958343/expert_verified/points_label/8242b114695b68286f522b2bb8ded829.seg 02958343 +03001627/points/e4b40369894a16ce6821a1e68ba5ebab.pts 03001627/expert_verified/points_label/e4b40369894a16ce6821a1e68ba5ebab.seg 03001627 +03636649/points/dfe800d8d8642e9647bc3701b998a7d5.pts 03636649/expert_verified/points_label/dfe800d8d8642e9647bc3701b998a7d5.seg 03636649 +04379243/points/bdf7606e8d493149664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/bdf7606e8d493149664b3b9b23ddfcbc.seg 04379243 +03001627/points/6015aaa9ef170d9bfdef1c01cbd4ae0c.pts 03001627/expert_verified/points_label/6015aaa9ef170d9bfdef1c01cbd4ae0c.seg 03001627 +03624134/points/df7a65224f295122ed9c5b25fef60d04.pts 03624134/expert_verified/points_label/df7a65224f295122ed9c5b25fef60d04.seg 03624134 +03467517/points/df959f68bb22e402a24eeca91f583600.pts 03467517/expert_verified/points_label/df959f68bb22e402a24eeca91f583600.seg 03467517 +04379243/points/69604fc24b7976d69ccce4c6d5bb195f.pts 04379243/expert_verified/points_label/69604fc24b7976d69ccce4c6d5bb195f.seg 04379243 +04379243/points/23aca164c7b2e2d4ad8af6714b643432.pts 04379243/expert_verified/points_label/23aca164c7b2e2d4ad8af6714b643432.seg 04379243 +03636649/points/e37796d40348fa5fd8013bb984303089.pts 03636649/expert_verified/points_label/e37796d40348fa5fd8013bb984303089.seg 03636649 +04379243/points/8cb6a2e9ba365c94593ebeeedbff73b.pts 04379243/expert_verified/points_label/8cb6a2e9ba365c94593ebeeedbff73b.seg 04379243 +03001627/points/d6f2d44c693d2e857062f2d72cde5c95.pts 03001627/expert_verified/points_label/d6f2d44c693d2e857062f2d72cde5c95.seg 03001627 +03948459/points/ed29dd43ad28f042d1987c07c912c6e1.pts 03948459/expert_verified/points_label/ed29dd43ad28f042d1987c07c912c6e1.seg 03948459 +03001627/points/ca01fd0de2534323c594a0e804f37c1a.pts 03001627/expert_verified/points_label/ca01fd0de2534323c594a0e804f37c1a.seg 03001627 +03636649/points/e7b719516449701362525a4d857f099d.pts 03636649/expert_verified/points_label/e7b719516449701362525a4d857f099d.seg 03636649 +02691156/points/bd48d0beb5d1acf1d2106c9042f1bde9.pts 02691156/expert_verified/points_label/bd48d0beb5d1acf1d2106c9042f1bde9.seg 02691156 +03636649/points/7cb828eb3b8e424b1e88064118b89a3e.pts 03636649/expert_verified/points_label/7cb828eb3b8e424b1e88064118b89a3e.seg 03636649 +03001627/points/fdd21f7f2ca9f0bcbdcbca499b446e89.pts 03001627/expert_verified/points_label/fdd21f7f2ca9f0bcbdcbca499b446e89.seg 03001627 +03636649/points/d779977c2417752b815c6de5374a8dd2.pts 03636649/expert_verified/points_label/d779977c2417752b815c6de5374a8dd2.seg 03636649 +02691156/points/f3e2df468c15795872517bb0a6b4d3ef.pts 02691156/expert_verified/points_label/f3e2df468c15795872517bb0a6b4d3ef.seg 02691156 +04379243/points/e3cc0b06be2c972cab610b0c94236463.pts 04379243/expert_verified/points_label/e3cc0b06be2c972cab610b0c94236463.seg 04379243 +03261776/points/ca1c1c9aba8f4491a656de49935d2359.pts 03261776/expert_verified/points_label/ca1c1c9aba8f4491a656de49935d2359.seg 03261776 +03001627/points/c535629f9661293dc16ef5c633c71b56.pts 03001627/expert_verified/points_label/c535629f9661293dc16ef5c633c71b56.seg 03001627 +03636649/points/699fcda4f4e9166ec5eb7aae719027b2.pts 03636649/expert_verified/points_label/699fcda4f4e9166ec5eb7aae719027b2.seg 03636649 +03001627/points/8a5d60067de905336c183a120a388982.pts 03001627/expert_verified/points_label/8a5d60067de905336c183a120a388982.seg 03001627 +02691156/points/4ad92be763c2ded8fca1f1143bb6bc17.pts 02691156/expert_verified/points_label/4ad92be763c2ded8fca1f1143bb6bc17.seg 02691156 +04379243/points/14d6b4b09dfc54e9d679a95896f75103.pts 04379243/expert_verified/points_label/14d6b4b09dfc54e9d679a95896f75103.seg 04379243 +02691156/points/5e9129782c45b26992e39b8eae3e6b15.pts 02691156/expert_verified/points_label/5e9129782c45b26992e39b8eae3e6b15.seg 02691156 +02691156/points/2aec6e6096e640add00d52e62bf14ee9.pts 02691156/expert_verified/points_label/2aec6e6096e640add00d52e62bf14ee9.seg 02691156 +03642806/points/7b4260884a1dfd76b080af510dd640b.pts 03642806/expert_verified/points_label/7b4260884a1dfd76b080af510dd640b.seg 03642806 +03636649/points/3a0edfd418e020b97f32712aef0efc5a.pts 03636649/expert_verified/points_label/3a0edfd418e020b97f32712aef0efc5a.seg 03636649 +03467517/points/1c374a198daaddc493f0194265a9746c.pts 03467517/expert_verified/points_label/1c374a198daaddc493f0194265a9746c.seg 03467517 +04379243/points/9d90a58677e619f94b8710a3469971b1.pts 04379243/expert_verified/points_label/9d90a58677e619f94b8710a3469971b1.seg 04379243 +02691156/points/26f8a11864fd6bf7b68211fcc7956ac6.pts 02691156/expert_verified/points_label/26f8a11864fd6bf7b68211fcc7956ac6.seg 02691156 +02773838/points/f5108ede5ca11f041f6736765dee4fa9.pts 02773838/expert_verified/points_label/f5108ede5ca11f041f6736765dee4fa9.seg 02773838 +03001627/points/41ce60d5443c203eb31c248b8665b2e7.pts 03001627/expert_verified/points_label/41ce60d5443c203eb31c248b8665b2e7.seg 03001627 +03797390/points/a637500654ca8d16c97cfc3e8a6b1d16.pts 03797390/expert_verified/points_label/a637500654ca8d16c97cfc3e8a6b1d16.seg 03797390 +03001627/points/9ee4b9c97bcf4b3715dec43ae6a12831.pts 03001627/expert_verified/points_label/9ee4b9c97bcf4b3715dec43ae6a12831.seg 03001627 +03001627/points/e2dbad7996e7e13430c589758b4b5646.pts 03001627/expert_verified/points_label/e2dbad7996e7e13430c589758b4b5646.seg 03001627 +03001627/points/ec9f1fc13f2e4ae2c3bd24f986301745.pts 03001627/expert_verified/points_label/ec9f1fc13f2e4ae2c3bd24f986301745.seg 03001627 +03624134/points/172b9a77462dcdeaed90ead9558ee6cb.pts 03624134/expert_verified/points_label/172b9a77462dcdeaed90ead9558ee6cb.seg 03624134 +04379243/points/713a4be770bb19b9586b2526565371c0.pts 04379243/expert_verified/points_label/713a4be770bb19b9586b2526565371c0.seg 04379243 +04379243/points/f2e6820ca69d9b7719fb4103277a6b93.pts 04379243/expert_verified/points_label/f2e6820ca69d9b7719fb4103277a6b93.seg 04379243 +03001627/points/11a06e6f68b1d99c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/11a06e6f68b1d99c8687ff9b0b4e4ac.seg 03001627 +04379243/points/cfd7e354a5ae982aa0ab1d82ef09f78f.pts 04379243/expert_verified/points_label/cfd7e354a5ae982aa0ab1d82ef09f78f.seg 04379243 +03797390/points/8012f52dd0a4d2f718a93a45bf780820.pts 03797390/expert_verified/points_label/8012f52dd0a4d2f718a93a45bf780820.seg 03797390 +03636649/points/57c1bc69df779d87bbc7a6acbd8f058b.pts 03636649/expert_verified/points_label/57c1bc69df779d87bbc7a6acbd8f058b.seg 03636649 +03948459/points/664579680dc09267e1f2a1daf140ac9f.pts 03948459/expert_verified/points_label/664579680dc09267e1f2a1daf140ac9f.seg 03948459 +03001627/points/ca032d3b6dcbe1cea3056fa1e8da3997.pts 03001627/expert_verified/points_label/ca032d3b6dcbe1cea3056fa1e8da3997.seg 03001627 +02691156/points/4a837740b388aa45d8ff6111270336a9.pts 02691156/expert_verified/points_label/4a837740b388aa45d8ff6111270336a9.seg 02691156 +04099429/points/64803bab9799d0e698d2d2b2ae2563b0.pts 04099429/expert_verified/points_label/64803bab9799d0e698d2d2b2ae2563b0.seg 04099429 +04379243/points/c2c36909e461e10adaaaeef365d8f6e5.pts 04379243/expert_verified/points_label/c2c36909e461e10adaaaeef365d8f6e5.seg 04379243 +04379243/points/bc842e548e68a3cbb48513409ae7c51d.pts 04379243/expert_verified/points_label/bc842e548e68a3cbb48513409ae7c51d.seg 04379243 +03467517/points/4709e55a82a63f64d57700c05b1862d8.pts 03467517/expert_verified/points_label/4709e55a82a63f64d57700c05b1862d8.seg 03467517 +04379243/points/dc6f030d9ee566a5dcfcef693e7ec696.pts 04379243/expert_verified/points_label/dc6f030d9ee566a5dcfcef693e7ec696.seg 04379243 +03001627/points/8be8093e99b94bd9cf320c31965db5a1.pts 03001627/expert_verified/points_label/8be8093e99b94bd9cf320c31965db5a1.seg 03001627 +02958343/points/a0a1b0377d72e86bab3dd76bf33b0f5e.pts 02958343/expert_verified/points_label/a0a1b0377d72e86bab3dd76bf33b0f5e.seg 02958343 +03001627/points/efc684ff4dc6ff49ccd42a2d6eea63ed.pts 03001627/expert_verified/points_label/efc684ff4dc6ff49ccd42a2d6eea63ed.seg 03001627 +03001627/points/ff2223a085d32243696b74614952b2d0.pts 03001627/expert_verified/points_label/ff2223a085d32243696b74614952b2d0.seg 03001627 +02954340/points/8b2951e32e0906bb5f6cb4951755315c.pts 02954340/expert_verified/points_label/8b2951e32e0906bb5f6cb4951755315c.seg 02954340 +04379243/points/82b69c9b72a5159ce76bc197b3a3ffc0.pts 04379243/expert_verified/points_label/82b69c9b72a5159ce76bc197b3a3ffc0.seg 04379243 +03642806/points/5b5247b13d5b21bdad2954b86711abbd.pts 03642806/expert_verified/points_label/5b5247b13d5b21bdad2954b86711abbd.seg 03642806 +03636649/points/44e442591f82cd4cab0ac374f450cdc.pts 03636649/expert_verified/points_label/44e442591f82cd4cab0ac374f450cdc.seg 03636649 +03001627/points/2a1184b04dd8f30e3e92f39ce48d644.pts 03001627/expert_verified/points_label/2a1184b04dd8f30e3e92f39ce48d644.seg 03001627 +03636649/points/bc49fe3559e18fcb7d910d51d878f708.pts 03636649/expert_verified/points_label/bc49fe3559e18fcb7d910d51d878f708.seg 03636649 +03624134/points/c50af8af50613e822bf26da672b84220.pts 03624134/expert_verified/points_label/c50af8af50613e822bf26da672b84220.seg 03624134 +04225987/points/c0280aaad5473e8398c63cb68f11df34.pts 04225987/expert_verified/points_label/c0280aaad5473e8398c63cb68f11df34.seg 04225987 +03636649/points/5849d1a237cb493c659dda512294c744.pts 03636649/expert_verified/points_label/5849d1a237cb493c659dda512294c744.seg 03636649 +02958343/points/fcd90d547fdeb629f200a72c9245aee7.pts 02958343/expert_verified/points_label/fcd90d547fdeb629f200a72c9245aee7.seg 02958343 +03001627/points/34898c36e711fbde713decb1a0563b12.pts 03001627/expert_verified/points_label/34898c36e711fbde713decb1a0563b12.seg 03001627 +02691156/points/af696fc30a96a0c8bc0909d98a1ff2b4.pts 02691156/expert_verified/points_label/af696fc30a96a0c8bc0909d98a1ff2b4.seg 02691156 +04379243/points/f28e030e715b9d3e318462aca9e62b6b.pts 04379243/expert_verified/points_label/f28e030e715b9d3e318462aca9e62b6b.seg 04379243 +02691156/points/3c7e4628a9ea201bbf3143b1cb6076a.pts 02691156/expert_verified/points_label/3c7e4628a9ea201bbf3143b1cb6076a.seg 02691156 +03636649/points/f092117adb1e9254d1cbf3e52b9b6237.pts 03636649/expert_verified/points_label/f092117adb1e9254d1cbf3e52b9b6237.seg 03636649 +04379243/points/7dd881a26eea656d193afeeca14e3baa.pts 04379243/expert_verified/points_label/7dd881a26eea656d193afeeca14e3baa.seg 04379243 +03001627/points/79a3115a6f96eef7c151419181ef256.pts 03001627/expert_verified/points_label/79a3115a6f96eef7c151419181ef256.seg 03001627 +04379243/points/fc51355d4d03ff4ae6c5cd45aa112726.pts 04379243/expert_verified/points_label/fc51355d4d03ff4ae6c5cd45aa112726.seg 04379243 +04379243/points/34121f5cc12135148c1cf3f7d7f0373.pts 04379243/expert_verified/points_label/34121f5cc12135148c1cf3f7d7f0373.seg 04379243 +03624134/points/d5167211e757e79f012465c621a63e3.pts 03624134/expert_verified/points_label/d5167211e757e79f012465c621a63e3.seg 03624134 +04379243/points/5b375eacdbe49cfaaa539cd22945e538.pts 04379243/expert_verified/points_label/5b375eacdbe49cfaaa539cd22945e538.seg 04379243 +02691156/points/d3d788c1fb35227619ba010ddb4974fe.pts 02691156/expert_verified/points_label/d3d788c1fb35227619ba010ddb4974fe.seg 02691156 +02691156/points/f26ea1a00455f44fb88e2a19106395c2.pts 02691156/expert_verified/points_label/f26ea1a00455f44fb88e2a19106395c2.seg 02691156 +03001627/points/798a46965d9e0edfcea003eff0268278.pts 03001627/expert_verified/points_label/798a46965d9e0edfcea003eff0268278.seg 03001627 +02691156/points/3069d990d52051eb3a34c2907e8f3f1f.pts 02691156/expert_verified/points_label/3069d990d52051eb3a34c2907e8f3f1f.seg 02691156 +02691156/points/8c42e3042a4beaa7d5c40787c7bb7824.pts 02691156/expert_verified/points_label/8c42e3042a4beaa7d5c40787c7bb7824.seg 02691156 +04379243/points/45c5ee611c73b90a509330ce00eb0b20.pts 04379243/expert_verified/points_label/45c5ee611c73b90a509330ce00eb0b20.seg 04379243 +03001627/points/22ada577361ed0374b3c42e318f3affc.pts 03001627/expert_verified/points_label/22ada577361ed0374b3c42e318f3affc.seg 03001627 +04379243/points/b6ad7be371729438dcfcef693e7ec696.pts 04379243/expert_verified/points_label/b6ad7be371729438dcfcef693e7ec696.seg 04379243 +03636649/points/4c266f2b866c59e761fef32872c6fa53.pts 03636649/expert_verified/points_label/4c266f2b866c59e761fef32872c6fa53.seg 03636649 +04379243/points/812dd06fc99f174e9f2349486c570dd4.pts 04379243/expert_verified/points_label/812dd06fc99f174e9f2349486c570dd4.seg 04379243 +02691156/points/36a5bd4ca6a0b191532d23702363f9a5.pts 02691156/expert_verified/points_label/36a5bd4ca6a0b191532d23702363f9a5.seg 02691156 +03001627/points/be0890a6a0f3fcf841f91bc9e1dece3b.pts 03001627/expert_verified/points_label/be0890a6a0f3fcf841f91bc9e1dece3b.seg 03001627 +03642806/points/6008f256f3beafd9988abef1fd117e7.pts 03642806/expert_verified/points_label/6008f256f3beafd9988abef1fd117e7.seg 03642806 +03001627/points/490941bf4a532b62492d9da2668ec34c.pts 03001627/expert_verified/points_label/490941bf4a532b62492d9da2668ec34c.seg 03001627 +03636649/points/94940283714fdff6244ba644cf33cb2e.pts 03636649/expert_verified/points_label/94940283714fdff6244ba644cf33cb2e.seg 03636649 +03642806/points/6227e7dd1a391e8d54f22ce0a3592d5.pts 03642806/expert_verified/points_label/6227e7dd1a391e8d54f22ce0a3592d5.seg 03642806 +02691156/points/b2ceeee3c5b75962ac4f72bf08dc79a6.pts 02691156/expert_verified/points_label/b2ceeee3c5b75962ac4f72bf08dc79a6.seg 02691156 +03642806/points/55a05b33f34e7211f71cb38553f14917.pts 03642806/expert_verified/points_label/55a05b33f34e7211f71cb38553f14917.seg 03642806 +02773838/points/74c548ef3ca7b1987515e7bb7dba4019.pts 02773838/expert_verified/points_label/74c548ef3ca7b1987515e7bb7dba4019.seg 02773838 +03467517/points/defcf80fcef4b51b3f431ca2c1260d62.pts 03467517/expert_verified/points_label/defcf80fcef4b51b3f431ca2c1260d62.seg 03467517 +04379243/points/eaea1cf98b61abd043383304411cc9ec.pts 04379243/expert_verified/points_label/eaea1cf98b61abd043383304411cc9ec.seg 04379243 +03001627/points/7f6858bd9d4af9df97316612e1a4343a.pts 03001627/expert_verified/points_label/7f6858bd9d4af9df97316612e1a4343a.seg 03001627 +03001627/points/3c27660aacbcf99886327adaa986dff.pts 03001627/expert_verified/points_label/3c27660aacbcf99886327adaa986dff.seg 03001627 +04379243/points/229d510bace435811572ee5ddf1b55b.pts 04379243/expert_verified/points_label/229d510bace435811572ee5ddf1b55b.seg 04379243 +03636649/points/83c0ad378b5802b73d39d8012919dd25.pts 03636649/expert_verified/points_label/83c0ad378b5802b73d39d8012919dd25.seg 03636649 +02691156/points/f009f3112625ee00b8cf782e8c539948.pts 02691156/expert_verified/points_label/f009f3112625ee00b8cf782e8c539948.seg 02691156 +02691156/points/f13827d156628467b4cdad9a5bf52dd5.pts 02691156/expert_verified/points_label/f13827d156628467b4cdad9a5bf52dd5.seg 02691156 +03636649/points/526251a7530426a4b3c42e318f3affc.pts 03636649/expert_verified/points_label/526251a7530426a4b3c42e318f3affc.seg 03636649 +03001627/points/a1133464132d65fcfce0ccdae30f97db.pts 03001627/expert_verified/points_label/a1133464132d65fcfce0ccdae30f97db.seg 03001627 +02691156/points/d844094b073a0452b04b2d1c5ce9783b.pts 02691156/expert_verified/points_label/d844094b073a0452b04b2d1c5ce9783b.seg 02691156 +03948459/points/2f5b4bcb8d4dd901609e2d916fa0da27.pts 03948459/expert_verified/points_label/2f5b4bcb8d4dd901609e2d916fa0da27.seg 03948459 +03636649/points/a4c06cd5032733af543df75232f6ff2b.pts 03636649/expert_verified/points_label/a4c06cd5032733af543df75232f6ff2b.seg 03636649 +03636649/points/64eaa45bd2e01db8991ff09eca5b27a8.pts 03636649/expert_verified/points_label/64eaa45bd2e01db8991ff09eca5b27a8.seg 03636649 +03636649/points/5bc478e9c4e0bb8180936c51aa7ffcf5.pts 03636649/expert_verified/points_label/5bc478e9c4e0bb8180936c51aa7ffcf5.seg 03636649 +03636649/points/b02bd8e5ef9cfe354b3c42e318f3affc.pts 03636649/expert_verified/points_label/b02bd8e5ef9cfe354b3c42e318f3affc.seg 03636649 +03636649/points/cf6c082b9534049494db33559ec0df30.pts 03636649/expert_verified/points_label/cf6c082b9534049494db33559ec0df30.seg 03636649 +04225987/points/af4343c5b78b70b11082f2ea630bf69e.pts 04225987/expert_verified/points_label/af4343c5b78b70b11082f2ea630bf69e.seg 04225987 +03467517/points/c084022f2ddbf95493f0194265a9746c.pts 03467517/expert_verified/points_label/c084022f2ddbf95493f0194265a9746c.seg 03467517 +03001627/points/550dd11407c28f9f3bd04286517a8395.pts 03001627/expert_verified/points_label/550dd11407c28f9f3bd04286517a8395.seg 03001627 +04379243/points/702cebffa33a19f019f079d1b712f46f.pts 04379243/expert_verified/points_label/702cebffa33a19f019f079d1b712f46f.seg 04379243 +04379243/points/388d9e7b2b8a8f909492fbce0bd54e2e.pts 04379243/expert_verified/points_label/388d9e7b2b8a8f909492fbce0bd54e2e.seg 04379243 +03636649/points/7634fbdcaa6b304d62c83ac1e3a4ebaa.pts 03636649/expert_verified/points_label/7634fbdcaa6b304d62c83ac1e3a4ebaa.seg 03636649 +03636649/points/14d3d2418165ec86bba785994a529f86.pts 03636649/expert_verified/points_label/14d3d2418165ec86bba785994a529f86.seg 03636649 +04379243/points/13e19274b358ec867aa3000697a75d55.pts 04379243/expert_verified/points_label/13e19274b358ec867aa3000697a75d55.seg 04379243 +03467517/points/727fcc85add981325e683993f34d42f2.pts 03467517/expert_verified/points_label/727fcc85add981325e683993f34d42f2.seg 03467517 +02691156/points/947d6b9cd1966e2e719b5362fe06bbb.pts 02691156/expert_verified/points_label/947d6b9cd1966e2e719b5362fe06bbb.seg 02691156 +04379243/points/ee5f85db427865e63e5399147a5b4763.pts 04379243/expert_verified/points_label/ee5f85db427865e63e5399147a5b4763.seg 04379243 +02691156/points/1678946724380812de689e373096b0e3.pts 02691156/expert_verified/points_label/1678946724380812de689e373096b0e3.seg 02691156 +03001627/points/3fdef0a7606c397331ad067823a3f0ce.pts 03001627/expert_verified/points_label/3fdef0a7606c397331ad067823a3f0ce.seg 03001627 +03636649/points/1bb465b8f22315d1116f219d90a571c2.pts 03636649/expert_verified/points_label/1bb465b8f22315d1116f219d90a571c2.seg 03636649 +04379243/points/9dd5b7e6f90ee322b56d92c5d7b06038.pts 04379243/expert_verified/points_label/9dd5b7e6f90ee322b56d92c5d7b06038.seg 04379243 +03467517/points/7eee3b79e053759143891ae68a82472e.pts 03467517/expert_verified/points_label/7eee3b79e053759143891ae68a82472e.seg 03467517 +03001627/points/f4b6bf9253918b52944d8f8e13d63fde.pts 03001627/expert_verified/points_label/f4b6bf9253918b52944d8f8e13d63fde.seg 03001627 +03636649/points/92e0f64c08f0c8ac3c8d0fdfb1cc2535.pts 03636649/expert_verified/points_label/92e0f64c08f0c8ac3c8d0fdfb1cc2535.seg 03636649 +03624134/points/d63521a0dfac9c1f342494fa6f09f376.pts 03624134/expert_verified/points_label/d63521a0dfac9c1f342494fa6f09f376.seg 03624134 +04379243/points/c7ff0afab4b7885a52160ba64fb535b2.pts 04379243/expert_verified/points_label/c7ff0afab4b7885a52160ba64fb535b2.seg 04379243 +02958343/points/89765af115d9a4955591fcdffe729c55.pts 02958343/expert_verified/points_label/89765af115d9a4955591fcdffe729c55.seg 02958343 +03636649/points/70bf2aaedbf9499ec889c00efdaf9928.pts 03636649/expert_verified/points_label/70bf2aaedbf9499ec889c00efdaf9928.seg 03636649 +02958343/points/ef15b938dcfa9893c4d922e8a1141322.pts 02958343/expert_verified/points_label/ef15b938dcfa9893c4d922e8a1141322.seg 02958343 +03636649/points/4bb676c497969016de98d10ab5975b59.pts 03636649/expert_verified/points_label/4bb676c497969016de98d10ab5975b59.seg 03636649 +04379243/points/1c8121e1ad6cd6fc7a480f3f1d55ed3f.pts 04379243/expert_verified/points_label/1c8121e1ad6cd6fc7a480f3f1d55ed3f.seg 04379243 +04379243/points/83b8e64089968ae8fd3feb4581507302.pts 04379243/expert_verified/points_label/83b8e64089968ae8fd3feb4581507302.seg 04379243 +03636649/points/a4c0f3aed58f0e092fdae21c212bf119.pts 03636649/expert_verified/points_label/a4c0f3aed58f0e092fdae21c212bf119.seg 03636649 +04379243/points/e02925509615eb5a4eaf5bbf36d243d4.pts 04379243/expert_verified/points_label/e02925509615eb5a4eaf5bbf36d243d4.seg 04379243 +04379243/points/c5087fce38b009ae30bbd4cddd04c77b.pts 04379243/expert_verified/points_label/c5087fce38b009ae30bbd4cddd04c77b.seg 04379243 +03001627/points/5107542cfbf142f36209799e55a657c.pts 03001627/expert_verified/points_label/5107542cfbf142f36209799e55a657c.seg 03001627 +04379243/points/94a62cfdb84e88ca9a3528690d225ee1.pts 04379243/expert_verified/points_label/94a62cfdb84e88ca9a3528690d225ee1.seg 04379243 +04379243/points/80ad1f839582d183fbf6f493308acc40.pts 04379243/expert_verified/points_label/80ad1f839582d183fbf6f493308acc40.seg 04379243 +03001627/points/91819d15c2c044ebd47ffa500636d198.pts 03001627/expert_verified/points_label/91819d15c2c044ebd47ffa500636d198.seg 03001627 +03636649/points/77a5a12147a6624d786810c22b062a88.pts 03636649/expert_verified/points_label/77a5a12147a6624d786810c22b062a88.seg 03636649 +03001627/points/beb4c42cfa1c3b282811d30bba54859.pts 03001627/expert_verified/points_label/beb4c42cfa1c3b282811d30bba54859.seg 03001627 +03636649/points/e529fc190753cc9df647dc544bb0ab61.pts 03636649/expert_verified/points_label/e529fc190753cc9df647dc544bb0ab61.seg 03636649 +04379243/points/680d4a8b5a30601a4b3c42e318f3affc.pts 04379243/expert_verified/points_label/680d4a8b5a30601a4b3c42e318f3affc.seg 04379243 +03001627/points/1d6f4020cab4ec1962d6a66a1a314d66.pts 03001627/expert_verified/points_label/1d6f4020cab4ec1962d6a66a1a314d66.seg 03001627 +03001627/points/5b3fd3199d1bc950c1ae25a29e9d46d3.pts 03001627/expert_verified/points_label/5b3fd3199d1bc950c1ae25a29e9d46d3.seg 03001627 +03001627/points/17e916fc863540ee3def89b32cef8e45.pts 03001627/expert_verified/points_label/17e916fc863540ee3def89b32cef8e45.seg 03001627 +04379243/points/a5d5fc6b0bb7881419fb4103277a6b93.pts 04379243/expert_verified/points_label/a5d5fc6b0bb7881419fb4103277a6b93.seg 04379243 +03001627/points/eafec1b145972dcd815b2b467e8e2eac.pts 03001627/expert_verified/points_label/eafec1b145972dcd815b2b467e8e2eac.seg 03001627 +04379243/points/1fb2be490f45ec6e19fb4103277a6b93.pts 04379243/expert_verified/points_label/1fb2be490f45ec6e19fb4103277a6b93.seg 04379243 +02691156/points/8b61ba80d9e487deca8607f540cc62ba.pts 02691156/expert_verified/points_label/8b61ba80d9e487deca8607f540cc62ba.seg 02691156 +03467517/points/2d767b3fbb8a3053b8836869016d1afd.pts 03467517/expert_verified/points_label/2d767b3fbb8a3053b8836869016d1afd.seg 03467517 +04379243/points/e0940f2229e42007d98e761e6d91dfc8.pts 04379243/expert_verified/points_label/e0940f2229e42007d98e761e6d91dfc8.seg 04379243 +03001627/points/bb90094030f369e4305a3b2fd9173d6f.pts 03001627/expert_verified/points_label/bb90094030f369e4305a3b2fd9173d6f.seg 03001627 +02958343/points/c6e3d9cf26016b5752aa494042b7c9db.pts 02958343/expert_verified/points_label/c6e3d9cf26016b5752aa494042b7c9db.seg 02958343 +03001627/points/bd0fab2e72b445bd1e722bceee6e83aa.pts 03001627/expert_verified/points_label/bd0fab2e72b445bd1e722bceee6e83aa.seg 03001627 +02691156/points/e86fd13a49f0ee0a62b600da24e0965.pts 02691156/expert_verified/points_label/e86fd13a49f0ee0a62b600da24e0965.seg 02691156 +03001627/points/eeebe3fe14ee4d3aebefe6b1d594ad2e.pts 03001627/expert_verified/points_label/eeebe3fe14ee4d3aebefe6b1d594ad2e.seg 03001627 +04379243/points/398dbb0a34ca527871a782a4379556c7.pts 04379243/expert_verified/points_label/398dbb0a34ca527871a782a4379556c7.seg 04379243 +04379243/points/737cc2beda4a023619fb4103277a6b93.pts 04379243/expert_verified/points_label/737cc2beda4a023619fb4103277a6b93.seg 04379243 +03001627/points/3895b96949fd81c5f07fee5fc5c45ee2.pts 03001627/expert_verified/points_label/3895b96949fd81c5f07fee5fc5c45ee2.seg 03001627 +04379243/points/bba5ce8555c8fa89ba18ade30e563d37.pts 04379243/expert_verified/points_label/bba5ce8555c8fa89ba18ade30e563d37.seg 04379243 +04379243/points/cab027dd0162c5b7f1426260885dd0ef.pts 04379243/expert_verified/points_label/cab027dd0162c5b7f1426260885dd0ef.seg 04379243 +04379243/points/75f2bc98aecf198974984b9cd0997a52.pts 04379243/expert_verified/points_label/75f2bc98aecf198974984b9cd0997a52.seg 04379243 +04379243/points/8d4fe49d942ec85ff4b6538438a0b930.pts 04379243/expert_verified/points_label/8d4fe49d942ec85ff4b6538438a0b930.seg 04379243 +03001627/points/89dd53d0377c28207f7114254c4286d2.pts 03001627/expert_verified/points_label/89dd53d0377c28207f7114254c4286d2.seg 03001627 +03636649/points/a37695d83a39adb52866fbd701f50f71.pts 03636649/expert_verified/points_label/a37695d83a39adb52866fbd701f50f71.seg 03636649 +04379243/points/f99ebf0f053140525a0e5699b3040a35.pts 04379243/expert_verified/points_label/f99ebf0f053140525a0e5699b3040a35.seg 04379243 +03624134/points/bbfd2df3edce576e1e652fa812161367.pts 03624134/expert_verified/points_label/bbfd2df3edce576e1e652fa812161367.seg 03624134 +04379243/points/f0d8620b49ea76db83130614d8020b3.pts 04379243/expert_verified/points_label/f0d8620b49ea76db83130614d8020b3.seg 04379243 +04379243/points/d01a6b35a54c8f77dd986a55e273fa14.pts 04379243/expert_verified/points_label/d01a6b35a54c8f77dd986a55e273fa14.seg 04379243 +03001627/points/2f6b0ddf12d1311795bea7c29e873d16.pts 03001627/expert_verified/points_label/2f6b0ddf12d1311795bea7c29e873d16.seg 03001627 +03001627/points/5695fd37d1e673cebf964fc57f6a7d6d.pts 03001627/expert_verified/points_label/5695fd37d1e673cebf964fc57f6a7d6d.seg 03001627 +03636649/points/746b82746c6a02cca5f600ed2cf472ac.pts 03636649/expert_verified/points_label/746b82746c6a02cca5f600ed2cf472ac.seg 03636649 +03001627/points/bcc4ea0133864bfe4d4c0769270d8651.pts 03001627/expert_verified/points_label/bcc4ea0133864bfe4d4c0769270d8651.seg 03001627 +03624134/points/81ba3f06ec38eaa46016d22b1dfacd4b.pts 03624134/expert_verified/points_label/81ba3f06ec38eaa46016d22b1dfacd4b.seg 03624134 +04379243/points/2a2d6560f14a01c6afac72146bbc9d59.pts 04379243/expert_verified/points_label/2a2d6560f14a01c6afac72146bbc9d59.seg 04379243 +04379243/points/856e86709df98497dcfcef693e7ec696.pts 04379243/expert_verified/points_label/856e86709df98497dcfcef693e7ec696.seg 04379243 +03948459/points/7418810de4b13e8430b6ca3ac82edfa3.pts 03948459/expert_verified/points_label/7418810de4b13e8430b6ca3ac82edfa3.seg 03948459 +03001627/points/11e0f0dfd3d0b22130ddb6ead95f49cc.pts 03001627/expert_verified/points_label/11e0f0dfd3d0b22130ddb6ead95f49cc.seg 03001627 +04379243/points/5c6748b094725d9af008d8a3590fb522.pts 04379243/expert_verified/points_label/5c6748b094725d9af008d8a3590fb522.seg 04379243 +04379243/points/17f3a2945d6550cbf7628281ecb18112.pts 04379243/expert_verified/points_label/17f3a2945d6550cbf7628281ecb18112.seg 04379243 +04379243/points/889c9aedc4ba47592fb02b79d375eea5.pts 04379243/expert_verified/points_label/889c9aedc4ba47592fb02b79d375eea5.seg 04379243 +04379243/points/c0b74c61865b563067dc358060e3c47b.pts 04379243/expert_verified/points_label/c0b74c61865b563067dc358060e3c47b.seg 04379243 +03636649/points/783b81aa54a69a26d42b9650f19dd425.pts 03636649/expert_verified/points_label/783b81aa54a69a26d42b9650f19dd425.seg 03636649 +03467517/points/8b8b084109eef6d81082f2ea630bf69e.pts 03467517/expert_verified/points_label/8b8b084109eef6d81082f2ea630bf69e.seg 03467517 +03001627/points/8a9af7d8a83d90fcd53e36731300f5b4.pts 03001627/expert_verified/points_label/8a9af7d8a83d90fcd53e36731300f5b4.seg 03001627 +03001627/points/47aca56ff3a7b8a71a782a4379556c7.pts 03001627/expert_verified/points_label/47aca56ff3a7b8a71a782a4379556c7.seg 03001627 +03001627/points/9fae8d94a028e9ec2818b21315fe1bde.pts 03001627/expert_verified/points_label/9fae8d94a028e9ec2818b21315fe1bde.seg 03001627 +03001627/points/9a41550ba7dd31e3bf80985a99195eb8.pts 03001627/expert_verified/points_label/9a41550ba7dd31e3bf80985a99195eb8.seg 03001627 +03001627/points/184b4797cea77beb5ca1c42bb8ac17a.pts 03001627/expert_verified/points_label/184b4797cea77beb5ca1c42bb8ac17a.seg 03001627 +04379243/points/bc1ff7fc750617d690f7bef12e52ac08.pts 04379243/expert_verified/points_label/bc1ff7fc750617d690f7bef12e52ac08.seg 04379243 +02691156/points/5fb64e3fc0abe449ca8607f540cc62ba.pts 02691156/expert_verified/points_label/5fb64e3fc0abe449ca8607f540cc62ba.seg 02691156 +03001627/points/2e0beb3b6927a2b7e45ef4135c266a12.pts 03001627/expert_verified/points_label/2e0beb3b6927a2b7e45ef4135c266a12.seg 03001627 +03467517/points/a38684b166ce2c77c155f88004a92bc8.pts 03467517/expert_verified/points_label/a38684b166ce2c77c155f88004a92bc8.seg 03467517 +02691156/points/b590adb6d3486f6e90b1d6deb98feec6.pts 02691156/expert_verified/points_label/b590adb6d3486f6e90b1d6deb98feec6.seg 02691156 +03636649/points/9d41e23f00d11d153033d35b49a20c8.pts 03636649/expert_verified/points_label/9d41e23f00d11d153033d35b49a20c8.seg 03636649 +03001627/points/f4b141ab64a6c4e771a782a4379556c7.pts 03001627/expert_verified/points_label/f4b141ab64a6c4e771a782a4379556c7.seg 03001627 +03948459/points/19e45672a3109f18be4927dbd39f74e9.pts 03948459/expert_verified/points_label/19e45672a3109f18be4927dbd39f74e9.seg 03948459 +04379243/points/58475b1b20ece0c5eeb8d422649e5f2b.pts 04379243/expert_verified/points_label/58475b1b20ece0c5eeb8d422649e5f2b.seg 04379243 +04379243/points/400393a56fc243c442c39a4fb8d01418.pts 04379243/expert_verified/points_label/400393a56fc243c442c39a4fb8d01418.seg 04379243 +03001627/points/a128eda00983dd01fb7d9615be5ab4b0.pts 03001627/expert_verified/points_label/a128eda00983dd01fb7d9615be5ab4b0.seg 03001627 +04379243/points/6af9a593129b028eb67e68783d58425a.pts 04379243/expert_verified/points_label/6af9a593129b028eb67e68783d58425a.seg 04379243 +03001627/points/40f188600cf8362b654ea6737b0d3597.pts 03001627/expert_verified/points_label/40f188600cf8362b654ea6737b0d3597.seg 03001627 +04379243/points/a4af8f822fa8d95456c08464b83f209e.pts 04379243/expert_verified/points_label/a4af8f822fa8d95456c08464b83f209e.seg 04379243 +03001627/points/d9558dccfe8e3381e45ef4135c266a12.pts 03001627/expert_verified/points_label/d9558dccfe8e3381e45ef4135c266a12.seg 03001627 +04379243/points/631028ddb76eed4dbb0085d0daabdaea.pts 04379243/expert_verified/points_label/631028ddb76eed4dbb0085d0daabdaea.seg 04379243 +03001627/points/8967e65c1541d1874aa7f42ef07f614e.pts 03001627/expert_verified/points_label/8967e65c1541d1874aa7f42ef07f614e.seg 03001627 +04379243/points/38feb6b209579f6faadbf8208284c675.pts 04379243/expert_verified/points_label/38feb6b209579f6faadbf8208284c675.seg 04379243 +03624134/points/60277f4060b8703e4e18d7136dc2dc80.pts 03624134/expert_verified/points_label/60277f4060b8703e4e18d7136dc2dc80.seg 03624134 +03467517/points/a78c3356a5dca4e7670b811945485012.pts 03467517/expert_verified/points_label/a78c3356a5dca4e7670b811945485012.seg 03467517 +03797390/points/645b0e2ef3b95979204df312eabf367f.pts 03797390/expert_verified/points_label/645b0e2ef3b95979204df312eabf367f.seg 03797390 +03467517/points/bd6057c7ac1ef31193f0194265a9746c.pts 03467517/expert_verified/points_label/bd6057c7ac1ef31193f0194265a9746c.seg 03467517 +03790512/points/bcbcfdad5e0e1d9ba88e8cb97b773125.pts 03790512/expert_verified/points_label/bcbcfdad5e0e1d9ba88e8cb97b773125.seg 03790512 +03636649/points/761fb0822bb05bc8ee0cd746086d989.pts 03636649/expert_verified/points_label/761fb0822bb05bc8ee0cd746086d989.seg 03636649 +03636649/points/be13324c84d2a9d72b151d8b52c53b90.pts 03636649/expert_verified/points_label/be13324c84d2a9d72b151d8b52c53b90.seg 03636649 +04379243/points/7b3dfbd70333485d219a1300d9489f4e.pts 04379243/expert_verified/points_label/7b3dfbd70333485d219a1300d9489f4e.seg 04379243 +04379243/points/22c5cbe6271736bffebad4f49b26ec52.pts 04379243/expert_verified/points_label/22c5cbe6271736bffebad4f49b26ec52.seg 04379243 +02958343/points/4b7b3b54dc04df53c19f1e8ed99ac2fa.pts 02958343/expert_verified/points_label/4b7b3b54dc04df53c19f1e8ed99ac2fa.seg 02958343 +03636649/points/947c6753d77d8082290e2f84c414e6be.pts 03636649/expert_verified/points_label/947c6753d77d8082290e2f84c414e6be.seg 03636649 +02958343/points/36c2770d00fdd0bdf1ee968c9039cc3.pts 02958343/expert_verified/points_label/36c2770d00fdd0bdf1ee968c9039cc3.seg 02958343 +03001627/points/4ac17ecd78880859e302b6082b0ffc09.pts 03001627/expert_verified/points_label/4ac17ecd78880859e302b6082b0ffc09.seg 03001627 +03636649/points/70b78b9439a9de7530f6e0ede20c4525.pts 03636649/expert_verified/points_label/70b78b9439a9de7530f6e0ede20c4525.seg 03636649 +04379243/points/d8be4b45afb21cf1616fb9ab42452112.pts 04379243/expert_verified/points_label/d8be4b45afb21cf1616fb9ab42452112.seg 04379243 +02691156/points/fe266c740580c102ff9ce0c50c2cd25a.pts 02691156/expert_verified/points_label/fe266c740580c102ff9ce0c50c2cd25a.seg 02691156 +02958343/points/30f4617775480bcce27281f3b76d1f5.pts 02958343/expert_verified/points_label/30f4617775480bcce27281f3b76d1f5.seg 02958343 +03467517/points/34874708b51c7ed493f0194265a9746c.pts 03467517/expert_verified/points_label/34874708b51c7ed493f0194265a9746c.seg 03467517 +04225987/points/abdc4a823b1f78c397f47f3057557cbe.pts 04225987/expert_verified/points_label/abdc4a823b1f78c397f47f3057557cbe.seg 04225987 +03948459/points/14fe99eb0c105a90fc9c56fb43681c11.pts 03948459/expert_verified/points_label/14fe99eb0c105a90fc9c56fb43681c11.seg 03948459 +04379243/points/f5aecb6607876495e03eb69820d1aaf2.pts 04379243/expert_verified/points_label/f5aecb6607876495e03eb69820d1aaf2.seg 04379243 +03001627/points/3c81fab5678a3872327289c00b6dc9ca.pts 03001627/expert_verified/points_label/3c81fab5678a3872327289c00b6dc9ca.seg 03001627 +04379243/points/fe3351c94fbab8ce3002761e7a3ba3bd.pts 04379243/expert_verified/points_label/fe3351c94fbab8ce3002761e7a3ba3bd.seg 04379243 +04379243/points/5f0c33039269b7a9f0e84b9d9ad447e2.pts 04379243/expert_verified/points_label/5f0c33039269b7a9f0e84b9d9ad447e2.seg 04379243 +03001627/points/fa7347547e290732bf65e1af50b5b7d4.pts 03001627/expert_verified/points_label/fa7347547e290732bf65e1af50b5b7d4.seg 03001627 +04379243/points/9c33336af33fd905776d8bc79b9caa2c.pts 04379243/expert_verified/points_label/9c33336af33fd905776d8bc79b9caa2c.seg 04379243 +03001627/points/1d828c69106609f8cd783766d090e665.pts 03001627/expert_verified/points_label/1d828c69106609f8cd783766d090e665.seg 03001627 +04379243/points/5fbb7a5f01f646ca5830980abc1c717a.pts 04379243/expert_verified/points_label/5fbb7a5f01f646ca5830980abc1c717a.seg 04379243 +03636649/points/777a686890d74b350359b4e03cfdfa.pts 03636649/expert_verified/points_label/777a686890d74b350359b4e03cfdfa.seg 03636649 +02773838/points/3077a9b76724b6d35de21284bb515a83.pts 02773838/expert_verified/points_label/3077a9b76724b6d35de21284bb515a83.seg 02773838 +03642806/points/b233163860361eda8cfacef5204026d6.pts 03642806/expert_verified/points_label/b233163860361eda8cfacef5204026d6.seg 03642806 +02958343/points/f10f279643fbb3276a78cd0552215cff.pts 02958343/expert_verified/points_label/f10f279643fbb3276a78cd0552215cff.seg 02958343 +02691156/points/2c64c521c114df40e51f766854841067.pts 02691156/expert_verified/points_label/2c64c521c114df40e51f766854841067.seg 02691156 +03001627/points/3b8f2b955ee9a904b3c42e318f3affc.pts 03001627/expert_verified/points_label/3b8f2b955ee9a904b3c42e318f3affc.seg 03001627 +04379243/points/2a64bd38a4e42f33dc43fde5155b3946.pts 04379243/expert_verified/points_label/2a64bd38a4e42f33dc43fde5155b3946.seg 04379243 +03001627/points/52310bca00e6a3671201d487ecde379e.pts 03001627/expert_verified/points_label/52310bca00e6a3671201d487ecde379e.seg 03001627 +03001627/points/5346017af72c1843169d299c5f567c18.pts 03001627/expert_verified/points_label/5346017af72c1843169d299c5f567c18.seg 03001627 +02954340/points/c1436c38beba0005284432ce2f42f498.pts 02954340/expert_verified/points_label/c1436c38beba0005284432ce2f42f498.seg 02954340 +03636649/points/34ce1de178694f87e76bc197b3a3ffc0.pts 03636649/expert_verified/points_label/34ce1de178694f87e76bc197b3a3ffc0.seg 03636649 +03001627/points/8e7714615a4b1e6f82390c5f604e0d9b.pts 03001627/expert_verified/points_label/8e7714615a4b1e6f82390c5f604e0d9b.seg 03001627 +03948459/points/a3e6dcfc074489fd8ec2966c0323533e.pts 03948459/expert_verified/points_label/a3e6dcfc074489fd8ec2966c0323533e.seg 03948459 +02691156/points/3ad337dcef167024fe6302fece358e4a.pts 02691156/expert_verified/points_label/3ad337dcef167024fe6302fece358e4a.seg 02691156 +04379243/points/124cc3b92266c2767156f312cf4e035e.pts 04379243/expert_verified/points_label/124cc3b92266c2767156f312cf4e035e.seg 04379243 +04379243/points/ee5f0411fcff59951105a3fc18779f13.pts 04379243/expert_verified/points_label/ee5f0411fcff59951105a3fc18779f13.seg 04379243 +04379243/points/b1117a83ebf5a4c9c337a931444a5063.pts 04379243/expert_verified/points_label/b1117a83ebf5a4c9c337a931444a5063.seg 04379243 +03001627/points/fb847cd696ec711197f2016c3d6097c9.pts 03001627/expert_verified/points_label/fb847cd696ec711197f2016c3d6097c9.seg 03001627 +02691156/points/50da48c8e7644508fca1f1143bb6bc17.pts 02691156/expert_verified/points_label/50da48c8e7644508fca1f1143bb6bc17.seg 02691156 +02958343/points/78c0bec338fa1c01d6b98bf27ff43caf.pts 02958343/expert_verified/points_label/78c0bec338fa1c01d6b98bf27ff43caf.seg 02958343 +02691156/points/37fbd275a734ec1b66cf1b4a8fc3914e.pts 02691156/expert_verified/points_label/37fbd275a734ec1b66cf1b4a8fc3914e.seg 02691156 +03636649/points/e053e531fc4341b5fcb8d8c6d4df8143.pts 03636649/expert_verified/points_label/e053e531fc4341b5fcb8d8c6d4df8143.seg 03636649 +02691156/points/3db61220251b3c9de719b5362fe06bbb.pts 02691156/expert_verified/points_label/3db61220251b3c9de719b5362fe06bbb.seg 02691156 +03642806/points/a7f983f1d0642745135a402b573354e4.pts 03642806/expert_verified/points_label/a7f983f1d0642745135a402b573354e4.seg 03642806 +03001627/points/4e26eab28703c12bdd5f3f2440a93d21.pts 03001627/expert_verified/points_label/4e26eab28703c12bdd5f3f2440a93d21.seg 03001627 +04225987/points/24e46e195f4907887a70e5e6aa241c88.pts 04225987/expert_verified/points_label/24e46e195f4907887a70e5e6aa241c88.seg 04225987 +02691156/points/3ab1e94b6c3a1730c56cc5a87f567365.pts 02691156/expert_verified/points_label/3ab1e94b6c3a1730c56cc5a87f567365.seg 02691156 +03001627/points/61b984febe54b752d61420a53a0cb96d.pts 03001627/expert_verified/points_label/61b984febe54b752d61420a53a0cb96d.seg 03001627 +04379243/points/adf574f947f00bdd548b2639ebc3e759.pts 04379243/expert_verified/points_label/adf574f947f00bdd548b2639ebc3e759.seg 04379243 +03001627/points/ef76b9cbf76bad40586ef70b3cee4240.pts 03001627/expert_verified/points_label/ef76b9cbf76bad40586ef70b3cee4240.seg 03001627 +04379243/points/abef0c609ad3e9c2edea4b985280bcc1.pts 04379243/expert_verified/points_label/abef0c609ad3e9c2edea4b985280bcc1.seg 04379243 +02773838/points/1b84dededd445058e44a5473032f38f.pts 02773838/expert_verified/points_label/1b84dededd445058e44a5473032f38f.seg 02773838 +04379243/points/cd09a9641ea97d873823cce3247aa03b.pts 04379243/expert_verified/points_label/cd09a9641ea97d873823cce3247aa03b.seg 04379243 +03636649/points/6aa1ce4e245001589f1a71e46bbde97c.pts 03636649/expert_verified/points_label/6aa1ce4e245001589f1a71e46bbde97c.seg 03636649 +04379243/points/bb1aa2cdf216d348e76bc197b3a3ffc0.pts 04379243/expert_verified/points_label/bb1aa2cdf216d348e76bc197b3a3ffc0.seg 04379243 +04379243/points/da1e75a8647bfd919778416969ddad32.pts 04379243/expert_verified/points_label/da1e75a8647bfd919778416969ddad32.seg 04379243 +02958343/points/3d0308da43d52e3ef56f8ea3d9016e55.pts 02958343/expert_verified/points_label/3d0308da43d52e3ef56f8ea3d9016e55.seg 02958343 +04379243/points/1ca75076bcebfac76c3484ac7eef025f.pts 04379243/expert_verified/points_label/1ca75076bcebfac76c3484ac7eef025f.seg 04379243 +02691156/points/97ec5b82d9757b639cb1b92881e8e76.pts 02691156/expert_verified/points_label/97ec5b82d9757b639cb1b92881e8e76.seg 02691156 +02691156/points/75db11c354c6342aad01ec966c80ac91.pts 02691156/expert_verified/points_label/75db11c354c6342aad01ec966c80ac91.seg 02691156 +02691156/points/caf80ecbad22a7384e1799d9d4d697c3.pts 02691156/expert_verified/points_label/caf80ecbad22a7384e1799d9d4d697c3.seg 02691156 +03001627/points/d6e0a95f00c7af6fbae0ffb97058b7cc.pts 03001627/expert_verified/points_label/d6e0a95f00c7af6fbae0ffb97058b7cc.seg 03001627 +04379243/points/fa72e9cf7308066b1c072ac0b83fe07a.pts 04379243/expert_verified/points_label/fa72e9cf7308066b1c072ac0b83fe07a.seg 04379243 +03790512/points/455485399ab75f93429f1c522640e6f0.pts 03790512/expert_verified/points_label/455485399ab75f93429f1c522640e6f0.seg 03790512 +03642806/points/241ec8a746dd1cfc78f71a335ebabfa5.pts 03642806/expert_verified/points_label/241ec8a746dd1cfc78f71a335ebabfa5.seg 03642806 +04379243/points/c6575b4c39a341c698d5fc0473d00a1c.pts 04379243/expert_verified/points_label/c6575b4c39a341c698d5fc0473d00a1c.seg 04379243 +02958343/points/219a0021526791d18bb5c0bf5eec83fc.pts 02958343/expert_verified/points_label/219a0021526791d18bb5c0bf5eec83fc.seg 02958343 +02691156/points/49917fb82beca4beca8607f540cc62ba.pts 02691156/expert_verified/points_label/49917fb82beca4beca8607f540cc62ba.seg 02691156 +03636649/points/dac278ab197b5efefaa6996ece0d86f4.pts 03636649/expert_verified/points_label/dac278ab197b5efefaa6996ece0d86f4.seg 03636649 +03467517/points/f146c58eaa06f5e4d57700c05b1862d8.pts 03467517/expert_verified/points_label/f146c58eaa06f5e4d57700c05b1862d8.seg 03467517 +04379243/points/aaf6be1d92a8c61fdcfcef693e7ec696.pts 04379243/expert_verified/points_label/aaf6be1d92a8c61fdcfcef693e7ec696.seg 04379243 +03001627/points/46789c1fb150dfaf51f77a6d7299806.pts 03001627/expert_verified/points_label/46789c1fb150dfaf51f77a6d7299806.seg 03001627 +03790512/points/4a2f0b20ef680347395d58407f193ba.pts 03790512/expert_verified/points_label/4a2f0b20ef680347395d58407f193ba.seg 03790512 +04379243/points/28ce06aa6f25b39f2d19175e7d19b7cb.pts 04379243/expert_verified/points_label/28ce06aa6f25b39f2d19175e7d19b7cb.seg 04379243 +02958343/points/1710ff46ca275e171df27141dea8c9a.pts 02958343/expert_verified/points_label/1710ff46ca275e171df27141dea8c9a.seg 02958343 +03636649/points/b57bcdb88c669663ec2a7a1f5fe7365d.pts 03636649/expert_verified/points_label/b57bcdb88c669663ec2a7a1f5fe7365d.seg 03636649 +04379243/points/c348d279fd22730a9741b7ee128375de.pts 04379243/expert_verified/points_label/c348d279fd22730a9741b7ee128375de.seg 04379243 +03001627/points/76fe7cf10c5dbf1edcb466b6f48b5810.pts 03001627/expert_verified/points_label/76fe7cf10c5dbf1edcb466b6f48b5810.seg 03001627 +04379243/points/7727cc0cb47705632dfc2f8d5d30193c.pts 04379243/expert_verified/points_label/7727cc0cb47705632dfc2f8d5d30193c.seg 04379243 +03797390/points/586e67c53f181dc22adf8abaa25e0215.pts 03797390/expert_verified/points_label/586e67c53f181dc22adf8abaa25e0215.seg 03797390 +04379243/points/d9b418e6ec14dbf50efffb055ed6bd1.pts 04379243/expert_verified/points_label/d9b418e6ec14dbf50efffb055ed6bd1.seg 04379243 +04379243/points/f52e52094d8240b2dcfcef693e7ec696.pts 04379243/expert_verified/points_label/f52e52094d8240b2dcfcef693e7ec696.seg 04379243 +02691156/points/821309c2037b49135fab3f99161dc2c2.pts 02691156/expert_verified/points_label/821309c2037b49135fab3f99161dc2c2.seg 02691156 +02954340/points/254e230d31a62470a52821bf1aa3b19a.pts 02954340/expert_verified/points_label/254e230d31a62470a52821bf1aa3b19a.seg 02954340 +02691156/points/e8de6c58f4a772d771d03b466c72ce41.pts 02691156/expert_verified/points_label/e8de6c58f4a772d771d03b466c72ce41.seg 02691156 +03642806/points/f1c6801e84c85a07bfb149497503af.pts 03642806/expert_verified/points_label/f1c6801e84c85a07bfb149497503af.seg 03642806 +02691156/points/a04d10b24ede5e9a3de778e85611513b.pts 02691156/expert_verified/points_label/a04d10b24ede5e9a3de778e85611513b.seg 02691156 +03467517/points/c8acdfaec5008118343b0b12983b9982.pts 03467517/expert_verified/points_label/c8acdfaec5008118343b0b12983b9982.seg 03467517 +03001627/points/9c3e53d9d1e653c0bf80985a99195eb8.pts 03001627/expert_verified/points_label/9c3e53d9d1e653c0bf80985a99195eb8.seg 03001627 +02691156/points/123bd9e948881939c38a1d3458dafa1b.pts 02691156/expert_verified/points_label/123bd9e948881939c38a1d3458dafa1b.seg 02691156 +03948459/points/abc7a1373f4b30291adcc40d88daf7c8.pts 03948459/expert_verified/points_label/abc7a1373f4b30291adcc40d88daf7c8.seg 03948459 +03636649/points/c906a9c7ae536a0c7fb7f79251dd7727.pts 03636649/expert_verified/points_label/c906a9c7ae536a0c7fb7f79251dd7727.seg 03636649 +03797390/points/e71102b6da1d63f3a363b55cbd344baa.pts 03797390/expert_verified/points_label/e71102b6da1d63f3a363b55cbd344baa.seg 03797390 +03642806/points/22389f9c3c049ce757c29983a611b1c6.pts 03642806/expert_verified/points_label/22389f9c3c049ce757c29983a611b1c6.seg 03642806 +04379243/points/5c2c29fd07c365afe5c65540d3456093.pts 04379243/expert_verified/points_label/5c2c29fd07c365afe5c65540d3456093.seg 04379243 +03001627/points/9a8dfc7a6831749f504721639e19f609.pts 03001627/expert_verified/points_label/9a8dfc7a6831749f504721639e19f609.seg 03001627 +03001627/points/d49ce87d43cf4c8f1679065e1c457f94.pts 03001627/expert_verified/points_label/d49ce87d43cf4c8f1679065e1c457f94.seg 03001627 +02691156/points/dfa36bffe436a98ee0534173b9189765.pts 02691156/expert_verified/points_label/dfa36bffe436a98ee0534173b9189765.seg 02691156 +04379243/points/987b7b49a1435a4b1b17743c18fb63dc.pts 04379243/expert_verified/points_label/987b7b49a1435a4b1b17743c18fb63dc.seg 04379243 +04379243/points/8d0d7787f4babee7e66285d36ebb986.pts 04379243/expert_verified/points_label/8d0d7787f4babee7e66285d36ebb986.seg 04379243 +04379243/points/4f06092100d0164013d2510999d0f1d2.pts 04379243/expert_verified/points_label/4f06092100d0164013d2510999d0f1d2.seg 04379243 +02958343/points/fce2b933f93d132f4f45033b2f001552.pts 02958343/expert_verified/points_label/fce2b933f93d132f4f45033b2f001552.seg 02958343 +04379243/points/3817a222e96acc4ca78510b72d2281ea.pts 04379243/expert_verified/points_label/3817a222e96acc4ca78510b72d2281ea.seg 04379243 +03001627/points/7ee09fdece7d9142afdb9a672b7d3b8a.pts 03001627/expert_verified/points_label/7ee09fdece7d9142afdb9a672b7d3b8a.seg 03001627 +04379243/points/676d05aaaeecb8a04b3c42e318f3affc.pts 04379243/expert_verified/points_label/676d05aaaeecb8a04b3c42e318f3affc.seg 04379243 +03624134/points/6813197ad5e7011fcc34b900bb2492e.pts 03624134/expert_verified/points_label/6813197ad5e7011fcc34b900bb2492e.seg 03624134 +04379243/points/ea367e390741fc38dcfcef693e7ec696.pts 04379243/expert_verified/points_label/ea367e390741fc38dcfcef693e7ec696.seg 04379243 +04379243/points/2e5ac0552fa296c43bbab77a66bc3671.pts 04379243/expert_verified/points_label/2e5ac0552fa296c43bbab77a66bc3671.seg 04379243 +03467517/points/32a337387527f39193f0194265a9746c.pts 03467517/expert_verified/points_label/32a337387527f39193f0194265a9746c.seg 03467517 +03001627/points/97cd4ed02e022ce7174150bd56e389a8.pts 03001627/expert_verified/points_label/97cd4ed02e022ce7174150bd56e389a8.seg 03001627 +04379243/points/88e06a85e2a0f99fa7e7cb173e141227.pts 04379243/expert_verified/points_label/88e06a85e2a0f99fa7e7cb173e141227.seg 04379243 +04379243/points/c5a02d586ea431a1e76bc197b3a3ffc0.pts 04379243/expert_verified/points_label/c5a02d586ea431a1e76bc197b3a3ffc0.seg 04379243 +03001627/points/bcdcb4928e07e4174a623eb2e3317415.pts 03001627/expert_verified/points_label/bcdcb4928e07e4174a623eb2e3317415.seg 03001627 +02691156/points/934dd5529c22cd05bc0909d98a1ff2b4.pts 02691156/expert_verified/points_label/934dd5529c22cd05bc0909d98a1ff2b4.seg 02691156 +03001627/points/e696f4c7cd88b8b52ff834514c92e8fd.pts 03001627/expert_verified/points_label/e696f4c7cd88b8b52ff834514c92e8fd.seg 03001627 +02691156/points/93ba822e84586999e3375a6b96a1d765.pts 02691156/expert_verified/points_label/93ba822e84586999e3375a6b96a1d765.seg 02691156 +02958343/points/3ac664a7486a0bdff200a72c9245aee7.pts 02958343/expert_verified/points_label/3ac664a7486a0bdff200a72c9245aee7.seg 02958343 +02691156/points/545cadae487b55bbc46ba5100bcdc520.pts 02691156/expert_verified/points_label/545cadae487b55bbc46ba5100bcdc520.seg 02691156 +03001627/points/c47f71319ead4eb8a4fb72f4f3b0e317.pts 03001627/expert_verified/points_label/c47f71319ead4eb8a4fb72f4f3b0e317.seg 03001627 +04379243/points/39bb09201e0cd201c17e7f250c5222bd.pts 04379243/expert_verified/points_label/39bb09201e0cd201c17e7f250c5222bd.seg 04379243 +04379243/points/13782b95eeefcedacf004563556ddb36.pts 04379243/expert_verified/points_label/13782b95eeefcedacf004563556ddb36.seg 04379243 +03001627/points/3cc90d903e0ec7aa61e11d707ecb7fa0.pts 03001627/expert_verified/points_label/3cc90d903e0ec7aa61e11d707ecb7fa0.seg 03001627 +04379243/points/4079aaabaa6451a2765ca89770f206ec.pts 04379243/expert_verified/points_label/4079aaabaa6451a2765ca89770f206ec.seg 04379243 +04379243/points/4bbf789edb243cafc955e5ed03ef3a2f.pts 04379243/expert_verified/points_label/4bbf789edb243cafc955e5ed03ef3a2f.seg 04379243 +02773838/points/6187bd900c3bc002ed13f430b2941481.pts 02773838/expert_verified/points_label/6187bd900c3bc002ed13f430b2941481.seg 02773838 +04379243/points/6dc6bb97c387b2f3af4e8812cf1b9e1.pts 04379243/expert_verified/points_label/6dc6bb97c387b2f3af4e8812cf1b9e1.seg 04379243 +03467517/points/9c260623916034b6f7d037d5768b173f.pts 03467517/expert_verified/points_label/9c260623916034b6f7d037d5768b173f.seg 03467517 +02691156/points/8d5c3d38de9c3685f2e77d54f4da142.pts 02691156/expert_verified/points_label/8d5c3d38de9c3685f2e77d54f4da142.seg 02691156 +04379243/points/6152e14b042aa17546f41dc2aaef556b.pts 04379243/expert_verified/points_label/6152e14b042aa17546f41dc2aaef556b.seg 04379243 +03467517/points/68a8bf89972cd337a77e8142614cdaae.pts 03467517/expert_verified/points_label/68a8bf89972cd337a77e8142614cdaae.seg 03467517 +02691156/points/3d5354863690ac7eca27bba175814d1.pts 02691156/expert_verified/points_label/3d5354863690ac7eca27bba175814d1.seg 02691156 +04379243/points/3411daa955306811d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/3411daa955306811d93768e7b9b1eabf.seg 04379243 +04379243/points/8594658920d6ea7b23656ce81843.pts 04379243/expert_verified/points_label/8594658920d6ea7b23656ce81843.seg 04379243 +02691156/points/a074750e28ed3818203936772104a82d.pts 02691156/expert_verified/points_label/a074750e28ed3818203936772104a82d.seg 02691156 +04379243/points/fcd4d0e1777f4841dcfcef693e7ec696.pts 04379243/expert_verified/points_label/fcd4d0e1777f4841dcfcef693e7ec696.seg 04379243 +03948459/points/708e38e7b733fd22bfae4699de9cb91a.pts 03948459/expert_verified/points_label/708e38e7b733fd22bfae4699de9cb91a.seg 03948459 +04379243/points/3c4e1361b066ea3b8ca998f0f87d0c84.pts 04379243/expert_verified/points_label/3c4e1361b066ea3b8ca998f0f87d0c84.seg 04379243 +03624134/points/38798b7013607bbf1e0b76f10c6e38af.pts 03624134/expert_verified/points_label/38798b7013607bbf1e0b76f10c6e38af.seg 03624134 +02691156/points/2176fa9f69e5e1dcca8607f540cc62ba.pts 02691156/expert_verified/points_label/2176fa9f69e5e1dcca8607f540cc62ba.seg 02691156 +03467517/points/8dd7df733a5ba17acae98171fea031ef.pts 03467517/expert_verified/points_label/8dd7df733a5ba17acae98171fea031ef.seg 03467517 +03001627/points/d3f31fd0fc99f45e8b3f6b4a44a70e52.pts 03001627/expert_verified/points_label/d3f31fd0fc99f45e8b3f6b4a44a70e52.seg 03001627 +02691156/points/118e8142a8cb1fe19a4a28ef635593ce.pts 02691156/expert_verified/points_label/118e8142a8cb1fe19a4a28ef635593ce.seg 02691156 +03624134/points/de62211649b4cced49384f9741ad64d8.pts 03624134/expert_verified/points_label/de62211649b4cced49384f9741ad64d8.seg 03624134 +03642806/points/7a4342f61ed7b153341aafe10fd0cbd4.pts 03642806/expert_verified/points_label/7a4342f61ed7b153341aafe10fd0cbd4.seg 03642806 +03001627/points/ba56f02dee485974c242632b2a8c3129.pts 03001627/expert_verified/points_label/ba56f02dee485974c242632b2a8c3129.seg 03001627 +04379243/points/97b7baeb8a172de42f56f09e5bc67bee.pts 04379243/expert_verified/points_label/97b7baeb8a172de42f56f09e5bc67bee.seg 04379243 +04379243/points/7b2af227264af938d42b9650f19dd425.pts 04379243/expert_verified/points_label/7b2af227264af938d42b9650f19dd425.seg 04379243 +04379243/points/e25fdb977fb867fdc3bd24f986301745.pts 04379243/expert_verified/points_label/e25fdb977fb867fdc3bd24f986301745.seg 04379243 +03467517/points/33da9c54f43be3e17693a84bff425e3.pts 03467517/expert_verified/points_label/33da9c54f43be3e17693a84bff425e3.seg 03467517 +02691156/points/e1e5cfcabcbe26a03087f84b199fd297.pts 02691156/expert_verified/points_label/e1e5cfcabcbe26a03087f84b199fd297.seg 02691156 +03636649/points/ba05811f301cdd791735ea0e092a805a.pts 03636649/expert_verified/points_label/ba05811f301cdd791735ea0e092a805a.seg 03636649 +03001627/points/6678f63c9b584a549d9e5580ae9f8738.pts 03001627/expert_verified/points_label/6678f63c9b584a549d9e5580ae9f8738.seg 03001627 +04379243/points/b6b8ede77085c0a95bea7c29e873d16.pts 04379243/expert_verified/points_label/b6b8ede77085c0a95bea7c29e873d16.seg 04379243 +02691156/points/d81042a53dd1cc5bd90bfc986bc4c94d.pts 02691156/expert_verified/points_label/d81042a53dd1cc5bd90bfc986bc4c94d.seg 02691156 +03001627/points/37b432326fecc8a1327289c00b6dc9ca.pts 03001627/expert_verified/points_label/37b432326fecc8a1327289c00b6dc9ca.seg 03001627 +03636649/points/c898f9b1dddbb8801735ea0e092a805a.pts 03636649/expert_verified/points_label/c898f9b1dddbb8801735ea0e092a805a.seg 03636649 +03001627/points/5d02aed0e9c93e829b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/5d02aed0e9c93e829b9f2eb77f5e247e.seg 03001627 +03001627/points/9a864d5de972a8c7cb686b8b855fed61.pts 03001627/expert_verified/points_label/9a864d5de972a8c7cb686b8b855fed61.seg 03001627 +04379243/points/b14a14cc2f3c38c9e3def9c422df2282.pts 04379243/expert_verified/points_label/b14a14cc2f3c38c9e3def9c422df2282.seg 04379243 +04379243/points/f2893a87ec37f8b3781cb4570305e329.pts 04379243/expert_verified/points_label/f2893a87ec37f8b3781cb4570305e329.seg 04379243 +02691156/points/3fa511e1882e41eeca8607f540cc62ba.pts 02691156/expert_verified/points_label/3fa511e1882e41eeca8607f540cc62ba.seg 02691156 +02691156/points/444d67950ff9a4cc1139bebb00fe5be8.pts 02691156/expert_verified/points_label/444d67950ff9a4cc1139bebb00fe5be8.seg 02691156 +03001627/points/3d3b7f63f5525b1ae37f5a622d383617.pts 03001627/expert_verified/points_label/3d3b7f63f5525b1ae37f5a622d383617.seg 03001627 +03001627/points/30beaf15d2d2beb1febad4f49b26ec52.pts 03001627/expert_verified/points_label/30beaf15d2d2beb1febad4f49b26ec52.seg 03001627 +04379243/points/59f04ddbd896f4f5430644dfe647c381.pts 04379243/expert_verified/points_label/59f04ddbd896f4f5430644dfe647c381.seg 04379243 +04379243/points/eb9b9b8d186a974a7afee304cce81d6f.pts 04379243/expert_verified/points_label/eb9b9b8d186a974a7afee304cce81d6f.seg 04379243 +03790512/points/7c4fc3a05d5fc8b1d0f568c31c1cd62a.pts 03790512/expert_verified/points_label/7c4fc3a05d5fc8b1d0f568c31c1cd62a.seg 03790512 +04379243/points/68142013a4f5e7c2febad4f49b26ec52.pts 04379243/expert_verified/points_label/68142013a4f5e7c2febad4f49b26ec52.seg 04379243 +02958343/points/8053e014516531ddc3f500d7b182f6.pts 02958343/expert_verified/points_label/8053e014516531ddc3f500d7b182f6.seg 02958343 +02958343/points/1a3782ae4bd711b66b418c7d9fedcaa9.pts 02958343/expert_verified/points_label/1a3782ae4bd711b66b418c7d9fedcaa9.seg 02958343 +04379243/points/cc58de930acd321fac242c3aebc81b2f.pts 04379243/expert_verified/points_label/cc58de930acd321fac242c3aebc81b2f.seg 04379243 +02691156/points/d4dac019726e980e203936772104a82d.pts 02691156/expert_verified/points_label/d4dac019726e980e203936772104a82d.seg 02691156 +02954340/points/6e983d20e0bf80296829cd4082fbdbdf.pts 02954340/expert_verified/points_label/6e983d20e0bf80296829cd4082fbdbdf.seg 02954340 +03636649/points/fad026744a6abb1937cf479d4bb58d.pts 03636649/expert_verified/points_label/fad026744a6abb1937cf479d4bb58d.seg 03636649 +02958343/points/4d2d4e26349be1f3be2cbcda9b6dc9b2.pts 02958343/expert_verified/points_label/4d2d4e26349be1f3be2cbcda9b6dc9b2.seg 02958343 +03636649/points/280fa01686e780ba3501c961e91ff6d7.pts 03636649/expert_verified/points_label/280fa01686e780ba3501c961e91ff6d7.seg 03636649 +04379243/points/f02907c5c42e1e766f1e07a56c129dfc.pts 04379243/expert_verified/points_label/f02907c5c42e1e766f1e07a56c129dfc.seg 04379243 +04379243/points/5f100571ffd90f8252b4875f731f71cd.pts 04379243/expert_verified/points_label/5f100571ffd90f8252b4875f731f71cd.seg 04379243 +04379243/points/f718cb5d6202341dc183308b9aafe2ca.pts 04379243/expert_verified/points_label/f718cb5d6202341dc183308b9aafe2ca.seg 04379243 +03642806/points/b436271050d647052f8d6d501b18a4b5.pts 03642806/expert_verified/points_label/b436271050d647052f8d6d501b18a4b5.seg 03642806 +03001627/points/6dddf2b95ca09bf5febad4f49b26ec52.pts 03001627/expert_verified/points_label/6dddf2b95ca09bf5febad4f49b26ec52.seg 03001627 +02691156/points/b812c2df636aa0218b96ae1a0a8b84ec.pts 02691156/expert_verified/points_label/b812c2df636aa0218b96ae1a0a8b84ec.seg 02691156 +02958343/points/89edb3d434f4c983afe1d4530f4c6e24.pts 02958343/expert_verified/points_label/89edb3d434f4c983afe1d4530f4c6e24.seg 02958343 +02958343/points/80ac9cc0d4c9dde3b7a7bc444c2d756b.pts 02958343/expert_verified/points_label/80ac9cc0d4c9dde3b7a7bc444c2d756b.seg 02958343 +04379243/points/b62d45745434ac46c4cfe384be4426c3.pts 04379243/expert_verified/points_label/b62d45745434ac46c4cfe384be4426c3.seg 04379243 +04379243/points/9c4afb731e910d3723500a5b036df62e.pts 04379243/expert_verified/points_label/9c4afb731e910d3723500a5b036df62e.seg 04379243 +04379243/points/43fcddd5232a6021a56e8b79ca4e2911.pts 04379243/expert_verified/points_label/43fcddd5232a6021a56e8b79ca4e2911.seg 04379243 +04379243/points/6724ae69c0bde4c09b7dad6c9c46bcf1.pts 04379243/expert_verified/points_label/6724ae69c0bde4c09b7dad6c9c46bcf1.seg 04379243 +03001627/points/323fc7b1d2b44cb7ff2b8acf844d34d2.pts 03001627/expert_verified/points_label/323fc7b1d2b44cb7ff2b8acf844d34d2.seg 03001627 +03001627/points/434cee44934612a81f98c0761af40e04.pts 03001627/expert_verified/points_label/434cee44934612a81f98c0761af40e04.seg 03001627 +03636649/points/31dee666120727b0be78c8b300d2a963.pts 03636649/expert_verified/points_label/31dee666120727b0be78c8b300d2a963.seg 03636649 +02958343/points/48f5446e6ac9c1b51f1446551412bde4.pts 02958343/expert_verified/points_label/48f5446e6ac9c1b51f1446551412bde4.seg 02958343 +04379243/points/aa3eb180a4f6d8d42de421c2ab5cfb52.pts 04379243/expert_verified/points_label/aa3eb180a4f6d8d42de421c2ab5cfb52.seg 04379243 +04379243/points/14e5e4db3246dacff12d7184a2ad3430.pts 04379243/expert_verified/points_label/14e5e4db3246dacff12d7184a2ad3430.seg 04379243 +03001627/points/96c0ecd1ef80e818c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/96c0ecd1ef80e818c8687ff9b0b4e4ac.seg 03001627 +04225987/points/d4c042d11f29dffa1082f2ea630bf69e.pts 04225987/expert_verified/points_label/d4c042d11f29dffa1082f2ea630bf69e.seg 04225987 +03642806/points/7ebff305b2e93504239603972bcd2e7b.pts 03642806/expert_verified/points_label/7ebff305b2e93504239603972bcd2e7b.seg 03642806 +03467517/points/369fc7f8d880e1b793f0194265a9746c.pts 03467517/expert_verified/points_label/369fc7f8d880e1b793f0194265a9746c.seg 03467517 +04379243/points/25f69a74efbff4d071a782a4379556c7.pts 04379243/expert_verified/points_label/25f69a74efbff4d071a782a4379556c7.seg 04379243 +04379243/points/7cd4844def36a9f5bc7589eefbdbc3c5.pts 04379243/expert_verified/points_label/7cd4844def36a9f5bc7589eefbdbc3c5.seg 04379243 +03467517/points/5852a24dde24a8ef93f0194265a9746c.pts 03467517/expert_verified/points_label/5852a24dde24a8ef93f0194265a9746c.seg 03467517 +03001627/points/df8440d8678f3a91c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/df8440d8678f3a91c8687ff9b0b4e4ac.seg 03001627 +04379243/points/49bf25ff4401946524c10ba1eb690638.pts 04379243/expert_verified/points_label/49bf25ff4401946524c10ba1eb690638.seg 04379243 +03001627/points/7eedcb6d76b8c23a9cdb421f6af95e5f.pts 03001627/expert_verified/points_label/7eedcb6d76b8c23a9cdb421f6af95e5f.seg 03001627 +03797390/points/ff1a44e1c1785d618bca309f2c51966a.pts 03797390/expert_verified/points_label/ff1a44e1c1785d618bca309f2c51966a.seg 03797390 +02958343/points/85f3dc3318f5200c8672c9b355cd2075.pts 02958343/expert_verified/points_label/85f3dc3318f5200c8672c9b355cd2075.seg 02958343 +02691156/points/c9be9f07f5ae7c375d7629390efe0a2.pts 02691156/expert_verified/points_label/c9be9f07f5ae7c375d7629390efe0a2.seg 02691156 +02691156/points/14cd2f1de7f68bf3ab550998f901c8e1.pts 02691156/expert_verified/points_label/14cd2f1de7f68bf3ab550998f901c8e1.seg 02691156 +02958343/points/81fad64b8fd8f010b17445a1c29f6d34.pts 02958343/expert_verified/points_label/81fad64b8fd8f010b17445a1c29f6d34.seg 02958343 +02958343/points/fe2ce22107693354f1cc1cb691702a23.pts 02958343/expert_verified/points_label/fe2ce22107693354f1cc1cb691702a23.seg 02958343 +02691156/points/74cbf170c5f2fb587d9c9c8a8ba32919.pts 02691156/expert_verified/points_label/74cbf170c5f2fb587d9c9c8a8ba32919.seg 02691156 +02691156/points/67dbb0de722cf5cd7a734abc5ba1db0f.pts 02691156/expert_verified/points_label/67dbb0de722cf5cd7a734abc5ba1db0f.seg 02691156 +04379243/points/fa345f8f107d93b9ba70f71694a4b74c.pts 04379243/expert_verified/points_label/fa345f8f107d93b9ba70f71694a4b74c.seg 04379243 +04379243/points/a45a7ba9a2842a55634c21965ee6bab.pts 04379243/expert_verified/points_label/a45a7ba9a2842a55634c21965ee6bab.seg 04379243 +04379243/points/8d7ac6078989980fad16260d4d73b56.pts 04379243/expert_verified/points_label/8d7ac6078989980fad16260d4d73b56.seg 04379243 +03001627/points/e803b31e2185d0405784b22e1081a3e1.pts 03001627/expert_verified/points_label/e803b31e2185d0405784b22e1081a3e1.seg 03001627 +04379243/points/aaf3aeda0f848344b87028a4b477349f.pts 04379243/expert_verified/points_label/aaf3aeda0f848344b87028a4b477349f.seg 04379243 +03636649/points/e94aab17400945413225afab722d9fd2.pts 03636649/expert_verified/points_label/e94aab17400945413225afab722d9fd2.seg 03636649 +03001627/points/d2c465e85d2e8f1fcea003eff0268278.pts 03001627/expert_verified/points_label/d2c465e85d2e8f1fcea003eff0268278.seg 03001627 +03001627/points/88376e3d3a23d263de29d28278a34a18.pts 03001627/expert_verified/points_label/88376e3d3a23d263de29d28278a34a18.seg 03001627 +04379243/points/4775e71d37374444febad4f49b26ec52.pts 04379243/expert_verified/points_label/4775e71d37374444febad4f49b26ec52.seg 04379243 +03636649/points/f12822778713f5e35b36bbc16e99b441.pts 03636649/expert_verified/points_label/f12822778713f5e35b36bbc16e99b441.seg 03636649 +03636649/points/963e6743370d5c5c9b5d51fa8cce1753.pts 03636649/expert_verified/points_label/963e6743370d5c5c9b5d51fa8cce1753.seg 03636649 +04379243/points/13c51c08c3695a09eda47978b73f5994.pts 04379243/expert_verified/points_label/13c51c08c3695a09eda47978b73f5994.seg 04379243 +04379243/points/89827ac677337629ab610b0c94236463.pts 04379243/expert_verified/points_label/89827ac677337629ab610b0c94236463.seg 04379243 +04379243/points/89b478643e53d3d6285c99063fc6fcf8.pts 04379243/expert_verified/points_label/89b478643e53d3d6285c99063fc6fcf8.seg 04379243 +04379243/points/401cd99ace3b92fadf6cfab91d65bb91.pts 04379243/expert_verified/points_label/401cd99ace3b92fadf6cfab91d65bb91.seg 04379243 +04379243/points/74c3d551e32a1cca664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/74c3d551e32a1cca664b3b9b23ddfcbc.seg 04379243 +04379243/points/db64db160fd13a514e1a714ee619465a.pts 04379243/expert_verified/points_label/db64db160fd13a514e1a714ee619465a.seg 04379243 +03001627/points/8e664a0bcaf9d2a45ca1aaa0789db621.pts 03001627/expert_verified/points_label/8e664a0bcaf9d2a45ca1aaa0789db621.seg 03001627 +03001627/points/43897195d7f893d759c257be4c612509.pts 03001627/expert_verified/points_label/43897195d7f893d759c257be4c612509.seg 03001627 +04379243/points/e6d8569c0957e7453002761e7a3ba3bd.pts 04379243/expert_verified/points_label/e6d8569c0957e7453002761e7a3ba3bd.seg 04379243 +03636649/points/ead77648c9c7dbf8d42b9650f19dd425.pts 03636649/expert_verified/points_label/ead77648c9c7dbf8d42b9650f19dd425.seg 03636649 +03636649/points/c54d3a5a9c8a655e46407779dbd69b2d.pts 03636649/expert_verified/points_label/c54d3a5a9c8a655e46407779dbd69b2d.seg 03636649 +03001627/points/379f0efc898d7a7e9fe74a48bbc553d7.pts 03001627/expert_verified/points_label/379f0efc898d7a7e9fe74a48bbc553d7.seg 03001627 +04379243/points/c1d44782ac45d6fe3671949e4f99cc76.pts 04379243/expert_verified/points_label/c1d44782ac45d6fe3671949e4f99cc76.seg 04379243 +04379243/points/7b3b160dafe7e122d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/7b3b160dafe7e122d93768e7b9b1eabf.seg 04379243 +03001627/points/7f271ecbdeb7610d637adadafee6f182.pts 03001627/expert_verified/points_label/7f271ecbdeb7610d637adadafee6f182.seg 03001627 +02958343/points/df34c25a1e1abe9428044fe9244db50a.pts 02958343/expert_verified/points_label/df34c25a1e1abe9428044fe9244db50a.seg 02958343 +03948459/points/98c0bd351e275b3c96893524e607761d.pts 03948459/expert_verified/points_label/98c0bd351e275b3c96893524e607761d.seg 03948459 +03636649/points/b96c8cc6529167bfcb8d8c6d4df8143.pts 03636649/expert_verified/points_label/b96c8cc6529167bfcb8d8c6d4df8143.seg 03636649 +03624134/points/a33847e9c32c1afc93ac017b81605788.pts 03624134/expert_verified/points_label/a33847e9c32c1afc93ac017b81605788.seg 03624134 +03001627/points/594d5b7f3e705a1ab3234e0da44b11e4.pts 03001627/expert_verified/points_label/594d5b7f3e705a1ab3234e0da44b11e4.seg 03001627 +03001627/points/f0f04644e071d9348ca588a3264b9f86.pts 03001627/expert_verified/points_label/f0f04644e071d9348ca588a3264b9f86.seg 03001627 +02691156/points/4bdb2c4fc6701174ca8607f540cc62ba.pts 02691156/expert_verified/points_label/4bdb2c4fc6701174ca8607f540cc62ba.seg 02691156 +03001627/points/fc2a1c4c332f7731e45ef4135c266a12.pts 03001627/expert_verified/points_label/fc2a1c4c332f7731e45ef4135c266a12.seg 03001627 +02691156/points/df68b8fb9f4531b42e690fa6dfd5d610.pts 02691156/expert_verified/points_label/df68b8fb9f4531b42e690fa6dfd5d610.seg 02691156 +03642806/points/517de75577ac6e8a42b9615216f9a30d.pts 03642806/expert_verified/points_label/517de75577ac6e8a42b9615216f9a30d.seg 03642806 +03001627/points/74cc57ea0e2e06dbe4106b1d06dc89b3.pts 03001627/expert_verified/points_label/74cc57ea0e2e06dbe4106b1d06dc89b3.seg 03001627 +02691156/points/d72a483cf8a0cf2bbbf3143b1cb6076a.pts 02691156/expert_verified/points_label/d72a483cf8a0cf2bbbf3143b1cb6076a.seg 02691156 +03001627/points/9c7b2ed3770d1a6ea6fee8e2140acec9.pts 03001627/expert_verified/points_label/9c7b2ed3770d1a6ea6fee8e2140acec9.seg 03001627 +04379243/points/28fb9a81898f88c4ae8375def5e736d8.pts 04379243/expert_verified/points_label/28fb9a81898f88c4ae8375def5e736d8.seg 04379243 +03636649/points/c0b0d7e15d3dfab1733c22d8b8e1c33d.pts 03636649/expert_verified/points_label/c0b0d7e15d3dfab1733c22d8b8e1c33d.seg 03636649 +03001627/points/bb04dc0b336abf4b263915c09bc4854f.pts 03001627/expert_verified/points_label/bb04dc0b336abf4b263915c09bc4854f.seg 03001627 +03001627/points/6caccdad9f8d4f0a7f1cdfc0a8f38f2e.pts 03001627/expert_verified/points_label/6caccdad9f8d4f0a7f1cdfc0a8f38f2e.seg 03001627 +04379243/points/86ad91ef08c53dd77189b31b3e8c8ef3.pts 04379243/expert_verified/points_label/86ad91ef08c53dd77189b31b3e8c8ef3.seg 04379243 +03790512/points/80e717f07645a4a0b37378f3c85478b4.pts 03790512/expert_verified/points_label/80e717f07645a4a0b37378f3c85478b4.seg 03790512 +02691156/points/7d226c520a29c7705e28caa3b26a73fd.pts 02691156/expert_verified/points_label/7d226c520a29c7705e28caa3b26a73fd.seg 02691156 +04379243/points/89c095a52766ecb05d2ac47f638a4ea4.pts 04379243/expert_verified/points_label/89c095a52766ecb05d2ac47f638a4ea4.seg 04379243 +04379243/points/7b92f6facc2a27bc84cc0348a73b80c3.pts 04379243/expert_verified/points_label/7b92f6facc2a27bc84cc0348a73b80c3.seg 04379243 +04379243/points/d578287c4a9452efa9af104529ef47c3.pts 04379243/expert_verified/points_label/d578287c4a9452efa9af104529ef47c3.seg 04379243 +03636649/points/1475fe59961fc726f096eadaad23f93d.pts 03636649/expert_verified/points_label/1475fe59961fc726f096eadaad23f93d.seg 03636649 +03790512/points/7d75e8200565ffa7b37378f3c85478b4.pts 03790512/expert_verified/points_label/7d75e8200565ffa7b37378f3c85478b4.seg 03790512 +04379243/points/852826a94cce36ea9f1deb04fb8ae481.pts 04379243/expert_verified/points_label/852826a94cce36ea9f1deb04fb8ae481.seg 04379243 +03001627/points/9c50878c91aeb8126bb6bc0db07c71e8.pts 03001627/expert_verified/points_label/9c50878c91aeb8126bb6bc0db07c71e8.seg 03001627 +02691156/points/ce827e4c857d553f71d03b466c72ce41.pts 02691156/expert_verified/points_label/ce827e4c857d553f71d03b466c72ce41.seg 02691156 +03001627/points/3aab16309520fb21dc0a8cba62d9a78a.pts 03001627/expert_verified/points_label/3aab16309520fb21dc0a8cba62d9a78a.seg 03001627 +03001627/points/697cfbe6e043136b737a00f007529fbf.pts 03001627/expert_verified/points_label/697cfbe6e043136b737a00f007529fbf.seg 03001627 +04379243/points/fd7769d0eba554c53def89b32cef8e45.pts 04379243/expert_verified/points_label/fd7769d0eba554c53def89b32cef8e45.seg 04379243 +03948459/points/d7e86e0e5b1982d4bf0ab4d7096d87f2.pts 03948459/expert_verified/points_label/d7e86e0e5b1982d4bf0ab4d7096d87f2.seg 03948459 +03001627/points/70cb8d70d961ca48b04cb542e2c50eb4.pts 03001627/expert_verified/points_label/70cb8d70d961ca48b04cb542e2c50eb4.seg 03001627 +03636649/points/c26b7862f2afb7ee4b3c42e318f3affc.pts 03636649/expert_verified/points_label/c26b7862f2afb7ee4b3c42e318f3affc.seg 03636649 +03624134/points/906b20dc0a5a5022714112b147c95c8b.pts 03624134/expert_verified/points_label/906b20dc0a5a5022714112b147c95c8b.seg 03624134 +03001627/points/f5caa9b5ada31a8b3cf15c77de45986.pts 03001627/expert_verified/points_label/f5caa9b5ada31a8b3cf15c77de45986.seg 03001627 +04379243/points/6110d87def4fa88c154c6bbaeb7d331f.pts 04379243/expert_verified/points_label/6110d87def4fa88c154c6bbaeb7d331f.seg 04379243 +03642806/points/b5f6fd84a3f44ddb1aa47689117a61e1.pts 03642806/expert_verified/points_label/b5f6fd84a3f44ddb1aa47689117a61e1.seg 03642806 +03001627/points/95317d46812e4ed4df5aea2392d894b4.pts 03001627/expert_verified/points_label/95317d46812e4ed4df5aea2392d894b4.seg 03001627 +02691156/points/471ca950dbdf0c6c5f80f808704d6409.pts 02691156/expert_verified/points_label/471ca950dbdf0c6c5f80f808704d6409.seg 02691156 +04379243/points/c9f85a671d551086d61f9b2773e1d72a.pts 04379243/expert_verified/points_label/c9f85a671d551086d61f9b2773e1d72a.seg 04379243 +04379243/points/70f1b5f74faa9bda664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/70f1b5f74faa9bda664b3b9b23ddfcbc.seg 04379243 +02691156/points/9a266b3a734e374687bf26680c510802.pts 02691156/expert_verified/points_label/9a266b3a734e374687bf26680c510802.seg 02691156 +03001627/points/4c0983329afcd06f730e89ca0d2d13c3.pts 03001627/expert_verified/points_label/4c0983329afcd06f730e89ca0d2d13c3.seg 03001627 +04379243/points/a7172fa4177661f4858699aaad4acee4.pts 04379243/expert_verified/points_label/a7172fa4177661f4858699aaad4acee4.seg 04379243 +04379243/points/504d908a55f3e0c764810cc21086da42.pts 04379243/expert_verified/points_label/504d908a55f3e0c764810cc21086da42.seg 04379243 +03948459/points/7ba9f65e926d5e3e6fe695987d47043.pts 03948459/expert_verified/points_label/7ba9f65e926d5e3e6fe695987d47043.seg 03948459 +04379243/points/5b546ef5de5d10f3ecc9201d3d846bc1.pts 04379243/expert_verified/points_label/5b546ef5de5d10f3ecc9201d3d846bc1.seg 04379243 +04379243/points/80f986ae572fce791429f9a19502375a.pts 04379243/expert_verified/points_label/80f986ae572fce791429f9a19502375a.seg 04379243 +04379243/points/fd7a579772b195532de421c2ab5cfb52.pts 04379243/expert_verified/points_label/fd7a579772b195532de421c2ab5cfb52.seg 04379243 +03001627/points/e09466e9c122dbfdf51f77a6d7299806.pts 03001627/expert_verified/points_label/e09466e9c122dbfdf51f77a6d7299806.seg 03001627 +04379243/points/2a80c95b4bbcb73d87ed2480ebb0f3d2.pts 04379243/expert_verified/points_label/2a80c95b4bbcb73d87ed2480ebb0f3d2.seg 04379243 +03467517/points/e0d74618e316b0f16d9376f644442e99.pts 03467517/expert_verified/points_label/e0d74618e316b0f16d9376f644442e99.seg 03467517 +03001627/points/587ebb2aa71acfe644dd3aaee16d3f4c.pts 03001627/expert_verified/points_label/587ebb2aa71acfe644dd3aaee16d3f4c.seg 03001627 +03467517/points/10d2c216c70b788485b61f146daff2fb.pts 03467517/expert_verified/points_label/10d2c216c70b788485b61f146daff2fb.seg 03467517 +04379243/points/3c72ddd0dca19bbedcfcef693e7ec696.pts 04379243/expert_verified/points_label/3c72ddd0dca19bbedcfcef693e7ec696.seg 04379243 +03001627/points/2742c0a5e984d92fa0dcc52ca811e565.pts 03001627/expert_verified/points_label/2742c0a5e984d92fa0dcc52ca811e565.seg 03001627 +03624134/points/792f252dcb06f042dd56c1edf3f6e336.pts 03624134/expert_verified/points_label/792f252dcb06f042dd56c1edf3f6e336.seg 03624134 +02691156/points/8fa9e2e8dbed43911f32208e53f871eb.pts 02691156/expert_verified/points_label/8fa9e2e8dbed43911f32208e53f871eb.seg 02691156 +03001627/points/d4f5c3e3eab52d0a3334fb6668ccd834.pts 03001627/expert_verified/points_label/d4f5c3e3eab52d0a3334fb6668ccd834.seg 03001627 +03642806/points/520d98e360cf44ec8139dd63d55edc44.pts 03642806/expert_verified/points_label/520d98e360cf44ec8139dd63d55edc44.seg 03642806 +03467517/points/2eba922263fc1580cc010a80df5d3c87.pts 03467517/expert_verified/points_label/2eba922263fc1580cc010a80df5d3c87.seg 03467517 +04379243/points/53c11596c3fc36a8a5094cb6d104b35.pts 04379243/expert_verified/points_label/53c11596c3fc36a8a5094cb6d104b35.seg 04379243 +03467517/points/265009e163bf5c6f69da8e7f9a803d12.pts 03467517/expert_verified/points_label/265009e163bf5c6f69da8e7f9a803d12.seg 03467517 +04379243/points/fbdf9bffeb353474c3a767747b75e56.pts 04379243/expert_verified/points_label/fbdf9bffeb353474c3a767747b75e56.seg 04379243 +03636649/points/b4af7e9a7338a9a3225afab722d9fd2.pts 03636649/expert_verified/points_label/b4af7e9a7338a9a3225afab722d9fd2.seg 03636649 +03001627/points/55eeb952519ceb87c3bd24f986301745.pts 03001627/expert_verified/points_label/55eeb952519ceb87c3bd24f986301745.seg 03001627 +04379243/points/2259e09ebd0ed2befebad4f49b26ec52.pts 04379243/expert_verified/points_label/2259e09ebd0ed2befebad4f49b26ec52.seg 04379243 +04379243/points/63fedc0334f5552dbec3a71604e140e3.pts 04379243/expert_verified/points_label/63fedc0334f5552dbec3a71604e140e3.seg 04379243 +03001627/points/70ac5cb405df84575e62305d14755686.pts 03001627/expert_verified/points_label/70ac5cb405df84575e62305d14755686.seg 03001627 +03001627/points/3f41b4339ebd59c1c397356311cbeea4.pts 03001627/expert_verified/points_label/3f41b4339ebd59c1c397356311cbeea4.seg 03001627 +04379243/points/10bb44a54a12a74e4719088c8e42c6ab.pts 04379243/expert_verified/points_label/10bb44a54a12a74e4719088c8e42c6ab.seg 04379243 +04379243/points/a83cda80e5c5a0fc3719086e0b4ab8be.pts 04379243/expert_verified/points_label/a83cda80e5c5a0fc3719086e0b4ab8be.seg 04379243 +04379243/points/74983e99e7606eb114708467db3d00e2.pts 04379243/expert_verified/points_label/74983e99e7606eb114708467db3d00e2.seg 04379243 +03001627/points/e052eaa1d5bbe795ded10515704c9720.pts 03001627/expert_verified/points_label/e052eaa1d5bbe795ded10515704c9720.seg 03001627 +02691156/points/35892510dcd7cebb87bf26680c510802.pts 02691156/expert_verified/points_label/35892510dcd7cebb87bf26680c510802.seg 02691156 +03001627/points/7f73cc6c1c9121a9b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/7f73cc6c1c9121a9b9f2eb77f5e247e.seg 03001627 +03001627/points/2a8554af80cfa5e719fb4103277a6b93.pts 03001627/expert_verified/points_label/2a8554af80cfa5e719fb4103277a6b93.seg 03001627 +04379243/points/f82a5f3c2a57655d825da2b9ec9c8c29.pts 04379243/expert_verified/points_label/f82a5f3c2a57655d825da2b9ec9c8c29.seg 04379243 +02691156/points/319cf93077118d19f64801ad2940cdd5.pts 02691156/expert_verified/points_label/319cf93077118d19f64801ad2940cdd5.seg 02691156 +03790512/points/5bb3597d49c58017b37378f3c85478b4.pts 03790512/expert_verified/points_label/5bb3597d49c58017b37378f3c85478b4.seg 03790512 +02958343/points/17926c1ef484b73e6758a098566bc94e.pts 02958343/expert_verified/points_label/17926c1ef484b73e6758a098566bc94e.seg 02958343 +04379243/points/345c1bb95b12ff8c013a7bed5288654.pts 04379243/expert_verified/points_label/345c1bb95b12ff8c013a7bed5288654.seg 04379243 +03001627/points/3b788994cd578990c35131da26f8061a.pts 03001627/expert_verified/points_label/3b788994cd578990c35131da26f8061a.seg 03001627 +03636649/points/c25cc72cd06852e75bbea6ee257e41cc.pts 03636649/expert_verified/points_label/c25cc72cd06852e75bbea6ee257e41cc.seg 03636649 +03001627/points/4e4570768f981ca7b95617254e8005c0.pts 03001627/expert_verified/points_label/4e4570768f981ca7b95617254e8005c0.seg 03001627 +03642806/points/ef6d92c90aeabf5becae27d182a3e41c.pts 03642806/expert_verified/points_label/ef6d92c90aeabf5becae27d182a3e41c.seg 03642806 +04379243/points/97718e2651d22b3a74740f837351e7eb.pts 04379243/expert_verified/points_label/97718e2651d22b3a74740f837351e7eb.seg 04379243 +03948459/points/1f646ff59cabdddcd810dcd63f342aca.pts 03948459/expert_verified/points_label/1f646ff59cabdddcd810dcd63f342aca.seg 03948459 +02958343/points/74f7b559d6af926012f2e446484bbaf7.pts 02958343/expert_verified/points_label/74f7b559d6af926012f2e446484bbaf7.seg 02958343 +03001627/points/8b3619396de4df10db8860d0872e9c55.pts 03001627/expert_verified/points_label/8b3619396de4df10db8860d0872e9c55.seg 03001627 +03001627/points/44ddb3d46266bb0ffebad4f49b26ec52.pts 03001627/expert_verified/points_label/44ddb3d46266bb0ffebad4f49b26ec52.seg 03001627 +03001627/points/a5f300f3975497fa9dcf2183c858e6e5.pts 03001627/expert_verified/points_label/a5f300f3975497fa9dcf2183c858e6e5.seg 03001627 +03467517/points/113b65f0e68314737c481698bd5233b4.pts 03467517/expert_verified/points_label/113b65f0e68314737c481698bd5233b4.seg 03467517 +03001627/points/49795a9ebd9a9c6d2c697f0a1454869.pts 03001627/expert_verified/points_label/49795a9ebd9a9c6d2c697f0a1454869.seg 03001627 +03001627/points/5822ae77b06bea3091da37ff8bdd2524.pts 03001627/expert_verified/points_label/5822ae77b06bea3091da37ff8bdd2524.seg 03001627 +03467517/points/15222c5926c7058cc6df7dab8e567ef6.pts 03467517/expert_verified/points_label/15222c5926c7058cc6df7dab8e567ef6.seg 03467517 +02691156/points/14d9c576d06622198f52dc705c3109b9.pts 02691156/expert_verified/points_label/14d9c576d06622198f52dc705c3109b9.seg 02691156 +04379243/points/62ae9ded861138be9d2be74cfb51ade1.pts 04379243/expert_verified/points_label/62ae9ded861138be9d2be74cfb51ade1.seg 04379243 +02958343/points/7b067be3aa39b1a124853ec273f6c1d2.pts 02958343/expert_verified/points_label/7b067be3aa39b1a124853ec273f6c1d2.seg 02958343 +03636649/points/66cf69a98ff895e2b55fde51a411949f.pts 03636649/expert_verified/points_label/66cf69a98ff895e2b55fde51a411949f.seg 03636649 +04379243/points/3253f2c59e6bd2a119fb4103277a6b93.pts 04379243/expert_verified/points_label/3253f2c59e6bd2a119fb4103277a6b93.seg 04379243 +02691156/points/fe0c4db38fb6399990b1d6deb98feec6.pts 02691156/expert_verified/points_label/fe0c4db38fb6399990b1d6deb98feec6.seg 02691156 +02691156/points/6d93492543d1087eb87697d3904b168b.pts 02691156/expert_verified/points_label/6d93492543d1087eb87697d3904b168b.seg 02691156 +03636649/points/402f7ce2b87e7d1ac066b9622c005c53.pts 03636649/expert_verified/points_label/402f7ce2b87e7d1ac066b9622c005c53.seg 03636649 +04379243/points/272a4cf3cfff3eb1e173cee47fbaa88.pts 04379243/expert_verified/points_label/272a4cf3cfff3eb1e173cee47fbaa88.seg 04379243 +02691156/points/6420a3ff5e526d59e16519c843f95ce0.pts 02691156/expert_verified/points_label/6420a3ff5e526d59e16519c843f95ce0.seg 02691156 +03001627/points/487040c5fdc68fdfe6cfc789522bfbab.pts 03001627/expert_verified/points_label/487040c5fdc68fdfe6cfc789522bfbab.seg 03001627 +04379243/points/8f48ccd17a15baf5ce01c07526cf2aa4.pts 04379243/expert_verified/points_label/8f48ccd17a15baf5ce01c07526cf2aa4.seg 04379243 +03001627/points/40e5d8e71ee3902a31358207d42bcb21.pts 03001627/expert_verified/points_label/40e5d8e71ee3902a31358207d42bcb21.seg 03001627 +03636649/points/68491d576b5d35aade8e7376ce4e111f.pts 03636649/expert_verified/points_label/68491d576b5d35aade8e7376ce4e111f.seg 03636649 +03467517/points/80aa2f0d66100844925eded29d6897b9.pts 03467517/expert_verified/points_label/80aa2f0d66100844925eded29d6897b9.seg 03467517 +03001627/points/7929676e756dcd41577b5d737869717e.pts 03001627/expert_verified/points_label/7929676e756dcd41577b5d737869717e.seg 03001627 +03001627/points/2cf7ccf97b09187fcb7547c95fbdff26.pts 03001627/expert_verified/points_label/2cf7ccf97b09187fcb7547c95fbdff26.seg 03001627 +02691156/points/e8409b544c626028a9b2becd26dc2fc1.pts 02691156/expert_verified/points_label/e8409b544c626028a9b2becd26dc2fc1.seg 02691156 +02691156/points/1e2de00cf19a0a33554ccf8c30febe7.pts 02691156/expert_verified/points_label/1e2de00cf19a0a33554ccf8c30febe7.seg 02691156 +02691156/points/8f40518bd30467151e5ae32cb9e3711f.pts 02691156/expert_verified/points_label/8f40518bd30467151e5ae32cb9e3711f.seg 02691156 +02958343/points/4f0147c8a158087a4c19dab9f2c7c52d.pts 02958343/expert_verified/points_label/4f0147c8a158087a4c19dab9f2c7c52d.seg 02958343 +03624134/points/954fb0819736737a1b9c8e2fdbfc1118.pts 03624134/expert_verified/points_label/954fb0819736737a1b9c8e2fdbfc1118.seg 03624134 +04379243/points/415a08a66b8527519f803a8da27dd9a9.pts 04379243/expert_verified/points_label/415a08a66b8527519f803a8da27dd9a9.seg 04379243 +03001627/points/4bdbecfbc925219157915a20ae9ec6b6.pts 03001627/expert_verified/points_label/4bdbecfbc925219157915a20ae9ec6b6.seg 03001627 +03624134/points/2f74196bd5cb462727c767f081f1365a.pts 03624134/expert_verified/points_label/2f74196bd5cb462727c767f081f1365a.seg 03624134 +02958343/points/b5b6b09711cbee6daa44bfa127abe4bb.pts 02958343/expert_verified/points_label/b5b6b09711cbee6daa44bfa127abe4bb.seg 02958343 +03001627/points/43e74f15a986eb626a90f735365ac29e.pts 03001627/expert_verified/points_label/43e74f15a986eb626a90f735365ac29e.seg 03001627 +03624134/points/385bb539629cd6991dd89e5fcd05911a.pts 03624134/expert_verified/points_label/385bb539629cd6991dd89e5fcd05911a.seg 03624134 +03642806/points/fdec2b8af5dd988cef56c22fd326c67.pts 03642806/expert_verified/points_label/fdec2b8af5dd988cef56c22fd326c67.seg 03642806 +02958343/points/244a8476648bd073834daea73aa18748.pts 02958343/expert_verified/points_label/244a8476648bd073834daea73aa18748.seg 02958343 +03467517/points/d91b0745e57f6508dc6782957fd2f5d2.pts 03467517/expert_verified/points_label/d91b0745e57f6508dc6782957fd2f5d2.seg 03467517 +04379243/points/83f1ff21744e71ad2690c0a5b39562ad.pts 04379243/expert_verified/points_label/83f1ff21744e71ad2690c0a5b39562ad.seg 04379243 +03001627/points/49aa713bec70ee1f1104b8f54582c707.pts 03001627/expert_verified/points_label/49aa713bec70ee1f1104b8f54582c707.seg 03001627 +03001627/points/9231ef07326eae09b04cb542e2c50eb4.pts 03001627/expert_verified/points_label/9231ef07326eae09b04cb542e2c50eb4.seg 03001627 +03642806/points/b211cfb105e9f97e6436916a86a90ed7.pts 03642806/expert_verified/points_label/b211cfb105e9f97e6436916a86a90ed7.seg 03642806 +03001627/points/fdfedb5bb8cd35374233148ffd345970.pts 03001627/expert_verified/points_label/fdfedb5bb8cd35374233148ffd345970.seg 03001627 +04379243/points/3037fac5bc67207e23fa92d98173c06f.pts 04379243/expert_verified/points_label/3037fac5bc67207e23fa92d98173c06f.seg 04379243 +04379243/points/40d0dd3fe786e120d75c27ddd792e41a.pts 04379243/expert_verified/points_label/40d0dd3fe786e120d75c27ddd792e41a.seg 04379243 +03001627/points/e6ea5e70c2f29d881e8fd793667dc14f.pts 03001627/expert_verified/points_label/e6ea5e70c2f29d881e8fd793667dc14f.seg 03001627 +04379243/points/9502eecc3a057115b129901f80d24b7b.pts 04379243/expert_verified/points_label/9502eecc3a057115b129901f80d24b7b.seg 04379243 +03001627/points/e68bb6f55e2454fac7f1f7c0570e288d.pts 03001627/expert_verified/points_label/e68bb6f55e2454fac7f1f7c0570e288d.seg 03001627 +02691156/points/9bd8d0fa75bc21c5e3375a6b96a1d765.pts 02691156/expert_verified/points_label/9bd8d0fa75bc21c5e3375a6b96a1d765.seg 02691156 +02958343/points/1714b6e57c8c4983fb1aad5dae793ff4.pts 02958343/expert_verified/points_label/1714b6e57c8c4983fb1aad5dae793ff4.seg 02958343 +02691156/points/8a84a26158da1db7668586dcfb752ad.pts 02691156/expert_verified/points_label/8a84a26158da1db7668586dcfb752ad.seg 02691156 +02691156/points/36d8c865f766e3e097872638b21438e3.pts 02691156/expert_verified/points_label/36d8c865f766e3e097872638b21438e3.seg 02691156 +03001627/points/96e8a51b1680b756e99481ddc3bbddfb.pts 03001627/expert_verified/points_label/96e8a51b1680b756e99481ddc3bbddfb.seg 03001627 +02958343/points/37ad66d0433beb633df8f4ac45647158.pts 02958343/expert_verified/points_label/37ad66d0433beb633df8f4ac45647158.seg 02958343 +04379243/points/56a57ef7c3385c9f2f38c0d2792fb5e.pts 04379243/expert_verified/points_label/56a57ef7c3385c9f2f38c0d2792fb5e.seg 04379243 +03467517/points/dbdf45cab0adbded1f260c1b356c52ce.pts 03467517/expert_verified/points_label/dbdf45cab0adbded1f260c1b356c52ce.seg 03467517 +04379243/points/868bab5194e93577858699aaad4acee4.pts 04379243/expert_verified/points_label/868bab5194e93577858699aaad4acee4.seg 04379243 +04379243/points/2bbd62449b56abee659dda512294c744.pts 04379243/expert_verified/points_label/2bbd62449b56abee659dda512294c744.seg 04379243 +04379243/points/a18aa2d20d516333daf1f22b6daf05ed.pts 04379243/expert_verified/points_label/a18aa2d20d516333daf1f22b6daf05ed.seg 04379243 +03636649/points/7a2362fbddbee9a4d197f67767b32741.pts 03636649/expert_verified/points_label/7a2362fbddbee9a4d197f67767b32741.seg 03636649 +03636649/points/f9259d31df38bd5decd204cd7180226d.pts 03636649/expert_verified/points_label/f9259d31df38bd5decd204cd7180226d.seg 03636649 +04379243/points/54e85b248576c4eb57cd80d4b17e7e11.pts 04379243/expert_verified/points_label/54e85b248576c4eb57cd80d4b17e7e11.seg 04379243 +04379243/points/1299579419252fa954b02959579aa6bb.pts 04379243/expert_verified/points_label/1299579419252fa954b02959579aa6bb.seg 04379243 +04379243/points/49ad167497a2af8c9672e39f89e4622e.pts 04379243/expert_verified/points_label/49ad167497a2af8c9672e39f89e4622e.seg 04379243 +04379243/points/55221b101eec29dc656a19d1d18fdbac.pts 04379243/expert_verified/points_label/55221b101eec29dc656a19d1d18fdbac.seg 04379243 +04379243/points/e8870f3190f6b8d4bd1025bd755a15aa.pts 04379243/expert_verified/points_label/e8870f3190f6b8d4bd1025bd755a15aa.seg 04379243 +02691156/points/9818f0b88fed05b24b0a1bcf2fb497ec.pts 02691156/expert_verified/points_label/9818f0b88fed05b24b0a1bcf2fb497ec.seg 02691156 +02691156/points/9ba460913d86466f62347b4731688b0f.pts 02691156/expert_verified/points_label/9ba460913d86466f62347b4731688b0f.seg 02691156 +04379243/points/574447022c4473d455f46d55537192b6.pts 04379243/expert_verified/points_label/574447022c4473d455f46d55537192b6.seg 04379243 +04379243/points/7b5b7bfa8580e913e2580b23e60e4674.pts 04379243/expert_verified/points_label/7b5b7bfa8580e913e2580b23e60e4674.seg 04379243 +04225987/points/48f26ddc704fec2f379c6a1d59ef7283.pts 04225987/expert_verified/points_label/48f26ddc704fec2f379c6a1d59ef7283.seg 04225987 +04379243/points/b7821e69687d767aab610b0c94236463.pts 04379243/expert_verified/points_label/b7821e69687d767aab610b0c94236463.seg 04379243 +02691156/points/e42443669339a6c1a5a118bd15e6e34f.pts 02691156/expert_verified/points_label/e42443669339a6c1a5a118bd15e6e34f.seg 02691156 +04379243/points/2444551d00693a0fab610b0c94236463.pts 04379243/expert_verified/points_label/2444551d00693a0fab610b0c94236463.seg 04379243 +03467517/points/5e452914684ea7fc398707f20de9db08.pts 03467517/expert_verified/points_label/5e452914684ea7fc398707f20de9db08.seg 03467517 +03001627/points/cc6840207c0cf55db30e42459dcb06f.pts 03001627/expert_verified/points_label/cc6840207c0cf55db30e42459dcb06f.seg 03001627 +04379243/points/9046b2e610065fe5a5d95e73eecd308a.pts 04379243/expert_verified/points_label/9046b2e610065fe5a5d95e73eecd308a.seg 04379243 +03467517/points/c651a91562b86ed8edb9371445f615ae.pts 03467517/expert_verified/points_label/c651a91562b86ed8edb9371445f615ae.seg 03467517 +03001627/points/9bb6d3d76d4f5ba94b3c42e318f3affc.pts 03001627/expert_verified/points_label/9bb6d3d76d4f5ba94b3c42e318f3affc.seg 03001627 +03001627/points/7fb336186da77367962800be79c6e52.pts 03001627/expert_verified/points_label/7fb336186da77367962800be79c6e52.seg 03001627 +04379243/points/b69b2ff85d0ec661d8f9dd7647048a0c.pts 04379243/expert_verified/points_label/b69b2ff85d0ec661d8f9dd7647048a0c.seg 04379243 +03001627/points/d2815e678f173616e6cfc789522bfbab.pts 03001627/expert_verified/points_label/d2815e678f173616e6cfc789522bfbab.seg 03001627 +03636649/points/b8350fcf08ff0b2ca950bf8f33cff658.pts 03636649/expert_verified/points_label/b8350fcf08ff0b2ca950bf8f33cff658.seg 03636649 +04379243/points/202e7b5c3ec079e299e8bf807e902261.pts 04379243/expert_verified/points_label/202e7b5c3ec079e299e8bf807e902261.seg 04379243 +03001627/points/c8938f54fecab41e77cd061c90fcdb44.pts 03001627/expert_verified/points_label/c8938f54fecab41e77cd061c90fcdb44.seg 03001627 +04379243/points/894e095c7036c8411933ffef19678834.pts 04379243/expert_verified/points_label/894e095c7036c8411933ffef19678834.seg 04379243 +03001627/points/4362e715455f42ba9b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/4362e715455f42ba9b9f2eb77f5e247e.seg 03001627 +04379243/points/8963760f8bec0fee7f807d3c406ee.pts 04379243/expert_verified/points_label/8963760f8bec0fee7f807d3c406ee.seg 04379243 +03948459/points/4acb6494e3aaeb39998978df244b5bd.pts 03948459/expert_verified/points_label/4acb6494e3aaeb39998978df244b5bd.seg 03948459 +03636649/points/c1b939cc403a0662664b3b9b23ddfcbc.pts 03636649/expert_verified/points_label/c1b939cc403a0662664b3b9b23ddfcbc.seg 03636649 +04379243/points/e64876f5590e6fb7c3bd24f986301745.pts 04379243/expert_verified/points_label/e64876f5590e6fb7c3bd24f986301745.seg 04379243 +02691156/points/b8ce3803485b620b2c674305897e1782.pts 02691156/expert_verified/points_label/b8ce3803485b620b2c674305897e1782.seg 02691156 +03636649/points/a60c6cf7d4893f2ba26bf7a8fd4719ad.pts 03636649/expert_verified/points_label/a60c6cf7d4893f2ba26bf7a8fd4719ad.seg 03636649 +04379243/points/6ca66a443e651c1423500a5b036df62e.pts 04379243/expert_verified/points_label/6ca66a443e651c1423500a5b036df62e.seg 04379243 +04379243/points/51930b149cf6125373fa072a624ce947.pts 04379243/expert_verified/points_label/51930b149cf6125373fa072a624ce947.seg 04379243 +02691156/points/eb658ff31f0becea1d0f8853f6d023e3.pts 02691156/expert_verified/points_label/eb658ff31f0becea1d0f8853f6d023e3.seg 02691156 +03642806/points/3f45cde6f7a13138e256fb3794905772.pts 03642806/expert_verified/points_label/3f45cde6f7a13138e256fb3794905772.seg 03642806 +03001627/points/ea572cc193b804399c66df0f068d2a36.pts 03001627/expert_verified/points_label/ea572cc193b804399c66df0f068d2a36.seg 03001627 +03001627/points/9e0a0ad80be6df7789d2595edb5088ee.pts 03001627/expert_verified/points_label/9e0a0ad80be6df7789d2595edb5088ee.seg 03001627 +04379243/points/8eed35fd5b777acf58316b27df6c8e87.pts 04379243/expert_verified/points_label/8eed35fd5b777acf58316b27df6c8e87.seg 04379243 +03642806/points/5baaa726f51cd09b507f3bf1d3472684.pts 03642806/expert_verified/points_label/5baaa726f51cd09b507f3bf1d3472684.seg 03642806 +02691156/points/789f032dccc6092977b7d0d4764c121d.pts 02691156/expert_verified/points_label/789f032dccc6092977b7d0d4764c121d.seg 02691156 +03001627/points/9682d28e03acd2e3735013f3db728e20.pts 03001627/expert_verified/points_label/9682d28e03acd2e3735013f3db728e20.seg 03001627 +02958343/points/b50f9931670e25ef44ccce632b473b8c.pts 02958343/expert_verified/points_label/b50f9931670e25ef44ccce632b473b8c.seg 02958343 +03467517/points/d3972d599036251369da8e7f9a803d12.pts 03467517/expert_verified/points_label/d3972d599036251369da8e7f9a803d12.seg 03467517 +02691156/points/329987191cce68bfe64acd170567d820.pts 02691156/expert_verified/points_label/329987191cce68bfe64acd170567d820.seg 02691156 +03636649/points/ab3e153cd23e992b576a354bb9319732.pts 03636649/expert_verified/points_label/ab3e153cd23e992b576a354bb9319732.seg 03636649 +04379243/points/f850a69b0d308fbc19fb4103277a6b93.pts 04379243/expert_verified/points_label/f850a69b0d308fbc19fb4103277a6b93.seg 04379243 +04379243/points/1645b28322131b6258c407efcf93be6b.pts 04379243/expert_verified/points_label/1645b28322131b6258c407efcf93be6b.seg 04379243 +03001627/points/195464ae11f6bfe1cba091e036bf65ed.pts 03001627/expert_verified/points_label/195464ae11f6bfe1cba091e036bf65ed.seg 03001627 +02691156/points/edd9583988b62c90328f15e6c60d0e90.pts 02691156/expert_verified/points_label/edd9583988b62c90328f15e6c60d0e90.seg 02691156 +04225987/points/36aaae334d636ec28043db94fbc8c982.pts 04225987/expert_verified/points_label/36aaae334d636ec28043db94fbc8c982.seg 04225987 +04379243/points/c3c467718eb9b2a313f96345312df593.pts 04379243/expert_verified/points_label/c3c467718eb9b2a313f96345312df593.seg 04379243 +02691156/points/a1848a4a69b14704ca8607f540cc62ba.pts 02691156/expert_verified/points_label/a1848a4a69b14704ca8607f540cc62ba.seg 02691156 +02958343/points/c8bd4d0ac34266ffaaa232d0915adae9.pts 02958343/expert_verified/points_label/c8bd4d0ac34266ffaaa232d0915adae9.seg 02958343 +04379243/points/ad61a5bc7cba29b88cc413950b617e8f.pts 04379243/expert_verified/points_label/ad61a5bc7cba29b88cc413950b617e8f.seg 04379243 +03642806/points/466ea85bb4653ba3a715ae636b111d77.pts 03642806/expert_verified/points_label/466ea85bb4653ba3a715ae636b111d77.seg 03642806 +03001627/points/e93714e5553f63619215045784774049.pts 03001627/expert_verified/points_label/e93714e5553f63619215045784774049.seg 03001627 +03636649/points/b88c9a7aaab268fb42b08fbc749346d6.pts 03636649/expert_verified/points_label/b88c9a7aaab268fb42b08fbc749346d6.seg 03636649 +03636649/points/6ba931adfa36c7965208aab875b932bc.pts 03636649/expert_verified/points_label/6ba931adfa36c7965208aab875b932bc.seg 03636649 +03001627/points/e3479f55f5894bb3c7f1f7c0570e288d.pts 03001627/expert_verified/points_label/e3479f55f5894bb3c7f1f7c0570e288d.seg 03001627 +03467517/points/4c5288cc18896f8f352e5d4d2615db5b.pts 03467517/expert_verified/points_label/4c5288cc18896f8f352e5d4d2615db5b.seg 03467517 +03001627/points/631e102e9a689339b0ec386df15ab64f.pts 03001627/expert_verified/points_label/631e102e9a689339b0ec386df15ab64f.seg 03001627 +04379243/points/6daed91ae491c9cbe22ea6d770699e4b.pts 04379243/expert_verified/points_label/6daed91ae491c9cbe22ea6d770699e4b.seg 04379243 +03001627/points/40e73a326cf95d0361c93c4994c91bd1.pts 03001627/expert_verified/points_label/40e73a326cf95d0361c93c4994c91bd1.seg 03001627 +03467517/points/dc7708c870000008a24eeca91f583600.pts 03467517/expert_verified/points_label/dc7708c870000008a24eeca91f583600.seg 03467517 +03001627/points/1ac6531a337de85f2f7628d6bf38bcc4.pts 03001627/expert_verified/points_label/1ac6531a337de85f2f7628d6bf38bcc4.seg 03001627 +04379243/points/5191d64e9a1b9664bfdcc70dcc16baa1.pts 04379243/expert_verified/points_label/5191d64e9a1b9664bfdcc70dcc16baa1.seg 04379243 +03636649/points/c4dc0ac169c91ff29f8c3d2002c77ddb.pts 03636649/expert_verified/points_label/c4dc0ac169c91ff29f8c3d2002c77ddb.seg 03636649 +03624134/points/b8648ae17fb9937949f73a97204d432b.pts 03624134/expert_verified/points_label/b8648ae17fb9937949f73a97204d432b.seg 03624134 +04379243/points/a465210c23b0136d7afee304cce81d6f.pts 04379243/expert_verified/points_label/a465210c23b0136d7afee304cce81d6f.seg 04379243 +03001627/points/513686d6d63a1d8e577b5d737869717e.pts 03001627/expert_verified/points_label/513686d6d63a1d8e577b5d737869717e.seg 03001627 +03624134/points/bee1a473472639e25ca3862a7efa6401.pts 03624134/expert_verified/points_label/bee1a473472639e25ca3862a7efa6401.seg 03624134 +02691156/points/adb3ea03d7b954255e9e2656aff7dd5b.pts 02691156/expert_verified/points_label/adb3ea03d7b954255e9e2656aff7dd5b.seg 02691156 +02691156/points/959f28c6724979ef9a6e43b878d5b335.pts 02691156/expert_verified/points_label/959f28c6724979ef9a6e43b878d5b335.seg 02691156 +04379243/points/dec1d2cf8a4563d36cb02543e4df83bf.pts 04379243/expert_verified/points_label/dec1d2cf8a4563d36cb02543e4df83bf.seg 04379243 +03790512/points/a9c432d1dc4034762a45a87054fa7272.pts 03790512/expert_verified/points_label/a9c432d1dc4034762a45a87054fa7272.seg 03790512 +03001627/points/1b5e876f3559c231532a8e162f399205.pts 03001627/expert_verified/points_label/1b5e876f3559c231532a8e162f399205.seg 03001627 +04379243/points/82e5309809e455d5f15fed2243deb166.pts 04379243/expert_verified/points_label/82e5309809e455d5f15fed2243deb166.seg 04379243 +03467517/points/8f1f54d337bf6ccac782e6226a4f593e.pts 03467517/expert_verified/points_label/8f1f54d337bf6ccac782e6226a4f593e.seg 03467517 +04379243/points/67d97102f9c54cc95512673aa47c7e3d.pts 04379243/expert_verified/points_label/67d97102f9c54cc95512673aa47c7e3d.seg 04379243 +02691156/points/e0cc4f538a8da2d65d3bbd70fc7759b7.pts 02691156/expert_verified/points_label/e0cc4f538a8da2d65d3bbd70fc7759b7.seg 02691156 +04379243/points/d0008b042256fb5f7ab911835312d4f1.pts 04379243/expert_verified/points_label/d0008b042256fb5f7ab911835312d4f1.seg 04379243 +03467517/points/44c05e219618a6395b3335548350bdee.pts 03467517/expert_verified/points_label/44c05e219618a6395b3335548350bdee.seg 03467517 +03001627/points/3f7808c221b01668b4d174e5c61f344.pts 03001627/expert_verified/points_label/3f7808c221b01668b4d174e5c61f344.seg 03001627 +03467517/points/51abcb617b2faf3a24eeca91f583600.pts 03467517/expert_verified/points_label/51abcb617b2faf3a24eeca91f583600.seg 03467517 +03636649/points/f38370fc4c112017a6e7138fdd58748.pts 03636649/expert_verified/points_label/f38370fc4c112017a6e7138fdd58748.seg 03636649 +03001627/points/37607ea19e352af4fffc97a61124b1a9.pts 03001627/expert_verified/points_label/37607ea19e352af4fffc97a61124b1a9.seg 03001627 +02958343/points/2cb6de89f5b6e702b626f6a649199824.pts 02958343/expert_verified/points_label/2cb6de89f5b6e702b626f6a649199824.seg 02958343 +04099429/points/d781243cc1d1d2e91a0ec553feb1c2c3.pts 04099429/expert_verified/points_label/d781243cc1d1d2e91a0ec553feb1c2c3.seg 04099429 +04379243/points/900afcc9f0f5fbfd858699aaad4acee4.pts 04379243/expert_verified/points_label/900afcc9f0f5fbfd858699aaad4acee4.seg 04379243 +03001627/points/d13eb19745344ae5fb0eb7e753c06942.pts 03001627/expert_verified/points_label/d13eb19745344ae5fb0eb7e753c06942.seg 03001627 +02958343/points/5785192c95cdd67b704715417c0f83c1.pts 02958343/expert_verified/points_label/5785192c95cdd67b704715417c0f83c1.seg 02958343 +03001627/points/5bb5b15807158f71504721639e19f609.pts 03001627/expert_verified/points_label/5bb5b15807158f71504721639e19f609.seg 03001627 +03636649/points/ba05f660341b7b7b70be09f44cb2fef5.pts 03636649/expert_verified/points_label/ba05f660341b7b7b70be09f44cb2fef5.seg 03636649 +02691156/points/97066012fbca5983c74417871493eae8.pts 02691156/expert_verified/points_label/97066012fbca5983c74417871493eae8.seg 02691156 +03001627/points/4499729e53c858ae71a782a4379556c7.pts 03001627/expert_verified/points_label/4499729e53c858ae71a782a4379556c7.seg 03001627 +04379243/points/41d280b7db61ebddfebad4f49b26ec52.pts 04379243/expert_verified/points_label/41d280b7db61ebddfebad4f49b26ec52.seg 04379243 +02773838/points/30bf69aa24dbb3fc9de193e488fc4dce.pts 02773838/expert_verified/points_label/30bf69aa24dbb3fc9de193e488fc4dce.seg 02773838 +03467517/points/6c9a9c0e2af9d5b35f713e773d664ec2.pts 03467517/expert_verified/points_label/6c9a9c0e2af9d5b35f713e773d664ec2.seg 03467517 +04379243/points/f979c7a650d29ea819fb4103277a6b93.pts 04379243/expert_verified/points_label/f979c7a650d29ea819fb4103277a6b93.seg 04379243 +03001627/points/b631b78c2dcc748cba5342d638d0c267.pts 03001627/expert_verified/points_label/b631b78c2dcc748cba5342d638d0c267.seg 03001627 +03467517/points/d2ad57f36e00c602baba3b7560fe62f4.pts 03467517/expert_verified/points_label/d2ad57f36e00c602baba3b7560fe62f4.seg 03467517 +04379243/points/5771d5a3084b3ca3a2d7b309863cb1b.pts 04379243/expert_verified/points_label/5771d5a3084b3ca3a2d7b309863cb1b.seg 04379243 +03636649/points/2d638c6b6b2feb9248da169d95204ce2.pts 03636649/expert_verified/points_label/2d638c6b6b2feb9248da169d95204ce2.seg 03636649 +02958343/points/63a4e46bbbd855fc2b63d3b2a8c4e8b.pts 02958343/expert_verified/points_label/63a4e46bbbd855fc2b63d3b2a8c4e8b.seg 02958343 +04379243/points/8c67fd5a15e8d9defebad4f49b26ec52.pts 04379243/expert_verified/points_label/8c67fd5a15e8d9defebad4f49b26ec52.seg 04379243 +03467517/points/28c3903b29f6b38363e148e250c0340d.pts 03467517/expert_verified/points_label/28c3903b29f6b38363e148e250c0340d.seg 03467517 +04379243/points/ab2967188299bea54cb0654f4cfa9684.pts 04379243/expert_verified/points_label/ab2967188299bea54cb0654f4cfa9684.seg 04379243 +02691156/points/a9a7f21271b3efbaf446f92b52bbd82a.pts 02691156/expert_verified/points_label/a9a7f21271b3efbaf446f92b52bbd82a.seg 02691156 +04379243/points/c3e43144fd61c56f19fb4103277a6b93.pts 04379243/expert_verified/points_label/c3e43144fd61c56f19fb4103277a6b93.seg 04379243 +03001627/points/7fcde5fc8e023dd2a6fee8e2140acec9.pts 03001627/expert_verified/points_label/7fcde5fc8e023dd2a6fee8e2140acec9.seg 03001627 +03790512/points/70d9cc5115bfedeeab548456bc75847f.pts 03790512/expert_verified/points_label/70d9cc5115bfedeeab548456bc75847f.seg 03790512 +03001627/points/3c0dd3719baecf3319fb4103277a6b93.pts 03001627/expert_verified/points_label/3c0dd3719baecf3319fb4103277a6b93.seg 03001627 +03636649/points/55077c2175d97b8889ab11a408196888.pts 03636649/expert_verified/points_label/55077c2175d97b8889ab11a408196888.seg 03636649 +04379243/points/71fc8c7cdb48978282fa4d4f2c19b2ce.pts 04379243/expert_verified/points_label/71fc8c7cdb48978282fa4d4f2c19b2ce.seg 04379243 +04379243/points/f0d5eefef970fa4b9f2349486c570dd4.pts 04379243/expert_verified/points_label/f0d5eefef970fa4b9f2349486c570dd4.seg 04379243 +03642806/points/90c01fd78513bb99c9b20aa1b8066c46.pts 03642806/expert_verified/points_label/90c01fd78513bb99c9b20aa1b8066c46.seg 03642806 +04379243/points/ca6c07357ba5125b8e2adb29857f8a1.pts 04379243/expert_verified/points_label/ca6c07357ba5125b8e2adb29857f8a1.seg 04379243 +04379243/points/634bcd3197e337aafe4e4de1adda2150.pts 04379243/expert_verified/points_label/634bcd3197e337aafe4e4de1adda2150.seg 04379243 +04379243/points/7b411de42d4960eb6e25f3efedf6785f.pts 04379243/expert_verified/points_label/7b411de42d4960eb6e25f3efedf6785f.seg 04379243 +04379243/points/878414eb6e86494d9a8ef44e1d2c5b75.pts 04379243/expert_verified/points_label/878414eb6e86494d9a8ef44e1d2c5b75.seg 04379243 +03001627/points/f3fa7bd00b76f6a87a8a6b9421844d96.pts 03001627/expert_verified/points_label/f3fa7bd00b76f6a87a8a6b9421844d96.seg 03001627 +03467517/points/a2c1ee6a7ddb50a493f0194265a9746c.pts 03467517/expert_verified/points_label/a2c1ee6a7ddb50a493f0194265a9746c.seg 03467517 +04379243/points/25bc205f6de491f4ccde40b1205ec7ff.pts 04379243/expert_verified/points_label/25bc205f6de491f4ccde40b1205ec7ff.seg 04379243 +03636649/points/771d4def2e44bc169eb34048e600e1ea.pts 03636649/expert_verified/points_label/771d4def2e44bc169eb34048e600e1ea.seg 03636649 +03624134/points/6ebe2a22b8d9d70862a95b942081dfee.pts 03624134/expert_verified/points_label/6ebe2a22b8d9d70862a95b942081dfee.seg 03624134 +02691156/points/9b1fc3881a5335cb44012f72ba1e15a8.pts 02691156/expert_verified/points_label/9b1fc3881a5335cb44012f72ba1e15a8.seg 02691156 +03001627/points/3dc252fd90d82b18c9be65dfbd21428b.pts 03001627/expert_verified/points_label/3dc252fd90d82b18c9be65dfbd21428b.seg 03001627 +04379243/points/f6f180c3e72caacb5077539b37310c29.pts 04379243/expert_verified/points_label/f6f180c3e72caacb5077539b37310c29.seg 04379243 +03642806/points/25bc168b214b54799e28e9cf32e5157.pts 03642806/expert_verified/points_label/25bc168b214b54799e28e9cf32e5157.seg 03642806 +04379243/points/ac9fae8af57729945eee45c00c4de9d3.pts 04379243/expert_verified/points_label/ac9fae8af57729945eee45c00c4de9d3.seg 04379243 +03001627/points/e8126f9e2d106620d2f33aaf794b5932.pts 03001627/expert_verified/points_label/e8126f9e2d106620d2f33aaf794b5932.seg 03001627 +03624134/points/3dc5a6d79ed591bda709dec9a148b2fe.pts 03624134/expert_verified/points_label/3dc5a6d79ed591bda709dec9a148b2fe.seg 03624134 +04379243/points/8f73278956fecb80327289c00b6dc9ca.pts 04379243/expert_verified/points_label/8f73278956fecb80327289c00b6dc9ca.seg 04379243 +03948459/points/5f46578efd2c65e5d4ac2f5fcaa742ac.pts 03948459/expert_verified/points_label/5f46578efd2c65e5d4ac2f5fcaa742ac.seg 03948459 +03624134/points/a05ea45d396c86784e52b614e584a543.pts 03624134/expert_verified/points_label/a05ea45d396c86784e52b614e584a543.seg 03624134 +03001627/points/cd939609247df917d9d3572bbd9cf789.pts 03001627/expert_verified/points_label/cd939609247df917d9d3572bbd9cf789.seg 03001627 +03261776/points/17c9866b42ae1831df4cfe396cee719e.pts 03261776/expert_verified/points_label/17c9866b42ae1831df4cfe396cee719e.seg 03261776 +03797390/points/3d3e993f7baa4d7ef1ff24a8b1564a36.pts 03797390/expert_verified/points_label/3d3e993f7baa4d7ef1ff24a8b1564a36.seg 03797390 +03467517/points/36b49aff54f6d7e893f0194265a9746c.pts 03467517/expert_verified/points_label/36b49aff54f6d7e893f0194265a9746c.seg 03467517 +02691156/points/48df2496242053da4ee0fb6a51564c3.pts 02691156/expert_verified/points_label/48df2496242053da4ee0fb6a51564c3.seg 02691156 +04379243/points/7ad23def902ea4f37b7a2c2624e46d0a.pts 04379243/expert_verified/points_label/7ad23def902ea4f37b7a2c2624e46d0a.seg 04379243 +04379243/points/1a8fe5baa2d4b5f7ee84261b3d20656.pts 04379243/expert_verified/points_label/1a8fe5baa2d4b5f7ee84261b3d20656.seg 04379243 +03467517/points/d685415d4fcd3205a24eeca91f583600.pts 03467517/expert_verified/points_label/d685415d4fcd3205a24eeca91f583600.seg 03467517 +02958343/points/8e308d28d463427f43f0e92e826556b8.pts 02958343/expert_verified/points_label/8e308d28d463427f43f0e92e826556b8.seg 02958343 +04379243/points/dc68436ab1a576f6573d2c9ac4b23fdf.pts 04379243/expert_verified/points_label/dc68436ab1a576f6573d2c9ac4b23fdf.seg 04379243 +04379243/points/1a153612bcdab3e23cc149415a408229.pts 04379243/expert_verified/points_label/1a153612bcdab3e23cc149415a408229.seg 04379243 +03001627/points/19ce953da9aa8065d747a43c11e738e9.pts 03001627/expert_verified/points_label/19ce953da9aa8065d747a43c11e738e9.seg 03001627 +04379243/points/db2d4f781756e687d8864caa856253b.pts 04379243/expert_verified/points_label/db2d4f781756e687d8864caa856253b.seg 04379243 +04379243/points/d8f851bbc98dccc23fa92d98173c06f.pts 04379243/expert_verified/points_label/d8f851bbc98dccc23fa92d98173c06f.seg 04379243 +03467517/points/e585e31db7568c4cf0e1c0df18936d05.pts 03467517/expert_verified/points_label/e585e31db7568c4cf0e1c0df18936d05.seg 03467517 +03001627/points/98ac0106ad244505e04fc3fcc1c852e0.pts 03001627/expert_verified/points_label/98ac0106ad244505e04fc3fcc1c852e0.seg 03001627 +03001627/points/1b81441b7e597235d61420a53a0cb96d.pts 03001627/expert_verified/points_label/1b81441b7e597235d61420a53a0cb96d.seg 03001627 +03001627/points/918145be863f7aeaf050758b903e6054.pts 03001627/expert_verified/points_label/918145be863f7aeaf050758b903e6054.seg 03001627 +02691156/points/1af4b32eafffb0f7ee60c37cbf99c1c.pts 02691156/expert_verified/points_label/1af4b32eafffb0f7ee60c37cbf99c1c.seg 02691156 +03636649/points/f4e1a4032b1686cec35131da26f8061a.pts 03636649/expert_verified/points_label/f4e1a4032b1686cec35131da26f8061a.seg 03636649 +04379243/points/9c4dfafdbd7f9b76c955e5ed03ef3a2f.pts 04379243/expert_verified/points_label/9c4dfafdbd7f9b76c955e5ed03ef3a2f.seg 04379243 +02691156/points/80b8f4da6b77eb66d208f79049825a82.pts 02691156/expert_verified/points_label/80b8f4da6b77eb66d208f79049825a82.seg 02691156 +03642806/points/de2e95eac460c361e862e3cac45aa769.pts 03642806/expert_verified/points_label/de2e95eac460c361e862e3cac45aa769.seg 03642806 +04379243/points/e2571e4eba2d9f5eab610b0c94236463.pts 04379243/expert_verified/points_label/e2571e4eba2d9f5eab610b0c94236463.seg 04379243 +04379243/points/a0445e4888d56666b9d7c2fc41e80228.pts 04379243/expert_verified/points_label/a0445e4888d56666b9d7c2fc41e80228.seg 04379243 +03001627/points/873c017f35957717b56a13a4b2372aa4.pts 03001627/expert_verified/points_label/873c017f35957717b56a13a4b2372aa4.seg 03001627 +03001627/points/3af90da238ac4ddbf91663a74ccd2338.pts 03001627/expert_verified/points_label/3af90da238ac4ddbf91663a74ccd2338.seg 03001627 +02958343/points/9698be0fd3516f01fbeda5389ab05f5f.pts 02958343/expert_verified/points_label/9698be0fd3516f01fbeda5389ab05f5f.seg 02958343 +03790512/points/655b9dd9425cc3a12a45a87054fa7272.pts 03790512/expert_verified/points_label/655b9dd9425cc3a12a45a87054fa7272.seg 03790512 +04379243/points/ec1c92efffb9ee78beedb4c8fd29e2d1.pts 04379243/expert_verified/points_label/ec1c92efffb9ee78beedb4c8fd29e2d1.seg 04379243 +04379243/points/3b7fc97192e483ebb0bf045ee98272fc.pts 04379243/expert_verified/points_label/3b7fc97192e483ebb0bf045ee98272fc.seg 04379243 +03467517/points/8c3d3e69d03d3443e84e459fb01822f.pts 03467517/expert_verified/points_label/8c3d3e69d03d3443e84e459fb01822f.seg 03467517 +02691156/points/e0058b4948f87d3b87697d3904b168b.pts 02691156/expert_verified/points_label/e0058b4948f87d3b87697d3904b168b.seg 02691156 +03001627/points/4428b7dc4b6696812905b6e26038a78.pts 03001627/expert_verified/points_label/4428b7dc4b6696812905b6e26038a78.seg 03001627 +03636649/points/f7093dd024fd09fc7219d6d5c4afbaff.pts 03636649/expert_verified/points_label/f7093dd024fd09fc7219d6d5c4afbaff.seg 03636649 +04379243/points/7d0c5e28089c2b7bd99e852ee772dfa4.pts 04379243/expert_verified/points_label/7d0c5e28089c2b7bd99e852ee772dfa4.seg 04379243 +03636649/points/4916f793d87dd184d42b9650f19dd425.pts 03636649/expert_verified/points_label/4916f793d87dd184d42b9650f19dd425.seg 03636649 +04379243/points/1ffcbc064f473b7de7c13848b2d8f5ec.pts 04379243/expert_verified/points_label/1ffcbc064f473b7de7c13848b2d8f5ec.seg 04379243 +03636649/points/e180510d07b65fff571108a6d1e94edd.pts 03636649/expert_verified/points_label/e180510d07b65fff571108a6d1e94edd.seg 03636649 +03636649/points/d9f6bd064c9fd456fcb8d8c6d4df8143.pts 03636649/expert_verified/points_label/d9f6bd064c9fd456fcb8d8c6d4df8143.seg 03636649 +04379243/points/ec81c49ee12e8a70fd06de9ba37d44bd.pts 04379243/expert_verified/points_label/ec81c49ee12e8a70fd06de9ba37d44bd.seg 04379243 +03636649/points/4a868756ae6404a5c0bc57897eddf6f.pts 03636649/expert_verified/points_label/4a868756ae6404a5c0bc57897eddf6f.seg 03636649 +02958343/points/9c827e532de4967285089a13cc567dbd.pts 02958343/expert_verified/points_label/9c827e532de4967285089a13cc567dbd.seg 02958343 +03797390/points/1c9f9e25c654cbca3c71bf3f4dd78475.pts 03797390/expert_verified/points_label/1c9f9e25c654cbca3c71bf3f4dd78475.seg 03797390 +03001627/points/ca3670f77268f899febad4f49b26ec52.pts 03001627/expert_verified/points_label/ca3670f77268f899febad4f49b26ec52.seg 03001627 +04379243/points/9b8e6eb835f0c8bcf37af16b2893f1d4.pts 04379243/expert_verified/points_label/9b8e6eb835f0c8bcf37af16b2893f1d4.seg 04379243 +03001627/points/5c9d582488732ee0d7f7a4c4609b0913.pts 03001627/expert_verified/points_label/5c9d582488732ee0d7f7a4c4609b0913.seg 03001627 +04379243/points/684ccc0f629ee45cab610b0c94236463.pts 04379243/expert_verified/points_label/684ccc0f629ee45cab610b0c94236463.seg 04379243 +03001627/points/4913388a4c94547a81806e3880250dff.pts 03001627/expert_verified/points_label/4913388a4c94547a81806e3880250dff.seg 03001627 +03636649/points/73378b714c5bfed2b922d818b19db1e.pts 03636649/expert_verified/points_label/73378b714c5bfed2b922d818b19db1e.seg 03636649 +03001627/points/4a89a789f817ab5414038d588fd1342f.pts 03001627/expert_verified/points_label/4a89a789f817ab5414038d588fd1342f.seg 03001627 +04379243/points/df7761a3b4ac638c9eaceb124b71b7be.pts 04379243/expert_verified/points_label/df7761a3b4ac638c9eaceb124b71b7be.seg 04379243 +03001627/points/46557f689f4cf5dd2acd2bb6205825cb.pts 03001627/expert_verified/points_label/46557f689f4cf5dd2acd2bb6205825cb.seg 03001627 +04379243/points/2db1f557e247ded7e907b6d9dc1d71b7.pts 04379243/expert_verified/points_label/2db1f557e247ded7e907b6d9dc1d71b7.seg 04379243 +04379243/points/b69d9e876e7a80a29f2349486c570dd4.pts 04379243/expert_verified/points_label/b69d9e876e7a80a29f2349486c570dd4.seg 04379243 +04379243/points/a94ea7183f27073248c0c0980e363341.pts 04379243/expert_verified/points_label/a94ea7183f27073248c0c0980e363341.seg 04379243 +03636649/points/8f85c2195890ccf671f0940f5ed452dc.pts 03636649/expert_verified/points_label/8f85c2195890ccf671f0940f5ed452dc.seg 03636649 +02691156/points/cc80380c511ec8e2c91a9d486db717.pts 02691156/expert_verified/points_label/cc80380c511ec8e2c91a9d486db717.seg 02691156 +03642806/points/6b61ef17b4f45050b598e8984f11eb0c.pts 03642806/expert_verified/points_label/6b61ef17b4f45050b598e8984f11eb0c.seg 03642806 +04379243/points/d9ce0b512e0420f8be95ff480950e9ef.pts 04379243/expert_verified/points_label/d9ce0b512e0420f8be95ff480950e9ef.seg 04379243 +04379243/points/c27a1c6a26642c907ecc778b34d42f32.pts 04379243/expert_verified/points_label/c27a1c6a26642c907ecc778b34d42f32.seg 04379243 +04379243/points/debd06d3176a5b728cbb8bac2032149c.pts 04379243/expert_verified/points_label/debd06d3176a5b728cbb8bac2032149c.seg 04379243 +04099429/points/fa07813a89527d195d1df55cbe0874aa.pts 04099429/expert_verified/points_label/fa07813a89527d195d1df55cbe0874aa.seg 04099429 +03001627/points/2a98a638f675f46e7d44dc16af152638.pts 03001627/expert_verified/points_label/2a98a638f675f46e7d44dc16af152638.seg 03001627 +03624134/points/ec1eb959cc203f1de5a365227cfe63ec.pts 03624134/expert_verified/points_label/ec1eb959cc203f1de5a365227cfe63ec.seg 03624134 +04379243/points/db0c430a51ac45c19d2be74cfb51ade1.pts 04379243/expert_verified/points_label/db0c430a51ac45c19d2be74cfb51ade1.seg 04379243 +04379243/points/26b2a15646f6a3a06f1e07a56c129dfc.pts 04379243/expert_verified/points_label/26b2a15646f6a3a06f1e07a56c129dfc.seg 04379243 +04379243/points/90343e416528b576f41d9ea5f63b1b05.pts 04379243/expert_verified/points_label/90343e416528b576f41d9ea5f63b1b05.seg 04379243 +03001627/points/43d38ad2f5d103adf9b9977a2406713a.pts 03001627/expert_verified/points_label/43d38ad2f5d103adf9b9977a2406713a.seg 03001627 +03001627/points/e279758e8a5b6a8d492d9da2668ec34c.pts 03001627/expert_verified/points_label/e279758e8a5b6a8d492d9da2668ec34c.seg 03001627 +03642806/points/71907a4a567dce3bb0de1e7a6809fd90.pts 03642806/expert_verified/points_label/71907a4a567dce3bb0de1e7a6809fd90.seg 03642806 +03636649/points/2958cd9fd799bf02cfbcbf340cec6da1.pts 03636649/expert_verified/points_label/2958cd9fd799bf02cfbcbf340cec6da1.seg 03636649 +04379243/points/bd7c71ca15b0d4e56c252f74b6220e29.pts 04379243/expert_verified/points_label/bd7c71ca15b0d4e56c252f74b6220e29.seg 04379243 +04379243/points/51c6a7298408c3f19730cb37c9a5f63b.pts 04379243/expert_verified/points_label/51c6a7298408c3f19730cb37c9a5f63b.seg 04379243 +02691156/points/e3de366a0cfb59ed38294c37c250d7cd.pts 02691156/expert_verified/points_label/e3de366a0cfb59ed38294c37c250d7cd.seg 02691156 +03467517/points/f288cd2146b8f4c1f0e1c0df18936d05.pts 03467517/expert_verified/points_label/f288cd2146b8f4c1f0e1c0df18936d05.seg 03467517 +04379243/points/270430ab9efb9d85c0f947750540fb22.pts 04379243/expert_verified/points_label/270430ab9efb9d85c0f947750540fb22.seg 04379243 +04379243/points/f5ad10e6a938aa80e85c7a030ebdf69a.pts 04379243/expert_verified/points_label/f5ad10e6a938aa80e85c7a030ebdf69a.seg 04379243 +04379243/points/8343d98e3710f5bee1b32bbe69d5bc15.pts 04379243/expert_verified/points_label/8343d98e3710f5bee1b32bbe69d5bc15.seg 04379243 +03790512/points/40b7a63fd9ede0cf48272812609617e2.pts 03790512/expert_verified/points_label/40b7a63fd9ede0cf48272812609617e2.seg 03790512 +03467517/points/16bc13ee237ebeb38460585fe283a1c9.pts 03467517/expert_verified/points_label/16bc13ee237ebeb38460585fe283a1c9.seg 03467517 +02691156/points/a56143efe74ee89ebbf3143b1cb6076a.pts 02691156/expert_verified/points_label/a56143efe74ee89ebbf3143b1cb6076a.seg 02691156 +04379243/points/9a6ab25d91c92a5a35acfdef2ece21c0.pts 04379243/expert_verified/points_label/9a6ab25d91c92a5a35acfdef2ece21c0.seg 04379243 +03467517/points/c9b60abdc17708fb78ad94b294a9faa6.pts 03467517/expert_verified/points_label/c9b60abdc17708fb78ad94b294a9faa6.seg 03467517 +04379243/points/cde67434193a2a6f19fb4103277a6b93.pts 04379243/expert_verified/points_label/cde67434193a2a6f19fb4103277a6b93.seg 04379243 +04379243/points/6b62c85b16e300557005dacb6907e37d.pts 04379243/expert_verified/points_label/6b62c85b16e300557005dacb6907e37d.seg 04379243 +04379243/points/7956ac7aba6295d1c2fd07f66cbad0f7.pts 04379243/expert_verified/points_label/7956ac7aba6295d1c2fd07f66cbad0f7.seg 04379243 +04379243/points/dcda90e411cb4e35506d1e1cc84da713.pts 04379243/expert_verified/points_label/dcda90e411cb4e35506d1e1cc84da713.seg 04379243 +02691156/points/c494f446954523a8a32748a9f843a0bf.pts 02691156/expert_verified/points_label/c494f446954523a8a32748a9f843a0bf.seg 02691156 +02691156/points/18e6f319062ccb49ca8607f540cc62ba.pts 02691156/expert_verified/points_label/18e6f319062ccb49ca8607f540cc62ba.seg 02691156 +04379243/points/b7cead95e18b570d2c97486f63c12d76.pts 04379243/expert_verified/points_label/b7cead95e18b570d2c97486f63c12d76.seg 04379243 +03948459/points/f6d52684720d52a01ab78426351eea4a.pts 03948459/expert_verified/points_label/f6d52684720d52a01ab78426351eea4a.seg 03948459 +04379243/points/7eeceefed2b3aa2794f3bda96cf548cc.pts 04379243/expert_verified/points_label/7eeceefed2b3aa2794f3bda96cf548cc.seg 04379243 +03001627/points/5eaa2730f10054d0f6cabe1df6f4c9d9.pts 03001627/expert_verified/points_label/5eaa2730f10054d0f6cabe1df6f4c9d9.seg 03001627 +03001627/points/92f79b8e45269847f0efa341b439d741.pts 03001627/expert_verified/points_label/92f79b8e45269847f0efa341b439d741.seg 03001627 +03001627/points/cbaca6a6edfa2d512b520984c067934c.pts 03001627/expert_verified/points_label/cbaca6a6edfa2d512b520984c067934c.seg 03001627 +04379243/points/390e0db80fe12ef65fa6da97b9eb4a2f.pts 04379243/expert_verified/points_label/390e0db80fe12ef65fa6da97b9eb4a2f.seg 04379243 +04379243/points/2ec33e8b457ac0fa278d386bfa54545.pts 04379243/expert_verified/points_label/2ec33e8b457ac0fa278d386bfa54545.seg 04379243 +04225987/points/ac2b6924a60a7a87aa4f69d519551495.pts 04225987/expert_verified/points_label/ac2b6924a60a7a87aa4f69d519551495.seg 04225987 +02958343/points/468780ef4ace9a422e877e82c90c24d.pts 02958343/expert_verified/points_label/468780ef4ace9a422e877e82c90c24d.seg 02958343 +03001627/points/78c9204b2eac432b65b77a565916c7f.pts 03001627/expert_verified/points_label/78c9204b2eac432b65b77a565916c7f.seg 03001627 +04379243/points/b278b58e294a7d2bac242c3aebc81b2f.pts 04379243/expert_verified/points_label/b278b58e294a7d2bac242c3aebc81b2f.seg 04379243 +04379243/points/fc95d34ab1afb92b9118eee0b123125f.pts 04379243/expert_verified/points_label/fc95d34ab1afb92b9118eee0b123125f.seg 04379243 +03790512/points/54f016b47a5864cd5dde04c96fd8146.pts 03790512/expert_verified/points_label/54f016b47a5864cd5dde04c96fd8146.seg 03790512 +04379243/points/9afa121e3aec8bd7c387f328a37d8ece.pts 04379243/expert_verified/points_label/9afa121e3aec8bd7c387f328a37d8ece.seg 04379243 +04379243/points/382889dbc86b5dd919fb4103277a6b93.pts 04379243/expert_verified/points_label/382889dbc86b5dd919fb4103277a6b93.seg 04379243 +03467517/points/b83a81b2476ec59e59610f6f40382499.pts 03467517/expert_verified/points_label/b83a81b2476ec59e59610f6f40382499.seg 03467517 +03001627/points/5d959b0f79a22e8c67c9124d122355ab.pts 03001627/expert_verified/points_label/5d959b0f79a22e8c67c9124d122355ab.seg 03001627 +02691156/points/c4111dbb21e1f17043afdb9c81ff2967.pts 02691156/expert_verified/points_label/c4111dbb21e1f17043afdb9c81ff2967.seg 02691156 +02691156/points/46829981c5c25285bfc0a2c490b4c222.pts 02691156/expert_verified/points_label/46829981c5c25285bfc0a2c490b4c222.seg 02691156 +04379243/points/497659c4723fbc4fe90ff84c89de437.pts 04379243/expert_verified/points_label/497659c4723fbc4fe90ff84c89de437.seg 04379243 +02691156/points/a805c30d4b09f11f62347b4731688b0f.pts 02691156/expert_verified/points_label/a805c30d4b09f11f62347b4731688b0f.seg 02691156 +03636649/points/e485053f3e0d18252cd2160e449d45ae.pts 03636649/expert_verified/points_label/e485053f3e0d18252cd2160e449d45ae.seg 03636649 +02958343/points/2fb5fe84c28b8b35cc02882a83047172.pts 02958343/expert_verified/points_label/2fb5fe84c28b8b35cc02882a83047172.seg 02958343 +03636649/points/f7a4590c54e2ac7ce62fad6b4f42c880.pts 03636649/expert_verified/points_label/f7a4590c54e2ac7ce62fad6b4f42c880.seg 03636649 +03642806/points/9fc5b76d363ca64ed03066fc8168e9c6.pts 03642806/expert_verified/points_label/9fc5b76d363ca64ed03066fc8168e9c6.seg 03642806 +02691156/points/be080a797406422843afdb9c81ff2967.pts 02691156/expert_verified/points_label/be080a797406422843afdb9c81ff2967.seg 02691156 +04379243/points/81a84fcb2b247a3348eaa510713cb074.pts 04379243/expert_verified/points_label/81a84fcb2b247a3348eaa510713cb074.seg 04379243 +03001627/points/47c540c2e9c3483ce79a6b87656a120a.pts 03001627/expert_verified/points_label/47c540c2e9c3483ce79a6b87656a120a.seg 03001627 +03001627/points/5073d7a546b9a4d0e810eba61b778ebb.pts 03001627/expert_verified/points_label/5073d7a546b9a4d0e810eba61b778ebb.seg 03001627 +03001627/points/e4a890f2330ebd7e4a11872aa986426d.pts 03001627/expert_verified/points_label/e4a890f2330ebd7e4a11872aa986426d.seg 03001627 +03001627/points/a7200578bd7bea065dc3653f8341633a.pts 03001627/expert_verified/points_label/a7200578bd7bea065dc3653f8341633a.seg 03001627 +03467517/points/b004331ee5cc39caa24eeca91f583600.pts 03467517/expert_verified/points_label/b004331ee5cc39caa24eeca91f583600.seg 03467517 +04379243/points/f01768b8b8ba025ee45ef4135c266a12.pts 04379243/expert_verified/points_label/f01768b8b8ba025ee45ef4135c266a12.seg 04379243 +03642806/points/5173aa7f75ff3cf1b55fde51a411949f.pts 03642806/expert_verified/points_label/5173aa7f75ff3cf1b55fde51a411949f.seg 03642806 +03636649/points/e7e45a8f0b0ab311c754474f0ac106.pts 03636649/expert_verified/points_label/e7e45a8f0b0ab311c754474f0ac106.seg 03636649 +03642806/points/1b67b4bfed6688ba5b22feddf58c05e1.pts 03642806/expert_verified/points_label/1b67b4bfed6688ba5b22feddf58c05e1.seg 03642806 +03797390/points/f1e439307b834015770a0ff1161fa15a.pts 03797390/expert_verified/points_label/f1e439307b834015770a0ff1161fa15a.seg 03797390 +03001627/points/b6c9495629c00419940806ade53ef2f.pts 03001627/expert_verified/points_label/b6c9495629c00419940806ade53ef2f.seg 03001627 +03001627/points/8e19d2ec95c45186a6fd617b2ff5d2d.pts 03001627/expert_verified/points_label/8e19d2ec95c45186a6fd617b2ff5d2d.seg 03001627 +03001627/points/d7b8189fe69cebedc41b07b1627c4b43.pts 03001627/expert_verified/points_label/d7b8189fe69cebedc41b07b1627c4b43.seg 03001627 +02691156/points/a7a0e7eddf4ffb8c19378fd691582500.pts 02691156/expert_verified/points_label/a7a0e7eddf4ffb8c19378fd691582500.seg 02691156 +03001627/points/2b6cbad4ba1e9a0645881d7eab1353ba.pts 03001627/expert_verified/points_label/2b6cbad4ba1e9a0645881d7eab1353ba.seg 03001627 +04379243/points/dade0594e68e2250be6c545952e7fa4a.pts 04379243/expert_verified/points_label/dade0594e68e2250be6c545952e7fa4a.seg 04379243 +03001627/points/9850d225049f987e9b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/9850d225049f987e9b9f2eb77f5e247e.seg 03001627 +03948459/points/e9e6426605eb6d5952d52701459b1f0.pts 03948459/expert_verified/points_label/e9e6426605eb6d5952d52701459b1f0.seg 03948459 +03636649/points/e507bc77c03a1b3afcb8d8c6d4df8143.pts 03636649/expert_verified/points_label/e507bc77c03a1b3afcb8d8c6d4df8143.seg 03636649 +03797390/points/a6d9f9ae39728831808951ff5fb582ac.pts 03797390/expert_verified/points_label/a6d9f9ae39728831808951ff5fb582ac.seg 03797390 +04379243/points/3144ba0c286cc61f490ad276cd2af3a4.pts 04379243/expert_verified/points_label/3144ba0c286cc61f490ad276cd2af3a4.seg 04379243 +04379243/points/9be565678aab11cba0ab1d82ef09f78f.pts 04379243/expert_verified/points_label/9be565678aab11cba0ab1d82ef09f78f.seg 04379243 +04379243/points/a4b2870ce7a54b8eec11c6b035aac769.pts 04379243/expert_verified/points_label/a4b2870ce7a54b8eec11c6b035aac769.seg 04379243 +03636649/points/78b95abd1d1158ffef3a2c64cef919d0.pts 03636649/expert_verified/points_label/78b95abd1d1158ffef3a2c64cef919d0.seg 03636649 +04379243/points/2182028f013e7eb530bbd4cddd04c77b.pts 04379243/expert_verified/points_label/2182028f013e7eb530bbd4cddd04c77b.seg 04379243 +02691156/points/e00b89bc338348caa42c49797afd1f5c.pts 02691156/expert_verified/points_label/e00b89bc338348caa42c49797afd1f5c.seg 02691156 +03001627/points/9d28a066df22319cca2e16d6cd76503c.pts 03001627/expert_verified/points_label/9d28a066df22319cca2e16d6cd76503c.seg 03001627 +03636649/points/3c4d8c4ebe9dedbc2cd2160e449d45ae.pts 03636649/expert_verified/points_label/3c4d8c4ebe9dedbc2cd2160e449d45ae.seg 03636649 +02691156/points/97d662e5e6345b46bd46d022fd7d80aa.pts 02691156/expert_verified/points_label/97d662e5e6345b46bd46d022fd7d80aa.seg 02691156 +03001627/points/9dac39c51680daa2f71e06115e9c3b3e.pts 03001627/expert_verified/points_label/9dac39c51680daa2f71e06115e9c3b3e.seg 03001627 +03624134/points/1ecb37ea8f0c4abc20fc54d2500eb7f1.pts 03624134/expert_verified/points_label/1ecb37ea8f0c4abc20fc54d2500eb7f1.seg 03624134 +03624134/points/3a0f48139bfd3a4ea152d2e823b9fe06.pts 03624134/expert_verified/points_label/3a0f48139bfd3a4ea152d2e823b9fe06.seg 03624134 +04379243/points/1264d88ae599df3fbeedb4c8fd29e2d1.pts 04379243/expert_verified/points_label/1264d88ae599df3fbeedb4c8fd29e2d1.seg 04379243 +03001627/points/97bbc8970b05c4a3fcde6bcb709edd9a.pts 03001627/expert_verified/points_label/97bbc8970b05c4a3fcde6bcb709edd9a.seg 03001627 +03636649/points/1f58b59a1b6b06df766fc93a239bada0.pts 03636649/expert_verified/points_label/1f58b59a1b6b06df766fc93a239bada0.seg 03636649 +03001627/points/eb51e814c3f44a07914ced7dab3536b9.pts 03001627/expert_verified/points_label/eb51e814c3f44a07914ced7dab3536b9.seg 03001627 +03636649/points/a138582b1d0b9cbb137af984a9f45d65.pts 03636649/expert_verified/points_label/a138582b1d0b9cbb137af984a9f45d65.seg 03636649 +03790512/points/9f9de88a95b56660b37378f3c85478b4.pts 03790512/expert_verified/points_label/9f9de88a95b56660b37378f3c85478b4.seg 03790512 +03001627/points/a521fba02ca7f9aa822215026d1e8d82.pts 03001627/expert_verified/points_label/a521fba02ca7f9aa822215026d1e8d82.seg 03001627 +04225987/points/d303055e96cd59949da15808191f1405.pts 04225987/expert_verified/points_label/d303055e96cd59949da15808191f1405.seg 04225987 +04379243/points/7e3022a7bd00eb4195b8ea6a366e14d.pts 04379243/expert_verified/points_label/7e3022a7bd00eb4195b8ea6a366e14d.seg 04379243 +02691156/points/d83300deab42c100eb9db4e832a6dd82.pts 02691156/expert_verified/points_label/d83300deab42c100eb9db4e832a6dd82.seg 02691156 +03642806/points/a4b410734514306ac401e233323032d6.pts 03642806/expert_verified/points_label/a4b410734514306ac401e233323032d6.seg 03642806 +03790512/points/532e6f88a9975a27b37378f3c85478b4.pts 03790512/expert_verified/points_label/532e6f88a9975a27b37378f3c85478b4.seg 03790512 +03642806/points/cc691d9e8e189ce47a381a112bfd785.pts 03642806/expert_verified/points_label/cc691d9e8e189ce47a381a112bfd785.seg 03642806 +02691156/points/aa07239e9397cf189601fb40d0d298b9.pts 02691156/expert_verified/points_label/aa07239e9397cf189601fb40d0d298b9.seg 02691156 +03642806/points/cc0535a34cdc7d676bf98d15712168f.pts 03642806/expert_verified/points_label/cc0535a34cdc7d676bf98d15712168f.seg 03642806 +02691156/points/ddec69970cbc4d29112a90660b187a10.pts 02691156/expert_verified/points_label/ddec69970cbc4d29112a90660b187a10.seg 02691156 +04379243/points/268e68f1819a225c1b4b790955c17432.pts 04379243/expert_verified/points_label/268e68f1819a225c1b4b790955c17432.seg 04379243 +03624134/points/1943c87f92ac76e112cad8be168fe72d.pts 03624134/expert_verified/points_label/1943c87f92ac76e112cad8be168fe72d.seg 03624134 +04379243/points/b9fc2f624533bb8119fb4103277a6b93.pts 04379243/expert_verified/points_label/b9fc2f624533bb8119fb4103277a6b93.seg 04379243 +03001627/points/1c45b266d3c879dab36dcc661f3905d.pts 03001627/expert_verified/points_label/1c45b266d3c879dab36dcc661f3905d.seg 03001627 +03948459/points/1660ef4b3f20b1e2a94b922b533051b7.pts 03948459/expert_verified/points_label/1660ef4b3f20b1e2a94b922b533051b7.seg 03948459 +02691156/points/167250e2014c72dbb87697d3904b168b.pts 02691156/expert_verified/points_label/167250e2014c72dbb87697d3904b168b.seg 02691156 +02691156/points/dfe65f8a20df11c5d1df55cbe0874aa.pts 02691156/expert_verified/points_label/dfe65f8a20df11c5d1df55cbe0874aa.seg 02691156 +03001627/points/44a2a3952ea2315ff51f77a6d7299806.pts 03001627/expert_verified/points_label/44a2a3952ea2315ff51f77a6d7299806.seg 03001627 +04379243/points/a1896691fe875eccb9968f25875bdef4.pts 04379243/expert_verified/points_label/a1896691fe875eccb9968f25875bdef4.seg 04379243 +04379243/points/6f3506c9c5202101c4e8952b27b5f370.pts 04379243/expert_verified/points_label/6f3506c9c5202101c4e8952b27b5f370.seg 04379243 +04379243/points/fead7e0c30a347b1710801cae5dc529.pts 04379243/expert_verified/points_label/fead7e0c30a347b1710801cae5dc529.seg 04379243 +04379243/points/384bf53e12744e2019fb4103277a6b93.pts 04379243/expert_verified/points_label/384bf53e12744e2019fb4103277a6b93.seg 04379243 +03001627/points/30378faa6bf5b245fdef1c01cbd4ae0c.pts 03001627/expert_verified/points_label/30378faa6bf5b245fdef1c01cbd4ae0c.seg 03001627 +04379243/points/5690d17b330f73adfeb8ceb93793cb5.pts 04379243/expert_verified/points_label/5690d17b330f73adfeb8ceb93793cb5.seg 04379243 +03467517/points/2e4ec0874ea34a50812ca0ac90db1c07.pts 03467517/expert_verified/points_label/2e4ec0874ea34a50812ca0ac90db1c07.seg 03467517 +03001627/points/a007a3cd5b8ca7fb19fb4103277a6b93.pts 03001627/expert_verified/points_label/a007a3cd5b8ca7fb19fb4103277a6b93.seg 03001627 +03001627/points/bc21c95f766502a78b03575bb54dfd4.pts 03001627/expert_verified/points_label/bc21c95f766502a78b03575bb54dfd4.seg 03001627 +04379243/points/6a3ee73d42228f8581654cb17c02fd.pts 04379243/expert_verified/points_label/6a3ee73d42228f8581654cb17c02fd.seg 04379243 +04379243/points/4b399cdce8337c29285e0e27752e54a8.pts 04379243/expert_verified/points_label/4b399cdce8337c29285e0e27752e54a8.seg 04379243 +04379243/points/7f9d2da43d6aba67afb6676a5cd782b6.pts 04379243/expert_verified/points_label/7f9d2da43d6aba67afb6676a5cd782b6.seg 04379243 +03001627/points/72669be1815b2bb81e4fe86c4ad3ec90.pts 03001627/expert_verified/points_label/72669be1815b2bb81e4fe86c4ad3ec90.seg 03001627 +04379243/points/223fbcc813831d8c6e526771d2f7444e.pts 04379243/expert_verified/points_label/223fbcc813831d8c6e526771d2f7444e.seg 04379243 +02691156/points/adeb5d68e8d65cc419ba010ddb4974fe.pts 02691156/expert_verified/points_label/adeb5d68e8d65cc419ba010ddb4974fe.seg 02691156 +03001627/points/8a9d8dad6800d55ff37af16b2893f1d4.pts 03001627/expert_verified/points_label/8a9d8dad6800d55ff37af16b2893f1d4.seg 03001627 +04379243/points/db406d9b2a94bce5622d7484764b58f.pts 04379243/expert_verified/points_label/db406d9b2a94bce5622d7484764b58f.seg 04379243 +03001627/points/68b88c0be088c21d5e0096fb2d3266a.pts 03001627/expert_verified/points_label/68b88c0be088c21d5e0096fb2d3266a.seg 03001627 +03790512/points/973d75ed9c12836f3d033e6cf82ec72c.pts 03790512/expert_verified/points_label/973d75ed9c12836f3d033e6cf82ec72c.seg 03790512 +04379243/points/20292fba71362950c59c53f7df509858.pts 04379243/expert_verified/points_label/20292fba71362950c59c53f7df509858.seg 04379243 +03001627/points/21fb308ca737174e22f2f93459bd863e.pts 03001627/expert_verified/points_label/21fb308ca737174e22f2f93459bd863e.seg 03001627 +03001627/points/be9d5105e48ae27e713decb1a0563b12.pts 03001627/expert_verified/points_label/be9d5105e48ae27e713decb1a0563b12.seg 03001627 +02958343/points/c6441f127d51e478f0fb72d24c42a39.pts 02958343/expert_verified/points_label/c6441f127d51e478f0fb72d24c42a39.seg 02958343 +03001627/points/f29cbdb2c7bb10f9953d950bcd7de7a.pts 03001627/expert_verified/points_label/f29cbdb2c7bb10f9953d950bcd7de7a.seg 03001627 +02691156/points/65654b5c4e488e0c961fa14fc879444e.pts 02691156/expert_verified/points_label/65654b5c4e488e0c961fa14fc879444e.seg 02691156 +04379243/points/8654b644c766dd23d1dcc55e36186e4e.pts 04379243/expert_verified/points_label/8654b644c766dd23d1dcc55e36186e4e.seg 04379243 +04379243/points/56bb7376dfa9cb5c8cf069d506f8b5ac.pts 04379243/expert_verified/points_label/56bb7376dfa9cb5c8cf069d506f8b5ac.seg 04379243 +04379243/points/d291243cfb51ea7dcb25d116843b43a4.pts 04379243/expert_verified/points_label/d291243cfb51ea7dcb25d116843b43a4.seg 04379243 +03790512/points/49edb54e97458de8d373c34785838ee4.pts 03790512/expert_verified/points_label/49edb54e97458de8d373c34785838ee4.seg 03790512 +04379243/points/216da8313bc7b192ab610b0c94236463.pts 04379243/expert_verified/points_label/216da8313bc7b192ab610b0c94236463.seg 04379243 +03001627/points/5ac8b44ff77e5490c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/5ac8b44ff77e5490c8687ff9b0b4e4ac.seg 03001627 +03001627/points/956063d67b939431f56aa11cd5e0c3e.pts 03001627/expert_verified/points_label/956063d67b939431f56aa11cd5e0c3e.seg 03001627 +04379243/points/8dd8370dcaa8d770ea5682a3b818969a.pts 04379243/expert_verified/points_label/8dd8370dcaa8d770ea5682a3b818969a.seg 04379243 +03636649/points/3b64d5033c580d2ef76898f881b76a.pts 03636649/expert_verified/points_label/3b64d5033c580d2ef76898f881b76a.seg 03636649 +03001627/points/3d9dce1953180fe6f9c9f9697d1ec60.pts 03001627/expert_verified/points_label/3d9dce1953180fe6f9c9f9697d1ec60.seg 03001627 +03001627/points/d1b03eeb33fd441d8189e5e3786f2290.pts 03001627/expert_verified/points_label/d1b03eeb33fd441d8189e5e3786f2290.seg 03001627 +02691156/points/5294c39d2a57bd7e5cad6226edb8e82.pts 02691156/expert_verified/points_label/5294c39d2a57bd7e5cad6226edb8e82.seg 02691156 +04379243/points/7bc93a4cc26fab5c8c12b667670a35f2.pts 04379243/expert_verified/points_label/7bc93a4cc26fab5c8c12b667670a35f2.seg 04379243 +04379243/points/813d34995b5c4406b65b71636c46ae49.pts 04379243/expert_verified/points_label/813d34995b5c4406b65b71636c46ae49.seg 04379243 +03001627/points/6782b941de7b2199a344c33f76676fbd.pts 03001627/expert_verified/points_label/6782b941de7b2199a344c33f76676fbd.seg 03001627 +03636649/points/ea5ae3cfd142c3b923f93f957094a824.pts 03636649/expert_verified/points_label/ea5ae3cfd142c3b923f93f957094a824.seg 03636649 +03001627/points/47caca00f993bc4e4b3c42e318f3affc.pts 03001627/expert_verified/points_label/47caca00f993bc4e4b3c42e318f3affc.seg 03001627 +02691156/points/b702e35f4a59e81f64801ad2940cdd5.pts 02691156/expert_verified/points_label/b702e35f4a59e81f64801ad2940cdd5.seg 02691156 +03636649/points/3b5f0c01c2b914fc6f16f167d27a7dab.pts 03636649/expert_verified/points_label/3b5f0c01c2b914fc6f16f167d27a7dab.seg 03636649 +04379243/points/ad63116007d98a6d19758238d4c7aff2.pts 04379243/expert_verified/points_label/ad63116007d98a6d19758238d4c7aff2.seg 04379243 +03797390/points/8f6c86feaa74698d5c91ee20ade72edc.pts 03797390/expert_verified/points_label/8f6c86feaa74698d5c91ee20ade72edc.seg 03797390 +04379243/points/48baef3ab18d2d43d2afe8d5254a0d04.pts 04379243/expert_verified/points_label/48baef3ab18d2d43d2afe8d5254a0d04.seg 04379243 +03001627/points/fe5310a3457bf0e5c4e8952b27b5f370.pts 03001627/expert_verified/points_label/fe5310a3457bf0e5c4e8952b27b5f370.seg 03001627 +04379243/points/d4c330d27bbef3808f6610bf672cd686.pts 04379243/expert_verified/points_label/d4c330d27bbef3808f6610bf672cd686.seg 04379243 +04379243/points/adcb67b58024afb99910b7ec4c4e599b.pts 04379243/expert_verified/points_label/adcb67b58024afb99910b7ec4c4e599b.seg 04379243 +02958343/points/65d6433043c40046b82c0841410a924f.pts 02958343/expert_verified/points_label/65d6433043c40046b82c0841410a924f.seg 02958343 +04379243/points/1a00aa6b75362cc5b324368d54a7416f.pts 04379243/expert_verified/points_label/1a00aa6b75362cc5b324368d54a7416f.seg 04379243 +04379243/points/7982e2f2984978c6f4b6538438a0b930.pts 04379243/expert_verified/points_label/7982e2f2984978c6f4b6538438a0b930.seg 04379243 +03467517/points/26e1801ea747f72f14fe0da28e4f8384.pts 03467517/expert_verified/points_label/26e1801ea747f72f14fe0da28e4f8384.seg 03467517 +04379243/points/c8ee4a8b703180992985858e6f5832da.pts 04379243/expert_verified/points_label/c8ee4a8b703180992985858e6f5832da.seg 04379243 +02691156/points/f24daae76836e249f0878b58b4e887bf.pts 02691156/expert_verified/points_label/f24daae76836e249f0878b58b4e887bf.seg 02691156 +04379243/points/f29863d2fe8863d4195b8ea6a366e14d.pts 04379243/expert_verified/points_label/f29863d2fe8863d4195b8ea6a366e14d.seg 04379243 +04379243/points/babb0963a0e17bb59cd0aef0207ac8c6.pts 04379243/expert_verified/points_label/babb0963a0e17bb59cd0aef0207ac8c6.seg 04379243 +03001627/points/39911f927331db1c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/39911f927331db1c8687ff9b0b4e4ac.seg 03001627 +03001627/points/4a9d3ce54c09a2da696b74614952b2d0.pts 03001627/expert_verified/points_label/4a9d3ce54c09a2da696b74614952b2d0.seg 03001627 +03642806/points/caa4afd404f24d21275c1147a304ed86.pts 03642806/expert_verified/points_label/caa4afd404f24d21275c1147a304ed86.seg 03642806 +02691156/points/ff6e377e8e5b3757cc34b900bb2492e.pts 02691156/expert_verified/points_label/ff6e377e8e5b3757cc34b900bb2492e.seg 02691156 +03001627/points/483cfed0659965ed73c478529c40c4e6.pts 03001627/expert_verified/points_label/483cfed0659965ed73c478529c40c4e6.seg 03001627 +03797390/points/4b7888feea81219ab5f4a9188bfa0ef6.pts 03797390/expert_verified/points_label/4b7888feea81219ab5f4a9188bfa0ef6.seg 03797390 +03790512/points/40d84e407c46e8d8b31e74d456742c7.pts 03790512/expert_verified/points_label/40d84e407c46e8d8b31e74d456742c7.seg 03790512 +04379243/points/176e3b32d749ac94d79f2fc0b8d8ffad.pts 04379243/expert_verified/points_label/176e3b32d749ac94d79f2fc0b8d8ffad.seg 04379243 +03001627/points/657790bc7fd16326c132086242d50af2.pts 03001627/expert_verified/points_label/657790bc7fd16326c132086242d50af2.seg 03001627 +04379243/points/94c0ab5650ea392ddcfcef693e7ec696.pts 04379243/expert_verified/points_label/94c0ab5650ea392ddcfcef693e7ec696.seg 04379243 +03624134/points/bf5cae3922d3cb2bca7250d90eb506cf.pts 03624134/expert_verified/points_label/bf5cae3922d3cb2bca7250d90eb506cf.seg 03624134 +03001627/points/49a3b0242c13f92da6fee8e2140acec9.pts 03001627/expert_verified/points_label/49a3b0242c13f92da6fee8e2140acec9.seg 03001627 +03636649/points/e4c9bb21fe5bfeb3e21f078602e2eda8.pts 03636649/expert_verified/points_label/e4c9bb21fe5bfeb3e21f078602e2eda8.seg 03636649 +03636649/points/6595ee36783d261ed3281970e2c44dbe.pts 03636649/expert_verified/points_label/6595ee36783d261ed3281970e2c44dbe.seg 03636649 +02958343/points/9a152b11907b11074549b3c52ae0632e.pts 02958343/expert_verified/points_label/9a152b11907b11074549b3c52ae0632e.seg 02958343 +04379243/points/68a7bad2b06bc1a9d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/68a7bad2b06bc1a9d93768e7b9b1eabf.seg 04379243 +04379243/points/b9c756b2ff5d66ddfebad4f49b26ec52.pts 04379243/expert_verified/points_label/b9c756b2ff5d66ddfebad4f49b26ec52.seg 04379243 +03797390/points/2d10421716b16580e45ef4135c266a12.pts 03797390/expert_verified/points_label/2d10421716b16580e45ef4135c266a12.seg 03797390 +03001627/points/2c76aaa00e55c26836c07750784b6bc6.pts 03001627/expert_verified/points_label/2c76aaa00e55c26836c07750784b6bc6.seg 03001627 +03636649/points/5cca570916f420e64b3c42e318f3affc.pts 03636649/expert_verified/points_label/5cca570916f420e64b3c42e318f3affc.seg 03636649 +03001627/points/9225e57e34334ee019cb07ecb5b4102.pts 03001627/expert_verified/points_label/9225e57e34334ee019cb07ecb5b4102.seg 03001627 +03001627/points/17aeeadccf0e560e274b862d3a151946.pts 03001627/expert_verified/points_label/17aeeadccf0e560e274b862d3a151946.seg 03001627 +03636649/points/427806f30c61059c22e05b5d2ce39e3b.pts 03636649/expert_verified/points_label/427806f30c61059c22e05b5d2ce39e3b.seg 03636649 +03636649/points/17349d6d35aac0685ed28d6c8a1bdfe5.pts 03636649/expert_verified/points_label/17349d6d35aac0685ed28d6c8a1bdfe5.seg 03636649 +04379243/points/5ee4cbe45bdc4cd571a782a4379556c7.pts 04379243/expert_verified/points_label/5ee4cbe45bdc4cd571a782a4379556c7.seg 04379243 +03636649/points/5eda619e5f36499fc1537287b5c50d9d.pts 03636649/expert_verified/points_label/5eda619e5f36499fc1537287b5c50d9d.seg 03636649 +02691156/points/f57c74e194cd2b2bc8727b27ee96a4b7.pts 02691156/expert_verified/points_label/f57c74e194cd2b2bc8727b27ee96a4b7.seg 02691156 +02958343/points/27d42437168ccd7ddd75f724c0ccbe00.pts 02958343/expert_verified/points_label/27d42437168ccd7ddd75f724c0ccbe00.seg 02958343 +04379243/points/c8cf1c77bbb79d214719088c8e42c6ab.pts 04379243/expert_verified/points_label/c8cf1c77bbb79d214719088c8e42c6ab.seg 04379243 +04379243/points/40b48121d1879be2ee0605a41c3320d6.pts 04379243/expert_verified/points_label/40b48121d1879be2ee0605a41c3320d6.seg 04379243 +02691156/points/4f9b12d07dce21ac9d93a50cb0355558.pts 02691156/expert_verified/points_label/4f9b12d07dce21ac9d93a50cb0355558.seg 02691156 +02691156/points/25bd1569261bc545e8323edc0fe816a8.pts 02691156/expert_verified/points_label/25bd1569261bc545e8323edc0fe816a8.seg 02691156 +02691156/points/fbc429365ab7136be1a9c234926c21e2.pts 02691156/expert_verified/points_label/fbc429365ab7136be1a9c234926c21e2.seg 02691156 +04379243/points/798c315f86d8f02f931e98da3a93e73e.pts 04379243/expert_verified/points_label/798c315f86d8f02f931e98da3a93e73e.seg 04379243 +03790512/points/a0a40a9d5aabd6a7d5dde04c96fd8146.pts 03790512/expert_verified/points_label/a0a40a9d5aabd6a7d5dde04c96fd8146.seg 03790512 +04379243/points/884f15cfc6a3eea3dcfcef693e7ec696.pts 04379243/expert_verified/points_label/884f15cfc6a3eea3dcfcef693e7ec696.seg 04379243 +04379243/points/f16f939baeb7722e664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/f16f939baeb7722e664b3b9b23ddfcbc.seg 04379243 +03001627/points/1e0580f443a9e6d2593ebeeedbff73b.pts 03001627/expert_verified/points_label/1e0580f443a9e6d2593ebeeedbff73b.seg 03001627 +03636649/points/927e0654427c4d0b82241d99b4e87f38.pts 03636649/expert_verified/points_label/927e0654427c4d0b82241d99b4e87f38.seg 03636649 +03001627/points/bdd29e651e5f6fb2b079317292bdc5d4.pts 03001627/expert_verified/points_label/bdd29e651e5f6fb2b079317292bdc5d4.seg 03001627 +03642806/points/cb1e3a990782678b4b6682da890df381.pts 03642806/expert_verified/points_label/cb1e3a990782678b4b6682da890df381.seg 03642806 +03001627/points/fd5ac9b342fe518b9d3ea1c6b57a0095.pts 03001627/expert_verified/points_label/fd5ac9b342fe518b9d3ea1c6b57a0095.seg 03001627 +02958343/points/6bbcd5608ddf871a4cdd04162f008888.pts 02958343/expert_verified/points_label/6bbcd5608ddf871a4cdd04162f008888.seg 02958343 +04379243/points/76338ed3326689b249524cfd5973a145.pts 04379243/expert_verified/points_label/76338ed3326689b249524cfd5973a145.seg 04379243 +03001627/points/9a0571ae6169a6ebfebad4f49b26ec52.pts 03001627/expert_verified/points_label/9a0571ae6169a6ebfebad4f49b26ec52.seg 03001627 +03948459/points/49429e1d1e90c1ca202be79d8b285c1e.pts 03948459/expert_verified/points_label/49429e1d1e90c1ca202be79d8b285c1e.seg 03948459 +02691156/points/45a4ec99ed13ed773c2498c4c2f13ca.pts 02691156/expert_verified/points_label/45a4ec99ed13ed773c2498c4c2f13ca.seg 02691156 +04379243/points/70995336d06fc07ae9f3e9c758fef992.pts 04379243/expert_verified/points_label/70995336d06fc07ae9f3e9c758fef992.seg 04379243 +03001627/points/6fd76577d0df60669b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/6fd76577d0df60669b9f2eb77f5e247e.seg 03001627 +03001627/points/66f18d05d960ffe0bcd12732b5a4b789.pts 03001627/expert_verified/points_label/66f18d05d960ffe0bcd12732b5a4b789.seg 03001627 +03001627/points/e401be99c5a51d8bef8e9284f76f3024.pts 03001627/expert_verified/points_label/e401be99c5a51d8bef8e9284f76f3024.seg 03001627 +03001627/points/4a0b61d33846824ab1f04c301b6ccc90.pts 03001627/expert_verified/points_label/4a0b61d33846824ab1f04c301b6ccc90.seg 03001627 +04379243/points/9a5cb4122d518111b339f790b1757e92.pts 04379243/expert_verified/points_label/9a5cb4122d518111b339f790b1757e92.seg 04379243 +04379243/points/6281381ce38aa988de98d10ab5975b59.pts 04379243/expert_verified/points_label/6281381ce38aa988de98d10ab5975b59.seg 04379243 +04379243/points/d382d9e34f365544278d386bfa54545.pts 04379243/expert_verified/points_label/d382d9e34f365544278d386bfa54545.seg 04379243 +03948459/points/6de6e56c6f7d43692866658c90231a1a.pts 03948459/expert_verified/points_label/6de6e56c6f7d43692866658c90231a1a.seg 03948459 +02691156/points/494a1698eb82572c3df325aac2f73830.pts 02691156/expert_verified/points_label/494a1698eb82572c3df325aac2f73830.seg 02691156 +02691156/points/c581942f40cbb60819ba010ddb4974fe.pts 02691156/expert_verified/points_label/c581942f40cbb60819ba010ddb4974fe.seg 02691156 +04379243/points/e9038664b7d35e6b436e6787c76ef3f0.pts 04379243/expert_verified/points_label/e9038664b7d35e6b436e6787c76ef3f0.seg 04379243 +04099429/points/56c13d294f8afb1ffb88d148e845f82e.pts 04099429/expert_verified/points_label/56c13d294f8afb1ffb88d148e845f82e.seg 04099429 +02958343/points/86fa16c6da908e6b44221994b043fd86.pts 02958343/expert_verified/points_label/86fa16c6da908e6b44221994b043fd86.seg 02958343 +04379243/points/3249c3ad90085a9e98d5fc0473d00a1c.pts 04379243/expert_verified/points_label/3249c3ad90085a9e98d5fc0473d00a1c.seg 04379243 +03636649/points/8581a3ae1f77319ac066b9622c005c53.pts 03636649/expert_verified/points_label/8581a3ae1f77319ac066b9622c005c53.seg 03636649 +03790512/points/6e1397773a4d15db429f1c522640e6f0.pts 03790512/expert_verified/points_label/6e1397773a4d15db429f1c522640e6f0.seg 03790512 +03624134/points/c1ab7029de67351cf97a65c35ea619f0.pts 03624134/expert_verified/points_label/c1ab7029de67351cf97a65c35ea619f0.seg 03624134 +04379243/points/16e874e6165e836b30bbd4cddd04c77b.pts 04379243/expert_verified/points_label/16e874e6165e836b30bbd4cddd04c77b.seg 04379243 +03636649/points/ff08713d837d87edf2098a9f7fc86999.pts 03636649/expert_verified/points_label/ff08713d837d87edf2098a9f7fc86999.seg 03636649 +03790512/points/b649be9c09e2b332429f1c522640e6f0.pts 03790512/expert_verified/points_label/b649be9c09e2b332429f1c522640e6f0.seg 03790512 +03001627/points/85b16941984902f8facfa12c7d71c89f.pts 03001627/expert_verified/points_label/85b16941984902f8facfa12c7d71c89f.seg 03001627 +04379243/points/cf1a7653c10aaa0eab610b0c94236463.pts 04379243/expert_verified/points_label/cf1a7653c10aaa0eab610b0c94236463.seg 04379243 +03001627/points/a42aa59fa23b4a4d9c0ca344f487323e.pts 03001627/expert_verified/points_label/a42aa59fa23b4a4d9c0ca344f487323e.seg 03001627 +03001627/points/3f4f1d18c61a07f134b707eb14b2a4a5.pts 03001627/expert_verified/points_label/3f4f1d18c61a07f134b707eb14b2a4a5.seg 03001627 +03001627/points/d2b9e98373e96afec8d65ca96e6b18ef.pts 03001627/expert_verified/points_label/d2b9e98373e96afec8d65ca96e6b18ef.seg 03001627 +03636649/points/71dffdee89efe07cdff00b2637ddcbde.pts 03636649/expert_verified/points_label/71dffdee89efe07cdff00b2637ddcbde.seg 03636649 +02691156/points/5ac0cd21410b2a6a341877ff7a6c751f.pts 02691156/expert_verified/points_label/5ac0cd21410b2a6a341877ff7a6c751f.seg 02691156 +03636649/points/76eb7436c40e083384d184bdc625781a.pts 03636649/expert_verified/points_label/76eb7436c40e083384d184bdc625781a.seg 03636649 +03642806/points/13330d1e7b199dd82530b9c2b65d3f86.pts 03642806/expert_verified/points_label/13330d1e7b199dd82530b9c2b65d3f86.seg 03642806 +02691156/points/e726c8e6897130439a6e43b878d5b335.pts 02691156/expert_verified/points_label/e726c8e6897130439a6e43b878d5b335.seg 02691156 +04379243/points/40a402e1d949364a104ceb84075e40d6.pts 04379243/expert_verified/points_label/40a402e1d949364a104ceb84075e40d6.seg 04379243 +03001627/points/42140baad25c8598baa1a4ff2c45ffc9.pts 03001627/expert_verified/points_label/42140baad25c8598baa1a4ff2c45ffc9.seg 03001627 +03001627/points/5283a98b5c693e64ebefe6b1d594ad2e.pts 03001627/expert_verified/points_label/5283a98b5c693e64ebefe6b1d594ad2e.seg 03001627 +02691156/points/15898fef6fec88c53ada73811bb576de.pts 02691156/expert_verified/points_label/15898fef6fec88c53ada73811bb576de.seg 02691156 +03001627/points/3f8d0d53e2bd74124b3c42e318f3affc.pts 03001627/expert_verified/points_label/3f8d0d53e2bd74124b3c42e318f3affc.seg 03001627 +04379243/points/cd106955d3bdf8e751c4deb11af7079e.pts 04379243/expert_verified/points_label/cd106955d3bdf8e751c4deb11af7079e.seg 04379243 +03001627/points/11506b96d41f7d3dd7c4a943f33e0384.pts 03001627/expert_verified/points_label/11506b96d41f7d3dd7c4a943f33e0384.seg 03001627 +03001627/points/f51ab8433184dfd2c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/f51ab8433184dfd2c8687ff9b0b4e4ac.seg 03001627 +02691156/points/c9a6dcf87d1f15bca8607f540cc62ba.pts 02691156/expert_verified/points_label/c9a6dcf87d1f15bca8607f540cc62ba.seg 02691156 +04379243/points/d9c75799ff9ff74664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/d9c75799ff9ff74664b3b9b23ddfcbc.seg 04379243 +04379243/points/93e81005c19a74b8664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/93e81005c19a74b8664b3b9b23ddfcbc.seg 04379243 +02958343/points/5057c9dbf72e0352728fa2df514c65d4.pts 02958343/expert_verified/points_label/5057c9dbf72e0352728fa2df514c65d4.seg 02958343 +04379243/points/8ad88ee4442fd0fd8a6ba7ebad3985bb.pts 04379243/expert_verified/points_label/8ad88ee4442fd0fd8a6ba7ebad3985bb.seg 04379243 +04379243/points/a2554ec7e2331a8fab610b0c94236463.pts 04379243/expert_verified/points_label/a2554ec7e2331a8fab610b0c94236463.seg 04379243 +04379243/points/482a76d14781e55e25374da32e705c.pts 04379243/expert_verified/points_label/482a76d14781e55e25374da32e705c.seg 04379243 +02691156/points/d06105ee2a2ae27c51008e496c6cfd2e.pts 02691156/expert_verified/points_label/d06105ee2a2ae27c51008e496c6cfd2e.seg 02691156 +04379243/points/45a09b1ce3111e4f22f4fabdf1ee0670.pts 04379243/expert_verified/points_label/45a09b1ce3111e4f22f4fabdf1ee0670.seg 04379243 +03467517/points/9aaad035af7e6ab1ed724609df3eb104.pts 03467517/expert_verified/points_label/9aaad035af7e6ab1ed724609df3eb104.seg 03467517 +02691156/points/cf0cdaa94220ee3f4c3a35cee92bb95b.pts 02691156/expert_verified/points_label/cf0cdaa94220ee3f4c3a35cee92bb95b.seg 02691156 +02691156/points/48cb2de06f46cde25ed29e0a9f14425.pts 02691156/expert_verified/points_label/48cb2de06f46cde25ed29e0a9f14425.seg 02691156 +03001627/points/2f0a94efe6d1da7f8616812464c86290.pts 03001627/expert_verified/points_label/2f0a94efe6d1da7f8616812464c86290.seg 03001627 +02691156/points/e0385af10bddc6a0ca8607f540cc62ba.pts 02691156/expert_verified/points_label/e0385af10bddc6a0ca8607f540cc62ba.seg 02691156 +03467517/points/71139bd2ff6c4257280ec2e5049bb369.pts 03467517/expert_verified/points_label/71139bd2ff6c4257280ec2e5049bb369.seg 03467517 +03001627/points/6251b398004a02fffebad4f49b26ec52.pts 03001627/expert_verified/points_label/6251b398004a02fffebad4f49b26ec52.seg 03001627 +03467517/points/7eba657565cc69e913f86abea5e4b9e0.pts 03467517/expert_verified/points_label/7eba657565cc69e913f86abea5e4b9e0.seg 03467517 +03001627/points/8d2fd4b9c583e1e6a12cdfe22cdc2f5d.pts 03001627/expert_verified/points_label/8d2fd4b9c583e1e6a12cdfe22cdc2f5d.seg 03001627 +03001627/points/ffa1e25f499e586694e98ee4fdfd7464.pts 03001627/expert_verified/points_label/ffa1e25f499e586694e98ee4fdfd7464.seg 03001627 +03797390/points/9af98540f45411467246665d3d3724c.pts 03797390/expert_verified/points_label/9af98540f45411467246665d3d3724c.seg 03797390 +02691156/points/b9fabfa6d5fedbc3a8e091cb544689d5.pts 02691156/expert_verified/points_label/b9fabfa6d5fedbc3a8e091cb544689d5.seg 02691156 +04379243/points/a2561614d015f2fdfebad4f49b26ec52.pts 04379243/expert_verified/points_label/a2561614d015f2fdfebad4f49b26ec52.seg 04379243 +03642806/points/2134ad3fc25a6284193a4c984002ed32.pts 03642806/expert_verified/points_label/2134ad3fc25a6284193a4c984002ed32.seg 03642806 +03001627/points/d3302b7fa6504cab1a461b43b8f257f.pts 03001627/expert_verified/points_label/d3302b7fa6504cab1a461b43b8f257f.seg 03001627 +03467517/points/bf7026f9814230414269db3f92b7aa5e.pts 03467517/expert_verified/points_label/bf7026f9814230414269db3f92b7aa5e.seg 03467517 +03636649/points/9aff9fdad0e3555c7eecb4e0df212ad9.pts 03636649/expert_verified/points_label/9aff9fdad0e3555c7eecb4e0df212ad9.seg 03636649 +03797390/points/a3cd44bbd3ba5b019a4cbf5d3b79df06.pts 03797390/expert_verified/points_label/a3cd44bbd3ba5b019a4cbf5d3b79df06.seg 03797390 +04099429/points/eff3a27a085e02e5146be45f8a3c1ff8.pts 04099429/expert_verified/points_label/eff3a27a085e02e5146be45f8a3c1ff8.seg 04099429 +02958343/points/1e3f494626a24badf35b4953d8add91f.pts 02958343/expert_verified/points_label/1e3f494626a24badf35b4953d8add91f.seg 02958343 +04379243/points/1f3e217cbc871152d7465eca206fda6f.pts 04379243/expert_verified/points_label/1f3e217cbc871152d7465eca206fda6f.seg 04379243 +03636649/points/cef6757831b4d9738c8f019f17f4687c.pts 03636649/expert_verified/points_label/cef6757831b4d9738c8f019f17f4687c.seg 03636649 +04379243/points/e8689b8b1610bf2841bb8a7ba579a58.pts 04379243/expert_verified/points_label/e8689b8b1610bf2841bb8a7ba579a58.seg 04379243 +03001627/points/40168f46019eb867be7e1d42d63ca9f0.pts 03001627/expert_verified/points_label/40168f46019eb867be7e1d42d63ca9f0.seg 03001627 +03624134/points/7aed22a7074f16431cf05d6e4dbb95af.pts 03624134/expert_verified/points_label/7aed22a7074f16431cf05d6e4dbb95af.seg 03624134 +04379243/points/5d53ed3005f4dc6856786b90799c4fdb.pts 04379243/expert_verified/points_label/5d53ed3005f4dc6856786b90799c4fdb.seg 04379243 +04379243/points/beebc267ea0c16a5c7f6a57f6f73d8a6.pts 04379243/expert_verified/points_label/beebc267ea0c16a5c7f6a57f6f73d8a6.seg 04379243 +04379243/points/943d786e2df9251ec76aead7da70af41.pts 04379243/expert_verified/points_label/943d786e2df9251ec76aead7da70af41.seg 04379243 +04379243/points/90d87b4d9a5a1e78f4b6538438a0b930.pts 04379243/expert_verified/points_label/90d87b4d9a5a1e78f4b6538438a0b930.seg 04379243 +02958343/points/d47353fc60390df85d918097f81825e3.pts 02958343/expert_verified/points_label/d47353fc60390df85d918097f81825e3.seg 02958343 +03624134/points/90021da7c71f6bcbf02ee453ff283e26.pts 03624134/expert_verified/points_label/90021da7c71f6bcbf02ee453ff283e26.seg 03624134 +02958343/points/d1acd4916d3d3b57c48db2ed8f5e994c.pts 02958343/expert_verified/points_label/d1acd4916d3d3b57c48db2ed8f5e994c.seg 02958343 +03001627/points/1d1c829a54f0ae426cdb122727dd360f.pts 03001627/expert_verified/points_label/1d1c829a54f0ae426cdb122727dd360f.seg 03001627 +04379243/points/c35a14f84985f92a9856fa70a578baeb.pts 04379243/expert_verified/points_label/c35a14f84985f92a9856fa70a578baeb.seg 04379243 +03636649/points/5c5119a226e1ce9934804d261199e1bf.pts 03636649/expert_verified/points_label/5c5119a226e1ce9934804d261199e1bf.seg 03636649 +03636649/points/6bb8020fa82b27dde11a3e838aa2c287.pts 03636649/expert_verified/points_label/6bb8020fa82b27dde11a3e838aa2c287.seg 03636649 +03797390/points/fad118b32085f3f2c2c72e575af174cd.pts 03797390/expert_verified/points_label/fad118b32085f3f2c2c72e575af174cd.seg 03797390 +04379243/points/a82387cf9d9d253aa06f94abffad1304.pts 04379243/expert_verified/points_label/a82387cf9d9d253aa06f94abffad1304.seg 04379243 +03948459/points/a7a340a901d63486260a770f90456bf7.pts 03948459/expert_verified/points_label/a7a340a901d63486260a770f90456bf7.seg 03948459 +03624134/points/60e7b05ddeeb48eb37fa2c3ecb75f337.pts 03624134/expert_verified/points_label/60e7b05ddeeb48eb37fa2c3ecb75f337.seg 03624134 +02958343/points/3e2c3cb4f4c65b9cde9d4070fcdfa604.pts 02958343/expert_verified/points_label/3e2c3cb4f4c65b9cde9d4070fcdfa604.seg 02958343 +03001627/points/d58df0968070bf3b4b3c42e318f3affc.pts 03001627/expert_verified/points_label/d58df0968070bf3b4b3c42e318f3affc.seg 03001627 +04379243/points/4a3641784a9ecca04fa8d6439169bda4.pts 04379243/expert_verified/points_label/4a3641784a9ecca04fa8d6439169bda4.seg 04379243 +04225987/points/d31aaca67fd8ef1827d17dabad15093.pts 04225987/expert_verified/points_label/d31aaca67fd8ef1827d17dabad15093.seg 04225987 +03001627/points/c51937167dd0db45f7628281ecb18112.pts 03001627/expert_verified/points_label/c51937167dd0db45f7628281ecb18112.seg 03001627 +04379243/points/768cb2332a16fd63855931d119219022.pts 04379243/expert_verified/points_label/768cb2332a16fd63855931d119219022.seg 04379243 +03001627/points/8c76176c82e3e42d283b00891f680579.pts 03001627/expert_verified/points_label/8c76176c82e3e42d283b00891f680579.seg 03001627 +03001627/points/d4d9b991ff7d31e8c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/d4d9b991ff7d31e8c8687ff9b0b4e4ac.seg 03001627 +03797390/points/162201dfe14b73f0281365259d1cf342.pts 03797390/expert_verified/points_label/162201dfe14b73f0281365259d1cf342.seg 03797390 +04379243/points/ed1e06e886b5514fe8f49d7c9e73ab9.pts 04379243/expert_verified/points_label/ed1e06e886b5514fe8f49d7c9e73ab9.seg 04379243 +03636649/points/90651b3febfc3afe15226aa76eb7c3e.pts 03636649/expert_verified/points_label/90651b3febfc3afe15226aa76eb7c3e.seg 03636649 +04379243/points/24b208dd138d8af36210db75a4cd581b.pts 04379243/expert_verified/points_label/24b208dd138d8af36210db75a4cd581b.seg 04379243 +03001627/points/439418b35f600f4bb10dc0fca58d0b2c.pts 03001627/expert_verified/points_label/439418b35f600f4bb10dc0fca58d0b2c.seg 03001627 +03636649/points/88257c5a48d94b1e2b151d8b52c53b90.pts 03636649/expert_verified/points_label/88257c5a48d94b1e2b151d8b52c53b90.seg 03636649 +02691156/points/ad546b049b2246bd609e2d916fa0da27.pts 02691156/expert_verified/points_label/ad546b049b2246bd609e2d916fa0da27.seg 02691156 +03001627/points/7efeece3b5cf2853d706779c93538ee1.pts 03001627/expert_verified/points_label/7efeece3b5cf2853d706779c93538ee1.seg 03001627 +04379243/points/30dd74f09af6b1c2fe5c8ffd0f5eba47.pts 04379243/expert_verified/points_label/30dd74f09af6b1c2fe5c8ffd0f5eba47.seg 04379243 +02691156/points/752d9a010346862551cfdb4c9f126c12.pts 02691156/expert_verified/points_label/752d9a010346862551cfdb4c9f126c12.seg 02691156 +03001627/points/d1237422881f4d22ff25b0c2db862d19.pts 03001627/expert_verified/points_label/d1237422881f4d22ff25b0c2db862d19.seg 03001627 +04379243/points/95af60aa8cb9be066a76e23e6f966dea.pts 04379243/expert_verified/points_label/95af60aa8cb9be066a76e23e6f966dea.seg 04379243 +02691156/points/556d2b99469e62e623a346a784afd6ba.pts 02691156/expert_verified/points_label/556d2b99469e62e623a346a784afd6ba.seg 02691156 +04379243/points/6e23179a3559775a65eacc25f128a1c5.pts 04379243/expert_verified/points_label/6e23179a3559775a65eacc25f128a1c5.seg 04379243 +02691156/points/3b82e575165383903c83f6e156ad107a.pts 02691156/expert_verified/points_label/3b82e575165383903c83f6e156ad107a.seg 02691156 +02773838/points/71ead7f072106c63ed13f430b2941481.pts 02773838/expert_verified/points_label/71ead7f072106c63ed13f430b2941481.seg 02773838 +03001627/points/c9d68e1e5309ac25ac57e7d566628472.pts 03001627/expert_verified/points_label/c9d68e1e5309ac25ac57e7d566628472.seg 03001627 +02691156/points/b3a59a941500e76535592b447835a16e.pts 02691156/expert_verified/points_label/b3a59a941500e76535592b447835a16e.seg 02691156 +03797390/points/4d9764afa3fbeb1b6c69dceb67157a66.pts 03797390/expert_verified/points_label/4d9764afa3fbeb1b6c69dceb67157a66.seg 03797390 +04379243/points/68ea1f319a9d724ec3bd24f986301745.pts 04379243/expert_verified/points_label/68ea1f319a9d724ec3bd24f986301745.seg 04379243 +03001627/points/30363681727c804095937f6e581cbd41.pts 03001627/expert_verified/points_label/30363681727c804095937f6e581cbd41.seg 03001627 +03001627/points/f4f1aba65ebe48eb70930286c914896b.pts 03001627/expert_verified/points_label/f4f1aba65ebe48eb70930286c914896b.seg 03001627 +02691156/points/a3fc9ef9f611a783525e60273896d30a.pts 02691156/expert_verified/points_label/a3fc9ef9f611a783525e60273896d30a.seg 02691156 +03636649/points/b0871c4ac8505d9c3d39d8012919dd25.pts 03636649/expert_verified/points_label/b0871c4ac8505d9c3d39d8012919dd25.seg 03636649 +03001627/points/d7e26a070ee3b35cdf6cfab91d65bb91.pts 03001627/expert_verified/points_label/d7e26a070ee3b35cdf6cfab91d65bb91.seg 03001627 +04379243/points/9012c6ca245c1bf4e6c5cd45aa112726.pts 04379243/expert_verified/points_label/9012c6ca245c1bf4e6c5cd45aa112726.seg 04379243 +03636649/points/3ab9e4300cee0259f72e8839e840c146.pts 03636649/expert_verified/points_label/3ab9e4300cee0259f72e8839e840c146.seg 03636649 +04379243/points/6e0fed54fcae8a62edccc47bf0dcf5d3.pts 04379243/expert_verified/points_label/6e0fed54fcae8a62edccc47bf0dcf5d3.seg 04379243 +04379243/points/aafc579804cc095cbababe11fcea8796.pts 04379243/expert_verified/points_label/aafc579804cc095cbababe11fcea8796.seg 04379243 +03636649/points/9adee08c737c7c134c6deb9ede0648df.pts 03636649/expert_verified/points_label/9adee08c737c7c134c6deb9ede0648df.seg 03636649 +02691156/points/f39985959d394f8c863ab010b80d9ed.pts 02691156/expert_verified/points_label/f39985959d394f8c863ab010b80d9ed.seg 02691156 +04379243/points/23d4170c7a0a2a014b3c42e318f3affc.pts 04379243/expert_verified/points_label/23d4170c7a0a2a014b3c42e318f3affc.seg 04379243 +04379243/points/a1593fbe3a78c7858795000a72749c36.pts 04379243/expert_verified/points_label/a1593fbe3a78c7858795000a72749c36.seg 04379243 +03001627/points/4b2ede169dcc83ce4591019e9d133858.pts 03001627/expert_verified/points_label/4b2ede169dcc83ce4591019e9d133858.seg 03001627 +03001627/points/3fa1eeed2e8e2534febad4f49b26ec52.pts 03001627/expert_verified/points_label/3fa1eeed2e8e2534febad4f49b26ec52.seg 03001627 +04379243/points/e8ba9621aef9395a3019620286259e2c.pts 04379243/expert_verified/points_label/e8ba9621aef9395a3019620286259e2c.seg 04379243 +03001627/points/875925d42780159ffebad4f49b26ec52.pts 03001627/expert_verified/points_label/875925d42780159ffebad4f49b26ec52.seg 03001627 +03001627/points/548ab6b6e8b2dc505ff61a3a2a0e2484.pts 03001627/expert_verified/points_label/548ab6b6e8b2dc505ff61a3a2a0e2484.seg 03001627 +03467517/points/4f401d78068a9d348ee96618ee16ca27.pts 03467517/expert_verified/points_label/4f401d78068a9d348ee96618ee16ca27.seg 03467517 +04379243/points/f7600660924857c0d31d0d81bfe9c743.pts 04379243/expert_verified/points_label/f7600660924857c0d31d0d81bfe9c743.seg 04379243 +04379243/points/edba7eb533ae3578ece232edf44331c7.pts 04379243/expert_verified/points_label/edba7eb533ae3578ece232edf44331c7.seg 04379243 +03001627/points/8b8fa92f9c677b0713decb1a0563b12.pts 03001627/expert_verified/points_label/8b8fa92f9c677b0713decb1a0563b12.seg 03001627 +02691156/points/81e6b629264dad5daf2c6c19cc41708a.pts 02691156/expert_verified/points_label/81e6b629264dad5daf2c6c19cc41708a.seg 02691156 +02691156/points/a0a7e673a1e1bca78699933784576e73.pts 02691156/expert_verified/points_label/a0a7e673a1e1bca78699933784576e73.seg 02691156 +03636649/points/f01358d4f45cae23ce670f026edf07e5.pts 03636649/expert_verified/points_label/f01358d4f45cae23ce670f026edf07e5.seg 03636649 +03001627/points/808fa82fe9ad86d9f1cc184b6fa3e1f9.pts 03001627/expert_verified/points_label/808fa82fe9ad86d9f1cc184b6fa3e1f9.seg 03001627 +02691156/points/57937c7ab42260ebf119374ee5d5f944.pts 02691156/expert_verified/points_label/57937c7ab42260ebf119374ee5d5f944.seg 02691156 +03001627/points/fbddac94cfa74a7b5c0228148b88226c.pts 03001627/expert_verified/points_label/fbddac94cfa74a7b5c0228148b88226c.seg 03001627 +04379243/points/ad92bfc65465091c48d90eef8384210.pts 04379243/expert_verified/points_label/ad92bfc65465091c48d90eef8384210.seg 04379243 +03467517/points/6ce23c82af30b629e8f705eb96ba3376.pts 03467517/expert_verified/points_label/6ce23c82af30b629e8f705eb96ba3376.seg 03467517 +03001627/points/bd1787066323c7a64424fc4d3c9cb157.pts 03001627/expert_verified/points_label/bd1787066323c7a64424fc4d3c9cb157.seg 03001627 +03001627/points/uca24feec-f0c0-454c-baaf-561530686f40.pts 03001627/expert_verified/points_label/uca24feec-f0c0-454c-baaf-561530686f40.seg 03001627 +03001627/points/226704c72560008421ceb39dc3069834.pts 03001627/expert_verified/points_label/226704c72560008421ceb39dc3069834.seg 03001627 +02691156/points/2c49289098e4492bca8607f540cc62ba.pts 02691156/expert_verified/points_label/2c49289098e4492bca8607f540cc62ba.seg 02691156 +03001627/points/cff9a523a9e20eaeb40f0ac0fb9a650d.pts 03001627/expert_verified/points_label/cff9a523a9e20eaeb40f0ac0fb9a650d.seg 03001627 +04379243/points/38e90183c838f443b43753a53e4593db.pts 04379243/expert_verified/points_label/38e90183c838f443b43753a53e4593db.seg 04379243 +04379243/points/8b4ec70a3c1283b1fb5f8baea920e189.pts 04379243/expert_verified/points_label/8b4ec70a3c1283b1fb5f8baea920e189.seg 04379243 +04379243/points/59a1703cb9320c018f49a52c8d710d0f.pts 04379243/expert_verified/points_label/59a1703cb9320c018f49a52c8d710d0f.seg 04379243 +03636649/points/4ba237c2c40313f373b3ec02b97cb0f.pts 03636649/expert_verified/points_label/4ba237c2c40313f373b3ec02b97cb0f.seg 03636649 +04379243/points/bb027ed892722b1f3399de188dc5ee56.pts 04379243/expert_verified/points_label/bb027ed892722b1f3399de188dc5ee56.seg 04379243 +03467517/points/8b1d0f73e54ef59c93f0194265a9746c.pts 03467517/expert_verified/points_label/8b1d0f73e54ef59c93f0194265a9746c.seg 03467517 +03467517/points/1300e8bafb819c8e1887f40a4f62df44.pts 03467517/expert_verified/points_label/1300e8bafb819c8e1887f40a4f62df44.seg 03467517 +03642806/points/9fa387d7f442b96e75e60c00fabe2744.pts 03642806/expert_verified/points_label/9fa387d7f442b96e75e60c00fabe2744.seg 03642806 +04379243/points/e153f757330a4ea3cdd1f51ef2b8f2ed.pts 04379243/expert_verified/points_label/e153f757330a4ea3cdd1f51ef2b8f2ed.seg 04379243 +03636649/points/d00157a022079bdef3655a2ce983ab1f.pts 03636649/expert_verified/points_label/d00157a022079bdef3655a2ce983ab1f.seg 03636649 +04379243/points/9eeea5f7b030ff6ac155f88004a92bc8.pts 04379243/expert_verified/points_label/9eeea5f7b030ff6ac155f88004a92bc8.seg 04379243 +04379243/points/10ed64b4c7eb6d9311ee7ca4f000feba.pts 04379243/expert_verified/points_label/10ed64b4c7eb6d9311ee7ca4f000feba.seg 04379243 +03001627/points/6db2255a51caf84e823e7e244bf84209.pts 03001627/expert_verified/points_label/6db2255a51caf84e823e7e244bf84209.seg 03001627 +03001627/points/8ddaa112e6ba36b5b1e23c7675c49239.pts 03001627/expert_verified/points_label/8ddaa112e6ba36b5b1e23c7675c49239.seg 03001627 +04379243/points/7813f4e4c0a58118cbb8bac2032149c.pts 04379243/expert_verified/points_label/7813f4e4c0a58118cbb8bac2032149c.seg 04379243 +03797390/points/336122c3105440d193e42e2720468bf0.pts 03797390/expert_verified/points_label/336122c3105440d193e42e2720468bf0.seg 03797390 +03001627/points/f2e2993abf4c952b2e69a7e134f91051.pts 03001627/expert_verified/points_label/f2e2993abf4c952b2e69a7e134f91051.seg 03001627 +04379243/points/627248fa64c1db5fab610b0c94236463.pts 04379243/expert_verified/points_label/627248fa64c1db5fab610b0c94236463.seg 04379243 +04379243/points/3b465822b34ed20ca05d3424fd8d541a.pts 04379243/expert_verified/points_label/3b465822b34ed20ca05d3424fd8d541a.seg 04379243 +03467517/points/a7ddf2e5b9dc278293f0194265a9746c.pts 03467517/expert_verified/points_label/a7ddf2e5b9dc278293f0194265a9746c.seg 03467517 +03636649/points/b36bfbbc98cb45431735ea0e092a805a.pts 03636649/expert_verified/points_label/b36bfbbc98cb45431735ea0e092a805a.seg 03636649 +04379243/points/7d14ae7d0b7338bda0ab1d82ef09f78f.pts 04379243/expert_verified/points_label/7d14ae7d0b7338bda0ab1d82ef09f78f.seg 04379243 +03467517/points/f7645b3c690d954682c2412261cb8600.pts 03467517/expert_verified/points_label/f7645b3c690d954682c2412261cb8600.seg 03467517 +02958343/points/41a6deadd39b4c754d0f9a1ef5f184fe.pts 02958343/expert_verified/points_label/41a6deadd39b4c754d0f9a1ef5f184fe.seg 02958343 +02691156/points/f74cbd91e6fb40dfce5965228d7e8c9f.pts 02691156/expert_verified/points_label/f74cbd91e6fb40dfce5965228d7e8c9f.seg 02691156 +04379243/points/6c4c3bfe275e66b1b75e606711562bfc.pts 04379243/expert_verified/points_label/6c4c3bfe275e66b1b75e606711562bfc.seg 04379243 +04379243/points/7d358a01c9467815a9505c473725122e.pts 04379243/expert_verified/points_label/7d358a01c9467815a9505c473725122e.seg 04379243 +04379243/points/5fe3476df92392e1397aad305ec14786.pts 04379243/expert_verified/points_label/5fe3476df92392e1397aad305ec14786.seg 04379243 +03001627/points/34d3960d35d8d5219b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/34d3960d35d8d5219b9f2eb77f5e247e.seg 03001627 +03001627/points/1b67a3a1101a9acb905477d2a8504646.pts 03001627/expert_verified/points_label/1b67a3a1101a9acb905477d2a8504646.seg 03001627 +03001627/points/ee4858f78dc33591100e9bd5c4b0af54.pts 03001627/expert_verified/points_label/ee4858f78dc33591100e9bd5c4b0af54.seg 03001627 +03001627/points/a578b0027e7d9ec7b2ca3ea77e53abe.pts 03001627/expert_verified/points_label/a578b0027e7d9ec7b2ca3ea77e53abe.seg 03001627 +02691156/points/916950e40ca7aabc8b96ae1a0a8b84ec.pts 02691156/expert_verified/points_label/916950e40ca7aabc8b96ae1a0a8b84ec.seg 02691156 +04379243/points/1abfb0c03c81fc2219fb4103277a6b93.pts 04379243/expert_verified/points_label/1abfb0c03c81fc2219fb4103277a6b93.seg 04379243 +02691156/points/a702da03d770f5096e2738fc9da60e6f.pts 02691156/expert_verified/points_label/a702da03d770f5096e2738fc9da60e6f.seg 02691156 +04379243/points/2e2894138df855b26f88aa1b7f7cc6c6.pts 04379243/expert_verified/points_label/2e2894138df855b26f88aa1b7f7cc6c6.seg 04379243 +03001627/points/589cd6a1f4367fd834b707eb14b2a4a5.pts 03001627/expert_verified/points_label/589cd6a1f4367fd834b707eb14b2a4a5.seg 03001627 +03636649/points/f8534299ecce5c16eaf14273fa406ffc.pts 03636649/expert_verified/points_label/f8534299ecce5c16eaf14273fa406ffc.seg 03636649 +04379243/points/ea96b8a866121d1abed1bd9593e318c.pts 04379243/expert_verified/points_label/ea96b8a866121d1abed1bd9593e318c.seg 04379243 +03624134/points/9746101f20473d346bbd83c2bc4c3b2e.pts 03624134/expert_verified/points_label/9746101f20473d346bbd83c2bc4c3b2e.seg 03624134 +02958343/points/9c4a3879c71df693af0f25977186b501.pts 02958343/expert_verified/points_label/9c4a3879c71df693af0f25977186b501.seg 02958343 +03001627/points/6621723f7af35f2dcd344c2b2cefcda6.pts 03001627/expert_verified/points_label/6621723f7af35f2dcd344c2b2cefcda6.seg 03001627 +03948459/points/8c9e592c95f95e7c9a6e43b878d5b335.pts 03948459/expert_verified/points_label/8c9e592c95f95e7c9a6e43b878d5b335.seg 03948459 +04379243/points/36a6d851dbe02410ad16260d4d73b56.pts 04379243/expert_verified/points_label/36a6d851dbe02410ad16260d4d73b56.seg 04379243 +04379243/points/b1ca280d9567270ade98d10ab5975b59.pts 04379243/expert_verified/points_label/b1ca280d9567270ade98d10ab5975b59.seg 04379243 +03467517/points/5ed99a0b793e1f5ee52744498b9b3051.pts 03467517/expert_verified/points_label/5ed99a0b793e1f5ee52744498b9b3051.seg 03467517 +03001627/points/18fd8342fa5d1d4f5268b70948af88b2.pts 03001627/expert_verified/points_label/18fd8342fa5d1d4f5268b70948af88b2.seg 03001627 +02691156/points/cc60baa1a796f5c14c3a35cee92bb95b.pts 02691156/expert_verified/points_label/cc60baa1a796f5c14c3a35cee92bb95b.seg 02691156 +03642806/points/3237f5cd4bca555955357c338ec9641.pts 03642806/expert_verified/points_label/3237f5cd4bca555955357c338ec9641.seg 03642806 +03001627/points/fee248777c9c4807f8bc1f8036e08e44.pts 03001627/expert_verified/points_label/fee248777c9c4807f8bc1f8036e08e44.seg 03001627 +04379243/points/2d90a1998eca8778dcfcef693e7ec696.pts 04379243/expert_verified/points_label/2d90a1998eca8778dcfcef693e7ec696.seg 04379243 +02958343/points/3ef7cfbc172840b2393bf61b30c528bb.pts 02958343/expert_verified/points_label/3ef7cfbc172840b2393bf61b30c528bb.seg 02958343 +02691156/points/240fd3c1fd804ec1b8cf782e8c539948.pts 02691156/expert_verified/points_label/240fd3c1fd804ec1b8cf782e8c539948.seg 02691156 +04379243/points/60c931dcc6d0982944bda2555d37e46.pts 04379243/expert_verified/points_label/60c931dcc6d0982944bda2555d37e46.seg 04379243 +04379243/points/93040a14fad5588ed889130b88839a0c.pts 04379243/expert_verified/points_label/93040a14fad5588ed889130b88839a0c.seg 04379243 +02958343/points/a75ff576da012340468bac13e007a6e9.pts 02958343/expert_verified/points_label/a75ff576da012340468bac13e007a6e9.seg 02958343 +03467517/points/57286d92604c9ebea3d3eb77b119df6d.pts 03467517/expert_verified/points_label/57286d92604c9ebea3d3eb77b119df6d.seg 03467517 +03636649/points/913ba6b6ac6aea3356c82fefb25b338b.pts 03636649/expert_verified/points_label/913ba6b6ac6aea3356c82fefb25b338b.seg 03636649 +03001627/points/cce9ffdcc7ca8ddea300840c9d7bfa74.pts 03001627/expert_verified/points_label/cce9ffdcc7ca8ddea300840c9d7bfa74.seg 03001627 +04379243/points/913c0ff011ad0658dcfcef693e7ec696.pts 04379243/expert_verified/points_label/913c0ff011ad0658dcfcef693e7ec696.seg 04379243 +03001627/points/9d0b25421c13008e35836c728d324152.pts 03001627/expert_verified/points_label/9d0b25421c13008e35836c728d324152.seg 03001627 +03797390/points/a8f7a0edd3edc3299e54b4084dc33544.pts 03797390/expert_verified/points_label/a8f7a0edd3edc3299e54b4084dc33544.seg 03797390 +04379243/points/5b9a7b7952996844d802aa676be38da2.pts 04379243/expert_verified/points_label/5b9a7b7952996844d802aa676be38da2.seg 04379243 +02954340/points/4bd0b6df02772d8f59c9250a427b57f.pts 02954340/expert_verified/points_label/4bd0b6df02772d8f59c9250a427b57f.seg 02954340 +02958343/points/a72134cd499fd1c4f79e091fa09130a.pts 02958343/expert_verified/points_label/a72134cd499fd1c4f79e091fa09130a.seg 02958343 +04379243/points/cc6fbdc6f2aa5ea3d889130b88839a0c.pts 04379243/expert_verified/points_label/cc6fbdc6f2aa5ea3d889130b88839a0c.seg 04379243 +03624134/points/85ced924eedc6ff566b5b592ed1ddee0.pts 03624134/expert_verified/points_label/85ced924eedc6ff566b5b592ed1ddee0.seg 03624134 +03001627/points/60622d74c0712934a5817f81a1efa3cc.pts 03001627/expert_verified/points_label/60622d74c0712934a5817f81a1efa3cc.seg 03001627 +04379243/points/2633f011b236a8979070b65ce7b4b532.pts 04379243/expert_verified/points_label/2633f011b236a8979070b65ce7b4b532.seg 04379243 +03001627/points/9d9d69e5f2bc80a867903707764646db.pts 03001627/expert_verified/points_label/9d9d69e5f2bc80a867903707764646db.seg 03001627 +03001627/points/ce463d63d8771c5ccf19858fd1963d10.pts 03001627/expert_verified/points_label/ce463d63d8771c5ccf19858fd1963d10.seg 03001627 +04379243/points/ad17445446e4fd3adcfcef693e7ec696.pts 04379243/expert_verified/points_label/ad17445446e4fd3adcfcef693e7ec696.seg 04379243 +03001627/points/71372c1f20b6a04c43c40c5aa3d5c5b7.pts 03001627/expert_verified/points_label/71372c1f20b6a04c43c40c5aa3d5c5b7.seg 03001627 +02691156/points/9436273fc1a5e3ca7af159eaf7625abf.pts 02691156/expert_verified/points_label/9436273fc1a5e3ca7af159eaf7625abf.seg 02691156 +03797390/points/b98fa11a567f644344b25d683fe71de.pts 03797390/expert_verified/points_label/b98fa11a567f644344b25d683fe71de.seg 03797390 +02691156/points/53eee66291c47a91bc0909d98a1ff2b4.pts 02691156/expert_verified/points_label/53eee66291c47a91bc0909d98a1ff2b4.seg 02691156 +03642806/points/e55ececde88255b93e73f3893a7337bb.pts 03642806/expert_verified/points_label/e55ececde88255b93e73f3893a7337bb.seg 03642806 +02958343/points/1079efee042629d4ce28f0f1b509eda.pts 02958343/expert_verified/points_label/1079efee042629d4ce28f0f1b509eda.seg 02958343 +03001627/points/c826c65111c867ab45a1df43bcd9e471.pts 03001627/expert_verified/points_label/c826c65111c867ab45a1df43bcd9e471.seg 03001627 +02958343/points/39201299cf83ec2577763486d77d1cb.pts 02958343/expert_verified/points_label/39201299cf83ec2577763486d77d1cb.seg 02958343 +04379243/points/e8c01f71fd941af11190e285a2cbc9c.pts 04379243/expert_verified/points_label/e8c01f71fd941af11190e285a2cbc9c.seg 04379243 +03001627/points/948f1555282e27da190c615a2115d2f7.pts 03001627/expert_verified/points_label/948f1555282e27da190c615a2115d2f7.seg 03001627 +02691156/points/ca4ec545363b3b8e8c2814a4ead9cb90.pts 02691156/expert_verified/points_label/ca4ec545363b3b8e8c2814a4ead9cb90.seg 02691156 +03001627/points/b8f4ce34b44620cc9b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/b8f4ce34b44620cc9b9f2eb77f5e247e.seg 03001627 +02958343/points/188621bbfc7d9477ce27281f3b76d1f5.pts 02958343/expert_verified/points_label/188621bbfc7d9477ce27281f3b76d1f5.seg 02958343 +04379243/points/9a71b92445cd3f023a9bc242c86fb7a0.pts 04379243/expert_verified/points_label/9a71b92445cd3f023a9bc242c86fb7a0.seg 04379243 +03001627/points/4372b33dfc84c2f56a9ab6fc87e1604e.pts 03001627/expert_verified/points_label/4372b33dfc84c2f56a9ab6fc87e1604e.seg 03001627 +03001627/points/b16f1858c1a7c0a65001cb19c4a0eee4.pts 03001627/expert_verified/points_label/b16f1858c1a7c0a65001cb19c4a0eee4.seg 03001627 +03467517/points/5238adec0790595930c206f77b5cb4d0.pts 03467517/expert_verified/points_label/5238adec0790595930c206f77b5cb4d0.seg 03467517 +02958343/points/3ec7f0347638f7a891eea2fc80d4a25f.pts 02958343/expert_verified/points_label/3ec7f0347638f7a891eea2fc80d4a25f.seg 02958343 +02691156/points/32e7224d196e5866bd564bd76cf3cbec.pts 02691156/expert_verified/points_label/32e7224d196e5866bd564bd76cf3cbec.seg 02691156 +04379243/points/f9beeefdebf70350f4b6538438a0b930.pts 04379243/expert_verified/points_label/f9beeefdebf70350f4b6538438a0b930.seg 04379243 +04379243/points/acbc99e153b9d4d419fb4103277a6b93.pts 04379243/expert_verified/points_label/acbc99e153b9d4d419fb4103277a6b93.seg 04379243 +03467517/points/8ebc3d48afeceec752561cc0fb924c36.pts 03467517/expert_verified/points_label/8ebc3d48afeceec752561cc0fb924c36.seg 03467517 +04379243/points/966cef675324e416cd415550f639925.pts 04379243/expert_verified/points_label/966cef675324e416cd415550f639925.seg 04379243 +03636649/points/85f71a4724fa37c33d39d8012919dd25.pts 03636649/expert_verified/points_label/85f71a4724fa37c33d39d8012919dd25.seg 03636649 +03636649/points/370623095c9773e42ce7d46577f8a9bd.pts 03636649/expert_verified/points_label/370623095c9773e42ce7d46577f8a9bd.seg 03636649 +03624134/points/bbe934c9cdca9c1839ec49305bb07d3d.pts 03624134/expert_verified/points_label/bbe934c9cdca9c1839ec49305bb07d3d.seg 03624134 +02958343/points/d22a2d20acbdca70c972ff3f74d38438.pts 02958343/expert_verified/points_label/d22a2d20acbdca70c972ff3f74d38438.seg 02958343 +02958343/points/ff3c8e21a48ed17cc1bcae9def1986da.pts 02958343/expert_verified/points_label/ff3c8e21a48ed17cc1bcae9def1986da.seg 02958343 +03001627/points/fd5ca05b59b30241d838ae16242881dc.pts 03001627/expert_verified/points_label/fd5ca05b59b30241d838ae16242881dc.seg 03001627 +02691156/points/e3aff5ae3e8f2a7c4c2c88971423d0be.pts 02691156/expert_verified/points_label/e3aff5ae3e8f2a7c4c2c88971423d0be.seg 02691156 +02691156/points/b4575e5e6161fd497b164268a44f7712.pts 02691156/expert_verified/points_label/b4575e5e6161fd497b164268a44f7712.seg 02691156 +03467517/points/153e7883f6cf0e66d57700c05b1862d8.pts 03467517/expert_verified/points_label/153e7883f6cf0e66d57700c05b1862d8.seg 03467517 +03642806/points/4fc3d56243d2d8801ef1ccfaf50f2048.pts 03642806/expert_verified/points_label/4fc3d56243d2d8801ef1ccfaf50f2048.seg 03642806 +04379243/points/ec9861c234daf6bc915f51b5f5e95ffa.pts 04379243/expert_verified/points_label/ec9861c234daf6bc915f51b5f5e95ffa.seg 04379243 +03001627/points/7114ef00fe68d053cccbd142483bf2e7.pts 03001627/expert_verified/points_label/7114ef00fe68d053cccbd142483bf2e7.seg 03001627 +02691156/points/e812f54386acd072d44f37c9e0fb10d0.pts 02691156/expert_verified/points_label/e812f54386acd072d44f37c9e0fb10d0.seg 02691156 +03001627/points/5490efbdadce792f524f4eb395a8604.pts 03001627/expert_verified/points_label/5490efbdadce792f524f4eb395a8604.seg 03001627 +03948459/points/42740af029297f1d9874fa4c7b1a4298.pts 03948459/expert_verified/points_label/42740af029297f1d9874fa4c7b1a4298.seg 03948459 +03001627/points/d1ec6e9b8063b7efd7f7a4c4609b0913.pts 03001627/expert_verified/points_label/d1ec6e9b8063b7efd7f7a4c4609b0913.seg 03001627 +04379243/points/4b11be42b0c0482dd94faaee2b20e2bf.pts 04379243/expert_verified/points_label/4b11be42b0c0482dd94faaee2b20e2bf.seg 04379243 +03001627/points/d29971cef754cc91cd8c5d1ba690a2c3.pts 03001627/expert_verified/points_label/d29971cef754cc91cd8c5d1ba690a2c3.seg 03001627 +04379243/points/8cc8485f249a37f595b25bd3accf45b5.pts 04379243/expert_verified/points_label/8cc8485f249a37f595b25bd3accf45b5.seg 04379243 +04379243/points/bb5dbf708d5eb7f82099f9e22ca45b04.pts 04379243/expert_verified/points_label/bb5dbf708d5eb7f82099f9e22ca45b04.seg 04379243 +03001627/points/c1b64fef5f3efa0a129905ebfd12d5cd.pts 03001627/expert_verified/points_label/c1b64fef5f3efa0a129905ebfd12d5cd.seg 03001627 +04379243/points/e58e958428584b2b79972b30518c97e2.pts 04379243/expert_verified/points_label/e58e958428584b2b79972b30518c97e2.seg 04379243 +03790512/points/90a521e0def2631fd5dde04c96fd8146.pts 03790512/expert_verified/points_label/90a521e0def2631fd5dde04c96fd8146.seg 03790512 +03467517/points/fcab134da044e5fc77f469126771fc30.pts 03467517/expert_verified/points_label/fcab134da044e5fc77f469126771fc30.seg 03467517 +03001627/points/1d6faeb6d77d1f2cf95cd8df6bebbc3a.pts 03001627/expert_verified/points_label/1d6faeb6d77d1f2cf95cd8df6bebbc3a.seg 03001627 +04379243/points/e993ddaf6d03003071a782a4379556c7.pts 04379243/expert_verified/points_label/e993ddaf6d03003071a782a4379556c7.seg 04379243 +03001627/points/702cebffa33a19f019f079d1b712f46f.pts 03001627/expert_verified/points_label/702cebffa33a19f019f079d1b712f46f.seg 03001627 +03790512/points/7b4eb8cbc470d0d6d5dde04c96fd8146.pts 03790512/expert_verified/points_label/7b4eb8cbc470d0d6d5dde04c96fd8146.seg 03790512 +03001627/points/9515e377c1ec86529b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/9515e377c1ec86529b9f2eb77f5e247e.seg 03001627 +03001627/points/9c3d7b65c739a618285330f26226f8fb.pts 03001627/expert_verified/points_label/9c3d7b65c739a618285330f26226f8fb.seg 03001627 +03790512/points/8ed4bdaf0c8b88ea8b31e74d456742c7.pts 03790512/expert_verified/points_label/8ed4bdaf0c8b88ea8b31e74d456742c7.seg 03790512 +02958343/points/6ed2957beeb7940a9fbaa69916aaebda.pts 02958343/expert_verified/points_label/6ed2957beeb7940a9fbaa69916aaebda.seg 02958343 +03001627/points/37e2b82d5e9dde21cbde89e0c48a01bf.pts 03001627/expert_verified/points_label/37e2b82d5e9dde21cbde89e0c48a01bf.seg 03001627 +04379243/points/1b6bd64fda74bdc4d6983f351200ac6a.pts 04379243/expert_verified/points_label/1b6bd64fda74bdc4d6983f351200ac6a.seg 04379243 +04379243/points/531381f5bbc69e485769b3af36a2ff9f.pts 04379243/expert_verified/points_label/531381f5bbc69e485769b3af36a2ff9f.seg 04379243 +03790512/points/992fbae5178edcbc4e31d0cb4d7568.pts 03790512/expert_verified/points_label/992fbae5178edcbc4e31d0cb4d7568.seg 03790512 +04379243/points/65e7fd8d158658106a76e23e6f966dea.pts 04379243/expert_verified/points_label/65e7fd8d158658106a76e23e6f966dea.seg 04379243 +02691156/points/2229bc4e646f506679f56e78e8640bfb.pts 02691156/expert_verified/points_label/2229bc4e646f506679f56e78e8640bfb.seg 02691156 +02954340/points/f40b47fcbf83b962f0d11ae402ef940e.pts 02954340/expert_verified/points_label/f40b47fcbf83b962f0d11ae402ef940e.seg 02954340 +02773838/points/cbc2328cadf8dc573394926146371698.pts 02773838/expert_verified/points_label/cbc2328cadf8dc573394926146371698.seg 02773838 +02958343/points/3c6d7c6ce950917b3a93df79ef2b80ef.pts 02958343/expert_verified/points_label/3c6d7c6ce950917b3a93df79ef2b80ef.seg 02958343 +02958343/points/2ccaaa66525d7f095473e57e894e0ef5.pts 02958343/expert_verified/points_label/2ccaaa66525d7f095473e57e894e0ef5.seg 02958343 +02691156/points/70d9304de59792a9515d73fcb34092fc.pts 02691156/expert_verified/points_label/70d9304de59792a9515d73fcb34092fc.seg 02691156 +03001627/points/2ed8d45343a442097869557127addfc0.pts 03001627/expert_verified/points_label/2ed8d45343a442097869557127addfc0.seg 03001627 +04379243/points/84f5e52756fc84f86df14337f24e49f4.pts 04379243/expert_verified/points_label/84f5e52756fc84f86df14337f24e49f4.seg 04379243 +03001627/points/b33a3b1627ad61eb8ca4809dcf42fe1.pts 03001627/expert_verified/points_label/b33a3b1627ad61eb8ca4809dcf42fe1.seg 03001627 +04379243/points/369c19c0971221f3664b3b9b23ddfcbc.pts 04379243/expert_verified/points_label/369c19c0971221f3664b3b9b23ddfcbc.seg 04379243 +03642806/points/5a13f7551c20eb29f3ebfe51dc60263e.pts 03642806/expert_verified/points_label/5a13f7551c20eb29f3ebfe51dc60263e.seg 03642806 +04379243/points/1b01ef65920c342323bdffac38e6b250.pts 04379243/expert_verified/points_label/1b01ef65920c342323bdffac38e6b250.seg 04379243 +02691156/points/9b687f9cff46d43d89c2da356f872ebc.pts 02691156/expert_verified/points_label/9b687f9cff46d43d89c2da356f872ebc.seg 02691156 +04379243/points/746ceaf694d85eb5d5192f88466da1dc.pts 04379243/expert_verified/points_label/746ceaf694d85eb5d5192f88466da1dc.seg 04379243 +04379243/points/9f4eb0d734a2b7a4ab610b0c94236463.pts 04379243/expert_verified/points_label/9f4eb0d734a2b7a4ab610b0c94236463.seg 04379243 +03001627/points/a1213da0e7efffcafebad4f49b26ec52.pts 03001627/expert_verified/points_label/a1213da0e7efffcafebad4f49b26ec52.seg 03001627 +02958343/points/71b00ea32b1810ac373af83f3f2fe606.pts 02958343/expert_verified/points_label/71b00ea32b1810ac373af83f3f2fe606.seg 02958343 +02691156/points/52a84fea7c314f4c3dfc741b4df74043.pts 02691156/expert_verified/points_label/52a84fea7c314f4c3dfc741b4df74043.seg 02691156 +02958343/points/9f3c463272d13d39eb7780cdb3ece367.pts 02958343/expert_verified/points_label/9f3c463272d13d39eb7780cdb3ece367.seg 02958343 +03001627/points/def03f645b3fbd665bb93149cc0adf0.pts 03001627/expert_verified/points_label/def03f645b3fbd665bb93149cc0adf0.seg 03001627 +03001627/points/f9e386d968653602d68fb8f5d99affa0.pts 03001627/expert_verified/points_label/f9e386d968653602d68fb8f5d99affa0.seg 03001627 +03467517/points/9c399ebc617349dcd016bd20f13ab302.pts 03467517/expert_verified/points_label/9c399ebc617349dcd016bd20f13ab302.seg 03467517 +04379243/points/aaaba1bbe037d3b1e406974af41e8842.pts 04379243/expert_verified/points_label/aaaba1bbe037d3b1e406974af41e8842.seg 04379243 +03001627/points/4030ea84b560b857febad4f49b26ec52.pts 03001627/expert_verified/points_label/4030ea84b560b857febad4f49b26ec52.seg 03001627 +04379243/points/a38405108fb416d8356ca1f9220b9968.pts 04379243/expert_verified/points_label/a38405108fb416d8356ca1f9220b9968.seg 04379243 +04379243/points/f864677894410315ab610b0c94236463.pts 04379243/expert_verified/points_label/f864677894410315ab610b0c94236463.seg 04379243 +02954340/points/da5e5ec4c486d6c03baa6271927f050e.pts 02954340/expert_verified/points_label/da5e5ec4c486d6c03baa6271927f050e.seg 02954340 +02691156/points/eed299b690be51ffbd931fcaa69140.pts 02691156/expert_verified/points_label/eed299b690be51ffbd931fcaa69140.seg 02691156 +03797390/points/b4ae56d6638d5338de671f28c83d2dcb.pts 03797390/expert_verified/points_label/b4ae56d6638d5338de671f28c83d2dcb.seg 03797390 +04379243/points/10cc8c941fc8aeaa71a782a4379556c7.pts 04379243/expert_verified/points_label/10cc8c941fc8aeaa71a782a4379556c7.seg 04379243 +03636649/points/61b57e8b5da8fb13d527a9a6f5a872b9.pts 03636649/expert_verified/points_label/61b57e8b5da8fb13d527a9a6f5a872b9.seg 03636649 +02691156/points/ae4a9574248395b671d03b466c72ce41.pts 02691156/expert_verified/points_label/ae4a9574248395b671d03b466c72ce41.seg 02691156 +04379243/points/8cfe3ff92244310534506cc3910614fe.pts 04379243/expert_verified/points_label/8cfe3ff92244310534506cc3910614fe.seg 04379243 +03001627/points/597cb92a5bfb580eed98cca8f0ccd5f7.pts 03001627/expert_verified/points_label/597cb92a5bfb580eed98cca8f0ccd5f7.seg 03001627 +03001627/points/4231883e92a3c1a21c62d11641ffbd35.pts 03001627/expert_verified/points_label/4231883e92a3c1a21c62d11641ffbd35.seg 03001627 +03636649/points/28793511c46b4fa030f6e0ede20c4525.pts 03636649/expert_verified/points_label/28793511c46b4fa030f6e0ede20c4525.seg 03636649 +02958343/points/4c60f32b6efdc7217dfb1ee6a4b12bf8.pts 02958343/expert_verified/points_label/4c60f32b6efdc7217dfb1ee6a4b12bf8.seg 02958343 +04379243/points/397c56f15e547fad1bb088904f7cb154.pts 04379243/expert_verified/points_label/397c56f15e547fad1bb088904f7cb154.seg 04379243 +04379243/points/9bb816d6a3517a5ca74c2333655a11dd.pts 04379243/expert_verified/points_label/9bb816d6a3517a5ca74c2333655a11dd.seg 04379243 +03790512/points/bae59e64a50d3aa2f68f798d07e007b6.pts 03790512/expert_verified/points_label/bae59e64a50d3aa2f68f798d07e007b6.seg 03790512 +04379243/points/8b094873d775f6e21130871dbfe24c18.pts 04379243/expert_verified/points_label/8b094873d775f6e21130871dbfe24c18.seg 04379243 +04379243/points/4d2f7c689e77df6b6dc1766995c17a41.pts 04379243/expert_verified/points_label/4d2f7c689e77df6b6dc1766995c17a41.seg 04379243 +03467517/points/16916a50a064304bf6ed0b697979412e.pts 03467517/expert_verified/points_label/16916a50a064304bf6ed0b697979412e.seg 03467517 +03636649/points/c802fa4c82498450af6016f34c89d087.pts 03636649/expert_verified/points_label/c802fa4c82498450af6016f34c89d087.seg 03636649 +03001627/points/1ec5a88141aefca9cf6e4dd7ee69d71f.pts 03001627/expert_verified/points_label/1ec5a88141aefca9cf6e4dd7ee69d71f.seg 03001627 +04379243/points/bdefbb1f281434e39961e1085a81acc5.pts 04379243/expert_verified/points_label/bdefbb1f281434e39961e1085a81acc5.seg 04379243 +04379243/points/acf57dbafe8966f577fb15a8d7923976.pts 04379243/expert_verified/points_label/acf57dbafe8966f577fb15a8d7923976.seg 04379243 +03642806/points/cc67f6608c41743ec1830f8ca7a3cbed.pts 03642806/expert_verified/points_label/cc67f6608c41743ec1830f8ca7a3cbed.seg 03642806 +03001627/points/95e1571acdd75922afdb9a672b7d3b8a.pts 03001627/expert_verified/points_label/95e1571acdd75922afdb9a672b7d3b8a.seg 03001627 +04379243/points/2ebe5dfb7bd9a50c6effbd64ad6b71b8.pts 04379243/expert_verified/points_label/2ebe5dfb7bd9a50c6effbd64ad6b71b8.seg 04379243 +03001627/points/a6420c4ed13cf628945a77b945b7b70f.pts 03001627/expert_verified/points_label/a6420c4ed13cf628945a77b945b7b70f.seg 03001627 +04379243/points/1de679dd26d8c69cae44c65a6d0f0732.pts 04379243/expert_verified/points_label/1de679dd26d8c69cae44c65a6d0f0732.seg 04379243 +03001627/points/271012d5de261d08101accd22c701b9.pts 03001627/expert_verified/points_label/271012d5de261d08101accd22c701b9.seg 03001627 +04379243/points/5e409a2627f7cd7d63ecd64ef0e6814c.pts 04379243/expert_verified/points_label/5e409a2627f7cd7d63ecd64ef0e6814c.seg 04379243 +02691156/points/c9aeb20d7cd1b3b45e9e2656aff7dd5b.pts 02691156/expert_verified/points_label/c9aeb20d7cd1b3b45e9e2656aff7dd5b.seg 02691156 +04379243/points/45b23ac79688170893ba1eeaf62819a2.pts 04379243/expert_verified/points_label/45b23ac79688170893ba1eeaf62819a2.seg 04379243 +02691156/points/9ac292686a2fcebbe719b5362fe06bbb.pts 02691156/expert_verified/points_label/9ac292686a2fcebbe719b5362fe06bbb.seg 02691156 +04379243/points/3b0c62bde7b24de85ce578b5b4bfae3c.pts 04379243/expert_verified/points_label/3b0c62bde7b24de85ce578b5b4bfae3c.seg 04379243 +02958343/points/c487e9850891e1ec2d15396b7bcc6366.pts 02958343/expert_verified/points_label/c487e9850891e1ec2d15396b7bcc6366.seg 02958343 +03636649/points/b8e25e0825cb5db7765609a3f435fe9d.pts 03636649/expert_verified/points_label/b8e25e0825cb5db7765609a3f435fe9d.seg 03636649 +03001627/points/9fd6bb18dc21c70766ef9dd2f3ef27d3.pts 03001627/expert_verified/points_label/9fd6bb18dc21c70766ef9dd2f3ef27d3.seg 03001627 +02958343/points/bf37249fc8e16fd8f9a88cc63b910f3.pts 02958343/expert_verified/points_label/bf37249fc8e16fd8f9a88cc63b910f3.seg 02958343 +04225987/points/58ae991bd0350810b9ac379f661f5c75.pts 04225987/expert_verified/points_label/58ae991bd0350810b9ac379f661f5c75.seg 04225987 +03001627/points/508306f8ddf1b54c41cc9e8c39b4e399.pts 03001627/expert_verified/points_label/508306f8ddf1b54c41cc9e8c39b4e399.seg 03001627 +03642806/points/ef5b312fc20f1b20aab089a6db538ba7.pts 03642806/expert_verified/points_label/ef5b312fc20f1b20aab089a6db538ba7.seg 03642806 +03001627/points/d97c5945e9449a58737e4e0df09d751.pts 03001627/expert_verified/points_label/d97c5945e9449a58737e4e0df09d751.seg 03001627 +03001627/points/e1897a4391784bc2e8b2b8dc0c816caf.pts 03001627/expert_verified/points_label/e1897a4391784bc2e8b2b8dc0c816caf.seg 03001627 +04379243/points/a624ebf0bf0451a8d93768e7b9b1eabf.pts 04379243/expert_verified/points_label/a624ebf0bf0451a8d93768e7b9b1eabf.seg 04379243 +03636649/points/1e5e1ff56c27c0d2adc5f5aafedb1c38.pts 03636649/expert_verified/points_label/1e5e1ff56c27c0d2adc5f5aafedb1c38.seg 03636649 +03642806/points/2ce3a50ca6087f30d8e007cc6755cce9.pts 03642806/expert_verified/points_label/2ce3a50ca6087f30d8e007cc6755cce9.seg 03642806 +02691156/points/d615a8217b70af06bc0909d98a1ff2b4.pts 02691156/expert_verified/points_label/d615a8217b70af06bc0909d98a1ff2b4.seg 02691156 +02691156/points/6f72a0d86494b551a834b9c8bfc8647a.pts 02691156/expert_verified/points_label/6f72a0d86494b551a834b9c8bfc8647a.seg 02691156 +03001627/points/20fbab2b8770a1cbf51f77a6d7299806.pts 03001627/expert_verified/points_label/20fbab2b8770a1cbf51f77a6d7299806.seg 03001627 +03001627/points/d239d38424429a9a4626612b5d655dc.pts 03001627/expert_verified/points_label/d239d38424429a9a4626612b5d655dc.seg 03001627 +03001627/points/4c97f421c4ea4396d8ac5d7ad0953104.pts 03001627/expert_verified/points_label/4c97f421c4ea4396d8ac5d7ad0953104.seg 03001627 +03001627/points/5b68a6c2baf0ad61d0de9c949c366777.pts 03001627/expert_verified/points_label/5b68a6c2baf0ad61d0de9c949c366777.seg 03001627 +04379243/points/9bd1c242bd66d2fbb63c01786992bd2f.pts 04379243/expert_verified/points_label/9bd1c242bd66d2fbb63c01786992bd2f.seg 04379243 +03001627/points/e2dbe84030167f1ca5aad165050e534c.pts 03001627/expert_verified/points_label/e2dbe84030167f1ca5aad165050e534c.seg 03001627 +03001627/points/1c17cc67b8c747c3febad4f49b26ec52.pts 03001627/expert_verified/points_label/1c17cc67b8c747c3febad4f49b26ec52.seg 03001627 +04379243/points/2766a883126503cac3bd24f986301745.pts 04379243/expert_verified/points_label/2766a883126503cac3bd24f986301745.seg 04379243 +04225987/points/755dc44dae7791761082f2ea630bf69e.pts 04225987/expert_verified/points_label/755dc44dae7791761082f2ea630bf69e.seg 04225987 +04379243/points/c38ba6c06d2b813230c589758b4b5646.pts 04379243/expert_verified/points_label/c38ba6c06d2b813230c589758b4b5646.seg 04379243 +02691156/points/44c0cb6571f6f000ca8607f540cc62ba.pts 02691156/expert_verified/points_label/44c0cb6571f6f000ca8607f540cc62ba.seg 02691156 +03636649/points/522bc10920249e67141c66e2b49d221.pts 03636649/expert_verified/points_label/522bc10920249e67141c66e2b49d221.seg 03636649 +03790512/points/4548d86cf7f1c11ad373c34785838ee4.pts 03790512/expert_verified/points_label/4548d86cf7f1c11ad373c34785838ee4.seg 03790512 +02958343/points/37c5ac3d5b34761add75f724c0ccbe00.pts 02958343/expert_verified/points_label/37c5ac3d5b34761add75f724c0ccbe00.seg 02958343 +04379243/points/a15f31e2302f6ae5d67a73ffd62ba73f.pts 04379243/expert_verified/points_label/a15f31e2302f6ae5d67a73ffd62ba73f.seg 04379243 +02958343/points/6d714f7b7170a581da8e502a3c6cb4fb.pts 02958343/expert_verified/points_label/6d714f7b7170a581da8e502a3c6cb4fb.seg 02958343 +03624134/points/17c4163247e9237d4b7644126b1d71e0.pts 03624134/expert_verified/points_label/17c4163247e9237d4b7644126b1d71e0.seg 03624134 +03636649/points/7972fd0fe5755b4ad42b9650f19dd425.pts 03636649/expert_verified/points_label/7972fd0fe5755b4ad42b9650f19dd425.seg 03636649 +03001627/points/8ff4ba87d700054546992ce9fde1b2c2.pts 03001627/expert_verified/points_label/8ff4ba87d700054546992ce9fde1b2c2.seg 03001627 +03636649/points/a654df55875a2104d663817442d5278.pts 03636649/expert_verified/points_label/a654df55875a2104d663817442d5278.seg 03636649 +04379243/points/9c12fada31224bdf58c4e7e56d799d97.pts 04379243/expert_verified/points_label/9c12fada31224bdf58c4e7e56d799d97.seg 04379243 +03636649/points/9dad7ce60aa168d72cd2160e449d45ae.pts 03636649/expert_verified/points_label/9dad7ce60aa168d72cd2160e449d45ae.seg 03636649 +02691156/points/cfb555a4d82a600aca8607f540cc62ba.pts 02691156/expert_verified/points_label/cfb555a4d82a600aca8607f540cc62ba.seg 02691156 +04379243/points/415c174ecdc612fb6f5c30e29039b12d.pts 04379243/expert_verified/points_label/415c174ecdc612fb6f5c30e29039b12d.seg 04379243 +03467517/points/a5e2f05386e4ba55a894e1aba5d3799a.pts 03467517/expert_verified/points_label/a5e2f05386e4ba55a894e1aba5d3799a.seg 03467517 +03001627/points/a91b2c89e543a4b3aa3d970c5602cd4a.pts 03001627/expert_verified/points_label/a91b2c89e543a4b3aa3d970c5602cd4a.seg 03001627 +03624134/points/97ed13011e2d85e16029317225a75a9f.pts 03624134/expert_verified/points_label/97ed13011e2d85e16029317225a75a9f.seg 03624134 +04379243/points/388ea3f8ba27da8b777b6246417c94ff.pts 04379243/expert_verified/points_label/388ea3f8ba27da8b777b6246417c94ff.seg 04379243 +04379243/points/983cd9caf65adf1ddf6cfab91d65bb91.pts 04379243/expert_verified/points_label/983cd9caf65adf1ddf6cfab91d65bb91.seg 04379243 +03001627/points/e65d2f0ed75a786a37b2bb75885cfc44.pts 03001627/expert_verified/points_label/e65d2f0ed75a786a37b2bb75885cfc44.seg 03001627 +03624134/points/dce941899bcb752dfe474f09e3f3ac9a.pts 03624134/expert_verified/points_label/dce941899bcb752dfe474f09e3f3ac9a.seg 03624134 +04379243/points/ea3bcd9e6c4205031964126395b17c2a.pts 04379243/expert_verified/points_label/ea3bcd9e6c4205031964126395b17c2a.seg 04379243 +02691156/points/d13d131a649c5df38b96ae1a0a8b84ec.pts 02691156/expert_verified/points_label/d13d131a649c5df38b96ae1a0a8b84ec.seg 02691156 +04379243/points/f917474a20558aa33bbab77a66bc3671.pts 04379243/expert_verified/points_label/f917474a20558aa33bbab77a66bc3671.seg 04379243 +03001627/points/4a24652fbf2bed7e93583c67df8faf1.pts 03001627/expert_verified/points_label/4a24652fbf2bed7e93583c67df8faf1.seg 03001627 +02691156/points/5dd2324cd6ebf52e293fdbda4e7beec9.pts 02691156/expert_verified/points_label/5dd2324cd6ebf52e293fdbda4e7beec9.seg 02691156 +03642806/points/a59d3d87068d313c2656684d670220c2.pts 03642806/expert_verified/points_label/a59d3d87068d313c2656684d670220c2.seg 03642806 +04379243/points/5354ecb0e3aa1da074a16879fb3ac81f.pts 04379243/expert_verified/points_label/5354ecb0e3aa1da074a16879fb3ac81f.seg 04379243 +03642806/points/6c6a96e4486cc02cda66ecbb2c411f37.pts 03642806/expert_verified/points_label/6c6a96e4486cc02cda66ecbb2c411f37.seg 03642806 +04225987/points/fd3627deb2476b0f1f942c57ac0e8959.pts 04225987/expert_verified/points_label/fd3627deb2476b0f1f942c57ac0e8959.seg 04225987 +04379243/points/91bf48934d3b52ea36658c6705d0c08.pts 04379243/expert_verified/points_label/91bf48934d3b52ea36658c6705d0c08.seg 04379243 +04379243/points/18be1556eb4da5af7ccf848ce05c84be.pts 04379243/expert_verified/points_label/18be1556eb4da5af7ccf848ce05c84be.seg 04379243 +02958343/points/33211aabfefa14603b05c2ad25b4380f.pts 02958343/expert_verified/points_label/33211aabfefa14603b05c2ad25b4380f.seg 02958343 +04379243/points/3243ddb2aa4d1659beb83c64f2162734.pts 04379243/expert_verified/points_label/3243ddb2aa4d1659beb83c64f2162734.seg 04379243 +04379243/points/4ce90fe70faf4c3e255bc16374754e69.pts 04379243/expert_verified/points_label/4ce90fe70faf4c3e255bc16374754e69.seg 04379243 +04379243/points/15be511a2433482aa192483aa282f8e5.pts 04379243/expert_verified/points_label/15be511a2433482aa192483aa282f8e5.seg 04379243 +03624134/points/70b6b3ba6a27fd6f782db73f915dfbb8.pts 03624134/expert_verified/points_label/70b6b3ba6a27fd6f782db73f915dfbb8.seg 03624134 +03001627/points/519d19f3adebd20aba49014d9a3afe99.pts 03001627/expert_verified/points_label/519d19f3adebd20aba49014d9a3afe99.seg 03001627 +03467517/points/ca9720d793355dd693f0194265a9746c.pts 03467517/expert_verified/points_label/ca9720d793355dd693f0194265a9746c.seg 03467517 +03001627/points/e19214cabca496a3f7b54e04c7238d7.pts 03001627/expert_verified/points_label/e19214cabca496a3f7b54e04c7238d7.seg 03001627 +03001627/points/ea1bfe81b88395fcaa29e9f0529e8ef7.pts 03001627/expert_verified/points_label/ea1bfe81b88395fcaa29e9f0529e8ef7.seg 03001627 +03001627/points/2b110b833111b38c420adf24e49f74c8.pts 03001627/expert_verified/points_label/2b110b833111b38c420adf24e49f74c8.seg 03001627 +03001627/points/7b405c1d6d2dbea9f91663a74ccd2338.pts 03001627/expert_verified/points_label/7b405c1d6d2dbea9f91663a74ccd2338.seg 03001627 +02691156/points/489d3e4cc3d790a0ca8607f540cc62ba.pts 02691156/expert_verified/points_label/489d3e4cc3d790a0ca8607f540cc62ba.seg 02691156 +04379243/points/79eeee790ed5a5aac242632b2a8c3129.pts 04379243/expert_verified/points_label/79eeee790ed5a5aac242632b2a8c3129.seg 04379243 +03624134/points/665bf5d30d342d64adee73efb2c043f8.pts 03624134/expert_verified/points_label/665bf5d30d342d64adee73efb2c043f8.seg 03624134 +03467517/points/7f3f5c9953fb7e0a6cbec6f3d994a573.pts 03467517/expert_verified/points_label/7f3f5c9953fb7e0a6cbec6f3d994a573.seg 03467517 +03001627/points/d2597d18fdc3594e1dc59d2adbe5297d.pts 03001627/expert_verified/points_label/d2597d18fdc3594e1dc59d2adbe5297d.seg 03001627 +03001627/points/a9a1147eae9936f76f1e07a56c129dfc.pts 03001627/expert_verified/points_label/a9a1147eae9936f76f1e07a56c129dfc.seg 03001627 +02691156/points/64cb683afd5e9e559db1d21b460eacef.pts 02691156/expert_verified/points_label/64cb683afd5e9e559db1d21b460eacef.seg 02691156 +03624134/points/e0a78d771cfde145a5cea7e40e4d21ff.pts 03624134/expert_verified/points_label/e0a78d771cfde145a5cea7e40e4d21ff.seg 03624134 +02691156/points/e59c4f290d8585a862b600da24e0965.pts 02691156/expert_verified/points_label/e59c4f290d8585a862b600da24e0965.seg 02691156 +04379243/points/523ac3575244c7f3a130bbab7337a0cf.pts 04379243/expert_verified/points_label/523ac3575244c7f3a130bbab7337a0cf.seg 04379243 +03001627/points/96e83c79e8d76d4519fb4103277a6b93.pts 03001627/expert_verified/points_label/96e83c79e8d76d4519fb4103277a6b93.seg 03001627 +04379243/points/a2781622b5941ff2a886fe6408aa7382.pts 04379243/expert_verified/points_label/a2781622b5941ff2a886fe6408aa7382.seg 04379243 +04379243/points/5d24567426a614ecfd726e98b98fb36f.pts 04379243/expert_verified/points_label/5d24567426a614ecfd726e98b98fb36f.seg 04379243 +03001627/points/a5a2d09e5384237869513d0907f19c8f.pts 03001627/expert_verified/points_label/a5a2d09e5384237869513d0907f19c8f.seg 03001627 +02691156/points/e02485f093835f45c1b64d86df61366a.pts 02691156/expert_verified/points_label/e02485f093835f45c1b64d86df61366a.seg 02691156 +04379243/points/58f8fd169c9578e62f81cb887dc35578.pts 04379243/expert_verified/points_label/58f8fd169c9578e62f81cb887dc35578.seg 04379243 +04379243/points/c755eeaa4a588fcba9126dd5adc92c1e.pts 04379243/expert_verified/points_label/c755eeaa4a588fcba9126dd5adc92c1e.seg 04379243 +03001627/points/704179dd47a2282e676de9b6e111da8b.pts 03001627/expert_verified/points_label/704179dd47a2282e676de9b6e111da8b.seg 03001627 +03001627/points/9253f198c06794cdc7689830acac6e59.pts 03001627/expert_verified/points_label/9253f198c06794cdc7689830acac6e59.seg 03001627 +04379243/points/2ba8eb5ec0a05694593ebeeedbff73b.pts 04379243/expert_verified/points_label/2ba8eb5ec0a05694593ebeeedbff73b.seg 04379243 +03467517/points/133ebdf2ca7bf4b81d4e8021f58beea0.pts 03467517/expert_verified/points_label/133ebdf2ca7bf4b81d4e8021f58beea0.seg 03467517 +03467517/points/ba6d3dcff42ea7bba32c4b8efb0131e.pts 03467517/expert_verified/points_label/ba6d3dcff42ea7bba32c4b8efb0131e.seg 03467517 +03467517/points/222b705a80d75a4343b0b12983b9982.pts 03467517/expert_verified/points_label/222b705a80d75a4343b0b12983b9982.seg 03467517 +04379243/points/47317755c82114d5c3bd24f986301745.pts 04379243/expert_verified/points_label/47317755c82114d5c3bd24f986301745.seg 04379243 +04379243/points/175c0be26d0f2e916cb0bd372b0960ba.pts 04379243/expert_verified/points_label/175c0be26d0f2e916cb0bd372b0960ba.seg 04379243 +03636649/points/19388898dd69dd9fddc8e6d1ec6242c3.pts 03636649/expert_verified/points_label/19388898dd69dd9fddc8e6d1ec6242c3.seg 03636649 +04379243/points/3cec584145ee513d635418e95eea8a17.pts 04379243/expert_verified/points_label/3cec584145ee513d635418e95eea8a17.seg 04379243 +03001627/points/3a5c8d46fdc6793b956abdbfba57903a.pts 03001627/expert_verified/points_label/3a5c8d46fdc6793b956abdbfba57903a.seg 03001627 +03001627/points/3d32d89db2286377e63c6421b71f17c8.pts 03001627/expert_verified/points_label/3d32d89db2286377e63c6421b71f17c8.seg 03001627 +03001627/points/47a45ce9fb219083411e8b42940aba04.pts 03001627/expert_verified/points_label/47a45ce9fb219083411e8b42940aba04.seg 03001627 +03467517/points/214f6a08b78670de2cb522418d5742a0.pts 03467517/expert_verified/points_label/214f6a08b78670de2cb522418d5742a0.seg 03467517 +04379243/points/1b4bc147baf68d4ff008d8a3590fb522.pts 04379243/expert_verified/points_label/1b4bc147baf68d4ff008d8a3590fb522.seg 04379243 +03467517/points/83b2ecf5caced214e313875ff213ee10.pts 03467517/expert_verified/points_label/83b2ecf5caced214e313875ff213ee10.seg 03467517 +02691156/points/57fe8ad460bcb4929a4a28ef635593ce.pts 02691156/expert_verified/points_label/57fe8ad460bcb4929a4a28ef635593ce.seg 02691156 +03624134/points/e8a6915bd0bcf1bebaa284808a1567a8.pts 03624134/expert_verified/points_label/e8a6915bd0bcf1bebaa284808a1567a8.seg 03624134 +03001627/points/1da29597f89c2b004b3c42e318f3affc.pts 03001627/expert_verified/points_label/1da29597f89c2b004b3c42e318f3affc.seg 03001627 +04379243/points/2ef899e67eecef65190a91fd9a6f7d55.pts 04379243/expert_verified/points_label/2ef899e67eecef65190a91fd9a6f7d55.seg 04379243 +04379243/points/811a7be3be14bd2b62103e4bff47b4cd.pts 04379243/expert_verified/points_label/811a7be3be14bd2b62103e4bff47b4cd.seg 04379243 +03948459/points/592017db407391c68e7e947594effe19.pts 03948459/expert_verified/points_label/592017db407391c68e7e947594effe19.seg 03948459 +03636649/points/eb311e6232cb7011bb5bd941c6665c21.pts 03636649/expert_verified/points_label/eb311e6232cb7011bb5bd941c6665c21.seg 03636649 +02691156/points/caa7e70beee4543f42c20743f866e1a6.pts 02691156/expert_verified/points_label/caa7e70beee4543f42c20743f866e1a6.seg 02691156 +03001627/points/3aaa59b19eebcb5f41552c6ecbda964b.pts 03001627/expert_verified/points_label/3aaa59b19eebcb5f41552c6ecbda964b.seg 03001627 +03001627/points/a93aac9ad86008e69fc01fb65ca37d30.pts 03001627/expert_verified/points_label/a93aac9ad86008e69fc01fb65ca37d30.seg 03001627 +03624134/points/ceeb38ab7929361e76ec14627bf6bbcb.pts 03624134/expert_verified/points_label/ceeb38ab7929361e76ec14627bf6bbcb.seg 03624134 +03001627/points/93dc91115a9002e1663fcfd6703c85f3.pts 03001627/expert_verified/points_label/93dc91115a9002e1663fcfd6703c85f3.seg 03001627 +04379243/points/b08310a1d75702eda09ce9c1262c7237.pts 04379243/expert_verified/points_label/b08310a1d75702eda09ce9c1262c7237.seg 04379243 +03797390/points/e9bd4ee553eb35c1d5ccc40b510e4bd.pts 03797390/expert_verified/points_label/e9bd4ee553eb35c1d5ccc40b510e4bd.seg 03797390 +03001627/points/bdd57499bf64fab6bf80985a99195eb8.pts 03001627/expert_verified/points_label/bdd57499bf64fab6bf80985a99195eb8.seg 03001627 +04379243/points/48af84a5600ad5bc19fb4103277a6b93.pts 04379243/expert_verified/points_label/48af84a5600ad5bc19fb4103277a6b93.seg 04379243 +03001627/points/738395f54b301d80b1f5d603f931c1aa.pts 03001627/expert_verified/points_label/738395f54b301d80b1f5d603f931c1aa.seg 03001627 +03790512/points/6819949f5625ca12d0f568c31c1cd62a.pts 03790512/expert_verified/points_label/6819949f5625ca12d0f568c31c1cd62a.seg 03790512 +03467517/points/70d9a5d0330abd9df4b498e11fb60a4b.pts 03467517/expert_verified/points_label/70d9a5d0330abd9df4b498e11fb60a4b.seg 03467517 +02958343/points/174f1a421f652029d577c0ac53e96823.pts 02958343/expert_verified/points_label/174f1a421f652029d577c0ac53e96823.seg 02958343 +03001627/points/d764960666572084b1ea4e06e88051f3.pts 03001627/expert_verified/points_label/d764960666572084b1ea4e06e88051f3.seg 03001627 +02691156/points/ba662ec78231c493252b4f9439ef95a6.pts 02691156/expert_verified/points_label/ba662ec78231c493252b4f9439ef95a6.seg 02691156 +03636649/points/8a9f2e5b726ea37f60ad823977adaa23.pts 03636649/expert_verified/points_label/8a9f2e5b726ea37f60ad823977adaa23.seg 03636649 +04379243/points/80af0f92ecf69f69f5ff054d67d5fe35.pts 04379243/expert_verified/points_label/80af0f92ecf69f69f5ff054d67d5fe35.seg 04379243 +04379243/points/ce4e075487aa05ecdcfcef693e7ec696.pts 04379243/expert_verified/points_label/ce4e075487aa05ecdcfcef693e7ec696.seg 04379243 +03001627/points/564f5f96bc718194166420d06689fcf.pts 03001627/expert_verified/points_label/564f5f96bc718194166420d06689fcf.seg 03001627 +03636649/points/88d29e1350eda810c066b9622c005c53.pts 03636649/expert_verified/points_label/88d29e1350eda810c066b9622c005c53.seg 03636649 +04379243/points/346db24c1279e8d273fdbe4b39ff4036.pts 04379243/expert_verified/points_label/346db24c1279e8d273fdbe4b39ff4036.seg 04379243 +04379243/points/7062f5b229674ab7b0b54dd2cf2a35d4.pts 04379243/expert_verified/points_label/7062f5b229674ab7b0b54dd2cf2a35d4.seg 04379243 +03636649/points/923097cec128ae77469cbaa3d6420fb4.pts 03636649/expert_verified/points_label/923097cec128ae77469cbaa3d6420fb4.seg 03636649 +04379243/points/3fb5033b5ddaaf365f7afad12924b3b5.pts 04379243/expert_verified/points_label/3fb5033b5ddaaf365f7afad12924b3b5.seg 04379243 +03636649/points/32e9d8a4b5a141a2615efc34c3b36ef0.pts 03636649/expert_verified/points_label/32e9d8a4b5a141a2615efc34c3b36ef0.seg 03636649 +02691156/points/997cb29f544d6f2726360e1e29a956c7.pts 02691156/expert_verified/points_label/997cb29f544d6f2726360e1e29a956c7.seg 02691156 +04379243/points/7df9115b511668bdde98d10ab5975b59.pts 04379243/expert_verified/points_label/7df9115b511668bdde98d10ab5975b59.seg 04379243 +03636649/points/5580b95ab8e7806c6c5b8009db95f66f.pts 03636649/expert_verified/points_label/5580b95ab8e7806c6c5b8009db95f66f.seg 03636649 +04379243/points/6862bebc1f59a5caac7bed72580dc30f.pts 04379243/expert_verified/points_label/6862bebc1f59a5caac7bed72580dc30f.seg 04379243 +02691156/points/56ba815f883279b462b600da24e0965.pts 02691156/expert_verified/points_label/56ba815f883279b462b600da24e0965.seg 02691156 +03797390/points/5c48d471200d2bf16e8a121e6886e18d.pts 03797390/expert_verified/points_label/5c48d471200d2bf16e8a121e6886e18d.seg 03797390 +04379243/points/b48d04600e7cf2bebeedb4c8fd29e2d1.pts 04379243/expert_verified/points_label/b48d04600e7cf2bebeedb4c8fd29e2d1.seg 04379243 +02958343/points/323c9dc2a8911e146f2f07de403e98d8.pts 02958343/expert_verified/points_label/323c9dc2a8911e146f2f07de403e98d8.seg 02958343 +04225987/points/d3ff56062272f3e6346e65609be6d72f.pts 04225987/expert_verified/points_label/d3ff56062272f3e6346e65609be6d72f.seg 04225987 +03001627/points/af28dbdce6ed8cea19fb4103277a6b93.pts 03001627/expert_verified/points_label/af28dbdce6ed8cea19fb4103277a6b93.seg 03001627 +02958343/points/dfa6c32dec07727ee9d8921ebe6d5b8e.pts 02958343/expert_verified/points_label/dfa6c32dec07727ee9d8921ebe6d5b8e.seg 02958343 +03001627/points/c2b898dd5601454d626d7e3d07da8352.pts 03001627/expert_verified/points_label/c2b898dd5601454d626d7e3d07da8352.seg 03001627 +04379243/points/a7ef45d86ae5b496a97f238e46bc2221.pts 04379243/expert_verified/points_label/a7ef45d86ae5b496a97f238e46bc2221.seg 04379243 +04379243/points/1bd138c3e54a75d32f38c0d2792fb5e.pts 04379243/expert_verified/points_label/1bd138c3e54a75d32f38c0d2792fb5e.seg 04379243 +02958343/points/cd67376cac9f989151008e496c6cfd2e.pts 02958343/expert_verified/points_label/cd67376cac9f989151008e496c6cfd2e.seg 02958343 +03948459/points/af9eaed1d9574387ab2c2809513f396e.pts 03948459/expert_verified/points_label/af9eaed1d9574387ab2c2809513f396e.seg 03948459 +04379243/points/c418195771c7625945821c000807c3b1.pts 04379243/expert_verified/points_label/c418195771c7625945821c000807c3b1.seg 04379243 +04379243/points/88b227c5fb3906ce47c638c0eee4a2b3.pts 04379243/expert_verified/points_label/88b227c5fb3906ce47c638c0eee4a2b3.seg 04379243 +03467517/points/81bd0c7a35a147988cc3ae4061da3bb0.pts 03467517/expert_verified/points_label/81bd0c7a35a147988cc3ae4061da3bb0.seg 03467517 +04379243/points/5292f2930f188e0a7ff6ace05b36a5.pts 04379243/expert_verified/points_label/5292f2930f188e0a7ff6ace05b36a5.seg 04379243 +03636649/points/5f0a23ce527d0be52f38c0d2792fb5e.pts 03636649/expert_verified/points_label/5f0a23ce527d0be52f38c0d2792fb5e.seg 03636649 +03636649/points/98cdb45ca9925feb194eb328dc97c7e2.pts 03636649/expert_verified/points_label/98cdb45ca9925feb194eb328dc97c7e2.seg 03636649 +03790512/points/47054c1839830834a88e8cb97b773125.pts 03790512/expert_verified/points_label/47054c1839830834a88e8cb97b773125.seg 03790512 +03001627/points/b058cc77e628ac01c433ba3e0e025e8c.pts 03001627/expert_verified/points_label/b058cc77e628ac01c433ba3e0e025e8c.seg 03001627 +04225987/points/f74a5dfc0094e2d5561dce3fe08634b7.pts 04225987/expert_verified/points_label/f74a5dfc0094e2d5561dce3fe08634b7.seg 04225987 +02958343/points/e20b8a9c388eeb012c8b6ee41d7d5d62.pts 02958343/expert_verified/points_label/e20b8a9c388eeb012c8b6ee41d7d5d62.seg 02958343 +02958343/points/7203130a35ab20a4b1bb46d2556ba67d.pts 02958343/expert_verified/points_label/7203130a35ab20a4b1bb46d2556ba67d.seg 02958343 +03261776/points/2c6f04001afcce7ded85c3dc02bada79.pts 03261776/expert_verified/points_label/2c6f04001afcce7ded85c3dc02bada79.seg 03261776 +03001627/points/951fb0d7ad8ab2bec5b5bea66ef4576d.pts 03001627/expert_verified/points_label/951fb0d7ad8ab2bec5b5bea66ef4576d.seg 03001627 +02691156/points/54e926e12382808b66cf1b4a8fc3914e.pts 02691156/expert_verified/points_label/54e926e12382808b66cf1b4a8fc3914e.seg 02691156 +03001627/points/4c513ea0804fc008c8687ff9b0b4e4ac.pts 03001627/expert_verified/points_label/4c513ea0804fc008c8687ff9b0b4e4ac.seg 03001627 +03001627/points/748957972cae6b03c56be62b05937331.pts 03001627/expert_verified/points_label/748957972cae6b03c56be62b05937331.seg 03001627 +03001627/points/cc2639f8c584001a922dfe32810651d0.pts 03001627/expert_verified/points_label/cc2639f8c584001a922dfe32810651d0.seg 03001627 +04379243/points/d2f811bc37858425a63ceecddc308b25.pts 04379243/expert_verified/points_label/d2f811bc37858425a63ceecddc308b25.seg 04379243 +03001627/points/d48dac046436a29ec3bd24f986301745.pts 03001627/expert_verified/points_label/d48dac046436a29ec3bd24f986301745.seg 03001627 +03001627/points/30fafef5c734f926781ba0fdb47276df.pts 03001627/expert_verified/points_label/30fafef5c734f926781ba0fdb47276df.seg 03001627 +03001627/points/7293291b3fe8233fdef1c01cbd4ae0c.pts 03001627/expert_verified/points_label/7293291b3fe8233fdef1c01cbd4ae0c.seg 03001627 +03636649/points/3deedc86a83bbf23f647dc544bb0ab61.pts 03636649/expert_verified/points_label/3deedc86a83bbf23f647dc544bb0ab61.seg 03636649 +03467517/points/bb4a5712da8f63330d758421dd01f45.pts 03467517/expert_verified/points_label/bb4a5712da8f63330d758421dd01f45.seg 03467517 +03636649/points/39af776c1435a3374b59758e9336ca87.pts 03636649/expert_verified/points_label/39af776c1435a3374b59758e9336ca87.seg 03636649 +04379243/points/ef9f3af9b8453613febad4f49b26ec52.pts 04379243/expert_verified/points_label/ef9f3af9b8453613febad4f49b26ec52.seg 04379243 +02691156/points/29192f8c96264e3435fc197bbabcd5bd.pts 02691156/expert_verified/points_label/29192f8c96264e3435fc197bbabcd5bd.seg 02691156 +02691156/points/75d162523d703917b87697d3904b168b.pts 02691156/expert_verified/points_label/75d162523d703917b87697d3904b168b.seg 02691156 +04379243/points/3c04f4e0d183976a7e7cb173e141227.pts 04379243/expert_verified/points_label/3c04f4e0d183976a7e7cb173e141227.seg 04379243 +03790512/points/80011e85cd42668ad373c34785838ee4.pts 03790512/expert_verified/points_label/80011e85cd42668ad373c34785838ee4.seg 03790512 +04379243/points/994e524d70043c3496e349c87c588bf2.pts 04379243/expert_verified/points_label/994e524d70043c3496e349c87c588bf2.seg 04379243 +02691156/points/b1f08c51a098c43696d224195a988f09.pts 02691156/expert_verified/points_label/b1f08c51a098c43696d224195a988f09.seg 02691156 +04379243/points/cb31b6293506eb639a3528690d225ee1.pts 04379243/expert_verified/points_label/cb31b6293506eb639a3528690d225ee1.seg 04379243 +02691156/points/d70d648947c65b1eca8607f540cc62ba.pts 02691156/expert_verified/points_label/d70d648947c65b1eca8607f540cc62ba.seg 02691156 +03636649/points/7bebdd742342ba93febad4f49b26ec52.pts 03636649/expert_verified/points_label/7bebdd742342ba93febad4f49b26ec52.seg 03636649 +02691156/points/2a2caad9e540dcc687bf26680c510802.pts 02691156/expert_verified/points_label/2a2caad9e540dcc687bf26680c510802.seg 02691156 +03790512/points/73fd19410ce60b83d5dde04c96fd8146.pts 03790512/expert_verified/points_label/73fd19410ce60b83d5dde04c96fd8146.seg 03790512 +04379243/points/ccb8c52ff9e7a01819fb4103277a6b93.pts 04379243/expert_verified/points_label/ccb8c52ff9e7a01819fb4103277a6b93.seg 04379243 +03467517/points/cc9e9ef3e1326c5363e148e250c0340d.pts 03467517/expert_verified/points_label/cc9e9ef3e1326c5363e148e250c0340d.seg 03467517 +03001627/points/d5360f2b0b0299c29b9f2eb77f5e247e.pts 03001627/expert_verified/points_label/d5360f2b0b0299c29b9f2eb77f5e247e.seg 03001627 +02691156/points/6b69e4c1cceb6e0681fa1ee3c368532e.pts 02691156/expert_verified/points_label/6b69e4c1cceb6e0681fa1ee3c368532e.seg 02691156 +02691156/points/3ae96a1e1bb488942296d88107d065f6.pts 02691156/expert_verified/points_label/3ae96a1e1bb488942296d88107d065f6.seg 02691156 +04379243/points/5e4351c4525fae6d6fa63795f94c4d8c.pts 04379243/expert_verified/points_label/5e4351c4525fae6d6fa63795f94c4d8c.seg 04379243 +04225987/points/5c55e6b6708f730d758f6def7204bd6b.pts 04225987/expert_verified/points_label/5c55e6b6708f730d758f6def7204bd6b.seg 04225987 +03001627/points/a48e359faed3da88d3519c62a8100783.pts 03001627/expert_verified/points_label/a48e359faed3da88d3519c62a8100783.seg 03001627 +03467517/points/a4170135b1055cb8982c503992eaf09.pts 03467517/expert_verified/points_label/a4170135b1055cb8982c503992eaf09.seg 03467517 +02958343/points/b3f1ad55fa401c35e8c505ac322336cc.pts 02958343/expert_verified/points_label/b3f1ad55fa401c35e8c505ac322336cc.seg 02958343 +02691156/points/c7c5bb658cafcc7c67711f7c205c5b63.pts 02691156/expert_verified/points_label/c7c5bb658cafcc7c67711f7c205c5b63.seg 02691156 +02691156/points/914c308ac4a9156842c20743f866e1a6.pts 02691156/expert_verified/points_label/914c308ac4a9156842c20743f866e1a6.seg 02691156 +04379243/points/23acbe1f91d445f91ca1c7e576bee6b9.pts 04379243/expert_verified/points_label/23acbe1f91d445f91ca1c7e576bee6b9.seg 04379243 +04379243/points/8eb366f4f602219b490ad276cd2af3a4.pts 04379243/expert_verified/points_label/8eb366f4f602219b490ad276cd2af3a4.seg 04379243 +03624134/points/508ca8fa00e0cbb3e168961dc7b88f65.pts 03624134/expert_verified/points_label/508ca8fa00e0cbb3e168961dc7b88f65.seg 03624134 +04379243/points/be045fca16562f6764c85287e21825c4.pts 04379243/expert_verified/points_label/be045fca16562f6764c85287e21825c4.seg 04379243 +03001627/points/70f57047512c2eb84104b1c5cb7f9280.pts 03001627/expert_verified/points_label/70f57047512c2eb84104b1c5cb7f9280.seg 03001627 +03001627/points/975ea4be01c7488611bc8e8361bc5303.pts 03001627/expert_verified/points_label/975ea4be01c7488611bc8e8361bc5303.seg 03001627 +04379243/points/3c7cf00cd78adaef4b3c42e318f3affc.pts 04379243/expert_verified/points_label/3c7cf00cd78adaef4b3c42e318f3affc.seg 04379243 +02773838/points/220f08ff0c1d2a4542282fc88db7886b.pts 02773838/expert_verified/points_label/220f08ff0c1d2a4542282fc88db7886b.seg 02773838 +03636649/points/e35c4fadbf8d0426c26e81144f3196d5.pts 03636649/expert_verified/points_label/e35c4fadbf8d0426c26e81144f3196d5.seg 03636649 +03642806/points/93958423b98be8b538ff1b6d120c56aa.pts 03642806/expert_verified/points_label/93958423b98be8b538ff1b6d120c56aa.seg 03642806 +04379243/points/cf24f0128755080569080f7eaa8f3e1d.pts 04379243/expert_verified/points_label/cf24f0128755080569080f7eaa8f3e1d.seg 04379243 +04379243/points/f5cbbe04afdc4697562b835b63cfd09c.pts 04379243/expert_verified/points_label/f5cbbe04afdc4697562b835b63cfd09c.seg 04379243 +04379243/points/7a7590d19cf8274dab610b0c94236463.pts 04379243/expert_verified/points_label/7a7590d19cf8274dab610b0c94236463.seg 04379243 +03001627/points/bdfc3a43eccaac7e908cb3a44391b80.pts 03001627/expert_verified/points_label/bdfc3a43eccaac7e908cb3a44391b80.seg 03001627 +03636649/points/90d70f0a6b1cf72d79f0be73913de469.pts 03636649/expert_verified/points_label/90d70f0a6b1cf72d79f0be73913de469.seg 03636649 +03642806/points/17069b6604fc28bfa2f5beb253216d5b.pts 03642806/expert_verified/points_label/17069b6604fc28bfa2f5beb253216d5b.seg 03642806 +04379243/points/3b0625a3d623a7decfbec6fc6446a041.pts 04379243/expert_verified/points_label/3b0625a3d623a7decfbec6fc6446a041.seg 04379243 +04379243/points/9482c5f0a38a73c0fa16d3c3138134ae.pts 04379243/expert_verified/points_label/9482c5f0a38a73c0fa16d3c3138134ae.seg 04379243 +04379243/points/ed73c41dcfe9170119cc3eaf35cd388f.pts 04379243/expert_verified/points_label/ed73c41dcfe9170119cc3eaf35cd388f.seg 04379243 +04379243/points/1abed35643d34f60afed86cbd9fd5335.pts 04379243/expert_verified/points_label/1abed35643d34f60afed86cbd9fd5335.seg 04379243 +03001627/points/98e1936d3f25389bc3c6a889ee0bd115.pts 03001627/expert_verified/points_label/98e1936d3f25389bc3c6a889ee0bd115.seg 03001627 +03797390/points/ef24c302911bcde6ea6ff2182dd34668.pts 03797390/expert_verified/points_label/ef24c302911bcde6ea6ff2182dd34668.seg 03797390 +02773838/points/22b7d6fa819d62aefc69b7db9c6d5ad9.pts 02773838/expert_verified/points_label/22b7d6fa819d62aefc69b7db9c6d5ad9.seg 02773838 +03001627/points/19666f52289092a3394a3bbfc81460.pts 03001627/expert_verified/points_label/19666f52289092a3394a3bbfc81460.seg 03001627 +03001627/points/49b38e22f104005ecbde89e0c48a01bf.pts 03001627/expert_verified/points_label/49b38e22f104005ecbde89e0c48a01bf.seg 03001627 +04379243/points/de077e0bd6932baef12d7184a2ad3430.pts 04379243/expert_verified/points_label/de077e0bd6932baef12d7184a2ad3430.seg 04379243 +03001627/points/fe99f16c2532cdd07ba99ad16fdc05cd.pts 03001627/expert_verified/points_label/fe99f16c2532cdd07ba99ad16fdc05cd.seg 03001627 +03642806/points/a17cf326705a6443a09a37cf78d1b866.pts 03642806/expert_verified/points_label/a17cf326705a6443a09a37cf78d1b866.seg 03642806 +04379243/points/890940359fdfa036569c11df1aea8ca4.pts 04379243/expert_verified/points_label/890940359fdfa036569c11df1aea8ca4.seg 04379243 +03642806/points/7f75b94bd59d649958dd315c54df0c15.pts 03642806/expert_verified/points_label/7f75b94bd59d649958dd315c54df0c15.seg 03642806 +04379243/points/d0ef9d431a16e70de6c5cd45aa112726.pts 04379243/expert_verified/points_label/d0ef9d431a16e70de6c5cd45aa112726.seg 04379243 +03001627/points/2dc5055b8d900ec7db4b0ee93cf61ed1.pts 03001627/expert_verified/points_label/2dc5055b8d900ec7db4b0ee93cf61ed1.seg 03001627 +03001627/points/9e6b834449ed2db86199d6fe090be061.pts 03001627/expert_verified/points_label/9e6b834449ed2db86199d6fe090be061.seg 03001627 +04379243/points/9e3f1901ea14aca753315facdf531a34.pts 04379243/expert_verified/points_label/9e3f1901ea14aca753315facdf531a34.seg 04379243 +03001627/points/c4ebef05a72fc4f39d62eb3fdc2d3f8a.pts 03001627/expert_verified/points_label/c4ebef05a72fc4f39d62eb3fdc2d3f8a.seg 03001627 +03001627/points/428b77d0ffe6ab456e06155d245f15d6.pts 03001627/expert_verified/points_label/428b77d0ffe6ab456e06155d245f15d6.seg 03001627 +04225987/points/591971ce679ca4b93ad38b993d9e745f.pts 04225987/expert_verified/points_label/591971ce679ca4b93ad38b993d9e745f.seg 04225987 +03790512/points/bcabe20e46e5126ed5dde04c96fd8146.pts 03790512/expert_verified/points_label/bcabe20e46e5126ed5dde04c96fd8146.seg 03790512 +04379243/points/3ed500a12dfa511ba6040757a0125a99.pts 04379243/expert_verified/points_label/3ed500a12dfa511ba6040757a0125a99.seg 04379243 +04379243/points/1581d2682187764730bbd4cddd04c77b.pts 04379243/expert_verified/points_label/1581d2682187764730bbd4cddd04c77b.seg 04379243 +02691156/points/bb7d526405e9347b8f6810e1a2b6aa04.pts 02691156/expert_verified/points_label/bb7d526405e9347b8f6810e1a2b6aa04.seg 02691156 +02691156/points/fb9deec3a422b06b609e2d916fa0da27.pts 02691156/expert_verified/points_label/fb9deec3a422b06b609e2d916fa0da27.seg 02691156 +03636649/points/5e6abfc7d93fa5f1dc0efee4b442070.pts 03636649/expert_verified/points_label/5e6abfc7d93fa5f1dc0efee4b442070.seg 03636649 +03467517/points/2dbc73ad4ce7950163e148e250c0340d.pts 03467517/expert_verified/points_label/2dbc73ad4ce7950163e148e250c0340d.seg 03467517 +02958343/points/eea7f5d02088d49dfdb3c05088c091ae.pts 02958343/expert_verified/points_label/eea7f5d02088d49dfdb3c05088c091ae.seg 02958343 +04379243/points/83c24aad3914e61a73376642dd664bfd.pts 04379243/expert_verified/points_label/83c24aad3914e61a73376642dd664bfd.seg 04379243 +04379243/points/51874066ba946c58aaf15b62af6b513f.pts 04379243/expert_verified/points_label/51874066ba946c58aaf15b62af6b513f.seg 04379243 +03636649/points/5be8cdad3b218e373d39d8012919dd25.pts 03636649/expert_verified/points_label/5be8cdad3b218e373d39d8012919dd25.seg 03636649 +03636649/points/49cd0dd4d1c008edbbc7a6acbd8f058b.pts 03636649/expert_verified/points_label/49cd0dd4d1c008edbbc7a6acbd8f058b.seg 03636649 +03642806/points/d7e7e6651a23afc68ba4e518219eb66a.pts 03642806/expert_verified/points_label/d7e7e6651a23afc68ba4e518219eb66a.seg 03642806 +02958343/points/6026684ab31d567328044fe9244db50a.pts 02958343/expert_verified/points_label/6026684ab31d567328044fe9244db50a.seg 02958343 +04379243/points/c177762c0445d57ab20aa91e9e90c311.pts 04379243/expert_verified/points_label/c177762c0445d57ab20aa91e9e90c311.seg 04379243 +02691156/points/7bad9d15c0f0d3c03554ccf8c30febe7.pts 02691156/expert_verified/points_label/7bad9d15c0f0d3c03554ccf8c30febe7.seg 02691156 +03636649/points/dd818b0269b1aa15fcb8d8c6d4df8143.pts 03636649/expert_verified/points_label/dd818b0269b1aa15fcb8d8c6d4df8143.seg 03636649 +03624134/points/c4851aee1af7d874cc34b900bb2492e.pts 03624134/expert_verified/points_label/c4851aee1af7d874cc34b900bb2492e.seg 03624134 +03001627/points/e2ced471afce616454bfa32aa0766acb.pts 03001627/expert_verified/points_label/e2ced471afce616454bfa32aa0766acb.seg 03001627 +03797390/points/896f1d494bac0ebcdec712af445786fe.pts 03797390/expert_verified/points_label/896f1d494bac0ebcdec712af445786fe.seg 03797390 +04379243/points/481e00e4559705c616a2b5862518c93.pts 04379243/expert_verified/points_label/481e00e4559705c616a2b5862518c93.seg 04379243 +04379243/points/2ca883ba6a9dc6f68985be89a0ee21a.pts 04379243/expert_verified/points_label/2ca883ba6a9dc6f68985be89a0ee21a.seg 04379243 +04379243/points/ebc82e7df36f6e9a33963916b86d221f.pts 04379243/expert_verified/points_label/ebc82e7df36f6e9a33963916b86d221f.seg 04379243 +03001627/points/cdea84a63ad8c44febad4f49b26ec52.pts 03001627/expert_verified/points_label/cdea84a63ad8c44febad4f49b26ec52.seg 03001627 +03624134/points/c71280ea272fbfed4b7644126b1d71e0.pts 03624134/expert_verified/points_label/c71280ea272fbfed4b7644126b1d71e0.seg 03624134 +02958343/points/974c3d82f8726f086b418c7d9fedcaa9.pts 02958343/expert_verified/points_label/974c3d82f8726f086b418c7d9fedcaa9.seg 02958343 +02958343/points/4dbf4e0654d0c234e811106a82796d20.pts 02958343/expert_verified/points_label/4dbf4e0654d0c234e811106a82796d20.seg 02958343 +03467517/points/de9ca0c3e32f907dcb61cf5d9c47c2c7.pts 03467517/expert_verified/points_label/de9ca0c3e32f907dcb61cf5d9c47c2c7.seg 03467517 +02958343/points/9f4bbcf9f51fe1e42957c02bdefc95c8.pts 02958343/expert_verified/points_label/9f4bbcf9f51fe1e42957c02bdefc95c8.seg 02958343 +03467517/points/173e4f1824f7b9fa93f0194265a9746c.pts 03467517/expert_verified/points_label/173e4f1824f7b9fa93f0194265a9746c.seg 03467517 +03636649/points/b4f166440439171741657e31b569b105.pts 03636649/expert_verified/points_label/b4f166440439171741657e31b569b105.seg 03636649 +03948459/points/d1ba405fef56efa0fa29682ba98e856d.pts 03948459/expert_verified/points_label/d1ba405fef56efa0fa29682ba98e856d.seg 03948459 +03467517/points/a39dcefa599a76dd93f0194265a9746c.pts 03467517/expert_verified/points_label/a39dcefa599a76dd93f0194265a9746c.seg 03467517 +02958343/points/e213d976734431773a3afd30f2e86bd7.pts 02958343/expert_verified/points_label/e213d976734431773a3afd30f2e86bd7.seg 02958343 +04379243/points/b1335d826d7d60726e066e11deddab75.pts 04379243/expert_verified/points_label/b1335d826d7d60726e066e11deddab75.seg 04379243 +04379243/points/e37262abd76852ac00ee852f6d8aa3c.pts 04379243/expert_verified/points_label/e37262abd76852ac00ee852f6d8aa3c.seg 04379243 +03001627/points/5d346bdb7db27accf3588493d5c284.pts 03001627/expert_verified/points_label/5d346bdb7db27accf3588493d5c284.seg 03001627 +04379243/points/198ff59a42a147eb8ac5948d70801389.pts 04379243/expert_verified/points_label/198ff59a42a147eb8ac5948d70801389.seg 04379243 +03001627/points/b3fd987b330d0d2acda56795a6fbde1f.pts 03001627/expert_verified/points_label/b3fd987b330d0d2acda56795a6fbde1f.seg 03001627 +02691156/points/1cb757280b862ae52c7575c9089791ff.pts 02691156/expert_verified/points_label/1cb757280b862ae52c7575c9089791ff.seg 02691156 +03636649/points/4631e756666a8a208ca4aeb5e3b33af7.pts 03636649/expert_verified/points_label/4631e756666a8a208ca4aeb5e3b33af7.seg 03636649 +04379243/points/b82c6769c98e877d24d29f1dedd03a57.pts 04379243/expert_verified/points_label/b82c6769c98e877d24d29f1dedd03a57.seg 04379243 +03636649/points/2b194d6bed8daa82c0b2dda5ff15ea28.pts 03636649/expert_verified/points_label/2b194d6bed8daa82c0b2dda5ff15ea28.seg 03636649 +03001627/points/7e6b4a7b4dd60c40cc8bd7a04c9659f1.pts 03001627/expert_verified/points_label/7e6b4a7b4dd60c40cc8bd7a04c9659f1.seg 03001627 +03948459/points/d1cc54762432fd058a2c998c0df41abe.pts 03948459/expert_verified/points_label/d1cc54762432fd058a2c998c0df41abe.seg 03948459 +04225987/points/776eaffd7cbe7bc6b9e8bdc9c4a49aa2.pts 04225987/expert_verified/points_label/776eaffd7cbe7bc6b9e8bdc9c4a49aa2.seg 04225987 +04379243/points/6ce30b0327db26f340b4c5428883e585.pts 04379243/expert_verified/points_label/6ce30b0327db26f340b4c5428883e585.seg 04379243 +04379243/points/c5230678204a1bb8dcfcef693e7ec696.pts 04379243/expert_verified/points_label/c5230678204a1bb8dcfcef693e7ec696.seg 04379243 +02691156/points/563cef4df464ddb1e153dd90dac45a6d.pts 02691156/expert_verified/points_label/563cef4df464ddb1e153dd90dac45a6d.seg 02691156 +02958343/points/42e6ce03b361102ab86e0633bb69faea.pts 02958343/expert_verified/points_label/42e6ce03b361102ab86e0633bb69faea.seg 02958343 +03001627/points/26e8033e59a3adf6bb53a6a5f5051240.pts 03001627/expert_verified/points_label/26e8033e59a3adf6bb53a6a5f5051240.seg 03001627 +04379243/points/731b983cb313634fd018082a1777a5f8.pts 04379243/expert_verified/points_label/731b983cb313634fd018082a1777a5f8.seg 04379243 +02691156/points/10aa040f470500c6a66ef8df4909ded9.pts 02691156/expert_verified/points_label/10aa040f470500c6a66ef8df4909ded9.seg 02691156 +03467517/points/bb895a87931f51c893f0194265a9746c.pts 03467517/expert_verified/points_label/bb895a87931f51c893f0194265a9746c.seg 03467517 +03624134/points/a105080ce4564145aeb54153795ede63.pts 03624134/expert_verified/points_label/a105080ce4564145aeb54153795ede63.seg 03624134 +04379243/points/c12147db9b29ef9ee0480c954dcd56d1.pts 04379243/expert_verified/points_label/c12147db9b29ef9ee0480c954dcd56d1.seg 04379243 +04379243/points/21cdc417e398378e40f3ac0af6b7e700.pts 04379243/expert_verified/points_label/21cdc417e398378e40f3ac0af6b7e700.seg 04379243 +04379243/points/b11e0feb428f61edf008d8a3590fb522.pts 04379243/expert_verified/points_label/b11e0feb428f61edf008d8a3590fb522.seg 04379243 +04379243/points/2700f6693447c32d66c64744a4252d3.pts 04379243/expert_verified/points_label/2700f6693447c32d66c64744a4252d3.seg 04379243 +03467517/points/b6d0cf333c7e013993f0194265a9746c.pts 03467517/expert_verified/points_label/b6d0cf333c7e013993f0194265a9746c.seg 03467517 +03001627/points/ece627bd883d9bbfb0eb7e753c06942.pts 03001627/expert_verified/points_label/ece627bd883d9bbfb0eb7e753c06942.seg 03001627 +03636649/points/26f0f37f0f2623c4a3fa46ae73c48b4.pts 03636649/expert_verified/points_label/26f0f37f0f2623c4a3fa46ae73c48b4.seg 03636649 +04379243/points/8b07d458499d63f36d96c6cb347d6a90.pts 04379243/expert_verified/points_label/8b07d458499d63f36d96c6cb347d6a90.seg 04379243 +04379243/points/eb363770ee36b0309a79b01b89f55c86.pts 04379243/expert_verified/points_label/eb363770ee36b0309a79b01b89f55c86.seg 04379243 +04379243/points/ccf36a20b7ef3bd128071d61462a212d.pts 04379243/expert_verified/points_label/ccf36a20b7ef3bd128071d61462a212d.seg 04379243 +03001627/points/cf24fc2d10f8da31283b00891f680579.pts 03001627/expert_verified/points_label/cf24fc2d10f8da31283b00891f680579.seg 03001627 +02958343/points/8b4879617bd256391738f25e3015f92e.pts 02958343/expert_verified/points_label/8b4879617bd256391738f25e3015f92e.seg 02958343 +03001627/points/55e1cde05a99f6c7d1d34366ca81fb3b.pts 03001627/expert_verified/points_label/55e1cde05a99f6c7d1d34366ca81fb3b.seg 03001627 +03001627/points/6c25ec1178e9bab6e545858398955dd1.pts 03001627/expert_verified/points_label/6c25ec1178e9bab6e545858398955dd1.seg 03001627 +03001627/points/862f70e73fa70c9b1a719e2a845bdada.pts 03001627/expert_verified/points_label/862f70e73fa70c9b1a719e2a845bdada.seg 03001627 +04379243/points/fa5dce1043f44c06ab88e3acae6e8bc5.pts 04379243/expert_verified/points_label/fa5dce1043f44c06ab88e3acae6e8bc5.seg 04379243 +03467517/points/6f9d1467eb39f8abfae47f572c17b9cb.pts 03467517/expert_verified/points_label/6f9d1467eb39f8abfae47f572c17b9cb.seg 03467517 +04379243/points/60ef2830979fd08ec72d4ae978770752.pts 04379243/expert_verified/points_label/60ef2830979fd08ec72d4ae978770752.seg 04379243 +03624134/points/d69e028056c9291069654277b747a908.pts 03624134/expert_verified/points_label/d69e028056c9291069654277b747a908.seg 03624134 +04379243/points/8e7c894039ae2cfe99e8bf807e902261.pts 04379243/expert_verified/points_label/8e7c894039ae2cfe99e8bf807e902261.seg 04379243 +02958343/points/4e2ca20091449636599389919f6522e6.pts 02958343/expert_verified/points_label/4e2ca20091449636599389919f6522e6.seg 02958343 +04379243/points/b10d84b3a04085b17618b16b281bdf56.pts 04379243/expert_verified/points_label/b10d84b3a04085b17618b16b281bdf56.seg 04379243 +03948459/points/d13986cc2403a2034b4b3d2a28039009.pts 03948459/expert_verified/points_label/d13986cc2403a2034b4b3d2a28039009.seg 03948459 +03636649/points/d97a86cea650ae0baf5b49ad7809302.pts 03636649/expert_verified/points_label/d97a86cea650ae0baf5b49ad7809302.seg 03636649 +03797390/points/ca198dc3f7dc0cacec6338171298c66b.pts 03797390/expert_verified/points_label/ca198dc3f7dc0cacec6338171298c66b.seg 03797390 +03636649/points/3f968096c74ee3a3b04a2e6a78ff6c49.pts 03636649/expert_verified/points_label/3f968096c74ee3a3b04a2e6a78ff6c49.seg 03636649 +02691156/points/4d6ec762d1583ded46555ee25941a22e.pts 02691156/expert_verified/points_label/4d6ec762d1583ded46555ee25941a22e.seg 02691156 +03467517/points/401ff6021157dee293f0194265a9746c.pts 03467517/expert_verified/points_label/401ff6021157dee293f0194265a9746c.seg 03467517 +04379243/points/c1d808c75cc5e7ab4da5bb83ec125010.pts 04379243/expert_verified/points_label/c1d808c75cc5e7ab4da5bb83ec125010.seg 04379243 +03790512/points/3d37db1d974499287395d58407f193ba.pts 03790512/expert_verified/points_label/3d37db1d974499287395d58407f193ba.seg 03790512 +03624134/points/65892e0f7f93129d14cb807a24b99e1e.pts 03624134/expert_verified/points_label/65892e0f7f93129d14cb807a24b99e1e.seg 03624134 +03624134/points/854e7bb73afaff7591ea3afb2749822f.pts 03624134/expert_verified/points_label/854e7bb73afaff7591ea3afb2749822f.seg 03624134 +03624134/points/7b492f2baa1dc710cc34b900bb2492e.pts 03624134/expert_verified/points_label/7b492f2baa1dc710cc34b900bb2492e.seg 03624134 +03636649/points/b4b15a84b9067f94a75d03186a0409e2.pts 03636649/expert_verified/points_label/b4b15a84b9067f94a75d03186a0409e2.seg 03636649 +03636649/points/9db87bf898efd448cbde89e0c48a01bf.pts 03636649/expert_verified/points_label/9db87bf898efd448cbde89e0c48a01bf.seg 03636649 +02954340/points/9bd54e0123d3cd70a52821bf1aa3b19a.pts 02954340/expert_verified/points_label/9bd54e0123d3cd70a52821bf1aa3b19a.seg 02954340 diff --git a/zoo/SimpleView/dgcnn/tensorflow/part_seg/train_multi_gpu.py b/zoo/SimpleView/dgcnn/tensorflow/part_seg/train_multi_gpu.py new file mode 100644 index 0000000..bffdfae --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/part_seg/train_multi_gpu.py @@ -0,0 +1,390 @@ +import argparse +import subprocess +import tensorflow as tf +import numpy as np +from datetime import datetime +import json +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.dirname(BASE_DIR)) +import provider +import part_seg_model as model + +TOWER_NAME = 'tower' + +# DEFAULT SETTINGS +parser = argparse.ArgumentParser() +parser.add_argument('--num_gpu', type=int, default=2, help='The number of GPUs to use [default: 2]') +parser.add_argument('--batch', type=int, default=16, help='Batch Size per GPU during training [default: 32]') +parser.add_argument('--epoch', type=int, default=201, help='Epoch to run [default: 50]') +parser.add_argument('--point_num', type=int, default=2048, help='Point Number [256/512/1024/2048]') +parser.add_argument('--output_dir', type=str, default='train_results', help='Directory that stores all training logs and trained models') +parser.add_argument('--wd', type=float, default=0, help='Weight Decay [Default: 0.0]') +FLAGS = parser.parse_args() + +hdf5_data_dir = os.path.join(BASE_DIR, './hdf5_data') + +# MAIN SCRIPT +point_num = FLAGS.point_num +batch_size = FLAGS.batch +output_dir = FLAGS.output_dir + +if not os.path.exists(output_dir): + os.mkdir(output_dir) + +# color_map_file = os.path.join(hdf5_data_dir, 'part_color_mapping.json') +# color_map = json.load(open(color_map_file, 'r')) + +all_obj_cats_file = os.path.join(hdf5_data_dir, 'all_object_categories.txt') +fin = open(all_obj_cats_file, 'r') +lines = [line.rstrip() for line in fin.readlines()] +all_obj_cats = [(line.split()[0], line.split()[1]) for line in lines] +fin.close() + +all_cats = json.load(open(os.path.join(hdf5_data_dir, 'overallid_to_catid_partid.json'), 'r')) +NUM_CATEGORIES = 16 +NUM_PART_CATS = len(all_cats) + +print('#### Batch Size Per GPU: {0}'.format(batch_size)) +print('#### Point Number: {0}'.format(point_num)) +print('#### Using GPUs: {0}'.format(FLAGS.num_gpu)) + +DECAY_STEP = 16881 * 20 +DECAY_RATE = 0.5 + +LEARNING_RATE_CLIP = 1e-5 + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP * 2) +BN_DECAY_CLIP = 0.99 + +BASE_LEARNING_RATE = 0.003 +MOMENTUM = 0.9 +TRAINING_EPOCHES = FLAGS.epoch +print('### Training epoch: {0}'.format(TRAINING_EPOCHES)) + +TRAINING_FILE_LIST = os.path.join(hdf5_data_dir, 'train_hdf5_file_list.txt') +TESTING_FILE_LIST = os.path.join(hdf5_data_dir, 'val_hdf5_file_list.txt') + +MODEL_STORAGE_PATH = os.path.join(output_dir, 'trained_models') +if not os.path.exists(MODEL_STORAGE_PATH): + os.mkdir(MODEL_STORAGE_PATH) + +LOG_STORAGE_PATH = os.path.join(output_dir, 'logs') +if not os.path.exists(LOG_STORAGE_PATH): + os.mkdir(LOG_STORAGE_PATH) + +SUMMARIES_FOLDER = os.path.join(output_dir, 'summaries') +if not os.path.exists(SUMMARIES_FOLDER): + os.mkdir(SUMMARIES_FOLDER) + +def printout(flog, data): + print(data) + flog.write(data + '\n') + +def convert_label_to_one_hot(labels): + label_one_hot = np.zeros((labels.shape[0], NUM_CATEGORIES)) + for idx in range(labels.shape[0]): + label_one_hot[idx, labels[idx]] = 1 + return label_one_hot + +def average_gradients(tower_grads): + """Calculate average gradient for each shared variable across all towers. + + Note that this function provides a synchronization point across all towers. + + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been + averaged across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + if g is None: + continue + expanded_g = tf.expand_dims(g, 0) + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(grads, 0) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + + +def train(): + with tf.Graph().as_default(), tf.device('/cpu:0'): + + batch = tf.Variable(0, trainable=False) + + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # base learning rate + batch * batch_size, # global_var indicating the number of steps + DECAY_STEP, # step size + DECAY_RATE, # decay rate + staircase=True # Stair-case or continuous decreasing + ) + learning_rate = tf.maximum(learning_rate, LEARNING_RATE_CLIP) + + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*batch_size, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + + lr_op = tf.summary.scalar('learning_rate', learning_rate) + batch_op = tf.summary.scalar('batch_number', batch) + bn_decay_op = tf.summary.scalar('bn_decay', bn_decay) + + trainer = tf.train.AdamOptimizer(learning_rate) + + # store tensors for different gpus + tower_grads = [] + pointclouds_phs = [] + input_label_phs = [] + seg_phs =[] + is_training_phs =[] + + with tf.variable_scope(tf.get_variable_scope()): + for i in xrange(FLAGS.num_gpu): + with tf.device('/gpu:%d' % i): + with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: + pointclouds_phs.append(tf.placeholder(tf.float32, shape=(batch_size, point_num, 3))) # for points + input_label_phs.append(tf.placeholder(tf.float32, shape=(batch_size, NUM_CATEGORIES))) # for one-hot category label + seg_phs.append(tf.placeholder(tf.int32, shape=(batch_size, point_num))) # for part labels + is_training_phs.append(tf.placeholder(tf.bool, shape=())) + + seg_pred = model.get_model(pointclouds_phs[-1], input_label_phs[-1], \ + is_training=is_training_phs[-1], bn_decay=bn_decay, cat_num=NUM_CATEGORIES, \ + part_num=NUM_PART_CATS, batch_size=batch_size, num_point=point_num, weight_decay=FLAGS.wd) + + + loss, per_instance_seg_loss, per_instance_seg_pred_res \ + = model.get_loss(seg_pred, seg_phs[-1]) + + total_training_loss_ph = tf.placeholder(tf.float32, shape=()) + total_testing_loss_ph = tf.placeholder(tf.float32, shape=()) + + seg_training_acc_ph = tf.placeholder(tf.float32, shape=()) + seg_testing_acc_ph = tf.placeholder(tf.float32, shape=()) + seg_testing_acc_avg_cat_ph = tf.placeholder(tf.float32, shape=()) + + total_train_loss_sum_op = tf.summary.scalar('total_training_loss', total_training_loss_ph) + total_test_loss_sum_op = tf.summary.scalar('total_testing_loss', total_testing_loss_ph) + + + seg_train_acc_sum_op = tf.summary.scalar('seg_training_acc', seg_training_acc_ph) + seg_test_acc_sum_op = tf.summary.scalar('seg_testing_acc', seg_testing_acc_ph) + seg_test_acc_avg_cat_op = tf.summary.scalar('seg_testing_acc_avg_cat', seg_testing_acc_avg_cat_ph) + + tf.get_variable_scope().reuse_variables() + + grads = trainer.compute_gradients(loss) + + tower_grads.append(grads) + + grads = average_gradients(tower_grads) + + train_op = trainer.apply_gradients(grads, global_step=batch) + + saver = tf.train.Saver(tf.global_variables(), sharded=True, max_to_keep=20) + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + sess = tf.Session(config=config) + + init = tf.group(tf.global_variables_initializer(), + tf.local_variables_initializer()) + sess.run(init) + + train_writer = tf.summary.FileWriter(SUMMARIES_FOLDER + '/train', sess.graph) + test_writer = tf.summary.FileWriter(SUMMARIES_FOLDER + '/test') + + train_file_list = provider.getDataFiles(TRAINING_FILE_LIST) + num_train_file = len(train_file_list) + test_file_list = provider.getDataFiles(TESTING_FILE_LIST) + num_test_file = len(test_file_list) + + fcmd = open(os.path.join(LOG_STORAGE_PATH, 'cmd.txt'), 'w') + fcmd.write(str(FLAGS)) + fcmd.close() + + # write logs to the disk + flog = open(os.path.join(LOG_STORAGE_PATH, 'log.txt'), 'w') + + def train_one_epoch(train_file_idx, epoch_num): + is_training = True + + for i in range(num_train_file): + cur_train_filename = os.path.join(hdf5_data_dir, train_file_list[train_file_idx[i]]) + printout(flog, 'Loading train file ' + cur_train_filename) + + cur_data, cur_labels, cur_seg = provider.load_h5_data_label_seg(cur_train_filename) + cur_data, cur_labels, order = provider.shuffle_data(cur_data, np.squeeze(cur_labels)) + cur_seg = cur_seg[order, ...] + + cur_labels_one_hot = convert_label_to_one_hot(cur_labels) + + num_data = len(cur_labels) + num_batch = num_data // (FLAGS.num_gpu * batch_size) # For all working gpus + + total_loss = 0.0 + total_seg_acc = 0.0 + + for j in range(num_batch): + begidx_0 = j * batch_size + endidx_0 = (j + 1) * batch_size + begidx_1 = (j + 1) * batch_size + endidx_1 = (j + 2) * batch_size + + feed_dict = { + # For the first gpu + pointclouds_phs[0]: cur_data[begidx_0: endidx_0, ...], + input_label_phs[0]: cur_labels_one_hot[begidx_0: endidx_0, ...], + seg_phs[0]: cur_seg[begidx_0: endidx_0, ...], + is_training_phs[0]: is_training, + # For the second gpu + pointclouds_phs[1]: cur_data[begidx_1: endidx_1, ...], + input_label_phs[1]: cur_labels_one_hot[begidx_1: endidx_1, ...], + seg_phs[1]: cur_seg[begidx_1: endidx_1, ...], + is_training_phs[1]: is_training, + } + + + # train_op is for both gpus, and the others are for gpu_1 + _, loss_val, per_instance_seg_loss_val, seg_pred_val, pred_seg_res \ + = sess.run([train_op, loss, per_instance_seg_loss, seg_pred, per_instance_seg_pred_res], \ + feed_dict=feed_dict) + + per_instance_part_acc = np.mean(pred_seg_res == cur_seg[begidx_1: endidx_1, ...], axis=1) + average_part_acc = np.mean(per_instance_part_acc) + + total_loss += loss_val + total_seg_acc += average_part_acc + + total_loss = total_loss * 1.0 / num_batch + total_seg_acc = total_seg_acc * 1.0 / num_batch + + lr_sum, bn_decay_sum, batch_sum, train_loss_sum, train_seg_acc_sum = sess.run(\ + [lr_op, bn_decay_op, batch_op, total_train_loss_sum_op, seg_train_acc_sum_op], \ + feed_dict={total_training_loss_ph: total_loss, seg_training_acc_ph: total_seg_acc}) + + train_writer.add_summary(train_loss_sum, i + epoch_num * num_train_file) + train_writer.add_summary(lr_sum, i + epoch_num * num_train_file) + train_writer.add_summary(bn_decay_sum, i + epoch_num * num_train_file) + train_writer.add_summary(train_seg_acc_sum, i + epoch_num * num_train_file) + train_writer.add_summary(batch_sum, i + epoch_num * num_train_file) + + printout(flog, '\tTraining Total Mean_loss: %f' % total_loss) + printout(flog, '\t\tTraining Seg Accuracy: %f' % total_seg_acc) + + def eval_one_epoch(epoch_num): + is_training = False + + total_loss = 0.0 + total_seg_acc = 0.0 + total_seen = 0 + + total_seg_acc_per_cat = np.zeros((NUM_CATEGORIES)).astype(np.float32) + total_seen_per_cat = np.zeros((NUM_CATEGORIES)).astype(np.int32) + + for i in range(num_test_file): + cur_test_filename = os.path.join(hdf5_data_dir, test_file_list[i]) + printout(flog, 'Loading test file ' + cur_test_filename) + + cur_data, cur_labels, cur_seg = provider.load_h5_data_label_seg(cur_test_filename) + cur_labels = np.squeeze(cur_labels) + + cur_labels_one_hot = convert_label_to_one_hot(cur_labels) + + num_data = len(cur_labels) + num_batch = num_data // batch_size + + # Run on gpu_1, since the tensors used for evaluation are defined on gpu_1 + for j in range(num_batch): + begidx = j * batch_size + endidx = (j + 1) * batch_size + feed_dict = { + pointclouds_phs[1]: cur_data[begidx: endidx, ...], + input_label_phs[1]: cur_labels_one_hot[begidx: endidx, ...], + seg_phs[1]: cur_seg[begidx: endidx, ...], + is_training_phs[1]: is_training} + + loss_val, per_instance_seg_loss_val, seg_pred_val, pred_seg_res \ + = sess.run([loss, per_instance_seg_loss, seg_pred, per_instance_seg_pred_res], \ + feed_dict=feed_dict) + + per_instance_part_acc = np.mean(pred_seg_res == cur_seg[begidx: endidx, ...], axis=1) + average_part_acc = np.mean(per_instance_part_acc) + + total_seen += 1 + total_loss += loss_val + + total_seg_acc += average_part_acc + + for shape_idx in range(begidx, endidx): + total_seen_per_cat[cur_labels[shape_idx]] += 1 + total_seg_acc_per_cat[cur_labels[shape_idx]] += per_instance_part_acc[shape_idx - begidx] + + total_loss = total_loss * 1.0 / total_seen + total_seg_acc = total_seg_acc * 1.0 / total_seen + + test_loss_sum, test_seg_acc_sum = sess.run(\ + [total_test_loss_sum_op, seg_test_acc_sum_op], \ + feed_dict={total_testing_loss_ph: total_loss, \ + seg_testing_acc_ph: total_seg_acc}) + + test_writer.add_summary(test_loss_sum, (epoch_num+1) * num_train_file-1) + test_writer.add_summary(test_seg_acc_sum, (epoch_num+1) * num_train_file-1) + + printout(flog, '\tTesting Total Mean_loss: %f' % total_loss) + printout(flog, '\t\tTesting Seg Accuracy: %f' % total_seg_acc) + + for cat_idx in range(NUM_CATEGORIES): + if total_seen_per_cat[cat_idx] > 0: + printout(flog, '\n\t\tCategory %s Object Number: %d' % (all_obj_cats[cat_idx][0], total_seen_per_cat[cat_idx])) + printout(flog, '\t\tCategory %s Seg Accuracy: %f' % (all_obj_cats[cat_idx][0], total_seg_acc_per_cat[cat_idx]/total_seen_per_cat[cat_idx])) + + if not os.path.exists(MODEL_STORAGE_PATH): + os.mkdir(MODEL_STORAGE_PATH) + + for epoch in range(TRAINING_EPOCHES): + printout(flog, '\n<<< Testing on the test dataset ...') + eval_one_epoch(epoch) + + printout(flog, '\n>>> Training for the epoch %d/%d ...' % (epoch, TRAINING_EPOCHES)) + + train_file_idx = np.arange(0, len(train_file_list)) + np.random.shuffle(train_file_idx) + + train_one_epoch(train_file_idx, epoch) + + if epoch % 5 == 0: + cp_filename = saver.save(sess, os.path.join(MODEL_STORAGE_PATH, 'epoch_' + str(epoch)+'.ckpt')) + printout(flog, 'Successfully store the checkpoint model into ' + cp_filename) + + flog.flush() + + flog.close() + +if __name__=='__main__': + train() diff --git a/zoo/SimpleView/dgcnn/tensorflow/provider.py b/zoo/SimpleView/dgcnn/tensorflow/provider.py new file mode 100644 index 0000000..5b327aa --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/provider.py @@ -0,0 +1,157 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Download dataset for point cloud classification +DATA_DIR = os.path.join(BASE_DIR, 'data') +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in xrange(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in xrange(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in xrange(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] # (2048, 2048, 3) + label = f['label'][:] # (2048, 1) + seg = f['pid'][:] # (2048, 2048) + return (data, label, seg) diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/README.md b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/README.md new file mode 100644 index 0000000..ba68886 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/README.md @@ -0,0 +1,33 @@ +## Semantic segmentation of indoor scenes + +### Dataset + +1. Donwload prepared HDF5 data for training: +``` +sh +x download_data.sh +``` +2. Download 3D indoor parsing dataset (S3DIS Dataset) for testing and visualization. "Stanford3dDataset_v1.2_Aligned_Version.zip" of the dataset is used. Unzip the downloaded file into "dgcnn/data/", and then run +``` +python collect_indoor3d_data.py +``` +to generate "dgcnn/data/stanford_indoor3d" + +### Train + +We use 6-fold training, such that 6 models are trained leaving 1 of 6 areas as the testing area for each model. We keep using 2 GPUs for distributed training. To train 6 models sequentially, run +``` +sh +x train_job.sh +``` + +### Evaluation + +1. To generate predicted results for all 6 areas, run +``` +sh +x test_job.sh +``` +The model parameters are saved every 10 epochs, the saved model used to generate predited results can be changed by setting "--model_path" in "test_job.sh". For example, if you want to use the model saved after 70 epochs, you can set "--model_path" to "log*n*/epoch_70.ckpt" for *n* = 1, 2, ..., 6. To visualize the results, you can add "--visu" flag in the end of each line in "test_job.sh". + +2. To obtain overall quantitative evaluation results, run +``` +python eval_iou_accuracy.py +``` diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/batch_inference.py b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/batch_inference.py new file mode 100644 index 0000000..a300277 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/batch_inference.py @@ -0,0 +1,173 @@ +import argparse +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +from model import * +import indoor3d_util + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 1]') +parser.add_argument('--num_point', type=int, default=4096, help='Point number [default: 4096]') +parser.add_argument('--model_path', required=True, help='model checkpoint file path') +parser.add_argument('--dump_dir', required=True, help='dump folder path') +parser.add_argument('--output_filelist', required=True, help='TXT filename, filelist, each line is an output for a room') +parser.add_argument('--room_data_filelist', required=True, help='TXT filename, filelist, each line is a test room data label file.') +parser.add_argument('--no_clutter', action='store_true', help='If true, donot count the clutter class') +parser.add_argument('--visu', action='store_true', help='Whether to output OBJ file for prediction visualization.') +FLAGS = parser.parse_args() + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') +ROOM_PATH_LIST = [os.path.join(ROOT_DIR,line.rstrip()) for line in open(FLAGS.room_data_filelist)] + +NUM_CLASSES = 13 + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + pred = get_model(pointclouds_pl, is_training_pl) + loss = get_loss(pred, labels_pl) + pred_softmax = tf.nn.softmax(pred) + + saver = tf.train.Saver() + + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + sess = tf.Session(config=config) + + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'pred_softmax': pred_softmax, + 'loss': loss} + + total_correct = 0 + total_seen = 0 + fout_out_filelist = open(FLAGS.output_filelist, 'w') + for room_path in ROOM_PATH_LIST: + out_data_label_filename = os.path.basename(room_path)[:-4] + '_pred.txt' + out_data_label_filename = os.path.join(DUMP_DIR, out_data_label_filename) + out_gt_label_filename = os.path.basename(room_path)[:-4] + '_gt.txt' + out_gt_label_filename = os.path.join(DUMP_DIR, out_gt_label_filename) + + print(room_path, out_data_label_filename) + # Evaluate room one by one. + a, b = eval_one_epoch(sess, ops, room_path, out_data_label_filename, out_gt_label_filename) + total_correct += a + total_seen += b + fout_out_filelist.write(out_data_label_filename+'\n') + fout_out_filelist.close() + log_string('all room eval accuracy: %f'% (total_correct / float(total_seen))) + +def eval_one_epoch(sess, ops, room_path, out_data_label_filename, out_gt_label_filename): + error_cnt = 0 + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + if FLAGS.visu: + fout = open(os.path.join(DUMP_DIR, os.path.basename(room_path)[:-4]+'_pred.obj'), 'w') + fout_gt = open(os.path.join(DUMP_DIR, os.path.basename(room_path)[:-4]+'_gt.obj'), 'w') + fout_real_color = open(os.path.join(DUMP_DIR, os.path.basename(room_path)[:-4]+'_real_color.obj'), 'w') + fout_data_label = open(out_data_label_filename, 'w') + fout_gt_label = open(out_gt_label_filename, 'w') + + current_data, current_label = indoor3d_util.room2blocks_wrapper_normalized(room_path, NUM_POINT) + current_data = current_data[:,0:NUM_POINT,:] + current_label = np.squeeze(current_label) + # Get room dimension.. + data_label = np.load(room_path) + data = data_label[:,0:6] + max_room_x = max(data[:,0]) + max_room_y = max(data[:,1]) + max_room_z = max(data[:,2]) + + file_size = current_data.shape[0] + num_batches = file_size // BATCH_SIZE + print(file_size) + + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + cur_batch_size = end_idx - start_idx + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred_softmax']], + feed_dict=feed_dict) + + if FLAGS.no_clutter: + pred_label = np.argmax(pred_val[:,:,0:12], 2) # BxN + else: + pred_label = np.argmax(pred_val, 2) # BxN + + # Save prediction labels to OBJ file + for b in range(BATCH_SIZE): + pts = current_data[start_idx+b, :, :] + l = current_label[start_idx+b,:] + pts[:,6] *= max_room_x + pts[:,7] *= max_room_y + pts[:,8] *= max_room_z + pts[:,3:6] *= 255.0 + pred = pred_label[b, :] + for i in range(NUM_POINT): + color = indoor3d_util.g_label2color[pred[i]] + color_gt = indoor3d_util.g_label2color[current_label[start_idx+b, i]] + if FLAGS.visu: + fout.write('v %f %f %f %d %d %d\n' % (pts[i,6], pts[i,7], pts[i,8], color[0], color[1], color[2])) + fout_gt.write('v %f %f %f %d %d %d\n' % (pts[i,6], pts[i,7], pts[i,8], color_gt[0], color_gt[1], color_gt[2])) + fout_data_label.write('%f %f %f %d %d %d %f %d\n' % (pts[i,6], pts[i,7], pts[i,8], pts[i,3], pts[i,4], pts[i,5], pred_val[b,i,pred[i]], pred[i])) + fout_gt_label.write('%d\n' % (l[i])) + + correct = np.sum(pred_label == current_label[start_idx:end_idx,:]) + total_correct += correct + total_seen += (cur_batch_size*NUM_POINT) + loss_sum += (loss_val*BATCH_SIZE) + for i in range(start_idx, end_idx): + for j in range(NUM_POINT): + l = current_label[i, j] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_label[i-start_idx, j] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen/NUM_POINT))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + fout_data_label.close() + fout_gt_label.close() + if FLAGS.visu: + fout.close() + fout_gt.close() + return total_correct, total_seen + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate() + LOG_FOUT.close() diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/collect_indoor3d_data.py b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/collect_indoor3d_data.py new file mode 100644 index 0000000..9f6034d --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/collect_indoor3d_data.py @@ -0,0 +1,23 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +import indoor3d_util + +anno_paths = [line.rstrip() for line in open(os.path.join(BASE_DIR, 'meta/anno_paths.txt'))] +anno_paths = [os.path.join(indoor3d_util.DATA_PATH, p) for p in anno_paths] + +output_folder = os.path.join(ROOT_DIR, 'data/stanford_indoor3d') +if not os.path.exists(output_folder): + os.mkdir(output_folder) + +# Note: there is an extra character in the v1.2 data in Area_5/hallway_6. It's fixed manually. +for anno_path in anno_paths: + print(anno_path) + try: + elements = anno_path.split('/') + out_filename = elements[-3]+'_'+elements[-2]+'.npy' + indoor3d_util.collect_point_label(anno_path, os.path.join(output_folder, out_filename), 'numpy') + except: + print(anno_path, 'ERROR!!') diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/download_data.sh b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/download_data.sh new file mode 100644 index 0000000..8b851a9 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/download_data.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Download HDF5 for indoor 3d semantic segmentation (around 1.6GB) -> 'indoor3d_sem_seg_hdf5_data' +wget https://shapenet.cs.stanford.edu/media/indoor3d_sem_seg_hdf5_data.zip +unzip indoor3d_sem_seg_hdf5_data.zip +rm indoor3d_sem_seg_hdf5_data.zip \ No newline at end of file diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/eval_iou_accuracy.py b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/eval_iou_accuracy.py new file mode 100644 index 0000000..fbcc220 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/eval_iou_accuracy.py @@ -0,0 +1,44 @@ +import numpy as np + +pred_data_label_filenames = [] +for i in range(1,7): + file_name = 'log{}/output_filelist.txt'.format(i) + pred_data_label_filenames += [line.rstrip() for line in open(file_name)] + +gt_label_filenames = [f.rstrip('_pred\.txt') + '_gt.txt' for f in pred_data_label_filenames] + +num_room = len(gt_label_filenames) + +gt_classes = [0 for _ in range(13)] +positive_classes = [0 for _ in range(13)] +true_positive_classes = [0 for _ in range(13)] + +for i in range(num_room): + print(i) + data_label = np.loadtxt(pred_data_label_filenames[i]) + pred_label = data_label[:,-1] + gt_label = np.loadtxt(gt_label_filenames[i]) + print(gt_label.shape) + for j in xrange(gt_label.shape[0]): + gt_l = int(gt_label[j]) + pred_l = int(pred_label[j]) + gt_classes[gt_l] += 1 + positive_classes[pred_l] += 1 + true_positive_classes[gt_l] += int(gt_l==pred_l) + + +print(gt_classes) +print(positive_classes) +print(true_positive_classes) + +print('Overall accuracy: {0}'.format(sum(true_positive_classes)/float(sum(positive_classes)))) + +print 'IoU:' +iou_list = [] +for i in range(13): + iou = true_positive_classes[i]/float(gt_classes[i]+positive_classes[i]-true_positive_classes[i]) + print(iou) + iou_list.append(iou) + +print 'avg IoU:' +print(sum(iou_list)/13.0) diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/indoor3d_util.py b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/indoor3d_util.py new file mode 100644 index 0000000..78b7336 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/indoor3d_util.py @@ -0,0 +1,591 @@ +import numpy as np +import glob +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) + +# ----------------------------------------------------------------------------- +# CONSTANTS +# ----------------------------------------------------------------------------- + +DATA_PATH = os.path.join(ROOT_DIR, 'data', 'Stanford3dDataset_v1.2_Aligned_Version') +g_classes = [x.rstrip() for x in open(os.path.join(BASE_DIR, 'meta/class_names.txt'))] +g_class2label = {cls: i for i,cls in enumerate(g_classes)} +g_class2color = {'ceiling': [0,255,0], + 'floor': [0,0,255], + 'wall': [0,255,255], + 'beam': [255,255,0], + 'column': [255,0,255], + 'window': [100,100,255], + 'door': [200,200,100], + 'table': [170,120,200], + 'chair': [255,0,0], + 'sofa': [200,100,100], + 'bookcase': [10,200,100], + 'board': [200,200,200], + 'clutter': [50,50,50]} +g_easy_view_labels = [7,8,9,10,11,1] +g_label2color = {g_classes.index(cls): g_class2color[cls] for cls in g_classes} + + +# ----------------------------------------------------------------------------- +# CONVERT ORIGINAL DATA TO OUR DATA_LABEL FILES +# ----------------------------------------------------------------------------- + +def collect_point_label(anno_path, out_filename, file_format='txt'): + """ Convert original dataset files to data_label file (each line is XYZRGBL). + We aggregated all the points from each instance in the room. + + Args: + anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ + out_filename: path to save collected points and labels (each line is XYZRGBL) + file_format: txt or numpy, determines what file format to save. + Returns: + None + Note: + the points are shifted before save, the most negative point is now at origin. + """ + points_list = [] + + for f in glob.glob(os.path.join(anno_path, '*.txt')): + cls = os.path.basename(f).split('_')[0] + if cls not in g_classes: # note: in some room there is 'staris' class.. + cls = 'clutter' + points = np.loadtxt(f) + labels = np.ones((points.shape[0],1)) * g_class2label[cls] + points_list.append(np.concatenate([points, labels], 1)) # Nx7 + + + data_label = np.concatenate(points_list, 0) + xyz_min = np.amin(data_label, axis=0)[0:3] + data_label[:, 0:3] -= xyz_min + + if file_format=='txt': + fout = open(out_filename, 'w') + for i in range(data_label.shape[0]): + fout.write('%f %f %f %d %d %d %d\n' % \ + (data_label[i,0], data_label[i,1], data_label[i,2], + data_label[i,3], data_label[i,4], data_label[i,5], + data_label[i,6])) + fout.close() + elif file_format=='numpy': + np.save(out_filename, data_label) + else: + print('ERROR!! Unknown file format: %s, please use txt or numpy.' % \ + (file_format)) + exit() + +def point_label_to_obj(input_filename, out_filename, label_color=True, easy_view=False, no_wall=False): + """ For visualization of a room from data_label file, + input_filename: each line is X Y Z R G B L + out_filename: OBJ filename, + visualize input file by coloring point with label color + easy_view: only visualize furnitures and floor + """ + data_label = np.loadtxt(input_filename) + data = data_label[:, 0:6] + label = data_label[:, -1].astype(int) + fout = open(out_filename, 'w') + for i in range(data.shape[0]): + color = g_label2color[label[i]] + if easy_view and (label[i] not in g_easy_view_labels): + continue + if no_wall and ((label[i] == 2) or (label[i]==0)): + continue + if label_color: + fout.write('v %f %f %f %d %d %d\n' % \ + (data[i,0], data[i,1], data[i,2], color[0], color[1], color[2])) + else: + fout.write('v %f %f %f %d %d %d\n' % \ + (data[i,0], data[i,1], data[i,2], data[i,3], data[i,4], data[i,5])) + fout.close() + + + +# ----------------------------------------------------------------------------- +# PREPARE BLOCK DATA FOR DEEPNETS TRAINING/TESTING +# ----------------------------------------------------------------------------- + +def sample_data(data, num_sample): + """ data is in N x ... + we want to keep num_samplexC of them. + if N > num_sample, we will randomly keep num_sample of them. + if N < num_sample, we will randomly duplicate samples. + """ + N = data.shape[0] + if (N == num_sample): + return data, range(N) + elif (N > num_sample): + sample = np.random.choice(N, num_sample) + return data[sample, ...], sample + else: + sample = np.random.choice(N, num_sample-N) + dup_data = data[sample, ...] + return np.concatenate([data, dup_data], 0), range(N)+list(sample) + +def sample_data_label(data, label, num_sample): + new_data, sample_indices = sample_data(data, num_sample) + new_label = label[sample_indices] + return new_data, new_label + +def room2blocks(data, label, num_point, block_size=1.0, stride=1.0, + random_sample=False, sample_num=None, sample_aug=1): + """ Prepare block training data. + Args: + data: N x 6 numpy array, 012 are XYZ in meters, 345 are RGB in [0,1] + assumes the data is shifted (min point is origin) and aligned + (aligned with XYZ axis) + label: N size uint8 numpy array from 0-12 + num_point: int, how many points to sample in each block + block_size: float, physical size of the block in meters + stride: float, stride for block sweeping + random_sample: bool, if True, we will randomly sample blocks in the room + sample_num: int, if random sample, how many blocks to sample + [default: room area] + sample_aug: if random sample, how much aug + Returns: + block_datas: K x num_point x 6 np array of XYZRGB, RGB is in [0,1] + block_labels: K x num_point x 1 np array of uint8 labels + + TODO: for this version, blocking is in fixed, non-overlapping pattern. + """ + assert(stride<=block_size) + + limit = np.amax(data, 0)[0:3] + + # Get the corner location for our sampling blocks + xbeg_list = [] + ybeg_list = [] + if not random_sample: + num_block_x = int(np.ceil((limit[0] - block_size) / stride)) + 1 + num_block_y = int(np.ceil((limit[1] - block_size) / stride)) + 1 + for i in range(num_block_x): + for j in range(num_block_y): + xbeg_list.append(i*stride) + ybeg_list.append(j*stride) + else: + num_block_x = int(np.ceil(limit[0] / block_size)) + num_block_y = int(np.ceil(limit[1] / block_size)) + if sample_num is None: + sample_num = num_block_x * num_block_y * sample_aug + for _ in range(sample_num): + xbeg = np.random.uniform(-block_size, limit[0]) + ybeg = np.random.uniform(-block_size, limit[1]) + xbeg_list.append(xbeg) + ybeg_list.append(ybeg) + + # Collect blocks + block_data_list = [] + block_label_list = [] + idx = 0 + for idx in range(len(xbeg_list)): + xbeg = xbeg_list[idx] + ybeg = ybeg_list[idx] + xcond = (data[:,0]<=xbeg+block_size) & (data[:,0]>=xbeg) + ycond = (data[:,1]<=ybeg+block_size) & (data[:,1]>=ybeg) + cond = xcond & ycond + if np.sum(cond) < 100: # discard block if there are less than 100 pts. + continue + + block_data = data[cond, :] + block_label = label[cond] + + # randomly subsample data + block_data_sampled, block_label_sampled = \ + sample_data_label(block_data, block_label, num_point) + block_data_list.append(np.expand_dims(block_data_sampled, 0)) + block_label_list.append(np.expand_dims(block_label_sampled, 0)) + + return np.concatenate(block_data_list, 0), \ + np.concatenate(block_label_list, 0) + + +def room2blocks_plus(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug): + """ room2block with input filename and RGB preprocessing. + """ + data = data_label[:,0:6] + data[:,3:6] /= 255.0 + label = data_label[:,-1].astype(np.uint8) + + return room2blocks(data, label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + +def room2blocks_wrapper(data_label_filename, num_point, block_size=1.0, stride=1.0, + random_sample=False, sample_num=None, sample_aug=1): + if data_label_filename[-3:] == 'txt': + data_label = np.loadtxt(data_label_filename) + elif data_label_filename[-3:] == 'npy': + data_label = np.load(data_label_filename) + else: + print('Unknown file type! exiting.') + exit() + return room2blocks_plus(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + +def room2blocks_plus_normalized(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug): + """ room2block, with input filename and RGB preprocessing. + for each block centralize XYZ, add normalized XYZ as 678 channels + """ + data = data_label[:,0:6] + data[:,3:6] /= 255.0 + label = data_label[:,-1].astype(np.uint8) + max_room_x = max(data[:,0]) + max_room_y = max(data[:,1]) + max_room_z = max(data[:,2]) + + data_batch, label_batch = room2blocks(data, label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + new_data_batch = np.zeros((data_batch.shape[0], num_point, 9)) + for b in range(data_batch.shape[0]): + new_data_batch[b, :, 6] = data_batch[b, :, 0]/max_room_x + new_data_batch[b, :, 7] = data_batch[b, :, 1]/max_room_y + new_data_batch[b, :, 8] = data_batch[b, :, 2]/max_room_z + minx = min(data_batch[b, :, 0]) + miny = min(data_batch[b, :, 1]) + data_batch[b, :, 0] -= (minx+block_size/2) + data_batch[b, :, 1] -= (miny+block_size/2) + new_data_batch[:, :, 0:6] = data_batch + return new_data_batch, label_batch + + +def room2blocks_wrapper_normalized(data_label_filename, num_point, block_size=1.0, stride=1.0, + random_sample=False, sample_num=None, sample_aug=1): + if data_label_filename[-3:] == 'txt': + data_label = np.loadtxt(data_label_filename) + elif data_label_filename[-3:] == 'npy': + data_label = np.load(data_label_filename) + else: + print('Unknown file type! exiting.') + exit() + return room2blocks_plus_normalized(data_label, num_point, block_size, stride, + random_sample, sample_num, sample_aug) + +def room2samples(data, label, sample_num_point): + """ Prepare whole room samples. + + Args: + data: N x 6 numpy array, 012 are XYZ in meters, 345 are RGB in [0,1] + assumes the data is shifted (min point is origin) and + aligned (aligned with XYZ axis) + label: N size uint8 numpy array from 0-12 + sample_num_point: int, how many points to sample in each sample + Returns: + sample_datas: K x sample_num_point x 9 + numpy array of XYZRGBX'Y'Z', RGB is in [0,1] + sample_labels: K x sample_num_point x 1 np array of uint8 labels + """ + N = data.shape[0] + order = np.arange(N) + np.random.shuffle(order) + data = data[order, :] + label = label[order] + + batch_num = int(np.ceil(N / float(sample_num_point))) + sample_datas = np.zeros((batch_num, sample_num_point, 6)) + sample_labels = np.zeros((batch_num, sample_num_point, 1)) + + for i in range(batch_num): + beg_idx = i*sample_num_point + end_idx = min((i+1)*sample_num_point, N) + num = end_idx - beg_idx + sample_datas[i,0:num,:] = data[beg_idx:end_idx, :] + sample_labels[i,0:num,0] = label[beg_idx:end_idx] + if num < sample_num_point: + makeup_indices = np.random.choice(N, sample_num_point - num) + sample_datas[i,num:,:] = data[makeup_indices, :] + sample_labels[i,num:,0] = label[makeup_indices] + return sample_datas, sample_labels + +def room2samples_plus_normalized(data_label, num_point): + """ room2sample, with input filename and RGB preprocessing. + for each block centralize XYZ, add normalized XYZ as 678 channels + """ + data = data_label[:,0:6] + data[:,3:6] /= 255.0 + label = data_label[:,-1].astype(np.uint8) + max_room_x = max(data[:,0]) + max_room_y = max(data[:,1]) + max_room_z = max(data[:,2]) + #print(max_room_x, max_room_y, max_room_z) + + data_batch, label_batch = room2samples(data, label, num_point) + new_data_batch = np.zeros((data_batch.shape[0], num_point, 9)) + for b in range(data_batch.shape[0]): + new_data_batch[b, :, 6] = data_batch[b, :, 0]/max_room_x + new_data_batch[b, :, 7] = data_batch[b, :, 1]/max_room_y + new_data_batch[b, :, 8] = data_batch[b, :, 2]/max_room_z + #minx = min(data_batch[b, :, 0]) + #miny = min(data_batch[b, :, 1]) + #data_batch[b, :, 0] -= (minx+block_size/2) + #data_batch[b, :, 1] -= (miny+block_size/2) + new_data_batch[:, :, 0:6] = data_batch + return new_data_batch, label_batch + + +def room2samples_wrapper_normalized(data_label_filename, num_point): + if data_label_filename[-3:] == 'txt': + data_label = np.loadtxt(data_label_filename) + elif data_label_filename[-3:] == 'npy': + data_label = np.load(data_label_filename) + else: + print('Unknown file type! exiting.') + exit() + return room2samples_plus_normalized(data_label, num_point) + + +# ----------------------------------------------------------------------------- +# EXTRACT INSTANCE BBOX FROM ORIGINAL DATA (for detection evaluation) +# ----------------------------------------------------------------------------- + +def collect_bounding_box(anno_path, out_filename): + """ Compute bounding boxes from each instance in original dataset files on + one room. **We assume the bbox is aligned with XYZ coordinate.** + + Args: + anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ + out_filename: path to save instance bounding boxes for that room. + each line is x1 y1 z1 x2 y2 z2 label, + where (x1,y1,z1) is the point on the diagonal closer to origin + Returns: + None + Note: + room points are shifted, the most negative point is now at origin. + """ + bbox_label_list = [] + + for f in glob.glob(os.path.join(anno_path, '*.txt')): + cls = os.path.basename(f).split('_')[0] + if cls not in g_classes: # note: in some room there is 'staris' class.. + cls = 'clutter' + points = np.loadtxt(f) + label = g_class2label[cls] + # Compute tightest axis aligned bounding box + xyz_min = np.amin(points[:, 0:3], axis=0) + xyz_max = np.amax(points[:, 0:3], axis=0) + ins_bbox_label = np.expand_dims( + np.concatenate([xyz_min, xyz_max, np.array([label])], 0), 0) + bbox_label_list.append(ins_bbox_label) + + bbox_label = np.concatenate(bbox_label_list, 0) + room_xyz_min = np.amin(bbox_label[:, 0:3], axis=0) + bbox_label[:, 0:3] -= room_xyz_min + bbox_label[:, 3:6] -= room_xyz_min + + fout = open(out_filename, 'w') + for i in range(bbox_label.shape[0]): + fout.write('%f %f %f %f %f %f %d\n' % \ + (bbox_label[i,0], bbox_label[i,1], bbox_label[i,2], + bbox_label[i,3], bbox_label[i,4], bbox_label[i,5], + bbox_label[i,6])) + fout.close() + +def bbox_label_to_obj(input_filename, out_filename_prefix, easy_view=False): + """ Visualization of bounding boxes. + + Args: + input_filename: each line is x1 y1 z1 x2 y2 z2 label + out_filename_prefix: OBJ filename prefix, + visualize object by g_label2color + easy_view: if True, only visualize furniture and floor + Returns: + output a list of OBJ file and MTL files with the same prefix + """ + bbox_label = np.loadtxt(input_filename) + bbox = bbox_label[:, 0:6] + label = bbox_label[:, -1].astype(int) + v_cnt = 0 # count vertex + ins_cnt = 0 # count instance + for i in range(bbox.shape[0]): + if easy_view and (label[i] not in g_easy_view_labels): + continue + obj_filename = out_filename_prefix+'_'+g_classes[label[i]]+'_'+str(ins_cnt)+'.obj' + mtl_filename = out_filename_prefix+'_'+g_classes[label[i]]+'_'+str(ins_cnt)+'.mtl' + fout_obj = open(obj_filename, 'w') + fout_mtl = open(mtl_filename, 'w') + fout_obj.write('mtllib %s\n' % (os.path.basename(mtl_filename))) + + length = bbox[i, 3:6] - bbox[i, 0:3] + a = length[0] + b = length[1] + c = length[2] + x = bbox[i, 0] + y = bbox[i, 1] + z = bbox[i, 2] + color = np.array(g_label2color[label[i]], dtype=float) / 255.0 + + material = 'material%d' % (ins_cnt) + fout_obj.write('usemtl %s\n' % (material)) + fout_obj.write('v %f %f %f\n' % (x,y,z+c)) + fout_obj.write('v %f %f %f\n' % (x,y+b,z+c)) + fout_obj.write('v %f %f %f\n' % (x+a,y+b,z+c)) + fout_obj.write('v %f %f %f\n' % (x+a,y,z+c)) + fout_obj.write('v %f %f %f\n' % (x,y,z)) + fout_obj.write('v %f %f %f\n' % (x,y+b,z)) + fout_obj.write('v %f %f %f\n' % (x+a,y+b,z)) + fout_obj.write('v %f %f %f\n' % (x+a,y,z)) + fout_obj.write('g default\n') + v_cnt = 0 # for individual box + fout_obj.write('f %d %d %d %d\n' % (4+v_cnt, 3+v_cnt, 2+v_cnt, 1+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (1+v_cnt, 2+v_cnt, 6+v_cnt, 5+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (7+v_cnt, 6+v_cnt, 2+v_cnt, 3+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (4+v_cnt, 8+v_cnt, 7+v_cnt, 3+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5+v_cnt, 8+v_cnt, 4+v_cnt, 1+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5+v_cnt, 6+v_cnt, 7+v_cnt, 8+v_cnt)) + fout_obj.write('\n') + + fout_mtl.write('newmtl %s\n' % (material)) + fout_mtl.write('Kd %f %f %f\n' % (color[0], color[1], color[2])) + fout_mtl.write('\n') + fout_obj.close() + fout_mtl.close() + + v_cnt += 8 + ins_cnt += 1 + +def bbox_label_to_obj_room(input_filename, out_filename_prefix, easy_view=False, permute=None, center=False, exclude_table=False): + """ Visualization of bounding boxes. + + Args: + input_filename: each line is x1 y1 z1 x2 y2 z2 label + out_filename_prefix: OBJ filename prefix, + visualize object by g_label2color + easy_view: if True, only visualize furniture and floor + permute: if not None, permute XYZ for rendering, e.g. [0 2 1] + center: if True, move obj to have zero origin + Returns: + output a list of OBJ file and MTL files with the same prefix + """ + bbox_label = np.loadtxt(input_filename) + bbox = bbox_label[:, 0:6] + if permute is not None: + assert(len(permute)==3) + permute = np.array(permute) + bbox[:,0:3] = bbox[:,permute] + bbox[:,3:6] = bbox[:,permute+3] + if center: + xyz_max = np.amax(bbox[:,3:6], 0) + bbox[:,0:3] -= (xyz_max/2.0) + bbox[:,3:6] -= (xyz_max/2.0) + bbox /= np.max(xyz_max/2.0) + label = bbox_label[:, -1].astype(int) + obj_filename = out_filename_prefix+'.obj' + mtl_filename = out_filename_prefix+'.mtl' + + fout_obj = open(obj_filename, 'w') + fout_mtl = open(mtl_filename, 'w') + fout_obj.write('mtllib %s\n' % (os.path.basename(mtl_filename))) + v_cnt = 0 # count vertex + ins_cnt = 0 # count instance + for i in range(bbox.shape[0]): + if easy_view and (label[i] not in g_easy_view_labels): + continue + if exclude_table and label[i] == g_classes.index('table'): + continue + + length = bbox[i, 3:6] - bbox[i, 0:3] + a = length[0] + b = length[1] + c = length[2] + x = bbox[i, 0] + y = bbox[i, 1] + z = bbox[i, 2] + color = np.array(g_label2color[label[i]], dtype=float) / 255.0 + + material = 'material%d' % (ins_cnt) + fout_obj.write('usemtl %s\n' % (material)) + fout_obj.write('v %f %f %f\n' % (x,y,z+c)) + fout_obj.write('v %f %f %f\n' % (x,y+b,z+c)) + fout_obj.write('v %f %f %f\n' % (x+a,y+b,z+c)) + fout_obj.write('v %f %f %f\n' % (x+a,y,z+c)) + fout_obj.write('v %f %f %f\n' % (x,y,z)) + fout_obj.write('v %f %f %f\n' % (x,y+b,z)) + fout_obj.write('v %f %f %f\n' % (x+a,y+b,z)) + fout_obj.write('v %f %f %f\n' % (x+a,y,z)) + fout_obj.write('g default\n') + fout_obj.write('f %d %d %d %d\n' % (4+v_cnt, 3+v_cnt, 2+v_cnt, 1+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (1+v_cnt, 2+v_cnt, 6+v_cnt, 5+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (7+v_cnt, 6+v_cnt, 2+v_cnt, 3+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (4+v_cnt, 8+v_cnt, 7+v_cnt, 3+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5+v_cnt, 8+v_cnt, 4+v_cnt, 1+v_cnt)) + fout_obj.write('f %d %d %d %d\n' % (5+v_cnt, 6+v_cnt, 7+v_cnt, 8+v_cnt)) + fout_obj.write('\n') + + fout_mtl.write('newmtl %s\n' % (material)) + fout_mtl.write('Kd %f %f %f\n' % (color[0], color[1], color[2])) + fout_mtl.write('\n') + + v_cnt += 8 + ins_cnt += 1 + + fout_obj.close() + fout_mtl.close() + + +def collect_point_bounding_box(anno_path, out_filename, file_format): + """ Compute bounding boxes from each instance in original dataset files on + one room. **We assume the bbox is aligned with XYZ coordinate.** + Save both the point XYZRGB and the bounding box for the point's + parent element. + + Args: + anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ + out_filename: path to save instance bounding boxes for each point, + plus the point's XYZRGBL + each line is XYZRGBL offsetX offsetY offsetZ a b c, + where cx = X+offsetX, cy=X+offsetY, cz=Z+offsetZ + where (cx,cy,cz) is center of the box, a,b,c are distances from center + to the surfaces of the box, i.e. x1 = cx-a, x2 = cx+a, y1=cy-b etc. + file_format: output file format, txt or numpy + Returns: + None + + Note: + room points are shifted, the most negative point is now at origin. + """ + point_bbox_list = [] + + for f in glob.glob(os.path.join(anno_path, '*.txt')): + cls = os.path.basename(f).split('_')[0] + if cls not in g_classes: # note: in some room there is 'staris' class.. + cls = 'clutter' + points = np.loadtxt(f) # Nx6 + label = g_class2label[cls] # N, + # Compute tightest axis aligned bounding box + xyz_min = np.amin(points[:, 0:3], axis=0) # 3, + xyz_max = np.amax(points[:, 0:3], axis=0) # 3, + xyz_center = (xyz_min + xyz_max) / 2 + dimension = (xyz_max - xyz_min) / 2 + + xyz_offsets = xyz_center - points[:,0:3] # Nx3 + dimensions = np.ones((points.shape[0],3)) * dimension # Nx3 + labels = np.ones((points.shape[0],1)) * label # N + point_bbox_list.append(np.concatenate([points, labels, + xyz_offsets, dimensions], 1)) # Nx13 + + point_bbox = np.concatenate(point_bbox_list, 0) # KxNx13 + room_xyz_min = np.amin(point_bbox[:, 0:3], axis=0) + point_bbox[:, 0:3] -= room_xyz_min + + if file_format == 'txt': + fout = open(out_filename, 'w') + for i in range(point_bbox.shape[0]): + fout.write('%f %f %f %d %d %d %d %f %f %f %f %f %f\n' % \ + (point_bbox[i,0], point_bbox[i,1], point_bbox[i,2], + point_bbox[i,3], point_bbox[i,4], point_bbox[i,5], + point_bbox[i,6], + point_bbox[i,7], point_bbox[i,8], point_bbox[i,9], + point_bbox[i,10], point_bbox[i,11], point_bbox[i,12])) + + fout.close() + elif file_format == 'numpy': + np.save(out_filename, point_bbox) + else: + print('ERROR!! Unknown file format: %s, please use txt or numpy.' % \ + (file_format)) + exit() + + diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/all_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/all_data_label.txt new file mode 100644 index 0000000..636e686 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/all_data_label.txt @@ -0,0 +1,272 @@ +Area_1_conferenceRoom_1.npy +Area_1_conferenceRoom_2.npy +Area_1_copyRoom_1.npy +Area_1_hallway_1.npy +Area_1_hallway_2.npy +Area_1_hallway_3.npy +Area_1_hallway_4.npy +Area_1_hallway_5.npy +Area_1_hallway_6.npy +Area_1_hallway_7.npy +Area_1_hallway_8.npy +Area_1_office_10.npy +Area_1_office_11.npy +Area_1_office_12.npy +Area_1_office_13.npy +Area_1_office_14.npy +Area_1_office_15.npy +Area_1_office_16.npy +Area_1_office_17.npy +Area_1_office_18.npy +Area_1_office_19.npy +Area_1_office_1.npy +Area_1_office_20.npy +Area_1_office_21.npy +Area_1_office_22.npy +Area_1_office_23.npy +Area_1_office_24.npy +Area_1_office_25.npy +Area_1_office_26.npy +Area_1_office_27.npy +Area_1_office_28.npy +Area_1_office_29.npy +Area_1_office_2.npy +Area_1_office_30.npy +Area_1_office_31.npy +Area_1_office_3.npy +Area_1_office_4.npy +Area_1_office_5.npy +Area_1_office_6.npy +Area_1_office_7.npy +Area_1_office_8.npy +Area_1_office_9.npy +Area_1_pantry_1.npy +Area_1_WC_1.npy +Area_2_auditorium_1.npy +Area_2_auditorium_2.npy +Area_2_conferenceRoom_1.npy +Area_2_hallway_10.npy +Area_2_hallway_11.npy +Area_2_hallway_12.npy +Area_2_hallway_1.npy +Area_2_hallway_2.npy +Area_2_hallway_3.npy +Area_2_hallway_4.npy +Area_2_hallway_5.npy +Area_2_hallway_6.npy +Area_2_hallway_7.npy +Area_2_hallway_8.npy +Area_2_hallway_9.npy +Area_2_office_10.npy +Area_2_office_11.npy +Area_2_office_12.npy +Area_2_office_13.npy +Area_2_office_14.npy +Area_2_office_1.npy +Area_2_office_2.npy +Area_2_office_3.npy +Area_2_office_4.npy +Area_2_office_5.npy +Area_2_office_6.npy +Area_2_office_7.npy +Area_2_office_8.npy +Area_2_office_9.npy +Area_2_storage_1.npy +Area_2_storage_2.npy +Area_2_storage_3.npy +Area_2_storage_4.npy +Area_2_storage_5.npy +Area_2_storage_6.npy +Area_2_storage_7.npy +Area_2_storage_8.npy +Area_2_storage_9.npy +Area_2_WC_1.npy +Area_2_WC_2.npy +Area_3_conferenceRoom_1.npy +Area_3_hallway_1.npy +Area_3_hallway_2.npy +Area_3_hallway_3.npy +Area_3_hallway_4.npy +Area_3_hallway_5.npy +Area_3_hallway_6.npy +Area_3_lounge_1.npy +Area_3_lounge_2.npy +Area_3_office_10.npy +Area_3_office_1.npy +Area_3_office_2.npy +Area_3_office_3.npy +Area_3_office_4.npy +Area_3_office_5.npy +Area_3_office_6.npy +Area_3_office_7.npy +Area_3_office_8.npy +Area_3_office_9.npy +Area_3_storage_1.npy +Area_3_storage_2.npy +Area_3_WC_1.npy +Area_3_WC_2.npy +Area_4_conferenceRoom_1.npy +Area_4_conferenceRoom_2.npy +Area_4_conferenceRoom_3.npy +Area_4_hallway_10.npy +Area_4_hallway_11.npy +Area_4_hallway_12.npy +Area_4_hallway_13.npy +Area_4_hallway_14.npy +Area_4_hallway_1.npy +Area_4_hallway_2.npy +Area_4_hallway_3.npy +Area_4_hallway_4.npy +Area_4_hallway_5.npy +Area_4_hallway_6.npy +Area_4_hallway_7.npy +Area_4_hallway_8.npy +Area_4_hallway_9.npy +Area_4_lobby_1.npy +Area_4_lobby_2.npy +Area_4_office_10.npy +Area_4_office_11.npy +Area_4_office_12.npy +Area_4_office_13.npy +Area_4_office_14.npy +Area_4_office_15.npy +Area_4_office_16.npy +Area_4_office_17.npy +Area_4_office_18.npy +Area_4_office_19.npy +Area_4_office_1.npy +Area_4_office_20.npy +Area_4_office_21.npy +Area_4_office_22.npy +Area_4_office_2.npy +Area_4_office_3.npy +Area_4_office_4.npy +Area_4_office_5.npy +Area_4_office_6.npy +Area_4_office_7.npy +Area_4_office_8.npy +Area_4_office_9.npy +Area_4_storage_1.npy +Area_4_storage_2.npy +Area_4_storage_3.npy +Area_4_storage_4.npy +Area_4_WC_1.npy +Area_4_WC_2.npy +Area_4_WC_3.npy +Area_4_WC_4.npy +Area_5_conferenceRoom_1.npy +Area_5_conferenceRoom_2.npy +Area_5_conferenceRoom_3.npy +Area_5_hallway_10.npy +Area_5_hallway_11.npy +Area_5_hallway_12.npy +Area_5_hallway_13.npy +Area_5_hallway_14.npy +Area_5_hallway_15.npy +Area_5_hallway_1.npy +Area_5_hallway_2.npy +Area_5_hallway_3.npy +Area_5_hallway_4.npy +Area_5_hallway_5.npy +Area_5_hallway_6.npy +Area_5_hallway_7.npy +Area_5_hallway_8.npy +Area_5_hallway_9.npy +Area_5_lobby_1.npy +Area_5_office_10.npy +Area_5_office_11.npy +Area_5_office_12.npy +Area_5_office_13.npy +Area_5_office_14.npy +Area_5_office_15.npy +Area_5_office_16.npy +Area_5_office_17.npy +Area_5_office_18.npy +Area_5_office_19.npy +Area_5_office_1.npy +Area_5_office_20.npy +Area_5_office_21.npy +Area_5_office_22.npy +Area_5_office_23.npy +Area_5_office_24.npy +Area_5_office_25.npy +Area_5_office_26.npy +Area_5_office_27.npy +Area_5_office_28.npy +Area_5_office_29.npy +Area_5_office_2.npy +Area_5_office_30.npy +Area_5_office_31.npy +Area_5_office_32.npy +Area_5_office_33.npy +Area_5_office_34.npy +Area_5_office_35.npy +Area_5_office_36.npy +Area_5_office_37.npy +Area_5_office_38.npy +Area_5_office_39.npy +Area_5_office_3.npy +Area_5_office_40.npy +Area_5_office_41.npy +Area_5_office_42.npy +Area_5_office_4.npy +Area_5_office_5.npy +Area_5_office_6.npy +Area_5_office_7.npy +Area_5_office_8.npy +Area_5_office_9.npy +Area_5_pantry_1.npy +Area_5_storage_1.npy +Area_5_storage_2.npy +Area_5_storage_3.npy +Area_5_storage_4.npy +Area_5_WC_1.npy +Area_5_WC_2.npy +Area_6_conferenceRoom_1.npy +Area_6_copyRoom_1.npy +Area_6_hallway_1.npy +Area_6_hallway_2.npy +Area_6_hallway_3.npy +Area_6_hallway_4.npy +Area_6_hallway_5.npy +Area_6_hallway_6.npy +Area_6_lounge_1.npy +Area_6_office_10.npy +Area_6_office_11.npy +Area_6_office_12.npy +Area_6_office_13.npy +Area_6_office_14.npy +Area_6_office_15.npy +Area_6_office_16.npy +Area_6_office_17.npy +Area_6_office_18.npy +Area_6_office_19.npy +Area_6_office_1.npy +Area_6_office_20.npy +Area_6_office_21.npy +Area_6_office_22.npy +Area_6_office_23.npy +Area_6_office_24.npy +Area_6_office_25.npy +Area_6_office_26.npy +Area_6_office_27.npy +Area_6_office_28.npy +Area_6_office_29.npy +Area_6_office_2.npy +Area_6_office_30.npy +Area_6_office_31.npy +Area_6_office_32.npy +Area_6_office_33.npy +Area_6_office_34.npy +Area_6_office_35.npy +Area_6_office_36.npy +Area_6_office_37.npy +Area_6_office_3.npy +Area_6_office_4.npy +Area_6_office_5.npy +Area_6_office_6.npy +Area_6_office_7.npy +Area_6_office_8.npy +Area_6_office_9.npy +Area_6_openspace_1.npy +Area_6_pantry_1.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/anno_paths.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/anno_paths.txt new file mode 100644 index 0000000..0ad2f25 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/anno_paths.txt @@ -0,0 +1,272 @@ +Area_1/conferenceRoom_1/Annotations +Area_1/conferenceRoom_2/Annotations +Area_1/copyRoom_1/Annotations +Area_1/hallway_1/Annotations +Area_1/hallway_2/Annotations +Area_1/hallway_3/Annotations +Area_1/hallway_4/Annotations +Area_1/hallway_5/Annotations +Area_1/hallway_6/Annotations +Area_1/hallway_7/Annotations +Area_1/hallway_8/Annotations +Area_1/office_10/Annotations +Area_1/office_11/Annotations +Area_1/office_12/Annotations +Area_1/office_13/Annotations +Area_1/office_14/Annotations +Area_1/office_15/Annotations +Area_1/office_16/Annotations +Area_1/office_17/Annotations +Area_1/office_18/Annotations +Area_1/office_19/Annotations +Area_1/office_1/Annotations +Area_1/office_20/Annotations +Area_1/office_21/Annotations +Area_1/office_22/Annotations +Area_1/office_23/Annotations +Area_1/office_24/Annotations +Area_1/office_25/Annotations +Area_1/office_26/Annotations +Area_1/office_27/Annotations +Area_1/office_28/Annotations +Area_1/office_29/Annotations +Area_1/office_2/Annotations +Area_1/office_30/Annotations +Area_1/office_31/Annotations +Area_1/office_3/Annotations +Area_1/office_4/Annotations +Area_1/office_5/Annotations +Area_1/office_6/Annotations +Area_1/office_7/Annotations +Area_1/office_8/Annotations +Area_1/office_9/Annotations +Area_1/pantry_1/Annotations +Area_1/WC_1/Annotations +Area_2/auditorium_1/Annotations +Area_2/auditorium_2/Annotations +Area_2/conferenceRoom_1/Annotations +Area_2/hallway_10/Annotations +Area_2/hallway_11/Annotations +Area_2/hallway_12/Annotations +Area_2/hallway_1/Annotations +Area_2/hallway_2/Annotations +Area_2/hallway_3/Annotations +Area_2/hallway_4/Annotations +Area_2/hallway_5/Annotations +Area_2/hallway_6/Annotations +Area_2/hallway_7/Annotations +Area_2/hallway_8/Annotations +Area_2/hallway_9/Annotations +Area_2/office_10/Annotations +Area_2/office_11/Annotations +Area_2/office_12/Annotations +Area_2/office_13/Annotations +Area_2/office_14/Annotations +Area_2/office_1/Annotations +Area_2/office_2/Annotations +Area_2/office_3/Annotations +Area_2/office_4/Annotations +Area_2/office_5/Annotations +Area_2/office_6/Annotations +Area_2/office_7/Annotations +Area_2/office_8/Annotations +Area_2/office_9/Annotations +Area_2/storage_1/Annotations +Area_2/storage_2/Annotations +Area_2/storage_3/Annotations +Area_2/storage_4/Annotations +Area_2/storage_5/Annotations +Area_2/storage_6/Annotations +Area_2/storage_7/Annotations +Area_2/storage_8/Annotations +Area_2/storage_9/Annotations +Area_2/WC_1/Annotations +Area_2/WC_2/Annotations +Area_3/conferenceRoom_1/Annotations +Area_3/hallway_1/Annotations +Area_3/hallway_2/Annotations +Area_3/hallway_3/Annotations +Area_3/hallway_4/Annotations +Area_3/hallway_5/Annotations +Area_3/hallway_6/Annotations +Area_3/lounge_1/Annotations +Area_3/lounge_2/Annotations +Area_3/office_10/Annotations +Area_3/office_1/Annotations +Area_3/office_2/Annotations +Area_3/office_3/Annotations +Area_3/office_4/Annotations +Area_3/office_5/Annotations +Area_3/office_6/Annotations +Area_3/office_7/Annotations +Area_3/office_8/Annotations +Area_3/office_9/Annotations +Area_3/storage_1/Annotations +Area_3/storage_2/Annotations +Area_3/WC_1/Annotations +Area_3/WC_2/Annotations +Area_4/conferenceRoom_1/Annotations +Area_4/conferenceRoom_2/Annotations +Area_4/conferenceRoom_3/Annotations +Area_4/hallway_10/Annotations +Area_4/hallway_11/Annotations +Area_4/hallway_12/Annotations +Area_4/hallway_13/Annotations +Area_4/hallway_14/Annotations +Area_4/hallway_1/Annotations +Area_4/hallway_2/Annotations +Area_4/hallway_3/Annotations +Area_4/hallway_4/Annotations +Area_4/hallway_5/Annotations +Area_4/hallway_6/Annotations +Area_4/hallway_7/Annotations +Area_4/hallway_8/Annotations +Area_4/hallway_9/Annotations +Area_4/lobby_1/Annotations +Area_4/lobby_2/Annotations +Area_4/office_10/Annotations +Area_4/office_11/Annotations +Area_4/office_12/Annotations +Area_4/office_13/Annotations +Area_4/office_14/Annotations +Area_4/office_15/Annotations +Area_4/office_16/Annotations +Area_4/office_17/Annotations +Area_4/office_18/Annotations +Area_4/office_19/Annotations +Area_4/office_1/Annotations +Area_4/office_20/Annotations +Area_4/office_21/Annotations +Area_4/office_22/Annotations +Area_4/office_2/Annotations +Area_4/office_3/Annotations +Area_4/office_4/Annotations +Area_4/office_5/Annotations +Area_4/office_6/Annotations +Area_4/office_7/Annotations +Area_4/office_8/Annotations +Area_4/office_9/Annotations +Area_4/storage_1/Annotations +Area_4/storage_2/Annotations +Area_4/storage_3/Annotations +Area_4/storage_4/Annotations +Area_4/WC_1/Annotations +Area_4/WC_2/Annotations +Area_4/WC_3/Annotations +Area_4/WC_4/Annotations +Area_5/conferenceRoom_1/Annotations +Area_5/conferenceRoom_2/Annotations +Area_5/conferenceRoom_3/Annotations +Area_5/hallway_10/Annotations +Area_5/hallway_11/Annotations +Area_5/hallway_12/Annotations +Area_5/hallway_13/Annotations +Area_5/hallway_14/Annotations +Area_5/hallway_15/Annotations +Area_5/hallway_1/Annotations +Area_5/hallway_2/Annotations +Area_5/hallway_3/Annotations +Area_5/hallway_4/Annotations +Area_5/hallway_5/Annotations +Area_5/hallway_6/Annotations +Area_5/hallway_7/Annotations +Area_5/hallway_8/Annotations +Area_5/hallway_9/Annotations +Area_5/lobby_1/Annotations +Area_5/office_10/Annotations +Area_5/office_11/Annotations +Area_5/office_12/Annotations +Area_5/office_13/Annotations +Area_5/office_14/Annotations +Area_5/office_15/Annotations +Area_5/office_16/Annotations +Area_5/office_17/Annotations +Area_5/office_18/Annotations +Area_5/office_19/Annotations +Area_5/office_1/Annotations +Area_5/office_20/Annotations +Area_5/office_21/Annotations +Area_5/office_22/Annotations +Area_5/office_23/Annotations +Area_5/office_24/Annotations +Area_5/office_25/Annotations +Area_5/office_26/Annotations +Area_5/office_27/Annotations +Area_5/office_28/Annotations +Area_5/office_29/Annotations +Area_5/office_2/Annotations +Area_5/office_30/Annotations +Area_5/office_31/Annotations +Area_5/office_32/Annotations +Area_5/office_33/Annotations +Area_5/office_34/Annotations +Area_5/office_35/Annotations +Area_5/office_36/Annotations +Area_5/office_37/Annotations +Area_5/office_38/Annotations +Area_5/office_39/Annotations +Area_5/office_3/Annotations +Area_5/office_40/Annotations +Area_5/office_41/Annotations +Area_5/office_42/Annotations +Area_5/office_4/Annotations +Area_5/office_5/Annotations +Area_5/office_6/Annotations +Area_5/office_7/Annotations +Area_5/office_8/Annotations +Area_5/office_9/Annotations +Area_5/pantry_1/Annotations +Area_5/storage_1/Annotations +Area_5/storage_2/Annotations +Area_5/storage_3/Annotations +Area_5/storage_4/Annotations +Area_5/WC_1/Annotations +Area_5/WC_2/Annotations +Area_6/conferenceRoom_1/Annotations +Area_6/copyRoom_1/Annotations +Area_6/hallway_1/Annotations +Area_6/hallway_2/Annotations +Area_6/hallway_3/Annotations +Area_6/hallway_4/Annotations +Area_6/hallway_5/Annotations +Area_6/hallway_6/Annotations +Area_6/lounge_1/Annotations +Area_6/office_10/Annotations +Area_6/office_11/Annotations +Area_6/office_12/Annotations +Area_6/office_13/Annotations +Area_6/office_14/Annotations +Area_6/office_15/Annotations +Area_6/office_16/Annotations +Area_6/office_17/Annotations +Area_6/office_18/Annotations +Area_6/office_19/Annotations +Area_6/office_1/Annotations +Area_6/office_20/Annotations +Area_6/office_21/Annotations +Area_6/office_22/Annotations +Area_6/office_23/Annotations +Area_6/office_24/Annotations +Area_6/office_25/Annotations +Area_6/office_26/Annotations +Area_6/office_27/Annotations +Area_6/office_28/Annotations +Area_6/office_29/Annotations +Area_6/office_2/Annotations +Area_6/office_30/Annotations +Area_6/office_31/Annotations +Area_6/office_32/Annotations +Area_6/office_33/Annotations +Area_6/office_34/Annotations +Area_6/office_35/Annotations +Area_6/office_36/Annotations +Area_6/office_37/Annotations +Area_6/office_3/Annotations +Area_6/office_4/Annotations +Area_6/office_5/Annotations +Area_6/office_6/Annotations +Area_6/office_7/Annotations +Area_6/office_8/Annotations +Area_6/office_9/Annotations +Area_6/openspace_1/Annotations +Area_6/pantry_1/Annotations diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area1_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area1_data_label.txt new file mode 100644 index 0000000..f2ac937 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area1_data_label.txt @@ -0,0 +1,44 @@ +data/stanford_indoor3d/Area_1_conferenceRoom_1.npy +data/stanford_indoor3d/Area_1_conferenceRoom_2.npy +data/stanford_indoor3d/Area_1_copyRoom_1.npy +data/stanford_indoor3d/Area_1_hallway_1.npy +data/stanford_indoor3d/Area_1_hallway_2.npy +data/stanford_indoor3d/Area_1_hallway_3.npy +data/stanford_indoor3d/Area_1_hallway_4.npy +data/stanford_indoor3d/Area_1_hallway_5.npy +data/stanford_indoor3d/Area_1_hallway_6.npy +data/stanford_indoor3d/Area_1_hallway_7.npy +data/stanford_indoor3d/Area_1_hallway_8.npy +data/stanford_indoor3d/Area_1_office_10.npy +data/stanford_indoor3d/Area_1_office_11.npy +data/stanford_indoor3d/Area_1_office_12.npy +data/stanford_indoor3d/Area_1_office_13.npy +data/stanford_indoor3d/Area_1_office_14.npy +data/stanford_indoor3d/Area_1_office_15.npy +data/stanford_indoor3d/Area_1_office_16.npy +data/stanford_indoor3d/Area_1_office_17.npy +data/stanford_indoor3d/Area_1_office_18.npy +data/stanford_indoor3d/Area_1_office_19.npy +data/stanford_indoor3d/Area_1_office_1.npy +data/stanford_indoor3d/Area_1_office_20.npy +data/stanford_indoor3d/Area_1_office_21.npy +data/stanford_indoor3d/Area_1_office_22.npy +data/stanford_indoor3d/Area_1_office_23.npy +data/stanford_indoor3d/Area_1_office_24.npy +data/stanford_indoor3d/Area_1_office_25.npy +data/stanford_indoor3d/Area_1_office_26.npy +data/stanford_indoor3d/Area_1_office_27.npy +data/stanford_indoor3d/Area_1_office_28.npy +data/stanford_indoor3d/Area_1_office_29.npy +data/stanford_indoor3d/Area_1_office_2.npy +data/stanford_indoor3d/Area_1_office_30.npy +data/stanford_indoor3d/Area_1_office_31.npy +data/stanford_indoor3d/Area_1_office_3.npy +data/stanford_indoor3d/Area_1_office_4.npy +data/stanford_indoor3d/Area_1_office_5.npy +data/stanford_indoor3d/Area_1_office_6.npy +data/stanford_indoor3d/Area_1_office_7.npy +data/stanford_indoor3d/Area_1_office_8.npy +data/stanford_indoor3d/Area_1_office_9.npy +data/stanford_indoor3d/Area_1_pantry_1.npy +data/stanford_indoor3d/Area_1_WC_1.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area2_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area2_data_label.txt new file mode 100644 index 0000000..f74407a --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area2_data_label.txt @@ -0,0 +1,40 @@ +data/stanford_indoor3d/Area_2_auditorium_1.npy +data/stanford_indoor3d/Area_2_auditorium_2.npy +data/stanford_indoor3d/Area_2_conferenceRoom_1.npy +data/stanford_indoor3d/Area_2_hallway_10.npy +data/stanford_indoor3d/Area_2_hallway_11.npy +data/stanford_indoor3d/Area_2_hallway_12.npy +data/stanford_indoor3d/Area_2_hallway_1.npy +data/stanford_indoor3d/Area_2_hallway_2.npy +data/stanford_indoor3d/Area_2_hallway_3.npy +data/stanford_indoor3d/Area_2_hallway_4.npy +data/stanford_indoor3d/Area_2_hallway_5.npy +data/stanford_indoor3d/Area_2_hallway_6.npy +data/stanford_indoor3d/Area_2_hallway_7.npy +data/stanford_indoor3d/Area_2_hallway_8.npy +data/stanford_indoor3d/Area_2_hallway_9.npy +data/stanford_indoor3d/Area_2_office_10.npy +data/stanford_indoor3d/Area_2_office_11.npy +data/stanford_indoor3d/Area_2_office_12.npy +data/stanford_indoor3d/Area_2_office_13.npy +data/stanford_indoor3d/Area_2_office_14.npy +data/stanford_indoor3d/Area_2_office_1.npy +data/stanford_indoor3d/Area_2_office_2.npy +data/stanford_indoor3d/Area_2_office_3.npy +data/stanford_indoor3d/Area_2_office_4.npy +data/stanford_indoor3d/Area_2_office_5.npy +data/stanford_indoor3d/Area_2_office_6.npy +data/stanford_indoor3d/Area_2_office_7.npy +data/stanford_indoor3d/Area_2_office_8.npy +data/stanford_indoor3d/Area_2_office_9.npy +data/stanford_indoor3d/Area_2_storage_1.npy +data/stanford_indoor3d/Area_2_storage_2.npy +data/stanford_indoor3d/Area_2_storage_3.npy +data/stanford_indoor3d/Area_2_storage_4.npy +data/stanford_indoor3d/Area_2_storage_5.npy +data/stanford_indoor3d/Area_2_storage_6.npy +data/stanford_indoor3d/Area_2_storage_7.npy +data/stanford_indoor3d/Area_2_storage_8.npy +data/stanford_indoor3d/Area_2_storage_9.npy +data/stanford_indoor3d/Area_2_WC_1.npy +data/stanford_indoor3d/Area_2_WC_2.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area3_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area3_data_label.txt new file mode 100644 index 0000000..f0e2147 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area3_data_label.txt @@ -0,0 +1,23 @@ +data/stanford_indoor3d/Area_3_conferenceRoom_1.npy +data/stanford_indoor3d/Area_3_hallway_1.npy +data/stanford_indoor3d/Area_3_hallway_2.npy +data/stanford_indoor3d/Area_3_hallway_3.npy +data/stanford_indoor3d/Area_3_hallway_4.npy +data/stanford_indoor3d/Area_3_hallway_5.npy +data/stanford_indoor3d/Area_3_hallway_6.npy +data/stanford_indoor3d/Area_3_lounge_1.npy +data/stanford_indoor3d/Area_3_lounge_2.npy +data/stanford_indoor3d/Area_3_office_10.npy +data/stanford_indoor3d/Area_3_office_1.npy +data/stanford_indoor3d/Area_3_office_2.npy +data/stanford_indoor3d/Area_3_office_3.npy +data/stanford_indoor3d/Area_3_office_4.npy +data/stanford_indoor3d/Area_3_office_5.npy +data/stanford_indoor3d/Area_3_office_6.npy +data/stanford_indoor3d/Area_3_office_7.npy +data/stanford_indoor3d/Area_3_office_8.npy +data/stanford_indoor3d/Area_3_office_9.npy +data/stanford_indoor3d/Area_3_storage_1.npy +data/stanford_indoor3d/Area_3_storage_2.npy +data/stanford_indoor3d/Area_3_WC_1.npy +data/stanford_indoor3d/Area_3_WC_2.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area4_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area4_data_label.txt new file mode 100644 index 0000000..cb26084 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area4_data_label.txt @@ -0,0 +1,49 @@ +data/stanford_indoor3d/Area_4_conferenceRoom_1.npy +data/stanford_indoor3d/Area_4_conferenceRoom_2.npy +data/stanford_indoor3d/Area_4_conferenceRoom_3.npy +data/stanford_indoor3d/Area_4_hallway_10.npy +data/stanford_indoor3d/Area_4_hallway_11.npy +data/stanford_indoor3d/Area_4_hallway_12.npy +data/stanford_indoor3d/Area_4_hallway_13.npy +data/stanford_indoor3d/Area_4_hallway_14.npy +data/stanford_indoor3d/Area_4_hallway_1.npy +data/stanford_indoor3d/Area_4_hallway_2.npy +data/stanford_indoor3d/Area_4_hallway_3.npy +data/stanford_indoor3d/Area_4_hallway_4.npy +data/stanford_indoor3d/Area_4_hallway_5.npy +data/stanford_indoor3d/Area_4_hallway_6.npy +data/stanford_indoor3d/Area_4_hallway_7.npy +data/stanford_indoor3d/Area_4_hallway_8.npy +data/stanford_indoor3d/Area_4_hallway_9.npy +data/stanford_indoor3d/Area_4_lobby_1.npy +data/stanford_indoor3d/Area_4_lobby_2.npy +data/stanford_indoor3d/Area_4_office_10.npy +data/stanford_indoor3d/Area_4_office_11.npy +data/stanford_indoor3d/Area_4_office_12.npy +data/stanford_indoor3d/Area_4_office_13.npy +data/stanford_indoor3d/Area_4_office_14.npy +data/stanford_indoor3d/Area_4_office_15.npy +data/stanford_indoor3d/Area_4_office_16.npy +data/stanford_indoor3d/Area_4_office_17.npy +data/stanford_indoor3d/Area_4_office_18.npy +data/stanford_indoor3d/Area_4_office_19.npy +data/stanford_indoor3d/Area_4_office_1.npy +data/stanford_indoor3d/Area_4_office_20.npy +data/stanford_indoor3d/Area_4_office_21.npy +data/stanford_indoor3d/Area_4_office_22.npy +data/stanford_indoor3d/Area_4_office_2.npy +data/stanford_indoor3d/Area_4_office_3.npy +data/stanford_indoor3d/Area_4_office_4.npy +data/stanford_indoor3d/Area_4_office_5.npy +data/stanford_indoor3d/Area_4_office_6.npy +data/stanford_indoor3d/Area_4_office_7.npy +data/stanford_indoor3d/Area_4_office_8.npy +data/stanford_indoor3d/Area_4_office_9.npy +data/stanford_indoor3d/Area_4_storage_1.npy +data/stanford_indoor3d/Area_4_storage_2.npy +data/stanford_indoor3d/Area_4_storage_3.npy +data/stanford_indoor3d/Area_4_storage_4.npy +data/stanford_indoor3d/Area_4_WC_1.npy +data/stanford_indoor3d/Area_4_WC_2.npy +data/stanford_indoor3d/Area_4_WC_3.npy +data/stanford_indoor3d/Area_4_WC_4.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area5_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area5_data_label.txt new file mode 100644 index 0000000..48c3ea3 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area5_data_label.txt @@ -0,0 +1,68 @@ +data/stanford_indoor3d/Area_5_conferenceRoom_1.npy +data/stanford_indoor3d/Area_5_conferenceRoom_2.npy +data/stanford_indoor3d/Area_5_conferenceRoom_3.npy +data/stanford_indoor3d/Area_5_hallway_10.npy +data/stanford_indoor3d/Area_5_hallway_11.npy +data/stanford_indoor3d/Area_5_hallway_12.npy +data/stanford_indoor3d/Area_5_hallway_13.npy +data/stanford_indoor3d/Area_5_hallway_14.npy +data/stanford_indoor3d/Area_5_hallway_15.npy +data/stanford_indoor3d/Area_5_hallway_1.npy +data/stanford_indoor3d/Area_5_hallway_2.npy +data/stanford_indoor3d/Area_5_hallway_3.npy +data/stanford_indoor3d/Area_5_hallway_4.npy +data/stanford_indoor3d/Area_5_hallway_5.npy +data/stanford_indoor3d/Area_5_hallway_6.npy +data/stanford_indoor3d/Area_5_hallway_7.npy +data/stanford_indoor3d/Area_5_hallway_8.npy +data/stanford_indoor3d/Area_5_hallway_9.npy +data/stanford_indoor3d/Area_5_lobby_1.npy +data/stanford_indoor3d/Area_5_office_10.npy +data/stanford_indoor3d/Area_5_office_11.npy +data/stanford_indoor3d/Area_5_office_12.npy +data/stanford_indoor3d/Area_5_office_13.npy +data/stanford_indoor3d/Area_5_office_14.npy +data/stanford_indoor3d/Area_5_office_15.npy +data/stanford_indoor3d/Area_5_office_16.npy +data/stanford_indoor3d/Area_5_office_17.npy +data/stanford_indoor3d/Area_5_office_18.npy +data/stanford_indoor3d/Area_5_office_19.npy +data/stanford_indoor3d/Area_5_office_1.npy +data/stanford_indoor3d/Area_5_office_20.npy +data/stanford_indoor3d/Area_5_office_21.npy +data/stanford_indoor3d/Area_5_office_22.npy +data/stanford_indoor3d/Area_5_office_23.npy +data/stanford_indoor3d/Area_5_office_24.npy +data/stanford_indoor3d/Area_5_office_25.npy +data/stanford_indoor3d/Area_5_office_26.npy +data/stanford_indoor3d/Area_5_office_27.npy +data/stanford_indoor3d/Area_5_office_28.npy +data/stanford_indoor3d/Area_5_office_29.npy +data/stanford_indoor3d/Area_5_office_2.npy +data/stanford_indoor3d/Area_5_office_30.npy +data/stanford_indoor3d/Area_5_office_31.npy +data/stanford_indoor3d/Area_5_office_32.npy +data/stanford_indoor3d/Area_5_office_33.npy +data/stanford_indoor3d/Area_5_office_34.npy +data/stanford_indoor3d/Area_5_office_35.npy +data/stanford_indoor3d/Area_5_office_36.npy +data/stanford_indoor3d/Area_5_office_37.npy +data/stanford_indoor3d/Area_5_office_38.npy +data/stanford_indoor3d/Area_5_office_39.npy +data/stanford_indoor3d/Area_5_office_3.npy +data/stanford_indoor3d/Area_5_office_40.npy +data/stanford_indoor3d/Area_5_office_41.npy +data/stanford_indoor3d/Area_5_office_42.npy +data/stanford_indoor3d/Area_5_office_4.npy +data/stanford_indoor3d/Area_5_office_5.npy +data/stanford_indoor3d/Area_5_office_6.npy +data/stanford_indoor3d/Area_5_office_7.npy +data/stanford_indoor3d/Area_5_office_8.npy +data/stanford_indoor3d/Area_5_office_9.npy +data/stanford_indoor3d/Area_5_pantry_1.npy +data/stanford_indoor3d/Area_5_storage_1.npy +data/stanford_indoor3d/Area_5_storage_2.npy +data/stanford_indoor3d/Area_5_storage_3.npy +data/stanford_indoor3d/Area_5_storage_4.npy +data/stanford_indoor3d/Area_5_WC_1.npy +data/stanford_indoor3d/Area_5_WC_2.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area6_data_label.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area6_data_label.txt new file mode 100644 index 0000000..d067baa --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/area6_data_label.txt @@ -0,0 +1,48 @@ +data/stanford_indoor3d/Area_6_conferenceRoom_1.npy +data/stanford_indoor3d/Area_6_copyRoom_1.npy +data/stanford_indoor3d/Area_6_hallway_1.npy +data/stanford_indoor3d/Area_6_hallway_2.npy +data/stanford_indoor3d/Area_6_hallway_3.npy +data/stanford_indoor3d/Area_6_hallway_4.npy +data/stanford_indoor3d/Area_6_hallway_5.npy +data/stanford_indoor3d/Area_6_hallway_6.npy +data/stanford_indoor3d/Area_6_lounge_1.npy +data/stanford_indoor3d/Area_6_office_10.npy +data/stanford_indoor3d/Area_6_office_11.npy +data/stanford_indoor3d/Area_6_office_12.npy +data/stanford_indoor3d/Area_6_office_13.npy +data/stanford_indoor3d/Area_6_office_14.npy +data/stanford_indoor3d/Area_6_office_15.npy +data/stanford_indoor3d/Area_6_office_16.npy +data/stanford_indoor3d/Area_6_office_17.npy +data/stanford_indoor3d/Area_6_office_18.npy +data/stanford_indoor3d/Area_6_office_19.npy +data/stanford_indoor3d/Area_6_office_1.npy +data/stanford_indoor3d/Area_6_office_20.npy +data/stanford_indoor3d/Area_6_office_21.npy +data/stanford_indoor3d/Area_6_office_22.npy +data/stanford_indoor3d/Area_6_office_23.npy +data/stanford_indoor3d/Area_6_office_24.npy +data/stanford_indoor3d/Area_6_office_25.npy +data/stanford_indoor3d/Area_6_office_26.npy +data/stanford_indoor3d/Area_6_office_27.npy +data/stanford_indoor3d/Area_6_office_28.npy +data/stanford_indoor3d/Area_6_office_29.npy +data/stanford_indoor3d/Area_6_office_2.npy +data/stanford_indoor3d/Area_6_office_30.npy +data/stanford_indoor3d/Area_6_office_31.npy +data/stanford_indoor3d/Area_6_office_32.npy +data/stanford_indoor3d/Area_6_office_33.npy +data/stanford_indoor3d/Area_6_office_34.npy +data/stanford_indoor3d/Area_6_office_35.npy +data/stanford_indoor3d/Area_6_office_36.npy +data/stanford_indoor3d/Area_6_office_37.npy +data/stanford_indoor3d/Area_6_office_3.npy +data/stanford_indoor3d/Area_6_office_4.npy +data/stanford_indoor3d/Area_6_office_5.npy +data/stanford_indoor3d/Area_6_office_6.npy +data/stanford_indoor3d/Area_6_office_7.npy +data/stanford_indoor3d/Area_6_office_8.npy +data/stanford_indoor3d/Area_6_office_9.npy +data/stanford_indoor3d/Area_6_openspace_1.npy +data/stanford_indoor3d/Area_6_pantry_1.npy diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/class_names.txt b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/class_names.txt new file mode 100644 index 0000000..ca1d178 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/meta/class_names.txt @@ -0,0 +1,13 @@ +ceiling +floor +wall +beam +column +window +door +table +chair +sofa +bookcase +board +clutter diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/model.py b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/model.py new file mode 100644 index 0000000..2a4aeea --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/model.py @@ -0,0 +1,112 @@ +import tensorflow as tf +import math +import time +import numpy as np +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +sys.path.append(os.path.join(BASE_DIR, '../models')) +import tf_util + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, + shape=(batch_size, num_point, 9)) + labels_pl = tf.placeholder(tf.int32, + shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl + +def get_model(point_cloud, is_training, bn_decay=None): + """ ConvNet baseline, input is BxNx9 gray image """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + input_image = tf.expand_dims(point_cloud, -1) + + k = 20 + + adj = tf_util.pairwise_distance(point_cloud[:, :, 6:]) + nn_idx = tf_util.knn(adj, k=k) # (batch, num_points, k) + edge_feature = tf_util.get_edge_feature(input_image, nn_idx=nn_idx, k=k) + + out1 = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv1', bn_decay=bn_decay, is_dist=True) + + out2 = tf_util.conv2d(out1, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv2', bn_decay=bn_decay, is_dist=True) + + net_1 = tf.reduce_max(out2, axis=-2, keep_dims=True) + + + + adj = tf_util.pairwise_distance(net_1) + nn_idx = tf_util.knn(adj, k=k) + edge_feature = tf_util.get_edge_feature(net_1, nn_idx=nn_idx, k=k) + + out3 = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv3', bn_decay=bn_decay, is_dist=True) + + out4 = tf_util.conv2d(out3, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv4', bn_decay=bn_decay, is_dist=True) + + net_2 = tf.reduce_max(out4, axis=-2, keep_dims=True) + + + + adj = tf_util.pairwise_distance(net_2) + nn_idx = tf_util.knn(adj, k=k) + edge_feature = tf_util.get_edge_feature(net_2, nn_idx=nn_idx, k=k) + + out5 = tf_util.conv2d(edge_feature, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, weight_decay=weight_decay, + scope='adj_conv5', bn_decay=bn_decay, is_dist=True) + + # out6 = tf_util.conv2d(out5, 64, [1,1], + # padding='VALID', stride=[1,1], + # bn=True, is_training=is_training, weight_decay=weight_decay, + # scope='adj_conv6', bn_decay=bn_decay, is_dist=True) + + net_3 = tf.reduce_max(out5, axis=-2, keep_dims=True) + + + + out7 = tf_util.conv2d(tf.concat([net_1, net_2, net_3], axis=-1), 1024, [1, 1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='adj_conv7', bn_decay=bn_decay, is_dist=True) + + out_max = tf_util.max_pool2d(out7, [num_point, 1], padding='VALID', scope='maxpool') + + + expand = tf.tile(out_max, [1, num_point, 1, 1]) + + concat = tf.concat(axis=3, values=[expand, + net_1, + net_2, + net_3]) + + # CONV + net = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], + bn=True, is_training=is_training, scope='seg/conv1', is_dist=True) + net = tf_util.conv2d(net, 256, [1,1], padding='VALID', stride=[1,1], + bn=True, is_training=is_training, scope='seg/conv2', is_dist=True) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, scope='dp1') + net = tf_util.conv2d(net, 13, [1,1], padding='VALID', stride=[1,1], + activation_fn=None, scope='seg/conv3', is_dist=True) + net = tf.squeeze(net, [2]) + + return net + +def get_loss(pred, label): + """ pred: B,N,13; label: B,N """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + return tf.reduce_mean(loss) diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/test_job.sh b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/test_job.sh new file mode 100644 index 0000000..0ff781e --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/test_job.sh @@ -0,0 +1,6 @@ +python batch_inference.py --model_path log1/epoch_60.ckpt --dump_dir log1/dump --output_filelist log1/output_filelist.txt --room_data_filelist meta/area1_data_label.txt +python batch_inference.py --model_path log2/epoch_60.ckpt --dump_dir log2/dump --output_filelist log2/output_filelist.txt --room_data_filelist meta/area2_data_label.txt +python batch_inference.py --model_path log3/epoch_60.ckpt --dump_dir log3/dump --output_filelist log3/output_filelist.txt --room_data_filelist meta/area3_data_label.txt +python batch_inference.py --model_path log4/epoch_60.ckpt --dump_dir log4/dump --output_filelist log4/output_filelist.txt --room_data_filelist meta/area4_data_label.txt +python batch_inference.py --model_path log5/epoch_60.ckpt --dump_dir log5/dump --output_filelist log5/output_filelist.txt --room_data_filelist meta/area5_data_label.txt +python batch_inference.py --model_path log6/epoch_60.ckpt --dump_dir log6/dump --output_filelist log6/output_filelist.txt --room_data_filelist meta/area6_data_label.txt \ No newline at end of file diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/train.py b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/train.py new file mode 100644 index 0000000..bdec182 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/train.py @@ -0,0 +1,286 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +sys.path.append(ROOT_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +from model import * + +parser = argparse.ArgumentParser() +parser.add_argument('--num_gpu', type=int, default=2, help='the number of GPUs to use [default: 2]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=4096, help='Point number [default: 4096]') +parser.add_argument('--max_epoch', type=int, default=101, help='Epoch to run [default: 50]') +parser.add_argument('--batch_size', type=int, default=12, help='Batch Size during training for each GPU [default: 24]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=300000, help='Decay step for lr decay [default: 300000]') +parser.add_argument('--decay_rate', type=float, default=0.5, help='Decay rate for lr decay [default: 0.5]') +parser.add_argument('--test_area', type=int, default=6, help='Which area to use for test, option: 1-6 [default: 6]') +FLAGS = parser.parse_args() + +TOWER_NAME = 'tower' + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +NUM_POINT = FLAGS.num_point +BASE_LEARNING_RATE = FLAGS.learning_rate +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp model.py %s' % (LOG_DIR)) +os.system('cp train.py %s' % (LOG_DIR)) +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +MAX_NUM_POINT = 4096 +NUM_CLASSES = 13 + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +ALL_FILES = provider.getDataFiles('indoor3d_sem_seg_hdf5_data/all_files.txt') +room_filelist = [line.rstrip() for line in open('indoor3d_sem_seg_hdf5_data/room_filelist.txt')] +print len(room_filelist) + +# Load ALL data +data_batch_list = [] +label_batch_list = [] +for h5_filename in ALL_FILES: + data_batch, label_batch = provider.loadDataFile(h5_filename) + data_batch_list.append(data_batch) + label_batch_list.append(label_batch) +data_batches = np.concatenate(data_batch_list, 0) +label_batches = np.concatenate(label_batch_list, 0) +print(data_batches.shape) +print(label_batches.shape) + +test_area = 'Area_'+str(FLAGS.test_area) +train_idxs = [] +test_idxs = [] +for i,room_name in enumerate(room_filelist): + if test_area in room_name: + test_idxs.append(i) + else: + train_idxs.append(i) + +train_data = data_batches[train_idxs,...] +train_label = label_batches[train_idxs] +test_data = data_batches[test_idxs,...] +test_label = label_batches[test_idxs] +print(train_data.shape, train_label.shape) +print(test_data.shape, test_label.shape) + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE!! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def average_gradients(tower_grads): + """Calculate average gradient for each shared variable across all towers. + + Note that this function provides a synchronization point across all towers. + + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been + averaged across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + expanded_g = tf.expand_dims(g, 0) + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(grads, 0) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + +def train(): + with tf.Graph().as_default(), tf.device('/cpu:0'): + batch = tf.Variable(0, trainable=False) + + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + + trainer = tf.train.AdamOptimizer(learning_rate) + + tower_grads = [] + pointclouds_phs = [] + labels_phs = [] + is_training_phs =[] + + with tf.variable_scope(tf.get_variable_scope()): + for i in xrange(FLAGS.num_gpu): + with tf.device('/gpu:%d' % i): + with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: + + pointclouds_pl, labels_pl = placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + pointclouds_phs.append(pointclouds_pl) + labels_phs.append(labels_pl) + is_training_phs.append(is_training_pl) + + pred = get_model(pointclouds_phs[-1], is_training_phs[-1], bn_decay=bn_decay) + loss = get_loss(pred, labels_phs[-1]) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 2), tf.to_int64(labels_phs[-1])) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE*NUM_POINT) + tf.summary.scalar('accuracy', accuracy) + + tf.get_variable_scope().reuse_variables() + + grads = trainer.compute_gradients(loss) + + tower_grads.append(grads) + + grads = average_gradients(tower_grads) + + train_op = trainer.apply_gradients(grads, global_step=batch) + + saver = tf.train.Saver(tf.global_variables(), sharded=True, max_to_keep=10) + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables for two GPUs + init = tf.group(tf.global_variables_initializer(), + tf.local_variables_initializer()) + sess.run(init) + + ops = {'pointclouds_phs': pointclouds_phs, + 'labels_phs': labels_phs, + 'is_training_phs': is_training_phs, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR,'epoch_' + str(epoch)+'.ckpt')) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string('----') + current_data, current_label, _ = provider.shuffle_data(train_data[:,0:NUM_POINT,:], train_label) + + file_size = current_data.shape[0] + num_batches = file_size // (FLAGS.num_gpu * BATCH_SIZE) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + for batch_idx in range(num_batches): + if batch_idx % 100 == 0: + print('Current batch/total batch num: %d/%d'%(batch_idx,num_batches)) + start_idx_0 = batch_idx * BATCH_SIZE + end_idx_0 = (batch_idx+1) * BATCH_SIZE + start_idx_1 = (batch_idx+1) * BATCH_SIZE + end_idx_1 = (batch_idx+2) * BATCH_SIZE + + + feed_dict = {ops['pointclouds_phs'][0]: current_data[start_idx_0:end_idx_0, :, :], + ops['pointclouds_phs'][1]: current_data[start_idx_1:end_idx_1, :, :], + ops['labels_phs'][0]: current_label[start_idx_0:end_idx_0], + ops['labels_phs'][1]: current_label[start_idx_1:end_idx_1], + ops['is_training_phs'][0]: is_training, + ops['is_training_phs'][1]: is_training} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], + feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 2) + correct = np.sum(pred_val == current_label[start_idx_1:end_idx_1]) + total_correct += correct + total_seen += (BATCH_SIZE*NUM_POINT) + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/dgcnn/tensorflow/sem_seg/train_job.sh b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/train_job.sh new file mode 100644 index 0000000..26c23bf --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/sem_seg/train_job.sh @@ -0,0 +1,6 @@ +python train.py --log_dir log1 --test_area 1 +python train.py --log_dir log2 --test_area 2 +python train.py --log_dir log3 --test_area 3 +python train.py --log_dir log4 --test_area 4 +python train.py --log_dir log5 --test_area 5 +python train.py --log_dir log6 --test_area 6 \ No newline at end of file diff --git a/zoo/SimpleView/dgcnn/tensorflow/train.py b/zoo/SimpleView/dgcnn/tensorflow/train.py new file mode 100644 index 0000000..62337c3 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/train.py @@ -0,0 +1,265 @@ +import argparse +import math +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import tf_util + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='dgcnn', help='Model name: dgcnn') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=250, help='Epoch to run [default: 250]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.8]') +FLAGS = parser.parse_args() + + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +MAX_NUM_POINT = 2048 +NUM_CLASSES = 40 + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +# ModelNet40 official train/test split +TRAIN_FILES = provider.getDataFiles( \ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt')) +TEST_FILES = provider.getDataFiles(\ + os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt')) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print(is_training_pl) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + loss = MODEL.get_loss(pred, labels_pl, end_points) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + #merged = tf.merge_all_summaries() + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), + sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) + + # Init variables + init = tf.global_variables_initializer() + # To fix the bug introduced in TF 0.12.1 as in + # http://stackoverflow.com/questions/41543774/invalidargumenterror-for-tensor-bool-tensorflow-0-12-1 + #sess.run(init) + sess.run(init, {is_training_pl: True}) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch} + + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + # Shuffle train files + train_file_idxs = np.arange(0, len(TRAIN_FILES)) + np.random.shuffle(train_file_idxs) + + for fn in range(len(TRAIN_FILES)): + log_string('----' + str(fn) + '-----') + current_data, current_label = provider.loadDataFile(TRAIN_FILES[train_file_idxs[fn]]) + current_data = current_data[:,0:NUM_POINT,:] + current_data, current_label, _ = provider.shuffle_data(current_data, np.squeeze(current_label)) + current_label = np.squeeze(current_label) + + file_size = current_data.shape[0] + num_batches = file_size // BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + # Augment batched point clouds by rotation and jittering + rotated_data = provider.rotate_point_cloud(current_data[start_idx:end_idx, :, :]) + jittered_data = provider.jitter_point_cloud(rotated_data) + jittered_data = provider.random_scale_point_cloud(jittered_data) + jittered_data = provider.rotate_perturbation_point_cloud(jittered_data) + jittered_data = provider.shift_point_cloud(jittered_data) + + feed_dict = {ops['pointclouds_pl']: jittered_data, + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += loss_val + + log_string('mean loss: %f' % (loss_sum / float(num_batches))) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + is_training = False + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + for fn in range(len(TEST_FILES)): + log_string('----' + str(fn) + '-----') + current_data, current_label = provider.loadDataFile(TEST_FILES[fn]) + current_data = current_data[:,0:NUM_POINT,:] + current_label = np.squeeze(current_label) + + file_size = current_data.shape[0] + num_batches = file_size // BATCH_SIZE + + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + + feed_dict = {ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], + ops['labels_pl']: current_label[start_idx:end_idx], + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val == current_label[start_idx:end_idx]) + total_correct += correct + total_seen += BATCH_SIZE + loss_sum += (loss_val*BATCH_SIZE) + for i in range(start_idx, end_idx): + l = current_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i-start_idx] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(total_seen))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + + +if __name__ == "__main__": + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/dgcnn/tensorflow/utils/data_prep_util.py b/zoo/SimpleView/dgcnn/tensorflow/utils/data_prep_util.py new file mode 100644 index 0000000..53d32f1 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/utils/data_prep_util.py @@ -0,0 +1,145 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +from plyfile import (PlyData, PlyElement, make2d, PlyParseError, PlyProperty) +import numpy as np +import h5py + +SAMPLING_BIN = os.path.join(BASE_DIR, 'third_party/mesh_sampling/build/pcsample') + +SAMPLING_POINT_NUM = 2048 +SAMPLING_LEAF_SIZE = 0.005 + +MODELNET40_PATH = '../datasets/modelnet40' +def export_ply(pc, filename): + vertex = np.zeros(pc.shape[0], dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')]) + for i in range(pc.shape[0]): + vertex[i] = (pc[i][0], pc[i][1], pc[i][2]) + ply_out = PlyData([PlyElement.describe(vertex, 'vertex', comments=['vertices'])]) + ply_out.write(filename) + +# Sample points on the obj shape +def get_sampling_command(obj_filename, ply_filename): + cmd = SAMPLING_BIN + ' ' + obj_filename + cmd += ' ' + ply_filename + cmd += ' -n_samples %d ' % SAMPLING_POINT_NUM + cmd += ' -leaf_size %f ' % SAMPLING_LEAF_SIZE + return cmd + +# -------------------------------------------------------------- +# Following are the helper functions to load MODELNET40 shapes +# -------------------------------------------------------------- + +# Read in the list of categories in MODELNET40 +def get_category_names(): + shape_names_file = os.path.join(MODELNET40_PATH, 'shape_names.txt') + shape_names = [line.rstrip() for line in open(shape_names_file)] + return shape_names + +# Return all the filepaths for the shapes in MODELNET40 +def get_obj_filenames(): + obj_filelist_file = os.path.join(MODELNET40_PATH, 'filelist.txt') + obj_filenames = [os.path.join(MODELNET40_PATH, line.rstrip()) for line in open(obj_filelist_file)] + print('Got %d obj files in modelnet40.' % len(obj_filenames)) + return obj_filenames + +# Helper function to create the father folder and all subdir folders if not exist +def batch_mkdir(output_folder, subdir_list): + if not os.path.exists(output_folder): + os.mkdir(output_folder) + for subdir in subdir_list: + if not os.path.exists(os.path.join(output_folder, subdir)): + os.mkdir(os.path.join(output_folder, subdir)) + +# ---------------------------------------------------------------- +# Following are the helper functions to load save/load HDF5 files +# ---------------------------------------------------------------- + +# Write numpy array data and label to h5_filename +def save_h5_data_label_normal(h5_filename, data, label, normal, + data_dtype='float32', label_dtype='uint8', noral_dtype='float32'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + 'data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + 'normal', data=normal, + compression='gzip', compression_opts=4, + dtype=normal_dtype) + h5_fout.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + + +# Write numpy array data and label to h5_filename +def save_h5(h5_filename, data, label, data_dtype='uint8', label_dtype='uint8'): + h5_fout = h5py.File(h5_filename) + h5_fout.create_dataset( + 'data', data=data, + compression='gzip', compression_opts=4, + dtype=data_dtype) + h5_fout.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1, + dtype=label_dtype) + h5_fout.close() + +# Read numpy array data and label from h5_filename +def load_h5_data_label_normal(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + normal = f['normal'][:] + return (data, label, normal) + +# Read numpy array data and label from h5_filename +def load_h5_data_label_seg(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + seg = f['pid'][:] + return (data, label, seg) + +# Read numpy array data and label from h5_filename +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +# ---------------------------------------------------------------- +# Following are the helper functions to load save/load PLY files +# ---------------------------------------------------------------- + +# Load PLY file +def load_ply_data(filename, point_num): + plydata = PlyData.read(filename) + pc = plydata['vertex'].data[:point_num] + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + +# Load PLY file +def load_ply_normal(filename, point_num): + plydata = PlyData.read(filename) + pc = plydata['normal'].data[:point_num] + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + +# Make up rows for Nxk array +# Input Pad is 'edge' or 'constant' +def pad_arr_rows(arr, row, pad='edge'): + assert(len(arr.shape) == 2) + assert(arr.shape[0] <= row) + assert(pad == 'edge' or pad == 'constant') + if arr.shape[0] == row: + return arr + if pad == 'edge': + return np.lib.pad(arr, ((0, row-arr.shape[0]), (0, 0)), 'edge') + if pad == 'constant': + return np.lib.pad(arr, ((0, row-arr.shape[0]), (0, 0)), 'constant', (0, 0)) + + diff --git a/zoo/SimpleView/dgcnn/tensorflow/utils/eulerangles.py b/zoo/SimpleView/dgcnn/tensorflow/utils/eulerangles.py new file mode 100644 index 0000000..87bd605 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/utils/eulerangles.py @@ -0,0 +1,418 @@ +# emacs: -*- mode: python-mode; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the NiBabel package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +''' Module implementing Euler angle rotations and their conversions + +See: + +* http://en.wikipedia.org/wiki/Rotation_matrix +* http://en.wikipedia.org/wiki/Euler_angles +* http://mathworld.wolfram.com/EulerAngles.html + +See also: *Representing Attitude with Euler Angles and Quaternions: A +Reference* (2006) by James Diebel. A cached PDF link last found here: + +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.110.5134 + +Euler's rotation theorem tells us that any rotation in 3D can be +described by 3 angles. Let's call the 3 angles the *Euler angle vector* +and call the angles in the vector :math:`alpha`, :math:`beta` and +:math:`gamma`. The vector is [ :math:`alpha`, +:math:`beta`. :math:`gamma` ] and, in this description, the order of the +parameters specifies the order in which the rotations occur (so the +rotation corresponding to :math:`alpha` is applied first). + +In order to specify the meaning of an *Euler angle vector* we need to +specify the axes around which each of the rotations corresponding to +:math:`alpha`, :math:`beta` and :math:`gamma` will occur. + +There are therefore three axes for the rotations :math:`alpha`, +:math:`beta` and :math:`gamma`; let's call them :math:`i` :math:`j`, +:math:`k`. + +Let us express the rotation :math:`alpha` around axis `i` as a 3 by 3 +rotation matrix `A`. Similarly :math:`beta` around `j` becomes 3 x 3 +matrix `B` and :math:`gamma` around `k` becomes matrix `G`. Then the +whole rotation expressed by the Euler angle vector [ :math:`alpha`, +:math:`beta`. :math:`gamma` ], `R` is given by:: + + R = np.dot(G, np.dot(B, A)) + +See http://mathworld.wolfram.com/EulerAngles.html + +The order :math:`G B A` expresses the fact that the rotations are +performed in the order of the vector (:math:`alpha` around axis `i` = +`A` first). + +To convert a given Euler angle vector to a meaningful rotation, and a +rotation matrix, we need to define: + +* the axes `i`, `j`, `k` +* whether a rotation matrix should be applied on the left of a vector to + be transformed (vectors are column vectors) or on the right (vectors + are row vectors). +* whether the rotations move the axes as they are applied (intrinsic + rotations) - compared the situation where the axes stay fixed and the + vectors move within the axis frame (extrinsic) +* the handedness of the coordinate system + +See: http://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities + +We are using the following conventions: + +* axes `i`, `j`, `k` are the `z`, `y`, and `x` axes respectively. Thus + an Euler angle vector [ :math:`alpha`, :math:`beta`. :math:`gamma` ] + in our convention implies a :math:`alpha` radian rotation around the + `z` axis, followed by a :math:`beta` rotation around the `y` axis, + followed by a :math:`gamma` rotation around the `x` axis. +* the rotation matrix applies on the left, to column vectors on the + right, so if `R` is the rotation matrix, and `v` is a 3 x N matrix + with N column vectors, the transformed vector set `vdash` is given by + ``vdash = np.dot(R, v)``. +* extrinsic rotations - the axes are fixed, and do not move with the + rotations. +* a right-handed coordinate system + +The convention of rotation around ``z``, followed by rotation around +``y``, followed by rotation around ``x``, is known (confusingly) as +"xyz", pitch-roll-yaw, Cardan angles, or Tait-Bryan angles. +''' + +import math + +import sys +if sys.version_info >= (3,0): + from functools import reduce + +import numpy as np + + +_FLOAT_EPS_4 = np.finfo(float).eps * 4.0 + + +def euler2mat(z=0, y=0, x=0): + ''' Return matrix for rotations around z, y and x axes + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + M : array shape (3,3) + Rotation matrix giving same rotation as for given angles + + Examples + -------- + >>> zrot = 1.3 # radians + >>> yrot = -0.1 + >>> xrot = 0.2 + >>> M = euler2mat(zrot, yrot, xrot) + >>> M.shape == (3, 3) + True + + The output rotation matrix is equal to the composition of the + individual rotations + + >>> M1 = euler2mat(zrot) + >>> M2 = euler2mat(0, yrot) + >>> M3 = euler2mat(0, 0, xrot) + >>> composed_M = np.dot(M3, np.dot(M2, M1)) + >>> np.allclose(M, composed_M) + True + + You can specify rotations by named arguments + + >>> np.all(M3 == euler2mat(x=xrot)) + True + + When applying M to a vector, the vector should column vector to the + right of M. If the right hand side is a 2D array rather than a + vector, then each column of the 2D array represents a vector. + + >>> vec = np.array([1, 0, 0]).reshape((3,1)) + >>> v2 = np.dot(M, vec) + >>> vecs = np.array([[1, 0, 0],[0, 1, 0]]).T # giving 3x2 array + >>> vecs2 = np.dot(M, vecs) + + Rotations are counter-clockwise. + + >>> zred = np.dot(euler2mat(z=np.pi/2), np.eye(3)) + >>> np.allclose(zred, [[0, -1, 0],[1, 0, 0], [0, 0, 1]]) + True + >>> yred = np.dot(euler2mat(y=np.pi/2), np.eye(3)) + >>> np.allclose(yred, [[0, 0, 1],[0, 1, 0], [-1, 0, 0]]) + True + >>> xred = np.dot(euler2mat(x=np.pi/2), np.eye(3)) + >>> np.allclose(xred, [[1, 0, 0],[0, 0, -1], [0, 1, 0]]) + True + + Notes + ----- + The direction of rotation is given by the right-hand rule (orient + the thumb of the right hand along the axis around which the rotation + occurs, with the end of the thumb at the positive end of the axis; + curl your fingers; the direction your fingers curl is the direction + of rotation). Therefore, the rotations are counterclockwise if + looking along the axis of rotation from positive to negative. + ''' + Ms = [] + if z: + cosz = math.cos(z) + sinz = math.sin(z) + Ms.append(np.array( + [[cosz, -sinz, 0], + [sinz, cosz, 0], + [0, 0, 1]])) + if y: + cosy = math.cos(y) + siny = math.sin(y) + Ms.append(np.array( + [[cosy, 0, siny], + [0, 1, 0], + [-siny, 0, cosy]])) + if x: + cosx = math.cos(x) + sinx = math.sin(x) + Ms.append(np.array( + [[1, 0, 0], + [0, cosx, -sinx], + [0, sinx, cosx]])) + if Ms: + return reduce(np.dot, Ms[::-1]) + return np.eye(3) + + +def mat2euler(M, cy_thresh=None): + ''' Discover Euler angle vector from 3x3 matrix + + Uses the conventions above. + + Parameters + ---------- + M : array-like, shape (3,3) + cy_thresh : None or scalar, optional + threshold below which to give up on straightforward arctan for + estimating x rotation. If None (default), estimate from + precision of input. + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Notes + ----- + If there was no numerical error, the routine could be derived using + Sympy expression for z then y then x rotation matrix, which is:: + + [ cos(y)*cos(z), -cos(y)*sin(z), sin(y)], + [cos(x)*sin(z) + cos(z)*sin(x)*sin(y), cos(x)*cos(z) - sin(x)*sin(y)*sin(z), -cos(y)*sin(x)], + [sin(x)*sin(z) - cos(x)*cos(z)*sin(y), cos(z)*sin(x) + cos(x)*sin(y)*sin(z), cos(x)*cos(y)] + + with the obvious derivations for z, y, and x + + z = atan2(-r12, r11) + y = asin(r13) + x = atan2(-r23, r33) + + Problems arise when cos(y) is close to zero, because both of:: + + z = atan2(cos(y)*sin(z), cos(y)*cos(z)) + x = atan2(cos(y)*sin(x), cos(x)*cos(y)) + + will be close to atan2(0, 0), and highly unstable. + + The ``cy`` fix for numerical instability below is from: *Graphics + Gems IV*, Paul Heckbert (editor), Academic Press, 1994, ISBN: + 0123361559. Specifically it comes from EulerAngles.c by Ken + Shoemake, and deals with the case where cos(y) is close to zero: + + See: http://www.graphicsgems.org/ + + The code appears to be licensed (from the website) as "can be used + without restrictions". + ''' + M = np.asarray(M) + if cy_thresh is None: + try: + cy_thresh = np.finfo(M.dtype).eps * 4 + except ValueError: + cy_thresh = _FLOAT_EPS_4 + r11, r12, r13, r21, r22, r23, r31, r32, r33 = M.flat + # cy: sqrt((cos(y)*cos(z))**2 + (cos(x)*cos(y))**2) + cy = math.sqrt(r33*r33 + r23*r23) + if cy > cy_thresh: # cos(y) not close to zero, standard form + z = math.atan2(-r12, r11) # atan2(cos(y)*sin(z), cos(y)*cos(z)) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = math.atan2(-r23, r33) # atan2(cos(y)*sin(x), cos(x)*cos(y)) + else: # cos(y) (close to) zero, so x -> 0.0 (see above) + # so r21 -> sin(z), r22 -> cos(z) and + z = math.atan2(r21, r22) + y = math.atan2(r13, cy) # atan2(sin(y), cy) + x = 0.0 + return z, y, x + + +def euler2quat(z=0, y=0, x=0): + ''' Return quaternion corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + quat : array shape (4,) + Quaternion in w, x, y z (real, then vector) format + + Notes + ----- + We can derive this formula in Sympy using: + + 1. Formula giving quaternion corresponding to rotation of theta radians + about arbitrary axis: + http://mathworld.wolfram.com/EulerParameters.html + 2. Generated formulae from 1.) for quaternions corresponding to + theta radians rotations about ``x, y, z`` axes + 3. Apply quaternion multiplication formula - + http://en.wikipedia.org/wiki/Quaternions#Hamilton_product - to + formulae from 2.) to give formula for combined rotations. + ''' + z = z/2.0 + y = y/2.0 + x = x/2.0 + cz = math.cos(z) + sz = math.sin(z) + cy = math.cos(y) + sy = math.sin(y) + cx = math.cos(x) + sx = math.sin(x) + return np.array([ + cx*cy*cz - sx*sy*sz, + cx*sy*sz + cy*cz*sx, + cx*cz*sy - sx*cy*sz, + cx*cy*sz + sx*cz*sy]) + + +def quat2euler(q): + ''' Return Euler angles corresponding to quaternion `q` + + Parameters + ---------- + q : 4 element sequence + w, x, y, z of quaternion + + Returns + ------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``quat2mat`` and ``mat2euler`` functions, but + the reduction in computation is small, and the code repetition is + large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return mat2euler(nq.quat2mat(q)) + + +def euler2angle_axis(z=0, y=0, x=0): + ''' Return angle, axis corresponding to these Euler angles + + Uses the z, then y, then x convention above + + Parameters + ---------- + z : scalar + Rotation angle in radians around z-axis (performed first) + y : scalar + Rotation angle in radians around y-axis + x : scalar + Rotation angle in radians around x-axis (performed last) + + Returns + ------- + theta : scalar + angle of rotation + vector : array shape (3,) + axis around which rotation occurs + + Examples + -------- + >>> theta, vec = euler2angle_axis(0, 1.5, 0) + >>> print(theta) + 1.5 + >>> np.allclose(vec, [0, 1, 0]) + True + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + return nq.quat2angle_axis(euler2quat(z, y, x)) + + +def angle_axis2euler(theta, vector, is_normalized=False): + ''' Convert angle, axis pair to Euler angles + + Parameters + ---------- + theta : scalar + angle of rotation + vector : 3 element sequence + vector specifying axis for rotation. + is_normalized : bool, optional + True if vector is already normalized (has norm of 1). Default + False + + Returns + ------- + z : scalar + y : scalar + x : scalar + Rotations in radians around z, y, x axes, respectively + + Examples + -------- + >>> z, y, x = angle_axis2euler(0, [1, 0, 0]) + >>> np.allclose((z, y, x), 0) + True + + Notes + ----- + It's possible to reduce the amount of calculation a little, by + combining parts of the ``angle_axis2mat`` and ``mat2euler`` + functions, but the reduction in computation is small, and the code + repetition is large. + ''' + # delayed import to avoid cyclic dependencies + import nibabel.quaternions as nq + M = nq.angle_axis2mat(theta, vector, is_normalized) + return mat2euler(M) diff --git a/zoo/SimpleView/dgcnn/tensorflow/utils/pc_util.py b/zoo/SimpleView/dgcnn/tensorflow/utils/pc_util.py new file mode 100644 index 0000000..4913231 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/utils/pc_util.py @@ -0,0 +1,198 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +# ---------------------------------------- +# Point cloud IO +# ---------------------------------------- + +def read_ply(filename): + """ read XYZ point cloud from filename PLY file """ + plydata = PlyData.read(filename) + pc = plydata['vertex'].data + pc_array = np.array([[x, y, z] for x,y,z in pc]) + return pc_array + + +def write_ply(points, filename, text=True): + """ input: Nx3, write points to filename as PLY format. """ + points = [(points[i,0], points[i,1], points[i,2]) for i in range(points.shape[0])] + vertex = np.array(points, dtype=[('x', 'f4'), ('y', 'f4'),('z', 'f4')]) + el = PlyElement.describe(vertex, 'vertex', comments=['vertices']) + PlyData([el], text=text).write(filename) + + +# ---------------------------------------- +# Simple Point cloud and Volume Renderers +# ---------------------------------------- + +def draw_point_cloud(input_points, canvasSize=500, space=200, diameter=25, + xrot=0, yrot=0, zrot=0, switch_xyz=[0,1,2], normalize=True): + """ Render point cloud to image with alpha channel. + Input: + points: Nx3 numpy array (+y is up direction) + Output: + gray image as numpy array of size canvasSizexcanvasSize + """ + image = np.zeros((canvasSize, canvasSize)) + if input_points is None or input_points.shape[0] == 0: + return image + + points = input_points[:, switch_xyz] + M = euler2mat(zrot, yrot, xrot) + points = (np.dot(M, points.transpose())).transpose() + + # Normalize the point cloud + # We normalize scale to fit points in a unit sphere + if normalize: + centroid = np.mean(points, axis=0) + points -= centroid + furthest_distance = np.max(np.sqrt(np.sum(abs(points)**2,axis=-1))) + points /= furthest_distance + + # Pre-compute the Gaussian disk + radius = (diameter-1)/2.0 + disk = np.zeros((diameter, diameter)) + for i in range(diameter): + for j in range(diameter): + if (i - radius) * (i-radius) + (j-radius) * (j-radius) <= radius * radius: + disk[i, j] = np.exp((-(i-radius)**2 - (j-radius)**2)/(radius**2)) + mask = np.argwhere(disk > 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +from PIL import Image +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +import matplotlib.pyplot as plt +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) diff --git a/zoo/SimpleView/dgcnn/tensorflow/utils/plyfile.py b/zoo/SimpleView/dgcnn/tensorflow/utils/plyfile.py new file mode 100644 index 0000000..69c2aa9 --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/utils/plyfile.py @@ -0,0 +1,916 @@ +# Copyright 2014 Darsh Ranjan +# +# This file is part of python-plyfile. +# +# python-plyfile is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# python-plyfile is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with python-plyfile. If not, see +# . + +from itertools import islice as _islice + +import numpy as _np +from sys import byteorder as _byteorder + + +try: + _range = xrange +except NameError: + _range = range + + +# Many-many relation +_data_type_relation = [ + ('int8', 'i1'), + ('char', 'i1'), + ('uint8', 'u1'), + ('uchar', 'b1'), + ('uchar', 'u1'), + ('int16', 'i2'), + ('short', 'i2'), + ('uint16', 'u2'), + ('ushort', 'u2'), + ('int32', 'i4'), + ('int', 'i4'), + ('uint32', 'u4'), + ('uint', 'u4'), + ('float32', 'f4'), + ('float', 'f4'), + ('float64', 'f8'), + ('double', 'f8') +] + +_data_types = dict(_data_type_relation) +_data_type_reverse = dict((b, a) for (a, b) in _data_type_relation) + +_types_list = [] +_types_set = set() +for (_a, _b) in _data_type_relation: + if _a not in _types_set: + _types_list.append(_a) + _types_set.add(_a) + if _b not in _types_set: + _types_list.append(_b) + _types_set.add(_b) + + +_byte_order_map = { + 'ascii': '=', + 'binary_little_endian': '<', + 'binary_big_endian': '>' +} + +_byte_order_reverse = { + '<': 'binary_little_endian', + '>': 'binary_big_endian' +} + +_native_byte_order = {'little': '<', 'big': '>'}[_byteorder] + + +def _lookup_type(type_str): + if type_str not in _data_type_reverse: + try: + type_str = _data_types[type_str] + except KeyError: + raise ValueError("field type %r not in %r" % + (type_str, _types_list)) + + return _data_type_reverse[type_str] + + +def _split_line(line, n): + fields = line.split(None, n) + if len(fields) == n: + fields.append('') + + assert len(fields) == n + 1 + + return fields + + +def make2d(array, cols=None, dtype=None): + ''' + Make a 2D array from an array of arrays. The `cols' and `dtype' + arguments can be omitted if the array is not empty. + + ''' + if (cols is None or dtype is None) and not len(array): + raise RuntimeError("cols and dtype must be specified for empty " + "array") + + if cols is None: + cols = len(array[0]) + + if dtype is None: + dtype = array[0].dtype + + return _np.fromiter(array, [('_', dtype, (cols,))], + count=len(array))['_'] + + +class PlyParseError(Exception): + + ''' + Raised when a PLY file cannot be parsed. + + The attributes `element', `row', `property', and `message' give + additional information. + + ''' + + def __init__(self, message, element=None, row=None, prop=None): + self.message = message + self.element = element + self.row = row + self.prop = prop + + s = '' + if self.element: + s += 'element %r: ' % self.element.name + if self.row is not None: + s += 'row %d: ' % self.row + if self.prop: + s += 'property %r: ' % self.prop.name + s += self.message + + Exception.__init__(self, s) + + def __repr__(self): + return ('PlyParseError(%r, element=%r, row=%r, prop=%r)' % + self.message, self.element, self.row, self.prop) + + +class PlyData(object): + + ''' + PLY file header and data. + + A PlyData instance is created in one of two ways: by the static + method PlyData.read (to read a PLY file), or directly from __init__ + given a sequence of elements (which can then be written to a PLY + file). + + ''' + + def __init__(self, elements=[], text=False, byte_order='=', + comments=[], obj_info=[]): + ''' + elements: sequence of PlyElement instances. + + text: whether the resulting PLY file will be text (True) or + binary (False). + + byte_order: '<' for little-endian, '>' for big-endian, or '=' + for native. This is only relevant if `text' is False. + + comments: sequence of strings that will be placed in the header + between the 'ply' and 'format ...' lines. + + obj_info: like comments, but will be placed in the header with + "obj_info ..." instead of "comment ...". + + ''' + if byte_order == '=' and not text: + byte_order = _native_byte_order + + self.byte_order = byte_order + self.text = text + + self.comments = list(comments) + self.obj_info = list(obj_info) + self.elements = elements + + def _get_elements(self): + return self._elements + + def _set_elements(self, elements): + self._elements = tuple(elements) + self._index() + + elements = property(_get_elements, _set_elements) + + def _get_byte_order(self): + return self._byte_order + + def _set_byte_order(self, byte_order): + if byte_order not in ['<', '>', '=']: + raise ValueError("byte order must be '<', '>', or '='") + + self._byte_order = byte_order + + byte_order = property(_get_byte_order, _set_byte_order) + + def _index(self): + self._element_lookup = dict((elt.name, elt) for elt in + self._elements) + if len(self._element_lookup) != len(self._elements): + raise ValueError("two elements with same name") + + @staticmethod + def _parse_header(stream): + ''' + Parse a PLY header from a readable file-like stream. + + ''' + lines = [] + comments = {'comment': [], 'obj_info': []} + while True: + line = stream.readline().decode('ascii').strip() + fields = _split_line(line, 1) + + if fields[0] == 'end_header': + break + + elif fields[0] in comments.keys(): + lines.append(fields) + else: + lines.append(line.split()) + + a = 0 + if lines[a] != ['ply']: + raise PlyParseError("expected 'ply'") + + a += 1 + while lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + if lines[a][0] != 'format': + raise PlyParseError("expected 'format'") + + if lines[a][2] != '1.0': + raise PlyParseError("expected version '1.0'") + + if len(lines[a]) != 3: + raise PlyParseError("too many fields after 'format'") + + fmt = lines[a][1] + + if fmt not in _byte_order_map: + raise PlyParseError("don't understand format %r" % fmt) + + byte_order = _byte_order_map[fmt] + text = fmt == 'ascii' + + a += 1 + while a < len(lines) and lines[a][0] in comments.keys(): + comments[lines[a][0]].append(lines[a][1]) + a += 1 + + return PlyData(PlyElement._parse_multi(lines[a:]), + text, byte_order, + comments['comment'], comments['obj_info']) + + @staticmethod + def read(stream): + ''' + Read PLY data from a readable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'read') + try: + data = PlyData._parse_header(stream) + for elt in data: + elt._read(stream, data.text, data.byte_order) + finally: + if must_close: + stream.close() + + return data + + def write(self, stream): + ''' + Write PLY data to a writeable file-like object or filename. + + ''' + (must_close, stream) = _open_stream(stream, 'write') + try: + stream.write(self.header.encode('ascii')) + stream.write(b'\r\n') + for elt in self: + elt._write(stream, self.text, self.byte_order) + finally: + if must_close: + stream.close() + + @property + def header(self): + ''' + Provide PLY-formatted metadata for the instance. + + ''' + lines = ['ply'] + + if self.text: + lines.append('format ascii 1.0') + else: + lines.append('format ' + + _byte_order_reverse[self.byte_order] + + ' 1.0') + + # Some information is lost here, since all comments are placed + # between the 'format' line and the first element. + for c in self.comments: + lines.append('comment ' + c) + + for c in self.obj_info: + lines.append('obj_info ' + c) + + lines.extend(elt.header for elt in self.elements) + lines.append('end_header') + return '\r\n'.join(lines) + + def __iter__(self): + return iter(self.elements) + + def __len__(self): + return len(self.elements) + + def __contains__(self, name): + return name in self._element_lookup + + def __getitem__(self, name): + return self._element_lookup[name] + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyData(%r, text=%r, byte_order=%r, ' + 'comments=%r, obj_info=%r)' % + (self.elements, self.text, self.byte_order, + self.comments, self.obj_info)) + + +def _open_stream(stream, read_or_write): + if hasattr(stream, read_or_write): + return (False, stream) + try: + return (True, open(stream, read_or_write[0] + 'b')) + except TypeError: + raise RuntimeError("expected open file or filename") + + +class PlyElement(object): + + ''' + PLY file element. + + A client of this library doesn't normally need to instantiate this + directly, so the following is only for the sake of documenting the + internals. + + Creating a PlyElement instance is generally done in one of two ways: + as a byproduct of PlyData.read (when reading a PLY file) and by + PlyElement.describe (before writing a PLY file). + + ''' + + def __init__(self, name, properties, count, comments=[]): + ''' + This is not part of the public interface. The preferred methods + of obtaining PlyElement instances are PlyData.read (to read from + a file) and PlyElement.describe (to construct from a numpy + array). + + ''' + self._name = str(name) + self._check_name() + self._count = count + + self._properties = tuple(properties) + self._index() + + self.comments = list(comments) + + self._have_list = any(isinstance(p, PlyListProperty) + for p in self.properties) + + @property + def count(self): + return self._count + + def _get_data(self): + return self._data + + def _set_data(self, data): + self._data = data + self._count = len(data) + self._check_sanity() + + data = property(_get_data, _set_data) + + def _check_sanity(self): + for prop in self.properties: + if prop.name not in self._data.dtype.fields: + raise ValueError("dangling property %r" % prop.name) + + def _get_properties(self): + return self._properties + + def _set_properties(self, properties): + self._properties = tuple(properties) + self._check_sanity() + self._index() + + properties = property(_get_properties, _set_properties) + + def _index(self): + self._property_lookup = dict((prop.name, prop) + for prop in self._properties) + if len(self._property_lookup) != len(self._properties): + raise ValueError("two properties with same name") + + def ply_property(self, name): + return self._property_lookup[name] + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "element name %r contains spaces" % self._name + raise ValueError(msg) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype of the in-memory representation of the + data. (If there are no list properties, and the PLY format is + binary, then this also accurately describes the on-disk + representation of the element.) + + ''' + return [(prop.name, prop.dtype(byte_order)) + for prop in self.properties] + + @staticmethod + def _parse_multi(header_lines): + ''' + Parse a list of PLY element definitions. + + ''' + elements = [] + while header_lines: + (elt, header_lines) = PlyElement._parse_one(header_lines) + elements.append(elt) + + return elements + + @staticmethod + def _parse_one(lines): + ''' + Consume one element definition. The unconsumed input is + returned along with a PlyElement instance. + + ''' + a = 0 + line = lines[a] + + if line[0] != 'element': + raise PlyParseError("expected 'element'") + if len(line) > 3: + raise PlyParseError("too many fields after 'element'") + if len(line) < 3: + raise PlyParseError("too few fields after 'element'") + + (name, count) = (line[1], int(line[2])) + + comments = [] + properties = [] + while True: + a += 1 + if a >= len(lines): + break + + if lines[a][0] == 'comment': + comments.append(lines[a][1]) + elif lines[a][0] == 'property': + properties.append(PlyProperty._parse_one(lines[a])) + else: + break + + return (PlyElement(name, properties, count, comments), + lines[a:]) + + @staticmethod + def describe(data, name, len_types={}, val_types={}, + comments=[]): + ''' + Construct a PlyElement from an array's metadata. + + len_types and val_types can be given as mappings from list + property names to type strings (like 'u1', 'f4', etc., or + 'int8', 'float32', etc.). These can be used to define the length + and value types of list properties. List property lengths + always default to type 'u1' (8-bit unsigned integer), and value + types default to 'i4' (32-bit integer). + + ''' + if not isinstance(data, _np.ndarray): + raise TypeError("only numpy arrays are supported") + + if len(data.shape) != 1: + raise ValueError("only one-dimensional arrays are " + "supported") + + count = len(data) + + properties = [] + descr = data.dtype.descr + + for t in descr: + if not isinstance(t[1], str): + raise ValueError("nested records not supported") + + if not t[0]: + raise ValueError("field with empty name") + + if len(t) != 2 or t[1][1] == 'O': + # non-scalar field, which corresponds to a list + # property in PLY. + + if t[1][1] == 'O': + if len(t) != 2: + raise ValueError("non-scalar object fields not " + "supported") + + len_str = _data_type_reverse[len_types.get(t[0], 'u1')] + if t[1][1] == 'O': + val_type = val_types.get(t[0], 'i4') + val_str = _lookup_type(val_type) + else: + val_str = _lookup_type(t[1][1:]) + + prop = PlyListProperty(t[0], len_str, val_str) + else: + val_str = _lookup_type(t[1][1:]) + prop = PlyProperty(t[0], val_str) + + properties.append(prop) + + elt = PlyElement(name, properties, count, comments) + elt.data = data + + return elt + + def _read(self, stream, text, byte_order): + ''' + Read the actual data from a PLY file. + + ''' + if text: + self._read_txt(stream) + else: + if self._have_list: + # There are list properties, so a simple load is + # impossible. + self._read_bin(stream, byte_order) + else: + # There are no list properties, so loading the data is + # much more straightforward. + self._data = _np.fromfile(stream, + self.dtype(byte_order), + self.count) + + if len(self._data) < self.count: + k = len(self._data) + del self._data + raise PlyParseError("early end-of-file", self, k) + + self._check_sanity() + + def _write(self, stream, text, byte_order): + ''' + Write the data to a PLY file. + + ''' + if text: + self._write_txt(stream) + else: + if self._have_list: + # There are list properties, so serialization is + # slightly complicated. + self._write_bin(stream, byte_order) + else: + # no list properties, so serialization is + # straightforward. + self.data.astype(self.dtype(byte_order), + copy=False).tofile(stream) + + def _read_txt(self, stream): + ''' + Load a PLY element from an ASCII-format PLY file. The element + may contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype()) + + k = 0 + for line in _islice(iter(stream.readline, b''), self.count): + fields = iter(line.strip().split()) + for prop in self.properties: + try: + self._data[prop.name][k] = prop._from_fields(fields) + except StopIteration: + raise PlyParseError("early end-of-line", + self, k, prop) + except ValueError: + raise PlyParseError("malformed input", + self, k, prop) + try: + next(fields) + except StopIteration: + pass + else: + raise PlyParseError("expected end-of-line", self, k) + k += 1 + + if k < self.count: + del self._data + raise PlyParseError("early end-of-file", self, k) + + def _write_txt(self, stream): + ''' + Save a PLY element to an ASCII-format PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + fields = [] + for prop in self.properties: + fields.extend(prop._to_fields(rec[prop.name])) + + _np.savetxt(stream, [fields], '%.18g', newline='\r\n') + + def _read_bin(self, stream, byte_order): + ''' + Load a PLY element from a binary PLY file. The element may + contain list properties. + + ''' + self._data = _np.empty(self.count, dtype=self.dtype(byte_order)) + + for k in _range(self.count): + for prop in self.properties: + try: + self._data[prop.name][k] = \ + prop._read_bin(stream, byte_order) + except StopIteration: + raise PlyParseError("early end-of-file", + self, k, prop) + + def _write_bin(self, stream, byte_order): + ''' + Save a PLY element to a binary PLY file. The element may + contain list properties. + + ''' + for rec in self.data: + for prop in self.properties: + prop._write_bin(rec[prop.name], stream, byte_order) + + @property + def header(self): + ''' + Format this element's metadata as it would appear in a PLY + header. + + ''' + lines = ['element %s %d' % (self.name, self.count)] + + # Some information is lost here, since all comments are placed + # between the 'element' line and the first property definition. + for c in self.comments: + lines.append('comment ' + c) + + lines.extend(list(map(str, self.properties))) + + return '\r\n'.join(lines) + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __str__(self): + return self.header + + def __repr__(self): + return ('PlyElement(%r, %r, count=%d, comments=%r)' % + (self.name, self.properties, self.count, + self.comments)) + + +class PlyProperty(object): + + ''' + PLY property description. This class is pure metadata; the data + itself is contained in PlyElement instances. + + ''' + + def __init__(self, name, val_dtype): + self._name = str(name) + self._check_name() + self.val_dtype = val_dtype + + def _get_val_dtype(self): + return self._val_dtype + + def _set_val_dtype(self, val_dtype): + self._val_dtype = _data_types[_lookup_type(val_dtype)] + + val_dtype = property(_get_val_dtype, _set_val_dtype) + + @property + def name(self): + return self._name + + def _check_name(self): + if any(c.isspace() for c in self._name): + msg = "Error: property name %r contains spaces" % self._name + raise RuntimeError(msg) + + @staticmethod + def _parse_one(line): + assert line[0] == 'property' + + if line[1] == 'list': + if len(line) > 5: + raise PlyParseError("too many fields after " + "'property list'") + if len(line) < 5: + raise PlyParseError("too few fields after " + "'property list'") + + return PlyListProperty(line[4], line[2], line[3]) + + else: + if len(line) > 3: + raise PlyParseError("too many fields after " + "'property'") + if len(line) < 3: + raise PlyParseError("too few fields after " + "'property'") + + return PlyProperty(line[2], line[1]) + + def dtype(self, byte_order='='): + ''' + Return the numpy dtype description for this property (as a tuple + of strings). + + ''' + return byte_order + self.val_dtype + + def _from_fields(self, fields): + ''' + Parse from generator. Raise StopIteration if the property could + not be read. + + ''' + return _np.dtype(self.dtype()).type(next(fields)) + + def _to_fields(self, data): + ''' + Return generator over one item. + + ''' + yield _np.dtype(self.dtype()).type(data) + + def _read_bin(self, stream, byte_order): + ''' + Read data from a binary stream. Raise StopIteration if the + property could not be read. + + ''' + try: + return _np.fromfile(stream, self.dtype(byte_order), 1)[0] + except IndexError: + raise StopIteration + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + _np.dtype(self.dtype(byte_order)).type(data).tofile(stream) + + def __str__(self): + val_str = _data_type_reverse[self.val_dtype] + return 'property %s %s' % (val_str, self.name) + + def __repr__(self): + return 'PlyProperty(%r, %r)' % (self.name, + _lookup_type(self.val_dtype)) + + +class PlyListProperty(PlyProperty): + + ''' + PLY list property description. + + ''' + + def __init__(self, name, len_dtype, val_dtype): + PlyProperty.__init__(self, name, val_dtype) + + self.len_dtype = len_dtype + + def _get_len_dtype(self): + return self._len_dtype + + def _set_len_dtype(self, len_dtype): + self._len_dtype = _data_types[_lookup_type(len_dtype)] + + len_dtype = property(_get_len_dtype, _set_len_dtype) + + def dtype(self, byte_order='='): + ''' + List properties always have a numpy dtype of "object". + + ''' + return '|O' + + def list_dtype(self, byte_order='='): + ''' + Return the pair (len_dtype, val_dtype) (both numpy-friendly + strings). + + ''' + return (byte_order + self.len_dtype, + byte_order + self.val_dtype) + + def _from_fields(self, fields): + (len_t, val_t) = self.list_dtype() + + n = int(_np.dtype(len_t).type(next(fields))) + + data = _np.loadtxt(list(_islice(fields, n)), val_t, ndmin=1) + if len(data) < n: + raise StopIteration + + return data + + def _to_fields(self, data): + ''' + Return generator over the (numerical) PLY representation of the + list data (length followed by actual data). + + ''' + (len_t, val_t) = self.list_dtype() + + data = _np.asarray(data, dtype=val_t).ravel() + + yield _np.dtype(len_t).type(data.size) + for x in data: + yield x + + def _read_bin(self, stream, byte_order): + (len_t, val_t) = self.list_dtype(byte_order) + + try: + n = _np.fromfile(stream, len_t, 1)[0] + except IndexError: + raise StopIteration + + data = _np.fromfile(stream, val_t, n) + if len(data) < n: + raise StopIteration + + return data + + def _write_bin(self, data, stream, byte_order): + ''' + Write data to a binary stream. + + ''' + (len_t, val_t) = self.list_dtype(byte_order) + + data = _np.asarray(data, dtype=val_t).ravel() + + _np.array(data.size, dtype=len_t).tofile(stream) + data.tofile(stream) + + def __str__(self): + len_str = _data_type_reverse[self.len_dtype] + val_str = _data_type_reverse[self.val_dtype] + return 'property list %s %s %s' % (len_str, val_str, self.name) + + def __repr__(self): + return ('PlyListProperty(%r, %r, %r)' % + (self.name, + _lookup_type(self.len_dtype), + _lookup_type(self.val_dtype))) diff --git a/zoo/SimpleView/dgcnn/tensorflow/utils/tf_util.py b/zoo/SimpleView/dgcnn/tensorflow/utils/tf_util.py new file mode 100644 index 0000000..22ef62c --- /dev/null +++ b/zoo/SimpleView/dgcnn/tensorflow/utils/tf_util.py @@ -0,0 +1,706 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2016 + +Upadted by Yue Wang and Yongbin Sun +""" + +import numpy as np +import tensorflow as tf + +def _variable_on_cpu(name, shape, initializer, use_fp16=False, trainable=True): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device('/cpu:0'): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype, trainable=trainable) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=0.0, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None, + is_dist=False): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn', is_dist=is_dist) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + + + + +def batch_norm_template(inputs, is_training, scope, moments_dims, bn_decay): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = tf.Variable(tf.constant(0.0, shape=[num_channels]), + name='beta', trainable=True) + gamma = tf.Variable(tf.constant(1.0, shape=[num_channels]), + name='gamma', trainable=True) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_dist_template(inputs, is_training, scope, moments_dims, bn_decay): + """ The batch normalization for distributed training. + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = _variable_on_cpu('beta', [num_channels], initializer=tf.zeros_initializer()) + gamma = _variable_on_cpu('gamma', [num_channels], initializer=tf.ones_initializer()) + + pop_mean = _variable_on_cpu('pop_mean', [num_channels], initializer=tf.zeros_initializer(), trainable=False) + pop_var = _variable_on_cpu('pop_var', [num_channels], initializer=tf.ones_initializer(), trainable=False) + + def train_bn_op(): + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + train_mean = tf.assign(pop_mean, pop_mean * decay + batch_mean * (1 - decay)) + train_var = tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay)) + with tf.control_dependencies([train_mean, train_var]): + return tf.nn.batch_normalization(inputs, batch_mean, batch_var, beta, gamma, 1e-3) + + def test_bn_op(): + return tf.nn.batch_normalization(inputs, pop_mean, pop_var, beta, gamma, 1e-3) + + normed = tf.cond(is_training, + train_bn_op, + test_bn_op) + return normed + + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,1], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,1], bn_decay) + + + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,1,2], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,1,2], bn_decay) + + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope, is_dist=False): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + is_dist: true indicating distributed training scheme + Return: + normed: batch-normalized maps + """ + if is_dist: + return batch_norm_dist_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + else: + return batch_norm_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs + + +def pairwise_distance(point_cloud): + """Compute pairwise distance of a point cloud. + + Args: + point_cloud: tensor (batch_size, num_points, num_dims) + + Returns: + pairwise distance: (batch_size, num_points, num_points) + """ + og_batch_size = point_cloud.get_shape().as_list()[0] + point_cloud = tf.squeeze(point_cloud) + if og_batch_size == 1: + point_cloud = tf.expand_dims(point_cloud, 0) + + point_cloud_transpose = tf.transpose(point_cloud, perm=[0, 2, 1]) + point_cloud_inner = tf.matmul(point_cloud, point_cloud_transpose) + point_cloud_inner = -2*point_cloud_inner + point_cloud_square = tf.reduce_sum(tf.square(point_cloud), axis=-1, keep_dims=True) + point_cloud_square_tranpose = tf.transpose(point_cloud_square, perm=[0, 2, 1]) + return point_cloud_square + point_cloud_inner + point_cloud_square_tranpose + + +def knn(adj_matrix, k=20): + """Get KNN based on the pairwise distance. + Args: + pairwise distance: (batch_size, num_points, num_points) + k: int + + Returns: + nearest neighbors: (batch_size, num_points, k) + """ + neg_adj = -adj_matrix + _, nn_idx = tf.nn.top_k(neg_adj, k=k) + return nn_idx + + +def get_edge_feature(point_cloud, nn_idx, k=20): + """Construct edge feature for each point + Args: + point_cloud: (batch_size, num_points, 1, num_dims) + nn_idx: (batch_size, num_points, k) + k: int + + Returns: + edge features: (batch_size, num_points, k, num_dims) + """ + og_batch_size = point_cloud.get_shape().as_list()[0] + point_cloud = tf.squeeze(point_cloud) + if og_batch_size == 1: + point_cloud = tf.expand_dims(point_cloud, 0) + + point_cloud_central = point_cloud + + point_cloud_shape = point_cloud.get_shape() + batch_size = point_cloud_shape[0].value + num_points = point_cloud_shape[1].value + num_dims = point_cloud_shape[2].value + + idx_ = tf.range(batch_size) * num_points + idx_ = tf.reshape(idx_, [batch_size, 1, 1]) + + point_cloud_flat = tf.reshape(point_cloud, [-1, num_dims]) + point_cloud_neighbors = tf.gather(point_cloud_flat, nn_idx+idx_) + point_cloud_central = tf.expand_dims(point_cloud_central, axis=-2) + + point_cloud_central = tf.tile(point_cloud_central, [1, 1, k, 1]) + + edge_feature = tf.concat([point_cloud_central, point_cloud_neighbors-point_cloud_central], axis=-1) + return edge_feature diff --git a/zoo/SimpleView/download.sh b/zoo/SimpleView/download.sh new file mode 100755 index 0000000..55a9619 --- /dev/null +++ b/zoo/SimpleView/download.sh @@ -0,0 +1,31 @@ +wgetgdrive(){ + # $1 = file ID + # $2 = file name + + URL="https://docs.google.com/uc?export=download&id=$1" + + wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate $URL -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=$1" -O $2 && rm -rf /tmp/cookies.txt +} + +mkdir tmp +key="$1" +case $key in + pretrained) + wgetgdrive 1qSkMYYK1qkT4wMMeAXerSI2Q7AxWujsS tmp/pretrained.zip + unzip -o tmp/pretrained.zip + ;; + modelnet40) + wget --no-check-certificate https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip + unzip modelnet40_ply_hdf5_2048.zip + mv modelnet40_ply_hdf5_2048 data + rm -r modelnet40_ply_hdf5_2048.zip + wgetgdrive 1jXe7UR6He-pV3B7vIxMAjEt63Vhy1bV8 tmp/modelnet40_ply_hdf5_2048_valid_small.zip + unzip -o tmp/modelnet40_ply_hdf5_2048_valid_small.zip + mv modelnet40_ply_hdf5_2048_valid_small/* data/modelnet40_ply_hdf5_2048/ + rm -r modelnet40_ply_hdf5_2048_valid_small + ;; + *) + echo "unknow argument $1" # unknown argument + ;; +esac +rm -r tmp diff --git a/zoo/SimpleView/eval_models.sh b/zoo/SimpleView/eval_models.sh new file mode 100644 index 0000000..3515f71 --- /dev/null +++ b/zoo/SimpleView/eval_models.sh @@ -0,0 +1,48 @@ +# evaluation on test set, fair protocol, table 4 +python main.py --entry test --model-path pretrained/dgcnn_rscnn_run_1/model_300.pth --exp-config configs/dgcnn_rscnn_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_dgcnn_run_1/model_325.pth --exp-config configs/dgcnn_dgcnn_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_pointnet_run_1/model_300.pth --exp-config configs/dgcnn_pointnet_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_pointnet2_run_1/model_975.pth --exp-config configs/dgcnn_pointnet2_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_simpleview_run_1/model_650.pth --exp-config configs/dgcnn_simpleview_run_1.yaml + +# evaluation on test set, pointnet++ protocol, table 4, row 2 (no vote) +python main.py --entry test --model-path pretrained/pointnet2_rscnn_run_1/model_625.pth --exp-config configs/pointnet2_rscnn_run_1.yaml +python main.py --entry test --model-path pretrained/pointnet2_dgcnn_run_1/model_400.pth --exp-config configs/pointnet2_dgcnn_run_1.yaml +python main.py --entry test --model-path pretrained/pointnet2_pointnet_run_1/model_350.pth --exp-config configs/pointnet2_pointnet_run_1.yaml +python main.py --entry test --model-path pretrained/pointnet2_pointnet2_run_1/model_925.pth --exp-config configs/pointnet2_pointnet2_run_1.yaml +python main.py --entry test --model-path pretrained/pointnet2_simpleview_run_1/model_625.pth --exp-config configs/pointnet2_simpleview_run_1.yaml + +# evaluation on test set, pointnet++ protocol with vote, table 4, row 3 (vote) +# python main.py --entry pn2_vote --model-path pretrained/pointnet2_rscnn_run_1/model_625.pth --exp-config configs/pointnet2_rscnn_run_1.yaml +# python main.py --entry pn2_vote --model-path pretrained/pointnet2_dgcnn_run_1/model_400.pth --exp-config configs/pointnet2_dgcnn_run_1.yaml +# python main.py --entry pn2_vote --model-path pretrained/pointnet2_pointnet_run_1/model_350.pth --exp-config configs/pointnet2_pointnet_run_1.yaml +# python main.py --entry pn2_vote --model-path pretrained/pointnet2_pointnet2_run_1/model_925.pth --exp-config configs/pointnet2_pointnet2_run_1.yaml +# python main.py --entry pn2_vote --model-path pretrained/pointnet2_simpleview_run_1/model_625.pth --exp-config configs/pointnet2_simpleview_run_1.yaml + +# evaluation on test set, rscnn protocol, table 4, row 4 (no vote) +python main.py --entry test --model-path pretrained/rscnn_rscnn_run_1/model_best_test.pth --exp-config configs/rscnn_rscnn_run_1.yaml +python main.py --entry test --model-path pretrained/rscnn_dgcnn_run_1/model_best_test.pth --exp-config configs/rscnn_dgcnn_run_1.yaml +python main.py --entry test --model-path pretrained/rscnn_pointnet_run_1/model_best_test.pth --exp-config configs/rscnn_pointnet_run_1.yaml +python main.py --entry test --model-path pretrained/rscnn_pointnet2_run_1/model_best_test.pth --exp-config configs/rscnn_pointnet2_run_1.yaml +python main.py --entry test --model-path pretrained/rscnn_simpleview_run_1/model_best_test.pth --exp-config configs/rscnn_simpleview_run_1.yaml + +# evaluation on test set, rscnn protocol with vote, table 4, row 4 (vote) +# python main.py --entry rscnn_vote --model-path pretrained/rscnn_rscnn_run_1/model_best_test.pth --exp-config configs/cls_dl_rscnn_model_rscnn_run_1.yaml +# python main.py --entry rscnn_vote --model-path pretrained/rscnn_dgcnn_run_1/model_best_test.pth --exp-config configs/cls_dl_rscnn_model_dgcnn_run_1.yaml +# python main.py --entry rscnn_vote --model-path pretrained/rscnn_pointnet_run_1/model_best_test.pth --exp-config configs/cls_dl_rscnn_model_pointnet_run_1.yaml +# python main.py --entry rscnn_vote --model-path pretrained/rscnn_pointnet2_run_1/model_best_test.pth --exp-config configs/cls_dl_rscnn_model_pointnet2_run_1.yaml +# python main.py --entry rscnn_vote --model-path pretrained/rscnn_simpleview_run_1/model_best_test.pth --exp-config configs/cls_dl_rscnn_model_multiview2_18_run_1.yaml + +# evaluation on test set, dgcnn protocol, table 4, row 5 (CE) +python main.py --entry test --model-path pretrained/dgcnn_rscnn_ce_run_1/model_best_test.pth --exp-config configs/dgcnn_rscnn_ce_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_dgcnn_ce_run_1/model_best_test.pth --exp-config configs/dgcnn_dgcnn_ce_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_pointnet_ce_run_1/model_best_test.pth --exp-config configs/dgcnn_pointnet_ce_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_pointnet2_ce_run_1/model_best_test.pth --exp-config configs/dgcnn_pointnet2_ce_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_simpleview_ce_run_1/model_best_test.pth --exp-config configs/dgcnn_simpleview_ce_run_1.yaml + +# evaluation on test set, dgcnn protocol, table 4, row 6 (smooth) +python main.py --entry test --model-path pretrained/dgcnn_rscnn_run_1/model_best_test.pth --exp-config configs/dgcnn_rscnn_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_dgcnn_run_1/model_best_test.pth --exp-config configs/dgcnn_dgcnn_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_pointnet_run_1/model_best_test.pth --exp-config configs/dgcnn_pointnet_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_pointnet2_run_1/model_best_test.pth --exp-config configs/dgcnn_pointnet2_run_1.yaml +python main.py --entry test --model-path pretrained/dgcnn_simpleview_run_1/model_best_test.pth --exp-config configs/dgcnn_simpleview_run_1.yaml diff --git a/zoo/SimpleView/img/simpleview.png b/zoo/SimpleView/img/simpleview.png new file mode 100644 index 0000000..0d0379a Binary files /dev/null and b/zoo/SimpleView/img/simpleview.png differ diff --git a/zoo/SimpleView/main.py b/zoo/SimpleView/main.py new file mode 100644 index 0000000..9da9561 --- /dev/null +++ b/zoo/SimpleView/main.py @@ -0,0 +1,590 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim.lr_scheduler as lr_scheduler +import random +from dataloader import create_dataloader +from time import time +from datetime import datetime +from progressbar import ProgressBar +import models +from collections import defaultdict +import os +import numpy as np +import argparse +from all_utils import ( + TensorboardManager, PerfTrackTrain, + PerfTrackVal, TrackTrain, smooth_loss, DATASET_NUM_CLASS, + rscnn_voting_evaluate_cls, pn2_vote_evaluate_cls) +from configs import get_cfg_defaults +import pprint +from pointnet_pyt.pointnet.model import feature_transform_regularizer +from modelnetc_utils import eval_corrupt_wrapper + +DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu') +if DEVICE.type == 'cpu': + print('WARNING: Using CPU') + + +def check_inp_fmt(task, data_batch, dataset_name): + if task in ['cls', 'cls_trans']: + assert set(data_batch.keys()) == {'pc', 'label'} + pc, label = data_batch['pc'], data_batch['label'] + # special case made for modelnet40_dgcnn to match the + # original implementation + # dgcnn loads torch.DoubleTensor for the test dataset + if dataset_name == 'modelnet40_dgcnn': + assert isinstance(pc, torch.FloatTensor) or isinstance( + pc, torch.DoubleTensor) + else: + assert isinstance(pc, torch.FloatTensor) + assert isinstance(label, torch.LongTensor) + assert len(pc.shape) == 3 + assert len(label.shape) == 1 + b1, _, y = pc.shape[0], pc.shape[1], pc.shape[2] + b2 = label.shape[0] + assert b1 == b2 + assert y == 3 + assert label.max().item() < DATASET_NUM_CLASS[dataset_name] + assert label.min().item() >= 0 + else: + assert NotImplemented + + +def check_out_fmt(task, out, dataset_name): + if task == 'cls': + assert set(out.keys()) == {'logit'} + logit = out['logit'] + assert isinstance(logit, torch.FloatTensor if DEVICE.type == 'cpu' else torch.cuda.FloatTensor) + assert len(logit.shape) == 2 + assert DATASET_NUM_CLASS[dataset_name] == logit.shape[1] + elif task == 'cls_trans': + assert set(out.keys()) == {'logit', 'trans_feat'} + logit = out['logit'] + trans_feat = out['trans_feat'] + assert isinstance(logit, torch.FloatTensor if DEVICE.type == 'cpu' else torch.cuda.FloatTensor) + assert isinstance(trans_feat, torch.FloatTensor if DEVICE.type == 'cpu' else torch.cuda.FloatTensor) + assert len(logit.shape) == 2 + assert len(trans_feat.shape) == 3 + assert trans_feat.shape[0] == logit.shape[0] + # 64 coming from pointnet implementation + assert (trans_feat.shape[1] == trans_feat.shape[2]) and (trans_feat.shape[1] == 64) + assert DATASET_NUM_CLASS[dataset_name] == logit.shape[1] + else: + assert NotImplemented + + +def get_inp(task, model, data_batch, batch_proc, dataset_name): + check_inp_fmt(task, data_batch, dataset_name) + if not batch_proc is None: + data_batch = batch_proc(data_batch, DEVICE) + check_inp_fmt(task, data_batch, dataset_name) + + if isinstance(model, nn.DataParallel): + model_type = type(model.module) + else: + model_type = type(model) + + if task in ['cls', 'cls_trans']: + pc = data_batch['pc'] + inp = {'pc': pc} + else: + assert False + + return inp + + +def get_loss(task, loss_name, data_batch, out, dataset_name): + """ + Returns the tensor loss function + :param task: + :param loss_name: + :param data_batch: batched data; note not applied data_batch + :param out: output from the model + :param dataset_name: + :return: tensor + """ + check_out_fmt(task, out, dataset_name) + if task == 'cls': + label = data_batch['label'].to(out['logit'].device) + if loss_name == 'cross_entropy': + loss = F.cross_entropy(out['logit'], label) + # source: https://github.com/WangYueFt/dgcnn/blob/master/pytorch/util.py + elif loss_name == 'smooth': + loss = smooth_loss(out['logit'], label) + else: + assert False + elif task == 'cls_trans': + label = data_batch['label'].to(out['logit'].device) + trans_feat = out['trans_feat'] + logit = out['logit'] + if loss_name == 'cross_entropy': + loss = F.cross_entropy(logit, label) + loss += feature_transform_regularizer(trans_feat) * 0.001 + elif loss_name == 'smooth': + loss = smooth_loss(logit, label) + loss += feature_transform_regularizer(trans_feat) * 0.001 + else: + assert False + else: + assert False + + return loss + + +def validate(task, loader, model, dataset_name): + model.eval() + + def get_extra_param(): + return None + + perf = PerfTrackVal(task, extra_param=get_extra_param()) + time_dl = 0 + time_gi = 0 + time_model = 0 + time_upd = 0 + + with torch.no_grad(): + # bar = ProgressBar(max_value=len(loader)) + time5 = time() + for i, data_batch in enumerate(loader): + time1 = time() + inp = get_inp(task, model, data_batch, loader.dataset.batch_proc, dataset_name) + + time2 = time() + out = model(**inp) + + time3 = time() + perf.update(data_batch=data_batch, out=out) + time4 = time() + + time_dl += (time1 - time5) + time_gi += (time2 - time1) + time_model += (time3 - time2) + time_upd += (time4 - time3) + + time5 = time() + # bar.update(i) + + # print(f"Time DL: {time_dl}, Time Get Inp: {time_gi}, Time Model: {time_model}, Time Update: {time_upd}") + return perf.agg() + + +def train(task, loader, model, optimizer, loss_name, dataset_name): + model.train() + + def get_extra_param(): + return None + + perf = PerfTrackTrain(task, extra_param=get_extra_param()) + time_forward = 0 + time_backward = 0 + time_data_loading = 0 + + time3 = time() + for i, data_batch in enumerate(loader): + time1 = time() + + inp = get_inp(task, model, data_batch, loader.dataset.batch_proc, dataset_name) + out = model(**inp) + loss = get_loss(task, loss_name, data_batch, out, dataset_name) + + perf.update_all(data_batch=data_batch, out=out, loss=loss) + time2 = time() + + if loss.ne(loss).any(): + print("WARNING: avoiding step as nan in the loss") + else: + optimizer.zero_grad() + loss.backward() + bad_grad = False + for x in model.parameters(): + if x.grad is not None: + if x.grad.ne(x.grad).any(): + print("WARNING: nan in a gradient") + bad_grad = True + break + if ((x.grad == float('inf')) | (x.grad == float('-inf'))).any(): + print("WARNING: inf in a gradient") + bad_grad = True + break + + if bad_grad: + print("WARNING: avoiding step as bad gradient") + else: + optimizer.step() + + time_data_loading += (time1 - time3) + time_forward += (time2 - time1) + time3 = time() + time_backward += (time3 - time2) + + if i % 50 == 0: + print( + f"[{i}/{len(loader)}] avg_loss: {perf.agg_loss()}, FW time = {round(time_forward, 2)}, " + f"BW time = {round(time_backward, 2)}, DL time = {round(time_data_loading, 2)}") + + return perf.agg(), perf.agg_loss() + + +def save_checkpoint(id, epoch, model, optimizer, lr_sched, bnm_sched, test_perf, cfg): + model.cpu() + path = f"./runs/{cfg.EXP.EXP_ID}/model_{id}.pth" + torch.save({ + 'cfg': vars(cfg), + 'epoch': epoch, + 'model_state': model.state_dict(), + 'optimizer_state': optimizer.state_dict(), + 'lr_sched_state': lr_sched.state_dict(), + 'bnm_sched_state': bnm_sched.state_dict() if bnm_sched is not None else None, + 'test_perf': test_perf, + }, path) + print('Checkpoint saved to %s' % path) + model.to(DEVICE) + + +def load_best_checkpoint(model, cfg): + path = f"./runs/{cfg.EXP.EXP_ID}/model_best.pth" + checkpoint = torch.load(path) + model.load_state_dict(checkpoint['model_state']) + print('Checkpoint loaded from %s' % path) + + +def load_model_opt_sched(model, optimizer, lr_sched, bnm_sched, model_path): + print(f'Recovering model and checkpoint from {model_path}') + checkpoint = torch.load(model_path) + try: + model.load_state_dict(checkpoint['model_state']) + except: + if isinstance(model, nn.DataParallel): + model.module.load_state_dict(checkpoint['model_state']) + else: + model = nn.DataParallel(model) + model.load_state_dict(checkpoint['model_state']) + model = model.module + + optimizer.load_state_dict(checkpoint['optimizer_state']) + # for backward compatibility with saved models + if 'lr_sched_state' in checkpoint: + lr_sched.load_state_dict(checkpoint['lr_sched_state']) + if checkpoint['bnm_sched_state'] is not None: + bnm_sched.load_state_dict(checkpoint['bnm_sched_state']) + else: + print("WARNING: lr scheduler and bnm scheduler states are not loaded.") + + return model + + +def get_model(cfg): + if cfg.EXP.MODEL_NAME == 'simpleview': + model = models.MVModel( + task=cfg.EXP.TASK, + dataset=cfg.EXP.DATASET, + **cfg.MODEL.MV) + elif cfg.EXP.MODEL_NAME == 'rscnn': + model = models.RSCNN( + task=cfg.EXP.TASK, + dataset=cfg.EXP.DATASET, + **cfg.MODEL.RSCNN) + elif cfg.EXP.MODEL_NAME == 'pointnet2': + model = models.PointNet2( + task=cfg.EXP.TASK, + dataset=cfg.EXP.DATASET, + **cfg.MODEL.PN2) + elif cfg.EXP.MODEL_NAME == 'dgcnn': + model = models.DGCNN( + task=cfg.EXP.TASK, + dataset=cfg.EXP.DATASET) + elif cfg.EXP.MODEL_NAME == 'pointnet': + model = models.PointNet( + task=cfg.EXP.TASK, + dataset=cfg.EXP.DATASET) + else: + assert False + + return model + + +def get_metric_from_perf(task, perf, metric_name): + if task in ['cls', 'cls_trans']: + assert metric_name in ['acc'] + metric = perf[metric_name] + else: + assert False + return metric + + +def get_optimizer(optim_name, tr_arg, model): + if optim_name == 'vanilla': + optimizer = torch.optim.Adam( + model.parameters(), + lr=tr_arg.learning_rate, + weight_decay=tr_arg.l2) + lr_sched = lr_scheduler.ReduceLROnPlateau( + optimizer, + mode='min', + factor=tr_arg.lr_decay_factor, + patience=tr_arg.lr_reduce_patience, + verbose=True, + min_lr=tr_arg.lr_clip) + bnm_sched = None + else: + assert False + + return optimizer, lr_sched, bnm_sched + + +def entry_train(cfg, resume=False, model_path=""): + loader_train = create_dataloader(split='train', cfg=cfg) + loader_valid = create_dataloader(split='valid', cfg=cfg) + loader_test = create_dataloader(split='test', cfg=cfg) + + model = get_model(cfg) + model.to(DEVICE) + print(model) + if torch.cuda.device_count() > 1: + model = nn.DataParallel(model) + + optimizer, lr_sched, bnm_sched = get_optimizer(cfg.EXP.OPTIMIZER, cfg.TRAIN, model) + + if resume: + model = load_model_opt_sched(model, optimizer, lr_sched, bnm_sched, model_path) + else: + assert model_path == "" + + log_dir = f"./runs/{cfg.EXP.EXP_ID}" + if not os.path.exists(log_dir): + os.makedirs(log_dir) + tb = TensorboardManager(log_dir) + track_train = TrackTrain(early_stop_patience=cfg.TRAIN.early_stop) + + for epoch in range(cfg.TRAIN.num_epochs): + print(f'Epoch {epoch}') + + print('Training..') + train_perf, train_loss = train(cfg.EXP.TASK, loader_train, model, optimizer, cfg.EXP.LOSS_NAME, cfg.EXP.DATASET) + pprint.pprint(train_perf, width=80) + tb.update('train', epoch, train_perf) + + if (not cfg.EXP_EXTRA.no_val) and epoch % cfg.EXP_EXTRA.val_eval_freq == 0: + print('\nValidating..') + val_perf = validate(cfg.EXP.TASK, loader_valid, model, cfg.EXP.DATASET) + pprint.pprint(val_perf, width=80) + tb.update('val', epoch, val_perf) + else: + val_perf = defaultdict(float) + + if (not cfg.EXP_EXTRA.no_test) and (epoch % cfg.EXP_EXTRA.test_eval_freq == 0): + print('\nTesting..') + test_perf = validate(cfg.EXP.TASK, loader_test, model, cfg.EXP.DATASET) + pprint.pprint(test_perf, width=80) + tb.update('test', epoch, test_perf) + else: + test_perf = defaultdict(float) + + track_train.record_epoch( + epoch_id=epoch, + train_metric=get_metric_from_perf(cfg.EXP.TASK, train_perf, cfg.EXP.METRIC), + val_metric=get_metric_from_perf(cfg.EXP.TASK, val_perf, cfg.EXP.METRIC), + test_metric=get_metric_from_perf(cfg.EXP.TASK, test_perf, cfg.EXP.METRIC)) + + if (not cfg.EXP_EXTRA.no_val) and track_train.save_model(epoch_id=epoch, split='val'): + print('Saving best model on the validation set') + save_checkpoint('best_val', epoch, model, optimizer, lr_sched, bnm_sched, test_perf, cfg) + + if (not cfg.EXP_EXTRA.no_test) and track_train.save_model(epoch_id=epoch, split='test'): + print('Saving best model on the test set') + save_checkpoint('best_test', epoch, model, optimizer, lr_sched, bnm_sched, test_perf, cfg) + + if (not cfg.EXP_EXTRA.no_val) and track_train.early_stop(epoch_id=epoch): + print(f"Early stopping at {epoch} as val acc did not improve for {cfg.TRAIN.early_stop} epochs.") + break + + if (not (cfg.EXP_EXTRA.save_ckp == 0)) and (epoch % cfg.EXP_EXTRA.save_ckp == 0): + save_checkpoint(f'{epoch}', epoch, model, optimizer, lr_sched, bnm_sched, test_perf, cfg) + + if cfg.EXP.OPTIMIZER == 'vanilla': + assert bnm_sched is None + lr_sched.step(train_loss) + else: + assert False + + print('Saving the final model') + save_checkpoint('final', epoch, model, optimizer, lr_sched, bnm_sched, test_perf, cfg) + + print('\nTesting on the final model..') + last_test_perf = validate(cfg.EXP.TASK, loader_test, model, cfg.EXP.DATASET) + pprint.pprint(last_test_perf, width=80) + + tb.close() + + +def entry_test(cfg, test_or_valid, model_path=""): + split = "test" if test_or_valid else "valid" + loader_test = create_dataloader(split=split, cfg=cfg) + + model = get_model(cfg) + model.to(DEVICE) + print(model) + if torch.cuda.device_count() > 1: + model = nn.DataParallel(model) + + optimizer, lr_sched, bnm_sched = get_optimizer(cfg.EXP.OPTIMIZER, cfg.TRAIN, model) + model = load_model_opt_sched(model, optimizer, lr_sched, bnm_sched, model_path) + model.eval() + + test_perf = validate(cfg.EXP.TASK, loader_test, model, cfg.EXP.DATASET) + pprint.pprint(test_perf, width=80) + return test_perf + + +def entry_test_corrupt(cfg, model_path=""): + model = get_model(cfg) + model.to(DEVICE) + print(model) + if torch.cuda.device_count() > 1: + model = nn.DataParallel(model) + + optimizer, lr_sched, bnm_sched = get_optimizer(cfg.EXP.OPTIMIZER, cfg.TRAIN, model) + model = load_model_opt_sched(model, optimizer, lr_sched, bnm_sched, model_path) + model.eval() + + def test_corrupt(cfg, model, split): + loader_test = create_dataloader(split=split, cfg=cfg) + return validate(cfg.EXP.TASK, loader_test, model, cfg.EXP.DATASET) + + eval_corrupt_wrapper(model, test_corrupt, {'cfg': cfg}) + + +def rscnn_vote_evaluation(cfg, model_path, log_file): + model = get_model(cfg) + checkpoint = torch.load(model_path) + try: + model.load_state_dict(checkpoint['model_state']) + except: + print("WARNING: using dataparallel to load data") + model = nn.DataParallel(model) + model.load_state_dict(checkpoint['model_state']) + print(f"Checkpoint loaded from {model_path}") + model.to(DEVICE) + model.eval() + + assert cfg.EXP.DATASET in ["modelnet40_rscnn"] + loader_test = create_dataloader(split='test', cfg=cfg) + + rscnn_voting_evaluate_cls( + loader=loader_test, + model=model, + data_batch_to_points_target=lambda x: (x['pc'], x['label']), + points_to_inp=lambda x: {'pc': x}, + out_to_prob=lambda x: F.softmax(x['logit'], dim=1), + log_file=log_file + ) + + +def pn2_vote_evaluation(cfg, model_path, log_file): + assert cfg.EXP.DATASET in ["modelnet40_pn2"] + loader_test = create_dataloader(split='test', cfg=cfg) + + model = get_model(cfg) + checkpoint = torch.load(model_path) + try: + model.load_state_dict(checkpoint['model_state']) + except: + print("WARNING: using dataparallel to load data") + model = nn.DataParallel(model) + model.load_state_dict(checkpoint['model_state']) + print(f"Checkpoint loaded from {model_path}") + model.to(DEVICE) + model.eval() + + pn2_vote_evaluate_cls(loader_test, model, log_file) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.set_defaults(entry=lambda cmd_args: parser.print_help()) + parser.add_argument('--entry', type=str, default="train") + parser.add_argument('--exp-config', type=str, default="") + parser.add_argument('--model-path', type=str, default="") + parser.add_argument('--resume', action="store_true", default=False) + + cmd_args = parser.parse_args() + + if cmd_args.entry == "train": + assert not cmd_args.exp_config == "" + if not cmd_args.resume: + assert cmd_args.model_path == "" + + cfg = get_cfg_defaults() + cfg.merge_from_file(cmd_args.exp_config) + if cfg.EXP.EXP_ID == "": + cfg.EXP.EXP_ID = str(datetime.now())[:-7].replace(' ', '-') + cfg.freeze() + print(cfg) + + random.seed(cfg.EXP.SEED) + np.random.seed(cfg.EXP.SEED) + torch.manual_seed(cfg.EXP.SEED) + + entry_train(cfg, cmd_args.resume, cmd_args.model_path) + + elif cmd_args.entry in ["test", "valid"]: + assert not cmd_args.exp_config == "" + assert not cmd_args.model_path == "" + + cfg = get_cfg_defaults() + cfg.merge_from_file(cmd_args.exp_config) + cfg.freeze() + print(cfg) + + random.seed(cfg.EXP.SEED) + np.random.seed(cfg.EXP.SEED) + torch.manual_seed(cfg.EXP.SEED) + + test_or_valid = cmd_args.entry == "test" + entry_test(cfg, test_or_valid, cmd_args.model_path) + + elif cmd_args.entry in ["test_corrupt"]: + assert not cmd_args.exp_config == "" + assert not cmd_args.model_path == "" + + cfg = get_cfg_defaults() + cfg.merge_from_file(cmd_args.exp_config) + cfg.EXP.DATASET = 'modelnet_c' + cfg.freeze() + # print(cfg) + + random.seed(cfg.EXP.SEED) + np.random.seed(cfg.EXP.SEED) + torch.manual_seed(cfg.EXP.SEED) + + entry_test_corrupt(cfg, cmd_args.model_path) + + elif cmd_args.entry in ["rscnn_vote", "pn2_vote"]: + assert not cmd_args.exp_config == "" + assert not cmd_args.model_path == "" + log_file = f"vote_log/{cmd_args.model_path.replace('/', '_')}_{cmd_args.entry.replace('/', '_')}.log" + + cfg = get_cfg_defaults() + cfg.merge_from_file(cmd_args.exp_config) + cfg.freeze() + print(cfg) + + seed = cfg.EXP.SEED + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + + torch.backends.cudnn.enabled = True + torch.backends.cudnn.benchmark = True + torch.backends.cudnn.deterministic = True + + if cmd_args.entry == "rscnn_vote": + rscnn_vote_evaluation(cfg, cmd_args.model_path, log_file) + elif cmd_args.entry == "pn2_vote": + pn2_vote_evaluation(cfg, cmd_args.model_path, log_file) + else: + assert False diff --git a/zoo/SimpleView/models/__init__.py b/zoo/SimpleView/models/__init__.py new file mode 100644 index 0000000..8b17e0d --- /dev/null +++ b/zoo/SimpleView/models/__init__.py @@ -0,0 +1,5 @@ +from .mv import MVModel +from .rscnn import RSCNN +from .pointnet2 import PointNet2 +from .dgcnn import DGCNN +from .pointnet import PointNet diff --git a/zoo/SimpleView/models/dgcnn.py b/zoo/SimpleView/models/dgcnn.py new file mode 100644 index 0000000..a2fa916 --- /dev/null +++ b/zoo/SimpleView/models/dgcnn.py @@ -0,0 +1,39 @@ + +import torch.nn as nn +import torch.nn.functional as F +from dgcnn.pytorch.model import DGCNN as DGCNN_original +from all_utils import DATASET_NUM_CLASS + +class DGCNN(nn.Module): + + def __init__(self, task, dataset): + super().__init__() + self.task = task + self.dataset = dataset + + if task == "cls": + num_classes = DATASET_NUM_CLASS[dataset] + # default arguments + class Args: + def __init__(self): + self.k = 20 + self.emb_dims = 1024 + self.dropout = 0.5 + self.leaky_relu = 1 + args = Args() + self.model = DGCNN_original(args, output_channels=num_classes) + + else: + assert False + + def forward(self, pc, cls=None): + pc = pc.to(next(self.parameters()).device) + pc = pc.permute(0, 2, 1).contiguous() + if self.task == 'cls': + assert cls is None + logit = self.model(pc) + out = {'logit': logit} + else: + assert False + + return out diff --git a/zoo/SimpleView/models/model_utils.py b/zoo/SimpleView/models/model_utils.py new file mode 100644 index 0000000..bcedb6b --- /dev/null +++ b/zoo/SimpleView/models/model_utils.py @@ -0,0 +1,33 @@ +import torch.nn as nn +# from syncbn_pyt.modules.nn import BatchNorm2d as BatchNorm2dSync + +class Squeeze(nn.Module): + def __init__(self): + super().__init__() + + def forward(self, inp): + return inp.squeeze() + +class BatchNormPoint(nn.Module): + def __init__(self, feat_size, sync_bn=False): + super().__init__() + self.feat_size = feat_size + self.sync_bn=sync_bn + if self.sync_bn: + self.bn = BatchNorm2dSync(feat_size) + else: + self.bn = nn.BatchNorm1d(feat_size) + + def forward(self, x): + assert len(x.shape) == 3 + s1, s2, s3 = x.shape[0], x.shape[1], x.shape[2] + assert s3 == self.feat_size + if self.sync_bn: + # 4d input for BatchNorm2dSync + x = x.view(s1 * s2, self.feat_size, 1, 1) + x = self.bn(x) + else: + x = x.view(s1 * s2, self.feat_size) + x = self.bn(x) + return x.view(s1, s2, s3) + diff --git a/zoo/SimpleView/models/mv.py b/zoo/SimpleView/models/mv.py new file mode 100644 index 0000000..17705b7 --- /dev/null +++ b/zoo/SimpleView/models/mv.py @@ -0,0 +1,120 @@ +import torch +import torch.nn as nn +from all_utils import DATASET_NUM_CLASS +from models.model_utils import Squeeze, BatchNormPoint +from models.mv_utils import PCViews + + +class MVModel(nn.Module): + def __init__(self, task, dataset, backbone, + feat_size): + + super().__init__() + assert task == 'cls' + self.task = task + self.num_class = DATASET_NUM_CLASS[dataset] + self.dropout_p = 0.5 + self.feat_size = feat_size + + pc_views = PCViews() + self.num_views = pc_views.num_views + self._get_img = pc_views.get_img + + img_layers, in_features = self.get_img_layers( + backbone, feat_size=feat_size) + self.img_model = nn.Sequential(*img_layers) + + self.final_fc = MVFC( + num_views=self.num_views, + in_features=in_features, + out_features=self.num_class, + dropout_p=self.dropout_p) + + def forward(self, pc): + """ + :param pc: + :return: + """ + + pc = pc.cuda() + img = self.get_img(pc) + feat = self.img_model(img) + logit = self.final_fc(feat) + out = {'logit': logit} + return out + + def get_img(self, pc): + img = self._get_img(pc) + img = torch.tensor(img).float() + img = img.to(next(self.parameters()).device) + assert len(img.shape) == 3 + img = img.unsqueeze(3) + # [num_pc * num_views, 1, RESOLUTION, RESOLUTION] + img = img.permute(0, 3, 1, 2) + + return img + + @staticmethod + def get_img_layers(backbone, feat_size): + """ + Return layers for the image model + """ + + from models.resnet import _resnet, BasicBlock + assert backbone == 'resnet18' + layers = [2, 2, 2, 2] + block = BasicBlock + backbone_mod = _resnet( + arch=None, + block=block, + layers=layers, + pretrained=False, + progress=False, + feature_size=feat_size, + zero_init_residual=True) + + all_layers = [x for x in backbone_mod.children()] + in_features = all_layers[-1].in_features + + # all layers except the final fc layer and the initial conv layers + # WARNING: this is checked only for resnet models + main_layers = all_layers[4:-1] + img_layers = [ + nn.Conv2d(1, feat_size, kernel_size=(3, 3), stride=(1, 1), + padding=(1, 1), bias=False), + nn.BatchNorm2d(feat_size, eps=1e-05, momentum=0.1, + affine=True, track_running_stats=True), + nn.ReLU(inplace=True), + *main_layers, + Squeeze() + ] + + return img_layers, in_features + + +class MVFC(nn.Module): + """ + Final FC layers for the MV model + """ + + def __init__(self, num_views, in_features, out_features, dropout_p): + super().__init__() + self.num_views = num_views + self.in_features = in_features + self.model = nn.Sequential( + BatchNormPoint(in_features), + # dropout before concatenation so that each view drops features independently + nn.Dropout(dropout_p), + nn.Flatten(), + nn.Linear(in_features=in_features * self.num_views, + out_features=in_features), + nn.BatchNorm1d(in_features), + nn.ReLU(), + nn.Dropout(dropout_p), + nn.Linear(in_features=in_features, out_features=out_features, + bias=True)) + + def forward(self, feat): + feat = feat.view((-1, self.num_views, self.in_features)) + out = self.model(feat) + return out diff --git a/zoo/SimpleView/models/mv_utils.py b/zoo/SimpleView/models/mv_utils.py new file mode 100644 index 0000000..7cb7315 --- /dev/null +++ b/zoo/SimpleView/models/mv_utils.py @@ -0,0 +1,292 @@ +import torch.nn as nn +import numpy as np +import torch + +RESOLUTION = 128 +TRANS = -1.4 + +def euler2mat(angle): + """Convert euler angles to rotation matrix. + :param angle: [3] or [b, 3] + :return + rotmat: [3] or [b, 3, 3] + source + https://github.com/ClementPinard/SfmLearner-Pytorch/blob/master/inverse_warp.py + """ + + if len(angle.size()) == 1: + x, y, z = angle[0], angle[1], angle[2] + _dim = 0 + _view = [3, 3] + elif len(angle.size()) == 2: + b, _ = angle.size() + x, y, z = angle[:, 0], angle[:, 1], angle[:, 2] + _dim = 1 + _view = [b, 3, 3] + + else: + assert False + + cosz = torch.cos(z) + sinz = torch.sin(z) + + # zero = torch.zeros([b], requires_grad=False, device=angle.device)[0] + # one = torch.ones([b], requires_grad=False, device=angle.device)[0] + zero = z.detach()*0 + one = zero.detach()+1 + zmat = torch.stack([cosz, -sinz, zero, + sinz, cosz, zero, + zero, zero, one], dim=_dim).reshape(_view) + + cosy = torch.cos(y) + siny = torch.sin(y) + + ymat = torch.stack([cosy, zero, siny, + zero, one, zero, + -siny, zero, cosy], dim=_dim).reshape(_view) + + cosx = torch.cos(x) + sinx = torch.sin(x) + + xmat = torch.stack([one, zero, zero, + zero, cosx, -sinx, + zero, sinx, cosx], dim=_dim).reshape(_view) + + rot_mat = xmat @ ymat @ zmat + # print(rot_mat) + return rot_mat + + +def distribute(depth, _x, _y, size_x, size_y, image_height, image_width): + """ + Distributes the depth associated with each point to the discrete coordinates (image_height, image_width) in a region + of size (size_x, size_y). + :param depth: + :param _x: + :param _y: + :param size_x: + :param size_y: + :param image_height: + :param image_width: + :return: + """ + + assert size_x % 2 == 0 or size_x == 1 + assert size_y % 2 == 0 or size_y == 1 + batch, _ = depth.size() + epsilon = torch.tensor([1e-12], requires_grad=False, device=depth.device) + _i = torch.linspace(-size_x / 2, (size_x / 2) - 1, size_x, requires_grad=False, device=depth.device) + _j = torch.linspace(-size_y / 2, (size_y / 2) - 1, size_y, requires_grad=False, device=depth.device) + + extended_x = _x.unsqueeze(2).repeat([1, 1, size_x]) + _i # [batch, num_points, size_x] + extended_y = _y.unsqueeze(2).repeat([1, 1, size_y]) + _j # [batch, num_points, size_y] + + extended_x = extended_x.unsqueeze(3).repeat([1, 1, 1, size_y]) # [batch, num_points, size_x, size_y] + extended_y = extended_y.unsqueeze(2).repeat([1, 1, size_x, 1]) # [batch, num_points, size_x, size_y] + + extended_x.ceil_() + extended_y.ceil_() + + value = depth.unsqueeze(2).unsqueeze(3).repeat([1, 1, size_x, size_y]) # [batch, num_points, size_x, size_y] + + # all points that will be finally used + masked_points = ((extended_x >= 0) + * (extended_x <= image_height - 1) + * (extended_y >= 0) + * (extended_y <= image_width - 1) + * (value >= 0)) + + true_extended_x = extended_x + true_extended_y = extended_y + + # to prevent error + extended_x = (extended_x % image_height) + extended_y = (extended_y % image_width) + + # [batch, num_points, size_x, size_y] + distance = torch.abs((extended_x - _x.unsqueeze(2).unsqueeze(3)) + * (extended_y - _y.unsqueeze(2).unsqueeze(3))) + weight = (masked_points.float() + * (1 / (value + epsilon))) # [batch, num_points, size_x, size_y] + weighted_value = value * weight + + weight = weight.view([batch, -1]) + weighted_value = weighted_value.view([batch, -1]) + + coordinates = (extended_x.view([batch, -1]) * image_width) + extended_y.view( + [batch, -1]) + coord_max = image_height * image_width + true_coordinates = (true_extended_x.view([batch, -1]) * image_width) + true_extended_y.view( + [batch, -1]) + true_coordinates[~masked_points.view([batch, -1])] = coord_max + weight_scattered = torch.zeros( + [batch, image_width * image_height], + device=depth.device).scatter_add(1, coordinates.long(), weight) + + masked_zero_weight_scattered = (weight_scattered == 0.0) + weight_scattered += masked_zero_weight_scattered.float() + + weighed_value_scattered = torch.zeros( + [batch, image_width * image_height], + device=depth.device).scatter_add(1, coordinates.long(), weighted_value) + + return weighed_value_scattered, weight_scattered + + +def points2depth(points, image_height, image_width, size_x=4, size_y=4): + """ + :param points: [B, num_points, 3] + :param image_width: + :param image_height: + :param size_x: + :param size_y: + :return: + depth_recovered: [B, image_width, image_height] + """ + + epsilon = torch.tensor([1e-12], requires_grad=False, device=points.device) + # epsilon not needed, kept here to ensure exact replication of old version + coord_x = (points[:, :, 0] / (points[:, :, 2] + epsilon)) * (image_width / image_height) # [batch, num_points] + coord_y = (points[:, :, 1] / (points[:, :, 2] + epsilon)) # [batch, num_points] + + batch, total_points, _ = points.size() + depth = points[:, :, 2] # [batch, num_points] + # pdb.set_trace() + _x = ((coord_x + 1) * image_height) / 2 + _y = ((coord_y + 1) * image_width) / 2 + + weighed_value_scattered, weight_scattered = distribute( + depth=depth, + _x=_x, + _y=_y, + size_x=size_x, + size_y=size_y, + image_height=image_height, + image_width=image_width) + + depth_recovered = (weighed_value_scattered / weight_scattered).view([ + batch, image_height, image_width + ]) + + return depth_recovered + + +# source: https://discuss.pytorch.org/t/batched-index-select/9115/6 +def batched_index_select(inp, dim, index): + """ + input: B x * x ... x * + dim: 0 < scalar + index: B x M + """ + views = [inp.shape[0]] + \ + [1 if i != dim else -1 for i in range(1, len(inp.shape))] + expanse = list(inp.shape) + expanse[0] = -1 + expanse[dim] = -1 + index = index.view(views).expand(expanse) + return torch.gather(inp, dim, index) + + +def point_fea_img_fea(point_fea, point_coo, h, w): + """ + each point_coo is of the form (x*w + h). points not in the canvas are removed + :param point_fea: [batch_size, num_points, feat_size] + :param point_coo: [batch_size, num_points] + :return: + """ + assert len(point_fea.shape) == 3 + assert len(point_coo.shape) == 2 + assert point_fea.shape[0:2] == point_coo.shape + + coo_max = ((h - 1) * w) + (w - 1) + mask_point_coo = (point_coo >= 0) * (point_coo <= coo_max) + point_coo *= mask_point_coo.float() + point_fea *= mask_point_coo.float().unsqueeze(-1) + + bs, _, fs = point_fea.shape + point_coo = point_coo.unsqueeze(2).repeat([1, 1, fs]) + img_fea = torch.zeros([bs, h * w, fs], device=point_fea.device).scatter_add(1, point_coo.long(), point_fea) + + return img_fea + + +def distribute_img_fea_points(img_fea, point_coord): + """ + :param img_fea: [B, C, H, W] + :param point_coord: [B, num_points], each coordinate is a scalar value given by (x * W) + y + :return + point_fea: [B, num_points, C], for points with coordinates outside the image, we return 0 + """ + B, C, H, W = list(img_fea.size()) + img_fea = img_fea.permute(0, 2, 3, 1).view([B, H*W, C]) + + coord_max = ((H - 1) * W) + (W - 1) + mask_point_coord = (point_coord >= 0) * (point_coord <= coord_max) + mask_point_coord = mask_point_coord.float() + point_coord = mask_point_coord * point_coord + point_fea = batched_index_select( + inp=img_fea, + dim=1, + index=point_coord.long()) + point_fea = mask_point_coord.unsqueeze(-1) * point_fea + return point_fea + + +class PCViews: + """For creating images from PC based on the view information. Faster as the + repeated operations are done only once whie initialization. + """ + + def __init__(self): + _views = np.asarray([ + [[0 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[1 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[2 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[3 * np.pi / 2, 0, np.pi / 2], [0, 0, TRANS]], + [[0, -np.pi / 2, np.pi / 2], [0, 0, TRANS]], + [[0, np.pi / 2, np.pi / 2], [0, 0, TRANS]]]) + self.num_views = 6 + angle = torch.tensor(_views[:, 0, :]).float().cuda() + self.rot_mat = euler2mat(angle).transpose(1, 2) + self.translation = torch.tensor(_views[:, 1, :]).float().cuda() + self.translation = self.translation.unsqueeze(1) + + def get_img(self, points): + """Get image based on the prespecified specifications. + + Args: + points (torch.tensor): of size [B, _, 3] + Returns: + img (torch.tensor): of size [B * self.num_views, RESOLUTION, + RESOLUTION] + """ + b, _, _ = points.shape + v = self.translation.shape[0] + + _points = self.point_transform( + points=torch.repeat_interleave(points, v, dim=0), + rot_mat=self.rot_mat.repeat(b, 1, 1), + translation=self.translation.repeat(b, 1, 1)) + + img = points2depth( + points=_points, + image_height=RESOLUTION, + image_width=RESOLUTION, + size_x=1, + size_y=1, + ) + return img + + @staticmethod + def point_transform(points, rot_mat, translation): + """ + :param points: [batch, num_points, 3] + :param rot_mat: [batch, 3] + :param translation: [batch, 1, 3] + :return: + """ + rot_mat = rot_mat.to(points.device) + translation = translation.to(points.device) + points = torch.matmul(points, rot_mat) + points = points - translation + return points diff --git a/zoo/SimpleView/models/pointnet.py b/zoo/SimpleView/models/pointnet.py new file mode 100644 index 0000000..6399c0e --- /dev/null +++ b/zoo/SimpleView/models/pointnet.py @@ -0,0 +1,26 @@ +# based on: https://github.com/fxia22/pointnet.pytorch/blob/master/utils/train_classification.py +import torch.nn as nn +from pointnet_pyt.pointnet.model import PointNetCls +from all_utils import DATASET_NUM_CLASS + +class PointNet(nn.Module): + + def __init__(self, dataset, task): + super().__init__() + self.task = task + num_class = DATASET_NUM_CLASS[dataset] + if self.task == 'cls_trans': + self.model = PointNetCls(k=num_class, feature_transform=True) + else: + assert False + + def forward(self, pc, cls=None): + pc = pc.to(next(self.parameters()).device) + pc = pc.transpose(2, 1).float() + if self.task == 'cls_trans': + logit, _, trans_feat = self.model(pc) + else: + assert False + + out = {'logit': logit, 'trans_feat': trans_feat} + return out diff --git a/zoo/SimpleView/models/pointnet2.py b/zoo/SimpleView/models/pointnet2.py new file mode 100644 index 0000000..5c86f40 --- /dev/null +++ b/zoo/SimpleView/models/pointnet2.py @@ -0,0 +1,26 @@ +import torch +import torch.nn as nn +from pointnet2.models.pointnet2_msg_cls import Pointnet2MSG +from all_utils import DATASET_NUM_CLASS + +class PointNet2(nn.Module): + + def __init__(self, task, dataset, version_cls): + super().__init__() + self.task = task + num_class = DATASET_NUM_CLASS[dataset] + if task == 'cls': + self.model = Pointnet2MSG(num_classes=num_class, input_channels=0, use_xyz=True, version=version_cls) + else: + assert False + + def forward(self, pc, normal=None, cls=None): + pc = pc.to(next(self.parameters()).device) + if self.task == 'cls': + assert cls is None + assert normal is None + logit = self.model(pc) + out = {'logit': logit} + else: + assert False + return out diff --git a/zoo/SimpleView/models/resnet.py b/zoo/SimpleView/models/resnet.py new file mode 100644 index 0000000..824d5a2 --- /dev/null +++ b/zoo/SimpleView/models/resnet.py @@ -0,0 +1,342 @@ +import torch +import torch.nn as nn +from torchvision.models.utils import load_state_dict_from_url + + +__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', + 'resnet152', 'resnext50_32x4d', 'resnext101_32x8d', + 'wide_resnet50_2', 'wide_resnet101_2'] + + +model_urls = { + 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', + 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', + 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', + 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', + 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', + 'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth', + 'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth', + 'wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth', + 'wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth', +} + + +def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): + """3x3 convolution with padding""" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=dilation, groups=groups, bias=False, dilation=dilation) + + +def conv1x1(in_planes, out_planes, stride=1): + """1x1 convolution""" + return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, + base_width=64, dilation=1, norm_layer=None): + super(BasicBlock, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + if groups != 1 or base_width != 64: + raise ValueError('BasicBlock only supports groups=1 and base_width=64') + if dilation > 1: + raise NotImplementedError("Dilation > 1 not supported in BasicBlock") + # Both self.conv1 and self.downsample layers downsample the input when stride != 1 + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = norm_layer(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = norm_layer(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + # Bottleneck in torchvision places the stride for downsampling at 3x3 convolution(self.conv2) + # while original implementation places the stride at the first 1x1 convolution(self.conv1) + # according to "Deep residual learning for image recognition"https://arxiv.org/abs/1512.03385. + # This variant is also known as ResNet V1.5 and improves accuracy according to + # https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch. + + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, + base_width=64, dilation=1, norm_layer=None): + super(Bottleneck, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + width = int(planes * (base_width / 64.)) * groups + # Both self.conv2 and self.downsample layers downsample the input when stride != 1 + self.conv1 = conv1x1(inplanes, width) + self.bn1 = norm_layer(width) + self.conv2 = conv3x3(width, width, stride, groups, dilation) + self.bn2 = norm_layer(width) + self.conv3 = conv1x1(width, planes * self.expansion) + self.bn3 = norm_layer(planes * self.expansion) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + + def __init__(self, block, layers, num_classes=1000, zero_init_residual=False, + groups=1, width_per_group=64, replace_stride_with_dilation=None, + norm_layer=None, feature_size=64): + super(ResNet, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + self._norm_layer = norm_layer + + self.inplanes = feature_size + self.dilation = 1 + if replace_stride_with_dilation is None: + # each element in the tuple indicates if we should replace + # the 2x2 stride with a dilated convolution instead + replace_stride_with_dilation = [False, False, False] + if len(replace_stride_with_dilation) != 3: + raise ValueError("replace_stride_with_dilation should be None " + "or a 3-element tuple, got {}".format(replace_stride_with_dilation)) + self.groups = groups + self.base_width = width_per_group + self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3, + bias=False) + self.bn1 = norm_layer(self.inplanes) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = self._make_layer(block, feature_size, layers[0]) + self.layer2 = self._make_layer(block, feature_size * 2, layers[1], stride=2, + dilate=replace_stride_with_dilation[0]) + self.layer3 = self._make_layer(block, feature_size * 4, layers[2], stride=2, + dilate=replace_stride_with_dilation[1]) + self.layer4 = self._make_layer(block, feature_size * 8, layers[3], stride=2, + dilate=replace_stride_with_dilation[2]) + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + self.fc = nn.Linear(feature_size * 8 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + # Zero-initialize the last BN in each residual branch, + # so that the residual branch starts with zeros, and each residual block behaves like an identity. + # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677 + if zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + nn.init.constant_(m.bn3.weight, 0) + elif isinstance(m, BasicBlock): + nn.init.constant_(m.bn2.weight, 0) + + def _make_layer(self, block, planes, blocks, stride=1, dilate=False): + norm_layer = self._norm_layer + downsample = None + previous_dilation = self.dilation + if dilate: + self.dilation *= stride + stride = 1 + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + conv1x1(self.inplanes, planes * block.expansion, stride), + norm_layer(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample, self.groups, + self.base_width, previous_dilation, norm_layer)) + self.inplanes = planes * block.expansion + for _ in range(1, blocks): + layers.append(block(self.inplanes, planes, groups=self.groups, + base_width=self.base_width, dilation=self.dilation, + norm_layer=norm_layer)) + + return nn.Sequential(*layers) + + def _forward_impl(self, x): + # See note [TorchScript super()] + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = torch.flatten(x, 1) + x = self.fc(x) + + return x + + def forward(self, x): + return self._forward_impl(x) + + +def _resnet(arch, block, layers, pretrained, progress, **kwargs): + model = ResNet(block, layers, **kwargs) + if pretrained: + state_dict = load_state_dict_from_url(model_urls[arch], + progress=progress) + model.load_state_dict(state_dict) + return model + + +def resnet18(pretrained=False, progress=True, **kwargs): + r"""ResNet-18 model from + `"Deep Residual Learning for Image Recognition" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet18', BasicBlock, [2, 2, 2, 2], pretrained, progress, + **kwargs) + + +def resnet34(pretrained=False, progress=True, **kwargs): + r"""ResNet-34 model from + `"Deep Residual Learning for Image Recognition" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet34', BasicBlock, [3, 4, 6, 3], pretrained, progress, + **kwargs) + + +def resnet50(pretrained=False, progress=True, **kwargs): + r"""ResNet-50 model from + `"Deep Residual Learning for Image Recognition" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet50', Bottleneck, [3, 4, 6, 3], pretrained, progress, + **kwargs) + + +def resnet101(pretrained=False, progress=True, **kwargs): + r"""ResNet-101 model from + `"Deep Residual Learning for Image Recognition" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet101', Bottleneck, [3, 4, 23, 3], pretrained, progress, + **kwargs) + + +def resnet152(pretrained=False, progress=True, **kwargs): + r"""ResNet-152 model from + `"Deep Residual Learning for Image Recognition" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet152', Bottleneck, [3, 8, 36, 3], pretrained, progress, + **kwargs) + + +def resnext50_32x4d(pretrained=False, progress=True, **kwargs): + r"""ResNeXt-50 32x4d model from + `"Aggregated Residual Transformation for Deep Neural Networks" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['groups'] = 32 + kwargs['width_per_group'] = 4 + return _resnet('resnext50_32x4d', Bottleneck, [3, 4, 6, 3], + pretrained, progress, **kwargs) + + +def resnext101_32x8d(pretrained=False, progress=True, **kwargs): + r"""ResNeXt-101 32x8d model from + `"Aggregated Residual Transformation for Deep Neural Networks" `_ + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['groups'] = 32 + kwargs['width_per_group'] = 8 + return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3], + pretrained, progress, **kwargs) + + +def wide_resnet50_2(pretrained=False, progress=True, **kwargs): + r"""Wide ResNet-50-2 model from + `"Wide Residual Networks" `_ + The model is the same as ResNet except for the bottleneck number of channels + which is twice larger in every block. The number of channels in outer 1x1 + convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 + channels, and in Wide ResNet-50-2 has 2048-1024-2048. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['width_per_group'] = 64 * 2 + return _resnet('wide_resnet50_2', Bottleneck, [3, 4, 6, 3], + pretrained, progress, **kwargs) + + +def wide_resnet101_2(pretrained=False, progress=True, **kwargs): + r"""Wide ResNet-101-2 model from + `"Wide Residual Networks" `_ + The model is the same as ResNet except for the bottleneck number of channels + which is twice larger in every block. The number of channels in outer 1x1 + convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 + channels, and in Wide ResNet-50-2 has 2048-1024-2048. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['width_per_group'] = 64 * 2 + return _resnet('wide_resnet101_2', Bottleneck, [3, 4, 23, 3], + pretrained, progress, **kwargs) \ No newline at end of file diff --git a/zoo/SimpleView/models/rscnn.py b/zoo/SimpleView/models/rscnn.py new file mode 100644 index 0000000..dd0833f --- /dev/null +++ b/zoo/SimpleView/models/rscnn.py @@ -0,0 +1,42 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from rs_cnn.models import RSCNN_MSN_Seg, RSCNN_SSN_Cls +from all_utils import DATASET_NUM_CLASS +# distilled from: +# https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/models/rscnn_ssn_cls.py +# https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/models/rscnn_msn_seg.py +class RSCNN(nn.Module): + + def __init__(self, task, dataset, ssn_or_msn): + """ + Returns a model + :param cls_or_seg: (bool) if true cls else seg + :param ssn_or_msn: (bool) if true ssn else msn + """ + super().__init__() + self.task = task + self.dataset = dataset + num_classes = DATASET_NUM_CLASS[self.dataset] + if self.task == 'cls': + assert ssn_or_msn + # source: https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/cfgs/config_ssn_cls.yaml + # source: https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/train_cls.py#L73 + rscnn_params = { + 'num_classes':num_classes, + 'input_channels': 0, + 'relation_prior': 1, + 'use_xyz': True + } + self.model = RSCNN_SSN_Cls(**rscnn_params) + else: + assert False + + def forward(self, pc, cls=None): + pc = pc.to(next(self.parameters()).device) + if self.task == 'cls': + assert cls is None + out = {'logit': self.model(pc)} + else: + assert False + return out diff --git a/zoo/SimpleView/pc_utils.py b/zoo/SimpleView/pc_utils.py new file mode 100644 index 0000000..e028f2a --- /dev/null +++ b/zoo/SimpleView/pc_utils.py @@ -0,0 +1,71 @@ +import numpy as np +import torch + +# source: https://github.com/charlesq34/pointnet2/blob/74bb67f3702e8aec55a7b8765dd728b18456030c/utils/provider.py#L187-L198 +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +# source: https://github.com/charlesq34/pointnet2/blob/74bb67f3702e8aec55a7b8765dd728b18456030c/utils/provider.py#L32-L50 +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +# source: https://github.com/WangYueFt/dgcnn/blob/master/pytorch/data.py +def translate_pointcloud(pointcloud): + xyz1 = np.random.uniform(low=2./3., high=3./2., size=[3]) + xyz2 = np.random.uniform(low=-0.2, high=0.2, size=[3]) + + translated_pointcloud = np.add(np.multiply(pointcloud, xyz1), xyz2).astype('float32') + return translated_pointcloud + +# based on https://github.com/Yochengliu/Relation-Shape-CNN/blob/master/data/data_utils.py#L81 +class PointcloudScaleAndTranslate(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2., translate_range=0.2, no_z_aug=False): + """ + :param scale_low: + :param scale_high: + :param translate_range: + :param no_z: no translation and scaling along the z axis + """ + self.scale_low = scale_low + self.scale_high = scale_high + self.translate_range = translate_range + self.no_z_aug = no_z_aug + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + if self.no_z_aug: + xyz1[2] = 1.0 + xyz2[2] = 0.0 + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + torch.from_numpy(xyz2).float().cuda() + + return pc \ No newline at end of file diff --git a/zoo/SimpleView/pointnet2_pyt/.gitignore b/zoo/SimpleView/pointnet2_pyt/.gitignore new file mode 100644 index 0000000..e0f749f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/.gitignore @@ -0,0 +1,18 @@ +__pycache__ +*.pth* +.autoenv* +runs +build +checkpoints +*.prof +.lvimrc +.vimtags +.ccls +.ccls-cache/ +dist/ +pointnet2.egg-info/ +*.zip +*.so +.tox/ +.mypy_cache +**/*.pyc diff --git a/zoo/SimpleView/pointnet2_pyt/.pre-commit-config.yaml b/zoo/SimpleView/pointnet2_pyt/.pre-commit-config.yaml new file mode 100644 index 0000000..4136eb5 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/.pre-commit-config.yaml @@ -0,0 +1,24 @@ +exclude: 'build|egg-info|dist' + +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v1.2.3 + hooks: + - id: trailing-whitespace + - id: check-added-large-files + - id: end-of-file-fixer + +- repo: https://github.com/ambv/black + rev: stable + hooks: + - id: black + language_version: python3.6 + +- repo: local + hooks: + - id: clang-format + name: Run clang-format + entry: clang-format --style google -i + types: [text] + files: '.*\.cpp$|.*\.h$|.*\.cu$|.*\.hpp$' + language: system diff --git a/zoo/SimpleView/pointnet2_pyt/.travis.yml b/zoo/SimpleView/pointnet2_pyt/.travis.yml new file mode 100644 index 0000000..2df14e2 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/.travis.yml @@ -0,0 +1,11 @@ +dist: trusty + +language: python + +python: + - "3.6" +install: + - pip install black +script: + - black --check . + - find . -not -path '*/\.*' | grep -E ".*\.cpp$|.*\.h$|.*\.cu$|.*\.hpp$" | xargs -I {} bash -c "diff -u <(cat {}) <(clang-format --style google {})" diff --git a/zoo/SimpleView/pointnet2_pyt/MANIFEST.in b/zoo/SimpleView/pointnet2_pyt/MANIFEST.in new file mode 100644 index 0000000..19e3847 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/MANIFEST.in @@ -0,0 +1 @@ +graft pointnet2/_ext-src/include/ diff --git a/zoo/SimpleView/pointnet2_pyt/README.rst b/zoo/SimpleView/pointnet2_pyt/README.rst new file mode 100644 index 0000000..3bec832 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/README.rst @@ -0,0 +1,97 @@ +Pointnet2/Pointnet++ PyTorch +============================ + +* Implemention of Pointnet2/Pointnet++ written in `PyTorch `_. + +* Supports Multi-GPU via `nn.DataParallel `_. + +* Supports PyTorch version >= 1.0.0. Use `v1.0 `_ + for support of older versions of PyTorch. + + +See the official code release for the paper (in tensorflow), `charlesq34/pointnet2 `_, +for official model definitions and hyper-parameters. + +The custom ops used by Pointnet++ are currently **ONLY** supported on the GPU using CUDA. + +Setup +----- + +* Install ``python`` -- This repo is tested with ``2.7``, ``3.5``, and ``3.6`` + + +* Install dependencies + + :: + + pip install -r requirements.txt + + +* Building `_ext` module + + :: + + python setup.py build_ext --inplace + + +* Optionally, you can also install this repo as a package + + :: + + pip install -e . + + +Example training +------------------ + +Two training examples are provided by ``pointnet2/train/train_sem_seg.py`` and ``pointnet2/train/train_cls.py``. +The datasets for both will be downloaded automatically by default. + + +They can be run via + +:: + + python -m pointnet2.train.train_cls + + python -m pointnet2.train.train_sem_seg + + +Both scripts will print training progress after every epoch to the command line. Use the ``--visdom`` flag to +enable logging to visdom and more detailed logging of training progress. + + +Contributing +------------ + +This repository uses `black `_ for linting and style enforcement on python code. +For c++/cuda code, +`clang-format `_ is used for style. The simplest way to +comply with style is via `pre-commit `_ + +:: + + pip install pre-commit + pre-commit install + + + +Citation +-------- + +:: + + @article{pytorchpointnet++, + Author = {Erik Wijmans}, + Title = {Pointnet++ Pytorch}, + Journal = {https://github.com/erikwijmans/Pointnet2_PyTorch}, + Year = {2018} + } + + @inproceedings{qi2017pointnet++, + title={Pointnet++: Deep hierarchical feature learning on point sets in a metric space}, + author={Qi, Charles Ruizhongtai and Yi, Li and Su, Hao and Guibas, Leonidas J}, + booktitle={Advances in Neural Information Processing Systems}, + pages={5099--5108}, + year={2017} + } diff --git a/zoo/SimpleView/pointnet2_pyt/UNLICENSE b/zoo/SimpleView/pointnet2_pyt/UNLICENSE new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/__init__.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/__init__.py new file mode 100644 index 0000000..3304a4c --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/__init__.py @@ -0,0 +1,19 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) + +__version__ = "2.1.1" + +try: + __POINTNET2_SETUP__ +except NameError: + __POINTNET2_SETUP__ = False + +if not __POINTNET2_SETUP__: + from pointnet2 import utils + from pointnet2 import data + from pointnet2 import models diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/ball_query.h b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/ball_query.h new file mode 100644 index 0000000..1bbc638 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/ball_query.h @@ -0,0 +1,5 @@ +#pragma once +#include + +at::Tensor ball_query(at::Tensor new_xyz, at::Tensor xyz, const float radius, + const int nsample); diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/cuda_utils.h b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/cuda_utils.h new file mode 100644 index 0000000..0fd5b6e --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/cuda_utils.h @@ -0,0 +1,41 @@ +#ifndef _CUDA_UTILS_H +#define _CUDA_UTILS_H + +#include +#include +#include + +#include +#include + +#include + +#define TOTAL_THREADS 512 + +inline int opt_n_threads(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + + return max(min(1 << pow_2, TOTAL_THREADS), 1); +} + +inline dim3 opt_block_config(int x, int y) { + const int x_threads = opt_n_threads(x); + const int y_threads = + max(min(opt_n_threads(y), TOTAL_THREADS / x_threads), 1); + dim3 block_config(x_threads, y_threads, 1); + + return block_config; +} + +#define CUDA_CHECK_ERRORS() \ + do { \ + cudaError_t err = cudaGetLastError(); \ + if (cudaSuccess != err) { \ + fprintf(stderr, "CUDA kernel failed : %s\n%s at L:%d in %s\n", \ + cudaGetErrorString(err), __PRETTY_FUNCTION__, __LINE__, \ + __FILE__); \ + exit(-1); \ + } \ + } while (0) + +#endif diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/group_points.h b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/group_points.h new file mode 100644 index 0000000..ad20cda --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/group_points.h @@ -0,0 +1,5 @@ +#pragma once +#include + +at::Tensor group_points(at::Tensor points, at::Tensor idx); +at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n); diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/interpolate.h b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/interpolate.h new file mode 100644 index 0000000..26b3464 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/interpolate.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +std::vector three_nn(at::Tensor unknowns, at::Tensor knows); +at::Tensor three_interpolate(at::Tensor points, at::Tensor idx, + at::Tensor weight); +at::Tensor three_interpolate_grad(at::Tensor grad_out, at::Tensor idx, + at::Tensor weight, const int m); diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/sampling.h b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/sampling.h new file mode 100644 index 0000000..d795271 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/sampling.h @@ -0,0 +1,6 @@ +#pragma once +#include + +at::Tensor gather_points(at::Tensor points, at::Tensor idx); +at::Tensor gather_points_grad(at::Tensor grad_out, at::Tensor idx, const int n); +at::Tensor furthest_point_sampling(at::Tensor points, const int nsamples); diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/utils.h b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/utils.h new file mode 100644 index 0000000..b9a829f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/include/utils.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include + +#define CHECK_CUDA(x) \ + do { \ + AT_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor"); \ + } while (0) + +#define CHECK_CONTIGUOUS(x) \ + do { \ + AT_CHECK(x.is_contiguous(), #x " must be a contiguous tensor"); \ + } while (0) + +#define CHECK_IS_INT(x) \ + do { \ + AT_CHECK(x.scalar_type() == at::ScalarType::Int, \ + #x " must be an int tensor"); \ + } while (0) + +#define CHECK_IS_FLOAT(x) \ + do { \ + AT_CHECK(x.scalar_type() == at::ScalarType::Float, \ + #x " must be a float tensor"); \ + } while (0) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/ball_query.cpp b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/ball_query.cpp new file mode 100644 index 0000000..2ee391f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/ball_query.cpp @@ -0,0 +1,32 @@ +#include "ball_query.h" +#include "utils.h" + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, int *idx); + +at::Tensor ball_query(at::Tensor new_xyz, at::Tensor xyz, const float radius, + const int nsample) { + CHECK_CONTIGUOUS(new_xyz); + CHECK_CONTIGUOUS(xyz); + CHECK_IS_FLOAT(new_xyz); + CHECK_IS_FLOAT(xyz); + + if (new_xyz.type().is_cuda()) { + CHECK_CUDA(xyz); + } + + at::Tensor idx = + torch::zeros({new_xyz.size(0), new_xyz.size(1), nsample}, + at::device(new_xyz.device()).dtype(at::ScalarType::Int)); + + if (new_xyz.type().is_cuda()) { + query_ball_point_kernel_wrapper(xyz.size(0), xyz.size(1), new_xyz.size(1), + radius, nsample, new_xyz.data(), + xyz.data(), idx.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return idx; +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/ball_query_gpu.cu b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/ball_query_gpu.cu new file mode 100644 index 0000000..559aef9 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/ball_query_gpu.cu @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "cuda_utils.h" + +// input: new_xyz(b, m, 3) xyz(b, n, 3) +// output: idx(b, m, nsample) +__global__ void query_ball_point_kernel(int b, int n, int m, float radius, + int nsample, + const float *__restrict__ new_xyz, + const float *__restrict__ xyz, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + xyz += batch_index * n * 3; + new_xyz += batch_index * m * 3; + idx += m * nsample * batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float radius2 = radius * radius; + for (int j = index; j < m; j += stride) { + float new_x = new_xyz[j * 3 + 0]; + float new_y = new_xyz[j * 3 + 1]; + float new_z = new_xyz[j * 3 + 2]; + for (int k = 0, cnt = 0; k < n && cnt < nsample; ++k) { + float x = xyz[k * 3 + 0]; + float y = xyz[k * 3 + 1]; + float z = xyz[k * 3 + 2]; + float d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 < radius2) { + if (cnt == 0) { + for (int l = 0; l < nsample; ++l) { + idx[j * nsample + l] = k; + } + } + idx[j * nsample + cnt] = k; + ++cnt; + } + } + } +} + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, int *idx) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + query_ball_point_kernel<<>>( + b, n, m, radius, nsample, new_xyz, xyz, idx); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/bindings.cpp b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/bindings.cpp new file mode 100644 index 0000000..d1916ce --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/bindings.cpp @@ -0,0 +1,19 @@ +#include "ball_query.h" +#include "group_points.h" +#include "interpolate.h" +#include "sampling.h" + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("gather_points", &gather_points); + m.def("gather_points_grad", &gather_points_grad); + m.def("furthest_point_sampling", &furthest_point_sampling); + + m.def("three_nn", &three_nn); + m.def("three_interpolate", &three_interpolate); + m.def("three_interpolate_grad", &three_interpolate_grad); + + m.def("ball_query", &ball_query); + + m.def("group_points", &group_points); + m.def("group_points_grad", &group_points_grad); +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/group_points.cpp b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/group_points.cpp new file mode 100644 index 0000000..2868816 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/group_points.cpp @@ -0,0 +1,60 @@ +#include "group_points.h" +#include "utils.h" + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out); + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points); + +at::Tensor group_points(at::Tensor points, at::Tensor idx) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + + if (points.type().is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1), idx.size(2)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.type().is_cuda()) { + group_points_kernel_wrapper(points.size(0), points.size(1), points.size(2), + idx.size(1), idx.size(2), points.data(), + idx.data(), output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} + +at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + + if (grad_out.type().is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), n}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.type().is_cuda()) { + group_points_grad_kernel_wrapper( + grad_out.size(0), grad_out.size(1), n, idx.size(1), idx.size(2), + grad_out.data(), idx.data(), output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/group_points_gpu.cu b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/group_points_gpu.cu new file mode 100644 index 0000000..57c2b1b --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/group_points_gpu.cu @@ -0,0 +1,75 @@ +#include +#include + +#include "cuda_utils.h" + +// input: points(b, c, n) idx(b, npoints, nsample) +// output: out(b, c, npoints, nsample) +__global__ void group_points_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * n * c; + idx += batch_index * npoints * nsample; + out += batch_index * npoints * nsample * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + out[(l * npoints + j) * nsample + k] = points[l * n + ii]; + } + } +} + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + group_points_kernel<<>>( + b, c, n, npoints, nsample, points, idx, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, npoints, nsample), idx(b, npoints, nsample) +// output: grad_points(b, c, n) +__global__ void group_points_grad_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * npoints * nsample * c; + idx += batch_index * npoints * nsample; + grad_points += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + atomicAdd(grad_points + l * n + ii, + grad_out[(l * npoints + j) * nsample + k]); + } + } +} + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + group_points_grad_kernel<<>>( + b, c, n, npoints, nsample, grad_out, idx, grad_points); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/interpolate.cpp b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/interpolate.cpp new file mode 100644 index 0000000..0480f12 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/interpolate.cpp @@ -0,0 +1,99 @@ +#include "interpolate.h" +#include "utils.h" + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx); +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out); +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points); + +std::vector three_nn(at::Tensor unknowns, at::Tensor knows) { + CHECK_CONTIGUOUS(unknowns); + CHECK_CONTIGUOUS(knows); + CHECK_IS_FLOAT(unknowns); + CHECK_IS_FLOAT(knows); + + if (unknowns.type().is_cuda()) { + CHECK_CUDA(knows); + } + + at::Tensor idx = + torch::zeros({unknowns.size(0), unknowns.size(1), 3}, + at::device(unknowns.device()).dtype(at::ScalarType::Int)); + at::Tensor dist2 = + torch::zeros({unknowns.size(0), unknowns.size(1), 3}, + at::device(unknowns.device()).dtype(at::ScalarType::Float)); + + if (unknowns.type().is_cuda()) { + three_nn_kernel_wrapper(unknowns.size(0), unknowns.size(1), knows.size(1), + unknowns.data(), knows.data(), + dist2.data(), idx.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return {dist2, idx}; +} + +at::Tensor three_interpolate(at::Tensor points, at::Tensor idx, + at::Tensor weight) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_CONTIGUOUS(weight); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + CHECK_IS_FLOAT(weight); + + if (points.type().is_cuda()) { + CHECK_CUDA(idx); + CHECK_CUDA(weight); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.type().is_cuda()) { + three_interpolate_kernel_wrapper( + points.size(0), points.size(1), points.size(2), idx.size(1), + points.data(), idx.data(), weight.data(), + output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} +at::Tensor three_interpolate_grad(at::Tensor grad_out, at::Tensor idx, + at::Tensor weight, const int m) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_CONTIGUOUS(weight); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + CHECK_IS_FLOAT(weight); + + if (grad_out.type().is_cuda()) { + CHECK_CUDA(idx); + CHECK_CUDA(weight); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), m}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.type().is_cuda()) { + three_interpolate_grad_kernel_wrapper( + grad_out.size(0), grad_out.size(1), grad_out.size(2), m, + grad_out.data(), idx.data(), weight.data(), + output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/interpolate_gpu.cu b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/interpolate_gpu.cu new file mode 100644 index 0000000..81c5548 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/interpolate_gpu.cu @@ -0,0 +1,154 @@ +#include +#include +#include + +#include "cuda_utils.h" + +// input: unknown(b, n, 3) known(b, m, 3) +// output: dist2(b, n, 3), idx(b, n, 3) +__global__ void three_nn_kernel(int b, int n, int m, + const float *__restrict__ unknown, + const float *__restrict__ known, + float *__restrict__ dist2, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + unknown += batch_index * n * 3; + known += batch_index * m * 3; + dist2 += batch_index * n * 3; + idx += batch_index * n * 3; + + int index = threadIdx.x; + int stride = blockDim.x; + for (int j = index; j < n; j += stride) { + float ux = unknown[j * 3 + 0]; + float uy = unknown[j * 3 + 1]; + float uz = unknown[j * 3 + 2]; + + double best1 = 1e40, best2 = 1e40, best3 = 1e40; + int besti1 = 0, besti2 = 0, besti3 = 0; + for (int k = 0; k < m; ++k) { + float x = known[k * 3 + 0]; + float y = known[k * 3 + 1]; + float z = known[k * 3 + 2]; + float d = (ux - x) * (ux - x) + (uy - y) * (uy - y) + (uz - z) * (uz - z); + if (d < best1) { + best3 = best2; + besti3 = besti2; + best2 = best1; + besti2 = besti1; + best1 = d; + besti1 = k; + } else if (d < best2) { + best3 = best2; + besti3 = besti2; + best2 = d; + besti2 = k; + } else if (d < best3) { + best3 = d; + besti3 = k; + } + } + dist2[j * 3 + 0] = best1; + dist2[j * 3 + 1] = best2; + dist2[j * 3 + 2] = best3; + + idx[j * 3 + 0] = besti1; + idx[j * 3 + 1] = besti2; + idx[j * 3 + 2] = besti3; + } +} + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_nn_kernel<<>>(b, n, m, unknown, known, + dist2, idx); + + CUDA_CHECK_ERRORS(); +} + +// input: points(b, c, m), idx(b, n, 3), weight(b, n, 3) +// output: out(b, c, n) +__global__ void three_interpolate_kernel(int b, int c, int m, int n, + const float *__restrict__ points, + const int *__restrict__ idx, + const float *__restrict__ weight, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * m * c; + + idx += batch_index * n * 3; + weight += batch_index * n * 3; + + out += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + out[i] = points[l * m + i1] * w1 + points[l * m + i2] * w2 + + points[l * m + i3] * w3; + } +} + +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_interpolate_kernel<<>>( + b, c, m, n, points, idx, weight, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, n), idx(b, n, 3), weight(b, n, 3) +// output: grad_points(b, c, m) + +__global__ void three_interpolate_grad_kernel( + int b, int c, int n, int m, const float *__restrict__ grad_out, + const int *__restrict__ idx, const float *__restrict__ weight, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * n * c; + idx += batch_index * n * 3; + weight += batch_index * n * 3; + grad_points += batch_index * m * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + atomicAdd(grad_points + l * m + i1, grad_out[i] * w1); + atomicAdd(grad_points + l * m + i2, grad_out[i] * w2); + atomicAdd(grad_points + l * m + i3, grad_out[i] * w3); + } +} + +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points) { + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + three_interpolate_grad_kernel<<>>( + b, c, n, m, grad_out, idx, weight, grad_points); + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/sampling.cpp b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/sampling.cpp new file mode 100644 index 0000000..7ae3968 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/sampling.cpp @@ -0,0 +1,86 @@ +#include "sampling.h" +#include "utils.h" + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out); +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points); + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs); + +at::Tensor gather_points(at::Tensor points, at::Tensor idx) { + CHECK_CONTIGUOUS(points); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(points); + CHECK_IS_INT(idx); + + if (points.type().is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({points.size(0), points.size(1), idx.size(1)}, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.type().is_cuda()) { + gather_points_kernel_wrapper(points.size(0), points.size(1), points.size(2), + idx.size(1), points.data(), + idx.data(), output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} + +at::Tensor gather_points_grad(at::Tensor grad_out, at::Tensor idx, + const int n) { + CHECK_CONTIGUOUS(grad_out); + CHECK_CONTIGUOUS(idx); + CHECK_IS_FLOAT(grad_out); + CHECK_IS_INT(idx); + + if (grad_out.type().is_cuda()) { + CHECK_CUDA(idx); + } + + at::Tensor output = + torch::zeros({grad_out.size(0), grad_out.size(1), n}, + at::device(grad_out.device()).dtype(at::ScalarType::Float)); + + if (grad_out.type().is_cuda()) { + gather_points_grad_kernel_wrapper(grad_out.size(0), grad_out.size(1), n, + idx.size(1), grad_out.data(), + idx.data(), output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} +at::Tensor furthest_point_sampling(at::Tensor points, const int nsamples) { + CHECK_CONTIGUOUS(points); + CHECK_IS_FLOAT(points); + + at::Tensor output = + torch::zeros({points.size(0), nsamples}, + at::device(points.device()).dtype(at::ScalarType::Int)); + + at::Tensor tmp = + torch::full({points.size(0), points.size(1)}, 1e10, + at::device(points.device()).dtype(at::ScalarType::Float)); + + if (points.type().is_cuda()) { + furthest_point_sampling_kernel_wrapper( + points.size(0), points.size(1), nsamples, points.data(), + tmp.data(), output.data()); + } else { + AT_CHECK(false, "CPU not supported"); + } + + return output; +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/sampling_gpu.cu b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/sampling_gpu.cu new file mode 100644 index 0000000..fc573f0 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/_ext-src/src/sampling_gpu.cu @@ -0,0 +1,229 @@ +#include +#include + +#include "cuda_utils.h" + +// input: points(b, c, n) idx(b, m) +// output: out(b, c, m) +__global__ void gather_points_kernel(int b, int c, int n, int m, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + out[(i * c + l) * m + j] = points[(i * c + l) * n + a]; + } + } + } +} + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out) { + gather_points_kernel<<>>(b, c, n, npoints, + points, idx, out); + + CUDA_CHECK_ERRORS(); +} + +// input: grad_out(b, c, m) idx(b, m) +// output: grad_points(b, c, n) +__global__ void gather_points_grad_kernel(int b, int c, int n, int m, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + atomicAdd(grad_points + (i * c + l) * n + a, + grad_out[(i * c + l) * m + j]); + } + } + } +} + +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points) { + gather_points_grad_kernel<<>>( + b, c, n, npoints, grad_out, idx, grad_points); + + CUDA_CHECK_ERRORS(); +} + +__device__ void __update(float *__restrict__ dists, int *__restrict__ dists_i, + int idx1, int idx2) { + const float v1 = dists[idx1], v2 = dists[idx2]; + const int i1 = dists_i[idx1], i2 = dists_i[idx2]; + dists[idx1] = max(v1, v2); + dists_i[idx1] = v2 > v1 ? i2 : i1; +} + +// Input dataset: (b, n, 3), tmp: (b, n) +// Ouput idxs (b, m) +template +__global__ void furthest_point_sampling_kernel( + int b, int n, int m, const float *__restrict__ dataset, + float *__restrict__ temp, int *__restrict__ idxs) { + if (m <= 0) return; + __shared__ float dists[block_size]; + __shared__ int dists_i[block_size]; + + int batch_index = blockIdx.x; + dataset += batch_index * n * 3; + temp += batch_index * n; + idxs += batch_index * m; + + int tid = threadIdx.x; + const int stride = block_size; + + int old = 0; + if (threadIdx.x == 0) idxs[0] = old; + + __syncthreads(); + for (int j = 1; j < m; j++) { + int besti = 0; + float best = -1; + float x1 = dataset[old * 3 + 0]; + float y1 = dataset[old * 3 + 1]; + float z1 = dataset[old * 3 + 2]; + for (int k = tid; k < n; k += stride) { + float x2, y2, z2; + x2 = dataset[k * 3 + 0]; + y2 = dataset[k * 3 + 1]; + z2 = dataset[k * 3 + 2]; + float mag = (x2 * x2) + (y2 * y2) + (z2 * z2); + if (mag <= 1e-3) continue; + + float d = + (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1); + + float d2 = min(d, temp[k]); + temp[k] = d2; + besti = d2 > best ? k : besti; + best = d2 > best ? d2 : best; + } + dists[tid] = best; + dists_i[tid] = besti; + __syncthreads(); + + if (block_size >= 512) { + if (tid < 256) { + __update(dists, dists_i, tid, tid + 256); + } + __syncthreads(); + } + if (block_size >= 256) { + if (tid < 128) { + __update(dists, dists_i, tid, tid + 128); + } + __syncthreads(); + } + if (block_size >= 128) { + if (tid < 64) { + __update(dists, dists_i, tid, tid + 64); + } + __syncthreads(); + } + if (block_size >= 64) { + if (tid < 32) { + __update(dists, dists_i, tid, tid + 32); + } + __syncthreads(); + } + if (block_size >= 32) { + if (tid < 16) { + __update(dists, dists_i, tid, tid + 16); + } + __syncthreads(); + } + if (block_size >= 16) { + if (tid < 8) { + __update(dists, dists_i, tid, tid + 8); + } + __syncthreads(); + } + if (block_size >= 8) { + if (tid < 4) { + __update(dists, dists_i, tid, tid + 4); + } + __syncthreads(); + } + if (block_size >= 4) { + if (tid < 2) { + __update(dists, dists_i, tid, tid + 2); + } + __syncthreads(); + } + if (block_size >= 2) { + if (tid < 1) { + __update(dists, dists_i, tid, tid + 1); + } + __syncthreads(); + } + + old = dists_i[0]; + if (tid == 0) idxs[j] = old; + } +} + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs) { + unsigned int n_threads = opt_n_threads(n); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + switch (n_threads) { + case 512: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 256: + furthest_point_sampling_kernel<256> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 128: + furthest_point_sampling_kernel<128> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 64: + furthest_point_sampling_kernel<64> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 32: + furthest_point_sampling_kernel<32> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 16: + furthest_point_sampling_kernel<16> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 8: + furthest_point_sampling_kernel<8> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 4: + furthest_point_sampling_kernel<4> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 2: + furthest_point_sampling_kernel<2> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 1: + furthest_point_sampling_kernel<1> + <<>>(b, n, m, dataset, temp, idxs); + break; + default: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + } + + CUDA_CHECK_ERRORS(); +} diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/data/.gitignore b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/.gitignore new file mode 100644 index 0000000..5fe8539 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/.gitignore @@ -0,0 +1,2 @@ +indoor3d_sem_seg_hdf5_data +modelnet40_ply_hdf5_2048 diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/data/Indoor3DSemSegLoader.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/Indoor3DSemSegLoader.py new file mode 100644 index 0000000..44ae1b6 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/Indoor3DSemSegLoader.py @@ -0,0 +1,115 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.utils.data as data +import numpy as np +import os +import h5py +import subprocess +import shlex + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + + +def _get_data_files(list_filename): + with open(list_filename) as f: + return [line.rstrip() for line in f] + + +def _load_data_file(name): + f = h5py.File(name) + data = f["data"][:] + label = f["label"][:] + return data, label + + +class Indoor3DSemSeg(data.Dataset): + def __init__(self, num_points, train=True, download=True, data_precent=1.0): + super().__init__() + self.data_precent = data_precent + self.folder = "indoor3d_sem_seg_hdf5_data" + self.data_dir = os.path.join(BASE_DIR, self.folder) + self.url = ( + "https://shapenet.cs.stanford.edu/media/indoor3d_sem_seg_hdf5_data.zip" + ) + + if download and not os.path.exists(self.data_dir): + zipfile = os.path.join(BASE_DIR, os.path.basename(self.url)) + subprocess.check_call( + shlex.split("curl {} -o {}".format(self.url, zipfile)) + ) + + subprocess.check_call( + shlex.split("unzip {} -d {}".format(zipfile, BASE_DIR)) + ) + + subprocess.check_call(shlex.split("rm {}".format(zipfile))) + + self.train, self.num_points = train, num_points + + all_files = _get_data_files(os.path.join(self.data_dir, "all_files.txt")) + room_filelist = _get_data_files( + os.path.join(self.data_dir, "room_filelist.txt") + ) + + data_batchlist, label_batchlist = [], [] + for f in all_files: + data, label = _load_data_file(os.path.join(BASE_DIR, f)) + data_batchlist.append(data) + label_batchlist.append(label) + + data_batches = np.concatenate(data_batchlist, 0) + labels_batches = np.concatenate(label_batchlist, 0) + + test_area = "Area_5" + train_idxs, test_idxs = [], [] + for i, room_name in enumerate(room_filelist): + if test_area in room_name: + test_idxs.append(i) + else: + train_idxs.append(i) + + if self.train: + self.points = data_batches[train_idxs, ...] + self.labels = labels_batches[train_idxs, ...] + else: + self.points = data_batches[test_idxs, ...] + self.labels = labels_batches[test_idxs, ...] + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.num_points) + np.random.shuffle(pt_idxs) + + current_points = torch.from_numpy(self.points[idx, pt_idxs].copy()).type( + torch.FloatTensor + ) + current_labels = torch.from_numpy(self.labels[idx, pt_idxs].copy()).type( + torch.LongTensor + ) + + return current_points, current_labels + + def __len__(self): + return int(self.points.shape[0] * self.data_precent) + + def set_num_points(self, pts): + self.num_points = pts + + def randomize(self): + pass + + +if __name__ == "__main__": + dset = Indoor3DSemSeg(16, "./", train=True) + print(dset[0]) + print(len(dset)) + dloader = torch.utils.data.DataLoader(dset, batch_size=32, shuffle=True) + for i, data in enumerate(dloader, 0): + inputs, labels = data + if i == len(dloader) - 1: + print(inputs.size()) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/data/ModelNet40Loader.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/ModelNet40Loader.py new file mode 100644 index 0000000..8e3985b --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/ModelNet40Loader.py @@ -0,0 +1,108 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.utils.data as data +import numpy as np +import os +import h5py +import subprocess +import shlex + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + + +def _get_data_files(list_filename): + with open(list_filename) as f: + return [line.rstrip()[5:] for line in f] + + +def _load_data_file(name): + f = h5py.File(name) + data = f["data"][:] + label = f["label"][:] + return data, label + + +class ModelNet40Cls(data.Dataset): + def __init__(self, num_points, transforms=None, train=True, download=True): + super().__init__() + + self.transforms = transforms + + self.folder = "modelnet40_ply_hdf5_2048" + self.data_dir = os.path.join(BASE_DIR, self.folder) + self.url = "https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip" + + if download and not os.path.exists(self.data_dir): + zipfile = os.path.join(BASE_DIR, os.path.basename(self.url)) + subprocess.check_call( + shlex.split("curl {} -o {}".format(self.url, zipfile)) + ) + + subprocess.check_call( + shlex.split("unzip {} -d {}".format(zipfile, BASE_DIR)) + ) + + subprocess.check_call(shlex.split("rm {}".format(zipfile))) + + self.train = train + if self.train: + self.files = _get_data_files(os.path.join(self.data_dir, "train_files.txt")) + else: + self.files = _get_data_files(os.path.join(self.data_dir, "test_files.txt")) + + point_list, label_list = [], [] + for f in self.files: + points, labels = _load_data_file(os.path.join(BASE_DIR, f)) + point_list.append(points) + label_list.append(labels) + + self.points = np.concatenate(point_list, 0) + self.labels = np.concatenate(label_list, 0) + self.set_num_points(num_points) + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.num_points) + np.random.shuffle(pt_idxs) + + current_points = self.points[idx, pt_idxs].copy() + label = torch.from_numpy(self.labels[idx]).type(torch.LongTensor) + + if self.transforms is not None: + current_points = self.transforms(current_points) + + return current_points, label + + def __len__(self): + return self.points.shape[0] + + def set_num_points(self, pts): + self.num_points = min(self.points.shape[1], pts) + + def randomize(self): + pass + + +if __name__ == "__main__": + from torchvision import transforms + import data_utils as d_utils + + transforms = transforms.Compose( + [ + d_utils.PointcloudToTensor(), + d_utils.PointcloudRotate(axis=np.array([1, 0, 0])), + d_utils.PointcloudScale(), + d_utils.PointcloudTranslate(), + d_utils.PointcloudJitter(), + ] + ) + dset = ModelNet40Cls(16, train=True, transforms=transforms) + print(dset[0][0]) + print(dset[0][1]) + print(len(dset)) + dloader = torch.utils.data.DataLoader(dset, batch_size=32, shuffle=True) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/data/__init__.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/__init__.py new file mode 100644 index 0000000..c9600e7 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/__init__.py @@ -0,0 +1,9 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from .ModelNet40Loader import ModelNet40Cls +from .Indoor3DSemSegLoader import Indoor3DSemSeg diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/data/data_utils.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/data_utils.py new file mode 100644 index 0000000..aa80897 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/data/data_utils.py @@ -0,0 +1,148 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import numpy as np + + +def angle_axis(angle, axis): + # type: (float, np.ndarray) -> float + r"""Returns a 4x4 rotation matrix that performs a rotation around axis by angle + + Parameters + ---------- + angle : float + Angle to rotate by + axis: np.ndarray + Axis to rotate about + + Returns + ------- + torch.Tensor + 3x3 rotation matrix + """ + u = axis / np.linalg.norm(axis) + cosval, sinval = np.cos(angle), np.sin(angle) + + # yapf: disable + cross_prod_mat = np.array([[0.0, -u[2], u[1]], + [u[2], 0.0, -u[0]], + [-u[1], u[0], 0.0]]) + + R = torch.from_numpy( + cosval * np.eye(3) + + sinval * cross_prod_mat + + (1.0 - cosval) * np.outer(u, u) + ) + # yapf: enable + return R.float() + + +class PointcloudScale(object): + def __init__(self, lo=0.8, hi=1.25): + self.lo, self.hi = lo, hi + + def __call__(self, points): + scaler = np.random.uniform(self.lo, self.hi) + points[:, 0:3] *= scaler + return points + + +class PointcloudRotate(object): + def __init__(self, axis=np.array([0.0, 1.0, 0.0])): + self.axis = axis + + def __call__(self, points): + rotation_angle = np.random.uniform() * 2 * np.pi + rotation_matrix = angle_axis(rotation_angle, self.axis) + + normals = points.size(1) > 3 + if not normals: + return torch.matmul(points, rotation_matrix.t()) + else: + pc_xyz = points[:, 0:3] + pc_normals = points[:, 3:] + points[:, 0:3] = torch.matmul(pc_xyz, rotation_matrix.t()) + points[:, 3:] = torch.matmul(pc_normals, rotation_matrix.t()) + + return points + + +class PointcloudRotatePerturbation(object): + def __init__(self, angle_sigma=0.06, angle_clip=0.18): + self.angle_sigma, self.angle_clip = angle_sigma, angle_clip + + def _get_angles(self): + angles = np.clip( + self.angle_sigma * np.random.randn(3), -self.angle_clip, self.angle_clip + ) + + return angles + + def __call__(self, points): + angles = self._get_angles() + Rx = angle_axis(angles[0], np.array([1.0, 0.0, 0.0])) + Ry = angle_axis(angles[1], np.array([0.0, 1.0, 0.0])) + Rz = angle_axis(angles[2], np.array([0.0, 0.0, 1.0])) + + rotation_matrix = torch.matmul(torch.matmul(Rz, Ry), Rx) + + normals = points.size(1) > 3 + if not normals: + return torch.matmul(points, rotation_matrix.t()) + else: + pc_xyz = points[:, 0:3] + pc_normals = points[:, 3:] + points[:, 0:3] = torch.matmul(pc_xyz, rotation_matrix.t()) + points[:, 3:] = torch.matmul(pc_normals, rotation_matrix.t()) + + return points + + +class PointcloudJitter(object): + def __init__(self, std=0.01, clip=0.05): + self.std, self.clip = std, clip + + def __call__(self, points): + jittered_data = ( + points.new(points.size(0), 3) + .normal_(mean=0.0, std=self.std) + .clamp_(-self.clip, self.clip) + ) + points[:, 0:3] += jittered_data + return points + + +class PointcloudTranslate(object): + def __init__(self, translate_range=0.1): + self.translate_range = translate_range + + def __call__(self, points): + translation = np.random.uniform(-self.translate_range, self.translate_range) + points[:, 0:3] += translation + return points + + +class PointcloudToTensor(object): + def __call__(self, points): + return torch.from_numpy(points).float() + + +class PointcloudRandomInputDropout(object): + def __init__(self, max_dropout_ratio=0.875): + assert max_dropout_ratio >= 0 and max_dropout_ratio < 1 + self.max_dropout_ratio = max_dropout_ratio + + def __call__(self, points): + pc = points.numpy() + + dropout_ratio = np.random.random() * self.max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((pc.shape[0])) <= dropout_ratio)[0] + if len(drop_idx) > 0: + pc[drop_idx] = pc[0] # set to the first point + + return torch.from_numpy(pc).float() diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/models/__init__.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/__init__.py new file mode 100644 index 0000000..dfe197f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/__init__.py @@ -0,0 +1,11 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from .pointnet2_msg_sem import Pointnet2MSG as Pointnet2SemMSG +from .pointnet2_ssg_sem import Pointnet2SSG as Pointnet2SemSSG +from .pointnet2_msg_cls import Pointnet2MSG as Pointnet2ClsMSG +from .pointnet2_ssg_cls import Pointnet2SSG as Pointnet2ClsSSG diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_msg_cls.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_msg_cls.py new file mode 100644 index 0000000..bc7c6d9 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_msg_cls.py @@ -0,0 +1,232 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.nn as nn +import etw_pytorch_utils as pt_utils +from collections import namedtuple + +from pointnet2.utils.pointnet2_modules import PointnetSAModuleMSG, PointnetSAModule + + +def model_fn_decorator(criterion): + ModelReturn = namedtuple("ModelReturn", ["preds", "loss", "acc"]) + + def model_fn(model, data, epoch=0, eval=False): + with torch.set_grad_enabled(not eval): + inputs, labels = data + inputs = inputs.to("cuda", non_blocking=True) + labels = labels.to("cuda", non_blocking=True) + + preds = model(inputs) + labels = labels.view(-1) + loss = criterion(preds, labels) + + _, classes = torch.max(preds, -1) + acc = (classes == labels).float().sum() / labels.numel() + + return ModelReturn(preds, loss, {"acc": acc.item(), "loss": loss.item()}) + + return model_fn + + +class Pointnet2MSG(nn.Module): + r""" + PointNet2 with multi-scale grouping + Classification network + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier + input_channels: int = 3 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=3, use_xyz=True, version=1.0): + super(Pointnet2MSG, self).__init__() + + self.SA_modules = nn.ModuleList() + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=512, + radii=[0.1, 0.2, 0.4], + nsamples=[16, 32, 128], + mlps=[ + [input_channels, 32, 32, 64], + [input_channels, 64, 64, 128], + [input_channels, 64, 96, 128], + ], + use_xyz=use_xyz, + ) + ) + + input_channels = 64 + 128 + 128 + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=128, + radii=[0.2, 0.4, 0.8], + nsamples=[32, 64, 128], + mlps=[ + [input_channels, 64, 64, 128], + [input_channels, 128, 128, 256], + [input_channels, 128, 128, 256], + ], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule(mlp=[128 + 256 + 256, 256, 512, 1024], use_xyz=use_xyz) + ) + + if version == 1.0: + self.FC_layer = ( + pt_utils.Seq(1024) + .fc(512, bn=True) + # potentially different for original one + # https://github.com/charlesq34/pointnet2/blob/master/models/pointnet2_cls_msg.py#L34 + .dropout(0.5) + .fc(256, bn=True) + # potentially different for original one + # https://github.com/charlesq34/pointnet2/blob/master/models/pointnet2_cls_msg.py#L34 + .dropout(0.5) + .fc(num_classes, activation=None) + ) + elif version == 2.0: + self.FC_layer = ( + pt_utils.Seq(1024) + .fc(512, bn=True) + # potentially different for original one + # https://github.com/charlesq34/pointnet2/blob/master/models/pointnet2_cls_msg.py#L34 + .dropout(0.6) + .fc(256, bn=True) + # potentially different for original one + # https://github.com/charlesq34/pointnet2/blob/master/models/pointnet2_cls_msg.py#L34 + .dropout(0.6) + .fc(num_classes, activation=None) + ) + else: + assert False + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None + + return xyz, features + + def forward(self, pointcloud): + # type: (Pointnet2MSG, torch.cuda.FloatTensor) -> pt_utils.Seq + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + + for module in self.SA_modules: + xyz, features = module(xyz, features) + + return self.FC_layer(features.squeeze(-1)) + + +# arguments found out based on https://github.com/charlesq34/pointnet2/commit/74c52aa30458d1695e093a179cd335b7885b3244 +# commit +class Pointnet2MSG5K(nn.Module): + r""" + PointNet2 with multi-scale grouping + Classification network + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier + input_channels: int = 3 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=3, use_xyz=True): + super(Pointnet2MSG5K, self).__init__() + + self.SA_modules = nn.ModuleList() + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=512, + radii=[0.1, 0.2, 0.4], + nsamples=[32,64,128], + mlps=[ + [input_channels, 32, 32, 64], + [input_channels, 64, 64, 128], + [input_channels, 64, 96, 128], + ], + use_xyz=use_xyz, + ) + ) + + input_channels = 64 + 128 + 128 + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=128, + radii=[0.2, 0.4, 0.8], + nsamples=[64,64,128], + mlps=[ + [input_channels, 64, 64, 128], + [input_channels, 128, 128, 256], + [input_channels, 128, 128, 256], + ], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule(mlp=[128 + 256 + 256, 256, 512, 1024], use_xyz=use_xyz) + ) + + self.FC_layer = ( + pt_utils.Seq(1024) + .fc(512, bn=True) + .dropout(0.5) + .fc(256, bn=True) + .dropout(0.5) + .fc(num_classes, activation=None) + ) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None + + return xyz, features + + def forward(self, pointcloud): + # type: (Pointnet2MSG, torch.cuda.FloatTensor) -> pt_utils.Seq + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + + for module in self.SA_modules: + xyz, features = module(xyz, features) + + return self.FC_layer(features.squeeze(-1)) \ No newline at end of file diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_msg_sem.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_msg_sem.py new file mode 100644 index 0000000..df97b39 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_msg_sem.py @@ -0,0 +1,190 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.nn as nn +import etw_pytorch_utils as pt_utils +from collections import namedtuple + +from pointnet2.utils.pointnet2_modules import PointnetFPModule, PointnetSAModuleMSG + + +def model_fn_decorator(criterion): + ModelReturn = namedtuple("ModelReturn", ["preds", "loss", "acc"]) + + def model_fn(model, data, epoch=0, eval=False): + with torch.set_grad_enabled(not eval): + inputs, labels = data + inputs = inputs.to("cuda", non_blocking=True) + labels = labels.to("cuda", non_blocking=True) + + preds = model(inputs) + loss = criterion(preds.view(labels.numel(), -1), labels.view(-1)) + + _, classes = torch.max(preds, -1) + acc = (classes == labels).float().sum() / labels.numel() + + return ModelReturn(preds, loss, {"acc": acc.item(), "loss": loss.item()}) + + return model_fn + + +class Pointnet2MSG(nn.Module): + r""" + PointNet2 with multi-scale grouping + Semantic segmentation network that uses feature propogation layers + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + input_channels: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=6, use_xyz=True): + super(Pointnet2MSG, self).__init__() + + self.SA_modules = nn.ModuleList() + c_in = input_channels + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=1024, + radii=[0.05, 0.1], + nsamples=[16, 32], + mlps=[[c_in, 16, 16, 32], [c_in, 32, 32, 64]], + use_xyz=use_xyz, + ) + ) + c_out_0 = 32 + 64 + + c_in = c_out_0 + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=256, + radii=[0.1, 0.2], + nsamples=[16, 32], + mlps=[[c_in, 64, 64, 128], [c_in, 64, 96, 128]], + use_xyz=use_xyz, + ) + ) + c_out_1 = 128 + 128 + + c_in = c_out_1 + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=64, + radii=[0.2, 0.4], + nsamples=[16, 32], + mlps=[[c_in, 128, 196, 256], [c_in, 128, 196, 256]], + use_xyz=use_xyz, + ) + ) + c_out_2 = 256 + 256 + + c_in = c_out_2 + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=16, + radii=[0.4, 0.8], + nsamples=[16, 32], + mlps=[[c_in, 256, 256, 512], [c_in, 256, 384, 512]], + use_xyz=use_xyz, + ) + ) + c_out_3 = 512 + 512 + + self.FP_modules = nn.ModuleList() + self.FP_modules.append(PointnetFPModule(mlp=[256 + input_channels, 128, 128])) + self.FP_modules.append(PointnetFPModule(mlp=[512 + c_out_0, 256, 256])) + self.FP_modules.append(PointnetFPModule(mlp=[512 + c_out_1, 512, 512])) + self.FP_modules.append(PointnetFPModule(mlp=[c_out_3 + c_out_2, 512, 512])) + + self.FC_layer = ( + pt_utils.Seq(128) + .conv1d(128, bn=True) + .dropout() + .conv1d(num_classes, activation=None) + ) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None + + return xyz, features + + def forward(self, pointcloud): + # type: (Pointnet2MSG, torch.cuda.FloatTensor) -> pt_utils.Seq + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + + l_xyz, l_features = [xyz], [features] + for i in range(len(self.SA_modules)): + li_xyz, li_features = self.SA_modules[i](l_xyz[i], l_features[i]) + l_xyz.append(li_xyz) + l_features.append(li_features) + + for i in range(-1, -(len(self.FP_modules) + 1), -1): + l_features[i - 1] = self.FP_modules[i]( + l_xyz[i - 1], l_xyz[i], l_features[i - 1], l_features[i] + ) + + return self.FC_layer(l_features[0]).transpose(1, 2).contiguous() + + +if __name__ == "__main__": + from torch.autograd import Variable + import numpy as np + import torch.optim as optim + + B = 2 + N = 32 + inputs = torch.randn(B, N, 6).cuda() + labels = torch.from_numpy(np.random.randint(0, 3, size=B * N)).view(B, N).cuda() + model = Pointnet2MSG(3, input_channels=3) + model.cuda() + + optimizer = optim.Adam(model.parameters(), lr=1e-2) + + print("Testing with xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.data[0]) + optimizer.step() + + # with use_xyz=False + inputs = torch.randn(B, N, 6).cuda() + labels = torch.from_numpy(np.random.randint(0, 3, size=B * N)).view(B, N).cuda() + model = Pointnet2MSG(3, input_channels=3, use_xyz=False) + model.cuda() + + optimizer = optim.Adam(model.parameters(), lr=1e-2) + + print("Testing without xyz") + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + print(loss.data[0]) + optimizer.step() diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_ssg_cls.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_ssg_cls.py new file mode 100644 index 0000000..51f3a4f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_ssg_cls.py @@ -0,0 +1,112 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.nn as nn +import etw_pytorch_utils as pt_utils +from collections import namedtuple + +from pointnet2.utils.pointnet2_modules import PointnetSAModule + + +def model_fn_decorator(criterion): + ModelReturn = namedtuple("ModelReturn", ["preds", "loss", "acc"]) + + def model_fn(model, data, epoch=0, eval=False): + with torch.set_grad_enabled(not eval): + inputs, labels = data + inputs = inputs.to("cuda", non_blocking=True) + labels = labels.to("cuda", non_blocking=True) + + preds = model(inputs) + labels = labels.view(-1) + loss = criterion(preds, labels) + + _, classes = torch.max(preds, -1) + acc = (classes == labels).float().sum() / labels.numel() + + return ModelReturn(preds, loss, {"acc": acc.item(), "loss": loss.item()}) + + return model_fn + + +class Pointnet2SSG(nn.Module): + r""" + PointNet2 with single-scale grouping + Classification network + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier + input_channels: int = 3 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=3, use_xyz=True): + super(Pointnet2SSG, self).__init__() + + self.SA_modules = nn.ModuleList() + self.SA_modules.append( + PointnetSAModule( + npoint=512, + radius=0.2, + nsample=64, + mlp=[input_channels, 64, 64, 128], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule( + npoint=128, + radius=0.4, + nsample=64, + mlp=[128, 128, 128, 256], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule(mlp=[256, 256, 512, 1024], use_xyz=use_xyz) + ) + + self.FC_layer = ( + pt_utils.Seq(1024) + .fc(512, bn=True) + .dropout(0.5) + .fc(256, bn=True) + .dropout(0.5) + .fc(num_classes, activation=None) + ) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None + + return xyz, features + + def forward(self, pointcloud): + # type: (Pointnet2SSG, torch.cuda.FloatTensor) -> pt_utils.Seq + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + + for module in self.SA_modules: + xyz, features = module(xyz, features) + + return self.FC_layer(features.squeeze(-1)) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_ssg_sem.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_ssg_sem.py new file mode 100644 index 0000000..738e88b --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/models/pointnet2_ssg_sem.py @@ -0,0 +1,140 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.nn as nn +import etw_pytorch_utils as pt_utils +from collections import namedtuple + +from pointnet2.utils.pointnet2_modules import PointnetSAModule, PointnetFPModule + + +def model_fn_decorator(criterion): + ModelReturn = namedtuple("ModelReturn", ["preds", "loss", "acc"]) + + def model_fn(model, data, epoch=0, eval=False): + with torch.set_grad_enabled(not eval): + inputs, labels = data + inputs = inputs.to("cuda", non_blocking=True) + labels = labels.to("cuda", non_blocking=True) + + preds = model(inputs) + loss = criterion(preds.view(labels.numel(), -1), labels.view(-1)) + + _, classes = torch.max(preds, -1) + acc = (classes == labels).float().sum() / labels.numel() + + return ModelReturn(preds, loss, {"acc": acc.item(), "loss": loss.item()}) + + return model_fn + + +class Pointnet2SSG(nn.Module): + r""" + PointNet2 with single-scale grouping + Semantic segmentation network that uses feature propogation layers + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + input_channels: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=3, use_xyz=True): + super(Pointnet2SSG, self).__init__() + + self.SA_modules = nn.ModuleList() + self.SA_modules.append( + PointnetSAModule( + npoint=1024, + radius=0.1, + nsample=32, + mlp=[input_channels, 32, 32, 64], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule( + npoint=256, + radius=0.2, + nsample=32, + mlp=[64, 64, 64, 128], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule( + npoint=64, + radius=0.4, + nsample=32, + mlp=[128, 128, 128, 256], + use_xyz=use_xyz, + ) + ) + self.SA_modules.append( + PointnetSAModule( + npoint=16, + radius=0.8, + nsample=32, + mlp=[256, 256, 256, 512], + use_xyz=use_xyz, + ) + ) + + self.FP_modules = nn.ModuleList() + self.FP_modules.append( + PointnetFPModule(mlp=[128 + input_channels, 128, 128, 128]) + ) + self.FP_modules.append(PointnetFPModule(mlp=[256 + 64, 256, 128])) + self.FP_modules.append(PointnetFPModule(mlp=[256 + 128, 256, 256])) + self.FP_modules.append(PointnetFPModule(mlp=[512 + 256, 256, 256])) + + self.FC_layer = ( + pt_utils.Seq(128) + .conv1d(128, bn=True) + .dropout() + .conv1d(num_classes, activation=None) + ) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = pc[..., 3:].transpose(1, 2).contiguous() if pc.size(-1) > 3 else None + + return xyz, features + + def forward(self, pointcloud): + # type: (Pointnet2SSG, torch.cuda.FloatTensor) -> pt_utils.Seq + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + + l_xyz, l_features = [xyz], [features] + for i in range(len(self.SA_modules)): + li_xyz, li_features = self.SA_modules[i](l_xyz[i], l_features[i]) + l_xyz.append(li_xyz) + l_features.append(li_features) + + for i in range(-1, -(len(self.FP_modules) + 1), -1): + l_features[i - 1] = self.FP_modules[i]( + l_xyz[i - 1], l_xyz[i], l_features[i - 1], l_features[i] + ) + + return self.FC_layer(l_features[0]).transpose(1, 2).contiguous() diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/train/__init__.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/train/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/train/train_cls.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/train/train_cls.py new file mode 100644 index 0000000..9969f3b --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/train/train_cls.py @@ -0,0 +1,171 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.optim as optim +import torch.optim.lr_scheduler as lr_sched +import torch.nn as nn +from torch.utils.data import DataLoader +from torchvision import transforms +import etw_pytorch_utils as pt_utils +import pprint +import os.path as osp +import os +import argparse + +from pointnet2.models import Pointnet2ClsMSG as Pointnet +from pointnet2.models.pointnet2_msg_cls import model_fn_decorator +from pointnet2.data import ModelNet40Cls +import pointnet2.data.data_utils as d_utils + +torch.backends.cudnn.enabled = True +torch.backends.cudnn.benchmark = True + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Arguments for cls training", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser.add_argument("-batch_size", type=int, default=16, help="Batch size") + parser.add_argument( + "-num_points", type=int, default=4096, help="Number of points to train with" + ) + parser.add_argument( + "-weight_decay", type=float, default=1e-5, help="L2 regularization coeff" + ) + parser.add_argument("-lr", type=float, default=1e-2, help="Initial learning rate") + parser.add_argument( + "-lr_decay", type=float, default=0.7, help="Learning rate decay gamma" + ) + parser.add_argument( + "-decay_step", type=float, default=2e5, help="Learning rate decay step" + ) + parser.add_argument( + "-bn_momentum", type=float, default=0.5, help="Initial batch norm momentum" + ) + parser.add_argument( + "-bnm_decay", type=float, default=0.5, help="Batch norm momentum decay gamma" + ) + parser.add_argument( + "-checkpoint", type=str, default=None, help="Checkpoint to start from" + ) + parser.add_argument( + "-epochs", type=int, default=200, help="Number of epochs to train for" + ) + parser.add_argument( + "-run_name", + type=str, + default="cls_run_1", + help="Name for run in tensorboard_logger", + ) + parser.add_argument("--visdom-port", type=int, default=8097) + parser.add_argument("--visdom", action="store_true") + + return parser.parse_args() + + +lr_clip = 1e-5 +bnm_clip = 1e-2 + +if __name__ == "__main__": + args = parse_args() + + transforms = transforms.Compose( + [ + d_utils.PointcloudToTensor(), + d_utils.PointcloudScale(), + d_utils.PointcloudRotate(), + d_utils.PointcloudRotatePerturbation(), + d_utils.PointcloudTranslate(), + d_utils.PointcloudJitter(), + d_utils.PointcloudRandomInputDropout(), + ] + ) + + test_set = ModelNet40Cls(args.num_points, transforms=transforms, train=False) + test_loader = DataLoader( + test_set, + batch_size=args.batch_size, + shuffle=True, + num_workers=2, + pin_memory=True, + ) + + train_set = ModelNet40Cls(args.num_points, transforms=transforms) + train_loader = DataLoader( + train_set, + batch_size=args.batch_size, + shuffle=True, + num_workers=2, + pin_memory=True, + ) + + model = Pointnet(input_channels=0, num_classes=40, use_xyz=True) + model.cuda() + optimizer = optim.Adam( + model.parameters(), lr=args.lr, weight_decay=args.weight_decay + ) + lr_lbmd = lambda it: max( + args.lr_decay ** (int(it * args.batch_size / args.decay_step)), + lr_clip / args.lr, + ) + bn_lbmd = lambda it: max( + args.bn_momentum + * args.bnm_decay ** (int(it * args.batch_size / args.decay_step)), + bnm_clip, + ) + + # default value + it = -1 # for the initialize value of `LambdaLR` and `BNMomentumScheduler` + best_loss = 1e10 + start_epoch = 1 + + # load status from checkpoint + if args.checkpoint is not None: + checkpoint_status = pt_utils.load_checkpoint( + model, optimizer, filename=args.checkpoint.split(".")[0] + ) + if checkpoint_status is not None: + it, start_epoch, best_loss = checkpoint_status + + lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lambda=lr_lbmd, last_epoch=it) + bnm_scheduler = pt_utils.BNMomentumScheduler( + model, bn_lambda=bn_lbmd, last_epoch=it + ) + + it = max(it, 0) # for the initialize value of `trainer.train` + + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + + if args.visdom: + viz = pt_utils.VisdomViz(port=args.visdom_port) + else: + viz = pt_utils.CmdLineViz() + + viz.text(pprint.pformat(vars(args))) + + if not osp.isdir("checkpoints"): + os.makedirs("checkpoints") + + trainer = pt_utils.Trainer( + model, + model_fn, + optimizer, + checkpoint_name="checkpoints/pointnet2_cls", + best_name="checkpoints/pointnet2_cls_best", + lr_scheduler=lr_scheduler, + bnm_scheduler=bnm_scheduler, + viz=viz, + ) + + trainer.train( + it, start_epoch, args.epochs, train_loader, test_loader, best_loss=best_loss + ) + + if start_epoch == args.epochs: + _ = trainer.eval_epoch(test_loader) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/train/train_sem_seg.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/train/train_sem_seg.py new file mode 100644 index 0000000..719a53e --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/train/train_sem_seg.py @@ -0,0 +1,168 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch.optim as optim +import torch.optim.lr_scheduler as lr_sched +import torch.nn as nn +from torch.utils.data import DataLoader +import etw_pytorch_utils as pt_utils +import pprint +import os.path as osp +import os +import argparse + +from pointnet2.models import Pointnet2SemMSG as Pointnet +from pointnet2.models.pointnet2_msg_sem import model_fn_decorator +from pointnet2.data import Indoor3DSemSeg + +parser = argparse.ArgumentParser(description="Arg parser") +parser.add_argument( + "-batch_size", type=int, default=32, help="Batch size [default: 32]" +) +parser.add_argument( + "-num_points", + type=int, + default=4096, + help="Number of points to train with [default: 4096]", +) +parser.add_argument( + "-weight_decay", + type=float, + default=0, + help="L2 regularization coeff [default: 0.0]", +) +parser.add_argument( + "-lr", type=float, default=1e-2, help="Initial learning rate [default: 1e-2]" +) +parser.add_argument( + "-lr_decay", + type=float, + default=0.5, + help="Learning rate decay gamma [default: 0.5]", +) +parser.add_argument( + "-decay_step", + type=float, + default=2e5, + help="Learning rate decay step [default: 20]", +) +parser.add_argument( + "-bn_momentum", + type=float, + default=0.9, + help="Initial batch norm momentum [default: 0.9]", +) +parser.add_argument( + "-bn_decay", + type=float, + default=0.5, + help="Batch norm momentum decay gamma [default: 0.5]", +) +parser.add_argument( + "-checkpoint", type=str, default=None, help="Checkpoint to start from" +) +parser.add_argument( + "-epochs", type=int, default=200, help="Number of epochs to train for" +) +parser.add_argument( + "-run_name", + type=str, + default="sem_seg_run_1", + help="Name for run in tensorboard_logger", +) +parser.add_argument("--visdom-port", type=int, default=8097) +parser.add_argument("--visdom", action="store_true") + +lr_clip = 1e-5 +bnm_clip = 1e-2 + +if __name__ == "__main__": + args = parser.parse_args() + + test_set = Indoor3DSemSeg(args.num_points, train=False) + test_loader = DataLoader( + test_set, + batch_size=args.batch_size, + shuffle=True, + pin_memory=True, + num_workers=2, + ) + + train_set = Indoor3DSemSeg(args.num_points) + train_loader = DataLoader( + train_set, + batch_size=args.batch_size, + pin_memory=True, + num_workers=2, + shuffle=True, + ) + + model = Pointnet(num_classes=13, input_channels=6, use_xyz=True) + model.cuda() + optimizer = optim.Adam( + model.parameters(), lr=args.lr, weight_decay=args.weight_decay + ) + + lr_lbmd = lambda it: max( + args.lr_decay ** (int(it * args.batch_size / args.decay_step)), + lr_clip / args.lr, + ) + bnm_lmbd = lambda it: max( + args.bn_momentum + * args.bn_decay ** (int(it * args.batch_size / args.decay_step)), + bnm_clip, + ) + + # default value + it = -1 # for the initialize value of `LambdaLR` and `BNMomentumScheduler` + best_loss = 1e10 + start_epoch = 1 + + # load status from checkpoint + if args.checkpoint is not None: + checkpoint_status = pt_utils.load_checkpoint( + model, optimizer, filename=args.checkpoint.split(".")[0] + ) + if checkpoint_status is not None: + it, start_epoch, best_loss = checkpoint_status + + lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lambda=lr_lbmd, last_epoch=it) + bnm_scheduler = pt_utils.BNMomentumScheduler( + model, bn_lambda=bnm_lmbd, last_epoch=it + ) + + it = max(it, 0) # for the initialize value of `trainer.train` + + model_fn = model_fn_decorator(nn.CrossEntropyLoss()) + + if args.visdom: + viz = pt_utils.VisdomViz(port=args.visdom_port) + else: + viz = pt_utils.CmdLineViz() + + viz.text(pprint.pformat(vars(args))) + + if not osp.isdir("checkpoints"): + os.makedirs("checkpoints") + + trainer = pt_utils.Trainer( + model, + model_fn, + optimizer, + checkpoint_name="checkpoints/pointnet2_semseg", + best_name="checkpoints/pointnet2_semseg_best", + lr_scheduler=lr_scheduler, + bnm_scheduler=bnm_scheduler, + viz=viz, + ) + + trainer.train( + it, start_epoch, args.epochs, train_loader, test_loader, best_loss=best_loss + ) + + if start_epoch == args.epochs: + _ = trainer.eval_epoch(test_loader) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/.gitignore b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/.gitignore new file mode 100644 index 0000000..25bd00c --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/.gitignore @@ -0,0 +1,2 @@ +build +_ext diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/__init__.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/__init__.py new file mode 100644 index 0000000..e91e21f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/__init__.py @@ -0,0 +1,9 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from . import pointnet2_utils +from . import pointnet2_modules diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/linalg_utils.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/linalg_utils.py new file mode 100644 index 0000000..6b433ed --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/linalg_utils.py @@ -0,0 +1,84 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +from enum import Enum +import numpy as np + +PDist2Order = Enum("PDist2Order", "d_first d_second") + + +def pdist2(X, Z=None, order=PDist2Order.d_second): + # type: (torch.Tensor, torch.Tensor, PDist2Order) -> torch.Tensor + r""" Calculates the pairwise distance between X and Z + + D[b, i, j] = l2 distance X[b, i] and Z[b, j] + + Parameters + --------- + X : torch.Tensor + X is a (B, N, d) tensor. There are B batches, and N vectors of dimension d + Z: torch.Tensor + Z is a (B, M, d) tensor. If Z is None, then Z = X + + Returns + ------- + torch.Tensor + Distance matrix is size (B, N, M) + """ + + if order == PDist2Order.d_second: + if X.dim() == 2: + X = X.unsqueeze(0) + if Z is None: + Z = X + G = np.matmul(X, Z.transpose(-2, -1)) + S = (X * X).sum(-1, keepdim=True) + R = S.transpose(-2, -1) + else: + if Z.dim() == 2: + Z = Z.unsqueeze(0) + G = np.matmul(X, Z.transpose(-2, -1)) + S = (X * X).sum(-1, keepdim=True) + R = (Z * Z).sum(-1, keepdim=True).transpose(-2, -1) + else: + if X.dim() == 2: + X = X.unsqueeze(0) + if Z is None: + Z = X + G = np.matmul(X.transpose(-2, -1), Z) + R = (X * X).sum(-2, keepdim=True) + S = R.transpose(-2, -1) + else: + if Z.dim() == 2: + Z = Z.unsqueeze(0) + G = np.matmul(X.transpose(-2, -1), Z) + S = (X * X).sum(-2, keepdim=True).transpose(-2, -1) + R = (Z * Z).sum(-2, keepdim=True) + + return torch.abs(R + S - 2 * G).squeeze(0) + + +def pdist2_slow(X, Z=None): + if Z is None: + Z = X + D = torch.zeros(X.size(0), X.size(2), Z.size(2)) + + for b in range(D.size(0)): + for i in range(D.size(1)): + for j in range(D.size(2)): + D[b, i, j] = torch.dist(X[b, :, i], Z[b, :, j]) + return D + + +if __name__ == "__main__": + X = torch.randn(2, 3, 5) + Z = torch.randn(2, 3, 3) + + print(pdist2(X, order=PDist2Order.d_first)) + print(pdist2_slow(X)) + print(torch.dist(pdist2(X, order=PDist2Order.d_first), pdist2_slow(X))) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/pointnet2_modules.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/pointnet2_modules.py new file mode 100644 index 0000000..32291e3 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/pointnet2_modules.py @@ -0,0 +1,234 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +import torch.nn as nn +import torch.nn.functional as F +import etw_pytorch_utils as pt_utils + +from pointnet2.utils import pointnet2_utils + +if False: + # Workaround for type hints without depending on the `typing` module + from typing import * + + +class _PointnetSAModuleBase(nn.Module): + def __init__(self): + super(_PointnetSAModuleBase, self).__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward(self, xyz, features=None): + # type: (_PointnetSAModuleBase, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor of the xyz coordinates of the features + features : torch.Tensor + (B, C, N) tensor of the descriptors of the the features + + Returns + ------- + new_xyz : torch.Tensor + (B, npoint, 3) tensor of the new features' xyz + new_features : torch.Tensor + (B, \sum_k(mlps[k][-1]), npoint) tensor of the new_features descriptors + """ + + new_features_list = [] + B = xyz.shape[0] + xyz_flipped = xyz.transpose(1, 2).contiguous() + new_xyz = ( + pointnet2_utils.gather_operation( + xyz_flipped, pointnet2_utils.furthest_point_sample(xyz, self.npoint) + ) + .transpose(1, 2) + .contiguous() + if self.npoint is not None + else torch.zeros((B, 1, 3)).to(xyz.device) + ) + + for i in range(len(self.groupers)): + new_features = self.groupers[i]( + xyz, new_xyz, features + ) # (B, C, npoint, nsample) + + new_features = self.mlps[i](new_features) # (B, mlp[-1], npoint, nsample) + new_features = F.max_pool2d( + new_features, kernel_size=[1, new_features.size(3)] + ) # (B, mlp[-1], npoint, 1) + new_features = new_features.squeeze(-1) # (B, mlp[-1], npoint) + + new_features_list.append(new_features) + + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointnetSAModuleMSG(_PointnetSAModuleBase): + r"""Pointnet set abstrction layer with multiscale grouping + + Parameters + ---------- + npoint : int + Number of features + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet before the global max_pool for each scale + bn : bool + Use batchnorm + """ + + def __init__(self, npoint, radii, nsamples, mlps, bn=True, use_xyz=True): + # type: (PointnetSAModuleMSG, int, List[float], List[int], List[List[int]], bool, bool) -> None + super(PointnetSAModuleMSG, self).__init__() + + assert len(radii) == len(nsamples) == len(mlps) + + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + pointnet2_utils.QueryAndGroup(radius, nsample, use_xyz=use_xyz) + if npoint is not None + else pointnet2_utils.GroupAll(use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + + self.mlps.append(pt_utils.SharedMLP(mlp_spec, bn=bn)) + + +class PointnetSAModule(PointnetSAModuleMSG): + r"""Pointnet set abstrction layer + + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet before the global max_pool + bn : bool + Use batchnorm + """ + + def __init__( + self, mlp, npoint=None, radius=None, nsample=None, bn=True, use_xyz=True + ): + # type: (PointnetSAModule, List[int], int, float, int, bool, bool) -> None + super(PointnetSAModule, self).__init__( + mlps=[mlp], + npoint=npoint, + radii=[radius], + nsamples=[nsample], + bn=bn, + use_xyz=use_xyz, + ) + + +class PointnetFPModule(nn.Module): + r"""Propigates the features of one set to another + + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + + def __init__(self, mlp, bn=True): + # type: (PointnetFPModule, List[int], bool) -> None + super(PointnetFPModule, self).__init__() + self.mlp = pt_utils.SharedMLP(mlp, bn=bn) + + def forward(self, unknown, known, unknow_feats, known_feats): + # type: (PointnetFPModule, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + if known is not None: + dist, idx = pointnet2_utils.three_nn(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + + interpolated_feats = pointnet2_utils.three_interpolate( + known_feats, idx, weight + ) + else: + interpolated_feats = known_feats.expand( + *(known_feats.size()[0:2] + [unknown.size(1)]) + ) + + if unknow_feats is not None: + new_features = torch.cat( + [interpolated_feats, unknow_feats], dim=1 + ) # (B, C2 + C1, n) + else: + new_features = interpolated_feats + + new_features = new_features.unsqueeze(-1) + new_features = self.mlp(new_features) + + return new_features.squeeze(-1) + + +if __name__ == "__main__": + from torch.autograd import Variable + + torch.manual_seed(1) + torch.cuda.manual_seed_all(1) + xyz = Variable(torch.randn(2, 9, 3).cuda(), requires_grad=True) + xyz_feats = Variable(torch.randn(2, 9, 6).cuda(), requires_grad=True) + + test_module = PointnetSAModuleMSG( + npoint=2, radii=[5.0, 10.0], nsamples=[6, 3], mlps=[[9, 3], [9, 6]] + ) + test_module.cuda() + print(test_module(xyz, xyz_feats)) + + # test_module = PointnetFPModule(mlp=[6, 6]) + # test_module.cuda() + # from torch.autograd import gradcheck + # inputs = (xyz, xyz, None, xyz_feats) + # test = gradcheck(test_module, inputs, eps=1e-6, atol=1e-4) + # print(test) + + for _ in range(1): + _, new_features = test_module(xyz, xyz_feats) + new_features.backward(torch.cuda.FloatTensor(*new_features.size()).fill_(1)) + print(new_features) + print(xyz.grad) diff --git a/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/pointnet2_utils.py b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/pointnet2_utils.py new file mode 100644 index 0000000..2936a58 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/pointnet2/utils/pointnet2_utils.py @@ -0,0 +1,384 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import torch +from torch.autograd import Function +import torch.nn as nn +import etw_pytorch_utils as pt_utils +import sys + +try: + import builtins +except: + import __builtin__ as builtins + +try: + import pointnet2._ext as _ext +except ImportError: + if not getattr(builtins, "__POINTNET2_SETUP__", False): + raise ImportError( + "Could not import _ext module.\n" + "Please see the setup instructions in the README: " + "https://github.com/erikwijmans/Pointnet2_PyTorch/blob/master/README.rst" + ) + +if False: + # Workaround for type hints without depending on the `typing` module + from typing import * + + +class RandomDropout(nn.Module): + def __init__(self, p=0.5, inplace=False): + super(RandomDropout, self).__init__() + self.p = p + self.inplace = inplace + + def forward(self, X): + theta = torch.Tensor(1).uniform_(0, self.p)[0] + return pt_utils.feature_dropout_no_scaling(X, theta, self.train, self.inplace) + + +class FurthestPointSampling(Function): + @staticmethod + def forward(ctx, xyz, npoint): + # type: (Any, torch.Tensor, int) -> torch.Tensor + r""" + Uses iterative furthest point sampling to select a set of npoint features that have the largest + minimum distance + + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor where N > npoint + npoint : int32 + number of features in the sampled set + + Returns + ------- + torch.Tensor + (B, npoint) tensor containing the set + """ + return _ext.furthest_point_sampling(xyz, npoint) + + @staticmethod + def backward(xyz, a=None): + return None, None + + +furthest_point_sample = FurthestPointSampling.apply + + +class GatherOperation(Function): + @staticmethod + def forward(ctx, features, idx): + # type: (Any, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor + + idx : torch.Tensor + (B, npoint) tensor of the features to gather + + Returns + ------- + torch.Tensor + (B, C, npoint) tensor + """ + + _, C, N = features.size() + + ctx.for_backwards = (idx, C, N) + + return _ext.gather_points(features, idx) + + @staticmethod + def backward(ctx, grad_out): + idx, C, N = ctx.for_backwards + + grad_features = _ext.gather_points_grad(grad_out.contiguous(), idx, N) + return grad_features, None + + +gather_operation = GatherOperation.apply + + +class ThreeNN(Function): + @staticmethod + def forward(ctx, unknown, known): + # type: (Any, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + Find the three nearest neighbors of unknown in known + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of known features + known : torch.Tensor + (B, m, 3) tensor of unknown features + + Returns + ------- + dist : torch.Tensor + (B, n, 3) l2 distance to the three nearest neighbors + idx : torch.Tensor + (B, n, 3) index of 3 nearest neighbors + """ + dist2, idx = _ext.three_nn(unknown, known) + + return torch.sqrt(dist2), idx + + @staticmethod + def backward(ctx, a=None, b=None): + return None, None + + +three_nn = ThreeNN.apply + + +class ThreeInterpolate(Function): + @staticmethod + def forward(ctx, features, idx, weight): + # type(Any, torch.Tensor, torch.Tensor, torch.Tensor) -> Torch.Tensor + r""" + Performs weight linear interpolation on 3 features + Parameters + ---------- + features : torch.Tensor + (B, c, m) Features descriptors to be interpolated from + idx : torch.Tensor + (B, n, 3) three nearest neighbors of the target features in features + weight : torch.Tensor + (B, n, 3) weights + + Returns + ------- + torch.Tensor + (B, c, n) tensor of the interpolated features + """ + B, c, m = features.size() + n = idx.size(1) + + ctx.three_interpolate_for_backward = (idx, weight, m) + + return _ext.three_interpolate(features, idx, weight) + + @staticmethod + def backward(ctx, grad_out): + # type: (Any, torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor] + r""" + Parameters + ---------- + grad_out : torch.Tensor + (B, c, n) tensor with gradients of ouputs + + Returns + ------- + grad_features : torch.Tensor + (B, c, m) tensor with gradients of features + + None + + None + """ + idx, weight, m = ctx.three_interpolate_for_backward + + grad_features = _ext.three_interpolate_grad( + grad_out.contiguous(), idx, weight, m + ) + + return grad_features, None, None + + +three_interpolate = ThreeInterpolate.apply + + +class GroupingOperation(Function): + @staticmethod + def forward(ctx, features, idx): + # type: (Any, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor of features to group + idx : torch.Tensor + (B, npoint, nsample) tensor containing the indicies of features to group with + + Returns + ------- + torch.Tensor + (B, C, npoint, nsample) tensor + """ + B, nfeatures, nsample = idx.size() + _, C, N = features.size() + + ctx.for_backwards = (idx, N) + + return _ext.group_points(features, idx) + + @staticmethod + def backward(ctx, grad_out): + # type: (Any, torch.tensor) -> Tuple[torch.Tensor, torch.Tensor] + r""" + + Parameters + ---------- + grad_out : torch.Tensor + (B, C, npoint, nsample) tensor of the gradients of the output from forward + + Returns + ------- + torch.Tensor + (B, C, N) gradient of the features + None + """ + idx, N = ctx.for_backwards + + grad_features = _ext.group_points_grad(grad_out.contiguous(), idx, N) + + return grad_features, None + + +grouping_operation = GroupingOperation.apply + + +class BallQuery(Function): + @staticmethod + def forward(ctx, radius, nsample, xyz, new_xyz): + # type: (Any, float, int, torch.Tensor, torch.Tensor) -> torch.Tensor + r""" + + Parameters + ---------- + radius : float + radius of the balls + nsample : int + maximum number of features in the balls + xyz : torch.Tensor + (B, N, 3) xyz coordinates of the features + new_xyz : torch.Tensor + (B, npoint, 3) centers of the ball query + + Returns + ------- + torch.Tensor + (B, npoint, nsample) tensor with the indicies of the features that form the query balls + """ + return _ext.ball_query(new_xyz, xyz, radius, nsample) + + @staticmethod + def backward(ctx, a=None): + return None, None, None, None + + +ball_query = BallQuery.apply + + +class QueryAndGroup(nn.Module): + r""" + Groups with a ball query of radius + + Parameters + --------- + radius : float32 + Radius of ball + nsample : int32 + Maximum number of features to gather in the ball + """ + + def __init__(self, radius, nsample, use_xyz=True): + # type: (QueryAndGroup, float, int, bool) -> None + super(QueryAndGroup, self).__init__() + self.radius, self.nsample, self.use_xyz = radius, nsample, use_xyz + + def forward(self, xyz, new_xyz, features=None): + # type: (QueryAndGroup, torch.Tensor. torch.Tensor, torch.Tensor) -> Tuple[Torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + centriods (B, npoint, 3) + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, 3 + C, npoint, nsample) tensor + """ + + idx = ball_query(self.radius, self.nsample, xyz, new_xyz) + xyz_trans = xyz.transpose(1, 2).contiguous() + grouped_xyz = grouping_operation(xyz_trans, idx) # (B, 3, npoint, nsample) + grouped_xyz -= new_xyz.transpose(1, 2).unsqueeze(-1) + + if features is not None: + grouped_features = grouping_operation(features, idx) + if self.use_xyz: + new_features = torch.cat( + [grouped_xyz, grouped_features], dim=1 + ) # (B, C + 3, npoint, nsample) + else: + new_features = grouped_features + else: + assert ( + self.use_xyz + ), "Cannot have not features and not use xyz as a feature!" + new_features = grouped_xyz + + return new_features + + +class GroupAll(nn.Module): + r""" + Groups all features + + Parameters + --------- + """ + + def __init__(self, use_xyz=True): + # type: (GroupAll, bool) -> None + super(GroupAll, self).__init__() + self.use_xyz = use_xyz + + def forward(self, xyz, new_xyz, features=None): + # type: (GroupAll, torch.Tensor, torch.Tensor, torch.Tensor) -> Tuple[torch.Tensor] + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + Ignored + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, C + 3, 1, N) tensor + """ + + grouped_xyz = xyz.transpose(1, 2).unsqueeze(2) + if features is not None: + grouped_features = features.unsqueeze(2) + if self.use_xyz: + new_features = torch.cat( + [grouped_xyz, grouped_features], dim=1 + ) # (B, 3 + C, 1, N) + else: + new_features = grouped_features + else: + new_features = grouped_xyz + + return new_features diff --git a/zoo/SimpleView/pointnet2_pyt/requirements.txt b/zoo/SimpleView/pointnet2_pyt/requirements.txt new file mode 100644 index 0000000..d75bf13 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/requirements.txt @@ -0,0 +1,8 @@ +git+git://github.com/erikwijmans/etw_pytorch_utils.git@v1.1.1#egg=etw_pytorch_utils +h5py +numpy +torch>=1.0 +torchvision +pprint +enum34 +future diff --git a/zoo/SimpleView/pointnet2_pyt/setup.py b/zoo/SimpleView/pointnet2_pyt/setup.py new file mode 100644 index 0000000..fd5351e --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/setup.py @@ -0,0 +1,39 @@ +from __future__ import division, absolute_import, with_statement, print_function +from setuptools import setup, find_packages +from torch.utils.cpp_extension import BuildExtension, CUDAExtension +import glob + +try: + import builtins +except: + import __builtin__ as builtins + +builtins.__POINTNET2_SETUP__ = True +import pointnet2 + +_ext_src_root = "pointnet2/_ext-src" +_ext_sources = glob.glob("{}/src/*.cpp".format(_ext_src_root)) + glob.glob( + "{}/src/*.cu".format(_ext_src_root) +) +_ext_headers = glob.glob("{}/include/*".format(_ext_src_root)) + +requirements = ["etw_pytorch_utils==1.1.1", "h5py", "enum34", "future"] + +setup( + name="pointnet2", + version=pointnet2.__version__, + author="Erik Wijmans", + packages=find_packages(), + install_requires=requirements, + ext_modules=[ + CUDAExtension( + name="pointnet2._ext", + sources=_ext_sources, + extra_compile_args={ + "cxx": ["-O2", "-I{}".format("{}/include".format(_ext_src_root))], + "nvcc": ["-O2", "-I{}".format("{}/include".format(_ext_src_root))], + }, + ) + ], + cmdclass={"build_ext": BuildExtension}, +) diff --git a/zoo/SimpleView/pointnet2_pyt/tests/conftest.py b/zoo/SimpleView/pointnet2_pyt/tests/conftest.py new file mode 100644 index 0000000..052f045 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/tests/conftest.py @@ -0,0 +1,67 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +import pytest +import torch +import numpy as np + +pytest_plugins = ["helpers_namespace"] + + +def _test_loop(model, model_fn, inputs, labels): + optimizer = torch.optim.Adam(model.parameters(), lr=1e-5) + + prev_loss = 1e10 + for _ in range(5): + optimizer.zero_grad() + _, loss, _ = model_fn(model, (inputs, labels)) + loss.backward() + optimizer.step() + + assert loss.item() < prev_loss + 1.0, "Loss spiked upwards" + + prev_loss = loss.item() + + +@pytest.helpers.register +def cls_test_xyz(model, model_fn): + B, N = 4, 2048 + inputs = torch.randn(B, N, 6).cuda() + labels = torch.from_numpy(np.random.randint(0, 3, size=B)).cuda() + model.cuda() + + _test_loop(model, model_fn, inputs, labels) + + +@pytest.helpers.register +def cls_test_no_xyz(model, model_fn): + B, N = 4, 2048 + inputs = torch.randn(B, N, 3).cuda() + labels = torch.from_numpy(np.random.randint(0, 3, size=B)).cuda() + model.cuda() + + _test_loop(model, model_fn, inputs, labels) + + +@pytest.helpers.register +def semseg_test_xyz(model, model_fn): + B, N = 4, 2048 + inputs = torch.randn(B, N, 6).cuda() + labels = torch.from_numpy(np.random.randint(0, 3, size=B * N)).view(B, N).cuda() + model.cuda() + + _test_loop(model, model_fn, inputs, labels) + + +@pytest.helpers.register +def semseg_test_no_xyz(model, model_fn): + B, N = 4, 2048 + inputs = torch.randn(B, N, 3).cuda() + labels = torch.from_numpy(np.random.randint(0, 3, size=B * N)).view(B, N).cuda() + model.cuda() + + _test_loop(model, model_fn, inputs, labels) diff --git a/zoo/SimpleView/pointnet2_pyt/tests/test_cls_msg.py b/zoo/SimpleView/pointnet2_pyt/tests/test_cls_msg.py new file mode 100644 index 0000000..c766221 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/tests/test_cls_msg.py @@ -0,0 +1,20 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from pointnet2.models.pointnet2_msg_cls import model_fn_decorator, Pointnet2MSG +import torch.nn as nn +import pytest + + +def test_xyz(): + model = Pointnet2MSG(3, input_channels=3) + pytest.helpers.cls_test_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) + + +def test_no_xyz(): + model = Pointnet2MSG(3, input_channels=0) + pytest.helpers.cls_test_no_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) diff --git a/zoo/SimpleView/pointnet2_pyt/tests/test_cls_ssg.py b/zoo/SimpleView/pointnet2_pyt/tests/test_cls_ssg.py new file mode 100644 index 0000000..073e66f --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/tests/test_cls_ssg.py @@ -0,0 +1,20 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from pointnet2.models.pointnet2_ssg_cls import model_fn_decorator, Pointnet2SSG +import torch.nn as nn +import pytest + + +def test_xyz(): + model = Pointnet2SSG(3, input_channels=3) + pytest.helpers.cls_test_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) + + +def test_no_xyz(): + model = Pointnet2SSG(3, input_channels=0) + pytest.helpers.cls_test_no_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) diff --git a/zoo/SimpleView/pointnet2_pyt/tests/test_semseg_msg.py b/zoo/SimpleView/pointnet2_pyt/tests/test_semseg_msg.py new file mode 100644 index 0000000..d12933d --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/tests/test_semseg_msg.py @@ -0,0 +1,20 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from pointnet2.models.pointnet2_msg_sem import model_fn_decorator, Pointnet2MSG +import torch.nn as nn +import pytest + + +def test_xyz(): + model = Pointnet2MSG(3, input_channels=3) + pytest.helpers.semseg_test_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) + + +def test_no_xyz(): + model = Pointnet2MSG(3, input_channels=0) + pytest.helpers.semseg_test_no_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) diff --git a/zoo/SimpleView/pointnet2_pyt/tests/test_semseg_ssg.py b/zoo/SimpleView/pointnet2_pyt/tests/test_semseg_ssg.py new file mode 100644 index 0000000..456177e --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/tests/test_semseg_ssg.py @@ -0,0 +1,20 @@ +from __future__ import ( + division, + absolute_import, + with_statement, + print_function, + unicode_literals, +) +from pointnet2.models.pointnet2_ssg_sem import model_fn_decorator, Pointnet2SSG +import torch.nn as nn +import pytest + + +def test_xyz(): + model = Pointnet2SSG(3, input_channels=3) + pytest.helpers.semseg_test_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) + + +def test_no_xyz(): + model = Pointnet2SSG(3, input_channels=0) + pytest.helpers.semseg_test_no_xyz(model, model_fn_decorator(nn.CrossEntropyLoss())) diff --git a/zoo/SimpleView/pointnet2_pyt/tox.ini b/zoo/SimpleView/pointnet2_pyt/tox.ini new file mode 100644 index 0000000..3c70384 --- /dev/null +++ b/zoo/SimpleView/pointnet2_pyt/tox.ini @@ -0,0 +1,16 @@ +[tox] +envlist = + py27 + py35 + py36 + +[testenv] +# install pytest in the virtualenv where commands will be executed +deps = + numpy + torch>=1.0 + git+git://github.com/erikwijmans/etw_pytorch_utils.git@v1.1.1#egg=etw_pytorch_utils + pytest + pytest-helpers-namespace +commands = + pytest diff --git a/zoo/SimpleView/pointnet2_tf/LICENSE b/zoo/SimpleView/pointnet2_tf/LICENSE new file mode 100644 index 0000000..41987f9 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/LICENSE @@ -0,0 +1,25 @@ +PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space. + +Copyright (c) 2017, Geometric Computation Group of Stanford University + +The MIT License (MIT) + +Copyright (c) 2017 Charles R. Qi + +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/zoo/SimpleView/pointnet2_tf/README.md b/zoo/SimpleView/pointnet2_tf/README.md new file mode 100644 index 0000000..04a1528 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/README.md @@ -0,0 +1,93 @@ +### PointNet++: *Deep Hierarchical Feature Learning on Point Sets in a Metric Space* +Created by Charles R. Qi, Li (Eric) Yi, Hao Su, Leonidas J. Guibas from Stanford University. + +![prediction example](https://github.com/charlesq34/pointnet2/blob/master/doc/teaser.jpg) + +### Citation +If you find our work useful in your research, please consider citing: + + @article{qi2017pointnetplusplus, + title={PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space}, + author={Qi, Charles R and Yi, Li and Su, Hao and Guibas, Leonidas J}, + journal={arXiv preprint arXiv:1706.02413}, + year={2017} + } + +### Introduction +This work is based on our NIPS'17 paper. You can find arXiv version of the paper here or check project webpage for a quick overview. PointNet++ is a follow-up project that builds on and extends PointNet. It is version 2.0 of the PointNet architecture. + +PointNet (the v1 model) either transforms features of *individual points* independently or process global features of the *entire point set*. However, in many cases there are well defined distance metrics such as Euclidean distance for 3D point clouds collected by 3D sensors or geodesic distance for manifolds like isometric shape surfaces. In PointNet++ we want to respect *spatial localities* of those point sets. PointNet++ learns hierarchical features with increasing scales of contexts, just like that in convolutional neural networks. Besides, we also observe one challenge that is not present in convnets (with images) -- non-uniform densities in natural point clouds. To deal with those non-uniform densities, we further propose special layers that are able to intelligently aggregate information from different scales. + +In this repository we release code and data for our PointNet++ classification and segmentation networks as well as a few utility scripts for training, testing and data processing and visualization. + +### Installation + +Install TensorFlow. The code is tested under TF1.2 GPU version and Python 2.7 (version 3 should also work) on Ubuntu 14.04. There are also some dependencies for a few Python libraries for data processing and visualizations like `cv2`, `h5py` etc. It's highly recommended that you have access to GPUs. + +#### Compile Customized TF Operators +The TF operators are included under `tf_ops`, you need to compile them (check `tf_xxx_compile.sh` under each ops subfolder) first. Update `nvcc` and `python` path if necessary. The code is tested under TF1.2.0. If you are using earlier version it's possible that you need to remove the `-D_GLIBCXX_USE_CXX11_ABI=0` flag in g++ command in order to compile correctly. + +To compile the operators in TF version >=1.4, you need to modify the compile scripts slightly. + +First, find Tensorflow include and library paths. + + TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())') + TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())') + +Then, add flags of `-I$TF_INC/external/nsync/public -L$TF_LIB -ltensorflow_framework` to the `g++` commands. + +### Usage + +#### Shape Classification + +To train a PointNet++ model to classify ModelNet40 shapes (using point clouds with XYZ coordinates): + + python train.py + +To see all optional arguments for training: + + python train.py -h + +If you have multiple GPUs on your machine, you can also run the multi-GPU version training (our implementation is similar to the tensorflow cifar10 tutorial): + + CUDA_VISIBLE_DEVICES=0,1 python train_multi_gpu.py --num_gpus 2 + +After training, to evaluate the classification accuracies (with optional multi-angle voting): + + python evaluate.py --num_votes 12 + +Side Note: For the XYZ+normal experiment reported in our paper: (1) 5000 points are used and (2) a further random data dropout augmentation is used during training (see commented line after `augment_batch_data` in `train.py` and (3) the model architecture is updated such that the `nsample=128` in the first two set abstraction levels, which is suited for the larger point density in 5000-point samplings. + +To use normal features for classification: You can get our sampled point clouds of ModelNet40 (XYZ and normal from mesh, 10k points per shape) here (1.6GB). Move the uncompressed data folder to `data/modelnet40_normal_resampled` + +#### Object Part Segmentation + +To train a model to segment object parts for ShapeNet models: + + cd part_seg + python train.py + +Preprocessed ShapeNetPart dataset (XYZ, normal and part labels) can be found here (674MB). Move the uncompressed data folder to `data/shapenetcore_partanno_segmentation_benchmark_v0_normal` + +#### Semantic Scene Parsing + +See `scannet/README` and `scannet/train.py` for details. + +#### Visualization Tools +We have provided a handy point cloud visualization tool under `utils`. Run `sh compile_render_balls_so.sh` to compile it and then you can try the demo with `python show3d_balls.py` The original code is from here. + +#### Prepare Your Own Data +You can refer to here on how to prepare your own HDF5 files for either classification or segmentation. Or you can refer to `modelnet_dataset.py` on how to read raw data files and prepare mini-batches from them. A more advanced way is to use TensorFlow's dataset APIs, for which you can find more documentations here. + +### License +Our code is released under MIT License (see LICENSE file for details). + +### Updates +* 02/23/2018: Added support for multi-gpu training for the classification task. +* 02/23/2018: Adopted a new way for data loading. No longer require manual data downloading to train a classification network. +* 02/06/2018: Added sample training code for ScanNet semantic segmentation. + +### Related Projects + +* PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation by Qi et al. (CVPR 2017 Oral Presentation). Code and data released in GitHub. +* Frustum PointNets for 3D Object Detection from RGB-D Data by Qi et al. (CVPR 2018) A novel framework for 3D object detection with RGB-D data. Based on 2D boxes from a 2D object detector on RGB images, we extrude the depth maps in 2D boxes to point clouds in 3D space and then realize instance segmentation and 3D bounding box estimation using PointNet/PointNet++. The method proposed has achieved first place on KITTI 3D object detection benchmark on all categories (last checked on 11/30/2017). Code and data release TBD. diff --git a/zoo/SimpleView/pointnet2_tf/data/README.md b/zoo/SimpleView/pointnet2_tf/data/README.md new file mode 100644 index 0000000..1538b83 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/data/README.md @@ -0,0 +1,4 @@ +#### Point Cloud Data +You can get our sampled point clouds of ModelNet40 (XYZ and normal from mesh, 10k points per shape) at this link. The ShapeNetPart dataset (XYZ, normal and part labels) can be found here. + +Uncompress the downloaded data in this directory. diff --git a/zoo/SimpleView/pointnet2_tf/doc/teaser.jpg b/zoo/SimpleView/pointnet2_tf/doc/teaser.jpg new file mode 100644 index 0000000..4a7389c Binary files /dev/null and b/zoo/SimpleView/pointnet2_tf/doc/teaser.jpg differ diff --git a/zoo/SimpleView/pointnet2_tf/evaluate.py b/zoo/SimpleView/pointnet2_tf/evaluate.py new file mode 100644 index 0000000..b547703 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/evaluate.py @@ -0,0 +1,164 @@ +''' + Evaluate classification performance with optional voting. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import modelnet_dataset +import modelnet_h5_dataset + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name. [default: pointnet2_cls_ssg]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--dump_dir', default='dump', help='dump folder path [dump]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +parser.add_argument('--num_votes', type=int, default=1, help='Aggregate classification scores from multiple rotations [default: 1]') +FLAGS = parser.parse_args() + + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +MODEL = importlib.import_module(FLAGS.model) # import network module +DUMP_DIR = FLAGS.dump_dir +if not os.path.exists(DUMP_DIR): os.mkdir(DUMP_DIR) +LOG_FOUT = open(os.path.join(DUMP_DIR, 'log_evaluate.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +NUM_CLASSES = 40 +SHAPE_NAMES = [line.rstrip() for line in \ + open(os.path.join(ROOT_DIR, 'data/modelnet40_ply_hdf5_2048/shape_names.txt'))] + +HOSTNAME = socket.gethostname() + +# Shapenet official train/test split +if FLAGS.normal: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(num_votes): + is_training = False + + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # simple model + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + log_string("Model restored.") + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss} + + eval_one_epoch(sess, ops, num_votes) + +def eval_one_epoch(sess, ops, num_votes=1, topk=1): + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + while TEST_DATASET.has_next_batch(): + batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + print('Batch: %03d, batch size: %d'%(batch_idx, bsize)) + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + batch_pred_sum = np.zeros((BATCH_SIZE, NUM_CLASSES)) # score for classes + for vote_idx in range(num_votes): + # Shuffle point order to achieve different farthest samplings + shuffled_indices = np.arange(NUM_POINT) + np.random.shuffle(shuffled_indices) + if FLAGS.normal: + rotated_data = provider.rotate_point_cloud_by_angle_with_normal(cur_batch_data[:, shuffled_indices, :], + vote_idx/float(num_votes) * np.pi * 2) + else: + rotated_data = provider.rotate_point_cloud_by_angle(cur_batch_data[:, shuffled_indices, :], + vote_idx/float(num_votes) * np.pi * 2) + feed_dict = {ops['pointclouds_pl']: rotated_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training} + loss_val, pred_val = sess.run([ops['loss'], ops['pred']], feed_dict=feed_dict) + batch_pred_sum += pred_val + pred_val = np.argmax(batch_pred_sum, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + + class_accuracies = np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float) + for i, name in enumerate(SHAPE_NAMES): + log_string('%10s:\t%0.3f' % (name, class_accuracies[i])) + + +if __name__=='__main__': + with tf.Graph().as_default(): + evaluate(num_votes=FLAGS.num_votes) + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/modelnet_dataset.py b/zoo/SimpleView/pointnet2_tf/modelnet_dataset.py new file mode 100644 index 0000000..78f326e --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/modelnet_dataset.py @@ -0,0 +1,144 @@ +''' + ModelNet dataset. Support ModelNet40, ModelNet10, XYZ and normal channels. Up to 10000 points. +''' + +import os +import os.path +import json +import numpy as np +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class ModelNetDataset(): + def __init__(self, root, batch_size = 32, npoints = 1024, split='train', normalize=True, normal_channel=False, modelnet10=False, cache_size=15000, shuffle=None): + self.root = root + self.batch_size = batch_size + self.npoints = npoints + self.normalize = normalize + if modelnet10: + self.catfile = os.path.join(self.root, 'modelnet10_shape_names.txt') + else: + self.catfile = os.path.join(self.root, 'shape_names.txt') + self.cat = [line.rstrip() for line in open(self.catfile)] + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.normal_channel = normal_channel + + shape_ids = {} + if modelnet10: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet10_test.txt'))] + else: + shape_ids['train'] = [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_train.txt'))] + shape_ids['test']= [line.rstrip() for line in open(os.path.join(self.root, 'modelnet40_test.txt'))] + assert(split=='train' or split=='test') + shape_names = ['_'.join(x.split('_')[0:-1]) for x in shape_ids[split]] + # list of (shape_name, shape_txt_file_path) tuple + self.datapath = [(shape_names[i], os.path.join(self.root, shape_names[i], shape_ids[split][i])+'.txt') for i in range(len(shape_ids[split]))] + + self.cache_size = cache_size # how many data points to cache in memory + self.cache = {} # from index to (point_set, cls) tuple + + if shuffle is None: + if split == 'train': self.shuffle = True + else: self.shuffle = False + else: + self.shuffle = shuffle + + self.reset() + + def _augment_batch_data(self, batch_data): + if self.normal_channel: + rotated_data = provider.rotate_point_cloud_with_normal(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud_with_normal(rotated_data) + else: + rotated_data = provider.rotate_point_cloud(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + + jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + jittered_data = provider.shift_point_cloud(jittered_data) + jittered_data = provider.jitter_point_cloud(jittered_data) + rotated_data[:,:,0:3] = jittered_data + return provider.shuffle_points(rotated_data) + + + def _get_item(self, index): + if index in self.cache: + point_set, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1],delimiter=',').astype(np.float32) + # Take the first npoints + point_set = point_set[0:self.npoints,:] + if self.normalize: + point_set[:,0:3] = pc_normalize(point_set[:,0:3]) + if not self.normal_channel: + point_set = point_set[:,0:3] + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, cls) + return point_set, cls + + def __getitem__(self, index): + return self._get_item(index) + + def __len__(self): + return len(self.datapath) + + def num_channel(self): + if self.normal_channel: + return 6 + else: + return 3 + + def reset(self): + self.idxs = np.arange(0, len(self.datapath)) + if self.shuffle: + np.random.shuffle(self.idxs) + self.num_batches = (len(self.datapath)+self.batch_size-1) // self.batch_size + self.batch_idx = 0 + + def has_next_batch(self): + return self.batch_idx < self.num_batches + + def next_batch(self, augment=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, len(self.datapath)) + bsize = end_idx - start_idx + batch_data = np.zeros((bsize, self.npoints, self.num_channel())) + batch_label = np.zeros((bsize), dtype=np.int32) + for i in range(bsize): + ps,cls = self._get_item(self.idxs[i+start_idx]) + batch_data[i] = ps + batch_label[i] = cls + self.batch_idx += 1 + if augment: batch_data = self._augment_batch_data(batch_data) + return batch_data, batch_label + +if __name__ == '__main__': + d = ModelNetDataset(root = '../data/modelnet40_normal_resampled', split='test') + print(d.shuffle) + print(len(d)) + import time + tic = time.time() + for i in range(10): + ps, cls = d[i] + print(time.time() - tic) + print(ps.shape, type(ps), cls) + + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/SimpleView/pointnet2_tf/modelnet_h5_dataset.py b/zoo/SimpleView/pointnet2_tf/modelnet_h5_dataset.py new file mode 100644 index 0000000..43800ff --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/modelnet_h5_dataset.py @@ -0,0 +1,121 @@ +''' + ModelNet dataset. Support ModelNet40, XYZ channels. Up to 2048 points. + Faster IO than ModelNetDataset in the first epoch. +''' + +import os +import sys +import numpy as np +import h5py +from .utils import provider + +# updated datapath +DATA_DIR = 'data' +if not os.path.exists(DATA_DIR): + os.mkdir(DATA_DIR) +if not os.path.exists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')): + www = 'https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip' + zipfile = os.path.basename(www) + os.system('wget %s; unzip %s' % (www, zipfile)) + os.system('mv %s %s' % (zipfile[:-4], DATA_DIR)) + os.system('rm %s' % (zipfile)) + + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename, 'r') + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) + + +class ModelNetH5Dataset(object): + def __init__(self, list_filename, batch_size = 32, npoints = 1024, shuffle=True): + self.list_filename = list_filename + self.batch_size = batch_size + self.npoints = npoints + self.shuffle = shuffle + self.h5_files = getDataFiles(self.list_filename) + self.reset() + + def reset(self): + ''' reset order of h5 files ''' + self.file_idxs = np.arange(0, len(self.h5_files)) + if self.shuffle: np.random.shuffle(self.file_idxs) + self.current_data = None + self.current_label = None + self.current_file_idx = 0 + self.batch_idx = 0 + + def _augment_batch_data(self, batch_data): + rotated_data = provider.rotate_point_cloud(batch_data) + rotated_data = provider.rotate_perturbation_point_cloud(rotated_data) + jittered_data = provider.random_scale_point_cloud(rotated_data[:,:,0:3]) + jittered_data = provider.shift_point_cloud(jittered_data) + jittered_data = provider.jitter_point_cloud(jittered_data) + rotated_data[:,:,0:3] = jittered_data + return provider.shuffle_points(rotated_data) + + + def _get_data_filename(self): + return self.h5_files[self.file_idxs[self.current_file_idx]] + + def _load_data_file(self, filename): + self.current_data,self.current_label = load_h5(filename) + self.current_label = np.squeeze(self.current_label) + self.batch_idx = 0 + if self.shuffle: + self.current_data, self.current_label, _ = shuffle_data(self.current_data,self.current_label) + + def _has_next_batch_in_file(self): + return self.batch_idx*self.batch_size < self.current_data.shape[0] + + def num_channel(self): + return 3 + + def has_next_batch(self): + # TODO: add backend thread to load data + if (self.current_data is None) or (not self._has_next_batch_in_file()): + if self.current_file_idx >= len(self.h5_files): + return False + self._load_data_file(self._get_data_filename()) + self.batch_idx = 0 + self.current_file_idx += 1 + return self._has_next_batch_in_file() + + def next_batch(self, augment=False): + ''' returned dimension may be smaller than self.batch_size ''' + start_idx = self.batch_idx * self.batch_size + end_idx = min((self.batch_idx+1) * self.batch_size, self.current_data.shape[0]) + bsize = end_idx - start_idx + batch_label = np.zeros((bsize), dtype=np.int32) + data_batch = self.current_data[start_idx:end_idx, 0:self.npoints, :].copy() + label_batch = self.current_label[start_idx:end_idx].copy() + self.batch_idx += 1 + if augment: data_batch = self._augment_batch_data(data_batch) + return data_batch, label_batch + +if __name__=='__main__': + d = ModelNetH5Dataset('data/modelnet40_ply_hdf5_2048/train_files.txt') + print(d.shuffle) + print(d.has_next_batch()) + ps_batch, cls_batch = d.next_batch(True) + print(ps_batch.shape) + print(cls_batch.shape) diff --git a/zoo/SimpleView/pointnet2_tf/models/pointnet2_cls_msg.py b/zoo/SimpleView/pointnet2_tf/models/pointnet2_cls_msg.py new file mode 100644 index 0000000..ca5fda3 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/models/pointnet2_cls_msg.py @@ -0,0 +1,56 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_sa_module_msg + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + + l0_xyz = point_cloud + l0_points = None + + # Set abstraction layers + l1_xyz, l1_points = pointnet_sa_module_msg(l0_xyz, l0_points, 512, [0.1,0.2,0.4], [16,32,128], [[32,32,64], [64,64,128], [64,96,128]], is_training, bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points = pointnet_sa_module_msg(l1_xyz, l1_points, 128, [0.2,0.4,0.8], [32,64,128], [[64,64,128], [128,128,256], [128,128,256]], is_training, bn_decay, scope='layer2') + l3_xyz, l3_points, _ = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.4, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.4, is_training=is_training, scope='dp2') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/SimpleView/pointnet2_tf/models/pointnet2_cls_ssg.py b/zoo/SimpleView/pointnet2_tf/models/pointnet2_cls_ssg.py new file mode 100644 index 0000000..c750c42 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/models/pointnet2_cls_ssg.py @@ -0,0 +1,61 @@ +""" + PointNet++ Model for point clouds classification +""" + +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Set abstraction layers + # Note: When using NCHW for layer 2, we see increased GPU memory usage (in TF1.4). + # So we only use NCHW for layer 1 until this issue can be resolved. + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1', use_nchw=True) + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Fully connected layers + net = tf.reshape(l3_points, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp2') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + output, _ = get_model(inputs, tf.constant(True)) + print(output) diff --git a/zoo/SimpleView/pointnet2_tf/models/pointnet2_part_seg.py b/zoo/SimpleView/pointnet2_tf/models/pointnet2_part_seg.py new file mode 100644 index 0000000..1f7b233 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/models/pointnet2_part_seg.py @@ -0,0 +1,57 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 6)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Part segmentation PointNet, input is BxNx6 (XYZ NormalX NormalY NormalZ), output Bx50 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = tf.slice(point_cloud, [0,0,3], [-1,-1,3]) + + # Set Abstraction layers + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=512, radius=0.2, nsample=64, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=128, radius=0.4, nsample=64, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Feature Propagation layers + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, tf.concat([l0_xyz,l0_points],axis=-1), l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer3') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, 50, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label): + """ pred: BxNxC, + label: BxN, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + net, _ = get_model(inputs, tf.constant(True)) + print(net) diff --git a/zoo/SimpleView/pointnet2_tf/models/pointnet2_part_seg_msg_one_hot.py b/zoo/SimpleView/pointnet2_tf/models/pointnet2_part_seg_msg_one_hot.py new file mode 100644 index 0000000..27027ad --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/models/pointnet2_part_seg_msg_one_hot.py @@ -0,0 +1,66 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_sa_module_msg, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 6)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + cls_labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl, cls_labels_pl + +NUM_CATEGORIES = 16 + +def get_model(point_cloud, cls_label, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = tf.slice(point_cloud, [0,0,0], [-1,-1,3]) + l0_points = tf.slice(point_cloud, [0,0,3], [-1,-1,3]) + + # Set abstraction layers + l1_xyz, l1_points = pointnet_sa_module_msg(l0_xyz, l0_points, 512, [0.1,0.2,0.4], [32,64,128], [[32,32,64], [64,64,128], [64,96,128]], is_training, bn_decay, scope='layer1') + l2_xyz, l2_points = pointnet_sa_module_msg(l1_xyz, l1_points, 128, [0.4,0.8], [64,128], [[128,128,256],[128,196,256]], is_training, bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=None, radius=None, nsample=None, mlp=[256,512,1024], mlp2=None, group_all=True, is_training=is_training, bn_decay=bn_decay, scope='layer3') + + # Feature propagation layers + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer2') + + cls_label_one_hot = tf.one_hot(cls_label, depth=NUM_CATEGORIES, on_value=1.0, off_value=0.0) + cls_label_one_hot = tf.reshape(cls_label_one_hot, [batch_size, 1, NUM_CATEGORIES]) + cls_label_one_hot = tf.tile(cls_label_one_hot, [1,num_point,1]) + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, tf.concat([cls_label_one_hot, l0_xyz, l0_points],axis=-1), l1_points, [128,128], is_training, bn_decay, scope='fp_layer3') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, 50, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label): + """ pred: BxNxC, + label: BxN, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,6)) + cls_labels = tf.zeros((32),dtype=tf.int32) + output, ep = get_model(inputs, cls_labels, tf.constant(True)) + print(output) diff --git a/zoo/SimpleView/pointnet2_tf/models/pointnet2_sem_seg.py b/zoo/SimpleView/pointnet2_tf/models/pointnet2_sem_seg.py new file mode 100644 index 0000000..de88528 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/models/pointnet2_sem_seg.py @@ -0,0 +1,61 @@ +import os +import sys +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tensorflow as tf +import numpy as np +import tf_util +from pointnet_util import pointnet_sa_module, pointnet_fp_module + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size, num_point)) + smpws_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point)) + return pointclouds_pl, labels_pl, smpws_pl + + +def get_model(point_cloud, is_training, num_class, bn_decay=None): + """ Semantic segmentation PointNet, input is BxNx3, output Bxnum_class """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + l0_xyz = point_cloud + l0_points = None + end_points['l0_xyz'] = l0_xyz + + # Layer 1 + l1_xyz, l1_points, l1_indices = pointnet_sa_module(l0_xyz, l0_points, npoint=1024, radius=0.1, nsample=32, mlp=[32,32,64], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer1') + l2_xyz, l2_points, l2_indices = pointnet_sa_module(l1_xyz, l1_points, npoint=256, radius=0.2, nsample=32, mlp=[64,64,128], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer2') + l3_xyz, l3_points, l3_indices = pointnet_sa_module(l2_xyz, l2_points, npoint=64, radius=0.4, nsample=32, mlp=[128,128,256], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer3') + l4_xyz, l4_points, l4_indices = pointnet_sa_module(l3_xyz, l3_points, npoint=16, radius=0.8, nsample=32, mlp=[256,256,512], mlp2=None, group_all=False, is_training=is_training, bn_decay=bn_decay, scope='layer4') + + # Feature Propagation layers + l3_points = pointnet_fp_module(l3_xyz, l4_xyz, l3_points, l4_points, [256,256], is_training, bn_decay, scope='fa_layer1') + l2_points = pointnet_fp_module(l2_xyz, l3_xyz, l2_points, l3_points, [256,256], is_training, bn_decay, scope='fa_layer2') + l1_points = pointnet_fp_module(l1_xyz, l2_xyz, l1_points, l2_points, [256,128], is_training, bn_decay, scope='fa_layer3') + l0_points = pointnet_fp_module(l0_xyz, l1_xyz, l0_points, l1_points, [128,128,128], is_training, bn_decay, scope='fa_layer4') + + # FC layers + net = tf_util.conv1d(l0_points, 128, 1, padding='VALID', bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) + end_points['feats'] = net + net = tf_util.dropout(net, keep_prob=0.5, is_training=is_training, scope='dp1') + net = tf_util.conv1d(net, num_class, 1, padding='VALID', activation_fn=None, scope='fc2') + + return net, end_points + + +def get_loss(pred, label, smpw): + """ pred: BxNxC, + label: BxN, + smpw: BxN """ + classify_loss = tf.losses.sparse_softmax_cross_entropy(labels=label, logits=pred, weights=smpw) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,2048,3)) + net, _ = get_model(inputs, tf.constant(True), 10) + print(net) diff --git a/zoo/SimpleView/pointnet2_tf/models/pointnet_cls_basic.py b/zoo/SimpleView/pointnet2_tf/models/pointnet_cls_basic.py new file mode 100644 index 0000000..a668c37 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/models/pointnet_cls_basic.py @@ -0,0 +1,81 @@ +''' + PointNet version 1 Model + Reference: https://github.com/charlesq34/pointnet +''' +import tensorflow as tf +import numpy as np +import math +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../utils')) +import tf_util + +def placeholder_inputs(batch_size, num_point): + pointclouds_pl = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3)) + labels_pl = tf.placeholder(tf.int32, shape=(batch_size)) + return pointclouds_pl, labels_pl + + +def get_model(point_cloud, is_training, bn_decay=None): + """ Classification PointNet, input is BxNx3, output Bx40 """ + batch_size = point_cloud.get_shape()[0].value + num_point = point_cloud.get_shape()[1].value + end_points = {} + input_image = tf.expand_dims(point_cloud, -1) + + # Point functions (MLP implemented as conv2d) + net = tf_util.conv2d(input_image, 64, [1,3], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv1', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv2', bn_decay=bn_decay) + net = tf_util.conv2d(net, 64, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv3', bn_decay=bn_decay) + net = tf_util.conv2d(net, 128, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv4', bn_decay=bn_decay) + net = tf_util.conv2d(net, 1024, [1,1], + padding='VALID', stride=[1,1], + bn=True, is_training=is_training, + scope='conv5', bn_decay=bn_decay) + + # Symmetric function: max pooling + net = tf_util.max_pool2d(net, [num_point,1], + padding='VALID', scope='maxpool') + + # MLP on global point cloud vector + net = tf.reshape(net, [batch_size, -1]) + net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, + scope='fc1', bn_decay=bn_decay) + net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training, + scope='fc2', bn_decay=bn_decay) + net = tf_util.dropout(net, keep_prob=0.7, is_training=is_training, + scope='dp1') + net = tf_util.fully_connected(net, 40, activation_fn=None, scope='fc3') + + return net, end_points + + +def get_loss(pred, label, end_points): + """ pred: B*NUM_CLASSES, + label: B, """ + loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) + classify_loss = tf.reduce_mean(loss) + tf.summary.scalar('classify loss', classify_loss) + tf.add_to_collection('losses', classify_loss) + return classify_loss + + +if __name__=='__main__': + with tf.Graph().as_default(): + inputs = tf.zeros((32,1024,3)) + outputs = get_model(inputs, tf.constant(True)) + print(outputs) diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/command.sh b/zoo/SimpleView/pointnet2_tf/part_seg/command.sh new file mode 100644 index 0000000..a470274 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/command.sh @@ -0,0 +1 @@ +python train.py --model pointnet2_part_seg --log_dir log --gpu 1 --max_epoch 201 > log.txt 2>&1 & diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/command_one_hot.sh b/zoo/SimpleView/pointnet2_tf/part_seg/command_one_hot.sh new file mode 100644 index 0000000..09c3630 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/command_one_hot.sh @@ -0,0 +1 @@ +python train_one_hot.py --batch_size 8 --model pointnet2_part_seg_msg_one_hot --log_dir log_msg_one_hot --gpu 0 --max_epoch 201 > log_msg_one_hot.txt 2>&1 & diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/evaluate.py b/zoo/SimpleView/pointnet2_tf/part_seg/evaluate.py new file mode 100644 index 0000000..9aafe73 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/evaluate.py @@ -0,0 +1,196 @@ +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import tf_util +import part_dataset_all_normal + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_part_seg', help='Model name [default: pointnet2_part_seg]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +parser.add_argument('--log_dir', default='log_eval', help='Log dir [default: log_eval]') +parser.add_argument('--num_point', type=int, default=2048, help='Point Number [default: 2048]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +FLAGS = parser.parse_args() + + +VOTE_NUM = 12 + + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +GPU_INDEX = FLAGS.gpu + +MODEL_PATH = FLAGS.model_path +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') +NUM_CLASSES = 50 + +# Shapenet official train/test split +DATA_PATH = os.path.join(ROOT_DIR, 'data', 'shapenetcore_partanno_segmentation_benchmark_v0_normal') +TEST_DATASET = part_dataset_all_normal.PartNormalDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, split='test') + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def evaluate(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print is_training_pl + + print "--- Get model and loss" + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + loss = MODEL.get_loss(pred, labels_pl) + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + sess = tf.Session(config=config) + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + + eval_one_epoch(sess, ops) + +def get_batch(dataset, idxs, start_idx, end_idx): + bsize = end_idx-start_idx + batch_data = np.zeros((bsize, NUM_POINT, 6)) + batch_label = np.zeros((bsize, NUM_POINT), dtype=np.int32) + for i in range(bsize): + ps,normal,seg = dataset[idxs[i+start_idx]] + batch_data[i,:,0:3] = ps + batch_data[i,:,3:6] = normal + batch_label[i,:] = seg + return batch_data, batch_label + +def eval_one_epoch(sess, ops): + """ ops: dict mapping from string to tf ops """ + is_training = False + test_idxs = np.arange(0, len(TEST_DATASET)) + # Test on all data: last batch might be smaller than BATCH_SIZE + num_batches = (len(TEST_DATASET)+BATCH_SIZE-1)/BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + seg_classes = TEST_DATASET.seg_classes + shape_ious = {cat:[] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + batch_data = np.zeros((BATCH_SIZE, NUM_POINT, 6)) + batch_label = np.zeros((BATCH_SIZE, NUM_POINT)).astype(np.int32) + for batch_idx in range(num_batches): + if batch_idx %20==0: + log_string('%03d/%03d'%(batch_idx, num_batches)) + start_idx = batch_idx * BATCH_SIZE + end_idx = min(len(TEST_DATASET), (batch_idx+1) * BATCH_SIZE) + cur_batch_size = end_idx-start_idx + cur_batch_data, cur_batch_label = get_batch(TEST_DATASET, test_idxs, start_idx, end_idx) + if cur_batch_size == BATCH_SIZE: + batch_data = cur_batch_data + batch_label = cur_batch_label + else: + batch_data[0:cur_batch_size] = cur_batch_data + batch_label[0:cur_batch_size] = cur_batch_label + + # --------------------------------------------------------------------- + loss_val = 0 + pred_val = np.zeros((BATCH_SIZE, NUM_POINT, NUM_CLASSES)) + for _ in range(VOTE_NUM): + feed_dict = {ops['pointclouds_pl']: batch_data, + ops['labels_pl']: batch_label, + ops['is_training_pl']: is_training} + temp_loss_val, temp_pred_val = sess.run([ops['loss'], ops['pred']], feed_dict=feed_dict) + loss_val += temp_loss_val + pred_val += temp_pred_val + loss_val /= float(VOTE_NUM) + # --------------------------------------------------------------------- + + # Select valid data + cur_pred_val = pred_val[0:cur_batch_size] + # Constrain pred to the groundtruth classes (selected by seg_classes[cat]) + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + for i in range(cur_batch_size): + cat = seg_label_to_cat[cur_batch_label[i,0]] + logits = cur_pred_val_logits[i,:,:] + cur_pred_val[i,:] = np.argmax(logits[:,seg_classes[cat]], 1) + seg_classes[cat][0] + correct = np.sum(cur_pred_val == cur_batch_label) + total_correct += correct + total_seen += (cur_batch_size*NUM_POINT) + if cur_batch_size==BATCH_SIZE: + loss_sum += loss_val + for l in range(NUM_CLASSES): + total_seen_class[l] += np.sum(cur_batch_label==l) + total_correct_class[l] += (np.sum((cur_pred_val==l) & (cur_batch_label==l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i,:] + segl = cur_batch_label[i,:] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl==l) == 0) and (np.sum(segp==l) == 0): # part is not present, no prediction as well + part_ious[l-seg_classes[cat][0]] = 1.0 + else: + part_ious[l-seg_classes[cat][0]] = np.sum((segl==l) & (segp==l)) / float(np.sum((segl==l) | (segp==l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + print len(all_shape_ious) + mean_shape_ious = np.mean(shape_ious.values()) + log_string('eval mean loss: %f' % (loss_sum / float(len(TEST_DATASET)/BATCH_SIZE))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s:\t %f'%(cat, shape_ious[cat])) + log_string('eval mean mIoU: %f' % (mean_shape_ious)) + log_string('eval mean mIoU (all shapes): %f' % (np.mean(all_shape_ious))) + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + evaluate() + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/part_dataset.py b/zoo/SimpleView/pointnet2_tf/part_seg/part_dataset.py new file mode 100644 index 0000000..707fb5d --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/part_dataset.py @@ -0,0 +1,131 @@ +''' + Dataset for shapenet part segmentaion. +''' + +import os +import os.path +import json +import numpy as np +import sys + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class PartDataset(): + def __init__(self, root, npoints = 2500, classification = False, class_choice = None, split='train', normalize=True): + self.npoints = npoints + self.root = root + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + + self.classification = classification + self.normalize = normalize + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + #print(self.cat) + if not class_choice is None: + self.cat = {k:v for k,v in self.cat.items() if k in class_choice} + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + #print('category', item) + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item], 'points') + dir_seg = os.path.join(self.root, self.cat[item], 'points_label') + #print(dir_point, dir_seg) + fns = sorted(os.listdir(dir_point)) + #print(fns[0][0:-4]) + if split=='trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split=='train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split=='val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split=='test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..'%(split)) + exit(-1) + + #print(os.path.basename(fns)) + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append((os.path.join(dir_point, token + '.pts'), os.path.join(dir_seg, token + '.seg'))) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn[0], fn[1])) + + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + self.num_seg_classes = 0 + if not self.classification: + for i in range(len(self.datapath)/50): + l = len(np.unique(np.loadtxt(self.datapath[i][-1]).astype(np.uint8))) + if l > self.num_seg_classes: + self.num_seg_classes = l + #print(self.num_seg_classes) + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 10000 + + def __getitem__(self, index): + if index in self.cache: + point_set, seg, cls = self.cache[index] + else: + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + cls = np.array([cls]).astype(np.int32) + point_set = np.loadtxt(fn[1]).astype(np.float32) + if self.normalize: + point_set = pc_normalize(point_set) + seg = np.loadtxt(fn[2]).astype(np.int64) - 1 + #print(point_set.shape, seg.shape) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, seg, cls) + + + choice = np.random.choice(len(seg), self.npoints, replace=True) + #resample + point_set = point_set[choice, :] + seg = seg[choice] + if self.classification: + return point_set, cls + else: + return point_set, seg + + def __len__(self): + return len(self.datapath) + + +if __name__ == '__main__': + d = PartDataset(root = '../data/shapenetcore_partanno_segmentation_benchmark_v0', class_choice = ['Airplane'], split='test') + print(len(d)) + import time + tic = time.time() + for i in range(100): + ps, seg = d[i] + print np.max(seg), np.min(seg) + print(time.time() - tic) + print(ps.shape, type(ps), seg.shape,type(seg)) + + d = PartDataset(root = '../data/shapenetcore_partanno_segmentation_benchmark_v0', classification = True) + print(len(d)) + ps, cls = d[0] + print(ps.shape, type(ps), cls.shape,type(cls)) + diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/part_dataset_all_normal.py b/zoo/SimpleView/pointnet2_tf/part_seg/part_dataset_all_normal.py new file mode 100644 index 0000000..e77fd22 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/part_dataset_all_normal.py @@ -0,0 +1,138 @@ +''' + Dataset for ShapeNetPart segmentation +''' + +import os +import os.path +import json +import numpy as np +import sys + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class PartNormalDataset(): + def __init__(self, root, npoints = 2500, classification = False, split='train', normalize=True, return_cls_label = False): + self.npoints = npoints + self.root = root + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + + self.classification = classification + self.normalize = normalize + self.return_cls_label = return_cls_label + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k:v for k,v in self.cat.items()} + #print(self.cat) + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + #print('category', item) + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + #print(fns[0][0:-4]) + if split=='trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split=='train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split=='val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split=='test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..'%(split)) + exit(-1) + + #print(os.path.basename(fns)) + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + for cat in sorted(self.seg_classes.keys()): + print(cat, self.seg_classes[cat]) + + self.cache = {} # from index to (point_set, cls, seg) tuple + self.cache_size = 20000 + + def __getitem__(self, index): + if index in self.cache: + point_set, normal, seg, cls = self.cache[index] + else: + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int32) + data = np.loadtxt(fn[1]).astype(np.float32) + point_set = data[:,0:3] + if self.normalize: + point_set = pc_normalize(point_set) + normal = data[:,3:6] + seg = data[:,-1].astype(np.int32) + if len(self.cache) < self.cache_size: + self.cache[index] = (point_set, normal, seg, cls) + + + choice = np.random.choice(len(seg), self.npoints, replace=True) + #resample + point_set = point_set[choice, :] + seg = seg[choice] + normal = normal[choice,:] + if self.classification: + return point_set, normal, cls + else: + if self.return_cls_label: + return point_set, normal, seg, cls + else: + return point_set, normal, seg + + def __len__(self): + return len(self.datapath) + + +if __name__ == '__main__': + d = PartNormalDataset(root = '../data/shapenetcore_partanno_segmentation_benchmark_v0_normal', split='trainval', npoints=3000) + print(len(d)) + + i = 500 + ps, normal, seg = d[i] + print d.datapath[i] + print np.max(seg), np.min(seg) + print(ps.shape, seg.shape, normal.shape) + print ps + print normal + + sys.path.append('../utils') + import show3d_balls + show3d_balls.showpoints(ps, normal+1, ballradius=8) + + d = PartNormalDataset(root = '../data/shapenetcore_partanno_segmentation_benchmark_v0_normal', classification = True) + print(len(d)) + ps, normal, cls = d[0] + print(ps.shape, type(ps), cls.shape,type(cls)) + diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/test.py b/zoo/SimpleView/pointnet2_tf/part_seg/test.py new file mode 100644 index 0000000..d29eed1 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/test.py @@ -0,0 +1,85 @@ +import tensorflow as tf +import numpy as np +import argparse +import socket +import importlib +import time +import os +import scipy.misc +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, 'models')) +sys.path.append(os.path.join(BASE_DIR, 'utils')) +import provider +import show3d_balls +sys.path.append(os.path.join(ROOT_DIR, 'data_prep')) +import part_dataset + + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--num_point', type=int, default=2048, help='Point Number [default: 2048]') +parser.add_argument('--category', default='Airplane', help='Which single class to train on [default: Airplane]') +parser.add_argument('--model', default='pointnet2_part_seg', help='Model name [default: pointnet2_part_seg]') +parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]') +FLAGS = parser.parse_args() + + +MODEL_PATH = FLAGS.model_path +GPU_INDEX = FLAGS.gpu +NUM_POINT = FLAGS.num_point +MODEL = importlib.import_module(FLAGS.model) # import network module +NUM_CLASSES = 4 +DATA_PATH = os.path.join(ROOT_DIR, 'data', 'shapenetcore_partanno_segmentation_benchmark_v0_normal') +TEST_DATASET = part_dataset.PartDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, class_choice=FLAGS.category, split='test') + +def get_model(batch_size, num_point): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(batch_size, num_point) + is_training_pl = tf.placeholder(tf.bool, shape=()) + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl) + loss = MODEL.get_loss(pred, labels_pl, end_points) + saver = tf.train.Saver() + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + sess = tf.Session(config=config) + # Restore variables from disk. + saver.restore(sess, MODEL_PATH) + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss} + return sess, ops + +def inference(sess, ops, pc, batch_size): + ''' pc: BxNx3 array, return BxN pred ''' + assert pc.shape[0]%batch_size == 0 + num_batches = pc.shape[0]/batch_size + logits = np.zeros((pc.shape[0], pc.shape[1], NUM_CLASSES)) + for i in range(num_batches): + feed_dict = {ops['pointclouds_pl']: pc[i*batch_size:(i+1)*batch_size,...], + ops['is_training_pl']: False} + batch_logits = sess.run(ops['pred'], feed_dict=feed_dict) + logits[i*batch_size:(i+1)*batch_size,...] = batch_logits + return np.argmax(logits, 2) + +if __name__=='__main__': + + import matplotlib.pyplot as plt + cmap = plt.cm.get_cmap("hsv", 4) + cmap = np.array([cmap(i) for i in range(10)])[:,:3] + + for i in range(len(TEST_DATASET)): + ps, seg = TEST_DATASET[i] + sess, ops = get_model(batch_size=1, num_point=ps.shape[0]) + segp = inference(sess, ops, np.expand_dims(ps,0), batch_size=1) + segp = segp.squeeze() + + gt = cmap[seg, :] + pred = cmap[segp, :] + show3d_balls.showpoints(ps, gt, pred, ballradius=8) diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/train.py b/zoo/SimpleView/pointnet2_tf/part_seg/train.py new file mode 100644 index 0000000..1803458 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/train.py @@ -0,0 +1,323 @@ +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import part_dataset_all_normal + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='model', help='Model name [default: model]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=2048, help='Point Number [default: 2048]') +parser.add_argument('--max_epoch', type=int, default=201, help='Epoch to run [default: 201]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 50 + +# Shapenet official train/test split +DATA_PATH = os.path.join(ROOT_DIR, 'data', 'shapenetcore_partanno_segmentation_benchmark_v0_normal') +TRAIN_DATASET = part_dataset_all_normal.PartNormalDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, split='trainval') +TEST_DATASET = part_dataset_all_normal.PartNormalDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, split='test') + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + print "--- Get model and loss" + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + loss = MODEL.get_loss(pred, labels_pl) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 2), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE*NUM_POINT) + tf.summary.scalar('accuracy', accuracy) + + print "--- Get training operator" + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + +def get_batch(dataset, idxs, start_idx, end_idx): + bsize = end_idx-start_idx + batch_data = np.zeros((bsize, NUM_POINT, 6)) + batch_label = np.zeros((bsize, NUM_POINT), dtype=np.int32) + for i in range(bsize): + ps,normal,seg = dataset[idxs[i+start_idx]] + batch_data[i,:,0:3] = ps + batch_data[i,:,3:6] = normal + batch_label[i,:] = seg + return batch_data, batch_label + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + # Shuffle train samples + train_idxs = np.arange(0, len(TRAIN_DATASET)) + np.random.shuffle(train_idxs) + num_batches = len(TRAIN_DATASET)/BATCH_SIZE + + log_string(str(datetime.now())) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + batch_data, batch_label = get_batch(TRAIN_DATASET, train_idxs, start_idx, end_idx) + # Augment batched point clouds by rotation and jittering + #aug_data = batch_data + #aug_data = provider.random_scale_point_cloud(batch_data) + batch_data[:,:,0:3] = provider.jitter_point_cloud(batch_data[:,:,0:3]) + feed_dict = {ops['pointclouds_pl']: batch_data, + ops['labels_pl']: batch_label, + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 2) + correct = np.sum(pred_val == batch_label) + total_correct += correct + total_seen += (BATCH_SIZE*NUM_POINT) + loss_sum += loss_val + + if (batch_idx+1)%10 == 0: + log_string(' -- %03d / %03d --' % (batch_idx+1, num_batches)) + log_string('mean loss: %f' % (loss_sum / 10)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + test_idxs = np.arange(0, len(TEST_DATASET)) + # Test on all data: last batch might be smaller than BATCH_SIZE + num_batches = (len(TEST_DATASET)+BATCH_SIZE-1)/BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + seg_classes = TEST_DATASET.seg_classes + shape_ious = {cat:[] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + batch_data = np.zeros((BATCH_SIZE, NUM_POINT, 3)) + batch_label = np.zeros((BATCH_SIZE, NUM_POINT)).astype(np.int32) + for batch_idx in range(num_batches): + if batch_idx %20==0: + log_string('%03d/%03d'%(batch_idx, num_batches)) + start_idx = batch_idx * BATCH_SIZE + end_idx = min(len(TEST_DATASET), (batch_idx+1) * BATCH_SIZE) + cur_batch_size = end_idx-start_idx + cur_batch_data, cur_batch_label = get_batch(TEST_DATASET, test_idxs, start_idx, end_idx) + if cur_batch_size == BATCH_SIZE: + batch_data = cur_batch_data + batch_label = cur_batch_label + else: + batch_data[0:cur_batch_size] = cur_batch_data + batch_label[0:cur_batch_size] = cur_batch_label + + # --------------------------------------------------------------------- + feed_dict = {ops['pointclouds_pl']: batch_data, + ops['labels_pl']: batch_label, + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + # --------------------------------------------------------------------- + + # Select valid data + cur_pred_val = pred_val[0:cur_batch_size] + # Constrain pred to the groundtruth classes (selected by seg_classes[cat]) + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + for i in range(cur_batch_size): + cat = seg_label_to_cat[cur_batch_label[i,0]] + logits = cur_pred_val_logits[i,:,:] + cur_pred_val[i,:] = np.argmax(logits[:,seg_classes[cat]], 1) + seg_classes[cat][0] + correct = np.sum(cur_pred_val == cur_batch_label) + total_correct += correct + total_seen += (cur_batch_size*NUM_POINT) + if cur_batch_size==BATCH_SIZE: + loss_sum += loss_val + for l in range(NUM_CLASSES): + total_seen_class[l] += np.sum(cur_batch_label==l) + total_correct_class[l] += (np.sum((cur_pred_val==l) & (cur_batch_label==l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i,:] + segl = cur_batch_label[i,:] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl==l) == 0) and (np.sum(segp==l) == 0): # part is not present, no prediction as well + part_ious[l-seg_classes[cat][0]] = 1.0 + else: + part_ious[l-seg_classes[cat][0]] = np.sum((segl==l) & (segp==l)) / float(np.sum((segl==l) | (segp==l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(shape_ious.values()) + log_string('eval mean loss: %f' % (loss_sum / float(len(TEST_DATASET)/BATCH_SIZE))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s:\t %f'%(cat, shape_ious[cat])) + log_string('eval mean mIoU: %f' % (mean_shape_ious)) + log_string('eval mean mIoU (all shapes): %f' % (np.mean(all_shape_ious))) + + EPOCH_CNT += 1 + return total_correct/float(total_seen) + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/part_seg/train_one_hot.py b/zoo/SimpleView/pointnet2_tf/part_seg/train_one_hot.py new file mode 100644 index 0000000..b2bb5aa --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/part_seg/train_one_hot.py @@ -0,0 +1,333 @@ +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import part_dataset_all_normal + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='model', help='Model name [default: model]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=2048, help='Point Number [default: 2048]') +parser.add_argument('--max_epoch', type=int, default=201, help='Epoch to run [default: 201]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=16881*20, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.5, help='Decay rate for lr decay [default: 0.7]') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 50 + +# Shapenet official train/test split +DATA_PATH = os.path.join(ROOT_DIR, 'data', 'shapenetcore_partanno_segmentation_benchmark_v0_normal') +TRAIN_DATASET = part_dataset_all_normal.PartNormalDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, split='trainval', return_cls_label=True) +TEST_DATASET = part_dataset_all_normal.PartNormalDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, split='test', return_cls_label=True) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, cls_labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print is_training_pl + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + print "--- Get model and loss" + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, cls_labels_pl, is_training_pl, bn_decay=bn_decay) + loss = MODEL.get_loss(pred, labels_pl) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 2), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE*NUM_POINT) + tf.summary.scalar('accuracy', accuracy) + + print "--- Get training operator" + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + #sess.run(init, {is_training_pl: True}) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'cls_labels_pl': cls_labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + +def get_batch(dataset, idxs, start_idx, end_idx): + bsize = end_idx-start_idx + batch_data = np.zeros((bsize, NUM_POINT, 6)) + batch_label = np.zeros((bsize, NUM_POINT), dtype=np.int32) + batch_cls_label = np.zeros((bsize,), dtype=np.int32) + for i in range(bsize): + ps,normal,seg,cls = dataset[idxs[i+start_idx]] + batch_data[i,:,0:3] = ps + batch_data[i,:,3:6] = normal + batch_label[i,:] = seg + batch_cls_label[i] = cls + return batch_data, batch_label, batch_cls_label + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + # Shuffle train samples + train_idxs = np.arange(0, len(TRAIN_DATASET)) + np.random.shuffle(train_idxs) + num_batches = len(TRAIN_DATASET)/BATCH_SIZE + + log_string(str(datetime.now())) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + batch_data, batch_label, batch_cls_label = get_batch(TRAIN_DATASET, train_idxs, start_idx, end_idx) + # Augment batched point clouds by rotation and jittering + #aug_data = batch_data + #aug_data = provider.random_scale_point_cloud(batch_data) + batch_data[:,:,0:3] = provider.jitter_point_cloud(batch_data[:,:,0:3]) + feed_dict = {ops['pointclouds_pl']: batch_data, + ops['labels_pl']: batch_label, + ops['cls_labels_pl']: batch_cls_label, + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 2) + correct = np.sum(pred_val == batch_label) + total_correct += correct + total_seen += (BATCH_SIZE*NUM_POINT) + loss_sum += loss_val + + if (batch_idx+1)%10 == 0: + log_string(' -- %03d / %03d --' % (batch_idx+1, num_batches)) + log_string('mean loss: %f' % (loss_sum / 10)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + + + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + test_idxs = np.arange(0, len(TEST_DATASET)) + # Test on all data: last batch might be smaller than BATCH_SIZE + num_batches = (len(TEST_DATASET)+BATCH_SIZE-1)/BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + seg_classes = TEST_DATASET.seg_classes + shape_ious = {cat:[] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + batch_data = np.zeros((BATCH_SIZE, NUM_POINT, 3)) + batch_label = np.zeros((BATCH_SIZE, NUM_POINT)).astype(np.int32) + batch_cls_label = np.zeros((BATCH_SIZE,)).astype(np.int32) + for batch_idx in range(num_batches): + if batch_idx %20==0: + log_string('%03d/%03d'%(batch_idx, num_batches)) + start_idx = batch_idx * BATCH_SIZE + end_idx = min(len(TEST_DATASET), (batch_idx+1) * BATCH_SIZE) + cur_batch_size = end_idx-start_idx + cur_batch_data, cur_batch_label, cur_batch_cls_label = get_batch(TEST_DATASET, test_idxs, start_idx, end_idx) + if cur_batch_size == BATCH_SIZE: + batch_data = cur_batch_data + batch_label = cur_batch_label + batch_cls_label = cur_batch_cls_label + else: + batch_data[0:cur_batch_size] = cur_batch_data + batch_label[0:cur_batch_size] = cur_batch_label + batch_cls_label[0:cur_batch_size] = cur_batch_cls_label + + # --------------------------------------------------------------------- + feed_dict = {ops['pointclouds_pl']: batch_data, + ops['labels_pl']: batch_label, + ops['cls_labels_pl']: batch_cls_label, + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + # --------------------------------------------------------------------- + + # Select valid data + cur_pred_val = pred_val[0:cur_batch_size] + # Constrain pred to the groundtruth classes (selected by seg_classes[cat]) + cur_pred_val_logits = cur_pred_val + cur_pred_val = np.zeros((cur_batch_size, NUM_POINT)).astype(np.int32) + for i in range(cur_batch_size): + cat = seg_label_to_cat[cur_batch_label[i,0]] + logits = cur_pred_val_logits[i,:,:] + cur_pred_val[i,:] = np.argmax(logits[:,seg_classes[cat]], 1) + seg_classes[cat][0] + correct = np.sum(cur_pred_val == cur_batch_label) + total_correct += correct + total_seen += (cur_batch_size*NUM_POINT) + if cur_batch_size==BATCH_SIZE: + loss_sum += loss_val + for l in range(NUM_CLASSES): + total_seen_class[l] += np.sum(cur_batch_label==l) + total_correct_class[l] += (np.sum((cur_pred_val==l) & (cur_batch_label==l))) + + for i in range(cur_batch_size): + segp = cur_pred_val[i,:] + segl = cur_batch_label[i,:] + cat = seg_label_to_cat[segl[0]] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if (np.sum(segl==l) == 0) and (np.sum(segp==l) == 0): # part is not present, no prediction as well + part_ious[l-seg_classes[cat][0]] = 1.0 + else: + part_ious[l-seg_classes[cat][0]] = np.sum((segl==l) & (segp==l)) / float(np.sum((segl==l) | (segp==l))) + shape_ious[cat].append(np.mean(part_ious)) + + all_shape_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + all_shape_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_shape_ious = np.mean(shape_ious.values()) + log_string('eval mean loss: %f' % (loss_sum / float(len(TEST_DATASET)/BATCH_SIZE))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + for cat in sorted(shape_ious.keys()): + log_string('eval mIoU of %s:\t %f'%(cat, shape_ious[cat])) + log_string('eval mean mIoU: %f' % (mean_shape_ious)) + log_string('eval mean mIoU (all shapes): %f' % (np.mean(all_shape_ious))) + + EPOCH_CNT += 1 + return total_correct/float(total_seen) + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/scannet/README.md b/zoo/SimpleView/pointnet2_tf/scannet/README.md new file mode 100644 index 0000000..2edfe7d --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/README.md @@ -0,0 +1,9 @@ +### ScanNet Data + +Original dataset website: http://www.scan-net.org/ + +You can get our preprocessed data at here (1.72GB) and refer to the code in `scannet_util.py` for data loading. Note that the virtual scan data is generated on the fly from our preprocessed data. + +Some code we used for scannet preprocessing is also included in `preprocessing` folder. You have to download the original ScanNet data and make small modifications in paths in order to run them. + +Note: To use ScanNetV2 data, change the tsv file to `scannetv2-labels.combined.tsv` and also update `scannet_util.py` to read the raw class and NYU40 names in the right columns (shifted by 1 compared to the V1 tsv). diff --git a/zoo/SimpleView/pointnet2_tf/scannet/pc_util.py b/zoo/SimpleView/pointnet2_tf/scannet/pc_util.py new file mode 100644 index 0000000..4594f40 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/pc_util.py @@ -0,0 +1,379 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- +def point_cloud_label_to_surface_voxel_label(point_cloud, label, res=0.0484): + coordmax = np.max(point_cloud,axis=0) + coordmin = np.min(point_cloud,axis=0) + nvox = np.ceil((coordmax-coordmin)/res) + vidx = np.ceil((point_cloud-coordmin)/res) + vidx = vidx[:,0]+vidx[:,1]*nvox[0]+vidx[:,2]*nvox[0]*nvox[1] + uvidx = np.unique(vidx) + if label.ndim==1: + uvlabel = [np.argmax(np.bincount(label[vidx==uv].astype(np.uint32))) for uv in uvidx] + else: + assert(label.ndim==2) + uvlabel = np.zeros(len(uvidx),label.shape[1]) + for i in range(label.shape[1]): + uvlabel[:,i] = np.array([np.argmax(np.bincount(label[vidx==uv,i].astype(np.uint32))) for uv in uvidx]) + return uvidx, uvlabel, nvox + +def point_cloud_label_to_surface_voxel_label_fast(point_cloud, label, res=0.0484): + coordmax = np.max(point_cloud,axis=0) + coordmin = np.min(point_cloud,axis=0) + nvox = np.ceil((coordmax-coordmin)/res) + vidx = np.ceil((point_cloud-coordmin)/res) + vidx = vidx[:,0]+vidx[:,1]*nvox[0]+vidx[:,2]*nvox[0]*nvox[1] + uvidx, vpidx = np.unique(vidx,return_index=True) + if label.ndim==1: + uvlabel = label[vpidx] + else: + assert(label.ndim==2) + uvlabel = label[vpidx,:] + return uvidx, uvlabel, nvox + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +def point_cloud_to_volume_v2_batch(point_clouds, vsize=12, radius=1.0, num_sample=128): + """ Input is BxNx3 a batch of point cloud + Output is BxVxVxVxnum_samplex3 + Added on Feb 19 + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume_v2(point_clouds[b,:,:], vsize, radius, num_sample) + vol_list.append(np.expand_dims(vol, 0)) + return np.concatenate(vol_list, 0) + +def point_cloud_to_volume_v2(points, vsize, radius=1.0, num_sample=128): + """ input is Nx3 points + output is vsize*vsize*vsize*num_sample*3 + assumes points are in range [-radius, radius] + samples num_sample points in each voxel, if there are less than + num_sample points, replicate the points + Added on Feb 19 + """ + vol = np.zeros((vsize,vsize,vsize,num_sample,3)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + loc2pc = {} + for n in range(points.shape[0]): + loc = tuple(locations[n,:]) + if loc not in loc2pc: + loc2pc[loc] = [] + loc2pc[loc].append(points[n,:]) + #print loc2pc + + for i in range(vsize): + for j in range(vsize): + for k in range(vsize): + if (i,j,k) not in loc2pc: + vol[i,j,k,:,:] = np.zeros((num_sample,3)) + else: + pc = loc2pc[(i,j,k)] # a list of (3,) arrays + pc = np.vstack(pc) # kx3 + # Sample/pad to num_sample points + if pc.shape[0]>num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0]num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0] 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + from PIL import Image + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + import matplotlib.pyplot as plt + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) + +def write_ply_color(points, labels, out_filename, num_classes=None): + """ Color (N,3) points with labels (N) within range 0 ~ num_classes-1 as OBJ file """ + import matplotlib.pyplot as pyplot + labels = labels.astype(int) + N = points.shape[0] + if num_classes is None: + num_classes = np.max(labels)+1 + else: + assert(num_classes>np.max(labels)) + fout = open(out_filename, 'w') + colors = [pyplot.cm.hsv(i/float(num_classes)) for i in range(num_classes)] + for i in range(N): + c = colors[labels[i]] + c = [int(x*255) for x in c] + fout.write('v %f %f %f %d %d %d\n' % (points[i,0],points[i,1],points[i,2],c[0],c[1],c[2])) + fout.close() + +def write_ply_rgb(points, colors, out_filename, num_classes=None): + """ Color (N,3) points with RGB colors (N,3) within range [0,255] as OBJ file """ + colors = colors.astype(int) + N = points.shape[0] + fout = open(out_filename, 'w') + for i in range(N): + c = colors[i,:] + fout.write('v %f %f %f %d %d %d\n' % (points[i,0],points[i,1],points[i,2],c[0],c[1],c[2])) + fout.close() diff --git a/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/collect_scannet_scenes.py b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/collect_scannet_scenes.py new file mode 100644 index 0000000..d648992 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/collect_scannet_scenes.py @@ -0,0 +1,102 @@ +import scannet_util + +CLASS_NAMES = scannet_util.g_label_names +RAW2SCANNET = scannet_util.g_raw2scannet + +import os +import json +import sys +import numpy as np +BASE_DIR = os.path.dirname(__file__) + +sys.path.append(BASE_DIR) +sys.path.append('../') +import pc_util + +SCANNET_DIR = 'scannet_clean_2' +SCENE_NAMES = [line.rstrip() for line in open('scannet_all.txt')] + +def collect_one_scene_data_label(scene_name, out_filename): + # Over-segmented segments: maps from segment to vertex/point IDs + data_folder = os.path.join(SCANNET_DIR, scene_name) + mesh_seg_filename = os.path.join(data_folder, '%s_vh_clean_2.0.010000.segs.json'%(scene_name)) + #print mesh_seg_filename + with open(mesh_seg_filename) as jsondata: + d = json.load(jsondata) + seg = d['segIndices'] + #print len(seg) + segid_to_pointid = {} + for i in range(len(seg)): + if seg[i] not in segid_to_pointid: + segid_to_pointid[seg[i]] = [] + segid_to_pointid[seg[i]].append(i) + + # Raw points in XYZRGBA + ply_filename = os.path.join(data_folder, '%s_vh_clean_2.ply' % (scene_name)) + points = pc_util.read_ply_xyzrgb(ply_filename) + log_string(str(points.shape)) + + # Instances over-segmented segment IDs: annotation on segments + instance_segids = [] + labels = [] + annotation_filename = os.path.join(data_folder, '%s.aggregation.json'%(scene_name)) + #print annotation_filename + with open(annotation_filename) as jsondata: + d = json.load(jsondata) + for x in d['segGroups']: + instance_segids.append(x['segments']) + labels.append(x['label']) + + #print len(instance_segids) + #print labels + + # Each instance's points + instance_points_list = [] + instance_labels_list = [] + semantic_labels_list = [] + for i in range(len(instance_segids)): + segids = instance_segids[i] + pointids = [] + for segid in segids: + pointids += segid_to_pointid[segid] + instance_points = points[np.array(pointids),:] + instance_points_list.append(instance_points) + instance_labels_list.append(np.ones((instance_points.shape[0], 1))*i) + if labels[i] not in RAW2SCANNET: + label = 'unannotated' + else: + label = RAW2SCANNET[labels[i]] + label = CLASS_NAMES.index(label) + semantic_labels_list.append(np.ones((instance_points.shape[0], 1))*label) + + # Refactor data format + scene_points = np.concatenate(instance_points_list, 0) + scene_points = scene_points[:,0:6] # XYZRGB, disregarding the A + instance_labels = np.concatenate(instance_labels_list, 0) + semantic_labels = np.concatenate(semantic_labels_list, 0) + data = np.concatenate((scene_points, instance_labels, semantic_labels), 1) + np.save(out_filename, data) + + +LOG_FOUT = open('log.txt','w') +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + + +if __name__=='__main__': + output_folder = 'scannet_scenes' + if not os.path.exists(output_folder): + os.mkdir(output_folder) + + for scene_name in SCENE_NAMES: + log_string(scene_name) + try: + out_filename = scene_name+'.npy' # scene0000_00.npy + collect_one_scene_data_label(scene_name, os.path.join(output_folder, out_filename)) + except Exception, e: + log_string(scene_name+'ERROR!!') + log_string(str(e)) + + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/demo.py b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/demo.py new file mode 100644 index 0000000..479e2da --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/demo.py @@ -0,0 +1,26 @@ +import sys +import os + +BASE_DIR = os.path.dirname(__file__) + +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, '../')) + +import numpy as np +import pc_util + +data = np.load('scannet_scenes/scene0001_01.npy') +scene_points = data[:,0:3] +colors = data[:,3:6] +instance_labels = data[:,6] +semantic_labels = data[:,7] + + +output_folder = 'demo_output' +if not os.path.exists(output_folder): + os.mkdir(output_folder) + +# Write scene as OBJ file for visualization +pc_util.write_ply_rgb(scene_points, colors, os.path.join(output_folder, 'scene.obj')) +pc_util.write_ply_color(scene_points, instance_labels, os.path.join(output_folder, 'scene_instance.obj')) +pc_util.write_ply_color(scene_points, semantic_labels, os.path.join(output_folder, 'scene_semantic.obj')) diff --git a/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/fetch_label_names.py b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/fetch_label_names.py new file mode 100644 index 0000000..852ae2e --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/fetch_label_names.py @@ -0,0 +1,24 @@ +''' scanning through annotation files for all the scenes to get a complete list of categories ''' + +import os +import json +scannet_dir = './scannet/' +scene_names = [line.rstrip() for line in open('scannet_all.txt')] + +labels = set() +for scene_name in scene_names: + path = os.path.join(scannet_dir, scene_name) + agg_filename = os.path.join(path, scene_name+'.aggregation.json') + with open(agg_filename) as jsondata: + d = json.load(jsondata) + for x in d['segGroups']: + labels.add(x['label']) + +fout = open('class_names.txt', 'w') +for label in list(labels): + print label + try: + fout.write(label+'\n') + except: + pass +fout.close() diff --git a/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/scannet-labels.combined.tsv b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/scannet-labels.combined.tsv new file mode 100644 index 0000000..0f3cc12 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/scannet-labels.combined.tsv @@ -0,0 +1,1164 @@ +category count nyuId nyu40id eigen13id nyuClass nyu40class eigen13class ModelNet40 ModelNet10 ShapeNetCore55 synsetoffset wnsynsetid wnsynsetkey +wall 7274 21 1 12 wall wall Wall n04546855 wall.n.01 +chair 5419 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +floor 3910 11 2 5 floor floor Floor n03365592 floor.n.01 +table 2664 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +door 1400 28 8 12 door door Wall door n03221720 door.n.01 +couch 1222 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +cabinet 1106 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +shelf 889 42 15 6 shelves shelves Furniture bookshelf bookshelf 02871439 n02871439 bookshelf.n.01 +desk 862 36 14 10 desk desk Table desk desk table 04379243 n03179701 desk.n.01 +office chair 837 5 5 4 chair chair Chair chair chair chair 03001627 n04373704 swivel_chair.n.01 +bed 814 157 4 1 bed bed Bed bed bed bed 02818832 n02818832 bed.n.01 +trashcan 688 12 39 6 garbage bin otherfurniture Furniture trash_bin 02747177 n02747177 ashcan.n.01 +pillow 608 119 18 7 pillow pillow Objects pillow 03938244 n03938244 pillow.n.01 +sink 504 24 34 7 sink sink Objects sink n04223580 sink.n.01 +picture 467 64 11 8 picture picture Picture n03931044 picture.n.01 +window 432 59 9 13 window window Window n04587648 window.n.01 +toilet 402 124 33 7 toilet toilet Objects toilet toilet n04446276 toilet.n.01 +bookshelf 400 88 10 6 bookshelf bookshelf Furniture bookshelf bookshelf 02871439 n02871439 bookshelf.n.01 +monitor 395 49 40 7 monitor otherprop Objects monitor monitor tv or monitor 03211117 n03782190 monitor.n.04 +computer 369 46 40 7 computer otherprop Objects n03082979 computer.n.01 +curtain 356 89 16 13 curtain curtain Window curtain n03151077 curtain.n.01 +book 335 1 23 2 book books Books n02870526 book.n.11 +armchair 318 5 5 4 chair chair Chair chair chair chair 03001627 n02738535 armchair.n.01 +coffee table 303 356 39 6 coffee table otherfurniture Furniture table table table 04379243 n03063968 coffee_table.n.01 +drawer 290 174 39 6 drawer otherfurniture Furniture n03233905 drawer.n.01 +box 283 26 29 7 box box Objects n02883344 box.n.01 +refrigerator 269 17 24 6 refridgerator refridgerator Furniture n04070727 refrigerator.n.01 +lamp 255 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +kitchen cabinet 252 3 3 6 cabinet cabinet Furniture n02933112 cabinet.n.01 +dining chair 242 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +towel 222 135 27 7 towel towel Objects n04459362 towel.n.01 +clothes 214 141 21 7 clothes clothes Objects n02728440 apparel.n.01 +tv 210 172 25 11 television television TV tv or monitor 03211117 n03211117 display.n.06 +nightstand 206 158 32 6 night stand night stand Furniture night_stand night_stand n03015254 chest_of_drawers.n.01 +counter 196 7 12 6 counter counter Furniture table table table 04379243 n03116530 counter.n.01 +dresser 180 169 17 6 dresser dresser Furniture dresser dresser n03015254 chest_of_drawers.n.01 +countertop 176 7 12 6 counter counter Furniture n03118245 countertop.n.01 +stool 165 150 40 7 stool otherprop Objects stool n04326896 stool.n.01 +cushion 141 119 18 7 pillow pillow Objects n03151500 cushion.n.03 +plant 139 82 40 7 plant otherprop Objects plant n00017222 plant.n.02 +ceiling 134 4 22 3 ceiling ceiling Ceiling n02990373 ceiling.n.01 +bathtub 134 136 36 7 bathtub bathtub Objects bathtub bathtub tub 02808440 n02808440 bathtub.n.01 +bedframe 132 157 4 1 bed bed Bed n02822579 bedstead.n.01 +end table 125 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +dining table 123 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +keyboard 118 47 40 7 keyboard otherprop Objects keyboard computer keyboard 03085013 n03085013 computer_keyboard.n.01 +bag 116 55 37 7 bag bag Objects suitcase 02773838 n02773838 bag.n.06 +backpack 114 206 40 7 backpack otherprop Objects n02769748 backpack.n.01 +toilet paper 113 139 40 7 toilet paper otherprop Objects n15075141 toilet_tissue.n.01 +printer 111 66 40 7 printer otherprop Objects printer 04004475 n04004475 printer.n.03 +tv stand 103 291 39 6 tv stand otherfurniture Furniture tv_stand n03290653 entertainment_center.n.01 +whiteboard 102 45 30 7 whiteboard whiteboard Objects n03211616 display_panel.n.01 +carpet 99 130 40 7 rug otherprop Objects n04118021 rug.n.01 +blanket 99 312 40 7 blanket otherprop Objects n02849154 blanket.n.01 +shower curtain 99 123 28 7 shower curtain shower curtain Objects curtain n04209239 shower_curtain.n.01 +trash can 94 12 39 6 garbage bin otherfurniture Furniture trash_bin 02747177 n02747177 ashcan.n.01 +closet 94 772 39 6 wardrobe otherfurniture Furniture wardrobe +stair 89 215 38 7 stairs otherstructure Objects stairs n04314914 step.n.04 +microwave 88 13 40 7 microwave otherprop Objects microwave 03761084 n03761084 microwave.n.02 +washbasin 86 24 34 7 sink sink Objects sink n04553920 washbasin.n.01 +rug 85 130 40 7 rug otherprop Objects n04118021 rug.n.01 +stove 78 242 38 7 stove otherstructure Objects stove 04330267 n04330267 stove.n.02 +shoe 68 149 40 7 shoe otherprop Objects n04199027 shoe.n.01 +computer tower 68 46 40 7 computer otherprop Objects n03082979 computer.n.01 +bottle 66 2 40 7 bottle otherprop Objects bottle bottle 02876657 n02876657 bottle.n.01 +bin 64 307 40 7 bin otherprop Objects n02839910 bin.n.01 +ottoman 63 359 39 6 ottoman otherfurniture Furniture stool n03380724 footstool.n.01 +bench 63 204 39 6 bench otherfurniture Furniture bench bench 02828884 n02828884 bench.n.01 +board 63 408 38 7 board otherstructure Objects +washing machine 62 278 39 6 washing machine otherfurniture Furniture washing_machine 04554684 n04554684 washer.n.03 +mirror 62 122 19 7 mirror mirror Objects n03773035 mirror.n.01 +copier 61 40 7 otherprop Objects n03257586 duplicator.n.01 +basket 60 39 40 7 basket otherprop Objects basket 02801938 n02801938 basket.n.01 +sofa chair 59 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +file cabinet 54 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +fan 52 74 40 7 fan otherprop Objects n03320046 fan.n.01 +laptop 52 37 40 7 laptop otherprop Objects laptop laptop 03642806 n03642806 laptop.n.01 +shower 49 38 7 otherstructure Objects n04208936 shower.n.01 +paper 48 15 26 7 paper paper Objects n14974264 paper.n.01 +person 48 331 31 7 person person Objects person n05217688 person.n.02 +headboard 47 161 39 6 headboard otherfurniture Furniture n03502200 headboard.n.01 +paper towel dispenser 47 14 40 7 paper towel dispenser otherprop Objects +faucet 45 9 40 7 faucet otherprop Objects faucet 03325088 n03325088 faucet.n.01 +oven 43 238 38 7 oven otherstructure Objects n03862676 oven.n.01 +footstool 42 359 39 6 ottoman otherfurniture Furniture stool n03380724 footstool.n.01 +blinds 42 80 13 13 blinds blinds Window n02851099 blind.n.03 +rack 41 50 39 6 stand otherfurniture Furniture n04038440 rack.n.05 +plate 39 233 40 7 plate otherprop Objects n03959485 plate.n.04 +blackboard 38 225 38 7 blackboard otherstructure Objects n02846511 blackboard.n.01 +piano 38 298 39 6 piano otherfurniture Furniture piano piano 03928116 n03928116 piano.n.01 +heater 38 111 39 6 heater otherfurniture Furniture n03508101 heater.n.01 +soap 37 133 40 7 soap otherprop Objects +luggage 36 783 40 7 luggage otherprop Objects n02774630 baggage.n.01 +computer desk 36 36 14 10 desk desk Table desk desk table 04379243 n03179701 desk.n.01 +rail 36 497 38 7 railing otherstructure Objects +radiator 36 236 39 6 radiator otherfurniture Furniture n04041069 radiator.n.02 +recycle bin 35 307 40 7 bin otherprop Objects +container 34 140 40 7 container otherprop Objects n03094503 container.n.01 +wardrobe 34 772 39 6 wardrobe otherfurniture Furniture wardrobe n04550184 wardrobe.n.01 +soap dispenser 32 40 7 otherprop Objects n04254120 soap_dispenser.n.01 +telephone 32 32 40 7 telephone otherprop Objects telephone 04401088 n04401088 telephone.n.01 +bucket 32 427 40 7 bucket otherprop Objects n02909870 bucket.n.01 +clock 31 56 40 7 clock otherprop Objects clock 03046257 n03046257 clock.n.01 +stand 29 50 39 6 stand otherfurniture Furniture table table table 04379243 n04301000 stand.n.04 +light 27 62 38 7 light otherstructure Objects n03665366 light.n.02 +laundry basket 27 164 40 7 laundry basket otherprop Objects basket 02801938 n03050864 clothes_hamper.n.01 +pipe 27 41 40 7 pipe otherprop Objects +round table 26 19 7 10 table table Table table table table 04379243 n04114554 round_table.n.02 +roof 25 4 22 3 ceiling ceiling Ceiling n04105068 roof.n.01 +clothes dryer 25 39 6 otherfurniture Furniture n03251766 dryer.n.01 +coat 23 324 40 7 jacket otherprop Objects n03057021 coat.n.01 +guitar 23 300 40 7 guitar otherprop Objects guitar guitar 03467517 n03467517 guitar.n.01 +desk chair 23 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +sheet 22 559 40 7 sheet otherprop Objects +toilet paper holder 22 647 40 7 toilet paper holder otherprop Objects +seat 22 524 39 6 furniture otherfurniture Furniture n04161981 seat.n.03 +step 21 38 7 otherstructure Objects n04314914 step.n.04 +speaker 20 54 40 7 speaker otherprop Objects speaker 03691459 n03691459 loudspeaker.n.01 +vending machine 19 220 40 7 machine otherprop Objects n04525305 vending_machine.n.01 +column 19 94 38 7 column otherstructure Objects n03074380 column.n.06 +bicycle 18 189 40 7 bicycle otherprop Objects bicycle 02834778 n02834778 bicycle.n.01 +ladder 18 48 39 6 ladder otherfurniture Furniture stairs n03632277 ladder.n.01 +cover 18 312 40 7 blanket otherprop Objects +handle 18 758 40 7 handle otherprop Objects n03485997 handle.n.01 +bathroom stall 18 38 7 otherstructure Objects n02873839 booth.n.02 +foosball table 17 510 39 6 foosball table otherfurniture Furniture table table table 04379243 n04379243 table.n.02 +table lamp 17 144 35 7 lamp lamp Objects lamp lamp 03636649 n04380533 table_lamp.n.01 +shower wall 17 21 1 12 wall wall Wall +chest 17 344 39 6 chest otherfurniture Furniture dresser dresser +cup 17 35 40 7 cup otherprop Objects cup cup or mug 03797390 n03797390 mug.n.04 +jacket 16 324 40 7 jacket otherprop Objects n03589791 jacket.n.01 +storage bin 16 812 40 7 storage bin otherprop Objects +screen 16 40 7 otherprop Objects +coffee maker 16 40 7 otherprop Objects n03063338 coffee_maker.n.01 +hamper 15 39 40 7 basket otherprop Objects basket 02801938 n03482405 hamper.n.02 +dishwasher 15 8 38 7 dishwasher otherstructure Objects dishwasher 03207941 n03207941 dishwasher.n.01 +window frame 15 477 38 7 window frame otherstructure Objects n04589593 window_frame.n.01 +paper towel 15 113 40 7 paper towel otherprop Objects n03887697 paper_towel.n.01 +machine 15 220 40 7 machine otherprop Objects n03699975 machine.n.01 +mat 15 143 20 5 floor mat floor mat Floor n03727837 mat.n.01 +windowsill 14 38 7 otherstructure Objects n04590263 windowsill.n.01 +tap 14 9 40 7 faucet otherprop Objects faucet 03325088 n04559451 water_faucet.n.01 +pool table 14 515 39 6 pool table otherfurniture Furniture table table table 04379243 n03982430 pool_table.n.01 +hand dryer 14 40 7 otherprop Objects +bar 14 51 38 7 bar otherstructure Objects n02788689 bar.n.03 +frame 14 38 7 otherstructure Objects +rolling chair 14 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +toaster 14 251 40 7 toaster otherprop Objects n04442312 toaster.n.02 +wall frame 14 38 7 otherstructure Objects +hanger 13 211 40 7 hanger otherprop Objects n03490884 hanger.n.02 +conference table 13 19 7 10 table table Table table table table 04379243 n03090000 conference_table.n.01 +handrail 13 453 38 7 banister otherstructure Objects n02788148 bannister.n.02 +treadmill 13 458 39 6 treadmill otherfurniture Furniture n04477387 treadmill.n.01 +bulletin board 13 408 38 7 board otherstructure Objects +ironing board 13 313 39 6 ironing board otherfurniture Furniture n03586090 ironing_board.n.01 +fireplace 12 372 38 7 fireplace otherstructure Objects n03346455 fireplace.n.01 +soap dish 12 638 40 7 soap dish otherprop Objects n04254009 soap_dish.n.01 +fabric 12 40 7 otherprop Objects n03309808 fabric.n.01 +kitchen counter 12 7 12 6 counter counter Furniture table table table 04379243 n03116530 counter.n.01 +glass 12 612 38 7 glass otherstructure Objects n03438257 glass.n.02 +doorframe 11 615 38 7 door frame otherstructure Objects n03222722 doorframe.n.01 +table cushion 11 40 7 otherprop Objects +toilet paper dispenser 11 40 7 otherprop Objects +slab 11 38 7 otherstructure Objects n04233405 slab.n.01 +mini fridge 11 17 24 6 refridgerator refridgerator Furniture n03273913 electric_refrigerator.n.01 +fire extinguisher 11 10 40 7 fire extinguisher otherprop Objects n03345837 fire_extinguisher.n.01 +shampoo 11 40 7 otherprop Objects +ball 11 60 40 7 ball otherprop Objects +hat 11 193 40 7 hat otherprop Objects n03497657 hat.n.01 +shower curtain rod 11 40 7 otherprop Objects +junk 11 40 7 otherprop Objects n14857897 debris.n.01 +soap holder 10 506 40 7 soap holder otherprop Objects +staircase 10 215 38 7 stairs otherstructure Objects n04298308 stairway.n.01 +toiletry 10 40 7 otherprop Objects n04447443 toiletry.n.01 +stall door 10 28 8 12 door door Wall door +framed picture 10 64 11 8 picture picture Picture +water cooler 10 509 39 6 water cooler otherfurniture Furniture n04559166 water_cooler.n.01 +bags 10 40 7 otherprop Objects suitcase 02773838 n02773838 bag.n.06 +desk lamp 10 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +paper cutter 10 108 40 7 paper cutter otherprop Objects n03886940 paper_cutter.n.01 +led tv 9 40 7 otherprop Objects +switch 9 40 7 otherprop Objects n04372370 switch.n.01 +bed sheet 9 559 40 7 sheet otherprop Objects n04188179 sheet.n.03 +roof frame 9 38 7 otherstructure Objects +tray 9 179 40 7 tray otherprop Objects n04476259 tray.n.01 +comforter 9 484 40 7 comforter otherprop Objects n04033995 quilt.n.01 +air conditioner 9 79 38 7 air conditioner otherstructure Objects n02686379 air_conditioner.n.01 +shower door 9 28 8 12 door door Wall door +shirt 9 40 7 otherprop Objects n04197391 shirt.n.01 +swivel chair 9 5 5 4 chair chair Chair chair chair chair 03001627 n04373704 swivel_chair.n.01 +pillar 9 94 38 7 column otherstructure Objects n03073977 column.n.07 +detergent 9 40 7 otherprop Objects +ledge 9 38 7 otherstructure Objects n09337253 ledge.n.01 +vase 8 78 40 7 vase otherprop Objects vase jar 03593526 n04522168 vase.n.01 +toaster oven 8 275 40 7 toaster oven otherprop Objects n04442441 toaster_oven.n.01 +bedpost 8 40 7 otherprop Objects n02821415 bedpost.n.01 +food 8 40 7 otherprop Objects n00021265 food.n.01 +picture frame 8 40 7 otherprop Objects n03931765 picture_frame.n.01 +poltrone 8 40 7 otherprop Objects +study table 8 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +office table 8 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +mouse 8 103 40 7 mouse otherprop Objects n03793489 mouse.n.04 +storage 8 n03744276 memory.n.04 +nerf gun 8 40 7 otherprop Objects +table chair 8 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +night table 8 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +computer chair 8 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +toilet seat liner dispenser 8 40 7 otherprop Objects +backrest 7 5 5 4 chair chair Chair n02767433 back.n.08 +chair seat 7 40 7 otherprop Objects +sink cabinet 7 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +can 7 329 40 7 can otherprop Objects can 02946921 n02946921 can.n.01 +furniture 7 524 39 6 furniture otherfurniture Furniture n03405725 furniture.n.01 +cart 7 305 40 7 cart otherprop Objects n03484083 handcart.n.01 +stool chair 7 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +step stool 7 276 40 7 step stool otherprop Objects stool n04315713 step_stool.n.01 +robe 7 40 7 otherprop Objects n04097866 robe.n.01 +table stand 7 50 39 6 stand otherfurniture Furniture +stall 7 38 7 otherstructure Objects n02873839 booth.n.02 +dispenser 7 40 7 otherprop Objects n03210683 dispenser.n.01 +storage container 7 140 40 7 container otherprop Objects +side table 7 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +partition 7 21 1 12 wall wall Wall n03894379 partition.n.01 +appliance 7 40 7 otherprop Objects +lotion 7 40 7 otherprop Objects n03690938 lotion.n.01 +pot 7 16 40 7 pot otherprop Objects +photo 7 508 40 7 photo otherprop Objects n03925226 photograph.n.01 +toilet brush 7 630 40 7 toilet brush otherprop Objects +scale 7 639 40 7 scale otherprop Objects n04141975 scale.n.07 +tissue box 7 138 40 7 tissue box otherprop Objects +remote 7 40 7 otherprop Objects remote_control 04074963 n04074963 remote_control.n.01 +light switch 6 301 38 7 light switch otherstructure Objects +crate 6 183 39 6 crate otherfurniture Furniture n03127925 crate.n.01 +ping pong table 6 625 39 6 ping pong table otherfurniture Furniture table table table 04379243 n04379243 table.n.02 +platform 6 38 7 otherstructure Objects +pantry 6 38 7 otherstructure Objects n03885535 pantry.n.01 +bath cabinet 6 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +slipper 6 40 7 otherprop Objects n04241394 slipper.n.01 +sideboard 6 7 12 6 counter counter Furniture +holder 6 40 7 otherprop Objects n03525454 holder.n.01 +worktop 6 40 7 otherprop Objects +outlet 6 40 7 otherprop Objects n04548771 wall_socket.n.01 +gas cooker 6 242 38 7 stove otherstructure Objects n03425595 gas_range.n.01 +doorhandle 6 652 40 7 knob otherprop Objects n03222959 doorknob.n.01 +cutting board 6 247 40 7 cutting board otherprop Objects n03025513 chopping_board.n.01 +bathroom sink 6 24 34 7 sink sink Objects sink n04223580 sink.n.01 +controller 6 40 7 otherprop Objects n03096960 control.n.09 +bedding set 6 40 7 otherprop Objects +mount 6 40 7 otherprop Objects +decoration 6 40 7 otherprop Objects n03169390 decoration.n.01 +tablet 6 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +reading table 6 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +floor covered 6 40 7 otherprop Objects +cooker 6 267 40 7 utensil otherprop Objects n03101156 cooker.n.01 +file 6 75 40 7 file otherprop Objects filing_cabinet 03337140 n03337140 file.n.03 +archive 6 40 7 otherprop Objects n02735086 archive.n.01 +trolley 5 504 40 7 trolley otherprop Objects n04335435 streetcar.n.01 +wainscoting 5 40 7 otherprop Objects +lampshade 5 859 40 7 lamp shade otherprop Objects n03637318 lampshade.n.01 +china 5 267 40 7 utensil otherprop Objects n03018209 china.n.02 +sign 5 208 40 7 sign otherprop Objects n04217882 signboard.n.01 +fax machine 5 68 40 7 fax machine otherprop Objects +mirror frame 5 40 7 otherprop Objects +projector 5 90 40 7 projector otherprop Objects n04009552 projector.n.02 +sweater 5 40 7 otherprop Objects n04370048 sweater.n.01 +paint can 5 329 40 7 can otherprop Objects can 02946921 n02946921 can.n.01 +heat register 5 40 7 otherprop Objects +kitchen table 5 19 7 10 table table Table table table table 04379243 n03620967 kitchen_table.n.01 +globe 5 347 40 7 globe otherprop Objects +toy 5 389 40 7 toy otherprop Objects n03964744 plaything.n.01 +kitchen worktop 5 40 7 otherprop Objects +paper roll 5 40 7 otherprop Objects +meeting table 5 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +vaze 5 40 7 otherprop Objects +wall clock 5 56 40 7 clock otherprop Objects clock 03046257 n04548280 wall_clock.n.01 +closet door 5 28 8 12 door door Wall door +pack 5 40 7 otherprop Objects +doormat 5 143 20 5 floor mat floor mat Floor n03223299 doormat.n.02 +tissue 5 648 40 7 tissue otherprop Objects +plastic container 5 140 40 7 container otherprop Objects +statue 5 294 40 7 sculpture otherprop Objects n04306847 statue.n.01 +dollhouse 5 486 39 6 doll house otherfurniture Furniture n03219483 dollhouse.n.01 +vacuum 5 40 7 otherprop Objects n04517823 vacuum.n.04 +wet floor sign 5 208 40 7 sign otherprop Objects +vanity 5 169 17 6 dresser dresser Furniture dresser dresser table 04379243 n03238586 dressing_table.n.01 +candle 5 137 40 7 candle otherprop Objects lamp n02948072 candle.n.01 +library desk 5 36 14 10 desk desk Table desk desk +carton box 5 26 29 7 box box Objects +easel 5 50 39 6 stand otherfurniture Furniture n03262809 easel.n.01 +wall lamp 5 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +wall hanging 4 40 7 otherprop Objects n03491178 hanging.n.01 +face wash 4 40 7 otherprop Objects +corner 4 40 7 otherprop Objects +lounge chair 4 5 5 4 chair chair Chair chair chair chair 03001627 n03262932 easy_chair.n.01 +beanbag 4 797 39 6 bean bag otherfurniture Furniture n02816656 beanbag.n.01 +marker holder 4 40 7 otherprop Objects +dumbell 4 40 7 otherprop Objects +ping pong paddle 4 40 7 otherprop Objects +locker 4 3 3 6 cabinet cabinet Furniture +plunger 4 40 7 otherprop Objects n03970156 plunger.n.03 +soap bar 4 51 38 7 bar otherstructure Objects +student chair 4 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +office object 4 40 7 otherprop Objects +stuffed animal 4 177 40 7 stuffed animal otherprop Objects +water fountain 4 339 38 7 water fountain otherstructure Objects n03241335 drinking_fountain.n.01 +doorknob 4 27 40 7 door knob otherprop Objects n03222959 doorknob.n.01 +footrest 4 163 39 6 foot rest otherfurniture Furniture stool n03380724 footstool.n.01 +ac unit 4 40 7 otherprop Objects +safe 4 26 29 7 box box Objects n04125021 safe.n.01 +tile 4 40 7 otherprop Objects n04435180 tile.n.01 +easle 4 40 7 otherprop Objects +headphone 4 160 40 7 headphones otherprop Objects headphone 03261776 n03261776 earphone.n.01 +dress 4 40 7 otherprop Objects n03236735 dress.n.01 +rolling cart 4 305 40 7 cart otherprop Objects +chest of drawers 4 524 39 6 furniture otherfurniture Furniture dresser dresser n03015254 chest_of_drawers.n.01 +plastic bin 4 307 40 7 bin otherprop Objects +pail 4 427 40 7 bucket otherprop Objects n02909870 bucket.n.01 +dry erase board 4 408 38 7 board otherstructure Objects +coatrack 4 40 7 otherprop Objects n03059103 coatrack.n.01 +recliner 4 5 5 4 chair chair Chair chair chair chair 03001627 n04062428 recliner.n.01 +roomba 4 40 7 otherprop Objects +highchair 4 5 5 4 chair chair Chair chair chair chair 03001627 n03518445 highchair.n.01 +dish rack 4 581 40 7 dish rack otherprop Objects n03207630 dish_rack.n.01 +dartboard 4 408 38 7 board otherstructure Objects n03162940 dartboard.n.01 +broom 4 328 40 7 broom otherprop Objects n02906734 broom.n.01 +book rack 4 224 39 6 bookrack otherfurniture Furniture +eraser 4 100 40 7 eraser otherprop Objects n03294833 eraser.n.01 +bath mat 4 40 7 otherprop Objects n02807401 bath_mat.n.01 +textile 4 40 7 otherprop Objects n03309808 fabric.n.01 +paper box 4 26 29 7 box box Objects +guitar case 4 771 40 7 guitar case otherprop Objects +mop 4 40 7 otherprop Objects n04367480 swab.n.02 +lavatory 4 40 7 otherprop Objects toilet toilet +server 4 360 40 7 server otherprop Objects +paper towel holder 4 281 40 7 paper towel holder otherprop Objects +office supply 4 40 7 otherprop Objects +panel 4 408 38 7 board otherstructure Objects +toilet brush holder 4 40 7 otherprop Objects +magazine 4 71 40 7 magazine otherprop Objects n06595351 magazine.n.01 +kitchen rack 4 50 39 6 stand otherfurniture Furniture n04038440 rack.n.05 +table object 4 40 7 otherprop Objects +range hood 4 380 38 7 range hood otherstructure Objects range_hood n04053677 range_hood.n.01 +bath 4 136 36 7 bathtub bathtub Objects bathtub bathtub tub 02808440 n02808440 bathtub.n.01 +trim 4 40 7 otherprop Objects n04484160 trimming.n.02 +scanner 4 40 7 otherprop Objects +bathrobe 4 40 7 otherprop Objects n02807616 bathrobe.n.01 +door and post 4 40 7 otherprop Objects +pouff 4 40 7 otherprop Objects +spring curtain 3 89 16 13 curtain curtain Window curtain +recycle 3 40 7 otherprop Objects +fax 3 40 7 otherprop Objects n03316105 facsimile.n.02 +rolling shelf 3 40 7 otherprop Objects +flat-screen television 3 172 25 11 television television TV +futon 3 576 39 6 mattress otherfurniture Furniture n03408444 futon.n.01 +stack of chairs 3 40 7 otherprop Objects +dustpan 3 40 7 otherprop Objects n03259009 dustpan.n.02 +hand towel 3 135 27 7 towel towel Objects n03490006 hand_towel.n.01 +floor lamp 3 144 35 7 lamp lamp Objects lamp lamp 03636649 n03367059 floor_lamp.n.01 +mainboard 3 40 7 otherprop Objects +kitchen shelf 3 42 15 6 shelves shelves Furniture bookshelf bookshelf 02871439 n02871439 bookshelf.n.01 +organizer 3 40 7 otherprop Objects n03918737 personal_digital_assistant.n.01 +freezer 3 17 24 6 refridgerator refridgerator Furniture n03170635 deep-freeze.n.01 +furnace 3 551 39 6 furnace otherfurniture Furniture n03404449 furnace.n.01 +stock 3 40 7 otherprop Objects +map 3 107 40 7 map otherprop Objects n03720163 map.n.01 +helmet 3 40 7 otherprop Objects helmet 03513137 n03513137 helmet.n.02 +wallpaper 3 38 7 otherstructure Objects +wall cabinet 3 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +office equipment 3 40 7 otherprop Objects +hair dryer 3 577 40 7 hair dryer otherprop Objects n03483316 hand_blower.n.01 +backsplash 3 40 7 otherprop Objects +exercise ball 3 60 40 7 ball otherprop Objects +jeremiah 3 40 7 otherprop Objects n11082842 jeremiah.n.01 +flush 3 40 7 otherprop Objects +fridge just 3 40 7 otherprop Objects +folded clothes 3 141 21 7 clothes clothes Objects +window counter 3 7 12 6 counter counter Furniture +iron 3 40 7 otherprop Objects n03584829 iron.n.04 +studio light 3 62 38 7 light otherstructure Objects +sconce 3 62 38 7 light otherstructure Objects n04148703 sconce.n.03 +sofa set 3 40 7 otherprop Objects +baseboard 3 40 7 otherprop Objects n02800354 baseboard.n.01 +sink counter 3 7 12 6 counter counter Furniture +kitchen slab 3 38 7 otherstructure Objects n04233405 slab.n.01 +cabinet door 3 28 8 12 door door Wall door +exercise machine 3 220 40 7 machine otherprop Objects +wood 3 40 7 otherprop Objects +teatowels 3 40 7 otherprop Objects +workbench 3 204 39 6 bench otherfurniture Furniture bench table 04379243 n04600486 workbench.n.01 +backwall 3 40 7 otherprop Objects +cubby 3 40 7 otherprop Objects n03144365 cubby.n.01 +water bottle 3 2 40 7 bottle otherprop Objects bottle bottle 02876657 n04557648 water_bottle.n.01 +kitchen sink 3 24 34 7 sink sink Objects sink n03620889 kitchen_sink.n.01 +sink area 3 40 7 otherprop Objects +handicap bar 3 51 38 7 bar otherstructure Objects +painter 3 594 40 7 cat otherprop Objects n02125311 cougar.n.01 +tank 3 40 7 otherprop Objects +washstand 3 524 39 6 furniture otherfurniture Furniture n04555400 washstand.n.01 +purse 3 181 40 7 purse otherprop Objects n02774152 bag.n.04 +surface 3 40 7 otherprop Objects n02688443 airfoil.n.01 +towel rack 3 40 7 otherprop Objects n04459773 towel_rack.n.01 +decor 3 40 7 otherprop Objects n03579355 interior_decoration.n.01 +handwash 3 40 7 otherprop Objects +bar stool 3 150 40 7 stool otherprop Objects stool +pan 3 589 40 7 pan otherprop Objects n03880531 pan.n.01 +air propeller 3 40 7 otherprop Objects +paneling 3 21 1 12 wall wall Wall n03882611 paneling.n.01 +vent 3 40 7 otherprop Objects +kitchen junk 3 40 7 otherprop Objects n14857897 debris.n.01 +piano bench 3 460 39 6 piano bench otherfurniture Furniture bench bench 02828884 n02828884 bench.n.01 +bunk bed 3 804 39 6 bunk bed otherfurniture Furniture bed bed bed 02818832 n02920259 bunk_bed.n.01 +bed lamp 3 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +shower mat 3 40 7 otherprop Objects +bedding 3 40 7 otherprop Objects n02820210 bedclothes.n.01 +shoe rack 3 614 40 7 shoe rack otherprop Objects +notice board 3 408 38 7 board otherstructure Objects n02916538 bulletin_board.n.02 +shower floor 3 11 2 5 floor floor Floor +brush 3 40 7 otherprop Objects n02908217 brush.n.02 +table football 3 166 40 7 football otherprop Objects +padded bench 3 204 39 6 bench otherfurniture Furniture bench bench 02828884 n02828884 bench.n.01 +bathroom carpet 3 130 40 7 rug otherprop Objects n04118021 rug.n.01 +showerhead 3 650 40 7 shower head otherprop Objects n04209383 showerhead.n.01 +loft 3 40 7 otherprop Objects +chair w/table 3 40 7 otherprop Objects +bedhead 3 40 7 otherprop Objects +roll 3 40 7 otherprop Objects n04101375 roll.n.04 +comidin 3 40 7 otherprop Objects +cardboard box 3 26 29 7 box box Objects +cushion stool 2 150 40 7 stool otherprop Objects stool +bed cabinet 2 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +pile of clothes 2 141 21 7 clothes clothes Objects +case 2 851 40 7 case otherprop Objects +slep 2 40 7 otherprop Objects +swiffer 2 40 7 otherprop Objects +stapler 2 67 40 7 stapler otherprop Objects n04303497 stapler.n.01 +cable 2 450 40 7 cables otherprop Objects +work desk 2 36 14 10 desk desk Table desk desk +floor carpet 2 40 7 otherprop Objects +bedside 2 40 7 otherprop Objects n08649711 bedside.n.01 +trash bag 2 55 37 7 bag bag Objects +heating devce 2 40 7 otherprop Objects +sofa table 2 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +ventilator 2 40 7 otherprop Objects n04526964 ventilator.n.01 +cat 2 594 40 7 cat otherprop Objects +kitchen utensil 2 267 40 7 utensil otherprop Objects n03621049 kitchen_utensil.n.01 +counter top for sink 2 24 34 7 sink sink Objects sink +bathroom frame 2 38 7 otherstructure Objects +banister 2 453 38 7 banister otherstructure Objects n02788148 bannister.n.02 +tuvalet kağıdı 2 40 7 otherprop Objects +trunk 2 40 7 otherprop Objects +blank screen 2 40 7 otherprop Objects +tire 2 40 7 otherprop Objects n04440749 tire.n.01 +screen curtain 2 89 16 13 curtain curtain Window curtain +cooking range 2 40 7 otherprop Objects +dressware 2 40 7 otherprop Objects +blow up matress 2 40 7 otherprop Objects +shred bin 2 307 40 7 bin otherprop Objects +air matress 2 40 7 otherprop Objects +folder 2 69 40 7 folder otherprop Objects n03376279 folder.n.02 +room heater 2 111 39 6 heater otherfurniture Furniture +car 2 530 40 7 car otherprop Objects car car 02958343 n02958343 car.n.01 +massage armchair 2 40 7 otherprop Objects +wardrobe door 2 28 8 12 door door Wall door +coffee supply 2 40 7 otherprop Objects +tissue holder 2 40 7 otherprop Objects +tab 2 40 7 otherprop Objects +knickknack 2 40 7 otherprop Objects +indoor plant 2 82 40 7 plant otherprop Objects plant +notebook 2 210 40 7 notebook otherprop Objects n03832673 notebook.n.02 +water dispenser 2 507 40 7 water dispenser otherprop Objects n03210683 dispenser.n.01 +cleaning supply 2 40 7 otherprop Objects +library table 2 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +bin cover 2 40 7 otherprop Objects +teakettle 2 243 40 7 tea kettle otherprop Objects n04397768 teakettle.n.01 +reservoir 2 263 40 7 vessel otherprop Objects n04078574 reservoir.n.03 +arc sofa 2 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +bedside lamp 2 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +picture window 2 59 9 13 window window Window n03932080 picture_window.n.01 +medicine cabinet 2 3 3 6 cabinet cabinet Furniture cabinet 02933112 n03742115 medicine_chest.n.01 +cosmetic bag 2 55 37 7 bag bag Objects +coffee 2 40 7 otherprop Objects +brush holder 2 40 7 otherprop Objects +duvet 2 40 7 otherprop Objects n03266749 eiderdown.n.01 +flower stand 2 50 39 6 stand otherfurniture Furniture +bedcover 2 40 7 otherprop Objects n02822220 bedspread.n.01 +side 2 40 7 otherprop Objects n09437454 slope.n.01 +weight 2 40 7 otherprop Objects n04571292 weight.n.02 +pitcher 2 273 40 7 pitcher otherprop Objects n03950228 pitcher.n.02 +schoolbag 2 55 37 7 bag bag Objects n04146343 schoolbag.n.01 +wall picture 2 64 11 8 picture picture Picture +metal handrail 2 40 7 otherprop Objects +icebox 2 17 24 6 refridgerator refridgerator Furniture n04070727 refrigerator.n.01 +exercise equipment 2 457 39 6 excercise equipment otherfurniture Furniture +loft bed 2 157 4 1 bed bed Bed bed bed bed 02818832 n02818832 bed.n.01 +tennis table 2 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +bookbag 2 40 7 otherprop Objects +scarf 2 240 40 7 scarf otherprop Objects n04143897 scarf.n.01 +cabinet drawer 2 174 39 6 drawer otherfurniture Furniture +double door 2 28 8 12 door door Wall door n03226880 double_door.n.01 +books in a book shelf 2 40 7 otherprop Objects +entertainment stand 2 50 39 6 stand otherfurniture Furniture +potty 2 40 7 otherprop Objects n03004275 chamberpot.n.01 +john 2 40 7 otherprop Objects toilet toilet n04446276 toilet.n.01 +desk accessory 2 40 7 otherprop Objects +chair support 2 40 7 otherprop Objects +shopping bag 2 55 37 7 bag bag Objects n04204081 shopping_bag.n.01 +tree 2 82 40 7 plant otherprop Objects plant n13104059 tree.n.01 +dustpan broom 2 328 40 7 broom otherprop Objects +stall wall 2 21 1 12 wall wall Wall +tường 2 40 7 otherprop Objects +bedside drawer 2 174 39 6 drawer otherfurniture Furniture +chaise 2 5 5 4 chair chair Chair chair chair chair 03001627 n03002711 chaise_longue.n.01 +curtain rod 2 582 38 7 curtain rod otherstructure Objects +boardgame 2 40 7 otherprop Objects +cccvurtains 2 40 7 otherprop Objects +device 2 40 7 otherprop Objects n03183080 device.n.01 +armrest 2 40 7 otherprop Objects n02741475 armrest.n.01 +alarm 2 525 40 7 alarm otherprop Objects clock 03046257 n02694662 alarm_clock.n.01 +towel rail 2 51 38 7 bar otherstructure Objects n04459909 towel_rail.n.01 +sliding wood doors 2 40 7 otherprop Objects +backbag 2 40 7 otherprop Objects +bath curtain 2 89 16 13 curtain curtain Window curtain +washcloth 2 40 7 otherprop Objects n04554523 washcloth.n.01 +bean bag chair 2 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +toolbox 2 344 39 6 chest otherfurniture Furniture n04452615 toolbox.n.01 +rack shelf 2 40 7 otherprop Objects +kleenex box 2 26 29 7 box box Objects +air freshner 2 40 7 otherprop Objects +sewing machine 2 890 40 7 sewing machine otherprop Objects n04179913 sewing_machine.n.01 +washing and drying machine 2 220 40 7 machine otherprop Objects +hairbrush 2 120 40 7 hair brush otherprop Objects n03475581 hairbrush.n.01 +lap desk 2 36 14 10 desk desk Table desk desk +hutch 2 40 7 otherprop Objects +stack of flat items/possibly cardboard 2 40 7 otherprop Objects +under-bed drawer 2 174 39 6 drawer otherfurniture Furniture +bleach 2 40 7 otherprop Objects +comidine 2 40 7 otherprop Objects +bathmat 2 40 7 otherprop Objects +cinder block 2 40 7 otherprop Objects n03031957 cinder_block.n.01 +mailbox 2 26 29 7 box box Objects mailbox 03710193 n03710193 mailbox.n.01 +writing board 2 408 38 7 board otherstructure Objects n04608127 writing_board.n.01 +flooring 2 11 2 5 floor floor Floor n03365592 floor.n.01 +wall of safety boxes 2 40 7 otherprop Objects +vessel 2 263 40 7 vessel otherprop Objects watercraft 04530566 n04530566 vessel.n.02 +cube sofa 2 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +toothpaste 2 128 40 7 toothpaste otherprop Objects +liquid dispencer 2 40 7 otherprop Objects +folding chair 2 5 5 4 chair chair Chair chair chair chair 03001627 n03376595 folding_chair.n.01 +squash 2 717 40 7 squash otherprop Objects plant n12158798 squash.n.01 +grille 2 700 38 7 grill otherstructure Objects +centerpiece 2 878 40 7 centerpiece otherprop Objects n02994419 centerpiece.n.02 +wall folder 2 69 40 7 folder otherprop Objects +towel hanger 2 211 40 7 hanger otherprop Objects n03490884 hanger.n.02 +toilet pot 2 16 40 7 pot otherprop Objects +aid 2 40 7 otherprop Objects +rope 2 560 40 7 rope otherprop Objects n04108268 rope.n.01 +envelop rack 2 40 7 otherprop Objects +tissue roll 2 764 40 7 tissue roll otherprop Objects +rostrum 2 40 7 otherprop Objects n03159640 dais.n.01 +owen 2 40 7 otherprop Objects +electric panel 2 40 7 otherprop Objects +bowl 2 22 40 7 bowl otherprop Objects bowl bowl 02880940 n02880940 bowl.n.03 +boiler 2 40 7 otherprop Objects +tile wall 2 21 1 12 wall wall Wall +reflection 2 64 11 8 picture picture Picture n04068976 reflection.n.05 +crib 2 485 39 6 crib otherfurniture Furniture +shelves of stuff 2 40 7 otherprop Objects +kitchen gadget 2 40 7 otherprop Objects n02729965 appliance.n.01 +sliding door 2 28 8 12 door door Wall door n04239074 sliding_door.n.01 +paper bag 2 55 37 7 bag bag Objects n04122825 sack.n.01 +water heater 2 588 40 7 water heater otherprop Objects n04560113 water_heater.n.01 +alarm clock 2 156 40 7 alarm clock otherprop Objects clock 03046257 n02694662 alarm_clock.n.01 +chair rail 2 40 7 otherprop Objects +corkboard 2 34 40 7 cork board otherprop Objects n14823376 corkboard.n.01 +sàn nhà 2 40 7 otherprop Objects +conformer 2 40 7 otherprop Objects +easy chair 2 5 5 4 chair chair Chair chair chair chair 03001627 n03262932 easy_chair.n.01 +sehpa 2 40 7 otherprop Objects +library 2 40 7 otherprop Objects +bench seat 2 40 7 otherprop Objects +music stand 2 820 39 6 music stand otherfurniture Furniture n03801760 music_stand.n.01 +office 2 40 7 otherprop Objects n03841666 office.n.01 +clutter 2 40 7 otherprop Objects +flush for toilet 2 124 33 7 toilet toilet Objects toilet toilet +kleenex 2 40 7 otherprop Objects +box/storage 2 40 7 otherprop Objects +post 2 40 7 otherprop Objects n03988170 post.n.04 +plug 2 40 7 otherprop Objects +socket 2 40 7 otherprop Objects n04255163 socket.n.02 +island 2 456 38 7 kitchen island otherstructure Objects +instrument case 2 851 40 7 case otherprop Objects +paper tray 2 538 40 7 paper tray otherprop Objects +toilet paper package 2 40 7 otherprop Objects +antibacterial soap dispenser 2 40 7 otherprop Objects +cubicle 2 40 7 otherprop Objects +vaccuum 2 40 7 otherprop Objects +photography light 2 62 38 7 light otherstructure Objects +trump wall 2 21 1 12 wall wall Wall +shredder 2 40 7 otherprop Objects n04210120 shredder.n.01 +square table 2 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +table support 2 40 7 otherprop Objects +sink plumbing 2 40 7 otherprop Objects +basin 2 40 7 otherprop Objects +pinball machine 2 220 40 7 machine otherprop Objects n03941417 pinball_machine.n.01 +meeting 2 40 7 otherprop Objects n08542634 confluence.n.01 +mobile 2 40 7 otherprop Objects +hatrack 2 40 7 otherprop Objects n03059103 coatrack.n.01 +johnny 2 331 31 7 person person Objects person n10628368 rebel.n.01 +projector screen 2 53 38 7 projector screen otherstructure Objects +valance 2 40 7 otherprop Objects n03111296 cornice.n.01 +eliptical 2 40 7 otherprop Objects +boot 2 40 7 otherprop Objects +window ledge 2 40 7 otherprop Objects +clothes hamper 2 39 40 7 basket otherprop Objects basket 02801938 n03050864 clothes_hamper.n.01 +wall side 2 40 7 otherprop Objects +stairstepper 2 40 7 otherprop Objects +bottle recycling bin 2 307 40 7 bin otherprop Objects +blend 2 40 7 otherprop Objects +tissue dispenser 1 40 7 otherprop Objects +entertainment center 1 524 39 6 furniture otherfurniture Furniture n03290653 entertainment_center.n.01 +kettle 1 16 40 7 pot otherprop Objects n03612814 kettle.n.01 +laundyr supply 1 40 7 otherprop Objects +chain 1 40 7 otherprop Objects +gown 1 40 7 otherprop Objects +w.c. 1 40 7 otherprop Objects toilet toilet n04558478 water_closet.n.01 +shelf unit 1 40 7 otherprop Objects +walss 1 40 7 otherprop Objects +mirror reflection 1 40 7 otherprop Objects +bed curtain 1 89 16 13 curtain curtain Window curtain +papertray 1 538 40 7 paper tray otherprop Objects +tissue paper 1 15 26 7 paper paper Objects +milk 1 40 7 otherprop Objects +leg rest sofa 1 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +double decker 1 40 7 otherprop Objects +dekw 1 40 7 otherprop Objects +sink counter top 1 40 7 otherprop Objects +breadbox 1 40 7 otherprop Objects n02893692 bread-bin.n.01 +floor mat 1 143 20 5 floor mat floor mat Floor n03727837 mat.n.01 +electrical machine 1 220 40 7 machine otherprop Objects +student seat 1 40 7 otherprop Objects +privacy partition 1 40 7 otherprop Objects +chairlegs 1 40 7 otherprop Objects +mail tray 1 618 40 7 mail tray otherprop Objects +over the door storage 1 40 7 otherprop Objects +door hinge 1 40 7 otherprop Objects +cahi 1 40 7 otherprop Objects +excercise cycle 1 40 7 otherprop Objects +handsoap 1 40 7 otherprop Objects +glass door 1 28 8 12 door door Wall door +dustbin box 1 26 29 7 box box Objects +toy ship 1 40 7 otherprop Objects +storage rack 1 448 39 6 storage rack otherfurniture Furniture +wall outside room 1 40 7 otherprop Objects +ask tray 1 179 40 7 tray otherprop Objects +punching bag 1 55 37 7 bag bag Objects n04023962 punching_bag.n.02 +storage drawer 1 174 39 6 drawer otherfurniture Furniture +cat litter box 1 26 29 7 box box Objects +shower rod 1 40 7 otherprop Objects +office desk 1 36 14 10 desk desk Table desk desk +water filter 1 731 40 7 water filter otherprop Objects n04559620 water_filter.n.01 +nicknack 1 40 7 otherprop Objects n02897692 bric-a-brac.n.01 +tin of drink 1 40 7 otherprop Objects +work 1 40 7 otherprop Objects +lustre 1 40 7 otherprop Objects +paper shredder 1 40 7 otherprop Objects +awllll 1 40 7 otherprop Objects +booth 1 19 7 10 table table Table table table table 04379243 n02874214 booth.n.01 +folded blanket 1 312 40 7 blanket otherprop Objects +bed skirt 1 40 7 otherprop Objects +computer speaker 1 54 40 7 speaker otherprop Objects speaker 03691459 n03691459 loudspeaker.n.01 +desktop computer 1 46 40 7 computer otherprop Objects n03180011 desktop_computer.n.01 +hadnwash 1 40 7 otherprop Objects +covered box 1 26 29 7 box box Objects +lampbase 1 40 7 otherprop Objects +net 1 40 7 otherprop Objects +wall pane 1 40 7 otherprop Objects +dressing gown 1 40 7 otherprop Objects n03237992 dressing_gown.n.01 +footstowindow 2ol 1 40 7 otherprop Objects +display/signs 1 40 7 otherprop Objects +arifact 1 40 7 otherprop Objects +leg 1 40 7 otherprop Objects +ceiling fan 1 74 40 7 fan otherprop Objects +circular sofa 1 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +food/drink 1 40 7 otherprop Objects +chair cushion 1 40 7 otherprop Objects +water 1 40 7 otherprop Objects n04562658 water_system.n.02 +sinl 1 40 7 otherprop Objects +sing 1 40 7 otherprop Objects +cardboard 1 40 7 otherprop Objects +plastic sliding drawers 1 40 7 otherprop Objects +celltech 1 40 7 otherprop Objects +sink tap 1 40 7 otherprop Objects +binder 1 399 40 7 binder otherprop Objects +toilet plumbing 1 40 7 otherprop Objects +marble 1 60 40 7 ball otherprop Objects n03721047 marble.n.02 +table speaker 1 54 40 7 speaker otherprop Objects speaker 03691459 n03691459 loudspeaker.n.01 +talbetop 1 40 7 otherprop Objects +gym cycle 1 40 7 otherprop Objects +table piece 1 40 7 otherprop Objects +counter panel 1 40 7 otherprop Objects +plug/outlet 1 40 7 otherprop Objects +till 1 26 29 7 box box Objects n02976939 cashbox.n.01 +sink unit 1 40 7 otherprop Objects +urinary 1 40 7 otherprop Objects +ball chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +of shelf 1 40 7 otherprop Objects +shower rack 1 614 40 7 shoe rack otherprop Objects +full bed 1 157 4 1 bed bed Bed bed bed bed 02818832 n02818832 bed.n.01 +sink cupboard 1 40 7 otherprop Objects +house shoe 1 149 40 7 shoe otherprop Objects +cha 1 40 7 otherprop Objects +beachball 1 60 40 7 ball otherprop Objects n02814224 beach_ball.n.01 +game table 1 429 40 7 game table otherprop Objects table table table 04379243 n04379243 table.n.02 +tiny table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +feminine hygiene waste basket 1 39 40 7 basket otherprop Objects basket 02801938 n02801938 basket.n.01 +dicplay case 1 851 40 7 case otherprop Objects +end table chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +cardbox 1 40 7 otherprop Objects +envelope 1 476 40 7 envelope otherprop Objects n03291819 envelope.n.01 +resevoir 1 40 7 otherprop Objects +rabbit 1 40 7 otherprop Objects n02324045 rabbit.n.01 +board meeting table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +hold 1 758 40 7 handle otherprop Objects +laser printer 1 66 40 7 printer otherprop Objects printer 04004475 n03643737 laser_printer.n.01 +glasses case 1 851 40 7 case otherprop Objects n03438863 glasses_case.n.01 +thermos 1 693 40 7 flask otherprop Objects bottle bottle 02876657 n04422727 thermos.n.01 +shelving unit 1 40 7 otherprop Objects +bath towel 1 135 27 7 towel towel Objects n02808304 bath_towel.n.01 +monitor stand 1 50 39 6 stand otherfurniture Furniture +breakfast bar 1 51 38 7 bar otherstructure Objects +flat screen television 1 172 25 11 television television TV +dressin table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +dress rack 1 50 39 6 stand otherfurniture Furniture n03238762 dress_rack.n.01 +plates of food 1 40 7 otherprop Objects +figure 1 40 7 otherprop Objects +credenza 1 7 12 6 counter counter Furniture n03129753 credenza.n.01 +oejcts 1 40 7 otherprop Objects +sinktop 1 40 7 otherprop Objects +wall.table 1 40 7 otherprop Objects +penholder 1 464 40 7 pen holder otherprop Objects +wall panel 1 21 1 12 wall wall Wall n04548503 wall_panel.n.01 +stair landing 1 40 7 otherprop Objects +wallpapere 1 40 7 otherprop Objects +water dispencer 1 507 40 7 water dispenser otherprop Objects +therostat 1 110 40 7 thermostat otherprop Objects +frying pan 1 318 40 7 frying pan otherprop Objects n03400231 frying_pan.n.01 +separator 1 40 7 otherprop Objects n02995998 centrifuge.n.01 +divider 1 40 7 otherprop Objects +ceiling lamp 1 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +rod 1 40 7 otherprop Objects pistol 03948459 n03427202 gat.n.01 +;amps 1 40 7 otherprop Objects +vaccum 1 40 7 otherprop Objects +chair b' 1 40 7 otherprop Objects +paint bucket 1 427 40 7 bucket otherprop Objects +lighting 1 40 7 otherprop Objects n03667235 lighting.n.02 +tablecloth 1 292 40 7 tablecloth otherprop Objects n04380143 tablecloth.n.01 +plank 1 408 38 7 board otherstructure Objects n15101854 board.n.02 +sink pipe 1 41 40 7 pipe otherprop Objects +concrete slab 1 40 7 otherprop Objects +mini couch 1 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +post it 1 40 7 otherprop Objects +stair down 1 40 7 otherprop Objects +spout 1 41 40 7 pipe otherprop Objects n04287153 spout.n.01 +cutlery 1 40 7 otherprop Objects n03154073 cutter.n.06 +magazine rack 1 50 39 6 stand otherfurniture Furniture n03704549 magazine_rack.n.01 +mini printer 1 66 40 7 printer otherprop Objects printer 04004475 n04004475 printer.n.03 +tray box 1 26 29 7 box box Objects +level 2 stair case 1 851 40 7 case otherprop Objects +industrial machine 1 220 40 7 machine otherprop Objects +giường 1 40 7 otherprop Objects +induction cooktop 1 40 7 otherprop Objects +artwork 1 40 7 otherprop Objects +pillowcase 1 851 40 7 case otherprop Objects n02975412 case.n.19 +window wall 1 21 1 12 wall wall Wall +minibar 1 7 12 6 counter counter Furniture n03769610 minibar.n.01 +laundry detergent 1 40 7 otherprop Objects +serving plate 1 233 40 7 plate otherprop Objects +dirty basket 1 39 40 7 basket otherprop Objects basket 02801938 n02801938 basket.n.01 +reading lamp 1 144 35 7 lamp lamp Objects lamp lamp 03636649 n04057981 reading_lamp.n.01 +open cabinet 1 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +hand truck 1 305 40 7 cart otherprop Objects n03490119 hand_truck.n.01 +pad 1 40 7 otherprop Objects n03195485 diggings.n.02 +laptop table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +ventilator window 1 59 9 13 window window Window +esll 1 40 7 otherprop Objects +sofa bed 1 157 4 1 bed bed Bed bed bed bed 02818832 n02818832 bed.n.01 +safa 1 40 7 otherprop Objects +heating system 1 40 7 otherprop Objects n03509025 heating_system.n.01 +floor]floo 1 40 7 otherprop Objects +facial scrub 1 40 7 otherprop Objects +vent hood 1 40 7 otherprop Objects +office cupboard 1 40 7 otherprop Objects +stand fan 1 74 40 7 fan otherprop Objects +storage shelf 1 40 7 otherprop Objects +hanging clothes 1 141 21 7 clothes clothes Objects +fuse box 1 26 29 7 box box Objects +pizza 1 40 7 otherprop Objects +personal effect 1 40 7 otherprop Objects +drawer organizer 1 40 7 otherprop Objects +main board 1 408 38 7 board otherstructure Objects +loofa 1 40 7 otherprop Objects +shower surround 1 40 7 otherprop Objects +bycicle 1 40 7 otherprop Objects +all-in-one computer 1 46 40 7 computer otherprop Objects +box of tissue 1 648 40 7 tissue otherprop Objects +doorlock 1 646 40 7 door lock otherprop Objects n03223162 doorlock.n.01 +base unit 1 40 7 otherprop Objects +tennis ball 1 60 40 7 ball otherprop Objects n04409515 tennis_ball.n.01 +snack machine 1 220 40 7 machine otherprop Objects +laptop bag 1 55 37 7 bag bag Objects +hallway wall 1 21 1 12 wall wall Wall +msic 1 40 7 otherprop Objects +file organizer 1 40 7 otherprop Objects +fire hose 1 40 7 otherprop Objects n03346004 fire_hose.n.01 +media center 1 40 7 otherprop Objects +umbrella 1 203 40 7 umbrella otherprop Objects n04507155 umbrella.n.01 +barrier 1 40 7 otherprop Objects n02796623 barrier.n.01 +dirt 1 40 7 otherprop Objects +subwoofer 1 54 40 7 speaker otherprop Objects speaker 03691459 n04349401 subwoofer.n.01 +table tennis 1 40 7 otherprop Objects +printer/scanner 1 40 7 otherprop Objects +drying rack 1 262 39 6 drying rack otherfurniture Furniture +wppd [ame;owood paneling 1 40 7 otherprop Objects +toilet robe 1 40 7 otherprop Objects +printer stand 1 50 39 6 stand otherfurniture Furniture +shower screen 1 40 7 otherprop Objects +water bed 1 157 4 1 bed bed Bed bed bed bed 02818832 n04557522 water_bed.n.01 +display sign 1 208 40 7 sign otherprop Objects +diaper bin 1 307 40 7 bin otherprop Objects +router 1 303 40 7 router otherprop Objects +ashtray 1 377 40 7 ashtray otherprop Objects n02747802 ashtray.n.01 +footrest/table 1 40 7 otherprop Objects +cleaning brush 1 40 7 otherprop Objects +bathroom desk 1 36 14 10 desk desk Table desk desk table 04379243 n03179701 desk.n.01 +toilet commode 1 40 7 otherprop Objects +staicase handrail 1 40 7 otherprop Objects +clothes shelf 1 40 7 otherprop Objects +dink 1 40 7 otherprop Objects +toilet seat protectors 1 40 7 otherprop Objects +stuffware 1 40 7 otherprop Objects +low table for storage 1 40 7 otherprop Objects +covered stuff 1 40 7 otherprop Objects +hood 1 40 7 otherprop Objects +floor reflection 1 40 7 otherprop Objects +can opener 1 279 40 7 can opener otherprop Objects n02951585 can_opener.n.01 +top 1 40 7 otherprop Objects +wheely bin 1 307 40 7 bin otherprop Objects +book bag 1 55 37 7 bag bag Objects n02870676 book_bag.n.01 +body wash 1 40 7 otherprop Objects +study chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +stepladder 1 48 39 6 ladder otherfurniture Furniture stairs n04315599 step_ladder.n.01 +paper holder 1 470 40 7 paper holder otherprop Objects +white 1 40 7 otherprop Objects +yoga ball 1 60 40 7 ball otherprop Objects +consol 1 40 7 otherprop Objects +cloths container 1 140 40 7 container otherprop Objects +shorts 1 192 40 7 shorts otherprop Objects n04204755 short_circuit.n.01 +emergency exit windows 1 40 7 otherprop Objects +gym 1 40 7 otherprop Objects n03472112 gymnasium.n.02 +box of tissues 1 40 7 otherprop Objects +trolly 1 221 39 6 trolly otherfurniture Furniture +water purifyer 1 93 40 7 water purifier otherprop Objects +clutter' 1 40 7 otherprop Objects +wallend 1 40 7 otherprop Objects +tissue `paper 1 40 7 otherprop Objects +mop and bucket 1 427 40 7 bucket otherprop Objects +grocery 1 40 7 otherprop Objects n03461385 grocery_store.n.01 +worktable 1 19 7 10 table table Table table table table 04379243 n04603729 worktable.n.01 +air outlet 1 40 7 otherprop Objects +fold 1 97 40 7 pen otherprop Objects n03376159 fold.n.06 +toilet commoed 1 40 7 otherprop Objects +handfold 1 40 7 otherprop Objects +business chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +llong table chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +books in a shelf 1 40 7 otherprop Objects +chaurs 1 40 7 otherprop Objects +tennis table stand 1 50 39 6 stand otherfurniture Furniture +kitchen water purifier 1 93 40 7 water purifier otherprop Objects +lid 1 533 40 7 lid otherprop Objects +electric hob 1 40 7 otherprop Objects +baggage 1 783 40 7 luggage otherprop Objects +cpnter 1 40 7 otherprop Objects +stairs (exit) 1 40 7 otherprop Objects +equipment 1 40 7 otherprop Objects n03294048 equipment.n.01 +rocking chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n04099969 rocking_chair.n.01 +bunkbed 1 804 39 6 bunk bed otherfurniture Furniture +divan 1 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n03214966 divan.n.01 +bottle of hand sanitizer 1 40 7 otherprop Objects +sales stall 1 40 7 otherprop Objects +dehumidifer 1 40 7 otherprop Objects +wall cover 1 40 7 otherprop Objects +plumbing 1 40 7 otherprop Objects n03969041 plumbing.n.01 +elliptical machine 1 220 40 7 machine otherprop Objects +playball 1 40 7 otherprop Objects +safety bar 1 51 38 7 bar otherstructure Objects +stereo 1 84 40 7 stereo otherprop Objects n04315948 stereo.n.01 +havlu 1 40 7 otherprop Objects +handbag 1 40 7 otherprop Objects n02774152 bag.n.04 +furnance 1 551 39 6 furnace otherfurniture Furniture +shleves 1 40 7 otherprop Objects +coat hanger 1 400 40 7 coat hanger otherprop Objects n03057920 coat_hanger.n.01 +erar wall 1 21 1 12 wall wall Wall +bed bench 1 204 39 6 bench otherfurniture Furniture bench bench 02828884 n02828884 bench.n.01 +tissu 1 648 40 7 tissue otherprop Objects +plastic tub 1 232 40 7 plastic tub otherprop Objects bathtub bathtub tub 02808440 n02808440 bathtub.n.01 +potholder 1 40 7 otherprop Objects n03992115 potholder.n.01 +coffee mug 1 263 40 7 vessel otherprop Objects cup or mug 03797390 n03063599 coffee_mug.n.01 +tennis rcket bag 1 55 37 7 bag bag Objects +stand lamp 1 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +bed/sofa 1 40 7 otherprop Objects +laundry supply 1 40 7 otherprop Objects +document shredder 1 40 7 otherprop Objects +gas-range stove 1 242 38 7 stove otherstructure Objects stove 04330267 n04330267 stove.n.02 +table soccer 1 40 7 otherprop Objects +cookingrange 1 40 7 otherprop Objects +bookbags 1 40 7 otherprop Objects +downstairs 1 40 7 otherprop Objects +coffeepot 1 893 40 7 coffee pot otherprop Objects n03063689 coffeepot.n.01 +jar 1 70 40 7 jar otherprop Objects jar 03593526 n03593526 jar.n.01 +rear wall 1 21 1 12 wall wall Wall +part of chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +tape 1 109 40 7 tape otherprop Objects +drawer table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +woodenrack 1 40 7 otherprop Objects +toilet floor 1 11 2 5 floor floor Floor +cushioned seating 1 40 7 otherprop Objects +bulls eye 1 40 7 otherprop Objects +soft mat 1 40 7 otherprop Objects +snack box 1 26 29 7 box box Objects +desk organizer 1 40 7 otherprop Objects +footboard 1 559 40 7 sheet otherprop Objects n03379461 footboard.n.02 +wall hook 1 40 7 otherprop Objects +chopping board 1 408 38 7 board otherstructure Objects n03025513 chopping_board.n.01 +round picture 1 64 11 8 picture picture Picture +chimney 1 702 38 7 chimney otherstructure Objects n03017428 chimney.n.01 +studio screen 1 40 7 otherprop Objects +personal belonging 1 40 7 otherprop Objects +roll of paper 1 15 26 7 paper paper Objects +gaming wheel 1 40 7 otherprop Objects +landlord 1 331 31 7 person person Objects person n10245236 landlord.n.01 +ebd 1 40 7 otherprop Objects +heater radiator 1 236 39 6 radiator otherfurniture Furniture +cabinet above 1 40 7 otherprop Objects +weighted plate 1 233 40 7 plate otherprop Objects +travelling bag 1 55 37 7 bag bag Objects suitcase 02773838 n02773838 bag.n.06 +desk material 1 40 7 otherprop Objects +door wall 1 21 1 12 wall wall Wall +traffic cone 1 6 40 7 cone otherprop Objects cone +computer mouse 1 103 40 7 mouse otherprop Objects n03793489 mouse.n.04 +coathanger 1 400 40 7 coat hanger otherprop Objects +bureau 1 524 39 6 furniture otherfurniture Furniture dresser dresser n03015254 chest_of_drawers.n.01 +tyre 1 40 7 otherprop Objects n04440749 tire.n.01 +armchairchair 1 40 7 otherprop Objects +oven range 1 40 7 otherprop Objects +pants 1 40 7 otherprop Objects n04489008 trouser.n.01 +chiropractic chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +keg 1 343 39 6 barrel otherfurniture Furniture n03610418 keg.n.02 +spray 1 40 7 otherprop Objects n02754103 atomizer.n.01 +paper trimmer 1 40 7 otherprop Objects +standing whiteboard 1 45 30 7 whiteboard whiteboard Objects +desk drawer 1 475 39 6 desk drawer otherfurniture Furniture +window/windowed door 1 28 8 12 door door Wall door +soapbox 1 671 40 7 soap box otherprop Objects +pillow sofa 1 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +centre table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +doorway 1 609 38 7 door way otherstructure Objects door n03224032 doorway.n.01 +wall and whiteboard 1 45 30 7 whiteboard whiteboard Objects +laptop computer 1 46 40 7 computer otherprop Objects laptop laptop 03642806 n03642806 laptop.n.01 +scanner/copier 1 40 7 otherprop Objects +suitcase w/clothes 1 40 7 otherprop Objects +power pusher 1 40 7 otherprop Objects +shower faucet handle 1 758 40 7 handle otherprop Objects +walk 1 40 7 otherprop Objects n04544979 walk.n.05 +matte 1 40 7 otherprop Objects +atm machine 1 220 40 7 machine otherprop Objects +garage door 1 850 38 7 garage door otherstructure Objects door +wals 1 40 7 otherprop Objects +cabinet aisle 1 40 7 otherprop Objects +table light 1 62 38 7 light otherstructure Objects +guillotine paper trimmer 1 40 7 otherprop Objects +round 2\ 1 40 7 otherprop Objects +teddy 1 40 7 otherprop Objects n03013580 chemise.n.01 +white board/divider 1 40 7 otherprop Objects +white wall 1 21 1 12 wall wall Wall +mark 1 40 7 otherprop Objects n04681387 crisscross.n.01 +partition wall 1 21 1 12 wall wall Wall +shag rug 1 130 40 7 rug otherprop Objects n04183217 shag_rug.n.01 +upstair way 1 40 7 otherprop Objects +music stand' 1 820 39 6 music stand otherfurniture Furniture +recamier 1 40 7 otherprop Objects +venthole 1 40 7 otherprop Objects n04526241 vent.n.01 +dining seat 1 40 7 otherprop Objects +toilet cover 1 40 7 otherprop Objects +personal item 1 40 7 otherprop Objects +tallboy 1 524 39 6 furniture otherfurniture Furniture dresser dresser n03518305 highboy.n.01 +drawers unit 1 40 7 otherprop Objects +teapot 1 678 40 7 tea pot otherprop Objects n04398044 teapot.n.01 +cook cabinet 1 3 3 6 cabinet cabinet Furniture cabinet 02933112 n02933112 cabinet.n.01 +wok pan 1 589 40 7 pan otherprop Objects +tv tray 1 179 40 7 tray otherprop Objects +round chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +sawhorse 1 40 7 otherprop Objects n04140631 sawhorse.n.01 +kitchen range 1 242 38 7 stove otherstructure Objects n04330340 stove.n.01 +busdrver 1 40 7 otherprop Objects +barricade 1 40 7 otherprop Objects +wall ornament 1 40 7 otherprop Objects +color printer 1 66 40 7 printer otherprop Objects printer 04004475 n04004475 printer.n.03 +sticker 1 725 40 7 sticker otherprop Objects n07272545 gummed_label.n.01 +exit sign 1 86 40 7 exit sign otherprop Objects +gas stove 1 242 38 7 stove otherstructure Objects stove 04330267 n04330267 stove.n.02 +venta hood 1 40 7 otherprop Objects +copier/printer 1 40 7 otherprop Objects +wall-mounted lamp 1 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +item box 1 26 29 7 box box Objects +water puifyer 1 40 7 otherprop Objects +wall papper 1 40 7 otherprop Objects +salt and peper 1 737 40 7 salt and pepper otherprop Objects +printer four 1 40 7 otherprop Objects +towel fastener 1 40 7 otherprop Objects +basth 1 40 7 otherprop Objects +flipflops 1 40 7 otherprop Objects +bonus 1 40 7 otherprop Objects +kitchen box 1 26 29 7 box box Objects n02883344 box.n.01 +central heating unit 1 40 7 otherprop Objects +hanging tubelight 1 40 7 otherprop Objects +soccer ball 1 837 40 7 soccer ball otherprop Objects n04254680 soccer_ball.n.01 +almarah 1 40 7 otherprop Objects +canopy 1 40 7 otherprop Objects +med box 1 26 29 7 box box Objects +drain 1 567 38 7 drain otherstructure Objects +panelling 1 21 1 12 wall wall Wall n03882611 paneling.n.01 +bed stand 1 50 39 6 stand otherfurniture Furniture +deal 1 408 38 7 board otherstructure Objects n15102622 deal.n.04 +massage 1 40 7 otherprop Objects +safety rail 1 497 38 7 railing otherstructure Objects n04127395 safety_rail.n.01 +vacuumer 1 40 7 otherprop Objects +binfl 1 40 7 otherprop Objects +lightbulb 1 566 40 7 light bulb otherprop Objects lamp n03665924 light_bulb.n.01 +door hydraulic 1 40 7 otherprop Objects +induction cook top 1 40 7 otherprop Objects +bedstand 1 40 7 otherprop Objects +calander 1 40 7 otherprop Objects +set of seats 1 40 7 otherprop Objects +chocolate bar dispenser 1 40 7 otherprop Objects +wall unit tv 1 40 7 otherprop Objects +broomstick 1 328 40 7 broom otherprop Objects n02907082 broomstick.n.01 +bath faucet 1 9 40 7 faucet otherprop Objects faucet 03325088 n03325088 faucet.n.01 +folded cloth 1 40 7 otherprop Objects +supply 1 40 7 otherprop Objects +under oven drawer 1 174 39 6 drawer otherfurniture Furniture +kinect 1 823 40 7 kinect otherprop Objects +cash 1 40 7 otherprop Objects n10886222 cash.n.03 +dining side wall 1 21 1 12 wall wall Wall +log 1 40 7 otherprop Objects n03686658 log.n.05 +garden gnome 1 40 7 otherprop Objects +coucnb 1 40 7 otherprop Objects +dart 1 40 7 otherprop Objects n03162818 dart.n.01 +dust pan and brush 1 40 7 otherprop Objects +smoke alarm 1 525 40 7 alarm otherprop Objects n03343737 fire_alarm.n.02 +kitchen top 1 40 7 otherprop Objects +toilet flush 1 40 7 otherprop Objects +cooler 1 17 24 6 refridgerator refridgerator Furniture n03102654 cooler.n.01 +kitchen island 1 456 38 7 kitchen island otherstructure Objects n03620600 kitchen_island.n.01 +balcony 1 40 7 otherprop Objects +escape door 1 28 8 12 door door Wall door +hammer 1 883 40 7 hammer otherprop Objects n03481172 hammer.n.02 +wall and paiting 1 40 7 otherprop Objects +kitch shelf 1 40 7 otherprop Objects +handwasher 1 40 7 otherprop Objects +vanity top 1 40 7 otherprop Objects +bodyboard 1 40 7 otherprop Objects +messenger bag 1 55 37 7 bag bag Objects +stationary bike 1 40 7 otherprop Objects +cabinet countertop 1 40 7 otherprop Objects +ping pong padle 1 40 7 otherprop Objects +teapoy 1 40 7 otherprop Objects +clothes basket 1 39 40 7 basket otherprop Objects basket 02801938 n03050864 clothes_hamper.n.01 +xbox 1 628 40 7 xbox otherprop Objects xbox +both 1 40 7 otherprop Objects +foosball 1 40 7 otherprop Objects +soad stand 1 50 39 6 stand otherfurniture Furniture +prop 1 40 7 otherprop Objects n02692086 airplane_propeller.n.01 +buddha 1 40 7 otherprop Objects +reflection in a mirror 1 122 19 7 mirror mirror Objects +bar stol 1 40 7 otherprop Objects +oven/stove 1 40 7 otherprop Objects +patterned rug 1 130 40 7 rug otherprop Objects +window panel 1 40 7 otherprop Objects +vault 1 40 7 otherprop Objects +dust bin cover 1 40 7 otherprop Objects +throw 1 872 40 7 throw otherprop Objects n04429971 throw.n.04 +painting and frame 1 40 7 otherprop Objects +covered piano 1 298 39 6 piano otherfurniture Furniture piano piano 03928116 n03928116 piano.n.01 +drawer unit 1 40 7 otherprop Objects +aircon 1 40 7 otherprop Objects +package 1 40 7 otherprop Objects n03871083 package.n.02 +gas vent 1 40 7 otherprop Objects +block 1 40 7 otherprop Objects +cloth container 1 140 40 7 container otherprop Objects +additional printer 1 66 40 7 printer otherprop Objects printer 04004475 n04004475 printer.n.03 +danger sign 1 208 40 7 sign otherprop Objects +game machine 1 220 40 7 machine otherprop Objects +light fixture 1 40 7 otherprop Objects +utility 1 40 7 otherprop Objects n04516874 utility.n.06 +base rack 1 40 7 otherprop Objects +staircase landing 1 40 7 otherprop Objects +szll 1 40 7 otherprop Objects +piano note 1 40 7 otherprop Objects +bboks 1 40 7 otherprop Objects +cabord 1 40 7 otherprop Objects +central table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +splash 1 40 7 otherprop Objects n04682319 splash.n.04 +suit 1 40 7 otherprop Objects n04350905 suit.n.01 +cook top 1 40 7 otherprop Objects +jug 1 687 40 7 jug otherprop Objects bottle bottle 02876657 n03603722 jug.n.01 +stepstool 1 276 40 7 step stool otherprop Objects +tripod 1 50 39 6 stand otherfurniture Furniture n04485082 tripod.n.01 +cover box 1 26 29 7 box box Objects +baby crib 1 485 39 6 crib otherfurniture Furniture +air condisnor 1 40 7 otherprop Objects +water softner 1 40 7 otherprop Objects +chandelier 1 342 38 7 chandelier otherstructure Objects n03005285 chandelier.n.01 +floor patterning 1 40 7 otherprop Objects +tablet top 1 40 7 otherprop Objects +smoke detector 1 40 7 otherprop Objects +baseball cap 1 40 7 otherprop Objects cap 02954340 n02799323 baseball_cap.n.01 +tissue roll holder 1 40 7 otherprop Objects +case of water 1 40 7 otherprop Objects +wall-organizer 1 40 7 otherprop Objects +piece 1 40 7 otherprop Objects n03343853 firearm.n.01 +wheelbarrel 1 40 7 otherprop Objects +desktop item 1 40 7 otherprop Objects +tv showcase 1 40 7 otherprop Objects +chelves 1 40 7 otherprop Objects +toothbrush 1 127 40 7 toothbrush otherprop Objects n04453156 toothbrush.n.01 +chiffonière 1 40 7 otherprop Objects +leg towel 1 135 27 7 towel towel Objects +flowers/decorations 1 40 7 otherprop Objects +snake toy 1 389 40 7 toy otherprop Objects +cabinet's side 1 40 7 otherprop Objects +bedroom chair 1 5 5 4 chair chair Chair chair chair chair 03001627 n03001627 chair.n.01 +drum 1 145 40 7 drum otherprop Objects n03249569 drum.n.01 +liquid soap 1 133 40 7 soap otherprop Objects +set of bedding 1 40 7 otherprop Objects +night lamp 1 144 35 7 lamp lamp Objects lamp lamp 03636649 n03636649 lamp.n.02 +post board 1 408 38 7 board otherstructure Objects +measuring cup 1 730 40 7 measuring cup otherprop Objects cup n03733805 measuring_cup.n.01 +baseboard heater 1 111 39 6 heater otherfurniture Furniture +paper shelf 1 40 7 otherprop Objects +alert sheet 1 559 40 7 sheet otherprop Objects +duster 1 115 40 7 duster otherprop Objects n03258330 dustcloth.n.01 +snooker table 1 19 7 10 table table Table table table table 04379243 n03982430 pool_table.n.01 +leg rest 1 40 7 otherprop Objects +wall storage 1 40 7 otherprop Objects +office board 1 408 38 7 board otherstructure Objects +bathroom counter 1 7 12 6 counter counter Furniture table table table 04379243 n03116530 counter.n.01 +table sofa 1 83 6 9 sofa sofa Sofa sofa sofa sofa 04256520 n04256520 sofa.n.01 +glass-topped table 1 19 7 10 table table Table table table table 04379243 n04379243 table.n.02 +racket bat 1 40 7 otherprop Objects +fridge handle 1 758 40 7 handle otherprop Objects +stove top 1 40 7 otherprop Objects +monitor from pc 1 40 7 otherprop Objects +stick 1 529 40 7 stick otherprop Objects diff --git a/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/scannet_util.py b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/scannet_util.py new file mode 100644 index 0000000..c830991 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/preprocessing/scannet_util.py @@ -0,0 +1,21 @@ + + +g_label_names = ['unannotated', 'wall', 'floor', 'chair', 'table', 'desk', 'bed', 'bookshelf', 'sofa', 'sink', 'bathtub', 'toilet', 'curtain', 'counter', 'door', 'window', 'shower curtain', 'refridgerator', 'picture', 'cabinet', 'otherfurniture'] + +def get_raw2scannet_label_map(): + lines = [line.rstrip() for line in open('scannet-labels.combined.tsv')] + lines = lines[1:] + raw2scannet = {} + for i in range(len(lines)): + label_classes_set = set(g_label_names) + elements = lines[i].split('\t') + raw_name = elements[0] + nyu40_name = elements[6] + if nyu40_name not in label_classes_set: + raw2scannet[raw_name] = 'unannotated' + else: + raw2scannet[raw_name] = nyu40_name + return raw2scannet + + +g_raw2scannet = get_raw2scannet_label_map() diff --git a/zoo/SimpleView/pointnet2_tf/scannet/scannet_dataset.py b/zoo/SimpleView/pointnet2_tf/scannet/scannet_dataset.py new file mode 100644 index 0000000..4b586cc --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/scannet_dataset.py @@ -0,0 +1,182 @@ +import pickle +import os +import sys +import numpy as np +import pc_util +import scene_util + +class ScannetDataset(): + def __init__(self, root, npoints=8192, split='train'): + self.npoints = npoints + self.root = root + self.split = split + self.data_filename = os.path.join(self.root, 'scannet_%s.pickle'%(split)) + with open(self.data_filename,'rb') as fp: + self.scene_points_list = pickle.load(fp) + self.semantic_labels_list = pickle.load(fp) + if split=='train': + labelweights = np.zeros(21) + for seg in self.semantic_labels_list: + tmp,_ = np.histogram(seg,range(22)) + labelweights += tmp + labelweights = labelweights.astype(np.float32) + labelweights = labelweights/np.sum(labelweights) + self.labelweights = 1/np.log(1.2+labelweights) + elif split=='test': + self.labelweights = np.ones(21) + def __getitem__(self, index): + point_set = self.scene_points_list[index] + semantic_seg = self.semantic_labels_list[index].astype(np.int32) + coordmax = np.max(point_set,axis=0) + coordmin = np.min(point_set,axis=0) + smpmin = np.maximum(coordmax-[1.5,1.5,3.0], coordmin) + smpmin[2] = coordmin[2] + smpsz = np.minimum(coordmax-smpmin,[1.5,1.5,3.0]) + smpsz[2] = coordmax[2]-coordmin[2] + isvalid = False + for i in range(10): + curcenter = point_set[np.random.choice(len(semantic_seg),1)[0],:] + curmin = curcenter-[0.75,0.75,1.5] + curmax = curcenter+[0.75,0.75,1.5] + curmin[2] = coordmin[2] + curmax[2] = coordmax[2] + curchoice = np.sum((point_set>=(curmin-0.2))*(point_set<=(curmax+0.2)),axis=1)==3 + cur_point_set = point_set[curchoice,:] + cur_semantic_seg = semantic_seg[curchoice] + if len(cur_semantic_seg)==0: + continue + mask = np.sum((cur_point_set>=(curmin-0.01))*(cur_point_set<=(curmax+0.01)),axis=1)==3 + vidx = np.ceil((cur_point_set[mask,:]-curmin)/(curmax-curmin)*[31.0,31.0,62.0]) + vidx = np.unique(vidx[:,0]*31.0*62.0+vidx[:,1]*62.0+vidx[:,2]) + isvalid = np.sum(cur_semantic_seg>0)/len(cur_semantic_seg)>=0.7 and len(vidx)/31.0/31.0/62.0>=0.02 + if isvalid: + break + choice = np.random.choice(len(cur_semantic_seg), self.npoints, replace=True) + point_set = cur_point_set[choice,:] + semantic_seg = cur_semantic_seg[choice] + mask = mask[choice] + sample_weight = self.labelweights[semantic_seg] + sample_weight *= mask + return point_set, semantic_seg, sample_weight + def __len__(self): + return len(self.scene_points_list) + +class ScannetDatasetWholeScene(): + def __init__(self, root, npoints=8192, split='train'): + self.npoints = npoints + self.root = root + self.split = split + self.data_filename = os.path.join(self.root, 'scannet_%s.pickle'%(split)) + with open(self.data_filename,'rb') as fp: + self.scene_points_list = pickle.load(fp) + self.semantic_labels_list = pickle.load(fp) + if split=='train': + labelweights = np.zeros(21) + for seg in self.semantic_labels_list: + tmp,_ = np.histogram(seg,range(22)) + labelweights += tmp + labelweights = labelweights.astype(np.float32) + labelweights = labelweights/np.sum(labelweights) + self.labelweights = 1/np.log(1.2+labelweights) + elif split=='test': + self.labelweights = np.ones(21) + def __getitem__(self, index): + point_set_ini = self.scene_points_list[index] + semantic_seg_ini = self.semantic_labels_list[index].astype(np.int32) + coordmax = np.max(point_set_ini,axis=0) + coordmin = np.min(point_set_ini,axis=0) + nsubvolume_x = np.ceil((coordmax[0]-coordmin[0])/1.5).astype(np.int32) + nsubvolume_y = np.ceil((coordmax[1]-coordmin[1])/1.5).astype(np.int32) + point_sets = list() + semantic_segs = list() + sample_weights = list() + isvalid = False + for i in range(nsubvolume_x): + for j in range(nsubvolume_y): + curmin = coordmin+[i*1.5,j*1.5,0] + curmax = coordmin+[(i+1)*1.5,(j+1)*1.5,coordmax[2]-coordmin[2]] + curchoice = np.sum((point_set_ini>=(curmin-0.2))*(point_set_ini<=(curmax+0.2)),axis=1)==3 + cur_point_set = point_set_ini[curchoice,:] + cur_semantic_seg = semantic_seg_ini[curchoice] + if len(cur_semantic_seg)==0: + continue + mask = np.sum((cur_point_set>=(curmin-0.001))*(cur_point_set<=(curmax+0.001)),axis=1)==3 + choice = np.random.choice(len(cur_semantic_seg), self.npoints, replace=True) + point_set = cur_point_set[choice,:] # Nx3 + semantic_seg = cur_semantic_seg[choice] # N + mask = mask[choice] + if sum(mask)/float(len(mask))<0.01: + continue + sample_weight = self.labelweights[semantic_seg] + sample_weight *= mask # N + point_sets.append(np.expand_dims(point_set,0)) # 1xNx3 + semantic_segs.append(np.expand_dims(semantic_seg,0)) # 1xN + sample_weights.append(np.expand_dims(sample_weight,0)) # 1xN + point_sets = np.concatenate(tuple(point_sets),axis=0) + semantic_segs = np.concatenate(tuple(semantic_segs),axis=0) + sample_weights = np.concatenate(tuple(sample_weights),axis=0) + return point_sets, semantic_segs, sample_weights + def __len__(self): + return len(self.scene_points_list) + +class ScannetDatasetVirtualScan(): + def __init__(self, root, npoints=8192, split='train'): + self.npoints = npoints + self.root = root + self.split = split + self.data_filename = os.path.join(self.root, 'scannet_%s.pickle'%(split)) + with open(self.data_filename,'rb') as fp: + self.scene_points_list = pickle.load(fp) + self.semantic_labels_list = pickle.load(fp) + if split=='train': + labelweights = np.zeros(21) + for seg in self.semantic_labels_list: + tmp,_ = np.histogram(seg,range(22)) + labelweights += tmp + labelweights = labelweights.astype(np.float32) + labelweights = labelweights/np.sum(labelweights) + self.labelweights = 1/np.log(1.2+labelweights) + elif split=='test': + self.labelweights = np.ones(21) + def __getitem__(self, index): + point_set_ini = self.scene_points_list[index] + semantic_seg_ini = self.semantic_labels_list[index].astype(np.int32) + sample_weight_ini = self.labelweights[semantic_seg_ini] + point_sets = list() + semantic_segs = list() + sample_weights = list() + for i in xrange(8): + smpidx = scene_util.virtual_scan(point_set_ini,mode=i) + if len(smpidx)<300: + continue + point_set = point_set_ini[smpidx,:] + semantic_seg = semantic_seg_ini[smpidx] + sample_weight = sample_weight_ini[smpidx] + choice = np.random.choice(len(semantic_seg), self.npoints, replace=True) + point_set = point_set[choice,:] # Nx3 + semantic_seg = semantic_seg[choice] # N + sample_weight = sample_weight[choice] # N + point_sets.append(np.expand_dims(point_set,0)) # 1xNx3 + semantic_segs.append(np.expand_dims(semantic_seg,0)) # 1xN + sample_weights.append(np.expand_dims(sample_weight,0)) # 1xN + point_sets = np.concatenate(tuple(point_sets),axis=0) + semantic_segs = np.concatenate(tuple(semantic_segs),axis=0) + sample_weights = np.concatenate(tuple(sample_weights),axis=0) + return point_sets, semantic_segs, sample_weights + def __len__(self): + return len(self.scene_points_list) + +if __name__=='__main__': + d = ScannetDatasetWholeScene(root = './data', split='test', npoints=8192) + labelweights_vox = np.zeros(21) + for ii in xrange(len(d)): + print ii + ps,seg,smpw = d[ii] + for b in xrange(ps.shape[0]): + _, uvlabel, _ = pc_util.point_cloud_label_to_surface_voxel_label_fast(ps[b,smpw[b,:]>0,:], seg[b,smpw[b,:]>0], res=0.02) + tmp,_ = np.histogram(uvlabel,range(22)) + labelweights_vox += tmp + print labelweights_vox[1:].astype(np.float32)/np.sum(labelweights_vox[1:].astype(np.float32)) + exit() + + diff --git a/zoo/SimpleView/pointnet2_tf/scannet/scene_util.py b/zoo/SimpleView/pointnet2_tf/scannet/scene_util.py new file mode 100644 index 0000000..b50c421 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/scene_util.py @@ -0,0 +1,73 @@ +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +import numpy as np +from sklearn.neighbors import NearestNeighbors +from numpy import linalg as la +import scipy.io as sio + +def cart2sph(xyz): + xy = xyz[:,0]**2+xyz[:,1]**2 + aer = np.zeros(xyz.shape) + aer[:,2] = np.sqrt(xy+xyz[:,2]**2) + aer[:,1] = np.arctan2(xyz[:,2],np.sqrt(xy)) + aer[:,0] = np.arctan2(xyz[:,1],xyz[:,0]) + return aer + +# generate virtual scan of a scene by subsampling the point cloud +def virtual_scan(xyz, mode=-1): + camloc = np.mean(xyz,axis=0) + camloc[2] = 1.5 # human height + if mode==-1: + view_dr = np.array([2*np.pi*np.random.random(), np.pi/10*(np.random.random()-0.75)]) + camloc[:2] -= (0.8+0.7*np.random.random())*np.array([np.cos(view_dr[0]),np.sin(view_dr[0])]) + else: + view_dr = np.array([np.pi/4*mode, 0]) + camloc[:2] -= np.array([np.cos(view_dr[0]),np.sin(view_dr[0])]) + ct_ray_dr = np.array([np.cos(view_dr[1])*np.cos(view_dr[0]), np.cos(view_dr[1])*np.sin(view_dr[0]), np.sin(view_dr[1])]) + hr_dr = np.cross(ct_ray_dr, np.array([0,0,1])) + hr_dr /= la.norm(hr_dr) + vt_dr = np.cross(hr_dr, ct_ray_dr) + vt_dr /= la.norm(vt_dr) + xx = np.linspace(-0.6,0.6,200) #200 + yy = np.linspace(-0.45,0.45,150) #150 + xx, yy = np.meshgrid(xx,yy) + xx = xx.reshape(-1,1) + yy = yy.reshape(-1,1) + rays = xx*hr_dr.reshape(1,-1)+yy*vt_dr.reshape(1,-1)+ct_ray_dr.reshape(1,-1) + rays_aer = cart2sph(rays) + local_xyz = xyz-camloc.reshape(1,-1) + local_aer = cart2sph(local_xyz) + nbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree').fit(rays_aer[:,:2]) + mindd, minidx = nbrs.kneighbors(local_aer[:,:2]) + mindd = mindd.reshape(-1) + minidx = minidx.reshape(-1) + + sub_idx = mindd<0.01 + if sum(sub_idx)<100: + return np.ones(0) + sub_r = local_aer[sub_idx,2] + sub_minidx = minidx[sub_idx] + min_r = float('inf')*np.ones(np.max(sub_minidx)+1) + for i in xrange(len(sub_r)): + if sub_r[i]min_r[sub_minidx[i]]: + sub_smpidx[i] = 0 + smpidx = np.where(sub_idx)[0] + smpidx = smpidx[sub_smpidx==1] + return smpidx + +if __name__=='__main__': + pc = np.load('scannet_dataset/scannet_scenes/scene0015_00.npy') + print pc.shape + xyz = pc[:,:3] + seg = pc[:,7] + smpidx = virtual_scan(xyz,mode=2) + xyz = xyz[smpidx,:] + seg = seg[smpidx] + sio.savemat('tmp.mat',{'pc':xyz,'seg':seg}) diff --git a/zoo/SimpleView/pointnet2_tf/scannet/train.py b/zoo/SimpleView/pointnet2_tf/scannet/train.py new file mode 100644 index 0000000..9841907 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/scannet/train.py @@ -0,0 +1,433 @@ +import argparse +import math +from datetime import datetime +#import h5pyprovider +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(BASE_DIR) # model +sys.path.append(ROOT_DIR) # provider +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import pc_util +sys.path.append(os.path.join(ROOT_DIR, 'data_prep')) +import scannet_dataset + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='model', help='Model name [default: model]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=8192, help='Point Number [default: 8192]') +parser.add_argument('--max_epoch', type=int, default=201, help='Epoch to run [default: 201]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(BASE_DIR, FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 21 + +# Shapenet official train/test split +DATA_PATH = os.path.join(ROOT_DIR,'data','scannet_data_pointnet2') +TRAIN_DATASET = scannet_dataset.ScannetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train') +TEST_DATASET = scannet_dataset.ScannetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test') +TEST_DATASET_WHOLE_SCENE = scannet_dataset.ScannetDatasetWholeScene(root=DATA_PATH, npoints=NUM_POINT, split='test') + + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learing_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl, smpws_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + print is_training_pl + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter for you every time it trains. + batch = tf.Variable(0) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + print "--- Get model and loss" + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, NUM_CLASSES, bn_decay=bn_decay) + loss = MODEL.get_loss(pred, labels_pl, smpws_pl) + tf.summary.scalar('loss', loss) + + correct = tf.equal(tf.argmax(pred, 2), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE*NUM_POINT) + tf.summary.scalar('accuracy', accuracy) + + print "--- Get training operator" + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + #sess.run(init, {is_training_pl: True}) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'smpws_pl': smpws_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + if epoch%5==0: + acc = eval_one_epoch(sess, ops, test_writer) + acc = eval_whole_scene_one_epoch(sess, ops, test_writer) + if acc > best_acc: + best_acc = acc + save_path = saver.save(sess, os.path.join(LOG_DIR, "best_model_epoch_%03d.ckpt"%(epoch))) + log_string("Model saved in file: %s" % save_path) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + +def get_batch_wdp(dataset, idxs, start_idx, end_idx): + bsize = end_idx-start_idx + batch_data = np.zeros((bsize, NUM_POINT, 3)) + batch_label = np.zeros((bsize, NUM_POINT), dtype=np.int32) + batch_smpw = np.zeros((bsize, NUM_POINT), dtype=np.float32) + for i in range(bsize): + ps,seg,smpw = dataset[idxs[i+start_idx]] + batch_data[i,...] = ps + batch_label[i,:] = seg + batch_smpw[i,:] = smpw + + dropout_ratio = np.random.random()*0.875 # 0-0.875 + drop_idx = np.where(np.random.random((ps.shape[0]))<=dropout_ratio)[0] + batch_data[i,drop_idx,:] = batch_data[i,0,:] + batch_label[i,drop_idx] = batch_label[i,0] + batch_smpw[i,drop_idx] *= 0 + return batch_data, batch_label, batch_smpw + +def get_batch(dataset, idxs, start_idx, end_idx): + bsize = end_idx-start_idx + batch_data = np.zeros((bsize, NUM_POINT, 3)) + batch_label = np.zeros((bsize, NUM_POINT), dtype=np.int32) + batch_smpw = np.zeros((bsize, NUM_POINT), dtype=np.float32) + for i in range(bsize): + ps,seg,smpw = dataset[idxs[i+start_idx]] + batch_data[i,...] = ps + batch_label[i,:] = seg + batch_smpw[i,:] = smpw + return batch_data, batch_label, batch_smpw + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + # Shuffle train samples + train_idxs = np.arange(0, len(TRAIN_DATASET)) + np.random.shuffle(train_idxs) + num_batches = len(TRAIN_DATASET)/BATCH_SIZE + + log_string(str(datetime.now())) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + batch_data, batch_label, batch_smpw = get_batch_wdp(TRAIN_DATASET, train_idxs, start_idx, end_idx) + # Augment batched point clouds by rotation + aug_data = provider.rotate_point_cloud_z(batch_data) + feed_dict = {ops['pointclouds_pl']: aug_data, + ops['labels_pl']: batch_label, + ops['smpws_pl']:batch_smpw, + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 2) + correct = np.sum(pred_val == batch_label) + total_correct += correct + total_seen += (BATCH_SIZE*NUM_POINT) + loss_sum += loss_val + if (batch_idx+1)%10 == 0: + log_string(' -- %03d / %03d --' % (batch_idx+1, num_batches)) + log_string('mean loss: %f' % (loss_sum / 10)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + +# evaluate on randomly chopped scenes +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + test_idxs = np.arange(0, len(TEST_DATASET)) + num_batches = len(TEST_DATASET)/BATCH_SIZE + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + total_correct_vox = 0 + total_seen_vox = 0 + total_seen_class_vox = [0 for _ in range(NUM_CLASSES)] + total_correct_class_vox = [0 for _ in range(NUM_CLASSES)] + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + labelweights = np.zeros(21) + labelweights_vox = np.zeros(21) + for batch_idx in range(num_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = (batch_idx+1) * BATCH_SIZE + batch_data, batch_label, batch_smpw = get_batch(TEST_DATASET, test_idxs, start_idx, end_idx) + + aug_data = provider.rotate_point_cloud_z(batch_data) + + feed_dict = {ops['pointclouds_pl']: aug_data, + ops['labels_pl']: batch_label, + ops['smpws_pl']: batch_smpw, + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 2) # BxN + correct = np.sum((pred_val == batch_label) & (batch_label>0) & (batch_smpw>0)) # evaluate only on 20 categories but not unknown + total_correct += correct + total_seen += np.sum((batch_label>0) & (batch_smpw>0)) + loss_sum += loss_val + tmp,_ = np.histogram(batch_label,range(22)) + labelweights += tmp + for l in range(NUM_CLASSES): + total_seen_class[l] += np.sum((batch_label==l) & (batch_smpw>0)) + total_correct_class[l] += np.sum((pred_val==l) & (batch_label==l) & (batch_smpw>0)) + + for b in xrange(batch_label.shape[0]): + _, uvlabel, _ = pc_util.point_cloud_label_to_surface_voxel_label_fast(aug_data[b,batch_smpw[b,:]>0,:], np.concatenate((np.expand_dims(batch_label[b,batch_smpw[b,:]>0],1),np.expand_dims(pred_val[b,batch_smpw[b,:]>0],1)),axis=1), res=0.02) + total_correct_vox += np.sum((uvlabel[:,0]==uvlabel[:,1])&(uvlabel[:,0]>0)) + total_seen_vox += np.sum(uvlabel[:,0]>0) + tmp,_ = np.histogram(uvlabel[:,0],range(22)) + labelweights_vox += tmp + for l in range(NUM_CLASSES): + total_seen_class_vox[l] += np.sum(uvlabel[:,0]==l) + total_correct_class_vox[l] += np.sum((uvlabel[:,0]==l) & (uvlabel[:,1]==l)) + + log_string('eval mean loss: %f' % (loss_sum / float(num_batches))) + log_string('eval point accuracy vox: %f'% (total_correct_vox / float(total_seen_vox))) + log_string('eval point avg class acc vox: %f' % (np.mean(np.array(total_correct_class_vox[1:])/(np.array(total_seen_class_vox[1:],dtype=np.float)+1e-6)))) + log_string('eval point accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval point avg class acc: %f' % (np.mean(np.array(total_correct_class[1:])/(np.array(total_seen_class[1:],dtype=np.float)+1e-6)))) + labelweights_vox = labelweights_vox[1:].astype(np.float32)/np.sum(labelweights_vox[1:].astype(np.float32)) + caliweights = np.array([0.388,0.357,0.038,0.033,0.017,0.02,0.016,0.025,0.002,0.002,0.002,0.007,0.006,0.022,0.004,0.0004,0.003,0.002,0.024,0.029]) + log_string('eval point calibrated average acc: %f' % (np.average(np.array(total_correct_class[1:])/(np.array(total_seen_class[1:],dtype=np.float)+1e-6),weights=caliweights))) + per_class_str = 'vox based --------' + for l in range(1,NUM_CLASSES): + per_class_str += 'class %d weight: %f, acc: %f; ' % (l,labelweights_vox[l-1],total_correct_class[l]/float(total_seen_class[l])) + log_string(per_class_str) + EPOCH_CNT += 1 + return total_correct/float(total_seen) + +# evaluate on whole scenes to generate numbers provided in the paper +def eval_whole_scene_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + test_idxs = np.arange(0, len(TEST_DATASET_WHOLE_SCENE)) + num_batches = len(TEST_DATASET_WHOLE_SCENE) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + total_correct_vox = 0 + total_seen_vox = 0 + total_seen_class_vox = [0 for _ in range(NUM_CLASSES)] + total_correct_class_vox = [0 for _ in range(NUM_CLASSES)] + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION WHOLE SCENE----'%(EPOCH_CNT)) + + labelweights = np.zeros(21) + labelweights_vox = np.zeros(21) + is_continue_batch = False + + extra_batch_data = np.zeros((0,NUM_POINT,3)) + extra_batch_label = np.zeros((0,NUM_POINT)) + extra_batch_smpw = np.zeros((0,NUM_POINT)) + for batch_idx in range(num_batches): + if not is_continue_batch: + batch_data, batch_label, batch_smpw = TEST_DATASET_WHOLE_SCENE[batch_idx] + batch_data = np.concatenate((batch_data,extra_batch_data),axis=0) + batch_label = np.concatenate((batch_label,extra_batch_label),axis=0) + batch_smpw = np.concatenate((batch_smpw,extra_batch_smpw),axis=0) + else: + batch_data_tmp, batch_label_tmp, batch_smpw_tmp = TEST_DATASET_WHOLE_SCENE[batch_idx] + batch_data = np.concatenate((batch_data,batch_data_tmp),axis=0) + batch_label = np.concatenate((batch_label,batch_label_tmp),axis=0) + batch_smpw = np.concatenate((batch_smpw,batch_smpw_tmp),axis=0) + if batch_data.shape[0]0) & (batch_smpw>0)) # evaluate only on 20 categories but not unknown + total_correct += correct + total_seen += np.sum((batch_label>0) & (batch_smpw>0)) + loss_sum += loss_val + tmp,_ = np.histogram(batch_label,range(22)) + labelweights += tmp + for l in range(NUM_CLASSES): + total_seen_class[l] += np.sum((batch_label==l) & (batch_smpw>0)) + total_correct_class[l] += np.sum((pred_val==l) & (batch_label==l) & (batch_smpw>0)) + + for b in xrange(batch_label.shape[0]): + _, uvlabel, _ = pc_util.point_cloud_label_to_surface_voxel_label_fast(aug_data[b,batch_smpw[b,:]>0,:], np.concatenate((np.expand_dims(batch_label[b,batch_smpw[b,:]>0],1),np.expand_dims(pred_val[b,batch_smpw[b,:]>0],1)),axis=1), res=0.02) + total_correct_vox += np.sum((uvlabel[:,0]==uvlabel[:,1])&(uvlabel[:,0]>0)) + total_seen_vox += np.sum(uvlabel[:,0]>0) + tmp,_ = np.histogram(uvlabel[:,0],range(22)) + labelweights_vox += tmp + for l in range(NUM_CLASSES): + total_seen_class_vox[l] += np.sum(uvlabel[:,0]==l) + total_correct_class_vox[l] += np.sum((uvlabel[:,0]==l) & (uvlabel[:,1]==l)) + + log_string('eval whole scene mean loss: %f' % (loss_sum / float(num_batches))) + log_string('eval whole scene point accuracy vox: %f'% (total_correct_vox / float(total_seen_vox))) + log_string('eval whole scene point avg class acc vox: %f' % (np.mean(np.array(total_correct_class_vox[1:])/(np.array(total_seen_class_vox[1:],dtype=np.float)+1e-6)))) + log_string('eval whole scene point accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval whole scene point avg class acc: %f' % (np.mean(np.array(total_correct_class[1:])/(np.array(total_seen_class[1:],dtype=np.float)+1e-6)))) + labelweights = labelweights[1:].astype(np.float32)/np.sum(labelweights[1:].astype(np.float32)) + labelweights_vox = labelweights_vox[1:].astype(np.float32)/np.sum(labelweights_vox[1:].astype(np.float32)) + caliweights = np.array([0.388,0.357,0.038,0.033,0.017,0.02,0.016,0.025,0.002,0.002,0.002,0.007,0.006,0.022,0.004,0.0004,0.003,0.002,0.024,0.029]) + caliacc = np.average(np.array(total_correct_class_vox[1:])/(np.array(total_seen_class_vox[1:],dtype=np.float)+1e-6),weights=caliweights) + log_string('eval whole scene point calibrated average acc vox: %f' % caliacc) + + per_class_str = 'vox based --------' + for l in range(1,NUM_CLASSES): + per_class_str += 'class %d weight: %f, acc: %f; ' % (l,labelweights_vox[l-1],total_correct_class_vox[l]/float(total_seen_class_vox[l])) + log_string(per_class_str) + EPOCH_CNT += 1 + return caliacc + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/interpolate.cpp b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/interpolate.cpp new file mode 100644 index 0000000..b7d0dd0 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/interpolate.cpp @@ -0,0 +1,169 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +using namespace tensorflow; + +REGISTER_OP("ThreeNN") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("dist: float32") + .Output("idx: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolate") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // (b,m,c) + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // (b,n,3) + c->WithRank(c->input(1), 3, &dims2); + // (b,n,c) + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("ThreeInterpolateGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("weight: float32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// Find three nearest neigbors with square distance +// input: xyz1 (b,n,3), xyz2(b,m,3) +// output: dist (b,n,3), idx (b,n,3) +void threenn_cpu(int b, int n, int m, const float *xyz1, const float *xyz2, float *dist, int *idx) { + for (int i=0;iinput(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,n,3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeNN expects (b,m,3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *dist_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,n,3}, &dist_tensor)); + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,n,3}, &idx_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto dist_flat = dist_tensor->flat(); + float *dist = &(dist_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + threenn_cpu(b,n,m,xyz1,xyz2,dist,idx); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeNN").Device(DEVICE_CPU), ThreeNNOp); + + + +class ThreeInterpolateOp: public OpKernel{ + public: + explicit ThreeInterpolateOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolate expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b && idx_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolate expects (b,n,3) weight shape")); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + threeinterpolate_cpu(b,m,c,n,points,idx,weight,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolate").Device(DEVICE_CPU),ThreeInterpolateOp); + + +class ThreeInterpolateGradOp: public OpKernel{ + public: + explicit ThreeInterpolateGradOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,m,c) points shape")); + int b = points_tensor.shape().dim_size(0); + int m = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) idx shape")); + int n = idx_tensor.shape().dim_size(1); + const Tensor& weight_tensor=context->input(2); + OP_REQUIRES(context,weight_tensor.dims()==3 && weight_tensor.shape().dim_size(0)==b && weight_tensor.shape().dim_size(1)==n && weight_tensor.shape().dim_size(2)==3, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,3) weight shape")); + + const Tensor& grad_out_tensor=context->input(3); + OP_REQUIRES(context,grad_out_tensor.dims()==3 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==n && grad_out_tensor.shape().dim_size(2)==c, errors::InvalidArgument("ThreeInterpolateGrad expects (b,n,c) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto weight_flat = weight_tensor.flat(); + const float *weight = &(weight_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + memset(grad_points, 0, sizeof(float)*b*m*c); + threeinterpolate_grad_cpu(b,n,c,m,grad_out,idx,weight,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("ThreeInterpolateGrad").Device(DEVICE_CPU),ThreeInterpolateGradOp); + + diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate.py b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate.py new file mode 100644 index 0000000..6f84da0 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate.py @@ -0,0 +1,59 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(__file__) +sys.path.append(BASE_DIR) +interpolate_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_interpolate_so.so')) +def three_nn(xyz1, xyz2): + ''' + Input: + xyz1: (b,n,3) float32 array, unknown points + xyz2: (b,m,3) float32 array, known points + Output: + dist: (b,n,3) float32 array, distances to known points + idx: (b,n,3) int32 array, indices to known points + ''' + return interpolate_module.three_nn(xyz1, xyz2) +ops.NoGradient('ThreeNN') +def three_interpolate(points, idx, weight): + ''' + Input: + points: (b,m,c) float32 array, known points + idx: (b,n,3) int32 array, indices to known points + weight: (b,n,3) float32 array, weights on known points + Output: + out: (b,n,c) float32 array, interpolated point values + ''' + return interpolate_module.three_interpolate(points, idx, weight) +@tf.RegisterGradient('ThreeInterpolate') +def _three_interpolate_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + weight = op.inputs[2] + return [interpolate_module.three_interpolate_grad(points, idx, weight, grad_out), None, None] + +if __name__=='__main__': + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,128,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/cpu:0'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(interpolated_points) + print time.time() - now + print ret.shape, ret.dtype + #print ret + + + diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate_compile.sh b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate_compile.sh new file mode 100644 index 0000000..34c9fda --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate_compile.sh @@ -0,0 +1,5 @@ +# TF1.2 +g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +#g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate_op_test.py b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate_op_test.py new file mode 100644 index 0000000..b1c244f --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/tf_interpolate_op_test.py @@ -0,0 +1,24 @@ +import tensorflow as tf +import numpy as np +from tf_interpolate import three_nn, three_interpolate + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with self.test_session(): + points = tf.constant(np.random.random((1,8,16)).astype('float32')) + print points + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + dist, idx = three_nn(xyz1, xyz2) + weight = tf.ones_like(dist)/3.0 + interpolated_points = three_interpolate(points, idx, weight) + print interpolated_points + err = tf.test.compute_gradient_error(points, (1,8,16), interpolated_points, (1,128,16)) + print err + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/visu_interpolation.py b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/visu_interpolation.py new file mode 100644 index 0000000..5b5836e --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/3d_interpolation/visu_interpolation.py @@ -0,0 +1,44 @@ +''' Visualize part segmentation ''' +import os +import sys +ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append('/home/rqi/Projects/toolkits/visualization') +from show3d_balls import showpoints +import numpy as np +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf + + +pts2 = np.array([[0,0,1],[1,0,0],[0,1,0],[1,1,0]]).astype('float32') +xyz1 = np.random.random((100,3)).astype('float32') +xyz2 = np.array([[0,0,0],[1,0,0],[0,1,0],[1,1,1]]).astype('float32') + +def fun(xyz1,xyz2,pts2): + with tf.device('/cpu:0'): + points = tf.constant(np.expand_dims(pts2,0)) + xyz1 = tf.constant(np.expand_dims(xyz1,0)) + xyz2 = tf.constant(np.expand_dims(xyz2,0)) + dist, idx = three_nn(xyz1, xyz2) + #weight = tf.ones_like(dist)/3.0 + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm, [1,1,3]) + print norm + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points, idx, weight) + with tf.Session('') as sess: + tmp,pts1,d,w = sess.run([xyz1, interpolated_points, dist, weight]) + #print w + pts1 = pts1.squeeze() + return pts1 + +pts1 = fun(xyz1,xyz2,pts2) +all_pts = np.zeros((104,3)) +all_pts[0:100,:] = pts1 +all_pts[100:,:] = pts2 +all_xyz = np.zeros((104,3)) +all_xyz[0:100,:]=xyz1 +all_xyz[100:,:]=xyz2 +showpoints(xyz2, pts2, ballradius=8) +showpoints(xyz1, pts1, ballradius=8) +showpoints(all_xyz, all_pts, ballradius=8) diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/.gitignore b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/.gitignore new file mode 100644 index 0000000..2f08276 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/.gitignore @@ -0,0 +1,10 @@ +a.out +query_ball_point +query_ball_point_block +query_ball_point_cuda +query_ball_point_grid +tf_grouping_g.cu.o +tf_grouping_so.so +selection_sort +selection_sort_cuda +selection_sort_const_cuda diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/compile.sh b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/compile.sh new file mode 100644 index 0000000..e1824dd --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/compile.sh @@ -0,0 +1,6 @@ +g++ query_ball_point.cpp -o query_ball_point +nvcc query_ball_point.cu -o query_ball_point_cuda +nvcc query_ball_point_block.cu -o query_ball_point_block +nvcc query_ball_point_grid.cu -o query_ball_point_grid +g++ -Wall selection_sort.cpp -o selection_sort +nvcc selection_sort.cu -o selection_sort_cuda diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point.cpp b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point.cpp new file mode 100644 index 0000000..4e28051 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point.cpp @@ -0,0 +1,119 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +void query_ball_point_cpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + for (int i=0;i>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,1>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point_block.cu b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point_block.cu new file mode 100644 index 0000000..477fb3b --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point_block.cu @@ -0,0 +1,134 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int index = threadIdx.x; + xyz1 += n*3*index; + xyz2 += m*3*index; + idx += m*nsample*index; + + for (int j=0;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<<1,b>>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<<1,b>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point_grid.cu b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point_grid.cu new file mode 100644 index 0000000..dcfadba --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/query_ball_point_grid.cu @@ -0,0 +1,144 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx); + cudaDeviceSynchronize(); + printf("query_ball_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + cudaDeviceSynchronize(); + printf("grou_point gpu time %f\n",get_time()-t0); + + t0=get_time(); + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + cudaDeviceSynchronize(); + printf("grou_point_grad gpu time %f\n",get_time()-t0); + + cudaFree(xyz1); + cudaFree(xyz2); + cudaFree(points); + cudaFree(idx); + cudaFree(out); + cudaFree(grad_out); + cudaFree(grad_points); + return 0; +} diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/selection_sort.cpp b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/selection_sort.cpp new file mode 100644 index 0000000..6f0839e --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/selection_sort.cpp @@ -0,0 +1,94 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), val (b,m,n) +void selection_sort_cpu(int b, int n, int m, int k, const float *dist, int *idx, float *val) { + float *p_dist; + float tmp; + int tmpi; + for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,k), val (b,m,k) +__global__ void selection_sort_gpu(int b, int n, int m, int k, float *dist, int *idx, float *val) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + idx+=m*k*batch_index; + val+=m*k*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float *p_dist; + for (int j=index;j>>(b,n,m,k,dist,idx,val); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + return 0; +} diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/selection_sort_const.cu b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/selection_sort_const.cu new file mode 100644 index 0000000..9666849 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/test/selection_sort_const.cu @@ -0,0 +1,92 @@ +#include +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include +#include +using namespace std; +float randomf(){ + return (rand()+0.5)/(RAND_MAX+1.0); +} +static double get_time(){ + timespec tp; + clock_gettime(CLOCK_MONOTONIC,&tp); + return tp.tv_sec+tp.tv_nsec*1e-9; +} + +// input: k (1), distance matrix dist (b,m,n) +// output: idx (b,m,n), dist_out (b,m,n) +__global__ void selection_sort_gpu(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + int batch_index = blockIdx.x; + dist+=m*n*batch_index; + outi+=m*n*batch_index; + out+=m*n*batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + // copy from dist to dist_out + for (int j=index;j>>(b,n,m,k,dist,idx,dist_out); + cudaDeviceSynchronize(); + printf("selection sort cpu time %f\n",get_time()-t0); + + //for (int i=0;i +#include +#include // memset +#include // rand, RAND_MAX +#include // sqrtf +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include +using namespace tensorflow; + +REGISTER_OP("QueryBallPoint") + .Attr("radius: float") + .Attr("nsample: int") + .Input("xyz1: float32") + .Input("xyz2: float32") + .Output("idx: int32") + .Output("pts_cnt: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoint * 3 + c->WithRank(c->input(1), 3, &dims2); + int nsample; + TF_RETURN_IF_ERROR(c->GetAttr("nsample", &nsample)); + ::tensorflow::shape_inference::ShapeHandle output1 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), nsample}); + c->set_output(0, output1); + ::tensorflow::shape_inference::ShapeHandle output2 = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(1, output2); + return Status::OK(); + }); +REGISTER_OP("SelectionSort") + .Attr("k: int") + .Input("dist: float32") + .Output("outi: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + c->set_output(1, c->input(0)); + return Status::OK(); + }); +REGISTER_OP("GroupPoint") + .Input("points: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * channels + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints * nsample + c->WithRank(c->input(1), 3, &dims2); + // batch_size * npoints * nsample * channels + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1), c->Dim(dims2, 2), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GroupPointGrad") + .Input("points: float32") + .Input("idx: int32") + .Input("grad_out: float32") + .Output("grad_points: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + + +void queryBallPointLauncher(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt); +class QueryBallPointGpuOp : public OpKernel { + public: + explicit QueryBallPointGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("radius", &radius_)); + OP_REQUIRES(context, radius_ > 0, errors::InvalidArgument("QueryBallPoint expects positive radius")); + + OP_REQUIRES_OK(context, context->GetAttr("nsample", &nsample_)); + OP_REQUIRES(context, nsample_ > 0, errors::InvalidArgument("QueryBallPoint expects positive nsample")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& xyz1_tensor = context->input(0); + OP_REQUIRES(context, xyz1_tensor.dims()==3 && xyz1_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, ndataset, 3) xyz1 shape.")); + int b = xyz1_tensor.shape().dim_size(0); + int n = xyz1_tensor.shape().dim_size(1); + + const Tensor& xyz2_tensor = context->input(1); + OP_REQUIRES(context, xyz2_tensor.dims()==3 && xyz2_tensor.shape().dim_size(2)==3, errors::InvalidArgument("QueryBallPoint expects (batch_size, npoint, 3) xyz2 shape.")); + int m = xyz2_tensor.shape().dim_size(1); + + Tensor *idx_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,nsample_}, &idx_tensor)); + Tensor *pts_cnt_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m}, &pts_cnt_tensor)); + + auto xyz1_flat = xyz1_tensor.flat(); + const float *xyz1 = &(xyz1_flat(0)); + auto xyz2_flat = xyz2_tensor.flat(); + const float *xyz2 = &(xyz2_flat(0)); + auto idx_flat = idx_tensor->flat(); + int *idx = &(idx_flat(0)); + auto pts_cnt_flat = pts_cnt_tensor->flat(); + int *pts_cnt = &(pts_cnt_flat(0)); + queryBallPointLauncher(b,n,m,radius_,nsample_,xyz1,xyz2,idx,pts_cnt); + } + private: + float radius_; + int nsample_; +}; +REGISTER_KERNEL_BUILDER(Name("QueryBallPoint").Device(DEVICE_GPU), QueryBallPointGpuOp); + +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out); +class SelectionSortGpuOp : public OpKernel { + public: + explicit SelectionSortGpuOp(OpKernelConstruction* context) : OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("k", &k_)); + OP_REQUIRES(context, k_ > 0, errors::InvalidArgument("SelectionSort expects positive k")); + } + + void Compute(OpKernelContext* context) override { + const Tensor& dist_tensor = context->input(0); + OP_REQUIRES(context, dist_tensor.dims()==3, errors::InvalidArgument("SelectionSort expects (b,m,n) dist shape.")); + int b = dist_tensor.shape().dim_size(0); + int m = dist_tensor.shape().dim_size(1); + int n = dist_tensor.shape().dim_size(2); + + Tensor *outi_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape{b,m,n}, &outi_tensor)); + Tensor *out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape{b,m,n}, &out_tensor)); + + auto dist_flat = dist_tensor.flat(); + const float *dist = &(dist_flat(0)); + auto outi_flat = outi_tensor->flat(); + int *outi = &(outi_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + selectionSortLauncher(b,n,m,k_,dist,outi,out); + } + private: + int k_; +}; +REGISTER_KERNEL_BUILDER(Name("SelectionSort").Device(DEVICE_GPU), SelectionSortGpuOp); + + +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out); +class GroupPointGpuOp: public OpKernel{ + public: + explicit GroupPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPoint expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPoint expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + Tensor * out_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,m,nsample,c}, &out_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto out_flat = out_tensor->flat(); + float *out = &(out_flat(0)); + groupPointLauncher(b,n,c,m,nsample,points,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPoint").Device(DEVICE_GPU),GroupPointGpuOp); + +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points); +class GroupPointGradGpuOp: public OpKernel{ + public: + explicit GroupPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + + void Compute(OpKernelContext * context) override { + const Tensor& points_tensor=context->input(0); + OP_REQUIRES(context, points_tensor.dims()==3, errors::InvalidArgument("GroupPointGrad expects (batch_size, num_points, channel) points shape")); + int b = points_tensor.shape().dim_size(0); + int n = points_tensor.shape().dim_size(1); + int c = points_tensor.shape().dim_size(2); + + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==3 && idx_tensor.shape().dim_size(0)==b, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample) idx shape")); + int m = idx_tensor.shape().dim_size(1); + int nsample = idx_tensor.shape().dim_size(2); + + const Tensor& grad_out_tensor=context->input(2); + OP_REQUIRES(context,grad_out_tensor.dims()==4 && grad_out_tensor.shape().dim_size(0)==b && grad_out_tensor.shape().dim_size(1)==m && grad_out_tensor.shape().dim_size(2)==nsample && grad_out_tensor.shape().dim_size(3)==c, errors::InvalidArgument("GroupPointGrad expects (batch_size, npoints, nsample, channel) grad_out shape")); + + Tensor * grad_points_tensor = nullptr; + OP_REQUIRES_OK(context, context->allocate_output(0,TensorShape{b,n,c}, &grad_points_tensor)); + + auto points_flat = points_tensor.flat(); + const float *points = &(points_flat(0)); + auto idx_flat = idx_tensor.flat(); + const int *idx = &(idx_flat(0)); + auto grad_out_flat = grad_out_tensor.flat(); + const float *grad_out = &(grad_out_flat(0)); + auto grad_points_flat = grad_points_tensor->flat(); + float *grad_points = &(grad_points_flat(0)); + cudaMemset(grad_points, 0, sizeof(float)*b*n*c); + groupPointGradLauncher(b,n,c,m,nsample,grad_out,idx,grad_points); + } +}; +REGISTER_KERNEL_BUILDER(Name("GroupPointGrad").Device(DEVICE_GPU),GroupPointGradGpuOp); + + diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping.py b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping.py new file mode 100644 index 0000000..5b59d7d --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping.py @@ -0,0 +1,105 @@ +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +grouping_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_grouping_so.so')) +def query_ball_point(radius, nsample, xyz1, xyz2): + ''' + Input: + radius: float32, ball search radius + nsample: int32, number of points selected in each ball region + xyz1: (batch_size, ndataset, 3) float32 array, input points + xyz2: (batch_size, npoint, 3) float32 array, query points + Output: + idx: (batch_size, npoint, nsample) int32 array, indices to input points + pts_cnt: (batch_size, npoint) int32 array, number of unique points in each local region + ''' + #return grouping_module.query_ball_point(radius, nsample, xyz1, xyz2) + return grouping_module.query_ball_point(xyz1, xyz2, radius, nsample) +ops.NoGradient('QueryBallPoint') +def select_top_k(k, dist): + ''' + Input: + k: int32, number of k SMALLEST elements selected + dist: (b,m,n) float32 array, distance matrix, m query points, n dataset points + Output: + idx: (b,m,n) int32 array, first k in n are indices to the top k + dist_out: (b,m,n) float32 array, first k in n are the top k + ''' + return grouping_module.selection_sort(dist, k) +ops.NoGradient('SelectionSort') +def group_point(points, idx): + ''' + Input: + points: (batch_size, ndataset, channel) float32 array, points to sample from + idx: (batch_size, npoint, nsample) int32 array, indices to points + Output: + out: (batch_size, npoint, nsample, channel) float32 array, values sampled from points + ''' + return grouping_module.group_point(points, idx) +@tf.RegisterGradient('GroupPoint') +def _group_point_grad(op, grad_out): + points = op.inputs[0] + idx = op.inputs[1] + return [grouping_module.group_point_grad(points, idx, grad_out), None] + +def knn_point(k, xyz1, xyz2): + ''' + Input: + k: int32, number of k in k-nn search + xyz1: (batch_size, ndataset, c) float32 array, input points + xyz2: (batch_size, npoint, c) float32 array, query points + Output: + val: (batch_size, npoint, k) float32 array, L2 distances + idx: (batch_size, npoint, k) int32 array, indices to input points + ''' + b = xyz1.get_shape()[0].value + n = xyz1.get_shape()[1].value + c = xyz1.get_shape()[2].value + m = xyz2.get_shape()[1].value + print b, n, c, m + print xyz1, (b,1,n,c) + xyz1 = tf.tile(tf.reshape(xyz1, (b,1,n,c)), [1,m,1,1]) + xyz2 = tf.tile(tf.reshape(xyz2, (b,m,1,c)), [1,1,n,1]) + dist = tf.reduce_sum((xyz1-xyz2)**2, -1) + print dist, k + outi, out = select_top_k(k, dist) + idx = tf.slice(outi, [0,0,0], [-1,-1,k]) + val = tf.slice(out, [0,0,0], [-1,-1,k]) + print idx, val + #val, idx = tf.nn.top_k(-dist, k=k) # ONLY SUPPORT CPU + return val, idx + +if __name__=='__main__': + knn=True + import numpy as np + import time + np.random.seed(100) + pts = np.random.random((32,512,64)).astype('float32') + tmp1 = np.random.random((32,512,3)).astype('float32') + tmp2 = np.random.random((32,128,3)).astype('float32') + with tf.device('/gpu:1'): + points = tf.constant(pts) + xyz1 = tf.constant(tmp1) + xyz2 = tf.constant(tmp2) + radius = 0.1 + nsample = 64 + if knn: + _, idx = knn_point(nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + else: + idx, _ = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + #grouped_points_grad = tf.ones_like(grouped_points) + #points_grad = tf.gradients(grouped_points, points, grouped_points_grad) + with tf.Session('') as sess: + now = time.time() + for _ in range(100): + ret = sess.run(grouped_points) + print time.time() - now + print ret.shape, ret.dtype + print ret + + diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_compile.sh b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_compile.sh new file mode 100644 index 0000000..b193367 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_compile.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/local/cuda-8.0/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# TF1.2 +g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +#g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_g.cu b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_g.cu new file mode 100644 index 0000000..578330d --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_g.cu @@ -0,0 +1,141 @@ +// input: radius (1), nsample (1), xyz1 (b,n,3), xyz2 (b,m,3) +// output: idx (b,m,nsample), pts_cnt (b,m) +__global__ void query_ball_point_gpu(int b, int n, int m, float radius, int nsample, const float *xyz1, const float *xyz2, int *idx, int *pts_cnt) { + int batch_index = blockIdx.x; + xyz1 += n*3*batch_index; + xyz2 += m*3*batch_index; + idx += m*nsample*batch_index; + pts_cnt += m*batch_index; // counting how many unique points selected in local region + + int index = threadIdx.x; + int stride = blockDim.x; + + for (int j=index;j>>(b,n,m,radius,nsample,xyz1,xyz2,idx,pts_cnt); + //cudaDeviceSynchronize(); +} +void selectionSortLauncher(int b, int n, int m, int k, const float *dist, int *outi, float *out) { + selection_sort_gpu<<>>(b,n,m,k,dist,outi,out); + //cudaDeviceSynchronize(); +} +void groupPointLauncher(int b, int n, int c, int m, int nsample, const float *points, const int *idx, float *out){ + group_point_gpu<<>>(b,n,c,m,nsample,points,idx,out); + //cudaDeviceSynchronize(); +} +void groupPointGradLauncher(int b, int n, int c, int m, int nsample, const float *grad_out, const int *idx, float *grad_points){ + group_point_grad_gpu<<>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //group_point_grad_gpu<<<1,1>>>(b,n,c,m,nsample,grad_out,idx,grad_points); + //cudaDeviceSynchronize(); +} diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_op_test.py b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_op_test.py new file mode 100644 index 0000000..4f30a3e --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/grouping/tf_grouping_op_test.py @@ -0,0 +1,28 @@ +import tensorflow as tf +import numpy as np +from tf_grouping import query_ball_point, group_point + +class GroupPointTest(tf.test.TestCase): + def test(self): + pass + + def test_grad(self): + with tf.device('/gpu:0'): + points = tf.constant(np.random.random((1,128,16)).astype('float32')) + print points + xyz1 = tf.constant(np.random.random((1,128,3)).astype('float32')) + xyz2 = tf.constant(np.random.random((1,8,3)).astype('float32')) + radius = 0.3 + nsample = 32 + idx, pts_cnt = query_ball_point(radius, nsample, xyz1, xyz2) + grouped_points = group_point(points, idx) + print grouped_points + + with self.test_session(): + print "---- Going to compute gradient error" + err = tf.test.compute_gradient_error(points, (1,128,16), grouped_points, (1,8,32,16)) + print err + self.assertLess(err, 1e-4) + +if __name__=='__main__': + tf.test.main() diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/.gitignore b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/.gitignore new file mode 100644 index 0000000..9d22eb4 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/.gitignore @@ -0,0 +1,2 @@ +*.o +*.so diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling.cpp b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling.cpp new file mode 100644 index 0000000..fb3dd28 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling.cpp @@ -0,0 +1,179 @@ +/* Furthest point sampling + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ +#include "tensorflow/core/framework/op.h" +#include "tensorflow/core/framework/op_kernel.h" +#include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/common_shape_fns.h" +#include + +using namespace tensorflow; + +REGISTER_OP("ProbSample") + .Input("inp: float32") + .Input("inpr: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ncategory + c->WithRank(c->input(0), 2, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims2, 0), c->Dim(dims2, 1)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("FarthestPointSample") + .Attr("npoint: int") + .Input("inp: float32") + .Output("out: int32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * npoint * 3 + c->WithRank(c->input(0), 3, &dims1); + int npoint; + TF_RETURN_IF_ERROR(c->GetAttr("npoint", &npoint)); + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), npoint}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPoint") + .Input("inp: float32") + .Input("idx: int32") + .Output("out: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + ::tensorflow::shape_inference::ShapeHandle dims1; // batch_size * ndataset * 3 + c->WithRank(c->input(0), 3, &dims1); + ::tensorflow::shape_inference::ShapeHandle dims2; // batch_size * npoints + c->WithRank(c->input(1), 2, &dims2); + // batch_size * npoints * 3 + ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(dims1, 0), c->Dim(dims2, 1), c->Dim(dims1, 2)}); + c->set_output(0, output); + return Status::OK(); + }); +REGISTER_OP("GatherPointGrad") + .Input("inp: float32") + .Input("idx: int32") + .Input("out_g: float32") + .Output("inp_g: float32") + .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { + c->set_output(0, c->input(0)); + return Status::OK(); + }); + +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out); +class ProbSampleGpuOp: public OpKernel{ + public: + explicit ProbSampleGpuOp(OpKernelConstruction* context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + const Tensor& inpr_tensor=context->input(1); + auto inp_flat=inp_tensor.flat(); + auto inpr_flat=inpr_tensor.flat(); + const float * inp=&(inp_flat(0)); + const float * inpr=&(inpr_flat(0)); + OP_REQUIRES(context,inp_tensor.dims()==2,errors::InvalidArgument("ProbSample expects (batch_size,num_choices) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + OP_REQUIRES(context,inpr_tensor.dims()==2 && inpr_tensor.shape().dim_size(0)==b,errors::InvalidArgument("ProbSample expects (batch_size,num_points) inpr shape")); + int m=inpr_tensor.shape().dim_size(1); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{b,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + probsampleLauncher(b,n,m,inp,inpr,temp,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("ProbSample").Device(DEVICE_GPU), ProbSampleGpuOp); + +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out); +class FarthestPointSampleGpuOp: public OpKernel{ + public: + explicit FarthestPointSampleGpuOp(OpKernelConstruction* context):OpKernel(context) { + OP_REQUIRES_OK(context, context->GetAttr("npoint", &npoint_)); + OP_REQUIRES(context, npoint_ > 0, errors::InvalidArgument("FarthestPointSample expects positive npoint")); + } + void Compute(OpKernelContext * context)override{ + int m = npoint_; + + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("FarthestPointSample expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + Tensor * out_tensor; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m},&out_tensor)); + auto out_flat=out_tensor->flat(); + int * out=&(out_flat(0)); + Tensor temp_tensor; + OP_REQUIRES_OK(context,context->allocate_temp(DataTypeToEnum::value,TensorShape{32,n},&temp_tensor)); + auto temp_flat=temp_tensor.flat(); + float * temp=&(temp_flat(0)); + farthestpointsamplingLauncher(b,n,m,inp,temp,out); + } + private: + int npoint_; +}; +REGISTER_KERNEL_BUILDER(Name("FarthestPointSample").Device(DEVICE_GPU),FarthestPointSampleGpuOp); + +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out); +class GatherPointGpuOp: public OpKernel{ + public: + explicit GatherPointGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPoint expects (batch_size,num_points,3) inp shape")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPoint expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + Tensor * out_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,m,3},&out_tensor)); + auto out_flat=out_tensor->flat(); + float * out=&(out_flat(0)); + gatherpointLauncher(b,n,m,inp,idx,out); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPoint").Device(DEVICE_GPU),GatherPointGpuOp); + +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g); +class GatherPointGradGpuOp: public OpKernel{ + public: + explicit GatherPointGradGpuOp(OpKernelConstruction * context):OpKernel(context){} + void Compute(OpKernelContext * context)override{ + const Tensor& inp_tensor=context->input(0); + OP_REQUIRES(context,inp_tensor.dims()==3 && inp_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_points,3) inp")); + int b=inp_tensor.shape().dim_size(0); + int n=inp_tensor.shape().dim_size(1); + const Tensor& idx_tensor=context->input(1); + OP_REQUIRES(context,idx_tensor.dims()==2 && idx_tensor.shape().dim_size(0)==b,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result) idx shape")); + int m=idx_tensor.shape().dim_size(1); + auto inp_flat=inp_tensor.flat(); + const float * inp=&(inp_flat(0)); + auto idx_flat=idx_tensor.flat(); + const int * idx=&(idx_flat(0)); + const Tensor& out_g_tensor=context->input(2); + OP_REQUIRES(context,out_g_tensor.dims()==3 && out_g_tensor.shape().dim_size(0)==b && out_g_tensor.shape().dim_size(1)==m && out_g_tensor.shape().dim_size(2)==3,errors::InvalidArgument("GatherPointGradGpuOp expects (batch_size,num_result,3) out_g shape")); + auto out_g_flat=out_g_tensor.flat(); + const float * out_g=&(out_g_flat(0)); + Tensor * inp_g_tensor=NULL; + OP_REQUIRES_OK(context,context->allocate_output(0,TensorShape{b,n,3},&inp_g_tensor)); + auto inp_g_flat=inp_g_tensor->flat(); + float * inp_g=&(inp_g_flat(0)); + cudaMemset(inp_g,0,b*n*3*4); + scatteraddpointLauncher(b,n,m,out_g,idx,inp_g); + } +}; +REGISTER_KERNEL_BUILDER(Name("GatherPointGrad").Device(DEVICE_GPU),GatherPointGradGpuOp); + diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling.py b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling.py new file mode 100644 index 0000000..9a42997 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling.py @@ -0,0 +1,89 @@ +''' Furthest point sampling +Original author: Haoqiang Fan +Modified by Charles R. Qi +All Rights Reserved. 2017. +''' +import tensorflow as tf +from tensorflow.python.framework import ops +import sys +import os +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sampling_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_sampling_so.so')) +def prob_sample(inp,inpr): + ''' +input: + batch_size * ncategory float32 + batch_size * npoints float32 +returns: + batch_size * npoints int32 + ''' + return sampling_module.prob_sample(inp,inpr) +ops.NoGradient('ProbSample') +# TF1.0 API requires set shape in C++ +#@tf.RegisterShape('ProbSample') +#def _prob_sample_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(2) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape2.dims[0],shape2.dims[1]])] +def gather_point(inp,idx): + ''' +input: + batch_size * ndataset * 3 float32 + batch_size * npoints int32 +returns: + batch_size * npoints * 3 float32 + ''' + return sampling_module.gather_point(inp,idx) +#@tf.RegisterShape('GatherPoint') +#def _gather_point_shape(op): +# shape1=op.inputs[0].get_shape().with_rank(3) +# shape2=op.inputs[1].get_shape().with_rank(2) +# return [tf.TensorShape([shape1.dims[0],shape2.dims[1],shape1.dims[2]])] +@tf.RegisterGradient('GatherPoint') +def _gather_point_grad(op,out_g): + inp=op.inputs[0] + idx=op.inputs[1] + return [sampling_module.gather_point_grad(inp,idx,out_g),None] +def farthest_point_sample(npoint,inp): + ''' +input: + int32 + batch_size * ndataset * 3 float32 +returns: + batch_size * npoint int32 + ''' + return sampling_module.farthest_point_sample(inp, npoint) +ops.NoGradient('FarthestPointSample') + + +if __name__=='__main__': + import numpy as np + np.random.seed(100) + triangles=np.random.rand(1,5,3,3).astype('float32') + with tf.device('/gpu:1'): + inp=tf.constant(triangles) + tria=inp[:,:,0,:] + trib=inp[:,:,1,:] + tric=inp[:,:,2,:] + areas=tf.sqrt(tf.reduce_sum(tf.cross(trib-tria,tric-tria)**2,2)+1e-9) + randomnumbers=tf.random_uniform((1,8192)) + triids=prob_sample(areas,randomnumbers) + tria_sample=gather_point(tria,triids) + trib_sample=gather_point(trib,triids) + tric_sample=gather_point(tric,triids) + us=tf.random_uniform((1,8192)) + vs=tf.random_uniform((1,8192)) + uplusv=1-tf.abs(us+vs-1) + uminusv=us-vs + us=(uplusv+uminusv)*0.5 + vs=(uplusv-uminusv)*0.5 + pt_sample=tria_sample+(trib_sample-tria_sample)*tf.expand_dims(us,-1)+(tric_sample-tria_sample)*tf.expand_dims(vs,-1) + print 'pt_sample: ', pt_sample + reduced_sample=gather_point(pt_sample,farthest_point_sample(1024,pt_sample)) + print reduced_sample + with tf.Session('') as sess: + ret=sess.run(reduced_sample) + print ret.shape,ret.dtype + import cPickle as pickle + pickle.dump(ret,open('1.pkl','wb'),-1) diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling_compile.sh b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling_compile.sh new file mode 100644 index 0000000..ed903f0 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling_compile.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/local/cuda-8.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +# TF1.2 +g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + +# TF1.4 +#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling_g.cu b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling_g.cu new file mode 100644 index 0000000..6e28bc7 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/tf_ops/sampling/tf_sampling_g.cu @@ -0,0 +1,212 @@ +/* Furthest point sampling GPU implementation + * Original author: Haoqiang Fan + * Modified by Charles R. Qi + * All Rights Reserved. 2017. + */ + +__global__ void cumsumKernel(int b,int n,const float * __restrict__ inp,float * __restrict__ out){ + const int BlockSize=2048; + const int paddingLevel=5; + __shared__ float buffer4[BlockSize*4]; + __shared__ float buffer[BlockSize+(BlockSize>>paddingLevel)]; + for (int i=blockIdx.x;i>2; + for (int k=threadIdx.x*4;k>2)+(k>>(2+paddingLevel))]=v4; + }else{ + float v=0; + for (int k2=k;k2>2)+(k>>(2+paddingLevel))]=v; + } + } + int u=0; + for (;(2<>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+2)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + u--; + for (;u>=0;u--){ + __syncthreads(); + for (int k=threadIdx.x;k>(u+1));k+=blockDim.x){ + int i1=(((k<<1)+3)<>paddingLevel; + i2+=i2>>paddingLevel; + buffer[i1]+=buffer[i2]; + } + } + __syncthreads(); + for (int k=threadIdx.x*4;k>2)-1)+(((k>>2)-1)>>paddingLevel); + buffer4[k]+=buffer[k2]; + buffer4[k+1]+=buffer[k2]; + buffer4[k+2]+=buffer[k2]; + buffer4[k+3]+=buffer[k2]; + } + } + __syncthreads(); + for (int k=threadIdx.x;k>paddingLevel)]+runningsum2; + float r2=runningsum+t; + runningsum2=t-(r2-runningsum); + runningsum=r2; + __syncthreads(); + } + } +} + +__global__ void binarysearchKernel(int b,int n,int m,const float * __restrict__ dataset,const float * __restrict__ query, int * __restrict__ result){ + int base=1; + while (base=1;k>>=1) + if (r>=k && dataset[i*n+r-k]>=q) + r-=k; + result[i*m+j]=r; + } + } +} +__global__ void farthestpointsamplingKernel(int b,int n,int m,const float * __restrict__ dataset,float * __restrict__ temp,int * __restrict__ idxs){ + if (m<=0) + return; + const int BlockSize=512; + __shared__ float dists[BlockSize]; + __shared__ int dists_i[BlockSize]; + const int BufferSize=3072; + __shared__ float buf[BufferSize*3]; + for (int i=blockIdx.x;ibest){ + best=d2; + besti=k; + } + } + dists[threadIdx.x]=best; + dists_i[threadIdx.x]=besti; + for (int u=0;(1<>(u+1))){ + int i1=(threadIdx.x*2)<>>(b,n,inp,out); +} +//require b*n working space +void probsampleLauncher(int b,int n,int m,const float * inp_p,const float * inp_r,float * temp,int * out){ + cumsumKernel<<<32,512>>>(b,n,inp_p,temp); + binarysearchKernel<<>>(b,n,m,temp,inp_r,out); +} +//require 32*n working space +void farthestpointsamplingLauncher(int b,int n,int m,const float * inp,float * temp,int * out){ + farthestpointsamplingKernel<<<32,512>>>(b,n,m,inp,temp,out); +} +void gatherpointLauncher(int b,int n,int m,const float * inp,const int * idx,float * out){ + gatherpointKernel<<>>(b,n,m,inp,idx,out); +} +void scatteraddpointLauncher(int b,int n,int m,const float * out_g,const int * idx,float * inp_g){ + scatteraddpointKernel<<>>(b,n,m,out_g,idx,inp_g); +} + diff --git a/zoo/SimpleView/pointnet2_tf/train.py b/zoo/SimpleView/pointnet2_tf/train.py new file mode 100644 index 0000000..4fc982e --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/train.py @@ -0,0 +1,285 @@ +''' + Single-GPU training. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import modelnet_dataset +import modelnet_h5_dataset + +parser = argparse.ArgumentParser() +parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name [default: pointnet2_cls_ssg]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=251, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=16, help='Batch Size during training [default: 16]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +BATCH_SIZE = FLAGS.batch_size +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +GPU_INDEX = FLAGS.gpu +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 40 + +# Shapenet official train/test split +if FLAGS.normal: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/gpu:'+str(GPU_INDEX)): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Get model and loss + pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + MODEL.get_loss(pred, labels_pl, end_points) + losses = tf.get_collection('losses') + total_loss = tf.add_n(losses, name='total_loss') + tf.summary.scalar('total_loss', total_loss) + for l in losses + [total_loss]: + tf.summary.scalar(l.op.name, l) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + print "--- Get training operator" + # Get training operator + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + train_op = optimizer.minimize(total_loss, global_step=batch) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TRAIN_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + while TRAIN_DATASET.has_next_batch(): + batch_data, batch_label = TRAIN_DATASET.next_batch(augment=True) + #batch_data = provider.random_point_dropout(batch_data) + bsize = batch_data.shape[0] + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + if (batch_idx+1)%50 == 0: + log_string(' ---- batch: %03d ----' % (batch_idx+1)) + log_string('mean loss: %f' % (loss_sum / 50)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx += 1 + + TRAIN_DATASET.reset() + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + while TEST_DATASET.has_next_batch(): + batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(0, bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + EPOCH_CNT += 1 + + TEST_DATASET.reset() + return total_correct/float(total_seen) + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/train_multi_gpu.py b/zoo/SimpleView/pointnet2_tf/train_multi_gpu.py new file mode 100644 index 0000000..6087ec0 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/train_multi_gpu.py @@ -0,0 +1,359 @@ +''' + Multi-GPU training. + Near linear scale acceleration for multi-gpus on a single machine. + Will use H5 dataset in default. If using normal, will shift to the normal dataset. +''' + +import argparse +import math +from datetime import datetime +import h5py +import numpy as np +import tensorflow as tf +import socket +import importlib +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = BASE_DIR +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'models')) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +import provider +import tf_util +import modelnet_dataset +import modelnet_h5_dataset + +parser = argparse.ArgumentParser() +parser.add_argument('--num_gpus', type=int, default=1, help='How many gpus to use [default: 1]') +parser.add_argument('--model', default='pointnet2_cls_ssg', help='Model name [default: pointnet2_cls_ssg]') +parser.add_argument('--log_dir', default='log', help='Log dir [default: log]') +parser.add_argument('--num_point', type=int, default=1024, help='Point Number [default: 1024]') +parser.add_argument('--max_epoch', type=int, default=251, help='Epoch to run [default: 251]') +parser.add_argument('--batch_size', type=int, default=32, help='Batch Size during training [default: 32]') +parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') +parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') +parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') +parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') +parser.add_argument('--decay_rate', type=float, default=0.7, help='Decay rate for lr decay [default: 0.7]') +parser.add_argument('--normal', action='store_true', help='Whether to use normal information') +FLAGS = parser.parse_args() + +EPOCH_CNT = 0 + +NUM_GPUS = FLAGS.num_gpus +BATCH_SIZE = FLAGS.batch_size +assert(BATCH_SIZE % NUM_GPUS == 0) +DEVICE_BATCH_SIZE = BATCH_SIZE / NUM_GPUS + +NUM_POINT = FLAGS.num_point +MAX_EPOCH = FLAGS.max_epoch +BASE_LEARNING_RATE = FLAGS.learning_rate +MOMENTUM = FLAGS.momentum +OPTIMIZER = FLAGS.optimizer +DECAY_STEP = FLAGS.decay_step +DECAY_RATE = FLAGS.decay_rate + +MODEL = importlib.import_module(FLAGS.model) # import network module +MODEL_FILE = os.path.join(ROOT_DIR, 'models', FLAGS.model+'.py') +LOG_DIR = FLAGS.log_dir +if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) +os.system('cp %s %s' % (MODEL_FILE, LOG_DIR)) # bkp of model def +os.system('cp train.py %s' % (LOG_DIR)) # bkp of train procedure +LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') +LOG_FOUT.write(str(FLAGS)+'\n') + +BN_INIT_DECAY = 0.5 +BN_DECAY_DECAY_RATE = 0.5 +BN_DECAY_DECAY_STEP = float(DECAY_STEP) +BN_DECAY_CLIP = 0.99 + +HOSTNAME = socket.gethostname() + +NUM_CLASSES = 40 + +# Shapenet official train/test split +if FLAGS.normal: + assert(NUM_POINT<=10000) + DATA_PATH = os.path.join(ROOT_DIR, 'data/modelnet40_normal_resampled') + TRAIN_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='train', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) + TEST_DATASET = modelnet_dataset.ModelNetDataset(root=DATA_PATH, npoints=NUM_POINT, split='test', normal_channel=FLAGS.normal, batch_size=BATCH_SIZE) +else: + assert(NUM_POINT<=2048) + TRAIN_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=True) + TEST_DATASET = modelnet_h5_dataset.ModelNetH5Dataset(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'), batch_size=BATCH_SIZE, npoints=NUM_POINT, shuffle=False) + +def log_string(out_str): + LOG_FOUT.write(out_str+'\n') + LOG_FOUT.flush() + print(out_str) + +def average_gradients(tower_grads): + """Calculate the average gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + From tensorflow tutorial: cifar10/cifar10_multi_gpu_train.py + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + #for g, _ in grad_and_vars: + for g, v in grad_and_vars: + # Add 0 dimension to the gradients to represent the tower. + expanded_g = tf.expand_dims(g, 0) + + # Append on a 'tower' dimension which we will average over below. + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(axis=0, values=grads) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + + +def get_learning_rate(batch): + learning_rate = tf.train.exponential_decay( + BASE_LEARNING_RATE, # Base learning rate. + batch * BATCH_SIZE, # Current index into the dataset. + DECAY_STEP, # Decay step. + DECAY_RATE, # Decay rate. + staircase=True) + learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE! + return learning_rate + +def get_bn_decay(batch): + bn_momentum = tf.train.exponential_decay( + BN_INIT_DECAY, + batch*BATCH_SIZE, + BN_DECAY_DECAY_STEP, + BN_DECAY_DECAY_RATE, + staircase=True) + bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) + return bn_decay + +def train(): + with tf.Graph().as_default(): + with tf.device('/cpu:0'): + pointclouds_pl, labels_pl = MODEL.placeholder_inputs(BATCH_SIZE, NUM_POINT) + is_training_pl = tf.placeholder(tf.bool, shape=()) + + # Note the global_step=batch parameter to minimize. + # That tells the optimizer to helpfully increment the 'batch' parameter + # for you every time it trains. + batch = tf.get_variable('batch', [], + initializer=tf.constant_initializer(0), trainable=False) + bn_decay = get_bn_decay(batch) + tf.summary.scalar('bn_decay', bn_decay) + + # Set learning rate and optimizer + learning_rate = get_learning_rate(batch) + tf.summary.scalar('learning_rate', learning_rate) + if OPTIMIZER == 'momentum': + optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=MOMENTUM) + elif OPTIMIZER == 'adam': + optimizer = tf.train.AdamOptimizer(learning_rate) + + # ------------------------------------------- + # Get model and loss on multiple GPU devices + # ------------------------------------------- + # Allocating variables on CPU first will greatly accelerate multi-gpu training. + # Ref: https://github.com/kuza55/keras-extras/issues/21 + MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay) + + tower_grads = [] + pred_gpu = [] + total_loss_gpu = [] + for i in range(NUM_GPUS): + with tf.variable_scope(tf.get_variable_scope(), reuse=True): + with tf.device('/gpu:%d'%(i)), tf.name_scope('gpu_%d'%(i)) as scope: + # Evenly split input data to each GPU + pc_batch = tf.slice(pointclouds_pl, + [i*DEVICE_BATCH_SIZE,0,0], [DEVICE_BATCH_SIZE,-1,-1]) + label_batch = tf.slice(labels_pl, + [i*DEVICE_BATCH_SIZE], [DEVICE_BATCH_SIZE]) + + pred, end_points = MODEL.get_model(pc_batch, + is_training=is_training_pl, bn_decay=bn_decay) + + MODEL.get_loss(pred, label_batch, end_points) + losses = tf.get_collection('losses', scope) + total_loss = tf.add_n(losses, name='total_loss') + for l in losses + [total_loss]: + tf.summary.scalar(l.op.name, l) + + grads = optimizer.compute_gradients(total_loss) + tower_grads.append(grads) + + pred_gpu.append(pred) + total_loss_gpu.append(total_loss) + + # Merge pred and losses from multiple GPUs + pred = tf.concat(pred_gpu, 0) + total_loss = tf.reduce_mean(total_loss_gpu) + + # Get training operator + grads = average_gradients(tower_grads) + train_op = optimizer.apply_gradients(grads, global_step=batch) + + correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl)) + accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE) + tf.summary.scalar('accuracy', accuracy) + + # Add ops to save and restore all the variables. + saver = tf.train.Saver() + + # Create a session + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.allow_soft_placement = True + config.log_device_placement = False + sess = tf.Session(config=config) + + # Add summary writers + merged = tf.summary.merge_all() + train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), sess.graph) + test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test'), sess.graph) + + # Init variables + init = tf.global_variables_initializer() + sess.run(init) + + ops = {'pointclouds_pl': pointclouds_pl, + 'labels_pl': labels_pl, + 'is_training_pl': is_training_pl, + 'pred': pred, + 'loss': total_loss, + 'train_op': train_op, + 'merged': merged, + 'step': batch, + 'end_points': end_points} + + best_acc = -1 + for epoch in range(MAX_EPOCH): + log_string('**** EPOCH %03d ****' % (epoch)) + sys.stdout.flush() + + train_one_epoch(sess, ops, train_writer) + eval_one_epoch(sess, ops, test_writer) + + # Save the variables to disk. + if epoch % 10 == 0: + save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt")) + log_string("Model saved in file: %s" % save_path) + + +def train_one_epoch(sess, ops, train_writer): + """ ops: dict mapping from string to tf ops """ + is_training = True + + log_string(str(datetime.now())) + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TRAIN_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + while TRAIN_DATASET.has_next_batch(): + batch_data, batch_label = TRAIN_DATASET.next_batch(augment=True) + #batch_data = provider.random_point_dropout(batch_data) + bsize = batch_data.shape[0] + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training,} + summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) + train_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + if (batch_idx+1)%50 == 0: + log_string(' ---- batch: %03d ----' % (batch_idx+1)) + log_string('mean loss: %f' % (loss_sum / 50)) + log_string('accuracy: %f' % (total_correct / float(total_seen))) + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx += 1 + + TRAIN_DATASET.reset() + +def eval_one_epoch(sess, ops, test_writer): + """ ops: dict mapping from string to tf ops """ + global EPOCH_CNT + is_training = False + + # Make sure batch data is of same size + cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TEST_DATASET.num_channel())) + cur_batch_label = np.zeros((BATCH_SIZE), dtype=np.int32) + + total_correct = 0 + total_seen = 0 + loss_sum = 0 + batch_idx = 0 + shape_ious = [] + total_seen_class = [0 for _ in range(NUM_CLASSES)] + total_correct_class = [0 for _ in range(NUM_CLASSES)] + + log_string(str(datetime.now())) + log_string('---- EPOCH %03d EVALUATION ----'%(EPOCH_CNT)) + + while TEST_DATASET.has_next_batch(): + batch_data, batch_label = TEST_DATASET.next_batch(augment=False) + bsize = batch_data.shape[0] + # for the last batch in the epoch, the bsize:end are from last batch + cur_batch_data[0:bsize,...] = batch_data + cur_batch_label[0:bsize] = batch_label + + feed_dict = {ops['pointclouds_pl']: cur_batch_data, + ops['labels_pl']: cur_batch_label, + ops['is_training_pl']: is_training} + summary, step, loss_val, pred_val = sess.run([ops['merged'], ops['step'], + ops['loss'], ops['pred']], feed_dict=feed_dict) + test_writer.add_summary(summary, step) + pred_val = np.argmax(pred_val, 1) + correct = np.sum(pred_val[0:bsize] == batch_label[0:bsize]) + total_correct += correct + total_seen += bsize + loss_sum += loss_val + batch_idx += 1 + for i in range(0, bsize): + l = batch_label[i] + total_seen_class[l] += 1 + total_correct_class[l] += (pred_val[i] == l) + + log_string('eval mean loss: %f' % (loss_sum / float(batch_idx))) + log_string('eval accuracy: %f'% (total_correct / float(total_seen))) + log_string('eval avg class acc: %f' % (np.mean(np.array(total_correct_class)/np.array(total_seen_class,dtype=np.float)))) + EPOCH_CNT += 1 + + TEST_DATASET.reset() + return total_correct/float(total_seen) + + +if __name__ == "__main__": + log_string('pid: %s'%(str(os.getpid()))) + train() + LOG_FOUT.close() diff --git a/zoo/SimpleView/pointnet2_tf/utils/README.md b/zoo/SimpleView/pointnet2_tf/utils/README.md new file mode 100644 index 0000000..6d2bfad --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/README.md @@ -0,0 +1,6 @@ +## Utilility Functions for 3D Point Cloud Deep Learning + +### visualization tool + + sh compile_render_balls_so.sh + python show3d_balls.py diff --git a/zoo/SimpleView/pointnet2_tf/utils/compile_render_balls_so.sh b/zoo/SimpleView/pointnet2_tf/utils/compile_render_balls_so.sh new file mode 100644 index 0000000..dc493f6 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/compile_render_balls_so.sh @@ -0,0 +1,2 @@ +g++ -std=c++11 render_balls_so.cpp -o render_balls_so.so -shared -fPIC -O2 -D_GLIBCXX_USE_CXX11_ABI=0 + diff --git a/zoo/SimpleView/pointnet2_tf/utils/pc_util.py b/zoo/SimpleView/pointnet2_tf/utils/pc_util.py new file mode 100644 index 0000000..81f63d8 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/pc_util.py @@ -0,0 +1,315 @@ +""" Utility functions for processing point clouds. + +Author: Charles R. Qi, Hao Su +Date: November 2016 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +# Draw point cloud +from eulerangles import euler2mat + +# Point cloud IO +import numpy as np +from plyfile import PlyData, PlyElement + + +# ---------------------------------------- +# Point Cloud/Volume Conversions +# ---------------------------------------- + +def point_cloud_to_volume_batch(point_clouds, vsize=12, radius=1.0, flatten=True): + """ Input is BxNx3 batch of point cloud + Output is Bx(vsize^3) + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume(np.squeeze(point_clouds[b,:,:]), vsize, radius) + if flatten: + vol_list.append(vol.flatten()) + else: + vol_list.append(np.expand_dims(np.expand_dims(vol, -1), 0)) + if flatten: + return np.vstack(vol_list) + else: + return np.concatenate(vol_list, 0) + + +def point_cloud_to_volume(points, vsize, radius=1.0): + """ input is Nx3 points. + output is vsize*vsize*vsize + assumes points are in range [-radius, radius] + """ + vol = np.zeros((vsize,vsize,vsize)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0 + return vol + +#a = np.zeros((16,1024,3)) +#print point_cloud_to_volume_batch(a, 12, 1.0, False).shape + +def volume_to_point_cloud(vol): + """ vol is occupancy grid (value = 0 or 1) of size vsize*vsize*vsize + return Nx3 numpy array. + """ + vsize = vol.shape[0] + assert(vol.shape[1] == vsize and vol.shape[1] == vsize) + points = [] + for a in range(vsize): + for b in range(vsize): + for c in range(vsize): + if vol[a,b,c] == 1: + points.append(np.array([a,b,c])) + if len(points) == 0: + return np.zeros((0,3)) + points = np.vstack(points) + return points + +def point_cloud_to_volume_v2_batch(point_clouds, vsize=12, radius=1.0, num_sample=128): + """ Input is BxNx3 a batch of point cloud + Output is BxVxVxVxnum_samplex3 + Added on Feb 19 + """ + vol_list = [] + for b in range(point_clouds.shape[0]): + vol = point_cloud_to_volume_v2(point_clouds[b,:,:], vsize, radius, num_sample) + vol_list.append(np.expand_dims(vol, 0)) + return np.concatenate(vol_list, 0) + +def point_cloud_to_volume_v2(points, vsize, radius=1.0, num_sample=128): + """ input is Nx3 points + output is vsize*vsize*vsize*num_sample*3 + assumes points are in range [-radius, radius] + samples num_sample points in each voxel, if there are less than + num_sample points, replicate the points + Added on Feb 19 + """ + vol = np.zeros((vsize,vsize,vsize,num_sample,3)) + voxel = 2*radius/float(vsize) + locations = (points + radius)/voxel + locations = locations.astype(int) + loc2pc = {} + for n in range(points.shape[0]): + loc = tuple(locations[n,:]) + if loc not in loc2pc: + loc2pc[loc] = [] + loc2pc[loc].append(points[n,:]) + #print loc2pc + + for i in range(vsize): + for j in range(vsize): + for k in range(vsize): + if (i,j,k) not in loc2pc: + vol[i,j,k,:,:] = np.zeros((num_sample,3)) + else: + pc = loc2pc[(i,j,k)] # a list of (3,) arrays + pc = np.vstack(pc) # kx3 + # Sample/pad to num_sample points + if pc.shape[0]>num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0]num_sample: + choices = np.random.choice(pc.shape[0], num_sample, replace=False) + pc = pc[choices,:] + elif pc.shape[0] 0) + dx = mask[:, 0] + dy = mask[:, 1] + dv = disk[disk > 0] + + # Order points by z-buffer + zorder = np.argsort(points[:, 2]) + points = points[zorder, :] + points[:, 2] = (points[:, 2] - np.min(points[:, 2])) / (np.max(points[:, 2] - np.min(points[:, 2]))) + max_depth = np.max(points[:, 2]) + + for i in range(points.shape[0]): + j = points.shape[0] - i - 1 + x = points[j, 0] + y = points[j, 1] + xc = canvasSize/2 + (x*space) + yc = canvasSize/2 + (y*space) + xc = int(np.round(xc)) + yc = int(np.round(yc)) + + px = dx + xc + py = dy + yc + + image[px, py] = image[px, py] * 0.7 + dv * (max_depth - points[j, 2]) * 0.3 + + image = image / np.max(image) + return image + +def point_cloud_three_views(points): + """ input points Nx3 numpy array (+y is up direction). + return an numpy array gray image of size 500x1500. """ + # +y is up direction + # xrot is azimuth + # yrot is in-plane + # zrot is elevation + img1 = draw_point_cloud(points, zrot=110/180.0*np.pi, xrot=45/180.0*np.pi, yrot=0/180.0*np.pi) + img2 = draw_point_cloud(points, zrot=70/180.0*np.pi, xrot=135/180.0*np.pi, yrot=0/180.0*np.pi) + img3 = draw_point_cloud(points, zrot=180.0/180.0*np.pi, xrot=90/180.0*np.pi, yrot=0/180.0*np.pi) + image_large = np.concatenate([img1, img2, img3], 1) + return image_large + + +def point_cloud_three_views_demo(): + """ Demo for draw_point_cloud function """ + from PIL import Image + points = read_ply('../third_party/mesh_sampling/piano.ply') + im_array = point_cloud_three_views(points) + img = Image.fromarray(np.uint8(im_array*255.0)) + img.save('piano.jpg') + +if __name__=="__main__": + point_cloud_three_views_demo() + + +def pyplot_draw_point_cloud(points, output_filename): + """ points is a Nx3 numpy array """ + import matplotlib.pyplot as plt + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(points[:,0], points[:,1], points[:,2]) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + #savefig(output_filename) + +def pyplot_draw_volume(vol, output_filename): + """ vol is of size vsize*vsize*vsize + output an image to output_filename + """ + points = volume_to_point_cloud(vol) + pyplot_draw_point_cloud(points, output_filename) + +def write_ply_color(points, labels, out_filename, num_classes=None): + """ Color (N,3) points with labels (N) within range 0 ~ num_classes-1 as OBJ file """ + import matplotlib.pyplot as pyplot + labels = labels.astype(int) + N = points.shape[0] + if num_classes is None: + num_classes = np.max(labels)+1 + else: + assert(num_classes>np.max(labels)) + fout = open(out_filename, 'w') + #colors = [pyplot.cm.hsv(i/float(num_classes)) for i in range(num_classes)] + colors = [pyplot.cm.jet(i/float(num_classes)) for i in range(num_classes)] + for i in range(N): + c = colors[labels[i]] + c = [int(x*255) for x in c] + fout.write('v %f %f %f %d %d %d\n' % (points[i,0],points[i,1],points[i,2],c[0],c[1],c[2])) + fout.close() diff --git a/zoo/SimpleView/pointnet2_tf/utils/pointnet_util.py b/zoo/SimpleView/pointnet2_tf/utils/pointnet_util.py new file mode 100644 index 0000000..6d32623 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/pointnet_util.py @@ -0,0 +1,229 @@ +""" PointNet++ Layers + +Author: Charles R. Qi +Date: November 2017 +""" + +import os +import sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(BASE_DIR) +sys.path.append(os.path.join(ROOT_DIR, 'utils')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/sampling')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/grouping')) +sys.path.append(os.path.join(ROOT_DIR, 'tf_ops/3d_interpolation')) +from tf_sampling import farthest_point_sample, gather_point +from tf_grouping import query_ball_point, group_point, knn_point +from tf_interpolate import three_nn, three_interpolate +import tensorflow as tf +import numpy as np +import tf_util + +def sample_and_group(npoint, radius, nsample, xyz, points, knn=False, use_xyz=True): + ''' + Input: + npoint: int32 + radius: float32 + nsample: int32 + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points + knn: bool, if True use kNN instead of radius search + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + Output: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, nsample, 3+channel) TF tensor + idx: (batch_size, npoint, nsample) TF tensor, indices of local points as in ndataset points + grouped_xyz: (batch_size, npoint, nsample, 3) TF tensor, normalized point XYZs + (subtracted by seed point XYZ) in local regions + ''' + + new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) # (batch_size, npoint, 3) + if knn: + _,idx = knn_point(nsample, xyz, new_xyz) + else: + idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = group_point(xyz, idx) # (batch_size, npoint, nsample, 3) + grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) # translation normalization + if points is not None: + grouped_points = group_point(points, idx) # (batch_size, npoint, nsample, channel) + if use_xyz: + new_points = tf.concat([grouped_xyz, grouped_points], axis=-1) # (batch_size, npoint, nample, 3+channel) + else: + new_points = grouped_points + else: + new_points = grouped_xyz + + return new_xyz, new_points, idx, grouped_xyz + + +def sample_and_group_all(xyz, points, use_xyz=True): + ''' + Inputs: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + Outputs: + new_xyz: (batch_size, 1, 3) as (0,0,0) + new_points: (batch_size, 1, ndataset, 3+channel) TF tensor + Note: + Equivalent to sample_and_group with npoint=1, radius=inf, use (0,0,0) as the centroid + ''' + batch_size = xyz.get_shape()[0].value + nsample = xyz.get_shape()[1].value + new_xyz = tf.constant(np.tile(np.array([0,0,0]).reshape((1,1,3)), (batch_size,1,1)),dtype=tf.float32) # (batch_size, 1, 3) + idx = tf.constant(np.tile(np.array(range(nsample)).reshape((1,1,nsample)), (batch_size,1,1))) + grouped_xyz = tf.reshape(xyz, (batch_size, 1, nsample, 3)) # (batch_size, npoint=1, nsample, 3) + if points is not None: + if use_xyz: + new_points = tf.concat([xyz, points], axis=2) # (batch_size, 16, 259) + else: + new_points = points + new_points = tf.expand_dims(new_points, 1) # (batch_size, 1, 16, 259) + else: + new_points = grouped_xyz + return new_xyz, new_points, idx, grouped_xyz + + +def pointnet_sa_module(xyz, points, npoint, radius, nsample, mlp, mlp2, group_all, is_training, bn_decay, scope, bn=True, pooling='max', knn=False, use_xyz=True, use_nchw=False): + ''' PointNet Set Abstraction (SA) Module + Input: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor + npoint: int32 -- #points sampled in farthest point sampling + radius: float32 -- search radius in local region + nsample: int32 -- how many points in each local region + mlp: list of int32 -- output size for MLP on each point + mlp2: list of int32 -- output size for MLP on each region + group_all: bool -- group all points into one PC if set true, OVERRIDE + npoint, radius and nsample settings + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + use_nchw: bool, if True, use NCHW data format for conv2d, which is usually faster than NHWC format + Return: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, mlp[-1] or mlp2[-1]) TF tensor + idx: (batch_size, npoint, nsample) int32 -- indices for local regions + ''' + data_format = 'NCHW' if use_nchw else 'NHWC' + with tf.variable_scope(scope) as sc: + # Sample and Grouping + if group_all: + nsample = xyz.get_shape()[1].value + new_xyz, new_points, idx, grouped_xyz = sample_and_group_all(xyz, points, use_xyz) + else: + new_xyz, new_points, idx, grouped_xyz = sample_and_group(npoint, radius, nsample, xyz, points, knn, use_xyz) + + # Point Feature Embedding + if use_nchw: new_points = tf.transpose(new_points, [0,3,1,2]) + for i, num_out_channel in enumerate(mlp): + new_points = tf_util.conv2d(new_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv%d'%(i), bn_decay=bn_decay, + data_format=data_format) + if use_nchw: new_points = tf.transpose(new_points, [0,2,3,1]) + + # Pooling in Local Regions + if pooling=='max': + new_points = tf.reduce_max(new_points, axis=[2], keep_dims=True, name='maxpool') + elif pooling=='avg': + new_points = tf.reduce_mean(new_points, axis=[2], keep_dims=True, name='avgpool') + elif pooling=='weighted_avg': + with tf.variable_scope('weighted_avg'): + dists = tf.norm(grouped_xyz,axis=-1,ord=2,keep_dims=True) + exp_dists = tf.exp(-dists * 5) + weights = exp_dists/tf.reduce_sum(exp_dists,axis=2,keep_dims=True) # (batch_size, npoint, nsample, 1) + new_points *= weights # (batch_size, npoint, nsample, mlp[-1]) + new_points = tf.reduce_sum(new_points, axis=2, keep_dims=True) + elif pooling=='max_and_avg': + max_points = tf.reduce_max(new_points, axis=[2], keep_dims=True, name='maxpool') + avg_points = tf.reduce_mean(new_points, axis=[2], keep_dims=True, name='avgpool') + new_points = tf.concat([avg_points, max_points], axis=-1) + + # [Optional] Further Processing + if mlp2 is not None: + if use_nchw: new_points = tf.transpose(new_points, [0,3,1,2]) + for i, num_out_channel in enumerate(mlp2): + new_points = tf_util.conv2d(new_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv_post_%d'%(i), bn_decay=bn_decay, + data_format=data_format) + if use_nchw: new_points = tf.transpose(new_points, [0,2,3,1]) + + new_points = tf.squeeze(new_points, [2]) # (batch_size, npoints, mlp2[-1]) + return new_xyz, new_points, idx + +def pointnet_sa_module_msg(xyz, points, npoint, radius_list, nsample_list, mlp_list, is_training, bn_decay, scope, bn=True, use_xyz=True, use_nchw=False): + ''' PointNet Set Abstraction (SA) module with Multi-Scale Grouping (MSG) + Input: + xyz: (batch_size, ndataset, 3) TF tensor + points: (batch_size, ndataset, channel) TF tensor + npoint: int32 -- #points sampled in farthest point sampling + radius: list of float32 -- search radius in local region + nsample: list of int32 -- how many points in each local region + mlp: list of list of int32 -- output size for MLP on each point + use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features + use_nchw: bool, if True, use NCHW data format for conv2d, which is usually faster than NHWC format + Return: + new_xyz: (batch_size, npoint, 3) TF tensor + new_points: (batch_size, npoint, \sum_k{mlp[k][-1]}) TF tensor + ''' + data_format = 'NCHW' if use_nchw else 'NHWC' + with tf.variable_scope(scope) as sc: + new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) + new_points_list = [] + for i in range(len(radius_list)): + radius = radius_list[i] + nsample = nsample_list[i] + idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz) + grouped_xyz = group_point(xyz, idx) + grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) + if points is not None: + grouped_points = group_point(points, idx) + if use_xyz: + grouped_points = tf.concat([grouped_points, grouped_xyz], axis=-1) + else: + grouped_points = grouped_xyz + if use_nchw: grouped_points = tf.transpose(grouped_points, [0,3,1,2]) + for j,num_out_channel in enumerate(mlp_list[i]): + grouped_points = tf_util.conv2d(grouped_points, num_out_channel, [1,1], + padding='VALID', stride=[1,1], bn=bn, is_training=is_training, + scope='conv%d_%d'%(i,j), bn_decay=bn_decay) + if use_nchw: grouped_points = tf.transpose(grouped_points, [0,2,3,1]) + new_points = tf.reduce_max(grouped_points, axis=[2]) + new_points_list.append(new_points) + new_points_concat = tf.concat(new_points_list, axis=-1) + return new_xyz, new_points_concat + + +def pointnet_fp_module(xyz1, xyz2, points1, points2, mlp, is_training, bn_decay, scope, bn=True): + ''' PointNet Feature Propogation (FP) Module + Input: + xyz1: (batch_size, ndataset1, 3) TF tensor + xyz2: (batch_size, ndataset2, 3) TF tensor, sparser than xyz1 + points1: (batch_size, ndataset1, nchannel1) TF tensor + points2: (batch_size, ndataset2, nchannel2) TF tensor + mlp: list of int32 -- output size for MLP on each point + Return: + new_points: (batch_size, ndataset1, mlp[-1]) TF tensor + ''' + with tf.variable_scope(scope) as sc: + dist, idx = three_nn(xyz1, xyz2) + dist = tf.maximum(dist, 1e-10) + norm = tf.reduce_sum((1.0/dist),axis=2,keep_dims=True) + norm = tf.tile(norm,[1,1,3]) + weight = (1.0/dist) / norm + interpolated_points = three_interpolate(points2, idx, weight) + + if points1 is not None: + new_points1 = tf.concat(axis=2, values=[interpolated_points, points1]) # B,ndataset1,nchannel1+nchannel2 + else: + new_points1 = interpolated_points + new_points1 = tf.expand_dims(new_points1, 2) + for i, num_out_channel in enumerate(mlp): + new_points1 = tf_util.conv2d(new_points1, num_out_channel, [1,1], + padding='VALID', stride=[1,1], + bn=bn, is_training=is_training, + scope='conv_%d'%(i), bn_decay=bn_decay) + new_points1 = tf.squeeze(new_points1, [2]) # B,ndataset1,mlp[-1] + return new_points1 diff --git a/zoo/SimpleView/pointnet2_tf/utils/provider.py b/zoo/SimpleView/pointnet2_tf/utils/provider.py new file mode 100644 index 0000000..95118f5 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/provider.py @@ -0,0 +1,247 @@ +import os +import sys +import numpy as np +import h5py +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +def shuffle_data(data, labels): + """ Shuffle data and labels. + Input: + data: B,N,... numpy array + label: B,... numpy array + Return: + shuffled data, label and shuffle indices + """ + idx = np.arange(len(labels)) + np.random.shuffle(idx) + return data[idx, ...], labels[idx], idx + +def shuffle_points(batch_data): + """ Shuffle orders of points in each point cloud -- changes FPS behavior. + Use the same shuffling idx for the entire batch. + Input: + BxNxC array + Output: + BxNxC array + """ + idx = np.arange(batch_data.shape[1]) + np.random.shuffle(idx) + return batch_data[:,idx,:] + +def rotate_point_cloud(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_z(batch_data): + """ Randomly rotate the point clouds to augument the dataset + rotation is per shape based along up direction + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, sinval, 0], + [-sinval, cosval, 0], + [0, 0, 1]]) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_with_normal(batch_xyz_normal): + ''' Randomly rotate XYZ, normal point cloud. + Input: + batch_xyz_normal: B,N,6, first three channels are XYZ, last 3 all normal + Output: + B,N,6, rotated XYZ, normal point cloud + ''' + for k in range(batch_xyz_normal.shape[0]): + rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_xyz_normal[k,:,0:3] + shape_normal = batch_xyz_normal[k,:,3:6] + batch_xyz_normal[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + batch_xyz_normal[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), rotation_matrix) + return batch_xyz_normal + +def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx6 array, original batch of point clouds and point normals + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R) + return rotated_data + + +def rotate_point_cloud_by_angle(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + return rotated_data + +def rotate_point_cloud_by_angle_with_normal(batch_data, rotation_angle): + """ Rotate the point cloud along up direction with certain angle. + Input: + BxNx6 array, original batch of point clouds with normal + scalar, angle of rotation + Return: + BxNx6 array, rotated batch of point clouds iwth normal + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + #rotation_angle = np.random.uniform() * 2 * np.pi + cosval = np.cos(rotation_angle) + sinval = np.sin(rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + shape_pc = batch_data[k,:,0:3] + shape_normal = batch_data[k,:,3:6] + rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), rotation_matrix) + rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1,3)), rotation_matrix) + return rotated_data + + + +def rotate_perturbation_point_cloud(batch_data, angle_sigma=0.06, angle_clip=0.18): + """ Randomly perturb the point clouds by small rotations + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, rotated batch of point clouds + """ + rotated_data = np.zeros(batch_data.shape, dtype=np.float32) + for k in range(batch_data.shape[0]): + angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip) + Rx = np.array([[1,0,0], + [0,np.cos(angles[0]),-np.sin(angles[0])], + [0,np.sin(angles[0]),np.cos(angles[0])]]) + Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])], + [0,1,0], + [-np.sin(angles[1]),0,np.cos(angles[1])]]) + Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0], + [np.sin(angles[2]),np.cos(angles[2]),0], + [0,0,1]]) + R = np.dot(Rz, np.dot(Ry,Rx)) + shape_pc = batch_data[k, ...] + rotated_data[k, ...] = np.dot(shape_pc.reshape((-1, 3)), R) + return rotated_data + + +def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05): + """ Randomly jitter points. jittering is per point. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, jittered batch of point clouds + """ + B, N, C = batch_data.shape + assert(clip > 0) + jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip) + jittered_data += batch_data + return jittered_data + +def shift_point_cloud(batch_data, shift_range=0.1): + """ Randomly shift point cloud. Shift is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, shifted batch of point clouds + """ + B, N, C = batch_data.shape + shifts = np.random.uniform(-shift_range, shift_range, (B,3)) + for batch_index in range(B): + batch_data[batch_index,:,:] += shifts[batch_index,:] + return batch_data + + +def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): + """ Randomly scale the point cloud. Scale is per point cloud. + Input: + BxNx3 array, original batch of point clouds + Return: + BxNx3 array, scaled batch of point clouds + """ + B, N, C = batch_data.shape + scales = np.random.uniform(scale_low, scale_high, B) + for batch_index in range(B): + batch_data[batch_index,:,:] *= scales[batch_index] + return batch_data + +def random_point_dropout(batch_pc, max_dropout_ratio=0.875): + ''' batch_pc: BxNx3 ''' + for b in range(batch_pc.shape[0]): + dropout_ratio = np.random.random()*max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] + if len(drop_idx)>0: + batch_pc[b,drop_idx,:] = batch_pc[b,0,:] # set to the first point + return batch_pc + + +def getDataFiles(list_filename): + return [line.rstrip() for line in open(list_filename)] + +def load_h5(h5_filename): + f = h5py.File(h5_filename) + data = f['data'][:] + label = f['label'][:] + return (data, label) + +def loadDataFile(filename): + return load_h5(filename) diff --git a/zoo/SimpleView/pointnet2_tf/utils/render_balls_so.cpp b/zoo/SimpleView/pointnet2_tf/utils/render_balls_so.cpp new file mode 100644 index 0000000..e95aeba --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/render_balls_so.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +using namespace std; + +struct PointInfo{ + int x,y,z; + float r,g,b; +}; + +extern "C"{ + +void render_ball(int h,int w,unsigned char * show,int n,int * xyzs,float * c0,float * c1,float * c2,int r){ + r=max(r,1); + vector depth(h*w,-2100000000); + vector pattern; + for (int dx=-r;dx<=r;dx++) + for (int dy=-r;dy<=r;dy++) + if (dx*dx+dy*dy=h || y2<0 || y2>=w) && depth[x2*w+y2]0: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=0)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=0)) + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],1,axis=1)) + if magnifyBlue>=2: + show[:,:,0]=np.maximum(show[:,:,0],np.roll(show[:,:,0],-1,axis=1)) + if showrot: + cv2.putText(show,'xangle %d'%(int(xangle/np.pi*180)),(30,showsz-30),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'yangle %d'%(int(yangle/np.pi*180)),(30,showsz-50),0,0.5,cv2.cv.CV_RGB(255,0,0)) + cv2.putText(show,'zoom %d%%'%(int(zoom*100)),(30,showsz-70),0,0.5,cv2.cv.CV_RGB(255,0,0)) + changed=True + while True: + if changed: + render() + changed=False + cv2.imshow('show3d',show) + if waittime==0: + cmd=cv2.waitKey(10)%256 + else: + cmd=cv2.waitKey(waittime)%256 + if cmd==ord('q'): + break + elif cmd==ord('Q'): + sys.exit(0) + + if cmd==ord('t') or cmd == ord('p'): + if cmd == ord('t'): + if c_gt is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_gt[:,0] + c1=c_gt[:,1] + c2=c_gt[:,2] + else: + if c_pred is None: + c0=np.zeros((len(xyz),),dtype='float32')+255 + c1=np.zeros((len(xyz),),dtype='float32')+255 + c2=np.zeros((len(xyz),),dtype='float32')+255 + else: + c0=c_pred[:,0] + c1=c_pred[:,1] + c2=c_pred[:,2] + if normalizecolor: + c0/=(c0.max()+1e-14)/255.0 + c1/=(c1.max()+1e-14)/255.0 + c2/=(c2.max()+1e-14)/255.0 + c0=np.require(c0,'float32','C') + c1=np.require(c1,'float32','C') + c2=np.require(c2,'float32','C') + changed = True + + + + if cmd==ord('n'): + zoom*=1.1 + changed=True + elif cmd==ord('m'): + zoom/=1.1 + changed=True + elif cmd==ord('r'): + zoom=1.0 + changed=True + elif cmd==ord('s'): + cv2.imwrite('show3d.png',show) + if waittime!=0: + break + return cmd +if __name__=='__main__': + np.random.seed(100) + showpoints(np.random.randn(2500,3)) + diff --git a/zoo/SimpleView/pointnet2_tf/utils/tf_util.py b/zoo/SimpleView/pointnet2_tf/utils/tf_util.py new file mode 100644 index 0000000..4a8ffb7 --- /dev/null +++ b/zoo/SimpleView/pointnet2_tf/utils/tf_util.py @@ -0,0 +1,615 @@ +""" Wrapper functions for TensorFlow layers. + +Author: Charles R. Qi +Date: November 2017 +""" + +import numpy as np +import tensorflow as tf + +def _variable_on_cpu(name, shape, initializer, use_fp16=False): + """Helper to create a Variable stored on CPU memory. + Args: + name: name of the variable + shape: list of ints + initializer: initializer for Variable + Returns: + Variable Tensor + """ + with tf.device("/cpu:0"): + dtype = tf.float16 if use_fp16 else tf.float32 + var = tf.get_variable(name, shape, initializer=initializer, dtype=dtype) + return var + +def _variable_with_weight_decay(name, shape, stddev, wd, use_xavier=True): + """Helper to create an initialized Variable with weight decay. + + Note that the Variable is initialized with a truncated normal distribution. + A weight decay is added only if one is specified. + + Args: + name: name of the variable + shape: list of ints + stddev: standard deviation of a truncated Gaussian + wd: add L2Loss weight decay multiplied by this float. If None, weight + decay is not added for this Variable. + use_xavier: bool, whether to use xavier initializer + + Returns: + Variable Tensor + """ + if use_xavier: + initializer = tf.contrib.layers.xavier_initializer() + else: + initializer = tf.truncated_normal_initializer(stddev=stddev) + var = _variable_on_cpu(name, shape, initializer) + if wd is not None: + weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + return var + + +def conv1d(inputs, + num_output_channels, + kernel_size, + scope, + stride=1, + padding='SAME', + data_format='NHWC', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 1D convolution with non-linear operation. + + Args: + inputs: 3-D tensor variable BxLxC + num_output_channels: int + kernel_size: int + scope: string + stride: int + padding: 'SAME' or 'VALID' + data_format: 'NHWC' or 'NCHW' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + assert(data_format=='NHWC' or data_format=='NCHW') + if data_format == 'NHWC': + num_in_channels = inputs.get_shape()[-1].value + elif data_format=='NCHW': + num_in_channels = inputs.get_shape()[1].value + kernel_shape = [kernel_size, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.nn.conv1d(inputs, kernel, + stride=stride, + padding=padding, + data_format=data_format) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases, data_format=data_format) + + if bn: + outputs = batch_norm_for_conv1d(outputs, is_training, + bn_decay=bn_decay, scope='bn', + data_format=data_format) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + + +def conv2d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + data_format='NHWC', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + data_format: 'NHWC' or 'NCHW' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + assert(data_format=='NHWC' or data_format=='NCHW') + if data_format == 'NHWC': + num_in_channels = inputs.get_shape()[-1].value + elif data_format=='NCHW': + num_in_channels = inputs.get_shape()[1].value + kernel_shape = [kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + outputs = tf.nn.conv2d(inputs, kernel, + [1, stride_h, stride_w, 1], + padding=padding, + data_format=data_format) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases, data_format=data_format) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn', + data_format=data_format) + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def conv2d_transpose(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 2D convolution transpose with non-linear operation. + + Args: + inputs: 4-D tensor variable BxHxWxC + num_output_channels: int + kernel_size: a list of 2 ints + scope: string + stride: a list of 2 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + + Note: conv2d(conv2d_transpose(a, num_out, ksize, stride), a.shape[-1], ksize, stride) == a + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_h, kernel_w, + num_output_channels, num_in_channels] # reversed to conv2d + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_h, stride_w = stride + + # from slim.convolution2d_transpose + def get_deconv_dim(dim_size, stride_size, kernel_size, padding): + dim_size *= stride_size + + if padding == 'VALID' and dim_size is not None: + dim_size += max(kernel_size - stride_size, 0) + return dim_size + + # caculate output shape + batch_size = inputs.get_shape()[0].value + height = inputs.get_shape()[1].value + width = inputs.get_shape()[2].value + out_height = get_deconv_dim(height, stride_h, kernel_h, padding) + out_width = get_deconv_dim(width, stride_w, kernel_w, padding) + output_shape = [batch_size, out_height, out_width, num_output_channels] + + outputs = tf.nn.conv2d_transpose(inputs, kernel, output_shape, + [1, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv2d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + + +def conv3d(inputs, + num_output_channels, + kernel_size, + scope, + stride=[1, 1, 1], + padding='SAME', + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ 3D convolution with non-linear operation. + + Args: + inputs: 5-D tensor variable BxDxHxWxC + num_output_channels: int + kernel_size: a list of 3 ints + scope: string + stride: a list of 3 ints + padding: 'SAME' or 'VALID' + use_xavier: bool, use xavier_initializer if true + stddev: float, stddev for truncated_normal init + weight_decay: float + activation_fn: function + bn: bool, whether to use batch norm + bn_decay: float or float tensor variable in [0,1] + is_training: bool Tensor variable + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + num_in_channels = inputs.get_shape()[-1].value + kernel_shape = [kernel_d, kernel_h, kernel_w, + num_in_channels, num_output_channels] + kernel = _variable_with_weight_decay('weights', + shape=kernel_shape, + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + stride_d, stride_h, stride_w = stride + outputs = tf.nn.conv3d(inputs, kernel, + [1, stride_d, stride_h, stride_w, 1], + padding=padding) + biases = _variable_on_cpu('biases', [num_output_channels], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_conv3d(outputs, is_training, + bn_decay=bn_decay, scope='bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + +def fully_connected(inputs, + num_outputs, + scope, + use_xavier=True, + stddev=1e-3, + weight_decay=None, + activation_fn=tf.nn.relu, + bn=False, + bn_decay=None, + is_training=None): + """ Fully connected layer with non-linear operation. + + Args: + inputs: 2-D tensor BxN + num_outputs: int + + Returns: + Variable tensor of size B x num_outputs. + """ + with tf.variable_scope(scope) as sc: + num_input_units = inputs.get_shape()[-1].value + weights = _variable_with_weight_decay('weights', + shape=[num_input_units, num_outputs], + use_xavier=use_xavier, + stddev=stddev, + wd=weight_decay) + outputs = tf.matmul(inputs, weights) + biases = _variable_on_cpu('biases', [num_outputs], + tf.constant_initializer(0.0)) + outputs = tf.nn.bias_add(outputs, biases) + + if bn: + outputs = batch_norm_for_fc(outputs, is_training, bn_decay, 'bn') + + if activation_fn is not None: + outputs = activation_fn(outputs) + return outputs + + +def max_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D max pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.max_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool2d(inputs, + kernel_size, + scope, + stride=[2, 2], + padding='VALID'): + """ 2D avg pooling. + + Args: + inputs: 4-D tensor BxHxWxC + kernel_size: a list of 2 ints + stride: a list of 2 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_h, kernel_w = kernel_size + stride_h, stride_w = stride + outputs = tf.nn.avg_pool(inputs, + ksize=[1, kernel_h, kernel_w, 1], + strides=[1, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def max_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D max pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.max_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + +def avg_pool3d(inputs, + kernel_size, + scope, + stride=[2, 2, 2], + padding='VALID'): + """ 3D avg pooling. + + Args: + inputs: 5-D tensor BxDxHxWxC + kernel_size: a list of 3 ints + stride: a list of 3 ints + + Returns: + Variable tensor + """ + with tf.variable_scope(scope) as sc: + kernel_d, kernel_h, kernel_w = kernel_size + stride_d, stride_h, stride_w = stride + outputs = tf.nn.avg_pool3d(inputs, + ksize=[1, kernel_d, kernel_h, kernel_w, 1], + strides=[1, stride_d, stride_h, stride_w, 1], + padding=padding, + name=sc.name) + return outputs + + +def batch_norm_template_unused(inputs, is_training, scope, moments_dims, bn_decay): + """ NOTE: this is older version of the util func. it is deprecated. + Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + Return: + normed: batch-normalized maps + """ + with tf.variable_scope(scope) as sc: + num_channels = inputs.get_shape()[-1].value + beta = _variable_on_cpu(name='beta',shape=[num_channels], + initializer=tf.constant_initializer(0)) + gamma = _variable_on_cpu(name='gamma',shape=[num_channels], + initializer=tf.constant_initializer(1.0)) + batch_mean, batch_var = tf.nn.moments(inputs, moments_dims, name='moments') + decay = bn_decay if bn_decay is not None else 0.9 + ema = tf.train.ExponentialMovingAverage(decay=decay) + # Operator that maintains moving averages of variables. + # Need to set reuse=False, otherwise if reuse, will see moments_1/mean/ExponentialMovingAverage/ does not exist + # https://github.com/shekkizh/WassersteinGAN.tensorflow/issues/3 + with tf.variable_scope(tf.get_variable_scope(), reuse=False): + ema_apply_op = tf.cond(is_training, + lambda: ema.apply([batch_mean, batch_var]), + lambda: tf.no_op()) + + # Update moving average and return current batch's avg and var. + def mean_var_with_update(): + with tf.control_dependencies([ema_apply_op]): + return tf.identity(batch_mean), tf.identity(batch_var) + + # ema.average returns the Variable holding the average of var. + mean, var = tf.cond(is_training, + mean_var_with_update, + lambda: (ema.average(batch_mean), ema.average(batch_var))) + normed = tf.nn.batch_normalization(inputs, mean, var, beta, gamma, 1e-3) + return normed + + +def batch_norm_template(inputs, is_training, scope, moments_dims_unused, bn_decay, data_format='NHWC'): + """ Batch normalization on convolutional maps and beyond... + Ref.: http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow + + Args: + inputs: Tensor, k-D input ... x C could be BC or BHWC or BDHWC + is_training: boolean tf.Varialbe, true indicates training phase + scope: string, variable scope + moments_dims: a list of ints, indicating dimensions for moments calculation + bn_decay: float or float tensor variable, controling moving average weight + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + bn_decay = bn_decay if bn_decay is not None else 0.9 + return tf.contrib.layers.batch_norm(inputs, + center=True, scale=True, + is_training=is_training, decay=bn_decay,updates_collections=None, + scope=scope, + data_format=data_format) + + +def batch_norm_for_fc(inputs, is_training, bn_decay, scope): + """ Batch normalization on FC data. + + Args: + inputs: Tensor, 2D BxC input + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,], bn_decay) + + +def batch_norm_for_conv1d(inputs, is_training, bn_decay, scope, data_format): + """ Batch normalization on 1D convolutional maps. + + Args: + inputs: Tensor, 3D BLC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1], bn_decay, data_format) + + + + +def batch_norm_for_conv2d(inputs, is_training, bn_decay, scope, data_format): + """ Batch normalization on 2D convolutional maps. + + Args: + inputs: Tensor, 4D BHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + data_format: 'NHWC' or 'NCHW' + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2], bn_decay, data_format) + + +def batch_norm_for_conv3d(inputs, is_training, bn_decay, scope): + """ Batch normalization on 3D convolutional maps. + + Args: + inputs: Tensor, 5D BDHWC input maps + is_training: boolean tf.Varialbe, true indicates training phase + bn_decay: float or float tensor variable, controling moving average weight + scope: string, variable scope + Return: + normed: batch-normalized maps + """ + return batch_norm_template(inputs, is_training, scope, [0,1,2,3], bn_decay) + + +def dropout(inputs, + is_training, + scope, + keep_prob=0.5, + noise_shape=None): + """ Dropout layer. + + Args: + inputs: tensor + is_training: boolean tf.Variable + scope: string + keep_prob: float in [0,1] + noise_shape: list of ints + + Returns: + tensor variable + """ + with tf.variable_scope(scope) as sc: + outputs = tf.cond(is_training, + lambda: tf.nn.dropout(inputs, keep_prob, noise_shape), + lambda: inputs) + return outputs diff --git a/zoo/SimpleView/pointnet_pyt/.gitignore b/zoo/SimpleView/pointnet_pyt/.gitignore new file mode 100644 index 0000000..fe01851 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/.gitignore @@ -0,0 +1,10 @@ +.ipynb_checkpoints/ +data +*.pyc +*.ipynb +shapenetcore_partanno_segmentation_benchmark_v0/ +*.so +.idea* +cls/ +seg/ +*.egg-info/ diff --git a/zoo/SimpleView/pointnet_pyt/LICENSE b/zoo/SimpleView/pointnet_pyt/LICENSE new file mode 100644 index 0000000..7ff3e97 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Fei Xia + +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/zoo/SimpleView/pointnet_pyt/README.md b/zoo/SimpleView/pointnet_pyt/README.md new file mode 100644 index 0000000..92bccdc --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/README.md @@ -0,0 +1,68 @@ +# PointNet.pytorch +This repo is implementation for PointNet(https://arxiv.org/abs/1612.00593) in pytorch. The model is in `pointnet/model.py`. + +It is tested with pytorch-1.0. + +# Download data and running + +``` +git clone https://github.com/fxia22/pointnet.pytorch +cd pointnet.pytorch +pip install -e . +``` + +Download and build visualization tool +``` +cd script +bash build.sh #build C++ code for visualization +bash download.sh #download dataset +``` + +Training +``` +cd utils +python train_classification.py --dataset --nepoch= --dataset_type +python train_segmentation.py --dataset --nepoch= +``` + +Use `--feature_transform` to use feature transform. + +# Performance + +## Classification performance + +On ModelNet40: + +| | Overall Acc | +| :---: | :---: | +| Original implementation | 89.2 | +| this implementation(w/o feature transform) | 86.4 | +| this implementation(w/ feature transform) | 87.0 | + +On [A subset of shapenet](http://web.stanford.edu/~ericyi/project_page/part_annotation/index.html) + +| | Overall Acc | +| :---: | :---: | +| Original implementation | N/A | +| this implementation(w/o feature transform) | 98.1 | +| this implementation(w/ feature transform) | 97.7 | + +## Segmentation performance + +Segmentation on [A subset of shapenet](http://web.stanford.edu/~ericyi/project_page/part_annotation/index.html). + +| Class(mIOU) | Airplane | Bag| Cap|Car|Chair|Earphone|Guitar|Knife|Lamp|Laptop|Motorbike|Mug|Pistol|Rocket|Skateboard|Table +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | +| Original implementation | 83.4 | 78.7 | 82.5| 74.9 |89.6| 73.0| 91.5| 85.9| 80.8| 95.3| 65.2| 93.0| 81.2| 57.9| 72.8| 80.6| +| this implementation(w/o feature transform) | 73.5 | 71.3 | 64.3 | 61.1 | 87.2 | 69.5 | 86.1|81.6| 77.4|92.7|41.3|86.5|78.2|41.2|61.0|81.1| +| this implementation(w/ feature transform) | | | | | 87.6 | | | | | | | | | | |81.0| + +Note that this implementation trains each class separately, so classes with fewer data will have slightly lower performance than reference implementation. + +Sample segmentation result: +![seg](https://raw.githubusercontent.com/fxia22/pointnet.pytorch/master/misc/show3d.png?token=AE638Oy51TL2HDCaeCF273X_-Bsy6-E2ks5Y_BUzwA%3D%3D) + +# Links + +- [Project Page](http://stanford.edu/~rqi/pointnet/) +- [Tensorflow implementation](https://github.com/charlesq34/pointnet) diff --git a/zoo/SimpleView/pointnet_pyt/misc/modelnet_id.txt b/zoo/SimpleView/pointnet_pyt/misc/modelnet_id.txt new file mode 100644 index 0000000..f494da7 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/misc/modelnet_id.txt @@ -0,0 +1,40 @@ +airplane 0 +bathtub 1 +bed 2 +bench 3 +bookshelf 4 +bottle 5 +bowl 6 +car 7 +chair 8 +cone 9 +cup 10 +curtain 11 +desk 12 +door 13 +dresser 14 +flower_pot 15 +glass_box 16 +guitar 17 +keyboard 18 +lamp 19 +laptop 20 +mantel 21 +monitor 22 +night_stand 23 +person 24 +piano 25 +plant 26 +radio 27 +range_hood 28 +sink 29 +sofa 30 +stairs 31 +stool 32 +table 33 +tent 34 +toilet 35 +tv_stand 36 +vase 37 +wardrobe 38 +xbox 39 diff --git a/zoo/SimpleView/pointnet_pyt/misc/num_seg_classes.txt b/zoo/SimpleView/pointnet_pyt/misc/num_seg_classes.txt new file mode 100644 index 0000000..bf3dd63 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/misc/num_seg_classes.txt @@ -0,0 +1,16 @@ +Airplane 4 +Bag 2 +Cap 2 +Car 4 +Chair 4 +Earphone 3 +Guitar 3 +Knife 2 +Lamp 4 +Laptop 2 +Motorbike 6 +Mug 2 +Pistol 3 +Rocket 3 +Skateboard 3 +Table 3 diff --git a/zoo/SimpleView/pointnet_pyt/misc/show3d.png b/zoo/SimpleView/pointnet_pyt/misc/show3d.png new file mode 100644 index 0000000..69f5b05 Binary files /dev/null and b/zoo/SimpleView/pointnet_pyt/misc/show3d.png differ diff --git a/zoo/SimpleView/pointnet_pyt/pointnet/__init__.py b/zoo/SimpleView/pointnet_pyt/pointnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/SimpleView/pointnet_pyt/pointnet/dataset.py b/zoo/SimpleView/pointnet_pyt/pointnet/dataset.py new file mode 100644 index 0000000..678460a --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/pointnet/dataset.py @@ -0,0 +1,215 @@ +from __future__ import print_function +import torch.utils.data as data +import os +import os.path +import torch +import numpy as np +import sys +from tqdm import tqdm +import json +from plyfile import PlyData, PlyElement + +def get_segmentation_classes(root): + catfile = os.path.join(root, 'synsetoffset2category.txt') + cat = {} + meta = {} + + with open(catfile, 'r') as f: + for line in f: + ls = line.strip().split() + cat[ls[0]] = ls[1] + + for item in cat: + dir_seg = os.path.join(root, cat[item], 'points_label') + dir_point = os.path.join(root, cat[item], 'points') + fns = sorted(os.listdir(dir_point)) + meta[item] = [] + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + meta[item].append((os.path.join(dir_point, token + '.pts'), os.path.join(dir_seg, token + '.seg'))) + + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../misc/num_seg_classes.txt'), 'w') as f: + for item in cat: + datapath = [] + num_seg_classes = 0 + for fn in meta[item]: + datapath.append((item, fn[0], fn[1])) + + for i in tqdm(range(len(datapath))): + l = len(np.unique(np.loadtxt(datapath[i][-1]).astype(np.uint8))) + if l > num_seg_classes: + num_seg_classes = l + + print("category {} num segmentation classes {}".format(item, num_seg_classes)) + f.write("{}\t{}\n".format(item, num_seg_classes)) + +def gen_modelnet_id(root): + classes = [] + with open(os.path.join(root, 'train.txt'), 'r') as f: + for line in f: + classes.append(line.strip().split('/')[0]) + classes = np.unique(classes) + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../misc/modelnet_id.txt'), 'w') as f: + for i in range(len(classes)): + f.write('{}\t{}\n'.format(classes[i], i)) + +class ShapeNetDataset(data.Dataset): + def __init__(self, + root, + npoints=2500, + classification=False, + class_choice=None, + split='train', + data_augmentation=True): + self.npoints = npoints + self.root = root + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.cat = {} + self.data_augmentation = data_augmentation + self.classification = classification + self.seg_classes = {} + + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + #print(self.cat) + if not class_choice is None: + self.cat = {k: v for k, v in self.cat.items() if k in class_choice} + + self.id2cat = {v: k for k, v in self.cat.items()} + + self.meta = {} + splitfile = os.path.join(self.root, 'train_test_split', 'shuffled_{}_file_list.json'.format(split)) + #from IPython import embed; embed() + filelist = json.load(open(splitfile, 'r')) + for item in self.cat: + self.meta[item] = [] + + for file in filelist: + _, category, uuid = file.split('/') + if category in self.cat.values(): + self.meta[self.id2cat[category]].append((os.path.join(self.root, category, 'points', uuid+'.pts'), + os.path.join(self.root, category, 'points_label', uuid+'.seg'))) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn[0], fn[1])) + + self.classes = dict(zip(sorted(self.cat), range(len(self.cat)))) + print(self.classes) + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../misc/num_seg_classes.txt'), 'r') as f: + for line in f: + ls = line.strip().split() + self.seg_classes[ls[0]] = int(ls[1]) + self.num_seg_classes = self.seg_classes[list(self.cat.keys())[0]] + print(self.seg_classes, self.num_seg_classes) + + def __getitem__(self, index): + fn = self.datapath[index] + cls = self.classes[self.datapath[index][0]] + point_set = np.loadtxt(fn[1]).astype(np.float32) + seg = np.loadtxt(fn[2]).astype(np.int64) + #print(point_set.shape, seg.shape) + + choice = np.random.choice(len(seg), self.npoints, replace=True) + #resample + point_set = point_set[choice, :] + + point_set = point_set - np.expand_dims(np.mean(point_set, axis = 0), 0) # center + dist = np.max(np.sqrt(np.sum(point_set ** 2, axis = 1)),0) + point_set = point_set / dist #scale + + if self.data_augmentation: + theta = np.random.uniform(0,np.pi*2) + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + point_set[:,[0,2]] = point_set[:,[0,2]].dot(rotation_matrix) # random rotation + point_set += np.random.normal(0, 0.02, size=point_set.shape) # random jitter + + seg = seg[choice] + point_set = torch.from_numpy(point_set) + seg = torch.from_numpy(seg) + cls = torch.from_numpy(np.array([cls]).astype(np.int64)) + + if self.classification: + return point_set, cls + else: + return point_set, seg + + def __len__(self): + return len(self.datapath) + +class ModelNetDataset(data.Dataset): + def __init__(self, + root, + npoints=2500, + split='train', + data_augmentation=True): + self.npoints = npoints + self.root = root + self.split = split + self.data_augmentation = data_augmentation + self.fns = [] + with open(os.path.join(root, '{}.txt'.format(self.split)), 'r') as f: + for line in f: + self.fns.append(line.strip()) + + self.cat = {} + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../misc/modelnet_id.txt'), 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = int(ls[1]) + + print(self.cat) + self.classes = list(self.cat.keys()) + + def __getitem__(self, index): + fn = self.fns[index] + cls = self.cat[fn.split('/')[0]] + with open(os.path.join(self.root, fn), 'rb') as f: + plydata = PlyData.read(f) + pts = np.vstack([plydata['vertex']['x'], plydata['vertex']['y'], plydata['vertex']['z']]).T + choice = np.random.choice(len(pts), self.npoints, replace=True) + point_set = pts[choice, :] + + point_set = point_set - np.expand_dims(np.mean(point_set, axis=0), 0) # center + dist = np.max(np.sqrt(np.sum(point_set ** 2, axis=1)), 0) + point_set = point_set / dist # scale + + if self.data_augmentation: + theta = np.random.uniform(0, np.pi * 2) + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]]) + point_set[:, [0, 2]] = point_set[:, [0, 2]].dot(rotation_matrix) # random rotation + point_set += np.random.normal(0, 0.02, size=point_set.shape) # random jitter + + point_set = torch.from_numpy(point_set.astype(np.float32)) + cls = torch.from_numpy(np.array([cls]).astype(np.int64)) + return point_set, cls + + + def __len__(self): + return len(self.fns) + +if __name__ == '__main__': + dataset = sys.argv[1] + datapath = sys.argv[2] + + if dataset == 'shapenet': + d = ShapeNetDataset(root = datapath, class_choice = ['Chair']) + print(len(d)) + ps, seg = d[0] + print(ps.size(), ps.type(), seg.size(),seg.type()) + + d = ShapeNetDataset(root = datapath, classification = True) + print(len(d)) + ps, cls = d[0] + print(ps.size(), ps.type(), cls.size(),cls.type()) + # get_segmentation_classes(datapath) + + if dataset == 'modelnet': + gen_modelnet_id(datapath) + d = ModelNetDataset(root=datapath) + print(len(d)) + print(d[0]) + diff --git a/zoo/SimpleView/pointnet_pyt/pointnet/model.py b/zoo/SimpleView/pointnet_pyt/pointnet/model.py new file mode 100644 index 0000000..adf48b2 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/pointnet/model.py @@ -0,0 +1,213 @@ +from __future__ import print_function +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.utils.data +from torch.autograd import Variable +import numpy as np +import torch.nn.functional as F + + +class STN3d(nn.Module): + def __init__(self): + super(STN3d, self).__init__() + self.conv1 = torch.nn.Conv1d(3, 64, 1) + self.conv2 = torch.nn.Conv1d(64, 128, 1) + self.conv3 = torch.nn.Conv1d(128, 1024, 1) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, 9) + self.relu = nn.ReLU() + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.bn4 = nn.BatchNorm1d(512) + self.bn5 = nn.BatchNorm1d(256) + + + def forward(self, x): + batchsize = x.size()[0] + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = torch.max(x, 2, keepdim=True)[0] + x = x.view(-1, 1024) + + x = F.relu(self.bn4(self.fc1(x))) + x = F.relu(self.bn5(self.fc2(x))) + x = self.fc3(x) + + iden = Variable(torch.from_numpy(np.array([1,0,0,0,1,0,0,0,1]).astype(np.float32))).view(1,9).repeat(batchsize,1) + if x.is_cuda: + iden = iden.cuda() + x = x + iden + x = x.view(-1, 3, 3) + return x + + +class STNkd(nn.Module): + def __init__(self, k=64): + super(STNkd, self).__init__() + self.conv1 = torch.nn.Conv1d(k, 64, 1) + self.conv2 = torch.nn.Conv1d(64, 128, 1) + self.conv3 = torch.nn.Conv1d(128, 1024, 1) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, k*k) + self.relu = nn.ReLU() + + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.bn4 = nn.BatchNorm1d(512) + self.bn5 = nn.BatchNorm1d(256) + + self.k = k + + def forward(self, x): + batchsize = x.size()[0] + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = torch.max(x, 2, keepdim=True)[0] + x = x.view(-1, 1024) + + x = F.relu(self.bn4(self.fc1(x))) + x = F.relu(self.bn5(self.fc2(x))) + x = self.fc3(x) + + iden = Variable(torch.from_numpy(np.eye(self.k).flatten().astype(np.float32))).view(1,self.k*self.k).repeat(batchsize,1) + if x.is_cuda: + iden = iden.cuda() + x = x + iden + x = x.view(-1, self.k, self.k) + return x + +class PointNetfeat(nn.Module): + def __init__(self, global_feat = True, feature_transform = False): + super(PointNetfeat, self).__init__() + self.stn = STN3d() + self.conv1 = torch.nn.Conv1d(3, 64, 1) + self.conv2 = torch.nn.Conv1d(64, 128, 1) + self.conv3 = torch.nn.Conv1d(128, 1024, 1) + self.bn1 = nn.BatchNorm1d(64) + self.bn2 = nn.BatchNorm1d(128) + self.bn3 = nn.BatchNorm1d(1024) + self.global_feat = global_feat + self.feature_transform = feature_transform + if self.feature_transform: + self.fstn = STNkd(k=64) + + def forward(self, x): + n_pts = x.size()[2] + trans = self.stn(x) + x = x.transpose(2, 1) + x = torch.bmm(x, trans) + x = x.transpose(2, 1) + x = F.relu(self.bn1(self.conv1(x))) + + if self.feature_transform: + trans_feat = self.fstn(x) + x = x.transpose(2,1) + x = torch.bmm(x, trans_feat) + x = x.transpose(2,1) + else: + trans_feat = None + + pointfeat = x + x = F.relu(self.bn2(self.conv2(x))) + x = self.bn3(self.conv3(x)) + x = torch.max(x, 2, keepdim=True)[0] + x = x.view(-1, 1024) + if self.global_feat: + return x, trans, trans_feat + else: + x = x.view(-1, 1024, 1).repeat(1, 1, n_pts) + return torch.cat([x, pointfeat], 1), trans, trans_feat + +class PointNetCls(nn.Module): + def __init__(self, k=2, feature_transform=False): + super(PointNetCls, self).__init__() + self.feature_transform = feature_transform + self.feat = PointNetfeat(global_feat=True, feature_transform=feature_transform) + self.fc1 = nn.Linear(1024, 512) + self.fc2 = nn.Linear(512, 256) + self.fc3 = nn.Linear(256, k) + self.dropout = nn.Dropout(p=0.3) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.relu = nn.ReLU() + + def forward(self, x): + x, trans, trans_feat = self.feat(x) + x = F.relu(self.bn1(self.fc1(x))) + x = F.relu(self.bn2(self.dropout(self.fc2(x)))) + x = self.fc3(x) + return F.log_softmax(x, dim=1), trans, trans_feat + + +class PointNetDenseCls(nn.Module): + def __init__(self, k = 2, feature_transform=False): + super(PointNetDenseCls, self).__init__() + self.k = k + self.feature_transform=feature_transform + self.feat = PointNetfeat(global_feat=False, feature_transform=feature_transform) + self.conv1 = torch.nn.Conv1d(1088, 512, 1) + self.conv2 = torch.nn.Conv1d(512, 256, 1) + self.conv3 = torch.nn.Conv1d(256, 128, 1) + self.conv4 = torch.nn.Conv1d(128, self.k, 1) + self.bn1 = nn.BatchNorm1d(512) + self.bn2 = nn.BatchNorm1d(256) + self.bn3 = nn.BatchNorm1d(128) + + def forward(self, x): + batchsize = x.size()[0] + n_pts = x.size()[2] + x, trans, trans_feat = self.feat(x) + x = F.relu(self.bn1(self.conv1(x))) + x = F.relu(self.bn2(self.conv2(x))) + x = F.relu(self.bn3(self.conv3(x))) + x = self.conv4(x) + x = x.transpose(2,1).contiguous() + x = F.log_softmax(x.view(-1,self.k), dim=-1) + x = x.view(batchsize, n_pts, self.k) + return x, trans, trans_feat + +def feature_transform_regularizer(trans): + d = trans.size()[1] + batchsize = trans.size()[0] + I = torch.eye(d)[None, :, :] + if trans.is_cuda: + I = I.cuda() + loss = torch.mean(torch.norm(torch.bmm(trans, trans.transpose(2,1)) - I, dim=(1,2), p=2)) + return loss + +if __name__ == '__main__': + sim_data = Variable(torch.rand(32,3,2500)) + trans = STN3d() + out = trans(sim_data) + print('stn', out.size()) + print('loss', feature_transform_regularizer(out)) + + sim_data_64d = Variable(torch.rand(32, 64, 2500)) + trans = STNkd(k=64) + out = trans(sim_data_64d) + print('stn64d', out.size()) + print('loss', feature_transform_regularizer(out)) + + pointfeat = PointNetfeat(global_feat=True) + out, _, _ = pointfeat(sim_data) + print('global feat', out.size()) + + pointfeat = PointNetfeat(global_feat=False) + out, _, _ = pointfeat(sim_data) + print('point feat', out.size()) + + cls = PointNetCls(k = 5) + out, _, _ = cls(sim_data) + print('class', out.size()) + + seg = PointNetDenseCls(k = 3) + out, _, _ = seg(sim_data) + print('seg', out.size()) diff --git a/zoo/SimpleView/pointnet_pyt/scripts/build.sh b/zoo/SimpleView/pointnet_pyt/scripts/build.sh new file mode 100755 index 0000000..8c723ed --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/scripts/build.sh @@ -0,0 +1,5 @@ +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` +echo $SCRIPTPATH + +g++ -std=c++11 $SCRIPTPATH/../utils/render_balls_so.cpp -o $SCRIPTPATH/../utils/render_balls_so.so -shared -fPIC -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/zoo/SimpleView/pointnet_pyt/scripts/download.sh b/zoo/SimpleView/pointnet_pyt/scripts/download.sh new file mode 100755 index 0000000..abc9b71 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/scripts/download.sh @@ -0,0 +1,8 @@ +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` + +cd $SCRIPTPATH/.. +wget https://shapenet.cs.stanford.edu/ericyi/shapenetcore_partanno_segmentation_benchmark_v0.zip --no-check-certificate +unzip shapenetcore_partanno_segmentation_benchmark_v0.zip +rm shapenetcore_partanno_segmentation_benchmark_v0.zip +cd - diff --git a/zoo/SimpleView/pointnet_pyt/setup.py b/zoo/SimpleView/pointnet_pyt/setup.py new file mode 100644 index 0000000..9e71bd7 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/setup.py @@ -0,0 +1,11 @@ +# install using 'pip install -e .' + +from setuptools import setup + +setup(name='pointnet', + packages=['pointnet'], + package_dir={'pointnet': 'pointnet'}, + install_requires=['torch', + 'tqdm', + 'plyfile'], + version='0.0.1') diff --git a/zoo/SimpleView/pointnet_pyt/utils/render_balls_so.cpp b/zoo/SimpleView/pointnet_pyt/utils/render_balls_so.cpp new file mode 100644 index 0000000..444c99a --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/utils/render_balls_so.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +using namespace std; + +struct PointInfo{ + int x,y,z; + float r,g,b; +}; + +extern "C"{ + +void render_ball(int h,int w,unsigned char * show,int n,int * xyzs,float * c0,float * c1,float * c2,int r){ + r=max(r,1); + vector depth(h*w,-2100000000); + vector pattern; + for (int dx=-r;dx<=r;dx++) + for (int dy=-r;dy<=r;dy++) + if (dx*dx+dy*dy=h || y2<0 || y2>=w) && depth[x2*w+y2] 0: + show[:, :, 0] = np.maximum(show[:, :, 0], np.roll( + show[:, :, 0], 1, axis=0)) + if magnifyBlue >= 2: + show[:, :, 0] = np.maximum(show[:, :, 0], + np.roll(show[:, :, 0], -1, axis=0)) + show[:, :, 0] = np.maximum(show[:, :, 0], np.roll( + show[:, :, 0], 1, axis=1)) + if magnifyBlue >= 2: + show[:, :, 0] = np.maximum(show[:, :, 0], + np.roll(show[:, :, 0], -1, axis=1)) + if showrot: + cv2.putText(show, 'xangle %d' % (int(xangle / np.pi * 180)), + (30, showsz - 30), 0, 0.5, cv2.cv.CV_RGB(255, 0, 0)) + cv2.putText(show, 'yangle %d' % (int(yangle / np.pi * 180)), + (30, showsz - 50), 0, 0.5, cv2.cv.CV_RGB(255, 0, 0)) + cv2.putText(show, 'zoom %d%%' % (int(zoom * 100)), (30, showsz - 70), 0, + 0.5, cv2.cv.CV_RGB(255, 0, 0)) + changed = True + while True: + if changed: + render() + changed = False + cv2.imshow('show3d', show) + if waittime == 0: + cmd = cv2.waitKey(10) % 256 + else: + cmd = cv2.waitKey(waittime) % 256 + if cmd == ord('q'): + break + elif cmd == ord('Q'): + sys.exit(0) + + if cmd == ord('t') or cmd == ord('p'): + if cmd == ord('t'): + if c_gt is None: + c0 = np.zeros((len(xyz), ), dtype='float32') + 255 + c1 = np.zeros((len(xyz), ), dtype='float32') + 255 + c2 = np.zeros((len(xyz), ), dtype='float32') + 255 + else: + c0 = c_gt[:, 0] + c1 = c_gt[:, 1] + c2 = c_gt[:, 2] + else: + if c_pred is None: + c0 = np.zeros((len(xyz), ), dtype='float32') + 255 + c1 = np.zeros((len(xyz), ), dtype='float32') + 255 + c2 = np.zeros((len(xyz), ), dtype='float32') + 255 + else: + c0 = c_pred[:, 0] + c1 = c_pred[:, 1] + c2 = c_pred[:, 2] + if normalizecolor: + c0 /= (c0.max() + 1e-14) / 255.0 + c1 /= (c1.max() + 1e-14) / 255.0 + c2 /= (c2.max() + 1e-14) / 255.0 + c0 = np.require(c0, 'float32', 'C') + c1 = np.require(c1, 'float32', 'C') + c2 = np.require(c2, 'float32', 'C') + changed = True + + if cmd==ord('n'): + zoom*=1.1 + changed=True + elif cmd==ord('m'): + zoom/=1.1 + changed=True + elif cmd==ord('r'): + zoom=1.0 + changed=True + elif cmd==ord('s'): + cv2.imwrite('show3d.png',show) + if waittime!=0: + break + return cmd + +if __name__ == '__main__': + np.random.seed(100) + showpoints(np.random.randn(2500, 3)) diff --git a/zoo/SimpleView/pointnet_pyt/utils/show_cls.py b/zoo/SimpleView/pointnet_pyt/utils/show_cls.py new file mode 100644 index 0000000..d52ef08 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/utils/show_cls.py @@ -0,0 +1,49 @@ +from __future__ import print_function +import argparse +import torch +import torch.nn.parallel +import torch.utils.data +from torch.autograd import Variable +from pointnet.dataset import ShapeNetDataset +from pointnet.model import PointNetCls +import torch.nn.functional as F + + +#showpoints(np.random.randn(2500,3), c1 = np.random.uniform(0,1,size = (2500))) + +parser = argparse.ArgumentParser() + +parser.add_argument('--model', type=str, default = '', help='model path') +parser.add_argument('--num_points', type=int, default=2500, help='input batch size') + + +opt = parser.parse_args() +print(opt) + +test_dataset = ShapeNetDataset( + root='shapenetcore_partanno_segmentation_benchmark_v0', + split='test', + classification=True, + npoints=opt.num_points, + data_augmentation=False) + +testdataloader = torch.utils.data.DataLoader( + test_dataset, batch_size=32, shuffle=True) + +classifier = PointNetCls(k=len(test_dataset.classes)) +classifier.cuda() +classifier.load_state_dict(torch.load(opt.model)) +classifier.eval() + + +for i, data in enumerate(testdataloader, 0): + points, target = data + points, target = Variable(points), Variable(target[:, 0]) + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + pred, _, _ = classifier(points) + loss = F.nll_loss(pred, target) + + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + print('i:%d loss: %f accuracy: %f' % (i, loss.data.item(), correct / float(32))) diff --git a/zoo/SimpleView/pointnet_pyt/utils/show_seg.py b/zoo/SimpleView/pointnet_pyt/utils/show_seg.py new file mode 100644 index 0000000..a849751 --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/utils/show_seg.py @@ -0,0 +1,59 @@ +from __future__ import print_function +from show3d_balls import showpoints +import argparse +import numpy as np +import torch +import torch.nn.parallel +import torch.utils.data +from torch.autograd import Variable +from pointnet.dataset import ShapeNetDataset +from pointnet.model import PointNetDenseCls +import matplotlib.pyplot as plt + + +#showpoints(np.random.randn(2500,3), c1 = np.random.uniform(0,1,size = (2500))) + +parser = argparse.ArgumentParser() + +parser.add_argument('--model', type=str, default='', help='model path') +parser.add_argument('--idx', type=int, default=0, help='model index') +parser.add_argument('--dataset', type=str, default='', help='dataset path') +parser.add_argument('--class_choice', type=str, default='', help='class choice') + +opt = parser.parse_args() +print(opt) + +d = ShapeNetDataset( + root=opt.dataset, + class_choice=[opt.class_choice], + split='test', + data_augmentation=False) + +idx = opt.idx + +print("model %d/%d" % (idx, len(d))) +point, seg = d[idx] +print(point.size(), seg.size()) +point_np = point.numpy() + +cmap = plt.cm.get_cmap("hsv", 10) +cmap = np.array([cmap(i) for i in range(10)])[:, :3] +gt = cmap[seg.numpy() - 1, :] + +state_dict = torch.load(opt.model) +classifier = PointNetDenseCls(k= state_dict['conv4.weight'].size()[0]) +classifier.load_state_dict(state_dict) +classifier.eval() + +point = point.transpose(1, 0).contiguous() + +point = Variable(point.view(1, point.size()[0], point.size()[1])) +pred, _, _ = classifier(point) +pred_choice = pred.data.max(2)[1] +print(pred_choice) + +#print(pred_choice.size()) +pred_color = cmap[pred_choice.numpy()[0], :] + +#print(pred_color.shape) +showpoints(point_np, gt, pred_color) diff --git a/zoo/SimpleView/pointnet_pyt/utils/train_classification.py b/zoo/SimpleView/pointnet_pyt/utils/train_classification.py new file mode 100644 index 0000000..9302eca --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/utils/train_classification.py @@ -0,0 +1,148 @@ +from __future__ import print_function +import argparse +import os +import random +import torch +import torch.nn.parallel +import torch.optim as optim +import torch.utils.data +from pointnet.dataset import ShapeNetDataset, ModelNetDataset +from pointnet.model import PointNetCls, feature_transform_regularizer +import torch.nn.functional as F +from tqdm import tqdm + + +parser = argparse.ArgumentParser() +parser.add_argument( + '--batchSize', type=int, default=32, help='input batch size') +parser.add_argument( + '--num_points', type=int, default=2500, help='input batch size') +parser.add_argument( + '--workers', type=int, help='number of data loading workers', default=4) +parser.add_argument( + '--nepoch', type=int, default=250, help='number of epochs to train for') +parser.add_argument('--outf', type=str, default='cls', help='output folder') +parser.add_argument('--model', type=str, default='', help='model path') +parser.add_argument('--dataset', type=str, required=True, help="dataset path") +parser.add_argument('--dataset_type', type=str, default='shapenet', help="dataset type shapenet|modelnet40") +parser.add_argument('--feature_transform', action='store_true', help="use feature transform") + +opt = parser.parse_args() +print(opt) + +blue = lambda x: '\033[94m' + x + '\033[0m' + +opt.manualSeed = random.randint(1, 10000) # fix seed +print("Random Seed: ", opt.manualSeed) +random.seed(opt.manualSeed) +torch.manual_seed(opt.manualSeed) + +if opt.dataset_type == 'shapenet': + dataset = ShapeNetDataset( + root=opt.dataset, + classification=True, + npoints=opt.num_points) + + test_dataset = ShapeNetDataset( + root=opt.dataset, + classification=True, + split='test', + npoints=opt.num_points, + data_augmentation=False) +elif opt.dataset_type == 'modelnet40': + dataset = ModelNetDataset( + root=opt.dataset, + npoints=opt.num_points, + split='trainval') + + test_dataset = ModelNetDataset( + root=opt.dataset, + split='test', + npoints=opt.num_points, + data_augmentation=False) +else: + exit('wrong dataset type') + + +dataloader = torch.utils.data.DataLoader( + dataset, + batch_size=opt.batchSize, + shuffle=True, + num_workers=int(opt.workers)) + +testdataloader = torch.utils.data.DataLoader( + test_dataset, + batch_size=opt.batchSize, + shuffle=True, + num_workers=int(opt.workers)) + +print(len(dataset), len(test_dataset)) +num_classes = len(dataset.classes) +print('classes', num_classes) + +try: + os.makedirs(opt.outf) +except OSError: + pass + +classifier = PointNetCls(k=num_classes, feature_transform=opt.feature_transform) + +if opt.model != '': + classifier.load_state_dict(torch.load(opt.model)) + + +optimizer = optim.Adam(classifier.parameters(), lr=0.001, betas=(0.9, 0.999)) +scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5) +classifier.cuda() + +num_batch = len(dataset) / opt.batchSize + +for epoch in range(opt.nepoch): + scheduler.step() + for i, data in enumerate(dataloader, 0): + points, target = data + target = target[:, 0] + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + optimizer.zero_grad() + classifier = classifier.train() + pred, trans, trans_feat = classifier(points) + loss = F.nll_loss(pred, target) + if opt.feature_transform: + loss += feature_transform_regularizer(trans_feat) * 0.001 + loss.backward() + optimizer.step() + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + print('[%d: %d/%d] train loss: %f accuracy: %f' % (epoch, i, num_batch, loss.item(), correct.item() / float(opt.batchSize))) + + if i % 10 == 0: + j, data = next(enumerate(testdataloader, 0)) + points, target = data + target = target[:, 0] + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + classifier = classifier.eval() + pred, _, _ = classifier(points) + loss = F.nll_loss(pred, target) + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + print('[%d: %d/%d] %s loss: %f accuracy: %f' % (epoch, i, num_batch, blue('test'), loss.item(), correct.item()/float(opt.batchSize))) + + torch.save(classifier.state_dict(), '%s/cls_model_%d.pth' % (opt.outf, epoch)) + +total_correct = 0 +total_testset = 0 +for i,data in tqdm(enumerate(testdataloader, 0)): + points, target = data + target = target[:, 0] + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + classifier = classifier.eval() + pred, _, _ = classifier(points) + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + total_correct += correct.item() + total_testset += points.size()[0] + +print("final accuracy {}".format(total_correct / float(total_testset))) \ No newline at end of file diff --git a/zoo/SimpleView/pointnet_pyt/utils/train_segmentation.py b/zoo/SimpleView/pointnet_pyt/utils/train_segmentation.py new file mode 100644 index 0000000..68e8c7f --- /dev/null +++ b/zoo/SimpleView/pointnet_pyt/utils/train_segmentation.py @@ -0,0 +1,143 @@ +from __future__ import print_function +import argparse +import os +import random +import torch +import torch.nn.parallel +import torch.optim as optim +import torch.utils.data +from pointnet.dataset import ShapeNetDataset +from pointnet.model import PointNetDenseCls, feature_transform_regularizer +import torch.nn.functional as F +from tqdm import tqdm +import numpy as np + + +parser = argparse.ArgumentParser() +parser.add_argument( + '--batchSize', type=int, default=32, help='input batch size') +parser.add_argument( + '--workers', type=int, help='number of data loading workers', default=4) +parser.add_argument( + '--nepoch', type=int, default=25, help='number of epochs to train for') +parser.add_argument('--outf', type=str, default='seg', help='output folder') +parser.add_argument('--model', type=str, default='', help='model path') +parser.add_argument('--dataset', type=str, required=True, help="dataset path") +parser.add_argument('--class_choice', type=str, default='Chair', help="class_choice") +parser.add_argument('--feature_transform', action='store_true', help="use feature transform") + +opt = parser.parse_args() +print(opt) + +opt.manualSeed = random.randint(1, 10000) # fix seed +print("Random Seed: ", opt.manualSeed) +random.seed(opt.manualSeed) +torch.manual_seed(opt.manualSeed) + +dataset = ShapeNetDataset( + root=opt.dataset, + classification=False, + class_choice=[opt.class_choice]) +dataloader = torch.utils.data.DataLoader( + dataset, + batch_size=opt.batchSize, + shuffle=True, + num_workers=int(opt.workers)) + +test_dataset = ShapeNetDataset( + root=opt.dataset, + classification=False, + class_choice=[opt.class_choice], + split='test', + data_augmentation=False) +testdataloader = torch.utils.data.DataLoader( + test_dataset, + batch_size=opt.batchSize, + shuffle=True, + num_workers=int(opt.workers)) + +print(len(dataset), len(test_dataset)) +num_classes = dataset.num_seg_classes +print('classes', num_classes) +try: + os.makedirs(opt.outf) +except OSError: + pass + +blue = lambda x: '\033[94m' + x + '\033[0m' + +classifier = PointNetDenseCls(k=num_classes, feature_transform=opt.feature_transform) + +if opt.model != '': + classifier.load_state_dict(torch.load(opt.model)) + +optimizer = optim.Adam(classifier.parameters(), lr=0.001, betas=(0.9, 0.999)) +scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5) +classifier.cuda() + +num_batch = len(dataset) / opt.batchSize + +for epoch in range(opt.nepoch): + scheduler.step() + for i, data in enumerate(dataloader, 0): + points, target = data + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + optimizer.zero_grad() + classifier = classifier.train() + pred, trans, trans_feat = classifier(points) + pred = pred.view(-1, num_classes) + target = target.view(-1, 1)[:, 0] - 1 + #print(pred.size(), target.size()) + loss = F.nll_loss(pred, target) + if opt.feature_transform: + loss += feature_transform_regularizer(trans_feat) * 0.001 + loss.backward() + optimizer.step() + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + print('[%d: %d/%d] train loss: %f accuracy: %f' % (epoch, i, num_batch, loss.item(), correct.item()/float(opt.batchSize * 2500))) + + if i % 10 == 0: + j, data = next(enumerate(testdataloader, 0)) + points, target = data + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + classifier = classifier.eval() + pred, _, _ = classifier(points) + pred = pred.view(-1, num_classes) + target = target.view(-1, 1)[:, 0] - 1 + loss = F.nll_loss(pred, target) + pred_choice = pred.data.max(1)[1] + correct = pred_choice.eq(target.data).cpu().sum() + print('[%d: %d/%d] %s loss: %f accuracy: %f' % (epoch, i, num_batch, blue('test'), loss.item(), correct.item()/float(opt.batchSize * 2500))) + + torch.save(classifier.state_dict(), '%s/seg_model_%s_%d.pth' % (opt.outf, opt.class_choice, epoch)) + +## benchmark mIOU +shape_ious = [] +for i,data in tqdm(enumerate(testdataloader, 0)): + points, target = data + points = points.transpose(2, 1) + points, target = points.cuda(), target.cuda() + classifier = classifier.eval() + pred, _, _ = classifier(points) + pred_choice = pred.data.max(2)[1] + + pred_np = pred_choice.cpu().data.numpy() + target_np = target.cpu().data.numpy() - 1 + + for shape_idx in range(target_np.shape[0]): + parts = range(num_classes)#np.unique(target_np[shape_idx]) + part_ious = [] + for part in parts: + I = np.sum(np.logical_and(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + U = np.sum(np.logical_or(pred_np[shape_idx] == part, target_np[shape_idx] == part)) + if U == 0: + iou = 1 #If the union of groundtruth and prediction points is empty, then count part IoU as 1 + else: + iou = I / float(U) + part_ious.append(iou) + shape_ious.append(np.mean(part_ious)) + +print("mIOU for class {}: {}".format(opt.class_choice, np.mean(shape_ious))) \ No newline at end of file diff --git a/zoo/SimpleView/requirements.txt b/zoo/SimpleView/requirements.txt new file mode 100644 index 0000000..98ccf01 --- /dev/null +++ b/zoo/SimpleView/requirements.txt @@ -0,0 +1,11 @@ +git+git://github.com/imankgoyal/etw_pytorch_utils.git@v1.1.1#egg=etw_pytorch_utils +enum34 +future +h5py==2.10.0 +progressbar2==3.50.0 +tensorboardX==2.0 +-f https://download.pytorch.org/whl/torch_stable.html +torch==1.4.0+cu100 +-f https://download.pytorch.org/whl/torch_stable.html +torchvision==0.5.0+cu100 +yacs==0.1.6 diff --git a/zoo/SimpleView/rs_cnn/.gitignore b/zoo/SimpleView/rs_cnn/.gitignore new file mode 100644 index 0000000..42439c4 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/.gitignore @@ -0,0 +1,2 @@ +cls/*.pth +seg/*.pth diff --git a/zoo/SimpleView/rs_cnn/CMakeLists.txt b/zoo/SimpleView/rs_cnn/CMakeLists.txt new file mode 100644 index 0000000..c235a86 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/CMakeLists.txt @@ -0,0 +1,24 @@ +project(PointNet2) +cmake_minimum_required(VERSION 2.8) + +find_package(CUDA REQUIRED) + +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/utils/cinclude") +cuda_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/utils/cinclude") +file(GLOB cuda_kernels_src "${CMAKE_CURRENT_SOURCE_DIR}/utils/csrc/*.cu") +cuda_compile(cuda_kernels SHARED ${cuda_kernels_src} OPTIONS -O3) + +set(BUILD_CMD python "${CMAKE_CURRENT_SOURCE_DIR}/utils/build_ffi.py") +file(GLOB wrapper_headers "${CMAKE_CURRENT_SOURCE_DIR}/utils/cinclude/*wrapper.h") +file(GLOB wrapper_sources "${CMAKE_CURRENT_SOURCE_DIR}/utils/csrs/*.c") +add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/utils/_ext/pointnet2/_pointnet2.so" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/utils + COMMAND ${BUILD_CMD} --build --objs ${cuda_kernels} + DEPENDS ${cuda_kernels} + DEPENDS ${wrapper_headers} + DEPENDS ${wrapper_sources} + VERBATIM) + +add_custom_target(pointnet2_ext ALL + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/utils/_ext/pointnet2/_pointnet2.so") + diff --git a/zoo/SimpleView/rs_cnn/LICENSE b/zoo/SimpleView/rs_cnn/LICENSE new file mode 100644 index 0000000..afe59d0 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Yongcheng Liu + +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/zoo/SimpleView/rs_cnn/README.md b/zoo/SimpleView/rs_cnn/README.md new file mode 100644 index 0000000..9d93d51 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/README.md @@ -0,0 +1,89 @@ +Relation-Shape Convolutional Neural Network for Point Cloud Analysis +=== +This repository contains the author's implementation in Pytorch for the paper: + +__Relation-Shape Convolutional Neural Network for Point Cloud Analysis__ [[arXiv](https://arxiv.org/abs/1904.07601)] [[CVF](http://openaccess.thecvf.com/content_CVPR_2019/papers/Liu_Relation-Shape_Convolutional_Neural_Network_for_Point_Cloud_Analysis_CVPR_2019_paper.pdf)] +
+[Yongcheng Liu](https://yochengliu.github.io/), [Bin Fan](http://www.nlpr.ia.ac.cn/fanbin/), [Shiming Xiang](https://scholar.google.com/citations?user=0ggsACEAAAAJ&hl=zh-CN) and [Chunhong Pan](http://people.ucas.ac.cn/~0005314) +
+[__CVPR 2019 Oral & Best paper finalist__](http://cvpr2019.thecvf.com/)     __Project Page__: [https://yochengliu.github.io/Relation-Shape-CNN/](https://yochengliu.github.io/Relation-Shape-CNN/) + +## Citation + +If our paper is helpful for your research, please consider citing: +```BibTex + @inproceedings{liu2019rscnn, + author = {Yongcheng Liu and + Bin Fan and + Shiming Xiang and + Chunhong Pan}, + title = {Relation-Shape Convolutional Neural Network for Point Cloud Analysis}, + booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + pages = {8895--8904}, + year = {2019} + } +``` +## Usage: Preparation + +### Requirement + +- Ubuntu 14.04 +- Python 3 (recommend Anaconda3) +- Pytorch 0.3.\*/0.4.\* +- CMake > 2.8 +- CUDA 8.0 + cuDNN 5.1 + +### Building Kernel + + git clone https://github.com/Yochengliu/Relation-Shape-CNN.git + cd Relation-Shape-CNN + +- mkdir build && cd build +- cmake .. && make + +### Dataset +__Shape Classification__ + +Download and unzip [ModelNet40](https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip) (415M). Replace `$data_root$` in `cfgs/config_*_cls.yaml` with the dataset parent path. + +__ShapeNet Part Segmentation__ + +Download and unzip [ShapeNet Part](https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip) (674M). Replace `$data_root$` in `cfgs/config_*_partseg.yaml` with the dataset path. + +## Usage: Training +### Shape Classification + + sh train_cls.sh + +You can modify `relation_prior` in `cfgs/config_*_cls.yaml`. We have trained a Single-Scale-Neighborhood classification model in `cls` folder, whose accuracy is 92.38%. + +### Shape Part Segmentation + + sh train_partseg.sh + +We have trained a Multi-Scale-Neighborhood part segmentation model in `seg` folder, whose class mIoU and instance mIoU is 84.18% and 85.81% respectively. + +## Usage: Evaluation +### Shape Classification + + Voting script: voting_evaluate_cls.py + +You can use our model `cls/model_cls_ssn_iter_16218_acc_0.923825.pth` as the checkpoint in `config_ssn_cls.yaml`, and after this voting you will get an accuracy of 92.71% if all things go right. + +### Shape Part Segmentation + + Voting script: voting_evaluate_partseg.py + +You can use our model `seg/model_seg_msn_iter_57585_ins_0.858054_cls_0.841787.pth` as the checkpoint in `config_msn_partseg.yaml`. + +## License + +The code is released under MIT License (see LICENSE file for details). + +## Acknowledgement + +The code is heavily borrowed from [Pointnet2_PyTorch](https://github.com/erikwijmans/Pointnet2_PyTorch). + +## Contact + +If you have some ideas or questions about our research to share with us, please contact diff --git a/zoo/SimpleView/rs_cnn/cfgs/config_msn_partseg.yaml b/zoo/SimpleView/rs_cnn/cfgs/config_msn_partseg.yaml new file mode 100644 index 0000000..4230ca6 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/cfgs/config_msn_partseg.yaml @@ -0,0 +1,32 @@ +common: + workers: 4 + + num_points: 2048 + num_classes: 50 + batch_size: 28 + + base_lr: 0.001 + lr_clip: 0.00001 + lr_decay: 0.5 + decay_step: 21 + epochs: 200 + + weight_decay: 0 + bn_momentum: 0.9 + bnm_clip: 0.01 + bn_decay: 0.5 + + evaluate: 1 # validation in training process + val_freq_epoch: 0.7 # frequency in epoch for validation, can be decimal + print_freq_iter: 20 # frequency in iteration for printing infomation + + input_channels: 0 # feature channels except (x, y, z) + + # h_ij: 0 for 3D Euclidean distance (3D Ed), channels = 1 + # 1 for (3D Ed, x_i, x_j, x_j - x_i), channels = 10 + # 2 for (2D Ed, x'_i, x'_j, x'_j - x'_i), channels = 10, x' indicates 2D coordinates + relation_prior: 1 + + checkpoint: '' # the model to start from + save_path: seg + data_root: /u/agoyal/storage/view_point_cloud/Pytorch/data/shapenetcore_partanno_segmentation_benchmark_v0_normal diff --git a/zoo/SimpleView/rs_cnn/cfgs/config_ssn_cls.yaml b/zoo/SimpleView/rs_cnn/cfgs/config_ssn_cls.yaml new file mode 100644 index 0000000..a4f6abd --- /dev/null +++ b/zoo/SimpleView/rs_cnn/cfgs/config_ssn_cls.yaml @@ -0,0 +1,32 @@ +common: + workers: 4 + + num_points: 1024 + num_classes: 40 + batch_size: 32 + + base_lr: 0.001 + lr_clip: 0.00001 + lr_decay: 0.7 + decay_step: 21 + epochs: 200 + + weight_decay: 0 + bn_momentum: 0.9 + bnm_clip: 0.01 + bn_decay: 0.5 + + evaluate: 1 + val_freq_epoch: 0.5 # frequency in epoch for validation, can be decimal + print_freq_iter: 20 # frequency in iteration for printing infomation + + input_channels: 0 # feature channels except (x, y, z) + + # h_ij: 0 for 3D Euclidean distance (3D Ed), channels = 1 + # 1 for (3D Ed, x_i, x_j, x_j - x_i), channels = 10 + # 2 for (2D Ed, x'_i, x'_j, x'_j - x'_i), channels = 10, x' indicates 2D coordinates + relation_prior: 1 + + checkpoint: '' # the model to start from + save_path: cls + data_root: /u/agoyal/storage/view_point_cloud/data/ diff --git a/zoo/SimpleView/rs_cnn/data/ModelNet40Loader.py b/zoo/SimpleView/rs_cnn/data/ModelNet40Loader.py new file mode 100644 index 0000000..916f918 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/data/ModelNet40Loader.py @@ -0,0 +1,78 @@ +import torch +import torch.utils.data as data +import numpy as np +import os, sys, h5py + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) + +def _get_data_files(list_filename): + with open(list_filename) as f: + return [line.rstrip()[5:] for line in f] + +def _load_data_file(name): + f = h5py.File(name, 'r') + data = f['data'][:] + label = f['label'][:] + return data, label + +class ModelNet40Cls(data.Dataset): + def __init__(self, num_points, root, data_file, transforms=None, train=True): + super().__init__() + + self.transforms = transforms + + root = os.path.abspath(root) + self.folder = "modelnet40_ply_hdf5_2048" + self.data_dir = os.path.join(root, self.folder) + + self.train, self.num_points = train, num_points + self.files = _get_data_files(os.path.join(self.data_dir, data_file)) + # if self.train: + # self.files = _get_data_files( \ + # os.path.join(self.data_dir, 'train_files.txt')) + # else: + # self.files = _get_data_files( \ + # os.path.join(self.data_dir, 'test_files.txt')) + + point_list, label_list = [], [] + for f in self.files: + points, labels = _load_data_file(os.path.join(root, f)) + point_list.append(points) + label_list.append(labels) + + self.points = np.concatenate(point_list, 0) + self.labels = np.concatenate(label_list, 0) + + def __getitem__(self, idx): + pt_idxs = np.arange(0, self.points.shape[1]) # 2048 + if self.train: + np.random.shuffle(pt_idxs) + + current_points = self.points[idx, pt_idxs].copy() + label = torch.from_numpy(self.labels[idx]).type(torch.LongTensor) + + if self.transforms is not None: + current_points = self.transforms(current_points) + + return current_points, label + + def __len__(self): + return self.points.shape[0] + +if __name__ == "__main__": + from torchvision import transforms + import data_utils as d_utils + + transforms = transforms.Compose([ + d_utils.PointcloudToTensor(), + d_utils.PointcloudRotate(axis=np.array([1,0,0])), + d_utils.PointcloudScale(), + d_utils.PointcloudTranslate(), + d_utils.PointcloudJitter() + ]) + dset = ModelNet40Cls(16, "./", train=True, transforms=transforms) + print(dset[0][0]) + print(dset[0][1]) + print(len(dset)) + dloader = torch.utils.data.DataLoader(dset, batch_size=32, shuffle=True) diff --git a/zoo/SimpleView/rs_cnn/data/ShapeNetPartLoader.py b/zoo/SimpleView/rs_cnn/data/ShapeNetPartLoader.py new file mode 100644 index 0000000..68f8d01 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/data/ShapeNetPartLoader.py @@ -0,0 +1,120 @@ +import os +import os.path +import torch +import json +import pickle +import numpy as np +import sys +import torchvision.transforms as transforms +from progressbar import ProgressBar +import pdb + +def pc_normalize(pc): + l = pc.shape[0] + centroid = np.mean(pc, axis=0) + pc = pc - centroid + m = np.max(np.sqrt(np.sum(pc**2, axis=1))) + pc = pc / m + return pc + +class ShapeNetPart(): + def __init__(self, root, num_points = 2048, split='train', normalize=True, transforms = None, all_points=False): + self.transforms = transforms + self.num_points = num_points + self.root = root + self.catfile = os.path.join(self.root, 'synsetoffset2category.txt') + self.normalize = normalize + self.all_points = all_points + + self.cat = {} + with open(self.catfile, 'r') as f: + for line in f: + ls = line.strip().split() + self.cat[ls[0]] = ls[1] + self.cat = {k:v for k,v in self.cat.items()} + + self.meta = {} + with open(os.path.join(self.root, 'train_test_split', 'shuffled_train_file_list.json'), 'r') as f: + train_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_val_file_list.json'), 'r') as f: + val_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + with open(os.path.join(self.root, 'train_test_split', 'shuffled_test_file_list.json'), 'r') as f: + test_ids = set([str(d.split('/')[2]) for d in json.load(f)]) + for item in self.cat: + self.meta[item] = [] + dir_point = os.path.join(self.root, self.cat[item]) + fns = sorted(os.listdir(dir_point)) + if split=='trainval': + fns = [fn for fn in fns if ((fn[0:-4] in train_ids) or (fn[0:-4] in val_ids))] + elif split=='train': + fns = [fn for fn in fns if fn[0:-4] in train_ids] + elif split=='val': + fns = [fn for fn in fns if fn[0:-4] in val_ids] + elif split=='test': + fns = [fn for fn in fns if fn[0:-4] in test_ids] + else: + print('Unknown split: %s. Exiting..'%(split)) + exit(-1) + + for fn in fns: + token = (os.path.splitext(os.path.basename(fn))[0]) + self.meta[item].append(os.path.join(dir_point, token + '.txt')) + + self.datapath = [] + for item in self.cat: + for fn in self.meta[item]: + self.datapath.append((item, fn)) + + self.classes = dict(zip(self.cat, range(len(self.cat)))) + # Mapping from category ('Chair') to a list of int [10,11,12,13] as segmentation labels + self.seg_classes = {'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], 'Car': [8, 9, 10, 11], 'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], 'Guitar': [19, 20, 21], 'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40], 'Chair': [12, 13, 14, 15], 'Knife': [22, 23]} + + self.cache = {} + # self.cache_size = self.__len__() + preload_file = f"{self.root}/{split}_{self.normalize}_preload.pkl" + if os.path.exists(preload_file): + print(f"Preloading all data from {preload_file}") + with open(preload_file, 'rb') as file: + self.cache = pickle.load(file) + else: + print("Preloading data by reading individual files.") + self.preload() + with open(preload_file, 'wb') as file: + print(f"Saving pre-loaded data at {preload_file}") + pickle.dump(self.cache, file) + + + def __getitem__(self, index): + point_set, normal, seg, cls = self.cache[index] + if self.all_points: + pass + else: + choice = np.random.choice(len(seg), self.num_points, replace=True) + #resample + point_set = point_set[choice, :] + seg = seg[choice] + normal = normal[choice, :] + if self.transforms is not None: + point_set = self.transforms(point_set) + + return point_set, torch.from_numpy(normal), torch.from_numpy(seg), torch.from_numpy(cls) + + def __len__(self): + return len(self.datapath) + + def preload(self): + bar = ProgressBar(max_value=self.__len__()) + for index in range(self.__len__()): + fn = self.datapath[index] + cat = self.datapath[index][0] + cls = self.classes[cat] + cls = np.array([cls]).astype(np.int64) + data = np.loadtxt(fn[1]).astype(np.float32) + point_set = data[:,0:3] + # https://github.com/charlesq34/pointnet2/blob/master/part_seg/part_dataset_all_normal.py#L95 + normal = data[:, 3:6] + if self.normalize: + point_set = pc_normalize(point_set) + seg = data[:,-1].astype(np.int64) + self.cache[index] = (point_set, normal, seg, cls) + bar.update(index) diff --git a/zoo/SimpleView/rs_cnn/data/__init__.py b/zoo/SimpleView/rs_cnn/data/__init__.py new file mode 100644 index 0000000..d4d8370 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/data/__init__.py @@ -0,0 +1,2 @@ +from .ModelNet40Loader import ModelNet40Cls +from .ShapeNetPartLoader import ShapeNetPart \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/data/data_utils.py b/zoo/SimpleView/rs_cnn/data/data_utils.py new file mode 100644 index 0000000..239ab1d --- /dev/null +++ b/zoo/SimpleView/rs_cnn/data/data_utils.py @@ -0,0 +1,139 @@ +import torch +import numpy as np + +class PointcloudToTensor(object): + def __call__(self, points): + return torch.from_numpy(points).float() + +def angle_axis(angle: float, axis: np.ndarray): + r"""Returns a 4x4 rotation matrix that performs a rotation around axis by angle + + Parameters + ---------- + angle : float + Angle to rotate by + axis: np.ndarray + Axis to rotate about + + Returns + ------- + torch.Tensor + 3x3 rotation matrix + """ + u = axis / np.linalg.norm(axis) + cosval, sinval = np.cos(angle), np.sin(angle) + + # yapf: disable + cross_prod_mat = np.array([[0.0, -u[2], u[1]], + [u[2], 0.0, -u[0]], + [-u[1], u[0], 0.0]]) + + R = torch.from_numpy( + cosval * np.eye(3) + + sinval * cross_prod_mat + + (1.0 - cosval) * np.outer(u, u) + ) + # yapf: enable + return R.float() + +class PointcloudRotatebyAngle(object): + def __init__(self, rotation_angle = 0.0): + self.rotation_angle = rotation_angle + + def __call__(self, pc): + normals = pc.size(2) > 3 + bsize = pc.size()[0] + for i in range(bsize): + cosval = np.cos(self.rotation_angle) + sinval = np.sin(self.rotation_angle) + rotation_matrix = np.array([[cosval, 0, sinval], + [0, 1, 0], + [-sinval, 0, cosval]]) + rotation_matrix = torch.from_numpy(rotation_matrix).float().cuda() + + cur_pc = pc[i, :, :] + if not normals: + cur_pc = cur_pc @ rotation_matrix + else: + pc_xyz = cur_pc[:, 0:3] + pc_normals = cur_pc[:, 3:] + cur_pc[:, 0:3] = pc_xyz @ rotation_matrix + cur_pc[:, 3:] = pc_normals @ rotation_matrix + + pc[i, :, :] = cur_pc + + return pc + +class PointcloudJitter(object): + def __init__(self, std=0.01, clip=0.05): + self.std, self.clip = std, clip + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + jittered_data = pc.new(pc.size(1), 3).normal_( + mean=0.0, std=self.std + ).clamp_(-self.clip, self.clip) + pc[i, :, 0:3] += jittered_data + + return pc + +class PointcloudScaleAndTranslate(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2., translate_range=0.2): + self.scale_low = scale_low + self.scale_high = scale_high + self.translate_range = translate_range + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + torch.from_numpy(xyz2).float().cuda() + + return pc + +class PointcloudScale(object): + def __init__(self, scale_low=2. / 3., scale_high=3. / 2.): + self.scale_low = scale_low + self.scale_high = scale_high + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz1 = np.random.uniform(low=self.scale_low, high=self.scale_high, size=[3]) + + pc[i, :, 0:3] = torch.mul(pc[i, :, 0:3], torch.from_numpy(xyz1).float().cuda()) + + return pc + +class PointcloudTranslate(object): + def __init__(self, translate_range=0.2): + self.translate_range = translate_range + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + xyz2 = np.random.uniform(low=-self.translate_range, high=self.translate_range, size=[3]) + + pc[i, :, 0:3] = pc[i, :, 0:3] + torch.from_numpy(xyz2).float().cuda() + + return pc + +class PointcloudRandomInputDropout(object): + def __init__(self, max_dropout_ratio=0.875): + assert max_dropout_ratio >= 0 and max_dropout_ratio < 1 + self.max_dropout_ratio = max_dropout_ratio + + def __call__(self, pc): + bsize = pc.size()[0] + for i in range(bsize): + dropout_ratio = np.random.random() * self.max_dropout_ratio # 0~0.875 + drop_idx = np.where(np.random.random((pc.size()[1])) <= dropout_ratio)[0] + if len(drop_idx) > 0: + cur_pc = pc[i, :, :] + cur_pc[drop_idx.tolist(), 0:3] = cur_pc[0, 0:3].repeat(len(drop_idx), 1) # set to the first point + pc[i, :, :] = cur_pc + + return pc diff --git a/zoo/SimpleView/rs_cnn/docs/_config.yml b/zoo/SimpleView/rs_cnn/docs/_config.yml new file mode 100644 index 0000000..7d09930 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/docs/_config.yml @@ -0,0 +1,4 @@ +theme: jekyll-theme-cayman +title: Relation-Shape CNN (RS-CNN) +description: ' ' +show_downloads: true \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/docs/images/2dconv.jpg b/zoo/SimpleView/rs_cnn/docs/images/2dconv.jpg new file mode 100644 index 0000000..4aeb8d2 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/2dconv.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/cls.jpg b/zoo/SimpleView/rs_cnn/docs/images/cls.jpg new file mode 100644 index 0000000..15592f7 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/cls.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/complexity.jpg b/zoo/SimpleView/rs_cnn/docs/images/complexity.jpg new file mode 100644 index 0000000..c840c5e Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/complexity.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/density.jpg b/zoo/SimpleView/rs_cnn/docs/images/density.jpg new file mode 100644 index 0000000..e6fbdca Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/density.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/motivation.jpg b/zoo/SimpleView/rs_cnn/docs/images/motivation.jpg new file mode 100644 index 0000000..27cf18b Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/motivation.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/normal.jpg b/zoo/SimpleView/rs_cnn/docs/images/normal.jpg new file mode 100644 index 0000000..553e869 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/normal.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/partseg.jpg b/zoo/SimpleView/rs_cnn/docs/images/partseg.jpg new file mode 100644 index 0000000..f18e00b Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/partseg.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/relation.jpg b/zoo/SimpleView/rs_cnn/docs/images/relation.jpg new file mode 100644 index 0000000..a34e4ab Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/relation.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/rotation.jpg b/zoo/SimpleView/rs_cnn/docs/images/rotation.jpg new file mode 100644 index 0000000..2e68409 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/rotation.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/rsconv.jpg b/zoo/SimpleView/rs_cnn/docs/images/rsconv.jpg new file mode 100644 index 0000000..7ae35e8 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/rsconv.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/images/visualization.jpg b/zoo/SimpleView/rs_cnn/docs/images/visualization.jpg new file mode 100644 index 0000000..5815892 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/images/visualization.jpg differ diff --git a/zoo/SimpleView/rs_cnn/docs/index.md b/zoo/SimpleView/rs_cnn/docs/index.md new file mode 100644 index 0000000..1147bd0 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/docs/index.md @@ -0,0 +1,165 @@ +

Relation-Shape Convolutional Neural Network for Point Cloud Analysis

+

+ Yongcheng Liu   + Bin Fan   + Shiming Xiang   + Chunhong Pan +

+

+ CVPR 2019   + Oral & Best paper finalist +

+
+ +
+ partseg.jpg +
+

+ Segmentation examples on ShapeNet part benchmark. Although the part shapes implied in irregular points are extremely diverse and they may be very confusing to recognize, our RS-CNN can also segment them out with decent accuracy. +

+ +

Abstract

+ +Point cloud analysis is very challenging, as the shape implied in irregular points is difficult to capture. In this paper, we propose RS-CNN, namely, Relation-Shape Convolutional Neural Network, which extends regular grid CNN to irregular configuration for point cloud analysis. ___The key to RS-CNN is learning from relation___, _i.e._, the geometric topology constraint among points. Specifically, the convolutional weight for local point set is forced to ___learn a high-level relation expression from predefined geometric priors___, between a sampled point from this point set and the others. In this way, an inductive local representation with ___explicit reasoning about the spatial layout of points___ can be obtained, which leads to much shape awareness and robustness. With this convolution as a basic operator, RS-CNN, a hierarchical architecture can be developed to achieve contextual shape-aware learning for point cloud analysis. Extensive experiments on challenging benchmarks across three tasks verify RS-CNN achieves the state of the arts. + +

Motivation

+ +
+ motivation.jpg +
+

+ Left part: 3D Point cloud. Right part: Underlying shape formed by this point cloud. +

+ +- The geometric relation among points is an explicit expression about the spatial layout of points, further discriminatively reflecting the underlying shape. + +- CNN has demonstrated its powerful visual abstraction capability for 2D images that are in the format of a regular grid. + +- Can we extend 2D grid CNN to 3D irregular configuration for point cloud analysis, by learning expressive geometric relation encoding for discriminative shape awareness? + +

RS-Conv: Relation-Shape Convolution

+ +[rsconv]: ./images/rsconv.jpg +![rsconv] +

+ Overview of our relation-shape convolution (RS-Conv). +

+ +In this paper, we develop a hierarchical CNN-like architecture, _i.e._ RS-CNN. RS-CNN is equipped with a novel learn-from-relation convolution operator called relation-shape convolution (RS-Conv). As illustrated in the figure, the key to RS-CNN is learning from relation. + +To be specific: + +- The convolutional weight {\bm{\mathrm w}}_j for x_{j} is converted to {\bm{\mathrm w}}_{ij}, which learns a high-level mapping \mathcal{M}, _i.e._, {\bm{\mathrm w}}_{ij}=\mathcal{M}({\bm{\mathrm h}}_{ij}), on predefined geometric relation vector {\bm{\mathrm h}}_{ij}. + +- In this way, the inductive convolutional representation \sigma \big( \mathcal{A}(\{{\bm{\mathrm w}}_{ij} \cdot {\bm{\mathrm f}}_{x_j}, \hspace{0.1pt} \forall x_j\}) \big) can expressively reason the spatial layout of points, resulting in discriminative shape awareness. + +- As in image CNN, further channel-raising mapping is conducted for a more powerful shape-aware representation. + +

Revisiting 2D Grid Convolution

+ +
+ 2dconv.jpg +
+

+ Illustration of 2D grid convolution with a kernel of 3 x 3. +

+ +- The convolutional weight w_{j} for x_{j} always implies a fixed positional relation between x_{i} and its neighbor x_{j} in the regular grid. That is, w_{j} is actually constrained to encode one kind of regular grid relation in the learning process. + +- Therefore, our RS-Conv with relation learning is more general and can be applied to model 2D grid spatial relationship. + +

Experiment

+ +### Shape Classification on ModelNet40 Benchmark + +
+ cls.jpg +
+

+ Shape classification results (%) (nor: normal). +

+ +- Our RS-CNN outperforms the state-of-the-art point cloud-based methods with only \mathrm{xyz} as the input features. + +### Normal Estimation + +
+ normal.jpg +
+

+ Normal estimation examples. For clearness, we only show predictions with angle less than 30 degree in blue, and angle greater than 90 degree in red between the ground truth normals. +

+ +### Geometric Relation Definition + +
+ relation.jpg +
+

+ The results (%) of five intuitive low-level relation. Model A applies only 3D Euclidean distance; Model B adds the coordinates difference to model A; Model C adds the coordinates of two points to model B; Model D utilizes the normals of two points and their cosine distance; Model E projects 3D points onto a 2D plane of XY, XZ and YZ. +

+ +- The low-level relation vector can be defined flexibly. + +- Using only 3D Euclidean distance as relation can result in an accuracy of 92.5%. + +- Even learning from the relation in 2D projections of points, a decent performance of 92.2% can also be achieved. + +### Robustness to sampling density + +
+ density.jpg +
+

+ Left part: Point cloud with random point dropout. Right part: Test results of using sparser points as the input to a model trained with 1024 points. +

+ +### Robustness to point permutation and rigid transformation (%) + +
+ rotation.jpg +
+

+ All the models are trained without related data augmentations, e.g., translation or rotation, to avoid confusion. During testing, we perform random permutation (perm.) of points, add a small translation of 0.2 and rotate the input point cloud by 90 degree and 180 degree. +

+ +

Visualization and Complexity

+ +### Visualization + +
+ visualization.jpg +
+

+ Visualization of the shape features learned by the first two layers of RS-CNN. +

+ +- The features learned by the first layer mostly respond to edges, corners and arcs, while the ones in the second layer capture more semantical shape parts like airfoils and heads. + +- As image CNN, our RS-CNN learns 3D shape semantics from point cloud in a local-to-global manner. + +### Complexity + +
+ complexity.jpg +
+

+ Complexity of RS-CNN in point cloud classification. +

+ +

Publication

+ +Yongcheng Liu, Bin Fan, Shiming Xiang and Chunhong Pan, "Relation-Shape Convolutional Neural Network for Point Cloud Analysis", in IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2019. [[arXiv](https://arxiv.org/abs/1904.07601)] [[CVF](http://openaccess.thecvf.com/content_CVPR_2019/papers/Liu_Relation-Shape_Convolutional_Neural_Network_for_Point_Cloud_Analysis_CVPR_2019_paper.pdf)] + +``` + @inproceedings{liu2019rscnn, + author = {Yongcheng Liu and + Bin Fan and + Shiming Xiang and + Chunhong Pan}, + title = {Relation-Shape Convolutional Neural Network for Point Cloud Analysis}, + booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + pages = {8895--8904}, + year = {2019} + } +``` diff --git a/zoo/SimpleView/rs_cnn/docs/maths/conv.png b/zoo/SimpleView/rs_cnn/docs/maths/conv.png new file mode 100644 index 0000000..e3cf296 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/conv.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/hij.png b/zoo/SimpleView/rs_cnn/docs/maths/hij.png new file mode 100644 index 0000000..9dceebe Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/hij.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/m.png b/zoo/SimpleView/rs_cnn/docs/maths/m.png new file mode 100644 index 0000000..3562b5d Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/m.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/swj.png b/zoo/SimpleView/rs_cnn/docs/maths/swj.png new file mode 100644 index 0000000..5316ce4 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/swj.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/w_strong.png b/zoo/SimpleView/rs_cnn/docs/maths/w_strong.png new file mode 100644 index 0000000..c45258f Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/w_strong.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/wij.png b/zoo/SimpleView/rs_cnn/docs/maths/wij.png new file mode 100644 index 0000000..6decf28 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/wij.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/wijm.png b/zoo/SimpleView/rs_cnn/docs/maths/wijm.png new file mode 100644 index 0000000..e07f1f4 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/wijm.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/xi.png b/zoo/SimpleView/rs_cnn/docs/maths/xi.png new file mode 100644 index 0000000..355dce7 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/xi.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/xj.png b/zoo/SimpleView/rs_cnn/docs/maths/xj.png new file mode 100644 index 0000000..59c9040 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/xj.png differ diff --git a/zoo/SimpleView/rs_cnn/docs/maths/xyz.png b/zoo/SimpleView/rs_cnn/docs/maths/xyz.png new file mode 100644 index 0000000..4e62a93 Binary files /dev/null and b/zoo/SimpleView/rs_cnn/docs/maths/xyz.png differ diff --git a/zoo/SimpleView/rs_cnn/models/__init__.py b/zoo/SimpleView/rs_cnn/models/__init__.py new file mode 100644 index 0000000..c62b2ec --- /dev/null +++ b/zoo/SimpleView/rs_cnn/models/__init__.py @@ -0,0 +1,2 @@ +from .rscnn_ssn_cls import RSCNN_SSN as RSCNN_SSN_Cls +from .rscnn_msn_seg import RSCNN_MSN as RSCNN_MSN_Seg \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/models/rscnn_msn_seg.py b/zoo/SimpleView/rs_cnn/models/rscnn_msn_seg.py new file mode 100644 index 0000000..6279ddc --- /dev/null +++ b/zoo/SimpleView/rs_cnn/models/rscnn_msn_seg.py @@ -0,0 +1,160 @@ +import os, sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, "../utils")) +import torch +import torch.nn as nn +from torch.autograd import Variable +import pytorch_utils as pt_utils +from pointnet2_modules_updated import PointnetSAModule, PointnetFPModule, PointnetSAModuleMSG +import numpy as np + +class RSCNN_MSN(nn.Module): + r""" + PointNet2 with multi-scale grouping + Semantic segmentation network that uses feature propogation layers + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + input_channels: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=0, relation_prior=1, use_xyz=True): + super().__init__() + + self.SA_modules = nn.ModuleList() + c_in = input_channels + self.SA_modules.append( # 0 + PointnetSAModuleMSG( + npoint=1024, + radii=[0.075, 0.1, 0.125], + nsamples=[16, 32, 48], + mlps=[[c_in, 64], [c_in, 64], [c_in, 64]], + first_layer=True, + use_xyz=use_xyz, + relation_prior=relation_prior + ) + ) + c_out_0 = 64*3 + + c_in = c_out_0 + self.SA_modules.append( # 1 + PointnetSAModuleMSG( + npoint=256, + radii=[0.1, 0.15, 0.2], + nsamples=[16, 48, 64], + mlps=[[c_in, 128], [c_in, 128], [c_in, 128]], + use_xyz=use_xyz, + relation_prior=relation_prior + ) + ) + c_out_1 = 128*3 + + c_in = c_out_1 + self.SA_modules.append( # 2 + PointnetSAModuleMSG( + npoint=64, + radii=[0.2, 0.3, 0.4], + nsamples=[16, 32, 48], + mlps=[[c_in, 256], [c_in, 256], [c_in, 256]], + use_xyz=use_xyz, + relation_prior=relation_prior + ) + ) + c_out_2 = 256*3 + + c_in = c_out_2 + self.SA_modules.append( # 3 + PointnetSAModuleMSG( + npoint=16, + radii=[0.4, 0.6, 0.8], + nsamples=[16, 24, 32], + mlps=[[c_in, 512], [c_in, 512], [c_in, 512]], + use_xyz=use_xyz, + relation_prior=relation_prior + ) + ) + c_out_3 = 512*3 + + self.SA_modules.append( # 4 global pooling + PointnetSAModule( + nsample = 16, + mlp=[c_out_3, 128], use_xyz=use_xyz + ) + ) + global_out = 128 + + self.SA_modules.append( # 5 global pooling + PointnetSAModule( + nsample = 64, + mlp=[c_out_2, 128], use_xyz=use_xyz + ) + ) + global_out2 = 128 + + self.FP_modules = nn.ModuleList() + self.FP_modules.append( + PointnetFPModule(mlp=[256 + input_channels, 128, 128]) + ) + self.FP_modules.append(PointnetFPModule(mlp=[512 + c_out_0, 256, 256])) + self.FP_modules.append(PointnetFPModule(mlp=[512 + c_out_1, 512, 512])) + self.FP_modules.append( + PointnetFPModule(mlp=[c_out_3 + c_out_2, 512, 512]) + ) + + self.FC_layer = nn.Sequential( + pt_utils.Conv1d(128+global_out+global_out2+16, 128, bn=True), nn.Dropout(), + pt_utils.Conv1d(128, num_classes, activation=None) + ) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = ( + pc[..., 3:].transpose(1, 2).contiguous() + if pc.size(-1) > 3 else None + ) + + return xyz, features + + def forward(self, pointcloud: torch.cuda.FloatTensor, cls): + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + + l_xyz, l_features = [xyz], [features] + for i in range(len(self.SA_modules)): + if i < 5: + li_xyz, li_features = self.SA_modules[i](l_xyz[i], l_features[i]) + if li_xyz is not None: + random_index = np.arange(li_xyz.size()[1]) + np.random.shuffle(random_index) + li_xyz = li_xyz[:, random_index, :] + li_features = li_features[:, :, random_index] + l_xyz.append(li_xyz) + l_features.append(li_features) + + _, global_out2_feat = self.SA_modules[5](l_xyz[3], l_features[3]) + + for i in range(-1, -(len(self.FP_modules) + 1), -1): + l_features[i - 1 - 1] = self.FP_modules[i]( + l_xyz[i - 1 - 1], l_xyz[i - 1], l_features[i - 1 - 1], l_features[i - 1] + ) + + cls = cls.view(-1, 16, 1).repeat(1, 1, l_features[0].size()[2]) # object class one-hot-vector + l_features[0] = torch.cat((l_features[0], l_features[-1].repeat(1, 1, l_features[0].size()[2]), global_out2_feat.repeat(1, 1, l_features[0].size()[2]), cls), 1) + return self.FC_layer(l_features[0]).transpose(1, 2).contiguous() diff --git a/zoo/SimpleView/rs_cnn/models/rscnn_ssn_cls.py b/zoo/SimpleView/rs_cnn/models/rscnn_ssn_cls.py new file mode 100644 index 0000000..6fb7d8e --- /dev/null +++ b/zoo/SimpleView/rs_cnn/models/rscnn_ssn_cls.py @@ -0,0 +1,109 @@ +import os, sys +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(BASE_DIR) +sys.path.append(os.path.join(BASE_DIR, "../utils")) +import torch +import torch.nn as nn +from torch.autograd import Variable +import pytorch_utils as pt_utils +from pointnet2_modules_updated import PointnetSAModule, PointnetSAModuleMSG +import numpy as np + +# Relation-Shape CNN: Single-Scale Neighborhood +class RSCNN_SSN(nn.Module): + r""" + PointNet2 with multi-scale grouping + Semantic segmentation network that uses feature propogation layers + + Parameters + ---------- + num_classes: int + Number of semantics classes to predict over -- size of softmax classifier that run for each point + input_channels: int = 6 + Number of input channels in the feature descriptor for each point. If the point cloud is Nx9, this + value should be 6 as in an Nx9 point cloud, 3 of the channels are xyz, and 6 are feature descriptors + use_xyz: bool = True + Whether or not to use the xyz position of a point as a feature + """ + + def __init__(self, num_classes, input_channels=0, relation_prior=1, use_xyz=True): + super().__init__() + + self.SA_modules = nn.ModuleList() + + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=512, + radii=[0.23], + nsamples=[48], + mlps=[[input_channels, 128]], + first_layer=True, + use_xyz=use_xyz, + relation_prior=relation_prior + ) + ) + + self.SA_modules.append( + PointnetSAModuleMSG( + npoint=128, + radii=[0.32], + nsamples=[64], + mlps=[[128, 512]], + use_xyz=use_xyz, + relation_prior=relation_prior + ) + ) + + self.SA_modules.append( + # global convolutional pooling + PointnetSAModule( + nsample = 128, + mlp=[512, 1024], + use_xyz=use_xyz + ) + ) + + self.FC_layer = nn.Sequential( + pt_utils.FC(1024, 512, activation=nn.ReLU(inplace=True), bn=True), + nn.Dropout(p=0.5), + pt_utils.FC(512, 256, activation=nn.ReLU(inplace=True), bn=True), + nn.Dropout(p=0.5), + pt_utils.FC(256, num_classes, activation=None) + ) + + def _break_up_pc(self, pc): + xyz = pc[..., 0:3].contiguous() + features = ( + pc[..., 3:].transpose(1, 2).contiguous() + if pc.size(-1) > 3 else None + ) + return xyz, features + + def forward(self, pointcloud: torch.cuda.FloatTensor): + r""" + Forward pass of the network + + Parameters + ---------- + pointcloud: Variable(torch.cuda.FloatTensor) + (B, N, 3 + input_channels) tensor + Point cloud to run predicts on + Each point in the point-cloud MUST + be formated as (x, y, z, features...) + """ + xyz, features = self._break_up_pc(pointcloud) + for module in self.SA_modules: + xyz, features = module(xyz, features) + return self.FC_layer(features.squeeze(-1)) + + +if __name__ == "__main__": + sim_data = Variable(torch.rand(32, 2048, 6)) + sim_data = sim_data.cuda() + sim_cls = Variable(torch.ones(32, 16)) + sim_cls = sim_cls.cuda() + + seg = RSCNN_SSN(num_classes=50, input_channels=3, use_xyz=True) + seg = seg.cuda() + out = seg(sim_data, sim_cls) + print('seg', out.size()) \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/train_cls.py b/zoo/SimpleView/rs_cnn/train_cls.py new file mode 100644 index 0000000..4485662 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/train_cls.py @@ -0,0 +1,169 @@ +import torch +import torch.optim as optim +import torch.optim.lr_scheduler as lr_sched +import torch.nn as nn +from torch.utils.data import DataLoader +from torch.autograd import Variable +import numpy as np +import os +from torchvision import transforms +from models import RSCNN_SSN_Cls as RSCNN_SSN +from data import ModelNet40Cls +import utils.pytorch_utils as pt_utils +import pointnet2.utils.pointnet2_utils as pointnet2_utils +import data.data_utils as d_utils +import argparse +import random +import yaml +import pdb + +torch.backends.cudnn.enabled = True +torch.backends.cudnn.benchmark = True +torch.backends.cudnn.deterministic = True + +seed = 123 +random.seed(seed) +np.random.seed(seed) +torch.manual_seed(seed) +torch.cuda.manual_seed(seed) +torch.cuda.manual_seed_all(seed) + +parser = argparse.ArgumentParser(description='Relation-Shape CNN Shape Classification Training') +parser.add_argument('--config', default='cfgs/config_ssn_cls.yaml', type=str) + +def main(): + args = parser.parse_args() + with open(args.config) as f: + config = yaml.load(f) + print("\n**************************") + for k, v in config['common'].items(): + setattr(args, k, v) + print('\n[%s]:'%(k), v) + print("\n**************************\n") + + try: + os.makedirs(args.save_path) + except OSError: + pass + + train_transforms = transforms.Compose([ + d_utils.PointcloudToTensor() + ]) + test_transforms = transforms.Compose([ + d_utils.PointcloudToTensor() + ]) + + train_dataset = ModelNet40Cls(num_points = args.num_points, root = args.data_root, transforms=train_transforms) + train_dataloader = DataLoader( + train_dataset, + batch_size=args.batch_size, + shuffle=True, + num_workers=int(args.workers), + pin_memory=True + ) + + test_dataset = ModelNet40Cls(num_points = args.num_points, root = args.data_root, transforms=test_transforms, train=False) + test_dataloader = DataLoader( + test_dataset, + batch_size=args.batch_size, + shuffle=False, + num_workers=int(args.workers), + pin_memory=True + ) + + model = RSCNN_SSN(num_classes = args.num_classes, input_channels = args.input_channels, relation_prior = args.relation_prior, use_xyz = True) + model.cuda() + optimizer = optim.Adam( + model.parameters(), lr=args.base_lr, weight_decay=args.weight_decay) + + lr_lbmd = lambda e: max(args.lr_decay**(e // args.decay_step), args.lr_clip / args.base_lr) + bnm_lmbd = lambda e: max(args.bn_momentum * args.bn_decay**(e // args.decay_step), args.bnm_clip) + lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lbmd) + bnm_scheduler = pt_utils.BNMomentumScheduler(model, bnm_lmbd) + + if args.checkpoint is not '': + model.load_state_dict(torch.load(args.checkpoint)) + print('Load model successfully: %s' % (args.checkpoint)) + + criterion = nn.CrossEntropyLoss() + num_batch = len(train_dataset)/args.batch_size + + # training + train(train_dataloader, test_dataloader, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch) + + +def train(train_dataloader, test_dataloader, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch): + PointcloudScaleAndTranslate = d_utils.PointcloudScaleAndTranslate() # initialize augmentation + global g_acc + g_acc = 0.91 # only save the model whose acc > 0.91 + batch_count = 0 + model.train() + for epoch in range(args.epochs): + for i, data in enumerate(train_dataloader, 0): + if lr_scheduler is not None: + lr_scheduler.step(epoch) + if bnm_scheduler is not None: + bnm_scheduler.step(epoch-1) + points, target = data + points, target = points.cuda(), target.cuda() + points, target = Variable(points), Variable(target) + + # fastest point sampling + fps_idx = pointnet2_utils.furthest_point_sample(points, 1200) # (B, npoint) + fps_idx = fps_idx[:, np.random.choice(1200, args.num_points, False)] + points = pointnet2_utils.gather_operation(points.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() # (B, N, 3) + + # augmentation + points.data = PointcloudScaleAndTranslate(points.data) + + optimizer.zero_grad() + + pred = model(points) + target = target.view(-1) + loss = criterion(pred, target) + loss.backward() + optimizer.step() + if i % args.print_freq_iter == 0: + print('[epoch %3d: %3d/%3d] \t train loss: %0.6f \t lr: %0.5f' %(epoch+1, i, num_batch, loss.data.clone(), lr_scheduler.get_lr()[0])) + batch_count += 1 + + # validation in between an epoch + if args.evaluate and batch_count % int(args.val_freq_epoch * num_batch) == 0: + validate(test_dataloader, model, criterion, args, batch_count) + + +def validate(test_dataloader, model, criterion, args, iter): + global g_acc + model.eval() + losses, preds, labels = [], [], [] + with torch.no_grad(): + for j, data in enumerate(test_dataloader, 0): + points, target = data + points, target = points.cuda(), target.cuda() + # points, target = Variable(points, volatile=True), Variable(target, volatile=True) + + # fastest point sampling + fps_idx = pointnet2_utils.furthest_point_sample(points, args.num_points) # (B, npoint) + # fps_idx = fps_idx[:, np.random.choice(1200, args.num_points, False)] + points = pointnet2_utils.gather_operation(points.transpose(1, 2).contiguous(), fps_idx).transpose(1, 2).contiguous() + + pred = model(points) + target = target.view(-1) + loss = criterion(pred, target) + losses.append(loss.data.cpu()) + _, pred_choice = torch.max(pred.data, -1) + + preds.append(pred_choice) + labels.append(target.data) + + preds = torch.cat(preds, 0) + labels = torch.cat(labels, 0) + acc = (preds == labels).sum().float() / labels.numel() + print('\nval loss: %0.6f \t acc: %0.6f\n' % (np.mean(np.array(losses)), acc)) + if acc > g_acc: + g_acc = acc + torch.save(model.state_dict(), '%s/cls_ssn_iter_%d_acc_%0.6f.pth' % (args.save_path, iter, acc)) + model.train() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/train_cls.sh b/zoo/SimpleView/rs_cnn/train_cls.sh new file mode 100644 index 0000000..0302bee --- /dev/null +++ b/zoo/SimpleView/rs_cnn/train_cls.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh +mkdir -p log +now=$(date +"%Y%m%d_%H%M%S") +log_name="Cls_LOG_"$now"" +export CUDA_VISIBLE_DEVICES=0 +python -u train_cls.py \ +--config cfgs/config_ssn_cls.yaml \ +2>&1|tee log/$log_name.log & diff --git a/zoo/SimpleView/rs_cnn/train_partseg.py b/zoo/SimpleView/rs_cnn/train_partseg.py new file mode 100644 index 0000000..67ad9bd --- /dev/null +++ b/zoo/SimpleView/rs_cnn/train_partseg.py @@ -0,0 +1,208 @@ +import torch +import torch.optim as optim +import torch.optim.lr_scheduler as lr_sched +import torch.nn as nn +from torch.utils.data import DataLoader +from torch.autograd import Variable +import numpy as np +import os +from torchvision import transforms +from models import RSCNN_MSN_Seg as RSCNN_MSN +from data import ShapeNetPart +import utils.pytorch_utils as pt_utils +import data.data_utils as d_utils +import argparse +import random +import yaml +import pdb + +torch.backends.cudnn.enabled = True +torch.backends.cudnn.benchmark = True +torch.backends.cudnn.deterministic = True + +seed = 123 +random.seed(seed) +np.random.seed(seed) +torch.manual_seed(seed) +torch.cuda.manual_seed(seed) +torch.cuda.manual_seed_all(seed) + +parser = argparse.ArgumentParser(description='Relation-Shape CNN Shape Part Segmentation Training') +parser.add_argument('--config', default='cfgs/config_msn_partseg.yaml', type=str) + +def main(): + args = parser.parse_args() + with open(args.config) as f: + config = yaml.load(f) + print("\n**************************") + for k, v in config['common'].items(): + setattr(args, k, v) + print('\n[%s]:'%(k), v) + print("\n**************************\n") + + try: + os.makedirs(args.save_path) + except OSError: + pass + + train_transforms = transforms.Compose([ + d_utils.PointcloudToTensor() + ]) + test_transforms = transforms.Compose([ + d_utils.PointcloudToTensor() + ]) + + train_dataset = ShapeNetPart(root = args.data_root, num_points = args.num_points, split = 'trainval', normalize = True, transforms = train_transforms) + train_dataloader = DataLoader( + train_dataset, + batch_size=args.batch_size, + shuffle=True, + num_workers=int(args.workers), + pin_memory=True + ) + + global test_dataset + test_dataset = ShapeNetPart(root = args.data_root, num_points = args.num_points, split = 'test', normalize = True, transforms = test_transforms) + test_dataloader = DataLoader( + test_dataset, + batch_size=args.batch_size, + shuffle=False, + num_workers=int(args.workers), + pin_memory=True + ) + + model = RSCNN_MSN(num_classes = args.num_classes, input_channels = args.input_channels, relation_prior = args.relation_prior, use_xyz = True) + model.cuda() + optimizer = optim.Adam( + model.parameters(), lr=args.base_lr, weight_decay=args.weight_decay) + + lr_lbmd = lambda e: max(args.lr_decay**(e // args.decay_step), args.lr_clip / args.base_lr) + bnm_lmbd = lambda e: max(args.bn_momentum * args.bn_decay**(e // args.decay_step), args.bnm_clip) + lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lbmd) + bnm_scheduler = pt_utils.BNMomentumScheduler(model, bnm_lmbd) + + if args.checkpoint is not '': + model.load_state_dict(torch.load(args.checkpoint)) + print('Load model successfully: %s' % (args.checkpoint)) + + criterion = nn.CrossEntropyLoss() + num_batch = len(train_dataset)/args.batch_size + + # training + train(train_dataloader, test_dataloader, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch) + + +def train(train_dataloader, test_dataloader, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch): + PointcloudScaleAndTranslate = d_utils.PointcloudScaleAndTranslate() # initialize augmentation + global Class_mIoU, Inst_mIoU + Class_mIoU, Inst_mIoU = 0.83, 0.85 + batch_count = 0 + model.train() + for epoch in range(args.epochs): + for i, data in enumerate(train_dataloader, 0): + if lr_scheduler is not None: + lr_scheduler.step(epoch) + if bnm_scheduler is not None: + bnm_scheduler.step(epoch-1) + points, target, cls = data + points, target = points.cuda(), target.cuda() + points, target = Variable(points), Variable(target) + # augmentation + points.data = PointcloudScaleAndTranslate(points.data) + + optimizer.zero_grad() + + batch_one_hot_cls = np.zeros((len(cls), 16)) # 16 object classes + for b in range(len(cls)): + batch_one_hot_cls[b, int(cls[b])] = 1 + batch_one_hot_cls = torch.from_numpy(batch_one_hot_cls) + batch_one_hot_cls = Variable(batch_one_hot_cls.float().cuda()) + + pred = model(points, batch_one_hot_cls) + pred = pred.view(-1, args.num_classes) + target = target.view(-1,1)[:,0] + + loss = criterion(pred, target) + loss.backward() + optimizer.step() + + if i % args.print_freq_iter == 0: + print('[epoch %3d: %3d/%3d] \t train loss: %0.6f \t lr: %0.5f' %(epoch+1, i, num_batch, loss.data.clone(), lr_scheduler.get_lr()[0])) + batch_count += 1 + + # validation in between an epoch + if (epoch < 3 or epoch > 40) and args.evaluate and batch_count % int(args.val_freq_epoch * num_batch) == 0: + validate(test_dataloader, model, criterion, args, batch_count) + + +def validate(test_dataloader, model, criterion, args, iter): + global Class_mIoU, Inst_mIoU, test_dataset + model.eval() + with torch.no_grad(): + seg_classes = test_dataset.seg_classes + shape_ious = {cat:[] for cat in seg_classes.keys()} + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + losses = [] + for _, data in enumerate(test_dataloader, 0): + points, target, cls = data + # points, target = Variable(points, volatile=True), Variable(target, volatile=True) + points, target = points.cuda(), target.cuda() + + batch_one_hot_cls = np.zeros((len(cls), 16)) # 16 object classes + for b in range(len(cls)): + batch_one_hot_cls[b, int(cls[b])] = 1 + batch_one_hot_cls = torch.from_numpy(batch_one_hot_cls) + batch_one_hot_cls = Variable(batch_one_hot_cls.float().cuda()) + + pred = model(points, batch_one_hot_cls) + loss = criterion(pred.view(-1, args.num_classes), target.view(-1,1)[:,0]) + losses.append(loss.data.cpu()) + pred = pred.data.cpu() + target = target.data.cpu() + pred_val = torch.zeros(len(cls), args.num_points).type(torch.LongTensor) + # pred to the groundtruth classes (selected by seg_classes[cat]) + for b in range(len(cls)): + cat = seg_label_to_cat[target[b, 0].item()] + logits = pred[b, :, :] # (num_points, num_classes) + pred_val[b, :] = logits[:, seg_classes[cat]].max(1)[1] + seg_classes[cat][0] + + for b in range(len(cls)): + segp = pred_val[b, :] + segl = target[b, :] + cat = seg_label_to_cat[segl[0].item()] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if torch.sum((segl == l) | (segp == l)) == 0: + # part is not present in this shape + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = torch.sum((segl == l) & (segp == l)) / float(torch.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + + instance_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + instance_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_class_ious = np.mean(list(shape_ious.values())) + + for cat in sorted(shape_ious.keys()): + print('****** %s: %0.6f'%(cat, shape_ious[cat])) + print('************ Test Loss: %0.6f' % (np.mean(np.array(losses)))) + print('************ Class_mIoU: %0.6f' % (mean_class_ious)) + print('************ Instance_mIoU: %0.6f' % (np.mean(instance_ious))) + + if mean_class_ious > Class_mIoU or np.mean(instance_ious) > Inst_mIoU: + if mean_class_ious > Class_mIoU: + Class_mIoU = mean_class_ious + if np.mean(instance_ious) > Inst_mIoU: + Inst_mIoU = np.mean(instance_ious) + torch.save(model.state_dict(), '%s/seg_msn_iter_%d_ins_%0.6f_cls_%0.6f.pth' % (args.save_path, iter, np.mean(instance_ious), mean_class_ious)) + model.train() + +if __name__ == "__main__": + main() diff --git a/zoo/SimpleView/rs_cnn/train_partseg.sh b/zoo/SimpleView/rs_cnn/train_partseg.sh new file mode 100644 index 0000000..06c68f5 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/train_partseg.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh +mkdir -p log +now=$(date +"%Y%m%d_%H%M%S") +log_name="PartSeg_LOG_"$now"" +export CUDA_VISIBLE_DEVICES=0 +python -u train_partseg.py \ +--config cfgs/config_msn_partseg.yaml \ +2>&1|tee log/$log_name.log & diff --git a/zoo/SimpleView/rs_cnn/utils/__init__.py b/zoo/SimpleView/rs_cnn/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/SimpleView/rs_cnn/utils/_ext/__init__.py b/zoo/SimpleView/rs_cnn/utils/_ext/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/zoo/SimpleView/rs_cnn/utils/_ext/pointnet2/__init__.py b/zoo/SimpleView/rs_cnn/utils/_ext/pointnet2/__init__.py new file mode 100644 index 0000000..0d7e7ce --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/_ext/pointnet2/__init__.py @@ -0,0 +1,15 @@ + +from torch.utils.ffi import _wrap_function +from ._pointnet2 import lib as _lib, ffi as _ffi + +__all__ = [] +def _import_symbols(locals): + for symbol in dir(_lib): + fn = getattr(_lib, symbol) + if callable(fn): + locals[symbol] = _wrap_function(fn, _ffi) + else: + locals[symbol] = fn + __all__.append(symbol) + +_import_symbols(locals()) diff --git a/zoo/SimpleView/rs_cnn/utils/build_ffi.py b/zoo/SimpleView/rs_cnn/utils/build_ffi.py new file mode 100644 index 0000000..e893f4f --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/build_ffi.py @@ -0,0 +1,54 @@ +import glob +import torch +import os.path as osp +from torch.utils.ffi import create_extension +import sys, argparse, shutil + +base_dir = osp.dirname(osp.abspath(__file__)) + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Arguments for building pointnet2 ffi extension" + ) + parser.add_argument("--objs", nargs="*") + clean_arg = parser.add_mutually_exclusive_group() + clean_arg.add_argument("--build", dest='build', action="store_true") + clean_arg.add_argument("--clean", dest='clean', action="store_true") + parser.set_defaults(build=False, clean=False) + + args = parser.parse_args() + assert args.build or args.clean + + return args + + +def build(args): + extra_objects = args.objs + extra_objects += [a for a in glob.glob('/usr/local/cuda/lib64/*.a')] + + ffi = create_extension( + '_ext.pointnet2', + headers=[a for a in glob.glob("cinclude/*_wrapper.h")], + sources=[a for a in glob.glob("csrc/*.c")], + define_macros=[('WITH_CUDA', None)], + relative_to=__file__, + with_cuda=True, + extra_objects=extra_objects, + include_dirs=[osp.join(base_dir, 'cinclude')], + verbose=False, + package=False + ) + ffi.build() + + +def clean(args): + shutil.rmtree(osp.join(base_dir, "_ext")) + + +if __name__ == "__main__": + args = parse_args() + if args.clean: + clean(args) + else: + build(args) diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/ball_query_gpu.h b/zoo/SimpleView/rs_cnn/utils/cinclude/ball_query_gpu.h new file mode 100644 index 0000000..f735e41 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/ball_query_gpu.h @@ -0,0 +1,16 @@ +#ifndef _BALL_QUERY_GPU +#define _BALL_QUERY_GPU + +#ifdef __cplusplus +extern "C" { +#endif + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *xyz, + const float *new_xyz, const int *fps_idx, int *idx, + cudaStream_t stream); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/ball_query_wrapper.h b/zoo/SimpleView/rs_cnn/utils/cinclude/ball_query_wrapper.h new file mode 100644 index 0000000..5d0a266 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/ball_query_wrapper.h @@ -0,0 +1,4 @@ + +int ball_query_wrapper(int b, int n, int m, float radius, int nsample, + THCudaTensor *new_xyz_tensor, THCudaTensor *xyz_tensor, THCudaIntTensor *fps_idx_tensor, + THCudaIntTensor *idx_tensor); diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/cuda_utils.h b/zoo/SimpleView/rs_cnn/utils/cinclude/cuda_utils.h new file mode 100644 index 0000000..bd2f3dc --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/cuda_utils.h @@ -0,0 +1,23 @@ +#ifndef _CUDA_UTILS_H +#define _CUDA_UTILS_H + +#include + +#define TOTAL_THREADS 512 + +inline int opt_n_threads(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + + return max(min(1 << pow_2, TOTAL_THREADS), 1); +} + +inline dim3 opt_block_config(int x, int y) { + const int x_threads = opt_n_threads(x); + const int y_threads = + max(min(opt_n_threads(y), TOTAL_THREADS / x_threads), 1); + dim3 block_config(x_threads, y_threads, 1); + + return block_config; +} + +#endif diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/group_points_gpu.h b/zoo/SimpleView/rs_cnn/utils/cinclude/group_points_gpu.h new file mode 100644 index 0000000..8160d6d --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/group_points_gpu.h @@ -0,0 +1,19 @@ +#ifndef _BALL_QUERY_GPU +#define _BALL_QUERY_GPU + +#ifdef __cplusplus +extern "C" { +#endif + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out, cudaStream_t stream); + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points, + cudaStream_t stream); +#ifdef __cplusplus +} +#endif +#endif diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/group_points_wrapper.h b/zoo/SimpleView/rs_cnn/utils/cinclude/group_points_wrapper.h new file mode 100644 index 0000000..853d04d --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/group_points_wrapper.h @@ -0,0 +1,7 @@ +int group_points_wrapper(int b, int c, int n, int npoints, int nsample, + THCudaTensor *points_tensor, + THCudaIntTensor *idx_tensor, THCudaTensor *out); +int group_points_grad_wrapper(int b, int c, int n, int npoints, int nsample, + THCudaTensor *grad_out_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *grad_points_tensor); diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/interpolate_gpu.h b/zoo/SimpleView/rs_cnn/utils/cinclude/interpolate_gpu.h new file mode 100644 index 0000000..bf55e2d --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/interpolate_gpu.h @@ -0,0 +1,27 @@ +#ifndef _INTERPOLATE_GPU_H +#define _INTERPOLATE_GPU_H + +#ifdef __cplusplus +extern "C" { +#endif + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx, + cudaStream_t stream); + +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out, + cudaStream_t stream); + +void three_interpolate_grad_kernel_wrapper(int b, int c, int n, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points, + cudaStream_t stream); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/interpolate_wrapper.h b/zoo/SimpleView/rs_cnn/utils/cinclude/interpolate_wrapper.h new file mode 100644 index 0000000..e3ea2ba --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/interpolate_wrapper.h @@ -0,0 +1,16 @@ + + +void three_nn_wrapper(int b, int n, int m, THCudaTensor *unknown_tensor, + THCudaTensor *known_tensor, THCudaTensor *dist2_tensor, + THCudaIntTensor *idx_tensor); +void three_interpolate_wrapper(int b, int c, int m, int n, + THCudaTensor *points_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *weight_tensor, + THCudaTensor *out_tensor); + +void three_interpolate_grad_wrapper(int b, int c, int n, int m, + THCudaTensor *grad_out_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *weight_tensor, + THCudaTensor *grad_points_tensor); diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/sampling_gpu.h b/zoo/SimpleView/rs_cnn/utils/cinclude/sampling_gpu.h new file mode 100644 index 0000000..17c824c --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/sampling_gpu.h @@ -0,0 +1,23 @@ +#ifndef _SAMPLING_GPU_H +#define _SAMPLING_GPU_H + +#ifdef __cplusplus +extern "C" { +#endif + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out, cudaStream_t stream); + +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points, cudaStream_t stream); + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs, cudaStream_t stream); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/zoo/SimpleView/rs_cnn/utils/cinclude/sampling_wrapper.h b/zoo/SimpleView/rs_cnn/utils/cinclude/sampling_wrapper.h new file mode 100644 index 0000000..bafe5d7 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/cinclude/sampling_wrapper.h @@ -0,0 +1,14 @@ + +int gather_points_wrapper(int b, int c, int n, int npoints, + THCudaTensor *points_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *out_tensor); +int gather_points_grad_wrapper(int b, int c, int n, int npoints, + THCudaTensor *grad_out_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *grad_points_tensor); + +int furthest_point_sampling_wrapper(int b, int n, int m, + THCudaTensor *points_tensor, + THCudaTensor *temp_tensor, + THCudaIntTensor *idx_tensor); diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/ball_query.c b/zoo/SimpleView/rs_cnn/utils/csrc/ball_query.c new file mode 100644 index 0000000..39e549e --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/ball_query.c @@ -0,0 +1,21 @@ +#include + +#include "ball_query_gpu.h" + +extern THCState *state; + +int ball_query_wrapper(int b, int n, int m, float radius, int nsample, + THCudaTensor *new_xyz_tensor, THCudaTensor *xyz_tensor, THCudaIntTensor *fps_idx_tensor, + THCudaIntTensor *idx_tensor) { + + const float *new_xyz = THCudaTensor_data(state, new_xyz_tensor); + const float *xyz = THCudaTensor_data(state, xyz_tensor); + const int *fps_idx = THCudaIntTensor_data(state, fps_idx_tensor); + int *idx = THCudaIntTensor_data(state, idx_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + + query_ball_point_kernel_wrapper(b, n, m, radius, nsample, new_xyz, xyz, fps_idx, idx, + stream); + return 1; +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/ball_query_gpu.cu b/zoo/SimpleView/rs_cnn/utils/csrc/ball_query_gpu.cu new file mode 100644 index 0000000..e7ec51c --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/ball_query_gpu.cu @@ -0,0 +1,61 @@ +#include +#include +#include + +#include "ball_query_gpu.h" +#include "cuda_utils.h" + +// input: new_xyz(b, m, 3) xyz(b, n, 3) +// output: idx(b, m, nsample) +__global__ void query_ball_point_kernel(int b, int n, int m, float radius, + int nsample, + const float *__restrict__ new_xyz, + const float *__restrict__ xyz, + const int *__restrict__ fps_idx, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + xyz += batch_index * n * 3; + new_xyz += batch_index * m * 3; + fps_idx += batch_index * m; + idx += m * nsample * batch_index; + + int index = threadIdx.x; + int stride = blockDim.x; + + float radius2 = radius * radius; + for (int j = index; j < m; j += stride) { + float new_x = new_xyz[j * 3 + 0]; + float new_y = new_xyz[j * 3 + 1]; + float new_z = new_xyz[j * 3 + 2]; + for (int l = 0; l < nsample; ++l) { + idx[j * nsample + l] = fps_idx[j]; + } + for (int k = 0, cnt = 0; k < n && cnt < nsample; ++k) { + float x = xyz[k * 3 + 0]; + float y = xyz[k * 3 + 1]; + float z = xyz[k * 3 + 2]; + float d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 < radius2 && d2 > 0) { + idx[j * nsample + cnt] = k; + ++cnt; + } + } + } +} + +void query_ball_point_kernel_wrapper(int b, int n, int m, float radius, + int nsample, const float *new_xyz, + const float *xyz, const int *fps_idx, int *idx, + cudaStream_t stream) { + + cudaError_t err; + query_ball_point_kernel<<>>( + b, n, m, radius, nsample, new_xyz, xyz, fps_idx, idx); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/group_points.c b/zoo/SimpleView/rs_cnn/utils/csrc/group_points.c new file mode 100644 index 0000000..f847bd8 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/group_points.c @@ -0,0 +1,37 @@ +#include + +#include "group_points_gpu.h" + +extern THCState *state; + +int group_points_wrapper(int b, int c, int n, int npoints, int nsample, + THCudaTensor *points_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *out_tensor) { + + const float *points = THCudaTensor_data(state, points_tensor); + const int *idx = THCudaIntTensor_data(state, idx_tensor); + float *out = THCudaTensor_data(state, out_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + + group_points_kernel_wrapper(b, c, n, npoints, nsample, points, idx, out, + stream); + return 1; +} + +int group_points_grad_wrapper(int b, int c, int n, int npoints, int nsample, + THCudaTensor *grad_out_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *grad_points_tensor) { + + float *grad_points = THCudaTensor_data(state, grad_points_tensor); + const int *idx = THCudaIntTensor_data(state, idx_tensor); + const float *grad_out = THCudaTensor_data(state, grad_out_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + + group_points_grad_kernel_wrapper(b, c, n, npoints, nsample, grad_out, idx, + grad_points, stream); + return 1; +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/group_points_gpu.cu b/zoo/SimpleView/rs_cnn/utils/csrc/group_points_gpu.cu new file mode 100644 index 0000000..5aabe5b --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/group_points_gpu.cu @@ -0,0 +1,84 @@ +#include +#include + +#include "cuda_utils.h" +#include "group_points_gpu.h" + +// input: points(b, c, n) idx(b, npoints, nsample) +// output: out(b, c, npoints, nsample) +__global__ void group_points_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * n * c; + idx += batch_index * npoints * nsample; + out += batch_index * npoints * nsample * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + out[(l * npoints + j) * nsample + k] = points[l * n + ii]; + } + } +} + +void group_points_kernel_wrapper(int b, int c, int n, int npoints, int nsample, + const float *points, const int *idx, + float *out, cudaStream_t stream) { + + cudaError_t err; + group_points_kernel<<>>( + b, c, n, npoints, nsample, points, idx, out); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} + +// input: grad_out(b, c, npoints, nsample), idx(b, npoints, nsample) +// output: grad_points(b, c, n) +__global__ void group_points_grad_kernel(int b, int c, int n, int npoints, + int nsample, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * npoints * nsample * c; + idx += batch_index * npoints * nsample; + grad_points += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * npoints; i += stride) { + const int l = i / npoints; + const int j = i % npoints; + for (int k = 0; k < nsample; ++k) { + int ii = idx[j * nsample + k]; + atomicAdd(grad_points + l * n + ii, + grad_out[(l * npoints + j) * nsample + k]); + } + } +} + +void group_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + int nsample, const float *grad_out, + const int *idx, float *grad_points, + cudaStream_t stream) { + cudaError_t err; + group_points_grad_kernel<<>>( + b, c, n, npoints, nsample, grad_out, idx, grad_points); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/interpolate.c b/zoo/SimpleView/rs_cnn/utils/csrc/interpolate.c new file mode 100644 index 0000000..c6be5b5 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/interpolate.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include + +#include "interpolate_gpu.h" + +extern THCState *state; + +void three_nn_wrapper(int b, int n, int m, THCudaTensor *unknown_tensor, + THCudaTensor *known_tensor, THCudaTensor *dist2_tensor, + THCudaIntTensor *idx_tensor) { + const float *unknown = THCudaTensor_data(state, unknown_tensor); + const float *known = THCudaTensor_data(state, known_tensor); + float *dist2 = THCudaTensor_data(state, dist2_tensor); + int *idx = THCudaIntTensor_data(state, idx_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + three_nn_kernel_wrapper(b, n, m, unknown, known, dist2, idx, stream); +} + +void three_interpolate_wrapper(int b, int c, int m, int n, + THCudaTensor *points_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *weight_tensor, + THCudaTensor *out_tensor) { + + const float *points = THCudaTensor_data(state, points_tensor); + const float *weight = THCudaTensor_data(state, weight_tensor); + float *out = THCudaTensor_data(state, out_tensor); + const int *idx = THCudaIntTensor_data(state, idx_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + three_interpolate_kernel_wrapper(b, c, m, n, points, idx, weight, out, + stream); +} + +void three_interpolate_grad_wrapper(int b, int c, int n, int m, + THCudaTensor *grad_out_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *weight_tensor, + THCudaTensor *grad_points_tensor) { + + const float *grad_out = THCudaTensor_data(state, grad_out_tensor); + const float *weight = THCudaTensor_data(state, weight_tensor); + float *grad_points = THCudaTensor_data(state, grad_points_tensor); + const int *idx = THCudaIntTensor_data(state, idx_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + three_interpolate_grad_kernel_wrapper(b, c, n, m, grad_out, idx, weight, + grad_points, stream); +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/interpolate_gpu.cu b/zoo/SimpleView/rs_cnn/utils/csrc/interpolate_gpu.cu new file mode 100644 index 0000000..e4f78d9 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/interpolate_gpu.cu @@ -0,0 +1,180 @@ +#include +#include +#include + +#include "cuda_utils.h" +#include "interpolate_gpu.h" + +// input: unknown(b, n, 3) known(b, m, 3) +// output: dist2(b, n, 3), idx(b, n, 3) +__global__ void three_nn_kernel(int b, int n, int m, + const float *__restrict__ unknown, + const float *__restrict__ known, + float *__restrict__ dist2, + int *__restrict__ idx) { + int batch_index = blockIdx.x; + unknown += batch_index * n * 3; + known += batch_index * m * 3; + dist2 += batch_index * n * 3; + idx += batch_index * n * 3; + + int index = threadIdx.x; + int stride = blockDim.x; + for (int j = index; j < n; j += stride) { + float ux = unknown[j * 3 + 0]; + float uy = unknown[j * 3 + 1]; + float uz = unknown[j * 3 + 2]; + + double best1 = 1e40, best2 = 1e40, best3 = 1e40; + int besti1 = 0, besti2 = 0, besti3 = 0; + for (int k = 0; k < m; ++k) { + float x = known[k * 3 + 0]; + float y = known[k * 3 + 1]; + float z = known[k * 3 + 2]; + float d = + (ux - x) * (ux - x) + (uy - y) * (uy - y) + (uz - z) * (uz - z); + if (d < best1) { + best3 = best2; + besti3 = besti2; + best2 = best1; + besti2 = besti1; + best1 = d; + besti1 = k; + } else if (d < best2) { + best3 = best2; + besti3 = besti2; + best2 = d; + besti2 = k; + } else if (d < best3) { + best3 = d; + besti3 = k; + } + } + dist2[j * 3 + 0] = best1; + dist2[j * 3 + 1] = best2; + dist2[j * 3 + 2] = best3; + + idx[j * 3 + 0] = besti1; + idx[j * 3 + 1] = besti2; + idx[j * 3 + 2] = besti3; + } +} + +void three_nn_kernel_wrapper(int b, int n, int m, const float *unknown, + const float *known, float *dist2, int *idx, + cudaStream_t stream) { + + cudaError_t err; + three_nn_kernel<<>>(b, n, m, unknown, known, + dist2, idx); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel " + "failed : %s\n", + cudaGetErrorString(err)); + exit(-1); + } +} + +// input: points(b, c, m), idx(b, n, 3), weight(b, n, 3) +// output: out(b, c, n) +__global__ void three_interpolate_kernel(int b, int c, int m, int n, + const float *__restrict__ points, + const int *__restrict__ idx, + const float *__restrict__ weight, + float *__restrict__ out) { + int batch_index = blockIdx.x; + points += batch_index * m * c; + + idx += batch_index * n * 3; + weight += batch_index * n * 3; + + out += batch_index * n * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + out[i] = points[l * m + i1] * w1 + points[l * m + i2] * w2 + + points[l * m + i3] * w3; + } +} + +void three_interpolate_kernel_wrapper(int b, int c, int m, int n, + const float *points, const int *idx, + const float *weight, float *out, + cudaStream_t stream) { + + cudaError_t err; + three_interpolate_kernel<<>>( + b, c, m, n, points, idx, weight, out); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel " + "failed : %s\n", + cudaGetErrorString(err)); + exit(-1); + } +} + +// input: grad_out(b, c, n), idx(b, n, 3), weight(b, n, 3) +// output: grad_points(b, c, m) + +__global__ void three_interpolate_grad_kernel( + int b, int c, int n, int m, const float *__restrict__ grad_out, + const int *__restrict__ idx, const float *__restrict__ weight, + float *__restrict__ grad_points) { + int batch_index = blockIdx.x; + grad_out += batch_index * n * c; + idx += batch_index * n * 3; + weight += batch_index * n * 3; + grad_points += batch_index * m * c; + + const int index = threadIdx.y * blockDim.x + threadIdx.x; + const int stride = blockDim.y * blockDim.x; + for (int i = index; i < c * n; i += stride) { + const int l = i / n; + const int j = i % n; + float w1 = weight[j * 3 + 0]; + float w2 = weight[j * 3 + 1]; + float w3 = weight[j * 3 + 2]; + + int i1 = idx[j * 3 + 0]; + int i2 = idx[j * 3 + 1]; + int i3 = idx[j * 3 + 2]; + + atomicAdd(grad_points + l * m + i1, grad_out[i] * w1); + atomicAdd(grad_points + l * m + i2, grad_out[i] * w2); + atomicAdd(grad_points + l * m + i3, grad_out[i] * w3); + } +} + +void three_interpolate_grad_kernel_wrapper(int b, int n, int c, int m, + const float *grad_out, + const int *idx, const float *weight, + float *grad_points, + cudaStream_t stream) { + + cudaError_t err; + three_interpolate_grad_kernel<<>>( + b, n, c, m, grad_out, idx, weight, grad_points); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel " + "failed : %s\n", + cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/sampling.c b/zoo/SimpleView/rs_cnn/utils/csrc/sampling.c new file mode 100644 index 0000000..852770b --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/sampling.c @@ -0,0 +1,51 @@ +#include + +#include "sampling_gpu.h" + +extern THCState *state; + +int gather_points_wrapper(int b, int c, int n, int npoints, + THCudaTensor *points_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *out_tensor) { + + const float *points = THCudaTensor_data(state, points_tensor); + const int *idx = THCudaIntTensor_data(state, idx_tensor); + float *out = THCudaTensor_data(state, out_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + + gather_points_kernel_wrapper(b, c, n, npoints, points, idx, out, stream); + return 1; +} + +int gather_points_grad_wrapper(int b, int c, int n, int npoints, + THCudaTensor *grad_out_tensor, + THCudaIntTensor *idx_tensor, + THCudaTensor *grad_points_tensor) { + + const float *grad_out = THCudaTensor_data(state, grad_out_tensor); + const int *idx = THCudaIntTensor_data(state, idx_tensor); + float *grad_points = THCudaTensor_data(state, grad_points_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + + gather_points_grad_kernel_wrapper(b, c, n, npoints, grad_out, idx, + grad_points, stream); + return 1; +} + +int furthest_point_sampling_wrapper(int b, int n, int m, + THCudaTensor *points_tensor, + THCudaTensor *temp_tensor, + THCudaIntTensor *idx_tensor) { + + const float *points = THCudaTensor_data(state, points_tensor); + float *temp = THCudaTensor_data(state, temp_tensor); + int *idx = THCudaIntTensor_data(state, idx_tensor); + + cudaStream_t stream = THCState_getCurrentStream(state); + + furthest_point_sampling_kernel_wrapper(b, n, m, points, temp, idx, stream); + return 1; +} diff --git a/zoo/SimpleView/rs_cnn/utils/csrc/sampling_gpu.cu b/zoo/SimpleView/rs_cnn/utils/csrc/sampling_gpu.cu new file mode 100644 index 0000000..c2a5980 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/csrc/sampling_gpu.cu @@ -0,0 +1,250 @@ +#include +#include + +#include "cuda_utils.h" +#include "sampling_gpu.h" + +// input: points(b, c, n) idx(b, m) +// output: out(b, c, m) +__global__ void gather_points_kernel(int b, int c, int n, int m, + const float *__restrict__ points, + const int *__restrict__ idx, + float *__restrict__ out) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + out[(i * c + l) * m + j] = points[(i * c + l) * n + a]; + } + } + } +} + +void gather_points_kernel_wrapper(int b, int c, int n, int npoints, + const float *points, const int *idx, + float *out, cudaStream_t stream) { + + cudaError_t err; + gather_points_kernel<<>>( + b, c, n, npoints, points, idx, out); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} + +// input: grad_out(b, c, m) idx(b, m) +// output: grad_points(b, c, n) +__global__ void gather_points_grad_kernel(int b, int c, int n, int m, + const float *__restrict__ grad_out, + const int *__restrict__ idx, + float *__restrict__ grad_points) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int l = blockIdx.y; l < c; l += gridDim.y) { + for (int j = threadIdx.x; j < m; j += blockDim.x) { + int a = idx[i * m + j]; + atomicAdd(grad_points + (i * c + l) * n + a, + grad_out[(i * c + l) * m + j]); + } + } + } +} + +void gather_points_grad_kernel_wrapper(int b, int c, int n, int npoints, + const float *grad_out, const int *idx, + float *grad_points, + cudaStream_t stream) { + + cudaError_t err; + gather_points_grad_kernel<<>>(b, c, n, npoints, grad_out, idx, + grad_points); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} + +__device__ void __update(float *__restrict__ dists, int *__restrict__ dists_i, + int idx1, int idx2) { + const float v1 = dists[idx1], v2 = dists[idx2]; + const int i1 = dists_i[idx1], i2 = dists_i[idx2]; + dists[idx1] = max(v1, v2); + dists_i[idx1] = v2 > v1 ? i2 : i1; +} + +// Input dataset: (b, n, 3), tmp: (b, n) +// Ouput idxs (b, m) +template +__global__ void furthest_point_sampling_kernel( + int b, int n, int m, const float *__restrict__ dataset, + float *__restrict__ temp, int *__restrict__ idxs) { + if (m <= 0) + return; + __shared__ float dists[block_size]; + __shared__ int dists_i[block_size]; + + int batch_index = blockIdx.x; + dataset += batch_index * n * 3; + temp += batch_index * n; + idxs += batch_index * m; + + int tid = threadIdx.x; + const int stride = block_size; + + int old = 0; + if (threadIdx.x == 0) + idxs[0] = old; + + __syncthreads(); + for (int j = 1; j < m; j++) { + int besti = 0; + float best = -1; + float x1 = dataset[old * 3 + 0]; + float y1 = dataset[old * 3 + 1]; + float z1 = dataset[old * 3 + 2]; + for (int k = tid; k < n; k += stride) { + float x2, y2, z2; + x2 = dataset[k * 3 + 0]; + y2 = dataset[k * 3 + 1]; + z2 = dataset[k * 3 + 2]; + float mag = (x2 * x2) + (y2 * y2) + (z2 * z2); + if (mag <= 1e-3) + continue; + + float d = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + + (z2 - z1) * (z2 - z1); + + float d2 = min(d, temp[k]); + temp[k] = d2; + besti = d2 > best ? k : besti; + best = d2 > best ? d2 : best; + } + dists[tid] = best; + dists_i[tid] = besti; + __syncthreads(); + + if (block_size >= 512) { + if (tid < 256) { + __update(dists, dists_i, tid, tid + 256); + } + __syncthreads(); + } + if (block_size >= 256) { + if (tid < 128) { + __update(dists, dists_i, tid, tid + 128); + } + __syncthreads(); + } + if (block_size >= 128) { + if (tid < 64) { + __update(dists, dists_i, tid, tid + 64); + } + __syncthreads(); + } + if (block_size >= 64) { + if (tid < 32) { + __update(dists, dists_i, tid, tid + 32); + } + __syncthreads(); + } + if (block_size >= 32) { + if (tid < 16) { + __update(dists, dists_i, tid, tid + 16); + } + __syncthreads(); + } + if (block_size >= 16) { + if (tid < 8) { + __update(dists, dists_i, tid, tid + 8); + } + __syncthreads(); + } + if (block_size >= 8) { + if (tid < 4) { + __update(dists, dists_i, tid, tid + 4); + } + __syncthreads(); + } + if (block_size >= 4) { + if (tid < 2) { + __update(dists, dists_i, tid, tid + 2); + } + __syncthreads(); + } + if (block_size >= 2) { + if (tid < 1) { + __update(dists, dists_i, tid, tid + 1); + } + __syncthreads(); + } + + old = dists_i[0]; + if (tid == 0) + idxs[j] = old; + } +} + +void furthest_point_sampling_kernel_wrapper(int b, int n, int m, + const float *dataset, float *temp, + int *idxs, cudaStream_t stream) { + + cudaError_t err; + unsigned int n_threads = opt_n_threads(n); + + switch (n_threads) { + case 512: + furthest_point_sampling_kernel<512><<>>( + b, n, m, dataset, temp, idxs); + break; + case 256: + furthest_point_sampling_kernel<256><<>>( + b, n, m, dataset, temp, idxs); + break; + case 128: + furthest_point_sampling_kernel<128><<>>( + b, n, m, dataset, temp, idxs); + break; + case 64: + furthest_point_sampling_kernel<64><<>>( + b, n, m, dataset, temp, idxs); + break; + case 32: + furthest_point_sampling_kernel<32><<>>( + b, n, m, dataset, temp, idxs); + break; + case 16: + furthest_point_sampling_kernel<16><<>>( + b, n, m, dataset, temp, idxs); + break; + case 8: + furthest_point_sampling_kernel<8><<>>( + b, n, m, dataset, temp, idxs); + break; + case 4: + furthest_point_sampling_kernel<4><<>>( + b, n, m, dataset, temp, idxs); + break; + case 2: + furthest_point_sampling_kernel<2><<>>( + b, n, m, dataset, temp, idxs); + break; + case 1: + furthest_point_sampling_kernel<1><<>>( + b, n, m, dataset, temp, idxs); + break; + default: + furthest_point_sampling_kernel<512><<>>( + b, n, m, dataset, temp, idxs); + } + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/zoo/SimpleView/rs_cnn/utils/linalg_utils.py b/zoo/SimpleView/rs_cnn/utils/linalg_utils.py new file mode 100644 index 0000000..203518f --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/linalg_utils.py @@ -0,0 +1,78 @@ +import torch +from enum import Enum + +PDist2Order = Enum('PDist2Order', 'd_first d_second') + + +def pdist2( + X: torch.Tensor, + Z: torch.Tensor = None, + order: PDist2Order = PDist2Order.d_second +) -> torch.Tensor: + r""" Calculates the pairwise distance between X and Z + + D[b, i, j] = l2 distance X[b, i] and Z[b, j] + + Parameters + --------- + X : torch.Tensor + X is a (B, N, d) tensor. There are B batches, and N vectors of dimension d + Z: torch.Tensor + Z is a (B, M, d) tensor. If Z is None, then Z = X + + Returns + ------- + torch.Tensor + Distance matrix is size (B, N, M) + """ + + if order == PDist2Order.d_second: + if X.dim() == 2: + X = X.unsqueeze(0) + if Z is None: + Z = X + G = X @ Z.transpose(-2, -1) + S = (X * X).sum(-1, keepdim=True) + R = S.transpose(-2, -1) + else: + if Z.dim() == 2: + Z = Z.unsqueeze(0) + G = X @ Z.transpose(-2, -1) + S = (X * X).sum(-1, keepdim=True) + R = (Z * Z).sum(-1, keepdim=True).transpose(-2, -1) + else: + if X.dim() == 2: + X = X.unsqueeze(0) + if Z is None: + Z = X + G = X.transpose(-2, -1) @ Z + R = (X * X).sum(-2, keepdim=True) + S = R.transpose(-2, -1) + else: + if Z.dim() == 2: + Z = Z.unsqueeze(0) + G = X.transpose(-2, -1) @ Z + S = (X * X).sum(-2, keepdim=True).transpose(-2, -1) + R = (Z * Z).sum(-2, keepdim=True) + + return torch.abs(R + S - 2 * G).squeeze(0) + + +def pdist2_slow(X, Z=None): + if Z is None: Z = X + D = torch.zeros(X.size(0), X.size(2), Z.size(2)) + + for b in range(D.size(0)): + for i in range(D.size(1)): + for j in range(D.size(2)): + D[b, i, j] = torch.dist(X[b, :, i], Z[b, :, j]) + return D + + +if __name__ == "__main__": + X = torch.randn(2, 3, 5) + Z = torch.randn(2, 3, 3) + + print(pdist2(X, order=PDist2Order.d_first)) + print(pdist2_slow(X)) + print(torch.dist(pdist2(X, order=PDist2Order.d_first), pdist2_slow(X))) diff --git a/zoo/SimpleView/rs_cnn/utils/pointnet2_modules.py b/zoo/SimpleView/rs_cnn/utils/pointnet2_modules.py new file mode 100644 index 0000000..cd7ab36 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/pointnet2_modules.py @@ -0,0 +1,273 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +import pointnet2_utils +import pytorch_utils as pt_utils +from typing import List +import numpy as np +import time +import math + +class _PointnetSAModuleBase(nn.Module): + + def __init__(self): + super().__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward(self, xyz: torch.Tensor, + features: torch.Tensor = None) -> (torch.Tensor, torch.Tensor): + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor of the xyz coordinates of the points + features : torch.Tensor + (B, N, C) tensor of the descriptors of the the points + + Returns + ------- + new_xyz : torch.Tensor + (B, npoint, 3) tensor of the new points' xyz + new_features : torch.Tensor + (B, npoint, \sum_k(mlps[k][-1])) tensor of the new_points descriptors + """ + + new_features_list = [] + xyz_flipped = xyz.transpose(1, 2).contiguous() + if self.npoint is not None: + fps_idx = pointnet2_utils.furthest_point_sample(xyz, self.npoint) # (B, npoint) + new_xyz = pointnet2_utils.gather_operation(xyz_flipped, fps_idx).transpose(1, 2).contiguous() + fps_idx = fps_idx.data + else: + new_xyz = None + fps_idx = None + + for i in range(len(self.groupers)): + new_features = self.groupers[i](xyz, new_xyz, features, fps_idx) if self.npoint is not None else self.groupers[i](xyz, new_xyz, features) # (B, C, npoint, nsample) + new_features = self.mlps[i]( + new_features + ) # (B, mlp[-1], npoint) + + new_features_list.append(new_features) + + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointnetSAModuleMSG(_PointnetSAModuleBase): + r"""Pointnet set abstrction layer with multiscale grouping + + Parameters + ---------- + npoint : int + Number of points + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet before the global max_pool for each scale + bn : bool + Use batchnorm + """ + + def __init__( + self, + *, + npoint: int, + radii: List[float], + nsamples: List[int], + mlps: List[List[int]], + use_xyz: bool = True, + bias = True, + init = nn.init.kaiming_normal, + first_layer = False, + relation_prior = 1 + ): + super().__init__() + assert len(radii) == len(nsamples) == len(mlps) + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + + # initialize shared mapping functions + C_in = (mlps[0][0] + 3) if use_xyz else mlps[0][0] + C_out = mlps[0][1] + + if relation_prior == 0: + in_channels = 1 + elif relation_prior == 1 or relation_prior == 2: + in_channels = 10 + else: + assert False, "relation_prior can only be 0, 1, 2." + + if first_layer: + mapping_func1 = nn.Conv2d(in_channels = in_channels, out_channels = math.floor(C_out / 2), kernel_size = (1, 1), + stride = (1, 1), bias = bias) + mapping_func2 = nn.Conv2d(in_channels = math.floor(C_out / 2), out_channels = 16, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + xyz_raising = nn.Conv2d(in_channels = C_in, out_channels = 16, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + init(xyz_raising.weight) + if bias: + nn.init.constant(xyz_raising.bias, 0) + elif npoint is not None: + mapping_func1 = nn.Conv2d(in_channels = in_channels, out_channels = math.floor(C_out / 4), kernel_size = (1, 1), + stride = (1, 1), bias = bias) + mapping_func2 = nn.Conv2d(in_channels = math.floor(C_out / 4), out_channels = C_in, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + if npoint is not None: + init(mapping_func1.weight) + init(mapping_func2.weight) + if bias: + nn.init.constant(mapping_func1.bias, 0) + nn.init.constant(mapping_func2.bias, 0) + + # channel raising mapping + cr_mapping = nn.Conv1d(in_channels = C_in if not first_layer else 16, out_channels = C_out, kernel_size = 1, + stride = 1, bias = bias) + init(cr_mapping.weight) + nn.init.constant(cr_mapping.bias, 0) + + if first_layer: + mapping = [mapping_func1, mapping_func2, cr_mapping, xyz_raising] + elif npoint is not None: + mapping = [mapping_func1, mapping_func2, cr_mapping] + + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + pointnet2_utils.QueryAndGroup(radius, nsample, use_xyz=use_xyz) + if npoint is not None else pointnet2_utils.GroupAll(use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + if npoint is not None: + self.mlps.append(pt_utils.SharedRSConv(mlp_spec, mapping = mapping, relation_prior = relation_prior, first_layer = first_layer)) + else: # global convolutional pooling + self.mlps.append(pt_utils.GloAvgConv(C_in = C_in, C_out = C_out)) + + +class PointnetSAModule(PointnetSAModuleMSG): + r"""Pointnet set abstrction layer + + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet before the global max_pool + bn : bool + Use batchnorm + """ + + def __init__( + self, + *, + mlp: List[int], + npoint: int = None, + radius: float = None, + nsample: int = None, + use_xyz: bool = True, + ): + super().__init__( + mlps=[mlp], + npoint=npoint, + radii=[radius], + nsamples=[nsample], + use_xyz=use_xyz + ) + + +class PointnetFPModule(nn.Module): + r"""Propigates the features of one set to another + + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + + def __init__(self, *, mlp: List[int], bn: bool = True): + super().__init__() + self.mlp = pt_utils.SharedMLP(mlp, bn=bn) + + def forward( + self, unknown: torch.Tensor, known: torch.Tensor, + unknow_feats: torch.Tensor, known_feats: torch.Tensor + ) -> torch.Tensor: + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + dist, idx = pointnet2_utils.three_nn(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + + interpolated_feats = pointnet2_utils.three_interpolate( + known_feats, idx, weight + ) + if unknow_feats is not None: + new_features = torch.cat([interpolated_feats, unknow_feats], + dim=1) #(B, C2 + C1, n) + else: + new_features = interpolated_feats + + new_features = new_features.unsqueeze(-1) + new_features = self.mlp(new_features) + + return new_features.squeeze(-1) + + +if __name__ == "__main__": + from torch.autograd import Variable + torch.manual_seed(1) + torch.cuda.manual_seed_all(1) + xyz = Variable(torch.randn(2, 9, 3).cuda(), requires_grad=True) + xyz_feats = Variable(torch.randn(2, 9, 6).cuda(), requires_grad=True) + + test_module = PointnetSAModuleMSG( + npoint=2, radii=[5.0, 10.0], nsamples=[6, 3], mlps=[[9, 3], [9, 6]] + ) + test_module.cuda() + print(test_module(xyz, xyz_feats)) + + # test_module = PointnetFPModule(mlp=[6, 6]) + # test_module.cuda() + # from torch.autograd import gradcheck + # inputs = (xyz, xyz, None, xyz_feats) + # test = gradcheck(test_module, inputs, eps=1e-6, atol=1e-4) + # print(test) + + for _ in range(1): + _, new_features = test_module(xyz, xyz_feats) + new_features.backward( + torch.cuda.FloatTensor(*new_features.size()).fill_(1) + ) + print(new_features) + print(xyz.grad) diff --git a/zoo/SimpleView/rs_cnn/utils/pointnet2_modules_updated.py b/zoo/SimpleView/rs_cnn/utils/pointnet2_modules_updated.py new file mode 100644 index 0000000..c2d8e7b --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/pointnet2_modules_updated.py @@ -0,0 +1,374 @@ +from typing import * +import torch +import torch.nn as nn +import torch.nn.functional as F + +import pointnet2.utils.pointnet2_utils as tp +import pytorch_utils as pt_utils +from typing import List +import numpy as np +import time +import math + +class QueryAndGroup(nn.Module): + r""" + Groups with a ball query of radius + Parameters + --------- + radius : float32 + Radius of ball + nsample : int32 + Maximum number of points to gather in the ball + """ + + def __init__(self, radius: float, nsample: int, use_xyz: bool = True): + super().__init__() + self.radius, self.nsample, self.use_xyz = radius, nsample, use_xyz + + def forward( + self, + xyz: torch.Tensor, + new_xyz: torch.Tensor, + features: torch.Tensor = None, + fps_idx: torch.IntTensor = None + ) -> Tuple[torch.Tensor]: + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + centriods (B, npoint, 3) + features : torch.Tensor + Descriptors of the features (B, C, N) + Returns + ------- + new_features : torch.Tensor + (B, 3 + C, npoint, nsample) tensor + """ + + # idx = tp.ball_query(self.radius, self.nsample, xyz, new_xyz, mode='dense') + idx = tp.ball_query(self.radius, self.nsample, xyz, new_xyz) + xyz_trans = xyz.transpose(1, 2).contiguous() + grouped_xyz = tp.grouping_operation( + xyz_trans, idx + ) # (B, 3, npoint, nsample) + raw_grouped_xyz = grouped_xyz + grouped_xyz -= new_xyz.transpose(1, 2).unsqueeze(-1) + + if features is not None: + grouped_features = tp.grouping_operation(features, idx) + if self.use_xyz: + new_features = torch.cat([raw_grouped_xyz, grouped_xyz, grouped_features], + dim=1) # (B, C + 3 + 3, npoint, nsample) + else: + new_features = grouped_features + else: + assert self.use_xyz, "Cannot have not features and not use xyz as a feature!" + new_features = torch.cat([raw_grouped_xyz, grouped_xyz], dim = 1) + + return new_features + + +class GroupAll(nn.Module): + r""" + Groups all features + Parameters + --------- + """ + + def __init__(self, use_xyz: bool = True): + super().__init__() + self.use_xyz = use_xyz + + def forward( + self, + xyz: torch.Tensor, + new_xyz: torch.Tensor, + features: torch.Tensor = None + ) -> Tuple[torch.Tensor]: + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + Ignored + features : torch.Tensor + Descriptors of the features (B, C, N) + Returns + ------- + new_features : torch.Tensor + (B, C + 3, 1, N) tensor + """ + + grouped_xyz = xyz.transpose(1, 2).unsqueeze(2) + if features is not None: + grouped_features = features.unsqueeze(2) + if self.use_xyz: + new_features = torch.cat([grouped_xyz, grouped_features], + dim=1) # (B, 3 + C, 1, N) + else: + new_features = grouped_features + else: + new_features = grouped_xyz + + return new_features + +class _PointnetSAModuleBase(nn.Module): + + def __init__(self): + super().__init__() + self.npoint = None + self.groupers = None + self.mlps = None + + def forward(self, xyz: torch.Tensor, + features: torch.Tensor = None) -> (torch.Tensor, torch.Tensor): + r""" + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor of the xyz coordinates of the points + features : torch.Tensor + (B, N, C) tensor of the descriptors of the the points + Returns + ------- + new_xyz : torch.Tensor + (B, npoint, 3) tensor of the new points' xyz + new_features : torch.Tensor + (B, npoint, \sum_k(mlps[k][-1])) tensor of the new_points descriptors + """ + + new_features_list = [] + xyz_flipped = xyz.transpose(1, 2).contiguous() + if self.npoint is not None: + fps_idx = tp.furthest_point_sample(xyz, self.npoint) # (B, npoint) + new_xyz = tp.gather_operation(xyz_flipped, fps_idx).transpose(1, 2).contiguous() + fps_idx = fps_idx.data + else: + new_xyz = None + fps_idx = None + + for i in range(len(self.groupers)): + new_features = self.groupers[i](xyz, new_xyz, features, fps_idx) if self.npoint is not None else self.groupers[i](xyz, new_xyz, features) # (B, C, npoint, nsample) + new_features = self.mlps[i]( + new_features + ) # (B, mlp[-1], npoint) + + new_features_list.append(new_features) + + return new_xyz, torch.cat(new_features_list, dim=1) + + +class PointnetSAModuleMSG(_PointnetSAModuleBase): + r"""Pointnet set abstrction layer with multiscale grouping + Parameters + ---------- + npoint : int + Number of points + radii : list of float32 + list of radii to group with + nsamples : list of int32 + Number of samples in each ball query + mlps : list of list of int32 + Spec of the pointnet before the global max_pool for each scale + bn : bool + Use batchnorm + """ + + def __init__( + self, + *, + npoint: int, + radii: List[float], + nsamples: List[int], + mlps: List[List[int]], + use_xyz: bool = True, + bias = True, + init = nn.init.kaiming_normal_, + first_layer = False, + relation_prior = 1 + ): + super().__init__() + assert len(radii) == len(nsamples) == len(mlps) + self.npoint = npoint + self.groupers = nn.ModuleList() + self.mlps = nn.ModuleList() + + # initialize shared mapping functions + C_in = (mlps[0][0] + 3) if use_xyz else mlps[0][0] + C_out = mlps[0][1] + + if relation_prior == 0: + in_channels = 1 + elif relation_prior == 1 or relation_prior == 2: + in_channels = 10 + else: + assert False, "relation_prior can only be 0, 1, 2." + + if first_layer: + mapping_func1 = nn.Conv2d(in_channels = in_channels, out_channels = math.floor(C_out / 2), kernel_size = (1, 1), + stride = (1, 1), bias = bias) + mapping_func2 = nn.Conv2d(in_channels = math.floor(C_out / 2), out_channels = 16, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + xyz_raising = nn.Conv2d(in_channels = C_in, out_channels = 16, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + init(xyz_raising.weight) + if bias: + nn.init.constant_(xyz_raising.bias, 0) + elif npoint is not None: + mapping_func1 = nn.Conv2d(in_channels = in_channels, out_channels = math.floor(C_out / 4), kernel_size = (1, 1), + stride = (1, 1), bias = bias) + mapping_func2 = nn.Conv2d(in_channels = math.floor(C_out / 4), out_channels = C_in, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + if npoint is not None: + init(mapping_func1.weight) + init(mapping_func2.weight) + if bias: + nn.init.constant_(mapping_func1.bias, 0) + nn.init.constant_(mapping_func2.bias, 0) + + # channel raising mapping + cr_mapping = nn.Conv1d(in_channels = C_in if not first_layer else 16, out_channels = C_out, kernel_size = 1, + stride = 1, bias = bias) + init(cr_mapping.weight) + nn.init.constant_(cr_mapping.bias, 0) + + if first_layer: + mapping = [mapping_func1, mapping_func2, cr_mapping, xyz_raising] + elif npoint is not None: + mapping = [mapping_func1, mapping_func2, cr_mapping] + + for i in range(len(radii)): + radius = radii[i] + nsample = nsamples[i] + self.groupers.append( + QueryAndGroup(radius, nsample, use_xyz=use_xyz) + if npoint is not None else GroupAll(use_xyz) + ) + mlp_spec = mlps[i] + if use_xyz: + mlp_spec[0] += 3 + if npoint is not None: + self.mlps.append(pt_utils.SharedRSConv(mlp_spec, mapping = mapping, relation_prior = relation_prior, first_layer = first_layer)) + else: # global convolutional pooling + self.mlps.append(pt_utils.GloAvgConv(C_in = C_in, C_out = C_out)) + + +class PointnetSAModule(PointnetSAModuleMSG): + r"""Pointnet set abstrction layer + Parameters + ---------- + npoint : int + Number of features + radius : float + Radius of ball + nsample : int + Number of samples in the ball query + mlp : list + Spec of the pointnet before the global max_pool + bn : bool + Use batchnorm + """ + + def __init__( + self, + *, + mlp: List[int], + npoint: int = None, + radius: float = None, + nsample: int = None, + use_xyz: bool = True, + ): + super().__init__( + mlps=[mlp], + npoint=npoint, + radii=[radius], + nsamples=[nsample], + use_xyz=use_xyz + ) + + +class PointnetFPModule(nn.Module): + r"""Propigates the features of one set to another + Parameters + ---------- + mlp : list + Pointnet module parameters + bn : bool + Use batchnorm + """ + + def __init__(self, *, mlp: List[int], bn: bool = True): + super().__init__() + self.mlp = pt_utils.SharedMLP(mlp, bn=bn) + + def forward( + self, unknown: torch.Tensor, known: torch.Tensor, + unknow_feats: torch.Tensor, known_feats: torch.Tensor + ) -> torch.Tensor: + r""" + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of the xyz positions of the unknown features + known : torch.Tensor + (B, m, 3) tensor of the xyz positions of the known features + unknow_feats : torch.Tensor + (B, C1, n) tensor of the features to be propigated to + known_feats : torch.Tensor + (B, C2, m) tensor of features to be propigated + Returns + ------- + new_features : torch.Tensor + (B, mlp[-1], n) tensor of the features of the unknown features + """ + + dist, idx = tp.three_nn(unknown, known) + dist_recip = 1.0 / (dist + 1e-8) + norm = torch.sum(dist_recip, dim=2, keepdim=True) + weight = dist_recip / norm + + interpolated_feats = tp.three_interpolate( + known_feats, idx, weight + ) + if unknow_feats is not None: + new_features = torch.cat([interpolated_feats, unknow_feats], + dim=1) #(B, C2 + C1, n) + else: + new_features = interpolated_feats + + new_features = new_features.unsqueeze(-1) + new_features = self.mlp(new_features) + + return new_features.squeeze(-1) + + +if __name__ == "__main__": + from torch.autograd import Variable + torch.manual_seed(1) + torch.cuda.manual_seed_all(1) + xyz = Variable(torch.randn(2, 9, 3).cuda(), requires_grad=True) + xyz_feats = Variable(torch.randn(2, 9, 6).cuda(), requires_grad=True) + + test_module = PointnetSAModuleMSG( + npoint=2, radii=[5.0, 10.0], nsamples=[6, 3], mlps=[[9, 3], [9, 6]] + ) + test_module.cuda() + print(test_module(xyz, xyz_feats)) + + # test_module = PointnetFPModule(mlp=[6, 6]) + # test_module.cuda() + # from torch.autograd import gradcheck + # inputs = (xyz, xyz, None, xyz_feats) + # test = gradcheck(test_module, inputs, eps=1e-6, atol=1e-4) + # print(test) + + for _ in range(1): + _, new_features = test_module(xyz, xyz_feats) + new_features.backward( + torch.cuda.FloatTensor(*new_features.size()).fill_(1) + ) + print(new_features) + print(xyz.grad) \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/utils/pointnet2_utils.py b/zoo/SimpleView/rs_cnn/utils/pointnet2_utils.py new file mode 100644 index 0000000..7d36254 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/pointnet2_utils.py @@ -0,0 +1,450 @@ +import torch +from torch.autograd import Variable +from torch.autograd import Function +import torch.nn.functional as F +import torch.nn as nn +from linalg_utils import pdist2, PDist2Order +from collections import namedtuple +import pytorch_utils as pt_utils +from typing import List, Tuple + +from _ext import pointnet2 + + +class RandomDropout(nn.Module): + + def __init__(self, p=0.5, inplace=False): + super().__init__() + self.p = p + self.inplace = inplace + + def forward(self, X): + theta = torch.Tensor(1).uniform_(0, self.p)[0] + return pt_utils.feature_dropout_no_scaling( + X, theta, self.train, self.inplace + ) + + +class FurthestPointSampling(Function): + + @staticmethod + def forward(ctx, xyz: torch.Tensor, npoint: int) -> torch.Tensor: + r""" + Uses iterative furthest point sampling to select a set of npoint features that have the largest + minimum distance + + Parameters + ---------- + xyz : torch.Tensor + (B, N, 3) tensor where N > npoint + npoint : int32 + number of features in the sampled set + + Returns + ------- + torch.Tensor + (B, npoint) tensor containing the set + """ + assert xyz.is_contiguous() + + B, N, _ = xyz.size() + + output = torch.cuda.IntTensor(B, npoint) + temp = torch.cuda.FloatTensor(B, N).fill_(1e10) + pointnet2.furthest_point_sampling_wrapper( + B, N, npoint, xyz, temp, output + ) + return output + + @staticmethod + def backward(xyz, a=None): + return None, None + + +furthest_point_sample = FurthestPointSampling.apply + + +class GatherOperation(Function): + + @staticmethod + def forward(ctx, features: torch.Tensor, idx: torch.Tensor) -> torch.Tensor: + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor + + idx : torch.Tensor + (B, npoint) tensor of the features to gather + + Returns + ------- + torch.Tensor + (B, C, npoint) tensor + """ + assert features.is_contiguous() + assert idx.is_contiguous() + + B, npoint = idx.size() + _, C, N = features.size() + + output = torch.cuda.FloatTensor(B, C, npoint) + + pointnet2.gather_points_wrapper( + B, C, N, npoint, features, idx, output + ) + + ctx.for_backwards = (idx, C, N) + + return output + + @staticmethod + def backward(ctx, grad_out): + idx, C, N = ctx.for_backwards + B, npoint = idx.size() + + grad_features = Variable(torch.cuda.FloatTensor(B, C, N).zero_()) + grad_out_data = grad_out.data.contiguous() + pointnet2.gather_points_grad_wrapper( + B, C, N, npoint, grad_out_data, idx, grad_features.data + ) + + return grad_features, None + + +gather_operation = GatherOperation.apply + + +class ThreeNN(Function): + + @staticmethod + def forward(ctx, unknown: torch.Tensor, + known: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + r""" + Find the three nearest neighbors of unknown in known + Parameters + ---------- + unknown : torch.Tensor + (B, n, 3) tensor of known features + known : torch.Tensor + (B, m, 3) tensor of unknown features + + Returns + ------- + dist : torch.Tensor + (B, n, 3) l2 distance to the three nearest neighbors + idx : torch.Tensor + (B, n, 3) index of 3 nearest neighbors + """ + assert unknown.is_contiguous() + assert known.is_contiguous() + + B, N, _ = unknown.size() + m = known.size(1) + dist2 = torch.cuda.FloatTensor(B, N, 3) + idx = torch.cuda.IntTensor(B, N, 3) + + pointnet2.three_nn_wrapper(B, N, m, unknown, known, dist2, idx) + + return torch.sqrt(dist2), idx + + @staticmethod + def backward(ctx, a=None, b=None): + return None, None + + +three_nn = ThreeNN.apply + + +class ThreeInterpolate(Function): + + @staticmethod + def forward( + ctx, features: torch.Tensor, idx: torch.Tensor, weight: torch.Tensor + ) -> torch.Tensor: + r""" + Performs weight linear interpolation on 3 features + Parameters + ---------- + features : torch.Tensor + (B, c, m) Features descriptors to be interpolated from + idx : torch.Tensor + (B, n, 3) three nearest neighbors of the target features in features + weight : torch.Tensor + (B, n, 3) weights + + Returns + ------- + torch.Tensor + (B, c, n) tensor of the interpolated features + """ + assert features.is_contiguous() + assert idx.is_contiguous() + assert weight.is_contiguous() + + B, c, m = features.size() + n = idx.size(1) + + ctx.three_interpolate_for_backward = (idx, weight, m) + + output = torch.cuda.FloatTensor(B, c, n) + + pointnet2.three_interpolate_wrapper( + B, c, m, n, features, idx, weight, output + ) + + return output + + @staticmethod + def backward(ctx, grad_out: torch.Tensor + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + r""" + Parameters + ---------- + grad_out : torch.Tensor + (B, c, n) tensor with gradients of ouputs + + Returns + ------- + grad_features : torch.Tensor + (B, c, m) tensor with gradients of features + + None + + None + """ + idx, weight, m = ctx.three_interpolate_for_backward + B, c, n = grad_out.size() + + grad_features = Variable(torch.cuda.FloatTensor(B, c, m).zero_()) + + grad_out_data = grad_out.data.contiguous() + pointnet2.three_interpolate_grad_wrapper( + B, c, n, m, grad_out_data, idx, weight, grad_features.data + ) + + return grad_features, None, None + + +three_interpolate = ThreeInterpolate.apply + + +class GroupingOperation(Function): + + @staticmethod + def forward(ctx, features: torch.Tensor, idx: torch.Tensor) -> torch.Tensor: + r""" + + Parameters + ---------- + features : torch.Tensor + (B, C, N) tensor of points to group + idx : torch.Tensor + (B, npoint, nsample) tensor containing the indicies of points to group with + + Returns + ------- + torch.Tensor + (B, C, npoint, nsample) tensor + """ + assert features.is_contiguous() + assert idx.is_contiguous() + + B, nfeatures, nsample = idx.size() + _, C, N = features.size() + + output = torch.cuda.FloatTensor(B, C, nfeatures, nsample) + + pointnet2.group_points_wrapper( + B, C, N, nfeatures, nsample, features, idx, output + ) + + ctx.for_backwards = (idx, N) + return output + + @staticmethod + def backward(ctx, + grad_out: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + r""" + + Parameters + ---------- + grad_out : torch.Tensor + (B, C, npoint, nsample) tensor of the gradients of the output from forward + + Returns + ------- + torch.Tensor + (B, C, N) gradient of the features + None + """ + idx, N = ctx.for_backwards + + B, C, npoint, nsample = grad_out.size() + grad_features = Variable(torch.cuda.FloatTensor(B, C, N).zero_()) + + grad_out_data = grad_out.data.contiguous() + pointnet2.group_points_grad_wrapper( + B, C, N, npoint, nsample, grad_out_data, idx, grad_features.data + ) + + return grad_features, None + + +grouping_operation = GroupingOperation.apply + + +class BallQuery(Function): + + @staticmethod + def forward( + ctx, radius: float, nsample: int, xyz: torch.Tensor, + new_xyz: torch.Tensor, fps_idx: torch.IntTensor + ) -> torch.Tensor: + r""" + + Parameters + ---------- + radius : float + radius of the balls + nsample : int + maximum number of features in the balls + xyz : torch.Tensor + (B, N, 3) xyz coordinates of the features + new_xyz : torch.Tensor + (B, npoint, 3) centers of the ball query + + Returns + ------- + torch.Tensor + (B, npoint, nsample) tensor with the indicies of the features that form the query balls + """ + assert new_xyz.is_contiguous() + assert xyz.is_contiguous() + + B, N, _ = xyz.size() + npoint = new_xyz.size(1) + idx = torch.cuda.IntTensor(B, npoint, nsample).zero_() + + pointnet2.ball_query_wrapper( + B, N, npoint, radius, nsample, new_xyz, xyz, fps_idx, idx + ) + + return torch.cat([fps_idx.unsqueeze(2), idx], dim = 2) + + @staticmethod + def backward(ctx, a=None): + return None, None, None, None + + +ball_query = BallQuery.apply + + +class QueryAndGroup(nn.Module): + r""" + Groups with a ball query of radius + + Parameters + --------- + radius : float32 + Radius of ball + nsample : int32 + Maximum number of points to gather in the ball + """ + + def __init__(self, radius: float, nsample: int, use_xyz: bool = True): + super().__init__() + self.radius, self.nsample, self.use_xyz = radius, nsample, use_xyz + + def forward( + self, + xyz: torch.Tensor, + new_xyz: torch.Tensor, + features: torch.Tensor = None, + fps_idx: torch.IntTensor = None + ) -> Tuple[torch.Tensor]: + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + centriods (B, npoint, 3) + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, 3 + C, npoint, nsample) tensor + """ + + idx = ball_query(self.radius, self.nsample, xyz, new_xyz, fps_idx) + xyz_trans = xyz.transpose(1, 2).contiguous() + grouped_xyz = grouping_operation( + xyz_trans, idx + ) # (B, 3, npoint, nsample) + raw_grouped_xyz = grouped_xyz + grouped_xyz -= new_xyz.transpose(1, 2).unsqueeze(-1) + + if features is not None: + grouped_features = grouping_operation(features, idx) + if self.use_xyz: + new_features = torch.cat([raw_grouped_xyz, grouped_xyz, grouped_features], + dim=1) # (B, C + 3 + 3, npoint, nsample) + else: + new_features = grouped_features + else: + assert self.use_xyz, "Cannot have not features and not use xyz as a feature!" + new_features = torch.cat([raw_grouped_xyz, grouped_xyz], dim = 1) + + return new_features + + +class GroupAll(nn.Module): + r""" + Groups all features + + Parameters + --------- + """ + + def __init__(self, use_xyz: bool = True): + super().__init__() + self.use_xyz = use_xyz + + def forward( + self, + xyz: torch.Tensor, + new_xyz: torch.Tensor, + features: torch.Tensor = None + ) -> Tuple[torch.Tensor]: + r""" + Parameters + ---------- + xyz : torch.Tensor + xyz coordinates of the features (B, N, 3) + new_xyz : torch.Tensor + Ignored + features : torch.Tensor + Descriptors of the features (B, C, N) + + Returns + ------- + new_features : torch.Tensor + (B, C + 3, 1, N) tensor + """ + + grouped_xyz = xyz.transpose(1, 2).unsqueeze(2) + if features is not None: + grouped_features = features.unsqueeze(2) + if self.use_xyz: + new_features = torch.cat([grouped_xyz, grouped_features], + dim=1) # (B, 3 + C, 1, N) + else: + new_features = grouped_features + else: + new_features = grouped_xyz + + return new_features diff --git a/zoo/SimpleView/rs_cnn/utils/pytorch_utils/__init__.py b/zoo/SimpleView/rs_cnn/utils/pytorch_utils/__init__.py new file mode 100644 index 0000000..2444905 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/pytorch_utils/__init__.py @@ -0,0 +1 @@ +from .pytorch_utils import * diff --git a/zoo/SimpleView/rs_cnn/utils/pytorch_utils/pytorch_utils.py b/zoo/SimpleView/rs_cnn/utils/pytorch_utils/pytorch_utils.py new file mode 100644 index 0000000..42757c3 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/utils/pytorch_utils/pytorch_utils.py @@ -0,0 +1,761 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.autograd import Variable +from torch.autograd.function import InplaceFunction +from itertools import repeat +import numpy as np +import shutil, os +from typing import List, Tuple +from scipy.stats import t as student_t +import statistics as stats +import math + +########## Relation-Shape Convolution begin ############ +class RSConv(nn.Module): + ''' + Input shape: (B, C_in, npoint, nsample) + Output shape: (B, C_out, npoint) + ''' + def __init__( + self, + C_in, + C_out, + activation = nn.ReLU(), + mapping = None, + relation_prior = 1, + first_layer = False + ): + super(RSConv, self).__init__() + self.bn_rsconv = nn.BatchNorm2d(C_in) if not first_layer else nn.BatchNorm2d(16) + self.bn_channel_raising = nn.BatchNorm1d(C_out) + self.bn_xyz_raising = nn.BatchNorm2d(16) + if first_layer: + self.bn_mapping = nn.BatchNorm2d(math.floor(C_out / 2)) + else: + self.bn_mapping = nn.BatchNorm2d(math.floor(C_out / 4)) + self.activation = activation + self.relation_prior = relation_prior + self.first_layer = first_layer + self.mapping_func1 = mapping[0] + self.mapping_func2 = mapping[1] + self.cr_mapping = mapping[2] + if first_layer: + self.xyz_raising = mapping[3] + + def forward(self, input): # input: (B, 3 + 3 + C_in, npoint, centroid + nsample) + x = input[:, 3:, :, :] # (B, C_in, npoint, nsample+1), input features + C_in = x.size()[1] + nsample = x.size()[3] + if self.relation_prior == 2: + abs_coord = input[:, 0:2, :, :] + delta_x = input[:, 3:5, :, :] + zero_vec = Variable(torch.zeros(x.size()[0], 1, x.size()[2], nsample).cuda()) + else: + abs_coord = input[:, 0:3, :, :] # (B, 3, npoint, nsample+1), absolute coordinates + delta_x = input[:, 3:6, :, :] # (B, 3, npoint, nsample+1), normalized coordinates + + coord_xi = abs_coord[:, :, :, 0:1].repeat(1, 1, 1, nsample) # (B, 3, npoint, nsample), centroid point + h_xi_xj = torch.norm(delta_x, p = 2, dim = 1).unsqueeze(1) + if self.relation_prior == 1: + h_xi_xj = torch.cat((h_xi_xj, coord_xi, abs_coord, delta_x), dim = 1) + elif self.relation_prior == 2: + h_xi_xj = torch.cat((h_xi_xj, coord_xi, zero_vec, abs_coord, zero_vec, delta_x, zero_vec), dim = 1) + + h_xi_xj = self.mapping_func1(h_xi_xj) + h_xi_xj = self.activation(self.bn_mapping(h_xi_xj)) + h_xi_xj = self.mapping_func2(h_xi_xj) + if self.first_layer: + x = self.activation(self.bn_xyz_raising(self.xyz_raising(x))) + x = F.max_pool2d(self.activation(self.bn_rsconv(torch.mul(h_xi_xj, x))), kernel_size = (1, nsample)).squeeze(3) # (B, C_in, npoint) + x = self.activation(self.bn_channel_raising(self.cr_mapping(x))) + + return x + +class RSConvLayer(nn.Sequential): + + def __init__( + self, + in_size: int, + out_size: int, + activation=nn.ReLU(inplace=True), + conv=RSConv, + mapping = None, + relation_prior = 1, + first_layer = False + ): + super(RSConvLayer, self).__init__() + + conv_unit = conv( + in_size, + out_size, + activation = activation, + mapping = mapping, + relation_prior = relation_prior, + first_layer = first_layer + ) + + self.add_module('RS_Conv', conv_unit) + +class SharedRSConv(nn.Sequential): + + def __init__( + self, + args: List[int], + *, + activation=nn.ReLU(inplace=True), + mapping = None, + relation_prior = 1, + first_layer = False + ): + super().__init__() + + for i in range(len(args) - 1): + self.add_module( + 'RSConvLayer{}'.format(i), + RSConvLayer( + args[i], + args[i + 1], + activation = activation, + mapping = mapping, + relation_prior = relation_prior, + first_layer = first_layer + ) + ) + +########## Relation-Shape Convolution end ############ + + + +########## global convolutional pooling begin ############ + +class GloAvgConv(nn.Module): + ''' + Input shape: (B, C_in, 1, nsample) + Output shape: (B, C_out, npoint) + ''' + def __init__( + self, + C_in, + C_out, + init=nn.init.kaiming_normal_, + bias = True, + activation = nn.ReLU(inplace=True) + ): + super(GloAvgConv, self).__init__() + + self.conv_avg = nn.Conv2d(in_channels = C_in, out_channels = C_out, kernel_size = (1, 1), + stride = (1, 1), bias = bias) + self.bn_avg = nn.BatchNorm2d(C_out) + self.activation = activation + + init(self.conv_avg.weight) + if bias: + nn.init.constant_(self.conv_avg.bias, 0) + + def forward(self, x): + nsample = x.size()[3] + x = self.activation(self.bn_avg(self.conv_avg(x))) + x = F.max_pool2d(x, kernel_size = (1, nsample)).squeeze(3) + + return x + +########## global convolutional pooling end ############ + + +class SharedMLP(nn.Sequential): + + def __init__( + self, + args: List[int], + *, + bn: bool = False, + activation=nn.ReLU(inplace=True), + preact: bool = False, + first: bool = False, + name: str = "" + ): + super().__init__() + + for i in range(len(args) - 1): + self.add_module( + name + 'layer{}'.format(i), + Conv2d( + args[i], + args[i + 1], + bn=(not first or not preact or (i != 0)) and bn, + activation=activation + if (not first or not preact or (i != 0)) else None, + preact=preact + ) + ) + + +class _BNBase(nn.Sequential): + + def __init__(self, in_size, batch_norm=None, name=""): + super().__init__() + self.add_module(name + "bn", batch_norm(in_size)) + + nn.init.constant_(self[0].weight, 1.0) + nn.init.constant_(self[0].bias, 0) + + +class BatchNorm1d(_BNBase): + + def __init__(self, in_size: int, *, name: str = ""): + super().__init__(in_size, batch_norm=nn.BatchNorm1d, name=name) + + +class BatchNorm2d(_BNBase): + + def __init__(self, in_size: int, name: str = ""): + super().__init__(in_size, batch_norm=nn.BatchNorm2d, name=name) + + +class BatchNorm3d(_BNBase): + + def __init__(self, in_size: int, name: str = ""): + super().__init__(in_size, batch_norm=nn.BatchNorm3d, name=name) + + +class _ConvBase(nn.Sequential): + + def __init__( + self, + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=None, + batch_norm=None, + bias=True, + preact=False, + name="" + ): + super().__init__() + + bias = bias and (not bn) + conv_unit = conv( + in_size, + out_size, + kernel_size=kernel_size, + stride=stride, + padding=padding, + bias=bias + ) + init(conv_unit.weight) + if bias: + nn.init.constant_(conv_unit.bias, 0) + + if bn: + if not preact: + bn_unit = batch_norm(out_size) + else: + bn_unit = batch_norm(in_size) + + if preact: + if bn: + self.add_module(name + 'bn', bn_unit) + + if activation is not None: + self.add_module(name + 'activation', activation) + + self.add_module(name + 'conv', conv_unit) + + if not preact: + if bn: + self.add_module(name + 'bn', bn_unit) + + if activation is not None: + self.add_module(name + 'activation', activation) + + +class Conv1d(_ConvBase): + + def __init__( + self, + in_size: int, + out_size: int, + *, + kernel_size: int = 1, + stride: int = 1, + padding: int = 0, + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=nn.init.kaiming_normal_, + bias: bool = True, + preact: bool = False, + name: str = "" + ): + super().__init__( + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=nn.Conv1d, + batch_norm=BatchNorm1d, + bias=bias, + preact=preact, + name=name + ) + + +class Conv2d(_ConvBase): + + def __init__( + self, + in_size: int, + out_size: int, + *, + kernel_size: Tuple[int, int] = (1, 1), + stride: Tuple[int, int] = (1, 1), + padding: Tuple[int, int] = (0, 0), + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=nn.init.kaiming_normal_, + bias: bool = True, + preact: bool = False, + name: str = "" + ): + super().__init__( + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=nn.Conv2d, + batch_norm=BatchNorm2d, + bias=bias, + preact=preact, + name=name + ) + + +class Conv3d(_ConvBase): + + def __init__( + self, + in_size: int, + out_size: int, + *, + kernel_size: Tuple[int, int, int] = (1, 1, 1), + stride: Tuple[int, int, int] = (1, 1, 1), + padding: Tuple[int, int, int] = (0, 0, 0), + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=nn.init.kaiming_normal_, + bias: bool = True, + preact: bool = False, + name: str = "" + ): + super().__init__( + in_size, + out_size, + kernel_size, + stride, + padding, + activation, + bn, + init, + conv=nn.Conv3d, + batch_norm=BatchNorm3d, + bias=bias, + preact=preact, + name=name + ) + + +class FC(nn.Sequential): + + def __init__( + self, + in_size: int, + out_size: int, + *, + activation=nn.ReLU(inplace=True), + bn: bool = False, + init=None, + preact: bool = False, + name: str = "" + ): + super().__init__() + + fc = nn.Linear(in_size, out_size, bias=not bn) + if init is not None: + init(fc.weight) + if not bn: + nn.init.constant_(fc.bias, 0) + + if preact: + if bn: + self.add_module(name + 'bn', BatchNorm1d(in_size)) + + if activation is not None: + self.add_module(name + 'activation', activation) + + self.add_module(name + 'fc', fc) + + if not preact: + if bn: + self.add_module(name + 'bn', BatchNorm1d(out_size)) + + if activation is not None: + self.add_module(name + 'activation', activation) + + +class _DropoutNoScaling(InplaceFunction): + + @staticmethod + def _make_noise(input): + return input.new().resize_as_(input) + + @staticmethod + def symbolic(g, input, p=0.5, train=False, inplace=False): + if inplace: + return None + n = g.appendNode( + g.create("Dropout", [input]).f_("ratio", + p).i_("is_test", not train) + ) + real = g.appendNode(g.createSelect(n, 0)) + g.appendNode(g.createSelect(n, 1)) + return real + + @classmethod + def forward(cls, ctx, input, p=0.5, train=False, inplace=False): + if p < 0 or p > 1: + raise ValueError( + "dropout probability has to be between 0 and 1, " + "but got {}".format(p) + ) + ctx.p = p + ctx.train = train + ctx.inplace = inplace + + if ctx.inplace: + ctx.mark_dirty(input) + output = input + else: + output = input.clone() + + if ctx.p > 0 and ctx.train: + ctx.noise = cls._make_noise(input) + if ctx.p == 1: + ctx.noise.fill_(0) + else: + ctx.noise.bernoulli_(1 - ctx.p) + ctx.noise = ctx.noise.expand_as(input) + output.mul_(ctx.noise) + + return output + + @staticmethod + def backward(ctx, grad_output): + if ctx.p > 0 and ctx.train: + return grad_output.mul(Variable(ctx.noise)), None, None, None + else: + return grad_output, None, None, None + + +dropout_no_scaling = _DropoutNoScaling.apply + + +class _FeatureDropoutNoScaling(_DropoutNoScaling): + + @staticmethod + def symbolic(input, p=0.5, train=False, inplace=False): + return None + + @staticmethod + def _make_noise(input): + return input.new().resize_( + input.size(0), input.size(1), *repeat(1, + input.dim() - 2) + ) + + +feature_dropout_no_scaling = _FeatureDropoutNoScaling.apply + + +def group_model_params(model: nn.Module): + decay_group = [] + no_decay_group = [] + + for name, param in model.named_parameters(): + if name.find("bn") != -1 or name.find("bias") != -1: + no_decay_group.append(param) + else: + decay_group.append(param) + + assert len(list(model.parameters()) + ) == len(decay_group) + len(no_decay_group) + + return [ + dict(params=decay_group), + dict(params=no_decay_group, weight_decay=0.0) + ] + + +def checkpoint_state(model=None, optimizer=None, best_prec=None, epoch=None): + optim_state = optimizer.state_dict() if optimizer is not None else None + if model is not None: + if isinstance(model, torch.nn.DataParallel): + model_state = model.module.state_dict() + else: + model_state = model.state_dict() + else: + model_state = None + + return { + 'epoch': epoch, + 'best_prec': best_prec, + 'model_state': model_state, + 'optimizer_state': optim_state + } + + +def save_checkpoint( + state, is_best, filename='checkpoint', bestname='model_best' +): + filename = '{}.pth.tar'.format(filename) + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, '{}.pth.tar'.format(bestname)) + + +def load_checkpoint(model=None, optimizer=None, filename='checkpoint'): + filename = "{}.pth.tar".format(filename) + if os.path.isfile(filename): + print("==> Loading from checkpoint '{}'".format(filename)) + checkpoint = torch.load(filename) + epoch = checkpoint['epoch'] + best_prec = checkpoint['best_prec'] + if model is not None and checkpoint['model_state'] is not None: + model.load_state_dict(checkpoint['model_state']) + if optimizer is not None and checkpoint['optimizer_state'] is not None: + optimizer.load_state_dict(checkpoint['optimizer_state']) + print("==> Done") + else: + print("==> Checkpoint '{}' not found".format(filename)) + + return epoch, best_prec + + +def variable_size_collate(pad_val=0, use_shared_memory=True): + import collections + _numpy_type_map = { + 'float64': torch.DoubleTensor, + 'float32': torch.FloatTensor, + 'float16': torch.HalfTensor, + 'int64': torch.LongTensor, + 'int32': torch.IntTensor, + 'int16': torch.ShortTensor, + 'int8': torch.CharTensor, + 'uint8': torch.ByteTensor, + } + + def wrapped(batch): + "Puts each data field into a tensor with outer dimension batch size" + + error_msg = "batch must contain tensors, numbers, dicts or lists; found {}" + elem_type = type(batch[0]) + if torch.is_tensor(batch[0]): + max_len = 0 + for b in batch: + max_len = max(max_len, b.size(0)) + + numel = sum([int(b.numel() / b.size(0) * max_len) for b in batch]) + if use_shared_memory: + # If we're in a background process, concatenate directly into a + # shared memory tensor to avoid an extra copy + storage = batch[0].storage()._new_shared(numel) + out = batch[0].new(storage) + else: + out = batch[0].new(numel) + + out = out.view( + len(batch), max_len, + *[batch[0].size(i) for i in range(1, batch[0].dim())] + ) + out.fill_(pad_val) + for i in range(len(batch)): + out[i, 0:batch[i].size(0)] = batch[i] + + return out + elif elem_type.__module__ == 'numpy' and elem_type.__name__ != 'str_' \ + and elem_type.__name__ != 'string_': + elem = batch[0] + if elem_type.__name__ == 'ndarray': + # array of string classes and object + if re.search('[SaUO]', elem.dtype.str) is not None: + raise TypeError(error_msg.format(elem.dtype)) + + return wrapped([torch.from_numpy(b) for b in batch]) + if elem.shape == (): # scalars + py_type = float if elem.dtype.name.startswith('float') else int + return _numpy_type_map[elem.dtype.name]( + list(map(py_type, batch)) + ) + elif isinstance(batch[0], int): + return torch.LongTensor(batch) + elif isinstance(batch[0], float): + return torch.DoubleTensor(batch) + elif isinstance(batch[0], collections.Mapping): + return {key: wrapped([d[key] for d in batch]) for key in batch[0]} + elif isinstance(batch[0], collections.Sequence): + transposed = zip(*batch) + return [wrapped(samples) for samples in transposed] + + raise TypeError((error_msg.format(type(batch[0])))) + + return wrapped + + +class TrainValSplitter(): + r""" + Creates a training and validation split to be used as the sampler in a pytorch DataLoader + Parameters + --------- + numel : int + Number of elements in the entire training dataset + percent_train : float + Percentage of data in the training split + shuffled : bool + Whether or not shuffle which data goes to which split + """ + + def __init__( + self, *, numel: int, percent_train: float, shuffled: bool = False + ): + indicies = np.array([i for i in range(numel)]) + if shuffled: + np.random.shuffle(indicies) + + self.train = torch.utils.data.sampler.SubsetRandomSampler( + indicies[0:int(percent_train * numel)] + ) + self.val = torch.utils.data.sampler.SubsetRandomSampler( + indicies[int(percent_train * numel):-1] + ) + + +class CrossValSplitter(): + r""" + Class that creates cross validation splits. The train and val splits can be used in pytorch DataLoaders. The splits can be updated + by calling next(self) or using a loop: + for _ in self: + .... + Parameters + --------- + numel : int + Number of elements in the training set + k_folds : int + Number of folds + shuffled : bool + Whether or not to shuffle which data goes in which fold + """ + + def __init__(self, *, numel: int, k_folds: int, shuffled: bool = False): + inidicies = np.array([i for i in range(numel)]) + if shuffled: + np.random.shuffle(inidicies) + + self.folds = np.array(np.array_split(inidicies, k_folds), dtype=object) + self.current_v_ind = -1 + + self.val = torch.utils.data.sampler.SubsetRandomSampler(self.folds[0]) + self.train = torch.utils.data.sampler.SubsetRandomSampler( + np.concatenate(self.folds[1:], axis=0) + ) + + self.metrics = {} + + def __iter__(self): + self.current_v_ind = -1 + return self + + def __len__(self): + return len(self.folds) + + def __getitem__(self, idx): + assert idx >= 0 and idx < len(self) + self.val.inidicies = self.folds[idx] + self.train.inidicies = np.concatenate( + self.folds[np.arange(len(self)) != idx], axis=0 + ) + + def __next__(self): + self.current_v_ind += 1 + if self.current_v_ind >= len(self): + raise StopIteration + + self[self.current_v_ind] + + def update_metrics(self, to_post: dict): + for k, v in to_post.items(): + if k in self.metrics: + self.metrics[k].append(v) + else: + self.metrics[k] = [v] + + def print_metrics(self): + for name, samples in self.metrics.items(): + xbar = stats.mean(samples) + sx = stats.stdev(samples, xbar) + tstar = student_t.ppf(1.0 - 0.025, len(samples) - 1) + margin_of_error = tstar * sx / sqrt(len(samples)) + print("{}: {} +/- {}".format(name, xbar, margin_of_error)) + + +def set_bn_momentum_default(bn_momentum): + + def fn(m): + if isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d)): + m.momentum = bn_momentum + + return fn + + +class BNMomentumScheduler(object): + + def __init__( + self, model, bn_lambda, last_epoch=-1, + setter=set_bn_momentum_default + ): + if not isinstance(model, nn.Module): + raise RuntimeError( + "Class '{}' is not a PyTorch nn Module".format( + type(model).__name__ + ) + ) + + self.model = model + self.setter = setter + self.lmbd = bn_lambda + + self.step(last_epoch + 1) + self.last_epoch = last_epoch + + def step(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + + self.last_epoch = epoch + self.model.apply(self.setter(self.lmbd(epoch))) + + def get_momentum(self, epoch=None): + if epoch is None: + epoch = self.last_epoch + 1 + return self.lmbd(epoch) \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/voting_evaluate_cls.py b/zoo/SimpleView/rs_cnn/voting_evaluate_cls.py new file mode 100644 index 0000000..e3fa8f9 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/voting_evaluate_cls.py @@ -0,0 +1,103 @@ +import torch +import torch.optim as optim +import torch.optim.lr_scheduler as lr_sched +import torch.nn as nn +from torch.utils.data import DataLoader +from torch.autograd import Variable +import torch.nn.functional as F +import numpy as np +import os +from torchvision import transforms +from models import RSCNN_SSN_Cls as RSCNN_SSN +from data import ModelNet40Cls +import utils.pytorch_utils as pt_utils +# import utils.pointnet2_utils as pointnet2_utils +import pointnet2.utils.pointnet2_utils as pointnet2_utils +import data.data_utils as d_utils +import argparse +import random +import yaml + +torch.backends.cudnn.enabled = True +torch.backends.cudnn.benchmark = True +torch.backends.cudnn.deterministic = True + +seed = 123 +random.seed(seed) +np.random.seed(seed) +torch.manual_seed(seed) +torch.cuda.manual_seed(seed) +torch.cuda.manual_seed_all(seed) + +parser = argparse.ArgumentParser(description='Relation-Shape CNN Shape Classification Voting Evaluation') +parser.add_argument('--config', default='cfgs/config_ssn_cls.yaml', type=str) + +NUM_REPEAT = 300 +NUM_VOTE = 10 + +def main(): + args = parser.parse_args() + with open(args.config) as f: + config = yaml.load(f) + for k, v in config['common'].items(): + setattr(args, k, v) + + test_transforms = transforms.Compose([ + d_utils.PointcloudToTensor() + ]) + + test_dataset = ModelNet40Cls(num_points = args.num_points, root = args.data_root, transforms=test_transforms, train=False) + test_dataloader = DataLoader( + test_dataset, + batch_size=args.batch_size, + shuffle=False, + num_workers=int(args.workers), + pin_memory=True + ) + + model = RSCNN_SSN(num_classes = args.num_classes, input_channels = args.input_channels, relation_prior = args.relation_prior, use_xyz = True) + model.cuda() + + if args.checkpoint is not '': + model.load_state_dict(torch.load(args.checkpoint)) + print('Load model successfully: %s' % (args.checkpoint)) + + # evaluate + PointcloudScale = d_utils.PointcloudScale() # initialize random scaling + model.eval() + global_acc = 0 + with torch.no_grad(): + for i in range(NUM_REPEAT): + preds = [] + labels = [] + for j, data in enumerate(test_dataloader, 0): + points, target = data + points, target = points.cuda(), target.cuda() + # points, target = Variable(points, volatile=True), Variable(target, volatile=True) + + # fastest point sampling + fps_idx = pointnet2_utils.furthest_point_sample(points, 1200) # (B, npoint) + pred = 0 + for v in range(NUM_VOTE): + new_fps_idx = fps_idx[:, np.random.choice(1200, args.num_points, False)] + new_points = pointnet2_utils.gather_operation(points.transpose(1, 2).contiguous(), new_fps_idx).transpose(1, 2).contiguous() + if v > 0: + new_points.data = PointcloudScale(new_points.data) + pred += F.softmax(model(new_points), dim = 1) + pred /= NUM_VOTE + target = target.view(-1) + _, pred_choice = torch.max(pred.data, -1) + + preds.append(pred_choice) + labels.append(target.data) + + preds = torch.cat(preds, 0) + labels = torch.cat(labels, 0) + acc = (preds == labels).sum().float() / labels.numel() + if acc > global_acc: + global_acc = acc + print('Repeat %3d \t Acc: %0.6f' % (i + 1, acc)) + print('\nBest voting acc: %0.6f' % (global_acc)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/zoo/SimpleView/rs_cnn/voting_evaluate_partseg.py b/zoo/SimpleView/rs_cnn/voting_evaluate_partseg.py new file mode 100644 index 0000000..41898c8 --- /dev/null +++ b/zoo/SimpleView/rs_cnn/voting_evaluate_partseg.py @@ -0,0 +1,141 @@ +import torch +import torch.optim as optim +import torch.optim.lr_scheduler as lr_sched +import torch.nn as nn +from torch.utils.data import DataLoader +from torch.autograd import Variable +import torch.nn.functional as F +import numpy as np +import os +from torchvision import transforms +from models import RSCNN_MSN_Seg as RSCNN_MSN +from data import ShapeNetPart +import utils.pytorch_utils as pt_utils +import data.data_utils as d_utils +import argparse +import random +import yaml +from progressbar import ProgressBar + +torch.backends.cudnn.enabled = True +torch.backends.cudnn.benchmark = True +torch.backends.cudnn.deterministic = True + +seed = 123 +random.seed(seed) +np.random.seed(seed) +torch.manual_seed(seed) +torch.cuda.manual_seed(seed) +torch.cuda.manual_seed_all(seed) + +parser = argparse.ArgumentParser(description='Relation-Shape CNN Shape Part Segmentation Voting Evaluate') +parser.add_argument('--config', default='cfgs/config_msn_partseg.yaml', type=str) + +NUM_REPEAT = 300 +NUM_VOTE = 10 + +def main(): + args = parser.parse_args() + with open(args.config) as f: + config = yaml.load(f) + for k, v in config['common'].items(): + setattr(args, k, v) + + test_transforms = transforms.Compose([ + d_utils.PointcloudToTensor() + ]) + + test_dataset = ShapeNetPart(root = args.data_root, num_points = args.num_points, split = 'test', normalize = True, transforms = test_transforms) + test_dataloader = DataLoader( + test_dataset, + batch_size=args.batch_size // 4, + shuffle=False, + num_workers=int(args.workers), + pin_memory=True + ) + + model = RSCNN_MSN(num_classes = args.num_classes, input_channels = args.input_channels, relation_prior = args.relation_prior, use_xyz = True) + model.cuda() + + if args.checkpoint is not '': + model.load_state_dict(torch.load(args.checkpoint)) + print('Load model successfully: %s' % (args.checkpoint)) + + # evaluate + PointcloudScale = d_utils.PointcloudScale(scale_low=0.87, scale_high=1.15) # initialize random scaling + model.eval() + global_Class_mIoU, global_Inst_mIoU = 0, 0 + seg_classes = test_dataset.seg_classes + seg_label_to_cat = {} # {0:Airplane, 1:Airplane, ...49:Table} + for cat in seg_classes.keys(): + for label in seg_classes[cat]: + seg_label_to_cat[label] = cat + + with torch.no_grad(): + for i in range(NUM_REPEAT): + shape_ious = {cat:[] for cat in seg_classes.keys()} + bar = ProgressBar(max_value=len(test_dataloader)) + for i, data in enumerate(test_dataloader, 0): + points, target, cls = data + # points, target = Variable(points, volatile=True), Variable(target, volatile=True) + points, target = points.cuda(), target.cuda() + + batch_one_hot_cls = np.zeros((len(cls), 16)) # 16 object classes + for b in range(len(cls)): + batch_one_hot_cls[b, int(cls[b])] = 1 + batch_one_hot_cls = torch.from_numpy(batch_one_hot_cls) + batch_one_hot_cls = Variable(batch_one_hot_cls.float().cuda()) + + pred = 0 + new_points = torch.zeros(points.size()[0], points.size()[1], points.size()[2]).cuda() + # new_points = Variable(torch.zeros(points.size()[0], points.size()[1], points.size()[2]).cuda(), volatile=True) + for v in range(NUM_VOTE): + if v > 0: + new_points.data = PointcloudScale(points.data) + pred += F.softmax(model(new_points, batch_one_hot_cls), dim = 2) + pred /= NUM_VOTE + + pred = pred.data.cpu() + target = target.data.cpu() + pred_val = torch.zeros(len(cls), args.num_points).type(torch.LongTensor) + # pred to the groundtruth classes (selected by seg_classes[cat]) + for b in range(len(cls)): + cat = seg_label_to_cat[target[b, 0].item()] + logits = pred[b, :, :] # (num_points, num_classes) + pred_val[b, :] = logits[:, seg_classes[cat]].max(1)[1] + seg_classes[cat][0] + + for b in range(len(cls)): + segp = pred_val[b, :] + segl = target[b, :] + cat = seg_label_to_cat[segl[0].item()] + part_ious = [0.0 for _ in range(len(seg_classes[cat]))] + for l in seg_classes[cat]: + if torch.sum((segl == l) | (segp == l)) == 0: + # part is not present in this shape + part_ious[l - seg_classes[cat][0]] = 1.0 + else: + part_ious[l - seg_classes[cat][0]] = torch.sum((segl == l) & (segp == l)) / float(torch.sum((segl == l) | (segp == l))) + shape_ious[cat].append(np.mean(part_ious)) + bar.update(i) + + instance_ious = [] + for cat in shape_ious.keys(): + for iou in shape_ious[cat]: + instance_ious.append(iou) + shape_ious[cat] = np.mean(shape_ious[cat]) + mean_class_ious = np.mean(list(shape_ious.values())) + + print('\n------ Repeat %3d ------' % (i + 1)) + for cat in sorted(shape_ious.keys()): + print('%s: %0.6f'%(cat, shape_ious[cat])) + print('Class_mIoU: %0.6f' % (mean_class_ious)) + print('Instance_mIoU: %0.6f' % (np.mean(instance_ious))) + + if mean_class_ious > global_Class_mIoU: + global_Class_mIoU = mean_class_ious + global_Inst_mIoU = np.mean(instance_ious) + + print('\nBest voting Class_mIoU = %0.6f, Instance_mIoU = %0.6f' % (global_Class_mIoU, global_Inst_mIoU)) + +if __name__ == '__main__': + main() \ No newline at end of file